From e98b70c542815c6527efad0b11a3412212aedfb2 Mon Sep 17 00:00:00 2001 From: Serge Khorun Date: Sun, 19 May 2024 17:20:26 -0700 Subject: [PATCH] First public commit for River project --- .editorconfig | 11 + .eslintignore | 15 + .git-blame-ignore-revs | 1 + .github/CODEOWNERS | 33 + .github/dependabot.yml | 11 + .github/workflows/River_node_docker.yml | 119 + .github/workflows/Stress_test_node_docker.yml | 67 + .github/workflows/ci.yml | 958 + .github/workflows/clean_turbo_cache.yml | 33 + .gitignore | 78 + .nvmrc | 1 + .prettierignore | 47 + .prettierrc.js | 3 + .solhint.json | 25 + .vscode/launch.json | 100 + .vscode/settings.json | 36 + .vscode/tasks.json | 496 + .../jest-worker-npm-29.5.0-70da3388f1.patch | 14 + .../@yarnpkg/plugin-workspace-tools.cjs | 28 + .yarn/releases/yarn-3.8.0.cjs | 875 + .yarnrc.yml | 11 + README.md | 93 + SECURITY.md | 5 + assets/river-logo-square-black.svg | 4 + core/.vscode/launch.json | 17 + core/Dockerfile | 70 + core/README.md | 53 + core/debug-app/README.md | 1 + core/debug-app/package.json | 23 + core/debug-app/src/fetcher.ts | 28 + core/debug-app/src/index.html | 94 + core/debug-app/src/log.ts | 9 + core/debug-app/tsconfig.json | 12 + core/debug-app/vite.config.ts | 38 + core/dlog/.eslintrc.json | 67 + core/dlog/README.md | 1 + core/dlog/jest.config.ts | 28 + core/dlog/package.json | 43 + core/dlog/src/binary.ts | 62 + core/dlog/src/check.ts | 33 + core/dlog/src/dlog.ts | 239 + core/dlog/src/index.ts | 4 + core/dlog/src/tests/binary.test.ts | 53 + core/dlog/src/tests/dlog.test.ts | 214 + core/dlog/src/utils.ts | 9 + core/dlog/tsconfig.eslint.json | 4 + core/dlog/tsconfig.json | 8 + core/docker-compose.yml | 34 + core/jest.env.ts | 16 + core/jest.matchers.ts | 64 + core/node/.dockerignore | 1 + core/node/.gitignore | 4 + core/node/.golangci.yml | 7 + core/node/.mockery.yaml | 15 + core/node/.vscode/launch.json | 26 + core/node/README.md | 111 + core/node/auth/architect.go | 74 + core/node/auth/auth_impl.go | 567 + core/node/auth/auth_impl_cache.go | 188 + core/node/auth/auth_impl_cache_test.go | 68 + core/node/auth/channels.go | 71 + core/node/auth/entitlement.go | 178 + core/node/auth/fake_auth.go | 18 + core/node/auth/pausable.go | 67 + core/node/auth/permissions.go | 43 + core/node/auth/space_contract.go | 48 + core/node/auth/space_contract_v3.go | 354 + core/node/auth/wallet_link.go | 113 + core/node/base/convert.go | 32 + core/node/base/debug_settings.go | 27 + core/node/base/error.go | 393 + core/node/base/error_test.go | 117 + core/node/base/hash_format.go | 106 + core/node/base/nanoid.go | 13 + core/node/base/test/context.go | 34 + core/node/bin/.gitignore | 4 + core/node/cmd/archive_cmd.go | 37 + core/node/cmd/config_cmd.go | 45 + core/node/cmd/genkey_cmd.go | 55 + core/node/cmd/info_cmd.go | 27 + core/node/cmd/ping_cmd.go | 55 + core/node/cmd/registry_cmd.go | 173 + core/node/cmd/root_cmd.go | 130 + core/node/cmd/run_cmd.go | 150 + core/node/cmd/version_cmd.go | 22 + core/node/config-template.yaml | 104 + core/node/config/config.go | 241 + core/node/config/config_test.go | 108 + core/node/config/testdata/databaseconfig.txt | 3 + .../config/testdata/databaseconfig_json.txt | 1 + core/node/config/testdata/load_address.json | 3 + core/node/config/testdata/test_config.yaml | 4 + core/node/config/testdata/tlsconfig.txt | 3 + core/node/config/testdata/tlsconfig_json.txt | 1 + core/node/config/viper_hooks.go | 80 + core/node/config/viper_hooks_test.go | 44 + core/node/config_instance.sh | 69 + core/node/contracts/base/architect.go | 537 + core/node/contracts/base/channels.go | 3073 ++++ .../contracts/base/entitlements_manager.go | 703 + core/node/contracts/base/pausable.go | 522 + core/node/contracts/base/rule_entitlement.go | 613 + core/node/contracts/base/wallet_link.go | 680 + core/node/contracts/custom_errors.go | 173 + core/node/contracts/custom_errors_test.go | 173 + .../contracts/deploy/mock_river_registry.go | 3565 ++++ core/node/contracts/node_registry_v1.go | 977 ++ core/node/contracts/node_registry_v1_ex.go | 35 + core/node/contracts/operator_registry_v1.go | 542 + core/node/contracts/river_config_v1.go | 842 + core/node/contracts/river_config_v1_ex.go | 7 + core/node/contracts/stream_registry_v1.go | 1108 ++ core/node/contracts/stream_registry_v1_ex.go | 13 + core/node/conventions.md | 136 + core/node/crypto/block_number.go | 24 + core/node/crypto/blockchain.go | 138 + core/node/crypto/blockchain_test.go | 199 + core/node/crypto/chain_monitor.go | 324 + core/node/crypto/chain_monitor_builder.go | 138 + core/node/crypto/chain_monitor_test.go | 225 + core/node/crypto/chain_txpool.go | 529 + core/node/crypto/chain_txpool_policy.go | 129 + core/node/crypto/chain_txpool_test.go | 71 + core/node/crypto/chain_utils.go | 26 + core/node/crypto/config.go | 319 + core/node/crypto/config_test.go | 76 + core/node/crypto/delegate.go | 67 + core/node/crypto/delegate_test.go | 62 + core/node/crypto/sign.go | 446 + core/node/crypto/sign_test.go | 42 + core/node/crypto/testutil.go | 581 + core/node/crypto/utils.go | 43 + core/node/default_config.yaml | 112 + core/node/dlog/README.md | 1 + core/node/dlog/buffer/buffer.go | 105 + core/node/dlog/color.go | 96 + core/node/dlog/color_map.go | 58 + core/node/dlog/common_handler.go | 400 + core/node/dlog/dlog_test.go | 186 + core/node/dlog/formatter.go | 712 + core/node/dlog/json_handler.go | 375 + core/node/dlog/json_handler_test.go | 32 + core/node/dlog/log.go | 44 + core/node/dlog/multi_handler.go | 48 + core/node/dlog/null_handler.go | 25 + core/node/dlog/testdata/envelope_json.txt | 1 + core/node/dlog/text_handler.go | 235 + core/node/dlog/zero.go | 43 + core/node/env/gamma-arch/config.yaml | 41 + core/node/env/gamma-arch/run.sh | 5 + core/node/env/gamma/config.yaml | 29 + core/node/env/gamma/run.sh | 5 + core/node/events/events.go | 390 + core/node/events/format.go | 24 + .../events/migrations/migrate_snapshot.go | 29 + .../migrations/snapshot_migration_0000.go | 10 + .../snapshot_migration_0000_test.go | 18 + .../migrations/snapshot_migration_0001.go | 56 + .../snapshot_migration_0001_test.go | 93 + core/node/events/miniblock.go | 223 + core/node/events/minipool.go | 51 + core/node/events/parsed_event.go | 147 + core/node/events/snapshot.go | 718 + core/node/events/snapshot_test.go | 247 + core/node/events/stream.go | 684 + core/node/events/stream_cache.go | 397 + core/node/events/stream_cache_test.go | 536 + core/node/events/stream_test.go | 145 + core/node/events/stream_view.go | 654 + core/node/events/stream_view_test.go | 261 + core/node/events/stream_viewstate_channel.go | 23 + .../events/stream_viewstate_dm_channel.go | 23 + core/node/events/stream_viewstate_joinable.go | 143 + core/node/events/stream_viewstate_media.go | 23 + core/node/events/stream_viewstate_space.go | 68 + .../events/stream_viewstate_space_test.go | 411 + core/node/events/stream_viewstate_user.go | 84 + core/node/events/sync_cookie.go | 45 + core/node/events/sync_cookie_test.go | 50 + core/node/events/util_test.go | 125 + core/node/fmt.sh | 21 + core/node/generate_mocks.sh | 1 + core/node/go.mod | 155 + core/node/go.sum | 702 + core/node/http_client/client.go | 74 + core/node/infra/config/config.go | 17 + core/node/infra/constants.go | 5 + core/node/infra/logging.go | 107 + core/node/infra/metrics.go | 185 + core/node/lint.sh | 8 + core/node/lint_extensions.sh | 14 + core/node/lint_extensions/lintextensions.go | 71 + core/node/logs/.gitignore | 2 + core/node/node/main.go | 11 + core/node/node/version/version.go | 30 + core/node/nodes/node_record.go | 68 + core/node/nodes/node_registry.go | 310 + core/node/nodes/node_registry_test.go | 168 + core/node/nodes/stream_nodes.go | 168 + core/node/nodes/stream_nodes_test.go | 108 + core/node/nodes/stream_registry.go | 131 + core/node/protocol/.gitignore | 1 + core/node/protocol/buf.gen.yaml | 8 + core/node/protocol/buf.yaml | 7 + core/node/protocol/extensions.pb.go | 210 + core/node/protocol/gen.go | 3 + core/node/protocol/gen.sh | 30 + core/node/protocol/helpers.go | 12 + core/node/protocol/internode.pb.go | 599 + core/node/protocol/internode.proto | 46 + core/node/protocol/protocol.pb.go | 8501 +++++++++ core/node/protocol/protocol_test.go | 61 + .../protocolconnect/internode.connect.go | 173 + .../protocolconnect/protocol.connect.go | 439 + core/node/protocol_extensions/main.go | 231 + .../registries/river_registry_contract.go | 589 + .../river_registry_contract_test.go | 324 + core/node/rpc/add_event.go | 128 + core/node/rpc/archive.go | 143 + core/node/rpc/archiver.go | 395 + core/node/rpc/archiver_test.go | 456 + core/node/rpc/create_stream.go | 216 + core/node/rpc/debug.go | 225 + core/node/rpc/forwarder.go | 468 + core/node/rpc/get_last_miniblock_hash.go | 49 + core/node/rpc/get_miniblocks.go | 53 + core/node/rpc/get_stream.go | 59 + core/node/rpc/get_stream_ex.go | 74 + core/node/rpc/http_handler.go | 62 + core/node/rpc/info.go | 163 + core/node/rpc/info_mode.go | 112 + core/node/rpc/load_stream.go | 84 + core/node/rpc/memory.go | 42 + core/node/rpc/metrics_interceptor.go | 36 + core/node/rpc/multi.go | 291 + core/node/rpc/new_node_test.go | 124 + core/node/rpc/node2node.go | 102 + core/node/rpc/quorum_pool.go | 73 + core/node/rpc/render/render.go | 74 + core/node/rpc/render/render_test.go | 90 + .../templates/debug/available.template.html | 17 + .../templates/debug/cache.template.html | 49 + .../templates/debug/memory.template.html | 54 + .../templates/debug/multi.template.html | 131 + .../templates/debug/stacks.template.html | 27 + .../templates/debug/txpool.template.html | 18 + .../render/templates/info/index.template.html | 10 + core/node/rpc/render/types.go | 104 + core/node/rpc/replicated_add.go | 66 + core/node/rpc/server.go | 625 + core/node/rpc/server_test.go | 31 + core/node/rpc/service.go | 92 + core/node/rpc/service_test.go | 1024 ++ core/node/rpc/shutdown_test.go | 38 + core/node/rpc/standby.go | 104 + core/node/rpc/standby_test.go | 228 + core/node/rpc/status.go | 51 + core/node/rpc/statusinfo/node_status.go | 97 + core/node/rpc/sync_receiver.go | 84 + core/node/rpc/sync_streams.go | 846 + core/node/rpc/sync_subscription.go | 422 + core/node/rpc/tester_test.go | 266 + core/node/rpc/timeout_interceptor.go | 28 + core/node/rpc/util.go | 55 + core/node/rules/can_add_event.go | 1190 ++ core/node/rules/can_create_stream.go | 760 + core/node/rules/rule_builder.go | 27 + core/node/rules/rule_builder_ae.go | 117 + core/node/rules/rule_builder_cs.go | 182 + core/node/run_docker.sh | 24 + core/node/run_impl.sh | 172 + core/node/run_multi.sh | 29 + core/node/run_single.sh | 48 + core/node/shared/ids.go | 202 + core/node/shared/ids_test.go | 130 + core/node/shared/stream_id.go | 162 + core/node/shared/stream_info.go | 12 + core/node/start.sh | 4 + core/node/staticcheck.conf | 26 + core/node/stop_multi.sh | 54 + core/node/storage/init_db.sql | 24 + .../000001_create_initial_schema.down.sql | 4 + .../000001_create_initial_schema.up.sql | 24 + ...create_miniblock_candidates_table.down.sql | 1 + ...2_create_miniblock_candidates_table.up.sql | 31 + ...d_notify_trigger_to_singlenodekey.down.sql | 3 + ...add_notify_trigger_to_singlenodekey.up.sql | 16 + core/node/storage/migrations_test.go | 35 + core/node/storage/pg_storage.go | 1503 ++ core/node/storage/pg_storage_archive_test.go | 84 + core/node/storage/pg_storage_test.go | 776 + core/node/storage/storage.go | 93 + core/node/storage/test_pg_store.go | 46 + core/node/test.sh | 4 + core/node/testutils/dbtestutils/db.go | 93 + core/node/testutils/ids.go | 56 + core/node/testutils/logutils.go | 30 + .../testutils/mocks/mock_node_registry.go | 161 + .../testutils/mocks/mock_stream_registry.go | 94 + .../mocks/mock_stream_service_client.go | 392 + core/node/utils/ordered_map.go | 84 + core/proto/buf.gen.yaml | 10 + core/proto/buf.yaml | 7 + core/proto/internal.proto | 24 + core/proto/jest.config.ts | 30 + core/proto/package.json | 42 + core/proto/payloads.proto | 187 + core/proto/protocol.proto | 861 + core/proto/scripts/watch_proto_files.cjs | 31 + core/proto/scripts/watch_proto_files_go.cjs | 38 + core/proto/src/index.ts | 5 + core/proto/src/types.ts | 14 + core/proto/tsconfig.json | 8 + core/scripts/docker-compose.yml | 23 + core/scripts/generate-certs.sh | 78 + core/scripts/generate_sdk_index.sh | 41 + core/scripts/launch.sh | 18 + core/scripts/launch_multi.sh | 16 + core/scripts/launch_storage.sh | 8 + core/scripts/load-testing-docker-compose.yml | 6 + core/scripts/register-ca.sh | 72 + core/scripts/sql/create_db.sql | 3 + core/scripts/start_node.sh | 4 + core/scripts/start_node_multi.sh | 4 + core/scripts/stop.sh | 5 + core/scripts/stop_node.sh | 20 + core/scripts/stop_storage.sh | 4 + core/supervisord.conf | 29 + core/test/crypto/keys.csv | 5 + core/test/crypto/test_data.csv | 3246 ++++ core/tsconfig.base.json | 100 + core/web3/.eslintrc.json | 68 + core/web3/.gitignore | 4 + core/web3/README.md | 3 + core/web3/jest-setup.ts | 3 + core/web3/jest.config.ts | 35 + core/web3/package.json | 52 + core/web3/src/ContractHelpers.ts | 127 + core/web3/src/ContractTypes.ts | 139 + core/web3/src/ConvertersEntitlements.ts | 60 + core/web3/src/ConvertersRoles.ts | 61 + core/web3/src/ISpaceDapp.ts | 216 + core/web3/src/IStaticContractsInfo.ts | 48 + core/web3/src/LocalhostWeb3Provider.ts | 65 + core/web3/src/MockERC721A.ts | 1931 ++ core/web3/src/RiverRegistryFactory.ts | 10 + core/web3/src/SpaceDappFactory.ts | 25 + core/web3/src/TestGatingNFT.ts | 192 + core/web3/src/Utils.ts | 81 + core/web3/src/Web3Constants.ts | 6 + core/web3/src/entitlement.ts | 704 + core/web3/src/error-types.ts | 13 + core/web3/src/index.ts | 16 + core/web3/src/types.ts | 7 + core/web3/src/v3/BaseContractShim.ts | 257 + core/web3/src/v3/IBanningShim.ts | 34 + core/web3/src/v3/IChannelShim.ts | 36 + core/web3/src/v3/IERC721AQueryableShim.ts | 34 + core/web3/src/v3/IEntitlementsShim.ts | 36 + core/web3/src/v3/IMembershipShim.ts | 92 + core/web3/src/v3/IMulticallShim.ts | 33 + core/web3/src/v3/IPrepayShim.ts | 33 + core/web3/src/v3/IPricingShim.ts | 35 + core/web3/src/v3/IRiverRegistryShim.ts | 33 + core/web3/src/v3/IRolesShim.ts | 36 + core/web3/src/v3/IRuleEntitlementShim.ts | 7 + core/web3/src/v3/ISpaceArchitectShim.ts | 38 + core/web3/src/v3/ISpaceOwnerShim.ts | 36 + core/web3/src/v3/MockERC721AShim.ts | 33 + core/web3/src/v3/OwnableFacetShim.ts | 33 + core/web3/src/v3/PricingModules.ts | 32 + core/web3/src/v3/RiverRegistry.ts | 79 + core/web3/src/v3/RuleEntitlementShim.ts | 74 + core/web3/src/v3/Space.ts | 438 + core/web3/src/v3/SpaceDapp.ts | 1045 ++ core/web3/src/v3/SpaceRegistrar.ts | 54 + core/web3/src/v3/TokenPausableFacetShim.ts | 33 + core/web3/src/v3/UserEntitlementShim.ts | 75 + core/web3/src/v3/WalletLink.ts | 254 + core/web3/src/v3/WalletLinkShim.ts | 33 + core/web3/src/v3/index.ts | 16 + core/web3/tests/TestSpaceDapp.ts | 15 + core/web3/tests/Web3Constants.test.ts | 17 + core/web3/tests/entitlement.test.ts | 435 + core/web3/tsconfig.eslint.json | 4 + core/web3/tsconfig.json | 8 + core/xchain/Makefile | 40 + core/xchain/README.md | 155 + core/xchain/bindings/erc1155/erc1155.go | 1026 ++ core/xchain/bindings/erc165/erc165.go | 234 + core/xchain/bindings/erc20/erc20.go | 802 + core/xchain/bindings/erc721/erc721.go | 1034 ++ core/xchain/bindings/erc777/erc777.go | 1740 ++ core/xchain/bindings/ierc5313/ierc5313.go | 212 + .../client_simulator/client_simulator.go | 571 + core/xchain/cmd/config_cmd.go | 46 + core/xchain/cmd/genkey_cmd.go | 55 + core/xchain/cmd/register_node_cmd.go | 161 + core/xchain/cmd/root_cmd.go | 116 + core/xchain/cmd/run_cmd.go | 64 + core/xchain/cmd/run_cs.go | 100 + core/xchain/common/common.go | 185 + core/xchain/config/config.go | 88 + core/xchain/contracts/README.md | 1 + core/xchain/contracts/contracts.go | 810 + .../contracts/dev/entitlement_checker.go | 1259 ++ .../contracts/dev/i_custom_entitlement.go | 212 + core/xchain/contracts/dev/i_entitlement.go | 430 + .../contracts/dev/i_entitlement_checker.go | 794 + .../contracts/dev/i_entitlement_gated.go | 406 + core/xchain/contracts/dev/i_wallet_link.go | 680 + .../contracts/dev/mock_custom_entitlement.go | 255 + .../contracts/dev/mock_entitlement_gated.go | 895 + core/xchain/contracts/dev/wallet_link.go | 1139 ++ core/xchain/contracts/test/mock_erc20.go | 1562 ++ core/xchain/contracts/test/mock_erc721.go | 1128 ++ .../contracts/v3/entitlement_checker.go | 1259 ++ .../contracts/v3/i_custom_entitlement.go | 212 + core/xchain/contracts/v3/i_entitlement.go | 430 + .../contracts/v3/i_entitlement_checker.go | 794 + .../contracts/v3/i_entitlement_gated.go | 406 + core/xchain/contracts/v3/i_wallet_link.go | 680 + .../contracts/v3/mock_custom_entitlement.go | 255 + .../contracts/v3/mock_entitlement_gated.go | 895 + core/xchain/contracts/v3/wallet_link.go | 1139 ++ core/xchain/create_multi.sh | 113 + core/xchain/default_config.yaml | 34 + core/xchain/entitlement/check_operation.go | 242 + core/xchain/entitlement/client_pool.go | 70 + core/xchain/entitlement/entitlement.go | 364 + core/xchain/entitlement/entitlement_test.go | 372 + core/xchain/examples/common.go | 29 + core/xchain/fmt.sh | 21 + core/xchain/fund_multi.sh | 28 + core/xchain/go.mod | 116 + core/xchain/go.sum | 570 + core/xchain/launch_multi.sh | 74 + core/xchain/node/main.go | 16 + core/xchain/server/server.go | 566 + core/xchain/server/server_test.go | 758 + core/xchain/stop_multi.sh | 25 + core/xchain/util/chain.go | 73 + core/xchain/util/chain_test.go | 118 + core/xchain/util/credentials.go | 29 + foundry.toml | 52 + go.work | 6 + package.json | 135 + packages/eslint-config/package.json | 7 + packages/eslint-config/react.js | 104 + packages/eslint-config/typescript.js | 122 + packages/generated/.gitignore | 4 + packages/generated/README.md | 25 + .../addresses/base_sepolia/airdrop.json | 1 + .../addresses/ethereum_mainnet/river.json | 1 + .../generated/addresses/sepolia/river.json | 1 + .../base/addresses/authorizedClaimers.json | 1 + .../gamma/base/addresses/baseRegistry.json | 1 + .../base/addresses/entitlementChecker.json | 1 + .../gamma/base/addresses/multiInit.json | 1 + .../gamma/base/addresses/ruleEntitlement.json | 1 + .../gamma/base/addresses/space.json | 1 + .../gamma/base/addresses/spaceFactory.json | 1 + .../gamma/base/addresses/spaceOwner.json | 1 + .../gamma/base/addresses/userEntitlement.json | 1 + .../gamma/base/addresses/walletLink.json | 1 + .../deployments/gamma/base/chainId.json | 1 + .../gamma/base/contractVersion.json | 1 + .../gamma/river/addresses/riverRegistry.json | 1 + .../deployments/gamma/river/chainId.json | 1 + .../gamma/river/contractVersion.json | 1 + .../sepolia/addresses/authorizedClaimers.json | 1 + .../gamma/sepolia/addresses/riverMainnet.json | 1 + .../deployments/gamma/sepolia/chainId.json | 1 + .../gamma/sepolia/contractVersion.json | 1 + .../generated/dev/abis/Architect.abi.json | 496 + packages/generated/dev/abis/Architect.abi.ts | 496 + packages/generated/dev/abis/Architect.bin | 1 + packages/generated/dev/abis/Architect.json | 1 + .../dev/abis/Architect.metadata.json | 1164 ++ packages/generated/dev/abis/Channels.abi.json | 772 + packages/generated/dev/abis/Channels.abi.ts | 772 + packages/generated/dev/abis/Channels.bin | 1 + packages/generated/dev/abis/Channels.json | 1 + .../generated/dev/abis/Channels.metadata.json | 1211 ++ packages/generated/dev/abis/Diamond.abi.json | 249 + packages/generated/dev/abis/Diamond.abi.ts | 249 + packages/generated/dev/abis/Diamond.bin | 1 + packages/generated/dev/abis/Diamond.json | 1 + .../generated/dev/abis/Diamond.metadata.json | 401 + .../dev/abis/DiamondCutFacet.abi.json | 314 + .../generated/dev/abis/DiamondCutFacet.abi.ts | 314 + .../generated/dev/abis/DiamondCutFacet.bin | 1 + .../generated/dev/abis/DiamondCutFacet.json | 1 + .../dev/abis/DiamondCutFacet.metadata.json | 506 + .../dev/abis/EntitlementsManager.abi.json | 745 + .../dev/abis/EntitlementsManager.abi.ts | 745 + .../dev/abis/EntitlementsManager.bin | 1 + .../dev/abis/EntitlementsManager.json | 1 + .../abis/EntitlementsManager.metadata.json | 1178 ++ packages/generated/dev/abis/IBanning.abi.json | 136 + packages/generated/dev/abis/IBanning.abi.ts | 136 + packages/generated/dev/abis/IBanning.bin | 0 packages/generated/dev/abis/IBanning.json | 1 + .../generated/dev/abis/IBanning.metadata.json | 188 + .../generated/dev/abis/IBanningBase.abi.json | 78 + .../generated/dev/abis/IBanningBase.abi.ts | 78 + packages/generated/dev/abis/IBanningBase.bin | 0 packages/generated/dev/abis/IBanningBase.json | 1 + .../dev/abis/IBanningBase.metadata.json | 132 + .../dev/abis/ICustomEntitlement.abi.json | 21 + .../dev/abis/ICustomEntitlement.abi.ts | 21 + .../generated/dev/abis/ICustomEntitlement.bin | 0 .../dev/abis/ICustomEntitlement.json | 1 + .../dev/abis/ICustomEntitlement.metadata.json | 88 + .../dev/abis/IERC721AQueryable.abi.json | 308 + .../dev/abis/IERC721AQueryable.abi.ts | 308 + .../generated/dev/abis/IERC721AQueryable.bin | 0 .../generated/dev/abis/IERC721AQueryable.json | 1 + .../dev/abis/IERC721AQueryable.metadata.json | 383 + .../generated/dev/abis/IMulticall.abi.json | 21 + packages/generated/dev/abis/IMulticall.abi.ts | 21 + packages/generated/dev/abis/IMulticall.bin | 0 packages/generated/dev/abis/IMulticall.json | 1 + .../dev/abis/IMulticall.metadata.json | 88 + .../generated/dev/abis/IPausable.abi.json | 65 + packages/generated/dev/abis/IPausable.abi.ts | 65 + packages/generated/dev/abis/IPausable.bin | 0 packages/generated/dev/abis/IPausable.json | 1 + .../dev/abis/IPausable.metadata.json | 117 + .../generated/dev/abis/IPausableBase.abi.json | 38 + .../generated/dev/abis/IPausableBase.abi.ts | 38 + packages/generated/dev/abis/IPausableBase.bin | 0 .../generated/dev/abis/IPausableBase.json | 1 + .../dev/abis/IPausableBase.metadata.json | 92 + .../dev/abis/IPricingModules.abi.json | 127 + .../generated/dev/abis/IPricingModules.abi.ts | 127 + .../generated/dev/abis/IPricingModules.bin | 0 .../generated/dev/abis/IPricingModules.json | 1 + .../dev/abis/IPricingModules.metadata.json | 179 + .../dev/abis/IPricingModulesBase.abi.json | 52 + .../dev/abis/IPricingModulesBase.abi.ts | 52 + .../dev/abis/IPricingModulesBase.bin | 0 .../dev/abis/IPricingModulesBase.json | 1 + .../abis/IPricingModulesBase.metadata.json | 106 + .../dev/abis/IRuleEntitlement.abi.json | 556 + .../dev/abis/IRuleEntitlement.abi.ts | 556 + .../generated/dev/abis/IRuleEntitlement.bin | 0 .../generated/dev/abis/IRuleEntitlement.json | 1 + .../dev/abis/IRuleEntitlement.metadata.json | 678 + packages/generated/dev/abis/Member.abi.json | 795 + packages/generated/dev/abis/Member.abi.ts | 795 + packages/generated/dev/abis/Member.bin | 1 + packages/generated/dev/abis/Member.json | 1 + .../generated/dev/abis/Member.metadata.json | 1020 ++ .../dev/abis/MembershipFacet.abi.json | 1783 ++ .../generated/dev/abis/MembershipFacet.abi.ts | 1783 ++ .../generated/dev/abis/MembershipFacet.bin | 1 + .../generated/dev/abis/MembershipFacet.json | 1 + .../dev/abis/MembershipFacet.metadata.json | 2572 +++ .../dev/abis/MockCustomEntitlement.abi.json | 44 + .../dev/abis/MockCustomEntitlement.abi.ts | 44 + .../dev/abis/MockCustomEntitlement.bin | 1 + .../dev/abis/MockCustomEntitlement.json | 1 + .../abis/MockCustomEntitlement.metadata.json | 118 + .../generated/dev/abis/MockERC721A.abi.json | 549 + .../generated/dev/abis/MockERC721A.abi.ts | 549 + packages/generated/dev/abis/MockERC721A.bin | 1 + packages/generated/dev/abis/MockERC721A.json | 1 + .../dev/abis/MockERC721A.metadata.json | 731 + .../dev/abis/MockEntitlementGated.abi.json | 433 + .../dev/abis/MockEntitlementGated.abi.ts | 433 + .../dev/abis/MockEntitlementGated.bin | 1 + .../dev/abis/MockEntitlementGated.json | 1 + .../abis/MockEntitlementGated.metadata.json | 645 + .../dev/abis/MockRiverRegistry.abi.json | 1314 ++ .../dev/abis/MockRiverRegistry.abi.ts | 1314 ++ .../generated/dev/abis/MockRiverRegistry.bin | 1 + .../generated/dev/abis/MockRiverRegistry.json | 1 + .../dev/abis/MockRiverRegistry.metadata.json | 1646 ++ .../generated/dev/abis/NodeRegistry.abi.json | 252 + .../generated/dev/abis/NodeRegistry.abi.ts | 252 + packages/generated/dev/abis/NodeRegistry.bin | 1 + packages/generated/dev/abis/NodeRegistry.json | 1 + .../dev/abis/NodeRegistry.metadata.json | 348 + .../dev/abis/OperatorRegistry.abi.json | 180 + .../dev/abis/OperatorRegistry.abi.ts | 180 + .../generated/dev/abis/OperatorRegistry.bin | 1 + .../generated/dev/abis/OperatorRegistry.json | 1 + .../dev/abis/OperatorRegistry.metadata.json | 351 + .../generated/dev/abis/OwnableFacet.abi.json | 135 + .../generated/dev/abis/OwnableFacet.abi.ts | 135 + packages/generated/dev/abis/OwnableFacet.bin | 1 + packages/generated/dev/abis/OwnableFacet.json | 1 + .../dev/abis/OwnableFacet.metadata.json | 294 + .../generated/dev/abis/PrepayFacet.abi.json | 248 + .../generated/dev/abis/PrepayFacet.abi.ts | 248 + packages/generated/dev/abis/PrepayFacet.bin | 1 + packages/generated/dev/abis/PrepayFacet.json | 1 + .../dev/abis/PrepayFacet.metadata.json | 541 + .../generated/dev/abis/ProxyManager.abi.json | 165 + .../generated/dev/abis/ProxyManager.abi.ts | 165 + packages/generated/dev/abis/ProxyManager.bin | 1 + packages/generated/dev/abis/ProxyManager.json | 1 + .../dev/abis/ProxyManager.metadata.json | 358 + packages/generated/dev/abis/Roles.abi.json | 818 + packages/generated/dev/abis/Roles.abi.ts | 818 + packages/generated/dev/abis/Roles.bin | 1 + packages/generated/dev/abis/Roles.json | 1 + .../generated/dev/abis/Roles.metadata.json | 1154 ++ .../generated/dev/abis/SpaceOwner.abi.json | 1145 ++ packages/generated/dev/abis/SpaceOwner.abi.ts | 1145 ++ packages/generated/dev/abis/SpaceOwner.bin | 1 + packages/generated/dev/abis/SpaceOwner.json | 1 + .../dev/abis/SpaceOwner.metadata.json | 1629 ++ .../generated/dev/abis/StreamFlags.abi.json | 1 + .../generated/dev/abis/StreamFlags.abi.ts | 1 + packages/generated/dev/abis/StreamFlags.bin | 1 + packages/generated/dev/abis/StreamFlags.json | 1 + .../dev/abis/StreamFlags.metadata.json | 87 + .../dev/abis/StreamRegistry.abi.json | 621 + .../generated/dev/abis/StreamRegistry.abi.ts | 621 + .../generated/dev/abis/StreamRegistry.bin | 1 + .../generated/dev/abis/StreamRegistry.json | 1 + .../dev/abis/StreamRegistry.metadata.json | 724 + .../dev/abis/TokenPausableFacet.abi.json | 166 + .../dev/abis/TokenPausableFacet.abi.ts | 166 + .../generated/dev/abis/TokenPausableFacet.bin | 1 + .../dev/abis/TokenPausableFacet.json | 1 + .../dev/abis/TokenPausableFacet.metadata.json | 345 + .../dev/abis/UserEntitlement.abi.json | 331 + .../generated/dev/abis/UserEntitlement.abi.ts | 331 + .../generated/dev/abis/UserEntitlement.bin | 1 + .../generated/dev/abis/UserEntitlement.json | 1 + .../dev/abis/UserEntitlement.metadata.json | 561 + .../generated/dev/abis/WalletLink.abi.json | 426 + packages/generated/dev/abis/WalletLink.abi.ts | 426 + packages/generated/dev/abis/WalletLink.bin | 1 + packages/generated/dev/abis/WalletLink.json | 1 + .../dev/abis/WalletLink.metadata.json | 691 + packages/generated/dev/typings/IArchitect.ts | 459 + packages/generated/dev/typings/IBanning.ts | 227 + packages/generated/dev/typings/IChannel.ts | 528 + .../dev/typings/ICustomEntitlement.ts | 100 + packages/generated/dev/typings/IDiamond.ts | 56 + packages/generated/dev/typings/IDiamondCut.ts | 162 + .../dev/typings/IERC721AQueryable.ts | 357 + .../dev/typings/IEntitlementsManager.ts | 451 + packages/generated/dev/typings/IMulticall.ts | 102 + .../generated/dev/typings/INodeRegistry.ts | 435 + .../dev/typings/IOperatorRegistry.ts | 213 + packages/generated/dev/typings/IPausable.ts | 158 + .../generated/dev/typings/IPricingModules.ts | 286 + .../generated/dev/typings/IProxyManager.ts | 169 + packages/generated/dev/typings/IRoles.ts | 560 + .../generated/dev/typings/IRuleEntitlement.ts | 571 + packages/generated/dev/typings/ISpaceOwner.ts | 333 + .../generated/dev/typings/IStreamRegistry.ts | 720 + packages/generated/dev/typings/IWalletLink.ts | 417 + packages/generated/dev/typings/Member.ts | 1081 ++ .../generated/dev/typings/MembershipFacet.ts | 2270 +++ packages/generated/dev/typings/MockERC721A.ts | 826 + .../dev/typings/MockEntitlementGated.ts | 414 + .../generated/dev/typings/OwnableFacet.ts | 234 + packages/generated/dev/typings/PrepayFacet.ts | 393 + .../dev/typings/TokenPausableFacet.ts | 259 + .../generated/dev/typings/UserEntitlement.ts | 505 + packages/generated/dev/typings/common.ts | 46 + .../typings/factories/IArchitect__factory.ts | 354 + .../typings/factories/IBanning__factory.ts | 157 + .../typings/factories/IChannel__factory.ts | 320 + .../factories/ICustomEntitlement__factory.ts | 45 + .../typings/factories/IDiamondCut__factory.ts | 207 + .../typings/factories/IDiamond__factory.ts | 28 + .../factories/IERC721AQueryable__factory.ts | 332 + .../IEntitlementsManager__factory.ts | 267 + .../typings/factories/IMulticall__factory.ts | 42 + .../factories/INodeRegistry__factory.ts | 273 + .../factories/IOperatorRegistry__factory.ts | 97 + .../typings/factories/IPausable__factory.ts | 86 + .../factories/IPricingModules__factory.ts | 151 + .../factories/IProxyManager__factory.ts | 79 + .../dev/typings/factories/IRoles__factory.ts | 407 + .../factories/IRuleEntitlement__factory.ts | 580 + .../typings/factories/ISpaceOwner__factory.ts | 191 + .../factories/IStreamRegistry__factory.ts | 645 + .../typings/factories/IWalletLink__factory.ts | 338 + .../dev/typings/factories/Member__factory.ts | 877 + .../factories/MembershipFacet__factory.ts | 1844 ++ .../typings/factories/MockERC721A__factory.ts | 607 + .../MockEntitlementGated__factory.ts | 503 + .../factories/OwnableFacet__factory.ts | 193 + .../typings/factories/PrepayFacet__factory.ts | 306 + .../factories/TokenPausableFacet__factory.ts | 227 + .../factories/UserEntitlement__factory.ts | 392 + .../generated/dev/typings/factories/index.ts | 30 + packages/generated/dev/typings/index.ts | 58 + packages/generated/package.json | 9 + packages/generated/scripts/make-config.js | 43 + packages/generated/scripts/make-config.sh | 6 + packages/generated/v3/abis/Architect.abi.json | 496 + packages/generated/v3/abis/Architect.abi.ts | 496 + packages/generated/v3/abis/Architect.bin | 1 + packages/generated/v3/abis/Architect.json | 1 + .../generated/v3/abis/Architect.metadata.json | 1164 ++ packages/generated/v3/abis/Channels.abi.json | 772 + packages/generated/v3/abis/Channels.abi.ts | 772 + packages/generated/v3/abis/Channels.bin | 1 + packages/generated/v3/abis/Channels.json | 1 + .../generated/v3/abis/Channels.metadata.json | 1211 ++ packages/generated/v3/abis/Diamond.abi.json | 249 + packages/generated/v3/abis/Diamond.abi.ts | 249 + packages/generated/v3/abis/Diamond.bin | 1 + packages/generated/v3/abis/Diamond.json | 1 + .../generated/v3/abis/Diamond.metadata.json | 401 + .../v3/abis/DiamondCutFacet.abi.json | 314 + .../generated/v3/abis/DiamondCutFacet.abi.ts | 314 + .../generated/v3/abis/DiamondCutFacet.bin | 1 + .../generated/v3/abis/DiamondCutFacet.json | 1 + .../v3/abis/DiamondCutFacet.metadata.json | 506 + .../v3/abis/EntitlementsManager.abi.json | 745 + .../v3/abis/EntitlementsManager.abi.ts | 745 + .../generated/v3/abis/EntitlementsManager.bin | 1 + .../v3/abis/EntitlementsManager.json | 1 + .../v3/abis/EntitlementsManager.metadata.json | 1178 ++ packages/generated/v3/abis/IBanning.abi.json | 136 + packages/generated/v3/abis/IBanning.abi.ts | 136 + packages/generated/v3/abis/IBanning.bin | 0 packages/generated/v3/abis/IBanning.json | 1 + .../generated/v3/abis/IBanning.metadata.json | 188 + .../generated/v3/abis/IBanningBase.abi.json | 78 + .../generated/v3/abis/IBanningBase.abi.ts | 78 + packages/generated/v3/abis/IBanningBase.bin | 0 packages/generated/v3/abis/IBanningBase.json | 1 + .../v3/abis/IBanningBase.metadata.json | 132 + .../v3/abis/ICustomEntitlement.abi.json | 21 + .../v3/abis/ICustomEntitlement.abi.ts | 21 + .../generated/v3/abis/ICustomEntitlement.bin | 0 .../generated/v3/abis/ICustomEntitlement.json | 1 + .../v3/abis/ICustomEntitlement.metadata.json | 88 + .../v3/abis/IERC721AQueryable.abi.json | 308 + .../v3/abis/IERC721AQueryable.abi.ts | 308 + .../generated/v3/abis/IERC721AQueryable.bin | 0 .../generated/v3/abis/IERC721AQueryable.json | 1 + .../v3/abis/IERC721AQueryable.metadata.json | 383 + .../generated/v3/abis/IMulticall.abi.json | 21 + packages/generated/v3/abis/IMulticall.abi.ts | 21 + packages/generated/v3/abis/IMulticall.bin | 0 packages/generated/v3/abis/IMulticall.json | 1 + .../v3/abis/IMulticall.metadata.json | 88 + packages/generated/v3/abis/IPausable.abi.json | 65 + packages/generated/v3/abis/IPausable.abi.ts | 65 + packages/generated/v3/abis/IPausable.bin | 0 packages/generated/v3/abis/IPausable.json | 1 + .../generated/v3/abis/IPausable.metadata.json | 117 + .../generated/v3/abis/IPausableBase.abi.json | 38 + .../generated/v3/abis/IPausableBase.abi.ts | 38 + packages/generated/v3/abis/IPausableBase.bin | 0 packages/generated/v3/abis/IPausableBase.json | 1 + .../v3/abis/IPausableBase.metadata.json | 92 + .../v3/abis/IPricingModules.abi.json | 127 + .../generated/v3/abis/IPricingModules.abi.ts | 127 + .../generated/v3/abis/IPricingModules.bin | 0 .../generated/v3/abis/IPricingModules.json | 1 + .../v3/abis/IPricingModules.metadata.json | 179 + .../v3/abis/IPricingModulesBase.abi.json | 52 + .../v3/abis/IPricingModulesBase.abi.ts | 52 + .../generated/v3/abis/IPricingModulesBase.bin | 0 .../v3/abis/IPricingModulesBase.json | 1 + .../v3/abis/IPricingModulesBase.metadata.json | 106 + .../v3/abis/IRuleEntitlement.abi.json | 556 + .../generated/v3/abis/IRuleEntitlement.abi.ts | 556 + .../generated/v3/abis/IRuleEntitlement.bin | 0 .../generated/v3/abis/IRuleEntitlement.json | 1 + .../v3/abis/IRuleEntitlement.metadata.json | 678 + packages/generated/v3/abis/Member.abi.json | 795 + packages/generated/v3/abis/Member.abi.ts | 795 + packages/generated/v3/abis/Member.bin | 1 + packages/generated/v3/abis/Member.json | 1 + .../generated/v3/abis/Member.metadata.json | 1020 ++ .../v3/abis/MembershipFacet.abi.json | 1783 ++ .../generated/v3/abis/MembershipFacet.abi.ts | 1783 ++ .../generated/v3/abis/MembershipFacet.bin | 1 + .../generated/v3/abis/MembershipFacet.json | 1 + .../v3/abis/MembershipFacet.metadata.json | 2572 +++ .../v3/abis/MockCustomEntitlement.abi.json | 44 + .../v3/abis/MockCustomEntitlement.abi.ts | 44 + .../v3/abis/MockCustomEntitlement.bin | 1 + .../v3/abis/MockCustomEntitlement.json | 1 + .../abis/MockCustomEntitlement.metadata.json | 118 + .../generated/v3/abis/MockERC721A.abi.json | 549 + packages/generated/v3/abis/MockERC721A.abi.ts | 549 + packages/generated/v3/abis/MockERC721A.bin | 1 + packages/generated/v3/abis/MockERC721A.json | 1 + .../v3/abis/MockERC721A.metadata.json | 731 + .../v3/abis/MockEntitlementGated.abi.json | 433 + .../v3/abis/MockEntitlementGated.abi.ts | 433 + .../v3/abis/MockEntitlementGated.bin | 1 + .../v3/abis/MockEntitlementGated.json | 1 + .../abis/MockEntitlementGated.metadata.json | 645 + .../v3/abis/MockRiverRegistry.abi.json | 1243 ++ .../v3/abis/MockRiverRegistry.abi.ts | 1243 ++ .../generated/v3/abis/MockRiverRegistry.bin | 1 + .../generated/v3/abis/MockRiverRegistry.json | 1 + .../v3/abis/MockRiverRegistry.metadata.json | 1576 ++ .../generated/v3/abis/NodeRegistry.abi.json | 252 + .../generated/v3/abis/NodeRegistry.abi.ts | 252 + packages/generated/v3/abis/NodeRegistry.bin | 1 + packages/generated/v3/abis/NodeRegistry.json | 1 + .../v3/abis/NodeRegistry.metadata.json | 348 + .../v3/abis/OperatorRegistry.abi.json | 180 + .../generated/v3/abis/OperatorRegistry.abi.ts | 180 + .../generated/v3/abis/OperatorRegistry.bin | 1 + .../generated/v3/abis/OperatorRegistry.json | 1 + .../v3/abis/OperatorRegistry.metadata.json | 351 + .../generated/v3/abis/OwnableFacet.abi.json | 135 + .../generated/v3/abis/OwnableFacet.abi.ts | 135 + packages/generated/v3/abis/OwnableFacet.bin | 1 + packages/generated/v3/abis/OwnableFacet.json | 1 + .../v3/abis/OwnableFacet.metadata.json | 294 + .../generated/v3/abis/PrepayFacet.abi.json | 248 + packages/generated/v3/abis/PrepayFacet.abi.ts | 248 + packages/generated/v3/abis/PrepayFacet.bin | 1 + packages/generated/v3/abis/PrepayFacet.json | 1 + .../v3/abis/PrepayFacet.metadata.json | 541 + .../generated/v3/abis/ProxyManager.abi.json | 165 + .../generated/v3/abis/ProxyManager.abi.ts | 165 + packages/generated/v3/abis/ProxyManager.bin | 1 + packages/generated/v3/abis/ProxyManager.json | 1 + .../v3/abis/ProxyManager.metadata.json | 358 + packages/generated/v3/abis/Roles.abi.json | 818 + packages/generated/v3/abis/Roles.abi.ts | 818 + packages/generated/v3/abis/Roles.bin | 1 + packages/generated/v3/abis/Roles.json | 1 + .../generated/v3/abis/Roles.metadata.json | 1154 ++ .../generated/v3/abis/SpaceOwner.abi.json | 1145 ++ packages/generated/v3/abis/SpaceOwner.abi.ts | 1145 ++ packages/generated/v3/abis/SpaceOwner.bin | 1 + packages/generated/v3/abis/SpaceOwner.json | 1 + .../v3/abis/SpaceOwner.metadata.json | 1629 ++ .../generated/v3/abis/StreamFlags.abi.json | 1 + packages/generated/v3/abis/StreamFlags.abi.ts | 1 + packages/generated/v3/abis/StreamFlags.bin | 1 + packages/generated/v3/abis/StreamFlags.json | 1 + .../v3/abis/StreamFlags.metadata.json | 87 + .../generated/v3/abis/StreamRegistry.abi.json | 550 + .../generated/v3/abis/StreamRegistry.abi.ts | 550 + packages/generated/v3/abis/StreamRegistry.bin | 1 + .../generated/v3/abis/StreamRegistry.json | 1 + .../v3/abis/StreamRegistry.metadata.json | 654 + .../v3/abis/TokenPausableFacet.abi.json | 166 + .../v3/abis/TokenPausableFacet.abi.ts | 166 + .../generated/v3/abis/TokenPausableFacet.bin | 1 + .../generated/v3/abis/TokenPausableFacet.json | 1 + .../v3/abis/TokenPausableFacet.metadata.json | 345 + .../v3/abis/UserEntitlement.abi.json | 331 + .../generated/v3/abis/UserEntitlement.abi.ts | 331 + .../generated/v3/abis/UserEntitlement.bin | 1 + .../generated/v3/abis/UserEntitlement.json | 1 + .../v3/abis/UserEntitlement.metadata.json | 561 + .../generated/v3/abis/WalletLink.abi.json | 426 + packages/generated/v3/abis/WalletLink.abi.ts | 426 + packages/generated/v3/abis/WalletLink.bin | 1 + packages/generated/v3/abis/WalletLink.json | 1 + .../v3/abis/WalletLink.metadata.json | 691 + packages/generated/v3/typings/IArchitect.ts | 459 + packages/generated/v3/typings/IBanning.ts | 227 + packages/generated/v3/typings/IChannel.ts | 528 + .../v3/typings/ICustomEntitlement.ts | 100 + packages/generated/v3/typings/IDiamond.ts | 56 + packages/generated/v3/typings/IDiamondCut.ts | 162 + .../generated/v3/typings/IERC721AQueryable.ts | 357 + .../v3/typings/IEntitlementsManager.ts | 451 + packages/generated/v3/typings/IMulticall.ts | 102 + .../generated/v3/typings/INodeRegistry.ts | 435 + .../generated/v3/typings/IOperatorRegistry.ts | 213 + packages/generated/v3/typings/IPausable.ts | 158 + .../generated/v3/typings/IPricingModules.ts | 286 + .../generated/v3/typings/IProxyManager.ts | 169 + packages/generated/v3/typings/IRoles.ts | 560 + .../generated/v3/typings/IRuleEntitlement.ts | 571 + packages/generated/v3/typings/ISpaceOwner.ts | 333 + .../generated/v3/typings/IStreamRegistry.ts | 632 + packages/generated/v3/typings/IWalletLink.ts | 417 + packages/generated/v3/typings/Member.ts | 1081 ++ .../generated/v3/typings/MembershipFacet.ts | 2270 +++ packages/generated/v3/typings/MockERC721A.ts | 826 + .../v3/typings/MockEntitlementGated.ts | 414 + packages/generated/v3/typings/OwnableFacet.ts | 234 + packages/generated/v3/typings/PrepayFacet.ts | 393 + .../v3/typings/TokenPausableFacet.ts | 259 + .../generated/v3/typings/UserEntitlement.ts | 505 + packages/generated/v3/typings/common.ts | 46 + .../typings/factories/IArchitect__factory.ts | 354 + .../v3/typings/factories/IBanning__factory.ts | 157 + .../v3/typings/factories/IChannel__factory.ts | 320 + .../factories/ICustomEntitlement__factory.ts | 45 + .../typings/factories/IDiamondCut__factory.ts | 207 + .../v3/typings/factories/IDiamond__factory.ts | 28 + .../factories/IERC721AQueryable__factory.ts | 332 + .../IEntitlementsManager__factory.ts | 267 + .../typings/factories/IMulticall__factory.ts | 42 + .../factories/INodeRegistry__factory.ts | 273 + .../factories/IOperatorRegistry__factory.ts | 97 + .../typings/factories/IPausable__factory.ts | 86 + .../factories/IPricingModules__factory.ts | 151 + .../factories/IProxyManager__factory.ts | 79 + .../v3/typings/factories/IRoles__factory.ts | 407 + .../factories/IRuleEntitlement__factory.ts | 580 + .../typings/factories/ISpaceOwner__factory.ts | 191 + .../factories/IStreamRegistry__factory.ts | 574 + .../typings/factories/IWalletLink__factory.ts | 338 + .../v3/typings/factories/Member__factory.ts | 877 + .../factories/MembershipFacet__factory.ts | 1844 ++ .../typings/factories/MockERC721A__factory.ts | 607 + .../MockEntitlementGated__factory.ts | 503 + .../factories/OwnableFacet__factory.ts | 193 + .../typings/factories/PrepayFacet__factory.ts | 306 + .../factories/TokenPausableFacet__factory.ts | 227 + .../factories/UserEntitlement__factory.ts | 392 + .../generated/v3/typings/factories/index.ts | 30 + packages/generated/v3/typings/index.ts | 58 + packages/prettier-config/README.md | 3 + packages/prettier-config/config.js | 24 + packages/prettier-config/package.json | 9 + packages/stress-testing/.dockerignore | 6 + packages/stress-testing/.env.example | 14 + packages/stress-testing/.env.example.gamma | 14 + packages/stress-testing/Dockerfile | 45 + packages/stress-testing/README.md | 11 + packages/stress-testing/docker-compose.yml | 29 + packages/stress-testing/scripts/start-node.sh | 37 + remappings.txt | 9 + scripts/Makefile | 20 + scripts/bc-all-start.sh | 22 + scripts/bc-all-stop.sh | 17 + scripts/build-artifacts.sh | 5 + scripts/build-contract-coverage.sh | 7 + scripts/build-contract-types.sh | 44 + scripts/build-contracts.sh | 12 + scripts/build-protobufs.sh | 15 + scripts/check-go-version.sh | 28 + scripts/check-node-version.sh | 32 + scripts/configure-nodes.sh | 24 + scripts/copyLibs.js | 36 + scripts/deploy-contracts.sh | 88 + scripts/foundry-up.sh | 13 + scripts/gen-bindings-remove-struct.go | 107 + scripts/gen-river-node-bindings.sh | 80 + scripts/gen-xchain-bindings.sh | 82 + scripts/install-deps.sh | 7 + scripts/install-protobuf-deps.sh | 15 + scripts/kill-all-local-dev.sh | 114 + scripts/kill-on-port.sh | 42 + scripts/kill_dev.sh | 4 + scripts/lint-shell-scripts.sh | 45 + scripts/node-no-warn.js | 57 + scripts/node-registration-lib.sh | 97 + scripts/print-versions.sh | 27 + scripts/start-load-testing-redis.sh | 15 + scripts/start-local-basechain.sh | 15 + scripts/start-local-blockscout.sh | 7 + scripts/start-local-riverchain.sh | 20 + scripts/start_dev.sh | 164 + scripts/wait-for-basechain.sh | 5 + scripts/wait-for-core.sh | 9 + scripts/wait-for-port.sh | 19 + scripts/wait-for-riverchain.sh | 5 + scripts/yarn-clean.sh | 61 + turbo.json | 22 + yarn.lock | 14613 ++++++++++++++++ 970 files changed, 254455 insertions(+) create mode 100644 .editorconfig create mode 100644 .eslintignore create mode 100644 .git-blame-ignore-revs create mode 100644 .github/CODEOWNERS create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/River_node_docker.yml create mode 100644 .github/workflows/Stress_test_node_docker.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/clean_turbo_cache.yml create mode 100644 .gitignore create mode 100644 .nvmrc create mode 100644 .prettierignore create mode 100644 .prettierrc.js create mode 100644 .solhint.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 .yarn/patches/jest-worker-npm-29.5.0-70da3388f1.patch create mode 100644 .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs create mode 100755 .yarn/releases/yarn-3.8.0.cjs create mode 100644 .yarnrc.yml create mode 100644 README.md create mode 100644 SECURITY.md create mode 100644 assets/river-logo-square-black.svg create mode 100644 core/.vscode/launch.json create mode 100644 core/Dockerfile create mode 100644 core/README.md create mode 100644 core/debug-app/README.md create mode 100644 core/debug-app/package.json create mode 100644 core/debug-app/src/fetcher.ts create mode 100644 core/debug-app/src/index.html create mode 100644 core/debug-app/src/log.ts create mode 100644 core/debug-app/tsconfig.json create mode 100644 core/debug-app/vite.config.ts create mode 100644 core/dlog/.eslintrc.json create mode 100644 core/dlog/README.md create mode 100644 core/dlog/jest.config.ts create mode 100644 core/dlog/package.json create mode 100644 core/dlog/src/binary.ts create mode 100644 core/dlog/src/check.ts create mode 100644 core/dlog/src/dlog.ts create mode 100644 core/dlog/src/index.ts create mode 100644 core/dlog/src/tests/binary.test.ts create mode 100644 core/dlog/src/tests/dlog.test.ts create mode 100644 core/dlog/src/utils.ts create mode 100644 core/dlog/tsconfig.eslint.json create mode 100644 core/dlog/tsconfig.json create mode 100644 core/docker-compose.yml create mode 100644 core/jest.env.ts create mode 100644 core/jest.matchers.ts create mode 100644 core/node/.dockerignore create mode 100644 core/node/.gitignore create mode 100644 core/node/.golangci.yml create mode 100644 core/node/.mockery.yaml create mode 100644 core/node/.vscode/launch.json create mode 100644 core/node/README.md create mode 100644 core/node/auth/architect.go create mode 100644 core/node/auth/auth_impl.go create mode 100644 core/node/auth/auth_impl_cache.go create mode 100644 core/node/auth/auth_impl_cache_test.go create mode 100644 core/node/auth/channels.go create mode 100644 core/node/auth/entitlement.go create mode 100644 core/node/auth/fake_auth.go create mode 100644 core/node/auth/pausable.go create mode 100644 core/node/auth/permissions.go create mode 100644 core/node/auth/space_contract.go create mode 100644 core/node/auth/space_contract_v3.go create mode 100644 core/node/auth/wallet_link.go create mode 100644 core/node/base/convert.go create mode 100644 core/node/base/debug_settings.go create mode 100644 core/node/base/error.go create mode 100644 core/node/base/error_test.go create mode 100644 core/node/base/hash_format.go create mode 100644 core/node/base/nanoid.go create mode 100644 core/node/base/test/context.go create mode 100644 core/node/bin/.gitignore create mode 100644 core/node/cmd/archive_cmd.go create mode 100644 core/node/cmd/config_cmd.go create mode 100644 core/node/cmd/genkey_cmd.go create mode 100644 core/node/cmd/info_cmd.go create mode 100644 core/node/cmd/ping_cmd.go create mode 100644 core/node/cmd/registry_cmd.go create mode 100644 core/node/cmd/root_cmd.go create mode 100644 core/node/cmd/run_cmd.go create mode 100644 core/node/cmd/version_cmd.go create mode 100644 core/node/config-template.yaml create mode 100644 core/node/config/config.go create mode 100644 core/node/config/config_test.go create mode 100644 core/node/config/testdata/databaseconfig.txt create mode 100644 core/node/config/testdata/databaseconfig_json.txt create mode 100644 core/node/config/testdata/load_address.json create mode 100644 core/node/config/testdata/test_config.yaml create mode 100644 core/node/config/testdata/tlsconfig.txt create mode 100644 core/node/config/testdata/tlsconfig_json.txt create mode 100644 core/node/config/viper_hooks.go create mode 100644 core/node/config/viper_hooks_test.go create mode 100755 core/node/config_instance.sh create mode 100644 core/node/contracts/base/architect.go create mode 100644 core/node/contracts/base/channels.go create mode 100644 core/node/contracts/base/entitlements_manager.go create mode 100644 core/node/contracts/base/pausable.go create mode 100644 core/node/contracts/base/rule_entitlement.go create mode 100644 core/node/contracts/base/wallet_link.go create mode 100644 core/node/contracts/custom_errors.go create mode 100644 core/node/contracts/custom_errors_test.go create mode 100644 core/node/contracts/deploy/mock_river_registry.go create mode 100644 core/node/contracts/node_registry_v1.go create mode 100644 core/node/contracts/node_registry_v1_ex.go create mode 100644 core/node/contracts/operator_registry_v1.go create mode 100644 core/node/contracts/river_config_v1.go create mode 100644 core/node/contracts/river_config_v1_ex.go create mode 100644 core/node/contracts/stream_registry_v1.go create mode 100644 core/node/contracts/stream_registry_v1_ex.go create mode 100644 core/node/conventions.md create mode 100644 core/node/crypto/block_number.go create mode 100644 core/node/crypto/blockchain.go create mode 100644 core/node/crypto/blockchain_test.go create mode 100644 core/node/crypto/chain_monitor.go create mode 100644 core/node/crypto/chain_monitor_builder.go create mode 100644 core/node/crypto/chain_monitor_test.go create mode 100644 core/node/crypto/chain_txpool.go create mode 100644 core/node/crypto/chain_txpool_policy.go create mode 100644 core/node/crypto/chain_txpool_test.go create mode 100644 core/node/crypto/chain_utils.go create mode 100644 core/node/crypto/config.go create mode 100644 core/node/crypto/config_test.go create mode 100644 core/node/crypto/delegate.go create mode 100644 core/node/crypto/delegate_test.go create mode 100644 core/node/crypto/sign.go create mode 100644 core/node/crypto/sign_test.go create mode 100644 core/node/crypto/testutil.go create mode 100644 core/node/crypto/utils.go create mode 100644 core/node/default_config.yaml create mode 100644 core/node/dlog/README.md create mode 100644 core/node/dlog/buffer/buffer.go create mode 100644 core/node/dlog/color.go create mode 100644 core/node/dlog/color_map.go create mode 100644 core/node/dlog/common_handler.go create mode 100644 core/node/dlog/dlog_test.go create mode 100644 core/node/dlog/formatter.go create mode 100644 core/node/dlog/json_handler.go create mode 100644 core/node/dlog/json_handler_test.go create mode 100644 core/node/dlog/log.go create mode 100644 core/node/dlog/multi_handler.go create mode 100644 core/node/dlog/null_handler.go create mode 100644 core/node/dlog/testdata/envelope_json.txt create mode 100644 core/node/dlog/text_handler.go create mode 100644 core/node/dlog/zero.go create mode 100644 core/node/env/gamma-arch/config.yaml create mode 100755 core/node/env/gamma-arch/run.sh create mode 100644 core/node/env/gamma/config.yaml create mode 100755 core/node/env/gamma/run.sh create mode 100644 core/node/events/events.go create mode 100644 core/node/events/format.go create mode 100644 core/node/events/migrations/migrate_snapshot.go create mode 100644 core/node/events/migrations/snapshot_migration_0000.go create mode 100644 core/node/events/migrations/snapshot_migration_0000_test.go create mode 100644 core/node/events/migrations/snapshot_migration_0001.go create mode 100644 core/node/events/migrations/snapshot_migration_0001_test.go create mode 100644 core/node/events/miniblock.go create mode 100644 core/node/events/minipool.go create mode 100644 core/node/events/parsed_event.go create mode 100644 core/node/events/snapshot.go create mode 100644 core/node/events/snapshot_test.go create mode 100644 core/node/events/stream.go create mode 100644 core/node/events/stream_cache.go create mode 100644 core/node/events/stream_cache_test.go create mode 100644 core/node/events/stream_test.go create mode 100644 core/node/events/stream_view.go create mode 100644 core/node/events/stream_view_test.go create mode 100644 core/node/events/stream_viewstate_channel.go create mode 100644 core/node/events/stream_viewstate_dm_channel.go create mode 100644 core/node/events/stream_viewstate_joinable.go create mode 100644 core/node/events/stream_viewstate_media.go create mode 100644 core/node/events/stream_viewstate_space.go create mode 100644 core/node/events/stream_viewstate_space_test.go create mode 100644 core/node/events/stream_viewstate_user.go create mode 100644 core/node/events/sync_cookie.go create mode 100644 core/node/events/sync_cookie_test.go create mode 100644 core/node/events/util_test.go create mode 100755 core/node/fmt.sh create mode 100755 core/node/generate_mocks.sh create mode 100644 core/node/go.mod create mode 100644 core/node/go.sum create mode 100644 core/node/http_client/client.go create mode 100644 core/node/infra/config/config.go create mode 100644 core/node/infra/constants.go create mode 100644 core/node/infra/logging.go create mode 100644 core/node/infra/metrics.go create mode 100755 core/node/lint.sh create mode 100755 core/node/lint_extensions.sh create mode 100644 core/node/lint_extensions/lintextensions.go create mode 100644 core/node/logs/.gitignore create mode 100644 core/node/node/main.go create mode 100644 core/node/node/version/version.go create mode 100644 core/node/nodes/node_record.go create mode 100644 core/node/nodes/node_registry.go create mode 100644 core/node/nodes/node_registry_test.go create mode 100644 core/node/nodes/stream_nodes.go create mode 100644 core/node/nodes/stream_nodes_test.go create mode 100644 core/node/nodes/stream_registry.go create mode 100644 core/node/protocol/.gitignore create mode 100644 core/node/protocol/buf.gen.yaml create mode 100644 core/node/protocol/buf.yaml create mode 100644 core/node/protocol/extensions.pb.go create mode 100644 core/node/protocol/gen.go create mode 100755 core/node/protocol/gen.sh create mode 100644 core/node/protocol/helpers.go create mode 100644 core/node/protocol/internode.pb.go create mode 100644 core/node/protocol/internode.proto create mode 100644 core/node/protocol/protocol.pb.go create mode 100644 core/node/protocol/protocol_test.go create mode 100644 core/node/protocol/protocolconnect/internode.connect.go create mode 100644 core/node/protocol/protocolconnect/protocol.connect.go create mode 100644 core/node/protocol_extensions/main.go create mode 100644 core/node/registries/river_registry_contract.go create mode 100644 core/node/registries/river_registry_contract_test.go create mode 100644 core/node/rpc/add_event.go create mode 100644 core/node/rpc/archive.go create mode 100644 core/node/rpc/archiver.go create mode 100644 core/node/rpc/archiver_test.go create mode 100644 core/node/rpc/create_stream.go create mode 100644 core/node/rpc/debug.go create mode 100644 core/node/rpc/forwarder.go create mode 100644 core/node/rpc/get_last_miniblock_hash.go create mode 100644 core/node/rpc/get_miniblocks.go create mode 100644 core/node/rpc/get_stream.go create mode 100644 core/node/rpc/get_stream_ex.go create mode 100644 core/node/rpc/http_handler.go create mode 100644 core/node/rpc/info.go create mode 100644 core/node/rpc/info_mode.go create mode 100644 core/node/rpc/load_stream.go create mode 100644 core/node/rpc/memory.go create mode 100644 core/node/rpc/metrics_interceptor.go create mode 100644 core/node/rpc/multi.go create mode 100644 core/node/rpc/new_node_test.go create mode 100644 core/node/rpc/node2node.go create mode 100644 core/node/rpc/quorum_pool.go create mode 100644 core/node/rpc/render/render.go create mode 100644 core/node/rpc/render/render_test.go create mode 100644 core/node/rpc/render/templates/debug/available.template.html create mode 100644 core/node/rpc/render/templates/debug/cache.template.html create mode 100644 core/node/rpc/render/templates/debug/memory.template.html create mode 100644 core/node/rpc/render/templates/debug/multi.template.html create mode 100644 core/node/rpc/render/templates/debug/stacks.template.html create mode 100644 core/node/rpc/render/templates/debug/txpool.template.html create mode 100644 core/node/rpc/render/templates/info/index.template.html create mode 100644 core/node/rpc/render/types.go create mode 100644 core/node/rpc/replicated_add.go create mode 100644 core/node/rpc/server.go create mode 100644 core/node/rpc/server_test.go create mode 100644 core/node/rpc/service.go create mode 100644 core/node/rpc/service_test.go create mode 100644 core/node/rpc/shutdown_test.go create mode 100644 core/node/rpc/standby.go create mode 100644 core/node/rpc/standby_test.go create mode 100644 core/node/rpc/status.go create mode 100644 core/node/rpc/statusinfo/node_status.go create mode 100644 core/node/rpc/sync_receiver.go create mode 100644 core/node/rpc/sync_streams.go create mode 100644 core/node/rpc/sync_subscription.go create mode 100644 core/node/rpc/tester_test.go create mode 100644 core/node/rpc/timeout_interceptor.go create mode 100644 core/node/rpc/util.go create mode 100644 core/node/rules/can_add_event.go create mode 100644 core/node/rules/can_create_stream.go create mode 100644 core/node/rules/rule_builder.go create mode 100644 core/node/rules/rule_builder_ae.go create mode 100644 core/node/rules/rule_builder_cs.go create mode 100755 core/node/run_docker.sh create mode 100755 core/node/run_impl.sh create mode 100755 core/node/run_multi.sh create mode 100755 core/node/run_single.sh create mode 100644 core/node/shared/ids.go create mode 100644 core/node/shared/ids_test.go create mode 100644 core/node/shared/stream_id.go create mode 100644 core/node/shared/stream_info.go create mode 100755 core/node/start.sh create mode 100644 core/node/staticcheck.conf create mode 100755 core/node/stop_multi.sh create mode 100644 core/node/storage/init_db.sql create mode 100644 core/node/storage/migrations/000001_create_initial_schema.down.sql create mode 100644 core/node/storage/migrations/000001_create_initial_schema.up.sql create mode 100644 core/node/storage/migrations/000002_create_miniblock_candidates_table.down.sql create mode 100644 core/node/storage/migrations/000002_create_miniblock_candidates_table.up.sql create mode 100644 core/node/storage/migrations/000003_add_notify_trigger_to_singlenodekey.down.sql create mode 100644 core/node/storage/migrations/000003_add_notify_trigger_to_singlenodekey.up.sql create mode 100644 core/node/storage/migrations_test.go create mode 100644 core/node/storage/pg_storage.go create mode 100644 core/node/storage/pg_storage_archive_test.go create mode 100644 core/node/storage/pg_storage_test.go create mode 100644 core/node/storage/storage.go create mode 100644 core/node/storage/test_pg_store.go create mode 100755 core/node/test.sh create mode 100644 core/node/testutils/dbtestutils/db.go create mode 100644 core/node/testutils/ids.go create mode 100644 core/node/testutils/logutils.go create mode 100644 core/node/testutils/mocks/mock_node_registry.go create mode 100644 core/node/testutils/mocks/mock_stream_registry.go create mode 100644 core/node/testutils/mocks/mock_stream_service_client.go create mode 100644 core/node/utils/ordered_map.go create mode 100644 core/proto/buf.gen.yaml create mode 100644 core/proto/buf.yaml create mode 100644 core/proto/internal.proto create mode 100644 core/proto/jest.config.ts create mode 100644 core/proto/package.json create mode 100644 core/proto/payloads.proto create mode 100644 core/proto/protocol.proto create mode 100644 core/proto/scripts/watch_proto_files.cjs create mode 100644 core/proto/scripts/watch_proto_files_go.cjs create mode 100644 core/proto/src/index.ts create mode 100644 core/proto/src/types.ts create mode 100644 core/proto/tsconfig.json create mode 100644 core/scripts/docker-compose.yml create mode 100755 core/scripts/generate-certs.sh create mode 100755 core/scripts/generate_sdk_index.sh create mode 100755 core/scripts/launch.sh create mode 100755 core/scripts/launch_multi.sh create mode 100755 core/scripts/launch_storage.sh create mode 100644 core/scripts/load-testing-docker-compose.yml create mode 100755 core/scripts/register-ca.sh create mode 100644 core/scripts/sql/create_db.sql create mode 100755 core/scripts/start_node.sh create mode 100755 core/scripts/start_node_multi.sh create mode 100755 core/scripts/stop.sh create mode 100755 core/scripts/stop_node.sh create mode 100755 core/scripts/stop_storage.sh create mode 100644 core/supervisord.conf create mode 100644 core/test/crypto/keys.csv create mode 100644 core/test/crypto/test_data.csv create mode 100644 core/tsconfig.base.json create mode 100644 core/web3/.eslintrc.json create mode 100644 core/web3/.gitignore create mode 100644 core/web3/README.md create mode 100644 core/web3/jest-setup.ts create mode 100644 core/web3/jest.config.ts create mode 100644 core/web3/package.json create mode 100644 core/web3/src/ContractHelpers.ts create mode 100644 core/web3/src/ContractTypes.ts create mode 100644 core/web3/src/ConvertersEntitlements.ts create mode 100644 core/web3/src/ConvertersRoles.ts create mode 100644 core/web3/src/ISpaceDapp.ts create mode 100644 core/web3/src/IStaticContractsInfo.ts create mode 100644 core/web3/src/LocalhostWeb3Provider.ts create mode 100644 core/web3/src/MockERC721A.ts create mode 100644 core/web3/src/RiverRegistryFactory.ts create mode 100644 core/web3/src/SpaceDappFactory.ts create mode 100644 core/web3/src/TestGatingNFT.ts create mode 100644 core/web3/src/Utils.ts create mode 100644 core/web3/src/Web3Constants.ts create mode 100644 core/web3/src/entitlement.ts create mode 100644 core/web3/src/error-types.ts create mode 100644 core/web3/src/index.ts create mode 100644 core/web3/src/types.ts create mode 100644 core/web3/src/v3/BaseContractShim.ts create mode 100644 core/web3/src/v3/IBanningShim.ts create mode 100644 core/web3/src/v3/IChannelShim.ts create mode 100644 core/web3/src/v3/IERC721AQueryableShim.ts create mode 100644 core/web3/src/v3/IEntitlementsShim.ts create mode 100644 core/web3/src/v3/IMembershipShim.ts create mode 100644 core/web3/src/v3/IMulticallShim.ts create mode 100644 core/web3/src/v3/IPrepayShim.ts create mode 100644 core/web3/src/v3/IPricingShim.ts create mode 100644 core/web3/src/v3/IRiverRegistryShim.ts create mode 100644 core/web3/src/v3/IRolesShim.ts create mode 100644 core/web3/src/v3/IRuleEntitlementShim.ts create mode 100644 core/web3/src/v3/ISpaceArchitectShim.ts create mode 100644 core/web3/src/v3/ISpaceOwnerShim.ts create mode 100644 core/web3/src/v3/MockERC721AShim.ts create mode 100644 core/web3/src/v3/OwnableFacetShim.ts create mode 100644 core/web3/src/v3/PricingModules.ts create mode 100644 core/web3/src/v3/RiverRegistry.ts create mode 100644 core/web3/src/v3/RuleEntitlementShim.ts create mode 100644 core/web3/src/v3/Space.ts create mode 100644 core/web3/src/v3/SpaceDapp.ts create mode 100644 core/web3/src/v3/SpaceRegistrar.ts create mode 100644 core/web3/src/v3/TokenPausableFacetShim.ts create mode 100644 core/web3/src/v3/UserEntitlementShim.ts create mode 100644 core/web3/src/v3/WalletLink.ts create mode 100644 core/web3/src/v3/WalletLinkShim.ts create mode 100644 core/web3/src/v3/index.ts create mode 100644 core/web3/tests/TestSpaceDapp.ts create mode 100644 core/web3/tests/Web3Constants.test.ts create mode 100644 core/web3/tests/entitlement.test.ts create mode 100644 core/web3/tsconfig.eslint.json create mode 100644 core/web3/tsconfig.json create mode 100644 core/xchain/Makefile create mode 100644 core/xchain/README.md create mode 100644 core/xchain/bindings/erc1155/erc1155.go create mode 100644 core/xchain/bindings/erc165/erc165.go create mode 100644 core/xchain/bindings/erc20/erc20.go create mode 100644 core/xchain/bindings/erc721/erc721.go create mode 100644 core/xchain/bindings/erc777/erc777.go create mode 100644 core/xchain/bindings/ierc5313/ierc5313.go create mode 100644 core/xchain/client_simulator/client_simulator.go create mode 100644 core/xchain/cmd/config_cmd.go create mode 100644 core/xchain/cmd/genkey_cmd.go create mode 100644 core/xchain/cmd/register_node_cmd.go create mode 100644 core/xchain/cmd/root_cmd.go create mode 100644 core/xchain/cmd/run_cmd.go create mode 100644 core/xchain/cmd/run_cs.go create mode 100644 core/xchain/common/common.go create mode 100644 core/xchain/config/config.go create mode 100644 core/xchain/contracts/README.md create mode 100644 core/xchain/contracts/contracts.go create mode 100644 core/xchain/contracts/dev/entitlement_checker.go create mode 100644 core/xchain/contracts/dev/i_custom_entitlement.go create mode 100644 core/xchain/contracts/dev/i_entitlement.go create mode 100644 core/xchain/contracts/dev/i_entitlement_checker.go create mode 100644 core/xchain/contracts/dev/i_entitlement_gated.go create mode 100644 core/xchain/contracts/dev/i_wallet_link.go create mode 100644 core/xchain/contracts/dev/mock_custom_entitlement.go create mode 100644 core/xchain/contracts/dev/mock_entitlement_gated.go create mode 100644 core/xchain/contracts/dev/wallet_link.go create mode 100644 core/xchain/contracts/test/mock_erc20.go create mode 100644 core/xchain/contracts/test/mock_erc721.go create mode 100644 core/xchain/contracts/v3/entitlement_checker.go create mode 100644 core/xchain/contracts/v3/i_custom_entitlement.go create mode 100644 core/xchain/contracts/v3/i_entitlement.go create mode 100644 core/xchain/contracts/v3/i_entitlement_checker.go create mode 100644 core/xchain/contracts/v3/i_entitlement_gated.go create mode 100644 core/xchain/contracts/v3/i_wallet_link.go create mode 100644 core/xchain/contracts/v3/mock_custom_entitlement.go create mode 100644 core/xchain/contracts/v3/mock_entitlement_gated.go create mode 100644 core/xchain/contracts/v3/wallet_link.go create mode 100755 core/xchain/create_multi.sh create mode 100644 core/xchain/default_config.yaml create mode 100644 core/xchain/entitlement/check_operation.go create mode 100644 core/xchain/entitlement/client_pool.go create mode 100644 core/xchain/entitlement/entitlement.go create mode 100644 core/xchain/entitlement/entitlement_test.go create mode 100644 core/xchain/examples/common.go create mode 100755 core/xchain/fmt.sh create mode 100755 core/xchain/fund_multi.sh create mode 100644 core/xchain/go.mod create mode 100644 core/xchain/go.sum create mode 100755 core/xchain/launch_multi.sh create mode 100644 core/xchain/node/main.go create mode 100644 core/xchain/server/server.go create mode 100644 core/xchain/server/server_test.go create mode 100755 core/xchain/stop_multi.sh create mode 100644 core/xchain/util/chain.go create mode 100644 core/xchain/util/chain_test.go create mode 100644 core/xchain/util/credentials.go create mode 100644 foundry.toml create mode 100644 go.work create mode 100644 package.json create mode 100644 packages/eslint-config/package.json create mode 100644 packages/eslint-config/react.js create mode 100644 packages/eslint-config/typescript.js create mode 100644 packages/generated/.gitignore create mode 100644 packages/generated/README.md create mode 100644 packages/generated/addresses/base_sepolia/airdrop.json create mode 100644 packages/generated/addresses/ethereum_mainnet/river.json create mode 100644 packages/generated/addresses/sepolia/river.json create mode 100644 packages/generated/deployments/gamma/base/addresses/authorizedClaimers.json create mode 100644 packages/generated/deployments/gamma/base/addresses/baseRegistry.json create mode 100644 packages/generated/deployments/gamma/base/addresses/entitlementChecker.json create mode 100644 packages/generated/deployments/gamma/base/addresses/multiInit.json create mode 100644 packages/generated/deployments/gamma/base/addresses/ruleEntitlement.json create mode 100644 packages/generated/deployments/gamma/base/addresses/space.json create mode 100644 packages/generated/deployments/gamma/base/addresses/spaceFactory.json create mode 100644 packages/generated/deployments/gamma/base/addresses/spaceOwner.json create mode 100644 packages/generated/deployments/gamma/base/addresses/userEntitlement.json create mode 100644 packages/generated/deployments/gamma/base/addresses/walletLink.json create mode 100644 packages/generated/deployments/gamma/base/chainId.json create mode 100644 packages/generated/deployments/gamma/base/contractVersion.json create mode 100644 packages/generated/deployments/gamma/river/addresses/riverRegistry.json create mode 100644 packages/generated/deployments/gamma/river/chainId.json create mode 100644 packages/generated/deployments/gamma/river/contractVersion.json create mode 100644 packages/generated/deployments/gamma/sepolia/addresses/authorizedClaimers.json create mode 100644 packages/generated/deployments/gamma/sepolia/addresses/riverMainnet.json create mode 100644 packages/generated/deployments/gamma/sepolia/chainId.json create mode 100644 packages/generated/deployments/gamma/sepolia/contractVersion.json create mode 100644 packages/generated/dev/abis/Architect.abi.json create mode 100644 packages/generated/dev/abis/Architect.abi.ts create mode 100644 packages/generated/dev/abis/Architect.bin create mode 100644 packages/generated/dev/abis/Architect.json create mode 100644 packages/generated/dev/abis/Architect.metadata.json create mode 100644 packages/generated/dev/abis/Channels.abi.json create mode 100644 packages/generated/dev/abis/Channels.abi.ts create mode 100644 packages/generated/dev/abis/Channels.bin create mode 100644 packages/generated/dev/abis/Channels.json create mode 100644 packages/generated/dev/abis/Channels.metadata.json create mode 100644 packages/generated/dev/abis/Diamond.abi.json create mode 100644 packages/generated/dev/abis/Diamond.abi.ts create mode 100644 packages/generated/dev/abis/Diamond.bin create mode 100644 packages/generated/dev/abis/Diamond.json create mode 100644 packages/generated/dev/abis/Diamond.metadata.json create mode 100644 packages/generated/dev/abis/DiamondCutFacet.abi.json create mode 100644 packages/generated/dev/abis/DiamondCutFacet.abi.ts create mode 100644 packages/generated/dev/abis/DiamondCutFacet.bin create mode 100644 packages/generated/dev/abis/DiamondCutFacet.json create mode 100644 packages/generated/dev/abis/DiamondCutFacet.metadata.json create mode 100644 packages/generated/dev/abis/EntitlementsManager.abi.json create mode 100644 packages/generated/dev/abis/EntitlementsManager.abi.ts create mode 100644 packages/generated/dev/abis/EntitlementsManager.bin create mode 100644 packages/generated/dev/abis/EntitlementsManager.json create mode 100644 packages/generated/dev/abis/EntitlementsManager.metadata.json create mode 100644 packages/generated/dev/abis/IBanning.abi.json create mode 100644 packages/generated/dev/abis/IBanning.abi.ts create mode 100644 packages/generated/dev/abis/IBanning.bin create mode 100644 packages/generated/dev/abis/IBanning.json create mode 100644 packages/generated/dev/abis/IBanning.metadata.json create mode 100644 packages/generated/dev/abis/IBanningBase.abi.json create mode 100644 packages/generated/dev/abis/IBanningBase.abi.ts create mode 100644 packages/generated/dev/abis/IBanningBase.bin create mode 100644 packages/generated/dev/abis/IBanningBase.json create mode 100644 packages/generated/dev/abis/IBanningBase.metadata.json create mode 100644 packages/generated/dev/abis/ICustomEntitlement.abi.json create mode 100644 packages/generated/dev/abis/ICustomEntitlement.abi.ts create mode 100644 packages/generated/dev/abis/ICustomEntitlement.bin create mode 100644 packages/generated/dev/abis/ICustomEntitlement.json create mode 100644 packages/generated/dev/abis/ICustomEntitlement.metadata.json create mode 100644 packages/generated/dev/abis/IERC721AQueryable.abi.json create mode 100644 packages/generated/dev/abis/IERC721AQueryable.abi.ts create mode 100644 packages/generated/dev/abis/IERC721AQueryable.bin create mode 100644 packages/generated/dev/abis/IERC721AQueryable.json create mode 100644 packages/generated/dev/abis/IERC721AQueryable.metadata.json create mode 100644 packages/generated/dev/abis/IMulticall.abi.json create mode 100644 packages/generated/dev/abis/IMulticall.abi.ts create mode 100644 packages/generated/dev/abis/IMulticall.bin create mode 100644 packages/generated/dev/abis/IMulticall.json create mode 100644 packages/generated/dev/abis/IMulticall.metadata.json create mode 100644 packages/generated/dev/abis/IPausable.abi.json create mode 100644 packages/generated/dev/abis/IPausable.abi.ts create mode 100644 packages/generated/dev/abis/IPausable.bin create mode 100644 packages/generated/dev/abis/IPausable.json create mode 100644 packages/generated/dev/abis/IPausable.metadata.json create mode 100644 packages/generated/dev/abis/IPausableBase.abi.json create mode 100644 packages/generated/dev/abis/IPausableBase.abi.ts create mode 100644 packages/generated/dev/abis/IPausableBase.bin create mode 100644 packages/generated/dev/abis/IPausableBase.json create mode 100644 packages/generated/dev/abis/IPausableBase.metadata.json create mode 100644 packages/generated/dev/abis/IPricingModules.abi.json create mode 100644 packages/generated/dev/abis/IPricingModules.abi.ts create mode 100644 packages/generated/dev/abis/IPricingModules.bin create mode 100644 packages/generated/dev/abis/IPricingModules.json create mode 100644 packages/generated/dev/abis/IPricingModules.metadata.json create mode 100644 packages/generated/dev/abis/IPricingModulesBase.abi.json create mode 100644 packages/generated/dev/abis/IPricingModulesBase.abi.ts create mode 100644 packages/generated/dev/abis/IPricingModulesBase.bin create mode 100644 packages/generated/dev/abis/IPricingModulesBase.json create mode 100644 packages/generated/dev/abis/IPricingModulesBase.metadata.json create mode 100644 packages/generated/dev/abis/IRuleEntitlement.abi.json create mode 100644 packages/generated/dev/abis/IRuleEntitlement.abi.ts create mode 100644 packages/generated/dev/abis/IRuleEntitlement.bin create mode 100644 packages/generated/dev/abis/IRuleEntitlement.json create mode 100644 packages/generated/dev/abis/IRuleEntitlement.metadata.json create mode 100644 packages/generated/dev/abis/Member.abi.json create mode 100644 packages/generated/dev/abis/Member.abi.ts create mode 100644 packages/generated/dev/abis/Member.bin create mode 100644 packages/generated/dev/abis/Member.json create mode 100644 packages/generated/dev/abis/Member.metadata.json create mode 100644 packages/generated/dev/abis/MembershipFacet.abi.json create mode 100644 packages/generated/dev/abis/MembershipFacet.abi.ts create mode 100644 packages/generated/dev/abis/MembershipFacet.bin create mode 100644 packages/generated/dev/abis/MembershipFacet.json create mode 100644 packages/generated/dev/abis/MembershipFacet.metadata.json create mode 100644 packages/generated/dev/abis/MockCustomEntitlement.abi.json create mode 100644 packages/generated/dev/abis/MockCustomEntitlement.abi.ts create mode 100644 packages/generated/dev/abis/MockCustomEntitlement.bin create mode 100644 packages/generated/dev/abis/MockCustomEntitlement.json create mode 100644 packages/generated/dev/abis/MockCustomEntitlement.metadata.json create mode 100644 packages/generated/dev/abis/MockERC721A.abi.json create mode 100644 packages/generated/dev/abis/MockERC721A.abi.ts create mode 100644 packages/generated/dev/abis/MockERC721A.bin create mode 100644 packages/generated/dev/abis/MockERC721A.json create mode 100644 packages/generated/dev/abis/MockERC721A.metadata.json create mode 100644 packages/generated/dev/abis/MockEntitlementGated.abi.json create mode 100644 packages/generated/dev/abis/MockEntitlementGated.abi.ts create mode 100644 packages/generated/dev/abis/MockEntitlementGated.bin create mode 100644 packages/generated/dev/abis/MockEntitlementGated.json create mode 100644 packages/generated/dev/abis/MockEntitlementGated.metadata.json create mode 100644 packages/generated/dev/abis/MockRiverRegistry.abi.json create mode 100644 packages/generated/dev/abis/MockRiverRegistry.abi.ts create mode 100644 packages/generated/dev/abis/MockRiverRegistry.bin create mode 100644 packages/generated/dev/abis/MockRiverRegistry.json create mode 100644 packages/generated/dev/abis/MockRiverRegistry.metadata.json create mode 100644 packages/generated/dev/abis/NodeRegistry.abi.json create mode 100644 packages/generated/dev/abis/NodeRegistry.abi.ts create mode 100644 packages/generated/dev/abis/NodeRegistry.bin create mode 100644 packages/generated/dev/abis/NodeRegistry.json create mode 100644 packages/generated/dev/abis/NodeRegistry.metadata.json create mode 100644 packages/generated/dev/abis/OperatorRegistry.abi.json create mode 100644 packages/generated/dev/abis/OperatorRegistry.abi.ts create mode 100644 packages/generated/dev/abis/OperatorRegistry.bin create mode 100644 packages/generated/dev/abis/OperatorRegistry.json create mode 100644 packages/generated/dev/abis/OperatorRegistry.metadata.json create mode 100644 packages/generated/dev/abis/OwnableFacet.abi.json create mode 100644 packages/generated/dev/abis/OwnableFacet.abi.ts create mode 100644 packages/generated/dev/abis/OwnableFacet.bin create mode 100644 packages/generated/dev/abis/OwnableFacet.json create mode 100644 packages/generated/dev/abis/OwnableFacet.metadata.json create mode 100644 packages/generated/dev/abis/PrepayFacet.abi.json create mode 100644 packages/generated/dev/abis/PrepayFacet.abi.ts create mode 100644 packages/generated/dev/abis/PrepayFacet.bin create mode 100644 packages/generated/dev/abis/PrepayFacet.json create mode 100644 packages/generated/dev/abis/PrepayFacet.metadata.json create mode 100644 packages/generated/dev/abis/ProxyManager.abi.json create mode 100644 packages/generated/dev/abis/ProxyManager.abi.ts create mode 100644 packages/generated/dev/abis/ProxyManager.bin create mode 100644 packages/generated/dev/abis/ProxyManager.json create mode 100644 packages/generated/dev/abis/ProxyManager.metadata.json create mode 100644 packages/generated/dev/abis/Roles.abi.json create mode 100644 packages/generated/dev/abis/Roles.abi.ts create mode 100644 packages/generated/dev/abis/Roles.bin create mode 100644 packages/generated/dev/abis/Roles.json create mode 100644 packages/generated/dev/abis/Roles.metadata.json create mode 100644 packages/generated/dev/abis/SpaceOwner.abi.json create mode 100644 packages/generated/dev/abis/SpaceOwner.abi.ts create mode 100644 packages/generated/dev/abis/SpaceOwner.bin create mode 100644 packages/generated/dev/abis/SpaceOwner.json create mode 100644 packages/generated/dev/abis/SpaceOwner.metadata.json create mode 100644 packages/generated/dev/abis/StreamFlags.abi.json create mode 100644 packages/generated/dev/abis/StreamFlags.abi.ts create mode 100644 packages/generated/dev/abis/StreamFlags.bin create mode 100644 packages/generated/dev/abis/StreamFlags.json create mode 100644 packages/generated/dev/abis/StreamFlags.metadata.json create mode 100644 packages/generated/dev/abis/StreamRegistry.abi.json create mode 100644 packages/generated/dev/abis/StreamRegistry.abi.ts create mode 100644 packages/generated/dev/abis/StreamRegistry.bin create mode 100644 packages/generated/dev/abis/StreamRegistry.json create mode 100644 packages/generated/dev/abis/StreamRegistry.metadata.json create mode 100644 packages/generated/dev/abis/TokenPausableFacet.abi.json create mode 100644 packages/generated/dev/abis/TokenPausableFacet.abi.ts create mode 100644 packages/generated/dev/abis/TokenPausableFacet.bin create mode 100644 packages/generated/dev/abis/TokenPausableFacet.json create mode 100644 packages/generated/dev/abis/TokenPausableFacet.metadata.json create mode 100644 packages/generated/dev/abis/UserEntitlement.abi.json create mode 100644 packages/generated/dev/abis/UserEntitlement.abi.ts create mode 100644 packages/generated/dev/abis/UserEntitlement.bin create mode 100644 packages/generated/dev/abis/UserEntitlement.json create mode 100644 packages/generated/dev/abis/UserEntitlement.metadata.json create mode 100644 packages/generated/dev/abis/WalletLink.abi.json create mode 100644 packages/generated/dev/abis/WalletLink.abi.ts create mode 100644 packages/generated/dev/abis/WalletLink.bin create mode 100644 packages/generated/dev/abis/WalletLink.json create mode 100644 packages/generated/dev/abis/WalletLink.metadata.json create mode 100644 packages/generated/dev/typings/IArchitect.ts create mode 100644 packages/generated/dev/typings/IBanning.ts create mode 100644 packages/generated/dev/typings/IChannel.ts create mode 100644 packages/generated/dev/typings/ICustomEntitlement.ts create mode 100644 packages/generated/dev/typings/IDiamond.ts create mode 100644 packages/generated/dev/typings/IDiamondCut.ts create mode 100644 packages/generated/dev/typings/IERC721AQueryable.ts create mode 100644 packages/generated/dev/typings/IEntitlementsManager.ts create mode 100644 packages/generated/dev/typings/IMulticall.ts create mode 100644 packages/generated/dev/typings/INodeRegistry.ts create mode 100644 packages/generated/dev/typings/IOperatorRegistry.ts create mode 100644 packages/generated/dev/typings/IPausable.ts create mode 100644 packages/generated/dev/typings/IPricingModules.ts create mode 100644 packages/generated/dev/typings/IProxyManager.ts create mode 100644 packages/generated/dev/typings/IRoles.ts create mode 100644 packages/generated/dev/typings/IRuleEntitlement.ts create mode 100644 packages/generated/dev/typings/ISpaceOwner.ts create mode 100644 packages/generated/dev/typings/IStreamRegistry.ts create mode 100644 packages/generated/dev/typings/IWalletLink.ts create mode 100644 packages/generated/dev/typings/Member.ts create mode 100644 packages/generated/dev/typings/MembershipFacet.ts create mode 100644 packages/generated/dev/typings/MockERC721A.ts create mode 100644 packages/generated/dev/typings/MockEntitlementGated.ts create mode 100644 packages/generated/dev/typings/OwnableFacet.ts create mode 100644 packages/generated/dev/typings/PrepayFacet.ts create mode 100644 packages/generated/dev/typings/TokenPausableFacet.ts create mode 100644 packages/generated/dev/typings/UserEntitlement.ts create mode 100644 packages/generated/dev/typings/common.ts create mode 100644 packages/generated/dev/typings/factories/IArchitect__factory.ts create mode 100644 packages/generated/dev/typings/factories/IBanning__factory.ts create mode 100644 packages/generated/dev/typings/factories/IChannel__factory.ts create mode 100644 packages/generated/dev/typings/factories/ICustomEntitlement__factory.ts create mode 100644 packages/generated/dev/typings/factories/IDiamondCut__factory.ts create mode 100644 packages/generated/dev/typings/factories/IDiamond__factory.ts create mode 100644 packages/generated/dev/typings/factories/IERC721AQueryable__factory.ts create mode 100644 packages/generated/dev/typings/factories/IEntitlementsManager__factory.ts create mode 100644 packages/generated/dev/typings/factories/IMulticall__factory.ts create mode 100644 packages/generated/dev/typings/factories/INodeRegistry__factory.ts create mode 100644 packages/generated/dev/typings/factories/IOperatorRegistry__factory.ts create mode 100644 packages/generated/dev/typings/factories/IPausable__factory.ts create mode 100644 packages/generated/dev/typings/factories/IPricingModules__factory.ts create mode 100644 packages/generated/dev/typings/factories/IProxyManager__factory.ts create mode 100644 packages/generated/dev/typings/factories/IRoles__factory.ts create mode 100644 packages/generated/dev/typings/factories/IRuleEntitlement__factory.ts create mode 100644 packages/generated/dev/typings/factories/ISpaceOwner__factory.ts create mode 100644 packages/generated/dev/typings/factories/IStreamRegistry__factory.ts create mode 100644 packages/generated/dev/typings/factories/IWalletLink__factory.ts create mode 100644 packages/generated/dev/typings/factories/Member__factory.ts create mode 100644 packages/generated/dev/typings/factories/MembershipFacet__factory.ts create mode 100644 packages/generated/dev/typings/factories/MockERC721A__factory.ts create mode 100644 packages/generated/dev/typings/factories/MockEntitlementGated__factory.ts create mode 100644 packages/generated/dev/typings/factories/OwnableFacet__factory.ts create mode 100644 packages/generated/dev/typings/factories/PrepayFacet__factory.ts create mode 100644 packages/generated/dev/typings/factories/TokenPausableFacet__factory.ts create mode 100644 packages/generated/dev/typings/factories/UserEntitlement__factory.ts create mode 100644 packages/generated/dev/typings/factories/index.ts create mode 100644 packages/generated/dev/typings/index.ts create mode 100644 packages/generated/package.json create mode 100644 packages/generated/scripts/make-config.js create mode 100755 packages/generated/scripts/make-config.sh create mode 100644 packages/generated/v3/abis/Architect.abi.json create mode 100644 packages/generated/v3/abis/Architect.abi.ts create mode 100644 packages/generated/v3/abis/Architect.bin create mode 100644 packages/generated/v3/abis/Architect.json create mode 100644 packages/generated/v3/abis/Architect.metadata.json create mode 100644 packages/generated/v3/abis/Channels.abi.json create mode 100644 packages/generated/v3/abis/Channels.abi.ts create mode 100644 packages/generated/v3/abis/Channels.bin create mode 100644 packages/generated/v3/abis/Channels.json create mode 100644 packages/generated/v3/abis/Channels.metadata.json create mode 100644 packages/generated/v3/abis/Diamond.abi.json create mode 100644 packages/generated/v3/abis/Diamond.abi.ts create mode 100644 packages/generated/v3/abis/Diamond.bin create mode 100644 packages/generated/v3/abis/Diamond.json create mode 100644 packages/generated/v3/abis/Diamond.metadata.json create mode 100644 packages/generated/v3/abis/DiamondCutFacet.abi.json create mode 100644 packages/generated/v3/abis/DiamondCutFacet.abi.ts create mode 100644 packages/generated/v3/abis/DiamondCutFacet.bin create mode 100644 packages/generated/v3/abis/DiamondCutFacet.json create mode 100644 packages/generated/v3/abis/DiamondCutFacet.metadata.json create mode 100644 packages/generated/v3/abis/EntitlementsManager.abi.json create mode 100644 packages/generated/v3/abis/EntitlementsManager.abi.ts create mode 100644 packages/generated/v3/abis/EntitlementsManager.bin create mode 100644 packages/generated/v3/abis/EntitlementsManager.json create mode 100644 packages/generated/v3/abis/EntitlementsManager.metadata.json create mode 100644 packages/generated/v3/abis/IBanning.abi.json create mode 100644 packages/generated/v3/abis/IBanning.abi.ts create mode 100644 packages/generated/v3/abis/IBanning.bin create mode 100644 packages/generated/v3/abis/IBanning.json create mode 100644 packages/generated/v3/abis/IBanning.metadata.json create mode 100644 packages/generated/v3/abis/IBanningBase.abi.json create mode 100644 packages/generated/v3/abis/IBanningBase.abi.ts create mode 100644 packages/generated/v3/abis/IBanningBase.bin create mode 100644 packages/generated/v3/abis/IBanningBase.json create mode 100644 packages/generated/v3/abis/IBanningBase.metadata.json create mode 100644 packages/generated/v3/abis/ICustomEntitlement.abi.json create mode 100644 packages/generated/v3/abis/ICustomEntitlement.abi.ts create mode 100644 packages/generated/v3/abis/ICustomEntitlement.bin create mode 100644 packages/generated/v3/abis/ICustomEntitlement.json create mode 100644 packages/generated/v3/abis/ICustomEntitlement.metadata.json create mode 100644 packages/generated/v3/abis/IERC721AQueryable.abi.json create mode 100644 packages/generated/v3/abis/IERC721AQueryable.abi.ts create mode 100644 packages/generated/v3/abis/IERC721AQueryable.bin create mode 100644 packages/generated/v3/abis/IERC721AQueryable.json create mode 100644 packages/generated/v3/abis/IERC721AQueryable.metadata.json create mode 100644 packages/generated/v3/abis/IMulticall.abi.json create mode 100644 packages/generated/v3/abis/IMulticall.abi.ts create mode 100644 packages/generated/v3/abis/IMulticall.bin create mode 100644 packages/generated/v3/abis/IMulticall.json create mode 100644 packages/generated/v3/abis/IMulticall.metadata.json create mode 100644 packages/generated/v3/abis/IPausable.abi.json create mode 100644 packages/generated/v3/abis/IPausable.abi.ts create mode 100644 packages/generated/v3/abis/IPausable.bin create mode 100644 packages/generated/v3/abis/IPausable.json create mode 100644 packages/generated/v3/abis/IPausable.metadata.json create mode 100644 packages/generated/v3/abis/IPausableBase.abi.json create mode 100644 packages/generated/v3/abis/IPausableBase.abi.ts create mode 100644 packages/generated/v3/abis/IPausableBase.bin create mode 100644 packages/generated/v3/abis/IPausableBase.json create mode 100644 packages/generated/v3/abis/IPausableBase.metadata.json create mode 100644 packages/generated/v3/abis/IPricingModules.abi.json create mode 100644 packages/generated/v3/abis/IPricingModules.abi.ts create mode 100644 packages/generated/v3/abis/IPricingModules.bin create mode 100644 packages/generated/v3/abis/IPricingModules.json create mode 100644 packages/generated/v3/abis/IPricingModules.metadata.json create mode 100644 packages/generated/v3/abis/IPricingModulesBase.abi.json create mode 100644 packages/generated/v3/abis/IPricingModulesBase.abi.ts create mode 100644 packages/generated/v3/abis/IPricingModulesBase.bin create mode 100644 packages/generated/v3/abis/IPricingModulesBase.json create mode 100644 packages/generated/v3/abis/IPricingModulesBase.metadata.json create mode 100644 packages/generated/v3/abis/IRuleEntitlement.abi.json create mode 100644 packages/generated/v3/abis/IRuleEntitlement.abi.ts create mode 100644 packages/generated/v3/abis/IRuleEntitlement.bin create mode 100644 packages/generated/v3/abis/IRuleEntitlement.json create mode 100644 packages/generated/v3/abis/IRuleEntitlement.metadata.json create mode 100644 packages/generated/v3/abis/Member.abi.json create mode 100644 packages/generated/v3/abis/Member.abi.ts create mode 100644 packages/generated/v3/abis/Member.bin create mode 100644 packages/generated/v3/abis/Member.json create mode 100644 packages/generated/v3/abis/Member.metadata.json create mode 100644 packages/generated/v3/abis/MembershipFacet.abi.json create mode 100644 packages/generated/v3/abis/MembershipFacet.abi.ts create mode 100644 packages/generated/v3/abis/MembershipFacet.bin create mode 100644 packages/generated/v3/abis/MembershipFacet.json create mode 100644 packages/generated/v3/abis/MembershipFacet.metadata.json create mode 100644 packages/generated/v3/abis/MockCustomEntitlement.abi.json create mode 100644 packages/generated/v3/abis/MockCustomEntitlement.abi.ts create mode 100644 packages/generated/v3/abis/MockCustomEntitlement.bin create mode 100644 packages/generated/v3/abis/MockCustomEntitlement.json create mode 100644 packages/generated/v3/abis/MockCustomEntitlement.metadata.json create mode 100644 packages/generated/v3/abis/MockERC721A.abi.json create mode 100644 packages/generated/v3/abis/MockERC721A.abi.ts create mode 100644 packages/generated/v3/abis/MockERC721A.bin create mode 100644 packages/generated/v3/abis/MockERC721A.json create mode 100644 packages/generated/v3/abis/MockERC721A.metadata.json create mode 100644 packages/generated/v3/abis/MockEntitlementGated.abi.json create mode 100644 packages/generated/v3/abis/MockEntitlementGated.abi.ts create mode 100644 packages/generated/v3/abis/MockEntitlementGated.bin create mode 100644 packages/generated/v3/abis/MockEntitlementGated.json create mode 100644 packages/generated/v3/abis/MockEntitlementGated.metadata.json create mode 100644 packages/generated/v3/abis/MockRiverRegistry.abi.json create mode 100644 packages/generated/v3/abis/MockRiverRegistry.abi.ts create mode 100644 packages/generated/v3/abis/MockRiverRegistry.bin create mode 100644 packages/generated/v3/abis/MockRiverRegistry.json create mode 100644 packages/generated/v3/abis/MockRiverRegistry.metadata.json create mode 100644 packages/generated/v3/abis/NodeRegistry.abi.json create mode 100644 packages/generated/v3/abis/NodeRegistry.abi.ts create mode 100644 packages/generated/v3/abis/NodeRegistry.bin create mode 100644 packages/generated/v3/abis/NodeRegistry.json create mode 100644 packages/generated/v3/abis/NodeRegistry.metadata.json create mode 100644 packages/generated/v3/abis/OperatorRegistry.abi.json create mode 100644 packages/generated/v3/abis/OperatorRegistry.abi.ts create mode 100644 packages/generated/v3/abis/OperatorRegistry.bin create mode 100644 packages/generated/v3/abis/OperatorRegistry.json create mode 100644 packages/generated/v3/abis/OperatorRegistry.metadata.json create mode 100644 packages/generated/v3/abis/OwnableFacet.abi.json create mode 100644 packages/generated/v3/abis/OwnableFacet.abi.ts create mode 100644 packages/generated/v3/abis/OwnableFacet.bin create mode 100644 packages/generated/v3/abis/OwnableFacet.json create mode 100644 packages/generated/v3/abis/OwnableFacet.metadata.json create mode 100644 packages/generated/v3/abis/PrepayFacet.abi.json create mode 100644 packages/generated/v3/abis/PrepayFacet.abi.ts create mode 100644 packages/generated/v3/abis/PrepayFacet.bin create mode 100644 packages/generated/v3/abis/PrepayFacet.json create mode 100644 packages/generated/v3/abis/PrepayFacet.metadata.json create mode 100644 packages/generated/v3/abis/ProxyManager.abi.json create mode 100644 packages/generated/v3/abis/ProxyManager.abi.ts create mode 100644 packages/generated/v3/abis/ProxyManager.bin create mode 100644 packages/generated/v3/abis/ProxyManager.json create mode 100644 packages/generated/v3/abis/ProxyManager.metadata.json create mode 100644 packages/generated/v3/abis/Roles.abi.json create mode 100644 packages/generated/v3/abis/Roles.abi.ts create mode 100644 packages/generated/v3/abis/Roles.bin create mode 100644 packages/generated/v3/abis/Roles.json create mode 100644 packages/generated/v3/abis/Roles.metadata.json create mode 100644 packages/generated/v3/abis/SpaceOwner.abi.json create mode 100644 packages/generated/v3/abis/SpaceOwner.abi.ts create mode 100644 packages/generated/v3/abis/SpaceOwner.bin create mode 100644 packages/generated/v3/abis/SpaceOwner.json create mode 100644 packages/generated/v3/abis/SpaceOwner.metadata.json create mode 100644 packages/generated/v3/abis/StreamFlags.abi.json create mode 100644 packages/generated/v3/abis/StreamFlags.abi.ts create mode 100644 packages/generated/v3/abis/StreamFlags.bin create mode 100644 packages/generated/v3/abis/StreamFlags.json create mode 100644 packages/generated/v3/abis/StreamFlags.metadata.json create mode 100644 packages/generated/v3/abis/StreamRegistry.abi.json create mode 100644 packages/generated/v3/abis/StreamRegistry.abi.ts create mode 100644 packages/generated/v3/abis/StreamRegistry.bin create mode 100644 packages/generated/v3/abis/StreamRegistry.json create mode 100644 packages/generated/v3/abis/StreamRegistry.metadata.json create mode 100644 packages/generated/v3/abis/TokenPausableFacet.abi.json create mode 100644 packages/generated/v3/abis/TokenPausableFacet.abi.ts create mode 100644 packages/generated/v3/abis/TokenPausableFacet.bin create mode 100644 packages/generated/v3/abis/TokenPausableFacet.json create mode 100644 packages/generated/v3/abis/TokenPausableFacet.metadata.json create mode 100644 packages/generated/v3/abis/UserEntitlement.abi.json create mode 100644 packages/generated/v3/abis/UserEntitlement.abi.ts create mode 100644 packages/generated/v3/abis/UserEntitlement.bin create mode 100644 packages/generated/v3/abis/UserEntitlement.json create mode 100644 packages/generated/v3/abis/UserEntitlement.metadata.json create mode 100644 packages/generated/v3/abis/WalletLink.abi.json create mode 100644 packages/generated/v3/abis/WalletLink.abi.ts create mode 100644 packages/generated/v3/abis/WalletLink.bin create mode 100644 packages/generated/v3/abis/WalletLink.json create mode 100644 packages/generated/v3/abis/WalletLink.metadata.json create mode 100644 packages/generated/v3/typings/IArchitect.ts create mode 100644 packages/generated/v3/typings/IBanning.ts create mode 100644 packages/generated/v3/typings/IChannel.ts create mode 100644 packages/generated/v3/typings/ICustomEntitlement.ts create mode 100644 packages/generated/v3/typings/IDiamond.ts create mode 100644 packages/generated/v3/typings/IDiamondCut.ts create mode 100644 packages/generated/v3/typings/IERC721AQueryable.ts create mode 100644 packages/generated/v3/typings/IEntitlementsManager.ts create mode 100644 packages/generated/v3/typings/IMulticall.ts create mode 100644 packages/generated/v3/typings/INodeRegistry.ts create mode 100644 packages/generated/v3/typings/IOperatorRegistry.ts create mode 100644 packages/generated/v3/typings/IPausable.ts create mode 100644 packages/generated/v3/typings/IPricingModules.ts create mode 100644 packages/generated/v3/typings/IProxyManager.ts create mode 100644 packages/generated/v3/typings/IRoles.ts create mode 100644 packages/generated/v3/typings/IRuleEntitlement.ts create mode 100644 packages/generated/v3/typings/ISpaceOwner.ts create mode 100644 packages/generated/v3/typings/IStreamRegistry.ts create mode 100644 packages/generated/v3/typings/IWalletLink.ts create mode 100644 packages/generated/v3/typings/Member.ts create mode 100644 packages/generated/v3/typings/MembershipFacet.ts create mode 100644 packages/generated/v3/typings/MockERC721A.ts create mode 100644 packages/generated/v3/typings/MockEntitlementGated.ts create mode 100644 packages/generated/v3/typings/OwnableFacet.ts create mode 100644 packages/generated/v3/typings/PrepayFacet.ts create mode 100644 packages/generated/v3/typings/TokenPausableFacet.ts create mode 100644 packages/generated/v3/typings/UserEntitlement.ts create mode 100644 packages/generated/v3/typings/common.ts create mode 100644 packages/generated/v3/typings/factories/IArchitect__factory.ts create mode 100644 packages/generated/v3/typings/factories/IBanning__factory.ts create mode 100644 packages/generated/v3/typings/factories/IChannel__factory.ts create mode 100644 packages/generated/v3/typings/factories/ICustomEntitlement__factory.ts create mode 100644 packages/generated/v3/typings/factories/IDiamondCut__factory.ts create mode 100644 packages/generated/v3/typings/factories/IDiamond__factory.ts create mode 100644 packages/generated/v3/typings/factories/IERC721AQueryable__factory.ts create mode 100644 packages/generated/v3/typings/factories/IEntitlementsManager__factory.ts create mode 100644 packages/generated/v3/typings/factories/IMulticall__factory.ts create mode 100644 packages/generated/v3/typings/factories/INodeRegistry__factory.ts create mode 100644 packages/generated/v3/typings/factories/IOperatorRegistry__factory.ts create mode 100644 packages/generated/v3/typings/factories/IPausable__factory.ts create mode 100644 packages/generated/v3/typings/factories/IPricingModules__factory.ts create mode 100644 packages/generated/v3/typings/factories/IProxyManager__factory.ts create mode 100644 packages/generated/v3/typings/factories/IRoles__factory.ts create mode 100644 packages/generated/v3/typings/factories/IRuleEntitlement__factory.ts create mode 100644 packages/generated/v3/typings/factories/ISpaceOwner__factory.ts create mode 100644 packages/generated/v3/typings/factories/IStreamRegistry__factory.ts create mode 100644 packages/generated/v3/typings/factories/IWalletLink__factory.ts create mode 100644 packages/generated/v3/typings/factories/Member__factory.ts create mode 100644 packages/generated/v3/typings/factories/MembershipFacet__factory.ts create mode 100644 packages/generated/v3/typings/factories/MockERC721A__factory.ts create mode 100644 packages/generated/v3/typings/factories/MockEntitlementGated__factory.ts create mode 100644 packages/generated/v3/typings/factories/OwnableFacet__factory.ts create mode 100644 packages/generated/v3/typings/factories/PrepayFacet__factory.ts create mode 100644 packages/generated/v3/typings/factories/TokenPausableFacet__factory.ts create mode 100644 packages/generated/v3/typings/factories/UserEntitlement__factory.ts create mode 100644 packages/generated/v3/typings/factories/index.ts create mode 100644 packages/generated/v3/typings/index.ts create mode 100644 packages/prettier-config/README.md create mode 100644 packages/prettier-config/config.js create mode 100644 packages/prettier-config/package.json create mode 100644 packages/stress-testing/.dockerignore create mode 100644 packages/stress-testing/.env.example create mode 100644 packages/stress-testing/.env.example.gamma create mode 100644 packages/stress-testing/Dockerfile create mode 100644 packages/stress-testing/README.md create mode 100644 packages/stress-testing/docker-compose.yml create mode 100755 packages/stress-testing/scripts/start-node.sh create mode 100644 remappings.txt create mode 100644 scripts/Makefile create mode 100755 scripts/bc-all-start.sh create mode 100755 scripts/bc-all-stop.sh create mode 100755 scripts/build-artifacts.sh create mode 100755 scripts/build-contract-coverage.sh create mode 100755 scripts/build-contract-types.sh create mode 100755 scripts/build-contracts.sh create mode 100755 scripts/build-protobufs.sh create mode 100755 scripts/check-go-version.sh create mode 100755 scripts/check-node-version.sh create mode 100755 scripts/configure-nodes.sh create mode 100644 scripts/copyLibs.js create mode 100755 scripts/deploy-contracts.sh create mode 100755 scripts/foundry-up.sh create mode 100644 scripts/gen-bindings-remove-struct.go create mode 100755 scripts/gen-river-node-bindings.sh create mode 100755 scripts/gen-xchain-bindings.sh create mode 100755 scripts/install-deps.sh create mode 100755 scripts/install-protobuf-deps.sh create mode 100755 scripts/kill-all-local-dev.sh create mode 100755 scripts/kill-on-port.sh create mode 100755 scripts/kill_dev.sh create mode 100755 scripts/lint-shell-scripts.sh create mode 100644 scripts/node-no-warn.js create mode 100644 scripts/node-registration-lib.sh create mode 100755 scripts/print-versions.sh create mode 100755 scripts/start-load-testing-redis.sh create mode 100755 scripts/start-local-basechain.sh create mode 100755 scripts/start-local-blockscout.sh create mode 100755 scripts/start-local-riverchain.sh create mode 100755 scripts/start_dev.sh create mode 100755 scripts/wait-for-basechain.sh create mode 100755 scripts/wait-for-core.sh create mode 100755 scripts/wait-for-port.sh create mode 100755 scripts/wait-for-riverchain.sh create mode 100755 scripts/yarn-clean.sh create mode 100644 turbo.json create mode 100644 yarn.lock diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..5b24bbf8e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true + +[*.{js,json,yml}] +charset = utf-8 +indent_style = space +indent_size = 2 diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..fcba0f2b3 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,15 @@ +dev-dist +dist +node_modules +docs +storybook-static + +servers/ +contracts/lib/ + +infra/ + +vite.config.ts + +.yarn/* +yarn.lock \ No newline at end of file diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 000000000..b8c7b1fda --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1 @@ +849aff8b3da071a1bd3afbea6be9868827bb0c6f \ No newline at end of file diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..f3f2e9617 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,33 @@ +# https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners +## +## "Code Owners" is an unfortunate name, as we do not encourage "ownership" +## of code per se. +## +## Please add your name here if you would like to be notified any time +## a change is made in a particular file or folder. +## +## We do this to help individuals keep their mental model of the codebase +## up to date, and to make sure everyone who wants to be part of the conversation +## is automagically added to the it. +## +## We do not do this to create dictators, benevolent or otherwise. +## +## IMPORTANT - If you add yourself as a code owner, please take it upon yourself +## to review code at minimum, at the beginning, and end, of each work day. +## Please either comment, approve, request changes, or remove yourself as a reviewer. +## The SLA on reviews is 24 hours. After 24 hours a PR without comments will be +## considered defacto approved and can be committed. However feedback can come +## at any time! We are an asynchronous team of imperfect humans. If anyone, code +## owner or otherwise, comments on your code at any time, please assume the best +## intentions and respond with care and consideration. +## +## To see reviews that are waiting for your attention, +## please visit: https://github.com/HereNotThere/harmony/pulls?q=is%3Apr+is%3Aopen+user-review-requested%3A%40me +## + +/core/ @sergekh2 +/.github/ @mechanical-turk +/infra @mechanical-turk +turbo.json @mechanical-turk +/contracts/src/node-network @mechanical-turk +/core/sdk/src/stream* @erikolsson diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..92e1ce540 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: 'npm' # See documentation for possible values + directory: '/' # Location of package manifests + schedule: + interval: 'weekly' diff --git a/.github/workflows/River_node_docker.yml b/.github/workflows/River_node_docker.yml new file mode 100644 index 000000000..2defd9a57 --- /dev/null +++ b/.github/workflows/River_node_docker.yml @@ -0,0 +1,119 @@ +# Based on https://github.com/docker/build-push-action + +name: 'Build River Docker Image' + +on: + push: + branches: + - main + + workflow_dispatch: # A build was manually requested + inputs: + release_version: + description: 'The release version to use for the image (optional)' + required: false # This is no longer required, so that we can promote existing images to `mainnet`, `testnet`, `stable` etc. + additional_tags_csv: + description: 'Comma separated list of tags to apply to the image (optional)' + required: false + +env: + DOCKER_NAMESPACE: herenotthere + GHCR_NAMESPACE: herenotthere + PLATFORMS: linux/amd64,linux/arm64 + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL || secrets.SLACK_CD_WORKFLOW_WEBHOOK_URL }} + +jobs: + build: + name: Build docker image + + runs-on: ubuntu-latest-8-cores + + permissions: + contents: write + packages: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup AWS Credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: us-east-1 + + - name: Login to Amazon ECR + id: login-aws-ecr + uses: aws-actions/amazon-ecr-login@v2 + with: + registry-type: 'public' + + - name: Build and push image to Amazon ECR + env: + ECR_REGISTRY: ${{ steps.login-aws-ecr.outputs.registry }} + #This can be custom alias once requested to aws and approved for public repo + REGISTRY_ALIAS: h5v6m2x1 + ECR_REPOSITORY: river + RELEASE_VERSION: ${{ inputs.release_version }} + ADDITIONAL_TAGS: ${{ inputs.additional_tags_csv }} + working-directory: ./core + run: | + COMMIT_HASH=$(git describe --tags --always --dirty) + BRANCH=$(git rev-parse --abbrev-ref HEAD) + TAGS=($COMMIT_HASH) + + # if release version is not provided, we set it to "unset" + if [ -z "$RELEASE_VERSION" ]; then + RELEASE_VERSION="unset" + else + # If this is a release, we also tag the image with the release version. + TAGS+=($RELEASE_VERSION) + fi + + # If this is a push to main, we also tag the image as dev, + # But RELEASE_VERSION remains untouched, as `dev` is not a version, but just a tag. + if [ "$BRANCH" == "main" ] && [ "${{ github.event_name }}" == "push" ]; then + TAGS+=(dev) + fi + + # Add additional tags if provided + if [ -n "$ADDITIONAL_TAGS" ]; then + IFS=',' read -ra ADDITIONAL_TAGS_ARRAY <<< "$ADDITIONAL_TAGS" + for tag in "${ADDITIONAL_TAGS_ARRAY[@]}"; do + TAGS+=($tag) + done + fi + + echo "Building image with the following tags: ${TAGS[@]}" + echo "Commit hash: $COMMIT_HASH" + echo "Branch: $BRANCH" + echo "Release version: $RELEASE_VERSION" + + docker build \ + --build-arg GIT_SHA=${{ github.sha }} \ + --build-arg VER_VERSION=$RELEASE_VERSION \ + --build-arg VER_BRANCH=$BRANCH \ + --build-arg VER_COMMIT=$COMMIT_HASH \ + -t river:local-latest \ + . + + for tag in "${TAGS[@]}"; do + docker tag river:local-latest $ECR_REGISTRY/$REGISTRY_ALIAS/$ECR_REPOSITORY:$tag + docker push $ECR_REGISTRY/$REGISTRY_ALIAS/$ECR_REPOSITORY:$tag + done + + # If action failed, we send a slack notification + - name: Slack notification + if: failure() + uses: slackapi/slack-github-action@v1.24.0 + with: + payload: | + { + "step": "Build River Docker Image", + "environment": "N/", + "branch": "${{ github.ref }}", + "url": "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}", + "commit": "${{ github.sha }}", + "actor": "${{ github.actor }}" + } \ No newline at end of file diff --git a/.github/workflows/Stress_test_node_docker.yml b/.github/workflows/Stress_test_node_docker.yml new file mode 100644 index 000000000..46a141705 --- /dev/null +++ b/.github/workflows/Stress_test_node_docker.yml @@ -0,0 +1,67 @@ +# Based on https://github.com/docker/build-push-action + +name: 'Build River Stress Test Node Docker Image' + +on: + push: + branches: + - main + paths: + - 'packages/stress-testing/**' + - 'core/**' + workflow_dispatch: + +env: + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CD_WORKFLOW_WEBHOOK_URL }} + +jobs: + build: + name: Build docker image + + runs-on: ubuntu-latest-8-cores + + permissions: + contents: write + packages: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup AWS Credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: us-east-1 + + - name: Login to Amazon ECR + id: login-aws-ecr + uses: aws-actions/amazon-ecr-login@v2 + with: + registry-type: 'public' + + - name: Build and push docker image to Amazon ECR + env: + ECR_REGISTRY: ${{ steps.login-aws-ecr.outputs.registry }} + #This can be custom alias once requested to aws and approved for public repo + REGISTRY_ALIAS: h5v6m2x1 + ECR_REPOSITORY: river-stress-test-node + run: | + docker build -t $ECR_REGISTRY/$REGISTRY_ALIAS/$ECR_REPOSITORY:latest . -f ./packages/stress-testing/Dockerfile + docker push $ECR_REGISTRY/$REGISTRY_ALIAS/$ECR_REPOSITORY:latest + + # If action failed, we send a slack notification + - name: Slack notification + if: failure() + uses: slackapi/slack-github-action@v1.24.0 + with: + payload: | + { + "step": "Build Stress Test Node Docker Image", + "environment": "N/", + "branch": "${{ github.ref }}", + "url": "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}", + "commit": "${{ github.sha }}", + "actor": "${{ github.actor }}" + } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..088759fa5 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,958 @@ +name: Continuous Integration +env: + FOUNDRY_VERSION: nightly + RIVER_BLOCK_TIME: 1 +on: + schedule: + # Run every hour + - cron: '0 * * * *' + pull_request: + workflow_dispatch: # Allow manual trigger in GitHub UI + inputs: + skip_common_ci: + description: Skip Common CI checks (i.e linting, prettier, etc) + required: false + default: false + type: boolean + skip_client_noentitlements: + description: Skip Client Tests without entitlements + required: false + default: false + type: boolean + skip_multinode: + description: Skip Multi-node Tests + required: false + default: false + type: boolean + skip_client_entitlements: + description: Skip Client Tests with entitlements + required: false + default: false + type: boolean + skip_multinode_ent: + description: Skip Multi-node Ent Tests + required: false + default: false + type: boolean + skip_node: + description: Skip Node Tests + required: false + default: false + type: boolean + skip_xchain_node: + description: Skip XChain Node Tests + required: false + default: false + type: boolean + +jobs: + Common_CI: + permissions: write-all + if: github.event_name != 'workflow_dispatch' || !inputs.skip_common_ci + runs-on: ubuntu-latest-8-cores + timeout-minutes: 30 + + steps: + - name: Print bash environment + run: env + + - name: Cancel previous runs + if: github.event_name != 'schedule' + uses: styfle/cancel-workflow-action@0.12.1 + with: + access_token: ${{ github.token }} + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version-file: 'go.work' + cache-dependency-path: '**/*.sum' + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: ${{ env.FOUNDRY_VERSION }} + + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'yarn' + - name: Install node dependencies + run: yarn install --immutable + + - name: Print versions + run: ./scripts/print-versions.sh + + # Start an ssh session with tmate if the PR has the 'ssh' label + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 + if: contains(github.event.pull_request.labels.*.name, 'ssh') + + - name: Start and configure blockchains + run: ./scripts/bc-all-start.sh + + - name: Maintain Turbo cache + uses: actions/cache@v4 + with: + path: node_modules/.cache/turbo + key: ${{ runner.os }}-turbo-${{ github.run_id }} + restore-keys: | + ${{ runner.os }}-turbo- + + - name: Syncpack + run: yarn syncpack:check + + - name: Build + run: yarn build + + - name: Prettier + run: yarn prettier:check + + - name: Lint + run: yarn lint + + - name: Linting River Node + uses: golangci/golangci-lint-action@v3 + with: + version: latest + working-directory: core/node + skip-pkg-cache: true + args: --timeout=10m + + - name: Linting River Node W/ Custom Rules + run: | + cd core/node + ./lint_extensions.sh > river_lint_extensions.txt + if [ -s river_lint_extensions.txt ]; then + echo "Linter found issues:" + cat river_lint_extensions.txt + exit 1 + fi + + - name: Staticcheck River Node + uses: dominikh/staticcheck-action@v1 + with: + version: latest + working-directory: core/node + install-go: false + + # - name: Terraform Lint + # run: make lint + # working-directory: ./infra + + - name: Build town types + run: ./scripts/build-contract-types.sh localhost --frozen + + - name: Unit Tests + run: yarn test:unit + + Client_NoEntitlements: + permissions: write-all + if: github.event_name != 'workflow_dispatch' || !inputs.skip_client_noentitlements + runs-on: ubuntu-latest-8-cores + timeout-minutes: 30 + services: + postgres-core: + image: postgres:latest + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + ports: + # Maps tcp port 5433 on service container to the host + - 5433:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + --name river_postgres_container + + steps: + - name: Cancel previous runs + if: github.event_name != 'schedule' + uses: styfle/cancel-workflow-action@0.12.1 + with: + access_token: ${{ github.token }} + + - name: Show PostgreSQL max_connections + run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;' + env: + POSTGRES_PASSWORD: postgres + PGPASSWORD: postgres + + - name: Increase max_connections in Postgres + run: | + docker exec -i river_postgres_container bash << EOF + echo 'max_connections = 1000' >> /var/lib/postgresql/data/postgresql.conf + echo 'shared_buffers = 2GB' >> /var/lib/postgresql/data/postgresql.conf + EOF + docker restart --time 0 river_postgres_container + sleep 5 + + - name: Show PostgreSQL max_connections + run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;' + env: + POSTGRES_PASSWORD: postgres + PGPASSWORD: postgres + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Git submodules + run: git submodule update --init --recursive + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version-file: 'go.work' + cache-dependency-path: '**/*.sum' + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: ${{ env.FOUNDRY_VERSION }} + + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'yarn' + + - name: Install node dependencies + run: yarn install --immutable + + - name: Print versions + run: ./scripts/print-versions.sh + + # Start an ssh session with tmate if the PR has the 'ssh' label + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 + if: contains(github.event.pull_request.labels.*.name, 'ssh') + + - name: Start and configure blockchains + run: ./scripts/bc-all-start.sh + + - name: Print Yarn package versions + run: yarn info --name-only --all + + - name: Maintain Turbo cache + uses: actions/cache@v4 + with: + path: node_modules/.cache/turbo + key: ${{ runner.os }}-turbo-${{ github.run_id }} + restore-keys: | + ${{ runner.os }}-turbo- + + - name: create db + run: psql -h localhost -p 5433 -U postgres -f scripts/sql/create_db.sql + working-directory: core + env: + POSTGRES_PASSWORD: postgres + PGPASSWORD: postgres + + - name: Setup River CA for testing certificates + run: ./scripts/register-ca.sh + working-directory: core + + - name: Check SSL directories and environment variables + run: | + echo "Listing /etc/ssl/certs..." + ls -l /etc/ssl/certs || echo "/etc/ssl/certs not found" + + echo "Listing /system/etc/security/cacerts..." + ls -l /system/etc/security/cacerts || echo "/system/etc/security/cacerts not found" + + echo "Checking SSL_CERT_FILE environment variable..." + echo "SSL_CERT_FILE=$SSL_CERT_FILE" + + echo "Checking SSL_CERT_DIR environment variable..." + echo "SSL_CERT_DIR=$SSL_CERT_DIR" + + - name: Run node (without entitlements) + run: ./core/node/run_single.sh --de & + + - name: Wait for (without entitlements) node to be up + run: yarn csb:wait:no-entitlements + + - name: Run SDK Tests (without entitlements) + run: yarn run turbo run build test:ci --filter=@river/sdk + + - name: Run Node Restart Tests (without entitlements) + run: yarn workspace @river/sdk run test:restart + + - name: Run Node Flush Tests (without entitlements) + run: yarn workspace @river/sdk run test:node-minipool-flush + + - name: Archive River Node Logs and Settings + if: always() + uses: actions/upload-artifact@v4 + with: + name: 'river-node-${{ github.job }}' + path: | + ./core/node/run_files/ + !./core/node/run_files/**/bin/** + + Multinode: + permissions: write-all + if: github.event_name != 'workflow_dispatch' || !inputs.skip_multinode + runs-on: ubuntu-latest-8-cores + timeout-minutes: 30 + services: + postgres-core: + image: postgres:latest + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + ports: + # Maps tcp port 5433 on service container to the host + - 5433:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + --name river_postgres_container + + steps: + - name: Cancel previous runs + if: github.event_name != 'schedule' + uses: styfle/cancel-workflow-action@0.12.1 + with: + access_token: ${{ github.token }} + + - name: Show PostgreSQL max_connections + run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;' + env: + POSTGRES_PASSWORD: postgres + PGPASSWORD: postgres + + - name: Increase max_connections in Postgres + run: | + docker exec -i river_postgres_container bash << EOF + echo 'max_connections = 1000' >> /var/lib/postgresql/data/postgresql.conf + echo 'shared_buffers = 2GB' >> /var/lib/postgresql/data/postgresql.conf + EOF + docker restart --time 0 river_postgres_container + sleep 5 + + - name: Show PostgreSQL max_connections + run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;' + env: + POSTGRES_PASSWORD: postgres + PGPASSWORD: postgres + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Git submodules + run: git submodule update --init --recursive + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version-file: 'go.work' + cache-dependency-path: '**/*.sum' + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: ${{ env.FOUNDRY_VERSION }} + + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'yarn' + + - name: Install node dependencies + run: yarn install --immutable + + - name: Print versions + run: ./scripts/print-versions.sh + + # Start an ssh session with tmate if the PR has the 'ssh' label + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 + if: contains(github.event.pull_request.labels.*.name, 'ssh') + + - name: Start and configure blockchains + run: ./scripts/bc-all-start.sh + + - name: Print Yarn package versions + run: yarn info --name-only --all + + - name: Maintain Turbo cache + uses: actions/cache@v4 + with: + path: node_modules/.cache/turbo + key: ${{ runner.os }}-turbo-${{ github.run_id }} + restore-keys: | + ${{ runner.os }}-turbo- + + - name: create db + run: psql -h localhost -p 5433 -U postgres -f scripts/sql/create_db.sql + working-directory: core + env: + POSTGRES_PASSWORD: postgres + PGPASSWORD: postgres + + - name: Setup River CA for testing certificates + run: ./scripts/register-ca.sh + working-directory: core + + - name: Set up Custom CA Certificate for Node.js + run: | + echo "NODE_EXTRA_CA_CERTS=$HOME/river-ca-cert.pem" >> $GITHUB_ENV + + - name: Run multiple nodes + run: | + cd ./core/node + ./run_multi.sh --de -c + ./run_multi.sh --de -r & + for i in {5180..5189}; do yarn wait-on https://localhost:$i/debug/multi --timeout=900000 --i=5000 --verbose; done + + - name: Run SDK Tests (without entitlements) + run: | + yarn run turbo run build + cd core/sdk + yarn test:ci:multi:ne + + - name: Archive River Node Logs and Settings + if: always() + uses: actions/upload-artifact@v4 + with: + name: 'river-node-${{ github.job }}' + path: | + ./core/node/run_files/ + !./core/node/run_files/**/bin/** + + Client_Entitlements: + permissions: write-all + if: github.event_name != 'workflow_dispatch' || !inputs.skip_client_entitlements + runs-on: ubuntu-latest-8-cores + timeout-minutes: 30 + services: + postgres-core: + image: postgres:latest + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + ports: + # Maps tcp port 5433 on service container to the host + - 5433:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + --name river_postgres_container + + steps: + - name: Cancel previous runs + if: github.event_name != 'schedule' + uses: styfle/cancel-workflow-action@0.12.1 + with: + access_token: ${{ github.token }} + + - name: Show PostgreSQL max_connections + run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;' + env: + POSTGRES_PASSWORD: postgres + PGPASSWORD: postgres + + - name: Increase max_connections in Postgres + run: | + docker exec -i river_postgres_container bash << EOF + echo 'max_connections = 1000' >> /var/lib/postgresql/data/postgresql.conf + echo 'shared_buffers = 2GB' >> /var/lib/postgresql/data/postgresql.conf + EOF + docker restart --time 0 river_postgres_container + sleep 5 + + - name: Show PostgreSQL max_connections + run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;' + env: + POSTGRES_PASSWORD: postgres + PGPASSWORD: postgres + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Git submodules + run: git submodule update --init --recursive + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version-file: 'go.work' + cache-dependency-path: '**/*.sum' + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: ${{ env.FOUNDRY_VERSION }} + + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'yarn' + + - name: Install node dependencies + run: yarn install --immutable + + - name: Print versions + run: ./scripts/print-versions.sh + + # Start an ssh session with tmate if the PR has the 'ssh' label + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 + if: contains(github.event.pull_request.labels.*.name, 'ssh') + + - name: Start and configure blockchains + run: ./scripts/bc-all-start.sh + + - name: Print Yarn package versions + run: yarn info --name-only --all + + - name: Maintain Turbo cache + uses: actions/cache@v4 + with: + path: node_modules/.cache/turbo + key: ${{ runner.os }}-turbo-${{ github.run_id }} + restore-keys: | + ${{ runner.os }}-turbo- + + - name: create db + run: psql -h localhost -p 5433 -U postgres -f scripts/sql/create_db.sql + working-directory: core + env: + POSTGRES_PASSWORD: postgres + PGPASSWORD: postgres + + - name: Setup River CA for testing certificates + run: ./scripts/register-ca.sh + working-directory: core + + - name: Start node with entitlements + run: ./core/node/run_single.sh & + + - name: Wait for (with entitlements) node to be up + run: yarn csb:wait:entitlements + + - name: Start xchain node with entitlements + run: (RUN_ENV=single ./core/xchain/launch_multi.sh &) && sleep 10 + + - name: Build & Test (with entitlements) + run: yarn csb:turbo-no-sdk + + - name: Run River Tests (with entitlements) + run: yarn workspace @river/sdk run test:ci:with-entitlements + + - name: Archive River Node Logs and Settings + if: always() + uses: actions/upload-artifact@v4 + with: + name: 'river-node-${{ github.job }}' + path: | + ./core/node/run_files/ + !./core/node/run_files/**/bin/** + + Multinode_Ent: + permissions: write-all + if: github.event_name != 'workflow_dispatch' || !inputs.skip_multinode_ent + runs-on: ubuntu-latest-8-cores + timeout-minutes: 30 + services: + postgres-core: + image: postgres:latest + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + ports: + # Maps tcp port 5433 on service container to the host + - 5433:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + --name river_postgres_container + + steps: + - name: Cancel previous runs + if: github.event_name != 'schedule' + uses: styfle/cancel-workflow-action@0.12.1 + with: + access_token: ${{ github.token }} + + - name: Show PostgreSQL max_connections + run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;' + env: + POSTGRES_PASSWORD: postgres + PGPASSWORD: postgres + + - name: Increase max_connections in Postgres + run: | + docker exec -i river_postgres_container bash << EOF + echo 'max_connections = 1000' >> /var/lib/postgresql/data/postgresql.conf + echo 'shared_buffers = 2GB' >> /var/lib/postgresql/data/postgresql.conf + EOF + docker restart --time 0 river_postgres_container + sleep 5 + + - name: Show PostgreSQL max_connections + run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;' + env: + POSTGRES_PASSWORD: postgres + PGPASSWORD: postgres + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Git submodules + run: git submodule update --init --recursive + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version-file: 'go.work' + cache-dependency-path: '**/*.sum' + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: ${{ env.FOUNDRY_VERSION }} + + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'yarn' + + - name: Install node dependencies + run: yarn install --immutable + + - name: Print versions + run: ./scripts/print-versions.sh + + # Start an ssh session with tmate if the PR has the 'ssh' label + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 + if: contains(github.event.pull_request.labels.*.name, 'ssh') + + - name: Start and configure blockchains + run: ./scripts/bc-all-start.sh + + - name: Print Yarn package versions + run: yarn info --name-only --all + + - name: Maintain Turbo cache + uses: actions/cache@v4 + with: + path: node_modules/.cache/turbo + key: ${{ runner.os }}-turbo-${{ github.run_id }} + restore-keys: | + ${{ runner.os }}-turbo- + + - name: create db + run: psql -h localhost -p 5433 -U postgres -f scripts/sql/create_db.sql + working-directory: core + env: + POSTGRES_PASSWORD: postgres + PGPASSWORD: postgres + + + - name: Setup River CA for testing certificates + run: ./scripts/register-ca.sh + working-directory: core + + - name: Set up Custom CA Certificate for Node.js + run: | + echo "NODE_EXTRA_CA_CERTS=$HOME/river-ca-cert.pem" >> $GITHUB_ENV + + - name: Run multiple nodes + run: | + cd ./core/node + ./run_multi.sh -c + ./run_multi.sh -r & + for i in {5170..5179}; do yarn wait-on https://localhost:$i/debug/multi --timeout=900000 --i=5000 --verbose; done + + - name: Start xchain node with entitlements + run: (RUN_ENV=multi ./core/xchain/launch_multi.sh &) && sleep 10 + + - name: Build & Test (with entitlements) + run: yarn csb:turbo-no-sdk + + - name: Run River Tests (with entitlements) + run: yarn workspace @river/sdk run test:ci:multi:ent + + - name: Archive River Node Logs and Settings + if: always() + uses: actions/upload-artifact@v4 + with: + name: 'river-node-${{ github.job }}' + path: | + ./core/node/run_files/ + !./core/node/run_files/**/bin/** + + Node: + permissions: write-all + if: github.event_name != 'workflow_dispatch' || !inputs.skip_node + runs-on: ubuntu-latest-8-cores + timeout-minutes: 30 + services: + postgres-core: + image: postgres:latest + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + ports: + # Maps tcp port 5433 on service container to the host + - 5433:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + --name river_postgres_container + + steps: + - name: Cancel previous runs + if: github.event_name != 'schedule' + uses: styfle/cancel-workflow-action@0.12.1 + with: + access_token: ${{ github.token }} + + - name: Show PostgreSQL max_connections + run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;' + env: + POSTGRES_PASSWORD: postgres + PGPASSWORD: postgres + + - name: Increase max_connections in Postgres + run: | + docker exec -i river_postgres_container bash << EOF + echo 'max_connections = 1000' >> /var/lib/postgresql/data/postgresql.conf + echo 'shared_buffers = 2GB' >> /var/lib/postgresql/data/postgresql.conf + EOF + docker restart --time 0 river_postgres_container + sleep 5 + + - name: Show PostgreSQL max_connections + run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;' + env: + POSTGRES_PASSWORD: postgres + PGPASSWORD: postgres + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Git submodules + run: git submodule update --init --recursive + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version-file: 'go.work' + cache-dependency-path: '**/*.sum' + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: ${{ env.FOUNDRY_VERSION }} + + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'yarn' + + - name: Install node dependencies + run: yarn install --immutable + + - name: Print versions + run: ./scripts/print-versions.sh + + # Start an ssh session with tmate if the PR has the 'ssh' label + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 + if: contains(github.event.pull_request.labels.*.name, 'ssh') + + - name: Start and configure blockchains + run: ./scripts/bc-all-start.sh + + - name: Show PostgreSQL max_connections + run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;' + env: + POSTGRES_PASSWORD: postgres + PGPASSWORD: postgres + + - name: Increase max_connections in Postgres + run: | + docker exec -i river_postgres_container bash << EOF + echo 'max_connections = 1000' >> /var/lib/postgresql/data/postgresql.conf + echo 'shared_buffers = 2GB' >> /var/lib/postgresql/data/postgresql.conf + EOF + docker restart --time 0 river_postgres_container + sleep 5 + + - name: Show PostgreSQL max_connections + run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;' + env: + POSTGRES_PASSWORD: postgres + PGPASSWORD: postgres + + - name: create db + run: psql -h localhost -p 5433 -U postgres -f scripts/sql/create_db.sql + working-directory: core + env: + POSTGRES_PASSWORD: postgres + PGPASSWORD: postgres + + - name: Setup River CA for testing certificates + run: ./scripts/register-ca.sh + working-directory: core + + - name: Run node tests + # TODO: dropping --race for now, takes long and there is a flake in ./events that repores only on CI + run: go test -timeout 10m ./... + working-directory: core/node + + XChain_Node: + permissions: write-all + if: ( github.event_name != 'workflow_dispatch' || !inputs.skip_xchain_node ) + runs-on: ubuntu-latest-8-cores + timeout-minutes: 30 + steps: + - name: Cancel previous runs + if: github.event_name != 'schedule' + uses: styfle/cancel-workflow-action@0.12.1 + with: + access_token: ${{ github.token }} + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Git submodules + run: git submodule update --init --recursive + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version-file: 'go.work' + cache-dependency-path: '**/*.sum' + + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'yarn' + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: ${{ env.FOUNDRY_VERSION }} + + - name: Install node dependencies + run: yarn install --immutable + + - name: Print versions + run: ./scripts/print-versions.sh + + # Start an ssh session with tmate if the PR has the 'ssh' label + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 + if: contains(github.event.pull_request.labels.*.name, 'ssh') + + - name: Start and configure blockchains + run: ./scripts/bc-all-start.sh + + - name: Generate xchain contract bindings + run: ./scripts/build-contract-types.sh localhost + + - name: Maintain Turbo cache + uses: actions/cache@v4 + with: + path: node_modules/.cache/turbo + key: ${{ runner.os }}-turbo-${{ github.run_id }} + restore-keys: | + ${{ runner.os }}-turbo- + + - name: Run xchain node tests + run: go test --race ./... + working-directory: core/xchain + + XChain_Integration: + permissions: write-all + if: github.event_name != 'workflow_dispatch' || !inputs.skip_client_noentitlements + runs-on: ubuntu-latest-8-cores + timeout-minutes: 30 + + steps: + - name: Cancel previous runs + if: github.event_name != 'schedule' + uses: styfle/cancel-workflow-action@0.12.1 + with: + access_token: ${{ github.token }} + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Git submodules + run: git submodule update --init --recursive + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version-file: 'go.work' + cache-dependency-path: '**/*.sum' + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: ${{ env.FOUNDRY_VERSION }} + + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'yarn' + + - name: Install node dependencies + run: yarn install --immutable + + - name: Print versions + run: ./scripts/print-versions.sh + + - name: Start Local Basechain + run: ./scripts/start-local-basechain.sh & + + - name: Print Yarn package versions + run: yarn info --name-only --all + + - name: Maintain Turbo cache + uses: actions/cache@v4 + with: + path: node_modules/.cache/turbo + key: ${{ runner.os }}-turbo-${{ github.run_id }} + restore-keys: | + ${{ runner.os }}-turbo- + + - name: Run Integration Tests + run: make integration_tests + working-directory: core/xchain + + Slack_Notification: + # NOTE: We should make sure that new jobs get added here + needs: [Common_CI, Client_NoEntitlements, Multinode, Client_Entitlements, Multinode_Ent, Node, XChain_Node] + if: failure() + runs-on: ubuntu-latest + steps: + - name: Slack notification + if: (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') + uses: rtCamp/action-slack-notify@v2 + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_CI_CHANNEL_WEBHOOK_URL }} + SLACK_TITLE: 'Failure' + SLACK_USERNAME: 'CI' + SLACK_ICON_EMOJI: ':boom:' + SLACK_COLOR: '#FF0000' + SLACK_MESSAGE: 'CI Failure on ${{ github.repository }} ${{ vars.GOALIE_SLACK_GROUP_ID}}' + SLACK_LINK_NAMES: true diff --git a/.github/workflows/clean_turbo_cache.yml b/.github/workflows/clean_turbo_cache.yml new file mode 100644 index 000000000..407b90327 --- /dev/null +++ b/.github/workflows/clean_turbo_cache.yml @@ -0,0 +1,33 @@ +name: 'Clean Turbo Cache' + +on: + schedule: + # Daily cleanup of turbo cache + - cron: 0 0 * * * + +jobs: + cleanup: + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v4 + + - name: Cleanup Turbo Cache + run: | + gh extension install actions/gh-actions-cache + + REPO=${{ github.repository }} + + echo "Fetching list of turbo cache key" + cacheKeys=$(gh actions-cache list -R $REPO --key Linux-turbo | cut -f 1 ) + + ## Setting this to not fail the workflow while deleting cache keys. + set +e + echo "Deleting turbo caches..." + for cacheKey in $cacheKeys + do + gh actions-cache delete $cacheKey -R $REPO --confirm + done + echo "Done" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..d2668747a --- /dev/null +++ b/.gitignore @@ -0,0 +1,78 @@ +/.yarn/* +!/.yarn/patches +!/.yarn/plugins +!/.yarn/releases +!/.yarn/sdks + +# Swap the comments on the following lines if you don't wish to use zero-installs +# Documentation here: https://yarnpkg.com/features/zero-installs +#/.yarn/cache +#/.pnp.* +lcov.info +/**/yarn.lock + +/node_modules +/**/node_modules +/typechain-types +/cache +/artifacts +.DS_Store +coverage.json + +# Contracts +contracts/.openzeppelin/unknown-*.json +contracts/docs/coverage +contracts/.env +contracts/deployments +lib/ +abi/ + +/docs + +clients/web/app/storybook-static + +core/**/dist/ +core/proto/src/gen/* + +contracts/deployments/localhost/ +contracts/cache +.eslintcache +cache_hardhat +artifacts_* +tsconfig.tsbuildinfo +broadcast/ + +*.pem + +# Local .terraform directories +**/.terraform/* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Local .terraform directories +**/.terraform/* +out/ +turbo-*.log + +# profiling files +*.prof + +**/coverage +**/.turbo +servers/workers/*/dist/* +core/xchain/bin/* +core/xchain/instance_*/* + +.envrc +core/xchain/run_files/* +bin/gen-bindings-remove-struct +core/node/river_node +core/node/run_files/* + +go.work.sum +core/local_stream_node_logs/dev.log +core/local_xchain_node_logs/dev.log + +/packages/stress-testing/.env diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..9a2a0e219 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v20 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..eb30b5fce --- /dev/null +++ b/.prettierignore @@ -0,0 +1,47 @@ +.github +dev-dist +dist +node_modules +docs +storybook-static +.storybook + +infra/* + +servers/* +!servers/notification-service +!servers/workers +servers/workers/**/coverage/* +servers/workers/**/dist/* +servers/workers/**/.keys/* +core/**/gen/* +core/**/coverage/* +core/**/run_files/* +core/node/.mockery.yaml +core/node/auth/contracts/*.json +core/node/registries/contracts/*.json +core/encryption-pkg/turbo.json +contracts/cache/* +contracts/deployments/* +contracts/addresses/* +contracts/lib/* +contracts/**/out/* +contracts/out/* +contracts/**/types/* +contracts/docgen/* +packages/contract/out +contracts/coverage/* +core/xchain/src/gen/* + +broadcast/* +cache/* +lib/* +out/* + +.yarn/* +.vscode +yarn.lock + +packages/generated/* + +core/proto/src/protocol_*.ts diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 000000000..e2540645a --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,3 @@ +module.exports = { + ...require('@harmony/prettier-config'), +} diff --git a/.solhint.json b/.solhint.json new file mode 100644 index 000000000..9eadb43e5 --- /dev/null +++ b/.solhint.json @@ -0,0 +1,25 @@ +{ + "extends": "solhint:recommended", + "plugins": ["prettier"], + "rules": { + "prettier/prettier": "error", + "code-complexity": ["error", 9], + "compiler-version": ["error", "^0.8.0"], + "const-name-snakecase": "off", + "constructor-syntax": "error", + "func-visibility": ["error", { "ignoreConstructors": true }], + "max-line-length": ["error", 170], + "not-rely-on-time": "off", + "reason-string": ["warn", { "maxLength": 64 }], + "var-name-mixedcase": "off", + "no-empty-blocks": "off", + "no-inline-assembly": "off", + "avoid-low-level-calls": "off", + "avoid-tx-origin": "off", + "no-console": "off", + "func-name-mixedcase": "off", + "max-states-count": "off", + "func-named-parameters": "off", + "no-unused-import": "off" + } +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..33dd0f55b --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,100 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Attach to RiverNode", + "type": "go", + "request": "attach", + "mode": "local", + "processId": "river_node" + }, + { + "name": "Jest: current file in 'core/dlog/'", + "type": "node", + "request": "launch", + "env": { "NODE_ENV": "development", "NODE_TLS_REJECT_UNAUTHORIZED": "0" }, + "program": "${workspaceFolder}/node_modules/.bin/jest", + "runtimeArgs": ["--experimental-vm-modules", "--experimental-wasm-modules"], + "args": ["${file}", "--config", "${workspaceFolder}/core/dlog/jest.config.ts", "-i", "--no-cache", "--forceExit"], + "console": "integratedTerminal", + }, + { + "name": "Jest: current file in 'core/encryption/'", + "type": "node", + "request": "launch", + "env": { "NODE_ENV": "development", "NODE_TLS_REJECT_UNAUTHORIZED": "0" }, + "program": "${workspaceFolder}/node_modules/.bin/jest", + "runtimeArgs": ["--experimental-vm-modules", "--experimental-wasm-modules"], + "args": ["${file}", "--config", "${workspaceFolder}/core/encryption/jest.config.ts", "-i", "--no-cache", "--forceExit"], + "console": "integratedTerminal", + }, + { + "name": "Jest: current file in 'core/sdk/' (multi ne)", + "type": "node", + "request": "launch", + "env": { "NODE_ENV": "development", "NODE_TLS_REJECT_UNAUTHORIZED": "0", "RIVER_ENV": "local_multi_ne", "DEBUG": "csb:*,test:*", "DEBUG_DEPTH":"10" }, + "program": "${workspaceFolder}/node_modules/.bin/jest", + "runtimeArgs": ["--experimental-vm-modules", "--experimental-wasm-modules"], + "args": ["${file}", "--config", "${workspaceFolder}/core/sdk/jest.config.ts", "-i", "--no-cache", "--forceExit"], + "console": "integratedTerminal", + }, + { + "name": "Jest: current file in 'core/sdk/' (multi entitlements)", + "type": "node", + "request": "launch", + "env": { "NODE_ENV": "development", "NODE_TLS_REJECT_UNAUTHORIZED": "0", "RIVER_ENV": "local_multi", "DEBUG": "csb:*,test:*", "DEBUG_DEPTH":"10" }, + "program": "${workspaceFolder}/node_modules/.bin/jest", + "runtimeArgs": ["--experimental-vm-modules", "--experimental-wasm-modules"], + "args": ["${file}", "--config", "${workspaceFolder}/core/sdk/jest.config.ts", "-i", "--no-cache", "--forceExit"], + "console": "integratedTerminal", + }, + { + "name": "Jest: current file in 'core/sdk/' (single ne)", + "type": "node", + "request": "launch", + "env": { "NODE_ENV": "development", "NODE_TLS_REJECT_UNAUTHORIZED": "0", "RIVER_ENV": "local_single_ne", "DEBUG": "csb:*,test:*", "DEBUG_DEPTH":"10" }, + "program": "${workspaceFolder}/node_modules/.bin/jest", + "runtimeArgs": ["--experimental-vm-modules", "--experimental-wasm-modules"], + "args": ["${file}", "--config", "${workspaceFolder}/core/sdk/jest.config.ts", "-i", "--no-cache", "--forceExit"], + "console": "integratedTerminal", + }, + { + "name": "Jest: current file in 'core/sdk/' (single entitlements)", + "type": "node", + "request": "launch", + "env": { "NODE_ENV": "development", "NODE_TLS_REJECT_UNAUTHORIZED": "0", "RIVER_ENV": "local_single", "DEBUG": "csb:*,test:*", "DEBUG_DEPTH":"10" }, + "program": "${workspaceFolder}/node_modules/.bin/jest", + "runtimeArgs": ["--experimental-vm-modules", "--experimental-wasm-modules"], + "args": ["${file}", "--config", "${workspaceFolder}/core/sdk/jest.config.ts", "-i", "--no-cache", "--forceExit"], + "console": "integratedTerminal", + }, + { + "name": "Stress Jest: current file in 'core/sdk/' (single)", + "type": "node", + "request": "launch", + "env": { "NODE_ENV": "development", "NODE_TLS_REJECT_UNAUTHORIZED": "0", "RIVER_ENV": "local_single_ne", "DEBUG": "csb:test:stress*", "DEBUG_DEPTH":"10" }, + "program": "${workspaceFolder}/node_modules/.bin/jest", + "runtimeArgs": ["--experimental-vm-modules", "--experimental-wasm-modules"], + "args": ["${file}", "--config", "${workspaceFolder}/core/sdk/jest.config.ts", "-i", "--no-cache", "--logHeapUsage", "--runInBand", "--testTimeout=7200000"], + "console": "integratedTerminal", + }, + { + "name": "Casablanca Core Jest Tests Jsdom", + "type": "node", + "request": "launch", + "runtimeArgs": [ + "--inspect-brk", + "${workspaceRoot}/node_modules/jest/bin/jest.js", + "--runInBand", + "--config", + "${workspaceRoot}/core/core/jest.config.jsdom.ts", + "${fileBasenameNoExtension}", + ], + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" + }, + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..3cc0cd6d7 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,36 @@ +{ + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + }, + "eslint.workingDirectories": [ + "./core/debug-app", + "./core/dlog", + "./core/encryption", + "./core/proto", + "./core/sdk", + "./core/stress", + "./core/web3", + ], + "[solidity]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "solidity.formatter": "prettier", + "go.lintTool": "golangci-lint", + "go.lintFlags": [ + "--fast" + ], + "solidity.defaultCompiler": "remote", + "solidity.packageDefaultDependenciesContractsDirectory": "contracts/src", + "solidity.packageDefaultDependenciesDirectory": "lib,node_modules", + "solidity.compileUsingRemoteVersion": "v0.8.23+commit.f704f362", + "[makefile]": { + "editor.renderWhitespace": "all" + }, + "go.formatTool": "gofumpt", + "go.testFlags": [ + "-v", + "-tags", + "integration", + ], + "go.buildTags": "integration", +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 000000000..e7c47e310 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,496 @@ +{ + "version": "2.0.0", + "presentation": { + "echo": false, + "reveal": "always", + "focus": false, + "panel": "dedicated", + "showReuseMessage": true + }, + "tasks": [ + { + // start local dev: + // + // 1. yarn install + // 2. start blockchains + // 3. configure nodes + // 4. starts all servers and clients + // + // it's important to do in this order since the servers + // and use the artifacts of the contracts in their builds + "label": "~Start Local Dev~", + "dependsOn": [ + "CheckVersions", + "FoundryUp", + "YarnInstall", + "Stage 1", + ], + // Mark as the default build task so cmd/ctrl+shift+b will create them + "group": { + "kind": "build", + "isDefault": true + }, + "dependsOrder": "sequence" + }, + { + "label": "Stage 1", + "dependsOn": [ + "BaseChain", + "RiverChain", + "Stage 2" + ], + "group": { + "kind": "build", + "isDefault": false + }, + }, + { + "label": "Stage 2", + "dependsOn": [ + "CasablancaConfigureNodes", + "BuildProtobufs", + "Stage 3" + ], + "group": { + "kind": "build", + "isDefault": false + }, + "dependsOrder": "sequence" + }, + { + "label": "Stage 3", + "dependsOn": [ + "Start Watches", + "Casablanca DebugApp", + "Casablanca", + "Casablanca-No-Entitlements", + "XChainLaunchMulti", + ], + "group": { + "kind": "build", + "isDefault": false + }, + "problemMatcher": [] + }, + { + "label": "Start Watches", + "dependsOn": [ + "WatchCasablancaDlog", + "WatchCasablancaEncryption", + "WatchCasablancaProto", + "WatchCasablancaWeb3", + "WatchCasablancaSdk", + ], + "group": { + "kind": "build", + "isDefault": false + }, + "problemMatcher": [] + }, + { + "label": "Restart Watches", + "dependsOn": [ + "Kill Watches", + "DummyTask", + "Start Watches", + ], + "dependsOrder": "sequence", + "group": { + "kind": "build", + "isDefault": false + }, + "problemMatcher": [] + }, + { + "label": "FoundryUp", + "type": "shell", + "command": "./scripts/foundry-up.sh", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "ephemeral", + "focus": true, + "panel": "shared", + } + }, + { + "label": "CheckVersions", + "type": "shell", + "command": "./scripts/check-node-version.sh && ./scripts/check-go-version.sh", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "ephemeral", + "focus": true, + "panel": "shared", + } + }, + { + "label": "DummyTask", + "type": "shell", + "command": "sleep 1 && echo 'Dummy task... sometimes this is just needed.'", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "ephemeral", + "focus": true, + "panel": "shared", + } + }, + { + "label": "YarnInstall", + "type": "shell", + "command": "yarn", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "ephemeral", + "focus": true, + "panel": "shared", + } + }, + { + "label": "YarnClean & Cleanup", + "type": "shell", + "command": "./scripts/yarn-clean.sh", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "ephemeral", + "focus": true, + "panel": "shared", + } + }, + { + "label": "Start Load Testing Redis", + "type": "shell", + "command": "./scripts/start-load-testing-redis.sh", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "local-servers" + } + }, + { + "label": "Casablanca", + "type": "shell", + "command": "sleep 3 && yarn run --top-level csb:dev:entitlements -r", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "local-servers" + } + }, + { + "label": "Casablanca-No-Entitlements", + "type": "shell", + "command": "sleep 5 && yarn run --top-level csb:start:no-entitlements -r", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "local-servers" + } + }, + { + "label": "Configure Casablanca-Multinode ", + "type": "shell", + "command": "./scripts/configure-nodes.sh --multi", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "ephemeral", + "focus": true, + "panel": "shared", + } + }, + { + "label": "Configure Casablanca-Multinode-No-Entitlements", + "type": "shell", + "command": "./scripts/configure-nodes.sh --multi_ne", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "ephemeral", + "focus": true, + "panel": "shared", + } + }, + { + "label": "Casablanca-Multinode", + "type": "shell", + "command": "yarn run --top-level csb:multi -r", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "local-servers" + } + }, + { + "label": "Casablanca-Multinode-No-Entitlements", + "type": "shell", + "command": "yarn run --top-level csb:multi:no-entitlements -r", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "local-servers" + } + }, + { + "label": "Stop Casablanca", + "type": "shell", + "command": "./core/scripts/stop_node.sh && ./core/node/stop_multi.sh", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "ephemeral", + "focus": true, + "panel": "shared", + } + }, + { + "label": "Both Casablancas", + "dependsOn": [ + "Casablanca", + "Casablanca-No-Entitlements" + ], + "group": { + "kind": "build", + }, + "problemMatcher": [], + }, + { + "label": "Restart Casablanca", + "dependsOn": [ + "Stop Casablanca", + "DummyTask", + "Both Casablancas" + ], + "group": { + "kind": "build", + }, + "dependsOrder": "sequence", + "problemMatcher": [], + }, + { + "label": "CasablancaConfigureNodes", + "type": "shell", + "command": "./scripts/configure-nodes.sh --single && ./scripts/configure-nodes.sh --single_ne", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "ephemeral", + "focus": true, + "panel": "shared", + } + }, + { + "label": "XChainLaunchMulti", + "type": "shell", + "command": "sleep 1 && RUN_ENV=single ./core/xchain/launch_multi.sh", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "xchain" + } + }, + { + "label": "BaseChain", + "type": "shell", + "command": "RIVER_BLOCK_TIME=1 ./scripts/start-local-basechain.sh", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "local-blockchains" + } + }, + { + "label": "RiverChain", + "type": "shell", + "command": "RIVER_BLOCK_TIME=1 ./scripts/start-local-riverchain.sh", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "local-blockchains" + } + }, + { + "label": "Build Contracts", + "type": "shell", + "command": "./scripts/build-contracts.sh", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "ephemeral", + "focus": true, + "panel": "shared", + } + }, + { + "label": "BuildContractTypes", + "type": "shell", + "command": "./scripts/build-contract-types.sh localhost", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "ephemeral", + "focus": true, + "panel": "shared", + } + }, + { + "label": "BuildProtobufs", + "type": "shell", + "command": "yarn csb:build", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "ephemeral", + "focus": true, + "panel": "shared", + } + }, + { + "label": "WatchCasablancaSdk", + "type": "shell", + "command": "cd core/sdk && yarn watch", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "local-watch" + } + }, + { + "label": "WatchCasablancaEncryption", + "type": "shell", + "command": "cd core/encryption && yarn watch", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "local-watch" + } + }, + { + "label": "WatchCasablancaDlog", + "type": "shell", + "command": "cd core/dlog && yarn watch", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "local-watch" + } + }, + { + "label": "WatchCasablancaProto", + "type": "shell", + "command": "cd core/proto && yarn watch", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "local-watch-proto" + } + }, + { + "label": "WatchCasablancaWeb3", + "type": "shell", + "command": "cd core/web3 && yarn watch", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "local-watch-proto" + } + }, + { + "label": "WatchCasablancaProto_Go", + "type": "shell", + "command": "cd core/proto && yarn watch:go", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "local-watch-proto" + } + }, + { + "label": "Casablanca DebugApp", + "type": "shell", + "command": "./scripts/wait-for-core.sh && cd core/debug-app && yarn dev", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "local-clients" + } + }, + { + "label": "MITM - Casablanca", + "type": "shell", + "command": "mitmweb -p 7105 --mode reverse:http://localhost:7104/", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "local-mitm" + } + }, + { + "label": "KillAllLocalDev", + "type": "shell", + "command": "./scripts/kill-all-local-dev.sh -y", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "ephemeral", + "focus": true, + "panel": "shared", + } + }, + { + "label": "Kill Watches", + "type": "shell", + "command": "echo 'killing watches' && kill $(ps -ax | grep 'yarn watch' | awk '{print $1}') && return 0", + "isBackground": false, + "problemMatcher": [], + "presentation": { + "group": "ephemeral", + "focus": true, + "panel": "shared", + } + }, + { + "label": "Start Local Blockscout", + "type": "shell", + "command": "./scripts/start-local-blockscout.sh", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "ephemeral", + "focus": true, + "panel": "shared", + } + }, + { + "label": "Restart Local Dev", + "dependsOn": [ + "KillAllLocalDev", + "~Start Local Dev~", + ], + // Mark as the default build task so cmd/ctrl+shift+b will create them + "group": { + "kind": "build", + "isDefault": true + }, + "dependsOrder": "sequence" + }, + { + "label": "Kill All, Clean and Start Local Dev", + "dependsOn": [ + "KillAllLocalDev", + "YarnClean & Cleanup", + "~Start Local Dev~", + ], + // Mark as the default build task so cmd/ctrl+shift+b will create them + "group": { + "kind": "build", + "isDefault": true + }, + "dependsOrder": "sequence" + }, + ] +} diff --git a/.yarn/patches/jest-worker-npm-29.5.0-70da3388f1.patch b/.yarn/patches/jest-worker-npm-29.5.0-70da3388f1.patch new file mode 100644 index 000000000..0dd55fd64 --- /dev/null +++ b/.yarn/patches/jest-worker-npm-29.5.0-70da3388f1.patch @@ -0,0 +1,14 @@ +diff --git a/build/base/BaseWorkerPool.js b/build/base/BaseWorkerPool.js +index 1be8b5637450ee3ffa289f322a6bcb332227eef7..389493652d559b39f653235cdc4abb8520204a8c 100644 +--- a/build/base/BaseWorkerPool.js ++++ b/build/base/BaseWorkerPool.js +@@ -24,7 +24,8 @@ function _interopRequireDefault(obj) { + + // How long to wait for the child process to terminate + // after CHILD_MESSAGE_END before sending force exiting. +-const FORCE_EXIT_DELAY = 500; ++// HNT Labs increased to allow tests to complete when logging levels are high ++const FORCE_EXIT_DELAY = 180000; + + /* istanbul ignore next */ + // eslint-disable-next-line @typescript-eslint/no-empty-function diff --git a/.yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs b/.yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs new file mode 100644 index 000000000..4e89c7c35 --- /dev/null +++ b/.yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs @@ -0,0 +1,28 @@ +/* eslint-disable */ +//prettier-ignore +module.exports = { +name: "@yarnpkg/plugin-workspace-tools", +factory: function (require) { +var plugin=(()=>{var yr=Object.create;var we=Object.defineProperty;var _r=Object.getOwnPropertyDescriptor;var Er=Object.getOwnPropertyNames;var br=Object.getPrototypeOf,xr=Object.prototype.hasOwnProperty;var W=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(r,t)=>(typeof require<"u"?require:r)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+e+'" is not supported')});var q=(e,r)=>()=>(r||e((r={exports:{}}).exports,r),r.exports),Cr=(e,r)=>{for(var t in r)we(e,t,{get:r[t],enumerable:!0})},Je=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of Er(r))!xr.call(e,s)&&s!==t&&we(e,s,{get:()=>r[s],enumerable:!(n=_r(r,s))||n.enumerable});return e};var Be=(e,r,t)=>(t=e!=null?yr(br(e)):{},Je(r||!e||!e.__esModule?we(t,"default",{value:e,enumerable:!0}):t,e)),wr=e=>Je(we({},"__esModule",{value:!0}),e);var ve=q(ee=>{"use strict";ee.isInteger=e=>typeof e=="number"?Number.isInteger(e):typeof e=="string"&&e.trim()!==""?Number.isInteger(Number(e)):!1;ee.find=(e,r)=>e.nodes.find(t=>t.type===r);ee.exceedsLimit=(e,r,t=1,n)=>n===!1||!ee.isInteger(e)||!ee.isInteger(r)?!1:(Number(r)-Number(e))/Number(t)>=n;ee.escapeNode=(e,r=0,t)=>{let n=e.nodes[r];!n||(t&&n.type===t||n.type==="open"||n.type==="close")&&n.escaped!==!0&&(n.value="\\"+n.value,n.escaped=!0)};ee.encloseBrace=e=>e.type!=="brace"?!1:e.commas>>0+e.ranges>>0===0?(e.invalid=!0,!0):!1;ee.isInvalidBrace=e=>e.type!=="brace"?!1:e.invalid===!0||e.dollar?!0:e.commas>>0+e.ranges>>0===0||e.open!==!0||e.close!==!0?(e.invalid=!0,!0):!1;ee.isOpenOrClose=e=>e.type==="open"||e.type==="close"?!0:e.open===!0||e.close===!0;ee.reduce=e=>e.reduce((r,t)=>(t.type==="text"&&r.push(t.value),t.type==="range"&&(t.type="text"),r),[]);ee.flatten=(...e)=>{let r=[],t=n=>{for(let s=0;s{"use strict";var tt=ve();rt.exports=(e,r={})=>{let t=(n,s={})=>{let i=r.escapeInvalid&&tt.isInvalidBrace(s),a=n.invalid===!0&&r.escapeInvalid===!0,c="";if(n.value)return(i||a)&&tt.isOpenOrClose(n)?"\\"+n.value:n.value;if(n.value)return n.value;if(n.nodes)for(let p of n.nodes)c+=t(p);return c};return t(e)}});var st=q((Vn,nt)=>{"use strict";nt.exports=function(e){return typeof e=="number"?e-e===0:typeof e=="string"&&e.trim()!==""?Number.isFinite?Number.isFinite(+e):isFinite(+e):!1}});var ht=q((Jn,pt)=>{"use strict";var at=st(),le=(e,r,t)=>{if(at(e)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(r===void 0||e===r)return String(e);if(at(r)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let n={relaxZeros:!0,...t};typeof n.strictZeros=="boolean"&&(n.relaxZeros=n.strictZeros===!1);let s=String(n.relaxZeros),i=String(n.shorthand),a=String(n.capture),c=String(n.wrap),p=e+":"+r+"="+s+i+a+c;if(le.cache.hasOwnProperty(p))return le.cache[p].result;let m=Math.min(e,r),h=Math.max(e,r);if(Math.abs(m-h)===1){let y=e+"|"+r;return n.capture?`(${y})`:n.wrap===!1?y:`(?:${y})`}let R=ft(e)||ft(r),f={min:e,max:r,a:m,b:h},$=[],_=[];if(R&&(f.isPadded=R,f.maxLen=String(f.max).length),m<0){let y=h<0?Math.abs(h):1;_=it(y,Math.abs(m),f,n),m=f.a=0}return h>=0&&($=it(m,h,f,n)),f.negatives=_,f.positives=$,f.result=Sr(_,$,n),n.capture===!0?f.result=`(${f.result})`:n.wrap!==!1&&$.length+_.length>1&&(f.result=`(?:${f.result})`),le.cache[p]=f,f.result};function Sr(e,r,t){let n=Pe(e,r,"-",!1,t)||[],s=Pe(r,e,"",!1,t)||[],i=Pe(e,r,"-?",!0,t)||[];return n.concat(i).concat(s).join("|")}function vr(e,r){let t=1,n=1,s=ut(e,t),i=new Set([r]);for(;e<=s&&s<=r;)i.add(s),t+=1,s=ut(e,t);for(s=ct(r+1,n)-1;e1&&c.count.pop(),c.count.push(h.count[0]),c.string=c.pattern+lt(c.count),a=m+1;continue}t.isPadded&&(R=Lr(m,t,n)),h.string=R+h.pattern+lt(h.count),i.push(h),a=m+1,c=h}return i}function Pe(e,r,t,n,s){let i=[];for(let a of e){let{string:c}=a;!n&&!ot(r,"string",c)&&i.push(t+c),n&&ot(r,"string",c)&&i.push(t+c)}return i}function $r(e,r){let t=[];for(let n=0;nr?1:r>e?-1:0}function ot(e,r,t){return e.some(n=>n[r]===t)}function ut(e,r){return Number(String(e).slice(0,-r)+"9".repeat(r))}function ct(e,r){return e-e%Math.pow(10,r)}function lt(e){let[r=0,t=""]=e;return t||r>1?`{${r+(t?","+t:"")}}`:""}function kr(e,r,t){return`[${e}${r-e===1?"":"-"}${r}]`}function ft(e){return/^-?(0+)\d/.test(e)}function Lr(e,r,t){if(!r.isPadded)return e;let n=Math.abs(r.maxLen-String(e).length),s=t.relaxZeros!==!1;switch(n){case 0:return"";case 1:return s?"0?":"0";case 2:return s?"0{0,2}":"00";default:return s?`0{0,${n}}`:`0{${n}}`}}le.cache={};le.clearCache=()=>le.cache={};pt.exports=le});var Ue=q((es,Et)=>{"use strict";var Or=W("util"),At=ht(),dt=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),Nr=e=>r=>e===!0?Number(r):String(r),Me=e=>typeof e=="number"||typeof e=="string"&&e!=="",Ae=e=>Number.isInteger(+e),De=e=>{let r=`${e}`,t=-1;if(r[0]==="-"&&(r=r.slice(1)),r==="0")return!1;for(;r[++t]==="0";);return t>0},Ir=(e,r,t)=>typeof e=="string"||typeof r=="string"?!0:t.stringify===!0,Br=(e,r,t)=>{if(r>0){let n=e[0]==="-"?"-":"";n&&(e=e.slice(1)),e=n+e.padStart(n?r-1:r,"0")}return t===!1?String(e):e},gt=(e,r)=>{let t=e[0]==="-"?"-":"";for(t&&(e=e.slice(1),r--);e.length{e.negatives.sort((a,c)=>ac?1:0),e.positives.sort((a,c)=>ac?1:0);let t=r.capture?"":"?:",n="",s="",i;return e.positives.length&&(n=e.positives.join("|")),e.negatives.length&&(s=`-(${t}${e.negatives.join("|")})`),n&&s?i=`${n}|${s}`:i=n||s,r.wrap?`(${t}${i})`:i},mt=(e,r,t,n)=>{if(t)return At(e,r,{wrap:!1,...n});let s=String.fromCharCode(e);if(e===r)return s;let i=String.fromCharCode(r);return`[${s}-${i}]`},Rt=(e,r,t)=>{if(Array.isArray(e)){let n=t.wrap===!0,s=t.capture?"":"?:";return n?`(${s}${e.join("|")})`:e.join("|")}return At(e,r,t)},yt=(...e)=>new RangeError("Invalid range arguments: "+Or.inspect(...e)),_t=(e,r,t)=>{if(t.strictRanges===!0)throw yt([e,r]);return[]},Mr=(e,r)=>{if(r.strictRanges===!0)throw new TypeError(`Expected step "${e}" to be a number`);return[]},Dr=(e,r,t=1,n={})=>{let s=Number(e),i=Number(r);if(!Number.isInteger(s)||!Number.isInteger(i)){if(n.strictRanges===!0)throw yt([e,r]);return[]}s===0&&(s=0),i===0&&(i=0);let a=s>i,c=String(e),p=String(r),m=String(t);t=Math.max(Math.abs(t),1);let h=De(c)||De(p)||De(m),R=h?Math.max(c.length,p.length,m.length):0,f=h===!1&&Ir(e,r,n)===!1,$=n.transform||Nr(f);if(n.toRegex&&t===1)return mt(gt(e,R),gt(r,R),!0,n);let _={negatives:[],positives:[]},y=T=>_[T<0?"negatives":"positives"].push(Math.abs(T)),E=[],S=0;for(;a?s>=i:s<=i;)n.toRegex===!0&&t>1?y(s):E.push(Br($(s,S),R,f)),s=a?s-t:s+t,S++;return n.toRegex===!0?t>1?Pr(_,n):Rt(E,null,{wrap:!1,...n}):E},Ur=(e,r,t=1,n={})=>{if(!Ae(e)&&e.length>1||!Ae(r)&&r.length>1)return _t(e,r,n);let s=n.transform||(f=>String.fromCharCode(f)),i=`${e}`.charCodeAt(0),a=`${r}`.charCodeAt(0),c=i>a,p=Math.min(i,a),m=Math.max(i,a);if(n.toRegex&&t===1)return mt(p,m,!1,n);let h=[],R=0;for(;c?i>=a:i<=a;)h.push(s(i,R)),i=c?i-t:i+t,R++;return n.toRegex===!0?Rt(h,null,{wrap:!1,options:n}):h},$e=(e,r,t,n={})=>{if(r==null&&Me(e))return[e];if(!Me(e)||!Me(r))return _t(e,r,n);if(typeof t=="function")return $e(e,r,1,{transform:t});if(dt(t))return $e(e,r,0,t);let s={...n};return s.capture===!0&&(s.wrap=!0),t=t||s.step||1,Ae(t)?Ae(e)&&Ae(r)?Dr(e,r,t,s):Ur(e,r,Math.max(Math.abs(t),1),s):t!=null&&!dt(t)?Mr(t,s):$e(e,r,1,t)};Et.exports=$e});var Ct=q((ts,xt)=>{"use strict";var Gr=Ue(),bt=ve(),qr=(e,r={})=>{let t=(n,s={})=>{let i=bt.isInvalidBrace(s),a=n.invalid===!0&&r.escapeInvalid===!0,c=i===!0||a===!0,p=r.escapeInvalid===!0?"\\":"",m="";if(n.isOpen===!0||n.isClose===!0)return p+n.value;if(n.type==="open")return c?p+n.value:"(";if(n.type==="close")return c?p+n.value:")";if(n.type==="comma")return n.prev.type==="comma"?"":c?n.value:"|";if(n.value)return n.value;if(n.nodes&&n.ranges>0){let h=bt.reduce(n.nodes),R=Gr(...h,{...r,wrap:!1,toRegex:!0});if(R.length!==0)return h.length>1&&R.length>1?`(${R})`:R}if(n.nodes)for(let h of n.nodes)m+=t(h,n);return m};return t(e)};xt.exports=qr});var vt=q((rs,St)=>{"use strict";var Kr=Ue(),wt=He(),he=ve(),fe=(e="",r="",t=!1)=>{let n=[];if(e=[].concat(e),r=[].concat(r),!r.length)return e;if(!e.length)return t?he.flatten(r).map(s=>`{${s}}`):r;for(let s of e)if(Array.isArray(s))for(let i of s)n.push(fe(i,r,t));else for(let i of r)t===!0&&typeof i=="string"&&(i=`{${i}}`),n.push(Array.isArray(i)?fe(s,i,t):s+i);return he.flatten(n)},Wr=(e,r={})=>{let t=r.rangeLimit===void 0?1e3:r.rangeLimit,n=(s,i={})=>{s.queue=[];let a=i,c=i.queue;for(;a.type!=="brace"&&a.type!=="root"&&a.parent;)a=a.parent,c=a.queue;if(s.invalid||s.dollar){c.push(fe(c.pop(),wt(s,r)));return}if(s.type==="brace"&&s.invalid!==!0&&s.nodes.length===2){c.push(fe(c.pop(),["{}"]));return}if(s.nodes&&s.ranges>0){let R=he.reduce(s.nodes);if(he.exceedsLimit(...R,r.step,t))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let f=Kr(...R,r);f.length===0&&(f=wt(s,r)),c.push(fe(c.pop(),f)),s.nodes=[];return}let p=he.encloseBrace(s),m=s.queue,h=s;for(;h.type!=="brace"&&h.type!=="root"&&h.parent;)h=h.parent,m=h.queue;for(let R=0;R{"use strict";Ht.exports={MAX_LENGTH:1024*64,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:` +`,CHAR_NO_BREAK_SPACE:"\xA0",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:" ",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\uFEFF"}});var Nt=q((ss,Ot)=>{"use strict";var jr=He(),{MAX_LENGTH:Tt,CHAR_BACKSLASH:Ge,CHAR_BACKTICK:Fr,CHAR_COMMA:Qr,CHAR_DOT:Xr,CHAR_LEFT_PARENTHESES:Zr,CHAR_RIGHT_PARENTHESES:Yr,CHAR_LEFT_CURLY_BRACE:zr,CHAR_RIGHT_CURLY_BRACE:Vr,CHAR_LEFT_SQUARE_BRACKET:kt,CHAR_RIGHT_SQUARE_BRACKET:Lt,CHAR_DOUBLE_QUOTE:Jr,CHAR_SINGLE_QUOTE:en,CHAR_NO_BREAK_SPACE:tn,CHAR_ZERO_WIDTH_NOBREAK_SPACE:rn}=$t(),nn=(e,r={})=>{if(typeof e!="string")throw new TypeError("Expected a string");let t=r||{},n=typeof t.maxLength=="number"?Math.min(Tt,t.maxLength):Tt;if(e.length>n)throw new SyntaxError(`Input length (${e.length}), exceeds max characters (${n})`);let s={type:"root",input:e,nodes:[]},i=[s],a=s,c=s,p=0,m=e.length,h=0,R=0,f,$={},_=()=>e[h++],y=E=>{if(E.type==="text"&&c.type==="dot"&&(c.type="text"),c&&c.type==="text"&&E.type==="text"){c.value+=E.value;return}return a.nodes.push(E),E.parent=a,E.prev=c,c=E,E};for(y({type:"bos"});h0){if(a.ranges>0){a.ranges=0;let E=a.nodes.shift();a.nodes=[E,{type:"text",value:jr(a)}]}y({type:"comma",value:f}),a.commas++;continue}if(f===Xr&&R>0&&a.commas===0){let E=a.nodes;if(R===0||E.length===0){y({type:"text",value:f});continue}if(c.type==="dot"){if(a.range=[],c.value+=f,c.type="range",a.nodes.length!==3&&a.nodes.length!==5){a.invalid=!0,a.ranges=0,c.type="text";continue}a.ranges++,a.args=[];continue}if(c.type==="range"){E.pop();let S=E[E.length-1];S.value+=c.value+f,c=S,a.ranges--;continue}y({type:"dot",value:f});continue}y({type:"text",value:f})}do if(a=i.pop(),a.type!=="root"){a.nodes.forEach(T=>{T.nodes||(T.type==="open"&&(T.isOpen=!0),T.type==="close"&&(T.isClose=!0),T.nodes||(T.type="text"),T.invalid=!0)});let E=i[i.length-1],S=E.nodes.indexOf(a);E.nodes.splice(S,1,...a.nodes)}while(i.length>0);return y({type:"eos"}),s};Ot.exports=nn});var Pt=q((as,Bt)=>{"use strict";var It=He(),sn=Ct(),an=vt(),on=Nt(),Z=(e,r={})=>{let t=[];if(Array.isArray(e))for(let n of e){let s=Z.create(n,r);Array.isArray(s)?t.push(...s):t.push(s)}else t=[].concat(Z.create(e,r));return r&&r.expand===!0&&r.nodupes===!0&&(t=[...new Set(t)]),t};Z.parse=(e,r={})=>on(e,r);Z.stringify=(e,r={})=>It(typeof e=="string"?Z.parse(e,r):e,r);Z.compile=(e,r={})=>(typeof e=="string"&&(e=Z.parse(e,r)),sn(e,r));Z.expand=(e,r={})=>{typeof e=="string"&&(e=Z.parse(e,r));let t=an(e,r);return r.noempty===!0&&(t=t.filter(Boolean)),r.nodupes===!0&&(t=[...new Set(t)]),t};Z.create=(e,r={})=>e===""||e.length<3?[e]:r.expand!==!0?Z.compile(e,r):Z.expand(e,r);Bt.exports=Z});var me=q((is,qt)=>{"use strict";var un=W("path"),se="\\\\/",Mt=`[^${se}]`,ie="\\.",cn="\\+",ln="\\?",Te="\\/",fn="(?=.)",Dt="[^/]",qe=`(?:${Te}|$)`,Ut=`(?:^|${Te})`,Ke=`${ie}{1,2}${qe}`,pn=`(?!${ie})`,hn=`(?!${Ut}${Ke})`,dn=`(?!${ie}{0,1}${qe})`,gn=`(?!${Ke})`,An=`[^.${Te}]`,mn=`${Dt}*?`,Gt={DOT_LITERAL:ie,PLUS_LITERAL:cn,QMARK_LITERAL:ln,SLASH_LITERAL:Te,ONE_CHAR:fn,QMARK:Dt,END_ANCHOR:qe,DOTS_SLASH:Ke,NO_DOT:pn,NO_DOTS:hn,NO_DOT_SLASH:dn,NO_DOTS_SLASH:gn,QMARK_NO_DOT:An,STAR:mn,START_ANCHOR:Ut},Rn={...Gt,SLASH_LITERAL:`[${se}]`,QMARK:Mt,STAR:`${Mt}*?`,DOTS_SLASH:`${ie}{1,2}(?:[${se}]|$)`,NO_DOT:`(?!${ie})`,NO_DOTS:`(?!(?:^|[${se}])${ie}{1,2}(?:[${se}]|$))`,NO_DOT_SLASH:`(?!${ie}{0,1}(?:[${se}]|$))`,NO_DOTS_SLASH:`(?!${ie}{1,2}(?:[${se}]|$))`,QMARK_NO_DOT:`[^.${se}]`,START_ANCHOR:`(?:^|[${se}])`,END_ANCHOR:`(?:[${se}]|$)`},yn={alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};qt.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:yn,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:un.sep,extglobChars(e){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${e.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(e){return e===!0?Rn:Gt}}});var Re=q(Q=>{"use strict";var _n=W("path"),En=process.platform==="win32",{REGEX_BACKSLASH:bn,REGEX_REMOVE_BACKSLASH:xn,REGEX_SPECIAL_CHARS:Cn,REGEX_SPECIAL_CHARS_GLOBAL:wn}=me();Q.isObject=e=>e!==null&&typeof e=="object"&&!Array.isArray(e);Q.hasRegexChars=e=>Cn.test(e);Q.isRegexChar=e=>e.length===1&&Q.hasRegexChars(e);Q.escapeRegex=e=>e.replace(wn,"\\$1");Q.toPosixSlashes=e=>e.replace(bn,"/");Q.removeBackslashes=e=>e.replace(xn,r=>r==="\\"?"":r);Q.supportsLookbehinds=()=>{let e=process.version.slice(1).split(".").map(Number);return e.length===3&&e[0]>=9||e[0]===8&&e[1]>=10};Q.isWindows=e=>e&&typeof e.windows=="boolean"?e.windows:En===!0||_n.sep==="\\";Q.escapeLast=(e,r,t)=>{let n=e.lastIndexOf(r,t);return n===-1?e:e[n-1]==="\\"?Q.escapeLast(e,r,n-1):`${e.slice(0,n)}\\${e.slice(n)}`};Q.removePrefix=(e,r={})=>{let t=e;return t.startsWith("./")&&(t=t.slice(2),r.prefix="./"),t};Q.wrapOutput=(e,r={},t={})=>{let n=t.contains?"":"^",s=t.contains?"":"$",i=`${n}(?:${e})${s}`;return r.negated===!0&&(i=`(?:^(?!${i}).*$)`),i}});var Yt=q((us,Zt)=>{"use strict";var Kt=Re(),{CHAR_ASTERISK:We,CHAR_AT:Sn,CHAR_BACKWARD_SLASH:ye,CHAR_COMMA:vn,CHAR_DOT:je,CHAR_EXCLAMATION_MARK:Fe,CHAR_FORWARD_SLASH:Xt,CHAR_LEFT_CURLY_BRACE:Qe,CHAR_LEFT_PARENTHESES:Xe,CHAR_LEFT_SQUARE_BRACKET:Hn,CHAR_PLUS:$n,CHAR_QUESTION_MARK:Wt,CHAR_RIGHT_CURLY_BRACE:Tn,CHAR_RIGHT_PARENTHESES:jt,CHAR_RIGHT_SQUARE_BRACKET:kn}=me(),Ft=e=>e===Xt||e===ye,Qt=e=>{e.isPrefix!==!0&&(e.depth=e.isGlobstar?1/0:1)},Ln=(e,r)=>{let t=r||{},n=e.length-1,s=t.parts===!0||t.scanToEnd===!0,i=[],a=[],c=[],p=e,m=-1,h=0,R=0,f=!1,$=!1,_=!1,y=!1,E=!1,S=!1,T=!1,L=!1,z=!1,I=!1,re=0,K,g,v={value:"",depth:0,isGlob:!1},k=()=>m>=n,l=()=>p.charCodeAt(m+1),H=()=>(K=g,p.charCodeAt(++m));for(;m0&&(B=p.slice(0,h),p=p.slice(h),R-=h),w&&_===!0&&R>0?(w=p.slice(0,R),o=p.slice(R)):_===!0?(w="",o=p):w=p,w&&w!==""&&w!=="/"&&w!==p&&Ft(w.charCodeAt(w.length-1))&&(w=w.slice(0,-1)),t.unescape===!0&&(o&&(o=Kt.removeBackslashes(o)),w&&T===!0&&(w=Kt.removeBackslashes(w)));let u={prefix:B,input:e,start:h,base:w,glob:o,isBrace:f,isBracket:$,isGlob:_,isExtglob:y,isGlobstar:E,negated:L,negatedExtglob:z};if(t.tokens===!0&&(u.maxDepth=0,Ft(g)||a.push(v),u.tokens=a),t.parts===!0||t.tokens===!0){let P;for(let b=0;b{"use strict";var ke=me(),Y=Re(),{MAX_LENGTH:Le,POSIX_REGEX_SOURCE:On,REGEX_NON_SPECIAL_CHARS:Nn,REGEX_SPECIAL_CHARS_BACKREF:In,REPLACEMENTS:zt}=ke,Bn=(e,r)=>{if(typeof r.expandRange=="function")return r.expandRange(...e,r);e.sort();let t=`[${e.join("-")}]`;try{new RegExp(t)}catch{return e.map(s=>Y.escapeRegex(s)).join("..")}return t},de=(e,r)=>`Missing ${e}: "${r}" - use "\\\\${r}" to match literal characters`,Vt=(e,r)=>{if(typeof e!="string")throw new TypeError("Expected a string");e=zt[e]||e;let t={...r},n=typeof t.maxLength=="number"?Math.min(Le,t.maxLength):Le,s=e.length;if(s>n)throw new SyntaxError(`Input length: ${s}, exceeds maximum allowed length: ${n}`);let i={type:"bos",value:"",output:t.prepend||""},a=[i],c=t.capture?"":"?:",p=Y.isWindows(r),m=ke.globChars(p),h=ke.extglobChars(m),{DOT_LITERAL:R,PLUS_LITERAL:f,SLASH_LITERAL:$,ONE_CHAR:_,DOTS_SLASH:y,NO_DOT:E,NO_DOT_SLASH:S,NO_DOTS_SLASH:T,QMARK:L,QMARK_NO_DOT:z,STAR:I,START_ANCHOR:re}=m,K=A=>`(${c}(?:(?!${re}${A.dot?y:R}).)*?)`,g=t.dot?"":E,v=t.dot?L:z,k=t.bash===!0?K(t):I;t.capture&&(k=`(${k})`),typeof t.noext=="boolean"&&(t.noextglob=t.noext);let l={input:e,index:-1,start:0,dot:t.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:a};e=Y.removePrefix(e,l),s=e.length;let H=[],w=[],B=[],o=i,u,P=()=>l.index===s-1,b=l.peek=(A=1)=>e[l.index+A],V=l.advance=()=>e[++l.index]||"",J=()=>e.slice(l.index+1),X=(A="",O=0)=>{l.consumed+=A,l.index+=O},Ee=A=>{l.output+=A.output!=null?A.output:A.value,X(A.value)},mr=()=>{let A=1;for(;b()==="!"&&(b(2)!=="("||b(3)==="?");)V(),l.start++,A++;return A%2===0?!1:(l.negated=!0,l.start++,!0)},be=A=>{l[A]++,B.push(A)},oe=A=>{l[A]--,B.pop()},C=A=>{if(o.type==="globstar"){let O=l.braces>0&&(A.type==="comma"||A.type==="brace"),d=A.extglob===!0||H.length&&(A.type==="pipe"||A.type==="paren");A.type!=="slash"&&A.type!=="paren"&&!O&&!d&&(l.output=l.output.slice(0,-o.output.length),o.type="star",o.value="*",o.output=k,l.output+=o.output)}if(H.length&&A.type!=="paren"&&(H[H.length-1].inner+=A.value),(A.value||A.output)&&Ee(A),o&&o.type==="text"&&A.type==="text"){o.value+=A.value,o.output=(o.output||"")+A.value;return}A.prev=o,a.push(A),o=A},xe=(A,O)=>{let d={...h[O],conditions:1,inner:""};d.prev=o,d.parens=l.parens,d.output=l.output;let x=(t.capture?"(":"")+d.open;be("parens"),C({type:A,value:O,output:l.output?"":_}),C({type:"paren",extglob:!0,value:V(),output:x}),H.push(d)},Rr=A=>{let O=A.close+(t.capture?")":""),d;if(A.type==="negate"){let x=k;A.inner&&A.inner.length>1&&A.inner.includes("/")&&(x=K(t)),(x!==k||P()||/^\)+$/.test(J()))&&(O=A.close=`)$))${x}`),A.inner.includes("*")&&(d=J())&&/^\.[^\\/.]+$/.test(d)&&(O=A.close=`)${d})${x})`),A.prev.type==="bos"&&(l.negatedExtglob=!0)}C({type:"paren",extglob:!0,value:u,output:O}),oe("parens")};if(t.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(e)){let A=!1,O=e.replace(In,(d,x,M,j,G,Ie)=>j==="\\"?(A=!0,d):j==="?"?x?x+j+(G?L.repeat(G.length):""):Ie===0?v+(G?L.repeat(G.length):""):L.repeat(M.length):j==="."?R.repeat(M.length):j==="*"?x?x+j+(G?k:""):k:x?d:`\\${d}`);return A===!0&&(t.unescape===!0?O=O.replace(/\\/g,""):O=O.replace(/\\+/g,d=>d.length%2===0?"\\\\":d?"\\":"")),O===e&&t.contains===!0?(l.output=e,l):(l.output=Y.wrapOutput(O,l,r),l)}for(;!P();){if(u=V(),u==="\0")continue;if(u==="\\"){let d=b();if(d==="/"&&t.bash!==!0||d==="."||d===";")continue;if(!d){u+="\\",C({type:"text",value:u});continue}let x=/^\\+/.exec(J()),M=0;if(x&&x[0].length>2&&(M=x[0].length,l.index+=M,M%2!==0&&(u+="\\")),t.unescape===!0?u=V():u+=V(),l.brackets===0){C({type:"text",value:u});continue}}if(l.brackets>0&&(u!=="]"||o.value==="["||o.value==="[^")){if(t.posix!==!1&&u===":"){let d=o.value.slice(1);if(d.includes("[")&&(o.posix=!0,d.includes(":"))){let x=o.value.lastIndexOf("["),M=o.value.slice(0,x),j=o.value.slice(x+2),G=On[j];if(G){o.value=M+G,l.backtrack=!0,V(),!i.output&&a.indexOf(o)===1&&(i.output=_);continue}}}(u==="["&&b()!==":"||u==="-"&&b()==="]")&&(u=`\\${u}`),u==="]"&&(o.value==="["||o.value==="[^")&&(u=`\\${u}`),t.posix===!0&&u==="!"&&o.value==="["&&(u="^"),o.value+=u,Ee({value:u});continue}if(l.quotes===1&&u!=='"'){u=Y.escapeRegex(u),o.value+=u,Ee({value:u});continue}if(u==='"'){l.quotes=l.quotes===1?0:1,t.keepQuotes===!0&&C({type:"text",value:u});continue}if(u==="("){be("parens"),C({type:"paren",value:u});continue}if(u===")"){if(l.parens===0&&t.strictBrackets===!0)throw new SyntaxError(de("opening","("));let d=H[H.length-1];if(d&&l.parens===d.parens+1){Rr(H.pop());continue}C({type:"paren",value:u,output:l.parens?")":"\\)"}),oe("parens");continue}if(u==="["){if(t.nobracket===!0||!J().includes("]")){if(t.nobracket!==!0&&t.strictBrackets===!0)throw new SyntaxError(de("closing","]"));u=`\\${u}`}else be("brackets");C({type:"bracket",value:u});continue}if(u==="]"){if(t.nobracket===!0||o&&o.type==="bracket"&&o.value.length===1){C({type:"text",value:u,output:`\\${u}`});continue}if(l.brackets===0){if(t.strictBrackets===!0)throw new SyntaxError(de("opening","["));C({type:"text",value:u,output:`\\${u}`});continue}oe("brackets");let d=o.value.slice(1);if(o.posix!==!0&&d[0]==="^"&&!d.includes("/")&&(u=`/${u}`),o.value+=u,Ee({value:u}),t.literalBrackets===!1||Y.hasRegexChars(d))continue;let x=Y.escapeRegex(o.value);if(l.output=l.output.slice(0,-o.value.length),t.literalBrackets===!0){l.output+=x,o.value=x;continue}o.value=`(${c}${x}|${o.value})`,l.output+=o.value;continue}if(u==="{"&&t.nobrace!==!0){be("braces");let d={type:"brace",value:u,output:"(",outputIndex:l.output.length,tokensIndex:l.tokens.length};w.push(d),C(d);continue}if(u==="}"){let d=w[w.length-1];if(t.nobrace===!0||!d){C({type:"text",value:u,output:u});continue}let x=")";if(d.dots===!0){let M=a.slice(),j=[];for(let G=M.length-1;G>=0&&(a.pop(),M[G].type!=="brace");G--)M[G].type!=="dots"&&j.unshift(M[G].value);x=Bn(j,t),l.backtrack=!0}if(d.comma!==!0&&d.dots!==!0){let M=l.output.slice(0,d.outputIndex),j=l.tokens.slice(d.tokensIndex);d.value=d.output="\\{",u=x="\\}",l.output=M;for(let G of j)l.output+=G.output||G.value}C({type:"brace",value:u,output:x}),oe("braces"),w.pop();continue}if(u==="|"){H.length>0&&H[H.length-1].conditions++,C({type:"text",value:u});continue}if(u===","){let d=u,x=w[w.length-1];x&&B[B.length-1]==="braces"&&(x.comma=!0,d="|"),C({type:"comma",value:u,output:d});continue}if(u==="/"){if(o.type==="dot"&&l.index===l.start+1){l.start=l.index+1,l.consumed="",l.output="",a.pop(),o=i;continue}C({type:"slash",value:u,output:$});continue}if(u==="."){if(l.braces>0&&o.type==="dot"){o.value==="."&&(o.output=R);let d=w[w.length-1];o.type="dots",o.output+=u,o.value+=u,d.dots=!0;continue}if(l.braces+l.parens===0&&o.type!=="bos"&&o.type!=="slash"){C({type:"text",value:u,output:R});continue}C({type:"dot",value:u,output:R});continue}if(u==="?"){if(!(o&&o.value==="(")&&t.noextglob!==!0&&b()==="("&&b(2)!=="?"){xe("qmark",u);continue}if(o&&o.type==="paren"){let x=b(),M=u;if(x==="<"&&!Y.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(o.value==="("&&!/[!=<:]/.test(x)||x==="<"&&!/<([!=]|\w+>)/.test(J()))&&(M=`\\${u}`),C({type:"text",value:u,output:M});continue}if(t.dot!==!0&&(o.type==="slash"||o.type==="bos")){C({type:"qmark",value:u,output:z});continue}C({type:"qmark",value:u,output:L});continue}if(u==="!"){if(t.noextglob!==!0&&b()==="("&&(b(2)!=="?"||!/[!=<:]/.test(b(3)))){xe("negate",u);continue}if(t.nonegate!==!0&&l.index===0){mr();continue}}if(u==="+"){if(t.noextglob!==!0&&b()==="("&&b(2)!=="?"){xe("plus",u);continue}if(o&&o.value==="("||t.regex===!1){C({type:"plus",value:u,output:f});continue}if(o&&(o.type==="bracket"||o.type==="paren"||o.type==="brace")||l.parens>0){C({type:"plus",value:u});continue}C({type:"plus",value:f});continue}if(u==="@"){if(t.noextglob!==!0&&b()==="("&&b(2)!=="?"){C({type:"at",extglob:!0,value:u,output:""});continue}C({type:"text",value:u});continue}if(u!=="*"){(u==="$"||u==="^")&&(u=`\\${u}`);let d=Nn.exec(J());d&&(u+=d[0],l.index+=d[0].length),C({type:"text",value:u});continue}if(o&&(o.type==="globstar"||o.star===!0)){o.type="star",o.star=!0,o.value+=u,o.output=k,l.backtrack=!0,l.globstar=!0,X(u);continue}let A=J();if(t.noextglob!==!0&&/^\([^?]/.test(A)){xe("star",u);continue}if(o.type==="star"){if(t.noglobstar===!0){X(u);continue}let d=o.prev,x=d.prev,M=d.type==="slash"||d.type==="bos",j=x&&(x.type==="star"||x.type==="globstar");if(t.bash===!0&&(!M||A[0]&&A[0]!=="/")){C({type:"star",value:u,output:""});continue}let G=l.braces>0&&(d.type==="comma"||d.type==="brace"),Ie=H.length&&(d.type==="pipe"||d.type==="paren");if(!M&&d.type!=="paren"&&!G&&!Ie){C({type:"star",value:u,output:""});continue}for(;A.slice(0,3)==="/**";){let Ce=e[l.index+4];if(Ce&&Ce!=="/")break;A=A.slice(3),X("/**",3)}if(d.type==="bos"&&P()){o.type="globstar",o.value+=u,o.output=K(t),l.output=o.output,l.globstar=!0,X(u);continue}if(d.type==="slash"&&d.prev.type!=="bos"&&!j&&P()){l.output=l.output.slice(0,-(d.output+o.output).length),d.output=`(?:${d.output}`,o.type="globstar",o.output=K(t)+(t.strictSlashes?")":"|$)"),o.value+=u,l.globstar=!0,l.output+=d.output+o.output,X(u);continue}if(d.type==="slash"&&d.prev.type!=="bos"&&A[0]==="/"){let Ce=A[1]!==void 0?"|$":"";l.output=l.output.slice(0,-(d.output+o.output).length),d.output=`(?:${d.output}`,o.type="globstar",o.output=`${K(t)}${$}|${$}${Ce})`,o.value+=u,l.output+=d.output+o.output,l.globstar=!0,X(u+V()),C({type:"slash",value:"/",output:""});continue}if(d.type==="bos"&&A[0]==="/"){o.type="globstar",o.value+=u,o.output=`(?:^|${$}|${K(t)}${$})`,l.output=o.output,l.globstar=!0,X(u+V()),C({type:"slash",value:"/",output:""});continue}l.output=l.output.slice(0,-o.output.length),o.type="globstar",o.output=K(t),o.value+=u,l.output+=o.output,l.globstar=!0,X(u);continue}let O={type:"star",value:u,output:k};if(t.bash===!0){O.output=".*?",(o.type==="bos"||o.type==="slash")&&(O.output=g+O.output),C(O);continue}if(o&&(o.type==="bracket"||o.type==="paren")&&t.regex===!0){O.output=u,C(O);continue}(l.index===l.start||o.type==="slash"||o.type==="dot")&&(o.type==="dot"?(l.output+=S,o.output+=S):t.dot===!0?(l.output+=T,o.output+=T):(l.output+=g,o.output+=g),b()!=="*"&&(l.output+=_,o.output+=_)),C(O)}for(;l.brackets>0;){if(t.strictBrackets===!0)throw new SyntaxError(de("closing","]"));l.output=Y.escapeLast(l.output,"["),oe("brackets")}for(;l.parens>0;){if(t.strictBrackets===!0)throw new SyntaxError(de("closing",")"));l.output=Y.escapeLast(l.output,"("),oe("parens")}for(;l.braces>0;){if(t.strictBrackets===!0)throw new SyntaxError(de("closing","}"));l.output=Y.escapeLast(l.output,"{"),oe("braces")}if(t.strictSlashes!==!0&&(o.type==="star"||o.type==="bracket")&&C({type:"maybe_slash",value:"",output:`${$}?`}),l.backtrack===!0){l.output="";for(let A of l.tokens)l.output+=A.output!=null?A.output:A.value,A.suffix&&(l.output+=A.suffix)}return l};Vt.fastpaths=(e,r)=>{let t={...r},n=typeof t.maxLength=="number"?Math.min(Le,t.maxLength):Le,s=e.length;if(s>n)throw new SyntaxError(`Input length: ${s}, exceeds maximum allowed length: ${n}`);e=zt[e]||e;let i=Y.isWindows(r),{DOT_LITERAL:a,SLASH_LITERAL:c,ONE_CHAR:p,DOTS_SLASH:m,NO_DOT:h,NO_DOTS:R,NO_DOTS_SLASH:f,STAR:$,START_ANCHOR:_}=ke.globChars(i),y=t.dot?R:h,E=t.dot?f:h,S=t.capture?"":"?:",T={negated:!1,prefix:""},L=t.bash===!0?".*?":$;t.capture&&(L=`(${L})`);let z=g=>g.noglobstar===!0?L:`(${S}(?:(?!${_}${g.dot?m:a}).)*?)`,I=g=>{switch(g){case"*":return`${y}${p}${L}`;case".*":return`${a}${p}${L}`;case"*.*":return`${y}${L}${a}${p}${L}`;case"*/*":return`${y}${L}${c}${p}${E}${L}`;case"**":return y+z(t);case"**/*":return`(?:${y}${z(t)}${c})?${E}${p}${L}`;case"**/*.*":return`(?:${y}${z(t)}${c})?${E}${L}${a}${p}${L}`;case"**/.*":return`(?:${y}${z(t)}${c})?${a}${p}${L}`;default:{let v=/^(.*?)\.(\w+)$/.exec(g);if(!v)return;let k=I(v[1]);return k?k+a+v[2]:void 0}}},re=Y.removePrefix(e,T),K=I(re);return K&&t.strictSlashes!==!0&&(K+=`${c}?`),K};Jt.exports=Vt});var rr=q((ls,tr)=>{"use strict";var Pn=W("path"),Mn=Yt(),Ze=er(),Ye=Re(),Dn=me(),Un=e=>e&&typeof e=="object"&&!Array.isArray(e),D=(e,r,t=!1)=>{if(Array.isArray(e)){let h=e.map(f=>D(f,r,t));return f=>{for(let $ of h){let _=$(f);if(_)return _}return!1}}let n=Un(e)&&e.tokens&&e.input;if(e===""||typeof e!="string"&&!n)throw new TypeError("Expected pattern to be a non-empty string");let s=r||{},i=Ye.isWindows(r),a=n?D.compileRe(e,r):D.makeRe(e,r,!1,!0),c=a.state;delete a.state;let p=()=>!1;if(s.ignore){let h={...r,ignore:null,onMatch:null,onResult:null};p=D(s.ignore,h,t)}let m=(h,R=!1)=>{let{isMatch:f,match:$,output:_}=D.test(h,a,r,{glob:e,posix:i}),y={glob:e,state:c,regex:a,posix:i,input:h,output:_,match:$,isMatch:f};return typeof s.onResult=="function"&&s.onResult(y),f===!1?(y.isMatch=!1,R?y:!1):p(h)?(typeof s.onIgnore=="function"&&s.onIgnore(y),y.isMatch=!1,R?y:!1):(typeof s.onMatch=="function"&&s.onMatch(y),R?y:!0)};return t&&(m.state=c),m};D.test=(e,r,t,{glob:n,posix:s}={})=>{if(typeof e!="string")throw new TypeError("Expected input to be a string");if(e==="")return{isMatch:!1,output:""};let i=t||{},a=i.format||(s?Ye.toPosixSlashes:null),c=e===n,p=c&&a?a(e):e;return c===!1&&(p=a?a(e):e,c=p===n),(c===!1||i.capture===!0)&&(i.matchBase===!0||i.basename===!0?c=D.matchBase(e,r,t,s):c=r.exec(p)),{isMatch:Boolean(c),match:c,output:p}};D.matchBase=(e,r,t,n=Ye.isWindows(t))=>(r instanceof RegExp?r:D.makeRe(r,t)).test(Pn.basename(e));D.isMatch=(e,r,t)=>D(r,t)(e);D.parse=(e,r)=>Array.isArray(e)?e.map(t=>D.parse(t,r)):Ze(e,{...r,fastpaths:!1});D.scan=(e,r)=>Mn(e,r);D.compileRe=(e,r,t=!1,n=!1)=>{if(t===!0)return e.output;let s=r||{},i=s.contains?"":"^",a=s.contains?"":"$",c=`${i}(?:${e.output})${a}`;e&&e.negated===!0&&(c=`^(?!${c}).*$`);let p=D.toRegex(c,r);return n===!0&&(p.state=e),p};D.makeRe=(e,r={},t=!1,n=!1)=>{if(!e||typeof e!="string")throw new TypeError("Expected a non-empty string");let s={negated:!1,fastpaths:!0};return r.fastpaths!==!1&&(e[0]==="."||e[0]==="*")&&(s.output=Ze.fastpaths(e,r)),s.output||(s=Ze(e,r)),D.compileRe(s,r,t,n)};D.toRegex=(e,r)=>{try{let t=r||{};return new RegExp(e,t.flags||(t.nocase?"i":""))}catch(t){if(r&&r.debug===!0)throw t;return/$^/}};D.constants=Dn;tr.exports=D});var sr=q((fs,nr)=>{"use strict";nr.exports=rr()});var cr=q((ps,ur)=>{"use strict";var ir=W("util"),or=Pt(),ae=sr(),ze=Re(),ar=e=>e===""||e==="./",N=(e,r,t)=>{r=[].concat(r),e=[].concat(e);let n=new Set,s=new Set,i=new Set,a=0,c=h=>{i.add(h.output),t&&t.onResult&&t.onResult(h)};for(let h=0;h!n.has(h));if(t&&m.length===0){if(t.failglob===!0)throw new Error(`No matches found for "${r.join(", ")}"`);if(t.nonull===!0||t.nullglob===!0)return t.unescape?r.map(h=>h.replace(/\\/g,"")):r}return m};N.match=N;N.matcher=(e,r)=>ae(e,r);N.isMatch=(e,r,t)=>ae(r,t)(e);N.any=N.isMatch;N.not=(e,r,t={})=>{r=[].concat(r).map(String);let n=new Set,s=[],a=N(e,r,{...t,onResult:c=>{t.onResult&&t.onResult(c),s.push(c.output)}});for(let c of s)a.includes(c)||n.add(c);return[...n]};N.contains=(e,r,t)=>{if(typeof e!="string")throw new TypeError(`Expected a string: "${ir.inspect(e)}"`);if(Array.isArray(r))return r.some(n=>N.contains(e,n,t));if(typeof r=="string"){if(ar(e)||ar(r))return!1;if(e.includes(r)||e.startsWith("./")&&e.slice(2).includes(r))return!0}return N.isMatch(e,r,{...t,contains:!0})};N.matchKeys=(e,r,t)=>{if(!ze.isObject(e))throw new TypeError("Expected the first argument to be an object");let n=N(Object.keys(e),r,t),s={};for(let i of n)s[i]=e[i];return s};N.some=(e,r,t)=>{let n=[].concat(e);for(let s of[].concat(r)){let i=ae(String(s),t);if(n.some(a=>i(a)))return!0}return!1};N.every=(e,r,t)=>{let n=[].concat(e);for(let s of[].concat(r)){let i=ae(String(s),t);if(!n.every(a=>i(a)))return!1}return!0};N.all=(e,r,t)=>{if(typeof e!="string")throw new TypeError(`Expected a string: "${ir.inspect(e)}"`);return[].concat(r).every(n=>ae(n,t)(e))};N.capture=(e,r,t)=>{let n=ze.isWindows(t),i=ae.makeRe(String(e),{...t,capture:!0}).exec(n?ze.toPosixSlashes(r):r);if(i)return i.slice(1).map(a=>a===void 0?"":a)};N.makeRe=(...e)=>ae.makeRe(...e);N.scan=(...e)=>ae.scan(...e);N.parse=(e,r)=>{let t=[];for(let n of[].concat(e||[]))for(let s of or(String(n),r))t.push(ae.parse(s,r));return t};N.braces=(e,r)=>{if(typeof e!="string")throw new TypeError("Expected a string");return r&&r.nobrace===!0||!/\{.*\}/.test(e)?[e]:or(e,r)};N.braceExpand=(e,r)=>{if(typeof e!="string")throw new TypeError("Expected a string");return N.braces(e,{...r,expand:!0})};ur.exports=N});var fr=q((hs,lr)=>{"use strict";lr.exports=(e,...r)=>new Promise(t=>{t(e(...r))})});var hr=q((ds,Ve)=>{"use strict";var Gn=fr(),pr=e=>{if(e<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let r=[],t=0,n=()=>{t--,r.length>0&&r.shift()()},s=(c,p,...m)=>{t++;let h=Gn(c,...m);p(h),h.then(n,n)},i=(c,p,...m)=>{tnew Promise(m=>i(c,m,...p));return Object.defineProperties(a,{activeCount:{get:()=>t},pendingCount:{get:()=>r.length}}),a};Ve.exports=pr;Ve.exports.default=pr});var jn={};Cr(jn,{default:()=>Wn});var Se=W("@yarnpkg/cli"),ne=W("@yarnpkg/core"),et=W("@yarnpkg/core"),ue=W("clipanion"),ce=class extends Se.BaseCommand{constructor(){super(...arguments);this.json=ue.Option.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.production=ue.Option.Boolean("--production",!1,{description:"Only install regular dependencies by omitting dev dependencies"});this.all=ue.Option.Boolean("-A,--all",!1,{description:"Install the entire project"});this.workspaces=ue.Option.Rest()}async execute(){let t=await ne.Configuration.find(this.context.cwd,this.context.plugins),{project:n,workspace:s}=await ne.Project.find(t,this.context.cwd),i=await ne.Cache.find(t);await n.restoreInstallState({restoreResolutions:!1});let a;if(this.all)a=new Set(n.workspaces);else if(this.workspaces.length===0){if(!s)throw new Se.WorkspaceRequiredError(n.cwd,this.context.cwd);a=new Set([s])}else a=new Set(this.workspaces.map(p=>n.getWorkspaceByIdent(et.structUtils.parseIdent(p))));for(let p of a)for(let m of this.production?["dependencies"]:ne.Manifest.hardDependencies)for(let h of p.manifest.getForScope(m).values()){let R=n.tryWorkspaceByDescriptor(h);R!==null&&a.add(R)}for(let p of n.workspaces)a.has(p)?this.production&&p.manifest.devDependencies.clear():(p.manifest.installConfig=p.manifest.installConfig||{},p.manifest.installConfig.selfReferences=!1,p.manifest.dependencies.clear(),p.manifest.devDependencies.clear(),p.manifest.peerDependencies.clear(),p.manifest.scripts.clear());return(await ne.StreamReport.start({configuration:t,json:this.json,stdout:this.context.stdout,includeLogs:!0},async p=>{await n.install({cache:i,report:p,persistProject:!1})})).exitCode()}};ce.paths=[["workspaces","focus"]],ce.usage=ue.Command.Usage({category:"Workspace-related commands",description:"install a single workspace and its dependencies",details:"\n This command will run an install as if the specified workspaces (and all other workspaces they depend on) were the only ones in the project. If no workspaces are explicitly listed, the active one will be assumed.\n\n Note that this command is only very moderately useful when using zero-installs, since the cache will contain all the packages anyway - meaning that the only difference between a full install and a focused install would just be a few extra lines in the `.pnp.cjs` file, at the cost of introducing an extra complexity.\n\n If the `-A,--all` flag is set, the entire project will be installed. Combine with `--production` to replicate the old `yarn install --production`.\n "});var Ne=W("@yarnpkg/cli"),ge=W("@yarnpkg/core"),_e=W("@yarnpkg/core"),F=W("@yarnpkg/core"),gr=W("@yarnpkg/plugin-git"),U=W("clipanion"),Oe=Be(cr()),Ar=Be(hr()),te=Be(W("typanion")),pe=class extends Ne.BaseCommand{constructor(){super(...arguments);this.recursive=U.Option.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.from=U.Option.Array("--from",[],{description:"An array of glob pattern idents from which to base any recursion"});this.all=U.Option.Boolean("-A,--all",!1,{description:"Run the command on all workspaces of a project"});this.verbose=U.Option.Boolean("-v,--verbose",!1,{description:"Prefix each output line with the name of the originating workspace"});this.parallel=U.Option.Boolean("-p,--parallel",!1,{description:"Run the commands in parallel"});this.interlaced=U.Option.Boolean("-i,--interlaced",!1,{description:"Print the output of commands in real-time instead of buffering it"});this.jobs=U.Option.String("-j,--jobs",{description:"The maximum number of parallel tasks that the execution will be limited to; or `unlimited`",validator:te.isOneOf([te.isEnum(["unlimited"]),te.applyCascade(te.isNumber(),[te.isInteger(),te.isAtLeast(1)])])});this.topological=U.Option.Boolean("-t,--topological",!1,{description:"Run the command after all workspaces it depends on (regular) have finished"});this.topologicalDev=U.Option.Boolean("--topological-dev",!1,{description:"Run the command after all workspaces it depends on (regular + dev) have finished"});this.include=U.Option.Array("--include",[],{description:"An array of glob pattern idents; only matching workspaces will be traversed"});this.exclude=U.Option.Array("--exclude",[],{description:"An array of glob pattern idents; matching workspaces won't be traversed"});this.publicOnly=U.Option.Boolean("--no-private",{description:"Avoid running the command on private workspaces"});this.since=U.Option.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.commandName=U.Option.String();this.args=U.Option.Proxy()}async execute(){let t=await ge.Configuration.find(this.context.cwd,this.context.plugins),{project:n,workspace:s}=await ge.Project.find(t,this.context.cwd);if(!this.all&&!s)throw new Ne.WorkspaceRequiredError(n.cwd,this.context.cwd);await n.restoreInstallState();let i=this.cli.process([this.commandName,...this.args]),a=i.path.length===1&&i.path[0]==="run"&&typeof i.scriptName<"u"?i.scriptName:null;if(i.path.length===0)throw new U.UsageError("Invalid subcommand name for iteration - use the 'run' keyword if you wish to execute a script");let c=this.all?n.topLevelWorkspace:s,p=this.since?Array.from(await gr.gitUtils.fetchChangedWorkspaces({ref:this.since,project:n})):[c,...this.from.length>0?c.getRecursiveWorkspaceChildren():[]],m=g=>Oe.default.isMatch(F.structUtils.stringifyIdent(g.locator),this.from),h=this.from.length>0?p.filter(m):p,R=new Set([...h,...h.map(g=>[...this.recursive?this.since?g.getRecursiveWorkspaceDependents():g.getRecursiveWorkspaceDependencies():g.getRecursiveWorkspaceChildren()]).flat()]),f=[],$=!1;if(a!=null&&a.includes(":")){for(let g of n.workspaces)if(g.manifest.scripts.has(a)&&($=!$,$===!1))break}for(let g of R)a&&!g.manifest.scripts.has(a)&&!$&&!(await ge.scriptUtils.getWorkspaceAccessibleBinaries(g)).has(a)||a===process.env.npm_lifecycle_event&&g.cwd===s.cwd||this.include.length>0&&!Oe.default.isMatch(F.structUtils.stringifyIdent(g.locator),this.include)||this.exclude.length>0&&Oe.default.isMatch(F.structUtils.stringifyIdent(g.locator),this.exclude)||this.publicOnly&&g.manifest.private===!0||f.push(g);let _=this.parallel?this.jobs==="unlimited"?1/0:Number(this.jobs)||Math.ceil(F.nodeUtils.availableParallelism()/2):1,y=_===1?!1:this.parallel,E=y?this.interlaced:!0,S=(0,Ar.default)(_),T=new Map,L=new Set,z=0,I=null,re=!1,K=await _e.StreamReport.start({configuration:t,stdout:this.context.stdout,includePrefix:!1},async g=>{let v=async(k,{commandIndex:l})=>{if(re)return-1;!y&&this.verbose&&l>1&&g.reportSeparator();let H=qn(k,{configuration:t,verbose:this.verbose,commandIndex:l}),[w,B]=dr(g,{prefix:H,interlaced:E}),[o,u]=dr(g,{prefix:H,interlaced:E});try{this.verbose&&g.reportInfo(null,`${H} Process started`);let P=Date.now(),b=await this.cli.run([this.commandName,...this.args],{cwd:k.cwd,stdout:w,stderr:o})||0;w.end(),o.end(),await B,await u;let V=Date.now();if(this.verbose){let J=t.get("enableTimers")?`, completed in ${F.formatUtils.pretty(t,V-P,F.formatUtils.Type.DURATION)}`:"";g.reportInfo(null,`${H} Process exited (exit code ${b})${J}`)}return b===130&&(re=!0,I=b),b}catch(P){throw w.end(),o.end(),await B,await u,P}};for(let k of f)T.set(k.anchoredLocator.locatorHash,k);for(;T.size>0&&!g.hasErrors();){let k=[];for(let[w,B]of T){if(L.has(B.anchoredDescriptor.descriptorHash))continue;let o=!0;if(this.topological||this.topologicalDev){let u=this.topologicalDev?new Map([...B.manifest.dependencies,...B.manifest.devDependencies]):B.manifest.dependencies;for(let P of u.values()){let b=n.tryWorkspaceByDescriptor(P);if(o=b===null||!T.has(b.anchoredLocator.locatorHash),!o)break}}if(!!o&&(L.add(B.anchoredDescriptor.descriptorHash),k.push(S(async()=>{let u=await v(B,{commandIndex:++z});return T.delete(w),L.delete(B.anchoredDescriptor.descriptorHash),u})),!y))break}if(k.length===0){let w=Array.from(T.values()).map(B=>F.structUtils.prettyLocator(t,B.anchoredLocator)).join(", ");g.reportError(_e.MessageName.CYCLIC_DEPENDENCIES,`Dependency cycle detected (${w})`);return}let H=(await Promise.all(k)).find(w=>w!==0);I===null&&(I=typeof H<"u"?1:I),(this.topological||this.topologicalDev)&&typeof H<"u"&&g.reportError(_e.MessageName.UNNAMED,"The command failed for workspaces that are depended upon by other workspaces; can't satisfy the dependency graph")}});return I!==null?I:K.exitCode()}};pe.paths=[["workspaces","foreach"]],pe.usage=U.Command.Usage({category:"Workspace-related commands",description:"run a command on all workspaces",details:"\n This command will run a given sub-command on current and all its descendant workspaces. Various flags can alter the exact behavior of the command:\n\n - If `-p,--parallel` is set, the commands will be ran in parallel; they'll by default be limited to a number of parallel tasks roughly equal to half your core number, but that can be overridden via `-j,--jobs`, or disabled by setting `-j unlimited`.\n\n - If `-p,--parallel` and `-i,--interlaced` are both set, Yarn will print the lines from the output as it receives them. If `-i,--interlaced` wasn't set, it would instead buffer the output from each process and print the resulting buffers only after their source processes have exited.\n\n - If `-t,--topological` is set, Yarn will only run the command after all workspaces that it depends on through the `dependencies` field have successfully finished executing. If `--topological-dev` is set, both the `dependencies` and `devDependencies` fields will be considered when figuring out the wait points.\n\n - If `-A,--all` is set, Yarn will run the command on all the workspaces of a project. By default yarn runs the command only on current and all its descendant workspaces.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If `--from` is set, Yarn will use the packages matching the 'from' glob as the starting point for any recursive search.\n\n - If `--since` is set, Yarn will only run the command on workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - The command may apply to only some workspaces through the use of `--include` which acts as a whitelist. The `--exclude` flag will do the opposite and will be a list of packages that mustn't execute the script. Both flags accept glob patterns (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n Adding the `-v,--verbose` flag will cause Yarn to print more information; in particular the name of the workspace that generated the output will be printed at the front of each line.\n\n If the command is `run` and the script being run does not exist the child workspace will be skipped without error.\n ",examples:[["Publish current and all descendant packages","yarn workspaces foreach npm publish --tolerate-republish"],["Run build script on current and all descendant packages","yarn workspaces foreach run build"],["Run build script on current and all descendant packages in parallel, building package dependencies first","yarn workspaces foreach -pt run build"],["Run build script on several packages and all their dependencies, building dependencies first","yarn workspaces foreach -ptR --from '{workspace-a,workspace-b}' run build"]]});function dr(e,{prefix:r,interlaced:t}){let n=e.createStreamReporter(r),s=new F.miscUtils.DefaultStream;s.pipe(n,{end:!1}),s.on("finish",()=>{n.end()});let i=new Promise(c=>{n.on("finish",()=>{c(s.active)})});if(t)return[s,i];let a=new F.miscUtils.BufferStream;return a.pipe(s,{end:!1}),a.on("finish",()=>{s.end()}),[a,i]}function qn(e,{configuration:r,commandIndex:t,verbose:n}){if(!n)return null;let i=`[${F.structUtils.stringifyIdent(e.locator)}]:`,a=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],c=a[t%a.length];return F.formatUtils.pretty(r,i,c)}var Kn={commands:[ce,pe]},Wn=Kn;return wr(jn);})(); +/*! + * fill-range + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Licensed under the MIT License. + */ +/*! + * is-number + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * to-regex-range + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Released under the MIT License. + */ +return plugin; +} +}; diff --git a/.yarn/releases/yarn-3.8.0.cjs b/.yarn/releases/yarn-3.8.0.cjs new file mode 100755 index 000000000..ff0891825 --- /dev/null +++ b/.yarn/releases/yarn-3.8.0.cjs @@ -0,0 +1,875 @@ +#!/usr/bin/env node +/* eslint-disable */ +//prettier-ignore +(()=>{var Lge=Object.create;var lS=Object.defineProperty;var Oge=Object.getOwnPropertyDescriptor;var Mge=Object.getOwnPropertyNames;var Kge=Object.getPrototypeOf,Uge=Object.prototype.hasOwnProperty;var J=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+r+'" is not supported')});var Hge=(r,e)=>()=>(r&&(e=r(r=0)),e);var I=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ct=(r,e)=>{for(var t in e)lS(r,t,{get:e[t],enumerable:!0})},jge=(r,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Mge(e))!Uge.call(r,n)&&n!==t&&lS(r,n,{get:()=>e[n],enumerable:!(i=Oge(e,n))||i.enumerable});return r};var ve=(r,e,t)=>(t=r!=null?Lge(Kge(r)):{},jge(e||!r||!r.__esModule?lS(t,"default",{value:r,enumerable:!0}):t,r));var kK=I((nZe,PK)=>{PK.exports=xK;xK.sync=lfe;var SK=J("fs");function Afe(r,e){var t=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!t||(t=t.split(";"),t.indexOf("")!==-1))return!0;for(var i=0;i{NK.exports=RK;RK.sync=cfe;var DK=J("fs");function RK(r,e,t){DK.stat(r,function(i,n){t(i,i?!1:FK(n,e))})}function cfe(r,e){return FK(DK.statSync(r),e)}function FK(r,e){return r.isFile()&&ufe(r,e)}function ufe(r,e){var t=r.mode,i=r.uid,n=r.gid,s=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),o=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),a=parseInt("100",8),l=parseInt("010",8),c=parseInt("001",8),u=a|l,g=t&c||t&l&&n===o||t&a&&i===s||t&u&&s===0;return g}});var OK=I((aZe,LK)=>{var oZe=J("fs"),AI;process.platform==="win32"||global.TESTING_WINDOWS?AI=kK():AI=TK();LK.exports=SS;SS.sync=gfe;function SS(r,e,t){if(typeof e=="function"&&(t=e,e={}),!t){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(i,n){SS(r,e||{},function(s,o){s?n(s):i(o)})})}AI(r,e||{},function(i,n){i&&(i.code==="EACCES"||e&&e.ignoreErrors)&&(i=null,n=!1),t(i,n)})}function gfe(r,e){try{return AI.sync(r,e||{})}catch(t){if(e&&e.ignoreErrors||t.code==="EACCES")return!1;throw t}}});var YK=I((AZe,GK)=>{var kg=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",MK=J("path"),ffe=kg?";":":",KK=OK(),UK=r=>Object.assign(new Error(`not found: ${r}`),{code:"ENOENT"}),HK=(r,e)=>{let t=e.colon||ffe,i=r.match(/\//)||kg&&r.match(/\\/)?[""]:[...kg?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(t)],n=kg?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=kg?n.split(t):[""];return kg&&r.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:i,pathExt:s,pathExtExe:n}},jK=(r,e,t)=>{typeof e=="function"&&(t=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=HK(r,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(UK(r));let h=i[c],p=/^".*"$/.test(h)?h.slice(1,-1):h,d=MK.join(p,r),m=!p&&/^\.[\\\/]/.test(r)?r.slice(0,2)+d:d;u(l(m,c,0))}),l=(c,u,g)=>new Promise((h,p)=>{if(g===n.length)return h(a(u+1));let d=n[g];KK(c+d,{pathExt:s},(m,y)=>{if(!m&&y)if(e.all)o.push(c+d);else return h(c+d);return h(l(c,u,g+1))})});return t?a(0).then(c=>t(null,c),t):a(0)},hfe=(r,e)=>{e=e||{};let{pathEnv:t,pathExt:i,pathExtExe:n}=HK(r,e),s=[];for(let o=0;o{"use strict";var qK=(r={})=>{let e=r.env||process.env;return(r.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(i=>i.toUpperCase()==="PATH")||"Path"};vS.exports=qK;vS.exports.default=qK});var XK=I((cZe,VK)=>{"use strict";var WK=J("path"),pfe=YK(),dfe=JK();function zK(r,e){let t=r.options.env||process.env,i=process.cwd(),n=r.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(r.options.cwd)}catch{}let o;try{o=pfe.sync(r.command,{path:t[dfe({env:t})],pathExt:e?WK.delimiter:void 0})}catch{}finally{s&&process.chdir(i)}return o&&(o=WK.resolve(n?r.options.cwd:"",o)),o}function Cfe(r){return zK(r)||zK(r,!0)}VK.exports=Cfe});var ZK=I((uZe,PS)=>{"use strict";var xS=/([()\][%!^"`<>&|;, *?])/g;function mfe(r){return r=r.replace(xS,"^$1"),r}function Efe(r,e){return r=`${r}`,r=r.replace(/(\\*)"/g,'$1$1\\"'),r=r.replace(/(\\*)$/,"$1$1"),r=`"${r}"`,r=r.replace(xS,"^$1"),e&&(r=r.replace(xS,"^$1")),r}PS.exports.command=mfe;PS.exports.argument=Efe});var $K=I((gZe,_K)=>{"use strict";_K.exports=/^#!(.*)/});var tU=I((fZe,eU)=>{"use strict";var Ife=$K();eU.exports=(r="")=>{let e=r.match(Ife);if(!e)return null;let[t,i]=e[0].replace(/#! ?/,"").split(" "),n=t.split("/").pop();return n==="env"?i:i?`${n} ${i}`:n}});var iU=I((hZe,rU)=>{"use strict";var kS=J("fs"),yfe=tU();function wfe(r){let t=Buffer.alloc(150),i;try{i=kS.openSync(r,"r"),kS.readSync(i,t,0,150,0),kS.closeSync(i)}catch{}return yfe(t.toString())}rU.exports=wfe});var aU=I((pZe,oU)=>{"use strict";var Bfe=J("path"),nU=XK(),sU=ZK(),Qfe=iU(),bfe=process.platform==="win32",Sfe=/\.(?:com|exe)$/i,vfe=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function xfe(r){r.file=nU(r);let e=r.file&&Qfe(r.file);return e?(r.args.unshift(r.file),r.command=e,nU(r)):r.file}function Pfe(r){if(!bfe)return r;let e=xfe(r),t=!Sfe.test(e);if(r.options.forceShell||t){let i=vfe.test(e);r.command=Bfe.normalize(r.command),r.command=sU.command(r.command),r.args=r.args.map(s=>sU.argument(s,i));let n=[r.command].concat(r.args).join(" ");r.args=["/d","/s","/c",`"${n}"`],r.command=process.env.comspec||"cmd.exe",r.options.windowsVerbatimArguments=!0}return r}function kfe(r,e,t){e&&!Array.isArray(e)&&(t=e,e=null),e=e?e.slice(0):[],t=Object.assign({},t);let i={command:r,args:e,options:t,file:void 0,original:{command:r,args:e}};return t.shell?i:Pfe(i)}oU.exports=kfe});var cU=I((dZe,lU)=>{"use strict";var DS=process.platform==="win32";function RS(r,e){return Object.assign(new Error(`${e} ${r.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${r.command}`,path:r.command,spawnargs:r.args})}function Dfe(r,e){if(!DS)return;let t=r.emit;r.emit=function(i,n){if(i==="exit"){let s=AU(n,e,"spawn");if(s)return t.call(r,"error",s)}return t.apply(r,arguments)}}function AU(r,e){return DS&&r===1&&!e.file?RS(e.original,"spawn"):null}function Rfe(r,e){return DS&&r===1&&!e.file?RS(e.original,"spawnSync"):null}lU.exports={hookChildProcess:Dfe,verifyENOENT:AU,verifyENOENTSync:Rfe,notFoundError:RS}});var TS=I((CZe,Dg)=>{"use strict";var uU=J("child_process"),FS=aU(),NS=cU();function gU(r,e,t){let i=FS(r,e,t),n=uU.spawn(i.command,i.args,i.options);return NS.hookChildProcess(n,i),n}function Ffe(r,e,t){let i=FS(r,e,t),n=uU.spawnSync(i.command,i.args,i.options);return n.error=n.error||NS.verifyENOENTSync(n.status,i),n}Dg.exports=gU;Dg.exports.spawn=gU;Dg.exports.sync=Ffe;Dg.exports._parse=FS;Dg.exports._enoent=NS});var hU=I((mZe,fU)=>{"use strict";function Nfe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function $l(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,$l)}Nfe($l,Error);$l.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,h=1;g>",re=Ue(">>",!1),de=">&",Ze=Ue(">&",!1),vt=">",mt=Ue(">",!1),Tr="<<<",ti=Ue("<<<",!1),ui="<&",gr=Ue("<&",!1),gi="<",ri=Ue("<",!1),Ms=function(C){return{type:"argument",segments:[].concat(...C)}},fr=function(C){return C},Ei="$'",rs=Ue("$'",!1),ua="'",CA=Ue("'",!1),gg=function(C){return[{type:"text",text:C}]},is='""',mA=Ue('""',!1),ga=function(){return{type:"text",text:""}},wp='"',EA=Ue('"',!1),IA=function(C){return C},Ir=function(C){return{type:"arithmetic",arithmetic:C,quoted:!0}},Nl=function(C){return{type:"shell",shell:C,quoted:!0}},fg=function(C){return{type:"variable",...C,quoted:!0}},Io=function(C){return{type:"text",text:C}},hg=function(C){return{type:"arithmetic",arithmetic:C,quoted:!1}},Bp=function(C){return{type:"shell",shell:C,quoted:!1}},Qp=function(C){return{type:"variable",...C,quoted:!1}},br=function(C){return{type:"glob",pattern:C}},Ri=/^[^']/,yo=Ve(["'"],!0,!1),Nn=function(C){return C.join("")},ae=/^[^$"]/,yt=Ve(["$",'"'],!0,!1),Tl=`\\ +`,Tn=Ue(`\\ +`,!1),ns=function(){return""},ss="\\",ut=Ue("\\",!1),wo=/^[\\$"`]/,At=Ve(["\\","$",'"',"`"],!1,!1),An=function(C){return C},b="\\a",Nt=Ue("\\a",!1),pg=function(){return"a"},Ll="\\b",bp=Ue("\\b",!1),Sp=function(){return"\b"},vp=/^[Ee]/,xp=Ve(["E","e"],!1,!1),Pp=function(){return"\x1B"},j="\\f",Et=Ue("\\f",!1),yA=function(){return"\f"},Wi="\\n",Ol=Ue("\\n",!1),ze=function(){return` +`},fa="\\r",dg=Ue("\\r",!1),OE=function(){return"\r"},kp="\\t",ME=Ue("\\t",!1),sr=function(){return" "},Ln="\\v",Ml=Ue("\\v",!1),Dp=function(){return"\v"},Ks=/^[\\'"?]/,ha=Ve(["\\","'",'"',"?"],!1,!1),ln=function(C){return String.fromCharCode(parseInt(C,16))},Ne="\\x",Cg=Ue("\\x",!1),Kl="\\u",Us=Ue("\\u",!1),Ul="\\U",wA=Ue("\\U",!1),mg=function(C){return String.fromCodePoint(parseInt(C,16))},Eg=/^[0-7]/,pa=Ve([["0","7"]],!1,!1),da=/^[0-9a-fA-f]/,tt=Ve([["0","9"],["a","f"],["A","f"]],!1,!1),Bo=nt(),BA="{}",Rp=Ue("{}",!1),Ca=function(){return"{}"},Hl="-",jl=Ue("-",!1),QA="+",ma=Ue("+",!1),Fp=".",KE=Ue(".",!1),Gl=function(C,Q,R){return{type:"number",value:(C==="-"?-1:1)*parseFloat(Q.join("")+"."+R.join(""))}},UE=function(C,Q){return{type:"number",value:(C==="-"?-1:1)*parseInt(Q.join(""))}},Np=function(C){return{type:"variable",...C}},Yl=function(C){return{type:"variable",name:C}},Lr=function(C){return C},HE="*",Hs=Ue("*",!1),js="/",Ig=Ue("/",!1),bA=function(C,Q,R){return{type:Q==="*"?"multiplication":"division",right:R}},D=function(C,Q){return Q.reduce((R,U)=>({left:R,...U}),C)},Y=function(C,Q,R){return{type:Q==="+"?"addition":"subtraction",right:R}},pe="$((",Le=Ue("$((",!1),ke="))",Je=Ue("))",!1),pt=function(C){return C},Xt="$(",Ea=Ue("$(",!1),D1=function(C){return C},Gs="${",yg=Ue("${",!1),Jb=":-",R1=Ue(":-",!1),F1=function(C,Q){return{name:C,defaultValue:Q}},Wb=":-}",N1=Ue(":-}",!1),T1=function(C){return{name:C,defaultValue:[]}},zb=":+",L1=Ue(":+",!1),O1=function(C,Q){return{name:C,alternativeValue:Q}},Vb=":+}",M1=Ue(":+}",!1),K1=function(C){return{name:C,alternativeValue:[]}},Xb=function(C){return{name:C}},U1="$",H1=Ue("$",!1),j1=function(C){return e.isGlobPattern(C)},G1=function(C){return C},Zb=/^[a-zA-Z0-9_]/,_b=Ve([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),$b=function(){return Ie()},ql=/^[$@*?#a-zA-Z0-9_\-]/,jE=Ve(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),eS=/^[()}<>$|&; \t"']/,tS=Ve(["(",")","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),rS=/^[<>&; \t"']/,GE=Ve(["<",">","&",";"," "," ",'"',"'"],!1,!1),Jl=/^[ \t]/,wg=Ve([" "," "],!1,!1),f=0,E=0,w=[{line:1,column:1}],k=0,L=[],T=0,ee;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function Ie(){return r.substring(E,f)}function Oe(){return ii(E,f)}function it(C,Q){throw Q=Q!==void 0?Q:ii(E,f),On([Ii(C)],r.substring(E,f),Q)}function at(C,Q){throw Q=Q!==void 0?Q:ii(E,f),yi(C,Q)}function Ue(C,Q){return{type:"literal",text:C,ignoreCase:Q}}function Ve(C,Q,R){return{type:"class",parts:C,inverted:Q,ignoreCase:R}}function nt(){return{type:"any"}}function wt(){return{type:"end"}}function Ii(C){return{type:"other",description:C}}function cn(C){var Q=w[C],R;if(Q)return Q;for(R=C-1;!w[R];)R--;for(Q=w[R],Q={line:Q.line,column:Q.column};Rk&&(k=f,L=[]),L.push(C))}function yi(C,Q){return new $l(C,null,null,Q)}function On(C,Q,R){return new $l($l.buildMessage(C,Q),C,Q,R)}function Ia(){var C,Q,R;for(C=f,Q=[],R=Me();R!==t;)Q.push(R),R=Me();return Q!==t?(R=Sr(),R===t&&(R=null),R!==t?(E=C,Q=s(R),C=Q):(f=C,C=t)):(f=C,C=t),C}function Sr(){var C,Q,R,U,le;if(C=f,Q=iS(),Q!==t){for(R=[],U=Me();U!==t;)R.push(U),U=Me();R!==t?(U=Y1(),U!==t?(le=mge(),le===t&&(le=null),le!==t?(E=C,Q=o(Q,U,le),C=Q):(f=C,C=t)):(f=C,C=t)):(f=C,C=t)}else f=C,C=t;if(C===t)if(C=f,Q=iS(),Q!==t){for(R=[],U=Me();U!==t;)R.push(U),U=Me();R!==t?(U=Y1(),U===t&&(U=null),U!==t?(E=C,Q=a(Q,U),C=Q):(f=C,C=t)):(f=C,C=t)}else f=C,C=t;return C}function mge(){var C,Q,R,U,le;for(C=f,Q=[],R=Me();R!==t;)Q.push(R),R=Me();if(Q!==t)if(R=Sr(),R!==t){for(U=[],le=Me();le!==t;)U.push(le),le=Me();U!==t?(E=C,Q=l(R),C=Q):(f=C,C=t)}else f=C,C=t;else f=C,C=t;return C}function Y1(){var C;return r.charCodeAt(f)===59?(C=c,f++):(C=t,T===0&&Be(u)),C===t&&(r.charCodeAt(f)===38?(C=g,f++):(C=t,T===0&&Be(h))),C}function iS(){var C,Q,R;return C=f,Q=q1(),Q!==t?(R=Ege(),R===t&&(R=null),R!==t?(E=C,Q=p(Q,R),C=Q):(f=C,C=t)):(f=C,C=t),C}function Ege(){var C,Q,R,U,le,Qe,ft;for(C=f,Q=[],R=Me();R!==t;)Q.push(R),R=Me();if(Q!==t)if(R=Ige(),R!==t){for(U=[],le=Me();le!==t;)U.push(le),le=Me();if(U!==t)if(le=iS(),le!==t){for(Qe=[],ft=Me();ft!==t;)Qe.push(ft),ft=Me();Qe!==t?(E=C,Q=d(R,le),C=Q):(f=C,C=t)}else f=C,C=t;else f=C,C=t}else f=C,C=t;else f=C,C=t;return C}function Ige(){var C;return r.substr(f,2)===m?(C=m,f+=2):(C=t,T===0&&Be(y)),C===t&&(r.substr(f,2)===B?(C=B,f+=2):(C=t,T===0&&Be(S))),C}function q1(){var C,Q,R;return C=f,Q=Bge(),Q!==t?(R=yge(),R===t&&(R=null),R!==t?(E=C,Q=P(Q,R),C=Q):(f=C,C=t)):(f=C,C=t),C}function yge(){var C,Q,R,U,le,Qe,ft;for(C=f,Q=[],R=Me();R!==t;)Q.push(R),R=Me();if(Q!==t)if(R=wge(),R!==t){for(U=[],le=Me();le!==t;)U.push(le),le=Me();if(U!==t)if(le=q1(),le!==t){for(Qe=[],ft=Me();ft!==t;)Qe.push(ft),ft=Me();Qe!==t?(E=C,Q=F(R,le),C=Q):(f=C,C=t)}else f=C,C=t;else f=C,C=t}else f=C,C=t;else f=C,C=t;return C}function wge(){var C;return r.substr(f,2)===H?(C=H,f+=2):(C=t,T===0&&Be(q)),C===t&&(r.charCodeAt(f)===124?(C=_,f++):(C=t,T===0&&Be(X))),C}function YE(){var C,Q,R,U,le,Qe;if(C=f,Q=iK(),Q!==t)if(r.charCodeAt(f)===61?(R=W,f++):(R=t,T===0&&Be(Z)),R!==t)if(U=z1(),U!==t){for(le=[],Qe=Me();Qe!==t;)le.push(Qe),Qe=Me();le!==t?(E=C,Q=A(Q,U),C=Q):(f=C,C=t)}else f=C,C=t;else f=C,C=t;else f=C,C=t;if(C===t)if(C=f,Q=iK(),Q!==t)if(r.charCodeAt(f)===61?(R=W,f++):(R=t,T===0&&Be(Z)),R!==t){for(U=[],le=Me();le!==t;)U.push(le),le=Me();U!==t?(E=C,Q=ne(Q),C=Q):(f=C,C=t)}else f=C,C=t;else f=C,C=t;return C}function Bge(){var C,Q,R,U,le,Qe,ft,It,Gr,fi,os;for(C=f,Q=[],R=Me();R!==t;)Q.push(R),R=Me();if(Q!==t)if(r.charCodeAt(f)===40?(R=ue,f++):(R=t,T===0&&Be(te)),R!==t){for(U=[],le=Me();le!==t;)U.push(le),le=Me();if(U!==t)if(le=Sr(),le!==t){for(Qe=[],ft=Me();ft!==t;)Qe.push(ft),ft=Me();if(Qe!==t)if(r.charCodeAt(f)===41?(ft=O,f++):(ft=t,T===0&&Be(N)),ft!==t){for(It=[],Gr=Me();Gr!==t;)It.push(Gr),Gr=Me();if(It!==t){for(Gr=[],fi=Tp();fi!==t;)Gr.push(fi),fi=Tp();if(Gr!==t){for(fi=[],os=Me();os!==t;)fi.push(os),os=Me();fi!==t?(E=C,Q=ce(le,Gr),C=Q):(f=C,C=t)}else f=C,C=t}else f=C,C=t}else f=C,C=t;else f=C,C=t}else f=C,C=t;else f=C,C=t}else f=C,C=t;else f=C,C=t;if(C===t){for(C=f,Q=[],R=Me();R!==t;)Q.push(R),R=Me();if(Q!==t)if(r.charCodeAt(f)===123?(R=he,f++):(R=t,T===0&&Be(Pe)),R!==t){for(U=[],le=Me();le!==t;)U.push(le),le=Me();if(U!==t)if(le=Sr(),le!==t){for(Qe=[],ft=Me();ft!==t;)Qe.push(ft),ft=Me();if(Qe!==t)if(r.charCodeAt(f)===125?(ft=De,f++):(ft=t,T===0&&Be(Re)),ft!==t){for(It=[],Gr=Me();Gr!==t;)It.push(Gr),Gr=Me();if(It!==t){for(Gr=[],fi=Tp();fi!==t;)Gr.push(fi),fi=Tp();if(Gr!==t){for(fi=[],os=Me();os!==t;)fi.push(os),os=Me();fi!==t?(E=C,Q=se(le,Gr),C=Q):(f=C,C=t)}else f=C,C=t}else f=C,C=t}else f=C,C=t;else f=C,C=t}else f=C,C=t;else f=C,C=t}else f=C,C=t;else f=C,C=t;if(C===t){for(C=f,Q=[],R=Me();R!==t;)Q.push(R),R=Me();if(Q!==t){for(R=[],U=YE();U!==t;)R.push(U),U=YE();if(R!==t){for(U=[],le=Me();le!==t;)U.push(le),le=Me();if(U!==t){if(le=[],Qe=W1(),Qe!==t)for(;Qe!==t;)le.push(Qe),Qe=W1();else le=t;if(le!==t){for(Qe=[],ft=Me();ft!==t;)Qe.push(ft),ft=Me();Qe!==t?(E=C,Q=Ae(R,le),C=Q):(f=C,C=t)}else f=C,C=t}else f=C,C=t}else f=C,C=t}else f=C,C=t;if(C===t){for(C=f,Q=[],R=Me();R!==t;)Q.push(R),R=Me();if(Q!==t){if(R=[],U=YE(),U!==t)for(;U!==t;)R.push(U),U=YE();else R=t;if(R!==t){for(U=[],le=Me();le!==t;)U.push(le),le=Me();U!==t?(E=C,Q=ye(R),C=Q):(f=C,C=t)}else f=C,C=t}else f=C,C=t}}}return C}function J1(){var C,Q,R,U,le;for(C=f,Q=[],R=Me();R!==t;)Q.push(R),R=Me();if(Q!==t){if(R=[],U=qE(),U!==t)for(;U!==t;)R.push(U),U=qE();else R=t;if(R!==t){for(U=[],le=Me();le!==t;)U.push(le),le=Me();U!==t?(E=C,Q=ge(R),C=Q):(f=C,C=t)}else f=C,C=t}else f=C,C=t;return C}function W1(){var C,Q,R;for(C=f,Q=[],R=Me();R!==t;)Q.push(R),R=Me();if(Q!==t?(R=Tp(),R!==t?(E=C,Q=oe(R),C=Q):(f=C,C=t)):(f=C,C=t),C===t){for(C=f,Q=[],R=Me();R!==t;)Q.push(R),R=Me();Q!==t?(R=qE(),R!==t?(E=C,Q=oe(R),C=Q):(f=C,C=t)):(f=C,C=t)}return C}function Tp(){var C,Q,R,U,le;for(C=f,Q=[],R=Me();R!==t;)Q.push(R),R=Me();return Q!==t?(Ye.test(r.charAt(f))?(R=r.charAt(f),f++):(R=t,T===0&&Be(ie)),R===t&&(R=null),R!==t?(U=Qge(),U!==t?(le=qE(),le!==t?(E=C,Q=G(R,U,le),C=Q):(f=C,C=t)):(f=C,C=t)):(f=C,C=t)):(f=C,C=t),C}function Qge(){var C;return r.substr(f,2)===fe?(C=fe,f+=2):(C=t,T===0&&Be(re)),C===t&&(r.substr(f,2)===de?(C=de,f+=2):(C=t,T===0&&Be(Ze)),C===t&&(r.charCodeAt(f)===62?(C=vt,f++):(C=t,T===0&&Be(mt)),C===t&&(r.substr(f,3)===Tr?(C=Tr,f+=3):(C=t,T===0&&Be(ti)),C===t&&(r.substr(f,2)===ui?(C=ui,f+=2):(C=t,T===0&&Be(gr)),C===t&&(r.charCodeAt(f)===60?(C=gi,f++):(C=t,T===0&&Be(ri))))))),C}function qE(){var C,Q,R;for(C=f,Q=[],R=Me();R!==t;)Q.push(R),R=Me();return Q!==t?(R=z1(),R!==t?(E=C,Q=oe(R),C=Q):(f=C,C=t)):(f=C,C=t),C}function z1(){var C,Q,R;if(C=f,Q=[],R=V1(),R!==t)for(;R!==t;)Q.push(R),R=V1();else Q=t;return Q!==t&&(E=C,Q=Ms(Q)),C=Q,C}function V1(){var C,Q;return C=f,Q=bge(),Q!==t&&(E=C,Q=fr(Q)),C=Q,C===t&&(C=f,Q=Sge(),Q!==t&&(E=C,Q=fr(Q)),C=Q,C===t&&(C=f,Q=vge(),Q!==t&&(E=C,Q=fr(Q)),C=Q,C===t&&(C=f,Q=xge(),Q!==t&&(E=C,Q=fr(Q)),C=Q))),C}function bge(){var C,Q,R,U;return C=f,r.substr(f,2)===Ei?(Q=Ei,f+=2):(Q=t,T===0&&Be(rs)),Q!==t?(R=Dge(),R!==t?(r.charCodeAt(f)===39?(U=ua,f++):(U=t,T===0&&Be(CA)),U!==t?(E=C,Q=gg(R),C=Q):(f=C,C=t)):(f=C,C=t)):(f=C,C=t),C}function Sge(){var C,Q,R,U;return C=f,r.charCodeAt(f)===39?(Q=ua,f++):(Q=t,T===0&&Be(CA)),Q!==t?(R=Pge(),R!==t?(r.charCodeAt(f)===39?(U=ua,f++):(U=t,T===0&&Be(CA)),U!==t?(E=C,Q=gg(R),C=Q):(f=C,C=t)):(f=C,C=t)):(f=C,C=t),C}function vge(){var C,Q,R,U;if(C=f,r.substr(f,2)===is?(Q=is,f+=2):(Q=t,T===0&&Be(mA)),Q!==t&&(E=C,Q=ga()),C=Q,C===t)if(C=f,r.charCodeAt(f)===34?(Q=wp,f++):(Q=t,T===0&&Be(EA)),Q!==t){for(R=[],U=X1();U!==t;)R.push(U),U=X1();R!==t?(r.charCodeAt(f)===34?(U=wp,f++):(U=t,T===0&&Be(EA)),U!==t?(E=C,Q=IA(R),C=Q):(f=C,C=t)):(f=C,C=t)}else f=C,C=t;return C}function xge(){var C,Q,R;if(C=f,Q=[],R=Z1(),R!==t)for(;R!==t;)Q.push(R),R=Z1();else Q=t;return Q!==t&&(E=C,Q=IA(Q)),C=Q,C}function X1(){var C,Q;return C=f,Q=tK(),Q!==t&&(E=C,Q=Ir(Q)),C=Q,C===t&&(C=f,Q=rK(),Q!==t&&(E=C,Q=Nl(Q)),C=Q,C===t&&(C=f,Q=aS(),Q!==t&&(E=C,Q=fg(Q)),C=Q,C===t&&(C=f,Q=kge(),Q!==t&&(E=C,Q=Io(Q)),C=Q))),C}function Z1(){var C,Q;return C=f,Q=tK(),Q!==t&&(E=C,Q=hg(Q)),C=Q,C===t&&(C=f,Q=rK(),Q!==t&&(E=C,Q=Bp(Q)),C=Q,C===t&&(C=f,Q=aS(),Q!==t&&(E=C,Q=Qp(Q)),C=Q,C===t&&(C=f,Q=Nge(),Q!==t&&(E=C,Q=br(Q)),C=Q,C===t&&(C=f,Q=Fge(),Q!==t&&(E=C,Q=Io(Q)),C=Q)))),C}function Pge(){var C,Q,R;for(C=f,Q=[],Ri.test(r.charAt(f))?(R=r.charAt(f),f++):(R=t,T===0&&Be(yo));R!==t;)Q.push(R),Ri.test(r.charAt(f))?(R=r.charAt(f),f++):(R=t,T===0&&Be(yo));return Q!==t&&(E=C,Q=Nn(Q)),C=Q,C}function kge(){var C,Q,R;if(C=f,Q=[],R=_1(),R===t&&(ae.test(r.charAt(f))?(R=r.charAt(f),f++):(R=t,T===0&&Be(yt))),R!==t)for(;R!==t;)Q.push(R),R=_1(),R===t&&(ae.test(r.charAt(f))?(R=r.charAt(f),f++):(R=t,T===0&&Be(yt)));else Q=t;return Q!==t&&(E=C,Q=Nn(Q)),C=Q,C}function _1(){var C,Q,R;return C=f,r.substr(f,2)===Tl?(Q=Tl,f+=2):(Q=t,T===0&&Be(Tn)),Q!==t&&(E=C,Q=ns()),C=Q,C===t&&(C=f,r.charCodeAt(f)===92?(Q=ss,f++):(Q=t,T===0&&Be(ut)),Q!==t?(wo.test(r.charAt(f))?(R=r.charAt(f),f++):(R=t,T===0&&Be(At)),R!==t?(E=C,Q=An(R),C=Q):(f=C,C=t)):(f=C,C=t)),C}function Dge(){var C,Q,R;for(C=f,Q=[],R=$1(),R===t&&(Ri.test(r.charAt(f))?(R=r.charAt(f),f++):(R=t,T===0&&Be(yo)));R!==t;)Q.push(R),R=$1(),R===t&&(Ri.test(r.charAt(f))?(R=r.charAt(f),f++):(R=t,T===0&&Be(yo)));return Q!==t&&(E=C,Q=Nn(Q)),C=Q,C}function $1(){var C,Q,R;return C=f,r.substr(f,2)===b?(Q=b,f+=2):(Q=t,T===0&&Be(Nt)),Q!==t&&(E=C,Q=pg()),C=Q,C===t&&(C=f,r.substr(f,2)===Ll?(Q=Ll,f+=2):(Q=t,T===0&&Be(bp)),Q!==t&&(E=C,Q=Sp()),C=Q,C===t&&(C=f,r.charCodeAt(f)===92?(Q=ss,f++):(Q=t,T===0&&Be(ut)),Q!==t?(vp.test(r.charAt(f))?(R=r.charAt(f),f++):(R=t,T===0&&Be(xp)),R!==t?(E=C,Q=Pp(),C=Q):(f=C,C=t)):(f=C,C=t),C===t&&(C=f,r.substr(f,2)===j?(Q=j,f+=2):(Q=t,T===0&&Be(Et)),Q!==t&&(E=C,Q=yA()),C=Q,C===t&&(C=f,r.substr(f,2)===Wi?(Q=Wi,f+=2):(Q=t,T===0&&Be(Ol)),Q!==t&&(E=C,Q=ze()),C=Q,C===t&&(C=f,r.substr(f,2)===fa?(Q=fa,f+=2):(Q=t,T===0&&Be(dg)),Q!==t&&(E=C,Q=OE()),C=Q,C===t&&(C=f,r.substr(f,2)===kp?(Q=kp,f+=2):(Q=t,T===0&&Be(ME)),Q!==t&&(E=C,Q=sr()),C=Q,C===t&&(C=f,r.substr(f,2)===Ln?(Q=Ln,f+=2):(Q=t,T===0&&Be(Ml)),Q!==t&&(E=C,Q=Dp()),C=Q,C===t&&(C=f,r.charCodeAt(f)===92?(Q=ss,f++):(Q=t,T===0&&Be(ut)),Q!==t?(Ks.test(r.charAt(f))?(R=r.charAt(f),f++):(R=t,T===0&&Be(ha)),R!==t?(E=C,Q=An(R),C=Q):(f=C,C=t)):(f=C,C=t),C===t&&(C=Rge()))))))))),C}function Rge(){var C,Q,R,U,le,Qe,ft,It,Gr,fi,os,AS;return C=f,r.charCodeAt(f)===92?(Q=ss,f++):(Q=t,T===0&&Be(ut)),Q!==t?(R=nS(),R!==t?(E=C,Q=ln(R),C=Q):(f=C,C=t)):(f=C,C=t),C===t&&(C=f,r.substr(f,2)===Ne?(Q=Ne,f+=2):(Q=t,T===0&&Be(Cg)),Q!==t?(R=f,U=f,le=nS(),le!==t?(Qe=Mn(),Qe!==t?(le=[le,Qe],U=le):(f=U,U=t)):(f=U,U=t),U===t&&(U=nS()),U!==t?R=r.substring(R,f):R=U,R!==t?(E=C,Q=ln(R),C=Q):(f=C,C=t)):(f=C,C=t),C===t&&(C=f,r.substr(f,2)===Kl?(Q=Kl,f+=2):(Q=t,T===0&&Be(Us)),Q!==t?(R=f,U=f,le=Mn(),le!==t?(Qe=Mn(),Qe!==t?(ft=Mn(),ft!==t?(It=Mn(),It!==t?(le=[le,Qe,ft,It],U=le):(f=U,U=t)):(f=U,U=t)):(f=U,U=t)):(f=U,U=t),U!==t?R=r.substring(R,f):R=U,R!==t?(E=C,Q=ln(R),C=Q):(f=C,C=t)):(f=C,C=t),C===t&&(C=f,r.substr(f,2)===Ul?(Q=Ul,f+=2):(Q=t,T===0&&Be(wA)),Q!==t?(R=f,U=f,le=Mn(),le!==t?(Qe=Mn(),Qe!==t?(ft=Mn(),ft!==t?(It=Mn(),It!==t?(Gr=Mn(),Gr!==t?(fi=Mn(),fi!==t?(os=Mn(),os!==t?(AS=Mn(),AS!==t?(le=[le,Qe,ft,It,Gr,fi,os,AS],U=le):(f=U,U=t)):(f=U,U=t)):(f=U,U=t)):(f=U,U=t)):(f=U,U=t)):(f=U,U=t)):(f=U,U=t)):(f=U,U=t),U!==t?R=r.substring(R,f):R=U,R!==t?(E=C,Q=mg(R),C=Q):(f=C,C=t)):(f=C,C=t)))),C}function nS(){var C;return Eg.test(r.charAt(f))?(C=r.charAt(f),f++):(C=t,T===0&&Be(pa)),C}function Mn(){var C;return da.test(r.charAt(f))?(C=r.charAt(f),f++):(C=t,T===0&&Be(tt)),C}function Fge(){var C,Q,R,U,le;if(C=f,Q=[],R=f,r.charCodeAt(f)===92?(U=ss,f++):(U=t,T===0&&Be(ut)),U!==t?(r.length>f?(le=r.charAt(f),f++):(le=t,T===0&&Be(Bo)),le!==t?(E=R,U=An(le),R=U):(f=R,R=t)):(f=R,R=t),R===t&&(R=f,r.substr(f,2)===BA?(U=BA,f+=2):(U=t,T===0&&Be(Rp)),U!==t&&(E=R,U=Ca()),R=U,R===t&&(R=f,U=f,T++,le=nK(),T--,le===t?U=void 0:(f=U,U=t),U!==t?(r.length>f?(le=r.charAt(f),f++):(le=t,T===0&&Be(Bo)),le!==t?(E=R,U=An(le),R=U):(f=R,R=t)):(f=R,R=t))),R!==t)for(;R!==t;)Q.push(R),R=f,r.charCodeAt(f)===92?(U=ss,f++):(U=t,T===0&&Be(ut)),U!==t?(r.length>f?(le=r.charAt(f),f++):(le=t,T===0&&Be(Bo)),le!==t?(E=R,U=An(le),R=U):(f=R,R=t)):(f=R,R=t),R===t&&(R=f,r.substr(f,2)===BA?(U=BA,f+=2):(U=t,T===0&&Be(Rp)),U!==t&&(E=R,U=Ca()),R=U,R===t&&(R=f,U=f,T++,le=nK(),T--,le===t?U=void 0:(f=U,U=t),U!==t?(r.length>f?(le=r.charAt(f),f++):(le=t,T===0&&Be(Bo)),le!==t?(E=R,U=An(le),R=U):(f=R,R=t)):(f=R,R=t)));else Q=t;return Q!==t&&(E=C,Q=Nn(Q)),C=Q,C}function sS(){var C,Q,R,U,le,Qe;if(C=f,r.charCodeAt(f)===45?(Q=Hl,f++):(Q=t,T===0&&Be(jl)),Q===t&&(r.charCodeAt(f)===43?(Q=QA,f++):(Q=t,T===0&&Be(ma))),Q===t&&(Q=null),Q!==t){if(R=[],Ye.test(r.charAt(f))?(U=r.charAt(f),f++):(U=t,T===0&&Be(ie)),U!==t)for(;U!==t;)R.push(U),Ye.test(r.charAt(f))?(U=r.charAt(f),f++):(U=t,T===0&&Be(ie));else R=t;if(R!==t)if(r.charCodeAt(f)===46?(U=Fp,f++):(U=t,T===0&&Be(KE)),U!==t){if(le=[],Ye.test(r.charAt(f))?(Qe=r.charAt(f),f++):(Qe=t,T===0&&Be(ie)),Qe!==t)for(;Qe!==t;)le.push(Qe),Ye.test(r.charAt(f))?(Qe=r.charAt(f),f++):(Qe=t,T===0&&Be(ie));else le=t;le!==t?(E=C,Q=Gl(Q,R,le),C=Q):(f=C,C=t)}else f=C,C=t;else f=C,C=t}else f=C,C=t;if(C===t){if(C=f,r.charCodeAt(f)===45?(Q=Hl,f++):(Q=t,T===0&&Be(jl)),Q===t&&(r.charCodeAt(f)===43?(Q=QA,f++):(Q=t,T===0&&Be(ma))),Q===t&&(Q=null),Q!==t){if(R=[],Ye.test(r.charAt(f))?(U=r.charAt(f),f++):(U=t,T===0&&Be(ie)),U!==t)for(;U!==t;)R.push(U),Ye.test(r.charAt(f))?(U=r.charAt(f),f++):(U=t,T===0&&Be(ie));else R=t;R!==t?(E=C,Q=UE(Q,R),C=Q):(f=C,C=t)}else f=C,C=t;if(C===t&&(C=f,Q=aS(),Q!==t&&(E=C,Q=Np(Q)),C=Q,C===t&&(C=f,Q=Wl(),Q!==t&&(E=C,Q=Yl(Q)),C=Q,C===t)))if(C=f,r.charCodeAt(f)===40?(Q=ue,f++):(Q=t,T===0&&Be(te)),Q!==t){for(R=[],U=Me();U!==t;)R.push(U),U=Me();if(R!==t)if(U=eK(),U!==t){for(le=[],Qe=Me();Qe!==t;)le.push(Qe),Qe=Me();le!==t?(r.charCodeAt(f)===41?(Qe=O,f++):(Qe=t,T===0&&Be(N)),Qe!==t?(E=C,Q=Lr(U),C=Q):(f=C,C=t)):(f=C,C=t)}else f=C,C=t;else f=C,C=t}else f=C,C=t}return C}function oS(){var C,Q,R,U,le,Qe,ft,It;if(C=f,Q=sS(),Q!==t){for(R=[],U=f,le=[],Qe=Me();Qe!==t;)le.push(Qe),Qe=Me();if(le!==t)if(r.charCodeAt(f)===42?(Qe=HE,f++):(Qe=t,T===0&&Be(Hs)),Qe===t&&(r.charCodeAt(f)===47?(Qe=js,f++):(Qe=t,T===0&&Be(Ig))),Qe!==t){for(ft=[],It=Me();It!==t;)ft.push(It),It=Me();ft!==t?(It=sS(),It!==t?(E=U,le=bA(Q,Qe,It),U=le):(f=U,U=t)):(f=U,U=t)}else f=U,U=t;else f=U,U=t;for(;U!==t;){for(R.push(U),U=f,le=[],Qe=Me();Qe!==t;)le.push(Qe),Qe=Me();if(le!==t)if(r.charCodeAt(f)===42?(Qe=HE,f++):(Qe=t,T===0&&Be(Hs)),Qe===t&&(r.charCodeAt(f)===47?(Qe=js,f++):(Qe=t,T===0&&Be(Ig))),Qe!==t){for(ft=[],It=Me();It!==t;)ft.push(It),It=Me();ft!==t?(It=sS(),It!==t?(E=U,le=bA(Q,Qe,It),U=le):(f=U,U=t)):(f=U,U=t)}else f=U,U=t;else f=U,U=t}R!==t?(E=C,Q=D(Q,R),C=Q):(f=C,C=t)}else f=C,C=t;return C}function eK(){var C,Q,R,U,le,Qe,ft,It;if(C=f,Q=oS(),Q!==t){for(R=[],U=f,le=[],Qe=Me();Qe!==t;)le.push(Qe),Qe=Me();if(le!==t)if(r.charCodeAt(f)===43?(Qe=QA,f++):(Qe=t,T===0&&Be(ma)),Qe===t&&(r.charCodeAt(f)===45?(Qe=Hl,f++):(Qe=t,T===0&&Be(jl))),Qe!==t){for(ft=[],It=Me();It!==t;)ft.push(It),It=Me();ft!==t?(It=oS(),It!==t?(E=U,le=Y(Q,Qe,It),U=le):(f=U,U=t)):(f=U,U=t)}else f=U,U=t;else f=U,U=t;for(;U!==t;){for(R.push(U),U=f,le=[],Qe=Me();Qe!==t;)le.push(Qe),Qe=Me();if(le!==t)if(r.charCodeAt(f)===43?(Qe=QA,f++):(Qe=t,T===0&&Be(ma)),Qe===t&&(r.charCodeAt(f)===45?(Qe=Hl,f++):(Qe=t,T===0&&Be(jl))),Qe!==t){for(ft=[],It=Me();It!==t;)ft.push(It),It=Me();ft!==t?(It=oS(),It!==t?(E=U,le=Y(Q,Qe,It),U=le):(f=U,U=t)):(f=U,U=t)}else f=U,U=t;else f=U,U=t}R!==t?(E=C,Q=D(Q,R),C=Q):(f=C,C=t)}else f=C,C=t;return C}function tK(){var C,Q,R,U,le,Qe;if(C=f,r.substr(f,3)===pe?(Q=pe,f+=3):(Q=t,T===0&&Be(Le)),Q!==t){for(R=[],U=Me();U!==t;)R.push(U),U=Me();if(R!==t)if(U=eK(),U!==t){for(le=[],Qe=Me();Qe!==t;)le.push(Qe),Qe=Me();le!==t?(r.substr(f,2)===ke?(Qe=ke,f+=2):(Qe=t,T===0&&Be(Je)),Qe!==t?(E=C,Q=pt(U),C=Q):(f=C,C=t)):(f=C,C=t)}else f=C,C=t;else f=C,C=t}else f=C,C=t;return C}function rK(){var C,Q,R,U;return C=f,r.substr(f,2)===Xt?(Q=Xt,f+=2):(Q=t,T===0&&Be(Ea)),Q!==t?(R=Sr(),R!==t?(r.charCodeAt(f)===41?(U=O,f++):(U=t,T===0&&Be(N)),U!==t?(E=C,Q=D1(R),C=Q):(f=C,C=t)):(f=C,C=t)):(f=C,C=t),C}function aS(){var C,Q,R,U,le,Qe;return C=f,r.substr(f,2)===Gs?(Q=Gs,f+=2):(Q=t,T===0&&Be(yg)),Q!==t?(R=Wl(),R!==t?(r.substr(f,2)===Jb?(U=Jb,f+=2):(U=t,T===0&&Be(R1)),U!==t?(le=J1(),le!==t?(r.charCodeAt(f)===125?(Qe=De,f++):(Qe=t,T===0&&Be(Re)),Qe!==t?(E=C,Q=F1(R,le),C=Q):(f=C,C=t)):(f=C,C=t)):(f=C,C=t)):(f=C,C=t)):(f=C,C=t),C===t&&(C=f,r.substr(f,2)===Gs?(Q=Gs,f+=2):(Q=t,T===0&&Be(yg)),Q!==t?(R=Wl(),R!==t?(r.substr(f,3)===Wb?(U=Wb,f+=3):(U=t,T===0&&Be(N1)),U!==t?(E=C,Q=T1(R),C=Q):(f=C,C=t)):(f=C,C=t)):(f=C,C=t),C===t&&(C=f,r.substr(f,2)===Gs?(Q=Gs,f+=2):(Q=t,T===0&&Be(yg)),Q!==t?(R=Wl(),R!==t?(r.substr(f,2)===zb?(U=zb,f+=2):(U=t,T===0&&Be(L1)),U!==t?(le=J1(),le!==t?(r.charCodeAt(f)===125?(Qe=De,f++):(Qe=t,T===0&&Be(Re)),Qe!==t?(E=C,Q=O1(R,le),C=Q):(f=C,C=t)):(f=C,C=t)):(f=C,C=t)):(f=C,C=t)):(f=C,C=t),C===t&&(C=f,r.substr(f,2)===Gs?(Q=Gs,f+=2):(Q=t,T===0&&Be(yg)),Q!==t?(R=Wl(),R!==t?(r.substr(f,3)===Vb?(U=Vb,f+=3):(U=t,T===0&&Be(M1)),U!==t?(E=C,Q=K1(R),C=Q):(f=C,C=t)):(f=C,C=t)):(f=C,C=t),C===t&&(C=f,r.substr(f,2)===Gs?(Q=Gs,f+=2):(Q=t,T===0&&Be(yg)),Q!==t?(R=Wl(),R!==t?(r.charCodeAt(f)===125?(U=De,f++):(U=t,T===0&&Be(Re)),U!==t?(E=C,Q=Xb(R),C=Q):(f=C,C=t)):(f=C,C=t)):(f=C,C=t),C===t&&(C=f,r.charCodeAt(f)===36?(Q=U1,f++):(Q=t,T===0&&Be(H1)),Q!==t?(R=Wl(),R!==t?(E=C,Q=Xb(R),C=Q):(f=C,C=t)):(f=C,C=t)))))),C}function Nge(){var C,Q,R;return C=f,Q=Tge(),Q!==t?(E=f,R=j1(Q),R?R=void 0:R=t,R!==t?(E=C,Q=G1(Q),C=Q):(f=C,C=t)):(f=C,C=t),C}function Tge(){var C,Q,R,U,le;if(C=f,Q=[],R=f,U=f,T++,le=sK(),T--,le===t?U=void 0:(f=U,U=t),U!==t?(r.length>f?(le=r.charAt(f),f++):(le=t,T===0&&Be(Bo)),le!==t?(E=R,U=An(le),R=U):(f=R,R=t)):(f=R,R=t),R!==t)for(;R!==t;)Q.push(R),R=f,U=f,T++,le=sK(),T--,le===t?U=void 0:(f=U,U=t),U!==t?(r.length>f?(le=r.charAt(f),f++):(le=t,T===0&&Be(Bo)),le!==t?(E=R,U=An(le),R=U):(f=R,R=t)):(f=R,R=t);else Q=t;return Q!==t&&(E=C,Q=Nn(Q)),C=Q,C}function iK(){var C,Q,R;if(C=f,Q=[],Zb.test(r.charAt(f))?(R=r.charAt(f),f++):(R=t,T===0&&Be(_b)),R!==t)for(;R!==t;)Q.push(R),Zb.test(r.charAt(f))?(R=r.charAt(f),f++):(R=t,T===0&&Be(_b));else Q=t;return Q!==t&&(E=C,Q=$b()),C=Q,C}function Wl(){var C,Q,R;if(C=f,Q=[],ql.test(r.charAt(f))?(R=r.charAt(f),f++):(R=t,T===0&&Be(jE)),R!==t)for(;R!==t;)Q.push(R),ql.test(r.charAt(f))?(R=r.charAt(f),f++):(R=t,T===0&&Be(jE));else Q=t;return Q!==t&&(E=C,Q=$b()),C=Q,C}function nK(){var C;return eS.test(r.charAt(f))?(C=r.charAt(f),f++):(C=t,T===0&&Be(tS)),C}function sK(){var C;return rS.test(r.charAt(f))?(C=r.charAt(f),f++):(C=t,T===0&&Be(GE)),C}function Me(){var C,Q;if(C=[],Jl.test(r.charAt(f))?(Q=r.charAt(f),f++):(Q=t,T===0&&Be(wg)),Q!==t)for(;Q!==t;)C.push(Q),Jl.test(r.charAt(f))?(Q=r.charAt(f),f++):(Q=t,T===0&&Be(wg));else C=t;return C}if(ee=n(),ee!==t&&f===r.length)return ee;throw ee!==t&&f{"use strict";function Mfe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function tc(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,tc)}Mfe(tc,Error);tc.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,h=1;gH&&(H=S,q=[]),q.push(ie))}function Re(ie,G){return new tc(ie,null,null,G)}function se(ie,G,fe){return new tc(tc.buildMessage(ie,G),ie,G,fe)}function Ae(){var ie,G,fe,re;return ie=S,G=ye(),G!==t?(r.charCodeAt(S)===47?(fe=s,S++):(fe=t,_===0&&De(o)),fe!==t?(re=ye(),re!==t?(P=ie,G=a(G,re),ie=G):(S=ie,ie=t)):(S=ie,ie=t)):(S=ie,ie=t),ie===t&&(ie=S,G=ye(),G!==t&&(P=ie,G=l(G)),ie=G),ie}function ye(){var ie,G,fe,re;return ie=S,G=ge(),G!==t?(r.charCodeAt(S)===64?(fe=c,S++):(fe=t,_===0&&De(u)),fe!==t?(re=Ye(),re!==t?(P=ie,G=g(G,re),ie=G):(S=ie,ie=t)):(S=ie,ie=t)):(S=ie,ie=t),ie===t&&(ie=S,G=ge(),G!==t&&(P=ie,G=h(G)),ie=G),ie}function ge(){var ie,G,fe,re,de;return ie=S,r.charCodeAt(S)===64?(G=c,S++):(G=t,_===0&&De(u)),G!==t?(fe=oe(),fe!==t?(r.charCodeAt(S)===47?(re=s,S++):(re=t,_===0&&De(o)),re!==t?(de=oe(),de!==t?(P=ie,G=p(),ie=G):(S=ie,ie=t)):(S=ie,ie=t)):(S=ie,ie=t)):(S=ie,ie=t),ie===t&&(ie=S,G=oe(),G!==t&&(P=ie,G=p()),ie=G),ie}function oe(){var ie,G,fe;if(ie=S,G=[],d.test(r.charAt(S))?(fe=r.charAt(S),S++):(fe=t,_===0&&De(m)),fe!==t)for(;fe!==t;)G.push(fe),d.test(r.charAt(S))?(fe=r.charAt(S),S++):(fe=t,_===0&&De(m));else G=t;return G!==t&&(P=ie,G=p()),ie=G,ie}function Ye(){var ie,G,fe;if(ie=S,G=[],y.test(r.charAt(S))?(fe=r.charAt(S),S++):(fe=t,_===0&&De(B)),fe!==t)for(;fe!==t;)G.push(fe),y.test(r.charAt(S))?(fe=r.charAt(S),S++):(fe=t,_===0&&De(B));else G=t;return G!==t&&(P=ie,G=p()),ie=G,ie}if(X=n(),X!==t&&S===r.length)return X;throw X!==t&&S{"use strict";function yU(r){return typeof r>"u"||r===null}function Ufe(r){return typeof r=="object"&&r!==null}function Hfe(r){return Array.isArray(r)?r:yU(r)?[]:[r]}function jfe(r,e){var t,i,n,s;if(e)for(s=Object.keys(e),t=0,i=s.length;t{"use strict";function Xp(r,e){Error.call(this),this.name="YAMLException",this.reason=r,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}Xp.prototype=Object.create(Error.prototype);Xp.prototype.constructor=Xp;Xp.prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t};wU.exports=Xp});var bU=I((LZe,QU)=>{"use strict";var BU=ic();function HS(r,e,t,i,n){this.name=r,this.buffer=e,this.position=t,this.line=i,this.column=n}HS.prototype.getSnippet=function(e,t){var i,n,s,o,a;if(!this.buffer)return null;for(e=e||4,t=t||75,i="",n=this.position;n>0&&`\0\r +\x85\u2028\u2029`.indexOf(this.buffer.charAt(n-1))===-1;)if(n-=1,this.position-n>t/2-1){i=" ... ",n+=5;break}for(s="",o=this.position;ot/2-1){s=" ... ",o-=5;break}return a=this.buffer.slice(n,o),BU.repeat(" ",e)+i+a+s+` +`+BU.repeat(" ",e+this.position-n+i.length)+"^"};HS.prototype.toString=function(e){var t,i="";return this.name&&(i+='in "'+this.name+'" '),i+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet(),t&&(i+=`: +`+t)),i};QU.exports=HS});var ni=I((OZe,vU)=>{"use strict";var SU=Ng(),qfe=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],Jfe=["scalar","sequence","mapping"];function Wfe(r){var e={};return r!==null&&Object.keys(r).forEach(function(t){r[t].forEach(function(i){e[String(i)]=t})}),e}function zfe(r,e){if(e=e||{},Object.keys(e).forEach(function(t){if(qfe.indexOf(t)===-1)throw new SU('Unknown option "'+t+'" is met in definition of "'+r+'" YAML type.')}),this.tag=r,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=Wfe(e.styleAliases||null),Jfe.indexOf(this.kind)===-1)throw new SU('Unknown kind "'+this.kind+'" is specified for "'+r+'" YAML type.')}vU.exports=zfe});var nc=I((MZe,PU)=>{"use strict";var xU=ic(),pI=Ng(),Vfe=ni();function jS(r,e,t){var i=[];return r.include.forEach(function(n){t=jS(n,e,t)}),r[e].forEach(function(n){t.forEach(function(s,o){s.tag===n.tag&&s.kind===n.kind&&i.push(o)}),t.push(n)}),t.filter(function(n,s){return i.indexOf(s)===-1})}function Xfe(){var r={scalar:{},sequence:{},mapping:{},fallback:{}},e,t;function i(n){r[n.kind][n.tag]=r.fallback[n.tag]=n}for(e=0,t=arguments.length;e{"use strict";var Zfe=ni();kU.exports=new Zfe("tag:yaml.org,2002:str",{kind:"scalar",construct:function(r){return r!==null?r:""}})});var FU=I((UZe,RU)=>{"use strict";var _fe=ni();RU.exports=new _fe("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(r){return r!==null?r:[]}})});var TU=I((HZe,NU)=>{"use strict";var $fe=ni();NU.exports=new $fe("tag:yaml.org,2002:map",{kind:"mapping",construct:function(r){return r!==null?r:{}}})});var dI=I((jZe,LU)=>{"use strict";var ehe=nc();LU.exports=new ehe({explicit:[DU(),FU(),TU()]})});var MU=I((GZe,OU)=>{"use strict";var the=ni();function rhe(r){if(r===null)return!0;var e=r.length;return e===1&&r==="~"||e===4&&(r==="null"||r==="Null"||r==="NULL")}function ihe(){return null}function nhe(r){return r===null}OU.exports=new the("tag:yaml.org,2002:null",{kind:"scalar",resolve:rhe,construct:ihe,predicate:nhe,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var UU=I((YZe,KU)=>{"use strict";var she=ni();function ohe(r){if(r===null)return!1;var e=r.length;return e===4&&(r==="true"||r==="True"||r==="TRUE")||e===5&&(r==="false"||r==="False"||r==="FALSE")}function ahe(r){return r==="true"||r==="True"||r==="TRUE"}function Ahe(r){return Object.prototype.toString.call(r)==="[object Boolean]"}KU.exports=new she("tag:yaml.org,2002:bool",{kind:"scalar",resolve:ohe,construct:ahe,predicate:Ahe,represent:{lowercase:function(r){return r?"true":"false"},uppercase:function(r){return r?"TRUE":"FALSE"},camelcase:function(r){return r?"True":"False"}},defaultStyle:"lowercase"})});var jU=I((qZe,HU)=>{"use strict";var lhe=ic(),che=ni();function uhe(r){return 48<=r&&r<=57||65<=r&&r<=70||97<=r&&r<=102}function ghe(r){return 48<=r&&r<=55}function fhe(r){return 48<=r&&r<=57}function hhe(r){if(r===null)return!1;var e=r.length,t=0,i=!1,n;if(!e)return!1;if(n=r[t],(n==="-"||n==="+")&&(n=r[++t]),n==="0"){if(t+1===e)return!0;if(n=r[++t],n==="b"){for(t++;t=0?"0b"+r.toString(2):"-0b"+r.toString(2).slice(1)},octal:function(r){return r>=0?"0"+r.toString(8):"-0"+r.toString(8).slice(1)},decimal:function(r){return r.toString(10)},hexadecimal:function(r){return r>=0?"0x"+r.toString(16).toUpperCase():"-0x"+r.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var qU=I((JZe,YU)=>{"use strict";var GU=ic(),Che=ni(),mhe=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function Ehe(r){return!(r===null||!mhe.test(r)||r[r.length-1]==="_")}function Ihe(r){var e,t,i,n;return e=r.replace(/_/g,"").toLowerCase(),t=e[0]==="-"?-1:1,n=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?t===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(s){n.unshift(parseFloat(s,10))}),e=0,i=1,n.forEach(function(s){e+=s*i,i*=60}),t*e):t*parseFloat(e,10)}var yhe=/^[-+]?[0-9]+e/;function whe(r,e){var t;if(isNaN(r))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===r)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===r)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(GU.isNegativeZero(r))return"-0.0";return t=r.toString(10),yhe.test(t)?t.replace("e",".e"):t}function Bhe(r){return Object.prototype.toString.call(r)==="[object Number]"&&(r%1!==0||GU.isNegativeZero(r))}YU.exports=new Che("tag:yaml.org,2002:float",{kind:"scalar",resolve:Ehe,construct:Ihe,predicate:Bhe,represent:whe,defaultStyle:"lowercase"})});var GS=I((WZe,JU)=>{"use strict";var Qhe=nc();JU.exports=new Qhe({include:[dI()],implicit:[MU(),UU(),jU(),qU()]})});var YS=I((zZe,WU)=>{"use strict";var bhe=nc();WU.exports=new bhe({include:[GS()]})});var ZU=I((VZe,XU)=>{"use strict";var She=ni(),zU=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),VU=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function vhe(r){return r===null?!1:zU.exec(r)!==null||VU.exec(r)!==null}function xhe(r){var e,t,i,n,s,o,a,l=0,c=null,u,g,h;if(e=zU.exec(r),e===null&&(e=VU.exec(r)),e===null)throw new Error("Date resolve error");if(t=+e[1],i=+e[2]-1,n=+e[3],!e[4])return new Date(Date.UTC(t,i,n));if(s=+e[4],o=+e[5],a=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(u=+e[10],g=+(e[11]||0),c=(u*60+g)*6e4,e[9]==="-"&&(c=-c)),h=new Date(Date.UTC(t,i,n,s,o,a,l)),c&&h.setTime(h.getTime()-c),h}function Phe(r){return r.toISOString()}XU.exports=new She("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:vhe,construct:xhe,instanceOf:Date,represent:Phe})});var $U=I((XZe,_U)=>{"use strict";var khe=ni();function Dhe(r){return r==="<<"||r===null}_U.exports=new khe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:Dhe})});var r2=I((ZZe,t2)=>{"use strict";var sc;try{e2=J,sc=e2("buffer").Buffer}catch{}var e2,Rhe=ni(),qS=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= +\r`;function Fhe(r){if(r===null)return!1;var e,t,i=0,n=r.length,s=qS;for(t=0;t64)){if(e<0)return!1;i+=6}return i%8===0}function Nhe(r){var e,t,i=r.replace(/[\r\n=]/g,""),n=i.length,s=qS,o=0,a=[];for(e=0;e>16&255),a.push(o>>8&255),a.push(o&255)),o=o<<6|s.indexOf(i.charAt(e));return t=n%4*6,t===0?(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)):t===18?(a.push(o>>10&255),a.push(o>>2&255)):t===12&&a.push(o>>4&255),sc?sc.from?sc.from(a):new sc(a):a}function The(r){var e="",t=0,i,n,s=r.length,o=qS;for(i=0;i>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]),t=(t<<8)+r[i];return n=s%3,n===0?(e+=o[t>>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]):n===2?(e+=o[t>>10&63],e+=o[t>>4&63],e+=o[t<<2&63],e+=o[64]):n===1&&(e+=o[t>>2&63],e+=o[t<<4&63],e+=o[64],e+=o[64]),e}function Lhe(r){return sc&&sc.isBuffer(r)}t2.exports=new Rhe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:Fhe,construct:Nhe,predicate:Lhe,represent:The})});var n2=I(($Ze,i2)=>{"use strict";var Ohe=ni(),Mhe=Object.prototype.hasOwnProperty,Khe=Object.prototype.toString;function Uhe(r){if(r===null)return!0;var e=[],t,i,n,s,o,a=r;for(t=0,i=a.length;t{"use strict";var jhe=ni(),Ghe=Object.prototype.toString;function Yhe(r){if(r===null)return!0;var e,t,i,n,s,o=r;for(s=new Array(o.length),e=0,t=o.length;e{"use strict";var Jhe=ni(),Whe=Object.prototype.hasOwnProperty;function zhe(r){if(r===null)return!0;var e,t=r;for(e in t)if(Whe.call(t,e)&&t[e]!==null)return!1;return!0}function Vhe(r){return r!==null?r:{}}a2.exports=new Jhe("tag:yaml.org,2002:set",{kind:"mapping",resolve:zhe,construct:Vhe})});var Lg=I((r_e,l2)=>{"use strict";var Xhe=nc();l2.exports=new Xhe({include:[YS()],implicit:[ZU(),$U()],explicit:[r2(),n2(),o2(),A2()]})});var u2=I((i_e,c2)=>{"use strict";var Zhe=ni();function _he(){return!0}function $he(){}function epe(){return""}function tpe(r){return typeof r>"u"}c2.exports=new Zhe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:_he,construct:$he,predicate:tpe,represent:epe})});var f2=I((n_e,g2)=>{"use strict";var rpe=ni();function ipe(r){if(r===null||r.length===0)return!1;var e=r,t=/\/([gim]*)$/.exec(r),i="";return!(e[0]==="/"&&(t&&(i=t[1]),i.length>3||e[e.length-i.length-1]!=="/"))}function npe(r){var e=r,t=/\/([gim]*)$/.exec(r),i="";return e[0]==="/"&&(t&&(i=t[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function spe(r){var e="/"+r.source+"/";return r.global&&(e+="g"),r.multiline&&(e+="m"),r.ignoreCase&&(e+="i"),e}function ope(r){return Object.prototype.toString.call(r)==="[object RegExp]"}g2.exports=new rpe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:ipe,construct:npe,predicate:ope,represent:spe})});var d2=I((s_e,p2)=>{"use strict";var CI;try{h2=J,CI=h2("esprima")}catch{typeof window<"u"&&(CI=window.esprima)}var h2,ape=ni();function Ape(r){if(r===null)return!1;try{var e="("+r+")",t=CI.parse(e,{range:!0});return!(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")}catch{return!1}}function lpe(r){var e="("+r+")",t=CI.parse(e,{range:!0}),i=[],n;if(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return t.body[0].expression.params.forEach(function(s){i.push(s.name)}),n=t.body[0].expression.body.range,t.body[0].expression.body.type==="BlockStatement"?new Function(i,e.slice(n[0]+1,n[1]-1)):new Function(i,"return "+e.slice(n[0],n[1]))}function cpe(r){return r.toString()}function upe(r){return Object.prototype.toString.call(r)==="[object Function]"}p2.exports=new ape("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:Ape,construct:lpe,predicate:upe,represent:cpe})});var Zp=I((a_e,m2)=>{"use strict";var C2=nc();m2.exports=C2.DEFAULT=new C2({include:[Lg()],explicit:[u2(),f2(),d2()]})});var O2=I((A_e,_p)=>{"use strict";var Qa=ic(),b2=Ng(),gpe=bU(),S2=Lg(),fpe=Zp(),kA=Object.prototype.hasOwnProperty,mI=1,v2=2,x2=3,EI=4,JS=1,hpe=2,E2=3,ppe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,dpe=/[\x85\u2028\u2029]/,Cpe=/[,\[\]\{\}]/,P2=/^(?:!|!!|![a-z\-]+!)$/i,k2=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function I2(r){return Object.prototype.toString.call(r)}function vo(r){return r===10||r===13}function ac(r){return r===9||r===32}function fn(r){return r===9||r===32||r===10||r===13}function Og(r){return r===44||r===91||r===93||r===123||r===125}function mpe(r){var e;return 48<=r&&r<=57?r-48:(e=r|32,97<=e&&e<=102?e-97+10:-1)}function Epe(r){return r===120?2:r===117?4:r===85?8:0}function Ipe(r){return 48<=r&&r<=57?r-48:-1}function y2(r){return r===48?"\0":r===97?"\x07":r===98?"\b":r===116||r===9?" ":r===110?` +`:r===118?"\v":r===102?"\f":r===114?"\r":r===101?"\x1B":r===32?" ":r===34?'"':r===47?"/":r===92?"\\":r===78?"\x85":r===95?"\xA0":r===76?"\u2028":r===80?"\u2029":""}function ype(r){return r<=65535?String.fromCharCode(r):String.fromCharCode((r-65536>>10)+55296,(r-65536&1023)+56320)}var D2=new Array(256),R2=new Array(256);for(oc=0;oc<256;oc++)D2[oc]=y2(oc)?1:0,R2[oc]=y2(oc);var oc;function wpe(r,e){this.input=r,this.filename=e.filename||null,this.schema=e.schema||fpe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=r.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function F2(r,e){return new b2(e,new gpe(r.filename,r.input,r.position,r.line,r.position-r.lineStart))}function gt(r,e){throw F2(r,e)}function II(r,e){r.onWarning&&r.onWarning.call(null,F2(r,e))}var w2={YAML:function(e,t,i){var n,s,o;e.version!==null&>(e,"duplication of %YAML directive"),i.length!==1&>(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(i[0]),n===null&>(e,"ill-formed argument of the YAML directive"),s=parseInt(n[1],10),o=parseInt(n[2],10),s!==1&>(e,"unacceptable YAML version of the document"),e.version=i[0],e.checkLineBreaks=o<2,o!==1&&o!==2&&II(e,"unsupported YAML version of the document")},TAG:function(e,t,i){var n,s;i.length!==2&>(e,"TAG directive accepts exactly two arguments"),n=i[0],s=i[1],P2.test(n)||gt(e,"ill-formed tag handle (first argument) of the TAG directive"),kA.call(e.tagMap,n)&>(e,'there is a previously declared suffix for "'+n+'" tag handle'),k2.test(s)||gt(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=s}};function PA(r,e,t,i){var n,s,o,a;if(e1&&(r.result+=Qa.repeat(` +`,e-1))}function Bpe(r,e,t){var i,n,s,o,a,l,c,u,g=r.kind,h=r.result,p;if(p=r.input.charCodeAt(r.position),fn(p)||Og(p)||p===35||p===38||p===42||p===33||p===124||p===62||p===39||p===34||p===37||p===64||p===96||(p===63||p===45)&&(n=r.input.charCodeAt(r.position+1),fn(n)||t&&Og(n)))return!1;for(r.kind="scalar",r.result="",s=o=r.position,a=!1;p!==0;){if(p===58){if(n=r.input.charCodeAt(r.position+1),fn(n)||t&&Og(n))break}else if(p===35){if(i=r.input.charCodeAt(r.position-1),fn(i))break}else{if(r.position===r.lineStart&&yI(r)||t&&Og(p))break;if(vo(p))if(l=r.line,c=r.lineStart,u=r.lineIndent,Jr(r,!1,-1),r.lineIndent>=e){a=!0,p=r.input.charCodeAt(r.position);continue}else{r.position=o,r.line=l,r.lineStart=c,r.lineIndent=u;break}}a&&(PA(r,s,o,!1),zS(r,r.line-l),s=o=r.position,a=!1),ac(p)||(o=r.position+1),p=r.input.charCodeAt(++r.position)}return PA(r,s,o,!1),r.result?!0:(r.kind=g,r.result=h,!1)}function Qpe(r,e){var t,i,n;if(t=r.input.charCodeAt(r.position),t!==39)return!1;for(r.kind="scalar",r.result="",r.position++,i=n=r.position;(t=r.input.charCodeAt(r.position))!==0;)if(t===39)if(PA(r,i,r.position,!0),t=r.input.charCodeAt(++r.position),t===39)i=r.position,r.position++,n=r.position;else return!0;else vo(t)?(PA(r,i,n,!0),zS(r,Jr(r,!1,e)),i=n=r.position):r.position===r.lineStart&&yI(r)?gt(r,"unexpected end of the document within a single quoted scalar"):(r.position++,n=r.position);gt(r,"unexpected end of the stream within a single quoted scalar")}function bpe(r,e){var t,i,n,s,o,a;if(a=r.input.charCodeAt(r.position),a!==34)return!1;for(r.kind="scalar",r.result="",r.position++,t=i=r.position;(a=r.input.charCodeAt(r.position))!==0;){if(a===34)return PA(r,t,r.position,!0),r.position++,!0;if(a===92){if(PA(r,t,r.position,!0),a=r.input.charCodeAt(++r.position),vo(a))Jr(r,!1,e);else if(a<256&&D2[a])r.result+=R2[a],r.position++;else if((o=Epe(a))>0){for(n=o,s=0;n>0;n--)a=r.input.charCodeAt(++r.position),(o=mpe(a))>=0?s=(s<<4)+o:gt(r,"expected hexadecimal character");r.result+=ype(s),r.position++}else gt(r,"unknown escape sequence");t=i=r.position}else vo(a)?(PA(r,t,i,!0),zS(r,Jr(r,!1,e)),t=i=r.position):r.position===r.lineStart&&yI(r)?gt(r,"unexpected end of the document within a double quoted scalar"):(r.position++,i=r.position)}gt(r,"unexpected end of the stream within a double quoted scalar")}function Spe(r,e){var t=!0,i,n=r.tag,s,o=r.anchor,a,l,c,u,g,h={},p,d,m,y;if(y=r.input.charCodeAt(r.position),y===91)l=93,g=!1,s=[];else if(y===123)l=125,g=!0,s={};else return!1;for(r.anchor!==null&&(r.anchorMap[r.anchor]=s),y=r.input.charCodeAt(++r.position);y!==0;){if(Jr(r,!0,e),y=r.input.charCodeAt(r.position),y===l)return r.position++,r.tag=n,r.anchor=o,r.kind=g?"mapping":"sequence",r.result=s,!0;t||gt(r,"missed comma between flow collection entries"),d=p=m=null,c=u=!1,y===63&&(a=r.input.charCodeAt(r.position+1),fn(a)&&(c=u=!0,r.position++,Jr(r,!0,e))),i=r.line,Kg(r,e,mI,!1,!0),d=r.tag,p=r.result,Jr(r,!0,e),y=r.input.charCodeAt(r.position),(u||r.line===i)&&y===58&&(c=!0,y=r.input.charCodeAt(++r.position),Jr(r,!0,e),Kg(r,e,mI,!1,!0),m=r.result),g?Mg(r,s,h,d,p,m):c?s.push(Mg(r,null,h,d,p,m)):s.push(p),Jr(r,!0,e),y=r.input.charCodeAt(r.position),y===44?(t=!0,y=r.input.charCodeAt(++r.position)):t=!1}gt(r,"unexpected end of the stream within a flow collection")}function vpe(r,e){var t,i,n=JS,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=r.input.charCodeAt(r.position),g===124)i=!1;else if(g===62)i=!0;else return!1;for(r.kind="scalar",r.result="";g!==0;)if(g=r.input.charCodeAt(++r.position),g===43||g===45)JS===n?n=g===43?E2:hpe:gt(r,"repeat of a chomping mode identifier");else if((u=Ipe(g))>=0)u===0?gt(r,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?gt(r,"repeat of an indentation width identifier"):(a=e+u-1,o=!0);else break;if(ac(g)){do g=r.input.charCodeAt(++r.position);while(ac(g));if(g===35)do g=r.input.charCodeAt(++r.position);while(!vo(g)&&g!==0)}for(;g!==0;){for(WS(r),r.lineIndent=0,g=r.input.charCodeAt(r.position);(!o||r.lineIndenta&&(a=r.lineIndent),vo(g)){l++;continue}if(r.lineIndente)&&l!==0)gt(r,"bad indentation of a sequence entry");else if(r.lineIndente)&&(Kg(r,e,EI,!0,n)&&(d?h=r.result:p=r.result),d||(Mg(r,c,u,g,h,p,s,o),g=h=p=null),Jr(r,!0,-1),y=r.input.charCodeAt(r.position)),r.lineIndent>e&&y!==0)gt(r,"bad indentation of a mapping entry");else if(r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndent tag; it should be "scalar", not "'+r.kind+'"'),g=0,h=r.implicitTypes.length;g tag; it should be "'+p.kind+'", not "'+r.kind+'"'),p.resolve(r.result)?(r.result=p.construct(r.result),r.anchor!==null&&(r.anchorMap[r.anchor]=r.result)):gt(r,"cannot resolve a node with !<"+r.tag+"> explicit tag")):gt(r,"unknown tag !<"+r.tag+">");return r.listener!==null&&r.listener("close",r),r.tag!==null||r.anchor!==null||u}function Rpe(r){var e=r.position,t,i,n,s=!1,o;for(r.version=null,r.checkLineBreaks=r.legacy,r.tagMap={},r.anchorMap={};(o=r.input.charCodeAt(r.position))!==0&&(Jr(r,!0,-1),o=r.input.charCodeAt(r.position),!(r.lineIndent>0||o!==37));){for(s=!0,o=r.input.charCodeAt(++r.position),t=r.position;o!==0&&!fn(o);)o=r.input.charCodeAt(++r.position);for(i=r.input.slice(t,r.position),n=[],i.length<1&>(r,"directive name must not be less than one character in length");o!==0;){for(;ac(o);)o=r.input.charCodeAt(++r.position);if(o===35){do o=r.input.charCodeAt(++r.position);while(o!==0&&!vo(o));break}if(vo(o))break;for(t=r.position;o!==0&&!fn(o);)o=r.input.charCodeAt(++r.position);n.push(r.input.slice(t,r.position))}o!==0&&WS(r),kA.call(w2,i)?w2[i](r,i,n):II(r,'unknown document directive "'+i+'"')}if(Jr(r,!0,-1),r.lineIndent===0&&r.input.charCodeAt(r.position)===45&&r.input.charCodeAt(r.position+1)===45&&r.input.charCodeAt(r.position+2)===45?(r.position+=3,Jr(r,!0,-1)):s&>(r,"directives end mark is expected"),Kg(r,r.lineIndent-1,EI,!1,!0),Jr(r,!0,-1),r.checkLineBreaks&&dpe.test(r.input.slice(e,r.position))&&II(r,"non-ASCII line breaks are interpreted as content"),r.documents.push(r.result),r.position===r.lineStart&&yI(r)){r.input.charCodeAt(r.position)===46&&(r.position+=3,Jr(r,!0,-1));return}if(r.position"u"&&(t=e,e=null);var i=N2(r,t);if(typeof e!="function")return i;for(var n=0,s=i.length;n"u"&&(t=e,e=null),T2(r,e,Qa.extend({schema:S2},t))}function Npe(r,e){return L2(r,Qa.extend({schema:S2},e))}_p.exports.loadAll=T2;_p.exports.load=L2;_p.exports.safeLoadAll=Fpe;_p.exports.safeLoad=Npe});var oH=I((l_e,_S)=>{"use strict";var ed=ic(),td=Ng(),Tpe=Zp(),Lpe=Lg(),q2=Object.prototype.toString,J2=Object.prototype.hasOwnProperty,Ope=9,$p=10,Mpe=13,Kpe=32,Upe=33,Hpe=34,W2=35,jpe=37,Gpe=38,Ype=39,qpe=42,z2=44,Jpe=45,V2=58,Wpe=61,zpe=62,Vpe=63,Xpe=64,X2=91,Z2=93,Zpe=96,_2=123,_pe=124,$2=125,Ni={};Ni[0]="\\0";Ni[7]="\\a";Ni[8]="\\b";Ni[9]="\\t";Ni[10]="\\n";Ni[11]="\\v";Ni[12]="\\f";Ni[13]="\\r";Ni[27]="\\e";Ni[34]='\\"';Ni[92]="\\\\";Ni[133]="\\N";Ni[160]="\\_";Ni[8232]="\\L";Ni[8233]="\\P";var $pe=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function ede(r,e){var t,i,n,s,o,a,l;if(e===null)return{};for(t={},i=Object.keys(e),n=0,s=i.length;n0?r.charCodeAt(s-1):null,h=h&&U2(o,a)}else{for(s=0;si&&r[g+1]!==" ",g=s);else if(!Ug(o))return wI;a=s>0?r.charCodeAt(s-1):null,h=h&&U2(o,a)}c=c||u&&s-g-1>i&&r[g+1]!==" "}return!l&&!c?h&&!n(r)?tH:rH:t>9&&eH(r)?wI:c?nH:iH}function ode(r,e,t,i){r.dump=function(){if(e.length===0)return"''";if(!r.noCompatMode&&$pe.indexOf(e)!==-1)return"'"+e+"'";var n=r.indent*Math.max(1,t),s=r.lineWidth===-1?-1:Math.max(Math.min(r.lineWidth,40),r.lineWidth-n),o=i||r.flowLevel>-1&&t>=r.flowLevel;function a(l){return rde(r,l)}switch(sde(e,o,r.indent,s,a)){case tH:return e;case rH:return"'"+e.replace(/'/g,"''")+"'";case iH:return"|"+H2(e,r.indent)+j2(K2(e,n));case nH:return">"+H2(e,r.indent)+j2(K2(ade(e,s),n));case wI:return'"'+Ade(e,s)+'"';default:throw new td("impossible error: invalid scalar style")}}()}function H2(r,e){var t=eH(r)?String(e):"",i=r[r.length-1]===` +`,n=i&&(r[r.length-2]===` +`||r===` +`),s=n?"+":i?"":"-";return t+s+` +`}function j2(r){return r[r.length-1]===` +`?r.slice(0,-1):r}function ade(r,e){for(var t=/(\n+)([^\n]*)/g,i=function(){var c=r.indexOf(` +`);return c=c!==-1?c:r.length,t.lastIndex=c,G2(r.slice(0,c),e)}(),n=r[0]===` +`||r[0]===" ",s,o;o=t.exec(r);){var a=o[1],l=o[2];s=l[0]===" ",i+=a+(!n&&!s&&l!==""?` +`:"")+G2(l,e),n=s}return i}function G2(r,e){if(r===""||r[0]===" ")return r;for(var t=/ [^ ]/g,i,n=0,s,o=0,a=0,l="";i=t.exec(r);)a=i.index,a-n>e&&(s=o>n?o:a,l+=` +`+r.slice(n,s),n=s+1),o=a;return l+=` +`,r.length-n>e&&o>n?l+=r.slice(n,o)+` +`+r.slice(o+1):l+=r.slice(n),l.slice(1)}function Ade(r){for(var e="",t,i,n,s=0;s=55296&&t<=56319&&(i=r.charCodeAt(s+1),i>=56320&&i<=57343)){e+=M2((t-55296)*1024+i-56320+65536),s++;continue}n=Ni[t],e+=!n&&Ug(t)?r[s]:n||M2(t)}return e}function lde(r,e,t){var i="",n=r.tag,s,o;for(s=0,o=t.length;s1024&&(u+="? "),u+=r.dump+(r.condenseFlow?'"':"")+":"+(r.condenseFlow?"":" "),Ac(r,e,c,!1,!1)&&(u+=r.dump,i+=u));r.tag=n,r.dump="{"+i+"}"}function gde(r,e,t,i){var n="",s=r.tag,o=Object.keys(t),a,l,c,u,g,h;if(r.sortKeys===!0)o.sort();else if(typeof r.sortKeys=="function")o.sort(r.sortKeys);else if(r.sortKeys)throw new td("sortKeys must be a boolean or a function");for(a=0,l=o.length;a1024,g&&(r.dump&&$p===r.dump.charCodeAt(0)?h+="?":h+="? "),h+=r.dump,g&&(h+=VS(r,e)),Ac(r,e+1,u,!0,g)&&(r.dump&&$p===r.dump.charCodeAt(0)?h+=":":h+=": ",h+=r.dump,n+=h));r.tag=s,r.dump=n||"{}"}function Y2(r,e,t){var i,n,s,o,a,l;for(n=t?r.explicitTypes:r.implicitTypes,s=0,o=n.length;s tag resolver accepts not "'+l+'" style');r.dump=i}return!0}return!1}function Ac(r,e,t,i,n,s){r.tag=null,r.dump=t,Y2(r,t,!1)||Y2(r,t,!0);var o=q2.call(r.dump);i&&(i=r.flowLevel<0||r.flowLevel>e);var a=o==="[object Object]"||o==="[object Array]",l,c;if(a&&(l=r.duplicates.indexOf(t),c=l!==-1),(r.tag!==null&&r.tag!=="?"||c||r.indent!==2&&e>0)&&(n=!1),c&&r.usedDuplicates[l])r.dump="*ref_"+l;else{if(a&&c&&!r.usedDuplicates[l]&&(r.usedDuplicates[l]=!0),o==="[object Object]")i&&Object.keys(r.dump).length!==0?(gde(r,e,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(ude(r,e,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump));else if(o==="[object Array]"){var u=r.noArrayIndent&&e>0?e-1:e;i&&r.dump.length!==0?(cde(r,u,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(lde(r,u,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump))}else if(o==="[object String]")r.tag!=="?"&&ode(r,r.dump,e,s);else{if(r.skipInvalid)return!1;throw new td("unacceptable kind of an object to dump "+o)}r.tag!==null&&r.tag!=="?"&&(r.dump="!<"+r.tag+"> "+r.dump)}return!0}function fde(r,e){var t=[],i=[],n,s;for(XS(r,t,i),n=0,s=i.length;n{"use strict";var BI=O2(),aH=oH();function QI(r){return function(){throw new Error("Function "+r+" is deprecated and cannot be used.")}}Dr.exports.Type=ni();Dr.exports.Schema=nc();Dr.exports.FAILSAFE_SCHEMA=dI();Dr.exports.JSON_SCHEMA=GS();Dr.exports.CORE_SCHEMA=YS();Dr.exports.DEFAULT_SAFE_SCHEMA=Lg();Dr.exports.DEFAULT_FULL_SCHEMA=Zp();Dr.exports.load=BI.load;Dr.exports.loadAll=BI.loadAll;Dr.exports.safeLoad=BI.safeLoad;Dr.exports.safeLoadAll=BI.safeLoadAll;Dr.exports.dump=aH.dump;Dr.exports.safeDump=aH.safeDump;Dr.exports.YAMLException=Ng();Dr.exports.MINIMAL_SCHEMA=dI();Dr.exports.SAFE_SCHEMA=Lg();Dr.exports.DEFAULT_SCHEMA=Zp();Dr.exports.scan=QI("scan");Dr.exports.parse=QI("parse");Dr.exports.compose=QI("compose");Dr.exports.addConstructor=QI("addConstructor")});var cH=I((u_e,lH)=>{"use strict";var pde=AH();lH.exports=pde});var gH=I((g_e,uH)=>{"use strict";function dde(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function lc(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,lc)}dde(lc,Error);lc.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,h=1;g({[Le]:pe})))},H=function(D){return D},q=function(D){return D},_=Ks("correct indentation"),X=" ",W=sr(" ",!1),Z=function(D){return D.length===bA*Ig},A=function(D){return D.length===(bA+1)*Ig},ne=function(){return bA++,!0},ue=function(){return bA--,!0},te=function(){return dg()},O=Ks("pseudostring"),N=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,ce=Ln(["\r",` +`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),he=/^[^\r\n\t ,\][{}:#"']/,Pe=Ln(["\r",` +`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),De=function(){return dg().replace(/^ *| *$/g,"")},Re="--",se=sr("--",!1),Ae=/^[a-zA-Z\/0-9]/,ye=Ln([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),ge=/^[^\r\n\t :,]/,oe=Ln(["\r",` +`," "," ",":",","],!0,!1),Ye="null",ie=sr("null",!1),G=function(){return null},fe="true",re=sr("true",!1),de=function(){return!0},Ze="false",vt=sr("false",!1),mt=function(){return!1},Tr=Ks("string"),ti='"',ui=sr('"',!1),gr=function(){return""},gi=function(D){return D},ri=function(D){return D.join("")},Ms=/^[^"\\\0-\x1F\x7F]/,fr=Ln(['"',"\\",["\0",""],"\x7F"],!0,!1),Ei='\\"',rs=sr('\\"',!1),ua=function(){return'"'},CA="\\\\",gg=sr("\\\\",!1),is=function(){return"\\"},mA="\\/",ga=sr("\\/",!1),wp=function(){return"/"},EA="\\b",IA=sr("\\b",!1),Ir=function(){return"\b"},Nl="\\f",fg=sr("\\f",!1),Io=function(){return"\f"},hg="\\n",Bp=sr("\\n",!1),Qp=function(){return` +`},br="\\r",Ri=sr("\\r",!1),yo=function(){return"\r"},Nn="\\t",ae=sr("\\t",!1),yt=function(){return" "},Tl="\\u",Tn=sr("\\u",!1),ns=function(D,Y,pe,Le){return String.fromCharCode(parseInt(`0x${D}${Y}${pe}${Le}`))},ss=/^[0-9a-fA-F]/,ut=Ln([["0","9"],["a","f"],["A","F"]],!1,!1),wo=Ks("blank space"),At=/^[ \t]/,An=Ln([" "," "],!1,!1),b=Ks("white space"),Nt=/^[ \t\n\r]/,pg=Ln([" "," ",` +`,"\r"],!1,!1),Ll=`\r +`,bp=sr(`\r +`,!1),Sp=` +`,vp=sr(` +`,!1),xp="\r",Pp=sr("\r",!1),j=0,Et=0,yA=[{line:1,column:1}],Wi=0,Ol=[],ze=0,fa;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function dg(){return r.substring(Et,j)}function OE(){return ln(Et,j)}function kp(D,Y){throw Y=Y!==void 0?Y:ln(Et,j),Kl([Ks(D)],r.substring(Et,j),Y)}function ME(D,Y){throw Y=Y!==void 0?Y:ln(Et,j),Cg(D,Y)}function sr(D,Y){return{type:"literal",text:D,ignoreCase:Y}}function Ln(D,Y,pe){return{type:"class",parts:D,inverted:Y,ignoreCase:pe}}function Ml(){return{type:"any"}}function Dp(){return{type:"end"}}function Ks(D){return{type:"other",description:D}}function ha(D){var Y=yA[D],pe;if(Y)return Y;for(pe=D-1;!yA[pe];)pe--;for(Y=yA[pe],Y={line:Y.line,column:Y.column};peWi&&(Wi=j,Ol=[]),Ol.push(D))}function Cg(D,Y){return new lc(D,null,null,Y)}function Kl(D,Y,pe){return new lc(lc.buildMessage(D,Y),D,Y,pe)}function Us(){var D;return D=mg(),D}function Ul(){var D,Y,pe;for(D=j,Y=[],pe=wA();pe!==t;)Y.push(pe),pe=wA();return Y!==t&&(Et=D,Y=s(Y)),D=Y,D}function wA(){var D,Y,pe,Le,ke;return D=j,Y=da(),Y!==t?(r.charCodeAt(j)===45?(pe=o,j++):(pe=t,ze===0&&Ne(a)),pe!==t?(Le=Lr(),Le!==t?(ke=pa(),ke!==t?(Et=D,Y=l(ke),D=Y):(j=D,D=t)):(j=D,D=t)):(j=D,D=t)):(j=D,D=t),D}function mg(){var D,Y,pe;for(D=j,Y=[],pe=Eg();pe!==t;)Y.push(pe),pe=Eg();return Y!==t&&(Et=D,Y=c(Y)),D=Y,D}function Eg(){var D,Y,pe,Le,ke,Je,pt,Xt,Ea;if(D=j,Y=Lr(),Y===t&&(Y=null),Y!==t){if(pe=j,r.charCodeAt(j)===35?(Le=u,j++):(Le=t,ze===0&&Ne(g)),Le!==t){if(ke=[],Je=j,pt=j,ze++,Xt=js(),ze--,Xt===t?pt=void 0:(j=pt,pt=t),pt!==t?(r.length>j?(Xt=r.charAt(j),j++):(Xt=t,ze===0&&Ne(h)),Xt!==t?(pt=[pt,Xt],Je=pt):(j=Je,Je=t)):(j=Je,Je=t),Je!==t)for(;Je!==t;)ke.push(Je),Je=j,pt=j,ze++,Xt=js(),ze--,Xt===t?pt=void 0:(j=pt,pt=t),pt!==t?(r.length>j?(Xt=r.charAt(j),j++):(Xt=t,ze===0&&Ne(h)),Xt!==t?(pt=[pt,Xt],Je=pt):(j=Je,Je=t)):(j=Je,Je=t);else ke=t;ke!==t?(Le=[Le,ke],pe=Le):(j=pe,pe=t)}else j=pe,pe=t;if(pe===t&&(pe=null),pe!==t){if(Le=[],ke=Hs(),ke!==t)for(;ke!==t;)Le.push(ke),ke=Hs();else Le=t;Le!==t?(Et=D,Y=p(),D=Y):(j=D,D=t)}else j=D,D=t}else j=D,D=t;if(D===t&&(D=j,Y=da(),Y!==t?(pe=Rp(),pe!==t?(Le=Lr(),Le===t&&(Le=null),Le!==t?(r.charCodeAt(j)===58?(ke=d,j++):(ke=t,ze===0&&Ne(m)),ke!==t?(Je=Lr(),Je===t&&(Je=null),Je!==t?(pt=pa(),pt!==t?(Et=D,Y=y(pe,pt),D=Y):(j=D,D=t)):(j=D,D=t)):(j=D,D=t)):(j=D,D=t)):(j=D,D=t)):(j=D,D=t),D===t&&(D=j,Y=da(),Y!==t?(pe=Ca(),pe!==t?(Le=Lr(),Le===t&&(Le=null),Le!==t?(r.charCodeAt(j)===58?(ke=d,j++):(ke=t,ze===0&&Ne(m)),ke!==t?(Je=Lr(),Je===t&&(Je=null),Je!==t?(pt=pa(),pt!==t?(Et=D,Y=y(pe,pt),D=Y):(j=D,D=t)):(j=D,D=t)):(j=D,D=t)):(j=D,D=t)):(j=D,D=t)):(j=D,D=t),D===t))){if(D=j,Y=da(),Y!==t)if(pe=Ca(),pe!==t)if(Le=Lr(),Le!==t)if(ke=jl(),ke!==t){if(Je=[],pt=Hs(),pt!==t)for(;pt!==t;)Je.push(pt),pt=Hs();else Je=t;Je!==t?(Et=D,Y=y(pe,ke),D=Y):(j=D,D=t)}else j=D,D=t;else j=D,D=t;else j=D,D=t;else j=D,D=t;if(D===t)if(D=j,Y=da(),Y!==t)if(pe=Ca(),pe!==t){if(Le=[],ke=j,Je=Lr(),Je===t&&(Je=null),Je!==t?(r.charCodeAt(j)===44?(pt=B,j++):(pt=t,ze===0&&Ne(S)),pt!==t?(Xt=Lr(),Xt===t&&(Xt=null),Xt!==t?(Ea=Ca(),Ea!==t?(Et=ke,Je=P(pe,Ea),ke=Je):(j=ke,ke=t)):(j=ke,ke=t)):(j=ke,ke=t)):(j=ke,ke=t),ke!==t)for(;ke!==t;)Le.push(ke),ke=j,Je=Lr(),Je===t&&(Je=null),Je!==t?(r.charCodeAt(j)===44?(pt=B,j++):(pt=t,ze===0&&Ne(S)),pt!==t?(Xt=Lr(),Xt===t&&(Xt=null),Xt!==t?(Ea=Ca(),Ea!==t?(Et=ke,Je=P(pe,Ea),ke=Je):(j=ke,ke=t)):(j=ke,ke=t)):(j=ke,ke=t)):(j=ke,ke=t);else Le=t;Le!==t?(ke=Lr(),ke===t&&(ke=null),ke!==t?(r.charCodeAt(j)===58?(Je=d,j++):(Je=t,ze===0&&Ne(m)),Je!==t?(pt=Lr(),pt===t&&(pt=null),pt!==t?(Xt=pa(),Xt!==t?(Et=D,Y=F(pe,Le,Xt),D=Y):(j=D,D=t)):(j=D,D=t)):(j=D,D=t)):(j=D,D=t)):(j=D,D=t)}else j=D,D=t;else j=D,D=t}return D}function pa(){var D,Y,pe,Le,ke,Je,pt;if(D=j,Y=j,ze++,pe=j,Le=js(),Le!==t?(ke=tt(),ke!==t?(r.charCodeAt(j)===45?(Je=o,j++):(Je=t,ze===0&&Ne(a)),Je!==t?(pt=Lr(),pt!==t?(Le=[Le,ke,Je,pt],pe=Le):(j=pe,pe=t)):(j=pe,pe=t)):(j=pe,pe=t)):(j=pe,pe=t),ze--,pe!==t?(j=Y,Y=void 0):Y=t,Y!==t?(pe=Hs(),pe!==t?(Le=Bo(),Le!==t?(ke=Ul(),ke!==t?(Je=BA(),Je!==t?(Et=D,Y=H(ke),D=Y):(j=D,D=t)):(j=D,D=t)):(j=D,D=t)):(j=D,D=t)):(j=D,D=t),D===t&&(D=j,Y=js(),Y!==t?(pe=Bo(),pe!==t?(Le=mg(),Le!==t?(ke=BA(),ke!==t?(Et=D,Y=H(Le),D=Y):(j=D,D=t)):(j=D,D=t)):(j=D,D=t)):(j=D,D=t),D===t))if(D=j,Y=Hl(),Y!==t){if(pe=[],Le=Hs(),Le!==t)for(;Le!==t;)pe.push(Le),Le=Hs();else pe=t;pe!==t?(Et=D,Y=q(Y),D=Y):(j=D,D=t)}else j=D,D=t;return D}function da(){var D,Y,pe;for(ze++,D=j,Y=[],r.charCodeAt(j)===32?(pe=X,j++):(pe=t,ze===0&&Ne(W));pe!==t;)Y.push(pe),r.charCodeAt(j)===32?(pe=X,j++):(pe=t,ze===0&&Ne(W));return Y!==t?(Et=j,pe=Z(Y),pe?pe=void 0:pe=t,pe!==t?(Y=[Y,pe],D=Y):(j=D,D=t)):(j=D,D=t),ze--,D===t&&(Y=t,ze===0&&Ne(_)),D}function tt(){var D,Y,pe;for(D=j,Y=[],r.charCodeAt(j)===32?(pe=X,j++):(pe=t,ze===0&&Ne(W));pe!==t;)Y.push(pe),r.charCodeAt(j)===32?(pe=X,j++):(pe=t,ze===0&&Ne(W));return Y!==t?(Et=j,pe=A(Y),pe?pe=void 0:pe=t,pe!==t?(Y=[Y,pe],D=Y):(j=D,D=t)):(j=D,D=t),D}function Bo(){var D;return Et=j,D=ne(),D?D=void 0:D=t,D}function BA(){var D;return Et=j,D=ue(),D?D=void 0:D=t,D}function Rp(){var D;return D=Gl(),D===t&&(D=QA()),D}function Ca(){var D,Y,pe;if(D=Gl(),D===t){if(D=j,Y=[],pe=ma(),pe!==t)for(;pe!==t;)Y.push(pe),pe=ma();else Y=t;Y!==t&&(Et=D,Y=te()),D=Y}return D}function Hl(){var D;return D=Fp(),D===t&&(D=KE(),D===t&&(D=Gl(),D===t&&(D=QA()))),D}function jl(){var D;return D=Fp(),D===t&&(D=Gl(),D===t&&(D=ma())),D}function QA(){var D,Y,pe,Le,ke,Je;if(ze++,D=j,N.test(r.charAt(j))?(Y=r.charAt(j),j++):(Y=t,ze===0&&Ne(ce)),Y!==t){for(pe=[],Le=j,ke=Lr(),ke===t&&(ke=null),ke!==t?(he.test(r.charAt(j))?(Je=r.charAt(j),j++):(Je=t,ze===0&&Ne(Pe)),Je!==t?(ke=[ke,Je],Le=ke):(j=Le,Le=t)):(j=Le,Le=t);Le!==t;)pe.push(Le),Le=j,ke=Lr(),ke===t&&(ke=null),ke!==t?(he.test(r.charAt(j))?(Je=r.charAt(j),j++):(Je=t,ze===0&&Ne(Pe)),Je!==t?(ke=[ke,Je],Le=ke):(j=Le,Le=t)):(j=Le,Le=t);pe!==t?(Et=D,Y=De(),D=Y):(j=D,D=t)}else j=D,D=t;return ze--,D===t&&(Y=t,ze===0&&Ne(O)),D}function ma(){var D,Y,pe,Le,ke;if(D=j,r.substr(j,2)===Re?(Y=Re,j+=2):(Y=t,ze===0&&Ne(se)),Y===t&&(Y=null),Y!==t)if(Ae.test(r.charAt(j))?(pe=r.charAt(j),j++):(pe=t,ze===0&&Ne(ye)),pe!==t){for(Le=[],ge.test(r.charAt(j))?(ke=r.charAt(j),j++):(ke=t,ze===0&&Ne(oe));ke!==t;)Le.push(ke),ge.test(r.charAt(j))?(ke=r.charAt(j),j++):(ke=t,ze===0&&Ne(oe));Le!==t?(Et=D,Y=De(),D=Y):(j=D,D=t)}else j=D,D=t;else j=D,D=t;return D}function Fp(){var D,Y;return D=j,r.substr(j,4)===Ye?(Y=Ye,j+=4):(Y=t,ze===0&&Ne(ie)),Y!==t&&(Et=D,Y=G()),D=Y,D}function KE(){var D,Y;return D=j,r.substr(j,4)===fe?(Y=fe,j+=4):(Y=t,ze===0&&Ne(re)),Y!==t&&(Et=D,Y=de()),D=Y,D===t&&(D=j,r.substr(j,5)===Ze?(Y=Ze,j+=5):(Y=t,ze===0&&Ne(vt)),Y!==t&&(Et=D,Y=mt()),D=Y),D}function Gl(){var D,Y,pe,Le;return ze++,D=j,r.charCodeAt(j)===34?(Y=ti,j++):(Y=t,ze===0&&Ne(ui)),Y!==t?(r.charCodeAt(j)===34?(pe=ti,j++):(pe=t,ze===0&&Ne(ui)),pe!==t?(Et=D,Y=gr(),D=Y):(j=D,D=t)):(j=D,D=t),D===t&&(D=j,r.charCodeAt(j)===34?(Y=ti,j++):(Y=t,ze===0&&Ne(ui)),Y!==t?(pe=UE(),pe!==t?(r.charCodeAt(j)===34?(Le=ti,j++):(Le=t,ze===0&&Ne(ui)),Le!==t?(Et=D,Y=gi(pe),D=Y):(j=D,D=t)):(j=D,D=t)):(j=D,D=t)),ze--,D===t&&(Y=t,ze===0&&Ne(Tr)),D}function UE(){var D,Y,pe;if(D=j,Y=[],pe=Np(),pe!==t)for(;pe!==t;)Y.push(pe),pe=Np();else Y=t;return Y!==t&&(Et=D,Y=ri(Y)),D=Y,D}function Np(){var D,Y,pe,Le,ke,Je;return Ms.test(r.charAt(j))?(D=r.charAt(j),j++):(D=t,ze===0&&Ne(fr)),D===t&&(D=j,r.substr(j,2)===Ei?(Y=Ei,j+=2):(Y=t,ze===0&&Ne(rs)),Y!==t&&(Et=D,Y=ua()),D=Y,D===t&&(D=j,r.substr(j,2)===CA?(Y=CA,j+=2):(Y=t,ze===0&&Ne(gg)),Y!==t&&(Et=D,Y=is()),D=Y,D===t&&(D=j,r.substr(j,2)===mA?(Y=mA,j+=2):(Y=t,ze===0&&Ne(ga)),Y!==t&&(Et=D,Y=wp()),D=Y,D===t&&(D=j,r.substr(j,2)===EA?(Y=EA,j+=2):(Y=t,ze===0&&Ne(IA)),Y!==t&&(Et=D,Y=Ir()),D=Y,D===t&&(D=j,r.substr(j,2)===Nl?(Y=Nl,j+=2):(Y=t,ze===0&&Ne(fg)),Y!==t&&(Et=D,Y=Io()),D=Y,D===t&&(D=j,r.substr(j,2)===hg?(Y=hg,j+=2):(Y=t,ze===0&&Ne(Bp)),Y!==t&&(Et=D,Y=Qp()),D=Y,D===t&&(D=j,r.substr(j,2)===br?(Y=br,j+=2):(Y=t,ze===0&&Ne(Ri)),Y!==t&&(Et=D,Y=yo()),D=Y,D===t&&(D=j,r.substr(j,2)===Nn?(Y=Nn,j+=2):(Y=t,ze===0&&Ne(ae)),Y!==t&&(Et=D,Y=yt()),D=Y,D===t&&(D=j,r.substr(j,2)===Tl?(Y=Tl,j+=2):(Y=t,ze===0&&Ne(Tn)),Y!==t?(pe=Yl(),pe!==t?(Le=Yl(),Le!==t?(ke=Yl(),ke!==t?(Je=Yl(),Je!==t?(Et=D,Y=ns(pe,Le,ke,Je),D=Y):(j=D,D=t)):(j=D,D=t)):(j=D,D=t)):(j=D,D=t)):(j=D,D=t)))))))))),D}function Yl(){var D;return ss.test(r.charAt(j))?(D=r.charAt(j),j++):(D=t,ze===0&&Ne(ut)),D}function Lr(){var D,Y;if(ze++,D=[],At.test(r.charAt(j))?(Y=r.charAt(j),j++):(Y=t,ze===0&&Ne(An)),Y!==t)for(;Y!==t;)D.push(Y),At.test(r.charAt(j))?(Y=r.charAt(j),j++):(Y=t,ze===0&&Ne(An));else D=t;return ze--,D===t&&(Y=t,ze===0&&Ne(wo)),D}function HE(){var D,Y;if(ze++,D=[],Nt.test(r.charAt(j))?(Y=r.charAt(j),j++):(Y=t,ze===0&&Ne(pg)),Y!==t)for(;Y!==t;)D.push(Y),Nt.test(r.charAt(j))?(Y=r.charAt(j),j++):(Y=t,ze===0&&Ne(pg));else D=t;return ze--,D===t&&(Y=t,ze===0&&Ne(b)),D}function Hs(){var D,Y,pe,Le,ke,Je;if(D=j,Y=js(),Y!==t){for(pe=[],Le=j,ke=Lr(),ke===t&&(ke=null),ke!==t?(Je=js(),Je!==t?(ke=[ke,Je],Le=ke):(j=Le,Le=t)):(j=Le,Le=t);Le!==t;)pe.push(Le),Le=j,ke=Lr(),ke===t&&(ke=null),ke!==t?(Je=js(),Je!==t?(ke=[ke,Je],Le=ke):(j=Le,Le=t)):(j=Le,Le=t);pe!==t?(Y=[Y,pe],D=Y):(j=D,D=t)}else j=D,D=t;return D}function js(){var D;return r.substr(j,2)===Ll?(D=Ll,j+=2):(D=t,ze===0&&Ne(bp)),D===t&&(r.charCodeAt(j)===10?(D=Sp,j++):(D=t,ze===0&&Ne(vp)),D===t&&(r.charCodeAt(j)===13?(D=xp,j++):(D=t,ze===0&&Ne(Pp)))),D}let Ig=2,bA=0;if(fa=n(),fa!==t&&j===r.length)return fa;throw fa!==t&&j{"use strict";var wde=r=>{let e=!1,t=!1,i=!1;for(let n=0;n{if(!(typeof r=="string"||Array.isArray(r)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let t=n=>e.pascalCase?n.charAt(0).toUpperCase()+n.slice(1):n;return Array.isArray(r)?r=r.map(n=>n.trim()).filter(n=>n.length).join("-"):r=r.trim(),r.length===0?"":r.length===1?e.pascalCase?r.toUpperCase():r.toLowerCase():(r!==r.toLowerCase()&&(r=wde(r)),r=r.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\d+(\w|$)/g,n=>n.toUpperCase()),t(r))};ev.exports=CH;ev.exports.default=CH});var EH=I((m_e,Bde)=>{Bde.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vercel",constant:"VERCEL",env:"NOW_BUILDER"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"}]});var cc=I(Un=>{"use strict";var yH=EH(),xo=process.env;Object.defineProperty(Un,"_vendors",{value:yH.map(function(r){return r.constant})});Un.name=null;Un.isPR=null;yH.forEach(function(r){let t=(Array.isArray(r.env)?r.env:[r.env]).every(function(i){return IH(i)});if(Un[r.constant]=t,t)switch(Un.name=r.name,typeof r.pr){case"string":Un.isPR=!!xo[r.pr];break;case"object":"env"in r.pr?Un.isPR=r.pr.env in xo&&xo[r.pr.env]!==r.pr.ne:"any"in r.pr?Un.isPR=r.pr.any.some(function(i){return!!xo[i]}):Un.isPR=IH(r.pr);break;default:Un.isPR=null}});Un.isCI=!!(xo.CI||xo.CONTINUOUS_INTEGRATION||xo.BUILD_NUMBER||xo.RUN_ID||Un.name);function IH(r){return typeof r=="string"?!!xo[r]:Object.keys(r).every(function(e){return xo[e]===r[e]})}});var hn={};ct(hn,{KeyRelationship:()=>uc,applyCascade:()=>ad,base64RegExp:()=>SH,colorStringAlphaRegExp:()=>bH,colorStringRegExp:()=>QH,computeKey:()=>DA,getPrintable:()=>Wr,hasExactLength:()=>DH,hasForbiddenKeys:()=>tCe,hasKeyRelationship:()=>av,hasMaxLength:()=>Mde,hasMinLength:()=>Ode,hasMutuallyExclusiveKeys:()=>rCe,hasRequiredKeys:()=>eCe,hasUniqueItems:()=>Kde,isArray:()=>Pde,isAtLeast:()=>jde,isAtMost:()=>Gde,isBase64:()=>_de,isBoolean:()=>Sde,isDate:()=>xde,isDict:()=>Dde,isEnum:()=>Xi,isHexColor:()=>Zde,isISO8601:()=>Xde,isInExclusiveRange:()=>qde,isInInclusiveRange:()=>Yde,isInstanceOf:()=>Fde,isInteger:()=>Jde,isJSON:()=>$de,isLiteral:()=>Qde,isLowerCase:()=>Wde,isNegative:()=>Ude,isNullable:()=>Lde,isNumber:()=>vde,isObject:()=>Rde,isOneOf:()=>Nde,isOptional:()=>Tde,isPositive:()=>Hde,isString:()=>od,isTuple:()=>kde,isUUID4:()=>Vde,isUnknown:()=>kH,isUpperCase:()=>zde,iso8601RegExp:()=>ov,makeCoercionFn:()=>gc,makeSetter:()=>PH,makeTrait:()=>xH,makeValidator:()=>Bt,matchesRegExp:()=>Ad,plural:()=>kI,pushError:()=>ht,simpleKeyRegExp:()=>BH,uuid4RegExp:()=>vH});function Bt({test:r}){return xH(r)()}function Wr(r){return r===null?"null":r===void 0?"undefined":r===""?"an empty string":JSON.stringify(r)}function DA(r,e){var t,i,n;return typeof e=="number"?`${(t=r==null?void 0:r.p)!==null&&t!==void 0?t:"."}[${e}]`:BH.test(e)?`${(i=r==null?void 0:r.p)!==null&&i!==void 0?i:""}.${e}`:`${(n=r==null?void 0:r.p)!==null&&n!==void 0?n:"."}[${JSON.stringify(e)}]`}function gc(r,e){return t=>{let i=r[e];return r[e]=t,gc(r,e).bind(null,i)}}function PH(r,e){return t=>{r[e]=t}}function kI(r,e,t){return r===1?e:t}function ht({errors:r,p:e}={},t){return r==null||r.push(`${e!=null?e:"."}: ${t}`),!1}function Qde(r){return Bt({test:(e,t)=>e!==r?ht(t,`Expected a literal (got ${Wr(r)})`):!0})}function Xi(r){let e=Array.isArray(r)?r:Object.values(r),t=new Set(e);return Bt({test:(i,n)=>t.has(i)?!0:ht(n,`Expected a valid enumeration value (got ${Wr(i)})`)})}var BH,QH,bH,SH,vH,ov,xH,kH,od,bde,Sde,vde,xde,Pde,kde,Dde,Rde,Fde,Nde,ad,Tde,Lde,Ode,Mde,DH,Kde,Ude,Hde,jde,Gde,Yde,qde,Jde,Ad,Wde,zde,Vde,Xde,Zde,_de,$de,eCe,tCe,rCe,uc,iCe,av,As=Hge(()=>{BH=/^[a-zA-Z_][a-zA-Z0-9_]*$/,QH=/^#[0-9a-f]{6}$/i,bH=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,SH=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,vH=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,ov=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/,xH=r=>()=>r;kH=()=>Bt({test:(r,e)=>!0});od=()=>Bt({test:(r,e)=>typeof r!="string"?ht(e,`Expected a string (got ${Wr(r)})`):!0});bde=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]),Sde=()=>Bt({test:(r,e)=>{var t;if(typeof r!="boolean"){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return ht(e,"Unbound coercion result");let i=bde.get(r);if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return ht(e,`Expected a boolean (got ${Wr(r)})`)}return!0}}),vde=()=>Bt({test:(r,e)=>{var t;if(typeof r!="number"){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return ht(e,"Unbound coercion result");let i;if(typeof r=="string"){let n;try{n=JSON.parse(r)}catch{}if(typeof n=="number")if(JSON.stringify(n)===r)i=n;else return ht(e,`Received a number that can't be safely represented by the runtime (${r})`)}if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return ht(e,`Expected a number (got ${Wr(r)})`)}return!0}}),xde=()=>Bt({test:(r,e)=>{var t;if(!(r instanceof Date)){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return ht(e,"Unbound coercion result");let i;if(typeof r=="string"&&ov.test(r))i=new Date(r);else{let n;if(typeof r=="string"){let s;try{s=JSON.parse(r)}catch{}typeof s=="number"&&(n=s)}else typeof r=="number"&&(n=r);if(typeof n<"u")if(Number.isSafeInteger(n)||!Number.isSafeInteger(n*1e3))i=new Date(n*1e3);else return ht(e,`Received a timestamp that can't be safely represented by the runtime (${r})`)}if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return ht(e,`Expected a date (got ${Wr(r)})`)}return!0}}),Pde=(r,{delimiter:e}={})=>Bt({test:(t,i)=>{var n;if(typeof t=="string"&&typeof e<"u"&&typeof(i==null?void 0:i.coercions)<"u"){if(typeof(i==null?void 0:i.coercion)>"u")return ht(i,"Unbound coercion result");t=t.split(e),i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,t)])}if(!Array.isArray(t))return ht(i,`Expected an array (got ${Wr(t)})`);let s=!0;for(let o=0,a=t.length;o{let t=DH(r.length);return Bt({test:(i,n)=>{var s;if(typeof i=="string"&&typeof e<"u"&&typeof(n==null?void 0:n.coercions)<"u"){if(typeof(n==null?void 0:n.coercion)>"u")return ht(n,"Unbound coercion result");i=i.split(e),n.coercions.push([(s=n.p)!==null&&s!==void 0?s:".",n.coercion.bind(null,i)])}if(!Array.isArray(i))return ht(n,`Expected a tuple (got ${Wr(i)})`);let o=t(i,Object.assign({},n));for(let a=0,l=i.length;aBt({test:(t,i)=>{if(typeof t!="object"||t===null)return ht(i,`Expected an object (got ${Wr(t)})`);let n=Object.keys(t),s=!0;for(let o=0,a=n.length;o{let t=Object.keys(r);return Bt({test:(i,n)=>{if(typeof i!="object"||i===null)return ht(n,`Expected an object (got ${Wr(i)})`);let s=new Set([...t,...Object.keys(i)]),o={},a=!0;for(let l of s){if(l==="constructor"||l==="__proto__")a=ht(Object.assign(Object.assign({},n),{p:DA(n,l)}),"Unsafe property name");else{let c=Object.prototype.hasOwnProperty.call(r,l)?r[l]:void 0,u=Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;typeof c<"u"?a=c(u,Object.assign(Object.assign({},n),{p:DA(n,l),coercion:gc(i,l)}))&&a:e===null?a=ht(Object.assign(Object.assign({},n),{p:DA(n,l)}),`Extraneous property (got ${Wr(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:PH(i,l)})}if(!a&&(n==null?void 0:n.errors)==null)break}return e!==null&&(a||(n==null?void 0:n.errors)!=null)&&(a=e(o,n)&&a),a}})},Fde=r=>Bt({test:(e,t)=>e instanceof r?!0:ht(t,`Expected an instance of ${r.name} (got ${Wr(e)})`)}),Nde=(r,{exclusive:e=!1}={})=>Bt({test:(t,i)=>{var n,s,o;let a=[],l=typeof(i==null?void 0:i.errors)<"u"?[]:void 0;for(let c=0,u=r.length;c1?ht(i,`Expected to match exactly a single predicate (matched ${a.join(", ")})`):(o=i==null?void 0:i.errors)===null||o===void 0||o.push(...l),!1}}),ad=(r,e)=>Bt({test:(t,i)=>{var n,s;let o={value:t},a=typeof(i==null?void 0:i.coercions)<"u"?gc(o,"value"):void 0,l=typeof(i==null?void 0:i.coercions)<"u"?[]:void 0;if(!r(t,Object.assign(Object.assign({},i),{coercion:a,coercions:l})))return!1;let c=[];if(typeof l<"u")for(let[,u]of l)c.push(u());try{if(typeof(i==null?void 0:i.coercions)<"u"){if(o.value!==t){if(typeof(i==null?void 0:i.coercion)>"u")return ht(i,"Unbound coercion result");i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,o.value)])}(s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...l)}return e.every(u=>u(o.value,i))}finally{for(let u of c)u()}}}),Tde=r=>Bt({test:(e,t)=>typeof e>"u"?!0:r(e,t)}),Lde=r=>Bt({test:(e,t)=>e===null?!0:r(e,t)}),Ode=r=>Bt({test:(e,t)=>e.length>=r?!0:ht(t,`Expected to have a length of at least ${r} elements (got ${e.length})`)}),Mde=r=>Bt({test:(e,t)=>e.length<=r?!0:ht(t,`Expected to have a length of at most ${r} elements (got ${e.length})`)}),DH=r=>Bt({test:(e,t)=>e.length!==r?ht(t,`Expected to have a length of exactly ${r} elements (got ${e.length})`):!0}),Kde=({map:r}={})=>Bt({test:(e,t)=>{let i=new Set,n=new Set;for(let s=0,o=e.length;sBt({test:(r,e)=>r<=0?!0:ht(e,`Expected to be negative (got ${r})`)}),Hde=()=>Bt({test:(r,e)=>r>=0?!0:ht(e,`Expected to be positive (got ${r})`)}),jde=r=>Bt({test:(e,t)=>e>=r?!0:ht(t,`Expected to be at least ${r} (got ${e})`)}),Gde=r=>Bt({test:(e,t)=>e<=r?!0:ht(t,`Expected to be at most ${r} (got ${e})`)}),Yde=(r,e)=>Bt({test:(t,i)=>t>=r&&t<=e?!0:ht(i,`Expected to be in the [${r}; ${e}] range (got ${t})`)}),qde=(r,e)=>Bt({test:(t,i)=>t>=r&&tBt({test:(e,t)=>e!==Math.round(e)?ht(t,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:ht(t,`Expected to be a safe integer (got ${e})`)}),Ad=r=>Bt({test:(e,t)=>r.test(e)?!0:ht(t,`Expected to match the pattern ${r.toString()} (got ${Wr(e)})`)}),Wde=()=>Bt({test:(r,e)=>r!==r.toLowerCase()?ht(e,`Expected to be all-lowercase (got ${r})`):!0}),zde=()=>Bt({test:(r,e)=>r!==r.toUpperCase()?ht(e,`Expected to be all-uppercase (got ${r})`):!0}),Vde=()=>Bt({test:(r,e)=>vH.test(r)?!0:ht(e,`Expected to be a valid UUID v4 (got ${Wr(r)})`)}),Xde=()=>Bt({test:(r,e)=>ov.test(r)?!1:ht(e,`Expected to be a valid ISO 8601 date string (got ${Wr(r)})`)}),Zde=({alpha:r=!1})=>Bt({test:(e,t)=>(r?QH.test(e):bH.test(e))?!0:ht(t,`Expected to be a valid hexadecimal color string (got ${Wr(e)})`)}),_de=()=>Bt({test:(r,e)=>SH.test(r)?!0:ht(e,`Expected to be a valid base 64 string (got ${Wr(r)})`)}),$de=(r=kH())=>Bt({test:(e,t)=>{let i;try{i=JSON.parse(e)}catch{return ht(t,`Expected to be a valid JSON string (got ${Wr(e)})`)}return r(i,t)}}),eCe=r=>{let e=new Set(r);return Bt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)||s.push(o);return s.length>0?ht(i,`Missing required ${kI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},tCe=r=>{let e=new Set(r);return Bt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>0?ht(i,`Forbidden ${kI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},rCe=r=>{let e=new Set(r);return Bt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>1?ht(i,`Mutually exclusive properties ${s.map(o=>`"${o}"`).join(", ")}`):!0}})};(function(r){r.Forbids="Forbids",r.Requires="Requires"})(uc||(uc={}));iCe={[uc.Forbids]:{expect:!1,message:"forbids using"},[uc.Requires]:{expect:!0,message:"requires using"}},av=(r,e,t,{ignore:i=[]}={})=>{let n=new Set(i),s=new Set(t),o=iCe[e];return Bt({test:(a,l)=>{let c=new Set(Object.keys(a));if(!c.has(r)||n.has(a[r]))return!0;let u=[];for(let g of s)(c.has(g)&&!n.has(a[g]))!==o.expect&&u.push(g);return u.length>=1?ht(l,`Property "${r}" ${o.message} ${kI(u.length,"property","properties")} ${u.map(g=>`"${g}"`).join(", ")}`):!0}})}});var zH=I((m$e,WH)=>{"use strict";WH.exports=(r,...e)=>new Promise(t=>{t(r(...e))})});var Jg=I((E$e,pv)=>{"use strict";var ICe=zH(),VH=r=>{if(r<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],t=0,i=()=>{t--,e.length>0&&e.shift()()},n=(a,l,...c)=>{t++;let u=ICe(a,...c);l(u),u.then(i,i)},s=(a,l,...c)=>{tnew Promise(c=>s(a,c,...l));return Object.defineProperties(o,{activeCount:{get:()=>t},pendingCount:{get:()=>e.length}}),o};pv.exports=VH;pv.exports.default=VH});var fd=I((y$e,XH)=>{var yCe="2.0.0",wCe=Number.MAX_SAFE_INTEGER||9007199254740991,BCe=16;XH.exports={SEMVER_SPEC_VERSION:yCe,MAX_LENGTH:256,MAX_SAFE_INTEGER:wCe,MAX_SAFE_COMPONENT_LENGTH:BCe}});var hd=I((w$e,ZH)=>{var QCe=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...r)=>console.error("SEMVER",...r):()=>{};ZH.exports=QCe});var fc=I((FA,_H)=>{var{MAX_SAFE_COMPONENT_LENGTH:dv}=fd(),bCe=hd();FA=_H.exports={};var SCe=FA.re=[],$e=FA.src=[],et=FA.t={},vCe=0,Qt=(r,e,t)=>{let i=vCe++;bCe(i,e),et[r]=i,$e[i]=e,SCe[i]=new RegExp(e,t?"g":void 0)};Qt("NUMERICIDENTIFIER","0|[1-9]\\d*");Qt("NUMERICIDENTIFIERLOOSE","[0-9]+");Qt("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*");Qt("MAINVERSION",`(${$e[et.NUMERICIDENTIFIER]})\\.(${$e[et.NUMERICIDENTIFIER]})\\.(${$e[et.NUMERICIDENTIFIER]})`);Qt("MAINVERSIONLOOSE",`(${$e[et.NUMERICIDENTIFIERLOOSE]})\\.(${$e[et.NUMERICIDENTIFIERLOOSE]})\\.(${$e[et.NUMERICIDENTIFIERLOOSE]})`);Qt("PRERELEASEIDENTIFIER",`(?:${$e[et.NUMERICIDENTIFIER]}|${$e[et.NONNUMERICIDENTIFIER]})`);Qt("PRERELEASEIDENTIFIERLOOSE",`(?:${$e[et.NUMERICIDENTIFIERLOOSE]}|${$e[et.NONNUMERICIDENTIFIER]})`);Qt("PRERELEASE",`(?:-(${$e[et.PRERELEASEIDENTIFIER]}(?:\\.${$e[et.PRERELEASEIDENTIFIER]})*))`);Qt("PRERELEASELOOSE",`(?:-?(${$e[et.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${$e[et.PRERELEASEIDENTIFIERLOOSE]})*))`);Qt("BUILDIDENTIFIER","[0-9A-Za-z-]+");Qt("BUILD",`(?:\\+(${$e[et.BUILDIDENTIFIER]}(?:\\.${$e[et.BUILDIDENTIFIER]})*))`);Qt("FULLPLAIN",`v?${$e[et.MAINVERSION]}${$e[et.PRERELEASE]}?${$e[et.BUILD]}?`);Qt("FULL",`^${$e[et.FULLPLAIN]}$`);Qt("LOOSEPLAIN",`[v=\\s]*${$e[et.MAINVERSIONLOOSE]}${$e[et.PRERELEASELOOSE]}?${$e[et.BUILD]}?`);Qt("LOOSE",`^${$e[et.LOOSEPLAIN]}$`);Qt("GTLT","((?:<|>)?=?)");Qt("XRANGEIDENTIFIERLOOSE",`${$e[et.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);Qt("XRANGEIDENTIFIER",`${$e[et.NUMERICIDENTIFIER]}|x|X|\\*`);Qt("XRANGEPLAIN",`[v=\\s]*(${$e[et.XRANGEIDENTIFIER]})(?:\\.(${$e[et.XRANGEIDENTIFIER]})(?:\\.(${$e[et.XRANGEIDENTIFIER]})(?:${$e[et.PRERELEASE]})?${$e[et.BUILD]}?)?)?`);Qt("XRANGEPLAINLOOSE",`[v=\\s]*(${$e[et.XRANGEIDENTIFIERLOOSE]})(?:\\.(${$e[et.XRANGEIDENTIFIERLOOSE]})(?:\\.(${$e[et.XRANGEIDENTIFIERLOOSE]})(?:${$e[et.PRERELEASELOOSE]})?${$e[et.BUILD]}?)?)?`);Qt("XRANGE",`^${$e[et.GTLT]}\\s*${$e[et.XRANGEPLAIN]}$`);Qt("XRANGELOOSE",`^${$e[et.GTLT]}\\s*${$e[et.XRANGEPLAINLOOSE]}$`);Qt("COERCE",`(^|[^\\d])(\\d{1,${dv}})(?:\\.(\\d{1,${dv}}))?(?:\\.(\\d{1,${dv}}))?(?:$|[^\\d])`);Qt("COERCERTL",$e[et.COERCE],!0);Qt("LONETILDE","(?:~>?)");Qt("TILDETRIM",`(\\s*)${$e[et.LONETILDE]}\\s+`,!0);FA.tildeTrimReplace="$1~";Qt("TILDE",`^${$e[et.LONETILDE]}${$e[et.XRANGEPLAIN]}$`);Qt("TILDELOOSE",`^${$e[et.LONETILDE]}${$e[et.XRANGEPLAINLOOSE]}$`);Qt("LONECARET","(?:\\^)");Qt("CARETTRIM",`(\\s*)${$e[et.LONECARET]}\\s+`,!0);FA.caretTrimReplace="$1^";Qt("CARET",`^${$e[et.LONECARET]}${$e[et.XRANGEPLAIN]}$`);Qt("CARETLOOSE",`^${$e[et.LONECARET]}${$e[et.XRANGEPLAINLOOSE]}$`);Qt("COMPARATORLOOSE",`^${$e[et.GTLT]}\\s*(${$e[et.LOOSEPLAIN]})$|^$`);Qt("COMPARATOR",`^${$e[et.GTLT]}\\s*(${$e[et.FULLPLAIN]})$|^$`);Qt("COMPARATORTRIM",`(\\s*)${$e[et.GTLT]}\\s*(${$e[et.LOOSEPLAIN]}|${$e[et.XRANGEPLAIN]})`,!0);FA.comparatorTrimReplace="$1$2$3";Qt("HYPHENRANGE",`^\\s*(${$e[et.XRANGEPLAIN]})\\s+-\\s+(${$e[et.XRANGEPLAIN]})\\s*$`);Qt("HYPHENRANGELOOSE",`^\\s*(${$e[et.XRANGEPLAINLOOSE]})\\s+-\\s+(${$e[et.XRANGEPLAINLOOSE]})\\s*$`);Qt("STAR","(<|>)?=?\\s*\\*");Qt("GTE0","^\\s*>=\\s*0.0.0\\s*$");Qt("GTE0PRE","^\\s*>=\\s*0.0.0-0\\s*$")});var pd=I((B$e,$H)=>{var xCe=["includePrerelease","loose","rtl"],PCe=r=>r?typeof r!="object"?{loose:!0}:xCe.filter(e=>r[e]).reduce((e,t)=>(e[t]=!0,e),{}):{};$H.exports=PCe});var LI=I((Q$e,rj)=>{var ej=/^[0-9]+$/,tj=(r,e)=>{let t=ej.test(r),i=ej.test(e);return t&&i&&(r=+r,e=+e),r===e?0:t&&!i?-1:i&&!t?1:rtj(e,r);rj.exports={compareIdentifiers:tj,rcompareIdentifiers:kCe}});var Li=I((b$e,oj)=>{var OI=hd(),{MAX_LENGTH:ij,MAX_SAFE_INTEGER:MI}=fd(),{re:nj,t:sj}=fc(),DCe=pd(),{compareIdentifiers:dd}=LI(),Gn=class{constructor(e,t){if(t=DCe(t),e instanceof Gn){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid Version: ${e}`);if(e.length>ij)throw new TypeError(`version is longer than ${ij} characters`);OI("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let i=e.trim().match(t.loose?nj[sj.LOOSE]:nj[sj.FULL]);if(!i)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+i[1],this.minor=+i[2],this.patch=+i[3],this.major>MI||this.major<0)throw new TypeError("Invalid major version");if(this.minor>MI||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>MI||this.patch<0)throw new TypeError("Invalid patch version");i[4]?this.prerelease=i[4].split(".").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);i===-1&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};oj.exports=Gn});var hc=I((S$e,cj)=>{var{MAX_LENGTH:RCe}=fd(),{re:aj,t:Aj}=fc(),lj=Li(),FCe=pd(),NCe=(r,e)=>{if(e=FCe(e),r instanceof lj)return r;if(typeof r!="string"||r.length>RCe||!(e.loose?aj[Aj.LOOSE]:aj[Aj.FULL]).test(r))return null;try{return new lj(r,e)}catch{return null}};cj.exports=NCe});var gj=I((v$e,uj)=>{var TCe=hc(),LCe=(r,e)=>{let t=TCe(r,e);return t?t.version:null};uj.exports=LCe});var hj=I((x$e,fj)=>{var OCe=hc(),MCe=(r,e)=>{let t=OCe(r.trim().replace(/^[=v]+/,""),e);return t?t.version:null};fj.exports=MCe});var dj=I((P$e,pj)=>{var KCe=Li(),UCe=(r,e,t,i)=>{typeof t=="string"&&(i=t,t=void 0);try{return new KCe(r,t).inc(e,i).version}catch{return null}};pj.exports=UCe});var ls=I((k$e,mj)=>{var Cj=Li(),HCe=(r,e,t)=>new Cj(r,t).compare(new Cj(e,t));mj.exports=HCe});var KI=I((D$e,Ej)=>{var jCe=ls(),GCe=(r,e,t)=>jCe(r,e,t)===0;Ej.exports=GCe});var wj=I((R$e,yj)=>{var Ij=hc(),YCe=KI(),qCe=(r,e)=>{if(YCe(r,e))return null;{let t=Ij(r),i=Ij(e),n=t.prerelease.length||i.prerelease.length,s=n?"pre":"",o=n?"prerelease":"";for(let a in t)if((a==="major"||a==="minor"||a==="patch")&&t[a]!==i[a])return s+a;return o}};yj.exports=qCe});var Qj=I((F$e,Bj)=>{var JCe=Li(),WCe=(r,e)=>new JCe(r,e).major;Bj.exports=WCe});var Sj=I((N$e,bj)=>{var zCe=Li(),VCe=(r,e)=>new zCe(r,e).minor;bj.exports=VCe});var xj=I((T$e,vj)=>{var XCe=Li(),ZCe=(r,e)=>new XCe(r,e).patch;vj.exports=ZCe});var kj=I((L$e,Pj)=>{var _Ce=hc(),$Ce=(r,e)=>{let t=_Ce(r,e);return t&&t.prerelease.length?t.prerelease:null};Pj.exports=$Ce});var Rj=I((O$e,Dj)=>{var eme=ls(),tme=(r,e,t)=>eme(e,r,t);Dj.exports=tme});var Nj=I((M$e,Fj)=>{var rme=ls(),ime=(r,e)=>rme(r,e,!0);Fj.exports=ime});var UI=I((K$e,Lj)=>{var Tj=Li(),nme=(r,e,t)=>{let i=new Tj(r,t),n=new Tj(e,t);return i.compare(n)||i.compareBuild(n)};Lj.exports=nme});var Mj=I((U$e,Oj)=>{var sme=UI(),ome=(r,e)=>r.sort((t,i)=>sme(t,i,e));Oj.exports=ome});var Uj=I((H$e,Kj)=>{var ame=UI(),Ame=(r,e)=>r.sort((t,i)=>ame(i,t,e));Kj.exports=Ame});var Cd=I((j$e,Hj)=>{var lme=ls(),cme=(r,e,t)=>lme(r,e,t)>0;Hj.exports=cme});var HI=I((G$e,jj)=>{var ume=ls(),gme=(r,e,t)=>ume(r,e,t)<0;jj.exports=gme});var Cv=I((Y$e,Gj)=>{var fme=ls(),hme=(r,e,t)=>fme(r,e,t)!==0;Gj.exports=hme});var jI=I((q$e,Yj)=>{var pme=ls(),dme=(r,e,t)=>pme(r,e,t)>=0;Yj.exports=dme});var GI=I((J$e,qj)=>{var Cme=ls(),mme=(r,e,t)=>Cme(r,e,t)<=0;qj.exports=mme});var mv=I((W$e,Jj)=>{var Eme=KI(),Ime=Cv(),yme=Cd(),wme=jI(),Bme=HI(),Qme=GI(),bme=(r,e,t,i)=>{switch(e){case"===":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r===t;case"!==":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r!==t;case"":case"=":case"==":return Eme(r,t,i);case"!=":return Ime(r,t,i);case">":return yme(r,t,i);case">=":return wme(r,t,i);case"<":return Bme(r,t,i);case"<=":return Qme(r,t,i);default:throw new TypeError(`Invalid operator: ${e}`)}};Jj.exports=bme});var zj=I((z$e,Wj)=>{var Sme=Li(),vme=hc(),{re:YI,t:qI}=fc(),xme=(r,e)=>{if(r instanceof Sme)return r;if(typeof r=="number"&&(r=String(r)),typeof r!="string")return null;e=e||{};let t=null;if(!e.rtl)t=r.match(YI[qI.COERCE]);else{let i;for(;(i=YI[qI.COERCERTL].exec(r))&&(!t||t.index+t[0].length!==r.length);)(!t||i.index+i[0].length!==t.index+t[0].length)&&(t=i),YI[qI.COERCERTL].lastIndex=i.index+i[1].length+i[2].length;YI[qI.COERCERTL].lastIndex=-1}return t===null?null:vme(`${t[2]}.${t[3]||"0"}.${t[4]||"0"}`,e)};Wj.exports=xme});var Xj=I((V$e,Vj)=>{"use strict";Vj.exports=function(r){r.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var JI=I((X$e,Zj)=>{"use strict";Zj.exports=Mt;Mt.Node=pc;Mt.create=Mt;function Mt(r){var e=this;if(e instanceof Mt||(e=new Mt),e.tail=null,e.head=null,e.length=0,r&&typeof r.forEach=="function")r.forEach(function(n){e.push(n)});else if(arguments.length>0)for(var t=0,i=arguments.length;t1)t=e;else if(this.head)i=this.head.next,t=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;i!==null;n++)t=r(t,i.value,n),i=i.next;return t};Mt.prototype.reduceReverse=function(r,e){var t,i=this.tail;if(arguments.length>1)t=e;else if(this.tail)i=this.tail.prev,t=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=this.length-1;i!==null;n--)t=r(t,i.value,n),i=i.prev;return t};Mt.prototype.toArray=function(){for(var r=new Array(this.length),e=0,t=this.head;t!==null;e++)r[e]=t.value,t=t.next;return r};Mt.prototype.toArrayReverse=function(){for(var r=new Array(this.length),e=0,t=this.tail;t!==null;e++)r[e]=t.value,t=t.prev;return r};Mt.prototype.slice=function(r,e){e=e||this.length,e<0&&(e+=this.length),r=r||0,r<0&&(r+=this.length);var t=new Mt;if(ethis.length&&(e=this.length);for(var i=0,n=this.head;n!==null&&ithis.length&&(e=this.length);for(var i=this.length,n=this.tail;n!==null&&i>e;i--)n=n.prev;for(;n!==null&&i>r;i--,n=n.prev)t.push(n.value);return t};Mt.prototype.splice=function(r,e,...t){r>this.length&&(r=this.length-1),r<0&&(r=this.length+r);for(var i=0,n=this.head;n!==null&&i{"use strict";var Rme=JI(),dc=Symbol("max"),xa=Symbol("length"),Wg=Symbol("lengthCalculator"),Ed=Symbol("allowStale"),Cc=Symbol("maxAge"),va=Symbol("dispose"),_j=Symbol("noDisposeOnSet"),pi=Symbol("lruList"),Xs=Symbol("cache"),eG=Symbol("updateAgeOnGet"),Ev=()=>1,yv=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let t=this[dc]=e.max||1/0,i=e.length||Ev;if(this[Wg]=typeof i!="function"?Ev:i,this[Ed]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[Cc]=e.maxAge||0,this[va]=e.dispose,this[_j]=e.noDisposeOnSet||!1,this[eG]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[dc]=e||1/0,md(this)}get max(){return this[dc]}set allowStale(e){this[Ed]=!!e}get allowStale(){return this[Ed]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[Cc]=e,md(this)}get maxAge(){return this[Cc]}set lengthCalculator(e){typeof e!="function"&&(e=Ev),e!==this[Wg]&&(this[Wg]=e,this[xa]=0,this[pi].forEach(t=>{t.length=this[Wg](t.value,t.key),this[xa]+=t.length})),md(this)}get lengthCalculator(){return this[Wg]}get length(){return this[xa]}get itemCount(){return this[pi].length}rforEach(e,t){t=t||this;for(let i=this[pi].tail;i!==null;){let n=i.prev;$j(this,e,i,t),i=n}}forEach(e,t){t=t||this;for(let i=this[pi].head;i!==null;){let n=i.next;$j(this,e,i,t),i=n}}keys(){return this[pi].toArray().map(e=>e.key)}values(){return this[pi].toArray().map(e=>e.value)}reset(){this[va]&&this[pi]&&this[pi].length&&this[pi].forEach(e=>this[va](e.key,e.value)),this[Xs]=new Map,this[pi]=new Rme,this[xa]=0}dump(){return this[pi].map(e=>WI(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[pi]}set(e,t,i){if(i=i||this[Cc],i&&typeof i!="number")throw new TypeError("maxAge must be a number");let n=i?Date.now():0,s=this[Wg](t,e);if(this[Xs].has(e)){if(s>this[dc])return zg(this,this[Xs].get(e)),!1;let l=this[Xs].get(e).value;return this[va]&&(this[_j]||this[va](e,l.value)),l.now=n,l.maxAge=i,l.value=t,this[xa]+=s-l.length,l.length=s,this.get(e),md(this),!0}let o=new wv(e,t,s,n,i);return o.length>this[dc]?(this[va]&&this[va](e,t),!1):(this[xa]+=o.length,this[pi].unshift(o),this[Xs].set(e,this[pi].head),md(this),!0)}has(e){if(!this[Xs].has(e))return!1;let t=this[Xs].get(e).value;return!WI(this,t)}get(e){return Iv(this,e,!0)}peek(e){return Iv(this,e,!1)}pop(){let e=this[pi].tail;return e?(zg(this,e),e.value):null}del(e){zg(this,this[Xs].get(e))}load(e){this.reset();let t=Date.now();for(let i=e.length-1;i>=0;i--){let n=e[i],s=n.e||0;if(s===0)this.set(n.k,n.v);else{let o=s-t;o>0&&this.set(n.k,n.v,o)}}}prune(){this[Xs].forEach((e,t)=>Iv(this,t,!1))}},Iv=(r,e,t)=>{let i=r[Xs].get(e);if(i){let n=i.value;if(WI(r,n)){if(zg(r,i),!r[Ed])return}else t&&(r[eG]&&(i.value.now=Date.now()),r[pi].unshiftNode(i));return n.value}},WI=(r,e)=>{if(!e||!e.maxAge&&!r[Cc])return!1;let t=Date.now()-e.now;return e.maxAge?t>e.maxAge:r[Cc]&&t>r[Cc]},md=r=>{if(r[xa]>r[dc])for(let e=r[pi].tail;r[xa]>r[dc]&&e!==null;){let t=e.prev;zg(r,e),e=t}},zg=(r,e)=>{if(e){let t=e.value;r[va]&&r[va](t.key,t.value),r[xa]-=t.length,r[Xs].delete(t.key),r[pi].removeNode(e)}},wv=class{constructor(e,t,i,n,s){this.key=e,this.value=t,this.length=i,this.now=n,this.maxAge=s||0}},$j=(r,e,t,i)=>{let n=t.value;WI(r,n)&&(zg(r,t),r[Ed]||(n=void 0)),n&&e.call(i,n.value,n.key,r)};tG.exports=yv});var cs=I((_$e,oG)=>{var mc=class{constructor(e,t){if(t=Nme(t),e instanceof mc)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new mc(e.raw,t);if(e instanceof Bv)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(i=>this.parseRange(i.trim())).filter(i=>i.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let i=this.set[0];if(this.set=this.set.filter(n=>!nG(n[0])),this.set.length===0)this.set=[i];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&Kme(n[0])){this.set=[n];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).join(",")}:${e}`,n=iG.get(i);if(n)return n;let s=this.options.loose,o=s?Oi[bi.HYPHENRANGELOOSE]:Oi[bi.HYPHENRANGE];e=e.replace(o,Vme(this.options.includePrerelease)),Mr("hyphen replace",e),e=e.replace(Oi[bi.COMPARATORTRIM],Lme),Mr("comparator trim",e,Oi[bi.COMPARATORTRIM]),e=e.replace(Oi[bi.TILDETRIM],Ome),e=e.replace(Oi[bi.CARETTRIM],Mme),e=e.split(/\s+/).join(" ");let a=s?Oi[bi.COMPARATORLOOSE]:Oi[bi.COMPARATOR],l=e.split(" ").map(h=>Ume(h,this.options)).join(" ").split(/\s+/).map(h=>zme(h,this.options)).filter(this.options.loose?h=>!!h.match(a):()=>!0).map(h=>new Bv(h,this.options)),c=l.length,u=new Map;for(let h of l){if(nG(h))return[h];u.set(h.value,h)}u.size>1&&u.has("")&&u.delete("");let g=[...u.values()];return iG.set(i,g),g}intersects(e,t){if(!(e instanceof mc))throw new TypeError("a Range is required");return this.set.some(i=>sG(i,t)&&e.set.some(n=>sG(n,t)&&i.every(s=>n.every(o=>s.intersects(o,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new Tme(e,this.options)}catch{return!1}for(let t=0;tr.value==="<0.0.0-0",Kme=r=>r.value==="",sG=(r,e)=>{let t=!0,i=r.slice(),n=i.pop();for(;t&&i.length;)t=i.every(s=>n.intersects(s,e)),n=i.pop();return t},Ume=(r,e)=>(Mr("comp",r,e),r=Gme(r,e),Mr("caret",r),r=Hme(r,e),Mr("tildes",r),r=qme(r,e),Mr("xrange",r),r=Wme(r,e),Mr("stars",r),r),_i=r=>!r||r.toLowerCase()==="x"||r==="*",Hme=(r,e)=>r.trim().split(/\s+/).map(t=>jme(t,e)).join(" "),jme=(r,e)=>{let t=e.loose?Oi[bi.TILDELOOSE]:Oi[bi.TILDE];return r.replace(t,(i,n,s,o,a)=>{Mr("tilde",r,i,n,s,o,a);let l;return _i(n)?l="":_i(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:_i(o)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(Mr("replaceTilde pr",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,Mr("tilde return",l),l})},Gme=(r,e)=>r.trim().split(/\s+/).map(t=>Yme(t,e)).join(" "),Yme=(r,e)=>{Mr("caret",r,e);let t=e.loose?Oi[bi.CARETLOOSE]:Oi[bi.CARET],i=e.includePrerelease?"-0":"";return r.replace(t,(n,s,o,a,l)=>{Mr("caret",r,n,s,o,a,l);let c;return _i(s)?c="":_i(o)?c=`>=${s}.0.0${i} <${+s+1}.0.0-0`:_i(a)?s==="0"?c=`>=${s}.${o}.0${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.0${i} <${+s+1}.0.0-0`:l?(Mr("replaceCaret pr",l),s==="0"?o==="0"?c=`>=${s}.${o}.${a}-${l} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}-${l} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a}-${l} <${+s+1}.0.0-0`):(Mr("no pr"),s==="0"?o==="0"?c=`>=${s}.${o}.${a}${i} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a} <${+s+1}.0.0-0`),Mr("caret return",c),c})},qme=(r,e)=>(Mr("replaceXRanges",r,e),r.split(/\s+/).map(t=>Jme(t,e)).join(" ")),Jme=(r,e)=>{r=r.trim();let t=e.loose?Oi[bi.XRANGELOOSE]:Oi[bi.XRANGE];return r.replace(t,(i,n,s,o,a,l)=>{Mr("xRange",r,i,n,s,o,a,l);let c=_i(s),u=c||_i(o),g=u||_i(a),h=g;return n==="="&&h&&(n=""),l=e.includePrerelease?"-0":"",c?n===">"||n==="<"?i="<0.0.0-0":i="*":n&&h?(u&&(o=0),a=0,n===">"?(n=">=",u?(s=+s+1,o=0,a=0):(o=+o+1,a=0)):n==="<="&&(n="<",u?s=+s+1:o=+o+1),n==="<"&&(l="-0"),i=`${n+s}.${o}.${a}${l}`):u?i=`>=${s}.0.0${l} <${+s+1}.0.0-0`:g&&(i=`>=${s}.${o}.0${l} <${s}.${+o+1}.0-0`),Mr("xRange return",i),i})},Wme=(r,e)=>(Mr("replaceStars",r,e),r.trim().replace(Oi[bi.STAR],"")),zme=(r,e)=>(Mr("replaceGTE0",r,e),r.trim().replace(Oi[e.includePrerelease?bi.GTE0PRE:bi.GTE0],"")),Vme=r=>(e,t,i,n,s,o,a,l,c,u,g,h,p)=>(_i(i)?t="":_i(n)?t=`>=${i}.0.0${r?"-0":""}`:_i(s)?t=`>=${i}.${n}.0${r?"-0":""}`:o?t=`>=${t}`:t=`>=${t}${r?"-0":""}`,_i(c)?l="":_i(u)?l=`<${+c+1}.0.0-0`:_i(g)?l=`<${c}.${+u+1}.0-0`:h?l=`<=${c}.${u}.${g}-${h}`:r?l=`<${c}.${u}.${+g+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),Xme=(r,e,t)=>{for(let i=0;i0){let n=r[i].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0}});var Id=I(($$e,uG)=>{var yd=Symbol("SemVer ANY"),Vg=class{static get ANY(){return yd}constructor(e,t){if(t=Zme(t),e instanceof Vg){if(e.loose===!!t.loose)return e;e=e.value}bv("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===yd?this.value="":this.value=this.operator+this.semver.version,bv("comp",this)}parse(e){let t=this.options.loose?aG[AG.COMPARATORLOOSE]:aG[AG.COMPARATOR],i=e.match(t);if(!i)throw new TypeError(`Invalid comparator: ${e}`);this.operator=i[1]!==void 0?i[1]:"",this.operator==="="&&(this.operator=""),i[2]?this.semver=new lG(i[2],this.options.loose):this.semver=yd}toString(){return this.value}test(e){if(bv("Comparator.test",e,this.options.loose),this.semver===yd||e===yd)return!0;if(typeof e=="string")try{e=new lG(e,this.options)}catch{return!1}return Qv(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof Vg))throw new TypeError("a Comparator is required");if((!t||typeof t!="object")&&(t={loose:!!t,includePrerelease:!1}),this.operator==="")return this.value===""?!0:new cG(e.value,t).test(this.value);if(e.operator==="")return e.value===""?!0:new cG(this.value,t).test(e.semver);let i=(this.operator===">="||this.operator===">")&&(e.operator===">="||e.operator===">"),n=(this.operator==="<="||this.operator==="<")&&(e.operator==="<="||e.operator==="<"),s=this.semver.version===e.semver.version,o=(this.operator===">="||this.operator==="<=")&&(e.operator===">="||e.operator==="<="),a=Qv(this.semver,"<",e.semver,t)&&(this.operator===">="||this.operator===">")&&(e.operator==="<="||e.operator==="<"),l=Qv(this.semver,">",e.semver,t)&&(this.operator==="<="||this.operator==="<")&&(e.operator===">="||e.operator===">");return i||n||s&&o||a||l}};uG.exports=Vg;var Zme=pd(),{re:aG,t:AG}=fc(),Qv=mv(),bv=hd(),lG=Li(),cG=cs()});var wd=I((eet,gG)=>{var _me=cs(),$me=(r,e,t)=>{try{e=new _me(e,t)}catch{return!1}return e.test(r)};gG.exports=$me});var hG=I((tet,fG)=>{var eEe=cs(),tEe=(r,e)=>new eEe(r,e).set.map(t=>t.map(i=>i.value).join(" ").trim().split(" "));fG.exports=tEe});var dG=I((ret,pG)=>{var rEe=Li(),iEe=cs(),nEe=(r,e,t)=>{let i=null,n=null,s=null;try{s=new iEe(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new rEe(i,t))}),i};pG.exports=nEe});var mG=I((iet,CG)=>{var sEe=Li(),oEe=cs(),aEe=(r,e,t)=>{let i=null,n=null,s=null;try{s=new oEe(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new sEe(i,t))}),i};CG.exports=aEe});var yG=I((net,IG)=>{var Sv=Li(),AEe=cs(),EG=Cd(),lEe=(r,e)=>{r=new AEe(r,e);let t=new Sv("0.0.0");if(r.test(t)||(t=new Sv("0.0.0-0"),r.test(t)))return t;t=null;for(let i=0;i{let a=new Sv(o.semver.version);switch(o.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!s||EG(a,s))&&(s=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!t||EG(t,s))&&(t=s)}return t&&r.test(t)?t:null};IG.exports=lEe});var BG=I((set,wG)=>{var cEe=cs(),uEe=(r,e)=>{try{return new cEe(r,e).range||"*"}catch{return null}};wG.exports=uEe});var zI=I((oet,vG)=>{var gEe=Li(),SG=Id(),{ANY:fEe}=SG,hEe=cs(),pEe=wd(),QG=Cd(),bG=HI(),dEe=GI(),CEe=jI(),mEe=(r,e,t,i)=>{r=new gEe(r,i),e=new hEe(e,i);let n,s,o,a,l;switch(t){case">":n=QG,s=dEe,o=bG,a=">",l=">=";break;case"<":n=bG,s=CEe,o=QG,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(pEe(r,e,i))return!1;for(let c=0;c{p.semver===fEe&&(p=new SG(">=0.0.0")),g=g||p,h=h||p,n(p.semver,g.semver,i)?g=p:o(p.semver,h.semver,i)&&(h=p)}),g.operator===a||g.operator===l||(!h.operator||h.operator===a)&&s(r,h.semver))return!1;if(h.operator===l&&o(r,h.semver))return!1}return!0};vG.exports=mEe});var PG=I((aet,xG)=>{var EEe=zI(),IEe=(r,e,t)=>EEe(r,e,">",t);xG.exports=IEe});var DG=I((Aet,kG)=>{var yEe=zI(),wEe=(r,e,t)=>yEe(r,e,"<",t);kG.exports=wEe});var NG=I((cet,FG)=>{var RG=cs(),BEe=(r,e,t)=>(r=new RG(r,t),e=new RG(e,t),r.intersects(e));FG.exports=BEe});var LG=I((uet,TG)=>{var QEe=wd(),bEe=ls();TG.exports=(r,e,t)=>{let i=[],n=null,s=null,o=r.sort((u,g)=>bEe(u,g,t));for(let u of o)QEe(u,e,t)?(s=u,n||(n=u)):(s&&i.push([n,s]),s=null,n=null);n&&i.push([n,null]);let a=[];for(let[u,g]of i)u===g?a.push(u):!g&&u===o[0]?a.push("*"):g?u===o[0]?a.push(`<=${g}`):a.push(`${u} - ${g}`):a.push(`>=${u}`);let l=a.join(" || "),c=typeof e.raw=="string"?e.raw:String(e);return l.length{var OG=cs(),VI=Id(),{ANY:vv}=VI,Bd=wd(),xv=ls(),SEe=(r,e,t={})=>{if(r===e)return!0;r=new OG(r,t),e=new OG(e,t);let i=!1;e:for(let n of r.set){for(let s of e.set){let o=vEe(n,s,t);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},vEe=(r,e,t)=>{if(r===e)return!0;if(r.length===1&&r[0].semver===vv){if(e.length===1&&e[0].semver===vv)return!0;t.includePrerelease?r=[new VI(">=0.0.0-0")]:r=[new VI(">=0.0.0")]}if(e.length===1&&e[0].semver===vv){if(t.includePrerelease)return!0;e=[new VI(">=0.0.0")]}let i=new Set,n,s;for(let p of r)p.operator===">"||p.operator===">="?n=MG(n,p,t):p.operator==="<"||p.operator==="<="?s=KG(s,p,t):i.add(p.semver);if(i.size>1)return null;let o;if(n&&s){if(o=xv(n.semver,s.semver,t),o>0)return null;if(o===0&&(n.operator!==">="||s.operator!=="<="))return null}for(let p of i){if(n&&!Bd(p,String(n),t)||s&&!Bd(p,String(s),t))return null;for(let d of e)if(!Bd(p,String(d),t))return!1;return!0}let a,l,c,u,g=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,h=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1;g&&g.prerelease.length===1&&s.operator==="<"&&g.prerelease[0]===0&&(g=!1);for(let p of e){if(u=u||p.operator===">"||p.operator===">=",c=c||p.operator==="<"||p.operator==="<=",n){if(h&&p.semver.prerelease&&p.semver.prerelease.length&&p.semver.major===h.major&&p.semver.minor===h.minor&&p.semver.patch===h.patch&&(h=!1),p.operator===">"||p.operator===">="){if(a=MG(n,p,t),a===p&&a!==n)return!1}else if(n.operator===">="&&!Bd(n.semver,String(p),t))return!1}if(s){if(g&&p.semver.prerelease&&p.semver.prerelease.length&&p.semver.major===g.major&&p.semver.minor===g.minor&&p.semver.patch===g.patch&&(g=!1),p.operator==="<"||p.operator==="<="){if(l=KG(s,p,t),l===p&&l!==s)return!1}else if(s.operator==="<="&&!Bd(s.semver,String(p),t))return!1}if(!p.operator&&(s||n)&&o!==0)return!1}return!(n&&c&&!s&&o!==0||s&&u&&!n&&o!==0||h||g)},MG=(r,e,t)=>{if(!r)return e;let i=xv(r.semver,e.semver,t);return i>0?r:i<0||e.operator===">"&&r.operator===">="?e:r},KG=(r,e,t)=>{if(!r)return e;let i=xv(r.semver,e.semver,t);return i<0?r:i>0||e.operator==="<"&&r.operator==="<="?e:r};UG.exports=SEe});var zr=I((fet,jG)=>{var Pv=fc();jG.exports={re:Pv.re,src:Pv.src,tokens:Pv.t,SEMVER_SPEC_VERSION:fd().SEMVER_SPEC_VERSION,SemVer:Li(),compareIdentifiers:LI().compareIdentifiers,rcompareIdentifiers:LI().rcompareIdentifiers,parse:hc(),valid:gj(),clean:hj(),inc:dj(),diff:wj(),major:Qj(),minor:Sj(),patch:xj(),prerelease:kj(),compare:ls(),rcompare:Rj(),compareLoose:Nj(),compareBuild:UI(),sort:Mj(),rsort:Uj(),gt:Cd(),lt:HI(),eq:KI(),neq:Cv(),gte:jI(),lte:GI(),cmp:mv(),coerce:zj(),Comparator:Id(),Range:cs(),satisfies:wd(),toComparators:hG(),maxSatisfying:dG(),minSatisfying:mG(),minVersion:yG(),validRange:BG(),outside:zI(),gtr:PG(),ltr:DG(),intersects:NG(),simplifyRange:LG(),subset:HG()}});var kv=I(XI=>{"use strict";Object.defineProperty(XI,"__esModule",{value:!0});XI.VERSION=void 0;XI.VERSION="9.1.0"});var Kt=I((exports,module)=>{"use strict";var __spreadArray=exports&&exports.__spreadArray||function(r,e,t){if(t||arguments.length===2)for(var i=0,n=e.length,s;i{(function(r,e){typeof define=="function"&&define.amd?define([],e):typeof ZI=="object"&&ZI.exports?ZI.exports=e():r.regexpToAst=e()})(typeof self<"u"?self:GG,function(){function r(){}r.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},r.prototype.restoreState=function(d){this.idx=d.idx,this.input=d.input,this.groupIdx=d.groupIdx},r.prototype.pattern=function(d){this.idx=0,this.input=d,this.groupIdx=0,this.consumeChar("/");var m=this.disjunction();this.consumeChar("/");for(var y={type:"Flags",loc:{begin:this.idx,end:d.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":o(y,"global");break;case"i":o(y,"ignoreCase");break;case"m":o(y,"multiLine");break;case"u":o(y,"unicode");break;case"y":o(y,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:y,value:m,loc:this.loc(0)}},r.prototype.disjunction=function(){var d=[],m=this.idx;for(d.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),d.push(this.alternative());return{type:"Disjunction",value:d,loc:this.loc(m)}},r.prototype.alternative=function(){for(var d=[],m=this.idx;this.isTerm();)d.push(this.term());return{type:"Alternative",value:d,loc:this.loc(m)}},r.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},r.prototype.assertion=function(){var d=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(d)};case"$":return{type:"EndAnchor",loc:this.loc(d)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(d)};case"B":return{type:"NonWordBoundary",loc:this.loc(d)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");var m;switch(this.popChar()){case"=":m="Lookahead";break;case"!":m="NegativeLookahead";break}a(m);var y=this.disjunction();return this.consumeChar(")"),{type:m,value:y,loc:this.loc(d)}}l()},r.prototype.quantifier=function(d){var m,y=this.idx;switch(this.popChar()){case"*":m={atLeast:0,atMost:1/0};break;case"+":m={atLeast:1,atMost:1/0};break;case"?":m={atLeast:0,atMost:1};break;case"{":var B=this.integerIncludingZero();switch(this.popChar()){case"}":m={atLeast:B,atMost:B};break;case",":var S;this.isDigit()?(S=this.integerIncludingZero(),m={atLeast:B,atMost:S}):m={atLeast:B,atMost:1/0},this.consumeChar("}");break}if(d===!0&&m===void 0)return;a(m);break}if(!(d===!0&&m===void 0))return a(m),this.peekChar(0)==="?"?(this.consumeChar("?"),m.greedy=!1):m.greedy=!0,m.type="Quantifier",m.loc=this.loc(y),m},r.prototype.atom=function(){var d,m=this.idx;switch(this.peekChar()){case".":d=this.dotAll();break;case"\\":d=this.atomEscape();break;case"[":d=this.characterClass();break;case"(":d=this.group();break}return d===void 0&&this.isPatternCharacter()&&(d=this.patternCharacter()),a(d),d.loc=this.loc(m),this.isQuantifier()&&(d.quantifier=this.quantifier()),d},r.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[n(` +`),n("\r"),n("\u2028"),n("\u2029")]}},r.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},r.prototype.decimalEscapeAtom=function(){var d=this.positiveInteger();return{type:"GroupBackReference",value:d}},r.prototype.characterClassEscape=function(){var d,m=!1;switch(this.popChar()){case"d":d=u;break;case"D":d=u,m=!0;break;case"s":d=h;break;case"S":d=h,m=!0;break;case"w":d=g;break;case"W":d=g,m=!0;break}return a(d),{type:"Set",value:d,complement:m}},r.prototype.controlEscapeAtom=function(){var d;switch(this.popChar()){case"f":d=n("\f");break;case"n":d=n(` +`);break;case"r":d=n("\r");break;case"t":d=n(" ");break;case"v":d=n("\v");break}return a(d),{type:"Character",value:d}},r.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var d=this.popChar();if(/[a-zA-Z]/.test(d)===!1)throw Error("Invalid ");var m=d.toUpperCase().charCodeAt(0)-64;return{type:"Character",value:m}},r.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:n("\0")}},r.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},r.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},r.prototype.identityEscapeAtom=function(){var d=this.popChar();return{type:"Character",value:n(d)}},r.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case` +`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:var d=this.popChar();return{type:"Character",value:n(d)}}},r.prototype.characterClass=function(){var d=[],m=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),m=!0);this.isClassAtom();){var y=this.classAtom(),B=y.type==="Character";if(B&&this.isRangeDash()){this.consumeChar("-");var S=this.classAtom(),P=S.type==="Character";if(P){if(S.value=this.input.length)throw Error("Unexpected end of input");this.idx++},r.prototype.loc=function(d){return{begin:d,end:this.idx}};var e=/[0-9a-fA-F]/,t=/[0-9]/,i=/[1-9]/;function n(d){return d.charCodeAt(0)}function s(d,m){d.length!==void 0?d.forEach(function(y){m.push(y)}):m.push(d)}function o(d,m){if(d[m]===!0)throw"duplicate flag "+m;d[m]=!0}function a(d){if(d===void 0)throw Error("Internal Error - Should never get here!")}function l(){throw Error("Internal Error - Should never get here!")}var c,u=[];for(c=n("0");c<=n("9");c++)u.push(c);var g=[n("_")].concat(u);for(c=n("a");c<=n("z");c++)g.push(c);for(c=n("A");c<=n("Z");c++)g.push(c);var h=[n(" "),n("\f"),n(` +`),n("\r"),n(" "),n("\v"),n(" "),n("\xA0"),n("\u1680"),n("\u2000"),n("\u2001"),n("\u2002"),n("\u2003"),n("\u2004"),n("\u2005"),n("\u2006"),n("\u2007"),n("\u2008"),n("\u2009"),n("\u200A"),n("\u2028"),n("\u2029"),n("\u202F"),n("\u205F"),n("\u3000"),n("\uFEFF")];function p(){}return p.prototype.visitChildren=function(d){for(var m in d){var y=d[m];d.hasOwnProperty(m)&&(y.type!==void 0?this.visit(y):Array.isArray(y)&&y.forEach(function(B){this.visit(B)},this))}},p.prototype.visit=function(d){switch(d.type){case"Pattern":this.visitPattern(d);break;case"Flags":this.visitFlags(d);break;case"Disjunction":this.visitDisjunction(d);break;case"Alternative":this.visitAlternative(d);break;case"StartAnchor":this.visitStartAnchor(d);break;case"EndAnchor":this.visitEndAnchor(d);break;case"WordBoundary":this.visitWordBoundary(d);break;case"NonWordBoundary":this.visitNonWordBoundary(d);break;case"Lookahead":this.visitLookahead(d);break;case"NegativeLookahead":this.visitNegativeLookahead(d);break;case"Character":this.visitCharacter(d);break;case"Set":this.visitSet(d);break;case"Group":this.visitGroup(d);break;case"GroupBackReference":this.visitGroupBackReference(d);break;case"Quantifier":this.visitQuantifier(d);break}this.visitChildren(d)},p.prototype.visitPattern=function(d){},p.prototype.visitFlags=function(d){},p.prototype.visitDisjunction=function(d){},p.prototype.visitAlternative=function(d){},p.prototype.visitStartAnchor=function(d){},p.prototype.visitEndAnchor=function(d){},p.prototype.visitWordBoundary=function(d){},p.prototype.visitNonWordBoundary=function(d){},p.prototype.visitLookahead=function(d){},p.prototype.visitNegativeLookahead=function(d){},p.prototype.visitCharacter=function(d){},p.prototype.visitSet=function(d){},p.prototype.visitGroup=function(d){},p.prototype.visitGroupBackReference=function(d){},p.prototype.visitQuantifier=function(d){},{RegExpParser:r,BaseRegExpVisitor:p,VERSION:"0.5.0"}})});var ey=I(Xg=>{"use strict";Object.defineProperty(Xg,"__esModule",{value:!0});Xg.clearRegExpParserCache=Xg.getRegExpAst=void 0;var xEe=_I(),$I={},PEe=new xEe.RegExpParser;function kEe(r){var e=r.toString();if($I.hasOwnProperty(e))return $I[e];var t=PEe.pattern(e);return $I[e]=t,t}Xg.getRegExpAst=kEe;function DEe(){$I={}}Xg.clearRegExpParserCache=DEe});var zG=I(Cn=>{"use strict";var REe=Cn&&Cn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Cn,"__esModule",{value:!0});Cn.canMatchCharCode=Cn.firstCharOptimizedIndices=Cn.getOptimizedStartCodesIndices=Cn.failedOptimizationPrefixMsg=void 0;var qG=_I(),us=Kt(),JG=ey(),Pa=Rv(),WG="Complement Sets are not supported for first char optimization";Cn.failedOptimizationPrefixMsg=`Unable to use "first char" lexer optimizations: +`;function FEe(r,e){e===void 0&&(e=!1);try{var t=(0,JG.getRegExpAst)(r),i=ry(t.value,{},t.flags.ignoreCase);return i}catch(s){if(s.message===WG)e&&(0,us.PRINT_WARNING)(""+Cn.failedOptimizationPrefixMsg+(" Unable to optimize: < "+r.toString()+` > +`)+` Complement Sets cannot be automatically optimized. + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{var n="";e&&(n=` + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),(0,us.PRINT_ERROR)(Cn.failedOptimizationPrefixMsg+` +`+(" Failed parsing: < "+r.toString()+` > +`)+(" Using the regexp-to-ast library version: "+qG.VERSION+` +`)+" Please open an issue at: https://github.com/bd82/regexp-to-ast/issues"+n)}}return[]}Cn.getOptimizedStartCodesIndices=FEe;function ry(r,e,t){switch(r.type){case"Disjunction":for(var i=0;i=Pa.minOptimizationVal)for(var h=u.from>=Pa.minOptimizationVal?u.from:Pa.minOptimizationVal,p=u.to,d=(0,Pa.charCodeToOptimizedIndex)(h),m=(0,Pa.charCodeToOptimizedIndex)(p),y=d;y<=m;y++)e[y]=y}}});break;case"Group":ry(o.value,e,t);break;default:throw Error("Non Exhaustive Match")}var a=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type==="Group"&&Dv(o)===!1||o.type!=="Group"&&a===!1)break}break;default:throw Error("non exhaustive match!")}return(0,us.values)(e)}Cn.firstCharOptimizedIndices=ry;function ty(r,e,t){var i=(0,Pa.charCodeToOptimizedIndex)(r);e[i]=i,t===!0&&NEe(r,e)}function NEe(r,e){var t=String.fromCharCode(r),i=t.toUpperCase();if(i!==t){var n=(0,Pa.charCodeToOptimizedIndex)(i.charCodeAt(0));e[n]=n}else{var s=t.toLowerCase();if(s!==t){var n=(0,Pa.charCodeToOptimizedIndex)(s.charCodeAt(0));e[n]=n}}}function YG(r,e){return(0,us.find)(r.value,function(t){if(typeof t=="number")return(0,us.contains)(e,t);var i=t;return(0,us.find)(e,function(n){return i.from<=n&&n<=i.to})!==void 0})}function Dv(r){return r.quantifier&&r.quantifier.atLeast===0?!0:r.value?(0,us.isArray)(r.value)?(0,us.every)(r.value,Dv):Dv(r.value):!1}var TEe=function(r){REe(e,r);function e(t){var i=r.call(this)||this;return i.targetCharCodes=t,i.found=!1,i}return e.prototype.visitChildren=function(t){if(this.found!==!0){switch(t.type){case"Lookahead":this.visitLookahead(t);return;case"NegativeLookahead":this.visitNegativeLookahead(t);return}r.prototype.visitChildren.call(this,t)}},e.prototype.visitCharacter=function(t){(0,us.contains)(this.targetCharCodes,t.value)&&(this.found=!0)},e.prototype.visitSet=function(t){t.complement?YG(t,this.targetCharCodes)===void 0&&(this.found=!0):YG(t,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(qG.BaseRegExpVisitor);function LEe(r,e){if(e instanceof RegExp){var t=(0,JG.getRegExpAst)(e),i=new TEe(r);return i.visit(t),i.found}else return(0,us.find)(e,function(n){return(0,us.contains)(r,n.charCodeAt(0))})!==void 0}Cn.canMatchCharCode=LEe});var Rv=I(We=>{"use strict";var VG=We&&We.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(We,"__esModule",{value:!0});We.charCodeToOptimizedIndex=We.minOptimizationVal=We.buildLineBreakIssueMessage=We.LineTerminatorOptimizedTester=We.isShortPattern=We.isCustomPattern=We.cloneEmptyGroups=We.performWarningRuntimeChecks=We.performRuntimeChecks=We.addStickyFlag=We.addStartOfInput=We.findUnreachablePatterns=We.findModesThatDoNotExist=We.findInvalidGroupType=We.findDuplicatePatterns=We.findUnsupportedFlags=We.findStartOfInputAnchor=We.findEmptyMatchRegExps=We.findEndOfInputAnchor=We.findInvalidPatterns=We.findMissingPatterns=We.validatePatterns=We.analyzeTokenTypes=We.enableSticky=We.disableSticky=We.SUPPORT_STICKY=We.MODES=We.DEFAULT_MODE=void 0;var XG=_I(),tr=Qd(),Se=Kt(),Zg=zG(),ZG=ey(),ko="PATTERN";We.DEFAULT_MODE="defaultMode";We.MODES="modes";We.SUPPORT_STICKY=typeof new RegExp("(?:)").sticky=="boolean";function OEe(){We.SUPPORT_STICKY=!1}We.disableSticky=OEe;function MEe(){We.SUPPORT_STICKY=!0}We.enableSticky=MEe;function KEe(r,e){e=(0,Se.defaults)(e,{useSticky:We.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` +`],tracer:function(S,P){return P()}});var t=e.tracer;t("initCharCodeToOptimizedIndexMap",function(){VEe()});var i;t("Reject Lexer.NA",function(){i=(0,Se.reject)(r,function(S){return S[ko]===tr.Lexer.NA})});var n=!1,s;t("Transform Patterns",function(){n=!1,s=(0,Se.map)(i,function(S){var P=S[ko];if((0,Se.isRegExp)(P)){var F=P.source;return F.length===1&&F!=="^"&&F!=="$"&&F!=="."&&!P.ignoreCase?F:F.length===2&&F[0]==="\\"&&!(0,Se.contains)(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],F[1])?F[1]:e.useSticky?Tv(P):Nv(P)}else{if((0,Se.isFunction)(P))return n=!0,{exec:P};if((0,Se.has)(P,"exec"))return n=!0,P;if(typeof P=="string"){if(P.length===1)return P;var H=P.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),q=new RegExp(H);return e.useSticky?Tv(q):Nv(q)}else throw Error("non exhaustive match")}})});var o,a,l,c,u;t("misc mapping",function(){o=(0,Se.map)(i,function(S){return S.tokenTypeIdx}),a=(0,Se.map)(i,function(S){var P=S.GROUP;if(P!==tr.Lexer.SKIPPED){if((0,Se.isString)(P))return P;if((0,Se.isUndefined)(P))return!1;throw Error("non exhaustive match")}}),l=(0,Se.map)(i,function(S){var P=S.LONGER_ALT;if(P){var F=(0,Se.isArray)(P)?(0,Se.map)(P,function(H){return(0,Se.indexOf)(i,H)}):[(0,Se.indexOf)(i,P)];return F}}),c=(0,Se.map)(i,function(S){return S.PUSH_MODE}),u=(0,Se.map)(i,function(S){return(0,Se.has)(S,"POP_MODE")})});var g;t("Line Terminator Handling",function(){var S=uY(e.lineTerminatorCharacters);g=(0,Se.map)(i,function(P){return!1}),e.positionTracking!=="onlyOffset"&&(g=(0,Se.map)(i,function(P){if((0,Se.has)(P,"LINE_BREAKS"))return P.LINE_BREAKS;if(lY(P,S)===!1)return(0,Zg.canMatchCharCode)(S,P.PATTERN)}))});var h,p,d,m;t("Misc Mapping #2",function(){h=(0,Se.map)(i,Ov),p=(0,Se.map)(s,AY),d=(0,Se.reduce)(i,function(S,P){var F=P.GROUP;return(0,Se.isString)(F)&&F!==tr.Lexer.SKIPPED&&(S[F]=[]),S},{}),m=(0,Se.map)(s,function(S,P){return{pattern:s[P],longerAlt:l[P],canLineTerminator:g[P],isCustom:h[P],short:p[P],group:a[P],push:c[P],pop:u[P],tokenTypeIdx:o[P],tokenType:i[P]}})});var y=!0,B=[];return e.safeMode||t("First Char Optimization",function(){B=(0,Se.reduce)(i,function(S,P,F){if(typeof P.PATTERN=="string"){var H=P.PATTERN.charCodeAt(0),q=Lv(H);Fv(S,q,m[F])}else if((0,Se.isArray)(P.START_CHARS_HINT)){var _;(0,Se.forEach)(P.START_CHARS_HINT,function(W){var Z=typeof W=="string"?W.charCodeAt(0):W,A=Lv(Z);_!==A&&(_=A,Fv(S,A,m[F]))})}else if((0,Se.isRegExp)(P.PATTERN))if(P.PATTERN.unicode)y=!1,e.ensureOptimizations&&(0,Se.PRINT_ERROR)(""+Zg.failedOptimizationPrefixMsg+(" Unable to analyze < "+P.PATTERN.toString()+` > pattern. +`)+` The regexp unicode flag is not currently supported by the regexp-to-ast library. + This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{var X=(0,Zg.getOptimizedStartCodesIndices)(P.PATTERN,e.ensureOptimizations);(0,Se.isEmpty)(X)&&(y=!1),(0,Se.forEach)(X,function(W){Fv(S,W,m[F])})}else e.ensureOptimizations&&(0,Se.PRINT_ERROR)(""+Zg.failedOptimizationPrefixMsg+(" TokenType: <"+P.name+`> is using a custom token pattern without providing parameter. +`)+` This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),y=!1;return S},[])}),t("ArrayPacking",function(){B=(0,Se.packArray)(B)}),{emptyGroups:d,patternIdxToConfig:m,charCodeToPatternIdxToConfig:B,hasCustom:n,canBeOptimized:y}}We.analyzeTokenTypes=KEe;function UEe(r,e){var t=[],i=_G(r);t=t.concat(i.errors);var n=$G(i.valid),s=n.valid;return t=t.concat(n.errors),t=t.concat(HEe(s)),t=t.concat(sY(s)),t=t.concat(oY(s,e)),t=t.concat(aY(s)),t}We.validatePatterns=UEe;function HEe(r){var e=[],t=(0,Se.filter)(r,function(i){return(0,Se.isRegExp)(i[ko])});return e=e.concat(eY(t)),e=e.concat(rY(t)),e=e.concat(iY(t)),e=e.concat(nY(t)),e=e.concat(tY(t)),e}function _G(r){var e=(0,Se.filter)(r,function(n){return!(0,Se.has)(n,ko)}),t=(0,Se.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- missing static 'PATTERN' property",type:tr.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[n]}}),i=(0,Se.difference)(r,e);return{errors:t,valid:i}}We.findMissingPatterns=_G;function $G(r){var e=(0,Se.filter)(r,function(n){var s=n[ko];return!(0,Se.isRegExp)(s)&&!(0,Se.isFunction)(s)&&!(0,Se.has)(s,"exec")&&!(0,Se.isString)(s)}),t=(0,Se.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:tr.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[n]}}),i=(0,Se.difference)(r,e);return{errors:t,valid:i}}We.findInvalidPatterns=$G;var jEe=/[^\\][\$]/;function eY(r){var e=function(n){VG(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitEndAnchor=function(o){this.found=!0},s}(XG.BaseRegExpVisitor),t=(0,Se.filter)(r,function(n){var s=n[ko];try{var o=(0,ZG.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return jEe.test(s.source)}}),i=(0,Se.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: + Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain end of input anchor '$' + See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:tr.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}We.findEndOfInputAnchor=eY;function tY(r){var e=(0,Se.filter)(r,function(i){var n=i[ko];return n.test("")}),t=(0,Se.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' must not match an empty string",type:tr.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[i]}});return t}We.findEmptyMatchRegExps=tY;var GEe=/[^\\[][\^]|^\^/;function rY(r){var e=function(n){VG(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitStartAnchor=function(o){this.found=!0},s}(XG.BaseRegExpVisitor),t=(0,Se.filter)(r,function(n){var s=n[ko];try{var o=(0,ZG.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return GEe.test(s.source)}}),i=(0,Se.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: + Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain start of input anchor '^' + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:tr.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}We.findStartOfInputAnchor=rY;function iY(r){var e=(0,Se.filter)(r,function(i){var n=i[ko];return n instanceof RegExp&&(n.multiline||n.global)}),t=(0,Se.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:tr.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[i]}});return t}We.findUnsupportedFlags=iY;function nY(r){var e=[],t=(0,Se.map)(r,function(s){return(0,Se.reduce)(r,function(o,a){return s.PATTERN.source===a.PATTERN.source&&!(0,Se.contains)(e,a)&&a.PATTERN!==tr.Lexer.NA&&(e.push(a),o.push(a)),o},[])});t=(0,Se.compact)(t);var i=(0,Se.filter)(t,function(s){return s.length>1}),n=(0,Se.map)(i,function(s){var o=(0,Se.map)(s,function(l){return l.name}),a=(0,Se.first)(s).PATTERN;return{message:"The same RegExp pattern ->"+a+"<-"+("has been used in all of the following Token Types: "+o.join(", ")+" <-"),type:tr.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}});return n}We.findDuplicatePatterns=nY;function sY(r){var e=(0,Se.filter)(r,function(i){if(!(0,Se.has)(i,"GROUP"))return!1;var n=i.GROUP;return n!==tr.Lexer.SKIPPED&&n!==tr.Lexer.NA&&!(0,Se.isString)(n)}),t=(0,Se.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:tr.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[i]}});return t}We.findInvalidGroupType=sY;function oY(r,e){var t=(0,Se.filter)(r,function(n){return n.PUSH_MODE!==void 0&&!(0,Se.contains)(e,n.PUSH_MODE)}),i=(0,Se.map)(t,function(n){var s="Token Type: ->"+n.name+"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->"+n.PUSH_MODE+"<-which does not exist";return{message:s,type:tr.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[n]}});return i}We.findModesThatDoNotExist=oY;function aY(r){var e=[],t=(0,Se.reduce)(r,function(i,n,s){var o=n.PATTERN;return o===tr.Lexer.NA||((0,Se.isString)(o)?i.push({str:o,idx:s,tokenType:n}):(0,Se.isRegExp)(o)&&qEe(o)&&i.push({str:o.source,idx:s,tokenType:n})),i},[]);return(0,Se.forEach)(r,function(i,n){(0,Se.forEach)(t,function(s){var o=s.str,a=s.idx,l=s.tokenType;if(n"+i.name+"<-")+`in the lexer's definition. +See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:tr.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[i,l]})}})}),e}We.findUnreachablePatterns=aY;function YEe(r,e){if((0,Se.isRegExp)(e)){var t=e.exec(r);return t!==null&&t.index===0}else{if((0,Se.isFunction)(e))return e(r,0,[],{});if((0,Se.has)(e,"exec"))return e.exec(r,0,[],{});if(typeof e=="string")return e===r;throw Error("non exhaustive match")}}function qEe(r){var e=[".","\\","[","]","|","^","$","(",")","?","*","+","{"];return(0,Se.find)(e,function(t){return r.source.indexOf(t)!==-1})===void 0}function Nv(r){var e=r.ignoreCase?"i":"";return new RegExp("^(?:"+r.source+")",e)}We.addStartOfInput=Nv;function Tv(r){var e=r.ignoreCase?"iy":"y";return new RegExp(""+r.source,e)}We.addStickyFlag=Tv;function JEe(r,e,t){var i=[];return(0,Se.has)(r,We.DEFAULT_MODE)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+We.DEFAULT_MODE+`> property in its definition +`,type:tr.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,Se.has)(r,We.MODES)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+We.MODES+`> property in its definition +`,type:tr.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,Se.has)(r,We.MODES)&&(0,Se.has)(r,We.DEFAULT_MODE)&&!(0,Se.has)(r.modes,r.defaultMode)&&i.push({message:"A MultiMode Lexer cannot be initialized with a "+We.DEFAULT_MODE+": <"+r.defaultMode+`>which does not exist +`,type:tr.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,Se.has)(r,We.MODES)&&(0,Se.forEach)(r.modes,function(n,s){(0,Se.forEach)(n,function(o,a){(0,Se.isUndefined)(o)&&i.push({message:"A Lexer cannot be initialized using an undefined Token Type. Mode:"+("<"+s+"> at index: <"+a+`> +`),type:tr.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),i}We.performRuntimeChecks=JEe;function WEe(r,e,t){var i=[],n=!1,s=(0,Se.compact)((0,Se.flatten)((0,Se.mapValues)(r.modes,function(l){return l}))),o=(0,Se.reject)(s,function(l){return l[ko]===tr.Lexer.NA}),a=uY(t);return e&&(0,Se.forEach)(o,function(l){var c=lY(l,a);if(c!==!1){var u=cY(l,c),g={message:u,type:c.issue,tokenType:l};i.push(g)}else(0,Se.has)(l,"LINE_BREAKS")?l.LINE_BREAKS===!0&&(n=!0):(0,Zg.canMatchCharCode)(a,l.PATTERN)&&(n=!0)}),e&&!n&&i.push({message:`Warning: No LINE_BREAKS Found. + This Lexer has been defined to track line and column information, + But none of the Token Types can be identified as matching a line terminator. + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS + for details.`,type:tr.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),i}We.performWarningRuntimeChecks=WEe;function zEe(r){var e={},t=(0,Se.keys)(r);return(0,Se.forEach)(t,function(i){var n=r[i];if((0,Se.isArray)(n))e[i]=[];else throw Error("non exhaustive match")}),e}We.cloneEmptyGroups=zEe;function Ov(r){var e=r.PATTERN;if((0,Se.isRegExp)(e))return!1;if((0,Se.isFunction)(e))return!0;if((0,Se.has)(e,"exec"))return!0;if((0,Se.isString)(e))return!1;throw Error("non exhaustive match")}We.isCustomPattern=Ov;function AY(r){return(0,Se.isString)(r)&&r.length===1?r.charCodeAt(0):!1}We.isShortPattern=AY;We.LineTerminatorOptimizedTester={test:function(r){for(var e=r.length,t=this.lastIndex;t Token Type +`)+(" Root cause: "+e.errMsg+`. +`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR";if(e.issue===tr.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. +`+(" The problem is in the <"+r.name+`> Token Type +`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK";throw Error("non exhaustive match")}We.buildLineBreakIssueMessage=cY;function uY(r){var e=(0,Se.map)(r,function(t){return(0,Se.isString)(t)&&t.length>0?t.charCodeAt(0):t});return e}function Fv(r,e,t){r[e]===void 0?r[e]=[t]:r[e].push(t)}We.minOptimizationVal=256;var iy=[];function Lv(r){return r255?255+~~(r/255):r}}});var _g=I(Rt=>{"use strict";Object.defineProperty(Rt,"__esModule",{value:!0});Rt.isTokenType=Rt.hasExtendingTokensTypesMapProperty=Rt.hasExtendingTokensTypesProperty=Rt.hasCategoriesProperty=Rt.hasShortKeyProperty=Rt.singleAssignCategoriesToksMap=Rt.assignCategoriesMapProp=Rt.assignCategoriesTokensProp=Rt.assignTokenDefaultProps=Rt.expandCategories=Rt.augmentTokenTypes=Rt.tokenIdxToClass=Rt.tokenShortNameIdx=Rt.tokenStructuredMatcherNoCategories=Rt.tokenStructuredMatcher=void 0;var Vr=Kt();function XEe(r,e){var t=r.tokenTypeIdx;return t===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[t]===!0}Rt.tokenStructuredMatcher=XEe;function ZEe(r,e){return r.tokenTypeIdx===e.tokenTypeIdx}Rt.tokenStructuredMatcherNoCategories=ZEe;Rt.tokenShortNameIdx=1;Rt.tokenIdxToClass={};function _Ee(r){var e=gY(r);fY(e),pY(e),hY(e),(0,Vr.forEach)(e,function(t){t.isParent=t.categoryMatches.length>0})}Rt.augmentTokenTypes=_Ee;function gY(r){for(var e=(0,Vr.cloneArr)(r),t=r,i=!0;i;){t=(0,Vr.compact)((0,Vr.flatten)((0,Vr.map)(t,function(s){return s.CATEGORIES})));var n=(0,Vr.difference)(t,e);e=e.concat(n),(0,Vr.isEmpty)(n)?i=!1:t=n}return e}Rt.expandCategories=gY;function fY(r){(0,Vr.forEach)(r,function(e){dY(e)||(Rt.tokenIdxToClass[Rt.tokenShortNameIdx]=e,e.tokenTypeIdx=Rt.tokenShortNameIdx++),Mv(e)&&!(0,Vr.isArray)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),Mv(e)||(e.CATEGORIES=[]),CY(e)||(e.categoryMatches=[]),mY(e)||(e.categoryMatchesMap={})})}Rt.assignTokenDefaultProps=fY;function hY(r){(0,Vr.forEach)(r,function(e){e.categoryMatches=[],(0,Vr.forEach)(e.categoryMatchesMap,function(t,i){e.categoryMatches.push(Rt.tokenIdxToClass[i].tokenTypeIdx)})})}Rt.assignCategoriesTokensProp=hY;function pY(r){(0,Vr.forEach)(r,function(e){Kv([],e)})}Rt.assignCategoriesMapProp=pY;function Kv(r,e){(0,Vr.forEach)(r,function(t){e.categoryMatchesMap[t.tokenTypeIdx]=!0}),(0,Vr.forEach)(e.CATEGORIES,function(t){var i=r.concat(e);(0,Vr.contains)(i,t)||Kv(i,t)})}Rt.singleAssignCategoriesToksMap=Kv;function dY(r){return(0,Vr.has)(r,"tokenTypeIdx")}Rt.hasShortKeyProperty=dY;function Mv(r){return(0,Vr.has)(r,"CATEGORIES")}Rt.hasCategoriesProperty=Mv;function CY(r){return(0,Vr.has)(r,"categoryMatches")}Rt.hasExtendingTokensTypesProperty=CY;function mY(r){return(0,Vr.has)(r,"categoryMatchesMap")}Rt.hasExtendingTokensTypesMapProperty=mY;function $Ee(r){return(0,Vr.has)(r,"tokenTypeIdx")}Rt.isTokenType=$Ee});var Uv=I(ny=>{"use strict";Object.defineProperty(ny,"__esModule",{value:!0});ny.defaultLexerErrorProvider=void 0;ny.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(r){return"Unable to pop Lexer Mode after encountering Token ->"+r.image+"<- The Mode Stack is empty"},buildUnexpectedCharactersMessage:function(r,e,t,i,n){return"unexpected character: ->"+r.charAt(e)+"<- at offset: "+e+","+(" skipped "+t+" characters.")}}});var Qd=I(Ec=>{"use strict";Object.defineProperty(Ec,"__esModule",{value:!0});Ec.Lexer=Ec.LexerDefinitionErrorType=void 0;var Zs=Rv(),rr=Kt(),eIe=_g(),tIe=Uv(),rIe=ey(),iIe;(function(r){r[r.MISSING_PATTERN=0]="MISSING_PATTERN",r[r.INVALID_PATTERN=1]="INVALID_PATTERN",r[r.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",r[r.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",r[r.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",r[r.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",r[r.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",r[r.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",r[r.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",r[r.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",r[r.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",r[r.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",r[r.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",r[r.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",r[r.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",r[r.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",r[r.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK"})(iIe=Ec.LexerDefinitionErrorType||(Ec.LexerDefinitionErrorType={}));var bd={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` +`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:tIe.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(bd);var nIe=function(){function r(e,t){var i=this;if(t===void 0&&(t=bd),this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},typeof t=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. +a boolean 2nd argument is no longer supported`);this.config=(0,rr.merge)(bd,t);var n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",function(){var s,o=!0;i.TRACE_INIT("Lexer Config handling",function(){if(i.config.lineTerminatorsPattern===bd.lineTerminatorsPattern)i.config.lineTerminatorsPattern=Zs.LineTerminatorOptimizedTester;else if(i.config.lineTerminatorCharacters===bd.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(t.safeMode&&t.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');i.trackStartLines=/full|onlyStart/i.test(i.config.positionTracking),i.trackEndLines=/full/i.test(i.config.positionTracking),(0,rr.isArray)(e)?(s={modes:{}},s.modes[Zs.DEFAULT_MODE]=(0,rr.cloneArr)(e),s[Zs.DEFAULT_MODE]=Zs.DEFAULT_MODE):(o=!1,s=(0,rr.cloneObj)(e))}),i.config.skipValidations===!1&&(i.TRACE_INIT("performRuntimeChecks",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,Zs.performRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))}),i.TRACE_INIT("performWarningRuntimeChecks",function(){i.lexerDefinitionWarning=i.lexerDefinitionWarning.concat((0,Zs.performWarningRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},(0,rr.forEach)(s.modes,function(u,g){s.modes[g]=(0,rr.reject)(u,function(h){return(0,rr.isUndefined)(h)})});var a=(0,rr.keys)(s.modes);if((0,rr.forEach)(s.modes,function(u,g){i.TRACE_INIT("Mode: <"+g+"> processing",function(){if(i.modes.push(g),i.config.skipValidations===!1&&i.TRACE_INIT("validatePatterns",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,Zs.validatePatterns)(u,a))}),(0,rr.isEmpty)(i.lexerDefinitionErrors)){(0,eIe.augmentTokenTypes)(u);var h;i.TRACE_INIT("analyzeTokenTypes",function(){h=(0,Zs.analyzeTokenTypes)(u,{lineTerminatorCharacters:i.config.lineTerminatorCharacters,positionTracking:t.positionTracking,ensureOptimizations:t.ensureOptimizations,safeMode:t.safeMode,tracer:i.TRACE_INIT.bind(i)})}),i.patternIdxToConfig[g]=h.patternIdxToConfig,i.charCodeToPatternIdxToConfig[g]=h.charCodeToPatternIdxToConfig,i.emptyGroups=(0,rr.merge)(i.emptyGroups,h.emptyGroups),i.hasCustom=h.hasCustom||i.hasCustom,i.canModeBeOptimized[g]=h.canBeOptimized}})}),i.defaultMode=s.defaultMode,!(0,rr.isEmpty)(i.lexerDefinitionErrors)&&!i.config.deferDefinitionErrorsHandling){var l=(0,rr.map)(i.lexerDefinitionErrors,function(u){return u.message}),c=l.join(`----------------------- +`);throw new Error(`Errors detected in definition of Lexer: +`+c)}(0,rr.forEach)(i.lexerDefinitionWarning,function(u){(0,rr.PRINT_WARNING)(u.message)}),i.TRACE_INIT("Choosing sub-methods implementations",function(){if(Zs.SUPPORT_STICKY?(i.chopInput=rr.IDENTITY,i.match=i.matchWithTest):(i.updateLastIndex=rr.NOOP,i.match=i.matchWithExec),o&&(i.handleModes=rr.NOOP),i.trackStartLines===!1&&(i.computeNewColumn=rr.IDENTITY),i.trackEndLines===!1&&(i.updateTokenEndLineColumnLocation=rr.NOOP),/full/i.test(i.config.positionTracking))i.createTokenInstance=i.createFullToken;else if(/onlyStart/i.test(i.config.positionTracking))i.createTokenInstance=i.createStartOnlyToken;else if(/onlyOffset/i.test(i.config.positionTracking))i.createTokenInstance=i.createOffsetOnlyToken;else throw Error('Invalid config option: "'+i.config.positionTracking+'"');i.hasCustom?(i.addToken=i.addTokenUsingPush,i.handlePayload=i.handlePayloadWithCustom):(i.addToken=i.addTokenUsingMemberAccess,i.handlePayload=i.handlePayloadNoCustom)}),i.TRACE_INIT("Failed Optimization Warnings",function(){var u=(0,rr.reduce)(i.canModeBeOptimized,function(g,h,p){return h===!1&&g.push(p),g},[]);if(t.ensureOptimizations&&!(0,rr.isEmpty)(u))throw Error("Lexer Modes: < "+u.join(", ")+` > cannot be optimized. + Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. + Or inspect the console log for details on how to resolve these issues.`)}),i.TRACE_INIT("clearRegExpParserCache",function(){(0,rIe.clearRegExpParserCache)()}),i.TRACE_INIT("toFastProperties",function(){(0,rr.toFastProperties)(i)})})}return r.prototype.tokenize=function(e,t){if(t===void 0&&(t=this.defaultMode),!(0,rr.isEmpty)(this.lexerDefinitionErrors)){var i=(0,rr.map)(this.lexerDefinitionErrors,function(o){return o.message}),n=i.join(`----------------------- +`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: +`+n)}var s=this.tokenizeInternal(e,t);return s},r.prototype.tokenizeInternal=function(e,t){var i=this,n,s,o,a,l,c,u,g,h,p,d,m,y,B,S,P,F=e,H=F.length,q=0,_=0,X=this.hasCustom?0:Math.floor(e.length/10),W=new Array(X),Z=[],A=this.trackStartLines?1:void 0,ne=this.trackStartLines?1:void 0,ue=(0,Zs.cloneEmptyGroups)(this.emptyGroups),te=this.trackStartLines,O=this.config.lineTerminatorsPattern,N=0,ce=[],he=[],Pe=[],De=[];Object.freeze(De);var Re=void 0;function se(){return ce}function Ae(fr){var Ei=(0,Zs.charCodeToOptimizedIndex)(fr),rs=he[Ei];return rs===void 0?De:rs}var ye=function(fr){if(Pe.length===1&&fr.tokenType.PUSH_MODE===void 0){var Ei=i.config.errorMessageProvider.buildUnableToPopLexerModeMessage(fr);Z.push({offset:fr.startOffset,line:fr.startLine!==void 0?fr.startLine:void 0,column:fr.startColumn!==void 0?fr.startColumn:void 0,length:fr.image.length,message:Ei})}else{Pe.pop();var rs=(0,rr.last)(Pe);ce=i.patternIdxToConfig[rs],he=i.charCodeToPatternIdxToConfig[rs],N=ce.length;var ua=i.canModeBeOptimized[rs]&&i.config.safeMode===!1;he&&ua?Re=Ae:Re=se}};function ge(fr){Pe.push(fr),he=this.charCodeToPatternIdxToConfig[fr],ce=this.patternIdxToConfig[fr],N=ce.length,N=ce.length;var Ei=this.canModeBeOptimized[fr]&&this.config.safeMode===!1;he&&Ei?Re=Ae:Re=se}ge.call(this,t);for(var oe;qc.length){c=a,u=g,oe=Ze;break}}}break}}if(c!==null){if(h=c.length,p=oe.group,p!==void 0&&(d=oe.tokenTypeIdx,m=this.createTokenInstance(c,q,d,oe.tokenType,A,ne,h),this.handlePayload(m,u),p===!1?_=this.addToken(W,_,m):ue[p].push(m)),e=this.chopInput(e,h),q=q+h,ne=this.computeNewColumn(ne,h),te===!0&&oe.canLineTerminator===!0){var mt=0,Tr=void 0,ti=void 0;O.lastIndex=0;do Tr=O.test(c),Tr===!0&&(ti=O.lastIndex-1,mt++);while(Tr===!0);mt!==0&&(A=A+mt,ne=h-ti,this.updateTokenEndLineColumnLocation(m,p,ti,mt,A,ne,h))}this.handleModes(oe,ye,ge,m)}else{for(var ui=q,gr=A,gi=ne,ri=!1;!ri&&q <"+e+">");var n=(0,rr.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r.SKIPPED="This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.",r.NA=/NOT_APPLICABLE/,r}();Ec.Lexer=nIe});var NA=I(Si=>{"use strict";Object.defineProperty(Si,"__esModule",{value:!0});Si.tokenMatcher=Si.createTokenInstance=Si.EOF=Si.createToken=Si.hasTokenLabel=Si.tokenName=Si.tokenLabel=void 0;var _s=Kt(),sIe=Qd(),Hv=_g();function oIe(r){return vY(r)?r.LABEL:r.name}Si.tokenLabel=oIe;function aIe(r){return r.name}Si.tokenName=aIe;function vY(r){return(0,_s.isString)(r.LABEL)&&r.LABEL!==""}Si.hasTokenLabel=vY;var AIe="parent",EY="categories",IY="label",yY="group",wY="push_mode",BY="pop_mode",QY="longer_alt",bY="line_breaks",SY="start_chars_hint";function xY(r){return lIe(r)}Si.createToken=xY;function lIe(r){var e=r.pattern,t={};if(t.name=r.name,(0,_s.isUndefined)(e)||(t.PATTERN=e),(0,_s.has)(r,AIe))throw`The parent property is no longer supported. +See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.`;return(0,_s.has)(r,EY)&&(t.CATEGORIES=r[EY]),(0,Hv.augmentTokenTypes)([t]),(0,_s.has)(r,IY)&&(t.LABEL=r[IY]),(0,_s.has)(r,yY)&&(t.GROUP=r[yY]),(0,_s.has)(r,BY)&&(t.POP_MODE=r[BY]),(0,_s.has)(r,wY)&&(t.PUSH_MODE=r[wY]),(0,_s.has)(r,QY)&&(t.LONGER_ALT=r[QY]),(0,_s.has)(r,bY)&&(t.LINE_BREAKS=r[bY]),(0,_s.has)(r,SY)&&(t.START_CHARS_HINT=r[SY]),t}Si.EOF=xY({name:"EOF",pattern:sIe.Lexer.NA});(0,Hv.augmentTokenTypes)([Si.EOF]);function cIe(r,e,t,i,n,s,o,a){return{image:e,startOffset:t,endOffset:i,startLine:n,endLine:s,startColumn:o,endColumn:a,tokenTypeIdx:r.tokenTypeIdx,tokenType:r}}Si.createTokenInstance=cIe;function uIe(r,e){return(0,Hv.tokenStructuredMatcher)(r,e)}Si.tokenMatcher=uIe});var mn=I(qt=>{"use strict";var ka=qt&&qt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(qt,"__esModule",{value:!0});qt.serializeProduction=qt.serializeGrammar=qt.Terminal=qt.Alternation=qt.RepetitionWithSeparator=qt.Repetition=qt.RepetitionMandatoryWithSeparator=qt.RepetitionMandatory=qt.Option=qt.Alternative=qt.Rule=qt.NonTerminal=qt.AbstractProduction=void 0;var or=Kt(),gIe=NA(),Do=function(){function r(e){this._definition=e}return Object.defineProperty(r.prototype,"definition",{get:function(){return this._definition},set:function(e){this._definition=e},enumerable:!1,configurable:!0}),r.prototype.accept=function(e){e.visit(this),(0,or.forEach)(this.definition,function(t){t.accept(e)})},r}();qt.AbstractProduction=Do;var PY=function(r){ka(e,r);function e(t){var i=r.call(this,[])||this;return i.idx=1,(0,or.assign)(i,(0,or.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this.referencedRule!==void 0?this.referencedRule.definition:[]},set:function(t){},enumerable:!1,configurable:!0}),e.prototype.accept=function(t){t.visit(this)},e}(Do);qt.NonTerminal=PY;var kY=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.orgText="",(0,or.assign)(i,(0,or.pick)(t,function(n){return n!==void 0})),i}return e}(Do);qt.Rule=kY;var DY=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.ignoreAmbiguities=!1,(0,or.assign)(i,(0,or.pick)(t,function(n){return n!==void 0})),i}return e}(Do);qt.Alternative=DY;var RY=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,or.assign)(i,(0,or.pick)(t,function(n){return n!==void 0})),i}return e}(Do);qt.Option=RY;var FY=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,or.assign)(i,(0,or.pick)(t,function(n){return n!==void 0})),i}return e}(Do);qt.RepetitionMandatory=FY;var NY=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,or.assign)(i,(0,or.pick)(t,function(n){return n!==void 0})),i}return e}(Do);qt.RepetitionMandatoryWithSeparator=NY;var TY=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,or.assign)(i,(0,or.pick)(t,function(n){return n!==void 0})),i}return e}(Do);qt.Repetition=TY;var LY=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,or.assign)(i,(0,or.pick)(t,function(n){return n!==void 0})),i}return e}(Do);qt.RepetitionWithSeparator=LY;var OY=function(r){ka(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,i.ignoreAmbiguities=!1,i.hasPredicates=!1,(0,or.assign)(i,(0,or.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this._definition},set:function(t){this._definition=t},enumerable:!1,configurable:!0}),e}(Do);qt.Alternation=OY;var sy=function(){function r(e){this.idx=1,(0,or.assign)(this,(0,or.pick)(e,function(t){return t!==void 0}))}return r.prototype.accept=function(e){e.visit(this)},r}();qt.Terminal=sy;function fIe(r){return(0,or.map)(r,Sd)}qt.serializeGrammar=fIe;function Sd(r){function e(s){return(0,or.map)(s,Sd)}if(r instanceof PY){var t={type:"NonTerminal",name:r.nonTerminalName,idx:r.idx};return(0,or.isString)(r.label)&&(t.label=r.label),t}else{if(r instanceof DY)return{type:"Alternative",definition:e(r.definition)};if(r instanceof RY)return{type:"Option",idx:r.idx,definition:e(r.definition)};if(r instanceof FY)return{type:"RepetitionMandatory",idx:r.idx,definition:e(r.definition)};if(r instanceof NY)return{type:"RepetitionMandatoryWithSeparator",idx:r.idx,separator:Sd(new sy({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof LY)return{type:"RepetitionWithSeparator",idx:r.idx,separator:Sd(new sy({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof TY)return{type:"Repetition",idx:r.idx,definition:e(r.definition)};if(r instanceof OY)return{type:"Alternation",idx:r.idx,definition:e(r.definition)};if(r instanceof sy){var i={type:"Terminal",name:r.terminalType.name,label:(0,gIe.tokenLabel)(r.terminalType),idx:r.idx};(0,or.isString)(r.label)&&(i.terminalLabel=r.label);var n=r.terminalType.PATTERN;return r.terminalType.PATTERN&&(i.pattern=(0,or.isRegExp)(n)?n.source:n),i}else{if(r instanceof kY)return{type:"Rule",name:r.name,orgText:r.orgText,definition:e(r.definition)};throw Error("non exhaustive match")}}}qt.serializeProduction=Sd});var ay=I(oy=>{"use strict";Object.defineProperty(oy,"__esModule",{value:!0});oy.RestWalker=void 0;var jv=Kt(),En=mn(),hIe=function(){function r(){}return r.prototype.walk=function(e,t){var i=this;t===void 0&&(t=[]),(0,jv.forEach)(e.definition,function(n,s){var o=(0,jv.drop)(e.definition,s+1);if(n instanceof En.NonTerminal)i.walkProdRef(n,o,t);else if(n instanceof En.Terminal)i.walkTerminal(n,o,t);else if(n instanceof En.Alternative)i.walkFlat(n,o,t);else if(n instanceof En.Option)i.walkOption(n,o,t);else if(n instanceof En.RepetitionMandatory)i.walkAtLeastOne(n,o,t);else if(n instanceof En.RepetitionMandatoryWithSeparator)i.walkAtLeastOneSep(n,o,t);else if(n instanceof En.RepetitionWithSeparator)i.walkManySep(n,o,t);else if(n instanceof En.Repetition)i.walkMany(n,o,t);else if(n instanceof En.Alternation)i.walkOr(n,o,t);else throw Error("non exhaustive match")})},r.prototype.walkTerminal=function(e,t,i){},r.prototype.walkProdRef=function(e,t,i){},r.prototype.walkFlat=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkOption=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkAtLeastOne=function(e,t,i){var n=[new En.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkAtLeastOneSep=function(e,t,i){var n=MY(e,t,i);this.walk(e,n)},r.prototype.walkMany=function(e,t,i){var n=[new En.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkManySep=function(e,t,i){var n=MY(e,t,i);this.walk(e,n)},r.prototype.walkOr=function(e,t,i){var n=this,s=t.concat(i);(0,jv.forEach)(e.definition,function(o){var a=new En.Alternative({definition:[o]});n.walk(a,s)})},r}();oy.RestWalker=hIe;function MY(r,e,t){var i=[new En.Option({definition:[new En.Terminal({terminalType:r.separator})].concat(r.definition)})],n=i.concat(e,t);return n}});var $g=I(Ay=>{"use strict";Object.defineProperty(Ay,"__esModule",{value:!0});Ay.GAstVisitor=void 0;var Ro=mn(),pIe=function(){function r(){}return r.prototype.visit=function(e){var t=e;switch(t.constructor){case Ro.NonTerminal:return this.visitNonTerminal(t);case Ro.Alternative:return this.visitAlternative(t);case Ro.Option:return this.visitOption(t);case Ro.RepetitionMandatory:return this.visitRepetitionMandatory(t);case Ro.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(t);case Ro.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(t);case Ro.Repetition:return this.visitRepetition(t);case Ro.Alternation:return this.visitAlternation(t);case Ro.Terminal:return this.visitTerminal(t);case Ro.Rule:return this.visitRule(t);default:throw Error("non exhaustive match")}},r.prototype.visitNonTerminal=function(e){},r.prototype.visitAlternative=function(e){},r.prototype.visitOption=function(e){},r.prototype.visitRepetition=function(e){},r.prototype.visitRepetitionMandatory=function(e){},r.prototype.visitRepetitionMandatoryWithSeparator=function(e){},r.prototype.visitRepetitionWithSeparator=function(e){},r.prototype.visitAlternation=function(e){},r.prototype.visitTerminal=function(e){},r.prototype.visitRule=function(e){},r}();Ay.GAstVisitor=pIe});var xd=I(Mi=>{"use strict";var dIe=Mi&&Mi.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Mi,"__esModule",{value:!0});Mi.collectMethods=Mi.DslMethodsCollectorVisitor=Mi.getProductionDslName=Mi.isBranchingProd=Mi.isOptionalProd=Mi.isSequenceProd=void 0;var vd=Kt(),wr=mn(),CIe=$g();function mIe(r){return r instanceof wr.Alternative||r instanceof wr.Option||r instanceof wr.Repetition||r instanceof wr.RepetitionMandatory||r instanceof wr.RepetitionMandatoryWithSeparator||r instanceof wr.RepetitionWithSeparator||r instanceof wr.Terminal||r instanceof wr.Rule}Mi.isSequenceProd=mIe;function Gv(r,e){e===void 0&&(e=[]);var t=r instanceof wr.Option||r instanceof wr.Repetition||r instanceof wr.RepetitionWithSeparator;return t?!0:r instanceof wr.Alternation?(0,vd.some)(r.definition,function(i){return Gv(i,e)}):r instanceof wr.NonTerminal&&(0,vd.contains)(e,r)?!1:r instanceof wr.AbstractProduction?(r instanceof wr.NonTerminal&&e.push(r),(0,vd.every)(r.definition,function(i){return Gv(i,e)})):!1}Mi.isOptionalProd=Gv;function EIe(r){return r instanceof wr.Alternation}Mi.isBranchingProd=EIe;function IIe(r){if(r instanceof wr.NonTerminal)return"SUBRULE";if(r instanceof wr.Option)return"OPTION";if(r instanceof wr.Alternation)return"OR";if(r instanceof wr.RepetitionMandatory)return"AT_LEAST_ONE";if(r instanceof wr.RepetitionMandatoryWithSeparator)return"AT_LEAST_ONE_SEP";if(r instanceof wr.RepetitionWithSeparator)return"MANY_SEP";if(r instanceof wr.Repetition)return"MANY";if(r instanceof wr.Terminal)return"CONSUME";throw Error("non exhaustive match")}Mi.getProductionDslName=IIe;var KY=function(r){dIe(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.separator="-",t.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},t}return e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(t){var i=t.terminalType.name+this.separator+"Terminal";(0,vd.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitNonTerminal=function(t){var i=t.nonTerminalName+this.separator+"Terminal";(0,vd.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitOption=function(t){this.dslMethods.option.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.dslMethods.repetitionWithSeparator.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.dslMethods.repetitionMandatory.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.dslMethods.repetitionMandatoryWithSeparator.push(t)},e.prototype.visitRepetition=function(t){this.dslMethods.repetition.push(t)},e.prototype.visitAlternation=function(t){this.dslMethods.alternation.push(t)},e}(CIe.GAstVisitor);Mi.DslMethodsCollectorVisitor=KY;var ly=new KY;function yIe(r){ly.reset(),r.accept(ly);var e=ly.dslMethods;return ly.reset(),e}Mi.collectMethods=yIe});var qv=I(Fo=>{"use strict";Object.defineProperty(Fo,"__esModule",{value:!0});Fo.firstForTerminal=Fo.firstForBranching=Fo.firstForSequence=Fo.first=void 0;var cy=Kt(),UY=mn(),Yv=xd();function uy(r){if(r instanceof UY.NonTerminal)return uy(r.referencedRule);if(r instanceof UY.Terminal)return GY(r);if((0,Yv.isSequenceProd)(r))return HY(r);if((0,Yv.isBranchingProd)(r))return jY(r);throw Error("non exhaustive match")}Fo.first=uy;function HY(r){for(var e=[],t=r.definition,i=0,n=t.length>i,s,o=!0;n&&o;)s=t[i],o=(0,Yv.isOptionalProd)(s),e=e.concat(uy(s)),i=i+1,n=t.length>i;return(0,cy.uniq)(e)}Fo.firstForSequence=HY;function jY(r){var e=(0,cy.map)(r.definition,function(t){return uy(t)});return(0,cy.uniq)((0,cy.flatten)(e))}Fo.firstForBranching=jY;function GY(r){return[r.terminalType]}Fo.firstForTerminal=GY});var Jv=I(gy=>{"use strict";Object.defineProperty(gy,"__esModule",{value:!0});gy.IN=void 0;gy.IN="_~IN~_"});var zY=I(gs=>{"use strict";var wIe=gs&&gs.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(gs,"__esModule",{value:!0});gs.buildInProdFollowPrefix=gs.buildBetweenProdsFollowPrefix=gs.computeAllProdsFollows=gs.ResyncFollowsWalker=void 0;var BIe=ay(),QIe=qv(),YY=Kt(),qY=Jv(),bIe=mn(),JY=function(r){wIe(e,r);function e(t){var i=r.call(this)||this;return i.topProd=t,i.follows={},i}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(t,i,n){},e.prototype.walkProdRef=function(t,i,n){var s=WY(t.referencedRule,t.idx)+this.topProd.name,o=i.concat(n),a=new bIe.Alternative({definition:o}),l=(0,QIe.first)(a);this.follows[s]=l},e}(BIe.RestWalker);gs.ResyncFollowsWalker=JY;function SIe(r){var e={};return(0,YY.forEach)(r,function(t){var i=new JY(t).startWalking();(0,YY.assign)(e,i)}),e}gs.computeAllProdsFollows=SIe;function WY(r,e){return r.name+e+qY.IN}gs.buildBetweenProdsFollowPrefix=WY;function vIe(r){var e=r.terminalType.name;return e+r.idx+qY.IN}gs.buildInProdFollowPrefix=vIe});var Pd=I(Da=>{"use strict";Object.defineProperty(Da,"__esModule",{value:!0});Da.defaultGrammarValidatorErrorProvider=Da.defaultGrammarResolverErrorProvider=Da.defaultParserErrorProvider=void 0;var ef=NA(),xIe=Kt(),$s=Kt(),Wv=mn(),VY=xd();Da.defaultParserErrorProvider={buildMismatchTokenMessage:function(r){var e=r.expected,t=r.actual,i=r.previous,n=r.ruleName,s=(0,ef.hasTokenLabel)(e),o=s?"--> "+(0,ef.tokenLabel)(e)+" <--":"token of type --> "+e.name+" <--",a="Expecting "+o+" but found --> '"+t.image+"' <--";return a},buildNotAllInputParsedMessage:function(r){var e=r.firstRedundant,t=r.ruleName;return"Redundant input, expecting EOF but found: "+e.image},buildNoViableAltMessage:function(r){var e=r.expectedPathsPerAlt,t=r.actual,i=r.previous,n=r.customUserDescription,s=r.ruleName,o="Expecting: ",a=(0,$s.first)(t).image,l=` +but found: '`+a+"'";if(n)return o+n+l;var c=(0,$s.reduce)(e,function(p,d){return p.concat(d)},[]),u=(0,$s.map)(c,function(p){return"["+(0,$s.map)(p,function(d){return(0,ef.tokenLabel)(d)}).join(", ")+"]"}),g=(0,$s.map)(u,function(p,d){return" "+(d+1)+". "+p}),h=`one of these possible Token sequences: +`+g.join(` +`);return o+h+l},buildEarlyExitMessage:function(r){var e=r.expectedIterationPaths,t=r.actual,i=r.customUserDescription,n=r.ruleName,s="Expecting: ",o=(0,$s.first)(t).image,a=` +but found: '`+o+"'";if(i)return s+i+a;var l=(0,$s.map)(e,function(u){return"["+(0,$s.map)(u,function(g){return(0,ef.tokenLabel)(g)}).join(",")+"]"}),c=`expecting at least one iteration which starts with one of these possible Token sequences:: + `+("<"+l.join(" ,")+">");return s+c+a}};Object.freeze(Da.defaultParserErrorProvider);Da.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(r,e){var t="Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- +inside top level rule: ->`+r.name+"<-";return t}};Da.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(r,e){function t(u){return u instanceof Wv.Terminal?u.terminalType.name:u instanceof Wv.NonTerminal?u.nonTerminalName:""}var i=r.name,n=(0,$s.first)(e),s=n.idx,o=(0,VY.getProductionDslName)(n),a=t(n),l=s>0,c="->"+o+(l?s:"")+"<- "+(a?"with argument: ->"+a+"<-":"")+` + appears more than once (`+e.length+" times) in the top level rule: ->"+i+`<-. + For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES + `;return c=c.replace(/[ \t]+/g," "),c=c.replace(/\s\s+/g,` +`),c},buildNamespaceConflictError:function(r){var e=`Namespace conflict found in grammar. +`+("The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <"+r.name+`>. +`)+`To resolve this make sure each Terminal and Non-Terminal names are unique +This is easy to accomplish by using the convention that Terminal names start with an uppercase letter +and Non-Terminal names start with a lower case letter.`;return e},buildAlternationPrefixAmbiguityError:function(r){var e=(0,$s.map)(r.prefixPath,function(n){return(0,ef.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous alternatives: <"+r.ambiguityIndices.join(" ,")+`> due to common lookahead prefix +`+("in inside <"+r.topLevelRule.name+`> Rule, +`)+("<"+e+`> may appears as a prefix path in all these alternatives. +`)+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX +For Further details.`;return i},buildAlternationAmbiguityError:function(r){var e=(0,$s.map)(r.prefixPath,function(n){return(0,ef.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous Alternatives Detected: <"+r.ambiguityIndices.join(" ,")+"> in "+(" inside <"+r.topLevelRule.name+`> Rule, +`)+("<"+e+`> may appears as a prefix path in all these alternatives. +`);return i=i+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES +For Further details.`,i},buildEmptyRepetitionError:function(r){var e=(0,VY.getProductionDslName)(r.repetition);r.repetition.idx!==0&&(e+=r.repetition.idx);var t="The repetition <"+e+"> within Rule <"+r.topLevelRule.name+`> can never consume any tokens. +This could lead to an infinite loop.`;return t},buildTokenNameError:function(r){return"deprecated"},buildEmptyAlternationError:function(r){var e="Ambiguous empty alternative: <"+(r.emptyChoiceIdx+1)+">"+(" in inside <"+r.topLevelRule.name+`> Rule. +`)+"Only the last alternative may be an empty alternative.";return e},buildTooManyAlternativesError:function(r){var e=`An Alternation cannot have more than 256 alternatives: +`+(" inside <"+r.topLevelRule.name+`> Rule. + has `+(r.alternation.definition.length+1)+" alternatives.");return e},buildLeftRecursionError:function(r){var e=r.topLevelRule.name,t=xIe.map(r.leftRecursionPath,function(s){return s.name}),i=e+" --> "+t.concat([e]).join(" --> "),n=`Left Recursion found in grammar. +`+("rule: <"+e+`> can be invoked from itself (directly or indirectly) +`)+(`without consuming any Tokens. The grammar path that causes this is: + `+i+` +`)+` To fix this refactor your grammar to remove the left recursion. +see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.`;return n},buildInvalidRuleNameError:function(r){return"deprecated"},buildDuplicateRuleNameError:function(r){var e;r.topLevelRule instanceof Wv.Rule?e=r.topLevelRule.name:e=r.topLevelRule;var t="Duplicate definition, rule: ->"+e+"<- is already defined in the grammar: ->"+r.grammarName+"<-";return t}}});var _Y=I(TA=>{"use strict";var PIe=TA&&TA.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(TA,"__esModule",{value:!0});TA.GastRefResolverVisitor=TA.resolveGrammar=void 0;var kIe=Yn(),XY=Kt(),DIe=$g();function RIe(r,e){var t=new ZY(r,e);return t.resolveRefs(),t.errors}TA.resolveGrammar=RIe;var ZY=function(r){PIe(e,r);function e(t,i){var n=r.call(this)||this;return n.nameToTopRule=t,n.errMsgProvider=i,n.errors=[],n}return e.prototype.resolveRefs=function(){var t=this;(0,XY.forEach)((0,XY.values)(this.nameToTopRule),function(i){t.currTopLevel=i,i.accept(t)})},e.prototype.visitNonTerminal=function(t){var i=this.nameToTopRule[t.nonTerminalName];if(i)t.referencedRule=i;else{var n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,t);this.errors.push({message:n,type:kIe.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:t.nonTerminalName})}},e}(DIe.GAstVisitor);TA.GastRefResolverVisitor=ZY});var Dd=I(Rr=>{"use strict";var Ic=Rr&&Rr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Rr,"__esModule",{value:!0});Rr.nextPossibleTokensAfter=Rr.possiblePathsFrom=Rr.NextTerminalAfterAtLeastOneSepWalker=Rr.NextTerminalAfterAtLeastOneWalker=Rr.NextTerminalAfterManySepWalker=Rr.NextTerminalAfterManyWalker=Rr.AbstractNextTerminalAfterProductionWalker=Rr.NextAfterTokenWalker=Rr.AbstractNextPossibleTokensWalker=void 0;var $Y=ay(),Lt=Kt(),FIe=qv(),kt=mn(),eq=function(r){Ic(e,r);function e(t,i){var n=r.call(this)||this;return n.topProd=t,n.path=i,n.possibleTokTypes=[],n.nextProductionName="",n.nextProductionOccurrence=0,n.found=!1,n.isAtEndOfPath=!1,n}return e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,Lt.cloneArr)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,Lt.cloneArr)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(t,i){i===void 0&&(i=[]),this.found||r.prototype.walk.call(this,t,i)},e.prototype.walkProdRef=function(t,i,n){if(t.referencedRule.name===this.nextProductionName&&t.idx===this.nextProductionOccurrence){var s=i.concat(n);this.updateExpectedNext(),this.walk(t.referencedRule,s)}},e.prototype.updateExpectedNext=function(){(0,Lt.isEmpty)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}($Y.RestWalker);Rr.AbstractNextPossibleTokensWalker=eq;var NIe=function(r){Ic(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.path=i,n.nextTerminalName="",n.nextTerminalOccurrence=0,n.nextTerminalName=n.path.lastTok.name,n.nextTerminalOccurrence=n.path.lastTokOccurrence,n}return e.prototype.walkTerminal=function(t,i,n){if(this.isAtEndOfPath&&t.terminalType.name===this.nextTerminalName&&t.idx===this.nextTerminalOccurrence&&!this.found){var s=i.concat(n),o=new kt.Alternative({definition:s});this.possibleTokTypes=(0,FIe.first)(o),this.found=!0}},e}(eq);Rr.NextAfterTokenWalker=NIe;var kd=function(r){Ic(e,r);function e(t,i){var n=r.call(this)||this;return n.topRule=t,n.occurrence=i,n.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},n}return e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}($Y.RestWalker);Rr.AbstractNextTerminalAfterProductionWalker=kd;var TIe=function(r){Ic(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkMany=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Lt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkMany.call(this,t,i,n)},e}(kd);Rr.NextTerminalAfterManyWalker=TIe;var LIe=function(r){Ic(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkManySep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Lt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkManySep.call(this,t,i,n)},e}(kd);Rr.NextTerminalAfterManySepWalker=LIe;var OIe=function(r){Ic(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOne=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Lt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOne.call(this,t,i,n)},e}(kd);Rr.NextTerminalAfterAtLeastOneWalker=OIe;var MIe=function(r){Ic(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOneSep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Lt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOneSep.call(this,t,i,n)},e}(kd);Rr.NextTerminalAfterAtLeastOneSepWalker=MIe;function tq(r,e,t){t===void 0&&(t=[]),t=(0,Lt.cloneArr)(t);var i=[],n=0;function s(c){return c.concat((0,Lt.drop)(r,n+1))}function o(c){var u=tq(s(c),e,t);return i.concat(u)}for(;t.length=0;ue--){var te=B.definition[ue],O={idx:d,def:te.definition.concat((0,Lt.drop)(p)),ruleStack:m,occurrenceStack:y};g.push(O),g.push(o)}else if(B instanceof kt.Alternative)g.push({idx:d,def:B.definition.concat((0,Lt.drop)(p)),ruleStack:m,occurrenceStack:y});else if(B instanceof kt.Rule)g.push(UIe(B,d,m,y));else throw Error("non exhaustive match")}}return u}Rr.nextPossibleTokensAfter=KIe;function UIe(r,e,t,i){var n=(0,Lt.cloneArr)(t);n.push(r.name);var s=(0,Lt.cloneArr)(i);return s.push(1),{idx:e,def:r.definition,ruleStack:n,occurrenceStack:s}}});var Rd=I(Wt=>{"use strict";var nq=Wt&&Wt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Wt,"__esModule",{value:!0});Wt.areTokenCategoriesNotUsed=Wt.isStrictPrefixOfPath=Wt.containsPath=Wt.getLookaheadPathsForOptionalProd=Wt.getLookaheadPathsForOr=Wt.lookAheadSequenceFromAlternatives=Wt.buildSingleAlternativeLookaheadFunction=Wt.buildAlternativesLookAheadFunc=Wt.buildLookaheadFuncForOptionalProd=Wt.buildLookaheadFuncForOr=Wt.getProdType=Wt.PROD_TYPE=void 0;var ir=Kt(),rq=Dd(),HIe=ay(),fy=_g(),LA=mn(),jIe=$g(),si;(function(r){r[r.OPTION=0]="OPTION",r[r.REPETITION=1]="REPETITION",r[r.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",r[r.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",r[r.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",r[r.ALTERNATION=5]="ALTERNATION"})(si=Wt.PROD_TYPE||(Wt.PROD_TYPE={}));function GIe(r){if(r instanceof LA.Option)return si.OPTION;if(r instanceof LA.Repetition)return si.REPETITION;if(r instanceof LA.RepetitionMandatory)return si.REPETITION_MANDATORY;if(r instanceof LA.RepetitionMandatoryWithSeparator)return si.REPETITION_MANDATORY_WITH_SEPARATOR;if(r instanceof LA.RepetitionWithSeparator)return si.REPETITION_WITH_SEPARATOR;if(r instanceof LA.Alternation)return si.ALTERNATION;throw Error("non exhaustive match")}Wt.getProdType=GIe;function YIe(r,e,t,i,n,s){var o=oq(r,e,t),a=Xv(o)?fy.tokenStructuredMatcherNoCategories:fy.tokenStructuredMatcher;return s(o,i,a,n)}Wt.buildLookaheadFuncForOr=YIe;function qIe(r,e,t,i,n,s){var o=aq(r,e,n,t),a=Xv(o)?fy.tokenStructuredMatcherNoCategories:fy.tokenStructuredMatcher;return s(o[0],a,i)}Wt.buildLookaheadFuncForOptionalProd=qIe;function JIe(r,e,t,i){var n=r.length,s=(0,ir.every)(r,function(l){return(0,ir.every)(l,function(c){return c.length===1})});if(e)return function(l){for(var c=(0,ir.map)(l,function(P){return P.GATE}),u=0;u{"use strict";var Zv=Jt&&Jt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Jt,"__esModule",{value:!0});Jt.checkPrefixAlternativesAmbiguities=Jt.validateSomeNonEmptyLookaheadPath=Jt.validateTooManyAlts=Jt.RepetionCollector=Jt.validateAmbiguousAlternationAlternatives=Jt.validateEmptyOrAlternative=Jt.getFirstNoneTerminal=Jt.validateNoLeftRecursion=Jt.validateRuleIsOverridden=Jt.validateRuleDoesNotAlreadyExist=Jt.OccurrenceValidationCollector=Jt.identifyProductionForDuplicates=Jt.validateGrammar=void 0;var _t=Kt(),Br=Kt(),No=Yn(),_v=xd(),tf=Rd(),ZIe=Dd(),eo=mn(),$v=$g();function _Ie(r,e,t,i,n){var s=_t.map(r,function(p){return $Ie(p,i)}),o=_t.map(r,function(p){return ex(p,p,i)}),a=[],l=[],c=[];(0,Br.every)(o,Br.isEmpty)&&(a=(0,Br.map)(r,function(p){return fq(p,i)}),l=(0,Br.map)(r,function(p){return hq(p,e,i)}),c=Cq(r,e,i));var u=rye(r,t,i),g=(0,Br.map)(r,function(p){return dq(p,i)}),h=(0,Br.map)(r,function(p){return gq(p,r,n,i)});return _t.flatten(s.concat(c,o,a,l,u,g,h))}Jt.validateGrammar=_Ie;function $Ie(r,e){var t=new uq;r.accept(t);var i=t.allProductions,n=_t.groupBy(i,lq),s=_t.pick(n,function(a){return a.length>1}),o=_t.map(_t.values(s),function(a){var l=_t.first(a),c=e.buildDuplicateFoundError(r,a),u=(0,_v.getProductionDslName)(l),g={message:c,type:No.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:r.name,dslName:u,occurrence:l.idx},h=cq(l);return h&&(g.parameter=h),g});return o}function lq(r){return(0,_v.getProductionDslName)(r)+"_#_"+r.idx+"_#_"+cq(r)}Jt.identifyProductionForDuplicates=lq;function cq(r){return r instanceof eo.Terminal?r.terminalType.name:r instanceof eo.NonTerminal?r.nonTerminalName:""}var uq=function(r){Zv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitNonTerminal=function(t){this.allProductions.push(t)},e.prototype.visitOption=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e.prototype.visitAlternation=function(t){this.allProductions.push(t)},e.prototype.visitTerminal=function(t){this.allProductions.push(t)},e}($v.GAstVisitor);Jt.OccurrenceValidationCollector=uq;function gq(r,e,t,i){var n=[],s=(0,Br.reduce)(e,function(a,l){return l.name===r.name?a+1:a},0);if(s>1){var o=i.buildDuplicateRuleNameError({topLevelRule:r,grammarName:t});n.push({message:o,type:No.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:r.name})}return n}Jt.validateRuleDoesNotAlreadyExist=gq;function eye(r,e,t){var i=[],n;return _t.contains(e,r)||(n="Invalid rule override, rule: ->"+r+"<- cannot be overridden in the grammar: ->"+t+"<-as it is not defined in any of the super grammars ",i.push({message:n,type:No.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:r})),i}Jt.validateRuleIsOverridden=eye;function ex(r,e,t,i){i===void 0&&(i=[]);var n=[],s=Fd(e.definition);if(_t.isEmpty(s))return[];var o=r.name,a=_t.contains(s,r);a&&n.push({message:t.buildLeftRecursionError({topLevelRule:r,leftRecursionPath:i}),type:No.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:o});var l=_t.difference(s,i.concat([r])),c=_t.map(l,function(u){var g=_t.cloneArr(i);return g.push(u),ex(r,u,t,g)});return n.concat(_t.flatten(c))}Jt.validateNoLeftRecursion=ex;function Fd(r){var e=[];if(_t.isEmpty(r))return e;var t=_t.first(r);if(t instanceof eo.NonTerminal)e.push(t.referencedRule);else if(t instanceof eo.Alternative||t instanceof eo.Option||t instanceof eo.RepetitionMandatory||t instanceof eo.RepetitionMandatoryWithSeparator||t instanceof eo.RepetitionWithSeparator||t instanceof eo.Repetition)e=e.concat(Fd(t.definition));else if(t instanceof eo.Alternation)e=_t.flatten(_t.map(t.definition,function(o){return Fd(o.definition)}));else if(!(t instanceof eo.Terminal))throw Error("non exhaustive match");var i=(0,_v.isOptionalProd)(t),n=r.length>1;if(i&&n){var s=_t.drop(r);return e.concat(Fd(s))}else return e}Jt.getFirstNoneTerminal=Fd;var tx=function(r){Zv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.alternations=[],t}return e.prototype.visitAlternation=function(t){this.alternations.push(t)},e}($v.GAstVisitor);function fq(r,e){var t=new tx;r.accept(t);var i=t.alternations,n=_t.reduce(i,function(s,o){var a=_t.dropRight(o.definition),l=_t.map(a,function(c,u){var g=(0,ZIe.nextPossibleTokensAfter)([c],[],null,1);return _t.isEmpty(g)?{message:e.buildEmptyAlternationError({topLevelRule:r,alternation:o,emptyChoiceIdx:u}),type:No.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:r.name,occurrence:o.idx,alternative:u+1}:null});return s.concat(_t.compact(l))},[]);return n}Jt.validateEmptyOrAlternative=fq;function hq(r,e,t){var i=new tx;r.accept(i);var n=i.alternations;n=(0,Br.reject)(n,function(o){return o.ignoreAmbiguities===!0});var s=_t.reduce(n,function(o,a){var l=a.idx,c=a.maxLookahead||e,u=(0,tf.getLookaheadPathsForOr)(l,r,c,a),g=tye(u,a,r,t),h=mq(u,a,r,t);return o.concat(g,h)},[]);return s}Jt.validateAmbiguousAlternationAlternatives=hq;var pq=function(r){Zv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e}($v.GAstVisitor);Jt.RepetionCollector=pq;function dq(r,e){var t=new tx;r.accept(t);var i=t.alternations,n=_t.reduce(i,function(s,o){return o.definition.length>255&&s.push({message:e.buildTooManyAlternativesError({topLevelRule:r,alternation:o}),type:No.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:r.name,occurrence:o.idx}),s},[]);return n}Jt.validateTooManyAlts=dq;function Cq(r,e,t){var i=[];return(0,Br.forEach)(r,function(n){var s=new pq;n.accept(s);var o=s.allProductions;(0,Br.forEach)(o,function(a){var l=(0,tf.getProdType)(a),c=a.maxLookahead||e,u=a.idx,g=(0,tf.getLookaheadPathsForOptionalProd)(u,n,l,c),h=g[0];if((0,Br.isEmpty)((0,Br.flatten)(h))){var p=t.buildEmptyRepetitionError({topLevelRule:n,repetition:a});i.push({message:p,type:No.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:n.name})}})}),i}Jt.validateSomeNonEmptyLookaheadPath=Cq;function tye(r,e,t,i){var n=[],s=(0,Br.reduce)(r,function(a,l,c){return e.definition[c].ignoreAmbiguities===!0||(0,Br.forEach)(l,function(u){var g=[c];(0,Br.forEach)(r,function(h,p){c!==p&&(0,tf.containsPath)(h,u)&&e.definition[p].ignoreAmbiguities!==!0&&g.push(p)}),g.length>1&&!(0,tf.containsPath)(n,u)&&(n.push(u),a.push({alts:g,path:u}))}),a},[]),o=_t.map(s,function(a){var l=(0,Br.map)(a.alts,function(u){return u+1}),c=i.buildAlternationAmbiguityError({topLevelRule:t,alternation:e,ambiguityIndices:l,prefixPath:a.path});return{message:c,type:No.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:t.name,occurrence:e.idx,alternatives:[a.alts]}});return o}function mq(r,e,t,i){var n=[],s=(0,Br.reduce)(r,function(o,a,l){var c=(0,Br.map)(a,function(u){return{idx:l,path:u}});return o.concat(c)},[]);return(0,Br.forEach)(s,function(o){var a=e.definition[o.idx];if(a.ignoreAmbiguities!==!0){var l=o.idx,c=o.path,u=(0,Br.findAll)(s,function(h){return e.definition[h.idx].ignoreAmbiguities!==!0&&h.idx{"use strict";Object.defineProperty(rf,"__esModule",{value:!0});rf.validateGrammar=rf.resolveGrammar=void 0;var ix=Kt(),iye=_Y(),nye=rx(),Eq=Pd();function sye(r){r=(0,ix.defaults)(r,{errMsgProvider:Eq.defaultGrammarResolverErrorProvider});var e={};return(0,ix.forEach)(r.rules,function(t){e[t.name]=t}),(0,iye.resolveGrammar)(e,r.errMsgProvider)}rf.resolveGrammar=sye;function oye(r){return r=(0,ix.defaults)(r,{errMsgProvider:Eq.defaultGrammarValidatorErrorProvider}),(0,nye.validateGrammar)(r.rules,r.maxLookahead,r.tokenTypes,r.errMsgProvider,r.grammarName)}rf.validateGrammar=oye});var nf=I(In=>{"use strict";var Nd=In&&In.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(In,"__esModule",{value:!0});In.EarlyExitException=In.NotAllInputParsedException=In.NoViableAltException=In.MismatchedTokenException=In.isRecognitionException=void 0;var aye=Kt(),yq="MismatchedTokenException",wq="NoViableAltException",Bq="EarlyExitException",Qq="NotAllInputParsedException",bq=[yq,wq,Bq,Qq];Object.freeze(bq);function Aye(r){return(0,aye.contains)(bq,r.name)}In.isRecognitionException=Aye;var hy=function(r){Nd(e,r);function e(t,i){var n=this.constructor,s=r.call(this,t)||this;return s.token=i,s.resyncedTokens=[],Object.setPrototypeOf(s,n.prototype),Error.captureStackTrace&&Error.captureStackTrace(s,s.constructor),s}return e}(Error),lye=function(r){Nd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=yq,s}return e}(hy);In.MismatchedTokenException=lye;var cye=function(r){Nd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=wq,s}return e}(hy);In.NoViableAltException=cye;var uye=function(r){Nd(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.name=Qq,n}return e}(hy);In.NotAllInputParsedException=uye;var gye=function(r){Nd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=Bq,s}return e}(hy);In.EarlyExitException=gye});var sx=I(Ki=>{"use strict";Object.defineProperty(Ki,"__esModule",{value:!0});Ki.attemptInRepetitionRecovery=Ki.Recoverable=Ki.InRuleRecoveryException=Ki.IN_RULE_RECOVERY_EXCEPTION=Ki.EOF_FOLLOW_KEY=void 0;var py=NA(),fs=Kt(),fye=nf(),hye=Jv(),pye=Yn();Ki.EOF_FOLLOW_KEY={};Ki.IN_RULE_RECOVERY_EXCEPTION="InRuleRecoveryException";function nx(r){this.name=Ki.IN_RULE_RECOVERY_EXCEPTION,this.message=r}Ki.InRuleRecoveryException=nx;nx.prototype=Error.prototype;var dye=function(){function r(){}return r.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,fs.has)(e,"recoveryEnabled")?e.recoveryEnabled:pye.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=Sq)},r.prototype.getTokenToInsert=function(e){var t=(0,py.createTokenInstance)(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return t.isInsertedInRecovery=!0,t},r.prototype.canTokenTypeBeInsertedInRecovery=function(e){return!0},r.prototype.tryInRepetitionRecovery=function(e,t,i,n){for(var s=this,o=this.findReSyncTokenType(),a=this.exportLexerState(),l=[],c=!1,u=this.LA(1),g=this.LA(1),h=function(){var p=s.LA(0),d=s.errorMessageProvider.buildMismatchTokenMessage({expected:n,actual:u,previous:p,ruleName:s.getCurrRuleFullName()}),m=new fye.MismatchedTokenException(d,u,s.LA(0));m.resyncedTokens=(0,fs.dropRight)(l),s.SAVE_ERROR(m)};!c;)if(this.tokenMatcher(g,n)){h();return}else if(i.call(this)){h(),e.apply(this,t);return}else this.tokenMatcher(g,o)?c=!0:(g=this.SKIP_TOKEN(),this.addToResyncTokens(g,l));this.importLexerState(a)},r.prototype.shouldInRepetitionRecoveryBeTried=function(e,t,i){return!(i===!1||e===void 0||t===void 0||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,t)))},r.prototype.getFollowsForInRuleRecovery=function(e,t){var i=this.getCurrentGrammarPath(e,t),n=this.getNextPossibleTokenTypes(i);return n},r.prototype.tryInRuleRecovery=function(e,t){if(this.canRecoverWithSingleTokenInsertion(e,t)){var i=this.getTokenToInsert(e);return i}if(this.canRecoverWithSingleTokenDeletion(e)){var n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new nx("sad sad panda")},r.prototype.canPerformInRuleRecovery=function(e,t){return this.canRecoverWithSingleTokenInsertion(e,t)||this.canRecoverWithSingleTokenDeletion(e)},r.prototype.canRecoverWithSingleTokenInsertion=function(e,t){var i=this;if(!this.canTokenTypeBeInsertedInRecovery(e)||(0,fs.isEmpty)(t))return!1;var n=this.LA(1),s=(0,fs.find)(t,function(o){return i.tokenMatcher(n,o)})!==void 0;return s},r.prototype.canRecoverWithSingleTokenDeletion=function(e){var t=this.tokenMatcher(this.LA(2),e);return t},r.prototype.isInCurrentRuleReSyncSet=function(e){var t=this.getCurrFollowKey(),i=this.getFollowSetFromFollowKey(t);return(0,fs.contains)(i,e)},r.prototype.findReSyncTokenType=function(){for(var e=this.flattenFollowSet(),t=this.LA(1),i=2;;){var n=t.tokenType;if((0,fs.contains)(e,n))return n;t=this.LA(i),i++}},r.prototype.getCurrFollowKey=function(){if(this.RULE_STACK.length===1)return Ki.EOF_FOLLOW_KEY;var e=this.getLastExplicitRuleShortName(),t=this.getLastExplicitRuleOccurrenceIndex(),i=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:t,inRule:this.shortRuleNameToFullName(i)}},r.prototype.buildFullFollowKeyStack=function(){var e=this,t=this.RULE_STACK,i=this.RULE_OCCURRENCE_STACK;return(0,fs.map)(t,function(n,s){return s===0?Ki.EOF_FOLLOW_KEY:{ruleName:e.shortRuleNameToFullName(n),idxInCallingRule:i[s],inRule:e.shortRuleNameToFullName(t[s-1])}})},r.prototype.flattenFollowSet=function(){var e=this,t=(0,fs.map)(this.buildFullFollowKeyStack(),function(i){return e.getFollowSetFromFollowKey(i)});return(0,fs.flatten)(t)},r.prototype.getFollowSetFromFollowKey=function(e){if(e===Ki.EOF_FOLLOW_KEY)return[py.EOF];var t=e.ruleName+e.idxInCallingRule+hye.IN+e.inRule;return this.resyncFollows[t]},r.prototype.addToResyncTokens=function(e,t){return this.tokenMatcher(e,py.EOF)||t.push(e),t},r.prototype.reSyncTo=function(e){for(var t=[],i=this.LA(1);this.tokenMatcher(i,e)===!1;)i=this.SKIP_TOKEN(),this.addToResyncTokens(i,t);return(0,fs.dropRight)(t)},r.prototype.attemptInRepetitionRecovery=function(e,t,i,n,s,o,a){},r.prototype.getCurrentGrammarPath=function(e,t){var i=this.getHumanReadableRuleStack(),n=(0,fs.cloneArr)(this.RULE_OCCURRENCE_STACK),s={ruleStack:i,occurrenceStack:n,lastTok:e,lastTokOccurrence:t};return s},r.prototype.getHumanReadableRuleStack=function(){var e=this;return(0,fs.map)(this.RULE_STACK,function(t){return e.shortRuleNameToFullName(t)})},r}();Ki.Recoverable=dye;function Sq(r,e,t,i,n,s,o){var a=this.getKeyForAutomaticLookahead(i,n),l=this.firstAfterRepMap[a];if(l===void 0){var c=this.getCurrRuleFullName(),u=this.getGAstProductions()[c],g=new s(u,n);l=g.startWalking(),this.firstAfterRepMap[a]=l}var h=l.token,p=l.occurrence,d=l.isEndOfRule;this.RULE_STACK.length===1&&d&&h===void 0&&(h=py.EOF,p=1),this.shouldInRepetitionRecoveryBeTried(h,p,o)&&this.tryInRepetitionRecovery(r,e,t,h)}Ki.attemptInRepetitionRecovery=Sq});var dy=I(Gt=>{"use strict";Object.defineProperty(Gt,"__esModule",{value:!0});Gt.getKeyForAutomaticLookahead=Gt.AT_LEAST_ONE_SEP_IDX=Gt.MANY_SEP_IDX=Gt.AT_LEAST_ONE_IDX=Gt.MANY_IDX=Gt.OPTION_IDX=Gt.OR_IDX=Gt.BITS_FOR_ALT_IDX=Gt.BITS_FOR_RULE_IDX=Gt.BITS_FOR_OCCURRENCE_IDX=Gt.BITS_FOR_METHOD_TYPE=void 0;Gt.BITS_FOR_METHOD_TYPE=4;Gt.BITS_FOR_OCCURRENCE_IDX=8;Gt.BITS_FOR_RULE_IDX=12;Gt.BITS_FOR_ALT_IDX=8;Gt.OR_IDX=1<{"use strict";Object.defineProperty(Cy,"__esModule",{value:!0});Cy.LooksAhead=void 0;var Ra=Rd(),to=Kt(),vq=Yn(),Fa=dy(),yc=xd(),mye=function(){function r(){}return r.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=(0,to.has)(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:vq.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,to.has)(e,"maxLookahead")?e.maxLookahead:vq.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=(0,to.isES2015MapSupported)()?new Map:[],(0,to.isES2015MapSupported)()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},r.prototype.preComputeLookaheadFunctions=function(e){var t=this;(0,to.forEach)(e,function(i){t.TRACE_INIT(i.name+" Rule Lookahead",function(){var n=(0,yc.collectMethods)(i),s=n.alternation,o=n.repetition,a=n.option,l=n.repetitionMandatory,c=n.repetitionMandatoryWithSeparator,u=n.repetitionWithSeparator;(0,to.forEach)(s,function(g){var h=g.idx===0?"":g.idx;t.TRACE_INIT(""+(0,yc.getProductionDslName)(g)+h,function(){var p=(0,Ra.buildLookaheadFuncForOr)(g.idx,i,g.maxLookahead||t.maxLookahead,g.hasPredicates,t.dynamicTokensEnabled,t.lookAheadBuilderForAlternatives),d=(0,Fa.getKeyForAutomaticLookahead)(t.fullRuleNameToShort[i.name],Fa.OR_IDX,g.idx);t.setLaFuncCache(d,p)})}),(0,to.forEach)(o,function(g){t.computeLookaheadFunc(i,g.idx,Fa.MANY_IDX,Ra.PROD_TYPE.REPETITION,g.maxLookahead,(0,yc.getProductionDslName)(g))}),(0,to.forEach)(a,function(g){t.computeLookaheadFunc(i,g.idx,Fa.OPTION_IDX,Ra.PROD_TYPE.OPTION,g.maxLookahead,(0,yc.getProductionDslName)(g))}),(0,to.forEach)(l,function(g){t.computeLookaheadFunc(i,g.idx,Fa.AT_LEAST_ONE_IDX,Ra.PROD_TYPE.REPETITION_MANDATORY,g.maxLookahead,(0,yc.getProductionDslName)(g))}),(0,to.forEach)(c,function(g){t.computeLookaheadFunc(i,g.idx,Fa.AT_LEAST_ONE_SEP_IDX,Ra.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,g.maxLookahead,(0,yc.getProductionDslName)(g))}),(0,to.forEach)(u,function(g){t.computeLookaheadFunc(i,g.idx,Fa.MANY_SEP_IDX,Ra.PROD_TYPE.REPETITION_WITH_SEPARATOR,g.maxLookahead,(0,yc.getProductionDslName)(g))})})})},r.prototype.computeLookaheadFunc=function(e,t,i,n,s,o){var a=this;this.TRACE_INIT(""+o+(t===0?"":t),function(){var l=(0,Ra.buildLookaheadFuncForOptionalProd)(t,e,s||a.maxLookahead,a.dynamicTokensEnabled,n,a.lookAheadBuilderForOptional),c=(0,Fa.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[e.name],i,t);a.setLaFuncCache(c,l)})},r.prototype.lookAheadBuilderForOptional=function(e,t,i){return(0,Ra.buildSingleAlternativeLookaheadFunction)(e,t,i)},r.prototype.lookAheadBuilderForAlternatives=function(e,t,i,n){return(0,Ra.buildAlternativesLookAheadFunc)(e,t,i,n)},r.prototype.getKeyForAutomaticLookahead=function(e,t){var i=this.getLastExplicitRuleShortName();return(0,Fa.getKeyForAutomaticLookahead)(i,e,t)},r.prototype.getLaFuncFromCache=function(e){},r.prototype.getLaFuncFromMap=function(e){return this.lookAheadFuncsCache.get(e)},r.prototype.getLaFuncFromObj=function(e){return this.lookAheadFuncsCache[e]},r.prototype.setLaFuncCache=function(e,t){},r.prototype.setLaFuncCacheUsingMap=function(e,t){this.lookAheadFuncsCache.set(e,t)},r.prototype.setLaFuncUsingObj=function(e,t){this.lookAheadFuncsCache[e]=t},r}();Cy.LooksAhead=mye});var Pq=I(To=>{"use strict";Object.defineProperty(To,"__esModule",{value:!0});To.addNoneTerminalToCst=To.addTerminalToCst=To.setNodeLocationFull=To.setNodeLocationOnlyOffset=void 0;function Eye(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset,r.endOffset=e.endOffset):r.endOffset{"use strict";Object.defineProperty(OA,"__esModule",{value:!0});OA.defineNameProp=OA.functionName=OA.classNameFromInstance=void 0;var Bye=Kt();function Qye(r){return Dq(r.constructor)}OA.classNameFromInstance=Qye;var kq="name";function Dq(r){var e=r.name;return e||"anonymous"}OA.functionName=Dq;function bye(r,e){var t=Object.getOwnPropertyDescriptor(r,kq);return(0,Bye.isUndefined)(t)||t.configurable?(Object.defineProperty(r,kq,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}OA.defineNameProp=bye});var Lq=I(vi=>{"use strict";Object.defineProperty(vi,"__esModule",{value:!0});vi.validateRedundantMethods=vi.validateMissingCstMethods=vi.validateVisitor=vi.CstVisitorDefinitionError=vi.createBaseVisitorConstructorWithDefaults=vi.createBaseSemanticVisitorConstructor=vi.defaultVisit=void 0;var hs=Kt(),Td=ox();function Rq(r,e){for(var t=(0,hs.keys)(r),i=t.length,n=0;n: + `+(""+s.join(` + +`).replace(/\n/g,` + `)))}}};return t.prototype=i,t.prototype.constructor=t,t._RULE_NAMES=e,t}vi.createBaseSemanticVisitorConstructor=Sye;function vye(r,e,t){var i=function(){};(0,Td.defineNameProp)(i,r+"BaseSemanticsWithDefaults");var n=Object.create(t.prototype);return(0,hs.forEach)(e,function(s){n[s]=Rq}),i.prototype=n,i.prototype.constructor=i,i}vi.createBaseVisitorConstructorWithDefaults=vye;var ax;(function(r){r[r.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",r[r.MISSING_METHOD=1]="MISSING_METHOD"})(ax=vi.CstVisitorDefinitionError||(vi.CstVisitorDefinitionError={}));function Fq(r,e){var t=Nq(r,e),i=Tq(r,e);return t.concat(i)}vi.validateVisitor=Fq;function Nq(r,e){var t=(0,hs.map)(e,function(i){if(!(0,hs.isFunction)(r[i]))return{msg:"Missing visitor method: <"+i+"> on "+(0,Td.functionName)(r.constructor)+" CST Visitor.",type:ax.MISSING_METHOD,methodName:i}});return(0,hs.compact)(t)}vi.validateMissingCstMethods=Nq;var xye=["constructor","visit","validateVisitor"];function Tq(r,e){var t=[];for(var i in r)(0,hs.isFunction)(r[i])&&!(0,hs.contains)(xye,i)&&!(0,hs.contains)(e,i)&&t.push({msg:"Redundant visitor method: <"+i+"> on "+(0,Td.functionName)(r.constructor)+` CST Visitor +There is no Grammar Rule corresponding to this method's name. +`,type:ax.REDUNDANT_METHOD,methodName:i});return t}vi.validateRedundantMethods=Tq});var Mq=I(my=>{"use strict";Object.defineProperty(my,"__esModule",{value:!0});my.TreeBuilder=void 0;var sf=Pq(),Xr=Kt(),Oq=Lq(),Pye=Yn(),kye=function(){function r(){}return r.prototype.initTreeBuilder=function(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,Xr.has)(e,"nodeLocationTracking")?e.nodeLocationTracking:Pye.DEFAULT_PARSER_CONFIG.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=Xr.NOOP,this.cstFinallyStateUpdate=Xr.NOOP,this.cstPostTerminal=Xr.NOOP,this.cstPostNonTerminal=Xr.NOOP,this.cstPostRule=Xr.NOOP;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=sf.setNodeLocationFull,this.setNodeLocationFromNode=sf.setNodeLocationFull,this.cstPostRule=Xr.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=Xr.NOOP,this.setNodeLocationFromNode=Xr.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=sf.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=sf.setNodeLocationOnlyOffset,this.cstPostRule=Xr.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=Xr.NOOP,this.setNodeLocationFromNode=Xr.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=Xr.NOOP,this.setNodeLocationFromNode=Xr.NOOP,this.cstPostRule=Xr.NOOP,this.setInitialNodeLocation=Xr.NOOP;else throw Error('Invalid config option: "'+e.nodeLocationTracking+'"')},r.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(e){e.location={startOffset:NaN,endOffset:NaN}},r.prototype.setInitialNodeLocationOnlyOffsetRegular=function(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},r.prototype.setInitialNodeLocationFullRecovery=function(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.setInitialNodeLocationFullRegular=function(e){var t=this.LA(1);e.location={startOffset:t.startOffset,startLine:t.startLine,startColumn:t.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.cstInvocationStateUpdate=function(e,t){var i={name:e,children:{}};this.setInitialNodeLocation(i),this.CST_STACK.push(i)},r.prototype.cstFinallyStateUpdate=function(){this.CST_STACK.pop()},r.prototype.cstPostRuleFull=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?(i.endOffset=t.endOffset,i.endLine=t.endLine,i.endColumn=t.endColumn):(i.startOffset=NaN,i.startLine=NaN,i.startColumn=NaN)},r.prototype.cstPostRuleOnlyOffset=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?i.endOffset=t.endOffset:i.startOffset=NaN},r.prototype.cstPostTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,sf.addTerminalToCst)(i,t,e),this.setNodeLocationFromToken(i.location,t)},r.prototype.cstPostNonTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,sf.addNoneTerminalToCst)(i,t,e),this.setNodeLocationFromNode(i.location,e.location)},r.prototype.getBaseCstVisitorConstructor=function(){if((0,Xr.isUndefined)(this.baseCstVisitorConstructor)){var e=(0,Oq.createBaseSemanticVisitorConstructor)(this.className,(0,Xr.keys)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor},r.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if((0,Xr.isUndefined)(this.baseCstVisitorWithDefaultsConstructor)){var e=(0,Oq.createBaseVisitorConstructorWithDefaults)(this.className,(0,Xr.keys)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor},r.prototype.getLastExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-1]},r.prototype.getPreviousExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-2]},r.prototype.getLastExplicitRuleOccurrenceIndex=function(){var e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]},r}();my.TreeBuilder=kye});var Uq=I(Ey=>{"use strict";Object.defineProperty(Ey,"__esModule",{value:!0});Ey.LexerAdapter=void 0;var Kq=Yn(),Dye=function(){function r(){}return r.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(r.prototype,"input",{get:function(){return this.tokVector},set:function(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length},enumerable:!1,configurable:!0}),r.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):Kq.END_OF_FILE},r.prototype.LA=function(e){var t=this.currIdx+e;return t<0||this.tokVectorLength<=t?Kq.END_OF_FILE:this.tokVector[t]},r.prototype.consumeToken=function(){this.currIdx++},r.prototype.exportLexerState=function(){return this.currIdx},r.prototype.importLexerState=function(e){this.currIdx=e},r.prototype.resetLexerState=function(){this.currIdx=-1},r.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},r.prototype.getLexerPosition=function(){return this.exportLexerState()},r}();Ey.LexerAdapter=Dye});var jq=I(Iy=>{"use strict";Object.defineProperty(Iy,"__esModule",{value:!0});Iy.RecognizerApi=void 0;var Hq=Kt(),Rye=nf(),Ax=Yn(),Fye=Pd(),Nye=rx(),Tye=mn(),Lye=function(){function r(){}return r.prototype.ACTION=function(e){return e.call(this)},r.prototype.consume=function(e,t,i){return this.consumeInternal(t,e,i)},r.prototype.subrule=function(e,t,i){return this.subruleInternal(t,e,i)},r.prototype.option=function(e,t){return this.optionInternal(t,e)},r.prototype.or=function(e,t){return this.orInternal(t,e)},r.prototype.many=function(e,t){return this.manyInternal(e,t)},r.prototype.atLeastOne=function(e,t){return this.atLeastOneInternal(e,t)},r.prototype.CONSUME=function(e,t){return this.consumeInternal(e,0,t)},r.prototype.CONSUME1=function(e,t){return this.consumeInternal(e,1,t)},r.prototype.CONSUME2=function(e,t){return this.consumeInternal(e,2,t)},r.prototype.CONSUME3=function(e,t){return this.consumeInternal(e,3,t)},r.prototype.CONSUME4=function(e,t){return this.consumeInternal(e,4,t)},r.prototype.CONSUME5=function(e,t){return this.consumeInternal(e,5,t)},r.prototype.CONSUME6=function(e,t){return this.consumeInternal(e,6,t)},r.prototype.CONSUME7=function(e,t){return this.consumeInternal(e,7,t)},r.prototype.CONSUME8=function(e,t){return this.consumeInternal(e,8,t)},r.prototype.CONSUME9=function(e,t){return this.consumeInternal(e,9,t)},r.prototype.SUBRULE=function(e,t){return this.subruleInternal(e,0,t)},r.prototype.SUBRULE1=function(e,t){return this.subruleInternal(e,1,t)},r.prototype.SUBRULE2=function(e,t){return this.subruleInternal(e,2,t)},r.prototype.SUBRULE3=function(e,t){return this.subruleInternal(e,3,t)},r.prototype.SUBRULE4=function(e,t){return this.subruleInternal(e,4,t)},r.prototype.SUBRULE5=function(e,t){return this.subruleInternal(e,5,t)},r.prototype.SUBRULE6=function(e,t){return this.subruleInternal(e,6,t)},r.prototype.SUBRULE7=function(e,t){return this.subruleInternal(e,7,t)},r.prototype.SUBRULE8=function(e,t){return this.subruleInternal(e,8,t)},r.prototype.SUBRULE9=function(e,t){return this.subruleInternal(e,9,t)},r.prototype.OPTION=function(e){return this.optionInternal(e,0)},r.prototype.OPTION1=function(e){return this.optionInternal(e,1)},r.prototype.OPTION2=function(e){return this.optionInternal(e,2)},r.prototype.OPTION3=function(e){return this.optionInternal(e,3)},r.prototype.OPTION4=function(e){return this.optionInternal(e,4)},r.prototype.OPTION5=function(e){return this.optionInternal(e,5)},r.prototype.OPTION6=function(e){return this.optionInternal(e,6)},r.prototype.OPTION7=function(e){return this.optionInternal(e,7)},r.prototype.OPTION8=function(e){return this.optionInternal(e,8)},r.prototype.OPTION9=function(e){return this.optionInternal(e,9)},r.prototype.OR=function(e){return this.orInternal(e,0)},r.prototype.OR1=function(e){return this.orInternal(e,1)},r.prototype.OR2=function(e){return this.orInternal(e,2)},r.prototype.OR3=function(e){return this.orInternal(e,3)},r.prototype.OR4=function(e){return this.orInternal(e,4)},r.prototype.OR5=function(e){return this.orInternal(e,5)},r.prototype.OR6=function(e){return this.orInternal(e,6)},r.prototype.OR7=function(e){return this.orInternal(e,7)},r.prototype.OR8=function(e){return this.orInternal(e,8)},r.prototype.OR9=function(e){return this.orInternal(e,9)},r.prototype.MANY=function(e){this.manyInternal(0,e)},r.prototype.MANY1=function(e){this.manyInternal(1,e)},r.prototype.MANY2=function(e){this.manyInternal(2,e)},r.prototype.MANY3=function(e){this.manyInternal(3,e)},r.prototype.MANY4=function(e){this.manyInternal(4,e)},r.prototype.MANY5=function(e){this.manyInternal(5,e)},r.prototype.MANY6=function(e){this.manyInternal(6,e)},r.prototype.MANY7=function(e){this.manyInternal(7,e)},r.prototype.MANY8=function(e){this.manyInternal(8,e)},r.prototype.MANY9=function(e){this.manyInternal(9,e)},r.prototype.MANY_SEP=function(e){this.manySepFirstInternal(0,e)},r.prototype.MANY_SEP1=function(e){this.manySepFirstInternal(1,e)},r.prototype.MANY_SEP2=function(e){this.manySepFirstInternal(2,e)},r.prototype.MANY_SEP3=function(e){this.manySepFirstInternal(3,e)},r.prototype.MANY_SEP4=function(e){this.manySepFirstInternal(4,e)},r.prototype.MANY_SEP5=function(e){this.manySepFirstInternal(5,e)},r.prototype.MANY_SEP6=function(e){this.manySepFirstInternal(6,e)},r.prototype.MANY_SEP7=function(e){this.manySepFirstInternal(7,e)},r.prototype.MANY_SEP8=function(e){this.manySepFirstInternal(8,e)},r.prototype.MANY_SEP9=function(e){this.manySepFirstInternal(9,e)},r.prototype.AT_LEAST_ONE=function(e){this.atLeastOneInternal(0,e)},r.prototype.AT_LEAST_ONE1=function(e){return this.atLeastOneInternal(1,e)},r.prototype.AT_LEAST_ONE2=function(e){this.atLeastOneInternal(2,e)},r.prototype.AT_LEAST_ONE3=function(e){this.atLeastOneInternal(3,e)},r.prototype.AT_LEAST_ONE4=function(e){this.atLeastOneInternal(4,e)},r.prototype.AT_LEAST_ONE5=function(e){this.atLeastOneInternal(5,e)},r.prototype.AT_LEAST_ONE6=function(e){this.atLeastOneInternal(6,e)},r.prototype.AT_LEAST_ONE7=function(e){this.atLeastOneInternal(7,e)},r.prototype.AT_LEAST_ONE8=function(e){this.atLeastOneInternal(8,e)},r.prototype.AT_LEAST_ONE9=function(e){this.atLeastOneInternal(9,e)},r.prototype.AT_LEAST_ONE_SEP=function(e){this.atLeastOneSepFirstInternal(0,e)},r.prototype.AT_LEAST_ONE_SEP1=function(e){this.atLeastOneSepFirstInternal(1,e)},r.prototype.AT_LEAST_ONE_SEP2=function(e){this.atLeastOneSepFirstInternal(2,e)},r.prototype.AT_LEAST_ONE_SEP3=function(e){this.atLeastOneSepFirstInternal(3,e)},r.prototype.AT_LEAST_ONE_SEP4=function(e){this.atLeastOneSepFirstInternal(4,e)},r.prototype.AT_LEAST_ONE_SEP5=function(e){this.atLeastOneSepFirstInternal(5,e)},r.prototype.AT_LEAST_ONE_SEP6=function(e){this.atLeastOneSepFirstInternal(6,e)},r.prototype.AT_LEAST_ONE_SEP7=function(e){this.atLeastOneSepFirstInternal(7,e)},r.prototype.AT_LEAST_ONE_SEP8=function(e){this.atLeastOneSepFirstInternal(8,e)},r.prototype.AT_LEAST_ONE_SEP9=function(e){this.atLeastOneSepFirstInternal(9,e)},r.prototype.RULE=function(e,t,i){if(i===void 0&&(i=Ax.DEFAULT_RULE_CONFIG),(0,Hq.contains)(this.definedRulesNames,e)){var n=Fye.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),s={message:n,type:Ax.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);var o=this.defineRule(e,t,i);return this[e]=o,o},r.prototype.OVERRIDE_RULE=function(e,t,i){i===void 0&&(i=Ax.DEFAULT_RULE_CONFIG);var n=[];n=n.concat((0,Nye.validateRuleIsOverridden)(e,this.definedRulesNames,this.className)),this.definitionErrors=this.definitionErrors.concat(n);var s=this.defineRule(e,t,i);return this[e]=s,s},r.prototype.BACKTRACK=function(e,t){return function(){this.isBackTrackingStack.push(1);var i=this.saveRecogState();try{return e.apply(this,t),!0}catch(n){if((0,Rye.isRecognitionException)(n))return!1;throw n}finally{this.reloadRecogState(i),this.isBackTrackingStack.pop()}}},r.prototype.getGAstProductions=function(){return this.gastProductionsCache},r.prototype.getSerializedGastProductions=function(){return(0,Tye.serializeGrammar)((0,Hq.values)(this.gastProductionsCache))},r}();Iy.RecognizerApi=Lye});var Jq=I(wy=>{"use strict";Object.defineProperty(wy,"__esModule",{value:!0});wy.RecognizerEngine=void 0;var xr=Kt(),qn=dy(),yy=nf(),Gq=Rd(),of=Dd(),Yq=Yn(),Oye=sx(),qq=NA(),Ld=_g(),Mye=ox(),Kye=function(){function r(){}return r.prototype.initRecognizerEngine=function(e,t){if(this.className=(0,Mye.classNameFromInstance)(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=Ld.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,xr.has)(t,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 + For Further details.`);if((0,xr.isArray)(e)){if((0,xr.isEmpty)(e))throw Error(`A Token Vocabulary cannot be empty. + Note that the first argument for the parser constructor + is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 + For Further details.`)}if((0,xr.isArray)(e))this.tokensMap=(0,xr.reduce)(e,function(o,a){return o[a.name]=a,o},{});else if((0,xr.has)(e,"modes")&&(0,xr.every)((0,xr.flatten)((0,xr.values)(e.modes)),Ld.isTokenType)){var i=(0,xr.flatten)((0,xr.values)(e.modes)),n=(0,xr.uniq)(i);this.tokensMap=(0,xr.reduce)(n,function(o,a){return o[a.name]=a,o},{})}else if((0,xr.isObject)(e))this.tokensMap=(0,xr.cloneObj)(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=qq.EOF;var s=(0,xr.every)((0,xr.values)(e),function(o){return(0,xr.isEmpty)(o.categoryMatches)});this.tokenMatcher=s?Ld.tokenStructuredMatcherNoCategories:Ld.tokenStructuredMatcher,(0,Ld.augmentTokenTypes)((0,xr.values)(this.tokensMap))},r.prototype.defineRule=function(e,t,i){if(this.selfAnalysisDone)throw Error("Grammar rule <"+e+`> may not be defined after the 'performSelfAnalysis' method has been called' +Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);var n=(0,xr.has)(i,"resyncEnabled")?i.resyncEnabled:Yq.DEFAULT_RULE_CONFIG.resyncEnabled,s=(0,xr.has)(i,"recoveryValueFunc")?i.recoveryValueFunc:Yq.DEFAULT_RULE_CONFIG.recoveryValueFunc,o=this.ruleShortNameIdx<t},r.prototype.orInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(qn.OR_IDX,t),n=(0,xr.isArray)(e)?e:e.DEF,s=this.getLaFuncFromCache(i),o=s.call(this,n);if(o!==void 0){var a=n[o];return a.ALT.call(this)}this.raiseNoAltException(t,e.ERR_MSG)},r.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){var e=this.LA(1),t=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new yy.NotAllInputParsedException(t,e))}},r.prototype.subruleInternal=function(e,t,i){var n;try{var s=i!==void 0?i.ARGS:void 0;return n=e.call(this,t,s),this.cstPostNonTerminal(n,i!==void 0&&i.LABEL!==void 0?i.LABEL:e.ruleName),n}catch(o){this.subruleInternalError(o,i,e.ruleName)}},r.prototype.subruleInternalError=function(e,t,i){throw(0,yy.isRecognitionException)(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,t!==void 0&&t.LABEL!==void 0?t.LABEL:i),delete e.partialCstResult),e},r.prototype.consumeInternal=function(e,t,i){var n;try{var s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),n=s):this.consumeInternalError(e,s,i)}catch(o){n=this.consumeInternalRecovery(e,t,o)}return this.cstPostTerminal(i!==void 0&&i.LABEL!==void 0?i.LABEL:e.name,n),n},r.prototype.consumeInternalError=function(e,t,i){var n,s=this.LA(0);throw i!==void 0&&i.ERR_MSG?n=i.ERR_MSG:n=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:t,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new yy.MismatchedTokenException(n,t,s))},r.prototype.consumeInternalRecovery=function(e,t,i){if(this.recoveryEnabled&&i.name==="MismatchedTokenException"&&!this.isBackTracking()){var n=this.getFollowsForInRuleRecovery(e,t);try{return this.tryInRuleRecovery(e,n)}catch(s){throw s.name===Oye.IN_RULE_RECOVERY_EXCEPTION?i:s}}else throw i},r.prototype.saveRecogState=function(){var e=this.errors,t=(0,xr.cloneArr)(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:t,CST_STACK:this.CST_STACK}},r.prototype.reloadRecogState=function(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK},r.prototype.ruleInvocationStateUpdate=function(e,t,i){this.RULE_OCCURRENCE_STACK.push(i),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(t,e)},r.prototype.isBackTracking=function(){return this.isBackTrackingStack.length!==0},r.prototype.getCurrRuleFullName=function(){var e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]},r.prototype.shortRuleNameToFullName=function(e){return this.shortRuleNameToFull[e]},r.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),qq.EOF)},r.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},r}();wy.RecognizerEngine=Kye});var zq=I(By=>{"use strict";Object.defineProperty(By,"__esModule",{value:!0});By.ErrorHandler=void 0;var lx=nf(),cx=Kt(),Wq=Rd(),Uye=Yn(),Hye=function(){function r(){}return r.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=(0,cx.has)(e,"errorMessageProvider")?e.errorMessageProvider:Uye.DEFAULT_PARSER_CONFIG.errorMessageProvider},r.prototype.SAVE_ERROR=function(e){if((0,lx.isRecognitionException)(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,cx.cloneArr)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")},Object.defineProperty(r.prototype,"errors",{get:function(){return(0,cx.cloneArr)(this._errors)},set:function(e){this._errors=e},enumerable:!1,configurable:!0}),r.prototype.raiseEarlyExitException=function(e,t,i){for(var n=this.getCurrRuleFullName(),s=this.getGAstProductions()[n],o=(0,Wq.getLookaheadPathsForOptionalProd)(e,s,t,this.maxLookahead),a=o[0],l=[],c=1;c<=this.maxLookahead;c++)l.push(this.LA(c));var u=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:a,actual:l,previous:this.LA(0),customUserDescription:i,ruleName:n});throw this.SAVE_ERROR(new lx.EarlyExitException(u,this.LA(1),this.LA(0)))},r.prototype.raiseNoAltException=function(e,t){for(var i=this.getCurrRuleFullName(),n=this.getGAstProductions()[i],s=(0,Wq.getLookaheadPathsForOr)(e,n,this.maxLookahead),o=[],a=1;a<=this.maxLookahead;a++)o.push(this.LA(a));var l=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:o,previous:l,customUserDescription:t,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new lx.NoViableAltException(c,this.LA(1),l))},r}();By.ErrorHandler=Hye});var Zq=I(Qy=>{"use strict";Object.defineProperty(Qy,"__esModule",{value:!0});Qy.ContentAssist=void 0;var Vq=Dd(),Xq=Kt(),jye=function(){function r(){}return r.prototype.initContentAssist=function(){},r.prototype.computeContentAssist=function(e,t){var i=this.gastProductionsCache[e];if((0,Xq.isUndefined)(i))throw Error("Rule ->"+e+"<- does not exist in this grammar.");return(0,Vq.nextPossibleTokensAfter)([i],t,this.tokenMatcher,this.maxLookahead)},r.prototype.getNextPossibleTokenTypes=function(e){var t=(0,Xq.first)(e.ruleStack),i=this.getGAstProductions(),n=i[t],s=new Vq.NextAfterTokenWalker(n,e).startWalking();return s},r}();Qy.ContentAssist=jye});var sJ=I(vy=>{"use strict";Object.defineProperty(vy,"__esModule",{value:!0});vy.GastRecorder=void 0;var yn=Kt(),Lo=mn(),Gye=Qd(),tJ=_g(),rJ=NA(),Yye=Yn(),qye=dy(),Sy={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(Sy);var _q=!0,$q=Math.pow(2,qye.BITS_FOR_OCCURRENCE_IDX)-1,iJ=(0,rJ.createToken)({name:"RECORDING_PHASE_TOKEN",pattern:Gye.Lexer.NA});(0,tJ.augmentTokenTypes)([iJ]);var nJ=(0,rJ.createTokenInstance)(iJ,`This IToken indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(nJ);var Jye={name:`This CSTNode indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},Wye=function(){function r(){}return r.prototype.initGastRecorder=function(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1},r.prototype.enableRecording=function(){var e=this;this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",function(){for(var t=function(n){var s=n>0?n:"";e["CONSUME"+s]=function(o,a){return this.consumeInternalRecord(o,n,a)},e["SUBRULE"+s]=function(o,a){return this.subruleInternalRecord(o,n,a)},e["OPTION"+s]=function(o){return this.optionInternalRecord(o,n)},e["OR"+s]=function(o){return this.orInternalRecord(o,n)},e["MANY"+s]=function(o){this.manyInternalRecord(n,o)},e["MANY_SEP"+s]=function(o){this.manySepFirstInternalRecord(n,o)},e["AT_LEAST_ONE"+s]=function(o){this.atLeastOneInternalRecord(n,o)},e["AT_LEAST_ONE_SEP"+s]=function(o){this.atLeastOneSepFirstInternalRecord(n,o)}},i=0;i<10;i++)t(i);e.consume=function(n,s,o){return this.consumeInternalRecord(s,n,o)},e.subrule=function(n,s,o){return this.subruleInternalRecord(s,n,o)},e.option=function(n,s){return this.optionInternalRecord(s,n)},e.or=function(n,s){return this.orInternalRecord(s,n)},e.many=function(n,s){this.manyInternalRecord(n,s)},e.atLeastOne=function(n,s){this.atLeastOneInternalRecord(n,s)},e.ACTION=e.ACTION_RECORD,e.BACKTRACK=e.BACKTRACK_RECORD,e.LA=e.LA_RECORD})},r.prototype.disableRecording=function(){var e=this;this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",function(){for(var t=0;t<10;t++){var i=t>0?t:"";delete e["CONSUME"+i],delete e["SUBRULE"+i],delete e["OPTION"+i],delete e["OR"+i],delete e["MANY"+i],delete e["MANY_SEP"+i],delete e["AT_LEAST_ONE"+i],delete e["AT_LEAST_ONE_SEP"+i]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},r.prototype.ACTION_RECORD=function(e){},r.prototype.BACKTRACK_RECORD=function(e,t){return function(){return!0}},r.prototype.LA_RECORD=function(e){return Yye.END_OF_FILE},r.prototype.topLevelRuleRecord=function(e,t){try{var i=new Lo.Rule({definition:[],name:e});return i.name=e,this.recordingProdStack.push(i),t.call(this),this.recordingProdStack.pop(),i}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` + This error was thrown during the "grammar recording phase" For more info see: + https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch{throw n}throw n}},r.prototype.optionInternalRecord=function(e,t){return Od.call(this,Lo.Option,e,t)},r.prototype.atLeastOneInternalRecord=function(e,t){Od.call(this,Lo.RepetitionMandatory,t,e)},r.prototype.atLeastOneSepFirstInternalRecord=function(e,t){Od.call(this,Lo.RepetitionMandatoryWithSeparator,t,e,_q)},r.prototype.manyInternalRecord=function(e,t){Od.call(this,Lo.Repetition,t,e)},r.prototype.manySepFirstInternalRecord=function(e,t){Od.call(this,Lo.RepetitionWithSeparator,t,e,_q)},r.prototype.orInternalRecord=function(e,t){return zye.call(this,e,t)},r.prototype.subruleInternalRecord=function(e,t,i){if(by(t),!e||(0,yn.has)(e,"ruleName")===!1){var n=new Error(" argument is invalid"+(" expecting a Parser method reference but got: <"+JSON.stringify(e)+">")+(` + inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,yn.peek)(this.recordingProdStack),o=e.ruleName,a=new Lo.NonTerminal({idx:t,nonTerminalName:o,label:i==null?void 0:i.LABEL,referencedRule:void 0});return s.definition.push(a),this.outputCst?Jye:Sy},r.prototype.consumeInternalRecord=function(e,t,i){if(by(t),!(0,tJ.hasShortKeyProperty)(e)){var n=new Error(" argument is invalid"+(" expecting a TokenType reference but got: <"+JSON.stringify(e)+">")+(` + inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,yn.peek)(this.recordingProdStack),o=new Lo.Terminal({idx:t,terminalType:e,label:i==null?void 0:i.LABEL});return s.definition.push(o),nJ},r}();vy.GastRecorder=Wye;function Od(r,e,t,i){i===void 0&&(i=!1),by(t);var n=(0,yn.peek)(this.recordingProdStack),s=(0,yn.isFunction)(e)?e:e.DEF,o=new r({definition:[],idx:t});return i&&(o.separator=e.SEP),(0,yn.has)(e,"MAX_LOOKAHEAD")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),s.call(this),n.definition.push(o),this.recordingProdStack.pop(),Sy}function zye(r,e){var t=this;by(e);var i=(0,yn.peek)(this.recordingProdStack),n=(0,yn.isArray)(r)===!1,s=n===!1?r:r.DEF,o=new Lo.Alternation({definition:[],idx:e,ignoreAmbiguities:n&&r.IGNORE_AMBIGUITIES===!0});(0,yn.has)(r,"MAX_LOOKAHEAD")&&(o.maxLookahead=r.MAX_LOOKAHEAD);var a=(0,yn.some)(s,function(l){return(0,yn.isFunction)(l.GATE)});return o.hasPredicates=a,i.definition.push(o),(0,yn.forEach)(s,function(l){var c=new Lo.Alternative({definition:[]});o.definition.push(c),(0,yn.has)(l,"IGNORE_AMBIGUITIES")?c.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:(0,yn.has)(l,"GATE")&&(c.ignoreAmbiguities=!0),t.recordingProdStack.push(c),l.ALT.call(t),t.recordingProdStack.pop()}),Sy}function eJ(r){return r===0?"":""+r}function by(r){if(r<0||r>$q){var e=new Error("Invalid DSL Method idx value: <"+r+`> + `+("Idx value must be a none negative value smaller than "+($q+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var aJ=I(xy=>{"use strict";Object.defineProperty(xy,"__esModule",{value:!0});xy.PerformanceTracer=void 0;var oJ=Kt(),Vye=Yn(),Xye=function(){function r(){}return r.prototype.initPerformanceTracer=function(e){if((0,oJ.has)(e,"traceInitPerf")){var t=e.traceInitPerf,i=typeof t=="number";this.traceInitMaxIdent=i?t:1/0,this.traceInitPerf=i?t>0:t}else this.traceInitMaxIdent=0,this.traceInitPerf=Vye.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},r.prototype.TRACE_INIT=function(e,t){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <"+e+">");var n=(0,oJ.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r}();xy.PerformanceTracer=Xye});var AJ=I(Py=>{"use strict";Object.defineProperty(Py,"__esModule",{value:!0});Py.applyMixins=void 0;function Zye(r,e){e.forEach(function(t){var i=t.prototype;Object.getOwnPropertyNames(i).forEach(function(n){if(n!=="constructor"){var s=Object.getOwnPropertyDescriptor(i,n);s&&(s.get||s.set)?Object.defineProperty(r.prototype,n,s):r.prototype[n]=t.prototype[n]}})})}Py.applyMixins=Zye});var Yn=I(hr=>{"use strict";var uJ=hr&&hr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(hr,"__esModule",{value:!0});hr.EmbeddedActionsParser=hr.CstParser=hr.Parser=hr.EMPTY_ALT=hr.ParserDefinitionErrorType=hr.DEFAULT_RULE_CONFIG=hr.DEFAULT_PARSER_CONFIG=hr.END_OF_FILE=void 0;var $i=Kt(),_ye=zY(),lJ=NA(),gJ=Pd(),cJ=Iq(),$ye=sx(),ewe=xq(),twe=Mq(),rwe=Uq(),iwe=jq(),nwe=Jq(),swe=zq(),owe=Zq(),awe=sJ(),Awe=aJ(),lwe=AJ();hr.END_OF_FILE=(0,lJ.createTokenInstance)(lJ.EOF,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(hr.END_OF_FILE);hr.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:gJ.defaultParserErrorProvider,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1});hr.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var cwe;(function(r){r[r.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",r[r.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",r[r.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",r[r.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",r[r.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",r[r.LEFT_RECURSION=5]="LEFT_RECURSION",r[r.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",r[r.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",r[r.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",r[r.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",r[r.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",r[r.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",r[r.TOO_MANY_ALTS=12]="TOO_MANY_ALTS"})(cwe=hr.ParserDefinitionErrorType||(hr.ParserDefinitionErrorType={}));function uwe(r){return r===void 0&&(r=void 0),function(){return r}}hr.EMPTY_ALT=uwe;var ky=function(){function r(e,t){this.definitionErrors=[],this.selfAnalysisDone=!1;var i=this;if(i.initErrorHandler(t),i.initLexerAdapter(),i.initLooksAhead(t),i.initRecognizerEngine(e,t),i.initRecoverable(t),i.initTreeBuilder(t),i.initContentAssist(),i.initGastRecorder(t),i.initPerformanceTracer(t),(0,$i.has)(t,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. + Please use the flag on the relevant DSL method instead. + See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES + For further details.`);this.skipValidations=(0,$i.has)(t,"skipValidations")?t.skipValidations:hr.DEFAULT_PARSER_CONFIG.skipValidations}return r.performSelfAnalysis=function(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")},r.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT("performSelfAnalysis",function(){var t;e.selfAnalysisDone=!0;var i=e.className;e.TRACE_INIT("toFastProps",function(){(0,$i.toFastProperties)(e)}),e.TRACE_INIT("Grammar Recording",function(){try{e.enableRecording(),(0,$i.forEach)(e.definedRulesNames,function(s){var o=e[s],a=o.originalGrammarAction,l=void 0;e.TRACE_INIT(s+" Rule",function(){l=e.topLevelRuleRecord(s,a)}),e.gastProductionsCache[s]=l})}finally{e.disableRecording()}});var n=[];if(e.TRACE_INIT("Grammar Resolving",function(){n=(0,cJ.resolveGrammar)({rules:(0,$i.values)(e.gastProductionsCache)}),e.definitionErrors=e.definitionErrors.concat(n)}),e.TRACE_INIT("Grammar Validations",function(){if((0,$i.isEmpty)(n)&&e.skipValidations===!1){var s=(0,cJ.validateGrammar)({rules:(0,$i.values)(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:(0,$i.values)(e.tokensMap),errMsgProvider:gJ.defaultGrammarValidatorErrorProvider,grammarName:i});e.definitionErrors=e.definitionErrors.concat(s)}}),(0,$i.isEmpty)(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT("computeAllProdsFollows",function(){var s=(0,_ye.computeAllProdsFollows)((0,$i.values)(e.gastProductionsCache));e.resyncFollows=s}),e.TRACE_INIT("ComputeLookaheadFunctions",function(){e.preComputeLookaheadFunctions((0,$i.values)(e.gastProductionsCache))})),!r.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,$i.isEmpty)(e.definitionErrors))throw t=(0,$i.map)(e.definitionErrors,function(s){return s.message}),new Error(`Parser Definition Errors detected: + `+t.join(` +------------------------------- +`))})},r.DEFER_DEFINITION_ERRORS_HANDLING=!1,r}();hr.Parser=ky;(0,lwe.applyMixins)(ky,[$ye.Recoverable,ewe.LooksAhead,twe.TreeBuilder,rwe.LexerAdapter,nwe.RecognizerEngine,iwe.RecognizerApi,swe.ErrorHandler,owe.ContentAssist,awe.GastRecorder,Awe.PerformanceTracer]);var gwe=function(r){uJ(e,r);function e(t,i){i===void 0&&(i=hr.DEFAULT_PARSER_CONFIG);var n=this,s=(0,$i.cloneObj)(i);return s.outputCst=!0,n=r.call(this,t,s)||this,n}return e}(ky);hr.CstParser=gwe;var fwe=function(r){uJ(e,r);function e(t,i){i===void 0&&(i=hr.DEFAULT_PARSER_CONFIG);var n=this,s=(0,$i.cloneObj)(i);return s.outputCst=!1,n=r.call(this,t,s)||this,n}return e}(ky);hr.EmbeddedActionsParser=fwe});var hJ=I(Dy=>{"use strict";Object.defineProperty(Dy,"__esModule",{value:!0});Dy.createSyntaxDiagramsCode=void 0;var fJ=kv();function hwe(r,e){var t=e===void 0?{}:e,i=t.resourceBase,n=i===void 0?"https://unpkg.com/chevrotain@"+fJ.VERSION+"/diagrams/":i,s=t.css,o=s===void 0?"https://unpkg.com/chevrotain@"+fJ.VERSION+"/diagrams/diagrams.css":s,a=` + + + + + +`,l=` + +`,c=` + + + + + +
+ + + + + diff --git a/core/debug-app/src/log.ts b/core/debug-app/src/log.ts new file mode 100644 index 000000000..0cdd754d9 --- /dev/null +++ b/core/debug-app/src/log.ts @@ -0,0 +1,9 @@ +import { dlog, dlogError } from '@river-build/dlog' + +export const logInfo = dlog('csb:debug-app:info') + +export const logError = dlogError('csb:debug-app:error') + +export function testLogError(e: any) { + logError('testLogError', 123, e, 'more text') +} diff --git a/core/debug-app/tsconfig.json b/core/debug-app/tsconfig.json new file mode 100644 index 000000000..d0aec8fb6 --- /dev/null +++ b/core/debug-app/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "./../tsconfig.base.json", + "compilerOptions": { + "rootDir": "./src" /* Specify the root folder within your source files. */, + "outDir": "./dist" /* Specify an output folder for all emitted files. */, + "noEmit": true, + "jsx": "react", + "lib": ["dom", "dom.iterable", "esnext"], + "types": ["vite/client"] + }, + "include": ["./src/**/*"] +} diff --git a/core/debug-app/vite.config.ts b/core/debug-app/vite.config.ts new file mode 100644 index 000000000..6fd9a3cf2 --- /dev/null +++ b/core/debug-app/vite.config.ts @@ -0,0 +1,38 @@ +import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin' +import react from '@vitejs/plugin-react' +import { defineConfig } from 'vite' +import checker from 'vite-plugin-checker' +import tsconfigPaths from 'vite-tsconfig-paths' +//import eslintPlugin from 'vite-plugin-eslint' +import { visualizer } from 'rollup-plugin-visualizer' +import polyfillNode from 'rollup-plugin-polyfill-node' +import path from 'path' + +// https://vitejs.dev/config/ +export default defineConfig({ + root: 'src', + build: { + outDir: path.resolve(__dirname, 'dist'), + }, + // resolve: { + // alias: { + // 'package-b': path.resolve(__dirname, 'packages/package-b/src'), + // }, + // }, + plugins: [ + polyfillNode(), + react(), + tsconfigPaths(), + checker({ typescript: true }), + //eslintPlugin(), + vanillaExtractPlugin(), + visualizer({ filename: 'dist/stats.html' }), + ], + server: { + port: 3002, + hmr: { + overlay: false, + }, + open: false, + }, +}) diff --git a/core/dlog/.eslintrc.json b/core/dlog/.eslintrc.json new file mode 100644 index 000000000..b5114a8fc --- /dev/null +++ b/core/dlog/.eslintrc.json @@ -0,0 +1,67 @@ +{ + "root": true, + "extends": [ + "eslint:recommended", + "plugin:import/recommended", + "plugin:import/typescript", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + "plugin:prettier/recommended", + "plugin:jest/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { "project": ["./tsconfig.eslint.json"] }, + "plugins": ["@typescript-eslint", "import"], + "ignorePatterns": ["dist/**", ".turbo/**", "node_modules/**", "jest.config.ts"], + "rules": { + "import/no-extraneous-dependencies": [ + "error", + { + "packageDir": "." + } + ], + "@typescript-eslint/require-await": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unsafe-assignment": "off", + "@typescript-eslint/no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_", + "destructuredArrayIgnorePattern": "^_" + } + ], + "@typescript-eslint/restrict-template-expressions": [ + "error", + { + "allowNever": true, + "allowBoolean": true, + "allowNumber": true, + "allowAny": true, + "allowNullish": true + } + ], + "@typescript-eslint/no-empty-function": [ + "error", + { + "allow": ["arrowFunctions"] + } + ], + + "@typescript-eslint/ban-ts-comment": "off" + }, + "overrides": [ + { + "files": ["**/*.test.*"], + "rules": { + "jest/no-standalone-expect": "off", + "jest/expect-expect": "off", + "jest/no-conditional-expect": "off", + "jest/no-disabled-tests": "off", + "@typescript-eslint/no-unsafe-call": "off", + "@typescript-eslint/no-floating-promises": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-unsafe-argument": "off" + } + } + ] +} diff --git a/core/dlog/README.md b/core/dlog/README.md new file mode 100644 index 000000000..544f5add6 --- /dev/null +++ b/core/dlog/README.md @@ -0,0 +1 @@ +# Debug functions like logging diff --git a/core/dlog/jest.config.ts b/core/dlog/jest.config.ts new file mode 100644 index 000000000..5a87260cd --- /dev/null +++ b/core/dlog/jest.config.ts @@ -0,0 +1,28 @@ +import type { JestConfigWithTsJest } from 'ts-jest' + +const config: JestConfigWithTsJest = { + preset: 'ts-jest/presets/default-esm', + testEnvironment: './../jest.env.ts', + verbose: true, + testTimeout: 60000, + modulePathIgnorePatterns: ['/dist/'], + testPathIgnorePatterns: ['/dist/', '/node_modules/'], + setupFilesAfterEnv: ['jest-extended/all'], + extensionsToTreatAsEsm: ['.ts'], + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + useESM: true, + }, + ], + }, + moduleNameMapper: { + '(.+)\\.js': '$1', + }, + collectCoverage: true, + coverageProvider: 'v8', + coverageReporters: ['json', 'html'], +} + +export default config diff --git a/core/dlog/package.json b/core/dlog/package.json new file mode 100644 index 000000000..c6a65d18f --- /dev/null +++ b/core/dlog/package.json @@ -0,0 +1,43 @@ +{ + "name": "@river-build/dlog", + "packageManager": "yarn@3.8.0", + "type": "module", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc", + "cb": "yarn clean && yarn build", + "clean": "rm -rf dist", + "lint": "yarn eslint --format unix ./src", + "lint:fix": "yarn lint --fix", + "my-jest": "yarn node -r ../../scripts/node-no-warn.js --experimental-vm-modules $(yarn bin jest)", + "test": "yarn my-jest", + "test:ci": "yarn test", + "test:debug": "DEBUG=test yarn my-jest", + "watch": "tsc --watch" + }, + "dependencies": { + "@bufbuild/protobuf": "^1.4.1", + "@river-build/proto": "workspace:^", + "browser-or-node": "^2.1.1", + "debug": "^4.3.4", + "ethereum-cryptography": "^1.2.0" + }, + "devDependencies": { + "@types/jest": "^29.5.3", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", + "eslint": "^8.53.0", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jest": "^27.2.3", + "jest": "^29.6.2", + "jest-extended": "^4.0.1", + "ts-jest": "^29.1.1", + "ts-node": "^10.9.1", + "typescript": "^5.1.6" + }, + "files": [ + "/dist" + ] +} diff --git a/core/dlog/src/binary.ts b/core/dlog/src/binary.ts new file mode 100644 index 000000000..874a51a62 --- /dev/null +++ b/core/dlog/src/binary.ts @@ -0,0 +1,62 @@ +import { protoBase64 } from '@bufbuild/protobuf' +import { + bytesToHex, + bytesToUtf8, + equalsBytes, + hexToBytes, + utf8ToBytes, +} from 'ethereum-cryptography/utils' + +export function bin_fromBase64(base64String: string): Uint8Array { + return protoBase64.dec(base64String) +} + +export function bin_toBase64(uint8Array: Uint8Array): string { + return protoBase64.enc(uint8Array) +} + +export function bin_fromHexString(hexString: string): Uint8Array { + return hexToBytes(hexString) +} + +export function bin_toHexString(uint8Array: Uint8Array): string { + return bytesToHex(uint8Array) +} + +export function bin_fromString(str: string): Uint8Array { + return utf8ToBytes(str) +} + +export function bin_toString(buf: Uint8Array): string { + return bytesToUtf8(buf) +} + +export function shortenHexString(s: string): string { + if (s.startsWith('0x')) { + return s.length > 12 ? s.slice(0, 6) + '..' + s.slice(-4) : s + } else { + return s.length > 10 ? s.slice(0, 4) + '..' + s.slice(-4) : s + } +} + +export function isHexString(value: string): boolean { + if (value.length === 0 || (value.length & 1) !== 0) { + return false + } + return /^(0x)?[0-9a-fA-F]+$/.test(value) +} + +export function bin_equal( + a: Uint8Array | null | undefined, + b: Uint8Array | null | undefined, +): boolean { + if ( + (a === undefined || a === null || a.length === 0) && + (b === undefined || b === null || b.length === 0) + ) { + return true + } else if (a === undefined || a === null || b === undefined || b === null) { + return false + } + return equalsBytes(a, b) +} diff --git a/core/dlog/src/check.ts b/core/dlog/src/check.ts new file mode 100644 index 000000000..da5496ef9 --- /dev/null +++ b/core/dlog/src/check.ts @@ -0,0 +1,33 @@ +import { Err } from '@river-build/proto' +import { dlogError } from './dlog' + +const log = dlogError('csb:error') + +export class CodeException extends Error { + code: number + data?: any + constructor(message: string, code: number, data?: any) { + super(message) + this.code = code + this.data = data + } +} + +export function throwWithCode(message?: string, code?: Err, data?: any): never { + const e = new CodeException(message ?? 'Unknown', code ?? Err.ERR_UNSPECIFIED, data) + log('throwWithCode', e.message, e.stack) + throw e +} + +/** + * If not value, throws JSON RPC error with numberic error code, which is transmitted to the client. + * @param value The value to check + * @param message Error message to use if value is not valid + * @param code JSON RPC error code to use if value is not valid + * @param data Optional data to include in the error + */ +export function check(value: boolean, message?: string, code?: Err, data?: any): asserts value { + if (!value) { + throwWithCode(message, code, data) + } +} diff --git a/core/dlog/src/dlog.ts b/core/dlog/src/dlog.ts new file mode 100644 index 000000000..d8d417bd5 --- /dev/null +++ b/core/dlog/src/dlog.ts @@ -0,0 +1,239 @@ +import { bin_toHexString, isHexString, shortenHexString } from './binary' +import debug, { Debugger } from 'debug' + +import { isJest } from './utils' + +// Works as debug.enabled, but falls back on options if not explicitly set in env instead of returning false. +debug.enabled = (ns: string): boolean => { + if (ns.length > 0 && ns[ns.length - 1] === '*') { + return true + } + + for (const s of debug.skips) { + if (s.test(ns)) { + return false + } + } + + for (const s of debug.names) { + if (s.test(ns)) { + return true + } + } + + const opts = allDlogs.get(ns)?.opts + if (opts !== undefined) { + if (!opts.allowJest && isJest()) { + return false + } else { + return opts.defaultEnabled ?? false + } + } + + return false +} + +// Set namespaces to empty string if not set so debug.enabled() is called and can retireve defaultEnabled from options. +// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access +if ((debug as any).namespaces === undefined) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + ;(debug as any).namespaces = '' +} + +const MAX_CALL_STACK_SZ = 18 + +const hasOwnProperty = (obj: object, prop: Y): obj is Record => { + return Object.prototype.hasOwnProperty.call(obj, prop) +} + +export const cloneAndFormat = (obj: unknown, opts?: { shortenHex?: boolean }): unknown => { + return _cloneAndFormat(obj, 0, new WeakSet(), opts?.shortenHex === true) +} + +const _cloneAndFormat = ( + obj: unknown, + depth: number, + seen: WeakSet, + shorten: boolean, +): unknown => { + if (depth > MAX_CALL_STACK_SZ) { + return 'MAX_CALL_STACK_SZ exceeded' + } + + if (typeof obj === 'object' && obj !== null) { + if (seen.has(obj)) { + return '[circular reference]' + } + seen.add(obj) + } + + if (typeof obj === 'string') { + return isHexString(obj) && shorten ? shortenHexString(obj) : obj + } + + if (obj instanceof Uint8Array) { + return shorten ? shortenHexString(bin_toHexString(obj)) : bin_toHexString(obj) + } + + if (obj instanceof BigInt || typeof obj === 'bigint') { + return obj.toString() + } + + if (Array.isArray(obj)) { + return obj.map((e) => _cloneAndFormat(e, depth + 1, seen, shorten)) + } + + if (typeof obj === 'object' && obj !== null) { + if (obj instanceof Error) { + return obj.stack || obj.message + } + + if (typeof (obj as Iterable)[Symbol.iterator] === 'function') { + // Iterate over values of Map, Set, etc. + const newObj = [] + for (const e of obj as any) { + newObj.push(_cloneAndFormat(e, depth + 1, seen, shorten)) + } + return newObj + } + + const newObj: Record = {} + for (const key in obj) { + if (hasOwnProperty(obj, key)) { + let newKey = key + if (typeof key === 'string' && isHexString(key) && shorten) { + newKey = shortenHexString(key) + } + if (key == 'emitter') { + newObj[newKey] = '[emitter]' + } else { + newObj[newKey] = _cloneAndFormat(obj[key], depth + 1, seen, shorten) + } + } + } + return newObj + } + + return obj +} + +export interface DLogger { + (...args: unknown[]): void + + enabled: boolean + namespace: string + extend: (namespace: string, delimiter?: string) => DLogger + baseDebug: Debugger + opts?: DLogOpts +} + +export interface DLogOpts { + // If true, logger is enabled by default, unless explicitly disabled by DEBUG=-logger_name. + defaultEnabled?: boolean + + // If true, defaultEnabled is used under jest. Otherwise defaults to false. + allowJest?: boolean + + // If true, binds to console.error so callstack is printed. + printStack?: boolean +} + +const allDlogs: Map = new Map() + +const makeDlog = (d: Debugger, opts?: DLogOpts): DLogger => { + if (opts?.printStack) { + // eslint-disable-next-line no-console + d.log = console.error.bind(console) + } + + const dlog = (...args: unknown[]): void => { + if (!d.enabled || args.length === 0) { + return + } + + const fmt: string[] = [] + const newArgs: unknown[] = [] + const tailArgs: unknown[] = [] + + for (let i = 0; i < args.length; i++) { + let c = args[i] + + if (typeof c === 'string') { + fmt.push('%s ') + if (isHexString(c)) { + c = shortenHexString(c) + } + newArgs.push(c) + } else if (typeof c === 'object' && c !== null) { + if (c instanceof Error) { + tailArgs.push('\n') + tailArgs.push(c) + } else { + fmt.push('%O\n') + newArgs.push(cloneAndFormat(c, { shortenHex: true })) + } + } else { + fmt.push('%O ') + newArgs.push(c) + } + } + + d(fmt.join(''), ...newArgs, ...tailArgs) + } + + dlog.baseDebug = d + dlog.namespace = d.namespace + dlog.opts = opts + + dlog.extend = (sub: string, delimiter?: string): DLogger => { + return makeDlog(d.extend(sub, delimiter), opts) + } + + Object.defineProperty(dlog, 'enabled', { + enumerable: true, + configurable: false, + get: () => d.enabled, + set: (v: boolean) => (d.enabled = v), + }) + + allDlogs.set(d.namespace, dlog as DLogger) + return dlog as DLogger +} + +/** + * Create a new logger with namespace `ns`. + * It's based on the `debug` package logger with custom formatter: + * All aguments are formatted, hex strings and UInt8Arrays are printer as hex and shortened. + * No %-specifiers are supported. + * + * @param ns Namespace for the logger. + * @returns New logger with namespace `ns`. + */ +export const dlog = (ns: string, opts?: DLogOpts): DLogger => { + return makeDlog(debug(ns), opts) +} + +/** + * Same as dlog, but logger is bound to console.error so clicking on it expands log site callstack (in addition to printed error callstack). + * Also, logger is enabled by default, except if running in jest. + * + * @param ns Namespace for the logger. + * @returns New logger with namespace `ns`. + */ +export const dlogError = (ns: string): DLogger => { + const l = makeDlog(debug(ns), { defaultEnabled: true, printStack: true }) + return l +} + +/** + * Create complex logger with multiple levels + * @param ns Namespace for the logger. + * @returns New logger with log/info/error namespace `ns`. + */ +export const dlogger = (ns: string): { log: DLogger; info: DLogger; error: DLogger } => { + return { + log: makeDlog(debug(ns + ':log')), + info: makeDlog(debug(ns + ':info'), { defaultEnabled: true, allowJest: true }), + error: dlogError(ns + ':error'), + } +} diff --git a/core/dlog/src/index.ts b/core/dlog/src/index.ts new file mode 100644 index 000000000..0e70e8d29 --- /dev/null +++ b/core/dlog/src/index.ts @@ -0,0 +1,4 @@ +export * from './binary' +export * from './check' +export * from './dlog' +export * from './utils' diff --git a/core/dlog/src/tests/binary.test.ts b/core/dlog/src/tests/binary.test.ts new file mode 100644 index 000000000..6909bddca --- /dev/null +++ b/core/dlog/src/tests/binary.test.ts @@ -0,0 +1,53 @@ +/** + * @group main + */ + +import { bin_fromBase64, bin_fromHexString, isHexString } from '../binary' + +describe('types', () => { + test('bin_fromHexString', () => { + const expected = new Uint8Array([1, 35, 69, 103, 137, 171, 205, 239]) + expect(bin_fromHexString('0123456789abcdef')).toEqual(expected) + expect(bin_fromHexString('0123456789ABCDEF')).toEqual(expected) + expect(bin_fromHexString('0x0123456789abcdef')).toEqual(expected) + expect(bin_fromHexString('')).toEqual(new Uint8Array([])) + expect(bin_fromHexString('0x')).toEqual(new Uint8Array([])) + expect(bin_fromHexString('00')).toEqual(new Uint8Array([0])) + expect(bin_fromHexString('01')).toEqual(new Uint8Array([1])) + expect(bin_fromHexString('0a')).toEqual(new Uint8Array([10])) + expect(bin_fromHexString('0000')).toEqual(new Uint8Array([0, 0])) + expect(bin_fromHexString('0001')).toEqual(new Uint8Array([0, 1])) + + expect(() => bin_fromHexString('0')).toThrow() + expect(() => bin_fromHexString('0x0')).toThrow() + expect(() => bin_fromHexString('001')).toThrow() + expect(() => bin_fromHexString('11223')).toThrow() + }) + + test('bin_fromBase64String', () => { + const expected = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9]) + const expected2 = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9]) + expect(bin_fromBase64('AQIDBAUGBwgJ')).toEqual(expected) + expect(bin_fromBase64('AQIDBAUGBwgJAQIDBAUGBwgJ')).toEqual(expected2) + expect(bin_fromBase64('')).toEqual(new Uint8Array([])) + expect(bin_fromBase64('AA==')).toEqual(new Uint8Array([0])) + }) + + test('isHexString', () => { + expect(isHexString('0123456789abcdef')).toBeTruthy() + expect(isHexString('0123456789ABCDEF')).toBeTruthy() + expect(isHexString('0x0123456789abcdef')).toBeTruthy() + expect(isHexString('00')).toBeTruthy() + expect(isHexString('01')).toBeTruthy() + expect(isHexString('0a')).toBeTruthy() + expect(isHexString('0000')).toBeTruthy() + expect(isHexString('0001')).toBeTruthy() + + expect(isHexString('')).toBeFalsy() + expect(isHexString('0x')).toBeFalsy() + expect(isHexString('0')).toBeFalsy() + expect(isHexString('0x0')).toBeFalsy() + expect(isHexString('001')).toBeFalsy() + expect(isHexString('11223')).toBeFalsy() + }) +}) diff --git a/core/dlog/src/tests/dlog.test.ts b/core/dlog/src/tests/dlog.test.ts new file mode 100644 index 000000000..a3021d7d9 --- /dev/null +++ b/core/dlog/src/tests/dlog.test.ts @@ -0,0 +1,214 @@ +/** + * @group main + */ + +import { dlog, dlogError } from '../dlog' +import debug from 'debug' +import { bin_fromHexString } from '../binary' + +describe('dlogTest', () => { + test('basic', () => { + const longHex = bin_fromHexString('0102030405060708090a0b0c0d0e0f101112131415161718191a') + const obj = { + a: 1, + b: 'b', + c: { + d: 2, + e: 'e', + }, + d: [1, 2, 3], + q: new Uint8Array([1, 2, 3]), + longHex, + nested: { + a: 1, + more: { + even_more: { + more_yet: { + z: 1000, + }, + }, + }, + }, + } + const log = dlog('test:dlog') + log(obj) + log('\n\n\n') + + log('obj =', obj) + log('\n\n\n') + + log('b', 'q', obj, obj, 'end') + log('\n\n\n') + + log(obj, obj) + log('\n\n\n') + + log('obj =', obj, 'obj =', obj) + log('\n\n\n') + + log(longHex) + log('\n\n\n') + + log('longHex =', longHex) + log('\n\n\n') + log('shortenedHexKey =', { '0x0102030405060708090a0b0c0d0e0f101112131415161718191a': true }) + log('shortenedHexValue =', '0x0102030405060708090a0b0c0d0e0f101112131415161718191a') + log('shortenedHexValue =', { + key: '0x0102030405060708090a0b0c0d0e0f101112131415161718191a', + }) + }) + + test('extend', () => { + const base_log = dlog('test:dlog') + const log = base_log.extend('extend') + log('extend') + log(22) + log('33 =', 33) + log('gonna print more', '44 =', 44) + }) + + test('enabled1', () => { + const log = dlog('test:dlog') + if (log.enabled) { + log('enabled', log.enabled) + + log.enabled = false + + log('(should not print)', log.enabled) + + log.enabled = true + + log('enabled', log.enabled) + } + }) + + test('circularReference', () => { + const log = dlog('test:dlog') + class A { + b: B + constructor() { + this.b = new B(this) + } + } + class B { + a: A + constructor(a: A) { + this.a = a + } + } + const a = new A() + log('test circular:', { a }) + }) + + test('numbers', () => { + const log = dlog('test:dlog') + log('test same number:', { a: 1, b: 1, c: 1, d: 2 }) + }) + + test('error', () => { + const log = dlogError('test:dlog:error') + log('test same number:', { a: 1, b: 1, c: 1, d: 2 }) + log(new Error('test error')) + + function funcThatThrows() { + throw new Error('test error 2') + } + + try { + funcThatThrows() + } catch (e) { + log(e) + } + + try { + funcThatThrows() + } catch (e) { + log('test error 3', e, 123, 'more text') + } + }) + + test('set', () => { + const s = new Set([111, 222, { aaa: 333 }]) + dlog('test:dlog')(s) + + const log = dlog('test:dlog') + log.enabled = true + + let output: string = '' + log.baseDebug.log = (...args: any[]) => { + for (const arg of args) { + output += `${arg}` + } + } + + log(s) + expect(output).toContain('111') + expect(output).toContain('222') + expect(output).toContain('333') + expect(output).toContain('aaa') + }) + + test('map', () => { + const s = new Map([ + ['aaa', 111], + ['bbb', 222], + ['ccc', { a: 333 }], + ]) + dlog('test:dlog')(s) + + const log = dlog('test:dlog') + log.enabled = true + + let output: string = '' + log.baseDebug.log = (...args: any[]) => { + for (const arg of args) { + output += `${arg}` + } + } + + log(s) + expect(output).toContain('111') + expect(output).toContain('aaa') + expect(output).toContain('222') + expect(output).toContain('bbb') + expect(output).toContain('333') + expect(output).toContain('ccc') + }) + + test('enabled2', () => { + const ns = 'uniqueLogName' + + // Override + let log = dlog(ns) + expect(log.enabled).toBeFalsy() + log.enabled = true + expect(log.enabled).toBeTruthy() + log.enabled = false + expect(log.enabled).toBeFalsy() + + // Default + log = dlog(ns, { defaultEnabled: true, allowJest: true }) + expect(log.enabled).toBeTruthy() + log.enabled = false + expect(log.enabled).toBeFalsy() + + // Default under Jest + log = dlog(ns, { defaultEnabled: true }) + expect(log.enabled).toBeFalsy() + log.enabled = true + expect(log.enabled).toBeTruthy() + + // Enabled explicitly by settings + debug.enable(ns) + log = dlog(ns) + expect(log.enabled).toBeTruthy() + + // Disabled explicitly by settings + debug.enable('-' + ns) + expect(log.enabled).toBeFalsy() + + // Disabled explicitly by settings, default ignored + log = dlog(ns, { defaultEnabled: true, allowJest: true }) + expect(log.enabled).toBeFalsy() + }) +}) diff --git a/core/dlog/src/utils.ts b/core/dlog/src/utils.ts new file mode 100644 index 000000000..4e32c9e1f --- /dev/null +++ b/core/dlog/src/utils.ts @@ -0,0 +1,9 @@ +import { isNode } from 'browser-or-node' + +export function isNodeEnv(): boolean { + return isNode +} + +export function isJest(): boolean { + return isNode && (process.env.NODE_ENV === 'test' || process.env.JEST_WORKER_ID !== undefined) +} diff --git a/core/dlog/tsconfig.eslint.json b/core/dlog/tsconfig.eslint.json new file mode 100644 index 000000000..b65f24ed5 --- /dev/null +++ b/core/dlog/tsconfig.eslint.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/**/*", "jest.config.ts", "jest-setup.ts", "tests/**/*"] +} diff --git a/core/dlog/tsconfig.json b/core/dlog/tsconfig.json new file mode 100644 index 000000000..edf37ecdb --- /dev/null +++ b/core/dlog/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "./../tsconfig.base.json", + "compilerOptions": { + "rootDir": "./src" /* Specify the root folder within your source files. */, + "outDir": "./dist" /* Specify an output folder for all emitted files. */ + }, + "include": ["src/**/*"] +} diff --git a/core/docker-compose.yml b/core/docker-compose.yml new file mode 100644 index 000000000..9348f8724 --- /dev/null +++ b/core/docker-compose.yml @@ -0,0 +1,34 @@ +services: + river-node: + # image: public.ecr.aws/h5v6m2x1/river:latest + build: + dockerfile: ./Dockerfile + volumes: + - ./local_xchain_node_logs:/riveruser/xchain_node/logs + - ./local_stream_node_logs:/riveruser/stream_node/logs + environment: + - BASECHAIN__CHAINID=31337 + - STORAGE_TYPE=postgres + - DATABASE__USER=postgres + - DATABASE__DATABASE=river + - DATABASE__PASSWORD=postgres + - DATABASE__EXTRA=?sslmode=disable&pool_max_conns=1000 + - DATABASE__HOST=host.docker.internal + - DATABASE__PORT=5433 + - LOG__FORMAT=json + - LOG__NOCOLOR=true + - MODE=multi-node + - ARCHITECTCONTRACT__VERSION=v3 + - METRICS__ENABLED=false + - PERFORMANCETRACKING__TRACINGENABLED=false + - PERFORMANCETRACKING__PROFILINGENABLED=false + - SKIP_GENKEY=true + - LOG__LEVEL=debug + - PORT=5001 + - USEBLOCKCHAINSTREAMREGISTRY=true + - BASECHAIN__NETWORKURL=http://host.docker.internal:8545 + - RIVERCHAIN__NETWORKURL=http://host.docker.internal:8546 + - WALLETPRIVATEKEY=51e02cbb807a535b05ae02f15cc3cbf73950e61d6dde55b3a77ad2be8815147c + - ARCHITECTCONTRACT__ADDRESS=0x2552FcE4D398492E4fd063e6aA77186e5c6d0EF1 + - REGISTRYCONTRACT__ADDRESS=0x531Faa70a60e151d20395E0E4ce9A32FB767Ca00 + - ENTITLEMENT_CONTRACT__ADDRESS=0x2bdCC0de6bE1f7D2ee689a0342D76F52E8EFABa3 diff --git a/core/jest.env.ts b/core/jest.env.ts new file mode 100644 index 000000000..8526d8bab --- /dev/null +++ b/core/jest.env.ts @@ -0,0 +1,16 @@ +import JSDOMEnvironment from 'jest-environment-jsdom' + +export default class JSDOMEnvironmentWithBuffer extends JSDOMEnvironment { + constructor(...args: any[]) { + // @ts-ignore + super(...args) + // JSDOMEnvironment patches global.Buffer, but doesn't + // patch global.Uint8Array, leading to inconsistency and + // test failures since Buffer should be an instance of Uint8Array. + this.global.Uint8Array = Uint8Array + this.global.TextEncoder = TextEncoder + this.global.TextDecoder = TextDecoder + this.global.fetch = fetch + this.global.ReadableStream = ReadableStream + } +} diff --git a/core/jest.matchers.ts b/core/jest.matchers.ts new file mode 100644 index 000000000..ce8904281 --- /dev/null +++ b/core/jest.matchers.ts @@ -0,0 +1,64 @@ +expect.extend({ + async toResolve(receivedPromise) { + const { printReceived, matcherHint } = this.utils + try { + const result = await receivedPromise + return { + pass: true, + message: () => + this.isNot + ? matcherHint('.not.toResolve', 'promise', '') + + '\n\nbut it resolved with:\n\n' + + printReceived(result) + : '', + } + } catch (e) { + const msg = !this.isNot + ? matcherHint('.toResolve', 'promise', '') + + '\n\nbut it rejected with:\n\n' + + printReceived(e) + : '' + if (!this.isNot && e instanceof Error) { + // Rethrow Error to get nice formatted call stack. + e.message = msg + throw e + } else { + return { + pass: false, + message: () => msg, + } + } + } + }, + + async toReject(receivedPromise) { + const { printReceived, matcherHint } = this.utils + try { + const result = await receivedPromise + return { + pass: false, + message: () => + !this.isNot + ? matcherHint('.toReject', 'promise', '') + + '\n\nbut it resolved with:\n\n' + + printReceived(result) + : '', + } + } catch (e) { + const msg = this.isNot + ? matcherHint('.not.toReject', 'promise', '') + + '\n\nbut it rejected with:\n\n' + + printReceived(e) + : '' + if (this.isNot && e instanceof Error) { + // Rethrow Error to get nice formatted call stack. + e.message = msg + throw e + } + return { + pass: true, + message: () => msg, + } + } + }, +}) diff --git a/core/node/.dockerignore b/core/node/.dockerignore new file mode 100644 index 000000000..3de0b85a7 --- /dev/null +++ b/core/node/.dockerignore @@ -0,0 +1 @@ +run_files \ No newline at end of file diff --git a/core/node/.gitignore b/core/node/.gitignore new file mode 100644 index 000000000..381f009dc --- /dev/null +++ b/core/node/.gitignore @@ -0,0 +1,4 @@ +# ignore local debugging files +dev-entitlements.yaml +wallet/ +node/__debug_bin* diff --git a/core/node/.golangci.yml b/core/node/.golangci.yml new file mode 100644 index 000000000..a0956b647 --- /dev/null +++ b/core/node/.golangci.yml @@ -0,0 +1,7 @@ +linters-settings: + exhaustive: + check-switch: true + +linters: + enable: + - exhaustive diff --git a/core/node/.mockery.yaml b/core/node/.mockery.yaml new file mode 100644 index 000000000..d5faa7590 --- /dev/null +++ b/core/node/.mockery.yaml @@ -0,0 +1,15 @@ +quiet: False +disable-version-string: True +with-expecter: False +dir: "testutils/mocks" +filename: "mock_{{.InterfaceNameSnake}}.go" +outpkg: "mocks" +packages: + github.com/river-build/river/core/node/nodes: + interfaces: + NodeRegistry: + StreamRegistry: + github.com/river-build/river/core/node/protocol/protocolconnect: + interfaces: + StreamServiceClient: + diff --git a/core/node/.vscode/launch.json b/core/node/.vscode/launch.json new file mode 100644 index 000000000..edc1db0d9 --- /dev/null +++ b/core/node/.vscode/launch.json @@ -0,0 +1,26 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch River server (entitlement)", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}/node/main.go", + "args": ["run"], + "cwd": "${workspaceFolder}/run_files/single/00" + }, + { + "name": "Launch River server (no entitlements)", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}/node/main.go", + "args": ["run"], + "cwd": "${workspaceFolder}/run_files/single_ne/00" + } + ] +} diff --git a/core/node/README.md b/core/node/README.md new file mode 100644 index 000000000..0a343f9cf --- /dev/null +++ b/core/node/README.md @@ -0,0 +1,111 @@ +# Installing proto compiler + + brew install protobuf + +# Installing Buf and other tools + +Run + + ./scripts/install-protobuf-deps.sh + +or manually: + + go install github.com/bufbuild/buf/cmd/buf@latest + go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest + go install google.golang.org/protobuf/cmd/protoc-gen-go@latest + go install connectrpc.com/connect/cmd/protoc-gen-connect-go@latest + go install honnef.co/go/tools/cmd/staticcheck@latest + go install mvdan.cc/gofumpt@latest + go install github.com/segmentio/golines@latest + +Connect install docs: https://connect.build/docs/go/getting-started/#install-tools + +# Generate proto definitions + + go generate -v -x protocol/gen.go + +# Lint + + brew install golangci-lint + ./lint.sh + +# Creating a new migration + +Install migrate cli tool with brew: + + brew install golang-migrate + +To create new sql migration files, see the documentation [here](https://github.com/golang-migrate/migrate/blob/master/GETTING_STARTED.md). As an example: + +`cd core/node && migrate create -ext sql -dir storage/migrations -seq create_miniblock_candidates_table` + +As the docs describe, note the tool will create 2 migration files, one to apply the migration and one to undo it. Please use "IF EXISTS" to prevent errors for creation and deletion of objects. + +To run migrations locally in the public schema for hand testing/experimentation, try: + +`migrate -source file://./core/node/storage/migrations/ -database "postgres://postgres:postgres@localhost:5433/river?sslmode=disable" up` + +[Postgres Examples](https://github.com/golang-migrate/migrate/blob/master/database/postgres/TUTORIAL.md) + +# Tests & Docker + +If you get Docker errors when running tests: + + sudo ln -s ~/Library/Containers/com.docker.docker/Data/docker.raw.sock /var/run/docker.sock + +## Tests from source against geth node + +- Start a local geth instance with the following command (this mines a new block every second): + +``` +geth --dev --http --dev.period 1 +``` + +- Generate fund account from which accounts that are dynamically generated during the tests are funded. +- Because this account is only used for tests the easiest method is to generate it on `https://vanity-eth.tk` (bottom of page). +- Fund the account with the following script (replace `to` with the fund account address): + +``` +geth --dev attach -exec 'eth.sendTransaction({from: eth.accounts[0], to: "", value: web3.toWei(10000000000000000, "ether")})' +``` + +- Run the tests with (replace `RIVER_REMOTE_NODE_FUND_PRIVATE_KEY` with the private key of the fund account) + +``` +RIVER_REMOTE_NODE_URL=http://127.0.0.1:8545 RIVER_REMOTE_NODE_FUND_PRIVATE_KEY= \ +go tests ./... +``` + +Block production is not on demand as with the simulator or anvil and therefore these tests take a long time. + +# Code Conventions + +See [conventions](conventions.md) + +# Other Tools + +You need jq to run the run_multi.sh script + + brew install jq + +# Debugging Tests + +Logs are turned off by default in tests. To enable set `RIVER_TEST_LOG` variable to the desired logging level: + + # Run all test in rpc with info logging level + RIVER_TEST_LOG=info go test ./rpc -v + + # Run single test by name with debug logging on + RIVER_TEST_LOG=debug go test ./rpc -v -run TestSingleAndMulti/multi/testMethods + +# Checking on Gamma Status from Local Host + +Run + + ./env/gamma/run.sh info + +Browse to http://localhost:4040/debug/multi to see status and ping times as seen from the local machine. + +Or, to get JSON on the console: + + ./env/gamma/run.sh ping diff --git a/core/node/auth/architect.go b/core/node/auth/architect.go new file mode 100644 index 000000000..f664487ed --- /dev/null +++ b/core/node/auth/architect.go @@ -0,0 +1,74 @@ +package auth + +import ( + "context" + "math/big" + "time" + + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/contracts/base" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/infra" + . "github.com/river-build/river/core/node/protocol" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + . "github.com/river-build/river/core/node/base" +) + +type Architect interface { + GetTokenIdBySpace(opts *bind.CallOpts, spaceId common.Address) (*big.Int, error) +} + +type architectProxy struct { + contract *base.Architect + address common.Address + ctx context.Context +} + +var GetTokenIdBySpaceCalls = infra.NewSuccessMetrics("architect_calls", contractCalls) + +func NewArchitect(ctx context.Context, cfg *config.ContractConfig, backend bind.ContractBackend) (Architect, error) { + // var c Architect + c, err := base.NewArchitect(cfg.Address, backend) + if err != nil { + return nil, WrapRiverError( + Err_CANNOT_CONNECT, + err, + ).Tags("address", cfg.Address, "version", cfg.Version). + Func("NewArchitect"). + Message("Failed to initialize contract") + } + return &architectProxy{ + contract: c, + address: cfg.Address, + ctx: ctx, + }, nil +} + +func (proxy *architectProxy) GetTokenIdBySpace(opts *bind.CallOpts, spaceId common.Address) (*big.Int, error) { + log := dlog.FromCtx(proxy.ctx) + start := time.Now() + defer infra.StoreExecutionTimeMetrics("GetTokenIdBySpace", infra.CONTRACT_CALLS_CATEGORY, start) + log.Debug("GetTokenIdBySpace", "address", proxy.address, "networkId", spaceId) + result, err := proxy.contract.GetTokenIdBySpace(opts, spaceId) + if err != nil { + log.Error("GetTokenIdBySpace", "address", proxy.address, "networkId", spaceId, "error", err) + GetTokenIdBySpaceCalls.FailInc() + return nil, WrapRiverError(Err_CANNOT_CALL_CONTRACT, err) + } + GetTokenIdBySpaceCalls.PassInc() + log.Debug( + "GetTokenIdBySpace", + "address", + proxy.address, + "networkId", + spaceId, + "result", + result, + "duration", + time.Since(start).Milliseconds(), + ) + return result, nil +} diff --git a/core/node/auth/auth_impl.go b/core/node/auth/auth_impl.go new file mode 100644 index 000000000..2bff4af46 --- /dev/null +++ b/core/node/auth/auth_impl.go @@ -0,0 +1,567 @@ +package auth + +import ( + "context" + "fmt" + "sync" + "time" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/infra" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/shared" + + "github.com/ethereum/go-ethereum/common" +) + +type ChainAuth interface { + IsEntitled(ctx context.Context, args *ChainAuthArgs) error +} + +var everyone = common.HexToAddress("0x1") // This represents an Ethereum address of "0x1" + +func NewChainAuthArgsForSpace(spaceId shared.StreamId, userId string, permission Permission) *ChainAuthArgs { + return &ChainAuthArgs{ + kind: chainAuthKindSpace, + spaceId: spaceId, + principal: common.HexToAddress(userId), + permission: permission, + } +} + +func NewChainAuthArgsForChannel( + spaceId shared.StreamId, + channelId shared.StreamId, + userId string, + permission Permission, +) *ChainAuthArgs { + return &ChainAuthArgs{ + kind: chainAuthKindChannel, + spaceId: spaceId, + channelId: channelId, + principal: common.HexToAddress(userId), + permission: permission, + } +} + +type chainAuthKind int + +const ( + chainAuthKindSpace chainAuthKind = iota + chainAuthKindChannel + chainAuthKindSpaceEnabled + chainAuthKindChannelEnabled +) + +type ChainAuthArgs struct { + kind chainAuthKind + spaceId shared.StreamId + channelId shared.StreamId + principal common.Address + permission Permission +} + +// Replaces principal with given wallet and returns new copy of args. +func (args *ChainAuthArgs) withWallet(wallet common.Address) *ChainAuthArgs { + ret := *args + ret.principal = wallet + return &ret +} + +func newArgsForEnabledSpace(spaceId shared.StreamId) *ChainAuthArgs { + return &ChainAuthArgs{ + kind: chainAuthKindSpaceEnabled, + spaceId: spaceId, + } +} + +func newArgsForEnabledChannel(spaceId shared.StreamId, channelId shared.StreamId) *ChainAuthArgs { + return &ChainAuthArgs{ + kind: chainAuthKindChannelEnabled, + spaceId: spaceId, + channelId: channelId, + } +} + +const ( + DEFAULT_REQUEST_TIMEOUT_MS = 5000 + DEFAULT_MAX_WALLETS = 10 +) + +var ( + isEntitledToChannelCacheHit = infra.NewSuccessMetrics("is_entitled_to_channel_cache_hit", contractCalls) + isEntitledToChannelCacheMiss = infra.NewSuccessMetrics("is_entitled_to_channel_cache_miss", contractCalls) + isEntitledToSpaceCacheHit = infra.NewSuccessMetrics("is_entitled_to_space_cache_hit", contractCalls) + isEntitledToSpaceCacheMiss = infra.NewSuccessMetrics("is_entitled_to_space_cache_miss", contractCalls) + isSpaceEnabledCacheHit = infra.NewSuccessMetrics("is_space_enabled_cache_hit", contractCalls) + isSpaceEnabledCacheMiss = infra.NewSuccessMetrics("is_space_enabled_cache_miss", contractCalls) + isChannelEnabledCacheHit = infra.NewSuccessMetrics("is_channel_enabled_cache_hit", contractCalls) + isChannelEnabledCacheMiss = infra.NewSuccessMetrics("is_channel_enabled_cache_miss", contractCalls) + entitlementCacheHit = infra.NewSuccessMetrics("entitlement_cache_hit", contractCalls) + entitlementCacheMiss = infra.NewSuccessMetrics("entitlement_cache_miss", contractCalls) +) + +type chainAuth struct { + blockchain *crypto.Blockchain + spaceContract SpaceContract + walletLinkContract WalletLinkContract + linkedWalletsLimit int + contractCallsTimeoutMs int + entitlementCache *entitlementCache + entitlementManagerCache *entitlementCache +} + +var _ ChainAuth = (*chainAuth)(nil) + +func NewChainAuth( + ctx context.Context, + blockchain *crypto.Blockchain, + architectCfg *config.ContractConfig, + linkedWalletsLimit int, + contractCallsTimeoutMs int, +) (*chainAuth, error) { + // instantiate contract facets from diamond configuration + spaceContract, err := NewSpaceContractV3(ctx, architectCfg, blockchain.Client) + if err != nil { + return nil, err + } + + walletLinkContract, err := NewWalletLink(ctx, architectCfg, blockchain.Client) + if err != nil { + return nil, err + } + + entitlementCache, err := newEntitlementCache(ctx, blockchain.Config) + if err != nil { + return nil, err + } + + // seperate cache for entitlement manager as the timeouts are shorter + entitlementManagerCache, err := newEntitlementManagerCache(ctx, blockchain.Config) + if err != nil { + return nil, err + } + + if linkedWalletsLimit <= 0 { + linkedWalletsLimit = DEFAULT_MAX_WALLETS + } + if contractCallsTimeoutMs <= 0 { + contractCallsTimeoutMs = DEFAULT_REQUEST_TIMEOUT_MS + } + + return &chainAuth{ + blockchain: blockchain, + spaceContract: spaceContract, + walletLinkContract: walletLinkContract, + linkedWalletsLimit: linkedWalletsLimit, + contractCallsTimeoutMs: contractCallsTimeoutMs, + entitlementCache: entitlementCache, + entitlementManagerCache: entitlementManagerCache, + }, nil +} + +func (ca *chainAuth) IsEntitled(ctx context.Context, args *ChainAuthArgs) error { + // TODO: counter for cache hits here? + result, _, err := ca.entitlementCache.executeUsingCache( + ctx, + args, + ca.checkEntitlement, + ) + if err != nil { + return AsRiverError(err).Func("IsEntitled") + } + if !result.IsAllowed() { + return RiverError( + Err_PERMISSION_DENIED, + "IsEntitled failed", + "spaceId", + args.spaceId, + "channelId", + args.channelId, + "userId", + args.principal, + "permission", + args.permission.String(), + ).Func("IsAllowed") + } + return nil +} + +func (ca *chainAuth) isWalletEntitled(ctx context.Context, args *ChainAuthArgs) (bool, error) { + log := dlog.FromCtx(ctx) + if args.kind == chainAuthKindSpace { + log.Debug("isWalletEntitled", "kind", "space", "args", args) + return ca.isEntitledToSpace(ctx, args) + } else if args.kind == chainAuthKindChannel { + log.Debug("isWalletEntitled", "kind", "channel", "args", args) + return ca.isEntitledToChannel(ctx, args) + } else { + return false, RiverError(Err_INTERNAL, "Unknown chain auth kind").Func("isWalletEntitled") + } +} + +func (ca *chainAuth) isSpaceEnabledUncached(ctx context.Context, args *ChainAuthArgs) (CacheResult, error) { + // This is awkward as we want enabled to be cached for 15 minutes, but the API returns the inverse + isDisabled, err := ca.spaceContract.IsSpaceDisabled(ctx, args.spaceId) + return &boolCacheResult{allowed: !isDisabled}, err +} + +func (ca *chainAuth) checkSpaceEnabled(ctx context.Context, spaceId shared.StreamId) error { + isEnabled, cacheHit, err := ca.entitlementCache.executeUsingCache( + ctx, + newArgsForEnabledSpace(spaceId), + ca.isSpaceEnabledUncached, + ) + if err != nil { + return err + } + if cacheHit { + isSpaceEnabledCacheHit.PassInc() + } else { + isSpaceEnabledCacheMiss.PassInc() + } + + if isEnabled.IsAllowed() { + return nil + } else { + return RiverError(Err_SPACE_DISABLED, "Space is disabled", "spaceId", spaceId).Func("isEntitledToSpace") + } +} + +func (ca *chainAuth) isChannelEnabledUncached(ctx context.Context, args *ChainAuthArgs) (CacheResult, error) { + // This is awkward as we want enabled to be cached for 15 minutes, but the API returns the inverse + isDisabled, err := ca.spaceContract.IsChannelDisabled(ctx, args.spaceId, args.channelId) + return &boolCacheResult{allowed: !isDisabled}, err +} + +func (ca *chainAuth) checkChannelEnabled( + ctx context.Context, + spaceId shared.StreamId, + channelId shared.StreamId, +) error { + isEnabled, cacheHit, err := ca.entitlementCache.executeUsingCache( + ctx, + newArgsForEnabledChannel(spaceId, channelId), + ca.isChannelEnabledUncached, + ) + if err != nil { + return err + } + if cacheHit { + isChannelEnabledCacheHit.PassInc() + } else { + isChannelEnabledCacheMiss.PassInc() + } + + if isEnabled.IsAllowed() { + return nil + } else { + return RiverError(Err_CHANNEL_DISABLED, "Channel is disabled", "spaceId", spaceId, "channelId", channelId).Func("checkChannelEnabled") + } +} + +// CacheResult is the result of a cache lookup. +// allowed means that this value should be cached +// not that the caller is allowed to access the permission +type entitlementCacheResult struct { + allowed bool + entitlementData []SpaceEntitlements + owner common.Address +} + +func (scr *entitlementCacheResult) IsAllowed() bool { + return scr.allowed +} + +// If entitlements are found for the permissions, they are returned and the allowed flag is set true so the results may be cached. +// If the call fails or the space is not found, the allowed flag is set to false so the negative caching time applies. +func (ca *chainAuth) getSpaceEntitlementsForPermissionUncached( + ctx context.Context, + args *ChainAuthArgs, +) (CacheResult, error) { + log := dlog.FromCtx(ctx) + entitlementData, owner, err := ca.spaceContract.GetSpaceEntitlementsForPermission( + ctx, + args.spaceId, + args.permission, + ) + + log.Debug("getSpaceEntitlementsForPermissionUncached", "args", args, "entitlementData", entitlementData) + if err != nil { + return &entitlementCacheResult{ + allowed: false, + }, AsRiverError( + err, + ).Func("getSpaceEntitlementsForPermision"). + Message("Failed to get space entitlements") + } + return &entitlementCacheResult{allowed: true, entitlementData: entitlementData, owner: owner}, nil +} + +func (ca *chainAuth) isEntitledToSpaceUncached(ctx context.Context, args *ChainAuthArgs) (CacheResult, error) { + log := dlog.FromCtx(ctx) + log.Debug("isEntitledToSpaceUncached", "args", args) + result, cacheHit, err := ca.entitlementManagerCache.executeUsingCache( + ctx, + args, + ca.getSpaceEntitlementsForPermissionUncached, + ) + if err != nil { + return &boolCacheResult{ + allowed: false, + }, AsRiverError( + err, + ).Func("isEntitledToSpace"). + Message("Failed to get space entitlements") + } + + if cacheHit { + entitlementCacheHit.PassInc() + } else { + entitlementCacheMiss.PassInc() + } + + temp := (result.(*timestampedCacheValue).Result()) + + if args.principal == temp.(*entitlementCacheResult).owner { + log.Debug("owner is entitled to space", "spaceId", args.spaceId, "userId", args.principal) + return &boolCacheResult{allowed: true}, nil + } + + entitlementData := temp.(*entitlementCacheResult) // Assuming result is of *entitlementCacheResult type + log.Debug("entitlementData", "args", args, "entitlementData", entitlementData) + for _, entitlement := range entitlementData.entitlementData { + log.Debug("entitlement", "entitlement", entitlement) + if entitlement.entitlementType == "RuleEntitlement" { + // TODO implement rule entitlment + } else if entitlement.entitlementType == "UserEntitlement" { + for _, user := range entitlement.userEntitlement { + if user == everyone { + log.Debug("everyone is entitled to space", "spaceId", args.spaceId) + return &boolCacheResult{allowed: true}, nil + } else if user == args.principal { + log.Debug("user is entitled to space", "spaceId", args.spaceId, "userId", args.principal) + return &boolCacheResult{allowed: true}, nil + } + } + } else { + log.Warn("Invalid entitlement type", "entitlement", entitlement) + } + } + + return &boolCacheResult{allowed: false}, nil +} + +func (ca *chainAuth) isEntitledToSpace(ctx context.Context, args *ChainAuthArgs) (bool, error) { + if args.kind != chainAuthKindSpace { + return false, RiverError(Err_INTERNAL, "Wrong chain auth kind") + } + + isEntitled, cacheHit, err := ca.entitlementCache.executeUsingCache(ctx, args, ca.isEntitledToSpaceUncached) + if err != nil { + return false, err + } + if cacheHit { + isEntitledToSpaceCacheHit.PassInc() + } else { + isEntitledToSpaceCacheMiss.PassInc() + } + + return isEntitled.IsAllowed(), nil +} + +func (ca *chainAuth) isEntitledToChannelUncached(ctx context.Context, args *ChainAuthArgs) (CacheResult, error) { + allowed, err := ca.spaceContract.IsEntitledToChannel( + ctx, + args.spaceId, + args.channelId, + args.principal, + args.permission, + ) + return &boolCacheResult{allowed: allowed}, err +} + +func (ca *chainAuth) isEntitledToChannel(ctx context.Context, args *ChainAuthArgs) (bool, error) { + if args.kind != chainAuthKindChannel { + return false, RiverError(Err_INTERNAL, "Wrong chain auth kind") + } + + isEntitled, cacheHit, err := ca.entitlementCache.executeUsingCache(ctx, args, ca.isEntitledToChannelUncached) + if err != nil { + return false, err + } + if cacheHit { + isEntitledToChannelCacheHit.PassInc() + } else { + isEntitledToChannelCacheMiss.PassInc() + } + + return isEntitled.IsAllowed(), nil +} + +type entitlementCheckResult struct { + allowed bool + err error +} + +func (ca *chainAuth) getLinkedWallets(ctx context.Context, rootKey common.Address) ([]common.Address, error) { + log := dlog.FromCtx(ctx) + + if ca.walletLinkContract == nil { + log.Warn("Wallet link contract is not setup properly, returning root key only") + return []common.Address{rootKey}, nil + } + + // get all the wallets for the root key. + wallets, err := ca.walletLinkContract.GetWalletsByRootKey(ctx, rootKey) + if err != nil { + log.Error("error getting all wallets", "rootKey", rootKey.Hex(), "error", err) + return nil, err + } + + log.Debug("allRelevantWallets", "wallets", wallets) + + return wallets, nil +} + +func (ca *chainAuth) checkMembership( + ctx context.Context, + address common.Address, + spaceId shared.StreamId, + results chan<- bool, + wg *sync.WaitGroup, +) { + log := dlog.FromCtx(ctx) + defer wg.Done() + isMember, err := ca.spaceContract.IsMember(ctx, spaceId, address) + if err != nil { + log.Warn("Error checking membership", "err", err, "address", address.Hex(), "spaceId", spaceId) + } else if isMember { + results <- true + } else { + log.Warn("User is not a member of the space", "userId", address.Hex(), "spaceId", spaceId) + } +} + +/** checkEntitlement checks if the user is entitled to the space / channel. + * It checks the entitlments for the root key and all the wallets linked to it in parallel. + * If any of the wallets is entitled, the user is entitled and all inflight requests are cancelled. + * If any of the operations fail before getting positive result, the whole operation fails. + * A prerequisite for this function is that one of the linked wallets is a member of the space. + */ +func (ca *chainAuth) checkEntitlement(ctx context.Context, args *ChainAuthArgs) (CacheResult, error) { + log := dlog.FromCtx(ctx) + + ctx, cancel := context.WithTimeout(ctx, time.Millisecond*time.Duration(ca.contractCallsTimeoutMs)) + defer cancel() + + if args.kind == chainAuthKindSpace { + err := ca.checkSpaceEnabled(ctx, args.spaceId) + if err != nil { + return &boolCacheResult{allowed: false}, nil + } + } else if args.kind == chainAuthKindChannel { + err := ca.checkChannelEnabled(ctx, args.spaceId, args.channelId) + if err != nil { + return &boolCacheResult{allowed: false}, nil + } + } else { + return &boolCacheResult{allowed: false}, RiverError(Err_INTERNAL, "Unknown chain auth kind").Func("isWalletEntitled") + } + + // Get all linked wallets. + wallets, err := ca.getLinkedWallets(ctx, args.principal) + if err != nil { + return &boolCacheResult{allowed: false}, err + } + + // Add the root key to the list of wallets. + wallets = append(wallets, args.principal) + + isMemberCtx, isMemberCancel := context.WithCancel(ctx) + defer isMemberCancel() + isMemberResults := make(chan bool, 1) + var isMemberWg sync.WaitGroup + + for _, address := range wallets { + isMemberWg.Add(1) + go ca.checkMembership(isMemberCtx, address, args.spaceId, isMemberResults, &isMemberWg) + } + + // Wait for at least one true result or all to complete + go func() { + isMemberWg.Wait() + close(isMemberResults) + }() + + isMember := false + + for result := range isMemberResults { + if result { + isMember = true + isMemberCancel() // Cancel all other goroutines + break + } + } + + if !isMember { + log.Warn("User is not a member of the space", "userId", args.principal, "spaceId", args.spaceId) + return &boolCacheResult{allowed: false}, nil + } + + // Now that we know the user is a member of the space, we can check entitlements. + resultsChan := make(chan entitlementCheckResult, len(wallets)) + var wg sync.WaitGroup + + // Get linked wallets and check them in parallel. + wg.Add(1) + go func() { + // defer here is essential since we are (mis)using WaitGroup here. + // It is ok to increment the WaitGroup once it is being waited on as long as the counter is not zero + // (see https://pkg.go.dev/sync#WaitGroup) + // We are adding new goroutines to the WaitGroup in the loop below, so we need to make sure that the counter is always > 0. + defer wg.Done() + if len(wallets) > ca.linkedWalletsLimit { + log.Error("too many wallets linked to the root key", "rootKey", args.principal, "wallets", len(wallets)) + resultsChan <- entitlementCheckResult{allowed: false, err: fmt.Errorf("too many wallets linked to the root key: %d", len(wallets)-1)} + return + } + // Check all wallets in parallel. + for _, wallet := range wallets { + wg.Add(1) + go func(address common.Address) { + defer wg.Done() + result, err := ca.isWalletEntitled(ctx, args.withWallet(address)) + resultsChan <- entitlementCheckResult{allowed: result, err: err} + }(wallet) + } + }() + + go func() { + wg.Wait() + close(resultsChan) + }() + + for opResult := range resultsChan { + if opResult.err != nil { + // we don't check for context cancellation error here because + // * if it is a timeout it has to propagate + // * the explicit cancel happens only here, so it is not possible. + + // Cancel all inflight requests. + cancel() + // Any error is a failure. + return &boolCacheResult{allowed: false}, opResult.err + } + if opResult.allowed { + // We have the result we need, cancel all inflight requests. + cancel() + + return &boolCacheResult{allowed: true}, nil + } + } + return &boolCacheResult{allowed: false}, nil +} diff --git a/core/node/auth/auth_impl_cache.go b/core/node/auth/auth_impl_cache.go new file mode 100644 index 000000000..86eb51172 --- /dev/null +++ b/core/node/auth/auth_impl_cache.go @@ -0,0 +1,188 @@ +package auth + +import ( + "context" + "time" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/protocol" + + lru "github.com/hashicorp/golang-lru/arc/v2" +) + +type entitlementCache struct { + // Not using expirable version, as it retains the cache hits for a min TTL, but + // then continues to return that value as long as a hit happens in that tTL window. + // We want to return the value only if the cache is fresh, and not continue to return + positiveCache *lru.ARCCache[ChainAuthArgs, entitlementCacheValue] + negativeCache *lru.ARCCache[ChainAuthArgs, entitlementCacheValue] + positiveCacheTTL time.Duration + negativeCacheTTL time.Duration +} + +type CacheResult interface { + IsAllowed() bool +} + +// Cached results of isEntitlement check with the TTL of the result +type entitlementCacheValue interface { + IsAllowed() bool + GetTimestamp() time.Time +} + +type timestampedCacheValue struct { + result CacheResult + timestamp time.Time +} + +func (ccv *timestampedCacheValue) IsAllowed() bool { + return ccv.result.IsAllowed() +} + +func (ccv *timestampedCacheValue) Result() CacheResult { + return ccv.result +} + +func (ccv *timestampedCacheValue) GetTimestamp() time.Time { + return ccv.timestamp +} + +type boolCacheResult struct { + allowed bool +} + +func (scr *boolCacheResult) IsAllowed() bool { + return scr.allowed +} + +func newEntitlementCache(ctx context.Context, cfg *config.ChainConfig) (*entitlementCache, error) { + log := dlog.FromCtx(ctx) + + positiveCacheSize := 10000 + if cfg.PositiveEntitlementCacheSize > 0 { + positiveCacheSize = cfg.PositiveEntitlementCacheSize + } + + negativeCacheSize := 10000 + if cfg.NegativeEntitlementCacheSize > 0 { + negativeCacheSize = cfg.NegativeEntitlementCacheSize + } + // Need to figure out how to determine the size of the cache + positiveCache, err := lru.NewARC[ChainAuthArgs, entitlementCacheValue](positiveCacheSize) + if err != nil { + log.Error("error creating auth_impl positive cache", "error", err) + return nil, WrapRiverError(protocol.Err_CANNOT_CONNECT, err) + } + negativeCache, err := lru.NewARC[ChainAuthArgs, entitlementCacheValue](negativeCacheSize) + if err != nil { + log.Error("error creating auth_impl negative cache", "error", err) + return nil, WrapRiverError(protocol.Err_CANNOT_CONNECT, err) + } + + positiveCacheTTL := 15 * time.Minute + if cfg.PositiveEntitlementCacheTTLSeconds > 0 { + positiveCacheTTL = time.Duration(cfg.PositiveEntitlementCacheTTLSeconds) * time.Second + } + negativeCacheTTL := 2 * time.Second + if cfg.NegativeEntitlementCacheTTLSeconds > 0 { + negativeCacheTTL = time.Duration(cfg.NegativeEntitlementCacheTTLSeconds) * time.Second + } + + return &entitlementCache{ + positiveCache, + negativeCache, + positiveCacheTTL, + negativeCacheTTL, + }, nil +} + +func newEntitlementManagerCache(ctx context.Context, cfg *config.ChainConfig) (*entitlementCache, error) { + log := dlog.FromCtx(ctx) + + positiveCacheSize := 10000 + if cfg.PositiveEntitlementCacheSize > 0 { + positiveCacheSize = cfg.PositiveEntitlementManagerCacheSize + } + + negativeCacheSize := 10000 + if cfg.NegativeEntitlementCacheSize > 0 { + negativeCacheSize = cfg.NegativeEntitlementManagerCacheSize + } + // Need to figure out how to determine the size of the cache + positiveCache, err := lru.NewARC[ChainAuthArgs, entitlementCacheValue](positiveCacheSize) + if err != nil { + log.Error("error creating auth_impl entitlement manager positive cache", "error", err) + return nil, WrapRiverError(protocol.Err_CANNOT_CONNECT, err) + } + negativeCache, err := lru.NewARC[ChainAuthArgs, entitlementCacheValue](negativeCacheSize) + if err != nil { + log.Error("error creating auth_impl entitlement manager negative cache", "error", err) + return nil, WrapRiverError(protocol.Err_CANNOT_CONNECT, err) + } + + positiveCacheTTL := 15 * time.Second + if cfg.PositiveEntitlementCacheTTLSeconds > 0 { + positiveCacheTTL = time.Duration(cfg.PositiveEntitlementManagerCacheTTLSeconds) * time.Second + } + negativeCacheTTL := 2 * time.Second + if cfg.NegativeEntitlementCacheTTLSeconds > 0 { + negativeCacheTTL = time.Duration(cfg.NegativeEntitlementManagerCacheTTLSeconds) * time.Second + } + + return &entitlementCache{ + positiveCache, + negativeCache, + positiveCacheTTL, + negativeCacheTTL, + }, nil +} + +func (ec *entitlementCache) executeUsingCache( + ctx context.Context, + key *ChainAuthArgs, + onMiss func(context.Context, *ChainAuthArgs) (CacheResult, error), +) (CacheResult, bool, error) { + // Check positive cache first + if val, ok := ec.positiveCache.Get(*key); ok { + // Positive cache is only valid for a longer time + if time.Since(val.GetTimestamp()) < ec.positiveCacheTTL { + return val, true, nil + } else { + // Positive cache key is stale, remove it + ec.positiveCache.Remove(*key) + } + } + + // Check negative cache + if val, ok := ec.negativeCache.Get(*key); ok { + // Negative cache is only valid for 2 seconds, basically one block + if time.Since(val.GetTimestamp()) < ec.negativeCacheTTL { + return val, true, nil + } else { + // Negative cache key is stale, remove it + ec.negativeCache.Remove(*key) + } + } + + // Cache miss, execute the closure + result, err := onMiss(ctx, key) + if err != nil { + return nil, false, err + } + + // Store the result in the appropriate cache + cacheVal := ×tampedCacheValue{ + result: result, + timestamp: time.Now(), + } + + if result.IsAllowed() { + ec.positiveCache.Add(*key, cacheVal) + } else { + ec.negativeCache.Add(*key, cacheVal) + } + + return cacheVal, false, nil +} diff --git a/core/node/auth/auth_impl_cache_test.go b/core/node/auth/auth_impl_cache_test.go new file mode 100644 index 000000000..6a0f53a66 --- /dev/null +++ b/core/node/auth/auth_impl_cache_test.go @@ -0,0 +1,68 @@ +package auth + +import ( + "context" + "testing" + + "github.com/river-build/river/core/node/base/test" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/shared" + "github.com/river-build/river/core/node/testutils" + + "github.com/stretchr/testify/assert" +) + +type simpleCacheResult struct { + allowed bool +} + +func (scr *simpleCacheResult) IsAllowed() bool { + return scr.allowed +} + +// Test for the newEntitlementCache function +func TestCache(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + + c, err := newEntitlementCache( + ctx, + &config.ChainConfig{ + PositiveEntitlementCacheSize: 10000, + NegativeEntitlementCacheSize: 10000, + PositiveEntitlementCacheTTLSeconds: 15, + NegativeEntitlementCacheTTLSeconds: 2, + }, + ) + assert.NoError(t, err) + spaceId := testutils.FakeStreamId(shared.STREAM_SPACE_BIN) + channelId := testutils.MakeChannelId(spaceId) + + var cacheMissForReal bool + result, cacheHit, err := c.executeUsingCache( + ctx, + NewChainAuthArgsForChannel(spaceId, channelId, "3", PermissionWrite), + func(context.Context, *ChainAuthArgs) (CacheResult, error) { + cacheMissForReal = true + return &simpleCacheResult{allowed: true}, nil + }, + ) + assert.NoError(t, err) + assert.True(t, result.IsAllowed()) + assert.False(t, cacheHit) + assert.True(t, cacheMissForReal) + + cacheMissForReal = false + result, cacheHit, err = c.executeUsingCache( + ctx, + NewChainAuthArgsForChannel(spaceId, channelId, "3", PermissionWrite), + func(context.Context, *ChainAuthArgs) (CacheResult, error) { + cacheMissForReal = true + return &simpleCacheResult{allowed: false}, nil + }, + ) + assert.NoError(t, err) + assert.True(t, result.IsAllowed()) + assert.True(t, cacheHit) + assert.False(t, cacheMissForReal) +} diff --git a/core/node/auth/channels.go b/core/node/auth/channels.go new file mode 100644 index 000000000..fc426985b --- /dev/null +++ b/core/node/auth/channels.go @@ -0,0 +1,71 @@ +package auth + +import ( + "context" + "time" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/contracts/base" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/infra" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/shared" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" +) + +type Channels interface { + IsDisabled(opts *bind.CallOpts, channelId shared.StreamId) (bool, error) +} + +var getChannelCalls = infra.NewSuccessMetrics("get_channel_calls", contractCalls) + +func NewChannels( + ctx context.Context, + version string, + address common.Address, + backend bind.ContractBackend, +) (Channels, error) { + var err error + var cc *base.Channels + cc, err = base.NewChannels(address, backend) + if err != nil { + return nil, WrapRiverError( + Err_CANNOT_CONNECT, + err, + ).Tags("address", address, "version", version). + Func("NewChannels"). + Message("Failed to initialize contract") + } + return &channelsProxy{ + contract: cc, + ctx: ctx, + }, + nil +} + +type channelsProxy struct { + contract *base.Channels + ctx context.Context +} + +var _ Channels = (*channelsProxy)(nil) + +func (p *channelsProxy) IsDisabled(opts *bind.CallOpts, channelId shared.StreamId) (bool, error) { + log := dlog.FromCtx(p.ctx) + start := time.Now() + defer infra.StoreExecutionTimeMetrics("IsDisabled", infra.CONTRACT_CALLS_CATEGORY, start) + log.Debug("IsDisabled", "channelId", channelId) + + ch, err := p.contract.GetChannel(opts, channelId) + if err != nil { + getChannelCalls.FailInc() + log.Error("IsDisabled", "channelId", channelId, "error", err) + return false, err + } + + getChannelCalls.PassInc() + log.Debug("IsDisabled", "channelId", channelId, "result", ch.Disabled, "duration", time.Since(start).Milliseconds()) + return ch.Disabled, nil +} diff --git a/core/node/auth/entitlement.go b/core/node/auth/entitlement.go new file mode 100644 index 000000000..577099ad2 --- /dev/null +++ b/core/node/auth/entitlement.go @@ -0,0 +1,178 @@ +package auth + +import ( + "context" + "time" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/contracts/base" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/infra" + . "github.com/river-build/river/core/node/protocol" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" +) + +type Entitlements interface { + IsEntitledToChannel(opts *bind.CallOpts, channelId [32]byte, user common.Address, permission string) (bool, error) + IsEntitledToSpace(opts *bind.CallOpts, user common.Address, permission string) (bool, error) + GetEntitlementDataByPermission( + opts *bind.CallOpts, + permission string, + ) ([]base.IEntitlementsManagerEntitlementData, error) +} +type entitlementsProxy struct { + contract *base.EntitlementsManager + address common.Address + ctx context.Context +} + +var ( + isEntitledToChannelCalls = infra.NewSuccessMetrics("is_entitled_to_channel_calls", contractCalls) + isEntitledToSpaceCalls = infra.NewSuccessMetrics("is_entitled_to_space_calls", contractCalls) + getEntitlementDataByPermissionsCalls = infra.NewSuccessMetrics( + "get_entitlement_data_by_permissions_calls", + contractCalls, + ) +) + +func NewEntitlements( + ctx context.Context, + version string, + address common.Address, + backend bind.ContractBackend, +) (Entitlements, error) { + c, err := base.NewEntitlementsManager(address, backend) + if err != nil { + return nil, WrapRiverError( + Err_CANNOT_CONNECT, + err, + ).Tags("address", address, "version", version). + Func("NewEntitlements"). + Message("Failed to initialize contract") + } + return &entitlementsProxy{ + contract: c, + address: address, + ctx: ctx, + }, nil +} + +func (proxy *entitlementsProxy) IsEntitledToChannel( + opts *bind.CallOpts, + channelId [32]byte, + user common.Address, + permission string, +) (bool, error) { + log := dlog.FromCtx(proxy.ctx) + start := time.Now() + defer infra.StoreExecutionTimeMetrics("IsEntitledToChannel", infra.CONTRACT_CALLS_CATEGORY, start) + log.Debug( + "IsEntitledToChannel", + "channelId", + channelId, + "user", + user, + "permission", + permission, + "address", + proxy.address, + ) + result, err := proxy.contract.IsEntitledToChannel(opts, channelId, user, permission) + if err != nil { + isEntitledToChannelCalls.FailInc() + log.Error( + "IsEntitledToChannel", + "channelId", + channelId, + "user", + user, + "permission", + permission, + "address", + proxy.address, + "error", + err, + ) + return false, WrapRiverError(Err_CANNOT_CALL_CONTRACT, err) + } + isEntitledToChannelCalls.PassInc() + log.Debug( + "IsEntitledToChannel", + "channelId", + channelId, + "user", + user, + "permission", + permission, + "address", + proxy.address, + "result", + result, + "duration", + time.Since(start).Milliseconds(), + ) + return result, nil +} + +func (proxy *entitlementsProxy) IsEntitledToSpace( + opts *bind.CallOpts, + user common.Address, + permission string, +) (bool, error) { + log := dlog.FromCtx(proxy.ctx) + start := time.Now() + defer infra.StoreExecutionTimeMetrics("IsEntitledToSpace", infra.CONTRACT_CALLS_CATEGORY, start) + log.Debug("IsEntitledToSpace", "user", user, "permission", permission, "address", proxy.address) + result, err := proxy.contract.IsEntitledToSpace(opts, user, permission) + if err != nil { + isEntitledToSpaceCalls.FailInc() + log.Error("IsEntitledToSpace", "user", user, "permission", permission, "address", proxy.address, "error", err) + return false, WrapRiverError(Err_CANNOT_CALL_CONTRACT, err) + } + isEntitledToSpaceCalls.PassInc() + log.Debug( + "IsEntitledToSpace", + "user", + user, + "permission", + permission, + "address", + proxy.address, + "result", + result, + "duration", + time.Since(start).Milliseconds(), + ) + return result, nil +} + +func (proxy *entitlementsProxy) GetEntitlementDataByPermission( + opts *bind.CallOpts, + permission string, +) ([]base.IEntitlementsManagerEntitlementData, error) { + log := dlog.FromCtx(proxy.ctx) + start := time.Now() + defer infra.StoreExecutionTimeMetrics("GetEntitlementDataByPermissions", infra.CONTRACT_CALLS_CATEGORY, start) + log.Debug("GetEntitlementDataByPermissions", "permission", permission, "address", proxy.address) + result, err := proxy.contract.GetEntitlementDataByPermission(opts, permission) + if err != nil { + getEntitlementDataByPermissionsCalls.FailInc() + log.Error("GetEntitlementDataByPermissions", "permission", permission, "address", proxy.address, "error", err) + return nil, WrapRiverError(Err_CANNOT_CALL_CONTRACT, err) + } + getEntitlementDataByPermissionsCalls.PassInc() + log.Debug( + "GetEntitlementDataByPermissions", + "permission", + permission, + "address", + proxy.address, + "result", + result, + "duration", + time.Since(start).Milliseconds(), + ) + return result, nil +} diff --git a/core/node/auth/fake_auth.go b/core/node/auth/fake_auth.go new file mode 100644 index 000000000..83e158dbd --- /dev/null +++ b/core/node/auth/fake_auth.go @@ -0,0 +1,18 @@ +package auth + +import ( + "context" +) + +// This checkers always returns true, used for some testing scenarios. +func NewFakeChainAuth() *fakeChainAuth { + return &fakeChainAuth{} +} + +type fakeChainAuth struct{} + +var _ ChainAuth = (*fakeChainAuth)(nil) + +func (a *fakeChainAuth) IsEntitled(ctx context.Context, args *ChainAuthArgs) error { + return nil +} diff --git a/core/node/auth/pausable.go b/core/node/auth/pausable.go new file mode 100644 index 000000000..14ab86c5a --- /dev/null +++ b/core/node/auth/pausable.go @@ -0,0 +1,67 @@ +package auth + +import ( + "context" + "time" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/contracts/base" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/infra" + . "github.com/river-build/river/core/node/protocol" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" +) + +type Pausable interface { + Paused(callOpts *bind.CallOpts) (bool, error) +} + +type pausableProxy struct { + address common.Address + contract Pausable + ctx context.Context +} + +var pausedCalls = infra.NewSuccessMetrics("paused_calls", contractCalls) + +func NewPausable( + ctx context.Context, + version string, + address common.Address, + backend bind.ContractBackend, +) (Pausable, error) { + var c Pausable + var err error + c, err = base.NewPausable(address, backend) + if err != nil { + return nil, WrapRiverError( + Err_CANNOT_CONNECT, + err, + ).Tags("address", address, "version", version). + Func("NewPausable"). + Message("Failed to initialize contract") + } + return &pausableProxy{ + contract: c, + address: address, + ctx: ctx, + }, nil +} + +func (proxy *pausableProxy) Paused(callOpts *bind.CallOpts) (bool, error) { + log := dlog.FromCtx(proxy.ctx) + start := time.Now() + defer infra.StoreExecutionTimeMetrics("Paused", infra.CONTRACT_CALLS_CATEGORY, start) + log.Debug("Paused", "address", proxy.address) + result, err := proxy.contract.Paused(callOpts) + if err != nil { + pausedCalls.FailInc() + log.Error("Paused", "address", proxy.address, "error", err) + return false, WrapRiverError(Err_CANNOT_CALL_CONTRACT, err) + } + pausedCalls.PassInc() + log.Debug("Paused", "address", proxy.address, "result", result, "duration", time.Since(start).Milliseconds()) + return result, nil +} diff --git a/core/node/auth/permissions.go b/core/node/auth/permissions.go new file mode 100644 index 000000000..026134c41 --- /dev/null +++ b/core/node/auth/permissions.go @@ -0,0 +1,43 @@ +package auth + +type Permission int + +const ( + PermissionUndefined Permission = iota // No permission required + PermissionRead + PermissionWrite + PermissionInvite + PermissionJoin + PermissionRedact + PermissionBan + PermissionPinMessages + PermissionAddRemoveChannels + PermissionModifySpaceSettings +) + +func (p Permission) String() string { + switch p { + case PermissionUndefined: + return "Undefined" + case PermissionRead: + return "Read" + case PermissionWrite: + return "Write" + case PermissionInvite: + return "Invite" + case PermissionJoin: + return "Join" + case PermissionRedact: + return "Redact" + case PermissionBan: + return "Ban" + case PermissionPinMessages: + return "PinMessages" + case PermissionAddRemoveChannels: + return "AddRemoveChannels" + case PermissionModifySpaceSettings: + return "ModifySpaceSettings" + default: + return "Unknown" + } +} diff --git a/core/node/auth/space_contract.go b/core/node/auth/space_contract.go new file mode 100644 index 000000000..07d3c68aa --- /dev/null +++ b/core/node/auth/space_contract.go @@ -0,0 +1,48 @@ +package auth + +import ( + "context" + + v3 "github.com/river-build/river/core/xchain/contracts/v3" + + "github.com/ethereum/go-ethereum/common" + "github.com/river-build/river/core/node/shared" +) + +type SpaceEntitlements struct { + entitlementType string + ruleEntitlement v3.IRuleEntitlementRuleData + userEntitlement []common.Address +} + +type SpaceContract interface { + IsSpaceDisabled(ctx context.Context, spaceId shared.StreamId) (bool, error) + IsChannelDisabled( + ctx context.Context, + spaceId shared.StreamId, + channelId shared.StreamId, + ) (bool, error) + IsEntitledToSpace( + ctx context.Context, + spaceId shared.StreamId, + user common.Address, + permission Permission, + ) (bool, error) + IsEntitledToChannel( + ctx context.Context, + spaceId shared.StreamId, + channelId shared.StreamId, + user common.Address, + permission Permission, + ) (bool, error) + GetSpaceEntitlementsForPermission( + ctx context.Context, + spaceId shared.StreamId, + permission Permission, + ) ([]SpaceEntitlements, common.Address, error) + IsMember( + ctx context.Context, + spaceId shared.StreamId, + user common.Address, + ) (bool, error) +} diff --git a/core/node/auth/space_contract_v3.go b/core/node/auth/space_contract_v3.go new file mode 100644 index 000000000..8d55fffea --- /dev/null +++ b/core/node/auth/space_contract_v3.go @@ -0,0 +1,354 @@ +package auth + +import ( + "context" + "encoding/json" + "math/big" + "strings" + "sync" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/dlog" + . "github.com/river-build/river/core/node/protocol" + + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/infra" + "github.com/river-build/river/core/node/shared" + "github.com/river-build/river/core/xchain/bindings/erc721" + "github.com/river-build/river/core/xchain/bindings/ierc5313" + v3 "github.com/river-build/river/core/xchain/contracts/v3" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" +) + +type Space struct { + address common.Address + entitlements Entitlements + pausable Pausable + channels map[shared.StreamId]Channels + channelsLock sync.Mutex +} + +type SpaceContractV3 struct { + architect Architect + version string + backend bind.ContractBackend + spaces map[shared.StreamId]*Space + spacesLock sync.Mutex +} + +var contractCalls = infra.NewSuccessMetrics("contract_calls", nil) + +var EMPTY_ADDRESS = common.Address{} + +func NewSpaceContractV3( + ctx context.Context, + architectCfg *config.ContractConfig, + backend bind.ContractBackend, + // walletLinkingCfg *config.ContractConfig, +) (SpaceContract, error) { + architect, err := NewArchitect(ctx, architectCfg, backend) + if err != nil { + return nil, err + } + + spaceContract := &SpaceContractV3{ + architect: architect, + version: architectCfg.Version, + backend: backend, + spaces: make(map[shared.StreamId]*Space), + } + + return spaceContract, nil +} + +func (sc *SpaceContractV3) IsMember( + ctx context.Context, + spaceId shared.StreamId, + user common.Address, +) (bool, error) { + space, err := sc.getSpace(ctx, spaceId) + if err != nil || space == nil { + return false, err + } + + spaceAsErc271, err := erc721.NewErc721(space.address, sc.backend) + + if err != nil || space == nil { + return false, err + } + isMember, err := spaceAsErc271.BalanceOf(nil, user) + if err != nil { + return false, err + } + return isMember.Cmp(big.NewInt(0)) > 0, err +} + +func (sc *SpaceContractV3) IsEntitledToSpace( + ctx context.Context, + spaceId shared.StreamId, + user common.Address, + permission Permission, +) (bool, error) { + // get the space entitlements and check if user is entitled. + space, err := sc.getSpace(ctx, spaceId) + if err != nil || space == nil { + return false, err + } + isEntitled, err := space.entitlements.IsEntitledToSpace( + nil, + user, + permission.String(), + ) + return isEntitled, err +} + +var ( + parsedABI abi.ABI + once sync.Once +) + +func getABI() (abi.ABI, error) { + var err error + once.Do(func() { + parsedABI, err = abi.JSON(strings.NewReader(v3.IEntitlementGatedMetaData.ABI)) + }) + return parsedABI, err +} + +/** + * GetSpaceEntitlementsForPermission returns the entitlements for the given permission. + * The entitlements are returned as a list of SpaceEntitlements. + * Each SpaceEntitlements object contains the entitlement type and the entitlement data. + * The entitlement data is either a RuleEntitlement or a UserEntitlement. + * The RuleEntitlement contains the rule data. + * The UserEntitlement contains the list of user addresses. + * The owner of the space is also returned. + */ +func (sc *SpaceContractV3) GetSpaceEntitlementsForPermission( + ctx context.Context, + spaceId shared.StreamId, + permission Permission, +) ([]SpaceEntitlements, common.Address, error) { + log := dlog.FromCtx(ctx) + // get the space entitlements and check if user is entitled. + space, err := sc.getSpace(ctx, spaceId) + if err != nil || space == nil { + log.Warn("Failed to get space", "space_id", spaceId, "error", err) + return nil, EMPTY_ADDRESS, err + } + + spaceAsIerc5313, err := ierc5313.NewIerc5313(space.address, sc.backend) + if err != nil { + log.Warn("Failed to get spaceAsIerc5313", "space_id", spaceId, "error", err) + return nil, EMPTY_ADDRESS, err + } + + owner, err := spaceAsIerc5313.Owner(nil) + if err != nil { + log.Warn("Failed to get owner", "space_id", spaceId, "error", err) + return nil, EMPTY_ADDRESS, err + } + + entitlementData, err := space.entitlements.GetEntitlementDataByPermission( + nil, + permission.String(), + ) + log.Info( + "Got entitlement data", + "err", + err, + "entitlement_data", + entitlementData, + "space_id", + spaceId, + "permission", + permission.String(), + ) + if err != nil { + return nil, EMPTY_ADDRESS, err + } + entitlements := make([]SpaceEntitlements, len(entitlementData)) + + for i, entitlement := range entitlementData { + if entitlement.EntitlementType == "RuleEntitlement" { + entitlements[i].entitlementType = entitlement.EntitlementType + log.Info("Entitlement data", "entitlement_data", entitlement.EntitlementData) + // Parse the ABI definition + parsedABI, err := getABI() + if err != nil { + log.Error("Failed to parse ABI", "error", err) + return nil, EMPTY_ADDRESS, err + } + + var ruleData v3.IRuleEntitlementRuleData + + unpackedData, err := parsedABI.Unpack("getRuleData", entitlement.EntitlementData) + if err != nil { + log.Warn( + "Failed to unpack rule data", + "error", + err, + "entitlement", + entitlement, + "entitlement_data", + entitlement.EntitlementData, + "len(entitlement.EntitlementData)", + len(entitlement.EntitlementData), + ) + } + + if len(unpackedData) > 0 { + // Marshal into JSON, because for some UnpackIntoInterface doesn't work when unpacking diretly into a struct + jsonData, err := json.Marshal(unpackedData[0]) + if err != nil { + log.Warn("Failed to marshal data to JSON", "error", err, "unpackedData", unpackedData) + } + + err = json.Unmarshal(jsonData, &ruleData) + if err != nil { + log.Warn( + "Failed to unmarshal JSON to struct", + "error", + err, + "jsonData", + jsonData, + "ruleData", + ruleData, + ) + } + } else { + log.Warn("No data unpacked", "unpackedData", unpackedData) + } + + entitlements[i].ruleEntitlement = ruleData + + } else if entitlement.EntitlementType == "UserEntitlement" { + entitlements[i].entitlementType = entitlement.EntitlementType + abiDef := `[{"name":"getAddresses","outputs":[{"type":"address[]","name":"out"}],"constant":true,"payable":false,"type":"function"}]` + + // Parse the ABI definition + parsedABI, err := abi.JSON(strings.NewReader(abiDef)) + if err != nil { + return nil, EMPTY_ADDRESS, err + } + var addresses []common.Address + // Unpack the data + err = parsedABI.UnpackIntoInterface(&addresses, "getAddresses", entitlement.EntitlementData) + if err != nil { + return nil, EMPTY_ADDRESS, err + } + entitlements[i].userEntitlement = addresses + } else { + return nil, EMPTY_ADDRESS, RiverError(Err_UNKNOWN, "Invalid entitlement type").Tag("entitlement_type", entitlement.EntitlementType) + } + } + + log.Info( + "Returning entitlements", + "entitlements", + entitlements, + "space_id", + spaceId, + "permission", + permission.String(), + ) + + return entitlements, owner, nil +} + +func (sc *SpaceContractV3) IsEntitledToChannel( + ctx context.Context, + spaceId shared.StreamId, + channelId shared.StreamId, + user common.Address, + permission Permission, +) (bool, error) { + // get the space entitlements and check if user is entitled to the channel + space, err := sc.getSpace(ctx, spaceId) + if err != nil || space == nil { + return false, err + } + // channel entitlement check + isEntitled, err := space.entitlements.IsEntitledToChannel( + nil, + channelId, + user, + permission.String(), + ) + return isEntitled, err +} + +func (sc *SpaceContractV3) IsSpaceDisabled(ctx context.Context, spaceId shared.StreamId) (bool, error) { + space, err := sc.getSpace(ctx, spaceId) + if err != nil || space == nil { + return false, err + } + + isDisabled, err := space.pausable.Paused(nil) + return isDisabled, err +} + +func (sc *SpaceContractV3) IsChannelDisabled( + ctx context.Context, + spaceId shared.StreamId, + channelId shared.StreamId, +) (bool, error) { + channel, err := sc.getChannel(ctx, spaceId, channelId) + if err != nil || channel == nil { + return false, err + } + isDisabled, err := channel.IsDisabled(nil, channelId) + return isDisabled, err +} + +func (sc *SpaceContractV3) getSpace(ctx context.Context, spaceId shared.StreamId) (*Space, error) { + sc.spacesLock.Lock() + defer sc.spacesLock.Unlock() + if sc.spaces[spaceId] == nil { + // use the networkId to fetch the space's contract address + address, err := shared.AddressFromSpaceId(spaceId) + if err != nil || address == EMPTY_ADDRESS { + return nil, err + } + entitlements, err := NewEntitlements(ctx, sc.version, address, sc.backend) + if err != nil { + return nil, err + } + pausable, err := NewPausable(ctx, sc.version, address, sc.backend) + if err != nil { + return nil, err + } + // cache the space + sc.spaces[spaceId] = &Space{ + address: address, + entitlements: entitlements, + pausable: pausable, + channels: make(map[shared.StreamId]Channels), + } + } + return sc.spaces[spaceId], nil +} + +func (sc *SpaceContractV3) getChannel( + ctx context.Context, + spaceId shared.StreamId, + channelId shared.StreamId, +) (Channels, error) { + space, err := sc.getSpace(ctx, spaceId) + if err != nil || space == nil { + return nil, err + } + space.channelsLock.Lock() + defer space.channelsLock.Unlock() + if space.channels[channelId] == nil { + channel, err := NewChannels(ctx, sc.version, space.address, sc.backend) + if err != nil { + return nil, err + } + space.channels[channelId] = channel + } + return space.channels[channelId], nil +} diff --git a/core/node/auth/wallet_link.go b/core/node/auth/wallet_link.go new file mode 100644 index 000000000..93cd7c908 --- /dev/null +++ b/core/node/auth/wallet_link.go @@ -0,0 +1,113 @@ +package auth + +import ( + "context" + "math/big" + "time" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/contracts/base" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/infra" + . "github.com/river-build/river/core/node/protocol" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" +) + +type WalletLinkContract interface { + GetLatestNonceForRootKey(ctx context.Context, rootKey common.Address) (*big.Int, error) + GetWalletsByRootKey(ctx context.Context, rootKey common.Address) ([]common.Address, error) + GetRootKeyForWallet(ctx context.Context, wallet common.Address) (common.Address, error) + CheckIfLinked(ctx context.Context, rootKey common.Address, wallet common.Address) (bool, error) +} +type WalletLink struct { + contract *base.WalletLink +} + +var ( + getWalletsByRootKeyCalls = infra.NewSuccessMetrics("get_wallets_by_root_key_calls", contractCalls) + getRootKeyForWalletCalls = infra.NewSuccessMetrics("get_root_key_for_wallet_calls", contractCalls) + getLatestNonceCalls = infra.NewSuccessMetrics("get_latest_nonce_calls", contractCalls) + checkIfLinkedCalls = infra.NewSuccessMetrics("check_if_linked_calls", contractCalls) +) + +func NewWalletLink(ctx context.Context, cfg *config.ContractConfig, backend bind.ContractBackend) (*WalletLink, error) { + c, err := base.NewWalletLink(cfg.Address, backend) + if err != nil { + return nil, WrapRiverError( + Err_CANNOT_CONNECT, + err, + ).Tags("address", cfg.Address, "version", cfg.Version). + Func("NewWalletLink"). + Message("Failed to initialize contract") + } + return &WalletLink{ + contract: c, + }, nil +} + +func (l *WalletLink) GetWalletsByRootKey(ctx context.Context, rootKey common.Address) ([]common.Address, error) { + log := dlog.FromCtx(ctx) + start := time.Now() + defer infra.StoreExecutionTimeMetrics("GetWalletsByRootKey", infra.CONTRACT_CALLS_CATEGORY, start) + log.Debug("GetWalletsByRootKey", "rootKey", rootKey) + result, err := l.contract.GetWalletsByRootKey(nil, rootKey) + if err != nil { + getWalletsByRootKeyCalls.FailInc() + log.Error("GetWalletsByRootKey", "rootKey", rootKey, "error", err) + return nil, WrapRiverError(Err_CANNOT_CALL_CONTRACT, err) + } + getWalletsByRootKeyCalls.PassInc() + log.Debug("GetWalletsByRootKey", "rootKey", rootKey, "result", result, "duration", time.Since(start).Milliseconds()) + return result, nil +} + +func (l *WalletLink) GetRootKeyForWallet(ctx context.Context, wallet common.Address) (common.Address, error) { + log := dlog.FromCtx(ctx) + start := time.Now() + defer infra.StoreExecutionTimeMetrics("GetRootKeyForWallet", infra.CONTRACT_CALLS_CATEGORY, start) + log.Debug("GetRootKeyForWallet", "wallet", wallet) + result, err := l.contract.GetRootKeyForWallet(nil, wallet) + if err != nil { + getRootKeyForWalletCalls.FailInc() + log.Error("GetRootKeyForWallet", "wallet", wallet, "error", err) + return common.Address{}, WrapRiverError(Err_CANNOT_CALL_CONTRACT, err) + } + getRootKeyForWalletCalls.PassInc() + log.Debug("GetRootKeyForWallet", "wallet", wallet, "result", result, "duration", time.Since(start).Milliseconds()) + return result, nil +} + +func (l *WalletLink) GetLatestNonceForRootKey(ctx context.Context, rootKey common.Address) (*big.Int, error) { + log := dlog.FromCtx(ctx) + start := time.Now() + defer infra.StoreExecutionTimeMetrics("GetLatestNonceForRootKey", infra.CONTRACT_CALLS_CATEGORY, start) + log.Debug("GetLatestNonceForRootKey", "rootKey", rootKey) + result, err := l.contract.GetLatestNonceForRootKey(nil, rootKey) + if err != nil { + getLatestNonceCalls.FailInc() + log.Error("GetLatestNonceForRootKey", "rootKey", rootKey, "error", err) + return nil, WrapRiverError(Err_CANNOT_CALL_CONTRACT, err) + } + getLatestNonceCalls.PassInc() + log.Debug("GetLatestNonceForRootKey", "rootKey", rootKey, "result", result) + return result, nil +} + +func (l *WalletLink) CheckIfLinked(ctx context.Context, rootKey common.Address, wallet common.Address) (bool, error) { + log := dlog.FromCtx(ctx) + start := time.Now() + defer infra.StoreExecutionTimeMetrics("CheckIfLinked", infra.CONTRACT_CALLS_CATEGORY, start) + log.Debug("CheckIfLinked", "rootKey", rootKey, "wallet", wallet) + result, err := l.contract.CheckIfLinked(nil, rootKey, wallet) + if err != nil { + checkIfLinkedCalls.FailInc() + log.Error("CheckIfLinked", "rootKey", rootKey, "wallet", wallet, "error", err) + return false, WrapRiverError(Err_CANNOT_CALL_CONTRACT, err) + } + checkIfLinkedCalls.PassInc() + log.Debug("CheckIfLinked", "rootKey", rootKey, "wallet", wallet, "result", result) + return result, nil +} diff --git a/core/node/base/convert.go b/core/node/base/convert.go new file mode 100644 index 000000000..ec6cf5665 --- /dev/null +++ b/core/node/base/convert.go @@ -0,0 +1,32 @@ +package base + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/protocol" +) + +func BytesToAddress(bytes []byte) (common.Address, error) { + if len(bytes) == 20 { + return common.BytesToAddress(bytes), nil + } + + return common.Address{}, RiverError( + Err_BAD_ADDRESS, + "Bad address bytes", + "address", fmt.Sprintf("%x", bytes), + ).Func("BytesToAddress") +} + +func AddressStrToEthAddress(address string) (common.Address, error) { + if common.IsHexAddress(address) { + return common.HexToAddress(address), nil + } + return common.Address{}, RiverError( + Err_BAD_ADDRESS, + "Bad address string", + "address", + address, + ).Func("AddressStrToEthAddress") +} diff --git a/core/node/base/debug_settings.go b/core/node/base/debug_settings.go new file mode 100644 index 000000000..f437cf407 --- /dev/null +++ b/core/node/base/debug_settings.go @@ -0,0 +1,27 @@ +package base + +import ( + "os" + "strings" +) + +func isOn(val string) bool { + val = strings.ToLower(val) + return val == "1" || val == "true" || val == "yes" || val == "on" || val == "y" +} + +var debugCorruptionPrint = func() bool { + return isOn(os.Getenv("DEBUG_CORRUPTION_PRINT")) +}() + +var debugCorruptionExit = func() bool { + return isOn(os.Getenv("DEBUG_CORRUPTION_EXIT")) +}() + +func DebugCorruptionPrint() bool { + return debugCorruptionPrint +} + +func DebugCorruptionExit() bool { + return debugCorruptionExit +} diff --git a/core/node/base/error.go b/core/node/base/error.go new file mode 100644 index 000000000..df22057aa --- /dev/null +++ b/core/node/base/error.go @@ -0,0 +1,393 @@ +// See [conventions.md](../conventions.md) for usage examples. +// TODO: use formatter for dlog for value formatting instead of fmt. + +package base + +import ( + "context" + "encoding/hex" + "errors" + "fmt" + "log/slog" + "os" + "runtime" + "strconv" + "strings" + + "connectrpc.com/connect" + "github.com/river-build/river/core/node/protocol" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/rpc" +) + +// Constants are not exported when go bindings are generated from solidity, so there is duplication here. +const ( + ContractErrorStreamNotFound = "NOT_FOUND" + ContractErrorNodeNotFound = "NODE_NOT_FOUND" + ContractErrorAlreadyExists = "ALREADY_EXISTS" + ContractErrorOutOfBounds = "OUT_OF_BOUNDS" +) + +// Without this limit, go's http reader fails and replaces actual +// error with "http: suspiciously long trailer after chunked body". +const CONNECT_ERROR_MESSAGE_LIMIT = 1500 + +const RIVER_ERROR_HEADER = "X-River-Error" + +var isDebugCallStack bool + +func init() { + _, isDebugCallStack = os.LookupEnv("RIVER_DEBUG_CALLSTACK") +} + +func FormatCallstack(skip int) string { + pc := make([]uintptr, 32) + n := runtime.Callers(skip, pc) + if n == 0 { + return "" + } + + pc = pc[:n] + frames := runtime.CallersFrames(pc) + + var frame runtime.Frame + more := true + var sb strings.Builder + sb.WriteString("Callstack:\n") + for more { + frame, more = frames.Next() + + sb.WriteString(" ") + sb.WriteString(frame.Function) + sb.WriteString(" ") + sb.WriteString(frame.File) + sb.WriteString(":") + sb.WriteString(strconv.Itoa(frame.Line)) + sb.WriteString("\n") + } + return sb.String() +} + +func RiverError(code protocol.Err, msg string, tags ...any) *RiverErrorImpl { + e := &RiverErrorImpl{ + Code: code, + Msg: msg, + } + if len(tags) > 0 { + _ = e.Tags(tags...) + } + if isDebugCallStack { + _ = e.Tag("callstack", FormatCallstack(3)) + } + return e +} + +type RiverErrorImpl struct { + Code protocol.Err + Msg string + NamedTags []RiverErrorTag + Base error + Funcs []string +} + +type RiverErrorTag struct { + Name string + Value any +} + +func (e *RiverErrorImpl) Error() string { + var sb strings.Builder + e.WriteMessage(&sb) + for _, tag := range e.NamedTags { + WriteTag(&sb, tag) + } + return sb.String() +} + +func (e *RiverErrorImpl) WriteMessage(sb *strings.Builder) { + for i := len(e.Funcs) - 1; i >= 0; i-- { + sb.WriteString(e.Funcs[i]) + sb.WriteString(": ") + } + + sb.WriteByte('(') + sb.WriteString(strconv.Itoa(int(e.Code))) + sb.WriteByte(':') + sb.WriteString(e.Code.String()) + sb.WriteByte(')') + sb.WriteByte(' ') + + if e.Msg != "" { + sb.WriteString(e.Msg) + } + + if e.Base != nil { + if e.Msg != "" { + sb.WriteString(" base_error: ") + } + sb.WriteString(e.Base.Error()) + } +} + +func (e *RiverErrorImpl) GetMessage() string { + var sb strings.Builder + e.WriteMessage(&sb) + return sb.String() +} + +func WriteTag(sb *strings.Builder, tag RiverErrorTag) { + sb.WriteString("\n ") + sb.WriteString(tag.Name) + sb.WriteString(" = ") + if goStringer, ok := tag.Value.(fmt.GoStringer); ok { + sb.WriteString(goStringer.GoString()) + } else if byteSlice, ok := tag.Value.([]byte); ok { + sb.WriteString(hex.EncodeToString(byteSlice)) + } else if byteSlicePtr, ok := tag.Value.(*[]byte); ok { + sb.WriteString(hex.EncodeToString(*byteSlicePtr)) + } else { + sb.WriteString(fmt.Sprint(tag.Value)) + } +} + +func (e *RiverErrorImpl) Tag(name string, value any) *RiverErrorImpl { + e.NamedTags = append(e.NamedTags, RiverErrorTag{ + Name: name, + Value: value, + }) + return e +} + +func (e *RiverErrorImpl) Tags(v ...any) *RiverErrorImpl { + i := 0 + for i+1 < len(v) { + if str, ok := v[i].(string); ok { + _ = e.Tag(str, v[i+1]) + i += 2 + } else { + _ = e.Tag("!BAD_TAG_NAME", v[i]) + i++ + } + } + if i < len(v) { + _ = e.Tag("!LAST_TAG_NO_NAME", v[i]) + } + return e +} + +func (e *RiverErrorImpl) Func(method string) *RiverErrorImpl { + e.Funcs = append(e.Funcs, method) + return e +} + +func (e *RiverErrorImpl) Message(msg string) *RiverErrorImpl { + if e.Msg == "" { + e.Msg = msg + } else { + e.Msg += " | " + msg + } + + return e +} + +func IsRiverError(err error) bool { + _, ok := err.(*RiverErrorImpl) + return ok +} + +func IsConnectNetworkError(err error) bool { + if ce, ok := err.(*connect.Error); ok { + return IsConnectNetworkErrorCode(ce.Code()) + } + return false +} + +// IsConnectNetworkError identifies connect codes that indicate a network error occurred during +// a connect call to a downstream client. +func IsConnectNetworkErrorCode(code connect.Code) bool { + return code == connect.CodeUnavailable +} + +// If there is information to be extracted from the error, then code is set accordingly. +// If not, then provided defaultCode is used. +func AsRiverError(err error, defaultCode ...protocol.Err) *RiverErrorImpl { + e, ok := err.(*RiverErrorImpl) + if ok { + return e + } + + code := protocol.Err_UNKNOWN + if len(defaultCode) > 0 { + code = defaultCode[0] + } + + // Map connect errors to river errors + if ce, ok := err.(*connect.Error); ok { + if value, ok := ce.Meta()[RIVER_ERROR_HEADER]; ok && len(value) > 0 { + v, ok := protocol.Err_value[value[0]] + if ok { + code = protocol.Err(v) + } + } + if code == protocol.Err_UNKNOWN { + code = protocol.Err(ce.Code()) + } + // Wrap connect network errors from fanout nodes so they are not propogated back to the + // original caller as is, otherwise this node may seem unavailable. + if IsConnectNetworkErrorCode(ce.Code()) { + code = protocol.Err_DOWNSTREAM_NETWORK_ERROR + } + return &RiverErrorImpl{ + Code: code, + Base: err, + } + } + + // Map contract errors to river errors + if de, ok := err.(rpc.DataError); ok { + var tags []RiverErrorTag + if de.ErrorData() != nil { + hexStr := de.ErrorData().(string) + hexStr = strings.TrimPrefix(hexStr, "0x") + revert, e := hex.DecodeString(hexStr) + if e == nil { + reason, e := abi.UnpackRevert(revert) + if e == nil { + tags = []RiverErrorTag{{"revert_reason", reason}} + if reason == ContractErrorStreamNotFound { + code = protocol.Err_NOT_FOUND + } else if reason == ContractErrorNodeNotFound { + code = protocol.Err_UNKNOWN_NODE + } else if reason == ContractErrorAlreadyExists { + code = protocol.Err_ALREADY_EXISTS + } else if reason == ContractErrorOutOfBounds { + code = protocol.Err_INVALID_ARGUMENT + } + } + } + } + return &RiverErrorImpl{ + Code: code, + Base: err, + Msg: "Contract Returned Error", + NamedTags: tags, + } + } + + if err != nil { + if err == context.Canceled { + code = protocol.Err_CANCELED + } else if err == context.DeadlineExceeded { + code = protocol.Err_DEADLINE_EXCEEDED + } + return &RiverErrorImpl{ + Code: code, + Base: err, + } + } else { + return &RiverErrorImpl{ + Code: protocol.Err_UNKNOWN, + Msg: "nil error", + } + } +} + +// WrapRiverError and AsRiverError became the same: +// If there is information to be extracted from the error, then code is set accordingly. +// If not, then provided code is used. +func WrapRiverError(code protocol.Err, err error) *RiverErrorImpl { + e := AsRiverError(err, code) + return e +} + +func ErrToConnectCode(err protocol.Err) connect.Code { + if err < protocol.Err_CANCELED || err > protocol.Err_UNAUTHENTICATED { + return connect.CodeFailedPrecondition + } + return connect.Code(err) +} + +func (e *RiverErrorImpl) AsConnectError() *connect.Error { + err := connect.NewError(ErrToConnectCode(e.Code), TruncateErrorToConnectLimit(e)) + if str, ok := protocol.Err_name[int32(e.Code)]; ok { + err.Meta()[RIVER_ERROR_HEADER] = []string{str} + } + return err +} + +func (e *RiverErrorImpl) ForEachTag(f func(name string, value any) bool) { + for _, tag := range e.NamedTags { + if !f(tag.Name, tag.Value) { + break + } + } +} + +func (e *RiverErrorImpl) FlattenTags() []any { + var tags []any + for _, tag := range e.NamedTags { + tags = append(tags, tag.Name, tag.Value) + } + return tags +} + +func (e *RiverErrorImpl) GetTag(name string) any { + for _, tag := range e.NamedTags { + if tag.Name == name { + return tag.Value + } + } + return nil +} + +func (e *RiverErrorImpl) LogWithLevel(l *slog.Logger, level slog.Level) *RiverErrorImpl { + // Context for slog is optional, generally in this codebase context is not passed to slog. + var nilContext context.Context + l.Log(nilContext, level, e.GetMessage(), e.FlattenTags()...) + return e +} + +func (e *RiverErrorImpl) Log(l *slog.Logger) *RiverErrorImpl { + return e.LogWithLevel(l, slog.LevelError) +} + +func (e *RiverErrorImpl) LogError(l *slog.Logger) *RiverErrorImpl { + return e.LogWithLevel(l, slog.LevelError) +} + +func (e *RiverErrorImpl) LogWarn(l *slog.Logger) *RiverErrorImpl { + return e.LogWithLevel(l, slog.LevelWarn) +} + +func (e *RiverErrorImpl) LogInfo(l *slog.Logger) *RiverErrorImpl { + return e.LogWithLevel(l, slog.LevelInfo) +} + +func (e *RiverErrorImpl) LogDebug(l *slog.Logger) *RiverErrorImpl { + return e.LogWithLevel(l, slog.LevelDebug) +} + +func ToConnectError(err error) *connect.Error { + if err == nil { + return nil + } + if e, ok := err.(*connect.Error); ok { + return e + } + if e, ok := err.(*RiverErrorImpl); ok { + return e.AsConnectError() + } + return connect.NewError(connect.CodeUnknown, TruncateErrorToConnectLimit(err)) +} + +func TruncateErrorToConnectLimit(err error) error { + if err == nil { + return nil + } + msg := err.Error() + if len(msg) > CONNECT_ERROR_MESSAGE_LIMIT { + return errors.New(msg[:CONNECT_ERROR_MESSAGE_LIMIT]) + } + return err +} diff --git a/core/node/base/error_test.go b/core/node/base/error_test.go new file mode 100644 index 000000000..3c645c9eb --- /dev/null +++ b/core/node/base/error_test.go @@ -0,0 +1,117 @@ +package base + +import ( + "errors" + "fmt" + "testing" + + "connectrpc.com/connect" + "github.com/river-build/river/core/node/base/test" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/protocol" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestRiverError(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + log := dlog.FromCtx(ctx) + + e := RiverError( + protocol.Err_INVALID_ARGUMENT, + "test error", + "int", 1, + "bool", true, + "string", "hello", + "float", 1.0, + "struct", struct { + Value string + AnotherValue int + }{"test", 5}, + "bytes", []byte("test 123213 123123 12312312312 123"), + "error", errors.New("test error"), + ).Func("TestRiverError").Tag("int", 3) + println(e.Error()) + log.Error("test error", "error", e) + _ = e.Log(log) + + e = AsRiverError(errors.New("base error")) + println(e.Error()) + log.Error("test error", "error", e) + _ = e.LogInfo(log) + + e = AsRiverError(e).Func("TestRiverError").Func("TopLevelFunc").Tag("int", 1).LogWarn(log) + log.Warn("test error", "error", e) + + _ = WrapRiverError(protocol.Err_OUT_OF_RANGE, errors.New("test error")). + Func("InnerFunc").Message("inner message"). + Func("OuterFunc").Message("outer message"). + Tag("int", 1). + LogInfo(log) +} + +type testStruct1 struct{} + +func (t *testStruct1) GoString() string { + return "testStruct1" +} + +type testStruct2 struct{} + +func (t testStruct2) GoString() string { + return "testStruct2" +} + +func TestRiverErrorGoString(t *testing.T) { + assert := assert.New(t) + assert.Contains(RiverError(protocol.Err_INTERNAL, "GoStringer", "val", &testStruct1{}).Error(), "testStruct1") + assert.Contains(RiverError(protocol.Err_INTERNAL, "GoStringer", "val", testStruct2{}).Error(), "testStruct2") + assert.Contains(RiverError(protocol.Err_INTERNAL, "GoStringer", "val", &testStruct2{}).Error(), "testStruct2") +} + +func TestRiverErrorBytes(t *testing.T) { + assert := assert.New(t) + slice := []byte{1, 2, 3, 15} + err := RiverError(protocol.Err_INTERNAL, "bytes", "val", slice) + println(err.Error()) + assert.Contains(err.Error(), "0102030f") + err = RiverError(protocol.Err_INTERNAL, "bytesPtr", "val", &slice) + println(err.Error()) + assert.Contains(err.Error(), "0102030f") +} + +func TestRiverErrorWrapsConnectNetworkingError(t *testing.T) { + connectErr := connect.NewError(connect.CodeUnavailable, fmt.Errorf("node unavailable")) + wrappedConnectError := AsRiverError(connectErr).AsConnectError() + + require.Equal(t, connect.CodeFailedPrecondition, wrappedConnectError.Code()) + require.Equal(t, "DOWNSTREAM_NETWORK_ERROR", wrappedConnectError.Meta().Values(RIVER_ERROR_HEADER)[0]) +} + +func TestIsConnectNetworkError(t *testing.T) { + tests := map[string]struct { + err error + isNetworkError bool + }{ + "connect network error (unavailable)": { + err: connect.NewError(connect.CodeUnavailable, fmt.Errorf("node unavailable")), + isNetworkError: true, + }, + "river downstream network error": { + err: RiverError(protocol.Err_DOWNSTREAM_NETWORK_ERROR, "downstream network error"), + isNetworkError: false, + }, + "propogated connect network error": { + err: AsRiverError( + connect.NewError(connect.CodeUnavailable, fmt.Errorf("node unavailable")), + ).AsConnectError(), + isNetworkError: false, + }, + } + for name, tc := range tests { + t.Run(name, func(t *testing.T) { + require.Equal(t, tc.isNetworkError, IsConnectNetworkError(tc.err)) + }) + } +} diff --git a/core/node/base/hash_format.go b/core/node/base/hash_format.go new file mode 100644 index 000000000..7120f0a05 --- /dev/null +++ b/core/node/base/hash_format.go @@ -0,0 +1,106 @@ +package base + +import ( + "strings" + + "github.com/ethereum/go-ethereum/common" + "github.com/river-build/river/core/node/protocol" +) + +const ( + hextable = "0123456789abcdef" +) + +func encodeHexFromBytes(dst *strings.Builder, src []byte) { + for _, v := range src { + dst.WriteByte(hextable[v>>4]) + dst.WriteByte(hextable[v&0x0f]) + } +} + +func encodeHexFromString(dst *strings.Builder, src string) { + for i := 0; i < len(src); i++ { + v := src[i] + dst.WriteByte(hextable[v>>4]) + dst.WriteByte(hextable[v&0x0f]) + } +} + +// TODO: rename to FormatShortHashXXX +func FormatHashFromBytesToSB(dst *strings.Builder, src []byte) { + if len(src) <= 5 { + encodeHexFromBytes(dst, src) + } else { + encodeHexFromBytes(dst, src[:2]) + dst.WriteByte('.') + dst.WriteByte('.') + encodeHexFromBytes(dst, src[len(src)-2:]) + } +} + +func FormatHashFromStringToSB(dst *strings.Builder, src string) { + if len(src) <= 5 { + encodeHexFromString(dst, src) + } else { + encodeHexFromString(dst, src[:2]) + dst.WriteByte('.') + dst.WriteByte('.') + encodeHexFromString(dst, src[len(src)-2:]) + } +} + +func FormatHash(h common.Hash) string { + return FormatHashFromBytes(h[:]) +} + +func FormatHashFromBytes(src []byte) string { + var dst strings.Builder + dst.Grow(10) + FormatHashFromBytesToSB(&dst, src) + return dst.String() +} + +func FormatHashFromString(src string) string { + var dst strings.Builder + dst.Grow(10) + FormatHashFromStringToSB(&dst, src) + return dst.String() +} + +func FormatEnvelopeHashes(envelopes []*protocol.Envelope) string { + var dst strings.Builder + dst.Grow(11 * len(envelopes)) + for i, e := range envelopes { + if i > 0 { + dst.WriteByte(' ') + } + FormatHashFromBytesToSB(&dst, e.Hash) + } + return dst.String() +} + +func FormatFullHashFromBytesToSB(dst *strings.Builder, src []byte) { + encodeHexFromBytes(dst, src) +} + +func FormatFullHashFromStringToSB(dst *strings.Builder, src string) { + encodeHexFromString(dst, src) +} + +func FormatFullHash(h common.Hash) string { + return FormatFullHashFromBytes(h[:]) +} + +func FormatFullHashFromBytes(src []byte) string { + var dst strings.Builder + dst.Grow(64) + FormatFullHashFromBytesToSB(&dst, src) + return dst.String() +} + +func FormatFullHashFromString(src string) string { + var dst strings.Builder + dst.Grow(64) + FormatFullHashFromStringToSB(&dst, src) + return dst.String() +} diff --git a/core/node/base/nanoid.go b/core/node/base/nanoid.go new file mode 100644 index 000000000..3a24c80dd --- /dev/null +++ b/core/node/base/nanoid.go @@ -0,0 +1,13 @@ +package base + +import ( + gonanoid "github.com/matoous/go-nanoid" +) + +func GenNanoid() string { + return gonanoid.MustID(21) +} + +func GenShortNanoid() string { + return gonanoid.MustID(12) +} diff --git a/core/node/base/test/context.go b/core/node/base/test/context.go new file mode 100644 index 000000000..737fbf7c6 --- /dev/null +++ b/core/node/base/test/context.go @@ -0,0 +1,34 @@ +package test + +import ( + "context" + "log/slog" + "os" + + "github.com/river-build/river/core/node/dlog" +) + +func NewTestContext() (context.Context, context.CancelFunc) { + logLevel := os.Getenv("RIVER_TEST_LOG") + var handler slog.Handler + if logLevel == "" { + handler = &dlog.NullHandler{} + } else { + var level slog.Level + err := level.UnmarshalText([]byte(logLevel)) + if err != nil { + level = slog.LevelInfo + } + handler = dlog.NewPrettyTextHandler( + os.Stdout, + &dlog.PrettyHandlerOptions{ + Level: level, + PrintLongTime: false, + Colors: dlog.ColorMap_Enabled, + }, + ) + } + //lint:ignore LE0000 context.Background() used correctly + ctx := dlog.CtxWithLog(context.Background(), slog.New(handler)) + return context.WithCancel(ctx) +} diff --git a/core/node/bin/.gitignore b/core/node/bin/.gitignore new file mode 100644 index 000000000..8f12d44bf --- /dev/null +++ b/core/node/bin/.gitignore @@ -0,0 +1,4 @@ +# Contains build artifacts and other files that should not be committed. +# Ignore all files and subdirectories in this directory. +* +!.gitignore diff --git a/core/node/cmd/archive_cmd.go b/core/node/cmd/archive_cmd.go new file mode 100644 index 000000000..a0edd4ce9 --- /dev/null +++ b/core/node/cmd/archive_cmd.go @@ -0,0 +1,37 @@ +package cmd + +import ( + "context" + + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/rpc" + + "github.com/spf13/cobra" +) + +func runArchive(cfg *config.Config, once bool) error { + ctx := context.Background() // lint:ignore context.Background() is fine here + err := runMetricsAndProfiler(ctx, cfg) + if err != nil { + return err + } + return rpc.RunArchive(ctx, cfg, once) +} + +func init() { + cmdArch := &cobra.Command{ + Use: "archive", + Short: "Runs the node in archive mode", + RunE: func(cmd *cobra.Command, args []string) error { + once, err := cmd.Flags().GetBool("once") + if err != nil { + return err + } + return runArchive(cmdConfig, once) + }, + } + + cmdArch.Flags().Bool("once", false, "Run the archiver once and exit") + + rootCmd.AddCommand(cmdArch) +} diff --git a/core/node/cmd/config_cmd.go b/core/node/cmd/config_cmd.go new file mode 100644 index 000000000..deea5cfe3 --- /dev/null +++ b/core/node/cmd/config_cmd.go @@ -0,0 +1,45 @@ +package cmd + +import ( + "fmt" + + "github.com/mitchellh/mapstructure" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "gopkg.in/yaml.v3" +) + +func init() { + cmd := &cobra.Command{ + Use: "config", + Short: "Print config", + Run: func(cmd *cobra.Command, args []string) { + fmt.Println("Viper settings:") + fmt.Println() + + for key, value := range viper.AllSettings() { + fmt.Printf("%s: %v\n", key, value) + } + + fmt.Println() + fmt.Println("Resulting config:") + fmt.Println() + + configMap := make(map[string]interface{}) + if err := mapstructure.Decode(cmdConfig, &configMap); err != nil { + fmt.Printf("Failed to decode config struct: %v\n", err) + return + } + + yamlData, err := yaml.Marshal(configMap) + if err != nil { + fmt.Printf("Failed to marshal config map to YAML: %v\n", err) + return + } + + fmt.Println(string(yamlData)) + }, + } + + rootCmd.AddCommand(cmd) +} diff --git a/core/node/cmd/genkey_cmd.go b/core/node/cmd/genkey_cmd.go new file mode 100644 index 000000000..f1294396d --- /dev/null +++ b/core/node/cmd/genkey_cmd.go @@ -0,0 +1,55 @@ +package cmd + +import ( + "context" + "os" + + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/crypto" + + "github.com/spf13/cobra" +) + +func genkey(cfg *config.Config, overwrite bool) error { + ctx := context.Background() // lint:ignore context.Background() is fine here + + wallet, err := crypto.NewWallet(ctx) + if err != nil { + return err + } + + err = os.MkdirAll(crypto.WALLET_PATH, 0o755) + if err != nil { + return err + } + + err = wallet.SaveWallet( + ctx, + crypto.WALLET_PATH_PRIVATE_KEY, + crypto.WALLET_PATH_PUBLIC_KEY, + crypto.WALLET_PATH_NODE_ADDRESS, + overwrite, + ) + if err != nil { + return err + } + + return nil +} + +func init() { + cmdGenKey := &cobra.Command{ + Use: "genkey", + Short: "Generate a new node key pair", + RunE: func(cmd *cobra.Command, args []string) error { + overwrite, err := cmd.Flags().GetBool("overwrite") + if err != nil { + return err + } + return genkey(cmdConfig, overwrite) + }, + } + cmdGenKey.Flags().Bool("overwrite", false, "Overwrite existing key files") + + rootCmd.AddCommand(cmdGenKey) +} diff --git a/core/node/cmd/info_cmd.go b/core/node/cmd/info_cmd.go new file mode 100644 index 000000000..59da0b49b --- /dev/null +++ b/core/node/cmd/info_cmd.go @@ -0,0 +1,27 @@ +package cmd + +import ( + "context" + + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/rpc" + + "github.com/spf13/cobra" +) + +func runInfo(cfg *config.Config) error { + ctx := context.Background() // lint:ignore context.Background() is fine here + return rpc.RunInfoMode(ctx, cfg) +} + +func init() { + cmd := &cobra.Command{ + Use: "info", + Short: "Runs the node in info mode when only /debug/multi page is available", + RunE: func(cmd *cobra.Command, args []string) error { + return runInfo(cmdConfig) + }, + } + + rootCmd.AddCommand(cmd) +} diff --git a/core/node/cmd/ping_cmd.go b/core/node/cmd/ping_cmd.go new file mode 100644 index 000000000..060466ed5 --- /dev/null +++ b/core/node/cmd/ping_cmd.go @@ -0,0 +1,55 @@ +package cmd + +import ( + "context" + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/nodes" + "github.com/river-build/river/core/node/registries" + "github.com/river-build/river/core/node/rpc" + + "github.com/spf13/cobra" +) + +func runPing(cfg *config.Config) error { + ctx := context.Background() // lint:ignore context.Background() is fine here + + blockchain, err := crypto.NewBlockchain(ctx, &cfg.RiverChain, nil) + if err != nil { + return err + } + + registryContract, err := registries.NewRiverRegistryContract(ctx, blockchain, &cfg.RegistryContract) + if err != nil { + return err + } + + nodeRegistry, err := nodes.LoadNodeRegistry( + ctx, registryContract, common.Address{}, blockchain.InitialBlockNum, blockchain.ChainMonitor) + if err != nil { + return err + } + + result, err := rpc.GetRiverNetworkStatus(ctx, cfg, nodeRegistry, blockchain) + if err != nil { + return err + } + + fmt.Println(result.ToPrettyJson()) + return nil +} + +func init() { + cmd := &cobra.Command{ + Use: "ping", + Short: "Pings all nodes in the network based on config and print the results as JSON", + RunE: func(cmd *cobra.Command, args []string) error { + return runPing(cmdConfig) + }, + } + + rootCmd.AddCommand(cmd) +} diff --git a/core/node/cmd/registry_cmd.go b/core/node/cmd/registry_cmd.go new file mode 100644 index 000000000..3516757a5 --- /dev/null +++ b/core/node/cmd/registry_cmd.go @@ -0,0 +1,173 @@ +package cmd + +import ( + "context" + "fmt" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/contracts" + "github.com/river-build/river/core/node/crypto" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/registries" + . "github.com/river-build/river/core/node/shared" + + "github.com/spf13/cobra" +) + +func srdump(cfg *config.Config, countOnly bool) error { + ctx := context.Background() // lint:ignore context.Background() is fine here + blockchain, err := crypto.NewBlockchain(ctx, &cfg.RiverChain, nil) + if err != nil { + return err + } + + registryContract, err := registries.NewRiverRegistryContract(ctx, blockchain, &cfg.RegistryContract) + if err != nil { + return err + } + fmt.Printf("Using block number: %d\n", blockchain.InitialBlockNum) + + streamNum, err := registryContract.GetStreamCount(ctx, blockchain.InitialBlockNum) + if err != nil { + return err + } + fmt.Printf("Stream count reported: %d\n", streamNum) + + if countOnly { + return nil + } + + streams, err := registryContract.GetAllStreams(ctx, blockchain.InitialBlockNum) + if err != nil { + return err + } + + for i, strm := range streams { + s := fmt.Sprintf("%4d %s", i, strm.StreamId.String()) + fmt.Printf("%-69s %4d, %s\n", s, strm.LastMiniblockNum, strm.LastMiniblockHash.Hex()) + for _, node := range strm.Nodes { + fmt.Printf(" %s\n", node.Hex()) + } + } + + if streamNum != int64(len(streams)) { + return RiverError( + Err_INTERNAL, + "Stream count mismatch", + "GetStreamCount", + streamNum, + "GetAllStreams", + len(streams), + ) + } + + return nil +} + +func srstream(cfg *config.Config, streamId string) error { + ctx := context.Background() // lint:ignore context.Background() is fine here + + blockchain, err := crypto.NewBlockchain(ctx, &cfg.RiverChain, nil) + if err != nil { + return err + } + + registryContract, err := registries.NewRiverRegistryContract(ctx, blockchain, &cfg.RegistryContract) + if err != nil { + return err + } + + id, err := StreamIdFromString(streamId) + if err != nil { + return err + } + + stream, err := registryContract.GetStream(ctx, id) + if err != nil { + return err + } + + fmt.Printf("StreamId: %s\n", stream.StreamId.String()) + fmt.Printf("Miniblock: %d %s\n", stream.LastMiniblockNum, stream.LastMiniblockHash.Hex()) + fmt.Println("IsSealed: ", stream.IsSealed) + fmt.Println("Nodes:") + for i, node := range stream.Nodes { + fmt.Printf(" %d %s\n", i, node) + } + + return nil +} + +func nodesdump(cfg *config.Config) error { + ctx := context.Background() // lint:ignore context.Background() is fine here + + blockchain, err := crypto.NewBlockchain(ctx, &cfg.RiverChain, nil) + if err != nil { + return err + } + + registryContract, err := registries.NewRiverRegistryContract(ctx, blockchain, &cfg.RegistryContract) + if err != nil { + return err + } + + nodes, err := registryContract.GetAllNodes(ctx, blockchain.InitialBlockNum) + if err != nil { + return err + } + + for i, node := range nodes { + fmt.Printf( + "%4d %s %s %d (%-11s) %s\n", + i, + node.NodeAddress.Hex(), + node.Operator.Hex(), + node.Status, + contracts.NodeStatusString(node.Status), + node.Url, + ) + } + + return nil +} + +func init() { + srCmd := &cobra.Command{ + Use: "registry", + Aliases: []string{"reg"}, + Short: "Stream registry management commands", + } + rootCmd.AddCommand(srCmd) + + streamsCmd := &cobra.Command{ + Use: "streams", + Short: "Dump stream records", + RunE: func(cmd *cobra.Command, args []string) error { + countOnly, err := cmd.Flags().GetBool("count") + if err != nil { + return err + } + return srdump(cmdConfig, countOnly) + }, + } + streamsCmd.Flags().Bool("count", false, "Only print the stream count") + srCmd.AddCommand(streamsCmd) + + srCmd.AddCommand(&cobra.Command{ + Use: "stream ", + Short: "Get stream info from stream registry", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + return srstream(cmdConfig, args[0]) + }, + }) + + srCmd.AddCommand(&cobra.Command{ + Use: "nodes", + Short: "Get node records from the registry contract", + RunE: func(cmd *cobra.Command, args []string) error { + return nodesdump(cmdConfig) + }, + }) +} diff --git a/core/node/cmd/root_cmd.go b/core/node/cmd/root_cmd.go new file mode 100644 index 000000000..5ff040f59 --- /dev/null +++ b/core/node/cmd/root_cmd.go @@ -0,0 +1,130 @@ +package cmd + +import ( + "fmt" + "os" + "strings" + + "github.com/mitchellh/mapstructure" + + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/infra" + + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +var configFile string + +var ( + logLevel string + logFile string + logToConsole bool + logNoColor bool +) + +var cmdConfig *config.Config + +var rootCmd = &cobra.Command{ + Use: "river_node", + Short: "River Protocol Node", + SilenceUsage: true, // Do not print usage when an error occurs +} + +func Execute() { + err := rootCmd.Execute() + if err != nil { + if err.Error() == "info_debug_exit" { + fmt.Println("Exiting with code 22 to initiate a restart") + os.Exit(22) + return + } + os.Exit(1) + } +} + +func initConfigAndLog() { + if configFile != "" { + viper.SetConfigFile(configFile) + + // This is needed to allow for nested config values to be set via environment variables + // For example: METRICS__ENABLED=true, METRICS__PORT=8080 + viper.SetEnvKeyReplacer(strings.NewReplacer(".", "__")) + viper.AutomaticEnv() + + if err := viper.ReadInConfig(); err != nil { + fmt.Printf("Failed to read config file, file=%v, error=%v\n", configFile, err) + } + + var ( + configStruct config.Config + decodeHooks = mapstructure.ComposeDecodeHookFunc( + config.DecodeAddressOrAddressFileHook(), + config.DecodeDurationHook(), + ) + ) + + if err := viper.Unmarshal(&configStruct, viper.DecodeHook(decodeHooks)); err != nil { + fmt.Printf("Failed to unmarshal config, error=%v\n", err) + } + + if configStruct.Log.Format == "" { + configStruct.Log.Format = "text" + } + + if logLevel != "" { + configStruct.Log.Level = logLevel + } + if logFile != "default" { + if logFile != "none" { + configStruct.Log.File = logFile + } else { + configStruct.Log.File = "" + } + } + if logToConsole { + configStruct.Log.Console = true + } + if logNoColor { + configStruct.Log.NoColor = true + } + + // If loaded successfully, set the global config + cmdConfig = &configStruct + infra.InitLogFromConfig(&cmdConfig.Log) + } else { + fmt.Println("No config file specified") + } +} + +func init() { + cobra.OnInitialize(initConfigAndLog) + rootCmd.PersistentFlags(). + StringVarP(&configFile, "config", "c", "./config/config.yaml", "Path to the configuration file") + + rootCmd.PersistentFlags().StringVarP( + &logLevel, + "log_level", + "l", + "", + "Override log level (options: trace, debug, info, warn, error, panic, fatal)", + ) + rootCmd.PersistentFlags().StringVar( + &logFile, + "log_file", + "default", + "Override log file ('default' to use the one specified in the config file, 'none' to disable logging to file)", + ) + rootCmd.PersistentFlags().BoolVar( + &logToConsole, + "log_to_console", + false, + "Override log to console (true to log to console, false to use the one specified in the config file)", + ) + rootCmd.PersistentFlags().BoolVar( + &logNoColor, + "log_no_color", + false, + "Override log color (true to disable color, false to use the one specified in the config file)", + ) +} diff --git a/core/node/cmd/run_cmd.go b/core/node/cmd/run_cmd.go new file mode 100644 index 000000000..710611ed1 --- /dev/null +++ b/core/node/cmd/run_cmd.go @@ -0,0 +1,150 @@ +package cmd + +import ( + "context" + "fmt" + "os" + "runtime/pprof" + "strings" + "time" + + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/infra" + "github.com/river-build/river/core/node/node/version" + "github.com/river-build/river/core/node/rpc" + + "github.com/spf13/cobra" + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "gopkg.in/DataDog/dd-trace-go.v1/profiler" +) + +func runMetricsAndProfiler(ctx context.Context, cfg *config.Config) error { + if cfg.Metrics.Enabled { + go infra.StartMetricsService(ctx, cfg.Metrics) + } + + // we overwrite the DD_TAGS environment variable, because this is the best way to pass them down to the tracer + setDDTagsEnv() + + if cfg.PerformanceTracking.TracingEnabled { + if os.Getenv("DD_TAGS") != "" { + fmt.Println("Starting Datadog tracer") + tracer.Start( + tracer.WithEnv(getEnvFromDDTags()), + tracer.WithService("river-node"), + tracer.WithServiceVersion(version.GetFullVersion()), + // tracer.WithGlobalTag(t1, v1), + // tracer.WithGlobalTag(t2, v2), + // .. + // ^ falling back to DD_TAGS env var + ) + // defer tracer.Stop() + } else { + fmt.Println("Tracing was enabled, but DD_ENV was not set. Tracing will not be enabled.") + } + } else { + fmt.Println("Tracing disabled") + } + if cfg.PerformanceTracking.ProfilingEnabled { + if os.Getenv("DD_TAGS") != "" { + fmt.Println("Starting Datadog profiler") + + err := profiler.Start( + profiler.WithEnv(getEnvFromDDTags()), + profiler.WithService("river-node"), + profiler.WithVersion(version.GetFullVersion()), + profiler.WithProfileTypes( + profiler.CPUProfile, + profiler.HeapProfile, + profiler.BlockProfile, + profiler.MutexProfile, + profiler.GoroutineProfile, + ), + // profiler.WithTags(setDDTags()), + // ^ falling back to DD_TAGS env var + ) + if err != nil { + fmt.Println("Error starting profiling", err) + return err + } + // defer profiler.Stop() + } else { + fmt.Println("Starting pprof profiler") + folderPath := "./profiles" + + if _, err := os.Stat(folderPath); os.IsNotExist(err) { + err := os.Mkdir(folderPath, 0o755) + if err != nil { + fmt.Println("Error creating profiling folder:", err) + return err + } + } + + currentTime := time.Now() + + dateTimeFormat := "20060102150405" + formattedDateTime := currentTime.Format(dateTimeFormat) + + filename := fmt.Sprintf("profile_%s.prof", formattedDateTime) + file, err := os.Create("profiles/" + filename) + if err != nil { + fmt.Println("Error creating file", err) + return err + } + err = pprof.StartCPUProfile(file) + if err != nil { + fmt.Println("Error starting profiling", err) + return err + } + // defer pprof.StopCPUProfile() + } + } else { + fmt.Println("Profiling disabled") + } + return nil +} + +func runServer(cfg *config.Config) error { + ctx := context.Background() // lint:ignore context.Background() is fine here + err := runMetricsAndProfiler(ctx, cfg) + if err != nil { + return err + } + return rpc.RunServer(ctx, cfg) +} + +// overwrites the DD_TAGS environment variable to include the commit, version and branch +func setDDTagsEnv() { + ddTags := os.Getenv("DD_TAGS") + if ddTags != "" { + ddTags += "," + } + ddTags += "commit:" + version.GetCommit() + ",version_slim:" + version.GetVersion() + ",branch:" + version.GetBranch() + os.Setenv("DD_TAGS", ddTags) +} + +func getEnvFromDDTags() string { + ddTags := os.Getenv("DD_TAGS") + if ddTags == "" { + return "" + } + tags := strings.Split(ddTags, ",") + for _, tag := range tags { + if strings.HasPrefix(tag, "env:") { + return strings.TrimPrefix(tag, "env:") + } + } + return "" +} + +func init() { + cmd := &cobra.Command{ + Use: "run", + Short: "Runs the node", + RunE: func(cmd *cobra.Command, args []string) error { + return runServer(cmdConfig) + }, + } + + rootCmd.AddCommand(cmd) +} diff --git a/core/node/cmd/version_cmd.go b/core/node/cmd/version_cmd.go new file mode 100644 index 000000000..e83b9ad1a --- /dev/null +++ b/core/node/cmd/version_cmd.go @@ -0,0 +1,22 @@ +package cmd + +import ( + "fmt" + + "github.com/spf13/cobra" + + "github.com/river-build/river/core/node/node/version" +) + +func init() { + cmd := &cobra.Command{ + Use: "version", + Short: "Print version information", + RunE: func(cmd *cobra.Command, args []string) error { + fmt.Println(version.GetFullVersion()) + return nil + }, + } + + rootCmd.AddCommand(cmd) +} diff --git a/core/node/config-template.yaml b/core/node/config-template.yaml new file mode 100644 index 000000000..7a1298f6e --- /dev/null +++ b/core/node/config-template.yaml @@ -0,0 +1,104 @@ +# Network configuration +port: +database: + url: postgres://postgres:postgres@localhost:/river?sslmode=disable&pool_max_conns=1000 + database: '' + user: '' + password: '' + port: '' + extra: '' + host: '' +storageType: postgres + +# Certificates for TLS +TLSConfig: + cert: certs/cert.pem + key: certs/key.pem +UseHttps: true + +# Blockchain configuration +baseChain: + chainId: 31337 + networkUrl: 'http://127.0.0.1:8545' + blockTimeMs: +riverChain: + chainId: 31338 + networkUrl: 'http://127.0.0.1:8546' + blockTimeMs: + transactionPool: + # transactionTimeout specifies the duration after which a pending transaction is replaced. Recommended is a + # multiple of the chain block period. If not specified the node uses blockTimeMs, if that is not set it tries + # to estimate the block period based on the 2 last blocks and sets Timeout to 3 * chain.BlockPeriod. + transactionTimeout: 6s + # gasFeeCap is a hard limit for the max price per gas in EIP1559 transactions (in Wei) + gasFeeCap: 150_000_000_000 # 150 Gwei + # The miner tip increase (%) for EIP-1559 replacement transactions. + # Nodes typically accept replacement transactions with at least a 10% miner tip increase. + minerTipFeeReplacementPercentage: 10 + # The gas price increase (%) for legacy replacement transactions. + # Nodes typically accept legacy replacement transactions with at least a 10% gas fee increase. + gasFeeIncreasePercentage: 10 + +# Base contracts +architectContract: + address: + version: 'dev' + +# River contracts +registryContract: + address: + version: '' # Explicitely uses IRiverRegistryV1 interface + +# Logging +log: + file: logs/dev.log + level: + console: true + noColor: + format: text + +# Metrics +metrics: + enabled: + port: +performanceTracking: + profilingEnabled: false + tracingEnabled: false + +# Stream settings +stream: + media: + maxChunkCount: 10 # max number of chunks in a media stream + maxChunkSize: 500000 # max number of bytes in a single chunk + streamMembershipLimits: + 77: 6 # GDMs + 88: 2 # DMs + recencyConstraints: + # Each event must be unique and reference the hash of a previous miniblock + # If the hash is not of the most recent block, the referenced miniblock must be less than M seconds old. + ageSeconds: 11 + # The node will load M generation miniblocks before the most recent snapshot + generations: 5 + replicationFactor: + defaultMinEventsPerSnapshot: 100 + minEventsPerSnapshot: + # stream prefixes should be lower case because go is lower casing them anyway + a8: 10 # USER + ad: 10 # USER_DEVICE_KEY + a1: 10 # USER_INBOX + a5: 10 # USER_SETTINGS + # Timeout after streams with no activity in the cache are expired and evicted + # valid time unites are "ns", "us" (or "µs"), "ms", "s", "m", "h" + # Set to 0 to disable cache expiration + cacheExpiration: 5m + # Interval to check for inactive streams in the cache (default=cacheExpiration/10) + # valid time unites are "ns", "us" (or "µs"), "ms", "s", "m", "h" + cacheExpirationPollInterval: 30s + +network: + numRetries: 3 + # Make this nice and long to not break anything. + requestTimeout: 30s + +# Debug feature flags. +disableBaseChain: diff --git a/core/node/config/config.go b/core/node/config/config.go new file mode 100644 index 000000000..12c8baf3d --- /dev/null +++ b/core/node/config/config.go @@ -0,0 +1,241 @@ +package config + +import ( + "encoding/hex" + "time" + + "github.com/ethereum/go-ethereum/common" + infra "github.com/river-build/river/core/node/infra/config" + "github.com/river-build/river/core/node/shared" +) + +type TLSConfig struct { + Cert string // Path to certificate file or BASE64 encoded certificate + Key string `dlog:"omit" json:"-"` // Path to key file or BASE64 encoded key. Sensitive data, omitted from logging. + TestCA string // Path to CA certificate file or BASE64 encoded CA certificate +} + +// Viper uses mapstructure module to marshal settings into config struct. +type Config struct { + // Network + // 0 can be used in tests to elect a free available port. + Port int + // DNS name of the node. Used to select interface to listen on. Can be empty. + Address string + + UseHttps bool // If TRUE TLSConfig must be set. + TLSConfig TLSConfig + + // Storage + Database DatabaseConfig + StorageType string + + // Blockchain configuration + BaseChain ChainConfig + RiverChain ChainConfig + + // Base chain contract configuration + ArchitectContract ContractConfig + + // Contract configuration + RegistryContract ContractConfig + + // Logging + Log infra.LogConfig + + // Metrics + Metrics infra.MetricsConfig + PerformanceTracking PerformanceTrackingConfig + + // Stream configuration + Stream StreamConfig + + // Network configuration + Network NetworkConfig + + // Go in stand-by mode on start checking if public address resolves to this node instance. + // This allows to reduce downtime when new version of the node is deployed in the new container or VM. + // Depending on the network routing configuration this approach may not work. + StandByOnStart bool + StandByPollPeriod time.Duration + + // ShutdownTimeout is the time the node waits for the graceful shutdown of the server. + // Then all active connections are closed and the node exits. + // If StandByOnStart is true, it's recommended to set it to the half of DatabaseConfig.StartupDelay. + // If set to 0, then default value is used. To disable the timeout set to 1ms or less. + ShutdownTimeout time.Duration + + // Graffiti is returned in status and info requests. + Graffiti string + + // Should be set if node is run in archive mode. + Archive ArchiveConfig + + // Feature flags + // Used to disable functionality for some testing setups. + + // Disable base chain contract usage. + DisableBaseChain bool + EnableTestAPIs bool +} + +type NetworkConfig struct { + NumRetries int + // RequestTimeout only applies to unary requests. + RequestTimeout time.Duration + + // If unset or <= 0, 5 seconds is used. + HttpRequestTimeout time.Duration +} + +func (nc *NetworkConfig) GetHttpRequestTimeout() time.Duration { + if nc.HttpRequestTimeout <= 0 { + return 5 * time.Second + } + return nc.HttpRequestTimeout +} + +type DatabaseConfig struct { + Url string `dlog:"omit" json:"-"` // Sensitive data, omitted from logging. + Host string + Port int + User string + Password string `dlog:"omit" json:"-"` // Sensitive data, omitted from logging. + Database string + Extra string + StreamingConnectionsRatio float32 + + // StartupDelay is the time the node waits between taking control of the database and starting the server + // if other nodes' records are found in the database. + // If StandByOnStart is true, it's recommended to set it to the double of Config.ShutdownTimeout. + // If set to 0, then default value is used. To disable the delay set to 1ms or less. + StartupDelay time.Duration +} + +// TransactionPoolConfig specifies when it is time for a replacement transaction and its gas fee costs. +type TransactionPoolConfig struct { + // TransactionTimeout is the duration in which a transaction must be included in the chain before it is marked + // eligible for replacement. It is advisable to set the timeout as a multiple of the block period. If not set it + // estimates the chains block period and sets Timeout to 3x block period. + TransactionTimeout time.Duration + + // GasFeeCap determines for EIP-1559 transaction the maximum amount fee per gas the node operator is willing to + // pay. If set to 0 the node will use 2 * chain.BaseFee by default. The base fee + miner tip must be below this + // cap, if not the transaction could not be made. + GasFeeCap int + + // MinerTipFeeReplacementPercentage is the percentage the miner tip for EIP-1559 transactions is incremented when + // replaced. Nodes accept replacements only when the miner tip is at least 10% higher than the original transaction. + // The node will add 1 Wei to the miner tip and therefore 10% is the least recommended value. Default is 10. + MinerTipFeeReplacementPercentage int + + // GasFeeIncreasePercentage is the percentage by which the gas fee for legacy transaction is incremented when it is + // replaced. Recommended is >= 10% since nodes typically only accept replacements transactions with at least 10% + // higher gas price. The node will add 1 Wei, therefore 10% will also work. Default is 10. + GasFeeIncreasePercentage int +} + +type ChainConfig struct { + NetworkUrl string + ChainId uint64 + BlockTimeMs uint64 + + TransactionPool TransactionPoolConfig + + // TODO: these need to be removed from here + LinkedWalletsLimit int + ContractCallsTimeoutMs int + PositiveEntitlementCacheSize int + PositiveEntitlementCacheTTLSeconds int + NegativeEntitlementCacheSize int + NegativeEntitlementCacheTTLSeconds int + PositiveEntitlementManagerCacheSize int + PositiveEntitlementManagerCacheTTLSeconds int + NegativeEntitlementManagerCacheSize int + NegativeEntitlementManagerCacheTTLSeconds int +} + +type PerformanceTrackingConfig struct { + ProfilingEnabled bool + TracingEnabled bool +} + +type StreamConfig struct { + Media MediaStreamConfig + StreamMembershipLimits map[string]int + RecencyConstraints RecencyConstraintsConfig + ReplicationFactor int + DefaultMinEventsPerSnapshot int + MinEventsPerSnapshot map[string]int + // CacheExpiration is the interval (secs) after streams with no activity in the cache are expired and evicted + CacheExpiration time.Duration + // CacheExpirationPollIntervalSec is the interval to check for inactive streams in the cache + // (default=CacheExpiration/10) + CacheExpirationPollInterval time.Duration +} + +type MediaStreamConfig struct { + MaxChunkCount int + MaxChunkSize int +} + +type RecencyConstraintsConfig struct { + AgeSeconds int + Generations int +} + +type ContractConfig struct { + // Address of the contract + Address common.Address + // Version of the contract to use. + Version string +} + +type ArchiveConfig struct { + // ArchiveId is the unique identifier of the archive node. Must be set for nodes in archive mode. + ArchiveId string + + Filter FilterConfig + + // Number of miniblocks to read at once from the remote node. + ReadMiniblcocksSize uint64 +} + +func (ac *ArchiveConfig) GetReadMiniblocksSize() uint64 { + if ac.ReadMiniblcocksSize <= 0 { + return 100 + } + return ac.ReadMiniblcocksSize +} + +type FilterConfig struct { + // If set, only archive streams hosted on the nodes with the specified addresses. + Nodes []string + + // If set, only archive stream if Nodes list contains first hosting node for the stream. + // This may be used to archive only once copy of replicated stream + // if multiple archival nodes are used in conjunction. + FirstOnly bool + + // If set, partition all stream names using hash into specified number of shards and + // archive only listed shards. + NumShards uint64 + Shards []uint64 +} + +func (cfg *StreamConfig) GetMembershipLimit(streamId shared.StreamId) int { + if cfg.StreamMembershipLimits != nil { + streamPrefix := hex.EncodeToString(streamId[:1]) + if value, ok := cfg.StreamMembershipLimits[streamPrefix]; ok { + return value + } + } + return 0 +} + +func (c *Config) GetGraffiti() string { + if c.Graffiti == "" { + return "River Node welcomes you!" + } + return c.Graffiti +} diff --git a/core/node/config/config_test.go b/core/node/config/config_test.go new file mode 100644 index 000000000..502779f09 --- /dev/null +++ b/core/node/config/config_test.go @@ -0,0 +1,108 @@ +package config_test + +import ( + "bytes" + "log/slog" + "os" + "regexp" + "testing" + + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/testutils" + "github.com/stretchr/testify/require" +) + +// removeTextTimestamp removes the timestamp from a text log line generated by dlog. +func removeTextTimestamp(logOutput string) string { + // Remove timestamp from output + re := regexp.MustCompile(`\d{2}:\d{2}:\d{2}.\d{3}`) + return string(re.ReplaceAllString(logOutput, "[TIMESTAMP]")) +} + +func TestDatabaseConfig_UrlAndPasswordDoesNotLog(t *testing.T) { + cfg := config.DatabaseConfig{ + Url: "pg://host:port", + Host: "localhost", + Port: 5432, + User: "user", + Password: "password", + Database: "testdb", + Extra: "extra", + } + + tests := map[string]struct { + logCreator func() (*slog.Logger, *bytes.Buffer) + removeTimestamp func(string) string + testFile string + expectFile string + }{ + "TextLogger": { + logCreator: testutils.DlogTextLogger, + removeTimestamp: removeTextTimestamp, + expectFile: "testdata/databaseconfig.txt", + }, + "JSONLogger": { + logCreator: testutils.DlogJsonLogger, + removeTimestamp: testutils.RemoveJsonTimestamp, + expectFile: "testdata/databaseconfig_json.txt", + }, + } + for name, tc := range tests { + t.Run(name, func(t *testing.T) { + // Log cfg to buffer + logger, buffer := tc.logCreator() + logger.Info("test message", "databaseConfig", cfg) + + logOutput := buffer.String() + logOutput = tc.removeTimestamp(logOutput) + + expectedBytes, err := os.ReadFile(tc.expectFile) + require.NoError(t, err) + expected := tc.removeTimestamp(string(expectedBytes[:])) + + // Assert output is as expected: password is not logged, other fields included + require.Equal(t, expected, logOutput) + }) + } +} + +func TestTlsConfig_KeyDoesNotLog(t *testing.T) { + cfg := config.TLSConfig{ + Key: "keyvalue", + Cert: "certvalue", + } + + tests := map[string]struct { + logCreator func() (*slog.Logger, *bytes.Buffer) + removeTimestamp func(string) string + expectFile string + }{ + "TextLogger": { + logCreator: testutils.DlogTextLogger, + removeTimestamp: removeTextTimestamp, + expectFile: "testdata/tlsconfig.txt", + }, + "JSONLogger": { + logCreator: testutils.DlogJsonLogger, + removeTimestamp: testutils.RemoveJsonTimestamp, + expectFile: "testdata/tlsconfig_json.txt", + }, + } + for name, tc := range tests { + t.Run(name, func(t *testing.T) { + // Log cfg to buffer + logger, buffer := tc.logCreator() + logger.Info("test message", "tlsConfig", cfg) + + logOutput := buffer.String() + logOutput = tc.removeTimestamp(logOutput) + + expectedBytes, err := os.ReadFile(tc.expectFile) + require.NoError(t, err) + expected := tc.removeTimestamp(string(expectedBytes[:])) + + // Assert output is as expected: TLS Key is not logged, other fields included + require.Equal(t, expected, logOutput) + }) + } +} diff --git a/core/node/config/testdata/databaseconfig.txt b/core/node/config/testdata/databaseconfig.txt new file mode 100644 index 000000000..5fd3ec6d5 --- /dev/null +++ b/core/node/config/testdata/databaseconfig.txt @@ -0,0 +1,3 @@ +INFO 14:18:36.990 test message + databaseConfig = + {Host:"localhost", Port:5432, User:"user", Database:"testdb", Extra:"extra"} diff --git a/core/node/config/testdata/databaseconfig_json.txt b/core/node/config/testdata/databaseconfig_json.txt new file mode 100644 index 000000000..95260784f --- /dev/null +++ b/core/node/config/testdata/databaseconfig_json.txt @@ -0,0 +1 @@ +{"time":"[TIMESTAMP]","level":"INFO","msg":"test message","databaseConfig":{"Host":"localhost","Port":5432,"User":"user","Database":"testdb","Extra":"extra","StreamingConnectionsRatio":0,"StartupDelay":0}} diff --git a/core/node/config/testdata/load_address.json b/core/node/config/testdata/load_address.json new file mode 100644 index 000000000..e6a44a0f2 --- /dev/null +++ b/core/node/config/testdata/load_address.json @@ -0,0 +1,3 @@ +{ + "address": "0x03300DF841dE9089B1Ad4918cDbA863eF84d2Fe6" +} diff --git a/core/node/config/testdata/test_config.yaml b/core/node/config/testdata/test_config.yaml new file mode 100644 index 000000000..e29e649b7 --- /dev/null +++ b/core/node/config/testdata/test_config.yaml @@ -0,0 +1,4 @@ +fromHex: 0x71C7656EC7ab88b098defB751B7401B5f6d8976F +fromFile: testdata/load_address.json +durationOne: 10s +durationTwo: 1h diff --git a/core/node/config/testdata/tlsconfig.txt b/core/node/config/testdata/tlsconfig.txt new file mode 100644 index 000000000..0363bb719 --- /dev/null +++ b/core/node/config/testdata/tlsconfig.txt @@ -0,0 +1,3 @@ +INFO 14:18:26.336 test message + tlsConfig = + {Cert:"certvalue"} diff --git a/core/node/config/testdata/tlsconfig_json.txt b/core/node/config/testdata/tlsconfig_json.txt new file mode 100644 index 000000000..7c6773b28 --- /dev/null +++ b/core/node/config/testdata/tlsconfig_json.txt @@ -0,0 +1 @@ +{"time":"[TIMESTAMP]","level":"INFO","msg":"test message","tlsConfig":{"Cert":"certvalue","TestCA":""}} diff --git a/core/node/config/viper_hooks.go b/core/node/config/viper_hooks.go new file mode 100644 index 000000000..020ff443d --- /dev/null +++ b/core/node/config/viper_hooks.go @@ -0,0 +1,80 @@ +package config + +import ( + "encoding/json" + "os" + "reflect" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/mitchellh/mapstructure" + "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/protocol" +) + +var ( + commonAddressType = reflect.TypeOf(common.Address{}) + timeDurationType = reflect.TypeOf(time.Duration(0)) +) + +func DecodeAddressOrAddressFileHook() mapstructure.DecodeHookFuncType { + return func(from reflect.Type, to reflect.Type, data interface{}) (interface{}, error) { + if from.Kind() == reflect.String && to == commonAddressType { + addr, err := parseOrLoadAddress(data.(string)) + if err != nil { + return nil, base.AsRiverError(err, protocol.Err_BAD_CONFIG). + Message("Failed to parse address"). + Func("DecodeAddressOrFileHook") + } + return addr, nil + } + return data, nil + } +} + +func DecodeDurationHook() mapstructure.DecodeHookFuncType { + return func(from reflect.Type, to reflect.Type, data interface{}) (interface{}, error) { + if from.Kind() == reflect.String && to == timeDurationType { + duration, err := time.ParseDuration(data.(string)) + if err != nil { + return nil, base.AsRiverError(err, protocol.Err_BAD_CONFIG). + Message("Failed to parse duration"). + Func("DecodeDurationHook") + } + return duration, nil + } + return data, nil + } +} + +func parseOrLoadAddress(addrOrFile string) (common.Address, error) { + if common.IsHexAddress(addrOrFile) { + return common.HexToAddress(addrOrFile), nil + } + + fileData, err := os.ReadFile(addrOrFile) + if err != nil { + return common.Address{}, base.AsRiverError(err). + Tag("file", addrOrFile). + Func("parseOrLoadAddress") + } + + var data struct { + Address string `json:"address"` + } + + if err := json.Unmarshal(fileData, &data); err != nil { + return common.Address{}, base.AsRiverError(err). + Tag("file", addrOrFile). + Func("parseOrLoadAddress") + } + + if common.IsHexAddress(data.Address) { + return common.HexToAddress(data.Address), nil + } + + return common.Address{}, base.AsRiverError(err). + Tag("file", addrOrFile). + Tag("loaded_address", data.Address). + Func("parseOrLoadAddress") +} diff --git a/core/node/config/viper_hooks_test.go b/core/node/config/viper_hooks_test.go new file mode 100644 index 000000000..f139bd728 --- /dev/null +++ b/core/node/config/viper_hooks_test.go @@ -0,0 +1,44 @@ +package config_test + +import ( + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/mitchellh/mapstructure" + "github.com/river-build/river/core/node/config" + "github.com/spf13/viper" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestDecodeHooks(t *testing.T) { + var ( + assert = assert.New(t) + require = require.New(t) + cfg = struct { + FromHex common.Address + FromFile common.Address + DurationOne time.Duration + DurationTwo time.Duration + }{} + expFromHex = common.HexToAddress("0x71C7656EC7ab88b098defB751B7401B5f6d8976F") + expFromFile = common.HexToAddress("0x03300DF841dE9089B1Ad4918cDbA863eF84d2Fe6") + expDurationOne = 10 * time.Second + expDurationTwo = time.Hour + decodeHooks = mapstructure.ComposeDecodeHookFunc( + config.DecodeAddressOrAddressFileHook(), + config.DecodeDurationHook(), + ) + ) + + viper.SetConfigFile("./testdata/test_config.yaml") + + require.Nil(viper.ReadInConfig(), "read in config") + require.Nil(viper.Unmarshal(&cfg, viper.DecodeHook(decodeHooks)), "unmarshal config") + + assert.Equal(expFromHex, cfg.FromHex, "address from hex") + assert.Equal(expFromFile, cfg.FromFile, "address from file") + assert.Equal(expDurationOne, cfg.DurationOne, "duration one") + assert.Equal(expDurationTwo, cfg.DurationTwo, "duration two") +} diff --git a/core/node/config_instance.sh b/core/node/config_instance.sh new file mode 100755 index 000000000..00e466ca3 --- /dev/null +++ b/core/node/config_instance.sh @@ -0,0 +1,69 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +# Explicitely check required vars are set +: ${RUN_BASE:?} +: ${INSTANCE:?} + +BLOCK_TIME_MS=${BLOCK_TIME_MS:-2000} + +INSTANCE_DIR="${RUN_BASE}/${INSTANCE}" +TEMPLATE_FILE="./config-template.yaml" +OUTPUT_FILE="${INSTANCE_DIR}/config/config.yaml" + +# Ensure the directory for the output file exists +mkdir -p "$INSTANCE_DIR/config" +mkdir -p "$INSTANCE_DIR/logs" +mkdir -p "$INSTANCE_DIR/wallet" +mkdir -p "$INSTANCE_DIR/certs" + +cp "$TEMPLATE_FILE" "$OUTPUT_FILE" + +SKIP_GENKEY=${SKIP_GENKEY:-false} + +grep -o '<.*>' "$TEMPLATE_FILE" | sort | uniq | while read -r KEY; do + key=$(echo "$KEY" | sed 's/^.\(.*\).$/\1/') + value=${!key:?$key is not set} + + if [ -z "$value" ]; then + echo "Error: Missing value for key $key" >&2 + exit 1 + fi + + # Check if key exists in the template file + if ! grep -q "<${key}>" "$OUTPUT_FILE"; then + echo "Error: Key $key not found in template." >&2 + exit 1 + fi + + # Substitute the key with the value, adjust for macOS or Linux without creating backup files + if [ "$(uname)" == "Darwin" ]; then # macOS + sed -i '' "s^<${key}>^${value}^g" "$OUTPUT_FILE" + else # Linux + sed -i "s^<${key}>^${value}^g" "$OUTPUT_FILE" + fi +done + +# Generate a new wallet if one doesn't exist and SKIP_GENKEY is not set +if [ "$SKIP_GENKEY" = true ]; then + echo "Skipping wallet generation for instance '${INSTANCE}'" +elif [ ! -f "${INSTANCE_DIR}/wallet/private_key" ]; then + echo "Generating a new wallet for instance '${INSTANCE}'" + cast wallet new --json > "${INSTANCE_DIR}/wallet/wallet.json" + jq -r .[0].address "${INSTANCE_DIR}/wallet/wallet.json" > "${INSTANCE_DIR}/wallet/node_address" + jq -r .[0].private_key "${INSTANCE_DIR}/wallet/wallet.json" | sed 's/^0x//' > "${INSTANCE_DIR}/wallet/private_key" +else + echo "Using existing wallet for instance '${INSTANCE}'" +fi + +if [ "$SKIP_GENKEY" = true ]; then + echo "Skipping certificate generation for instance '${INSTANCE}'" +elif [ ! -f "${INSTANCE_DIR}/certs/cert.pem" ]; then + ../scripts/generate-certs.sh $(realpath "$INSTANCE_DIR/certs") +else + echo "Using existing certificate for instance '${INSTANCE}'" +fi + + + diff --git a/core/node/contracts/base/architect.go b/core/node/contracts/base/architect.go new file mode 100644 index 000000000..5baf90d5f --- /dev/null +++ b/core/node/contracts/base/architect.go @@ -0,0 +1,537 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package base + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// IArchitectBaseChannelInfo is an auto generated low-level Go binding around an user-defined struct. +type IArchitectBaseChannelInfo struct { + Metadata string +} + +// IArchitectBaseMembership is an auto generated low-level Go binding around an user-defined struct. +type IArchitectBaseMembership struct { + Settings IMembershipBaseMembership + Requirements IArchitectBaseMembershipRequirements + Permissions []string +} + +// IArchitectBaseMembershipRequirements is an auto generated low-level Go binding around an user-defined struct. +type IArchitectBaseMembershipRequirements struct { + Everyone bool + Users []common.Address + RuleData IRuleEntitlementRuleData +} + +// IArchitectBaseSpaceInfo is an auto generated low-level Go binding around an user-defined struct. +type IArchitectBaseSpaceInfo struct { + Name string + Uri string + Membership IArchitectBaseMembership + Channel IArchitectBaseChannelInfo +} + +// IMembershipBaseMembership is an auto generated low-level Go binding around an user-defined struct. +type IMembershipBaseMembership struct { + Name string + Symbol string + Price *big.Int + MaxSupply *big.Int + Duration uint64 + Currency common.Address + FeeRecipient common.Address + FreeAllocation *big.Int + PricingModule common.Address +} + +// ArchitectMetaData contains all meta data concerning the Architect contract. +var ArchitectMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"createSpace\",\"inputs\":[{\"name\":\"SpaceInfo\",\"type\":\"tuple\",\"internalType\":\"structIArchitectBase.SpaceInfo\",\"components\":[{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"uri\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"membership\",\"type\":\"tuple\",\"internalType\":\"structIArchitectBase.Membership\",\"components\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structIMembershipBase.Membership\",\"components\":[{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"price\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxSupply\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"duration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"currency\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"freeAllocation\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"pricingModule\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structIArchitectBase.MembershipRequirements\",\"components\":[{\"name\":\"everyone\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"users\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"ruleData\",\"type\":\"tuple\",\"internalType\":\"structIRuleEntitlement.RuleData\",\"components\":[{\"name\":\"operations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.Operation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CombinedOperationType\"},{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"checkOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.CheckOperation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CheckOperationType\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"logicalOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.LogicalOperation[]\",\"components\":[{\"name\":\"logOpType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.LogicalOperationType\"},{\"name\":\"leftOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rightOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}]}]},{\"name\":\"permissions\",\"type\":\"string[]\",\"internalType\":\"string[]\"}]},{\"name\":\"channel\",\"type\":\"tuple\",\"internalType\":\"structIArchitectBase.ChannelInfo\",\"components\":[{\"name\":\"metadata\",\"type\":\"string\",\"internalType\":\"string\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getSpaceArchitectImplementations\",\"inputs\":[],\"outputs\":[{\"name\":\"ownerTokenImplementation\",\"type\":\"address\",\"internalType\":\"contractISpaceOwner\"},{\"name\":\"userEntitlementImplementation\",\"type\":\"address\",\"internalType\":\"contractIUserEntitlement\"},{\"name\":\"ruleEntitlementImplementation\",\"type\":\"address\",\"internalType\":\"contractIRuleEntitlement\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSpaceByTokenId\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"space\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenIdBySpace\",\"inputs\":[{\"name\":\"space\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setSpaceArchitectImplementations\",\"inputs\":[{\"name\":\"ownerTokenImplementation\",\"type\":\"address\",\"internalType\":\"contractISpaceOwner\"},{\"name\":\"userEntitlementImplementation\",\"type\":\"address\",\"internalType\":\"contractIUserEntitlement\"},{\"name\":\"ruleEntitlementImplementation\",\"type\":\"address\",\"internalType\":\"contractIRuleEntitlement\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"SpaceCreated\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"space\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"Architect__InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Architect__InvalidNetworkId\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Architect__InvalidStringLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Architect__NotContract\",\"inputs\":[]}]", +} + +// ArchitectABI is the input ABI used to generate the binding from. +// Deprecated: Use ArchitectMetaData.ABI instead. +var ArchitectABI = ArchitectMetaData.ABI + +// Architect is an auto generated Go binding around an Ethereum contract. +type Architect struct { + ArchitectCaller // Read-only binding to the contract + ArchitectTransactor // Write-only binding to the contract + ArchitectFilterer // Log filterer for contract events +} + +// ArchitectCaller is an auto generated read-only Go binding around an Ethereum contract. +type ArchitectCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ArchitectTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ArchitectTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ArchitectFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ArchitectFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ArchitectSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ArchitectSession struct { + Contract *Architect // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ArchitectCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ArchitectCallerSession struct { + Contract *ArchitectCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ArchitectTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ArchitectTransactorSession struct { + Contract *ArchitectTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ArchitectRaw is an auto generated low-level Go binding around an Ethereum contract. +type ArchitectRaw struct { + Contract *Architect // Generic contract binding to access the raw methods on +} + +// ArchitectCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ArchitectCallerRaw struct { + Contract *ArchitectCaller // Generic read-only contract binding to access the raw methods on +} + +// ArchitectTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ArchitectTransactorRaw struct { + Contract *ArchitectTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewArchitect creates a new instance of Architect, bound to a specific deployed contract. +func NewArchitect(address common.Address, backend bind.ContractBackend) (*Architect, error) { + contract, err := bindArchitect(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Architect{ArchitectCaller: ArchitectCaller{contract: contract}, ArchitectTransactor: ArchitectTransactor{contract: contract}, ArchitectFilterer: ArchitectFilterer{contract: contract}}, nil +} + +// NewArchitectCaller creates a new read-only instance of Architect, bound to a specific deployed contract. +func NewArchitectCaller(address common.Address, caller bind.ContractCaller) (*ArchitectCaller, error) { + contract, err := bindArchitect(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ArchitectCaller{contract: contract}, nil +} + +// NewArchitectTransactor creates a new write-only instance of Architect, bound to a specific deployed contract. +func NewArchitectTransactor(address common.Address, transactor bind.ContractTransactor) (*ArchitectTransactor, error) { + contract, err := bindArchitect(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ArchitectTransactor{contract: contract}, nil +} + +// NewArchitectFilterer creates a new log filterer instance of Architect, bound to a specific deployed contract. +func NewArchitectFilterer(address common.Address, filterer bind.ContractFilterer) (*ArchitectFilterer, error) { + contract, err := bindArchitect(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ArchitectFilterer{contract: contract}, nil +} + +// bindArchitect binds a generic wrapper to an already deployed contract. +func bindArchitect(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ArchitectMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Architect *ArchitectRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Architect.Contract.ArchitectCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Architect *ArchitectRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Architect.Contract.ArchitectTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Architect *ArchitectRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Architect.Contract.ArchitectTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Architect *ArchitectCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Architect.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Architect *ArchitectTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Architect.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Architect *ArchitectTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Architect.Contract.contract.Transact(opts, method, params...) +} + +// GetSpaceArchitectImplementations is a free data retrieval call binding the contract method 0x545efb2d. +// +// Solidity: function getSpaceArchitectImplementations() view returns(address ownerTokenImplementation, address userEntitlementImplementation, address ruleEntitlementImplementation) +func (_Architect *ArchitectCaller) GetSpaceArchitectImplementations(opts *bind.CallOpts) (struct { + OwnerTokenImplementation common.Address + UserEntitlementImplementation common.Address + RuleEntitlementImplementation common.Address +}, error) { + var out []interface{} + err := _Architect.contract.Call(opts, &out, "getSpaceArchitectImplementations") + + outstruct := new(struct { + OwnerTokenImplementation common.Address + UserEntitlementImplementation common.Address + RuleEntitlementImplementation common.Address + }) + if err != nil { + return *outstruct, err + } + + outstruct.OwnerTokenImplementation = *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + outstruct.UserEntitlementImplementation = *abi.ConvertType(out[1], new(common.Address)).(*common.Address) + outstruct.RuleEntitlementImplementation = *abi.ConvertType(out[2], new(common.Address)).(*common.Address) + + return *outstruct, err + +} + +// GetSpaceArchitectImplementations is a free data retrieval call binding the contract method 0x545efb2d. +// +// Solidity: function getSpaceArchitectImplementations() view returns(address ownerTokenImplementation, address userEntitlementImplementation, address ruleEntitlementImplementation) +func (_Architect *ArchitectSession) GetSpaceArchitectImplementations() (struct { + OwnerTokenImplementation common.Address + UserEntitlementImplementation common.Address + RuleEntitlementImplementation common.Address +}, error) { + return _Architect.Contract.GetSpaceArchitectImplementations(&_Architect.CallOpts) +} + +// GetSpaceArchitectImplementations is a free data retrieval call binding the contract method 0x545efb2d. +// +// Solidity: function getSpaceArchitectImplementations() view returns(address ownerTokenImplementation, address userEntitlementImplementation, address ruleEntitlementImplementation) +func (_Architect *ArchitectCallerSession) GetSpaceArchitectImplementations() (struct { + OwnerTokenImplementation common.Address + UserEntitlementImplementation common.Address + RuleEntitlementImplementation common.Address +}, error) { + return _Architect.Contract.GetSpaceArchitectImplementations(&_Architect.CallOpts) +} + +// GetSpaceByTokenId is a free data retrieval call binding the contract method 0x673f0dd5. +// +// Solidity: function getSpaceByTokenId(uint256 tokenId) view returns(address space) +func (_Architect *ArchitectCaller) GetSpaceByTokenId(opts *bind.CallOpts, tokenId *big.Int) (common.Address, error) { + var out []interface{} + err := _Architect.contract.Call(opts, &out, "getSpaceByTokenId", tokenId) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetSpaceByTokenId is a free data retrieval call binding the contract method 0x673f0dd5. +// +// Solidity: function getSpaceByTokenId(uint256 tokenId) view returns(address space) +func (_Architect *ArchitectSession) GetSpaceByTokenId(tokenId *big.Int) (common.Address, error) { + return _Architect.Contract.GetSpaceByTokenId(&_Architect.CallOpts, tokenId) +} + +// GetSpaceByTokenId is a free data retrieval call binding the contract method 0x673f0dd5. +// +// Solidity: function getSpaceByTokenId(uint256 tokenId) view returns(address space) +func (_Architect *ArchitectCallerSession) GetSpaceByTokenId(tokenId *big.Int) (common.Address, error) { + return _Architect.Contract.GetSpaceByTokenId(&_Architect.CallOpts, tokenId) +} + +// GetTokenIdBySpace is a free data retrieval call binding the contract method 0xc0bc6796. +// +// Solidity: function getTokenIdBySpace(address space) view returns(uint256) +func (_Architect *ArchitectCaller) GetTokenIdBySpace(opts *bind.CallOpts, space common.Address) (*big.Int, error) { + var out []interface{} + err := _Architect.contract.Call(opts, &out, "getTokenIdBySpace", space) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetTokenIdBySpace is a free data retrieval call binding the contract method 0xc0bc6796. +// +// Solidity: function getTokenIdBySpace(address space) view returns(uint256) +func (_Architect *ArchitectSession) GetTokenIdBySpace(space common.Address) (*big.Int, error) { + return _Architect.Contract.GetTokenIdBySpace(&_Architect.CallOpts, space) +} + +// GetTokenIdBySpace is a free data retrieval call binding the contract method 0xc0bc6796. +// +// Solidity: function getTokenIdBySpace(address space) view returns(uint256) +func (_Architect *ArchitectCallerSession) GetTokenIdBySpace(space common.Address) (*big.Int, error) { + return _Architect.Contract.GetTokenIdBySpace(&_Architect.CallOpts, space) +} + +// CreateSpace is a paid mutator transaction binding the contract method 0x7d8c4522. +// +// Solidity: function createSpace((string,string,((string,string,uint256,uint256,uint64,address,address,uint256,address),(bool,address[],((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])),string[]),(string)) SpaceInfo) returns(address) +func (_Architect *ArchitectTransactor) CreateSpace(opts *bind.TransactOpts, SpaceInfo IArchitectBaseSpaceInfo) (*types.Transaction, error) { + return _Architect.contract.Transact(opts, "createSpace", SpaceInfo) +} + +// CreateSpace is a paid mutator transaction binding the contract method 0x7d8c4522. +// +// Solidity: function createSpace((string,string,((string,string,uint256,uint256,uint64,address,address,uint256,address),(bool,address[],((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])),string[]),(string)) SpaceInfo) returns(address) +func (_Architect *ArchitectSession) CreateSpace(SpaceInfo IArchitectBaseSpaceInfo) (*types.Transaction, error) { + return _Architect.Contract.CreateSpace(&_Architect.TransactOpts, SpaceInfo) +} + +// CreateSpace is a paid mutator transaction binding the contract method 0x7d8c4522. +// +// Solidity: function createSpace((string,string,((string,string,uint256,uint256,uint64,address,address,uint256,address),(bool,address[],((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])),string[]),(string)) SpaceInfo) returns(address) +func (_Architect *ArchitectTransactorSession) CreateSpace(SpaceInfo IArchitectBaseSpaceInfo) (*types.Transaction, error) { + return _Architect.Contract.CreateSpace(&_Architect.TransactOpts, SpaceInfo) +} + +// SetSpaceArchitectImplementations is a paid mutator transaction binding the contract method 0x8bfc94b9. +// +// Solidity: function setSpaceArchitectImplementations(address ownerTokenImplementation, address userEntitlementImplementation, address ruleEntitlementImplementation) returns() +func (_Architect *ArchitectTransactor) SetSpaceArchitectImplementations(opts *bind.TransactOpts, ownerTokenImplementation common.Address, userEntitlementImplementation common.Address, ruleEntitlementImplementation common.Address) (*types.Transaction, error) { + return _Architect.contract.Transact(opts, "setSpaceArchitectImplementations", ownerTokenImplementation, userEntitlementImplementation, ruleEntitlementImplementation) +} + +// SetSpaceArchitectImplementations is a paid mutator transaction binding the contract method 0x8bfc94b9. +// +// Solidity: function setSpaceArchitectImplementations(address ownerTokenImplementation, address userEntitlementImplementation, address ruleEntitlementImplementation) returns() +func (_Architect *ArchitectSession) SetSpaceArchitectImplementations(ownerTokenImplementation common.Address, userEntitlementImplementation common.Address, ruleEntitlementImplementation common.Address) (*types.Transaction, error) { + return _Architect.Contract.SetSpaceArchitectImplementations(&_Architect.TransactOpts, ownerTokenImplementation, userEntitlementImplementation, ruleEntitlementImplementation) +} + +// SetSpaceArchitectImplementations is a paid mutator transaction binding the contract method 0x8bfc94b9. +// +// Solidity: function setSpaceArchitectImplementations(address ownerTokenImplementation, address userEntitlementImplementation, address ruleEntitlementImplementation) returns() +func (_Architect *ArchitectTransactorSession) SetSpaceArchitectImplementations(ownerTokenImplementation common.Address, userEntitlementImplementation common.Address, ruleEntitlementImplementation common.Address) (*types.Transaction, error) { + return _Architect.Contract.SetSpaceArchitectImplementations(&_Architect.TransactOpts, ownerTokenImplementation, userEntitlementImplementation, ruleEntitlementImplementation) +} + +// ArchitectSpaceCreatedIterator is returned from FilterSpaceCreated and is used to iterate over the raw logs and unpacked data for SpaceCreated events raised by the Architect contract. +type ArchitectSpaceCreatedIterator struct { + Event *ArchitectSpaceCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ArchitectSpaceCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ArchitectSpaceCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ArchitectSpaceCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ArchitectSpaceCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ArchitectSpaceCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ArchitectSpaceCreated represents a SpaceCreated event raised by the Architect contract. +type ArchitectSpaceCreated struct { + Owner common.Address + TokenId *big.Int + Space common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSpaceCreated is a free log retrieval operation binding the contract event 0xe50fc3942f8a2d7e5a7c8fb9488499eba5255b41e18bc3f1b4791402976d1d0b. +// +// Solidity: event SpaceCreated(address indexed owner, uint256 indexed tokenId, address indexed space) +func (_Architect *ArchitectFilterer) FilterSpaceCreated(opts *bind.FilterOpts, owner []common.Address, tokenId []*big.Int, space []common.Address) (*ArchitectSpaceCreatedIterator, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + var spaceRule []interface{} + for _, spaceItem := range space { + spaceRule = append(spaceRule, spaceItem) + } + + logs, sub, err := _Architect.contract.FilterLogs(opts, "SpaceCreated", ownerRule, tokenIdRule, spaceRule) + if err != nil { + return nil, err + } + return &ArchitectSpaceCreatedIterator{contract: _Architect.contract, event: "SpaceCreated", logs: logs, sub: sub}, nil +} + +// WatchSpaceCreated is a free log subscription operation binding the contract event 0xe50fc3942f8a2d7e5a7c8fb9488499eba5255b41e18bc3f1b4791402976d1d0b. +// +// Solidity: event SpaceCreated(address indexed owner, uint256 indexed tokenId, address indexed space) +func (_Architect *ArchitectFilterer) WatchSpaceCreated(opts *bind.WatchOpts, sink chan<- *ArchitectSpaceCreated, owner []common.Address, tokenId []*big.Int, space []common.Address) (event.Subscription, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + var spaceRule []interface{} + for _, spaceItem := range space { + spaceRule = append(spaceRule, spaceItem) + } + + logs, sub, err := _Architect.contract.WatchLogs(opts, "SpaceCreated", ownerRule, tokenIdRule, spaceRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ArchitectSpaceCreated) + if err := _Architect.contract.UnpackLog(event, "SpaceCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseSpaceCreated is a log parse operation binding the contract event 0xe50fc3942f8a2d7e5a7c8fb9488499eba5255b41e18bc3f1b4791402976d1d0b. +// +// Solidity: event SpaceCreated(address indexed owner, uint256 indexed tokenId, address indexed space) +func (_Architect *ArchitectFilterer) ParseSpaceCreated(log types.Log) (*ArchitectSpaceCreated, error) { + event := new(ArchitectSpaceCreated) + if err := _Architect.contract.UnpackLog(event, "SpaceCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/node/contracts/base/channels.go b/core/node/contracts/base/channels.go new file mode 100644 index 000000000..4ed17ba06 --- /dev/null +++ b/core/node/contracts/base/channels.go @@ -0,0 +1,3073 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package base + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// IChannelBaseChannel is an auto generated low-level Go binding around an user-defined struct. +type IChannelBaseChannel struct { + Id [32]byte + Disabled bool + Metadata string + RoleIds []*big.Int +} + +// ChannelsMetaData contains all meta data concerning the Channels contract. +var ChannelsMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"addRoleToChannel\",\"inputs\":[{\"name\":\"channelId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createChannel\",\"inputs\":[{\"name\":\"channelId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"metadata\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"roleIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getChannel\",\"inputs\":[{\"name\":\"channelId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"channel\",\"type\":\"tuple\",\"internalType\":\"structIChannelBase.Channel\",\"components\":[{\"name\":\"id\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"metadata\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"roleIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getChannels\",\"inputs\":[],\"outputs\":[{\"name\":\"channels\",\"type\":\"tuple[]\",\"internalType\":\"structIChannelBase.Channel[]\",\"components\":[{\"name\":\"id\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"metadata\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"roleIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRolesByChannel\",\"inputs\":[{\"name\":\"channelId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"roleIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeChannel\",\"inputs\":[{\"name\":\"channelId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRoleFromChannel\",\"inputs\":[{\"name\":\"channelId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateChannel\",\"inputs\":[{\"name\":\"channelId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"metadata\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"approved\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ApprovalForAll\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"approved\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Banned\",\"inputs\":[{\"name\":\"moderator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChannelCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"channelId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChannelRemoved\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"channelId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChannelRoleAdded\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"channelId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChannelRoleRemoved\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"channelId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChannelUpdated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"channelId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConsecutiveTransfer\",\"inputs\":[{\"name\":\"fromTokenId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"toTokenId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InterfaceAdded\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"indexed\":true,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InterfaceRemoved\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"indexed\":true,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SubscriptionUpdate\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"expiration\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unbanned\",\"inputs\":[{\"name\":\"moderator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ApprovalCallerNotOwnerNorApproved\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ApprovalQueryForNonexistentToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BalanceQueryForZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Banning__AlreadyBanned\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"Banning__CannotBanSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Banning__InvalidTokenId\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"Banning__NotBanned\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ChannelService__ChannelAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChannelService__ChannelDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChannelService__ChannelDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChannelService__RoleAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChannelService__RoleDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC5643__DurationZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC5643__InvalidTokenId\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC5643__NotApprovedOrOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC5643__SubscriptionNotRenewable\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"Entitlement__InvalidValue\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Entitlement__NotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Entitlement__NotMember\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Entitlement__ValueAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Initializable_InInitializingState\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Introspection_AlreadySupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Introspection_NotSupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MintERC2309QuantityExceedsLimit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MintToZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MintZeroQuantity\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Ownable__NotOwner\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Ownable__ZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerQueryForNonexistentToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnershipNotInitializedForExtraData\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Pausable__NotPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Pausable__Paused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TransferCallerNotOwnerNorApproved\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TransferFromIncorrectOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TransferToNonERC721ReceiverImplementer\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TransferToZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"URIQueryForNonexistentToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Validator__InvalidStringLength\",\"inputs\":[]}]", + Bin: "0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b611d27806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80639575f6ac1161005b5780639575f6ac146100f15780639935218314610106578063b9de615914610126578063ef86d6961461013957600080fd5b806302da0e511461008d57806337644cf7146100a2578063831c2b82146100b5578063921f7175146100de575b600080fd5b6100a061009b366004611597565b61014c565b005b6100a06100b03660046115b0565b61018a565b6100c86100c3366004611597565b6101cb565b6040516100d5919061168f565b60405180910390f35b6100a06100ec36600461177d565b6101fd565b6100f961023f565b6040516100d59190611845565b610119610114366004611597565b61024e565b6040516100d591906118a9565b6100a06101343660046115b0565b610259565b6100a06101473660046118fb565b610296565b61017e6040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b610187816102fb565b50565b6101bd826040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b81525061033c565b6101c78282610363565b5050565b60408051608081018252600080825260208201526060918101829052818101919091526101f7826103ad565b92915050565b61022f6040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b61023a838383610414565b505050565b6060610249610465565b905090565b60606101f78261059d565b61028c826040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b81525061033c565b6101c782826105a8565b6102c86040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b61023a8383836105ea565b6102de600082610627565b61018757604051630ce39a4b60e21b815260040160405180910390fd5b610304816106ab565b60405181815233907f3a3f387aa42656bc1732adfc7aea5cde9ccc05a59f9af9c29ebfa68e66383e939060200160405180910390a250565b6103468282610627565b6101c757604051630ce39a4b60e21b815260040160405180910390fd5b61036d82826107a2565b604080518381526020810183905233917f2b10481523b59a7978f8ab73b237349b0f38c801f6094bdc8994d379c067d71391015b60405180910390a25050565b60408051608081018252600080825260208201526060918101829052818101919091526000806103dc84610833565b925092505060006103ec85610953565b6040805160808101825296875292151560208701529185019290925260608401525090919050565b61041f8260006109ab565b61042a8383836109cf565b60405183815233907fdd6c5b83be3557f8b2674712946f9f05dcd882b82bfd58b9539b9706efd35d8c906020015b60405180910390a2505050565b60606000610471610b09565b90506000815167ffffffffffffffff81111561048f5761048f6116a2565b6040519080825280602002602001820160405280156104e357816020015b60408051608081018252600080825260208201526060918101829052818101919091528152602001906001900390816104ad5790505b50905060005b825181101561059657600080600061051986858151811061050c5761050c611956565b6020026020010151610833565b925092509250600061054387868151811061053657610536611956565b6020026020010151610953565b9050604051806080016040528085815260200183151581526020018481526020018281525086868151811061057a5761057a611956565b60200260200101819052505050505080806001019150506104e9565b5092915050565b60606101f782610953565b6105b28282610b29565b604080518381526020810183905233917faee688d80dbf97230e5d2b4b06aa7074bfe38ddd8abf856551177db30395612991016103a1565b6105f5838383610bb9565b60405183815233907f94af4a611b3fb1eaa653a6b29f82b71bcea25ca378171c5f059010fa18e0716e90602001610458565b60003380610633610c6e565b6001600160a01b031614806106a357507fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff161580156106a357506106a3848285604051602001610686919061196c565b60405160208183030381529060405261069e90611988565b610d32565b949350505050565b6106b481610fdf565b600080516020611d078339815191526106cd8183611016565b5060408051602080820183526000808352858152600280860190925292909220909101906106fb9082611a30565b50600082815260028083016020526040822060018101805460ff19169055828155919061072a90830182611549565b50506000828152600382016020526040812061074590611022565b905060005b815181101561079c5761079382828151811061076857610768611956565b602002602001015184600301600087815260200190815260200160002061101690919063ffffffff16565b5060010161074a565b50505050565b6107ab82610fdf565b6107b48261102f565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d07833981519152906107fb9083611091565b15610819576040516302369ff360e41b815260040160405180910390fd5b6000838152600382016020526040902061079c90836110a9565b60006060600061084284610fdf565b60008481527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430260209081526040808320815160608101835281548152600182015460ff16151593810193909352600281018054600080516020611d07833981519152959493840191906108b4906119ac565b80601f01602080910402602001604051908101604052809291908181526020018280546108e0906119ac565b801561092d5780601f106109025761010080835404028352916020019161092d565b820191906000526020600020905b81548152906001019060200180831161091057829003601f168201915b505050919092525050815160408301516020909301519099929850965090945050505050565b606061095e82610fdf565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d07833981519152906109a490611022565b9392505050565b8151829082111561023a576040516374eb20a760e01b815260040160405180910390fd5b6109d8836110b5565b600080516020611d078339815191526109f181856110a9565b50604080516060810182528581526000602080830182815283850188815289845260028781019093529490922083518155915160018301805460ff191691151591909117905592519192909190820190610a4b9082611a30565b5090505060005b8251811015610b0257610a9b838281518110610a7057610a70611956565b602002602001015183600301600088815260200190815260200160002061109190919063ffffffff16565b15610ab9576040516302369ff360e41b815260040160405180910390fd5b610af9838281518110610ace57610ace611956565b60200260200101518360030160008881526020019081526020016000206110a990919063ffffffff16565b50600101610a52565b5050505050565b6060600080516020611d07833981519152610b2381611022565b91505090565b610b3282610fdf565b610b3b8261102f565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d0783398151915290610b829083611091565b610b9f576040516333cb039f60e11b815260040160405180910390fd5b6000838152600382016020526040902061079c9083611016565b610bc283610fdf565b60008381527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504302602052604090208251600080516020611d07833981519152919015801590610c2f575080600201604051610c1c9190611af0565b6040518091039020848051906020012014155b15610c445760028101610c428582611a30565b505b600181015460ff16151583151514610b0257600101805460ff191692151592909217909155505050565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190611b82565b600080610d3d610c6e565b90506000610d4a856110eb565b80519091506000610d5961126a565b805190915060005b83811015610e18576000858281518110610d7d57610d7d611956565b60200260200101519050866001600160a01b0316816001600160a01b031603610db05760019750505050505050506109a4565b60005b83811015610e0e57816001600160a01b0316610de7868381518110610dda57610dda611956565b6020026020010151611295565b6001600160a01b031603610e06576000985050505050505050506109a4565b600101610db3565b5050600101610d61565b507fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006000610e657fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931016112a0565b905060005b81811015610fcd5760008381610e8360018301856112aa565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015610f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f309190611b9d565b158015610fad575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401610f6c93929190611bba565b602060405180830381865afa158015610f89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fad9190611b9d565b15610fc457600199505050505050505050506109a4565b50600101610e6a565b5060009b9a5050505050505050505050565b610ff981600080516020611d078339815191525b90611091565b6101875760405163560b4b4160e11b815260040160405180910390fd5b60006109a483836112b6565b606060006109a4836113a9565b60008181527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af5185043026020526040902060010154600080516020611d078339815191529060ff16156101c757604051636ce0028960e11b815260040160405180910390fd5b600081815260018301602052604081205415156109a4565b60006109a48383611405565b6110cd81600080516020611d07833981519152610ff3565b1561018757604051632324f7d960e21b815260040160405180910390fd5b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa158015611160573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111889190810190611c1c565b8051909150600061119a826001611cca565b67ffffffffffffffff8111156111b2576111b26116a2565b6040519080825280602002602001820160405280156111db578160200160208202803683370190505b50905060005b82811015611235578381815181106111fb576111fb611956565b602002602001015182828151811061121557611215611956565b6001600160a01b03909216602092830291909101909101526001016111e1565b508581838151811061124957611249611956565b6001600160a01b039092166020928302919091019091015295945050505050565b60606102497f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611022565b60006101f782611454565b60006101f7825490565b60006109a4838361151f565b6000818152600183016020526040812054801561139f5760006112da600183611cdd565b85549091506000906112ee90600190611cdd565b905080821461135357600086600001828154811061130e5761130e611956565b906000526020600020015490508087600001848154811061133157611331611956565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061136457611364611cf0565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506101f7565b60009150506101f7565b6060816000018054806020026020016040519081016040528092919081815260200182805480156113f957602002820191906000526020600020905b8154815260200190600101908083116113e5575b50505050509050919050565b600081815260018301602052604081205461144c575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556101f7565b5060006101f7565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b8316900361150557816000036114ff57805483106114db57604051636f96cda160e11b815260040160405180910390fd5b5b6000199092016000818152600484016020526040902054909290915081156114dc575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b600082600001828154811061153657611536611956565b9060005260206000200154905092915050565b508054611555906119ac565b6000825580601f10611565575050565b601f01602090049060005260206000209081019061018791905b80821115611593576000815560010161157f565b5090565b6000602082840312156115a957600080fd5b5035919050565b600080604083850312156115c357600080fd5b50508035926020909101359150565b60005b838110156115ed5781810151838201526020016115d5565b50506000910152565b805182526000602080830151151581850152604083015160806040860152805180608087015261162c8160a088018585016115d2565b601f19601f820116860191505060a08101606085015160a087840301606088015281815180845260c0850191508583019450600093505b808410156116835784518252938501936001939093019290850190611663565b50979650505050505050565b6020815260006109a460208301846115f6565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156116e1576116e16116a2565b604052919050565b600082601f8301126116fa57600080fd5b813567ffffffffffffffff811115611714576117146116a2565b611727601f8201601f19166020016116b8565b81815284602083860101111561173c57600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff821115611773576117736116a2565b5060051b60200190565b60008060006060848603121561179257600080fd5b8335925060208085013567ffffffffffffffff808211156117b257600080fd5b6117be888389016116e9565b945060408701359150808211156117d457600080fd5b508501601f810187136117e657600080fd5b80356117f96117f482611759565b6116b8565b81815260059190911b8201830190838101908983111561181857600080fd5b928401925b828410156118365783358252928401929084019061181d565b80955050505050509250925092565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561189c57603f1988860301845261188a8583516115f6565b9450928501929085019060010161186e565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156118e1578351835292840192918401916001016118c5565b50909695505050505050565b801515811461018757600080fd5b60008060006060848603121561191057600080fd5b83359250602084013567ffffffffffffffff81111561192e57600080fd5b61193a868287016116e9565b925050604084013561194b816118ed565b809150509250925092565b634e487b7160e01b600052603260045260246000fd5b6000825161197e8184602087016115d2565b9190910192915050565b805160208083015191908110156114ff5760001960209190910360031b1b16919050565b600181811c908216806119c057607f821691505b6020821081036114ff57634e487b7160e01b600052602260045260246000fd5b601f82111561023a576000816000526020600020601f850160051c81016020861015611a095750805b601f850160051c820191505b81811015611a2857828155600101611a15565b505050505050565b815167ffffffffffffffff811115611a4a57611a4a6116a2565b611a5e81611a5884546119ac565b846119e0565b602080601f831160018114611a935760008415611a7b5750858301515b600019600386901b1c1916600185901b178555611a28565b600085815260208120601f198616915b82811015611ac257888601518255948401946001909101908401611aa3565b5085821015611ae05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354611afe816119ac565b60018281168015611b165760018114611b2b57611b5a565b60ff1984168752821515830287019450611b5a565b8760005260208060002060005b85811015611b515781548a820152908401908201611b38565b50505082870194505b50929695505050505050565b80516001600160a01b0381168114611b7d57600080fd5b919050565b600060208284031215611b9457600080fd5b6109a482611b66565b600060208284031215611baf57600080fd5b81516109a4816118ed565b60006060820185835260206060602085015281865180845260808601915060208801935060005b81811015611c065784516001600160a01b031683529383019391830191600101611be1565b5050809350505050826040830152949350505050565b60006020808385031215611c2f57600080fd5b825167ffffffffffffffff811115611c4657600080fd5b8301601f81018513611c5757600080fd5b8051611c656117f482611759565b81815260059190911b82018301908381019087831115611c8457600080fd5b928401925b82841015611ca957611c9a84611b66565b82529284019290840190611c89565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156101f7576101f7611cb4565b818103818111156101f7576101f7611cb4565b634e487b7160e01b600052603160045260246000fdfe804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504300", +} + +// ChannelsABI is the input ABI used to generate the binding from. +// Deprecated: Use ChannelsMetaData.ABI instead. +var ChannelsABI = ChannelsMetaData.ABI + +// ChannelsBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ChannelsMetaData.Bin instead. +var ChannelsBin = ChannelsMetaData.Bin + +// DeployChannels deploys a new Ethereum contract, binding an instance of Channels to it. +func DeployChannels(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Channels, error) { + parsed, err := ChannelsMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ChannelsBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Channels{ChannelsCaller: ChannelsCaller{contract: contract}, ChannelsTransactor: ChannelsTransactor{contract: contract}, ChannelsFilterer: ChannelsFilterer{contract: contract}}, nil +} + +// Channels is an auto generated Go binding around an Ethereum contract. +type Channels struct { + ChannelsCaller // Read-only binding to the contract + ChannelsTransactor // Write-only binding to the contract + ChannelsFilterer // Log filterer for contract events +} + +// ChannelsCaller is an auto generated read-only Go binding around an Ethereum contract. +type ChannelsCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ChannelsTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ChannelsTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ChannelsFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ChannelsFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ChannelsSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ChannelsSession struct { + Contract *Channels // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ChannelsCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ChannelsCallerSession struct { + Contract *ChannelsCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ChannelsTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ChannelsTransactorSession struct { + Contract *ChannelsTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ChannelsRaw is an auto generated low-level Go binding around an Ethereum contract. +type ChannelsRaw struct { + Contract *Channels // Generic contract binding to access the raw methods on +} + +// ChannelsCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ChannelsCallerRaw struct { + Contract *ChannelsCaller // Generic read-only contract binding to access the raw methods on +} + +// ChannelsTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ChannelsTransactorRaw struct { + Contract *ChannelsTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewChannels creates a new instance of Channels, bound to a specific deployed contract. +func NewChannels(address common.Address, backend bind.ContractBackend) (*Channels, error) { + contract, err := bindChannels(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Channels{ChannelsCaller: ChannelsCaller{contract: contract}, ChannelsTransactor: ChannelsTransactor{contract: contract}, ChannelsFilterer: ChannelsFilterer{contract: contract}}, nil +} + +// NewChannelsCaller creates a new read-only instance of Channels, bound to a specific deployed contract. +func NewChannelsCaller(address common.Address, caller bind.ContractCaller) (*ChannelsCaller, error) { + contract, err := bindChannels(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ChannelsCaller{contract: contract}, nil +} + +// NewChannelsTransactor creates a new write-only instance of Channels, bound to a specific deployed contract. +func NewChannelsTransactor(address common.Address, transactor bind.ContractTransactor) (*ChannelsTransactor, error) { + contract, err := bindChannels(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ChannelsTransactor{contract: contract}, nil +} + +// NewChannelsFilterer creates a new log filterer instance of Channels, bound to a specific deployed contract. +func NewChannelsFilterer(address common.Address, filterer bind.ContractFilterer) (*ChannelsFilterer, error) { + contract, err := bindChannels(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ChannelsFilterer{contract: contract}, nil +} + +// bindChannels binds a generic wrapper to an already deployed contract. +func bindChannels(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ChannelsMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Channels *ChannelsRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Channels.Contract.ChannelsCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Channels *ChannelsRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Channels.Contract.ChannelsTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Channels *ChannelsRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Channels.Contract.ChannelsTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Channels *ChannelsCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Channels.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Channels *ChannelsTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Channels.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Channels *ChannelsTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Channels.Contract.contract.Transact(opts, method, params...) +} + +// GetChannel is a free data retrieval call binding the contract method 0x831c2b82. +// +// Solidity: function getChannel(bytes32 channelId) view returns((bytes32,bool,string,uint256[]) channel) +func (_Channels *ChannelsCaller) GetChannel(opts *bind.CallOpts, channelId [32]byte) (IChannelBaseChannel, error) { + var out []interface{} + err := _Channels.contract.Call(opts, &out, "getChannel", channelId) + + if err != nil { + return *new(IChannelBaseChannel), err + } + + out0 := *abi.ConvertType(out[0], new(IChannelBaseChannel)).(*IChannelBaseChannel) + + return out0, err + +} + +// GetChannel is a free data retrieval call binding the contract method 0x831c2b82. +// +// Solidity: function getChannel(bytes32 channelId) view returns((bytes32,bool,string,uint256[]) channel) +func (_Channels *ChannelsSession) GetChannel(channelId [32]byte) (IChannelBaseChannel, error) { + return _Channels.Contract.GetChannel(&_Channels.CallOpts, channelId) +} + +// GetChannel is a free data retrieval call binding the contract method 0x831c2b82. +// +// Solidity: function getChannel(bytes32 channelId) view returns((bytes32,bool,string,uint256[]) channel) +func (_Channels *ChannelsCallerSession) GetChannel(channelId [32]byte) (IChannelBaseChannel, error) { + return _Channels.Contract.GetChannel(&_Channels.CallOpts, channelId) +} + +// GetChannels is a free data retrieval call binding the contract method 0x9575f6ac. +// +// Solidity: function getChannels() view returns((bytes32,bool,string,uint256[])[] channels) +func (_Channels *ChannelsCaller) GetChannels(opts *bind.CallOpts) ([]IChannelBaseChannel, error) { + var out []interface{} + err := _Channels.contract.Call(opts, &out, "getChannels") + + if err != nil { + return *new([]IChannelBaseChannel), err + } + + out0 := *abi.ConvertType(out[0], new([]IChannelBaseChannel)).(*[]IChannelBaseChannel) + + return out0, err + +} + +// GetChannels is a free data retrieval call binding the contract method 0x9575f6ac. +// +// Solidity: function getChannels() view returns((bytes32,bool,string,uint256[])[] channels) +func (_Channels *ChannelsSession) GetChannels() ([]IChannelBaseChannel, error) { + return _Channels.Contract.GetChannels(&_Channels.CallOpts) +} + +// GetChannels is a free data retrieval call binding the contract method 0x9575f6ac. +// +// Solidity: function getChannels() view returns((bytes32,bool,string,uint256[])[] channels) +func (_Channels *ChannelsCallerSession) GetChannels() ([]IChannelBaseChannel, error) { + return _Channels.Contract.GetChannels(&_Channels.CallOpts) +} + +// GetRolesByChannel is a free data retrieval call binding the contract method 0x99352183. +// +// Solidity: function getRolesByChannel(bytes32 channelId) view returns(uint256[] roleIds) +func (_Channels *ChannelsCaller) GetRolesByChannel(opts *bind.CallOpts, channelId [32]byte) ([]*big.Int, error) { + var out []interface{} + err := _Channels.contract.Call(opts, &out, "getRolesByChannel", channelId) + + if err != nil { + return *new([]*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new([]*big.Int)).(*[]*big.Int) + + return out0, err + +} + +// GetRolesByChannel is a free data retrieval call binding the contract method 0x99352183. +// +// Solidity: function getRolesByChannel(bytes32 channelId) view returns(uint256[] roleIds) +func (_Channels *ChannelsSession) GetRolesByChannel(channelId [32]byte) ([]*big.Int, error) { + return _Channels.Contract.GetRolesByChannel(&_Channels.CallOpts, channelId) +} + +// GetRolesByChannel is a free data retrieval call binding the contract method 0x99352183. +// +// Solidity: function getRolesByChannel(bytes32 channelId) view returns(uint256[] roleIds) +func (_Channels *ChannelsCallerSession) GetRolesByChannel(channelId [32]byte) ([]*big.Int, error) { + return _Channels.Contract.GetRolesByChannel(&_Channels.CallOpts, channelId) +} + +// AddRoleToChannel is a paid mutator transaction binding the contract method 0x37644cf7. +// +// Solidity: function addRoleToChannel(bytes32 channelId, uint256 roleId) returns() +func (_Channels *ChannelsTransactor) AddRoleToChannel(opts *bind.TransactOpts, channelId [32]byte, roleId *big.Int) (*types.Transaction, error) { + return _Channels.contract.Transact(opts, "addRoleToChannel", channelId, roleId) +} + +// AddRoleToChannel is a paid mutator transaction binding the contract method 0x37644cf7. +// +// Solidity: function addRoleToChannel(bytes32 channelId, uint256 roleId) returns() +func (_Channels *ChannelsSession) AddRoleToChannel(channelId [32]byte, roleId *big.Int) (*types.Transaction, error) { + return _Channels.Contract.AddRoleToChannel(&_Channels.TransactOpts, channelId, roleId) +} + +// AddRoleToChannel is a paid mutator transaction binding the contract method 0x37644cf7. +// +// Solidity: function addRoleToChannel(bytes32 channelId, uint256 roleId) returns() +func (_Channels *ChannelsTransactorSession) AddRoleToChannel(channelId [32]byte, roleId *big.Int) (*types.Transaction, error) { + return _Channels.Contract.AddRoleToChannel(&_Channels.TransactOpts, channelId, roleId) +} + +// CreateChannel is a paid mutator transaction binding the contract method 0x921f7175. +// +// Solidity: function createChannel(bytes32 channelId, string metadata, uint256[] roleIds) returns() +func (_Channels *ChannelsTransactor) CreateChannel(opts *bind.TransactOpts, channelId [32]byte, metadata string, roleIds []*big.Int) (*types.Transaction, error) { + return _Channels.contract.Transact(opts, "createChannel", channelId, metadata, roleIds) +} + +// CreateChannel is a paid mutator transaction binding the contract method 0x921f7175. +// +// Solidity: function createChannel(bytes32 channelId, string metadata, uint256[] roleIds) returns() +func (_Channels *ChannelsSession) CreateChannel(channelId [32]byte, metadata string, roleIds []*big.Int) (*types.Transaction, error) { + return _Channels.Contract.CreateChannel(&_Channels.TransactOpts, channelId, metadata, roleIds) +} + +// CreateChannel is a paid mutator transaction binding the contract method 0x921f7175. +// +// Solidity: function createChannel(bytes32 channelId, string metadata, uint256[] roleIds) returns() +func (_Channels *ChannelsTransactorSession) CreateChannel(channelId [32]byte, metadata string, roleIds []*big.Int) (*types.Transaction, error) { + return _Channels.Contract.CreateChannel(&_Channels.TransactOpts, channelId, metadata, roleIds) +} + +// RemoveChannel is a paid mutator transaction binding the contract method 0x02da0e51. +// +// Solidity: function removeChannel(bytes32 channelId) returns() +func (_Channels *ChannelsTransactor) RemoveChannel(opts *bind.TransactOpts, channelId [32]byte) (*types.Transaction, error) { + return _Channels.contract.Transact(opts, "removeChannel", channelId) +} + +// RemoveChannel is a paid mutator transaction binding the contract method 0x02da0e51. +// +// Solidity: function removeChannel(bytes32 channelId) returns() +func (_Channels *ChannelsSession) RemoveChannel(channelId [32]byte) (*types.Transaction, error) { + return _Channels.Contract.RemoveChannel(&_Channels.TransactOpts, channelId) +} + +// RemoveChannel is a paid mutator transaction binding the contract method 0x02da0e51. +// +// Solidity: function removeChannel(bytes32 channelId) returns() +func (_Channels *ChannelsTransactorSession) RemoveChannel(channelId [32]byte) (*types.Transaction, error) { + return _Channels.Contract.RemoveChannel(&_Channels.TransactOpts, channelId) +} + +// RemoveRoleFromChannel is a paid mutator transaction binding the contract method 0xb9de6159. +// +// Solidity: function removeRoleFromChannel(bytes32 channelId, uint256 roleId) returns() +func (_Channels *ChannelsTransactor) RemoveRoleFromChannel(opts *bind.TransactOpts, channelId [32]byte, roleId *big.Int) (*types.Transaction, error) { + return _Channels.contract.Transact(opts, "removeRoleFromChannel", channelId, roleId) +} + +// RemoveRoleFromChannel is a paid mutator transaction binding the contract method 0xb9de6159. +// +// Solidity: function removeRoleFromChannel(bytes32 channelId, uint256 roleId) returns() +func (_Channels *ChannelsSession) RemoveRoleFromChannel(channelId [32]byte, roleId *big.Int) (*types.Transaction, error) { + return _Channels.Contract.RemoveRoleFromChannel(&_Channels.TransactOpts, channelId, roleId) +} + +// RemoveRoleFromChannel is a paid mutator transaction binding the contract method 0xb9de6159. +// +// Solidity: function removeRoleFromChannel(bytes32 channelId, uint256 roleId) returns() +func (_Channels *ChannelsTransactorSession) RemoveRoleFromChannel(channelId [32]byte, roleId *big.Int) (*types.Transaction, error) { + return _Channels.Contract.RemoveRoleFromChannel(&_Channels.TransactOpts, channelId, roleId) +} + +// UpdateChannel is a paid mutator transaction binding the contract method 0xef86d696. +// +// Solidity: function updateChannel(bytes32 channelId, string metadata, bool disabled) returns() +func (_Channels *ChannelsTransactor) UpdateChannel(opts *bind.TransactOpts, channelId [32]byte, metadata string, disabled bool) (*types.Transaction, error) { + return _Channels.contract.Transact(opts, "updateChannel", channelId, metadata, disabled) +} + +// UpdateChannel is a paid mutator transaction binding the contract method 0xef86d696. +// +// Solidity: function updateChannel(bytes32 channelId, string metadata, bool disabled) returns() +func (_Channels *ChannelsSession) UpdateChannel(channelId [32]byte, metadata string, disabled bool) (*types.Transaction, error) { + return _Channels.Contract.UpdateChannel(&_Channels.TransactOpts, channelId, metadata, disabled) +} + +// UpdateChannel is a paid mutator transaction binding the contract method 0xef86d696. +// +// Solidity: function updateChannel(bytes32 channelId, string metadata, bool disabled) returns() +func (_Channels *ChannelsTransactorSession) UpdateChannel(channelId [32]byte, metadata string, disabled bool) (*types.Transaction, error) { + return _Channels.Contract.UpdateChannel(&_Channels.TransactOpts, channelId, metadata, disabled) +} + +// ChannelsApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the Channels contract. +type ChannelsApprovalIterator struct { + Event *ChannelsApproval // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ChannelsApprovalIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ChannelsApproval) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ChannelsApproval) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ChannelsApprovalIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ChannelsApprovalIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ChannelsApproval represents a Approval event raised by the Channels contract. +type ChannelsApproval struct { + Owner common.Address + Approved common.Address + TokenId *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId) +func (_Channels *ChannelsFilterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, approved []common.Address, tokenId []*big.Int) (*ChannelsApprovalIterator, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var approvedRule []interface{} + for _, approvedItem := range approved { + approvedRule = append(approvedRule, approvedItem) + } + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + + logs, sub, err := _Channels.contract.FilterLogs(opts, "Approval", ownerRule, approvedRule, tokenIdRule) + if err != nil { + return nil, err + } + return &ChannelsApprovalIterator{contract: _Channels.contract, event: "Approval", logs: logs, sub: sub}, nil +} + +// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId) +func (_Channels *ChannelsFilterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *ChannelsApproval, owner []common.Address, approved []common.Address, tokenId []*big.Int) (event.Subscription, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var approvedRule []interface{} + for _, approvedItem := range approved { + approvedRule = append(approvedRule, approvedItem) + } + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + + logs, sub, err := _Channels.contract.WatchLogs(opts, "Approval", ownerRule, approvedRule, tokenIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ChannelsApproval) + if err := _Channels.contract.UnpackLog(event, "Approval", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId) +func (_Channels *ChannelsFilterer) ParseApproval(log types.Log) (*ChannelsApproval, error) { + event := new(ChannelsApproval) + if err := _Channels.contract.UnpackLog(event, "Approval", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ChannelsApprovalForAllIterator is returned from FilterApprovalForAll and is used to iterate over the raw logs and unpacked data for ApprovalForAll events raised by the Channels contract. +type ChannelsApprovalForAllIterator struct { + Event *ChannelsApprovalForAll // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ChannelsApprovalForAllIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ChannelsApprovalForAll) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ChannelsApprovalForAll) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ChannelsApprovalForAllIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ChannelsApprovalForAllIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ChannelsApprovalForAll represents a ApprovalForAll event raised by the Channels contract. +type ChannelsApprovalForAll struct { + Owner common.Address + Operator common.Address + Approved bool + Raw types.Log // Blockchain specific contextual infos +} + +// FilterApprovalForAll is a free log retrieval operation binding the contract event 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31. +// +// Solidity: event ApprovalForAll(address indexed owner, address indexed operator, bool approved) +func (_Channels *ChannelsFilterer) FilterApprovalForAll(opts *bind.FilterOpts, owner []common.Address, operator []common.Address) (*ChannelsApprovalForAllIterator, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _Channels.contract.FilterLogs(opts, "ApprovalForAll", ownerRule, operatorRule) + if err != nil { + return nil, err + } + return &ChannelsApprovalForAllIterator{contract: _Channels.contract, event: "ApprovalForAll", logs: logs, sub: sub}, nil +} + +// WatchApprovalForAll is a free log subscription operation binding the contract event 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31. +// +// Solidity: event ApprovalForAll(address indexed owner, address indexed operator, bool approved) +func (_Channels *ChannelsFilterer) WatchApprovalForAll(opts *bind.WatchOpts, sink chan<- *ChannelsApprovalForAll, owner []common.Address, operator []common.Address) (event.Subscription, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _Channels.contract.WatchLogs(opts, "ApprovalForAll", ownerRule, operatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ChannelsApprovalForAll) + if err := _Channels.contract.UnpackLog(event, "ApprovalForAll", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseApprovalForAll is a log parse operation binding the contract event 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31. +// +// Solidity: event ApprovalForAll(address indexed owner, address indexed operator, bool approved) +func (_Channels *ChannelsFilterer) ParseApprovalForAll(log types.Log) (*ChannelsApprovalForAll, error) { + event := new(ChannelsApprovalForAll) + if err := _Channels.contract.UnpackLog(event, "ApprovalForAll", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ChannelsBannedIterator is returned from FilterBanned and is used to iterate over the raw logs and unpacked data for Banned events raised by the Channels contract. +type ChannelsBannedIterator struct { + Event *ChannelsBanned // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ChannelsBannedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ChannelsBanned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ChannelsBanned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ChannelsBannedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ChannelsBannedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ChannelsBanned represents a Banned event raised by the Channels contract. +type ChannelsBanned struct { + Moderator common.Address + TokenId *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBanned is a free log retrieval operation binding the contract event 0x8f9d2f181f599e221d5959b9acbebb1f42c8146251755fd61fc0de85f5d97162. +// +// Solidity: event Banned(address indexed moderator, uint256 indexed tokenId) +func (_Channels *ChannelsFilterer) FilterBanned(opts *bind.FilterOpts, moderator []common.Address, tokenId []*big.Int) (*ChannelsBannedIterator, error) { + + var moderatorRule []interface{} + for _, moderatorItem := range moderator { + moderatorRule = append(moderatorRule, moderatorItem) + } + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + + logs, sub, err := _Channels.contract.FilterLogs(opts, "Banned", moderatorRule, tokenIdRule) + if err != nil { + return nil, err + } + return &ChannelsBannedIterator{contract: _Channels.contract, event: "Banned", logs: logs, sub: sub}, nil +} + +// WatchBanned is a free log subscription operation binding the contract event 0x8f9d2f181f599e221d5959b9acbebb1f42c8146251755fd61fc0de85f5d97162. +// +// Solidity: event Banned(address indexed moderator, uint256 indexed tokenId) +func (_Channels *ChannelsFilterer) WatchBanned(opts *bind.WatchOpts, sink chan<- *ChannelsBanned, moderator []common.Address, tokenId []*big.Int) (event.Subscription, error) { + + var moderatorRule []interface{} + for _, moderatorItem := range moderator { + moderatorRule = append(moderatorRule, moderatorItem) + } + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + + logs, sub, err := _Channels.contract.WatchLogs(opts, "Banned", moderatorRule, tokenIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ChannelsBanned) + if err := _Channels.contract.UnpackLog(event, "Banned", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBanned is a log parse operation binding the contract event 0x8f9d2f181f599e221d5959b9acbebb1f42c8146251755fd61fc0de85f5d97162. +// +// Solidity: event Banned(address indexed moderator, uint256 indexed tokenId) +func (_Channels *ChannelsFilterer) ParseBanned(log types.Log) (*ChannelsBanned, error) { + event := new(ChannelsBanned) + if err := _Channels.contract.UnpackLog(event, "Banned", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ChannelsChannelCreatedIterator is returned from FilterChannelCreated and is used to iterate over the raw logs and unpacked data for ChannelCreated events raised by the Channels contract. +type ChannelsChannelCreatedIterator struct { + Event *ChannelsChannelCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ChannelsChannelCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ChannelsChannelCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ChannelsChannelCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ChannelsChannelCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ChannelsChannelCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ChannelsChannelCreated represents a ChannelCreated event raised by the Channels contract. +type ChannelsChannelCreated struct { + Caller common.Address + ChannelId [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterChannelCreated is a free log retrieval operation binding the contract event 0xdd6c5b83be3557f8b2674712946f9f05dcd882b82bfd58b9539b9706efd35d8c. +// +// Solidity: event ChannelCreated(address indexed caller, bytes32 channelId) +func (_Channels *ChannelsFilterer) FilterChannelCreated(opts *bind.FilterOpts, caller []common.Address) (*ChannelsChannelCreatedIterator, error) { + + var callerRule []interface{} + for _, callerItem := range caller { + callerRule = append(callerRule, callerItem) + } + + logs, sub, err := _Channels.contract.FilterLogs(opts, "ChannelCreated", callerRule) + if err != nil { + return nil, err + } + return &ChannelsChannelCreatedIterator{contract: _Channels.contract, event: "ChannelCreated", logs: logs, sub: sub}, nil +} + +// WatchChannelCreated is a free log subscription operation binding the contract event 0xdd6c5b83be3557f8b2674712946f9f05dcd882b82bfd58b9539b9706efd35d8c. +// +// Solidity: event ChannelCreated(address indexed caller, bytes32 channelId) +func (_Channels *ChannelsFilterer) WatchChannelCreated(opts *bind.WatchOpts, sink chan<- *ChannelsChannelCreated, caller []common.Address) (event.Subscription, error) { + + var callerRule []interface{} + for _, callerItem := range caller { + callerRule = append(callerRule, callerItem) + } + + logs, sub, err := _Channels.contract.WatchLogs(opts, "ChannelCreated", callerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ChannelsChannelCreated) + if err := _Channels.contract.UnpackLog(event, "ChannelCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseChannelCreated is a log parse operation binding the contract event 0xdd6c5b83be3557f8b2674712946f9f05dcd882b82bfd58b9539b9706efd35d8c. +// +// Solidity: event ChannelCreated(address indexed caller, bytes32 channelId) +func (_Channels *ChannelsFilterer) ParseChannelCreated(log types.Log) (*ChannelsChannelCreated, error) { + event := new(ChannelsChannelCreated) + if err := _Channels.contract.UnpackLog(event, "ChannelCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ChannelsChannelRemovedIterator is returned from FilterChannelRemoved and is used to iterate over the raw logs and unpacked data for ChannelRemoved events raised by the Channels contract. +type ChannelsChannelRemovedIterator struct { + Event *ChannelsChannelRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ChannelsChannelRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ChannelsChannelRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ChannelsChannelRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ChannelsChannelRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ChannelsChannelRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ChannelsChannelRemoved represents a ChannelRemoved event raised by the Channels contract. +type ChannelsChannelRemoved struct { + Caller common.Address + ChannelId [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterChannelRemoved is a free log retrieval operation binding the contract event 0x3a3f387aa42656bc1732adfc7aea5cde9ccc05a59f9af9c29ebfa68e66383e93. +// +// Solidity: event ChannelRemoved(address indexed caller, bytes32 channelId) +func (_Channels *ChannelsFilterer) FilterChannelRemoved(opts *bind.FilterOpts, caller []common.Address) (*ChannelsChannelRemovedIterator, error) { + + var callerRule []interface{} + for _, callerItem := range caller { + callerRule = append(callerRule, callerItem) + } + + logs, sub, err := _Channels.contract.FilterLogs(opts, "ChannelRemoved", callerRule) + if err != nil { + return nil, err + } + return &ChannelsChannelRemovedIterator{contract: _Channels.contract, event: "ChannelRemoved", logs: logs, sub: sub}, nil +} + +// WatchChannelRemoved is a free log subscription operation binding the contract event 0x3a3f387aa42656bc1732adfc7aea5cde9ccc05a59f9af9c29ebfa68e66383e93. +// +// Solidity: event ChannelRemoved(address indexed caller, bytes32 channelId) +func (_Channels *ChannelsFilterer) WatchChannelRemoved(opts *bind.WatchOpts, sink chan<- *ChannelsChannelRemoved, caller []common.Address) (event.Subscription, error) { + + var callerRule []interface{} + for _, callerItem := range caller { + callerRule = append(callerRule, callerItem) + } + + logs, sub, err := _Channels.contract.WatchLogs(opts, "ChannelRemoved", callerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ChannelsChannelRemoved) + if err := _Channels.contract.UnpackLog(event, "ChannelRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseChannelRemoved is a log parse operation binding the contract event 0x3a3f387aa42656bc1732adfc7aea5cde9ccc05a59f9af9c29ebfa68e66383e93. +// +// Solidity: event ChannelRemoved(address indexed caller, bytes32 channelId) +func (_Channels *ChannelsFilterer) ParseChannelRemoved(log types.Log) (*ChannelsChannelRemoved, error) { + event := new(ChannelsChannelRemoved) + if err := _Channels.contract.UnpackLog(event, "ChannelRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ChannelsChannelRoleAddedIterator is returned from FilterChannelRoleAdded and is used to iterate over the raw logs and unpacked data for ChannelRoleAdded events raised by the Channels contract. +type ChannelsChannelRoleAddedIterator struct { + Event *ChannelsChannelRoleAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ChannelsChannelRoleAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ChannelsChannelRoleAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ChannelsChannelRoleAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ChannelsChannelRoleAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ChannelsChannelRoleAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ChannelsChannelRoleAdded represents a ChannelRoleAdded event raised by the Channels contract. +type ChannelsChannelRoleAdded struct { + Caller common.Address + ChannelId [32]byte + RoleId *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterChannelRoleAdded is a free log retrieval operation binding the contract event 0x2b10481523b59a7978f8ab73b237349b0f38c801f6094bdc8994d379c067d713. +// +// Solidity: event ChannelRoleAdded(address indexed caller, bytes32 channelId, uint256 roleId) +func (_Channels *ChannelsFilterer) FilterChannelRoleAdded(opts *bind.FilterOpts, caller []common.Address) (*ChannelsChannelRoleAddedIterator, error) { + + var callerRule []interface{} + for _, callerItem := range caller { + callerRule = append(callerRule, callerItem) + } + + logs, sub, err := _Channels.contract.FilterLogs(opts, "ChannelRoleAdded", callerRule) + if err != nil { + return nil, err + } + return &ChannelsChannelRoleAddedIterator{contract: _Channels.contract, event: "ChannelRoleAdded", logs: logs, sub: sub}, nil +} + +// WatchChannelRoleAdded is a free log subscription operation binding the contract event 0x2b10481523b59a7978f8ab73b237349b0f38c801f6094bdc8994d379c067d713. +// +// Solidity: event ChannelRoleAdded(address indexed caller, bytes32 channelId, uint256 roleId) +func (_Channels *ChannelsFilterer) WatchChannelRoleAdded(opts *bind.WatchOpts, sink chan<- *ChannelsChannelRoleAdded, caller []common.Address) (event.Subscription, error) { + + var callerRule []interface{} + for _, callerItem := range caller { + callerRule = append(callerRule, callerItem) + } + + logs, sub, err := _Channels.contract.WatchLogs(opts, "ChannelRoleAdded", callerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ChannelsChannelRoleAdded) + if err := _Channels.contract.UnpackLog(event, "ChannelRoleAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseChannelRoleAdded is a log parse operation binding the contract event 0x2b10481523b59a7978f8ab73b237349b0f38c801f6094bdc8994d379c067d713. +// +// Solidity: event ChannelRoleAdded(address indexed caller, bytes32 channelId, uint256 roleId) +func (_Channels *ChannelsFilterer) ParseChannelRoleAdded(log types.Log) (*ChannelsChannelRoleAdded, error) { + event := new(ChannelsChannelRoleAdded) + if err := _Channels.contract.UnpackLog(event, "ChannelRoleAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ChannelsChannelRoleRemovedIterator is returned from FilterChannelRoleRemoved and is used to iterate over the raw logs and unpacked data for ChannelRoleRemoved events raised by the Channels contract. +type ChannelsChannelRoleRemovedIterator struct { + Event *ChannelsChannelRoleRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ChannelsChannelRoleRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ChannelsChannelRoleRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ChannelsChannelRoleRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ChannelsChannelRoleRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ChannelsChannelRoleRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ChannelsChannelRoleRemoved represents a ChannelRoleRemoved event raised by the Channels contract. +type ChannelsChannelRoleRemoved struct { + Caller common.Address + ChannelId [32]byte + RoleId *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterChannelRoleRemoved is a free log retrieval operation binding the contract event 0xaee688d80dbf97230e5d2b4b06aa7074bfe38ddd8abf856551177db303956129. +// +// Solidity: event ChannelRoleRemoved(address indexed caller, bytes32 channelId, uint256 roleId) +func (_Channels *ChannelsFilterer) FilterChannelRoleRemoved(opts *bind.FilterOpts, caller []common.Address) (*ChannelsChannelRoleRemovedIterator, error) { + + var callerRule []interface{} + for _, callerItem := range caller { + callerRule = append(callerRule, callerItem) + } + + logs, sub, err := _Channels.contract.FilterLogs(opts, "ChannelRoleRemoved", callerRule) + if err != nil { + return nil, err + } + return &ChannelsChannelRoleRemovedIterator{contract: _Channels.contract, event: "ChannelRoleRemoved", logs: logs, sub: sub}, nil +} + +// WatchChannelRoleRemoved is a free log subscription operation binding the contract event 0xaee688d80dbf97230e5d2b4b06aa7074bfe38ddd8abf856551177db303956129. +// +// Solidity: event ChannelRoleRemoved(address indexed caller, bytes32 channelId, uint256 roleId) +func (_Channels *ChannelsFilterer) WatchChannelRoleRemoved(opts *bind.WatchOpts, sink chan<- *ChannelsChannelRoleRemoved, caller []common.Address) (event.Subscription, error) { + + var callerRule []interface{} + for _, callerItem := range caller { + callerRule = append(callerRule, callerItem) + } + + logs, sub, err := _Channels.contract.WatchLogs(opts, "ChannelRoleRemoved", callerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ChannelsChannelRoleRemoved) + if err := _Channels.contract.UnpackLog(event, "ChannelRoleRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseChannelRoleRemoved is a log parse operation binding the contract event 0xaee688d80dbf97230e5d2b4b06aa7074bfe38ddd8abf856551177db303956129. +// +// Solidity: event ChannelRoleRemoved(address indexed caller, bytes32 channelId, uint256 roleId) +func (_Channels *ChannelsFilterer) ParseChannelRoleRemoved(log types.Log) (*ChannelsChannelRoleRemoved, error) { + event := new(ChannelsChannelRoleRemoved) + if err := _Channels.contract.UnpackLog(event, "ChannelRoleRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ChannelsChannelUpdatedIterator is returned from FilterChannelUpdated and is used to iterate over the raw logs and unpacked data for ChannelUpdated events raised by the Channels contract. +type ChannelsChannelUpdatedIterator struct { + Event *ChannelsChannelUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ChannelsChannelUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ChannelsChannelUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ChannelsChannelUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ChannelsChannelUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ChannelsChannelUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ChannelsChannelUpdated represents a ChannelUpdated event raised by the Channels contract. +type ChannelsChannelUpdated struct { + Caller common.Address + ChannelId [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterChannelUpdated is a free log retrieval operation binding the contract event 0x94af4a611b3fb1eaa653a6b29f82b71bcea25ca378171c5f059010fa18e0716e. +// +// Solidity: event ChannelUpdated(address indexed caller, bytes32 channelId) +func (_Channels *ChannelsFilterer) FilterChannelUpdated(opts *bind.FilterOpts, caller []common.Address) (*ChannelsChannelUpdatedIterator, error) { + + var callerRule []interface{} + for _, callerItem := range caller { + callerRule = append(callerRule, callerItem) + } + + logs, sub, err := _Channels.contract.FilterLogs(opts, "ChannelUpdated", callerRule) + if err != nil { + return nil, err + } + return &ChannelsChannelUpdatedIterator{contract: _Channels.contract, event: "ChannelUpdated", logs: logs, sub: sub}, nil +} + +// WatchChannelUpdated is a free log subscription operation binding the contract event 0x94af4a611b3fb1eaa653a6b29f82b71bcea25ca378171c5f059010fa18e0716e. +// +// Solidity: event ChannelUpdated(address indexed caller, bytes32 channelId) +func (_Channels *ChannelsFilterer) WatchChannelUpdated(opts *bind.WatchOpts, sink chan<- *ChannelsChannelUpdated, caller []common.Address) (event.Subscription, error) { + + var callerRule []interface{} + for _, callerItem := range caller { + callerRule = append(callerRule, callerItem) + } + + logs, sub, err := _Channels.contract.WatchLogs(opts, "ChannelUpdated", callerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ChannelsChannelUpdated) + if err := _Channels.contract.UnpackLog(event, "ChannelUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseChannelUpdated is a log parse operation binding the contract event 0x94af4a611b3fb1eaa653a6b29f82b71bcea25ca378171c5f059010fa18e0716e. +// +// Solidity: event ChannelUpdated(address indexed caller, bytes32 channelId) +func (_Channels *ChannelsFilterer) ParseChannelUpdated(log types.Log) (*ChannelsChannelUpdated, error) { + event := new(ChannelsChannelUpdated) + if err := _Channels.contract.UnpackLog(event, "ChannelUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ChannelsConsecutiveTransferIterator is returned from FilterConsecutiveTransfer and is used to iterate over the raw logs and unpacked data for ConsecutiveTransfer events raised by the Channels contract. +type ChannelsConsecutiveTransferIterator struct { + Event *ChannelsConsecutiveTransfer // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ChannelsConsecutiveTransferIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ChannelsConsecutiveTransfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ChannelsConsecutiveTransfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ChannelsConsecutiveTransferIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ChannelsConsecutiveTransferIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ChannelsConsecutiveTransfer represents a ConsecutiveTransfer event raised by the Channels contract. +type ChannelsConsecutiveTransfer struct { + FromTokenId *big.Int + ToTokenId *big.Int + From common.Address + To common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterConsecutiveTransfer is a free log retrieval operation binding the contract event 0xdeaa91b6123d068f5821d0fb0678463d1a8a6079fe8af5de3ce5e896dcf9133d. +// +// Solidity: event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to) +func (_Channels *ChannelsFilterer) FilterConsecutiveTransfer(opts *bind.FilterOpts, fromTokenId []*big.Int, from []common.Address, to []common.Address) (*ChannelsConsecutiveTransferIterator, error) { + + var fromTokenIdRule []interface{} + for _, fromTokenIdItem := range fromTokenId { + fromTokenIdRule = append(fromTokenIdRule, fromTokenIdItem) + } + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _Channels.contract.FilterLogs(opts, "ConsecutiveTransfer", fromTokenIdRule, fromRule, toRule) + if err != nil { + return nil, err + } + return &ChannelsConsecutiveTransferIterator{contract: _Channels.contract, event: "ConsecutiveTransfer", logs: logs, sub: sub}, nil +} + +// WatchConsecutiveTransfer is a free log subscription operation binding the contract event 0xdeaa91b6123d068f5821d0fb0678463d1a8a6079fe8af5de3ce5e896dcf9133d. +// +// Solidity: event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to) +func (_Channels *ChannelsFilterer) WatchConsecutiveTransfer(opts *bind.WatchOpts, sink chan<- *ChannelsConsecutiveTransfer, fromTokenId []*big.Int, from []common.Address, to []common.Address) (event.Subscription, error) { + + var fromTokenIdRule []interface{} + for _, fromTokenIdItem := range fromTokenId { + fromTokenIdRule = append(fromTokenIdRule, fromTokenIdItem) + } + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _Channels.contract.WatchLogs(opts, "ConsecutiveTransfer", fromTokenIdRule, fromRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ChannelsConsecutiveTransfer) + if err := _Channels.contract.UnpackLog(event, "ConsecutiveTransfer", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseConsecutiveTransfer is a log parse operation binding the contract event 0xdeaa91b6123d068f5821d0fb0678463d1a8a6079fe8af5de3ce5e896dcf9133d. +// +// Solidity: event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to) +func (_Channels *ChannelsFilterer) ParseConsecutiveTransfer(log types.Log) (*ChannelsConsecutiveTransfer, error) { + event := new(ChannelsConsecutiveTransfer) + if err := _Channels.contract.UnpackLog(event, "ConsecutiveTransfer", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ChannelsInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the Channels contract. +type ChannelsInitializedIterator struct { + Event *ChannelsInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ChannelsInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ChannelsInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ChannelsInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ChannelsInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ChannelsInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ChannelsInitialized represents a Initialized event raised by the Channels contract. +type ChannelsInitialized struct { + Version uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_Channels *ChannelsFilterer) FilterInitialized(opts *bind.FilterOpts) (*ChannelsInitializedIterator, error) { + + logs, sub, err := _Channels.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &ChannelsInitializedIterator{contract: _Channels.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_Channels *ChannelsFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *ChannelsInitialized) (event.Subscription, error) { + + logs, sub, err := _Channels.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ChannelsInitialized) + if err := _Channels.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_Channels *ChannelsFilterer) ParseInitialized(log types.Log) (*ChannelsInitialized, error) { + event := new(ChannelsInitialized) + if err := _Channels.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ChannelsInterfaceAddedIterator is returned from FilterInterfaceAdded and is used to iterate over the raw logs and unpacked data for InterfaceAdded events raised by the Channels contract. +type ChannelsInterfaceAddedIterator struct { + Event *ChannelsInterfaceAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ChannelsInterfaceAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ChannelsInterfaceAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ChannelsInterfaceAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ChannelsInterfaceAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ChannelsInterfaceAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ChannelsInterfaceAdded represents a InterfaceAdded event raised by the Channels contract. +type ChannelsInterfaceAdded struct { + InterfaceId [4]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInterfaceAdded is a free log retrieval operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_Channels *ChannelsFilterer) FilterInterfaceAdded(opts *bind.FilterOpts, interfaceId [][4]byte) (*ChannelsInterfaceAddedIterator, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _Channels.contract.FilterLogs(opts, "InterfaceAdded", interfaceIdRule) + if err != nil { + return nil, err + } + return &ChannelsInterfaceAddedIterator{contract: _Channels.contract, event: "InterfaceAdded", logs: logs, sub: sub}, nil +} + +// WatchInterfaceAdded is a free log subscription operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_Channels *ChannelsFilterer) WatchInterfaceAdded(opts *bind.WatchOpts, sink chan<- *ChannelsInterfaceAdded, interfaceId [][4]byte) (event.Subscription, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _Channels.contract.WatchLogs(opts, "InterfaceAdded", interfaceIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ChannelsInterfaceAdded) + if err := _Channels.contract.UnpackLog(event, "InterfaceAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInterfaceAdded is a log parse operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_Channels *ChannelsFilterer) ParseInterfaceAdded(log types.Log) (*ChannelsInterfaceAdded, error) { + event := new(ChannelsInterfaceAdded) + if err := _Channels.contract.UnpackLog(event, "InterfaceAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ChannelsInterfaceRemovedIterator is returned from FilterInterfaceRemoved and is used to iterate over the raw logs and unpacked data for InterfaceRemoved events raised by the Channels contract. +type ChannelsInterfaceRemovedIterator struct { + Event *ChannelsInterfaceRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ChannelsInterfaceRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ChannelsInterfaceRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ChannelsInterfaceRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ChannelsInterfaceRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ChannelsInterfaceRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ChannelsInterfaceRemoved represents a InterfaceRemoved event raised by the Channels contract. +type ChannelsInterfaceRemoved struct { + InterfaceId [4]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInterfaceRemoved is a free log retrieval operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_Channels *ChannelsFilterer) FilterInterfaceRemoved(opts *bind.FilterOpts, interfaceId [][4]byte) (*ChannelsInterfaceRemovedIterator, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _Channels.contract.FilterLogs(opts, "InterfaceRemoved", interfaceIdRule) + if err != nil { + return nil, err + } + return &ChannelsInterfaceRemovedIterator{contract: _Channels.contract, event: "InterfaceRemoved", logs: logs, sub: sub}, nil +} + +// WatchInterfaceRemoved is a free log subscription operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_Channels *ChannelsFilterer) WatchInterfaceRemoved(opts *bind.WatchOpts, sink chan<- *ChannelsInterfaceRemoved, interfaceId [][4]byte) (event.Subscription, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _Channels.contract.WatchLogs(opts, "InterfaceRemoved", interfaceIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ChannelsInterfaceRemoved) + if err := _Channels.contract.UnpackLog(event, "InterfaceRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInterfaceRemoved is a log parse operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_Channels *ChannelsFilterer) ParseInterfaceRemoved(log types.Log) (*ChannelsInterfaceRemoved, error) { + event := new(ChannelsInterfaceRemoved) + if err := _Channels.contract.UnpackLog(event, "InterfaceRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ChannelsOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the Channels contract. +type ChannelsOwnershipTransferredIterator struct { + Event *ChannelsOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ChannelsOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ChannelsOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ChannelsOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ChannelsOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ChannelsOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ChannelsOwnershipTransferred represents a OwnershipTransferred event raised by the Channels contract. +type ChannelsOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_Channels *ChannelsFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*ChannelsOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _Channels.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &ChannelsOwnershipTransferredIterator{contract: _Channels.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_Channels *ChannelsFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *ChannelsOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _Channels.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ChannelsOwnershipTransferred) + if err := _Channels.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_Channels *ChannelsFilterer) ParseOwnershipTransferred(log types.Log) (*ChannelsOwnershipTransferred, error) { + event := new(ChannelsOwnershipTransferred) + if err := _Channels.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ChannelsPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the Channels contract. +type ChannelsPausedIterator struct { + Event *ChannelsPaused // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ChannelsPausedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ChannelsPaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ChannelsPaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ChannelsPausedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ChannelsPausedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ChannelsPaused represents a Paused event raised by the Channels contract. +type ChannelsPaused struct { + Account common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPaused is a free log retrieval operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. +// +// Solidity: event Paused(address account) +func (_Channels *ChannelsFilterer) FilterPaused(opts *bind.FilterOpts) (*ChannelsPausedIterator, error) { + + logs, sub, err := _Channels.contract.FilterLogs(opts, "Paused") + if err != nil { + return nil, err + } + return &ChannelsPausedIterator{contract: _Channels.contract, event: "Paused", logs: logs, sub: sub}, nil +} + +// WatchPaused is a free log subscription operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. +// +// Solidity: event Paused(address account) +func (_Channels *ChannelsFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *ChannelsPaused) (event.Subscription, error) { + + logs, sub, err := _Channels.contract.WatchLogs(opts, "Paused") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ChannelsPaused) + if err := _Channels.contract.UnpackLog(event, "Paused", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParsePaused is a log parse operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. +// +// Solidity: event Paused(address account) +func (_Channels *ChannelsFilterer) ParsePaused(log types.Log) (*ChannelsPaused, error) { + event := new(ChannelsPaused) + if err := _Channels.contract.UnpackLog(event, "Paused", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ChannelsSubscriptionUpdateIterator is returned from FilterSubscriptionUpdate and is used to iterate over the raw logs and unpacked data for SubscriptionUpdate events raised by the Channels contract. +type ChannelsSubscriptionUpdateIterator struct { + Event *ChannelsSubscriptionUpdate // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ChannelsSubscriptionUpdateIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ChannelsSubscriptionUpdate) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ChannelsSubscriptionUpdate) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ChannelsSubscriptionUpdateIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ChannelsSubscriptionUpdateIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ChannelsSubscriptionUpdate represents a SubscriptionUpdate event raised by the Channels contract. +type ChannelsSubscriptionUpdate struct { + TokenId *big.Int + Expiration uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSubscriptionUpdate is a free log retrieval operation binding the contract event 0x2ec2be2c4b90c2cf13ecb6751a24daed6bb741ae5ed3f7371aabf9402f6d62e8. +// +// Solidity: event SubscriptionUpdate(uint256 indexed tokenId, uint64 expiration) +func (_Channels *ChannelsFilterer) FilterSubscriptionUpdate(opts *bind.FilterOpts, tokenId []*big.Int) (*ChannelsSubscriptionUpdateIterator, error) { + + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + + logs, sub, err := _Channels.contract.FilterLogs(opts, "SubscriptionUpdate", tokenIdRule) + if err != nil { + return nil, err + } + return &ChannelsSubscriptionUpdateIterator{contract: _Channels.contract, event: "SubscriptionUpdate", logs: logs, sub: sub}, nil +} + +// WatchSubscriptionUpdate is a free log subscription operation binding the contract event 0x2ec2be2c4b90c2cf13ecb6751a24daed6bb741ae5ed3f7371aabf9402f6d62e8. +// +// Solidity: event SubscriptionUpdate(uint256 indexed tokenId, uint64 expiration) +func (_Channels *ChannelsFilterer) WatchSubscriptionUpdate(opts *bind.WatchOpts, sink chan<- *ChannelsSubscriptionUpdate, tokenId []*big.Int) (event.Subscription, error) { + + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + + logs, sub, err := _Channels.contract.WatchLogs(opts, "SubscriptionUpdate", tokenIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ChannelsSubscriptionUpdate) + if err := _Channels.contract.UnpackLog(event, "SubscriptionUpdate", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseSubscriptionUpdate is a log parse operation binding the contract event 0x2ec2be2c4b90c2cf13ecb6751a24daed6bb741ae5ed3f7371aabf9402f6d62e8. +// +// Solidity: event SubscriptionUpdate(uint256 indexed tokenId, uint64 expiration) +func (_Channels *ChannelsFilterer) ParseSubscriptionUpdate(log types.Log) (*ChannelsSubscriptionUpdate, error) { + event := new(ChannelsSubscriptionUpdate) + if err := _Channels.contract.UnpackLog(event, "SubscriptionUpdate", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ChannelsTransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the Channels contract. +type ChannelsTransferIterator struct { + Event *ChannelsTransfer // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ChannelsTransferIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ChannelsTransfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ChannelsTransfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ChannelsTransferIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ChannelsTransferIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ChannelsTransfer represents a Transfer event raised by the Channels contract. +type ChannelsTransfer struct { + From common.Address + To common.Address + TokenId *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 indexed tokenId) +func (_Channels *ChannelsFilterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address, tokenId []*big.Int) (*ChannelsTransferIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + + logs, sub, err := _Channels.contract.FilterLogs(opts, "Transfer", fromRule, toRule, tokenIdRule) + if err != nil { + return nil, err + } + return &ChannelsTransferIterator{contract: _Channels.contract, event: "Transfer", logs: logs, sub: sub}, nil +} + +// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 indexed tokenId) +func (_Channels *ChannelsFilterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *ChannelsTransfer, from []common.Address, to []common.Address, tokenId []*big.Int) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + + logs, sub, err := _Channels.contract.WatchLogs(opts, "Transfer", fromRule, toRule, tokenIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ChannelsTransfer) + if err := _Channels.contract.UnpackLog(event, "Transfer", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 indexed tokenId) +func (_Channels *ChannelsFilterer) ParseTransfer(log types.Log) (*ChannelsTransfer, error) { + event := new(ChannelsTransfer) + if err := _Channels.contract.UnpackLog(event, "Transfer", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ChannelsUnbannedIterator is returned from FilterUnbanned and is used to iterate over the raw logs and unpacked data for Unbanned events raised by the Channels contract. +type ChannelsUnbannedIterator struct { + Event *ChannelsUnbanned // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ChannelsUnbannedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ChannelsUnbanned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ChannelsUnbanned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ChannelsUnbannedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ChannelsUnbannedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ChannelsUnbanned represents a Unbanned event raised by the Channels contract. +type ChannelsUnbanned struct { + Moderator common.Address + TokenId *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUnbanned is a free log retrieval operation binding the contract event 0xf46dc693169fba0f08556bb54c8abc995b37535f1c2322598f0e671982d8ff86. +// +// Solidity: event Unbanned(address indexed moderator, uint256 indexed tokenId) +func (_Channels *ChannelsFilterer) FilterUnbanned(opts *bind.FilterOpts, moderator []common.Address, tokenId []*big.Int) (*ChannelsUnbannedIterator, error) { + + var moderatorRule []interface{} + for _, moderatorItem := range moderator { + moderatorRule = append(moderatorRule, moderatorItem) + } + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + + logs, sub, err := _Channels.contract.FilterLogs(opts, "Unbanned", moderatorRule, tokenIdRule) + if err != nil { + return nil, err + } + return &ChannelsUnbannedIterator{contract: _Channels.contract, event: "Unbanned", logs: logs, sub: sub}, nil +} + +// WatchUnbanned is a free log subscription operation binding the contract event 0xf46dc693169fba0f08556bb54c8abc995b37535f1c2322598f0e671982d8ff86. +// +// Solidity: event Unbanned(address indexed moderator, uint256 indexed tokenId) +func (_Channels *ChannelsFilterer) WatchUnbanned(opts *bind.WatchOpts, sink chan<- *ChannelsUnbanned, moderator []common.Address, tokenId []*big.Int) (event.Subscription, error) { + + var moderatorRule []interface{} + for _, moderatorItem := range moderator { + moderatorRule = append(moderatorRule, moderatorItem) + } + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + + logs, sub, err := _Channels.contract.WatchLogs(opts, "Unbanned", moderatorRule, tokenIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ChannelsUnbanned) + if err := _Channels.contract.UnpackLog(event, "Unbanned", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUnbanned is a log parse operation binding the contract event 0xf46dc693169fba0f08556bb54c8abc995b37535f1c2322598f0e671982d8ff86. +// +// Solidity: event Unbanned(address indexed moderator, uint256 indexed tokenId) +func (_Channels *ChannelsFilterer) ParseUnbanned(log types.Log) (*ChannelsUnbanned, error) { + event := new(ChannelsUnbanned) + if err := _Channels.contract.UnpackLog(event, "Unbanned", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ChannelsUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the Channels contract. +type ChannelsUnpausedIterator struct { + Event *ChannelsUnpaused // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ChannelsUnpausedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ChannelsUnpaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ChannelsUnpaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ChannelsUnpausedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ChannelsUnpausedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ChannelsUnpaused represents a Unpaused event raised by the Channels contract. +type ChannelsUnpaused struct { + Account common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUnpaused is a free log retrieval operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. +// +// Solidity: event Unpaused(address account) +func (_Channels *ChannelsFilterer) FilterUnpaused(opts *bind.FilterOpts) (*ChannelsUnpausedIterator, error) { + + logs, sub, err := _Channels.contract.FilterLogs(opts, "Unpaused") + if err != nil { + return nil, err + } + return &ChannelsUnpausedIterator{contract: _Channels.contract, event: "Unpaused", logs: logs, sub: sub}, nil +} + +// WatchUnpaused is a free log subscription operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. +// +// Solidity: event Unpaused(address account) +func (_Channels *ChannelsFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *ChannelsUnpaused) (event.Subscription, error) { + + logs, sub, err := _Channels.contract.WatchLogs(opts, "Unpaused") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ChannelsUnpaused) + if err := _Channels.contract.UnpackLog(event, "Unpaused", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUnpaused is a log parse operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. +// +// Solidity: event Unpaused(address account) +func (_Channels *ChannelsFilterer) ParseUnpaused(log types.Log) (*ChannelsUnpaused, error) { + event := new(ChannelsUnpaused) + if err := _Channels.contract.UnpackLog(event, "Unpaused", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/node/contracts/base/entitlements_manager.go b/core/node/contracts/base/entitlements_manager.go new file mode 100644 index 000000000..402d96731 --- /dev/null +++ b/core/node/contracts/base/entitlements_manager.go @@ -0,0 +1,703 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package base + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// IEntitlementsManagerBaseEntitlement is an auto generated low-level Go binding around an user-defined struct. +type IEntitlementsManagerBaseEntitlement struct { + Name string + ModuleAddress common.Address + ModuleType string + IsImmutable bool +} + +// IEntitlementsManagerEntitlementData is an auto generated low-level Go binding around an user-defined struct. +type IEntitlementsManagerEntitlementData struct { + EntitlementType string + EntitlementData []byte +} + +// EntitlementsManagerMetaData contains all meta data concerning the EntitlementsManager contract. +var EntitlementsManagerMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"addEntitlementModule\",\"inputs\":[{\"name\":\"entitlement\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addImmutableEntitlements\",\"inputs\":[{\"name\":\"entitlements\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getEntitlement\",\"inputs\":[{\"name\":\"entitlement\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"entitlements\",\"type\":\"tuple\",\"internalType\":\"structIEntitlementsManagerBase.Entitlement\",\"components\":[{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"moduleAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"moduleType\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"isImmutable\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEntitlementDataByPermission\",\"inputs\":[{\"name\":\"permission\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIEntitlementsManager.EntitlementData[]\",\"components\":[{\"name\":\"entitlementType\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"entitlementData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEntitlements\",\"inputs\":[],\"outputs\":[{\"name\":\"entitlements\",\"type\":\"tuple[]\",\"internalType\":\"structIEntitlementsManagerBase.Entitlement[]\",\"components\":[{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"moduleAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"moduleType\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"isImmutable\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isEntitledToChannel\",\"inputs\":[{\"name\":\"channelId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permission\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isEntitledToSpace\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permission\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeEntitlementModule\",\"inputs\":[{\"name\":\"entitlement\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"EntitlementModuleAdded\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"entitlement\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EntitlementModuleRemoved\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"entitlement\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false}]", +} + +// EntitlementsManagerABI is the input ABI used to generate the binding from. +// Deprecated: Use EntitlementsManagerMetaData.ABI instead. +var EntitlementsManagerABI = EntitlementsManagerMetaData.ABI + +// EntitlementsManager is an auto generated Go binding around an Ethereum contract. +type EntitlementsManager struct { + EntitlementsManagerCaller // Read-only binding to the contract + EntitlementsManagerTransactor // Write-only binding to the contract + EntitlementsManagerFilterer // Log filterer for contract events +} + +// EntitlementsManagerCaller is an auto generated read-only Go binding around an Ethereum contract. +type EntitlementsManagerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// EntitlementsManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type EntitlementsManagerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// EntitlementsManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type EntitlementsManagerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// EntitlementsManagerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type EntitlementsManagerSession struct { + Contract *EntitlementsManager // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// EntitlementsManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type EntitlementsManagerCallerSession struct { + Contract *EntitlementsManagerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// EntitlementsManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type EntitlementsManagerTransactorSession struct { + Contract *EntitlementsManagerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// EntitlementsManagerRaw is an auto generated low-level Go binding around an Ethereum contract. +type EntitlementsManagerRaw struct { + Contract *EntitlementsManager // Generic contract binding to access the raw methods on +} + +// EntitlementsManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type EntitlementsManagerCallerRaw struct { + Contract *EntitlementsManagerCaller // Generic read-only contract binding to access the raw methods on +} + +// EntitlementsManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type EntitlementsManagerTransactorRaw struct { + Contract *EntitlementsManagerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewEntitlementsManager creates a new instance of EntitlementsManager, bound to a specific deployed contract. +func NewEntitlementsManager(address common.Address, backend bind.ContractBackend) (*EntitlementsManager, error) { + contract, err := bindEntitlementsManager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &EntitlementsManager{EntitlementsManagerCaller: EntitlementsManagerCaller{contract: contract}, EntitlementsManagerTransactor: EntitlementsManagerTransactor{contract: contract}, EntitlementsManagerFilterer: EntitlementsManagerFilterer{contract: contract}}, nil +} + +// NewEntitlementsManagerCaller creates a new read-only instance of EntitlementsManager, bound to a specific deployed contract. +func NewEntitlementsManagerCaller(address common.Address, caller bind.ContractCaller) (*EntitlementsManagerCaller, error) { + contract, err := bindEntitlementsManager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &EntitlementsManagerCaller{contract: contract}, nil +} + +// NewEntitlementsManagerTransactor creates a new write-only instance of EntitlementsManager, bound to a specific deployed contract. +func NewEntitlementsManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*EntitlementsManagerTransactor, error) { + contract, err := bindEntitlementsManager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &EntitlementsManagerTransactor{contract: contract}, nil +} + +// NewEntitlementsManagerFilterer creates a new log filterer instance of EntitlementsManager, bound to a specific deployed contract. +func NewEntitlementsManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*EntitlementsManagerFilterer, error) { + contract, err := bindEntitlementsManager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &EntitlementsManagerFilterer{contract: contract}, nil +} + +// bindEntitlementsManager binds a generic wrapper to an already deployed contract. +func bindEntitlementsManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := EntitlementsManagerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_EntitlementsManager *EntitlementsManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _EntitlementsManager.Contract.EntitlementsManagerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_EntitlementsManager *EntitlementsManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _EntitlementsManager.Contract.EntitlementsManagerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_EntitlementsManager *EntitlementsManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _EntitlementsManager.Contract.EntitlementsManagerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_EntitlementsManager *EntitlementsManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _EntitlementsManager.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_EntitlementsManager *EntitlementsManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _EntitlementsManager.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_EntitlementsManager *EntitlementsManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _EntitlementsManager.Contract.contract.Transact(opts, method, params...) +} + +// GetEntitlement is a free data retrieval call binding the contract method 0xfba4ff9d. +// +// Solidity: function getEntitlement(address entitlement) view returns((string,address,string,bool) entitlements) +func (_EntitlementsManager *EntitlementsManagerCaller) GetEntitlement(opts *bind.CallOpts, entitlement common.Address) (IEntitlementsManagerBaseEntitlement, error) { + var out []interface{} + err := _EntitlementsManager.contract.Call(opts, &out, "getEntitlement", entitlement) + + if err != nil { + return *new(IEntitlementsManagerBaseEntitlement), err + } + + out0 := *abi.ConvertType(out[0], new(IEntitlementsManagerBaseEntitlement)).(*IEntitlementsManagerBaseEntitlement) + + return out0, err + +} + +// GetEntitlement is a free data retrieval call binding the contract method 0xfba4ff9d. +// +// Solidity: function getEntitlement(address entitlement) view returns((string,address,string,bool) entitlements) +func (_EntitlementsManager *EntitlementsManagerSession) GetEntitlement(entitlement common.Address) (IEntitlementsManagerBaseEntitlement, error) { + return _EntitlementsManager.Contract.GetEntitlement(&_EntitlementsManager.CallOpts, entitlement) +} + +// GetEntitlement is a free data retrieval call binding the contract method 0xfba4ff9d. +// +// Solidity: function getEntitlement(address entitlement) view returns((string,address,string,bool) entitlements) +func (_EntitlementsManager *EntitlementsManagerCallerSession) GetEntitlement(entitlement common.Address) (IEntitlementsManagerBaseEntitlement, error) { + return _EntitlementsManager.Contract.GetEntitlement(&_EntitlementsManager.CallOpts, entitlement) +} + +// GetEntitlementDataByPermission is a free data retrieval call binding the contract method 0xdb0a69a8. +// +// Solidity: function getEntitlementDataByPermission(string permission) view returns((string,bytes)[]) +func (_EntitlementsManager *EntitlementsManagerCaller) GetEntitlementDataByPermission(opts *bind.CallOpts, permission string) ([]IEntitlementsManagerEntitlementData, error) { + var out []interface{} + err := _EntitlementsManager.contract.Call(opts, &out, "getEntitlementDataByPermission", permission) + + if err != nil { + return *new([]IEntitlementsManagerEntitlementData), err + } + + out0 := *abi.ConvertType(out[0], new([]IEntitlementsManagerEntitlementData)).(*[]IEntitlementsManagerEntitlementData) + + return out0, err + +} + +// GetEntitlementDataByPermission is a free data retrieval call binding the contract method 0xdb0a69a8. +// +// Solidity: function getEntitlementDataByPermission(string permission) view returns((string,bytes)[]) +func (_EntitlementsManager *EntitlementsManagerSession) GetEntitlementDataByPermission(permission string) ([]IEntitlementsManagerEntitlementData, error) { + return _EntitlementsManager.Contract.GetEntitlementDataByPermission(&_EntitlementsManager.CallOpts, permission) +} + +// GetEntitlementDataByPermission is a free data retrieval call binding the contract method 0xdb0a69a8. +// +// Solidity: function getEntitlementDataByPermission(string permission) view returns((string,bytes)[]) +func (_EntitlementsManager *EntitlementsManagerCallerSession) GetEntitlementDataByPermission(permission string) ([]IEntitlementsManagerEntitlementData, error) { + return _EntitlementsManager.Contract.GetEntitlementDataByPermission(&_EntitlementsManager.CallOpts, permission) +} + +// GetEntitlements is a free data retrieval call binding the contract method 0x487dc38c. +// +// Solidity: function getEntitlements() view returns((string,address,string,bool)[] entitlements) +func (_EntitlementsManager *EntitlementsManagerCaller) GetEntitlements(opts *bind.CallOpts) ([]IEntitlementsManagerBaseEntitlement, error) { + var out []interface{} + err := _EntitlementsManager.contract.Call(opts, &out, "getEntitlements") + + if err != nil { + return *new([]IEntitlementsManagerBaseEntitlement), err + } + + out0 := *abi.ConvertType(out[0], new([]IEntitlementsManagerBaseEntitlement)).(*[]IEntitlementsManagerBaseEntitlement) + + return out0, err + +} + +// GetEntitlements is a free data retrieval call binding the contract method 0x487dc38c. +// +// Solidity: function getEntitlements() view returns((string,address,string,bool)[] entitlements) +func (_EntitlementsManager *EntitlementsManagerSession) GetEntitlements() ([]IEntitlementsManagerBaseEntitlement, error) { + return _EntitlementsManager.Contract.GetEntitlements(&_EntitlementsManager.CallOpts) +} + +// GetEntitlements is a free data retrieval call binding the contract method 0x487dc38c. +// +// Solidity: function getEntitlements() view returns((string,address,string,bool)[] entitlements) +func (_EntitlementsManager *EntitlementsManagerCallerSession) GetEntitlements() ([]IEntitlementsManagerBaseEntitlement, error) { + return _EntitlementsManager.Contract.GetEntitlements(&_EntitlementsManager.CallOpts) +} + +// IsEntitledToChannel is a free data retrieval call binding the contract method 0x367287e3. +// +// Solidity: function isEntitledToChannel(bytes32 channelId, address user, string permission) view returns(bool) +func (_EntitlementsManager *EntitlementsManagerCaller) IsEntitledToChannel(opts *bind.CallOpts, channelId [32]byte, user common.Address, permission string) (bool, error) { + var out []interface{} + err := _EntitlementsManager.contract.Call(opts, &out, "isEntitledToChannel", channelId, user, permission) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsEntitledToChannel is a free data retrieval call binding the contract method 0x367287e3. +// +// Solidity: function isEntitledToChannel(bytes32 channelId, address user, string permission) view returns(bool) +func (_EntitlementsManager *EntitlementsManagerSession) IsEntitledToChannel(channelId [32]byte, user common.Address, permission string) (bool, error) { + return _EntitlementsManager.Contract.IsEntitledToChannel(&_EntitlementsManager.CallOpts, channelId, user, permission) +} + +// IsEntitledToChannel is a free data retrieval call binding the contract method 0x367287e3. +// +// Solidity: function isEntitledToChannel(bytes32 channelId, address user, string permission) view returns(bool) +func (_EntitlementsManager *EntitlementsManagerCallerSession) IsEntitledToChannel(channelId [32]byte, user common.Address, permission string) (bool, error) { + return _EntitlementsManager.Contract.IsEntitledToChannel(&_EntitlementsManager.CallOpts, channelId, user, permission) +} + +// IsEntitledToSpace is a free data retrieval call binding the contract method 0x20759f9e. +// +// Solidity: function isEntitledToSpace(address user, string permission) view returns(bool) +func (_EntitlementsManager *EntitlementsManagerCaller) IsEntitledToSpace(opts *bind.CallOpts, user common.Address, permission string) (bool, error) { + var out []interface{} + err := _EntitlementsManager.contract.Call(opts, &out, "isEntitledToSpace", user, permission) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsEntitledToSpace is a free data retrieval call binding the contract method 0x20759f9e. +// +// Solidity: function isEntitledToSpace(address user, string permission) view returns(bool) +func (_EntitlementsManager *EntitlementsManagerSession) IsEntitledToSpace(user common.Address, permission string) (bool, error) { + return _EntitlementsManager.Contract.IsEntitledToSpace(&_EntitlementsManager.CallOpts, user, permission) +} + +// IsEntitledToSpace is a free data retrieval call binding the contract method 0x20759f9e. +// +// Solidity: function isEntitledToSpace(address user, string permission) view returns(bool) +func (_EntitlementsManager *EntitlementsManagerCallerSession) IsEntitledToSpace(user common.Address, permission string) (bool, error) { + return _EntitlementsManager.Contract.IsEntitledToSpace(&_EntitlementsManager.CallOpts, user, permission) +} + +// AddEntitlementModule is a paid mutator transaction binding the contract method 0x070b9c3f. +// +// Solidity: function addEntitlementModule(address entitlement) returns() +func (_EntitlementsManager *EntitlementsManagerTransactor) AddEntitlementModule(opts *bind.TransactOpts, entitlement common.Address) (*types.Transaction, error) { + return _EntitlementsManager.contract.Transact(opts, "addEntitlementModule", entitlement) +} + +// AddEntitlementModule is a paid mutator transaction binding the contract method 0x070b9c3f. +// +// Solidity: function addEntitlementModule(address entitlement) returns() +func (_EntitlementsManager *EntitlementsManagerSession) AddEntitlementModule(entitlement common.Address) (*types.Transaction, error) { + return _EntitlementsManager.Contract.AddEntitlementModule(&_EntitlementsManager.TransactOpts, entitlement) +} + +// AddEntitlementModule is a paid mutator transaction binding the contract method 0x070b9c3f. +// +// Solidity: function addEntitlementModule(address entitlement) returns() +func (_EntitlementsManager *EntitlementsManagerTransactorSession) AddEntitlementModule(entitlement common.Address) (*types.Transaction, error) { + return _EntitlementsManager.Contract.AddEntitlementModule(&_EntitlementsManager.TransactOpts, entitlement) +} + +// AddImmutableEntitlements is a paid mutator transaction binding the contract method 0x8bfc820f. +// +// Solidity: function addImmutableEntitlements(address[] entitlements) returns() +func (_EntitlementsManager *EntitlementsManagerTransactor) AddImmutableEntitlements(opts *bind.TransactOpts, entitlements []common.Address) (*types.Transaction, error) { + return _EntitlementsManager.contract.Transact(opts, "addImmutableEntitlements", entitlements) +} + +// AddImmutableEntitlements is a paid mutator transaction binding the contract method 0x8bfc820f. +// +// Solidity: function addImmutableEntitlements(address[] entitlements) returns() +func (_EntitlementsManager *EntitlementsManagerSession) AddImmutableEntitlements(entitlements []common.Address) (*types.Transaction, error) { + return _EntitlementsManager.Contract.AddImmutableEntitlements(&_EntitlementsManager.TransactOpts, entitlements) +} + +// AddImmutableEntitlements is a paid mutator transaction binding the contract method 0x8bfc820f. +// +// Solidity: function addImmutableEntitlements(address[] entitlements) returns() +func (_EntitlementsManager *EntitlementsManagerTransactorSession) AddImmutableEntitlements(entitlements []common.Address) (*types.Transaction, error) { + return _EntitlementsManager.Contract.AddImmutableEntitlements(&_EntitlementsManager.TransactOpts, entitlements) +} + +// RemoveEntitlementModule is a paid mutator transaction binding the contract method 0xbe24138d. +// +// Solidity: function removeEntitlementModule(address entitlement) returns() +func (_EntitlementsManager *EntitlementsManagerTransactor) RemoveEntitlementModule(opts *bind.TransactOpts, entitlement common.Address) (*types.Transaction, error) { + return _EntitlementsManager.contract.Transact(opts, "removeEntitlementModule", entitlement) +} + +// RemoveEntitlementModule is a paid mutator transaction binding the contract method 0xbe24138d. +// +// Solidity: function removeEntitlementModule(address entitlement) returns() +func (_EntitlementsManager *EntitlementsManagerSession) RemoveEntitlementModule(entitlement common.Address) (*types.Transaction, error) { + return _EntitlementsManager.Contract.RemoveEntitlementModule(&_EntitlementsManager.TransactOpts, entitlement) +} + +// RemoveEntitlementModule is a paid mutator transaction binding the contract method 0xbe24138d. +// +// Solidity: function removeEntitlementModule(address entitlement) returns() +func (_EntitlementsManager *EntitlementsManagerTransactorSession) RemoveEntitlementModule(entitlement common.Address) (*types.Transaction, error) { + return _EntitlementsManager.Contract.RemoveEntitlementModule(&_EntitlementsManager.TransactOpts, entitlement) +} + +// EntitlementsManagerEntitlementModuleAddedIterator is returned from FilterEntitlementModuleAdded and is used to iterate over the raw logs and unpacked data for EntitlementModuleAdded events raised by the EntitlementsManager contract. +type EntitlementsManagerEntitlementModuleAddedIterator struct { + Event *EntitlementsManagerEntitlementModuleAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EntitlementsManagerEntitlementModuleAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EntitlementsManagerEntitlementModuleAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EntitlementsManagerEntitlementModuleAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EntitlementsManagerEntitlementModuleAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EntitlementsManagerEntitlementModuleAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EntitlementsManagerEntitlementModuleAdded represents a EntitlementModuleAdded event raised by the EntitlementsManager contract. +type EntitlementsManagerEntitlementModuleAdded struct { + Caller common.Address + Entitlement common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEntitlementModuleAdded is a free log retrieval operation binding the contract event 0x055c4c0e6f85afe96beaac6c9d650859c001e6ef93103856624cce6ceba811b4. +// +// Solidity: event EntitlementModuleAdded(address indexed caller, address entitlement) +func (_EntitlementsManager *EntitlementsManagerFilterer) FilterEntitlementModuleAdded(opts *bind.FilterOpts, caller []common.Address) (*EntitlementsManagerEntitlementModuleAddedIterator, error) { + + var callerRule []interface{} + for _, callerItem := range caller { + callerRule = append(callerRule, callerItem) + } + + logs, sub, err := _EntitlementsManager.contract.FilterLogs(opts, "EntitlementModuleAdded", callerRule) + if err != nil { + return nil, err + } + return &EntitlementsManagerEntitlementModuleAddedIterator{contract: _EntitlementsManager.contract, event: "EntitlementModuleAdded", logs: logs, sub: sub}, nil +} + +// WatchEntitlementModuleAdded is a free log subscription operation binding the contract event 0x055c4c0e6f85afe96beaac6c9d650859c001e6ef93103856624cce6ceba811b4. +// +// Solidity: event EntitlementModuleAdded(address indexed caller, address entitlement) +func (_EntitlementsManager *EntitlementsManagerFilterer) WatchEntitlementModuleAdded(opts *bind.WatchOpts, sink chan<- *EntitlementsManagerEntitlementModuleAdded, caller []common.Address) (event.Subscription, error) { + + var callerRule []interface{} + for _, callerItem := range caller { + callerRule = append(callerRule, callerItem) + } + + logs, sub, err := _EntitlementsManager.contract.WatchLogs(opts, "EntitlementModuleAdded", callerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EntitlementsManagerEntitlementModuleAdded) + if err := _EntitlementsManager.contract.UnpackLog(event, "EntitlementModuleAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEntitlementModuleAdded is a log parse operation binding the contract event 0x055c4c0e6f85afe96beaac6c9d650859c001e6ef93103856624cce6ceba811b4. +// +// Solidity: event EntitlementModuleAdded(address indexed caller, address entitlement) +func (_EntitlementsManager *EntitlementsManagerFilterer) ParseEntitlementModuleAdded(log types.Log) (*EntitlementsManagerEntitlementModuleAdded, error) { + event := new(EntitlementsManagerEntitlementModuleAdded) + if err := _EntitlementsManager.contract.UnpackLog(event, "EntitlementModuleAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EntitlementsManagerEntitlementModuleRemovedIterator is returned from FilterEntitlementModuleRemoved and is used to iterate over the raw logs and unpacked data for EntitlementModuleRemoved events raised by the EntitlementsManager contract. +type EntitlementsManagerEntitlementModuleRemovedIterator struct { + Event *EntitlementsManagerEntitlementModuleRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EntitlementsManagerEntitlementModuleRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EntitlementsManagerEntitlementModuleRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EntitlementsManagerEntitlementModuleRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EntitlementsManagerEntitlementModuleRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EntitlementsManagerEntitlementModuleRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EntitlementsManagerEntitlementModuleRemoved represents a EntitlementModuleRemoved event raised by the EntitlementsManager contract. +type EntitlementsManagerEntitlementModuleRemoved struct { + Caller common.Address + Entitlement common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEntitlementModuleRemoved is a free log retrieval operation binding the contract event 0xa8e3e13a35b592afaa9d213d12c7ea06384518ada9733585d20883cfafcf249b. +// +// Solidity: event EntitlementModuleRemoved(address indexed caller, address entitlement) +func (_EntitlementsManager *EntitlementsManagerFilterer) FilterEntitlementModuleRemoved(opts *bind.FilterOpts, caller []common.Address) (*EntitlementsManagerEntitlementModuleRemovedIterator, error) { + + var callerRule []interface{} + for _, callerItem := range caller { + callerRule = append(callerRule, callerItem) + } + + logs, sub, err := _EntitlementsManager.contract.FilterLogs(opts, "EntitlementModuleRemoved", callerRule) + if err != nil { + return nil, err + } + return &EntitlementsManagerEntitlementModuleRemovedIterator{contract: _EntitlementsManager.contract, event: "EntitlementModuleRemoved", logs: logs, sub: sub}, nil +} + +// WatchEntitlementModuleRemoved is a free log subscription operation binding the contract event 0xa8e3e13a35b592afaa9d213d12c7ea06384518ada9733585d20883cfafcf249b. +// +// Solidity: event EntitlementModuleRemoved(address indexed caller, address entitlement) +func (_EntitlementsManager *EntitlementsManagerFilterer) WatchEntitlementModuleRemoved(opts *bind.WatchOpts, sink chan<- *EntitlementsManagerEntitlementModuleRemoved, caller []common.Address) (event.Subscription, error) { + + var callerRule []interface{} + for _, callerItem := range caller { + callerRule = append(callerRule, callerItem) + } + + logs, sub, err := _EntitlementsManager.contract.WatchLogs(opts, "EntitlementModuleRemoved", callerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EntitlementsManagerEntitlementModuleRemoved) + if err := _EntitlementsManager.contract.UnpackLog(event, "EntitlementModuleRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEntitlementModuleRemoved is a log parse operation binding the contract event 0xa8e3e13a35b592afaa9d213d12c7ea06384518ada9733585d20883cfafcf249b. +// +// Solidity: event EntitlementModuleRemoved(address indexed caller, address entitlement) +func (_EntitlementsManager *EntitlementsManagerFilterer) ParseEntitlementModuleRemoved(log types.Log) (*EntitlementsManagerEntitlementModuleRemoved, error) { + event := new(EntitlementsManagerEntitlementModuleRemoved) + if err := _EntitlementsManager.contract.UnpackLog(event, "EntitlementModuleRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/node/contracts/base/pausable.go b/core/node/contracts/base/pausable.go new file mode 100644 index 000000000..8123839b7 --- /dev/null +++ b/core/node/contracts/base/pausable.go @@ -0,0 +1,522 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package base + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// PausableMetaData contains all meta data concerning the Pausable contract. +var PausableMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"Pausable__NotPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Pausable__Paused\",\"inputs\":[]}]", +} + +// PausableABI is the input ABI used to generate the binding from. +// Deprecated: Use PausableMetaData.ABI instead. +var PausableABI = PausableMetaData.ABI + +// Pausable is an auto generated Go binding around an Ethereum contract. +type Pausable struct { + PausableCaller // Read-only binding to the contract + PausableTransactor // Write-only binding to the contract + PausableFilterer // Log filterer for contract events +} + +// PausableCaller is an auto generated read-only Go binding around an Ethereum contract. +type PausableCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// PausableTransactor is an auto generated write-only Go binding around an Ethereum contract. +type PausableTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// PausableFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type PausableFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// PausableSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type PausableSession struct { + Contract *Pausable // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// PausableCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type PausableCallerSession struct { + Contract *PausableCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// PausableTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type PausableTransactorSession struct { + Contract *PausableTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// PausableRaw is an auto generated low-level Go binding around an Ethereum contract. +type PausableRaw struct { + Contract *Pausable // Generic contract binding to access the raw methods on +} + +// PausableCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type PausableCallerRaw struct { + Contract *PausableCaller // Generic read-only contract binding to access the raw methods on +} + +// PausableTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type PausableTransactorRaw struct { + Contract *PausableTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewPausable creates a new instance of Pausable, bound to a specific deployed contract. +func NewPausable(address common.Address, backend bind.ContractBackend) (*Pausable, error) { + contract, err := bindPausable(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Pausable{PausableCaller: PausableCaller{contract: contract}, PausableTransactor: PausableTransactor{contract: contract}, PausableFilterer: PausableFilterer{contract: contract}}, nil +} + +// NewPausableCaller creates a new read-only instance of Pausable, bound to a specific deployed contract. +func NewPausableCaller(address common.Address, caller bind.ContractCaller) (*PausableCaller, error) { + contract, err := bindPausable(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &PausableCaller{contract: contract}, nil +} + +// NewPausableTransactor creates a new write-only instance of Pausable, bound to a specific deployed contract. +func NewPausableTransactor(address common.Address, transactor bind.ContractTransactor) (*PausableTransactor, error) { + contract, err := bindPausable(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &PausableTransactor{contract: contract}, nil +} + +// NewPausableFilterer creates a new log filterer instance of Pausable, bound to a specific deployed contract. +func NewPausableFilterer(address common.Address, filterer bind.ContractFilterer) (*PausableFilterer, error) { + contract, err := bindPausable(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &PausableFilterer{contract: contract}, nil +} + +// bindPausable binds a generic wrapper to an already deployed contract. +func bindPausable(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := PausableMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Pausable *PausableRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Pausable.Contract.PausableCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Pausable *PausableRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Pausable.Contract.PausableTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Pausable *PausableRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Pausable.Contract.PausableTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Pausable *PausableCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Pausable.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Pausable *PausableTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Pausable.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Pausable *PausableTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Pausable.Contract.contract.Transact(opts, method, params...) +} + +// Paused is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(bool) +func (_Pausable *PausableCaller) Paused(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _Pausable.contract.Call(opts, &out, "paused") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// Paused is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(bool) +func (_Pausable *PausableSession) Paused() (bool, error) { + return _Pausable.Contract.Paused(&_Pausable.CallOpts) +} + +// Paused is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(bool) +func (_Pausable *PausableCallerSession) Paused() (bool, error) { + return _Pausable.Contract.Paused(&_Pausable.CallOpts) +} + +// Pause is a paid mutator transaction binding the contract method 0x8456cb59. +// +// Solidity: function pause() returns() +func (_Pausable *PausableTransactor) Pause(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Pausable.contract.Transact(opts, "pause") +} + +// Pause is a paid mutator transaction binding the contract method 0x8456cb59. +// +// Solidity: function pause() returns() +func (_Pausable *PausableSession) Pause() (*types.Transaction, error) { + return _Pausable.Contract.Pause(&_Pausable.TransactOpts) +} + +// Pause is a paid mutator transaction binding the contract method 0x8456cb59. +// +// Solidity: function pause() returns() +func (_Pausable *PausableTransactorSession) Pause() (*types.Transaction, error) { + return _Pausable.Contract.Pause(&_Pausable.TransactOpts) +} + +// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. +// +// Solidity: function unpause() returns() +func (_Pausable *PausableTransactor) Unpause(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Pausable.contract.Transact(opts, "unpause") +} + +// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. +// +// Solidity: function unpause() returns() +func (_Pausable *PausableSession) Unpause() (*types.Transaction, error) { + return _Pausable.Contract.Unpause(&_Pausable.TransactOpts) +} + +// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. +// +// Solidity: function unpause() returns() +func (_Pausable *PausableTransactorSession) Unpause() (*types.Transaction, error) { + return _Pausable.Contract.Unpause(&_Pausable.TransactOpts) +} + +// PausablePausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the Pausable contract. +type PausablePausedIterator struct { + Event *PausablePaused // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PausablePausedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PausablePaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PausablePaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PausablePausedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PausablePausedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PausablePaused represents a Paused event raised by the Pausable contract. +type PausablePaused struct { + Account common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPaused is a free log retrieval operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. +// +// Solidity: event Paused(address account) +func (_Pausable *PausableFilterer) FilterPaused(opts *bind.FilterOpts) (*PausablePausedIterator, error) { + + logs, sub, err := _Pausable.contract.FilterLogs(opts, "Paused") + if err != nil { + return nil, err + } + return &PausablePausedIterator{contract: _Pausable.contract, event: "Paused", logs: logs, sub: sub}, nil +} + +// WatchPaused is a free log subscription operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. +// +// Solidity: event Paused(address account) +func (_Pausable *PausableFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *PausablePaused) (event.Subscription, error) { + + logs, sub, err := _Pausable.contract.WatchLogs(opts, "Paused") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PausablePaused) + if err := _Pausable.contract.UnpackLog(event, "Paused", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParsePaused is a log parse operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. +// +// Solidity: event Paused(address account) +func (_Pausable *PausableFilterer) ParsePaused(log types.Log) (*PausablePaused, error) { + event := new(PausablePaused) + if err := _Pausable.contract.UnpackLog(event, "Paused", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PausableUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the Pausable contract. +type PausableUnpausedIterator struct { + Event *PausableUnpaused // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PausableUnpausedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PausableUnpaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PausableUnpaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PausableUnpausedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PausableUnpausedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PausableUnpaused represents a Unpaused event raised by the Pausable contract. +type PausableUnpaused struct { + Account common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUnpaused is a free log retrieval operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. +// +// Solidity: event Unpaused(address account) +func (_Pausable *PausableFilterer) FilterUnpaused(opts *bind.FilterOpts) (*PausableUnpausedIterator, error) { + + logs, sub, err := _Pausable.contract.FilterLogs(opts, "Unpaused") + if err != nil { + return nil, err + } + return &PausableUnpausedIterator{contract: _Pausable.contract, event: "Unpaused", logs: logs, sub: sub}, nil +} + +// WatchUnpaused is a free log subscription operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. +// +// Solidity: event Unpaused(address account) +func (_Pausable *PausableFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *PausableUnpaused) (event.Subscription, error) { + + logs, sub, err := _Pausable.contract.WatchLogs(opts, "Unpaused") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PausableUnpaused) + if err := _Pausable.contract.UnpackLog(event, "Unpaused", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUnpaused is a log parse operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. +// +// Solidity: event Unpaused(address account) +func (_Pausable *PausableFilterer) ParseUnpaused(log types.Log) (*PausableUnpaused, error) { + event := new(PausableUnpaused) + if err := _Pausable.contract.UnpackLog(event, "Unpaused", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/node/contracts/base/rule_entitlement.go b/core/node/contracts/base/rule_entitlement.go new file mode 100644 index 000000000..af1ce9973 --- /dev/null +++ b/core/node/contracts/base/rule_entitlement.go @@ -0,0 +1,613 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package base + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// IRuleEntitlementCheckOperation is an auto generated low-level Go binding around an user-defined struct. +type IRuleEntitlementCheckOperation struct { + OpType uint8 + ChainId *big.Int + ContractAddress common.Address + Threshold *big.Int +} + +// IRuleEntitlementLogicalOperation is an auto generated low-level Go binding around an user-defined struct. +type IRuleEntitlementLogicalOperation struct { + LogOpType uint8 + LeftOperationIndex uint8 + RightOperationIndex uint8 +} + +// IRuleEntitlementOperation is an auto generated low-level Go binding around an user-defined struct. +type IRuleEntitlementOperation struct { + OpType uint8 + Index uint8 +} + +// IRuleEntitlementRuleData is an auto generated low-level Go binding around an user-defined struct. +type IRuleEntitlementRuleData struct { + Operations []IRuleEntitlementOperation + CheckOperations []IRuleEntitlementCheckOperation + LogicalOperations []IRuleEntitlementLogicalOperation +} + +// RuleEntitlementMetaData contains all meta data concerning the RuleEntitlement contract. +var RuleEntitlementMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"description\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"encodeRuleData\",\"inputs\":[{\"name\":\"data\",\"type\":\"tuple\",\"internalType\":\"structIRuleEntitlement.RuleData\",\"components\":[{\"name\":\"operations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.Operation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CombinedOperationType\"},{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"checkOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.CheckOperation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CheckOperationType\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"logicalOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.LogicalOperation[]\",\"components\":[{\"name\":\"logOpType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.LogicalOperationType\"},{\"name\":\"leftOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rightOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getCheckOperations\",\"inputs\":[{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.CheckOperation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CheckOperationType\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEntitlementDataByRoleId\",\"inputs\":[{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLogicalOperations\",\"inputs\":[{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.LogicalOperation[]\",\"components\":[{\"name\":\"logOpType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.LogicalOperationType\"},{\"name\":\"leftOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rightOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperations\",\"inputs\":[{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.Operation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CombinedOperationType\"},{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRuleData\",\"inputs\":[{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"data\",\"type\":\"tuple\",\"internalType\":\"structIRuleEntitlement.RuleData\",\"components\":[{\"name\":\"operations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.Operation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CombinedOperationType\"},{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"checkOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.CheckOperation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CheckOperationType\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"logicalOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.LogicalOperation[]\",\"components\":[{\"name\":\"logOpType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.LogicalOperationType\"},{\"name\":\"leftOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rightOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"space\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isCrosschain\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isEntitled\",\"inputs\":[{\"name\":\"channelId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"user\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"permission\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"moduleType\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeEntitlement\",\"inputs\":[{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setEntitlement\",\"inputs\":[{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"entitlementData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"error\",\"name\":\"CheckOperationsLimitReaced\",\"inputs\":[{\"name\":\"limit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"Entitlement__InvalidValue\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Entitlement__NotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Entitlement__NotMember\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Entitlement__ValueAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCheckOperationIndex\",\"inputs\":[{\"name\":\"operationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"checkOperationsLength\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidLeftOperationIndex\",\"inputs\":[{\"name\":\"leftOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"currentOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidLogicalOperationIndex\",\"inputs\":[{\"name\":\"operationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"logicalOperationsLength\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidOperationType\",\"inputs\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CombinedOperationType\"}]},{\"type\":\"error\",\"name\":\"InvalidRightOperationIndex\",\"inputs\":[{\"name\":\"rightOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"currentOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"LogicalOperationLimitReached\",\"inputs\":[{\"name\":\"limit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OperationsLimitReached\",\"inputs\":[{\"name\":\"limit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", +} + +// RuleEntitlementABI is the input ABI used to generate the binding from. +// Deprecated: Use RuleEntitlementMetaData.ABI instead. +var RuleEntitlementABI = RuleEntitlementMetaData.ABI + +// RuleEntitlement is an auto generated Go binding around an Ethereum contract. +type RuleEntitlement struct { + RuleEntitlementCaller // Read-only binding to the contract + RuleEntitlementTransactor // Write-only binding to the contract + RuleEntitlementFilterer // Log filterer for contract events +} + +// RuleEntitlementCaller is an auto generated read-only Go binding around an Ethereum contract. +type RuleEntitlementCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// RuleEntitlementTransactor is an auto generated write-only Go binding around an Ethereum contract. +type RuleEntitlementTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// RuleEntitlementFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type RuleEntitlementFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// RuleEntitlementSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type RuleEntitlementSession struct { + Contract *RuleEntitlement // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// RuleEntitlementCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type RuleEntitlementCallerSession struct { + Contract *RuleEntitlementCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// RuleEntitlementTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type RuleEntitlementTransactorSession struct { + Contract *RuleEntitlementTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// RuleEntitlementRaw is an auto generated low-level Go binding around an Ethereum contract. +type RuleEntitlementRaw struct { + Contract *RuleEntitlement // Generic contract binding to access the raw methods on +} + +// RuleEntitlementCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type RuleEntitlementCallerRaw struct { + Contract *RuleEntitlementCaller // Generic read-only contract binding to access the raw methods on +} + +// RuleEntitlementTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type RuleEntitlementTransactorRaw struct { + Contract *RuleEntitlementTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewRuleEntitlement creates a new instance of RuleEntitlement, bound to a specific deployed contract. +func NewRuleEntitlement(address common.Address, backend bind.ContractBackend) (*RuleEntitlement, error) { + contract, err := bindRuleEntitlement(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &RuleEntitlement{RuleEntitlementCaller: RuleEntitlementCaller{contract: contract}, RuleEntitlementTransactor: RuleEntitlementTransactor{contract: contract}, RuleEntitlementFilterer: RuleEntitlementFilterer{contract: contract}}, nil +} + +// NewRuleEntitlementCaller creates a new read-only instance of RuleEntitlement, bound to a specific deployed contract. +func NewRuleEntitlementCaller(address common.Address, caller bind.ContractCaller) (*RuleEntitlementCaller, error) { + contract, err := bindRuleEntitlement(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &RuleEntitlementCaller{contract: contract}, nil +} + +// NewRuleEntitlementTransactor creates a new write-only instance of RuleEntitlement, bound to a specific deployed contract. +func NewRuleEntitlementTransactor(address common.Address, transactor bind.ContractTransactor) (*RuleEntitlementTransactor, error) { + contract, err := bindRuleEntitlement(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &RuleEntitlementTransactor{contract: contract}, nil +} + +// NewRuleEntitlementFilterer creates a new log filterer instance of RuleEntitlement, bound to a specific deployed contract. +func NewRuleEntitlementFilterer(address common.Address, filterer bind.ContractFilterer) (*RuleEntitlementFilterer, error) { + contract, err := bindRuleEntitlement(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &RuleEntitlementFilterer{contract: contract}, nil +} + +// bindRuleEntitlement binds a generic wrapper to an already deployed contract. +func bindRuleEntitlement(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := RuleEntitlementMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_RuleEntitlement *RuleEntitlementRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _RuleEntitlement.Contract.RuleEntitlementCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_RuleEntitlement *RuleEntitlementRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RuleEntitlement.Contract.RuleEntitlementTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_RuleEntitlement *RuleEntitlementRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _RuleEntitlement.Contract.RuleEntitlementTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_RuleEntitlement *RuleEntitlementCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _RuleEntitlement.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_RuleEntitlement *RuleEntitlementTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RuleEntitlement.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_RuleEntitlement *RuleEntitlementTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _RuleEntitlement.Contract.contract.Transact(opts, method, params...) +} + +// Description is a free data retrieval call binding the contract method 0x7284e416. +// +// Solidity: function description() view returns(string) +func (_RuleEntitlement *RuleEntitlementCaller) Description(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _RuleEntitlement.contract.Call(opts, &out, "description") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Description is a free data retrieval call binding the contract method 0x7284e416. +// +// Solidity: function description() view returns(string) +func (_RuleEntitlement *RuleEntitlementSession) Description() (string, error) { + return _RuleEntitlement.Contract.Description(&_RuleEntitlement.CallOpts) +} + +// Description is a free data retrieval call binding the contract method 0x7284e416. +// +// Solidity: function description() view returns(string) +func (_RuleEntitlement *RuleEntitlementCallerSession) Description() (string, error) { + return _RuleEntitlement.Contract.Description(&_RuleEntitlement.CallOpts) +} + +// EncodeRuleData is a free data retrieval call binding the contract method 0x5d115072. +// +// Solidity: function encodeRuleData(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]) data) pure returns(bytes) +func (_RuleEntitlement *RuleEntitlementCaller) EncodeRuleData(opts *bind.CallOpts, data IRuleEntitlementRuleData) ([]byte, error) { + var out []interface{} + err := _RuleEntitlement.contract.Call(opts, &out, "encodeRuleData", data) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// EncodeRuleData is a free data retrieval call binding the contract method 0x5d115072. +// +// Solidity: function encodeRuleData(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]) data) pure returns(bytes) +func (_RuleEntitlement *RuleEntitlementSession) EncodeRuleData(data IRuleEntitlementRuleData) ([]byte, error) { + return _RuleEntitlement.Contract.EncodeRuleData(&_RuleEntitlement.CallOpts, data) +} + +// EncodeRuleData is a free data retrieval call binding the contract method 0x5d115072. +// +// Solidity: function encodeRuleData(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]) data) pure returns(bytes) +func (_RuleEntitlement *RuleEntitlementCallerSession) EncodeRuleData(data IRuleEntitlementRuleData) ([]byte, error) { + return _RuleEntitlement.Contract.EncodeRuleData(&_RuleEntitlement.CallOpts, data) +} + +// GetCheckOperations is a free data retrieval call binding the contract method 0xe3eeace1. +// +// Solidity: function getCheckOperations(uint256 roleId) view returns((uint8,uint256,address,uint256)[]) +func (_RuleEntitlement *RuleEntitlementCaller) GetCheckOperations(opts *bind.CallOpts, roleId *big.Int) ([]IRuleEntitlementCheckOperation, error) { + var out []interface{} + err := _RuleEntitlement.contract.Call(opts, &out, "getCheckOperations", roleId) + + if err != nil { + return *new([]IRuleEntitlementCheckOperation), err + } + + out0 := *abi.ConvertType(out[0], new([]IRuleEntitlementCheckOperation)).(*[]IRuleEntitlementCheckOperation) + + return out0, err + +} + +// GetCheckOperations is a free data retrieval call binding the contract method 0xe3eeace1. +// +// Solidity: function getCheckOperations(uint256 roleId) view returns((uint8,uint256,address,uint256)[]) +func (_RuleEntitlement *RuleEntitlementSession) GetCheckOperations(roleId *big.Int) ([]IRuleEntitlementCheckOperation, error) { + return _RuleEntitlement.Contract.GetCheckOperations(&_RuleEntitlement.CallOpts, roleId) +} + +// GetCheckOperations is a free data retrieval call binding the contract method 0xe3eeace1. +// +// Solidity: function getCheckOperations(uint256 roleId) view returns((uint8,uint256,address,uint256)[]) +func (_RuleEntitlement *RuleEntitlementCallerSession) GetCheckOperations(roleId *big.Int) ([]IRuleEntitlementCheckOperation, error) { + return _RuleEntitlement.Contract.GetCheckOperations(&_RuleEntitlement.CallOpts, roleId) +} + +// GetEntitlementDataByRoleId is a free data retrieval call binding the contract method 0x1eee07b2. +// +// Solidity: function getEntitlementDataByRoleId(uint256 roleId) view returns(bytes) +func (_RuleEntitlement *RuleEntitlementCaller) GetEntitlementDataByRoleId(opts *bind.CallOpts, roleId *big.Int) ([]byte, error) { + var out []interface{} + err := _RuleEntitlement.contract.Call(opts, &out, "getEntitlementDataByRoleId", roleId) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetEntitlementDataByRoleId is a free data retrieval call binding the contract method 0x1eee07b2. +// +// Solidity: function getEntitlementDataByRoleId(uint256 roleId) view returns(bytes) +func (_RuleEntitlement *RuleEntitlementSession) GetEntitlementDataByRoleId(roleId *big.Int) ([]byte, error) { + return _RuleEntitlement.Contract.GetEntitlementDataByRoleId(&_RuleEntitlement.CallOpts, roleId) +} + +// GetEntitlementDataByRoleId is a free data retrieval call binding the contract method 0x1eee07b2. +// +// Solidity: function getEntitlementDataByRoleId(uint256 roleId) view returns(bytes) +func (_RuleEntitlement *RuleEntitlementCallerSession) GetEntitlementDataByRoleId(roleId *big.Int) ([]byte, error) { + return _RuleEntitlement.Contract.GetEntitlementDataByRoleId(&_RuleEntitlement.CallOpts, roleId) +} + +// GetLogicalOperations is a free data retrieval call binding the contract method 0x545f09d3. +// +// Solidity: function getLogicalOperations(uint256 roleId) view returns((uint8,uint8,uint8)[]) +func (_RuleEntitlement *RuleEntitlementCaller) GetLogicalOperations(opts *bind.CallOpts, roleId *big.Int) ([]IRuleEntitlementLogicalOperation, error) { + var out []interface{} + err := _RuleEntitlement.contract.Call(opts, &out, "getLogicalOperations", roleId) + + if err != nil { + return *new([]IRuleEntitlementLogicalOperation), err + } + + out0 := *abi.ConvertType(out[0], new([]IRuleEntitlementLogicalOperation)).(*[]IRuleEntitlementLogicalOperation) + + return out0, err + +} + +// GetLogicalOperations is a free data retrieval call binding the contract method 0x545f09d3. +// +// Solidity: function getLogicalOperations(uint256 roleId) view returns((uint8,uint8,uint8)[]) +func (_RuleEntitlement *RuleEntitlementSession) GetLogicalOperations(roleId *big.Int) ([]IRuleEntitlementLogicalOperation, error) { + return _RuleEntitlement.Contract.GetLogicalOperations(&_RuleEntitlement.CallOpts, roleId) +} + +// GetLogicalOperations is a free data retrieval call binding the contract method 0x545f09d3. +// +// Solidity: function getLogicalOperations(uint256 roleId) view returns((uint8,uint8,uint8)[]) +func (_RuleEntitlement *RuleEntitlementCallerSession) GetLogicalOperations(roleId *big.Int) ([]IRuleEntitlementLogicalOperation, error) { + return _RuleEntitlement.Contract.GetLogicalOperations(&_RuleEntitlement.CallOpts, roleId) +} + +// GetOperations is a free data retrieval call binding the contract method 0x5ad4d49e. +// +// Solidity: function getOperations(uint256 roleId) view returns((uint8,uint8)[]) +func (_RuleEntitlement *RuleEntitlementCaller) GetOperations(opts *bind.CallOpts, roleId *big.Int) ([]IRuleEntitlementOperation, error) { + var out []interface{} + err := _RuleEntitlement.contract.Call(opts, &out, "getOperations", roleId) + + if err != nil { + return *new([]IRuleEntitlementOperation), err + } + + out0 := *abi.ConvertType(out[0], new([]IRuleEntitlementOperation)).(*[]IRuleEntitlementOperation) + + return out0, err + +} + +// GetOperations is a free data retrieval call binding the contract method 0x5ad4d49e. +// +// Solidity: function getOperations(uint256 roleId) view returns((uint8,uint8)[]) +func (_RuleEntitlement *RuleEntitlementSession) GetOperations(roleId *big.Int) ([]IRuleEntitlementOperation, error) { + return _RuleEntitlement.Contract.GetOperations(&_RuleEntitlement.CallOpts, roleId) +} + +// GetOperations is a free data retrieval call binding the contract method 0x5ad4d49e. +// +// Solidity: function getOperations(uint256 roleId) view returns((uint8,uint8)[]) +func (_RuleEntitlement *RuleEntitlementCallerSession) GetOperations(roleId *big.Int) ([]IRuleEntitlementOperation, error) { + return _RuleEntitlement.Contract.GetOperations(&_RuleEntitlement.CallOpts, roleId) +} + +// GetRuleData is a free data retrieval call binding the contract method 0x069a3ee9. +// +// Solidity: function getRuleData(uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]) data) +func (_RuleEntitlement *RuleEntitlementCaller) GetRuleData(opts *bind.CallOpts, roleId *big.Int) (IRuleEntitlementRuleData, error) { + var out []interface{} + err := _RuleEntitlement.contract.Call(opts, &out, "getRuleData", roleId) + + if err != nil { + return *new(IRuleEntitlementRuleData), err + } + + out0 := *abi.ConvertType(out[0], new(IRuleEntitlementRuleData)).(*IRuleEntitlementRuleData) + + return out0, err + +} + +// GetRuleData is a free data retrieval call binding the contract method 0x069a3ee9. +// +// Solidity: function getRuleData(uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]) data) +func (_RuleEntitlement *RuleEntitlementSession) GetRuleData(roleId *big.Int) (IRuleEntitlementRuleData, error) { + return _RuleEntitlement.Contract.GetRuleData(&_RuleEntitlement.CallOpts, roleId) +} + +// GetRuleData is a free data retrieval call binding the contract method 0x069a3ee9. +// +// Solidity: function getRuleData(uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]) data) +func (_RuleEntitlement *RuleEntitlementCallerSession) GetRuleData(roleId *big.Int) (IRuleEntitlementRuleData, error) { + return _RuleEntitlement.Contract.GetRuleData(&_RuleEntitlement.CallOpts, roleId) +} + +// IsCrosschain is a free data retrieval call binding the contract method 0x2e1b61e4. +// +// Solidity: function isCrosschain() view returns(bool) +func (_RuleEntitlement *RuleEntitlementCaller) IsCrosschain(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _RuleEntitlement.contract.Call(opts, &out, "isCrosschain") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsCrosschain is a free data retrieval call binding the contract method 0x2e1b61e4. +// +// Solidity: function isCrosschain() view returns(bool) +func (_RuleEntitlement *RuleEntitlementSession) IsCrosschain() (bool, error) { + return _RuleEntitlement.Contract.IsCrosschain(&_RuleEntitlement.CallOpts) +} + +// IsCrosschain is a free data retrieval call binding the contract method 0x2e1b61e4. +// +// Solidity: function isCrosschain() view returns(bool) +func (_RuleEntitlement *RuleEntitlementCallerSession) IsCrosschain() (bool, error) { + return _RuleEntitlement.Contract.IsCrosschain(&_RuleEntitlement.CallOpts) +} + +// IsEntitled is a free data retrieval call binding the contract method 0x0cf0b533. +// +// Solidity: function isEntitled(bytes32 channelId, address[] user, bytes32 permission) view returns(bool) +func (_RuleEntitlement *RuleEntitlementCaller) IsEntitled(opts *bind.CallOpts, channelId [32]byte, user []common.Address, permission [32]byte) (bool, error) { + var out []interface{} + err := _RuleEntitlement.contract.Call(opts, &out, "isEntitled", channelId, user, permission) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsEntitled is a free data retrieval call binding the contract method 0x0cf0b533. +// +// Solidity: function isEntitled(bytes32 channelId, address[] user, bytes32 permission) view returns(bool) +func (_RuleEntitlement *RuleEntitlementSession) IsEntitled(channelId [32]byte, user []common.Address, permission [32]byte) (bool, error) { + return _RuleEntitlement.Contract.IsEntitled(&_RuleEntitlement.CallOpts, channelId, user, permission) +} + +// IsEntitled is a free data retrieval call binding the contract method 0x0cf0b533. +// +// Solidity: function isEntitled(bytes32 channelId, address[] user, bytes32 permission) view returns(bool) +func (_RuleEntitlement *RuleEntitlementCallerSession) IsEntitled(channelId [32]byte, user []common.Address, permission [32]byte) (bool, error) { + return _RuleEntitlement.Contract.IsEntitled(&_RuleEntitlement.CallOpts, channelId, user, permission) +} + +// ModuleType is a free data retrieval call binding the contract method 0x6465e69f. +// +// Solidity: function moduleType() view returns(string) +func (_RuleEntitlement *RuleEntitlementCaller) ModuleType(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _RuleEntitlement.contract.Call(opts, &out, "moduleType") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// ModuleType is a free data retrieval call binding the contract method 0x6465e69f. +// +// Solidity: function moduleType() view returns(string) +func (_RuleEntitlement *RuleEntitlementSession) ModuleType() (string, error) { + return _RuleEntitlement.Contract.ModuleType(&_RuleEntitlement.CallOpts) +} + +// ModuleType is a free data retrieval call binding the contract method 0x6465e69f. +// +// Solidity: function moduleType() view returns(string) +func (_RuleEntitlement *RuleEntitlementCallerSession) ModuleType() (string, error) { + return _RuleEntitlement.Contract.ModuleType(&_RuleEntitlement.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_RuleEntitlement *RuleEntitlementCaller) Name(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _RuleEntitlement.contract.Call(opts, &out, "name") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_RuleEntitlement *RuleEntitlementSession) Name() (string, error) { + return _RuleEntitlement.Contract.Name(&_RuleEntitlement.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_RuleEntitlement *RuleEntitlementCallerSession) Name() (string, error) { + return _RuleEntitlement.Contract.Name(&_RuleEntitlement.CallOpts) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address space) returns() +func (_RuleEntitlement *RuleEntitlementTransactor) Initialize(opts *bind.TransactOpts, space common.Address) (*types.Transaction, error) { + return _RuleEntitlement.contract.Transact(opts, "initialize", space) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address space) returns() +func (_RuleEntitlement *RuleEntitlementSession) Initialize(space common.Address) (*types.Transaction, error) { + return _RuleEntitlement.Contract.Initialize(&_RuleEntitlement.TransactOpts, space) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address space) returns() +func (_RuleEntitlement *RuleEntitlementTransactorSession) Initialize(space common.Address) (*types.Transaction, error) { + return _RuleEntitlement.Contract.Initialize(&_RuleEntitlement.TransactOpts, space) +} + +// RemoveEntitlement is a paid mutator transaction binding the contract method 0xf0c111f9. +// +// Solidity: function removeEntitlement(uint256 roleId) returns() +func (_RuleEntitlement *RuleEntitlementTransactor) RemoveEntitlement(opts *bind.TransactOpts, roleId *big.Int) (*types.Transaction, error) { + return _RuleEntitlement.contract.Transact(opts, "removeEntitlement", roleId) +} + +// RemoveEntitlement is a paid mutator transaction binding the contract method 0xf0c111f9. +// +// Solidity: function removeEntitlement(uint256 roleId) returns() +func (_RuleEntitlement *RuleEntitlementSession) RemoveEntitlement(roleId *big.Int) (*types.Transaction, error) { + return _RuleEntitlement.Contract.RemoveEntitlement(&_RuleEntitlement.TransactOpts, roleId) +} + +// RemoveEntitlement is a paid mutator transaction binding the contract method 0xf0c111f9. +// +// Solidity: function removeEntitlement(uint256 roleId) returns() +func (_RuleEntitlement *RuleEntitlementTransactorSession) RemoveEntitlement(roleId *big.Int) (*types.Transaction, error) { + return _RuleEntitlement.Contract.RemoveEntitlement(&_RuleEntitlement.TransactOpts, roleId) +} + +// SetEntitlement is a paid mutator transaction binding the contract method 0xef8be574. +// +// Solidity: function setEntitlement(uint256 roleId, bytes entitlementData) returns() +func (_RuleEntitlement *RuleEntitlementTransactor) SetEntitlement(opts *bind.TransactOpts, roleId *big.Int, entitlementData []byte) (*types.Transaction, error) { + return _RuleEntitlement.contract.Transact(opts, "setEntitlement", roleId, entitlementData) +} + +// SetEntitlement is a paid mutator transaction binding the contract method 0xef8be574. +// +// Solidity: function setEntitlement(uint256 roleId, bytes entitlementData) returns() +func (_RuleEntitlement *RuleEntitlementSession) SetEntitlement(roleId *big.Int, entitlementData []byte) (*types.Transaction, error) { + return _RuleEntitlement.Contract.SetEntitlement(&_RuleEntitlement.TransactOpts, roleId, entitlementData) +} + +// SetEntitlement is a paid mutator transaction binding the contract method 0xef8be574. +// +// Solidity: function setEntitlement(uint256 roleId, bytes entitlementData) returns() +func (_RuleEntitlement *RuleEntitlementTransactorSession) SetEntitlement(roleId *big.Int, entitlementData []byte) (*types.Transaction, error) { + return _RuleEntitlement.Contract.SetEntitlement(&_RuleEntitlement.TransactOpts, roleId, entitlementData) +} diff --git a/core/node/contracts/base/wallet_link.go b/core/node/contracts/base/wallet_link.go new file mode 100644 index 000000000..37d1ec273 --- /dev/null +++ b/core/node/contracts/base/wallet_link.go @@ -0,0 +1,680 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package base + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// IWalletLinkBaseLinkedWallet is an auto generated low-level Go binding around an user-defined struct. +type IWalletLinkBaseLinkedWallet struct { + Addr common.Address + Signature []byte +} + +// WalletLinkMetaData contains all meta data concerning the WalletLink contract. +var WalletLinkMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"checkIfLinked\",\"inputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestNonceForRootKey\",\"inputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootKeyForWallet\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWalletsByRootKey\",\"inputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"wallets\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"linkCallerToRootKey\",\"inputs\":[{\"name\":\"rootWallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"linkWalletToRootKey\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"rootWallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeLink\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootWallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"LinkWalletToRootKey\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemoveLink\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"secondWallet\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"WalletLink__CannotLinkToRootWallet\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WalletLink__CannotLinkToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__CannotRemoveRootWallet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__LinkAlreadyExists\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WalletLink__LinkedToAnotherRootKey\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WalletLink__NotLinked\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]}]", +} + +// WalletLinkABI is the input ABI used to generate the binding from. +// Deprecated: Use WalletLinkMetaData.ABI instead. +var WalletLinkABI = WalletLinkMetaData.ABI + +// WalletLink is an auto generated Go binding around an Ethereum contract. +type WalletLink struct { + WalletLinkCaller // Read-only binding to the contract + WalletLinkTransactor // Write-only binding to the contract + WalletLinkFilterer // Log filterer for contract events +} + +// WalletLinkCaller is an auto generated read-only Go binding around an Ethereum contract. +type WalletLinkCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// WalletLinkTransactor is an auto generated write-only Go binding around an Ethereum contract. +type WalletLinkTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// WalletLinkFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type WalletLinkFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// WalletLinkSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type WalletLinkSession struct { + Contract *WalletLink // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// WalletLinkCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type WalletLinkCallerSession struct { + Contract *WalletLinkCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// WalletLinkTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type WalletLinkTransactorSession struct { + Contract *WalletLinkTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// WalletLinkRaw is an auto generated low-level Go binding around an Ethereum contract. +type WalletLinkRaw struct { + Contract *WalletLink // Generic contract binding to access the raw methods on +} + +// WalletLinkCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type WalletLinkCallerRaw struct { + Contract *WalletLinkCaller // Generic read-only contract binding to access the raw methods on +} + +// WalletLinkTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type WalletLinkTransactorRaw struct { + Contract *WalletLinkTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewWalletLink creates a new instance of WalletLink, bound to a specific deployed contract. +func NewWalletLink(address common.Address, backend bind.ContractBackend) (*WalletLink, error) { + contract, err := bindWalletLink(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &WalletLink{WalletLinkCaller: WalletLinkCaller{contract: contract}, WalletLinkTransactor: WalletLinkTransactor{contract: contract}, WalletLinkFilterer: WalletLinkFilterer{contract: contract}}, nil +} + +// NewWalletLinkCaller creates a new read-only instance of WalletLink, bound to a specific deployed contract. +func NewWalletLinkCaller(address common.Address, caller bind.ContractCaller) (*WalletLinkCaller, error) { + contract, err := bindWalletLink(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &WalletLinkCaller{contract: contract}, nil +} + +// NewWalletLinkTransactor creates a new write-only instance of WalletLink, bound to a specific deployed contract. +func NewWalletLinkTransactor(address common.Address, transactor bind.ContractTransactor) (*WalletLinkTransactor, error) { + contract, err := bindWalletLink(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &WalletLinkTransactor{contract: contract}, nil +} + +// NewWalletLinkFilterer creates a new log filterer instance of WalletLink, bound to a specific deployed contract. +func NewWalletLinkFilterer(address common.Address, filterer bind.ContractFilterer) (*WalletLinkFilterer, error) { + contract, err := bindWalletLink(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &WalletLinkFilterer{contract: contract}, nil +} + +// bindWalletLink binds a generic wrapper to an already deployed contract. +func bindWalletLink(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := WalletLinkMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_WalletLink *WalletLinkRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _WalletLink.Contract.WalletLinkCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_WalletLink *WalletLinkRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _WalletLink.Contract.WalletLinkTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_WalletLink *WalletLinkRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _WalletLink.Contract.WalletLinkTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_WalletLink *WalletLinkCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _WalletLink.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_WalletLink *WalletLinkTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _WalletLink.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_WalletLink *WalletLinkTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _WalletLink.Contract.contract.Transact(opts, method, params...) +} + +// CheckIfLinked is a free data retrieval call binding the contract method 0x912b9758. +// +// Solidity: function checkIfLinked(address rootKey, address wallet) view returns(bool) +func (_WalletLink *WalletLinkCaller) CheckIfLinked(opts *bind.CallOpts, rootKey common.Address, wallet common.Address) (bool, error) { + var out []interface{} + err := _WalletLink.contract.Call(opts, &out, "checkIfLinked", rootKey, wallet) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// CheckIfLinked is a free data retrieval call binding the contract method 0x912b9758. +// +// Solidity: function checkIfLinked(address rootKey, address wallet) view returns(bool) +func (_WalletLink *WalletLinkSession) CheckIfLinked(rootKey common.Address, wallet common.Address) (bool, error) { + return _WalletLink.Contract.CheckIfLinked(&_WalletLink.CallOpts, rootKey, wallet) +} + +// CheckIfLinked is a free data retrieval call binding the contract method 0x912b9758. +// +// Solidity: function checkIfLinked(address rootKey, address wallet) view returns(bool) +func (_WalletLink *WalletLinkCallerSession) CheckIfLinked(rootKey common.Address, wallet common.Address) (bool, error) { + return _WalletLink.Contract.CheckIfLinked(&_WalletLink.CallOpts, rootKey, wallet) +} + +// GetLatestNonceForRootKey is a free data retrieval call binding the contract method 0x20a00ac8. +// +// Solidity: function getLatestNonceForRootKey(address rootKey) view returns(uint256) +func (_WalletLink *WalletLinkCaller) GetLatestNonceForRootKey(opts *bind.CallOpts, rootKey common.Address) (*big.Int, error) { + var out []interface{} + err := _WalletLink.contract.Call(opts, &out, "getLatestNonceForRootKey", rootKey) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetLatestNonceForRootKey is a free data retrieval call binding the contract method 0x20a00ac8. +// +// Solidity: function getLatestNonceForRootKey(address rootKey) view returns(uint256) +func (_WalletLink *WalletLinkSession) GetLatestNonceForRootKey(rootKey common.Address) (*big.Int, error) { + return _WalletLink.Contract.GetLatestNonceForRootKey(&_WalletLink.CallOpts, rootKey) +} + +// GetLatestNonceForRootKey is a free data retrieval call binding the contract method 0x20a00ac8. +// +// Solidity: function getLatestNonceForRootKey(address rootKey) view returns(uint256) +func (_WalletLink *WalletLinkCallerSession) GetLatestNonceForRootKey(rootKey common.Address) (*big.Int, error) { + return _WalletLink.Contract.GetLatestNonceForRootKey(&_WalletLink.CallOpts, rootKey) +} + +// GetRootKeyForWallet is a free data retrieval call binding the contract method 0xf8210398. +// +// Solidity: function getRootKeyForWallet(address wallet) view returns(address rootKey) +func (_WalletLink *WalletLinkCaller) GetRootKeyForWallet(opts *bind.CallOpts, wallet common.Address) (common.Address, error) { + var out []interface{} + err := _WalletLink.contract.Call(opts, &out, "getRootKeyForWallet", wallet) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetRootKeyForWallet is a free data retrieval call binding the contract method 0xf8210398. +// +// Solidity: function getRootKeyForWallet(address wallet) view returns(address rootKey) +func (_WalletLink *WalletLinkSession) GetRootKeyForWallet(wallet common.Address) (common.Address, error) { + return _WalletLink.Contract.GetRootKeyForWallet(&_WalletLink.CallOpts, wallet) +} + +// GetRootKeyForWallet is a free data retrieval call binding the contract method 0xf8210398. +// +// Solidity: function getRootKeyForWallet(address wallet) view returns(address rootKey) +func (_WalletLink *WalletLinkCallerSession) GetRootKeyForWallet(wallet common.Address) (common.Address, error) { + return _WalletLink.Contract.GetRootKeyForWallet(&_WalletLink.CallOpts, wallet) +} + +// GetWalletsByRootKey is a free data retrieval call binding the contract method 0x02345b98. +// +// Solidity: function getWalletsByRootKey(address rootKey) view returns(address[] wallets) +func (_WalletLink *WalletLinkCaller) GetWalletsByRootKey(opts *bind.CallOpts, rootKey common.Address) ([]common.Address, error) { + var out []interface{} + err := _WalletLink.contract.Call(opts, &out, "getWalletsByRootKey", rootKey) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetWalletsByRootKey is a free data retrieval call binding the contract method 0x02345b98. +// +// Solidity: function getWalletsByRootKey(address rootKey) view returns(address[] wallets) +func (_WalletLink *WalletLinkSession) GetWalletsByRootKey(rootKey common.Address) ([]common.Address, error) { + return _WalletLink.Contract.GetWalletsByRootKey(&_WalletLink.CallOpts, rootKey) +} + +// GetWalletsByRootKey is a free data retrieval call binding the contract method 0x02345b98. +// +// Solidity: function getWalletsByRootKey(address rootKey) view returns(address[] wallets) +func (_WalletLink *WalletLinkCallerSession) GetWalletsByRootKey(rootKey common.Address) ([]common.Address, error) { + return _WalletLink.Contract.GetWalletsByRootKey(&_WalletLink.CallOpts, rootKey) +} + +// LinkCallerToRootKey is a paid mutator transaction binding the contract method 0xe65dfe9d. +// +// Solidity: function linkCallerToRootKey((address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkTransactor) LinkCallerToRootKey(opts *bind.TransactOpts, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.contract.Transact(opts, "linkCallerToRootKey", rootWallet, nonce) +} + +// LinkCallerToRootKey is a paid mutator transaction binding the contract method 0xe65dfe9d. +// +// Solidity: function linkCallerToRootKey((address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkSession) LinkCallerToRootKey(rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.Contract.LinkCallerToRootKey(&_WalletLink.TransactOpts, rootWallet, nonce) +} + +// LinkCallerToRootKey is a paid mutator transaction binding the contract method 0xe65dfe9d. +// +// Solidity: function linkCallerToRootKey((address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkTransactorSession) LinkCallerToRootKey(rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.Contract.LinkCallerToRootKey(&_WalletLink.TransactOpts, rootWallet, nonce) +} + +// LinkWalletToRootKey is a paid mutator transaction binding the contract method 0x1a31fc8d. +// +// Solidity: function linkWalletToRootKey((address,bytes) wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkTransactor) LinkWalletToRootKey(opts *bind.TransactOpts, wallet IWalletLinkBaseLinkedWallet, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.contract.Transact(opts, "linkWalletToRootKey", wallet, rootWallet, nonce) +} + +// LinkWalletToRootKey is a paid mutator transaction binding the contract method 0x1a31fc8d. +// +// Solidity: function linkWalletToRootKey((address,bytes) wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkSession) LinkWalletToRootKey(wallet IWalletLinkBaseLinkedWallet, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.Contract.LinkWalletToRootKey(&_WalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// LinkWalletToRootKey is a paid mutator transaction binding the contract method 0x1a31fc8d. +// +// Solidity: function linkWalletToRootKey((address,bytes) wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkTransactorSession) LinkWalletToRootKey(wallet IWalletLinkBaseLinkedWallet, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.Contract.LinkWalletToRootKey(&_WalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// RemoveLink is a paid mutator transaction binding the contract method 0xd80bd3b9. +// +// Solidity: function removeLink(address wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkTransactor) RemoveLink(opts *bind.TransactOpts, wallet common.Address, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.contract.Transact(opts, "removeLink", wallet, rootWallet, nonce) +} + +// RemoveLink is a paid mutator transaction binding the contract method 0xd80bd3b9. +// +// Solidity: function removeLink(address wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkSession) RemoveLink(wallet common.Address, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.Contract.RemoveLink(&_WalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// RemoveLink is a paid mutator transaction binding the contract method 0xd80bd3b9. +// +// Solidity: function removeLink(address wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkTransactorSession) RemoveLink(wallet common.Address, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.Contract.RemoveLink(&_WalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// WalletLinkLinkWalletToRootKeyIterator is returned from FilterLinkWalletToRootKey and is used to iterate over the raw logs and unpacked data for LinkWalletToRootKey events raised by the WalletLink contract. +type WalletLinkLinkWalletToRootKeyIterator struct { + Event *WalletLinkLinkWalletToRootKey // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *WalletLinkLinkWalletToRootKeyIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(WalletLinkLinkWalletToRootKey) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(WalletLinkLinkWalletToRootKey) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *WalletLinkLinkWalletToRootKeyIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *WalletLinkLinkWalletToRootKeyIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// WalletLinkLinkWalletToRootKey represents a LinkWalletToRootKey event raised by the WalletLink contract. +type WalletLinkLinkWalletToRootKey struct { + Wallet common.Address + RootKey common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterLinkWalletToRootKey is a free log retrieval operation binding the contract event 0x64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b5721. +// +// Solidity: event LinkWalletToRootKey(address indexed wallet, address indexed rootKey) +func (_WalletLink *WalletLinkFilterer) FilterLinkWalletToRootKey(opts *bind.FilterOpts, wallet []common.Address, rootKey []common.Address) (*WalletLinkLinkWalletToRootKeyIterator, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var rootKeyRule []interface{} + for _, rootKeyItem := range rootKey { + rootKeyRule = append(rootKeyRule, rootKeyItem) + } + + logs, sub, err := _WalletLink.contract.FilterLogs(opts, "LinkWalletToRootKey", walletRule, rootKeyRule) + if err != nil { + return nil, err + } + return &WalletLinkLinkWalletToRootKeyIterator{contract: _WalletLink.contract, event: "LinkWalletToRootKey", logs: logs, sub: sub}, nil +} + +// WatchLinkWalletToRootKey is a free log subscription operation binding the contract event 0x64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b5721. +// +// Solidity: event LinkWalletToRootKey(address indexed wallet, address indexed rootKey) +func (_WalletLink *WalletLinkFilterer) WatchLinkWalletToRootKey(opts *bind.WatchOpts, sink chan<- *WalletLinkLinkWalletToRootKey, wallet []common.Address, rootKey []common.Address) (event.Subscription, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var rootKeyRule []interface{} + for _, rootKeyItem := range rootKey { + rootKeyRule = append(rootKeyRule, rootKeyItem) + } + + logs, sub, err := _WalletLink.contract.WatchLogs(opts, "LinkWalletToRootKey", walletRule, rootKeyRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(WalletLinkLinkWalletToRootKey) + if err := _WalletLink.contract.UnpackLog(event, "LinkWalletToRootKey", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseLinkWalletToRootKey is a log parse operation binding the contract event 0x64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b5721. +// +// Solidity: event LinkWalletToRootKey(address indexed wallet, address indexed rootKey) +func (_WalletLink *WalletLinkFilterer) ParseLinkWalletToRootKey(log types.Log) (*WalletLinkLinkWalletToRootKey, error) { + event := new(WalletLinkLinkWalletToRootKey) + if err := _WalletLink.contract.UnpackLog(event, "LinkWalletToRootKey", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// WalletLinkRemoveLinkIterator is returned from FilterRemoveLink and is used to iterate over the raw logs and unpacked data for RemoveLink events raised by the WalletLink contract. +type WalletLinkRemoveLinkIterator struct { + Event *WalletLinkRemoveLink // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *WalletLinkRemoveLinkIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(WalletLinkRemoveLink) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(WalletLinkRemoveLink) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *WalletLinkRemoveLinkIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *WalletLinkRemoveLinkIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// WalletLinkRemoveLink represents a RemoveLink event raised by the WalletLink contract. +type WalletLinkRemoveLink struct { + Wallet common.Address + SecondWallet common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRemoveLink is a free log retrieval operation binding the contract event 0x9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da2. +// +// Solidity: event RemoveLink(address indexed wallet, address indexed secondWallet) +func (_WalletLink *WalletLinkFilterer) FilterRemoveLink(opts *bind.FilterOpts, wallet []common.Address, secondWallet []common.Address) (*WalletLinkRemoveLinkIterator, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var secondWalletRule []interface{} + for _, secondWalletItem := range secondWallet { + secondWalletRule = append(secondWalletRule, secondWalletItem) + } + + logs, sub, err := _WalletLink.contract.FilterLogs(opts, "RemoveLink", walletRule, secondWalletRule) + if err != nil { + return nil, err + } + return &WalletLinkRemoveLinkIterator{contract: _WalletLink.contract, event: "RemoveLink", logs: logs, sub: sub}, nil +} + +// WatchRemoveLink is a free log subscription operation binding the contract event 0x9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da2. +// +// Solidity: event RemoveLink(address indexed wallet, address indexed secondWallet) +func (_WalletLink *WalletLinkFilterer) WatchRemoveLink(opts *bind.WatchOpts, sink chan<- *WalletLinkRemoveLink, wallet []common.Address, secondWallet []common.Address) (event.Subscription, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var secondWalletRule []interface{} + for _, secondWalletItem := range secondWallet { + secondWalletRule = append(secondWalletRule, secondWalletItem) + } + + logs, sub, err := _WalletLink.contract.WatchLogs(opts, "RemoveLink", walletRule, secondWalletRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(WalletLinkRemoveLink) + if err := _WalletLink.contract.UnpackLog(event, "RemoveLink", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRemoveLink is a log parse operation binding the contract event 0x9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da2. +// +// Solidity: event RemoveLink(address indexed wallet, address indexed secondWallet) +func (_WalletLink *WalletLinkFilterer) ParseRemoveLink(log types.Log) (*WalletLinkRemoveLink, error) { + event := new(WalletLinkRemoveLink) + if err := _WalletLink.contract.UnpackLog(event, "RemoveLink", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/node/contracts/custom_errors.go b/core/node/contracts/custom_errors.go new file mode 100644 index 000000000..2e469a70a --- /dev/null +++ b/core/node/contracts/custom_errors.go @@ -0,0 +1,173 @@ +package contracts + +import ( + "encoding/hex" + "fmt" + "reflect" + "strings" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/protocol" +) + +var ( + // stringErrorFuncSelector = keccack256("Revert reason")[4] + stringErrorFuncSelector = [4]byte{0x08, 0xc3, 0x79, 0xa0} + stringType, _ = abi.NewType("string", "string", nil) +) + +type EvmErrorDecoder struct { + abis []*abi.ABI +} + +// NewEVMErrorDecoder returns a evmErrorDecoder that combines multiple ABI +// definitions to decode errors returned from the EVM. +func NewEVMErrorDecoder(metaData ...*bind.MetaData) (*EvmErrorDecoder, error) { + cea := &EvmErrorDecoder{} + for _, md := range metaData { + if err := cea.AddMetaData(md); err != nil { + return nil, err + } + } + return cea, nil +} + +// AddMetaData add extra ABI metadata to consider when decoding EVM errors. +func (ca *EvmErrorDecoder) AddMetaData(md *bind.MetaData) error { + a, err := md.GetAbi() + if err != nil { + return AsRiverError(err, Err_INVALID_ARGUMENT).Func("NewErrorsABI") + } + ca.abis = append(ca.abis, a) + return nil +} + +// DecodeEVMError tries to decode the given error returned from a contract call +// made with abigen generated bindings or directly from a call made with +// ethclient.Client. +// +// It will try to decode the EVM message to a custom error defined in any of the +// wrapped ABI's. If that fails it tries to decode the message as a classical +// string error. If that fails it returns err as a RiverError. +func (ca *EvmErrorDecoder) DecodeEVMError(err error) (*CustomerError, *StringError, error) { + if err == nil { + return nil, nil, nil + } + + // if err is a *rpc.jsonError it holds a response from the RPC server + // indicating that the EVM failed during execution. Because this type is + // not exported we need to bypass the type system to get access to the + // underlying data. + errType := reflect.TypeOf(err) + errValue := reflect.ValueOf(err) + + if errType.Kind() == reflect.Pointer && + errType.Elem().PkgPath() == "github.com/ethereum/go-ethereum/rpc" && + errType.Elem().Name() == "jsonError" { + + var ( + code = errValue.Elem().FieldByName("Code").Int() + message = errValue.Elem().FieldByName("Message").String() + data = errValue.Elem().FieldByName("Data").Interface() + funcSelector [4]byte + ) + + // data contains hex encoded data returned from the EVM + if hexData, ok := data.(string); ok { + rawData := common.FromHex(hexData) + if len(rawData) >= 4 { + copy(funcSelector[:], rawData[:4]) + + for _, a := range ca.abis { + if decErr, _ := a.ErrorByID(funcSelector); decErr != nil { + if decoded, err := decErr.Unpack(rawData); err == nil { + if decodedAsSlice, ok := decoded.([]any); ok { + return &CustomerError{ + Code: code, + Message: message, + DecodedError: decErr, + Params: decodedAsSlice, + }, nil, nil + } else { + return &CustomerError{ + Code: code, + Message: message, + DecodedError: decErr, + }, nil, nil + } + } + } + } + + // Try to decode the error as a string error. + if funcSelector == stringErrorFuncSelector { + payloadArg := abi.Arguments{{Type: stringType}} + if decodedString, err := payloadArg.Unpack(rawData[4:]); err == nil { + if str, ok := decodedString[0].(string); ok { + return nil, &StringError{ + Code: code, + EVMError: str, + RPCMessage: message, + }, nil + } + } + } + } + + // the EVM returned an unknown custom error + return nil, nil, RiverError(Err_UNKNOWN, "Unknown custom EVM error"). + Tag("code", code). + Tag("funcSelector", hex.EncodeToString(funcSelector[:])). + Func("DecodeEVMError") + } + } + + return nil, nil, AsRiverError(err).Func("DecodeEVMError") +} + +// CustomerError represents a custom error returned by the RPC server. +type CustomerError struct { + // Code is the received RPC error code + Code int64 + // Message is the received RPC message + Message string + // DecodedError holds the ABI error definition and can be used to determine + // what error was raised + DecodedError *abi.Error + // Params hold the decoded error data for the DecError + // e.g. MyCustomErr(uint256, address) => Params[1234, 0x12..34] + Params []any +} + +func (ce CustomerError) Error() string { + var sb strings.Builder + sb.Write([]byte(ce.DecodedError.Name)) + sb.Write([]byte("(")) + for i, p := range ce.Params { + if i > 0 { + sb.Write([]byte(",")) + } + sb.Write([]byte(fmt.Sprintf("%s", p))) + } + sb.Write([]byte(")")) + return sb.String() +} + +// StringError as received from the RPC node. +type StringError struct { + // Code is the received RPC error code + Code int64 + // EVMErrorString holds the string error as returned by the EVM + // e.g. require(cond, "My String Error") => EVMError="My String Error" + EVMError string + // RPCMessage contains the string error, (probably modified) from the RPC + // server. You probably want to use EVMError instead. + RPCMessage string +} + +func (se StringError) Error() string { + return se.EVMError +} diff --git a/core/node/contracts/custom_errors_test.go b/core/node/contracts/custom_errors_test.go new file mode 100644 index 000000000..d5ae5ef1c --- /dev/null +++ b/core/node/contracts/custom_errors_test.go @@ -0,0 +1,173 @@ +package contracts_test + +import ( + "errors" + "math/big" + "net/http" + "testing" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/jarcoal/httpmock" + "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/base/test" + "github.com/river-build/river/core/node/contracts" +) + +var ( + ABI1 = &bind.MetaData{ABI: "[{\"inputs\":[],\"name\":\"bar\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"foo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"block\",\"type\":\"uint256\"}],\"name\":\"InvalidBlockNumber\",\"type\":\"error\"}]"} + // ABI2 holds a custom error InvalidBlockNumber(u256) + ABI2 = &bind.MetaData{ABI: "[{\"inputs\":[],\"name\":\"bar\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"block\",\"type\":\"uint256\"}],\"name\":\"InvalidBlockNumber\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"Bytes\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"foo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"int64\",\"name\":\"\",\"type\":\"int64\"}],\"name\":\"Int64Val\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"name\":\"IntVal\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"raiseInt\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"raiseInt64\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"name\":\"setBytes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"int64\",\"name\":\"value\",\"type\":\"int64\"}],\"name\":\"setInt64\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"getBytes\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"getBytesWithSometimesCustomError\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"getBytesWithSometimesStringError\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"getInt\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"val\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"getInt64\",\"outputs\":[{\"internalType\":\"int64\",\"name\":\"val\",\"type\":\"int64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int64\",\"name\":\"val\",\"type\":\"int64\"}],\"name\":\"int64Bytes\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"val\",\"type\":\"int256\"}],\"name\":\"intBytes\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"val\",\"type\":\"uint64\"}],\"name\":\"uint64Bytes\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"uintBytes\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]"} +) + +func TestEVMCustomError(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + + httpmock.Activate() + defer httpmock.DeactivateAndReset() + + var ( + combinedABI, _ = contracts.NewEVMErrorDecoder(ABI1, ABI2) + mockReplyWithCustomError = map[string]interface{}{ + "jsonrpc": "2.0", + "id": 3, + "error": map[string]interface{}{ + "code": 3, + "message": "execution reverted", + "data": "0x9f4aafbe00000000000000000000000000000000000000000000000000000000006b4a50", + }, + } + ) + + httpmock.RegisterResponder("POST", "http://localhost:8545", + func(req *http.Request) (*http.Response, error) { + return httpmock.NewJsonResponse(200, mockReplyWithCustomError) + }) + + client, err := ethclient.Dial("http://localhost:8545") + if err != nil { + t.Fatalf("unable to dial endpoint: %v", err) + } + + _, err = client.EstimateGas(ctx, ethereum.CallMsg{}) + + customError, stringError, err := combinedABI.DecodeEVMError(err) + if err != nil { + t.Fatalf("unexpected error, got: %v", err) + } + if stringError != nil { + t.Fatalf("unexpected string error, got: %v", stringError) + } + if err != nil { + t.Fatalf("unexpected error, got: %v", err) + } + if customError == nil { + t.Fatalf("expected custom error, but got nil") + } + a, _ := ABI2.GetAbi() + if customError.DecodedError.ID != a.Errors["InvalidBlockNumber"].ID { + t.Fatalf("unexpected custom error message, exp: '%x', got: '%x'", a.Errors["InvalidBlockNumber"].ID, customError.DecodedError.ID) + } + if customError.DecodedError.Name != "InvalidBlockNumber" { + t.Fatalf("unexpected custom error name, exp: '%x', got: '%x'", "InvalidBlockNumber", customError.DecodedError.Name) + } + if customError.DecodedError.Sig != "InvalidBlockNumber(uint256)" { + t.Fatalf("unexpected custom error message, exp: '%s', got: '%s'", "InvalidBlockNumber(uint256)", customError.DecodedError.Sig) + } + if customError.Params[0].(*big.Int).Uint64() != 7031376 { + t.Fatalf("unexpected custom error message, exp: '%d', got: '%d'", 7031376, customError.Params[0]) + } + if customError.Error() != "InvalidBlockNumber(7031376)" { + t.Fatalf("unexpected custom error as string, exp: 'InvalidBlockNumber(7031376)', got: '%s'", customError.Error()) + } +} + +func TestEVMStringError(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + + httpmock.Activate() + defer httpmock.DeactivateAndReset() + + var ( + combinedABI, _ = contracts.NewEVMErrorDecoder(ABI1, ABI2) + mockReplyWithStringError = map[string]interface{}{ + "jsonrpc": "2.0", + "id": 7, + "error": map[string]interface{}{ + "code": 3, + "message": "execution reverted: InvalidBlockNumber", + "data": "0x08c379a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000012496e76616c6964426c6f636b4e756d6265720000000000000000000000000000", + }, + } + ) + + httpmock.RegisterResponder("POST", "http://localhost:8545", + func(req *http.Request) (*http.Response, error) { + return httpmock.NewJsonResponse(200, mockReplyWithStringError) + }) + + client, err := ethclient.Dial("http://localhost:8545") + if err != nil { + t.Fatalf("unable to dial endpoint: %v", err) + } + + _, err = client.EstimateGas(ctx, ethereum.CallMsg{}) + + customError, stringError, err := combinedABI.DecodeEVMError(err) + if err != nil { + t.Fatalf("unexpected error, got: %v", err) + } + if customError != nil { + t.Fatalf("unexpected custom error, got: %v", customError) + } + if err != nil { + t.Fatalf("unexpected error, got: %v", err) + } + if stringError == nil { + t.Fatalf("expected string error, but got nil") + } + if stringError.EVMError != "InvalidBlockNumber" { + t.Fatalf("unexpected string error message, exp: '%s', got: '%s'", "InvalidBlockNumber", stringError.RPCMessage) + } +} + +func TestEVMUnexpectedError(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + + httpmock.Activate() + defer httpmock.DeactivateAndReset() + + combinedABI, _ := contracts.NewEVMErrorDecoder(ABI1, ABI2) + + httpmock.RegisterResponder("POST", "http://localhost:8545", + func(req *http.Request) (*http.Response, error) { + return httpmock.NewJsonResponse(200, "invalid reply") + }) + + client, err := ethclient.Dial("http://localhost:8545") + if err != nil { + t.Fatalf("unable to dial endpoint: %v", err) + } + + _, err = client.EstimateGas(ctx, ethereum.CallMsg{}) + + customError, stringError, err := combinedABI.DecodeEVMError(err) + + if err == nil { + t.Fatalf("expected error, got nil") + } + var rerr *base.RiverErrorImpl + if !errors.As(err, &rerr) { + t.Fatalf("expected error to be a RiverError, got: %T", err) + } + if stringError != nil { + t.Fatalf("unexpected string error, got: %v", stringError) + } + if customError != nil { + t.Fatalf("expected custom error, but got: %v", customError) + } +} diff --git a/core/node/contracts/deploy/mock_river_registry.go b/core/node/contracts/deploy/mock_river_registry.go new file mode 100644 index 000000000..aec02dad2 --- /dev/null +++ b/core/node/contracts/deploy/mock_river_registry.go @@ -0,0 +1,3565 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package deploy + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// Node is an auto generated low-level Go binding around an user-defined struct. +type Node struct { + Status uint8 + Url string + NodeAddress common.Address + Operator common.Address +} + +// SetMiniblock is an auto generated low-level Go binding around an user-defined struct. +type SetMiniblock struct { + StreamId [32]byte + PrevMiniBlockHash [32]byte + LastMiniblockHash [32]byte + LastMiniblockNum uint64 + IsSealed bool +} + +// Setting is an auto generated low-level Go binding around an user-defined struct. +type Setting struct { + Key [32]byte + BlockNumber uint64 + Value []byte +} + +// Stream is an auto generated low-level Go binding around an user-defined struct. +type Stream struct { + LastMiniblockHash [32]byte + LastMiniblockNum uint64 + Reserved0 uint64 + Flags uint64 + Nodes []common.Address +} + +// StreamWithId is an auto generated low-level Go binding around an user-defined struct. +type StreamWithId struct { + Id [32]byte + Stream Stream +} + +// MockRiverRegistryMetaData contains all meta data concerning the MockRiverRegistry contract. +var MockRiverRegistryMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"approvedOperators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"__OperatorRegistry_init\",\"inputs\":[{\"name\":\"initialOperators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"__RiverConfig_init\",\"inputs\":[{\"name\":\"configManagers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allocateStream\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"genesisMiniblockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"genesisMiniblock\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"approveConfigurationManager\",\"inputs\":[{\"name\":\"manager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"approveOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"configurationExists\",\"inputs\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deleteConfiguration\",\"inputs\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deleteConfigurationOnBlock\",\"inputs\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllConfiguration\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structSetting[]\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllNodeAddresses\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllNodes\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structNode[]\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumNodeStatus\"},{\"name\":\"url\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllStreamIds\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllStreams\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structStreamWithId[]\",\"components\":[{\"name\":\"id\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stream\",\"type\":\"tuple\",\"internalType\":\"structStream\",\"components\":[{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"reserved0\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"flags\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfiguration\",\"inputs\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structSetting[]\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNode\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structNode\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumNodeStatus\"},{\"name\":\"url\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNodeCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPaginatedStreams\",\"inputs\":[{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stop\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structStreamWithId[]\",\"components\":[{\"name\":\"id\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stream\",\"type\":\"tuple\",\"internalType\":\"structStream\",\"components\":[{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"reserved0\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"flags\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStream\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structStream\",\"components\":[{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"reserved0\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"flags\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStreamByIndex\",\"inputs\":[{\"name\":\"i\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structStreamWithId\",\"components\":[{\"name\":\"id\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stream\",\"type\":\"tuple\",\"internalType\":\"structStream\",\"components\":[{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"reserved0\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"flags\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStreamCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStreamWithGenesis\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structStream\",\"components\":[{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"reserved0\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"flags\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStreamsOnNode\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structStreamWithId[]\",\"components\":[{\"name\":\"id\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stream\",\"type\":\"tuple\",\"internalType\":\"structStream\",\"components\":[{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"reserved0\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"flags\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isConfigurationManager\",\"inputs\":[{\"name\":\"manager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"placeStreamOnNode\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerNode\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"url\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumNodeStatus\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeConfigurationManager\",\"inputs\":[{\"name\":\"manager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeNode\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStreamFromNode\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setConfiguration\",\"inputs\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStreamLastMiniblock\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isSealed\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStreamLastMiniblockBatch\",\"inputs\":[{\"name\":\"miniblocks\",\"type\":\"tuple[]\",\"internalType\":\"structSetMiniblock[]\",\"components\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prevMiniBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isSealed\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateNodeStatus\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumNodeStatus\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateNodeUrl\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"url\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ConfigurationChanged\",\"inputs\":[{\"name\":\"key\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"block\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"value\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"deleted\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigurationManagerAdded\",\"inputs\":[{\"name\":\"manager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigurationManagerRemoved\",\"inputs\":[{\"name\":\"manager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InterfaceAdded\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"indexed\":true,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InterfaceRemoved\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"indexed\":true,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NodeAdded\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"url\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumNodeStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NodeRemoved\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NodeStatusUpdated\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumNodeStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NodeUrlUpdated\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"url\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAdded\",\"inputs\":[{\"name\":\"operatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemoved\",\"inputs\":[{\"name\":\"operatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StreamAllocated\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"genesisMiniblockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"genesisMiniblock\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StreamLastMiniblockUpdateFailed\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"reason\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StreamLastMiniblockUpdated\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"isSealed\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StreamPlacementUpdated\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"nodeAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"isAdded\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"Initializable_InInitializingState\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Initializable_NotInInitializingState\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Introspection_AlreadySupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Introspection_NotSupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Ownable__NotOwner\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Ownable__ZeroAddress\",\"inputs\":[]}]", + Bin: "0x60806040523480156200001157600080fd5b5060405162004e2838038062004e288339810160408190526200003491620004a6565b6200003e620000c1565b620000493362000169565b60005b8151811015620000b957620000838282815181106200006f576200006f62000578565b60200260200101516200023760201b60201c565b620000b08282815181106200009c576200009c62000578565b60200260200101516200031c60201b60201c565b6001016200004c565b5050620005df565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16156200010e576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156200016657805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b60006200019d7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b90506001600160a01b038216620001c757604051634e3ef82560e01b815260040160405180910390fd5b817f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae30080546001600160a01b0319166001600160a01b03928316179055604051838216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038116620002865760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526200027d91906004016200058e565b60405180910390fd5b62000293600882620003e9565b15620002d757604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526200027d91906004016200058e565b620002e460088262000410565b506040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b6001600160a01b038116620003625760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526200027d91906004016200058e565b6200036f600d8262000410565b620003b257604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526200027d91906004016200058e565b6040516001600160a01b038216907f7afd798379ae2d2e5035438544cea2b60eb1dde6a8128e6d447fd2a25f8825a290600090a250565b6001600160a01b038116600090815260018301602052604081205415155b90505b92915050565b600062000407836001600160a01b03841660008181526001830160205260408120546200046a575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200040a565b5060006200040a565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b0381168114620004a157600080fd5b919050565b60006020808385031215620004ba57600080fd5b82516001600160401b0380821115620004d257600080fd5b818501915085601f830112620004e757600080fd5b815181811115620004fc57620004fc62000473565b8060051b604051601f19603f8301168101818110858211171562000524576200052462000473565b6040529182528482019250838101850191888311156200054357600080fd5b938501935b828510156200056c576200055c8562000489565b8452938501939285019262000548565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020808352835180602085015260005b81811015620005be57858101830151858201604001528201620005a0565b506000604082860101526040601f19601f8301168501019250505092915050565b61483980620005ef6000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80639d20904811610125578063c179b85f116100ad578063d7a3158a1161007c578063d7a3158a146104b1578063ee885b12146104c4578063eecc66f4146104d7578063fc207c01146104ea578063ff3a14ab146104fd57600080fd5b8063c179b85f14610455578063c8fe3a0114610468578063ca78c41a1461047d578063d4bd44a01461049e57600080fd5b8063ac8a584a116100f4578063ac8a584a14610401578063b2b99ec914610414578063b7f227ee14610427578063ba428b1a1461043a578063c0f220841461044d57600080fd5b80639d209048146103a65780639ee86d38146103c6578063a09449a6146103d9578063a1174e7d146103ec57600080fd5b80633c2544d1116101a85780636d70f7ae116101775780636d70f7ae146103355780637e4465e714610358578063813049ec1461036b57806386789fc61461037e5780639283ae3a1461039357600080fd5b80633c2544d1146102cd578063581f8b9b146102ef57806368b454df146103025780636b883c391461032257600080fd5b806331374511116101e4578063313745111461027c57806332705ac41461028f57806339bf397e146102af5780633bd84c0c146102c557600080fd5b8063035759e114610216578063081814db1461022b5780631290abe814610249578063242cae9f14610269575b600080fd5b6102296102243660046139ac565b610510565b005b61023361067d565b6040516102409190613a15565b60405180910390f35b61025c6102573660046139ac565b6108e8565b6040516102409190613b30565b610229610277366004613b5f565b610a0a565b61022961028a366004613b7a565b610a51565b6102a261029d366004613b5f565b610ae2565b6040516102409190613c6f565b6102b7610d92565b604051908152602001610240565b6102a2610da3565b6102e06102db3660046139ac565b610f14565b60405161024093929190613c82565b6102296102fd366004613cc6565b6110e5565b6103156103103660046139ac565b611285565b6040516102409190613cf9565b610229610330366004613dc1565b6113ac565b610348610343366004613b5f565b611611565b6040519015158152602001610240565b610229610366366004613ea4565b611624565b610229610379366004613b5f565b61181c565b610386611917565b6040516102409190613ef1565b6102336103a13660046139ac565b611923565b6103b96103b4366004613b5f565b611a85565b6040516102409190613fc1565b6102296103d4366004613fd4565b611c06565b6102296103e736600461400e565b611dc3565b6103f4612044565b6040516102409190614094565b61022961040f366004613b5f565b612218565b610229610422366004613b5f565b61237b565b6102296104353660046140f8565b612544565b610229610448366004613b7a565b612793565b6102b761281f565b610229610463366004613b5f565b61282a565b61047061286e565b6040516102409190614160565b61049061048b366004614173565b61287a565b604051610240929190614195565b6103486104ac366004613b5f565b612a73565b6102296104bf3660046141c9565b612a80565b6102296104d2366004613fd4565b612c0b565b6102296104e5366004614219565b612e57565b6103486104f83660046139ac565b613021565b61022961050b366004614276565b61302e565b3361051c600d82613295565b61055f5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b60405180910390fd5b8161056b600a826132ba565b6105a65760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6000838152600c602052604090205415610619576000838152600c602052604090208054806105d7576105d76142eb565b60008281526020812060036000199093019283020181815560018101805467ffffffffffffffff19169055906106106002830182613857565b505090556105a6565b6000838152600c6020526040812061063091613891565b61063b600a846132d2565b506040805184815260006020820181905260808284018190528201526001606082015290516000805160206148198339815191529181900360a00190a1505050565b606060008061068c600a6132de565b905060005b818110156106cd5760006106a6600a836132e8565b6000818152600c60205260409020549091506106c29085614317565b935050600101610691565b506000826001600160401b038111156106e8576106e8613d0c565b60405190808252806020026020018201604052801561073557816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816107065790505b5090506000610744600a6132de565b90506000805b828110156108dd57600061075f600a836132e8565b6000818152600c6020908152604080832080548251818502810185019093528083529495509293909291849084015b8282101561087257600084815260209081902060408051606081018252600386029092018054835260018101546001600160401b031693830193909352600283018054929392918401916107e19061432a565b80601f016020809104026020016040519081016040528092919081815260200182805461080d9061432a565b801561085a5780601f1061082f5761010080835404028352916020019161085a565b820191906000526020600020905b81548152906001019060200180831161083d57829003601f168201915b5050505050815250508152602001906001019061078e565b50505050905060005b81518110156108cf578181815181106108965761089661435e565b60200260200101518786806108aa90614374565b9750815181106108bc576108bc61435e565b602090810291909101015260010161087b565b50505080600101905061074a565b509195945050505050565b6040805160a081018252600080825260208201819052918101829052606080820183905260808201529061091c90836132ba565b6109575760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b600082815260026020818152604092839020835160a0810185528154815260018201546001600160401b0380821683860152600160401b8204811683880152600160801b90910416606082015292810180548551818502810185019096528086529394919360808601938301828280156109fa57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109dc575b5050505050815250509050919050565b610a126132f4565b6001600160a01b0316336001600160a01b031614610a45576040516365f4906560e01b8152336004820152602401610556565b610a4e81613322565b50565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff16610a9b57604051630ef4733760e31b815260040160405180910390fd5b60005b81811015610add57610ad5838383818110610abb57610abb61435e565b9050602002016020810190610ad09190613b5f565b6133f4565b600101610a9e565b505050565b60606000610aef816132de565b6001600160401b03811115610b0657610b06613d0c565b604051908082528060200260200182016040528015610b2f578160200160208202803683370190505b5090506000805b610b4060006132de565b811015610bf5576000610b5381836132e8565b60008181526002602052604081209192505b6002820154811015610be757876001600160a01b0316826002018281548110610b9057610b9061435e565b6000918252602090912001546001600160a01b031603610bdf57828686610bb68161438d565b975063ffffffff1681518110610bce57610bce61435e565b602002602001018181525050610be7565b600101610b65565b505050806001019050610b36565b5060008163ffffffff166001600160401b03811115610c1657610c16613d0c565b604051908082528060200260200182016040528015610c4f57816020015b610c3c6138b2565b815260200190600190039081610c345790505b50905060005b8263ffffffff16811015610d89576040518060400160405280858381518110610c8057610c8061435e565b6020026020010151815260200160006002016000878581518110610ca657610ca661435e565b6020908102919091018101518252818101929092526040908101600020815160a0810183528154815260018201546001600160401b0380821683870152600160401b8204811683860152600160801b909104166060820152600282018054845181870281018701909552808552919492936080860193909290830182828015610d5857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d3a575b505050505081525050815250828281518110610d7657610d7661435e565b6020908102919091010152600101610c55565b50949350505050565b6000610d9e60056132de565b905090565b60606000610db0816132de565b6001600160401b03811115610dc757610dc7613d0c565b604051908082528060200260200182016040528015610e0057816020015b610ded6138b2565b815260200190600190039081610de55790505b50905060005b610e1060006132de565b811015610f0e576000610e2381836132e8565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015610edc57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ebe575b505050505081525050815250838381518110610efa57610efa61435e565b602090810291909101015250600101610e06565b50919050565b6040805160a081018252600080825260208201819052918101829052606080820183905260808201819052909190610f4c82856132ba565b610f875760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b600084815260026020818152604080842060048352818520546003845294829020825160a0810184528254815260018301546001600160401b0380821683880152600160401b8204811683870152600160801b9091041660608201529482018054845181870281018701909552808552929695919491938793608086019391929183018282801561104157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611023575b50505050508152505092508080546110589061432a565b80601f01602080910402602001604051908101604052809291908181526020018280546110849061432a565b80156110d15780601f106110a6576101008083540402835291602001916110d1565b820191906000526020600020905b8154815290600101906020018083116110b457829003601f168201915b505050505090509250925092509193909250565b6001600160a01b0380831660009081526007602052604090206002015483911661114557604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b33611151600882613295565b61118b5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b03808516600090815260076020526040902060030154859133911681146111e95760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038616600090815260076020526040902080546112109060ff16876134b9565b80548690829060ff1916600183600581111561122e5761122e613f35565b021790555060028101546040516001600160a01b03909116907f20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0906112749089906143b0565b60405180910390a250505050505050565b61128d6138b2565b61129760006132de565b82106112d45760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b60006112e081846132e8565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b909104166060820152918101805486518186028101860190975280875296975093958387019592949193608086019392919083018282801561139957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161137b575b5050509190925250505090529392505050565b336000818152600760205260409020600201546001600160a01b031661140857604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b6114136000866132ba565b1561145457604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b60005b84518110156114d8576114908582815181106114755761147561435e565b6020026020010151600060050161329590919063ffffffff16565b6114d057604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b600101611457565b506040805160a08101825284815260006020820181905291810182905260608101829052608081018690529061150e908761364c565b5060008681526002602081815260409283902084518155818501516001820180549587015160608801516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026fffffffffffffffffffffffffffffffff1990991691909416179690961795909516179093556080840151805185949361159e939085019201906138fc565b50505060008681526003602052604090206115b98482614423565b5060008681526004602052604090819020859055517f55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb906116019088908890889088906144dc565b60405180910390a1505050505050565b600061161e600883613295565b92915050565b33611630600882613295565b61166a5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038084166000908152600760205260409020600201548491166116ca57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b03808516600090815260076020526040902060030154859133911681146117285760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038616600090815260076020908152604091829020915161175291889101614518565b604051602081830303815290604052805190602001208160010160405160200161177c9190614534565b60405160208183030381529060405280519060200120036117cc5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b600181016117da8782614423565b5060028101546040516001600160a01b03909116907f4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac906112749089906142d8565b6118246132f4565b6001600160a01b0316336001600160a01b031614611857576040516365f4906560e01b8152336004820152602401610556565b6001600160a01b03811661189a5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b6118a5600d82613658565b6118e05760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6040516001600160a01b038216907ff9889c857e5356066b564327caa757c325ecbc001b2b47d72edf8cf9aedb1be590600090a250565b6060610d9e600061366d565b606081611931600a826132ba565b61196c5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6000838152600c6020908152604080832080548251818502810185019093528083529193909284015b82821015611a7957600084815260209081902060408051606081018252600386029092018054835260018101546001600160401b031693830193909352600283018054929392918401916119e89061432a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a149061432a565b8015611a615780601f10611a3657610100808354040283529160200191611a61565b820191906000526020600020905b815481529060010190602001808311611a4457829003601f168201915b50505050508152505081526020019060010190611995565b50505050915050919050565b611ab06040805160808101909152806000815260606020820181905260006040830181905291015290565b611abb600583613295565b611afb57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038216600090815260076020526040908190208151608081019092528054829060ff166005811115611b3657611b36613f35565b6005811115611b4757611b47613f35565b8152602001600182018054611b5b9061432a565b80601f0160208091040260200160405190810160405280929190818152602001828054611b879061432a565b8015611bd45780601f10611ba957610100808354040283529160200191611bd4565b820191906000526020600020905b815481529060010190602001808311611bb757829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015292915050565b81611c126000826132ba565b611c4d5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b03808316600090815260076020526040902060020154839116611cad57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b6000848152600260205260408120905b6002820154811015611d4657846001600160a01b0316826002018281548110611ce857611ce861435e565b6000918252602090912001546001600160a01b031603611d3e57604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b600101611cbd565b5060028101805460018082018355600092835260209283902090910180546001600160a01b0319166001600160a01b03881690811790915560408051898152938401919091528201527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f9060600160405180910390a15050505050565b33611dcf600d82613295565b611e095760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6000829003611e475760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b611e52600a866132ba565b611e6357611e61600a8661364c565b505b6000858152600c6020526040812054905b81811015611f4a576000878152600c6020526040902080546001600160401b038816919083908110611ea857611ea861435e565b60009182526020909120600160039092020101546001600160401b031603611f42576000878152600c6020526040902080548691869184908110611eee57611eee61435e565b90600052602060002090600302016002019182611f0c9291906145aa565b50600080516020614819833981519152878787876000604051611f33959493929190614663565b60405180910390a1505061203d565b600101611e74565b506000600c0160008781526020019081526020016000206040518060600160405280888152602001876001600160401b0316815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050835460018082018655948252602091829020845160039092020190815590830151938101805467ffffffffffffffff19166001600160401b039095169490941790935550604081015190919060028201906120149082614423565b505050600080516020614819833981519152868686866000604051611601959493929190614663565b5050505050565b6060600061205260056132de565b6001600160401b0381111561206957612069613d0c565b6040519080825280602002602001820160405280156120c557816020015b6120b26040805160808101909152806000815260606020820181905260006040830181905291015290565b8152602001906001900390816120875790505b50905060005b6120d560056132de565b811015610f0e57600760006120eb6005846132e8565b6001600160a01b03168152602081019190915260409081016000208151608081019092528054829060ff16600581111561212757612127613f35565b600581111561213857612138613f35565b815260200160018201805461214c9061432a565b80601f01602080910402602001604051908101604052809291908181526020018280546121789061432a565b80156121c55780601f1061219a576101008083540402835291602001916121c5565b820191906000526020600020905b8154815290600101906020018083116121a857829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015282518390839081106122055761220561435e565b60209081029190910101526001016120cb565b6122206132f4565b6001600160a01b0316336001600160a01b031614612253576040516365f4906560e01b8152336004820152602401610556565b61225e600882613295565b6122a257604080518082018252601281527113d41154905513d497d393d517d193d5539160721b6020820152905162461bcd60e51b815261055691906004016142d8565b60005b6122af60056132de565b811015612337576001600160a01b038216600760006122cf6005856132e8565b6001600160a01b039081168252602082019290925260400160002060030154160361232f57604080518082018252600d81526c4f55545f4f465f424f554e445360981b6020820152905162461bcd60e51b815261055691906004016142d8565b6001016122a5565b50612343600882613658565b506040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b6001600160a01b03808216600090815260076020526040902060030154829133911681146123d95760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038381166000908152600760205260409020600201541661243757604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b60056001600160a01b03841660009081526007602052604090205460ff16600581111561246657612466613f35565b146124af5760408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b815261055691906004016142d8565b6124ba600584613658565b506001600160a01b0383166000908152600760205260408120805460ff19168155906124e96001830182613857565b506002810180546001600160a01b03199081169091556003909101805490911690556040516001600160a01b038416907fcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b90600090a2505050565b33612550600d82613295565b61258a5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6000805b6000858152600c602052604090205481101561270b576000858152600c6020526040902080546001600160401b0386169190839081106125d0576125d061435e565b60009182526020909120600160039092020101546001600160401b031603612703576000858152600c60205260409020805461260e906001906146b3565b8154811061261e5761261e61435e565b90600052602060002090600302016000600c01600087815260200190815260200160002082815481106126535761265361435e565b600091825260209091208254600390920201908155600180830154908201805467ffffffffffffffff19166001600160401b039092169190911790556002808201906126a1908401826146c6565b5050506000858152600c602052604090208054806126c1576126c16142eb565b60008281526020812060036000199093019283020181815560018101805467ffffffffffffffff19169055906126fa6002830182613857565b50509055600191505b60010161258e565b50806127485760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b604080518581526001600160401b038516602082015260808183018190526000908201526001606082015290516000805160206148198339815191529181900360a00190a150505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166127dd57604051630ef4733760e31b815260040160405180910390fd5b60005b81811015610add576128178383838181106127fd576127fd61435e565b90506020020160208101906128129190613b5f565b613322565b6001016127e0565b6000610d9e816132de565b6128326132f4565b6001600160a01b0316336001600160a01b031614612865576040516365f4906560e01b8152336004820152602401610556565b610a4e816133f4565b6060610d9e600561366d565b60606000828410604051806040016040528060078152602001664241445f41524760c81b815250906128bf5760405162461bcd60e51b815260040161055691906142d8565b5060006128cc85856146b3565b6001600160401b038111156128e3576128e3613d0c565b60405190808252806020026020018201604052801561291c57816020015b6129096138b2565b8152602001906001900390816129015790505b50905060005b61292c60006132de565b6129368288614317565b10801561294b5750846129498288614317565b105b15612a5b57600061296761295f8389614317565b6000906132e8565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015612a2057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a02575b505050505081525050815250838381518110612a3e57612a3e61435e565b60200260200101819052505080612a5490614374565b9050612922565b5080612a6760006132de565b90969410159450505050565b600061161e600d83613295565b336000818152600760205260409020600201546001600160a01b0316612adc57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b612ae76000876132ba565b612b225760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b600086815260026020526040902084815560018101805467ffffffffffffffff19166001600160401b0386161790558215612b8a576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b836001600160401b0316600103612bb2576000878152600360205260408120612bb291613857565b60408051888152602081018790526001600160401b03861681830152841515606082015290517fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b9181900360800190a150505050505050565b81612c176000826132ba565b612c525760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b03808316600090815260076020526040902060020154839116612cb257604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b600084815260026020526040812090805b6002830154811015612dcc57856001600160a01b0316836002018281548110612cee57612cee61435e565b6000918252602090912001546001600160a01b031603612dc457600283018054612d1a906001906146b3565b81548110612d2a57612d2a61435e565b6000918252602090912001546002840180546001600160a01b039092169183908110612d5857612d5861435e565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082600201805480612d9957612d996142eb565b600082815260209020810160001990810180546001600160a01b031916905501905560019150612dcc565b600101612cc3565b5080612e0e57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b604080518781526001600160a01b03871660208201526000918101919091527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f90606001611601565b33612e63600882613295565b612e9d5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038481166000908152600760205260409020600201541615612efc57604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b60006040518060800160405280846005811115612f1b57612f1b613f35565b8152602081018690526001600160a01b0387166040820152336060909101529050612f4760058661367a565b506001600160a01b03851660009081526007602052604090208151815483929190829060ff19166001836005811115612f8257612f82613f35565b021790555060208201516001820190612f9b9082614423565b506040828101516002830180546001600160a01b03199081166001600160a01b039384161790915560609094015160039093018054909416928116929092179092559051908616907fd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e561906130129087908790614792565b60405180910390a25050505050565b600061161e600a836132ba565b336000818152600760205260409020600201546001600160a01b031661308a57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b60005b8281101561328f57368484838181106130a8576130a861435e565b60a0029190910191506130bf9050600082356132ba565b613137577f75460fe319331413a18a82d99b07735cec53fa0c4061ada38c2141e331082afa813560408301356130fb60808501606086016147b4565b60408051808201825260098152681393d517d193d5539160ba1b6020820152905161312994939291906147cf565b60405180910390a150613287565b80356000908152600260205260409081902090820135815561315f60808301606084016147b4565b60018201805467ffffffffffffffff19166001600160401b039290921691909117905561319260a08301608084016147fd565b156131ca576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b6131da60808301606084016147b4565b6001600160401b0316600103613203578135600090815260036020526040812061320391613857565b7fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b8235604084013561323b60808601606087016147b4565b61324b60a08701608088016147fd565b60405161327c949392919093845260208401929092526001600160401b031660408301521515606082015260800190565b60405180910390a150505b60010161308d565b50505050565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b600081815260018301602052604081205415156132b3565b60006132b3838361368f565b600061161e825490565b60006132b38383613782565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b6001600160a01b0381166133655760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b613370600882613295565b156133b157604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b6133bc60088261367a565b506040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b6001600160a01b0381166134375760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b613442600d8261367a565b61348257604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b6040516001600160a01b038216907f7afd798379ae2d2e5035438544cea2b60eb1dde6a8128e6d447fd2a25f8825a290600090a250565b60008260058111156134cd576134cd613f35565b1480613521575060018260058111156134e8576134e8613f35565b1480156135215750600381600581111561350457613504613f35565b14806135215750600481600581111561351f5761351f613f35565b145b806135745750600282600581111561353b5761353b613f35565b1480156135745750600381600581111561355757613557613f35565b14806135745750600481600581111561357257613572613f35565b145b806135c75750600482600581111561358e5761358e613f35565b1480156135c7575060038160058111156135aa576135aa613f35565b14806135c7575060058160058111156135c5576135c5613f35565b145b806135ff575060038260058111156135e1576135e1613f35565b1480156135ff575060058160058111156135fd576135fd613f35565b145b15613608575050565b60408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b815261055691906004016142d8565b60006132b383836137ac565b60006132b3836001600160a01b03841661368f565b606060006132b3836137fb565b60006132b3836001600160a01b0384166137ac565b600081815260018301602052604081205480156137785760006136b36001836146b3565b85549091506000906136c7906001906146b3565b905080821461372c5760008660000182815481106136e7576136e761435e565b906000526020600020015490508087600001848154811061370a5761370a61435e565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061373d5761373d6142eb565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061161e565b600091505061161e565b60008260000182815481106137995761379961435e565b9060005260206000200154905092915050565b60008181526001830160205260408120546137f35750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561161e565b50600061161e565b60608160000180548060200260200160405190810160405280929190818152602001828054801561384b57602002820191906000526020600020905b815481526020019060010190808311613837575b50505050509050919050565b5080546138639061432a565b6000825580601f10613873575050565b601f016020900490600052602060002090810190610a4e9190613961565b5080546000825560030290600052602060002090810190610a4e9190613976565b6040805180820190915260008152602081016138f76040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b905290565b828054828255906000526020600020908101928215613951579160200282015b8281111561395157825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061391c565b5061395d929150613961565b5090565b5b8082111561395d5760008155600101613962565b8082111561395d57600080825560018201805467ffffffffffffffff191690556139a36002830182613857565b50600301613976565b6000602082840312156139be57600080fd5b5035919050565b60005b838110156139e05781810151838201526020016139c8565b50506000910152565b60008151808452613a018160208601602086016139c5565b601f01601f19169290920160200192915050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015613a9157888303603f19018552815180518452878101516001600160401b0316888501528601516060878501819052613a7d818601836139e9565b968901969450505090860190600101613a3e565b509098975050505050505050565b600060a08301825184526020808401516001600160401b0380821660208801528060408701511660408801528060608701511660608801525050608084015160a0608087015282815180855260c088019150602083019450600092505b80831015613b255784516001600160a01b03168252938301936001929092019190830190613afc565b509695505050505050565b6020815260006132b36020830184613a9f565b80356001600160a01b0381168114613b5a57600080fd5b919050565b600060208284031215613b7157600080fd5b6132b382613b43565b60008060208385031215613b8d57600080fd5b82356001600160401b0380821115613ba457600080fd5b818501915085601f830112613bb857600080fd5b813581811115613bc757600080fd5b8660208260051b8501011115613bdc57600080fd5b60209290920196919550909350505050565b805182526000602082015160406020850152613c0d6040850182613a9f565b949350505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015613c6257601f19868403018952613c50838351613bee565b98840198925090830190600101613c34565b5090979650505050505050565b6020815260006132b36020830184613c15565b606081526000613c956060830186613a9f565b8460208401528281036040840152613cad81856139e9565b9695505050505050565b803560068110613b5a57600080fd5b60008060408385031215613cd957600080fd5b613ce283613b43565b9150613cf060208401613cb7565b90509250929050565b6020815260006132b36020830184613bee565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613d4a57613d4a613d0c565b604052919050565b600082601f830112613d6357600080fd5b81356001600160401b03811115613d7c57613d7c613d0c565b613d8f601f8201601f1916602001613d22565b818152846020838601011115613da457600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215613dd757600080fd5b843593506020808601356001600160401b0380821115613df657600080fd5b818801915088601f830112613e0a57600080fd5b813581811115613e1c57613e1c613d0c565b8060051b613e2b858201613d22565b918252838101850191858101908c841115613e4557600080fd5b948601945b83861015613e6a57613e5b86613b43565b82529486019490860190613e4a565b9850505050604088013594506060880135925080831115613e8a57600080fd5b5050613e9887828801613d52565b91505092959194509250565b60008060408385031215613eb757600080fd5b613ec083613b43565b915060208301356001600160401b03811115613edb57600080fd5b613ee785828601613d52565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015613f2957835183529284019291840191600101613f0d565b50909695505050505050565b634e487b7160e01b600052602160045260246000fd5b60068110613f6957634e487b7160e01b600052602160045260246000fd5b9052565b613f78828251613f4b565b6000602082015160806020850152613f9360808501826139e9565b6040848101516001600160a01b03908116918701919091526060948501511693909401929092525090919050565b6020815260006132b36020830184613f6d565b60008060408385031215613fe757600080fd5b82359150613cf060208401613b43565b80356001600160401b0381168114613b5a57600080fd5b6000806000806060858703121561402457600080fd5b8435935061403460208601613ff7565b925060408501356001600160401b038082111561405057600080fd5b818701915087601f83011261406457600080fd5b81358181111561407357600080fd5b88602082850101111561408557600080fd5b95989497505060200194505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156140eb57603f198886030184526140d9858351613f6d565b945092850192908501906001016140bd565b5092979650505050505050565b6000806040838503121561410b57600080fd5b82359150613cf060208401613ff7565b60008151808452602080850194506020840160005b838110156141555781516001600160a01b031687529582019590820190600101614130565b509495945050505050565b6020815260006132b3602083018461411b565b6000806040838503121561418657600080fd5b50508035926020909101359150565b6040815260006141a86040830185613c15565b905082151560208301529392505050565b80358015158114613b5a57600080fd5b600080600080600060a086880312156141e157600080fd5b8535945060208601359350604086013592506141ff60608701613ff7565b915061420d608087016141b9565b90509295509295909350565b60008060006060848603121561422e57600080fd5b61423784613b43565b925060208401356001600160401b0381111561425257600080fd5b61425e86828701613d52565b92505061426d60408501613cb7565b90509250925092565b6000806020838503121561428957600080fd5b82356001600160401b03808211156142a057600080fd5b818501915085601f8301126142b457600080fd5b8135818111156142c357600080fd5b86602060a083028501011115613bdc57600080fd5b6020815260006132b360208301846139e9565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561161e5761161e614301565b600181811c9082168061433e57607f821691505b602082108103610f0e57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60006001820161438657614386614301565b5060010190565b600063ffffffff8083168181036143a6576143a6614301565b6001019392505050565b6020810161161e8284613f4b565b601f821115610add576000816000526020600020601f850160051c810160208610156143e75750805b601f850160051c820191505b81811015614406578281556001016143f3565b505050505050565b600019600383901b1c191660019190911b1790565b81516001600160401b0381111561443c5761443c613d0c565b6144508161444a845461432a565b846143be565b602080601f83116001811461447f576000841561446d5750858301515b614477858261440e565b865550614406565b600085815260208120601f198616915b828110156144ae5788860151825594840194600190910190840161448f565b50858210156144cc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8481526080602082015260006144f5608083018661411b565b846040840152828103606084015261450d81856139e9565b979650505050505050565b6000825161452a8184602087016139c5565b9190910192915050565b60008083546145428161432a565b6001828116801561455a576001811461456f5761459e565b60ff198416875282151583028701945061459e565b8760005260208060002060005b858110156145955781548a82015290840190820161457c565b50505082870194505b50929695505050505050565b6001600160401b038311156145c1576145c1613d0c565b6145d5836145cf835461432a565b836143be565b6000601f84116001811461460357600085156145f15750838201355b6145fb868261440e565b84555061203d565b600083815260209020601f19861690835b828110156146345786850135825560209485019460019092019101614614565b50868210156146515760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8581526001600160401b038516602082015260806040820152826080820152828460a0830137600081840160a0908101919091529115156060820152601f909201601f1916909101019392505050565b8181038181111561161e5761161e614301565b8181036146d1575050565b6146db825461432a565b6001600160401b038111156146f2576146f2613d0c565b6147008161444a845461432a565b6000601f82116001811461472e576000831561471c5750848201545b614726848261440e565b85555061203d565b600085815260209020601f19841690600086815260209020845b838110156147685782860154825560019586019590910190602001614748565b50858310156144cc5793015460001960f8600387901b161c19169092555050600190811b01905550565b6040815260006147a560408301856139e9565b90506132b36020830184613f4b565b6000602082840312156147c657600080fd5b6132b382613ff7565b8481528360208201526001600160401b0383166040820152608060608201526000613cad60808301846139e9565b60006020828403121561480f57600080fd5b6132b3826141b956fec01483261a841a868b99cb8802faed4ea44a1a816651c4f7ee061a96a205fe98", +} + +// MockRiverRegistryABI is the input ABI used to generate the binding from. +// Deprecated: Use MockRiverRegistryMetaData.ABI instead. +var MockRiverRegistryABI = MockRiverRegistryMetaData.ABI + +// MockRiverRegistryBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use MockRiverRegistryMetaData.Bin instead. +var MockRiverRegistryBin = MockRiverRegistryMetaData.Bin + +// DeployMockRiverRegistry deploys a new Ethereum contract, binding an instance of MockRiverRegistry to it. +func DeployMockRiverRegistry(auth *bind.TransactOpts, backend bind.ContractBackend, approvedOperators []common.Address) (common.Address, *types.Transaction, *MockRiverRegistry, error) { + parsed, err := MockRiverRegistryMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(MockRiverRegistryBin), backend, approvedOperators) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &MockRiverRegistry{MockRiverRegistryCaller: MockRiverRegistryCaller{contract: contract}, MockRiverRegistryTransactor: MockRiverRegistryTransactor{contract: contract}, MockRiverRegistryFilterer: MockRiverRegistryFilterer{contract: contract}}, nil +} + +// MockRiverRegistry is an auto generated Go binding around an Ethereum contract. +type MockRiverRegistry struct { + MockRiverRegistryCaller // Read-only binding to the contract + MockRiverRegistryTransactor // Write-only binding to the contract + MockRiverRegistryFilterer // Log filterer for contract events +} + +// MockRiverRegistryCaller is an auto generated read-only Go binding around an Ethereum contract. +type MockRiverRegistryCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockRiverRegistryTransactor is an auto generated write-only Go binding around an Ethereum contract. +type MockRiverRegistryTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockRiverRegistryFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type MockRiverRegistryFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockRiverRegistrySession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type MockRiverRegistrySession struct { + Contract *MockRiverRegistry // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MockRiverRegistryCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type MockRiverRegistryCallerSession struct { + Contract *MockRiverRegistryCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// MockRiverRegistryTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type MockRiverRegistryTransactorSession struct { + Contract *MockRiverRegistryTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MockRiverRegistryRaw is an auto generated low-level Go binding around an Ethereum contract. +type MockRiverRegistryRaw struct { + Contract *MockRiverRegistry // Generic contract binding to access the raw methods on +} + +// MockRiverRegistryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type MockRiverRegistryCallerRaw struct { + Contract *MockRiverRegistryCaller // Generic read-only contract binding to access the raw methods on +} + +// MockRiverRegistryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type MockRiverRegistryTransactorRaw struct { + Contract *MockRiverRegistryTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewMockRiverRegistry creates a new instance of MockRiverRegistry, bound to a specific deployed contract. +func NewMockRiverRegistry(address common.Address, backend bind.ContractBackend) (*MockRiverRegistry, error) { + contract, err := bindMockRiverRegistry(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &MockRiverRegistry{MockRiverRegistryCaller: MockRiverRegistryCaller{contract: contract}, MockRiverRegistryTransactor: MockRiverRegistryTransactor{contract: contract}, MockRiverRegistryFilterer: MockRiverRegistryFilterer{contract: contract}}, nil +} + +// NewMockRiverRegistryCaller creates a new read-only instance of MockRiverRegistry, bound to a specific deployed contract. +func NewMockRiverRegistryCaller(address common.Address, caller bind.ContractCaller) (*MockRiverRegistryCaller, error) { + contract, err := bindMockRiverRegistry(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &MockRiverRegistryCaller{contract: contract}, nil +} + +// NewMockRiverRegistryTransactor creates a new write-only instance of MockRiverRegistry, bound to a specific deployed contract. +func NewMockRiverRegistryTransactor(address common.Address, transactor bind.ContractTransactor) (*MockRiverRegistryTransactor, error) { + contract, err := bindMockRiverRegistry(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &MockRiverRegistryTransactor{contract: contract}, nil +} + +// NewMockRiverRegistryFilterer creates a new log filterer instance of MockRiverRegistry, bound to a specific deployed contract. +func NewMockRiverRegistryFilterer(address common.Address, filterer bind.ContractFilterer) (*MockRiverRegistryFilterer, error) { + contract, err := bindMockRiverRegistry(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &MockRiverRegistryFilterer{contract: contract}, nil +} + +// bindMockRiverRegistry binds a generic wrapper to an already deployed contract. +func bindMockRiverRegistry(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := MockRiverRegistryMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_MockRiverRegistry *MockRiverRegistryRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MockRiverRegistry.Contract.MockRiverRegistryCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_MockRiverRegistry *MockRiverRegistryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.MockRiverRegistryTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_MockRiverRegistry *MockRiverRegistryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.MockRiverRegistryTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_MockRiverRegistry *MockRiverRegistryCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MockRiverRegistry.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_MockRiverRegistry *MockRiverRegistryTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_MockRiverRegistry *MockRiverRegistryTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.contract.Transact(opts, method, params...) +} + +// ConfigurationExists is a free data retrieval call binding the contract method 0xfc207c01. +// +// Solidity: function configurationExists(bytes32 key) view returns(bool) +func (_MockRiverRegistry *MockRiverRegistryCaller) ConfigurationExists(opts *bind.CallOpts, key [32]byte) (bool, error) { + var out []interface{} + err := _MockRiverRegistry.contract.Call(opts, &out, "configurationExists", key) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// ConfigurationExists is a free data retrieval call binding the contract method 0xfc207c01. +// +// Solidity: function configurationExists(bytes32 key) view returns(bool) +func (_MockRiverRegistry *MockRiverRegistrySession) ConfigurationExists(key [32]byte) (bool, error) { + return _MockRiverRegistry.Contract.ConfigurationExists(&_MockRiverRegistry.CallOpts, key) +} + +// ConfigurationExists is a free data retrieval call binding the contract method 0xfc207c01. +// +// Solidity: function configurationExists(bytes32 key) view returns(bool) +func (_MockRiverRegistry *MockRiverRegistryCallerSession) ConfigurationExists(key [32]byte) (bool, error) { + return _MockRiverRegistry.Contract.ConfigurationExists(&_MockRiverRegistry.CallOpts, key) +} + +// GetAllConfiguration is a free data retrieval call binding the contract method 0x081814db. +// +// Solidity: function getAllConfiguration() view returns((bytes32,uint64,bytes)[]) +func (_MockRiverRegistry *MockRiverRegistryCaller) GetAllConfiguration(opts *bind.CallOpts) ([]Setting, error) { + var out []interface{} + err := _MockRiverRegistry.contract.Call(opts, &out, "getAllConfiguration") + + if err != nil { + return *new([]Setting), err + } + + out0 := *abi.ConvertType(out[0], new([]Setting)).(*[]Setting) + + return out0, err + +} + +// GetAllConfiguration is a free data retrieval call binding the contract method 0x081814db. +// +// Solidity: function getAllConfiguration() view returns((bytes32,uint64,bytes)[]) +func (_MockRiverRegistry *MockRiverRegistrySession) GetAllConfiguration() ([]Setting, error) { + return _MockRiverRegistry.Contract.GetAllConfiguration(&_MockRiverRegistry.CallOpts) +} + +// GetAllConfiguration is a free data retrieval call binding the contract method 0x081814db. +// +// Solidity: function getAllConfiguration() view returns((bytes32,uint64,bytes)[]) +func (_MockRiverRegistry *MockRiverRegistryCallerSession) GetAllConfiguration() ([]Setting, error) { + return _MockRiverRegistry.Contract.GetAllConfiguration(&_MockRiverRegistry.CallOpts) +} + +// GetAllNodeAddresses is a free data retrieval call binding the contract method 0xc8fe3a01. +// +// Solidity: function getAllNodeAddresses() view returns(address[]) +func (_MockRiverRegistry *MockRiverRegistryCaller) GetAllNodeAddresses(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _MockRiverRegistry.contract.Call(opts, &out, "getAllNodeAddresses") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetAllNodeAddresses is a free data retrieval call binding the contract method 0xc8fe3a01. +// +// Solidity: function getAllNodeAddresses() view returns(address[]) +func (_MockRiverRegistry *MockRiverRegistrySession) GetAllNodeAddresses() ([]common.Address, error) { + return _MockRiverRegistry.Contract.GetAllNodeAddresses(&_MockRiverRegistry.CallOpts) +} + +// GetAllNodeAddresses is a free data retrieval call binding the contract method 0xc8fe3a01. +// +// Solidity: function getAllNodeAddresses() view returns(address[]) +func (_MockRiverRegistry *MockRiverRegistryCallerSession) GetAllNodeAddresses() ([]common.Address, error) { + return _MockRiverRegistry.Contract.GetAllNodeAddresses(&_MockRiverRegistry.CallOpts) +} + +// GetAllNodes is a free data retrieval call binding the contract method 0xa1174e7d. +// +// Solidity: function getAllNodes() view returns((uint8,string,address,address)[]) +func (_MockRiverRegistry *MockRiverRegistryCaller) GetAllNodes(opts *bind.CallOpts) ([]Node, error) { + var out []interface{} + err := _MockRiverRegistry.contract.Call(opts, &out, "getAllNodes") + + if err != nil { + return *new([]Node), err + } + + out0 := *abi.ConvertType(out[0], new([]Node)).(*[]Node) + + return out0, err + +} + +// GetAllNodes is a free data retrieval call binding the contract method 0xa1174e7d. +// +// Solidity: function getAllNodes() view returns((uint8,string,address,address)[]) +func (_MockRiverRegistry *MockRiverRegistrySession) GetAllNodes() ([]Node, error) { + return _MockRiverRegistry.Contract.GetAllNodes(&_MockRiverRegistry.CallOpts) +} + +// GetAllNodes is a free data retrieval call binding the contract method 0xa1174e7d. +// +// Solidity: function getAllNodes() view returns((uint8,string,address,address)[]) +func (_MockRiverRegistry *MockRiverRegistryCallerSession) GetAllNodes() ([]Node, error) { + return _MockRiverRegistry.Contract.GetAllNodes(&_MockRiverRegistry.CallOpts) +} + +// GetAllStreamIds is a free data retrieval call binding the contract method 0x86789fc6. +// +// Solidity: function getAllStreamIds() view returns(bytes32[]) +func (_MockRiverRegistry *MockRiverRegistryCaller) GetAllStreamIds(opts *bind.CallOpts) ([][32]byte, error) { + var out []interface{} + err := _MockRiverRegistry.contract.Call(opts, &out, "getAllStreamIds") + + if err != nil { + return *new([][32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([][32]byte)).(*[][32]byte) + + return out0, err + +} + +// GetAllStreamIds is a free data retrieval call binding the contract method 0x86789fc6. +// +// Solidity: function getAllStreamIds() view returns(bytes32[]) +func (_MockRiverRegistry *MockRiverRegistrySession) GetAllStreamIds() ([][32]byte, error) { + return _MockRiverRegistry.Contract.GetAllStreamIds(&_MockRiverRegistry.CallOpts) +} + +// GetAllStreamIds is a free data retrieval call binding the contract method 0x86789fc6. +// +// Solidity: function getAllStreamIds() view returns(bytes32[]) +func (_MockRiverRegistry *MockRiverRegistryCallerSession) GetAllStreamIds() ([][32]byte, error) { + return _MockRiverRegistry.Contract.GetAllStreamIds(&_MockRiverRegistry.CallOpts) +} + +// GetAllStreams is a free data retrieval call binding the contract method 0x3bd84c0c. +// +// Solidity: function getAllStreams() view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))[]) +func (_MockRiverRegistry *MockRiverRegistryCaller) GetAllStreams(opts *bind.CallOpts) ([]StreamWithId, error) { + var out []interface{} + err := _MockRiverRegistry.contract.Call(opts, &out, "getAllStreams") + + if err != nil { + return *new([]StreamWithId), err + } + + out0 := *abi.ConvertType(out[0], new([]StreamWithId)).(*[]StreamWithId) + + return out0, err + +} + +// GetAllStreams is a free data retrieval call binding the contract method 0x3bd84c0c. +// +// Solidity: function getAllStreams() view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))[]) +func (_MockRiverRegistry *MockRiverRegistrySession) GetAllStreams() ([]StreamWithId, error) { + return _MockRiverRegistry.Contract.GetAllStreams(&_MockRiverRegistry.CallOpts) +} + +// GetAllStreams is a free data retrieval call binding the contract method 0x3bd84c0c. +// +// Solidity: function getAllStreams() view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))[]) +func (_MockRiverRegistry *MockRiverRegistryCallerSession) GetAllStreams() ([]StreamWithId, error) { + return _MockRiverRegistry.Contract.GetAllStreams(&_MockRiverRegistry.CallOpts) +} + +// GetConfiguration is a free data retrieval call binding the contract method 0x9283ae3a. +// +// Solidity: function getConfiguration(bytes32 key) view returns((bytes32,uint64,bytes)[]) +func (_MockRiverRegistry *MockRiverRegistryCaller) GetConfiguration(opts *bind.CallOpts, key [32]byte) ([]Setting, error) { + var out []interface{} + err := _MockRiverRegistry.contract.Call(opts, &out, "getConfiguration", key) + + if err != nil { + return *new([]Setting), err + } + + out0 := *abi.ConvertType(out[0], new([]Setting)).(*[]Setting) + + return out0, err + +} + +// GetConfiguration is a free data retrieval call binding the contract method 0x9283ae3a. +// +// Solidity: function getConfiguration(bytes32 key) view returns((bytes32,uint64,bytes)[]) +func (_MockRiverRegistry *MockRiverRegistrySession) GetConfiguration(key [32]byte) ([]Setting, error) { + return _MockRiverRegistry.Contract.GetConfiguration(&_MockRiverRegistry.CallOpts, key) +} + +// GetConfiguration is a free data retrieval call binding the contract method 0x9283ae3a. +// +// Solidity: function getConfiguration(bytes32 key) view returns((bytes32,uint64,bytes)[]) +func (_MockRiverRegistry *MockRiverRegistryCallerSession) GetConfiguration(key [32]byte) ([]Setting, error) { + return _MockRiverRegistry.Contract.GetConfiguration(&_MockRiverRegistry.CallOpts, key) +} + +// GetNode is a free data retrieval call binding the contract method 0x9d209048. +// +// Solidity: function getNode(address nodeAddress) view returns((uint8,string,address,address)) +func (_MockRiverRegistry *MockRiverRegistryCaller) GetNode(opts *bind.CallOpts, nodeAddress common.Address) (Node, error) { + var out []interface{} + err := _MockRiverRegistry.contract.Call(opts, &out, "getNode", nodeAddress) + + if err != nil { + return *new(Node), err + } + + out0 := *abi.ConvertType(out[0], new(Node)).(*Node) + + return out0, err + +} + +// GetNode is a free data retrieval call binding the contract method 0x9d209048. +// +// Solidity: function getNode(address nodeAddress) view returns((uint8,string,address,address)) +func (_MockRiverRegistry *MockRiverRegistrySession) GetNode(nodeAddress common.Address) (Node, error) { + return _MockRiverRegistry.Contract.GetNode(&_MockRiverRegistry.CallOpts, nodeAddress) +} + +// GetNode is a free data retrieval call binding the contract method 0x9d209048. +// +// Solidity: function getNode(address nodeAddress) view returns((uint8,string,address,address)) +func (_MockRiverRegistry *MockRiverRegistryCallerSession) GetNode(nodeAddress common.Address) (Node, error) { + return _MockRiverRegistry.Contract.GetNode(&_MockRiverRegistry.CallOpts, nodeAddress) +} + +// GetNodeCount is a free data retrieval call binding the contract method 0x39bf397e. +// +// Solidity: function getNodeCount() view returns(uint256) +func (_MockRiverRegistry *MockRiverRegistryCaller) GetNodeCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _MockRiverRegistry.contract.Call(opts, &out, "getNodeCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetNodeCount is a free data retrieval call binding the contract method 0x39bf397e. +// +// Solidity: function getNodeCount() view returns(uint256) +func (_MockRiverRegistry *MockRiverRegistrySession) GetNodeCount() (*big.Int, error) { + return _MockRiverRegistry.Contract.GetNodeCount(&_MockRiverRegistry.CallOpts) +} + +// GetNodeCount is a free data retrieval call binding the contract method 0x39bf397e. +// +// Solidity: function getNodeCount() view returns(uint256) +func (_MockRiverRegistry *MockRiverRegistryCallerSession) GetNodeCount() (*big.Int, error) { + return _MockRiverRegistry.Contract.GetNodeCount(&_MockRiverRegistry.CallOpts) +} + +// GetPaginatedStreams is a free data retrieval call binding the contract method 0xca78c41a. +// +// Solidity: function getPaginatedStreams(uint256 start, uint256 stop) view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))[], bool) +func (_MockRiverRegistry *MockRiverRegistryCaller) GetPaginatedStreams(opts *bind.CallOpts, start *big.Int, stop *big.Int) ([]StreamWithId, bool, error) { + var out []interface{} + err := _MockRiverRegistry.contract.Call(opts, &out, "getPaginatedStreams", start, stop) + + if err != nil { + return *new([]StreamWithId), *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new([]StreamWithId)).(*[]StreamWithId) + out1 := *abi.ConvertType(out[1], new(bool)).(*bool) + + return out0, out1, err + +} + +// GetPaginatedStreams is a free data retrieval call binding the contract method 0xca78c41a. +// +// Solidity: function getPaginatedStreams(uint256 start, uint256 stop) view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))[], bool) +func (_MockRiverRegistry *MockRiverRegistrySession) GetPaginatedStreams(start *big.Int, stop *big.Int) ([]StreamWithId, bool, error) { + return _MockRiverRegistry.Contract.GetPaginatedStreams(&_MockRiverRegistry.CallOpts, start, stop) +} + +// GetPaginatedStreams is a free data retrieval call binding the contract method 0xca78c41a. +// +// Solidity: function getPaginatedStreams(uint256 start, uint256 stop) view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))[], bool) +func (_MockRiverRegistry *MockRiverRegistryCallerSession) GetPaginatedStreams(start *big.Int, stop *big.Int) ([]StreamWithId, bool, error) { + return _MockRiverRegistry.Contract.GetPaginatedStreams(&_MockRiverRegistry.CallOpts, start, stop) +} + +// GetStream is a free data retrieval call binding the contract method 0x1290abe8. +// +// Solidity: function getStream(bytes32 streamId) view returns((bytes32,uint64,uint64,uint64,address[])) +func (_MockRiverRegistry *MockRiverRegistryCaller) GetStream(opts *bind.CallOpts, streamId [32]byte) (Stream, error) { + var out []interface{} + err := _MockRiverRegistry.contract.Call(opts, &out, "getStream", streamId) + + if err != nil { + return *new(Stream), err + } + + out0 := *abi.ConvertType(out[0], new(Stream)).(*Stream) + + return out0, err + +} + +// GetStream is a free data retrieval call binding the contract method 0x1290abe8. +// +// Solidity: function getStream(bytes32 streamId) view returns((bytes32,uint64,uint64,uint64,address[])) +func (_MockRiverRegistry *MockRiverRegistrySession) GetStream(streamId [32]byte) (Stream, error) { + return _MockRiverRegistry.Contract.GetStream(&_MockRiverRegistry.CallOpts, streamId) +} + +// GetStream is a free data retrieval call binding the contract method 0x1290abe8. +// +// Solidity: function getStream(bytes32 streamId) view returns((bytes32,uint64,uint64,uint64,address[])) +func (_MockRiverRegistry *MockRiverRegistryCallerSession) GetStream(streamId [32]byte) (Stream, error) { + return _MockRiverRegistry.Contract.GetStream(&_MockRiverRegistry.CallOpts, streamId) +} + +// GetStreamByIndex is a free data retrieval call binding the contract method 0x68b454df. +// +// Solidity: function getStreamByIndex(uint256 i) view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))) +func (_MockRiverRegistry *MockRiverRegistryCaller) GetStreamByIndex(opts *bind.CallOpts, i *big.Int) (StreamWithId, error) { + var out []interface{} + err := _MockRiverRegistry.contract.Call(opts, &out, "getStreamByIndex", i) + + if err != nil { + return *new(StreamWithId), err + } + + out0 := *abi.ConvertType(out[0], new(StreamWithId)).(*StreamWithId) + + return out0, err + +} + +// GetStreamByIndex is a free data retrieval call binding the contract method 0x68b454df. +// +// Solidity: function getStreamByIndex(uint256 i) view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))) +func (_MockRiverRegistry *MockRiverRegistrySession) GetStreamByIndex(i *big.Int) (StreamWithId, error) { + return _MockRiverRegistry.Contract.GetStreamByIndex(&_MockRiverRegistry.CallOpts, i) +} + +// GetStreamByIndex is a free data retrieval call binding the contract method 0x68b454df. +// +// Solidity: function getStreamByIndex(uint256 i) view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))) +func (_MockRiverRegistry *MockRiverRegistryCallerSession) GetStreamByIndex(i *big.Int) (StreamWithId, error) { + return _MockRiverRegistry.Contract.GetStreamByIndex(&_MockRiverRegistry.CallOpts, i) +} + +// GetStreamCount is a free data retrieval call binding the contract method 0xc0f22084. +// +// Solidity: function getStreamCount() view returns(uint256) +func (_MockRiverRegistry *MockRiverRegistryCaller) GetStreamCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _MockRiverRegistry.contract.Call(opts, &out, "getStreamCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetStreamCount is a free data retrieval call binding the contract method 0xc0f22084. +// +// Solidity: function getStreamCount() view returns(uint256) +func (_MockRiverRegistry *MockRiverRegistrySession) GetStreamCount() (*big.Int, error) { + return _MockRiverRegistry.Contract.GetStreamCount(&_MockRiverRegistry.CallOpts) +} + +// GetStreamCount is a free data retrieval call binding the contract method 0xc0f22084. +// +// Solidity: function getStreamCount() view returns(uint256) +func (_MockRiverRegistry *MockRiverRegistryCallerSession) GetStreamCount() (*big.Int, error) { + return _MockRiverRegistry.Contract.GetStreamCount(&_MockRiverRegistry.CallOpts) +} + +// GetStreamWithGenesis is a free data retrieval call binding the contract method 0x3c2544d1. +// +// Solidity: function getStreamWithGenesis(bytes32 streamId) view returns((bytes32,uint64,uint64,uint64,address[]), bytes32, bytes) +func (_MockRiverRegistry *MockRiverRegistryCaller) GetStreamWithGenesis(opts *bind.CallOpts, streamId [32]byte) (Stream, [32]byte, []byte, error) { + var out []interface{} + err := _MockRiverRegistry.contract.Call(opts, &out, "getStreamWithGenesis", streamId) + + if err != nil { + return *new(Stream), *new([32]byte), *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new(Stream)).(*Stream) + out1 := *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + out2 := *abi.ConvertType(out[2], new([]byte)).(*[]byte) + + return out0, out1, out2, err + +} + +// GetStreamWithGenesis is a free data retrieval call binding the contract method 0x3c2544d1. +// +// Solidity: function getStreamWithGenesis(bytes32 streamId) view returns((bytes32,uint64,uint64,uint64,address[]), bytes32, bytes) +func (_MockRiverRegistry *MockRiverRegistrySession) GetStreamWithGenesis(streamId [32]byte) (Stream, [32]byte, []byte, error) { + return _MockRiverRegistry.Contract.GetStreamWithGenesis(&_MockRiverRegistry.CallOpts, streamId) +} + +// GetStreamWithGenesis is a free data retrieval call binding the contract method 0x3c2544d1. +// +// Solidity: function getStreamWithGenesis(bytes32 streamId) view returns((bytes32,uint64,uint64,uint64,address[]), bytes32, bytes) +func (_MockRiverRegistry *MockRiverRegistryCallerSession) GetStreamWithGenesis(streamId [32]byte) (Stream, [32]byte, []byte, error) { + return _MockRiverRegistry.Contract.GetStreamWithGenesis(&_MockRiverRegistry.CallOpts, streamId) +} + +// GetStreamsOnNode is a free data retrieval call binding the contract method 0x32705ac4. +// +// Solidity: function getStreamsOnNode(address nodeAddress) view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))[]) +func (_MockRiverRegistry *MockRiverRegistryCaller) GetStreamsOnNode(opts *bind.CallOpts, nodeAddress common.Address) ([]StreamWithId, error) { + var out []interface{} + err := _MockRiverRegistry.contract.Call(opts, &out, "getStreamsOnNode", nodeAddress) + + if err != nil { + return *new([]StreamWithId), err + } + + out0 := *abi.ConvertType(out[0], new([]StreamWithId)).(*[]StreamWithId) + + return out0, err + +} + +// GetStreamsOnNode is a free data retrieval call binding the contract method 0x32705ac4. +// +// Solidity: function getStreamsOnNode(address nodeAddress) view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))[]) +func (_MockRiverRegistry *MockRiverRegistrySession) GetStreamsOnNode(nodeAddress common.Address) ([]StreamWithId, error) { + return _MockRiverRegistry.Contract.GetStreamsOnNode(&_MockRiverRegistry.CallOpts, nodeAddress) +} + +// GetStreamsOnNode is a free data retrieval call binding the contract method 0x32705ac4. +// +// Solidity: function getStreamsOnNode(address nodeAddress) view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))[]) +func (_MockRiverRegistry *MockRiverRegistryCallerSession) GetStreamsOnNode(nodeAddress common.Address) ([]StreamWithId, error) { + return _MockRiverRegistry.Contract.GetStreamsOnNode(&_MockRiverRegistry.CallOpts, nodeAddress) +} + +// IsConfigurationManager is a free data retrieval call binding the contract method 0xd4bd44a0. +// +// Solidity: function isConfigurationManager(address manager) view returns(bool) +func (_MockRiverRegistry *MockRiverRegistryCaller) IsConfigurationManager(opts *bind.CallOpts, manager common.Address) (bool, error) { + var out []interface{} + err := _MockRiverRegistry.contract.Call(opts, &out, "isConfigurationManager", manager) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsConfigurationManager is a free data retrieval call binding the contract method 0xd4bd44a0. +// +// Solidity: function isConfigurationManager(address manager) view returns(bool) +func (_MockRiverRegistry *MockRiverRegistrySession) IsConfigurationManager(manager common.Address) (bool, error) { + return _MockRiverRegistry.Contract.IsConfigurationManager(&_MockRiverRegistry.CallOpts, manager) +} + +// IsConfigurationManager is a free data retrieval call binding the contract method 0xd4bd44a0. +// +// Solidity: function isConfigurationManager(address manager) view returns(bool) +func (_MockRiverRegistry *MockRiverRegistryCallerSession) IsConfigurationManager(manager common.Address) (bool, error) { + return _MockRiverRegistry.Contract.IsConfigurationManager(&_MockRiverRegistry.CallOpts, manager) +} + +// IsOperator is a free data retrieval call binding the contract method 0x6d70f7ae. +// +// Solidity: function isOperator(address operator) view returns(bool) +func (_MockRiverRegistry *MockRiverRegistryCaller) IsOperator(opts *bind.CallOpts, operator common.Address) (bool, error) { + var out []interface{} + err := _MockRiverRegistry.contract.Call(opts, &out, "isOperator", operator) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsOperator is a free data retrieval call binding the contract method 0x6d70f7ae. +// +// Solidity: function isOperator(address operator) view returns(bool) +func (_MockRiverRegistry *MockRiverRegistrySession) IsOperator(operator common.Address) (bool, error) { + return _MockRiverRegistry.Contract.IsOperator(&_MockRiverRegistry.CallOpts, operator) +} + +// IsOperator is a free data retrieval call binding the contract method 0x6d70f7ae. +// +// Solidity: function isOperator(address operator) view returns(bool) +func (_MockRiverRegistry *MockRiverRegistryCallerSession) IsOperator(operator common.Address) (bool, error) { + return _MockRiverRegistry.Contract.IsOperator(&_MockRiverRegistry.CallOpts, operator) +} + +// OperatorRegistryInit is a paid mutator transaction binding the contract method 0xba428b1a. +// +// Solidity: function __OperatorRegistry_init(address[] initialOperators) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactor) OperatorRegistryInit(opts *bind.TransactOpts, initialOperators []common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.contract.Transact(opts, "__OperatorRegistry_init", initialOperators) +} + +// OperatorRegistryInit is a paid mutator transaction binding the contract method 0xba428b1a. +// +// Solidity: function __OperatorRegistry_init(address[] initialOperators) returns() +func (_MockRiverRegistry *MockRiverRegistrySession) OperatorRegistryInit(initialOperators []common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.OperatorRegistryInit(&_MockRiverRegistry.TransactOpts, initialOperators) +} + +// OperatorRegistryInit is a paid mutator transaction binding the contract method 0xba428b1a. +// +// Solidity: function __OperatorRegistry_init(address[] initialOperators) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactorSession) OperatorRegistryInit(initialOperators []common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.OperatorRegistryInit(&_MockRiverRegistry.TransactOpts, initialOperators) +} + +// RiverConfigInit is a paid mutator transaction binding the contract method 0x31374511. +// +// Solidity: function __RiverConfig_init(address[] configManagers) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactor) RiverConfigInit(opts *bind.TransactOpts, configManagers []common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.contract.Transact(opts, "__RiverConfig_init", configManagers) +} + +// RiverConfigInit is a paid mutator transaction binding the contract method 0x31374511. +// +// Solidity: function __RiverConfig_init(address[] configManagers) returns() +func (_MockRiverRegistry *MockRiverRegistrySession) RiverConfigInit(configManagers []common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.RiverConfigInit(&_MockRiverRegistry.TransactOpts, configManagers) +} + +// RiverConfigInit is a paid mutator transaction binding the contract method 0x31374511. +// +// Solidity: function __RiverConfig_init(address[] configManagers) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactorSession) RiverConfigInit(configManagers []common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.RiverConfigInit(&_MockRiverRegistry.TransactOpts, configManagers) +} + +// AllocateStream is a paid mutator transaction binding the contract method 0x6b883c39. +// +// Solidity: function allocateStream(bytes32 streamId, address[] nodes, bytes32 genesisMiniblockHash, bytes genesisMiniblock) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactor) AllocateStream(opts *bind.TransactOpts, streamId [32]byte, nodes []common.Address, genesisMiniblockHash [32]byte, genesisMiniblock []byte) (*types.Transaction, error) { + return _MockRiverRegistry.contract.Transact(opts, "allocateStream", streamId, nodes, genesisMiniblockHash, genesisMiniblock) +} + +// AllocateStream is a paid mutator transaction binding the contract method 0x6b883c39. +// +// Solidity: function allocateStream(bytes32 streamId, address[] nodes, bytes32 genesisMiniblockHash, bytes genesisMiniblock) returns() +func (_MockRiverRegistry *MockRiverRegistrySession) AllocateStream(streamId [32]byte, nodes []common.Address, genesisMiniblockHash [32]byte, genesisMiniblock []byte) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.AllocateStream(&_MockRiverRegistry.TransactOpts, streamId, nodes, genesisMiniblockHash, genesisMiniblock) +} + +// AllocateStream is a paid mutator transaction binding the contract method 0x6b883c39. +// +// Solidity: function allocateStream(bytes32 streamId, address[] nodes, bytes32 genesisMiniblockHash, bytes genesisMiniblock) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactorSession) AllocateStream(streamId [32]byte, nodes []common.Address, genesisMiniblockHash [32]byte, genesisMiniblock []byte) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.AllocateStream(&_MockRiverRegistry.TransactOpts, streamId, nodes, genesisMiniblockHash, genesisMiniblock) +} + +// ApproveConfigurationManager is a paid mutator transaction binding the contract method 0xc179b85f. +// +// Solidity: function approveConfigurationManager(address manager) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactor) ApproveConfigurationManager(opts *bind.TransactOpts, manager common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.contract.Transact(opts, "approveConfigurationManager", manager) +} + +// ApproveConfigurationManager is a paid mutator transaction binding the contract method 0xc179b85f. +// +// Solidity: function approveConfigurationManager(address manager) returns() +func (_MockRiverRegistry *MockRiverRegistrySession) ApproveConfigurationManager(manager common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.ApproveConfigurationManager(&_MockRiverRegistry.TransactOpts, manager) +} + +// ApproveConfigurationManager is a paid mutator transaction binding the contract method 0xc179b85f. +// +// Solidity: function approveConfigurationManager(address manager) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactorSession) ApproveConfigurationManager(manager common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.ApproveConfigurationManager(&_MockRiverRegistry.TransactOpts, manager) +} + +// ApproveOperator is a paid mutator transaction binding the contract method 0x242cae9f. +// +// Solidity: function approveOperator(address operator) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactor) ApproveOperator(opts *bind.TransactOpts, operator common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.contract.Transact(opts, "approveOperator", operator) +} + +// ApproveOperator is a paid mutator transaction binding the contract method 0x242cae9f. +// +// Solidity: function approveOperator(address operator) returns() +func (_MockRiverRegistry *MockRiverRegistrySession) ApproveOperator(operator common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.ApproveOperator(&_MockRiverRegistry.TransactOpts, operator) +} + +// ApproveOperator is a paid mutator transaction binding the contract method 0x242cae9f. +// +// Solidity: function approveOperator(address operator) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactorSession) ApproveOperator(operator common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.ApproveOperator(&_MockRiverRegistry.TransactOpts, operator) +} + +// DeleteConfiguration is a paid mutator transaction binding the contract method 0x035759e1. +// +// Solidity: function deleteConfiguration(bytes32 key) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactor) DeleteConfiguration(opts *bind.TransactOpts, key [32]byte) (*types.Transaction, error) { + return _MockRiverRegistry.contract.Transact(opts, "deleteConfiguration", key) +} + +// DeleteConfiguration is a paid mutator transaction binding the contract method 0x035759e1. +// +// Solidity: function deleteConfiguration(bytes32 key) returns() +func (_MockRiverRegistry *MockRiverRegistrySession) DeleteConfiguration(key [32]byte) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.DeleteConfiguration(&_MockRiverRegistry.TransactOpts, key) +} + +// DeleteConfiguration is a paid mutator transaction binding the contract method 0x035759e1. +// +// Solidity: function deleteConfiguration(bytes32 key) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactorSession) DeleteConfiguration(key [32]byte) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.DeleteConfiguration(&_MockRiverRegistry.TransactOpts, key) +} + +// DeleteConfigurationOnBlock is a paid mutator transaction binding the contract method 0xb7f227ee. +// +// Solidity: function deleteConfigurationOnBlock(bytes32 key, uint64 blockNumber) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactor) DeleteConfigurationOnBlock(opts *bind.TransactOpts, key [32]byte, blockNumber uint64) (*types.Transaction, error) { + return _MockRiverRegistry.contract.Transact(opts, "deleteConfigurationOnBlock", key, blockNumber) +} + +// DeleteConfigurationOnBlock is a paid mutator transaction binding the contract method 0xb7f227ee. +// +// Solidity: function deleteConfigurationOnBlock(bytes32 key, uint64 blockNumber) returns() +func (_MockRiverRegistry *MockRiverRegistrySession) DeleteConfigurationOnBlock(key [32]byte, blockNumber uint64) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.DeleteConfigurationOnBlock(&_MockRiverRegistry.TransactOpts, key, blockNumber) +} + +// DeleteConfigurationOnBlock is a paid mutator transaction binding the contract method 0xb7f227ee. +// +// Solidity: function deleteConfigurationOnBlock(bytes32 key, uint64 blockNumber) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactorSession) DeleteConfigurationOnBlock(key [32]byte, blockNumber uint64) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.DeleteConfigurationOnBlock(&_MockRiverRegistry.TransactOpts, key, blockNumber) +} + +// PlaceStreamOnNode is a paid mutator transaction binding the contract method 0x9ee86d38. +// +// Solidity: function placeStreamOnNode(bytes32 streamId, address nodeAddress) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactor) PlaceStreamOnNode(opts *bind.TransactOpts, streamId [32]byte, nodeAddress common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.contract.Transact(opts, "placeStreamOnNode", streamId, nodeAddress) +} + +// PlaceStreamOnNode is a paid mutator transaction binding the contract method 0x9ee86d38. +// +// Solidity: function placeStreamOnNode(bytes32 streamId, address nodeAddress) returns() +func (_MockRiverRegistry *MockRiverRegistrySession) PlaceStreamOnNode(streamId [32]byte, nodeAddress common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.PlaceStreamOnNode(&_MockRiverRegistry.TransactOpts, streamId, nodeAddress) +} + +// PlaceStreamOnNode is a paid mutator transaction binding the contract method 0x9ee86d38. +// +// Solidity: function placeStreamOnNode(bytes32 streamId, address nodeAddress) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactorSession) PlaceStreamOnNode(streamId [32]byte, nodeAddress common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.PlaceStreamOnNode(&_MockRiverRegistry.TransactOpts, streamId, nodeAddress) +} + +// RegisterNode is a paid mutator transaction binding the contract method 0xeecc66f4. +// +// Solidity: function registerNode(address nodeAddress, string url, uint8 status) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactor) RegisterNode(opts *bind.TransactOpts, nodeAddress common.Address, url string, status uint8) (*types.Transaction, error) { + return _MockRiverRegistry.contract.Transact(opts, "registerNode", nodeAddress, url, status) +} + +// RegisterNode is a paid mutator transaction binding the contract method 0xeecc66f4. +// +// Solidity: function registerNode(address nodeAddress, string url, uint8 status) returns() +func (_MockRiverRegistry *MockRiverRegistrySession) RegisterNode(nodeAddress common.Address, url string, status uint8) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.RegisterNode(&_MockRiverRegistry.TransactOpts, nodeAddress, url, status) +} + +// RegisterNode is a paid mutator transaction binding the contract method 0xeecc66f4. +// +// Solidity: function registerNode(address nodeAddress, string url, uint8 status) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactorSession) RegisterNode(nodeAddress common.Address, url string, status uint8) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.RegisterNode(&_MockRiverRegistry.TransactOpts, nodeAddress, url, status) +} + +// RemoveConfigurationManager is a paid mutator transaction binding the contract method 0x813049ec. +// +// Solidity: function removeConfigurationManager(address manager) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactor) RemoveConfigurationManager(opts *bind.TransactOpts, manager common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.contract.Transact(opts, "removeConfigurationManager", manager) +} + +// RemoveConfigurationManager is a paid mutator transaction binding the contract method 0x813049ec. +// +// Solidity: function removeConfigurationManager(address manager) returns() +func (_MockRiverRegistry *MockRiverRegistrySession) RemoveConfigurationManager(manager common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.RemoveConfigurationManager(&_MockRiverRegistry.TransactOpts, manager) +} + +// RemoveConfigurationManager is a paid mutator transaction binding the contract method 0x813049ec. +// +// Solidity: function removeConfigurationManager(address manager) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactorSession) RemoveConfigurationManager(manager common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.RemoveConfigurationManager(&_MockRiverRegistry.TransactOpts, manager) +} + +// RemoveNode is a paid mutator transaction binding the contract method 0xb2b99ec9. +// +// Solidity: function removeNode(address nodeAddress) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactor) RemoveNode(opts *bind.TransactOpts, nodeAddress common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.contract.Transact(opts, "removeNode", nodeAddress) +} + +// RemoveNode is a paid mutator transaction binding the contract method 0xb2b99ec9. +// +// Solidity: function removeNode(address nodeAddress) returns() +func (_MockRiverRegistry *MockRiverRegistrySession) RemoveNode(nodeAddress common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.RemoveNode(&_MockRiverRegistry.TransactOpts, nodeAddress) +} + +// RemoveNode is a paid mutator transaction binding the contract method 0xb2b99ec9. +// +// Solidity: function removeNode(address nodeAddress) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactorSession) RemoveNode(nodeAddress common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.RemoveNode(&_MockRiverRegistry.TransactOpts, nodeAddress) +} + +// RemoveOperator is a paid mutator transaction binding the contract method 0xac8a584a. +// +// Solidity: function removeOperator(address operator) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactor) RemoveOperator(opts *bind.TransactOpts, operator common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.contract.Transact(opts, "removeOperator", operator) +} + +// RemoveOperator is a paid mutator transaction binding the contract method 0xac8a584a. +// +// Solidity: function removeOperator(address operator) returns() +func (_MockRiverRegistry *MockRiverRegistrySession) RemoveOperator(operator common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.RemoveOperator(&_MockRiverRegistry.TransactOpts, operator) +} + +// RemoveOperator is a paid mutator transaction binding the contract method 0xac8a584a. +// +// Solidity: function removeOperator(address operator) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactorSession) RemoveOperator(operator common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.RemoveOperator(&_MockRiverRegistry.TransactOpts, operator) +} + +// RemoveStreamFromNode is a paid mutator transaction binding the contract method 0xee885b12. +// +// Solidity: function removeStreamFromNode(bytes32 streamId, address nodeAddress) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactor) RemoveStreamFromNode(opts *bind.TransactOpts, streamId [32]byte, nodeAddress common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.contract.Transact(opts, "removeStreamFromNode", streamId, nodeAddress) +} + +// RemoveStreamFromNode is a paid mutator transaction binding the contract method 0xee885b12. +// +// Solidity: function removeStreamFromNode(bytes32 streamId, address nodeAddress) returns() +func (_MockRiverRegistry *MockRiverRegistrySession) RemoveStreamFromNode(streamId [32]byte, nodeAddress common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.RemoveStreamFromNode(&_MockRiverRegistry.TransactOpts, streamId, nodeAddress) +} + +// RemoveStreamFromNode is a paid mutator transaction binding the contract method 0xee885b12. +// +// Solidity: function removeStreamFromNode(bytes32 streamId, address nodeAddress) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactorSession) RemoveStreamFromNode(streamId [32]byte, nodeAddress common.Address) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.RemoveStreamFromNode(&_MockRiverRegistry.TransactOpts, streamId, nodeAddress) +} + +// SetConfiguration is a paid mutator transaction binding the contract method 0xa09449a6. +// +// Solidity: function setConfiguration(bytes32 key, uint64 blockNumber, bytes value) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactor) SetConfiguration(opts *bind.TransactOpts, key [32]byte, blockNumber uint64, value []byte) (*types.Transaction, error) { + return _MockRiverRegistry.contract.Transact(opts, "setConfiguration", key, blockNumber, value) +} + +// SetConfiguration is a paid mutator transaction binding the contract method 0xa09449a6. +// +// Solidity: function setConfiguration(bytes32 key, uint64 blockNumber, bytes value) returns() +func (_MockRiverRegistry *MockRiverRegistrySession) SetConfiguration(key [32]byte, blockNumber uint64, value []byte) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.SetConfiguration(&_MockRiverRegistry.TransactOpts, key, blockNumber, value) +} + +// SetConfiguration is a paid mutator transaction binding the contract method 0xa09449a6. +// +// Solidity: function setConfiguration(bytes32 key, uint64 blockNumber, bytes value) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactorSession) SetConfiguration(key [32]byte, blockNumber uint64, value []byte) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.SetConfiguration(&_MockRiverRegistry.TransactOpts, key, blockNumber, value) +} + +// SetStreamLastMiniblock is a paid mutator transaction binding the contract method 0xd7a3158a. +// +// Solidity: function setStreamLastMiniblock(bytes32 streamId, bytes32 , bytes32 lastMiniblockHash, uint64 lastMiniblockNum, bool isSealed) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactor) SetStreamLastMiniblock(opts *bind.TransactOpts, streamId [32]byte, arg1 [32]byte, lastMiniblockHash [32]byte, lastMiniblockNum uint64, isSealed bool) (*types.Transaction, error) { + return _MockRiverRegistry.contract.Transact(opts, "setStreamLastMiniblock", streamId, arg1, lastMiniblockHash, lastMiniblockNum, isSealed) +} + +// SetStreamLastMiniblock is a paid mutator transaction binding the contract method 0xd7a3158a. +// +// Solidity: function setStreamLastMiniblock(bytes32 streamId, bytes32 , bytes32 lastMiniblockHash, uint64 lastMiniblockNum, bool isSealed) returns() +func (_MockRiverRegistry *MockRiverRegistrySession) SetStreamLastMiniblock(streamId [32]byte, arg1 [32]byte, lastMiniblockHash [32]byte, lastMiniblockNum uint64, isSealed bool) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.SetStreamLastMiniblock(&_MockRiverRegistry.TransactOpts, streamId, arg1, lastMiniblockHash, lastMiniblockNum, isSealed) +} + +// SetStreamLastMiniblock is a paid mutator transaction binding the contract method 0xd7a3158a. +// +// Solidity: function setStreamLastMiniblock(bytes32 streamId, bytes32 , bytes32 lastMiniblockHash, uint64 lastMiniblockNum, bool isSealed) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactorSession) SetStreamLastMiniblock(streamId [32]byte, arg1 [32]byte, lastMiniblockHash [32]byte, lastMiniblockNum uint64, isSealed bool) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.SetStreamLastMiniblock(&_MockRiverRegistry.TransactOpts, streamId, arg1, lastMiniblockHash, lastMiniblockNum, isSealed) +} + +// SetStreamLastMiniblockBatch is a paid mutator transaction binding the contract method 0xff3a14ab. +// +// Solidity: function setStreamLastMiniblockBatch((bytes32,bytes32,bytes32,uint64,bool)[] miniblocks) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactor) SetStreamLastMiniblockBatch(opts *bind.TransactOpts, miniblocks []SetMiniblock) (*types.Transaction, error) { + return _MockRiverRegistry.contract.Transact(opts, "setStreamLastMiniblockBatch", miniblocks) +} + +// SetStreamLastMiniblockBatch is a paid mutator transaction binding the contract method 0xff3a14ab. +// +// Solidity: function setStreamLastMiniblockBatch((bytes32,bytes32,bytes32,uint64,bool)[] miniblocks) returns() +func (_MockRiverRegistry *MockRiverRegistrySession) SetStreamLastMiniblockBatch(miniblocks []SetMiniblock) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.SetStreamLastMiniblockBatch(&_MockRiverRegistry.TransactOpts, miniblocks) +} + +// SetStreamLastMiniblockBatch is a paid mutator transaction binding the contract method 0xff3a14ab. +// +// Solidity: function setStreamLastMiniblockBatch((bytes32,bytes32,bytes32,uint64,bool)[] miniblocks) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactorSession) SetStreamLastMiniblockBatch(miniblocks []SetMiniblock) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.SetStreamLastMiniblockBatch(&_MockRiverRegistry.TransactOpts, miniblocks) +} + +// UpdateNodeStatus is a paid mutator transaction binding the contract method 0x581f8b9b. +// +// Solidity: function updateNodeStatus(address nodeAddress, uint8 status) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactor) UpdateNodeStatus(opts *bind.TransactOpts, nodeAddress common.Address, status uint8) (*types.Transaction, error) { + return _MockRiverRegistry.contract.Transact(opts, "updateNodeStatus", nodeAddress, status) +} + +// UpdateNodeStatus is a paid mutator transaction binding the contract method 0x581f8b9b. +// +// Solidity: function updateNodeStatus(address nodeAddress, uint8 status) returns() +func (_MockRiverRegistry *MockRiverRegistrySession) UpdateNodeStatus(nodeAddress common.Address, status uint8) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.UpdateNodeStatus(&_MockRiverRegistry.TransactOpts, nodeAddress, status) +} + +// UpdateNodeStatus is a paid mutator transaction binding the contract method 0x581f8b9b. +// +// Solidity: function updateNodeStatus(address nodeAddress, uint8 status) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactorSession) UpdateNodeStatus(nodeAddress common.Address, status uint8) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.UpdateNodeStatus(&_MockRiverRegistry.TransactOpts, nodeAddress, status) +} + +// UpdateNodeUrl is a paid mutator transaction binding the contract method 0x7e4465e7. +// +// Solidity: function updateNodeUrl(address nodeAddress, string url) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactor) UpdateNodeUrl(opts *bind.TransactOpts, nodeAddress common.Address, url string) (*types.Transaction, error) { + return _MockRiverRegistry.contract.Transact(opts, "updateNodeUrl", nodeAddress, url) +} + +// UpdateNodeUrl is a paid mutator transaction binding the contract method 0x7e4465e7. +// +// Solidity: function updateNodeUrl(address nodeAddress, string url) returns() +func (_MockRiverRegistry *MockRiverRegistrySession) UpdateNodeUrl(nodeAddress common.Address, url string) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.UpdateNodeUrl(&_MockRiverRegistry.TransactOpts, nodeAddress, url) +} + +// UpdateNodeUrl is a paid mutator transaction binding the contract method 0x7e4465e7. +// +// Solidity: function updateNodeUrl(address nodeAddress, string url) returns() +func (_MockRiverRegistry *MockRiverRegistryTransactorSession) UpdateNodeUrl(nodeAddress common.Address, url string) (*types.Transaction, error) { + return _MockRiverRegistry.Contract.UpdateNodeUrl(&_MockRiverRegistry.TransactOpts, nodeAddress, url) +} + +// MockRiverRegistryConfigurationChangedIterator is returned from FilterConfigurationChanged and is used to iterate over the raw logs and unpacked data for ConfigurationChanged events raised by the MockRiverRegistry contract. +type MockRiverRegistryConfigurationChangedIterator struct { + Event *MockRiverRegistryConfigurationChanged // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockRiverRegistryConfigurationChangedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryConfigurationChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryConfigurationChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockRiverRegistryConfigurationChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockRiverRegistryConfigurationChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockRiverRegistryConfigurationChanged represents a ConfigurationChanged event raised by the MockRiverRegistry contract. +type MockRiverRegistryConfigurationChanged struct { + Key [32]byte + Block uint64 + Value []byte + Deleted bool + Raw types.Log // Blockchain specific contextual infos +} + +// FilterConfigurationChanged is a free log retrieval operation binding the contract event 0xc01483261a841a868b99cb8802faed4ea44a1a816651c4f7ee061a96a205fe98. +// +// Solidity: event ConfigurationChanged(bytes32 key, uint64 block, bytes value, bool deleted) +func (_MockRiverRegistry *MockRiverRegistryFilterer) FilterConfigurationChanged(opts *bind.FilterOpts) (*MockRiverRegistryConfigurationChangedIterator, error) { + + logs, sub, err := _MockRiverRegistry.contract.FilterLogs(opts, "ConfigurationChanged") + if err != nil { + return nil, err + } + return &MockRiverRegistryConfigurationChangedIterator{contract: _MockRiverRegistry.contract, event: "ConfigurationChanged", logs: logs, sub: sub}, nil +} + +// WatchConfigurationChanged is a free log subscription operation binding the contract event 0xc01483261a841a868b99cb8802faed4ea44a1a816651c4f7ee061a96a205fe98. +// +// Solidity: event ConfigurationChanged(bytes32 key, uint64 block, bytes value, bool deleted) +func (_MockRiverRegistry *MockRiverRegistryFilterer) WatchConfigurationChanged(opts *bind.WatchOpts, sink chan<- *MockRiverRegistryConfigurationChanged) (event.Subscription, error) { + + logs, sub, err := _MockRiverRegistry.contract.WatchLogs(opts, "ConfigurationChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockRiverRegistryConfigurationChanged) + if err := _MockRiverRegistry.contract.UnpackLog(event, "ConfigurationChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseConfigurationChanged is a log parse operation binding the contract event 0xc01483261a841a868b99cb8802faed4ea44a1a816651c4f7ee061a96a205fe98. +// +// Solidity: event ConfigurationChanged(bytes32 key, uint64 block, bytes value, bool deleted) +func (_MockRiverRegistry *MockRiverRegistryFilterer) ParseConfigurationChanged(log types.Log) (*MockRiverRegistryConfigurationChanged, error) { + event := new(MockRiverRegistryConfigurationChanged) + if err := _MockRiverRegistry.contract.UnpackLog(event, "ConfigurationChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockRiverRegistryConfigurationManagerAddedIterator is returned from FilterConfigurationManagerAdded and is used to iterate over the raw logs and unpacked data for ConfigurationManagerAdded events raised by the MockRiverRegistry contract. +type MockRiverRegistryConfigurationManagerAddedIterator struct { + Event *MockRiverRegistryConfigurationManagerAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockRiverRegistryConfigurationManagerAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryConfigurationManagerAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryConfigurationManagerAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockRiverRegistryConfigurationManagerAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockRiverRegistryConfigurationManagerAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockRiverRegistryConfigurationManagerAdded represents a ConfigurationManagerAdded event raised by the MockRiverRegistry contract. +type MockRiverRegistryConfigurationManagerAdded struct { + Manager common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterConfigurationManagerAdded is a free log retrieval operation binding the contract event 0x7afd798379ae2d2e5035438544cea2b60eb1dde6a8128e6d447fd2a25f8825a2. +// +// Solidity: event ConfigurationManagerAdded(address indexed manager) +func (_MockRiverRegistry *MockRiverRegistryFilterer) FilterConfigurationManagerAdded(opts *bind.FilterOpts, manager []common.Address) (*MockRiverRegistryConfigurationManagerAddedIterator, error) { + + var managerRule []interface{} + for _, managerItem := range manager { + managerRule = append(managerRule, managerItem) + } + + logs, sub, err := _MockRiverRegistry.contract.FilterLogs(opts, "ConfigurationManagerAdded", managerRule) + if err != nil { + return nil, err + } + return &MockRiverRegistryConfigurationManagerAddedIterator{contract: _MockRiverRegistry.contract, event: "ConfigurationManagerAdded", logs: logs, sub: sub}, nil +} + +// WatchConfigurationManagerAdded is a free log subscription operation binding the contract event 0x7afd798379ae2d2e5035438544cea2b60eb1dde6a8128e6d447fd2a25f8825a2. +// +// Solidity: event ConfigurationManagerAdded(address indexed manager) +func (_MockRiverRegistry *MockRiverRegistryFilterer) WatchConfigurationManagerAdded(opts *bind.WatchOpts, sink chan<- *MockRiverRegistryConfigurationManagerAdded, manager []common.Address) (event.Subscription, error) { + + var managerRule []interface{} + for _, managerItem := range manager { + managerRule = append(managerRule, managerItem) + } + + logs, sub, err := _MockRiverRegistry.contract.WatchLogs(opts, "ConfigurationManagerAdded", managerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockRiverRegistryConfigurationManagerAdded) + if err := _MockRiverRegistry.contract.UnpackLog(event, "ConfigurationManagerAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseConfigurationManagerAdded is a log parse operation binding the contract event 0x7afd798379ae2d2e5035438544cea2b60eb1dde6a8128e6d447fd2a25f8825a2. +// +// Solidity: event ConfigurationManagerAdded(address indexed manager) +func (_MockRiverRegistry *MockRiverRegistryFilterer) ParseConfigurationManagerAdded(log types.Log) (*MockRiverRegistryConfigurationManagerAdded, error) { + event := new(MockRiverRegistryConfigurationManagerAdded) + if err := _MockRiverRegistry.contract.UnpackLog(event, "ConfigurationManagerAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockRiverRegistryConfigurationManagerRemovedIterator is returned from FilterConfigurationManagerRemoved and is used to iterate over the raw logs and unpacked data for ConfigurationManagerRemoved events raised by the MockRiverRegistry contract. +type MockRiverRegistryConfigurationManagerRemovedIterator struct { + Event *MockRiverRegistryConfigurationManagerRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockRiverRegistryConfigurationManagerRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryConfigurationManagerRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryConfigurationManagerRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockRiverRegistryConfigurationManagerRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockRiverRegistryConfigurationManagerRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockRiverRegistryConfigurationManagerRemoved represents a ConfigurationManagerRemoved event raised by the MockRiverRegistry contract. +type MockRiverRegistryConfigurationManagerRemoved struct { + Manager common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterConfigurationManagerRemoved is a free log retrieval operation binding the contract event 0xf9889c857e5356066b564327caa757c325ecbc001b2b47d72edf8cf9aedb1be5. +// +// Solidity: event ConfigurationManagerRemoved(address indexed manager) +func (_MockRiverRegistry *MockRiverRegistryFilterer) FilterConfigurationManagerRemoved(opts *bind.FilterOpts, manager []common.Address) (*MockRiverRegistryConfigurationManagerRemovedIterator, error) { + + var managerRule []interface{} + for _, managerItem := range manager { + managerRule = append(managerRule, managerItem) + } + + logs, sub, err := _MockRiverRegistry.contract.FilterLogs(opts, "ConfigurationManagerRemoved", managerRule) + if err != nil { + return nil, err + } + return &MockRiverRegistryConfigurationManagerRemovedIterator{contract: _MockRiverRegistry.contract, event: "ConfigurationManagerRemoved", logs: logs, sub: sub}, nil +} + +// WatchConfigurationManagerRemoved is a free log subscription operation binding the contract event 0xf9889c857e5356066b564327caa757c325ecbc001b2b47d72edf8cf9aedb1be5. +// +// Solidity: event ConfigurationManagerRemoved(address indexed manager) +func (_MockRiverRegistry *MockRiverRegistryFilterer) WatchConfigurationManagerRemoved(opts *bind.WatchOpts, sink chan<- *MockRiverRegistryConfigurationManagerRemoved, manager []common.Address) (event.Subscription, error) { + + var managerRule []interface{} + for _, managerItem := range manager { + managerRule = append(managerRule, managerItem) + } + + logs, sub, err := _MockRiverRegistry.contract.WatchLogs(opts, "ConfigurationManagerRemoved", managerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockRiverRegistryConfigurationManagerRemoved) + if err := _MockRiverRegistry.contract.UnpackLog(event, "ConfigurationManagerRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseConfigurationManagerRemoved is a log parse operation binding the contract event 0xf9889c857e5356066b564327caa757c325ecbc001b2b47d72edf8cf9aedb1be5. +// +// Solidity: event ConfigurationManagerRemoved(address indexed manager) +func (_MockRiverRegistry *MockRiverRegistryFilterer) ParseConfigurationManagerRemoved(log types.Log) (*MockRiverRegistryConfigurationManagerRemoved, error) { + event := new(MockRiverRegistryConfigurationManagerRemoved) + if err := _MockRiverRegistry.contract.UnpackLog(event, "ConfigurationManagerRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockRiverRegistryInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the MockRiverRegistry contract. +type MockRiverRegistryInitializedIterator struct { + Event *MockRiverRegistryInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockRiverRegistryInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockRiverRegistryInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockRiverRegistryInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockRiverRegistryInitialized represents a Initialized event raised by the MockRiverRegistry contract. +type MockRiverRegistryInitialized struct { + Version uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_MockRiverRegistry *MockRiverRegistryFilterer) FilterInitialized(opts *bind.FilterOpts) (*MockRiverRegistryInitializedIterator, error) { + + logs, sub, err := _MockRiverRegistry.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &MockRiverRegistryInitializedIterator{contract: _MockRiverRegistry.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_MockRiverRegistry *MockRiverRegistryFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *MockRiverRegistryInitialized) (event.Subscription, error) { + + logs, sub, err := _MockRiverRegistry.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockRiverRegistryInitialized) + if err := _MockRiverRegistry.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_MockRiverRegistry *MockRiverRegistryFilterer) ParseInitialized(log types.Log) (*MockRiverRegistryInitialized, error) { + event := new(MockRiverRegistryInitialized) + if err := _MockRiverRegistry.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockRiverRegistryInterfaceAddedIterator is returned from FilterInterfaceAdded and is used to iterate over the raw logs and unpacked data for InterfaceAdded events raised by the MockRiverRegistry contract. +type MockRiverRegistryInterfaceAddedIterator struct { + Event *MockRiverRegistryInterfaceAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockRiverRegistryInterfaceAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryInterfaceAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryInterfaceAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockRiverRegistryInterfaceAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockRiverRegistryInterfaceAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockRiverRegistryInterfaceAdded represents a InterfaceAdded event raised by the MockRiverRegistry contract. +type MockRiverRegistryInterfaceAdded struct { + InterfaceId [4]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInterfaceAdded is a free log retrieval operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_MockRiverRegistry *MockRiverRegistryFilterer) FilterInterfaceAdded(opts *bind.FilterOpts, interfaceId [][4]byte) (*MockRiverRegistryInterfaceAddedIterator, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _MockRiverRegistry.contract.FilterLogs(opts, "InterfaceAdded", interfaceIdRule) + if err != nil { + return nil, err + } + return &MockRiverRegistryInterfaceAddedIterator{contract: _MockRiverRegistry.contract, event: "InterfaceAdded", logs: logs, sub: sub}, nil +} + +// WatchInterfaceAdded is a free log subscription operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_MockRiverRegistry *MockRiverRegistryFilterer) WatchInterfaceAdded(opts *bind.WatchOpts, sink chan<- *MockRiverRegistryInterfaceAdded, interfaceId [][4]byte) (event.Subscription, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _MockRiverRegistry.contract.WatchLogs(opts, "InterfaceAdded", interfaceIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockRiverRegistryInterfaceAdded) + if err := _MockRiverRegistry.contract.UnpackLog(event, "InterfaceAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInterfaceAdded is a log parse operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_MockRiverRegistry *MockRiverRegistryFilterer) ParseInterfaceAdded(log types.Log) (*MockRiverRegistryInterfaceAdded, error) { + event := new(MockRiverRegistryInterfaceAdded) + if err := _MockRiverRegistry.contract.UnpackLog(event, "InterfaceAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockRiverRegistryInterfaceRemovedIterator is returned from FilterInterfaceRemoved and is used to iterate over the raw logs and unpacked data for InterfaceRemoved events raised by the MockRiverRegistry contract. +type MockRiverRegistryInterfaceRemovedIterator struct { + Event *MockRiverRegistryInterfaceRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockRiverRegistryInterfaceRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryInterfaceRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryInterfaceRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockRiverRegistryInterfaceRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockRiverRegistryInterfaceRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockRiverRegistryInterfaceRemoved represents a InterfaceRemoved event raised by the MockRiverRegistry contract. +type MockRiverRegistryInterfaceRemoved struct { + InterfaceId [4]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInterfaceRemoved is a free log retrieval operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_MockRiverRegistry *MockRiverRegistryFilterer) FilterInterfaceRemoved(opts *bind.FilterOpts, interfaceId [][4]byte) (*MockRiverRegistryInterfaceRemovedIterator, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _MockRiverRegistry.contract.FilterLogs(opts, "InterfaceRemoved", interfaceIdRule) + if err != nil { + return nil, err + } + return &MockRiverRegistryInterfaceRemovedIterator{contract: _MockRiverRegistry.contract, event: "InterfaceRemoved", logs: logs, sub: sub}, nil +} + +// WatchInterfaceRemoved is a free log subscription operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_MockRiverRegistry *MockRiverRegistryFilterer) WatchInterfaceRemoved(opts *bind.WatchOpts, sink chan<- *MockRiverRegistryInterfaceRemoved, interfaceId [][4]byte) (event.Subscription, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _MockRiverRegistry.contract.WatchLogs(opts, "InterfaceRemoved", interfaceIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockRiverRegistryInterfaceRemoved) + if err := _MockRiverRegistry.contract.UnpackLog(event, "InterfaceRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInterfaceRemoved is a log parse operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_MockRiverRegistry *MockRiverRegistryFilterer) ParseInterfaceRemoved(log types.Log) (*MockRiverRegistryInterfaceRemoved, error) { + event := new(MockRiverRegistryInterfaceRemoved) + if err := _MockRiverRegistry.contract.UnpackLog(event, "InterfaceRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockRiverRegistryNodeAddedIterator is returned from FilterNodeAdded and is used to iterate over the raw logs and unpacked data for NodeAdded events raised by the MockRiverRegistry contract. +type MockRiverRegistryNodeAddedIterator struct { + Event *MockRiverRegistryNodeAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockRiverRegistryNodeAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryNodeAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryNodeAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockRiverRegistryNodeAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockRiverRegistryNodeAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockRiverRegistryNodeAdded represents a NodeAdded event raised by the MockRiverRegistry contract. +type MockRiverRegistryNodeAdded struct { + NodeAddress common.Address + Url string + Status uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeAdded is a free log retrieval operation binding the contract event 0xd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e561. +// +// Solidity: event NodeAdded(address indexed nodeAddress, string url, uint8 status) +func (_MockRiverRegistry *MockRiverRegistryFilterer) FilterNodeAdded(opts *bind.FilterOpts, nodeAddress []common.Address) (*MockRiverRegistryNodeAddedIterator, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _MockRiverRegistry.contract.FilterLogs(opts, "NodeAdded", nodeAddressRule) + if err != nil { + return nil, err + } + return &MockRiverRegistryNodeAddedIterator{contract: _MockRiverRegistry.contract, event: "NodeAdded", logs: logs, sub: sub}, nil +} + +// WatchNodeAdded is a free log subscription operation binding the contract event 0xd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e561. +// +// Solidity: event NodeAdded(address indexed nodeAddress, string url, uint8 status) +func (_MockRiverRegistry *MockRiverRegistryFilterer) WatchNodeAdded(opts *bind.WatchOpts, sink chan<- *MockRiverRegistryNodeAdded, nodeAddress []common.Address) (event.Subscription, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _MockRiverRegistry.contract.WatchLogs(opts, "NodeAdded", nodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockRiverRegistryNodeAdded) + if err := _MockRiverRegistry.contract.UnpackLog(event, "NodeAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeAdded is a log parse operation binding the contract event 0xd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e561. +// +// Solidity: event NodeAdded(address indexed nodeAddress, string url, uint8 status) +func (_MockRiverRegistry *MockRiverRegistryFilterer) ParseNodeAdded(log types.Log) (*MockRiverRegistryNodeAdded, error) { + event := new(MockRiverRegistryNodeAdded) + if err := _MockRiverRegistry.contract.UnpackLog(event, "NodeAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockRiverRegistryNodeRemovedIterator is returned from FilterNodeRemoved and is used to iterate over the raw logs and unpacked data for NodeRemoved events raised by the MockRiverRegistry contract. +type MockRiverRegistryNodeRemovedIterator struct { + Event *MockRiverRegistryNodeRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockRiverRegistryNodeRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryNodeRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryNodeRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockRiverRegistryNodeRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockRiverRegistryNodeRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockRiverRegistryNodeRemoved represents a NodeRemoved event raised by the MockRiverRegistry contract. +type MockRiverRegistryNodeRemoved struct { + NodeAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeRemoved is a free log retrieval operation binding the contract event 0xcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b. +// +// Solidity: event NodeRemoved(address indexed nodeAddress) +func (_MockRiverRegistry *MockRiverRegistryFilterer) FilterNodeRemoved(opts *bind.FilterOpts, nodeAddress []common.Address) (*MockRiverRegistryNodeRemovedIterator, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _MockRiverRegistry.contract.FilterLogs(opts, "NodeRemoved", nodeAddressRule) + if err != nil { + return nil, err + } + return &MockRiverRegistryNodeRemovedIterator{contract: _MockRiverRegistry.contract, event: "NodeRemoved", logs: logs, sub: sub}, nil +} + +// WatchNodeRemoved is a free log subscription operation binding the contract event 0xcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b. +// +// Solidity: event NodeRemoved(address indexed nodeAddress) +func (_MockRiverRegistry *MockRiverRegistryFilterer) WatchNodeRemoved(opts *bind.WatchOpts, sink chan<- *MockRiverRegistryNodeRemoved, nodeAddress []common.Address) (event.Subscription, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _MockRiverRegistry.contract.WatchLogs(opts, "NodeRemoved", nodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockRiverRegistryNodeRemoved) + if err := _MockRiverRegistry.contract.UnpackLog(event, "NodeRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeRemoved is a log parse operation binding the contract event 0xcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b. +// +// Solidity: event NodeRemoved(address indexed nodeAddress) +func (_MockRiverRegistry *MockRiverRegistryFilterer) ParseNodeRemoved(log types.Log) (*MockRiverRegistryNodeRemoved, error) { + event := new(MockRiverRegistryNodeRemoved) + if err := _MockRiverRegistry.contract.UnpackLog(event, "NodeRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockRiverRegistryNodeStatusUpdatedIterator is returned from FilterNodeStatusUpdated and is used to iterate over the raw logs and unpacked data for NodeStatusUpdated events raised by the MockRiverRegistry contract. +type MockRiverRegistryNodeStatusUpdatedIterator struct { + Event *MockRiverRegistryNodeStatusUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockRiverRegistryNodeStatusUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryNodeStatusUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryNodeStatusUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockRiverRegistryNodeStatusUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockRiverRegistryNodeStatusUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockRiverRegistryNodeStatusUpdated represents a NodeStatusUpdated event raised by the MockRiverRegistry contract. +type MockRiverRegistryNodeStatusUpdated struct { + NodeAddress common.Address + Status uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeStatusUpdated is a free log retrieval operation binding the contract event 0x20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0. +// +// Solidity: event NodeStatusUpdated(address indexed nodeAddress, uint8 status) +func (_MockRiverRegistry *MockRiverRegistryFilterer) FilterNodeStatusUpdated(opts *bind.FilterOpts, nodeAddress []common.Address) (*MockRiverRegistryNodeStatusUpdatedIterator, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _MockRiverRegistry.contract.FilterLogs(opts, "NodeStatusUpdated", nodeAddressRule) + if err != nil { + return nil, err + } + return &MockRiverRegistryNodeStatusUpdatedIterator{contract: _MockRiverRegistry.contract, event: "NodeStatusUpdated", logs: logs, sub: sub}, nil +} + +// WatchNodeStatusUpdated is a free log subscription operation binding the contract event 0x20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0. +// +// Solidity: event NodeStatusUpdated(address indexed nodeAddress, uint8 status) +func (_MockRiverRegistry *MockRiverRegistryFilterer) WatchNodeStatusUpdated(opts *bind.WatchOpts, sink chan<- *MockRiverRegistryNodeStatusUpdated, nodeAddress []common.Address) (event.Subscription, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _MockRiverRegistry.contract.WatchLogs(opts, "NodeStatusUpdated", nodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockRiverRegistryNodeStatusUpdated) + if err := _MockRiverRegistry.contract.UnpackLog(event, "NodeStatusUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeStatusUpdated is a log parse operation binding the contract event 0x20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0. +// +// Solidity: event NodeStatusUpdated(address indexed nodeAddress, uint8 status) +func (_MockRiverRegistry *MockRiverRegistryFilterer) ParseNodeStatusUpdated(log types.Log) (*MockRiverRegistryNodeStatusUpdated, error) { + event := new(MockRiverRegistryNodeStatusUpdated) + if err := _MockRiverRegistry.contract.UnpackLog(event, "NodeStatusUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockRiverRegistryNodeUrlUpdatedIterator is returned from FilterNodeUrlUpdated and is used to iterate over the raw logs and unpacked data for NodeUrlUpdated events raised by the MockRiverRegistry contract. +type MockRiverRegistryNodeUrlUpdatedIterator struct { + Event *MockRiverRegistryNodeUrlUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockRiverRegistryNodeUrlUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryNodeUrlUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryNodeUrlUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockRiverRegistryNodeUrlUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockRiverRegistryNodeUrlUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockRiverRegistryNodeUrlUpdated represents a NodeUrlUpdated event raised by the MockRiverRegistry contract. +type MockRiverRegistryNodeUrlUpdated struct { + NodeAddress common.Address + Url string + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeUrlUpdated is a free log retrieval operation binding the contract event 0x4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac. +// +// Solidity: event NodeUrlUpdated(address indexed nodeAddress, string url) +func (_MockRiverRegistry *MockRiverRegistryFilterer) FilterNodeUrlUpdated(opts *bind.FilterOpts, nodeAddress []common.Address) (*MockRiverRegistryNodeUrlUpdatedIterator, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _MockRiverRegistry.contract.FilterLogs(opts, "NodeUrlUpdated", nodeAddressRule) + if err != nil { + return nil, err + } + return &MockRiverRegistryNodeUrlUpdatedIterator{contract: _MockRiverRegistry.contract, event: "NodeUrlUpdated", logs: logs, sub: sub}, nil +} + +// WatchNodeUrlUpdated is a free log subscription operation binding the contract event 0x4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac. +// +// Solidity: event NodeUrlUpdated(address indexed nodeAddress, string url) +func (_MockRiverRegistry *MockRiverRegistryFilterer) WatchNodeUrlUpdated(opts *bind.WatchOpts, sink chan<- *MockRiverRegistryNodeUrlUpdated, nodeAddress []common.Address) (event.Subscription, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _MockRiverRegistry.contract.WatchLogs(opts, "NodeUrlUpdated", nodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockRiverRegistryNodeUrlUpdated) + if err := _MockRiverRegistry.contract.UnpackLog(event, "NodeUrlUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeUrlUpdated is a log parse operation binding the contract event 0x4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac. +// +// Solidity: event NodeUrlUpdated(address indexed nodeAddress, string url) +func (_MockRiverRegistry *MockRiverRegistryFilterer) ParseNodeUrlUpdated(log types.Log) (*MockRiverRegistryNodeUrlUpdated, error) { + event := new(MockRiverRegistryNodeUrlUpdated) + if err := _MockRiverRegistry.contract.UnpackLog(event, "NodeUrlUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockRiverRegistryOperatorAddedIterator is returned from FilterOperatorAdded and is used to iterate over the raw logs and unpacked data for OperatorAdded events raised by the MockRiverRegistry contract. +type MockRiverRegistryOperatorAddedIterator struct { + Event *MockRiverRegistryOperatorAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockRiverRegistryOperatorAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryOperatorAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryOperatorAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockRiverRegistryOperatorAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockRiverRegistryOperatorAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockRiverRegistryOperatorAdded represents a OperatorAdded event raised by the MockRiverRegistry contract. +type MockRiverRegistryOperatorAdded struct { + OperatorAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorAdded is a free log retrieval operation binding the contract event 0xac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d. +// +// Solidity: event OperatorAdded(address indexed operatorAddress) +func (_MockRiverRegistry *MockRiverRegistryFilterer) FilterOperatorAdded(opts *bind.FilterOpts, operatorAddress []common.Address) (*MockRiverRegistryOperatorAddedIterator, error) { + + var operatorAddressRule []interface{} + for _, operatorAddressItem := range operatorAddress { + operatorAddressRule = append(operatorAddressRule, operatorAddressItem) + } + + logs, sub, err := _MockRiverRegistry.contract.FilterLogs(opts, "OperatorAdded", operatorAddressRule) + if err != nil { + return nil, err + } + return &MockRiverRegistryOperatorAddedIterator{contract: _MockRiverRegistry.contract, event: "OperatorAdded", logs: logs, sub: sub}, nil +} + +// WatchOperatorAdded is a free log subscription operation binding the contract event 0xac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d. +// +// Solidity: event OperatorAdded(address indexed operatorAddress) +func (_MockRiverRegistry *MockRiverRegistryFilterer) WatchOperatorAdded(opts *bind.WatchOpts, sink chan<- *MockRiverRegistryOperatorAdded, operatorAddress []common.Address) (event.Subscription, error) { + + var operatorAddressRule []interface{} + for _, operatorAddressItem := range operatorAddress { + operatorAddressRule = append(operatorAddressRule, operatorAddressItem) + } + + logs, sub, err := _MockRiverRegistry.contract.WatchLogs(opts, "OperatorAdded", operatorAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockRiverRegistryOperatorAdded) + if err := _MockRiverRegistry.contract.UnpackLog(event, "OperatorAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorAdded is a log parse operation binding the contract event 0xac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d. +// +// Solidity: event OperatorAdded(address indexed operatorAddress) +func (_MockRiverRegistry *MockRiverRegistryFilterer) ParseOperatorAdded(log types.Log) (*MockRiverRegistryOperatorAdded, error) { + event := new(MockRiverRegistryOperatorAdded) + if err := _MockRiverRegistry.contract.UnpackLog(event, "OperatorAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockRiverRegistryOperatorRemovedIterator is returned from FilterOperatorRemoved and is used to iterate over the raw logs and unpacked data for OperatorRemoved events raised by the MockRiverRegistry contract. +type MockRiverRegistryOperatorRemovedIterator struct { + Event *MockRiverRegistryOperatorRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockRiverRegistryOperatorRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryOperatorRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryOperatorRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockRiverRegistryOperatorRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockRiverRegistryOperatorRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockRiverRegistryOperatorRemoved represents a OperatorRemoved event raised by the MockRiverRegistry contract. +type MockRiverRegistryOperatorRemoved struct { + OperatorAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorRemoved is a free log retrieval operation binding the contract event 0x80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d. +// +// Solidity: event OperatorRemoved(address indexed operatorAddress) +func (_MockRiverRegistry *MockRiverRegistryFilterer) FilterOperatorRemoved(opts *bind.FilterOpts, operatorAddress []common.Address) (*MockRiverRegistryOperatorRemovedIterator, error) { + + var operatorAddressRule []interface{} + for _, operatorAddressItem := range operatorAddress { + operatorAddressRule = append(operatorAddressRule, operatorAddressItem) + } + + logs, sub, err := _MockRiverRegistry.contract.FilterLogs(opts, "OperatorRemoved", operatorAddressRule) + if err != nil { + return nil, err + } + return &MockRiverRegistryOperatorRemovedIterator{contract: _MockRiverRegistry.contract, event: "OperatorRemoved", logs: logs, sub: sub}, nil +} + +// WatchOperatorRemoved is a free log subscription operation binding the contract event 0x80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d. +// +// Solidity: event OperatorRemoved(address indexed operatorAddress) +func (_MockRiverRegistry *MockRiverRegistryFilterer) WatchOperatorRemoved(opts *bind.WatchOpts, sink chan<- *MockRiverRegistryOperatorRemoved, operatorAddress []common.Address) (event.Subscription, error) { + + var operatorAddressRule []interface{} + for _, operatorAddressItem := range operatorAddress { + operatorAddressRule = append(operatorAddressRule, operatorAddressItem) + } + + logs, sub, err := _MockRiverRegistry.contract.WatchLogs(opts, "OperatorRemoved", operatorAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockRiverRegistryOperatorRemoved) + if err := _MockRiverRegistry.contract.UnpackLog(event, "OperatorRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorRemoved is a log parse operation binding the contract event 0x80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d. +// +// Solidity: event OperatorRemoved(address indexed operatorAddress) +func (_MockRiverRegistry *MockRiverRegistryFilterer) ParseOperatorRemoved(log types.Log) (*MockRiverRegistryOperatorRemoved, error) { + event := new(MockRiverRegistryOperatorRemoved) + if err := _MockRiverRegistry.contract.UnpackLog(event, "OperatorRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockRiverRegistryOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the MockRiverRegistry contract. +type MockRiverRegistryOwnershipTransferredIterator struct { + Event *MockRiverRegistryOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockRiverRegistryOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockRiverRegistryOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockRiverRegistryOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockRiverRegistryOwnershipTransferred represents a OwnershipTransferred event raised by the MockRiverRegistry contract. +type MockRiverRegistryOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_MockRiverRegistry *MockRiverRegistryFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*MockRiverRegistryOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _MockRiverRegistry.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &MockRiverRegistryOwnershipTransferredIterator{contract: _MockRiverRegistry.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_MockRiverRegistry *MockRiverRegistryFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *MockRiverRegistryOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _MockRiverRegistry.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockRiverRegistryOwnershipTransferred) + if err := _MockRiverRegistry.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_MockRiverRegistry *MockRiverRegistryFilterer) ParseOwnershipTransferred(log types.Log) (*MockRiverRegistryOwnershipTransferred, error) { + event := new(MockRiverRegistryOwnershipTransferred) + if err := _MockRiverRegistry.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockRiverRegistryStreamAllocatedIterator is returned from FilterStreamAllocated and is used to iterate over the raw logs and unpacked data for StreamAllocated events raised by the MockRiverRegistry contract. +type MockRiverRegistryStreamAllocatedIterator struct { + Event *MockRiverRegistryStreamAllocated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockRiverRegistryStreamAllocatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryStreamAllocated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryStreamAllocated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockRiverRegistryStreamAllocatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockRiverRegistryStreamAllocatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockRiverRegistryStreamAllocated represents a StreamAllocated event raised by the MockRiverRegistry contract. +type MockRiverRegistryStreamAllocated struct { + StreamId [32]byte + Nodes []common.Address + GenesisMiniblockHash [32]byte + GenesisMiniblock []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterStreamAllocated is a free log retrieval operation binding the contract event 0x55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb. +// +// Solidity: event StreamAllocated(bytes32 streamId, address[] nodes, bytes32 genesisMiniblockHash, bytes genesisMiniblock) +func (_MockRiverRegistry *MockRiverRegistryFilterer) FilterStreamAllocated(opts *bind.FilterOpts) (*MockRiverRegistryStreamAllocatedIterator, error) { + + logs, sub, err := _MockRiverRegistry.contract.FilterLogs(opts, "StreamAllocated") + if err != nil { + return nil, err + } + return &MockRiverRegistryStreamAllocatedIterator{contract: _MockRiverRegistry.contract, event: "StreamAllocated", logs: logs, sub: sub}, nil +} + +// WatchStreamAllocated is a free log subscription operation binding the contract event 0x55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb. +// +// Solidity: event StreamAllocated(bytes32 streamId, address[] nodes, bytes32 genesisMiniblockHash, bytes genesisMiniblock) +func (_MockRiverRegistry *MockRiverRegistryFilterer) WatchStreamAllocated(opts *bind.WatchOpts, sink chan<- *MockRiverRegistryStreamAllocated) (event.Subscription, error) { + + logs, sub, err := _MockRiverRegistry.contract.WatchLogs(opts, "StreamAllocated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockRiverRegistryStreamAllocated) + if err := _MockRiverRegistry.contract.UnpackLog(event, "StreamAllocated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseStreamAllocated is a log parse operation binding the contract event 0x55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb. +// +// Solidity: event StreamAllocated(bytes32 streamId, address[] nodes, bytes32 genesisMiniblockHash, bytes genesisMiniblock) +func (_MockRiverRegistry *MockRiverRegistryFilterer) ParseStreamAllocated(log types.Log) (*MockRiverRegistryStreamAllocated, error) { + event := new(MockRiverRegistryStreamAllocated) + if err := _MockRiverRegistry.contract.UnpackLog(event, "StreamAllocated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockRiverRegistryStreamLastMiniblockUpdateFailedIterator is returned from FilterStreamLastMiniblockUpdateFailed and is used to iterate over the raw logs and unpacked data for StreamLastMiniblockUpdateFailed events raised by the MockRiverRegistry contract. +type MockRiverRegistryStreamLastMiniblockUpdateFailedIterator struct { + Event *MockRiverRegistryStreamLastMiniblockUpdateFailed // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockRiverRegistryStreamLastMiniblockUpdateFailedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryStreamLastMiniblockUpdateFailed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryStreamLastMiniblockUpdateFailed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockRiverRegistryStreamLastMiniblockUpdateFailedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockRiverRegistryStreamLastMiniblockUpdateFailedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockRiverRegistryStreamLastMiniblockUpdateFailed represents a StreamLastMiniblockUpdateFailed event raised by the MockRiverRegistry contract. +type MockRiverRegistryStreamLastMiniblockUpdateFailed struct { + StreamId [32]byte + LastMiniblockHash [32]byte + LastMiniblockNum uint64 + Reason string + Raw types.Log // Blockchain specific contextual infos +} + +// FilterStreamLastMiniblockUpdateFailed is a free log retrieval operation binding the contract event 0x75460fe319331413a18a82d99b07735cec53fa0c4061ada38c2141e331082afa. +// +// Solidity: event StreamLastMiniblockUpdateFailed(bytes32 streamId, bytes32 lastMiniblockHash, uint64 lastMiniblockNum, string reason) +func (_MockRiverRegistry *MockRiverRegistryFilterer) FilterStreamLastMiniblockUpdateFailed(opts *bind.FilterOpts) (*MockRiverRegistryStreamLastMiniblockUpdateFailedIterator, error) { + + logs, sub, err := _MockRiverRegistry.contract.FilterLogs(opts, "StreamLastMiniblockUpdateFailed") + if err != nil { + return nil, err + } + return &MockRiverRegistryStreamLastMiniblockUpdateFailedIterator{contract: _MockRiverRegistry.contract, event: "StreamLastMiniblockUpdateFailed", logs: logs, sub: sub}, nil +} + +// WatchStreamLastMiniblockUpdateFailed is a free log subscription operation binding the contract event 0x75460fe319331413a18a82d99b07735cec53fa0c4061ada38c2141e331082afa. +// +// Solidity: event StreamLastMiniblockUpdateFailed(bytes32 streamId, bytes32 lastMiniblockHash, uint64 lastMiniblockNum, string reason) +func (_MockRiverRegistry *MockRiverRegistryFilterer) WatchStreamLastMiniblockUpdateFailed(opts *bind.WatchOpts, sink chan<- *MockRiverRegistryStreamLastMiniblockUpdateFailed) (event.Subscription, error) { + + logs, sub, err := _MockRiverRegistry.contract.WatchLogs(opts, "StreamLastMiniblockUpdateFailed") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockRiverRegistryStreamLastMiniblockUpdateFailed) + if err := _MockRiverRegistry.contract.UnpackLog(event, "StreamLastMiniblockUpdateFailed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseStreamLastMiniblockUpdateFailed is a log parse operation binding the contract event 0x75460fe319331413a18a82d99b07735cec53fa0c4061ada38c2141e331082afa. +// +// Solidity: event StreamLastMiniblockUpdateFailed(bytes32 streamId, bytes32 lastMiniblockHash, uint64 lastMiniblockNum, string reason) +func (_MockRiverRegistry *MockRiverRegistryFilterer) ParseStreamLastMiniblockUpdateFailed(log types.Log) (*MockRiverRegistryStreamLastMiniblockUpdateFailed, error) { + event := new(MockRiverRegistryStreamLastMiniblockUpdateFailed) + if err := _MockRiverRegistry.contract.UnpackLog(event, "StreamLastMiniblockUpdateFailed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockRiverRegistryStreamLastMiniblockUpdatedIterator is returned from FilterStreamLastMiniblockUpdated and is used to iterate over the raw logs and unpacked data for StreamLastMiniblockUpdated events raised by the MockRiverRegistry contract. +type MockRiverRegistryStreamLastMiniblockUpdatedIterator struct { + Event *MockRiverRegistryStreamLastMiniblockUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockRiverRegistryStreamLastMiniblockUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryStreamLastMiniblockUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryStreamLastMiniblockUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockRiverRegistryStreamLastMiniblockUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockRiverRegistryStreamLastMiniblockUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockRiverRegistryStreamLastMiniblockUpdated represents a StreamLastMiniblockUpdated event raised by the MockRiverRegistry contract. +type MockRiverRegistryStreamLastMiniblockUpdated struct { + StreamId [32]byte + LastMiniblockHash [32]byte + LastMiniblockNum uint64 + IsSealed bool + Raw types.Log // Blockchain specific contextual infos +} + +// FilterStreamLastMiniblockUpdated is a free log retrieval operation binding the contract event 0xccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b. +// +// Solidity: event StreamLastMiniblockUpdated(bytes32 streamId, bytes32 lastMiniblockHash, uint64 lastMiniblockNum, bool isSealed) +func (_MockRiverRegistry *MockRiverRegistryFilterer) FilterStreamLastMiniblockUpdated(opts *bind.FilterOpts) (*MockRiverRegistryStreamLastMiniblockUpdatedIterator, error) { + + logs, sub, err := _MockRiverRegistry.contract.FilterLogs(opts, "StreamLastMiniblockUpdated") + if err != nil { + return nil, err + } + return &MockRiverRegistryStreamLastMiniblockUpdatedIterator{contract: _MockRiverRegistry.contract, event: "StreamLastMiniblockUpdated", logs: logs, sub: sub}, nil +} + +// WatchStreamLastMiniblockUpdated is a free log subscription operation binding the contract event 0xccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b. +// +// Solidity: event StreamLastMiniblockUpdated(bytes32 streamId, bytes32 lastMiniblockHash, uint64 lastMiniblockNum, bool isSealed) +func (_MockRiverRegistry *MockRiverRegistryFilterer) WatchStreamLastMiniblockUpdated(opts *bind.WatchOpts, sink chan<- *MockRiverRegistryStreamLastMiniblockUpdated) (event.Subscription, error) { + + logs, sub, err := _MockRiverRegistry.contract.WatchLogs(opts, "StreamLastMiniblockUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockRiverRegistryStreamLastMiniblockUpdated) + if err := _MockRiverRegistry.contract.UnpackLog(event, "StreamLastMiniblockUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseStreamLastMiniblockUpdated is a log parse operation binding the contract event 0xccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b. +// +// Solidity: event StreamLastMiniblockUpdated(bytes32 streamId, bytes32 lastMiniblockHash, uint64 lastMiniblockNum, bool isSealed) +func (_MockRiverRegistry *MockRiverRegistryFilterer) ParseStreamLastMiniblockUpdated(log types.Log) (*MockRiverRegistryStreamLastMiniblockUpdated, error) { + event := new(MockRiverRegistryStreamLastMiniblockUpdated) + if err := _MockRiverRegistry.contract.UnpackLog(event, "StreamLastMiniblockUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockRiverRegistryStreamPlacementUpdatedIterator is returned from FilterStreamPlacementUpdated and is used to iterate over the raw logs and unpacked data for StreamPlacementUpdated events raised by the MockRiverRegistry contract. +type MockRiverRegistryStreamPlacementUpdatedIterator struct { + Event *MockRiverRegistryStreamPlacementUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockRiverRegistryStreamPlacementUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryStreamPlacementUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockRiverRegistryStreamPlacementUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockRiverRegistryStreamPlacementUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockRiverRegistryStreamPlacementUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockRiverRegistryStreamPlacementUpdated represents a StreamPlacementUpdated event raised by the MockRiverRegistry contract. +type MockRiverRegistryStreamPlacementUpdated struct { + StreamId [32]byte + NodeAddress common.Address + IsAdded bool + Raw types.Log // Blockchain specific contextual infos +} + +// FilterStreamPlacementUpdated is a free log retrieval operation binding the contract event 0xaaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f. +// +// Solidity: event StreamPlacementUpdated(bytes32 streamId, address nodeAddress, bool isAdded) +func (_MockRiverRegistry *MockRiverRegistryFilterer) FilterStreamPlacementUpdated(opts *bind.FilterOpts) (*MockRiverRegistryStreamPlacementUpdatedIterator, error) { + + logs, sub, err := _MockRiverRegistry.contract.FilterLogs(opts, "StreamPlacementUpdated") + if err != nil { + return nil, err + } + return &MockRiverRegistryStreamPlacementUpdatedIterator{contract: _MockRiverRegistry.contract, event: "StreamPlacementUpdated", logs: logs, sub: sub}, nil +} + +// WatchStreamPlacementUpdated is a free log subscription operation binding the contract event 0xaaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f. +// +// Solidity: event StreamPlacementUpdated(bytes32 streamId, address nodeAddress, bool isAdded) +func (_MockRiverRegistry *MockRiverRegistryFilterer) WatchStreamPlacementUpdated(opts *bind.WatchOpts, sink chan<- *MockRiverRegistryStreamPlacementUpdated) (event.Subscription, error) { + + logs, sub, err := _MockRiverRegistry.contract.WatchLogs(opts, "StreamPlacementUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockRiverRegistryStreamPlacementUpdated) + if err := _MockRiverRegistry.contract.UnpackLog(event, "StreamPlacementUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseStreamPlacementUpdated is a log parse operation binding the contract event 0xaaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f. +// +// Solidity: event StreamPlacementUpdated(bytes32 streamId, address nodeAddress, bool isAdded) +func (_MockRiverRegistry *MockRiverRegistryFilterer) ParseStreamPlacementUpdated(log types.Log) (*MockRiverRegistryStreamPlacementUpdated, error) { + event := new(MockRiverRegistryStreamPlacementUpdated) + if err := _MockRiverRegistry.contract.UnpackLog(event, "StreamPlacementUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/node/contracts/node_registry_v1.go b/core/node/contracts/node_registry_v1.go new file mode 100644 index 000000000..39b2b30a3 --- /dev/null +++ b/core/node/contracts/node_registry_v1.go @@ -0,0 +1,977 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contracts + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// Node is an auto generated low-level Go binding around an user-defined struct. +type Node struct { + Status uint8 + Url string + NodeAddress common.Address + Operator common.Address +} + +// NodeRegistryV1MetaData contains all meta data concerning the NodeRegistryV1 contract. +var NodeRegistryV1MetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"getAllNodeAddresses\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllNodes\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structNode[]\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumNodeStatus\"},{\"name\":\"url\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNode\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structNode\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumNodeStatus\"},{\"name\":\"url\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNodeCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerNode\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"url\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumNodeStatus\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeNode\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateNodeStatus\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumNodeStatus\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateNodeUrl\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"url\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"NodeAdded\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"url\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumNodeStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NodeRemoved\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NodeStatusUpdated\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumNodeStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NodeUrlUpdated\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"url\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false}]", +} + +// NodeRegistryV1ABI is the input ABI used to generate the binding from. +// Deprecated: Use NodeRegistryV1MetaData.ABI instead. +var NodeRegistryV1ABI = NodeRegistryV1MetaData.ABI + +// NodeRegistryV1 is an auto generated Go binding around an Ethereum contract. +type NodeRegistryV1 struct { + NodeRegistryV1Caller // Read-only binding to the contract + NodeRegistryV1Transactor // Write-only binding to the contract + NodeRegistryV1Filterer // Log filterer for contract events +} + +// NodeRegistryV1Caller is an auto generated read-only Go binding around an Ethereum contract. +type NodeRegistryV1Caller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// NodeRegistryV1Transactor is an auto generated write-only Go binding around an Ethereum contract. +type NodeRegistryV1Transactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// NodeRegistryV1Filterer is an auto generated log filtering Go binding around an Ethereum contract events. +type NodeRegistryV1Filterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// NodeRegistryV1Session is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type NodeRegistryV1Session struct { + Contract *NodeRegistryV1 // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// NodeRegistryV1CallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type NodeRegistryV1CallerSession struct { + Contract *NodeRegistryV1Caller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// NodeRegistryV1TransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type NodeRegistryV1TransactorSession struct { + Contract *NodeRegistryV1Transactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// NodeRegistryV1Raw is an auto generated low-level Go binding around an Ethereum contract. +type NodeRegistryV1Raw struct { + Contract *NodeRegistryV1 // Generic contract binding to access the raw methods on +} + +// NodeRegistryV1CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type NodeRegistryV1CallerRaw struct { + Contract *NodeRegistryV1Caller // Generic read-only contract binding to access the raw methods on +} + +// NodeRegistryV1TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type NodeRegistryV1TransactorRaw struct { + Contract *NodeRegistryV1Transactor // Generic write-only contract binding to access the raw methods on +} + +// NewNodeRegistryV1 creates a new instance of NodeRegistryV1, bound to a specific deployed contract. +func NewNodeRegistryV1(address common.Address, backend bind.ContractBackend) (*NodeRegistryV1, error) { + contract, err := bindNodeRegistryV1(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &NodeRegistryV1{NodeRegistryV1Caller: NodeRegistryV1Caller{contract: contract}, NodeRegistryV1Transactor: NodeRegistryV1Transactor{contract: contract}, NodeRegistryV1Filterer: NodeRegistryV1Filterer{contract: contract}}, nil +} + +// NewNodeRegistryV1Caller creates a new read-only instance of NodeRegistryV1, bound to a specific deployed contract. +func NewNodeRegistryV1Caller(address common.Address, caller bind.ContractCaller) (*NodeRegistryV1Caller, error) { + contract, err := bindNodeRegistryV1(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &NodeRegistryV1Caller{contract: contract}, nil +} + +// NewNodeRegistryV1Transactor creates a new write-only instance of NodeRegistryV1, bound to a specific deployed contract. +func NewNodeRegistryV1Transactor(address common.Address, transactor bind.ContractTransactor) (*NodeRegistryV1Transactor, error) { + contract, err := bindNodeRegistryV1(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &NodeRegistryV1Transactor{contract: contract}, nil +} + +// NewNodeRegistryV1Filterer creates a new log filterer instance of NodeRegistryV1, bound to a specific deployed contract. +func NewNodeRegistryV1Filterer(address common.Address, filterer bind.ContractFilterer) (*NodeRegistryV1Filterer, error) { + contract, err := bindNodeRegistryV1(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &NodeRegistryV1Filterer{contract: contract}, nil +} + +// bindNodeRegistryV1 binds a generic wrapper to an already deployed contract. +func bindNodeRegistryV1(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := NodeRegistryV1MetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_NodeRegistryV1 *NodeRegistryV1Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _NodeRegistryV1.Contract.NodeRegistryV1Caller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_NodeRegistryV1 *NodeRegistryV1Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _NodeRegistryV1.Contract.NodeRegistryV1Transactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_NodeRegistryV1 *NodeRegistryV1Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _NodeRegistryV1.Contract.NodeRegistryV1Transactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_NodeRegistryV1 *NodeRegistryV1CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _NodeRegistryV1.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_NodeRegistryV1 *NodeRegistryV1TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _NodeRegistryV1.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_NodeRegistryV1 *NodeRegistryV1TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _NodeRegistryV1.Contract.contract.Transact(opts, method, params...) +} + +// GetAllNodeAddresses is a free data retrieval call binding the contract method 0xc8fe3a01. +// +// Solidity: function getAllNodeAddresses() view returns(address[]) +func (_NodeRegistryV1 *NodeRegistryV1Caller) GetAllNodeAddresses(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _NodeRegistryV1.contract.Call(opts, &out, "getAllNodeAddresses") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetAllNodeAddresses is a free data retrieval call binding the contract method 0xc8fe3a01. +// +// Solidity: function getAllNodeAddresses() view returns(address[]) +func (_NodeRegistryV1 *NodeRegistryV1Session) GetAllNodeAddresses() ([]common.Address, error) { + return _NodeRegistryV1.Contract.GetAllNodeAddresses(&_NodeRegistryV1.CallOpts) +} + +// GetAllNodeAddresses is a free data retrieval call binding the contract method 0xc8fe3a01. +// +// Solidity: function getAllNodeAddresses() view returns(address[]) +func (_NodeRegistryV1 *NodeRegistryV1CallerSession) GetAllNodeAddresses() ([]common.Address, error) { + return _NodeRegistryV1.Contract.GetAllNodeAddresses(&_NodeRegistryV1.CallOpts) +} + +// GetAllNodes is a free data retrieval call binding the contract method 0xa1174e7d. +// +// Solidity: function getAllNodes() view returns((uint8,string,address,address)[]) +func (_NodeRegistryV1 *NodeRegistryV1Caller) GetAllNodes(opts *bind.CallOpts) ([]Node, error) { + var out []interface{} + err := _NodeRegistryV1.contract.Call(opts, &out, "getAllNodes") + + if err != nil { + return *new([]Node), err + } + + out0 := *abi.ConvertType(out[0], new([]Node)).(*[]Node) + + return out0, err + +} + +// GetAllNodes is a free data retrieval call binding the contract method 0xa1174e7d. +// +// Solidity: function getAllNodes() view returns((uint8,string,address,address)[]) +func (_NodeRegistryV1 *NodeRegistryV1Session) GetAllNodes() ([]Node, error) { + return _NodeRegistryV1.Contract.GetAllNodes(&_NodeRegistryV1.CallOpts) +} + +// GetAllNodes is a free data retrieval call binding the contract method 0xa1174e7d. +// +// Solidity: function getAllNodes() view returns((uint8,string,address,address)[]) +func (_NodeRegistryV1 *NodeRegistryV1CallerSession) GetAllNodes() ([]Node, error) { + return _NodeRegistryV1.Contract.GetAllNodes(&_NodeRegistryV1.CallOpts) +} + +// GetNode is a free data retrieval call binding the contract method 0x9d209048. +// +// Solidity: function getNode(address nodeAddress) view returns((uint8,string,address,address)) +func (_NodeRegistryV1 *NodeRegistryV1Caller) GetNode(opts *bind.CallOpts, nodeAddress common.Address) (Node, error) { + var out []interface{} + err := _NodeRegistryV1.contract.Call(opts, &out, "getNode", nodeAddress) + + if err != nil { + return *new(Node), err + } + + out0 := *abi.ConvertType(out[0], new(Node)).(*Node) + + return out0, err + +} + +// GetNode is a free data retrieval call binding the contract method 0x9d209048. +// +// Solidity: function getNode(address nodeAddress) view returns((uint8,string,address,address)) +func (_NodeRegistryV1 *NodeRegistryV1Session) GetNode(nodeAddress common.Address) (Node, error) { + return _NodeRegistryV1.Contract.GetNode(&_NodeRegistryV1.CallOpts, nodeAddress) +} + +// GetNode is a free data retrieval call binding the contract method 0x9d209048. +// +// Solidity: function getNode(address nodeAddress) view returns((uint8,string,address,address)) +func (_NodeRegistryV1 *NodeRegistryV1CallerSession) GetNode(nodeAddress common.Address) (Node, error) { + return _NodeRegistryV1.Contract.GetNode(&_NodeRegistryV1.CallOpts, nodeAddress) +} + +// GetNodeCount is a free data retrieval call binding the contract method 0x39bf397e. +// +// Solidity: function getNodeCount() view returns(uint256) +func (_NodeRegistryV1 *NodeRegistryV1Caller) GetNodeCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _NodeRegistryV1.contract.Call(opts, &out, "getNodeCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetNodeCount is a free data retrieval call binding the contract method 0x39bf397e. +// +// Solidity: function getNodeCount() view returns(uint256) +func (_NodeRegistryV1 *NodeRegistryV1Session) GetNodeCount() (*big.Int, error) { + return _NodeRegistryV1.Contract.GetNodeCount(&_NodeRegistryV1.CallOpts) +} + +// GetNodeCount is a free data retrieval call binding the contract method 0x39bf397e. +// +// Solidity: function getNodeCount() view returns(uint256) +func (_NodeRegistryV1 *NodeRegistryV1CallerSession) GetNodeCount() (*big.Int, error) { + return _NodeRegistryV1.Contract.GetNodeCount(&_NodeRegistryV1.CallOpts) +} + +// RegisterNode is a paid mutator transaction binding the contract method 0xeecc66f4. +// +// Solidity: function registerNode(address nodeAddress, string url, uint8 status) returns() +func (_NodeRegistryV1 *NodeRegistryV1Transactor) RegisterNode(opts *bind.TransactOpts, nodeAddress common.Address, url string, status uint8) (*types.Transaction, error) { + return _NodeRegistryV1.contract.Transact(opts, "registerNode", nodeAddress, url, status) +} + +// RegisterNode is a paid mutator transaction binding the contract method 0xeecc66f4. +// +// Solidity: function registerNode(address nodeAddress, string url, uint8 status) returns() +func (_NodeRegistryV1 *NodeRegistryV1Session) RegisterNode(nodeAddress common.Address, url string, status uint8) (*types.Transaction, error) { + return _NodeRegistryV1.Contract.RegisterNode(&_NodeRegistryV1.TransactOpts, nodeAddress, url, status) +} + +// RegisterNode is a paid mutator transaction binding the contract method 0xeecc66f4. +// +// Solidity: function registerNode(address nodeAddress, string url, uint8 status) returns() +func (_NodeRegistryV1 *NodeRegistryV1TransactorSession) RegisterNode(nodeAddress common.Address, url string, status uint8) (*types.Transaction, error) { + return _NodeRegistryV1.Contract.RegisterNode(&_NodeRegistryV1.TransactOpts, nodeAddress, url, status) +} + +// RemoveNode is a paid mutator transaction binding the contract method 0xb2b99ec9. +// +// Solidity: function removeNode(address nodeAddress) returns() +func (_NodeRegistryV1 *NodeRegistryV1Transactor) RemoveNode(opts *bind.TransactOpts, nodeAddress common.Address) (*types.Transaction, error) { + return _NodeRegistryV1.contract.Transact(opts, "removeNode", nodeAddress) +} + +// RemoveNode is a paid mutator transaction binding the contract method 0xb2b99ec9. +// +// Solidity: function removeNode(address nodeAddress) returns() +func (_NodeRegistryV1 *NodeRegistryV1Session) RemoveNode(nodeAddress common.Address) (*types.Transaction, error) { + return _NodeRegistryV1.Contract.RemoveNode(&_NodeRegistryV1.TransactOpts, nodeAddress) +} + +// RemoveNode is a paid mutator transaction binding the contract method 0xb2b99ec9. +// +// Solidity: function removeNode(address nodeAddress) returns() +func (_NodeRegistryV1 *NodeRegistryV1TransactorSession) RemoveNode(nodeAddress common.Address) (*types.Transaction, error) { + return _NodeRegistryV1.Contract.RemoveNode(&_NodeRegistryV1.TransactOpts, nodeAddress) +} + +// UpdateNodeStatus is a paid mutator transaction binding the contract method 0x581f8b9b. +// +// Solidity: function updateNodeStatus(address nodeAddress, uint8 status) returns() +func (_NodeRegistryV1 *NodeRegistryV1Transactor) UpdateNodeStatus(opts *bind.TransactOpts, nodeAddress common.Address, status uint8) (*types.Transaction, error) { + return _NodeRegistryV1.contract.Transact(opts, "updateNodeStatus", nodeAddress, status) +} + +// UpdateNodeStatus is a paid mutator transaction binding the contract method 0x581f8b9b. +// +// Solidity: function updateNodeStatus(address nodeAddress, uint8 status) returns() +func (_NodeRegistryV1 *NodeRegistryV1Session) UpdateNodeStatus(nodeAddress common.Address, status uint8) (*types.Transaction, error) { + return _NodeRegistryV1.Contract.UpdateNodeStatus(&_NodeRegistryV1.TransactOpts, nodeAddress, status) +} + +// UpdateNodeStatus is a paid mutator transaction binding the contract method 0x581f8b9b. +// +// Solidity: function updateNodeStatus(address nodeAddress, uint8 status) returns() +func (_NodeRegistryV1 *NodeRegistryV1TransactorSession) UpdateNodeStatus(nodeAddress common.Address, status uint8) (*types.Transaction, error) { + return _NodeRegistryV1.Contract.UpdateNodeStatus(&_NodeRegistryV1.TransactOpts, nodeAddress, status) +} + +// UpdateNodeUrl is a paid mutator transaction binding the contract method 0x7e4465e7. +// +// Solidity: function updateNodeUrl(address nodeAddress, string url) returns() +func (_NodeRegistryV1 *NodeRegistryV1Transactor) UpdateNodeUrl(opts *bind.TransactOpts, nodeAddress common.Address, url string) (*types.Transaction, error) { + return _NodeRegistryV1.contract.Transact(opts, "updateNodeUrl", nodeAddress, url) +} + +// UpdateNodeUrl is a paid mutator transaction binding the contract method 0x7e4465e7. +// +// Solidity: function updateNodeUrl(address nodeAddress, string url) returns() +func (_NodeRegistryV1 *NodeRegistryV1Session) UpdateNodeUrl(nodeAddress common.Address, url string) (*types.Transaction, error) { + return _NodeRegistryV1.Contract.UpdateNodeUrl(&_NodeRegistryV1.TransactOpts, nodeAddress, url) +} + +// UpdateNodeUrl is a paid mutator transaction binding the contract method 0x7e4465e7. +// +// Solidity: function updateNodeUrl(address nodeAddress, string url) returns() +func (_NodeRegistryV1 *NodeRegistryV1TransactorSession) UpdateNodeUrl(nodeAddress common.Address, url string) (*types.Transaction, error) { + return _NodeRegistryV1.Contract.UpdateNodeUrl(&_NodeRegistryV1.TransactOpts, nodeAddress, url) +} + +// NodeRegistryV1NodeAddedIterator is returned from FilterNodeAdded and is used to iterate over the raw logs and unpacked data for NodeAdded events raised by the NodeRegistryV1 contract. +type NodeRegistryV1NodeAddedIterator struct { + Event *NodeRegistryV1NodeAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NodeRegistryV1NodeAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NodeRegistryV1NodeAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NodeRegistryV1NodeAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NodeRegistryV1NodeAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NodeRegistryV1NodeAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NodeRegistryV1NodeAdded represents a NodeAdded event raised by the NodeRegistryV1 contract. +type NodeRegistryV1NodeAdded struct { + NodeAddress common.Address + Url string + Status uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeAdded is a free log retrieval operation binding the contract event 0xd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e561. +// +// Solidity: event NodeAdded(address indexed nodeAddress, string url, uint8 status) +func (_NodeRegistryV1 *NodeRegistryV1Filterer) FilterNodeAdded(opts *bind.FilterOpts, nodeAddress []common.Address) (*NodeRegistryV1NodeAddedIterator, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _NodeRegistryV1.contract.FilterLogs(opts, "NodeAdded", nodeAddressRule) + if err != nil { + return nil, err + } + return &NodeRegistryV1NodeAddedIterator{contract: _NodeRegistryV1.contract, event: "NodeAdded", logs: logs, sub: sub}, nil +} + +// WatchNodeAdded is a free log subscription operation binding the contract event 0xd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e561. +// +// Solidity: event NodeAdded(address indexed nodeAddress, string url, uint8 status) +func (_NodeRegistryV1 *NodeRegistryV1Filterer) WatchNodeAdded(opts *bind.WatchOpts, sink chan<- *NodeRegistryV1NodeAdded, nodeAddress []common.Address) (event.Subscription, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _NodeRegistryV1.contract.WatchLogs(opts, "NodeAdded", nodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NodeRegistryV1NodeAdded) + if err := _NodeRegistryV1.contract.UnpackLog(event, "NodeAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeAdded is a log parse operation binding the contract event 0xd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e561. +// +// Solidity: event NodeAdded(address indexed nodeAddress, string url, uint8 status) +func (_NodeRegistryV1 *NodeRegistryV1Filterer) ParseNodeAdded(log types.Log) (*NodeRegistryV1NodeAdded, error) { + event := new(NodeRegistryV1NodeAdded) + if err := _NodeRegistryV1.contract.UnpackLog(event, "NodeAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NodeRegistryV1NodeRemovedIterator is returned from FilterNodeRemoved and is used to iterate over the raw logs and unpacked data for NodeRemoved events raised by the NodeRegistryV1 contract. +type NodeRegistryV1NodeRemovedIterator struct { + Event *NodeRegistryV1NodeRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NodeRegistryV1NodeRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NodeRegistryV1NodeRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NodeRegistryV1NodeRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NodeRegistryV1NodeRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NodeRegistryV1NodeRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NodeRegistryV1NodeRemoved represents a NodeRemoved event raised by the NodeRegistryV1 contract. +type NodeRegistryV1NodeRemoved struct { + NodeAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeRemoved is a free log retrieval operation binding the contract event 0xcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b. +// +// Solidity: event NodeRemoved(address indexed nodeAddress) +func (_NodeRegistryV1 *NodeRegistryV1Filterer) FilterNodeRemoved(opts *bind.FilterOpts, nodeAddress []common.Address) (*NodeRegistryV1NodeRemovedIterator, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _NodeRegistryV1.contract.FilterLogs(opts, "NodeRemoved", nodeAddressRule) + if err != nil { + return nil, err + } + return &NodeRegistryV1NodeRemovedIterator{contract: _NodeRegistryV1.contract, event: "NodeRemoved", logs: logs, sub: sub}, nil +} + +// WatchNodeRemoved is a free log subscription operation binding the contract event 0xcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b. +// +// Solidity: event NodeRemoved(address indexed nodeAddress) +func (_NodeRegistryV1 *NodeRegistryV1Filterer) WatchNodeRemoved(opts *bind.WatchOpts, sink chan<- *NodeRegistryV1NodeRemoved, nodeAddress []common.Address) (event.Subscription, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _NodeRegistryV1.contract.WatchLogs(opts, "NodeRemoved", nodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NodeRegistryV1NodeRemoved) + if err := _NodeRegistryV1.contract.UnpackLog(event, "NodeRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeRemoved is a log parse operation binding the contract event 0xcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b. +// +// Solidity: event NodeRemoved(address indexed nodeAddress) +func (_NodeRegistryV1 *NodeRegistryV1Filterer) ParseNodeRemoved(log types.Log) (*NodeRegistryV1NodeRemoved, error) { + event := new(NodeRegistryV1NodeRemoved) + if err := _NodeRegistryV1.contract.UnpackLog(event, "NodeRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NodeRegistryV1NodeStatusUpdatedIterator is returned from FilterNodeStatusUpdated and is used to iterate over the raw logs and unpacked data for NodeStatusUpdated events raised by the NodeRegistryV1 contract. +type NodeRegistryV1NodeStatusUpdatedIterator struct { + Event *NodeRegistryV1NodeStatusUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NodeRegistryV1NodeStatusUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NodeRegistryV1NodeStatusUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NodeRegistryV1NodeStatusUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NodeRegistryV1NodeStatusUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NodeRegistryV1NodeStatusUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NodeRegistryV1NodeStatusUpdated represents a NodeStatusUpdated event raised by the NodeRegistryV1 contract. +type NodeRegistryV1NodeStatusUpdated struct { + NodeAddress common.Address + Status uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeStatusUpdated is a free log retrieval operation binding the contract event 0x20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0. +// +// Solidity: event NodeStatusUpdated(address indexed nodeAddress, uint8 status) +func (_NodeRegistryV1 *NodeRegistryV1Filterer) FilterNodeStatusUpdated(opts *bind.FilterOpts, nodeAddress []common.Address) (*NodeRegistryV1NodeStatusUpdatedIterator, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _NodeRegistryV1.contract.FilterLogs(opts, "NodeStatusUpdated", nodeAddressRule) + if err != nil { + return nil, err + } + return &NodeRegistryV1NodeStatusUpdatedIterator{contract: _NodeRegistryV1.contract, event: "NodeStatusUpdated", logs: logs, sub: sub}, nil +} + +// WatchNodeStatusUpdated is a free log subscription operation binding the contract event 0x20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0. +// +// Solidity: event NodeStatusUpdated(address indexed nodeAddress, uint8 status) +func (_NodeRegistryV1 *NodeRegistryV1Filterer) WatchNodeStatusUpdated(opts *bind.WatchOpts, sink chan<- *NodeRegistryV1NodeStatusUpdated, nodeAddress []common.Address) (event.Subscription, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _NodeRegistryV1.contract.WatchLogs(opts, "NodeStatusUpdated", nodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NodeRegistryV1NodeStatusUpdated) + if err := _NodeRegistryV1.contract.UnpackLog(event, "NodeStatusUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeStatusUpdated is a log parse operation binding the contract event 0x20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0. +// +// Solidity: event NodeStatusUpdated(address indexed nodeAddress, uint8 status) +func (_NodeRegistryV1 *NodeRegistryV1Filterer) ParseNodeStatusUpdated(log types.Log) (*NodeRegistryV1NodeStatusUpdated, error) { + event := new(NodeRegistryV1NodeStatusUpdated) + if err := _NodeRegistryV1.contract.UnpackLog(event, "NodeStatusUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NodeRegistryV1NodeUrlUpdatedIterator is returned from FilterNodeUrlUpdated and is used to iterate over the raw logs and unpacked data for NodeUrlUpdated events raised by the NodeRegistryV1 contract. +type NodeRegistryV1NodeUrlUpdatedIterator struct { + Event *NodeRegistryV1NodeUrlUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NodeRegistryV1NodeUrlUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NodeRegistryV1NodeUrlUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NodeRegistryV1NodeUrlUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NodeRegistryV1NodeUrlUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NodeRegistryV1NodeUrlUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NodeRegistryV1NodeUrlUpdated represents a NodeUrlUpdated event raised by the NodeRegistryV1 contract. +type NodeRegistryV1NodeUrlUpdated struct { + NodeAddress common.Address + Url string + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeUrlUpdated is a free log retrieval operation binding the contract event 0x4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac. +// +// Solidity: event NodeUrlUpdated(address indexed nodeAddress, string url) +func (_NodeRegistryV1 *NodeRegistryV1Filterer) FilterNodeUrlUpdated(opts *bind.FilterOpts, nodeAddress []common.Address) (*NodeRegistryV1NodeUrlUpdatedIterator, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _NodeRegistryV1.contract.FilterLogs(opts, "NodeUrlUpdated", nodeAddressRule) + if err != nil { + return nil, err + } + return &NodeRegistryV1NodeUrlUpdatedIterator{contract: _NodeRegistryV1.contract, event: "NodeUrlUpdated", logs: logs, sub: sub}, nil +} + +// WatchNodeUrlUpdated is a free log subscription operation binding the contract event 0x4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac. +// +// Solidity: event NodeUrlUpdated(address indexed nodeAddress, string url) +func (_NodeRegistryV1 *NodeRegistryV1Filterer) WatchNodeUrlUpdated(opts *bind.WatchOpts, sink chan<- *NodeRegistryV1NodeUrlUpdated, nodeAddress []common.Address) (event.Subscription, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _NodeRegistryV1.contract.WatchLogs(opts, "NodeUrlUpdated", nodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NodeRegistryV1NodeUrlUpdated) + if err := _NodeRegistryV1.contract.UnpackLog(event, "NodeUrlUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeUrlUpdated is a log parse operation binding the contract event 0x4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac. +// +// Solidity: event NodeUrlUpdated(address indexed nodeAddress, string url) +func (_NodeRegistryV1 *NodeRegistryV1Filterer) ParseNodeUrlUpdated(log types.Log) (*NodeRegistryV1NodeUrlUpdated, error) { + event := new(NodeRegistryV1NodeUrlUpdated) + if err := _NodeRegistryV1.contract.UnpackLog(event, "NodeUrlUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/node/contracts/node_registry_v1_ex.go b/core/node/contracts/node_registry_v1_ex.go new file mode 100644 index 000000000..7687b3039 --- /dev/null +++ b/core/node/contracts/node_registry_v1_ex.go @@ -0,0 +1,35 @@ +package contracts + +import "github.com/ethereum/go-ethereum/accounts/abi/bind" + +func (_NodeRegistryV1 *NodeRegistryV1Caller) BoundContract() *bind.BoundContract { + return _NodeRegistryV1.contract +} + +const ( + NodeStatus_NotInitialized uint8 = iota + NodeStatus_RemoteOnly + NodeStatus_Operational + NodeStatus_Failed + NodeStatus_Departing + NodeStatus_Deleted +) + +func NodeStatusString(ns uint8) string { + switch ns { + case NodeStatus_NotInitialized: + return "NotInit" + case NodeStatus_RemoteOnly: + return "RemoteOnly" + case NodeStatus_Operational: + return "Operational" + case NodeStatus_Failed: + return "Failed" + case NodeStatus_Departing: + return "Departing" + case NodeStatus_Deleted: + return "Deleted" + default: + return "Unknown" + } +} diff --git a/core/node/contracts/operator_registry_v1.go b/core/node/contracts/operator_registry_v1.go new file mode 100644 index 000000000..34bfed7bd --- /dev/null +++ b/core/node/contracts/operator_registry_v1.go @@ -0,0 +1,542 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contracts + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// OperatorRegistryV1MetaData contains all meta data concerning the OperatorRegistryV1 contract. +var OperatorRegistryV1MetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"approveOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"OperatorAdded\",\"inputs\":[{\"name\":\"operatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemoved\",\"inputs\":[{\"name\":\"operatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", +} + +// OperatorRegistryV1ABI is the input ABI used to generate the binding from. +// Deprecated: Use OperatorRegistryV1MetaData.ABI instead. +var OperatorRegistryV1ABI = OperatorRegistryV1MetaData.ABI + +// OperatorRegistryV1 is an auto generated Go binding around an Ethereum contract. +type OperatorRegistryV1 struct { + OperatorRegistryV1Caller // Read-only binding to the contract + OperatorRegistryV1Transactor // Write-only binding to the contract + OperatorRegistryV1Filterer // Log filterer for contract events +} + +// OperatorRegistryV1Caller is an auto generated read-only Go binding around an Ethereum contract. +type OperatorRegistryV1Caller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// OperatorRegistryV1Transactor is an auto generated write-only Go binding around an Ethereum contract. +type OperatorRegistryV1Transactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// OperatorRegistryV1Filterer is an auto generated log filtering Go binding around an Ethereum contract events. +type OperatorRegistryV1Filterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// OperatorRegistryV1Session is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type OperatorRegistryV1Session struct { + Contract *OperatorRegistryV1 // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// OperatorRegistryV1CallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type OperatorRegistryV1CallerSession struct { + Contract *OperatorRegistryV1Caller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// OperatorRegistryV1TransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type OperatorRegistryV1TransactorSession struct { + Contract *OperatorRegistryV1Transactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// OperatorRegistryV1Raw is an auto generated low-level Go binding around an Ethereum contract. +type OperatorRegistryV1Raw struct { + Contract *OperatorRegistryV1 // Generic contract binding to access the raw methods on +} + +// OperatorRegistryV1CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type OperatorRegistryV1CallerRaw struct { + Contract *OperatorRegistryV1Caller // Generic read-only contract binding to access the raw methods on +} + +// OperatorRegistryV1TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type OperatorRegistryV1TransactorRaw struct { + Contract *OperatorRegistryV1Transactor // Generic write-only contract binding to access the raw methods on +} + +// NewOperatorRegistryV1 creates a new instance of OperatorRegistryV1, bound to a specific deployed contract. +func NewOperatorRegistryV1(address common.Address, backend bind.ContractBackend) (*OperatorRegistryV1, error) { + contract, err := bindOperatorRegistryV1(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &OperatorRegistryV1{OperatorRegistryV1Caller: OperatorRegistryV1Caller{contract: contract}, OperatorRegistryV1Transactor: OperatorRegistryV1Transactor{contract: contract}, OperatorRegistryV1Filterer: OperatorRegistryV1Filterer{contract: contract}}, nil +} + +// NewOperatorRegistryV1Caller creates a new read-only instance of OperatorRegistryV1, bound to a specific deployed contract. +func NewOperatorRegistryV1Caller(address common.Address, caller bind.ContractCaller) (*OperatorRegistryV1Caller, error) { + contract, err := bindOperatorRegistryV1(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &OperatorRegistryV1Caller{contract: contract}, nil +} + +// NewOperatorRegistryV1Transactor creates a new write-only instance of OperatorRegistryV1, bound to a specific deployed contract. +func NewOperatorRegistryV1Transactor(address common.Address, transactor bind.ContractTransactor) (*OperatorRegistryV1Transactor, error) { + contract, err := bindOperatorRegistryV1(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &OperatorRegistryV1Transactor{contract: contract}, nil +} + +// NewOperatorRegistryV1Filterer creates a new log filterer instance of OperatorRegistryV1, bound to a specific deployed contract. +func NewOperatorRegistryV1Filterer(address common.Address, filterer bind.ContractFilterer) (*OperatorRegistryV1Filterer, error) { + contract, err := bindOperatorRegistryV1(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &OperatorRegistryV1Filterer{contract: contract}, nil +} + +// bindOperatorRegistryV1 binds a generic wrapper to an already deployed contract. +func bindOperatorRegistryV1(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := OperatorRegistryV1MetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_OperatorRegistryV1 *OperatorRegistryV1Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _OperatorRegistryV1.Contract.OperatorRegistryV1Caller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_OperatorRegistryV1 *OperatorRegistryV1Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _OperatorRegistryV1.Contract.OperatorRegistryV1Transactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_OperatorRegistryV1 *OperatorRegistryV1Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _OperatorRegistryV1.Contract.OperatorRegistryV1Transactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_OperatorRegistryV1 *OperatorRegistryV1CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _OperatorRegistryV1.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_OperatorRegistryV1 *OperatorRegistryV1TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _OperatorRegistryV1.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_OperatorRegistryV1 *OperatorRegistryV1TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _OperatorRegistryV1.Contract.contract.Transact(opts, method, params...) +} + +// IsOperator is a free data retrieval call binding the contract method 0x6d70f7ae. +// +// Solidity: function isOperator(address operator) view returns(bool) +func (_OperatorRegistryV1 *OperatorRegistryV1Caller) IsOperator(opts *bind.CallOpts, operator common.Address) (bool, error) { + var out []interface{} + err := _OperatorRegistryV1.contract.Call(opts, &out, "isOperator", operator) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsOperator is a free data retrieval call binding the contract method 0x6d70f7ae. +// +// Solidity: function isOperator(address operator) view returns(bool) +func (_OperatorRegistryV1 *OperatorRegistryV1Session) IsOperator(operator common.Address) (bool, error) { + return _OperatorRegistryV1.Contract.IsOperator(&_OperatorRegistryV1.CallOpts, operator) +} + +// IsOperator is a free data retrieval call binding the contract method 0x6d70f7ae. +// +// Solidity: function isOperator(address operator) view returns(bool) +func (_OperatorRegistryV1 *OperatorRegistryV1CallerSession) IsOperator(operator common.Address) (bool, error) { + return _OperatorRegistryV1.Contract.IsOperator(&_OperatorRegistryV1.CallOpts, operator) +} + +// ApproveOperator is a paid mutator transaction binding the contract method 0x242cae9f. +// +// Solidity: function approveOperator(address operator) returns() +func (_OperatorRegistryV1 *OperatorRegistryV1Transactor) ApproveOperator(opts *bind.TransactOpts, operator common.Address) (*types.Transaction, error) { + return _OperatorRegistryV1.contract.Transact(opts, "approveOperator", operator) +} + +// ApproveOperator is a paid mutator transaction binding the contract method 0x242cae9f. +// +// Solidity: function approveOperator(address operator) returns() +func (_OperatorRegistryV1 *OperatorRegistryV1Session) ApproveOperator(operator common.Address) (*types.Transaction, error) { + return _OperatorRegistryV1.Contract.ApproveOperator(&_OperatorRegistryV1.TransactOpts, operator) +} + +// ApproveOperator is a paid mutator transaction binding the contract method 0x242cae9f. +// +// Solidity: function approveOperator(address operator) returns() +func (_OperatorRegistryV1 *OperatorRegistryV1TransactorSession) ApproveOperator(operator common.Address) (*types.Transaction, error) { + return _OperatorRegistryV1.Contract.ApproveOperator(&_OperatorRegistryV1.TransactOpts, operator) +} + +// RemoveOperator is a paid mutator transaction binding the contract method 0xac8a584a. +// +// Solidity: function removeOperator(address operator) returns() +func (_OperatorRegistryV1 *OperatorRegistryV1Transactor) RemoveOperator(opts *bind.TransactOpts, operator common.Address) (*types.Transaction, error) { + return _OperatorRegistryV1.contract.Transact(opts, "removeOperator", operator) +} + +// RemoveOperator is a paid mutator transaction binding the contract method 0xac8a584a. +// +// Solidity: function removeOperator(address operator) returns() +func (_OperatorRegistryV1 *OperatorRegistryV1Session) RemoveOperator(operator common.Address) (*types.Transaction, error) { + return _OperatorRegistryV1.Contract.RemoveOperator(&_OperatorRegistryV1.TransactOpts, operator) +} + +// RemoveOperator is a paid mutator transaction binding the contract method 0xac8a584a. +// +// Solidity: function removeOperator(address operator) returns() +func (_OperatorRegistryV1 *OperatorRegistryV1TransactorSession) RemoveOperator(operator common.Address) (*types.Transaction, error) { + return _OperatorRegistryV1.Contract.RemoveOperator(&_OperatorRegistryV1.TransactOpts, operator) +} + +// OperatorRegistryV1OperatorAddedIterator is returned from FilterOperatorAdded and is used to iterate over the raw logs and unpacked data for OperatorAdded events raised by the OperatorRegistryV1 contract. +type OperatorRegistryV1OperatorAddedIterator struct { + Event *OperatorRegistryV1OperatorAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *OperatorRegistryV1OperatorAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(OperatorRegistryV1OperatorAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(OperatorRegistryV1OperatorAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *OperatorRegistryV1OperatorAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *OperatorRegistryV1OperatorAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// OperatorRegistryV1OperatorAdded represents a OperatorAdded event raised by the OperatorRegistryV1 contract. +type OperatorRegistryV1OperatorAdded struct { + OperatorAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorAdded is a free log retrieval operation binding the contract event 0xac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d. +// +// Solidity: event OperatorAdded(address indexed operatorAddress) +func (_OperatorRegistryV1 *OperatorRegistryV1Filterer) FilterOperatorAdded(opts *bind.FilterOpts, operatorAddress []common.Address) (*OperatorRegistryV1OperatorAddedIterator, error) { + + var operatorAddressRule []interface{} + for _, operatorAddressItem := range operatorAddress { + operatorAddressRule = append(operatorAddressRule, operatorAddressItem) + } + + logs, sub, err := _OperatorRegistryV1.contract.FilterLogs(opts, "OperatorAdded", operatorAddressRule) + if err != nil { + return nil, err + } + return &OperatorRegistryV1OperatorAddedIterator{contract: _OperatorRegistryV1.contract, event: "OperatorAdded", logs: logs, sub: sub}, nil +} + +// WatchOperatorAdded is a free log subscription operation binding the contract event 0xac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d. +// +// Solidity: event OperatorAdded(address indexed operatorAddress) +func (_OperatorRegistryV1 *OperatorRegistryV1Filterer) WatchOperatorAdded(opts *bind.WatchOpts, sink chan<- *OperatorRegistryV1OperatorAdded, operatorAddress []common.Address) (event.Subscription, error) { + + var operatorAddressRule []interface{} + for _, operatorAddressItem := range operatorAddress { + operatorAddressRule = append(operatorAddressRule, operatorAddressItem) + } + + logs, sub, err := _OperatorRegistryV1.contract.WatchLogs(opts, "OperatorAdded", operatorAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(OperatorRegistryV1OperatorAdded) + if err := _OperatorRegistryV1.contract.UnpackLog(event, "OperatorAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorAdded is a log parse operation binding the contract event 0xac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d. +// +// Solidity: event OperatorAdded(address indexed operatorAddress) +func (_OperatorRegistryV1 *OperatorRegistryV1Filterer) ParseOperatorAdded(log types.Log) (*OperatorRegistryV1OperatorAdded, error) { + event := new(OperatorRegistryV1OperatorAdded) + if err := _OperatorRegistryV1.contract.UnpackLog(event, "OperatorAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// OperatorRegistryV1OperatorRemovedIterator is returned from FilterOperatorRemoved and is used to iterate over the raw logs and unpacked data for OperatorRemoved events raised by the OperatorRegistryV1 contract. +type OperatorRegistryV1OperatorRemovedIterator struct { + Event *OperatorRegistryV1OperatorRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *OperatorRegistryV1OperatorRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(OperatorRegistryV1OperatorRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(OperatorRegistryV1OperatorRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *OperatorRegistryV1OperatorRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *OperatorRegistryV1OperatorRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// OperatorRegistryV1OperatorRemoved represents a OperatorRemoved event raised by the OperatorRegistryV1 contract. +type OperatorRegistryV1OperatorRemoved struct { + OperatorAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorRemoved is a free log retrieval operation binding the contract event 0x80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d. +// +// Solidity: event OperatorRemoved(address indexed operatorAddress) +func (_OperatorRegistryV1 *OperatorRegistryV1Filterer) FilterOperatorRemoved(opts *bind.FilterOpts, operatorAddress []common.Address) (*OperatorRegistryV1OperatorRemovedIterator, error) { + + var operatorAddressRule []interface{} + for _, operatorAddressItem := range operatorAddress { + operatorAddressRule = append(operatorAddressRule, operatorAddressItem) + } + + logs, sub, err := _OperatorRegistryV1.contract.FilterLogs(opts, "OperatorRemoved", operatorAddressRule) + if err != nil { + return nil, err + } + return &OperatorRegistryV1OperatorRemovedIterator{contract: _OperatorRegistryV1.contract, event: "OperatorRemoved", logs: logs, sub: sub}, nil +} + +// WatchOperatorRemoved is a free log subscription operation binding the contract event 0x80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d. +// +// Solidity: event OperatorRemoved(address indexed operatorAddress) +func (_OperatorRegistryV1 *OperatorRegistryV1Filterer) WatchOperatorRemoved(opts *bind.WatchOpts, sink chan<- *OperatorRegistryV1OperatorRemoved, operatorAddress []common.Address) (event.Subscription, error) { + + var operatorAddressRule []interface{} + for _, operatorAddressItem := range operatorAddress { + operatorAddressRule = append(operatorAddressRule, operatorAddressItem) + } + + logs, sub, err := _OperatorRegistryV1.contract.WatchLogs(opts, "OperatorRemoved", operatorAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(OperatorRegistryV1OperatorRemoved) + if err := _OperatorRegistryV1.contract.UnpackLog(event, "OperatorRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorRemoved is a log parse operation binding the contract event 0x80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d. +// +// Solidity: event OperatorRemoved(address indexed operatorAddress) +func (_OperatorRegistryV1 *OperatorRegistryV1Filterer) ParseOperatorRemoved(log types.Log) (*OperatorRegistryV1OperatorRemoved, error) { + event := new(OperatorRegistryV1OperatorRemoved) + if err := _OperatorRegistryV1.contract.UnpackLog(event, "OperatorRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/node/contracts/river_config_v1.go b/core/node/contracts/river_config_v1.go new file mode 100644 index 000000000..714b50a68 --- /dev/null +++ b/core/node/contracts/river_config_v1.go @@ -0,0 +1,842 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contracts + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// Setting is an auto generated low-level Go binding around an user-defined struct. +type Setting struct { + Key [32]byte + BlockNumber uint64 + Value []byte +} + +// RiverConfigV1MetaData contains all meta data concerning the RiverConfigV1 contract. +var RiverConfigV1MetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"approveConfigurationManager\",\"inputs\":[{\"name\":\"manager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"configurationExists\",\"inputs\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deleteConfiguration\",\"inputs\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deleteConfigurationOnBlock\",\"inputs\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllConfiguration\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structSetting[]\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfiguration\",\"inputs\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structSetting[]\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isConfigurationManager\",\"inputs\":[{\"name\":\"manager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeConfigurationManager\",\"inputs\":[{\"name\":\"manager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setConfiguration\",\"inputs\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ConfigurationChanged\",\"inputs\":[{\"name\":\"key\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"block\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"value\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"deleted\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigurationManagerAdded\",\"inputs\":[{\"name\":\"manager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigurationManagerRemoved\",\"inputs\":[{\"name\":\"manager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", +} + +// RiverConfigV1ABI is the input ABI used to generate the binding from. +// Deprecated: Use RiverConfigV1MetaData.ABI instead. +var RiverConfigV1ABI = RiverConfigV1MetaData.ABI + +// RiverConfigV1 is an auto generated Go binding around an Ethereum contract. +type RiverConfigV1 struct { + RiverConfigV1Caller // Read-only binding to the contract + RiverConfigV1Transactor // Write-only binding to the contract + RiverConfigV1Filterer // Log filterer for contract events +} + +// RiverConfigV1Caller is an auto generated read-only Go binding around an Ethereum contract. +type RiverConfigV1Caller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// RiverConfigV1Transactor is an auto generated write-only Go binding around an Ethereum contract. +type RiverConfigV1Transactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// RiverConfigV1Filterer is an auto generated log filtering Go binding around an Ethereum contract events. +type RiverConfigV1Filterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// RiverConfigV1Session is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type RiverConfigV1Session struct { + Contract *RiverConfigV1 // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// RiverConfigV1CallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type RiverConfigV1CallerSession struct { + Contract *RiverConfigV1Caller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// RiverConfigV1TransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type RiverConfigV1TransactorSession struct { + Contract *RiverConfigV1Transactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// RiverConfigV1Raw is an auto generated low-level Go binding around an Ethereum contract. +type RiverConfigV1Raw struct { + Contract *RiverConfigV1 // Generic contract binding to access the raw methods on +} + +// RiverConfigV1CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type RiverConfigV1CallerRaw struct { + Contract *RiverConfigV1Caller // Generic read-only contract binding to access the raw methods on +} + +// RiverConfigV1TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type RiverConfigV1TransactorRaw struct { + Contract *RiverConfigV1Transactor // Generic write-only contract binding to access the raw methods on +} + +// NewRiverConfigV1 creates a new instance of RiverConfigV1, bound to a specific deployed contract. +func NewRiverConfigV1(address common.Address, backend bind.ContractBackend) (*RiverConfigV1, error) { + contract, err := bindRiverConfigV1(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &RiverConfigV1{RiverConfigV1Caller: RiverConfigV1Caller{contract: contract}, RiverConfigV1Transactor: RiverConfigV1Transactor{contract: contract}, RiverConfigV1Filterer: RiverConfigV1Filterer{contract: contract}}, nil +} + +// NewRiverConfigV1Caller creates a new read-only instance of RiverConfigV1, bound to a specific deployed contract. +func NewRiverConfigV1Caller(address common.Address, caller bind.ContractCaller) (*RiverConfigV1Caller, error) { + contract, err := bindRiverConfigV1(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &RiverConfigV1Caller{contract: contract}, nil +} + +// NewRiverConfigV1Transactor creates a new write-only instance of RiverConfigV1, bound to a specific deployed contract. +func NewRiverConfigV1Transactor(address common.Address, transactor bind.ContractTransactor) (*RiverConfigV1Transactor, error) { + contract, err := bindRiverConfigV1(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &RiverConfigV1Transactor{contract: contract}, nil +} + +// NewRiverConfigV1Filterer creates a new log filterer instance of RiverConfigV1, bound to a specific deployed contract. +func NewRiverConfigV1Filterer(address common.Address, filterer bind.ContractFilterer) (*RiverConfigV1Filterer, error) { + contract, err := bindRiverConfigV1(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &RiverConfigV1Filterer{contract: contract}, nil +} + +// bindRiverConfigV1 binds a generic wrapper to an already deployed contract. +func bindRiverConfigV1(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := RiverConfigV1MetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_RiverConfigV1 *RiverConfigV1Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _RiverConfigV1.Contract.RiverConfigV1Caller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_RiverConfigV1 *RiverConfigV1Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RiverConfigV1.Contract.RiverConfigV1Transactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_RiverConfigV1 *RiverConfigV1Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _RiverConfigV1.Contract.RiverConfigV1Transactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_RiverConfigV1 *RiverConfigV1CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _RiverConfigV1.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_RiverConfigV1 *RiverConfigV1TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RiverConfigV1.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_RiverConfigV1 *RiverConfigV1TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _RiverConfigV1.Contract.contract.Transact(opts, method, params...) +} + +// ConfigurationExists is a free data retrieval call binding the contract method 0xfc207c01. +// +// Solidity: function configurationExists(bytes32 key) view returns(bool) +func (_RiverConfigV1 *RiverConfigV1Caller) ConfigurationExists(opts *bind.CallOpts, key [32]byte) (bool, error) { + var out []interface{} + err := _RiverConfigV1.contract.Call(opts, &out, "configurationExists", key) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// ConfigurationExists is a free data retrieval call binding the contract method 0xfc207c01. +// +// Solidity: function configurationExists(bytes32 key) view returns(bool) +func (_RiverConfigV1 *RiverConfigV1Session) ConfigurationExists(key [32]byte) (bool, error) { + return _RiverConfigV1.Contract.ConfigurationExists(&_RiverConfigV1.CallOpts, key) +} + +// ConfigurationExists is a free data retrieval call binding the contract method 0xfc207c01. +// +// Solidity: function configurationExists(bytes32 key) view returns(bool) +func (_RiverConfigV1 *RiverConfigV1CallerSession) ConfigurationExists(key [32]byte) (bool, error) { + return _RiverConfigV1.Contract.ConfigurationExists(&_RiverConfigV1.CallOpts, key) +} + +// GetAllConfiguration is a free data retrieval call binding the contract method 0x081814db. +// +// Solidity: function getAllConfiguration() view returns((bytes32,uint64,bytes)[]) +func (_RiverConfigV1 *RiverConfigV1Caller) GetAllConfiguration(opts *bind.CallOpts) ([]Setting, error) { + var out []interface{} + err := _RiverConfigV1.contract.Call(opts, &out, "getAllConfiguration") + + if err != nil { + return *new([]Setting), err + } + + out0 := *abi.ConvertType(out[0], new([]Setting)).(*[]Setting) + + return out0, err + +} + +// GetAllConfiguration is a free data retrieval call binding the contract method 0x081814db. +// +// Solidity: function getAllConfiguration() view returns((bytes32,uint64,bytes)[]) +func (_RiverConfigV1 *RiverConfigV1Session) GetAllConfiguration() ([]Setting, error) { + return _RiverConfigV1.Contract.GetAllConfiguration(&_RiverConfigV1.CallOpts) +} + +// GetAllConfiguration is a free data retrieval call binding the contract method 0x081814db. +// +// Solidity: function getAllConfiguration() view returns((bytes32,uint64,bytes)[]) +func (_RiverConfigV1 *RiverConfigV1CallerSession) GetAllConfiguration() ([]Setting, error) { + return _RiverConfigV1.Contract.GetAllConfiguration(&_RiverConfigV1.CallOpts) +} + +// GetConfiguration is a free data retrieval call binding the contract method 0x9283ae3a. +// +// Solidity: function getConfiguration(bytes32 key) view returns((bytes32,uint64,bytes)[]) +func (_RiverConfigV1 *RiverConfigV1Caller) GetConfiguration(opts *bind.CallOpts, key [32]byte) ([]Setting, error) { + var out []interface{} + err := _RiverConfigV1.contract.Call(opts, &out, "getConfiguration", key) + + if err != nil { + return *new([]Setting), err + } + + out0 := *abi.ConvertType(out[0], new([]Setting)).(*[]Setting) + + return out0, err + +} + +// GetConfiguration is a free data retrieval call binding the contract method 0x9283ae3a. +// +// Solidity: function getConfiguration(bytes32 key) view returns((bytes32,uint64,bytes)[]) +func (_RiverConfigV1 *RiverConfigV1Session) GetConfiguration(key [32]byte) ([]Setting, error) { + return _RiverConfigV1.Contract.GetConfiguration(&_RiverConfigV1.CallOpts, key) +} + +// GetConfiguration is a free data retrieval call binding the contract method 0x9283ae3a. +// +// Solidity: function getConfiguration(bytes32 key) view returns((bytes32,uint64,bytes)[]) +func (_RiverConfigV1 *RiverConfigV1CallerSession) GetConfiguration(key [32]byte) ([]Setting, error) { + return _RiverConfigV1.Contract.GetConfiguration(&_RiverConfigV1.CallOpts, key) +} + +// IsConfigurationManager is a free data retrieval call binding the contract method 0xd4bd44a0. +// +// Solidity: function isConfigurationManager(address manager) view returns(bool) +func (_RiverConfigV1 *RiverConfigV1Caller) IsConfigurationManager(opts *bind.CallOpts, manager common.Address) (bool, error) { + var out []interface{} + err := _RiverConfigV1.contract.Call(opts, &out, "isConfigurationManager", manager) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsConfigurationManager is a free data retrieval call binding the contract method 0xd4bd44a0. +// +// Solidity: function isConfigurationManager(address manager) view returns(bool) +func (_RiverConfigV1 *RiverConfigV1Session) IsConfigurationManager(manager common.Address) (bool, error) { + return _RiverConfigV1.Contract.IsConfigurationManager(&_RiverConfigV1.CallOpts, manager) +} + +// IsConfigurationManager is a free data retrieval call binding the contract method 0xd4bd44a0. +// +// Solidity: function isConfigurationManager(address manager) view returns(bool) +func (_RiverConfigV1 *RiverConfigV1CallerSession) IsConfigurationManager(manager common.Address) (bool, error) { + return _RiverConfigV1.Contract.IsConfigurationManager(&_RiverConfigV1.CallOpts, manager) +} + +// ApproveConfigurationManager is a paid mutator transaction binding the contract method 0xc179b85f. +// +// Solidity: function approveConfigurationManager(address manager) returns() +func (_RiverConfigV1 *RiverConfigV1Transactor) ApproveConfigurationManager(opts *bind.TransactOpts, manager common.Address) (*types.Transaction, error) { + return _RiverConfigV1.contract.Transact(opts, "approveConfigurationManager", manager) +} + +// ApproveConfigurationManager is a paid mutator transaction binding the contract method 0xc179b85f. +// +// Solidity: function approveConfigurationManager(address manager) returns() +func (_RiverConfigV1 *RiverConfigV1Session) ApproveConfigurationManager(manager common.Address) (*types.Transaction, error) { + return _RiverConfigV1.Contract.ApproveConfigurationManager(&_RiverConfigV1.TransactOpts, manager) +} + +// ApproveConfigurationManager is a paid mutator transaction binding the contract method 0xc179b85f. +// +// Solidity: function approveConfigurationManager(address manager) returns() +func (_RiverConfigV1 *RiverConfigV1TransactorSession) ApproveConfigurationManager(manager common.Address) (*types.Transaction, error) { + return _RiverConfigV1.Contract.ApproveConfigurationManager(&_RiverConfigV1.TransactOpts, manager) +} + +// DeleteConfiguration is a paid mutator transaction binding the contract method 0x035759e1. +// +// Solidity: function deleteConfiguration(bytes32 key) returns() +func (_RiverConfigV1 *RiverConfigV1Transactor) DeleteConfiguration(opts *bind.TransactOpts, key [32]byte) (*types.Transaction, error) { + return _RiverConfigV1.contract.Transact(opts, "deleteConfiguration", key) +} + +// DeleteConfiguration is a paid mutator transaction binding the contract method 0x035759e1. +// +// Solidity: function deleteConfiguration(bytes32 key) returns() +func (_RiverConfigV1 *RiverConfigV1Session) DeleteConfiguration(key [32]byte) (*types.Transaction, error) { + return _RiverConfigV1.Contract.DeleteConfiguration(&_RiverConfigV1.TransactOpts, key) +} + +// DeleteConfiguration is a paid mutator transaction binding the contract method 0x035759e1. +// +// Solidity: function deleteConfiguration(bytes32 key) returns() +func (_RiverConfigV1 *RiverConfigV1TransactorSession) DeleteConfiguration(key [32]byte) (*types.Transaction, error) { + return _RiverConfigV1.Contract.DeleteConfiguration(&_RiverConfigV1.TransactOpts, key) +} + +// DeleteConfigurationOnBlock is a paid mutator transaction binding the contract method 0xb7f227ee. +// +// Solidity: function deleteConfigurationOnBlock(bytes32 key, uint64 blockNumber) returns() +func (_RiverConfigV1 *RiverConfigV1Transactor) DeleteConfigurationOnBlock(opts *bind.TransactOpts, key [32]byte, blockNumber uint64) (*types.Transaction, error) { + return _RiverConfigV1.contract.Transact(opts, "deleteConfigurationOnBlock", key, blockNumber) +} + +// DeleteConfigurationOnBlock is a paid mutator transaction binding the contract method 0xb7f227ee. +// +// Solidity: function deleteConfigurationOnBlock(bytes32 key, uint64 blockNumber) returns() +func (_RiverConfigV1 *RiverConfigV1Session) DeleteConfigurationOnBlock(key [32]byte, blockNumber uint64) (*types.Transaction, error) { + return _RiverConfigV1.Contract.DeleteConfigurationOnBlock(&_RiverConfigV1.TransactOpts, key, blockNumber) +} + +// DeleteConfigurationOnBlock is a paid mutator transaction binding the contract method 0xb7f227ee. +// +// Solidity: function deleteConfigurationOnBlock(bytes32 key, uint64 blockNumber) returns() +func (_RiverConfigV1 *RiverConfigV1TransactorSession) DeleteConfigurationOnBlock(key [32]byte, blockNumber uint64) (*types.Transaction, error) { + return _RiverConfigV1.Contract.DeleteConfigurationOnBlock(&_RiverConfigV1.TransactOpts, key, blockNumber) +} + +// RemoveConfigurationManager is a paid mutator transaction binding the contract method 0x813049ec. +// +// Solidity: function removeConfigurationManager(address manager) returns() +func (_RiverConfigV1 *RiverConfigV1Transactor) RemoveConfigurationManager(opts *bind.TransactOpts, manager common.Address) (*types.Transaction, error) { + return _RiverConfigV1.contract.Transact(opts, "removeConfigurationManager", manager) +} + +// RemoveConfigurationManager is a paid mutator transaction binding the contract method 0x813049ec. +// +// Solidity: function removeConfigurationManager(address manager) returns() +func (_RiverConfigV1 *RiverConfigV1Session) RemoveConfigurationManager(manager common.Address) (*types.Transaction, error) { + return _RiverConfigV1.Contract.RemoveConfigurationManager(&_RiverConfigV1.TransactOpts, manager) +} + +// RemoveConfigurationManager is a paid mutator transaction binding the contract method 0x813049ec. +// +// Solidity: function removeConfigurationManager(address manager) returns() +func (_RiverConfigV1 *RiverConfigV1TransactorSession) RemoveConfigurationManager(manager common.Address) (*types.Transaction, error) { + return _RiverConfigV1.Contract.RemoveConfigurationManager(&_RiverConfigV1.TransactOpts, manager) +} + +// SetConfiguration is a paid mutator transaction binding the contract method 0xa09449a6. +// +// Solidity: function setConfiguration(bytes32 key, uint64 blockNumber, bytes value) returns() +func (_RiverConfigV1 *RiverConfigV1Transactor) SetConfiguration(opts *bind.TransactOpts, key [32]byte, blockNumber uint64, value []byte) (*types.Transaction, error) { + return _RiverConfigV1.contract.Transact(opts, "setConfiguration", key, blockNumber, value) +} + +// SetConfiguration is a paid mutator transaction binding the contract method 0xa09449a6. +// +// Solidity: function setConfiguration(bytes32 key, uint64 blockNumber, bytes value) returns() +func (_RiverConfigV1 *RiverConfigV1Session) SetConfiguration(key [32]byte, blockNumber uint64, value []byte) (*types.Transaction, error) { + return _RiverConfigV1.Contract.SetConfiguration(&_RiverConfigV1.TransactOpts, key, blockNumber, value) +} + +// SetConfiguration is a paid mutator transaction binding the contract method 0xa09449a6. +// +// Solidity: function setConfiguration(bytes32 key, uint64 blockNumber, bytes value) returns() +func (_RiverConfigV1 *RiverConfigV1TransactorSession) SetConfiguration(key [32]byte, blockNumber uint64, value []byte) (*types.Transaction, error) { + return _RiverConfigV1.Contract.SetConfiguration(&_RiverConfigV1.TransactOpts, key, blockNumber, value) +} + +// RiverConfigV1ConfigurationChangedIterator is returned from FilterConfigurationChanged and is used to iterate over the raw logs and unpacked data for ConfigurationChanged events raised by the RiverConfigV1 contract. +type RiverConfigV1ConfigurationChangedIterator struct { + Event *RiverConfigV1ConfigurationChanged // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *RiverConfigV1ConfigurationChangedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(RiverConfigV1ConfigurationChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(RiverConfigV1ConfigurationChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *RiverConfigV1ConfigurationChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *RiverConfigV1ConfigurationChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// RiverConfigV1ConfigurationChanged represents a ConfigurationChanged event raised by the RiverConfigV1 contract. +type RiverConfigV1ConfigurationChanged struct { + Key [32]byte + Block uint64 + Value []byte + Deleted bool + Raw types.Log // Blockchain specific contextual infos +} + +// FilterConfigurationChanged is a free log retrieval operation binding the contract event 0xc01483261a841a868b99cb8802faed4ea44a1a816651c4f7ee061a96a205fe98. +// +// Solidity: event ConfigurationChanged(bytes32 key, uint64 block, bytes value, bool deleted) +func (_RiverConfigV1 *RiverConfigV1Filterer) FilterConfigurationChanged(opts *bind.FilterOpts) (*RiverConfigV1ConfigurationChangedIterator, error) { + + logs, sub, err := _RiverConfigV1.contract.FilterLogs(opts, "ConfigurationChanged") + if err != nil { + return nil, err + } + return &RiverConfigV1ConfigurationChangedIterator{contract: _RiverConfigV1.contract, event: "ConfigurationChanged", logs: logs, sub: sub}, nil +} + +// WatchConfigurationChanged is a free log subscription operation binding the contract event 0xc01483261a841a868b99cb8802faed4ea44a1a816651c4f7ee061a96a205fe98. +// +// Solidity: event ConfigurationChanged(bytes32 key, uint64 block, bytes value, bool deleted) +func (_RiverConfigV1 *RiverConfigV1Filterer) WatchConfigurationChanged(opts *bind.WatchOpts, sink chan<- *RiverConfigV1ConfigurationChanged) (event.Subscription, error) { + + logs, sub, err := _RiverConfigV1.contract.WatchLogs(opts, "ConfigurationChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(RiverConfigV1ConfigurationChanged) + if err := _RiverConfigV1.contract.UnpackLog(event, "ConfigurationChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseConfigurationChanged is a log parse operation binding the contract event 0xc01483261a841a868b99cb8802faed4ea44a1a816651c4f7ee061a96a205fe98. +// +// Solidity: event ConfigurationChanged(bytes32 key, uint64 block, bytes value, bool deleted) +func (_RiverConfigV1 *RiverConfigV1Filterer) ParseConfigurationChanged(log types.Log) (*RiverConfigV1ConfigurationChanged, error) { + event := new(RiverConfigV1ConfigurationChanged) + if err := _RiverConfigV1.contract.UnpackLog(event, "ConfigurationChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// RiverConfigV1ConfigurationManagerAddedIterator is returned from FilterConfigurationManagerAdded and is used to iterate over the raw logs and unpacked data for ConfigurationManagerAdded events raised by the RiverConfigV1 contract. +type RiverConfigV1ConfigurationManagerAddedIterator struct { + Event *RiverConfigV1ConfigurationManagerAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *RiverConfigV1ConfigurationManagerAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(RiverConfigV1ConfigurationManagerAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(RiverConfigV1ConfigurationManagerAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *RiverConfigV1ConfigurationManagerAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *RiverConfigV1ConfigurationManagerAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// RiverConfigV1ConfigurationManagerAdded represents a ConfigurationManagerAdded event raised by the RiverConfigV1 contract. +type RiverConfigV1ConfigurationManagerAdded struct { + Manager common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterConfigurationManagerAdded is a free log retrieval operation binding the contract event 0x7afd798379ae2d2e5035438544cea2b60eb1dde6a8128e6d447fd2a25f8825a2. +// +// Solidity: event ConfigurationManagerAdded(address indexed manager) +func (_RiverConfigV1 *RiverConfigV1Filterer) FilterConfigurationManagerAdded(opts *bind.FilterOpts, manager []common.Address) (*RiverConfigV1ConfigurationManagerAddedIterator, error) { + + var managerRule []interface{} + for _, managerItem := range manager { + managerRule = append(managerRule, managerItem) + } + + logs, sub, err := _RiverConfigV1.contract.FilterLogs(opts, "ConfigurationManagerAdded", managerRule) + if err != nil { + return nil, err + } + return &RiverConfigV1ConfigurationManagerAddedIterator{contract: _RiverConfigV1.contract, event: "ConfigurationManagerAdded", logs: logs, sub: sub}, nil +} + +// WatchConfigurationManagerAdded is a free log subscription operation binding the contract event 0x7afd798379ae2d2e5035438544cea2b60eb1dde6a8128e6d447fd2a25f8825a2. +// +// Solidity: event ConfigurationManagerAdded(address indexed manager) +func (_RiverConfigV1 *RiverConfigV1Filterer) WatchConfigurationManagerAdded(opts *bind.WatchOpts, sink chan<- *RiverConfigV1ConfigurationManagerAdded, manager []common.Address) (event.Subscription, error) { + + var managerRule []interface{} + for _, managerItem := range manager { + managerRule = append(managerRule, managerItem) + } + + logs, sub, err := _RiverConfigV1.contract.WatchLogs(opts, "ConfigurationManagerAdded", managerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(RiverConfigV1ConfigurationManagerAdded) + if err := _RiverConfigV1.contract.UnpackLog(event, "ConfigurationManagerAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseConfigurationManagerAdded is a log parse operation binding the contract event 0x7afd798379ae2d2e5035438544cea2b60eb1dde6a8128e6d447fd2a25f8825a2. +// +// Solidity: event ConfigurationManagerAdded(address indexed manager) +func (_RiverConfigV1 *RiverConfigV1Filterer) ParseConfigurationManagerAdded(log types.Log) (*RiverConfigV1ConfigurationManagerAdded, error) { + event := new(RiverConfigV1ConfigurationManagerAdded) + if err := _RiverConfigV1.contract.UnpackLog(event, "ConfigurationManagerAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// RiverConfigV1ConfigurationManagerRemovedIterator is returned from FilterConfigurationManagerRemoved and is used to iterate over the raw logs and unpacked data for ConfigurationManagerRemoved events raised by the RiverConfigV1 contract. +type RiverConfigV1ConfigurationManagerRemovedIterator struct { + Event *RiverConfigV1ConfigurationManagerRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *RiverConfigV1ConfigurationManagerRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(RiverConfigV1ConfigurationManagerRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(RiverConfigV1ConfigurationManagerRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *RiverConfigV1ConfigurationManagerRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *RiverConfigV1ConfigurationManagerRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// RiverConfigV1ConfigurationManagerRemoved represents a ConfigurationManagerRemoved event raised by the RiverConfigV1 contract. +type RiverConfigV1ConfigurationManagerRemoved struct { + Manager common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterConfigurationManagerRemoved is a free log retrieval operation binding the contract event 0xf9889c857e5356066b564327caa757c325ecbc001b2b47d72edf8cf9aedb1be5. +// +// Solidity: event ConfigurationManagerRemoved(address indexed manager) +func (_RiverConfigV1 *RiverConfigV1Filterer) FilterConfigurationManagerRemoved(opts *bind.FilterOpts, manager []common.Address) (*RiverConfigV1ConfigurationManagerRemovedIterator, error) { + + var managerRule []interface{} + for _, managerItem := range manager { + managerRule = append(managerRule, managerItem) + } + + logs, sub, err := _RiverConfigV1.contract.FilterLogs(opts, "ConfigurationManagerRemoved", managerRule) + if err != nil { + return nil, err + } + return &RiverConfigV1ConfigurationManagerRemovedIterator{contract: _RiverConfigV1.contract, event: "ConfigurationManagerRemoved", logs: logs, sub: sub}, nil +} + +// WatchConfigurationManagerRemoved is a free log subscription operation binding the contract event 0xf9889c857e5356066b564327caa757c325ecbc001b2b47d72edf8cf9aedb1be5. +// +// Solidity: event ConfigurationManagerRemoved(address indexed manager) +func (_RiverConfigV1 *RiverConfigV1Filterer) WatchConfigurationManagerRemoved(opts *bind.WatchOpts, sink chan<- *RiverConfigV1ConfigurationManagerRemoved, manager []common.Address) (event.Subscription, error) { + + var managerRule []interface{} + for _, managerItem := range manager { + managerRule = append(managerRule, managerItem) + } + + logs, sub, err := _RiverConfigV1.contract.WatchLogs(opts, "ConfigurationManagerRemoved", managerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(RiverConfigV1ConfigurationManagerRemoved) + if err := _RiverConfigV1.contract.UnpackLog(event, "ConfigurationManagerRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseConfigurationManagerRemoved is a log parse operation binding the contract event 0xf9889c857e5356066b564327caa757c325ecbc001b2b47d72edf8cf9aedb1be5. +// +// Solidity: event ConfigurationManagerRemoved(address indexed manager) +func (_RiverConfigV1 *RiverConfigV1Filterer) ParseConfigurationManagerRemoved(log types.Log) (*RiverConfigV1ConfigurationManagerRemoved, error) { + event := new(RiverConfigV1ConfigurationManagerRemoved) + if err := _RiverConfigV1.contract.UnpackLog(event, "ConfigurationManagerRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/node/contracts/river_config_v1_ex.go b/core/node/contracts/river_config_v1_ex.go new file mode 100644 index 000000000..030ba2291 --- /dev/null +++ b/core/node/contracts/river_config_v1_ex.go @@ -0,0 +1,7 @@ +package contracts + +import "github.com/ethereum/go-ethereum/accounts/abi/bind" + +func (_RiverConfigRegistryV1 *RiverConfigV1Caller) BoundContract() *bind.BoundContract { + return _RiverConfigRegistryV1.contract +} diff --git a/core/node/contracts/stream_registry_v1.go b/core/node/contracts/stream_registry_v1.go new file mode 100644 index 000000000..da42c5df0 --- /dev/null +++ b/core/node/contracts/stream_registry_v1.go @@ -0,0 +1,1108 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contracts + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// SetMiniblock is an auto generated low-level Go binding around an user-defined struct. +type SetMiniblock struct { + StreamId [32]byte + PrevMiniBlockHash [32]byte + LastMiniblockHash [32]byte + LastMiniblockNum uint64 + IsSealed bool +} + +// Stream is an auto generated low-level Go binding around an user-defined struct. +type Stream struct { + LastMiniblockHash [32]byte + LastMiniblockNum uint64 + Reserved0 uint64 + Flags uint64 + Nodes []common.Address +} + +// StreamWithId is an auto generated low-level Go binding around an user-defined struct. +type StreamWithId struct { + Id [32]byte + Stream Stream +} + +// StreamRegistryV1MetaData contains all meta data concerning the StreamRegistryV1 contract. +var StreamRegistryV1MetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"allocateStream\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"genesisMiniblockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"genesisMiniblock\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllStreamIds\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllStreams\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structStreamWithId[]\",\"components\":[{\"name\":\"id\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stream\",\"type\":\"tuple\",\"internalType\":\"structStream\",\"components\":[{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"reserved0\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"flags\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPaginatedStreams\",\"inputs\":[{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stop\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structStreamWithId[]\",\"components\":[{\"name\":\"id\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stream\",\"type\":\"tuple\",\"internalType\":\"structStream\",\"components\":[{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"reserved0\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"flags\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStream\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structStream\",\"components\":[{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"reserved0\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"flags\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStreamByIndex\",\"inputs\":[{\"name\":\"i\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structStreamWithId\",\"components\":[{\"name\":\"id\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stream\",\"type\":\"tuple\",\"internalType\":\"structStream\",\"components\":[{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"reserved0\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"flags\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStreamCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStreamWithGenesis\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structStream\",\"components\":[{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"reserved0\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"flags\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStreamsOnNode\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structStreamWithId[]\",\"components\":[{\"name\":\"id\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stream\",\"type\":\"tuple\",\"internalType\":\"structStream\",\"components\":[{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"reserved0\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"flags\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"placeStreamOnNode\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStreamFromNode\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nodeAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStreamLastMiniblock\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prevMiniBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isSealed\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStreamLastMiniblockBatch\",\"inputs\":[{\"name\":\"miniblocks\",\"type\":\"tuple[]\",\"internalType\":\"structSetMiniblock[]\",\"components\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prevMiniBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isSealed\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"StreamAllocated\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"genesisMiniblockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"genesisMiniblock\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StreamLastMiniblockUpdateFailed\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"reason\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StreamLastMiniblockUpdated\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"lastMiniblockNum\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"isSealed\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StreamPlacementUpdated\",\"inputs\":[{\"name\":\"streamId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"nodeAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"isAdded\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false}]", +} + +// StreamRegistryV1ABI is the input ABI used to generate the binding from. +// Deprecated: Use StreamRegistryV1MetaData.ABI instead. +var StreamRegistryV1ABI = StreamRegistryV1MetaData.ABI + +// StreamRegistryV1 is an auto generated Go binding around an Ethereum contract. +type StreamRegistryV1 struct { + StreamRegistryV1Caller // Read-only binding to the contract + StreamRegistryV1Transactor // Write-only binding to the contract + StreamRegistryV1Filterer // Log filterer for contract events +} + +// StreamRegistryV1Caller is an auto generated read-only Go binding around an Ethereum contract. +type StreamRegistryV1Caller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// StreamRegistryV1Transactor is an auto generated write-only Go binding around an Ethereum contract. +type StreamRegistryV1Transactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// StreamRegistryV1Filterer is an auto generated log filtering Go binding around an Ethereum contract events. +type StreamRegistryV1Filterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// StreamRegistryV1Session is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type StreamRegistryV1Session struct { + Contract *StreamRegistryV1 // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// StreamRegistryV1CallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type StreamRegistryV1CallerSession struct { + Contract *StreamRegistryV1Caller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// StreamRegistryV1TransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type StreamRegistryV1TransactorSession struct { + Contract *StreamRegistryV1Transactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// StreamRegistryV1Raw is an auto generated low-level Go binding around an Ethereum contract. +type StreamRegistryV1Raw struct { + Contract *StreamRegistryV1 // Generic contract binding to access the raw methods on +} + +// StreamRegistryV1CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type StreamRegistryV1CallerRaw struct { + Contract *StreamRegistryV1Caller // Generic read-only contract binding to access the raw methods on +} + +// StreamRegistryV1TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type StreamRegistryV1TransactorRaw struct { + Contract *StreamRegistryV1Transactor // Generic write-only contract binding to access the raw methods on +} + +// NewStreamRegistryV1 creates a new instance of StreamRegistryV1, bound to a specific deployed contract. +func NewStreamRegistryV1(address common.Address, backend bind.ContractBackend) (*StreamRegistryV1, error) { + contract, err := bindStreamRegistryV1(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &StreamRegistryV1{StreamRegistryV1Caller: StreamRegistryV1Caller{contract: contract}, StreamRegistryV1Transactor: StreamRegistryV1Transactor{contract: contract}, StreamRegistryV1Filterer: StreamRegistryV1Filterer{contract: contract}}, nil +} + +// NewStreamRegistryV1Caller creates a new read-only instance of StreamRegistryV1, bound to a specific deployed contract. +func NewStreamRegistryV1Caller(address common.Address, caller bind.ContractCaller) (*StreamRegistryV1Caller, error) { + contract, err := bindStreamRegistryV1(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &StreamRegistryV1Caller{contract: contract}, nil +} + +// NewStreamRegistryV1Transactor creates a new write-only instance of StreamRegistryV1, bound to a specific deployed contract. +func NewStreamRegistryV1Transactor(address common.Address, transactor bind.ContractTransactor) (*StreamRegistryV1Transactor, error) { + contract, err := bindStreamRegistryV1(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &StreamRegistryV1Transactor{contract: contract}, nil +} + +// NewStreamRegistryV1Filterer creates a new log filterer instance of StreamRegistryV1, bound to a specific deployed contract. +func NewStreamRegistryV1Filterer(address common.Address, filterer bind.ContractFilterer) (*StreamRegistryV1Filterer, error) { + contract, err := bindStreamRegistryV1(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &StreamRegistryV1Filterer{contract: contract}, nil +} + +// bindStreamRegistryV1 binds a generic wrapper to an already deployed contract. +func bindStreamRegistryV1(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := StreamRegistryV1MetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_StreamRegistryV1 *StreamRegistryV1Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _StreamRegistryV1.Contract.StreamRegistryV1Caller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_StreamRegistryV1 *StreamRegistryV1Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _StreamRegistryV1.Contract.StreamRegistryV1Transactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_StreamRegistryV1 *StreamRegistryV1Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _StreamRegistryV1.Contract.StreamRegistryV1Transactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_StreamRegistryV1 *StreamRegistryV1CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _StreamRegistryV1.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_StreamRegistryV1 *StreamRegistryV1TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _StreamRegistryV1.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_StreamRegistryV1 *StreamRegistryV1TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _StreamRegistryV1.Contract.contract.Transact(opts, method, params...) +} + +// GetAllStreamIds is a free data retrieval call binding the contract method 0x86789fc6. +// +// Solidity: function getAllStreamIds() view returns(bytes32[]) +func (_StreamRegistryV1 *StreamRegistryV1Caller) GetAllStreamIds(opts *bind.CallOpts) ([][32]byte, error) { + var out []interface{} + err := _StreamRegistryV1.contract.Call(opts, &out, "getAllStreamIds") + + if err != nil { + return *new([][32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([][32]byte)).(*[][32]byte) + + return out0, err + +} + +// GetAllStreamIds is a free data retrieval call binding the contract method 0x86789fc6. +// +// Solidity: function getAllStreamIds() view returns(bytes32[]) +func (_StreamRegistryV1 *StreamRegistryV1Session) GetAllStreamIds() ([][32]byte, error) { + return _StreamRegistryV1.Contract.GetAllStreamIds(&_StreamRegistryV1.CallOpts) +} + +// GetAllStreamIds is a free data retrieval call binding the contract method 0x86789fc6. +// +// Solidity: function getAllStreamIds() view returns(bytes32[]) +func (_StreamRegistryV1 *StreamRegistryV1CallerSession) GetAllStreamIds() ([][32]byte, error) { + return _StreamRegistryV1.Contract.GetAllStreamIds(&_StreamRegistryV1.CallOpts) +} + +// GetAllStreams is a free data retrieval call binding the contract method 0x3bd84c0c. +// +// Solidity: function getAllStreams() view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))[]) +func (_StreamRegistryV1 *StreamRegistryV1Caller) GetAllStreams(opts *bind.CallOpts) ([]StreamWithId, error) { + var out []interface{} + err := _StreamRegistryV1.contract.Call(opts, &out, "getAllStreams") + + if err != nil { + return *new([]StreamWithId), err + } + + out0 := *abi.ConvertType(out[0], new([]StreamWithId)).(*[]StreamWithId) + + return out0, err + +} + +// GetAllStreams is a free data retrieval call binding the contract method 0x3bd84c0c. +// +// Solidity: function getAllStreams() view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))[]) +func (_StreamRegistryV1 *StreamRegistryV1Session) GetAllStreams() ([]StreamWithId, error) { + return _StreamRegistryV1.Contract.GetAllStreams(&_StreamRegistryV1.CallOpts) +} + +// GetAllStreams is a free data retrieval call binding the contract method 0x3bd84c0c. +// +// Solidity: function getAllStreams() view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))[]) +func (_StreamRegistryV1 *StreamRegistryV1CallerSession) GetAllStreams() ([]StreamWithId, error) { + return _StreamRegistryV1.Contract.GetAllStreams(&_StreamRegistryV1.CallOpts) +} + +// GetPaginatedStreams is a free data retrieval call binding the contract method 0xca78c41a. +// +// Solidity: function getPaginatedStreams(uint256 start, uint256 stop) view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))[], bool) +func (_StreamRegistryV1 *StreamRegistryV1Caller) GetPaginatedStreams(opts *bind.CallOpts, start *big.Int, stop *big.Int) ([]StreamWithId, bool, error) { + var out []interface{} + err := _StreamRegistryV1.contract.Call(opts, &out, "getPaginatedStreams", start, stop) + + if err != nil { + return *new([]StreamWithId), *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new([]StreamWithId)).(*[]StreamWithId) + out1 := *abi.ConvertType(out[1], new(bool)).(*bool) + + return out0, out1, err + +} + +// GetPaginatedStreams is a free data retrieval call binding the contract method 0xca78c41a. +// +// Solidity: function getPaginatedStreams(uint256 start, uint256 stop) view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))[], bool) +func (_StreamRegistryV1 *StreamRegistryV1Session) GetPaginatedStreams(start *big.Int, stop *big.Int) ([]StreamWithId, bool, error) { + return _StreamRegistryV1.Contract.GetPaginatedStreams(&_StreamRegistryV1.CallOpts, start, stop) +} + +// GetPaginatedStreams is a free data retrieval call binding the contract method 0xca78c41a. +// +// Solidity: function getPaginatedStreams(uint256 start, uint256 stop) view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))[], bool) +func (_StreamRegistryV1 *StreamRegistryV1CallerSession) GetPaginatedStreams(start *big.Int, stop *big.Int) ([]StreamWithId, bool, error) { + return _StreamRegistryV1.Contract.GetPaginatedStreams(&_StreamRegistryV1.CallOpts, start, stop) +} + +// GetStream is a free data retrieval call binding the contract method 0x1290abe8. +// +// Solidity: function getStream(bytes32 streamId) view returns((bytes32,uint64,uint64,uint64,address[])) +func (_StreamRegistryV1 *StreamRegistryV1Caller) GetStream(opts *bind.CallOpts, streamId [32]byte) (Stream, error) { + var out []interface{} + err := _StreamRegistryV1.contract.Call(opts, &out, "getStream", streamId) + + if err != nil { + return *new(Stream), err + } + + out0 := *abi.ConvertType(out[0], new(Stream)).(*Stream) + + return out0, err + +} + +// GetStream is a free data retrieval call binding the contract method 0x1290abe8. +// +// Solidity: function getStream(bytes32 streamId) view returns((bytes32,uint64,uint64,uint64,address[])) +func (_StreamRegistryV1 *StreamRegistryV1Session) GetStream(streamId [32]byte) (Stream, error) { + return _StreamRegistryV1.Contract.GetStream(&_StreamRegistryV1.CallOpts, streamId) +} + +// GetStream is a free data retrieval call binding the contract method 0x1290abe8. +// +// Solidity: function getStream(bytes32 streamId) view returns((bytes32,uint64,uint64,uint64,address[])) +func (_StreamRegistryV1 *StreamRegistryV1CallerSession) GetStream(streamId [32]byte) (Stream, error) { + return _StreamRegistryV1.Contract.GetStream(&_StreamRegistryV1.CallOpts, streamId) +} + +// GetStreamByIndex is a free data retrieval call binding the contract method 0x68b454df. +// +// Solidity: function getStreamByIndex(uint256 i) view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))) +func (_StreamRegistryV1 *StreamRegistryV1Caller) GetStreamByIndex(opts *bind.CallOpts, i *big.Int) (StreamWithId, error) { + var out []interface{} + err := _StreamRegistryV1.contract.Call(opts, &out, "getStreamByIndex", i) + + if err != nil { + return *new(StreamWithId), err + } + + out0 := *abi.ConvertType(out[0], new(StreamWithId)).(*StreamWithId) + + return out0, err + +} + +// GetStreamByIndex is a free data retrieval call binding the contract method 0x68b454df. +// +// Solidity: function getStreamByIndex(uint256 i) view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))) +func (_StreamRegistryV1 *StreamRegistryV1Session) GetStreamByIndex(i *big.Int) (StreamWithId, error) { + return _StreamRegistryV1.Contract.GetStreamByIndex(&_StreamRegistryV1.CallOpts, i) +} + +// GetStreamByIndex is a free data retrieval call binding the contract method 0x68b454df. +// +// Solidity: function getStreamByIndex(uint256 i) view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))) +func (_StreamRegistryV1 *StreamRegistryV1CallerSession) GetStreamByIndex(i *big.Int) (StreamWithId, error) { + return _StreamRegistryV1.Contract.GetStreamByIndex(&_StreamRegistryV1.CallOpts, i) +} + +// GetStreamCount is a free data retrieval call binding the contract method 0xc0f22084. +// +// Solidity: function getStreamCount() view returns(uint256) +func (_StreamRegistryV1 *StreamRegistryV1Caller) GetStreamCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _StreamRegistryV1.contract.Call(opts, &out, "getStreamCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetStreamCount is a free data retrieval call binding the contract method 0xc0f22084. +// +// Solidity: function getStreamCount() view returns(uint256) +func (_StreamRegistryV1 *StreamRegistryV1Session) GetStreamCount() (*big.Int, error) { + return _StreamRegistryV1.Contract.GetStreamCount(&_StreamRegistryV1.CallOpts) +} + +// GetStreamCount is a free data retrieval call binding the contract method 0xc0f22084. +// +// Solidity: function getStreamCount() view returns(uint256) +func (_StreamRegistryV1 *StreamRegistryV1CallerSession) GetStreamCount() (*big.Int, error) { + return _StreamRegistryV1.Contract.GetStreamCount(&_StreamRegistryV1.CallOpts) +} + +// GetStreamWithGenesis is a free data retrieval call binding the contract method 0x3c2544d1. +// +// Solidity: function getStreamWithGenesis(bytes32 streamId) view returns((bytes32,uint64,uint64,uint64,address[]), bytes32, bytes) +func (_StreamRegistryV1 *StreamRegistryV1Caller) GetStreamWithGenesis(opts *bind.CallOpts, streamId [32]byte) (Stream, [32]byte, []byte, error) { + var out []interface{} + err := _StreamRegistryV1.contract.Call(opts, &out, "getStreamWithGenesis", streamId) + + if err != nil { + return *new(Stream), *new([32]byte), *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new(Stream)).(*Stream) + out1 := *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + out2 := *abi.ConvertType(out[2], new([]byte)).(*[]byte) + + return out0, out1, out2, err + +} + +// GetStreamWithGenesis is a free data retrieval call binding the contract method 0x3c2544d1. +// +// Solidity: function getStreamWithGenesis(bytes32 streamId) view returns((bytes32,uint64,uint64,uint64,address[]), bytes32, bytes) +func (_StreamRegistryV1 *StreamRegistryV1Session) GetStreamWithGenesis(streamId [32]byte) (Stream, [32]byte, []byte, error) { + return _StreamRegistryV1.Contract.GetStreamWithGenesis(&_StreamRegistryV1.CallOpts, streamId) +} + +// GetStreamWithGenesis is a free data retrieval call binding the contract method 0x3c2544d1. +// +// Solidity: function getStreamWithGenesis(bytes32 streamId) view returns((bytes32,uint64,uint64,uint64,address[]), bytes32, bytes) +func (_StreamRegistryV1 *StreamRegistryV1CallerSession) GetStreamWithGenesis(streamId [32]byte) (Stream, [32]byte, []byte, error) { + return _StreamRegistryV1.Contract.GetStreamWithGenesis(&_StreamRegistryV1.CallOpts, streamId) +} + +// GetStreamsOnNode is a free data retrieval call binding the contract method 0x32705ac4. +// +// Solidity: function getStreamsOnNode(address nodeAddress) view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))[]) +func (_StreamRegistryV1 *StreamRegistryV1Caller) GetStreamsOnNode(opts *bind.CallOpts, nodeAddress common.Address) ([]StreamWithId, error) { + var out []interface{} + err := _StreamRegistryV1.contract.Call(opts, &out, "getStreamsOnNode", nodeAddress) + + if err != nil { + return *new([]StreamWithId), err + } + + out0 := *abi.ConvertType(out[0], new([]StreamWithId)).(*[]StreamWithId) + + return out0, err + +} + +// GetStreamsOnNode is a free data retrieval call binding the contract method 0x32705ac4. +// +// Solidity: function getStreamsOnNode(address nodeAddress) view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))[]) +func (_StreamRegistryV1 *StreamRegistryV1Session) GetStreamsOnNode(nodeAddress common.Address) ([]StreamWithId, error) { + return _StreamRegistryV1.Contract.GetStreamsOnNode(&_StreamRegistryV1.CallOpts, nodeAddress) +} + +// GetStreamsOnNode is a free data retrieval call binding the contract method 0x32705ac4. +// +// Solidity: function getStreamsOnNode(address nodeAddress) view returns((bytes32,(bytes32,uint64,uint64,uint64,address[]))[]) +func (_StreamRegistryV1 *StreamRegistryV1CallerSession) GetStreamsOnNode(nodeAddress common.Address) ([]StreamWithId, error) { + return _StreamRegistryV1.Contract.GetStreamsOnNode(&_StreamRegistryV1.CallOpts, nodeAddress) +} + +// AllocateStream is a paid mutator transaction binding the contract method 0x6b883c39. +// +// Solidity: function allocateStream(bytes32 streamId, address[] nodes, bytes32 genesisMiniblockHash, bytes genesisMiniblock) returns() +func (_StreamRegistryV1 *StreamRegistryV1Transactor) AllocateStream(opts *bind.TransactOpts, streamId [32]byte, nodes []common.Address, genesisMiniblockHash [32]byte, genesisMiniblock []byte) (*types.Transaction, error) { + return _StreamRegistryV1.contract.Transact(opts, "allocateStream", streamId, nodes, genesisMiniblockHash, genesisMiniblock) +} + +// AllocateStream is a paid mutator transaction binding the contract method 0x6b883c39. +// +// Solidity: function allocateStream(bytes32 streamId, address[] nodes, bytes32 genesisMiniblockHash, bytes genesisMiniblock) returns() +func (_StreamRegistryV1 *StreamRegistryV1Session) AllocateStream(streamId [32]byte, nodes []common.Address, genesisMiniblockHash [32]byte, genesisMiniblock []byte) (*types.Transaction, error) { + return _StreamRegistryV1.Contract.AllocateStream(&_StreamRegistryV1.TransactOpts, streamId, nodes, genesisMiniblockHash, genesisMiniblock) +} + +// AllocateStream is a paid mutator transaction binding the contract method 0x6b883c39. +// +// Solidity: function allocateStream(bytes32 streamId, address[] nodes, bytes32 genesisMiniblockHash, bytes genesisMiniblock) returns() +func (_StreamRegistryV1 *StreamRegistryV1TransactorSession) AllocateStream(streamId [32]byte, nodes []common.Address, genesisMiniblockHash [32]byte, genesisMiniblock []byte) (*types.Transaction, error) { + return _StreamRegistryV1.Contract.AllocateStream(&_StreamRegistryV1.TransactOpts, streamId, nodes, genesisMiniblockHash, genesisMiniblock) +} + +// PlaceStreamOnNode is a paid mutator transaction binding the contract method 0x9ee86d38. +// +// Solidity: function placeStreamOnNode(bytes32 streamId, address nodeAddress) returns() +func (_StreamRegistryV1 *StreamRegistryV1Transactor) PlaceStreamOnNode(opts *bind.TransactOpts, streamId [32]byte, nodeAddress common.Address) (*types.Transaction, error) { + return _StreamRegistryV1.contract.Transact(opts, "placeStreamOnNode", streamId, nodeAddress) +} + +// PlaceStreamOnNode is a paid mutator transaction binding the contract method 0x9ee86d38. +// +// Solidity: function placeStreamOnNode(bytes32 streamId, address nodeAddress) returns() +func (_StreamRegistryV1 *StreamRegistryV1Session) PlaceStreamOnNode(streamId [32]byte, nodeAddress common.Address) (*types.Transaction, error) { + return _StreamRegistryV1.Contract.PlaceStreamOnNode(&_StreamRegistryV1.TransactOpts, streamId, nodeAddress) +} + +// PlaceStreamOnNode is a paid mutator transaction binding the contract method 0x9ee86d38. +// +// Solidity: function placeStreamOnNode(bytes32 streamId, address nodeAddress) returns() +func (_StreamRegistryV1 *StreamRegistryV1TransactorSession) PlaceStreamOnNode(streamId [32]byte, nodeAddress common.Address) (*types.Transaction, error) { + return _StreamRegistryV1.Contract.PlaceStreamOnNode(&_StreamRegistryV1.TransactOpts, streamId, nodeAddress) +} + +// RemoveStreamFromNode is a paid mutator transaction binding the contract method 0xee885b12. +// +// Solidity: function removeStreamFromNode(bytes32 streamId, address nodeAddress) returns() +func (_StreamRegistryV1 *StreamRegistryV1Transactor) RemoveStreamFromNode(opts *bind.TransactOpts, streamId [32]byte, nodeAddress common.Address) (*types.Transaction, error) { + return _StreamRegistryV1.contract.Transact(opts, "removeStreamFromNode", streamId, nodeAddress) +} + +// RemoveStreamFromNode is a paid mutator transaction binding the contract method 0xee885b12. +// +// Solidity: function removeStreamFromNode(bytes32 streamId, address nodeAddress) returns() +func (_StreamRegistryV1 *StreamRegistryV1Session) RemoveStreamFromNode(streamId [32]byte, nodeAddress common.Address) (*types.Transaction, error) { + return _StreamRegistryV1.Contract.RemoveStreamFromNode(&_StreamRegistryV1.TransactOpts, streamId, nodeAddress) +} + +// RemoveStreamFromNode is a paid mutator transaction binding the contract method 0xee885b12. +// +// Solidity: function removeStreamFromNode(bytes32 streamId, address nodeAddress) returns() +func (_StreamRegistryV1 *StreamRegistryV1TransactorSession) RemoveStreamFromNode(streamId [32]byte, nodeAddress common.Address) (*types.Transaction, error) { + return _StreamRegistryV1.Contract.RemoveStreamFromNode(&_StreamRegistryV1.TransactOpts, streamId, nodeAddress) +} + +// SetStreamLastMiniblock is a paid mutator transaction binding the contract method 0xd7a3158a. +// +// Solidity: function setStreamLastMiniblock(bytes32 streamId, bytes32 prevMiniBlockHash, bytes32 lastMiniblockHash, uint64 lastMiniblockNum, bool isSealed) returns() +func (_StreamRegistryV1 *StreamRegistryV1Transactor) SetStreamLastMiniblock(opts *bind.TransactOpts, streamId [32]byte, prevMiniBlockHash [32]byte, lastMiniblockHash [32]byte, lastMiniblockNum uint64, isSealed bool) (*types.Transaction, error) { + return _StreamRegistryV1.contract.Transact(opts, "setStreamLastMiniblock", streamId, prevMiniBlockHash, lastMiniblockHash, lastMiniblockNum, isSealed) +} + +// SetStreamLastMiniblock is a paid mutator transaction binding the contract method 0xd7a3158a. +// +// Solidity: function setStreamLastMiniblock(bytes32 streamId, bytes32 prevMiniBlockHash, bytes32 lastMiniblockHash, uint64 lastMiniblockNum, bool isSealed) returns() +func (_StreamRegistryV1 *StreamRegistryV1Session) SetStreamLastMiniblock(streamId [32]byte, prevMiniBlockHash [32]byte, lastMiniblockHash [32]byte, lastMiniblockNum uint64, isSealed bool) (*types.Transaction, error) { + return _StreamRegistryV1.Contract.SetStreamLastMiniblock(&_StreamRegistryV1.TransactOpts, streamId, prevMiniBlockHash, lastMiniblockHash, lastMiniblockNum, isSealed) +} + +// SetStreamLastMiniblock is a paid mutator transaction binding the contract method 0xd7a3158a. +// +// Solidity: function setStreamLastMiniblock(bytes32 streamId, bytes32 prevMiniBlockHash, bytes32 lastMiniblockHash, uint64 lastMiniblockNum, bool isSealed) returns() +func (_StreamRegistryV1 *StreamRegistryV1TransactorSession) SetStreamLastMiniblock(streamId [32]byte, prevMiniBlockHash [32]byte, lastMiniblockHash [32]byte, lastMiniblockNum uint64, isSealed bool) (*types.Transaction, error) { + return _StreamRegistryV1.Contract.SetStreamLastMiniblock(&_StreamRegistryV1.TransactOpts, streamId, prevMiniBlockHash, lastMiniblockHash, lastMiniblockNum, isSealed) +} + +// SetStreamLastMiniblockBatch is a paid mutator transaction binding the contract method 0xff3a14ab. +// +// Solidity: function setStreamLastMiniblockBatch((bytes32,bytes32,bytes32,uint64,bool)[] miniblocks) returns() +func (_StreamRegistryV1 *StreamRegistryV1Transactor) SetStreamLastMiniblockBatch(opts *bind.TransactOpts, miniblocks []SetMiniblock) (*types.Transaction, error) { + return _StreamRegistryV1.contract.Transact(opts, "setStreamLastMiniblockBatch", miniblocks) +} + +// SetStreamLastMiniblockBatch is a paid mutator transaction binding the contract method 0xff3a14ab. +// +// Solidity: function setStreamLastMiniblockBatch((bytes32,bytes32,bytes32,uint64,bool)[] miniblocks) returns() +func (_StreamRegistryV1 *StreamRegistryV1Session) SetStreamLastMiniblockBatch(miniblocks []SetMiniblock) (*types.Transaction, error) { + return _StreamRegistryV1.Contract.SetStreamLastMiniblockBatch(&_StreamRegistryV1.TransactOpts, miniblocks) +} + +// SetStreamLastMiniblockBatch is a paid mutator transaction binding the contract method 0xff3a14ab. +// +// Solidity: function setStreamLastMiniblockBatch((bytes32,bytes32,bytes32,uint64,bool)[] miniblocks) returns() +func (_StreamRegistryV1 *StreamRegistryV1TransactorSession) SetStreamLastMiniblockBatch(miniblocks []SetMiniblock) (*types.Transaction, error) { + return _StreamRegistryV1.Contract.SetStreamLastMiniblockBatch(&_StreamRegistryV1.TransactOpts, miniblocks) +} + +// StreamRegistryV1StreamAllocatedIterator is returned from FilterStreamAllocated and is used to iterate over the raw logs and unpacked data for StreamAllocated events raised by the StreamRegistryV1 contract. +type StreamRegistryV1StreamAllocatedIterator struct { + Event *StreamRegistryV1StreamAllocated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *StreamRegistryV1StreamAllocatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(StreamRegistryV1StreamAllocated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(StreamRegistryV1StreamAllocated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *StreamRegistryV1StreamAllocatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *StreamRegistryV1StreamAllocatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// StreamRegistryV1StreamAllocated represents a StreamAllocated event raised by the StreamRegistryV1 contract. +type StreamRegistryV1StreamAllocated struct { + StreamId [32]byte + Nodes []common.Address + GenesisMiniblockHash [32]byte + GenesisMiniblock []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterStreamAllocated is a free log retrieval operation binding the contract event 0x55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb. +// +// Solidity: event StreamAllocated(bytes32 streamId, address[] nodes, bytes32 genesisMiniblockHash, bytes genesisMiniblock) +func (_StreamRegistryV1 *StreamRegistryV1Filterer) FilterStreamAllocated(opts *bind.FilterOpts) (*StreamRegistryV1StreamAllocatedIterator, error) { + + logs, sub, err := _StreamRegistryV1.contract.FilterLogs(opts, "StreamAllocated") + if err != nil { + return nil, err + } + return &StreamRegistryV1StreamAllocatedIterator{contract: _StreamRegistryV1.contract, event: "StreamAllocated", logs: logs, sub: sub}, nil +} + +// WatchStreamAllocated is a free log subscription operation binding the contract event 0x55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb. +// +// Solidity: event StreamAllocated(bytes32 streamId, address[] nodes, bytes32 genesisMiniblockHash, bytes genesisMiniblock) +func (_StreamRegistryV1 *StreamRegistryV1Filterer) WatchStreamAllocated(opts *bind.WatchOpts, sink chan<- *StreamRegistryV1StreamAllocated) (event.Subscription, error) { + + logs, sub, err := _StreamRegistryV1.contract.WatchLogs(opts, "StreamAllocated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(StreamRegistryV1StreamAllocated) + if err := _StreamRegistryV1.contract.UnpackLog(event, "StreamAllocated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseStreamAllocated is a log parse operation binding the contract event 0x55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb. +// +// Solidity: event StreamAllocated(bytes32 streamId, address[] nodes, bytes32 genesisMiniblockHash, bytes genesisMiniblock) +func (_StreamRegistryV1 *StreamRegistryV1Filterer) ParseStreamAllocated(log types.Log) (*StreamRegistryV1StreamAllocated, error) { + event := new(StreamRegistryV1StreamAllocated) + if err := _StreamRegistryV1.contract.UnpackLog(event, "StreamAllocated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// StreamRegistryV1StreamLastMiniblockUpdateFailedIterator is returned from FilterStreamLastMiniblockUpdateFailed and is used to iterate over the raw logs and unpacked data for StreamLastMiniblockUpdateFailed events raised by the StreamRegistryV1 contract. +type StreamRegistryV1StreamLastMiniblockUpdateFailedIterator struct { + Event *StreamRegistryV1StreamLastMiniblockUpdateFailed // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *StreamRegistryV1StreamLastMiniblockUpdateFailedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(StreamRegistryV1StreamLastMiniblockUpdateFailed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(StreamRegistryV1StreamLastMiniblockUpdateFailed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *StreamRegistryV1StreamLastMiniblockUpdateFailedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *StreamRegistryV1StreamLastMiniblockUpdateFailedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// StreamRegistryV1StreamLastMiniblockUpdateFailed represents a StreamLastMiniblockUpdateFailed event raised by the StreamRegistryV1 contract. +type StreamRegistryV1StreamLastMiniblockUpdateFailed struct { + StreamId [32]byte + LastMiniblockHash [32]byte + LastMiniblockNum uint64 + Reason string + Raw types.Log // Blockchain specific contextual infos +} + +// FilterStreamLastMiniblockUpdateFailed is a free log retrieval operation binding the contract event 0x75460fe319331413a18a82d99b07735cec53fa0c4061ada38c2141e331082afa. +// +// Solidity: event StreamLastMiniblockUpdateFailed(bytes32 streamId, bytes32 lastMiniblockHash, uint64 lastMiniblockNum, string reason) +func (_StreamRegistryV1 *StreamRegistryV1Filterer) FilterStreamLastMiniblockUpdateFailed(opts *bind.FilterOpts) (*StreamRegistryV1StreamLastMiniblockUpdateFailedIterator, error) { + + logs, sub, err := _StreamRegistryV1.contract.FilterLogs(opts, "StreamLastMiniblockUpdateFailed") + if err != nil { + return nil, err + } + return &StreamRegistryV1StreamLastMiniblockUpdateFailedIterator{contract: _StreamRegistryV1.contract, event: "StreamLastMiniblockUpdateFailed", logs: logs, sub: sub}, nil +} + +// WatchStreamLastMiniblockUpdateFailed is a free log subscription operation binding the contract event 0x75460fe319331413a18a82d99b07735cec53fa0c4061ada38c2141e331082afa. +// +// Solidity: event StreamLastMiniblockUpdateFailed(bytes32 streamId, bytes32 lastMiniblockHash, uint64 lastMiniblockNum, string reason) +func (_StreamRegistryV1 *StreamRegistryV1Filterer) WatchStreamLastMiniblockUpdateFailed(opts *bind.WatchOpts, sink chan<- *StreamRegistryV1StreamLastMiniblockUpdateFailed) (event.Subscription, error) { + + logs, sub, err := _StreamRegistryV1.contract.WatchLogs(opts, "StreamLastMiniblockUpdateFailed") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(StreamRegistryV1StreamLastMiniblockUpdateFailed) + if err := _StreamRegistryV1.contract.UnpackLog(event, "StreamLastMiniblockUpdateFailed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseStreamLastMiniblockUpdateFailed is a log parse operation binding the contract event 0x75460fe319331413a18a82d99b07735cec53fa0c4061ada38c2141e331082afa. +// +// Solidity: event StreamLastMiniblockUpdateFailed(bytes32 streamId, bytes32 lastMiniblockHash, uint64 lastMiniblockNum, string reason) +func (_StreamRegistryV1 *StreamRegistryV1Filterer) ParseStreamLastMiniblockUpdateFailed(log types.Log) (*StreamRegistryV1StreamLastMiniblockUpdateFailed, error) { + event := new(StreamRegistryV1StreamLastMiniblockUpdateFailed) + if err := _StreamRegistryV1.contract.UnpackLog(event, "StreamLastMiniblockUpdateFailed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// StreamRegistryV1StreamLastMiniblockUpdatedIterator is returned from FilterStreamLastMiniblockUpdated and is used to iterate over the raw logs and unpacked data for StreamLastMiniblockUpdated events raised by the StreamRegistryV1 contract. +type StreamRegistryV1StreamLastMiniblockUpdatedIterator struct { + Event *StreamRegistryV1StreamLastMiniblockUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *StreamRegistryV1StreamLastMiniblockUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(StreamRegistryV1StreamLastMiniblockUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(StreamRegistryV1StreamLastMiniblockUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *StreamRegistryV1StreamLastMiniblockUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *StreamRegistryV1StreamLastMiniblockUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// StreamRegistryV1StreamLastMiniblockUpdated represents a StreamLastMiniblockUpdated event raised by the StreamRegistryV1 contract. +type StreamRegistryV1StreamLastMiniblockUpdated struct { + StreamId [32]byte + LastMiniblockHash [32]byte + LastMiniblockNum uint64 + IsSealed bool + Raw types.Log // Blockchain specific contextual infos +} + +// FilterStreamLastMiniblockUpdated is a free log retrieval operation binding the contract event 0xccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b. +// +// Solidity: event StreamLastMiniblockUpdated(bytes32 streamId, bytes32 lastMiniblockHash, uint64 lastMiniblockNum, bool isSealed) +func (_StreamRegistryV1 *StreamRegistryV1Filterer) FilterStreamLastMiniblockUpdated(opts *bind.FilterOpts) (*StreamRegistryV1StreamLastMiniblockUpdatedIterator, error) { + + logs, sub, err := _StreamRegistryV1.contract.FilterLogs(opts, "StreamLastMiniblockUpdated") + if err != nil { + return nil, err + } + return &StreamRegistryV1StreamLastMiniblockUpdatedIterator{contract: _StreamRegistryV1.contract, event: "StreamLastMiniblockUpdated", logs: logs, sub: sub}, nil +} + +// WatchStreamLastMiniblockUpdated is a free log subscription operation binding the contract event 0xccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b. +// +// Solidity: event StreamLastMiniblockUpdated(bytes32 streamId, bytes32 lastMiniblockHash, uint64 lastMiniblockNum, bool isSealed) +func (_StreamRegistryV1 *StreamRegistryV1Filterer) WatchStreamLastMiniblockUpdated(opts *bind.WatchOpts, sink chan<- *StreamRegistryV1StreamLastMiniblockUpdated) (event.Subscription, error) { + + logs, sub, err := _StreamRegistryV1.contract.WatchLogs(opts, "StreamLastMiniblockUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(StreamRegistryV1StreamLastMiniblockUpdated) + if err := _StreamRegistryV1.contract.UnpackLog(event, "StreamLastMiniblockUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseStreamLastMiniblockUpdated is a log parse operation binding the contract event 0xccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b. +// +// Solidity: event StreamLastMiniblockUpdated(bytes32 streamId, bytes32 lastMiniblockHash, uint64 lastMiniblockNum, bool isSealed) +func (_StreamRegistryV1 *StreamRegistryV1Filterer) ParseStreamLastMiniblockUpdated(log types.Log) (*StreamRegistryV1StreamLastMiniblockUpdated, error) { + event := new(StreamRegistryV1StreamLastMiniblockUpdated) + if err := _StreamRegistryV1.contract.UnpackLog(event, "StreamLastMiniblockUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// StreamRegistryV1StreamPlacementUpdatedIterator is returned from FilterStreamPlacementUpdated and is used to iterate over the raw logs and unpacked data for StreamPlacementUpdated events raised by the StreamRegistryV1 contract. +type StreamRegistryV1StreamPlacementUpdatedIterator struct { + Event *StreamRegistryV1StreamPlacementUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *StreamRegistryV1StreamPlacementUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(StreamRegistryV1StreamPlacementUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(StreamRegistryV1StreamPlacementUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *StreamRegistryV1StreamPlacementUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *StreamRegistryV1StreamPlacementUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// StreamRegistryV1StreamPlacementUpdated represents a StreamPlacementUpdated event raised by the StreamRegistryV1 contract. +type StreamRegistryV1StreamPlacementUpdated struct { + StreamId [32]byte + NodeAddress common.Address + IsAdded bool + Raw types.Log // Blockchain specific contextual infos +} + +// FilterStreamPlacementUpdated is a free log retrieval operation binding the contract event 0xaaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f. +// +// Solidity: event StreamPlacementUpdated(bytes32 streamId, address nodeAddress, bool isAdded) +func (_StreamRegistryV1 *StreamRegistryV1Filterer) FilterStreamPlacementUpdated(opts *bind.FilterOpts) (*StreamRegistryV1StreamPlacementUpdatedIterator, error) { + + logs, sub, err := _StreamRegistryV1.contract.FilterLogs(opts, "StreamPlacementUpdated") + if err != nil { + return nil, err + } + return &StreamRegistryV1StreamPlacementUpdatedIterator{contract: _StreamRegistryV1.contract, event: "StreamPlacementUpdated", logs: logs, sub: sub}, nil +} + +// WatchStreamPlacementUpdated is a free log subscription operation binding the contract event 0xaaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f. +// +// Solidity: event StreamPlacementUpdated(bytes32 streamId, address nodeAddress, bool isAdded) +func (_StreamRegistryV1 *StreamRegistryV1Filterer) WatchStreamPlacementUpdated(opts *bind.WatchOpts, sink chan<- *StreamRegistryV1StreamPlacementUpdated) (event.Subscription, error) { + + logs, sub, err := _StreamRegistryV1.contract.WatchLogs(opts, "StreamPlacementUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(StreamRegistryV1StreamPlacementUpdated) + if err := _StreamRegistryV1.contract.UnpackLog(event, "StreamPlacementUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseStreamPlacementUpdated is a log parse operation binding the contract event 0xaaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f. +// +// Solidity: event StreamPlacementUpdated(bytes32 streamId, address nodeAddress, bool isAdded) +func (_StreamRegistryV1 *StreamRegistryV1Filterer) ParseStreamPlacementUpdated(log types.Log) (*StreamRegistryV1StreamPlacementUpdated, error) { + event := new(StreamRegistryV1StreamPlacementUpdated) + if err := _StreamRegistryV1.contract.UnpackLog(event, "StreamPlacementUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/node/contracts/stream_registry_v1_ex.go b/core/node/contracts/stream_registry_v1_ex.go new file mode 100644 index 000000000..ba524bbed --- /dev/null +++ b/core/node/contracts/stream_registry_v1_ex.go @@ -0,0 +1,13 @@ +package contracts + +import "github.com/ethereum/go-ethereum/accounts/abi/bind" + +const ( + Event_StreamAllocated = "StreamAllocated" + Event_StreamLastMiniblockUpdated = "StreamLastMiniblockUpdated" + Event_StreamPlacementUpdated = "StreamPlacementUpdated" +) + +func (_StreamRegistryV1 *StreamRegistryV1Caller) BoundContract() *bind.BoundContract { + return _StreamRegistryV1.contract +} diff --git a/core/node/conventions.md b/core/node/conventions.md new file mode 100644 index 000000000..27c11173b --- /dev/null +++ b/core/node/conventions.md @@ -0,0 +1,136 @@ +# River Node Coding Conventions + +## Logs + +Logging is done using Go's [slog](https://pkg.go.dev/log/slog) package for structured logging. + +Current logger is saved into variable `log` and logging statement takes a message and optional key-value pairs like this: + +```go +log.Debug("Starting new snapshot", "streamId", streamId, "blockNumber", curBlockNum) +``` + +There is wrapper called [dlog](https://github.com/HereNotThere/harmony/tree/main/core/node/dlog) which +provides coloring and better formatting for types we user frequently (protos, binary arrays). + +Normally logger is passed in [context](https://pkg.go.dev/context) and retrieved using `dlog.FromCtx`: + +```go +func loadNodeRegistry(ctx context.Context, nodeRegistryPath string, localNode *nodes.LocalNode) (nodes.NodeRegistry, error) { + log := dlog.FromCtx(ctx) + + if nodeRegistryPath == "" { + log.Warn("No node registry path specified, running in single node configuration") + return nodes.MakeSingleNodeRegistry(ctx, localNode), nil + } + + log.Info("Loading node registry", "path", nodeRegistryPath) + return nodes.LoadNodeRegistry(ctx, nodeRegistryPath, localNode) +} +``` + +All "regular" request-related logging should be done at `Debug` level. Request errors are logged as `Warn` on RPC return. +Additional information about request errors can be logged at `Warn` if necessary, however the default should +be to augment the returned error with extra information instead. + +`Error` is reserved for node-wide errors, and should not be used for per-request logging. + +`Info` is used for general logging and should not be used for per-request logging. + +## Errors + +For all errors generated in node use RiverError. If there is no matching error code add new code in +[protocol.proto](https://github.com/HereNotThere/harmony/blob/main/core/proto/protocol.proto). +Arguments are `errorCode`, `message`, optional key-value pairs: + +```go +return RiverError(Err_PERMISSION_DENIED, "user must join themselves", "user", userId) +``` + +Wrap third party-errors coming from other modules in river error: + +```go +err := MyDbCall() +if err != nil { + return WrapRiverError(Err_BAD_LINK_WALLET_BAD_SIGNATURE, err) +} +``` + +Passing errors can "cast" by calling `AsRiverError`: + +```go +err := nodeRegistry.Load() +if err != nil { + return AsRiverError(err).Func("MyFunc") +} +``` + +It's ok to use `AsRiverError` on other types of errors: in this case it auto-wraps with unknown error code. + +River errors can be agumented with extra information without the need to create a new error: + +```go +return AsRiverError(err). + Func("LinkWallet"). + Message("error validating wallet link"). + Tag("userId", userId). + Tags("anotherTag", 123, "yetAnotherTag", 456) + +// Or for the new error: +return RiverError(Err_PERMISSION_DENIED, "user must join themselves", "user", userId).Func("AddJoinEvent") + +// Or for the wrapped error: +return WrapRiverError(Err_BAD_LINK_WALLET_BAD_SIGNATURE, err). + Func("LinkWallet"). + Message("error validating wallet link"). + Tag("userId", userId). + Tags("anotherTag", 123, "yetAnotherTag", 456) +``` + +River error can be logged: + +```go +return AsRiverError(err). + Func("LinkWallet"). + LogWarn(log) + +// Or for the new error: +return RiverError(Err_PERMISSION_DENIED, "user must join themselves", "user", userId).Func("AddJoinEvent").LogDebug(log) + +// Or for the wrapped error: +return WrapRiverError(Err_BAD_LINK_WALLET_BAD_SIGNATURE, err). + Func("LinkWallet"). + Message("error validating wallet link"). + Tag("userId", userId). + LogWarn(log) +``` + +This can functionality can be used as necessary, but since all request errors are logged on RPC level, for requrest processing +the default should be to augument passing error and let RPC layer do the logging once. + +## . imports + +While it's not idiomatic go, it's ok to use dot imports for base, protocol, events (use judgement for other cases). +Since request processing code works with classes +from these packages very tightly not doing this leads to endless unreadable prefixes. It's a bit impractical to merge these into +one packages, so dot imports it is: + +```go +package rpc + +import ( + "context" + "encoding/hex" + + "connectrpc.com/connect" + + "github.com/river-build/river/core/node/auth" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/common" + "github.com/river-build/river/core/node/crypto" + . "github.com/river-build/river/core/node/events" + "github.com/river-build/river/core/node/infra" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/storage" +) +``` diff --git a/core/node/crypto/block_number.go b/core/node/crypto/block_number.go new file mode 100644 index 000000000..be8fb6efd --- /dev/null +++ b/core/node/crypto/block_number.go @@ -0,0 +1,24 @@ +package crypto + +import "math/big" + +type BlockNumber uint64 + +func (bn BlockNumber) AsBigInt() *big.Int { + return BigIntFromUint64(uint64(bn)) +} + +func (bn BlockNumber) AsUint64() uint64 { + return uint64(bn) +} + +func BlockNumberFromBigInt(v *big.Int) BlockNumber { + if !v.IsUint64() { + panic("block number is too large") + } + return BlockNumber(v.Uint64()) +} + +func BigIntFromUint64(v uint64) *big.Int { + return new(big.Int).SetUint64(v) +} diff --git a/core/node/crypto/blockchain.go b/core/node/crypto/blockchain.go new file mode 100644 index 000000000..83d965028 --- /dev/null +++ b/core/node/crypto/blockchain.go @@ -0,0 +1,138 @@ +package crypto + +import ( + "context" + "math/big" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/config" + . "github.com/river-build/river/core/node/protocol" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/ethclient" +) + +// BlockchainClient is an interface that covers common functionality +// between ethclient.Client and simulated.Backend. +// go-ethereum splits functionality into multiple implicit interfaces, +// but there is no explicit interface for client. +type BlockchainClient interface { + ethereum.BlockNumberReader + ethereum.ChainReader + ethereum.ChainStateReader + ethereum.ContractCaller + ethereum.GasEstimator + ethereum.GasPricer + ethereum.GasPricer1559 + ethereum.FeeHistoryReader + ethereum.LogFilterer + ethereum.PendingStateReader + ethereum.PendingContractCaller + ethereum.TransactionReader + ethereum.TransactionSender + ethereum.ChainIDReader +} + +type Closable interface { + Close() +} + +// Holds necessary information to interact with the blockchain. +// Use NewReadOnlyBlockchain to create a read-only Blockchain. +// Use NewReadWriteBlockchain to create a read-write Blockchain that tracks nonce used by the account. +type Blockchain struct { + ChainId *big.Int + Wallet *Wallet + Client BlockchainClient + ClientCloser Closable + TxPool TransactionPool + Config *config.ChainConfig + InitialBlockNum BlockNumber + ChainMonitor ChainMonitor +} + +// NewBlockchain creates a new Blockchain instance that +// contains all necessary information to interact with the blockchain. +// If wallet is nil, the blockchain will be read-only. +// If wallet is not nil, the blockchain will be read-write: +// TxRunner will be created to track nonce used by the account. +func NewBlockchain(ctx context.Context, cfg *config.ChainConfig, wallet *Wallet) (*Blockchain, error) { + client, err := ethclient.DialContext(ctx, cfg.NetworkUrl) + if err != nil { + return nil, AsRiverError(err, Err_CANNOT_CONNECT). + Message("Cannot connect to chain RPC node"). + Tag("chainId", cfg.ChainId). + Func("NewBlockchain") + } + + return NewBlockchainWithClient(ctx, cfg, wallet, client, client, NewChainMonitor()) +} + +func NewBlockchainWithClient( + ctx context.Context, + cfg *config.ChainConfig, + wallet *Wallet, + client BlockchainClient, + clientCloser Closable, + chainMonitor ChainMonitor, +) (*Blockchain, error) { + if cfg.BlockTimeMs <= 0 { + return nil, RiverError(Err_BAD_CONFIG, "BlockTimeMs must be set"). + Func("NewBlockchainWithClient") + } + chainId, err := client.ChainID(ctx) + if err != nil { + return nil, AsRiverError(err). + Message("Cannot retrieve chain id"). + Func("NewBlockchainWithClient") + } + + if chainId.Uint64() != uint64(cfg.ChainId) { + return nil, RiverError(Err_BAD_CONFIG, "Chain id mismatch", + "configured", cfg.ChainId, + "providerChainId", chainId.Uint64()).Func("NewBlockchainWithClient") + } + + blockNum, err := client.BlockNumber(ctx) + if err != nil { + return nil, AsRiverError( + err, + Err_CANNOT_CONNECT, + ).Message("Cannot retrieve block number"). + Func("NewBlockchainWithClient") + } + initialBlockNum := BlockNumber(blockNum) + + bc := &Blockchain{ + ChainId: big.NewInt(int64(cfg.ChainId)), + Client: client, + ClientCloser: clientCloser, + Config: cfg, + InitialBlockNum: initialBlockNum, + ChainMonitor: chainMonitor, + } + + if wallet != nil { + bc.Wallet = wallet + bc.TxPool, err = NewTransactionPoolWithPoliciesFromConfig(ctx, cfg, bc.Client, wallet, bc.ChainMonitor) + if err != nil { + return nil, err + } + } + + return bc, nil +} + +func (b *Blockchain) Close() { + if b.ClientCloser != nil { + b.ClientCloser.Close() + } +} + +func (b *Blockchain) GetBlockNumber(ctx context.Context) (BlockNumber, error) { + n, err := b.Client.BlockNumber(ctx) + if err != nil { + return 0, AsRiverError(err, Err_CANNOT_CONNECT).Message("Cannot retrieve block number").Func("GetBlockNumber") + } + return BlockNumber(n), nil +} diff --git a/core/node/crypto/blockchain_test.go b/core/node/crypto/blockchain_test.go new file mode 100644 index 000000000..c47d29950 --- /dev/null +++ b/core/node/crypto/blockchain_test.go @@ -0,0 +1,199 @@ +package crypto + +import ( + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/base/test" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/shared" + "github.com/river-build/river/core/node/testutils" +) + +func TestBlockchain(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + require := require.New(t) + assert := assert.New(t) + + tc, err := NewBlockchainTestContext(ctx, 2, false) + require.NoError(err) + defer tc.Close() + + owner := tc.DeployerBlockchain + tc.Commit(ctx) + + bc1 := tc.GetBlockchain(ctx, 0) + defer bc1.Close() + bc2 := tc.GetBlockchain(ctx, 1) + defer bc2.Close() + + nodeAddr1 := bc1.Wallet.Address + nodeUrl1 := "http://node1.node" + nodeAddr2 := bc2.Wallet.Address + nodeUrl2 := "http://node2.node" + + tx1, err := owner.TxPool.Submit(ctx, "RegisterNode", func(opts *bind.TransactOpts) (*types.Transaction, error) { + return tc.NodeRegistry.RegisterNode(opts, nodeAddr1, nodeUrl1, 2) + }) + require.NoError(err) + + tx2, err := owner.TxPool.Submit(ctx, "RegisterNode", func(opts *bind.TransactOpts) (*types.Transaction, error) { + return tc.NodeRegistry.RegisterNode(opts, nodeAddr2, nodeUrl2, 2) + }) + require.NoError(err) + + firstBlockNum, err := tc.Client().BlockNumber(ctx) + require.NoError(err) + + tc.Commit(ctx) + + secondBlockNum, err := tc.Client().BlockNumber(ctx) + require.NoError(err) + if tc.IsSimulated() { + assert.Equal(firstBlockNum+1, secondBlockNum) + } + + receipt1 := <-tx1.Wait() + require.Equal(uint64(1), receipt1.Status) + receipt2 := <-tx2.Wait() + require.Equal(uint64(1), receipt2.Status) + + nodes, err := tc.NodeRegistry.GetAllNodes(nil) + require.NoError(err) + assert.Len(nodes, 2) + assert.Equal(nodeAddr1, nodes[0].NodeAddress) + assert.Equal(nodeUrl1, nodes[0].Url) + assert.Equal(nodeAddr2, nodes[1].NodeAddress) + assert.Equal(nodeUrl2, nodes[1].Url) + + // Can't add the same node twice + tx1, err = owner.TxPool.Submit(ctx, "RegisterNode", func(opts *bind.TransactOpts) (*types.Transaction, error) { + return tc.NodeRegistry.RegisterNode(opts, nodeAddr1, nodeUrl1, 2) + }) + // Looks like this is a difference for simulated backend: + // this error should be know only after the transaction is mined - i.e. after Commit call. + require.Nil(tx1) + require.Equal(Err_ALREADY_EXISTS, AsRiverError(err).Code) + + currentBlockNum, err := tc.Client().BlockNumber(ctx) + require.NoError(err) + if tc.IsSimulated() { + assert.Equal(secondBlockNum, currentBlockNum) + } + + allIds := make(map[StreamId]bool) + streamId := testutils.StreamIdFromBytes([]byte{0xa1, 0x02, 0x03}) + allIds[streamId] = true + addrs := []common.Address{nodeAddr1, nodeAddr2} + + genesisHash := common.HexToHash("0x123") + genesisMiniblock := []byte("genesis") + + tx1, err = bc1.TxPool.Submit( + ctx, + "AllocateStream", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + return tc.StreamRegistry.AllocateStream(opts, streamId, addrs, genesisHash, genesisMiniblock) + }, + ) + require.NoError(err) + + tc.Commit(ctx) + + receipt := <-tx1.Wait() + require.Equal(uint64(1), receipt.Status) + + stream, mbHash, mb, err := tc.StreamRegistry.GetStreamWithGenesis(nil, streamId) + require.NoError(err) + assert.Equal(addrs, stream.Nodes) + assert.Equal(genesisHash, common.Hash(mbHash)) + assert.Equal(genesisMiniblock, mb) + assert.Equal(genesisHash, common.Hash(stream.LastMiniblockHash)) + assert.Equal(uint64(0), stream.LastMiniblockNum) + + // Can't allocate the same stream twice + tx1, err = bc1.TxPool.Submit( + ctx, + "AllocateStream", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + return tc.StreamRegistry.AllocateStream(opts, streamId, addrs, genesisHash, genesisMiniblock) + }, + ) + require.Nil(tx1) + require.Equal(Err_ALREADY_EXISTS, AsRiverError(err).Code) + + // Can't allocate with unknown node + tx1, err = bc1.TxPool.Submit( + ctx, + "AllocateStream", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + streamId := testutils.StreamIdFromBytes([]byte{0x10, 0x22, 0x33}) + return tc.StreamRegistry.AllocateStream( + opts, + streamId, + []common.Address{common.HexToAddress("0x123")}, + genesisHash, + genesisMiniblock, + ) + }, + ) + require.Nil(tx1) + require.Equal(Err_UNKNOWN_NODE, AsRiverError(err).Code, "Error: %v", err) + + var lastPendingTx TransactionPoolPendingTransaction + // Allocate 20 more streams + for i := 0; i < 20; i++ { + streamId := testutils.StreamIdFromBytes([]byte{0xa1, byte(i), 0x22, 0x33, 0x44, 0x55}) + allIds[streamId] = true + lastPendingTx, err = bc1.TxPool.Submit( + ctx, + "AllocateStream", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + return tc.StreamRegistry.AllocateStream( + opts, + streamId, + addrs, + genesisHash, + genesisMiniblock, + ) + }, + ) + require.NoError(err) + } + + tc.Commit(ctx) + + // wait for the last transaction to finish + <-lastPendingTx.Wait() + + // Read with pagination + const pageSize int64 = 4 + var count int + var lastPageSeen bool + seenIds := make(map[StreamId]bool) + for i := int64(0); i < 30; i += pageSize { + streams, lastPage, err := tc.StreamRegistry.GetPaginatedStreams(nil, big.NewInt(i), big.NewInt(i+pageSize)) + require.NoError(err) + for _, stream := range streams { + if stream.Id != [32]byte{} { + seenIds[testutils.StreamIdFromBytes(stream.Id[:])] = true + count++ + } + } + if lastPage { + require.Equal(len(allIds), count) + lastPageSeen = true + break + } + } + require.True(lastPageSeen) + require.Equal(allIds, seenIds, "allIds: %v, seenIds: %v", allIds, seenIds) +} diff --git a/core/node/crypto/chain_monitor.go b/core/node/crypto/chain_monitor.go new file mode 100644 index 000000000..857eb57be --- /dev/null +++ b/core/node/crypto/chain_monitor.go @@ -0,0 +1,324 @@ +package crypto + +import ( + "context" + "math/big" + "sync" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/prometheus/client_golang/prometheus" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/infra" +) + +var ( + chainBaseFee = infra.NewGaugeVec( + "chain_monitor_base_fee_wei", "Current EIP-1559 base fee as obtained from the block header", + "chain_id", + ) + chainMonitorHeadBlock = infra.NewGaugeVec( + "chain_monitor_head_block", "Latest block available for the chain monitor", + "chain_id", + ) + chainMonitorProcessedBlock = infra.NewGaugeVec( + "chain_monitor_processed_block", "Latest block processed by the chain monitor", + "chain_id", + ) + chainMonitorRecvEvents = infra.NewCounterVec( + "chain_monitor_received_events", "Chain monitor total received events", + "chain_id", + ) + chainMonitorPollCounter = infra.NewCounterVec( + "chain_monitor_pollcounter", "How many times the chain monitor poll loop has run", + "chain_id", + ) +) + +type ( + // ChainMonitor monitors the EVM chain for new blocks and/or events. + ChainMonitor interface { + // RunWithBlockPeriod the monitor until the given ctx expires using the client to interact + // with the chain. + RunWithBlockPeriod( + ctx context.Context, + client BlockchainClient, + initialBlock BlockNumber, + blockPeriod time.Duration, + ) + // OnHeader adds a callback that is when a new header is received. + // Note: it is not guaranteed to be called for every new header! + OnHeader(cb OnChainNewHeader) + // OnBlock adds a callback that is called for each new block + OnBlock(cb OnChainNewBlock) + // OnAllEvents matches all events for all contracts, e.g. all chain events. + OnAllEvents(cb OnChainEventCallback) + // OnContractEvent matches all events created by the contract on the given address. + OnContractEvent(addr common.Address, cb OnChainEventCallback) + // OnContractWithTopicsEvent matches events created by the contract on the given + OnContractWithTopicsEvent(addr common.Address, topics [][]common.Hash, cb OnChainEventCallback) + // OnStopped calls cb after the chain monitor stopped monitoring the chain + OnStopped(cb OnChainMonitorStoppedCallback) + } + + // OnChainEventCallback is called for each event that matches the filter. + // Note that the monitor doesn't care about errors in the callback and doesn't + // expect callbacks to change the received event. + OnChainEventCallback = func(context.Context, types.Log) + + // OnChainNewHeader is called when a new header is detected to be added to the chain. + // Note, it is NOT guaranteed to be called for every new header. + // It is called each time the chain is polled and a new header is detected, discarding intermediate headers. + OnChainNewHeader = func(context.Context, *types.Header) + + // OnChainNewBlock is called for each new block that is added to the chain. + OnChainNewBlock = func(context.Context, BlockNumber) + + // OnChainMonitorStoppedCallback is called after the chain monitor stopped monitoring the chain. + OnChainMonitorStoppedCallback = func(context.Context) + + chainMonitor struct { + muBuilder sync.Mutex + builder chainMonitorBuilder + } + + // ChainMonitorPollInterval determines the next poll interval for the chain monitor + ChainMonitorPollInterval interface { + Interval(took time.Duration, hitBlockRangeLimit bool, gotErr bool) time.Duration + } + + defaultChainMonitorPollIntervalCalculator struct { + blockPeriod time.Duration + errCounter int64 + errSlowdownLimit time.Duration + } +) + +// NewChainMonitor constructs an EVM chain monitor that can track state changes on an EVM chain. +func NewChainMonitor() *chainMonitor { + return &chainMonitor{ + builder: chainMonitorBuilder{dirty: true}, + } +} + +func NewChainMonitorPollIntervalCalculator( + blockPeriod time.Duration, errSlowdownLimit time.Duration, +) *defaultChainMonitorPollIntervalCalculator { + return &defaultChainMonitorPollIntervalCalculator{ + blockPeriod: blockPeriod, + errCounter: 0, + errSlowdownLimit: max(errSlowdownLimit, time.Second), + } +} + +func (p *defaultChainMonitorPollIntervalCalculator) Interval( + took time.Duration, hitBlockRangeLimit bool, gotErr bool, +) time.Duration { + if gotErr { + // increments each time an error was encountered the time for the next poll until errSlowdownLimit + p.errCounter = min(p.errCounter+1, 10000) + return min(time.Duration(p.errCounter)*p.blockPeriod, p.errSlowdownLimit) + } + + p.errCounter = 0 + if hitBlockRangeLimit { // fallen behind chain, fetch immediately next block range + return time.Duration(0) + } + return max(p.blockPeriod-took, 0) +} + +func (ecm *chainMonitor) OnHeader(cb OnChainNewHeader) { + ecm.muBuilder.Lock() + defer ecm.muBuilder.Unlock() + ecm.builder.OnHeader(cb) +} + +func (ecm *chainMonitor) OnBlock(cb OnChainNewBlock) { + ecm.muBuilder.Lock() + defer ecm.muBuilder.Unlock() + ecm.builder.OnBlock(cb) +} + +func (ecm *chainMonitor) OnAllEvents(cb OnChainEventCallback) { + ecm.muBuilder.Lock() + defer ecm.muBuilder.Unlock() + ecm.builder.OnAllEvents(cb) +} + +func (ecm *chainMonitor) OnContractEvent(addr common.Address, cb OnChainEventCallback) { + ecm.muBuilder.Lock() + defer ecm.muBuilder.Unlock() + ecm.builder.OnContractEvent(addr, cb) +} + +func (ecm *chainMonitor) OnContractWithTopicsEvent( + addr common.Address, + topics [][]common.Hash, + cb OnChainEventCallback, +) { + ecm.muBuilder.Lock() + defer ecm.muBuilder.Unlock() + ecm.builder.OnContractWithTopicsEvent(addr, topics, cb) +} + +func (ecm *chainMonitor) OnStopped(cb OnChainMonitorStoppedCallback) { + ecm.muBuilder.Lock() + defer ecm.muBuilder.Unlock() + ecm.builder.OnChainMonitorStopped(cb) +} + +// RunWithBlockPeriod monitors the chain the given client is connected to and calls the +// associated callback for each event that matches its filter. +// +// It will finish when the given ctx is cancelled. +// +// It will start monitoring from the given initialBlock block number (inclusive). +// +// Callbacks are called in the order they were added and +// aren't called concurrently to ensure that events are processed in the order +// they were received. +func (ecm *chainMonitor) RunWithBlockPeriod( + ctx context.Context, + client BlockchainClient, + initialBlock BlockNumber, + blockPeriod time.Duration, +) { + var ( + log = dlog.FromCtx(ctx) + one = big.NewInt(1) + fromBlock = initialBlock.AsBigInt() + lastProcessed *big.Int + pollInterval = time.Duration(0) + poll = NewChainMonitorPollIntervalCalculator(blockPeriod, 30*time.Second) + baseFeeGauge prometheus.Gauge + headBlockGauge prometheus.Gauge + processedBlockGauge prometheus.Gauge + receivedEventsCounter prometheus.Counter + pollIntervalCounter prometheus.Counter + ) + + if chainID := loadChainID(ctx, client); chainID != nil { + baseFeeGauge = chainBaseFee.With(prometheus.Labels{"chain_id": chainID.String()}) + headBlockGauge = chainMonitorHeadBlock.With(prometheus.Labels{"chain_id": chainID.String()}) + processedBlockGauge = chainMonitorProcessedBlock.With(prometheus.Labels{"chain_id": chainID.String()}) + receivedEventsCounter = chainMonitorRecvEvents.With(prometheus.Labels{"chain_id": chainID.String()}) + pollIntervalCounter = chainMonitorPollCounter.With(prometheus.Labels{"chain_id": chainID.String()}) + } else { + return + } + + log.Debug("chain monitor started", "blockPeriod", blockPeriod, "fromBlock", initialBlock) + + for { + // log.Debug("chain monitor iteration", "pollInterval", pollInterval) + + pollIntervalCounter.Inc() + + select { + case <-ctx.Done(): + log.Debug("initiate chain monitor shutdown") + ctx2, cancel := context.WithTimeout(context.WithoutCancel(ctx), time.Minute) + ecm.builder.stoppedCallbacks.onChainMonitorStopped(ctx2) + cancel() + log.Debug("chain monitor stopped") + return + + case <-time.After(pollInterval): + start := time.Now() + head, err := client.HeaderByNumber(ctx, nil) + if err != nil { + log.Warn("chain monitor is unable to retrieve chain head", "error", err) + pollInterval = poll.Interval(time.Since(start), false, true) + continue + } + + headBlockGauge.Set(float64(head.Number.Uint64())) + if head.BaseFee != nil { + baseFee, _ := head.BaseFee.Float64() + baseFeeGauge.Set(baseFee) + } + + if lastProcessed != nil && lastProcessed.Cmp(head.Number) >= 0 { // no new block + pollInterval = poll.Interval(time.Since(start), false, false) + continue + } + + var ( + newBlocks []BlockNumber + collectedLogs []types.Log + toBlock = new(big.Int).Set(head.Number) + moreBlocksAvailable = false + callbacksExecuted sync.WaitGroup + ) + + // ensure that the search range isn't too big because RPC providers + // often have limitations on the block range and/or response size. + if head.Number.Uint64()-fromBlock.Uint64() > 25 { + moreBlocksAvailable = true + toBlock.SetUint64(fromBlock.Uint64() + 25) + } + + ecm.muBuilder.Lock() + query := ecm.builder.Query() + query.FromBlock, query.ToBlock = fromBlock, toBlock + + // log.Debug("chain monitor block range", "from", query.FromBlock, "to", query.ToBlock) + + if len(ecm.builder.blockCallbacks) > 0 { + for i := query.FromBlock.Uint64(); i <= query.ToBlock.Uint64(); i++ { + newBlocks = append(newBlocks, BlockNumber(i)) + } + } + + if len(ecm.builder.eventCallbacks) > 0 { // collect events in new blocks + collectedLogs, err = client.FilterLogs(ctx, query) + if err != nil { + log.Warn("unable to retrieve logs", "error", err) + pollInterval = poll.Interval(time.Since(start), false, true) + ecm.muBuilder.Unlock() + continue + } + receivedEventsCounter.Add(float64(len(collectedLogs))) + } + + if len(ecm.builder.headerCallbacks) > 0 { + callbacksExecuted.Add(1) + go func() { + ecm.builder.headerCallbacks.onHeadReceived(ctx, head) + callbacksExecuted.Done() + }() + } + + if len(ecm.builder.blockCallbacks) > 0 { + callbacksExecuted.Add(1) + go func() { + for _, header := range newBlocks { + ecm.builder.blockCallbacks.onBlockReceived(ctx, header) + } + callbacksExecuted.Done() + }() + } + + if len(ecm.builder.eventCallbacks) > 0 { + callbacksExecuted.Add(1) + go func() { + for _, log := range collectedLogs { + ecm.builder.eventCallbacks.onLogReceived(ctx, log) + } + callbacksExecuted.Done() + }() + } + + callbacksExecuted.Wait() + ecm.muBuilder.Unlock() + + // from and toBlocks are inclusive, start at the next block on next iteration + fromBlock = new(big.Int).Add(query.ToBlock, one) + pollInterval = poll.Interval(time.Since(start), moreBlocksAvailable, false) + lastProcessed = toBlock + + processedBlockGauge.Set(float64(lastProcessed.Uint64())) + } + } +} diff --git a/core/node/crypto/chain_monitor_builder.go b/core/node/crypto/chain_monitor_builder.go new file mode 100644 index 000000000..abdcb75da --- /dev/null +++ b/core/node/crypto/chain_monitor_builder.go @@ -0,0 +1,138 @@ +package crypto + +import ( + "context" + "slices" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +// chainMonitorBuilder builds a chain monitor. +type chainMonitorBuilder struct { + dirty bool + cachedQuery ethereum.FilterQuery + blockCallbacks chainBlockCallbacks + eventCallbacks chainEventCallbacks + headerCallbacks chainHeaderCallbacks + stoppedCallbacks chainMonitorStoppedCallbacks +} + +func (lfb *chainMonitorBuilder) Query() ethereum.FilterQuery { + if !lfb.dirty { + return lfb.cachedQuery + } + query := ethereum.FilterQuery{} + for _, cb := range lfb.eventCallbacks { + if cb.address == nil && len(cb.topics) == 0 { // wants all events + lfb.dirty = false + lfb.cachedQuery = ethereum.FilterQuery{} + return lfb.cachedQuery + } + if cb.address != nil && !slices.Contains(query.Addresses, *cb.address) { + query.Addresses = append(query.Addresses, *cb.address) + } + } + + lfb.dirty = false + lfb.cachedQuery = query + return query +} + +func (lfb *chainMonitorBuilder) OnHeader(cb OnChainNewHeader) { + lfb.headerCallbacks = append(lfb.headerCallbacks, &chainHeaderCallback{handler: cb}) + lfb.dirty = true +} + +func (lfb *chainMonitorBuilder) OnBlock(cb OnChainNewBlock) { + lfb.blockCallbacks = append(lfb.blockCallbacks, &chainBlockCallback{handler: cb}) + lfb.dirty = true +} + +func (lfb *chainMonitorBuilder) OnAllEvents(cb OnChainEventCallback) { + lfb.eventCallbacks = append(lfb.eventCallbacks, &chainEventCallback{handler: cb}) + lfb.dirty = true +} + +func (lfb *chainMonitorBuilder) OnContractEvent(addr common.Address, cb OnChainEventCallback) { + lfb.eventCallbacks = append(lfb.eventCallbacks, &chainEventCallback{handler: cb, address: &addr}) + lfb.dirty = true +} + +func (lfb *chainMonitorBuilder) OnContractWithTopicsEvent( + addr common.Address, + topics [][]common.Hash, + cb OnChainEventCallback, +) { + lfb.eventCallbacks = append(lfb.eventCallbacks, &chainEventCallback{handler: cb, address: &addr, topics: topics}) + lfb.dirty = true +} + +func (lfb *chainMonitorBuilder) OnChainMonitorStopped(cb OnChainMonitorStoppedCallback) { + lfb.stoppedCallbacks = append(lfb.stoppedCallbacks, &chainMonitorStoppedCallback{handler: cb}) + lfb.dirty = true +} + +type chainEventCallback struct { + handler OnChainEventCallback + address *common.Address + topics [][]common.Hash +} + +type chainEventCallbacks []*chainEventCallback + +// onLogReceived calls all callbacks in the ecb callback set that are interested +// in the given log. +func (ecb chainEventCallbacks) onLogReceived(ctx context.Context, log types.Log) { + for _, cb := range ecb { + if (cb.address == nil || *cb.address == log.Address) && matchTopics(cb.topics, log.Topics) { + cb.handler(ctx, log) + } + } +} + +type chainHeaderCallback struct { + handler OnChainNewHeader + fromBlock BlockNumber +} + +type chainHeaderCallbacks []*chainHeaderCallback + +func (hcb chainHeaderCallbacks) onHeadReceived(ctx context.Context, header *types.Header) { + headNumber := BlockNumber(header.Number.Uint64()) + for _, cb := range hcb { + if cb.fromBlock < headNumber { + cb.handler(ctx, header) + cb.fromBlock = headNumber + } + } +} + +type chainBlockCallback struct { + handler OnChainNewBlock + fromBlock BlockNumber +} + +type chainBlockCallbacks []*chainBlockCallback + +func (ebc chainBlockCallbacks) onBlockReceived(ctx context.Context, blockNumber BlockNumber) { + for _, cb := range ebc { + if cb.fromBlock < blockNumber { + cb.handler(ctx, blockNumber) + cb.fromBlock = blockNumber + } + } +} + +type chainMonitorStoppedCallback struct { + handler OnChainMonitorStoppedCallback +} + +type chainMonitorStoppedCallbacks []*chainMonitorStoppedCallback + +func (cmsc chainMonitorStoppedCallbacks) onChainMonitorStopped(ctx context.Context) { + for _, cb := range cmsc { + cb.handler(ctx) + } +} diff --git a/core/node/crypto/chain_monitor_test.go b/core/node/crypto/chain_monitor_test.go new file mode 100644 index 000000000..c0f997604 --- /dev/null +++ b/core/node/crypto/chain_monitor_test.go @@ -0,0 +1,225 @@ +package crypto_test + +import ( + "context" + "fmt" + "strings" + "sync/atomic" + "testing" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/river-build/river/core/node/base/test" + "github.com/river-build/river/core/node/contracts" + "github.com/river-build/river/core/node/crypto" + "github.com/stretchr/testify/require" +) + +func TestChainMonitorBlocks(t *testing.T) { + require := require.New(t) + ctx, cancel := test.NewTestContext() + defer cancel() + + tc, err := crypto.NewBlockchainTestContext(ctx, 1, false) + require.NoError(err) + defer tc.Close() + + var ( + collectedBlocks = make(chan uint64, 10) + onBlockCallback = func(ctx context.Context, bn crypto.BlockNumber) { + collectedBlocks <- bn.AsUint64() + } + ) + + tc.ChainMonitor.OnBlock(onBlockCallback) + + var prev uint64 + for i := 0; i < 5; i++ { + tc.Commit(ctx) + got := <-collectedBlocks + if prev != 0 { + require.Equal(prev+1, got, "unexpected block number") + } + prev = got + } +} + +func TestNextPollInterval(t *testing.T) { + var ( + require = require.New(t) + blockPeriod = 2 * time.Second + errSlowdownLimit = 10 * time.Second + tests = []struct { + calc crypto.ChainMonitorPollInterval + took time.Duration + gotErr bool + multipleBlocks bool + exp time.Duration + }{ + { + calc: crypto.NewChainMonitorPollIntervalCalculator(blockPeriod, errSlowdownLimit), + took: 50 * time.Millisecond, + gotErr: false, + multipleBlocks: false, + exp: blockPeriod - 50*time.Millisecond, + }, + { + calc: crypto.NewChainMonitorPollIntervalCalculator(blockPeriod, errSlowdownLimit), + took: 50 * time.Millisecond, + gotErr: true, + multipleBlocks: false, + exp: blockPeriod, + }, + { + calc: crypto.NewChainMonitorPollIntervalCalculator(blockPeriod, errSlowdownLimit), + took: 50 * time.Millisecond, + gotErr: false, + multipleBlocks: true, + exp: time.Duration(0), + }, + { + calc: crypto.NewChainMonitorPollIntervalCalculator(blockPeriod, errSlowdownLimit), + took: 50 * time.Millisecond, + gotErr: true, + multipleBlocks: true, + exp: blockPeriod, + }, + } + ) + + for i, tc := range tests { + require.Equal(tc.exp, + tc.calc.Interval(tc.took, tc.multipleBlocks, tc.gotErr), fmt.Sprintf("test# %d", i)) + } + + // test scenarios that require multiple times to request + var ( + slowdownLim = 5 * time.Second + poll = crypto.NewChainMonitorPollIntervalCalculator(blockPeriod, slowdownLim) + took = 50 * time.Millisecond + ) + + // multiple errors followed by a successful call that yielded no new blocks + pollInterval := poll.Interval(took, false, true) + require.Equal(blockPeriod, pollInterval) + pollInterval = poll.Interval(took, false, true) + require.Equal(2*blockPeriod, pollInterval) + pollInterval = poll.Interval(took, false, true) + require.Equal(slowdownLim, pollInterval) + pollInterval = poll.Interval(took, false, false) + require.Equal(blockPeriod-took, pollInterval) + + // multiple errors followed by a successful call that yielded one of just a couple of blocks + pollInterval = poll.Interval(took, false, true) + require.Equal(blockPeriod, pollInterval) + pollInterval = poll.Interval(took, false, true) + require.Equal(2*blockPeriod, pollInterval) + pollInterval = poll.Interval(took, false, true) + require.Equal(slowdownLim, pollInterval) + pollInterval = poll.Interval(took, false, false) + require.Equal(blockPeriod-took, pollInterval) + + // multiple errors followed by a successful call that yielded multiple blocks + pollInterval = poll.Interval(took, false, true) + require.Equal(blockPeriod, pollInterval) + pollInterval = poll.Interval(took, false, true) + require.Equal(2*blockPeriod, pollInterval) + pollInterval = poll.Interval(took, false, true) + require.Equal(slowdownLim, pollInterval) + pollInterval = poll.Interval(took, true, false) + require.Equal(time.Duration(0), pollInterval) +} + +func TestChainMonitorEvents(t *testing.T) { + require := require.New(t) + ctx, cancel := test.NewTestContext() + + tc, err := crypto.NewBlockchainTestContext(ctx, 1, false) + require.NoError(err) + defer tc.Close() + + var ( + owner = tc.DeployerBlockchain + + collectedBlocksCount atomic.Int64 + collectedBlocks []crypto.BlockNumber + onBlockCallback = func(ctx context.Context, blockNumber crypto.BlockNumber) { + collectedBlocks = append(collectedBlocks, blockNumber) + collectedBlocksCount.Store(int64(len(collectedBlocks))) + } + + allEventCallbackCapturedEvents = make(chan types.Log, 1024) + allEventCallback = func(ctx context.Context, event types.Log) { + allEventCallbackCapturedEvents <- event + } + contractEventCallbackCapturedEvents = make(chan types.Log, 1024) + contractEventCallback = func(ctx context.Context, event types.Log) { + contractEventCallbackCapturedEvents <- event + } + contractWithTopicsEventCallbackCapturedEvents = make(chan types.Log, 1024) + contractWithTopicsEventCallback = func(ctx context.Context, event types.Log) { + contractWithTopicsEventCallbackCapturedEvents <- event + } + + onMonitorStoppedCount = make(chan struct{}) + onMonitorStopped = func(context.Context) { + close(onMonitorStoppedCount) + } + + nodeRegistryABI, _ = abi.JSON(strings.NewReader(contracts.NodeRegistryV1ABI)) + + urls = []string{"https://river0.test"} + addrs = []common.Address{tc.Wallets[0].Address} + ) + + tc.ChainMonitor.OnBlock(onBlockCallback) + tc.ChainMonitor.OnAllEvents(allEventCallback) + tc.ChainMonitor.OnContractEvent(tc.RiverRegistryAddress, contractEventCallback) + tc.ChainMonitor.OnContractWithTopicsEvent( + tc.RiverRegistryAddress, + [][]common.Hash{{nodeRegistryABI.Events["NodeAdded"].ID}}, + contractWithTopicsEventCallback, + ) + tc.DeployerBlockchain.ChainMonitor.OnStopped(onMonitorStopped) + + collectedBlocksCount.Store(0) + + pendingTx, err := owner.TxPool.Submit( + ctx, + "RegisterNode", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + return tc.NodeRegistry.RegisterNode(opts, addrs[0], urls[0], contracts.NodeStatus_NotInitialized) + }, + ) + require.NoError(err) + + // generate some blocks + N := 5 + for i := 0; i < N; i++ { + tc.Commit(ctx) + } + + receipt := <-pendingTx.Wait() + require.Equal(uint64(1), receipt.Status) + + // wait a bit for the monitor to catch up and has called the callbacks + for collectedBlocksCount.Load() < int64(N) { + time.Sleep(10 * time.Millisecond) + } + + firstBlock := collectedBlocks[0] + for i := range collectedBlocks { + require.Exactly(firstBlock+crypto.BlockNumber(i), collectedBlocks[i]) + } + + require.GreaterOrEqual(len(allEventCallbackCapturedEvents), 1) + require.GreaterOrEqual(len(contractEventCallbackCapturedEvents), 1) + event := <-contractWithTopicsEventCallbackCapturedEvents + require.Equal(nodeRegistryABI.Events["NodeAdded"].ID, event.Topics[0]) + + cancel() + <-onMonitorStoppedCount // if the on stop callback isn't called this will time out +} diff --git a/core/node/crypto/chain_txpool.go b/core/node/crypto/chain_txpool.go new file mode 100644 index 000000000..ee338a382 --- /dev/null +++ b/core/node/crypto/chain_txpool.go @@ -0,0 +1,529 @@ +package crypto + +import ( + "context" + "encoding/hex" + "errors" + "math/big" + "sync" + "sync/atomic" + "time" + + "github.com/prometheus/client_golang/prometheus" + "github.com/river-build/river/core/node/infra" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/dlog" + . "github.com/river-build/river/core/node/protocol" +) + +var ( + _ TransactionPool = (*transactionPool)(nil) + + transactionsSubmittedCounter = infra.NewCounterVec( + "txpool_submitted", "Number of transactions submitted", + "chain_id", "address", "func_selector", + ) + transactionsReplacedCounter = infra.NewCounterVec( + "txpool_replaced", "Number of replacement transactions submitted", + "chain_id", "address", "func_selector", + ) + transactionsPendingCounter = infra.NewGaugeVec( + "txpool_pending", "Number of transactions that are waiting to be included in the chain", + "chain_id", "address", + ) + transactionsProcessedCounter = infra.NewCounterVec( + "txpool_processed", "Number of submitted transactions that are included in the chain", + "chain_id", "address", "status", + ) + transactionGasCap = infra.NewGaugeVec( + "txpool_tx_fee_cap_wei", "Latest submitted EIP1559 transaction gas fee cap", + "chain_id", "address", "replacement", + ) + transactionGasTip = infra.NewGaugeVec( + "txpool_tx_miner_tip_wei", "Latest submitted EIP1559 transaction gas fee miner tip", + "chain_id", "address", "replacement", + ) + transactionInclusionDuration = infra.NewHistogram( + "txpool_tx_inclusion_duration_sec", + "How long it takes before a transaction is included in the chain", + prometheus.LinearBuckets(1.0, 2.0, 10), "chain_id", "address", + ) + walletBalance = infra.NewGaugeVec( + "txpool_wallet_balance_eth", "Wallet native coin balance", + "chain_id", "address", + ) +) + +type ( + // TransactionPoolPendingTransaction is a transaction that is submitted to the network but not yet included in the + // chain. Because a transaction can be resubmitted with different gas parameters the transaction hash isn't stable. + TransactionPoolPendingTransaction interface { + // Wait till the transaction is included in the chain and the receipt is available. + Wait() <-chan *types.Receipt + // TransactionHash returns the hash of the transaction that was executed on the chain. + // This is not always reliably populated on the transaction receipt. + TransactionHash() common.Hash + } + + // CreateTransaction expects the function to create a transaction with the received transaction options. + CreateTransaction = func(opts *bind.TransactOpts) (*types.Transaction, error) + + // TransactionPool represents an in-memory transaction pool to which transaction can be submitted. + TransactionPool interface { + // Submit calls createTx and sends the resulting transaction to the blockchain. It returns a pending transaction + // for which the caller can wait for the transaction receipt to arrive. The pool will resubmit transactions + // when necessary. + Submit(ctx context.Context, name string, createTx CreateTransaction) (TransactionPoolPendingTransaction, error) + + // EstimateGas estimates the gas usage of the transaction that would be created by createTx. + EstimateGas(ctx context.Context, createTx CreateTransaction) (uint64, error) + + // ProcessedTransactionsCount returns the number of transactions that have been processed + ProcessedTransactionsCount() int64 + + // PendingTransactionsCount returns the number of pending transactions in the pool + PendingTransactionsCount() int64 + + // ReplacementTransactionsCount returns the number of replacement transactions sent + ReplacementTransactionsCount() int64 + + // LastReplacementTransactionUnix returns the last unix timestamp when a replacement transaction was sent. + // Or 0 when no replacement transaction has been sent. + LastReplacementTransactionUnix() int64 + } + + txPoolPendingTransaction struct { + txHashes []common.Hash // transaction hashes, due to resubmit there can be multiple + tx *types.Transaction + txOpts *bind.TransactOpts + next *txPoolPendingTransaction + name string + resubmit CreateTransaction + lastSubmit time.Time + // listener waits on this channel for the transaction receipt + listener chan *types.Receipt + // The hash of the transaction that was executed on the chain. This is only set on the + // receipt by geth nodes and is not always available. + executedHash common.Hash + } + + transactionPool struct { + client BlockchainClient + wallet *Wallet + chainID uint64 + chainIDStr string + replacePolicy TransactionPoolReplacePolicy + pricePolicy TransactionPricePolicy + signerFn bind.SignerFn + processedTxCount atomic.Int64 + pendingTxCount atomic.Int64 + replacementsSent atomic.Int64 + lastReplacementSent atomic.Int64 + + // metrics + transactionSubmitted *prometheus.CounterVec + transactionsReplaced *prometheus.CounterVec + transactionsPending prometheus.Gauge + transactionsProcessed *prometheus.CounterVec + transactionInclusionDuration prometheus.Observer + transactionGasCap *prometheus.GaugeVec + transactionGasTip *prometheus.GaugeVec + walletBalanceLastTimeChecked time.Time + walletBalance prometheus.Gauge + + // mu protects the remaining fields + mu sync.Mutex + firstPendingTx *txPoolPendingTransaction + lastPendingTx *txPoolPendingTransaction + } +) + +// NewTransactionPoolWithPoliciesFromConfig creates an in-memory transaction pool that tracks transactions that are +// submitted through it. Pending transactions checked on each block if they are eligable to be replaced (through the +// replacement policy). If the pending transaction must be replaced is uses the price policy to determine the new gas +// fees for the replacement transaction. The pool then submits the replacement policy. It keeps track of the old pending +// transactions in case the original transaction was included in the chain. +func NewTransactionPoolWithPoliciesFromConfig( + ctx context.Context, + cfg *config.ChainConfig, + riverClient BlockchainClient, + wallet *Wallet, + chainMonitor ChainMonitor, +) (*transactionPool, error) { + if cfg.BlockTimeMs <= 0 { + return nil, RiverError(Err_BAD_CONFIG, "BlockTimeMs must be set"). + Func("NewBlockchainWithClient") + } + // if pending tx timeout is not specified use a default of 3*chain.BlockPeriod + txTimeout := cfg.TransactionPool.TransactionTimeout + if txTimeout == 0 { + txTimeout = 3 * time.Duration(cfg.BlockTimeMs) * time.Millisecond + } + + var ( + replacementPolicy = NewTransactionPoolDeadlinePolicy(txTimeout) + pricePolicy = NewDefaultTransactionPricePolicy( + cfg.TransactionPool.GasFeeIncreasePercentage, + cfg.TransactionPool.GasFeeCap, + cfg.TransactionPool.MinerTipFeeReplacementPercentage) + ) + + return NewTransactionPoolWithPolicies( + ctx, riverClient, wallet, replacementPolicy, pricePolicy, chainMonitor) +} + +// NewTransactionPoolWithPolicies creates an in-memory transaction pool that tracks transactions that are submitted +// through it. Pending transactions checked on each block if they are eligable to be replaced. This is determined with +// the given replacePolicy. If the pending transaction must be replaced the given pricePolicy is used to determine the +// fees for the replacement transaction. The pool than submits the replacement policy. It keeps track of the old pending +// transactions in case the original transaction was included in the chain. +func NewTransactionPoolWithPolicies( + ctx context.Context, + client BlockchainClient, + wallet *Wallet, + replacePolicy TransactionPoolReplacePolicy, + pricePolicy TransactionPricePolicy, + chainMonitor ChainMonitor, +) (*transactionPool, error) { + chainID, err := client.ChainID(ctx) + if err != nil { + return nil, err + } + + signer := types.LatestSignerForChainID(chainID) + + signerFn := func(address common.Address, tx *types.Transaction) (*types.Transaction, error) { + signature, err := crypto.Sign(signer.Hash(tx).Bytes(), wallet.PrivateKeyStruct) + if err != nil { + return nil, err + } + return tx.WithSignature(signer, signature) + } + + txPool := &transactionPool{ + client: client, + wallet: wallet, + chainID: chainID.Uint64(), + chainIDStr: chainID.String(), + replacePolicy: replacePolicy, + pricePolicy: pricePolicy, + signerFn: signerFn, + transactionSubmitted: transactionsSubmittedCounter.MustCurryWith( + prometheus.Labels{"chain_id": chainID.String(), "address": wallet.Address.String()}), + transactionsReplaced: transactionsReplacedCounter.MustCurryWith( + prometheus.Labels{"chain_id": chainID.String(), "address": wallet.Address.String()}), + transactionsPending: transactionsPendingCounter.With( + prometheus.Labels{"chain_id": chainID.String(), "address": wallet.Address.String()}), + transactionsProcessed: transactionsProcessedCounter.MustCurryWith( + prometheus.Labels{"chain_id": chainID.String(), "address": wallet.Address.String()}), + transactionInclusionDuration: transactionInclusionDuration.With( + prometheus.Labels{"chain_id": chainID.String(), "address": wallet.Address.String()}), + transactionGasCap: transactionGasCap.MustCurryWith( + prometheus.Labels{"chain_id": chainID.String(), "address": wallet.Address.String()}), + transactionGasTip: transactionGasTip.MustCurryWith( + prometheus.Labels{"chain_id": chainID.String(), "address": wallet.Address.String()}), + walletBalance: walletBalance.With( + prometheus.Labels{"chain_id": chainID.String(), "address": wallet.Address.String()}), + } + + chainMonitor.OnBlock(txPool.OnBlock) + chainMonitor.OnHeader(txPool.OnHeader) + + return txPool, nil +} + +func (tx *txPoolPendingTransaction) Wait() <-chan *types.Receipt { + return tx.listener +} + +func (tx *txPoolPendingTransaction) TransactionHash() common.Hash { + return tx.executedHash +} + +// caller is expected to hold a lock on r.mu +func (r *transactionPool) nextNonce(ctx context.Context) (uint64, error) { + if r.lastPendingTx != nil { + return r.lastPendingTx.tx.Nonce() + 1, nil + } + return r.client.PendingNonceAt(ctx, r.wallet.Address) +} + +func (r *transactionPool) ProcessedTransactionsCount() int64 { + return r.processedTxCount.Load() +} + +func (r *transactionPool) PendingTransactionsCount() int64 { + return r.pendingTxCount.Load() +} + +func (r *transactionPool) ReplacementTransactionsCount() int64 { + return r.replacementsSent.Load() +} + +func (r *transactionPool) LastReplacementTransactionUnix() int64 { + return r.lastReplacementSent.Load() +} + +func (r *transactionPool) EstimateGas(ctx context.Context, createTx CreateTransaction) (uint64, error) { + r.mu.Lock() + defer r.mu.Unlock() + + opts := &bind.TransactOpts{ + From: r.wallet.Address, + Nonce: new(big.Int).SetUint64(0), + Signer: r.signerFn, + Context: ctx, + NoSend: true, + } + + tx, err := createTx(opts) + log := dlog.FromCtx(ctx) + if err != nil { + log.Debug("Estimating gas for transaction failed", "err", err) + return 0, err + } + return tx.Gas(), nil +} + +func (r *transactionPool) Submit( + ctx context.Context, + name string, + createTx CreateTransaction, +) (TransactionPoolPendingTransaction, error) { + log := dlog.FromCtx(ctx) + + r.mu.Lock() + defer r.mu.Unlock() + + nonce, err := r.nextNonce(ctx) + if err != nil { + return nil, err + } + + opts := &bind.TransactOpts{ + From: r.wallet.Address, + Nonce: new(big.Int).SetUint64(nonce), + Signer: r.signerFn, + Context: ctx, + NoSend: true, + } + + tx, err := createTx(opts) + if err != nil { + return nil, err + } + + // ensure that tx gas price is not higher than node operator has defined in the config he is willing to pay + if tx.GasFeeCap() != nil && r.pricePolicy.GasFeeCap() != nil && tx.GasFeeCap().Cmp(r.pricePolicy.GasFeeCap()) > 0 { + return nil, RiverError(Err_BAD_CONFIG, "Transaction too expensive"). + Tags("tx.GasFeeCap", tx.GasFeeCap().String(), "user.GasFeeCap", r.pricePolicy.GasFeeCap().String(), "name", name). + Func("Submit") + } + + if err := r.client.SendTransaction(ctx, tx); err != nil { + return nil, err + } + + // metrics + funcSelector := funcSelectorFromTxForMetrics(tx) + gasCap, _ := tx.GasFeeCap().Float64() + tipCap, _ := tx.GasTipCap().Float64() + + r.transactionSubmitted.With(prometheus.Labels{"func_selector": funcSelector}).Add(1) + r.transactionsPending.Add(1) + r.transactionGasCap.With(prometheus.Labels{"replacement": "false"}).Set(gasCap) + r.transactionGasTip.With(prometheus.Labels{"replacement": "false"}).Set(tipCap) + + log.Info( + "TxPool: Transaction SENT", + "txHash", tx.Hash(), + "chain", r.chainID, + "name", name, + "nonce", tx.Nonce(), + "from", opts.From, + "to", tx.To(), + "gasPrice", tx.GasPrice(), + "gasFeeCap", tx.GasFeeCap(), + "gasTipCap", tx.GasTipCap(), + ) + + pendingTx := &txPoolPendingTransaction{ + txHashes: []common.Hash{tx.Hash()}, + tx: tx, + txOpts: opts, + resubmit: createTx, + name: name, + lastSubmit: time.Now(), + listener: make(chan *types.Receipt, 1), + } + + if r.lastPendingTx == nil { + r.firstPendingTx = pendingTx + r.lastPendingTx = pendingTx + } else { + r.lastPendingTx.next = pendingTx + r.lastPendingTx = pendingTx + } + + r.pendingTxCount.Add(1) + + return pendingTx, nil +} + +func (r *transactionPool) OnHeader(ctx context.Context, _ *types.Header) { + if time.Since(r.walletBalanceLastTimeChecked) < time.Minute { + return + } + + balance, err := r.client.BalanceAt(ctx, r.wallet.Address, nil) + if err != nil { + log := dlog.FromCtx(ctx).With("chain", r.chainID) + log.Error("Unable to retrieve wallet balance", "err", err) + return + } + + r.walletBalance.Set(WeiToEth(balance)) + r.walletBalanceLastTimeChecked = time.Now() +} + +func (r *transactionPool) OnBlock(ctx context.Context, blockNumber BlockNumber) { + log := dlog.FromCtx(ctx).With("chain", r.chainID) + + r.mu.Lock() + // if !r.mu.TryLock() { + // log.Debug("unable to claim tx pool lock") + // return + // } + defer r.mu.Unlock() + + if r.firstPendingTx == nil { + return + } + + nonce, err := r.client.NonceAt(ctx, r.wallet.Address, nil) + if err != nil { + log.Warn("unable to get tx pool nonce", "err", err) + return + } + + // retrieve receipts for processed transactions and send receipt to listener + for pendingTx := r.firstPendingTx; pendingTx != nil && pendingTx.tx.Nonce() < nonce; pendingTx = r.firstPendingTx { + for _, txHash := range r.firstPendingTx.txHashes { + receipt, err := r.client.TransactionReceipt(ctx, txHash) + if receipt != nil { + r.pendingTxCount.Add(-1) + r.processedTxCount.Add(1) + r.transactionInclusionDuration.Observe(time.Since(r.firstPendingTx.lastSubmit).Seconds()) + + if r.lastPendingTx.tx.Nonce() == pendingTx.tx.Nonce() { + r.lastPendingTx = nil + } + r.firstPendingTx.executedHash = txHash + r.firstPendingTx.listener <- receipt + r.firstPendingTx, pendingTx.next = r.firstPendingTx.next, nil + + status := "failed" + if receipt.Status == types.ReceiptStatusSuccessful { + status = "succeeded" + } + r.transactionsProcessed.With(prometheus.Labels{"status": status}).Inc() + r.transactionsPending.Add(-1) + + log.Info( + "TxPool: Transaction DONE", + "txHash", txHash, + "chain", r.chainID, + "name", pendingTx.name, + "from", pendingTx.txOpts.From, + "to", pendingTx.tx.To(), + "nonce", pendingTx.tx.Nonce(), + "succeeded", receipt.Status == types.ReceiptStatusSuccessful, + "cumulativeGasUsed", receipt.CumulativeGasUsed, + "gasUsed", receipt.GasUsed, + "effectiveGasPrice", receipt.EffectiveGasPrice, + "blockHash", receipt.BlockHash, + "blockNumber", receipt.BlockNumber, + ) + break + } + if errors.Is(err, ethereum.NotFound) { + continue + } + if err != nil { + log.Warn("unable to get transaction receipt", "txHash", txHash.Hex(), "err", err) + return + } + } + } + + var head *types.Header + // replace transactions that are eligible for it + for pendingTx := r.firstPendingTx; pendingTx != nil; pendingTx = pendingTx.next { + if head == nil { + // replace transactions that are eligible for it + head, err = r.client.HeaderByNumber(ctx, blockNumber.AsBigInt()) + if err != nil { + log.Error("unable to retrieve chain head", "err", err) + return + } + } + if r.replacePolicy.Eligible(head, pendingTx.lastSubmit, pendingTx.tx) { + pendingTx.txOpts.GasPrice, pendingTx.txOpts.GasFeeCap, pendingTx.txOpts.GasTipCap = r.pricePolicy.Reprice( + head, pendingTx.tx) + + pendingTx.txOpts.GasLimit = 0 // force resimulation to determine new gas limit + + tx, err := pendingTx.resubmit(pendingTx.txOpts) + if err != nil { + log.Warn("unable to create replacement transaction", "txHash", pendingTx.tx.Hash(), "err", err) + continue + } + + if err := r.client.SendTransaction(ctx, tx); err == nil { + log.Info( + "TxPool: Transaction REPLACED", + "old", pendingTx.tx.Hash(), + "txHash", tx.Hash(), + "chain", r.chainID, + "name", pendingTx.name, + "nonce", tx.Nonce(), + "from", pendingTx.txOpts.From, + "to", tx.To(), + "gasPrice", tx.GasPrice(), + "gasFeeCap", tx.GasFeeCap(), + "gasTipCap", tx.GasTipCap(), + ) + + pendingTx.tx = tx + pendingTx.txHashes = append(pendingTx.txHashes, tx.Hash()) + pendingTx.lastSubmit = time.Now() + r.replacementsSent.Add(1) + r.lastReplacementSent.Store(pendingTx.lastSubmit.Unix()) + + funcSelector := funcSelectorFromTxForMetrics(tx) + gasCap, _ := tx.GasFeeCap().Float64() + tipCap, _ := tx.GasTipCap().Float64() + + r.transactionsReplaced.With(prometheus.Labels{"func_selector": funcSelector}).Add(1) + r.transactionGasCap.With(prometheus.Labels{"replacement": "false"}).Set(gasCap) + r.transactionGasTip.With(prometheus.Labels{"replacement": "false"}).Set(tipCap) + } else { + log.Error("unable to replace transaction", "txHash", tx.Hash(), "err", err) + } + } + } +} + +func funcSelectorFromTxForMetrics(tx *types.Transaction) string { + if len(tx.Data()) >= 4 { + return hex.EncodeToString(tx.Data()[:4]) + } + return "unknown" +} diff --git a/core/node/crypto/chain_txpool_policy.go b/core/node/crypto/chain_txpool_policy.go new file mode 100644 index 000000000..e996e6c5f --- /dev/null +++ b/core/node/crypto/chain_txpool_policy.go @@ -0,0 +1,129 @@ +package crypto + +import ( + "math/big" + "time" + + "github.com/ethereum/go-ethereum/core/types" +) + +type ( + // TransactionPoolReplacePolicy determines when a pending transaction is eligible to be resubmitted. + TransactionPoolReplacePolicy interface { + // Eligible returns an indication if it is time to replace the given pendingTx. + Eligible(chainHead *types.Header, lastSubmitted time.Time, pendingTx *types.Transaction) bool + } + + // TransactionPricePolicy calculates gas prices for transactions. + TransactionPricePolicy interface { + // GasFeeCap for EIP1559 transactions as specified by the user + GasFeeCap() *big.Int + // Price a transaction + Price(tx *types.Transaction) (gasPrice *big.Int, gasBaseFee *big.Int, gasMinerTip *big.Int) + // Fees returns the new gas price, base fee and tip for the given "stuck" transaction based on the header and + // the given tx. These new gas prices can be used in the replacement transaction. + Reprice( + head *types.Header, + tx *types.Transaction, + ) (gasPrice *big.Int, gasBaseFee *big.Int, gasMinerTip *big.Int) + } +) + +// NewTransactionPoolDeadlinePolicy returns a replacement policy that makes any transactions that have not been +// processed within the given timeout eligible for replacement. +func NewTransactionPoolDeadlinePolicy(timeout time.Duration) TransactionPoolReplacePolicy { + if timeout == 0 { + timeout = 5 * time.Second + } + return &transactionPoolDeadlinePolicy{ + timeout: timeout, + } +} + +type transactionPoolDeadlinePolicy struct { + timeout time.Duration +} + +func (pol *transactionPoolDeadlinePolicy) Eligible( + chainHead *types.Header, + lastSubmitted time.Time, + pendingTx *types.Transaction, +) bool { + return time.Since(lastSubmitted) >= pol.timeout +} + +type defaultTransactionPricingPolicy struct { + gasPricePercentage *big.Int + gasFeeCap *big.Int + minerTipPercentage *big.Int +} + +func NewDefaultTransactionPricePolicy( + gasPricePercentage int, + gasFeeCap int, + minerTipReplacementPercentage int, +) TransactionPricePolicy { + var ( + gasPriceP = big.NewInt(int64(gasPricePercentage)) + gasFeeCapAbs *big.Int + minerTipP = big.NewInt(int64(minerTipReplacementPercentage)) + ) + if gasPricePercentage == 0 { + gasPriceP = big.NewInt(10) + } + if gasFeeCap != 0 { + gasFeeCapAbs = big.NewInt(int64(gasFeeCap)) + } + if minerTipReplacementPercentage == 0 { + minerTipP = big.NewInt(10) + } + + return &defaultTransactionPricingPolicy{gasPriceP, gasFeeCapAbs, minerTipP} +} + +func (pol *defaultTransactionPricingPolicy) GasFeeCap() *big.Int { + return pol.gasFeeCap +} + +func (pol *defaultTransactionPricingPolicy) Price( + tx *types.Transaction, +) (gasPrice *big.Int, gasFeeCap *big.Int, gasMinerTip *big.Int) { + // let the abigen bindings generate the first tx minter tip. + return nil, pol.gasFeeCap, nil +} + +func (pol *defaultTransactionPricingPolicy) Reprice( + head *types.Header, + tx *types.Transaction, +) (gasPrice *big.Int, gasFeeCap *big.Int, gasMinerTip *big.Int) { + var ( + val100 = big.NewInt(100) + one = big.NewInt(1) + inc = func(val *big.Int, percentage *big.Int) *big.Int { + if val == nil { + return nil + } + + newVal := new(big.Int).Div(new(big.Int).Mul(val, new(big.Int).Add(val100, percentage)), val100) + // add one to make 10% increment accepted, nodes accept replacements that have a > 10% gas price/miner tip + if percentage.Uint64() == 10 { + newVal = new(big.Int).Add(newVal, one) + } + + return newVal + } + ) + + if tx.GasFeeCap() != nil { // EIP1559 tx + newGasFeeCap := new(big.Int).Add(inc(tx.GasFeeCap(), big.NewInt(10)), one) + if pol.gasFeeCap == nil { + return nil, nil, inc(tx.GasTipCap(), pol.minerTipPercentage) + } + if newGasFeeCap.Cmp(pol.gasFeeCap) > 0 { + newGasFeeCap = pol.gasFeeCap + } + return nil, newGasFeeCap, inc(tx.GasTipCap(), pol.minerTipPercentage) + } + + return inc(tx.GasPrice(), pol.gasPricePercentage), nil, nil // legacy tx +} diff --git a/core/node/crypto/chain_txpool_test.go b/core/node/crypto/chain_txpool_test.go new file mode 100644 index 000000000..3f83f8114 --- /dev/null +++ b/core/node/crypto/chain_txpool_test.go @@ -0,0 +1,71 @@ +package crypto_test + +import ( + "fmt" + "testing" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + "github.com/river-build/river/core/node/base/test" + "github.com/river-build/river/core/node/crypto" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestNewTransactionPoolWithReplaceTx(t *testing.T) { + var ( + require = require.New(t) + assert = assert.New(t) + N = 3 + ctx, cancel = test.NewTestContext() + resubmitPolicy = crypto.NewTransactionPoolDeadlinePolicy(250 * time.Millisecond) + repricePolicy = crypto.NewDefaultTransactionPricePolicy(0, 15_000_000_000, 0) + tc, errTC = crypto.NewBlockchainTestContext(ctx, 1, false) + pendingTxs []crypto.TransactionPoolPendingTransaction + ) + defer cancel() + + require.NoError(errTC, "unable to construct block test context") + + tc.Commit(ctx) + + txPool, err := crypto.NewTransactionPoolWithPolicies( + ctx, tc.Client(), tc.DeployerBlockchain.Wallet, resubmitPolicy, repricePolicy, tc.ChainMonitor) + require.NoError(err, "unable to construct transaction pool") + + for i := 0; i < N; i++ { + pendingTx, err := txPool.Submit( + ctx, + "RegisterNode", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + nodeWallet, err := crypto.NewWallet(ctx) + require.Nil(err, "generate node wallet") + url := fmt.Sprintf("http://%d.node.test", i) + return tc.NodeRegistry.RegisterNode(opts, nodeWallet.Address, url, 2) + }, + ) + require.NoError(err, "unable to send transaction") + pendingTxs = append(pendingTxs, pendingTx) + } + + for _, pendingTx := range pendingTxs { + done := false + for !done { + select { + case receipt := <-pendingTx.Wait(): + assert.NotNil(receipt, "transaction receipt is nil") + assert.Equal(uint64(1), receipt.Status, "transaction status is not successful") + done = true + case <-ctx.Done(): + t.Fatal("test expired before all transactions were processed") + case <-time.After(time.Second): + if tc.IsSimulated() || (tc.IsAnvil() && !tc.AnvilAutoMineEnabled()) { + tc.Commit(ctx) + } + } + } + } + + assert.EqualValues(0, txPool.PendingTransactionsCount(), "tx pool must have no pending tx") +} diff --git a/core/node/crypto/chain_utils.go b/core/node/crypto/chain_utils.go new file mode 100644 index 000000000..f19b04b11 --- /dev/null +++ b/core/node/crypto/chain_utils.go @@ -0,0 +1,26 @@ +package crypto + +import ( + "slices" + + "github.com/ethereum/go-ethereum/common" +) + +func matchTopics(cbTopics [][]common.Hash, logTopics []common.Hash) bool { + if len(cbTopics) == 0 { + return true + } + + if len(cbTopics) > len(logTopics) { + return false + } + + // ignore extra topics in log if callback is not filtering on them + for i, ltopic := range logTopics[:len(cbTopics)] { + if !slices.Contains(cbTopics[i], ltopic) { + return false + } + } + + return true +} diff --git a/core/node/crypto/config.go b/core/node/crypto/config.go new file mode 100644 index 000000000..f3a23eb28 --- /dev/null +++ b/core/node/crypto/config.go @@ -0,0 +1,319 @@ +package crypto + +import ( + "context" + "fmt" + "sort" + "strings" + "sync" + "sync/atomic" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/contracts" + "github.com/river-build/river/core/node/dlog" + . "github.com/river-build/river/core/node/protocol" +) + +var ( + // StreamReplicationFactorKey is the key for how often a stream is replicated over nodes + StreamReplicationFactorKey = newChainKeyImpl("stream.replication.factor") + + uint64Type, _ = abi.NewType("uint64", "", nil) + int64Type, _ = abi.NewType("int64", "", nil) +) + +// ChainKey represents a key under which settings are storedin the RiverConfig +// smart contract. +type ( + ChainKey interface { + // ID is the key under which the setting is stored in the RiverConfig smart contract. + ID() common.Hash + // Name is the human-readable name of the setting. + Name() string + } + + // OnChainConfiguration retrieves configuration settings from the RiverConfig facet smart contract. + OnChainConfiguration interface { + // GetUint64 returns the setting value for the given key that is active on the current block. + GetUint64(key ChainKey) (uint64, error) + // GetInt64 returns the setting value for the given key that is active on the current block. + GetInt64(key ChainKey) (int64, error) + // GetUint64OnBlock returns the setting value for the given key that is active on the given block number. + GetUint64OnBlock(blockNumber uint64, key ChainKey) (uint64, error) + // GetInt64OnBlock returns the setting value for the given key that is active on the given block number. + GetInt64OnBlock(blockNumber uint64, key ChainKey) (int64, error) + } + + onChainConfiguration struct { + // settings holds a list of values for a particular setting, indexed by key and sorted by block number + // the setting becomes active. + settings *onChainSettings + // activeBlock holds the current block on which the node is active + activeBlock atomic.Uint64 + // contract interacts with the on-chain contract and provide metadata for decoding events + contract *contracts.RiverConfigV1Caller + } + + // Settings holds a list of setting values for each type of setting. + // For each key there can be multiple setting values, each active on a different + // block number. Therefor to get the correct value users need to specify on + // which block number they need to get the setting value. + onChainSettings struct { + mu sync.RWMutex + s map[common.Hash]settings + } + + // settingValue represents a setting as store on-chain in the RiverConfig smart contract. + settingValue struct { + // ActiveFromBlockNumber is the block number from which this setting is active + ActiveFromBlockNumber uint64 + // Value holds the raw value as fetched from the RiverConfig smart contract + Value []byte + } + + // settings represents a list of setting values. + settings []*settingValue + + // sort setting values by block number + byBlockNumber []*settingValue + + // implements ChainKey + chainKeyImpl struct { + key common.Hash + name string + } +) + +// NewOnChainConfig returns a OnChainConfiguration that syncs with the on-chain configuration contract. +func NewOnChainConfig( + ctx context.Context, + riverClient BlockchainClient, + riverRegistry common.Address, + appliedBlockNum BlockNumber, + chainMonitor ChainMonitor, +) (*onChainConfiguration, error) { + caller, err := contracts.NewRiverConfigV1Caller(riverRegistry, riverClient) + if err != nil { + return nil, err + } + + // load configuration from the chain and store it in the in-memory cache. + retrievedSettings, err := caller.GetAllConfiguration(&bind.CallOpts{ + Context: ctx, + BlockNumber: appliedBlockNum.AsBigInt(), + }) + if err != nil { + return nil, AsRiverError(err, Err_CANNOT_CONNECT). + Message("Failed to retrieve on-chain configuration"). + Func("NewOnChainConfig") + } + + cfgABI, err := contracts.RiverConfigV1MetaData.GetAbi() + if err != nil { + panic(fmt.Sprintf("RiverConfigV1 ABI invalid: %v", err)) + } + + cfg := &onChainConfiguration{settings: &onChainSettings{ + s: make(map[common.Hash]settings), + }, contract: caller} + + for _, setting := range retrievedSettings { + cfg.settings.Set(setting.Key, setting.BlockNumber, setting.Value) + } + + // set the current block number as the current active block. This is used to determine which settings are currently + // active. Settings can be queued and become active after a future block. + cfg.activeBlock.Store(appliedBlockNum.AsUint64()) + + // on block sets the current block number that is used to determine the active configuration setting. + chainMonitor.OnBlock(cfg.onBlock) + + // each time configuration stored on chain changed the ConfigurationChanged event is raised. + // Register a callback that updates the in-memory configuration when this happens. + chainMonitor.OnContractWithTopicsEvent( + riverRegistry, [][]common.Hash{{cfgABI.Events["ConfigurationChanged"].ID}}, cfg.onConfigChanged) + + return cfg, nil +} + +func (occ *onChainConfiguration) onBlock(ctx context.Context, blockNumber BlockNumber) { + occ.activeBlock.Store(blockNumber.AsUint64()) +} + +func (occ *onChainConfiguration) onConfigChanged(ctx context.Context, event types.Log) { + var ( + log = dlog.FromCtx(ctx) + e contracts.RiverConfigV1ConfigurationChanged + ) + if err := occ.contract.BoundContract().UnpackLog(&e, "ConfigurationChanged", event); err != nil { + log.Error("OnChainConfiguration: unable to decode ConfigurationChanged event") + return + } + + if e.Deleted { + occ.settings.Remove(e.Key, e.Block) + } else { + occ.settings.Set(e.Key, e.Block, e.Value) + } +} + +func (occ *onChainConfiguration) GetUint64(key ChainKey) (uint64, error) { + blockNum := occ.activeBlock.Load() + return occ.GetUint64OnBlock(blockNum, key) +} + +func (occ *onChainConfiguration) GetInt64(key ChainKey) (int64, error) { + blockNum := occ.activeBlock.Load() + return occ.GetInt64OnBlock(blockNum, key) +} + +func (occ *onChainConfiguration) GetUint64OnBlock(blockNumber uint64, key ChainKey) (uint64, error) { + setting := occ.settings.getOnBlock(key, blockNumber) + if setting == nil { + return 0, RiverError(Err_NOT_FOUND, "Missing on-chain configuration setting"). + Tag("key", key.Name()). + Func("GetUint64") + } + return setting.Uint64() +} + +func (occ *onChainConfiguration) GetInt64OnBlock(blockNumber uint64, key ChainKey) (int64, error) { + setting := occ.settings.getOnBlock(key, blockNumber) + if setting == nil { + return 0, RiverError(Err_NOT_FOUND, "Missing on-chain configuration setting"). + Tag("key", key.Name()). + Func("GetInt64") + } + return setting.Int64() +} + +func (ocs *onChainSettings) Remove(key common.Hash, activeOnBlockNumber uint64) { + ocs.mu.Lock() + defer ocs.mu.Unlock() + + for i, v := range ocs.s[key] { + if v.ActiveFromBlockNumber == activeOnBlockNumber { + ocs.s[key][len(ocs.s[key])-1], ocs.s[key][i] = ocs.s[key][i], ocs.s[key][len(ocs.s[key])-1] + ocs.s[key] = ocs.s[key][:len(ocs.s[key])-1] + return + } + } +} + +// Set the given value to the settings identified by the given key for the +// given block number. +func (ocs *onChainSettings) Set(key common.Hash, activeOnBlockNumber uint64, value []byte) { + ocs.mu.Lock() + defer ocs.mu.Unlock() + + for i, v := range ocs.s[key] { + if v.ActiveFromBlockNumber == activeOnBlockNumber { // update + // create new instance because original settingsValue might be shared at this moment + // and therefore can't be updated. + ocs.s[key][i] = &settingValue{ + ActiveFromBlockNumber: activeOnBlockNumber, + Value: value, + } + return + } + } + + ocs.s[key] = append(ocs.s[key], &settingValue{ + ActiveFromBlockNumber: activeOnBlockNumber, + Value: value, + }) + + sort.Sort(byBlockNumber(ocs.s[key])) +} + +// Get returns the set of settings for the given key. +func (ocs *onChainSettings) getOnBlock(key ChainKey, blockNumber uint64) *settingValue { + ocs.mu.RLock() + defer ocs.mu.RUnlock() + + return ocs.s[key.ID()].OnBlock(blockNumber) +} + +func (s byBlockNumber) Len() int { return len(s) } +func (s byBlockNumber) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s byBlockNumber) Less(i, j int) bool { + return s[i].ActiveFromBlockNumber < s[j].ActiveFromBlockNumber +} + +// OnBlock return the setting that is active at the given block number. +func (s settings) OnBlock(blockNumber uint64) *settingValue { + for i := len(s) - 1; i >= 0; i-- { + if s[i].ActiveFromBlockNumber <= blockNumber { + return s[i] + } + } + return nil +} + +// Uint64 returns the setting value as uint64. +// If the value could not be decoded to an uint64 an error is returned. +func (s *settingValue) Uint64() (uint64, error) { + if s == nil { + return 0, RiverError(Err_NOT_FOUND, "Missing on-chain configuration setting") + } + + args := abi.Arguments{{Type: uint64Type}} + decoded, err := args.Unpack(s.Value) + if err != nil { + return 0, AsRiverError(err, Err_BAD_CONFIG).Func("Uint64") + } + if len(decoded) == 1 { + if i, ok := decoded[0].(uint64); ok { + return i, nil + } + } + return 0, RiverError(Err_BAD_CONFIG, "Invalid configuration setting").Func("Uint64") +} + +// Uint64 returns the setting value as int64. +// If the value could not be decoded to an uint64 an error is returned. +func (s *settingValue) Int64() (int64, error) { + if s == nil { + return 0, RiverError(Err_NOT_FOUND, "Missing on-chain configuration setting") + } + + args := abi.Arguments{{Type: int64Type}} + decoded, err := args.Unpack(s.Value) + if err != nil { + return 0, AsRiverError(err, Err_BAD_CONFIG).Func("GetInt64") + } + if len(decoded) == 1 { + if i, ok := decoded[0].(int64); ok { + return i, nil + } + } + return 0, RiverError(Err_BAD_CONFIG, "Invalid configuration setting").Func("Uint64") +} + +// ID returns the key under which the setting is stored on-chain in the +// RiverConfig smart contract. +func (ck chainKeyImpl) ID() common.Hash { + return ck.key +} + +func (ck chainKeyImpl) Name() string { + return ck.name +} + +func newChainKeyImpl(key string) chainKeyImpl { + return chainKeyImpl{ + crypto.Keccak256Hash([]byte(strings.ToLower(key))), + strings.ToLower(key), + } +} + +// ABIEncodeInt64 returns Solidity abi.encode(i) +func ABIEncodeInt64(i int64) []byte { + value, _ := abi.Arguments{{Type: int64Type}}.Pack(i) + return value +} diff --git a/core/node/crypto/config_test.go b/core/node/crypto/config_test.go new file mode 100644 index 000000000..675c83a19 --- /dev/null +++ b/core/node/crypto/config_test.go @@ -0,0 +1,76 @@ +package crypto + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/base/test" + "github.com/river-build/river/core/node/protocol" + "github.com/stretchr/testify/require" +) + +func TestOnChainConfigSettingValues(t *testing.T) { + var ( + tests = []struct { + Key ChainKey + Block uint64 + Exp uint64 + RiverErrCode protocol.Err + }{ + {StreamReplicationFactorKey, 0, 1, -1}, + {StreamReplicationFactorKey, 9, 1, -1}, + {StreamReplicationFactorKey, 10, 2, -1}, + {StreamReplicationFactorKey, 20, 3, -1}, + {StreamReplicationFactorKey, 21, 3, -1}, + {StreamReplicationFactorKey, 30, 0, protocol.Err_BAD_CONFIG}, + } + settings = &onChainSettings{ + s: map[common.Hash]settings{}, + } + ) + + settings.Set( + StreamReplicationFactorKey.ID(), + 20, + common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000003"), + ) + settings.Set(StreamReplicationFactorKey.ID(), 30, common.Hex2Bytes("03")) // invalid value + settings.Set( + StreamReplicationFactorKey.ID(), + 0, + common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"), + ) + settings.Set( + StreamReplicationFactorKey.ID(), + 10, + common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), + ) + + for _, tt := range tests { + val, err := settings.getOnBlock(tt.Key, tt.Block).Uint64() + if err != nil && tt.RiverErrCode == -1 { + t.Fatalf("unexpected error: %v", err) + } else if err != nil && err.(*base.RiverErrorImpl).Code != tt.RiverErrCode { + t.Fatalf("want error code: %d, got %d", tt.RiverErrCode, err.(*base.RiverErrorImpl).Code) + } else if tt.Exp != val { + t.Errorf("expected %d, got %d", tt.Exp, val) + } + } +} + +func TestSetOnChain(t *testing.T) { + var ( + require = require.New(t) + ctx, cancel = test.NewTestContext() + ) + defer cancel() + + tc, err := NewBlockchainTestContext(ctx, 1, false) + require.NoError(err) + defer tc.Close() + + value, err := tc.OnChainConfig.GetUint64(StreamReplicationFactorKey) + require.NoError(err) + require.Equal(uint64(1), value) +} diff --git a/core/node/crypto/delegate.go b/core/node/crypto/delegate.go new file mode 100644 index 000000000..242902e76 --- /dev/null +++ b/core/node/crypto/delegate.go @@ -0,0 +1,67 @@ +package crypto + +import ( + "bytes" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto/secp256k1" + + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/protocol" +) + +func recoverEthereumMessageSignerAddress(hashSrc []byte, inSignature []byte) (*common.Address, error) { + if len(inSignature) != 65 { + return nil, RiverError( + Err_BAD_EVENT_SIGNATURE, + "Bad signature provided, expected 65 bytes", + "len", + len(inSignature), + ) + } + + var signature []byte + // Ethereum signatures are in the [R || S || V] format where V is 27 or 28 + // Support both the Ethereum and directly signed formats + if inSignature[64] == 27 || inSignature[64] == 28 { + // copy the signature to avoid modifying the original + signature = bytes.Clone(inSignature) + signature[64] -= 27 + } else { + signature = inSignature + } + + hash := accounts.TextHash(hashSrc) + + recoveredKey, err := secp256k1.RecoverPubkey(hash, signature) + if err != nil { + return nil, AsRiverError(err). + Message("Unable to recover public key"). + Func("recoverEthereumMessageSignerAddress") + } + address := PublicKeyToAddress(recoveredKey) + return &address, nil +} + +func CheckDelegateSig(expectedAddress []byte, devicePubKey []byte, delegateSig []byte, expiryEpochMs int64) error { + hashSrc, err := RiverDelegateHashSrc(devicePubKey, expiryEpochMs) + if err != nil { + return err + } + recoveredAddress, err := recoverEthereumMessageSignerAddress(hashSrc, delegateSig) + if err != nil { + return err + } + if !bytes.Equal(expectedAddress, recoveredAddress.Bytes()) { + return RiverError( + Err_BAD_EVENT_SIGNATURE, + "(Ethereum Message) Bad signature provided", + "computed address", + recoveredAddress, + "expected address", + expectedAddress, + ) + } + return nil +} diff --git a/core/node/crypto/delegate_test.go b/core/node/crypto/delegate_test.go new file mode 100644 index 000000000..f3b6d68c5 --- /dev/null +++ b/core/node/crypto/delegate_test.go @@ -0,0 +1,62 @@ +package crypto + +import ( + "testing" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/crypto" + "github.com/river-build/river/core/node/base/test" + "github.com/stretchr/testify/assert" +) + +func TestDelegateEth(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + + primaryWallet, err := NewWallet(ctx) + assert.NoError(t, err) + + deviceWallet, err := NewWallet(ctx) + assert.NoError(t, err) + devicePubKey := crypto.FromECDSAPub(&deviceWallet.PrivateKeyStruct.PublicKey) + + hashSrc, err := RiverDelegateHashSrc(devicePubKey, 0) + assert.NoError(t, err) + hash := accounts.TextHash(hashSrc) + delegatSig, err := crypto.Sign(hash, primaryWallet.PrivateKeyStruct) + assert.NoError(t, err) + delegatSig[64] += 27 + + err = CheckDelegateSig(primaryWallet.Address.Bytes(), devicePubKey, delegatSig, 0) + assert.NoError(t, err) +} + +func TestDelegateEthWithExpiry(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + + primaryWallet, err := NewWallet(ctx) + assert.NoError(t, err) + + deviceWallet, err := NewWallet(ctx) + assert.NoError(t, err) + devicePubKey := crypto.FromECDSAPub(&deviceWallet.PrivateKeyStruct.PublicKey) + + expiry := int64(1234567890) + + hashSrc, err := RiverDelegateHashSrc(devicePubKey, expiry) + assert.NoError(t, err) + + hash := accounts.TextHash(hashSrc) + delegatSig, err := crypto.Sign(hash, primaryWallet.PrivateKeyStruct) + assert.NoError(t, err) + delegatSig[64] += 27 + + // should fail because the expiry is not 0 + err = CheckDelegateSig(primaryWallet.Address.Bytes(), devicePubKey, delegatSig, 0) + assert.Error(t, err) + + // should succeed + err = CheckDelegateSig(primaryWallet.Address.Bytes(), devicePubKey, delegatSig, expiry) + assert.NoError(t, err) +} diff --git a/core/node/crypto/sign.go b/core/node/crypto/sign.go new file mode 100644 index 000000000..2954018b6 --- /dev/null +++ b/core/node/crypto/sign.go @@ -0,0 +1,446 @@ +package crypto + +import ( + "bytes" + "context" + "crypto/ecdsa" + "encoding/binary" + "encoding/hex" + "fmt" + "io" + "math/big" + "os" + "strings" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/secp256k1" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/dlog" + . "github.com/river-build/river/core/node/protocol" + "golang.org/x/crypto/sha3" +) + +const ( + WALLET_PATH = "./wallet" + WALLET_PATH_PRIVATE_KEY = "./wallet/private_key" + WALLET_PATH_PUBLIC_KEY = "./wallet/public_key" + WALLET_PATH_NODE_ADDRESS = "./wallet/node_address" + KEY_FILE_PERMISSIONS = 0o600 +) + +// String 'CSBLANCA' as bytes. +var HASH_HEADER = []byte{67, 83, 66, 76, 65, 78, 67, 65} + +// String 'ABCDEFG>' as bytes. +var HASH_SEPARATOR = []byte{65, 66, 67, 68, 69, 70, 71, 62} + +// String '= 2 && seedWalletPrivateKey[0] == '0' && + (seedWalletPrivateKey[1] == 'x' || seedWalletPrivateKey[1] == 'X') { + seedWalletPrivateKey = seedWalletPrivateKey[2:] + } + seederPrivateKey, err := crypto.HexToECDSA(seedWalletPrivateKey) + if err != nil { + return nil, nil, err + } + seederAddress := crypto.PubkeyToAddress(seederPrivateKey.PublicKey) + + client, err := ethclient.DialContext(ctx, url) + if err != nil { + return nil, nil, err + } + + chainID, err := client.ChainID(ctx) + if err != nil { + return nil, nil, err + } + signer := types.LatestSignerForChainID(chainID) + + nonce, err := client.PendingNonceAt(ctx, seederAddress) + if err != nil { + return nil, nil, err + } + + gasPrice, err := client.SuggestGasPrice(ctx) + if err != nil { + return nil, nil, err + } + + // fund accounts + wallets := make([]*Wallet, numKeys) + var lastFundTx *types.Transaction + for i := 0; i < numKeys; i++ { + wallets[i], err = NewWallet(ctx) + if err != nil { + return nil, nil, err + } + + tx := types.NewTx(&types.LegacyTx{ + Nonce: nonce, + To: &wallets[i].Address, + Value: Eth_100, + Gas: 21000, + GasPrice: gasPrice, + }) + + tx, err := types.SignTx(tx, signer, seederPrivateKey) + if err != nil { + return nil, nil, err + } + + if err := client.SendTransaction(ctx, tx); err != nil { + return nil, nil, err + } + + lastFundTx = tx + nonce++ + } + + // wait for all fund txs to be mined + for { + <-time.After(25 * time.Millisecond) + receipt, err := client.TransactionReceipt(ctx, lastFundTx.Hash()) + if receipt != nil && receipt.Status == TransactionResultSuccess { + break + } else if receipt != nil && receipt.Status == 0 { + return nil, nil, RiverError(Err_INTERNAL, "could not fund wallet") + } else if !errors.Is(err, ethereum.NotFound) { + return nil, nil, err + } + } + + return wallets, client, nil +} + +func initAnvil(ctx context.Context, url string, numKeys int) ([]*Wallet, *ethclient.Client, error) { + client, err := ethclient.DialContext(ctx, url) + if err != nil { + return nil, nil, err + } + + wallets := make([]*Wallet, numKeys) + for i := 0; i < numKeys; i++ { + wallets[i], err = NewWallet(ctx) + if err != nil { + return nil, nil, err + } + + err = client.Client().CallContext(ctx, nil, "anvil_setBalance", wallets[i].Address, Eth_100.String()) + if err != nil { + return nil, nil, err + } + } + + return wallets, client, nil +} + +func NewBlockchainTestContext(ctx context.Context, numKeys int, mineOnTx bool) (*BlockchainTestContext, error) { + // Add one for deployer + numKeys += 1 + + var wallets []*Wallet + var backend *simulated.Backend + var ethClient *ethclient.Client + var client BlockchainClient + var err error + + remoteNodeURL := os.Getenv("RIVER_REMOTE_NODE_URL") + remoteFundAccount := os.Getenv("RIVER_REMOTE_NODE_FUND_PRIVATE_KEY") + anvilUrl := os.Getenv("RIVER_TEST_ANVIL_URL") + + remoteNode := remoteNodeURL != "" && remoteFundAccount != "" + if remoteNode { + wallets, ethClient, err = initRemoteNode(ctx, remoteNodeURL, remoteFundAccount, numKeys) + if err != nil { + return nil, err + } + client = ethClient + } else if anvilUrl != "" { + wallets, ethClient, err = initAnvil(ctx, anvilUrl, numKeys) + if err != nil { + return nil, err + } + client = ethClient + } else { + wallets, backend, err = initSimulated(ctx, numKeys) + if err != nil { + return nil, err + } + client = backend.Client() + } + + chainId, err := client.ChainID(ctx) + if err != nil { + return nil, err + } + + btc := &BlockchainTestContext{ + Backend: backend, + EthClient: ethClient, + RemoteNode: remoteNode, + + Wallets: wallets, + ChainId: chainId, + } + + if mineOnTx { + client = &autoMiningClientWrapper{ + BlockchainClient: client, + onTx: func(ctx context.Context) error { + return btc.mineBlock(ctx) + }, + } + } + btc.BcClient = client + + auth, err := bind.NewKeyedTransactorWithChainID(wallets[len(wallets)-1].PrivateKeyStruct, chainId) + if err != nil { + return nil, err + } + + btc.RiverRegistryAddress, _, _, err = deploy.DeployMockRiverRegistry(auth, client, []common.Address{wallets[len(wallets)-1].Address}) + if err != nil { + return nil, err + } + + btc.NodeRegistry, err = contracts.NewNodeRegistryV1(btc.RiverRegistryAddress, client) + if err != nil { + return nil, err + } + + btc.StreamRegistry, err = contracts.NewStreamRegistryV1(btc.RiverRegistryAddress, client) + if err != nil { + return nil, err + } + + riverConfig, err := contracts.NewRiverConfigV1(btc.RiverRegistryAddress, client) + if err != nil { + return nil, err + } + + // Add deployer as operator so it can register nodes + btc.ChainMonitor = NewChainMonitor() + btc.DeployerBlockchain = makeTestBlockchain(ctx, wallets[len(wallets)-1], client, btc.ChainMonitor, chainId) + go btc.ChainMonitor.RunWithBlockPeriod(ctx, client, btc.DeployerBlockchain.InitialBlockNum, 10*time.Millisecond) + + // commit the river registry deployment transaction + if !mineOnTx { + if err := btc.mineBlock(ctx); err != nil { + return nil, err + } + } + + blockNum := btc.BlockNum(ctx).AsUint64() + btc.OnChainConfig, err = NewOnChainConfig( + ctx, btc.Client(), btc.RiverRegistryAddress, BlockNumber(blockNum), btc.DeployerBlockchain.ChainMonitor) + if err != nil { + return nil, err + } + + if err = setOnChainConfig(ctx, btc, riverConfig); err != nil { + return nil, err + } + + return btc, nil +} + +func setOnChainConfig(ctx context.Context, btc *BlockchainTestContext, riverConfig *contracts.RiverConfigV1) error { + one, _ := hex.DecodeString("0000000000000000000000000000000000000000000000000000000000000001") + pendingTx, err := btc.DeployerBlockchain.TxPool.Submit( + ctx, + "SetConfiguration", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + return riverConfig.SetConfiguration(opts, StreamReplicationFactorKey.ID(), 0, one) + }, + ) + if err != nil { + return err + } + + err = btc.mineBlock(ctx) + if err != nil { + return err + } + + // wait till set config tx is processed + receipt := <-pendingTx.Wait() + if receipt.Status != TransactionResultSuccess { + return AsRiverError(err, Err_CANNOT_CALL_CONTRACT). + Message("Unable to set on-chain configuration") + } + + // chain monitor updates in the background the tx pool and calls the on chain changed callback to update the + // in-memory configuration cache. It is possible that the txpool already processed the tx before this callback + // was called/finished. Wait a bit more until the configuration change was processed. + for i := 0; true; i++ { + _, err = btc.OnChainConfig.GetUint64(StreamReplicationFactorKey) + if err == nil { + break + } + if i == 100 { + return AsRiverError(err, Err_CANNOT_CALL_CONTRACT). + Message("On-chain configuration was not set"). + Tag("tx", receipt.TxHash) + } + <-time.After(100 * time.Millisecond) + } + + return err +} + +// SetNextBlockBaseFee sets the base fee of the next blocks. Only supported for Anvil chains! +func (c *BlockchainTestContext) SetNextBlockBaseFee(nextBlockBaseFee *big.Int) error { + if !c.IsAnvil() { + panic("SetGasPrice is only supported for Anvil chains") + } + return c.EthClient.Client().Call(nil, "anvil_setNextBlockBaseFeePerGas", nextBlockBaseFee) +} + +func (c *BlockchainTestContext) mineBlock(ctx context.Context) error { + if c.RemoteNode { + ctx, cancel := context.WithTimeout(ctx, 30*time.Second) + defer cancel() + + head, err := c.EthClient.HeaderByNumber(ctx, nil) + if err != nil { + return err + } + + for { + <-time.After(500 * time.Millisecond) + newHead, err := c.EthClient.HeaderByNumber(ctx, nil) + if err != nil { + return err + } + if newHead.Number.Cmp(head.Number) > 0 { + return nil + } + } + } + c.backendMutex.Lock() + defer c.backendMutex.Unlock() + + if c.Backend != nil { + c.Backend.Commit() + return nil + } else if c.EthClient != nil { + return c.EthClient.Client().Call(nil, "evm_mine") + } else { + panic("no backend or client") + } +} + +func (c *BlockchainTestContext) Close() { + c.backendMutex.Lock() + defer c.backendMutex.Unlock() + + if c.DeployerBlockchain != nil { + c.DeployerBlockchain.Close() + } + if c.Backend != nil { + _ = c.Backend.Close() + } + if c.EthClient != nil { + c.EthClient.Close() + } +} + +func (c *BlockchainTestContext) Commit(ctx context.Context) { + err := c.mineBlock(ctx) + if err != nil { + panic(err) + } +} + +func (c *BlockchainTestContext) Client() BlockchainClient { + return c.BcClient +} + +func (c *BlockchainTestContext) IsAnvil() bool { + return c.EthClient != nil +} + +func (c *BlockchainTestContext) AnvilAutoMineEnabled() bool { + if !c.IsAnvil() || c.IsRemote() { + return false + } + + var autoMine bool + if err := c.EthClient.Client().Call(&autoMine, "anvil_getAutomine"); err != nil { + panic(err) + } + return autoMine +} + +func (c *BlockchainTestContext) IsSimulated() bool { + return c.Backend != nil && !c.RemoteNode +} + +func (c *BlockchainTestContext) IsRemote() bool { + return c.RemoteNode +} + +func (c *BlockchainTestContext) GetDeployerWallet() *Wallet { + return c.Wallets[len(c.Wallets)-1] +} + +func makeTestBlockchain( + ctx context.Context, + wallet *Wallet, + client BlockchainClient, + chainMonitor ChainMonitor, + chainId *big.Int, +) *Blockchain { + bc, err := NewBlockchainWithClient( + ctx, + &config.ChainConfig{ + ChainId: chainId.Uint64(), + BlockTimeMs: 100, + TransactionPool: config.TransactionPoolConfig{}, // use defaults + }, + wallet, + client, + nil, + chainMonitor, + ) + if err != nil { + panic(err) + } + return bc +} + +func (c *BlockchainTestContext) GetBlockchain(ctx context.Context, index int) *Blockchain { + if index >= len(c.Wallets) { + return nil + } + return makeTestBlockchain(ctx, c.Wallets[index], c.Client(), c.ChainMonitor, c.ChainId) +} + +func (c *BlockchainTestContext) NewWalletAndBlockchain(ctx context.Context) *Blockchain { + wallet, err := NewWallet(ctx) + if err != nil { + panic(err) + } + return makeTestBlockchain(ctx, wallet, c.Client(), c.ChainMonitor, c.ChainId) +} + +func (c *BlockchainTestContext) InitNodeRecord(ctx context.Context, index int, url string) error { + return c.InitNodeRecordEx(ctx, index, url, contracts.NodeStatus_Operational) +} + +func (c *BlockchainTestContext) InitNodeRecordEx(ctx context.Context, index int, url string, status uint8) error { + pendingTx, err := c.DeployerBlockchain.TxPool.Submit( + ctx, + "RegisterNode", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + return c.NodeRegistry.RegisterNode(opts, c.Wallets[index].Address, url, status) + }, + ) + if err != nil { + return err + } + + err = c.mineBlock(ctx) + if err != nil { + return err + } + + receipt := <-pendingTx.Wait() + if receipt.Status != TransactionResultSuccess { + return fmt.Errorf("InitNodeRecordEx transaction failed") + } + + return nil +} + +func (c *BlockchainTestContext) UpdateNodeStatus(ctx context.Context, index int, status uint8) error { + pendingTx, err := c.DeployerBlockchain.TxPool.Submit( + ctx, + "UpdateNodeStatus", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + return c.NodeRegistry.UpdateNodeStatus(opts, c.Wallets[index].Address, status) + }, + ) + if err != nil { + return err + } + + err = c.mineBlock(ctx) + if err != nil { + return err + } + + receipt := <-pendingTx.Wait() + if receipt.Status != TransactionResultSuccess { + return fmt.Errorf("UpdateNodeStatus transaction failed") + } + + return nil +} + +func (c *BlockchainTestContext) UpdateNodeUrl(ctx context.Context, index int, url string) error { + pendingTx, err := c.DeployerBlockchain.TxPool.Submit( + ctx, + "UpdateNodeUrl", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + return c.NodeRegistry.UpdateNodeUrl(opts, c.Wallets[index].Address, url) + }, + ) + if err != nil { + return err + } + + err = c.mineBlock(ctx) + if err != nil { + return err + } + + receipt := <-pendingTx.Wait() + if receipt.Status != TransactionResultSuccess { + return fmt.Errorf("UpdateNodeStatus transaction failed") + } + + return nil +} + +func (c *BlockchainTestContext) RegistryConfig() config.ContractConfig { + return config.ContractConfig{ + Address: c.RiverRegistryAddress, + } +} + +func (c *BlockchainTestContext) BlockNum(ctx context.Context) BlockNumber { + blockNum, err := c.Client().BlockNumber(ctx) + if err != nil { + panic(err) + } + return BlockNumber(blockNum) +} + +// GetTestAddress returns a random common.Address that can be used in tests. +func GetTestAddress() common.Address { + var address common.Address + _, err := rand.Read(address[:]) + if err != nil { + panic(err) + } + return address +} diff --git a/core/node/crypto/utils.go b/core/node/crypto/utils.go new file mode 100644 index 000000000..df7cd4182 --- /dev/null +++ b/core/node/crypto/utils.go @@ -0,0 +1,43 @@ +package crypto + +import ( + "context" + "encoding/hex" + "math/big" + "time" + + "github.com/ethereum/go-ethereum/params" + + eth_crypto "github.com/ethereum/go-ethereum/crypto" +) + +const ( + // TransactionResultSuccess indicates that transaction was successful + TransactionResultSuccess = uint64(1) +) + +// GetDeviceId returns the device id for a given wallet, useful for testing +func GetDeviceId(wallet *Wallet) (string, error) { + publicKey := eth_crypto.FromECDSAPub(&wallet.PrivateKeyStruct.PublicKey) + hash := RiverHash(publicKey) + return hex.EncodeToString(hash[:]), nil +} + +func loadChainID(ctx context.Context, client BlockchainClient) *big.Int { + for { + if chainID, _ := client.ChainID(ctx); chainID != nil { + return chainID + } + select { + case <-ctx.Done(): + return nil + case <-time.After(2 * time.Second): + continue + } + } +} + +func WeiToEth(wei *big.Int) float64 { + b, _ := new(big.Float).Quo(new(big.Float).SetInt(wei), big.NewFloat(params.Ether)).Float64() + return b +} diff --git a/core/node/default_config.yaml b/core/node/default_config.yaml new file mode 100644 index 000000000..8ad40d95a --- /dev/null +++ b/core/node/default_config.yaml @@ -0,0 +1,112 @@ +# Network configuration +port: 443 +database: + url: '' + database: '' + user: '' + password: '' + port: '' + extra: '' + host: '' + startupDelay: 2s +storageType: postgres + +# Certificates for TLS +TLSConfig: + cert: '' + key: '' +UseHttps: true + +# Blockchain configuration +baseChain: + chainId: 31337 + networkUrl: 'http://127.0.0.1:8545' + blockTimeMs: 2000 +riverChain: + chainId: 31338 + networkUrl: 'http://127.0.0.1:8546' + blockTimeMs: 2000 + transactionPool: + # transactionTimeout specifies the duration after which a pending transaction is replaced. Recommended is a + # multiply of the chain block period. If not specified the node uses blockTimeMs, if that is not set it tries + # to estimate the block period based on the 2 last blocks and sets Timout to 3 * chain.BlockPeriod. + transactionTimeout: 6s + # gasFeeCap is a hard limit for the max price per gas in EIP1559 transactions (in Wei) + gasFeeCap: 150_000_000_000 # 150 Gwei + # The miner tip increase (%) for EIP-1559 replacement transactions. + # Nodes typically accept replacement transactions with at least a 10% miner tip increase. + minerTipFeeReplacementPercentage: 10 + # The gas price increase (%) for legacy replacement transactions. + # Nodes typically accept legacy replacement transactions with at least a 10% gas fee increase. + gasFeeIncreasePercentage: 10 + +# Base contracts +architectContract: + address: '' + version: '' + +# River contracts +registryContract: + address: '' + version: '' # Explicitely uses IRiverRegistryV1 interface + +# Logging +log: + file: logs/dev.log + level: info + console: true + noColor: true + format: text + +# Metrics +metrics: + enabled: false + port: null +performanceTracking: + profilingEnabled: false + tracingEnabled: false + +# Stream settings +stream: + media: + maxChunkCount: 10 # max number of chunks in a media stream + maxChunkSize: 500000 # max number of bytes in a single chunk + streamMembershipLimits: + 77: 48 # GDMs + 88: 2 # DMs + recencyConstraints: + # Each event must be unique and reference the hash of a previous miniblock + # If the hash is not of the most recent block, the referenced miniblock must be less than M seconds old. + ageSeconds: 11 + # The node will load M generation miniblocks before the most recent snapshot + generations: 5 + replicationFactor: 1 + defaultMinEventsPerSnapshot: 100 + minEventsPerSnapshot: + # stream prefixes should be lower case because go is lower casing them anyway + a8: 10 # USER + ad: 10 # USER_DEVICE_KEY + a1: 10 # USER_INBOX + a5: 10 # USER_SETTINGS + # Timeout after streams with no activity in the cache are expired and evicted + # valid time unites are "ns", "us" (or "µs"), "ms", "s", "m", "h" + # Set to 0 to disable cache expiration + cacheExpiration: 5m + # Interval to check for inactive streams in the cache (default=cacheExpiration/10) + # valid time unites are "ns", "us" (or "µs"), "ms", "s", "m", "h" + cacheExpirationPollInterval: 30s + +networkConfig: + numRetries: 3 + requestTimeout: 0 + httpRequestTimeout: 0 + +standByOnStart: true +standByPollPeriod: 500ms + +shutdownTimeout: 1s + +graffiti: '' + +# Debug feature flags. +disableBaseChain: false diff --git a/core/node/dlog/README.md b/core/node/dlog/README.md new file mode 100644 index 000000000..e2ca35753 --- /dev/null +++ b/core/node/dlog/README.md @@ -0,0 +1 @@ +See [conventions.md](../conventions.md) for usage examples. diff --git a/core/node/dlog/buffer/buffer.go b/core/node/dlog/buffer/buffer.go new file mode 100644 index 000000000..95fad8f7f --- /dev/null +++ b/core/node/dlog/buffer/buffer.go @@ -0,0 +1,105 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package buffer provides a pool-allocated byte buffer. +package dlog + +import ( + "sync" +) + +// Buffer adapted from go/src/fmt/print.go +type Buffer []byte + +// Having an initial size gives a dramatic speedup. +var bufPool = sync.Pool{ + New: func() any { + b := make([]byte, 0, 1024) + return (*Buffer)(&b) + }, +} + +func New() *Buffer { + return bufPool.Get().(*Buffer) +} + +func (b *Buffer) Free() { + // To reduce peak allocation, return only smaller buffers to the pool. + const maxBufferSize = 16 << 10 + if cap(*b) <= maxBufferSize { + *b = (*b)[:0] + bufPool.Put(b) + } +} + +func (b *Buffer) Reset() { + *b = (*b)[:0] +} + +func (b *Buffer) Write(p []byte) (int, error) { + *b = append(*b, p...) + return len(p), nil +} + +func (b *Buffer) WriteString(s string) { + *b = append(*b, s...) +} + +func (b *Buffer) WriteByte(c byte) { + *b = append(*b, c) +} + +func (b *Buffer) WritePosInt(i int) { + b.WritePosIntWidth(i, 0) +} + +// WritePosIntWidth writes non-negative integer i to the buffer, padded on the left +// by zeroes to the given width. Use a width of 0 to omit padding. +func (b *Buffer) WritePosIntWidth(i, width int) { + // Cheap integer to fixed-width decimal ASCII. + // Copied from log/log.go. + + if i < 0 { + panic("negative int") + } + + // Assemble decimal in reverse order. + var bb [20]byte + bp := len(bb) - 1 + for i >= 10 || width > 1 { + width-- + q := i / 10 + bb[bp] = byte('0' + i - q*10) + bp-- + i = q + } + // i < 10 + bb[bp] = byte('0' + i) + _, _ = b.Write(bb[bp:]) +} + +func (b *Buffer) String() string { + return string(*b) +} + +// const ( +// hextable = "0123456789abcdef" +// ) + +// func (b *Buffer) WriteHexBytes(src []byte) { +// for _, v := range src { +// *b = append(*b, hextable[v>>4], hextable[v&0x0f]) +// } +// } + +// func (b *Buffer) WriteShortHexBytes(src []byte) { +// if len(src) <= 5 { +// b.WriteHexBytes(src) +// } else { +// b.WriteHexBytes(src[:2]) +// b.WriteByte('.') +// b.WriteByte('.') +// b.WriteHexBytes(src[len(src)-2:]) +// } +// } diff --git a/core/node/dlog/color.go b/core/node/dlog/color.go new file mode 100644 index 000000000..4f03ec5f2 --- /dev/null +++ b/core/node/dlog/color.go @@ -0,0 +1,96 @@ +package dlog + +import ( + "io" +) + +type ColorCode []byte + +var ( + Escape = []byte("\x1b") + StartAttributes = []byte("[") + EndAttributes = []byte("m") + AttributeSeparator = []byte(";") + SequencePrefix = []byte("\x1b[") + SequenceSuffix = EndAttributes + ResetSequence = []byte("\x1b[0m") +) + +// Base attributes +var ( + DisableColor ColorCode = []byte{} + Reset ColorCode = []byte("0") + Bold ColorCode = []byte("1") + Faint ColorCode = []byte("2") + Italic ColorCode = []byte("3") + Underline ColorCode = []byte("4") + BlinkSlow ColorCode = []byte("5") + BlinkRapid ColorCode = []byte("6") + ReverseVideo ColorCode = []byte("7") + Concealed ColorCode = []byte("8") + CrossedOut ColorCode = []byte("9") +) + +// Foreground text colors +var ( + FgBlack ColorCode = []byte("30") + FgRed ColorCode = []byte("31") + FgGreen ColorCode = []byte("32") + FgYellow ColorCode = []byte("33") + FgBlue ColorCode = []byte("34") + FgMagenta ColorCode = []byte("35") + FgCyan ColorCode = []byte("36") + FgWhite ColorCode = []byte("37") +) + +// Foreground Hi-Intensity text colors +var ( + FgHiBlack ColorCode = []byte("90") + FgHiRed ColorCode = []byte("91") + FgHiGreen ColorCode = []byte("92") + FgHiYellow ColorCode = []byte("93") + FgHiBlue ColorCode = []byte("94") + FgHiMagenta ColorCode = []byte("95") + FgHiCyan ColorCode = []byte("96") + FgHiWhite ColorCode = []byte("97") +) + +// Background text colors +var ( + BgBlack ColorCode = []byte("40") + BgRed ColorCode = []byte("41") + BgGreen ColorCode = []byte("42") + BgYellow ColorCode = []byte("43") + BgBlue ColorCode = []byte("44") + BgMagenta ColorCode = []byte("45") + BgCyan ColorCode = []byte("46") + BgWhite ColorCode = []byte("47") +) + +// Background Hi-Intensity text colors +var ( + BgHiBlack ColorCode = []byte("100") + BgHiRed ColorCode = []byte("101") + BgHiGreen ColorCode = []byte("102") + BgHiYellow ColorCode = []byte("103") + BgHiBlue ColorCode = []byte("104") + BgHiMagenta ColorCode = []byte("105") + BgHiCyan ColorCode = []byte("106") + BgHiWhite ColorCode = []byte("107") +) + +func OpenColor(w io.Writer, color ColorCode) { + if len(color) == 0 { + return + } + _, _ = w.Write(SequencePrefix) + _, _ = w.Write(color) + _, _ = w.Write(EndAttributes) +} + +func CloseColor(w io.Writer, color ColorCode) { + if len(color) == 0 { + return + } + _, _ = w.Write(ResetSequence) +} diff --git a/core/node/dlog/color_map.go b/core/node/dlog/color_map.go new file mode 100644 index 000000000..172d74153 --- /dev/null +++ b/core/node/dlog/color_map.go @@ -0,0 +1,58 @@ +package dlog + +const ( + // Data types. + ColorMap_BoolTrue int = iota + ColorMap_BoolFalse + ColorMap_Int + ColorMap_Float + ColorMap_String + ColorMap_Hex + ColorMap_Key + ColorMap_FieldName + ColorMap_Brace + ColorMap_Colon + ColorMap_Nil + ColorMap_ErrorText + + // Log constructs. + ColorMap_Level_Debug + ColorMap_Level_Info + ColorMap_Level_Warn + ColorMap_Level_Error + ColorMap_Time + ColorMap_Message + ColorMap_LogFieldKey + + ColorMap_Length // Must be last. +) + +type ColorMap []ColorCode + +var ColorMap_Enabled ColorMap = func() ColorMap { + c := make(ColorMap, ColorMap_Length) + c[ColorMap_BoolTrue] = FgGreen + c[ColorMap_BoolFalse] = FgRed + c[ColorMap_Int] = FgHiGreen + c[ColorMap_Float] = FgHiRed + c[ColorMap_String] = FgHiBlue + c[ColorMap_Hex] = FgHiMagenta + c[ColorMap_Key] = FgHiYellow + c[ColorMap_FieldName] = FgHiWhite + c[ColorMap_Brace] = FgHiCyan + c[ColorMap_Colon] = FgHiCyan + c[ColorMap_Nil] = FgMagenta + c[ColorMap_ErrorText] = FgHiRed + c[ColorMap_Level_Debug] = FgHiGreen + c[ColorMap_Level_Info] = FgHiBlue + c[ColorMap_Level_Warn] = FgHiYellow + c[ColorMap_Level_Error] = FgHiRed + c[ColorMap_Time] = FgHiCyan + c[ColorMap_Message] = FgHiWhite + c[ColorMap_LogFieldKey] = FgHiBlack + return c +}() + +var ColorMap_Disabled ColorMap = make([]ColorCode, ColorMap_Length) + +var ColorMap_Default ColorMap = ColorMap_Enabled diff --git a/core/node/dlog/common_handler.go b/core/node/dlog/common_handler.go new file mode 100644 index 000000000..3b6f80af0 --- /dev/null +++ b/core/node/dlog/common_handler.go @@ -0,0 +1,400 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package dlog + +import ( + "fmt" + "io" + "log/slog" + "strconv" + "sync" + "time" + + "golang.org/x/exp/slices" + + buffer "github.com/river-build/river/core/node/dlog/buffer" +) + +type PrettyHandlerOptions struct { + AddSource bool + Level slog.Leveler + ReplaceAttr func(groups []string, a slog.Attr) slog.Attr + PrintLongTime bool + DisableMultiline bool + DisableShortHex bool + Colors ColorMap +} + +type commonHandler struct { + json bool // true => output JSON; false => output text + opts PrettyHandlerOptions + preformattedAttrs []byte + groupPrefix string // for text: prefix of groups opened in preformatting + groups []string // all groups started from WithGroup + nOpenGroups int // the number of groups opened in preformattedAttrs + mu sync.Mutex + w io.Writer +} + +func (h *commonHandler) clone() *commonHandler { + // We can't use assignment because we can't copy the mutex. + return &commonHandler{ + json: h.json, + opts: h.opts, + preformattedAttrs: slices.Clip(h.preformattedAttrs), + groupPrefix: h.groupPrefix, + groups: slices.Clip(h.groups), + nOpenGroups: h.nOpenGroups, + w: h.w, + } +} + +// enabled reports whether l is greater than or equal to the +// minimum level. +func (h *commonHandler) enabled(l slog.Level) bool { + minLevel := slog.LevelInfo + if h.opts.Level != nil { + minLevel = h.opts.Level.Level() + } + return l >= minLevel +} + +func (h *commonHandler) withAttrs(as []slog.Attr) *commonHandler { + h2 := h.clone() + // Pre-format the attributes as an optimization. + prefix := buffer.New() + defer prefix.Free() + prefix.WriteString(h.groupPrefix) + state := h2.newHandleState((*buffer.Buffer)(&h2.preformattedAttrs), false, "", prefix) + defer state.free() + if len(h2.preformattedAttrs) > 0 { + state.sep = h.attrSep() + } + state.openGroups() + for _, a := range as { + state.appendAttr(a) + } + // Remember the new prefix for later keys. + h2.groupPrefix = state.prefix.String() + // Remember how many opened groups are in preformattedAttrs, + // so we don't open them again when we handle a Record. + h2.nOpenGroups = len(h2.groups) + return h2 +} + +func (h *commonHandler) withGroup(name string) *commonHandler { + if name == "" { + return h + } + h2 := h.clone() + h2.groups = append(h2.groups, name) + return h2 +} + +func (h *commonHandler) handle(r slog.Record) error { + state := h.newHandleState(buffer.New(), true, "", nil) + defer state.free() + if h.json { + state.buf.WriteByte('{') + appendJSONBuiltIns(&state, r) + } else { + appendTextBuiltIns(&state, r) + } + + state.appendNonBuiltIns(r) + + state.buf.WriteByte('\n') + + h.mu.Lock() + defer h.mu.Unlock() + _, err := h.w.Write(*state.buf) + return err +} + +func (s *handleState) appendNonBuiltIns(r slog.Record) { + s.sep = s.h.attrSep() + + // preformatted Attrs + if len(s.h.preformattedAttrs) > 0 { + s.buf.WriteString(s.sep) + _, _ = s.buf.Write(s.h.preformattedAttrs) + } + + s.prefix = buffer.New() + defer s.prefix.Free() + s.prefix.WriteString(s.h.groupPrefix) + s.openGroups() + r.Attrs(func(a slog.Attr) bool { + s.appendAttr(a) + return true + }) + if s.h.json { + // Close all open groups. + for range s.h.groups { + s.buf.WriteByte('}') + } + // Close the top-level object. + s.buf.WriteByte('}') + } +} + +// attrSep returns the separator between attributes. +func (h *commonHandler) attrSep() string { + if h.json { + return "," + } else if h.opts.DisableMultiline { + return " " + } else { + return "\n " + } +} + +// handleState holds state for a single call to commonHandler.handle. +// The initial value of sep determines whether to emit a separator +// before the next key, after which it stays true. +type handleState struct { + h *commonHandler + buf *buffer.Buffer + freeBuf bool // should buf be freed? + sep string // separator to write before next key + prefix *buffer.Buffer // for text: key prefix + groups *[]string // pool-allocated slice of active groups, for ReplaceAttr +} + +var groupPool = sync.Pool{New: func() any { + s := make([]string, 0, 10) + return &s +}} + +func (h *commonHandler) newHandleState( + buf *buffer.Buffer, + freeBuf bool, + sep string, + prefix *buffer.Buffer, +) handleState { + s := handleState{ + h: h, + buf: buf, + freeBuf: freeBuf, + sep: sep, + prefix: prefix, + } + if h.opts.ReplaceAttr != nil { + s.groups = groupPool.Get().(*[]string) + *s.groups = append(*s.groups, h.groups[:h.nOpenGroups]...) + } + return s +} + +func (s *handleState) free() { + if s.freeBuf { + s.buf.Free() + } + if gs := s.groups; gs != nil { + *gs = (*gs)[:0] + groupPool.Put(gs) + } +} + +func (s *handleState) openGroups() { + for _, n := range s.h.groups[s.h.nOpenGroups:] { + s.openGroup(n) + } +} + +// Separator for group names and keys. +const keyComponentSep = '.' + +// openGroup starts a new group of attributes +// with the given name. +func (s *handleState) openGroup(name string) { + if s.h.json { + s.appendKey(name) + s.buf.WriteByte('{') + s.sep = "" + } else { + s.prefix.WriteString(name) + s.prefix.WriteByte(keyComponentSep) + } + // Collect group names for ReplaceAttr. + if s.groups != nil { + *s.groups = append(*s.groups, name) + } +} + +// closeGroup ends the group with the given name. +func (s *handleState) closeGroup(name string) { + if s.h.json { + s.buf.WriteByte('}') + } else { + (*s.prefix) = (*s.prefix)[:len(*s.prefix)-len(name)-1 /* for keyComponentSep */] + } + s.sep = s.h.attrSep() + if s.groups != nil { + *s.groups = (*s.groups)[:len(*s.groups)-1] + } +} + +// TODO: implement +func IsAttrEmpty(a slog.Attr) bool { + return a.Key == "" // && a.Value.num == 0 && a.Value.any == nil +} + +// appendAttr appends the Attr's key and value using app. +// It handles replacement and checking for an empty key. +// after replacement). +func (s *handleState) appendAttr(a slog.Attr) { + if rep := s.h.opts.ReplaceAttr; rep != nil && a.Value.Kind() != slog.KindGroup { + var gs []string + if s.groups != nil { + gs = *s.groups + } + // Resolve before calling ReplaceAttr, so the user doesn't have to. + a.Value = a.Value.Resolve() + a = rep(gs, a) + } + a.Value = a.Value.Resolve() + // Elide empty Attrs. + if IsAttrEmpty(a) { + return + } + // Special case: Source. + if v := a.Value; v.Kind() == slog.KindAny { + if src, ok := v.Any().(*slog.Source); ok { + if s.h.json { + // TODO: + // a.Value = src.group() + } else { + a.Value = slog.StringValue(fmt.Sprintf("%s:%d", src.File, src.Line)) + } + } + } + + if a.Value.Kind() == slog.KindGroup { + attrs := a.Value.Group() + // Output only non-empty groups. + if len(attrs) > 0 { + // Inline a group with an empty key. + if a.Key != "" { + s.openGroup(a.Key) + } + for _, aa := range attrs { + s.appendAttr(aa) + } + if a.Key != "" { + s.closeGroup(a.Key) + } + } + } else { + s.appendKey(a.Key) + s.appendValue(a.Value) + } +} + +func (s *handleState) appendError(err error) { + s.appendString(fmt.Sprintf("!ERROR:%v", err)) +} + +func (s *handleState) appendKey(key string) { + s.buf.WriteString(s.sep) + if s.prefix != nil { + // TODO: optimize by avoiding allocation. + key = string(*s.prefix) + key + } + if s.h.json { + s.appendString(key) + s.buf.WriteByte(':') + } else { + OpenColor(s.buf, s.h.opts.Colors[ColorMap_LogFieldKey]) + s.buf.WriteString(key) + CloseColor(s.buf, s.h.opts.Colors[ColorMap_LogFieldKey]) + s.buf.WriteString(" = ") + } + s.sep = s.h.attrSep() +} + +func (s *handleState) appendString(str string) { + if s.h.json { + s.buf.WriteByte('"') + *s.buf = appendEscapedJSONString(*s.buf, str) + s.buf.WriteByte('"') + } else { + // text + if needsQuoting(str) { + *s.buf = strconv.AppendQuote(*s.buf, str) + } else { + s.buf.WriteString(str) + } + } +} + +func (s *handleState) appendValue(v slog.Value) { + var err error + if s.h.json { + err = appendJSONValue(s, v) + } else { + err = appendTextValue(s, v) + } + if err != nil { + s.appendError(err) + } +} + +func (s *handleState) appendTime(t time.Time) { + if s.h.json { + appendJSONTime(s, t) + } else if s.h.opts.PrintLongTime { + writeTimeRFC3339Millis(s.buf, t) + } else { + writeShortTime(s.buf, t) + } +} + +// This takes half the time of Time.AppendFormat. +func writeTimeRFC3339Millis(buf *buffer.Buffer, t time.Time) { + year, month, day := t.Date() + buf.WritePosIntWidth(year, 4) + buf.WriteByte('-') + buf.WritePosIntWidth(int(month), 2) + buf.WriteByte('-') + buf.WritePosIntWidth(day, 2) + buf.WriteByte('T') + hour, min, sec := t.Clock() + buf.WritePosIntWidth(hour, 2) + buf.WriteByte(':') + buf.WritePosIntWidth(min, 2) + buf.WriteByte(':') + buf.WritePosIntWidth(sec, 2) + ns := t.Nanosecond() + buf.WriteByte('.') + buf.WritePosIntWidth(ns/1e6, 3) + _, offsetSeconds := t.Zone() + if offsetSeconds == 0 { + buf.WriteByte('Z') + } else { + offsetMinutes := offsetSeconds / 60 + if offsetMinutes < 0 { + buf.WriteByte('-') + offsetMinutes = -offsetMinutes + } else { + buf.WriteByte('+') + } + buf.WritePosIntWidth(offsetMinutes/60, 2) + buf.WriteByte(':') + buf.WritePosIntWidth(offsetMinutes%60, 2) + } +} + +func writeShortTime(buf *buffer.Buffer, t time.Time) { + hour, min, sec := t.Clock() + buf.WritePosIntWidth(hour, 2) + buf.WriteByte(':') + buf.WritePosIntWidth(min, 2) + buf.WriteByte(':') + buf.WritePosIntWidth(sec, 2) + ns := t.Nanosecond() + buf.WriteByte('.') + buf.WritePosIntWidth(ns/1e6, 3) +} diff --git a/core/node/dlog/dlog_test.go b/core/node/dlog/dlog_test.go new file mode 100644 index 000000000..571e4e884 --- /dev/null +++ b/core/node/dlog/dlog_test.go @@ -0,0 +1,186 @@ +package dlog_test + +import ( + "bytes" + "encoding/hex" + "fmt" + "log/slog" + "os" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/river-build/river/core/node/dlog" + "github.com/stretchr/testify/assert" +) + +type Data2 struct { + Num int + Nums []int + Str string + Bytes []byte + MoreData *Data2 + Map map[string]string + ByteMap map[string][]byte + DataMap map[string]*Data2 + Bool bool + AndFalse bool + Enternity time.Duration + EmptyStr string +} + +func makeTestData2() *Data2 { + return &Data2{ + Num: 1, + Nums: []int{1, 2, 3, 4, 5}, + Str: "hello", + Bytes: []byte("world hello"), + MoreData: &Data2{ + Num: 2, + Bytes: []byte("hello hello hello"), + Map: map[string]string{"hello": "world"}, + }, + Map: map[string]string{ + "aabbccdd": "00112233445566778899", + "0x00112233445566778899": "hello", + "hello2": "world2", + "world2": "hello2", + "hello3": "world3", + "world3": "hello3", + "hello4": "world4", + "world4": "hello4", + "xx_empty": "", + }, + ByteMap: map[string][]byte{"hello": []byte("world")}, + DataMap: map[string]*Data2{"hello": {Num: 3}}, + Bool: true, + AndFalse: false, + Enternity: time.Hour, + } +} + +func TestDlog(t *testing.T) { + log := slog.New(dlog.NewPrettyTextHandler(os.Stderr, &dlog.PrettyHandlerOptions{ + AddSource: false, + ReplaceAttr: nil, + })) + + data := makeTestData2() + + log.Error("Error example", "int", 33, "data", data, "str", "hello", "bytes", []byte("world")) + fmt.Println() + + log.WithGroup("group").With("with1", 1, "with2", 2).Info("TestSlog", "data", data, "int", 22) + fmt.Println() + + log.Info("simple type examples", + "hex_bytes", []byte{0x01, 0x02, 0x03, 0x04, 0x05}, + "long bytes", []byte("hello world"), + "string", "hello world", + "int", 33, + "bool_true", true, + "bool_false", false, + "nil", nil, + "float", 3.14, + "duration", time.Minute, + ) + fmt.Println() +} + +type byteArray [10]byte + +func TestByteType(t *testing.T) { + assert := assert.New(t) + + buf := &bytes.Buffer{} + log := slog.New( + dlog.NewPrettyTextHandler( + buf, + &dlog.PrettyHandlerOptions{Colors: dlog.ColorMap_Disabled, DisableShortHex: true}, + ), + ) + + b := byteArray{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} + log.Info("byte array", "byte_array", b) + assert.Contains(buf.String(), "0102030405060708090a") +} + +func TestCommonAddress(t *testing.T) { + assert := assert.New(t) + + buf := &bytes.Buffer{} + log := slog.New( + dlog.NewPrettyTextHandler( + buf, + &dlog.PrettyHandlerOptions{Colors: dlog.ColorMap_Disabled, DisableShortHex: true}, + ), + ) + + b := common.Address{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} + log.Info("byte array", "byte_array", b) + assert.Contains(buf.String(), "0102030405060708090a00000000000000000000") +} + +func TestMapWithCommonAddress(t *testing.T) { + assert := assert.New(t) + + buf := &bytes.Buffer{} + log := slog.New( + dlog.NewPrettyTextHandler( + buf, + &dlog.PrettyHandlerOptions{Colors: dlog.ColorMap_Disabled, DisableShortHex: true}, + ), + ) + + mm := map[common.Address]string{ + {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}: "hello", + {11, 12, 13, 14, 15, 16, 17, 18, 19, 20}: "world", + } + log.Info("byte array", "map", mm) + assert.Contains(buf.String(), "0102030405060708090a00000000000000000000") + assert.Contains(buf.String(), "0b0c0d0e0f101112131400000000000000000000") + assert.Contains(buf.String(), "hello") + assert.Contains(buf.String(), "world") +} + +func bytesFromHex(s string) []byte { + b, err := hex.DecodeString(s) + if err != nil { + panic(err) + } + return b +} + +func TestShortHex(t *testing.T) { + assert := assert.New(t) + + buf := &bytes.Buffer{} + log := slog.New( + dlog.NewPrettyTextHandler( + buf, + &dlog.PrettyHandlerOptions{Colors: dlog.ColorMap_Disabled, DisableShortHex: false}, + ), + ) + + type testParams struct { + arg any + expected string + } + + tests := []testParams{ + {"00112233445566778899", "00112233445566778899"}, + {"0x00112233445566778899", "0x00112233445566778899"}, + {"0011223344556677889900112233445566778899", "0011223344556677889900112233445566778899"}, + {"0x0011223344556677889900112233445566778899", "0x0011223344556677889900112233445566778899"}, + {"0011223344556677889900112233445566778899aa", "001122334455667788..2233445566778899aa"}, + {"0x0011223344556677889900112233445566778899aa", "0x001122334455667788..2233445566778899aa"}, + {bytesFromHex("00112233445566778899"), "00112233445566778899"}, + {bytesFromHex("0011223344556677889900112233445566778899"), "0011223344556677889900112233445566778899"}, + {bytesFromHex("0011223344556677889900112233445566778899aa"), "001122334455667788..2233445566778899aa"}, + } + for _, test := range tests { + buf.Reset() + log.Info("test", "hex", test.arg) + assert.Contains(buf.String(), test.expected, "arg: %v", test.arg) + } +} diff --git a/core/node/dlog/formatter.go b/core/node/dlog/formatter.go new file mode 100644 index 000000000..c2b38af39 --- /dev/null +++ b/core/node/dlog/formatter.go @@ -0,0 +1,712 @@ +package dlog + +import ( + "encoding/hex" + "fmt" + "io" + "reflect" + "strconv" + "strings" + "text/tabwriter" + "time" + + "github.com/kr/text" + "github.com/rogpeppe/go-internal/fmtsort" +) + +const ( + reverseHexTable = "" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\xff\xff\xff\xff\xff\xff" + + "\xff\x0a\x0b\x0c\x0d\x0e\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\x0a\x0b\x0c\x0d\x0e\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +) + +// IsHexString reports whether s consists of hexadecimal digits and whether it has 0x prefix. +func IsHexString(s string) (bool, bool) { + if len(s) < 2 || (len(s)&1) != 0 { + return false, false + } + + start := 0 + prefix := false + if s[0] == '0' && (s[1] == 'x' || s[1] == 'X') { + start = 2 + prefix = true + } + + for i := start; i < len(s); i++ { + if reverseHexTable[s[i]] > 0x0f { + return false, prefix + } + } + return true, prefix +} + +type FormatOpts struct { + Quote bool + InitialIndent int + SkipNilAndEmpty bool + ShortHex bool + PrintType bool + Colors ColorMap +} + +func Format(writer io.Writer, v reflect.Value, opts FormatOpts) { + if opts.Colors == nil { + opts.Colors = ColorMap_Default + } + tw := tabwriter.NewWriter(writer, 4, 4, 1, ' ', 0) + var w io.Writer + if opts.InitialIndent == 0 { + w = tw + } else { + ind := make([]byte, opts.InitialIndent) + for i := 0; i < opts.InitialIndent; i++ { + ind[i] = '\t' + } + w = text.NewIndentWriter(tw, ind) + } + p := &printer{ + Writer: w, + tw: tw, + visited: make(map[visit]int), + opts: &opts, + } + p.printValue(v, opts.PrintType, opts.Quote, false) + tw.Flush() +} + +// Implement for custom formatting, first message is printed, then any tag pairs. +type TaggedObject interface { + Message() string + ForEachTag(func(name string, value any) bool) +} + +type printer struct { + io.Writer + tw *tabwriter.Writer + visited map[visit]int + depth int + opts *FormatOpts +} + +func (p *printer) indent() *printer { + q := *p + q.tw = tabwriter.NewWriter(p.Writer, 4, 4, 1, ' ', 0) + q.Writer = text.NewIndentWriter(q.tw, []byte{'\t'}) + return &q +} + +func (p *printer) writeString(s string) { + _, _ = io.WriteString(p, s) +} + +func (p *printer) printInline(v reflect.Value, x any, showType bool, color []byte) { + OpenColor(p.Writer, color) + if showType { + p.writeString(v.Type().String()) + fmt.Fprintf(p, "(%#v)", x) + } else { + fmt.Fprintf(p, "%#v", x) + } + CloseColor(p.Writer, color) +} + +func (p *printer) printIntInline(v reflect.Value, x any, showType bool, color []byte) { + OpenColor(p.Writer, color) + if showType { + p.writeString(v.Type().String()) + fmt.Fprintf(p, "(%d)", x) + } else { + fmt.Fprintf(p, "%d", x) + } + CloseColor(p.Writer, color) +} + +// printValue must keep track of already-printed pointer values to avoid +// infinite recursion. +type visit struct { + v uintptr + typ reflect.Type +} + +func (p *printer) catchPanic(v reflect.Value, method string) { + if r := recover(); r != nil { + if v.Kind() == reflect.Ptr && v.IsNil() { + writeByte(p, '(') + p.writeString(v.Type().String()) + const vsCodeEditorColoringBugWorkaround = ")(nil)" + p.writeString(vsCodeEditorColoringBugWorkaround) + return + } + writeByte(p, '(') + p.writeString(v.Type().String()) + p.writeString(")(PANIC=calling method ") + p.writeString(strconv.Quote(method)) + p.writeString(": ") + fmt.Fprint(p, r) + writeByte(p, ')') + } +} + +var ( + durationType = reflect.TypeOf(time.Duration(0)) + errorType = reflect.TypeOf((*error)(nil)).Elem() + taggedObjectType = reflect.TypeOf((*TaggedObject)(nil)).Elem() + goStringerType = reflect.TypeOf((*fmt.GoStringer)(nil)).Elem() +) + +func (p *printer) printValue(v reflect.Value, showType, quote bool, key bool) { + if p.depth > 10 { + p.writeString("!%v(DEPTH EXCEEDED)") + return + } + + if v.IsValid() && v.CanInterface() && v.Type().Implements(goStringerType) { + i := v.Interface() + if goStringer, ok := i.(fmt.GoStringer); ok { + defer p.catchPanic(v, "GoString") + p.writeString(goStringer.GoString()) + return + } + } + + switch v.Kind() { + case reflect.Bool: + var boolColor []byte + if v.Bool() { + boolColor = p.opts.Colors[ColorMap_BoolTrue] + } else { + boolColor = p.opts.Colors[ColorMap_BoolFalse] + } + p.printInline(v, v.Bool(), showType, boolColor) + + case reflect.Int64: + if v.Type() != durationType { + p.printIntInline(v, v.Int(), showType, p.opts.Colors[ColorMap_Int]) + } else { + p.fmtString(v.Interface().(time.Duration).String(), false, false) + } + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32: + p.printIntInline(v, v.Int(), showType, p.opts.Colors[ColorMap_Int]) + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + p.printIntInline(v, v.Uint(), showType, p.opts.Colors[ColorMap_Int]) + + case reflect.Uintptr: + p.printInline(v, v.Uint(), showType, p.opts.Colors[ColorMap_Int]) + + case reflect.Float32, reflect.Float64: + p.printInline(v, v.Float(), showType, p.opts.Colors[ColorMap_Float]) + + case reflect.Complex64, reflect.Complex128: + fmt.Fprintf(p, "%#v", v.Complex()) + + case reflect.String: + p.fmtString(v.String(), quote, key) + + case reflect.Map: + p.printMap(v, showType) + + case reflect.Struct: + p.printStruct(v, showType) + + case reflect.Interface: + if v.Type().Implements(errorType) { + p.printError(v.Interface().(error)) + } else { + switch e := v.Elem(); { + case e.Kind() == reflect.Invalid: + p.printNil("") + case e.IsValid(): + pp := *p + pp.depth++ + pp.printValue(e, showType, true, key) + default: + p.printNil(v.Type().String()) + } + } + + case reflect.Array, reflect.Slice: + p.printArray(v, showType) + + case reflect.Ptr: + if v.Type().Implements(errorType) { + p.printError(v.Interface().(error)) + } else { + e := v.Elem() + if !e.IsValid() { + p.printNil(v.Type().String()) + } else { + pp := *p + pp.depth++ + pp.printValue(e, p.opts.PrintType, true, key) + } + } + + case reflect.Chan: + x := v.Pointer() + if showType { + writeByte(p, '(') + p.writeString(v.Type().String()) + fmt.Fprintf(p, ")(%#v)", x) + } else { + fmt.Fprintf(p, "%#v", x) + } + + case reflect.Func: + p.writeString(v.Type().String()) + p.writeString(" {...}") + + case reflect.UnsafePointer: + p.printInline(v, v.Pointer(), showType, DisableColor) + + case reflect.Invalid: + p.printNil("") + } +} + +func (p *printer) printError(err error) { + if tagged, ok := err.(TaggedObject); ok { + p.printTagged(tagged, ColorMap_ErrorText) + return + } + + str := err.Error() + if str == "" { + str = "(empty error)" + } + OpenColor(p.Writer, p.opts.Colors[ColorMap_ErrorText]) + p.writeString(str) + CloseColor(p.Writer, p.opts.Colors[ColorMap_ErrorText]) +} + +func (p *printer) printNil(t string) { + OpenColor(p.Writer, p.opts.Colors[ColorMap_Nil]) + if t != "" { + writeByte(p, '(') + p.writeString(t) + writeByte(p, ')') + } + p.writeString("nil") + CloseColor(p.Writer, p.opts.Colors[ColorMap_Nil]) +} + +const ( + shortenHexBytes = 20 + shortenHexBytesPartLen = shortenHexBytes/2 - 1 + shortenHexChars = shortenHexBytes * 2 + shortenHexCharsPartLen = shortenHexChars/2 - 2 +) + +func writeHexBytes(w io.Writer, src []byte) { + dst := make([]byte, len(src)*2) + hex.Encode(dst, src) + _, _ = w.Write(dst) +} + +func writeShortHexBytes(w io.Writer, src []byte) { + if len(src) <= shortenHexBytes { + writeHexBytes(w, src) + } else { + dst := make([]byte, hex.EncodedLen(shortenHexBytesPartLen)) + hex.Encode(dst, src[:shortenHexBytesPartLen]) + _, _ = w.Write(dst) + _, _ = w.Write([]byte("..")) + hex.Encode(dst, src[len(src)-shortenHexBytesPartLen:]) + _, _ = w.Write(dst) + } +} + +func getBytes(v reflect.Value) []byte { + if v.Kind() == reflect.Array && !v.CanAddr() { + ret := make([]byte, v.Len()) + for i := 0; i < v.Len(); i++ { + b, ok := v.Index(i).Interface().(byte) + if ok { + ret[i] = b + } else { + return []byte{0xBA, 0xD0, 0xBA, 0xD0} + } + } + return ret + } + return v.Bytes() +} + +func (p *printer) printArray(v reflect.Value, showType bool) { + t := v.Type() + + if v.Kind() == reflect.Slice && v.IsNil() { + if showType { + p.printNil(t.String()) + } else { + p.printNil("") + } + return + } + + if showType { + p.writeString(t.String()) + } + + // v.CanAddr() + if t.Elem().Kind() == reflect.Uint8 { + OpenColor(p.Writer, p.opts.Colors[ColorMap_Hex]) + b := getBytes(v) + if p.opts.ShortHex { + writeShortHexBytes(p, b) + } else { + writeHexBytes(p, b) + } + CloseColor(p.Writer, p.opts.Colors[ColorMap_Hex]) + return + } + + OpenColor(p.Writer, p.opts.Colors[ColorMap_Brace]) + writeByte(p, '[') + CloseColor(p.Writer, p.opts.Colors[ColorMap_Brace]) + expand := !canInline(v.Type()) + pp := p + if expand { + writeByte(p, '\n') + pp = p.indent() + } + for i := 0; i < v.Len(); i++ { + showTypeInSlice := t.Elem().Kind() == reflect.Interface + pp.printValue(v.Index(i), showTypeInSlice, true, false) + if expand { + pp.writeString(",\n") + } else if i < v.Len()-1 { + pp.writeString(", ") + } + } + if expand { + pp.tw.Flush() + } + OpenColor(p.Writer, p.opts.Colors[ColorMap_Brace]) + writeByte(p, ']') + CloseColor(p.Writer, p.opts.Colors[ColorMap_Brace]) +} + +func (p *printer) printTagged(v TaggedObject, msgColorNum int) { + if v == nil { + p.printNil("") + return + } + + OpenColor(p.Writer, p.opts.Colors[msgColorNum]) + p.writeString(v.Message()) + CloseColor(p.Writer, p.opts.Colors[msgColorNum]) + + expand := !canInlineTagged(v) + pp := p + if expand { + writeByte(p, '\n') + pp = p.indent() + } else { + pp.writeString("; ") + } + prevPrinted := false + v.ForEachTag(func(name string, val any) bool { + tp := reflect.TypeOf(val) + value := reflect.ValueOf(val) + + if p.opts.SkipNilAndEmpty && !Nonzero(value) && tp.Kind() != reflect.Bool { + return true + } + + if !expand && prevPrinted { + pp.writeString(", ") + } + + if name != "" { + OpenColor(pp.Writer, p.opts.Colors[ColorMap_LogFieldKey]) + pp.writeString(name) + CloseColor(pp.Writer, p.opts.Colors[ColorMap_LogFieldKey]) + pp.writeString(" = ") + } + pp.printValue(value, false, true, false) + prevPrinted = true + + if expand { + pp.writeString(",\n") + } + + return true + }) + if expand { + pp.tw.Flush() + } +} + +func isProto(t reflect.Type) bool { + f, ok := t.FieldByName("state") + if !ok { + return false + } + return strings.HasPrefix(f.Type.PkgPath(), "google.golang.org/protobuf") +} + +func (p *printer) printStruct(v reflect.Value, showType bool) { + t := v.Type() + + if v.CanAddr() { + addr := v.UnsafeAddr() + vis := visit{addr, t} + if vd, ok := p.visited[vis]; ok && vd < p.depth { + p.fmtString(t.String()+"{(CYCLIC REFERENCE)}", false, false) + return // don't print v again + } + p.visited[vis] = p.depth + } + + if t.Implements(errorType) { + p.printError(v.Interface().(error)) + return + } + + if t.Implements(taggedObjectType) { + p.printTagged(v.Interface().(TaggedObject), ColorMap_Message) + return + } + + isProto := isProto(t) + + OpenColor(p.Writer, p.opts.Colors[ColorMap_Brace]) + if showType { + p.writeString(t.String()) + } + writeByte(p, '{') + CloseColor(p.Writer, p.opts.Colors[ColorMap_Brace]) + if Nonzero(v) { + expand := !canInline(v.Type()) + pp := p + if expand { + writeByte(p, '\n') + pp = p.indent() + } + prevPrinted := false + for i := 0; i < v.NumField(); i++ { + field := t.Field(i) + + if isProto && + (field.Name == "sizeCache" || + field.Name == "unknownFields" || + field.Name == "state") { + continue + } + + value := getField(v, i) + + if p.opts.SkipNilAndEmpty && !Nonzero(value) && field.Type.Kind() != reflect.Bool { + continue + } + + if field.Tag.Get("dlog") == "omit" { + continue + } + + if !expand && prevPrinted { + pp.writeString(", ") + } + + showTypeInStruct := true + if field.Name != "" { + OpenColor(pp.Writer, p.opts.Colors[ColorMap_FieldName]) + pp.writeString(field.Name) + CloseColor(pp.Writer, p.opts.Colors[ColorMap_FieldName]) + OpenColor(pp.Writer, p.opts.Colors[ColorMap_Colon]) + writeByte(pp, ':') + CloseColor(pp.Writer, p.opts.Colors[ColorMap_Colon]) + if expand { + writeByte(pp, '\t') + } + showTypeInStruct = labelType(field.Type) + } + pp.printValue(value, showTypeInStruct, true, false) + prevPrinted = true + + if expand { + pp.writeString(",\n") + } + } + if expand { + pp.tw.Flush() + } + } + OpenColor(p.Writer, p.opts.Colors[ColorMap_Brace]) + writeByte(p, '}') + CloseColor(p.Writer, p.opts.Colors[ColorMap_Brace]) +} + +func (p *printer) printMap(v reflect.Value, showType bool) { + OpenColor(p.Writer, p.opts.Colors[ColorMap_Brace]) + t := v.Type() + if showType { + p.writeString(t.String()) + } + writeByte(p, '{') + CloseColor(p.Writer, p.opts.Colors[ColorMap_Brace]) + if Nonzero(v) { + expand := !canInline(v.Type()) + pp := p + if expand { + writeByte(p, '\n') + pp = p.indent() + } + sm := fmtsort.Sort(v) + for i := 0; i < v.Len(); i++ { + k := sm.Key[i] + mv := sm.Value[i] + pp.printValue(k, false, true, true) + OpenColor(pp.Writer, p.opts.Colors[ColorMap_Colon]) + writeByte(pp, ':') + CloseColor(pp.Writer, p.opts.Colors[ColorMap_Colon]) + if expand { + writeByte(pp, '\t') + } + showTypeInStruct := t.Elem().Kind() == reflect.Interface + pp.printValue(mv, showTypeInStruct, true, false) + if expand { + pp.writeString(",\n") + } else if i < v.Len()-1 { + pp.writeString(", ") + } + } + if expand { + pp.tw.Flush() + } + } + OpenColor(p.Writer, p.opts.Colors[ColorMap_Brace]) + writeByte(p, '}') + CloseColor(p.Writer, p.opts.Colors[ColorMap_Brace]) +} + +func canInlineTagged(v TaggedObject) bool { + ret := true + v.ForEachTag(func(name string, value any) bool { + r := unwrapInterface(reflect.ValueOf(value)) + if canExpand(r.Type()) { + ret = false + return false + } + return true + }) + return ret +} + +func canInline(t reflect.Type) bool { + // nolint:exhaustive + switch t.Kind() { + case reflect.Map: + // return !canExpand(t.Elem()) + return false + case reflect.Struct: + for i := 0; i < t.NumField(); i++ { + if canExpand(t.Field(i).Type) { + return false + } + } + return true + case reflect.Interface: + return false + case reflect.Array, reflect.Slice: + return !canExpand(t.Elem()) + case reflect.Ptr: + return false + case reflect.Chan, reflect.Func, reflect.UnsafePointer: + return false + default: + return true + } +} + +func canExpand(t reflect.Type) bool { + // nolint:exhaustive + switch t.Kind() { + case reflect.Map, reflect.Struct, + reflect.Interface, reflect.Array, reflect.Slice, + reflect.Ptr: + return true + default: + return false + } +} + +func labelType(t reflect.Type) bool { + // nolint:exhaustive + switch t.Kind() { + case reflect.Interface, reflect.Struct: + return true + default: + return false + } +} + +func (p *printer) fmtString(s string, quote bool, key bool) { + hex, hasPrefix := IsHexString(s) + if hex { + if p.opts.ShortHex { + if hasPrefix { + if len(s) > (shortenHexChars + 2) { + s = s[:(2+shortenHexCharsPartLen)] + ".." + s[len(s)-shortenHexCharsPartLen:] + } + } else { + if len(s) > shortenHexChars { + s = s[:shortenHexCharsPartLen] + ".." + s[len(s)-shortenHexCharsPartLen:] + } + } + } + } + + var color []byte + if key { + color = p.opts.Colors[ColorMap_Key] + } else if hex { + color = p.opts.Colors[ColorMap_Hex] + } else { + color = p.opts.Colors[ColorMap_String] + } + + if quote { + s = strconv.Quote(s) + } + + OpenColor(p.Writer, color) + p.writeString(s) + CloseColor(p.Writer, color) +} + +func writeByte(w io.Writer, b byte) { + _, _ = w.Write([]byte{b}) +} + +func getField(v reflect.Value, i int) reflect.Value { + val := v.Field(i) + if val.Kind() == reflect.Interface && !val.IsNil() { + val = val.Elem() + } + return val +} + +func unwrapInterface(v reflect.Value) reflect.Value { + if v.Kind() == reflect.Interface && !v.IsNil() { + return v.Elem() + } + return v +} diff --git a/core/node/dlog/json_handler.go b/core/node/dlog/json_handler.go new file mode 100644 index 000000000..7c02e8672 --- /dev/null +++ b/core/node/dlog/json_handler.go @@ -0,0 +1,375 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package dlog + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "log/slog" + "reflect" + "strconv" + "time" + "unicode/utf8" + + buffer "github.com/river-build/river/core/node/dlog/buffer" +) + +// PrettyJSONHandler is a Handler that writes Records to an io.Writer as +// line-delimited JSON objects. +type PrettyJSONHandler struct { + *commonHandler +} + +// NewPrettyJSONHandler creates a PrettyJSONHandler that writes to w, +// using the given options. +// If opts is nil, the default options are used. +func NewPrettyJSONHandler(w io.Writer, opts *PrettyHandlerOptions) *PrettyJSONHandler { + if opts == nil { + opts = &PrettyHandlerOptions{} + } + return &PrettyJSONHandler{ + &commonHandler{ + json: true, + w: w, + opts: *opts, + }, + } +} + +// Enabled reports whether the handler handles records at the given level. +// The handler ignores records whose level is lower. +func (h *PrettyJSONHandler) Enabled(_ context.Context, level slog.Level) bool { + return h.commonHandler.enabled(level) +} + +// WithAttrs returns a new PrettyJSONHandler whose attributes consists +// of h's attributes followed by attrs. +func (h *PrettyJSONHandler) WithAttrs(attrs []slog.Attr) slog.Handler { + return &PrettyJSONHandler{commonHandler: h.commonHandler.withAttrs(attrs)} +} + +func (h *PrettyJSONHandler) WithGroup(name string) slog.Handler { + return &PrettyJSONHandler{commonHandler: h.commonHandler.withGroup(name)} +} + +// Handle formats its argument Record as a JSON object on a single line. +// +// If the Record's time is zero, the time is omitted. +// Otherwise, the key is "time" +// and the value is output as with json.Marshal. +// +// If the Record's level is zero, the level is omitted. +// Otherwise, the key is "level" +// and the value of [Level.String] is output. +// +// If the AddSource option is set and source information is available, +// the key is "source" +// and the value is output as "FILE:LINE". +// +// The message's key is "msg". +// +// To modify these or other attributes, or remove them from the output, use +// [HandlerOptions.ReplaceAttr]. +// +// Values are formatted as with an [encoding/json.Encoder] with SetEscapeHTML(false), +// with two exceptions. +// +// First, an Attr whose Value is of type error is formatted as a string, by +// calling its Error method. Only errors in Attrs receive this special treatment, +// not errors embedded in structs, slices, maps or other data structures that +// are processed by the encoding/json package. +// +// Second, an encoding failure does not cause Handle to return an error. +// Instead, the error message is formatted as a string. +// +// Each call to Handle results in a single serialized call to io.Writer.Write. +func (h *PrettyJSONHandler) Handle(_ context.Context, r slog.Record) error { + return h.commonHandler.handle(r) +} + +func appendJSONBuiltIns(state *handleState, r slog.Record) { + // time + if !r.Time.IsZero() { + key := slog.TimeKey + val := r.Time.Round(0) // strip monotonic to match Attr behavior + state.appendKey(key) + state.appendTime(val) + } + + // level + state.appendKey(slog.LevelKey) + state.appendString(r.Level.String()) + + // TODO: source is not availabe for external package. + // source + // if h.opts.AddSource { + // state.appendAttr(Any(SourceKey, r.source)) + // } + + // message + state.appendKey(slog.MessageKey) + state.appendString(r.Message) +} + +// Adapted from time.Time.MarshalJSON to avoid allocation. +func appendJSONTime(s *handleState, t time.Time) { + if y := t.Year(); y < 0 || y >= 10000 { + // RFC 3339 is clear that years are 4 digits exactly. + // See golang.org/issue/4556#c15 for more discussion. + s.appendError(errors.New("time.Time year outside of range [0,9999]")) + } + s.buf.WriteByte('"') + *s.buf = t.AppendFormat(*s.buf, time.RFC3339Nano) + s.buf.WriteByte('"') +} + +func appendJSONValue(s *handleState, v slog.Value) error { + // nolint:exhaustive + switch v.Kind() { + case slog.KindString: + s.appendString(v.String()) + case slog.KindInt64: + *s.buf = strconv.AppendInt(*s.buf, v.Int64(), 10) + case slog.KindUint64: + *s.buf = strconv.AppendUint(*s.buf, v.Uint64(), 10) + case slog.KindFloat64: + // json.Marshal is funny about floats; it doesn't + // always match strconv.AppendFloat. So just call it. + // That's expensive, but floats are rare. + if err := appendJSONMarshal(s.buf, v.Float64()); err != nil { + return err + } + case slog.KindBool: + *s.buf = strconv.AppendBool(*s.buf, v.Bool()) + case slog.KindDuration: + // Do what json.Marshal does. + *s.buf = strconv.AppendInt(*s.buf, int64(v.Duration()), 10) + case slog.KindTime: + s.appendTime(v.Time()) + case slog.KindAny: + a := v.Any() + _, jm := a.(json.Marshaler) + if err, ok := a.(error); ok && !jm { + s.appendString(err.Error()) + } else { + return appendJSONMarshal(s.buf, a) + } + default: + panic(fmt.Sprintf("bad kind: %s", v.Kind())) + } + return nil +} + +func appendJSONMarshal(buf *buffer.Buffer, v any) error { + // Use json unmarshalling for structs to take advantage of json struct tags in order to omit sensitive data. + valueType := reflect.ValueOf(v) + if valueType.Kind() == reflect.Struct { + var b []byte + var err error + if b, err = json.Marshal(v); err != nil { + return err + } + _, _ = buf.Write(b) + return nil + } + + // Use a json.Encoder to avoid escaping HTML. + var bb bytes.Buffer + enc := json.NewEncoder(&bb) + enc.SetEscapeHTML(false) + if err := enc.Encode(v); err != nil { + return err + } + bs := bb.Bytes() + _, _ = buf.Write(bs[:len(bs)-1]) // remove final newline + return nil +} + +// appendEscapedJSONString escapes s for JSON and appends it to buf. +// It does not surround the string in quotation marks. +// +// Modified from encoding/json/encode.go:encodeState.string, +// with escapeHTML set to false. +func appendEscapedJSONString(buf []byte, s string) []byte { + char := func(b byte) { buf = append(buf, b) } + str := func(s string) { buf = append(buf, s...) } + + start := 0 + for i := 0; i < len(s); { + if b := s[i]; b < utf8.RuneSelf { + if safeSet[b] { + i++ + continue + } + if start < i { + str(s[start:i]) + } + char('\\') + switch b { + case '\\', '"': + char(b) + case '\n': + char('n') + case '\r': + char('r') + case '\t': + char('t') + default: + // This encodes bytes < 0x20 except for \t, \n and \r. + str(`u00`) + char(hexTable[b>>4]) + char(hexTable[b&0xF]) + } + i++ + start = i + continue + } + c, size := utf8.DecodeRuneInString(s[i:]) + if c == utf8.RuneError && size == 1 { + if start < i { + str(s[start:i]) + } + str(`\ufffd`) + i += size + start = i + continue + } + // U+2028 is LINE SEPARATOR. + // U+2029 is PARAGRAPH SEPARATOR. + // They are both technically valid characters in JSON strings, + // but don't work in JSONP, which has to be evaluated as JavaScript, + // and can lead to security holes there. It is valid JSON to + // escape them, so we do so unconditionally. + // See http://timelessrepo.com/json-isnt-a-javascript-subset for discussion. + if c == '\u2028' || c == '\u2029' { + if start < i { + str(s[start:i]) + } + str(`\u202`) + char(hexTable[c&0xF]) + i += size + start = i + continue + } + i += size + } + if start < len(s) { + str(s[start:]) + } + return buf +} + +var hexTable = "0123456789abcdef" + +// Copied from encoding/json/tables.go. +// +// safeSet holds the value true if the ASCII character with the given array +// position can be represented inside a JSON string without any further +// escaping. +// +// All values are true except for the ASCII control characters (0-31), the +// double quote ("), and the backslash character ("\"). +var safeSet = [utf8.RuneSelf]bool{ + ' ': true, + '!': true, + '"': false, + '#': true, + '$': true, + '%': true, + '&': true, + '\'': true, + '(': true, + ')': true, + '*': true, + '+': true, + ',': true, + '-': true, + '.': true, + '/': true, + '0': true, + '1': true, + '2': true, + '3': true, + '4': true, + '5': true, + '6': true, + '7': true, + '8': true, + '9': true, + ':': true, + ';': true, + '<': true, + '=': true, + '>': true, + '?': true, + '@': true, + 'A': true, + 'B': true, + 'C': true, + 'D': true, + 'E': true, + 'F': true, + 'G': true, + 'H': true, + 'I': true, + 'J': true, + 'K': true, + 'L': true, + 'M': true, + 'N': true, + 'O': true, + 'P': true, + 'Q': true, + 'R': true, + 'S': true, + 'T': true, + 'U': true, + 'V': true, + 'W': true, + 'X': true, + 'Y': true, + 'Z': true, + '[': true, + '\\': false, + ']': true, + '^': true, + '_': true, + '`': true, + 'a': true, + 'b': true, + 'c': true, + 'd': true, + 'e': true, + 'f': true, + 'g': true, + 'h': true, + 'i': true, + 'j': true, + 'k': true, + 'l': true, + 'm': true, + 'n': true, + 'o': true, + 'p': true, + 'q': true, + 'r': true, + 's': true, + 't': true, + 'u': true, + 'v': true, + 'w': true, + 'x': true, + 'y': true, + 'z': true, + '{': true, + '|': true, + '}': true, + '~': true, + '\u007f': true, +} diff --git a/core/node/dlog/json_handler_test.go b/core/node/dlog/json_handler_test.go new file mode 100644 index 000000000..100582808 --- /dev/null +++ b/core/node/dlog/json_handler_test.go @@ -0,0 +1,32 @@ +package dlog_test + +import ( + "os" + "testing" + + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/testutils" + "github.com/stretchr/testify/require" +) + +func TestJsonLoggerLogsSaneProtoBinaryStrings(t *testing.T) { + envelope := &Envelope{ + Hash: []byte("2346ad27d7568ba9896f1b7da6b5991251debdf2"), + } + + // Create a new dlog logger that logs to a temp file in JSON format + logger, buffer := testutils.DlogJsonLogger() + + logger.Info("Logging envelope", "envelope", envelope) + + logOutput := buffer.String() + logOutput = testutils.RemoveJsonTimestamp(string(logOutput)) + + expectedBytes, err := os.ReadFile("testdata/envelope_json.txt") + require.NoError(t, err) + expected := testutils.RemoveJsonTimestamp(string(expectedBytes[:])) + + // Compare the output with the expected output + // The expected output contains a b64-encoded string of the Hash field above. + require.Equal(t, expected, logOutput) +} diff --git a/core/node/dlog/log.go b/core/node/dlog/log.go new file mode 100644 index 000000000..2b0d0b8c2 --- /dev/null +++ b/core/node/dlog/log.go @@ -0,0 +1,44 @@ +package dlog + +import ( + "context" + "log/slog" + "os" +) + +var ( + DefaultLogOut = os.Stdout + defaultLogger *slog.Logger = slog.New(NewPrettyTextHandler(DefaultLogOut, &PrettyHandlerOptions{})) +) + +// Log is the default logger. +func Log() *slog.Logger { + return defaultLogger +} + +func SetLog(l *slog.Logger) { + defaultLogger = l +} + +func LogWith(args ...any) *slog.Logger { + return Log().With(args...) +} + +type dlogCtxKeyType struct{} + +var dlogCtxKey = dlogCtxKeyType{} + +func CtxWithLog(ctx context.Context, l *slog.Logger) context.Context { + return context.WithValue(ctx, dlogCtxKey, l) +} + +func CtxWithLogValues(ctx context.Context, args ...any) context.Context { + return context.WithValue(ctx, dlogCtxKey, LogWith(args...)) +} + +func FromCtx(ctx context.Context) *slog.Logger { + if l, ok := ctx.Value(dlogCtxKey).(*slog.Logger); ok { + return l + } + return slog.Default() +} diff --git a/core/node/dlog/multi_handler.go b/core/node/dlog/multi_handler.go new file mode 100644 index 000000000..b4613c5dc --- /dev/null +++ b/core/node/dlog/multi_handler.go @@ -0,0 +1,48 @@ +package dlog + +import ( + "context" + "log/slog" +) + +// MultiHandler is a slog.Handler that writes to multiple handlers. +type MultiHandler []slog.Handler + +func (h *MultiHandler) Enabled(ctx context.Context, l slog.Level) bool { + for _, c := range *h { + if c.Enabled(ctx, l) { + return true + } + } + return false +} + +func (h *MultiHandler) Handle(ctx context.Context, r slog.Record) error { + for _, c := range *h { + if err := c.Handle(ctx, r); err != nil { + return err + } + } + return nil +} + +func (h *MultiHandler) WithAttrs(attrs []slog.Attr) slog.Handler { + var handlers MultiHandler + for _, c := range *h { + handlers = append(handlers, c.WithAttrs(attrs)) + } + return &handlers +} + +func (h *MultiHandler) WithGroup(name string) slog.Handler { + var handlers MultiHandler + for _, c := range *h { + handlers = append(handlers, c.WithGroup(name)) + } + return &handlers +} + +func NewMultiHandler(handlers ...slog.Handler) *MultiHandler { + multiHandler := MultiHandler(handlers) + return &multiHandler +} diff --git a/core/node/dlog/null_handler.go b/core/node/dlog/null_handler.go new file mode 100644 index 000000000..f1c99c50e --- /dev/null +++ b/core/node/dlog/null_handler.go @@ -0,0 +1,25 @@ +package dlog + +import ( + "context" + "log/slog" +) + +// NullHandler is a slog.Handler that does nothing. +type NullHandler struct{} + +func (h *NullHandler) Enabled(ctx context.Context, l slog.Level) bool { + return false +} + +func (h *NullHandler) Handle(ctx context.Context, r slog.Record) error { + return nil +} + +func (h *NullHandler) WithAttrs(attrs []slog.Attr) slog.Handler { + return h +} + +func (h *NullHandler) WithGroup(name string) slog.Handler { + return h +} diff --git a/core/node/dlog/testdata/envelope_json.txt b/core/node/dlog/testdata/envelope_json.txt new file mode 100644 index 000000000..f89acee5c --- /dev/null +++ b/core/node/dlog/testdata/envelope_json.txt @@ -0,0 +1 @@ +{"time":"[TIMESTAMP]","level":"INFO","msg":"Logging envelope","envelope":{"hash":"MjM0NmFkMjdkNzU2OGJhOTg5NmYxYjdkYTZiNTk5MTI1MWRlYmRmMg=="}} diff --git a/core/node/dlog/text_handler.go b/core/node/dlog/text_handler.go new file mode 100644 index 000000000..3ee535af4 --- /dev/null +++ b/core/node/dlog/text_handler.go @@ -0,0 +1,235 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package dlog + +import ( + "context" + "encoding" + "fmt" + "io" + "log/slog" + "reflect" + "unicode" + "unicode/utf8" +) + +// PrettyTextHandler is a Handler that writes Records to an io.Writer as a +// sequence of key=value pairs separated by spaces and followed by a newline. +type PrettyTextHandler struct { + *commonHandler +} + +// NewPrettyTextHandler creates a PrettyTextHandler that writes to w, +// using the given options. +// If opts is nil, the default options are used. +func NewPrettyTextHandler(w io.Writer, opts *PrettyHandlerOptions) *PrettyTextHandler { + if opts == nil { + opts = &PrettyHandlerOptions{} + } + if opts.Colors == nil { + opts.Colors = ColorMap_Default + } + return &PrettyTextHandler{ + &commonHandler{ + json: false, + w: w, + opts: *opts, + }, + } +} + +// Enabled reports whether the handler handles records at the given level. +// The handler ignores records whose level is lower. +func (h *PrettyTextHandler) Enabled(_ context.Context, level slog.Level) bool { + return h.commonHandler.enabled(level) +} + +// WithAttrs returns a new PrettyTextHandler whose attributes consists +// of h's attributes followed by attrs. +func (h *PrettyTextHandler) WithAttrs(attrs []slog.Attr) slog.Handler { + return &PrettyTextHandler{commonHandler: h.commonHandler.withAttrs(attrs)} +} + +func (h *PrettyTextHandler) WithGroup(name string) slog.Handler { + return &PrettyTextHandler{commonHandler: h.commonHandler.withGroup(name)} +} + +// Handle formats its argument Record as a single line of space-separated +// key=value items. +// +// If the Record's time is zero, the time is omitted. +// Otherwise, the key is "time" +// and the value is output in RFC3339 format with millisecond precision. +// +// If the Record's level is zero, the level is omitted. +// Otherwise, the key is "level" +// and the value of [Level.String] is output. +// +// If the AddSource option is set and source information is available, +// the key is "source" and the value is output as FILE:LINE. +// +// The message's key is "msg". +// +// To modify these or other attributes, or remove them from the output, use +// [HandlerOptions.ReplaceAttr]. +// +// If a value implements [encoding.TextMarshaler], the result of MarshalText is +// written. Otherwise, the result of fmt.Sprint is written. +// +// Keys and values are quoted with [strconv.Quote] if they contain Unicode space +// characters, non-printing characters, '"' or '='. +// +// Keys inside groups consist of components (keys or group names) separated by +// dots. No further escaping is performed. +// Thus there is no way to determine from the key "a.b.c" whether there +// are two groups "a" and "b" and a key "c", or a single group "a.b" and a key "c", +// or single group "a" and a key "b.c". +// If it is necessary to reconstruct the group structure of a key +// even in the presence of dots inside components, use +// [HandlerOptions.ReplaceAttr] to encode that information in the key. +// +// Each call to Handle results in a single serialized call to +// io.Writer.Write. +func (h *PrettyTextHandler) Handle(_ context.Context, r slog.Record) error { + return h.commonHandler.handle(r) +} + +func appendTextAny(s *handleState, a any, inline bool) error { + if tm, ok := a.(encoding.TextMarshaler); ok { + data, err := tm.MarshalText() + if err != nil { + return err + } + s.appendString(string(data)) + return nil + } + + // Print errors inline. + if _, ok := a.(error); ok { + inline = true + } + + v := reflect.ValueOf(a) + + indent := 0 + _, isByteSlice := byteSlice(a) + if !inline && !isByteSlice && Nonzero(v) { + s.buf.WriteByte('\n') + indent = 2 + } + + Format(s.buf, v, FormatOpts{ + Quote: false, + InitialIndent: indent, + SkipNilAndEmpty: true, + ShortHex: !s.h.opts.DisableShortHex, + Colors: s.h.opts.Colors, + }) + return nil +} + +func appendTextValue(s *handleState, v slog.Value) error { + switch v.Kind() { + case slog.KindString, slog.KindInt64, slog.KindUint64, slog.KindBool, slog.KindFloat64, slog.KindDuration: + return appendTextAny(s, v.Any(), true) + + case slog.KindAny: + return appendTextAny(s, v.Any(), false) + + case slog.KindTime: + s.appendTime(v.Time()) + + case slog.KindGroup: + *s.buf = fmt.Append(*s.buf, v.Group()) + + case slog.KindLogValuer: + *s.buf = fmt.Append(*s.buf, v.LogValuer()) + + default: + panic(fmt.Sprintf("bad kind: %s", v.Kind())) + } + return nil +} + +func levelColor(s *handleState, level slog.Level) ColorCode { + if level >= slog.LevelError { + return s.h.opts.Colors[ColorMap_Level_Error] + } else if level >= slog.LevelWarn { + return s.h.opts.Colors[ColorMap_Level_Warn] + } else if level >= slog.LevelInfo { + return s.h.opts.Colors[ColorMap_Level_Info] + } else { + return s.h.opts.Colors[ColorMap_Level_Debug] + } +} + +func appendTextBuiltIns(s *handleState, r slog.Record) { + // level + levelColor := levelColor(s, r.Level) + OpenColor(s.buf, levelColor) + s.appendString(r.Level.String()[:4]) + CloseColor(s.buf, levelColor) + s.buf.WriteByte(' ') + + // time + OpenColor(s.buf, s.h.opts.Colors[ColorMap_Time]) + if !r.Time.IsZero() { + s.appendTime(r.Time) + s.buf.WriteByte(' ') + } else { + s.buf.WriteString("00000 ") + } + CloseColor(s.buf, s.h.opts.Colors[ColorMap_Time]) + + // TODO: source is not availabe for external package. + // source + // if h.opts.AddSource { + // state.appendAttr(Any(SourceKey, r.source)) + // } + + // message + OpenColor(s.buf, s.h.opts.Colors[ColorMap_Message]) + s.buf.WriteString(r.Message) + CloseColor(s.buf, s.h.opts.Colors[ColorMap_Message]) +} + +// byteSlice returns its argument as a []byte if the argument's +// underlying type is []byte, along with a second return value of true. +// Otherwise it returns nil, false. +func byteSlice(a any) ([]byte, bool) { + if bs, ok := a.([]byte); ok { + return bs, true + } + // Like Printf's %s, we allow both the slice type and the byte element type to be named. + t := reflect.TypeOf(a) + if t != nil && t.Kind() == reflect.Slice && t.Elem().Kind() == reflect.Uint8 { + return reflect.ValueOf(a).Bytes(), true + } + return nil, false +} + +func needsQuoting(s string) bool { + if len(s) == 0 { + return true + } + for i := 0; i < len(s); { + b := s[i] + if b < utf8.RuneSelf { + // Quote anything except a backslash that would need quoting in a + // JSON string, as well as space and '=' + if b != '\\' && (b == ' ' || b == '=' || !safeSet[b]) { + return true + } + i++ + continue + } + r, size := utf8.DecodeRuneInString(s[i:]) + if r == utf8.RuneError || unicode.IsSpace(r) || !unicode.IsPrint(r) { + return true + } + i += size + } + return false +} diff --git a/core/node/dlog/zero.go b/core/node/dlog/zero.go new file mode 100644 index 000000000..44f1d5c08 --- /dev/null +++ b/core/node/dlog/zero.go @@ -0,0 +1,43 @@ +package dlog + +import ( + "reflect" +) + +func Nonzero(v reflect.Value) bool { + switch v.Kind() { + case reflect.Bool: + return v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() != 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() != 0 + case reflect.Float32, reflect.Float64: + return v.Float() != 0 + case reflect.Complex64, reflect.Complex128: + return v.Complex() != complex(0, 0) + case reflect.String: + return v.String() != "" + case reflect.Struct: + for i := 0; i < v.NumField(); i++ { + if Nonzero(getField(v, i)) { + return true + } + } + return false + case reflect.Array: + for i := 0; i < v.Len(); i++ { + if Nonzero(v.Index(i)) { + return true + } + } + return false + case reflect.Map, reflect.Interface, reflect.Slice, reflect.Ptr, reflect.Chan, reflect.Func: + return !v.IsNil() + case reflect.UnsafePointer: + return v.Pointer() != 0 + case reflect.Invalid: + return false + } + return true +} diff --git a/core/node/env/gamma-arch/config.yaml b/core/node/env/gamma-arch/config.yaml new file mode 100644 index 000000000..8026bdc80 --- /dev/null +++ b/core/node/env/gamma-arch/config.yaml @@ -0,0 +1,41 @@ +# For running server in archive mode ('archive' command) +port: 4040 +useHttps: false + +# Blockchain configuration +baseChain: + chainId: 84532 + networkUrl: 'https://nexus-rpc-worker-test-beta.towns.com/84532?key=NOT_SET' + blockTimeMs: 2000 +riverChain: + chainId: 6524490 + networkUrl: 'https://devnet.rpc.river.build' + blockTimeMs: 2000 + +# Base contracts +architectContract: + address: '0x968696BC59431Ef085441641f550C8e2Eaca8BEd' + +# River contracts +registryContract: + address: '0xf18E98D36A6bd1aDb52F776aCc191E69B491c070' + +log: + file: '' + level: info + console: true + noColor: false + format: text + +database: + url: postgres://postgres:postgres@localhost:5433/river?sslmode=disable&pool_max_conns=1000 + database: '' + user: '' + password: '' + port: '' + extra: '' + host: '' +storageType: postgres + +archive: + archiveId: 'ArchLocalGamma' diff --git a/core/node/env/gamma-arch/run.sh b/core/node/env/gamma-arch/run.sh new file mode 100755 index 000000000..345aa4d26 --- /dev/null +++ b/core/node/env/gamma-arch/run.sh @@ -0,0 +1,5 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +go run ../../node/main.go --config config.yaml $@ diff --git a/core/node/env/gamma/config.yaml b/core/node/env/gamma/config.yaml new file mode 100644 index 000000000..4766cf0c0 --- /dev/null +++ b/core/node/env/gamma/config.yaml @@ -0,0 +1,29 @@ +# For running server in info mode ('info' command) +port: 4040 +useHttps: false + +# Blockchain configuration +baseChain: + chainId: 84532 + networkUrl: 'https://nexus-rpc-worker-test-beta.towns.com/84532?key=NOT_SET' + blockTimeMs: 2000 +riverChain: + chainId: 6524490 + networkUrl: 'https://devnet.rpc.river.build' + blockTimeMs: 2000 + +# Base contracts +architectContract: + address: '0x968696BC59431Ef085441641f550C8e2Eaca8BEd' + +# River contracts +registryContract: + address: '0xf18E98D36A6bd1aDb52F776aCc191E69B491c070' + +# Disable logging +log: + file: '' + level: info + console: true + noColor: false + format: text diff --git a/core/node/env/gamma/run.sh b/core/node/env/gamma/run.sh new file mode 100755 index 000000000..345aa4d26 --- /dev/null +++ b/core/node/env/gamma/run.sh @@ -0,0 +1,5 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +go run ../../node/main.go --config config.yaml $@ diff --git a/core/node/events/events.go b/core/node/events/events.go new file mode 100644 index 000000000..b964a23a2 --- /dev/null +++ b/core/node/events/events.go @@ -0,0 +1,390 @@ +package events + +import ( + "crypto/rand" + "time" + + "google.golang.org/protobuf/proto" + + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/crypto" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/shared" +) + +func MakeStreamEvent( + wallet *crypto.Wallet, + payload IsStreamEvent_Payload, + prevMiniblockHash []byte, +) (*StreamEvent, error) { + salt := make([]byte, 32) + _, err := rand.Read(salt) + if err != nil { + return nil, AsRiverError(err, Err_INTERNAL). + Message("Failed to create random salt"). + Func("MakeStreamEvent") + } + epochMillis := time.Now().UnixNano() / int64(time.Millisecond) + + event := &StreamEvent{ + CreatorAddress: wallet.Address.Bytes(), + Salt: salt, + PrevMiniblockHash: prevMiniblockHash, + Payload: payload, + CreatedAtEpochMs: epochMillis, + } + + return event, nil +} + +func MakeDelegatedStreamEvent( + wallet *crypto.Wallet, + payload IsStreamEvent_Payload, + prevMiniblockHash []byte, + delegateSig []byte, +) (*StreamEvent, error) { + salt := make([]byte, 32) + _, err := rand.Read(salt) + if err != nil { + return nil, AsRiverError(err, Err_INTERNAL). + Message("Failed to create random salt"). + Func("MakeDelegatedStreamEvent") + } + epochMillis := time.Now().UnixNano() / int64(time.Millisecond) + + event := &StreamEvent{ + CreatorAddress: wallet.Address.Bytes(), + Salt: salt, + PrevMiniblockHash: prevMiniblockHash, + Payload: payload, + DelegateSig: delegateSig, + CreatedAtEpochMs: epochMillis, + } + + return event, nil +} + +func MakeEnvelopeWithEvent(wallet *crypto.Wallet, streamEvent *StreamEvent) (*Envelope, error) { + eventBytes, err := proto.Marshal(streamEvent) + if err != nil { + return nil, AsRiverError(err, Err_INTERNAL). + Message("Failed to serialize stream event to bytes"). + Func("MakeEnvelopeWithEvent") + } + + hash := crypto.RiverHash(eventBytes) + signature, err := wallet.SignHash(hash[:]) + if err != nil { + return nil, err + } + + return &Envelope{ + Event: eventBytes, + Signature: signature, + Hash: hash[:], + }, nil +} + +func MakeEnvelopeWithPayload( + wallet *crypto.Wallet, + payload IsStreamEvent_Payload, + prevMiniblockHash []byte, +) (*Envelope, error) { + streamEvent, err := MakeStreamEvent(wallet, payload, prevMiniblockHash) + if err != nil { + return nil, err + } + return MakeEnvelopeWithEvent(wallet, streamEvent) +} + +func MakeParsedEventWithPayload( + wallet *crypto.Wallet, + payload IsStreamEvent_Payload, + prevMiniblockHash []byte, +) (*ParsedEvent, error) { + streamEvent, err := MakeStreamEvent(wallet, payload, prevMiniblockHash) + if err != nil { + return nil, err + } + + envelope, err := MakeEnvelopeWithEvent(wallet, streamEvent) + if err != nil { + return nil, err + } + + prevMiniBlockHash := common.BytesToHash(prevMiniblockHash) + return &ParsedEvent{ + Event: streamEvent, + Envelope: envelope, + Hash: common.BytesToHash(envelope.Hash), + PrevMiniblockHash: &prevMiniBlockHash, + }, nil +} + +func Make_MemberPayload_Membership( + op MembershipOp, + userAddress []byte, + initiatorAddress []byte, + streamParentId []byte, +) *StreamEvent_MemberPayload { + return &StreamEvent_MemberPayload{ + MemberPayload: &MemberPayload{ + Content: &MemberPayload_Membership_{ + Membership: &MemberPayload_Membership{ + Op: op, + UserAddress: userAddress, + InitiatorAddress: initiatorAddress, + StreamParentId: streamParentId, + }, + }, + }, + } +} + +func Make_MemberPayload_Username(username *EncryptedData) *StreamEvent_MemberPayload { + return &StreamEvent_MemberPayload{ + MemberPayload: &MemberPayload{ + Content: &MemberPayload_Username{ + Username: username, + }, + }, + } +} + +func Make_MemberPayload_DisplayName(displayName *EncryptedData) *StreamEvent_MemberPayload { + return &StreamEvent_MemberPayload{ + MemberPayload: &MemberPayload{ + Content: &MemberPayload_DisplayName{ + DisplayName: displayName, + }, + }, + } +} + +func Make_ChannelPayload_Inception( + streamId StreamId, + spaceId StreamId, + channelProperties *EncryptedData, + settings *StreamSettings, +) *StreamEvent_ChannelPayload { + return &StreamEvent_ChannelPayload{ + ChannelPayload: &ChannelPayload{ + Content: &ChannelPayload_Inception_{ + Inception: &ChannelPayload_Inception{ + StreamId: streamId[:], + SpaceId: spaceId[:], + ChannelProperties: channelProperties, + Settings: settings, + }, + }, + }, + } +} + +// todo delete and replace with Make_MemberPayload_Membership +func Make_ChannelPayload_Membership( + op MembershipOp, + userId string, + initiatorId string, + spaceId *StreamId, +) *StreamEvent_MemberPayload { + userAddress, err := AddressFromUserId(userId) + if err != nil { + panic(err) // todo convert everything to StreamId + } + var initiatorAddress []byte + if initiatorId != "" { + initiatorAddress, err = AddressFromUserId(initiatorId) + if err != nil { + panic(err) // todo convert everything to common.Address + } + } + var spaceIdBytes []byte + if spaceId != nil { + spaceIdBytes = spaceId[:] + } else { + spaceIdBytes = nil + } + return Make_MemberPayload_Membership(op, userAddress, initiatorAddress, spaceIdBytes) +} + +func Make_ChannelPayload_Message(content string) *StreamEvent_ChannelPayload { + return &StreamEvent_ChannelPayload{ + ChannelPayload: &ChannelPayload{ + Content: &ChannelPayload_Message{ + Message: &EncryptedData{ + Ciphertext: content, + }, + }, + }, + } +} + +// todo delete and replace with Make_MemberPayload_Membership +func Make_DmChannelPayload_Membership(op MembershipOp, userId string, initiatorId string) *StreamEvent_MemberPayload { + userAddress, err := AddressFromUserId(userId) + if err != nil { + panic(err) // todo convert everything to StreamId + } + var initiatorAddress []byte + if initiatorId != "" { + initiatorAddress, err = AddressFromUserId(initiatorId) + if err != nil { + panic(err) // todo convert everything to common.Address + } + } + return Make_MemberPayload_Membership(op, userAddress, initiatorAddress, nil) +} + +// todo delete and replace with Make_MemberPayload_Membership +func Make_GdmChannelPayload_Membership(op MembershipOp, userId string, initiatorId string) *StreamEvent_MemberPayload { + userAddress, err := AddressFromUserId(userId) + if err != nil { + panic(err) // todo convert everything to StreamId + } + var initiatorAddress []byte + if initiatorId != "" { + initiatorAddress, err = AddressFromUserId(initiatorId) + if err != nil { + panic(err) // todo convert everything to common.Address + } + } + return Make_MemberPayload_Membership(op, userAddress, initiatorAddress, nil) +} + +func Make_SpacePayload_Inception(streamId StreamId, settings *StreamSettings) *StreamEvent_SpacePayload { + return &StreamEvent_SpacePayload{ + SpacePayload: &SpacePayload{ + Content: &SpacePayload_Inception_{ + Inception: &SpacePayload_Inception{ + StreamId: streamId[:], + Settings: settings, + }, + }, + }, + } +} + +// todo delete and replace with Make_MemberPayload_Membership +func Make_SpacePayload_Membership(op MembershipOp, userId string, initiatorId string) *StreamEvent_MemberPayload { + userAddress, err := AddressFromUserId(userId) + if err != nil { + panic(err) // todo convert everything to StreamId + } + var initiatorAddress []byte + if initiatorId != "" { + initiatorAddress, err = AddressFromUserId(initiatorId) + if err != nil { + panic(err) // todo convert everything to common.Address + } + } + return Make_MemberPayload_Membership(op, userAddress, initiatorAddress, nil) +} + +func Make_SpacePayload_Channel( + op ChannelOp, + channelId StreamId, + channelProperties *EncryptedData, + originEvent *EventRef, +) *StreamEvent_SpacePayload { + return &StreamEvent_SpacePayload{ + SpacePayload: &SpacePayload{ + Content: &SpacePayload_Channel_{ + Channel: &SpacePayload_Channel{ + Op: op, + ChannelId: channelId[:], + OriginEvent: originEvent, + ChannelProperties: channelProperties, + }, + }, + }, + } +} + +func Make_UserPayload_Inception(streamId StreamId, settings *StreamSettings) *StreamEvent_UserPayload { + return &StreamEvent_UserPayload{ + UserPayload: &UserPayload{ + Content: &UserPayload_Inception_{ + Inception: &UserPayload_Inception{ + StreamId: streamId[:], + Settings: settings, + }, + }, + }, + } +} + +func Make_UserDeviceKeyPayload_Inception( + streamId StreamId, + settings *StreamSettings, +) *StreamEvent_UserDeviceKeyPayload { + return &StreamEvent_UserDeviceKeyPayload{ + UserDeviceKeyPayload: &UserDeviceKeyPayload{ + Content: &UserDeviceKeyPayload_Inception_{ + Inception: &UserDeviceKeyPayload_Inception{ + StreamId: streamId[:], + Settings: settings, + }, + }, + }, + } +} + +func Make_UserPayload_Membership( + op MembershipOp, + streamId StreamId, + inInviter *string, + streamParentId []byte, +) *StreamEvent_UserPayload { + var inviter []byte + if inInviter != nil { + var err error + inviter, err = AddressFromUserId(*inInviter) + if err != nil { + panic(err) // todo convert everything to StreamId + } + } + + return &StreamEvent_UserPayload{ + UserPayload: &UserPayload{ + Content: &UserPayload_UserMembership_{ + UserMembership: &UserPayload_UserMembership{ + StreamId: streamId[:], + Op: op, + Inviter: inviter, + StreamParentId: streamParentId, + }, + }, + }, + } +} + +func Make_UserSettingsPayload_Inception(streamId StreamId, settings *StreamSettings) *StreamEvent_UserSettingsPayload { + return &StreamEvent_UserSettingsPayload{ + UserSettingsPayload: &UserSettingsPayload{ + Content: &UserSettingsPayload_Inception_{ + Inception: &UserSettingsPayload_Inception{ + StreamId: streamId[:], + Settings: settings, + }, + }, + }, + } +} + +func Make_UserSettingsPayload_UserBlock(userBlock *UserSettingsPayload_UserBlock) *StreamEvent_UserSettingsPayload { + return &StreamEvent_UserSettingsPayload{ + UserSettingsPayload: &UserSettingsPayload{ + Content: &UserSettingsPayload_UserBlock_{ + UserBlock: userBlock, + }, + }, + } +} + +func Make_MiniblockHeader(miniblockHeader *MiniblockHeader) *StreamEvent_MiniblockHeader { + return &StreamEvent_MiniblockHeader{ + MiniblockHeader: miniblockHeader, + } +} diff --git a/core/node/events/format.go b/core/node/events/format.go new file mode 100644 index 000000000..59d55130f --- /dev/null +++ b/core/node/events/format.go @@ -0,0 +1,24 @@ +package events + +import ( + "strings" + + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/base" +) + +func FormatEventShort(e *ParsedEvent) string { + var sb strings.Builder + sb.Grow(100) + FormatHashFromBytesToSB(&sb, e.Hash.Bytes()) + sb.WriteByte(' ') + FormatHashFromBytesToSB(&sb, e.Event.PrevMiniblockHash) + return sb.String() +} + +func FormatHashShort(hash common.Hash) string { + var sb strings.Builder + sb.Grow(100) + FormatHashFromBytesToSB(&sb, hash[:]) + return sb.String() +} diff --git a/core/node/events/migrations/migrate_snapshot.go b/core/node/events/migrations/migrate_snapshot.go new file mode 100644 index 000000000..3b1a9a488 --- /dev/null +++ b/core/node/events/migrations/migrate_snapshot.go @@ -0,0 +1,29 @@ +package migrations + +import ( + . "github.com/river-build/river/core/node/protocol" +) + +type migrationFunc func(*Snapshot) *Snapshot + +// should be kept in sync with core/sdk/src/migrations/migrate_snapshot.ts +var MIGRATIONS = []migrationFunc{ + snapshot_migration_0000, + snapshot_migration_0001, +} + +func CurrentSnapshotVersion() int32 { + return int32(len(MIGRATIONS)) +} + +func MigrateSnapshot(iSnapshot *Snapshot) *Snapshot { + currentVersion := CurrentSnapshotVersion() + if iSnapshot.SnapshotVersion >= currentVersion { + return iSnapshot + } + for i := iSnapshot.SnapshotVersion; i < currentVersion; i++ { + iSnapshot = MIGRATIONS[i](iSnapshot) + } + iSnapshot.SnapshotVersion = currentVersion + return iSnapshot +} diff --git a/core/node/events/migrations/snapshot_migration_0000.go b/core/node/events/migrations/snapshot_migration_0000.go new file mode 100644 index 000000000..b4bc3232e --- /dev/null +++ b/core/node/events/migrations/snapshot_migration_0000.go @@ -0,0 +1,10 @@ +package migrations + +import ( + . "github.com/river-build/river/core/node/protocol" +) + +// a no-op migration for the initial snapshot, use as a template for new migrations +func snapshot_migration_0000(iSnapshot *Snapshot) *Snapshot { + return iSnapshot +} diff --git a/core/node/events/migrations/snapshot_migration_0000_test.go b/core/node/events/migrations/snapshot_migration_0000_test.go new file mode 100644 index 000000000..3beba22ee --- /dev/null +++ b/core/node/events/migrations/snapshot_migration_0000_test.go @@ -0,0 +1,18 @@ +package migrations + +import ( + "testing" + + . "github.com/river-build/river/core/node/protocol" + "github.com/stretchr/testify/require" +) + +// a no-op migration test for the initial snapshot, use as a template for new migrations +func TestSnapshotMigration0000(t *testing.T) { + // a no-op migration for the initial snapshot + snapshot := &Snapshot{} + // just pass an empty snapshot + migratedSnapshot := snapshot_migration_0000(snapshot) + // expect that a valid snapshot is returned + require.NotNil(t, migratedSnapshot) +} diff --git a/core/node/events/migrations/snapshot_migration_0001.go b/core/node/events/migrations/snapshot_migration_0001.go new file mode 100644 index 000000000..0b9d31af8 --- /dev/null +++ b/core/node/events/migrations/snapshot_migration_0001.go @@ -0,0 +1,56 @@ +package migrations + +import ( + "bytes" + "slices" + + . "github.com/river-build/river/core/node/protocol" +) + +// nasty bug with the insert_sorted function, it was inserting an extra element at the end +// every insert, we need to remove duplicates +func snapshot_migration_0001(iSnapshot *Snapshot) *Snapshot { + // gotta fix everywhere we used insertSorted, keep the first instance + + if iSnapshot.Members != nil { + iSnapshot.Members.Joined = slices.CompactFunc( + iSnapshot.Members.Joined, + func(i, j *MemberPayload_Snapshot_Member) bool { + return bytes.Equal(i.UserAddress, j.UserAddress) + }, + ) + } + + switch snapshot := iSnapshot.Content.(type) { + case *Snapshot_SpaceContent: + if snapshot.SpaceContent != nil { + snapshot.SpaceContent.Channels = slices.CompactFunc( + snapshot.SpaceContent.Channels, + func(i, j *SpacePayload_Channel) bool { + return bytes.Equal(i.ChannelId, j.ChannelId) + }, + ) + } + case *Snapshot_UserContent: + if snapshot.UserContent != nil { + snapshot.UserContent.Memberships = slices.CompactFunc( + snapshot.UserContent.Memberships, + func(i, j *UserPayload_UserMembership) bool { + return bytes.Equal(i.StreamId, j.StreamId) + }, + ) + } + + case *Snapshot_UserSettingsContent: + if snapshot.UserSettingsContent != nil { + snapshot.UserSettingsContent.FullyReadMarkers = slices.CompactFunc( + snapshot.UserSettingsContent.FullyReadMarkers, + func(i, j *UserSettingsPayload_FullyReadMarkers) bool { + return bytes.Equal(i.StreamId, j.StreamId) + }, + ) + } + } + + return iSnapshot +} diff --git a/core/node/events/migrations/snapshot_migration_0001_test.go b/core/node/events/migrations/snapshot_migration_0001_test.go new file mode 100644 index 000000000..a1bde0eac --- /dev/null +++ b/core/node/events/migrations/snapshot_migration_0001_test.go @@ -0,0 +1,93 @@ +package migrations + +import ( + "testing" + + "github.com/river-build/river/core/node/base/test" + "github.com/river-build/river/core/node/crypto" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/testutils" + "github.com/stretchr/testify/require" +) + +// nasty bug with the insert_sorted function, it was inserting an extra element at the end +// every insert, we need to remove duplicates + +func TestSnapshotMigration0001(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + userWallet, _ := crypto.NewWallet(ctx) + spaceId := testutils.FakeStreamId(0x10) // events.STREAM_SPACE_BIN + channelId := testutils.MakeChannelId(spaceId) + + // snaps have multiple member instances + badMemberSnap := &Snapshot{ + Members: &MemberPayload_Snapshot{ + Joined: []*MemberPayload_Snapshot_Member{ + { + UserAddress: userWallet.Address[:], + }, + { + UserAddress: userWallet.Address[:], + }, + }, + }, + } + // migrate + migratedSnapshot := snapshot_migration_0001(badMemberSnap) + require.Equal(t, 1, len(migratedSnapshot.Members.Joined)) + + // space channel payloads + badSpaceChannel := &Snapshot{ + Content: &Snapshot_SpaceContent{ + SpaceContent: &SpacePayload_Snapshot{ + Channels: []*SpacePayload_Channel{ + { + ChannelId: channelId[:], + }, + { + ChannelId: channelId[:], + }, + }, + }, + }, + } + migratedSnapshot = snapshot_migration_0001(badSpaceChannel) + require.Equal(t, 1, len(migratedSnapshot.GetSpaceContent().Channels)) + + // user payload user membership + badUserPayload := &Snapshot{ + Content: &Snapshot_UserContent{ + UserContent: &UserPayload_Snapshot{ + Memberships: []*UserPayload_UserMembership{ + { + StreamId: spaceId[:], + }, + { + StreamId: spaceId[:], + }, + }, + }, + }, + } + migratedSnapshot = snapshot_migration_0001(badUserPayload) + require.Equal(t, 1, len(migratedSnapshot.GetUserContent().Memberships)) + + // user settings fully read markers + badUserSettings := &Snapshot{ + Content: &Snapshot_UserSettingsContent{ + UserSettingsContent: &UserSettingsPayload_Snapshot{ + FullyReadMarkers: []*UserSettingsPayload_FullyReadMarkers{ + { + StreamId: channelId[:], + }, + { + StreamId: channelId[:], + }, + }, + }, + }, + } + migratedSnapshot = snapshot_migration_0001(badUserSettings) + require.Equal(t, 1, len(migratedSnapshot.GetUserSettingsContent().FullyReadMarkers)) +} diff --git a/core/node/events/miniblock.go b/core/node/events/miniblock.go new file mode 100644 index 000000000..042f20a56 --- /dev/null +++ b/core/node/events/miniblock.go @@ -0,0 +1,223 @@ +package events + +import ( + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/crypto" + . "github.com/river-build/river/core/node/protocol" + + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/emptypb" + "google.golang.org/protobuf/types/known/timestamppb" +) + +func Make_GenesisMiniblockHeader(parsedEvents []*ParsedEvent) (*MiniblockHeader, error) { + if len(parsedEvents) <= 0 { + return nil, RiverError(Err_STREAM_EMPTY, "no events to make genisis miniblock header") + } + if parsedEvents[0].Event.GetInceptionPayload() == nil { + return nil, RiverError(Err_STREAM_NO_INCEPTION_EVENT, "first event must be inception event") + } + for _, event := range parsedEvents[1:] { + if event.Event.GetInceptionPayload() != nil { + return nil, RiverError(Err_BAD_EVENT, "inception event can only be first event") + } + if event.Event.GetMiniblockHeader() != nil { + return nil, RiverError(Err_BAD_EVENT, "block header can't be a block event") + } + } + + snapshot, err := Make_GenisisSnapshot(parsedEvents) + if err != nil { + return nil, err + } + + eventHashes := make([][]byte, len(parsedEvents)) + for i, event := range parsedEvents { + eventHashes[i] = event.Hash.Bytes() + } + + return &MiniblockHeader{ + MiniblockNum: 0, + Timestamp: NextMiniblockTimestamp(nil), + EventHashes: eventHashes, + Snapshot: snapshot, + Content: &MiniblockHeader_None{ + None: &emptypb.Empty{}, + }, + }, nil +} + +func MakeGenesisMiniblock(wallet *crypto.Wallet, genesisMiniblockEvents []*ParsedEvent) (*Miniblock, error) { + header, err := Make_GenesisMiniblockHeader(genesisMiniblockEvents) + if err != nil { + return nil, err + } + + headerEnvelope, err := MakeEnvelopeWithPayload( + wallet, + Make_MiniblockHeader(header), + nil, + ) + if err != nil { + return nil, err + } + + envelopes := make([]*Envelope, len(genesisMiniblockEvents)) + for i, e := range genesisMiniblockEvents { + envelopes[i] = e.Envelope + } + + return &Miniblock{ + Events: envelopes, + Header: headerEnvelope, + }, nil +} + +func NextMiniblockTimestamp(prevBlockTimestamp *timestamppb.Timestamp) *timestamppb.Timestamp { + now := timestamppb.Now() + + if prevBlockTimestamp != nil { + if now.Seconds < prevBlockTimestamp.Seconds || + (now.Seconds == prevBlockTimestamp.Seconds && now.Nanos <= prevBlockTimestamp.Nanos) { + now.Seconds = prevBlockTimestamp.Seconds + 1 + now.Nanos = 0 + } + } + + return now +} + +type MiniblockInfo struct { + Hash common.Hash + Num int64 + headerEvent *ParsedEvent + events []*ParsedEvent + Proto *Miniblock +} + +func (b *MiniblockInfo) header() *MiniblockHeader { + return b.headerEvent.Event.GetMiniblockHeader() +} + +func (b *MiniblockInfo) lastEvent() *ParsedEvent { + if len(b.events) > 0 { + return b.events[len(b.events)-1] + } else { + return nil + } +} + +func (b *MiniblockInfo) forEachEvent(op func(e *ParsedEvent) (bool, error)) error { + for _, event := range b.events { + c, err := op(event) + if !c { + return err + } + } + c, err := op(b.headerEvent) + if !c { + return err + } + return nil +} + +func NewMiniblockInfoFromBytes(bytes []byte, expectedBlockNumber int64) (*MiniblockInfo, error) { + var pb Miniblock + err := proto.Unmarshal(bytes, &pb) + if err != nil { + return nil, AsRiverError(err, Err_INVALID_ARGUMENT). + Message("Failed to decode miniblock from bytes"). + Func("NewMiniblockInfoFromBytes") + } + + return NewMiniblockInfoFromProto(&pb, NewMiniblockInfoFromProtoOpts{ExpectedBlockNumber: expectedBlockNumber}) +} + +func NewMiniblockInfoFromBytesWithOpts(bytes []byte, opts NewMiniblockInfoFromProtoOpts) (*MiniblockInfo, error) { + var pb Miniblock + err := proto.Unmarshal(bytes, &pb) + if err != nil { + return nil, AsRiverError(err, Err_INVALID_ARGUMENT). + Message("Failed to decode miniblock from bytes"). + Func("NewMiniblockInfoFromBytes") + } + + return NewMiniblockInfoFromProto(&pb, opts) +} + +type NewMiniblockInfoFromProtoOpts struct { + ExpectedBlockNumber int64 + DontParseEvents bool +} + +func NewMiniblockInfoFromProto(pb *Miniblock, opts NewMiniblockInfoFromProtoOpts) (*MiniblockInfo, error) { + headerEvent, err := ParseEvent(pb.Header) + if err != nil { + return nil, err + } + + blockHeader := headerEvent.Event.GetMiniblockHeader() + if blockHeader == nil { + return nil, RiverError(Err_BAD_EVENT, "header event must be a block header") + } + if opts.ExpectedBlockNumber >= 0 && blockHeader.MiniblockNum != int64(opts.ExpectedBlockNumber) { + return nil, RiverError( + Err_BAD_EVENT, + "expected", + opts.ExpectedBlockNumber, + "actual", + blockHeader.MiniblockNum, + ) + } + + var events []*ParsedEvent + if !opts.DontParseEvents { + events, err = ParseEvents(pb.Events) + if err != nil { + return nil, err + } + } + + // TODO: add header validation, num of events, prev block hash, block num, etc + + return &MiniblockInfo{ + Hash: headerEvent.Hash, + Num: blockHeader.MiniblockNum, + headerEvent: headerEvent, + events: events, + Proto: pb, + }, nil +} + +func NewMiniblockInfoFromParsed(headerEvent *ParsedEvent, events []*ParsedEvent) (*MiniblockInfo, error) { + if headerEvent.Event.GetMiniblockHeader() == nil { + return nil, RiverError(Err_BAD_EVENT, "header event must be a block header") + } + + envelopes := make([]*Envelope, len(events)) + for i, e := range events { + envelopes[i] = e.Envelope + } + + return &MiniblockInfo{ + Hash: headerEvent.Hash, + Num: headerEvent.Event.GetMiniblockHeader().MiniblockNum, + headerEvent: headerEvent, + events: events, + Proto: &Miniblock{ + Header: headerEvent.Envelope, + Events: envelopes, + }, + }, nil +} + +func (b *MiniblockInfo) ToBytes() ([]byte, error) { + serialized, err := proto.Marshal(b.Proto) + if err == nil { + return serialized, nil + } + return nil, AsRiverError(err, Err_INTERNAL). + Message("Failed to serialize miniblockinfo to bytes"). + Func("ToBytes") +} diff --git a/core/node/events/minipool.go b/core/node/events/minipool.go new file mode 100644 index 000000000..ec6e71704 --- /dev/null +++ b/core/node/events/minipool.go @@ -0,0 +1,51 @@ +package events + +import ( + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/utils" +) + +type eventMap = *OrderedMap[common.Hash, *ParsedEvent] + +type minipoolInstance struct { + events eventMap + generation int64 +} + +func newMiniPoolInstance(events eventMap, generation int64) *minipoolInstance { + return &minipoolInstance{ + events: events, + generation: generation, + } +} + +func (m *minipoolInstance) copyAndAddEvent(event *ParsedEvent) *minipoolInstance { + m = &minipoolInstance{ + events: m.events.Copy(1), + generation: m.generation, + } + m.events.Set(event.Hash, event) + return m +} + +func (m *minipoolInstance) forEachEvent(op func(e *ParsedEvent) (bool, error)) error { + for _, e := range m.events.Values { + cont, err := op(e) + if !cont { + return err + } + } + return nil +} + +func (m *minipoolInstance) lastEvent() *ParsedEvent { + if len(m.events.Values) > 0 { + return m.events.Values[len(m.events.Values)-1] + } else { + return nil + } +} + +func (m *minipoolInstance) nextSlotNumber() int { + return m.events.Len() +} diff --git a/core/node/events/parsed_event.go b/core/node/events/parsed_event.go new file mode 100644 index 000000000..1d925fe86 --- /dev/null +++ b/core/node/events/parsed_event.go @@ -0,0 +1,147 @@ +package events + +import ( + "bytes" + "strings" + + "github.com/ethereum/go-ethereum/common" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/proto" + + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/crypto" + . "github.com/river-build/river/core/node/protocol" +) + +type ParsedEvent struct { + Event *StreamEvent + Envelope *Envelope + Hash common.Hash + PrevMiniblockHash *common.Hash `dlog:"omit"` + SignerPubKey []byte + shortDebugStr string +} + +func (e *ParsedEvent) GetEnvelopeBytes() ([]byte, error) { + b, err := proto.Marshal(e.Envelope) + if err == nil { + return b, nil + } + return nil, AsRiverError(err, Err_INTERNAL). + Message("Failed to marshal parsed event envelope to bytes"). + Func("GetEnvelopeBytes") +} + +func ParseEvent(envelope *Envelope) (*ParsedEvent, error) { + hash := RiverHash(envelope.Event) + if !bytes.Equal(hash[:], envelope.Hash) { + return nil, RiverError(Err_BAD_EVENT_HASH, "Bad hash provided", "computed", hash, "got", envelope.Hash) + } + + signerPubKey, err := RecoverSignerPublicKey(hash[:], envelope.Signature) + if err != nil { + return nil, err + } + + var streamEvent StreamEvent + err = proto.Unmarshal(envelope.Event, &streamEvent) + if err != nil { + return nil, AsRiverError(err, Err_INVALID_ARGUMENT). + Message("Failed to decode stream event from bytes"). + Func("ParseEvent") + } + + if len(streamEvent.DelegateSig) > 0 { + + err := CheckDelegateSig( + streamEvent.CreatorAddress, + signerPubKey, + streamEvent.DelegateSig, + streamEvent.DelegateExpiryEpochMs, + ) + if err != nil { + return nil, WrapRiverError( + Err_BAD_EVENT_SIGNATURE, + err, + ).Message("Bad signature"). + Func("ParseEvent") + } + } else { + address := PublicKeyToAddress(signerPubKey) + if !bytes.Equal(address.Bytes(), streamEvent.CreatorAddress) { + return nil, RiverError(Err_BAD_EVENT_SIGNATURE, "Bad signature provided", "computed address", address, "event creatorAddress", streamEvent.CreatorAddress) + } + } + + PrevMiniblockHash := common.BytesToHash(streamEvent.PrevMiniblockHash) + return &ParsedEvent{ + Event: &streamEvent, + Envelope: envelope, + Hash: common.BytesToHash(envelope.Hash), + PrevMiniblockHash: &PrevMiniblockHash, + SignerPubKey: signerPubKey, + }, nil +} + +func (e *ParsedEvent) ShortDebugStr() string { + if e == nil { + return "nil" + } + if (e.shortDebugStr) != "" { + return e.shortDebugStr + } + + e.shortDebugStr = FormatEventShort(e) + return e.shortDebugStr +} + +func FormatEventToJsonSB(sb *strings.Builder, event *ParsedEvent) { + sb.WriteString(protojson.Format(event.Event)) +} + +// TODO(HNT-1381): needs to be refactored +func FormatEventsToJson(events []*Envelope) string { + sb := strings.Builder{} + sb.WriteString("[") + for idx, event := range events { + parsedEvent, err := ParseEvent(event) + if err == nil { + sb.WriteString("{ \"envelope\": ") + + sb.WriteString(protojson.Format(parsedEvent.Envelope)) + sb.WriteString(", \"event\": ") + sb.WriteString(protojson.Format(parsedEvent.Event)) + sb.WriteString(" }") + } else { + sb.WriteString("{ \"error\": \"" + err.Error() + "\" }") + } + if idx < len(events)-1 { + sb.WriteString(",") + } + } + sb.WriteString("]") + return sb.String() +} + +func ParseEvents(events []*Envelope) ([]*ParsedEvent, error) { + parsedEvents := make([]*ParsedEvent, len(events)) + for i, event := range events { + parsedEvent, err := ParseEvent(event) + if err != nil { + return nil, err + } + parsedEvents[i] = parsedEvent + } + return parsedEvents, nil +} + +func (e *ParsedEvent) GetChannelMessage() *ChannelPayload_Message { + switch payload := e.Event.Payload.(type) { + case *StreamEvent_ChannelPayload: + switch cp := payload.ChannelPayload.Content.(type) { + case *ChannelPayload_Message: + return cp + } + } + return nil +} diff --git a/core/node/events/snapshot.go b/core/node/events/snapshot.go new file mode 100644 index 000000000..b1147b928 --- /dev/null +++ b/core/node/events/snapshot.go @@ -0,0 +1,718 @@ +package events + +import ( + "bytes" + "slices" + "sort" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/events/migrations" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/shared" +) + +func Make_GenisisSnapshot(events []*ParsedEvent) (*Snapshot, error) { + if len(events) == 0 { + return nil, RiverError(Err_INVALID_ARGUMENT, "no events to make snapshot from") + } + + creatorAddress := events[0].Event.CreatorAddress + + inceptionPayload := events[0].Event.GetInceptionPayload() + + if inceptionPayload == nil { + return nil, RiverError(Err_INVALID_ARGUMENT, "inceptionEvent is not an inception event") + } + + content, err := make_SnapshotContent(inceptionPayload) + if err != nil { + return nil, err + } + + members, err := make_SnapshotMembers(inceptionPayload, creatorAddress) + if err != nil { + return nil, err + } + + snapshot := &Snapshot{ + Content: content, + Members: members, + SnapshotVersion: migrations.CurrentSnapshotVersion(), + } + + for i, event := range events[1:] { + // start at index 1 to account for inception event + err = Update_Snapshot(snapshot, event, 0, int64(1+i)) + if err != nil { + return nil, err + } + } + + return snapshot, nil +} + +func make_SnapshotContent(iInception IsInceptionPayload) (IsSnapshot_Content, error) { + if iInception == nil { + return nil, RiverError(Err_INVALID_ARGUMENT, "inceptionEvent is not an inception event") + } + + switch inception := iInception.(type) { + case *SpacePayload_Inception: + return &Snapshot_SpaceContent{ + SpaceContent: &SpacePayload_Snapshot{ + Inception: inception, + }, + }, nil + case *ChannelPayload_Inception: + return &Snapshot_ChannelContent{ + ChannelContent: &ChannelPayload_Snapshot{ + Inception: inception, + }, + }, nil + case *DmChannelPayload_Inception: + return &Snapshot_DmChannelContent{ + DmChannelContent: &DmChannelPayload_Snapshot{ + Inception: inception, + }, + }, nil + case *GdmChannelPayload_Inception: + return &Snapshot_GdmChannelContent{ + GdmChannelContent: &GdmChannelPayload_Snapshot{ + Inception: inception, + }, + }, nil + case *UserPayload_Inception: + return &Snapshot_UserContent{ + UserContent: &UserPayload_Snapshot{ + Inception: inception, + }, + }, nil + case *UserSettingsPayload_Inception: + return &Snapshot_UserSettingsContent{ + UserSettingsContent: &UserSettingsPayload_Snapshot{ + Inception: inception, + }, + }, nil + case *UserInboxPayload_Inception: + return &Snapshot_UserInboxContent{ + UserInboxContent: &UserInboxPayload_Snapshot{ + Inception: inception, + }, + }, nil + case *UserDeviceKeyPayload_Inception: + return &Snapshot_UserDeviceKeyContent{ + UserDeviceKeyContent: &UserDeviceKeyPayload_Snapshot{ + Inception: inception, + }, + }, nil + case *MediaPayload_Inception: + return &Snapshot_MediaContent{ + MediaContent: &MediaPayload_Snapshot{ + Inception: inception, + }, + }, nil + default: + return nil, RiverError(Err_INVALID_ARGUMENT, "unknown inception type %T", iInception) + } +} + +func make_SnapshotMembers(iInception IsInceptionPayload, creatorAddress []byte) (*MemberPayload_Snapshot, error) { + if iInception == nil { + return nil, RiverError(Err_INVALID_ARGUMENT, "inceptionEvent is not an inception event") + } + + switch inception := iInception.(type) { + case *UserPayload_Inception, *UserSettingsPayload_Inception, *UserInboxPayload_Inception, *UserDeviceKeyPayload_Inception: + // for all user streams, get the address from the stream id + userAddress, err := shared.GetUserAddressFromStreamIdBytes(iInception.GetStreamId()) + if err != nil { + return nil, err + } + return &MemberPayload_Snapshot{ + Joined: insertMember(nil, &MemberPayload_Snapshot_Member{ + UserAddress: userAddress.Bytes(), + }), + }, nil + case *DmChannelPayload_Inception: + return &MemberPayload_Snapshot{ + Joined: insertMember(nil, &MemberPayload_Snapshot_Member{ + UserAddress: inception.FirstPartyAddress, + }, &MemberPayload_Snapshot_Member{ + UserAddress: inception.SecondPartyAddress, + }), + }, nil + case *MediaPayload_Inception: + return &MemberPayload_Snapshot{ + Joined: insertMember(nil, &MemberPayload_Snapshot_Member{ + UserAddress: creatorAddress, + }), + }, nil + default: + return &MemberPayload_Snapshot{}, nil + } +} + +// mutate snapshot with content of event if applicable +func Update_Snapshot(iSnapshot *Snapshot, event *ParsedEvent, miniblockNum int64, eventNum int64) error { + iSnapshot = migrations.MigrateSnapshot(iSnapshot) + switch payload := event.Event.Payload.(type) { + case *StreamEvent_SpacePayload: + return update_Snapshot_Space(iSnapshot, payload.SpacePayload, eventNum, event.Hash.Bytes()) + case *StreamEvent_ChannelPayload: + return update_Snapshot_Channel(iSnapshot, payload.ChannelPayload) + case *StreamEvent_DmChannelPayload: + return update_Snapshot_DmChannel(iSnapshot, payload.DmChannelPayload, miniblockNum, event.Hash.Bytes()) + case *StreamEvent_GdmChannelPayload: + return update_Snapshot_GdmChannel(iSnapshot, payload.GdmChannelPayload, miniblockNum, event.Hash.Bytes()) + case *StreamEvent_UserPayload: + return update_Snapshot_User(iSnapshot, payload.UserPayload) + case *StreamEvent_UserSettingsPayload: + return update_Snapshot_UserSettings(iSnapshot, payload.UserSettingsPayload) + case *StreamEvent_UserDeviceKeyPayload: + return update_Snapshot_UserDeviceKey(iSnapshot, payload.UserDeviceKeyPayload) + case *StreamEvent_UserInboxPayload: + return update_Snapshot_UserInbox(iSnapshot, payload.UserInboxPayload, miniblockNum) + case *StreamEvent_MemberPayload: + return update_Snapshot_Member(iSnapshot, payload.MemberPayload, event.Event.CreatorAddress, miniblockNum, eventNum, event.Hash.Bytes()) + case *StreamEvent_MediaPayload: + return RiverError(Err_BAD_PAYLOAD, "Media payload snapshots are not supported") + default: + return RiverError(Err_INVALID_ARGUMENT, "unknown payload type %T", event.Event.Payload) + } +} + +func update_Snapshot_Space(iSnapshot *Snapshot, spacePayload *SpacePayload, eventNum int64, eventHash []byte) error { + snapshot := iSnapshot.Content.(*Snapshot_SpaceContent) + if snapshot == nil { + return RiverError(Err_INVALID_ARGUMENT, "blockheader snapshot is not a space snapshot") + } + switch content := spacePayload.Content.(type) { + case *SpacePayload_Inception_: + return RiverError(Err_INVALID_ARGUMENT, "cannot update blockheader with inception event") + case *SpacePayload_Channel_: + snapshot.SpaceContent.Channels = insertChannel(snapshot.SpaceContent.Channels, content.Channel) + return nil + default: + return RiverError(Err_INVALID_ARGUMENT, "unknown space payload type %T", spacePayload.Content) + } +} + +func update_Snapshot_Channel(iSnapshot *Snapshot, channelPayload *ChannelPayload) error { + snapshot := iSnapshot.Content.(*Snapshot_ChannelContent) + if snapshot == nil { + return RiverError(Err_INVALID_ARGUMENT, "blockheader snapshot is not a channel snapshot") + } + + switch content := channelPayload.Content.(type) { + case *ChannelPayload_Inception_: + return RiverError(Err_INVALID_ARGUMENT, "cannot update blockheader with inception event") + case *ChannelPayload_Message: + return nil + default: + return RiverError(Err_INVALID_ARGUMENT, "unknown channel payload type %T", content) + } +} + +func update_Snapshot_DmChannel( + iSnapshot *Snapshot, + dmChannelPayload *DmChannelPayload, + eventNum int64, + eventHash []byte, +) error { + snapshot := iSnapshot.Content.(*Snapshot_DmChannelContent) + if snapshot == nil { + return RiverError(Err_INVALID_ARGUMENT, "blockheader snapshot is not a dm channel snapshot") + } + switch content := dmChannelPayload.Content.(type) { + case *DmChannelPayload_Inception_: + return RiverError(Err_INVALID_ARGUMENT, "cannot update blockheader with inception event") + case *DmChannelPayload_Message: + return nil + default: + return RiverError(Err_INVALID_ARGUMENT, "unknown dm channel payload type %T", content) + } +} + +func update_Snapshot_GdmChannel( + iSnapshot *Snapshot, + channelPayload *GdmChannelPayload, + eventNum int64, + eventHash []byte, +) error { + snapshot := iSnapshot.Content.(*Snapshot_GdmChannelContent) + if snapshot == nil { + return RiverError(Err_INVALID_ARGUMENT, "blockheader snapshot is not a channel snapshot") + } + + switch content := channelPayload.Content.(type) { + case *GdmChannelPayload_Inception_: + return RiverError(Err_INVALID_ARGUMENT, "cannot update blockheader with inception event") + case *GdmChannelPayload_ChannelProperties: + snapshot.GdmChannelContent.ChannelProperties = &WrappedEncryptedData{Data: content.ChannelProperties, EventNum: eventNum, EventHash: eventHash} + return nil + case *GdmChannelPayload_Message: + return nil + default: + return RiverError(Err_INVALID_ARGUMENT, "unknown channel payload type %T", channelPayload.Content) + } +} + +func update_Snapshot_User(iSnapshot *Snapshot, userPayload *UserPayload) error { + snapshot := iSnapshot.Content.(*Snapshot_UserContent) + if snapshot == nil { + return RiverError(Err_INVALID_ARGUMENT, "blockheader snapshot is not a user snapshot") + } + switch content := userPayload.Content.(type) { + case *UserPayload_Inception_: + return RiverError(Err_INVALID_ARGUMENT, "cannot update blockheader with inception event") + case *UserPayload_UserMembership_: + snapshot.UserContent.Memberships = insertUserMembership(snapshot.UserContent.Memberships, content.UserMembership) + return nil + case *UserPayload_UserMembershipAction_: + return nil + default: + return RiverError(Err_INVALID_ARGUMENT, "unknown user payload type %T", userPayload.Content) + } +} + +func update_Snapshot_UserSettings(iSnapshot *Snapshot, userSettingsPayload *UserSettingsPayload) error { + snapshot := iSnapshot.Content.(*Snapshot_UserSettingsContent) + if snapshot == nil { + return RiverError(Err_INVALID_ARGUMENT, "blockheader snapshot is not a user settings snapshot") + } + switch content := userSettingsPayload.Content.(type) { + case *UserSettingsPayload_Inception_: + return RiverError(Err_INVALID_ARGUMENT, "cannot update blockheader with inception event") + case *UserSettingsPayload_FullyReadMarkers_: + snapshot.UserSettingsContent.FullyReadMarkers = insertFullyReadMarker(snapshot.UserSettingsContent.FullyReadMarkers, content.FullyReadMarkers) + return nil + case *UserSettingsPayload_UserBlock_: + snapshot.UserSettingsContent.UserBlocksList = insertUserBlock(snapshot.UserSettingsContent.UserBlocksList, content.UserBlock) + return nil + default: + return RiverError(Err_INVALID_ARGUMENT, "unknown user settings payload type %T", userSettingsPayload.Content) + } +} + +func update_Snapshot_UserDeviceKey(iSnapshot *Snapshot, userDeviceKeyPayload *UserDeviceKeyPayload) error { + snapshot := iSnapshot.Content.(*Snapshot_UserDeviceKeyContent) + if snapshot == nil { + return RiverError(Err_INVALID_ARGUMENT, "blockheader snapshot is not a user device key snapshot") + } + switch content := userDeviceKeyPayload.Content.(type) { + case *UserDeviceKeyPayload_Inception_: + return RiverError(Err_INVALID_ARGUMENT, "cannot update blockheader with inception event") + case *UserDeviceKeyPayload_EncryptionDevice_: + if snapshot.UserDeviceKeyContent.EncryptionDevices == nil { + snapshot.UserDeviceKeyContent.EncryptionDevices = make([]*UserDeviceKeyPayload_EncryptionDevice, 0) + } + // filter out the key if it already exists + i := 0 + for _, key := range snapshot.UserDeviceKeyContent.EncryptionDevices { + if key.DeviceKey != content.EncryptionDevice.DeviceKey { + snapshot.UserDeviceKeyContent.EncryptionDevices[i] = key + i++ + } + } + if i == len(snapshot.UserDeviceKeyContent.EncryptionDevices)-1 { + // just an inplace sort operation + snapshot.UserDeviceKeyContent.EncryptionDevices[i] = content.EncryptionDevice + } else { + // truncate and stick the new key on the end + MAX_DEVICES := 10 + startIndex := max(0, i-MAX_DEVICES) + snapshot.UserDeviceKeyContent.EncryptionDevices = append(snapshot.UserDeviceKeyContent.EncryptionDevices[startIndex:i], content.EncryptionDevice) + } + return nil + default: + return RiverError(Err_INVALID_ARGUMENT, "unknown user device key payload type %T", userDeviceKeyPayload.Content) + } +} + +func update_Snapshot_UserInbox( + iSnapshot *Snapshot, + userInboxPayload *UserInboxPayload, + miniblockNum int64, +) error { + snapshot := iSnapshot.Content.(*Snapshot_UserInboxContent) + if snapshot == nil { + return RiverError(Err_INVALID_ARGUMENT, "blockheader snapshot is not a user to device snapshot") + } + switch content := userInboxPayload.Content.(type) { + case *UserInboxPayload_Inception_: + return RiverError(Err_INVALID_ARGUMENT, "cannot update blockheader with inception event") + case *UserInboxPayload_GroupEncryptionSessions_: + if snapshot.UserInboxContent.DeviceSummary == nil { + snapshot.UserInboxContent.DeviceSummary = make(map[string]*UserInboxPayload_Snapshot_DeviceSummary) + } + // loop over keys in the ciphertext map + for deviceKey := range content.GroupEncryptionSessions.Ciphertexts { + if summary, ok := snapshot.UserInboxContent.DeviceSummary[deviceKey]; ok { + summary.UpperBound = miniblockNum + } else { + snapshot.UserInboxContent.DeviceSummary[deviceKey] = &UserInboxPayload_Snapshot_DeviceSummary{ + LowerBound: miniblockNum, + UpperBound: miniblockNum, + } + } + } + // cleanup devices + cleanup_Snapshot_UserInbox(snapshot, miniblockNum) + + return nil + case *UserInboxPayload_Ack_: + if snapshot.UserInboxContent.DeviceSummary == nil { + return nil + } + deviceKey := content.Ack.DeviceKey + if summary, ok := snapshot.UserInboxContent.DeviceSummary[deviceKey]; ok { + if summary.UpperBound <= content.Ack.MiniblockNum { + delete(snapshot.UserInboxContent.DeviceSummary, deviceKey) + } else { + summary.LowerBound = content.Ack.MiniblockNum + 1 + } + } + cleanup_Snapshot_UserInbox(snapshot, miniblockNum) + return nil + default: + return RiverError(Err_INVALID_ARGUMENT, "unknown user to device payload type %T", userInboxPayload.Content) + } +} + +func cleanup_Snapshot_UserInbox(snapshot *Snapshot_UserInboxContent, currentMiniblockNum int64) { + maxGenerations := int64( + 3600, + ) // blocks are made every 2 seconds if events exist. 3600 would be 5 days of blocks 24 hours a day + if snapshot.UserInboxContent.DeviceSummary != nil { + for deviceKey, deviceSummary := range snapshot.UserInboxContent.DeviceSummary { + isOlderThanMaxGenerations := (currentMiniblockNum - deviceSummary.LowerBound) > maxGenerations + if isOlderThanMaxGenerations { + delete(snapshot.UserInboxContent.DeviceSummary, deviceKey) + } + } + } +} + +func update_Snapshot_Member( + iSnapshot *Snapshot, + memberPayload *MemberPayload, + creatorAddress []byte, + miniblockNum int64, + eventNum int64, + eventHash []byte, +) error { + snapshot := iSnapshot.Members + if snapshot == nil { + return RiverError(Err_INVALID_ARGUMENT, "blockheader snapshot is not a membership snapshot") + } + switch content := memberPayload.Content.(type) { + case *MemberPayload_Membership_: + switch content.Membership.Op { + case MembershipOp_SO_JOIN: + snapshot.Joined = insertMember(snapshot.Joined, &MemberPayload_Snapshot_Member{ + UserAddress: content.Membership.UserAddress, + MiniblockNum: miniblockNum, + EventNum: eventNum, + }) + return nil + case MembershipOp_SO_LEAVE: + snapshot.Joined = removeMember(snapshot.Joined, content.Membership.UserAddress) + return nil + case MembershipOp_SO_INVITE: + // not tracking invites currently + return nil + case MembershipOp_SO_UNSPECIFIED: + return RiverError(Err_INVALID_ARGUMENT, "membership op is unspecified") + default: + return RiverError(Err_INVALID_ARGUMENT, "unknown membership op %v", content.Membership.Op) + } + case *MemberPayload_KeySolicitation_: + member, err := findMember(snapshot.Joined, creatorAddress) + if err != nil { + return err + } + applyKeySolicitation(member, content.KeySolicitation) + return nil + case *MemberPayload_KeyFulfillment_: + member, err := findMember(snapshot.Joined, content.KeyFulfillment.UserAddress) + if err != nil { + return err + } + applyKeyFulfillment(member, content.KeyFulfillment) + return nil + case *MemberPayload_DisplayName: + member, err := findMember(snapshot.Joined, creatorAddress) + if err != nil { + return err + } + member.DisplayName = &WrappedEncryptedData{Data: content.DisplayName, EventNum: eventNum, EventHash: eventHash} + return nil + case *MemberPayload_Username: + member, err := findMember(snapshot.Joined, creatorAddress) + if err != nil { + return err + } + member.Username = &WrappedEncryptedData{Data: content.Username, EventNum: eventNum, EventHash: eventHash} + return nil + case *MemberPayload_EnsAddress: + member, err := findMember(snapshot.Joined, creatorAddress) + if err != nil { + return err + } + member.EnsAddress = content.EnsAddress + return nil + case *MemberPayload_Nft_: + member, err := findMember(snapshot.Joined, creatorAddress) + if err != nil { + return err + } + member.Nft = content.Nft + return nil + default: + return RiverError(Err_INVALID_ARGUMENT, "unknown membership payload type %T", memberPayload.Content) + } +} + +func removeCommon(x, y []string) []string { + result := make([]string, 0, len(x)) + i, j := 0, 0 + + for i < len(x) && j < len(y) { + if x[i] < y[j] { + result = append(result, x[i]) + i++ + } else if x[i] > y[j] { + j++ + } else { + i++ + j++ + } + } + + // Append remaining elements from x + if i < len(x) { + result = append(result, x[i:]...) + } + + return result +} + +type SnapshotElement interface{} + +func findSorted[T any, K any](elements []*T, key K, cmp func(K, K) int, keyFn func(*T) K) (*T, error) { + index, found := slices.BinarySearchFunc(elements, key, func(a *T, b K) int { + return cmp(keyFn(a), b) + }) + if found { + return elements[index], nil + } + return nil, RiverError(Err_INVALID_ARGUMENT, "element not found") +} + +func insertSorted[T any, K any](elements []*T, element *T, cmp func(K, K) int, keyFn func(*T) K) []*T { + index, found := slices.BinarySearchFunc(elements, keyFn(element), func(a *T, b K) int { + return cmp(keyFn(a), b) + }) + if found { + elements[index] = element + return elements + } + elements = append(elements, nil) + copy(elements[index+1:], elements[index:]) + elements[index] = element + return elements +} + +func removeSorted[T any, K any](elements []*T, key K, cmp func(K, K) int, keyFn func(*T) K) []*T { + index, found := slices.BinarySearchFunc(elements, key, func(a *T, b K) int { + return cmp(keyFn(a), b) + }) + if found { + return append(elements[:index], elements[index+1:]...) + } + return elements +} + +func findChannel(channels []*SpacePayload_Channel, channelId []byte) (*SpacePayload_Channel, error) { + return findSorted( + channels, + channelId, + bytes.Compare, + func(channel *SpacePayload_Channel) []byte { + return channel.ChannelId + }, + ) +} + +func insertChannel(channels []*SpacePayload_Channel, newChannels ...*SpacePayload_Channel) []*SpacePayload_Channel { + for _, channel := range newChannels { + channels = insertSorted( + channels, + channel, + bytes.Compare, + func(channel *SpacePayload_Channel) []byte { + return channel.ChannelId + }, + ) + } + return channels +} + +func findMember( + members []*MemberPayload_Snapshot_Member, + memberAddress []byte, +) (*MemberPayload_Snapshot_Member, error) { + return findSorted( + members, + memberAddress, + bytes.Compare, + func(member *MemberPayload_Snapshot_Member) []byte { + return member.UserAddress + }, + ) +} + +func removeMember(members []*MemberPayload_Snapshot_Member, memberAddress []byte) []*MemberPayload_Snapshot_Member { + return removeSorted( + members, + memberAddress, + bytes.Compare, + func(member *MemberPayload_Snapshot_Member) []byte { + return member.UserAddress + }, + ) +} + +func insertMember( + members []*MemberPayload_Snapshot_Member, + newMembers ...*MemberPayload_Snapshot_Member, +) []*MemberPayload_Snapshot_Member { + for _, member := range newMembers { + members = insertSorted( + members, + member, + bytes.Compare, + func(member *MemberPayload_Snapshot_Member) []byte { + return member.UserAddress + }, + ) + } + return members +} + +func findUserMembership( + memberships []*UserPayload_UserMembership, + streamId []byte, +) (*UserPayload_UserMembership, error) { + return findSorted( + memberships, + streamId, + bytes.Compare, + func(membership *UserPayload_UserMembership) []byte { + return membership.StreamId + }, + ) +} + +func insertUserMembership( + memberships []*UserPayload_UserMembership, + newMemberships ...*UserPayload_UserMembership, +) []*UserPayload_UserMembership { + for _, membership := range newMemberships { + memberships = insertSorted( + memberships, + membership, + bytes.Compare, + func(membership *UserPayload_UserMembership) []byte { + return membership.StreamId + }, + ) + } + return memberships +} + +func insertFullyReadMarker( + markers []*UserSettingsPayload_FullyReadMarkers, + newMarker *UserSettingsPayload_FullyReadMarkers, +) []*UserSettingsPayload_FullyReadMarkers { + return insertSorted( + markers, + newMarker, + bytes.Compare, + func(marker *UserSettingsPayload_FullyReadMarkers) []byte { + return marker.StreamId + }, + ) +} + +func insertUserBlock( + userBlocksArr []*UserSettingsPayload_Snapshot_UserBlocks, + newUserBlock *UserSettingsPayload_UserBlock, +) []*UserSettingsPayload_Snapshot_UserBlocks { + userIdBytes := newUserBlock.UserId + + newBlock := &UserSettingsPayload_Snapshot_UserBlocks_Block{ + IsBlocked: newUserBlock.IsBlocked, + EventNum: newUserBlock.EventNum, + } + + existingUserBlocks, err := findSorted( + userBlocksArr, + userIdBytes, + bytes.Compare, + func(userBlocks *UserSettingsPayload_Snapshot_UserBlocks) []byte { + return userBlocks.UserId + }, + ) + if err != nil { + // not found, create a new user block + existingUserBlocks = &UserSettingsPayload_Snapshot_UserBlocks{ + UserId: userIdBytes, + Blocks: nil, + } + } + + existingUserBlocks.Blocks = append(existingUserBlocks.Blocks, newBlock) + + return insertSorted( + userBlocksArr, + existingUserBlocks, + bytes.Compare, + func(userBlocks *UserSettingsPayload_Snapshot_UserBlocks) []byte { + return userBlocks.UserId + }, + ) +} + +func applyKeySolicitation(member *MemberPayload_Snapshot_Member, keySolicitation *MemberPayload_KeySolicitation) { + if member != nil { + // if solicitation exists for this device key, remove it by shifting the slice + i := 0 + for _, event := range member.Solicitations { + if event.DeviceKey != keySolicitation.DeviceKey { + member.Solicitations[i] = event + i++ + } + } + // sort the event keys in the new event + event := keySolicitation + event.SessionIds = sort.StringSlice(event.SessionIds) + // append it + MAX_DEVICES := 10 + startIndex := max(0, i-MAX_DEVICES) + member.Solicitations = append(member.Solicitations[startIndex:i], event) + } +} + +func applyKeyFulfillment(member *MemberPayload_Snapshot_Member, keyFulfillment *MemberPayload_KeyFulfillment) { + if member != nil { + // clear out any fulfilled session ids for the device key + for _, event := range member.Solicitations { + if event.DeviceKey == keyFulfillment.DeviceKey { + event.SessionIds = removeCommon(event.SessionIds, sort.StringSlice(keyFulfillment.SessionIds)) + event.IsNewDevice = false + break + } + } + } +} diff --git a/core/node/events/snapshot_test.go b/core/node/events/snapshot_test.go new file mode 100644 index 000000000..f561fe943 --- /dev/null +++ b/core/node/events/snapshot_test.go @@ -0,0 +1,247 @@ +package events + +import ( + "testing" + + "github.com/river-build/river/core/node/base/test" + "github.com/river-build/river/core/node/crypto" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/shared" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/proto" +) + +func make_User_Inception(wallet *crypto.Wallet, streamId StreamId, t *testing.T) *ParsedEvent { + envelope, err := MakeEnvelopeWithPayload( + wallet, + Make_UserPayload_Inception(streamId, nil), + nil, + ) + assert.NoError(t, err) + + parsed, err := ParseEvent(envelope) + assert.NoError(t, err) + return parsed +} + +func make_Space_Inception(wallet *crypto.Wallet, streamId StreamId, t *testing.T) *ParsedEvent { + envelope, err := MakeEnvelopeWithPayload( + wallet, + Make_SpacePayload_Inception(streamId, nil), + nil, + ) + assert.NoError(t, err) + + parsed, err := ParseEvent(envelope) + assert.NoError(t, err) + return parsed +} + +func make_User_Membership( + wallet *crypto.Wallet, + membershipOp MembershipOp, + streamId StreamId, + prevMiniblockHash []byte, + t *testing.T, +) *ParsedEvent { + envelope, err := MakeEnvelopeWithPayload( + wallet, + Make_UserPayload_Membership( + membershipOp, + streamId, + nil, + nil, + ), + prevMiniblockHash, + ) + assert.NoError(t, err) + parsed, err := ParseEvent(envelope) + assert.NoError(t, err) + return parsed +} + +func make_Space_Membership( + wallet *crypto.Wallet, + membershipOp MembershipOp, + userId string, + prevMiniblockHash []byte, + t *testing.T, +) *ParsedEvent { + envelope, err := MakeEnvelopeWithPayload( + wallet, + Make_SpacePayload_Membership( + membershipOp, + userId, + userId, + ), + prevMiniblockHash, + ) + assert.NoError(t, err) + parsed, err := ParseEvent(envelope) + assert.NoError(t, err) + return parsed +} + +func make_Space_Username(wallet *crypto.Wallet, username string, prevHash []byte, t *testing.T) *ParsedEvent { + envelope, err := MakeEnvelopeWithPayload( + wallet, + Make_MemberPayload_Username( + &EncryptedData{Ciphertext: username}, + ), + prevHash, + ) + assert.NoError(t, err) + parsed, err := ParseEvent(envelope) + assert.NoError(t, err) + return parsed +} + +func make_Space_DisplayName( + wallet *crypto.Wallet, + displayName string, + prevHash []byte, + t *testing.T, +) *ParsedEvent { + envelope, err := MakeEnvelopeWithPayload( + wallet, + Make_MemberPayload_DisplayName( + &EncryptedData{Ciphertext: displayName}, + ), + prevHash, + ) + assert.NoError(t, err) + parsed, err := ParseEvent(envelope) + assert.NoError(t, err) + return parsed +} + +func TestMakeSnapshot(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + wallet, _ := crypto.NewWallet(ctx) + streamId := UserStreamIdFromAddr(wallet.Address) + inception := make_User_Inception(wallet, streamId, t) + snapshot, err := Make_GenisisSnapshot([]*ParsedEvent{inception}) + assert.NoError(t, err) + assert.Equal( + t, + streamId[:], + snapshot.Content.(*Snapshot_UserContent).UserContent.Inception.StreamId) +} + +func TestUpdateSnapshot(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + wallet, _ := crypto.NewWallet(ctx) + streamId := UserStreamIdFromAddr(wallet.Address) + inception := make_User_Inception(wallet, streamId, t) + snapshot, err := Make_GenisisSnapshot([]*ParsedEvent{inception}) + assert.NoError(t, err) + + membership := make_User_Membership(wallet, MembershipOp_SO_JOIN, streamId, nil, t) + err = Update_Snapshot(snapshot, membership, 0, 1) + assert.NoError(t, err) + foundUserMembership, err := findUserMembership( + snapshot.Content.(*Snapshot_UserContent).UserContent.Memberships, + streamId[:], + ) + assert.NoError(t, err) + assert.Equal( + t, + MembershipOp_SO_JOIN, + foundUserMembership.Op, + ) +} + +func TestCloneAndUpdateUserSnapshot(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + wallet, _ := crypto.NewWallet(ctx) + streamId := UserStreamIdFromAddr(wallet.Address) + inception := make_User_Inception(wallet, streamId, t) + snapshot1, err := Make_GenisisSnapshot([]*ParsedEvent{inception}) + assert.NoError(t, err) + + snapshot := proto.Clone(snapshot1).(*Snapshot) + + membership := make_User_Membership(wallet, MembershipOp_SO_JOIN, streamId, nil, t) + err = Update_Snapshot(snapshot, membership, 0, 1) + assert.NoError(t, err) + foundUserMembership, err := findUserMembership( + snapshot.Content.(*Snapshot_UserContent).UserContent.Memberships, + streamId[:], + ) + assert.NoError(t, err) + assert.Equal( + t, + MembershipOp_SO_JOIN, + foundUserMembership.Op, + ) +} + +func TestCloneAndUpdateSpaceSnapshot(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + wallet, _ := crypto.NewWallet(ctx) + streamId := UserStreamIdFromAddr(wallet.Address) + inception := make_Space_Inception(wallet, streamId, t) + snapshot1, err := Make_GenisisSnapshot([]*ParsedEvent{inception}) + assert.NoError(t, err) + userId, err := AddressHex(inception.Event.CreatorAddress) + assert.NoError(t, err) + + snapshot := proto.Clone(snapshot1).(*Snapshot) + + membership := make_Space_Membership(wallet, MembershipOp_SO_JOIN, userId, nil, t) + username := make_Space_Username(wallet, "bob", nil, t) + displayName := make_Space_DisplayName(wallet, "bobIsTheGreatest", nil, t) + events := []*ParsedEvent{membership, username, displayName} + for i, event := range events[:] { + err = Update_Snapshot(snapshot, event, 1, int64(3+i)) + assert.NoError(t, err) + } + + member, err := findMember(snapshot.Members.Joined, inception.Event.CreatorAddress) + require.NoError(t, err) + + assert.Equal( + t, + inception.Event.CreatorAddress, + snapshot.Members.Joined[0].UserAddress, + ) + assert.Equal( + t, + "bob", + member.Username.Data.Ciphertext, + ) + assert.Equal( + t, + "bobIsTheGreatest", + member.DisplayName.Data.Ciphertext, + ) + assert.Equal( + t, + int64(4), + member.Username.EventNum, + ) + assert.Equal( + t, + int64(5), + member.DisplayName.EventNum, + ) +} + +func TestUpdateSnapshotFailsIfInception(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + wallet, _ := crypto.NewWallet(ctx) + streamId := UserStreamIdFromAddr(wallet.Address) + inception := make_User_Inception(wallet, streamId, t) + snapshot, err := Make_GenisisSnapshot([]*ParsedEvent{inception}) + assert.NoError(t, err) + + err = Update_Snapshot(snapshot, inception, 0, 1) + assert.Error(t, err) +} diff --git a/core/node/events/stream.go b/core/node/events/stream.go new file mode 100644 index 000000000..9a01b078d --- /dev/null +++ b/core/node/events/stream.go @@ -0,0 +1,684 @@ +package events + +import ( + "bytes" + "context" + "sync" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/storage" + + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/nodes" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/shared" + + mapset "github.com/deckarep/golang-set/v2" +) + +type AddableStream interface { + AddEvent(ctx context.Context, event *ParsedEvent) error +} + +type MiniblockStream interface { + GetMiniblocks(ctx context.Context, fromInclusive int64, ToExclusive int64) ([]*Miniblock, bool, error) +} + +type Stream interface { + AddableStream + MiniblockStream +} + +type SyncResultReceiver interface { + OnUpdate(r *StreamAndCookie) + OnSyncError(err error) +} + +type SyncStream interface { + Stream + + Sub(ctx context.Context, cookie *SyncCookie, receiver SyncResultReceiver) error + Unsub(receiver SyncResultReceiver) + + // MakeMiniblock creates a miniblock proposal, stores it in the registry, and applies it to the stream. + // MakeMiniblock exits early if another MakeMiniblock is already running, + // and as such is not determenistic, it's intended to be called periodically. + MakeMiniblock(ctx context.Context) // TODO: doesn't seem pertinent to SyncStream + + // TestMakeMiniblock is a debug function that creates a miniblock proposal, stores it in the registry, and applies it to the stream. + // It is intended to be called manually from test code. + // TestMakeMiniblock always creates a miniblock if there are events in the minipool. + // TestMakeMiniblock always creates a miniblock if forceSnapshot is true. This miniblock will have a snapshot. + // + // If lastKnownMiniblockNumber is -1 and no new miniblock was created, function succeeds and returns zero hash and -1 miniblock number. + // + // If lastKnownMiniblockNumber is -1 and a new miniblock was created, function succeeds and returns the hash of the new miniblock and the miniblock number. + // + // If lastKnownMiniblockNumber is not -1 and no new miniblock was created, but last block has a higher number than lastKnownMiniblockNumber, + // function succeeds and returns the hash of the last block and the miniblock number. + TestMakeMiniblock( + ctx context.Context, + forceSnapshot bool, + lastKnownMiniblockNumber int64, + ) (common.Hash, int64, error) + + ProposeNextMiniblock(ctx context.Context, forceSnapshot bool) (*MiniblockInfo, error) + MakeMiniblockHeader(ctx context.Context, proposal *MiniblockProposal) (*MiniblockHeader, []*ParsedEvent, error) + ApplyMiniblock(ctx context.Context, miniblock *MiniblockInfo) error + GetView(ctx context.Context) (StreamView, error) +} + +func SyncStreamsResponseFromStreamAndCookie(result *StreamAndCookie) *SyncStreamsResponse { + return &SyncStreamsResponse{ + Stream: result, + } +} + +type streamImpl struct { + params *StreamCacheParams + + // TODO: perf optimization: already in map as key, refactor API to remove dup data. + streamId StreamId + + // TODO: move under lock to support updated. + nodes StreamNodes + + // Mutex protects fields below + // View is copied on write. + // I.e. if there no calls to AddEvent, readers share the same view object + // out of lock, which is immutable, so if there is a need to modify, lock is taken, copy + // of view is created, and copy is modified and stored. + mu sync.RWMutex + view *streamViewImpl + + // lastAccessedTime keeps track when the stream was last used by a client + lastAccessedTime time.Time + + // TODO: perf optimization: support subs on unloaded streams. + receivers mapset.Set[SyncResultReceiver] + + // This mutex is used to ensure that only one MakeMiniblock is running at a time. + makeMiniblockMutex sync.Mutex +} + +var _ SyncStream = (*streamImpl)(nil) + +// Should be called with lock held +// Either view or loadError will be set in Stream. +func (s *streamImpl) loadInternal(ctx context.Context) error { + if s.view != nil { + return nil + } + streamData, err := s.params.Storage.ReadStreamFromLastSnapshot( + ctx, + s.streamId, + max(0, s.params.StreamConfig.RecencyConstraints.Generations-1), + ) + if err != nil { + if AsRiverError(err).Code == Err_NOT_FOUND { + return s.initFromBlockchain(ctx) + } + + return err + } + + view, err := MakeStreamView(streamData) + if err != nil { + return err + } + + s.view = view + return nil +} + +func (s *streamImpl) generateMiniblockProposal(ctx context.Context, forceSnapshot bool) (*MiniblockProposal, error) { + s.mu.RLock() + defer s.mu.RUnlock() + + // Do nothing if not loaded since it's possible for tick to arrive after stream is unloaded. + if s.view == nil { + return nil, nil + } + + return s.view.ProposeNextMiniblock(ctx, s.params.StreamConfig, forceSnapshot) +} + +func (s *streamImpl) ProposeNextMiniblock(ctx context.Context, forceSnapshot bool) (*MiniblockInfo, error) { + proposal, err := s.generateMiniblockProposal(ctx, forceSnapshot) + if err != nil { + return nil, AsRiverError(err).Func("Stream.ProposeNextMiniblock"). + Message("Failed to generate miniblock proposal"). + Tag("streamId", s.streamId) + } + + // empty minipool, do not propose. + if proposal == nil { + return nil, nil + } + + miniblock, err := s.constructMiniblockFromProposal(ctx, proposal) + if err != nil { + return nil, AsRiverError(err).Func("Stream.ProposeNextMiniblock"). + Message("Failed to construct miniblock from proposal"). + Tag("streamId", s.streamId) + } + + if miniblock == nil { + return nil, nil + } + + // Save proposal in storage + if err = s.storeMiniblockCandidate(ctx, miniblock); err != nil { + return nil, AsRiverError( + err, + ).Func("Stream.ProposeNextMiniblock"). + Message("Failed to store miniblock candidate"). + Tag("streamId", s.streamId) + } + return miniblock, nil +} + +func (s *streamImpl) MakeMiniblockHeader( + ctx context.Context, + proposal *MiniblockProposal, +) (*MiniblockHeader, []*ParsedEvent, error) { + s.mu.RLock() + defer s.mu.RUnlock() + + // Do nothing if not loaded since it's possible for tick to arrive after stream is unloaded. + if s.view == nil { + return nil, nil, nil + } + + return s.view.makeMiniblockHeader(ctx, proposal) +} + +// Store miniblock proposal in storage to prevent data loss between proposal and election. This block +// can later be promoted within the db. +func (s *streamImpl) storeMiniblockCandidate(ctx context.Context, miniblock *MiniblockInfo) error { + miniblockBytes, err := miniblock.ToBytes() + if err != nil { + return AsRiverError(err).Func("Stream.storeMiniblockCandidate").Message("Failed to serialize miniblock") + } + + return s.params.Storage.WriteBlockProposal( + ctx, + s.streamId, + miniblock.Hash, + miniblock.Num, + miniblockBytes, + ) +} + +// ApplyMiniblock applies the selected miniblock candidate, updating the cached stream view and storage. +func (s *streamImpl) ApplyMiniblock(ctx context.Context, miniblock *MiniblockInfo) error { + s.mu.Lock() + defer s.mu.Unlock() + + if s.view == nil { + if err := s.loadInternal(ctx); err != nil { + return err + } + } + + // Lets see if this miniblock can be applied. + newSV, err := s.view.copyAndApplyBlock(miniblock, s.params.StreamConfig) + if err != nil { + return err + } + + newMinipool := make([][]byte, 0, newSV.minipool.events.Len()) + for _, e := range newSV.minipool.events.Values { + b, err := e.GetEnvelopeBytes() + if err != nil { + return err + } + newMinipool = append(newMinipool, b) + } + + err = s.params.Storage.PromoteBlock( + ctx, + s.streamId, + s.view.minipool.generation, + miniblock.Hash, + miniblock.headerEvent.Event.GetMiniblockHeader().GetSnapshot() != nil, + newMinipool, + ) + if err != nil { + return err + } + + prevSyncCookie := s.view.SyncCookie(s.params.Wallet.Address) + s.view = newSV + newSyncCookie := s.view.SyncCookie(s.params.Wallet.Address) + + s.notifySubscribers([]*Envelope{miniblock.headerEvent.Envelope}, newSyncCookie, prevSyncCookie) + return nil +} + +func (s *streamImpl) constructMiniblockFromProposal( + ctx context.Context, + proposal *MiniblockProposal, +) (*MiniblockInfo, error) { + miniblockHeader, envelopes, err := s.MakeMiniblockHeader(ctx, proposal) + if err != nil { + return nil, AsRiverError(err).Func("Stream.constructMiniblockFromProposal"). + Message("Failed to make miniblock header"). + Tag("streamId", s.streamId) + } + if miniblockHeader == nil { + return nil, nil + } + + miniblockHeaderEvent, err := MakeParsedEventWithPayload( + s.params.Wallet, + Make_MiniblockHeader(miniblockHeader), + miniblockHeader.PrevMiniblockHash, + ) + if err != nil { + return nil, AsRiverError(err).Func("Stream.constructMiniblockFromProposal"). + Message("Failed to make miniblock header event"). + Tag("streamId", s.streamId) + } + + return NewMiniblockInfoFromParsed(miniblockHeaderEvent, envelopes) +} + +func (s *streamImpl) MakeMiniblock(ctx context.Context) { + if !s.makeMiniblockMutex.TryLock() { + return + } + defer s.makeMiniblockMutex.Unlock() + + _, _, err := s.makeMiniblockImpl(ctx, false, -1) + if err != nil { + dlog.FromCtx(ctx).Error("Stream.MakeMiniblock failed", "error", err, "streamId", s.streamId) + } +} + +func (s *streamImpl) TestMakeMiniblock( + ctx context.Context, + forceSnapshot bool, + lastKnownMiniblockNumber int64, +) (common.Hash, int64, error) { + s.makeMiniblockMutex.Lock() + defer s.makeMiniblockMutex.Unlock() + + return s.makeMiniblockImpl(ctx, forceSnapshot, lastKnownMiniblockNumber) +} + +func (s *streamImpl) makeMiniblockImpl( + ctx context.Context, + forceSnapshot bool, + lastKnownMiniblockNumber int64, +) (common.Hash, int64, error) { + // 1. Create miniblock + miniblock, err := s.ProposeNextMiniblock(ctx, forceSnapshot) + if err != nil { + return common.Hash{}, -1, err + } + + // empty minipool, do not propose. + if miniblock == nil { + if lastKnownMiniblockNumber > -1 { + s.mu.RLock() + defer s.mu.RUnlock() + if s.view != nil { + lastMiniblock := s.view.LastBlock() + if lastMiniblock.Num > lastKnownMiniblockNumber { + return lastMiniblock.Hash, lastMiniblock.Num, nil + } else { + return common.Hash{}, -1, nil + } + } else { + return common.Hash{}, -1, RiverError(Err_INTERNAL, "makeMiniblockImpl: Stream is not loaded", "streamId", s.streamId) + } + } + return common.Hash{}, -1, nil + } + + // 2. Update registry with candidate block metadata + err = s.params.Registry.SetStreamLastMiniblock( + ctx, + s.streamId, + *miniblock.headerEvent.PrevMiniblockHash, + miniblock.headerEvent.Hash, + uint64(miniblock.Num), + false, + ) + if err != nil { + return common.Hash{}, -1, err + } + + // 3. Commit proposal as current block + err = s.ApplyMiniblock(ctx, miniblock) + if err != nil { + return common.Hash{}, -1, err + } + return miniblock.Hash, miniblock.Num, nil +} + +func (s *streamImpl) initFromBlockchain(ctx context.Context) error { + record, _, mb, err := s.params.Registry.GetStreamWithGenesis(ctx, s.streamId) + if err != nil { + return err + } + + nodes := NewStreamNodes(record.Nodes, s.params.Wallet.Address) + if !nodes.IsLocal() { + return RiverError( + Err_INTERNAL, + "initFromBlockchain: Stream is not local", + "streamId", s.streamId, + "nodes", record.Nodes, + "localNode", s.params.Wallet, + ) + } + s.nodes = nodes + + if record.LastMiniblockNum > 0 { + return RiverError( + Err_INTERNAL, + "initFromBlockchain: Stream is past genesis", + "streamId", + s.streamId, + "record", + record, + ) + } + + err = s.params.Storage.CreateStreamStorage(ctx, s.streamId, mb) + if err != nil { + return err + } + + // Successfully put data into storage, init stream view. + view, err := MakeStreamView(&storage.ReadStreamFromLastSnapshotResult{ + StartMiniblockNumber: 0, + Miniblocks: [][]byte{mb}, + }) + if err != nil { + return err + } + s.view = view + return nil +} + +func (s *streamImpl) GetView(ctx context.Context) (StreamView, error) { + s.mu.RLock() + view := s.view + s.mu.RUnlock() + if view != nil { + return view, nil + } + + s.mu.Lock() + defer s.mu.Unlock() + s.lastAccessedTime = time.Now() + err := s.loadInternal(ctx) + if err != nil { + return nil, err + } + return s.view, nil +} + +// Returns StreamView if it's already loaded, or nil if it's not. +func (s *streamImpl) tryGetView() StreamView { + s.mu.RLock() + defer s.mu.RUnlock() + // Return nil interface, if implementation is nil. This is go for you. + if s.view != nil { + return s.view + } else { + return nil + } +} + +func (s *streamImpl) tryCleanup(expiration time.Duration) bool { + s.mu.Lock() + defer s.mu.Unlock() + + expired := time.Since(s.lastAccessedTime) >= expiration + + // return immediately if the view is already purged or if the mini block creation routine + // is running for this stream + if s.view == nil { + return false + } + + // only unload if there is no-one is listing to this stream and there are no events in the minipool. + if expired && (s.receivers == nil || s.receivers.Cardinality() == 0) && s.view.minipool.events.Len() == 0 { + s.view = nil + return true + } + return false +} + +// Returns +// miniblocks: with indexes from fromIndex inclusive, to toIndex exlusive +// terminus: true if fromIndex is 0, or if there are no more blocks because they've been garbage collected +func (s *streamImpl) GetMiniblocks( + ctx context.Context, + fromInclusive int64, + toExclusive int64, +) ([]*Miniblock, bool, error) { + blocks, err := s.params.Storage.ReadMiniblocks(ctx, s.streamId, fromInclusive, toExclusive) + if err != nil { + return nil, false, err + } + + miniblocks := make([]*Miniblock, len(blocks)) + startMiniblockNumber := int64(-1) + for i, binMiniblock := range blocks { + miniblock, err := NewMiniblockInfoFromBytes(binMiniblock, startMiniblockNumber+int64(i)) + if err != nil { + return nil, false, err + } + if i == 0 { + startMiniblockNumber = miniblock.header().MiniblockNum + } + miniblocks[i] = miniblock.Proto + } + + terminus := fromInclusive == 0 + return miniblocks, terminus, nil +} + +func (s *streamImpl) AddEvent(ctx context.Context, event *ParsedEvent) error { + s.mu.Lock() + defer s.mu.Unlock() + err := s.loadInternal(ctx) + if err != nil { + return err + } + + return s.addEventImpl(ctx, event) +} + +// caller must have a RW lock on s.mu +func (s *streamImpl) notifySubscribers(envelopes []*Envelope, newSyncCookie *SyncCookie, prevSyncCookie *SyncCookie) { + if s.receivers != nil && s.receivers.Cardinality() > 0 { + s.lastAccessedTime = time.Now() + + resp := &StreamAndCookie{ + Events: envelopes, + NextSyncCookie: newSyncCookie, + } + for receiver := range s.receivers.Iter() { + receiver.OnUpdate(resp) + } + } +} + +// Lock must be taken. +func (s *streamImpl) addEventImpl(ctx context.Context, event *ParsedEvent) error { + envelopeBytes, err := event.GetEnvelopeBytes() + if err != nil { + return err + } + + err = s.params.Storage.WriteEvent( + ctx, + s.streamId, + s.view.minipool.generation, + s.view.minipool.nextSlotNumber(), + envelopeBytes, + ) + // TODO: for some classes of errors, it's not clear if event was added or not + // for those, perhaps entire Stream structure should be scrapped and reloaded + if err != nil { + return err + } + + newSV, err := s.view.copyAndAddEvent(event) + if err != nil { + return err + } + prevSyncCookie := s.view.SyncCookie(s.params.Wallet.Address) + s.view = newSV + newSyncCookie := s.view.SyncCookie(s.params.Wallet.Address) + + s.notifySubscribers([]*Envelope{event.Envelope}, newSyncCookie, prevSyncCookie) + + return nil +} + +func (s *streamImpl) Sub(ctx context.Context, cookie *SyncCookie, receiver SyncResultReceiver) error { + log := dlog.FromCtx(ctx) + if !bytes.Equal(cookie.NodeAddress, s.params.Wallet.Address.Bytes()) { + return RiverError( + Err_BAD_SYNC_COOKIE, + "cookies is not for this node", + "cookie.NodeAddress", + cookie.NodeAddress, + "s.params.Wallet.AddressStr", + s.params.Wallet, + ) + } + if !s.streamId.EqualsBytes(cookie.StreamId) { + return RiverError( + Err_BAD_SYNC_COOKIE, + "bad stream id", + "cookie.StreamId", + cookie.StreamId, + "s.streamId", + s.streamId, + ) + } + slot := cookie.MinipoolSlot + if slot < 0 { + return RiverError(Err_BAD_SYNC_COOKIE, "bad slot", "cookie.MinipoolSlot", slot).Func("Stream.Sub") + } + + s.mu.Lock() + defer s.mu.Unlock() + err := s.loadInternal(ctx) + if err != nil { + return err + } + + s.lastAccessedTime = time.Now() + + if cookie.MinipoolGen == s.view.minipool.generation { + if slot > int64(s.view.minipool.events.Len()) { + return RiverError(Err_BAD_SYNC_COOKIE, "Stream.Sub: bad slot") + } + + if s.receivers == nil { + s.receivers = mapset.NewSet[SyncResultReceiver]() + } + s.receivers.Add(receiver) + + envelopes := make([]*Envelope, 0, s.view.minipool.events.Len()-int(slot)) + if slot < int64(s.view.minipool.events.Len()) { + for _, e := range s.view.minipool.events.Values[slot:] { + envelopes = append(envelopes, e.Envelope) + } + } + // always send response, even if there are no events so that the client knows it's upToDate + receiver.OnUpdate( + &StreamAndCookie{ + Events: envelopes, + NextSyncCookie: s.view.SyncCookie(s.params.Wallet.Address), + }, + ) + return nil + } else { + if s.receivers == nil { + s.receivers = mapset.NewSet[SyncResultReceiver]() + } + s.receivers.Add(receiver) + + miniblockIndex, err := s.view.indexOfMiniblockWithNum(cookie.MinipoolGen) + if err != nil { + // The user's sync cookie is out of date. Send a sync reset and return an up-to-date StreamAndCookie. + log.Warn("Stream.Sub: out of date cookie.MiniblockNum. Sending sync reset.", "error", err.Error()) + receiver.OnUpdate( + &StreamAndCookie{ + Events: s.view.MinipoolEnvelopes(), + NextSyncCookie: s.view.SyncCookie(s.params.Wallet.Address), + Miniblocks: s.view.MiniblocksFromLastSnapshot(), + SyncReset: true, + }, + ) + return nil + } + + // append events from blocks + envelopes := make([]*Envelope, 0, 16) + err = s.view.forEachEvent(miniblockIndex, func(e *ParsedEvent) (bool, error) { + envelopes = append(envelopes, e.Envelope) + return true, nil + }) + if err != nil { + panic("Should never happen: Stream.Sub: forEachEvent failed: " + err.Error()) + } + + // always send response, even if there are no events so that the client knows it's upToDate + receiver.OnUpdate( + &StreamAndCookie{ + Events: envelopes, + NextSyncCookie: s.view.SyncCookie(s.params.Wallet.Address), + }, + ) + return nil + } +} + +// It's ok to unsub non-existing receiver. +// Such situation arises during ForceFlush. +func (s *streamImpl) Unsub(receiver SyncResultReceiver) { + s.mu.Lock() + defer s.mu.Unlock() + if s.receivers != nil { + s.receivers.Remove(receiver) + } +} + +// ForceFlush transitions Stream object to unloaded state. +// All subbed receivers will receive empty response and must +// terminate corresponding sync loop. +func (s *streamImpl) ForceFlush(ctx context.Context) { + s.mu.Lock() + defer s.mu.Unlock() + s.view = nil + if s.receivers != nil && s.receivers.Cardinality() > 0 { + err := RiverError(Err_INTERNAL, "Stream unloaded") + for r := range s.receivers.Iter() { + r.OnSyncError(err) + } + } + s.receivers = nil +} + +func (s *streamImpl) canCreateMiniblock() bool { + s.mu.RLock() + defer s.mu.RUnlock() + // Loaded, has events in minipool, fake leader and periodic miniblock creation is not disabled in test settings. + return s.view != nil && + s.view.minipool.events.Len() > 0 && + s.nodes.LocalIsLeader() && + !s.view.snapshot.GetInceptionPayload().GetSettings().GetDisableMiniblockCreation() +} diff --git a/core/node/events/stream_cache.go b/core/node/events/stream_cache.go new file mode 100644 index 000000000..29c1e3a11 --- /dev/null +++ b/core/node/events/stream_cache.go @@ -0,0 +1,397 @@ +package events + +import ( + "context" + "sync" + "time" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/contracts" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/dlog" + . "github.com/river-build/river/core/node/nodes" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/registries" + . "github.com/river-build/river/core/node/shared" + "github.com/river-build/river/core/node/storage" +) + +const ( + // MiniblockCandidateBatchSize keep track the max number of new miniblocks that are registered in the StreamRegistry + // in a single transaction. + MiniblockCandidateBatchSize = 50 +) + +type StreamCacheParams struct { + Storage storage.StreamStorage + Wallet *crypto.Wallet + Riverchain *crypto.Blockchain + Registry *registries.RiverRegistryContract + StreamConfig *config.StreamConfig +} + +type StreamCache interface { + GetStream(ctx context.Context, streamId StreamId) (SyncStream, StreamView, error) + CreateStream(ctx context.Context, streamId StreamId) (SyncStream, StreamView, error) + ForceFlushAll(ctx context.Context) + GetLoadedViews(ctx context.Context) []StreamView + OnNewBlock(ctx context.Context) +} + +type streamCacheImpl struct { + params *StreamCacheParams + + // streamId -> *streamImpl + // cache is populated by getting all streams that should be on local node from River chain. + // streamImpl can be in unloaded state, in which case it will be loaded on first GetStream call. + cache sync.Map + + // New miniblock production in triggered when there is new block on River chain. + onNewBlockMutex sync.Mutex + + // registerMiniBlocksBatched is a feature gate that when set to true new mini-blocks are registered with a batched + // transaction instead of one by one. This can be deleted once the StreamRegistry facet is updated to allow for + // batch registrations. + registerMiniBlocksBatched bool +} + +var _ StreamCache = (*streamCacheImpl)(nil) + +func NewStreamCache( + ctx context.Context, + params *StreamCacheParams, + appliedBlockNum crypto.BlockNumber, + chainMonitor crypto.ChainMonitor, +) (*streamCacheImpl, error) { + s := &streamCacheImpl{ + params: params, + registerMiniBlocksBatched: false, + } + + streams, err := params.Registry.GetAllStreams(ctx, appliedBlockNum) + if err != nil { + return nil, err + } + + // TODO: read stream state from storage and schedule required reconciliations. + + for _, stream := range streams { + nodes := NewStreamNodes(stream.Nodes, params.Wallet.Address) + if nodes.IsLocal() { + s.cache.Store(stream.StreamId, &streamImpl{ + params: params, + streamId: stream.StreamId, + nodes: nodes, + }) + } + } + + // TODO: setup monitor for stream updates and update records accordingly. + + chainMonitor.OnBlock(func(ctx context.Context, _ crypto.BlockNumber) { s.OnNewBlock(ctx) }) + + go s.cacheCleanup(ctx, params.StreamConfig.CacheExpirationPollInterval, params.StreamConfig.CacheExpiration) + + return s, nil +} + +// polls the cache every pollInterval and evicts streams from the cache that have not been accessed in expiration. +func (s *streamCacheImpl) cacheCleanup(ctx context.Context, pollInterval time.Duration, expiration time.Duration) { + log := dlog.FromCtx(ctx) + + if expiration <= 0 { + log.Warn("stream cache cache cleanup disabled", "expiration", expiration) + return + } + if pollInterval <= 0 { + pollInterval = expiration / 10 + } + + log.Debug("stream cache cache cleanup", "expiration", expiration, "poll", pollInterval) + + for { + select { + case <-time.After(pollInterval): + s.cache.Range(func(streamID, streamVal any) bool { + if stream := streamVal.(*streamImpl); stream.tryCleanup(expiration) { + log.Debug("stream view evicted from cache", "streamId", stream.streamId) + } + return true + }) + case <-ctx.Done(): + log.Debug("stream cache cache cleanup shutdown") + return + } + } +} + +func (s *streamCacheImpl) tryLoadStreamRecord(ctx context.Context, streamId StreamId) (SyncStream, StreamView, error) { + // Same code is called for GetStream and CreateStream. + // For GetStream the fact that record is not in cache means that there is race to get it during creation: + // Blockchain record is already created, but this fact is not reflected yet in local storage. + // This may happen if somebody observes record allocation on blockchain and tries to get stream + // while local storage is being initialized. + record, _, mb, err := s.params.Registry.GetStreamWithGenesis(ctx, streamId) + if err != nil { + return nil, nil, err + } + + nodes := NewStreamNodes(record.Nodes, s.params.Wallet.Address) + if !nodes.IsLocal() { + return nil, nil, RiverError( + Err_INTERNAL, + "tryLoadStreamRecord: Stream is not local", + "streamId", streamId, + "nodes", record.Nodes, + "localNode", s.params.Wallet, + ) + } + + if record.LastMiniblockNum > 0 { + // TODO: reconcile from other nodes. + return nil, nil, RiverError( + Err_INTERNAL, + "tryLoadStreamRecord: Stream is past genesis", + "streamId", + streamId, + "record", + record, + ) + } + + stream := &streamImpl{ + params: s.params, + streamId: streamId, + nodes: nodes, + lastAccessedTime: time.Now(), + } + + // Lock stream, so parallel creators have to wait for the stream to be intialized. + stream.mu.Lock() + defer stream.mu.Unlock() + + entry, loaded := s.cache.LoadOrStore(streamId, stream) + if !loaded { + // Our stream won the race, put into storage. + err := s.params.Storage.CreateStreamStorage(ctx, streamId, mb) + if err != nil { + if AsRiverError(err).Code == Err_ALREADY_EXISTS { + // Attempt to load stream from storage. Might as well do it while under lock. + err = stream.loadInternal(ctx) + if err == nil { + return stream, stream.view, nil + } + } + return nil, nil, err + } + + // Successfully put data into storage, init stream view. + view, err := MakeStreamView(&storage.ReadStreamFromLastSnapshotResult{ + StartMiniblockNumber: 0, + Miniblocks: [][]byte{mb}, + }) + if err != nil { + return nil, nil, err + } + stream.view = view + return stream, view, nil + } else { + // There was another record in the cache, use it. + if entry == nil { + return nil, nil, RiverError(Err_INTERNAL, "tryLoadStreamRecord: Cache corruption", "streamId", streamId) + } + stream = entry.(*streamImpl) + view, err := stream.GetView(ctx) + if err != nil { + return nil, nil, err + } + return stream, view, nil + } +} + +func (s *streamCacheImpl) GetStream(ctx context.Context, streamId StreamId) (SyncStream, StreamView, error) { + entry, _ := s.cache.Load(streamId) + if entry == nil { + return s.tryLoadStreamRecord(ctx, streamId) + } + stream := entry.(*streamImpl) + + streamView, err := stream.GetView(ctx) + + if err == nil { + return stream, streamView, nil + } else { + // TODO: if stream is not present in local storage, schedule reconciliation. + return nil, nil, err + } +} + +func (s *streamCacheImpl) CreateStream( + ctx context.Context, + streamId StreamId, +) (SyncStream, StreamView, error) { + // Same logic as in GetStream: read from blockchain, create if present. + return s.GetStream(ctx, streamId) +} + +func (s *streamCacheImpl) ForceFlushAll(ctx context.Context) { + s.cache.Range(func(key, value interface{}) bool { + stream := value.(*streamImpl) + stream.ForceFlush(ctx) + return true + }) +} + +func (s *streamCacheImpl) GetLoadedViews(ctx context.Context) []StreamView { + var result []StreamView + s.cache.Range(func(key, value interface{}) bool { + stream := value.(*streamImpl) + view := stream.tryGetView() + if view != nil { + result = append(result, view) + } + return true + }) + return result +} + +// OnNewBlock loops over streams and determines if it needs to produce a new mini block. +// For every stream that is eligible to produce a new mini block it creates a new mini block candidate. +// It bundles candidates in a batch. +// If the batch is full it submits the batch to the RiverRegistry#stream facet for registration and parses the resulting +// logs to determine which mini block candidate was registered and which are not. For each registered mini block +// candidate it applies the candidate to the stream. +func (s *streamCacheImpl) OnNewBlock(ctx context.Context) { + log := dlog.FromCtx(ctx) + + // Log at level below debug, otherwise it's too chatty. + log.Log(ctx, -8, "OnNewBlock: ENTER producing new miniblocks") + + // Try lock to have only one invocation at a time. Previous onNewBlock may still be running. + if !s.onNewBlockMutex.TryLock() { + return + } + + // don't block the chain monitor + go func() { + defer s.onNewBlockMutex.Unlock() + + // switch over to batch commits when StreamRegistry facet is updated to allow batch sets + if s.registerMiniBlocksBatched { + s.onNewBlockBatch(ctx) + } else { + s.onNewBlockSingle(ctx) + } + + // Log at level below debug, otherwise it's too chatty. + log.Log(ctx, -8, "onNewBlock: EXIT produced new miniblocks") + }() +} + +// s.onNewBlockMutex must be claimed +func (s *streamCacheImpl) onNewBlockSingle(ctx context.Context) { + s.cache.Range(func(key, value interface{}) bool { + stream := value.(*streamImpl) + if stream.canCreateMiniblock() { + // TODO: use worker pool here? + go stream.MakeMiniblock(ctx) + } + return true + }) +} + +// s.onNewBlockMutex must be claimed +func (s *streamCacheImpl) onNewBlockBatch(ctx context.Context) { + var ( + log = dlog.FromCtx(ctx) + candidates = make(map[StreamId]*MiniblockInfo) + tasks sync.WaitGroup + ) + + s.cache.Range(func(key, value interface{}) bool { + stream := value.(*streamImpl) + if stream.canCreateMiniblock() { + candidate, err := stream.ProposeNextMiniblock(ctx, false) + if err != nil { + log.Error("onNewBlock: Error creating new miniblock proposal", + "streamId", stream.streamId, "err", err) + return true + } + + if candidate == nil { + log.Debug("onNewBlock: No miniblock to produce", "streamId", stream.streamId) + return true + } + + candidates[stream.streamId] = candidate + + if len(candidates) == MiniblockCandidateBatchSize { + tasks.Add(1) + go func(c map[StreamId]*MiniblockInfo) { + if err := s.processMiniblockProposalBatch(ctx, c); err != nil { + log.Error("onNewBlock: Error processing miniblock proposal batch", "err", err) + } + tasks.Done() + }(candidates) + + candidates = make(map[StreamId]*MiniblockInfo) + } + } + return true + }) + + if err := s.processMiniblockProposalBatch(ctx, candidates); err != nil { + log.Error("onNewBlock: Error processing miniblock proposal batch", "err", err) + } + + tasks.Wait() + + // Log at level below debug, otherwise it's too chatty. + log.Log(ctx, -8, "onNewBlock: EXIT produced new miniblocks") +} + +func (s *streamCacheImpl) processMiniblockProposalBatch( + ctx context.Context, + candidates map[StreamId]*MiniblockInfo, +) error { + if len(candidates) == 0 { + return nil + } + + var ( + log = dlog.FromCtx(ctx) + miniblocks = make([]contracts.SetMiniblock, 0, len(candidates)) + ) + + for streamID, candidate := range candidates { + miniblocks = append(miniblocks, contracts.SetMiniblock{ + StreamId: streamID, + PrevMiniBlockHash: *candidate.headerEvent.PrevMiniblockHash, + LastMiniblockHash: candidate.headerEvent.Hash, + LastMiniblockNum: uint64(candidate.Num), + IsSealed: false, + }) + } + + success, _, err := s.params.Registry.SetStreamLastMiniblockBatch(ctx, miniblocks) + if err != nil { + log.Error("SetStreamLastMiniblockBatch failed", "err", err) + return err + } + + for _, streamSetInRegistry := range success { + if raw, ok := s.cache.Load(streamSetInRegistry); ok { + if err := raw.(*streamImpl).ApplyMiniblock(ctx, candidates[streamSetInRegistry]); err != nil { + log.Error("onNewBlock: Error applying miniblock", + "streamId", raw.(*streamImpl).streamId, "err", err) + } else { + log.Debug("onNewBlock: Applied miniblock", + "streamId", raw.(*streamImpl).streamId, + "miniblock#", candidates[streamSetInRegistry].Num) + } + } + } + + return nil +} diff --git a/core/node/events/stream_cache_test.go b/core/node/events/stream_cache_test.go new file mode 100644 index 000000000..eb2f0b09d --- /dev/null +++ b/core/node/events/stream_cache_test.go @@ -0,0 +1,536 @@ +package events + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/river-build/river/core/node/base/test" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/registries" + "github.com/river-build/river/core/node/shared" + "github.com/river-build/river/core/node/storage" + "github.com/river-build/river/core/node/testutils" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/proto" +) + +func TestStreamCacheViewEviction(t *testing.T) { + t.Run("SingleBlockRegistration", func(t *testing.T) { + testStreamCacheViewEviction(t, false) + }) + + // TODO: tests timeout on CI quite often, need to be stabilized. + // t.Run("BatchBlockRegistration", func(t *testing.T) { + // testStreamCacheViewEviction(t, true) + // }) +} + +func TestCacheEvictionWithFilledMiniBlockPool(t *testing.T) { + t.Run("SingleBlockRegistration", func(t *testing.T) { + testCacheEvictionWithFilledMiniBlockPool(t, false) + }) + + // TODO: tests timeout on CI quite often, need to be stabilized. + // t.Run("BatchBlockRegistration", func(t *testing.T) { + // testCacheEvictionWithFilledMiniBlockPool(t, true) + // }) +} + +// TestStreamMiniblockBatchProduction ensures that all mini-blocks are registered when mini-blocks are registered in +// batches. +// TODO: tests timeout on CI quite often, need to be stabilized. +func DisabledTestStreamMiniblockBatchProduction(t *testing.T) { + t.Run("SingleBlockRegistration", func(t *testing.T) { + testStreamMiniblockBatchProduction(t, false) + }) + + t.Run("BatchBlockRegistration", func(t *testing.T) { + testStreamMiniblockBatchProduction(t, true) + }) +} + +func testStreamCacheViewEviction(t *testing.T, useBatchRegistration bool) { + var ( + ctx, cancel = test.NewTestContext() + require = require.New(t) + chainMonitor = crypto.NewChainMonitor() + ) + defer cancel() + + btc, err := crypto.NewBlockchainTestContext(ctx, 1, true) + require.NoError(err, "instantiating blockchain test context") + defer btc.Close() + + go chainMonitor.RunWithBlockPeriod(ctx, btc.Client(), 0, 10*time.Millisecond) + + node := btc.GetBlockchain(ctx, 0) + + pendingTx, err := btc.DeployerBlockchain.TxPool.Submit( + ctx, + "RegisterNode", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + return btc.NodeRegistry.RegisterNode(opts, node.Wallet.Address, "http://node.local:1234", 2) + }, + ) + require.NoError(err, "register node") + receipt := <-pendingTx.Wait() + require.Equal(crypto.TransactionResultSuccess, receipt.Status, "register node transaction failed") + + riverRegistry, err := registries.NewRiverRegistryContract(ctx, node, &config.ContractConfig{ + Address: btc.RiverRegistryAddress, + }) + require.NoError(err, "instantiating river registry contract") + + pg := storage.NewTestPgStore(ctx) + defer pg.Close() + + streamCache, err := NewStreamCache(ctx, &StreamCacheParams{ + Storage: pg.Storage, + Wallet: node.Wallet, + Riverchain: node, + Registry: riverRegistry, + StreamConfig: &config.StreamConfig{ + CacheExpiration: 0, // disable cache expiration, done manually + }, + }, 0, chainMonitor) + require.NoError(err, "instantiating stream cache") + + streamCache.registerMiniBlocksBatched = useBatchRegistration + + streamCache.cache.Range(func(key, value any) bool { + require.Fail("stream cache should be empty") + return true + }) + + var ( + nodes = []common.Address{node.Wallet.Address} + streamID = testutils.FakeStreamId(shared.STREAM_SPACE_BIN) + genesisMiniblock = MakeGenesisMiniblockForSpaceStream(t, node.Wallet, streamID) + ) + + genesisMiniblockBytes, err := proto.Marshal(genesisMiniblock) + require.NoError(err, "marshalling genesis miniblock") + + pendingTx, err = node.TxPool.Submit( + ctx, + "AllocateStream", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + return riverRegistry.StreamRegistry.AllocateStream( + opts, + streamID, + nodes, + [32]byte(genesisMiniblock.Header.Hash), + genesisMiniblockBytes, + ) + }, + ) + + require.NoError(err, "allocate stream") + receipt = <-pendingTx.Wait() + require.Equal(crypto.TransactionResultSuccess, receipt.Status, "allocate stream transaction failed") + + streamSync, streamView, err := streamCache.GetStream(ctx, streamID) + require.NoError(err, "loading stream record") + + // stream just loaded and should be with view in cache + streamWithoutLoadedView := 0 + streamWithLoadedViewCount := 0 + streamCache.cache.Range(func(key, value any) bool { + stream := value.(*streamImpl) + if stream.view == nil { + streamWithoutLoadedView++ + } else { + streamWithLoadedViewCount++ + } + return true + }) + require.Equal(0, streamWithoutLoadedView, "stream cache must have no unloaded streams") + require.Equal(1, streamWithLoadedViewCount, "stream cache must have one loaded stream") + + // stream now has a subscriber and its view should not be evicted from cache + receiver := testStreamCacheViewEvictionSub{} + err = streamSync.Sub(ctx, streamView.SyncCookie(node.Wallet.Address), receiver) + require.NoError(err, "subscribing to stream") + time.Sleep(10 * time.Millisecond) // make sure we hit the cache expiration of 1 ms + ctxShort, cancelShort := context.WithTimeout(ctx, 25*time.Millisecond) + streamCache.cacheCleanup(ctxShort, time.Millisecond, time.Millisecond) + cancelShort() + + streamWithoutLoadedView = 0 + streamWithLoadedViewCount = 0 + streamCache.cache.Range(func(key, value any) bool { + stream := value.(*streamImpl) + if stream.view == nil { + streamWithoutLoadedView++ + } else { + streamWithLoadedViewCount++ + } + return true + }) + require.Equal(0, streamWithoutLoadedView, "stream cache must have no unloaded streams") + require.Equal(1, streamWithLoadedViewCount, "stream cache must have one loaded stream") + + // unsubscribe from stream and making it eligible to get dropped from cache + streamSync.Unsub(receiver) + + // no subscribers anymore so its view must be dropped from cache + time.Sleep(10 * time.Millisecond) // make sure we hit the cache expiration of 1 ms + ctxShort, cancelShort = context.WithTimeout(ctx, 25*time.Millisecond) + streamCache.cacheCleanup(ctxShort, time.Millisecond, time.Millisecond) + cancelShort() + + streamWithoutLoadedView = 0 + streamWithLoadedViewCount = 0 + streamCache.cache.Range(func(key, value any) bool { + stream := value.(*streamImpl) + if stream.view == nil { + streamWithoutLoadedView++ + } else { + streamWithLoadedViewCount++ + } + return true + }) + require.Equal(1, streamWithoutLoadedView, "stream cache must have no unloaded streams") + require.Equal(0, streamWithLoadedViewCount, "stream cache must have one loaded stream") + + // stream view must be loaded again in cache + _, _, err = streamCache.GetStream(ctx, streamID) + require.NoError(err, "loading stream record") + streamWithoutLoadedView = 0 + streamWithLoadedViewCount = 0 + streamCache.cache.Range(func(key, value any) bool { + stream := value.(*streamImpl) + if stream.view == nil { + streamWithoutLoadedView++ + } else { + streamWithLoadedViewCount++ + } + return true + }) + require.Equal(0, streamWithoutLoadedView, "stream cache must have no unloaded streams") + require.Equal(1, streamWithLoadedViewCount, "stream cache must have one loaded stream") +} + +func testCacheEvictionWithFilledMiniBlockPool(t *testing.T, useBatchRegistration bool) { + var ( + ctx, cancel = test.NewTestContext() + require = require.New(t) + chainMonitor = crypto.NewChainMonitor() + ) + defer cancel() + + btc, err := crypto.NewBlockchainTestContext(ctx, 1, true) + require.NoError(err, "instantiating blockchain test context") + defer btc.Close() + + go chainMonitor.RunWithBlockPeriod(ctx, btc.Client(), 0, 10*time.Millisecond) + + node := btc.GetBlockchain(ctx, 0) + + pendingTx, err := btc.DeployerBlockchain.TxPool.Submit( + ctx, + "RegisterNode", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + return btc.NodeRegistry.RegisterNode(opts, node.Wallet.Address, "http://node.local:1234", 2) + }, + ) + require.NoError(err, "register node") + receipt := <-pendingTx.Wait() + require.Equal(crypto.TransactionResultSuccess, receipt.Status, "register node transaction failed") + + riverRegistry, err := registries.NewRiverRegistryContract(ctx, node, &config.ContractConfig{ + Address: btc.RiverRegistryAddress, + }) + require.NoError(err, "instantiating river registry contract") + + pg := storage.NewTestPgStore(ctx) + defer pg.Close() + + streamCacheParams := &StreamCacheParams{ + Storage: pg.Storage, + Wallet: node.Wallet, + Riverchain: node, + Registry: riverRegistry, + StreamConfig: &config.StreamConfig{ + CacheExpiration: 0, // disable cache expiration, done manually + }, + } + + streamCache, err := NewStreamCache(ctx, streamCacheParams, 0, chainMonitor) + require.NoError(err, "instantiating stream cache") + + streamCache.registerMiniBlocksBatched = useBatchRegistration + + streamCache.cache.Range(func(key, value any) bool { + require.Fail("stream cache should be empty") + return true + }) + + var ( + nodes = []common.Address{node.Wallet.Address} + streamID = testutils.FakeStreamId(shared.STREAM_SPACE_BIN) + genesisMiniblock = MakeGenesisMiniblockForSpaceStream(t, node.Wallet, streamID) + ) + + genesisMiniblockBytes, err := proto.Marshal(genesisMiniblock) + require.NoError(err, "marshalling genesis miniblock") + + pendingTx, err = node.TxPool.Submit( + ctx, + "AllocateStream", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + return riverRegistry.StreamRegistry.AllocateStream( + opts, + streamID, + nodes, + [32]byte(genesisMiniblock.Header.Hash), + genesisMiniblockBytes, + ) + }, + ) + + require.NoError(err, "allocate stream") + receipt = <-pendingTx.Wait() + require.Equal(crypto.TransactionResultSuccess, receipt.Status, "allocate stream transaction failed") + + streamSync, _, err := streamCache.GetStream(ctx, streamID) + require.NoError(err, "loading stream record") + + // stream just loaded and should have view loaded + streamWithoutLoadedView := 0 + streamWithLoadedViewCount := 0 + streamCache.cache.Range(func(key, value any) bool { + stream := value.(*streamImpl) + if stream.view == nil { + streamWithoutLoadedView++ + } else { + streamWithLoadedViewCount++ + } + return true + }) + require.Equal(0, streamWithoutLoadedView, "stream cache must have no unloaded streams") + require.Equal(1, streamWithLoadedViewCount, "stream cache must have one loaded stream") + + // ensure that view is dropped from cache + time.Sleep(10 * time.Millisecond) // make sure we hit the cache expiration of 1 ms + ctxShort, cancelShort := context.WithTimeout(ctx, 25*time.Millisecond) + streamCache.cacheCleanup(ctxShort, time.Millisecond, time.Millisecond) + cancelShort() + loadedStream, _ := streamCache.cache.Load(streamID) + require.Nil(loadedStream.(*streamImpl).view, "view not unloaded") + + // try to create a miniblock, pool is empty so it should not fail but also should not create a miniblock + _, _, err = streamSync.TestMakeMiniblock(ctx, false, -1) + require.NoError(err, "make miniblock") + + // add event to stream with unloaded view, view should be loaded in cache and minipool must contain event + addEvent(t, ctx, streamCacheParams, streamSync, "payload", common.BytesToHash(genesisMiniblock.Header.Hash)) + + // with event in minipool ensure that view isn't evicted from cache + time.Sleep(10 * time.Millisecond) // make sure we hit the cache expiration of 1 ms + ctxShort, cancelShort = context.WithTimeout(ctx, 25*time.Millisecond) + streamCache.cacheCleanup(ctxShort, time.Millisecond, time.Millisecond) + cancelShort() + loadedStream, _ = streamCache.cache.Load(streamID) + require.NotNil(loadedStream.(*streamImpl).view, "view unloaded") + + // now it should be possible to create a miniblock + blockHash, blockNum, err := streamSync.TestMakeMiniblock(ctx, false, -1) + require.NoError(err) + require.NotEqual(common.Hash{}, blockHash) + require.Greater(blockNum, int64(0)) + + // minipool should be empty now and view should be evicted from cache + time.Sleep(10 * time.Millisecond) // make sure we hit the cache expiration of 1 ms + ctxShort, cancelShort = context.WithTimeout(ctx, 25*time.Millisecond) + streamCache.cacheCleanup(ctxShort, time.Millisecond, time.Millisecond) + cancelShort() + loadedStream, _ = streamCache.cache.Load(streamID) + require.Nil(loadedStream.(*streamImpl).view, "view loaded in cache") +} + +type testStreamCacheViewEvictionSub struct{} + +func (testStreamCacheViewEvictionSub) OnUpdate(r *protocol.StreamAndCookie) {} +func (testStreamCacheViewEvictionSub) OnSyncError(err error) {} + +func testStreamMiniblockBatchProduction(t *testing.T, useBatchRegistration bool) { + var ( + ctx, cancel = test.NewTestContext() + require = require.New(t) + streamsCount = 10*MiniblockCandidateBatchSize - 1 + allocateStreams = func( + btc *crypto.BlockchainTestContext, + count int, + node *crypto.Blockchain, + riverRegistry *registries.RiverRegistryContract, + ) map[shared.StreamId]*protocol.Miniblock { + var ( + genesisBlocks = make(map[shared.StreamId]*protocol.Miniblock) + lastPendingTx crypto.TransactionPoolPendingTransaction + ) + + for i := 0; i < count; i++ { + var ( + nodes = []common.Address{node.Wallet.Address} + streamID = testutils.FakeStreamId(shared.STREAM_SPACE_BIN) + genesisMiniblock = MakeGenesisMiniblockForSpaceStream(t, node.Wallet, streamID) + ) + + genesisMiniblockBytes, err := proto.Marshal(genesisMiniblock) + require.NoError(err, "marshalling genesis miniblock") + + pendingTx, err := node.TxPool.Submit( + ctx, + "AllocateStream", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + return riverRegistry.StreamRegistry.AllocateStream( + opts, + streamID, + nodes, + [32]byte(genesisMiniblock.Header.Hash), + genesisMiniblockBytes, + ) + }, + ) + require.NoError(err, "submit allocate stream tx") + lastPendingTx = pendingTx + genesisBlocks[streamID] = genesisMiniblock + } + + for { + btc.Commit(ctx) + select { + case receipt := <-lastPendingTx.Wait(): + require.Equal(crypto.TransactionResultSuccess, receipt.Status, + "allocate streams failed") + return genesisBlocks + case <-time.After(time.Second): + continue + } + } + } + ) + defer cancel() + + btc, err := crypto.NewBlockchainTestContext(ctx, 1, true) + require.NoError(err, "instantiating blockchain test context") + defer btc.Close() + + node := btc.GetBlockchain(ctx, 0) + pendingTx, err := btc.DeployerBlockchain.TxPool.Submit( + ctx, + "RegisterNode", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + return btc.NodeRegistry.RegisterNode(opts, node.Wallet.Address, "http://node.local:1234", 2) + }, + ) + + require.NoError(err, "register node") + receipt := <-pendingTx.Wait() + require.Equal(crypto.TransactionResultSuccess, receipt.Status, "register node transaction failed") + + riverRegistry, err := registries.NewRiverRegistryContract(ctx, node, &config.ContractConfig{ + Address: btc.RiverRegistryAddress, + }) + require.NoError(err, "instantiating river registry contract") + + pg := storage.NewTestPgStore(ctx) + defer pg.Close() + + streamCache, err := NewStreamCache(ctx, &StreamCacheParams{ + Storage: pg.Storage, + Wallet: node.Wallet, + Riverchain: node, + Registry: riverRegistry, + StreamConfig: &config.StreamConfig{ + CacheExpiration: 0, // disable cache expiration, done manually + }, + }, node.InitialBlockNum, node.ChainMonitor) + require.NoError(err, "instantiating stream cache") + + streamCache.registerMiniBlocksBatched = useBatchRegistration + + streamCache.cache.Range(func(key, value any) bool { + require.Fail("stream cache should be empty") + return true + }) + + // the stream cache uses the chain block production as a ticker to create new mini-blocks. + // after initialization take back control when to create new chain blocks. + // TODO: this handler is gone, refactor + // btc.DeployerBlockchain.TxPool.SetOnSubmitHandler(nil) + + var ( + genesisBlocks = allocateStreams(btc, streamsCount, node, riverRegistry) + streamsWithEvents = make(map[shared.StreamId]int) + ) + + // add events to ~50% of the streams + for streamID, genesis := range genesisBlocks { + streamSync, _, err := streamCache.GetStream(ctx, streamID) + require.NoError(err, "get stream") + + // unload view for half of the streams + if streamID[1]%2 == 1 { + streamSync.(*streamImpl).tryCleanup(time.Duration(0)) + } + + // only add events to half of the streams + if streamID[2]%2 == 1 { + continue + } + + // add several events to the stream + for i := 0; i < 1+int(streamID[3]%50); i++ { + addEvent(t, ctx, streamCache.params, streamSync, + fmt.Sprintf("msg# %d", i), common.BytesToHash(genesis.Header.Hash)) + } + streamsWithEvents[streamID] = 1 + int(streamID[3]%50) + } + + for { + // on block makes the stream cache to walk over streams and create miniblocks for those that are eligible + btc.Commit(ctx) + + // quit loop when all added events are included in mini-blocks + miniblocksProduced := 0 + for streamID := range genesisBlocks { + stream, view, err := streamCache.GetStream(ctx, streamID) + require.NoError(err, "get stream") + + var ( + expStreamEventsCount = len(genesisBlocks[streamID].Events) + streamsWithEvents[streamID] + gotStreamEventsCount = 0 + ) + + syncCookie := view.SyncCookie(node.Wallet.Address) + require.NotNil(syncCookie, "sync cookie") + + miniblocks, _, err := stream.GetMiniblocks(ctx, 0, syncCookie.MinipoolGen) + require.NoError(err, "get miniblocks") + + for _, mb := range miniblocks { + gotStreamEventsCount += len(mb.Events) + } + + if expStreamEventsCount == gotStreamEventsCount { + miniblocksProduced++ + } + } + + // all streams with events added have a new block after genesis + if miniblocksProduced == len(genesisBlocks) { + break + } + + <-time.After(time.Second) + } +} diff --git a/core/node/events/stream_test.go b/core/node/events/stream_test.go new file mode 100644 index 000000000..8c3fe2bcf --- /dev/null +++ b/core/node/events/stream_test.go @@ -0,0 +1,145 @@ +package events + +import ( + "context" + "fmt" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/river-build/river/core/node/crypto" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/shared" + "github.com/river-build/river/core/node/testutils" + + "github.com/stretchr/testify/require" +) + +func MakeGenesisMiniblockForSpaceStream( + t *testing.T, + wallet *crypto.Wallet, + spaceStreamId StreamId, +) *Miniblock { + inception, err := MakeEnvelopeWithPayload( + wallet, + Make_SpacePayload_Inception(spaceStreamId, nil), + nil, + ) + require.NoError(t, err) + + miniblockHeader, err := Make_GenesisMiniblockHeader([]*ParsedEvent{parsedEvent(t, inception)}) + require.NoError(t, err) + miniblockHeaderProto, err := MakeEnvelopeWithPayload( + wallet, + Make_MiniblockHeader(miniblockHeader), + nil, + ) + require.NoError(t, err) + + miniblockProto := &Miniblock{ + Header: miniblockHeaderProto, + Events: []*Envelope{inception}, + } + + return miniblockProto +} + +func MakeEvent( + t *testing.T, + wallet *crypto.Wallet, + payload IsStreamEvent_Payload, + prevMiniblockHash []byte, +) *ParsedEvent { + envelope, err := MakeEnvelopeWithPayload(wallet, payload, prevMiniblockHash) + require.NoError(t, err) + return parsedEvent(t, envelope) +} + +func addEvent( + t *testing.T, + ctx context.Context, + streamCacheParams *StreamCacheParams, + stream SyncStream, + data string, + mbHash common.Hash, +) { + err := stream.AddEvent( + ctx, + MakeEvent( + t, + streamCacheParams.Wallet, + Make_MemberPayload_Username(&EncryptedData{Ciphertext: data}), + mbHash.Bytes(), + ), + ) + require.NoError(t, err) +} + +type mbTestParams struct { + addAfterProposal bool + eventsInMinipool int +} + +func mbTest( + t *testing.T, + params mbTestParams, +) { + ctx, tt := makeTestStreamParams(testParams{}) + defer tt.closer() + require := require.New(t) + + spaceStreamId := testutils.FakeStreamId(STREAM_SPACE_BIN) + miniblockProto := MakeGenesisMiniblockForSpaceStream(t, tt.params.Wallet, spaceStreamId) + + stream, view, err := tt.createStream(ctx, spaceStreamId, miniblockProto) + require.NoError(err) + + addEvent(t, ctx, tt.params, stream, "1", view.LastBlock().Hash) + addEvent(t, ctx, tt.params, stream, "2", view.LastBlock().Hash) + + proposal, err := stream.ProposeNextMiniblock(ctx, false) + mb := proposal.headerEvent.Event.GetMiniblockHeader() + events := proposal.events + require.NoError(err) + require.Equal(2, len(events)) + require.Equal(2, len(mb.EventHashes)) + require.EqualValues(view.LastBlock().Hash[:], mb.PrevMiniblockHash) + require.Equal(int64(1), mb.MiniblockNum) + + if params.addAfterProposal { + addEvent(t, ctx, tt.params, stream, "3", view.LastBlock().Hash) + } + + require.NoError(err) + require.Equal(2, len(events)) + require.Equal(int64(1), mb.MiniblockNum) + + err = stream.ApplyMiniblock(ctx, proposal) + require.NoError(err) + + view2, err := stream.GetView(ctx) + require.NoError(err) + stats := view2.GetStats() + require.Equal(params.eventsInMinipool, stats.EventsInMinipool) + addEvent(t, ctx, tt.params, stream, "4", view2.LastBlock().Hash) + + view2, err = stream.GetView(ctx) + require.NoError(err) + stats = view2.GetStats() + require.Equal(int64(1), stats.LastMiniblockNum) + require.Equal(params.eventsInMinipool+1, stats.EventsInMinipool) + require.Equal(5, stats.EventsInMiniblocks) + require.Equal(5+stats.EventsInMinipool, stats.TotalEventsEver) +} + +func TestMiniblockProduction(t *testing.T) { + cases := []mbTestParams{ + {false, 0}, + {true, 1}, + } + + for i, c := range cases { + t.Run(fmt.Sprint(i), func(t *testing.T) { + mbTest(t, c) + }) + } +} diff --git a/core/node/events/stream_view.go b/core/node/events/stream_view.go new file mode 100644 index 000000000..91f3be914 --- /dev/null +++ b/core/node/events/stream_view.go @@ -0,0 +1,654 @@ +package events + +import ( + "bytes" + "context" + "encoding/hex" + "time" + + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/dlog" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/shared" + "github.com/river-build/river/core/node/storage" + . "github.com/river-build/river/core/node/utils" + + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/emptypb" +) + +type StreamViewStats struct { + FirstMiniblockNum int64 + LastMiniblockNum int64 + EventsInMiniblocks int + SnapshotsInMiniblocks int + EventsInMinipool int + TotalEventsEver int // This is total number of events in the stream ever, not in the cache. +} + +type StreamView interface { + StreamId() *StreamId + StreamParentId() *StreamId + InceptionPayload() IsInceptionPayload + LastEvent() *ParsedEvent + MinipoolEnvelopes() []*Envelope + MiniblocksFromLastSnapshot() []*Miniblock + SyncCookie(localNodeAddress common.Address) *SyncCookie + LastBlock() *MiniblockInfo + ValidateNextEvent( + ctx context.Context, + cfg *config.RecencyConstraintsConfig, + parsedEvent *ParsedEvent, + currentTime time.Time, + ) error + GetStats() StreamViewStats + ProposeNextMiniblock(ctx context.Context, cfg *config.StreamConfig, forceSnapshot bool) (*MiniblockProposal, error) + IsMember(userAddress []byte) (bool, error) +} + +func MakeStreamView(streamData *storage.ReadStreamFromLastSnapshotResult) (*streamViewImpl, error) { + if len(streamData.Miniblocks) <= 0 { + return nil, RiverError(Err_STREAM_EMPTY, "no blocks").Func("MakeStreamView") + } + + miniblocks := make([]*MiniblockInfo, len(streamData.Miniblocks)) + lastMiniblockNumber := int64(-2) + snapshotIndex := -1 + for i, binMiniblock := range streamData.Miniblocks { + miniblock, err := NewMiniblockInfoFromBytes(binMiniblock, lastMiniblockNumber+1) + if err != nil { + return nil, err + } + miniblocks[i] = miniblock + lastMiniblockNumber = miniblock.header().MiniblockNum + if snapshotIndex == -1 && miniblock.header().Snapshot != nil { + snapshotIndex = i + } + } + + if snapshotIndex == -1 { + return nil, RiverError(Err_STREAM_BAD_EVENT, "no snapshot").Func("MakeStreamView") + } + + snapshot := miniblocks[snapshotIndex].headerEvent.Event.GetMiniblockHeader().GetSnapshot() + if snapshot == nil { + return nil, RiverError(Err_STREAM_BAD_EVENT, "no snapshot").Func("MakeStreamView") + } + streamId, err := StreamIdFromBytes(snapshot.GetInceptionPayload().GetStreamId()) + if err != nil { + return nil, RiverError(Err_STREAM_BAD_EVENT, "bad streamId").Func("MakeStreamView") + } + + minipoolEvents := NewOrderedMap[common.Hash, *ParsedEvent](len(streamData.MinipoolEnvelopes)) + for _, e := range streamData.MinipoolEnvelopes { + var env Envelope + err := proto.Unmarshal(e, &env) + if err != nil { + return nil, err + } + parsed, err := ParseEvent(&env) + if err != nil { + return nil, err + } + minipoolEvents.Set(parsed.Hash, parsed) + } + + return &streamViewImpl{ + streamId: streamId, + blocks: miniblocks, + minipool: newMiniPoolInstance(minipoolEvents, miniblocks[len(miniblocks)-1].header().MiniblockNum+1), + snapshot: snapshot, + snapshotIndex: snapshotIndex, + }, nil +} + +func MakeRemoteStreamView(resp *GetStreamResponse) (*streamViewImpl, error) { + if len(resp.Stream.Miniblocks) <= 0 { + return nil, RiverError(Err_STREAM_EMPTY, "no blocks").Func("MakeStreamViewFromRemote") + } + + miniblocks := make([]*MiniblockInfo, len(resp.Stream.Miniblocks)) + // +1 below will make it -1 for the first iteration so block number is not enforced. + lastMiniblockNumber := int64(-2) + snapshotIndex := 0 + for i, binMiniblock := range resp.Stream.Miniblocks { + miniblock, err := NewMiniblockInfoFromProto( + binMiniblock, + NewMiniblockInfoFromProtoOpts{ExpectedBlockNumber: lastMiniblockNumber + 1}, + ) + if err != nil { + return nil, err + } + lastMiniblockNumber = miniblock.header().MiniblockNum + miniblocks[i] = miniblock + if miniblock.header().Snapshot != nil { + snapshotIndex = i + } + } + + snapshot := miniblocks[0].headerEvent.Event.GetMiniblockHeader().GetSnapshot() + if snapshot == nil { + return nil, RiverError(Err_STREAM_BAD_EVENT, "no snapshot").Func("MakeStreamView") + } + streamId, err := StreamIdFromBytes(snapshot.GetInceptionPayload().GetStreamId()) + if err != nil { + return nil, RiverError(Err_STREAM_BAD_EVENT, "bad streamId").Func("MakeStreamView") + } + + minipoolEvents := NewOrderedMap[common.Hash, *ParsedEvent](len(resp.Stream.Events)) + for _, e := range resp.Stream.Events { + parsed, err := ParseEvent(e) + if err != nil { + return nil, err + } + minipoolEvents.Set(parsed.Hash, parsed) + } + + return &streamViewImpl{ + streamId: streamId, + blocks: miniblocks, + minipool: newMiniPoolInstance(minipoolEvents, lastMiniblockNumber+1), + snapshot: snapshot, + snapshotIndex: snapshotIndex, + }, nil +} + +type streamViewImpl struct { + streamId StreamId + blocks []*MiniblockInfo + minipool *minipoolInstance + snapshot *Snapshot + snapshotIndex int +} + +var _ StreamView = (*streamViewImpl)(nil) + +func (r *streamViewImpl) copyAndAddEvent(event *ParsedEvent) (*streamViewImpl, error) { + if event.Event.GetMiniblockHeader() != nil { + return nil, RiverError(Err_BAD_EVENT, "streamViewImpl: block event not allowed") + } + + r = &streamViewImpl{ + streamId: r.streamId, + blocks: r.blocks, + minipool: r.minipool.copyAndAddEvent(event), + snapshot: r.snapshot, + snapshotIndex: r.snapshotIndex, + } + return r, nil +} + +func (r *streamViewImpl) LastBlock() *MiniblockInfo { + return r.blocks[len(r.blocks)-1] +} + +// Returns nil if there are no events to propose. +func (r *streamViewImpl) ProposeNextMiniblock( + ctx context.Context, + cfg *config.StreamConfig, + forceSnapshot bool, +) (*MiniblockProposal, error) { + if r.minipool.events.Len() == 0 && !forceSnapshot { + return nil, nil + } + hashes := make([][]byte, 0, r.minipool.events.Len()) + for _, e := range r.minipool.events.Values { + hashes = append(hashes, e.Hash[:]) + } + return &MiniblockProposal{ + Hashes: hashes, + NewMiniblockNum: r.minipool.generation, + PrevMiniblockHash: r.LastBlock().headerEvent.Hash[:], + ShouldSnapshot: forceSnapshot || r.shouldSnapshot(cfg), + }, nil +} + +func (r *streamViewImpl) makeMiniblockHeader( + ctx context.Context, + proposal *MiniblockProposal, +) (*MiniblockHeader, []*ParsedEvent, error) { + if r.minipool.generation != proposal.NewMiniblockNum || + !bytes.Equal(proposal.PrevMiniblockHash, r.LastBlock().headerEvent.Hash[:]) { + return nil, nil, RiverError( + Err_STREAM_LAST_BLOCK_MISMATCH, + "proposal generation or hash mismatch", + "expected", + r.minipool.generation, + "actual", + proposal.NewMiniblockNum, + ) + } + + log := dlog.FromCtx(ctx) + hashes := make([][]byte, 0, r.minipool.events.Len()) + events := make([]*ParsedEvent, 0, r.minipool.events.Len()) + + for _, h := range proposal.Hashes { + e, ok := r.minipool.events.Get(common.BytesToHash(h)) + if !ok { + return nil, nil, RiverError( + Err_MINIPOOL_MISSING_EVENTS, + "proposal event not found in minipool", + "hash", + FormatHashFromBytes(h), + ) + } + hashes = append(hashes, e.Hash[:]) + events = append(events, e) + } + + var snapshot *Snapshot + last := r.LastBlock() + eventNumOffset := last.header().EventNumOffset + int64(len(last.events)) + 1 // +1 for header + nextMiniblockNum := last.header().MiniblockNum + 1 + miniblockNumOfPrevSnapshot := last.header().PrevSnapshotMiniblockNum + if last.header().Snapshot != nil { + miniblockNumOfPrevSnapshot = last.header().MiniblockNum + } + if proposal.ShouldSnapshot { + snapshot = proto.Clone(r.snapshot).(*Snapshot) + // update all blocks since last snapshot + for i := r.snapshotIndex + 1; i < len(r.blocks); i++ { + block := r.blocks[i] + miniblockNum := block.header().MiniblockNum + for j, e := range block.events { + offset := block.header().EventNumOffset + err := Update_Snapshot(snapshot, e, miniblockNum, offset+int64(j)) + if err != nil { + log.Error("Failed to update snapshot", + "error", err, + "streamId", r.streamId, + "event", e.ShortDebugStr(), + ) + } + } + } + // update with current events in minipool + for i, e := range events { + err := Update_Snapshot(snapshot, e, nextMiniblockNum, eventNumOffset+int64(i)) + if err != nil { + log.Error("Failed to update snapshot", + "error", err, + "streamId", r.streamId, + "event", e.ShortDebugStr(), + ) + } + } + } + + return &MiniblockHeader{ + MiniblockNum: nextMiniblockNum, + Timestamp: NextMiniblockTimestamp(last.header().Timestamp), + EventHashes: hashes, + PrevMiniblockHash: last.headerEvent.Hash[:], + Snapshot: snapshot, + EventNumOffset: eventNumOffset, + PrevSnapshotMiniblockNum: miniblockNumOfPrevSnapshot, + Content: &MiniblockHeader_None{ + None: &emptypb.Empty{}, + }, + }, events, nil +} + +func (r *streamViewImpl) copyAndApplyBlock( + miniblock *MiniblockInfo, + cfg *config.StreamConfig, +) (*streamViewImpl, error) { + header := miniblock.headerEvent.Event.GetMiniblockHeader() + if header == nil { + return nil, RiverError( + Err_INTERNAL, + "streamViewImpl: non block event not allowed", + "stream", + r.streamId, + "event", + miniblock.headerEvent.ShortDebugStr(), + ) + } + + lastBlock := r.LastBlock() + if header.MiniblockNum != lastBlock.header().MiniblockNum+1 { + return nil, RiverError( + Err_BAD_BLOCK, + "streamViewImpl: block number mismatch", + "expected", + lastBlock.header().MiniblockNum+1, + "actual", + header.MiniblockNum, + ) + } + if !bytes.Equal(lastBlock.headerEvent.Hash[:], header.PrevMiniblockHash) { + return nil, RiverError( + Err_BAD_BLOCK, + "streamViewImpl: block hash mismatch", + "expected", + FormatHash(lastBlock.headerEvent.Hash), + "actual", + FormatHashFromBytes(header.PrevMiniblockHash), + ) + } + + remaining := make(map[common.Hash]*ParsedEvent, max(r.minipool.events.Len()-len(header.EventHashes), 0)) + for k, v := range r.minipool.events.Map { + remaining[k] = v + } + + for _, e := range miniblock.events { + if _, ok := remaining[e.Hash]; ok { + delete(remaining, e.Hash) + } else { + return nil, RiverError(Err_BAD_BLOCK, "streamViewImpl: block event not found", "stream", r.streamId, "event_hash", FormatHash(e.Hash)) + } + } + + minipoolEvents := NewOrderedMap[common.Hash, *ParsedEvent](len(remaining)) + for _, e := range r.minipool.events.Values { + if _, ok := remaining[e.Hash]; ok { + minipoolEvents.Set(e.Hash, e) + } + } + + var startIndex int + var snapshotIndex int + var snapshot *Snapshot + if header.Snapshot != nil { + snapshot = header.Snapshot + startIndex = max(0, len(r.blocks)-cfg.RecencyConstraints.Generations) + snapshotIndex = len(r.blocks) - startIndex + } else { + startIndex = 0 + snapshot = r.snapshot + snapshotIndex = r.snapshotIndex + } + + return &streamViewImpl{ + streamId: r.streamId, + blocks: append(r.blocks[startIndex:], miniblock), + minipool: newMiniPoolInstance(minipoolEvents, header.MiniblockNum+1), + snapshot: snapshot, + snapshotIndex: snapshotIndex, + }, nil +} + +func (r *streamViewImpl) StreamId() *StreamId { + return &r.streamId +} + +func (r *streamViewImpl) InceptionPayload() IsInceptionPayload { + return r.snapshot.GetInceptionPayload() +} + +func (r *streamViewImpl) indexOfMiniblockWithNum(mininblockNum int64) (int, error) { + if len(r.blocks) > 0 { + diff := int(mininblockNum - r.blocks[0].header().MiniblockNum) + if diff >= 0 && diff < len(r.blocks) { + if r.blocks[diff].header().MiniblockNum != mininblockNum { + return 0, RiverError( + Err_INTERNAL, + "indexOfMiniblockWithNum block number mismatch", + "requested", + mininblockNum, + "actual", + r.blocks[diff].header().MiniblockNum, + ) + } + return diff, nil + } + return 0, RiverError( + Err_INVALID_ARGUMENT, + "indexOfMiniblockWithNum index not found", + "requested", + mininblockNum, + "min", + r.blocks[0].header().MiniblockNum, + "max", + r.blocks[len(r.blocks)-1].header().MiniblockNum, + ) + } + return 0, RiverError( + Err_INVALID_ARGUMENT, + "indexOfMiniblockWithNum No blocks loaded", + "requested", + mininblockNum, + "streamId", + r.streamId, + ) +} + +// iterate over events starting at startBlock including events in the minipool +func (r *streamViewImpl) forEachEvent(startBlock int, op func(e *ParsedEvent) (bool, error)) error { + if startBlock < 0 || startBlock > len(r.blocks) { + return RiverError(Err_INVALID_ARGUMENT, "iterateEvents: bad startBlock", "startBlock", startBlock) + } + + for i := startBlock; i < len(r.blocks); i++ { + err := r.blocks[i].forEachEvent(op) + if err != nil { + return err + } + } + err := r.minipool.forEachEvent(op) + return err +} + +func (r *streamViewImpl) LastEvent() *ParsedEvent { + lastEvent := r.minipool.lastEvent() + if lastEvent != nil { + return lastEvent + } + + // Iterate over blocks in reverse order to find non-empty block and return last event from it. + for i := len(r.blocks) - 1; i >= 0; i-- { + lastEvent := r.blocks[i].lastEvent() + if lastEvent != nil { + return lastEvent + } + } + return nil +} + +func (r *streamViewImpl) MinipoolEnvelopes() []*Envelope { + envelopes := make([]*Envelope, 0, len(r.minipool.events.Values)) + _ = r.minipool.forEachEvent(func(e *ParsedEvent) (bool, error) { + envelopes = append(envelopes, e.Envelope) + return true, nil + }) + return envelopes +} + +func (r *streamViewImpl) MiniblocksFromLastSnapshot() []*Miniblock { + miniblocks := make([]*Miniblock, 0, len(r.blocks)-r.snapshotIndex) + for i := r.snapshotIndex; i < len(r.blocks); i++ { + miniblocks = append(miniblocks, r.blocks[i].Proto) + } + return miniblocks +} + +func (r *streamViewImpl) SyncCookie(localNodeAddress common.Address) *SyncCookie { + return &SyncCookie{ + NodeAddress: localNodeAddress.Bytes(), + StreamId: r.streamId[:], + MinipoolGen: r.minipool.generation, + MinipoolSlot: int64(r.minipool.events.Len()), + PrevMiniblockHash: r.LastBlock().headerEvent.Hash[:], + } +} + +func (r *streamViewImpl) getMinEventsPerSnapshot(cfg *config.StreamConfig) int { + // does this stream have a custom value for it's prefix? + if cfg.MinEventsPerSnapshot != nil { + streamPrefix := hex.EncodeToString(r.streamId[:1]) + if value, ok := cfg.MinEventsPerSnapshot[streamPrefix]; ok { + return value + } + } + // is the value set in the config? + if cfg.DefaultMinEventsPerSnapshot != 0 { + return cfg.DefaultMinEventsPerSnapshot + } + // nothing is set, return magic number + return 100 +} + +func (r *streamViewImpl) shouldSnapshot(cfg *config.StreamConfig) bool { + minEventsPerSnapshot := r.getMinEventsPerSnapshot(cfg) + + count := 0 + // count the events in the minipool + count += r.minipool.events.Len() + if count >= minEventsPerSnapshot { + return true + } + // count the events in blocks since the last snapshot + for i := len(r.blocks) - 1; i >= 0; i-- { + block := r.blocks[i] + if block.header().Snapshot != nil { + break + } + count += len(block.events) + if count >= minEventsPerSnapshot { + return true + } + } + return false +} + +func (r *streamViewImpl) ValidateNextEvent( + ctx context.Context, + cfg *config.RecencyConstraintsConfig, + parsedEvent *ParsedEvent, + currentTime time.Time, +) error { + // the preceding miniblock hash should reference a recent block + // the event should not already exist in any block after the preceding miniblock + // the event should not exist in the minipool + foundBlockAt := -1 + // loop over blocks backwards to find block with preceding miniblock hash + for i := len(r.blocks) - 1; i >= 0; i-- { + block := r.blocks[i] + if bytes.Equal(block.headerEvent.Hash[:], parsedEvent.Event.PrevMiniblockHash) { + foundBlockAt = i + break + } + } + // ensure that we found it + if foundBlockAt == -1 { + return RiverError( + Err_BAD_PREV_MINIBLOCK_HASH, + "prevMiniblockHash not found in recent blocks", + "event", + parsedEvent.ShortDebugStr(), + "expected", + FormatFullHash(r.LastBlock().headerEvent.Hash), + ) + } + // make sure we're recent + // if the user isn't adding the latest block, allow it if the block after was recently created + if foundBlockAt < len(r.blocks)-1 && !r.isRecentBlock(ctx, cfg, r.blocks[foundBlockAt+1], currentTime) { + return RiverError( + Err_BAD_PREV_MINIBLOCK_HASH, + "prevMiniblockHash did not reference a recent block", + "event", + parsedEvent.ShortDebugStr(), + "expected", + FormatFullHash(r.LastBlock().headerEvent.Hash), + ) + } + // loop forwards from foundBlockAt and check for duplicate event + for i := foundBlockAt + 1; i < len(r.blocks); i++ { + block := r.blocks[i] + for _, e := range block.events { + if e.Hash == parsedEvent.Hash { + return RiverError( + Err_DUPLICATE_EVENT, + "event already exists in block", + "event", + parsedEvent.ShortDebugStr(), + ) + } + } + } + // check for duplicates in the minipool + for _, e := range r.minipool.events.Values { + if e.Hash == parsedEvent.Hash { + return RiverError( + Err_DUPLICATE_EVENT, + "event already exists in minipool", + "event", + parsedEvent.ShortDebugStr(), + "expected", + FormatHashShort(r.LastBlock().headerEvent.Hash), + ) + } + } + // success + return nil +} + +func (r *streamViewImpl) isRecentBlock( + ctx context.Context, + cfg *config.RecencyConstraintsConfig, + block *MiniblockInfo, + currentTime time.Time, +) bool { + maxAgeDuration := time.Duration(cfg.AgeSeconds) * time.Second + if maxAgeDuration == 0 { + maxAgeDuration = 5 * time.Second + } + diff := currentTime.Sub(block.header().Timestamp.AsTime()) + return diff <= maxAgeDuration +} + +func (r *streamViewImpl) GetStats() StreamViewStats { + stats := StreamViewStats{ + FirstMiniblockNum: r.blocks[0].Num, + LastMiniblockNum: r.LastBlock().Num, + EventsInMinipool: r.minipool.events.Len(), + } + + for _, block := range r.blocks { + stats.EventsInMiniblocks += len(block.events) + 1 // +1 for header + if block.header().Snapshot != nil { + stats.SnapshotsInMiniblocks++ + } + } + + stats.TotalEventsEver = int(r.blocks[r.snapshotIndex].header().EventNumOffset) + for _, block := range r.blocks[r.snapshotIndex:] { + stats.TotalEventsEver += len(block.events) + 1 // +1 for header + } + stats.TotalEventsEver += r.minipool.events.Len() + + return stats +} + +func (r *streamViewImpl) IsMember(userAddress []byte) (bool, error) { + membership, err := r.GetMembership(userAddress) + if err != nil { + return false, err + } + return membership == MembershipOp_SO_JOIN, nil +} + +func (r *streamViewImpl) StreamParentId() *StreamId { + streamIdBytes := GetStreamParentId(r.InceptionPayload()) + if streamIdBytes == nil { + return nil + } + streamId, err := StreamIdFromBytes(streamIdBytes) + if err != nil { + panic(err) // todo convert everything to shared.StreamId + } + return &streamId +} + +func GetStreamParentId(inception IsInceptionPayload) []byte { + switch inceptionContent := inception.(type) { + case *ChannelPayload_Inception: + return inceptionContent.SpaceId + default: + return nil + } +} diff --git a/core/node/events/stream_view_test.go b/core/node/events/stream_view_test.go new file mode 100644 index 000000000..9de815a74 --- /dev/null +++ b/core/node/events/stream_view_test.go @@ -0,0 +1,261 @@ +package events + +import ( + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/river-build/river/core/node/base/test" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/crypto" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/shared" + "github.com/river-build/river/core/node/storage" + + "github.com/stretchr/testify/assert" + "google.golang.org/protobuf/proto" +) + +var recencyConstraintsConfig_t = config.RecencyConstraintsConfig{ + Generations: 5, + AgeSeconds: 11, +} + +var ( + minEventsPerSnapshotDefault = 20 + minEventsPerSnapshotUserStream = 2 +) + +var streamConfig_t = config.StreamConfig{ + Media: config.MediaStreamConfig{ + MaxChunkCount: 100, + MaxChunkSize: 1000000, + }, + RecencyConstraints: config.RecencyConstraintsConfig{ + AgeSeconds: 11, + Generations: 5, + }, + DefaultMinEventsPerSnapshot: minEventsPerSnapshotDefault, + MinEventsPerSnapshot: map[string]int{}, +} + +func parsedEvent(t *testing.T, envelope *Envelope) *ParsedEvent { + parsed, err := ParseEvent(envelope) + assert.NoError(t, err) + return parsed +} + +func TestLoad(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + userWallet, _ := crypto.NewWallet(ctx) + nodeWallet, _ := crypto.NewWallet(ctx) + streamId := UserStreamIdFromAddr(userWallet.Address) + + userAddress := userWallet.Address[:] + + inception, err := MakeEnvelopeWithPayload( + userWallet, + Make_UserPayload_Inception(streamId, nil), + nil, + ) + assert.NoError(t, err) + join, err := MakeEnvelopeWithPayload( + userWallet, + Make_UserPayload_Membership(MembershipOp_SO_JOIN, streamId, nil, nil), + nil, + ) + assert.NoError(t, err) + miniblockHeader, err := Make_GenesisMiniblockHeader([]*ParsedEvent{parsedEvent(t, inception), parsedEvent(t, join)}) + assert.NoError(t, err) + miniblockHeaderProto, err := MakeEnvelopeWithPayload( + userWallet, + Make_MiniblockHeader(miniblockHeader), + nil, + ) + assert.NoError(t, err) + + miniblockProto := &Miniblock{ + Header: miniblockHeaderProto, + Events: []*Envelope{inception, join}, + } + miniblockProtoBytes, err := proto.Marshal(miniblockProto) + assert.NoError(t, err) + + view, err := MakeStreamView(&storage.ReadStreamFromLastSnapshotResult{ + Miniblocks: [][]byte{miniblockProtoBytes}, + }) + + assert.NoError(t, err) + + assert.Equal(t, streamId, *view.StreamId()) + + ip := view.InceptionPayload() + ipStreamId, err := StreamIdFromBytes(ip.GetStreamId()) + assert.NoError(t, err) + assert.NotNil(t, ip) + assert.Equal(t, parsedEvent(t, inception).Event.GetInceptionPayload().GetStreamId(), ip.GetStreamId()) + assert.Equal(t, streamId, ipStreamId) + + joined, err := view.IsMember(userAddress) // joined is only valid on user, space and channel views + assert.NoError(t, err) + assert.True(t, joined) + + last := view.LastEvent() + assert.NotNil(t, last) + assert.Equal(t, join.Hash, last.Hash[:]) + + miniEnvelopes := view.MinipoolEnvelopes() + assert.Equal(t, 0, len(miniEnvelopes)) + + newEnvelopesHashes := make([]common.Hash, 0) + _ = view.forEachEvent(0, func(e *ParsedEvent) (bool, error) { + newEnvelopesHashes = append(newEnvelopesHashes, e.Hash) + return true, nil + }) + + assert.Equal(t, 3, len(newEnvelopesHashes)) + assert.Equal( + t, + []common.Hash{ + common.BytesToHash(inception.Hash), + common.BytesToHash(join.Hash), + common.BytesToHash(miniblockHeaderProto.Hash), + }, + newEnvelopesHashes, + ) + + cookie := view.SyncCookie(nodeWallet.Address) + cookieStreamId, err := StreamIdFromBytes(cookie.StreamId) + assert.NoError(t, err) + assert.NotNil(t, cookie) + assert.Equal(t, streamId, cookieStreamId) + assert.Equal(t, int64(1), cookie.MinipoolGen) + assert.Equal(t, int64(0), cookie.MinipoolSlot) + + // Check minipool, should be empty + assert.Equal(t, 0, len(view.minipool.events.Values)) + + // check for invalid config + num := view.getMinEventsPerSnapshot(&config.StreamConfig{}) + assert.Equal(t, num, 100) // hard coded default + + // check snapshot generation + num = view.getMinEventsPerSnapshot(&streamConfig_t) + assert.Equal(t, minEventsPerSnapshotDefault, num) + assert.Equal(t, false, view.shouldSnapshot(&streamConfig_t)) + + // check per stream snapshot generation + streamConfig_t.MinEventsPerSnapshot[STREAM_USER_PREFIX] = 2 + num = view.getMinEventsPerSnapshot(&streamConfig_t) + assert.Equal(t, minEventsPerSnapshotUserStream, num) + assert.Equal(t, false, view.shouldSnapshot(&streamConfig_t)) + + blockHash := view.LastBlock().Hash + + // add one more event (just join again) + join2, err := MakeEnvelopeWithPayload( + userWallet, + Make_UserPayload_Membership(MembershipOp_SO_JOIN, streamId, nil, nil), + blockHash[:], + ) + assert.NoError(t, err) + nextEvent := parsedEvent(t, join2) + err = view.ValidateNextEvent(ctx, &recencyConstraintsConfig_t, nextEvent, time.Now()) + assert.NoError(t, err) + view, err = view.copyAndAddEvent(nextEvent) + assert.NoError(t, err) + + // with one new event, we shouldn't snapshot yet + assert.Equal(t, false, view.shouldSnapshot(&streamConfig_t)) + + // and miniblocks should have nil snapshots + proposal, _ := view.ProposeNextMiniblock(ctx, &streamConfig_t, false) + miniblockHeader, _, _ = view.makeMiniblockHeader(ctx, proposal) + assert.Nil(t, miniblockHeader.Snapshot) + + // add another join event + join3, err := MakeEnvelopeWithPayload( + userWallet, + Make_UserPayload_Membership(MembershipOp_SO_JOIN, streamId, nil, nil), + view.LastBlock().Hash[:], + ) + assert.NoError(t, err) + nextEvent = parsedEvent(t, join3) + assert.NoError(t, err) + err = view.ValidateNextEvent(ctx, &recencyConstraintsConfig_t, nextEvent, time.Now()) + assert.NoError(t, err) + view, err = view.copyAndAddEvent(nextEvent) + assert.NoError(t, err) + // with two new events, we should snapshot + assert.Equal(t, true, view.shouldSnapshot(&streamConfig_t)) + assert.Equal(t, 1, len(view.blocks)) + assert.Equal(t, 2, len(view.blocks[0].events)) + // and miniblocks should have non - nil snapshots + proposal, _ = view.ProposeNextMiniblock(ctx, &streamConfig_t, false) + miniblockHeader, envelopes, _ := view.makeMiniblockHeader(ctx, proposal) + assert.NotNil(t, miniblockHeader.Snapshot) + + // check count + count := 0 + err = view.forEachEvent(0, func(e *ParsedEvent) (bool, error) { + count++ + return true, nil + }) + assert.NoError(t, err) + assert.Equal(t, int64(3), miniblockHeader.EventNumOffset) // 3 events in the genisis miniblock + assert.Equal(t, 2, len(miniblockHeader.EventHashes)) // 2 join events added in test + assert.Equal(t, 5, count) // we should iterate over all of them + // test copy and apply block + // how many blocks do we currently have? + assert.Equal(t, len(view.blocks), 1) + // create a new block + miniblockHeaderEvent, err := MakeParsedEventWithPayload( + userWallet, + Make_MiniblockHeader(miniblockHeader), + view.LastBlock().Hash[:], + ) + assert.NoError(t, err) + miniblock, err := NewMiniblockInfoFromParsed(miniblockHeaderEvent, envelopes) + assert.NoError(t, err) + // with 5 generations (5 blocks kept in memory) + newSV1, err := view.copyAndApplyBlock(miniblock, &config.StreamConfig{ + RecencyConstraints: config.RecencyConstraintsConfig{ + Generations: 5, + AgeSeconds: 11, + }, + }) + assert.NoError(t, err) + assert.Equal(t, len(newSV1.blocks), 2) // we should have both blocks in memory + // with 0 generations (0 in memory block history) + newSV2, err := view.copyAndApplyBlock(miniblock, &config.StreamConfig{ + RecencyConstraints: config.RecencyConstraintsConfig{ + Generations: 0, + AgeSeconds: 11, + }, + }) + assert.NoError(t, err) + assert.Equal(t, len(newSV2.blocks), 1) // we should only have the latest block in memory + // add an event with an old hash + join4, err := MakeEnvelopeWithPayload( + userWallet, + Make_UserPayload_Membership(MembershipOp_SO_LEAVE, streamId, nil, nil), + newSV1.blocks[0].Hash[:], + ) + assert.NoError(t, err) + nextEvent = parsedEvent(t, join4) + assert.NoError(t, err) + err = newSV1.ValidateNextEvent(ctx, &recencyConstraintsConfig_t, nextEvent, time.Now()) + assert.NoError(t, err) + _, err = newSV1.copyAndAddEvent(nextEvent) + assert.NoError(t, err) + // wait 1 second + time.Sleep(1 * time.Second) + // try with tighter recency constraints + err = newSV1.ValidateNextEvent(ctx, &config.RecencyConstraintsConfig{ + Generations: 5, + AgeSeconds: 1, + }, nextEvent, time.Now()) + assert.Error(t, err) + assert.Contains(t, err.Error(), "BAD_PREV_MINIBLOCK_HASH") +} diff --git a/core/node/events/stream_viewstate_channel.go b/core/node/events/stream_viewstate_channel.go new file mode 100644 index 000000000..d07192f1a --- /dev/null +++ b/core/node/events/stream_viewstate_channel.go @@ -0,0 +1,23 @@ +package events + +import ( + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/protocol" +) + +type ChannelStreamView interface { + JoinableStreamView + GetChannelInception() (*ChannelPayload_Inception, error) +} + +var _ ChannelStreamView = (*streamViewImpl)(nil) + +func (r *streamViewImpl) GetChannelInception() (*ChannelPayload_Inception, error) { + i := r.InceptionPayload() + c, ok := i.(*ChannelPayload_Inception) + if ok { + return c, nil + } else { + return nil, RiverError(Err_WRONG_STREAM_TYPE, "Expected channel stream", "streamId", i.GetStreamId()) + } +} diff --git a/core/node/events/stream_viewstate_dm_channel.go b/core/node/events/stream_viewstate_dm_channel.go new file mode 100644 index 000000000..bce933eed --- /dev/null +++ b/core/node/events/stream_viewstate_dm_channel.go @@ -0,0 +1,23 @@ +package events + +import ( + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/protocol" +) + +type DMChannelStreamView interface { + JoinableStreamView + GetDMChannelInception() (*DmChannelPayload_Inception, error) +} + +var _ DMChannelStreamView = (*streamViewImpl)(nil) + +func (r *streamViewImpl) GetDMChannelInception() (*DmChannelPayload_Inception, error) { + i := r.InceptionPayload() + c, ok := i.(*DmChannelPayload_Inception) + if ok { + return c, nil + } else { + return nil, RiverError(Err_WRONG_STREAM_TYPE, "Expected dm stream", "streamId", i.GetStreamId()) + } +} diff --git a/core/node/events/stream_viewstate_joinable.go b/core/node/events/stream_viewstate_joinable.go new file mode 100644 index 000000000..9b877e3bc --- /dev/null +++ b/core/node/events/stream_viewstate_joinable.go @@ -0,0 +1,143 @@ +package events + +import ( + "bytes" + + "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/shared" + + mapset "github.com/deckarep/golang-set/v2" + "google.golang.org/protobuf/proto" +) + +type JoinableStreamView interface { + StreamView + GetChannelMembers() (*mapset.Set[string], error) + GetMembership(userAddress []byte) (protocol.MembershipOp, error) + GetKeySolicitations(userAddress []byte) ([]*protocol.MemberPayload_KeySolicitation, error) +} + +var _ JoinableStreamView = (*streamViewImpl)(nil) + +func (r *streamViewImpl) GetChannelMembers() (*mapset.Set[string], error) { + members := mapset.NewSet[string]() + + for _, member := range r.snapshot.Members.Joined { + userId, err := shared.AddressHex(member.UserAddress) + if err != nil { + return nil, err + } + members.Add(userId) + } + + updateFn := func(e *ParsedEvent) (bool, error) { + switch payload := e.Event.Payload.(type) { + case *protocol.StreamEvent_MemberPayload: + switch payload := payload.MemberPayload.Content.(type) { + case *protocol.MemberPayload_Membership_: + user, err := shared.AddressHex(payload.Membership.UserAddress) + if err != nil { + return false, err + } + if payload.Membership.GetOp() == protocol.MembershipOp_SO_JOIN { + members.Add(user) + } else if payload.Membership.GetOp() == protocol.MembershipOp_SO_LEAVE { + members.Remove(user) + } + default: + break + } + } + return true, nil + } + + err := r.forEachEvent(r.snapshotIndex+1, updateFn) + if err != nil { + return nil, err + } + + return &members, nil +} + +func (r *streamViewImpl) GetMembership(userAddress []byte) (protocol.MembershipOp, error) { + retValue := protocol.MembershipOp_SO_UNSPECIFIED + + member, _ := findMember(r.snapshot.Members.Joined, userAddress) + if member != nil { + retValue = protocol.MembershipOp_SO_JOIN + } + + updateFn := func(e *ParsedEvent) (bool, error) { + switch payload := e.Event.Payload.(type) { + case *protocol.StreamEvent_MemberPayload: + switch payload := payload.MemberPayload.Content.(type) { + case *protocol.MemberPayload_Membership_: + if bytes.Equal(payload.Membership.UserAddress, userAddress) { + retValue = payload.Membership.Op + } + default: + break + } + } + return true, nil + } + + err := r.forEachEvent(r.snapshotIndex+1, updateFn) + if err != nil { + return retValue, err + } + + return retValue, nil +} + +// Get an up to date solicitations for a channel member +// this function duplicates code in the snapshot.go logic and +// could go away if we kept an up to date snapshot +func (r *streamViewImpl) GetKeySolicitations(userAddress []byte) ([]*protocol.MemberPayload_KeySolicitation, error) { + member, _ := findMember(r.snapshot.Members.Joined, userAddress) + + // clone so we don't modify the snapshot + if member != nil { + member = proto.Clone(member).(*protocol.MemberPayload_Snapshot_Member) + } + + updateFn := func(e *ParsedEvent) (bool, error) { + switch payload := e.Event.Payload.(type) { + case *protocol.StreamEvent_MemberPayload: + switch payload := payload.MemberPayload.Content.(type) { + case *protocol.MemberPayload_Membership_: + if bytes.Equal(payload.Membership.UserAddress, userAddress) { + if payload.Membership.GetOp() == protocol.MembershipOp_SO_JOIN { + member = &protocol.MemberPayload_Snapshot_Member{ + UserAddress: payload.Membership.UserAddress, + } + } else if payload.Membership.GetOp() == protocol.MembershipOp_SO_LEAVE { + member = nil + } + } + case *protocol.MemberPayload_KeySolicitation_: + if member != nil && bytes.Equal(e.Event.CreatorAddress, userAddress) { + applyKeySolicitation(member, payload.KeySolicitation) + } + case *protocol.MemberPayload_KeyFulfillment_: + if member != nil && bytes.Equal(payload.KeyFulfillment.UserAddress, userAddress) { + applyKeyFulfillment(member, payload.KeyFulfillment) + } + default: + break + } + } + return true, nil + } + + err := r.forEachEvent(r.snapshotIndex+1, updateFn) + if err != nil { + return nil, err + } + + if member == nil { + return nil, nil + } else { + return member.Solicitations, nil + } +} diff --git a/core/node/events/stream_viewstate_media.go b/core/node/events/stream_viewstate_media.go new file mode 100644 index 000000000..3945ccc9c --- /dev/null +++ b/core/node/events/stream_viewstate_media.go @@ -0,0 +1,23 @@ +package events + +import ( + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/protocol" +) + +type MediaStreamView interface { + JoinableStreamView + GetMediaInception() (*MediaPayload_Inception, error) +} + +var _ MediaStreamView = (*streamViewImpl)(nil) + +func (r *streamViewImpl) GetMediaInception() (*MediaPayload_Inception, error) { + i := r.InceptionPayload() + c, ok := i.(*MediaPayload_Inception) + if ok { + return c, nil + } else { + return nil, RiverError(Err_WRONG_STREAM_TYPE, "Expected media stream", "streamId", i.GetStreamId()) + } +} diff --git a/core/node/events/stream_viewstate_space.go b/core/node/events/stream_viewstate_space.go new file mode 100644 index 000000000..f157395ea --- /dev/null +++ b/core/node/events/stream_viewstate_space.go @@ -0,0 +1,68 @@ +package events + +import ( + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/shared" +) + +type SpaceStreamView interface { + JoinableStreamView + GetSpaceInception() (*SpacePayload_Inception, error) + GetSpaceSnapshotContent() (*SpacePayload_Snapshot, error) + GetChannelInfo(channelId shared.StreamId) (*SpacePayload_Channel, error) +} + +var _ SpaceStreamView = (*streamViewImpl)(nil) + +func (r *streamViewImpl) GetSpaceInception() (*SpacePayload_Inception, error) { + i := r.InceptionPayload() + c, ok := i.(*SpacePayload_Inception) + if ok { + return c, nil + } else { + return nil, RiverError(Err_WRONG_STREAM_TYPE, "Expected space stream", "streamId", r.streamId) + } +} + +func (r *streamViewImpl) GetSpaceSnapshotContent() (*SpacePayload_Snapshot, error) { + s := r.snapshot.Content + c, ok := s.(*Snapshot_SpaceContent) + if ok { + return c.SpaceContent, nil + } else { + return nil, RiverError(Err_WRONG_STREAM_TYPE, "Expected space stream", "streamId", r.streamId) + } +} + +func (r *streamViewImpl) GetChannelInfo(channelId shared.StreamId) (*SpacePayload_Channel, error) { + snap, err := r.GetSpaceSnapshotContent() + if err != nil { + return nil, err + } + channel, _ := findChannel(snap.Channels, channelId[:]) + + updateFn := func(e *ParsedEvent) (bool, error) { + switch payload := e.Event.Payload.(type) { + case *StreamEvent_SpacePayload: + switch spacePayload := payload.SpacePayload.Content.(type) { + case *SpacePayload_Channel_: + if channelId.EqualsBytes(spacePayload.Channel.ChannelId) { + channel = spacePayload.Channel + } + default: + break + } + default: + break + } + return true, nil + } + + err = r.forEachEvent(r.snapshotIndex+1, updateFn) + if err != nil { + return nil, err + } + + return channel, nil +} diff --git a/core/node/events/stream_viewstate_space_test.go b/core/node/events/stream_viewstate_space_test.go new file mode 100644 index 000000000..79117e08a --- /dev/null +++ b/core/node/events/stream_viewstate_space_test.go @@ -0,0 +1,411 @@ +package events + +import ( + "context" + "testing" + + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/shared" + "github.com/river-build/river/core/node/storage" + "github.com/river-build/river/core/node/testutils" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/proto" +) + +var streamConfig_viewstate_space_t = config.StreamConfig{ + Media: config.MediaStreamConfig{ + MaxChunkCount: 100, + MaxChunkSize: 1000000, + }, + RecencyConstraints: config.RecencyConstraintsConfig{ + AgeSeconds: 5, + Generations: 5, + }, + DefaultMinEventsPerSnapshot: 2, + MinEventsPerSnapshot: map[string]int{}, +} + +func makeEnvelopeWithPayload_T( + t *testing.T, + wallet *crypto.Wallet, + payload protocol.IsStreamEvent_Payload, + prevMiniblockHash []byte, +) *protocol.Envelope { + envelope, err := MakeEnvelopeWithPayload(wallet, payload, prevMiniblockHash) + require.NoError(t, err) + return envelope +} + +func makeTestSpaceStream( + t *testing.T, + userWallet *crypto.Wallet, + spaceId StreamId, + streamSettings *protocol.StreamSettings, +) ([]*ParsedEvent, *protocol.Miniblock) { + userAddess := userWallet.Address.Bytes() + if streamSettings == nil { + streamSettings = &protocol.StreamSettings{ + DisableMiniblockCreation: true, + } + } + inception := makeEnvelopeWithPayload_T( + t, + userWallet, + Make_SpacePayload_Inception( + spaceId, + streamSettings, + ), + nil, + ) + join := makeEnvelopeWithPayload_T( + t, + userWallet, + Make_MemberPayload_Membership(protocol.MembershipOp_SO_JOIN, userAddess, userAddess, nil), + nil, + ) + + events := []*ParsedEvent{ + parsedEvent(t, inception), + parsedEvent(t, join), + } + mb, err := MakeGenesisMiniblock(userWallet, events) + require.NoError(t, err) + return events, mb +} + +func makeTestChannelStream( + t *testing.T, + wallet *crypto.Wallet, + userId string, + channelStreamId StreamId, + spaceSpaceId StreamId, + channelProperties *protocol.EncryptedData, + streamSettings *protocol.StreamSettings, +) ([]*ParsedEvent, *protocol.Miniblock) { + if streamSettings == nil { + streamSettings = &protocol.StreamSettings{ + DisableMiniblockCreation: true, + } + } + if channelProperties == nil { + channelProperties = &protocol.EncryptedData{ + Ciphertext: "encrypted text supposed to be here", + } + } + inception := makeEnvelopeWithPayload_T( + t, + wallet, + Make_ChannelPayload_Inception( + channelStreamId, + spaceSpaceId, + channelProperties, + streamSettings, + ), + nil, + ) + join := makeEnvelopeWithPayload_T( + t, + wallet, + Make_ChannelPayload_Membership(protocol.MembershipOp_SO_JOIN, userId, userId, &spaceSpaceId), + nil, + ) + events := []*ParsedEvent{ + parsedEvent(t, inception), + parsedEvent(t, join), + } + mb, err := MakeGenesisMiniblock(wallet, events) + require.NoError(t, err) + return events, mb +} + +func joinSpace_T( + t *testing.T, + wallet *crypto.Wallet, + ctx context.Context, + syncStream SyncStream, + users []string, +) { + stream := syncStream.(*streamImpl) + for _, user := range users { + err := stream.AddEvent( + ctx, + parsedEvent( + t, + makeEnvelopeWithPayload_T( + t, + wallet, + Make_SpacePayload_Membership( + protocol.MembershipOp_SO_JOIN, + user, + user, + ), + stream.view.LastBlock().Hash[:], + ), + ), + ) + require.NoError(t, err) + } +} + +func joinChannel_T( + t *testing.T, + wallet *crypto.Wallet, + ctx context.Context, + syncStream SyncStream, + users []string, +) { + stream := syncStream.(*streamImpl) + for _, user := range users { + err := stream.AddEvent( + ctx, + parsedEvent( + t, + makeEnvelopeWithPayload_T( + t, + wallet, + Make_ChannelPayload_Membership( + protocol.MembershipOp_SO_JOIN, + user, + user, + stream.view.StreamParentId(), + ), + stream.view.LastBlock().Hash[:], + ), + ), + ) + require.NoError(t, err) + } +} + +func leaveChannel_T( + t *testing.T, + wallet *crypto.Wallet, + ctx context.Context, + syncStream SyncStream, + users []string, +) { + stream := syncStream.(*streamImpl) + for _, user := range users { + err := stream.AddEvent( + ctx, + parsedEvent( + t, + makeEnvelopeWithPayload_T( + t, + wallet, + Make_ChannelPayload_Membership( + protocol.MembershipOp_SO_LEAVE, + user, + user, + nil, + ), + stream.view.LastBlock().Hash[:], + ), + ), + ) + require.NoError(t, err) + } +} + +func TestSpaceViewState(t *testing.T) { + ctx, tt := makeTestStreamCache(testParams{}) + defer tt.closer() + + user1Wallet, _ := crypto.NewWallet(ctx) + user2Wallet, _ := crypto.NewWallet(ctx) + user3Wallet, _ := crypto.NewWallet(ctx) + + // create a stream + spaceStreamId := testutils.FakeStreamId(STREAM_SPACE_BIN) + user2Id, err := AddressHex(user2Wallet.Address.Bytes()) + require.NoError(t, err) + user3Id, err := AddressHex(user3Wallet.Address.Bytes()) + require.NoError(t, err) + + _, mb := makeTestSpaceStream(t, user1Wallet, spaceStreamId, nil) + s, _, err := tt.createStream(ctx, spaceStreamId, mb) + require.NoError(t, err) + stream := s.(*streamImpl) + require.NotNil(t, stream) + // refresh view + view0, err := stream.GetView(ctx) + require.NoError(t, err) + // check that users 2 and 3 are not joined yet, + spaceViewStateTest_CheckUserJoined(t, view0.(JoinableStreamView), user1Wallet, true) + spaceViewStateTest_CheckUserJoined(t, view0.(JoinableStreamView), user2Wallet, false) + spaceViewStateTest_CheckUserJoined(t, view0.(JoinableStreamView), user3Wallet, false) + // add two more membership events + // user_2 + joinSpace_T(t, user2Wallet, ctx, stream, []string{user2Id}) + // user_3 + joinSpace_T(t, user3Wallet, ctx, stream, []string{user3Id}) + // get a new view + view1, err := stream.GetView(ctx) + require.NoError(t, err) + // users show up as joined immediately, because we need that information to continue to add events + spaceViewStateTest_CheckUserJoined(t, view1.(JoinableStreamView), user1Wallet, true) + spaceViewStateTest_CheckUserJoined(t, view1.(JoinableStreamView), user2Wallet, true) + spaceViewStateTest_CheckUserJoined(t, view1.(JoinableStreamView), user3Wallet, true) + // make a miniblock + _, _, err = stream.TestMakeMiniblock(ctx, false, -1) + require.NoError(t, err) + // check that we have 2 blocks + require.Equal(t, 2, len(stream.view.blocks)) + // refresh view + view2, err := stream.GetView(ctx) + require.NoError(t, err) + // check that users are joined + spaceViewStateTest_CheckUserJoined(t, view2.(JoinableStreamView), user1Wallet, true) + spaceViewStateTest_CheckUserJoined(t, view2.(JoinableStreamView), user2Wallet, true) + spaceViewStateTest_CheckUserJoined(t, view2.(JoinableStreamView), user3Wallet, true) + // now, turn that block into bytes, then load it back into a view + miniblocks := stream.view.MiniblocksFromLastSnapshot() + require.Equal(t, 1, len(miniblocks)) + miniblock := miniblocks[0] + miniblockProtoBytes, err := proto.Marshal(miniblock) + require.NoError(t, err) + + // load up a brand new view from the latest snapshot result + var view3 StreamView + view3, err = MakeStreamView(&storage.ReadStreamFromLastSnapshotResult{ + StartMiniblockNumber: 1, + Miniblocks: [][]byte{miniblockProtoBytes}, + }) + require.NoError(t, err) + require.NotNil(t, view3) + + // check that users are joined when loading from the snapshot + spaceViewStateTest_CheckUserJoined(t, view3.(JoinableStreamView), user1Wallet, true) + spaceViewStateTest_CheckUserJoined(t, view3.(JoinableStreamView), user2Wallet, true) + spaceViewStateTest_CheckUserJoined(t, view3.(JoinableStreamView), user3Wallet, true) +} + +func spaceViewStateTest_CheckUserJoined( + t *testing.T, + view JoinableStreamView, + userWallet *crypto.Wallet, + expected bool, +) { + joined, err := view.IsMember(userWallet.Address.Bytes()) + require.NoError(t, err) + require.Equal(t, expected, joined) +} + +func TestChannelViewState_JoinedMembers(t *testing.T) { + ctx, tt := makeTestStreamCache(testParams{}) + defer tt.closer() + + userWallet, _ := crypto.NewWallet(ctx) + aliceWallet, _ := crypto.NewWallet(ctx) + bobWallet, _ := crypto.NewWallet(ctx) + carolWallet, _ := crypto.NewWallet(ctx) + alice, err := AddressHex(aliceWallet.Address.Bytes()) + require.NoError(t, err) + bob, err := AddressHex(bobWallet.Address.Bytes()) + require.NoError(t, err) + carol, err := AddressHex(carolWallet.Address.Bytes()) + require.NoError(t, err) + spaceStreamId := testutils.FakeStreamId(STREAM_SPACE_BIN) + channelStreamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + + // create a space stream and add the members + _, mb := makeTestSpaceStream(t, userWallet, spaceStreamId, nil) + sStream, _, err := tt.createStream(ctx, spaceStreamId, mb) + require.NoError(t, err) + spaceStream := sStream.(*streamImpl) + joinSpace_T(t, userWallet, ctx, spaceStream, []string{bob, carol}) + // create a channel stream and add the members + _, mb = makeTestChannelStream(t, userWallet, alice, channelStreamId, spaceStreamId, nil, nil) + cStream, _, _ := tt.createStream(ctx, channelStreamId, mb) + channelStream := cStream.(*streamImpl) + joinChannel_T(t, userWallet, ctx, channelStream, []string{alice, bob, carol}) + // make a miniblock + _, _, err = channelStream.TestMakeMiniblock(ctx, false, -1) + require.NoError(t, err) + // get the miniblock's last snapshot and convert it into bytes + miniblocks := channelStream.view.MiniblocksFromLastSnapshot() + miniblock := miniblocks[0] + miniblockProtoBytes, _ := proto.Marshal(miniblock) + // create a stream view from the miniblock bytes + var streamView StreamView + streamView, err = MakeStreamView(&storage.ReadStreamFromLastSnapshotResult{ + StartMiniblockNumber: 1, + Miniblocks: [][]byte{miniblockProtoBytes}, + }) + require.NoError(t, err) + + /* Act */ + // create a channel view from the stream view + channelView := streamView.(JoinableStreamView) + allJoinedMembers, err := channelView.GetChannelMembers() + + /* Assert */ + require.NoError(t, err) + require.Equal(t, (*allJoinedMembers).Cardinality(), 3) + require.Equal(t, (*allJoinedMembers).Contains(alice), true) + require.Equal(t, (*allJoinedMembers).Contains(bob), true) + require.Equal(t, (*allJoinedMembers).Contains(carol), true) +} + +func TestChannelViewState_RemainingMembers(t *testing.T) { + ctx, tt := makeTestStreamCache(testParams{}) + defer tt.closer() + + userWallet, _ := crypto.NewWallet(ctx) + aliceWallet, _ := crypto.NewWallet(ctx) + bobWallet, _ := crypto.NewWallet(ctx) + carolWallet, _ := crypto.NewWallet(ctx) + alice, err := AddressHex(aliceWallet.Address.Bytes()) + require.NoError(t, err) + bob, err := AddressHex(bobWallet.Address.Bytes()) + require.NoError(t, err) + carol, err := AddressHex(carolWallet.Address.Bytes()) + require.NoError(t, err) + spaceStreamId := testutils.FakeStreamId(STREAM_SPACE_BIN) + channelStreamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + + // create a space stream and add the members + _, mb := makeTestSpaceStream(t, userWallet, spaceStreamId, nil) + sStream, _, err := tt.createStream(ctx, spaceStreamId, mb) + require.NoError(t, err) + spaceStream := sStream.(*streamImpl) + joinSpace_T(t, userWallet, ctx, spaceStream, []string{bob, carol}) + // create a channel stream and add the members + _, mb = makeTestChannelStream(t, userWallet, alice, channelStreamId, spaceStreamId, nil, nil) + cStream, _, err := tt.createStream(ctx, channelStreamId, mb) + require.NoError(t, err) + channelStream := cStream.(*streamImpl) + joinChannel_T(t, userWallet, ctx, channelStream, []string{alice, bob, carol}) + // bob leaves the channel + leaveChannel_T(t, userWallet, ctx, channelStream, []string{bob}) + // make a miniblock + _, _, err = channelStream.TestMakeMiniblock(ctx, false, -1) + require.NoError(t, err) + // get the miniblock's last snapshot and convert it into bytes + miniblocks := channelStream.view.MiniblocksFromLastSnapshot() + miniblock := miniblocks[0] + miniblockProtoBytes, _ := proto.Marshal(miniblock) + // create a stream view from the miniblock bytes + var streamView StreamView + streamView, err = MakeStreamView(&storage.ReadStreamFromLastSnapshotResult{ + StartMiniblockNumber: 1, + Miniblocks: [][]byte{miniblockProtoBytes}, + }) + require.NoError(t, err) + + /* Act */ + // create a channel view from the stream view + channelView := streamView.(JoinableStreamView) + allJoinedMembers, err := channelView.GetChannelMembers() + + /* Assert */ + require.NoError(t, err) + assert.Equal(t, 2, (*allJoinedMembers).Cardinality()) + assert.Equal(t, true, (*allJoinedMembers).Contains(alice)) + assert.Equal(t, false, (*allJoinedMembers).Contains(bob)) + assert.Equal(t, true, (*allJoinedMembers).Contains(carol)) +} diff --git a/core/node/events/stream_viewstate_user.go b/core/node/events/stream_viewstate_user.go new file mode 100644 index 000000000..156261489 --- /dev/null +++ b/core/node/events/stream_viewstate_user.go @@ -0,0 +1,84 @@ +package events + +import ( + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/shared" +) + +type UserStreamView interface { + GetUserInception() (*UserPayload_Inception, error) + GetUserMembership(streamId shared.StreamId) (MembershipOp, error) + IsMemberOf(streamId shared.StreamId) bool +} + +var _ UserStreamView = (*streamViewImpl)(nil) + +func (r *streamViewImpl) GetUserInception() (*UserPayload_Inception, error) { + i := r.InceptionPayload() + c, ok := i.(*UserPayload_Inception) + if ok { + return c, nil + } else { + return nil, RiverError(Err_WRONG_STREAM_TYPE, "Expected user stream", "streamId", r.streamId) + } +} + +func (r *streamViewImpl) GetUserSnapshotContent() (*UserPayload_Snapshot, error) { + s := r.snapshot.Content + c, ok := s.(*Snapshot_UserContent) + if ok { + return c.UserContent, nil + } else { + return nil, RiverError(Err_WRONG_STREAM_TYPE, "Expected user stream", "streamId", r.streamId) + } +} + +func (r *streamViewImpl) IsMemberOf(streamId shared.StreamId) bool { + if streamId == r.streamId { + return true + } + + userMembershipOp, err := r.GetUserMembership(streamId) + if err != nil { + return false + } + return userMembershipOp == MembershipOp_SO_JOIN +} + +func (r *streamViewImpl) GetUserMembership(streamId shared.StreamId) (MembershipOp, error) { + retValue := MembershipOp_SO_UNSPECIFIED + + snap, err := r.GetUserSnapshotContent() + if err != nil { + return retValue, err + } + membership, _ := findUserMembership( + snap.Memberships, + streamId[:], + ) + + if membership != nil { + retValue = membership.Op + } + + updateFn := func(e *ParsedEvent) (bool, error) { + switch payload := e.Event.Payload.(type) { + case *StreamEvent_UserPayload: + switch payload := payload.UserPayload.Content.(type) { + case *UserPayload_UserMembership_: + if streamId.EqualsBytes(payload.UserMembership.StreamId) { + retValue = payload.UserMembership.Op + } + default: + break + } + default: + break + } + return true, nil // return forEachEvent + } + + err = r.forEachEvent(r.snapshotIndex+1, updateFn) + return retValue, err +} diff --git a/core/node/events/sync_cookie.go b/core/node/events/sync_cookie.go new file mode 100644 index 000000000..c2a548c2c --- /dev/null +++ b/core/node/events/sync_cookie.go @@ -0,0 +1,45 @@ +package events + +import ( + "bytes" + + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/protocol" +) + +func SyncCookieEqual(a, b *SyncCookie) bool { + if a == nil || b == nil { + return a == b + } + return bytes.Equal(a.NodeAddress[:], b.NodeAddress[:]) && + bytes.Equal(a.StreamId, b.StreamId) && + a.MinipoolGen == b.MinipoolGen && + a.MinipoolSlot == b.MinipoolSlot && + bytes.Equal(a.PrevMiniblockHash, b.PrevMiniblockHash) +} + +func SyncCookieCopy(a *SyncCookie) *SyncCookie { + if a == nil { + return nil + } + return &SyncCookie{ + NodeAddress: a.NodeAddress, + StreamId: a.StreamId, + MinipoolGen: a.MinipoolGen, + MinipoolSlot: a.MinipoolSlot, + PrevMiniblockHash: a.PrevMiniblockHash, + } +} + +func SyncCookieValidate(cookie *SyncCookie) error { + if cookie == nil || + len(cookie.NodeAddress) == 0 || + len(cookie.StreamId) == 0 || + cookie.MinipoolGen <= 0 || + cookie.MinipoolSlot < 0 || + cookie.PrevMiniblockHash == nil || + len(cookie.PrevMiniblockHash) <= 0 { + return RiverError(Err_BAD_SYNC_COOKIE, "Bad SyncCookie", "cookie=", cookie) + } + return nil +} diff --git a/core/node/events/sync_cookie_test.go b/core/node/events/sync_cookie_test.go new file mode 100644 index 000000000..8d448035e --- /dev/null +++ b/core/node/events/sync_cookie_test.go @@ -0,0 +1,50 @@ +package events + +import ( + "testing" + + "github.com/river-build/river/core/node/base/test" + "github.com/river-build/river/core/node/crypto" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/shared" + "github.com/river-build/river/core/node/testutils" + + "github.com/stretchr/testify/require" +) + +func TestEqualAndCopy(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + nodeWallet1, _ := crypto.NewWallet(ctx) + nodeWallet2, _ := crypto.NewWallet(ctx) + require.True(t, SyncCookieEqual(nil, nil)) + stream1Id := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + badStreamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + + a := &SyncCookie{ + NodeAddress: nodeWallet1.Address[:], + StreamId: stream1Id[:], + MinipoolGen: 5, + MinipoolSlot: 10, + PrevMiniblockHash: []byte{0, 1, 2, 4}, + } + require.True(t, SyncCookieEqual(a, a)) + require.False(t, SyncCookieEqual(nil, a)) + require.False(t, SyncCookieEqual(a, nil)) + b := SyncCookieCopy(a) + require.True(t, SyncCookieEqual(a, b)) + b.StreamId = badStreamId[:] + require.False(t, SyncCookieEqual(a, b)) + b = SyncCookieCopy(a) + b.MinipoolGen = 6 + require.False(t, SyncCookieEqual(a, b)) + b = SyncCookieCopy(a) + b.PrevMiniblockHash = []byte{0, 1, 2, 5} + require.False(t, SyncCookieEqual(a, b)) + b = SyncCookieCopy(a) + b.NodeAddress = nodeWallet2.Address[:] + require.False(t, SyncCookieEqual(a, b)) + b = SyncCookieCopy(a) + b.MinipoolSlot = 11 + require.False(t, SyncCookieEqual(a, b)) +} diff --git a/core/node/events/util_test.go b/core/node/events/util_test.go new file mode 100644 index 000000000..74a89ec5a --- /dev/null +++ b/core/node/events/util_test.go @@ -0,0 +1,125 @@ +package events + +import ( + "context" + + "github.com/ethereum/go-ethereum/common" + "github.com/river-build/river/core/node/base/test" + "github.com/river-build/river/core/node/crypto" + . "github.com/river-build/river/core/node/nodes" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/registries" + . "github.com/river-build/river/core/node/shared" + "github.com/river-build/river/core/node/storage" + "google.golang.org/protobuf/proto" +) + +type testContext struct { + bcTest *crypto.BlockchainTestContext + params *StreamCacheParams + cache StreamCache + streamRegistry StreamRegistry + closer func() +} + +type testParams struct { + replFactor int +} + +func makeTestStreamParams(p testParams) (context.Context, *testContext) { + ctx, cancel := test.NewTestContext() + btc, err := crypto.NewBlockchainTestContext(ctx, 1, true) + if err != nil { + panic(err) + } + + err = btc.InitNodeRecord(ctx, 0, "fakeurl") + if err != nil { + panic(err) + } + + bc := btc.GetBlockchain(ctx, 0) + + pg := storage.NewTestPgStore(ctx) + + cfg := btc.RegistryConfig() + registry, err := registries.NewRiverRegistryContract(ctx, bc, &cfg) + if err != nil { + panic(err) + } + + blockNumber := btc.BlockNum(ctx) + + nr, err := LoadNodeRegistry(ctx, registry, bc.Wallet.Address, blockNumber, bc.ChainMonitor) + if err != nil { + panic(err) + } + + sr := NewStreamRegistry(bc.Wallet.Address, nr, registry, p.replFactor, btc.OnChainConfig) + + params := &StreamCacheParams{ + Storage: pg.Storage, + Wallet: bc.Wallet, + Riverchain: bc, + Registry: registry, + StreamConfig: &streamConfig_viewstate_space_t, + } + + cache, err := NewStreamCache(ctx, params, blockNumber, bc.ChainMonitor) + if err != nil { + panic(err) + } + + return ctx, + &testContext{ + bcTest: btc, + params: params, + cache: cache, + streamRegistry: sr, + closer: func() { + btc.Close() + pg.Close() + cancel() + }, + } +} + +func makeTestStreamCache(p testParams) (context.Context, *testContext) { + ctx, testContext := makeTestStreamParams(p) + + bc := testContext.bcTest.GetBlockchain(ctx, 0) + + blockNumber, err := bc.GetBlockNumber(ctx) + if err != nil { + testContext.closer() + panic(err) + } + + streamCache, err := NewStreamCache(ctx, testContext.params, blockNumber, bc.ChainMonitor) + if err != nil { + testContext.closer() + panic(err) + } + testContext.cache = streamCache + + return ctx, testContext +} + +func (tt *testContext) createStream( + ctx context.Context, + streamId StreamId, + genesisMiniblock *Miniblock, +) (SyncStream, StreamView, error) { + mbBytes, err := proto.Marshal(genesisMiniblock) + if err != nil { + return nil, nil, err + } + + _, err = tt.streamRegistry.AllocateStream(ctx, streamId, common.BytesToHash( + genesisMiniblock.Header.Hash), mbBytes) + if err != nil { + return nil, nil, err + } + + return tt.cache.CreateStream(ctx, streamId) +} diff --git a/core/node/fmt.sh b/core/node/fmt.sh new file mode 100755 index 000000000..212fd9c27 --- /dev/null +++ b/core/node/fmt.sh @@ -0,0 +1,21 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +# In addition to running gofumpt this script also limits line length to 120 characters +# There is no good way to run golines for single file from .vscode +# due to this bug: https://github.com/golang/vscode-go/issues/2582 + +# Set ARGS to -w if not set, otherwie to cmd line args +ARGS=${@:-"-w"} + +OUTPUT=$(go list -f '{{.Dir}}' ./... | grep -v /contracts | grep -v /protocol | grep -v /mocks | xargs golines --base-formatter=gofumpt --max-len=120 $ARGS) +if [ -n "$OUTPUT" ] +then + echo "$OUTPUT" +fi + +if [ "$ARGS" == "-l" ] && [ -n "$OUTPUT" ] +then + exit 1 +fi diff --git a/core/node/generate_mocks.sh b/core/node/generate_mocks.sh new file mode 100755 index 000000000..f551104b6 --- /dev/null +++ b/core/node/generate_mocks.sh @@ -0,0 +1 @@ +go run github.com/vektra/mockery/v2@v2.40.3 \ No newline at end of file diff --git a/core/node/go.mod b/core/node/go.mod new file mode 100644 index 000000000..d74f4c25e --- /dev/null +++ b/core/node/go.mod @@ -0,0 +1,155 @@ +module github.com/river-build/river/core/node + +go 1.22.2 + +replace github.com/river-build/river/core/xchain => ./../xchain + +require ( + connectrpc.com/connect v1.14.0 + github.com/deckarep/golang-set/v2 v2.3.1 + github.com/ethereum/go-ethereum v1.13.12 + github.com/golang-migrate/migrate/v4 v4.17.0 + github.com/gorilla/mux v1.8.0 + github.com/hashicorp/golang-lru/arc/v2 v2.0.7 + github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa + github.com/jackc/pgx/v5 v5.5.5 + github.com/kr/text v0.2.0 + github.com/matoous/go-nanoid v1.5.0 + github.com/mitchellh/mapstructure v1.5.0 + github.com/prometheus/client_golang v1.16.0 + github.com/river-build/river/core/xchain v0.0.0-00010101000000-000000000000 + github.com/rogpeppe/go-internal v1.11.0 + github.com/rs/cors v1.9.0 + github.com/spf13/cobra v1.8.0 + github.com/spf13/viper v1.18.2 + github.com/stretchr/testify v1.9.0 + golang.org/x/crypto v0.21.0 + golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 + golang.org/x/net v0.21.0 + golang.org/x/text v0.14.0 + golang.org/x/tools v0.17.0 + google.golang.org/protobuf v1.32.0 + gopkg.in/DataDog/dd-trace-go.v1 v1.57.0 + gopkg.in/yaml.v3 v3.0.1 +) + +require ( + github.com/google/uuid v1.4.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect +) + +require ( + github.com/DataDog/appsec-internal-go v1.0.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.48.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.48.1 // indirect + github.com/DataDog/datadog-go/v5 v5.3.0 // indirect + github.com/DataDog/go-libddwaf v1.5.0 // indirect + github.com/DataDog/go-tuf v1.0.2-0.5.2 // indirect + github.com/DataDog/gostackparse v0.7.0 // indirect + github.com/DataDog/sketches-go v1.4.2 // indirect + github.com/DataDog/zstd v1.4.5 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.13.0 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cockroachdb/errors v1.8.1 // indirect + github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect + github.com/cockroachdb/redact v1.0.8 // indirect + github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.5.0-alpha.1 // indirect + github.com/ethereum/c-kzg-4844 v0.4.1 // indirect + github.com/fjl/memsize v0.0.2 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect + github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/gofrs/flock v0.8.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-bexpr v0.1.10 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/hcl v1.0.1-vault-5 // indirect + github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect + github.com/huin/goupnp v1.3.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect + github.com/jackpal/go-nat-pmp v1.0.2 // indirect + github.com/jarcoal/httpmock v1.3.1 + github.com/klauspost/compress v1.17.1 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mitchellh/pointerstructure v1.2.0 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/pelletier/go-toml/v2 v2.1.1 // indirect + github.com/philhofer/fwd v1.1.2 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/procfs v0.11.1 // indirect + github.com/richardartoul/molecule v1.0.1-0.20221107223329-32cfee06a052 // indirect + github.com/rivo/uniseg v0.4.4 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.7.0 // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/status-im/keycard-go v0.2.0 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/supranational/blst v0.3.11 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + github.com/tinylib/msgp v1.1.8 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/urfave/cli/v2 v2.25.7 // indirect + github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect + github.com/yusufpapurcu/wmi v1.2.3 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go4.org/intern v0.0.0-20230525184215-6c62f75575cb // indirect + go4.org/unsafe/assume-no-moving-gc v0.0.0-20230525183740-e7c30c78aeb2 // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/sync v0.6.0 + golang.org/x/sys v0.18.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect + inet.af/netaddr v0.0.0-20230525184311-b8eac61e914a // indirect + rsc.io/tmplfunc v0.0.3 // indirect +) diff --git a/core/node/go.sum b/core/node/go.sum new file mode 100644 index 000000000..64e53a4ef --- /dev/null +++ b/core/node/go.sum @@ -0,0 +1,702 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +connectrpc.com/connect v1.14.0 h1:PDS+J7uoz5Oui2VEOMcfz6Qft7opQM9hPiKvtGC01pA= +connectrpc.com/connect v1.14.0/go.mod h1:uoAq5bmhhn43TwhaKdGKN/bZcGtzPW1v+ngDTn5u+8s= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= +github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= +github.com/DataDog/appsec-internal-go v1.0.0 h1:2u5IkF4DBj3KVeQn5Vg2vjPUtt513zxEYglcqnd500U= +github.com/DataDog/appsec-internal-go v1.0.0/go.mod h1:+Y+4klVWKPOnZx6XESG7QHydOaUGEXyH2j/vSg9JiNM= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.48.0 h1:bUMSNsw1iofWiju9yc1f+kBd33E3hMJtq9GuU602Iy8= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.48.0/go.mod h1:HzySONXnAgSmIQfL6gOv9hWprKJkx8CicuXuUbmgWfo= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.48.1 h1:5nE6N3JSs2IG3xzMthNFhXfOaXlrsdgqmJ73lndFf8c= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.48.1/go.mod h1:Vc+snp0Bey4MrrJyiV2tVxxJb6BmLomPvN1RgAvjGaQ= +github.com/DataDog/datadog-go/v5 v5.3.0 h1:2q2qjFOb3RwAZNU+ez27ZVDwErJv5/VpbBPprz7Z+s8= +github.com/DataDog/datadog-go/v5 v5.3.0/go.mod h1:XRDJk1pTc00gm+ZDiBKsjh7oOOtJfYfglVCmFb8C2+Q= +github.com/DataDog/go-libddwaf v1.5.0 h1:lrHP3VrEriy1M5uQuaOcKphf5GU40mBhihMAp6Ik55c= +github.com/DataDog/go-libddwaf v1.5.0/go.mod h1:Fpnmoc2k53h6desQrH1P0/gR52CUzkLNFugE5zWwUBQ= +github.com/DataDog/go-tuf v1.0.2-0.5.2 h1:EeZr937eKAWPxJ26IykAdWA4A0jQXJgkhUjqEI/w7+I= +github.com/DataDog/go-tuf v1.0.2-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.2 h1:gppNudE9d19cQ98RYABOetxIhpTCl4m7CnbRZjvVA/o= +github.com/DataDog/sketches-go v1.4.2/go.mod h1:xJIXldczJyyjnbDop7ZZcLxJdV3+7Kra7H1KMgpgkLk= +github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= +github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= +github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= +github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= +github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= +github.com/cockroachdb/redact v1.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw= +github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set/v2 v2.3.1 h1:vjmkvJt/IV27WXPyYQpAh4bRyWJc5Y435D17XQ9QU5A= +github.com/deckarep/golang-set/v2 v2.3.1/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dhui/dktest v0.4.0 h1:z05UmuXZHO/bgj/ds2bGMBu8FI4WA+Ag/m3ghL+om7M= +github.com/dhui/dktest v0.4.0/go.mod h1:v/Dbz1LgCBOi2Uki2nUqLBGa83hWBGFMu5MrgMDCc78= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= +github.com/ebitengine/purego v0.5.0-alpha.1 h1:0gVgWGb8GjKYs7cufvfNSleJAD00m2xWC26FMwOjNrw= +github.com/ebitengine/purego v0.5.0-alpha.1/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= +github.com/ethereum/c-kzg-4844 v0.4.1 h1:ftiEBwhGX3Q08lJiMEfoSmqiUZPyad0exVSmGLjyPuc= +github.com/ethereum/c-kzg-4844 v0.4.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.12 h1:iDr9UM2JWkngBHGovRJEQn4Kor7mT4gt9rUZqB5M29Y= +github.com/ethereum/go-ethereum v1.13.12/go.mod h1:hKL2Qcj1OvStXNSEDbucexqnEt1Wh4Cz329XsjAalZY= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-migrate/migrate/v4 v4.17.0 h1:rd40H3QXU0AA4IoLllFcEAEo9dYKRHYND2gB4p7xcaU= +github.com/golang-migrate/migrate/v4 v4.17.0/go.mod h1:+Cp2mtLP4/aXDTKb9wmXYitdrNx2HGs45rbWAo6OsKM= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b h1:h9U78+dx9a4BKdQkBBos92HalKpaGKHrp+3Uo6yTodo= +github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru/arc/v2 v2.0.7 h1:QxkVTxwColcduO+LP7eJO56r2hFiG8zEbfAAzRv52KQ= +github.com/hashicorp/golang-lru/arc/v2 v2.0.7/go.mod h1:Pe7gBlGdc8clY5LJ0LpJXMt5AmgmWNH1g+oFFVUHOEc= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM= +github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= +github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= +github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa h1:s+4MhCQ6YrzisK6hFJUX53drDT4UsSW3DEhKn0ifuHw= +github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa/go.mod h1:a/s9Lp5W7n/DD0VrVoyJ00FbP2ytTPDVOivvn2bMlds= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA= +github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw= +github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww= +github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= +github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= +github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= +github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.17.1 h1:NE3C767s2ak2bweCZo3+rdP4U/HoyVXLv/X9f2gPS5g= +github.com/klauspost/compress v1.17.1/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/matoous/go-nanoid v1.5.0 h1:VRorl6uCngneC4oUQqOYtO3S0H5QKFtKuKycFG3euek= +github.com/matoous/go-nanoid v1.5.0/go.mod h1:zyD2a71IubI24efhpvkJz+ZwfwagzgSO6UNiFsZKN7U= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= +github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= +github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= +github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= +github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= +github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= +github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= +github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= +github.com/richardartoul/molecule v1.0.1-0.20221107223329-32cfee06a052 h1:Qp27Idfgi6ACvFQat5+VJvlYToylpM/hcyLBI3WaKPA= +github.com/richardartoul/molecule v1.0.1-0.20221107223329-32cfee06a052/go.mod h1:uvX/8buq8uVeiZiFht+0lqSLBHF+uGV8BrTv8W/SIwk= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= +github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= +github.com/secure-systems-lab/go-securesystemslib v0.7.0 h1:OwvJ5jQf9LnIAS83waAjPbcMsODrTQUpJ02eNLUoxBg= +github.com/secure-systems-lab/go-securesystemslib v0.7.0/go.mod h1:/2gYnlnHVQ6xeGtfIqFy7Do03K4cdCY0A/GlJLDKLHI= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= +github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= +github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= +github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go4.org/intern v0.0.0-20211027215823-ae77deb06f29/go.mod h1:cS2ma+47FKrLPdXFpr7CuxiTW3eyJbWew4qx0qtQWDA= +go4.org/intern v0.0.0-20230525184215-6c62f75575cb h1:ae7kzL5Cfdmcecbh22ll7lYP3iuUdnfnhiPcSaDgH/8= +go4.org/intern v0.0.0-20230525184215-6c62f75575cb/go.mod h1:Ycrt6raEcnF5FTsLiLKkhBTO6DPX3RCUCUVnks3gFJU= +go4.org/unsafe/assume-no-moving-gc v0.0.0-20211027215541-db492cf91b37/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= +go4.org/unsafe/assume-no-moving-gc v0.0.0-20230525183740-e7c30c78aeb2 h1:WJhcL4p+YeDxmZWg141nRm7XC8IDmhz7lk5GpadO1Sg= +go4.org/unsafe/assume-no-moving-gc v0.0.0-20230525183740-e7c30c78aeb2/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 h1:/RIbNt/Zr7rVhIkQhooTxCxFcdWLGIKnZA4IXNFSrvo= +golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/DataDog/dd-trace-go.v1 v1.57.0 h1:fhF8rUmpJhXT6wQVKcfm0Wc4VfBwthgLabjQOJR2HV0= +gopkg.in/DataDog/dd-trace-go.v1 v1.57.0/go.mod h1:ANES99E9pKUJ22wHBQkMsrt776+lz7V1nwAanwibU7U= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +honnef.co/go/gotraceui v0.2.0 h1:dmNsfQ9Vl3GwbiVD7Z8d/osC6WtGGrasyrC2suc4ZIQ= +honnef.co/go/gotraceui v0.2.0/go.mod h1:qHo4/W75cA3bX0QQoSvDjbJa4R8mAyyFjbWAj63XElc= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +inet.af/netaddr v0.0.0-20230525184311-b8eac61e914a h1:1XCVEdxrvL6c0TGOhecLuB7U9zYNdxZEjvOqJreKZiM= +inet.af/netaddr v0.0.0-20230525184311-b8eac61e914a/go.mod h1:e83i32mAQOW1LAqEIweALsuK2Uw4mhQadA5r7b0Wobo= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/core/node/http_client/client.go b/core/node/http_client/client.go new file mode 100644 index 000000000..b874739f4 --- /dev/null +++ b/core/node/http_client/client.go @@ -0,0 +1,74 @@ +package http_client + +import ( + "context" + "crypto/tls" + "crypto/x509" + "net/http" + "os" + "path/filepath" + + "github.com/river-build/river/core/node/dlog" + "golang.org/x/net/http2" +) + +// getTLSConfig returns a tls.Config with the system cert pool +// and any additional CA certs specified in the config file. +func getTLSConfig(ctx context.Context) *tls.Config { + log := dlog.FromCtx(ctx) + // Load the system cert pool + sysCerts, err := x509.SystemCertPool() + if err != nil { + log.Warn("getTLSConfig Error loading system certs", "err", err) + return nil + } + + // Attempt to load ~/river-ca-cert.pem + homeDir, err := os.UserHomeDir() + if err != nil { + log.Warn("getTLSConfig Failed to get user home directory:", "err", err) + return nil + } + // TODO - hook this up to the config file + riverCaCertPath := filepath.Join(homeDir, "river-ca-cert.pem") + riverCaCertPEM, err := os.ReadFile(riverCaCertPath) + if err != nil { + return nil + } + + log.Warn("getTLSConfig using river CA cert file for development only", "err", err) + + // Append river CA cert to the system cert pool + if ok := sysCerts.AppendCertsFromPEM(riverCaCertPEM); !ok { + log.Error("Failed to append river CA cert to system cert pool") + return nil + } + + tlsConfig := &tls.Config{ + RootCAs: sysCerts, + } + + return tlsConfig +} + +// GetHttpClient returns a http client with TLS configuration +// set using any CA set in the config file. Needed so we can use a +// test CA in the test suite. Running under github action environment +// there was no other way to get the test CA into the client. +func GetHttpClient(ctx context.Context) (*http.Client, error) { + return &http.Client{ + Transport: &http2.Transport{ + TLSClientConfig: getTLSConfig(ctx), + }, + }, nil +} + +func GetHttp11Client(ctx context.Context) (*http.Client, error) { + return &http.Client{ + Transport: &http.Transport{ + TLSClientConfig: getTLSConfig(ctx), + ForceAttemptHTTP2: false, + TLSNextProto: map[string]func(authority string, c *tls.Conn) http.RoundTripper{}, + }, + }, nil +} diff --git a/core/node/infra/config/config.go b/core/node/infra/config/config.go new file mode 100644 index 000000000..b95494587 --- /dev/null +++ b/core/node/infra/config/config.go @@ -0,0 +1,17 @@ +package infra_config + +type LogConfig struct { + Level string // Used for both file and console if their levels not set explicitly + File string // Path to log file + FileLevel string // If not set, use Level + Console bool // Log to sederr if true + ConsoleLevel string // If not set, use Level + NoColor bool + Format string // "json" or "text" +} + +type MetricsConfig struct { + Enabled bool + Interface string + Port int +} diff --git a/core/node/infra/constants.go b/core/node/infra/constants.go new file mode 100644 index 000000000..eba9f2985 --- /dev/null +++ b/core/node/infra/constants.go @@ -0,0 +1,5 @@ +package infra + +const ( + CHAIN_ID_LOCALHOST = 31337 +) diff --git a/core/node/infra/logging.go b/core/node/infra/logging.go new file mode 100644 index 000000000..c63ee59fd --- /dev/null +++ b/core/node/infra/logging.go @@ -0,0 +1,107 @@ +package infra + +import ( + "fmt" + "log/slog" + "os" + + "github.com/river-build/river/core/node/dlog" + config "github.com/river-build/river/core/node/infra/config" +) + +var ( + fileLogLevel slog.LevelVar + consoleLogLevel slog.LevelVar +) + +func InitLogFromConfig(c *config.LogConfig) { + commonLevel := slog.LevelInfo + if c.Level != "" { + err := commonLevel.UnmarshalText([]byte(c.Level)) + if err != nil { + fmt.Printf("Failed to parse log level, level=%s, error=%v\n", c.Level, err) + } + } + + if c.ConsoleLevel != "" { + err := consoleLogLevel.UnmarshalText([]byte(c.ConsoleLevel)) + if err != nil { + fmt.Printf("Failed to parse console log level, level=%s, error=%v\n", c.ConsoleLevel, err) + consoleLogLevel.Set(commonLevel) + } + } else { + consoleLogLevel.Set(commonLevel) + } + + if c.FileLevel != "" { + err := fileLogLevel.UnmarshalText([]byte(c.FileLevel)) + if err != nil { + fmt.Printf("Failed to parse file log level, level=%s, error=%v\n", c.FileLevel, err) + fileLogLevel.Set(commonLevel) + } + } else { + fileLogLevel.Set(commonLevel) + } + + var consoleColors dlog.ColorMap + if c.NoColor { + consoleColors = dlog.ColorMap_Disabled + } else { + consoleColors = dlog.ColorMap_Enabled + } + + var slogHandlers []slog.Handler + if c.Console { + var handler slog.Handler + prettyHandlerOptions := &dlog.PrettyHandlerOptions{ + Level: &consoleLogLevel, + Colors: consoleColors, + } + + if c.Format == "json" { + handler = dlog.NewPrettyJSONHandler(dlog.DefaultLogOut, prettyHandlerOptions) + } else { + // c.Format == "text" + handler = dlog.NewPrettyTextHandler(dlog.DefaultLogOut, prettyHandlerOptions) + } + slogHandlers = append( + slogHandlers, + handler, + ) + } + + if c.File != "" { + file, err := os.OpenFile(c.File, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644) + if err == nil { + var handler slog.Handler + prettyHandlerOptions := &dlog.PrettyHandlerOptions{ + Level: &fileLogLevel, + Colors: dlog.ColorMap_Disabled, + } + if c.Format == "json" { + handler = dlog.NewPrettyJSONHandler(file, prettyHandlerOptions) + } else { + // c.Format == "text" + handler = dlog.NewPrettyTextHandler(file, prettyHandlerOptions) + } + slogHandlers = append( + slogHandlers, + handler, + ) + // TODO: close file when program exits + } else { + fmt.Printf("Failed to open log file, file=%s, error=%v\n", c.FileLevel, err) + } + } + + var slogHandler slog.Handler + if len(slogHandlers) > 1 { + slogHandler = dlog.NewMultiHandler(slogHandlers...) + } else if len(slogHandlers) == 1 { + slogHandler = slogHandlers[0] + } else { + slogHandler = &dlog.NullHandler{} + } + + slog.SetDefault(slog.New(slogHandler)) +} diff --git a/core/node/infra/metrics.go b/core/node/infra/metrics.go new file mode 100644 index 000000000..4f4abe4e2 --- /dev/null +++ b/core/node/infra/metrics.go @@ -0,0 +1,185 @@ +package infra + +import ( + "context" + "fmt" + "net/http" + "time" + + "github.com/gorilla/mux" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" + + "github.com/river-build/river/core/node/dlog" + config "github.com/river-build/river/core/node/infra/config" +) + +/* SuccessMetrics is a struct for tracking success/failure of various operations. + * Parent represents the higher level service (e.g. all RPC calls). When the metric is updated, + * the parent is also updated (recursively). + */ +type SuccessMetrics struct { + Name string + Parent *SuccessMetrics +} + +const ( + RPC_CATEGORY = "rpc" + DB_CALLS_CATEGORY = "db_calls" + CONTRACT_CALLS_CATEGORY = "contract_calls" + CONTRACT_WRITES_CATEGORY = "contract_writes" +) + +var registry = prometheus.DefaultRegisterer + +var ( + functionDuration = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Name: "function_execution_duration_ms", + Help: "Duration of function execution", + Buckets: []float64{1, 2, 5, 10, 20, 30, 60, 120, 300, 600, 1200, 1800}, + }, + []string{"name", "category"}, + ) + + successMetrics = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "success_metrics", + Help: "success metrics", + }, + []string{"name", "status", "category"}, + ) +) + +func NewSuccessMetrics(name string, parent *SuccessMetrics) *SuccessMetrics { + return &SuccessMetrics{ + Name: name, + Parent: parent, + } +} + +func StoreExecutionTimeMetrics(name string, category string, startTime time.Time) { + functionDuration.WithLabelValues(name, category).Observe(float64(time.Since(startTime).Milliseconds())) +} + +func NewCounter(name string, help string) prometheus.Counter { + counter := prometheus.NewCounter(prometheus.CounterOpts{ + Name: name, + Help: help, + }) + err := registry.Register(counter) + if err != nil { + panic(err) + } + return counter +} + +func NewCounterVec(name string, help string, labels ...string) *prometheus.CounterVec { + counter := prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: name, + Help: help, + }, labels) + err := registry.Register(counter) + if err != nil { + panic(err) + } + return counter +} + +func NewGaugeVec(name string, help string, labels ...string) *prometheus.GaugeVec { + gauge := prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Name: name, + Help: help, + }, labels) + err := registry.Register(gauge) + if err != nil { + panic(err) + } + return gauge +} + +func NewHistogram(name string, help string, buckets []float64, labels ...string) *prometheus.HistogramVec { + histogram := prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Name: name, + Help: help, + Buckets: buckets, + }, labels) + err := registry.Register(histogram) + if err != nil { + panic(err) + } + return histogram +} + +/* Increment pass counter for this metric and its parent. */ +func (m *SuccessMetrics) PassInc() { + args := []string{m.Name, "pass"} + if m.Parent != nil { + args = append(args, m.Parent.Name) + } else { + args = append(args, "root") + } + successMetrics.WithLabelValues(args...).Inc() + if m.Parent != nil { + m.Parent.PassInc() + } +} + +/* Increment fail counter for this metric and its parent. */ +func (m *SuccessMetrics) FailInc() { + args := []string{m.Name, "fail"} + if m.Parent != nil { + args = append(args, m.Parent.Name) + } else { + args = append(args, "root") + } + successMetrics.WithLabelValues(args...).Inc() + if m.Parent != nil { + m.Parent.FailInc() + } +} + +// update counter for a child metric and recursively update itself +func (m *SuccessMetrics) PassIncForChild(child string) { + // args are name, status, category + successMetrics.WithLabelValues(child, "pass", m.Name).Inc() + // recursively increment parent + m.PassInc() +} + +// update counter for a child metric and recursively update itself +func (m *SuccessMetrics) FailIncForChild(child string) { + // args are name, status, category + successMetrics.WithLabelValues(child, "fail", m.Name).Inc() + // recursively increment parent + m.FailInc() +} + +func StartMetricsService(ctx context.Context, config config.MetricsConfig) { + log := dlog.FromCtx(ctx) + + r := mux.NewRouter() + + err := registry.Register(functionDuration) + if err != nil { + panic(err) + } + + err = registry.Register(successMetrics) + if err != nil { + panic(err) + } + + handlerOpts := promhttp.HandlerOpts{ + EnableOpenMetrics: true, + } + metricsHandler := promhttp.HandlerFor(prometheus.DefaultGatherer, handlerOpts) + + r.Handle("/metrics", metricsHandler) + addr := fmt.Sprintf("%s:%d", config.Interface, config.Port) + log.Info("Starting metrics HTTP server", "addr", addr) + err = http.ListenAndServe(addr, r) + if err != nil { + panic(err) + } +} diff --git a/core/node/lint.sh b/core/node/lint.sh new file mode 100755 index 000000000..0f3d91458 --- /dev/null +++ b/core/node/lint.sh @@ -0,0 +1,8 @@ +#!/bin/bash -ue +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +golangci-lint run + +./lint_extensions.sh + +staticcheck ./... \ No newline at end of file diff --git a/core/node/lint_extensions.sh b/core/node/lint_extensions.sh new file mode 100755 index 000000000..54d81c43e --- /dev/null +++ b/core/node/lint_extensions.sh @@ -0,0 +1,14 @@ +#!/bin/bash -ue +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + + +# build and run custom lint +LINT_EXTENSIONS_DIR="./run_files/lint_extensions" + +mkdir -p "$LINT_EXTENSIONS_DIR" +pushd "$LINT_EXTENSIONS_DIR" > /dev/null +go build -o lintextensions ../../lint_extensions/lintextensions.go +popd > /dev/null + +$LINT_EXTENSIONS_DIR/lintextensions -test=false ./... + diff --git a/core/node/lint_extensions/lintextensions.go b/core/node/lint_extensions/lintextensions.go new file mode 100644 index 000000000..18c9e3c1e --- /dev/null +++ b/core/node/lint_extensions/lintextensions.go @@ -0,0 +1,71 @@ +package main + +import ( + "go/ast" + "strings" + + "golang.org/x/tools/go/analysis" + "golang.org/x/tools/go/analysis/singlechecker" +) + +var Analyzer = &analysis.Analyzer{ + Name: "lintextensions", + Doc: "reports calls to context.Background()", + Run: run, +} + +func isIgnored(commentGroups []*ast.CommentGroup) bool { + for _, group := range commentGroups { + for _, comment := range group.List { + if strings.Contains(comment.Text, "//lint:ignore") || strings.Contains(comment.Text, "// lint:ignore") { + return true + } + } + } + return false +} + +func run(pass *analysis.Pass) (interface{}, error) { + var currentFuncDecl *ast.FuncDecl + for _, file := range pass.Files { + commentMap := ast.NewCommentMap(pass.Fset, file, file.Comments) + ast.Inspect(file, func(n ast.Node) bool { + method, ok := n.(*ast.FuncDecl) + if ok { + // aellis, by trial and error, this seems to be what maps to comments + currentFuncDecl = method + } + + callExpr, ok := n.(*ast.CallExpr) + if !ok { + return true // not a call expression + } + selExpr, ok := callExpr.Fun.(*ast.SelectorExpr) + if !ok { + return true // not a selector expression + } + ident, ok := selExpr.X.(*ast.Ident) + if !ok { + return true // not an identifier + } + + if ident.Name == "context" && selExpr.Sel.Name == "Background" { + cmap := commentMap.Filter(currentFuncDecl).Comments() + // Check if this call expression is preceded by an ignore comment + if isIgnored(cmap) { + return true // Skip this node + } + pass.Reportf( + callExpr.Pos(), + "use of context.Background() is discouraged, use the default context instead", + ) + } + return true + }) + } + return nil, nil +} + +func main() { + singlechecker.Main(Analyzer) +} diff --git a/core/node/logs/.gitignore b/core/node/logs/.gitignore new file mode 100644 index 000000000..dae32257f --- /dev/null +++ b/core/node/logs/.gitignore @@ -0,0 +1,2 @@ +*.log +log \ No newline at end of file diff --git a/core/node/node/main.go b/core/node/node/main.go new file mode 100644 index 000000000..0da5c0e1c --- /dev/null +++ b/core/node/node/main.go @@ -0,0 +1,11 @@ +package main + +// Execute cobra root command from cmd + +import ( + "github.com/river-build/river/core/node/cmd" +) + +func main() { + cmd.Execute() +} diff --git a/core/node/node/version/version.go b/core/node/node/version/version.go new file mode 100644 index 000000000..f4c7a8221 --- /dev/null +++ b/core/node/node/version/version.go @@ -0,0 +1,30 @@ +package version + +var ( + version = "dev_local" // default version + branch = "" // default branch name + commit = "" // default commit hash +) + +func GetFullVersion() string { + ret := version + if branch != "" { + ret += "/" + branch + } + if commit != "" { + ret += "/" + commit + } + return ret +} + +func GetVersion() string { + return version +} + +func GetBranch() string { + return branch +} + +func GetCommit() string { + return commit +} diff --git a/core/node/nodes/node_record.go b/core/node/nodes/node_record.go new file mode 100644 index 000000000..c2ee3e0b9 --- /dev/null +++ b/core/node/nodes/node_record.go @@ -0,0 +1,68 @@ +package nodes + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/river-build/river/core/node/contracts" + . "github.com/river-build/river/core/node/protocol/protocolconnect" +) + +// NodeRecord is immutable and so can be passed by pointer. +type NodeRecord struct { + address common.Address + operator common.Address + url string + status uint8 + local bool + streamServiceClient StreamServiceClient + nodeToNodeClient NodeToNodeClient +} + +func (n *NodeRecord) Address() common.Address { + return n.address +} + +func (n *NodeRecord) Operator() common.Address { + return n.operator +} + +func (n *NodeRecord) Url() string { + return n.url +} + +func (n *NodeRecord) Status() uint8 { + return n.status +} + +func (n *NodeRecord) Local() bool { + return n.local +} + +func (n *NodeRecord) StreamServiceClient() StreamServiceClient { + return n.streamServiceClient +} + +func (n *NodeRecord) NodeToNodeClient() NodeToNodeClient { + return n.nodeToNodeClient +} + +func (n *NodeRecord) String() string { + var local string + if n.local { + local = " local" + } + return fmt.Sprintf( + "%s %d (%-11s) %s%s %s", + n.address.Hex(), + n.status, + contracts.NodeStatusString(n.status), + n.url, + local, + n.operator.Hex(), + ) +} + +func (n *NodeRecord) GoString() string { + return "NodeRecord{" + n.String() + "}\n" +} diff --git a/core/node/nodes/node_registry.go b/core/node/nodes/node_registry.go new file mode 100644 index 000000000..849fd3f1c --- /dev/null +++ b/core/node/nodes/node_registry.go @@ -0,0 +1,310 @@ +package nodes + +import ( + "context" + "net/http" + "sync" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/contracts" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/http_client" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/protocol/protocolconnect" + "github.com/river-build/river/core/node/registries" + + "connectrpc.com/connect" +) + +var TestHttpClientMaker func() *http.Client + +type NodeRegistry interface { + GetNode(address common.Address) (*NodeRecord, error) + GetAllNodes() []*NodeRecord + + // Returns error for local node. + GetStreamServiceClientForAddress(address common.Address) (StreamServiceClient, error) + GetNodeToNodeClientForAddress(address common.Address) (NodeToNodeClient, error) + + // TODO: refactor to provide IsValidNodeAddress(address common.Address) bool functions instead of copying the whole list + GetValidNodeAddresses() []common.Address +} + +type nodeRegistryImpl struct { + contract *registries.RiverRegistryContract + localNodeAddress common.Address + httpClient *http.Client + + mu sync.Mutex + nodes map[common.Address]*NodeRecord + appliedBlockNum crypto.BlockNumber +} + +var _ NodeRegistry = (*nodeRegistryImpl)(nil) + +func LoadNodeRegistry( + ctx context.Context, + contract *registries.RiverRegistryContract, + localNodeAddress common.Address, + appliedBlockNum crypto.BlockNumber, + chainMonitor crypto.ChainMonitor, +) (*nodeRegistryImpl, error) { + log := dlog.FromCtx(ctx) + + var err error + var client *http.Client + if TestHttpClientMaker != nil { + client = TestHttpClientMaker() + log.Warn("Using test http client") + } else { + client, err = http_client.GetHttpClient(ctx) + if err != nil { + log.Error("Error getting http client", "err", err) + return nil, AsRiverError(err, Err_BAD_CONFIG). + Message("Unable to get http client"). + Func("LoadNodeRegistry") + } + } + + nodes, err := contract.GetAllNodes(ctx, appliedBlockNum) + if err != nil { + return nil, err + } + + ret := &nodeRegistryImpl{ + contract: contract, + localNodeAddress: localNodeAddress, + httpClient: client, + nodes: make(map[common.Address]*NodeRecord, len(nodes)), + appliedBlockNum: appliedBlockNum, + } + + chainMonitor.OnContractWithTopicsEvent( + contract.Address, + [][]common.Hash{{contract.NodeRegistryAbi.Events["NodeAdded"].ID}}, + ret.OnNodeAdded, + ) + chainMonitor.OnContractWithTopicsEvent( + contract.Address, + [][]common.Hash{{contract.NodeRegistryAbi.Events["NodeRemoved"].ID}}, + ret.OnNodeRemoved, + ) + chainMonitor.OnContractWithTopicsEvent( + contract.Address, + [][]common.Hash{{contract.NodeRegistryAbi.Events["NodeStatusUpdated"].ID}}, + ret.OnNodeStatusUpdated, + ) + chainMonitor.OnContractWithTopicsEvent( + contract.Address, + [][]common.Hash{{contract.NodeRegistryAbi.Events["NodeUrlUpdated"].ID}}, + ret.OnNodeUrlUpdated, + ) + + localFound := false + for _, node := range nodes { + nn := ret.addNode(node.NodeAddress, node.Url, node.Status, node.Operator) + localFound = localFound || nn.local + } + + if localNodeAddress != (common.Address{}) && !localFound { + return nil, RiverError( + Err_UNKNOWN_NODE, + "Local node not found in registry", + "blockNum", + appliedBlockNum, + "localAddress", + localNodeAddress, + ).LogError(log) + } + + log.Info( + "Node Registry Loaded from contract", + "blockNum", + appliedBlockNum, + "Nodes", + ret.nodes, + "localAddress", + localNodeAddress, + ) + + return ret, nil +} + +func (n *nodeRegistryImpl) addNode(addr common.Address, url string, status uint8, operator common.Address) *NodeRecord { + // Lock should be taken by the caller + nn := &NodeRecord{ + address: addr, + operator: operator, + url: url, + status: status, + } + if addr == n.localNodeAddress { + nn.local = true + } else { + nn.streamServiceClient = NewStreamServiceClient(n.httpClient, url, connect.WithGRPC()) + nn.nodeToNodeClient = NewNodeToNodeClient(n.httpClient, url, connect.WithGRPC()) + } + n.nodes[addr] = nn + return nn +} + +// OnNodeAdded can apply INodeRegistry::NodeAdded event against the in-memory node registry. +func (n *nodeRegistryImpl) OnNodeAdded(ctx context.Context, event types.Log) { + log := dlog.FromCtx(ctx) + + var e contracts.NodeRegistryV1NodeAdded + if err := n.contract.NodeRegistry.BoundContract().UnpackLog(&e, "NodeAdded", event); err != nil { + log.Error("OnNodeAdded: unable to decode NodeAdded event") + return + } + + n.mu.Lock() + defer n.mu.Unlock() + + if _, exists := n.nodes[e.NodeAddress]; !exists { + // TODO: add operator to NodeAdded event + nodeRecord := n.addNode(e.NodeAddress, e.Url, e.Status, common.Address{}) + log.Info("NodeRegistry: NodeAdded", "node", nodeRecord.address, "blockNum", event.BlockNumber) + } else { + log.Error("NodeRegistry: Got NodeAdded for node that already exists in NodeRegistry", "blockNum", event.BlockNumber, "node", e.NodeAddress, "nodes", n.nodes) + } +} + +// OnNodeRemoved can apply INodeRegistry::NodeRemoved event against the in-memory node registry. +func (n *nodeRegistryImpl) OnNodeRemoved(ctx context.Context, event types.Log) { + log := dlog.FromCtx(ctx) + + var e contracts.NodeRegistryV1NodeRemoved + if err := n.contract.NodeRegistry.BoundContract().UnpackLog(&e, "NodeRemoved", event); err != nil { + log.Error("OnNodeRemoved: unable to decode NodeRemoved event") + return + } + + n.mu.Lock() + defer n.mu.Unlock() + + if _, exists := n.nodes[e.NodeAddress]; exists { + delete(n.nodes, e.NodeAddress) + log.Info("NodeRegistry: NodeRemoved", "blockNum", event.BlockNumber, "node", e.NodeAddress) + } else { + log.Error("NodeRegistry: Got NodeRemoved for node that does not exist in NodeRegistry", + "blockNum", event.BlockNumber, "node", e.NodeAddress, "nodes", n.nodes) + } +} + +// OnNodeStatusUpdated can apply INodeRegistry::NodeStatusUpdated event against the in-memory node registry. +func (n *nodeRegistryImpl) OnNodeStatusUpdated(ctx context.Context, event types.Log) { + log := dlog.FromCtx(ctx) + + var e contracts.NodeRegistryV1NodeStatusUpdated + if err := n.contract.NodeRegistry.BoundContract().UnpackLog(&e, "NodeStatusUpdated", event); err != nil { + log.Error("OnNodeStatusUpdated: unable to decode NodeStatusUpdated event") + return + } + + n.mu.Lock() + defer n.mu.Unlock() + + nn := n.nodes[e.NodeAddress] + if nn != nil { + newNode := *nn + newNode.status = e.Status + n.nodes[e.NodeAddress] = &newNode + log.Info("NodeRegistry: NodeStatusUpdated", "blockNum", event.BlockNumber, "node", nn) + } else { + log.Error("NodeRegistry: Got NodeStatusUpdated for node that does not exist in NodeRegistry", "blockNum", event.BlockNumber, "node", e.NodeAddress, "nodes", n.nodes) + } +} + +// OnNodeUrlUpdated can apply INodeRegistry::NodeUrlUpdated events against the in-memory node registry. +func (n *nodeRegistryImpl) OnNodeUrlUpdated(ctx context.Context, event types.Log) { + log := dlog.FromCtx(ctx) + + var e contracts.NodeRegistryV1NodeUrlUpdated + if err := n.contract.NodeRegistry.BoundContract().UnpackLog(&e, "NodeUrlUpdated", event); err != nil { + log.Error("OnNodeUrlUpdated: unable to decode NodeUrlUpdated event") + return + } + + n.mu.Lock() + defer n.mu.Unlock() + + nn := n.nodes[e.NodeAddress] + if nn != nil { + newNode := *nn + newNode.url = e.Url + if !nn.local { + newNode.streamServiceClient = NewStreamServiceClient(n.httpClient, e.Url, connect.WithGRPC()) + newNode.nodeToNodeClient = NewNodeToNodeClient(n.httpClient, e.Url, connect.WithGRPC()) + } + n.nodes[e.NodeAddress] = &newNode + log.Info("NodeRegistry: NodeUrlUpdated", "blockNum", event.BlockNumber, "node", nn) + } else { + log.Error("NodeRegistry: Got NodeUrlUpdated for node that does not exist in NodeRegistry", + "blockNum", event.BlockNumber, "node", e.NodeAddress, "nodes", n.nodes) + } +} + +func (n *nodeRegistryImpl) GetNode(address common.Address) (*NodeRecord, error) { + n.mu.Lock() + defer n.mu.Unlock() + + nn := n.nodes[address] + if nn == nil { + return nil, RiverError(Err_UNKNOWN_NODE, "No record for node", "address", address).Func("GetNode") + } + return nn, nil +} + +func (n *nodeRegistryImpl) GetAllNodes() []*NodeRecord { + n.mu.Lock() + defer n.mu.Unlock() + + ret := make([]*NodeRecord, 0, len(n.nodes)) + for _, nn := range n.nodes { + ret = append(ret, nn) + } + return ret +} + +// Returns error for local node. +func (n *nodeRegistryImpl) GetStreamServiceClientForAddress(address common.Address) (StreamServiceClient, error) { + node, err := n.GetNode(address) + if err != nil { + return nil, err + } + + if node.local { + return nil, RiverError(Err_INTERNAL, "can't get remote stub for local node") + } + + return node.streamServiceClient, nil +} + +// Returns error for local node. +func (n *nodeRegistryImpl) GetNodeToNodeClientForAddress(address common.Address) (NodeToNodeClient, error) { + node, err := n.GetNode(address) + if err != nil { + return nil, err + } + + if node.local { + return nil, RiverError(Err_INTERNAL, "can't get remote stub for local node") + } + + return node.nodeToNodeClient, nil +} + +func (n *nodeRegistryImpl) GetValidNodeAddresses() []common.Address { + n.mu.Lock() + defer n.mu.Unlock() + + ret := make([]common.Address, 0, len(n.nodes)) + for addr := range n.nodes { + ret = append(ret, addr) + } + return ret +} diff --git a/core/node/nodes/node_registry_test.go b/core/node/nodes/node_registry_test.go new file mode 100644 index 000000000..22331e66c --- /dev/null +++ b/core/node/nodes/node_registry_test.go @@ -0,0 +1,168 @@ +package nodes + +// import ( +// . "github.com/river-build/river/core/node/base" +// . "github.com/river-build/river/core/node/protocol" +// ) + +// func TestNodeRegistryUpdates(t *testing.T) { +// require := require.New(t) + +// ctx := test.NewTestContext() + +// btc, err := crypto.NewBlockchainTestContext(ctx, 1) +// require.NoError(err) +// defer btc.Close() + +// btc.Commit() + +// bc := btc.GetBlockchain(ctx, 0, true) +// defer bc.Close() + +// rr, err := registries.NewRiverRegistryContract( +// ctx, bc, &config.ContractConfig{Address: btc.RiverRegistryAddress}) +// require.NoError(err) + +// var ( +// chainBlockNum = btc.BlockNum(ctx) +// confirmedTransaction = new(sync.Map) + +// registerRegistry = func(monitor crypto.ChainMonitorBuilder, r *nodeRegistryImpl) crypto.ChainMonitorBuilder { +// return monitor.OnContractEvent(rr.Address, func(ctx context.Context, event types.Log) { +// key := fmt.Sprintf("%p_%s", r, event.TxHash) +// confirmedTransaction.Store(key, struct{}{}) +// }) +// } +// waitForTx = func(r *nodeRegistryImpl, tx common.Hash) { +// for { +// <-time.After(10 * time.Millisecond) +// key := fmt.Sprintf("%p_%s", r, tx) +// if _, ok := confirmedTransaction.Load(key); ok { +// return +// } +// } +// } +// ) + +// chainMonitor := crypto.NewChainMonitorBuilder(chainBlockNum + 1) +// r, err := LoadNodeRegistry(ctx, rr, bc.Wallet.Address, chainBlockNum, chainMonitor) +// chainMonitor = registerRegistry(chainMonitor, r) + +// require.Error(err) +// require.Nil(r) +// require.Equal(Err_UNKNOWN_NODE, AsRiverError(err).Code) +// go chainMonitor.Build(10*time.Millisecond).Run(ctx, bc.Client) + +// owner := btc.DeployerBlockchain +// go owner.ChainMonitorBuilder.Build(10*time.Millisecond).Run(ctx, owner.Client) + +// urls := []string{"https://river0.test", "https://river1.test", "https://river2.test"} +// addrs := []common.Address{btc.Wallets[0].Address, crypto.GetTestAddress(), crypto.GetTestAddress()} + +// pendingTx, err := owner.TxPool.Submit(ctx, func(opts *bind.TransactOpts) (*types.Transaction, error) { +// return btc.NodeRegistry.RegisterNode(opts, addrs[0], urls[0], contracts.NodeStatus_NotInitialized) +// }) +// require.NoError(err) +// btc.Commit() +// receipt := <-pendingTx.Wait() +// require.Equal(uint64(1), receipt.Status, "register node transaction failed") + +// chainBlockNum = btc.BlockNum(ctx) + +// r, err = LoadNodeRegistry(ctx, rr, bc.Wallet.Address, chainBlockNum, chainMonitor) +// chainMonitor = registerRegistry(chainMonitor, r) +// require.NoError(err) +// require.NotNil(r) +// nodes := r.GetAllNodes() +// require.Len(nodes, 1) +// go chainMonitor.Build(10*time.Millisecond).Run(ctx, bc.Client) + +// record := nodes[0] +// require.NoError(err) +// require.Equal(btc.Wallets[0].Address, record.address) +// require.Equal(urls[0], record.url) +// require.True(record.local) +// require.Equal(contracts.NodeStatus_NotInitialized, record.status) + +// pendingTx, err = owner.TxPool.Submit(ctx, func(opts *bind.TransactOpts) (*types.Transaction, error) { +// return btc.NodeRegistry.RegisterNode(opts, addrs[1], urls[1], contracts.NodeStatus_Operational) +// }) +// require.NoError(err) +// btc.Commit() +// receipt = <-pendingTx.Wait() +// require.Equal(uint64(1), receipt.Status, "register node transaction failed") +// waitForTx(r, receipt.TxHash) + +// nodes = r.GetAllNodes() +// require.Len(nodes, 2) + +// record, err = r.GetNode(addrs[1]) +// require.NoError(err) +// require.Equal(addrs[1], record.address) +// require.Equal(urls[1], record.url) +// require.False(record.local) +// require.Equal(contracts.NodeStatus_Operational, record.status) + +// const updatedUrl = "https://river1-updated.test" +// pendingTx, err = owner.TxPool.Submit(ctx, func(opts *bind.TransactOpts) (*types.Transaction, error) { +// return btc.NodeRegistry.UpdateNodeUrl(opts, addrs[1], updatedUrl) +// }) +// require.NoError(err) +// btc.Commit() +// receipt = <-pendingTx.Wait() +// require.Equal(uint64(1), receipt.Status, "update node transaction failed") +// waitForTx(r, receipt.TxHash) + +// record, err = r.GetNode(addrs[1]) +// require.NoError(err) +// require.Equal(addrs[1], record.address) +// require.Equal(updatedUrl, record.url) +// require.False(record.local) +// require.Equal(contracts.NodeStatus_Operational, record.status) + +// pendingTx, err = owner.TxPool.Submit(ctx, func(opts *bind.TransactOpts) (*types.Transaction, error) { +// return btc.NodeRegistry.UpdateNodeStatus(opts, addrs[1], contracts.NodeStatus_Departing) +// }) +// require.NoError(err) +// btc.Commit() +// receipt = <-pendingTx.Wait() +// require.Equal(uint64(1), receipt.Status, "update node transaction failed") +// waitForTx(r, receipt.TxHash) + +// record, err = r.GetNode(addrs[1]) +// require.NoError(err) +// require.Equal(addrs[1], record.address) +// require.Equal(updatedUrl, record.url) +// require.False(record.local) +// require.Equal(contracts.NodeStatus_Departing, record.status) + +// _, err = owner.TxPool.Submit(ctx, func(opts *bind.TransactOpts) (*types.Transaction, error) { +// tx, err := btc.NodeRegistry.RemoveNode(opts, addrs[1]) +// require.Error(err) +// require.Contains(err.Error(), "NODE_STATE_NOT_ALLOWED") +// return tx, err +// }) +// require.Error(err) +// btc.Commit() + +// _, err = owner.TxPool.Submit(ctx, func(opts *bind.TransactOpts) (*types.Transaction, error) { +// return btc.NodeRegistry.UpdateNodeStatus(opts, addrs[1], contracts.NodeStatus_Deleted) +// }) +// require.NoError(err) +// btc.Commit() + +// pendingTx, err = owner.TxPool.Submit(ctx, func(opts *bind.TransactOpts) (*types.Transaction, error) { +// return btc.NodeRegistry.RemoveNode(opts, addrs[1]) +// }) +// require.NoError(err) +// btc.Commit() +// receipt = <-pendingTx.Wait() +// require.Equal(uint64(1), receipt.Status, "remove node transaction failed") +// waitForTx(r, receipt.TxHash) + +// nodes = r.GetAllNodes() +// require.Len(nodes, 1) +// record, err = r.GetNode(addrs[1]) +// require.Error(err) +// require.Nil(record) +// } diff --git a/core/node/nodes/stream_nodes.go b/core/node/nodes/stream_nodes.go new file mode 100644 index 000000000..b1e2e7504 --- /dev/null +++ b/core/node/nodes/stream_nodes.go @@ -0,0 +1,168 @@ +package nodes + +import ( + "math/rand" + "slices" + "sync" + + "github.com/ethereum/go-ethereum/common" + + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/protocol" +) + +type StreamNodes interface { + IsLocal() bool + LocalIsLeader() bool + GetNodes() []common.Address + GetRemotes() []common.Address + NumRemotes() int + + GetStickyPeer() common.Address + AdvanceStickyPeer(currentPeer common.Address) common.Address + + Update(n common.Address, isAdded bool) error +} + +type streamNodesImpl struct { + mu sync.RWMutex + + // nodes contains all streams nodes in the same order as in contract. + nodes []common.Address + localNode common.Address + isLocal bool + + // remotes are all nodes except the local node. + // remotes are shuffled to avoid the same node being selected as the sticky peer. + remotes []common.Address + stickyPeerIndex int +} + +var _ StreamNodes = (*streamNodesImpl)(nil) + +func NewStreamNodes(nodes []common.Address, localNode common.Address) StreamNodes { + streamNodes := &streamNodesImpl{ + localNode: localNode, + } + streamNodes.resetNoLock(nodes) + return streamNodes +} + +func (s *streamNodesImpl) resetNoLock(nodes []common.Address) { + var lastStickyAddr common.Address + if s.stickyPeerIndex < len(s.remotes) { + lastStickyAddr = s.remotes[s.stickyPeerIndex] + } + + s.nodes = slices.Clone(nodes) + + localIndex := slices.Index(nodes, s.localNode) + + if localIndex >= 0 { + s.isLocal = true + s.remotes = slices.Concat(nodes[:localIndex], nodes[localIndex+1:]) + } else { + s.isLocal = false + s.remotes = slices.Clone(nodes) + } + + rand.Shuffle(len(s.remotes), func(i, j int) { s.remotes[i], s.remotes[j] = s.remotes[j], s.remotes[i] }) + + if lastStickyAddr == (common.Address{}) { + s.stickyPeerIndex = 0 + } else { + s.stickyPeerIndex = slices.Index(s.remotes, lastStickyAddr) + if s.stickyPeerIndex < 0 { + s.stickyPeerIndex = 0 + } + } +} + +func (s *streamNodesImpl) IsLocal() bool { + s.mu.RLock() + defer s.mu.RUnlock() + return s.isLocal +} + +// LocalIsLeader is used for fake leader election currently. +func (s *streamNodesImpl) LocalIsLeader() bool { + s.mu.RLock() + defer s.mu.RUnlock() + return len(s.nodes) > 0 && s.nodes[0] == s.localNode +} + +func (s *streamNodesImpl) GetNodes() []common.Address { + s.mu.RLock() + defer s.mu.RUnlock() + return slices.Clone(s.nodes) +} + +func (s *streamNodesImpl) GetRemotes() []common.Address { + s.mu.RLock() + defer s.mu.RUnlock() + return slices.Clone(s.remotes) +} + +func (s *streamNodesImpl) GetStickyPeer() common.Address { + s.mu.RLock() + defer s.mu.RUnlock() + if len(s.remotes) > 0 { + return s.remotes[s.stickyPeerIndex] + } else { + return common.Address{} + } +} + +func (s *streamNodesImpl) AdvanceStickyPeer(currentPeer common.Address) common.Address { + s.mu.Lock() + defer s.mu.Unlock() + + if len(s.remotes) == 0 { + return common.Address{} + } + + // If the node has already been advanced, ignore the call to advance and return the current sticky + // peer. Many concurrent requests may fail and try to advance the node at the same time, but we only + // want to advance once. + if s.remotes[s.stickyPeerIndex] != currentPeer { + return s.remotes[s.stickyPeerIndex] + } + + s.stickyPeerIndex++ + + // If we've visited all nodes, shuffle + if s.stickyPeerIndex >= len(s.remotes) { + rand.Shuffle(len(s.remotes), func(i, j int) { s.remotes[i], s.remotes[j] = s.remotes[j], s.remotes[i] }) + s.stickyPeerIndex = 0 + } + + return s.remotes[s.stickyPeerIndex] +} + +func (s *streamNodesImpl) NumRemotes() int { + s.mu.RLock() + defer s.mu.RUnlock() + return len(s.remotes) +} + +func (s *streamNodesImpl) Update(n common.Address, isAdded bool) error { + s.mu.Lock() + defer s.mu.Unlock() + + var newNodes []common.Address + if isAdded { + if slices.Contains(s.nodes, n) { + return RiverError(Err_INTERNAL, "StreamNodes.Update(add): node already exists in stream nodes", "nodes", s.nodes, "node", n) + } + newNodes = append(s.nodes, n) + } else { + index := slices.Index(s.nodes, n) + if index < 0 { + return RiverError(Err_INTERNAL, "StreamNodes.Update(delete): node does not exist in stream nodes", "nodes", s.nodes, "node", n) + } + newNodes = slices.Concat(s.nodes[:index], s.nodes[index+1:]) + } + + s.resetNoLock(newNodes) + return nil +} diff --git a/core/node/nodes/stream_nodes_test.go b/core/node/nodes/stream_nodes_test.go new file mode 100644 index 000000000..6d118b99c --- /dev/null +++ b/core/node/nodes/stream_nodes_test.go @@ -0,0 +1,108 @@ +package nodes_test + +import ( + "slices" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/river-build/river/core/node/nodes" + "github.com/stretchr/testify/require" +) + +var ( + local = common.BytesToAddress([]byte("local")) + remotes = []common.Address{ + common.BytesToAddress([]byte("remote1")), + common.BytesToAddress([]byte("remote2")), + common.BytesToAddress([]byte("remote3")), + } +) + +func TestStreamNodes(t *testing.T) { + tests := map[string]struct { + hasLocal bool + localFirst bool + }{ + "LastLocal": { + hasLocal: true, + }, + "FirstLocal": { + hasLocal: true, + localFirst: true, + }, + "NoLocal": { + hasLocal: false, + }, + } + for name, tc := range tests { + t.Run(name, func(t *testing.T) { + var nodeAddrs []common.Address + if tc.hasLocal { + if tc.localFirst { + nodeAddrs = append([]common.Address{local}, remotes...) + } else { + nodeAddrs = append(slices.Clone(remotes), local) + } + } else { + nodeAddrs = slices.Clone(remotes) + } + streamNodes := nodes.NewStreamNodes( + nodeAddrs, + local, + ) + require.Equal(t, tc.hasLocal, streamNodes.IsLocal()) + require.Equal(t, tc.localFirst, streamNodes.LocalIsLeader()) + require.ElementsMatch(t, nodeAddrs, streamNodes.GetNodes()) + require.ElementsMatch( + t, + remotes, + streamNodes.GetRemotes(), + ) + + seenPeers := map[common.Address]struct{}{} + + stickyPeer1 := streamNodes.GetStickyPeer() + require.Equal(t, stickyPeer1, streamNodes.GetStickyPeer()) + require.Equal(t, stickyPeer1, streamNodes.GetStickyPeer()) + + seenPeers[stickyPeer1] = struct{}{} + + stickyPeer2 := streamNodes.AdvanceStickyPeer(stickyPeer1) + require.Equal(t, stickyPeer2, streamNodes.GetStickyPeer()) + require.Equal(t, stickyPeer2, streamNodes.GetStickyPeer()) + + _, seen := seenPeers[stickyPeer2] + require.False(t, seen) + seenPeers[stickyPeer2] = struct{}{} + + stickyPeer3 := streamNodes.AdvanceStickyPeer(stickyPeer2) + require.Equal(t, stickyPeer3, streamNodes.GetStickyPeer()) + require.Equal(t, stickyPeer3, streamNodes.GetStickyPeer()) + + _, seen = seenPeers[stickyPeer3] + require.False(t, seen) + seenPeers[stickyPeer3] = struct{}{} + + require.NotNil(t, streamNodes.AdvanceStickyPeer(stickyPeer3)) + + // At this point, we should be looping through seen nodes + _, seen = seenPeers[streamNodes.GetStickyPeer()] + require.True(t, seen) + + // Assert local has never been returned as a peer node + _, seen = seenPeers[local] + require.False(t, seen) + + // Continuing to advance should cause no issues + stickyPeer4 := streamNodes.AdvanceStickyPeer(stickyPeer3) + require.NotNil(t, stickyPeer4) + + // Multiple calls to advance with the same current sticky node should not advance + // the sticky peer. Local should continue to be considered the leader even as internal + // node ordering changes. + require.Equal(t, tc.localFirst, streamNodes.LocalIsLeader()) + require.Equal(t, stickyPeer4, streamNodes.AdvanceStickyPeer(stickyPeer3)) + require.Equal(t, stickyPeer4, streamNodes.AdvanceStickyPeer(stickyPeer3)) + }) + } +} diff --git a/core/node/nodes/stream_registry.go b/core/node/nodes/stream_registry.go new file mode 100644 index 000000000..e5415f9f1 --- /dev/null +++ b/core/node/nodes/stream_registry.go @@ -0,0 +1,131 @@ +package nodes + +import ( + "context" + "hash/fnv" + "sync" + + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/contracts" + "github.com/river-build/river/core/node/crypto" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/registries" + . "github.com/river-build/river/core/node/shared" +) + +type StreamRegistry interface { + // GetStreamInfo: returns nodes, error + GetStreamInfo(ctx context.Context, streamId StreamId) (StreamNodes, error) + // GetStreamInfo: returns nodes, error + AllocateStream( + ctx context.Context, + streamId StreamId, + genesisMiniblockHash common.Hash, + genesisMiniblock []byte, + ) ([]common.Address, error) +} + +type streamRegistryImpl struct { + localNodeAddress common.Address + nodeRegistry NodeRegistry + replFactor int + onChainConfig crypto.OnChainConfiguration + contract *registries.RiverRegistryContract + + streamNodeCache sync.Map +} + +var _ StreamRegistry = (*streamRegistryImpl)(nil) + +func NewStreamRegistry( + localNodeAddress common.Address, + nodeRegistry NodeRegistry, + contract *registries.RiverRegistryContract, + replFactor int, + onChainConfig crypto.OnChainConfiguration, +) *streamRegistryImpl { + if replFactor < 1 { + replFactor = 1 + } + return &streamRegistryImpl{ + localNodeAddress: localNodeAddress, + nodeRegistry: nodeRegistry, + replFactor: replFactor, + onChainConfig: onChainConfig, + contract: contract, + } +} + +func (sr *streamRegistryImpl) GetStreamInfo(ctx context.Context, streamId StreamId) (StreamNodes, error) { + if streamNodes, ok := sr.streamNodeCache.Load(streamId); ok { + return streamNodes.(StreamNodes), nil + } + + ret, err := sr.contract.GetStream(ctx, streamId) + if err != nil { + return nil, err + } + + streamNodes := NewStreamNodes(ret.Nodes, sr.localNodeAddress) + sr.streamNodeCache.Store(streamId, streamNodes) + return streamNodes, nil +} + +func (sr *streamRegistryImpl) AllocateStream( + ctx context.Context, + streamId StreamId, + genesisMiniblockHash common.Hash, + genesisMiniblock []byte, +) ([]common.Address, error) { + addrs, err := sr.chooseStreamNodes(ctx, streamId) + if err != nil { + return nil, err + } + + err = sr.contract.AllocateStream(ctx, streamId, addrs, genesisMiniblockHash, genesisMiniblock) + if err != nil { + return nil, err + } + + return addrs, nil +} + +func (sr *streamRegistryImpl) chooseStreamNodes(ctx context.Context, streamId StreamId) ([]common.Address, error) { + allNodes := sr.nodeRegistry.GetAllNodes() + + nodes := make([]*NodeRecord, 0, len(allNodes)) + + for _, n := range allNodes { + if n.Status() == contracts.NodeStatus_Operational { + nodes = append(nodes, n) + } + } + + // TODO: switch to on-chain configuration + // replFactor, err := sr.onChainConfig.GetUint64(crypto.StreamReplicationFactorKey) + + if len(nodes) < sr.replFactor { + return nil, RiverError( + Err_BAD_CONFIG, + "replication factor is greater than number of operational nodes", + "replication_factor", + sr.replFactor, + "num_nodes", + len(nodes), + ) + } + + h := fnv.New64a() + addrs := make([]common.Address, sr.replFactor) + for i := 0; i < sr.replFactor; i++ { + h.Write(streamId[:]) + index := i + int(h.Sum64()%uint64(len(nodes)-i)) + tt := nodes[index] + nodes[index] = nodes[i] + nodes[i] = tt + addrs[i] = nodes[i].Address() + } + + return addrs, nil +} diff --git a/core/node/protocol/.gitignore b/core/node/protocol/.gitignore new file mode 100644 index 000000000..eaa80302a --- /dev/null +++ b/core/node/protocol/.gitignore @@ -0,0 +1 @@ +protocol.proto diff --git a/core/node/protocol/buf.gen.yaml b/core/node/protocol/buf.gen.yaml new file mode 100644 index 000000000..bb260c622 --- /dev/null +++ b/core/node/protocol/buf.gen.yaml @@ -0,0 +1,8 @@ +version: v1 +plugins: + - name: go + out: . + opt: paths=source_relative + - name: connect-go + out: . + opt: paths=source_relative diff --git a/core/node/protocol/buf.yaml b/core/node/protocol/buf.yaml new file mode 100644 index 000000000..8be07a198 --- /dev/null +++ b/core/node/protocol/buf.yaml @@ -0,0 +1,7 @@ +version: v1 +breaking: + use: + - FILE +lint: + use: + - DEFAULT diff --git a/core/node/protocol/extensions.pb.go b/core/node/protocol/extensions.pb.go new file mode 100644 index 000000000..ecb995191 --- /dev/null +++ b/core/node/protocol/extensions.pb.go @@ -0,0 +1,210 @@ +package protocol + +import "fmt" + +type IsStreamEvent_Payload = isStreamEvent_Payload +type IsMiniblockHeader_Content = isMiniblockHeader_Content +type IsMemberPayload_Content = isMemberPayload_Content +type IsSpacePayload_Content = isSpacePayload_Content +type IsChannelPayload_Content = isChannelPayload_Content +type IsDmChannelPayload_Content = isDmChannelPayload_Content +type IsGdmChannelPayload_Content = isGdmChannelPayload_Content +type IsUserPayload_Content = isUserPayload_Content +type IsUserInboxPayload_Content = isUserInboxPayload_Content +type IsUserSettingsPayload_Content = isUserSettingsPayload_Content +type IsUserDeviceKeyPayload_Content = isUserDeviceKeyPayload_Content +type IsMediaPayload_Content = isMediaPayload_Content +type IsSnapshot_Content = isSnapshot_Content +type IsGetStreamExResponse_Data = isGetStreamExResponse_Data + +type IsInceptionPayload interface { + isInceptionPayload() + GetStreamId() []byte + GetSettings() *StreamSettings +} +func (*SpacePayload_Inception) isInceptionPayload() {} +func (*ChannelPayload_Inception) isInceptionPayload() {} +func (*DmChannelPayload_Inception) isInceptionPayload() {} +func (*GdmChannelPayload_Inception) isInceptionPayload() {} +func (*UserPayload_Inception) isInceptionPayload() {} +func (*UserInboxPayload_Inception) isInceptionPayload() {} +func (*UserSettingsPayload_Inception) isInceptionPayload() {} +func (*UserDeviceKeyPayload_Inception) isInceptionPayload() {} +func (*MediaPayload_Inception) isInceptionPayload() {} + +func (e *Snapshot) GetInceptionPayload() IsInceptionPayload { + switch e.Content.(type) { + case *Snapshot_SpaceContent: + r := e.Content.(*Snapshot_SpaceContent).SpaceContent.GetInception() + if r == nil { + return nil + } + return r + case *Snapshot_ChannelContent: + r := e.Content.(*Snapshot_ChannelContent).ChannelContent.GetInception() + if r == nil { + return nil + } + return r + case *Snapshot_DmChannelContent: + r := e.Content.(*Snapshot_DmChannelContent).DmChannelContent.GetInception() + if r == nil { + return nil + } + return r + case *Snapshot_GdmChannelContent: + r := e.Content.(*Snapshot_GdmChannelContent).GdmChannelContent.GetInception() + if r == nil { + return nil + } + return r + case *Snapshot_UserContent: + r := e.Content.(*Snapshot_UserContent).UserContent.GetInception() + if r == nil { + return nil + } + return r + case *Snapshot_UserInboxContent: + r := e.Content.(*Snapshot_UserInboxContent).UserInboxContent.GetInception() + if r == nil { + return nil + } + return r + case *Snapshot_UserSettingsContent: + r := e.Content.(*Snapshot_UserSettingsContent).UserSettingsContent.GetInception() + if r == nil { + return nil + } + return r + case *Snapshot_UserDeviceKeyContent: + r := e.Content.(*Snapshot_UserDeviceKeyContent).UserDeviceKeyContent.GetInception() + if r == nil { + return nil + } + return r + case *Snapshot_MediaContent: + r := e.Content.(*Snapshot_MediaContent).MediaContent.GetInception() + if r == nil { + return nil + } + return r + default: + return nil + } +} + +func (e *StreamEvent) GetInceptionPayload() IsInceptionPayload { + switch e.Payload.(type) { + case *StreamEvent_SpacePayload: + r := e.Payload.(*StreamEvent_SpacePayload).SpacePayload.GetInception() + if r == nil { + return nil + } + return r + case *StreamEvent_ChannelPayload: + r := e.Payload.(*StreamEvent_ChannelPayload).ChannelPayload.GetInception() + if r == nil { + return nil + } + return r + case *StreamEvent_DmChannelPayload: + r := e.Payload.(*StreamEvent_DmChannelPayload).DmChannelPayload.GetInception() + if r == nil { + return nil + } + return r + case *StreamEvent_GdmChannelPayload: + r := e.Payload.(*StreamEvent_GdmChannelPayload).GdmChannelPayload.GetInception() + if r == nil { + return nil + } + return r + case *StreamEvent_UserPayload: + r := e.Payload.(*StreamEvent_UserPayload).UserPayload.GetInception() + if r == nil { + return nil + } + return r + case *StreamEvent_UserInboxPayload: + r := e.Payload.(*StreamEvent_UserInboxPayload).UserInboxPayload.GetInception() + if r == nil { + return nil + } + return r + case *StreamEvent_UserSettingsPayload: + r := e.Payload.(*StreamEvent_UserSettingsPayload).UserSettingsPayload.GetInception() + if r == nil { + return nil + } + return r + case *StreamEvent_UserDeviceKeyPayload: + r := e.Payload.(*StreamEvent_UserDeviceKeyPayload).UserDeviceKeyPayload.GetInception() + if r == nil { + return nil + } + return r + case *StreamEvent_MediaPayload: + r := e.Payload.(*StreamEvent_MediaPayload).MediaPayload.GetInception() + if r == nil { + return nil + } + return r + default: + return nil + } +} + +func (e *StreamEvent) VerifyPayloadTypeMatchesStreamType(i IsInceptionPayload) error { + switch e.Payload.(type) { + case *StreamEvent_SpacePayload: + _, ok := i.(*SpacePayload_Inception) + if !ok { + return fmt.Errorf("inception type mismatch: *protocol.StreamEvent_SpacePayload::%T vs %T", e.GetSpacePayload().Content, i) + } + case *StreamEvent_ChannelPayload: + _, ok := i.(*ChannelPayload_Inception) + if !ok { + return fmt.Errorf("inception type mismatch: *protocol.StreamEvent_ChannelPayload::%T vs %T", e.GetChannelPayload().Content, i) + } + case *StreamEvent_DmChannelPayload: + _, ok := i.(*DmChannelPayload_Inception) + if !ok { + return fmt.Errorf("inception type mismatch: *protocol.StreamEvent_DmChannelPayload::%T vs %T", e.GetDmChannelPayload().Content, i) + } + case *StreamEvent_GdmChannelPayload: + _, ok := i.(*GdmChannelPayload_Inception) + if !ok { + return fmt.Errorf("inception type mismatch: *protocol.StreamEvent_GdmChannelPayload::%T vs %T", e.GetGdmChannelPayload().Content, i) + } + case *StreamEvent_UserPayload: + _, ok := i.(*UserPayload_Inception) + if !ok { + return fmt.Errorf("inception type mismatch: *protocol.StreamEvent_UserPayload::%T vs %T", e.GetUserPayload().Content, i) + } + case *StreamEvent_UserInboxPayload: + _, ok := i.(*UserInboxPayload_Inception) + if !ok { + return fmt.Errorf("inception type mismatch: *protocol.StreamEvent_UserInboxPayload::%T vs %T", e.GetUserInboxPayload().Content, i) + } + case *StreamEvent_UserSettingsPayload: + _, ok := i.(*UserSettingsPayload_Inception) + if !ok { + return fmt.Errorf("inception type mismatch: *protocol.StreamEvent_UserSettingsPayload::%T vs %T", e.GetUserSettingsPayload().Content, i) + } + case *StreamEvent_UserDeviceKeyPayload: + _, ok := i.(*UserDeviceKeyPayload_Inception) + if !ok { + return fmt.Errorf("inception type mismatch: *protocol.StreamEvent_UserDeviceKeyPayload::%T vs %T", e.GetUserDeviceKeyPayload().Content, i) + } + case *StreamEvent_MediaPayload: + _, ok := i.(*MediaPayload_Inception) + if !ok { + return fmt.Errorf("inception type mismatch: *protocol.StreamEvent_MediaPayload::%T vs %T", e.GetMediaPayload().Content, i) + } + case *StreamEvent_MemberPayload: + return nil + default: + return fmt.Errorf("inception type type not handled: %T vs %T", e.Payload, i) + } + return nil +} diff --git a/core/node/protocol/gen.go b/core/node/protocol/gen.go new file mode 100644 index 000000000..eb0815b42 --- /dev/null +++ b/core/node/protocol/gen.go @@ -0,0 +1,3 @@ +package protocol + +//go:generate ./gen.sh diff --git a/core/node/protocol/gen.sh b/core/node/protocol/gen.sh new file mode 100755 index 000000000..d4f8cdd0f --- /dev/null +++ b/core/node/protocol/gen.sh @@ -0,0 +1,30 @@ +#!/bin/bash -ue +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +[ -n "$(go env GOBIN)" ] && PATH="$(go env GOBIN):${PATH}" +[ -n "$(go env GOPATH)" ] && PATH="$(go env GOPATH)/bin:${PATH}" + +KEEP_PROTO=false + +# Use "-k" to keep protocol.proto to simplify development. +while getopts "k" opt; do + case $opt in + k) + KEEP_PROTO=true + ;; + \?) + echo "Invalid option: -$OPTARG" >&2 + exit 1 + ;; + esac +done + +cp ../../proto/protocol.proto . +buf generate --path protocol.proto --path internode.proto + +if [ "$KEEP_PROTO" = false ]; then + rm protocol.proto +fi + +cd ../protocol_extensions +go run main.go diff --git a/core/node/protocol/helpers.go b/core/node/protocol/helpers.go new file mode 100644 index 000000000..4397c5942 --- /dev/null +++ b/core/node/protocol/helpers.go @@ -0,0 +1,12 @@ +package protocol + +func (e *StreamEvent) GetStreamSettings() *StreamSettings { + if e == nil { + return nil + } + i := e.GetInceptionPayload() + if i == nil { + return nil + } + return i.GetSettings() +} diff --git a/core/node/protocol/internode.pb.go b/core/node/protocol/internode.pb.go new file mode 100644 index 000000000..70e5f64f2 --- /dev/null +++ b/core/node/protocol/internode.pb.go @@ -0,0 +1,599 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.33.0 +// protoc (unknown) +// source: internode.proto + +package protocol + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type MiniblockProposal struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hashes [][]byte `protobuf:"bytes,1,rep,name=hashes,proto3" json:"hashes,omitempty"` + NewMiniblockNum int64 `protobuf:"varint,2,opt,name=new_miniblock_num,json=newMiniblockNum,proto3" json:"new_miniblock_num,omitempty"` + PrevMiniblockHash []byte `protobuf:"bytes,3,opt,name=prev_miniblock_hash,json=prevMiniblockHash,proto3" json:"prev_miniblock_hash,omitempty"` + ShouldSnapshot bool `protobuf:"varint,4,opt,name=should_snapshot,json=shouldSnapshot,proto3" json:"should_snapshot,omitempty"` +} + +func (x *MiniblockProposal) Reset() { + *x = MiniblockProposal{} + if protoimpl.UnsafeEnabled { + mi := &file_internode_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MiniblockProposal) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MiniblockProposal) ProtoMessage() {} + +func (x *MiniblockProposal) ProtoReflect() protoreflect.Message { + mi := &file_internode_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MiniblockProposal.ProtoReflect.Descriptor instead. +func (*MiniblockProposal) Descriptor() ([]byte, []int) { + return file_internode_proto_rawDescGZIP(), []int{0} +} + +func (x *MiniblockProposal) GetHashes() [][]byte { + if x != nil { + return x.Hashes + } + return nil +} + +func (x *MiniblockProposal) GetNewMiniblockNum() int64 { + if x != nil { + return x.NewMiniblockNum + } + return 0 +} + +func (x *MiniblockProposal) GetPrevMiniblockHash() []byte { + if x != nil { + return x.PrevMiniblockHash + } + return nil +} + +func (x *MiniblockProposal) GetShouldSnapshot() bool { + if x != nil { + return x.ShouldSnapshot + } + return false +} + +type AllocateStreamRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Miniblock *Miniblock `protobuf:"bytes,1,opt,name=miniblock,proto3" json:"miniblock,omitempty"` + StreamId []byte `protobuf:"bytes,2,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` // stream_id should match the stream_id in the inception payload of the first event +} + +func (x *AllocateStreamRequest) Reset() { + *x = AllocateStreamRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_internode_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AllocateStreamRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AllocateStreamRequest) ProtoMessage() {} + +func (x *AllocateStreamRequest) ProtoReflect() protoreflect.Message { + mi := &file_internode_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AllocateStreamRequest.ProtoReflect.Descriptor instead. +func (*AllocateStreamRequest) Descriptor() ([]byte, []int) { + return file_internode_proto_rawDescGZIP(), []int{1} +} + +func (x *AllocateStreamRequest) GetMiniblock() *Miniblock { + if x != nil { + return x.Miniblock + } + return nil +} + +func (x *AllocateStreamRequest) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +type AllocateStreamResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SyncCookie *SyncCookie `protobuf:"bytes,1,opt,name=sync_cookie,json=syncCookie,proto3" json:"sync_cookie,omitempty"` +} + +func (x *AllocateStreamResponse) Reset() { + *x = AllocateStreamResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_internode_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AllocateStreamResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AllocateStreamResponse) ProtoMessage() {} + +func (x *AllocateStreamResponse) ProtoReflect() protoreflect.Message { + mi := &file_internode_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AllocateStreamResponse.ProtoReflect.Descriptor instead. +func (*AllocateStreamResponse) Descriptor() ([]byte, []int) { + return file_internode_proto_rawDescGZIP(), []int{2} +} + +func (x *AllocateStreamResponse) GetSyncCookie() *SyncCookie { + if x != nil { + return x.SyncCookie + } + return nil +} + +type NewEventReceivedRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + Event *Envelope `protobuf:"bytes,2,opt,name=event,proto3" json:"event,omitempty"` + // event.hash signed by node private key. + NodeSig []byte `protobuf:"bytes,3,opt,name=node_sig,json=nodeSig,proto3" json:"node_sig,omitempty"` +} + +func (x *NewEventReceivedRequest) Reset() { + *x = NewEventReceivedRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_internode_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NewEventReceivedRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NewEventReceivedRequest) ProtoMessage() {} + +func (x *NewEventReceivedRequest) ProtoReflect() protoreflect.Message { + mi := &file_internode_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NewEventReceivedRequest.ProtoReflect.Descriptor instead. +func (*NewEventReceivedRequest) Descriptor() ([]byte, []int) { + return file_internode_proto_rawDescGZIP(), []int{3} +} + +func (x *NewEventReceivedRequest) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *NewEventReceivedRequest) GetEvent() *Envelope { + if x != nil { + return x.Event + } + return nil +} + +func (x *NewEventReceivedRequest) GetNodeSig() []byte { + if x != nil { + return x.NodeSig + } + return nil +} + +type NewEventReceivedResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *NewEventReceivedResponse) Reset() { + *x = NewEventReceivedResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_internode_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NewEventReceivedResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NewEventReceivedResponse) ProtoMessage() {} + +func (x *NewEventReceivedResponse) ProtoReflect() protoreflect.Message { + mi := &file_internode_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NewEventReceivedResponse.ProtoReflect.Descriptor instead. +func (*NewEventReceivedResponse) Descriptor() ([]byte, []int) { + return file_internode_proto_rawDescGZIP(), []int{4} +} + +type NewEventInPoolRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` +} + +func (x *NewEventInPoolRequest) Reset() { + *x = NewEventInPoolRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_internode_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NewEventInPoolRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NewEventInPoolRequest) ProtoMessage() {} + +func (x *NewEventInPoolRequest) ProtoReflect() protoreflect.Message { + mi := &file_internode_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NewEventInPoolRequest.ProtoReflect.Descriptor instead. +func (*NewEventInPoolRequest) Descriptor() ([]byte, []int) { + return file_internode_proto_rawDescGZIP(), []int{5} +} + +func (x *NewEventInPoolRequest) GetHash() []byte { + if x != nil { + return x.Hash + } + return nil +} + +type NewEventInPoolResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *NewEventInPoolResponse) Reset() { + *x = NewEventInPoolResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_internode_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NewEventInPoolResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NewEventInPoolResponse) ProtoMessage() {} + +func (x *NewEventInPoolResponse) ProtoReflect() protoreflect.Message { + mi := &file_internode_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NewEventInPoolResponse.ProtoReflect.Descriptor instead. +func (*NewEventInPoolResponse) Descriptor() ([]byte, []int) { + return file_internode_proto_rawDescGZIP(), []int{6} +} + +var File_internode_proto protoreflect.FileDescriptor + +var file_internode_proto_rawDesc = []byte{ + 0x0a, 0x0f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x05, 0x72, 0x69, 0x76, 0x65, 0x72, 0x1a, 0x0e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb0, 0x01, 0x0a, 0x11, 0x4d, 0x69, 0x6e, + 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x16, + 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x06, + 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x69, + 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0f, 0x6e, 0x65, 0x77, 0x4d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, + 0x75, 0x6d, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x11, 0x70, 0x72, 0x65, 0x76, 0x4d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x5f, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x68, 0x6f, + 0x75, 0x6c, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x64, 0x0a, 0x15, 0x41, + 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, + 0x4d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x69, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x22, 0x4c, 0x0a, 0x16, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x0b, 0x73, + 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6f, + 0x6b, 0x69, 0x65, 0x52, 0x0a, 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x22, + 0x78, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x45, + 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x19, + 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x22, 0x1a, 0x0a, 0x18, 0x4e, 0x65, 0x77, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, + 0x73, 0x68, 0x22, 0x18, 0x0a, 0x16, 0x4e, 0x65, 0x77, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xff, 0x01, 0x0a, + 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x6f, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x41, + 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1c, 0x2e, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x10, 0x4e, 0x65, + 0x77, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x1e, + 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, + 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x4d, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x50, 0x6f, 0x6f, + 0x6c, 0x12, 0x1c, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x31, + 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x2d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x63, + 0x6f, 0x72, 0x65, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_internode_proto_rawDescOnce sync.Once + file_internode_proto_rawDescData = file_internode_proto_rawDesc +) + +func file_internode_proto_rawDescGZIP() []byte { + file_internode_proto_rawDescOnce.Do(func() { + file_internode_proto_rawDescData = protoimpl.X.CompressGZIP(file_internode_proto_rawDescData) + }) + return file_internode_proto_rawDescData +} + +var file_internode_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_internode_proto_goTypes = []interface{}{ + (*MiniblockProposal)(nil), // 0: river.MiniblockProposal + (*AllocateStreamRequest)(nil), // 1: river.AllocateStreamRequest + (*AllocateStreamResponse)(nil), // 2: river.AllocateStreamResponse + (*NewEventReceivedRequest)(nil), // 3: river.NewEventReceivedRequest + (*NewEventReceivedResponse)(nil), // 4: river.NewEventReceivedResponse + (*NewEventInPoolRequest)(nil), // 5: river.NewEventInPoolRequest + (*NewEventInPoolResponse)(nil), // 6: river.NewEventInPoolResponse + (*Miniblock)(nil), // 7: river.Miniblock + (*SyncCookie)(nil), // 8: river.SyncCookie + (*Envelope)(nil), // 9: river.Envelope +} +var file_internode_proto_depIdxs = []int32{ + 7, // 0: river.AllocateStreamRequest.miniblock:type_name -> river.Miniblock + 8, // 1: river.AllocateStreamResponse.sync_cookie:type_name -> river.SyncCookie + 9, // 2: river.NewEventReceivedRequest.event:type_name -> river.Envelope + 1, // 3: river.NodeToNode.AllocateStream:input_type -> river.AllocateStreamRequest + 3, // 4: river.NodeToNode.NewEventReceived:input_type -> river.NewEventReceivedRequest + 5, // 5: river.NodeToNode.NewEventInPool:input_type -> river.NewEventInPoolRequest + 2, // 6: river.NodeToNode.AllocateStream:output_type -> river.AllocateStreamResponse + 4, // 7: river.NodeToNode.NewEventReceived:output_type -> river.NewEventReceivedResponse + 6, // 8: river.NodeToNode.NewEventInPool:output_type -> river.NewEventInPoolResponse + 6, // [6:9] is the sub-list for method output_type + 3, // [3:6] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name +} + +func init() { file_internode_proto_init() } +func file_internode_proto_init() { + if File_internode_proto != nil { + return + } + file_protocol_proto_init() + if !protoimpl.UnsafeEnabled { + file_internode_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MiniblockProposal); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_internode_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AllocateStreamRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_internode_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AllocateStreamResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_internode_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewEventReceivedRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_internode_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewEventReceivedResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_internode_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewEventInPoolRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_internode_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewEventInPoolResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_internode_proto_rawDesc, + NumEnums: 0, + NumMessages: 7, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_internode_proto_goTypes, + DependencyIndexes: file_internode_proto_depIdxs, + MessageInfos: file_internode_proto_msgTypes, + }.Build() + File_internode_proto = out.File + file_internode_proto_rawDesc = nil + file_internode_proto_goTypes = nil + file_internode_proto_depIdxs = nil +} diff --git a/core/node/protocol/internode.proto b/core/node/protocol/internode.proto new file mode 100644 index 000000000..199397f75 --- /dev/null +++ b/core/node/protocol/internode.proto @@ -0,0 +1,46 @@ +syntax = "proto3"; +package river; +option go_package = "github.com/river-build/river/core/node/protocol"; + +import "protocol.proto"; + +message MiniblockProposal { + repeated bytes hashes = 1; + int64 new_miniblock_num = 2; + bytes prev_miniblock_hash = 3; + bool should_snapshot = 4; +} + +message AllocateStreamRequest { + Miniblock miniblock = 1; + bytes stream_id = 2; // stream_id should match the stream_id in the inception payload of the first event +} + +message AllocateStreamResponse { + SyncCookie sync_cookie = 1; +} + +message NewEventReceivedRequest { + bytes stream_id = 1; + Envelope event = 2; + + // event.hash signed by node private key. + bytes node_sig = 3; +} + +message NewEventReceivedResponse { +} + +message NewEventInPoolRequest { + bytes hash = 1; +} + +message NewEventInPoolResponse { +} + +service NodeToNode { + rpc AllocateStream(AllocateStreamRequest) returns (AllocateStreamResponse); + rpc NewEventReceived(NewEventReceivedRequest) returns (NewEventReceivedResponse); + rpc NewEventInPool(NewEventInPoolRequest) returns (NewEventInPoolResponse); +} + diff --git a/core/node/protocol/protocol.pb.go b/core/node/protocol/protocol.pb.go new file mode 100644 index 000000000..b5629662e --- /dev/null +++ b/core/node/protocol/protocol.pb.go @@ -0,0 +1,8501 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.33.0 +// protoc (unknown) +// source: protocol.proto + +package protocol + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type SyncOp int32 + +const ( + SyncOp_SYNC_UNSPECIFIED SyncOp = 0 + SyncOp_SYNC_NEW SyncOp = 1 // new sync + SyncOp_SYNC_CLOSE SyncOp = 2 // close the sync + SyncOp_SYNC_UPDATE SyncOp = 3 // update from server + SyncOp_SYNC_PONG SyncOp = 4 // respond to the ping message from the client. +) + +// Enum value maps for SyncOp. +var ( + SyncOp_name = map[int32]string{ + 0: "SYNC_UNSPECIFIED", + 1: "SYNC_NEW", + 2: "SYNC_CLOSE", + 3: "SYNC_UPDATE", + 4: "SYNC_PONG", + } + SyncOp_value = map[string]int32{ + "SYNC_UNSPECIFIED": 0, + "SYNC_NEW": 1, + "SYNC_CLOSE": 2, + "SYNC_UPDATE": 3, + "SYNC_PONG": 4, + } +) + +func (x SyncOp) Enum() *SyncOp { + p := new(SyncOp) + *p = x + return p +} + +func (x SyncOp) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SyncOp) Descriptor() protoreflect.EnumDescriptor { + return file_protocol_proto_enumTypes[0].Descriptor() +} + +func (SyncOp) Type() protoreflect.EnumType { + return &file_protocol_proto_enumTypes[0] +} + +func (x SyncOp) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SyncOp.Descriptor instead. +func (SyncOp) EnumDescriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{0} +} + +type MembershipOp int32 + +const ( + MembershipOp_SO_UNSPECIFIED MembershipOp = 0 + MembershipOp_SO_INVITE MembershipOp = 1 + MembershipOp_SO_JOIN MembershipOp = 2 + MembershipOp_SO_LEAVE MembershipOp = 3 +) + +// Enum value maps for MembershipOp. +var ( + MembershipOp_name = map[int32]string{ + 0: "SO_UNSPECIFIED", + 1: "SO_INVITE", + 2: "SO_JOIN", + 3: "SO_LEAVE", + } + MembershipOp_value = map[string]int32{ + "SO_UNSPECIFIED": 0, + "SO_INVITE": 1, + "SO_JOIN": 2, + "SO_LEAVE": 3, + } +) + +func (x MembershipOp) Enum() *MembershipOp { + p := new(MembershipOp) + *p = x + return p +} + +func (x MembershipOp) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (MembershipOp) Descriptor() protoreflect.EnumDescriptor { + return file_protocol_proto_enumTypes[1].Descriptor() +} + +func (MembershipOp) Type() protoreflect.EnumType { + return &file_protocol_proto_enumTypes[1] +} + +func (x MembershipOp) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use MembershipOp.Descriptor instead. +func (MembershipOp) EnumDescriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{1} +} + +type ChannelOp int32 + +const ( + ChannelOp_CO_UNSPECIFIED ChannelOp = 0 + ChannelOp_CO_CREATED ChannelOp = 1 + ChannelOp_CO_DELETED ChannelOp = 2 + ChannelOp_CO_UPDATED ChannelOp = 4 +) + +// Enum value maps for ChannelOp. +var ( + ChannelOp_name = map[int32]string{ + 0: "CO_UNSPECIFIED", + 1: "CO_CREATED", + 2: "CO_DELETED", + 4: "CO_UPDATED", + } + ChannelOp_value = map[string]int32{ + "CO_UNSPECIFIED": 0, + "CO_CREATED": 1, + "CO_DELETED": 2, + "CO_UPDATED": 4, + } +) + +func (x ChannelOp) Enum() *ChannelOp { + p := new(ChannelOp) + *p = x + return p +} + +func (x ChannelOp) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ChannelOp) Descriptor() protoreflect.EnumDescriptor { + return file_protocol_proto_enumTypes[2].Descriptor() +} + +func (ChannelOp) Type() protoreflect.EnumType { + return &file_protocol_proto_enumTypes[2] +} + +func (x ChannelOp) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ChannelOp.Descriptor instead. +func (ChannelOp) EnumDescriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{2} +} + +// Codes from 1 to 16 match gRPC/Connect codes. +type Err int32 + +const ( + Err_ERR_UNSPECIFIED Err = 0 + // Canceled indicates that the operation was canceled, typically by the + // caller. + Err_CANCELED Err = 1 + // Unknown indicates that the operation failed for an unknown reason. + Err_UNKNOWN Err = 2 + // InvalidArgument indicates that client supplied an invalid argument. + Err_INVALID_ARGUMENT Err = 3 + // DeadlineExceeded indicates that deadline expired before the operation + // could complete. + Err_DEADLINE_EXCEEDED Err = 4 + // NotFound indicates that some requested entity (for example, a file or + // directory) was not found. + Err_NOT_FOUND Err = 5 + // AlreadyExists indicates that client attempted to create an entity (for + // example, a file or directory) that already exists. + Err_ALREADY_EXISTS Err = 6 + // PermissionDenied indicates that the caller doesn't have permission to + // execute the specified operation. + Err_PERMISSION_DENIED Err = 7 + // ResourceExhausted indicates that some resource has been exhausted. For + // example, a per-user quota may be exhausted or the entire file system may + // be full. + Err_RESOURCE_EXHAUSTED Err = 8 + // FailedPrecondition indicates that the system is not in a state + // required for the operation's execution. + Err_FAILED_PRECONDITION Err = 9 + // Aborted indicates that operation was aborted by the system, usually + // because of a concurrency issue such as a sequencer check failure or + // transaction abort. + Err_ABORTED Err = 10 + // OutOfRange indicates that the operation was attempted past the valid + // range (for example, seeking past end-of-file). + Err_OUT_OF_RANGE Err = 11 + // Unimplemented indicates that the operation isn't implemented, + // supported, or enabled in this service. + Err_UNIMPLEMENTED Err = 12 + // Internal indicates that some invariants expected by the underlying + // system have been broken. This code is reserved for serious errors. + Err_INTERNAL Err = 13 + // Unavailable indicates that the service is currently unavailable. This + // is usually temporary, so clients can back off and retry idempotent + // operations. + Err_UNAVAILABLE Err = 14 + // DataLoss indicates that the operation has resulted in unrecoverable + // data loss or corruption. + Err_DATA_LOSS Err = 15 + // Unauthenticated indicates that the request does not have valid + // authentication credentials for the operation. + Err_UNAUTHENTICATED Err = 16 + Err_DEBUG_ERROR Err = 17 + Err_BAD_STREAM_ID Err = 18 + Err_BAD_STREAM_CREATION_PARAMS Err = 19 + Err_INTERNAL_ERROR_SWITCH Err = 20 + Err_BAD_EVENT_ID Err = 21 + Err_BAD_EVENT_SIGNATURE Err = 22 + Err_BAD_HASH_FORMAT Err = 23 + Err_BAD_PREV_MINIBLOCK_HASH Err = 24 + Err_NO_EVENT_SPECIFIED Err = 25 + Err_BAD_EVENT Err = 26 + Err_USER_CANT_POST Err = 27 + Err_STREAM_BAD_HASHES Err = 28 + Err_STREAM_EMPTY Err = 29 + Err_STREAM_BAD_EVENT Err = 30 + Err_BAD_DELEGATE_SIG Err = 31 + Err_BAD_PUBLIC_KEY Err = 32 + Err_BAD_PAYLOAD Err = 33 + Err_BAD_HEX_STRING Err = 34 + Err_BAD_EVENT_HASH Err = 35 + Err_BAD_SYNC_COOKIE Err = 36 + Err_DUPLICATE_EVENT Err = 37 + Err_BAD_BLOCK Err = 38 + Err_STREAM_NO_INCEPTION_EVENT Err = 39 + Err_BAD_BLOCK_NUMBER Err = 40 + Err_BAD_MINIPOOL_SLOT Err = 41 + Err_BAD_CREATOR_ADDRESS Err = 42 + Err_STALE_DELEGATE Err = 43 + Err_BAD_LINK_WALLET_BAD_SIGNATURE Err = 44 + Err_BAD_ROOT_KEY_ID Err = 45 + Err_UNKNOWN_NODE Err = 46 + Err_DB_OPERATION_FAILURE Err = 47 + Err_MINIBLOCKS_STORAGE_FAILURE Err = 48 + Err_BAD_ADDRESS Err = 49 + Err_BUFFER_FULL Err = 50 + Err_BAD_CONFIG Err = 51 + Err_BAD_CONTRACT Err = 52 + Err_CANNOT_CONNECT Err = 53 + Err_CANNOT_GET_LINKED_WALLETS Err = 54 + Err_CANNOT_CHECK_ENTITLEMENTS Err = 55 + Err_CANNOT_CALL_CONTRACT Err = 56 + Err_SPACE_DISABLED Err = 57 + Err_CHANNEL_DISABLED Err = 58 + Err_WRONG_STREAM_TYPE Err = 59 + Err_MINIPOOL_MISSING_EVENTS Err = 60 + Err_STREAM_LAST_BLOCK_MISMATCH Err = 61 + Err_DOWNSTREAM_NETWORK_ERROR Err = 62 +) + +// Enum value maps for Err. +var ( + Err_name = map[int32]string{ + 0: "ERR_UNSPECIFIED", + 1: "CANCELED", + 2: "UNKNOWN", + 3: "INVALID_ARGUMENT", + 4: "DEADLINE_EXCEEDED", + 5: "NOT_FOUND", + 6: "ALREADY_EXISTS", + 7: "PERMISSION_DENIED", + 8: "RESOURCE_EXHAUSTED", + 9: "FAILED_PRECONDITION", + 10: "ABORTED", + 11: "OUT_OF_RANGE", + 12: "UNIMPLEMENTED", + 13: "INTERNAL", + 14: "UNAVAILABLE", + 15: "DATA_LOSS", + 16: "UNAUTHENTICATED", + 17: "DEBUG_ERROR", + 18: "BAD_STREAM_ID", + 19: "BAD_STREAM_CREATION_PARAMS", + 20: "INTERNAL_ERROR_SWITCH", + 21: "BAD_EVENT_ID", + 22: "BAD_EVENT_SIGNATURE", + 23: "BAD_HASH_FORMAT", + 24: "BAD_PREV_MINIBLOCK_HASH", + 25: "NO_EVENT_SPECIFIED", + 26: "BAD_EVENT", + 27: "USER_CANT_POST", + 28: "STREAM_BAD_HASHES", + 29: "STREAM_EMPTY", + 30: "STREAM_BAD_EVENT", + 31: "BAD_DELEGATE_SIG", + 32: "BAD_PUBLIC_KEY", + 33: "BAD_PAYLOAD", + 34: "BAD_HEX_STRING", + 35: "BAD_EVENT_HASH", + 36: "BAD_SYNC_COOKIE", + 37: "DUPLICATE_EVENT", + 38: "BAD_BLOCK", + 39: "STREAM_NO_INCEPTION_EVENT", + 40: "BAD_BLOCK_NUMBER", + 41: "BAD_MINIPOOL_SLOT", + 42: "BAD_CREATOR_ADDRESS", + 43: "STALE_DELEGATE", + 44: "BAD_LINK_WALLET_BAD_SIGNATURE", + 45: "BAD_ROOT_KEY_ID", + 46: "UNKNOWN_NODE", + 47: "DB_OPERATION_FAILURE", + 48: "MINIBLOCKS_STORAGE_FAILURE", + 49: "BAD_ADDRESS", + 50: "BUFFER_FULL", + 51: "BAD_CONFIG", + 52: "BAD_CONTRACT", + 53: "CANNOT_CONNECT", + 54: "CANNOT_GET_LINKED_WALLETS", + 55: "CANNOT_CHECK_ENTITLEMENTS", + 56: "CANNOT_CALL_CONTRACT", + 57: "SPACE_DISABLED", + 58: "CHANNEL_DISABLED", + 59: "WRONG_STREAM_TYPE", + 60: "MINIPOOL_MISSING_EVENTS", + 61: "STREAM_LAST_BLOCK_MISMATCH", + 62: "DOWNSTREAM_NETWORK_ERROR", + } + Err_value = map[string]int32{ + "ERR_UNSPECIFIED": 0, + "CANCELED": 1, + "UNKNOWN": 2, + "INVALID_ARGUMENT": 3, + "DEADLINE_EXCEEDED": 4, + "NOT_FOUND": 5, + "ALREADY_EXISTS": 6, + "PERMISSION_DENIED": 7, + "RESOURCE_EXHAUSTED": 8, + "FAILED_PRECONDITION": 9, + "ABORTED": 10, + "OUT_OF_RANGE": 11, + "UNIMPLEMENTED": 12, + "INTERNAL": 13, + "UNAVAILABLE": 14, + "DATA_LOSS": 15, + "UNAUTHENTICATED": 16, + "DEBUG_ERROR": 17, + "BAD_STREAM_ID": 18, + "BAD_STREAM_CREATION_PARAMS": 19, + "INTERNAL_ERROR_SWITCH": 20, + "BAD_EVENT_ID": 21, + "BAD_EVENT_SIGNATURE": 22, + "BAD_HASH_FORMAT": 23, + "BAD_PREV_MINIBLOCK_HASH": 24, + "NO_EVENT_SPECIFIED": 25, + "BAD_EVENT": 26, + "USER_CANT_POST": 27, + "STREAM_BAD_HASHES": 28, + "STREAM_EMPTY": 29, + "STREAM_BAD_EVENT": 30, + "BAD_DELEGATE_SIG": 31, + "BAD_PUBLIC_KEY": 32, + "BAD_PAYLOAD": 33, + "BAD_HEX_STRING": 34, + "BAD_EVENT_HASH": 35, + "BAD_SYNC_COOKIE": 36, + "DUPLICATE_EVENT": 37, + "BAD_BLOCK": 38, + "STREAM_NO_INCEPTION_EVENT": 39, + "BAD_BLOCK_NUMBER": 40, + "BAD_MINIPOOL_SLOT": 41, + "BAD_CREATOR_ADDRESS": 42, + "STALE_DELEGATE": 43, + "BAD_LINK_WALLET_BAD_SIGNATURE": 44, + "BAD_ROOT_KEY_ID": 45, + "UNKNOWN_NODE": 46, + "DB_OPERATION_FAILURE": 47, + "MINIBLOCKS_STORAGE_FAILURE": 48, + "BAD_ADDRESS": 49, + "BUFFER_FULL": 50, + "BAD_CONFIG": 51, + "BAD_CONTRACT": 52, + "CANNOT_CONNECT": 53, + "CANNOT_GET_LINKED_WALLETS": 54, + "CANNOT_CHECK_ENTITLEMENTS": 55, + "CANNOT_CALL_CONTRACT": 56, + "SPACE_DISABLED": 57, + "CHANNEL_DISABLED": 58, + "WRONG_STREAM_TYPE": 59, + "MINIPOOL_MISSING_EVENTS": 60, + "STREAM_LAST_BLOCK_MISMATCH": 61, + "DOWNSTREAM_NETWORK_ERROR": 62, + } +) + +func (x Err) Enum() *Err { + p := new(Err) + *p = x + return p +} + +func (x Err) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Err) Descriptor() protoreflect.EnumDescriptor { + return file_protocol_proto_enumTypes[3].Descriptor() +} + +func (Err) Type() protoreflect.EnumType { + return &file_protocol_proto_enumTypes[3] +} + +func (x Err) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Err.Descriptor instead. +func (Err) EnumDescriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{3} +} + +// * +// Miniblock contains a list of events and the header event. +// Events must be in the same order as in the header, which is of type MiniblockHeader. +// Only signed data (Envelopes) should exist in this data structure. +type Miniblock struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Events []*Envelope `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + Header *Envelope `protobuf:"bytes,2,opt,name=header,proto3" json:"header,omitempty"` +} + +func (x *Miniblock) Reset() { + *x = Miniblock{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Miniblock) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Miniblock) ProtoMessage() {} + +func (x *Miniblock) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Miniblock.ProtoReflect.Descriptor instead. +func (*Miniblock) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{0} +} + +func (x *Miniblock) GetEvents() []*Envelope { + if x != nil { + return x.Events + } + return nil +} + +func (x *Miniblock) GetHeader() *Envelope { + if x != nil { + return x.Header + } + return nil +} + +// * +// Envelope contains serialized event, and its hash and signature. +// hash is used as event id. Subsequent events reference this event by hash. +// event is a serialized StreamEvent +type Envelope struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // * + // Hash of event. + // While hash can be recalculated from the event, having it here explicitely + // makes it easier to work with event. + // For the event to be valid, must match hash of event field. + Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + // * + // Signature. + // For the event to be valid, signature must match event.creator_address + // or be signed by the address from evant.delegate_sig. + Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` + Event []byte `protobuf:"bytes,3,opt,name=event,proto3" json:"event,omitempty"` +} + +func (x *Envelope) Reset() { + *x = Envelope{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Envelope) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Envelope) ProtoMessage() {} + +func (x *Envelope) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Envelope.ProtoReflect.Descriptor instead. +func (*Envelope) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{1} +} + +func (x *Envelope) GetHash() []byte { + if x != nil { + return x.Hash + } + return nil +} + +func (x *Envelope) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +func (x *Envelope) GetEvent() []byte { + if x != nil { + return x.Event + } + return nil +} + +// * +// StreamEvent is a single event in the stream. +type StreamEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // * + // Address of the creator of the event. + // For user - address of the user's wallet. + // For server - address of the server's keypair in staking smart contract. + // + // For the event to be valid: + // If delegate_sig is present, creator_address must match delegate_sig. + // If delegate_sig is not present, creator_address must match event signature in the Envelope. + CreatorAddress []byte `protobuf:"bytes,1,opt,name=creator_address,json=creatorAddress,proto3" json:"creator_address,omitempty"` + // * + // delegate_sig allows event to be signed by a delegate keypair + // + // delegate_sig constains signature of the + // public key of the delegate keypair + the delegate_expirary_epoch_ms. + // User's wallet is used to produce this signature. + // + // If present, for the event to be valid: + // 1. creator_address must match delegate_sig's signer public key + // 2. delegate_sig should be signed as an Ethereum Signed Message (eip-191) + // + // Server nodes sign node-produced events with their own keypair and do not + // need to use delegate_sig. + DelegateSig []byte `protobuf:"bytes,2,opt,name=delegate_sig,json=delegateSig,proto3" json:"delegate_sig,omitempty"` + // * Salt ensures that similar messages are not hashed to the same value. genId() from id.ts may be used. + Salt []byte `protobuf:"bytes,3,opt,name=salt,proto3" json:"salt,omitempty"` + // * Hash of a preceding miniblock. Null for the inception event. Must be a recent miniblock + PrevMiniblockHash []byte `protobuf:"bytes,4,opt,name=prev_miniblock_hash,json=prevMiniblockHash,proto3,oneof" json:"prev_miniblock_hash,omitempty"` + // * CreatedAt is the time when the event was created. + // NOTE: this value is set by clients and is not reliable for anything other than displaying + // the value to the user. Never use this value to sort events from different users. + CreatedAtEpochMs int64 `protobuf:"varint,5,opt,name=created_at_epoch_ms,json=createdAtEpochMs,proto3" json:"created_at_epoch_ms,omitempty"` + // * DelegateExpiry is the time when the delegate signature expires. + DelegateExpiryEpochMs int64 `protobuf:"varint,6,opt,name=delegate_expiry_epoch_ms,json=delegateExpiryEpochMs,proto3" json:"delegate_expiry_epoch_ms,omitempty"` + // * Variable-type payload. + // Payloads should obey the following rules: + // - payloads should have their own unique type + // - each payload should have a oneof content field + // - each payload, with the exception of miniblock header and member payloads + // should have an inception field inside the content oneof + // - each payload should have a unique Inception type + // - payloads can't violate previous type recursively to inception payload + // + // Types that are assignable to Payload: + // + // *StreamEvent_MiniblockHeader + // *StreamEvent_MemberPayload + // *StreamEvent_SpacePayload + // *StreamEvent_ChannelPayload + // *StreamEvent_UserPayload + // *StreamEvent_UserSettingsPayload + // *StreamEvent_UserDeviceKeyPayload + // *StreamEvent_UserInboxPayload + // *StreamEvent_MediaPayload + // *StreamEvent_DmChannelPayload + // *StreamEvent_GdmChannelPayload + Payload isStreamEvent_Payload `protobuf_oneof:"payload"` +} + +func (x *StreamEvent) Reset() { + *x = StreamEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StreamEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StreamEvent) ProtoMessage() {} + +func (x *StreamEvent) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StreamEvent.ProtoReflect.Descriptor instead. +func (*StreamEvent) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{2} +} + +func (x *StreamEvent) GetCreatorAddress() []byte { + if x != nil { + return x.CreatorAddress + } + return nil +} + +func (x *StreamEvent) GetDelegateSig() []byte { + if x != nil { + return x.DelegateSig + } + return nil +} + +func (x *StreamEvent) GetSalt() []byte { + if x != nil { + return x.Salt + } + return nil +} + +func (x *StreamEvent) GetPrevMiniblockHash() []byte { + if x != nil { + return x.PrevMiniblockHash + } + return nil +} + +func (x *StreamEvent) GetCreatedAtEpochMs() int64 { + if x != nil { + return x.CreatedAtEpochMs + } + return 0 +} + +func (x *StreamEvent) GetDelegateExpiryEpochMs() int64 { + if x != nil { + return x.DelegateExpiryEpochMs + } + return 0 +} + +func (m *StreamEvent) GetPayload() isStreamEvent_Payload { + if m != nil { + return m.Payload + } + return nil +} + +func (x *StreamEvent) GetMiniblockHeader() *MiniblockHeader { + if x, ok := x.GetPayload().(*StreamEvent_MiniblockHeader); ok { + return x.MiniblockHeader + } + return nil +} + +func (x *StreamEvent) GetMemberPayload() *MemberPayload { + if x, ok := x.GetPayload().(*StreamEvent_MemberPayload); ok { + return x.MemberPayload + } + return nil +} + +func (x *StreamEvent) GetSpacePayload() *SpacePayload { + if x, ok := x.GetPayload().(*StreamEvent_SpacePayload); ok { + return x.SpacePayload + } + return nil +} + +func (x *StreamEvent) GetChannelPayload() *ChannelPayload { + if x, ok := x.GetPayload().(*StreamEvent_ChannelPayload); ok { + return x.ChannelPayload + } + return nil +} + +func (x *StreamEvent) GetUserPayload() *UserPayload { + if x, ok := x.GetPayload().(*StreamEvent_UserPayload); ok { + return x.UserPayload + } + return nil +} + +func (x *StreamEvent) GetUserSettingsPayload() *UserSettingsPayload { + if x, ok := x.GetPayload().(*StreamEvent_UserSettingsPayload); ok { + return x.UserSettingsPayload + } + return nil +} + +func (x *StreamEvent) GetUserDeviceKeyPayload() *UserDeviceKeyPayload { + if x, ok := x.GetPayload().(*StreamEvent_UserDeviceKeyPayload); ok { + return x.UserDeviceKeyPayload + } + return nil +} + +func (x *StreamEvent) GetUserInboxPayload() *UserInboxPayload { + if x, ok := x.GetPayload().(*StreamEvent_UserInboxPayload); ok { + return x.UserInboxPayload + } + return nil +} + +func (x *StreamEvent) GetMediaPayload() *MediaPayload { + if x, ok := x.GetPayload().(*StreamEvent_MediaPayload); ok { + return x.MediaPayload + } + return nil +} + +func (x *StreamEvent) GetDmChannelPayload() *DmChannelPayload { + if x, ok := x.GetPayload().(*StreamEvent_DmChannelPayload); ok { + return x.DmChannelPayload + } + return nil +} + +func (x *StreamEvent) GetGdmChannelPayload() *GdmChannelPayload { + if x, ok := x.GetPayload().(*StreamEvent_GdmChannelPayload); ok { + return x.GdmChannelPayload + } + return nil +} + +type isStreamEvent_Payload interface { + isStreamEvent_Payload() +} + +type StreamEvent_MiniblockHeader struct { + MiniblockHeader *MiniblockHeader `protobuf:"bytes,100,opt,name=miniblock_header,json=miniblockHeader,proto3,oneof"` +} + +type StreamEvent_MemberPayload struct { + MemberPayload *MemberPayload `protobuf:"bytes,101,opt,name=member_payload,json=memberPayload,proto3,oneof"` +} + +type StreamEvent_SpacePayload struct { + SpacePayload *SpacePayload `protobuf:"bytes,102,opt,name=space_payload,json=spacePayload,proto3,oneof"` +} + +type StreamEvent_ChannelPayload struct { + ChannelPayload *ChannelPayload `protobuf:"bytes,103,opt,name=channel_payload,json=channelPayload,proto3,oneof"` +} + +type StreamEvent_UserPayload struct { + UserPayload *UserPayload `protobuf:"bytes,104,opt,name=user_payload,json=userPayload,proto3,oneof"` +} + +type StreamEvent_UserSettingsPayload struct { + UserSettingsPayload *UserSettingsPayload `protobuf:"bytes,105,opt,name=user_settings_payload,json=userSettingsPayload,proto3,oneof"` +} + +type StreamEvent_UserDeviceKeyPayload struct { + UserDeviceKeyPayload *UserDeviceKeyPayload `protobuf:"bytes,106,opt,name=user_device_key_payload,json=userDeviceKeyPayload,proto3,oneof"` +} + +type StreamEvent_UserInboxPayload struct { + UserInboxPayload *UserInboxPayload `protobuf:"bytes,107,opt,name=user_inbox_payload,json=userInboxPayload,proto3,oneof"` +} + +type StreamEvent_MediaPayload struct { + MediaPayload *MediaPayload `protobuf:"bytes,108,opt,name=media_payload,json=mediaPayload,proto3,oneof"` +} + +type StreamEvent_DmChannelPayload struct { + DmChannelPayload *DmChannelPayload `protobuf:"bytes,109,opt,name=dm_channel_payload,json=dmChannelPayload,proto3,oneof"` +} + +type StreamEvent_GdmChannelPayload struct { + GdmChannelPayload *GdmChannelPayload `protobuf:"bytes,110,opt,name=gdm_channel_payload,json=gdmChannelPayload,proto3,oneof"` +} + +func (*StreamEvent_MiniblockHeader) isStreamEvent_Payload() {} + +func (*StreamEvent_MemberPayload) isStreamEvent_Payload() {} + +func (*StreamEvent_SpacePayload) isStreamEvent_Payload() {} + +func (*StreamEvent_ChannelPayload) isStreamEvent_Payload() {} + +func (*StreamEvent_UserPayload) isStreamEvent_Payload() {} + +func (*StreamEvent_UserSettingsPayload) isStreamEvent_Payload() {} + +func (*StreamEvent_UserDeviceKeyPayload) isStreamEvent_Payload() {} + +func (*StreamEvent_UserInboxPayload) isStreamEvent_Payload() {} + +func (*StreamEvent_MediaPayload) isStreamEvent_Payload() {} + +func (*StreamEvent_DmChannelPayload) isStreamEvent_Payload() {} + +func (*StreamEvent_GdmChannelPayload) isStreamEvent_Payload() {} + +// * +// MiniblockHeader is a special event that forms a block from set of the stream events. +// Hash of the serialized StreamEvent containing MiniblockHeader is used as a block hash. +type MiniblockHeader struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Miniblock number. + // 0 for genesis block. + // Must be 1 greater than the previous block number. + MiniblockNum int64 `protobuf:"varint,1,opt,name=miniblock_num,json=miniblockNum,proto3" json:"miniblock_num,omitempty"` + // Hash of the previous block. + PrevMiniblockHash []byte `protobuf:"bytes,2,opt,name=prev_miniblock_hash,json=prevMiniblockHash,proto3" json:"prev_miniblock_hash,omitempty"` + // Timestamp of the block. + // Must be greater than the previous block timestamp. + Timestamp *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // Hashes of the events included in the block. + EventHashes [][]byte `protobuf:"bytes,4,rep,name=event_hashes,json=eventHashes,proto3" json:"event_hashes,omitempty"` + // Snapshot of the state at the end of the block. + Snapshot *Snapshot `protobuf:"bytes,5,opt,name=snapshot,proto3,oneof" json:"snapshot,omitempty"` + // count of all events in the stream before this block + EventNumOffset int64 `protobuf:"varint,6,opt,name=event_num_offset,json=eventNumOffset,proto3" json:"event_num_offset,omitempty"` + // pointer to block with previous snapshot + PrevSnapshotMiniblockNum int64 `protobuf:"varint,7,opt,name=prev_snapshot_miniblock_num,json=prevSnapshotMiniblockNum,proto3" json:"prev_snapshot_miniblock_num,omitempty"` + // stream payloads are required to have a content field + // + // Types that are assignable to Content: + // + // *MiniblockHeader_None + Content isMiniblockHeader_Content `protobuf_oneof:"content"` +} + +func (x *MiniblockHeader) Reset() { + *x = MiniblockHeader{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MiniblockHeader) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MiniblockHeader) ProtoMessage() {} + +func (x *MiniblockHeader) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MiniblockHeader.ProtoReflect.Descriptor instead. +func (*MiniblockHeader) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{3} +} + +func (x *MiniblockHeader) GetMiniblockNum() int64 { + if x != nil { + return x.MiniblockNum + } + return 0 +} + +func (x *MiniblockHeader) GetPrevMiniblockHash() []byte { + if x != nil { + return x.PrevMiniblockHash + } + return nil +} + +func (x *MiniblockHeader) GetTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.Timestamp + } + return nil +} + +func (x *MiniblockHeader) GetEventHashes() [][]byte { + if x != nil { + return x.EventHashes + } + return nil +} + +func (x *MiniblockHeader) GetSnapshot() *Snapshot { + if x != nil { + return x.Snapshot + } + return nil +} + +func (x *MiniblockHeader) GetEventNumOffset() int64 { + if x != nil { + return x.EventNumOffset + } + return 0 +} + +func (x *MiniblockHeader) GetPrevSnapshotMiniblockNum() int64 { + if x != nil { + return x.PrevSnapshotMiniblockNum + } + return 0 +} + +func (m *MiniblockHeader) GetContent() isMiniblockHeader_Content { + if m != nil { + return m.Content + } + return nil +} + +func (x *MiniblockHeader) GetNone() *emptypb.Empty { + if x, ok := x.GetContent().(*MiniblockHeader_None); ok { + return x.None + } + return nil +} + +type isMiniblockHeader_Content interface { + isMiniblockHeader_Content() +} + +type MiniblockHeader_None struct { + None *emptypb.Empty `protobuf:"bytes,100,opt,name=none,proto3,oneof"` +} + +func (*MiniblockHeader_None) isMiniblockHeader_Content() {} + +// * +// MemberPayload +// can appear in any stream +type MemberPayload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Content: + // + // *MemberPayload_Membership_ + // *MemberPayload_KeySolicitation_ + // *MemberPayload_KeyFulfillment_ + // *MemberPayload_Username + // *MemberPayload_DisplayName + // *MemberPayload_EnsAddress + // *MemberPayload_Nft_ + Content isMemberPayload_Content `protobuf_oneof:"content"` +} + +func (x *MemberPayload) Reset() { + *x = MemberPayload{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MemberPayload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MemberPayload) ProtoMessage() {} + +func (x *MemberPayload) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MemberPayload.ProtoReflect.Descriptor instead. +func (*MemberPayload) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{4} +} + +func (m *MemberPayload) GetContent() isMemberPayload_Content { + if m != nil { + return m.Content + } + return nil +} + +func (x *MemberPayload) GetMembership() *MemberPayload_Membership { + if x, ok := x.GetContent().(*MemberPayload_Membership_); ok { + return x.Membership + } + return nil +} + +func (x *MemberPayload) GetKeySolicitation() *MemberPayload_KeySolicitation { + if x, ok := x.GetContent().(*MemberPayload_KeySolicitation_); ok { + return x.KeySolicitation + } + return nil +} + +func (x *MemberPayload) GetKeyFulfillment() *MemberPayload_KeyFulfillment { + if x, ok := x.GetContent().(*MemberPayload_KeyFulfillment_); ok { + return x.KeyFulfillment + } + return nil +} + +func (x *MemberPayload) GetUsername() *EncryptedData { + if x, ok := x.GetContent().(*MemberPayload_Username); ok { + return x.Username + } + return nil +} + +func (x *MemberPayload) GetDisplayName() *EncryptedData { + if x, ok := x.GetContent().(*MemberPayload_DisplayName); ok { + return x.DisplayName + } + return nil +} + +func (x *MemberPayload) GetEnsAddress() []byte { + if x, ok := x.GetContent().(*MemberPayload_EnsAddress); ok { + return x.EnsAddress + } + return nil +} + +func (x *MemberPayload) GetNft() *MemberPayload_Nft { + if x, ok := x.GetContent().(*MemberPayload_Nft_); ok { + return x.Nft + } + return nil +} + +type isMemberPayload_Content interface { + isMemberPayload_Content() +} + +type MemberPayload_Membership_ struct { + Membership *MemberPayload_Membership `protobuf:"bytes,1,opt,name=membership,proto3,oneof"` +} + +type MemberPayload_KeySolicitation_ struct { + KeySolicitation *MemberPayload_KeySolicitation `protobuf:"bytes,2,opt,name=key_solicitation,json=keySolicitation,proto3,oneof"` +} + +type MemberPayload_KeyFulfillment_ struct { + KeyFulfillment *MemberPayload_KeyFulfillment `protobuf:"bytes,3,opt,name=key_fulfillment,json=keyFulfillment,proto3,oneof"` +} + +type MemberPayload_Username struct { + Username *EncryptedData `protobuf:"bytes,4,opt,name=username,proto3,oneof"` +} + +type MemberPayload_DisplayName struct { + DisplayName *EncryptedData `protobuf:"bytes,5,opt,name=display_name,json=displayName,proto3,oneof"` +} + +type MemberPayload_EnsAddress struct { + EnsAddress []byte `protobuf:"bytes,6,opt,name=ens_address,json=ensAddress,proto3,oneof"` +} + +type MemberPayload_Nft_ struct { + Nft *MemberPayload_Nft `protobuf:"bytes,7,opt,name=nft,proto3,oneof"` +} + +func (*MemberPayload_Membership_) isMemberPayload_Content() {} + +func (*MemberPayload_KeySolicitation_) isMemberPayload_Content() {} + +func (*MemberPayload_KeyFulfillment_) isMemberPayload_Content() {} + +func (*MemberPayload_Username) isMemberPayload_Content() {} + +func (*MemberPayload_DisplayName) isMemberPayload_Content() {} + +func (*MemberPayload_EnsAddress) isMemberPayload_Content() {} + +func (*MemberPayload_Nft_) isMemberPayload_Content() {} + +// * +// SpacePayload +type SpacePayload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Content: + // + // *SpacePayload_Inception_ + // *SpacePayload_Channel_ + Content isSpacePayload_Content `protobuf_oneof:"content"` +} + +func (x *SpacePayload) Reset() { + *x = SpacePayload{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SpacePayload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SpacePayload) ProtoMessage() {} + +func (x *SpacePayload) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SpacePayload.ProtoReflect.Descriptor instead. +func (*SpacePayload) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{5} +} + +func (m *SpacePayload) GetContent() isSpacePayload_Content { + if m != nil { + return m.Content + } + return nil +} + +func (x *SpacePayload) GetInception() *SpacePayload_Inception { + if x, ok := x.GetContent().(*SpacePayload_Inception_); ok { + return x.Inception + } + return nil +} + +func (x *SpacePayload) GetChannel() *SpacePayload_Channel { + if x, ok := x.GetContent().(*SpacePayload_Channel_); ok { + return x.Channel + } + return nil +} + +type isSpacePayload_Content interface { + isSpacePayload_Content() +} + +type SpacePayload_Inception_ struct { + Inception *SpacePayload_Inception `protobuf:"bytes,1,opt,name=inception,proto3,oneof"` +} + +type SpacePayload_Channel_ struct { + Channel *SpacePayload_Channel `protobuf:"bytes,2,opt,name=channel,proto3,oneof"` +} + +func (*SpacePayload_Inception_) isSpacePayload_Content() {} + +func (*SpacePayload_Channel_) isSpacePayload_Content() {} + +// * +// ChannelPayload +type ChannelPayload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Content: + // + // *ChannelPayload_Inception_ + // *ChannelPayload_Message + // *ChannelPayload_Redaction_ + Content isChannelPayload_Content `protobuf_oneof:"content"` +} + +func (x *ChannelPayload) Reset() { + *x = ChannelPayload{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChannelPayload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChannelPayload) ProtoMessage() {} + +func (x *ChannelPayload) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChannelPayload.ProtoReflect.Descriptor instead. +func (*ChannelPayload) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{6} +} + +func (m *ChannelPayload) GetContent() isChannelPayload_Content { + if m != nil { + return m.Content + } + return nil +} + +func (x *ChannelPayload) GetInception() *ChannelPayload_Inception { + if x, ok := x.GetContent().(*ChannelPayload_Inception_); ok { + return x.Inception + } + return nil +} + +func (x *ChannelPayload) GetMessage() *EncryptedData { + if x, ok := x.GetContent().(*ChannelPayload_Message); ok { + return x.Message + } + return nil +} + +func (x *ChannelPayload) GetRedaction() *ChannelPayload_Redaction { + if x, ok := x.GetContent().(*ChannelPayload_Redaction_); ok { + return x.Redaction + } + return nil +} + +type isChannelPayload_Content interface { + isChannelPayload_Content() +} + +type ChannelPayload_Inception_ struct { + Inception *ChannelPayload_Inception `protobuf:"bytes,1,opt,name=inception,proto3,oneof"` +} + +type ChannelPayload_Message struct { + Message *EncryptedData `protobuf:"bytes,2,opt,name=message,proto3,oneof"` +} + +type ChannelPayload_Redaction_ struct { + Redaction *ChannelPayload_Redaction `protobuf:"bytes,3,opt,name=redaction,proto3,oneof"` +} + +func (*ChannelPayload_Inception_) isChannelPayload_Content() {} + +func (*ChannelPayload_Message) isChannelPayload_Content() {} + +func (*ChannelPayload_Redaction_) isChannelPayload_Content() {} + +// * +// DmChannelPayload +type DmChannelPayload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Content: + // + // *DmChannelPayload_Inception_ + // *DmChannelPayload_Message + Content isDmChannelPayload_Content `protobuf_oneof:"content"` +} + +func (x *DmChannelPayload) Reset() { + *x = DmChannelPayload{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DmChannelPayload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DmChannelPayload) ProtoMessage() {} + +func (x *DmChannelPayload) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DmChannelPayload.ProtoReflect.Descriptor instead. +func (*DmChannelPayload) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{7} +} + +func (m *DmChannelPayload) GetContent() isDmChannelPayload_Content { + if m != nil { + return m.Content + } + return nil +} + +func (x *DmChannelPayload) GetInception() *DmChannelPayload_Inception { + if x, ok := x.GetContent().(*DmChannelPayload_Inception_); ok { + return x.Inception + } + return nil +} + +func (x *DmChannelPayload) GetMessage() *EncryptedData { + if x, ok := x.GetContent().(*DmChannelPayload_Message); ok { + return x.Message + } + return nil +} + +type isDmChannelPayload_Content interface { + isDmChannelPayload_Content() +} + +type DmChannelPayload_Inception_ struct { + Inception *DmChannelPayload_Inception `protobuf:"bytes,1,opt,name=inception,proto3,oneof"` +} + +type DmChannelPayload_Message struct { + Message *EncryptedData `protobuf:"bytes,3,opt,name=message,proto3,oneof"` +} + +func (*DmChannelPayload_Inception_) isDmChannelPayload_Content() {} + +func (*DmChannelPayload_Message) isDmChannelPayload_Content() {} + +// * +// GdmChannelPayload +type GdmChannelPayload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Content: + // + // *GdmChannelPayload_Inception_ + // *GdmChannelPayload_Message + // *GdmChannelPayload_ChannelProperties + Content isGdmChannelPayload_Content `protobuf_oneof:"content"` +} + +func (x *GdmChannelPayload) Reset() { + *x = GdmChannelPayload{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GdmChannelPayload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GdmChannelPayload) ProtoMessage() {} + +func (x *GdmChannelPayload) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GdmChannelPayload.ProtoReflect.Descriptor instead. +func (*GdmChannelPayload) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{8} +} + +func (m *GdmChannelPayload) GetContent() isGdmChannelPayload_Content { + if m != nil { + return m.Content + } + return nil +} + +func (x *GdmChannelPayload) GetInception() *GdmChannelPayload_Inception { + if x, ok := x.GetContent().(*GdmChannelPayload_Inception_); ok { + return x.Inception + } + return nil +} + +func (x *GdmChannelPayload) GetMessage() *EncryptedData { + if x, ok := x.GetContent().(*GdmChannelPayload_Message); ok { + return x.Message + } + return nil +} + +func (x *GdmChannelPayload) GetChannelProperties() *EncryptedData { + if x, ok := x.GetContent().(*GdmChannelPayload_ChannelProperties); ok { + return x.ChannelProperties + } + return nil +} + +type isGdmChannelPayload_Content interface { + isGdmChannelPayload_Content() +} + +type GdmChannelPayload_Inception_ struct { + Inception *GdmChannelPayload_Inception `protobuf:"bytes,1,opt,name=inception,proto3,oneof"` +} + +type GdmChannelPayload_Message struct { + Message *EncryptedData `protobuf:"bytes,2,opt,name=message,proto3,oneof"` +} + +type GdmChannelPayload_ChannelProperties struct { + ChannelProperties *EncryptedData `protobuf:"bytes,3,opt,name=channel_properties,json=channelProperties,proto3,oneof"` +} + +func (*GdmChannelPayload_Inception_) isGdmChannelPayload_Content() {} + +func (*GdmChannelPayload_Message) isGdmChannelPayload_Content() {} + +func (*GdmChannelPayload_ChannelProperties) isGdmChannelPayload_Content() {} + +// * +// UserPayload +type UserPayload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Content: + // + // *UserPayload_Inception_ + // *UserPayload_UserMembership_ + // *UserPayload_UserMembershipAction_ + Content isUserPayload_Content `protobuf_oneof:"content"` +} + +func (x *UserPayload) Reset() { + *x = UserPayload{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserPayload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserPayload) ProtoMessage() {} + +func (x *UserPayload) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserPayload.ProtoReflect.Descriptor instead. +func (*UserPayload) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{9} +} + +func (m *UserPayload) GetContent() isUserPayload_Content { + if m != nil { + return m.Content + } + return nil +} + +func (x *UserPayload) GetInception() *UserPayload_Inception { + if x, ok := x.GetContent().(*UserPayload_Inception_); ok { + return x.Inception + } + return nil +} + +func (x *UserPayload) GetUserMembership() *UserPayload_UserMembership { + if x, ok := x.GetContent().(*UserPayload_UserMembership_); ok { + return x.UserMembership + } + return nil +} + +func (x *UserPayload) GetUserMembershipAction() *UserPayload_UserMembershipAction { + if x, ok := x.GetContent().(*UserPayload_UserMembershipAction_); ok { + return x.UserMembershipAction + } + return nil +} + +type isUserPayload_Content interface { + isUserPayload_Content() +} + +type UserPayload_Inception_ struct { + Inception *UserPayload_Inception `protobuf:"bytes,1,opt,name=inception,proto3,oneof"` +} + +type UserPayload_UserMembership_ struct { + UserMembership *UserPayload_UserMembership `protobuf:"bytes,2,opt,name=user_membership,json=userMembership,proto3,oneof"` +} + +type UserPayload_UserMembershipAction_ struct { + UserMembershipAction *UserPayload_UserMembershipAction `protobuf:"bytes,3,opt,name=user_membership_action,json=userMembershipAction,proto3,oneof"` +} + +func (*UserPayload_Inception_) isUserPayload_Content() {} + +func (*UserPayload_UserMembership_) isUserPayload_Content() {} + +func (*UserPayload_UserMembershipAction_) isUserPayload_Content() {} + +// * +// UserInboxPayload +// messages to a user encrypted per deviceId +type UserInboxPayload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Content: + // + // *UserInboxPayload_Inception_ + // *UserInboxPayload_Ack_ + // *UserInboxPayload_GroupEncryptionSessions_ + Content isUserInboxPayload_Content `protobuf_oneof:"content"` +} + +func (x *UserInboxPayload) Reset() { + *x = UserInboxPayload{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserInboxPayload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserInboxPayload) ProtoMessage() {} + +func (x *UserInboxPayload) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserInboxPayload.ProtoReflect.Descriptor instead. +func (*UserInboxPayload) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{10} +} + +func (m *UserInboxPayload) GetContent() isUserInboxPayload_Content { + if m != nil { + return m.Content + } + return nil +} + +func (x *UserInboxPayload) GetInception() *UserInboxPayload_Inception { + if x, ok := x.GetContent().(*UserInboxPayload_Inception_); ok { + return x.Inception + } + return nil +} + +func (x *UserInboxPayload) GetAck() *UserInboxPayload_Ack { + if x, ok := x.GetContent().(*UserInboxPayload_Ack_); ok { + return x.Ack + } + return nil +} + +func (x *UserInboxPayload) GetGroupEncryptionSessions() *UserInboxPayload_GroupEncryptionSessions { + if x, ok := x.GetContent().(*UserInboxPayload_GroupEncryptionSessions_); ok { + return x.GroupEncryptionSessions + } + return nil +} + +type isUserInboxPayload_Content interface { + isUserInboxPayload_Content() +} + +type UserInboxPayload_Inception_ struct { + Inception *UserInboxPayload_Inception `protobuf:"bytes,1,opt,name=inception,proto3,oneof"` +} + +type UserInboxPayload_Ack_ struct { + Ack *UserInboxPayload_Ack `protobuf:"bytes,2,opt,name=ack,proto3,oneof"` +} + +type UserInboxPayload_GroupEncryptionSessions_ struct { + GroupEncryptionSessions *UserInboxPayload_GroupEncryptionSessions `protobuf:"bytes,3,opt,name=group_encryption_sessions,json=groupEncryptionSessions,proto3,oneof"` +} + +func (*UserInboxPayload_Inception_) isUserInboxPayload_Content() {} + +func (*UserInboxPayload_Ack_) isUserInboxPayload_Content() {} + +func (*UserInboxPayload_GroupEncryptionSessions_) isUserInboxPayload_Content() {} + +// * +// UserSettingsPayload +type UserSettingsPayload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Content: + // + // *UserSettingsPayload_Inception_ + // *UserSettingsPayload_FullyReadMarkers_ + // *UserSettingsPayload_UserBlock_ + Content isUserSettingsPayload_Content `protobuf_oneof:"content"` +} + +func (x *UserSettingsPayload) Reset() { + *x = UserSettingsPayload{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserSettingsPayload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserSettingsPayload) ProtoMessage() {} + +func (x *UserSettingsPayload) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserSettingsPayload.ProtoReflect.Descriptor instead. +func (*UserSettingsPayload) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{11} +} + +func (m *UserSettingsPayload) GetContent() isUserSettingsPayload_Content { + if m != nil { + return m.Content + } + return nil +} + +func (x *UserSettingsPayload) GetInception() *UserSettingsPayload_Inception { + if x, ok := x.GetContent().(*UserSettingsPayload_Inception_); ok { + return x.Inception + } + return nil +} + +func (x *UserSettingsPayload) GetFullyReadMarkers() *UserSettingsPayload_FullyReadMarkers { + if x, ok := x.GetContent().(*UserSettingsPayload_FullyReadMarkers_); ok { + return x.FullyReadMarkers + } + return nil +} + +func (x *UserSettingsPayload) GetUserBlock() *UserSettingsPayload_UserBlock { + if x, ok := x.GetContent().(*UserSettingsPayload_UserBlock_); ok { + return x.UserBlock + } + return nil +} + +type isUserSettingsPayload_Content interface { + isUserSettingsPayload_Content() +} + +type UserSettingsPayload_Inception_ struct { + Inception *UserSettingsPayload_Inception `protobuf:"bytes,1,opt,name=inception,proto3,oneof"` +} + +type UserSettingsPayload_FullyReadMarkers_ struct { + FullyReadMarkers *UserSettingsPayload_FullyReadMarkers `protobuf:"bytes,2,opt,name=fully_read_markers,json=fullyReadMarkers,proto3,oneof"` +} + +type UserSettingsPayload_UserBlock_ struct { + UserBlock *UserSettingsPayload_UserBlock `protobuf:"bytes,3,opt,name=user_block,json=userBlock,proto3,oneof"` +} + +func (*UserSettingsPayload_Inception_) isUserSettingsPayload_Content() {} + +func (*UserSettingsPayload_FullyReadMarkers_) isUserSettingsPayload_Content() {} + +func (*UserSettingsPayload_UserBlock_) isUserSettingsPayload_Content() {} + +// * +// UserDeviceKeyPayload +type UserDeviceKeyPayload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Content: + // + // *UserDeviceKeyPayload_Inception_ + // *UserDeviceKeyPayload_EncryptionDevice_ + Content isUserDeviceKeyPayload_Content `protobuf_oneof:"content"` +} + +func (x *UserDeviceKeyPayload) Reset() { + *x = UserDeviceKeyPayload{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserDeviceKeyPayload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserDeviceKeyPayload) ProtoMessage() {} + +func (x *UserDeviceKeyPayload) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserDeviceKeyPayload.ProtoReflect.Descriptor instead. +func (*UserDeviceKeyPayload) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{12} +} + +func (m *UserDeviceKeyPayload) GetContent() isUserDeviceKeyPayload_Content { + if m != nil { + return m.Content + } + return nil +} + +func (x *UserDeviceKeyPayload) GetInception() *UserDeviceKeyPayload_Inception { + if x, ok := x.GetContent().(*UserDeviceKeyPayload_Inception_); ok { + return x.Inception + } + return nil +} + +func (x *UserDeviceKeyPayload) GetEncryptionDevice() *UserDeviceKeyPayload_EncryptionDevice { + if x, ok := x.GetContent().(*UserDeviceKeyPayload_EncryptionDevice_); ok { + return x.EncryptionDevice + } + return nil +} + +type isUserDeviceKeyPayload_Content interface { + isUserDeviceKeyPayload_Content() +} + +type UserDeviceKeyPayload_Inception_ struct { + Inception *UserDeviceKeyPayload_Inception `protobuf:"bytes,1,opt,name=inception,proto3,oneof"` +} + +type UserDeviceKeyPayload_EncryptionDevice_ struct { + EncryptionDevice *UserDeviceKeyPayload_EncryptionDevice `protobuf:"bytes,2,opt,name=encryption_device,json=encryptionDevice,proto3,oneof"` +} + +func (*UserDeviceKeyPayload_Inception_) isUserDeviceKeyPayload_Content() {} + +func (*UserDeviceKeyPayload_EncryptionDevice_) isUserDeviceKeyPayload_Content() {} + +// * +// MediaPayload +type MediaPayload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Content: + // + // *MediaPayload_Inception_ + // *MediaPayload_Chunk_ + Content isMediaPayload_Content `protobuf_oneof:"content"` +} + +func (x *MediaPayload) Reset() { + *x = MediaPayload{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MediaPayload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MediaPayload) ProtoMessage() {} + +func (x *MediaPayload) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MediaPayload.ProtoReflect.Descriptor instead. +func (*MediaPayload) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{13} +} + +func (m *MediaPayload) GetContent() isMediaPayload_Content { + if m != nil { + return m.Content + } + return nil +} + +func (x *MediaPayload) GetInception() *MediaPayload_Inception { + if x, ok := x.GetContent().(*MediaPayload_Inception_); ok { + return x.Inception + } + return nil +} + +func (x *MediaPayload) GetChunk() *MediaPayload_Chunk { + if x, ok := x.GetContent().(*MediaPayload_Chunk_); ok { + return x.Chunk + } + return nil +} + +type isMediaPayload_Content interface { + isMediaPayload_Content() +} + +type MediaPayload_Inception_ struct { + Inception *MediaPayload_Inception `protobuf:"bytes,1,opt,name=inception,proto3,oneof"` +} + +type MediaPayload_Chunk_ struct { + Chunk *MediaPayload_Chunk `protobuf:"bytes,2,opt,name=chunk,proto3,oneof"` +} + +func (*MediaPayload_Inception_) isMediaPayload_Content() {} + +func (*MediaPayload_Chunk_) isMediaPayload_Content() {} + +// * +// Snapshot contains a summary of all state events up to the most recent miniblock +type Snapshot struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Members *MemberPayload_Snapshot `protobuf:"bytes,1,opt,name=members,proto3" json:"members,omitempty"` + SnapshotVersion int32 `protobuf:"varint,2,opt,name=snapshot_version,json=snapshotVersion,proto3" json:"snapshot_version,omitempty"` + // Snapshot data specific for each stream type. + // + // Types that are assignable to Content: + // + // *Snapshot_SpaceContent + // *Snapshot_ChannelContent + // *Snapshot_UserContent + // *Snapshot_UserSettingsContent + // *Snapshot_UserDeviceKeyContent + // *Snapshot_MediaContent + // *Snapshot_DmChannelContent + // *Snapshot_GdmChannelContent + // *Snapshot_UserInboxContent + Content isSnapshot_Content `protobuf_oneof:"content"` +} + +func (x *Snapshot) Reset() { + *x = Snapshot{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Snapshot) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Snapshot) ProtoMessage() {} + +func (x *Snapshot) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Snapshot.ProtoReflect.Descriptor instead. +func (*Snapshot) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{14} +} + +func (x *Snapshot) GetMembers() *MemberPayload_Snapshot { + if x != nil { + return x.Members + } + return nil +} + +func (x *Snapshot) GetSnapshotVersion() int32 { + if x != nil { + return x.SnapshotVersion + } + return 0 +} + +func (m *Snapshot) GetContent() isSnapshot_Content { + if m != nil { + return m.Content + } + return nil +} + +func (x *Snapshot) GetSpaceContent() *SpacePayload_Snapshot { + if x, ok := x.GetContent().(*Snapshot_SpaceContent); ok { + return x.SpaceContent + } + return nil +} + +func (x *Snapshot) GetChannelContent() *ChannelPayload_Snapshot { + if x, ok := x.GetContent().(*Snapshot_ChannelContent); ok { + return x.ChannelContent + } + return nil +} + +func (x *Snapshot) GetUserContent() *UserPayload_Snapshot { + if x, ok := x.GetContent().(*Snapshot_UserContent); ok { + return x.UserContent + } + return nil +} + +func (x *Snapshot) GetUserSettingsContent() *UserSettingsPayload_Snapshot { + if x, ok := x.GetContent().(*Snapshot_UserSettingsContent); ok { + return x.UserSettingsContent + } + return nil +} + +func (x *Snapshot) GetUserDeviceKeyContent() *UserDeviceKeyPayload_Snapshot { + if x, ok := x.GetContent().(*Snapshot_UserDeviceKeyContent); ok { + return x.UserDeviceKeyContent + } + return nil +} + +func (x *Snapshot) GetMediaContent() *MediaPayload_Snapshot { + if x, ok := x.GetContent().(*Snapshot_MediaContent); ok { + return x.MediaContent + } + return nil +} + +func (x *Snapshot) GetDmChannelContent() *DmChannelPayload_Snapshot { + if x, ok := x.GetContent().(*Snapshot_DmChannelContent); ok { + return x.DmChannelContent + } + return nil +} + +func (x *Snapshot) GetGdmChannelContent() *GdmChannelPayload_Snapshot { + if x, ok := x.GetContent().(*Snapshot_GdmChannelContent); ok { + return x.GdmChannelContent + } + return nil +} + +func (x *Snapshot) GetUserInboxContent() *UserInboxPayload_Snapshot { + if x, ok := x.GetContent().(*Snapshot_UserInboxContent); ok { + return x.UserInboxContent + } + return nil +} + +type isSnapshot_Content interface { + isSnapshot_Content() +} + +type Snapshot_SpaceContent struct { + SpaceContent *SpacePayload_Snapshot `protobuf:"bytes,101,opt,name=space_content,json=spaceContent,proto3,oneof"` +} + +type Snapshot_ChannelContent struct { + ChannelContent *ChannelPayload_Snapshot `protobuf:"bytes,102,opt,name=channel_content,json=channelContent,proto3,oneof"` +} + +type Snapshot_UserContent struct { + UserContent *UserPayload_Snapshot `protobuf:"bytes,103,opt,name=user_content,json=userContent,proto3,oneof"` +} + +type Snapshot_UserSettingsContent struct { + UserSettingsContent *UserSettingsPayload_Snapshot `protobuf:"bytes,104,opt,name=user_settings_content,json=userSettingsContent,proto3,oneof"` +} + +type Snapshot_UserDeviceKeyContent struct { + UserDeviceKeyContent *UserDeviceKeyPayload_Snapshot `protobuf:"bytes,105,opt,name=user_device_key_content,json=userDeviceKeyContent,proto3,oneof"` +} + +type Snapshot_MediaContent struct { + MediaContent *MediaPayload_Snapshot `protobuf:"bytes,106,opt,name=media_content,json=mediaContent,proto3,oneof"` +} + +type Snapshot_DmChannelContent struct { + DmChannelContent *DmChannelPayload_Snapshot `protobuf:"bytes,107,opt,name=dm_channel_content,json=dmChannelContent,proto3,oneof"` +} + +type Snapshot_GdmChannelContent struct { + GdmChannelContent *GdmChannelPayload_Snapshot `protobuf:"bytes,108,opt,name=gdm_channel_content,json=gdmChannelContent,proto3,oneof"` +} + +type Snapshot_UserInboxContent struct { + UserInboxContent *UserInboxPayload_Snapshot `protobuf:"bytes,109,opt,name=user_inbox_content,json=userInboxContent,proto3,oneof"` +} + +func (*Snapshot_SpaceContent) isSnapshot_Content() {} + +func (*Snapshot_ChannelContent) isSnapshot_Content() {} + +func (*Snapshot_UserContent) isSnapshot_Content() {} + +func (*Snapshot_UserSettingsContent) isSnapshot_Content() {} + +func (*Snapshot_UserDeviceKeyContent) isSnapshot_Content() {} + +func (*Snapshot_MediaContent) isSnapshot_Content() {} + +func (*Snapshot_DmChannelContent) isSnapshot_Content() {} + +func (*Snapshot_GdmChannelContent) isSnapshot_Content() {} + +func (*Snapshot_UserInboxContent) isSnapshot_Content() {} + +// * +// Derived event is produces by server when there should be additional event to compliment +// received event. For example, when user joins a space through event in the space stream, server will produce a derived event +// in a user stream to indicate that user joined a particual space. +// +// EventRef is used to reference the event that caused the derived event to be produced. +type EventRef struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + Hash []byte `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"` + Signature []byte `protobuf:"bytes,3,opt,name=signature,proto3" json:"signature,omitempty"` +} + +func (x *EventRef) Reset() { + *x = EventRef{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EventRef) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EventRef) ProtoMessage() {} + +func (x *EventRef) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EventRef.ProtoReflect.Descriptor instead. +func (*EventRef) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{15} +} + +func (x *EventRef) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *EventRef) GetHash() []byte { + if x != nil { + return x.Hash + } + return nil +} + +func (x *EventRef) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +// * +// StreamSettings is a part of inception payload for each stream type. +type StreamSettings struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Test setting for testing with manual miniblock creation through Info debug request. + DisableMiniblockCreation bool `protobuf:"varint,1,opt,name=disable_miniblock_creation,json=disableMiniblockCreation,proto3" json:"disable_miniblock_creation,omitempty"` +} + +func (x *StreamSettings) Reset() { + *x = StreamSettings{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StreamSettings) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StreamSettings) ProtoMessage() {} + +func (x *StreamSettings) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StreamSettings.ProtoReflect.Descriptor instead. +func (*StreamSettings) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{16} +} + +func (x *StreamSettings) GetDisableMiniblockCreation() bool { + if x != nil { + return x.DisableMiniblockCreation + } + return false +} + +// * +// EncryptedData +type EncryptedData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // * + // Ciphertext of the encryption envelope. + Ciphertext string `protobuf:"bytes,1,opt,name=ciphertext,proto3" json:"ciphertext,omitempty"` + // * + // Encryption algorithm used to encrypt this event. + Algorithm string `protobuf:"bytes,2,opt,name=algorithm,proto3" json:"algorithm,omitempty"` + // * + // Sender device public key identifying the sender's device. + SenderKey string `protobuf:"bytes,3,opt,name=sender_key,json=senderKey,proto3" json:"sender_key,omitempty"` + // * + // The ID of the session used to encrypt the message. + SessionId string `protobuf:"bytes,4,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"` + // * + // Optional checksum of the cleartext data. + Checksum *string `protobuf:"bytes,5,opt,name=checksum,proto3,oneof" json:"checksum,omitempty"` + // * + // Optional reference to parent event ID + RefEventId *string `protobuf:"bytes,6,opt,name=ref_event_id,json=refEventId,proto3,oneof" json:"ref_event_id,omitempty"` +} + +func (x *EncryptedData) Reset() { + *x = EncryptedData{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EncryptedData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EncryptedData) ProtoMessage() {} + +func (x *EncryptedData) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EncryptedData.ProtoReflect.Descriptor instead. +func (*EncryptedData) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{17} +} + +func (x *EncryptedData) GetCiphertext() string { + if x != nil { + return x.Ciphertext + } + return "" +} + +func (x *EncryptedData) GetAlgorithm() string { + if x != nil { + return x.Algorithm + } + return "" +} + +func (x *EncryptedData) GetSenderKey() string { + if x != nil { + return x.SenderKey + } + return "" +} + +func (x *EncryptedData) GetSessionId() string { + if x != nil { + return x.SessionId + } + return "" +} + +func (x *EncryptedData) GetChecksum() string { + if x != nil && x.Checksum != nil { + return *x.Checksum + } + return "" +} + +func (x *EncryptedData) GetRefEventId() string { + if x != nil && x.RefEventId != nil { + return *x.RefEventId + } + return "" +} + +type WrappedEncryptedData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data *EncryptedData `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + EventNum int64 `protobuf:"varint,2,opt,name=event_num,json=eventNum,proto3" json:"event_num,omitempty"` + EventHash []byte `protobuf:"bytes,3,opt,name=event_hash,json=eventHash,proto3" json:"event_hash,omitempty"` +} + +func (x *WrappedEncryptedData) Reset() { + *x = WrappedEncryptedData{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WrappedEncryptedData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WrappedEncryptedData) ProtoMessage() {} + +func (x *WrappedEncryptedData) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WrappedEncryptedData.ProtoReflect.Descriptor instead. +func (*WrappedEncryptedData) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{18} +} + +func (x *WrappedEncryptedData) GetData() *EncryptedData { + if x != nil { + return x.Data + } + return nil +} + +func (x *WrappedEncryptedData) GetEventNum() int64 { + if x != nil { + return x.EventNum + } + return 0 +} + +func (x *WrappedEncryptedData) GetEventHash() []byte { + if x != nil { + return x.EventHash + } + return nil +} + +type SyncCookie struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeAddress []byte `protobuf:"bytes,1,opt,name=node_address,json=nodeAddress,proto3" json:"node_address,omitempty"` + StreamId []byte `protobuf:"bytes,2,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + MinipoolGen int64 `protobuf:"varint,3,opt,name=minipool_gen,json=minipoolGen,proto3" json:"minipool_gen,omitempty"` + MinipoolSlot int64 `protobuf:"varint,4,opt,name=minipool_slot,json=minipoolSlot,proto3" json:"minipool_slot,omitempty"` + PrevMiniblockHash []byte `protobuf:"bytes,5,opt,name=prev_miniblock_hash,json=prevMiniblockHash,proto3" json:"prev_miniblock_hash,omitempty"` +} + +func (x *SyncCookie) Reset() { + *x = SyncCookie{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SyncCookie) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SyncCookie) ProtoMessage() {} + +func (x *SyncCookie) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SyncCookie.ProtoReflect.Descriptor instead. +func (*SyncCookie) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{19} +} + +func (x *SyncCookie) GetNodeAddress() []byte { + if x != nil { + return x.NodeAddress + } + return nil +} + +func (x *SyncCookie) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *SyncCookie) GetMinipoolGen() int64 { + if x != nil { + return x.MinipoolGen + } + return 0 +} + +func (x *SyncCookie) GetMinipoolSlot() int64 { + if x != nil { + return x.MinipoolSlot + } + return 0 +} + +func (x *SyncCookie) GetPrevMiniblockHash() []byte { + if x != nil { + return x.PrevMiniblockHash + } + return nil +} + +type StreamAndCookie struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Events []*Envelope `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + NextSyncCookie *SyncCookie `protobuf:"bytes,2,opt,name=next_sync_cookie,json=nextSyncCookie,proto3" json:"next_sync_cookie,omitempty"` + // if non-empty, contains all blocks since the latest snapshot, miniblocks[0].header is the latest snapshot + Miniblocks []*Miniblock `protobuf:"bytes,3,rep,name=miniblocks,proto3" json:"miniblocks,omitempty"` + SyncReset bool `protobuf:"varint,4,opt,name=sync_reset,json=syncReset,proto3" json:"sync_reset,omitempty"` +} + +func (x *StreamAndCookie) Reset() { + *x = StreamAndCookie{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StreamAndCookie) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StreamAndCookie) ProtoMessage() {} + +func (x *StreamAndCookie) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StreamAndCookie.ProtoReflect.Descriptor instead. +func (*StreamAndCookie) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{20} +} + +func (x *StreamAndCookie) GetEvents() []*Envelope { + if x != nil { + return x.Events + } + return nil +} + +func (x *StreamAndCookie) GetNextSyncCookie() *SyncCookie { + if x != nil { + return x.NextSyncCookie + } + return nil +} + +func (x *StreamAndCookie) GetMiniblocks() []*Miniblock { + if x != nil { + return x.Miniblocks + } + return nil +} + +func (x *StreamAndCookie) GetSyncReset() bool { + if x != nil { + return x.SyncReset + } + return false +} + +type GetStreamExRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` +} + +func (x *GetStreamExRequest) Reset() { + *x = GetStreamExRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetStreamExRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetStreamExRequest) ProtoMessage() {} + +func (x *GetStreamExRequest) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetStreamExRequest.ProtoReflect.Descriptor instead. +func (*GetStreamExRequest) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{21} +} + +func (x *GetStreamExRequest) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +type Minipool struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Events []*Envelope `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` +} + +func (x *Minipool) Reset() { + *x = Minipool{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Minipool) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Minipool) ProtoMessage() {} + +func (x *Minipool) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Minipool.ProtoReflect.Descriptor instead. +func (*Minipool) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{22} +} + +func (x *Minipool) GetEvents() []*Envelope { + if x != nil { + return x.Events + } + return nil +} + +// GetStreamExResponse is a stream of raw data that represents the current state of the requested stream. +// These responses represent streams that are not expected to change once finalized, and have a optimized code path +// for retrieval. Response may potentially be very large, and are streamed back to the client. The client is expected +// to martial the raw data back into protobuf messages. +type GetStreamExResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Data: + // + // *GetStreamExResponse_Miniblock + // *GetStreamExResponse_Minipool + Data isGetStreamExResponse_Data `protobuf_oneof:"data"` +} + +func (x *GetStreamExResponse) Reset() { + *x = GetStreamExResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetStreamExResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetStreamExResponse) ProtoMessage() {} + +func (x *GetStreamExResponse) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetStreamExResponse.ProtoReflect.Descriptor instead. +func (*GetStreamExResponse) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{23} +} + +func (m *GetStreamExResponse) GetData() isGetStreamExResponse_Data { + if m != nil { + return m.Data + } + return nil +} + +func (x *GetStreamExResponse) GetMiniblock() *Miniblock { + if x, ok := x.GetData().(*GetStreamExResponse_Miniblock); ok { + return x.Miniblock + } + return nil +} + +func (x *GetStreamExResponse) GetMinipool() *Minipool { + if x, ok := x.GetData().(*GetStreamExResponse_Minipool); ok { + return x.Minipool + } + return nil +} + +type isGetStreamExResponse_Data interface { + isGetStreamExResponse_Data() +} + +type GetStreamExResponse_Miniblock struct { + Miniblock *Miniblock `protobuf:"bytes,1,opt,name=miniblock,proto3,oneof"` +} + +type GetStreamExResponse_Minipool struct { + Minipool *Minipool `protobuf:"bytes,2,opt,name=minipool,proto3,oneof"` +} + +func (*GetStreamExResponse_Miniblock) isGetStreamExResponse_Data() {} + +func (*GetStreamExResponse_Minipool) isGetStreamExResponse_Data() {} + +type CreateStreamRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Events []*Envelope `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + StreamId []byte `protobuf:"bytes,2,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` // stream_id should match the stream_id in the inception payload of the first event +} + +func (x *CreateStreamRequest) Reset() { + *x = CreateStreamRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateStreamRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateStreamRequest) ProtoMessage() {} + +func (x *CreateStreamRequest) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateStreamRequest.ProtoReflect.Descriptor instead. +func (*CreateStreamRequest) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{24} +} + +func (x *CreateStreamRequest) GetEvents() []*Envelope { + if x != nil { + return x.Events + } + return nil +} + +func (x *CreateStreamRequest) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +type CreateStreamResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // all events in current minipool and cookie allowing to sync from the end of the stream + Stream *StreamAndCookie `protobuf:"bytes,1,opt,name=stream,proto3" json:"stream,omitempty"` +} + +func (x *CreateStreamResponse) Reset() { + *x = CreateStreamResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateStreamResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateStreamResponse) ProtoMessage() {} + +func (x *CreateStreamResponse) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateStreamResponse.ProtoReflect.Descriptor instead. +func (*CreateStreamResponse) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{25} +} + +func (x *CreateStreamResponse) GetStream() *StreamAndCookie { + if x != nil { + return x.Stream + } + return nil +} + +type GetStreamRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + // if optional is true and stream doesn't exist, response will be a nil stream instead of ERROR NOT_FOUND + Optional bool `protobuf:"varint,2,opt,name=optional,proto3" json:"optional,omitempty"` +} + +func (x *GetStreamRequest) Reset() { + *x = GetStreamRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetStreamRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetStreamRequest) ProtoMessage() {} + +func (x *GetStreamRequest) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetStreamRequest.ProtoReflect.Descriptor instead. +func (*GetStreamRequest) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{26} +} + +func (x *GetStreamRequest) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *GetStreamRequest) GetOptional() bool { + if x != nil { + return x.Optional + } + return false +} + +type GetStreamResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // all events in current minipool and cookie allowing to sync from the end of the stream + Stream *StreamAndCookie `protobuf:"bytes,1,opt,name=stream,proto3" json:"stream,omitempty"` +} + +func (x *GetStreamResponse) Reset() { + *x = GetStreamResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetStreamResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetStreamResponse) ProtoMessage() {} + +func (x *GetStreamResponse) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetStreamResponse.ProtoReflect.Descriptor instead. +func (*GetStreamResponse) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{27} +} + +func (x *GetStreamResponse) GetStream() *StreamAndCookie { + if x != nil { + return x.Stream + } + return nil +} + +type GetMiniblocksRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + FromInclusive int64 `protobuf:"varint,2,opt,name=fromInclusive,proto3" json:"fromInclusive,omitempty"` + ToExclusive int64 `protobuf:"varint,3,opt,name=toExclusive,proto3" json:"toExclusive,omitempty"` +} + +func (x *GetMiniblocksRequest) Reset() { + *x = GetMiniblocksRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetMiniblocksRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetMiniblocksRequest) ProtoMessage() {} + +func (x *GetMiniblocksRequest) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetMiniblocksRequest.ProtoReflect.Descriptor instead. +func (*GetMiniblocksRequest) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{28} +} + +func (x *GetMiniblocksRequest) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *GetMiniblocksRequest) GetFromInclusive() int64 { + if x != nil { + return x.FromInclusive + } + return 0 +} + +func (x *GetMiniblocksRequest) GetToExclusive() int64 { + if x != nil { + return x.ToExclusive + } + return 0 +} + +type GetMiniblocksResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Miniblocks []*Miniblock `protobuf:"bytes,1,rep,name=miniblocks,proto3" json:"miniblocks,omitempty"` + // terminus: true if there are no more blocks to fetch because they've been garbage collected, or you've reached block 0 + Terminus bool `protobuf:"varint,2,opt,name=terminus,proto3" json:"terminus,omitempty"` +} + +func (x *GetMiniblocksResponse) Reset() { + *x = GetMiniblocksResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetMiniblocksResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetMiniblocksResponse) ProtoMessage() {} + +func (x *GetMiniblocksResponse) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetMiniblocksResponse.ProtoReflect.Descriptor instead. +func (*GetMiniblocksResponse) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{29} +} + +func (x *GetMiniblocksResponse) GetMiniblocks() []*Miniblock { + if x != nil { + return x.Miniblocks + } + return nil +} + +func (x *GetMiniblocksResponse) GetTerminus() bool { + if x != nil { + return x.Terminus + } + return false +} + +type GetLastMiniblockHashRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` +} + +func (x *GetLastMiniblockHashRequest) Reset() { + *x = GetLastMiniblockHashRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetLastMiniblockHashRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetLastMiniblockHashRequest) ProtoMessage() {} + +func (x *GetLastMiniblockHashRequest) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetLastMiniblockHashRequest.ProtoReflect.Descriptor instead. +func (*GetLastMiniblockHashRequest) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{30} +} + +func (x *GetLastMiniblockHashRequest) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +type GetLastMiniblockHashResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + MiniblockNum int64 `protobuf:"varint,2,opt,name=miniblock_num,json=miniblockNum,proto3" json:"miniblock_num,omitempty"` +} + +func (x *GetLastMiniblockHashResponse) Reset() { + *x = GetLastMiniblockHashResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetLastMiniblockHashResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetLastMiniblockHashResponse) ProtoMessage() {} + +func (x *GetLastMiniblockHashResponse) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetLastMiniblockHashResponse.ProtoReflect.Descriptor instead. +func (*GetLastMiniblockHashResponse) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{31} +} + +func (x *GetLastMiniblockHashResponse) GetHash() []byte { + if x != nil { + return x.Hash + } + return nil +} + +func (x *GetLastMiniblockHashResponse) GetMiniblockNum() int64 { + if x != nil { + return x.MiniblockNum + } + return 0 +} + +type AddEventRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + Event *Envelope `protobuf:"bytes,2,opt,name=event,proto3" json:"event,omitempty"` +} + +func (x *AddEventRequest) Reset() { + *x = AddEventRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddEventRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddEventRequest) ProtoMessage() {} + +func (x *AddEventRequest) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[32] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddEventRequest.ProtoReflect.Descriptor instead. +func (*AddEventRequest) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{32} +} + +func (x *AddEventRequest) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *AddEventRequest) GetEvent() *Envelope { + if x != nil { + return x.Event + } + return nil +} + +type AddEventResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *AddEventResponse) Reset() { + *x = AddEventResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddEventResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddEventResponse) ProtoMessage() {} + +func (x *AddEventResponse) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddEventResponse.ProtoReflect.Descriptor instead. +func (*AddEventResponse) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{33} +} + +type SyncStreamsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SyncPos []*SyncCookie `protobuf:"bytes,1,rep,name=sync_pos,json=syncPos,proto3" json:"sync_pos,omitempty"` +} + +func (x *SyncStreamsRequest) Reset() { + *x = SyncStreamsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SyncStreamsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SyncStreamsRequest) ProtoMessage() {} + +func (x *SyncStreamsRequest) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SyncStreamsRequest.ProtoReflect.Descriptor instead. +func (*SyncStreamsRequest) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{34} +} + +func (x *SyncStreamsRequest) GetSyncPos() []*SyncCookie { + if x != nil { + return x.SyncPos + } + return nil +} + +type SyncStreamsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SyncId string `protobuf:"bytes,1,opt,name=sync_id,json=syncId,proto3" json:"sync_id,omitempty"` + SyncOp SyncOp `protobuf:"varint,2,opt,name=sync_op,json=syncOp,proto3,enum=river.SyncOp" json:"sync_op,omitempty"` + Stream *StreamAndCookie `protobuf:"bytes,3,opt,name=stream,proto3" json:"stream,omitempty"` + PongNonce string `protobuf:"bytes,4,opt,name=pong_nonce,json=pongNonce,proto3" json:"pong_nonce,omitempty"` +} + +func (x *SyncStreamsResponse) Reset() { + *x = SyncStreamsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SyncStreamsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SyncStreamsResponse) ProtoMessage() {} + +func (x *SyncStreamsResponse) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[35] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SyncStreamsResponse.ProtoReflect.Descriptor instead. +func (*SyncStreamsResponse) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{35} +} + +func (x *SyncStreamsResponse) GetSyncId() string { + if x != nil { + return x.SyncId + } + return "" +} + +func (x *SyncStreamsResponse) GetSyncOp() SyncOp { + if x != nil { + return x.SyncOp + } + return SyncOp_SYNC_UNSPECIFIED +} + +func (x *SyncStreamsResponse) GetStream() *StreamAndCookie { + if x != nil { + return x.Stream + } + return nil +} + +func (x *SyncStreamsResponse) GetPongNonce() string { + if x != nil { + return x.PongNonce + } + return "" +} + +type AddStreamToSyncRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SyncId string `protobuf:"bytes,1,opt,name=sync_id,json=syncId,proto3" json:"sync_id,omitempty"` + SyncPos *SyncCookie `protobuf:"bytes,2,opt,name=sync_pos,json=syncPos,proto3" json:"sync_pos,omitempty"` +} + +func (x *AddStreamToSyncRequest) Reset() { + *x = AddStreamToSyncRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddStreamToSyncRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddStreamToSyncRequest) ProtoMessage() {} + +func (x *AddStreamToSyncRequest) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[36] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddStreamToSyncRequest.ProtoReflect.Descriptor instead. +func (*AddStreamToSyncRequest) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{36} +} + +func (x *AddStreamToSyncRequest) GetSyncId() string { + if x != nil { + return x.SyncId + } + return "" +} + +func (x *AddStreamToSyncRequest) GetSyncPos() *SyncCookie { + if x != nil { + return x.SyncPos + } + return nil +} + +type AddStreamToSyncResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *AddStreamToSyncResponse) Reset() { + *x = AddStreamToSyncResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddStreamToSyncResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddStreamToSyncResponse) ProtoMessage() {} + +func (x *AddStreamToSyncResponse) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[37] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddStreamToSyncResponse.ProtoReflect.Descriptor instead. +func (*AddStreamToSyncResponse) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{37} +} + +type RemoveStreamFromSyncRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SyncId string `protobuf:"bytes,1,opt,name=sync_id,json=syncId,proto3" json:"sync_id,omitempty"` + StreamId []byte `protobuf:"bytes,2,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` +} + +func (x *RemoveStreamFromSyncRequest) Reset() { + *x = RemoveStreamFromSyncRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoveStreamFromSyncRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveStreamFromSyncRequest) ProtoMessage() {} + +func (x *RemoveStreamFromSyncRequest) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[38] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveStreamFromSyncRequest.ProtoReflect.Descriptor instead. +func (*RemoveStreamFromSyncRequest) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{38} +} + +func (x *RemoveStreamFromSyncRequest) GetSyncId() string { + if x != nil { + return x.SyncId + } + return "" +} + +func (x *RemoveStreamFromSyncRequest) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +type RemoveStreamFromSyncResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *RemoveStreamFromSyncResponse) Reset() { + *x = RemoveStreamFromSyncResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoveStreamFromSyncResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveStreamFromSyncResponse) ProtoMessage() {} + +func (x *RemoveStreamFromSyncResponse) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[39] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveStreamFromSyncResponse.ProtoReflect.Descriptor instead. +func (*RemoveStreamFromSyncResponse) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{39} +} + +type CancelSyncRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SyncId string `protobuf:"bytes,1,opt,name=sync_id,json=syncId,proto3" json:"sync_id,omitempty"` +} + +func (x *CancelSyncRequest) Reset() { + *x = CancelSyncRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CancelSyncRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CancelSyncRequest) ProtoMessage() {} + +func (x *CancelSyncRequest) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[40] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CancelSyncRequest.ProtoReflect.Descriptor instead. +func (*CancelSyncRequest) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{40} +} + +func (x *CancelSyncRequest) GetSyncId() string { + if x != nil { + return x.SyncId + } + return "" +} + +type CancelSyncResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CancelSyncResponse) Reset() { + *x = CancelSyncResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CancelSyncResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CancelSyncResponse) ProtoMessage() {} + +func (x *CancelSyncResponse) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[41] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CancelSyncResponse.ProtoReflect.Descriptor instead. +func (*CancelSyncResponse) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{41} +} + +type PingSyncRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SyncId string `protobuf:"bytes,1,opt,name=sync_id,json=syncId,proto3" json:"sync_id,omitempty"` + Nonce string `protobuf:"bytes,2,opt,name=nonce,proto3" json:"nonce,omitempty"` +} + +func (x *PingSyncRequest) Reset() { + *x = PingSyncRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PingSyncRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PingSyncRequest) ProtoMessage() {} + +func (x *PingSyncRequest) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[42] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PingSyncRequest.ProtoReflect.Descriptor instead. +func (*PingSyncRequest) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{42} +} + +func (x *PingSyncRequest) GetSyncId() string { + if x != nil { + return x.SyncId + } + return "" +} + +func (x *PingSyncRequest) GetNonce() string { + if x != nil { + return x.Nonce + } + return "" +} + +type PingSyncResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *PingSyncResponse) Reset() { + *x = PingSyncResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PingSyncResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PingSyncResponse) ProtoMessage() {} + +func (x *PingSyncResponse) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PingSyncResponse.ProtoReflect.Descriptor instead. +func (*PingSyncResponse) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{43} +} + +type InfoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Debug []string `protobuf:"bytes,1,rep,name=debug,proto3" json:"debug,omitempty"` +} + +func (x *InfoRequest) Reset() { + *x = InfoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InfoRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InfoRequest) ProtoMessage() {} + +func (x *InfoRequest) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[44] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use InfoRequest.ProtoReflect.Descriptor instead. +func (*InfoRequest) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{44} +} + +func (x *InfoRequest) GetDebug() []string { + if x != nil { + return x.Debug + } + return nil +} + +type InfoResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Graffiti string `protobuf:"bytes,1,opt,name=graffiti,proto3" json:"graffiti,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` +} + +func (x *InfoResponse) Reset() { + *x = InfoResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InfoResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InfoResponse) ProtoMessage() {} + +func (x *InfoResponse) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[45] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use InfoResponse.ProtoReflect.Descriptor instead. +func (*InfoResponse) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{45} +} + +func (x *InfoResponse) GetGraffiti() string { + if x != nil { + return x.Graffiti + } + return "" +} + +func (x *InfoResponse) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime + } + return nil +} + +func (x *InfoResponse) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +type MemberPayload_Snapshot struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Joined []*MemberPayload_Snapshot_Member `protobuf:"bytes,1,rep,name=joined,proto3" json:"joined,omitempty"` +} + +func (x *MemberPayload_Snapshot) Reset() { + *x = MemberPayload_Snapshot{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MemberPayload_Snapshot) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MemberPayload_Snapshot) ProtoMessage() {} + +func (x *MemberPayload_Snapshot) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[46] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MemberPayload_Snapshot.ProtoReflect.Descriptor instead. +func (*MemberPayload_Snapshot) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{4, 0} +} + +func (x *MemberPayload_Snapshot) GetJoined() []*MemberPayload_Snapshot_Member { + if x != nil { + return x.Joined + } + return nil +} + +type MemberPayload_Membership struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Op MembershipOp `protobuf:"varint,1,opt,name=op,proto3,enum=river.MembershipOp" json:"op,omitempty"` + UserAddress []byte `protobuf:"bytes,2,opt,name=user_address,json=userAddress,proto3" json:"user_address,omitempty"` + InitiatorAddress []byte `protobuf:"bytes,3,opt,name=initiator_address,json=initiatorAddress,proto3" json:"initiator_address,omitempty"` + StreamParentId []byte `protobuf:"bytes,4,opt,name=stream_parent_id,json=streamParentId,proto3,oneof" json:"stream_parent_id,omitempty"` +} + +func (x *MemberPayload_Membership) Reset() { + *x = MemberPayload_Membership{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MemberPayload_Membership) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MemberPayload_Membership) ProtoMessage() {} + +func (x *MemberPayload_Membership) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[47] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MemberPayload_Membership.ProtoReflect.Descriptor instead. +func (*MemberPayload_Membership) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{4, 1} +} + +func (x *MemberPayload_Membership) GetOp() MembershipOp { + if x != nil { + return x.Op + } + return MembershipOp_SO_UNSPECIFIED +} + +func (x *MemberPayload_Membership) GetUserAddress() []byte { + if x != nil { + return x.UserAddress + } + return nil +} + +func (x *MemberPayload_Membership) GetInitiatorAddress() []byte { + if x != nil { + return x.InitiatorAddress + } + return nil +} + +func (x *MemberPayload_Membership) GetStreamParentId() []byte { + if x != nil { + return x.StreamParentId + } + return nil +} + +type MemberPayload_KeySolicitation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeviceKey string `protobuf:"bytes,1,opt,name=device_key,json=deviceKey,proto3" json:"device_key,omitempty"` // requesters device_key + FallbackKey string `protobuf:"bytes,2,opt,name=fallback_key,json=fallbackKey,proto3" json:"fallback_key,omitempty"` // requesters fallback_key + IsNewDevice bool `protobuf:"varint,3,opt,name=is_new_device,json=isNewDevice,proto3" json:"is_new_device,omitempty"` // true if this is a new device, session_ids will be empty + SessionIds []string `protobuf:"bytes,4,rep,name=session_ids,json=sessionIds,proto3" json:"session_ids,omitempty"` +} + +func (x *MemberPayload_KeySolicitation) Reset() { + *x = MemberPayload_KeySolicitation{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MemberPayload_KeySolicitation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MemberPayload_KeySolicitation) ProtoMessage() {} + +func (x *MemberPayload_KeySolicitation) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[48] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MemberPayload_KeySolicitation.ProtoReflect.Descriptor instead. +func (*MemberPayload_KeySolicitation) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{4, 2} +} + +func (x *MemberPayload_KeySolicitation) GetDeviceKey() string { + if x != nil { + return x.DeviceKey + } + return "" +} + +func (x *MemberPayload_KeySolicitation) GetFallbackKey() string { + if x != nil { + return x.FallbackKey + } + return "" +} + +func (x *MemberPayload_KeySolicitation) GetIsNewDevice() bool { + if x != nil { + return x.IsNewDevice + } + return false +} + +func (x *MemberPayload_KeySolicitation) GetSessionIds() []string { + if x != nil { + return x.SessionIds + } + return nil +} + +type MemberPayload_KeyFulfillment struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserAddress []byte `protobuf:"bytes,1,opt,name=user_address,json=userAddress,proto3" json:"user_address,omitempty"` + DeviceKey string `protobuf:"bytes,2,opt,name=device_key,json=deviceKey,proto3" json:"device_key,omitempty"` + SessionIds []string `protobuf:"bytes,3,rep,name=session_ids,json=sessionIds,proto3" json:"session_ids,omitempty"` +} + +func (x *MemberPayload_KeyFulfillment) Reset() { + *x = MemberPayload_KeyFulfillment{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MemberPayload_KeyFulfillment) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MemberPayload_KeyFulfillment) ProtoMessage() {} + +func (x *MemberPayload_KeyFulfillment) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[49] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MemberPayload_KeyFulfillment.ProtoReflect.Descriptor instead. +func (*MemberPayload_KeyFulfillment) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{4, 3} +} + +func (x *MemberPayload_KeyFulfillment) GetUserAddress() []byte { + if x != nil { + return x.UserAddress + } + return nil +} + +func (x *MemberPayload_KeyFulfillment) GetDeviceKey() string { + if x != nil { + return x.DeviceKey + } + return "" +} + +func (x *MemberPayload_KeyFulfillment) GetSessionIds() []string { + if x != nil { + return x.SessionIds + } + return nil +} + +type MemberPayload_Nft struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ChainId int32 `protobuf:"varint,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + ContractAddress []byte `protobuf:"bytes,2,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` + TokenId []byte `protobuf:"bytes,3,opt,name=token_id,json=tokenId,proto3" json:"token_id,omitempty"` +} + +func (x *MemberPayload_Nft) Reset() { + *x = MemberPayload_Nft{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MemberPayload_Nft) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MemberPayload_Nft) ProtoMessage() {} + +func (x *MemberPayload_Nft) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[50] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MemberPayload_Nft.ProtoReflect.Descriptor instead. +func (*MemberPayload_Nft) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{4, 4} +} + +func (x *MemberPayload_Nft) GetChainId() int32 { + if x != nil { + return x.ChainId + } + return 0 +} + +func (x *MemberPayload_Nft) GetContractAddress() []byte { + if x != nil { + return x.ContractAddress + } + return nil +} + +func (x *MemberPayload_Nft) GetTokenId() []byte { + if x != nil { + return x.TokenId + } + return nil +} + +type MemberPayload_Snapshot_Member struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserAddress []byte `protobuf:"bytes,1,opt,name=user_address,json=userAddress,proto3" json:"user_address,omitempty"` + MiniblockNum int64 `protobuf:"varint,2,opt,name=miniblock_num,json=miniblockNum,proto3" json:"miniblock_num,omitempty"` + EventNum int64 `protobuf:"varint,3,opt,name=event_num,json=eventNum,proto3" json:"event_num,omitempty"` + Solicitations []*MemberPayload_KeySolicitation `protobuf:"bytes,4,rep,name=solicitations,proto3" json:"solicitations,omitempty"` + Username *WrappedEncryptedData `protobuf:"bytes,5,opt,name=username,proto3" json:"username,omitempty"` + DisplayName *WrappedEncryptedData `protobuf:"bytes,6,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + EnsAddress []byte `protobuf:"bytes,7,opt,name=ens_address,json=ensAddress,proto3" json:"ens_address,omitempty"` + Nft *MemberPayload_Nft `protobuf:"bytes,8,opt,name=nft,proto3" json:"nft,omitempty"` +} + +func (x *MemberPayload_Snapshot_Member) Reset() { + *x = MemberPayload_Snapshot_Member{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MemberPayload_Snapshot_Member) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MemberPayload_Snapshot_Member) ProtoMessage() {} + +func (x *MemberPayload_Snapshot_Member) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[51] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MemberPayload_Snapshot_Member.ProtoReflect.Descriptor instead. +func (*MemberPayload_Snapshot_Member) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{4, 0, 0} +} + +func (x *MemberPayload_Snapshot_Member) GetUserAddress() []byte { + if x != nil { + return x.UserAddress + } + return nil +} + +func (x *MemberPayload_Snapshot_Member) GetMiniblockNum() int64 { + if x != nil { + return x.MiniblockNum + } + return 0 +} + +func (x *MemberPayload_Snapshot_Member) GetEventNum() int64 { + if x != nil { + return x.EventNum + } + return 0 +} + +func (x *MemberPayload_Snapshot_Member) GetSolicitations() []*MemberPayload_KeySolicitation { + if x != nil { + return x.Solicitations + } + return nil +} + +func (x *MemberPayload_Snapshot_Member) GetUsername() *WrappedEncryptedData { + if x != nil { + return x.Username + } + return nil +} + +func (x *MemberPayload_Snapshot_Member) GetDisplayName() *WrappedEncryptedData { + if x != nil { + return x.DisplayName + } + return nil +} + +func (x *MemberPayload_Snapshot_Member) GetEnsAddress() []byte { + if x != nil { + return x.EnsAddress + } + return nil +} + +func (x *MemberPayload_Snapshot_Member) GetNft() *MemberPayload_Nft { + if x != nil { + return x.Nft + } + return nil +} + +type SpacePayload_Snapshot struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // inception + Inception *SpacePayload_Inception `protobuf:"bytes,1,opt,name=inception,proto3" json:"inception,omitempty"` + // channels: sorted by channel_id + Channels []*SpacePayload_Channel `protobuf:"bytes,2,rep,name=channels,proto3" json:"channels,omitempty"` +} + +func (x *SpacePayload_Snapshot) Reset() { + *x = SpacePayload_Snapshot{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SpacePayload_Snapshot) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SpacePayload_Snapshot) ProtoMessage() {} + +func (x *SpacePayload_Snapshot) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[52] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SpacePayload_Snapshot.ProtoReflect.Descriptor instead. +func (*SpacePayload_Snapshot) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{5, 0} +} + +func (x *SpacePayload_Snapshot) GetInception() *SpacePayload_Inception { + if x != nil { + return x.Inception + } + return nil +} + +func (x *SpacePayload_Snapshot) GetChannels() []*SpacePayload_Channel { + if x != nil { + return x.Channels + } + return nil +} + +type SpacePayload_Inception struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + Settings *StreamSettings `protobuf:"bytes,2,opt,name=settings,proto3" json:"settings,omitempty"` +} + +func (x *SpacePayload_Inception) Reset() { + *x = SpacePayload_Inception{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SpacePayload_Inception) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SpacePayload_Inception) ProtoMessage() {} + +func (x *SpacePayload_Inception) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[53] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SpacePayload_Inception.ProtoReflect.Descriptor instead. +func (*SpacePayload_Inception) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{5, 1} +} + +func (x *SpacePayload_Inception) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *SpacePayload_Inception) GetSettings() *StreamSettings { + if x != nil { + return x.Settings + } + return nil +} + +type SpacePayload_Channel struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Op ChannelOp `protobuf:"varint,1,opt,name=op,proto3,enum=river.ChannelOp" json:"op,omitempty"` + ChannelId []byte `protobuf:"bytes,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` + OriginEvent *EventRef `protobuf:"bytes,3,opt,name=origin_event,json=originEvent,proto3" json:"origin_event,omitempty"` + ChannelProperties *EncryptedData `protobuf:"bytes,4,opt,name=channel_properties,json=channelProperties,proto3" json:"channel_properties,omitempty"` +} + +func (x *SpacePayload_Channel) Reset() { + *x = SpacePayload_Channel{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SpacePayload_Channel) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SpacePayload_Channel) ProtoMessage() {} + +func (x *SpacePayload_Channel) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[54] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SpacePayload_Channel.ProtoReflect.Descriptor instead. +func (*SpacePayload_Channel) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{5, 2} +} + +func (x *SpacePayload_Channel) GetOp() ChannelOp { + if x != nil { + return x.Op + } + return ChannelOp_CO_UNSPECIFIED +} + +func (x *SpacePayload_Channel) GetChannelId() []byte { + if x != nil { + return x.ChannelId + } + return nil +} + +func (x *SpacePayload_Channel) GetOriginEvent() *EventRef { + if x != nil { + return x.OriginEvent + } + return nil +} + +func (x *SpacePayload_Channel) GetChannelProperties() *EncryptedData { + if x != nil { + return x.ChannelProperties + } + return nil +} + +type ChannelPayload_Snapshot struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // inception + Inception *ChannelPayload_Inception `protobuf:"bytes,1,opt,name=inception,proto3" json:"inception,omitempty"` +} + +func (x *ChannelPayload_Snapshot) Reset() { + *x = ChannelPayload_Snapshot{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChannelPayload_Snapshot) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChannelPayload_Snapshot) ProtoMessage() {} + +func (x *ChannelPayload_Snapshot) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[55] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChannelPayload_Snapshot.ProtoReflect.Descriptor instead. +func (*ChannelPayload_Snapshot) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{6, 0} +} + +func (x *ChannelPayload_Snapshot) GetInception() *ChannelPayload_Inception { + if x != nil { + return x.Inception + } + return nil +} + +type ChannelPayload_Inception struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + SpaceId []byte `protobuf:"bytes,3,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"` + // * + // channel_properties and is_default be used to + // create associated with that channel in the space stream + ChannelProperties *EncryptedData `protobuf:"bytes,4,opt,name=channel_properties,json=channelProperties,proto3" json:"channel_properties,omitempty"` + Settings *StreamSettings `protobuf:"bytes,5,opt,name=settings,proto3" json:"settings,omitempty"` +} + +func (x *ChannelPayload_Inception) Reset() { + *x = ChannelPayload_Inception{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChannelPayload_Inception) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChannelPayload_Inception) ProtoMessage() {} + +func (x *ChannelPayload_Inception) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[56] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChannelPayload_Inception.ProtoReflect.Descriptor instead. +func (*ChannelPayload_Inception) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{6, 1} +} + +func (x *ChannelPayload_Inception) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *ChannelPayload_Inception) GetSpaceId() []byte { + if x != nil { + return x.SpaceId + } + return nil +} + +func (x *ChannelPayload_Inception) GetChannelProperties() *EncryptedData { + if x != nil { + return x.ChannelProperties + } + return nil +} + +func (x *ChannelPayload_Inception) GetSettings() *StreamSettings { + if x != nil { + return x.Settings + } + return nil +} + +type ChannelPayload_Redaction struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EventId []byte `protobuf:"bytes,1,opt,name=event_id,json=eventId,proto3" json:"event_id,omitempty"` +} + +func (x *ChannelPayload_Redaction) Reset() { + *x = ChannelPayload_Redaction{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChannelPayload_Redaction) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChannelPayload_Redaction) ProtoMessage() {} + +func (x *ChannelPayload_Redaction) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[57] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChannelPayload_Redaction.ProtoReflect.Descriptor instead. +func (*ChannelPayload_Redaction) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{6, 2} +} + +func (x *ChannelPayload_Redaction) GetEventId() []byte { + if x != nil { + return x.EventId + } + return nil +} + +type DmChannelPayload_Snapshot struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Inception *DmChannelPayload_Inception `protobuf:"bytes,1,opt,name=inception,proto3" json:"inception,omitempty"` +} + +func (x *DmChannelPayload_Snapshot) Reset() { + *x = DmChannelPayload_Snapshot{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DmChannelPayload_Snapshot) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DmChannelPayload_Snapshot) ProtoMessage() {} + +func (x *DmChannelPayload_Snapshot) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[58] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DmChannelPayload_Snapshot.ProtoReflect.Descriptor instead. +func (*DmChannelPayload_Snapshot) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{7, 0} +} + +func (x *DmChannelPayload_Snapshot) GetInception() *DmChannelPayload_Inception { + if x != nil { + return x.Inception + } + return nil +} + +type DmChannelPayload_Inception struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + FirstPartyAddress []byte `protobuf:"bytes,2,opt,name=first_party_address,json=firstPartyAddress,proto3" json:"first_party_address,omitempty"` + SecondPartyAddress []byte `protobuf:"bytes,3,opt,name=second_party_address,json=secondPartyAddress,proto3" json:"second_party_address,omitempty"` + Settings *StreamSettings `protobuf:"bytes,4,opt,name=settings,proto3" json:"settings,omitempty"` +} + +func (x *DmChannelPayload_Inception) Reset() { + *x = DmChannelPayload_Inception{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DmChannelPayload_Inception) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DmChannelPayload_Inception) ProtoMessage() {} + +func (x *DmChannelPayload_Inception) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[59] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DmChannelPayload_Inception.ProtoReflect.Descriptor instead. +func (*DmChannelPayload_Inception) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{7, 1} +} + +func (x *DmChannelPayload_Inception) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *DmChannelPayload_Inception) GetFirstPartyAddress() []byte { + if x != nil { + return x.FirstPartyAddress + } + return nil +} + +func (x *DmChannelPayload_Inception) GetSecondPartyAddress() []byte { + if x != nil { + return x.SecondPartyAddress + } + return nil +} + +func (x *DmChannelPayload_Inception) GetSettings() *StreamSettings { + if x != nil { + return x.Settings + } + return nil +} + +type GdmChannelPayload_Snapshot struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Inception *GdmChannelPayload_Inception `protobuf:"bytes,1,opt,name=inception,proto3" json:"inception,omitempty"` + ChannelProperties *WrappedEncryptedData `protobuf:"bytes,2,opt,name=channel_properties,json=channelProperties,proto3" json:"channel_properties,omitempty"` +} + +func (x *GdmChannelPayload_Snapshot) Reset() { + *x = GdmChannelPayload_Snapshot{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GdmChannelPayload_Snapshot) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GdmChannelPayload_Snapshot) ProtoMessage() {} + +func (x *GdmChannelPayload_Snapshot) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[60] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GdmChannelPayload_Snapshot.ProtoReflect.Descriptor instead. +func (*GdmChannelPayload_Snapshot) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{8, 0} +} + +func (x *GdmChannelPayload_Snapshot) GetInception() *GdmChannelPayload_Inception { + if x != nil { + return x.Inception + } + return nil +} + +func (x *GdmChannelPayload_Snapshot) GetChannelProperties() *WrappedEncryptedData { + if x != nil { + return x.ChannelProperties + } + return nil +} + +type GdmChannelPayload_Inception struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + ChannelProperties *EncryptedData `protobuf:"bytes,2,opt,name=channel_properties,json=channelProperties,proto3" json:"channel_properties,omitempty"` + Settings *StreamSettings `protobuf:"bytes,3,opt,name=settings,proto3" json:"settings,omitempty"` +} + +func (x *GdmChannelPayload_Inception) Reset() { + *x = GdmChannelPayload_Inception{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GdmChannelPayload_Inception) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GdmChannelPayload_Inception) ProtoMessage() {} + +func (x *GdmChannelPayload_Inception) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[61] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GdmChannelPayload_Inception.ProtoReflect.Descriptor instead. +func (*GdmChannelPayload_Inception) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{8, 1} +} + +func (x *GdmChannelPayload_Inception) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *GdmChannelPayload_Inception) GetChannelProperties() *EncryptedData { + if x != nil { + return x.ChannelProperties + } + return nil +} + +func (x *GdmChannelPayload_Inception) GetSettings() *StreamSettings { + if x != nil { + return x.Settings + } + return nil +} + +type UserPayload_Snapshot struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // inception + Inception *UserPayload_Inception `protobuf:"bytes,1,opt,name=inception,proto3" json:"inception,omitempty"` + // memberships, sorted by stream_id + Memberships []*UserPayload_UserMembership `protobuf:"bytes,2,rep,name=memberships,proto3" json:"memberships,omitempty"` +} + +func (x *UserPayload_Snapshot) Reset() { + *x = UserPayload_Snapshot{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserPayload_Snapshot) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserPayload_Snapshot) ProtoMessage() {} + +func (x *UserPayload_Snapshot) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[62] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserPayload_Snapshot.ProtoReflect.Descriptor instead. +func (*UserPayload_Snapshot) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{9, 0} +} + +func (x *UserPayload_Snapshot) GetInception() *UserPayload_Inception { + if x != nil { + return x.Inception + } + return nil +} + +func (x *UserPayload_Snapshot) GetMemberships() []*UserPayload_UserMembership { + if x != nil { + return x.Memberships + } + return nil +} + +type UserPayload_Inception struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + Settings *StreamSettings `protobuf:"bytes,2,opt,name=settings,proto3" json:"settings,omitempty"` +} + +func (x *UserPayload_Inception) Reset() { + *x = UserPayload_Inception{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserPayload_Inception) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserPayload_Inception) ProtoMessage() {} + +func (x *UserPayload_Inception) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[63] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserPayload_Inception.ProtoReflect.Descriptor instead. +func (*UserPayload_Inception) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{9, 1} +} + +func (x *UserPayload_Inception) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *UserPayload_Inception) GetSettings() *StreamSettings { + if x != nil { + return x.Settings + } + return nil +} + +// update own membership +type UserPayload_UserMembership struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + Op MembershipOp `protobuf:"varint,2,opt,name=op,proto3,enum=river.MembershipOp" json:"op,omitempty"` + Inviter []byte `protobuf:"bytes,3,opt,name=inviter,proto3,oneof" json:"inviter,omitempty"` + StreamParentId []byte `protobuf:"bytes,4,opt,name=stream_parent_id,json=streamParentId,proto3,oneof" json:"stream_parent_id,omitempty"` +} + +func (x *UserPayload_UserMembership) Reset() { + *x = UserPayload_UserMembership{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserPayload_UserMembership) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserPayload_UserMembership) ProtoMessage() {} + +func (x *UserPayload_UserMembership) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[64] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserPayload_UserMembership.ProtoReflect.Descriptor instead. +func (*UserPayload_UserMembership) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{9, 2} +} + +func (x *UserPayload_UserMembership) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *UserPayload_UserMembership) GetOp() MembershipOp { + if x != nil { + return x.Op + } + return MembershipOp_SO_UNSPECIFIED +} + +func (x *UserPayload_UserMembership) GetInviter() []byte { + if x != nil { + return x.Inviter + } + return nil +} + +func (x *UserPayload_UserMembership) GetStreamParentId() []byte { + if x != nil { + return x.StreamParentId + } + return nil +} + +// update someone else's membership +type UserPayload_UserMembershipAction struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + UserId []byte `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + Op MembershipOp `protobuf:"varint,3,opt,name=op,proto3,enum=river.MembershipOp" json:"op,omitempty"` + StreamParentId []byte `protobuf:"bytes,4,opt,name=stream_parent_id,json=streamParentId,proto3,oneof" json:"stream_parent_id,omitempty"` +} + +func (x *UserPayload_UserMembershipAction) Reset() { + *x = UserPayload_UserMembershipAction{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserPayload_UserMembershipAction) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserPayload_UserMembershipAction) ProtoMessage() {} + +func (x *UserPayload_UserMembershipAction) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[65] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserPayload_UserMembershipAction.ProtoReflect.Descriptor instead. +func (*UserPayload_UserMembershipAction) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{9, 3} +} + +func (x *UserPayload_UserMembershipAction) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *UserPayload_UserMembershipAction) GetUserId() []byte { + if x != nil { + return x.UserId + } + return nil +} + +func (x *UserPayload_UserMembershipAction) GetOp() MembershipOp { + if x != nil { + return x.Op + } + return MembershipOp_SO_UNSPECIFIED +} + +func (x *UserPayload_UserMembershipAction) GetStreamParentId() []byte { + if x != nil { + return x.StreamParentId + } + return nil +} + +type UserInboxPayload_Snapshot struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Inception *UserInboxPayload_Inception `protobuf:"bytes,1,opt,name=inception,proto3" json:"inception,omitempty"` + // deviceKey: miniblockNum that the ack was snapshotted + DeviceSummary map[string]*UserInboxPayload_Snapshot_DeviceSummary `protobuf:"bytes,2,rep,name=device_summary,json=deviceSummary,proto3" json:"device_summary,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *UserInboxPayload_Snapshot) Reset() { + *x = UserInboxPayload_Snapshot{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserInboxPayload_Snapshot) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserInboxPayload_Snapshot) ProtoMessage() {} + +func (x *UserInboxPayload_Snapshot) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[66] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserInboxPayload_Snapshot.ProtoReflect.Descriptor instead. +func (*UserInboxPayload_Snapshot) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{10, 0} +} + +func (x *UserInboxPayload_Snapshot) GetInception() *UserInboxPayload_Inception { + if x != nil { + return x.Inception + } + return nil +} + +func (x *UserInboxPayload_Snapshot) GetDeviceSummary() map[string]*UserInboxPayload_Snapshot_DeviceSummary { + if x != nil { + return x.DeviceSummary + } + return nil +} + +type UserInboxPayload_Inception struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + Settings *StreamSettings `protobuf:"bytes,2,opt,name=settings,proto3" json:"settings,omitempty"` +} + +func (x *UserInboxPayload_Inception) Reset() { + *x = UserInboxPayload_Inception{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[67] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserInboxPayload_Inception) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserInboxPayload_Inception) ProtoMessage() {} + +func (x *UserInboxPayload_Inception) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[67] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserInboxPayload_Inception.ProtoReflect.Descriptor instead. +func (*UserInboxPayload_Inception) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{10, 1} +} + +func (x *UserInboxPayload_Inception) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *UserInboxPayload_Inception) GetSettings() *StreamSettings { + if x != nil { + return x.Settings + } + return nil +} + +type UserInboxPayload_GroupEncryptionSessions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + SenderKey string `protobuf:"bytes,2,opt,name=sender_key,json=senderKey,proto3" json:"sender_key,omitempty"` + SessionIds []string `protobuf:"bytes,3,rep,name=session_ids,json=sessionIds,proto3" json:"session_ids,omitempty"` + // deviceKey: per device ciphertext of encrypted session keys that match session_ids + Ciphertexts map[string]string `protobuf:"bytes,4,rep,name=ciphertexts,proto3" json:"ciphertexts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *UserInboxPayload_GroupEncryptionSessions) Reset() { + *x = UserInboxPayload_GroupEncryptionSessions{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[68] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserInboxPayload_GroupEncryptionSessions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserInboxPayload_GroupEncryptionSessions) ProtoMessage() {} + +func (x *UserInboxPayload_GroupEncryptionSessions) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[68] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserInboxPayload_GroupEncryptionSessions.ProtoReflect.Descriptor instead. +func (*UserInboxPayload_GroupEncryptionSessions) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{10, 2} +} + +func (x *UserInboxPayload_GroupEncryptionSessions) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *UserInboxPayload_GroupEncryptionSessions) GetSenderKey() string { + if x != nil { + return x.SenderKey + } + return "" +} + +func (x *UserInboxPayload_GroupEncryptionSessions) GetSessionIds() []string { + if x != nil { + return x.SessionIds + } + return nil +} + +func (x *UserInboxPayload_GroupEncryptionSessions) GetCiphertexts() map[string]string { + if x != nil { + return x.Ciphertexts + } + return nil +} + +type UserInboxPayload_Ack struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeviceKey string `protobuf:"bytes,1,opt,name=device_key,json=deviceKey,proto3" json:"device_key,omitempty"` + MiniblockNum int64 `protobuf:"varint,2,opt,name=miniblock_num,json=miniblockNum,proto3" json:"miniblock_num,omitempty"` +} + +func (x *UserInboxPayload_Ack) Reset() { + *x = UserInboxPayload_Ack{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[69] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserInboxPayload_Ack) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserInboxPayload_Ack) ProtoMessage() {} + +func (x *UserInboxPayload_Ack) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[69] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserInboxPayload_Ack.ProtoReflect.Descriptor instead. +func (*UserInboxPayload_Ack) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{10, 3} +} + +func (x *UserInboxPayload_Ack) GetDeviceKey() string { + if x != nil { + return x.DeviceKey + } + return "" +} + +func (x *UserInboxPayload_Ack) GetMiniblockNum() int64 { + if x != nil { + return x.MiniblockNum + } + return 0 +} + +type UserInboxPayload_Snapshot_DeviceSummary struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // * + // UpperBound = latest to device event sent from other client per deviceKey + // LowerBound = latest ack sent by stream owner per deviceKey + // on ack, if UpperBound <= LowerBound then delete this deviceKey entry from the record + // on ack or new session, if any device’s lower bound < N generations ago, delete the deviceKey entry from the record + LowerBound int64 `protobuf:"varint,1,opt,name=lower_bound,json=lowerBound,proto3" json:"lower_bound,omitempty"` + UpperBound int64 `protobuf:"varint,2,opt,name=upper_bound,json=upperBound,proto3" json:"upper_bound,omitempty"` +} + +func (x *UserInboxPayload_Snapshot_DeviceSummary) Reset() { + *x = UserInboxPayload_Snapshot_DeviceSummary{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[70] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserInboxPayload_Snapshot_DeviceSummary) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserInboxPayload_Snapshot_DeviceSummary) ProtoMessage() {} + +func (x *UserInboxPayload_Snapshot_DeviceSummary) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[70] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserInboxPayload_Snapshot_DeviceSummary.ProtoReflect.Descriptor instead. +func (*UserInboxPayload_Snapshot_DeviceSummary) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{10, 0, 0} +} + +func (x *UserInboxPayload_Snapshot_DeviceSummary) GetLowerBound() int64 { + if x != nil { + return x.LowerBound + } + return 0 +} + +func (x *UserInboxPayload_Snapshot_DeviceSummary) GetUpperBound() int64 { + if x != nil { + return x.UpperBound + } + return 0 +} + +type UserSettingsPayload_Snapshot struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // inception + Inception *UserSettingsPayload_Inception `protobuf:"bytes,1,opt,name=inception,proto3" json:"inception,omitempty"` + // fullyReadMarkers: sorted by stream_id + FullyReadMarkers []*UserSettingsPayload_FullyReadMarkers `protobuf:"bytes,2,rep,name=fully_read_markers,json=fullyReadMarkers,proto3" json:"fully_read_markers,omitempty"` + UserBlocksList []*UserSettingsPayload_Snapshot_UserBlocks `protobuf:"bytes,3,rep,name=user_blocks_list,json=userBlocksList,proto3" json:"user_blocks_list,omitempty"` +} + +func (x *UserSettingsPayload_Snapshot) Reset() { + *x = UserSettingsPayload_Snapshot{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[73] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserSettingsPayload_Snapshot) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserSettingsPayload_Snapshot) ProtoMessage() {} + +func (x *UserSettingsPayload_Snapshot) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[73] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserSettingsPayload_Snapshot.ProtoReflect.Descriptor instead. +func (*UserSettingsPayload_Snapshot) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{11, 0} +} + +func (x *UserSettingsPayload_Snapshot) GetInception() *UserSettingsPayload_Inception { + if x != nil { + return x.Inception + } + return nil +} + +func (x *UserSettingsPayload_Snapshot) GetFullyReadMarkers() []*UserSettingsPayload_FullyReadMarkers { + if x != nil { + return x.FullyReadMarkers + } + return nil +} + +func (x *UserSettingsPayload_Snapshot) GetUserBlocksList() []*UserSettingsPayload_Snapshot_UserBlocks { + if x != nil { + return x.UserBlocksList + } + return nil +} + +type UserSettingsPayload_Inception struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + Settings *StreamSettings `protobuf:"bytes,2,opt,name=settings,proto3" json:"settings,omitempty"` +} + +func (x *UserSettingsPayload_Inception) Reset() { + *x = UserSettingsPayload_Inception{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[74] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserSettingsPayload_Inception) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserSettingsPayload_Inception) ProtoMessage() {} + +func (x *UserSettingsPayload_Inception) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[74] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserSettingsPayload_Inception.ProtoReflect.Descriptor instead. +func (*UserSettingsPayload_Inception) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{11, 1} +} + +func (x *UserSettingsPayload_Inception) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *UserSettingsPayload_Inception) GetSettings() *StreamSettings { + if x != nil { + return x.Settings + } + return nil +} + +type UserSettingsPayload_FullyReadMarkers struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + Content *EncryptedData `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` +} + +func (x *UserSettingsPayload_FullyReadMarkers) Reset() { + *x = UserSettingsPayload_FullyReadMarkers{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[75] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserSettingsPayload_FullyReadMarkers) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserSettingsPayload_FullyReadMarkers) ProtoMessage() {} + +func (x *UserSettingsPayload_FullyReadMarkers) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[75] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserSettingsPayload_FullyReadMarkers.ProtoReflect.Descriptor instead. +func (*UserSettingsPayload_FullyReadMarkers) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{11, 2} +} + +func (x *UserSettingsPayload_FullyReadMarkers) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *UserSettingsPayload_FullyReadMarkers) GetContent() *EncryptedData { + if x != nil { + return x.Content + } + return nil +} + +type UserSettingsPayload_UserBlock struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId []byte `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + IsBlocked bool `protobuf:"varint,2,opt,name=is_blocked,json=isBlocked,proto3" json:"is_blocked,omitempty"` + EventNum int64 `protobuf:"varint,3,opt,name=event_num,json=eventNum,proto3" json:"event_num,omitempty"` +} + +func (x *UserSettingsPayload_UserBlock) Reset() { + *x = UserSettingsPayload_UserBlock{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[76] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserSettingsPayload_UserBlock) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserSettingsPayload_UserBlock) ProtoMessage() {} + +func (x *UserSettingsPayload_UserBlock) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[76] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserSettingsPayload_UserBlock.ProtoReflect.Descriptor instead. +func (*UserSettingsPayload_UserBlock) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{11, 3} +} + +func (x *UserSettingsPayload_UserBlock) GetUserId() []byte { + if x != nil { + return x.UserId + } + return nil +} + +func (x *UserSettingsPayload_UserBlock) GetIsBlocked() bool { + if x != nil { + return x.IsBlocked + } + return false +} + +func (x *UserSettingsPayload_UserBlock) GetEventNum() int64 { + if x != nil { + return x.EventNum + } + return 0 +} + +// for a specific blocked user, there might be multiple block or unblock events +type UserSettingsPayload_Snapshot_UserBlocks struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId []byte `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + Blocks []*UserSettingsPayload_Snapshot_UserBlocks_Block `protobuf:"bytes,2,rep,name=blocks,proto3" json:"blocks,omitempty"` +} + +func (x *UserSettingsPayload_Snapshot_UserBlocks) Reset() { + *x = UserSettingsPayload_Snapshot_UserBlocks{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[77] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserSettingsPayload_Snapshot_UserBlocks) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserSettingsPayload_Snapshot_UserBlocks) ProtoMessage() {} + +func (x *UserSettingsPayload_Snapshot_UserBlocks) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[77] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserSettingsPayload_Snapshot_UserBlocks.ProtoReflect.Descriptor instead. +func (*UserSettingsPayload_Snapshot_UserBlocks) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{11, 0, 0} +} + +func (x *UserSettingsPayload_Snapshot_UserBlocks) GetUserId() []byte { + if x != nil { + return x.UserId + } + return nil +} + +func (x *UserSettingsPayload_Snapshot_UserBlocks) GetBlocks() []*UserSettingsPayload_Snapshot_UserBlocks_Block { + if x != nil { + return x.Blocks + } + return nil +} + +type UserSettingsPayload_Snapshot_UserBlocks_Block struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + IsBlocked bool `protobuf:"varint,1,opt,name=is_blocked,json=isBlocked,proto3" json:"is_blocked,omitempty"` + EventNum int64 `protobuf:"varint,2,opt,name=event_num,json=eventNum,proto3" json:"event_num,omitempty"` +} + +func (x *UserSettingsPayload_Snapshot_UserBlocks_Block) Reset() { + *x = UserSettingsPayload_Snapshot_UserBlocks_Block{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[78] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserSettingsPayload_Snapshot_UserBlocks_Block) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserSettingsPayload_Snapshot_UserBlocks_Block) ProtoMessage() {} + +func (x *UserSettingsPayload_Snapshot_UserBlocks_Block) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[78] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserSettingsPayload_Snapshot_UserBlocks_Block.ProtoReflect.Descriptor instead. +func (*UserSettingsPayload_Snapshot_UserBlocks_Block) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{11, 0, 0, 0} +} + +func (x *UserSettingsPayload_Snapshot_UserBlocks_Block) GetIsBlocked() bool { + if x != nil { + return x.IsBlocked + } + return false +} + +func (x *UserSettingsPayload_Snapshot_UserBlocks_Block) GetEventNum() int64 { + if x != nil { + return x.EventNum + } + return 0 +} + +type UserDeviceKeyPayload_Snapshot struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // inception + Inception *UserDeviceKeyPayload_Inception `protobuf:"bytes,1,opt,name=inception,proto3" json:"inception,omitempty"` + // device keys for this user, unique by device_key, capped at N, most recent last + EncryptionDevices []*UserDeviceKeyPayload_EncryptionDevice `protobuf:"bytes,2,rep,name=encryption_devices,json=encryptionDevices,proto3" json:"encryption_devices,omitempty"` +} + +func (x *UserDeviceKeyPayload_Snapshot) Reset() { + *x = UserDeviceKeyPayload_Snapshot{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[79] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserDeviceKeyPayload_Snapshot) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserDeviceKeyPayload_Snapshot) ProtoMessage() {} + +func (x *UserDeviceKeyPayload_Snapshot) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[79] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserDeviceKeyPayload_Snapshot.ProtoReflect.Descriptor instead. +func (*UserDeviceKeyPayload_Snapshot) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{12, 0} +} + +func (x *UserDeviceKeyPayload_Snapshot) GetInception() *UserDeviceKeyPayload_Inception { + if x != nil { + return x.Inception + } + return nil +} + +func (x *UserDeviceKeyPayload_Snapshot) GetEncryptionDevices() []*UserDeviceKeyPayload_EncryptionDevice { + if x != nil { + return x.EncryptionDevices + } + return nil +} + +type UserDeviceKeyPayload_Inception struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + Settings *StreamSettings `protobuf:"bytes,2,opt,name=settings,proto3" json:"settings,omitempty"` +} + +func (x *UserDeviceKeyPayload_Inception) Reset() { + *x = UserDeviceKeyPayload_Inception{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[80] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserDeviceKeyPayload_Inception) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserDeviceKeyPayload_Inception) ProtoMessage() {} + +func (x *UserDeviceKeyPayload_Inception) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[80] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserDeviceKeyPayload_Inception.ProtoReflect.Descriptor instead. +func (*UserDeviceKeyPayload_Inception) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{12, 1} +} + +func (x *UserDeviceKeyPayload_Inception) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *UserDeviceKeyPayload_Inception) GetSettings() *StreamSettings { + if x != nil { + return x.Settings + } + return nil +} + +type UserDeviceKeyPayload_EncryptionDevice struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeviceKey string `protobuf:"bytes,1,opt,name=device_key,json=deviceKey,proto3" json:"device_key,omitempty"` + FallbackKey string `protobuf:"bytes,2,opt,name=fallback_key,json=fallbackKey,proto3" json:"fallback_key,omitempty"` +} + +func (x *UserDeviceKeyPayload_EncryptionDevice) Reset() { + *x = UserDeviceKeyPayload_EncryptionDevice{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[81] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserDeviceKeyPayload_EncryptionDevice) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserDeviceKeyPayload_EncryptionDevice) ProtoMessage() {} + +func (x *UserDeviceKeyPayload_EncryptionDevice) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[81] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserDeviceKeyPayload_EncryptionDevice.ProtoReflect.Descriptor instead. +func (*UserDeviceKeyPayload_EncryptionDevice) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{12, 2} +} + +func (x *UserDeviceKeyPayload_EncryptionDevice) GetDeviceKey() string { + if x != nil { + return x.DeviceKey + } + return "" +} + +func (x *UserDeviceKeyPayload_EncryptionDevice) GetFallbackKey() string { + if x != nil { + return x.FallbackKey + } + return "" +} + +type MediaPayload_Snapshot struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Inception *MediaPayload_Inception `protobuf:"bytes,1,opt,name=inception,proto3" json:"inception,omitempty"` +} + +func (x *MediaPayload_Snapshot) Reset() { + *x = MediaPayload_Snapshot{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[82] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MediaPayload_Snapshot) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MediaPayload_Snapshot) ProtoMessage() {} + +func (x *MediaPayload_Snapshot) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[82] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MediaPayload_Snapshot.ProtoReflect.Descriptor instead. +func (*MediaPayload_Snapshot) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{13, 0} +} + +func (x *MediaPayload_Snapshot) GetInception() *MediaPayload_Inception { + if x != nil { + return x.Inception + } + return nil +} + +type MediaPayload_Inception struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StreamId []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` + ChannelId []byte `protobuf:"bytes,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` + ChunkCount int32 `protobuf:"varint,3,opt,name=chunk_count,json=chunkCount,proto3" json:"chunk_count,omitempty"` + Settings *StreamSettings `protobuf:"bytes,4,opt,name=settings,proto3" json:"settings,omitempty"` + SpaceId []byte `protobuf:"bytes,5,opt,name=space_id,json=spaceId,proto3,oneof" json:"space_id,omitempty"` +} + +func (x *MediaPayload_Inception) Reset() { + *x = MediaPayload_Inception{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[83] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MediaPayload_Inception) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MediaPayload_Inception) ProtoMessage() {} + +func (x *MediaPayload_Inception) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[83] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MediaPayload_Inception.ProtoReflect.Descriptor instead. +func (*MediaPayload_Inception) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{13, 1} +} + +func (x *MediaPayload_Inception) GetStreamId() []byte { + if x != nil { + return x.StreamId + } + return nil +} + +func (x *MediaPayload_Inception) GetChannelId() []byte { + if x != nil { + return x.ChannelId + } + return nil +} + +func (x *MediaPayload_Inception) GetChunkCount() int32 { + if x != nil { + return x.ChunkCount + } + return 0 +} + +func (x *MediaPayload_Inception) GetSettings() *StreamSettings { + if x != nil { + return x.Settings + } + return nil +} + +func (x *MediaPayload_Inception) GetSpaceId() []byte { + if x != nil { + return x.SpaceId + } + return nil +} + +type MediaPayload_Chunk struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + ChunkIndex int32 `protobuf:"varint,2,opt,name=chunk_index,json=chunkIndex,proto3" json:"chunk_index,omitempty"` +} + +func (x *MediaPayload_Chunk) Reset() { + *x = MediaPayload_Chunk{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_proto_msgTypes[84] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MediaPayload_Chunk) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MediaPayload_Chunk) ProtoMessage() {} + +func (x *MediaPayload_Chunk) ProtoReflect() protoreflect.Message { + mi := &file_protocol_proto_msgTypes[84] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MediaPayload_Chunk.ProtoReflect.Descriptor instead. +func (*MediaPayload_Chunk) Descriptor() ([]byte, []int) { + return file_protocol_proto_rawDescGZIP(), []int{13, 2} +} + +func (x *MediaPayload_Chunk) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *MediaPayload_Chunk) GetChunkIndex() int32 { + if x != nil { + return x.ChunkIndex + } + return 0 +} + +var File_protocol_proto protoreflect.FileDescriptor + +var file_protocol_proto_rawDesc = []byte{ + 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x05, 0x72, 0x69, 0x76, 0x65, 0x72, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5d, 0x0a, 0x09, 0x4d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x12, 0x27, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x76, 0x65, 0x6c, + 0x6f, 0x70, 0x65, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x06, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x52, 0x06, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x22, 0x52, 0x0a, 0x08, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x68, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xaa, 0x08, 0x0a, 0x0b, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x69, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, + 0x65, 0x53, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x61, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x73, 0x61, 0x6c, 0x74, 0x12, 0x33, 0x0a, 0x13, 0x70, 0x72, 0x65, 0x76, + 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x01, 0x52, 0x11, 0x70, 0x72, 0x65, 0x76, 0x4d, 0x69, 0x6e, + 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, + 0x13, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x5f, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x4d, 0x73, 0x12, 0x37, 0x0a, 0x18, + 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, + 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x4d, 0x73, 0x12, 0x43, 0x0a, 0x10, 0x6d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x69, 0x6e, 0x69, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x0e, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x65, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x3a, 0x0a, 0x0d, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x40, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x37, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x48, 0x00, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 0x50, 0x0a, 0x15, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x69, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x00, 0x52, 0x13, 0x75, + 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x12, 0x54, 0x0a, 0x17, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x6a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x48, 0x00, 0x52, 0x14, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, + 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x47, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x6e, 0x62, 0x6f, 0x78, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x6b, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x49, 0x6e, 0x62, 0x6f, 0x78, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x00, 0x52, + 0x10, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x62, 0x6f, 0x78, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x12, 0x3a, 0x0a, 0x0d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x2e, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x00, 0x52, + 0x0c, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x47, 0x0a, + 0x12, 0x64, 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x70, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x2e, 0x44, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x48, 0x00, 0x52, 0x10, 0x64, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x4a, 0x0a, 0x13, 0x67, 0x64, 0x6d, 0x5f, 0x63, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x6e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x64, 0x6d, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x00, 0x52, + 0x11, 0x67, 0x64, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x16, 0x0a, + 0x14, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x22, 0xa4, 0x03, 0x0a, 0x0f, 0x4d, 0x69, 0x6e, 0x69, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, + 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x12, 0x2e, + 0x0a, 0x13, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x70, 0x72, 0x65, + 0x76, 0x4d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x38, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0b, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x08, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x01, + 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, + 0x10, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x75, + 0x6d, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x3d, 0x0a, 0x1b, 0x70, 0x72, 0x65, 0x76, 0x5f, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x70, 0x72, + 0x65, 0x76, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x12, 0x2c, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x18, 0x64, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x48, 0x00, 0x52, 0x04, + 0x6e, 0x6f, 0x6e, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, + 0x0b, 0x0a, 0x09, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0xcd, 0x0b, 0x0a, + 0x0d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x41, + 0x0a, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x68, 0x69, 0x70, 0x48, 0x00, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, + 0x70, 0x12, 0x51, 0x0a, 0x10, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x2e, 0x4b, 0x65, 0x79, 0x53, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x48, 0x00, 0x52, 0x0f, 0x6b, 0x65, 0x79, 0x53, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x0f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x75, 0x6c, 0x66, + 0x69, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x2e, 0x4b, 0x65, 0x79, 0x46, 0x75, 0x6c, 0x66, 0x69, 0x6c, 0x6c, 0x6d, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x6b, 0x65, 0x79, 0x46, 0x75, 0x6c, 0x66, 0x69, 0x6c, 0x6c, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x45, + 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x65, 0x6e, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0a, 0x65, 0x6e, 0x73, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2c, 0x0a, 0x03, 0x6e, 0x66, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x4e, 0x66, 0x74, 0x48, 0x00, 0x52, + 0x03, 0x6e, 0x66, 0x74, 0x1a, 0xca, 0x03, 0x0a, 0x08, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x12, 0x3c, 0x0a, 0x06, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x06, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x1a, + 0xff, 0x02, 0x0a, 0x06, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, + 0x0d, 0x6d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, + 0x75, 0x6d, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x75, 0x6d, 0x12, + 0x4a, 0x0a, 0x0d, 0x73, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x4b, 0x65, 0x79, + 0x53, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x45, 0x6e, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x2e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, + 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x65, 0x6e, 0x73, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, 0x03, 0x6e, 0x66, 0x74, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x4e, 0x66, 0x74, 0x52, 0x03, 0x6e, 0x66, + 0x74, 0x1a, 0xc5, 0x01, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, + 0x12, 0x23, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x4f, + 0x70, 0x52, 0x02, 0x6f, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x75, 0x73, 0x65, + 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2d, 0x0a, 0x10, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, + 0x00, 0x52, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x1a, 0x98, 0x01, 0x0a, 0x0f, 0x4b, 0x65, + 0x79, 0x53, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, + 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, + 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x4b, 0x65, 0x79, 0x12, + 0x22, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x4e, 0x65, 0x77, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x73, 0x1a, 0x73, 0x0a, 0x0e, 0x4b, 0x65, 0x79, 0x46, 0x75, 0x6c, 0x66, 0x69, + 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x75, 0x73, + 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x1a, 0x66, 0x0a, 0x03, 0x4e, 0x66, 0x74, + 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, + 0x64, 0x42, 0x09, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xbd, 0x04, 0x0a, + 0x0c, 0x53, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x3d, 0x0a, + 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x48, + 0x00, 0x52, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x07, + 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x07, 0x63, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x80, 0x01, 0x0a, 0x08, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x12, 0x3b, 0x0a, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x70, + 0x61, 0x63, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x49, 0x6e, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x37, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x08, + 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x1a, 0x5b, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x65, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x49, 0x64, 0x12, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0xc9, 0x01, 0x0a, 0x07, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x12, 0x20, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x70, 0x52, + 0x02, 0x6f, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x49, 0x64, 0x12, 0x32, 0x0a, 0x0c, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x5f, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x52, 0x0b, 0x6f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x12, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x4a, 0x04, 0x08, 0x05, 0x10, + 0x06, 0x42, 0x09, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x86, 0x04, 0x0a, + 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x3f, 0x0a, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x30, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, + 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x09, 0x72, 0x65, 0x64, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x52, 0x65, 0x64, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x64, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x1a, 0x49, 0x0a, 0x08, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, + 0x3d, 0x0a, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xc1, + 0x01, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x12, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, + 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x4a, 0x04, 0x08, 0x06, + 0x10, 0x07, 0x1a, 0x26, 0x0a, 0x09, 0x52, 0x65, 0x64, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x19, 0x0a, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x9f, 0x03, 0x0a, 0x10, 0x44, 0x6d, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x41, 0x0a, 0x09, 0x69, 0x6e, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x44, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x48, 0x00, 0x52, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, + 0x4b, 0x0a, 0x08, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x3f, 0x0a, 0x09, 0x69, + 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x44, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xbd, 0x01, 0x0a, + 0x09, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x66, 0x69, 0x72, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x50, 0x61, 0x72, + 0x74, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x09, 0x0a, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x99, 0x04, 0x0a, 0x11, 0x47, 0x64, 0x6d, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x42, 0x0a, + 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x64, 0x6d, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x49, 0x6e, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x30, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x45, 0x0a, 0x12, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x98, 0x01, 0x0a, 0x08, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x40, 0x0a, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x2e, 0x47, 0x64, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, + 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x12, 0x63, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x57, 0x72, + 0x61, 0x70, 0x70, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0xa0, 0x01, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, + 0x12, 0x43, 0x0a, 0x12, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0xec, 0x06, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x12, 0x3c, 0x0a, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x49, 0x6e, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x4c, 0x0a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x68, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x48, 0x00, 0x52, + 0x0e, 0x75, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, + 0x5f, 0x0a, 0x16, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, + 0x69, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, + 0x69, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x14, 0x75, 0x73, 0x65, 0x72, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x1a, 0x8b, 0x01, 0x0a, 0x08, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x3a, 0x0a, + 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, + 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, + 0x70, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x1a, 0x5b, + 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0xc1, 0x01, 0x0a, 0x0e, + 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x1b, + 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x02, 0x6f, + 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x4f, 0x70, 0x52, 0x02, 0x6f, 0x70, + 0x12, 0x1d, 0x0a, 0x07, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x48, 0x00, 0x52, 0x07, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, + 0x2d, 0x0a, 0x10, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x01, 0x52, 0x0e, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0a, + 0x0a, 0x08, 0x5f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x72, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x1a, + 0xb5, 0x01, 0x0a, 0x14, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, + 0x69, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, + 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x4f, 0x70, 0x52, + 0x02, 0x6f, 0x70, 0x12, 0x2d, 0x0a, 0x10, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, + 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x88, + 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0xb4, 0x08, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x62, 0x6f, 0x78, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x41, 0x0a, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x62, 0x6f, 0x78, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x2e, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, + 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x03, 0x61, 0x63, + 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x62, 0x6f, 0x78, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x2e, 0x41, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x03, 0x61, 0x63, 0x6b, 0x12, 0x6d, 0x0a, 0x19, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x62, 0x6f, 0x78, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x45, 0x6e, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x48, + 0x00, 0x52, 0x17, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0xec, 0x02, 0x0a, 0x08, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x3f, 0x0a, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x62, 0x6f, 0x78, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x2e, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x69, + 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5a, 0x0a, 0x0e, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x33, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x62, + 0x6f, 0x78, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x1a, 0x51, 0x0a, 0x0d, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6c, 0x6f, 0x77, 0x65, + 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x70, + 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x1a, 0x70, 0x0a, 0x12, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x44, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, + 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x62, 0x6f, 0x78, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b, 0x0a, 0x09, 0x49, 0x6e, 0x63, + 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x9a, 0x02, 0x0a, 0x17, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x12, 0x1f, + 0x0a, 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, + 0x62, 0x0a, 0x0b, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x49, 0x6e, 0x62, 0x6f, 0x78, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, + 0x78, 0x74, 0x73, 0x1a, 0x3e, 0x0a, 0x10, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 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, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x03, 0x41, 0x63, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, + 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x42, 0x09, + 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xeb, 0x07, 0x0a, 0x13, 0x55, 0x73, + 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x12, 0x44, 0x0a, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x2e, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x09, 0x69, 0x6e, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5b, 0x0a, 0x12, 0x66, 0x75, 0x6c, 0x6c, 0x79, + 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, + 0x46, 0x75, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, + 0x48, 0x00, 0x52, 0x10, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x72, 0x73, 0x12, 0x45, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, + 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x1a, 0xbe, 0x03, 0x0a, 0x08, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x42, 0x0a, 0x09, 0x69, 0x6e, 0x63, 0x65, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x12, + 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x46, 0x75, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x61, 0x64, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x10, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x61, 0x64, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x73, 0x52, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x1a, 0xb8, 0x01, 0x0a, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, + 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x4c, 0x0a, 0x06, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, + 0x06, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x43, 0x0a, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, + 0x1b, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x75, 0x6d, 0x1a, 0x5b, 0x0a, 0x09, + 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x5f, 0x0a, 0x10, 0x46, 0x75, 0x6c, + 0x6c, 0x79, 0x52, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x0a, + 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x60, 0x0a, 0x09, 0x55, 0x73, + 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, + 0x1b, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x75, 0x6d, 0x42, 0x09, 0x0a, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xa7, 0x04, 0x0a, 0x14, 0x55, 0x73, 0x65, 0x72, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 0x45, 0x0a, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x2e, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x09, 0x69, 0x6e, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5b, 0x0a, 0x11, 0x65, 0x6e, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, + 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x1a, 0xac, 0x01, 0x0a, 0x08, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x12, 0x43, 0x0a, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x2e, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x69, 0x6e, 0x63, + 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5b, 0x0a, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, + 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x11, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x1a, 0x5b, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x31, 0x0a, + 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x1a, 0x54, 0x0a, 0x10, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x61, 0x6c, 0x6c, 0x62, + 0x61, 0x63, 0x6b, 0x4b, 0x65, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0xdd, 0x03, 0x0a, 0x0c, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x50, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x12, 0x3d, 0x0a, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, + 0x64, 0x69, 0x61, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x49, 0x6e, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x31, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x48, 0x00, 0x52, 0x05, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x47, 0x0a, 0x08, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x12, 0x3b, 0x0a, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x64, 0x69, + 0x61, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x09, 0x69, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xc8, 0x01, + 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x63, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1e, 0x0a, 0x08, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, + 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x1a, 0x3c, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x09, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0xc3, 0x06, 0x0a, 0x08, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x37, + 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x07, + 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x49, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x48, 0x00, 0x52, 0x0e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x12, 0x59, 0x0a, 0x15, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x68, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x00, 0x52, 0x13, 0x75, 0x73, 0x65, 0x72, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, + 0x5d, 0x0a, 0x17, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6b, + 0x65, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x69, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x00, 0x52, 0x14, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x43, + 0x0a, 0x0d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x6a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, + 0x64, 0x69, 0x61, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x12, 0x50, 0x0a, 0x12, 0x64, 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x44, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x48, 0x00, 0x52, 0x10, 0x64, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x53, 0x0a, 0x13, 0x67, 0x64, 0x6d, 0x5f, 0x63, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x6c, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x64, 0x6d, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x00, 0x52, 0x11, 0x67, 0x64, 0x6d, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x50, 0x0a, 0x12, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x62, 0x6f, 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x18, 0x6d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x49, 0x6e, 0x62, 0x6f, 0x78, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x00, 0x52, 0x10, 0x75, 0x73, 0x65, 0x72, + 0x49, 0x6e, 0x62, 0x6f, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x59, 0x0a, 0x08, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x66, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x68, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x22, 0x4e, 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x6d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x4d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0xf1, 0x01, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, + 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, + 0x68, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4b, 0x65, + 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x1f, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x88, 0x01, + 0x01, 0x12, 0x25, 0x0a, 0x0c, 0x72, 0x65, 0x66, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x65, 0x66, 0x5f, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x7c, 0x0a, 0x14, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, + 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x28, + 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x4e, 0x75, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x48, 0x61, 0x73, 0x68, 0x22, 0xc4, 0x01, 0x0a, 0x0a, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6f, + 0x6b, 0x69, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x69, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, + 0x67, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x69, 0x70, + 0x6f, 0x6f, 0x6c, 0x47, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x69, 0x70, 0x6f, + 0x6f, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, + 0x69, 0x6e, 0x69, 0x70, 0x6f, 0x6f, 0x6c, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x70, + 0x72, 0x65, 0x76, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, + 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x70, 0x72, 0x65, 0x76, 0x4d, 0x69, + 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x22, 0xc8, 0x01, 0x0a, 0x0f, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x6e, 0x64, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x12, + 0x27, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0f, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, + 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x10, 0x6e, 0x65, 0x78, 0x74, + 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x43, + 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x52, 0x0e, 0x6e, 0x65, 0x78, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x43, + 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x0a, 0x6d, 0x69, 0x6e, + 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x79, 0x6e, 0x63, 0x5f, + 0x72, 0x65, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x79, 0x6e, + 0x63, 0x52, 0x65, 0x73, 0x65, 0x74, 0x22, 0x31, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x45, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x33, 0x0a, 0x08, 0x4d, 0x69, 0x6e, + 0x69, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x27, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6e, + 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x7e, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x09, 0x6d, 0x69, + 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2d, 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x69, 0x70, + 0x6f, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x70, 0x6f, 0x6f, 0x6c, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x69, + 0x6e, 0x69, 0x70, 0x6f, 0x6f, 0x6c, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x5b, + 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6e, + 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1b, + 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x46, 0x0a, 0x14, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x41, 0x6e, 0x64, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x52, 0x06, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x22, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x22, 0x43, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x41, 0x6e, 0x64, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x52, 0x06, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x7b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x69, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x66, 0x72, + 0x6f, 0x6d, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x6f, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x6f, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, + 0x76, 0x65, 0x22, 0x65, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x6d, + 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x22, 0x3a, 0x0a, 0x1b, 0x47, 0x65, 0x74, + 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x57, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, + 0x4d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, + 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x22, 0x55, + 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x25, + 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x52, 0x05, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x12, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x42, 0x0a, 0x12, 0x53, 0x79, 0x6e, + 0x63, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2c, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, + 0x6f, 0x6b, 0x69, 0x65, 0x52, 0x07, 0x73, 0x79, 0x6e, 0x63, 0x50, 0x6f, 0x73, 0x22, 0xa5, 0x01, + 0x0a, 0x13, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x49, 0x64, 0x12, 0x26, + 0x0a, 0x07, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6f, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x0d, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x52, 0x06, + 0x73, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x6e, 0x64, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x52, 0x06, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6f, 0x6e, 0x67, 0x5f, 0x6e, + 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6f, 0x6e, 0x67, + 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0x5f, 0x0a, 0x16, 0x41, 0x64, 0x64, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x54, 0x6f, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, + 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x52, 0x07, 0x73, + 0x79, 0x6e, 0x63, 0x50, 0x6f, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x53, 0x0a, 0x1b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x1e, 0x0a, 0x1c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x0a, 0x11, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, + 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x73, + 0x79, 0x6e, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, + 0x6e, 0x63, 0x49, 0x64, 0x22, 0x14, 0x0a, 0x12, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x79, + 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x0a, 0x0f, 0x50, 0x69, + 0x6e, 0x67, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x79, 0x6e, 0x63, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0x12, 0x0a, 0x10, + 0x50, 0x69, 0x6e, 0x67, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x23, 0x0a, 0x0b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x64, 0x65, 0x62, 0x75, 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x22, 0x7f, 0x0a, 0x0c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, + 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, + 0x69, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2a, 0x5c, 0x0a, 0x06, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, + 0x12, 0x14, 0x0a, 0x10, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x4e, + 0x45, 0x57, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x43, 0x4c, 0x4f, + 0x53, 0x45, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x55, 0x50, 0x44, + 0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x50, 0x4f, + 0x4e, 0x47, 0x10, 0x04, 0x2a, 0x4c, 0x0a, 0x0c, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, + 0x69, 0x70, 0x4f, 0x70, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x4f, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x4f, 0x5f, 0x49, + 0x4e, 0x56, 0x49, 0x54, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x4f, 0x5f, 0x4a, 0x4f, + 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x4f, 0x5f, 0x4c, 0x45, 0x41, 0x56, 0x45, + 0x10, 0x03, 0x2a, 0x4f, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x70, 0x12, + 0x12, 0x0a, 0x0e, 0x43, 0x4f, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, + 0x44, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, + 0x44, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, + 0x44, 0x10, 0x04, 0x2a, 0xdd, 0x0a, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x12, 0x13, 0x0a, 0x0f, 0x45, + 0x52, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, + 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x49, + 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x41, 0x52, 0x47, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x10, + 0x03, 0x12, 0x15, 0x0a, 0x11, 0x44, 0x45, 0x41, 0x44, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x45, 0x58, + 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x54, 0x5f, + 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x41, 0x4c, 0x52, 0x45, 0x41, + 0x44, 0x59, 0x5f, 0x45, 0x58, 0x49, 0x53, 0x54, 0x53, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x50, + 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x4e, 0x49, 0x45, 0x44, + 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x45, + 0x58, 0x48, 0x41, 0x55, 0x53, 0x54, 0x45, 0x44, 0x10, 0x08, 0x12, 0x17, 0x0a, 0x13, 0x46, 0x41, + 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x50, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, + 0x4e, 0x10, 0x09, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, 0x0a, + 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, + 0x10, 0x0b, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x4e, 0x49, 0x4d, 0x50, 0x4c, 0x45, 0x4d, 0x45, 0x4e, + 0x54, 0x45, 0x44, 0x10, 0x0c, 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, + 0x4c, 0x10, 0x0d, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, + 0x4c, 0x45, 0x10, 0x0e, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x4c, 0x4f, 0x53, + 0x53, 0x10, 0x0f, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x4e, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4e, 0x54, + 0x49, 0x43, 0x41, 0x54, 0x45, 0x44, 0x10, 0x10, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x45, 0x42, 0x55, + 0x47, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x11, 0x12, 0x11, 0x0a, 0x0d, 0x42, 0x41, 0x44, + 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x49, 0x44, 0x10, 0x12, 0x12, 0x1e, 0x0a, 0x1a, + 0x42, 0x41, 0x44, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x53, 0x10, 0x13, 0x12, 0x19, 0x0a, 0x15, + 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x53, + 0x57, 0x49, 0x54, 0x43, 0x48, 0x10, 0x14, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x41, 0x44, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x10, 0x15, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x41, 0x44, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, + 0x10, 0x16, 0x12, 0x13, 0x0a, 0x0f, 0x42, 0x41, 0x44, 0x5f, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x46, + 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x17, 0x12, 0x1b, 0x0a, 0x17, 0x42, 0x41, 0x44, 0x5f, 0x50, + 0x52, 0x45, 0x56, 0x5f, 0x4d, 0x49, 0x4e, 0x49, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x48, 0x41, + 0x53, 0x48, 0x10, 0x18, 0x12, 0x16, 0x0a, 0x12, 0x4e, 0x4f, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x19, 0x12, 0x0d, 0x0a, 0x09, + 0x42, 0x41, 0x44, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x1a, 0x12, 0x12, 0x0a, 0x0e, 0x55, + 0x53, 0x45, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x54, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x10, 0x1b, 0x12, + 0x15, 0x0a, 0x11, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x42, 0x41, 0x44, 0x5f, 0x48, 0x41, + 0x53, 0x48, 0x45, 0x53, 0x10, 0x1c, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, + 0x5f, 0x45, 0x4d, 0x50, 0x54, 0x59, 0x10, 0x1d, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x52, 0x45, + 0x41, 0x4d, 0x5f, 0x42, 0x41, 0x44, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x1e, 0x12, 0x14, + 0x0a, 0x10, 0x42, 0x41, 0x44, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x47, 0x41, 0x54, 0x45, 0x5f, 0x53, + 0x49, 0x47, 0x10, 0x1f, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x41, 0x44, 0x5f, 0x50, 0x55, 0x42, 0x4c, + 0x49, 0x43, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x20, 0x12, 0x0f, 0x0a, 0x0b, 0x42, 0x41, 0x44, 0x5f, + 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x21, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x41, 0x44, + 0x5f, 0x48, 0x45, 0x58, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x22, 0x12, 0x12, 0x0a, + 0x0e, 0x42, 0x41, 0x44, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x48, 0x41, 0x53, 0x48, 0x10, + 0x23, 0x12, 0x13, 0x0a, 0x0f, 0x42, 0x41, 0x44, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x43, 0x4f, + 0x4f, 0x4b, 0x49, 0x45, 0x10, 0x24, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x55, 0x50, 0x4c, 0x49, 0x43, + 0x41, 0x54, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x25, 0x12, 0x0d, 0x0a, 0x09, 0x42, + 0x41, 0x44, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x26, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x54, + 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x4e, 0x4f, 0x5f, 0x49, 0x4e, 0x43, 0x45, 0x50, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x27, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x41, 0x44, + 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x28, 0x12, + 0x15, 0x0a, 0x11, 0x42, 0x41, 0x44, 0x5f, 0x4d, 0x49, 0x4e, 0x49, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, + 0x53, 0x4c, 0x4f, 0x54, 0x10, 0x29, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x41, 0x44, 0x5f, 0x43, 0x52, + 0x45, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x10, 0x2a, 0x12, + 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x4c, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x47, 0x41, 0x54, + 0x45, 0x10, 0x2b, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x41, 0x44, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, + 0x57, 0x41, 0x4c, 0x4c, 0x45, 0x54, 0x5f, 0x42, 0x41, 0x44, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, + 0x54, 0x55, 0x52, 0x45, 0x10, 0x2c, 0x12, 0x13, 0x0a, 0x0f, 0x42, 0x41, 0x44, 0x5f, 0x52, 0x4f, + 0x4f, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x49, 0x44, 0x10, 0x2d, 0x12, 0x10, 0x0a, 0x0c, 0x55, + 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x10, 0x2e, 0x12, 0x18, 0x0a, + 0x14, 0x44, 0x42, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, + 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x2f, 0x12, 0x1e, 0x0a, 0x1a, 0x4d, 0x49, 0x4e, 0x49, 0x42, + 0x4c, 0x4f, 0x43, 0x4b, 0x53, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x46, 0x41, + 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x30, 0x12, 0x0f, 0x0a, 0x0b, 0x42, 0x41, 0x44, 0x5f, 0x41, + 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x10, 0x31, 0x12, 0x0f, 0x0a, 0x0b, 0x42, 0x55, 0x46, 0x46, + 0x45, 0x52, 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x32, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x41, 0x44, + 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x10, 0x33, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x41, 0x44, + 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54, 0x10, 0x34, 0x12, 0x12, 0x0a, 0x0e, 0x43, + 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0x35, 0x12, + 0x1d, 0x0a, 0x19, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x4c, 0x49, + 0x4e, 0x4b, 0x45, 0x44, 0x5f, 0x57, 0x41, 0x4c, 0x4c, 0x45, 0x54, 0x53, 0x10, 0x36, 0x12, 0x1d, + 0x0a, 0x19, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x5f, 0x45, + 0x4e, 0x54, 0x49, 0x54, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x53, 0x10, 0x37, 0x12, 0x18, 0x0a, + 0x14, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x43, 0x4f, 0x4e, + 0x54, 0x52, 0x41, 0x43, 0x54, 0x10, 0x38, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x50, 0x41, 0x43, 0x45, + 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x39, 0x12, 0x14, 0x0a, 0x10, 0x43, + 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, + 0x3a, 0x12, 0x15, 0x0a, 0x11, 0x57, 0x52, 0x4f, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, + 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x3b, 0x12, 0x1b, 0x0a, 0x17, 0x4d, 0x49, 0x4e, 0x49, + 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x53, 0x10, 0x3c, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, + 0x4c, 0x41, 0x53, 0x54, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4d, 0x49, 0x53, 0x4d, 0x41, + 0x54, 0x43, 0x48, 0x10, 0x3d, 0x12, 0x1c, 0x0a, 0x18, 0x44, 0x4f, 0x57, 0x4e, 0x53, 0x54, 0x52, + 0x45, 0x41, 0x4d, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x10, 0x3e, 0x32, 0xf6, 0x06, 0x0a, 0x0d, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1a, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1b, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, + 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x17, 0x2e, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, + 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x12, 0x19, 0x2e, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, + 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x4a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x6e, + 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x1b, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, + 0x47, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, + 0x4d, 0x69, 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x69, 0x6e, + 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x2e, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x69, + 0x6e, 0x69, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x41, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x16, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, + 0x41, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x46, 0x0a, 0x0b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, + 0x19, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x50, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x1d, 0x2e, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x53, + 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x53, 0x79, + 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0a, 0x43, 0x61, + 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x18, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, + 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x46, 0x72, 0x6f, + 0x6d, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x22, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x79, + 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x46, 0x72, + 0x6f, 0x6d, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, + 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3b, 0x0a, 0x08, 0x50, 0x69, 0x6e, 0x67, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x16, 0x2e, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x6e, 0x67, + 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x31, 0x5a, 0x2f, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x2d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x72, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x72, + 0x65, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protocol_proto_rawDescOnce sync.Once + file_protocol_proto_rawDescData = file_protocol_proto_rawDesc +) + +func file_protocol_proto_rawDescGZIP() []byte { + file_protocol_proto_rawDescOnce.Do(func() { + file_protocol_proto_rawDescData = protoimpl.X.CompressGZIP(file_protocol_proto_rawDescData) + }) + return file_protocol_proto_rawDescData +} + +var file_protocol_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_protocol_proto_msgTypes = make([]protoimpl.MessageInfo, 85) +var file_protocol_proto_goTypes = []interface{}{ + (SyncOp)(0), // 0: river.SyncOp + (MembershipOp)(0), // 1: river.MembershipOp + (ChannelOp)(0), // 2: river.ChannelOp + (Err)(0), // 3: river.Err + (*Miniblock)(nil), // 4: river.Miniblock + (*Envelope)(nil), // 5: river.Envelope + (*StreamEvent)(nil), // 6: river.StreamEvent + (*MiniblockHeader)(nil), // 7: river.MiniblockHeader + (*MemberPayload)(nil), // 8: river.MemberPayload + (*SpacePayload)(nil), // 9: river.SpacePayload + (*ChannelPayload)(nil), // 10: river.ChannelPayload + (*DmChannelPayload)(nil), // 11: river.DmChannelPayload + (*GdmChannelPayload)(nil), // 12: river.GdmChannelPayload + (*UserPayload)(nil), // 13: river.UserPayload + (*UserInboxPayload)(nil), // 14: river.UserInboxPayload + (*UserSettingsPayload)(nil), // 15: river.UserSettingsPayload + (*UserDeviceKeyPayload)(nil), // 16: river.UserDeviceKeyPayload + (*MediaPayload)(nil), // 17: river.MediaPayload + (*Snapshot)(nil), // 18: river.Snapshot + (*EventRef)(nil), // 19: river.EventRef + (*StreamSettings)(nil), // 20: river.StreamSettings + (*EncryptedData)(nil), // 21: river.EncryptedData + (*WrappedEncryptedData)(nil), // 22: river.WrappedEncryptedData + (*SyncCookie)(nil), // 23: river.SyncCookie + (*StreamAndCookie)(nil), // 24: river.StreamAndCookie + (*GetStreamExRequest)(nil), // 25: river.GetStreamExRequest + (*Minipool)(nil), // 26: river.Minipool + (*GetStreamExResponse)(nil), // 27: river.GetStreamExResponse + (*CreateStreamRequest)(nil), // 28: river.CreateStreamRequest + (*CreateStreamResponse)(nil), // 29: river.CreateStreamResponse + (*GetStreamRequest)(nil), // 30: river.GetStreamRequest + (*GetStreamResponse)(nil), // 31: river.GetStreamResponse + (*GetMiniblocksRequest)(nil), // 32: river.GetMiniblocksRequest + (*GetMiniblocksResponse)(nil), // 33: river.GetMiniblocksResponse + (*GetLastMiniblockHashRequest)(nil), // 34: river.GetLastMiniblockHashRequest + (*GetLastMiniblockHashResponse)(nil), // 35: river.GetLastMiniblockHashResponse + (*AddEventRequest)(nil), // 36: river.AddEventRequest + (*AddEventResponse)(nil), // 37: river.AddEventResponse + (*SyncStreamsRequest)(nil), // 38: river.SyncStreamsRequest + (*SyncStreamsResponse)(nil), // 39: river.SyncStreamsResponse + (*AddStreamToSyncRequest)(nil), // 40: river.AddStreamToSyncRequest + (*AddStreamToSyncResponse)(nil), // 41: river.AddStreamToSyncResponse + (*RemoveStreamFromSyncRequest)(nil), // 42: river.RemoveStreamFromSyncRequest + (*RemoveStreamFromSyncResponse)(nil), // 43: river.RemoveStreamFromSyncResponse + (*CancelSyncRequest)(nil), // 44: river.CancelSyncRequest + (*CancelSyncResponse)(nil), // 45: river.CancelSyncResponse + (*PingSyncRequest)(nil), // 46: river.PingSyncRequest + (*PingSyncResponse)(nil), // 47: river.PingSyncResponse + (*InfoRequest)(nil), // 48: river.InfoRequest + (*InfoResponse)(nil), // 49: river.InfoResponse + (*MemberPayload_Snapshot)(nil), // 50: river.MemberPayload.Snapshot + (*MemberPayload_Membership)(nil), // 51: river.MemberPayload.Membership + (*MemberPayload_KeySolicitation)(nil), // 52: river.MemberPayload.KeySolicitation + (*MemberPayload_KeyFulfillment)(nil), // 53: river.MemberPayload.KeyFulfillment + (*MemberPayload_Nft)(nil), // 54: river.MemberPayload.Nft + (*MemberPayload_Snapshot_Member)(nil), // 55: river.MemberPayload.Snapshot.Member + (*SpacePayload_Snapshot)(nil), // 56: river.SpacePayload.Snapshot + (*SpacePayload_Inception)(nil), // 57: river.SpacePayload.Inception + (*SpacePayload_Channel)(nil), // 58: river.SpacePayload.Channel + (*ChannelPayload_Snapshot)(nil), // 59: river.ChannelPayload.Snapshot + (*ChannelPayload_Inception)(nil), // 60: river.ChannelPayload.Inception + (*ChannelPayload_Redaction)(nil), // 61: river.ChannelPayload.Redaction + (*DmChannelPayload_Snapshot)(nil), // 62: river.DmChannelPayload.Snapshot + (*DmChannelPayload_Inception)(nil), // 63: river.DmChannelPayload.Inception + (*GdmChannelPayload_Snapshot)(nil), // 64: river.GdmChannelPayload.Snapshot + (*GdmChannelPayload_Inception)(nil), // 65: river.GdmChannelPayload.Inception + (*UserPayload_Snapshot)(nil), // 66: river.UserPayload.Snapshot + (*UserPayload_Inception)(nil), // 67: river.UserPayload.Inception + (*UserPayload_UserMembership)(nil), // 68: river.UserPayload.UserMembership + (*UserPayload_UserMembershipAction)(nil), // 69: river.UserPayload.UserMembershipAction + (*UserInboxPayload_Snapshot)(nil), // 70: river.UserInboxPayload.Snapshot + (*UserInboxPayload_Inception)(nil), // 71: river.UserInboxPayload.Inception + (*UserInboxPayload_GroupEncryptionSessions)(nil), // 72: river.UserInboxPayload.GroupEncryptionSessions + (*UserInboxPayload_Ack)(nil), // 73: river.UserInboxPayload.Ack + (*UserInboxPayload_Snapshot_DeviceSummary)(nil), // 74: river.UserInboxPayload.Snapshot.DeviceSummary + nil, // 75: river.UserInboxPayload.Snapshot.DeviceSummaryEntry + nil, // 76: river.UserInboxPayload.GroupEncryptionSessions.CiphertextsEntry + (*UserSettingsPayload_Snapshot)(nil), // 77: river.UserSettingsPayload.Snapshot + (*UserSettingsPayload_Inception)(nil), // 78: river.UserSettingsPayload.Inception + (*UserSettingsPayload_FullyReadMarkers)(nil), // 79: river.UserSettingsPayload.FullyReadMarkers + (*UserSettingsPayload_UserBlock)(nil), // 80: river.UserSettingsPayload.UserBlock + (*UserSettingsPayload_Snapshot_UserBlocks)(nil), // 81: river.UserSettingsPayload.Snapshot.UserBlocks + (*UserSettingsPayload_Snapshot_UserBlocks_Block)(nil), // 82: river.UserSettingsPayload.Snapshot.UserBlocks.Block + (*UserDeviceKeyPayload_Snapshot)(nil), // 83: river.UserDeviceKeyPayload.Snapshot + (*UserDeviceKeyPayload_Inception)(nil), // 84: river.UserDeviceKeyPayload.Inception + (*UserDeviceKeyPayload_EncryptionDevice)(nil), // 85: river.UserDeviceKeyPayload.EncryptionDevice + (*MediaPayload_Snapshot)(nil), // 86: river.MediaPayload.Snapshot + (*MediaPayload_Inception)(nil), // 87: river.MediaPayload.Inception + (*MediaPayload_Chunk)(nil), // 88: river.MediaPayload.Chunk + (*timestamppb.Timestamp)(nil), // 89: google.protobuf.Timestamp + (*emptypb.Empty)(nil), // 90: google.protobuf.Empty +} +var file_protocol_proto_depIdxs = []int32{ + 5, // 0: river.Miniblock.events:type_name -> river.Envelope + 5, // 1: river.Miniblock.header:type_name -> river.Envelope + 7, // 2: river.StreamEvent.miniblock_header:type_name -> river.MiniblockHeader + 8, // 3: river.StreamEvent.member_payload:type_name -> river.MemberPayload + 9, // 4: river.StreamEvent.space_payload:type_name -> river.SpacePayload + 10, // 5: river.StreamEvent.channel_payload:type_name -> river.ChannelPayload + 13, // 6: river.StreamEvent.user_payload:type_name -> river.UserPayload + 15, // 7: river.StreamEvent.user_settings_payload:type_name -> river.UserSettingsPayload + 16, // 8: river.StreamEvent.user_device_key_payload:type_name -> river.UserDeviceKeyPayload + 14, // 9: river.StreamEvent.user_inbox_payload:type_name -> river.UserInboxPayload + 17, // 10: river.StreamEvent.media_payload:type_name -> river.MediaPayload + 11, // 11: river.StreamEvent.dm_channel_payload:type_name -> river.DmChannelPayload + 12, // 12: river.StreamEvent.gdm_channel_payload:type_name -> river.GdmChannelPayload + 89, // 13: river.MiniblockHeader.timestamp:type_name -> google.protobuf.Timestamp + 18, // 14: river.MiniblockHeader.snapshot:type_name -> river.Snapshot + 90, // 15: river.MiniblockHeader.none:type_name -> google.protobuf.Empty + 51, // 16: river.MemberPayload.membership:type_name -> river.MemberPayload.Membership + 52, // 17: river.MemberPayload.key_solicitation:type_name -> river.MemberPayload.KeySolicitation + 53, // 18: river.MemberPayload.key_fulfillment:type_name -> river.MemberPayload.KeyFulfillment + 21, // 19: river.MemberPayload.username:type_name -> river.EncryptedData + 21, // 20: river.MemberPayload.display_name:type_name -> river.EncryptedData + 54, // 21: river.MemberPayload.nft:type_name -> river.MemberPayload.Nft + 57, // 22: river.SpacePayload.inception:type_name -> river.SpacePayload.Inception + 58, // 23: river.SpacePayload.channel:type_name -> river.SpacePayload.Channel + 60, // 24: river.ChannelPayload.inception:type_name -> river.ChannelPayload.Inception + 21, // 25: river.ChannelPayload.message:type_name -> river.EncryptedData + 61, // 26: river.ChannelPayload.redaction:type_name -> river.ChannelPayload.Redaction + 63, // 27: river.DmChannelPayload.inception:type_name -> river.DmChannelPayload.Inception + 21, // 28: river.DmChannelPayload.message:type_name -> river.EncryptedData + 65, // 29: river.GdmChannelPayload.inception:type_name -> river.GdmChannelPayload.Inception + 21, // 30: river.GdmChannelPayload.message:type_name -> river.EncryptedData + 21, // 31: river.GdmChannelPayload.channel_properties:type_name -> river.EncryptedData + 67, // 32: river.UserPayload.inception:type_name -> river.UserPayload.Inception + 68, // 33: river.UserPayload.user_membership:type_name -> river.UserPayload.UserMembership + 69, // 34: river.UserPayload.user_membership_action:type_name -> river.UserPayload.UserMembershipAction + 71, // 35: river.UserInboxPayload.inception:type_name -> river.UserInboxPayload.Inception + 73, // 36: river.UserInboxPayload.ack:type_name -> river.UserInboxPayload.Ack + 72, // 37: river.UserInboxPayload.group_encryption_sessions:type_name -> river.UserInboxPayload.GroupEncryptionSessions + 78, // 38: river.UserSettingsPayload.inception:type_name -> river.UserSettingsPayload.Inception + 79, // 39: river.UserSettingsPayload.fully_read_markers:type_name -> river.UserSettingsPayload.FullyReadMarkers + 80, // 40: river.UserSettingsPayload.user_block:type_name -> river.UserSettingsPayload.UserBlock + 84, // 41: river.UserDeviceKeyPayload.inception:type_name -> river.UserDeviceKeyPayload.Inception + 85, // 42: river.UserDeviceKeyPayload.encryption_device:type_name -> river.UserDeviceKeyPayload.EncryptionDevice + 87, // 43: river.MediaPayload.inception:type_name -> river.MediaPayload.Inception + 88, // 44: river.MediaPayload.chunk:type_name -> river.MediaPayload.Chunk + 50, // 45: river.Snapshot.members:type_name -> river.MemberPayload.Snapshot + 56, // 46: river.Snapshot.space_content:type_name -> river.SpacePayload.Snapshot + 59, // 47: river.Snapshot.channel_content:type_name -> river.ChannelPayload.Snapshot + 66, // 48: river.Snapshot.user_content:type_name -> river.UserPayload.Snapshot + 77, // 49: river.Snapshot.user_settings_content:type_name -> river.UserSettingsPayload.Snapshot + 83, // 50: river.Snapshot.user_device_key_content:type_name -> river.UserDeviceKeyPayload.Snapshot + 86, // 51: river.Snapshot.media_content:type_name -> river.MediaPayload.Snapshot + 62, // 52: river.Snapshot.dm_channel_content:type_name -> river.DmChannelPayload.Snapshot + 64, // 53: river.Snapshot.gdm_channel_content:type_name -> river.GdmChannelPayload.Snapshot + 70, // 54: river.Snapshot.user_inbox_content:type_name -> river.UserInboxPayload.Snapshot + 21, // 55: river.WrappedEncryptedData.data:type_name -> river.EncryptedData + 5, // 56: river.StreamAndCookie.events:type_name -> river.Envelope + 23, // 57: river.StreamAndCookie.next_sync_cookie:type_name -> river.SyncCookie + 4, // 58: river.StreamAndCookie.miniblocks:type_name -> river.Miniblock + 5, // 59: river.Minipool.events:type_name -> river.Envelope + 4, // 60: river.GetStreamExResponse.miniblock:type_name -> river.Miniblock + 26, // 61: river.GetStreamExResponse.minipool:type_name -> river.Minipool + 5, // 62: river.CreateStreamRequest.events:type_name -> river.Envelope + 24, // 63: river.CreateStreamResponse.stream:type_name -> river.StreamAndCookie + 24, // 64: river.GetStreamResponse.stream:type_name -> river.StreamAndCookie + 4, // 65: river.GetMiniblocksResponse.miniblocks:type_name -> river.Miniblock + 5, // 66: river.AddEventRequest.event:type_name -> river.Envelope + 23, // 67: river.SyncStreamsRequest.sync_pos:type_name -> river.SyncCookie + 0, // 68: river.SyncStreamsResponse.sync_op:type_name -> river.SyncOp + 24, // 69: river.SyncStreamsResponse.stream:type_name -> river.StreamAndCookie + 23, // 70: river.AddStreamToSyncRequest.sync_pos:type_name -> river.SyncCookie + 89, // 71: river.InfoResponse.start_time:type_name -> google.protobuf.Timestamp + 55, // 72: river.MemberPayload.Snapshot.joined:type_name -> river.MemberPayload.Snapshot.Member + 1, // 73: river.MemberPayload.Membership.op:type_name -> river.MembershipOp + 52, // 74: river.MemberPayload.Snapshot.Member.solicitations:type_name -> river.MemberPayload.KeySolicitation + 22, // 75: river.MemberPayload.Snapshot.Member.username:type_name -> river.WrappedEncryptedData + 22, // 76: river.MemberPayload.Snapshot.Member.display_name:type_name -> river.WrappedEncryptedData + 54, // 77: river.MemberPayload.Snapshot.Member.nft:type_name -> river.MemberPayload.Nft + 57, // 78: river.SpacePayload.Snapshot.inception:type_name -> river.SpacePayload.Inception + 58, // 79: river.SpacePayload.Snapshot.channels:type_name -> river.SpacePayload.Channel + 20, // 80: river.SpacePayload.Inception.settings:type_name -> river.StreamSettings + 2, // 81: river.SpacePayload.Channel.op:type_name -> river.ChannelOp + 19, // 82: river.SpacePayload.Channel.origin_event:type_name -> river.EventRef + 21, // 83: river.SpacePayload.Channel.channel_properties:type_name -> river.EncryptedData + 60, // 84: river.ChannelPayload.Snapshot.inception:type_name -> river.ChannelPayload.Inception + 21, // 85: river.ChannelPayload.Inception.channel_properties:type_name -> river.EncryptedData + 20, // 86: river.ChannelPayload.Inception.settings:type_name -> river.StreamSettings + 63, // 87: river.DmChannelPayload.Snapshot.inception:type_name -> river.DmChannelPayload.Inception + 20, // 88: river.DmChannelPayload.Inception.settings:type_name -> river.StreamSettings + 65, // 89: river.GdmChannelPayload.Snapshot.inception:type_name -> river.GdmChannelPayload.Inception + 22, // 90: river.GdmChannelPayload.Snapshot.channel_properties:type_name -> river.WrappedEncryptedData + 21, // 91: river.GdmChannelPayload.Inception.channel_properties:type_name -> river.EncryptedData + 20, // 92: river.GdmChannelPayload.Inception.settings:type_name -> river.StreamSettings + 67, // 93: river.UserPayload.Snapshot.inception:type_name -> river.UserPayload.Inception + 68, // 94: river.UserPayload.Snapshot.memberships:type_name -> river.UserPayload.UserMembership + 20, // 95: river.UserPayload.Inception.settings:type_name -> river.StreamSettings + 1, // 96: river.UserPayload.UserMembership.op:type_name -> river.MembershipOp + 1, // 97: river.UserPayload.UserMembershipAction.op:type_name -> river.MembershipOp + 71, // 98: river.UserInboxPayload.Snapshot.inception:type_name -> river.UserInboxPayload.Inception + 75, // 99: river.UserInboxPayload.Snapshot.device_summary:type_name -> river.UserInboxPayload.Snapshot.DeviceSummaryEntry + 20, // 100: river.UserInboxPayload.Inception.settings:type_name -> river.StreamSettings + 76, // 101: river.UserInboxPayload.GroupEncryptionSessions.ciphertexts:type_name -> river.UserInboxPayload.GroupEncryptionSessions.CiphertextsEntry + 74, // 102: river.UserInboxPayload.Snapshot.DeviceSummaryEntry.value:type_name -> river.UserInboxPayload.Snapshot.DeviceSummary + 78, // 103: river.UserSettingsPayload.Snapshot.inception:type_name -> river.UserSettingsPayload.Inception + 79, // 104: river.UserSettingsPayload.Snapshot.fully_read_markers:type_name -> river.UserSettingsPayload.FullyReadMarkers + 81, // 105: river.UserSettingsPayload.Snapshot.user_blocks_list:type_name -> river.UserSettingsPayload.Snapshot.UserBlocks + 20, // 106: river.UserSettingsPayload.Inception.settings:type_name -> river.StreamSettings + 21, // 107: river.UserSettingsPayload.FullyReadMarkers.content:type_name -> river.EncryptedData + 82, // 108: river.UserSettingsPayload.Snapshot.UserBlocks.blocks:type_name -> river.UserSettingsPayload.Snapshot.UserBlocks.Block + 84, // 109: river.UserDeviceKeyPayload.Snapshot.inception:type_name -> river.UserDeviceKeyPayload.Inception + 85, // 110: river.UserDeviceKeyPayload.Snapshot.encryption_devices:type_name -> river.UserDeviceKeyPayload.EncryptionDevice + 20, // 111: river.UserDeviceKeyPayload.Inception.settings:type_name -> river.StreamSettings + 87, // 112: river.MediaPayload.Snapshot.inception:type_name -> river.MediaPayload.Inception + 20, // 113: river.MediaPayload.Inception.settings:type_name -> river.StreamSettings + 28, // 114: river.StreamService.CreateStream:input_type -> river.CreateStreamRequest + 30, // 115: river.StreamService.GetStream:input_type -> river.GetStreamRequest + 25, // 116: river.StreamService.GetStreamEx:input_type -> river.GetStreamExRequest + 32, // 117: river.StreamService.GetMiniblocks:input_type -> river.GetMiniblocksRequest + 34, // 118: river.StreamService.GetLastMiniblockHash:input_type -> river.GetLastMiniblockHashRequest + 36, // 119: river.StreamService.AddEvent:input_type -> river.AddEventRequest + 38, // 120: river.StreamService.SyncStreams:input_type -> river.SyncStreamsRequest + 40, // 121: river.StreamService.AddStreamToSync:input_type -> river.AddStreamToSyncRequest + 44, // 122: river.StreamService.CancelSync:input_type -> river.CancelSyncRequest + 42, // 123: river.StreamService.RemoveStreamFromSync:input_type -> river.RemoveStreamFromSyncRequest + 48, // 124: river.StreamService.Info:input_type -> river.InfoRequest + 46, // 125: river.StreamService.PingSync:input_type -> river.PingSyncRequest + 29, // 126: river.StreamService.CreateStream:output_type -> river.CreateStreamResponse + 31, // 127: river.StreamService.GetStream:output_type -> river.GetStreamResponse + 27, // 128: river.StreamService.GetStreamEx:output_type -> river.GetStreamExResponse + 33, // 129: river.StreamService.GetMiniblocks:output_type -> river.GetMiniblocksResponse + 35, // 130: river.StreamService.GetLastMiniblockHash:output_type -> river.GetLastMiniblockHashResponse + 37, // 131: river.StreamService.AddEvent:output_type -> river.AddEventResponse + 39, // 132: river.StreamService.SyncStreams:output_type -> river.SyncStreamsResponse + 41, // 133: river.StreamService.AddStreamToSync:output_type -> river.AddStreamToSyncResponse + 45, // 134: river.StreamService.CancelSync:output_type -> river.CancelSyncResponse + 43, // 135: river.StreamService.RemoveStreamFromSync:output_type -> river.RemoveStreamFromSyncResponse + 49, // 136: river.StreamService.Info:output_type -> river.InfoResponse + 47, // 137: river.StreamService.PingSync:output_type -> river.PingSyncResponse + 126, // [126:138] is the sub-list for method output_type + 114, // [114:126] is the sub-list for method input_type + 114, // [114:114] is the sub-list for extension type_name + 114, // [114:114] is the sub-list for extension extendee + 0, // [0:114] is the sub-list for field type_name +} + +func init() { file_protocol_proto_init() } +func file_protocol_proto_init() { + if File_protocol_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protocol_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Miniblock); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Envelope); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StreamEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MiniblockHeader); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MemberPayload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SpacePayload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChannelPayload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DmChannelPayload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GdmChannelPayload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserPayload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserInboxPayload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserSettingsPayload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserDeviceKeyPayload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MediaPayload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Snapshot); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventRef); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StreamSettings); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EncryptedData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WrappedEncryptedData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SyncCookie); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StreamAndCookie); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStreamExRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Minipool); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStreamExResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateStreamRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateStreamResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStreamRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStreamResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMiniblocksRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMiniblocksResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLastMiniblockHashRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLastMiniblockHashResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddEventRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddEventResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SyncStreamsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SyncStreamsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddStreamToSyncRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddStreamToSyncResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveStreamFromSyncRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveStreamFromSyncResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CancelSyncRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CancelSyncResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PingSyncRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PingSyncResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InfoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InfoResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MemberPayload_Snapshot); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MemberPayload_Membership); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MemberPayload_KeySolicitation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MemberPayload_KeyFulfillment); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MemberPayload_Nft); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MemberPayload_Snapshot_Member); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SpacePayload_Snapshot); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SpacePayload_Inception); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SpacePayload_Channel); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChannelPayload_Snapshot); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChannelPayload_Inception); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChannelPayload_Redaction); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DmChannelPayload_Snapshot); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DmChannelPayload_Inception); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GdmChannelPayload_Snapshot); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GdmChannelPayload_Inception); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserPayload_Snapshot); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserPayload_Inception); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserPayload_UserMembership); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserPayload_UserMembershipAction); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserInboxPayload_Snapshot); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserInboxPayload_Inception); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserInboxPayload_GroupEncryptionSessions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserInboxPayload_Ack); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserInboxPayload_Snapshot_DeviceSummary); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserSettingsPayload_Snapshot); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserSettingsPayload_Inception); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserSettingsPayload_FullyReadMarkers); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserSettingsPayload_UserBlock); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserSettingsPayload_Snapshot_UserBlocks); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserSettingsPayload_Snapshot_UserBlocks_Block); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserDeviceKeyPayload_Snapshot); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserDeviceKeyPayload_Inception); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserDeviceKeyPayload_EncryptionDevice); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MediaPayload_Snapshot); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MediaPayload_Inception); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MediaPayload_Chunk); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_protocol_proto_msgTypes[2].OneofWrappers = []interface{}{ + (*StreamEvent_MiniblockHeader)(nil), + (*StreamEvent_MemberPayload)(nil), + (*StreamEvent_SpacePayload)(nil), + (*StreamEvent_ChannelPayload)(nil), + (*StreamEvent_UserPayload)(nil), + (*StreamEvent_UserSettingsPayload)(nil), + (*StreamEvent_UserDeviceKeyPayload)(nil), + (*StreamEvent_UserInboxPayload)(nil), + (*StreamEvent_MediaPayload)(nil), + (*StreamEvent_DmChannelPayload)(nil), + (*StreamEvent_GdmChannelPayload)(nil), + } + file_protocol_proto_msgTypes[3].OneofWrappers = []interface{}{ + (*MiniblockHeader_None)(nil), + } + file_protocol_proto_msgTypes[4].OneofWrappers = []interface{}{ + (*MemberPayload_Membership_)(nil), + (*MemberPayload_KeySolicitation_)(nil), + (*MemberPayload_KeyFulfillment_)(nil), + (*MemberPayload_Username)(nil), + (*MemberPayload_DisplayName)(nil), + (*MemberPayload_EnsAddress)(nil), + (*MemberPayload_Nft_)(nil), + } + file_protocol_proto_msgTypes[5].OneofWrappers = []interface{}{ + (*SpacePayload_Inception_)(nil), + (*SpacePayload_Channel_)(nil), + } + file_protocol_proto_msgTypes[6].OneofWrappers = []interface{}{ + (*ChannelPayload_Inception_)(nil), + (*ChannelPayload_Message)(nil), + (*ChannelPayload_Redaction_)(nil), + } + file_protocol_proto_msgTypes[7].OneofWrappers = []interface{}{ + (*DmChannelPayload_Inception_)(nil), + (*DmChannelPayload_Message)(nil), + } + file_protocol_proto_msgTypes[8].OneofWrappers = []interface{}{ + (*GdmChannelPayload_Inception_)(nil), + (*GdmChannelPayload_Message)(nil), + (*GdmChannelPayload_ChannelProperties)(nil), + } + file_protocol_proto_msgTypes[9].OneofWrappers = []interface{}{ + (*UserPayload_Inception_)(nil), + (*UserPayload_UserMembership_)(nil), + (*UserPayload_UserMembershipAction_)(nil), + } + file_protocol_proto_msgTypes[10].OneofWrappers = []interface{}{ + (*UserInboxPayload_Inception_)(nil), + (*UserInboxPayload_Ack_)(nil), + (*UserInboxPayload_GroupEncryptionSessions_)(nil), + } + file_protocol_proto_msgTypes[11].OneofWrappers = []interface{}{ + (*UserSettingsPayload_Inception_)(nil), + (*UserSettingsPayload_FullyReadMarkers_)(nil), + (*UserSettingsPayload_UserBlock_)(nil), + } + file_protocol_proto_msgTypes[12].OneofWrappers = []interface{}{ + (*UserDeviceKeyPayload_Inception_)(nil), + (*UserDeviceKeyPayload_EncryptionDevice_)(nil), + } + file_protocol_proto_msgTypes[13].OneofWrappers = []interface{}{ + (*MediaPayload_Inception_)(nil), + (*MediaPayload_Chunk_)(nil), + } + file_protocol_proto_msgTypes[14].OneofWrappers = []interface{}{ + (*Snapshot_SpaceContent)(nil), + (*Snapshot_ChannelContent)(nil), + (*Snapshot_UserContent)(nil), + (*Snapshot_UserSettingsContent)(nil), + (*Snapshot_UserDeviceKeyContent)(nil), + (*Snapshot_MediaContent)(nil), + (*Snapshot_DmChannelContent)(nil), + (*Snapshot_GdmChannelContent)(nil), + (*Snapshot_UserInboxContent)(nil), + } + file_protocol_proto_msgTypes[17].OneofWrappers = []interface{}{} + file_protocol_proto_msgTypes[23].OneofWrappers = []interface{}{ + (*GetStreamExResponse_Miniblock)(nil), + (*GetStreamExResponse_Minipool)(nil), + } + file_protocol_proto_msgTypes[47].OneofWrappers = []interface{}{} + file_protocol_proto_msgTypes[64].OneofWrappers = []interface{}{} + file_protocol_proto_msgTypes[65].OneofWrappers = []interface{}{} + file_protocol_proto_msgTypes[83].OneofWrappers = []interface{}{} + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protocol_proto_rawDesc, + NumEnums: 4, + NumMessages: 85, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_protocol_proto_goTypes, + DependencyIndexes: file_protocol_proto_depIdxs, + EnumInfos: file_protocol_proto_enumTypes, + MessageInfos: file_protocol_proto_msgTypes, + }.Build() + File_protocol_proto = out.File + file_protocol_proto_rawDesc = nil + file_protocol_proto_goTypes = nil + file_protocol_proto_depIdxs = nil +} diff --git a/core/node/protocol/protocol_test.go b/core/node/protocol/protocol_test.go new file mode 100644 index 000000000..160a830a0 --- /dev/null +++ b/core/node/protocol/protocol_test.go @@ -0,0 +1,61 @@ +package protocol + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestInceptionPayload(t *testing.T) { + assert.Nil(t, (&StreamEvent{}).GetInceptionPayload()) + + assert.Nil(t, (&StreamEvent{ + Payload: &StreamEvent_SpacePayload{}, + }).GetInceptionPayload()) + + assert.Nil(t, (&StreamEvent{ + Payload: &StreamEvent_SpacePayload{ + SpacePayload: &SpacePayload{}, + }, + }).GetInceptionPayload()) + + assert.Nil(t, (&StreamEvent{ + Payload: &StreamEvent_SpacePayload{ + SpacePayload: &SpacePayload{ + Content: &SpacePayload_Inception_{}, + }, + }, + }).GetInceptionPayload()) + + assert.NotNil(t, (&StreamEvent{ + Payload: &StreamEvent_SpacePayload{ + SpacePayload: &SpacePayload{ + Content: &SpacePayload_Inception_{ + Inception: &SpacePayload_Inception{}, + }, + }, + }, + }).GetInceptionPayload()) + + assert.Nil(t, (&StreamEvent{ + Payload: &StreamEvent_SpacePayload{ + SpacePayload: &SpacePayload{ + Content: &SpacePayload_Channel_{}, + }, + }, + }).GetInceptionPayload()) + + spaceMembership := StreamEvent{ + Payload: &StreamEvent_SpacePayload{ + SpacePayload: &SpacePayload{ + Content: &SpacePayload_Channel_{ + Channel: &SpacePayload_Channel{}, + }, + }, + }, + } + // pro tip, if you cast nil to an interface type, it's still nil + assert.Nil(t, spaceMembership.GetInceptionPayload()) + // but it's not equal to nil! this is a test to make sure we don't regress see: https://github.com/HereNotThere/harmony/pull/2808 + assert.True(t, spaceMembership.GetInceptionPayload() == nil) +} diff --git a/core/node/protocol/protocolconnect/internode.connect.go b/core/node/protocol/protocolconnect/internode.connect.go new file mode 100644 index 000000000..0665383ec --- /dev/null +++ b/core/node/protocol/protocolconnect/internode.connect.go @@ -0,0 +1,173 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: internode.proto + +package protocolconnect + +import ( + connect "connectrpc.com/connect" + context "context" + errors "errors" + protocol "github.com/river-build/river/core/node/protocol" + http "net/http" + strings "strings" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // NodeToNodeName is the fully-qualified name of the NodeToNode service. + NodeToNodeName = "river.NodeToNode" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // NodeToNodeAllocateStreamProcedure is the fully-qualified name of the NodeToNode's AllocateStream + // RPC. + NodeToNodeAllocateStreamProcedure = "/river.NodeToNode/AllocateStream" + // NodeToNodeNewEventReceivedProcedure is the fully-qualified name of the NodeToNode's + // NewEventReceived RPC. + NodeToNodeNewEventReceivedProcedure = "/river.NodeToNode/NewEventReceived" + // NodeToNodeNewEventInPoolProcedure is the fully-qualified name of the NodeToNode's NewEventInPool + // RPC. + NodeToNodeNewEventInPoolProcedure = "/river.NodeToNode/NewEventInPool" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + nodeToNodeServiceDescriptor = protocol.File_internode_proto.Services().ByName("NodeToNode") + nodeToNodeAllocateStreamMethodDescriptor = nodeToNodeServiceDescriptor.Methods().ByName("AllocateStream") + nodeToNodeNewEventReceivedMethodDescriptor = nodeToNodeServiceDescriptor.Methods().ByName("NewEventReceived") + nodeToNodeNewEventInPoolMethodDescriptor = nodeToNodeServiceDescriptor.Methods().ByName("NewEventInPool") +) + +// NodeToNodeClient is a client for the river.NodeToNode service. +type NodeToNodeClient interface { + AllocateStream(context.Context, *connect.Request[protocol.AllocateStreamRequest]) (*connect.Response[protocol.AllocateStreamResponse], error) + NewEventReceived(context.Context, *connect.Request[protocol.NewEventReceivedRequest]) (*connect.Response[protocol.NewEventReceivedResponse], error) + NewEventInPool(context.Context, *connect.Request[protocol.NewEventInPoolRequest]) (*connect.Response[protocol.NewEventInPoolResponse], error) +} + +// NewNodeToNodeClient constructs a client for the river.NodeToNode service. By default, it uses the +// Connect protocol with the binary Protobuf Codec, asks for gzipped responses, and sends +// uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or +// connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewNodeToNodeClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) NodeToNodeClient { + baseURL = strings.TrimRight(baseURL, "/") + return &nodeToNodeClient{ + allocateStream: connect.NewClient[protocol.AllocateStreamRequest, protocol.AllocateStreamResponse]( + httpClient, + baseURL+NodeToNodeAllocateStreamProcedure, + connect.WithSchema(nodeToNodeAllocateStreamMethodDescriptor), + connect.WithClientOptions(opts...), + ), + newEventReceived: connect.NewClient[protocol.NewEventReceivedRequest, protocol.NewEventReceivedResponse]( + httpClient, + baseURL+NodeToNodeNewEventReceivedProcedure, + connect.WithSchema(nodeToNodeNewEventReceivedMethodDescriptor), + connect.WithClientOptions(opts...), + ), + newEventInPool: connect.NewClient[protocol.NewEventInPoolRequest, protocol.NewEventInPoolResponse]( + httpClient, + baseURL+NodeToNodeNewEventInPoolProcedure, + connect.WithSchema(nodeToNodeNewEventInPoolMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// nodeToNodeClient implements NodeToNodeClient. +type nodeToNodeClient struct { + allocateStream *connect.Client[protocol.AllocateStreamRequest, protocol.AllocateStreamResponse] + newEventReceived *connect.Client[protocol.NewEventReceivedRequest, protocol.NewEventReceivedResponse] + newEventInPool *connect.Client[protocol.NewEventInPoolRequest, protocol.NewEventInPoolResponse] +} + +// AllocateStream calls river.NodeToNode.AllocateStream. +func (c *nodeToNodeClient) AllocateStream(ctx context.Context, req *connect.Request[protocol.AllocateStreamRequest]) (*connect.Response[protocol.AllocateStreamResponse], error) { + return c.allocateStream.CallUnary(ctx, req) +} + +// NewEventReceived calls river.NodeToNode.NewEventReceived. +func (c *nodeToNodeClient) NewEventReceived(ctx context.Context, req *connect.Request[protocol.NewEventReceivedRequest]) (*connect.Response[protocol.NewEventReceivedResponse], error) { + return c.newEventReceived.CallUnary(ctx, req) +} + +// NewEventInPool calls river.NodeToNode.NewEventInPool. +func (c *nodeToNodeClient) NewEventInPool(ctx context.Context, req *connect.Request[protocol.NewEventInPoolRequest]) (*connect.Response[protocol.NewEventInPoolResponse], error) { + return c.newEventInPool.CallUnary(ctx, req) +} + +// NodeToNodeHandler is an implementation of the river.NodeToNode service. +type NodeToNodeHandler interface { + AllocateStream(context.Context, *connect.Request[protocol.AllocateStreamRequest]) (*connect.Response[protocol.AllocateStreamResponse], error) + NewEventReceived(context.Context, *connect.Request[protocol.NewEventReceivedRequest]) (*connect.Response[protocol.NewEventReceivedResponse], error) + NewEventInPool(context.Context, *connect.Request[protocol.NewEventInPoolRequest]) (*connect.Response[protocol.NewEventInPoolResponse], error) +} + +// NewNodeToNodeHandler builds an HTTP handler from the service implementation. It returns the path +// on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewNodeToNodeHandler(svc NodeToNodeHandler, opts ...connect.HandlerOption) (string, http.Handler) { + nodeToNodeAllocateStreamHandler := connect.NewUnaryHandler( + NodeToNodeAllocateStreamProcedure, + svc.AllocateStream, + connect.WithSchema(nodeToNodeAllocateStreamMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + nodeToNodeNewEventReceivedHandler := connect.NewUnaryHandler( + NodeToNodeNewEventReceivedProcedure, + svc.NewEventReceived, + connect.WithSchema(nodeToNodeNewEventReceivedMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + nodeToNodeNewEventInPoolHandler := connect.NewUnaryHandler( + NodeToNodeNewEventInPoolProcedure, + svc.NewEventInPool, + connect.WithSchema(nodeToNodeNewEventInPoolMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/river.NodeToNode/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case NodeToNodeAllocateStreamProcedure: + nodeToNodeAllocateStreamHandler.ServeHTTP(w, r) + case NodeToNodeNewEventReceivedProcedure: + nodeToNodeNewEventReceivedHandler.ServeHTTP(w, r) + case NodeToNodeNewEventInPoolProcedure: + nodeToNodeNewEventInPoolHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedNodeToNodeHandler returns CodeUnimplemented from all methods. +type UnimplementedNodeToNodeHandler struct{} + +func (UnimplementedNodeToNodeHandler) AllocateStream(context.Context, *connect.Request[protocol.AllocateStreamRequest]) (*connect.Response[protocol.AllocateStreamResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("river.NodeToNode.AllocateStream is not implemented")) +} + +func (UnimplementedNodeToNodeHandler) NewEventReceived(context.Context, *connect.Request[protocol.NewEventReceivedRequest]) (*connect.Response[protocol.NewEventReceivedResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("river.NodeToNode.NewEventReceived is not implemented")) +} + +func (UnimplementedNodeToNodeHandler) NewEventInPool(context.Context, *connect.Request[protocol.NewEventInPoolRequest]) (*connect.Response[protocol.NewEventInPoolResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("river.NodeToNode.NewEventInPool is not implemented")) +} diff --git a/core/node/protocol/protocolconnect/protocol.connect.go b/core/node/protocol/protocolconnect/protocol.connect.go new file mode 100644 index 000000000..536c8adc0 --- /dev/null +++ b/core/node/protocol/protocolconnect/protocol.connect.go @@ -0,0 +1,439 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: protocol.proto + +package protocolconnect + +import ( + connect "connectrpc.com/connect" + context "context" + errors "errors" + protocol "github.com/river-build/river/core/node/protocol" + http "net/http" + strings "strings" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // StreamServiceName is the fully-qualified name of the StreamService service. + StreamServiceName = "river.StreamService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // StreamServiceCreateStreamProcedure is the fully-qualified name of the StreamService's + // CreateStream RPC. + StreamServiceCreateStreamProcedure = "/river.StreamService/CreateStream" + // StreamServiceGetStreamProcedure is the fully-qualified name of the StreamService's GetStream RPC. + StreamServiceGetStreamProcedure = "/river.StreamService/GetStream" + // StreamServiceGetStreamExProcedure is the fully-qualified name of the StreamService's GetStreamEx + // RPC. + StreamServiceGetStreamExProcedure = "/river.StreamService/GetStreamEx" + // StreamServiceGetMiniblocksProcedure is the fully-qualified name of the StreamService's + // GetMiniblocks RPC. + StreamServiceGetMiniblocksProcedure = "/river.StreamService/GetMiniblocks" + // StreamServiceGetLastMiniblockHashProcedure is the fully-qualified name of the StreamService's + // GetLastMiniblockHash RPC. + StreamServiceGetLastMiniblockHashProcedure = "/river.StreamService/GetLastMiniblockHash" + // StreamServiceAddEventProcedure is the fully-qualified name of the StreamService's AddEvent RPC. + StreamServiceAddEventProcedure = "/river.StreamService/AddEvent" + // StreamServiceSyncStreamsProcedure is the fully-qualified name of the StreamService's SyncStreams + // RPC. + StreamServiceSyncStreamsProcedure = "/river.StreamService/SyncStreams" + // StreamServiceAddStreamToSyncProcedure is the fully-qualified name of the StreamService's + // AddStreamToSync RPC. + StreamServiceAddStreamToSyncProcedure = "/river.StreamService/AddStreamToSync" + // StreamServiceCancelSyncProcedure is the fully-qualified name of the StreamService's CancelSync + // RPC. + StreamServiceCancelSyncProcedure = "/river.StreamService/CancelSync" + // StreamServiceRemoveStreamFromSyncProcedure is the fully-qualified name of the StreamService's + // RemoveStreamFromSync RPC. + StreamServiceRemoveStreamFromSyncProcedure = "/river.StreamService/RemoveStreamFromSync" + // StreamServiceInfoProcedure is the fully-qualified name of the StreamService's Info RPC. + StreamServiceInfoProcedure = "/river.StreamService/Info" + // StreamServicePingSyncProcedure is the fully-qualified name of the StreamService's PingSync RPC. + StreamServicePingSyncProcedure = "/river.StreamService/PingSync" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + streamServiceServiceDescriptor = protocol.File_protocol_proto.Services().ByName("StreamService") + streamServiceCreateStreamMethodDescriptor = streamServiceServiceDescriptor.Methods().ByName("CreateStream") + streamServiceGetStreamMethodDescriptor = streamServiceServiceDescriptor.Methods().ByName("GetStream") + streamServiceGetStreamExMethodDescriptor = streamServiceServiceDescriptor.Methods().ByName("GetStreamEx") + streamServiceGetMiniblocksMethodDescriptor = streamServiceServiceDescriptor.Methods().ByName("GetMiniblocks") + streamServiceGetLastMiniblockHashMethodDescriptor = streamServiceServiceDescriptor.Methods().ByName("GetLastMiniblockHash") + streamServiceAddEventMethodDescriptor = streamServiceServiceDescriptor.Methods().ByName("AddEvent") + streamServiceSyncStreamsMethodDescriptor = streamServiceServiceDescriptor.Methods().ByName("SyncStreams") + streamServiceAddStreamToSyncMethodDescriptor = streamServiceServiceDescriptor.Methods().ByName("AddStreamToSync") + streamServiceCancelSyncMethodDescriptor = streamServiceServiceDescriptor.Methods().ByName("CancelSync") + streamServiceRemoveStreamFromSyncMethodDescriptor = streamServiceServiceDescriptor.Methods().ByName("RemoveStreamFromSync") + streamServiceInfoMethodDescriptor = streamServiceServiceDescriptor.Methods().ByName("Info") + streamServicePingSyncMethodDescriptor = streamServiceServiceDescriptor.Methods().ByName("PingSync") +) + +// StreamServiceClient is a client for the river.StreamService service. +type StreamServiceClient interface { + CreateStream(context.Context, *connect.Request[protocol.CreateStreamRequest]) (*connect.Response[protocol.CreateStreamResponse], error) + GetStream(context.Context, *connect.Request[protocol.GetStreamRequest]) (*connect.Response[protocol.GetStreamResponse], error) + GetStreamEx(context.Context, *connect.Request[protocol.GetStreamExRequest]) (*connect.ServerStreamForClient[protocol.GetStreamExResponse], error) + GetMiniblocks(context.Context, *connect.Request[protocol.GetMiniblocksRequest]) (*connect.Response[protocol.GetMiniblocksResponse], error) + GetLastMiniblockHash(context.Context, *connect.Request[protocol.GetLastMiniblockHashRequest]) (*connect.Response[protocol.GetLastMiniblockHashResponse], error) + AddEvent(context.Context, *connect.Request[protocol.AddEventRequest]) (*connect.Response[protocol.AddEventResponse], error) + SyncStreams(context.Context, *connect.Request[protocol.SyncStreamsRequest]) (*connect.ServerStreamForClient[protocol.SyncStreamsResponse], error) + AddStreamToSync(context.Context, *connect.Request[protocol.AddStreamToSyncRequest]) (*connect.Response[protocol.AddStreamToSyncResponse], error) + CancelSync(context.Context, *connect.Request[protocol.CancelSyncRequest]) (*connect.Response[protocol.CancelSyncResponse], error) + RemoveStreamFromSync(context.Context, *connect.Request[protocol.RemoveStreamFromSyncRequest]) (*connect.Response[protocol.RemoveStreamFromSyncResponse], error) + Info(context.Context, *connect.Request[protocol.InfoRequest]) (*connect.Response[protocol.InfoResponse], error) + PingSync(context.Context, *connect.Request[protocol.PingSyncRequest]) (*connect.Response[protocol.PingSyncResponse], error) +} + +// NewStreamServiceClient constructs a client for the river.StreamService service. By default, it +// uses the Connect protocol with the binary Protobuf Codec, asks for gzipped responses, and sends +// uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or +// connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewStreamServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) StreamServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &streamServiceClient{ + createStream: connect.NewClient[protocol.CreateStreamRequest, protocol.CreateStreamResponse]( + httpClient, + baseURL+StreamServiceCreateStreamProcedure, + connect.WithSchema(streamServiceCreateStreamMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getStream: connect.NewClient[protocol.GetStreamRequest, protocol.GetStreamResponse]( + httpClient, + baseURL+StreamServiceGetStreamProcedure, + connect.WithSchema(streamServiceGetStreamMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getStreamEx: connect.NewClient[protocol.GetStreamExRequest, protocol.GetStreamExResponse]( + httpClient, + baseURL+StreamServiceGetStreamExProcedure, + connect.WithSchema(streamServiceGetStreamExMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getMiniblocks: connect.NewClient[protocol.GetMiniblocksRequest, protocol.GetMiniblocksResponse]( + httpClient, + baseURL+StreamServiceGetMiniblocksProcedure, + connect.WithSchema(streamServiceGetMiniblocksMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getLastMiniblockHash: connect.NewClient[protocol.GetLastMiniblockHashRequest, protocol.GetLastMiniblockHashResponse]( + httpClient, + baseURL+StreamServiceGetLastMiniblockHashProcedure, + connect.WithSchema(streamServiceGetLastMiniblockHashMethodDescriptor), + connect.WithClientOptions(opts...), + ), + addEvent: connect.NewClient[protocol.AddEventRequest, protocol.AddEventResponse]( + httpClient, + baseURL+StreamServiceAddEventProcedure, + connect.WithSchema(streamServiceAddEventMethodDescriptor), + connect.WithClientOptions(opts...), + ), + syncStreams: connect.NewClient[protocol.SyncStreamsRequest, protocol.SyncStreamsResponse]( + httpClient, + baseURL+StreamServiceSyncStreamsProcedure, + connect.WithSchema(streamServiceSyncStreamsMethodDescriptor), + connect.WithClientOptions(opts...), + ), + addStreamToSync: connect.NewClient[protocol.AddStreamToSyncRequest, protocol.AddStreamToSyncResponse]( + httpClient, + baseURL+StreamServiceAddStreamToSyncProcedure, + connect.WithSchema(streamServiceAddStreamToSyncMethodDescriptor), + connect.WithClientOptions(opts...), + ), + cancelSync: connect.NewClient[protocol.CancelSyncRequest, protocol.CancelSyncResponse]( + httpClient, + baseURL+StreamServiceCancelSyncProcedure, + connect.WithSchema(streamServiceCancelSyncMethodDescriptor), + connect.WithClientOptions(opts...), + ), + removeStreamFromSync: connect.NewClient[protocol.RemoveStreamFromSyncRequest, protocol.RemoveStreamFromSyncResponse]( + httpClient, + baseURL+StreamServiceRemoveStreamFromSyncProcedure, + connect.WithSchema(streamServiceRemoveStreamFromSyncMethodDescriptor), + connect.WithClientOptions(opts...), + ), + info: connect.NewClient[protocol.InfoRequest, protocol.InfoResponse]( + httpClient, + baseURL+StreamServiceInfoProcedure, + connect.WithSchema(streamServiceInfoMethodDescriptor), + connect.WithClientOptions(opts...), + ), + pingSync: connect.NewClient[protocol.PingSyncRequest, protocol.PingSyncResponse]( + httpClient, + baseURL+StreamServicePingSyncProcedure, + connect.WithSchema(streamServicePingSyncMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// streamServiceClient implements StreamServiceClient. +type streamServiceClient struct { + createStream *connect.Client[protocol.CreateStreamRequest, protocol.CreateStreamResponse] + getStream *connect.Client[protocol.GetStreamRequest, protocol.GetStreamResponse] + getStreamEx *connect.Client[protocol.GetStreamExRequest, protocol.GetStreamExResponse] + getMiniblocks *connect.Client[protocol.GetMiniblocksRequest, protocol.GetMiniblocksResponse] + getLastMiniblockHash *connect.Client[protocol.GetLastMiniblockHashRequest, protocol.GetLastMiniblockHashResponse] + addEvent *connect.Client[protocol.AddEventRequest, protocol.AddEventResponse] + syncStreams *connect.Client[protocol.SyncStreamsRequest, protocol.SyncStreamsResponse] + addStreamToSync *connect.Client[protocol.AddStreamToSyncRequest, protocol.AddStreamToSyncResponse] + cancelSync *connect.Client[protocol.CancelSyncRequest, protocol.CancelSyncResponse] + removeStreamFromSync *connect.Client[protocol.RemoveStreamFromSyncRequest, protocol.RemoveStreamFromSyncResponse] + info *connect.Client[protocol.InfoRequest, protocol.InfoResponse] + pingSync *connect.Client[protocol.PingSyncRequest, protocol.PingSyncResponse] +} + +// CreateStream calls river.StreamService.CreateStream. +func (c *streamServiceClient) CreateStream(ctx context.Context, req *connect.Request[protocol.CreateStreamRequest]) (*connect.Response[protocol.CreateStreamResponse], error) { + return c.createStream.CallUnary(ctx, req) +} + +// GetStream calls river.StreamService.GetStream. +func (c *streamServiceClient) GetStream(ctx context.Context, req *connect.Request[protocol.GetStreamRequest]) (*connect.Response[protocol.GetStreamResponse], error) { + return c.getStream.CallUnary(ctx, req) +} + +// GetStreamEx calls river.StreamService.GetStreamEx. +func (c *streamServiceClient) GetStreamEx(ctx context.Context, req *connect.Request[protocol.GetStreamExRequest]) (*connect.ServerStreamForClient[protocol.GetStreamExResponse], error) { + return c.getStreamEx.CallServerStream(ctx, req) +} + +// GetMiniblocks calls river.StreamService.GetMiniblocks. +func (c *streamServiceClient) GetMiniblocks(ctx context.Context, req *connect.Request[protocol.GetMiniblocksRequest]) (*connect.Response[protocol.GetMiniblocksResponse], error) { + return c.getMiniblocks.CallUnary(ctx, req) +} + +// GetLastMiniblockHash calls river.StreamService.GetLastMiniblockHash. +func (c *streamServiceClient) GetLastMiniblockHash(ctx context.Context, req *connect.Request[protocol.GetLastMiniblockHashRequest]) (*connect.Response[protocol.GetLastMiniblockHashResponse], error) { + return c.getLastMiniblockHash.CallUnary(ctx, req) +} + +// AddEvent calls river.StreamService.AddEvent. +func (c *streamServiceClient) AddEvent(ctx context.Context, req *connect.Request[protocol.AddEventRequest]) (*connect.Response[protocol.AddEventResponse], error) { + return c.addEvent.CallUnary(ctx, req) +} + +// SyncStreams calls river.StreamService.SyncStreams. +func (c *streamServiceClient) SyncStreams(ctx context.Context, req *connect.Request[protocol.SyncStreamsRequest]) (*connect.ServerStreamForClient[protocol.SyncStreamsResponse], error) { + return c.syncStreams.CallServerStream(ctx, req) +} + +// AddStreamToSync calls river.StreamService.AddStreamToSync. +func (c *streamServiceClient) AddStreamToSync(ctx context.Context, req *connect.Request[protocol.AddStreamToSyncRequest]) (*connect.Response[protocol.AddStreamToSyncResponse], error) { + return c.addStreamToSync.CallUnary(ctx, req) +} + +// CancelSync calls river.StreamService.CancelSync. +func (c *streamServiceClient) CancelSync(ctx context.Context, req *connect.Request[protocol.CancelSyncRequest]) (*connect.Response[protocol.CancelSyncResponse], error) { + return c.cancelSync.CallUnary(ctx, req) +} + +// RemoveStreamFromSync calls river.StreamService.RemoveStreamFromSync. +func (c *streamServiceClient) RemoveStreamFromSync(ctx context.Context, req *connect.Request[protocol.RemoveStreamFromSyncRequest]) (*connect.Response[protocol.RemoveStreamFromSyncResponse], error) { + return c.removeStreamFromSync.CallUnary(ctx, req) +} + +// Info calls river.StreamService.Info. +func (c *streamServiceClient) Info(ctx context.Context, req *connect.Request[protocol.InfoRequest]) (*connect.Response[protocol.InfoResponse], error) { + return c.info.CallUnary(ctx, req) +} + +// PingSync calls river.StreamService.PingSync. +func (c *streamServiceClient) PingSync(ctx context.Context, req *connect.Request[protocol.PingSyncRequest]) (*connect.Response[protocol.PingSyncResponse], error) { + return c.pingSync.CallUnary(ctx, req) +} + +// StreamServiceHandler is an implementation of the river.StreamService service. +type StreamServiceHandler interface { + CreateStream(context.Context, *connect.Request[protocol.CreateStreamRequest]) (*connect.Response[protocol.CreateStreamResponse], error) + GetStream(context.Context, *connect.Request[protocol.GetStreamRequest]) (*connect.Response[protocol.GetStreamResponse], error) + GetStreamEx(context.Context, *connect.Request[protocol.GetStreamExRequest], *connect.ServerStream[protocol.GetStreamExResponse]) error + GetMiniblocks(context.Context, *connect.Request[protocol.GetMiniblocksRequest]) (*connect.Response[protocol.GetMiniblocksResponse], error) + GetLastMiniblockHash(context.Context, *connect.Request[protocol.GetLastMiniblockHashRequest]) (*connect.Response[protocol.GetLastMiniblockHashResponse], error) + AddEvent(context.Context, *connect.Request[protocol.AddEventRequest]) (*connect.Response[protocol.AddEventResponse], error) + SyncStreams(context.Context, *connect.Request[protocol.SyncStreamsRequest], *connect.ServerStream[protocol.SyncStreamsResponse]) error + AddStreamToSync(context.Context, *connect.Request[protocol.AddStreamToSyncRequest]) (*connect.Response[protocol.AddStreamToSyncResponse], error) + CancelSync(context.Context, *connect.Request[protocol.CancelSyncRequest]) (*connect.Response[protocol.CancelSyncResponse], error) + RemoveStreamFromSync(context.Context, *connect.Request[protocol.RemoveStreamFromSyncRequest]) (*connect.Response[protocol.RemoveStreamFromSyncResponse], error) + Info(context.Context, *connect.Request[protocol.InfoRequest]) (*connect.Response[protocol.InfoResponse], error) + PingSync(context.Context, *connect.Request[protocol.PingSyncRequest]) (*connect.Response[protocol.PingSyncResponse], error) +} + +// NewStreamServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewStreamServiceHandler(svc StreamServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + streamServiceCreateStreamHandler := connect.NewUnaryHandler( + StreamServiceCreateStreamProcedure, + svc.CreateStream, + connect.WithSchema(streamServiceCreateStreamMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + streamServiceGetStreamHandler := connect.NewUnaryHandler( + StreamServiceGetStreamProcedure, + svc.GetStream, + connect.WithSchema(streamServiceGetStreamMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + streamServiceGetStreamExHandler := connect.NewServerStreamHandler( + StreamServiceGetStreamExProcedure, + svc.GetStreamEx, + connect.WithSchema(streamServiceGetStreamExMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + streamServiceGetMiniblocksHandler := connect.NewUnaryHandler( + StreamServiceGetMiniblocksProcedure, + svc.GetMiniblocks, + connect.WithSchema(streamServiceGetMiniblocksMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + streamServiceGetLastMiniblockHashHandler := connect.NewUnaryHandler( + StreamServiceGetLastMiniblockHashProcedure, + svc.GetLastMiniblockHash, + connect.WithSchema(streamServiceGetLastMiniblockHashMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + streamServiceAddEventHandler := connect.NewUnaryHandler( + StreamServiceAddEventProcedure, + svc.AddEvent, + connect.WithSchema(streamServiceAddEventMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + streamServiceSyncStreamsHandler := connect.NewServerStreamHandler( + StreamServiceSyncStreamsProcedure, + svc.SyncStreams, + connect.WithSchema(streamServiceSyncStreamsMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + streamServiceAddStreamToSyncHandler := connect.NewUnaryHandler( + StreamServiceAddStreamToSyncProcedure, + svc.AddStreamToSync, + connect.WithSchema(streamServiceAddStreamToSyncMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + streamServiceCancelSyncHandler := connect.NewUnaryHandler( + StreamServiceCancelSyncProcedure, + svc.CancelSync, + connect.WithSchema(streamServiceCancelSyncMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + streamServiceRemoveStreamFromSyncHandler := connect.NewUnaryHandler( + StreamServiceRemoveStreamFromSyncProcedure, + svc.RemoveStreamFromSync, + connect.WithSchema(streamServiceRemoveStreamFromSyncMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + streamServiceInfoHandler := connect.NewUnaryHandler( + StreamServiceInfoProcedure, + svc.Info, + connect.WithSchema(streamServiceInfoMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + streamServicePingSyncHandler := connect.NewUnaryHandler( + StreamServicePingSyncProcedure, + svc.PingSync, + connect.WithSchema(streamServicePingSyncMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/river.StreamService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case StreamServiceCreateStreamProcedure: + streamServiceCreateStreamHandler.ServeHTTP(w, r) + case StreamServiceGetStreamProcedure: + streamServiceGetStreamHandler.ServeHTTP(w, r) + case StreamServiceGetStreamExProcedure: + streamServiceGetStreamExHandler.ServeHTTP(w, r) + case StreamServiceGetMiniblocksProcedure: + streamServiceGetMiniblocksHandler.ServeHTTP(w, r) + case StreamServiceGetLastMiniblockHashProcedure: + streamServiceGetLastMiniblockHashHandler.ServeHTTP(w, r) + case StreamServiceAddEventProcedure: + streamServiceAddEventHandler.ServeHTTP(w, r) + case StreamServiceSyncStreamsProcedure: + streamServiceSyncStreamsHandler.ServeHTTP(w, r) + case StreamServiceAddStreamToSyncProcedure: + streamServiceAddStreamToSyncHandler.ServeHTTP(w, r) + case StreamServiceCancelSyncProcedure: + streamServiceCancelSyncHandler.ServeHTTP(w, r) + case StreamServiceRemoveStreamFromSyncProcedure: + streamServiceRemoveStreamFromSyncHandler.ServeHTTP(w, r) + case StreamServiceInfoProcedure: + streamServiceInfoHandler.ServeHTTP(w, r) + case StreamServicePingSyncProcedure: + streamServicePingSyncHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedStreamServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedStreamServiceHandler struct{} + +func (UnimplementedStreamServiceHandler) CreateStream(context.Context, *connect.Request[protocol.CreateStreamRequest]) (*connect.Response[protocol.CreateStreamResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("river.StreamService.CreateStream is not implemented")) +} + +func (UnimplementedStreamServiceHandler) GetStream(context.Context, *connect.Request[protocol.GetStreamRequest]) (*connect.Response[protocol.GetStreamResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("river.StreamService.GetStream is not implemented")) +} + +func (UnimplementedStreamServiceHandler) GetStreamEx(context.Context, *connect.Request[protocol.GetStreamExRequest], *connect.ServerStream[protocol.GetStreamExResponse]) error { + return connect.NewError(connect.CodeUnimplemented, errors.New("river.StreamService.GetStreamEx is not implemented")) +} + +func (UnimplementedStreamServiceHandler) GetMiniblocks(context.Context, *connect.Request[protocol.GetMiniblocksRequest]) (*connect.Response[protocol.GetMiniblocksResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("river.StreamService.GetMiniblocks is not implemented")) +} + +func (UnimplementedStreamServiceHandler) GetLastMiniblockHash(context.Context, *connect.Request[protocol.GetLastMiniblockHashRequest]) (*connect.Response[protocol.GetLastMiniblockHashResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("river.StreamService.GetLastMiniblockHash is not implemented")) +} + +func (UnimplementedStreamServiceHandler) AddEvent(context.Context, *connect.Request[protocol.AddEventRequest]) (*connect.Response[protocol.AddEventResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("river.StreamService.AddEvent is not implemented")) +} + +func (UnimplementedStreamServiceHandler) SyncStreams(context.Context, *connect.Request[protocol.SyncStreamsRequest], *connect.ServerStream[protocol.SyncStreamsResponse]) error { + return connect.NewError(connect.CodeUnimplemented, errors.New("river.StreamService.SyncStreams is not implemented")) +} + +func (UnimplementedStreamServiceHandler) AddStreamToSync(context.Context, *connect.Request[protocol.AddStreamToSyncRequest]) (*connect.Response[protocol.AddStreamToSyncResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("river.StreamService.AddStreamToSync is not implemented")) +} + +func (UnimplementedStreamServiceHandler) CancelSync(context.Context, *connect.Request[protocol.CancelSyncRequest]) (*connect.Response[protocol.CancelSyncResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("river.StreamService.CancelSync is not implemented")) +} + +func (UnimplementedStreamServiceHandler) RemoveStreamFromSync(context.Context, *connect.Request[protocol.RemoveStreamFromSyncRequest]) (*connect.Response[protocol.RemoveStreamFromSyncResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("river.StreamService.RemoveStreamFromSync is not implemented")) +} + +func (UnimplementedStreamServiceHandler) Info(context.Context, *connect.Request[protocol.InfoRequest]) (*connect.Response[protocol.InfoResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("river.StreamService.Info is not implemented")) +} + +func (UnimplementedStreamServiceHandler) PingSync(context.Context, *connect.Request[protocol.PingSyncRequest]) (*connect.Response[protocol.PingSyncResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("river.StreamService.PingSync is not implemented")) +} diff --git a/core/node/protocol_extensions/main.go b/core/node/protocol_extensions/main.go new file mode 100644 index 000000000..f2a267bce --- /dev/null +++ b/core/node/protocol_extensions/main.go @@ -0,0 +1,231 @@ +package main + +import ( + "fmt" + "go/ast" + "go/parser" + "go/token" + "os" + "strings" + + "golang.org/x/text/cases" + "golang.org/x/text/language" +) + +// Wrap os.File to add a WriteString2 method that prints errors to stdout. +type FileHelper struct { + *os.File +} + +// WriteString returns an error. WriteString2 prints the error to stdout. +func (f *FileHelper) WriteString2(s string) { + _, err := f.WriteString(s) + if err != nil { + fmt.Println("Error writing to output file:", err) + } +} + +// Parse the protocol file and generate a new file with custom extensions. +func main() { + inputFileName := "../protocol/protocol.pb.go" + outputFileName := "../protocol/extensions.pb.go" + printAllStructs := false + + fset := token.NewFileSet() + file, err := parser.ParseFile(fset, inputFileName, nil, parser.ParseComments) + if err != nil { + fmt.Println("Error parsing file:", err) + return + } + + var oneOfTypes []string + var inceptionTypes []string + var allStructs []string + ast.Inspect(file, func(n ast.Node) bool { + switch x := n.(type) { + case *ast.GenDecl: + if x.Tok == token.TYPE { + for _, spec := range x.Specs { + typeSpec := spec.(*ast.TypeSpec) + if structType, ok := typeSpec.Type.(*ast.StructType); ok { + allStructs = append(allStructs, typeSpec.Name.Name) + if strings.HasSuffix(typeSpec.Name.Name, "_Inception") { + inceptionTypes = append(inceptionTypes, typeSpec.Name.Name) + } + for _, field := range structType.Fields.List { + fieldType, ok := field.Type.(*ast.Ident) + if ok { + if field.Tag != nil && strings.Contains(field.Tag.Value, "protobuf_oneof") { + oneOfTypes = append(oneOfTypes, fieldType.Name) + allStructs = append(allStructs, fmt.Sprintf(" /* tag:%s */\n /* comment:%s */\n /* doc: \n %s */", field.Tag.Value, field.Comment.Text(), field.Doc.Text())) + } + } + switch x := field.Type.(type) { + case *ast.Ident: + allStructs = append(allStructs, fmt.Sprintf(" %s %s", field.Names[0], x.Name)) + case *ast.SelectorExpr: + if !strings.Contains(fmt.Sprintf("%s", x.X), "protoimpl") { + allStructs = append(allStructs, fmt.Sprintf(" %s %s.%s", field.Names[0], x.X, x.Sel.Name)) + } + case *ast.StarExpr: + allStructs = append(allStructs, fmt.Sprintf(" %s *%s", field.Names[0], x.X)) + case *ast.ArrayType: + allStructs = append(allStructs, fmt.Sprintf(" %s []%s", field.Names[0], x.Elt)) + case *ast.MapType: + allStructs = append(allStructs, fmt.Sprintf(" %s map[%s]%s", field.Names[0], x.Key, x.Value)) + default: + allStructs = append(allStructs, fmt.Sprintf(" not found======%s %s", field.Names[0], x)) + } + + } + } + } + } + } + return true + }) + + outputFileF, err := os.Create(outputFileName) + outputFile := &FileHelper{outputFileF} + if err != nil { + fmt.Println("Error creating output file:", err) + return + } + defer outputFile.Close() + + packageName := file.Name.Name + outputFile.WriteString2(fmt.Sprintf("package %s\n\n", packageName)) + outputFile.WriteString2("import \"fmt\"\n\n") + + caser := cases.Title(language.English, cases.NoLower) + for _, oneOfTypeName := range oneOfTypes { + exportedTypeName := caser.String(oneOfTypeName) + outputFile.WriteString2(fmt.Sprintf("type %s = %s\n", exportedTypeName, oneOfTypeName)) + } + + // inceptions + genInceptionPayloadImpl(inceptionTypes, outputFile) + + if printAllStructs { + for _, structName := range allStructs { + outputFile.WriteString2(fmt.Sprintf("// %s \n", structName)) + } + } + + fmt.Println("Generated custom extensions in file:", outputFileName) +} + +func genInceptionPayloadImpl(inceptionTypes []string, outputFile *FileHelper) { + // the header defines the IsInceptionPayload interface + header := func() string { + return ` +type IsInceptionPayload interface { + isInceptionPayload() + GetStreamId() []byte + GetSettings() *StreamSettings +}` + } + + // conformance ensures that all inception types implement the IsInceptionPayload interface + conformance := func() string { + return ` +func (*%s) isInceptionPayload() {}` + } + + // snapshot getter allows us to get the inception payload from a snapshot + snapshotGetterStart := func() string { + return ` + +func (e *Snapshot) GetInceptionPayload() IsInceptionPayload { + switch e.Content.(type) {` + } + snapshotGetterCase := func() string { + return ` + case *Snapshot_%s: + r := e.Content.(*Snapshot_%s).%s.GetInception() + if r == nil { + return nil + } + return r` + } + + // stream event getter allows us to get the inception payload from a stream event + streamEventGetterStart := func() string { + return ` + +func (e *StreamEvent) GetInceptionPayload() IsInceptionPayload { + switch e.Payload.(type) {` + } + streamEventGetterCase := func() string { + return ` + case *StreamEvent_%s: + r := e.Payload.(*StreamEvent_%s).%s.GetInception() + if r == nil { + return nil + } + return r` + } + getterEnd := func() string { + return ` + default: + return nil + } +}` + } + + // validator ensures that the inception payload type matches the stream type + validatorStart := func() string { + return ` + +func (e *StreamEvent) VerifyPayloadTypeMatchesStreamType(i IsInceptionPayload) error { + switch e.Payload.(type) {` + } + validatorCase := func() string { + return ` + case *StreamEvent_%s: + _, ok := i.(*%s_Inception) + if !ok { + return fmt.Errorf("inception type mismatch: *protocol.StreamEvent_%s::%%T vs %%T", e.Get%s().Content, i) + }` + } + validatorEnd := func() string { + return ` + case *StreamEvent_MemberPayload: + return nil + default: + return fmt.Errorf("inception type type not handled: %T vs %T", e.Payload, i) + } + return nil +} +` + } + + outputFile.WriteString2(header()) + for _, inceptionTypeName := range inceptionTypes { + outputFile.WriteString2(fmt.Sprintf(conformance(), inceptionTypeName)) + } + + outputFile.WriteString2(snapshotGetterStart()) + for _, inceptionTypeName := range inceptionTypes { + inceptionTypeBase := strings.Split(inceptionTypeName, "_")[0] + inceptionTypeBase = strings.Replace(inceptionTypeBase, "Payload", "Content", 1) + outputFile.WriteString2(fmt.Sprintf(snapshotGetterCase(), inceptionTypeBase, inceptionTypeBase, inceptionTypeBase)) + } + outputFile.WriteString2(getterEnd()) + + outputFile.WriteString2(streamEventGetterStart()) + for _, inceptionTypeName := range inceptionTypes { + inceptionTypeBase := strings.Split(inceptionTypeName, "_")[0] + outputFile.WriteString2(fmt.Sprintf(streamEventGetterCase(), inceptionTypeBase, inceptionTypeBase, inceptionTypeBase)) + } + outputFile.WriteString2(getterEnd()) + + outputFile.WriteString2(validatorStart()) + for _, inceptionTypeName := range inceptionTypes { + inceptionTypeBase := strings.Split(inceptionTypeName, "_")[0] + outputFile.WriteString2( + fmt.Sprintf(validatorCase(), inceptionTypeBase, inceptionTypeBase, inceptionTypeBase, inceptionTypeBase), + ) + } + outputFile.WriteString2(validatorEnd()) +} diff --git a/core/node/registries/river_registry_contract.go b/core/node/registries/river_registry_contract.go new file mode 100644 index 000000000..30894f4a3 --- /dev/null +++ b/core/node/registries/river_registry_contract.go @@ -0,0 +1,589 @@ +package registries + +import ( + "context" + "math/big" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/contracts" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/dlog" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/shared" +) + +var streamRegistryABI, _ = contracts.StreamRegistryV1MetaData.GetAbi() + +// Convinience wrapper for the IRiverRegistryV1 interface (abigen exports it as RiverRegistryV1) +type RiverRegistryContract struct { + OperatorRegistry *contracts.OperatorRegistryV1 + + NodeRegistry *contracts.NodeRegistryV1 + NodeRegistryAbi *abi.ABI + NodeEventTopics [][]common.Hash + NodeEventInfo map[common.Hash]*EventInfo + + StreamRegistry *contracts.StreamRegistryV1 + StreamRegistryAbi *abi.ABI + StreamEventTopics [][]common.Hash + StreamEventInfo map[common.Hash]*EventInfo + + Blockchain *crypto.Blockchain + + Address common.Address + Addresses []common.Address + + errDecoder *contracts.EvmErrorDecoder +} + +type EventInfo struct { + Name string + Maker func() any +} + +func initContract[T any]( + ctx context.Context, + maker func(address common.Address, backend bind.ContractBackend) (*T, error), + address common.Address, + backend bind.ContractBackend, + metadata *bind.MetaData, + events []*EventInfo, +) ( + *T, + *abi.ABI, + [][]common.Hash, + map[common.Hash]*EventInfo, + error, +) { + log := dlog.FromCtx(ctx) + + contract, err := maker(address, backend) + if err != nil { + return nil, nil, nil, nil, AsRiverError(err, Err_BAD_CONFIG). + Message("Failed to initialize registry contract"). + Tags("address", address). + Func("NewRiverRegistryContract"). + LogError(log) + } + + abi, err := metadata.GetAbi() + if err != nil { + return nil, nil, nil, nil, AsRiverError(err, Err_INTERNAL). + Message("Failed to parse ABI"). + Func("NewRiverRegistryContract"). + LogError(log) + } + + if len(events) <= 0 { + return contract, abi, nil, nil, nil + } + + var eventSigs []common.Hash + eventInfo := make(map[common.Hash]*EventInfo) + for _, e := range events { + ev, ok := abi.Events[e.Name] + if !ok { + return nil, nil, nil, nil, RiverError(Err_INTERNAL, "Event not found in ABI", "event", e).Func("NewRiverRegistryContract").LogError(log) + } + eventSigs = append(eventSigs, ev.ID) + eventInfo[ev.ID] = e + } + return contract, abi, [][]common.Hash{eventSigs}, eventInfo, nil +} + +func NewRiverRegistryContract( + ctx context.Context, + blockchain *crypto.Blockchain, + cfg *config.ContractConfig, +) (*RiverRegistryContract, error) { + if cfg.Version != "" { + return nil, RiverError( + Err_BAD_CONFIG, + "Always binding to same interface, version should be empty", + "version", + cfg.Version, + ).Func("NewRiverRegistryContract") + } + + c := &RiverRegistryContract{ + Blockchain: blockchain, + Address: cfg.Address, + Addresses: []common.Address{cfg.Address}, + } + + var err error + c.OperatorRegistry, _, _, _, err = initContract( + ctx, + contracts.NewOperatorRegistryV1, + cfg.Address, + blockchain.Client, + contracts.OperatorRegistryV1MetaData, + nil, + ) + if err != nil { + return nil, err + } + + c.NodeRegistry, c.NodeRegistryAbi, c.NodeEventTopics, c.NodeEventInfo, err = initContract( + ctx, + contracts.NewNodeRegistryV1, + cfg.Address, + blockchain.Client, + contracts.NodeRegistryV1MetaData, + []*EventInfo{ + {"NodeAdded", func() any { return new(contracts.NodeRegistryV1NodeAdded) }}, + {"NodeRemoved", func() any { return new(contracts.NodeRegistryV1NodeRemoved) }}, + {"NodeStatusUpdated", func() any { return new(contracts.NodeRegistryV1NodeStatusUpdated) }}, + {"NodeUrlUpdated", func() any { return new(contracts.NodeRegistryV1NodeUrlUpdated) }}, + }, + ) + if err != nil { + return nil, err + } + + c.StreamRegistry, c.StreamRegistryAbi, c.StreamEventTopics, c.StreamEventInfo, err = initContract( + ctx, + contracts.NewStreamRegistryV1, + cfg.Address, + blockchain.Client, + contracts.StreamRegistryV1MetaData, + []*EventInfo{ + {contracts.Event_StreamAllocated, func() any { return new(contracts.StreamRegistryV1StreamAllocated) }}, + {contracts.Event_StreamLastMiniblockUpdated, func() any { return new(contracts.StreamRegistryV1StreamLastMiniblockUpdated) }}, + {contracts.Event_StreamPlacementUpdated, func() any { return new(contracts.StreamRegistryV1StreamPlacementUpdated) }}, + }, + ) + if err != nil { + return nil, err + } + + c.errDecoder, err = contracts.NewEVMErrorDecoder(contracts.StreamRegistryV1MetaData) + if err != nil { + return nil, err + } + + return c, nil +} + +func (c *RiverRegistryContract) AllocateStream( + ctx context.Context, + streamId StreamId, + addresses []common.Address, + genesisMiniblockHash common.Hash, + genesisMiniblock []byte, +) error { + log := dlog.FromCtx(ctx) + + pendingTx, err := c.Blockchain.TxPool.Submit( + ctx, + "AllocateStream", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + tx, err := c.StreamRegistry.AllocateStream( + opts, streamId, addresses, genesisMiniblockHash, genesisMiniblock) + if err == nil { + log.Info( + "RiverRegistryContract: prepared transaction", + "name", "AllocateStream", + "streamId", streamId, + "addresses", addresses, + "genesisMiniblockHash", genesisMiniblockHash, + "txHash", tx.Hash(), + ) + } + return tx, err + }, + ) + if err != nil { + return AsRiverError(err, Err_CANNOT_CALL_CONTRACT). + Func("AllocateStream"). + Message("Smart contract call failed") + } + + receipt := <-pendingTx.Wait() + if receipt != nil && receipt.Status == crypto.TransactionResultSuccess { + return nil + } + if receipt != nil && receipt.Status != crypto.TransactionResultSuccess { + return RiverError(Err_ERR_UNSPECIFIED, "Allocate stream transaction failed"). + Tag("tx", receipt.TxHash.Hex()). + Func("AllocateStream") + } + + return RiverError(Err_ERR_UNSPECIFIED, "AllocateStream transaction result unknown") +} + +type GetStreamResult struct { + StreamId StreamId + Nodes []common.Address + LastMiniblockHash common.Hash + LastMiniblockNum uint64 + IsSealed bool +} + +func makeGetStreamResult(streamId StreamId, stream *contracts.Stream) *GetStreamResult { + return &GetStreamResult{ + StreamId: streamId, + Nodes: stream.Nodes, + LastMiniblockHash: stream.LastMiniblockHash, + LastMiniblockNum: stream.LastMiniblockNum, + IsSealed: stream.Flags&1 != 0, // TODO: constants for flags + } +} + +func (c *RiverRegistryContract) GetStream(ctx context.Context, streamId StreamId) (*GetStreamResult, error) { + stream, err := c.StreamRegistry.GetStream(c.callOpts(ctx), streamId) + if err != nil { + return nil, WrapRiverError(Err_CANNOT_CALL_CONTRACT, err).Func("GetStream").Message("Call failed") + } + return makeGetStreamResult(streamId, &stream), nil +} + +// Returns stream, genesis miniblock hash, genesis miniblock, error +func (c *RiverRegistryContract) GetStreamWithGenesis( + ctx context.Context, + streamId StreamId, +) (*GetStreamResult, common.Hash, []byte, error) { + stream, mbHash, mb, err := c.StreamRegistry.GetStreamWithGenesis(c.callOpts(ctx), streamId) + if err != nil { + return nil, common.Hash{}, nil, WrapRiverError( + Err_CANNOT_CALL_CONTRACT, + err, + ).Func("GetStream"). + Message("Call failed") + } + ret := makeGetStreamResult(streamId, &stream) + return ret, mbHash, mb, nil +} + +func (c *RiverRegistryContract) GetStreamCount(ctx context.Context, blockNum crypto.BlockNumber) (int64, error) { + num, err := c.StreamRegistry.GetStreamCount(c.callOptsWithBlockNum(ctx, blockNum)) + if err != nil { + return 0, WrapRiverError(Err_CANNOT_CALL_CONTRACT, err).Func("GetStreamNum").Message("Call failed") + } + if !num.IsInt64() { + return 0, RiverError(Err_INTERNAL, "Stream number is too big", "num", num).Func("GetStreamNum") + } + return num.Int64(), nil +} + +var ZeroBytes32 = [32]byte{} + +func (c *RiverRegistryContract) GetAllStreams( + ctx context.Context, + blockNum crypto.BlockNumber, +) ([]*GetStreamResult, error) { + // TODO: setting + const pageSize = int64(5000) + + ret := make([]*GetStreamResult, 0, 5000) + + lastPage := false + var err error + var streams []contracts.StreamWithId + for i := int64(0); !lastPage; i += pageSize { + callOpts := c.callOptsWithBlockNum(ctx, blockNum) + streams, lastPage, err = c.StreamRegistry.GetPaginatedStreams(callOpts, big.NewInt(i), big.NewInt(i+pageSize)) + if err != nil { + return nil, WrapRiverError( + Err_CANNOT_CALL_CONTRACT, + err, + ).Func("GetStreamByIndex"). + Message("Smart contract call failed") + } + for _, stream := range streams { + if stream.Id == ZeroBytes32 { + continue + } + streamId, err := StreamIdFromHash(stream.Id) + if err != nil { + return nil, err + } + ret = append(ret, makeGetStreamResult(streamId, &stream.Stream)) + } + } + + return ret, nil +} + +// SetStreamLastMiniblockBatch sets the given block proposal in the RiverRegistry#StreamRegistry facet as the new +// latest block. It returns the streamId's for which the proposed block was set successful as the latest block, failed +// or an error in case the transaction could not be submitted or failed. +func (c *RiverRegistryContract) SetStreamLastMiniblockBatch( + ctx context.Context, mbs []contracts.SetMiniblock, +) ([]StreamId, []StreamId, error) { + var ( + log = dlog.FromCtx(ctx) + success []StreamId + failed []StreamId + ) + + tx, err := c.Blockchain.TxPool.Submit(ctx, "SetStreamLastMiniblockBatch", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + return c.StreamRegistry.SetStreamLastMiniblockBatch(opts, mbs) + }) + if err != nil { + ce, se, err := c.errDecoder.DecodeEVMError(err) + switch { + case ce != nil: + return nil, nil, AsRiverError(ce, Err_CANNOT_CALL_CONTRACT).Func("SetStreamLastMiniblockBatch") + case se != nil: + return nil, nil, AsRiverError(se, Err_CANNOT_CALL_CONTRACT).Func("SetStreamLastMiniblockBatch") + default: + return nil, nil, AsRiverError(err, Err_CANNOT_CALL_CONTRACT).Func("SetStreamLastMiniblockBatch") + } + } + + receipt := <-tx.Wait() + + if receipt != nil && receipt.Status == crypto.TransactionResultSuccess { + for _, l := range receipt.Logs { + if len(l.Topics) != 1 { + continue + } + + event, _ := streamRegistryABI.EventByID(l.Topics[0]) + if event == nil { + continue + } + + switch event.Name { + case "StreamLastMiniblockUpdated": + args, err := event.Inputs.Unpack(l.Data) + if err != nil || len(args) != 4 { + log.Error("Unable to unpack StreamLastMiniblockUpdated event", "err", err) + continue + } + + var ( + streamID = args[0].([32]byte) + lastMiniBlockHash = args[1].([32]byte) + lastMiniBlockNum = args[2].(uint64) + isSealed = args[3].(bool) + ) + + log.Info( + "RiverRegistryContract: set stream last miniblock", + "name", "SetStreamLastMiniblockBatch", + "streamId", streamID, + "lastMiniBlockHash", lastMiniBlockHash, + "lastMiniBlockNum", lastMiniBlockNum, + "isSealed", isSealed, + "txHash", receipt.TxHash, + ) + + success = append(success, streamID) + + case "StreamLastMiniblockUpdateFailed": + args, err := event.Inputs.Unpack(l.Data) + if err != nil || len(args) != 4 { + log.Error("Unable to unpack StreamLastMiniblockUpdateFailed event", "err", err) + continue + } + + var ( + streamID = args[0].([32]byte) + lastMiniBlockHash = args[1].([32]byte) + lastMiniBlockNum = args[2].(uint64) + reason = args[3].(string) + ) + + log.Error( + "RiverRegistryContract: set stream last miniblock failed", + "name", "SetStreamLastMiniblockBatch", + "streamId", streamID, + "lastMiniBlockHash", lastMiniBlockHash, + "lastMiniBlockNum", lastMiniBlockNum, + "txHash", receipt.TxHash, + "reason", reason, + ) + + failed = append(failed, streamID) + + default: + log.Error("Unexpected event on RiverRegistry::SetStreamLastMiniblockBatch", "event", event.Name) + } + } + + return success, failed, nil + } + + if receipt != nil && receipt.Status != crypto.TransactionResultSuccess { + return nil, nil, RiverError(Err_ERR_UNSPECIFIED, "Set stream last mini block transaction failed"). + Tag("tx", receipt.TxHash.Hex()). + Func("SetStreamLastMiniblockBatch") + } + return nil, nil, RiverError(Err_ERR_UNSPECIFIED, "SetStreamLastMiniblockBatch transaction result unknown") +} + +func (c *RiverRegistryContract) SetStreamLastMiniblock( + ctx context.Context, + streamId StreamId, + prevMiniblockHash common.Hash, + lastMiniblockHash common.Hash, + lastMiniblockNum uint64, + isSealed bool, +) error { + log := dlog.FromCtx(ctx) + + pendingTx, err := c.Blockchain.TxPool.Submit( + ctx, + "SetStreamLastMiniblock", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + tx, err := c.StreamRegistry.SetStreamLastMiniblock( + opts, streamId, prevMiniblockHash, lastMiniblockHash, lastMiniblockNum, isSealed) + if err == nil { + log.Info( + "RiverRegistryContract: prepared transaction", + "name", "SetStreamLastMiniblock", + "streamId", streamId, + "prevMiniblockHash", prevMiniblockHash, + "lastMiniblockHash", lastMiniblockHash, + "lastMiniblockNum", lastMiniblockNum, + "isSealed", isSealed, + "txHash", tx.Hash(), + ) + } + return tx, err + }, + ) + if err != nil { + return AsRiverError(err, Err_CANNOT_CALL_CONTRACT). + Func("SetStreamLastMiniblock"). + Tags("streamId", streamId, "prevMiniblockHash", prevMiniblockHash, "lastMiniblockHash", + lastMiniblockHash, "lastMiniblockNum", lastMiniblockNum, "isSealed", isSealed) + } + + receipt := <-pendingTx.Wait() + if receipt != nil && receipt.Status == crypto.TransactionResultSuccess { + return nil + } + if receipt != nil && receipt.Status != crypto.TransactionResultSuccess { + return RiverError(Err_ERR_UNSPECIFIED, "Set stream last mini block transaction failed"). + Tag("tx", receipt.TxHash.Hex()). + Func("SetStreamLastMiniblock") + } + + return RiverError(Err_ERR_UNSPECIFIED, "SetStreamLastMiniblock transaction result unknown") +} + +type NodeRecord = contracts.Node + +func (c *RiverRegistryContract) GetAllNodes(ctx context.Context, blockNum crypto.BlockNumber) ([]NodeRecord, error) { + nodes, err := c.NodeRegistry.GetAllNodes(c.callOptsWithBlockNum(ctx, blockNum)) + if err != nil { + return nil, WrapRiverError(Err_CANNOT_CALL_CONTRACT, err).Func("GetAllNodes").Message("Call failed") + } + return nodes, nil +} + +func (c *RiverRegistryContract) callOpts(ctx context.Context) *bind.CallOpts { + return &bind.CallOpts{ + Context: ctx, + } +} + +func (c *RiverRegistryContract) callOptsWithBlockNum(ctx context.Context, blockNum crypto.BlockNumber) *bind.CallOpts { + if blockNum == 0 { + return c.callOpts(ctx) + } else { + return &bind.CallOpts{ + Context: ctx, + BlockNumber: blockNum.AsBigInt(), + } + } +} + +type NodeEvents interface { + contracts.NodeRegistryV1NodeAdded | + contracts.NodeRegistryV1NodeRemoved | + contracts.NodeRegistryV1NodeStatusUpdated | + contracts.NodeRegistryV1NodeUrlUpdated +} + +func (c *RiverRegistryContract) GetNodeEventsForBlock(ctx context.Context, blockNum crypto.BlockNumber) ([]any, error) { + num := blockNum.AsBigInt() + logs, err := c.Blockchain.Client.FilterLogs(ctx, ethereum.FilterQuery{ + FromBlock: num, + ToBlock: num, + Addresses: c.Addresses, + Topics: c.NodeEventTopics, + }) + if err != nil { + return nil, WrapRiverError( + Err_CANNOT_CALL_CONTRACT, + err, + ).Func("GetNodeEventsForBlock"). + Message("FilterLogs failed") + } + var ret []any + for _, log := range logs { + ee, err := c.ParseEvent(ctx, c.NodeRegistry.BoundContract(), c.NodeEventInfo, log) + if err != nil { + return nil, err + } + ret = append(ret, ee) + } + return ret, nil +} + +func (c *RiverRegistryContract) ParseEvent( + ctx context.Context, + boundContract *bind.BoundContract, + info map[common.Hash]*EventInfo, + log types.Log, +) (any, error) { + if len(log.Topics) == 0 { + return nil, RiverError(Err_INTERNAL, "Empty topics in log", "log", log).Func("ParseEvent") + } + eventInfo, ok := info[log.Topics[0]] + if !ok { + return nil, RiverError(Err_INTERNAL, "Event not found", "id", log.Topics[0]).Func("ParseEvent") + } + ee := eventInfo.Maker() + err := boundContract.UnpackLog(ee, eventInfo.Name, log) + if err != nil { + return nil, WrapRiverError( + Err_CANNOT_CALL_CONTRACT, + err, + ).Func("ParseEvent"). + Message("UnpackLog failed") + } + return ee, nil +} + +func (c *RiverRegistryContract) OnStreamEvent( + ctx context.Context, + startBlockNumInclusive crypto.BlockNumber, + allocated func(ctx context.Context, event *contracts.StreamRegistryV1StreamAllocated), + lastMiniblockUpdated func(ctx context.Context, event *contracts.StreamRegistryV1StreamLastMiniblockUpdated), + placementUpdated func(ctx context.Context, event *contracts.StreamRegistryV1StreamPlacementUpdated), +) error { + // TODO: modify ChainMonitor to accept block number in each subscription call + c.Blockchain.ChainMonitor.OnContractWithTopicsEvent( + c.Address, + c.StreamEventTopics, + func(ctx context.Context, log types.Log) { + parsed, err := c.ParseEvent(ctx, c.StreamRegistry.BoundContract(), c.StreamEventInfo, log) + if err != nil { + dlog.FromCtx(ctx).Error("Failed to parse event", "err", err, "log", log) + return + } + switch e := parsed.(type) { + case *contracts.StreamRegistryV1StreamAllocated: + allocated(ctx, e) + case *contracts.StreamRegistryV1StreamLastMiniblockUpdated: + lastMiniblockUpdated(ctx, e) + case *contracts.StreamRegistryV1StreamPlacementUpdated: + placementUpdated(ctx, e) + default: + dlog.FromCtx(ctx).Error("Unknown event type", "event", e) + } + }) + return nil +} diff --git a/core/node/registries/river_registry_contract_test.go b/core/node/registries/river_registry_contract_test.go new file mode 100644 index 000000000..a94b322c9 --- /dev/null +++ b/core/node/registries/river_registry_contract_test.go @@ -0,0 +1,324 @@ +package registries + +import ( + "context" + "testing" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/base/test" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/contracts" + "github.com/river-build/river/core/node/crypto" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/shared" + "github.com/river-build/river/core/node/testutils" + "github.com/stretchr/testify/require" +) + +func TestNodeEvents(t *testing.T) { + require := require.New(t) + ctx, cancel := test.NewTestContext() + defer cancel() + tt, err := crypto.NewBlockchainTestContext(ctx, 1, false) + require.NoError(err) + + owner := tt.DeployerBlockchain + + bc := tt.GetBlockchain(ctx, 0) + + rr, err := NewRiverRegistryContract(ctx, bc, &config.ContractConfig{Address: tt.RiverRegistryAddress}) + require.NoError(err) + + num, err := bc.GetBlockNumber(ctx) + require.NoError(err) + + events, err := rr.GetNodeEventsForBlock(ctx, num) + require.NoError(err) + require.Len(events, 0) + + tt.Commit(ctx) + + // + // Test RegisterNode + // + nodeAddr1 := crypto.GetTestAddress() + nodeUrl1 := "http://node1.node" + nodeUrl2 := "http://node2.node" + _, err = owner.TxPool.Submit(ctx, "RegisterNode", func(opts *bind.TransactOpts) (*types.Transaction, error) { + return tt.NodeRegistry.RegisterNode(opts, nodeAddr1, nodeUrl1, 2) + }) + require.NoError(err) + _, err = owner.TxPool.Submit(ctx, "RegisterNode", func(opts *bind.TransactOpts) (*types.Transaction, error) { + return tt.NodeRegistry.RegisterNode(opts, crypto.GetTestAddress(), "url2", 0) + }) + require.NoError(err) + _, err = owner.TxPool.Submit(ctx, "RegisterNode", func(opts *bind.TransactOpts) (*types.Transaction, error) { + return tt.NodeRegistry.RegisterNode(opts, crypto.GetTestAddress(), "url3", 0) + }) + require.NoError(err) + tt.Commit(ctx) + + num, err = bc.GetBlockNumber(ctx) + require.NoError(err) + + events, err = rr.GetNodeEventsForBlock(ctx, num) + require.NoError(err) + require.Len(events, 3) + + added, ok := events[0].(*contracts.NodeRegistryV1NodeAdded) + require.True(ok) + require.Equal(nodeAddr1, added.NodeAddress) + require.Equal(nodeUrl1, added.Url) + require.Equal(uint8(2), added.Status) + + // + // GetNode + // + node, err := rr.NodeRegistry.GetNode(&bind.CallOpts{BlockNumber: num.AsBigInt(), Context: ctx}, nodeAddr1) + require.NoError(err) + require.Equal(nodeAddr1, node.NodeAddress) + require.Equal(nodeUrl1, node.Url) + require.Equal(uint8(2), node.Status) + require.Equal(owner.Wallet.Address, node.Operator) + + // + // Test UpdateNodeUrl + // + _, err = owner.TxPool.Submit(ctx, "UpdateNodeUrl", func(opts *bind.TransactOpts) (*types.Transaction, error) { + return tt.NodeRegistry.UpdateNodeUrl(opts, nodeAddr1, nodeUrl2) + }) + require.NoError(err) + + tt.Commit(ctx) + + num, err = bc.GetBlockNumber(ctx) + require.NoError(err) + + events, err = rr.GetNodeEventsForBlock(ctx, num) + require.NoError(err) + require.Len(events, 1) + + urlUpdated, ok := events[0].(*contracts.NodeRegistryV1NodeUrlUpdated) + require.True(ok) + require.Equal(nodeUrl2, urlUpdated.Url) + require.Equal(nodeAddr1, urlUpdated.NodeAddress) + + // + // Test UpdateNodeStatus to Departing + // + _, err = owner.TxPool.Submit(ctx, "UpdateNodeStatus", func(opts *bind.TransactOpts) (*types.Transaction, error) { + return tt.NodeRegistry.UpdateNodeStatus(opts, nodeAddr1, 4) + }) + require.NoError(err) + + tt.Commit(ctx) + + num, err = bc.GetBlockNumber(ctx) + require.NoError(err) + + events, err = rr.GetNodeEventsForBlock(ctx, num) + require.NoError(err) + require.Len(events, 1) + + statusUpdated, ok := events[0].(*contracts.NodeRegistryV1NodeStatusUpdated) + require.True(ok) + require.Equal(uint8(4), statusUpdated.Status) + require.Equal(nodeAddr1, statusUpdated.NodeAddress) + + // + // Test UpdateNodeStatus to Deleted + // + _, err = owner.TxPool.Submit(ctx, "UpdateNodeStatus", func(opts *bind.TransactOpts) (*types.Transaction, error) { + return tt.NodeRegistry.UpdateNodeStatus(opts, nodeAddr1, 5) + }) + require.NoError(err) + + tt.Commit(ctx) + + num, err = bc.GetBlockNumber(ctx) + require.NoError(err) + + events, err = rr.GetNodeEventsForBlock(ctx, num) + require.NoError(err) + require.Len(events, 1) + + statusUpdated, ok = events[0].(*contracts.NodeRegistryV1NodeStatusUpdated) + require.True(ok) + require.Equal(uint8(5), statusUpdated.Status) + require.Equal(nodeAddr1, statusUpdated.NodeAddress) + + // + // Test RemoveNode + // + _, err = owner.TxPool.Submit(ctx, "RemoveNode", func(opts *bind.TransactOpts) (*types.Transaction, error) { + return tt.NodeRegistry.RemoveNode(opts, nodeAddr1) + }) + require.NoError(err) + + tt.Commit(ctx) + + num, err = bc.GetBlockNumber(ctx) + require.NoError(err) + + events, err = rr.GetNodeEventsForBlock(ctx, num) + require.NoError(err) + require.Len(events, 1) + + removed, ok := events[0].(*contracts.NodeRegistryV1NodeRemoved) + require.True(ok) + require.Equal(nodeAddr1, removed.NodeAddress) + + // + // GetNode + // + node, err = rr.NodeRegistry.GetNode(&bind.CallOpts{BlockNumber: num.AsBigInt(), Context: ctx}, nodeAddr1) + require.Error(err) + e := AsRiverError(err) + require.Equal(Err_UNKNOWN_NODE, e.Code, "Error: %v", e) +} + +func TestStreamEvents(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + require := require.New(t) + + tc, err := crypto.NewBlockchainTestContext(ctx, 2, true) + require.NoError(err) + defer tc.Close() + + owner := tc.DeployerBlockchain + tc.Commit(ctx) + + bc1 := tc.GetBlockchain(ctx, 0) + defer bc1.Close() + bc2 := tc.GetBlockchain(ctx, 1) + defer bc2.Close() + + nodeAddr1 := bc1.Wallet.Address + nodeUrl1 := "http://node1.node" + nodeAddr2 := bc2.Wallet.Address + nodeUrl2 := "http://node2.node" + + tx1, err := owner.TxPool.Submit(ctx, "RegisterNode", func(opts *bind.TransactOpts) (*types.Transaction, error) { + return tc.NodeRegistry.RegisterNode(opts, nodeAddr1, nodeUrl1, 2) + }) + require.NoError(err) + + tx2, err := owner.TxPool.Submit(ctx, "RegisterNode", func(opts *bind.TransactOpts) (*types.Transaction, error) { + return tc.NodeRegistry.RegisterNode(opts, nodeAddr2, nodeUrl2, 2) + }) + require.NoError(err) + + tc.Commit(ctx) + + receipt1 := <-tx1.Wait() + require.Equal(crypto.TransactionResultSuccess, receipt1.Status) + receipt2 := <-tx2.Wait() + require.Equal(crypto.TransactionResultSuccess, receipt2.Status) + + rr1, err := NewRiverRegistryContract(ctx, bc1, &config.ContractConfig{Address: tc.RiverRegistryAddress}) + require.NoError(err) + + allocatedC := make(chan *contracts.StreamRegistryV1StreamAllocated, 10) + lastMBC := make(chan *contracts.StreamRegistryV1StreamLastMiniblockUpdated, 10) + placementC := make(chan *contracts.StreamRegistryV1StreamPlacementUpdated, 10) + + err = rr1.OnStreamEvent( + ctx, + bc1.InitialBlockNum+1, + func(ctx context.Context, event *contracts.StreamRegistryV1StreamAllocated) { + allocatedC <- event + }, + func(ctx context.Context, event *contracts.StreamRegistryV1StreamLastMiniblockUpdated) { + lastMBC <- event + }, + func(ctx context.Context, event *contracts.StreamRegistryV1StreamPlacementUpdated) { + placementC <- event + }, + ) + require.NoError(err) + + // Allocate stream + streamId := testutils.StreamIdFromBytes([]byte{0xa1, 0x02, 0x03}) + addrs := []common.Address{nodeAddr1} + genesisHash := common.HexToHash("0x123") + genesisMiniblock := []byte("genesis") + err = rr1.AllocateStream(ctx, streamId, addrs, genesisHash, genesisMiniblock) + require.NoError(err) + + allocated := <-allocatedC + require.NotNil(allocated) + require.Equal(streamId, StreamId(allocated.StreamId)) + require.Equal(addrs, allocated.Nodes) + require.Equal(genesisHash, common.Hash(allocated.GenesisMiniblockHash)) + require.Equal(genesisMiniblock, allocated.GenesisMiniblock) + require.Len(lastMBC, 0) + require.Len(placementC, 0) + + // Update stream placement + tx, err := owner.TxPool.Submit(ctx, "UpdateStreamPlacement", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + return tc.StreamRegistry.PlaceStreamOnNode(opts, streamId, nodeAddr2) + }, + ) + require.NoError(err) + tc.Commit(ctx) + receipt := <-tx.Wait() + require.Equal(crypto.TransactionResultSuccess, receipt.Status) + + placement := <-placementC + require.NotNil(placement) + require.Equal(streamId, StreamId(placement.StreamId)) + require.Equal(nodeAddr2, placement.NodeAddress) + require.True(placement.IsAdded) + require.Len(allocatedC, 0) + require.Len(lastMBC, 0) + + // Update last miniblock + newMBHash := common.HexToHash("0x456") + err = rr1.SetStreamLastMiniblock( + ctx, + streamId, + genesisHash, + newMBHash, + 1, + false, + ) + require.NoError(err) + + lastMB := <-lastMBC + require.NotNil(lastMB) + require.Equal(streamId, StreamId(lastMB.StreamId)) + require.Equal(newMBHash, common.Hash(lastMB.LastMiniblockHash)) + require.Equal(uint64(1), lastMB.LastMiniblockNum) + require.False(lastMB.IsSealed) + require.Len(allocatedC, 0) + require.Len(placementC, 0) + + newMBHash2 := common.HexToHash("0x789") + succeeded, failed, err := rr1.SetStreamLastMiniblockBatch( + ctx, + []contracts.SetMiniblock{{ + StreamId: streamId, + PrevMiniBlockHash: newMBHash, + LastMiniblockHash: newMBHash2, + LastMiniblockNum: 2, + IsSealed: false, + }}, + ) + require.NoError(err) + require.Len(succeeded, 1) + require.Empty(failed) + + lastMB = <-lastMBC + require.NotNil(lastMB) + require.Equal(streamId, StreamId(lastMB.StreamId)) + require.Equal(newMBHash2, common.Hash(lastMB.LastMiniblockHash)) + require.Equal(uint64(2), lastMB.LastMiniblockNum) + require.False(lastMB.IsSealed) + require.Len(allocatedC, 0) + require.Len(placementC, 0) +} diff --git a/core/node/rpc/add_event.go b/core/node/rpc/add_event.go new file mode 100644 index 000000000..5ad181436 --- /dev/null +++ b/core/node/rpc/add_event.go @@ -0,0 +1,128 @@ +package rpc + +import ( + "context" + "time" + + "connectrpc.com/connect" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/dlog" + . "github.com/river-build/river/core/node/events" + "github.com/river-build/river/core/node/infra" + . "github.com/river-build/river/core/node/nodes" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/rules" + . "github.com/river-build/river/core/node/shared" +) + +var addEventRequests = infra.NewSuccessMetrics("add_event_requests", serviceRequests) + +func (s *Service) localAddEvent( + ctx context.Context, + req *connect.Request[AddEventRequest], + nodes StreamNodes, +) (*connect.Response[AddEventResponse], error) { + log := dlog.FromCtx(ctx) + + streamId, err := StreamIdFromBytes(req.Msg.StreamId) + if err != nil { + addEventRequests.FailInc() + return nil, AsRiverError(err).Func("localAddEvent") + } + + parsedEvent, err := ParseEvent(req.Msg.Event) + if err != nil { + addEventRequests.FailInc() + return nil, AsRiverError(err).Func("localAddEvent") + } + + log.Debug("localAddEvent", "parsedEvent", parsedEvent) + + err = s.addParsedEvent(ctx, streamId, parsedEvent, nodes) + if err == nil { + addEventRequests.PassInc() + return connect.NewResponse(&AddEventResponse{}), nil + } else { + addEventRequests.FailInc() + return nil, AsRiverError(err).Func("localAddEvent") + } +} + +func (s *Service) addParsedEvent( + ctx context.Context, + streamId StreamId, + parsedEvent *ParsedEvent, + nodes StreamNodes, +) error { + localStream, streamView, err := s.cache.GetStream(ctx, streamId) + if err != nil { + return err + } + + canAddEvent, chainAuthArgs, requiredParentEvent, err := rules.CanAddEvent( + ctx, + &s.config.Stream, + s.nodeRegistry.GetValidNodeAddresses(), + time.Now(), + parsedEvent, + streamView, + ) + + if !canAddEvent || err != nil { + return err + } + + if chainAuthArgs != nil { + err := s.chainAuth.IsEntitled(ctx, chainAuthArgs) + if err != nil { + return err + } + } + + if requiredParentEvent != nil { + err := s.addEventPayload(ctx, requiredParentEvent.StreamId, requiredParentEvent.Payload) + if err != nil { + return err + } + } + + stream := &replicatedStream{ + streamId: streamId.String(), + localStream: localStream, + nodes: nodes, + service: s, + } + + err = stream.AddEvent(ctx, parsedEvent) + if err != nil { + return err + } + + return nil +} + +func (s *Service) addEventPayload(ctx context.Context, streamId StreamId, payload IsStreamEvent_Payload) error { + hashRequest := &GetLastMiniblockHashRequest{ + StreamId: streamId[:], + } + hashResponse, err := s.GetLastMiniblockHash(ctx, connect.NewRequest(hashRequest)) + if err != nil { + return err + } + envelope, err := MakeEnvelopeWithPayload(s.wallet, payload, hashResponse.Msg.Hash) + if err != nil { + return err + } + + req := &AddEventRequest{ + StreamId: streamId[:], + Event: envelope, + } + + _, err = s.AddEvent(ctx, connect.NewRequest(req)) + if err != nil { + return err + } + return nil +} diff --git a/core/node/rpc/archive.go b/core/node/rpc/archive.go new file mode 100644 index 000000000..5d17707e0 --- /dev/null +++ b/core/node/rpc/archive.go @@ -0,0 +1,143 @@ +package rpc + +import ( + "context" + "net" + "os" + "os/signal" + "strconv" + "syscall" + "time" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/dlog" + . "github.com/river-build/river/core/node/protocol" +) + +func (s *Service) startArchiveMode(once bool) error { + var err error + s.startTime = time.Now() + + s.initInstance(ServerModeArchive) + + if s.config.Archive.ArchiveId == "" { + return RiverError(Err_BAD_CONFIG, "ArchiveId must be set").LogError(s.defaultLogger) + } + + err = s.initRiverChain() + if err != nil { + return AsRiverError(err).Message("Failed to init river chain").LogError(s.defaultLogger) + } + + err = s.prepareStore() + if err != nil { + return AsRiverError(err).Message("Failed to prepare store").LogError(s.defaultLogger) + } + + err = s.runHttpServer() + if err != nil { + return AsRiverError(err).Message("Failed to run http server").LogError(s.defaultLogger) + } + + err = s.initStore() + if err != nil { + return AsRiverError(err).Message("Failed to init store").LogError(s.defaultLogger) + } + + err = s.initArchiver(once) + if err != nil { + return AsRiverError(err).Message("Failed to init archiver").LogError(s.defaultLogger) + } + + go s.riverChain.ChainMonitor.RunWithBlockPeriod( + s.serverCtx, + s.riverChain.Client, + s.riverChain.InitialBlockNum, + time.Duration(s.riverChain.Config.BlockTimeMs)*time.Millisecond, + ) + + s.registerDebugHandlers() + + s.SetStatus("OK") + + // Retrieve the TCP address of the listener + tcpAddr := s.listener.Addr().(*net.TCPAddr) + + // Get the port as an integer + port := tcpAddr.Port + // convert the integer to a string + url := "localhost:" + strconv.Itoa(port) + "/debug/multi" + if s.config.UseHttps { + url = "https://" + url + } else { + url = "http://" + url + } + s.defaultLogger.Info("Server started", "port", port, "https", s.config.UseHttps, "url", url) + return nil +} + +func (s *Service) initArchiver(once bool) error { + s.Archiver = NewArchiver(&s.config.Archive, s.registryContract, s.nodeRegistry, s.storage) + go s.Archiver.Start(s.serverCtx, once, s.exitSignal) + return nil +} + +func StartServerInArchiveMode( + ctx context.Context, + cfg *config.Config, + riverChain *crypto.Blockchain, + listener net.Listener, + once bool, +) (*Service, error) { + streamService := &Service{ + serverCtx: ctx, + config: cfg, + riverChain: riverChain, + listener: listener, + exitSignal: make(chan error, 1), + } + + err := streamService.startArchiveMode(once) + if err != nil { + streamService.Close() + return nil, err + } + + return streamService, nil +} + +func RunArchive(ctx context.Context, cfg *config.Config, once bool) error { + log := dlog.FromCtx(ctx) + + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + service, err := StartServerInArchiveMode(ctx, cfg, nil, nil, once) + if err != nil { + log.Error("Failed to start server", "error", err) + return err + } + defer service.Close() + + osSignal := make(chan os.Signal, 1) + signal.Notify(osSignal, syscall.SIGINT, syscall.SIGTERM) + go func() { + sig := <-osSignal + log.Info("Got OS signal", "signal", sig.String()) + service.exitSignal <- nil + }() + + if once { + go func() { + service.Archiver.WaitForStart() + service.Archiver.WaitForTasks() + service.exitSignal <- nil + }() + } + + err = <-service.exitSignal + log.Info("Archiver stats", "stats", service.Archiver.GetStats()) + return err +} diff --git a/core/node/rpc/archiver.go b/core/node/rpc/archiver.go new file mode 100644 index 000000000..cf99c6f80 --- /dev/null +++ b/core/node/rpc/archiver.go @@ -0,0 +1,395 @@ +package rpc + +import ( + "context" + "math/big" + "sync" + "sync/atomic" + "time" + + "connectrpc.com/connect" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/contracts" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/events" + "github.com/river-build/river/core/node/nodes" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/registries" + . "github.com/river-build/river/core/node/shared" + "github.com/river-build/river/core/node/storage" +) + +type ArchiveStream struct { + streamId StreamId + nodes nodes.StreamNodes + numBlocksInContract atomic.Int64 + numBlocksInDb atomic.Int64 // -1 means not loaded + + // Mutex is used so only one archive operation is performed at a time. + mu sync.Mutex +} + +func NewArchiveStream(streamId StreamId, nn *[]common.Address, lastKnownMiniblock uint64) *ArchiveStream { + stream := &ArchiveStream{ + streamId: streamId, + nodes: nodes.NewStreamNodes(*nn, common.Address{}), + } + stream.numBlocksInContract.Store(int64(lastKnownMiniblock + 1)) + stream.numBlocksInDb.Store(-1) + + return stream +} + +type Archiver struct { + config *config.ArchiveConfig + contract *registries.RiverRegistryContract + nodeRegistry nodes.NodeRegistry + storage storage.StreamStorage + + tasks chan StreamId + workersWG sync.WaitGroup + + // tasksWG is used in single run mode: it archives everything there is to archive and exits + tasksWG *sync.WaitGroup + + streams sync.Map + + // set to done when archiver has started + startedWG sync.WaitGroup + + streamsExamined atomic.Uint64 + streamsCreated atomic.Uint64 + streamsUpToDate atomic.Uint64 + successOpsCount atomic.Uint64 + failedOpsCount atomic.Uint64 + miniblocksProcessed atomic.Uint64 +} + +type ArchiverStats struct { + StreamsExamined uint64 + StreamsCreated uint64 + StreamsUpToDate uint64 + SuccessOpsCount uint64 + FailedOpsCount uint64 + MiniblocksProcessed uint64 +} + +func NewArchiver( + config *config.ArchiveConfig, + contract *registries.RiverRegistryContract, + nodeRegistry nodes.NodeRegistry, + storage storage.StreamStorage, +) *Archiver { + a := &Archiver{ + config: config, + contract: contract, + nodeRegistry: nodeRegistry, + storage: storage, + tasks: make(chan StreamId, 100000), // TODO: setting + } + a.startedWG.Add(1) + return a +} + +func (a *Archiver) addNewStream(ctx context.Context, streamId StreamId, nn *[]common.Address, lastKnownMiniblock uint64) { + _, loaded := a.streams.Load(streamId) + if loaded { + // TODO: Double notificaion, shouldn't happen. + dlog.FromCtx(ctx).Error("Stream already exists in archiver map", "streamId", streamId, "lastKnownMiniblock", lastKnownMiniblock) + return + } + + a.streams.Store(streamId, NewArchiveStream(streamId, nn, lastKnownMiniblock)) + + a.tasks <- streamId + + a.streamsExamined.Add(1) +} + +func (a *Archiver) ArchiveStream(ctx context.Context, stream *ArchiveStream) error { + log := dlog.FromCtx(ctx) + + if !stream.mu.TryLock() { + // Reschedule with delay. + streamId := stream.streamId + time.AfterFunc(time.Second, func() { + a.tasks <- streamId + }) + return nil + } + defer stream.mu.Unlock() + + mbsInDb := stream.numBlocksInDb.Load() + + // Check if stream info was loaded from db. + if mbsInDb <= -1 { + maxBlockNum, err := a.storage.GetMaxArchivedMiniblockNumber(ctx, stream.streamId) + if err != nil && AsRiverError(err).Code == Err_NOT_FOUND { + err = a.storage.CreateStreamArchiveStorage(ctx, stream.streamId) + if err != nil { + return err + } + a.streamsCreated.Add(1) + + mbsInDb = 0 + stream.numBlocksInDb.Store(mbsInDb) + } else if err != nil { + return err + } else { + mbsInDb = maxBlockNum + 1 + stream.numBlocksInDb.Store(mbsInDb) + } + } + + + mbsInContract := stream.numBlocksInContract.Load() + if mbsInDb >= mbsInContract { + return nil + } + + log.Debug( + "Archiving stream", + "streamId", + stream.streamId, + "numBlocksInDb", + mbsInDb, + "numBlocksInContract", + mbsInContract, + ) + + if mbsInDb >= mbsInContract { + a.streamsUpToDate.Add(1) + return nil + } + + nodeAddr := stream.nodes.GetStickyPeer() + + stub, err := a.nodeRegistry.GetStreamServiceClientForAddress(nodeAddr) + if err != nil { + return err + } + + for mbsInDb < mbsInContract { + toBlock := min(mbsInDb+int64(a.config.GetReadMiniblocksSize()), mbsInContract) + resp, err := stub.GetMiniblocks( + ctx, + connect.NewRequest(&GetMiniblocksRequest{ + StreamId: stream.streamId[:], + FromInclusive: mbsInDb, + ToExclusive: toBlock, + }), + ) + if err != nil { + stream.nodes.AdvanceStickyPeer(nodeAddr) + return err + } + + msg := resp.Msg + if len(msg.Miniblocks) == 0 { + log.Info( + "ArchiveStream: GetMiniblocks returned empty miniblocks, remote storage is not up-to-date with contract yet", + "streamId", stream.streamId, + "fromInclusive", mbsInDb, + "toExclusive", toBlock, + ) + // Reschedule with delay. + streamId := stream.streamId + time.AfterFunc(time.Second, func() { + a.tasks <- streamId + }) + return nil + } + + // Validate miniblocks are sequential. + // TODO: validate miniblock signatures. + var serialized [][]byte + for i, mb := range msg.Miniblocks { + // Parse header + info, err := events.NewMiniblockInfoFromProto( + mb, + events.NewMiniblockInfoFromProtoOpts{ + ExpectedBlockNumber: int64(i) + mbsInDb, + DontParseEvents: true, + }, + ) + if err != nil { + return err + } + bb, err := info.ToBytes() + if err != nil { + return err + } + serialized = append(serialized, bb) + } + + log.Debug("Writing miniblocks to storage", "streamId", stream.streamId, "numBlocks", len(serialized)) + + err = a.storage.WriteArchiveMiniblocks(ctx, stream.streamId, mbsInDb, serialized) + if err != nil { + return err + } + mbsInDb += int64(len(serialized)) + stream.numBlocksInDb.Store(mbsInDb) + + a.miniblocksProcessed.Add(uint64(len(serialized))) + } + return nil +} + +func (a *Archiver) Start(ctx context.Context, once bool, exitSignal chan<- error) { + defer a.startedWG.Done() + err := a.startImpl(ctx, once) + if err != nil { + exitSignal <- err + } +} + +func (a *Archiver) startImpl(ctx context.Context, once bool) error { + if once { + a.tasksWG = &sync.WaitGroup{} + } + + // TODO: setting + const numWorkers = 20 + for i := 0; i < numWorkers; i++ { + a.workersWG.Add(1) + go a.worker(ctx) + } + + // TODO: setting + const pageSize = int64(5000) + + blockNum := a.contract.Blockchain.InitialBlockNum + + callOpts := &bind.CallOpts{ + Context: ctx, + BlockNumber: blockNum.AsBigInt(), + } + + lastPage := false + var err error + var streams []contracts.StreamWithId + for i := int64(0); !lastPage; i += pageSize { + streams, lastPage, err = a.contract.StreamRegistry.GetPaginatedStreams( + callOpts, + big.NewInt(i), + big.NewInt(i+pageSize), + ) + if err != nil { + return WrapRiverError( + Err_CANNOT_CALL_CONTRACT, + err, + ).Func("archiver.start"). + Message("StreamRegistry.GetPaginatedStreamsGetPaginatedStreams smart contract call failed") + } + for _, stream := range streams { + if stream.Id == registries.ZeroBytes32 { + continue + } + if a.tasksWG != nil { + a.tasksWG.Add(1) + } + a.addNewStream(ctx, stream.Id, &stream.Stream.Nodes, stream.Stream.LastMiniblockNum) + } + } + + if !once { + err = a.contract.OnStreamEvent( + ctx, + blockNum+1, + a.onStreamAllocated, + a.onStreamLastMiniblockUpdated, + a.onStreamPlacementUpdated, + ) + if err != nil { + return err + } + } + + return nil +} + +func (a *Archiver) onStreamAllocated(ctx context.Context, event *contracts.StreamRegistryV1StreamAllocated) { + id := StreamId(event.StreamId) + a.addNewStream(ctx, id, &event.Nodes, 0) + a.tasks <- id +} + +func (a *Archiver) onStreamPlacementUpdated(ctx context.Context, event *contracts.StreamRegistryV1StreamPlacementUpdated) { + id := StreamId(event.StreamId) + record, loaded := a.streams.Load(id) + if !loaded { + dlog.FromCtx(ctx).Error("onStreamPlacementUpdated: Stream not found in map", "streamId", id) + return + } + stream := record.(*ArchiveStream) + _ = stream.nodes.Update(event.NodeAddress, event.IsAdded) +} + +func (a *Archiver) onStreamLastMiniblockUpdated(ctx context.Context, event *contracts.StreamRegistryV1StreamLastMiniblockUpdated) { + id := StreamId(event.StreamId) + record, loaded := a.streams.Load(id) + if !loaded { + dlog.FromCtx(ctx).Error("onStreamLastMiniblockUpdated: Stream not found in map", "streamId", id) + return + } + stream := record.(*ArchiveStream) + stream.numBlocksInContract.Store(int64(event.LastMiniblockNum + 1)) + a.tasks <- id +} + +func (a *Archiver) WaitForWorkers() { + a.workersWG.Wait() +} + +// Waiting for tasks is only possible if archiver is started in "once" mode. +func (a *Archiver) WaitForTasks() { + a.tasksWG.Wait() +} + +func (a *Archiver) WaitForStart() { + a.startedWG.Wait() +} + +func (a *Archiver) GetStats() *ArchiverStats { + return &ArchiverStats{ + StreamsExamined: a.streamsExamined.Load(), + StreamsCreated: a.streamsCreated.Load(), + StreamsUpToDate: a.streamsUpToDate.Load(), + SuccessOpsCount: a.successOpsCount.Load(), + FailedOpsCount: a.failedOpsCount.Load(), + MiniblocksProcessed: a.miniblocksProcessed.Load(), + } +} + +func (a *Archiver) worker(ctx context.Context) { + log := dlog.FromCtx(ctx) + + defer a.workersWG.Done() + + for { + select { + case <-ctx.Done(): + return + case streamId := <-a.tasks: + record, loaded := a.streams.Load(streamId) + if !loaded { + log.Error("archiver.worker: Stream not found in map", "streamId", streamId) + continue + } + err := a.ArchiveStream(ctx, record.(*ArchiveStream)) + if err != nil { + log.Error("archiver.worker: Failed to archive stream", "error", err, "streamId", streamId) + a.failedOpsCount.Add(1) + } else { + a.successOpsCount.Add(1) + } + if a.tasksWG != nil { + a.tasksWG.Done() + } + } + } +} diff --git a/core/node/rpc/archiver_test.go b/core/node/rpc/archiver_test.go new file mode 100644 index 000000000..246e861a7 --- /dev/null +++ b/core/node/rpc/archiver_test.go @@ -0,0 +1,456 @@ +package rpc_test + +import ( + "context" + "net" + "sync" + "testing" + "time" + + "connectrpc.com/connect" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/events" + "github.com/river-build/river/core/node/nodes" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/protocol/protocolconnect" + "github.com/river-build/river/core/node/registries" + "github.com/river-build/river/core/node/rpc" + . "github.com/river-build/river/core/node/shared" + "github.com/river-build/river/core/node/storage" + "github.com/river-build/river/core/node/testutils/dbtestutils" + "github.com/stretchr/testify/assert" +) + +func fillUserSettingsStreamWithData( + ctx context.Context, + streamId StreamId, + wallet *crypto.Wallet, + client protocolconnect.StreamServiceClient, + numMBs int, + numEventsPerMB int, + optionalHashBytes []byte, +) ([]byte, int64, error) { + var err error + lastKnownMB := int64(0) + for i := 0; i < numMBs; i++ { + for j := 0; j < numEventsPerMB; j++ { + err = addUserBlockedFillerEvent(ctx, wallet, client, streamId, optionalHashBytes) + if err != nil { + return nil, -1, err + } + } + optionalHashBytes, lastKnownMB, err = makeMiniblock(ctx, client, streamId, false, lastKnownMB) + if err != nil { + return nil, -1, err + } + } + return optionalHashBytes, lastKnownMB, nil +} + +func createUserSettingsStreamsWithData( + ctx context.Context, + client protocolconnect.StreamServiceClient, + numStreams int, + numMBs int, + numEventsPerMB int, +) ([]*crypto.Wallet, []StreamId, error) { + wallets := make([]*crypto.Wallet, numStreams) + streamIds := make([]StreamId, numStreams) + errChan := make(chan error, numStreams) + + var wg sync.WaitGroup + wg.Add(numStreams) + + for i := 0; i < numStreams; i++ { + go func(i int) { + defer wg.Done() + wallet, err := crypto.NewWallet(ctx) + if err != nil { + errChan <- err + return + } + wallets[i] = wallet + + streamId, _, _, err := createUserSettingsStream(ctx, wallet, client, &StreamSettings{DisableMiniblockCreation: true}) + if err != nil { + errChan <- err + return + } + streamIds[i] = streamId + + _, _, err = fillUserSettingsStreamWithData(ctx, streamId, wallet, client, numMBs, numEventsPerMB, nil) + if err != nil { + errChan <- err + return + } + }(i) + } + + wg.Wait() + if len(errChan) > 0 { + return nil, nil, <-errChan + } + return wallets, streamIds, nil +} + +func compareStreamMiniblocks( + t *testing.T, + ctx context.Context, + streamId StreamId, + storage storage.StreamStorage, + client protocolconnect.StreamServiceClient, +) error { + maxMB, err := storage.GetMaxArchivedMiniblockNumber(ctx, streamId) + if err != nil { + return err + } + + numResp, err := client.GetLastMiniblockHash(ctx, connect.NewRequest(&GetLastMiniblockHashRequest{ + StreamId: streamId[:], + })) + if err != nil { + return err + } + + if numResp.Msg.MiniblockNum != maxMB { + return RiverError( + Err_INTERNAL, + "Remote mb num is not the same as local", + "streamId", streamId, + "localMB", maxMB, + "remoteMB", numResp.Msg.MiniblockNum, + ) + } + + miniblocks, err := storage.ReadMiniblocks(ctx, streamId, 0, maxMB+1) + if err != nil { + return err + } + + mbResp, err := client.GetMiniblocks(ctx, connect.NewRequest(&GetMiniblocksRequest{ + StreamId: streamId[:], + FromInclusive: 0, + ToExclusive: numResp.Msg.MiniblockNum + 1, + })) + if err != nil { + return err + } + + if len(mbResp.Msg.Miniblocks) != len(miniblocks) { + return RiverError( + Err_INTERNAL, + "Read different num of mbs remotly and locally", + "streamId", streamId, + "localMB len", len(miniblocks), + "remoteMB len", len(mbResp.Msg.Miniblocks), + ) + } + + for i, mb := range miniblocks { + info, err := events.NewMiniblockInfoFromBytesWithOpts( + mb, + events.NewMiniblockInfoFromProtoOpts{ + ExpectedBlockNumber: int64(i), + DontParseEvents: true, + }, + ) + if err != nil { + return err + } + if !assert.EqualExportedValues(t, info.Proto, mbResp.Msg.Miniblocks[i]) { + return RiverError( + Err_INTERNAL, + "Miniblocks are not the same", + "streamId", streamId, + "mbNum", i, + ) + } + } + return nil +} + +func compareStreamsMiniblocks( + t *testing.T, + ctx context.Context, + streamId []StreamId, + storage storage.StreamStorage, + client protocolconnect.StreamServiceClient, +) error { + errs := make(chan error, len(streamId)) + var wg sync.WaitGroup + for _, id := range streamId { + wg.Add(1) + go func(streamId StreamId) { + defer wg.Done() + err := compareStreamMiniblocks(t, ctx, streamId, storage, client) + if err != nil { + errs <- err + } + }(id) + } + wg.Wait() + if len(errs) > 0 { + return <-errs + } + return nil +} + +func TestArchiveOneStream(t *testing.T) { + tester := newServiceTesterAndStart(t, 1) + ctx := tester.ctx + require := tester.require + + // Create stream + client := tester.testClient(0) + wallet, err := crypto.NewWallet(ctx) + require.NoError(err) + streamId, _, _, err := createUserSettingsStream(ctx, wallet, client, &StreamSettings{DisableMiniblockCreation: true}) + require.NoError(err) + + archiveCfg := tester.getConfig() + archiveCfg.Archive.ArchiveId = "arch" + GenShortNanoid() + archiveCfg.Archive.ReadMiniblcocksSize = 3 + + chainMonitor := tester.btc.ChainMonitor + bc := tester.btc.NewWalletAndBlockchain(ctx) + + registryContract, err := registries.NewRiverRegistryContract(ctx, bc, &archiveCfg.RegistryContract) + require.NoError(err) + + var nodeRegistry nodes.NodeRegistry + nodeRegistry, err = nodes.LoadNodeRegistry( + ctx, + registryContract, + common.Address{}, + bc.InitialBlockNum, + chainMonitor, + ) + require.NoError(err) + + dbCfg, schema, schemaDeleter, err := dbtestutils.StartDB(ctx) + require.NoError(err) + defer schemaDeleter() + + pool, err := storage.CreateAndValidatePgxPool(ctx, dbCfg, schema) + require.NoError(err) + + streamStorage, err := storage.NewPostgresEventStore( + ctx, + pool, + GenShortNanoid(), + make(chan error, 1), + ) + require.NoError(err) + + arch := rpc.NewArchiver(&archiveCfg.Archive, registryContract, nodeRegistry, streamStorage) + + callOpts := &bind.CallOpts{ + Context: ctx, + } + + streamRecord, err := registryContract.StreamRegistry.GetStream(callOpts, streamId) + require.NoError(err) + require.Zero(streamRecord.LastMiniblockNum) // Only genesis miniblock is created + + err = arch.ArchiveStream( + ctx, + rpc.NewArchiveStream(streamId, &streamRecord.Nodes, streamRecord.LastMiniblockNum), + ) + require.NoError(err) + + num, err := streamStorage.GetMaxArchivedMiniblockNumber(ctx, streamId) + require.NoError(err) + require.Zero(num) // Only genesis miniblock is created + + // Add event to the stream, create miniblock, and archive it + err = addUserBlockedFillerEvent(ctx, wallet, client, streamId, streamRecord.LastMiniblockHash[:]) + require.NoError(err) + + hashBytes, _, err := makeMiniblock(ctx, client, streamId, false, 0) + require.NoError(err) + + streamRecord, err = registryContract.StreamRegistry.GetStream(callOpts, streamId) + require.NoError(err) + require.Equal(uint64(1), streamRecord.LastMiniblockNum) + + err = arch.ArchiveStream( + ctx, + rpc.NewArchiveStream(streamId, &streamRecord.Nodes, streamRecord.LastMiniblockNum), + ) + require.NoError(err) + + num, err = streamStorage.GetMaxArchivedMiniblockNumber(ctx, streamId) + require.NoError(err) + require.Equal(int64(1), num) + + // Test pagination: create at least 10 miniblocks. + _, _, err = fillUserSettingsStreamWithData(ctx, streamId, wallet, client, 10, 5, hashBytes) + require.NoError(err) + + streamRecord, err = registryContract.StreamRegistry.GetStream(callOpts, streamId) + require.NoError(err) + require.GreaterOrEqual(streamRecord.LastMiniblockNum, uint64(10)) + + err = arch.ArchiveStream( + ctx, + rpc.NewArchiveStream(streamId, &streamRecord.Nodes, streamRecord.LastMiniblockNum), + ) + require.NoError(err) + + num, err = streamStorage.GetMaxArchivedMiniblockNumber(ctx, streamId) + require.NoError(err) + require.Equal(int64(streamRecord.LastMiniblockNum), num) + + require.NoError(compareStreamMiniblocks(t, ctx, streamId, streamStorage, client)) +} + +func TestArchive100Streams(t *testing.T) { + tester := newServiceTesterAndStart(t, 10) + ctx := tester.ctx + require := tester.require + + // Create 100 streams + streamIds := testCreate100Streams(ctx, require, tester.testClient(0), &StreamSettings{DisableMiniblockCreation: true}) + + archiveCfg := tester.getConfig() + archiveCfg.Archive.ArchiveId = "arch" + GenShortNanoid() + + listener, err := net.Listen("tcp", "localhost:0") + require.NoError(err) + + archiverBC := tester.btc.NewWalletAndBlockchain(ctx) + serverCtx, serverCancel := context.WithCancel(ctx) + arch, err := rpc.StartServerInArchiveMode(serverCtx, archiveCfg, archiverBC, listener, true) + require.NoError(err) + + arch.Archiver.WaitForStart() + require.Len(arch.ExitSignal(), 0) + + arch.Archiver.WaitForTasks() + + require.NoError(compareStreamsMiniblocks(t, ctx, streamIds, arch.Storage(), tester.testClient(3))) + + serverCancel() + arch.Archiver.WaitForWorkers() + + stats := arch.Archiver.GetStats() + require.Equal(uint64(100), stats.StreamsExamined) + require.GreaterOrEqual(stats.SuccessOpsCount, uint64(100)) + require.Zero(stats.FailedOpsCount) +} + +func TestArchive100StreamsWithData(t *testing.T) { + tester := newServiceTesterAndStart(t, 10) + ctx := tester.ctx + require := tester.require + + _, streamIds, err := createUserSettingsStreamsWithData(ctx, tester.testClient(0), 100, 10, 5) + require.NoError(err) + + archiveCfg := tester.getConfig() + archiveCfg.Archive.ArchiveId = "arch" + GenShortNanoid() + archiveCfg.Archive.ReadMiniblcocksSize = 3 + + listener, err := net.Listen("tcp", "localhost:0") + require.NoError(err) + + archiverBC := tester.btc.NewWalletAndBlockchain(ctx) + serverCtx, serverCancel := context.WithCancel(ctx) + arch, err := rpc.StartServerInArchiveMode(serverCtx, archiveCfg, archiverBC, listener, true) + require.NoError(err) + + arch.Archiver.WaitForStart() + require.Len(arch.ExitSignal(), 0) + + arch.Archiver.WaitForTasks() + + require.NoError(compareStreamsMiniblocks(t, ctx, streamIds, arch.Storage(), tester.testClient(5))) + + serverCancel() + arch.Archiver.WaitForWorkers() + + stats := arch.Archiver.GetStats() + require.Equal(uint64(100), stats.StreamsExamined) + require.GreaterOrEqual(stats.SuccessOpsCount, uint64(100)) + require.Zero(stats.FailedOpsCount) +} + +func TestArchiveContinuous(t *testing.T) { + tester := newServiceTesterAndStart(t, 1) + ctx := tester.ctx + require := tester.require + + client := tester.testClient(0) + wallet, err := crypto.NewWallet(ctx) + require.NoError(err) + streamId, _, _, err := createUserSettingsStream(ctx, wallet, client, &StreamSettings{DisableMiniblockCreation: true}) + require.NoError(err) + + archiveCfg := tester.getConfig() + archiveCfg.Archive.ArchiveId = "arch" + GenShortNanoid() + archiveCfg.Archive.ReadMiniblcocksSize = 3 + + listener, err := net.Listen("tcp", "localhost:0") + require.NoError(err) + + archiverBC := tester.btc.NewWalletAndBlockchain(ctx) + serverCtx, serverCancel := context.WithCancel(ctx) + arch, err := rpc.StartServerInArchiveMode(serverCtx, archiveCfg, archiverBC, listener, false) + require.NoError(err) + + arch.Archiver.WaitForStart() + require.Len(arch.ExitSignal(), 0) + + require.EventuallyWithT( + func(c *assert.CollectT) { + num, err := arch.Storage().GetMaxArchivedMiniblockNumber(ctx, streamId) + assert.NoError(c, err) + assert.Zero(c, num) + }, + 5*time.Second, + 10*time.Millisecond, + ) + + _, lastMBNum, err := fillUserSettingsStreamWithData(ctx, streamId, wallet, client, 10, 5, nil) + require.NoError(err) + + require.EventuallyWithT( + func(c *assert.CollectT) { + num, err := arch.Storage().GetMaxArchivedMiniblockNumber(ctx, streamId) + assert.NoError(c, err) + assert.Equal(c, lastMBNum, num) + }, + 5*time.Second, + 10*time.Millisecond, + ) + + client2 := tester.testClient(0) + wallet2, err := crypto.NewWallet(ctx) + require.NoError(err) + streamId2, _, _, err := createUserSettingsStream(ctx, wallet2, client2, &StreamSettings{DisableMiniblockCreation: true}) + require.NoError(err) + _, lastMBNum2, err := fillUserSettingsStreamWithData(ctx, streamId2, wallet2, client2, 10, 5, nil) + require.NoError(err) + + require.EventuallyWithT( + func(c *assert.CollectT) { + num, err := arch.Storage().GetMaxArchivedMiniblockNumber(ctx, streamId2) + assert.NoError(c, err) + assert.Equal(c, lastMBNum2, num) + }, + 5*time.Second, + 10*time.Millisecond, + ) + + require.NoError(compareStreamsMiniblocks(t, ctx, []StreamId{streamId, streamId2}, arch.Storage(), client)) + + serverCancel() + arch.Archiver.WaitForWorkers() + + stats := arch.Archiver.GetStats() + require.Equal(uint64(2), stats.StreamsExamined) + require.Zero(stats.FailedOpsCount) +} diff --git a/core/node/rpc/create_stream.go b/core/node/rpc/create_stream.go new file mode 100644 index 000000000..f59cf45d1 --- /dev/null +++ b/core/node/rpc/create_stream.go @@ -0,0 +1,216 @@ +package rpc + +import ( + "context" + "sync" + "time" + + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/dlog" + . "github.com/river-build/river/core/node/events" + "github.com/river-build/river/core/node/infra" + . "github.com/river-build/river/core/node/nodes" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/rules" + . "github.com/river-build/river/core/node/shared" + "google.golang.org/protobuf/proto" + + "connectrpc.com/connect" +) + +var createStreamRequests = infra.NewSuccessMetrics("create_stream_requests", serviceRequests) + +func (s *Service) createStreamImpl( + ctx context.Context, + req *connect.Request[CreateStreamRequest], +) (*connect.Response[CreateStreamResponse], error) { + stream, err := s.createStream(ctx, req.Msg) + if err != nil { + createStreamRequests.FailInc() + return nil, AsRiverError(err).Func("createStreamImpl") + } + createStreamRequests.PassInc() + resMsg := &CreateStreamResponse{ + Stream: stream, + } + return connect.NewResponse(resMsg), nil +} + +func (s *Service) createStream(ctx context.Context, req *CreateStreamRequest) (*StreamAndCookie, error) { + log := dlog.FromCtx(ctx) + + streamId, err := StreamIdFromBytes(req.StreamId) + if err != nil { + return nil, RiverError(Err_BAD_STREAM_CREATION_PARAMS, "invalid stream id", "err", err) + } + + if len(req.Events) == 0 { + return nil, RiverError(Err_BAD_STREAM_CREATION_PARAMS, "no events") + } + + parsedEvents, err := ParseEvents(req.Events) + if err != nil { + return nil, err + } + + log.Debug("createStream", "parsedEvents", parsedEvents) + + csRules, err := rules.CanCreateStream(ctx, &s.config.Stream, time.Now(), streamId, parsedEvents) + if err != nil { + return nil, err + } + + // check that the creator satisfies the required memberships reqirements + if csRules.RequiredMemberships != nil { + // load the creator's user stream + _, creatorStreamView, err := s.loadStream(ctx, csRules.CreatorStreamId) + if err != nil { + return nil, RiverError(Err_PERMISSION_DENIED, "failed to load creator stream", "err", err) + } + for _, streamIdBytes := range csRules.RequiredMemberships { + streamId, err := StreamIdFromBytes(streamIdBytes) + if err != nil { + return nil, RiverError(Err_BAD_STREAM_CREATION_PARAMS, "invalid stream id", "err", err) + } + if !creatorStreamView.(UserStreamView).IsMemberOf(streamId) { + return nil, RiverError(Err_PERMISSION_DENIED, "not a member of", "requiredStreamId", streamId) + } + } + } + + // DEPRECATED check that all required users exist in the system + for _, userId := range csRules.RequiredUsers { + addr, err := AddressStrToEthAddress(userId) + if err != nil { + return nil, RiverError(Err_PERMISSION_DENIED, "invalid user id", "requiredUserId", userId) + } + userStreamId := UserStreamIdFromAddr(addr) + _, err = s.streamRegistry.GetStreamInfo(ctx, userStreamId) + if err != nil { + return nil, RiverError(Err_PERMISSION_DENIED, "user does not exist", "requiredUserId", userId) + } + } + + // check that all required users exist in the system + for _, userAddress := range csRules.RequiredUserAddrs { + addr, err := BytesToAddress(userAddress) + if err != nil { + return nil, RiverError(Err_PERMISSION_DENIED, "invalid user id", "requiredUser", userAddress) + } + userStreamId := UserStreamIdFromAddr(addr) + _, err = s.streamRegistry.GetStreamInfo(ctx, userStreamId) + if err != nil { + return nil, RiverError(Err_PERMISSION_DENIED, "user does not exist", "requiredUser", userAddress) + } + } + + // check entitlements + if csRules.ChainAuth != nil { + err := s.chainAuth.IsEntitled(ctx, csRules.ChainAuth) + if err != nil { + return nil, err + } + } + + // create the stream + resp, err := s.createReplicatedStream(ctx, streamId, parsedEvents) + if err != nil && AsRiverError(err).Code != Err_ALREADY_EXISTS { + return nil, err + } + + // add derived events + if csRules.DerivedEvents != nil { + for _, de := range csRules.DerivedEvents { + err := s.addEventPayload(ctx, de.StreamId, de.Payload) + if err != nil { + return nil, RiverError(Err_INTERNAL, "failed to add derived event", "err", err) + } + } + } + + return resp, nil +} + +func (s *Service) createReplicatedStream( + ctx context.Context, + streamId StreamId, + parsedEvents []*ParsedEvent, +) (*StreamAndCookie, error) { + mb, err := MakeGenesisMiniblock(s.wallet, parsedEvents) + if err != nil { + return nil, err + } + + mbBytes, err := proto.Marshal(mb) + if err != nil { + return nil, err + } + + nodesList, err := s.streamRegistry.AllocateStream(ctx, streamId, common.BytesToHash(mb.Header.Hash), mbBytes) + if err != nil { + return nil, err + } + + nodes := NewStreamNodes(nodesList, s.wallet.Address) + sender := newQuorumPool(nodes.NumRemotes()) + + var localSyncCookie *SyncCookie + if nodes.IsLocal() { + sender.GoLocal(func() error { + _, sv, err := s.cache.CreateStream(ctx, streamId) + if err != nil { + return err + } + localSyncCookie = sv.SyncCookie(s.wallet.Address) + return nil + }) + } + + var remoteSyncCookie *SyncCookie + var remoteSyncCookieOnce sync.Once + if nodes.NumRemotes() > 0 { + for _, n := range nodes.GetRemotes() { + sender.GoRemote( + n, + func(node common.Address) error { + stub, err := s.nodeRegistry.GetNodeToNodeClientForAddress(node) + if err != nil { + return err + } + r, err := stub.AllocateStream( + ctx, + connect.NewRequest[AllocateStreamRequest]( + &AllocateStreamRequest{ + StreamId: streamId[:], + Miniblock: mb, + }, + ), + ) + if err != nil { + return err + } + remoteSyncCookieOnce.Do(func() { + remoteSyncCookie = r.Msg.SyncCookie + }) + return nil + }, + ) + } + } + + err = sender.Wait() + if err != nil { + return nil, err + } + + cookie := localSyncCookie + if cookie == nil { + cookie = remoteSyncCookie + } + + return &StreamAndCookie{ + NextSyncCookie: cookie, + Miniblocks: []*Miniblock{mb}, + }, nil +} diff --git a/core/node/rpc/debug.go b/core/node/rpc/debug.go new file mode 100644 index 000000000..eb02b099b --- /dev/null +++ b/core/node/rpc/debug.go @@ -0,0 +1,225 @@ +package rpc + +import ( + "bufio" + "bytes" + "fmt" + "net/http" + "net/http/pprof" + "runtime" + "slices" + "strings" + "time" + + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/dlog" + . "github.com/river-build/river/core/node/events" + "github.com/river-build/river/core/node/rpc/render" +) + +type debugHandler struct { + patterns []string +} + +func (h *debugHandler) HandleFunc(mux httpMux, pattern string, handler func(http.ResponseWriter, *http.Request)) { + h.patterns = append(h.patterns, pattern) + mux.HandleFunc(pattern, handler) +} + +func (h *debugHandler) Handle(mux httpMux, pattern string, handler http.Handler) { + h.patterns = append(h.patterns, pattern) + mux.Handle(pattern, handler) +} + +func (h *debugHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + var ( + ctx = r.Context() + reply = render.AvailableDebugHandlersData{ + Handlers: h.patterns, + } + ) + + output, err := render.Execute(&reply) + if err != nil { + dlog.FromCtx(ctx).Error("unable to read memory stats", "err", err) + http.Error(w, "Internal Server Error", http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "text/html") + w.WriteHeader(http.StatusOK) + _, _ = w.Write(output.Bytes()) +} + +type httpMux interface { + HandleFunc(pattern string, handler func(http.ResponseWriter, *http.Request)) + Handle(pattern string, handler http.Handler) +} + +func (s *Service) registerDebugHandlers() { + mux := s.mux + handler := debugHandler{} + mux.HandleFunc("/debug", handler.ServeHTTP) + + handler.Handle(mux, "/debug/cache", &cacheHandler{cache: s.cache}) + handler.Handle(mux, "/debug/txpool", &txpoolHandler{riverTxPool: s.riverChain.TxPool}) + handler.HandleFunc(mux, "/debug/memory", MemoryHandler) + handler.HandleFunc(mux, "/debug/multi", s.handleDebugMulti) + handler.HandleFunc(mux, "/debug/multi/json", s.handleDebugMultiJson) + handler.HandleFunc(mux, "/debug/pprof/", pprof.Index) + mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline) + mux.HandleFunc("/debug/pprof/profile", pprof.Profile) + mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) + mux.HandleFunc("/debug/pprof/trace", pprof.Trace) + handler.HandleFunc(mux, "/debug/stacks", HandleStacksHandler) +} + +func HandleStacksHandler(w http.ResponseWriter, r *http.Request) { + var ( + ctx = r.Context() + buf = make([]byte, 1024*1024) + stackSize = runtime.Stack(buf, true) + traceScanner = bufio.NewScanner(bytes.NewReader((buf[:stackSize]))) + reply render.GoRoutineData + ) + + traceScanner.Split(bufio.ScanLines) + + for traceScanner.Scan() { + stack, err := readGoRoutineStackFrame(traceScanner) + if err != nil { + dlog.FromCtx(ctx).Error("unable to read stack frame", "err", err) + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + reply.Stacks = append(reply.Stacks, stack) + } + + output, err := render.Execute(&reply) + if err != nil { + dlog.FromCtx(ctx).Error("unable to render stack data", "err", err) + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "text/html") + w.WriteHeader(http.StatusOK) + _, _ = w.Write(output.Bytes()) +} + +type txpoolHandler struct { + riverTxPool crypto.TransactionPool +} + +func (h *txpoolHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + var ( + ctx = r.Context() + reply = render.TransactionPoolData{} + ) + + reply.River.ProcessedTransactions = h.riverTxPool.ProcessedTransactionsCount() + reply.River.PendingTransactions = h.riverTxPool.PendingTransactionsCount() + reply.River.ReplacementTransactionsCount = h.riverTxPool.ReplacementTransactionsCount() + if reply.River.ReplacementTransactionsCount > 0 { + reply.River.LastReplacementTransaction = time.Unix(h.riverTxPool.LastReplacementTransactionUnix(), 0). + Format(time.RFC3339) + } + + output, err := render.Execute(&reply) + if err != nil { + dlog.FromCtx(ctx).Error("unable to render transaction pool data", "err", err) + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "text/html") + w.WriteHeader(http.StatusOK) + _, _ = w.Write(output.Bytes()) +} + +type cacheHandler struct { + cache StreamCache +} + +func (h *cacheHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + var ( + ctx = r.Context() + streams = h.cache.GetLoadedViews(ctx) + streamCount = len(streams) + reply = render.CacheData{ + ShowStreams: r.URL.Query().Get("streams") == "1", + } + ) + + if streamCount > 10000 { + streamCount = 10000 + } + + if reply.ShowStreams { + reply.Streams = make([]*render.CacheDataStream, streamCount) + } + + slices.SortFunc(streams, func(a, b StreamView) int { + return a.StreamId().Compare(*b.StreamId()) + }) + + for i, view := range streams { + stats := view.GetStats() + + reply.TotalEventsEver += int64(stats.TotalEventsEver) + reply.MiniBlocksCount += stats.LastMiniblockNum - stats.FirstMiniblockNum + 1 + reply.EventsInMiniblocks += int64(stats.EventsInMiniblocks) + reply.SnapshotsInMiniblocks += int64(stats.SnapshotsInMiniblocks) + reply.EventsInMinipools += int64(stats.EventsInMinipool) + + if stats.FirstMiniblockNum != 0 { + reply.TrimmedStreams += 1 + } + + if reply.ShowStreams && i < streamCount { + reply.Streams[i] = &render.CacheDataStream{ + StreamID: view.StreamId().String(), + MiniBlocks: stats.LastMiniblockNum - stats.FirstMiniblockNum + 1, + FirstMiniblockNum: stats.FirstMiniblockNum, + LastMiniblockNum: stats.LastMiniblockNum, + EventsInMiniblocks: int64(stats.EventsInMiniblocks), + SnapshotsInMiniblocks: int64(stats.SnapshotsInMiniblocks), + EventsInMinipool: int64(stats.EventsInMinipool), + TotalEventsEver: int64(stats.TotalEventsEver), + } + } + } + + output, err := render.Execute(&reply) + if err != nil { + dlog.FromCtx(ctx).Error("unable to render cache data", "err", err) + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "text/html") + w.WriteHeader(http.StatusOK) + _, _ = w.Write(output.Bytes()) +} + +func readGoRoutineStackFrame(trace *bufio.Scanner) (*render.GoRoutineStack, error) { + var ( + head = trace.Text() + data render.GoRoutineStack + ) + + if !strings.HasPrefix(head, "goroutine ") { + return nil, fmt.Errorf("expected goroutine header, got %q", head) + } + + data.Description = head + + for trace.Scan() { + line := trace.Text() + if line == "" { // marks end of the frame + return &data, nil + } + data.Lines = append(data.Lines, line) + } + return &data, nil +} diff --git a/core/node/rpc/forwarder.go b/core/node/rpc/forwarder.go new file mode 100644 index 000000000..4d18ea49f --- /dev/null +++ b/core/node/rpc/forwarder.go @@ -0,0 +1,468 @@ +package rpc + +import ( + "context" + + "connectrpc.com/connect" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/dlog" + . "github.com/river-build/river/core/node/nodes" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/protocol/protocolconnect" + "github.com/river-build/river/core/node/shared" +) + +// peerNodeRequestWithRetries makes a request to as many as each of the remote nodes, returning the first response +// that is not a network unavailability error. +func peerNodeRequestWithRetries[T any]( + ctx context.Context, + nodes StreamNodes, + s *Service, + makeStubRequest func(ctx context.Context, stub StreamServiceClient) (*connect.Response[T], error), + numRetries int, +) (*connect.Response[T], error) { + if nodes.NumRemotes() <= 0 { + return nil, RiverError(Err_INTERNAL, "Cannot make peer node requests: no nodes available"). + Func("peerNodeRequestWithRetries") + } + + var stub StreamServiceClient + var resp *connect.Response[T] + var err error + + if numRetries <= 0 { + numRetries = max(s.config.Network.NumRetries, 1) + } + + // Do not make more than one request to a single node + numRetries = min(numRetries, nodes.NumRemotes()) + + for retry := 0; retry < numRetries; retry++ { + peer := nodes.GetStickyPeer() + stub, err = s.nodeRegistry.GetStreamServiceClientForAddress(peer) + if err != nil { + return nil, AsRiverError(err). + Func("peerNodeRequestWithRetries"). + Message("Could not get stream service client for address"). + Tag("address", peer) + } + + resp, err = makeStubRequest(ctx, stub) + + if err == nil { + return resp, nil + } + + if IsConnectNetworkError(err) { + // Mark peer as unavailable. + nodes.AdvanceStickyPeer(peer) + } else { + return nil, AsRiverError(err). + Func("peerNodeRequestWithRetries"). + Message("makeStubRequest failed"). + Tag("retry", retry). + Tag("numRetries", numRetries) + } + } + // If all requests fail, return the last error. + return nil, AsRiverError(err). + Func("peerNodeRequestWithRetries"). + Message("All retries failed"). + Tag("numRetries", numRetries) +} + +// peerNodeStreamingResponseWithRetries makes a request with a streaming server response to remote nodes, retrying +// in the event of unavailable nodes. +func peerNodeStreamingResponseWithRetries( + ctx context.Context, + nodes StreamNodes, + s *Service, + makeStubRequest func(ctx context.Context, stub StreamServiceClient) (hasStreamed bool, err error), + numRetries int, +) error { + if nodes.NumRemotes() <= 0 { + return RiverError(Err_INTERNAL, "Cannot make peer node requests: no nodes available"). + Func("peerNodeStreamingResponseWithRetries") + } + + var stub StreamServiceClient + var err error + var hasStreamed bool + + if numRetries <= 0 { + numRetries = max(s.config.Network.NumRetries, 1) + } + + // Do not make more than one request to a single node + numRetries = min(numRetries, nodes.NumRemotes()) + + for retry := 0; retry < numRetries; retry++ { + peer := nodes.GetStickyPeer() + stub, err = s.nodeRegistry.GetStreamServiceClientForAddress(peer) + if err != nil { + return AsRiverError(err). + Func("peerNodeStreamingResponseWithRetries"). + Message("Could not get stream service client for address"). + Tag("address", peer) + } + + // The stub request handles streaming the entire response. + hasStreamed, err = makeStubRequest(ctx, stub) + + if err == nil { + return nil + } + + if IsConnectNetworkError(err) && !hasStreamed { + // Mark peer as unavailable. + nodes.AdvanceStickyPeer(peer) + } else { + return AsRiverError(err). + Message("makeStubRequest failed"). + Func("peerNodeStreamingResponseWithRetries"). + Tag("hasStreamed", hasStreamed). + Tag("retry", retry). + Tag("numRetries", numRetries) + } + } + // If all requests fail, return the last error. + if err != nil { + return AsRiverError(err). + Func("peerNodeStreamingResponseWithRetries"). + Message("All retries failed"). + Tag("numRetries", numRetries) + } + + return nil +} + +func (s *Service) CreateStream( + ctx context.Context, + req *connect.Request[CreateStreamRequest], +) (*connect.Response[CreateStreamResponse], error) { + ctx, log := ctxAndLogForRequest(ctx, req) + log.Info("CreateStream REQUEST", "streamId", req.Msg.StreamId) + r, e := s.createStreamImpl(ctx, req) + if e != nil { + return nil, AsRiverError( + e, + ).Func("CreateStream"). + Tag("streamId", req.Msg.StreamId). + LogWarn(log). + AsConnectError() + } + var numMiniblocks int + var numEvents int + var firstMiniblockHash []byte + if s := r.Msg.GetStream(); s != nil { + numMiniblocks = len(s.GetMiniblocks()) + numEvents = len(s.GetEvents()) + if numMiniblocks > 0 { + firstMiniblockHash = s.GetMiniblocks()[0].GetHeader().GetHash() + } + } + log.Info("CreateStream SUCCESS", + "streamId", req.Msg.StreamId, + "numMiniblocks", numMiniblocks, + "numEvents", numEvents, + "firstMiniblockHash", firstMiniblockHash) + return r, nil +} + +func (s *Service) GetStream( + ctx context.Context, + req *connect.Request[GetStreamRequest], +) (*connect.Response[GetStreamResponse], error) { + ctx, log := ctxAndLogForRequest(ctx, req) + log.Debug("GetStream ENTER") + r, e := s.getStreamImpl(ctx, req) + if e != nil { + return nil, AsRiverError( + e, + ).Func("GetStream"). + Tag("req.Msg.StreamId", req.Msg.StreamId). + LogWarn(log). + AsConnectError() + } + log.Debug("GetStream LEAVE", "response", r.Msg) + return r, nil +} + +func (s *Service) GetStreamEx( + ctx context.Context, + req *connect.Request[GetStreamExRequest], + resp *connect.ServerStream[GetStreamExResponse], +) error { + ctx, log := ctxAndLogForRequest(ctx, req) + log.Debug("GetStreamEx ENTER") + e := s.getStreamExImpl(ctx, req, resp) + if e != nil { + return AsRiverError( + e, + ).Func("GetStreamEx"). + Tag("req.Msg.StreamId", req.Msg.StreamId). + LogWarn(log). + AsConnectError() + } + log.Debug("GetStreamEx LEAVE") + return nil +} + +func (s *Service) getStreamImpl( + ctx context.Context, + req *connect.Request[GetStreamRequest], +) (*connect.Response[GetStreamResponse], error) { + streamId, err := shared.StreamIdFromBytes(req.Msg.StreamId) + if err != nil { + return nil, err + } + + nodes, err := s.streamRegistry.GetStreamInfo(ctx, streamId) + if err != nil && req.Msg.Optional && AsRiverError(err).Code == Err_NOT_FOUND { + return connect.NewResponse(&GetStreamResponse{}), nil + } + + if err != nil { + return nil, err + } + + if nodes.IsLocal() { + return s.localGetStream(ctx, req) + } + + return peerNodeRequestWithRetries( + ctx, + nodes, + s, + func(ctx context.Context, stub StreamServiceClient) (*connect.Response[GetStreamResponse], error) { + ret, err := stub.GetStream(ctx, req) + if err != nil { + return nil, err + } + return connect.NewResponse(ret.Msg), nil + }, + -1, + ) +} + +func (s *Service) getStreamExImpl( + ctx context.Context, + req *connect.Request[GetStreamExRequest], + resp *connect.ServerStream[GetStreamExResponse], +) (err error) { + streamId, err := shared.StreamIdFromBytes(req.Msg.StreamId) + if err != nil { + return err + } + + nodes, err := s.streamRegistry.GetStreamInfo(ctx, streamId) + if err != nil { + return err + } + + if nodes.IsLocal() { + return s.localGetStreamEx(ctx, req, resp) + } + + err = peerNodeStreamingResponseWithRetries( + ctx, + nodes, + s, + func(ctx context.Context, stub StreamServiceClient) (hasStreamed bool, err error) { + // Get the raw stream from another client and forward packets. + clientStream, err := stub.GetStreamEx(ctx, req) + if err != nil { + return hasStreamed, err + } + defer clientStream.Close() + + // Forward the stream + sawLastPacket := false + for clientStream.Receive() { + packet := clientStream.Msg() + hasStreamed = true + + // We expect the last packet in the stream to be empty. + if packet.GetData() == nil { + sawLastPacket = true + } + + err = resp.Send(clientStream.Msg()) + if err != nil { + return hasStreamed, err + } + } + if err = clientStream.Err(); err != nil { + return hasStreamed, err + } + + // If we did not see the last packet, assume the node became unavailable. + if !sawLastPacket { + return hasStreamed, RiverError( + Err_UNAVAILABLE, + "Stream did not send all packets (expected empty packet)", + ).Func("service.getStreamExImpl").Tag("streamId", req.Msg.StreamId) + } + + return hasStreamed, nil + }, + -1, + ) + return err +} + +func (s *Service) GetMiniblocks( + ctx context.Context, + req *connect.Request[GetMiniblocksRequest], +) (*connect.Response[GetMiniblocksResponse], error) { + ctx, log := ctxAndLogForRequest(ctx, req) + log.Debug("GetMiniblocks ENTER", "req", req.Msg) + r, e := s.getMiniblocksImpl(ctx, req) + if e != nil { + return nil, AsRiverError( + e, + ).Func("GetMiniblocks"). + Tag("req.Msg.StreamId", req.Msg.StreamId). + LogWarn(log). + AsConnectError() + } + log.Debug("GetMiniblocks LEAVE", "response", r.Msg) + return r, nil +} + +func (s *Service) getMiniblocksImpl( + ctx context.Context, + req *connect.Request[GetMiniblocksRequest], +) (*connect.Response[GetMiniblocksResponse], error) { + streamId, err := shared.StreamIdFromBytes(req.Msg.StreamId) + if err != nil { + return nil, err + } + + nodes, err := s.streamRegistry.GetStreamInfo(ctx, streamId) + if err != nil { + return nil, err + } + + if nodes.IsLocal() { + return s.localGetMiniblocks(ctx, req) + } + + return peerNodeRequestWithRetries( + ctx, + nodes, + s, + func(ctx context.Context, stub StreamServiceClient) (*connect.Response[GetMiniblocksResponse], error) { + ret, err := stub.GetMiniblocks(ctx, req) + if err != nil { + return nil, err + } + return connect.NewResponse(ret.Msg), nil + }, + -1, + ) +} + +func (s *Service) GetLastMiniblockHash( + ctx context.Context, + req *connect.Request[GetLastMiniblockHashRequest], +) (*connect.Response[GetLastMiniblockHashResponse], error) { + ctx, log := ctxAndLogForRequest(ctx, req) + log.Debug("GetLastMiniblockHash ENTER", "req", req.Msg) + r, e := s.getLastMiniblockHashImpl(ctx, req) + if e != nil { + return nil, AsRiverError( + e, + ).Func("GetLastMiniblockHash"). + Tag("req.Msg.StreamId", req.Msg.StreamId). + LogWarn(log). + AsConnectError() + } + log.Debug("GetLastMiniblockHash LEAVE", "response", r.Msg) + return r, nil +} + +func (s *Service) getLastMiniblockHashImpl( + ctx context.Context, + req *connect.Request[GetLastMiniblockHashRequest], +) (*connect.Response[GetLastMiniblockHashResponse], error) { + streamId, err := shared.StreamIdFromBytes(req.Msg.StreamId) + if err != nil { + return nil, err + } + + nodes, err := s.streamRegistry.GetStreamInfo(ctx, streamId) + if err != nil { + return nil, err + } + + if nodes.IsLocal() { + return s.localGetLastMiniblockHash(ctx, req) + } + + return peerNodeRequestWithRetries( + ctx, + nodes, + s, + func(ctx context.Context, stub StreamServiceClient) (*connect.Response[GetLastMiniblockHashResponse], error) { + ret, err := stub.GetLastMiniblockHash(ctx, req) + if err != nil { + return nil, err + } + return connect.NewResponse(ret.Msg), nil + }, + -1, + ) +} + +func (s *Service) AddEvent( + ctx context.Context, + req *connect.Request[AddEventRequest], +) (*connect.Response[AddEventResponse], error) { + ctx, log := ctxAndLogForRequest(ctx, req) + log.Debug("AddEvent ENTER", "req", req.Msg) + r, e := s.addEventImpl(ctx, req) + if e != nil { + return nil, AsRiverError( + e, + ).Func("AddEvent"). + Tag("req.Msg.StreamId", req.Msg.StreamId). + LogWarn(log). + AsConnectError() + } + log.Debug("AddEvent LEAVE", "req.Msg.StreamId", req.Msg.StreamId) + return r, nil +} + +func (s *Service) addEventImpl( + ctx context.Context, + req *connect.Request[AddEventRequest], +) (*connect.Response[AddEventResponse], error) { + streamId, err := shared.StreamIdFromBytes(req.Msg.StreamId) + if err != nil { + return nil, err + } + + nodes, err := s.streamRegistry.GetStreamInfo(ctx, streamId) + if err != nil { + return nil, err + } + + if nodes.IsLocal() { + return s.localAddEvent(ctx, req, nodes) + } + + // TODO: smarter remote select? random? + firstRemote := nodes.GetStickyPeer() + dlog.FromCtx(ctx).Debug("Forwarding request", "nodeAddress", firstRemote) + stub, err := s.nodeRegistry.GetStreamServiceClientForAddress(firstRemote) + if err != nil { + return nil, err + } + + ret, err := stub.AddEvent(ctx, req) + if err != nil { + return nil, err + } + return connect.NewResponse(ret.Msg), nil +} diff --git a/core/node/rpc/get_last_miniblock_hash.go b/core/node/rpc/get_last_miniblock_hash.go new file mode 100644 index 000000000..a55ae32b3 --- /dev/null +++ b/core/node/rpc/get_last_miniblock_hash.go @@ -0,0 +1,49 @@ +package rpc + +import ( + "context" + + "connectrpc.com/connect" + "github.com/river-build/river/core/node/infra" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/shared" +) + +var getLastMiniblockHashRequests = infra.NewSuccessMetrics("get_last_miniblock_hash", serviceRequests) + +func (s *Service) localGetLastMiniblockHash( + ctx context.Context, + req *connect.Request[GetLastMiniblockHashRequest], +) (*connect.Response[GetLastMiniblockHashResponse], error) { + res, err := s.getLastMiniblockHash(ctx, req) + if err != nil { + getLastMiniblockHashRequests.FailInc() + return nil, err + } + + getLastMiniblockHashRequests.PassInc() + return res, nil +} + +func (s *Service) getLastMiniblockHash( + ctx context.Context, + req *connect.Request[GetLastMiniblockHashRequest], +) (*connect.Response[GetLastMiniblockHashResponse], error) { + streamId, err := shared.StreamIdFromBytes(req.Msg.StreamId) + if err != nil { + return nil, err + } + + _, streamView, err := s.cache.GetStream(ctx, streamId) + if err != nil { + return nil, err + } + + lastBlock := streamView.LastBlock() + resp := &GetLastMiniblockHashResponse{ + Hash: lastBlock.Hash[:], + MiniblockNum: lastBlock.Num, + } + + return connect.NewResponse(resp), nil +} diff --git a/core/node/rpc/get_miniblocks.go b/core/node/rpc/get_miniblocks.go new file mode 100644 index 000000000..d020214d7 --- /dev/null +++ b/core/node/rpc/get_miniblocks.go @@ -0,0 +1,53 @@ +package rpc + +import ( + "context" + + "connectrpc.com/connect" + "github.com/river-build/river/core/node/infra" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/shared" +) + +var getMiniblocksRequests = infra.NewSuccessMetrics("get_miniblocks_requests", serviceRequests) + +func (s *Service) localGetMiniblocks( + ctx context.Context, + req *connect.Request[GetMiniblocksRequest], +) (*connect.Response[GetMiniblocksResponse], error) { + res, err := s.getMiniblocks(ctx, req) + if err != nil { + getMiniblocksRequests.FailInc() + return nil, err + } + + getMiniblocksRequests.PassInc() + return res, nil +} + +func (s *Service) getMiniblocks( + ctx context.Context, + req *connect.Request[GetMiniblocksRequest], +) (*connect.Response[GetMiniblocksResponse], error) { + streamId, err := shared.StreamIdFromBytes(req.Msg.StreamId) + if err != nil { + return nil, err + } + + stream, _, err := s.cache.GetStream(ctx, streamId) + if err != nil { + return nil, err + } + + miniblocks, terminus, err := stream.GetMiniblocks(ctx, req.Msg.FromInclusive, req.Msg.ToExclusive) + if err != nil { + return nil, err + } + + resp := &GetMiniblocksResponse{ + Miniblocks: miniblocks, + Terminus: terminus, + } + + return connect.NewResponse(resp), nil +} diff --git a/core/node/rpc/get_stream.go b/core/node/rpc/get_stream.go new file mode 100644 index 000000000..aa24d317a --- /dev/null +++ b/core/node/rpc/get_stream.go @@ -0,0 +1,59 @@ +package rpc + +import ( + "context" + + "connectrpc.com/connect" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/infra" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/shared" +) + +var getStreamRequests = infra.NewSuccessMetrics("get_stream_requests", serviceRequests) + +func (s *Service) localGetStream( + ctx context.Context, + req *connect.Request[GetStreamRequest], +) (*connect.Response[GetStreamResponse], error) { + res, err := s.getStream(ctx, req) + if err != nil { + getStreamRequests.FailInc() + return nil, err + } + + getStreamRequests.PassInc() + return res, nil +} + +func (s *Service) getStream( + ctx context.Context, + req *connect.Request[GetStreamRequest], +) (*connect.Response[GetStreamResponse], error) { + streamId, err := shared.StreamIdFromBytes(req.Msg.StreamId) + if err != nil { + return nil, err + } + + _, streamView, err := s.cache.GetStream(ctx, streamId) + + if err != nil { + if req.Msg.Optional && AsRiverError(err).Code == Err_NOT_FOUND { + // aellis - this is actually an error, if the forwarder thinks the stream exists, but it doesn't exist in the cache + // it's a real error, but currently (feb 2024) in single node this will reach here + // If optional is set, empty response indicates that there is no stream. + // This reduces log spam for the case where stream legitimately may not exist yet. + return connect.NewResponse(&GetStreamResponse{}), nil + } else { + return nil, err + } + } else { + return connect.NewResponse(&GetStreamResponse{ + Stream: &StreamAndCookie{ + Events: streamView.MinipoolEnvelopes(), + NextSyncCookie: streamView.SyncCookie(s.wallet.Address), + Miniblocks: streamView.MiniblocksFromLastSnapshot(), + }, + }), nil + } +} diff --git a/core/node/rpc/get_stream_ex.go b/core/node/rpc/get_stream_ex.go new file mode 100644 index 000000000..a433a7d7a --- /dev/null +++ b/core/node/rpc/get_stream_ex.go @@ -0,0 +1,74 @@ +package rpc + +import ( + "context" + + "connectrpc.com/connect" + "google.golang.org/protobuf/proto" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/infra" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/shared" +) + +var getStreamExRequests = infra.NewSuccessMetrics("get_stream_ex_requests", serviceRequests) + +func (s *Service) localGetStreamEx( + ctx context.Context, + req *connect.Request[GetStreamExRequest], + resp *connect.ServerStream[GetStreamExResponse], +) (err error) { + err = s.getStreamEx(ctx, req, resp) + if err != nil { + getStreamExRequests.FailInc() + return err + } + getStreamExRequests.PassInc() + return nil +} + +func (s *Service) getStreamEx( + ctx context.Context, + req *connect.Request[GetStreamExRequest], + resp *connect.ServerStream[GetStreamExResponse], +) (err error) { + streamId, err := shared.StreamIdFromBytes(req.Msg.StreamId) + if err != nil { + return err + } + + var miniblockNumber int64 = 0 + for { + miniblocks, err := s.storage.ReadMiniblocks(ctx, streamId, miniblockNumber, miniblockNumber+1) + if err != nil { + return err + } + if len(miniblocks) == 0 { + break + } + + var miniblock Miniblock + err = proto.Unmarshal(miniblocks[0], &miniblock) + if err != nil { + return WrapRiverError(Err_BAD_BLOCK, err).Message("Unable to unmarshal miniblock") + } + + if err := resp.Send(&GetStreamExResponse{ + Data: &GetStreamExResponse_Miniblock{ + Miniblock: &miniblock, + }, + }); err != nil { + return err + } + + miniblockNumber++ + } + + // Send back an empty response to signal the end of the stream. + if err := resp.Send(&GetStreamExResponse{}); err != nil { + return err + } + + return nil +} diff --git a/core/node/rpc/http_handler.go b/core/node/rpc/http_handler.go new file mode 100644 index 000000000..a14b4d7ca --- /dev/null +++ b/core/node/rpc/http_handler.go @@ -0,0 +1,62 @@ +package rpc + +import ( + "log/slog" + "net/http" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/infra" +) + +var ( + http2Requests = infra.NewCounter("http2_requests", "") + http1Requests = infra.NewCounter("http1_requests", "") +) + +const ( + RequestIdHeader = "X-River-Request-Id" +) + +type httpHandler struct { + base http.Handler + log *slog.Logger +} + +var _ http.Handler = (*httpHandler)(nil) + +func newHttpHandler(b http.Handler, l *slog.Logger) *httpHandler { + return &httpHandler{ + base: b, + log: l, + } +} + +func (h *httpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + var id string + ids, ok := r.Header[RequestIdHeader] + if ok && len(ids) > 0 { + id = ids[0] + } + + // Limit request id to 16 char max + if len(id) > 16 { + id = id[:16] + } else if id == "" { + id = GenShortNanoid() + } + + log := h.log.With("requestId", id) + r = r.WithContext(dlog.CtxWithLog(r.Context(), log)) + + if r.Proto == "HTTP/2.0" { + http2Requests.Inc() + } else { + http1Requests.Inc() + log.Debug("Non HTTP/2.0 request received", "method", r.Method, "path", r.URL.Path, "protocol", r.Proto) + } + + w.Header().Add("X-Http-Version", r.Proto) + w.Header().Add(RequestIdHeader, id) + h.base.ServeHTTP(w, r) +} diff --git a/core/node/rpc/info.go b/core/node/rpc/info.go new file mode 100644 index 000000000..6338f0b84 --- /dev/null +++ b/core/node/rpc/info.go @@ -0,0 +1,163 @@ +package rpc + +import ( + "context" + "errors" + "fmt" + "log/slog" + "strconv" + + "connectrpc.com/connect" + "google.golang.org/protobuf/types/known/timestamppb" + + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/infra" + "github.com/river-build/river/core/node/node/version" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/protocol/protocolconnect" + "github.com/river-build/river/core/node/shared" +) + +var infoRequests = infra.NewSuccessMetrics("info_requests", serviceRequests) + +func (s *Service) Info( + ctx context.Context, + req *connect.Request[InfoRequest], +) (*connect.Response[InfoResponse], error) { + ctx, log := ctxAndLogForRequest(ctx, req) + + log.Debug("Info ENTER", "request", req.Msg) + + res, err := s.info(ctx, log, req) + if err != nil { + log.Warn("Info ERROR", "error", err) + infoRequests.FailInc() + return nil, err + } + + log.Debug("Info LEAVE", "response", res.Msg) + infoRequests.PassInc() + return res, nil +} + +func (s *Service) info( + ctx context.Context, + log *slog.Logger, + request *connect.Request[InfoRequest], +) (*connect.Response[InfoResponse], error) { + if len(request.Msg.Debug) > 0 { + debug := request.Msg.Debug[0] + if debug == "error" { + return nil, RiverError(Err_DEBUG_ERROR, "Error requested through Info request") + } else if debug == "network_error" { + connectErr := connect.NewError(connect.CodeUnavailable, fmt.Errorf("node unavailable")) + return nil, AsRiverError(connectErr).AsConnectError() + } else if debug == "error_untyped" { + return nil, errors.New("error requested through Info request") + } else if debug == "make_miniblock" { + return s.debugInfoMakeMiniblock(ctx, request) + } + + if s.config.EnableTestAPIs { + if debug == "panic" { + log.Error("panic requested through Info request") + panic("panic requested through Info request") + } else if debug == "flush_cache" { + log.Info("FLUSHING CACHE") + s.cache.ForceFlushAll(ctx) + return connect.NewResponse(&InfoResponse{ + Graffiti: "cache flushed", + }), nil + } else if debug == "exit" { + log.Info("GOT REQUEST TO EXIT NODE") + s.exitSignal <- errors.New("info_debug_exit") + return connect.NewResponse(&InfoResponse{ + Graffiti: "exiting...", + }), nil + } + } + } + + return connect.NewResponse(&InfoResponse{ + Graffiti: s.config.GetGraffiti(), + StartTime: timestamppb.New(s.startTime), + Version: version.GetFullVersion(), + }), nil +} + +func (s *Service) debugInfoMakeMiniblock( + ctx context.Context, + request *connect.Request[InfoRequest], +) (*connect.Response[InfoResponse], error) { + log := dlog.FromCtx(ctx) + + if len(request.Msg.Debug) < 2 { + return nil, RiverError(Err_DEBUG_ERROR, "make_miniblock requires a stream id and bool") + } + streamId, err := shared.StreamIdFromString(request.Msg.Debug[1]) + if err != nil { + return nil, err + } + forceSnapshot := false + if len(request.Msg.Debug) > 2 && request.Msg.Debug[2] == "true" { + forceSnapshot, err = strconv.ParseBool(request.Msg.Debug[2]) + if err != nil { + return nil, err + } + } + lastKnownMiniblockNum := int64(-1) + if len(request.Msg.Debug) > 3 { + lastKnownMiniblockNum, err = strconv.ParseInt(request.Msg.Debug[3], 10, 64) + if err != nil { + return nil, err + } + } + log.Info( + "Info Debug request to make miniblock", + "stream_id", + streamId, + "force_snapshot", + forceSnapshot, + "last_known_miniblock_num", + lastKnownMiniblockNum, + ) + + nodes, err := s.streamRegistry.GetStreamInfo(ctx, streamId) + if err != nil { + return nil, err + } + if nodes.IsLocal() { + stream, _, err := s.cache.GetStream(ctx, streamId) + if err != nil { + return nil, err + } + hash, num, err := stream.TestMakeMiniblock(ctx, forceSnapshot, lastKnownMiniblockNum) + if err != nil { + return nil, err + } + g := "" + if (hash != common.Hash{}) { + g = hash.Hex() + } + v := "" + if num > -1 { + v = strconv.FormatInt(num, 10) + } + return connect.NewResponse(&InfoResponse{ + Graffiti: g, + Version: v, + }), nil + } else { + return peerNodeRequestWithRetries( + ctx, + nodes, + s, + func(ctx context.Context, stub StreamServiceClient) (*connect.Response[InfoResponse], error) { + return stub.Info(ctx, request) + }, + -1, + ) + } +} diff --git a/core/node/rpc/info_mode.go b/core/node/rpc/info_mode.go new file mode 100644 index 000000000..2fb5e8b1f --- /dev/null +++ b/core/node/rpc/info_mode.go @@ -0,0 +1,112 @@ +package rpc + +import ( + "context" + "net" + "os" + "os/signal" + "strconv" + "syscall" + "time" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/dlog" +) + +func (s *Service) startInfoMode() error { + var err error + s.startTime = time.Now() + + s.initInstance(ServerModeInfo) + + // TODO: no need for base chain yet in the info mode + // err = s.initBaseChain() + // if err != nil { + // return AsRiverError(err).Message("Failed to init base chain").LogError(s.defaultLogger) + // } + + err = s.initRiverChain() + if err != nil { + return AsRiverError(err).Message("Failed to init river chain").LogError(s.defaultLogger) + } + + err = s.runHttpServer() + if err != nil { + return AsRiverError(err).Message("Failed to run http server").LogError(s.defaultLogger) + } + + go s.riverChain.ChainMonitor.RunWithBlockPeriod( + s.serverCtx, + s.riverChain.Client, + s.riverChain.InitialBlockNum, + time.Duration(s.riverChain.Config.BlockTimeMs)*time.Millisecond, + ) + + s.registerDebugHandlers() + + s.SetStatus("OK") + + // Retrieve the TCP address of the listener + tcpAddr := s.listener.Addr().(*net.TCPAddr) + + // Get the port as an integer + port := tcpAddr.Port + // convert the integer to a string + url := "localhost:" + strconv.Itoa(port) + "/debug/multi" + if s.config.UseHttps { + url = "https://" + url + } else { + url = "http://" + url + } + s.defaultLogger.Info("Server started", "port", port, "https", s.config.UseHttps, "url", url) + return nil +} + +func StartServerInInfoMode( + ctx context.Context, + cfg *config.Config, + riverChain *crypto.Blockchain, + listener net.Listener, +) (*Service, error) { + streamService := &Service{ + serverCtx: ctx, + config: cfg, + riverChain: riverChain, + listener: listener, + exitSignal: make(chan error, 1), + } + + err := streamService.startInfoMode() + if err != nil { + streamService.Close() + return nil, err + } + + return streamService, nil +} + +func RunInfoMode(ctx context.Context, cfg *config.Config) error { + log := dlog.FromCtx(ctx) + + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + service, error := StartServerInInfoMode(ctx, cfg, nil, nil) + if error != nil { + log.Error("Failed to start server", "error", error) + return error + } + defer service.Close() + + osSignal := make(chan os.Signal, 1) + signal.Notify(osSignal, syscall.SIGINT, syscall.SIGTERM) + go func() { + sig := <-osSignal + log.Info("Got OS signal", "signal", sig.String()) + service.exitSignal <- nil + }() + + return <-service.exitSignal +} diff --git a/core/node/rpc/load_stream.go b/core/node/rpc/load_stream.go new file mode 100644 index 000000000..cf161a570 --- /dev/null +++ b/core/node/rpc/load_stream.go @@ -0,0 +1,84 @@ +package rpc + +import ( + "context" + + . "github.com/river-build/river/core/node/events" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/protocol/protocolconnect" + . "github.com/river-build/river/core/node/shared" + + "connectrpc.com/connect" +) + +type remoteStream struct { + streamId StreamId + stub StreamServiceClient +} + +var _ Stream = (*remoteStream)(nil) + +func (s *Service) loadStream(ctx context.Context, streamId StreamId) (Stream, StreamView, error) { + nodes, err := s.streamRegistry.GetStreamInfo(ctx, streamId) + if err != nil { + return nil, nil, err + } + + if nodes.IsLocal() { + return s.cache.GetStream(ctx, streamId) + } + + targetNode := nodes.GetStickyPeer() + stub, err := s.nodeRegistry.GetStreamServiceClientForAddress(targetNode) + if err != nil { + return nil, nil, err + } + + resp, err := stub.GetStream(ctx, connect.NewRequest(&GetStreamRequest{ + StreamId: streamId[:], + })) + if err != nil { + return nil, nil, err + } + + streamView, err := MakeRemoteStreamView(resp.Msg) + if err != nil { + return nil, nil, err + } + + return &remoteStream{ + streamId: streamId, + stub: stub, + }, streamView, nil +} + +func (s *remoteStream) GetMiniblocks( + ctx context.Context, + fromInclusive int64, + toExclusive int64, +) ([]*Miniblock, bool, error) { + res, err := s.stub.GetMiniblocks(ctx, connect.NewRequest(&GetMiniblocksRequest{ + StreamId: s.streamId[:], + FromInclusive: fromInclusive, + ToExclusive: toExclusive, + })) + if err != nil { + return nil, false, err + } + + return res.Msg.Miniblocks, res.Msg.Terminus, nil +} + +func (s *remoteStream) AddEvent(ctx context.Context, event *ParsedEvent) error { + req := &AddEventRequest{ + StreamId: s.streamId[:], + Event: event.Envelope, + } + + _, err := s.stub.AddEvent(ctx, connect.NewRequest(req)) + if err != nil { + return err + } + + return nil +} diff --git a/core/node/rpc/memory.go b/core/node/rpc/memory.go new file mode 100644 index 000000000..3024db02a --- /dev/null +++ b/core/node/rpc/memory.go @@ -0,0 +1,42 @@ +package rpc + +import ( + "net/http" + "runtime" + + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/rpc/render" +) + +func MemoryHandler(w http.ResponseWriter, r *http.Request) { + if r.URL.Query().Get("gcnow") == "true" { + runtime.GC() + } + + var ( + ctx = r.Context() + numGoroutines = runtime.NumGoroutine() + m runtime.MemStats + ) + + runtime.ReadMemStats(&m) + + reply := render.MemStatsData{ + MemAlloc: m.Alloc, + TotalAlloc: m.TotalAlloc, + Sys: m.Sys, + NumLiveObjs: m.Mallocs - m.Frees, + NumGoroutines: numGoroutines, + } + + output, err := render.Execute(&reply) + if err != nil { + dlog.FromCtx(ctx).Error("unable to read memory stats", "err", err) + http.Error(w, "Internal Server Error", http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "text/html") + w.WriteHeader(http.StatusOK) + _, _ = w.Write(output.Bytes()) +} diff --git a/core/node/rpc/metrics_interceptor.go b/core/node/rpc/metrics_interceptor.go new file mode 100644 index 000000000..24e1205c9 --- /dev/null +++ b/core/node/rpc/metrics_interceptor.go @@ -0,0 +1,36 @@ +package rpc + +import ( + "context" + "time" + + "github.com/river-build/river/core/node/infra" + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + + "connectrpc.com/connect" +) + +type streamIdProvider interface { + GetStreamId() string +} + +func NewMetricsInterceptor() connect.UnaryInterceptorFunc { + interceptor := func(next connect.UnaryFunc) connect.UnaryFunc { + return func( + ctx context.Context, + req connect.AnyRequest, + ) (connect.AnyResponse, error) { + proc := req.Spec().Procedure + defer infra.StoreExecutionTimeMetrics(proc, "rpc", time.Now()) + + r, ok := req.Any().(streamIdProvider) + if ok { + // this line will enrich the tracing span with the streamId + span, _ := tracer.SpanFromContext(ctx) + span.SetTag("streamId", r.GetStreamId()) + } + return next(ctx, req) + } + } + return interceptor +} diff --git a/core/node/rpc/multi.go b/core/node/rpc/multi.go new file mode 100644 index 000000000..924c24400 --- /dev/null +++ b/core/node/rpc/multi.go @@ -0,0 +1,291 @@ +package rpc + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/http/httptrace" + "slices" + "strings" + "sync" + "time" + + "connectrpc.com/connect" + "github.com/ethereum/go-ethereum/common" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/contracts" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/http_client" + "github.com/river-build/river/core/node/nodes" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/protocol/protocolconnect" + "github.com/river-build/river/core/node/rpc/render" + "github.com/river-build/river/core/node/rpc/statusinfo" +) + +func formatDurationToMs(d time.Duration) string { + return d.Round(time.Millisecond).String() +} + +func formatDurationToSeconds(d time.Duration) string { + d = d.Round(time.Second) + day := 24 * time.Hour + if d >= day { + days := d / day + remainder := d % day + if remainder != 0 { + return fmt.Sprintf("%dd%s", days, remainder.String()) + } else { + return fmt.Sprintf("%dd", days) + } + } else { + return d.String() + } +} + +func getHttpStatus( + ctx context.Context, + baseUrl string, + result *statusinfo.HttpResult, + client *http.Client, + wg *sync.WaitGroup, +) { + log := dlog.FromCtx(ctx) + defer wg.Done() + + start := time.Now() + dnsResolved := start + connectionEstablished := start + dnsAddrs := []string{} + var usedAddr string + traceCtx := httptrace.WithClientTrace(ctx, &httptrace.ClientTrace{ + DNSDone: func(dnsInfo httptrace.DNSDoneInfo) { + for _, addr := range dnsInfo.Addrs { + dnsAddrs = append(dnsAddrs, addr.String()) + } + dnsResolved = time.Now() + }, + GotConn: func(connInfo httptrace.GotConnInfo) { + usedAddr = connInfo.Conn.RemoteAddr().String() + connectionEstablished = time.Now() + }, + }) + + url := baseUrl + "/status" + req, err := http.NewRequestWithContext(traceCtx, "GET", url, nil) + req.Header.Set("Accept", "application/json") + if err != nil { + log.Error("Error creating request", "err", err, "url", url) + result.StatusText = err.Error() + return + } + resp, err := client.Do(req) + end := time.Now() + result.DNSAddresses = dnsAddrs + result.RemoteAddress = usedAddr + if err != nil { + log.Error("Error fetching URL", "err", err, "url", url) + result.StatusText = err.Error() + return + } + + if resp != nil { + defer resp.Body.Close() + result.Success = resp.StatusCode == 200 + result.Status = resp.StatusCode + result.StatusText = resp.Status + result.Elapsed = formatDurationToMs(end.Sub(start)) + result.ElapsedAfterDNS = formatDurationToMs(end.Sub(dnsResolved)) + result.ElapsedAfterConn = formatDurationToMs(end.Sub(connectionEstablished)) + result.Protocol = resp.Proto + result.UsedTLS = resp.TLS != nil + if resp.StatusCode == 200 { + statusJson, err := io.ReadAll(resp.Body) + if err == nil { + st, err := statusinfo.StatusResponseFromJson(statusJson) + if err == nil { + result.Response = st + } else { + result.Response.Status = "Error decoding response: " + err.Error() + } + } else { + result.Response.Status = "Error reading response: " + err.Error() + } + } + } else { + result.StatusText = "No response" + } +} + +func getGrpcStatus( + ctx context.Context, + record *statusinfo.NodeStatus, + client StreamServiceClient, + wg *sync.WaitGroup, +) { + log := dlog.FromCtx(ctx) + defer wg.Done() + + start := time.Now() + dnsResolved := start + connectionEstablished := start + dnsAddrs := []string{} + var usedAddr string + traceCtx := httptrace.WithClientTrace(ctx, &httptrace.ClientTrace{ + DNSDone: func(dnsInfo httptrace.DNSDoneInfo) { + for _, addr := range dnsInfo.Addrs { + dnsAddrs = append(dnsAddrs, addr.String()) + } + dnsResolved = time.Now() + }, + GotConn: func(connInfo httptrace.GotConnInfo) { + usedAddr = connInfo.Conn.RemoteAddr().String() + connectionEstablished = time.Now() + }, + }) + + req := connect.NewRequest(&InfoRequest{}) + resp, err := client.Info(traceCtx, req) + end := time.Now() + record.Grpc.DNSAddresses = dnsAddrs + record.Grpc.RemoteAddress = usedAddr + if err != nil { + log.Error("Error fetching Info", "err", err, "url", record.Record.Url) + record.Grpc.StatusText = err.Error() + return + } + + startTime := resp.Msg.StartTime.AsTime() + + record.Grpc.Success = true + record.Grpc.StatusText = "OK" + record.Grpc.Elapsed = formatDurationToMs(end.Sub(start)) + record.Grpc.ElapsedAfterDNS = formatDurationToMs(end.Sub(dnsResolved)) + record.Grpc.ElapsedAfterConn = formatDurationToMs(end.Sub(connectionEstablished)) + record.Grpc.Version = resp.Msg.Version + record.Grpc.StartTime = startTime.UTC().Format(time.RFC3339) + record.Grpc.Uptime = formatDurationToSeconds(time.Since(startTime)) + record.Grpc.Graffiti = resp.Msg.Graffiti + record.Grpc.Protocol = req.Peer().Protocol + record.Grpc.XHttpVersion = resp.Header().Get("X-HTTP-Version") +} + +func getEthBalance( + ctx context.Context, + result *string, + riverChain *crypto.Blockchain, + address common.Address, + wg *sync.WaitGroup, +) { + defer wg.Done() + + balance, err := riverChain.Client.BalanceAt(ctx, address, nil) + if err != nil { + *result = "Error getting balance: " + err.Error() + return + } + + b := balance.String() + dot := len(b) - 18 + if dot > 0 { + *result = b[:dot] + "." + b[dot:] + } else { + *result = "0." + strings.Repeat("0", -dot) + b + } +} + +func GetRiverNetworkStatus( + ctx context.Context, + cfg *config.Config, + nodeRegistry nodes.NodeRegistry, + riverChain *crypto.Blockchain, +) (*statusinfo.RiverStatus, error) { + startTime := time.Now() + + ctx, cancel := context.WithTimeout(ctx, cfg.Network.GetHttpRequestTimeout()) + defer cancel() + + allNodes := nodeRegistry.GetAllNodes() + slices.SortFunc(allNodes, func(i, j *nodes.NodeRecord) int { + return strings.Compare(i.Url(), j.Url()) + }) + + http11client, err := http_client.GetHttp11Client(ctx) + if err != nil { + return nil, err + } + http11client.Timeout = cfg.Network.GetHttpRequestTimeout() + + http20client, err := http_client.GetHttpClient(ctx) + if err != nil { + return nil, err + } + http20client.Timeout = cfg.Network.GetHttpRequestTimeout() + + grpcHttpClient, err := http_client.GetHttpClient(ctx) + if err != nil { + return nil, err + } + grpcHttpClient.Timeout = cfg.Network.GetHttpRequestTimeout() + + data := &statusinfo.RiverStatus{ + QueryTime: time.Now().UTC().Format(time.RFC3339), + } + wg := sync.WaitGroup{} + for _, n := range allNodes { + r := &statusinfo.NodeStatus{ + Record: statusinfo.RegistryNodeInfo{ + Address: n.Address().Hex(), + Url: n.Url(), + Operator: n.Operator().Hex(), + Status: int(n.Status()), + StatusText: contracts.NodeStatusString(n.Status()), + }, + Local: n.Local(), + } + data.Nodes = append(data.Nodes, r) + + wg.Add(4) + go getHttpStatus(ctx, n.Url(), &r.Http11, http11client, &wg) + go getHttpStatus(ctx, n.Url(), &r.Http20, http20client, &wg) + go getGrpcStatus(ctx, r, NewStreamServiceClient(grpcHttpClient, n.Url(), connect.WithGRPC()), &wg) + go getEthBalance(ctx, &r.RiverEthBalance, riverChain, n.Address(), &wg) + } + + wg.Wait() + data.Elapsed = formatDurationToMs(time.Since(startTime)) + return data, nil +} + +func (s *Service) handleDebugMulti(w http.ResponseWriter, r *http.Request) { + log := s.defaultLogger + + status, err := GetRiverNetworkStatus(r.Context(), s.config, s.nodeRegistry, s.riverChain) + if err == nil { + err = render.ExecuteAndWrite(&render.DebugMultiData{Status: status}, w) + log.Info("River Network Status", "data", status) + } + if err != nil { + log.Error("Error getting data or rendering template for debug/multi", "err", err) + http.Error(w, "Internal Server Error: "+err.Error(), http.StatusInternalServerError) + } +} + +func (s *Service) handleDebugMultiJson(w http.ResponseWriter, r *http.Request) { + log := s.defaultLogger + + w.Header().Set("Content-Type", "application/json") + status, err := GetRiverNetworkStatus(r.Context(), s.config, s.nodeRegistry, s.riverChain) + if err == nil { + // Write status as json + err = json.NewEncoder(w).Encode(status) + log.Info("River Network Status", "data", status) + } + if err != nil { + log.Error("Error getting data or writing json for debug/multi/json", "err", err) + http.Error(w, "Internal Server Error: "+err.Error(), http.StatusInternalServerError) + } +} diff --git a/core/node/rpc/new_node_test.go b/core/node/rpc/new_node_test.go new file mode 100644 index 000000000..f9326a322 --- /dev/null +++ b/core/node/rpc/new_node_test.go @@ -0,0 +1,124 @@ +package rpc_test + +import ( + "context" + "testing" + + "connectrpc.com/connect" + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/contracts" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/dlog" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/protocol/protocolconnect" + . "github.com/river-build/river/core/node/shared" + "github.com/river-build/river/core/node/testutils" + "github.com/stretchr/testify/require" +) + +func testCreate100Streams( + ctx context.Context, + require *require.Assertions, + c protocolconnect.StreamServiceClient, + streamSettings *StreamSettings, +) []StreamId { + wallet, err := crypto.NewWallet(ctx) + require.NoError(err) + _, _, err = createUser(ctx, wallet, c, streamSettings) + require.NoError(err) + streamdIds := []StreamId{UserStreamIdFromAddr(wallet.Address)} + for i := 0; i < 99; i++ { + streamId := testutils.FakeStreamId(STREAM_SPACE_BIN) + _, _, err = createSpace(ctx, wallet, c, streamId, streamSettings) + require.NoError(err) + streamdIds = append(streamdIds, streamId) + } + if streamSettings != nil && streamSettings.DisableMiniblockCreation { + for _, streamId := range streamdIds { + _, _, err := makeMiniblock(ctx, c, streamId, false, -1) + require.NoError(err) + } + } + return streamdIds +} + +func TestAddingNewNodes(t *testing.T) { + tester := newServiceTester(t, 20) + ctx := tester.ctx + require := tester.require + log := dlog.FromCtx(ctx) + + tester.initNodeRecords(0, 10, contracts.NodeStatus_Operational) + tester.startNodes(0, 10) + + testMethodsWithClient(tester, tester.testClient(9)) + + c0 := tester.testClient(0) + streamdIds0 := testCreate100Streams(ctx, require, c0, nil) + + tester.initNodeRecords(10, 20, contracts.NodeStatus_NotInitialized) + + testMethodsWithClient(tester, tester.testClient(4)) + + tester.startNodes(10, 20) + tester.setNodesStatus(10, 20, contracts.NodeStatus_Operational) + + testMethodsWithClient(tester, tester.testClient(14)) + + c1 := tester.testClient(18) + streamdIds1 := testCreate100Streams(ctx, require, c1, nil) + + newNodes := make(map[common.Address]bool) + for i := 10; i < 20; i++ { + newNodes[tester.nodes[i].address] = true + } + // Read new streams through old client + var oldNodeCount, newNodeCount int + for _, streamId := range streamdIds1 { + id := streamId[:] + r, err := c0.GetStream(ctx, connect.NewRequest(&GetStreamRequest{ + StreamId: id, + })) + require.NoError(err) + require.NotNil(r) + require.Equal(id, r.Msg.Stream.NextSyncCookie.StreamId) + if newNodes[common.BytesToAddress(r.Msg.Stream.NextSyncCookie.NodeAddress)] { + newNodeCount++ + } else { + oldNodeCount++ + } + } + log.Info("Node count new streams through old client", "oldNodeCount", oldNodeCount, "newNodeCount", newNodeCount) + require.NotZero(newNodeCount) + require.NotZero(oldNodeCount) + + // Read old streams through new client + oldNodeCount, newNodeCount = 0, 0 + for _, streamId := range streamdIds0 { + id := streamId[:] + r, err := c1.GetStream(ctx, connect.NewRequest(&GetStreamRequest{ + StreamId: id, + })) + require.NoError(err) + require.NotNil(r) + require.Equal(id, r.Msg.Stream.NextSyncCookie.StreamId) + if newNodes[common.BytesToAddress(r.Msg.Stream.NextSyncCookie.NodeAddress)] { + newNodeCount++ + } else { + oldNodeCount++ + } + } + log.Info("Node count old streams through new client", "oldNodeCount", oldNodeCount, "newNodeCount", newNodeCount) + require.NotZero(oldNodeCount) + require.Zero(newNodeCount) +} + +func TestNoRecordNoStart(t *testing.T) { + tester := newServiceTester(t, 1) + require := tester.require + + err := tester.startSingle(0) + require.Error(err) + require.Equal(Err_UNKNOWN_NODE, AsRiverError(err).Code) +} diff --git a/core/node/rpc/node2node.go b/core/node/rpc/node2node.go new file mode 100644 index 000000000..24d854325 --- /dev/null +++ b/core/node/rpc/node2node.go @@ -0,0 +1,102 @@ +package rpc + +import ( + "context" + + "connectrpc.com/connect" + + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/events" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/shared" +) + +func (s *Service) AllocateStream( + ctx context.Context, + req *connect.Request[AllocateStreamRequest], +) (*connect.Response[AllocateStreamResponse], error) { + ctx, log := ctxAndLogForRequest(ctx, req) + log.Debug("AllocateStream ENTER") + r, e := s.allocateStream(ctx, req.Msg) + if e != nil { + return nil, AsRiverError( + e, + ).Func("AllocateStream"). + Tag("streamId", req.Msg.StreamId). + LogWarn(log). + AsConnectError() + } + log.Debug("AllocateStream LEAVE", "response", r) + return connect.NewResponse(r), nil +} + +func (s *Service) allocateStream(ctx context.Context, req *AllocateStreamRequest) (*AllocateStreamResponse, error) { + streamId, err := shared.StreamIdFromBytes(req.StreamId) + if err != nil { + return nil, err + } + + // TODO: check request is signed by correct node + // TODO: all checks that should be done on create? + _, view, err := s.cache.CreateStream(ctx, streamId) + if err != nil { + return nil, err + } + return &AllocateStreamResponse{ + SyncCookie: view.SyncCookie(s.wallet.Address), + }, nil +} + +func (s *Service) NewEventReceived( + ctx context.Context, + req *connect.Request[NewEventReceivedRequest], +) (*connect.Response[NewEventReceivedResponse], error) { + ctx, log := ctxAndLogForRequest(ctx, req) + log.Debug("NewEventReceived ENTER") + r, e := s.newEventReceived(ctx, req.Msg) + if e != nil { + return nil, AsRiverError( + e, + ).Func("NewEventReceived"). + Tag("streamId", req.Msg.StreamId). + LogWarn(log). + AsConnectError() + } + log.Debug("NewEventReceived LEAVE", "response", r) + return connect.NewResponse(r), nil +} + +func (s *Service) newEventReceived( + ctx context.Context, + req *NewEventReceivedRequest, +) (*NewEventReceivedResponse, error) { + streamId, err := shared.StreamIdFromBytes(req.StreamId) + if err != nil { + return nil, err + } + + // TODO: check request is signed by correct node + parsedEvent, err := ParseEvent(req.Event) + if err != nil { + return nil, err + } + + stream, _, err := s.cache.GetStream(ctx, streamId) + if err != nil { + return nil, err + } + + err = stream.AddEvent(ctx, parsedEvent) + if err != nil { + return nil, err + } + + return &NewEventReceivedResponse{}, nil +} + +func (s *Service) NewEventInPool( + context.Context, + *connect.Request[NewEventInPoolRequest], +) (*connect.Response[NewEventInPoolResponse], error) { + return nil, nil +} diff --git a/core/node/rpc/quorum_pool.go b/core/node/rpc/quorum_pool.go new file mode 100644 index 000000000..5438f681d --- /dev/null +++ b/core/node/rpc/quorum_pool.go @@ -0,0 +1,73 @@ +package rpc + +import "github.com/ethereum/go-ethereum/common" + +type quorumPool struct { + localErrChannel chan error + remotes int + remoteErrChannel chan error +} + +func newQuorumPool(maxRemotes int) *quorumPool { + var remoteErrChannel chan error + if maxRemotes > 0 { + remoteErrChannel = make(chan error, maxRemotes) + } + return &quorumPool{ + remoteErrChannel: remoteErrChannel, + } +} + +func (q *quorumPool) GoLocal(f func() error) { + q.localErrChannel = make(chan error, 1) + go func() { + err := f() + q.localErrChannel <- err + }() +} + +func (q *quorumPool) GoRemote(node common.Address, f func(node common.Address) error) { + q.remotes++ + go func(node common.Address) { + err := f(node) + q.remoteErrChannel <- err + }(node) +} + +func (q *quorumPool) Wait() error { + // First wait for local if any. + if q.localErrChannel != nil { + if err := <-q.localErrChannel; err != nil { + return err + } + } + + // Then wait for majority quorum of remotes. + if q.remotes > 0 { + remoteQuorum := remoteQuorumNum(q.remotes, q.localErrChannel != nil) + + var firstErr error + success := 0 + failure := 0 + for i := 0; i < q.remotes; i++ { + err := <-q.remoteErrChannel + if err == nil { + success++ + if success >= remoteQuorum { + return nil + } + } else { + if firstErr == nil { + firstErr = err + } + failure++ + if failure > q.remotes-remoteQuorum { + return firstErr + } + } + } + return firstErr + } + + return nil +} diff --git a/core/node/rpc/render/render.go b/core/node/rpc/render/render.go new file mode 100644 index 000000000..d7806b5cc --- /dev/null +++ b/core/node/rpc/render/render.go @@ -0,0 +1,74 @@ +package render + +import ( + "bytes" + "embed" + "fmt" + "html/template" + "io" + "io/fs" + "strings" + + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/protocol" +) + +// Execute renders the given data using its associated template +func Execute[RD RenderableData](data RD) (*bytes.Buffer, error) { + var output bytes.Buffer + if err := ExecuteAndWrite(data, &output); err != nil { + return nil, err + } + return &output, nil +} + +// ExecuteAndWrite Execute renders the given data and writes it to the given writer +func ExecuteAndWrite[RD RenderableData](data RD, into io.Writer) error { + tmpl := templates[data.TemplateName()] + if err := tmpl.Execute(into, data); err != nil { + return AsRiverError(err, Err_INTERNAL).Message("unable to execute template"). + Tag("template", data.TemplateName()). + Func("ExecuteAndWrite") + } + return nil +} + +var ( + //go:embed templates + files embed.FS + templates = make(map[string]*template.Template) + helpers = template.FuncMap{ + "safeDivide": func(a, b int64) string { + if b == 0 { + return "NA" + } + return fmt.Sprintf("%.1f", float64(a)/float64(b)) + }, + "intToInt64": func(i int) int64 { + return int64(i) + }, + } +) + +func init() { + err := fs.WalkDir(files, "templates", func(path string, entry fs.DirEntry, err error) error { + if err != nil { + return err + } + if !entry.IsDir() && strings.HasSuffix(path, ".template.html") { + templateContents, err := files.ReadFile(path) + if err != nil { + panic(err) + } + pt, err := template.New(path).Funcs(helpers).Parse(string(templateContents)) + if err != nil { + panic(fmt.Sprintf("unable to parse html template %s: %v", path, err)) + } + templates[path] = pt + } + return nil + }) + if err != nil { + panic(err) + } +} diff --git a/core/node/rpc/render/render_test.go b/core/node/rpc/render/render_test.go new file mode 100644 index 000000000..34d2c7649 --- /dev/null +++ b/core/node/rpc/render/render_test.go @@ -0,0 +1,90 @@ +package render_test + +import ( + "testing" + + "github.com/river-build/river/core/node/rpc/render" + "github.com/river-build/river/core/node/rpc/statusinfo" + "github.com/stretchr/testify/require" +) + +// implicitly calls render.init that loads and parses all templates +// ensuring they are syntactically correct +func TestRenderDebugCacheTemp(t *testing.T) { + payload := render.CacheData{ + MiniBlocksCount: 1234, + TotalEventsCount: 5678, + EventsInMiniblocks: 383, + SnapshotsInMiniblocks: 10, + TrimmedStreams: 3, + TotalEventsEver: 838382, + ShowStreams: true, + Streams: []*render.CacheDataStream{ + { + StreamID: "stream1", + FirstMiniblockNum: 1, + LastMiniblockNum: 2, + MiniBlocks: 3, + EventsInMiniblocks: 4, + SnapshotsInMiniblocks: 5, + EventsInMinipool: 6, + TotalEventsEver: 7, + }, + }, + } + + _, err := render.Execute(&payload) + require.NoError(t, err) +} + +func TestRenderDebugMulti(t *testing.T) { + addr := "0x1234567890abcdef1234567890abcdef12345678" + url := "http://localhost:1234" + tt := "2024-04-30T19:08:26Z" + dd := "10s" + payload := render.DebugMultiData{ + Status: &statusinfo.RiverStatus{ + Nodes: []*statusinfo.NodeStatus{ + { + Record: statusinfo.RegistryNodeInfo{ + Address: addr, + Url: url, + Operator: addr, + Status: 2, + StatusText: "Operational", + }, + Local: true, + Http11: statusinfo.HttpResult{ + Success: true, + Status: 200, + StatusText: "OK", + Elapsed: dd, + Response: statusinfo.StatusResponse{ + Status: "OK", + InstanceId: addr, + Address: addr, + Version: "1.2.3", + StartTime: tt, + Uptime: dd, + Graffiti: "graffiti", + }, + }, + Grpc: statusinfo.GrpcResult{ + Success: true, + StatusText: "OK", + Elapsed: dd, + Version: "1.2.3", + StartTime: tt, + Uptime: dd, + Graffiti: "graffiti", + }, + }, + }, + QueryTime: tt, + Elapsed: dd, + }, + } + + _, err := render.Execute(&payload) + require.NoError(t, err) +} diff --git a/core/node/rpc/render/templates/debug/available.template.html b/core/node/rpc/render/templates/debug/available.template.html new file mode 100644 index 000000000..f7d2a3245 --- /dev/null +++ b/core/node/rpc/render/templates/debug/available.template.html @@ -0,0 +1,17 @@ + + + + Available debug handlers + + +

Available debug handlers:

+ + + diff --git a/core/node/rpc/render/templates/debug/cache.template.html b/core/node/rpc/render/templates/debug/cache.template.html new file mode 100644 index 000000000..5498223bd --- /dev/null +++ b/core/node/rpc/render/templates/debug/cache.template.html @@ -0,0 +1,49 @@ + + + + Cache information + + + +

Stream cache

+

Streams: {{(len .Streams)}}

+

+ Miniblocks: {{.MiniBlocksCount}}, {{safeDivide .MiniBlocksCount + (intToInt64 (len .Streams))}} per stream +

+

+ Events in miniblocks: {{.EventsInMiniblocks}}, {{safeDivide + .EventsInMiniblocks (intToInt64 (len .Streams))}} per stream, {{safeDivide + .EventsInMiniblocks .MiniBlocksCount}} per miniblock +

+

+ Snapshots in miniblocks: {{.SnapshotsInMiniblocks}}, {{safeDivide + .SnapshotsInMiniblocks (intToInt64 (len .Streams))}} per stream, + {{safeDivide .SnapshotsInMiniblocks .MiniBlocksCount}} per miniblock +

+

+ Events in minipools: {{.EventsInMinipools}}, {{safeDivide + .EventsInMinipools (intToInt64 (len .Streams))}} per stream +

+

+ Trimmed streams: {{.TrimmedStreams}}, {{safeDivide .TrimmedStreams + (intToInt64 (len .Streams))}} per stream +

+

+ Total events ever: {{.TotalEventsEver}}, {{safeDivide .TotalEventsEver + (intToInt64 (len .Streams))}} per stream +

+ {{if .ShowStreams }} +

Hide streams

+ {{else}} +

Show streams

+ {{end}} {{if .Streams }} +
+        
+            
+            {{ range $i, $stream := .Streams }}{{end}}
+        
#StreamFirst MBLast MBMiniblocksEvents in MBSnapshotsEvents in MPEvents Ever
{{$i}}{{$stream.StreamID}}{{$stream.FirstMiniblockNum}}{{$stream.LastMiniblockNum}}{{$stream.MiniBlocks}}{{$stream.EventsInMiniblocks}}{{$stream.SnapshotsInMiniblocks}}{{$stream.EventsInMinipool}}{{$stream.TotalEventsEver}}
+
+ {{end}} + + diff --git a/core/node/rpc/render/templates/debug/memory.template.html b/core/node/rpc/render/templates/debug/memory.template.html new file mode 100644 index 000000000..604fb2f35 --- /dev/null +++ b/core/node/rpc/render/templates/debug/memory.template.html @@ -0,0 +1,54 @@ + + + + Resource Usage + + + +
+

Node Process Resource Usage

+
+ Memory Allocated: {{.MemAlloc}} bytes
+ Total Memory Allocated: {{.TotalAlloc}} bytes
+ Memory Sys: {{.Sys}} bytes
+ Number of Live Objects: {{.NumLiveObjs}}
+ Number of Goroutines: {{.NumGoroutines}}
+
+
+ +
+
Performing garbage collection...
+
+ + + diff --git a/core/node/rpc/render/templates/debug/multi.template.html b/core/node/rpc/render/templates/debug/multi.template.html new file mode 100644 index 000000000..c99097279 --- /dev/null +++ b/core/node/rpc/render/templates/debug/multi.template.html @@ -0,0 +1,131 @@ + + + + + Protocol and Node Responses + + + + +

Node Response Times

+ + + + + + + + + + + + + + + + + {{range .Status.Nodes}} + + + {{with .Http11}} + + {{end}} + {{with .Http20}} + + {{end}} {{with .Grpc}} + + + + {{end}} + + + + + + {{end}} +
NodeHTTP/1.1HTTP/2GRPCVersionUptimeAddressStatusOperatorRiver Eth Balance
{{.Record.Url}}{{if .Local}} *{{end}} + + {{.StatusText}} {{.Elapsed}} +
{{.ToPrettyJson}}
+
+
+ + {{.StatusText}} {{.Elapsed}} +
{{.ToPrettyJson}}
+
+
+ + {{.StatusText}} {{.Elapsed}} +
{{.ToPrettyJson}}
+
+
{{.Version}} + + {{.Uptime}} +
Start time: {{.StartTime}}
+UTC: {{.StartTime}}
+
+
{{.Record.Address}}{{.Record.Status}} ({{.Record.StatusText}}){{.Record.Operator}}{{.RiverEthBalance}}
+ + Current Time: {{.Status.QueryTime}}
+ Elapsed Time: {{.Status.Elapsed}} +
UTC: {{.Status.QueryTime}}
+
+ + + + diff --git a/core/node/rpc/render/templates/debug/stacks.template.html b/core/node/rpc/render/templates/debug/stacks.template.html new file mode 100644 index 000000000..e3c9c1195 --- /dev/null +++ b/core/node/rpc/render/templates/debug/stacks.template.html @@ -0,0 +1,27 @@ + + + + Stacktrace + + + + + + + + + + + + + {{ range $i, $stack := .Stacks }} + + + + + + {{end}} + +
#GoRoutineStack
{{$i}}{{$stack.Description}}{{ range $j, $line := $stack.Lines }}{{$line}}
{{end}}
+ + diff --git a/core/node/rpc/render/templates/debug/txpool.template.html b/core/node/rpc/render/templates/debug/txpool.template.html new file mode 100644 index 000000000..756ade801 --- /dev/null +++ b/core/node/rpc/render/templates/debug/txpool.template.html @@ -0,0 +1,18 @@ + + + + Transaction pool + + + +

River chain

+

Processed transactions: {{.River.ProcessedTransactions}}

+

Pending transactions: {{.River.PendingTransactions}}

+

+ Replacement transactions count: {{.River.ReplacementTransactionsCount}} +

+ {{if .River.LastReplacementTransaction}} +

Last replacement: {{.River.LastReplacementTransaction}}

+ {{end}} + + diff --git a/core/node/rpc/render/templates/info/index.template.html b/core/node/rpc/render/templates/info/index.template.html new file mode 100644 index 000000000..67661f2bf --- /dev/null +++ b/core/node/rpc/render/templates/info/index.template.html @@ -0,0 +1,10 @@ + + + + Node information + + +

All good in the River land!

+
{{.StatusJson}}
+ + diff --git a/core/node/rpc/render/types.go b/core/node/rpc/render/types.go new file mode 100644 index 000000000..665659d05 --- /dev/null +++ b/core/node/rpc/render/types.go @@ -0,0 +1,104 @@ +package render + +import ( + "github.com/river-build/river/core/node/rpc/statusinfo" +) + +// RenderableData is the interface for all data that can be rendered +type RenderableData interface { + *AvailableDebugHandlersData | *CacheData | *TransactionPoolData | + *GoRoutineData | *MemStatsData | *InfoIndexData | *DebugMultiData + + // TemplateName returns the name of the template to be used for rendering + TemplateName() string +} + +type CacheData struct { + MiniBlocksCount int64 + TotalEventsCount int64 + EventsInMiniblocks int64 + SnapshotsInMiniblocks int64 + EventsInMinipools int64 + TrimmedStreams int64 + TotalEventsEver int64 + ShowStreams bool + Streams []*CacheDataStream +} + +func (d CacheData) TemplateName() string { + return "templates/debug/cache.template.html" +} + +type CacheDataStream struct { + StreamID string + FirstMiniblockNum int64 + LastMiniblockNum int64 + MiniBlocks int64 + EventsInMiniblocks int64 + SnapshotsInMiniblocks int64 + EventsInMinipool int64 + TotalEventsEver int64 +} + +type GoRoutineData struct { + Stacks []*GoRoutineStack +} + +type TransactionPoolData struct { + River struct { + ProcessedTransactions int64 + PendingTransactions int64 + ReplacementTransactionsCount int64 + LastReplacementTransaction string + } +} + +func (d TransactionPoolData) TemplateName() string { + return "templates/debug/txpool.template.html" +} + +func (d GoRoutineData) TemplateName() string { + return "templates/debug/stacks.template.html" +} + +type GoRoutineStack struct { + Description string + Lines []string +} + +// Struct for memory stats +type MemStatsData struct { + MemAlloc uint64 + TotalAlloc uint64 + Sys uint64 + NumLiveObjs uint64 + NumGoroutines int +} + +func (d MemStatsData) TemplateName() string { + return "templates/debug/memory.template.html" +} + +type AvailableDebugHandlersData struct { + Handlers []string +} + +func (d AvailableDebugHandlersData) TemplateName() string { + return "templates/debug/available.template.html" +} + +type InfoIndexData struct { + StatusJson string +} + +func (d InfoIndexData) TemplateName() string { + return "templates/info/index.template.html" +} + +type DebugMultiData struct { + Status *statusinfo.RiverStatus +} + +func (d DebugMultiData) TemplateName() string { + return "templates/debug/multi.template.html" +} diff --git a/core/node/rpc/replicated_add.go b/core/node/rpc/replicated_add.go new file mode 100644 index 000000000..8d1a7519a --- /dev/null +++ b/core/node/rpc/replicated_add.go @@ -0,0 +1,66 @@ +package rpc + +import ( + "context" + + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/events" + . "github.com/river-build/river/core/node/nodes" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/shared" + + "connectrpc.com/connect" +) + +type replicatedStream struct { + streamId string + localStream AddableStream + nodes StreamNodes + service *Service +} + +var _ AddableStream = (*replicatedStream)(nil) + +func (r *replicatedStream) AddEvent(ctx context.Context, event *ParsedEvent) error { + numRemotes := r.nodes.NumRemotes() + // TODO: remove + if numRemotes == 0 { + return r.localStream.AddEvent(ctx, event) + } + + sender := newQuorumPool(numRemotes) + + sender.GoLocal(func() error { + return r.localStream.AddEvent(ctx, event) + }) + + if numRemotes > 0 { + streamId, err := shared.StreamIdFromString(r.streamId) + if err != nil { + return err + } + for _, n := range r.nodes.GetRemotes() { + sender.GoRemote( + n, + func(node common.Address) error { + stub, err := r.service.nodeRegistry.GetNodeToNodeClientForAddress(node) + if err != nil { + return err + } + _, err = stub.NewEventReceived( + ctx, + connect.NewRequest[NewEventReceivedRequest]( + &NewEventReceivedRequest{ + StreamId: streamId[:], + Event: event.Envelope, + }, + ), + ) + return err + }, + ) + } + } + + return sender.Wait() +} diff --git a/core/node/rpc/server.go b/core/node/rpc/server.go new file mode 100644 index 000000000..26606168c --- /dev/null +++ b/core/node/rpc/server.go @@ -0,0 +1,625 @@ +package rpc + +import ( + "context" + "crypto/tls" + "encoding/base64" + "fmt" + "log/slog" + "net" + "net/http" + "os" + "os/signal" + "strings" + "syscall" + "time" + + "connectrpc.com/connect" + "github.com/ethereum/go-ethereum/common" + "github.com/river-build/river/core/node/auth" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/events" + "github.com/river-build/river/core/node/nodes" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/protocol/protocolconnect" + "github.com/river-build/river/core/node/registries" + "github.com/river-build/river/core/node/storage" + "github.com/rs/cors" + "golang.org/x/net/http2" + "golang.org/x/net/http2/h2c" + httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" +) + +const ( + ServerModeFull = "full" + ServerModeInfo = "info" + ServerModeArchive = "archive" +) + +func (s *Service) Close() { + if s.httpServer != nil { + timeout := s.config.ShutdownTimeout + if timeout == 0 { + timeout = time.Second + } else if timeout <= time.Millisecond { + timeout = 0 + } + ctx := s.serverCtx + if timeout > 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(s.serverCtx, timeout) + defer cancel() + } + s.defaultLogger.Info("Shutting down http server", "timeout", timeout) + err := s.httpServer.Shutdown(ctx) + if err != nil { + if err != context.DeadlineExceeded { + s.defaultLogger.Error("failed to shutdown http server", "error", err) + } + s.defaultLogger.Warn("forcing http server close") + err = s.httpServer.Close() + if err != nil { + s.defaultLogger.Error("failed to close http server", "error", err) + } + } else { + s.defaultLogger.Info("http server shutdown") + } + } + + // Try closing listener just in case: maybe httpServer was not started + if s.listener != nil { + s.listener.Close() + } + + if s.storage != nil { + s.storage.Close(s.serverCtx) + } + + s.defaultLogger.Info("Server closed") +} + +func (s *Service) start() error { + s.startTime = time.Now() + + s.initInstance(ServerModeFull) + + err := s.initWallet() + if err != nil { + return AsRiverError(err).Message("Failed to init wallet").LogError(s.defaultLogger) + } + + err = s.initBaseChain() + if err != nil { + return AsRiverError(err).Message("Failed to init base chain").LogError(s.defaultLogger) + } + + err = s.initRiverChain() + if err != nil { + return AsRiverError(err).Message("Failed to init river chain").LogError(s.defaultLogger) + } + + err = s.prepareStore() + if err != nil { + return AsRiverError(err).Message("Failed to prepare store").LogError(s.defaultLogger) + } + + err = s.runHttpServer() + if err != nil { + return AsRiverError(err).Message("Failed to run http server").LogError(s.defaultLogger) + } + + if s.config.StandByOnStart { + err = s.standby() + if err != nil { + return AsRiverError(err).Message("Failed to standby").LogError(s.defaultLogger) + } + } + + err = s.initStore() + if err != nil { + return AsRiverError(err).Message("Failed to init store").LogError(s.defaultLogger) + } + + err = s.initCacheAndSync() + if err != nil { + return AsRiverError(err).Message("Failed to init cache and sync").LogError(s.defaultLogger) + } + + go s.riverChain.ChainMonitor.RunWithBlockPeriod( + s.serverCtx, + s.riverChain.Client, + s.riverChain.InitialBlockNum, + time.Duration(s.riverChain.Config.BlockTimeMs)*time.Millisecond, + ) + + s.initHandlers() + + s.SetStatus("OK") + + // Retrieve the TCP address of the listener + tcpAddr := s.listener.Addr().(*net.TCPAddr) + + // Get the port as an integer + port := tcpAddr.Port + s.defaultLogger.Info("Server started", "port", port, "https", s.config.UseHttps) + return nil +} + +func (s *Service) initInstance(mode string) { + s.mode = mode + s.instanceId = GenShortNanoid() + port := s.config.Port + if port == 0 && s.listener != nil { + addr := s.listener.Addr().(*net.TCPAddr) + if addr != nil { + port = addr.Port + } + } + s.defaultLogger = dlog.FromCtx(s.serverCtx).With( + "port", port, + "instanceId", s.instanceId, + "nodeType", "stream", + "mode", mode, + ) + s.serverCtx = dlog.CtxWithLog(s.serverCtx, s.defaultLogger) + s.defaultLogger.Info("Starting server", "config", s.config, "mode", mode) +} + +func (s *Service) initWallet() error { + ctx := s.serverCtx + var wallet *crypto.Wallet + var err error + if s.riverChain == nil { + // Read env var WALLETPRIVATEKEY or PRIVATE_KEY + privKey := os.Getenv("WALLETPRIVATEKEY") + if privKey == "" { + privKey = os.Getenv("PRIVATE_KEY") + } + if privKey != "" { + wallet, err = crypto.NewWalletFromPrivKey(ctx, privKey) + } else { + wallet, err = crypto.LoadWallet(ctx, crypto.WALLET_PATH_PRIVATE_KEY) + } + if err != nil { + return err + } + } else { + wallet = s.riverChain.Wallet + } + s.wallet = wallet + + // Add node address info to the logger + s.defaultLogger = s.defaultLogger.With("nodeAddress", wallet.Address.Hex()) + s.serverCtx = dlog.CtxWithLog(ctx, s.defaultLogger) + slog.SetDefault(s.defaultLogger) + + return nil +} + +func (s *Service) initBaseChain() error { + ctx := s.serverCtx + cfg := s.config + + if !s.config.DisableBaseChain { + baseChain, err := crypto.NewBlockchain(ctx, &s.config.BaseChain, nil) + if err != nil { + return err + } + + chainAuth, err := auth.NewChainAuth( + ctx, + baseChain, + &cfg.ArchitectContract, + cfg.BaseChain.LinkedWalletsLimit, + cfg.BaseChain.ContractCallsTimeoutMs, + ) + if err != nil { + return err + } + s.chainAuth = chainAuth + return nil + } else { + s.defaultLogger.Warn("Using fake auth for testing") + s.chainAuth = auth.NewFakeChainAuth() + return nil + } +} + +func (s *Service) initRiverChain() error { + ctx := s.serverCtx + var err error + if s.riverChain == nil { + s.riverChain, err = crypto.NewBlockchain(ctx, &s.config.RiverChain, s.wallet) + if err != nil { + return err + } + } + + s.registryContract, err = registries.NewRiverRegistryContract(ctx, s.riverChain, &s.config.RegistryContract) + if err != nil { + return err + } + + var walletAddress common.Address + if s.wallet != nil { + walletAddress = s.wallet.Address + } + s.nodeRegistry, err = nodes.LoadNodeRegistry( + ctx, s.registryContract, walletAddress, s.riverChain.InitialBlockNum, s.riverChain.ChainMonitor) + if err != nil { + return err + } + + s.onChainConfig, err = crypto.NewOnChainConfig( + ctx, s.riverChain.Client, s.registryContract.Address, s.riverChain.InitialBlockNum, s.riverChain.ChainMonitor) + if err != nil { + return err + } + + s.streamRegistry = nodes.NewStreamRegistry( + walletAddress, + s.nodeRegistry, + s.registryContract, + s.config.Stream.ReplicationFactor, + s.onChainConfig, + ) + + return nil +} + +func (s *Service) prepareStore() error { + switch s.config.StorageType { + case storage.StreamStorageTypePostgres: + var schema string + switch s.mode { + case ServerModeFull: + schema = storage.DbSchemaNameFromAddress(s.wallet.Address.Hex()) + case ServerModeArchive: + schema = storage.DbSchemaNameForArchive(s.config.Archive.ArchiveId) + default: + return RiverError( + Err_BAD_CONFIG, + "Server mode not supported for storage", + "mode", + s.mode, + ).Func("prepareStore") + } + + pool, err := storage.CreateAndValidatePgxPool(s.serverCtx, &s.config.Database, schema) + if err != nil { + return err + } + s.storagePoolInfo = pool + + return nil + default: + return RiverError( + Err_BAD_CONFIG, + "Unknown storage type", + "storageType", + s.config.StorageType, + ).Func("prepareStore") + } +} + +func (s *Service) runHttpServer() error { + ctx := s.serverCtx + log := dlog.FromCtx(ctx) + cfg := s.config + + var err error + if s.listener == nil { + if cfg.Port == 0 { + return RiverError(Err_BAD_CONFIG, "Port is not set") + } + address := fmt.Sprintf("%s:%d", cfg.Address, cfg.Port) + s.listener, err = net.Listen("tcp", address) + if err != nil { + return err + } + log.Info("Listening", "addr", address) + } else { + if cfg.Port != 0 { + log.Warn("Port is ignored when listener is provided") + } + } + + mux := httptrace.NewServeMux( + httptrace.WithResourceNamer( + func(r *http.Request) string { + return r.Method + " " + r.URL.Path + }, + ), + ) + s.mux = mux + + mux.HandleFunc("/info", s.handleInfo) + mux.HandleFunc("/status", s.handleStatus) + + corsMiddleware := cors.New(cors.Options{ + AllowCredentials: false, + Debug: cfg.Log.Level == "debug", + AllowedOrigins: []string{"*"}, + AllowedMethods: []string{"GET", "POST", "PUT", "DELETE"}, + // AllowedHeaders: []string{"*"} also works for CORS issues w/ OPTIONS requests + AllowedHeaders: []string{ + "Origin", + "X-Requested-With", + "Accept", + "Content-Type", + "X-Grpc-Web", + "X-User-Agent", + "User-Agent", + "Connect-Protocol-Version", + "x-river-request-id", + }, + }) + + address := fmt.Sprintf("%s:%d", cfg.Address, cfg.Port) + if cfg.UseHttps { + log.Info("Using TLS server") + if (cfg.TLSConfig.Cert == "") || (cfg.TLSConfig.Key == "") { + return RiverError(Err_BAD_CONFIG, "TLSConfig.Cert and TLSConfig.Key must be set if UseHttps is true") + } + + // Base 64 encoding can't contain ., if . is present then it's assumed it's a file path + if strings.Contains(cfg.TLSConfig.Cert, ".") || strings.Contains(cfg.TLSConfig.Key, ".") { + s.httpServer, err = createServerFromFile( + ctx, + address, + corsMiddleware.Handler(mux), + cfg.TLSConfig.Cert, + cfg.TLSConfig.Key, + ) + if err != nil { + return err + } + } else { + s.httpServer, err = createServerFromBase64(ctx, address, corsMiddleware.Handler(mux), cfg.TLSConfig.Cert, cfg.TLSConfig.Key) + if err != nil { + return err + } + } + + go s.serveTLS() + + return nil + } else { + log.Info("Using H2C server") + s.httpServer, err = createH2CServer(ctx, address, corsMiddleware.Handler(mux)) + if err != nil { + return err + } + + go s.serveH2C() + + return nil + } +} + +func (s *Service) serveTLS() { + // Run the server with graceful shutdown + err := s.httpServer.ServeTLS(s.listener, "", "") + if err != nil && err != http.ErrServerClosed { + s.defaultLogger.Error("ServeTLS failed", "err", err) + } else { + s.defaultLogger.Info("ServeTLS stopped") + } +} + +func (s *Service) serveH2C() { + // Run the server with graceful shutdown + err := s.httpServer.Serve(s.listener) + if err != nil && err != http.ErrServerClosed { + s.defaultLogger.Error("serveH2C failed", "err", err) + } else { + s.defaultLogger.Info("serveH2C stopped") + } +} + +func (s *Service) initStore() error { + ctx := s.serverCtx + log := s.defaultLogger + + switch s.config.StorageType { + case storage.StreamStorageTypePostgres: + store, err := storage.NewPostgresEventStore(ctx, s.storagePoolInfo, s.instanceId, s.exitSignal) + if err != nil { + return err + } + s.storage = store + + streamsCount, err := store.GetStreamsNumber(ctx) + if err != nil { + return err + } + + log.Info("Created postgres event store", "schema", s.storagePoolInfo.Schema, "totalStreamsCount", streamsCount) + return nil + default: + return RiverError( + Err_BAD_CONFIG, + "Unknown storage type", + "storageType", + s.config.StorageType, + ).Func("createStore") + } +} + +func (s *Service) initCacheAndSync() error { + var err error + s.cache, err = events.NewStreamCache( + s.serverCtx, + &events.StreamCacheParams{ + Storage: s.storage, + Wallet: s.wallet, + Riverchain: s.riverChain, + Registry: s.registryContract, + StreamConfig: &s.config.Stream, + }, + s.riverChain.InitialBlockNum, + s.riverChain.ChainMonitor, + ) + if err != nil { + return err + } + + s.syncHandler = NewSyncHandler( + s.wallet, + s.cache, + s.nodeRegistry, + s.streamRegistry, + ) + + return nil +} + +func (s *Service) initHandlers() { + interceptors := connect.WithInterceptors( + NewMetricsInterceptor(), + NewTimeoutInterceptor(s.config.Network.RequestTimeout), + ) + streamServicePattern, streamServiceHandler := protocolconnect.NewStreamServiceHandler(s, interceptors) + s.mux.Handle(streamServicePattern, newHttpHandler(streamServiceHandler, s.defaultLogger)) + + nodeServicePattern, nodeServiceHandler := protocolconnect.NewNodeToNodeHandler(s, interceptors) + s.mux.Handle(nodeServicePattern, nodeServiceHandler) + + s.registerDebugHandlers() +} + +// StartServer starts the server with the given configuration. +// riverchain and listener can be provided for testing purposes. +// Returns Service. +// Service.Close should be called to close listener, db connection and stop stop the server. +// Error is posted to Serivce.exitSignal if DB conflict is detected (newer instance is started) +// and server must exit. +func StartServer( + ctx context.Context, + cfg *config.Config, + riverChain *crypto.Blockchain, + listener net.Listener, +) (*Service, error) { + streamService := &Service{ + serverCtx: ctx, + config: cfg, + riverChain: riverChain, + listener: listener, + exitSignal: make(chan error, 1), + } + + err := streamService.start() + if err != nil { + streamService.Close() + return nil, err + } + + return streamService, nil +} + +func createServerFromBase64( + ctx context.Context, + address string, + handler http.Handler, + certStringBase64 string, + keyStringBase64 string, +) (*http.Server, error) { + certBytes, err := base64.StdEncoding.DecodeString(certStringBase64) + if err != nil { + return nil, err + } + keyBytes, err := base64.StdEncoding.DecodeString(keyStringBase64) + if err != nil { + return nil, err + } + + // Load the certificate and key from strings + cert, err := tls.X509KeyPair(certBytes, keyBytes) + if err != nil { + return nil, AsRiverError(err, Err_BAD_CONFIG). + Message("Failed to create X509KeyPair from strings"). + Func("createServerFromStrings") + } + + return &http.Server{ + Addr: address, + Handler: handler, + TLSConfig: &tls.Config{ + Certificates: []tls.Certificate{cert}, + }, + BaseContext: func(listener net.Listener) context.Context { + return ctx + }, + }, nil +} + +func createServerFromFile( + ctx context.Context, + address string, + handler http.Handler, + certFile, keyFile string, +) (*http.Server, error) { + // Read certificate and key from files + cert, err := tls.LoadX509KeyPair(certFile, keyFile) + if err != nil { + return nil, AsRiverError(err, Err_BAD_CONFIG). + Message("Failed to LoadX509KeyPair from files"). + Func("createServerFromFile") + } + + return &http.Server{ + Addr: address, + Handler: handler, + TLSConfig: &tls.Config{ + Certificates: []tls.Certificate{cert}, + }, + BaseContext: func(listener net.Listener) context.Context { + return ctx + }, + }, nil +} + +func createH2CServer(ctx context.Context, address string, handler http.Handler) (*http.Server, error) { + // Create an HTTP/2 server without TLS + h2s := &http2.Server{} + return &http.Server{ + Addr: address, + Handler: h2c.NewHandler(handler, h2s), + BaseContext: func(listener net.Listener) context.Context { + return ctx + }, + }, nil +} + +// Struct to match the JSON structure. +type CertKey struct { + Cert string `json:"cert"` + Key string `json:"key"` +} + +func RunServer(ctx context.Context, cfg *config.Config) error { + log := dlog.FromCtx(ctx) + + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + service, error := StartServer(ctx, cfg, nil, nil) + if error != nil { + log.Error("Failed to start server", "error", error) + return error + } + defer service.Close() + + osSignal := make(chan os.Signal, 1) + signal.Notify(osSignal, syscall.SIGINT, syscall.SIGTERM) + go func() { + sig := <-osSignal + log.Info("Got OS signal", "signal", sig.String()) + service.exitSignal <- nil + }() + + return <-service.exitSignal +} diff --git a/core/node/rpc/server_test.go b/core/node/rpc/server_test.go new file mode 100644 index 000000000..bda3e9f09 --- /dev/null +++ b/core/node/rpc/server_test.go @@ -0,0 +1,31 @@ +package rpc_test + +import ( + "testing" + + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/protocol" + + "connectrpc.com/connect" +) + +func TestServerShutdown(t *testing.T) { + tester := newServiceTesterAndStart(t, 1) + ctx := tester.ctx + require := tester.require + log := dlog.FromCtx(ctx) + + stub := tester.testClient(0) + url := tester.nodes[0].url + + _, err := stub.Info(ctx, connect.NewRequest(&protocol.InfoRequest{})) + require.NoError(err) + + log.Info("Shutting down server") + tester.nodes[0].Close(ctx, tester.dbUrl) + log.Info("Server shut down") + + stub2 := testClient(url) + _, err = stub2.Info(ctx, connect.NewRequest(&protocol.InfoRequest{})) + require.Error(err) +} diff --git a/core/node/rpc/service.go b/core/node/rpc/service.go new file mode 100644 index 000000000..b84f906ee --- /dev/null +++ b/core/node/rpc/service.go @@ -0,0 +1,92 @@ +package rpc + +import ( + "context" + "log/slog" + "net" + "net/http" + "sync/atomic" + "time" + + "github.com/river-build/river/core/node/auth" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/events" + "github.com/river-build/river/core/node/infra" + "github.com/river-build/river/core/node/nodes" + . "github.com/river-build/river/core/node/protocol/protocolconnect" + "github.com/river-build/river/core/node/registries" + "github.com/river-build/river/core/node/storage" +) + +var serviceRequests = infra.NewSuccessMetrics(infra.RPC_CATEGORY, nil) + +type Service struct { + // Context and config + serverCtx context.Context + config *config.Config + instanceId string + defaultLogger *slog.Logger + wallet *crypto.Wallet + startTime time.Time + mode string + + // exitSignal is used to report critical errors from background task and RPC handlers + // that should cause the service to stop. For example, if new instance for + // the same database is started, the old one should stop. + exitSignal chan error + + // Storage + storagePoolInfo *storage.PgxPoolInfo + storage storage.StreamStorage + + // Streams + cache events.StreamCache + syncHandler SyncHandler + + // River chain + riverChain *crypto.Blockchain + registryContract *registries.RiverRegistryContract + nodeRegistry nodes.NodeRegistry + streamRegistry nodes.StreamRegistry + onChainConfig crypto.OnChainConfiguration + + // Base chain + chainAuth auth.ChainAuth + + // Network + listener net.Listener + httpServer *http.Server + mux httpMux + + // Status string + status atomic.Pointer[string] + + // Archiver if in archive mode + Archiver *Archiver +} + +var ( + _ StreamServiceHandler = (*Service)(nil) + _ NodeToNodeHandler = (*Service)(nil) +) + +func (s *Service) ExitSignal() chan error { + return s.exitSignal +} + +func (s *Service) SetStatus(status string) { + s.status.Store(&status) +} + +func (s *Service) GetStatus() string { + status := s.status.Load() + if status == nil { + return "STARTING" + } + return *status +} + +func (s *Service) Storage() storage.StreamStorage { + return s.storage +} diff --git a/core/node/rpc/service_test.go b/core/node/rpc/service_test.go new file mode 100644 index 000000000..f7f67ebe6 --- /dev/null +++ b/core/node/rpc/service_test.go @@ -0,0 +1,1024 @@ +package rpc_test + +import ( + "context" + "crypto/tls" + "fmt" + "net" + "net/http" + "os" + "strconv" + "testing" + + "github.com/river-build/river/core/node/contracts" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/events" + "github.com/river-build/river/core/node/nodes" + "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/protocol/protocolconnect" + . "github.com/river-build/river/core/node/shared" + "github.com/river-build/river/core/node/testutils" + "golang.org/x/net/http2" + + "connectrpc.com/connect" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + eth_crypto "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/proto" +) + +func setupTestHttpClient() { + nodes.TestHttpClientMaker = func() *http.Client { + return &http.Client{ + Transport: &http2.Transport{ + // So http2.Transport doesn't complain the URL scheme isn't 'https' + AllowHTTP: true, + // Pretend we are dialing a TLS endpoint. (Note, we ignore the passed tls.Config) + DialTLSContext: func(ctx context.Context, network, addr string, cfg *tls.Config) (net.Conn, error) { + var d net.Dialer + return d.DialContext(ctx, network, addr) + }, + }, + } + } +} + +func TestMain(m *testing.M) { + setupTestHttpClient() + os.Exit(m.Run()) +} + +func createUserDeviceKeyStream( + ctx context.Context, + wallet *crypto.Wallet, + client protocolconnect.StreamServiceClient, + streamSettings *protocol.StreamSettings, +) (*protocol.SyncCookie, []byte, error) { + userDeviceKeyStreamId := UserDeviceKeyStreamIdFromAddress(wallet.Address) + inception, err := events.MakeEnvelopeWithPayload( + wallet, + events.Make_UserDeviceKeyPayload_Inception(userDeviceKeyStreamId, streamSettings), + nil, + ) + if err != nil { + return nil, nil, err + } + res, err := client.CreateStream(ctx, connect.NewRequest(&protocol.CreateStreamRequest{ + Events: []*protocol.Envelope{inception}, + StreamId: userDeviceKeyStreamId[:], + })) + if err != nil { + return nil, nil, err + } + return res.Msg.Stream.NextSyncCookie, inception.Hash, nil +} + +func makeDelegateSig(primaryWallet *crypto.Wallet, deviceWallet *crypto.Wallet, expiryEpochMs int64) ([]byte, error) { + devicePubKey := eth_crypto.FromECDSAPub(&deviceWallet.PrivateKeyStruct.PublicKey) + hashSrc, err := crypto.RiverDelegateHashSrc(devicePubKey, expiryEpochMs) + if err != nil { + return nil, err + } + hash := accounts.TextHash(hashSrc) + delegatSig, err := primaryWallet.SignHash(hash) + return delegatSig, err +} + +func createUserWithMismatchedId( + ctx context.Context, + wallet *crypto.Wallet, + client protocolconnect.StreamServiceClient, +) (*protocol.SyncCookie, []byte, error) { + userStreamId := UserStreamIdFromAddr(wallet.Address) + inception, err := events.MakeEnvelopeWithPayload( + wallet, + events.Make_UserPayload_Inception( + userStreamId, + nil, + ), + nil, + ) + if err != nil { + return nil, nil, err + } + badId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + res, err := client.CreateStream(ctx, connect.NewRequest(&protocol.CreateStreamRequest{ + Events: []*protocol.Envelope{inception}, + StreamId: badId[:], + })) + if err != nil { + return nil, nil, err + } + return res.Msg.Stream.NextSyncCookie, inception.Hash, nil +} + +func createUser( + ctx context.Context, + wallet *crypto.Wallet, + client protocolconnect.StreamServiceClient, + streamSettings *protocol.StreamSettings, +) (*protocol.SyncCookie, []byte, error) { + userStreamId := UserStreamIdFromAddr(wallet.Address) + inception, err := events.MakeEnvelopeWithPayload( + wallet, + events.Make_UserPayload_Inception( + userStreamId, + streamSettings, + ), + nil, + ) + if err != nil { + return nil, nil, err + } + res, err := client.CreateStream(ctx, connect.NewRequest(&protocol.CreateStreamRequest{ + Events: []*protocol.Envelope{inception}, + StreamId: userStreamId[:], + })) + if err != nil { + return nil, nil, err + } + return res.Msg.Stream.NextSyncCookie, inception.Hash, nil +} + +func createUserSettingsStream( + ctx context.Context, + wallet *crypto.Wallet, + client protocolconnect.StreamServiceClient, + streamSettings *protocol.StreamSettings, +) (StreamId, *protocol.SyncCookie, []byte, error) { + streamdId := UserSettingStreamIdFromAddr(wallet.Address) + inception, err := events.MakeEnvelopeWithPayload( + wallet, + events.Make_UserSettingsPayload_Inception(streamdId, streamSettings), + nil, + ) + if err != nil { + return StreamId{}, nil, nil, err + } + res, err := client.CreateStream(ctx, connect.NewRequest(&protocol.CreateStreamRequest{ + Events: []*protocol.Envelope{inception}, + StreamId: streamdId[:], + })) + if err != nil { + return StreamId{}, nil, nil, err + } + return streamdId, res.Msg.Stream.NextSyncCookie, inception.Hash, nil +} + +func createSpace( + ctx context.Context, + wallet *crypto.Wallet, + client protocolconnect.StreamServiceClient, + spaceStreamId StreamId, + streamSettings *protocol.StreamSettings, +) (*protocol.SyncCookie, []byte, error) { + space, err := events.MakeEnvelopeWithPayload( + wallet, + events.Make_SpacePayload_Inception(spaceStreamId, streamSettings), + nil, + ) + if err != nil { + return nil, nil, err + } + userId, err := AddressHex(wallet.Address.Bytes()) + if err != nil { + return nil, nil, err + } + joinSpace, err := events.MakeEnvelopeWithPayload( + wallet, + events.Make_SpacePayload_Membership( + protocol.MembershipOp_SO_JOIN, + userId, + userId, + ), + nil, + ) + if err != nil { + return nil, nil, err + } + + resspace, err := client.CreateStream(ctx, connect.NewRequest(&protocol.CreateStreamRequest{ + Events: []*protocol.Envelope{space, joinSpace}, + StreamId: spaceStreamId[:], + }, + )) + if err != nil { + return nil, nil, err + } + + return resspace.Msg.Stream.NextSyncCookie, joinSpace.Hash, nil +} + +func createChannel( + ctx context.Context, + wallet *crypto.Wallet, + client protocolconnect.StreamServiceClient, + spaceId StreamId, + channelStreamId StreamId, + streamSettings *protocol.StreamSettings, +) (*protocol.SyncCookie, []byte, error) { + var channelProperties protocol.EncryptedData + channelProperties.Ciphertext = "encrypted text supposed to be here" + channel, err := events.MakeEnvelopeWithPayload( + wallet, + events.Make_ChannelPayload_Inception( + channelStreamId, + spaceId, + &channelProperties, + streamSettings, + ), + nil, + ) + if err != nil { + return nil, nil, err + } + userId, err := AddressHex(wallet.Address.Bytes()) + if err != nil { + return nil, nil, err + } + joinChannel, err := events.MakeEnvelopeWithPayload( + wallet, + events.Make_ChannelPayload_Membership( + protocol.MembershipOp_SO_JOIN, + userId, + userId, + &spaceId, + ), + nil, + ) + if err != nil { + return nil, nil, err + } + reschannel, err := client.CreateStream(ctx, connect.NewRequest(&protocol.CreateStreamRequest{ + Events: []*protocol.Envelope{channel, joinChannel}, + StreamId: channelStreamId[:], + }, + )) + if err != nil { + return nil, nil, err + } + if len(reschannel.Msg.Stream.Miniblocks) == 0 { + return nil, nil, fmt.Errorf("expected at least one miniblock") + } + miniblockHash := reschannel.Msg.Stream.Miniblocks[len(reschannel.Msg.Stream.Miniblocks)-1].Header.Hash + return reschannel.Msg.Stream.NextSyncCookie, miniblockHash, nil +} + +func addUserBlockedFillerEvent( + ctx context.Context, + wallet *crypto.Wallet, + client protocolconnect.StreamServiceClient, + streamId StreamId, + prevMiniblockHash []byte, +) error { + if prevMiniblockHash == nil { + resp, err := client.GetLastMiniblockHash(ctx, connect.NewRequest(&protocol.GetLastMiniblockHashRequest{ + StreamId: streamId[:], + })) + if err != nil { + return err + } + prevMiniblockHash = resp.Msg.Hash + } + + addr := crypto.GetTestAddress() + ev, err := events.MakeEnvelopeWithPayload( + wallet, + events.Make_UserSettingsPayload_UserBlock( + &protocol.UserSettingsPayload_UserBlock{ + UserId: addr[:], + IsBlocked: true, + EventNum: 22, + }, + ), + prevMiniblockHash, + ) + if err != nil { + return err + } + _, err = client.AddEvent(ctx, connect.NewRequest(&protocol.AddEventRequest{ + StreamId: streamId[:], + Event: ev, + })) + return err +} + +func makeMiniblock( + ctx context.Context, + client protocolconnect.StreamServiceClient, + streamId StreamId, + forceSnapshot bool, + lastKnownMiniblockNum int64, +) ([]byte, int64, error) { + resp, err := client.Info(ctx, connect.NewRequest(&protocol.InfoRequest{ + Debug: []string{ + "make_miniblock", + streamId.String(), + fmt.Sprintf("%t", forceSnapshot), + fmt.Sprintf("%d", lastKnownMiniblockNum), + }, + })) + if err != nil { + return nil, -1, err + } + var hashBytes []byte + if resp.Msg.Graffiti != "" { + hashBytes = common.FromHex(resp.Msg.Graffiti) + } + num := int64(-1) + if resp.Msg.Version != "" { + num, _ = strconv.ParseInt(resp.Msg.Version, 10, 64) + } + return hashBytes, num, nil +} + +func testMethods(tester *serviceTester) { + testMethodsWithClient(tester, tester.testClient(0)) +} + +func testMethodsWithClient(tester *serviceTester, client protocolconnect.StreamServiceClient) { + ctx := tester.ctx + require := tester.require + + wallet1, _ := crypto.NewWallet(ctx) + wallet2, _ := crypto.NewWallet(ctx) + + response, err := client.Info(ctx, connect.NewRequest(&protocol.InfoRequest{})) + require.NoError(err) + require.Equal("River Node welcomes you!", response.Msg.Graffiti) + + _, err = client.CreateStream(ctx, connect.NewRequest(&protocol.CreateStreamRequest{})) + require.Error(err) + + _, _, err = createUserWithMismatchedId(ctx, wallet1, client) + require.Error(err) // expected Error when calling CreateStream with mismatched id + + userStreamId := UserStreamIdFromAddr(wallet1.Address) + + // if optional is true, stream should be nil instead of throwing an error + resp, err := client.GetStream(ctx, connect.NewRequest(&protocol.GetStreamRequest{ + StreamId: userStreamId[:], + Optional: true, + })) + require.NoError(err) + require.Nil(resp.Msg.Stream, "expected user stream to not exist") + + // if optional is false, error should be thrown + _, err = client.GetStream(ctx, connect.NewRequest(&protocol.GetStreamRequest{ + StreamId: userStreamId[:], + })) + require.Error(err) + + // create user stream for user 1 + res, _, err := createUser(ctx, wallet1, client, nil) + require.NoError(err) + require.NotNil(res, "nil sync cookie") + + _, _, err = createUserDeviceKeyStream(ctx, wallet1, client, nil) + require.NoError(err) + + // get stream optional should now return not nil + resp, err = client.GetStream(ctx, connect.NewRequest(&protocol.GetStreamRequest{ + StreamId: userStreamId[:], + Optional: true, + })) + require.NoError(err) + require.NotNil(resp.Msg, "expected user stream to not exist") + + // create user stream for user 2 + resuser, _, err := createUser(ctx, wallet2, client, nil) + require.NoError(err) + require.NotNil(resuser, "nil sync cookie") + + _, _, err = createUserDeviceKeyStream(ctx, wallet2, client, nil) + require.NoError(err) + + // create space + spaceId := testutils.FakeStreamId(STREAM_SPACE_BIN) + resspace, _, err := createSpace(ctx, wallet1, client, spaceId, nil) + require.NoError(err) + require.NotNil(resspace, "nil sync cookie") + + // create channel + channelId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + channel, channelHash, err := createChannel( + ctx, + wallet1, + client, + spaceId, + channelId, + &protocol.StreamSettings{ + DisableMiniblockCreation: true, + }, + ) + require.NoError(err) + require.NotNil(channel, "nil sync cookie") + + // user2 joins channel + userJoin, err := events.MakeEnvelopeWithPayload( + wallet2, + events.Make_UserPayload_Membership( + protocol.MembershipOp_SO_JOIN, + channelId, + nil, + spaceId[:], + ), + resuser.PrevMiniblockHash, + ) + require.NoError(err) + + _, err = client.AddEvent( + ctx, + connect.NewRequest( + &protocol.AddEventRequest{ + StreamId: resuser.StreamId, + Event: userJoin, + }, + ), + ) + require.NoError(err) + + _, newMbNum, err := makeMiniblock(ctx, client, channelId, false, 0) + require.NoError(err) + require.Greater(newMbNum, int64(0)) + + message, err := events.MakeEnvelopeWithPayload( + wallet2, + events.Make_ChannelPayload_Message("hello"), + channelHash, + ) + require.NoError(err) + + _, err = client.AddEvent( + ctx, + connect.NewRequest( + &protocol.AddEventRequest{ + StreamId: channelId[:], + Event: message, + }, + ), + ) + require.NoError(err) + + _, newMbNum2, err := makeMiniblock(ctx, client, channelId, false, 0) + require.NoError(err) + require.Greater(newMbNum2, newMbNum) + + _, err = client.GetMiniblocks(ctx, connect.NewRequest(&protocol.GetMiniblocksRequest{ + StreamId: channelId[:], + FromInclusive: 0, + ToExclusive: 1, + })) + require.NoError(err) + + syncCtx, syncCancel := context.WithCancel(ctx) + syncRes, err := client.SyncStreams( + syncCtx, + connect.NewRequest( + &protocol.SyncStreamsRequest{ + SyncPos: []*protocol.SyncCookie{ + channel, + }, + }, + ), + ) + require.NoError(err) + + syncRes.Receive() + // verify the first message is new a sync + syncRes.Receive() + msg := syncRes.Msg() + require.NotNil(msg.SyncId, "expected non-nil sync id") + require.True(len(msg.SyncId) > 0, "expected non-empty sync id") + msg = syncRes.Msg() + syncCancel() + + require.NotNil(msg.Stream, "expected non-nil stream") + + // join, miniblock, message, miniblock + require.Equal(4, len(msg.Stream.Events), "expected 4 events") + + var payload protocol.StreamEvent + err = proto.Unmarshal(msg.Stream.Events[len(msg.Stream.Events)-2].Event, &payload) + require.NoError(err) + switch p := payload.Payload.(type) { + case *protocol.StreamEvent_ChannelPayload: + // ok + switch p.ChannelPayload.Content.(type) { + case *protocol.ChannelPayload_Message: + // ok + default: + require.FailNow("expected message event, got %v", p.ChannelPayload.Content) + } + default: + require.FailNow("expected channel event, got %v", payload.Payload) + } +} + +func testRiverDeviceId(tester *serviceTester) { + ctx := tester.ctx + require := tester.require + client := tester.testClient(0) + + wallet, _ := crypto.NewWallet(ctx) + deviceWallet, _ := crypto.NewWallet(ctx) + + resuser, _, err := createUser(ctx, wallet, client, nil) + require.NoError(err) + require.NotNil(resuser) + + _, _, err = createUserDeviceKeyStream(ctx, wallet, client, nil) + require.NoError(err) + + spaceId := testutils.FakeStreamId(STREAM_SPACE_BIN) + space, _, err := createSpace(ctx, wallet, client, spaceId, nil) + require.NoError(err) + require.NotNil(space) + + channelId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + channel, channelHash, err := createChannel(ctx, wallet, client, spaceId, channelId, nil) + require.NoError(err) + require.NotNil(channel) + + delegateSig, err := makeDelegateSig(wallet, deviceWallet, 0) + require.NoError(err) + + event, err := events.MakeDelegatedStreamEvent( + wallet, + events.Make_ChannelPayload_Message( + "try to send a message without RDK", + ), + channelHash, + delegateSig, + ) + require.NoError(err) + msg, err := events.MakeEnvelopeWithEvent( + deviceWallet, + event, + ) + require.NoError(err) + + _, err = client.AddEvent( + ctx, + connect.NewRequest( + &protocol.AddEventRequest{ + StreamId: channelId[:], + Event: msg, + }, + ), + ) + require.NoError(err) + + _, err = client.AddEvent( + ctx, + connect.NewRequest( + &protocol.AddEventRequest{ + StreamId: channelId[:], + Event: msg, + }, + ), + ) + require.Error(err) // expected error when calling AddEvent +} + +func testSyncStreams(tester *serviceTester) { + ctx := tester.ctx + require := tester.require + client := tester.testClient(0) + + // create the streams for a user + wallet, _ := crypto.NewWallet(ctx) + _, _, err := createUser(ctx, wallet, client, nil) + require.Nilf(err, "error calling createUser: %v", err) + _, _, err = createUserDeviceKeyStream(ctx, wallet, client, nil) + require.Nilf(err, "error calling createUserDeviceKeyStream: %v", err) + // create space + spaceId := testutils.FakeStreamId(STREAM_SPACE_BIN) + space1, _, err := createSpace(ctx, wallet, client, spaceId, nil) + require.Nilf(err, "error calling createSpace: %v", err) + require.NotNil(space1, "nil sync cookie") + // create channel + channelId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + channel1, channelHash, err := createChannel(ctx, wallet, client, spaceId, channelId, nil) + require.Nilf(err, "error calling createChannel: %v", err) + require.NotNil(channel1, "nil sync cookie") + + /** + Act + */ + // sync streams + syncCtx, syncCancel := context.WithCancel(ctx) + syncRes, err := client.SyncStreams( + syncCtx, + connect.NewRequest( + &protocol.SyncStreamsRequest{ + SyncPos: []*protocol.SyncCookie{ + channel1, + }, + }, + ), + ) + require.Nilf(err, "error calling SyncStreams: %v", err) + // get the syncId for requires later + syncRes.Receive() + syncId := syncRes.Msg().SyncId + // add an event to verify that sync is working + message, err := events.MakeEnvelopeWithPayload( + wallet, + events.Make_ChannelPayload_Message("hello"), + channelHash, + ) + require.Nilf(err, "error creating message event: %v", err) + _, err = client.AddEvent( + ctx, + connect.NewRequest( + &protocol.AddEventRequest{ + StreamId: channelId[:], + Event: message, + }, + ), + ) + require.Nilf(err, "error calling AddEvent: %v", err) + // wait for the sync + syncRes.Receive() + msg := syncRes.Msg() + // stop the sync loop + syncCancel() + + /** + requires + */ + require.NotEmpty(syncId, "expected non-empty sync id") + require.NotNil(msg.Stream, "expected 1 stream") + require.Equal(syncId, msg.SyncId, "expected sync id to match") +} + +func testAddStreamsToSync(tester *serviceTester) { + ctx := tester.ctx + require := tester.require + aliceClient := tester.testClient(0) + + // create alice's wallet and streams + aliceWallet, _ := crypto.NewWallet(ctx) + alice, _, err := createUser(ctx, aliceWallet, aliceClient, nil) + require.Nilf(err, "error calling createUser: %v", err) + require.NotNil(alice, "nil sync cookie for alice") + _, _, err = createUserDeviceKeyStream(ctx, aliceWallet, aliceClient, nil) + require.Nilf(err, "error calling createUserDeviceKeyStream: %v", err) + + // create bob's client, wallet, and streams + bobClient := tester.testClient(0) + bobWallet, _ := crypto.NewWallet(ctx) + bob, _, err := createUser(ctx, bobWallet, bobClient, nil) + require.Nilf(err, "error calling createUser: %v", err) + require.NotNil(bob, "nil sync cookie for bob") + _, _, err = createUserDeviceKeyStream(ctx, bobWallet, bobClient, nil) + require.Nilf(err, "error calling createUserDeviceKeyStream: %v", err) + // alice creates a space + spaceId := testutils.FakeStreamId(STREAM_SPACE_BIN) + space1, _, err := createSpace(ctx, aliceWallet, aliceClient, spaceId, nil) + require.Nilf(err, "error calling createSpace: %v", err) + require.NotNil(space1, "nil sync cookie") + // alice creates a channel + channelId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + channel1, channelHash, err := createChannel( + ctx, + aliceWallet, + aliceClient, + spaceId, + channelId, + nil, + ) + require.Nilf(err, "error calling createChannel: %v", err) + require.NotNil(channel1, "nil sync cookie") + + /** + Act + */ + // bob sync streams + syncCtx, syncCancel := context.WithCancel(ctx) + syncRes, err := bobClient.SyncStreams( + syncCtx, + connect.NewRequest( + &protocol.SyncStreamsRequest{ + SyncPos: []*protocol.SyncCookie{}, + }, + ), + ) + require.Nilf(err, "error calling SyncStreams: %v", err) + // get the syncId for requires later + syncRes.Receive() + syncId := syncRes.Msg().SyncId + // add an event to verify that sync is working + message, err := events.MakeEnvelopeWithPayload( + aliceWallet, + events.Make_ChannelPayload_Message("hello"), + channelHash, + ) + require.Nilf(err, "error creating message event: %v", err) + _, err = aliceClient.AddEvent( + ctx, + connect.NewRequest( + &protocol.AddEventRequest{ + StreamId: channelId[:], + Event: message, + }, + ), + ) + require.Nilf(err, "error calling AddEvent: %v", err) + // bob adds alice's stream to sync + _, err = bobClient.AddStreamToSync( + ctx, + connect.NewRequest( + &protocol.AddStreamToSyncRequest{ + SyncId: syncId, + SyncPos: channel1, + }, + ), + ) + require.Nilf(err, "error calling AddStreamsToSync: %v", err) + // wait for the sync + syncRes.Receive() + msg := syncRes.Msg() + // stop the sync loop + syncCancel() + + /** + requires + */ + require.NotEmpty(syncId, "expected non-empty sync id") + require.NotNil(msg.Stream, "expected 1 stream") + require.Equal(syncId, msg.SyncId, "expected sync id to match") +} + +func testRemoveStreamsFromSync(tester *serviceTester) { + ctx := tester.ctx + require := tester.require + aliceClient := tester.testClient(0) + log := dlog.FromCtx(ctx) + + // create alice's wallet and streams + aliceWallet, _ := crypto.NewWallet(ctx) + alice, _, err := createUser(ctx, aliceWallet, aliceClient, nil) + require.Nilf(err, "error calling createUser: %v", err) + require.NotNil(alice, "nil sync cookie for alice") + _, _, err = createUserDeviceKeyStream(ctx, aliceWallet, aliceClient, nil) + require.NoError(err) + + // create bob's client, wallet, and streams + bobClient := tester.testClient(0) + bobWallet, _ := crypto.NewWallet(ctx) + bob, _, err := createUser(ctx, bobWallet, bobClient, nil) + require.Nilf(err, "error calling createUser: %v", err) + require.NotNil(bob, "nil sync cookie for bob") + _, _, err = createUserDeviceKeyStream(ctx, bobWallet, bobClient, nil) + require.Nilf(err, "error calling createUserDeviceKeyStream: %v", err) + // alice creates a space + spaceId := testutils.FakeStreamId(STREAM_SPACE_BIN) + space1, _, err := createSpace(ctx, aliceWallet, aliceClient, spaceId, nil) + require.Nilf(err, "error calling createSpace: %v", err) + require.NotNil(space1, "nil sync cookie") + // alice creates a channel + channelId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + channel1, channelHash, err := createChannel(ctx, aliceWallet, aliceClient, spaceId, channelId, nil) + require.Nilf(err, "error calling createChannel: %v", err) + require.NotNil(channel1, "nil sync cookie") + // bob sync streams + syncCtx, syncCancel := context.WithCancel(ctx) + syncRes, err := bobClient.SyncStreams( + syncCtx, + connect.NewRequest( + &protocol.SyncStreamsRequest{ + SyncPos: []*protocol.SyncCookie{}, + }, + ), + ) + require.Nilf(err, "error calling SyncStreams: %v", err) + // get the syncId for requires later + syncRes.Receive() + syncId := syncRes.Msg().SyncId + + // add an event to verify that sync is working + message1, err := events.MakeEnvelopeWithPayload( + aliceWallet, + events.Make_ChannelPayload_Message("hello"), + channelHash, + ) + require.Nilf(err, "error creating message event: %v", err) + _, err = aliceClient.AddEvent( + ctx, + connect.NewRequest( + &protocol.AddEventRequest{ + StreamId: channelId[:], + Event: message1, + }, + ), + ) + require.Nilf(err, "error calling AddEvent: %v", err) + + // bob adds alice's stream to sync + resp, err := bobClient.AddStreamToSync( + ctx, + connect.NewRequest( + &protocol.AddStreamToSyncRequest{ + SyncId: syncId, + SyncPos: channel1, + }, + ), + ) + require.Nilf(err, "error calling AddStreamsToSync: %v", err) + log.Info("AddStreamToSync", "resp", resp) + // When AddEvent is called, node calls streamImpl.notifyToSubscribers() twice + // for different events. See hnt-3683 for explanation. First event is for + // the externally added event (by AddEvent). Second event is the miniblock + // event with headers. + // drain the events + receivedCount := 0 +OuterLoop: + for syncRes.Receive() { + update := syncRes.Msg() + log.Info("received update", "update", update) + if update.Stream != nil { + sEvents := update.Stream.Events + for _, envelope := range sEvents { + receivedCount++ + parsedEvent, _ := events.ParseEvent(envelope) + log.Info("received update inner loop", "envelope", parsedEvent) + if parsedEvent != nil && parsedEvent.Event.GetMiniblockHeader() != nil { + break OuterLoop + } + } + } + } + + require.Equal(2, receivedCount, "expected 2 events") + /** + Act + */ + // bob removes alice's stream to sync + removeRes, err := bobClient.RemoveStreamFromSync( + ctx, + connect.NewRequest( + &protocol.RemoveStreamFromSyncRequest{ + SyncId: syncId, + StreamId: channelId[:], + }, + ), + ) + require.Nilf(err, "error calling RemoveStreamsFromSync: %v", err) + + // alice sends another message + message2, err := events.MakeEnvelopeWithPayload( + aliceWallet, + events.Make_ChannelPayload_Message("world"), + channelHash, + ) + require.Nilf(err, "error creating message event: %v", err) + _, err = aliceClient.AddEvent( + ctx, + connect.NewRequest( + &protocol.AddEventRequest{ + StreamId: channelId[:], + Event: message2, + }, + ), + ) + require.Nilf(err, "error calling AddEvent: %v", err) + + /** + For debugging only. Uncomment to see syncRes.Receive() block. + bobClient's syncRes no longer receives the latest events from alice. + + // wait to see if we got a message. We shouldn't. + // uncomment: syncRes.Receive() + */ + syncCancel() + + /** + requires + */ + require.NotEmpty(syncId, "expected non-empty sync id") + require.NotNil(removeRes.Msg, "expected non-nil remove response") +} + +type testFunc func(*serviceTester) + +func run(t *testing.T, numNodes int, tf testFunc) { + tf(newServiceTesterAndStart(t, numNodes)) +} + +func TestSingleAndMulti(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + test testFunc + }{ + {"testMethods", testMethods}, + {"testRiverDeviceId", testRiverDeviceId}, + {"testSyncStreams", testSyncStreams}, + {"testAddStreamsToSync", testAddStreamsToSync}, + {"testRemoveStreamsFromSync", testRemoveStreamsFromSync}, + } + + t.Run("single", func(t *testing.T) { + t.Parallel() + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + run(t, 1, tt.test) + }) + } + }) + + t.Run("multi", func(t *testing.T) { + t.Parallel() + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + run(t, 10, tt.test) + }) + } + }) +} + +// This number is large enough that we're pretty much guaranteed to have a node forward a request to +// another node that is down. +const TestStreams = 40 + +func TestForwardingWithRetries(t *testing.T) { + t.Parallel() + + tests := map[string]func(t *testing.T, ctx context.Context, client protocolconnect.StreamServiceClient, streamId StreamId){ + "GetStream": func(t *testing.T, ctx context.Context, client protocolconnect.StreamServiceClient, streamId StreamId) { + resp, err := client.GetStream(ctx, connect.NewRequest(&protocol.GetStreamRequest{ + StreamId: streamId[:], + })) + require.NoError(t, err) + require.NotNil(t, resp) + require.Equal(t, streamId[:], resp.Msg.Stream.NextSyncCookie.StreamId) + }, + "GetStreamEx": func(t *testing.T, ctx context.Context, client protocolconnect.StreamServiceClient, streamId StreamId) { + resp, err := client.GetStreamEx(ctx, connect.NewRequest(&protocol.GetStreamExRequest{ + StreamId: streamId[:], + })) + require.NoError(t, err) + + // Read messages + msgs := make([]*protocol.GetStreamExResponse, 0) + for resp.Receive() { + msgs = append(msgs, resp.Msg()) + } + require.NoError(t, resp.Err()) + // Expect 1 miniblock, 1 empty minipool message. + require.Len(t, msgs, 2) + }, + } + + for testName, requester := range tests { + t.Run(testName, func(t *testing.T) { + numNodes := 5 + replicationFactor := 3 + serviceTester := newServiceTesterWithReplication(t, numNodes, replicationFactor) + serviceTester.initNodeRecords(0, numNodes, contracts.NodeStatus_Operational) + serviceTester.startNodes(0, numNodes) + + ctx := serviceTester.ctx + + userStreamIds := make([]StreamId, 0, TestStreams) + + // Stream registry seems biased to allocate locally so we'll make requests from a different node + // to increase likelyhood of retries. + client0 := serviceTester.testClient(0) + client4 := serviceTester.testClient(4) + + // Allocate TestStreams user streams + for i := 0; i < TestStreams; i++ { + // Create a user stream + wallet, err := crypto.NewWallet(ctx) + require.NoError(t, err) + + res, _, err := createUser(ctx, wallet, client0, nil) + streamId := UserStreamIdFromAddr(wallet.Address) + require.NoError(t, err) + require.NotNil(t, res, "nil sync cookie") + userStreamIds = append(userStreamIds, streamId) + + _, err = client0.Info(ctx, connect.NewRequest(&protocol.InfoRequest{ + Debug: []string{"make_miniblock", streamId.String(), "false"}, + })) + require.NoError(t, err) + } + + // Shut down replicationfactor - 1 nodes. All streams should still be available, but many + // stream requests should result in at least some retries. + serviceTester.CloseNode(0) + serviceTester.CloseNode(1) + + // All stream requests should succeed. + for _, streamId := range userStreamIds { + requester(t, ctx, client4, streamId) + } + }) + } +} diff --git a/core/node/rpc/shutdown_test.go b/core/node/rpc/shutdown_test.go new file mode 100644 index 000000000..7611f2f36 --- /dev/null +++ b/core/node/rpc/shutdown_test.go @@ -0,0 +1,38 @@ +package rpc_test + +import ( + "net" + "testing" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/contracts" + . "github.com/river-build/river/core/node/protocol" +) + +func TestShutdown(t *testing.T) { + tester := newServiceTester(t, 1) + require := tester.require + + tester.initNodeRecords(0, 1, contracts.NodeStatus_Operational) + tester.startNodes(0, 1) + + first := tester.nodes[0].service + + // Setup shutdown monitor + exitStatus := make(chan error) + go func() { + firstExit := <-first.ExitSignal() + first.Close() + exitStatus <- firstExit + }() + + listener, err := net.Listen("tcp", "localhost:0") + require.NoError(err) + + // Start the second node with same address + require.NoError(tester.startSingle(0, startOpts{listeners: []net.Listener{listener}})) + + firstErr := <-exitStatus + require.Error(firstErr) + require.Equal(Err_RESOURCE_EXHAUSTED, AsRiverError(firstErr).Code) +} diff --git a/core/node/rpc/standby.go b/core/node/rpc/standby.go new file mode 100644 index 000000000..0ac271c4c --- /dev/null +++ b/core/node/rpc/standby.go @@ -0,0 +1,104 @@ +package rpc + +import ( + "encoding/json" + "net/http" + "time" + + "github.com/river-build/river/core/node/http_client" + "github.com/river-build/river/core/node/nodes" + "github.com/river-build/river/core/node/rpc/statusinfo" +) + +func (s *Service) standby() error { + ctx := s.serverCtx + log := s.defaultLogger + + s.SetStatus("STANDBY") + + pollPeriod := s.config.StandByPollPeriod + if pollPeriod <= 0 { + pollPeriod = 500 * time.Millisecond + } + + log.Info("Standby: entering standby mode", "poll_period", pollPeriod) + + // In a loop, query JSON from /status and exit when returned instanceId is matching local instanceId. + // This means that routing has been switched to this instance. + for first := true; ; first = false { + if !first { + time.Sleep(pollPeriod) + } + + // TODO: make here client with disabled keep-alive. + var client *http.Client + var err error + if nodes.TestHttpClientMaker != nil { + client = nodes.TestHttpClientMaker() + } else { + client, err = http_client.GetHttpClient(ctx) + if err != nil { + return err + } + client.Timeout = s.config.Network.GetHttpRequestTimeout() + } + + localNode, err := s.nodeRegistry.GetNode(s.wallet.Address) + if err != nil { + return err + } + url := localNode.Url() + "/status" + + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return err + } + + log.Info("Standby: fetching status", "url", url) + + if s.standbyFetchStatus(req, client) { + return nil + } + } +} + +func (s *Service) standbyFetchStatus(req *http.Request, client *http.Client) bool { + ctx := s.serverCtx + log := s.defaultLogger + + req.Header.Set("Content-Type", "application/json") + resp, err := client.Do(req.WithContext(ctx)) + if err != nil { + log.Warn("Standby: failed to fetch status, retrying...", "error", err) + return false + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + log.Warn("Standby: status code is not 200, retrying...", "status_code", resp.StatusCode) + return false + } + + var status statusinfo.StatusResponse + err = json.NewDecoder(resp.Body).Decode(&status) + if err != nil { + log.Warn("Standby: failed to decode JSON, retrying...", "error", err) + return false + } + + if status.InstanceId != s.instanceId { + log.Info( + "Standby: instanceId is not matching, retrying...", + "remoted_id", + status.InstanceId, + "local_id", + s.instanceId, + "status", + status, + ) + return false + } + + log.Info("Standby: instanceId is matching, exiting standby mode", "status", status) + return true +} diff --git a/core/node/rpc/standby_test.go b/core/node/rpc/standby_test.go new file mode 100644 index 000000000..52e81ffaf --- /dev/null +++ b/core/node/rpc/standby_test.go @@ -0,0 +1,228 @@ +package rpc_test + +import ( + "encoding/json" + "errors" + "io" + "net" + "sync/atomic" + "testing" + "time" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/contracts" + "github.com/river-build/river/core/node/nodes" + "github.com/river-build/river/core/node/rpc/statusinfo" + + . "github.com/river-build/river/core/node/protocol" +) + +func stanbyStartOpts() startOpts { + return startOpts{ + configUpdater: func(config *config.Config) { + config.StandByOnStart = true + }, + } +} + +func getNodeStatus(url string) (*statusinfo.StatusResponse, error) { + url = url + "/status" + client := nodes.TestHttpClientMaker() + resp, err := client.Get(url) + if err != nil { + return nil, err + } + defer resp.Body.Close() + if resp.StatusCode != 200 { + return nil, errors.New("status request failed") + } + var status statusinfo.StatusResponse + err = json.NewDecoder(resp.Body).Decode(&status) + if err != nil { + return nil, err + } + return &status, nil +} + +func pollStatus(url string, expected string) bool { + start := time.Now() + for { + st, err := getNodeStatus(url) + if err == nil && st.Status == expected { + return true + } + if time.Since(start) > 5*time.Second { + return false + } + time.Sleep(10 * time.Millisecond) + } +} + +func TestStandbySingle(t *testing.T) { + tester := newServiceTester(t, 1) + require := tester.require + + tester.initNodeRecords(0, 1, contracts.NodeStatus_Operational) + tester.startNodes(0, 1, stanbyStartOpts()) + + st, err := getNodeStatus(tester.nodes[0].url) + require.NoError(err) + require.Equal("OK", st.Status) +} + +func TestStandbyEvictionByNlbSwitch(t *testing.T) { + tester := newServiceTester(t, 1) + require := tester.require + + redirector := tester.nodes[0].listener + tester.nodes[0].listener = nil + var redirectAddr atomic.Pointer[string] + + firstListener, err := net.Listen("tcp", "localhost:0") + require.NoError(err) + firstAddr := firstListener.Addr().String() + firstUrl := "http://" + firstAddr + redirectAddr.Store(&firstAddr) + + go redirect(redirector, &redirectAddr) + + opts := stanbyStartOpts() + opts.listeners = []net.Listener{firstListener} + tester.initNodeRecords(0, 1, contracts.NodeStatus_Operational) + tester.startNodes(0, 1, opts) + + first := tester.nodes[0].service + + // Setup shutdown monitor + exitStatus := make(chan error) + go func() { + firstExit := <-first.ExitSignal() + first.Close() + exitStatus <- firstExit + }() + + secondListener, err := net.Listen("tcp", "localhost:0") + require.NoError(err) + secondAddr := secondListener.Addr().String() + secondUrl := "http://" + secondAddr + + // Start the second node with same address + opts.listeners = []net.Listener{secondListener} + go func() { require.NoError(tester.startSingle(0, opts)) }() + + // First node should be operational + st1, err := getNodeStatus(firstUrl) + require.NoError(err) + require.Equal("OK", st1.Status) + + // Also check through redirector URL + st2, err := getNodeStatus(tester.nodes[0].url) + require.NoError(err) + require.Equal("OK", st2.Status) + require.Equal(st1.InstanceId, st2.InstanceId) + + require.True(pollStatus(secondUrl, "STANDBY")) + + // Emulate NLB switch + time.Sleep(50 * time.Millisecond) // Give some time for second instance to poll + redirectAddr.Store(&secondAddr) + require.True(pollStatus(secondUrl, "OK")) + + // Get status again through redirector URL + st3, err := getNodeStatus(tester.nodes[0].url) + require.NoError(err) + require.Equal("OK", st3.Status) + require.NotEqual(st1.InstanceId, st3.InstanceId) + + // First node should be evicted + firstErr := <-exitStatus + require.Error(firstErr) + require.Equal(Err_RESOURCE_EXHAUSTED, AsRiverError(firstErr).Code) +} + +func TestStandbyEvictionByUrlUpdate(t *testing.T) { + tester := newServiceTester(t, 1) + require := tester.require + + firstListener := tester.nodes[0].listener + firstAddr := firstListener.Addr().String() + firstUrl := "http://" + firstAddr + + opts := stanbyStartOpts() + opts.listeners = []net.Listener{firstListener} + tester.initNodeRecords(0, 1, contracts.NodeStatus_Operational) + tester.startNodes(0, 1, opts) + + first := tester.nodes[0].service + + // Setup shutdown monitor + exitStatus := make(chan error) + go func() { + firstExit := <-first.ExitSignal() + first.Close() + exitStatus <- firstExit + }() + + secondListener, err := net.Listen("tcp", "localhost:0") + require.NoError(err) + secondAddr := secondListener.Addr().String() + secondUrl := "http://" + secondAddr + + // Start the second node with same address + opts.listeners = []net.Listener{secondListener} + go func() { require.NoError(tester.startSingle(0, opts)) }() + + // First node should be operational + st1, err := getNodeStatus(firstUrl) + require.NoError(err) + require.Equal("OK", st1.Status) + + require.True(pollStatus(secondUrl, "STANDBY")) + + time.Sleep(50 * time.Millisecond) // Give some time for second instance to poll + + // While in practice this is not how this should happen (NLB should be used), + // standby mode should work even if URL is updated. + require.NoError(tester.btc.UpdateNodeUrl(tester.ctx, 0, secondUrl)) + require.True(pollStatus(secondUrl, "OK")) + + st3, err := getNodeStatus(secondUrl) + require.NoError(err) + require.Equal("OK", st3.Status) + require.NotEqual(st1.InstanceId, st3.InstanceId) + + // First node should be evicted + firstErr := <-exitStatus + require.Error(firstErr) + require.Equal(Err_RESOURCE_EXHAUSTED, AsRiverError(firstErr).Code) +} + +func redirect(listener net.Listener, redirectAddress *atomic.Pointer[string]) { + defer listener.Close() + + for { + conn, err := listener.Accept() + if err != nil { + panic(err) + } + + addr := *redirectAddress.Load() + go handleConnection(conn, addr) + } +} + +func handleConnection(sourceConn net.Conn, targetAddr string) { + defer sourceConn.Close() + + targetConn, err := net.Dial("tcp", targetAddr) + if err != nil { + panic(err) + } + defer targetConn.Close() + + // Copy sourceConn's data to targetConn + go func() { _, _ = io.Copy(targetConn, sourceConn) }() + // Copy targetConn's data back to sourceConn + _, _ = io.Copy(sourceConn, targetConn) +} diff --git a/core/node/rpc/status.go b/core/node/rpc/status.go new file mode 100644 index 000000000..a0dab3bd6 --- /dev/null +++ b/core/node/rpc/status.go @@ -0,0 +1,51 @@ +package rpc + +import ( + "bytes" + "encoding/json" + "io" + "net/http" + "time" + + "github.com/river-build/river/core/node/node/version" + "github.com/river-build/river/core/node/rpc/render" + "github.com/river-build/river/core/node/rpc/statusinfo" +) + +func (s *Service) getStatusReponse() *statusinfo.StatusResponse { + return &statusinfo.StatusResponse{ + Status: s.GetStatus(), + InstanceId: s.instanceId, + Address: s.wallet.Address.Hex(), + Version: version.GetFullVersion(), + StartTime: s.startTime.UTC().Format(time.RFC3339), + Uptime: time.Since(s.startTime).String(), + Graffiti: s.config.GetGraffiti(), + } +} + +func (s *Service) handleStatus(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + err := json.NewEncoder(w).Encode(s.getStatusReponse()) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } +} + +func (s *Service) handleInfo(w http.ResponseWriter, r *http.Request) { + var output *bytes.Buffer + + json, err := json.MarshalIndent(s.getStatusReponse(), "", " ") + if err == nil { + output, err = render.Execute(&render.InfoIndexData{StatusJson: string(json)}) + } + if err != nil { + s.defaultLogger.Error("unable to prepare info index response", "err", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "text/html") + w.WriteHeader(http.StatusOK) + _, _ = io.Copy(w, output) +} diff --git a/core/node/rpc/statusinfo/node_status.go b/core/node/rpc/statusinfo/node_status.go new file mode 100644 index 000000000..dd4ec0889 --- /dev/null +++ b/core/node/rpc/statusinfo/node_status.go @@ -0,0 +1,97 @@ +package statusinfo + +import "encoding/json" + +type StatusResponse struct { + Status string `json:"status"` + InstanceId string `json:"instance_id"` + Address string `json:"address"` + Version string `json:"version"` + StartTime string `json:"start_time"` + Uptime string `json:"uptime"` + Graffiti string `json:"graffiti,omitempty"` +} + +func StatusResponseFromJson(data []byte) (StatusResponse, error) { + var result StatusResponse + err := json.Unmarshal(data, &result) + return result, err +} + +func (r StatusResponse) ToPrettyJson() string { + return toPrettyJson(r) +} + +type RegistryNodeInfo struct { + Address string `json:"address"` + Url string `json:"url"` + Operator string `json:"operator"` + Status int `json:"status"` + StatusText string `json:"status_text"` +} + +type HttpResult struct { + Success bool `json:"success"` + Status int `json:"status"` + StatusText string `json:"status_text"` + Elapsed string `json:"elapsed"` + ElapsedAfterDNS string `json:"elapsed_after_dns"` + ElapsedAfterConn string `json:"elapsed_after_conn"` + Response StatusResponse `json:"response"` + Protocol string `json:"protocol"` + UsedTLS bool `json:"used_tls"` + RemoteAddress string `json:"remote_address"` + DNSAddresses []string `json:"dns_addresses"` +} + +func (r HttpResult) ToPrettyJson() string { + return toPrettyJson(r) +} + +type GrpcResult struct { + Success bool `json:"success"` + StatusText string `json:"status_text"` + Elapsed string `json:"elapsed"` + ElapsedAfterDNS string `json:"elapsed_after_dns"` + ElapsedAfterConn string `json:"elapsed_after_conn"` + Version string `json:"version"` + StartTime string `json:"start_time"` + Uptime string `json:"uptime"` + Graffiti string `json:"graffiti,omitempty"` + Protocol string `json:"protocol"` + XHttpVersion string `json:"x_http_version"` + RemoteAddress string `json:"remote_address"` + DNSAddresses []string `json:"dns_addresses"` +} + +func (r GrpcResult) ToPrettyJson() string { + return toPrettyJson(r) +} + +type NodeStatus struct { + Record RegistryNodeInfo `json:"record"` + Local bool `json:"local,omitempty"` + Http11 HttpResult `json:"http11"` + Http20 HttpResult `json:"http20"` + Grpc GrpcResult `json:"grpc"` + RiverEthBalance string `json:"river_eth_balance"` +} + +type RiverStatus struct { + Nodes []*NodeStatus `json:"nodes"` + QueryTime string `json:"query_time"` + Elapsed string `json:"elapsed"` +} + +func (r RiverStatus) ToPrettyJson() string { + return toPrettyJson(r) +} + +func toPrettyJson(v any) string { + b, err := json.MarshalIndent(v, "", " ") + if err == nil { + return string(b) + } else { + return "\"FAILED\"" + } +} diff --git a/core/node/rpc/sync_receiver.go b/core/node/rpc/sync_receiver.go new file mode 100644 index 000000000..9a918b904 --- /dev/null +++ b/core/node/rpc/sync_receiver.go @@ -0,0 +1,84 @@ +package rpc + +import ( + "context" + "sync" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/dlog" + . "github.com/river-build/river/core/node/events" + . "github.com/river-build/river/core/node/protocol" +) + +type syncReceiver struct { + ctx context.Context + cancel context.CancelFunc + channel chan *StreamAndCookie + + mu sync.Mutex + firstError error +} + +var _ SyncResultReceiver = (*syncReceiver)(nil) + +func (s *syncReceiver) OnUpdate(r *StreamAndCookie) { + if s.ctx.Err() != nil { + return + } + + select { + case s.channel <- r: + return + default: + err := RiverError( + Err_BUFFER_FULL, + "channel full, dropping update and canceling", + "streamId", + r.NextSyncCookie.StreamId, + ). + Func("OnUpdate"). + LogWarn(dlog.FromCtx(s.ctx)) + s.setErrorAndCancel(err) + return + } +} + +func (s *syncReceiver) OnSyncError(err error) { + if s.ctx.Err() != nil { + return + } + s.setErrorAndCancel(err) + dlog.FromCtx(s.ctx).Warn("OnSyncError: cancelling sync", "error", err) +} + +func (s *syncReceiver) setErrorAndCancel(err error) { + s.mu.Lock() + if s.firstError == nil { + s.firstError = err + } + s.mu.Unlock() + + s.cancel() +} + +func (s *syncReceiver) Dispatch(sender syncStream) { + log := dlog.FromCtx(s.ctx) + + for { + select { + case <-s.ctx.Done(): + err := s.ctx.Err() + s.setErrorAndCancel(err) + log.Debug("SyncStreams: context done", "err", err) + return + case data := <-s.channel: + log.Debug("SyncStreams: received update in forward loop", "data", data) + resp := SyncStreamsResponseFromStreamAndCookie(data) + if err := sender.Send(resp); err != nil { + s.setErrorAndCancel(err) + log.Debug("SyncStreams: failed to send update", "resp", data, "err", err) + return + } + } + } +} diff --git a/core/node/rpc/sync_streams.go b/core/node/rpc/sync_streams.go new file mode 100644 index 000000000..7933000e0 --- /dev/null +++ b/core/node/rpc/sync_streams.go @@ -0,0 +1,846 @@ +package rpc + +import ( + "bytes" + "context" + "errors" + "sync" + + "connectrpc.com/connect" + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/events" + "github.com/river-build/river/core/node/nodes" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/protocol/protocolconnect" + . "github.com/river-build/river/core/node/shared" +) + +// TODO: wire metrics. +// var ( +// syncStreamsRequests = infra.NewSuccessMetrics("sync_streams_requests", serviceRequests) +// syncStreamsResultSize = infra.NewCounter("sync_streams_result_size", "The total number of events returned by sync streams") +// ) + +// func addUpdatesToCounter(updates []*StreamAndCookie) { +// for _, stream := range updates { +// syncStreamsResultSize.Add(float64(len(stream.Events))) +// } +// } + +func NewSyncHandler( + wallet *crypto.Wallet, + cache events.StreamCache, + nodeRegistry nodes.NodeRegistry, + streamRegistry nodes.StreamRegistry, +) SyncHandler { + return &syncHandlerImpl{ + wallet: wallet, + cache: cache, + nodeRegistry: nodeRegistry, + streamRegistry: streamRegistry, + mu: sync.Mutex{}, + syncIdToSubscription: make(map[string]*syncSubscriptionImpl), + } +} + +type SyncHandler interface { + SyncStreams( + ctx context.Context, + req *connect.Request[SyncStreamsRequest], + res *connect.ServerStream[SyncStreamsResponse], + ) error + AddStreamToSync( + ctx context.Context, + req *connect.Request[AddStreamToSyncRequest], + ) (*connect.Response[AddStreamToSyncResponse], error) + RemoveStreamFromSync( + ctx context.Context, + req *connect.Request[RemoveStreamFromSyncRequest], + ) (*connect.Response[RemoveStreamFromSyncResponse], error) + CancelSync( + ctx context.Context, + req *connect.Request[CancelSyncRequest], + ) (*connect.Response[CancelSyncResponse], error) + PingSync( + ctx context.Context, + req *connect.Request[PingSyncRequest], + ) (*connect.Response[PingSyncResponse], error) +} + +type syncHandlerImpl struct { + wallet *crypto.Wallet + cache events.StreamCache + nodeRegistry nodes.NodeRegistry + streamRegistry nodes.StreamRegistry + mu sync.Mutex + syncIdToSubscription map[string]*syncSubscriptionImpl +} + +type syncNode struct { + address common.Address + remoteSyncId string // the syncId to the remote node's sync subscription + forwarderSyncId string // the forwarding node's sync Id + stub protocolconnect.StreamServiceClient + + mu sync.Mutex + closed bool +} + +func (s *Service) SyncStreams( + ctx context.Context, + req *connect.Request[SyncStreamsRequest], + res *connect.ServerStream[SyncStreamsResponse], +) error { + return s.syncHandler.SyncStreams(ctx, req, res) +} + +func (s *Service) AddStreamToSync( + ctx context.Context, + req *connect.Request[AddStreamToSyncRequest], +) (*connect.Response[AddStreamToSyncResponse], error) { + return s.syncHandler.AddStreamToSync(ctx, req) +} + +func (s *Service) RemoveStreamFromSync( + ctx context.Context, + req *connect.Request[RemoveStreamFromSyncRequest], +) (*connect.Response[RemoveStreamFromSyncResponse], error) { + return s.syncHandler.RemoveStreamFromSync(ctx, req) +} + +func (s *Service) CancelSync( + ctx context.Context, + req *connect.Request[CancelSyncRequest], +) (*connect.Response[CancelSyncResponse], error) { + return s.syncHandler.CancelSync(ctx, req) +} + +func (s *Service) PingSync( + ctx context.Context, + req *connect.Request[PingSyncRequest], +) (*connect.Response[PingSyncResponse], error) { + return s.syncHandler.PingSync(ctx, req) +} + +func (s *syncHandlerImpl) SyncStreams( + ctx context.Context, + req *connect.Request[SyncStreamsRequest], + res *connect.ServerStream[SyncStreamsResponse], +) error { + ctx, log := ctxAndLogForRequest(ctx, req) + + // generate a random syncId + syncId := GenNanoid() + log.Debug("SyncStreams:SyncHandlerV2.SyncStreams ENTER", "syncId", syncId, "syncPos", req.Msg.SyncPos) + + sub, err := s.addSubscription(ctx, syncId) + if err != nil { + log.Info( + "SyncStreams:SyncHandlerV2.SyncStreams LEAVE: failed to add subscription", + "syncId", + syncId, + "err", + err, + ) + return err + } + + // send syncId to client + e := res.Send(&SyncStreamsResponse{ + SyncId: syncId, + SyncOp: SyncOp_SYNC_NEW, + }) + if e != nil { + err := AsRiverError(e).Func("SyncStreams") + log.Info( + "SyncStreams:SyncHandlerV2.SyncStreams LEAVE: failed to send syncId", + "res", + res, + "err", + err, + "syncId", + syncId, + ) + return err + } + log.Debug("SyncStreams:SyncHandlerV2.SyncStreams: sent syncId", "syncId", syncId) + + e = s.handleSyncRequest(req, res, sub) + if e != nil { + err := AsRiverError(e).Func("SyncStreams") + if err.Code == Err_CANCELED { + // Context is canceled when client disconnects, so this is normal case. + log.Debug( + "SyncStreams:SyncHandlerV2.SyncStreams LEAVE: sync Dispatch() ended with expected error", + "syncId", + syncId, + ) + _ = err.LogDebug(log) + } else { + log.Info("SyncStreams:SyncHandlerV2.SyncStreams LEAVE: sync Dispatch() ended with unexpected error", "syncId", syncId) + _ = err.LogWarn(log) + } + return err.AsConnectError() + } + // no errors from handling the sync request. + log.Debug("SyncStreams:SyncHandlerV2.SyncStreams LEAVE") + return nil +} + +func (s *syncHandlerImpl) handleSyncRequest( + req *connect.Request[SyncStreamsRequest], + res *connect.ServerStream[SyncStreamsResponse], + sub *syncSubscriptionImpl, +) error { + if sub == nil { + return RiverError(Err_NOT_FOUND, "SyncId not found").Func("SyncStreams") + } + log := dlog.FromCtx(sub.ctx) + + defer func() { + s.removeSubscription(sub.ctx, sub.syncId) + }() + + localCookies, remoteCookies := getLocalAndRemoteCookies(s.wallet.Address, req.Msg.SyncPos) + + for nodeAddr, remoteCookie := range remoteCookies { + var r *syncNode + if r = sub.getRemoteNode(nodeAddr); r == nil { + stub, err := s.nodeRegistry.GetStreamServiceClientForAddress(nodeAddr) + if err != nil { + // TODO: Handle the case when node is no longer available. HNT-4715 + log.Error( + "SyncStreams:SyncHandlerV2.SyncStreams failed to get stream service client", + "syncId", + sub.syncId, + "err", + err, + ) + return err + } + + r = &syncNode{ + address: nodeAddr, + forwarderSyncId: sub.syncId, + stub: stub, + } + } + err := sub.addSyncNode(r, remoteCookie) + if err != nil { + return err + } + } + + if len(localCookies) > 0 { + go s.syncLocalNode(sub.ctx, localCookies, sub) + } + + remotes := sub.getRemoteNodes() + for _, remote := range remotes { + cookies := remoteCookies[remote.address] + go remote.syncRemoteNode(sub.ctx, sub.syncId, cookies, sub) + } + + // start the sync loop + log.Debug("SyncStreams:SyncHandlerV2.SyncStreams: sync Dispatch() started", "syncId", sub.syncId) + sub.Dispatch(res) + log.Debug("SyncStreams:SyncHandlerV2.SyncStreams: sync Dispatch() ended", "syncId", sub.syncId) + + err := sub.getError() + if err != nil { + log.Debug( + "SyncStreams:SyncHandlerV2.SyncStreams LEAVE: sync Dispatch() ended with expected error", + "syncId", + sub.syncId, + ) + return err + } + + log.Error("SyncStreams:SyncStreams: sync always should be terminated by context cancel.") + return nil +} + +func (s *syncHandlerImpl) CancelSync( + ctx context.Context, + req *connect.Request[CancelSyncRequest], +) (*connect.Response[CancelSyncResponse], error) { + _, log := ctxAndLogForRequest(ctx, req) + log.Debug("SyncStreams:SyncHandlerV2.CancelSync ENTER", "syncId", req.Msg.SyncId) + sub := s.getSub(req.Msg.SyncId) + if sub != nil { + sub.OnClose() + } + log.Debug("SyncStreams:SyncHandlerV2.CancelSync LEAVE", "syncId", req.Msg.SyncId) + return connect.NewResponse(&CancelSyncResponse{}), nil +} + +func (s *syncHandlerImpl) PingSync( + ctx context.Context, + req *connect.Request[PingSyncRequest], +) (*connect.Response[PingSyncResponse], error) { + _, log := ctxAndLogForRequest(ctx, req) + syncId := req.Msg.SyncId + + sub := s.getSub(syncId) + if sub == nil { + log.Debug("SyncStreams: ping sync", "syncId", syncId) + return nil, RiverError(Err_NOT_FOUND, "SyncId not found").Func("PingSync") + } + + // cancel if context is done + if sub.ctx.Err() != nil { + log.Debug("SyncStreams: ping sync", "syncId", syncId, "context_error", sub.ctx.Err()) + return nil, RiverError(Err_CANCELED, "SyncId canceled").Func("PingSync") + } + + log.Debug("SyncStreams: ping sync", "syncId", syncId) + c := pingOp{ + baseSyncOp: baseSyncOp{op: SyncOp_SYNC_PONG}, + nonce: req.Msg.Nonce, + } + select { + // send the pong response to the client via the control channel + case sub.controlChannel <- &c: + return connect.NewResponse(&PingSyncResponse{}), nil + default: + return nil, RiverError(Err_BUFFER_FULL, "control channel full").Func("PingSync") + } +} + +func getLocalAndRemoteCookies( + localWalletAddr common.Address, + syncCookies []*SyncCookie, +) (localCookies []*SyncCookie, remoteCookies map[common.Address][]*SyncCookie) { + localCookies = make([]*SyncCookie, 0, 8) + remoteCookies = make(map[common.Address][]*SyncCookie) + for _, cookie := range syncCookies { + if bytes.Equal(cookie.NodeAddress[:], localWalletAddr[:]) { + localCookies = append(localCookies, cookie) + } else { + remoteAddr := common.BytesToAddress(cookie.NodeAddress[:]) + if remoteCookies[remoteAddr] == nil { + remoteCookies[remoteAddr] = make([]*SyncCookie, 0, 8) + } + remoteCookies[remoteAddr] = append(remoteCookies[remoteAddr], cookie) + } + } + return +} + +func (s *syncHandlerImpl) syncLocalNode( + ctx context.Context, + syncPos []*SyncCookie, + sub *syncSubscriptionImpl, +) { + log := dlog.FromCtx(ctx) + + if ctx.Err() != nil { + log.Error("SyncStreams:SyncHandlerV2.SyncStreams: syncLocalNode not starting", "context_error", ctx.Err()) + return + } + + err := s.syncLocalStreamsImpl(ctx, syncPos, sub) + if err != nil { + log.Error("SyncStreams:SyncHandlerV2.SyncStreams: syncLocalNode failed", "err", err) + if sub != nil { + sub.OnSyncError(err) + } + } +} + +func (s *syncHandlerImpl) syncLocalStreamsImpl( + ctx context.Context, + syncPos []*SyncCookie, + sub *syncSubscriptionImpl, +) error { + if len(syncPos) <= 0 { + return nil + } + + defer func() { + if sub != nil { + sub.unsubLocalStreams() + } + }() + + for _, pos := range syncPos { + if ctx.Err() != nil { + return ctx.Err() + } + + err := s.addLocalStreamToSync(ctx, pos, sub) + if err != nil { + return err + } + } + + // Wait for context to be done before unsubbing. + <-ctx.Done() + return nil +} + +func (s *syncHandlerImpl) addLocalStreamToSync( + ctx context.Context, + cookie *SyncCookie, + subs *syncSubscriptionImpl, +) error { + log := dlog.FromCtx(ctx) + log.Debug("SyncStreams:SyncHandlerV2.addLocalStreamToSync ENTER", "syncId", subs.syncId, "syncPos", cookie) + + if ctx.Err() != nil { + log.Error("SyncStreams:SyncHandlerV2.addLocalStreamToSync: context error", "err", ctx.Err()) + return ctx.Err() + } + if subs == nil { + return RiverError(Err_NOT_FOUND, "SyncId not found").Func("SyncStreams") + } + + err := events.SyncCookieValidate(cookie) + if err != nil { + log.Debug("SyncStreams:SyncHandlerV2.addLocalStreamToSync: invalid cookie", "err", err) + return nil + } + + cookieStreamId, err := StreamIdFromBytes(cookie.StreamId) + if err != nil { + return err + } + + if s := subs.getLocalStream(cookieStreamId); s != nil { + // stream is already subscribed. no need to re-subscribe. + log.Debug( + "SyncStreams:SyncHandlerV2.addLocalStreamToSync: stream already subscribed", + "streamId", + cookieStreamId, + ) + return nil + } + + streamSub, _, err := s.cache.GetStream(ctx, cookieStreamId) + if err != nil { + log.Info( + "SyncStreams:SyncHandlerV2.addLocalStreamToSync: failed to get stream", + "streamId", + cookieStreamId, + "err", + err, + ) + return err + } + + err = subs.addLocalStream(ctx, cookie, &streamSub) + if err != nil { + log.Info( + "SyncStreams:SyncHandlerV2.addLocalStreamToSync: error subscribing to stream", + "streamId", + cookie.StreamId, + "err", + err, + ) + return err + } + + log.Debug( + "SyncStreams:SyncHandlerV2.addLocalStreamToSync LEAVE", + "syncId", + subs.syncId, + "streamId", + cookie.StreamId, + ) + return nil +} + +func (s *syncHandlerImpl) AddStreamToSync( + ctx context.Context, + req *connect.Request[AddStreamToSyncRequest], +) (*connect.Response[AddStreamToSyncResponse], error) { + ctx, log := ctxAndLogForRequest(ctx, req) + log.Debug("SyncStreams:SyncHandlerV2.AddStreamToSync ENTER", "syncId", req.Msg.SyncId, "syncPos", req.Msg.SyncPos) + + syncId := req.Msg.SyncId + cookie := req.Msg.SyncPos + + log.Debug("SyncStreams:SyncHandlerV2.AddStreamToSync: getting sub", "syncId", syncId) + sub := s.getSub(syncId) + if sub == nil { + log.Info("SyncStreams:SyncHandlerV2.AddStreamToSync LEAVE: SyncId not found", "syncId", syncId) + return nil, RiverError(Err_NOT_FOUND, "SyncId not found").Func("AddStreamToSync") + } + log.Debug("SyncStreams:SyncHandlerV2.AddStreamToSync: got sub", "syncId", syncId) + + // Two cases to handle. Either local cookie or remote cookie. + if bytes.Equal(cookie.NodeAddress[:], s.wallet.Address[:]) { + // Case 1: local cookie + if err := s.addLocalStreamToSync(ctx, cookie, sub); err != nil { + log.Info( + "SyncStreams:SyncHandlerV2.AddStreamToSync LEAVE: failed to add local streams", + "syncId", + syncId, + "err", + err, + ) + return nil, err + } + // done. + log.Debug("SyncStreams:SyncHandlerV2.AddStreamToSync: LEAVE", "syncId", syncId) + return connect.NewResponse(&AddStreamToSyncResponse{}), nil + } + + // Case 2: remote cookie + log.Debug("SyncStreams:SyncHandlerV2.AddStreamToSync: adding remote streams", "syncId", syncId) + nodeAddress := common.BytesToAddress(cookie.NodeAddress[:]) + remoteNode := sub.getRemoteNode(nodeAddress) + isNewRemoteNode := remoteNode == nil + log.Debug( + "SyncStreams:SyncHandlerV2.AddStreamToSync: remote node", + "syncId", + syncId, + "isNewRemoteNode", + isNewRemoteNode, + ) + if isNewRemoteNode { + // the remote node does not exist in the subscription. add it. + stub, err := s.nodeRegistry.GetStreamServiceClientForAddress(nodeAddress) + if err != nil { + log.Info( + "SyncStreams:SyncHandlerV2.AddStreamToSync: failed to get stream service client", + "syncId", + req.Msg.SyncId, + "err", + err, + ) + // TODO: Handle the case when node is no longer available. + return nil, err + } + if stub == nil { + panic("stub always should set for the remote node") + } + + remoteNode = &syncNode{ + address: nodeAddress, + forwarderSyncId: sub.syncId, + stub: stub, + } + sub.addRemoteNode(nodeAddress, remoteNode) + log.Info("SyncStreams:SyncHandlerV2.AddStreamToSync: added remote node", "syncId", req.Msg.SyncId) + } + err := sub.addRemoteStream(cookie) + if err != nil { + log.Info( + "SyncStreams:SyncHandlerV2.AddStreamToSync LEAVE: failed to add remote streams", + "syncId", + req.Msg.SyncId, + "err", + err, + ) + return nil, err + } + log.Info("SyncStreams:SyncHandlerV2.AddStreamToSync: added remote stream", "syncId", req.Msg.SyncId) + + if isNewRemoteNode { + // tell the new remote node to sync + syncPos := make([]*SyncCookie, 0, 1) + syncPos = append(syncPos, cookie) + log.Info("SyncStreams:SyncHandlerV2.AddStreamToSync: syncing new remote node", "syncId", req.Msg.SyncId) + go remoteNode.syncRemoteNode(sub.ctx, sub.syncId, syncPos, sub) + } else { + log.Info("SyncStreams:SyncHandlerV2.AddStreamToSync: adding stream to existing remote node", "syncId", req.Msg.SyncId) + // tell the existing remote nodes to add the streams to sync + go remoteNode.addStreamToSync(sub.ctx, cookie, sub) + } + + log.Debug("SyncStreams:SyncHandlerV2.AddStreamToSync LEAVE", "syncId", req.Msg.SyncId) + return connect.NewResponse(&AddStreamToSyncResponse{}), nil +} + +func (s *syncHandlerImpl) RemoveStreamFromSync( + ctx context.Context, + req *connect.Request[RemoveStreamFromSyncRequest], +) (*connect.Response[RemoveStreamFromSyncResponse], error) { + _, log := ctxAndLogForRequest(ctx, req) + log.Info( + "SyncStreams:SyncHandlerV2.RemoveStreamFromSync ENTER", + "syncId", + req.Msg.SyncId, + "streamId", + req.Msg.StreamId, + ) + + syncId := req.Msg.SyncId + streamId, err := StreamIdFromBytes(req.Msg.StreamId) + if err != nil { + log.Info( + "SyncStreams:SyncHandlerV2.RemoveStreamFromSync LEAVE: failed to parse streamId", + "syncId", + syncId, + "err", + err, + ) + return nil, err + } + + sub := s.getSub(syncId) + if sub == nil { + log.Info("SyncStreams:SyncHandlerV2.RemoveStreamFromSync LEAVE: SyncId not found", "syncId", syncId) + return nil, RiverError(Err_NOT_FOUND, "SyncId not found").Func("RemoveStreamFromSync") + } + + // remove the streamId from the local node + sub.removeLocalStream(streamId) + + // use the streamId to find the remote node to remove + remoteNode := sub.removeRemoteStream(streamId) + if remoteNode != nil { + log.Debug( + "SyncStreams:SyncHandlerV2.RemoveStreamFromSync: removing remote stream", + "syncId", + syncId, + "streamId", + streamId, + ) + err := remoteNode.removeStreamFromSync(sub.ctx, streamId, sub) + if err != nil { + log.Info( + "SyncStreams:SyncHandlerV2.RemoveStreamFromSync: failed to remove remote stream", + "syncId", + syncId, + "streamId", + streamId, + "err", + err, + ) + return nil, err + } + // remove any remote nodes that no longer have any streams to sync + sub.purgeUnusedRemoteNodes(log) + } + + log.Info("SyncStreams:SyncHandlerV2.RemoveStreamFromSync LEAVE", "syncId", syncId) + return connect.NewResponse(&RemoveStreamFromSyncResponse{}), nil +} + +func (s *syncHandlerImpl) addSubscription( + ctx context.Context, + syncId string, +) (*syncSubscriptionImpl, error) { + log := dlog.FromCtx(ctx) + s.mu.Lock() + defer func() { + s.mu.Unlock() + }() + + if s.syncIdToSubscription == nil { + s.syncIdToSubscription = make(map[string]*syncSubscriptionImpl) + } + if sub := s.syncIdToSubscription[syncId]; sub != nil { + return nil, errors.New("syncId subscription already exists") + } + sub := newSyncSubscription(ctx, syncId) + s.syncIdToSubscription[syncId] = sub + log.Debug("SyncStreams:addSubscription: syncId subscription added", "syncId", syncId) + return sub, nil +} + +func (s *syncHandlerImpl) removeSubscription( + ctx context.Context, + syncId string, +) { + log := dlog.FromCtx(ctx) + sub := s.getSub(syncId) + if sub != nil { + sub.deleteRemoteNodes() + } + s.mu.Lock() + if _, exists := s.syncIdToSubscription[syncId]; exists { + delete(s.syncIdToSubscription, syncId) + log.Debug("SyncStreams:removeSubscription: syncId subscription removed", "syncId", syncId) + } else { + log.Debug("SyncStreams:removeSubscription: syncId not found", "syncId", syncId) + } + s.mu.Unlock() +} + +func (s *syncHandlerImpl) getSub( + syncId string, +) *syncSubscriptionImpl { + s.mu.Lock() + defer s.mu.Unlock() + return s.syncIdToSubscription[syncId] +} + +// TODO: connect-go is not using channels for streaming (>_<), so it's a bit tricky to close all these +// streams properly. For now basic protocol is to close entire sync if there is any error. +// Which in turn means that we need to close all outstanding streams to remote nodes. +// Without control signals there is no clean way to do so, so for now both ctx is canceled and Close is called +// async hoping this will trigger Receive to abort. +func (n *syncNode) syncRemoteNode( + ctx context.Context, + forwarderSyncId string, + syncPos []*SyncCookie, + receiver events.SyncResultReceiver, +) { + log := dlog.FromCtx(ctx) + if ctx.Err() != nil || n.isClosed() { + log.Debug("SyncStreams: syncRemoteNode not started", "context_error", ctx.Err()) + return + } + if n.remoteSyncId != "" { + log.Debug( + "SyncStreams: syncRemoteNode not started because there is an existing sync", + "remoteSyncId", + n.remoteSyncId, + "forwarderSyncId", + forwarderSyncId, + ) + return + } + + defer func() { + if n != nil { + n.close() + } + }() + + responseStream, err := n.stub.SyncStreams( + ctx, + &connect.Request[SyncStreamsRequest]{ + Msg: &SyncStreamsRequest{ + SyncPos: syncPos, + }, + }, + ) + if err != nil { + log.Debug("SyncStreams: syncRemoteNode remote SyncStreams failed", "err", err) + receiver.OnSyncError(err) + return + } + defer responseStream.Close() + + if ctx.Err() != nil || n.isClosed() { + log.Debug("SyncStreams: syncRemoteNode receive canceled", "context_error", ctx.Err()) + return + } + + if !responseStream.Receive() { + receiver.OnSyncError(responseStream.Err()) + return + } + + if responseStream.Msg().SyncOp != SyncOp_SYNC_NEW || responseStream.Msg().SyncId == "" { + receiver.OnSyncError( + RiverError(Err_INTERNAL, "first sync response should be SYNC_NEW and have SyncId").Func("syncRemoteNode"), + ) + return + } + + n.remoteSyncId = responseStream.Msg().SyncId + n.forwarderSyncId = forwarderSyncId + + if ctx.Err() != nil || n.isClosed() { + log.Debug("SyncStreams: syncRemoteNode receive canceled", "context_error", ctx.Err()) + return + } + + for responseStream.Receive() { + if ctx.Err() != nil || n.isClosed() { + log.Debug("SyncStreams: syncRemoteNode receive canceled", "context_error", ctx.Err()) + return + } + + log.Debug("SyncStreams: syncRemoteNode received update", "resp", responseStream.Msg()) + + receiver.OnUpdate(responseStream.Msg().GetStream()) + } + + if ctx.Err() != nil || n.isClosed() { + return + } + + if err := responseStream.Err(); err != nil { + log.Debug("SyncStreams: syncRemoteNode receive failed", "err", err) + receiver.OnSyncError(err) + return + } +} + +func (n *syncNode) addStreamToSync( + ctx context.Context, + cookie *SyncCookie, + receiver events.SyncResultReceiver, +) { + log := dlog.FromCtx(ctx) + if ctx.Err() != nil || n.isClosed() { + log.Debug("SyncStreams:syncNode addStreamToSync not started", "context_error", ctx.Err()) + } + if n.remoteSyncId == "" { + log.Debug( + "SyncStreams:syncNode addStreamToSync not started because there is no existing sync", + "remoteSyncId", + n.remoteSyncId, + ) + } + + _, err := n.stub.AddStreamToSync( + ctx, + &connect.Request[AddStreamToSyncRequest]{ + Msg: &AddStreamToSyncRequest{ + SyncPos: cookie, + SyncId: n.remoteSyncId, + }, + }, + ) + if err != nil { + log.Debug("SyncStreams:syncNode addStreamToSync failed", "err", err) + receiver.OnSyncError(err) + } +} + +func (n *syncNode) removeStreamFromSync( + ctx context.Context, + streamId StreamId, + receiver events.SyncResultReceiver, +) error { + log := dlog.FromCtx(ctx) + if ctx.Err() != nil || n.isClosed() { + log.Debug("SyncStreams:syncNode removeStreamsFromSync not started", "context_error", ctx.Err()) + return ctx.Err() + } + if n.remoteSyncId == "" { + log.Debug( + "SyncStreams:syncNode removeStreamsFromSync not started because there is no existing sync", + "syncId", + n.remoteSyncId, + ) + return nil + } + + _, err := n.stub.RemoveStreamFromSync( + ctx, + &connect.Request[RemoveStreamFromSyncRequest]{ + Msg: &RemoveStreamFromSyncRequest{ + SyncId: n.remoteSyncId, + StreamId: streamId[:], + }, + }, + ) + if err != nil { + log.Debug("SyncStreams:syncNode removeStreamsFromSync failed", "err", err) + receiver.OnSyncError(err) + } + return err +} + +func (n *syncNode) isClosed() bool { + n.mu.Lock() + defer n.mu.Unlock() + return n.closed +} + +func (n *syncNode) close() { + n.mu.Lock() + defer n.mu.Unlock() + n.closed = true +} diff --git a/core/node/rpc/sync_subscription.go b/core/node/rpc/sync_subscription.go new file mode 100644 index 000000000..02e1a6eaa --- /dev/null +++ b/core/node/rpc/sync_subscription.go @@ -0,0 +1,422 @@ +package rpc + +import ( + "context" + "log/slog" + "sync" + + "connectrpc.com/connect" + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/events" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/shared" +) + +type syncOp interface { + getOp() SyncOp +} + +type baseSyncOp struct { + op SyncOp +} + +func (d *baseSyncOp) getOp() SyncOp { + return d.op +} + +type pingOp struct { + baseSyncOp + nonce string // used to match a response to a ping request +} + +type syncSubscriptionImpl struct { + ctx context.Context + syncId string + cancel context.CancelFunc + + mu sync.Mutex + firstError error + dataChannel chan *StreamAndCookie + controlChannel chan syncOp + localStreams map[StreamId]*events.SyncStream // mapping of streamId to local stream + remoteStreams map[StreamId]*syncNode // mapping of streamId to remote node + remoteNodes map[common.Address]*syncNode // mapping of node address to remote node +} + +func newSyncSubscription( + ctx context.Context, + syncId string, +) *syncSubscriptionImpl { + syncCtx, cancelSync := context.WithCancel(ctx) + return &syncSubscriptionImpl{ + ctx: syncCtx, + syncId: syncId, + cancel: cancelSync, + dataChannel: make(chan *StreamAndCookie, 256), + controlChannel: make(chan syncOp, 64), + localStreams: make(map[StreamId]*events.SyncStream), + remoteStreams: make(map[StreamId]*syncNode), + remoteNodes: make(map[common.Address]*syncNode), + } +} + +type syncStream interface { + Send(msg *SyncStreamsResponse) error +} + +func (s *syncSubscriptionImpl) addLocalStream( + ctx context.Context, + syncCookie *SyncCookie, + stream *events.SyncStream, +) error { + log := dlog.FromCtx(ctx) + log.Debug( + "SyncStreams:syncSubscriptionImpl:addLocalStream: adding local stream", + "syncId", + s.syncId, + "streamId", + syncCookie.StreamId, + ) + streamId, err := StreamIdFromBytes(syncCookie.StreamId) + if err != nil { + return err + } + + var exists bool + + s.mu.Lock() + + // only add the stream if it doesn't already exist in the subscription + if _, exists = s.localStreams[streamId]; !exists { + s.localStreams[streamId] = stream + } + s.mu.Unlock() + + if exists { + log.Debug( + "SyncStreams:syncSubscriptionImpl:addLocalStream: local stream already exists", + "syncId", + s.syncId, + "streamId", + syncCookie.StreamId, + ) + } else { + // subscribe to the stream + err := (*stream).Sub(ctx, syncCookie, s) + if err != nil { + log.Error("SyncStreams:syncSubscriptionImpl:addLocalStream: error subscribing to stream", "syncId", s.syncId, "streamId", syncCookie.StreamId, "err", err) + return err + } + log.Debug("SyncStreams:syncSubscriptionImpl:addLocalStream: added local stream", "syncId", s.syncId, "streamId", syncCookie.StreamId) + } + + return nil +} + +func (s *syncSubscriptionImpl) removeLocalStream( + streamId StreamId, +) { + var stream *events.SyncStream + + s.mu.Lock() + if st := s.localStreams[streamId]; st != nil { + stream = st + delete(s.localStreams, streamId) + } + s.mu.Unlock() + + if stream != nil { + (*stream).Unsub(s) + } +} + +func (s *syncSubscriptionImpl) unsubLocalStreams() { + s.mu.Lock() + defer s.mu.Unlock() + for key, st := range s.localStreams { + stream := *st + stream.Unsub(s) + delete(s.localStreams, key) + } +} + +func (s *syncSubscriptionImpl) addSyncNode( + node *syncNode, + cookies []*SyncCookie, +) error { + s.mu.Lock() + defer s.mu.Unlock() + + if _, exists := s.remoteNodes[node.address]; !exists { + s.remoteNodes[node.address] = node + } else { + node = s.remoteNodes[node.address] + } + for _, cookie := range cookies { + streamId, err := StreamIdFromBytes(cookie.StreamId) + if err != nil { + return err + } + s.remoteStreams[streamId] = node + } + return nil +} + +func (s *syncSubscriptionImpl) addRemoteNode( + address common.Address, + node *syncNode, +) bool { + s.mu.Lock() + defer s.mu.Unlock() + // only add the node if it doesn't already exist in the subscription + if _, exists := s.remoteNodes[address]; !exists { + s.remoteNodes[address] = node + return true // added + } + return false // not added +} + +func (s *syncSubscriptionImpl) getLocalStream( + streamId StreamId, +) *events.SyncStream { + s.mu.Lock() + defer s.mu.Unlock() + return s.localStreams[streamId] +} + +func (s *syncSubscriptionImpl) getRemoteNode( + address common.Address, +) *syncNode { + s.mu.Lock() + defer s.mu.Unlock() + return s.remoteNodes[address] +} + +func (s *syncSubscriptionImpl) getRemoteNodes() []*syncNode { + copy := make([]*syncNode, 0) + s.mu.Lock() + defer s.mu.Unlock() + for _, node := range s.remoteNodes { + copy = append(copy, node) + } + return copy +} + +func (s *syncSubscriptionImpl) addRemoteStream( + cookie *SyncCookie, +) error { + s.mu.Lock() + defer s.mu.Unlock() + nodeAddress := common.BytesToAddress(cookie.NodeAddress) + if remote := s.remoteNodes[nodeAddress]; remote != nil { + streamId, err := StreamIdFromBytes(cookie.StreamId) + if err != nil { + return err + } + s.remoteStreams[streamId] = remote + } + return nil +} + +func (s *syncSubscriptionImpl) removeRemoteStream( + streamId StreamId, +) *syncNode { + s.mu.Lock() + defer s.mu.Unlock() + if remote := s.remoteStreams[streamId]; remote != nil { + delete(s.remoteStreams, streamId) + return remote + } + return nil +} + +func (s *syncSubscriptionImpl) purgeUnusedRemoteNodes(log *slog.Logger) { + nodesToRemove := make([]*syncNode, 0) + + log.Debug( + "SyncStreams:syncSubscriptionImpl:purgeUnusedRemoteNodes: purging unused remote nodes", + "syncId", + s.syncId, + ) + + s.mu.Lock() + if len(s.remoteNodes) > 0 { + for _, remote := range s.remoteNodes { + isUsed := false + if len(s.remoteStreams) > 0 { + for _, n := range s.remoteStreams { + if n == remote { + isUsed = true + break + } + } + if !isUsed { + nodesToRemove = append(nodesToRemove, remote) + delete(s.remoteNodes, remote.address) + } + } + } + } + s.mu.Unlock() + + // now purge the nodes + for _, remote := range nodesToRemove { + if remote != nil { + remote.close() + } + } + + log.Debug("SyncStreams:syncSubscriptionImpl:purgeUnusedRemoteNodes: purged remote nodes done", "syncId", s.syncId) +} + +func (s *syncSubscriptionImpl) deleteRemoteNodes() { + s.mu.Lock() + defer s.mu.Unlock() + for key := range s.remoteNodes { + delete(s.remoteNodes, key) + } + for key := range s.remoteStreams { + delete(s.remoteStreams, key) + } +} + +func (s *syncSubscriptionImpl) setErrorAndCancel(err error) { + s.mu.Lock() + if s.firstError == nil { + s.firstError = err + } + s.mu.Unlock() + + s.cancel() +} + +func (s *syncSubscriptionImpl) OnSyncError(err error) { + if s.ctx.Err() != nil { + return + } + log := dlog.FromCtx(s.ctx) + log.Info("SyncStreams:syncSubscriptionImpl:OnSyncError: received error", "error", err) + s.setErrorAndCancel(err) + log.Warn("SyncStreams:syncSubscriptionImpl:OnSyncError: cancelling sync", "error", err) +} + +func (s *syncSubscriptionImpl) OnUpdate(r *StreamAndCookie) { + // cancel if context is done + if s.ctx.Err() != nil { + return + } + + select { + case s.dataChannel <- r: + return + default: + // end the update stream if the channel is full + err := RiverError( + Err_BUFFER_FULL, + "channel full, dropping update and canceling", + "streamId", + r.NextSyncCookie.StreamId, + ). + Func("OnUpdate"). + LogWarn(dlog.FromCtx(s.ctx)) + s.setErrorAndCancel(err) + return + } +} + +func (s *syncSubscriptionImpl) OnClose() { + // cancel if context is done + if s.ctx.Err() != nil { + return + } + + log := dlog.FromCtx(s.ctx) + log.Debug("SyncStreams:OnClose: closing stream", "syncId", s.syncId) + c := baseSyncOp{ + op: SyncOp_SYNC_CLOSE, + } + select { + case s.controlChannel <- &c: + return + default: + log.Info("SyncStreams:OnClose: control channel full") + return + } +} + +func (s *syncSubscriptionImpl) Dispatch(res *connect.ServerStream[SyncStreamsResponse]) { + log := dlog.FromCtx(s.ctx) + + for { + select { + case <-s.ctx.Done(): + err := s.ctx.Err() + s.setErrorAndCancel(err) + log.Debug("SyncStreams: context done", "err", err) + return + case data, ok := <-s.dataChannel: + log.Debug( + "SyncStreams: Dispatch received response in dispatch loop", + "syncId", + s.syncId, + "data", + data, + ) + if ok { + // gather the response metadata + content, and send it + resp := events.SyncStreamsResponseFromStreamAndCookie(data) + resp.SyncId = s.syncId + resp.SyncOp = SyncOp_SYNC_UPDATE + if err := res.Send(resp); err != nil { + log.Info("SyncStreams: Dispatch error sending response", "syncId", s.syncId, "err", err) + s.setErrorAndCancel(err) + return + } + } else { + log.Debug("SyncStreams: Dispatch data channel closed", "syncId", s.syncId) + } + case control := <-s.controlChannel: + log.Debug("SyncStreams: Dispatch received control message", "syncId", s.syncId, "control", control) + if control.getOp() == SyncOp_SYNC_CLOSE { + err := res.Send(&SyncStreamsResponse{ + SyncId: s.syncId, + SyncOp: SyncOp_SYNC_CLOSE, + }) + if err != nil { + log.Warn( + "SyncStreams: Dispatch error sending close response", + "syncId", + s.syncId, + "err", + err, + ) + log.Warn("SyncStreams: error closing stream", "err", err) + } + s.cancel() + log.Debug("SyncStreams: closed stream", "syncId", s.syncId) + } else if control.getOp() == SyncOp_SYNC_PONG { + log.Debug("SyncStreams: send pong to client", "syncId", s.syncId) + data := control.(*pingOp) + err := res.Send(&SyncStreamsResponse{ + SyncId: s.syncId, + SyncOp: SyncOp_SYNC_PONG, + PongNonce: data.nonce, + }) + if err != nil { + log.Warn("SyncStreams: cancel stream because of error sending pong response", "syncId", s.syncId, "err", err) + s.cancel() + } + } else { + log.Warn("SyncStreams: Dispatch received unknown control message", "syncId", s.syncId, "control", control) + } + } + } +} + +func (s *syncSubscriptionImpl) getError() error { + s.mu.Lock() + defer s.mu.Unlock() + return s.firstError +} diff --git a/core/node/rpc/tester_test.go b/core/node/rpc/tester_test.go new file mode 100644 index 000000000..95ceb2aa4 --- /dev/null +++ b/core/node/rpc/tester_test.go @@ -0,0 +1,266 @@ +package rpc_test + +import ( + "context" + "fmt" + "log" + "math/big" + "net" + "testing" + "time" + + "connectrpc.com/connect" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/river-build/river/core/node/base/test" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/contracts" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/nodes" + "github.com/river-build/river/core/node/protocol/protocolconnect" + "github.com/river-build/river/core/node/rpc" + "github.com/river-build/river/core/node/storage" + "github.com/river-build/river/core/node/testutils/dbtestutils" + "github.com/stretchr/testify/require" +) + +type testNodeRecord struct { + listener net.Listener + url string + service *rpc.Service + address common.Address +} + +func (n *testNodeRecord) Close(ctx context.Context, dbUrl string) { + if n.service != nil { + n.service.Close() + n.service = nil + } + if n.address != (common.Address{}) { + _ = dbtestutils.DeleteTestSchema( + ctx, + dbUrl, + storage.DbSchemaNameFromAddress(n.address.String()), + ) + } +} + +type serviceTester struct { + ctx context.Context + t *testing.T + require *require.Assertions + dbUrl string + btc *crypto.BlockchainTestContext + nodes []*testNodeRecord + replicationFactor int +} + +func newServiceTester(t *testing.T, numNodes int) *serviceTester { + return newServiceTesterWithReplication(t, numNodes, 1) +} + +func newServiceTesterAndStart(t *testing.T, numNodes int) *serviceTester { + st := newServiceTester(t, numNodes) + st.initNodeRecords(0, numNodes, contracts.NodeStatus_Operational) + st.startNodes(0, numNodes) + return st +} + +func newServiceTesterWithReplication(t *testing.T, numNodes int, replicationFactor int) *serviceTester { + t.Parallel() + + ctx, ctxCancel := test.NewTestContext() + t.Cleanup(ctxCancel) + + require := require.New(t) + + st := &serviceTester{ + ctx: ctx, + t: t, + require: require, + dbUrl: dbtestutils.GetTestDbUrl(), + nodes: make([]*testNodeRecord, numNodes), + replicationFactor: replicationFactor, + } + + btc, err := crypto.NewBlockchainTestContext(st.ctx, numNodes, true) + require.NoError(err) + st.btc = btc + t.Cleanup(st.btc.Close) + + for i := 0; i < numNodes; i++ { + st.nodes[i] = &testNodeRecord{} + + // This is a hack to get the port number of the listener + // so we can register it in the contract before starting + // the server + listener, err := net.Listen("tcp", "localhost:0") + require.NoError(err) + st.nodes[i].listener = listener + + port := listener.Addr().(*net.TCPAddr).Port + + st.nodes[i].url = fmt.Sprintf("http://localhost:%d", port) + } + + st.startAutoMining() + + return st +} + +func (st serviceTester) CloseNode(i int) { + if st.nodes[i] != nil { + st.nodes[i].Close(st.ctx, st.dbUrl) + } +} + +func (st *serviceTester) initNodeRecords(start, stop int, status uint8) { + for i := start; i < stop; i++ { + err := st.btc.InitNodeRecordEx(st.ctx, i, st.nodes[i].url, status) + st.require.NoError(err) + } +} + +func (st *serviceTester) setNodesStatus(start, stop int, status uint8) { + for i := start; i < stop; i++ { + err := st.btc.UpdateNodeStatus(st.ctx, i, status) + st.require.NoError(err) + } +} + +func (st *serviceTester) startAutoMining() { + // creates blocks that signals the river nodes to check and create miniblocks when required. + if !(st.btc.IsSimulated() || (st.btc.IsAnvil() && !st.btc.AnvilAutoMineEnabled())) { + return + } + + // hack to ensure that the chain always produces blocks (automining=true) + // commit on simulated backend with no pending txs can sometimes crash in the simulator. + // by having a pending tx with automining enabled we can work around that issue. + go func() { + blockPeriod := time.NewTicker(2 * time.Second) + chainID, err := st.btc.Client().ChainID(st.ctx) + if err != nil { + log.Fatal(err) + } + signer := types.LatestSignerForChainID(chainID) + + for { + select { + case <-st.ctx.Done(): + return + case <-blockPeriod.C: + _, _ = st.btc.DeployerBlockchain.TxPool.Submit( + st.ctx, + "noop", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + gp, err := st.btc.Client().SuggestGasPrice(st.ctx) + if err != nil { + return nil, err + } + tx := types.NewTransaction( + opts.Nonce.Uint64(), + st.btc.GetDeployerWallet().Address, + big.NewInt(1), + 21000, + gp, + nil, + ) + return types.SignTx(tx, signer, st.btc.GetDeployerWallet().PrivateKeyStruct) + }, + ) + } + } + }() +} + +type startOpts struct { + configUpdater func(cfg *config.Config) + listeners []net.Listener +} + +func (st *serviceTester) startNodes(start, stop int, opts ...startOpts) { + for i := start; i < stop; i++ { + err := st.startSingle(i, opts...) + st.require.NoError(err) + } +} + +func (st *serviceTester) getConfig(opts ...startOpts) *config.Config { + options := &startOpts{} + if len(opts) > 0 { + options = &opts[0] + } + + cfg := &config.Config{ + DisableBaseChain: true, + RegistryContract: st.btc.RegistryConfig(), + Database: config.DatabaseConfig{ + Url: st.dbUrl, + StartupDelay: 2 * time.Millisecond, + }, + StorageType: "postgres", + Stream: config.StreamConfig{ + Media: config.MediaStreamConfig{ + MaxChunkCount: 100, + MaxChunkSize: 1000000, + }, + RecencyConstraints: config.RecencyConstraintsConfig{ + AgeSeconds: 11, + Generations: 5, + }, + ReplicationFactor: st.replicationFactor, + }, + Network: config.NetworkConfig{ + NumRetries: 3, + }, + ShutdownTimeout: 2 * time.Millisecond, + } + + if options.configUpdater != nil { + options.configUpdater(cfg) + } + + return cfg +} + +func (st *serviceTester) startSingle(i int, opts ...startOpts) error { + options := &startOpts{} + if len(opts) > 0 { + options = &opts[0] + } + + cfg := st.getConfig(*options) + + listener := st.nodes[i].listener + if i < len(options.listeners) && options.listeners[i] != nil { + listener = options.listeners[i] + } + + bc := st.btc.GetBlockchain(st.ctx, i) + service, err := rpc.StartServer(st.ctx, cfg, bc, listener) + if err != nil { + if service != nil { + // Sanity check + panic("service should be nil") + } + return err + } + st.nodes[i].service = service + st.nodes[i].address = bc.Wallet.Address + + st.t.Cleanup(func() { + st.nodes[i].Close(st.ctx, st.dbUrl) + }) + + return nil +} + +func (st *serviceTester) testClient(i int) protocolconnect.StreamServiceClient { + return testClient(st.nodes[i].url) +} + +func testClient(url string) protocolconnect.StreamServiceClient { + return protocolconnect.NewStreamServiceClient(nodes.TestHttpClientMaker(), url, connect.WithGRPCWeb()) +} diff --git a/core/node/rpc/timeout_interceptor.go b/core/node/rpc/timeout_interceptor.go new file mode 100644 index 000000000..076038748 --- /dev/null +++ b/core/node/rpc/timeout_interceptor.go @@ -0,0 +1,28 @@ +package rpc + +import ( + "context" + "time" + + "connectrpc.com/connect" +) + +func NewTimeoutInterceptor(defaultTimeout time.Duration) connect.UnaryInterceptorFunc { + interceptor := func(next connect.UnaryFunc) connect.UnaryFunc { + return func( + ctx context.Context, + req connect.AnyRequest, + ) (connect.AnyResponse, error) { + if defaultTimeout != 0 { + var cancel context.CancelFunc + _, ok := ctx.Deadline() + if !ok { + ctx, cancel = context.WithTimeout(ctx, defaultTimeout) + defer cancel() + } + } + return next(ctx, req) + } + } + return interceptor +} diff --git a/core/node/rpc/util.go b/core/node/rpc/util.go new file mode 100644 index 000000000..0fd3dfa1e --- /dev/null +++ b/core/node/rpc/util.go @@ -0,0 +1,55 @@ +package rpc + +import ( + "context" + "log/slog" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/dlog" + . "github.com/river-build/river/core/node/protocol" + + "connectrpc.com/connect" + "github.com/ethereum/go-ethereum/common" +) + +type RequestWithStreamId interface { + GetStreamId() string +} + +func ctxAndLogForRequest[T any](ctx context.Context, req *connect.Request[T]) (context.Context, *slog.Logger) { + log := dlog.FromCtx(ctx) + + // Add streamId to log context if present in request + if reqMsg, ok := any(req.Msg).(RequestWithStreamId); ok { + streamId := reqMsg.GetStreamId() + if streamId != "" { + log = log.With("streamId", streamId) + return dlog.CtxWithLog(ctx, log), log + } + } + + return ctx, log +} + +func ParseEthereumAddress(address string) (common.Address, error) { + if len(address) != 42 { + return common.Address{}, RiverError(Err_BAD_ADDRESS, "invalid address length") + } + if address[:2] != "0x" { + return common.Address{}, RiverError(Err_BAD_ADDRESS, "invalid address prefix") + } + return common.HexToAddress(address), nil +} + +func totalQuorumNum(totalNumNodes int) int { + return (totalNumNodes + 1) / 2 +} + +// Returns number of remotes that need to succeed for quorum based on where the local is present. +func remoteQuorumNum(remotes int, local bool) int { + if local { + return totalQuorumNum(remotes+1) - 1 + } else { + return totalQuorumNum(remotes) + } +} diff --git a/core/node/rules/can_add_event.go b/core/node/rules/can_add_event.go new file mode 100644 index 000000000..bc39e33ae --- /dev/null +++ b/core/node/rules/can_add_event.go @@ -0,0 +1,1190 @@ +package rules + +import ( + "bytes" + "context" + "log/slog" + "sort" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/river-build/river/core/node/auth" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/events" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/shared" +) + +type aeParams struct { + ctx context.Context + cfg *config.StreamConfig + validNodeAddresses []common.Address + currentTime time.Time + streamView events.StreamView + parsedEvent *events.ParsedEvent +} + +type aeMembershipRules struct { + params *aeParams + membership *MemberPayload_Membership +} + +type aeUserMembershipRules struct { + params *aeParams + userMembership *UserPayload_UserMembership +} + +type aeUserMembershipActionRules struct { + params *aeParams + action *UserPayload_UserMembershipAction +} + +type aeSpaceChannelRules struct { + params *aeParams + channelUpdate *SpacePayload_Channel +} + +type aeMediaPayloadChunkRules struct { + params *aeParams + chunk *MediaPayload_Chunk +} + +type aeEnsAddressRules struct { + params *aeParams + address *MemberPayload_EnsAddress +} + +type aeNftRules struct { + params *aeParams + nft *MemberPayload_Nft +} + +type aeKeySolicitationRules struct { + params *aeParams + solicitation *MemberPayload_KeySolicitation +} + +type aeKeyFulfillmentRules struct { + params *aeParams + fulfillment *MemberPayload_KeyFulfillment +} + +/* +* +* CanAddEvent +* a pure function with no side effects that returns a boolean value and prerequesits +* for adding an event to a stream. +* + + - @return canAddEvent bool // true if the event can be added to the stream, will be false in case of duplictate state + + - @return chainAuthArgs *auth.ChainAuthArgs // on chain requirements for adding an event to the stream + + - @return requiredParentEvent *RequiredParentEvent // event that must exist in the stream before the event can be added + // required parent events must be replayable - meaning that in the case of a no-op, the can_add_event function should return false, nil, nil, nil to indicate + // that the event cannot be added to the stream, but there is no error + + - @return error // if adding result would result in invalid state + +* +* example valid states: +* (false, nil, nil, nil) // event cannot be added to the stream, but there is no error, state would remain the same +* (false, nil, nil, error) // event cannot be added to the stream, but there is no error, state would remain the same +* (true, nil, nil, nil) // event can be added to the stream +* (true, nil, &IsStreamEvent_Payload, nil) // event can be added after parent event is added or verified +* (true, chainAuthArgs, nil, nil) // event can be added if chainAuthArgs are satisfied +* (true, chainAuthArgs, &IsStreamEvent_Payload, nil) // event can be added if chainAuthArgs are satisfied and parent event is added or verified +*/ +func CanAddEvent( + ctx context.Context, + cfg *config.StreamConfig, + validNodeAddresses []common.Address, + currentTime time.Time, + parsedEvent *events.ParsedEvent, + streamView events.StreamView, +) (bool, *auth.ChainAuthArgs, *RequiredParentEvent, error) { + if parsedEvent.Event.DelegateExpiryEpochMs > 0 && + isPastExpiry(currentTime, parsedEvent.Event.DelegateExpiryEpochMs) { + return false, nil, nil, RiverError( + Err_PERMISSION_DENIED, + "event delegate has expired", + "currentTime", + currentTime, + "expiryTime", + parsedEvent.Event.DelegateExpiryEpochMs, + ) + } + + // validate that event has required properties + if parsedEvent.Event.PrevMiniblockHash == nil { + return false, nil, nil, RiverError(Err_INVALID_ARGUMENT, "event has no prevMiniblockHash") + } + // check preceding miniblock hash + err := streamView.ValidateNextEvent(ctx, &cfg.RecencyConstraints, parsedEvent, currentTime) + if err != nil { + return false, nil, nil, err + } + // make sure the stream event is of the same type as the inception event + err = parsedEvent.Event.VerifyPayloadTypeMatchesStreamType(streamView.InceptionPayload()) + if err != nil { + return false, nil, nil, err + } + + ru := &aeParams{ + ctx: ctx, + cfg: cfg, + validNodeAddresses: validNodeAddresses, + currentTime: currentTime, + parsedEvent: parsedEvent, + streamView: streamView, + } + builder := ru.canAddEvent() + ru.log().Debug("CanAddEvent", "builder", builder) + return builder.run() +} + +func (params *aeParams) canAddEvent() ruleBuilderAE { + // run checks per payload type + switch payload := params.parsedEvent.Event.Payload.(type) { + case *StreamEvent_ChannelPayload: + return params.canAddChannelPayload(payload) + case *StreamEvent_DmChannelPayload: + return params.canAddDmChannelPayload(payload) + case *StreamEvent_GdmChannelPayload: + return params.canAddGdmChannelPayload(payload) + case *StreamEvent_SpacePayload: + return params.canAddSpacePayload(payload) + case *StreamEvent_UserPayload: + return params.canAddUserPayload(payload) + case *StreamEvent_UserDeviceKeyPayload: + return params.canAddUserDeviceKeyPayload(payload) + case *StreamEvent_UserSettingsPayload: + return params.canAddUserSettingsPayload(payload) + case *StreamEvent_UserInboxPayload: + return params.canAddUserInboxPayload(payload) + case *StreamEvent_MediaPayload: + return params.canAddMediaPayload(payload) + case *StreamEvent_MemberPayload: + return params.canAddMemberPayload(payload) + default: + return aeBuilder(). + fail(unknownPayloadType(payload)) + } +} + +func (params *aeParams) canAddChannelPayload(payload *StreamEvent_ChannelPayload) ruleBuilderAE { + switch content := payload.ChannelPayload.Content.(type) { + case *ChannelPayload_Inception_: + return aeBuilder(). + fail(invalidContentType(content)) + case *ChannelPayload_Message: + return aeBuilder(). + check(params.creatorIsMember). + requireChainAuth(params.channelMessageEntitlements) + case *ChannelPayload_Redaction_: + return aeBuilder().check(params.creatorIsMember). + requireChainAuth(params.redactChannelMessageEntitlements) + default: + return aeBuilder(). + fail(unknownContentType(content)) + } +} + +func (params *aeParams) canAddDmChannelPayload(payload *StreamEvent_DmChannelPayload) ruleBuilderAE { + switch content := payload.DmChannelPayload.Content.(type) { + case *DmChannelPayload_Inception_: + return aeBuilder(). + fail(invalidContentType(content)) + case *DmChannelPayload_Message: + return aeBuilder(). + check(params.creatorIsMember) + default: + return aeBuilder(). + fail(unknownContentType(content)) + } +} + +func (params *aeParams) canAddGdmChannelPayload(payload *StreamEvent_GdmChannelPayload) ruleBuilderAE { + switch content := payload.GdmChannelPayload.Content.(type) { + case *GdmChannelPayload_Inception_: + return aeBuilder(). + fail(invalidContentType(content)) + case *GdmChannelPayload_Message: + return aeBuilder(). + check(params.creatorIsMember) + case *GdmChannelPayload_ChannelProperties: + return aeBuilder(). + check(params.creatorIsMember) + default: + return aeBuilder(). + fail(unknownContentType(content)) + } +} + +func (params *aeParams) canAddSpacePayload(payload *StreamEvent_SpacePayload) ruleBuilderAE { + switch content := payload.SpacePayload.Content.(type) { + case *SpacePayload_Inception_: + return aeBuilder(). + fail(invalidContentType(content)) + case *SpacePayload_Channel_: + ru := &aeSpaceChannelRules{ + params: params, + channelUpdate: content.Channel, + } + if content.Channel.Op == ChannelOp_CO_UPDATED { + return aeBuilder(). + check(params.creatorIsMember) + } else { + return aeBuilder(). + check(params.creatorIsValidNode). + check(ru.validSpaceChannelOp) + } + default: + return aeBuilder(). + fail(unknownContentType(content)) + } +} + +func (params *aeParams) canAddUserPayload(payload *StreamEvent_UserPayload) ruleBuilderAE { + switch content := payload.UserPayload.Content.(type) { + case *UserPayload_Inception_: + return aeBuilder(). + fail(invalidContentType(content)) + + case *UserPayload_UserMembership_: + ru := &aeUserMembershipRules{ + params: params, + userMembership: content.UserMembership, + } + return aeBuilder(). + checkOneOf(params.creatorIsMember, params.creatorIsValidNode). + check(ru.validUserMembershipTransistion). + requireParentEvent(ru.parentEventForUserMembership) + case *UserPayload_UserMembershipAction_: + ru := &aeUserMembershipActionRules{ + params: params, + action: content.UserMembershipAction, + } + return aeBuilder(). + check(params.creatorIsMember). + requireParentEvent(ru.parentEventForUserMembershipAction) + default: + return aeBuilder(). + fail(unknownContentType(content)) + } +} + +func (params *aeParams) canAddUserDeviceKeyPayload(payload *StreamEvent_UserDeviceKeyPayload) ruleBuilderAE { + switch content := payload.UserDeviceKeyPayload.Content.(type) { + case *UserDeviceKeyPayload_Inception_: + return aeBuilder(). + fail(invalidContentType(content)) + case *UserDeviceKeyPayload_EncryptionDevice_: + return aeBuilder(). + check(params.creatorIsMember) + default: + return aeBuilder(). + fail(unknownContentType(content)) + } +} + +func (params *aeParams) canAddUserSettingsPayload(payload *StreamEvent_UserSettingsPayload) ruleBuilderAE { + switch content := payload.UserSettingsPayload.Content.(type) { + case *UserSettingsPayload_Inception_: + return aeBuilder(). + fail(invalidContentType(content)) + case *UserSettingsPayload_FullyReadMarkers_: + return aeBuilder(). + check(params.creatorIsMember) + case *UserSettingsPayload_UserBlock_: + return aeBuilder(). + check(params.creatorIsMember) + default: + return aeBuilder(). + fail(unknownContentType(content)) + } +} + +func (params *aeParams) canAddUserInboxPayload(payload *StreamEvent_UserInboxPayload) ruleBuilderAE { + switch content := payload.UserInboxPayload.Content.(type) { + case *UserInboxPayload_Inception_: + return aeBuilder(). + fail(invalidContentType(content)) + case *UserInboxPayload_GroupEncryptionSessions_: + return aeBuilder(). + check(params.pass) + case *UserInboxPayload_Ack_: + return aeBuilder(). + check(params.creatorIsMember) + default: + return aeBuilder(). + fail(unknownContentType(content)) + } +} + +func (params *aeParams) canAddMediaPayload(payload *StreamEvent_MediaPayload) ruleBuilderAE { + switch content := payload.MediaPayload.Content.(type) { + case *MediaPayload_Inception_: + return aeBuilder(). + fail(invalidContentType(content)) + case *MediaPayload_Chunk_: + ru := &aeMediaPayloadChunkRules{ + params: params, + chunk: content.Chunk, + } + return aeBuilder(). + check(ru.canAddMediaChunk) + default: + return aeBuilder(). + fail(unknownContentType(content)) + } +} + +func (params *aeParams) canAddMemberPayload(payload *StreamEvent_MemberPayload) ruleBuilderAE { + switch content := payload.MemberPayload.Content.(type) { + case *MemberPayload_Membership_: + ru := &aeMembershipRules{ + params: params, + membership: content.Membership, + } + if shared.ValidSpaceStreamId(ru.params.streamView.StreamId()) { + return aeBuilder(). + check(ru.validMembershipPayload). + check(ru.validMembershipTransistionForSpace). + check(ru.validMembershipLimit). + requireChainAuth(ru.spaceMembershipEntitlements) + } else if shared.ValidChannelStreamId(ru.params.streamView.StreamId()) { + return aeBuilder(). + check(ru.validMembershipPayload). + check(ru.validMembershipTransistionForChannel). + check(ru.validMembershipLimit). + requireChainAuth(ru.channelMembershipEntitlements). + requireParentEvent(ru.requireStreamParentMembership) + } else if shared.ValidDMChannelStreamId(ru.params.streamView.StreamId()) { + return aeBuilder(). + check(ru.validMembershipPayload). + check(ru.validMembershipTransistionForDM). + check(ru.validMembershipLimit) + } else if shared.ValidGDMChannelStreamId(ru.params.streamView.StreamId()) { + return aeBuilder(). + check(ru.validMembershipPayload). + check(ru.validMembershipTransistionForGDM). + check(ru.validMembershipLimit) + } else { + return aeBuilder(). + fail(RiverError(Err_INVALID_ARGUMENT, "invalid stream id for membership payload", "streamId", ru.params.streamView.StreamId())) + } + case *MemberPayload_KeySolicitation_: + ru := &aeKeySolicitationRules{ + params: params, + solicitation: content.KeySolicitation, + } + return aeBuilder(). + checkOneOf(params.creatorIsMember). + check(ru.validKeySolicitation) + case *MemberPayload_KeyFulfillment_: + ru := &aeKeyFulfillmentRules{ + params: params, + fulfillment: content.KeyFulfillment, + } + return aeBuilder(). + checkOneOf(params.creatorIsMember). + check(ru.validKeyFulfillment) + case *MemberPayload_DisplayName: + return aeBuilder(). + check(params.creatorIsMember) + case *MemberPayload_Username: + return aeBuilder(). + check(params.creatorIsMember) + case *MemberPayload_EnsAddress: + ru := &aeEnsAddressRules{ + params: params, + address: content, + } + return aeBuilder(). + check(params.creatorIsMember). + check(ru.validEnsAddress) + case *MemberPayload_Nft_: + ru := &aeNftRules{ + params: params, + nft: content.Nft, + } + return aeBuilder(). + check(params.creatorIsMember). + check(ru.validNft) + + default: + return aeBuilder(). + fail(unknownContentType(content)) + } +} + +func (params *aeParams) pass() (bool, error) { + // we probably shouldn't ever have 0 checks... currently this is the case in one place + return true, nil +} + +func (params *aeParams) creatorIsMember() (bool, error) { + creatorAddress := params.parsedEvent.Event.CreatorAddress + isMember, err := params.streamView.IsMember(creatorAddress) + if err != nil { + return false, err + } + if !isMember { + return false, RiverError( + Err_PERMISSION_DENIED, + "event creator is not a member of the stream", + "creatorAddress", + creatorAddress, + "streamId", + params.streamView.StreamId(), + ) + } + return true, nil +} + +func (ru *aeMembershipRules) validMembershipPayload() (bool, error) { + if ru.membership == nil { + return false, RiverError(Err_INVALID_ARGUMENT, "membership is nil") + } + // for join events require a parent stream id if the stream has a parent + if ru.membership.Op == MembershipOp_SO_JOIN { + streamParentId := ru.params.streamView.StreamParentId() + + if streamParentId != nil { + if ru.membership.StreamParentId == nil { + return false, RiverError( + Err_INVALID_ARGUMENT, + "membership parent stream id is nil", + "streamParentId", + streamParentId, + ) + } + if !streamParentId.EqualsBytes(ru.membership.StreamParentId) { + return false, RiverError( + Err_INVALID_ARGUMENT, + "membership parent stream id does not match parent stream id", + "membershipParentStreamId", + FormatFullHashFromBytes(ru.membership.StreamParentId), + "streamParentId", + streamParentId, + ) + } + } + } + return true, nil +} + +func (ru *aeMembershipRules) validMembershipLimit() (bool, error) { + if ru.membership.Op == MembershipOp_SO_JOIN || ru.membership.Op == MembershipOp_SO_INVITE { + members, err := ru.params.streamView.(events.JoinableStreamView).GetChannelMembers() + if err != nil { + return false, err + } + membershipLimit := ru.params.cfg.GetMembershipLimit(*ru.params.streamView.StreamId()) + if membershipLimit > 0 && (*members).Cardinality() >= membershipLimit { + return false, RiverError( + Err_INVALID_ARGUMENT, + "membership limit reached", + "membershipLimit", + membershipLimit) + } + } + return true, nil +} + +func (ru *aeMembershipRules) validMembershipTransistion() (bool, error) { + if ru.membership == nil { + return false, RiverError(Err_INVALID_ARGUMENT, "membership is nil") + } + if ru.membership.Op == MembershipOp_SO_UNSPECIFIED { + return false, RiverError(Err_INVALID_ARGUMENT, "membership op is unspecified") + } + + userAddress := ru.membership.UserAddress + + currentMembership, err := ru.params.streamView.(events.JoinableStreamView).GetMembership(userAddress) + if err != nil { + return false, err + } + if currentMembership == ru.membership.Op { + return false, nil + } + + switch currentMembership { + case MembershipOp_SO_INVITE: + // from invite only join and leave are valid + return true, nil + case MembershipOp_SO_JOIN: + // from join only leave is valid + if ru.membership.Op == MembershipOp_SO_LEAVE { + return true, nil + } else { + return false, RiverError(Err_PERMISSION_DENIED, "only leave is valid from join", "op", ru.membership.Op) + } + case MembershipOp_SO_LEAVE: + // from leave, invite and join are valid + return true, nil + case MembershipOp_SO_UNSPECIFIED: + // from unspecified, leave isn't valid, return a no-op + if ru.membership.Op == MembershipOp_SO_LEAVE { + return false, nil + } else { + return true, nil + } + default: + return false, RiverError(Err_BAD_EVENT, "invalid current membership", "currentMembership", currentMembership) + } +} + +func (ru *aeMembershipRules) validMembershipTransistionForSpace() (bool, error) { + canAdd, err := ru.params.creatorIsValidNode() + if !canAdd || err != nil { + return canAdd, err + } + + canAdd, err = ru.validMembershipTransistion() + if !canAdd || err != nil { + return canAdd, err + } + return true, nil +} + +func (ru *aeMembershipRules) validMembershipTransistionForChannel() (bool, error) { + canAdd, err := ru.params.creatorIsValidNode() + if !canAdd || err != nil { + return canAdd, err + } + + canAdd, err = ru.validMembershipTransistion() + if !canAdd || err != nil { + return canAdd, err + } + + return true, nil +} + +// / GDMs and DMs don't have blockchain entitlements so we need to run extra checks +func (ru *aeMembershipRules) validMembershipTransistionForDM() (bool, error) { + canAdd, err := ru.params.creatorIsValidNode() + if !canAdd || err != nil { + return canAdd, err + } + + canAdd, err = ru.validMembershipTransistion() + if !canAdd || err != nil { + return canAdd, err + } + + if ru.membership == nil { + return false, RiverError(Err_INVALID_ARGUMENT, "membership is nil") + } + + inception, err := ru.params.streamView.(events.DMChannelStreamView).GetDMChannelInception() + if err != nil { + return false, err + } + + fp := inception.FirstPartyAddress + sp := inception.SecondPartyAddress + + userAddress := ru.membership.UserAddress + initiatorAddress := ru.membership.InitiatorAddress + + if !ru.params.isValidNode(initiatorAddress) { + if !bytes.Equal(initiatorAddress, fp) && !bytes.Equal(initiatorAddress, sp) { + return false, RiverError( + Err_PERMISSION_DENIED, + "initiator is not a member of DM", + "initiator", + initiatorAddress, + ) + } + } + + if !bytes.Equal(userAddress, fp) && !bytes.Equal(userAddress, sp) { + return false, RiverError(Err_PERMISSION_DENIED, "user is not a member of DM", "user", userAddress) + } + + if ru.membership.Op != MembershipOp_SO_LEAVE && ru.membership.Op != MembershipOp_SO_JOIN { + return false, RiverError(Err_PERMISSION_DENIED, "only join and leave events are permitted") + } + return true, nil +} + +// / GDMs and DMs don't have blockchain entitlements so we need to run extra checks +func (ru *aeMembershipRules) validMembershipTransistionForGDM() (bool, error) { + canAdd, err := ru.params.creatorIsValidNode() + if !canAdd || err != nil { + return canAdd, err + } + + canAdd, err = ru.validMembershipTransistion() + if !canAdd || err != nil { + return canAdd, err + } + + if ru.membership == nil { + return false, RiverError(Err_INVALID_ARGUMENT, "membership is nil") + } + + initiatorAddress := ru.membership.InitiatorAddress + userAddress := ru.membership.UserAddress + + initiatorMembership, err := ru.params.streamView.(events.JoinableStreamView).GetMembership(initiatorAddress) + if err != nil { + return false, err + } + userMembership, err := ru.params.streamView.(events.JoinableStreamView).GetMembership(userAddress) + if err != nil { + return false, err + } + + switch ru.membership.Op { + case MembershipOp_SO_INVITE: + // only members can invite (also for some reason invited can invite) + if initiatorMembership != MembershipOp_SO_JOIN && initiatorMembership != MembershipOp_SO_INVITE { + return false, RiverError( + Err_PERMISSION_DENIED, + "initiator of invite is not a member of GDM", + "initiator", + initiatorAddress, + "nodes", + ru.params.validNodeAddresses, + ) + } + return true, nil + case MembershipOp_SO_JOIN: + // if current membership is invite, allow + if userMembership == MembershipOp_SO_INVITE { + return true, nil + } + // if the user is not invited, fail if the initiator is the user, + if bytes.Equal(initiatorAddress, userAddress) { + return false, RiverError(Err_PERMISSION_DENIED, "user is not invited to GDM", "user", userAddress) + } + // check the initiator membership + if initiatorMembership != MembershipOp_SO_JOIN { + return false, RiverError( + Err_PERMISSION_DENIED, + "initiator of join is not a member of GDM", + "initiator", + initiatorAddress, + ) + } + // user is either invited, or initiator is a member and the user did not just leave + return true, nil + case MembershipOp_SO_LEAVE: + // only members can initiate leave + if initiatorMembership != MembershipOp_SO_JOIN && initiatorMembership != MembershipOp_SO_INVITE { + return false, RiverError( + Err_PERMISSION_DENIED, + "initiator of leave is not a member of GDM", + "initiator", + initiatorAddress, + ) + } + return true, nil + case MembershipOp_SO_UNSPECIFIED: + return false, RiverError(Err_INVALID_ARGUMENT, "membership op is unspecified") + default: + return false, RiverError(Err_PERMISSION_DENIED, "unknown membership event", "op", ru.membership.Op) + } +} + +func (ru *aeMembershipRules) requireStreamParentMembership() (*RequiredParentEvent, error) { + if ru.membership == nil { + return nil, RiverError(Err_INVALID_ARGUMENT, "membership is nil") + } + if ru.membership.Op == MembershipOp_SO_LEAVE { + return nil, nil + } + if ru.membership.Op == MembershipOp_SO_INVITE { + return nil, nil + } + streamParentId := ru.params.streamView.StreamParentId() + if streamParentId == nil { + return nil, nil + } + + userStreamId, err := shared.UserStreamIdFromBytes(ru.membership.UserAddress) + if err != nil { + return nil, err + } + initiatorId, err := shared.AddressHex(ru.membership.InitiatorAddress) + if err != nil { + return nil, err + } + // for joins and invites, require space membership + return &RequiredParentEvent{ + Payload: events.Make_UserPayload_Membership(MembershipOp_SO_JOIN, *streamParentId, &initiatorId, nil), + StreamId: userStreamId, + }, nil +} + +func (ru *aeUserMembershipRules) validUserMembershipTransistion() (bool, error) { + if ru.userMembership == nil { + return false, RiverError(Err_INVALID_ARGUMENT, "membership is nil") + } + if ru.userMembership.Op == MembershipOp_SO_UNSPECIFIED { + return false, RiverError(Err_INVALID_ARGUMENT, "membership op is unspecified") + } + streamId, err := shared.StreamIdFromBytes(ru.userMembership.StreamId) + if err != nil { + return false, err + } + currentMembershipOp, err := ru.params.streamView.(events.UserStreamView).GetUserMembership(streamId) + if err != nil { + return false, err + } + + if currentMembershipOp == ru.userMembership.Op { + return false, nil + } + + switch currentMembershipOp { + case MembershipOp_SO_INVITE: + // from invite only join and leave are valid + return true, nil + case MembershipOp_SO_JOIN: + // from join only leave is valid + if ru.userMembership.Op == MembershipOp_SO_LEAVE { + return true, nil + } else { + return false, RiverError(Err_PERMISSION_DENIED, "only leave is valid from join", "op", ru.userMembership.Op) + } + case MembershipOp_SO_LEAVE: + // from leave, invite and join are valid + return true, nil + case MembershipOp_SO_UNSPECIFIED: + // from unspecified, leave would be a no op, join and invite are valid + if ru.userMembership.Op == MembershipOp_SO_LEAVE { + return false, nil + } else { + return true, nil + } + default: + return false, RiverError(Err_BAD_EVENT, "invalid current membership", "op", currentMembershipOp) + } +} + +// / user membership triggers membership events on space, channel, dm, gdm streams +func (ru *aeUserMembershipRules) parentEventForUserMembership() (*RequiredParentEvent, error) { + if ru.userMembership == nil { + return nil, RiverError(Err_INVALID_ARGUMENT, "event is not a user membership event") + } + userMembership := ru.userMembership + creatorAddress := ru.params.parsedEvent.Event.CreatorAddress + + userAddress, err := shared.GetUserAddressFromStreamId(*ru.params.streamView.StreamId()) + if err != nil { + return nil, err + } + + toStreamId, err := shared.StreamIdFromBytes(userMembership.StreamId) + if err != nil { + return nil, err + } + var initiatorAddress []byte + if userMembership.Inviter != nil && ru.params.isValidNode(creatorAddress) { + // the initiator will need permissions to do specific things + // if the creator of this payload was a valid node, trust that the inviter was the initiator + initiatorAddress = userMembership.Inviter + } else { + // otherwise the initiator is the creator of the event + initiatorAddress = creatorAddress + } + + return &RequiredParentEvent{ + Payload: events.Make_MemberPayload_Membership( + userMembership.Op, + userAddress.Bytes(), + initiatorAddress, + userMembership.StreamParentId, + ), + StreamId: toStreamId, + }, nil +} + +// / user actions perform user membership events on other user's streams +func (ru *aeUserMembershipActionRules) parentEventForUserMembershipAction() (*RequiredParentEvent, error) { + if ru.action == nil { + return nil, RiverError(Err_INVALID_ARGUMENT, "event is not a user membership action event") + } + action := ru.action + inviterId, err := shared.AddressHex(ru.params.parsedEvent.Event.CreatorAddress) + if err != nil { + return nil, err + } + actionStreamId, err := shared.StreamIdFromBytes(action.StreamId) + if err != nil { + return nil, err + } + payload := events.Make_UserPayload_Membership(action.Op, actionStreamId, &inviterId, action.StreamParentId) + toUserStreamId, err := shared.UserStreamIdFromBytes(action.UserId) + if err != nil { + return nil, err + } + return &RequiredParentEvent{ + Payload: payload, + StreamId: toUserStreamId, + }, nil +} + +func (ru *aeMembershipRules) spaceMembershipEntitlements() (*auth.ChainAuthArgs, error) { + streamId := ru.params.streamView.StreamId() + + permission, permissionUser, err := ru.getPermissionForMembershipOp() + if err != nil { + return nil, err + } + + if permission == auth.PermissionUndefined { + return nil, nil + } + + chainAuthArgs := auth.NewChainAuthArgsForSpace( + *streamId, + permissionUser, + permission, + ) + return chainAuthArgs, nil +} + +func (ru *aeMembershipRules) channelMembershipEntitlements() (*auth.ChainAuthArgs, error) { + inception, err := ru.params.streamView.(events.ChannelStreamView).GetChannelInception() + if err != nil { + return nil, err + } + + permission, permissionUser, err := ru.getPermissionForMembershipOp() + if err != nil { + return nil, err + } + + if permission == auth.PermissionUndefined { + return nil, nil + } + + spaceId, err := shared.StreamIdFromBytes(inception.SpaceId) + if err != nil { + return nil, err + } + + chainAuthArgs := auth.NewChainAuthArgsForChannel( + spaceId, + *ru.params.streamView.StreamId(), + permissionUser, + permission, + ) + + return chainAuthArgs, nil +} + +func (params *aeParams) channelMessageEntitlements() (*auth.ChainAuthArgs, error) { + userId, err := shared.AddressHex(params.parsedEvent.Event.CreatorAddress) + if err != nil { + return nil, err + } + + inception, err := params.streamView.(events.ChannelStreamView).GetChannelInception() + if err != nil { + return nil, err + } + + spaceId, err := shared.StreamIdFromBytes(inception.SpaceId) + if err != nil { + return nil, err + } + + chainAuthArgs := auth.NewChainAuthArgsForChannel( + spaceId, + *params.streamView.StreamId(), + userId, + auth.PermissionWrite, + ) + + return chainAuthArgs, nil +} + +func (params *aeParams) redactChannelMessageEntitlements() (*auth.ChainAuthArgs, error) { + userId, err := shared.AddressHex(params.parsedEvent.Event.CreatorAddress) + if err != nil { + return nil, err + } + + inception, err := params.streamView.(events.ChannelStreamView).GetChannelInception() + if err != nil { + return nil, err + } + + spaceId, err := shared.StreamIdFromBytes(inception.SpaceId) + if err != nil { + return nil, err + } + + chainAuthArgs := auth.NewChainAuthArgsForChannel( + spaceId, + *params.streamView.StreamId(), + userId, + auth.PermissionRedact, + ) + + return chainAuthArgs, nil +} + +func (params *aeParams) creatorIsValidNode() (bool, error) { + creatorAddress := params.parsedEvent.Event.CreatorAddress + if !params.isValidNode(creatorAddress) { + return false, RiverError( + Err_UNKNOWN_NODE, + "Event creator must be a valid node", + "address", + creatorAddress, + "nodes", + params.validNodeAddresses, + ).Func("CheckNodeIsValid") + } + return true, nil +} + +func (ru *aeMembershipRules) getPermissionForMembershipOp() (auth.Permission, string, error) { + if ru.membership == nil { + return auth.PermissionUndefined, "", RiverError(Err_INVALID_ARGUMENT, "membership is nil") + } + membership := ru.membership + + // todo aellis - don't need these conversions + initiatorId, err := shared.AddressHex(ru.membership.InitiatorAddress) + if err != nil { + return auth.PermissionUndefined, "", err + } + + userAddress := ru.membership.UserAddress + userId, err := shared.AddressHex(userAddress) + if err != nil { + return auth.PermissionUndefined, "", err + } + + currentMembership, err := ru.params.streamView.(events.JoinableStreamView).GetMembership(userAddress) + if err != nil { + return auth.PermissionUndefined, "", err + } + if membership.Op == currentMembership { + // this could panic, the rule builder should never allow us to get here + return auth.PermissionUndefined, "", RiverError( + Err_FAILED_PRECONDITION, + "membershipOp should not be the same as currentMembership", + ) + } + + switch membership.Op { + case MembershipOp_SO_INVITE: + if currentMembership == MembershipOp_SO_JOIN { + return auth.PermissionUndefined, "", RiverError( + Err_FAILED_PRECONDITION, + "user is already a member of the channel", + "user", + userId, + "initiator", + initiatorId, + ) + } + return auth.PermissionInvite, initiatorId, nil + + case MembershipOp_SO_JOIN: + return auth.PermissionRead, userId, nil + + case MembershipOp_SO_LEAVE: + if currentMembership != MembershipOp_SO_JOIN { + return auth.PermissionUndefined, "", RiverError( + Err_FAILED_PRECONDITION, + "user is not a member of the channel", + "user", + userId, + "initiator", + initiatorId, + ) + } + if userId != initiatorId { + return auth.PermissionBan, initiatorId, nil + } else { + return auth.PermissionUndefined, userId, nil + } + + case MembershipOp_SO_UNSPECIFIED: + fallthrough + + default: + return auth.PermissionUndefined, "", RiverError(Err_BAD_EVENT, "Need valid membership op", "op", membership.Op) + } +} + +func (ru *aeSpaceChannelRules) validSpaceChannelOp() (bool, error) { + if ru.channelUpdate == nil { + return false, RiverError(Err_INVALID_ARGUMENT, "event is not a channel event") + } + + next := ru.channelUpdate + view := ru.params.streamView.(events.SpaceStreamView) + channelId, err := shared.StreamIdFromBytes(next.ChannelId) + if err != nil { + return false, err + } + current, err := view.GetChannelInfo(channelId) + if err != nil { + return false, err + } + // if we don't have a channel, accept add + if current == nil { + return next.Op == ChannelOp_CO_CREATED, nil + } + + if current.Op == ChannelOp_CO_DELETED { + return false, RiverError(Err_PERMISSION_DENIED, "channel is deleted", "channelId", channelId) + } + + if next.Op == ChannelOp_CO_CREATED { + // this channel is already created, we can't create it again, but it's not an error, this event is a no-op + return false, nil + } + + return true, nil +} + +func (ru *aeMediaPayloadChunkRules) canAddMediaChunk() (bool, error) { + canAdd, err := ru.params.creatorIsMember() + if !canAdd || err != nil { + return canAdd, err + } + + if ru.chunk == nil { + return false, RiverError(Err_INVALID_ARGUMENT, "event is not a media chunk event") + } + chunk := ru.chunk + + inception, err := ru.params.streamView.(events.MediaStreamView).GetMediaInception() + if err != nil { + return false, err + } + + if chunk.ChunkIndex >= inception.ChunkCount || chunk.ChunkIndex < 0 { + return false, RiverError(Err_INVALID_ARGUMENT, "chunk index out of bounds") + } + + if len(chunk.Data) > ru.params.cfg.Media.MaxChunkSize { + return false, RiverError( + Err_INVALID_ARGUMENT, + "chunk size must be less than or equal to", + "cfg.Media.MaxChunkSize", + ru.params.cfg.Media.MaxChunkSize) + } + + return true, nil +} + +func (ru *aeKeySolicitationRules) validKeySolicitation() (bool, error) { + // key solicitations are allowed if they are not empty, or if they are empty and isNewDevice is true and there is no existing device key + if ru.solicitation == nil { + return false, RiverError(Err_INVALID_ARGUMENT, "event is not a key solicitation event") + } + + if !ru.solicitation.IsNewDevice && len(ru.solicitation.SessionIds) == 0 { + return false, RiverError(Err_INVALID_ARGUMENT, "session ids are required for existing devices") + } + + return true, nil +} + +func (ru *aeKeyFulfillmentRules) validKeyFulfillment() (bool, error) { + if ru.fulfillment == nil { + return false, RiverError(Err_INVALID_ARGUMENT, "event is not a key fulfillment event") + } + userAddress := ru.fulfillment.UserAddress + solicitations, err := ru.params.streamView.(events.JoinableStreamView).GetKeySolicitations(userAddress) + if err != nil { + return false, err + } + + // loop over solicitations, see if the device key exists + for _, solicitation := range solicitations { + if solicitation.DeviceKey == ru.fulfillment.DeviceKey { + if solicitation.IsNewDevice { + return true, nil + } + if hasCommon(solicitation.SessionIds, sort.StringSlice(ru.fulfillment.SessionIds)) { + return true, nil + } + return false, RiverError(Err_INVALID_ARGUMENT, "solicitation with common session ids not found") + } + } + return false, RiverError(Err_INVALID_ARGUMENT, "solicitation with matching device key not found") +} + +func (ru *aeEnsAddressRules) validEnsAddress() (bool, error) { + if ru.address == nil { + return false, RiverError(Err_INVALID_ARGUMENT, "event is not an ENS address event") + } + + // Allow users to clear their ENS Address or set a valid address + if len(ru.address.EnsAddress) != 0 && len(ru.address.EnsAddress) != 20 { + return false, RiverError(Err_INVALID_ARGUMENT, "Invalid ENS address length") + } + return true, nil +} + +func (ru *aeNftRules) validNft() (bool, error) { + if ru.nft == nil { + return false, RiverError(Err_INVALID_ARGUMENT, "event is not an NFT address event") + } + + // Allow users to clear their NFT or set a valid NFT + if len(ru.nft.ContractAddress) == 0 { + return true, nil + } + + if len(ru.nft.ContractAddress) != 20 { + return false, RiverError(Err_INVALID_ARGUMENT, "invalid contract address") + } + + if len(ru.nft.TokenId) == 0 { + return false, RiverError(Err_INVALID_ARGUMENT, "invalid token id") + } + + if ru.nft.ChainId == 0 { + return false, RiverError(Err_INVALID_ARGUMENT, "invalid chain id") + } + + return true, nil +} + +func (params *aeParams) isValidNode(addressOrId []byte) bool { + for _, item := range params.validNodeAddresses { + if bytes.Equal(item[:], addressOrId) { + return true + } + } + return false +} + +func (params *aeParams) log() *slog.Logger { + return dlog.FromCtx(params.ctx) +} + +func hasCommon(x, y []string) bool { + i, j := 0, 0 + + for i < len(x) && j < len(y) { + if x[i] < y[j] { + i++ + } else if x[i] > y[j] { + j++ + } else { + return true + } + } + + return false +} diff --git a/core/node/rules/can_create_stream.go b/core/node/rules/can_create_stream.go new file mode 100644 index 000000000..c0fb2ac26 --- /dev/null +++ b/core/node/rules/can_create_stream.go @@ -0,0 +1,760 @@ +package rules + +import ( + "bytes" + "context" + "fmt" + "log/slog" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/river-build/river/core/node/auth" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/events" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/shared" +) + +type csParams struct { + ctx context.Context + cfg *config.StreamConfig + streamId shared.StreamId + parsedEvents []*events.ParsedEvent + inceptionPayload IsInceptionPayload + creatorAddress []byte + creatorUserId string + creatorUserStreamId shared.StreamId +} + +type csSpaceRules struct { + params *csParams + inception *SpacePayload_Inception +} + +type csChannelRules struct { + params *csParams + inception *ChannelPayload_Inception +} + +type csMediaRules struct { + params *csParams + inception *MediaPayload_Inception +} + +type csDmChannelRules struct { + params *csParams + inception *DmChannelPayload_Inception +} + +type csGdmChannelRules struct { + params *csParams + inception *GdmChannelPayload_Inception +} + +type csUserRules struct { + params *csParams + inception *UserPayload_Inception +} + +type csUserDeviceKeyRules struct { + params *csParams + inception *UserDeviceKeyPayload_Inception +} + +type csUserSettingsRules struct { + params *csParams + inception *UserSettingsPayload_Inception +} + +type csUserInboxRules struct { + params *csParams + inception *UserInboxPayload_Inception +} + +/* +* +* CanCreateStreamEvent +* a pure function with no side effects that returns a boolean value and prerequesits +* for creating a stream. +* + - @return creatorStreamId string // the id of the creator's user stream + - @return requiredUsers []string // user ids that must have valid user streams before creating the stream + - @return requiredMemberships []string // stream ids that the creator must be a member of to create the stream + // every case except for the user stream the creator must be a member of their own user stream first + - @return chainAuthArgs *auth.ChainAuthArgs // on chain requirements for creating the stream + - @return derivedEvents []*DerivedEvent // event that should be added after the stream is created + // derived events events must be replayable - meaning that in the case of a no-op, the can_add_event + // function should return false, nil, nil, nil to indicate + // that the event cannot be added to the stream, but there is no error + - @return error // if adding result would result in invalid state + +* +* example valid states: +* (nil, nil, nil) // stream can be created +* (nil, nil, error) // stream falied validation +* (nil, []*DerivedEvent, nil) // stream can be created and derived events should be created after +* (chainAuthArgs, nil, nil) // stream can be created if chainAuthArgs are satisfied +* (chainAuthArgs, []*DerivedEvent, nil) // stream can be created if chainAuthArgs are satisfied and derived events should be created after +*/ +func CanCreateStream( + ctx context.Context, + cfg *config.StreamConfig, + currentTime time.Time, + streamId shared.StreamId, + parsedEvents []*events.ParsedEvent, +) (*CreateStreamRules, error) { + if len(parsedEvents) == 0 { + return nil, RiverError(Err_BAD_STREAM_CREATION_PARAMS, "no events") + } + + if parsedEvents[0].Event.DelegateExpiryEpochMs > 0 && + isPastExpiry(currentTime, parsedEvents[0].Event.DelegateExpiryEpochMs) { + return nil, RiverError( + Err_PERMISSION_DENIED, + "event delegate has expired", + "currentTime", + currentTime, + "expiry", + parsedEvents[0].Event.DelegateExpiryEpochMs, + ) + } + + creatorAddress := parsedEvents[0].Event.GetCreatorAddress() + creatorUserId, err := shared.AddressHex(creatorAddress) + if err != nil { + return nil, err + } + creatorUserStreamId, err := shared.UserStreamIdFromBytes(creatorAddress) + if err != nil { + return nil, RiverError(Err_BAD_STREAM_CREATION_PARAMS, "invalid creator user stream id", "err", err) + } + + for _, event := range parsedEvents { + if event.Event.PrevMiniblockHash != nil { + return nil, RiverError(Err_BAD_STREAM_CREATION_PARAMS, "PrevMiniblockHash should be nil") + } + if !bytes.Equal(event.Event.CreatorAddress, creatorAddress) { + return nil, RiverError(Err_BAD_STREAM_CREATION_PARAMS, "all events should have the same creator address") + } + } + + inceptionEvent := parsedEvents[0] + inceptionPayload := inceptionEvent.Event.GetInceptionPayload() + if inceptionPayload == nil { + return nil, RiverError(Err_BAD_STREAM_CREATION_PARAMS, "first event is not an inception event") + } + + if !streamId.EqualsBytes(inceptionPayload.GetStreamId()) { + return nil, RiverError( + Err_BAD_STREAM_CREATION_PARAMS, + "stream id in request does not match stream id in inception event", + "inceptionStreamId", + inceptionPayload.GetStreamId(), + "streamId", + streamId, + ) + } + + r := &csParams{ + ctx: ctx, + cfg: cfg, + streamId: streamId, + parsedEvents: parsedEvents, + inceptionPayload: inceptionPayload, + creatorAddress: creatorAddress, + creatorUserId: creatorUserId, + creatorUserStreamId: creatorUserStreamId, + } + + builder := r.canCreateStream() + r.log().Debug("CanCreateStream", "builder", builder) + return builder.run() +} + +func (ru *csParams) log() *slog.Logger { + return dlog.FromCtx(ru.ctx) +} + +func (ru *csParams) canCreateStream() ruleBuilderCS { + builder := csBuilder(ru.creatorUserStreamId) + + switch inception := ru.inceptionPayload.(type) { + + case *SpacePayload_Inception: + ru := &csSpaceRules{ + params: ru, + inception: inception, + } + return builder. + check( + ru.params.streamIdTypeIsCorrect(shared.STREAM_SPACE_BIN), + ru.params.eventCountMatches(2), + ru.validateSpaceJoinEvent, + ). + requireChainAuth(ru.getCreateSpaceChainAuth). + requireDerivedEvent(ru.params.derivedMembershipEvent) + + case *ChannelPayload_Inception: + ru := &csChannelRules{ + params: ru, + inception: inception, + } + return builder. + check( + ru.params.streamIdTypeIsCorrect(shared.STREAM_CHANNEL_BIN), + ru.params.eventCountMatches(2), + ru.validateChannelJoinEvent, + ). + requireMembership( + inception.SpaceId, + ). + requireChainAuth(ru.getCreateChannelChainAuth). + requireDerivedEvent( + ru.derivedChannelSpaceParentEvent, + ru.params.derivedMembershipEvent, + ) + + case *MediaPayload_Inception: + ru := &csMediaRules{ + params: ru, + inception: inception, + } + return builder. + check( + ru.params.streamIdTypeIsCorrect(shared.STREAM_MEDIA_BIN), + ru.params.eventCountMatches(1), + ru.checkMediaInceptionPayload, + ). + requireMembership( + inception.ChannelId, + ). + requireChainAuth(ru.getChainAuthForMediaStream) + + case *DmChannelPayload_Inception: + ru := &csDmChannelRules{ + params: ru, + inception: inception, + } + return builder. + check( + ru.params.streamIdTypeIsCorrect(shared.STREAM_DM_CHANNEL_BIN), + ru.params.eventCountMatches(3), + ru.checkDMInceptionPayload, + ). + requireUserAddr(ru.inception.SecondPartyAddress). + requireDerivedEvents(ru.derivedDMMembershipEvents) + + case *GdmChannelPayload_Inception: + ru := &csGdmChannelRules{ + params: ru, + inception: inception, + } + return builder. + check( + ru.params.streamIdTypeIsCorrect(shared.STREAM_GDM_CHANNEL_BIN), + ru.params.eventCountGreaterThanOrEqualTo(4), + ru.checkGDMPayloads, + ). + requireUser(ru.getGDMUserIds()[1:]...). + requireDerivedEvents(ru.derivedGDMMembershipEvents) + + case *UserPayload_Inception: + ru := &csUserRules{ + params: ru, + inception: inception, + } + return builder. + check( + ru.params.streamIdTypeIsCorrect(shared.STREAM_USER_BIN), + ru.params.eventCountMatches(1), + ru.params.isUserStreamId, + ) + // TODO HNT-4630 add chain auth for user stream + + case *UserDeviceKeyPayload_Inception: + ru := &csUserDeviceKeyRules{ + params: ru, + inception: inception, + } + return builder. + check( + ru.params.streamIdTypeIsCorrect(shared.STREAM_USER_DEVICE_KEY_BIN), + ru.params.eventCountMatches(1), + ru.params.isUserStreamId, + ) + // TODO HNT-4630 add chain auth for user stream + + case *UserSettingsPayload_Inception: + ru := &csUserSettingsRules{ + params: ru, + inception: inception, + } + return builder. + check( + ru.params.streamIdTypeIsCorrect(shared.STREAM_USER_SETTINGS_BIN), + ru.params.eventCountMatches(1), + ru.params.isUserStreamId, + ) + // TODO HNT-4630 add chain auth for user stream + + case *UserInboxPayload_Inception: + ru := &csUserInboxRules{ + params: ru, + inception: inception, + } + return builder. + check( + ru.params.streamIdTypeIsCorrect(shared.STREAM_USER_INBOX_BIN), + ru.params.eventCountMatches(1), + ru.params.isUserStreamId, + ) + // TODO HNT-4630 add chain auth for user stream + + default: + return builder.fail(unknownPayloadType(inception)) + } +} + +func (ru *csParams) streamIdTypeIsCorrect(expectedType byte) func() error { + return func() error { + if ru.streamId.Type() == expectedType { + return nil + } else { + return RiverError(Err_BAD_STREAM_CREATION_PARAMS, "invalid stream id type", "streamId", ru.streamId, "expectedType", expectedType) + } + } +} + +func (ru *csParams) isUserStreamId() error { + addressInName, err := shared.GetUserAddressFromStreamId(ru.streamId) + if err != nil { + return err + } + + // TODO: there is also ru.creatorAddress, should it be used here? + creatorAddress := common.BytesToAddress(ru.parsedEvents[0].Event.GetCreatorAddress()) + + if addressInName != creatorAddress { + return RiverError( + Err_BAD_STREAM_CREATION_PARAMS, + "stream id doesn't match creator address", + "streamId", + ru.streamId, + "addressInName", + addressInName, + "creator", + creatorAddress, + ) + } + return nil +} + +func (ru *csParams) eventCountMatches(eventCount int) func() error { + return func() error { + if len(ru.parsedEvents) != eventCount { + return RiverError( + Err_BAD_STREAM_CREATION_PARAMS, + "bad event count", + "count", + len(ru.parsedEvents), + "expectedCount", + eventCount, + ) + } + return nil + } +} + +func (ru *csParams) eventCountGreaterThanOrEqualTo(eventCount int) func() error { + return func() error { + if len(ru.parsedEvents) < eventCount { + return RiverError( + Err_BAD_STREAM_CREATION_PARAMS, + "bad event count", + "count", + len(ru.parsedEvents), + "expectedCount", + eventCount, + ) + } + return nil + } +} + +func (ru *csChannelRules) validateChannelJoinEvent() error { + const joinEventIndex = 1 + event := ru.params.parsedEvents[joinEventIndex] + payload := event.Event.GetMemberPayload() + if payload == nil { + return RiverError(Err_BAD_STREAM_CREATION_PARAMS, "second event is not a channel payload") + } + membershipPayload := payload.GetMembership() + if membershipPayload == nil { + return RiverError(Err_BAD_STREAM_CREATION_PARAMS, "second event is not a channel join event") + } + return ru.params.validateOwnJoinEventPayload(event, membershipPayload) +} + +func (ru *csSpaceRules) validateSpaceJoinEvent() error { + joinEventIndex := 1 + event := ru.params.parsedEvents[joinEventIndex] + payload := event.Event.GetMemberPayload() + if payload == nil { + return RiverError(Err_BAD_STREAM_CREATION_PARAMS, "second event is not a channel payload") + } + membershipPayload := payload.GetMembership() + if membershipPayload == nil { + return RiverError(Err_BAD_STREAM_CREATION_PARAMS, "second event is not a channel join event") + } + return ru.params.validateOwnJoinEventPayload(event, membershipPayload) +} + +func (ru *csParams) validateOwnJoinEventPayload(event *events.ParsedEvent, membership *MemberPayload_Membership) error { + creatorAddress := event.Event.GetCreatorAddress() + if membership.GetOp() != MembershipOp_SO_JOIN { + return RiverError(Err_BAD_STREAM_CREATION_PARAMS, "bad join op", "op", membership.GetOp()) + } + if !bytes.Equal(membership.UserAddress, creatorAddress) { + return RiverError( + Err_BAD_STREAM_CREATION_PARAMS, + "bad join user", + "id", + membership.UserAddress, + "created_by", + creatorAddress, + ) + } + return nil +} + +func (ru *csSpaceRules) getCreateSpaceChainAuth() (*auth.ChainAuthArgs, error) { + creatorUserAddress := ru.params.parsedEvents[0].Event.GetCreatorAddress() + userId, err := shared.AddressHex(creatorUserAddress) + if err != nil { + return nil, err + } + return auth.NewChainAuthArgsForSpace( + ru.params.streamId, + userId, + auth.PermissionAddRemoveChannels, // todo should be isOwner... + ), nil +} + +func (ru *csChannelRules) getCreateChannelChainAuth() (*auth.ChainAuthArgs, error) { + creatorUserAddress := ru.params.parsedEvents[0].Event.GetCreatorAddress() + userId, err := shared.AddressHex(creatorUserAddress) + if err != nil { + return nil, err + } + spaceId, err := shared.StreamIdFromBytes(ru.inception.SpaceId) + if err != nil { + return nil, err + } + return auth.NewChainAuthArgsForSpace( + spaceId, // check parent space id + userId, + auth.PermissionAddRemoveChannels, + ), nil +} + +func (ru *csChannelRules) derivedChannelSpaceParentEvent() (*DerivedEvent, error) { + channelId, err := shared.StreamIdFromBytes(ru.inception.StreamId) + if err != nil { + return nil, err + } + spaceId, err := shared.StreamIdFromBytes(ru.inception.SpaceId) + if err != nil { + return nil, err + } + + payload := events.Make_SpacePayload_Channel( + ChannelOp_CO_CREATED, + channelId, + ru.inception.ChannelProperties, + &EventRef{ + StreamId: ru.inception.StreamId, + Hash: ru.params.parsedEvents[0].Envelope.Hash, + Signature: ru.params.parsedEvents[0].Envelope.Signature, + }, + ) + + return &DerivedEvent{ + StreamId: spaceId, + Payload: payload, + }, nil +} + +func (ru *csParams) derivedMembershipEvent() (*DerivedEvent, error) { + creatorAddress, err := BytesToAddress(ru.parsedEvents[0].Event.GetCreatorAddress()) + if err != nil { + return nil, err + } + creatorUserStreamId := shared.UserStreamIdFromAddr(creatorAddress) + inviterId := creatorAddress.Hex() + streamParentId := events.GetStreamParentId(ru.inceptionPayload) + payload := events.Make_UserPayload_Membership( + MembershipOp_SO_JOIN, + ru.streamId, + &inviterId, + streamParentId, + ) + + return &DerivedEvent{ + StreamId: creatorUserStreamId, + Payload: payload, + }, nil +} + +func (ru *csMediaRules) checkMediaInceptionPayload() error { + if len(ru.inception.ChannelId) == 0 { + return RiverError(Err_BAD_STREAM_CREATION_PARAMS, "channel id must not be empty for media stream") + } + if ru.inception.ChunkCount > int32(ru.params.cfg.Media.MaxChunkCount) { + return RiverError( + Err_BAD_STREAM_CREATION_PARAMS, + fmt.Sprintf("chunk count must be less than or equal to %d", ru.params.cfg.Media.MaxChunkCount), + ) + } + + if shared.ValidChannelStreamIdBytes(ru.inception.ChannelId) { + if ru.inception.SpaceId == nil { + return RiverError(Err_BAD_STREAM_CREATION_PARAMS, "space id must not be nil for media stream") + } + if len(ru.inception.SpaceId) == 0 { + return RiverError(Err_BAD_STREAM_CREATION_PARAMS, "space id must not be empty for media stream") + } + return nil + } else if shared.ValidDMChannelStreamIdBytes(ru.inception.ChannelId) || + shared.ValidGDMChannelStreamIdBytes(ru.inception.ChannelId) { + // as long as the creator is a member, and in the case of channels chainAuth succeeds, this is valid + return nil + } else { + return RiverError(Err_BAD_STREAM_CREATION_PARAMS, "invalid channel id") + } +} + +func (ru *csMediaRules) getChainAuthForMediaStream() (*auth.ChainAuthArgs, error) { + userId, err := shared.AddressHex(ru.params.creatorAddress) + if err != nil { + return nil, err + } + + if shared.ValidChannelStreamIdBytes(ru.inception.ChannelId) { + if len(ru.inception.SpaceId) == 0 { + return nil, RiverError(Err_BAD_STREAM_CREATION_PARAMS, "space id must not be empty for media stream") + } + spaceId, err := shared.StreamIdFromBytes(ru.inception.SpaceId) + if err != nil { + return nil, err + } + channelId, err := shared.StreamIdFromBytes(ru.inception.ChannelId) + if err != nil { + return nil, err + } + + return auth.NewChainAuthArgsForChannel( + spaceId, + channelId, + userId, + auth.PermissionWrite, + ), nil + } else { + return nil, nil + } +} + +func (ru *csDmChannelRules) checkDMInceptionPayload() error { + if len(ru.inception.FirstPartyAddress) != 20 || len(ru.inception.SecondPartyAddress) != 20 { + return RiverError(Err_BAD_STREAM_CREATION_PARAMS, "invalid party addresses for dm channel") + } + if !bytes.Equal(ru.params.creatorAddress, ru.inception.FirstPartyAddress) { + return RiverError(Err_BAD_STREAM_CREATION_PARAMS, "creator must be first party for dm channel") + } + if !shared.ValidDMChannelStreamIdBetween( + ru.params.streamId, + ru.inception.FirstPartyAddress, + ru.inception.SecondPartyAddress, + ) { + return RiverError(Err_BAD_STREAM_CREATION_PARAMS, "invalid stream id for dm channel") + } + return nil +} + +func (ru *csDmChannelRules) derivedDMMembershipEvents() ([]*DerivedEvent, error) { + firstPartyStream, err := shared.UserStreamIdFromBytes(ru.inception.FirstPartyAddress) + if err != nil { + return nil, err + } + + secondPartyStream, err := shared.UserStreamIdFromBytes(ru.inception.SecondPartyAddress) + if err != nil { + return nil, err + } + + // first party + firstPartyPayload := events.Make_UserPayload_Membership( + MembershipOp_SO_JOIN, + ru.params.streamId, + &ru.params.creatorUserId, + nil, + ) + + // second party + secondPartyPayload := events.Make_UserPayload_Membership( + MembershipOp_SO_JOIN, + ru.params.streamId, + &ru.params.creatorUserId, + nil, + ) + + // send the first party payload last, so that any failure will be retired by the client + return []*DerivedEvent{ + { + StreamId: secondPartyStream, + Payload: secondPartyPayload, + }, + { + StreamId: firstPartyStream, + Payload: firstPartyPayload, + }, + }, nil +} + +func (ru *csGdmChannelRules) checkGDMMemberPayload(event *events.ParsedEvent, expectedUserAddress *[]byte) error { + payload := event.Event.GetMemberPayload() + if payload == nil { + return RiverError(Err_BAD_STREAM_CREATION_PARAMS, "event is not a gdm channel payload") + } + membershipPayload := payload.GetMembership() + if membershipPayload == nil { + return RiverError(Err_BAD_STREAM_CREATION_PARAMS, "event is not a gdm channel membership event") + } + + if membershipPayload.GetOp() != MembershipOp_SO_JOIN { + return RiverError( + Err_BAD_STREAM_CREATION_PARAMS, + "membership op does not match", + "op", + membershipPayload.GetOp(), + "expected", + MembershipOp_SO_JOIN, + ) + } + + if expectedUserAddress != nil && !bytes.Equal(*expectedUserAddress, membershipPayload.UserAddress) { + return RiverError( + Err_BAD_STREAM_CREATION_PARAMS, + "membership user id does not match", + "userId", + membershipPayload.UserAddress, + "expected", + *expectedUserAddress, + ) + } + + return nil +} + +func (ru *csGdmChannelRules) checkGDMPayloads() error { + // GDMs require 3+ users. The 4 required events are: + // 1. Inception + // 2. Join event for creator + // 3. Invite event for user 2 + // 4. Invite event for user 3 + if len(ru.params.parsedEvents) < 4 { + return RiverError(Err_BAD_STREAM_CREATION_PARAMS, "gdm channel requires 3+ users") + } + + // GDM memberships cannot exceed the configured limit. the first event is the inception event + // and is subtracted from the parsed events count. + membershipLimit := ru.params.cfg.GetMembershipLimit(ru.params.streamId) + if len(ru.params.parsedEvents)-1 > membershipLimit { + return RiverError( + Err_INVALID_ARGUMENT, + "membership limit reached", + "membershipLimit", + membershipLimit) + } + + // check the first join + if err := ru.checkGDMMemberPayload(ru.params.parsedEvents[1], &ru.params.creatorAddress); err != nil { + return err + } + + // check the rest + for _, event := range ru.params.parsedEvents[2:] { + if err := ru.checkGDMMemberPayload(event, nil); err != nil { + return err + } + } + return nil +} + +func (ru *csGdmChannelRules) getGDMUserIds() []string { + userIds := make([]string, 0, len(ru.params.parsedEvents)-1) + for _, event := range ru.params.parsedEvents[1:] { + payload := event.Event.GetMemberPayload() + if payload == nil { + continue + } + membershipPayload := payload.GetMembership() + if membershipPayload == nil { + continue + } + // todo we should remove the conversions here + userId, err := shared.AddressHex(membershipPayload.UserAddress) + if err != nil { + continue + } + userIds = append(userIds, userId) + } + return userIds +} + +func (ru *csGdmChannelRules) getGDMUserAddresses() [][]byte { + userAddresses := make([][]byte, 0, len(ru.params.parsedEvents)-1) + for _, event := range ru.params.parsedEvents[1:] { + payload := event.Event.GetMemberPayload() + if payload == nil { + continue + } + membershipPayload := payload.GetMembership() + if membershipPayload == nil { + continue + } + userAddresses = append(userAddresses, membershipPayload.UserAddress) + } + return userAddresses +} + +func (ru *csGdmChannelRules) derivedGDMMembershipEvents() ([]*DerivedEvent, error) { + userAddresses := ru.getGDMUserAddresses() + // swap the creator into the last position in the array + // send the creator's join event last, so that any failure will be retired by the client + if len(userAddresses) < 1 { + return nil, RiverError(Err_BAD_STREAM_CREATION_PARAMS, "gdm channel requires 3+ users") + } + creatorUserAddress := userAddresses[0] + userAddresses = append(userAddresses[1:], creatorUserAddress) + // create derived events for each user + derivedEvents := make([]*DerivedEvent, 0, len(userAddresses)) + for _, userAddress := range userAddresses { + userStreamId, err := shared.UserStreamIdFromBytes(userAddress) + if err != nil { + return nil, err + } + payload := events.Make_UserPayload_Membership( + MembershipOp_SO_JOIN, + ru.params.streamId, + &ru.params.creatorUserId, + nil, + ) + derivedEvents = append(derivedEvents, &DerivedEvent{ + StreamId: userStreamId, + Payload: payload, + }) + } + return derivedEvents, nil +} diff --git a/core/node/rules/rule_builder.go b/core/node/rules/rule_builder.go new file mode 100644 index 000000000..09f16a91a --- /dev/null +++ b/core/node/rules/rule_builder.go @@ -0,0 +1,27 @@ +package rules + +import ( + "time" + + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/protocol" +) + +/** shared code for the rule builders */ + +func unknownPayloadType(payload any) error { + return RiverError(Err_INVALID_ARGUMENT, "unknown payload type %T", payload) +} + +func unknownContentType(content any) error { + return RiverError(Err_INVALID_ARGUMENT, "unknown content type %T", content) +} + +func invalidContentType(content any) error { + return RiverError(Err_INVALID_ARGUMENT, "invalid contemt type %T", content) +} + +func isPastExpiry(currentTime time.Time, expiryEpochMs int64) bool { + expiryTime := time.Unix(expiryEpochMs/1000, (expiryEpochMs%1000)*1000000) + return !currentTime.Before(expiryTime) +} diff --git a/core/node/rules/rule_builder_ae.go b/core/node/rules/rule_builder_ae.go new file mode 100644 index 000000000..69af33a10 --- /dev/null +++ b/core/node/rules/rule_builder_ae.go @@ -0,0 +1,117 @@ +package rules + +import ( + "github.com/river-build/river/core/node/auth" + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/shared" +) + +type RequiredParentEvent struct { + Payload IsStreamEvent_Payload + StreamId shared.StreamId +} + +type ruleBuilderAE interface { + check(f func() (bool, error)) ruleBuilderAE + checkOneOf(f ...func() (bool, error)) ruleBuilderAE + requireChainAuth(f func() (*auth.ChainAuthArgs, error)) ruleBuilderAE + requireParentEvent(f func() (*RequiredParentEvent, error)) ruleBuilderAE + fail(err error) ruleBuilderAE + run() (bool, *auth.ChainAuthArgs, *RequiredParentEvent, error) +} + +type ruleBuilderAEImpl struct { + failErr error + checks [][]func() (bool, error) + chainAuth func() (*auth.ChainAuthArgs, error) + parentEvent func() (*RequiredParentEvent, error) +} + +func aeBuilder() ruleBuilderAE { + return &ruleBuilderAEImpl{ + failErr: nil, + checks: nil, + chainAuth: func() (*auth.ChainAuthArgs, error) { + return nil, nil + }, + parentEvent: func() (*RequiredParentEvent, error) { + return nil, nil + }, + } +} + +func (re *ruleBuilderAEImpl) check(f func() (bool, error)) ruleBuilderAE { + return re.checkOneOf(f) +} + +func (re *ruleBuilderAEImpl) checkOneOf(f ...func() (bool, error)) ruleBuilderAE { + re.checks = append(re.checks, f) + return re +} + +func (re *ruleBuilderAEImpl) requireChainAuth(f func() (*auth.ChainAuthArgs, error)) ruleBuilderAE { + re.chainAuth = f + return re +} + +func (re *ruleBuilderAEImpl) requireParentEvent(f func() (*RequiredParentEvent, error)) ruleBuilderAE { + re.parentEvent = f + return re +} + +func (re *ruleBuilderAEImpl) fail(err error) ruleBuilderAE { + re.failErr = err + return re +} + +func runChecksAE(checksList [][]func() (bool, error)) (bool, error) { + // outer loop is an and + for _, checks := range checksList { + // inner loop is an or + foundCanAdd := false + var errorMsgs []string + for _, check := range checks { + canAdd, err := check() + if err != nil { + errorMsgs = append(errorMsgs, err.Error()) + } else if canAdd { + foundCanAdd = true + break + } + } + if !foundCanAdd { + if len(errorMsgs) == 0 { + return false, nil + } else if len(errorMsgs) == 1 { + return false, RiverError(Err_PERMISSION_DENIED, "check failed", "reason", errorMsgs[0]) + } else { + return false, RiverError(Err_PERMISSION_DENIED, "checkOneOf failed", "reasons", errorMsgs) + } + } + } + return true, nil +} + +func (re *ruleBuilderAEImpl) run() (bool, *auth.ChainAuthArgs, *RequiredParentEvent, error) { + if re.failErr != nil { + return false, nil, nil, re.failErr + } + + canAdd, err := runChecksAE(re.checks) + if err != nil || !canAdd { + return false, nil, nil, err + } + chainAuthArgs, err := re.chainAuth() + if err != nil { + return false, nil, nil, err + } + requiredParentEvent, err := re.parentEvent() + if err != nil { + return false, nil, nil, err + } + if len(re.checks) == 0 && chainAuthArgs == nil && requiredParentEvent == nil { + return false, nil, nil, RiverError(Err_INTERNAL, "no checks or requirements") + } + return true, chainAuthArgs, requiredParentEvent, nil +} diff --git a/core/node/rules/rule_builder_cs.go b/core/node/rules/rule_builder_cs.go new file mode 100644 index 000000000..f3b58f22a --- /dev/null +++ b/core/node/rules/rule_builder_cs.go @@ -0,0 +1,182 @@ +package rules + +import ( + "github.com/river-build/river/core/node/auth" + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/protocol" + "github.com/river-build/river/core/node/shared" +) + +type CreateStreamRules struct { + CreatorStreamId shared.StreamId + RequiredUserAddrs [][]byte + RequiredUsers []string + RequiredMemberships [][]byte + ChainAuth *auth.ChainAuthArgs + DerivedEvents []*DerivedEvent +} + +type DerivedEvent struct { + Payload IsStreamEvent_Payload + StreamId shared.StreamId +} + +type ruleBuilderCS interface { + check(fn ...func() error) ruleBuilderCS + checkOneOf(fns ...func() error) ruleBuilderCS + requireUser(userIds ...string) ruleBuilderCS + requireUserAddr(userAddresses ...[]byte) ruleBuilderCS + requireMembership(streamIds ...[]byte) ruleBuilderCS + requireChainAuth(f func() (*auth.ChainAuthArgs, error)) ruleBuilderCS + requireDerivedEvent(f ...func() (*DerivedEvent, error)) ruleBuilderCS + requireDerivedEvents(f func() ([]*DerivedEvent, error)) ruleBuilderCS + fail(err error) ruleBuilderCS + run() (*CreateStreamRules, error) +} + +type ruleBuilderCSImpl struct { + failErr error + creatorStreamId shared.StreamId + requiredUsers []string + requiredUserAddrs [][]byte + requiredMemberships [][]byte + checks [][]func() error + chainAuth func() (*auth.ChainAuthArgs, error) + derivedEvents []func() (*DerivedEvent, error) + derivedEventSlices []func() ([]*DerivedEvent, error) +} + +func csBuilder(creatorStreamId shared.StreamId) ruleBuilderCS { + return &ruleBuilderCSImpl{ + creatorStreamId: creatorStreamId, + failErr: nil, + checks: nil, + requiredUsers: nil, + requiredUserAddrs: nil, + requiredMemberships: nil, + chainAuth: func() (*auth.ChainAuthArgs, error) { + return nil, nil + }, + derivedEvents: nil, + } +} + +func (re *ruleBuilderCSImpl) check(fns ...func() error) ruleBuilderCS { + for _, fn := range fns { + re.checkOneOf(fn) + } + return re +} + +func (re *ruleBuilderCSImpl) checkOneOf(fns ...func() error) ruleBuilderCS { + re.checks = append(re.checks, fns) + return re +} + +func (re *ruleBuilderCSImpl) requireUser(userIds ...string) ruleBuilderCS { + re.requiredUsers = append(re.requiredUsers, userIds...) + return re +} + +func (re *ruleBuilderCSImpl) requireUserAddr(userAddresses ...[]byte) ruleBuilderCS { + re.requiredUserAddrs = append(re.requiredUserAddrs, userAddresses...) + return re +} + +func (re *ruleBuilderCSImpl) requireMembership(streamIds ...[]byte) ruleBuilderCS { + re.requiredMemberships = append(re.requiredMemberships, streamIds...) + return re +} + +func (re *ruleBuilderCSImpl) requireChainAuth(f func() (*auth.ChainAuthArgs, error)) ruleBuilderCS { + re.chainAuth = f + return re +} + +func (re *ruleBuilderCSImpl) requireDerivedEvent(f ...func() (*DerivedEvent, error)) ruleBuilderCS { + re.derivedEvents = f + return re +} + +func (re *ruleBuilderCSImpl) requireDerivedEvents(f func() ([]*DerivedEvent, error)) ruleBuilderCS { + re.derivedEventSlices = append(re.derivedEventSlices, f) + return re +} + +func (re *ruleBuilderCSImpl) fail(err error) ruleBuilderCS { + re.failErr = err + return re +} + +func runChecksCS(checksList [][]func() error) error { + // outer loop is an and + for _, errFns := range checksList { + // inner loop is an or + var errorMsgs []string + for _, fn := range errFns { + err := fn() + if err != nil { + errorMsgs = append(errorMsgs, err.Error()) + } + } + if len(errorMsgs) == 1 { + return RiverError(Err_PERMISSION_DENIED, "check failed", "reason", errorMsgs[0]) + } else if len(errorMsgs) > 1 { + return RiverError(Err_PERMISSION_DENIED, "checkOneOf failed", "reasons", errorMsgs) + } + } + return nil +} + +func runDerivedEvents( + fns1 []func() (*DerivedEvent, error), + fns2 []func() ([]*DerivedEvent, error), +) ([]*DerivedEvent, error) { + var derivedEvents []*DerivedEvent + for _, fn := range fns1 { + derivedEvent, err := fn() + if err != nil { + return nil, err + } + derivedEvents = append(derivedEvents, derivedEvent) + } + + for _, fn := range fns2 { + derivedEventSlice, err := fn() + if err != nil { + return nil, err + } + derivedEvents = append(derivedEvents, derivedEventSlice...) + } + return derivedEvents, nil +} + +func (re *ruleBuilderCSImpl) run() (*CreateStreamRules, error) { + if re.failErr != nil { + return nil, re.failErr + } + + err := runChecksCS(re.checks) + if err != nil { + return nil, err + } + chainAuthArgs, err := re.chainAuth() + if err != nil { + return nil, err + } + derivedEvents, err := runDerivedEvents(re.derivedEvents, re.derivedEventSlices) + if err != nil { + return nil, err + } + if len(re.checks) == 0 && chainAuthArgs == nil && derivedEvents == nil { + return nil, RiverError(Err_INTERNAL, "no checks or requirements") + } + return &CreateStreamRules{ + CreatorStreamId: re.creatorStreamId, + RequiredUsers: re.requiredUsers, + RequiredUserAddrs: re.requiredUserAddrs, + RequiredMemberships: re.requiredMemberships, + ChainAuth: chainAuthArgs, + DerivedEvents: derivedEvents, + }, nil +} diff --git a/core/node/run_docker.sh b/core/node/run_docker.sh new file mode 100755 index 000000000..b7e6d9d25 --- /dev/null +++ b/core/node/run_docker.sh @@ -0,0 +1,24 @@ +#!/bin/bash -ue + +if [ -z "$MODE" ]; then + echo "MODE environment variable not set. Defaulting to single-node." + MODE="single-node" +fi + +if [ "$MODE" == "single-node" ]; then + cd /usr/config/run_files/docker-single-node +elif [ "$MODE" == "multi-node" ]; then + cd /usr/config/run_files/docker-multi-node +else + echo "Invalid MODE environment variable. Must be 'single-node' or 'multi-node'." + exit 1 +fi + +if [ -n "$SKIP_GENKEY" ]; then + echo "Using private key set by env var." +elif [ ! -f "./wallet/private_key" ]; then + echo "Generating a new wallet." + /usr/bin/node genkey +fi + +/usr/bin/node run \ No newline at end of file diff --git a/core/node/run_impl.sh b/core/node/run_impl.sh new file mode 100755 index 000000000..c7c8cbb81 --- /dev/null +++ b/core/node/run_impl.sh @@ -0,0 +1,172 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +: ${RUN_ENV:?} # values are single, single_ne, multi, multi_ne + +export RUN_BASE="./run_files/${RUN_ENV}" +export DB_PORT="${DB_PORT:-5433}" +export LOG_LEVEL="${LOG_LEVEL:-info}" +export LOG_NOCOLOR="${LOG_NOCOLOR:-false}" +export METRICS_ENABLED="${METRICS_ENABLED:-true}" +export METRICS_PORT="${METRICS_PORT:-8010}" +export NUM_INSTANCES="${NUM_INSTANCES:-10}" +export REPL_FACTOR="${REPL_FACTOR:-1}" +export RPC_PORT="${RPC_PORT:-5170}" +export DISABLE_BASE_CHAIN="${DISABLE_BASE_CHAIN:-false}" +export RIVER_ENV="local_${RUN_ENV}" + + +[ -z "${BLOCK_TIME_MS+x}" ] && BLOCK_TIME_MS=$(( ${RIVER_BLOCK_TIME:-1} * 1000 )) +export BLOCK_TIME_MS + +CONFIG=false +RUN=false +BUILD=false + +# Parse command-line options +args=() # Collect arguments to pass to the last command +while [[ "$#" -gt 0 ]]; do + case "$1" in + --config|-c) + CONFIG=true + shift + ;; + --run|-r) + RUN=true + BUILD=true + shift + ;; + --build|-b) + BUILD=true + shift + ;; + *) + args+=("$1") + shift + ;; + esac +done + +if [ "$CONFIG" == "false" ] && [ "$RUN" == "false" ] && [ "$BUILD" == "false" ]; then + echo "--config to config. --run to run. --build to build without running. --config --run to config and run." + exit 1 +fi + +if [ "$CONFIG" == "true" ]; then + mkdir -p ${RUN_BASE} + ../../scripts/deploy-contracts.sh + + SPACE_FACTORY_ADDRESS=$(jq -r '.address' ../../packages/generated/deployments/${RIVER_ENV}/base/addresses/spaceFactory.json) + WALLET_LINK_ADDRESS=$(jq -r '.address' ../../packages/generated/deployments/${RIVER_ENV}/base/addresses/walletLink.json) + RIVER_REGISTRY_ADDRESS=$(jq -r '.address' ../../packages/generated/deployments/${RIVER_ENV}/river/addresses/riverRegistry.json) + export SPACE_FACTORY_ADDRESS + export WALLET_LINK_ADDRESS + export RIVER_REGISTRY_ADDRESS + + source ../../contracts/.env.localhost + + for ((i=0; i /dev/null + done + + echo "Node records in contract:" + cast call \ + --rpc-url http://127.0.0.1:8546 \ + $RIVER_REGISTRY_ADDRESS \ + "getAllNodes()((uint8,string,address,address)[])" | sed 's/),/),\n/g' + echo "<<<<<<<<<<<<<<<<<<<<<<<<<" + + # config xchain config for this deployment + # the script is call create_multi.sh because there are always multiple xchain nodes for a deployment + # xchain depends on base, so only configure it when base is enabled + if [ "$DISABLE_BASE_CHAIN" != "true" ]; then + ../xchain/create_multi.sh + fi + +fi + +if [ "$BUILD" == "true" ]; then + OUTPUT=${RUN_BASE}/bin/river_node + echo Building node binary ${OUTPUT} + mkdir -p ${RUN_BASE}/bin + go build \ + -o ${OUTPUT} \ + -race \ + -ldflags="-X github.com/river-build/river/core/node/node/version.branch=$(git rev-parse --abbrev-ref HEAD) -X github.com/river-build/river/core/node/node/version.commit=$(git describe --tags --always --dirty)" \ + ./node/main.go +fi + +if [ "$RUN" == "true" ]; then + pushd ${RUN_BASE} + while read -r INSTANCE; do + + if [ ! -f $INSTANCE/config/config.yaml ]; then + echo "Skipping directory '$INSTANCE' because it does not have a config.yaml file" + + continue + fi + + pushd $INSTANCE + echo "Running instance '$INSTANCE' with extra aguments: '${args[@]:-}'" + cast rpc -r http://127.0.0.1:8546 anvil_setBalance `cat ./wallet/node_address` 10000000000000000000 + + # if NUM_INSTANCES in not one, run in background, otherwise run with optional restart + if [ "$NUM_INSTANCES" -ne 1 ]; then + echo "Running instance in background" + ../bin/river_node run --config config/config.yaml "${args[@]:-}" & + else + echo "Running single $INSTANCE in the retry loop" + while true; do + # Run the built executable + ../bin/river_node run "${args[@]:-}" & + job_pid=$! + + # Wait for the job to finish and capture its exit status + wait $job_pid + exit_status=$? + + if [ "${exit_status:-0}" -ne 22 ]; then + break + fi + + echo "RESTARTING" + done + fi + + popd + done < <(find . -type d -mindepth 1 -maxdepth 1 | sort) + + echo "All instances started" + + # At the end of the script, or in a cleanup handler + cleanup() { + while read -r job_pid; do + echo "Waiting on job with PID $job_pid" + wait "$job_pid" 2>/dev/null + done < <(jobs -p) + echo "Cleanup complete." + } + + # Register the cleanup function to handle SIGINT and SIGTERM + trap cleanup SIGINT SIGTERM + wait +fi diff --git a/core/node/run_multi.sh b/core/node/run_multi.sh new file mode 100755 index 000000000..a8aa3847d --- /dev/null +++ b/core/node/run_multi.sh @@ -0,0 +1,29 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +export DISABLE_BASE_CHAIN="${DISABLE_BASE_CHAIN:-false}" +export METRICS_ENABLED="${METRICS_ENABLED:-true}" +export RUN_ENV="${RUN_ENV:-multi}" +export NUM_INSTANCES="${NUM_INSTANCES:-10}" +export RPC_PORT="${RPC_PORT:-5170}" + +# Parse command-line options +args=() # Collect arguments to pass to the last command +while [[ "$#" -gt 0 ]]; do + case "$1" in + --disable_entitlements|--de) + DISABLE_BASE_CHAIN=true + METRICS_ENABLED=false + RPC_PORT=5180 + RUN_ENV="multi_ne" + shift + ;; + *) + args+=("$1") + shift + ;; + esac +done + +./run_impl.sh "${args[@]:-}" diff --git a/core/node/run_single.sh b/core/node/run_single.sh new file mode 100755 index 000000000..0558a2a8b --- /dev/null +++ b/core/node/run_single.sh @@ -0,0 +1,48 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +export DB_PORT=5433 +export LOG_LEVEL=info +export LOG_NOCOLOR=false +export METRICS_ENABLED=true +export METRICS_PORT=8081 +export NUM_INSTANCES=1 +export REPL_FACTOR=1 +export RPC_PORT=5157 +export RUN_ENV=single +export DISABLE_BASE_CHAIN=${DISABLE_BASE_CHAIN:-false} + +# Parse command-line options +RUN_OPT="-c -r" +args=() # Collect arguments to pass to the last command +while [[ "$#" -gt 0 ]]; do + case "$1" in + -c|--config-only) + RUN_OPT="-c" + shift + ;; + -sc|--skip-config) + RUN_OPT="-r" + shift + ;; + -r|--run-only) # same as -sc, but everything else uses -r + RUN_OPT="-r" + shift + ;; + --disable_entitlements|--de) + RUN_ENV=single_ne + METRICS_ENABLED=false + METRICS_PORT=8082 + RPC_PORT=5158 + DISABLE_BASE_CHAIN=true + shift + ;; + *) + args+=("$1") + shift + ;; + esac +done + +./run_impl.sh $RUN_OPT "${args[@]:-}" diff --git a/core/node/shared/ids.go b/core/node/shared/ids.go new file mode 100644 index 000000000..bc10fdb53 --- /dev/null +++ b/core/node/shared/ids.go @@ -0,0 +1,202 @@ +package shared + +import ( + "crypto/rand" + "encoding/hex" + "fmt" + "slices" + "strings" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/protocol" +) + +func AddressHex(address []byte) (string, error) { + if len(address) != 20 { + return "", RiverError(Err_BAD_ADDRESS, "wrong length", "addr", address) + } + return common.BytesToAddress(address).Hex(), nil +} + +func AddressFromUserId(userId string) ([]byte, error) { + if len(userId) != 42 { + return nil, RiverError(Err_BAD_ADDRESS, "wrong length", "userId", userId) + } + if !strings.HasPrefix(userId, "0x") { + return nil, RiverError(Err_BAD_ADDRESS, "address should start with 0x", "userId", userId) + } + return hex.DecodeString(userId[2:]) +} + +func AddressFromSpaceId(spaceId StreamId) (common.Address, error) { + if spaceId.Type() != STREAM_SPACE_BIN { + return common.Address{}, RiverError( + Err_BAD_STREAM_ID, + "invalid stream type for getting space", + "streamId", + spaceId, + ) + } + return common.BytesToAddress(spaceId[1:21]), nil +} + +func MakeChannelId(spaceId StreamId) (StreamId, error) { + // replace the first byte with the channel type + // copy the 20 bytes of the spaceId address + // fill the rest with random bytes + if spaceId.Type() != STREAM_SPACE_BIN { + return StreamId{}, RiverError(Err_BAD_STREAM_ID, "invalid stream type for space", "streamId", spaceId) + } + var b [32]byte + b[0] = STREAM_CHANNEL_BIN + copy(b[1:], spaceId[1:21]) + _, err := rand.Read(b[21:]) + if err != nil { + return StreamId{}, RiverError(Err_INTERNAL, "failed to create random bytes", "err", err) + } + return StreamIdFromBytes(b[:]) +} + +func UserStreamIdFromBytes(addr []byte) (StreamId, error) { + if len(addr) == 20 { + return UserStreamIdFromAddr(common.BytesToAddress(addr)), nil + } + + return StreamId{}, RiverError( + Err_BAD_ADDRESS, + "Bad address bytes", + "address", fmt.Sprintf("%x", addr), + ).Func("UserStreamIdFromBytes") +} + +func UserStreamIdFromAddr(addr common.Address) StreamId { + var b StreamId + b[0] = STREAM_USER_BIN + copy(b[1:], addr.Bytes()) + return b +} + +func UserSettingStreamIdFromAddr(addr common.Address) StreamId { + var b StreamId + b[0] = STREAM_USER_SETTINGS_BIN + copy(b[1:], addr.Bytes()) + return b +} + +func UserDeviceKeyStreamIdFromAddress(addr common.Address) StreamId { + var b StreamId + b[0] = STREAM_USER_DEVICE_KEY_BIN + copy(b[1:], addr.Bytes()) + return b +} + +func GetUserAddressFromStreamIdBytes(inStreamId []byte) (common.Address, error) { + streamId, err := StreamIdFromBytes(inStreamId) + if err != nil { + return common.Address{}, err + } + return GetUserAddressFromStreamId(streamId) +} + +func GetUserAddressFromStreamId(streamId StreamId) (common.Address, error) { + prefix := streamId.Type() + if prefix != STREAM_USER_BIN && + prefix != STREAM_USER_DEVICE_KEY_BIN && + prefix != STREAM_USER_INBOX_BIN && + prefix != STREAM_USER_SETTINGS_BIN { + return common.Address{}, RiverError( + Err_BAD_STREAM_ID, + "invalid stream type for getting user", + "streamId", + streamId, + ) + } + return common.BytesToAddress(streamId[1:21]), nil +} + +func CheckUserStreamIdForPrefix(streamId string, creatorUserId []byte, expectedPrefix string) error { + expected := expectedPrefix + hex.EncodeToString(creatorUserId) + if streamId == expected { + return nil + } + return RiverError( + Err_BAD_STREAM_ID, + "Stream ID doesn't match creator address or expected prefix", + "streamId", + streamId, + "expected", + expected, + ) +} + +func ValidSpaceStreamId(streamId *StreamId) bool { + return streamId.Type() == STREAM_SPACE_BIN +} + +func ValidChannelStreamIdBytes(streamId []byte) bool { + id, err := StreamIdFromBytes(streamId) + if err != nil { + return false + } + return ValidChannelStreamId(&id) +} + +func ValidChannelStreamId(streamId *StreamId) bool { + return streamId.Type() == STREAM_CHANNEL_BIN +} + +func ValidDMChannelStreamIdBytes(streamId []byte) bool { + id, err := StreamIdFromBytes(streamId) + if err != nil { + return false + } + return ValidDMChannelStreamId(&id) +} + +func ValidDMChannelStreamId(streamId *StreamId) bool { + return streamId.Type() == STREAM_DM_CHANNEL_BIN +} + +func DMStreamIdForUsers(a []byte, b []byte) (StreamId, error) { + // Lowercase the user ids, sort them and join them with a dash + addressUserA, err := AddressHex(a) + if err != nil { + return StreamId{}, err + } + addressUserB, err := AddressHex(b) + if err != nil { + return StreamId{}, err + } + + ids := []string{strings.ToLower(addressUserA), strings.ToLower(addressUserB)} + slices.Sort(ids) + joined := strings.Join(ids, "-") + hash := crypto.Keccak256([]byte(joined)) + + var s StreamId + s[0] = STREAM_DM_CHANNEL_BIN + copy(s[1:], hash[:31]) + return s, nil +} + +func ValidDMChannelStreamIdBetween(id StreamId, userIdA []byte, userIdB []byte) bool { + expected, err := DMStreamIdForUsers(userIdA, userIdB) + if err != nil { + return false + } + return id == expected +} + +func ValidGDMChannelStreamIdBytes(streamId []byte) bool { + id, err := StreamIdFromBytes(streamId) + if err != nil { + return false + } + return ValidGDMChannelStreamId(&id) +} + +func ValidGDMChannelStreamId(streamId *StreamId) bool { + return streamId.Type() == STREAM_GDM_CHANNEL_BIN +} diff --git a/core/node/shared/ids_test.go b/core/node/shared/ids_test.go new file mode 100644 index 000000000..ab1498170 --- /dev/null +++ b/core/node/shared/ids_test.go @@ -0,0 +1,130 @@ +package shared + +import ( + "bytes" + "fmt" + "log/slog" + "reflect" + "strings" + "testing" + + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/dlog" + . "github.com/river-build/river/core/node/protocol" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestValidDMStreamId(t *testing.T) { + userIdA, _ := AddressFromUserId("0x376eC15Fa24A76A18EB980629093cFFd559333Bb") + userIdB, _ := AddressFromUserId("0x6d58a6597Eb5F849Fb46604a81Ee31654D6a4B44") + expected := "88b6cd7a587ea499f57bfdc820b8c57ef654e38bc4572e7843df05321dd74c2f" + + res, err := DMStreamIdForUsers(userIdA, userIdB) + assert.NoError(t, err) + assert.Equal(t, expected, res.String()) + + // Test that the order of the user ids doesn't matter + res, err = DMStreamIdForUsers(userIdB, userIdA) + assert.NoError(t, err) + assert.Equal(t, expected, res.String()) +} + +func TestInvalidDMStreamId(t *testing.T) { + userIdA, _ := AddressFromUserId("0x376eC15Fa24A76A18EB980629093cFFd559333Bb") + userIdB, _ := AddressFromUserId("0x6d58a6597Eb5F849Fb46604a81Ee31654D6a4B44") + notExpected, err := StreamIdFromString(STREAM_DM_CHANNEL_PREFIX + strings.Repeat("0", 62)) + assert.NoError(t, err) + + assert.False(t, ValidDMChannelStreamIdBetween(notExpected, userIdA, userIdB)) +} + +func TestStreamIdFromString(t *testing.T) { + addrStr := "0x376eC15Fa24A76A18EB980629093cFFd559333Bb" + addr := common.HexToAddress(addrStr) + a := UserStreamIdFromAddr(addr) + streamIdStr := padStringId(STREAM_USER_PREFIX + strings.ToLower(addrStr[2:])) + assert.Equal(t, streamIdStr, a.String()) + + length, err := StreamIdContentLengthForType(STREAM_USER_BIN) + require.NoError(t, err) + + var bytes [32]byte + require.Equal(t, length, 21) // hard coded value is 21 + bytes[0] = STREAM_USER_BIN + copy(bytes[1:], addr.Bytes()) + + streamIdFromBytes, err := StreamIdFromBytes(bytes[:]) + require.NoError(t, err) + streamIdFromStr, err := StreamIdFromString(a.String()) + require.NoError(t, err) + assert.Equal(t, a.String(), streamIdFromBytes.String()) + assert.Equal(t, a.String(), streamIdFromStr.String()) + assert.Equal(t, streamIdFromBytes, streamIdFromStr) +} + +func TestReflectStreamId(t *testing.T) { + streamId, err := StreamIdFromString(padStringId(STREAM_SPACE_PREFIX + "a00000")) + require.NoError(t, err) + goStringerType := reflect.TypeOf((*fmt.GoStringer)(nil)).Elem() + v := reflect.ValueOf(streamId) + assert.True(t, v.IsValid()) + assert.True(t, v.CanInterface()) + assert.True(t, v.Type().Implements(goStringerType)) + i := v.Interface() + _, ok := i.(fmt.GoStringer) + assert.True(t, ok) +} + +func TestLoggingText(t *testing.T) { + require := require.New(t) + + buffer := &bytes.Buffer{} + log := slog.New(dlog.NewPrettyTextHandler(buffer, &dlog.PrettyHandlerOptions{ + Colors: dlog.ColorMap_Disabled, + })) + + streamId, err := StreamIdFromBytes(padBytesId([]byte{STREAM_SPACE_BIN, 0x22, 0x33})) + require.NoError(err) + + log.Info("test", "streamId", streamId) + require.Contains(buffer.String(), "1022330000000000000000000000000000000000000000000000000000000000") +} + +func TestLoggingJson(t *testing.T) { + require := require.New(t) + + buffer := &bytes.Buffer{} + log := slog.New(dlog.NewPrettyJSONHandler(buffer, &dlog.PrettyHandlerOptions{})) + + streamId, err := StreamIdFromBytes(padBytesId([]byte{STREAM_SPACE_BIN, 0x22, 0x33})) + require.NoError(err) + + log.Info("test", "streamId", streamId) + require.Contains(buffer.String(), "1022330000000000000000000000000000000000000000000000000000000000") +} + +func TestErrorFormat(t *testing.T) { + require := require.New(t) + + streamId, err := StreamIdFromBytes(padBytesId([]byte{STREAM_SPACE_BIN, 0x22, 0x33})) + require.NoError(err) + + err = RiverError(Err_INTERNAL, "test error", "streamId", streamId) + require.Contains(err.Error(), "1022330000000000000000000000000000000000000000000000000000000000") +} + +func padStringId(s string) string { + if len(s) < STREAM_ID_STRING_LENGTH { + s += strings.Repeat("0", STREAM_ID_STRING_LENGTH-len(s)) + } + return s +} + +func padBytesId(b []byte) []byte { + if len(b) < STREAM_ID_BYTES_LENGTH { + b = append(b, make([]byte, STREAM_ID_BYTES_LENGTH-len(b))...) + } + return b +} diff --git a/core/node/shared/stream_id.go b/core/node/shared/stream_id.go new file mode 100644 index 000000000..3ec035d02 --- /dev/null +++ b/core/node/shared/stream_id.go @@ -0,0 +1,162 @@ +package shared + +import ( + "bytes" + "encoding/hex" + + "github.com/ethereum/go-ethereum/common" + "github.com/jackc/pgx/v5/pgtype" + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/protocol" +) + +const ( + STREAM_CHANNEL_BIN byte = 0x20 + STREAM_CHANNEL_PREFIX = "20" + STREAM_DM_CHANNEL_BIN byte = 0x88 + STREAM_DM_CHANNEL_PREFIX = "88" + STREAM_GDM_CHANNEL_BIN byte = 0x77 + STREAM_GDM_CHANNEL_PREFIX = "77" + STREAM_MEDIA_BIN byte = 0xff + STREAM_MEDIA_PREFIX = "ff" + STREAM_SPACE_BIN byte = 0x10 + STREAM_SPACE_PREFIX = "10" + STREAM_USER_DEVICE_KEY_BIN byte = 0xad + STREAM_USER_DEVICE_KEY_PREFIX = "ad" + STREAM_USER_INBOX_BIN byte = 0xa1 + STREAM_USER_INBOX_PREFIX = "a1" + STREAM_USER_BIN byte = 0xa8 + STREAM_USER_PREFIX = "a8" + STREAM_USER_SETTINGS_BIN byte = 0xa5 + STREAM_USER_SETTINGS_PREFIX = "a5" + + STREAM_ID_BYTES_LENGTH = 32 + STREAM_ID_STRING_LENGTH = STREAM_ID_BYTES_LENGTH * 2 +) + +type StreamId [STREAM_ID_BYTES_LENGTH]byte + +func StreamIdFromString(s string) (StreamId, error) { + b, err := hex.DecodeString(s) + if err != nil { + return StreamId{}, RiverError(Err_BAD_STREAM_ID, "invalid address hex", "streamId", s) + } + return StreamIdFromBytes(b) +} + +func StreamIdFromBytes(b []byte) (StreamId, error) { + err := checkExpectedLength(b[:]) + if err != nil { + return StreamId{}, err + } + var id StreamId + copy(id[:], b) + return id, nil +} + +// Hash represents the 32 byte Keccak256 hash of arbitrary data. +func StreamIdFromHash(b common.Hash) (StreamId, error) { + err := checkExpectedLength(b[:]) + if err != nil { + return StreamId{}, err + } + var sid StreamId + copy(sid[:], b[:]) + return sid, nil +} + +func checkExpectedLength(b []byte) error { + if len(b) != STREAM_ID_BYTES_LENGTH { + return RiverError(Err_BAD_STREAM_ID, "invalid length", "streamId", b) + } + expectedContentLen, err := StreamIdContentLengthForType(b[0]) + if err != nil { + return err + } + // all bytes after expectedLen should be 0 + for i := expectedContentLen; i < len(b); i++ { + if b[i] != 0 { + return RiverError( + Err_BAD_STREAM_ID, + "zero suffix expected for id type", + "streamId", + b, + "expectedLen", + expectedContentLen, + ) + } + } + return nil +} + +func (id StreamId) String() string { + return hex.EncodeToString(id[:]) +} + +func (id StreamId) GoString() string { + return id.String() +} + +func (id StreamId) EqualsBytes(other []byte) bool { + return bytes.Equal(id[:], other) +} + +func (id StreamId) Type() byte { + return id[0] +} + +func (id StreamId) Compare(other StreamId) int { + return bytes.Compare(id[:], other[:]) +} + +// user streams are expected to have 20 bytes of address, so the expected content length is 21 when including the prefix +func StreamIdContentLengthForType(t byte) (int, error) { + switch t { + case STREAM_USER_DEVICE_KEY_BIN: + return 21, nil + case STREAM_USER_INBOX_BIN: + return 21, nil + case STREAM_USER_BIN: + return 21, nil + case STREAM_USER_SETTINGS_BIN: + return 21, nil + case STREAM_MEDIA_BIN: + return 32, nil + case STREAM_CHANNEL_BIN: + return 32, nil + case STREAM_DM_CHANNEL_BIN: + return 32, nil + case STREAM_GDM_CHANNEL_BIN: + return 32, nil + case STREAM_SPACE_BIN: + return 21, nil + default: + return 0, RiverError(Err_BAD_STREAM_ID, "invalid stream prefix", "prefix", t) + } +} + +// Here abstraction leaks to implement marshalling for pgx. +// TODO: This can be avoided by registering a custom type with pgx. +func (id StreamId) TextValue() (pgtype.Text, error) { + return pgtype.Text{ + String: id.String(), + Valid: true, + }, nil +} + +func (id *StreamId) ScanText(v pgtype.Text) error { + if !v.Valid { + *id = StreamId{} + return nil + } + var err error + *id, err = StreamIdFromString(v.String) + if err != nil { + return err + } + return nil +} + +func (id StreamId) MarshalJSON() ([]byte, error) { + return []byte("\"" + id.String() + "\""), nil +} diff --git a/core/node/shared/stream_info.go b/core/node/shared/stream_info.go new file mode 100644 index 000000000..d99ae4343 --- /dev/null +++ b/core/node/shared/stream_info.go @@ -0,0 +1,12 @@ +package shared + +type MediaStreamInfo struct { + ChannelId string + MediaId string + ChunkCount int32 +} + +type DMStreamInfo struct { + FirstPartyId string + SecondPartyId string +} diff --git a/core/node/start.sh b/core/node/start.sh new file mode 100755 index 000000000..744a1075f --- /dev/null +++ b/core/node/start.sh @@ -0,0 +1,4 @@ +#!/bin/bash -ue +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +./run_single.sh $@ diff --git a/core/node/staticcheck.conf b/core/node/staticcheck.conf new file mode 100644 index 000000000..131bb2f4b --- /dev/null +++ b/core/node/staticcheck.conf @@ -0,0 +1,26 @@ +checks = [ + "all", + "-ST1000", # TODO: enable: Incorrect or missing package comment, + "-ST1003", # Poorly chosen identifier + "-ST1020", # TODO: enable: The documentation of an exported function should start with the function's name + "-ST1021", # TODO: enable: The documentation of an exported type should start with type's name + "-ST1022", # TODO: enable: The documentation of an exported variable should start with the variable's name + "-ST1023", # Redundant type in variable declaration +] +initialisms = [ + "ACL", "API", "ASCII", "CPU", "CSS", "DNS", "EOF", + "GUID", "HTML", "HTTP", "HTTPS", "IP", "JSON", "QPS", "RAM", "RPC", + "SLA", "SMTP", "SQL", "SSH", "TCP", "TLS", "TTL", "UDP", "UI", "GID", + "UID", "UUID", "URI", "URL", "UTF8", "VM", "XML", "XMPP", "XSRF", + "XSS", "SIP", "RTP", "AMQP", "DB", "TS" +] +dot_import_whitelist = [ + "github.com/river-build/river/core/node/base", + "github.com/river-build/river/core/node/crypto", + "github.com/river-build/river/core/node/events", + "github.com/river-build/river/core/node/nodes", + "github.com/river-build/river/core/node/protocol", + "github.com/river-build/river/core/node/protocol/protocolconnect", + "github.com/river-build/river/core/node/shared", + "github.com/river-build/river/core/node/utils", +] \ No newline at end of file diff --git a/core/node/stop_multi.sh b/core/node/stop_multi.sh new file mode 100755 index 000000000..f8b74c954 --- /dev/null +++ b/core/node/stop_multi.sh @@ -0,0 +1,54 @@ +#!/bin/bash -ue +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +WAIT_TIME=1 +MAX_ATTEMPTS=5 + +function stop_multi_env() { + RUN_ENV=$1 + echo "Stopping instances for $RUN_ENV environment..." + + find ./run_files/${RUN_ENV} -type f -name "config.yaml" -exec grep -o '^port:.*' {} \; | sort | while read -r I_RPC_PORT; do + I_RPC_PORT="${I_RPC_PORT//[!0-9]/}" + echo "Stopping instance on port $I_RPC_PORT" + + PID="$(lsof -t -i:${I_RPC_PORT} || true)" + + # Check if PID is empty + if [ -z "$PID" ]; then + echo "No process found for instance on port $I_RPC_PORT. Skipping..." + continue + fi + + # Check if process exists before attempting to stop it + if ! kill -0 $PID 2>/dev/null; then + echo "Instance with PID $PID on port $I_RPC_PORT is not running. Skipping..." + continue + fi + + # Send SIGTERM (Ctrl-C) + echo "Stopping instance with PID $PID on port $I_RPC_PORT" + kill -SIGTERM $PID + + # Loop to check if process stops + ATTEMPTS=0 + while kill -0 $PID 2>/dev/null && [ $ATTEMPTS -lt $MAX_ATTEMPTS ]; do + sleep $WAIT_TIME + ((ATTEMPTS++)) + done + + # Check if process is still running, and if so, send SIGKILL (-9) + if kill -0 $PID 2>/dev/null; then + echo "Instance with PID $PID on port $I_RPC_PORT did not stop; forcefully killing..." + kill -SIGKILL $PID + else + echo "Instance with PID $PID on port $I_RPC_PORT stopped successfully" + fi + done + +} + +stop_multi_env "multi" +stop_multi_env "multi_ne" + +echo "All instances have been processed" diff --git a/core/node/storage/init_db.sql b/core/node/storage/init_db.sql new file mode 100644 index 000000000..f866572d4 --- /dev/null +++ b/core/node/storage/init_db.sql @@ -0,0 +1,24 @@ +CREATE TABLE IF NOT EXISTS es ( + stream_id CHAR(64) PRIMARY KEY, + latest_snapshot_miniblock BIGINT NOT NULL); + +CREATE TABLE IF NOT EXISTS miniblocks ( + stream_id CHAR(64) NOT NULL, + seq_num BIGINT NOT NULL, + blockdata BYTEA NOT NULL, + PRIMARY KEY (stream_id, seq_num) + ) PARTITION BY LIST (stream_id); + +CREATE TABLE IF NOT EXISTS minipools ( + stream_id CHAR(64) NOT NULL, + generation BIGINT NOT NULL , + slot_num BIGINT NOT NULL , + envelope BYTEA, + PRIMARY KEY (stream_id, generation, slot_num) + ) PARTITION BY LIST (stream_id); + +CREATE TABLE IF NOT EXISTS singlenodekey ( + uuid VARCHAR NOT NULL, + storage_connection_time TIMESTAMP NOT NULL, + info VARCHAR NOT NULL +); \ No newline at end of file diff --git a/core/node/storage/migrations/000001_create_initial_schema.down.sql b/core/node/storage/migrations/000001_create_initial_schema.down.sql new file mode 100644 index 000000000..49f389ff1 --- /dev/null +++ b/core/node/storage/migrations/000001_create_initial_schema.down.sql @@ -0,0 +1,4 @@ +DROP TABLE IF EXISTS es; +DROP TABLE IF EXISTS miniblock; +DROP TABLE IF EXISTS minipools; +DROP TABLE IF EXISTS singlenodekey; diff --git a/core/node/storage/migrations/000001_create_initial_schema.up.sql b/core/node/storage/migrations/000001_create_initial_schema.up.sql new file mode 100644 index 000000000..98aa3361d --- /dev/null +++ b/core/node/storage/migrations/000001_create_initial_schema.up.sql @@ -0,0 +1,24 @@ +CREATE TABLE IF NOT EXISTS es ( + stream_id CHAR(64) PRIMARY KEY, + latest_snapshot_miniblock BIGINT NOT NULL); + +CREATE TABLE IF NOT EXISTS miniblocks ( + stream_id CHAR(64) NOT NULL, + seq_num BIGINT NOT NULL, + blockdata BYTEA NOT NULL, + PRIMARY KEY (stream_id, seq_num) + ) PARTITION BY LIST (stream_id); + +CREATE TABLE IF NOT EXISTS minipools ( + stream_id CHAR(64) NOT NULL, + generation BIGINT NOT NULL , + slot_num BIGINT NOT NULL , + envelope BYTEA, + PRIMARY KEY (stream_id, generation, slot_num) + ) PARTITION BY LIST (stream_id); + +CREATE TABLE IF NOT EXISTS singlenodekey ( + uuid VARCHAR NOT NULL, + storage_connection_time TIMESTAMP NOT NULL, + info VARCHAR NOT NULL +); diff --git a/core/node/storage/migrations/000002_create_miniblock_candidates_table.down.sql b/core/node/storage/migrations/000002_create_miniblock_candidates_table.down.sql new file mode 100644 index 000000000..52b1fd761 --- /dev/null +++ b/core/node/storage/migrations/000002_create_miniblock_candidates_table.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS miniblock_candidates; diff --git a/core/node/storage/migrations/000002_create_miniblock_candidates_table.up.sql b/core/node/storage/migrations/000002_create_miniblock_candidates_table.up.sql new file mode 100644 index 000000000..0dc514dc4 --- /dev/null +++ b/core/node/storage/migrations/000002_create_miniblock_candidates_table.up.sql @@ -0,0 +1,31 @@ +CREATE TABLE IF NOT EXISTS miniblock_candidates ( + stream_id CHAR(64) NOT NULL, + seq_num BIGINT NOT NULL, + block_hash CHAR(64) NOT NULL, + blockdata BYTEA NOT NULL, + PRIMARY KEY (stream_id, block_hash, seq_num) + ) PARTITION BY LIST (stream_id); + +-- Install sha224 for migrating existing streams to partitions, as this is used for computing +-- NOTE: sha3-224 used for other tables is not availabe in all deployments of postgres. +-- the partition names. Use pg_advisory_xact_lock to avoid failures from concurrent installations +-- during test cases. +select pg_advisory_xact_lock(hashtext('install_pgcrypto_extension')); +create extension IF NOT EXISTS pgcrypto WITH SCHEMA public CASCADE; + +-- Create partitions for existing streams in the miniblock candidates table +DO $$ +DECLARE + stream RECORD; +BEGIN + FOR stream IN + SELECT stream_id from es + LOOP + EXECUTE format( + 'CREATE TABLE %I PARTITION OF miniblock_candidates for values in (%L)', + 'miniblock_candidates_' || encode(digest(stream.stream_id, 'sha224'), 'hex'), + stream.stream_id); + END LOOP; + RETURN; +END; +$$; \ No newline at end of file diff --git a/core/node/storage/migrations/000003_add_notify_trigger_to_singlenodekey.down.sql b/core/node/storage/migrations/000003_add_notify_trigger_to_singlenodekey.down.sql new file mode 100644 index 000000000..47eaf7766 --- /dev/null +++ b/core/node/storage/migrations/000003_add_notify_trigger_to_singlenodekey.down.sql @@ -0,0 +1,3 @@ +DROP TRIGGER IF EXISTS notify_on_singlenodekey_upserts; + +DROP FUNCTION IF EXISTS notify_on_upsert; \ No newline at end of file diff --git a/core/node/storage/migrations/000003_add_notify_trigger_to_singlenodekey.up.sql b/core/node/storage/migrations/000003_add_notify_trigger_to_singlenodekey.up.sql new file mode 100644 index 000000000..5c3685704 --- /dev/null +++ b/core/node/storage/migrations/000003_add_notify_trigger_to_singlenodekey.up.sql @@ -0,0 +1,16 @@ +CREATE OR REPLACE FUNCTION notify_on_upsert() + RETURNS TRIGGER +AS +$$ + BEGIN + PERFORM pg_notify(TG_TABLE_NAME, TG_TABLE_SCHEMA); + RETURN NEW; + END; +$$ LANGUAGE PLPGSQL; + +DROP TRIGGER IF EXISTS notify_on_singlenodekey_upserts on singlenodekey; +CREATE TRIGGER notify_on_singlenodekey_upserts + AFTER INSERT OR UPDATE + ON singlenodekey + FOR EACH ROW + EXECUTE PROCEDURE notify_on_upsert(); \ No newline at end of file diff --git a/core/node/storage/migrations_test.go b/core/node/storage/migrations_test.go new file mode 100644 index 000000000..b1765ac7a --- /dev/null +++ b/core/node/storage/migrations_test.go @@ -0,0 +1,35 @@ +package storage + +import ( + "testing" + + . "github.com/river-build/river/core/node/base" + + "github.com/stretchr/testify/require" +) + +func TestMigrateExistingDb(t *testing.T) { + require := require.New(t) + + ctx, _, testParams := setupTest() + defer testParams.closer() + + pool, err := CreateAndValidatePgxPool( + ctx, + testParams.config, + testParams.schema, + ) + require.NoError(err) + + instanceId2 := GenShortNanoid() + exitSignal2 := make(chan error, 1) + pgEventStore2, err := newPostgresEventStore( + ctx, + pool, + instanceId2, + exitSignal2, + migrationsDir, + ) + require.NoError(err) + defer pgEventStore2.Close(ctx) +} diff --git a/core/node/storage/pg_storage.go b/core/node/storage/pg_storage.go new file mode 100644 index 000000000..361525a45 --- /dev/null +++ b/core/node/storage/pg_storage.go @@ -0,0 +1,1503 @@ +package storage + +import ( + "context" + "embed" + "encoding/hex" + "fmt" + "log/slog" + "os" + "strings" + "time" + + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/config" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/shared" + + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/infra" + + "github.com/jackc/pgerrcode" + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgconn" + "github.com/jackc/pgx/v5/pgxpool" + "golang.org/x/crypto/sha3" + "golang.org/x/sync/semaphore" + + "github.com/golang-migrate/migrate/v4" + _ "github.com/golang-migrate/migrate/v4/database/postgres" + "github.com/golang-migrate/migrate/v4/source/iofs" +) + +type PostgresEventStore struct { + config *config.DatabaseConfig + pool *pgxpool.Pool + schemaName string + nodeUUID string + exitSignal chan error + dbUrl string + migrationDir embed.FS + cleanupListenFunc func() + + regularConnections *semaphore.Weighted + streamingConnections *semaphore.Weighted +} + +var _ StreamStorage = (*PostgresEventStore)(nil) + +const ( + PG_REPORT_INTERVAL = 3 * time.Minute +) + +var dbCalls = infra.NewSuccessMetrics(infra.DB_CALLS_CATEGORY, nil) + +type txRunnerOpts struct { + disableCompareUUID bool + streaming bool + skipLoggingNotFound bool +} + +func rollbackTx(ctx context.Context, tx pgx.Tx) { + _ = tx.Rollback(ctx) +} + +func (s *PostgresEventStore) acquireRegularConnection(ctx context.Context) (func(), error) { + // Return error if context is already done. + if ctx.Err() != nil { + return nil, ctx.Err() + } + + if err := s.regularConnections.Acquire(ctx, 1); err != nil { + return nil, err + } + + release := func() { + s.regularConnections.Release(1) + } + + // semaphore acquire can sometimes return a valid result for an expired context, so go ahead + // and check again here. + if ctx.Err() != nil { + release() + return nil, ctx.Err() + } + + return release, nil +} + +func (s *PostgresEventStore) acquireStreamingConnection(ctx context.Context) (func(), error) { + // Return error if context is already done. + if ctx.Err() != nil { + return nil, ctx.Err() + } + + if err := s.streamingConnections.Acquire(ctx, 1); err != nil { + return nil, err + } + + release := func() { + s.streamingConnections.Release(1) + } + + // semaphore acquire can sometimes return a valid result for an expired context, so go ahead + // and check again here. + if ctx.Err() != nil { + release() + return nil, ctx.Err() + } + + return release, nil +} + +func (s *PostgresEventStore) txRunnerInner( + ctx context.Context, + accessMode pgx.TxAccessMode, + txFn func(context.Context, pgx.Tx) error, + opts *txRunnerOpts, +) error { + // Acquire rights to use a connection. We split the pool ourselves into two parts: one for connections that stream results + // back, and one for regular connections. This is to prevent a streaming connections from consuming the regular pool. + var err error + var release func() + if opts == nil || !opts.streaming { + release, err = s.acquireRegularConnection(ctx) + } else { + release, err = s.acquireStreamingConnection(ctx) + } + if err != nil { + return AsRiverError(err, Err_DB_OPERATION_FAILURE). + Func("pg.txRunnerInner"). + Message("failed to acquire connection before running transaction") + } + defer release() + + tx, err := s.pool.BeginTx(ctx, pgx.TxOptions{IsoLevel: pgx.Serializable, AccessMode: accessMode}) + if err != nil { + return err + } + defer rollbackTx(ctx, tx) + + if opts == nil || !opts.disableCompareUUID { + err = s.compareUUID(ctx, tx) + if err != nil { + return err + } + } + + err = txFn(ctx, tx) + if err != nil { + return err + } + + err = tx.Commit(ctx) + if err != nil { + return err + } + return nil +} + +func (s *PostgresEventStore) txRunner( + ctx context.Context, + name string, + accessMode pgx.TxAccessMode, + txFn func(context.Context, pgx.Tx) error, + opts *txRunnerOpts, +) error { + log := dlog.FromCtx(ctx) + + if accessMode == pgx.ReadWrite { + // For write transactions context should not be cancelled if a client connection drops. Cancellations due to lost client connections can cause + // operations on the PostgresEventStore to fail even if transactions commit, leading to a corruption in cached state. + ctx = context.WithoutCancel(ctx) + } + + for { + err := s.txRunnerInner(ctx, accessMode, txFn, opts) + if err != nil { + if pgErr, ok := err.(*pgconn.PgError); ok { + if pgErr.Code == pgerrcode.SerializationFailure { + log.Warn( + "pg.txRunner: retrying transaction due to serialization failure", + "name", + name, + "pgErr", + pgErr, + ) + continue + } + log.Warn("pg.txRunner: transaction failed", "name", name, "pgErr", pgErr) + } else { + level := slog.LevelWarn + if opts != nil && opts.skipLoggingNotFound && AsRiverError(err).Code == Err_NOT_FOUND { + level = slog.LevelDebug + } + log.Log(ctx, level, "pg.txRunner: transaction failed", "name", name, "err", err) + } + return WrapRiverError( + Err_DB_OPERATION_FAILURE, + err, + ).Func("pg.txRunner"). + Message("transaction failed"). + Tag("name", name) + } + return nil + } +} + +func (s *PostgresEventStore) txRunnerWithMetrics( + ctx context.Context, + name string, + accessMode pgx.TxAccessMode, + txFn func(context.Context, pgx.Tx) error, + opts *txRunnerOpts, + tags ...any, +) error { + log := dlog.FromCtx(ctx) + logTags := append(tags, "name", name, "currentUUID", s.nodeUUID, "dbSchema", s.schemaName) + log.Debug("pg.txRunnerWithMetrics: START", logTags...) + + defer infra.StoreExecutionTimeMetrics(name, infra.DB_CALLS_CATEGORY, time.Now()) + + err := s.txRunner( + ctx, + name, + accessMode, + txFn, + opts, + ) + if err != nil { + dbCalls.FailIncForChild(name) + return AsRiverError(err, Err_DB_OPERATION_FAILURE).Message("pg.txRunnerWithMetrics: FAILED").Func(name). + Tags(tags...).Tag("currentUUID", s.nodeUUID).Tag("dbSchema", s.schemaName).LogDebug(log) + } + dbCalls.PassIncForChild(name) + log.Debug("pg.txRunnerWithMetrics: SUCCESS", logTags...) + return nil +} + +func (s *PostgresEventStore) CreateStreamStorage( + ctx context.Context, + streamId StreamId, + genesisMiniblock []byte, +) error { + return s.txRunnerWithMetrics( + ctx, + "CreateStreamStorage", + pgx.ReadWrite, + func(ctx context.Context, tx pgx.Tx) error { + return s.createStreamStorageTx(ctx, tx, streamId, genesisMiniblock) + }, + nil, + "streamId", streamId, + ) +} + +func (s *PostgresEventStore) createStreamStorageTx( + ctx context.Context, + tx pgx.Tx, + streamId StreamId, + genesisMiniblock []byte, +) error { + tableSuffix := createTableSuffix(streamId) + sql := fmt.Sprintf( + `INSERT INTO es (stream_id, latest_snapshot_miniblock) VALUES ($1, 0); + CREATE TABLE miniblocks_%[1]s PARTITION OF miniblocks FOR VALUES IN ($1); + CREATE TABLE minipools_%[1]s PARTITION OF minipools FOR VALUES IN ($1); + CREATE TABLE miniblock_candidates_%[1]s PARTITION OF miniblock_candidates for values in ($1); + INSERT INTO miniblocks (stream_id, seq_num, blockdata) VALUES ($1, 0, $2); + INSERT INTO minipools (stream_id, generation, slot_num) VALUES ($1, 1, -1);`, + tableSuffix, + ) + _, err := tx.Exec(ctx, sql, streamId, genesisMiniblock) + if err != nil { + if pgerr, ok := err.(*pgconn.PgError); ok && pgerr.Code == pgerrcode.UniqueViolation { + return WrapRiverError(Err_ALREADY_EXISTS, err).Message("stream already exists") + } + return err + } + return nil +} + +func (s *PostgresEventStore) CreateStreamArchiveStorage( + ctx context.Context, + streamId StreamId, +) error { + return s.txRunnerWithMetrics( + ctx, + "CreateStreamArchiveStorage", + pgx.ReadWrite, + func(ctx context.Context, tx pgx.Tx) error { + return s.createStreamArchiveStorageTx(ctx, tx, streamId) + }, + nil, + "streamId", streamId, + ) +} + +func (s *PostgresEventStore) createStreamArchiveStorageTx( + ctx context.Context, + tx pgx.Tx, + streamId StreamId, +) error { + tableSuffix := createTableSuffix(streamId) + sql := fmt.Sprintf( + `INSERT INTO es (stream_id, latest_snapshot_miniblock) VALUES ($1, -1); + CREATE TABLE miniblocks_%[1]s PARTITION OF miniblocks FOR VALUES IN ($1);`, + tableSuffix, + ) + _, err := tx.Exec(ctx, sql, streamId) + if err != nil { + if pgerr, ok := err.(*pgconn.PgError); ok && pgerr.Code == pgerrcode.UniqueViolation { + return WrapRiverError(Err_ALREADY_EXISTS, err).Message("stream already exists") + } + return err + } + return nil +} + +func (s *PostgresEventStore) GetMaxArchivedMiniblockNumber(ctx context.Context, streamId StreamId) (int64, error) { + var maxArchivedMiniblockNumber int64 + err := s.txRunnerWithMetrics( + ctx, + "GetMaxArchivedMiniblockNumber", + pgx.ReadOnly, + func(ctx context.Context, tx pgx.Tx) error { + return s.getMaxArchivedMiniblockNumberTx(ctx, tx, streamId, &maxArchivedMiniblockNumber) + }, + &txRunnerOpts{skipLoggingNotFound: true}, + "streamId", streamId, + ) + if err != nil { + return -1, err + } + return maxArchivedMiniblockNumber, nil +} + +func (s *PostgresEventStore) getMaxArchivedMiniblockNumberTx( + ctx context.Context, + tx pgx.Tx, + streamId StreamId, + maxArchivedMiniblockNumber *int64, +) error { + err := tx.QueryRow( + ctx, + "SELECT COALESCE(MAX(seq_num), -1) FROM miniblocks WHERE stream_id = $1", + streamId, + ).Scan(maxArchivedMiniblockNumber) + if err != nil { + return err + } + if *maxArchivedMiniblockNumber == -1 { + var exists bool + err = tx.QueryRow( + ctx, + "SELECT EXISTS(SELECT 1 FROM es WHERE stream_id = $1)", + streamId, + ).Scan(&exists) + if err != nil { + return err + } + if !exists { + return RiverError(Err_NOT_FOUND, "stream not found in local storage", "streamId", streamId) + } + } + return nil +} + +func (s *PostgresEventStore) WriteArchiveMiniblocks( + ctx context.Context, + streamId StreamId, + startMiniblockNum int64, + miniblocks [][]byte, +) error { + return s.txRunnerWithMetrics( + ctx, + "WriteArchiveMiniblocks", + pgx.ReadWrite, + func(ctx context.Context, tx pgx.Tx) error { + return s.writeArchiveMiniblocksTx(ctx, tx, streamId, startMiniblockNum, miniblocks) + }, + nil, + "streamId", streamId, + "startMiniblockNum", startMiniblockNum, + "numMiniblocks", len(miniblocks), + ) +} + +func (s *PostgresEventStore) writeArchiveMiniblocksTx( + ctx context.Context, + tx pgx.Tx, + streamId StreamId, + startMiniblockNum int64, + miniblocks [][]byte, +) error { + var lastKnownMiniblockNum int64 + err := s.getMaxArchivedMiniblockNumberTx(ctx, tx, streamId, &lastKnownMiniblockNum) + if err != nil { + return err + } + if lastKnownMiniblockNum+1 != startMiniblockNum { + return RiverError( + Err_DB_OPERATION_FAILURE, + "miniblock sequence number mismatch", + "lastKnownMiniblockNum", lastKnownMiniblockNum, + "startMiniblockNum", startMiniblockNum, + "streamId", streamId, + ) + } + + for i, miniblock := range miniblocks { + _, err := tx.Exec( + ctx, + "INSERT INTO miniblocks (stream_id, seq_num, blockdata) VALUES ($1, $2, $3)", + streamId, + startMiniblockNum+int64(i), + miniblock) + if err != nil { + return err + } + } + return nil +} + +func (s *PostgresEventStore) ReadStreamFromLastSnapshot( + ctx context.Context, + streamId StreamId, + precedingBlockCount int, +) (*ReadStreamFromLastSnapshotResult, error) { + var ret *ReadStreamFromLastSnapshotResult + err := s.txRunnerWithMetrics( + ctx, + "ReadStreamFromLastSnapshot", + pgx.ReadOnly, + func(ctx context.Context, tx pgx.Tx) error { + var err error + ret, err = s.readStreamFromLastSnapshotTx(ctx, tx, streamId, precedingBlockCount) + return err + }, + nil, + "streamId", streamId, + ) + if err != nil { + return nil, err + } + return ret, nil +} + +// Supported consistency checks: +// 1. There are no gaps in miniblocks sequence and it starts from latestsnaphot +// 2. There are no gaps in slot_num for envelopes in minipools and it starts from 0 +// 3. For envelopes all generations are the same and equals to "max generation seq_num in miniblocks" + 1 +func (s *PostgresEventStore) readStreamFromLastSnapshotTx( + ctx context.Context, + tx pgx.Tx, + streamId StreamId, + precedingBlockCount int, +) (*ReadStreamFromLastSnapshotResult, error) { + var result ReadStreamFromLastSnapshotResult + + // first let's check what is the last block with snapshot + var latest_snapshot_miniblock_index int64 + err := tx. + QueryRow(ctx, "SELECT latest_snapshot_miniblock FROM es WHERE stream_id = $1", streamId). + Scan(&latest_snapshot_miniblock_index) + if err != nil { + if err == pgx.ErrNoRows { + return nil, WrapRiverError(Err_NOT_FOUND, err).Message("stream not found in local storage") + } else { + return nil, err + } + } + + result.StartMiniblockNumber = max(0, latest_snapshot_miniblock_index-int64(max(0, precedingBlockCount))) + + miniblocksRow, err := tx.Query( + ctx, + "SELECT blockdata, seq_num FROM miniblocks WHERE seq_num >= $1 AND stream_id = $2 ORDER BY seq_num", + latest_snapshot_miniblock_index, + streamId, + ) + if err != nil { + return nil, err + } + defer miniblocksRow.Close() + + // Retrieve miniblocks starting from the latest miniblock with snapshot + var miniblocks [][]byte + + // During scanning rows we also check that there are no gaps in miniblocks sequence and it starts from latestsnaphot + var counter int64 = 0 + var seqNum int64 + + for miniblocksRow.Next() { + var blockdata []byte + + err = miniblocksRow.Scan(&blockdata, &seqNum) + if err != nil { + return nil, err + } + if seqNum != latest_snapshot_miniblock_index+counter { + return nil, RiverError( + Err_MINIBLOCKS_STORAGE_FAILURE, + "Miniblocks consistency violation - wrong block sequence number", + "ActualSeqNum", seqNum, + "ExpectedSeqNum", latest_snapshot_miniblock_index+counter) + } + miniblocks = append(miniblocks, blockdata) + counter++ + } + + // At this moment seqNum contains max miniblock number in the miniblock storage + result.Miniblocks = miniblocks + + // Retrieve events from minipool + rows, err := tx.Query( + ctx, + "SELECT envelope, generation, slot_num FROM minipools WHERE slot_num > -1 AND stream_id = $1 ORDER BY generation, slot_num", + streamId, + ) + if err != nil { + return nil, err + } + + defer rows.Close() + + var envelopes [][]byte + var slotNumsCounter int64 = 0 + + // Let's check during scan that slot_nums start from 0 and there are no gaps and that each generation is equal to maxSeqNumInMiniblocksTable+1 + for rows.Next() { + var envelope []byte + var generation int64 + var slotNum int64 + err = rows.Scan(&envelope, &generation, &slotNum) + if err != nil { + return nil, err + } + // Check that we don't have gaps in slot numbers + if slotNum != slotNumsCounter { + return nil, RiverError( + Err_MINIBLOCKS_STORAGE_FAILURE, + "Minipool consistency violation - slotNums are not sequential", + ). + Tag("ActualSlotNumber", slotNum). + Tag("ExpectedSlotNumber", slotNumsCounter) + } + // Check that all events in minipool have proper generation + if generation != seqNum+1 { + return nil, RiverError( + Err_MINIBLOCKS_STORAGE_FAILURE, + "Minipool consistency violation - wrong event generation", + ). + Tag("ActualGeneration", generation). + Tag("ExpectedGeneration", slotNum) + } + envelopes = append(envelopes, envelope) + slotNumsCounter++ + } + + result.MinipoolEnvelopes = envelopes + return &result, nil +} + +// Adds event to the given minipool. +// Current generation of minipool should match minipoolGeneration, +// and there should be exactly minipoolSlot events in the minipool. +func (s *PostgresEventStore) WriteEvent( + ctx context.Context, + streamId StreamId, + minipoolGeneration int64, + minipoolSlot int, + envelope []byte, +) error { + return s.txRunnerWithMetrics( + ctx, + "WriteEvent", + pgx.ReadWrite, + func(ctx context.Context, tx pgx.Tx) error { + return s.writeEventTx(ctx, tx, streamId, minipoolGeneration, minipoolSlot, envelope) + }, + nil, + "streamId", streamId, + "minipoolGeneration", minipoolGeneration, + "minipoolSlot", minipoolSlot, + ) +} + +// Supported consistency checks: +// 1. Minipool has proper number of records including service one (equal to minipoolSlot) +// 2. There are no gaps in seqNums and they start from 0 execpt service record with seqNum = -1 +// 3. All events in minipool have proper generation +func (s *PostgresEventStore) writeEventTx( + ctx context.Context, + tx pgx.Tx, + streamId StreamId, + minipoolGeneration int64, + minipoolSlot int, + envelope []byte, +) error { + envelopesRow, err := tx.Query( + ctx, + "SELECT generation, slot_num FROM minipools WHERE stream_id = $1 ORDER BY slot_num", + streamId, + ) + if err != nil { + return err + } + defer envelopesRow.Close() + + var counter int = -1 // counter is set to -1 as we have service record in the first row of minipool table + + for envelopesRow.Next() { + var generation int64 + var slotNum int + err = envelopesRow.Scan(&generation, &slotNum) + if err != nil { + return err + } + if generation != minipoolGeneration { + return RiverError(Err_DB_OPERATION_FAILURE, "Wrong event generation in minipool"). + Tag("ExpectedGeneration", minipoolGeneration).Tag("ActualGeneration", generation). + Tag("SlotNumber", slotNum) + } + if slotNum != counter { + return RiverError(Err_DB_OPERATION_FAILURE, "Wrong slot number in minipool"). + Tag("ExpectedSlotNumber", counter).Tag("ActualSlotNumber", slotNum) + } + // Slots number for envelopes start from 1, so we skip counter equal to zero + counter++ + } + + // At this moment counter should be equal to minipoolSlot otherwise it is discrepancy of actual and expected records in minipool + // Keep in mind that there is service record with seqNum equal to -1 + if counter != minipoolSlot { + return RiverError(Err_DB_OPERATION_FAILURE, "Wrong number of records in minipool"). + Tag("ActualRecordsNumber", counter).Tag("ExpectedRecordsNumber", minipoolSlot) + } + + // All checks passed - we need to insert event into minipool + _, err = tx.Exec( + ctx, + "INSERT INTO minipools (stream_id, envelope, generation, slot_num) VALUES ($1, $2, $3, $4)", + streamId, + envelope, + minipoolGeneration, + minipoolSlot, + ) + if err != nil { + return err + } + return nil +} + +// Supported consistency checks: +// 1. There are no gaps in miniblocks sequence +// TODO: Do we want to check that if we get miniblocks an toIndex is greater or equal block with latest snapshot, than in results we will have at least +// miniblock with latest snapshot? +// This functional is not transactional as it consists of only one SELECT query +func (s *PostgresEventStore) ReadMiniblocks( + ctx context.Context, + streamId StreamId, + fromInclusive int64, + toExclusive int64, +) ([][]byte, error) { + var miniblocks [][]byte + err := s.txRunnerWithMetrics( + ctx, + "ReadMiniblocks", + pgx.ReadOnly, + func(ctx context.Context, tx pgx.Tx) error { + var err error + miniblocks, err = s.readMiniblocksTx(ctx, tx, streamId, fromInclusive, toExclusive) + return err + }, + nil, + "streamId", streamId, + ) + if err != nil { + return nil, err + } + return miniblocks, nil +} + +func (s *PostgresEventStore) readMiniblocksTx( + ctx context.Context, + tx pgx.Tx, + streamId StreamId, + fromInclusive int64, + toExclusive int64, +) ([][]byte, error) { + miniblocksRow, err := tx.Query( + ctx, + "SELECT blockdata, seq_num FROM miniblocks WHERE seq_num >= $1 AND seq_num < $2 AND stream_id = $3 ORDER BY seq_num", + fromInclusive, + toExclusive, + streamId, + ) + if err != nil { + return nil, err + } + defer miniblocksRow.Close() + + // Retrieve miniblocks starting from the latest miniblock with snapshot + var miniblocks [][]byte + + var prevSeqNum int = -1 // There is no negative generation, so we use it as a flag on the first step of the loop during miniblocks sequence check + for miniblocksRow.Next() { + var blockdata []byte + var seq_num int + + err = miniblocksRow.Scan(&blockdata, &seq_num) + if err != nil { + return nil, err + } + + if (prevSeqNum != -1) && (seq_num != prevSeqNum+1) { + // There is a gap in sequence numbers + return nil, RiverError(Err_MINIBLOCKS_STORAGE_FAILURE, "Miniblocks consistency violation"). + Tag("ActualBlockNumber", seq_num).Tag("ExpectedBlockNumber", prevSeqNum+1).Tag("streamId", streamId) + } + prevSeqNum = seq_num + + miniblocks = append(miniblocks, blockdata) + } + return miniblocks, nil +} + +// WriteBlockProposal adds a miniblock proposal candidate. When the miniblock is finalized, the node will promote the +// candidate with the correct hash. +func (s *PostgresEventStore) WriteBlockProposal( + ctx context.Context, + streamId StreamId, + blockHash common.Hash, + blockNumber int64, + miniblock []byte, +) error { + return s.txRunnerWithMetrics( + ctx, + "WriteBlockProposal", + pgx.ReadWrite, + func(ctx context.Context, tx pgx.Tx) error { + return s.writeBlockProposalTxn(ctx, tx, streamId, blockHash, blockNumber, miniblock) + }, + nil, + "streamId", streamId, + "blockHash", blockHash, + "blockNumber", blockNumber, + ) +} + +// Supported consistency checks: +// 1. Proposal block number is current miniblock block number + 1 +func (s *PostgresEventStore) writeBlockProposalTxn( + ctx context.Context, + tx pgx.Tx, + streamId StreamId, + blockHash common.Hash, + blockNumber int64, + miniblock []byte, +) error { + var seqNum *int64 + + err := tx.QueryRow(ctx, "SELECT MAX(seq_num) as latest_blocks_number FROM miniblocks WHERE stream_id = $1", streamId). + Scan(&seqNum) + if err != nil { + return err + } + if seqNum == nil { + return RiverError(Err_NOT_FOUND, "No blocks for the stream found in block storage") + } + // Proposal should be for or after the next block number. Candidates from before the next block number are rejected. + if blockNumber < *seqNum+1 { + return RiverError(Err_MINIBLOCKS_STORAGE_FAILURE, "Miniblock proposal blockNumber mismatch"). + Tag("ExpectedBlockNumber", *seqNum+1).Tag("ActualBlockNumber", blockNumber) + } + + // insert miniblock proposal into miniblock_candidates table + _, err = tx.Exec( + ctx, + "INSERT INTO miniblock_candidates (stream_id, seq_num, block_hash, blockdata) VALUES ($1, $2, $3, $4) ON CONFLICT(stream_id, seq_num, block_hash) DO NOTHING", + streamId, + blockNumber, + hex.EncodeToString(blockHash.Bytes()), // avoid leading '0x' + miniblock, + ) + return err +} + +func (s *PostgresEventStore) PromoteBlock( + ctx context.Context, + streamId StreamId, + minipoolGeneration int64, + candidateBlockHash common.Hash, + snapshotMiniblock bool, + envelopes [][]byte, +) error { + return s.txRunnerWithMetrics( + ctx, + "PromoteBlock", + pgx.ReadWrite, + func(ctx context.Context, tx pgx.Tx) error { + return s.promoteBlockTxn( + ctx, + tx, + streamId, + minipoolGeneration, + candidateBlockHash, + snapshotMiniblock, + envelopes, + ) + }, + nil, + "streamId", streamId, + "minipoolGeneration", minipoolGeneration, + "candidateBlockHash", candidateBlockHash, + "snapshotMiniblock", snapshotMiniblock, + ) +} + +func (s *PostgresEventStore) promoteBlockTxn( + ctx context.Context, + tx pgx.Tx, + streamId StreamId, + minipoolGeneration int64, + candidateBlockHash common.Hash, + snapshotMiniblock bool, + envelopes [][]byte, +) error { + var seqNum *int64 + + err := tx.QueryRow(ctx, "SELECT MAX(seq_num) as latest_blocks_number FROM miniblocks WHERE stream_id = $1", streamId). + Scan(&seqNum) + if err != nil { + return err + } + if seqNum == nil { + return RiverError(Err_NOT_FOUND, "No blocks for the stream found in block storage") + } + if minipoolGeneration != *seqNum+1 { + return RiverError(Err_MINIBLOCKS_STORAGE_FAILURE, "Minipool generation mismatch"). + Tag("ExpectedNewMinipoolGeneration", minipoolGeneration).Tag("ActualNewMinipoolGeneration", *seqNum+1) + } + + // clean up minipool + _, err = tx.Exec(ctx, "DELETE FROM minipools WHERE slot_num > -1 AND stream_id = $1", streamId) + if err != nil { + return err + } + + // update -1 record of minipools table to minipoolGeneration + 1 + _, err = tx.Exec( + ctx, + "UPDATE minipools SET generation = $1 WHERE slot_num = -1 AND stream_id = $2", + minipoolGeneration+1, + streamId, + ) + if err != nil { + return err + } + + // update stream_snapshots_index if needed + if snapshotMiniblock { + _, err := tx.Exec( + ctx, + `UPDATE es SET latest_snapshot_miniblock = $1 WHERE stream_id = $2`, + minipoolGeneration, + streamId, + ) + if err != nil { + return err + } + } + + // insert all minipool events into minipool + for i, envelope := range envelopes { + _, err = tx.Exec( + ctx, + "INSERT INTO minipools (stream_id, slot_num, generation, envelope) VALUES ($1, $2, $3, $4)", + streamId, + i, + minipoolGeneration+1, + envelope, + ) + if err != nil { + return err + } + } + + // promote miniblock candidate into miniblocks table + tag, err := tx.Exec( + ctx, + "INSERT INTO miniblocks SELECT stream_id, seq_num, blockdata FROM miniblock_candidates WHERE stream_id = $1 AND seq_num = $2 AND miniblock_candidates.block_hash = $3", + streamId, + minipoolGeneration, + hex.EncodeToString(candidateBlockHash.Bytes()), // avoid leading '0x' + ) + if err != nil { + return err + } + // Exactly one row should be copied. (stream_id, seq_num, blockhash) is a unique key, so we expect 0 or 1 copies. + if tag.RowsAffected() < 1 { + return RiverError(Err_NOT_FOUND, "No candidate block found") + } + + // clean up miniblock proposals for stream id + _, err = tx.Exec( + ctx, + "DELETE FROM miniblock_candidates WHERE stream_id = $1 and seq_num <= $2", + streamId, + minipoolGeneration, + ) + return err +} + +func (s *PostgresEventStore) GetStreamsNumber(ctx context.Context) (int, error) { + var count int + err := s.txRunnerWithMetrics( + ctx, + "GetStreamsNumber", + pgx.ReadOnly, + func(ctx context.Context, tx pgx.Tx) error { + var err error + count, err = s.getStreamsNumberTx(ctx, tx) + return err + }, + nil, + ) + if err != nil { + return 0, err + } + return count, nil +} + +func (s *PostgresEventStore) getStreamsNumberTx(ctx context.Context, tx pgx.Tx) (int, error) { + var count int + row := tx.QueryRow(ctx, "SELECT COUNT(stream_id) FROM es") + err := row.Scan(&count) + if err != nil { + return 0, err + } + dlog.FromCtx(ctx).Debug("GetStreamsNumberTx", "count", count) + return count, nil +} + +func (s *PostgresEventStore) compareUUID(ctx context.Context, tx pgx.Tx) error { + log := dlog.FromCtx(ctx) + + rows, err := tx.Query(ctx, "SELECT uuid FROM singlenodekey") + if err != nil { + return err + } + defer rows.Close() + + allIds := []string{} + for rows.Next() { + var id string + err = rows.Scan(&id) + if err != nil { + return err + } + allIds = append(allIds, id) + } + + if len(allIds) == 1 && allIds[0] == s.nodeUUID { + return nil + } + + err = RiverError(Err_RESOURCE_EXHAUSTED, "No longer a current node, shutting down"). + Func("pg.compareUUID"). + Tag("currentUUID", s.nodeUUID). + Tag("schema", s.schemaName). + Tag("newUUIDs", allIds). + LogError(log) + s.exitSignal <- err + return err +} + +func (s *PostgresEventStore) CleanupStorage(ctx context.Context) error { + return s.txRunnerWithMetrics( + ctx, + "CleanupStorage", + pgx.ReadWrite, + s.cleanupStorageTx, + &txRunnerOpts{disableCompareUUID: true}, + ) +} + +func (s *PostgresEventStore) cleanupStorageTx(ctx context.Context, tx pgx.Tx) error { + _, err := tx.Exec(ctx, "DELETE FROM singlenodekey WHERE uuid = $1", s.nodeUUID) + return err +} + +// GetStreams returns a list of all event streams +func (s *PostgresEventStore) GetStreams(ctx context.Context) ([]StreamId, error) { + var streams []StreamId + err := s.txRunnerWithMetrics( + ctx, + "GetStreams", + pgx.ReadOnly, + func(ctx context.Context, tx pgx.Tx) error { + var err error + streams, err = s.getStreamsTx(ctx, tx) + return err + }, + nil, + ) + if err != nil { + return nil, err + } + return streams, nil +} + +func (s *PostgresEventStore) getStreamsTx(ctx context.Context, tx pgx.Tx) ([]StreamId, error) { + streams := []string{} + rows, err := tx.Query(ctx, "SELECT stream_id FROM es") + if err != nil { + return nil, err + } + defer rows.Close() + for rows.Next() { + var streamName string + err = rows.Scan(&streamName) + if err != nil { + return nil, err + } + streams = append(streams, streamName) + } + + ret := make([]StreamId, len(streams)) + for i, stream := range streams { + ret[i], err = StreamIdFromString(stream) + if err != nil { + return nil, err + } + } + return ret, nil +} + +func (s *PostgresEventStore) DeleteStream(ctx context.Context, streamId StreamId) error { + return s.txRunnerWithMetrics( + ctx, + "DeleteStream", + pgx.ReadWrite, + func(ctx context.Context, tx pgx.Tx) error { + return s.deleteStreamTx(ctx, tx, streamId) + }, + nil, + "streamId", streamId, + ) +} + +func (s *PostgresEventStore) deleteStreamTx(ctx context.Context, tx pgx.Tx, streamId StreamId) error { + _, err := tx.Exec( + ctx, + fmt.Sprintf( + `DROP TABLE miniblocks_%[1]s; + DROP TABLE minipools_%[1]s; + DELETE FROM es WHERE stream_id = $1`, + createTableSuffix(streamId), + ), + streamId) + return err +} + +func DbSchemaNameFromAddress(address string) string { + return "s" + strings.ToLower(address) +} + +func DbSchemaNameForArchive(archiveId string) string { + return "arch" + strings.ToLower(archiveId) +} + +func getDbURL(dbConfig *config.DatabaseConfig) string { + if dbConfig.Password != "" { + return fmt.Sprintf( + "postgresql://%s:%s@%s:%d/%s%s", + dbConfig.User, + dbConfig.Password, + dbConfig.Host, + dbConfig.Port, + dbConfig.Database, + dbConfig.Extra, + ) + } + + return dbConfig.Url +} + +type PgxPoolInfo struct { + Pool *pgxpool.Pool + Url string + Schema string + Config *config.DatabaseConfig +} + +func createAndValidatePgxPool( + ctx context.Context, + cfg *config.DatabaseConfig, + databaseSchemaName string, +) (*PgxPoolInfo, error) { + databaseUrl := getDbURL(cfg) + + poolConf, err := pgxpool.ParseConfig(databaseUrl) + if err != nil { + return nil, err + } + + // In general, it should be possible to add database schema name into database url as a parameter search_path (&search_path=database_schema_name) + // For some reason it doesn't work so have to put it into config explicitly + poolConf.ConnConfig.RuntimeParams["search_path"] = databaseSchemaName + + poolConf.ConnConfig.DefaultQueryExecMode = pgx.QueryExecModeSimpleProtocol + + pool, err := pgxpool.NewWithConfig(ctx, poolConf) + if err != nil { + return nil, err + } + + err = pool.Ping(ctx) + if err != nil { + return nil, err + } + + return &PgxPoolInfo{ + Pool: pool, + Url: databaseUrl, + Schema: databaseSchemaName, + Config: cfg, + }, nil +} + +func CreateAndValidatePgxPool( + ctx context.Context, + cfg *config.DatabaseConfig, + databaseSchemaName string, +) (*PgxPoolInfo, error) { + r, err := createAndValidatePgxPool(ctx, cfg, databaseSchemaName) + if err != nil { + return nil, AsRiverError(err, Err_DB_OPERATION_FAILURE).Func("CreateAndValidatePgxPool") + } + return r, nil +} + +func NewPostgresEventStore( + ctx context.Context, + poolInfo *PgxPoolInfo, + instanceId string, + exitSignal chan error, +) (*PostgresEventStore, error) { + store, err := newPostgresEventStore( + ctx, + poolInfo, + instanceId, + exitSignal, + migrationsDir, + ) + if err != nil { + return nil, AsRiverError(err).Func("NewPostgresEventStore") + } + + return store, nil +} + +// Disallow allocating more than 30% of connections for streaming connections. +var MaxStreamingConnectionsRatio float32 = 0.3 + +func newPostgresEventStore( + ctx context.Context, + poolInfo *PgxPoolInfo, + instanceId string, + exitSignal chan error, + migrations embed.FS, +) (*PostgresEventStore, error) { + log := dlog.FromCtx(ctx) + + streamingConnectionRatio := poolInfo.Config.StreamingConnectionsRatio + // Bounds check the streaming connection ratio + // TODO: when we add streaming calls, we should make the minimum larger, perhaps 5%. + if streamingConnectionRatio < 0 { + log.Info( + "Invalid streaming connection ratio, setting to 0", + "streamingConnectionRatio", + streamingConnectionRatio, + ) + streamingConnectionRatio = 0 + } + // Limit the ratio of available connections reserved for streaming to 30% + if streamingConnectionRatio > MaxStreamingConnectionsRatio { + log.Info( + "Invalid streaming connection ratio, setting to maximum of 30%", + "streamingConnectionRatio", + streamingConnectionRatio, + ) + streamingConnectionRatio = MaxStreamingConnectionsRatio + } + + var totalReservableConns int64 = int64(poolInfo.Pool.Config().MaxConns) - 1 // subtract extra connection for the listeneer + var numRegularConnections int64 = int64(float32(totalReservableConns) * (1 - streamingConnectionRatio)) + var numStreamingConnections int64 = totalReservableConns - numRegularConnections + + // Ensure there is at least one connection set aside for streaming queries even though we're not using them at + // this time. + if numStreamingConnections < 1 { + numStreamingConnections += 1 + numRegularConnections -= 1 + } + + store := &PostgresEventStore{ + config: poolInfo.Config, + pool: poolInfo.Pool, + schemaName: poolInfo.Schema, + nodeUUID: instanceId, + exitSignal: exitSignal, + dbUrl: poolInfo.Url, + migrationDir: migrations, + regularConnections: semaphore.NewWeighted(numRegularConnections), + streamingConnections: semaphore.NewWeighted(numStreamingConnections), + } + + err := store.InitStorage(ctx) + if err != nil { + return nil, err + } + + cancelCtx, cancel := context.WithCancel(ctx) + store.cleanupListenFunc = cancel + go store.listenForNewNodes(cancelCtx) + + // TODO: publish these as metrics + // stats thread + // go func() { + // for { + // timer := time.NewTimer(PG_REPORT_INTERVAL) + // select { + // case <-ctx.Done(): + // timer.Stop() + // return + // case <-timer.C: + // stats := pool.Stat() + // log.Debug("PG pool stats", + // "acquireCount", stats.AcquireCount(), + // "acquiredConns", stats.AcquiredConns(), + // "idleConns", stats.IdleConns(), + // "totalConns", stats.TotalConns(), + // ) + // } + // } + // }() + + return store, nil +} + +// Close removes instance record from singlenodekey table and closes the connection pool +func (s *PostgresEventStore) Close(ctx context.Context) { + _ = s.CleanupStorage(ctx) + // Cancel the notify listening func to release the listener connection before closing the pool. + s.cleanupListenFunc() + + s.pool.Close() +} + +//go:embed migrations/*.sql +var migrationsDir embed.FS + +func (s *PostgresEventStore) InitStorage(ctx context.Context) error { + err := s.initStorage(ctx) + if err != nil { + return AsRiverError(err).Func("InitStorage").Tag("schemaName", s.schemaName) + } + + return nil +} + +func (s *PostgresEventStore) createSchemaTx(ctx context.Context, tx pgx.Tx) error { + log := dlog.FromCtx(ctx) + + // Create schema iff not exists + var schemaExists bool + err := tx.QueryRow( + ctx, + "SELECT EXISTS(SELECT 1 FROM information_schema.schemata WHERE schema_name = $1)", + s.schemaName).Scan(&schemaExists) + if err != nil { + return err + } + + if !schemaExists { + createSchemaQuery := fmt.Sprintf("CREATE SCHEMA \"%s\"", s.schemaName) + _, err := tx.Exec(ctx, createSchemaQuery) + if err != nil { + return err + } + log.Info("DB Schema created", "schema", s.schemaName) + } else { + log.Info("DB Schema already exists", "schema", s.schemaName) + } + return nil +} + +func (s *PostgresEventStore) runMigrations() error { + // Run migrations + iofsMigrationsDir, err := iofs.New(s.migrationDir, "migrations") + if err != nil { + return WrapRiverError(Err_DB_OPERATION_FAILURE, err).Message("Error loading migrations") + } + + dbUrlWithSchema := strings.Split(s.dbUrl, "?")[0] + fmt.Sprintf( + "?sslmode=disable&search_path=%v,public", + s.schemaName, + ) + migration, err := migrate.NewWithSourceInstance("iofs", iofsMigrationsDir, dbUrlWithSchema) + if err != nil { + return WrapRiverError(Err_DB_OPERATION_FAILURE, err).Message("Error creating migration instance") + } + + if err = migration.Up(); err != nil && err != migrate.ErrNoChange { + return WrapRiverError(Err_DB_OPERATION_FAILURE, err).Message("Error running migrations") + } + + return nil +} + +func (s *PostgresEventStore) listOtherInstancesTx(ctx context.Context, tx pgx.Tx) error { + log := dlog.FromCtx(ctx) + + rows, err := tx.Query(ctx, "SELECT uuid, storage_connection_time, info FROM singlenodekey") + if err != nil { + return err + } + defer rows.Close() + + found := false + for rows.Next() { + var storedUUID string + var storedTimestamp time.Time + var storedInfo string + err := rows.Scan(&storedUUID, &storedTimestamp, &storedInfo) + if err != nil { + return err + } + log.Info("Found UUID during startup", "uuid", storedUUID, "timestamp", storedTimestamp, "info", storedInfo) + found = true + } + + if found { + delay := s.config.StartupDelay + if delay == 0 { + delay = 2 * time.Second + } else if delay <= time.Millisecond { + delay = 0 + } + if delay > 0 { + log.Info("singlenodekey is not empty; Delaying startup to let other instance exit", "delay", delay) + time.Sleep(delay) + } + } + + return nil +} + +func (s *PostgresEventStore) initializeSingleNodeKeyTx(ctx context.Context, tx pgx.Tx) error { + _, err := tx.Exec(ctx, "DELETE FROM singlenodekey") + if err != nil { + return err + } + + _, err = tx.Exec( + ctx, + "INSERT INTO singlenodekey (uuid, storage_connection_time, info) VALUES ($1, $2, $3)", + s.nodeUUID, + time.Now(), + getCurrentNodeProcessInfo(s.schemaName), + ) + if err != nil { + return err + } + + return nil +} + +// acquireListeningConnection returns a connection that listens for changes to the schema, or +// a nil connection if the context is cancelled. In the event of failure to acquire a connection +// or listen, it will retry indefinitely until success. +func (s *PostgresEventStore) acquireListeningConnection(ctx context.Context) *pgxpool.Conn { + var err error + var conn *pgxpool.Conn + log := dlog.FromCtx(ctx) + for { + conn, err = s.pool.Acquire(ctx) + if err == nil { + _, err = conn.Exec(ctx, "listen singlenodekey") + if err == nil { + log.Debug("Listening connection acquired") + return conn + } else { + conn.Release() + } + } + if err == context.Canceled { + return nil + } + log.Debug("Failed to acquire listening connection, retrying", "error", err) + + // In the event of networking issues, wait a small period of time for recovery. + time.Sleep(100 * time.Millisecond) + } +} + +// Call with a cancellable context and pgx should terminate when the context is +// cancelled. Call after storage has been initialized in order to not receive a +// notification when this node updates the table. +func (s *PostgresEventStore) listenForNewNodes(ctx context.Context) { + conn := s.acquireListeningConnection(ctx) + if conn == nil { + return + } + defer conn.Release() + + for { + notification, err := conn.Conn().WaitForNotification(ctx) + + // Cancellation indicates a valid exit. + if err == context.Canceled { + return + } + + // Unexpected. + if err != nil { + // Ok to call Release multiple times + conn.Release() + conn = s.acquireListeningConnection(ctx) + if conn == nil { + return + } + defer conn.Release() + continue + } + + // Listen only for changes to our schema. + if notification.Payload == s.schemaName { + err = RiverError(Err_RESOURCE_EXHAUSTED, "No longer a current node, shutting down"). + Func("listenForNewNodes"). + Tag("schema", s.schemaName). + LogWarn(dlog.FromCtx(ctx)) + + // In the event of detecting node conflict, send the error to the main thread to shut down. + s.exitSignal <- err + return + } + } +} + +func (s *PostgresEventStore) initStorage(ctx context.Context) error { + err := s.txRunnerWithMetrics( + ctx, + "createSchema", + pgx.ReadWrite, + s.createSchemaTx, + &txRunnerOpts{disableCompareUUID: true}, + ) + if err != nil { + return err + } + + err = s.runMigrations() + if err != nil { + return err + } + + err = s.txRunnerWithMetrics( + ctx, + "listOtherInstances", + pgx.ReadOnly, + s.listOtherInstancesTx, + &txRunnerOpts{disableCompareUUID: true}, + ) + if err != nil { + return err + } + + return s.txRunnerWithMetrics( + ctx, + "initializeSingleNodeKey", + pgx.ReadWrite, + s.initializeSingleNodeKeyTx, + &txRunnerOpts{disableCompareUUID: true}, + ) +} + +func createTableSuffix(streamId StreamId) string { + sum := sha3.Sum224([]byte(streamId.String())) + return hex.EncodeToString(sum[:]) +} + +func getCurrentNodeProcessInfo(currentSchemaName string) string { + currentHostname, err := os.Hostname() + if err != nil { + currentHostname = "unknown" + } + currentPID := os.Getpid() + return fmt.Sprintf("hostname=%s, pid=%d, schema=%s", currentHostname, currentPID, currentSchemaName) +} diff --git a/core/node/storage/pg_storage_archive_test.go b/core/node/storage/pg_storage_archive_test.go new file mode 100644 index 000000000..21ad7528e --- /dev/null +++ b/core/node/storage/pg_storage_archive_test.go @@ -0,0 +1,84 @@ +package storage + +import ( + "fmt" + "testing" + + . "github.com/river-build/river/core/node/base" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/shared" + "github.com/river-build/river/core/node/testutils" + "github.com/stretchr/testify/require" +) + +func mbDataForNumb(n int64) []byte { + return []byte(fmt.Sprintf("data-%d", n)) +} + +func TestArchive(t *testing.T) { + require := require.New(t) + + ctx, pg, testParams := setupTest() + defer testParams.closer() + + streamId1 := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + + _, err := pg.GetMaxArchivedMiniblockNumber(ctx, streamId1) + require.Error(err) + require.Equal(Err_NOT_FOUND, AsRiverError(err).Code) + + err = pg.CreateStreamArchiveStorage(ctx, streamId1) + require.NoError(err) + + err = pg.CreateStreamArchiveStorage(ctx, streamId1) + require.Error(err) + require.Equal(Err_ALREADY_EXISTS, AsRiverError(err).Code) + + bn, err := pg.GetMaxArchivedMiniblockNumber(ctx, streamId1) + require.NoError(err) + require.Equal(int64(-1), bn) + + data := [][]byte{ + mbDataForNumb(0), + mbDataForNumb(1), + mbDataForNumb(2), + } + + err = pg.WriteArchiveMiniblocks(ctx, streamId1, 1, data) + require.Error(err) + + err = pg.WriteArchiveMiniblocks(ctx, streamId1, 0, data) + require.NoError(err) + + readMBs, err := pg.ReadMiniblocks(ctx, streamId1, 0, 3) + require.NoError(err) + require.Len(readMBs, 3) + require.Equal(data, readMBs) + + data2 := [][]byte{ + mbDataForNumb(3), + mbDataForNumb(4), + mbDataForNumb(5), + } + + bn, err = pg.GetMaxArchivedMiniblockNumber(ctx, streamId1) + require.NoError(err) + require.Equal(int64(2), bn) + + err = pg.WriteArchiveMiniblocks(ctx, streamId1, 2, data2) + require.Error(err) + + err = pg.WriteArchiveMiniblocks(ctx, streamId1, 10, data2) + require.Error(err) + + err = pg.WriteArchiveMiniblocks(ctx, streamId1, 3, data2) + require.NoError(err) + + readMBs, err = pg.ReadMiniblocks(ctx, streamId1, 0, 8) + require.NoError(err) + require.Equal(append(data, data2...), readMBs) + + bn, err = pg.GetMaxArchivedMiniblockNumber(ctx, streamId1) + require.NoError(err) + require.Equal(int64(5), bn) +} diff --git a/core/node/storage/pg_storage_test.go b/core/node/storage/pg_storage_test.go new file mode 100644 index 000000000..0be0ef97b --- /dev/null +++ b/core/node/storage/pg_storage_test.go @@ -0,0 +1,776 @@ +package storage + +import ( + "context" + "embed" + "reflect" + "strings" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/base/test" + "github.com/river-build/river/core/node/config" + . "github.com/river-build/river/core/node/protocol" + . "github.com/river-build/river/core/node/shared" + "github.com/river-build/river/core/node/testutils" + "github.com/river-build/river/core/node/testutils/dbtestutils" + + "github.com/stretchr/testify/require" +) + +type testParams struct { + schema string + config *config.DatabaseConfig + exitSignal chan error + closer func() +} + +func setupTest() (context.Context, *PostgresEventStore, *testParams) { + return setupTestWithMigration(migrationsDir) +} + +func setupTestWithMigration( + migrations embed.FS, +) (context.Context, *PostgresEventStore, *testParams) { + ctx, ctxCloser := test.NewTestContext() + + dbCfg, dbSchemaName, dbCloser, err := dbtestutils.StartDB(ctx) + if err != nil { + panic(err) + } + + dbCfg.StartupDelay = 2 * time.Millisecond + dbCfg.Extra = strings.Replace(dbCfg.Extra, "pool_max_conns=1000", "pool_max_conns=10", 1) + + pool, err := CreateAndValidatePgxPool( + ctx, + dbCfg, + dbSchemaName, + ) + if err != nil { + panic(err) + } + + instanceId := GenShortNanoid() + exitSignal := make(chan error, 1) + store, err := newPostgresEventStore( + ctx, + pool, + instanceId, + exitSignal, + migrations, + ) + if err != nil { + panic(err) + } + + params := &testParams{ + schema: dbSchemaName, + config: dbCfg, + exitSignal: exitSignal, + closer: func() { + store.Close(ctx) + dbCloser() + ctxCloser() + }, + } + + return ctx, store, params +} + +func TestPostgresAcquireConnections(t *testing.T) { + tests := map[string]struct { + acquire func(t *testing.T, ctx context.Context, pgEventStore *PostgresEventStore) func() + expectedSlots int + tryAcquire func(t *testing.T, ctx context.Context, pgEventStore *PostgresEventStore) bool + }{ + "AcquireRegularConnection": { + acquire: func(t *testing.T, ctx context.Context, pgEventStore *PostgresEventStore) func() { + release, err := pgEventStore.acquireRegularConnection(ctx) + require.NoError(t, err) + return release + }, + expectedSlots: 8, + tryAcquire: func(t *testing.T, ctx context.Context, pgEventStore *PostgresEventStore) bool { + return pgEventStore.regularConnections.TryAcquire(1) + }, + }, + "AcquireStreamingConnection": { + acquire: func(t *testing.T, ctx context.Context, pgEventStore *PostgresEventStore) func() { + release, err := pgEventStore.acquireStreamingConnection(ctx) + require.NoError(t, err) + return release + }, + expectedSlots: 1, + tryAcquire: func(t *testing.T, ctx context.Context, pgEventStore *PostgresEventStore) bool { + return pgEventStore.streamingConnections.TryAcquire(1) + }, + }, + } + + for name, tc := range tests { + t.Run(name, func(t *testing.T) { + require := require.New(t) + + // dbUrl := strings.Replace(testDatabaseUrl, "pool_max_conns=1000", "pool_max_conns=10", 1) + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + + // Test that we can acquire and release connections + releaseConnections := make(chan func(), tc.expectedSlots+10) + for i := 0; i < tc.expectedSlots; i++ { + releaseConnections <- tc.acquire(t, ctx, pgEventStore) + } + + // All acquires now blocked + require.False(tc.tryAcquire(t, ctx, pgEventStore)) + + for i := 0; i < 10; i++ { + // One release frees up one acquire + (<-releaseConnections)() + releaseConnections <- tc.acquire(t, ctx, pgEventStore) + } + + for i := 0; i < tc.expectedSlots; i++ { + (<-releaseConnections)() + } + }) + } +} + +func TestPostgresEventStore(t *testing.T) { + require := require.New(t) + + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + + streamsNumber, err := pgEventStore.GetStreamsNumber(ctx) + require.NoError(err) + require.Equal(0, streamsNumber) + + streamId1 := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + streamId2 := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + streamId3 := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + + // Test that created stream will have proper genesis miniblock + genesisMiniblock := []byte("genesisMiniblock") + err = pgEventStore.CreateStreamStorage(ctx, streamId1, genesisMiniblock) + require.NoError(err) + + streamsNumber, err = pgEventStore.GetStreamsNumber(ctx) + require.NoError(err) + require.Equal(1, streamsNumber) + + streamFromLastSnaphot, streamRetrievalError := pgEventStore.ReadStreamFromLastSnapshot(ctx, streamId1, 0) + + if streamRetrievalError != nil { + t.Fatal(streamRetrievalError) + } + + if len(streamFromLastSnaphot.Miniblocks) != 1 { + t.Fatal("Expected to find one miniblock, found different number") + } + + if !reflect.DeepEqual(streamFromLastSnaphot.Miniblocks[0], genesisMiniblock) { + t.Fatal("Expected to find original genesis block, found different") + } + + if len(streamFromLastSnaphot.MinipoolEnvelopes) != 0 { + t.Fatal("Expected minipool to be empty, found different", streamFromLastSnaphot.MinipoolEnvelopes) + } + + // Test that we cannot add second stream with same id + genesisMiniblock2 := []byte("genesisMiniblock2") + err = pgEventStore.CreateStreamStorage(ctx, streamId1, genesisMiniblock2) + if err == nil { + t.Fatal(err) + } + + // Test that we can add second stream and then GetStreams will return both + err = pgEventStore.CreateStreamStorage(ctx, streamId2, genesisMiniblock2) + if err != nil { + t.Fatal(err) + } + + streams, err := pgEventStore.GetStreams(ctx) + require.NoError(err) + require.ElementsMatch(streams, []StreamId{streamId1, streamId2}) + + // Test that we can delete stream and proper stream will be deleted + genesisMiniblock3 := []byte("genesisMiniblock3") + err = pgEventStore.CreateStreamStorage(ctx, streamId3, genesisMiniblock3) + if err != nil { + t.Fatal(err) + } + + err = pgEventStore.DeleteStream(ctx, streamId2) + if err != nil { + t.Fatal("Error of deleting stream", err) + } + + streams, err = pgEventStore.GetStreams(ctx) + require.NoError(err) + require.ElementsMatch(streams, []StreamId{streamId1, streamId3}) + + // Test that we can add event to stream and then retrieve it + addEventError := pgEventStore.WriteEvent(ctx, streamId1, 1, 0, []byte("event1")) + + if addEventError != nil { + t.Fatal(streamRetrievalError) + } + + streamFromLastSnaphot, streamRetrievalError = pgEventStore.ReadStreamFromLastSnapshot(ctx, streamId1, 0) + + if streamRetrievalError != nil { + t.Fatal(streamRetrievalError) + } + + if len(streamFromLastSnaphot.MinipoolEnvelopes) != 1 { + t.Fatal("Expected to find one miniblock, found different number") + } + + if !reflect.DeepEqual(streamFromLastSnaphot.MinipoolEnvelopes[0], []byte("event1")) { + t.Fatal("Expected to find original genesis block, found different") + } + var testEnvelopes [][]byte + testEnvelopes = append(testEnvelopes, []byte("event2")) + blockHash := common.BytesToHash([]byte("block_hash")) + err = pgEventStore.WriteBlockProposal(ctx, streamId1, blockHash, 1, []byte("block1")) + if err != nil { + t.Fatal("error creating block candidate") + } + err = pgEventStore.PromoteBlock(ctx, streamId1, 1, blockHash, false, testEnvelopes) + if err != nil { + t.Fatal("error promoting block", err) + } + + var testEnvelopes2 [][]byte + testEnvelopes2 = append(testEnvelopes2, []byte("event3")) + blockHash2 := common.BytesToHash([]byte("block_hash_2")) + err = pgEventStore.WriteBlockProposal(ctx, streamId1, blockHash2, 2, []byte("block2")) + if err != nil { + t.Fatal("error creating block proposal with snapshot", err) + } + + err = pgEventStore.PromoteBlock(ctx, streamId1, 2, blockHash2, true, testEnvelopes2) + if err != nil { + t.Fatal("error promoting block with snapshot", err) + } +} + +func TestPromoteMiniblockCandidate(t *testing.T) { + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + require := require.New(t) + + streamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + streamId2 := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + + prepareTestDataForAddEventConsistencyCheck(ctx, pgEventStore, streamId) + + candidateHash := common.BytesToHash([]byte("block_hash")) + candidateHash2 := common.BytesToHash([]byte("block_hash_2")) + candidateHash_block2 := common.BytesToHash([]byte("block_hash_block2")) + miniblock_bytes := []byte("miniblock_bytes") + + // Miniblock candidate seq number must be at least current + err := pgEventStore.WriteBlockProposal(ctx, streamId, candidateHash, 0, miniblock_bytes) + require.ErrorContains(err, "Miniblock proposal blockNumber mismatch") + require.Equal(AsRiverError(err).GetTag("ExpectedBlockNumber"), int64(1)) + require.Equal(AsRiverError(err).GetTag("ActualBlockNumber"), int64(0)) + + // Future candidates fine + err = pgEventStore.WriteBlockProposal(ctx, streamId, candidateHash_block2, 2, miniblock_bytes) + require.NoError(err) + + // Write two candidates for this block number + err = pgEventStore.WriteBlockProposal(ctx, streamId, candidateHash, 1, miniblock_bytes) + require.NoError(err) + + // Double write with the same hash should produce no errors, it's possible multiple nodes may propose the same candidate. + err = pgEventStore.WriteBlockProposal(ctx, streamId, candidateHash, 1, miniblock_bytes) + require.NoError(err) + + err = pgEventStore.WriteBlockProposal(ctx, streamId, candidateHash2, 1, miniblock_bytes) + require.NoError(err) + + // Add candidate from another stream. This candidate should be untouched by the delete when a + // candidate from the first stream is promoted. + genesisMiniblock := []byte("genesisMiniblock") + _ = pgEventStore.CreateStreamStorage(ctx, streamId2, genesisMiniblock) + err = pgEventStore.WriteBlockProposal(ctx, streamId2, candidateHash, 1, []byte("some bytes")) + require.NoError(err) + + var testEnvelopes [][]byte + testEnvelopes = append(testEnvelopes, []byte("event1")) + testEnvelopes = append(testEnvelopes, []byte("event2")) + + // Nonexistent hash promotion fails + err = pgEventStore.PromoteBlock( + ctx, + streamId, + 1, + common.BytesToHash([]byte("nonexistent_hash")), + false, + testEnvelopes, + ) + require.ErrorContains(err, "No candidate block found") + + // Stream 1 promotion succeeds. + err = pgEventStore.PromoteBlock( + ctx, + streamId, + 1, + candidateHash, + false, + testEnvelopes, + ) + require.NoError(err) + + // Stream 1 able to promote candidate block from round 2 - candidate unaffected by delete at round 1 promotion. + err = pgEventStore.PromoteBlock( + ctx, + streamId, + 2, + candidateHash_block2, + false, + testEnvelopes, + ) + require.NoError(err) + + // Stream 2 should be unaffected by stream 1 promotion, which deletes all candidates for stream 1 only. + err = pgEventStore.PromoteBlock( + ctx, + streamId2, + 1, + candidateHash, + false, + testEnvelopes, + ) + require.NoError(err) +} + +func prepareTestDataForAddEventConsistencyCheck(ctx context.Context, s *PostgresEventStore, streamId StreamId) { + genesisMiniblock := []byte("genesisMiniblock") + _ = s.CreateStreamStorage(ctx, streamId, genesisMiniblock) + _ = s.WriteEvent(ctx, streamId, 1, 0, []byte("event1")) + _ = s.WriteEvent(ctx, streamId, 1, 1, []byte("event2")) + _ = s.WriteEvent(ctx, streamId, 1, 2, []byte("event3")) +} + +// Test that if there is an event with wrong generation in minipool, we will get error +func TestAddEventConsistencyChecksImproperGeneration(t *testing.T) { + require := require.New(t) + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + + streamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + + prepareTestDataForAddEventConsistencyCheck(ctx, pgEventStore, streamId) + + // Corrupt record in minipool + _, _ = pgEventStore.pool.Exec(ctx, "UPDATE minipools SET generation = 777 WHERE slot_num = 1") + err := pgEventStore.WriteEvent(ctx, streamId, 1, 3, []byte("event4")) + + require.NotNil(err) + require.Contains(err.Error(), "Wrong event generation in minipool") + require.Equal(AsRiverError(err).GetTag("ActualGeneration"), int64(777)) + require.Equal(AsRiverError(err).GetTag("ExpectedGeneration"), int64(1)) + require.Equal(AsRiverError(err).GetTag("SlotNumber"), 1) +} + +// Test that if there is a gap in minipool records, we will get error +func TestAddEventConsistencyChecksGaps(t *testing.T) { + require := require.New(t) + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + + streamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + + prepareTestDataForAddEventConsistencyCheck(ctx, pgEventStore, streamId) + + // Corrupt record in minipool + _, _ = pgEventStore.pool.Exec(ctx, "DELETE FROM minipools WHERE slot_num = 1") + err := pgEventStore.WriteEvent(ctx, streamId, 1, 3, []byte("event4")) + + require.NotNil(err) + require.Contains(err.Error(), "Wrong slot number in minipool") + require.Equal(AsRiverError(err).GetTag("ActualSlotNumber"), 2) + require.Equal(AsRiverError(err).GetTag("ExpectedSlotNumber"), 1) +} + +// Test that if there is a wrong number minipool records, we will get error +func TestAddEventConsistencyChecksEventsNumberMismatch(t *testing.T) { + require := require.New(t) + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + + streamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + + prepareTestDataForAddEventConsistencyCheck(ctx, pgEventStore, streamId) + + // Corrupt record in minipool + _, _ = pgEventStore.pool.Exec(ctx, "DELETE FROM minipools WHERE slot_num = 2") + err := pgEventStore.WriteEvent(ctx, streamId, 1, 3, []byte("event4")) + + require.NotNil(err) + require.Contains(err.Error(), "Wrong number of records in minipool") + require.Equal(AsRiverError(err).GetTag("ActualRecordsNumber"), 2) + require.Equal(AsRiverError(err).GetTag("ExpectedRecordsNumber"), 3) +} + +func TestNoStream(t *testing.T) { + require := require.New(t) + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + + res, err := pgEventStore.ReadStreamFromLastSnapshot(ctx, testutils.FakeStreamId(STREAM_CHANNEL_BIN), 0) + require.Nil(res) + require.Error(err) + require.Equal(Err_NOT_FOUND, AsRiverError(err).Code, err) +} + +func TestCreateBlockProposalConsistencyChecksProperNewMinipoolGeneration(t *testing.T) { + require := require.New(t) + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + + streamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + genesisMiniblock := []byte("genesisMiniblock") + _ = pgEventStore.CreateStreamStorage(ctx, streamId, genesisMiniblock) + + var testEnvelopes1 [][]byte + testEnvelopes1 = append(testEnvelopes1, []byte("event1")) + var testEnvelopes2 [][]byte + testEnvelopes2 = append(testEnvelopes2, []byte("event2")) + + blockHash1 := common.BytesToHash([]byte("hash1")) + blockHash2 := common.BytesToHash([]byte("hash2")) + blockHash3 := common.BytesToHash([]byte("hash3")) + _ = pgEventStore.WriteBlockProposal(ctx, streamId, blockHash1, 1, []byte("block1")) + _ = pgEventStore.PromoteBlock(ctx, streamId, 1, blockHash1, true, testEnvelopes1) + + _ = pgEventStore.WriteBlockProposal(ctx, streamId, blockHash2, 2, []byte("block2")) + _ = pgEventStore.PromoteBlock(ctx, streamId, 2, blockHash2, false, testEnvelopes2) + + _, _ = pgEventStore.pool.Exec(ctx, "DELETE FROM miniblocks WHERE seq_num = 2") + + // Future candidate writes are fine, these may come from other nodes. + err := pgEventStore.WriteBlockProposal(ctx, streamId, blockHash3, 3, []byte("block3")) + require.Nil(err) +} + +func TestPromoteBlockConsistencyChecksProperNewMinipoolGeneration(t *testing.T) { + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + + require := require.New(t) + + streamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + genesisMiniblock := []byte("genesisMiniblock") + _ = pgEventStore.CreateStreamStorage(ctx, streamId, genesisMiniblock) + + var testEnvelopes1 [][]byte + testEnvelopes1 = append(testEnvelopes1, []byte("event1")) + var testEnvelopes2 [][]byte + testEnvelopes2 = append(testEnvelopes2, []byte("event2")) + var testEnvelopes3 [][]byte + testEnvelopes3 = append(testEnvelopes3, []byte("event3")) + + blockHash1 := common.BytesToHash([]byte("hash1")) + blockHash2 := common.BytesToHash([]byte("hash2")) + blockHash3 := common.BytesToHash([]byte("hash3")) + _ = pgEventStore.WriteBlockProposal(ctx, streamId, blockHash1, 1, []byte("block1")) + _ = pgEventStore.PromoteBlock(ctx, streamId, 1, blockHash1, true, testEnvelopes1) + + _ = pgEventStore.WriteBlockProposal(ctx, streamId, blockHash2, 2, []byte("block2")) + _ = pgEventStore.PromoteBlock(ctx, streamId, 2, blockHash2, false, testEnvelopes2) + + _ = pgEventStore.WriteBlockProposal(ctx, streamId, blockHash3, 3, []byte("block3")) + + _, _ = pgEventStore.pool.Exec(ctx, "DELETE FROM miniblocks WHERE seq_num = 2") + err := pgEventStore.PromoteBlock(ctx, streamId, 3, blockHash3, false, testEnvelopes3) + + // TODO(crystal): tune these + require.NotNil(err) + require.Contains(err.Error(), "Minipool generation mismatch") + require.Equal(AsRiverError(err).GetTag("ActualNewMinipoolGeneration"), int64(2)) + require.Equal(AsRiverError(err).GetTag("ExpectedNewMinipoolGeneration"), int64(3)) +} + +func TestCreateBlockProposalNoSuchStreamError(t *testing.T) { + require := require.New(t) + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + + streamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + genesisMiniblock := []byte("genesisMiniblock") + _ = pgEventStore.CreateStreamStorage(ctx, streamId, genesisMiniblock) + + _, _ = pgEventStore.pool.Exec(ctx, "DELETE FROM miniblocks") + + err := pgEventStore.WriteBlockProposal(ctx, streamId, common.BytesToHash([]byte("block_hash")), 1, []byte("block1")) + + require.NotNil(err) + require.Contains(err.Error(), "No blocks for the stream found in block storage") + require.Equal(AsRiverError(err).GetTag("streamId"), streamId) +} + +func TestPromoteBlockNoSuchStreamError(t *testing.T) { + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + + require := require.New(t) + + streamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + genesisMiniblock := []byte("genesisMiniblock") + _ = pgEventStore.CreateStreamStorage(ctx, streamId, genesisMiniblock) + + var testEnvelopes1 [][]byte + testEnvelopes1 = append(testEnvelopes1, []byte("event1")) + block_hash := common.BytesToHash([]byte("block_hash")) + _ = pgEventStore.WriteBlockProposal(ctx, streamId, block_hash, 1, []byte("block1")) + + _, _ = pgEventStore.pool.Exec(ctx, "DELETE FROM miniblocks") + + err := pgEventStore.PromoteBlock(ctx, streamId, 1, block_hash, true, testEnvelopes1) + + require.NotNil(err) + require.Contains(err.Error(), "No blocks for the stream found in block storage") + require.Equal(AsRiverError(err).GetTag("streamId"), streamId) +} + +func TestExitIfSecondStorageCreated(t *testing.T) { + require := require.New(t) + + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + + // Give listener thread some time to start + time.Sleep(500 * time.Millisecond) + + genesisMiniblock := []byte("genesisMiniblock") + streamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + err := pgEventStore.CreateStreamStorage(ctx, streamId, genesisMiniblock) + require.NoError(err) + + pool, err := CreateAndValidatePgxPool( + ctx, + testParams.config, + testParams.schema, + ) + require.NoError(err) + + instanceId2 := GenShortNanoid() + exitSignal2 := make(chan error, 1) + pgEventStore2, err := newPostgresEventStore( + ctx, + pool, + instanceId2, + exitSignal2, + migrationsDir, + ) + require.NoError(err) + defer pgEventStore2.Close(ctx) + + // Give listener thread for the first store some time to detect the notification and emit an error + time.Sleep(500 * time.Millisecond) + + exitErr := <-testParams.exitSignal + require.Error(exitErr) + require.Equal(Err_RESOURCE_EXHAUSTED, AsRiverError(exitErr).Code) + + result, err := pgEventStore2.ReadStreamFromLastSnapshot(ctx, streamId, 0) + require.NoError(err) + require.NotNil(result) +} + +// Test that if there is a gap in miniblocks sequence, we will get error +func TestGetStreamFromLastSnapshotConsistencyChecksMissingBlockFailure(t *testing.T) { + require := require.New(t) + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + + streamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + genesisMiniblock := []byte("genesisMiniblock") + _ = pgEventStore.CreateStreamStorage(ctx, streamId, genesisMiniblock) + var testEnvelopes1 [][]byte + testEnvelopes1 = append(testEnvelopes1, []byte("event1")) + var testEnvelopes2 [][]byte + testEnvelopes2 = append(testEnvelopes2, []byte("event2")) + var testEnvelopes3 [][]byte + testEnvelopes3 = append(testEnvelopes3, []byte("event3")) + + _ = pgEventStore.WriteBlockProposal(ctx, streamId, common.BytesToHash([]byte("blockhash1")), 1, []byte("block1")) + _ = pgEventStore.PromoteBlock(ctx, streamId, 1, common.BytesToHash([]byte("blockhash1")), true, testEnvelopes1) + + _ = pgEventStore.WriteBlockProposal(ctx, streamId, common.BytesToHash([]byte("blockhash2")), 2, []byte("block2")) + _ = pgEventStore.PromoteBlock(ctx, streamId, 2, common.BytesToHash([]byte("blockhash2")), false, testEnvelopes2) + + _ = pgEventStore.WriteBlockProposal(ctx, streamId, common.BytesToHash([]byte("blockhash3")), 3, []byte("block3")) + _ = pgEventStore.PromoteBlock(ctx, streamId, 3, common.BytesToHash([]byte("blockhash3")), false, testEnvelopes3) + + _, _ = pgEventStore.pool.Exec(ctx, "DELETE FROM miniblocks WHERE seq_num = 2") + + _, err := pgEventStore.ReadStreamFromLastSnapshot(ctx, streamId, 0) + + require.NotNil(err) + require.Contains(err.Error(), "Miniblocks consistency violation - wrong block sequence number") + require.Equal(AsRiverError(err).GetTag("ActualSeqNum"), int64(3)) + require.Equal(AsRiverError(err).GetTag("ExpectedSeqNum"), int64(2)) +} + +func TestGetStreamFromLastSnapshotConsistencyCheckWrongEnvelopeGeneration(t *testing.T) { + require := require.New(t) + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + + streamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + genesisMiniblock := []byte("genesisMiniblock") + _ = pgEventStore.CreateStreamStorage(ctx, streamId, genesisMiniblock) + + var testEnvelopes1 [][]byte + testEnvelopes1 = append(testEnvelopes1, []byte("event1")) + + var testEnvelopes2 [][]byte + testEnvelopes2 = append(testEnvelopes2, []byte("event2")) + testEnvelopes2 = append(testEnvelopes2, []byte("event3")) + + _ = pgEventStore.WriteBlockProposal(ctx, streamId, common.BytesToHash([]byte("blockhash1")), 1, []byte("block1")) + _ = pgEventStore.PromoteBlock(ctx, streamId, 1, common.BytesToHash([]byte("blockhash1")), true, testEnvelopes1) + _ = pgEventStore.WriteBlockProposal(ctx, streamId, common.BytesToHash([]byte("blockhash2")), 2, []byte("block2")) + _ = pgEventStore.PromoteBlock(ctx, streamId, 2, common.BytesToHash([]byte("blockhash2")), false, testEnvelopes2) + + _, _ = pgEventStore.pool.Exec(ctx, "UPDATE minipools SET generation = 777 WHERE slot_num = 1") + + _, err := pgEventStore.ReadStreamFromLastSnapshot(ctx, streamId, 0) + + require.NotNil(err) + require.Contains(err.Error(), "Minipool consistency violation - wrong event generation") + require.Equal(AsRiverError(err).GetTag("ActualGeneration"), int64(777)) + require.Equal(AsRiverError(err).GetTag("ExpectedGeneration"), int64(1)) +} + +func TestGetStreamFromLastSnapshotConsistencyCheckNoZeroIndexEnvelope(t *testing.T) { + require := require.New(t) + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + + streamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + genesisMiniblock := []byte("genesisMiniblock") + _ = pgEventStore.CreateStreamStorage(ctx, streamId, genesisMiniblock) + + var testEnvelopes1 [][]byte + testEnvelopes1 = append(testEnvelopes1, []byte("event1")) + + var testEnvelopes2 [][]byte + testEnvelopes2 = append(testEnvelopes2, []byte("event2")) + testEnvelopes2 = append(testEnvelopes2, []byte("event3")) + testEnvelopes2 = append(testEnvelopes2, []byte("event4")) + + _ = pgEventStore.WriteBlockProposal(ctx, streamId, common.BytesToHash([]byte("blockhash1")), 1, []byte("block1")) + _ = pgEventStore.PromoteBlock(ctx, streamId, 1, common.BytesToHash([]byte("blockhash1")), true, testEnvelopes1) + _ = pgEventStore.WriteBlockProposal(ctx, streamId, common.BytesToHash([]byte("blockhash2")), 2, []byte("block2")) + _ = pgEventStore.PromoteBlock(ctx, streamId, 2, common.BytesToHash([]byte("blockhash2")), false, testEnvelopes2) + + _, _ = pgEventStore.pool.Exec(ctx, "DELETE FROM minipools WHERE slot_num = 0") + + _, err := pgEventStore.ReadStreamFromLastSnapshot(ctx, streamId, 0) + + require.NotNil(err) + require.Contains(err.Error(), "Minipool consistency violation - slotNums are not sequential") + require.Equal(AsRiverError(err).GetTag("ActualSlotNumber"), int64(1)) + require.Equal(AsRiverError(err).GetTag("ExpectedSlotNumber"), int64(0)) +} + +func TestGetStreamFromLastSnapshotConsistencyCheckGapInEnvelopesIndexes(t *testing.T) { + require := require.New(t) + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + + streamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + genesisMiniblock := []byte("genesisMiniblock") + _ = pgEventStore.CreateStreamStorage(ctx, streamId, genesisMiniblock) + + var testEnvelopes1 [][]byte + testEnvelopes1 = append(testEnvelopes1, []byte("event1")) + + var testEnvelopes2 [][]byte + testEnvelopes2 = append(testEnvelopes2, []byte("event2")) + testEnvelopes2 = append(testEnvelopes2, []byte("event3")) + testEnvelopes2 = append(testEnvelopes2, []byte("event4")) + + _ = pgEventStore.WriteBlockProposal(ctx, streamId, common.BytesToHash([]byte("blockhash1")), 1, []byte("block1")) + _ = pgEventStore.PromoteBlock(ctx, streamId, 1, common.BytesToHash([]byte("blockhash1")), true, testEnvelopes1) + _ = pgEventStore.WriteBlockProposal(ctx, streamId, common.BytesToHash([]byte("blockhash2")), 2, []byte("block2")) + _ = pgEventStore.PromoteBlock(ctx, streamId, 2, common.BytesToHash([]byte("blockhash2")), false, testEnvelopes2) + + _, _ = pgEventStore.pool.Exec(ctx, "DELETE FROM minipools WHERE slot_num = 1") + + _, err := pgEventStore.ReadStreamFromLastSnapshot(ctx, streamId, 0) + + require.NotNil(err) + require.Contains(err.Error(), "Minipool consistency violation - slotNums are not sequential") + require.Equal(AsRiverError(err).GetTag("ActualSlotNumber"), int64(2)) + require.Equal(AsRiverError(err).GetTag("ExpectedSlotNumber"), int64(1)) +} + +func TestGetMiniblocksConsistencyChecks(t *testing.T) { + require := require.New(t) + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + + streamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + genesisMiniblock := []byte("genesisMiniblock") + _ = pgEventStore.CreateStreamStorage(ctx, streamId, genesisMiniblock) + + var testEnvelopes1 [][]byte + testEnvelopes1 = append(testEnvelopes1, []byte("event1")) + var testEnvelopes2 [][]byte + testEnvelopes2 = append(testEnvelopes2, []byte("event2")) + var testEnvelopes3 [][]byte + testEnvelopes3 = append(testEnvelopes3, []byte("event3")) + + _ = pgEventStore.WriteBlockProposal(ctx, streamId, common.BytesToHash([]byte("blockhash1")), 1, []byte("block1")) + _ = pgEventStore.PromoteBlock(ctx, streamId, 1, common.BytesToHash([]byte("blockhash1")), true, testEnvelopes1) + _ = pgEventStore.WriteBlockProposal(ctx, streamId, common.BytesToHash([]byte("blockhash2")), 2, []byte("block2")) + _ = pgEventStore.PromoteBlock(ctx, streamId, 2, common.BytesToHash([]byte("blockhash2")), false, testEnvelopes2) + _ = pgEventStore.WriteBlockProposal(ctx, streamId, common.BytesToHash([]byte("blockhash3")), 3, []byte("block3")) + _ = pgEventStore.PromoteBlock(ctx, streamId, 3, common.BytesToHash([]byte("blockhash3")), false, testEnvelopes3) + + _, _ = pgEventStore.pool.Exec(ctx, "DELETE FROM miniblocks WHERE seq_num = 2") + + _, err := pgEventStore.ReadMiniblocks(ctx, streamId, 1, 4) + + require.NotNil(err) + require.Contains(err.Error(), "Miniblocks consistency violation") + require.Equal(AsRiverError(err).GetTag("ActualBlockNumber"), 3) + require.Equal(AsRiverError(err).GetTag("ExpectedBlockNumber"), 2) +} + +func TestAlreadyExists(t *testing.T) { + require := require.New(t) + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + + streamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + genesisMiniblock := []byte("genesisMiniblock") + err := pgEventStore.CreateStreamStorage(ctx, streamId, genesisMiniblock) + require.NoError(err) + + err = pgEventStore.CreateStreamStorage(ctx, streamId, genesisMiniblock) + require.Equal(Err_ALREADY_EXISTS, AsRiverError(err).Code) +} + +func TestNotFound(t *testing.T) { + require := require.New(t) + ctx, pgEventStore, testParams := setupTest() + defer testParams.closer() + + streamId := testutils.FakeStreamId(STREAM_CHANNEL_BIN) + result, err := pgEventStore.ReadStreamFromLastSnapshot(ctx, streamId, 0) + require.Nil(result) + require.Equal(Err_NOT_FOUND, AsRiverError(err).Code) +} diff --git a/core/node/storage/storage.go b/core/node/storage/storage.go new file mode 100644 index 000000000..2df5b2ece --- /dev/null +++ b/core/node/storage/storage.go @@ -0,0 +1,93 @@ +package storage + +import ( + "context" + + "github.com/ethereum/go-ethereum/common" + . "github.com/river-build/river/core/node/shared" +) + +const ( + StreamStorageTypePostgres = "postgres" +) + +type ReadStreamFromLastSnapshotResult struct { + StartMiniblockNumber int64 + Miniblocks [][]byte + MinipoolEnvelopes [][]byte +} + +type StreamStorage interface { + // CreateStreamStorage creates a new stream with the given genesis miniblock at index 0. + // Last snapshot minblock index is set to 0. + // Minipool is set to generation number 1 (i.e. number of miniblock that is going to be produced next) and is empty. + CreateStreamStorage(ctx context.Context, streamId StreamId, genesisMiniblock []byte) error + + // Returns all stream blocks starting from last snapshot miniblock index and all envelopes in the given minipool. + ReadStreamFromLastSnapshot( + ctx context.Context, + streamId StreamId, + precedingBlockCount int, + ) (*ReadStreamFromLastSnapshotResult, error) + + // Returns miniblocks with miniblockNum or "generation" from fromInclusive, to toExlusive. + ReadMiniblocks(ctx context.Context, streamId StreamId, fromInclusive int64, toExclusive int64) ([][]byte, error) + + // Adds event to the given minipool. + // Current generation of minipool should match minipoolGeneration, + // and there should be exactly minipoolSlot events in the minipool. + WriteEvent( + ctx context.Context, + streamId StreamId, + minipoolGeneration int64, + minipoolSlot int, + envelope []byte, + ) error + + // WriteBlockProposal adds a proposal candidate for future + WriteBlockProposal( + ctx context.Context, + streamId StreamId, + blockHash common.Hash, + blockNumber int64, + miniblock []byte, + ) error + + // Promote block candidate to miniblock + // Deletes current minipool at minipoolGeneration, + // creates new minipool at minipoolGeneration + 1, + // stores miniblock proposal with given hash at minipoolGeneration index and wipes all candidates for stream. + // If snapshotMiniblock is true, stores minipoolGeneration as last snapshot miniblock index, + // stores envelopes in the new minipool in slots starting with 0. + PromoteBlock( + ctx context.Context, + streamId StreamId, + minipoolGeneration int64, + candidateBlockHash common.Hash, + snapshotMiniblock bool, + envelopes [][]byte, + ) error + + // CreateStreamArchiveStorage creates a new archive storage for the given stream. + // Unlike regular CreateStreamStorage, only entry in es table and partition table for miniblocks are created. + CreateStreamArchiveStorage( + ctx context.Context, + streamId StreamId, + ) error + + // GetMaxArchivedMiniblockNumber returns the maximum miniblock number that has been archived for the given stream. + // If stream record is created, but no miniblocks are archived, returns -1. + GetMaxArchivedMiniblockNumber(ctx context.Context, streamId StreamId) (int64, error) + + // WriteArchiveMiniblocks writes miniblocks to the archive storage. + // Miniblocks are written starting from startMiniblockNum. + // It checks that startMiniblockNum - 1 miniblock exists in storage. + WriteArchiveMiniblocks( + ctx context.Context, + streamId StreamId, + startMiniblockNum int64, + miniblocks [][]byte, + ) error + + Close(ctx context.Context) +} diff --git a/core/node/storage/test_pg_store.go b/core/node/storage/test_pg_store.go new file mode 100644 index 000000000..9a16fe1e0 --- /dev/null +++ b/core/node/storage/test_pg_store.go @@ -0,0 +1,46 @@ +package storage + +import ( + "context" + + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/testutils/dbtestutils" +) + +type TestPgStore struct { + Storage *PostgresEventStore + ExitChannel chan error + Close func() +} + +func NewTestPgStore(ctx context.Context) *TestPgStore { + dbCfg, schema, schemaDeleter, err := dbtestutils.StartDB(ctx) + if err != nil { + panic(err) + } + + pool, err := CreateAndValidatePgxPool(ctx, dbCfg, schema) + if err != nil { + panic(err) + } + + exitChan := make(chan error, 1) + streamStorage, err := NewPostgresEventStore( + ctx, + pool, + GenShortNanoid(), + exitChan, + ) + if err != nil { + panic(err) + } + + return &TestPgStore{ + Storage: streamStorage, + ExitChannel: exitChan, + Close: func() { + streamStorage.Close(ctx) + schemaDeleter() + }, + } +} diff --git a/core/node/test.sh b/core/node/test.sh new file mode 100755 index 000000000..797cdc7c1 --- /dev/null +++ b/core/node/test.sh @@ -0,0 +1,4 @@ +#!/bin/bash -ue +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +go test --race ./... diff --git a/core/node/testutils/dbtestutils/db.go b/core/node/testutils/dbtestutils/db.go new file mode 100644 index 000000000..23a40c2bb --- /dev/null +++ b/core/node/testutils/dbtestutils/db.go @@ -0,0 +1,93 @@ +package dbtestutils + +import ( + "bytes" + "context" + "crypto/rand" + "encoding/hex" + "fmt" + "os" + "os/exec" + "time" + + "github.com/jackc/pgx/v5/pgxpool" + "github.com/river-build/river/core/node/config" +) + +func GetTestDbUrl() string { + dbUrl := os.Getenv("TEST_DATABASE_URL") + if dbUrl != "" { + return dbUrl + } + return "postgres://postgres:postgres@localhost:5433/river?sslmode=disable&pool_max_conns=1000" +} + +func DeleteTestSchema(ctx context.Context, dbUrl string, schemaName string) error { + if os.Getenv("RIVER_TEST_DUMP_DB") != "" { + cmd := exec.Command( + "pg_dump", + "-Fp", + "-d", + "postgres://postgres:postgres@localhost:5433/river?sslmode=disable", + "-n", + schemaName, + ) + var out bytes.Buffer + cmd.Stdout = &out + err := cmd.Run() + if err != nil { + fmt.Printf("Failed to execute pg_dump: %v\n", err) + } else { + fmt.Println(out.String()) + } + } + + conn, err := pgxpool.New(ctx, dbUrl) + if err != nil { + fmt.Printf("Failed to connect to database: %v", err) + return err + } + defer conn.Close() + _, err = conn.Exec(ctx, fmt.Sprintf("DROP SCHEMA IF EXISTS \"%s\" CASCADE", schemaName)) + if err != nil { + fmt.Printf("Failed to drop schema: %v", err) + return err + } + return nil +} + +func StartDB(ctx context.Context) (*config.DatabaseConfig, string, func(), error) { + dbSchemaName := os.Getenv("TEST_DATABASE_SCHEMA_NAME") + if dbSchemaName == "" { + b := make([]byte, 16) + _, err := rand.Read(b) + if err != nil { + return &config.DatabaseConfig{}, "", func() {}, err + } + // convert to hex string + dbSchemaName = "tst" + hex.EncodeToString(b) + } + dbUrl := os.Getenv("TEST_DATABASE_URL") + if dbUrl != "" { + return &config.DatabaseConfig{ + Url: dbUrl, + StartupDelay: 2 * time.Millisecond, + }, dbSchemaName, func() {}, nil + } else { + return &config.DatabaseConfig{ + Host: "localhost", + Port: 5433, + User: "postgres", + Password: "postgres", + Database: "river", + Extra: "?sslmode=disable&pool_max_conns=1000", + StreamingConnectionsRatio: 0.1, + StartupDelay: 2 * time.Millisecond, + }, + dbSchemaName, + func() { + _ = DeleteTestSchema(ctx, dbUrl, dbSchemaName) + }, + nil + } +} diff --git a/core/node/testutils/ids.go b/core/node/testutils/ids.go new file mode 100644 index 000000000..fa007daf4 --- /dev/null +++ b/core/node/testutils/ids.go @@ -0,0 +1,56 @@ +package testutils + +import ( + "crypto/rand" + "strings" + + "github.com/river-build/river/core/node/shared" +) + +func FakeStreamId(prefix byte) shared.StreamId { + var b [32]byte + b[0] = prefix + n, err := shared.StreamIdContentLengthForType(prefix) + if err != nil { + panic(err) + } + _, err = rand.Read(b[1:n]) + if err != nil { + panic(err) + } + id, err := shared.StreamIdFromHash(b) + if err != nil { + panic(err) + } + return id +} + +func MakeChannelId(spaceId shared.StreamId) shared.StreamId { + id, err := shared.MakeChannelId(spaceId) + if err != nil { + panic(err) + } + return id +} + +func StreamIdFromString(s string) shared.StreamId { + if len(s) < shared.STREAM_ID_STRING_LENGTH { + s += strings.Repeat("0", shared.STREAM_ID_STRING_LENGTH-len(s)) + } + streamId, err := shared.StreamIdFromString(s) + if err != nil { + panic(err) + } + return streamId +} + +func StreamIdFromBytes(b []byte) shared.StreamId { + if len(b) < shared.STREAM_ID_BYTES_LENGTH { + b = append(b, make([]byte, shared.STREAM_ID_BYTES_LENGTH-len(b))...) + } + streamId, err := shared.StreamIdFromBytes(b) + if err != nil { + panic(err) + } + return streamId +} diff --git a/core/node/testutils/logutils.go b/core/node/testutils/logutils.go new file mode 100644 index 000000000..14d84564a --- /dev/null +++ b/core/node/testutils/logutils.go @@ -0,0 +1,30 @@ +package testutils + +import ( + "bytes" + "log/slog" + "regexp" + + "github.com/river-build/river/core/node/dlog" +) + +// RemoveJsonTimestamp removes the "time" field from a JSON log line generated by dlog. +func RemoveJsonTimestamp(logOutput string) string { + // Remove "time" field from output + re := regexp.MustCompile(`\"time\":\"[^\"]*\",`) + return string(re.ReplaceAllString(logOutput, `"time":"[TIMESTAMP]",`)) +} + +func DlogJsonLogger() (*slog.Logger, *bytes.Buffer) { + buffer := &bytes.Buffer{} + return slog.New(dlog.NewPrettyJSONHandler(buffer, &dlog.PrettyHandlerOptions{})), buffer +} + +func DlogTextLogger() (*slog.Logger, *bytes.Buffer) { + buffer := &bytes.Buffer{} + handler := dlog.NewPrettyTextHandler(buffer, &dlog.PrettyHandlerOptions{ + Colors: dlog.ColorMap_Disabled, + PrintLongTime: false, + }) + return slog.New(handler), buffer +} diff --git a/core/node/testutils/mocks/mock_node_registry.go b/core/node/testutils/mocks/mock_node_registry.go new file mode 100644 index 000000000..d043a0001 --- /dev/null +++ b/core/node/testutils/mocks/mock_node_registry.go @@ -0,0 +1,161 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + common "github.com/ethereum/go-ethereum/common" + mock "github.com/stretchr/testify/mock" + + nodes "github.com/river-build/river/core/node/nodes" + + protocolconnect "github.com/river-build/river/core/node/protocol/protocolconnect" +) + +// MockNodeRegistry is an autogenerated mock type for the NodeRegistry type +type MockNodeRegistry struct { + mock.Mock +} + +// GetAllNodes provides a mock function with given fields: +func (_m *MockNodeRegistry) GetAllNodes() []*nodes.NodeRecord { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetAllNodes") + } + + var r0 []*nodes.NodeRecord + if rf, ok := ret.Get(0).(func() []*nodes.NodeRecord); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*nodes.NodeRecord) + } + } + + return r0 +} + +// GetNode provides a mock function with given fields: address +func (_m *MockNodeRegistry) GetNode(address common.Address) (*nodes.NodeRecord, error) { + ret := _m.Called(address) + + if len(ret) == 0 { + panic("no return value specified for GetNode") + } + + var r0 *nodes.NodeRecord + var r1 error + if rf, ok := ret.Get(0).(func(common.Address) (*nodes.NodeRecord, error)); ok { + return rf(address) + } + if rf, ok := ret.Get(0).(func(common.Address) *nodes.NodeRecord); ok { + r0 = rf(address) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*nodes.NodeRecord) + } + } + + if rf, ok := ret.Get(1).(func(common.Address) error); ok { + r1 = rf(address) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetNodeToNodeClientForAddress provides a mock function with given fields: address +func (_m *MockNodeRegistry) GetNodeToNodeClientForAddress(address common.Address) (protocolconnect.NodeToNodeClient, error) { + ret := _m.Called(address) + + if len(ret) == 0 { + panic("no return value specified for GetNodeToNodeClientForAddress") + } + + var r0 protocolconnect.NodeToNodeClient + var r1 error + if rf, ok := ret.Get(0).(func(common.Address) (protocolconnect.NodeToNodeClient, error)); ok { + return rf(address) + } + if rf, ok := ret.Get(0).(func(common.Address) protocolconnect.NodeToNodeClient); ok { + r0 = rf(address) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(protocolconnect.NodeToNodeClient) + } + } + + if rf, ok := ret.Get(1).(func(common.Address) error); ok { + r1 = rf(address) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetStreamServiceClientForAddress provides a mock function with given fields: address +func (_m *MockNodeRegistry) GetStreamServiceClientForAddress(address common.Address) (protocolconnect.StreamServiceClient, error) { + ret := _m.Called(address) + + if len(ret) == 0 { + panic("no return value specified for GetStreamServiceClientForAddress") + } + + var r0 protocolconnect.StreamServiceClient + var r1 error + if rf, ok := ret.Get(0).(func(common.Address) (protocolconnect.StreamServiceClient, error)); ok { + return rf(address) + } + if rf, ok := ret.Get(0).(func(common.Address) protocolconnect.StreamServiceClient); ok { + r0 = rf(address) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(protocolconnect.StreamServiceClient) + } + } + + if rf, ok := ret.Get(1).(func(common.Address) error); ok { + r1 = rf(address) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetValidNodeAddresses provides a mock function with given fields: +func (_m *MockNodeRegistry) GetValidNodeAddresses() []common.Address { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetValidNodeAddresses") + } + + var r0 []common.Address + if rf, ok := ret.Get(0).(func() []common.Address); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]common.Address) + } + } + + return r0 +} + +// NewMockNodeRegistry creates a new instance of MockNodeRegistry. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockNodeRegistry(t interface { + mock.TestingT + Cleanup(func()) +}) *MockNodeRegistry { + mock := &MockNodeRegistry{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/core/node/testutils/mocks/mock_stream_registry.go b/core/node/testutils/mocks/mock_stream_registry.go new file mode 100644 index 000000000..6d289ec7e --- /dev/null +++ b/core/node/testutils/mocks/mock_stream_registry.go @@ -0,0 +1,94 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + context "context" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + nodes "github.com/river-build/river/core/node/nodes" + + shared "github.com/river-build/river/core/node/shared" +) + +// MockStreamRegistry is an autogenerated mock type for the StreamRegistry type +type MockStreamRegistry struct { + mock.Mock +} + +// AllocateStream provides a mock function with given fields: ctx, streamId, genesisMiniblockHash, genesisMiniblock +func (_m *MockStreamRegistry) AllocateStream(ctx context.Context, streamId shared.StreamId, genesisMiniblockHash common.Hash, genesisMiniblock []byte) ([]common.Address, error) { + ret := _m.Called(ctx, streamId, genesisMiniblockHash, genesisMiniblock) + + if len(ret) == 0 { + panic("no return value specified for AllocateStream") + } + + var r0 []common.Address + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, shared.StreamId, common.Hash, []byte) ([]common.Address, error)); ok { + return rf(ctx, streamId, genesisMiniblockHash, genesisMiniblock) + } + if rf, ok := ret.Get(0).(func(context.Context, shared.StreamId, common.Hash, []byte) []common.Address); ok { + r0 = rf(ctx, streamId, genesisMiniblockHash, genesisMiniblock) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]common.Address) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, shared.StreamId, common.Hash, []byte) error); ok { + r1 = rf(ctx, streamId, genesisMiniblockHash, genesisMiniblock) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetStreamInfo provides a mock function with given fields: ctx, streamId +func (_m *MockStreamRegistry) GetStreamInfo(ctx context.Context, streamId shared.StreamId) (nodes.StreamNodes, error) { + ret := _m.Called(ctx, streamId) + + if len(ret) == 0 { + panic("no return value specified for GetStreamInfo") + } + + var r0 nodes.StreamNodes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, shared.StreamId) (nodes.StreamNodes, error)); ok { + return rf(ctx, streamId) + } + if rf, ok := ret.Get(0).(func(context.Context, shared.StreamId) nodes.StreamNodes); ok { + r0 = rf(ctx, streamId) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(nodes.StreamNodes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, shared.StreamId) error); ok { + r1 = rf(ctx, streamId) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewMockStreamRegistry creates a new instance of MockStreamRegistry. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockStreamRegistry(t interface { + mock.TestingT + Cleanup(func()) +}) *MockStreamRegistry { + mock := &MockStreamRegistry{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/core/node/testutils/mocks/mock_stream_service_client.go b/core/node/testutils/mocks/mock_stream_service_client.go new file mode 100644 index 000000000..44ea1a009 --- /dev/null +++ b/core/node/testutils/mocks/mock_stream_service_client.go @@ -0,0 +1,392 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + context "context" + + connect "connectrpc.com/connect" + + mock "github.com/stretchr/testify/mock" + + protocol "github.com/river-build/river/core/node/protocol" +) + +// MockStreamServiceClient is an autogenerated mock type for the StreamServiceClient type +type MockStreamServiceClient struct { + mock.Mock +} + +// AddEvent provides a mock function with given fields: _a0, _a1 +func (_m *MockStreamServiceClient) AddEvent(_a0 context.Context, _a1 *connect.Request[protocol.AddEventRequest]) (*connect.Response[protocol.AddEventResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AddEvent") + } + + var r0 *connect.Response[protocol.AddEventResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.AddEventRequest]) (*connect.Response[protocol.AddEventResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.AddEventRequest]) *connect.Response[protocol.AddEventResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[protocol.AddEventResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[protocol.AddEventRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AddStreamToSync provides a mock function with given fields: _a0, _a1 +func (_m *MockStreamServiceClient) AddStreamToSync(_a0 context.Context, _a1 *connect.Request[protocol.AddStreamToSyncRequest]) (*connect.Response[protocol.AddStreamToSyncResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AddStreamToSync") + } + + var r0 *connect.Response[protocol.AddStreamToSyncResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.AddStreamToSyncRequest]) (*connect.Response[protocol.AddStreamToSyncResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.AddStreamToSyncRequest]) *connect.Response[protocol.AddStreamToSyncResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[protocol.AddStreamToSyncResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[protocol.AddStreamToSyncRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CancelSync provides a mock function with given fields: _a0, _a1 +func (_m *MockStreamServiceClient) CancelSync(_a0 context.Context, _a1 *connect.Request[protocol.CancelSyncRequest]) (*connect.Response[protocol.CancelSyncResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for CancelSync") + } + + var r0 *connect.Response[protocol.CancelSyncResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.CancelSyncRequest]) (*connect.Response[protocol.CancelSyncResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.CancelSyncRequest]) *connect.Response[protocol.CancelSyncResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[protocol.CancelSyncResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[protocol.CancelSyncRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CreateStream provides a mock function with given fields: _a0, _a1 +func (_m *MockStreamServiceClient) CreateStream(_a0 context.Context, _a1 *connect.Request[protocol.CreateStreamRequest]) (*connect.Response[protocol.CreateStreamResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for CreateStream") + } + + var r0 *connect.Response[protocol.CreateStreamResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.CreateStreamRequest]) (*connect.Response[protocol.CreateStreamResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.CreateStreamRequest]) *connect.Response[protocol.CreateStreamResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[protocol.CreateStreamResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[protocol.CreateStreamRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastMiniblockHash provides a mock function with given fields: _a0, _a1 +func (_m *MockStreamServiceClient) GetLastMiniblockHash(_a0 context.Context, _a1 *connect.Request[protocol.GetLastMiniblockHashRequest]) (*connect.Response[protocol.GetLastMiniblockHashResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for GetLastMiniblockHash") + } + + var r0 *connect.Response[protocol.GetLastMiniblockHashResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.GetLastMiniblockHashRequest]) (*connect.Response[protocol.GetLastMiniblockHashResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.GetLastMiniblockHashRequest]) *connect.Response[protocol.GetLastMiniblockHashResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[protocol.GetLastMiniblockHashResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[protocol.GetLastMiniblockHashRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetMiniblocks provides a mock function with given fields: _a0, _a1 +func (_m *MockStreamServiceClient) GetMiniblocks(_a0 context.Context, _a1 *connect.Request[protocol.GetMiniblocksRequest]) (*connect.Response[protocol.GetMiniblocksResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for GetMiniblocks") + } + + var r0 *connect.Response[protocol.GetMiniblocksResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.GetMiniblocksRequest]) (*connect.Response[protocol.GetMiniblocksResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.GetMiniblocksRequest]) *connect.Response[protocol.GetMiniblocksResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[protocol.GetMiniblocksResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[protocol.GetMiniblocksRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetStream provides a mock function with given fields: _a0, _a1 +func (_m *MockStreamServiceClient) GetStream(_a0 context.Context, _a1 *connect.Request[protocol.GetStreamRequest]) (*connect.Response[protocol.GetStreamResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for GetStream") + } + + var r0 *connect.Response[protocol.GetStreamResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.GetStreamRequest]) (*connect.Response[protocol.GetStreamResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.GetStreamRequest]) *connect.Response[protocol.GetStreamResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[protocol.GetStreamResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[protocol.GetStreamRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetStreamEx provides a mock function with given fields: _a0, _a1 +func (_m *MockStreamServiceClient) GetStreamEx(_a0 context.Context, _a1 *connect.Request[protocol.GetStreamExRequest]) (*connect.ServerStreamForClient[protocol.GetStreamExResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for GetStreamEx") + } + + var r0 *connect.ServerStreamForClient[protocol.GetStreamExResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.GetStreamExRequest]) (*connect.ServerStreamForClient[protocol.GetStreamExResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.GetStreamExRequest]) *connect.ServerStreamForClient[protocol.GetStreamExResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.ServerStreamForClient[protocol.GetStreamExResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[protocol.GetStreamExRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Info provides a mock function with given fields: _a0, _a1 +func (_m *MockStreamServiceClient) Info(_a0 context.Context, _a1 *connect.Request[protocol.InfoRequest]) (*connect.Response[protocol.InfoResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for Info") + } + + var r0 *connect.Response[protocol.InfoResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.InfoRequest]) (*connect.Response[protocol.InfoResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.InfoRequest]) *connect.Response[protocol.InfoResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[protocol.InfoResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[protocol.InfoRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PingSync provides a mock function with given fields: _a0, _a1 +func (_m *MockStreamServiceClient) PingSync(_a0 context.Context, _a1 *connect.Request[protocol.PingSyncRequest]) (*connect.Response[protocol.PingSyncResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for PingSync") + } + + var r0 *connect.Response[protocol.PingSyncResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.PingSyncRequest]) (*connect.Response[protocol.PingSyncResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.PingSyncRequest]) *connect.Response[protocol.PingSyncResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[protocol.PingSyncResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[protocol.PingSyncRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RemoveStreamFromSync provides a mock function with given fields: _a0, _a1 +func (_m *MockStreamServiceClient) RemoveStreamFromSync(_a0 context.Context, _a1 *connect.Request[protocol.RemoveStreamFromSyncRequest]) (*connect.Response[protocol.RemoveStreamFromSyncResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for RemoveStreamFromSync") + } + + var r0 *connect.Response[protocol.RemoveStreamFromSyncResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.RemoveStreamFromSyncRequest]) (*connect.Response[protocol.RemoveStreamFromSyncResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.RemoveStreamFromSyncRequest]) *connect.Response[protocol.RemoveStreamFromSyncResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[protocol.RemoveStreamFromSyncResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[protocol.RemoveStreamFromSyncRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SyncStreams provides a mock function with given fields: _a0, _a1 +func (_m *MockStreamServiceClient) SyncStreams(_a0 context.Context, _a1 *connect.Request[protocol.SyncStreamsRequest]) (*connect.ServerStreamForClient[protocol.SyncStreamsResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for SyncStreams") + } + + var r0 *connect.ServerStreamForClient[protocol.SyncStreamsResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.SyncStreamsRequest]) (*connect.ServerStreamForClient[protocol.SyncStreamsResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[protocol.SyncStreamsRequest]) *connect.ServerStreamForClient[protocol.SyncStreamsResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.ServerStreamForClient[protocol.SyncStreamsResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[protocol.SyncStreamsRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewMockStreamServiceClient creates a new instance of MockStreamServiceClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockStreamServiceClient(t interface { + mock.TestingT + Cleanup(func()) +}) *MockStreamServiceClient { + mock := &MockStreamServiceClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/core/node/utils/ordered_map.go b/core/node/utils/ordered_map.go new file mode 100644 index 000000000..ee23df41b --- /dev/null +++ b/core/node/utils/ordered_map.go @@ -0,0 +1,84 @@ +package utils + +type OrderedMap[K comparable, V comparable] struct { + Map map[K]V + Values []V +} + +func NewOrderedMap[K comparable, V comparable](reserve int) *OrderedMap[K, V] { + return &OrderedMap[K, V]{ + Map: make(map[K]V, reserve), + Values: make([]V, 0, reserve), + } +} + +func OrderedMapFromMap[K comparable, V comparable](m map[K]V) *OrderedMap[K, V] { + a := make([]V, 0, len(m)) + for _, v := range m { + a = append(a, v) + } + return &OrderedMap[K, V]{ + Map: m, + Values: a, + } +} + +func OrderMapFromArray[K comparable, V comparable](a []V, key func(V) K) *OrderedMap[K, V] { + m := make(map[K]V, len(a)) + for _, v := range a { + m[key(v)] = v + } + return &OrderedMap[K, V]{ + Map: m, + Values: a, + } +} + +func (m *OrderedMap[K, V]) Get(key K) (V, bool) { + v, ok := m.Map[key] + return v, ok +} + +func (m *OrderedMap[K, V]) Has(key K) bool { + _, ok := m.Map[key] + return ok +} + +func (m *OrderedMap[K, V]) Len() int { + return len(m.Values) +} + +func (m *OrderedMap[K, V]) Set(key K, value V) { + _, ok := m.Map[key] + if ok { + panic("key already exists") + } + m.Map[key] = value + m.Values = append(m.Values, value) +} + +// Copy returns a deep copy of the map. +func (m *OrderedMap[K, V]) Copy(extraCapacity int) *OrderedMap[K, V] { + newMap := make(map[K]V, len(m.Map)+extraCapacity) + for k, v := range m.Map { + newMap[k] = v + } + return &OrderedMap[K, V]{ + Map: newMap, + Values: append(make([]V, 0, len(m.Values)+extraCapacity), m.Values...), + } +} + +func (m *OrderedMap[K, V]) Delete(key K) { + val, ok := m.Map[key] + if !ok { + panic("key does not exist") + } + delete(m.Map, key) + for i, v := range m.Values { + if v == val { + m.Values = append(m.Values[:i], m.Values[i+1:]...) + break + } + } +} diff --git a/core/proto/buf.gen.yaml b/core/proto/buf.gen.yaml new file mode 100644 index 000000000..3e3917d7e --- /dev/null +++ b/core/proto/buf.gen.yaml @@ -0,0 +1,10 @@ +# buf.gen.yaml defines a local generation template. +# For details, see https://docs.buf.build/configuration/v1/buf-gen-yaml +version: v1 +plugins: + - plugin: buf.build/bufbuild/connect-es + out: src/gen + opt: target=ts + - plugin: buf.build/bufbuild/es + out: src/gen + opt: target=ts diff --git a/core/proto/buf.yaml b/core/proto/buf.yaml new file mode 100644 index 000000000..8be07a198 --- /dev/null +++ b/core/proto/buf.yaml @@ -0,0 +1,7 @@ +version: v1 +breaking: + use: + - FILE +lint: + use: + - DEFAULT diff --git a/core/proto/internal.proto b/core/proto/internal.proto new file mode 100644 index 000000000..79b659a43 --- /dev/null +++ b/core/proto/internal.proto @@ -0,0 +1,24 @@ +syntax = "proto3"; +package river; + +import "protocol.proto"; + +message PersistedEvent { + StreamEvent event = 1; + bytes hash = 2; + string prev_miniblock_hash_str = 3; + string creator_user_id = 4; +} + +message PersistedMiniblock { + bytes hash = 1; + MiniblockHeader header = 2; + repeated PersistedEvent events = 3; +} + +message PersistedSyncedStream { + SyncCookie sync_cookie = 1; + uint64 last_snapshot_miniblock_num = 2; + uint64 last_miniblock_num = 3; + repeated PersistedEvent minipoolEvents = 4; +} diff --git a/core/proto/jest.config.ts b/core/proto/jest.config.ts new file mode 100644 index 000000000..dddc6433c --- /dev/null +++ b/core/proto/jest.config.ts @@ -0,0 +1,30 @@ +import type { JestConfigWithTsJest } from 'ts-jest' + +const config: JestConfigWithTsJest = { + preset: 'ts-jest/presets/default-esm', + testEnvironment: './../jest.env.ts', + testEnvironmentOptions: { + browsers: ['chrome', 'firefox', 'safari'], + url: 'https://localhost:5158', + }, + verbose: true, + modulePathIgnorePatterns: ['/dist/'], + setupFilesAfterEnv: ['jest-extended/all'], + extensionsToTreatAsEsm: ['.ts'], + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + useESM: true, + }, + ], + }, + moduleNameMapper: { + '(.+)\\.js': '$1', + }, + collectCoverage: true, + coverageProvider: 'v8', + coverageReporters: ['json', 'html'], +} + +export default config diff --git a/core/proto/package.json b/core/proto/package.json new file mode 100644 index 000000000..143937fa0 --- /dev/null +++ b/core/proto/package.json @@ -0,0 +1,42 @@ +{ + "name": "@river-build/proto", + "private": true, + "packageManager": "yarn@3.8.0", + "type": "module", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "buf:clean": "rm -rf ./src/gen/*", + "buf:generate": "buf generate --path protocol.proto && buf generate --path payloads.proto && buf generate --path internal.proto", + "buf:lint": "buf lint --path protocol.proto && buf lint --path payloads.proto && buf lint --path internal.proto", + "build": "buf generate --path protocol.proto && buf generate --path payloads.proto && buf generate --path internal.proto && tsc", + "cb": "yarn clean && yarn build", + "clean": "rm -rf ./dist", + "my-jest": "yarn node -r ../../scripts/node-no-warn.js --experimental-vm-modules $(yarn bin jest) --passWithNoTests", + "postinstall": "yarn build", + "test": "yarn my-jest", + "test:ci": "yarn my-jest", + "watch": "node scripts/watch_proto_files.cjs", + "watch:go": "node scripts/watch_proto_files_go.cjs" + }, + "dependencies": { + "@bufbuild/protobuf": "^1.4.1", + "@connectrpc/connect": "^1.3.0", + "@connectrpc/connect-web": "^1.3.0" + }, + "devDependencies": { + "@bufbuild/buf": "^1.27.2", + "@bufbuild/protoc-gen-es": "^1.4.1", + "@connectrpc/protoc-gen-connect-es": "^1.1.2", + "@types/jest": "^29.5.3", + "jest": "^29.6.2", + "jest-extended": "^4.0.1", + "lodash.debounce": "^4.0.8", + "ts-jest": "^29.1.1", + "ts-node": "^10.9.1", + "typescript": "^5.1.6" + }, + "files": [ + "/dist" + ] +} diff --git a/core/proto/payloads.proto b/core/proto/payloads.proto new file mode 100644 index 000000000..cf4edd94e --- /dev/null +++ b/core/proto/payloads.proto @@ -0,0 +1,187 @@ +syntax = "proto3"; +package river; + +import "google/protobuf/empty.proto"; + +message ChannelMessage { + message Reaction { + string ref_event_id = 1; + string reaction = 2; + } + + message Edit { + string ref_event_id = 1; + Post post = 2; + } + + message Redaction { + string ref_event_id = 1; + optional string reason = 2; + } + + message Post { + message Mention { + string user_id = 1; + string display_name = 2; + oneof mentionBehavior { + google.protobuf.Empty at_channel = 100; + RoleMention at_role = 101; + } + } + + message RoleMention { + int32 role_id = 1; + } + + message Attachment { + oneof content { + Content.Image image = 101; + Content.EmbeddedMedia embeddedMedia = 102; + Content.ChunkedMedia chunkedMedia = 103; + Content.EmbeddedMessage embeddedMessage = 104; + Content.UnfurledURL unfurledUrl = 105; + } + } + + message Content { + message Text { + string body = 1; + repeated Mention mentions = 2; + repeated Attachment attachments = 3; + } + + message Image { + message Info { + string url = 1; + string mimetype = 2; + optional int32 size = 3; + optional int32 width = 4; + optional int32 height = 5; + } + string title = 1; + Info info = 2; + optional Info thumbnail = 3; + } + + message GM { + string type_url = 1; + optional bytes value = 2; + } + + message MediaInfo { + string mimetype = 1; + int64 sizeBytes = 2; + int32 widthPixels = 3; + int32 heightPixels = 4; + string filename = 5; + } + + message EmbeddedMedia { + MediaInfo info = 1; + bytes content = 2; + } + + message ChunkedMedia { + + message AESGCM { + bytes iv = 1; + bytes secretKey = 2; + } + + MediaInfo info = 1; + string streamId = 2; + EmbeddedMedia thumbnail = 3; + oneof encryption { + AESGCM aesgcm = 101; + } + } + + message EmbeddedMessage { + + message Info { + string userId = 1; + int64 createdAtEpochMs = 2; + string spaceId = 3; + string channelId = 4; + string messageId = 5; + optional string replyId = 6; + } + + message StaticInfo { + optional string userName = 1; + optional string displayName = 2; + optional string channelName = 3; + optional string spaceName = 4; + } + + string url = 1; + ChannelMessage.Post post = 2; + Info info = 3; + StaticInfo staticInfo = 4; + } + + message UnfurledURL { + message Image { + int32 height = 1; + int32 width = 2; + string url = 3; + } + string url = 1; + string description = 2; + string title = 3; + optional UnfurledURL.Image image = 4; + } + } + + optional string thread_id = 1; + optional string thread_preview = 2; + optional string reply_id = 3; + optional string reply_preview = 4; + + oneof content { + Content.Text text = 101; + Content.Image image = 102; + Content.GM gm = 103; + } + } + + oneof payload { + Post post = 1; + Reaction reaction = 2; + Edit edit = 3; + Redaction redaction = 4; + } +} + +message ChannelProperties { + string name = 1; + string topic = 2; +} + +message UserMetadataProperties { + optional string username = 1; + optional string display_name = 2; +} + +message FullyReadMarkers { + message Content { + string channel_id = 1; + optional string thread_parent_id = 2; + string event_id = 3; // id of the first unread event in the stream + int64 event_num = 4; // event number of the first unread event in the stream + int64 begin_unread_window = 5; // begining of the unread window, on marking as read, number is set to end+1 + int64 end_unread_window = 6; // latest event seen by the code + bool is_unread = 7; + int64 markedReadAtTs = 8; // timestamp when the event was marked as read + int32 mentions = 9; + } + // map of ThreadId to Content + map markers = 1; +} + +/** +* UserInboxMessage payload for group session key sharing. +*/ +message SessionKeys { + repeated string keys = 1; +} diff --git a/core/proto/protocol.proto b/core/proto/protocol.proto new file mode 100644 index 000000000..d8e9750eb --- /dev/null +++ b/core/proto/protocol.proto @@ -0,0 +1,861 @@ +syntax = "proto3"; +package river; +option go_package = "github.com/river-build/river/core/node/protocol"; + +import "google/protobuf/timestamp.proto"; +import "google/protobuf/empty.proto"; + + +/** +* Miniblock contains a list of events and the header event. +* Events must be in the same order as in the header, which is of type MiniblockHeader. +* Only signed data (Envelopes) should exist in this data structure. +*/ +message Miniblock { + repeated Envelope events = 1; + Envelope header = 2; +} + +/** + * Envelope contains serialized event, and its hash and signature. + * hash is used as event id. Subsequent events reference this event by hash. + * event is a serialized StreamEvent + */ +message Envelope { + /** + * Hash of event. + * While hash can be recalculated from the event, having it here explicitely + * makes it easier to work with event. + * For the event to be valid, must match hash of event field. + */ + bytes hash = 1; + + /** + * Signature. + * For the event to be valid, signature must match event.creator_address + * or be signed by the address from evant.delegate_sig. + */ + bytes signature = 2; + + bytes event = 3; +} + +/** +* StreamEvent is a single event in the stream. +*/ +message StreamEvent { + /** + * Address of the creator of the event. + * For user - address of the user's wallet. + * For server - address of the server's keypair in staking smart contract. + * + * For the event to be valid: + * If delegate_sig is present, creator_address must match delegate_sig. + * If delegate_sig is not present, creator_address must match event signature in the Envelope. + */ + bytes creator_address = 1; + + /** + * delegate_sig allows event to be signed by a delegate keypair + * + * delegate_sig constains signature of the + * public key of the delegate keypair + the delegate_expirary_epoch_ms. + * User's wallet is used to produce this signature. + * + * If present, for the event to be valid: + * 1. creator_address must match delegate_sig's signer public key + * 2. delegate_sig should be signed as an Ethereum Signed Message (eip-191) + * + * Server nodes sign node-produced events with their own keypair and do not + * need to use delegate_sig. + */ + bytes delegate_sig = 2; + + /** Salt ensures that similar messages are not hashed to the same value. genId() from id.ts may be used. */ + bytes salt = 3; + + /** Hash of a preceding miniblock. Null for the inception event. Must be a recent miniblock */ + optional bytes prev_miniblock_hash = 4; + + /** CreatedAt is the time when the event was created. + NOTE: this value is set by clients and is not reliable for anything other than displaying + the value to the user. Never use this value to sort events from different users. */ + int64 created_at_epoch_ms = 5; + + /** DelegateExpiry is the time when the delegate signature expires. */ + int64 delegate_expiry_epoch_ms = 6; + + /** Variable-type payload. + * Payloads should obey the following rules: + * - payloads should have their own unique type + * - each payload should have a oneof content field + * - each payload, with the exception of miniblock header and member payloads + * should have an inception field inside the content oneof + * - each payload should have a unique Inception type + * - payloads can't violate previous type recursively to inception payload + */ + oneof payload { + MiniblockHeader miniblock_header = 100; + MemberPayload member_payload = 101; + SpacePayload space_payload = 102; + ChannelPayload channel_payload = 103; + UserPayload user_payload = 104; + UserSettingsPayload user_settings_payload = 105; + UserDeviceKeyPayload user_device_key_payload = 106; + UserInboxPayload user_inbox_payload = 107; + MediaPayload media_payload = 108; + DmChannelPayload dm_channel_payload = 109; + GdmChannelPayload gdm_channel_payload = 110; + } +} + +/** +* MiniblockHeader is a special event that forms a block from set of the stream events. +* Hash of the serialized StreamEvent containing MiniblockHeader is used as a block hash. +*/ +message MiniblockHeader { + // Miniblock number. + // 0 for genesis block. + // Must be 1 greater than the previous block number. + int64 miniblock_num = 1; + + // Hash of the previous block. + bytes prev_miniblock_hash = 2; + + // Timestamp of the block. + // Must be greater than the previous block timestamp. + google.protobuf.Timestamp timestamp = 3; + + // Hashes of the events included in the block. + repeated bytes event_hashes = 4; + + // Snapshot of the state at the end of the block. + optional Snapshot snapshot = 5; + + // count of all events in the stream before this block + int64 event_num_offset = 6; + + // pointer to block with previous snapshot + int64 prev_snapshot_miniblock_num = 7; + + // stream payloads are required to have a content field + oneof content { + google.protobuf.Empty none = 100; + } +} + +/** +* MemberPayload +* can appear in any stream +*/ +message MemberPayload { + message Snapshot { + message Member { + bytes user_address = 1; + int64 miniblock_num = 2; + int64 event_num = 3; + repeated KeySolicitation solicitations = 4; + WrappedEncryptedData username = 5; + WrappedEncryptedData display_name = 6; + bytes ens_address = 7; + Nft nft = 8; + } + + repeated Member joined = 1; + } + + message Membership { + MembershipOp op = 1; + bytes user_address = 2; + bytes initiator_address = 3; + optional bytes stream_parent_id = 4; + } + + message KeySolicitation { + string device_key = 1; // requesters device_key + string fallback_key = 2; // requesters fallback_key + bool is_new_device = 3; // true if this is a new device, session_ids will be empty + repeated string session_ids = 4; + } + + message KeyFulfillment { + bytes user_address = 1; + string device_key = 2; + repeated string session_ids = 3; + } + + message Nft { + int32 chain_id = 1; + bytes contract_address = 2; + bytes token_id = 3; + } + + oneof content { + Membership membership = 1; + KeySolicitation key_solicitation = 2; + KeyFulfillment key_fulfillment = 3; + EncryptedData username = 4; + EncryptedData display_name = 5; + bytes ens_address = 6; + Nft nft = 7; + } +} + +/** +* SpacePayload +*/ +message SpacePayload { + message Snapshot { + // inception + Inception inception = 1; + // channels: sorted by channel_id + repeated Channel channels = 2; + } + + message Inception { + bytes stream_id = 1; + StreamSettings settings = 2; + } + + message Channel { + reserved 5; + ChannelOp op = 1; + bytes channel_id = 2; + EventRef origin_event = 3; + EncryptedData channel_properties = 4; + } + + oneof content { + Inception inception = 1; + Channel channel = 2; + } +} + +/** +* ChannelPayload +*/ +message ChannelPayload { + message Snapshot { + // inception + Inception inception = 1; + } + + message Inception { + reserved 6; + bytes stream_id = 1; + bytes space_id = 3; + /** + * channel_properties and is_default be used to + * create associated with that channel in the space stream + */ + EncryptedData channel_properties = 4; + StreamSettings settings = 5; + } + + message Redaction { + bytes event_id = 1; + } + + oneof content { + Inception inception = 1; + EncryptedData message = 2; + Redaction redaction = 3; + } +} + +/** +* DmChannelPayload +*/ +message DmChannelPayload { + message Snapshot { + Inception inception = 1; + } + + message Inception { + bytes stream_id = 1; + bytes first_party_address = 2; + bytes second_party_address = 3; + StreamSettings settings = 4; + } + + oneof content { + Inception inception = 1; + EncryptedData message = 3; + } +} + +/** +* GdmChannelPayload +*/ +message GdmChannelPayload { + message Snapshot { + Inception inception = 1; + WrappedEncryptedData channel_properties = 2; + } + + message Inception { + bytes stream_id = 1; + EncryptedData channel_properties = 2; + StreamSettings settings = 3; + } + + oneof content { + Inception inception = 1; + EncryptedData message = 2; + EncryptedData channel_properties = 3; + } +} + +/** +* UserPayload +*/ +message UserPayload { + message Snapshot { + // inception + Inception inception = 1; + // memberships, sorted by stream_id + repeated UserMembership memberships = 2; + } + + message Inception { + bytes stream_id = 1; + StreamSettings settings = 2; + } + + // update own membership + message UserMembership { + bytes stream_id = 1; + MembershipOp op = 2; + optional bytes inviter = 3; + optional bytes stream_parent_id = 4; + } + + // update someone else's membership + message UserMembershipAction { + bytes stream_id = 1; + bytes user_id = 2; + MembershipOp op = 3; + optional bytes stream_parent_id = 4; + } + + oneof content { + Inception inception = 1; + UserMembership user_membership = 2; + UserMembershipAction user_membership_action = 3; + } +} + +/** +* UserInboxPayload +* messages to a user encrypted per deviceId +*/ +message UserInboxPayload { + message Snapshot { + message DeviceSummary { + /** + * UpperBound = latest to device event sent from other client per deviceKey + * LowerBound = latest ack sent by stream owner per deviceKey + * on ack, if UpperBound <= LowerBound then delete this deviceKey entry from the record + * on ack or new session, if any device’s lower bound < N generations ago, delete the deviceKey entry from the record + */ + int64 lower_bound = 1; + int64 upper_bound = 2; + } + + Inception inception = 1; + // deviceKey: miniblockNum that the ack was snapshotted + map device_summary = 2; + } + + message Inception { + bytes stream_id = 1; + StreamSettings settings = 2; + } + + message GroupEncryptionSessions { + bytes stream_id = 1; + string sender_key = 2; + repeated string session_ids = 3; + // deviceKey: per device ciphertext of encrypted session keys that match session_ids + map ciphertexts = 4; + } + + message Ack { + string device_key = 1; + int64 miniblock_num = 2; + } + + oneof content { + Inception inception = 1; + Ack ack = 2; + GroupEncryptionSessions group_encryption_sessions = 3; + + } +} + +/** +* UserSettingsPayload +*/ +message UserSettingsPayload { + message Snapshot { + // for a specific blocked user, there might be multiple block or unblock events + message UserBlocks { + message Block { + bool is_blocked = 1; + int64 event_num = 2; + } + bytes user_id = 1; + repeated Block blocks = 2; + + } + // inception + Inception inception = 1; + // fullyReadMarkers: sorted by stream_id + repeated FullyReadMarkers fully_read_markers = 2; + repeated UserBlocks user_blocks_list = 3; + } + + message Inception { + bytes stream_id = 1; + StreamSettings settings = 2; + } + + message FullyReadMarkers { + bytes stream_id = 1; + EncryptedData content = 2; + } + + message UserBlock { + bytes user_id = 1; + bool is_blocked = 2; + int64 event_num = 3; + } + + oneof content { + Inception inception = 1; + FullyReadMarkers fully_read_markers = 2; + UserBlock user_block = 3; + } +} + +/** +* UserDeviceKeyPayload +*/ +message UserDeviceKeyPayload { + message Snapshot { + // inception + Inception inception = 1; + // device keys for this user, unique by device_key, capped at N, most recent last + repeated EncryptionDevice encryption_devices = 2; + } + + message Inception { + bytes stream_id = 1; + StreamSettings settings = 2; + } + + message EncryptionDevice { + string device_key = 1; + string fallback_key = 2; + } + + oneof content { + Inception inception = 1; + EncryptionDevice encryption_device = 2; + } +} + +/** +* MediaPayload +*/ +message MediaPayload { + message Snapshot { + Inception inception = 1; + } + + message Inception { + bytes stream_id = 1; + bytes channel_id = 2; + int32 chunk_count = 3; + StreamSettings settings = 4; + optional bytes space_id = 5; + } + + message Chunk { + bytes data = 1; + int32 chunk_index = 2; + } + + oneof content { + Inception inception = 1; + Chunk chunk = 2; + } +} + +/** +* Snapshot contains a summary of all state events up to the most recent miniblock +*/ +message Snapshot { + + MemberPayload.Snapshot members = 1; + int32 snapshot_version = 2; + + // Snapshot data specific for each stream type. + oneof content { + SpacePayload.Snapshot space_content = 101; + ChannelPayload.Snapshot channel_content = 102; + UserPayload.Snapshot user_content = 103; + UserSettingsPayload.Snapshot user_settings_content = 104; + UserDeviceKeyPayload.Snapshot user_device_key_content = 105; + MediaPayload.Snapshot media_content = 106; + DmChannelPayload.Snapshot dm_channel_content = 107; + GdmChannelPayload.Snapshot gdm_channel_content = 108; + UserInboxPayload.Snapshot user_inbox_content = 109; + } +} + +/** + * Derived event is produces by server when there should be additional event to compliment + * received event. For example, when user joins a space through event in the space stream, server will produce a derived event + * in a user stream to indicate that user joined a particual space. + * + * EventRef is used to reference the event that caused the derived event to be produced. + */ +message EventRef { + bytes stream_id = 1; + bytes hash = 2; + bytes signature = 3; +} + +/** + * StreamSettings is a part of inception payload for each stream type. + */ +message StreamSettings { + // Test setting for testing with manual miniblock creation through Info debug request. + bool disable_miniblock_creation = 1; +} + +/** + * EncryptedData + */ +message EncryptedData { + /** + * Ciphertext of the encryption envelope. + */ + string ciphertext = 1; + /** + * Encryption algorithm used to encrypt this event. + */ + string algorithm = 2; + /** + * Sender device public key identifying the sender's device. + */ + string sender_key = 3; + /** + * The ID of the session used to encrypt the message. + */ + string session_id = 4; + + /** + * Optional checksum of the cleartext data. + */ + optional string checksum = 5; + + /** + * Optional reference to parent event ID + */ + optional string ref_event_id = 6; + +} + +message WrappedEncryptedData { + EncryptedData data = 1; + int64 event_num = 2; + bytes event_hash = 3; +} + +message SyncCookie { + bytes node_address = 1; + bytes stream_id = 2; + int64 minipool_gen = 3; + int64 minipool_slot = 4; + bytes prev_miniblock_hash = 5; +} + +message StreamAndCookie { + repeated Envelope events = 1; + SyncCookie next_sync_cookie = 2; + // if non-empty, contains all blocks since the latest snapshot, miniblocks[0].header is the latest snapshot + repeated Miniblock miniblocks = 3; + bool sync_reset = 4; +} + +message GetStreamExRequest { + bytes stream_id = 1; +} + +message Minipool { + repeated Envelope events = 1; +} + +// GetStreamExResponse is a stream of raw data that represents the current state of the requested stream. +// These responses represent streams that are not expected to change once finalized, and have a optimized code path +// for retrieval. Response may potentially be very large, and are streamed back to the client. The client is expected +// to martial the raw data back into protobuf messages. +message GetStreamExResponse { + oneof data { + Miniblock miniblock = 1; + Minipool minipool = 2; + } +} + +message CreateStreamRequest { + repeated Envelope events = 1; + bytes stream_id = 2; // stream_id should match the stream_id in the inception payload of the first event + } + +message CreateStreamResponse { + // all events in current minipool and cookie allowing to sync from the end of the stream + StreamAndCookie stream = 1; +} + +message GetStreamRequest { + bytes stream_id = 1; + // if optional is true and stream doesn't exist, response will be a nil stream instead of ERROR NOT_FOUND + bool optional = 2; +} + +message GetStreamResponse { + // all events in current minipool and cookie allowing to sync from the end of the stream + StreamAndCookie stream = 1; +} + +message GetMiniblocksRequest { + bytes stream_id = 1; + int64 fromInclusive = 2; + int64 toExclusive = 3; +} + +message GetMiniblocksResponse { + repeated Miniblock miniblocks = 1; + // terminus: true if there are no more blocks to fetch because they've been garbage collected, or you've reached block 0 + bool terminus = 2; +} + +message GetLastMiniblockHashRequest { + bytes stream_id = 1; +} + +message GetLastMiniblockHashResponse { + bytes hash = 1; + int64 miniblock_num = 2; +} + +message AddEventRequest { + bytes stream_id = 1; + Envelope event = 2; +} + +message AddEventResponse {} + +message SyncStreamsRequest { + repeated SyncCookie sync_pos = 1; +} + +message SyncStreamsResponse { + string sync_id = 1; + SyncOp sync_op = 2; + StreamAndCookie stream = 3; + string pong_nonce = 4; +} + +message AddStreamToSyncRequest { + string sync_id = 1; + SyncCookie sync_pos = 2; +} + +message AddStreamToSyncResponse {} + +message RemoveStreamFromSyncRequest { + string sync_id = 1; + bytes stream_id = 2; +} + +message RemoveStreamFromSyncResponse {} + +message CancelSyncRequest { + string sync_id = 1; +} + +message CancelSyncResponse {} + +message PingSyncRequest { + string sync_id = 1; + string nonce = 2; +} + +message PingSyncResponse {} + +message InfoRequest { + repeated string debug = 1; +} + +message InfoResponse { + string graffiti = 1; + google.protobuf.Timestamp start_time = 2; + string version = 3; +} + +service StreamService { + rpc CreateStream(CreateStreamRequest) returns (CreateStreamResponse); + rpc GetStream(GetStreamRequest) returns (GetStreamResponse); + rpc GetStreamEx(GetStreamExRequest) returns (stream GetStreamExResponse); + rpc GetMiniblocks(GetMiniblocksRequest) returns (GetMiniblocksResponse); + rpc GetLastMiniblockHash(GetLastMiniblockHashRequest) returns (GetLastMiniblockHashResponse); + rpc AddEvent(AddEventRequest) returns (AddEventResponse); + rpc SyncStreams(SyncStreamsRequest) returns (stream SyncStreamsResponse); + rpc AddStreamToSync(AddStreamToSyncRequest) returns (AddStreamToSyncResponse); + rpc CancelSync(CancelSyncRequest) returns (CancelSyncResponse); + rpc RemoveStreamFromSync(RemoveStreamFromSyncRequest) returns (RemoveStreamFromSyncResponse); + rpc Info(InfoRequest) returns (InfoResponse); + rpc PingSync(PingSyncRequest) returns (PingSyncResponse); +} + +enum SyncOp { + SYNC_UNSPECIFIED = 0; + SYNC_NEW = 1; // new sync + SYNC_CLOSE = 2; // close the sync + SYNC_UPDATE = 3; // update from server + SYNC_PONG = 4; // respond to the ping message from the client. +} + +enum MembershipOp { + SO_UNSPECIFIED = 0; + SO_INVITE = 1; + SO_JOIN = 2; + SO_LEAVE = 3; +} + +enum ChannelOp { + CO_UNSPECIFIED = 0; + CO_CREATED = 1; + CO_DELETED = 2; + CO_UPDATED = 4; +} + +// Codes from 1 to 16 match gRPC/Connect codes. +enum Err { + ERR_UNSPECIFIED = 0; + + // Canceled indicates that the operation was canceled, typically by the + // caller. + CANCELED = 1; + + // Unknown indicates that the operation failed for an unknown reason. + UNKNOWN = 2; + + // InvalidArgument indicates that client supplied an invalid argument. + INVALID_ARGUMENT = 3; + + // DeadlineExceeded indicates that deadline expired before the operation + // could complete. + DEADLINE_EXCEEDED = 4; + + // NotFound indicates that some requested entity (for example, a file or + // directory) was not found. + NOT_FOUND = 5; + + // AlreadyExists indicates that client attempted to create an entity (for + // example, a file or directory) that already exists. + ALREADY_EXISTS = 6; + + // PermissionDenied indicates that the caller doesn't have permission to + // execute the specified operation. + PERMISSION_DENIED = 7; + + // ResourceExhausted indicates that some resource has been exhausted. For + // example, a per-user quota may be exhausted or the entire file system may + // be full. + RESOURCE_EXHAUSTED = 8; + + // FailedPrecondition indicates that the system is not in a state + // required for the operation's execution. + FAILED_PRECONDITION = 9; + + // Aborted indicates that operation was aborted by the system, usually + // because of a concurrency issue such as a sequencer check failure or + // transaction abort. + ABORTED = 10; + + // OutOfRange indicates that the operation was attempted past the valid + // range (for example, seeking past end-of-file). + OUT_OF_RANGE = 11; + + // Unimplemented indicates that the operation isn't implemented, + // supported, or enabled in this service. + UNIMPLEMENTED = 12; + + // Internal indicates that some invariants expected by the underlying + // system have been broken. This code is reserved for serious errors. + INTERNAL = 13; + + // Unavailable indicates that the service is currently unavailable. This + // is usually temporary, so clients can back off and retry idempotent + // operations. + UNAVAILABLE = 14; + + // DataLoss indicates that the operation has resulted in unrecoverable + // data loss or corruption. + DATA_LOSS = 15; + + // Unauthenticated indicates that the request does not have valid + // authentication credentials for the operation. + UNAUTHENTICATED = 16; + + DEBUG_ERROR = 17; + BAD_STREAM_ID = 18; + BAD_STREAM_CREATION_PARAMS = 19; + INTERNAL_ERROR_SWITCH = 20; + BAD_EVENT_ID = 21; + BAD_EVENT_SIGNATURE = 22; + BAD_HASH_FORMAT = 23; + BAD_PREV_MINIBLOCK_HASH = 24; + NO_EVENT_SPECIFIED = 25; + BAD_EVENT = 26; + USER_CANT_POST = 27; + STREAM_BAD_HASHES = 28; + STREAM_EMPTY = 29; + STREAM_BAD_EVENT = 30; + BAD_DELEGATE_SIG = 31; + BAD_PUBLIC_KEY = 32; + BAD_PAYLOAD = 33; + BAD_HEX_STRING = 34; + BAD_EVENT_HASH = 35; + BAD_SYNC_COOKIE = 36; + DUPLICATE_EVENT = 37; + BAD_BLOCK = 38; + STREAM_NO_INCEPTION_EVENT = 39; + BAD_BLOCK_NUMBER = 40; + BAD_MINIPOOL_SLOT = 41; + BAD_CREATOR_ADDRESS = 42; + STALE_DELEGATE = 43; + BAD_LINK_WALLET_BAD_SIGNATURE = 44; + BAD_ROOT_KEY_ID = 45; + UNKNOWN_NODE = 46; + DB_OPERATION_FAILURE = 47; + MINIBLOCKS_STORAGE_FAILURE = 48; + BAD_ADDRESS = 49; + BUFFER_FULL = 50; + BAD_CONFIG = 51; + BAD_CONTRACT = 52; + CANNOT_CONNECT = 53; + CANNOT_GET_LINKED_WALLETS = 54; + CANNOT_CHECK_ENTITLEMENTS = 55; + CANNOT_CALL_CONTRACT = 56; + SPACE_DISABLED = 57; + CHANNEL_DISABLED = 58; + WRONG_STREAM_TYPE = 59; + MINIPOOL_MISSING_EVENTS = 60; + STREAM_LAST_BLOCK_MISMATCH = 61; + DOWNSTREAM_NETWORK_ERROR = 62; +} diff --git a/core/proto/scripts/watch_proto_files.cjs b/core/proto/scripts/watch_proto_files.cjs new file mode 100644 index 000000000..09bff1555 --- /dev/null +++ b/core/proto/scripts/watch_proto_files.cjs @@ -0,0 +1,31 @@ +const fs = require("fs"); +const { exec } = require("child_process"); +const debounce = require("lodash.debounce"); + +const currentDirectory = process.cwd(); +const buildCommand = "yarn build"; + +const handleFileChange = debounce((eventType, filename) => { + console.log(`Detected ${eventType} in ${filename}, running build command...`); + exec(buildCommand, (error, stdout, stderr) => { + if (error) { + console.error(`Error: ${error.message}`); + } else if (stderr) { + console.error(`Stderr: ${stderr}`); + } else if (stdout) { + console.log(`Stdout: ${stdout}`); + } + console.log("Done."); + }); +}, 1000); + +const watcher = fs.watch(currentDirectory, (eventType, filename) => { + if (filename.endsWith(".proto")) { + handleFileChange(eventType, filename); + } +}); + +console.log(`Watching ${currentDirectory} for changes...`); + +// To close the watcher when you're done +// watcher.close(); diff --git a/core/proto/scripts/watch_proto_files_go.cjs b/core/proto/scripts/watch_proto_files_go.cjs new file mode 100644 index 000000000..415a160d4 --- /dev/null +++ b/core/proto/scripts/watch_proto_files_go.cjs @@ -0,0 +1,38 @@ +const fs = require("fs"); +const { exec } = require("child_process"); +const debounce = require("lodash.debounce"); + +const currentDirectory = process.cwd(); +const toolsDirectory = process.cwd() + "/../node/protocol_extensions"; +const buildCommand = "cd ../node && go generate -v -x protocol/gen.go"; + +const handleFileChange = debounce((eventType, filename) => { + console.log(`Detected ${eventType} in ${filename}, running build command...`); + exec(buildCommand, (error, stdout, stderr) => { + if (error) { + console.error(`Error: ${error.message}`); + } else if (stderr) { + console.error(`stderr:\n${stderr}\nstdout:\n${stdout}`); + } else if (stdout) { + console.log(`Stdout: ${stdout}`); + } + console.log("Done."); + }); +}, 1000); + +const watcher = fs.watch(currentDirectory, (eventType, filename) => { + if (filename.endsWith(".proto")) { + handleFileChange(eventType, filename); + } +}); + +const watcher2 = fs.watch(toolsDirectory, (eventType, filename) => { + if (filename.endsWith(".go")) { + handleFileChange(eventType, filename); + } +}); + +console.log(`Watching ${currentDirectory} && ${toolsDirectory} for changes...`); + +// To close the watcher when you're done +// watcher.close(); diff --git a/core/proto/src/index.ts b/core/proto/src/index.ts new file mode 100644 index 000000000..f6ec80793 --- /dev/null +++ b/core/proto/src/index.ts @@ -0,0 +1,5 @@ +export * from './gen/protocol_pb' +export * from './gen/protocol_connect' +export * from './gen/payloads_pb' +export * from './gen/internal_pb' +export * from './types' diff --git a/core/proto/src/types.ts b/core/proto/src/types.ts new file mode 100644 index 000000000..4d131776e --- /dev/null +++ b/core/proto/src/types.ts @@ -0,0 +1,14 @@ +import { PlainMessage } from '@bufbuild/protobuf' +import { Snapshot, StreamEvent } from './gen/protocol_pb' +import { FullyReadMarkers_Content } from './gen/payloads_pb' + +export type SnapshotCaseType = Snapshot['content']['case'] +export type SnapshotValueType = Snapshot['content']['value'] + +export type PayloadCaseType = StreamEvent['payload']['case'] +export type PayloadValueType = StreamEvent['payload']['value'] + +// we convert messages to plain objects to make them easier to work with in react +// statemanagement in react is based on reference equality, if we mutate classes, +// we don't get the benefits of react's state management, so we convert to typed plain objects +export type FullyReadMarker = PlainMessage diff --git a/core/proto/tsconfig.json b/core/proto/tsconfig.json new file mode 100644 index 000000000..5bd8afbc2 --- /dev/null +++ b/core/proto/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "rootDir": "./src" /* Specify the root folder within your source files. */, + "outDir": "./dist" /* Specify an output folder for all emitted files. */ + }, + "include": ["./src/**/*"] +} diff --git a/core/scripts/docker-compose.yml b/core/scripts/docker-compose.yml new file mode 100644 index 000000000..b4f8303d3 --- /dev/null +++ b/core/scripts/docker-compose.yml @@ -0,0 +1,23 @@ +services: + postgres: + image: postgres:latest + restart: always + environment: + - PGDATA=/var/lib/postgresql/data + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + - PGUSER=postgres + command: postgres -c max_connections=1000 + logging: + options: + max-size: 10m + max-file: '3' + ports: + - '5433:5432' + volumes: + - postgres-data:/var/lib/postgresql/data + # copy the sql script to create tables + - ./sql/create_db.sql:/docker-entrypoint-initdb.d/create_db.sql + +volumes: + postgres-data: {} diff --git a/core/scripts/generate-certs.sh b/core/scripts/generate-certs.sh new file mode 100755 index 000000000..c65e03a30 --- /dev/null +++ b/core/scripts/generate-certs.sh @@ -0,0 +1,78 @@ +#!/bin/bash +set -e +set -x +# Change to script's directory +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +# Check if directory argument is provided +if [ "$#" -ne 1 ]; then + echo "Usage: $0 " + exit 1 +fi + +OUTPUT_DIR=$1 + +# Check if the provided directory exists +if [ ! -d "$OUTPUT_DIR" ]; then + echo "Directory '$OUTPUT_DIR' does not exist. Exiting." + exit 1 +fi +set -x +# Variables +CA_KEY_PATH=~/river-ca-key.pem +CA_CERT_PATH=~/river-ca-cert.pem +SERVER_KEY_PATH="$OUTPUT_DIR/key.pem" +SERVER_CERT_PATH="$OUTPUT_DIR/cert.pem" +CSR_PATH="$OUTPUT_DIR/csr.pem" + +# Check if server certs already exist +if [[ -f "$SERVER_KEY_PATH" && -f "$SERVER_CERT_PATH" ]]; then + echo "Server certs already exist. Skipping..." + exit 0 +fi + +# Validate CA files are present +if [[ ! -f "$CA_KEY_PATH" || ! -f "$CA_CERT_PATH" ]]; then + echo "CA files not found. Run the CA script first." + exit 1 +fi + +echo "Generating server certs..." +current_user=$(whoami) +email="${current_user}@hntlabs.com" + +# Generate server key and CSR +openssl req -newkey rsa:2048 -nodes -keyout $SERVER_KEY_PATH -out $CSR_PATH \ + -subj "/C=US/ST=Some-State/L=Some-City/O=Some-Organization/OU=Some-Unit/CN=river/emailAddress=${email}" \ + -reqexts SAN \ + -config <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:localhost,IP:127.0.0.1")) + +# Create a temporary file for extfile.cnf with a relevant name +EXTFILE_TEMP=$(mktemp -t extfileXXXX.cnf) + +# Function to clean up the temporary file +cleanup() { + rm -f $EXTFILE_TEMP +} + +# Set trap to run the cleanup function on exit, interrupt, or termination +trap cleanup EXIT INT TERM + +# Generate extfile for SAN, Key Usage, and Extended Key Usage +cat < $EXTFILE_TEMP +[SAN] +subjectAltName=DNS:localhost,IP:127.0.0.1 +keyUsage=digitalSignature, keyEncipherment +extendedKeyUsage=serverAuth +EOF + +# Generate server certificate using CA +openssl x509 -req -in $CSR_PATH -CA $CA_CERT_PATH -CAkey $CA_KEY_PATH -CAcreateserial \ + -out $SERVER_CERT_PATH -days 365 -extfile $EXTFILE_TEMP -extensions SAN + +# Error handling for OpenSSL +if [[ $? -ne 0 ]]; then + echo "OpenSSL failed. Exiting." + exit 1 +fi + diff --git a/core/scripts/generate_sdk_index.sh b/core/scripts/generate_sdk_index.sh new file mode 100755 index 000000000..3567fbbe2 --- /dev/null +++ b/core/scripts/generate_sdk_index.sh @@ -0,0 +1,41 @@ +#!/bin/bash + + +# Change to script's directory +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +# Array of directories to process +declare -a dirs=("../sdk/src") + +# Loop through each directory +for dir in "${dirs[@]}"; do + # Change directory to the target + cd "$dir" || { echo "Directory $dir does not exist, skipping..."; continue; } + + # Initialize an empty array to store export statements + declare -a exports + exports=() + + # Add a fun comment at the top + echo "/**************************************************************************" > index.ts + echo " * This file can be auto generated by 🏕️ scripts/generate_sdk_index.sh 🏕️ *" >> index.ts + echo " **************************************************************************/" >> index.ts + + # Loop through each TypeScript file to append an export statement to the array + # Skip files that have ".test." in their name, the existing index.ts file, and directories + for file in $(find . -type f -name "*.ts" ! -name "*.test*" ! -name "*.d.ts" ! -name "index.ts" | sort); do + # Remove the './' prefix and '.ts' suffix from the file path + file=$(echo "$file" | sed "s|^\./||;s|\.ts$||") + + # Append export statement to the array + exports+=("export * from './$file'") + done + + echo "writing $dir/index.ts" + + # Append the sorted export statements to index.ts + printf "%s\n" "${exports[@]}" >> index.ts + + # Change back to the original directory to continue the loop + cd - || exit +done diff --git a/core/scripts/launch.sh b/core/scripts/launch.sh new file mode 100755 index 000000000..bcc4a7fbb --- /dev/null +++ b/core/scripts/launch.sh @@ -0,0 +1,18 @@ +#!/bin/bash -ue +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +echo +echo "Launching Storage..." +echo + +./launch_storage.sh + +echo +echo "To test instance run tests with:" +echo " yarn csb:test" +echo "" +echo " (currently need to run with --disable_entitlements for tests to pass)" +echo "" +echo "" + +./start_node.sh $@ diff --git a/core/scripts/launch_multi.sh b/core/scripts/launch_multi.sh new file mode 100755 index 000000000..ef7b42442 --- /dev/null +++ b/core/scripts/launch_multi.sh @@ -0,0 +1,16 @@ +#!/bin/bash -ue +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +echo +echo "Clean & Build..." +echo +yarn run --top-level csb:build + +./launch_storage.sh + +echo +echo "!!!Multi Node!!!" +echo "" +echo "" + +./start_node_multi.sh $@ diff --git a/core/scripts/launch_storage.sh b/core/scripts/launch_storage.sh new file mode 100755 index 000000000..14ed6e84a --- /dev/null +++ b/core/scripts/launch_storage.sh @@ -0,0 +1,8 @@ +#!/bin/bash -ue +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +echo +echo "Launching Postgres..." +echo + +docker compose --project-name river up --detach --wait diff --git a/core/scripts/load-testing-docker-compose.yml b/core/scripts/load-testing-docker-compose.yml new file mode 100644 index 000000000..63657ca59 --- /dev/null +++ b/core/scripts/load-testing-docker-compose.yml @@ -0,0 +1,6 @@ +services: + redis: + image: redis:latest + container_name: bullmq-redis + ports: + - '6379:6379' diff --git a/core/scripts/register-ca.sh b/core/scripts/register-ca.sh new file mode 100755 index 000000000..d0839a322 --- /dev/null +++ b/core/scripts/register-ca.sh @@ -0,0 +1,72 @@ +#!/bin/bash +set -e + +# Initialize flag variables +SKIP_REGISTER=false + +# Process flags +while getopts ":s" opt; do + case ${opt} in + s ) # Skip registering the CA + SKIP_REGISTER=true + ;; + \? ) + echo "Usage: cmd [-skip]" + exit 1 + ;; + esac +done + +# Function to determine the running environment +function is_macos() { + [[ $(uname) == "Darwin" ]] +} + +function is_github_actions() { + [[ ! -z "$GITHUB_ACTIONS" ]] +} + +# Change to script's directory +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +# Variables +CA_KEY_PATH=~/river-ca-key.pem +CA_CERT_PATH=~/river-ca-cert.pem +CA_COMMON_NAME="RiverLocalhostCA" + +# Function to check if CA is already registered on macOS +function is_ca_registered_macos() { + security find-certificate -c "$CA_COMMON_NAME" /Library/Keychains/System.keychain > /dev/null 2>&1 +} + +# Generate CA if it doesn't exist +if [ ! -f "$CA_CERT_PATH" ]; then + echo "Generating new CA key and certificate..." + openssl genpkey -algorithm RSA -out $CA_KEY_PATH + openssl req -new -x509 -key $CA_KEY_PATH -out $CA_CERT_PATH -days 3650 -subj "/CN=$CA_COMMON_NAME" + echo "Successfully generated new CA key and certificate." +fi + +# Register the CA based on environment +if [ "$SKIP_REGISTER" = true ]; then + echo "Skipping CA registration as per the -s flag." +elif is_macos; then + if is_ca_registered_macos; then + echo "CA is already registered in macOS keychain. Skipping registration." + else + echo "Registering the CA certificate in macOS keychain..." + sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain $CA_CERT_PATH || { + echo "Failed to register the CA. You may need to manually remove any existing entry and try again." + exit 1 + } + echo "Successfully registered the CA certificate in macOS keychain." + fi +elif is_github_actions; then + echo "Running in GitHub Actions environment..." + sudo mkdir -p /usr/local/share/ca-certificates/ + sudo cp $CA_CERT_PATH /usr/local/share/ca-certificates/ + sudo update-ca-certificates + echo "Successfully added CA certificate in GitHub Actions runner." +else + echo "Unknown environment. No action taken for CA registration." +fi diff --git a/core/scripts/sql/create_db.sql b/core/scripts/sql/create_db.sql new file mode 100644 index 000000000..98fd57f11 --- /dev/null +++ b/core/scripts/sql/create_db.sql @@ -0,0 +1,3 @@ +CREATE DATABASE river; +\c river; + diff --git a/core/scripts/start_node.sh b/core/scripts/start_node.sh new file mode 100755 index 000000000..e69992856 --- /dev/null +++ b/core/scripts/start_node.sh @@ -0,0 +1,4 @@ +#!/bin/bash -ue +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +../node/run_single.sh $@ diff --git a/core/scripts/start_node_multi.sh b/core/scripts/start_node_multi.sh new file mode 100755 index 000000000..46cf18579 --- /dev/null +++ b/core/scripts/start_node_multi.sh @@ -0,0 +1,4 @@ +#!/bin/bash -ue +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +../node/run_multi.sh $@ diff --git a/core/scripts/stop.sh b/core/scripts/stop.sh new file mode 100755 index 000000000..547005126 --- /dev/null +++ b/core/scripts/stop.sh @@ -0,0 +1,5 @@ +#!/bin/bash -ue +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +./stop_node.sh +./stop_storage.sh diff --git a/core/scripts/stop_node.sh b/core/scripts/stop_node.sh new file mode 100755 index 000000000..a6af1dbca --- /dev/null +++ b/core/scripts/stop_node.sh @@ -0,0 +1,20 @@ +#!/bin/bash -ue + +echo "Killing node processes..." +echo "" + +pkill -SIGINT -f "/go-build.*/exe/node" || true + +pkill -SIGINT -f "/go-build.*/exe/main" || true + + +echo "" +echo "Killing yarn cbs processes..." +ps -ax | grep "csb:dev" +ps -ax | grep "csb:start" +echo "" + +kill -9 $(ps -ax | grep "csb:start" | awk '{print $1}') || true +kill -9 $(ps -ax | grep "csb:dev" | awk '{print $1}') || true + +exit 0 \ No newline at end of file diff --git a/core/scripts/stop_storage.sh b/core/scripts/stop_storage.sh new file mode 100755 index 000000000..8f8210b85 --- /dev/null +++ b/core/scripts/stop_storage.sh @@ -0,0 +1,4 @@ +#!/bin/bash -ue +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +docker-compose --project-name river down --volumes diff --git a/core/supervisord.conf b/core/supervisord.conf new file mode 100644 index 000000000..590ee3fe9 --- /dev/null +++ b/core/supervisord.conf @@ -0,0 +1,29 @@ +[supervisord] +logfile=/riveruser/supervisord/logs/supervisord.log ; (main log file;default $CWD/supervisord.log) +pidfile=/riveruser/supervisord/logs/supervisord.pid +nodaemon=true +loglevel=info +logfile=/dev/stdout +logfile_maxbytes=0 + +[program:stream_node] +command=/usr/bin/stream_node run +directory=/riveruser/stream_node +autostart=true +autorestart=false +user=riveruser +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:xchain_node] +command=/usr/bin/xchain_node run +directory=/riveruser/xchain_node +autostart=true +autorestart=false +user=riveruser +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/core/test/crypto/keys.csv b/core/test/crypto/keys.csv new file mode 100644 index 000000000..fae007aac --- /dev/null +++ b/core/test/crypto/keys.csv @@ -0,0 +1,5 @@ +83699d34c5dc2c52861da4c2a2108dc0c66ab86e979de4f6efbe792fcbb4a7c2,044986da3f150f8e42153fd07677e3ac6148f981709994dab8d216b963b4b13fff01a9e14f6cc99c126c91be074c15c4391492245f027c7a30ef3e517c2083bdfd +04c0c5ae0f7f42663fbe399fe30d54c4cd5d562988ad48d04c28b0308e9f6162,04987a2529a031a8911067bbf2bb42129ae38450a66e512232e57ccf81be70cb3ffd6a4284a68a84a6c4666bcf12b7a58194db27169f3255467ac2f2d0f7f1899d +a7c67633365ae5f66af002134bf21a061e2273930dfb001afc7362a861a21648,044a3da33b896853297be2ead118cead889fcd8a41c4fc7814daa726c25e9f5af1aaf3734d3e2e425ce18ff0aa43bdf46c95475fe0c21b25b5404986bcacd75168 +0c4f41d90857fbd02f6eaaab6ab60f22297037e339fb4122694d9543d3ca46c1,045158902276701d17acb1bcde3dfc9f6ce9ab03966c19987bc0a89cc70c3d5caa86177e4eece8c9d82187f325dd24a6579b17dfc0423f81cdfd0f7c569482d367 +f1a2059994e8f5694642ef600821850db3561864821feb96bea66af892741b10,0469edba54b94ed179d2b74da2c5a2d4bd5b277d44d42ad652604533c92e0584b702de68a1be0f6f29fbca9c8e6123d4c53ac1d64759420c38a77683e90d67d363 \ No newline at end of file diff --git a/core/test/crypto/test_data.csv b/core/test/crypto/test_data.csv new file mode 100644 index 000000000..2f72a96cd --- /dev/null +++ b/core/test/crypto/test_data.csv @@ -0,0 +1,3246 @@ +00,5afc416f5e9453b94ff508066aeff90a9dbf3aa85ae30c9c1fedaded871556cf,08518fe412c3da6ecb2f61c7cb34e08990d4f713101e671412403b533b3f1daa1d925285106d14f3fcdaf9e5f5ba7c2d8cfec3088673e6558d76d573dcf0f64d01,0397a5bf64c037f279a0e6273103d931f40bc0ba753b6f9d4dbb94d6235fa4054d6a1dcf259140ba1bbbe398b5458c4e90726ab6217ef50ab61c14bd9e16d94301,0cd7f8751fe3a66d2d3467be32b8533eab54f8bfd5869890c7d056c4c0dc379d0bd04afd67c9b62ce149b20e404a28ea5232593e791a85e9e44880b19200a5ea01,c201331cbf8ac58ebc2112dc5e38a477f8215fe81cdb98aa23b81b97ac9a94106153f0ac506b078ad253bea8d8ae2161552a7da4ba283f17109242b9a81fc9a500,5a81152f1a39a53ca7f3794d9f1fbf02ca7fbcd3359ea6d7c4c6318f0afd90b81cd0e045fac313e0ab880e8a2cf4b4428c0f9047cee096dffb7338beecb2299700 +01,326e0486b7280a241d31bd0511efab8a40337792b30f4189a14ee53b132251ff,03868c4110b897f67ed64086976d7f03ecfc5f0bf9408a053b490f9ec18d9f890ec0180e703ff32a982761c405940c1e788b44ae8036fee1f11d11fc29e2929e01,214d5c4d6d46b3b28c170f751e6825269c35a6ca74ae7902850bfcd9864361403b07997c8748856a608528bbd817833f8a08474b8de35ff436b1bce97899f67b01,d85e9049f51a5fc89a55b92408499672b6bdc21a8106d3a6484166230ff9c8632022befcbff05809c4e3520736182045e7725906bd83fdc39939336caa9e786a00,17e6928509262c0c0559999631195c221f35883410cb5154b0d3634e3ea165ce26e93141d99a4c00ba0865f656817719b32098d620e9ec4dcbeab1d576d6618400,60ebbc24ebb7795e3f7e3d05a6170282b1e7a6bd699e9e34c3e424419d8b83a05c8df9b14e1754605cbfec2caef02fb915a87cc3aad5c0224043fd7144e47f9001 +02,5bceda349c0e1ae7f42562d33e0ae32b30f23af1d8e1807c0226d4a576d525a0,e3b7c2bb251f18ab8d0cd517d74a96d44c3d86fb9ee635af55ebadeb65c5e5af0b5591236b42de32adf0b939a2241d9578d4e859b5f8bbb2de904690134a971a01,d4428be0b15e707e238d47f4436ee48caf77bd1b659e98a3ce5457a9b562ea6901c383116500a815245754e6813edeba72a8aff94b72ae1e1ceed98eeea85b4900,51cf8c1e525642432e0e115c459c6d94832b93e03d2080f3633f3c666e00c19471c4838baa25fa8c41705630f11269ad12b4589b0ac38754e7389a6fc7ae0ecd00,50421d945f5f3d690e99e1dbfd10c47301976866ba125b4e85bf1b49923fc80f1599cc3de055b3e9773877758181161bbdbc355c061ec29716b4b7c0c40cff8001,aabb5ffe583c83254974cb7b434faa4533c922edf1470bf230d547aa54cf825e2c70ba5ae06b4c8b8b87afc5900ee81ba90c29f1127b2ed33c6a387c691aaa2801 +03,623b72498049d2dcd6d1cdbb718b90d2c95b30410399336c5968fdc6cb72d5c0,9a8d368016f6e11b2d55cb5fdf255cbee08df17c465c39932ca214ff4044662816af295ecd6a34beb04bd0e36350761ad9011659f12c977f57d84a93743c5bc600,95c9e6ea53451f367ba675c7855a1dd54a8cf1cd82b4ff2151c2f8ec8888326d78ebf6dde481ba114a3d906768b80939a9f0ec77422aa1c4e2f1223019c0364c01,572b0cbd8aa5f7f3b9c392704184f1c919b3ca22dcc481a30ec3c98c79e991fb72036efcfd7429c4e187012541ad32094e40c5431a7c41f22531ae9cae67337501,20113532ae468e90d6e12c59cc94f15d98819363789f5e2a3255cd1df556ac016cb87894b19d019164499414980091fc653993e65f76fa496e254ed2d287ee2701,299596082e5b2c219941fcd53e8889fcc682693edc7bc2982e2ee6aedd77759d074dc01c164f4dc3d930a33dd7e1784e225467598adb21931188be25a25282ed01 +04,e372fa7091bde516e28cb828ecb681664100371e225785586dde37f00c0cd71f,b3254439b89fe60ea5dbd9bf635f4f400fdfc0abfe7d6e63488006a5bb1518f515c5d8dc8e81e66df88d25466cb6d1e924a87aa2828207cf894cd5bc3cda59f701,1af8ea762e399569589edb2e5505ee69994886f826ab7592628d71005ec91cbd14aa284d5401742b82128652b8de11161fb183c19dc4c2d085c3a1b0649ae7c700,98ef976acfd39affa8c33562136f5f938dcdaa49c43bb9f5b3509bc045dfc2171401f3ee5126e2bb2e183c0749449d0bb17e2de4d97c0265b368978d417635ad01,ae318ec0688eed85444ab095c08d498105ea618a203a9e4f953500dcb9e45e3c646500afdbb5fae81e193c97db0f8f54ff5307c1cf85feb1d775240934ee582801,9709adff3616adb03b6e5e6b2e1ecdf85ff9f3994517bd478e30c604a0b1bc4541815916e8c0735e506d32f3086b9a07a62e263b187b303191c892750bc7549900 +05,8a4957b6dbbd67656de5540ae9a68dcd821e5d422615355329f23f051007f3a2,08bbb62b181830e7ba0fd0014caf0d280ef1a787698a9e1f6d672886f319238a1e06c767722d2a86153b32f1c221e52ff85a7997f3352db44da5f74e9ef82b2f00,0c129ec218b6cefec6867292f8d13f803f0d9fdf63ab2e50c8283d7b23a1c46d466d70cdfd80b6ddea151c9b741210ab677cbac3feef47f33129bc48f178f14200,49e7714d5430dfb5cc9f5016eb32c6af77193b06b5d6193323c7520ec97fefef5518646535659ec68ca80bba0f741620565c018f056c7a8a9ca717fd223d931a01,cc5bcde83722aae79e4aff9ce346ca38f28949507af3305aa8a4900e158981f44f2eeb8bfdc5824a03b2bafde724a7708764fb66dc4d3e9fa6be236198da934100,a2272d7371f418966c8b082a8d944038c078e12bafeffb6866b628fbb53112f851ad4f70a7a19920f52687228aa7639ae7bda6943ecd00b64106d3c23ef1302500 +06,2cd6873d3a1f7be37ae1ce91f66738f61b829b60452c140ac81bfc41633aa79b,192f2ef29640d3e6cc0c0f1c2cb03b569bb8aae99f81239e1fff16fbc5d6bcb230f9de4afa65185b2609c94d4f3e02d75190958f949f31f45231c7355e072a1201,1956431737caa81ac27e14abf8b0e28248e1ec493ec520cd27b00b8bd4c989fd1a1a92e2db87af6d1950f34267d3ee74824a910a47e57f11e7d1586bed37f0f001,ee2f1aefe7f14dc22ef7df881921a9395d979c878a04ad67a4d428e679b3b7d1263f23f89665fa6238fa42599f0f82dcf0e97384be81704182b58534863ce57c01,148d283b52e2e79874b8fa29ee871b71ded40818f0ad8d92d00cdb189b572b244e73a1d29b0829e9b97c70020647cec22ed0383c0325148d24cd46b83e49cae600,0d8c2be00267bd9429db343b6fe06cb7bbf2b1dcfa92f435d51b09f1d8e1ae2e4544762a3a6dddc70735724e2eea5369fd91db79492ad4d2316e9c59dd29594800 +07,ada2fcf0dfc14369d074068ba00bbeab39d983c35c393d4e6e05e23f25dcec9e,ce5925300f4a065d1387bd547003f9b495960f75284771575c69f0b47ca3c08c03fc5e3481b97456dd6e8faf6146aa2935cfcf01a20543392b834b28c2e835f200,c5d6e3bfa99e193c65e29dc695163e7309054f46272ee2d5670b2e15862489b83c8e3c2d80fb7a2841dcaeebb6ed543a876700724adba9554b97d1cf075c7c7001,976f49b262cf0564f2dfc2a4ae23535a98efb4ca38f458d9603e2fc558b8ef5e581a9ab922ecf524f3d441655dcc58b9fe1955ef30418d8c260d1c02ec4584ab01,3e4b10ca41ab8c94cf925050b78032da595e8a3f63b13b17968894b7dfff794d5e172d8f49c427f1a12620a54e7fbf00b7f6e272cfcee85210bf7a3af42745a600,f51249f7540a6a57b4fd3a76b4c13f830a1808d26317d0454e518cecc2bc3ee50a650b4ed951c7b375266e74d10eaffbd44f2d9aaa7764cc2ee4ec079b66381001 +08,40c0599d8cdf00960ec1fe1184975b0cbb063ee4534653753985b55e5c0c11f8,84627d0302b375adc6d080262d87ca7d19af6c84c7da2ff3fd08d4834bc8b4041b18fef164e1a6c54500f9f514c9c12d228c308ee10248ce8d36de11ade93e0300,3259c1982f68c4e7264e77cc6cdfdf2c3cd56c18e7b4ead6770a9050d58926ce76dd4ac7f6d5aed2f60b09c79225df0e91df8b076e7cb6ac3910193f7fe4429701,86c665c487a705f7ada1ce8320400aad9f452fd607652d539b6cf56261fdbe3b0d2e4681c2552ef5c791ce82ada34cc9d72cea2a3e0c493b5f729e00f9616b4b01,8f45e9e6fc18e62677b1b9729f334189b4ccd0e4afe3e11963b957611ac3871447e69dc6dfbfd5dc77d064e765e2bb8fe3dcff18d2382893bded76261cf23cac00,4b5bce9459a9a2c211a9d54657d4179ec796328d15b7131ef40ca14f7e8166ae260c54389f853db759cf20cb52ae3e929ec95d2476a6eaf07f2d02a7700ad12400 +09,1a735590f9b8bdfbbc8fdcc2f7e02202ffc16dd37dc1c2297869eeb63e3f3336,bded95247871fed72c6d77981b10661a85d04d6241f51e8bf48928758063cd5a24053a82a5505dc845fef1af6d130573a01ed15b597ec65ecedd419013f91e0800,724647e0ec5247e973bb5c80c1ee16ce2b6fcbf169a9c01ea16d7bbc8a3d071d3adc37eca50f0e20d14629dbd8fa78c89d637087cf654dc8af5a56a5f62b906400,fcb0d1f9cccad9fb6e1acc953e231b18f9557ff32bd946e189b91caed41b40fb5bc56ea943684722180170d88765b04c80f9a6aed52c5ae90405ebe2860a516000,93b5effa56a415bd7ed73d969513be32fc5ad6ded9b96dc5eabcc5e4ddeee8aa128c93b306809b8c9e93d53485be47adce31ff8054684b4b7f31d953887c44bc01,6e8f21c27c373f4c39880409b982ee866e1001a260893b7a05ba6d4c2a79fba038c06a992d3d3374ae82e043b6716b4f6640bbad7177f669a4044e6ac602dfbb01 +0a,4ef935c9d1b2a583b4ac41ef191e2b2c9cf1f399a6955431176684c8771d754f,93350f6892f3608bd0ce0be524c3835a47c82ac13bc649a71c7159d0dfe0b0252697401ed8201ab8892480cf22b76f56452cd4f478e779cf71fc7b460f53d0ea01,a8f90e1a173a78173aa013a53644f18e9cd8a703eb124bab04b6fb286fcb7c1539d3802dbc533c106a1e6983a714e4fde41052b8e74ce5801ff544b230986a0001,b79afe82fe8cba27de2d33598f79279bbd217d7fcbc4a454fd3baeeeeb0028516337aa3547bbe1508754776910e02d66f04294cbcc93cb641d53fc18d80f414e00,d981337e645a4aa036c6c5892ae74a5badb432b94e7a9d157de7986ac5b18eba6462221b7adc08dd4b18faa9ab3f27d31e2a7f874ee17f90c5cdeb53dee473ad00,90455c93dfa10e32ec0116d8f0e8ec2293cf9bc856a6e4b60ea586ddff9245f56e6a588a9f581240740de5bff4c1f0ce361c76da71ee69eec57fd26263ab83e501 +0b,13d87d1abbaac219c894d6d0b523a0e290b1285d3a1c7e3e5537885730f89079,10b466c535dbf92c7568ee0b87570f4c856700c8e643a0bb8df7d2ca481954b83d46993a1e004f0ca86bf04dfb8d295006e06fa268c80e8562c557d98b46866a00,f7341a5ed0d5d9e9460292a45c993d10eb7eb9b02d8605d431de14879207d13c447d867f4c8dcf7aed5e7562ea2dfcd8a245b2435097e9c92ce904a49c20547f01,7737c66b80fe6e439374f26658f8dd0b5e1d89c53e30515cdd00c9d15c69881d506530bcb9aaaf8579069a126b8d1a3463612697f2f6990fb7d77d02b3bf748e00,13764d9918697f9b5b7604b440624e30a4f53bcfd83d919ceed0af44e202d872477b41253dab6afb3ea38e1af9135915f48e59299dd59494901405979945a82e00,c6f8570fb1aec606df79b635be23a2551d0559d8e9a240af55580639de272cb56f1e0d6e13f8ce94ffd2282b34d980e511d3cb4ad697c12dd8822f12c024044d00 +0c,521aa6a2508cbc0553ca6a89d6f825c28b44933e9c836d6b3a4ebd5afc239dc7,cb894a85e343a47ad3de1418f61affde981b584b1fc81190bf0c50db4e83143f264775e045992e0791e232d0dd9a127b9c25edfba8afa9939780e11d5b27818901,690aaf89dfd6006d18fc19e80cc267ec66d3980bef1d16e44f4970d2367040e51f81e9aa0ddb01185a3c04c159a3de2fc8afe2091b955af47237497f27c6a60701,a9998599adfeee7bffb4aaec225ff4411f9de12cc025ff93ae4722be1ce59af31838d8de8c977287f2c3df1436c5de7d5a1ec4ae1ec13cba529ad405bfe5dea400,5fbac447b6fce33de6694e7ba703f20f37b3a84ad6f14604fc7f142c96853fba53700c96c1007b402d1d587e20fa8f48868173e5d29d021e5bf73a17aab6d07000,b2c5295a5a8c2f5e1e30d40692c3941d163c0c4c0fe3117ac6921272e714a060148c7e250cbc5299fc9ce0b2504e380b347d458f447d1745e62be832cb02c5d201 +0d,c494e791b153e23785938bedc27de0a6a612711e45203a61c0fce55baee069e3,492a496e1ca8b1d0a682292e2ea6d9ef03ae688ac37418894fad082954c9239a1e6f8bc1e0a7673776b7252fc7f43046cd0d82c7a1af07f1c407cab6c67eb26b00,f4af16ed67c94defc8d364df02dd1fe59e45d46c22e7ee126543140696d9c2c16ac51ed73ea35c8111c6d4903196c65e63da3320ba12a4deb90d77286e4f4ed100,602ef8e7f9eb51c01676a7d0e13011a025673b0016e6ef217afe4bd69d11b7b9296201f301621476b7b3b78e0c26bb4a0801b4e5e11cb8c8c47b7f1ed786817000,1c677c18497b6428600ae8958b71d1382e2a2242c72df9fa86d21e688990855d7815ef4b48a4a53d1762df250b74cc5527d77b1e4b6a76c6207917b426f3eb7800,e573d27e75fbef9604a9662d4aac95c3c5cc65be41b2912cceb23282c32c16bb13614b46677c591442085b8490cf84de2dcad0c719a215fc7c8d5aff714c549e00 +0e,de0bfe541dc53772f9924a850b0af5d8ce5536979d207d942ba1590c6fe3b4b3,874d663857ec1b18652de3095373f720666b42acf29b5c6943d9f01bc3208c1646a51ee20a0e92027db5387c8f38f12c0d0e73c0fc098dcd1536560910b0357601,b647e8c85f3fadcdc34078518ea5f77a478bc870f39dc131f90aa0582555175600a7cf870f7c3ca74b62c45fe80806fa7b6a3e71afd2191ad4507aa05693122f01,70241cb81fadb598db04369a28087a0222e3b057b3f13db04b3e7bb9911c2aed68c8057d7e27fd9b57552cbb09910ad9fc53bfe1d5d748fd6710fb55db6d3e7100,0a7f5e975e011f25d1eca9d6f04f41e5a50749117ee87cecc95ae4a09236c0ba58dd0705211807ebe1794d8184d1d1cfd1d650645debb2017356051d861b8b1e01,576c7271dcb915fd3731889e15ab7b51b3dc80c53bfcd24a5a725a0cfd10e1702f27eec0d09c597e72e03c1162af5dc893883f1d8976d755665168a61858974601 +0f,f8a23a4ead8bb2a2fa05bb9369e170e386846bd85abd27132f8adc7ac864f260,4e8c6e6f28babd7cc0d4cfea54ac2d14063f68f9fce094f2fe129852cbaa2f5567e0183dd729b8ac59999b76bea87377d42bfe91d6ec21494c57889b3dd5b73100,f385e958e4bc2c01da91492cf5858d91e78906bba8dc9bb5bf299932d44ba55a2e0ad54d7113816c32b1e7593a8a1ca04242c18fafc4caba5b034cd345903a6c00,693c9640211734c2f69c3f692967784d3d588b02abe4ce638acb06eb1e0c2bdf67841883b118ee441ec3d4cd787be69b577b892b39080971e18ecb72d689039d01,300d02538a0e44c17a2786d3170b424f9e554fc1dada403d2bb36fe50fd3e60773fe142986d3343271d2e275d6bd9207655ae72a3231a384238822859a0756f100,4d1b64f6d7233a0191ccba4ea0a85aeef25238df8bce714639ac91796360038a21a02c471952d76777b4b6e150c3dd109803db9dd9ffb60a9199d2408e09e4cf01 +10,510ee1bc1ca2b18980f643c9f1436e3e736cb8409cf193c447d278165e48dff7,bc6b80ffea435ae2b00ea7e6dc5f1e48dc7c953182dc5a6e7917a182ec02e94e1097fa3ff6c869b52afe004eecec324f9dfde2f2f142017ef3e6d795b977b93d00,86b3d874e36306486e0372f48bcd686a4897a91ee2bf71b1dc06c3308510ce5371178af5d95a16dcead632948ce33467ab225cd93077946896a54315b36a79eb01,9fa24fd76fcd928a935d315cd286cab5960dd65ea7b2ae0fde6b165d43b263de54f89ed792b513d5a6f091b6e8ec58bc5ebb3e8ccb97f83fb14b217d35db14d901,d90f557754090677ddcc03b76523b69a2cfa70a99c7bde7345eae35dfdec7172256c6a0b9ce70bbb27cfbe928d292c3520ee01a6348580cee320fbe5288cb71b01,b994a7e65326b96e3a14bcf1e4e53a179b6345aa91ed6196de5118e6948fdd45032907afe25703cd73ce5cad321b1529cb0986cd5837b1b477faee74d15d981700 +11,9edd3d3ca343ba3c2aab30cd3874af6b06bef7b4491abd10f73d908bd8d14809,43bd05f5563cf1b22daee7af3afdb59bcc45e229649412170732209efea2cbe861a68383bc83eca52b123d150334ac320ecd929a29821205f588cf66eaa827e301,02082fcbc32412701846b5176d607964f43cf9daee19b283db0e445c26c5ea2350d66382984000a7a9404c0b5de0d0d9af783a89da15eeb6de642943a578736101,f9ff7dad63d9e5966a55078a15dcf641730b130b2b0da0f3781b1bcbaf4cdcc458c80455bb5903fa0473c26e1714dca3055855403449f9dd194523e9a102815b01,940c93527e526d610a2dec24d84261ca3cff770ab78d6ce2604e9f296a6aa06550e8b6e08b64247d38cbf21d204b9dab3b2f128a87711f06560560fb38328e7f00,24358b48a65788f306590aa80213090e57305ff39e90662b6922680d58a95b680b1ae19e88530c080ecf690cb1f8fb47dbc1cbc7ecd11e7bcc8d5ec1efcea5d000 +12,ae9a697c72f91df018dbbce18e3c62b909c77f7fb688d75428c0c812b78e2e8a,abc968579c60a7fc190329c2fbc725aae833c046a87aa0d5554752d342892945484e7cbf8970049f5fe4dd41b43e158a981eb7bb687ea9c1fb334c10f8918a5701,7b79dc8cf6aa137c849d3cadc00687d00b85f3b6b9ad3525898fa874e823649a16c6fbd30dbb8ce9d6a0181fd7c6a116374286260be823050ab8288848d5db0600,7a92aac06a9fdce4147ec04bc2cc36c897385166ee476a0223d0e8a8830120f77cb632dcbaba37ed69c013219fd561c9740860d23386299520039764a62d6afc01,e1137c235dcd7ff3ac5ef1a98c4f7913c7028c29fd56d623e21364d6bafc6cd604ce1f758c4a01ad931d9bd6d1b2798ab9728bc943137965314557377d1d40f200,2aece2b95070a8d843538157854d088f083615cfad2efd3fd1ebf1e725179c3d1b62fc3e9efe19dd76d30a4ba20a9f8d3225eb5804c7b3cac9250c7ddf3c216201 +13,3a9d3366ee4953a12112cfe7ab5093f1d3d357a50df5c1716f8e7d42a9b7bfa2,099b3159852f3d9a1a87d10a38c0695ee1cf7660035095200215b7f2a7dc06db2650b139e684a3797be27046f930328c5dbfbe2b814aa92bf5c9858132a5ad4e00,68c738ec028d5dc43d411ff65a7128bd624a74fbad88e110d31f934d7cf2fb9c5901d03d4d28bcc54b11077e3135b3aed763694a9d7f8046d621a40483480f0100,316da80ebb8d4057f32106c59d5efba7b06e75c65bcc01c5a12cdcd6e8d435b00be4f244ccd4dfca3ead697c899c5141ad4b6d75316619642b276d72c90375bf00,ec6ddc796f4100d4d1cfdfc338336d6b1374deb92a4acec7141e9b8b118b8525631d7ae56eb18bc5d8df0c021b771e6550925ff19a79976c48ff8d857d97b6cb01,7e53ebb9734f7c515bd85d3e60d85a84a07a9b597b38b255fb477736db8608005769ee6710677d451b37025fda0e8348c8350ff4059172cc09775d9dd7e614e501 +14,702f03dd565d771568a06b354ee7d73f1988364e008e0e1437e4f30905262d2c,9a2e6f6f8f9ea4cd565c2ddc10c3a84f7e96b3b864e8275d49bd45bc7d6045e164b9ff7e898d994df123b36dde4a54711ccc155c31fb7785128547a9cb4b79ce00,0d98720d373b6f861490f3ca9e909027ba73f18601bc6b2f27227e60f69d629a48a2d0c941e37b32be6be428780c82367fc23f7a402c24402bbdbe9d180227c601,3532957b18346b453e089d7088ef65f223573f83a918cb99ffe5a030c87afe8d4d95eb99d9270b7ab70be401c3ecb63e1f8ed6904a3aa197f44b30d4e84a5d2b00,bf21c9e01755c90f374f7d3eb04d1df966146c6159e403535a7dff715f71daf30548466bebcaa1eeb9519eca6b4b55414e86e2fd0de542c5103694fd71039c0101,b26a2ff11dda07b8727f400042be6c0d4cfb9edc5142e4edd554d17d1406ca72104b464fa9395162d09c6a1011a62effdcddf62e428643febd8dd628f615bde500 +15,ad93e087108a40b81fd9c7f9bafcbaaa6419c93416f17f0a221dc36a3a2cb240,153264da97ff6dd9bb3292c72c5afcd3597d6cf5c02e748da65058b1d56b564419020fcd9a0ade27e95fad9fb1bdbd8c1166d614ea4d462dbed18585f945d1e300,ea2987cbbdcac8abec3783803732b9ac33a0d91b006d4c1d517704972411348750374cb9a20902021ef2b3aef39bc9079120b4ec0329945290aa5ded2242f45f00,f494a6b72adec1497d5fb3e34796a602b24daeda7b053b675c138011cc0baeff2a237c248980a99f21abc907b11d293961f50fcffa442b71286cd2b9e644b17f01,a4a25989c63e61448f6562284073a0aec3d8adb38f8ec67bca95a9088687444f59d35068e8fdfdb51d113743bdc75343d73afc2505e9f2a964a7e7372038331e00,110816b3f53c5bb72e7dab562f593b09227922d1cd709b5862b3f50868babafd19e805d2dbec9372dc0f038e3c3966ef40a6f55545588e9c9567f4f7daf9b05b00 +16,a2ace82c85e712debf75a29a5731488c2a88c6c3b863e2c40c215f47d486a313,5ae5deba954816375be4fc556956b11df8fbecf2594feb75bc30450dbd080f640c3a41ea6b272f74fe59da45021e7af8f053a7141c35373a12bf91d1e071edd701,d4264f9601744b791b382135d5cf20b5d7d2392296abd05a11d329ad78de698f161fbe74b8bb76020a01900d63351728f91cf97c928638dfd38ea332e06d502001,2a0700e4f996081d413c90bcb1670734ccf725015fbe5c03df1cfd2d92713b77790d0cd5591e3ebecbf24645882c8b92fa07b88885042db6c719b579bf904f4d01,02d8aad7a7c1af371c5c2e4875a91490c300d140370dd2a7bc085036d266a3a066556f47ea0e1faf643154982099bf64b189d0c1aacf97fcf193f6ccb83d8c2800,f7b09fc587c660c2a3ddc50af5b6f517fc01eb4987de14ee801638c3cf009d273c6ae0616d0d19ab9d3c68c9c69b62831aefba801f50422b78396a2e9ade127700 +17,80269e3d96cb61bf27024d3c2681a9618eb23558b666f339b4f32c93ab2c06ac,0999c52e11bc7c3d4acff4be81b952a6a93198e2a35d2f8947b92d4cf1636708370fefc98377b8fc18c0a208535251c8f6958349c253c30296e7394d5e58869001,2fc5f0c6a4ab8e817aa9922d05b8f3b10557606a74b0cb0f5b9cf5a255993df3387c3d180500880d63d6f88cd709490150ad47fb0d1076b2dc201709db92e1af00,c86c0d6722c5371f5d8006eccb0d197ba486703135853df17f37877e2a11e5b63186cdbef006e58398bbc97bd88930533d2af37dcc8d0c33547eb836fdd5ea8500,8042dc8f5f4a2afdafa4f8a81c1ef4d1dce6cd2182caaefec4f7a00a4d7e3372091706c964fef129e1cd1a79b72c1b0aa873435a1cc9c2f8e6f2b18b1ea4467200,a008a1a84b0ae5e28757520f3f4d37b4720436b78898e26d77c9f0b1903460676892750f6ae20fc0335fd9e01fb90c335200c9f83f3bfd827689f2a4f8dda55700 +18,2489889b1226f2ef6aec39921531091e6ddbadbeb859cacaba32262eef4393b5,214fadfa7ab3236e3ecd0680aad69646711b690aa2fee8ee8e3c09bffbeaec6b0a6250a2c01e04f1678528b99339038e57378d13f8db7a33cdb4351340abc1db00,9bf2e2df6b362933941f0f91cda396da867812b3287ce3618ae44c946a7adf093d053735fd890fe0d3065dc390527df8c08a0aaf7882811bbdf200e14edea1c801,a3c3f9f7f0761da1f2fde290b1c39fd25ecd4d5dd6305a807794c63e4d54835a22bff5373ece55888405438fcb0a4a9fce597c6d3d6cd2dfd46226f4214c826a00,b8e3073b08660efe8e6fedc056186bb2a7271d48723341adf1e2d7bdd54db2b83f2269c5cd08f234554c683c5361071734e13bc0867cdb1a19787b2fa37c307400,eef99f70ac8d4460876cd31107540d8ed9195c52aa1f40d1b36065dbba8b284d0d4cc019608f1c0d33625a1347414dca8f710b756be3c785623c6295c379dee101 +19,9aacc20ad8431b16e0fcb1ab47c2d218a2180f12eae4894185ef42726ab21f28,f8a122e2cf53397746329b6a16ee138a5921def21532ce34ee758d5b3674219443efc33a81c7908db778f7b42b907be30003ee6ca5d7d8458f227e7b9b2bf1d901,dfe48626a1cc0c92f1fdd69c5179074ecbb8343c77d77fe9507ef016b95a2b742440ef29b3b4e182313711ac062f959238b672719ac1e92bd77ca81c798be7f500,54f3241d6ae25b41fa1476587cbe0f3faaf2c3167e5ba482232e6719dc0fd30f25002585ba5f8608423584d71551f1287eee4258940b20a001f0315c6cf29fb301,c3da8bec7d97c255b3bdf4dd7f57ae78bd9fef374ead77e430e7bb8aaa101a013f7a1547b9b74f8826193f4083398368b3bd503771b19e35565e0e8f55ffb66500,cf952237deded31432bbd4cbdbfca8873bf7975b993232e763e20601bde786b17a93a13d8d9bd71315dcd7c42a6e9bf345380e7540794d5e9433d2f78c239ab500 +1a,d200455223b84e0a64f8fd7b8dcb72fd0c7f52dd30bf9a141aaf1bee48483c01,20659bef266a86ab01b0a7320f42d207d6db941c165e212f2adbf1347fe0ebf834351006925d0f30b4b8701d0d6f75c1acdf9641467ab67eeed6dd85b27cce9000,c4aba13bdc4d00408051de618564ef966093c81203e1dd9101185dd91ad3844545234fd0eb94691d259ffe5a27e4e759b299a712248d94c448dd6af5535479f501,3fa397ad8c8d0bea4d95c39a285a3a0f2309b051306b4bfaeb34056c67c969717831d54f5d7968315749dd0249c2ec272f1d029a2836a95c851edb6a2dabf4bb01,5833be9f46335be1a59eb0fbdc3434379d06a7871a90f5306324bb5524ba55f05f699c5a97e8d2f000e5860420cd6cd3598ce241d81e80ff8ac7c3bc6404e02900,25ead32dd64db8932c1e9c6b2afc0fc6441b4b2bd52d902f8aeabd8cf7529c51757ee94978d8f5db3ea976b3edea0fcd3860812d6ec93c37f124b4e1172233e700 +1b,9918f40d0eb29b50506be493bf06e4b3acea19fb3d6725b11d6dc789952d70e4,bda723bf5e1868261d763e4c08c4c10bbcdf875a173bcfc0080b7772c4b06d9c6f552f45d37728415e1a91561a92df93f855b42f8fb95c55ca14b7a2e85b192800,8a6604190cb5bb58ae6d647c38a513739d505769179bc0cbaeaf4c3df7a1451b24703bd127312ccb168ec52baa6dcca4aad263657b553be05eb215cbad33a2fa01,551fb614ccd1380ae4c24502afac721bdb246301f0830e5f20b95644983aaf2e47767e62a62a9751bac2a3d1a29089b02175fe0d23921137a1c347deef54de3000,104f823cc6859a24f9cf8c764d6e906f13c22d424440c499f20bb2460d21c823089e2e29639af89b4623e1b3c7532ae816d89005eb6dd5bf1e79891730f79bcb01,2b33645cd3ce300c123c369622140364e7577d809218c37bcd3e4907d19d568e7706844a00abbfb68fc177d9949dc8385b0e3eb441ac5d2783a570ab57bbc0cc00 +1c,0b1605ea2fbf66871cecb299fdefcfb4a7dd333c819d6867f2dab64c5d8ff4a1,7ef7c801a9c4e5fae4707f328d6d4a4c33e78461fd316c00bece31ff036b69ae785c6234f59e6b5e8f92d2a65edf519b083500b20343156fecd7c50313fb8a3c01,edbaeb1447995027f81abfe38fe77cc0b4c01f8c9689ce1333730235cefce3f13a6da56dea3d26ec2d7a6edacd247dda7e79972a406fefb558fcac30b8c9836a01,f9fca2292552fa0179c007bf00e3f86936d495fd3470d0beac58dd3acc9e4cfe51b28e6d5cd090ce79df9e91ffff6f77207dd602e4bc6156998fd9ce3724e9fb00,e75c9bc72000d95e082d75f28a5c3bb256b574fa58fb234e135fc97f17a50ffb4ec7be30832d4e7c761a1685163a4dac6d6428c98bd6a3065f2f8fe430d8c65601,ad9d2cc762f94dd3a36b1b86b1bc006b48988e892f2d8c80d7a2fbf4f30784994499946dae7d62accfe3b4e0ca12e1c1c0fad73f534b76b54b734390180b527e00 +1d,5163b46fc24b1e1f25b51be522cc66232c7e37d964de868eaebb3d0cce81a0ec,5233a64a065f461e97db383c3d1f63221bc9af0fbdfe46501b396dae21faf52f5b9c7abe18bcff8e7ff5015d302e6d9e1e3ec664bbca81129eb1a76135e102f301,a664a1d3a24546867a5e2b4ebf4fdefe9775d28139f79e0981114089a9b7d10751a1937cdc81eaefd7aaf5f954ff65b6d45e94343b8fab821059786227ede41e00,bd0fdb815eb673f20ff5b706b39b5a87acc1a4e2090fef68ff1bf4f86014b2de2c2370624f56c45293844a31c669de8e2c53294523c01db03016789f969ded9201,f87ce1881fab5589df2a10d55b96564256953725b1bdd5d9b739d3f94fa40e566a942b6cac4158e41a1592b8ea7d63eb34173f1ce5dd78bee56959087db6d50800,95938559ec6de5dcc8ed925dd1b7b24d0d5ae6304432ede6186e64fd3aef4b333fd9cd5e4afe50f9f96613ddbe52ccb14def16e3ef196db18d20742470a6747100 +1e,83eae40746a4856b703bf1269d1f52fb722eac07c1660a6c8f46b9f9d8861e9c,38a84651741471d092eb576f84a82343a0ede6279a725808f837e035a0eb6bb60dff3612a8066168b53b72e27033ba875a0e5a2f707fd2233897ede64394ef1f00,530a5ef3ed37320033326e296c63212074b7a721bf5a90605d06825b05b9569a2198ce3a3f8b3e79abddd3591fafa77c6d558f3030620f7f39f5d6fe294f535d01,e07a52c823e034a02077bf34e7766e9b797c281408cc3484e17bfffee4a965c1521938037dafbd00d7842a951bda8cc7dda4822a5d25a2fbe65c2766c50460ad01,bd03966858c73e40f400fb70231c23f54da3be3e14ecf585ba2ca90a006a1a0d0df72055f19ea807b58a8ffc55aacfe5c353c052bc95452685e3891acfdd333001,397c21750e739421dd52490f7429c927736b6b7d637b8a1deec68393a8254b914eadf92b1c747d9ee9b8df600335d09e69c45f66b635f24454ce7f0b6161302d00 +1f,b750042b732539a4e95a388664e0198c409716b806861383a28d62f02bef8e8c,d4281ff4ba474ce589cc771e03208d8d7156b92ff19f8ec9374c92e0e9aeba7645b0a40d7ecb19af2e39b721ba8f992756e9cacf9cc6c83ce645ee51d0a6f33700,da6394beef631968e86af8c13e0bb14fef002e19230f444aed966307f2aea7d45a4617afb32952bf4ef71783563a32c8fb3efe4d7f61d1fbe2a29ff251e71e2c00,bcdc6cfa38b8ae4c7d91b37ab26d8c6c5634ece74b1f4d490cb086ea3ab427ec13514b0c71a52d90082f18b490dedab2f93068886e9bdc8dc7cb852e7cdc060501,ec1ada0614a10414bbf473906cf7293dc414014fd381d0c0b682820bdeac39f44cbf85a2111aeda06418ad1b68312d08c6fda6e2c2943565b1095fc9b663ab6f01,a03f31f04dd5789249e45b3888750eb311017a1d5cf08f7c1cef34d73161863315ee5ed42af1dc65ea3df6b7311b05f0f5e2e13b417509bac8427232e867f49000 +20,9c8bbf78fe0b2f862b766cbeb281f07770fc9fd9256066de32e95541495176df,9fbb949bc2d5384118742d9b9d829c1d1368e90dfcff1c7cebfe44742896d2954b7e8341d3d4e7f2d309482e38af1859d87f91a2a1f6d5a260e35f44cd865ad800,96357b12b366c20569a5890ab547756c06440a2dd2ea7c742ea5c7aeab22ab8f6b1bef4830ff0a05ff2a1a76bfecf179c1e58f78e6be01af710bf1e472a4968500,3e20004a1e7e71d90da8c72581f9a6eb4ada7d5fbfe1df916e0b89e05a5d26c76e1896fed41af186716d1a430ee2c0ebf3f5a1963b58c971a6a7730c7e39ccac00,47ee2b4a7831b0b45e9a3d9bd73e0e3b274ee582a688eeede322e8fd6d0adb3e76cca7b6df33792e925434cac53cb1730fcc561b5498d86bbe497c969536103401,3cfce248bc9962e2bb9ae510bf188c5c13f55571a4d056c96a201bda0583362d25f5382de6ef2188810e923e32a81b8c9109982a2b59447f6a6d56a5b3e70e1a00 +21,54d6f7ae8649d37670a01bd9b2d11ca3128a02ca6b7535c5120cb2d5bf8a500d,fd0732b57a1f332466c223d6ebf1556d1625ea7cf05fca2b2287b833aeb061ca24665fca128fc8a6de7df76aab69918b4ea1b9a78569dde0f2ba26295c5f611601,5c24e2d9dd616137eb0b56b2f27daca6adfd9e4f624c3b92e351ba498e55d2f903ca5337141db2ca8df1ee36b0bede3bb52c194d6c177269ec9c385408ffe40c01,2f1a34a1738f87025edff9d7f482e05248e52a10d479eab0b1d72726902c27177684c814125c2655b2d8d1ea172537d670e6b7bd46a42c3a51e01e328e2dab6801,14ec079206d7dfe726f1811dea8de49d9e9edaf8f1d4f78ba83cf61d24438d8e1bc1cb7b81a9e244bd96bc9bf5e3e815964e888249ed2bd1d956e34fad57d5ce01,7fd992fd80ac7af129fa460089d2d34d7388adbd7f9e73f2c726765f22fec1c44042a6a82a09d820a62aeb6276497efe622bf1213959bc0bb9ab8db6d84ce6ed01 +22,5a1a30c6e10c57eac64ce8a895e50960e6456003481d01647268d6113ea23efe,d05644cdbffd85b44146d7e7c0d8a2229e25b5f70296abf797f49d6e1b6f0a0a1e0d9983c0b7dc7f1080863e8d20cd68244edb1b4f96eaf5ec0c9db34194a35f01,6ba6126ff1277729bf294254f948345ba4ec9759e20c9fbc067f1403408ff90b54c4ca6242e3422720ded025869907603796c0867ea2df084b638980323ec97301,e4b41bc259726de4969e8f805058d10cabc1b17e17fafced2214a4125205e510409b27c7550db165ed597a3f279357cee08ff27ba3f2a37ad6202cd30a2704b700,46e05bc9c6425733a42171181c7637f3f2182bc6a32cf7d6e4f43c231989ceca61dc8647ee9c550f61381498f86db739f76d545b9f8e6a883f2bdef3ac85446201,99bb37708d7ebea480faf963e8b0657124cb668320beb8d46775620df40c5b372a066e48502c5658fd4daa3aa5ac69809732d7c4e07576ed06a07da65c73687f00 +23,1101b96b83a745e4ce1284758e1eda6006b86fc7c884af4649a8be11abfa986e,aade623b2a840a9c46bfa2acc891035a33e205ad8dea13931c4faf780596fcd212d23f528683a8278df8a6f13c6869992b3b589ea31bc5beca62a172f89c3ed701,ae4ca5ac68f8ac60d5110c1b4ca202d3631942643bc8f8c9cc4b845424ed0a4677d08d2ccdbf6d27586533300ffc73ef2bf1ad859956f05a0618f631f25617e201,31ea84bfd026a95f6f6390bc87b9f177ae23129112e2d5eeff8f68e2717a0a8819ff2a29a5233ede1ddabe0d49985ba89f5827bc10d92dd8c293e460b265b41100,9f47d8a25b8bcb04245aae042a5265295fa86d1caa942fd4e187490bfe5156eb4f94414deeced903e78abe7be2e75120d4da595d3707261550db46bc3d94869101,40a54f98df8998f9b1c46f98f4455372d4424fd99bf93aa549dbca064a6b4b790d2501aaf0edbe6fa33a6f90465e9989a965ca11e0fe5cab15edd39c37a8177b01 +24,a154a0cd2c93fffe85d9d8cfa8fe95d67ec6d3036d5dd60c2a80657adee03330,afd9f815bf2d7bffd7d6cda948e86499f0b2491a1a1a5f1fb94746feec8f8cc15a817ffd75c2e5c6e959f7adf316c93f06b71e3b456aedbcfde4c9c1dbce623a00,2d764f65a52fe31d7004308b9c681cd4a71635e906e4f4e3e4dbf4517eeb1ae851d0f8482115662746c6cb5d1190875c5ee04e998d78aab1609bd459807f5cee00,ae9e744625d14bce281966842bc5645d5fe76eb9c3f83b3f3640859ed243c82434f1948ef61da7f522ea526d220bce2b1e11d2fd586214c1487ee243e3343fff01,cd0a8b92b03a0eacff7b274bcd4a5027079a72feee69508f029bfdd7d0e7aab442a13c4d26bda08caa31e8ebc9393857c2db25894ac055c0084b394ee907b50b01,3dcef19ae4cd36100c8bc68ada84705b95e5542814734e28e37432a4ffa1d4c07e44f63d7a952288b7abf40daca6ae9251cbe2282a23031c36f8a51a4dbd782500 +25,1b6d4ec7fcd9f5af8c9b9b15bd5a8bd83bb23950b781fa87a3a12b73dba492e1,add107fd8ecc876eba285f9c9e5e517696344fc49e2926fa2bf2f91966bb73bb3a0ed7bc71037065e326968b4c71854178abc0faaf9e679c72d1918aa74448b901,36409e1430c76e6182c3ed0cc49de6df631a2acff9dcc1a6c4f8d6ae41e48b8312e5971a90b36591826ae2537bf107e1532f51d7151a272d95fa6054debe001200,622ab663d8d947a0f4bd3b0d89f70725f20104bc1800a445456a48eb024e89be6988f165bddc658cc89eb3258077017d3b127bc47283fd91677389bd8dd0400f01,49591553398859db6b58e0d020f1a465e8b4254fe2cba7625bcd5e9a0623e01b7659241049ef18c2d309d5c1109cafc56d84e47e208226824d56acd456c5fd1c00,3c1003c9bf482205d45d3196346498e0c5f3179959ee67edb9107ba1842980d57ea8ce090a15c18c11d3c084f05f9f2a27812bbce8cb14315430048263bb90db01 +26,5fb861eecf4ae0389f7ef00fa86d2e3df3c51a748e2d3eea903a8222515c594d,212c247e0593c3075f0002cffca45fffbf7d10239f82d45cfa0f8dd455dcca941773d254fa98a2963d835e403a9555d3890a30a1100239e10151fc15deec386f00,cf652f6ff5a63ca54f36380b8e3cbc047d16749b3bef6ffc8c7d30adaf000d603b74fc6b93abd86e5799ace0af04f3594575e5fcdf24f05d0e657c8a92f2147d01,84d72ec7111ae6115653601a155294a19b6ccfab40c6eea9ead016dfcedb71113f5c2df77473004bae51c4935c0ab6f8d51686cdab88c5d1eeeb992af8456f8900,3293707db9399cff4968c8b18e2b54ab511a43696684ce20ef6978f0398c037e270613b5c18c3b550994c7234c56fecaaac6e7b34fe1f229a5f1bdb89ec6622f00,ea3e33aee51493c3499e1ab55fc7987f69f3a4849fe768238252b938521596a14b2986fe2e2013320e9a7f941c46a975b0cf72dc866476f17c0a02e87787251d01 +27,fcbb5ffc0b2be3562bb434bfe9c30bb106f2e6fc8df0fb6c8b421502c5c37664,f9b993c4bf82a308d519a80b968c6334299966104ed96b066d2a023acdcc94535a724f63fe5430069b79ec3055d6095b5e1952f946a7f581cb9bec979d40e03a00,47a0a144ca86aad22369467b89a74f05bd005bbfffae0919a56d0ac49dfb79c7642bbd2d27f339b20455e10578efc5b2270d288b1a244aac15875ea3a7bd547800,6fcb3ef6aa1e287decbac2d8c53e95f4fffd6ff5e8ee78667620b50830bfd3992c4593a2270cd9e09a4f0b69e181e8eedb9f9137485fbc76b9d25dd96587cfd501,0d5af7966c0432558d65e5fe016b22ac1ae605b1f394ff7d6b03287b77b4c3b35cb43e029ffed70b2097aebe13d2ea5e9cdea0fcdbdf1c0a6c17aacff42b5e4501,f4e8994765a53dd20810835268e90ec65d269f59a20746fd1daebe31c63fa24c430f166e421ebd380d40545cb42c02c4036459155c43c9e4cb08b1a3a50f785101 +28,5e63933c0c6b7915174e671821672ca82182b66de3cc81f4ba0765731d351af9,ef1c8156f4198c94dea2a5353f5f3351b96533e4804d615533401199d6fa4f3912c11c4257721d1eee2b2868633a247967770965c2ed4ad57e32d438b2bcfef200,95102b41c46cfedbd2a7c4b03c07f837e0051296b83c86e33353f76fce6f3dac74cc60f696963807d5a3750fcd9803ad02836127165f292a51e1b84442e03f4801,f7ade694d7d0e399bb3a534e59caff008e786bebe00c48ad5f8045411406f7cd2383d89db2b215ab8d790b4f9c6ae45c5ef987049c4c85dc0c815329a5526df500,4fcb8fa1431e54378f16584d9a83dec36bd3bc948b7f8898f34eca915b9dcbb526c7d1c9fbadcb0ccca08a271f6e876b2e6adde438c80f6947f1b93f3655d2ad01,b27754bb03cc2946f8a23efb783b096202449a2b10553bb2edee14ab29e8bd035bea5d1b194883513d751a39c1f11e4df9da31a725aa0fc272aacf41b66ed7d900 +29,1d7fecae3c332a3eebe23d15cd14a2adde31a7d090a7abf0dc4eb214b7ef447a,13d0c24c057e982a2f00745aada539320bf1e7a464ce666e223115f63e2f7e7e42e89373a88ffeb153b763ceba37d281668976dbbb0a8bf4ff1e415f2aa2539500,70683b9edb549b30c47d6f8207390014ce9d4db723bc5556677f4b5fca03957a1d3ac18820bb856ad10eac85b39b44185081f4ca9f2b17e8e895ee611dcd1ffc01,e62c379e7b2a2790e01f74886fc91ff626fdbf8159e9cfeb3f394f94825ced8467fa8be1876b897e549dda92837987de78eadfdc9b5b66a4a61bb1427e60fe7c00,c38f06ab364cc85f5cecb14b048cc5a228a2d8f5af071fc7c07bc3cb204d7e646a941a2ff05643db606ded0e921e931f9fedde06b9ca899bda28c61d5d41526101,df30bc92886b9f1ac0cd028b5df285ea72317a2b8dfbd3836a88f4e0688ce0497d882c4774455c5bcc6f8c429b351c727edda07344d8607f029cdd6a211eb0fa00 +2a,e0f2029d1c69f1f1e129fe7c107e2876d61293e8476c0a74f7d81ee6ab4a3f17,ce667c592f4bb5fb1bc6525560c73c39d48b1c1cd310af491f9580750e7344af56a416c8f267978c5e54f5b2e0e3152d7263df92de31119112e0cc003e160e5300,29688d06deecf727342eb655a12057314d8f9f0d72bc461f8c5329723b4f73f10cbabde0b76009e4d7c5c118afeea3cb16db83ea7d9846bfd41a35cf7164ef3701,412bc286eea9b26c155efc188c420595fe7c8b61781caf8505c596615c7b2fcc50ba4bb2aac949eb7a0fed2a9158ed0452266af0c5cf93222d5200170cbc522e01,b862816bb65eb6cf5ec20d63077d600742f4f88f2e200b95121ed1620b2a4355338cc5965fce4c1f52948874ea8395021b638900debe8bd13bd013a1165cbd2e00,6c06111a109e9fe2e459b51b2113c66540cea55de4bc61477f60474b726dc90947d5293589e87b1c430d54e0c0583a1df583a589b58204d753cd0d9e36feea4700 +2b,a7639f1c9c2c04eb2c51e322394e3d51a2713babf72a7795e388d50fee49a5eb,007a194503df7e3168b3152d2467818158ee990e7b7036e4bd184042328b08672f64bf07352f61197363cf9d089877565343cbedee4337851a0120c5362f3e9800,2609ad4baef7bff4f5a915d393105042c93a4a9790df2be630676fbc076fc265731ab215e59b38ac1bb552c3f2cff7033c7d779ddb94c2d9f3ae83a9e11c781100,f19f2116887d11d431145beacfe81bf6d0d262293c970114720efb61bacf90d45048f662a799b6b84f2636e5621a84cd4e5609df8e52ae438894cd75b912e0ed01,2398d96d1f7b8f8899b35f212c08e783e13f91d55efd896d01d85ca5b16af6937a2183a5d2ddff4d93f6b338a9ffbb18038e2c959e7f9f3f0127b512905b03fe01,9e79840feaa126837082694087d99042447b1bce40a076f07e5d0efa8777aa24128a884139b158ea4125140ec1eb0b1cfcae786e4ef8b06d7a5264a5ec6585fe00 +2c,d10012c0283601e4132aa693de13d2c2ff0ef60233ec03ef7fdcf72705bf7000,8e6f44d672d0093e9b70f2c05e90acac5a1ed6df4b198d6d47dce0f30728bc656a25c929711f7c18d5ef6b216687e5278cff238581d7ce01607344c4a288d4c700,e54d4b9bbe8ec1914dabb56f1867fbb28f669670e9dc7e1a275526bd1258b73c2d1f37841bcb7d02de0cdd166e8ae0f7691ec26d24f1103b3622ff7380bdd49500,2fe77d0f40487321407686db1e5de2bfec79a5c896d37f9f9ad9390c0070fbb86e1f84f1528cf2c2b1991f7c36404479ab8489e971d68568d08f14e2a7d7738100,4b6363ec93eb8989b7d928a15c43c1399b901e5dc566161b494976ed32341d4313e31e307463bbebedb31c654e0adffba086c497fe803f3ad41e4b667edc770101,dd546c2e8b90d0c1213a171bc5e5fadc51334877c086ac95be58ab35dc4e8f700913b9b02f0117e96d540376b5bce7ab16ba0d0a2c81d8c993891547ed868a8d00 +2d,38bc1096064f769046fe77f7abcb64d831df8b4e3f237695c54fe0b8e010f41b,bd90266a16d448336e681832ea63fd42b99f8f1f768aeea09422eefd00e7abbb7d555338b3af47219315a69de368ce3aab8be36752e5a0e0cbccb47c1421727401,4c36c9241c2163f38455e79b6145554e7e016692158f459f84fc1d8847f7d2653316aec615ea3e55b06a562e8a263252a8645bbedc38c3a57932fa57f8f85cb601,22bfd42ee2ecf62876ef4f85c54904eb5effac97164531c8b3fdf9079f897c124cec417eaacd8c620695d3fceb7f0b6897549ba96e0e2c2ac6f4f3d5c19d754901,539225fe2f8981cd71802b83aca98f94281128e52d218bd7c3b4c02031c1bbda5dbcc67d7a3920de1927dce2ea6d12ec31fc9121c35a9e47d0e4fa3081fca19a00,acadba4de215a744d154ed370b0699a1a921c6c949aa78812f69919621f5fc49518a3566098427b59a6eaacc73561c5993387882caa1f04df0756755414171e300 +2e,eb9ef4161e0472b96b41e7e546b9233c408cfbf85f5d603ae59d8ac7150caf42,e6453596bf585f0381469d71be1304f156cffc2dae97f4a82beaa0dc4296f5bf0d477c05c286dbd14486f6db6fd9f8a5dc7269f71f00a1580f268a71546fae3d00,bb0065af1086a6578d125cbd4322770571f602e079b8368efb7b410d380c01b5112f3e5c909baf39f1d354cc371f1d9740fcb14c626aabb36a5b760229c174c901,60b870baa3c55b1eb906b6ee05cfc3a9387ab8e0574c06003ae225fed275858e312e1af3ff5711bc49c1ceb9ee09dfa7d5823517d6c2d802290d663ab12429b801,8f39133c443e125063056fb0b62b6560965dc346f7bd1c83921ef6a5e2fde1af15549422c2d05990d66ad545230a97ddad58a3b631dd07741be10d238b85b94300,31e24cd5fac073494f5f294c6f47aa51e5b13c15570c61676aa11073898158cb0931ba8f644bec192eaaa9eec588dafffa64f7a7fc4dbb7ba8e49bc7983885ee00 +2f,864d13a91739170baa6308ab9ee5945f91307c7b1c46abaeb66870e9263fc848,c485ca48171ade1feb59cdd32db089fe5095fc0f497c08fa0a6a9f44cebd0ab9790fd93029e407874482e0d2e463fd7d97f3261d6165e78238e4cbeb905a971600,5d3b47dae8598879ded9d9d948ecc46588f3b1362cf7abd5d9eb241e1c24e3867d7f72c11f12c2761cacbba218778a005a0e42070d315c3f36436797561b0a2001,004c305e807d73a8a8d0b5e1766ffb60cb2bdaffe623dfca3376bfa7c8fd9d2c39e348ea95e8c957ae07b6af8ae508ed2c59de2cbda8f57420a4c7faeabf093300,d674bb6a1c8ec7f8243d6e5b0a60949a5764333ef964d35009ed91dcca61efc521b062d21c71f3ee0f3ef0c7548b4bd857ffe882d59e02089d92cd2ea59e19e200,5765b069b2a985921137bd275eea59f0aff38e7d22ce1defd8d5e15fd2edba7301411f43d1d4739b78b9227b1d49a5f3ed141a60aa9906b09e6491a6cdc51bb801 +30,cadbb4f7c5a284abaf91a9a7839d20b5d9db673c9ed485bc926e987598b120b6,8ded6c26c2c0bc7c9d37a1bd5cf3d2fef3b3b09b86c76909bc996a81d800e8ee1128ba38e475d983b9a971210a1ecb3cf33c529efc90a1b28d9d10fe980bea2900,eebd1b0dfe1b6f69a602f9a3b4cae1ef1f07f3927c7df82b110947c926636ce37b8ca835e0ceaed12aa1165ccebe4bf268c668f3ee6430b6774b850cf1e49b5b00,a54f01d2b7230c08b860e249c5b553a420a07dfabe0c49c5dc81376ed14f56d130492888d6ea91c8d222c3000303f6f9017234e9712d38c895e7376143be197001,518b0b3f7873baedcfdabddb189e0647088c978d24ea386c8cd13438c5787d05577c4bd158cd386242e89c60576f3b4ee79bfdbf9dfea883b828b7f949237f6f01,1971e024358587013bb1ec8c136910591394440f4695f09c6d080ad362256e1b79e8b65e101273722b6ac843498e6cbfe7f8ab43dd2ae7dab3dae3abbae22e8901 +31,9fd342222f9600de14ae6dc485ed622f14f76663119e31bde7aa487be190931e,cf001dcf72ce6cae0c7712ad4b875a5ab344638fa7da7d5b2791b828f20b3b294e30a064b16be7a9ac5105a457ce553af4b8bc4b304db4df2823879e3f21b73d01,40452f14e713e493a7e387a717299b9446fbb8f0517a55769b72255212dd111f5921868bf53e33461c9b3a1006f6d1481239b472f2ad35420782b22007c7a21101,9ff674ce2c376e8d063b66978548a6fca04c6e2121a53435f1109fd6936e1acd593b6f26e8b2dea35983917b4c718417152ccd0cd03214b62ed8ebc35d7b48b801,fa97e08d326e489b7d522076afa0126cba386b3be09945a754eeb408be4c65cf11f1e3159fe23f78f669dc8cdcd0174958b31f4fc8c7357d60ccc8b58036a0b601,9d5d36cdb8ff5d34e5fe955e993cee32224767f9846696d79c8e453c629ee65c57aaca7c8c5591da1aab1412096a264a83faf898aa50ca2828404a4934a83cdb00 +32,e8ca989a6ab14aef8c0f9f90fc1a6f915e43ce1fb2c3d442fc7a2f6cf72eb474,2696eb77c77e782e9ae0dd1d34726afd45d12aea4c791672a0877420c462cac81f17071969f25d7b4b0739695f76441033e99b2ba7173a014f7a521bc0b28c7701,056621c461326f208ffff50bb10237fc7ae1d864f9aa89adb6c41cb8a09ad01f7ee023fd44044a97b86223bea6dc72f6f9e18f3c47cb2fdf05c25798c6ce7b8d01,fde72ab62d78cda7b3eb295dde5f709c5d423d8ff658d53b1f8834accf8f7d240829f2391f8ef997850c6f2f52030719d8a5feede844fc6222b6da243258401601,88d747191f11b8e165100d50f51303b0793a57a4b49cdc80a12a7df9d0a91818727de043db38e39089017529ef06d7f9036311219289e90b4403eec849e7744900,f08cb17b01478f3d9a79573d3d3c2a088a6695b420f68037f20fb760c43aafeb5a61f3df9555417ff5fd987a6b1a60e57313220ff48fbc05b91f5f318c79b0ce01 +33,37856c3fc55f05353d5af247cdf766f48c297800d4bb4b64ee4807bb81ab8500,f70e2a7f71ed182d4953db3e7029ece5109b0647b1a7e87047b7f1d4619044444f8743ab88d01fc3886614062081ed59c15d4c5ba49284221c7070f65218600501,3f9c21265fe10adb9c384cea539ad3493a1dfeb310cffb83dc92f4c243de1ffa212602aeef7410248544c820662486d526b1b601bdef9a12b1689b1cbf89f71b00,190cf91b116865da946aa60af3be62f23c95bbe2f76d1a62080b96253b80df0405328e61c4f79a4bc1800191782ed5af633333889d19935b0995ae322b7638b801,b028be54834d877a98e3928790057df2f290e322ac74077e4e945200e258b37f303bf9a803df503d0b85eb852283294fd8b512d26262bc9576bc8e1f53dd5c9901,0aa39237980ccc1a9cf6ea8a85ea714e577dbc106e03aa4247cedf26a013b95e65c7fc7da081aaecec713a2fbf947e0d20336fad75d25bb9aa0bc6ba02e0b1ad01 +34,d423218d8c28e5f4883682e27ed1b6c6fbe1db929b943bcc5dca496c6bd36ddf,1bffa997a4ee9c9ce277925ac8f74a8d4358af78cf387fba516879a94c70ec286e05cead3ef4134926ef8635388bf6b00ba3563504a3a93304b7b02a0345283800,5a92832b65abfe7dbe15f3865a1942b8b32c91a03788165684b68637cf2eefca669edee9e2eb9ae57d0a92647af291be818497e7aedcbec2549de6235931d79900,18a04d5aad6d1600e5d48ae18f9262a00cac5055b8ddc1353495a70a236d90ff4023612b890a35d2af0ee454233853b9e0ea74a6d72617e43a3a804eabd73ed501,9f3fa3375de9265c183da51244517a26b0fa49c08f5ac0b1d2af850f1534a060582de1b557b4ad68e412f47c6c538ddc92a96d760440de0defcb4195c8bc9dbc00,0ee4b371171b122f2fd619f3e2810a3110ab53ad52fee6e22b061504b068526218ff7f6239a9120786b530787fed059c4f0fe62289099a61a47afd8574f6df9200 +35,46c5b24ad8884ef95fbfb228920e922035364a104bb5632a32f800d4abe0d484,0078bed5aeff339c742f3914b4b1bc146dfe22568622024fe9fb2793bbaeab71398c040ccc56081256ef733bbd68b3ee48f0ca6ed28d4e158c7d968a2302342401,eb29e798fac71be265e8b50acb39ce9750b0a9a0734668b001a9863396313dd27f409285ab3165339dbd45e228d8fd4df7c8f4647f82432676b13ee5f81fcceb00,4c609ca53a98ad26116a755b46da16de3884edcf4b764f54bfd2a01b89f20824534b27a7cc4984033de57a5cee275e6c7f3f030be37a7bc512923e6bfa21f66a01,31af204d98abbc0e3f2ffdba39d7f26683215ce1388f7a6d4add0189c6e9b5de63427df4d5519066dfccefdc7fbb02884ae11636646cedfd7841463c8df0ae8e00,e9219e848d652cb3abc8d8eac52f83752629a99165fb861c4ad7594de6d39c9c41f5e5294affede479fecaac840d65776959c32bd489254b29e282de0353bb8700 +36,e1b1790a81c9247207ed60f3449bdee16beb55903f133ac9da2608581ddf7d01,bd8c3a1bbb9fd859129b50437cd4f10d499ef652004bb2bd8e98cf5f034abee209bc950c01bc48c5df7e2f8d83060e5772f5257b8fcc965c37a3a09c190fcb9c00,b32269e96afc4974cf673109ba236af32bf47bda06f48cac2243b028ade684c70bbd1536a35619778fdc8cc2471c940eb2ba1eca7e2c7c611f25b3737242af6600,6a2e922e6afca1c29a328115e4ea4c8673439bf0371c5cf4a38fd873f416088a14676bd8f11793fc55c1830b5e09787b2a4fb8a3e610f5df52a4e3d37e98ca9c00,150c78b53c03b1b819465dc9dfaa1c4751f4682634eb5ff40705283cf48e1e2d05ff388e6315ff1daa64fd25d72bcab2e1d6cd4f2f47690158a6ca3d0ea8856501,33cc8d3d149285028d33d9392d63e2ccda2e634592ceebac582bf81d1c2dd7803348c015e7bc2c93c18f33f293e21cd5693d067a1fe150301bc75c5d986253bb01 +37,c77315be8c0858151af16eb6768247cedd3686d59f6a9769387e2284e0e7f235,3016354eef8341f95758f2133fa150aca9acc3eea4c22e6a820cb52d3aa89392037c817d63e41b289dde24db568f65eb09414a488c03c0c54fa20da52397e9fc01,604291a61935d157b393ae592837929fdfc14340c3faee647ea1978f12eaf8d064cfb07cacc9fcc55c03931a53c16f3fa19b747a525a60524b5a022fd28bba1200,c556ceba8cd1d162dd6899aa16b0c141ca9512486c151b56b5cef56592d8630a1fb2df775d4c4ba540ca4d5c171a9aa89cd9948e1a7dadbc8fd2890ccf2ee9a400,c55066aa4bc785902c261314c5a613f851adbbc570ecfd68e93b3cce8b5bfee722fb5decb7eccd678157ffa7ccf1019e456a7ce9a358aedb44bf39859c1556ae00,f294edc3ade678097c8474b8a6dd593c276f5661269d5514b52c8c36822b28ba213ad7a7274b769b835659c74cf3a4a0c2be0284499b9fcdd0e62edd5f9709d701 +38,46bae9e0ae97fe17728d148540d442b1e46556130e8765db920bc68c2e4f91e7,1ec12880c493bf4ff960b242c2c40c379ecf1a8b6aafb0b193d4567680b91ae2085b3596f147d98943e7fd58b0862999d22863dd2d3b36b4389820ebbdcf2afa00,569afb77e13a33f353864df95cabe82d46fd452b6f4ffb0cbb0543af16c1f51a27c07064bac7bc2a90ca1dd628f655ac3c2910df2c3c835a78a61d1b30abf0a900,710946c345227c82df0b2380b3026fbfbdec789c14b122867cf8c5dde359f2f3142486b23c9b2828c7ab98646d7a67887e282b0ed3bb2c20ca9b9ba5a679119400,fa006eb5c11418cdedf7ad7e25a6d03fedb7f460889ce22fff1121daddbeca9702b9a7f26f263d1cb9f68535820f0546a937b5d41f34472463fba13fe02cdca000,986dc00a9a1e730e7b2d0b1028a42238b5d8ee71414b1bcb2bb2086bb8eb24107ba41ff3881694a38d2eafc553e4706fc4faf968264f62f38747b73b6b86eec300 +39,8d088fe66b0c375e15686e923b482d2b7a53fb69978a3e6c002b2c05677df5bb,7b0a55d9b2ffb60dae1d679a11960ca11c5946d16a381464654c578f9d23ce993f3a2fa54fed2818df2f1b8b4c43d931989486a52735dd313701dde90b2a304701,66efd065e3afea5671a164179cff0beb900e174cd3e0fb639e361a36c95faa837f6f2fe1d7e72d41c6f0e9a987c20e96e4d6ac539be69e8edd315450e2f3835701,472453a4590e452fc3a3aea4e36b0ea7c819618345e15606ce48b8de441bee983e17865504a744cfd3591e49248b89660be2d7a764908c1321c305bbe91dd9a401,e4aaecbccf9a0f69be9504c1f3b6243774cb9c840f3739ec14738c909cb8b45f0621ca40dfc5e8bff5ac8fe54609bdf8ac4d13262d651dde6fdc38e548a5bbd200,e8a9eaded2cbfb3bdb5e7172f551ea5880d44bfe704280c75d8c2ad6f6391dcd10493adde19d79ec5a7a8a5b05d6a194598adf0af1f8685550fc5a45c3c9c8b900 +3a,555e09607d0d67c66edf98f8e8c7c5623350fc8778c47600bd7c404d861e98c4,e7c7951e93ab7ec34b5cafa7b2bb2624ccbfbc7b08b96610849c98f203ff3e5824f44a09b305e08d18e103d9e33a026a86a297c288fb36b94e584541d5ee9b3d00,d9049cd452f29e9b269a0ab46edc238f960a905c7e04dffdd92587c46691193f11d4c5631476517980fcdf1ca98a030cbe7cc929375488f6ed812e8ce71a50f901,dd52d59abeb484433f5f08264cd8b602759caefa09ba0f264406fc36576f2fe05b8860c4876989b10d91156cf59f8fe69ab4e47943be285e9c1337f6ccec1bc000,5b4edb38edebd17d3a7d89b25022cfc1566fb2a0afee1eff36950ef82238b2bd7ff7fb05612f12235743f6081318788c272dab47e61f8ed3325a1f093140d2dc00,313a6de4be8c607b95b0c388d240d0fd87bcdbd970c373e3c6c73fb00feaa1d36a116223bb9b96ddad29f7572ce21f51bd970081457a5a94508b66ab22f4c94301 +3b,b04bf58e810b9d12711932b21a7cafc0e2608f6ea31d86ca4daaea1cd7f8dead,fe1eb6624a5c0dfefa6e74325e9a846a7db677d5330247d8b78bfb9b379721f961bbd4cd16c4d9fb5a6e0f4705930c0539c000f0e2b82a2eebb175ed10a279cd00,e84e3f4b748d6638afdb758087fc617828f7be993093124de9ff58d675cef523110c9aa84d0631f7008f7a91a88fbf1abc62ec7157a0006d92d072ba1ee03c5601,b9a65f5d96fc9d3c987a1467f4a90d11da20193da180fdcef7849637b6e6662a7097f3c98893b9c02cee276766146ecff78faf67165c77a6440316d41a513a9801,4d51c0ccddff55f7aea6ad5b8df632f62c59ec2b779d11b401dd2a97ea0e11494a87ef9f6ea417b05f7245adbd9ec45195f4168bb52d80ce7a583d24b19da82000,c8cb91449e2e9f25787178cc69e46f1fa31ba9ec75a4bfdbb076d8dcf52e2feb44c6773cc48e803d1c90ca8db4596502c5ccd343a062f1787bc8172d5c273e5800 +3c,99f5b1248868081aba57aff10e11b58861d81a900f16d2675ab24aceba45c898,dd6c0ca6f9f7c6e35df8bd7c9802a8a8dd3bec6578f5f32ddae55a4423ee611e52719cad86c388f9f8bf33ff73f63ccc80c42128e9bb51393648642508fb9fad00,126bd31d53bb374d43c24c6c636a8ad5338dce6a08ccbffe832a2c4085ccf0897de3b87c95ec907301aef574253d3f161ba1bcf5578df8460169e8b36f7ad32d00,9e4b3f29f31e20877013aed36481d176644800836518aab29f615471abf97b4d333f172c4b0631e6d5ceaf414b76df836bc4809e2f5b60ce840ab35fffad283601,9ce3ffe9c63f9ac6dbc32be0568c52d0a639c636f24416694f03bb58596232f87a931b783fe155650c2db6f606754c15920ff7b66f704043f186647da0bb28f000,8b101f90909de8c2e2d4df5260b6f4a68a3b40f90ef61da5169307f1e21180b11e00c29b1b7e9274938cd5b3ea978427d0b1665547099c4bc6d602395444336c00 +3d,afd0ad9013fa6ce954b897f69f9ef1ba5df02eef2bc986e7843765f3e9c7aaa4,0f885dd1e50fc36eba45744ef16d4fbe7e1b5d12b61b19c07f965d2f079ad85a33f16ad6b8f69b3eb22cf7dc31822a7429cfa06cf08bcee936acd441d35360a801,f2200ddd4d9bed6d2466daaf8a1df69f09ef083366e66d2330cc6ff249160e1b6a5af8e440982f72bc0396940c988d93854f83a72a772f122970f2219e5f521300,a7ef32eb54699968176dd463df63ef0d0698849ac45bc0c04da6dfc45f150997380e2059e81303d0027ba487423b3a27e3a67b70cb2f4908bb5f08176e6f298e01,0c8cff6cddc667f5bf118c7cb8e4543c8b3f530d2d5ddf9a4399aba00a2911ad306e0585fd819c13ebcc306ff99397914c217b88416a86c50cf077f6c42f35b200,d41a825929d3916a423625907edd4949d2166aa432a51b09e8bafce99bf6eb9d358c0d67ac653774355168f65d133aea772518d82e79d5854b4a7747936432be01 +3e,a52bf8bb075a3b1df4cd0995fe8edd2835e5820a841e389fc927e073371bbf26,d90788646bacbec196a03c730562bb4e067319c21337e17bba52b36e434feebc63e06a03da2514ba79a5bec93681080a26360820d760665e3729d2f3eef9e27300,ee725b6384c08d23f5651a1130d7eda0e18e04628802996b69c954d8b1019179116102e558088c3dc6f47dd4c29b16f8b52c98799194d5c5cc3345b0185d342f00,452a0d0009f3a2db4774ae3f28e5a7337b7b12fbf0b2c1c68838822b55c2aa0a491a8bb879cfa593f981f60d269ca9c66084355707a4405623dea23901c1ec7b00,9cfc607ab0f85c6d2782f8ba7722cb809112cec567ad17d41132d0a6de302b153577dd9be1a40c01e8549140064d0041b9deca8444312e7de33375e781eb2ceb01,52e507f9f1a2c21db594b6af5ad2271077a79ece7a45861099c5f93ee3a6941c5cc2e95d13f37ed4361f51fa0675c8a64fdfe4b9ab5e44dab212a5d850325b7400 +3f,7ba1f94af82426c658b9507c3ac505ea19689f7a5d6a2c56aee52c3cb3b086c3,486b852d92b021ca7dff31a49d0d653d4ef3ca4ded08031740642cbe79ec631417527ce2322e7e3c5ab58e4ee81b312dc3cbf7fef4063ad78ba742efd5fffeb401,e4b5b910b3c4e93de7073a5e617ff8f50a7b94cf5af216ea5527a185d5030085443c045370beb04727f2e90d0f2e6de2e18ae97f06aad605ee5dba4bce1779d101,20e72395943406b747d08a9a3baed11c657ded6cd5aa8214d71c51263ae3a57d7186c1665bf1521c1322b3d5a2715f2fdb63f75dc5aeb09756ce20423c67c72c01,dd6ede5c6ef747c8ed854e0567329eb77c11cb18d322d2ce241bcb0ffe59c4a860a2194f32d566ccb3ddb74dc81046ed2791694e4e960d3a4cb5e1b9f925858601,cd210a42014c86632ce813f06283cc4497527212809efa3c8818cd80052f946c322db25376cf3b4840a56a8471b4fdadd480b2c68754d9ed054a3b848d02385601 +40,d6474020464a57782f40aa13401b02946ebbe0c99b78ae20102057c464f3f7d9,790f23b31dc06abc5fed9d6209eb3f5cf153c0916483b30c143168f2cb51634f0e69d5a1e27c81f3863f0c6a5954b8a2b463dee4e64e19515c56e1c8de33d54400,5a73797a6835e6a45ef35ac6ecf0d09c5d35a0791b40aa0165093ac1a31a35102efa44d4930c638ffb914db7d511db0ab9b2acd88023d48c717fb265cabf4f6101,7c9cc61b0f9a7209e79e3e1cacdbbd8b2b3d55c31f4467cb0168a360f054e48d23f8dd5d35ba7d15339a2399678f9236cae01f26683e5b6ecd86a70410abc3a300,2aeeeed6dccc08cf09b613733299adf5cc184fd1cd13045545d4d1268ec91cdc3559dfa918dfd8664fb00d341146aedae2467998735acb3c33f5877540d63a3c00,7b503341cc698925c70cb65c5de6adc65e1dd32340a74833e6c6040480a13d4470bbb789275f9b9acf0be603dfcd67dc388ec4e9cf2c85fec0018d234317a9fa00 +41,656d19a5edc39de2a779e13cb9f15d4c18962c5d06ad87d2a7420846301066f4,0401de42d034cb8c8b5e7fcca1cf89585ff108aef40889563d5bf6564900a73005d87367c0e9a5ea796d681c0c85fa2f8954dd00918975300c5d5e9a356a507801,475e8052c37d751ccafd3d5ad661184d8b0218237556373cb4d6b7e4d21733b339c3d90732c808be0529b8509304a9da7760d405e41ff2b81f14085a5976340701,5d24906b6af2dcd88564d30194f1afcb1541381ea0c7cb00aa21b75d8e40ccb8493b929ca2ac46c9cf618fed3f5aed88b31dff8db1fde008c4be810cc00d257901,b36ae1ea18e7a14fe9ae58d27284d4d574e8e581aa0682e2414e5d84168079aa37fcc59084ac0335e8d8771d5ee8ebd449af943229f4c51aa1a4027b54a56ed500,a316b570a1eeafa836f5cf50ff902d0a68de99140ad967563e9ae04f370d68d545f2d4fe0c70c3ad79f05e1c6886094a850c1605ebd34773dac9fce6786f977201 +42,a5215252c7fd9db3f2a6c692ec037d2e77a52a93bf3e137d43b08340fa7ef583,8aed890ab9df4db9ecacd22fb2376e73f8fa64d57effe96bc5218e1aee2e97fa718790b708d274a63cc43a7296b457ab5efbfc2a37f978bd708e6e1c754d5b8f00,0cb63eaf05cc6f85966ff96270bdf4e04156a283458a00b03b4857ab5d651a8e191b0e80280ccb367e7e442bfb060565d5e2c49cb406551b717c6a3089b3959001,b6fff40eec04f30a30927e5b0fd1671c91bd68b233422a181b1c4e934272dd551da504aa4b1df80d3c01639e91d77a850cbaf386a93a228ea2183f7ebb01b13301,71e25c52d5eb2c719b59d3d357d47d4bbf2d3246ba1ac078e4a8c3a711769530464f4f9946183c02c2bdf1aafc038bdc770f915fadb91b0c5db9b113d2fd016200,105ec5877231cb2acb207065980c04387bb55549b38b1462ee9d6ee775e1e6d5016095631df526ad429f4c9816e2b1b46af38ecf1f042b8ab67351533ef2125000 +43,74b588dfbfea5ff0f7fb4e8f15c0898b54966dcc2bcf387659c87ad5592d4915,49959cadb24972b6bfed2c8f0a12d95fddf53d16668f83bfe351eb097f1f080a5819058e6ec60cd08d0b35d50e2870e9ec54c9f087a1281688f46a906375499c00,40f86ecc1521495086b80764955df6cf7db129fa87b4b8f8e05081f91894824d52207421800bc501f1f9fbd158f9d3aecce02283da36c32017f270fde9ad603901,e901b22dbeca56162f8e37f9adbd61e383e4e984b0434133c18b5f1b0e7898f9258e75cd0d46af11abc36eba533c948e625d1c9d4e08fd2de2cd8fce57de4cba00,e7a2842a99a85954f8b864ccb0bd35f687a99916980c640570bda2a85ff1fe0632259088e7d873beefbd5110e8ead745c2e1b38b0d08a480c62a2547936930be00,41188b249b67294d755d22ef31af84c05e2af0ed5538bf8d3528ad6672191593639010b529d5173548c066d563c74fb7f688232cee52ebf288b7a971389b244b00 +44,ca06028e120b9b40b052cf022910551baac45e949ee0cc450d64613e3f6c3d0d,4c34cf996f650f575c8b0f963ee6015b26e5db3f1a6e57ef06fc754c3b00a47647c54ea28593eac8faf872ce5092ed7d4e6e98ac99947501510ec71b3d570b5300,9e1f099050198aee2e8cc91ecfa73acb1c353ef7329f51e49127dbd7c2dacd7e50a77e290fbb601588751c49e9eaf5a7ec6ab588911715543b6043f22339056000,2e42de1bffbfe70ffa14f70604dd944660b5a33705adc1e3b5962e8195fa36246c1e29c253cfd43c716c6346814e152c90317fa0f88cdada4ce25245fb9a734f00,39d53c6fa62f768c7bbae48f581d6655e27fc9bf4983939e81822d5901e8afd06c8ef30c3d6332e9aefd15517d66e5dc0ab39212e1fcc35eceaaff03519a8fe901,d019019cccb4abd7091e0d03db5f3c2338a22c2826b835066052c7abe84c2df632d22f9c158bf093ef42b0b244e91ed8ba1596448c812026ffb31ae7b8954bb301 +45,4317d6d2d413bc1c0c8c9c8a983659e2098b7e8e9a86e991d1d2029e00d7b4f0,f2f64e08b18d6b35550607c1386104f01b51bbc4b030502a0740c836aac1a55467e9c2f6a8bca401844e804893ffdd4a285eb3ab2d3a28ecb625f0bd01c5b3c500,aaa46d2968c689071b7a6e21359e8ae87b43c5a10d3b0bc6b010d8d1a73e772b0fdbd2b6cef32d195b71d79d47e373e90bd012926a0ce3f1f59f52f26caa4efb00,e13612771175be5fd750a82602d193c0d4ed840b98ea2659fcf882960eb76308620ed726de909116a0cfe27919f32a905dfff435cf24ca9b947b4ef9f6fd627700,e2a038f418eb3cf768f0ae955600252b27b6e2b1e852683a1c5c789d60b138a8458f81ef69535e5417cce097058650bd3f5a7ca3ca2063705702ae99fa10449701,610df0520a8f4f8df5a7ea696cf9b2f3905458ed8db458fa9d3b876782007e5649b4fc5cee0fd1c550caa72ec24aa6b4ca4363bc7b43ea9b5bdb570bdd8f651c01 +46,5712f88fccb0e2440be356d208fbe1ef7042cc0b89671e3a59daf91ad3308bd6,88dd43c78f44340bb86ace21ef8d60b0870435681a4ff21c495d6b184436e78b7d893b9fb79b9deeaaadb5407f8f5b4581a6d673718e73d147bd02960c8a301601,d3db79280bf00133ad26f230701e64b25f50bfbd4d3d9df9e10d710cf218180a0bbe40ce3d67429cfd9563daa067ed11dc7f4799adeef3ddffdd052b9d95b06f00,123890f5f278615ea3557b26a41d40f11d6c31a6f62cda2c71e0abccbbef8bdb6e377cfdc724ac7bbfc5b4a7c20ce4a20cc12544cf8bfb90dc65bcfad96327cf01,6def1ddb0e8a8fadb021812c683d1ecab3deffaaa492cc0ad7198297130b715644cb4e44c40f1dfa09cf7fa67a9d0b9f01cb7923a10cb2f8fdd622461de04d2d01,4860ec90d09860110564e586d923493875784fe6457c741e532f16c81e4ffbfd550fabac145384f6cce8b35accd3ddc3bbd03072bd3f8a07639c0f54c4c3f5a901 +47,811394e0953b7e90e7d0588376903e170ec49fcfd8df1349e401320bf92fe9c8,bae166ded0d7bd748092c7d0e8be0d245071dd4564f54498285fca37f8da144713bc4da05feff6d3dcaf45c54d9ff471fec86425c9777dd227f770ee744e44fb00,609f6108352acc2d9fd10e89d2c0fe37ed4367fa7ae8fbf7f2e8785f35d7fa4c6b4b079d54481c78ef635c1e347d33b5037a0038756b7a216e018abca8b00c5c00,f91657a675e98127496b7b29cf4fe336cb7bd92068842203d0c24ea7cd35a7d072bf57daee272d75cb862344069a9ab3772d7653ff8e0406d1b08f72262d8eca00,729669842079d1b8f0798ccc920a7a96a5433a13f5bbdddcc6378344e0af11f152cee6bbeb1d6c1ffc1a47be8ab47c717e491865e347cad5b6de3d12b2424f5a01,80d7f3e370c59662152f9b76d50fc28fa3b5218d61bb1e1458eb60faad14fc905c69a0718520a866dd88343de0fd929fb216115298ee822f90b81b90948e4ad600 +48,6dff6f6b60c288a45b7cc32897a736e4d8141f8b1f70e9157cbd6d75c62f80b4,70cb2eeb5079b966524f31cbcd5cd333d6f8f6448d750ccc149789f5865297b7592cea6856a593c33d1b2ff6f61694349cf4ef409dbc08bc0fc76c17283615e900,09c4fce9f943208584ed8540eac51843e5bf6a8c7997e7278ea9636581c4812e12df3bd1927fc66294511bea0c92cad4dfbf2a1023029caa99d73d2471be811701,a35a7d53f925b37b2d0dd9fd95805d978d044a8bacba067bd6dd51e69418360566f941994c7ed694c72aee730bf0c3cefa2dce4aaa04f436aa169631a23a537501,66325feec3181b6046b3391fe9682981775b80fb0d1d04a550779634b2a2f99e7f174fba7f6b3811616e2741d584d3218501f3f11971f1c295d419e0c65b070901,840ae1b9f5eac3fac4832a2bdbdbee4c59e48a6f0d5f663656a98f2648fc3c2d4ffddb350d4da4de802ab8fb7ff18e31ad322046ea6d1eb8b33c45bb0bc2eb2401 +49,284342919b50df7e713c507b9609dfc4181a6278643303367aecc1f50071a930,bf53da39b1cfef610ff11b6459fb3d2c0e4bb52a8585c92d72398af45e09d38468e4fcfc1a35728e03dd4ed8f74be3a2a00e8dc997bf7df167868b17e41211bd00,40fc0967b7646c6eea72121e0e8d9a18aacaaaf7d847f2a6cc6f617490959d97146eb1694adc0001a89b73cf30289a050bb69daf59865807d2834ba7969463e400,eb9f1bb880c65b95dff541bb7510b981961e16839d984a6c7182069dc39d7b233d067dcd25a15d3efa75caee784f7ace424c1fc82fd5a5ab96de5559f2c1e96901,8b74cb4d3186fc994d7a6804a2f16c36294ac4f13bdb78afc2bd51bcccdc521d1cad46093e3be162894963e3cf65f57c6699eea64855de920ff5cbed05c0ceb100,ea6acbbc3ac6f38f5709cfdabd6321f6ab5f8bc8336d9be9c32707e9f384c1b62b78efcbf94b6dd44bc60cfc5128e13989b5d53a7da4b3b41d27d9efa4844e9000 +4a,c117d6c048c9bfd705f4cbb9804499ac9b97bc62391fdb61360cef639b336313,381b8b830cb44823056bc8b1b8e52f2c0d6e05962602b8b63fac11e866d1e426352c7d268429b055eca99890fa5fa7e406e0528d79d83786162e76dca3dbb1d701,23e94cfc3435e41fd781d721d4660d18c753664d7fbc66e93363017ed5d7889a580f45779eda80c5d10c7e9546d4f330328af838d4f62d86e0dd3ff7570dd8a701,cb68fbeb725ea4162409b79fd18ce159e872def2e8b355fee5bd3c8f4ca458222d2e0c3d1243286a5e37b081af9cd713577d8d9e5f836563653c5a915cd6a6db00,62dc7d6748af73fa6b2d8b3da4461d56b8cf5c6471110fa25a36ee833e2727c33debf2f049963f1e085afca84b1ec62ae7e6cffc3784a90f772b0e8c54e7c6c600,e77cc1a5bb938776abae0e815c5da4814ccdca882cc5fa63c97cfeba5a0fb5c372c549af7748b6b14afae01a46902ff8082f1df5de17f8a7804349650158100f00 +4b,01c37cd6fbeea398acbb99eb37fa757934c808af35c831f7a65e17fcb713257f,d45d52f7bf7074ddf8a4ba9c4cf3c10ad58edd63ccada28c9d4e0cd6278016e8732b57d2bf7020292a9a764fcf29973ca1667c32018721ee3a01c6f3d19f4c3e01,68a68d7db79734c402276a2a6068b17f6d0f6387261231063568cff5734a227d3a7b6e28d52870d6f4ff2f13f36bb2dd2b2b554624aca3e3a7532b36ea3384ec01,dcfd65615b79d750b590b7305bb067e6260aa6ddd003cd2cb892feaff5cb28c561cec1a234d8f1e1efce007198c2199befecdf4eef77d629ba1b204b9aaefad901,e256c6ac03439dfd09f5283554b2adbffc424393983ff0d757e7405d7fbc8fad3d197ab7b89f1d357c75e3fe4c1fc29a96f04e5846d15fa13badc3dccf7beea600,9be9665fbce1dac340b5c9e3cef121322c4c542a002c87adb3ef28aadc13d7dd5894f2ea23d7449068d0a6c42fca36c4374134f5fe677b508efe4ef97149ac1b00 +4c,5f8af5b92ec95a5d938c8cb0e9d3daf1c6e0e80e95bf8154c9e45b15b9c58a0a,9248ab4c8fec121a8f1fd4e6e5986549df9d5433839b662d8200764be51089f80456614b673363e4a1bd51f9ffa2b95d329e3e2fac18401ac57caec602d0b8ae00,00a93b86de40c2886d91fdd19778819f0fa7c00b307b141abe94a135c578eebf20e90d5a4e0cc4d351d3459590e2493611919d41da7628416f7403a936c6609801,84d664eac108fa98aafdb1d458f22ddba446e89f686bdf9a7ce5a8cc27b412f47b9e8a7f93538f6e25147fdef4cacf28035ebd402227d52ceb25672c73feed2f00,9b6d3c3bfba095ac3c4fa8ee026374b83a53c8d3ca5c2c3381730d91079681a14d4d563ff3b279b5e019be345cb6467851398c187ebab6abcc7e3afa28b266e701,02d342e05e19206214edd314855a5108b200a2adc8ba20bebff7742865b8acf80369bb979a9b2ecca4ce8f4a39703759ba4dea2cbb94862fbe4a02c25af09ba001 +4d,49ec7d5b9aba3365cdccd5a6e323e3d3ec80784480a8aac69d2d36bd6333607b,8f66a12de6620b44ae0c2a3bb194d05a4aa59ad9043995ba8f1741d1db57f70546335d383858b11a75dd6abd270ebdcd04b44b883daaf49a0d07c0f8f0ca073900,38c03bb4f12852a2fa165b0bb879446d68acdcaf889f35c2aecc3d1419c87e4c04b2561d03fca15817e2fb8e0e48cd6527e358db5383f33aaaf7be9311ae620601,0e22b2d10aa4991e811e9719a4eb00b1b6d00a9142693197232193e014c82a85567bc1e84a21a19168fa726bce16bd57b3a39aa1c969d52355d85a275a2e9cbf01,9ddd6d42c3d131f3db9207b9d9b1e9a15ed0d1f043251440890434e8c6d22ed040967702dc6fa99e59dc8fc4ba1976e2972f0cec4f0839664ad115c10719337100,7c1dc21834bd0f22379d20deef7827c2cb10e2bf32b1016542b40eb2ce16c28e1dfbc5bbcfedbd1f27439f8628bfec37d7d9dae4f5d5244461e3c38e5f4d543a00 +4e,48dad819d6072f7c85de8c55cf232e8c9e674ebeaace1277fee0702c8fe213b1,92bf83d71fd12bb9a1bdcc1a0ac12faa0e77dd63dac8a964d5332517b443f5e67217a3cc4abe95d6be9ebd5556d5a23304851831f1d20f874b28870439410b7901,5e7d0eed833e36e38d1788a079d5a955a51a920551743e548806c7b60cbc6ba205bacba85ac34d56acd94c29d7a3e10d25ad1c68f83cfefaaa076bc0155f34a001,ed47748b0f8e22b4a13027d5e63147e70a73006682848700e70ebdba269dddde272eccada74a34da64b311d211b32846b7e608a6b1fae84fcf12afb5c599b0a601,ed4b34d6de60405ae18fe318d0a6a94bab225d29be75f6658e9aaa5a175330556a0dfe4b5970b907eea5ec83158f3082fd711963977f47b68f938ab664f29b0701,f2b9c62e78f2f72da1c38ac41740ff8304104b8134b3eca5a0c58d4c7b07a50144465f9a1922b3874a231eb2a49bfd84d38bb7a21ab2480d386edad391ac0e1200 +4f,5fd3ddf830d490c8adb8aac67edce570bdd4648e395bb25e3cf431a1567c42a2,15b5c4cb62122c37659e212eaf0fadeb6bbce26e40dfe9e137b0991b6f5f3b0540da6cf98bd044b8d2bb862a2642ca24b0cacf3b942192a9c96561c2f4a4b73f00,53e009ab42e3614f38008a3dc5d9c4ef590f037e3eadc73fed93d3b46a0990fb2b7c1419acd57ff15629ed50834f30535a27882f094ad12e65fb00d693c1dfa301,068b396a51ccc38f1e95e82820ed1e2ff878dfe99395fe1a967d5ca6e61562e171bcb37c4198d97f80d4dfe87af65d203801cc1f5a0093ccf3425c99b795634900,bb2f949488c6438913c664691fc564af64200e7dbe6d0438bb2f538acef4e7fb3b43eb08fad2f193fe7495c2c2098c76a5b15cdf5bb6706f6dd6830ac1928c1700,ee4242e300c12e4cc8b87440ee9bc5d13bc669d581d897949383f24112796da038d9193456c320c8b2f34831ae65fbbcb099fb14eb39efcb3a76bfda389f2db701 +50,0cf1bcfde793113468b84051a21e718b9ff3b7cbbaecb1933eb756879d07af72,31dd7c6f1c86a7a8289b502f9ce9f8ac4d928822142bb9bbc6a283975e78abc10de406e77603101253497c080199a533c832900fe7a3fc6e505f00d4906a348500,0f867f891715ab3a74bae3e9d486e67ee5e786246c7a13229bf15444105096032eadc5d0130ffa6793dda63f2acbfae3d05105e4f6e7e370d38e872108b9a4df01,33e324a37225b28015ff1546b361f5150eddc7562c36dd2f2dc5a6888db905b23c167fae492e5f95b4b102e92f01611292b814b666f122d1ba7c2ddf3682592c00,a0aad944bc53b8c12148707e1f88be80d85cbe6d9070001de9d01fa06ae065213e285e236e01096e77d9081f50f414a8fb578bbef75822b471b27d42e26255b700,c46bb71f50e6e77e5c8eadd092e1258af682bc13e048d3e734c2d60ad25b2fcb0ed89439869d7dd65533c1a6d4bfd5b6d5910a10d0d910f98b0b9f888b21a5aa00 +51,681aab1c71d1d135926b671deb1b191f3b9b6cc9cfe60fc904f24c231f5fba26,23aa1eaab886353ad7407bd53aa8ec6057c40e36ae7ef78865bbc2b0a04d6e516def3e82106ba246b69f9d948ea2cfb67b982adce557886ddc537b28c177c07500,2581e4583d26c5592813472cc415081e2baf3570d8241699ce2d29b13cc27337370f098b7a45710528425e326d135cf4574801c28b61ea2d7df7402583c32e8501,9bac83cd6adf03e8778fac19a4dd288d8655a23faf388d8aac5b7129601383d8017996acdd9ea91027a88d12a769aeb6fc63a58c7cf5d4f653e3f5fa427a22af01,4e7e8888a0b66738727b2da4c856a30f00d5749b734267f880e0e6161db3cfc4250d91471803b00206197e1588cc1146b9e8f3984cda49443698a4e01bf3e03d01,085dc835a7556b53734635feb6d0d654b7f4eba1b660524e9c824d64255940b77491c34f2acae01c93e2f77ea120231aba13747d7922bf1505afafe904f51acc00 +52,b4e5c8d1b1d252889e1e0e7f742cbb4d2eaf41ff2d3956972ccf7ec8f6e677da,9ea91e97db4b3f399488c988124b4f875770d6fe8141079dd9b8df6182d84c40388564cf3cf94c3f8f984bdfe71e40da19e2d0a9b4f73a6ae5a41264a77d9fa001,43c36c7a88eb47e0b9cd7bfb6d27ee6232643e9858127e677a11b468d1f7a91414d8f66672fd5592423ee32e6e03579858f799dda668ad8020fb4018d391279701,96ae32c295b6804d1847329757e89d9d2da33f59eb21688843c2e249c6c1bcbc34cb0c72383763fb272b454212b18195480edc45852a15702d0a18f1a420d36400,17c4685807279a93b8be6dbb842d559d1c77fbc3394ead508828bfe83ea1a2204a7e613f6555528fb883dff1a4ff4604143417c6b069e9dce131b204b0376cf600,6f828f41844ea587c5aac0925f559c335e2cabbcee17a03c099edf74eec7432670882cb40695d22b8a4fbae5c55f78619fd9f0b4971a6e2c5301b15b7766e55001 +53,961b89cf3bd629adefaf5f2d62e1955320e62231b71b4745231f659b0e1cbd55,0ebe1d274965c9c7f924dc3b5018e209173b6b36e390296887b7d91b277f5c74189d09756e3208a73d2286cef757a37895790d5493aa7c670c8da10ad8b4898b00,de9fa8ca9c981903d69c2deae9a8f7b6d2c11adc69e585d6772d28607d47d43356b2c52b818505e013ed07d4db8a954b7c31c48e9f23f0fd684f1b077137bb2301,d7f3768c8ce2d7f994e87bdc46cd9be0dcdb0dc8aaab2fa0a48b7cf58175b0385751374bbce6b2d5dc883f9b6fcabae1eff996f44cfd51037024ac73a39085a101,e09993add4846399cb172eb0078e9036d44f1039f55d95e47cace3c525e086391df89ad7590557a7d694f7f314b1fa30e42e3b9051be64a673f53c901af2b0ac01,c616c386c6de87b4d362d44cda2f5a817639a844e7d471d02f66f78281284c16796f1a51fa364a98c49e6f683ae6d3b616871d55b8f0ce4e3467ab2b5d0ffac901 +54,1719c8ddbbbc6ccc53344ed349e7667ee0c0ff4da4350fb5d16ee7435548bccd,ac6951b1cad2cc590b9d103c81b584484886253b63980baf27e8503ec04d6c34464e90978ccbf8ded12e4a281025b2313acdb828930f2eedbe0ebf951d967e5400,da3e5e74a9de56c45b70b64ab8d84e4f56a4cc037a828ab482f5d3b428f1ff9f07f5290a4f8ff038c0a055e7e2b4dc77ad45718f5eaa7eabc580e0bc8eac2a6b00,07c4adc509a93c2bf7e53bf820d6d64d107a41ca3c2a09296c1f8529c15b25f33327b41ad532ebc0186d36176e882354ca6d2616dddd6729b57c365da57f8c2e00,ea62645ee2887c62344c57d2fab2a8167305d37cf18c8d8ac1bd2439d41528f0162bb515d55a09b89179797cf0b0f83a554fc57ba2685cda10c1824e7c7173a500,389658da67957745481e928ef76696594506e6b02bd3433e085171a640ba398928d5be66a7e9f88f054a7329cb66b8f30b6145df88da8e69401c436c243e557d01 +55,a31dd3849c340d89833abba49177c5ea1dbee51fc9d80b5cd6a70b669e4dc1b2,95c8c603ce223c06346140e32a3e335bf33147d966e1665ea39a90bd8297a9e97561bc4ee24d1e568a0a9369b5816c1b2ed4b47f51748b897ed14b63d3e797c400,1adf648f7542a261dd11b146e1b8c94bbc963ea1ea6d81c60dee32538889ac325a4e68f66d97e8a1189a4f65341ea52c136dc843497b7442f7d402a2a12fe98b01,c7454eb57e1dfcb5ceba623c7b3e0f6d6d4ac6c8a7b481aef8276a124606f6d51302ce429348552f3940b0824e54cf24a5ff37be429bdc69fbfd4dd4fddc6d6401,ed99460c68245ab3c1cda4751b61699987c31941f4a2a7c819761a7f0a6f910e4b2842a5148ff5ca77a60d08b54439cba3856f500217ea1b584fac388e160c8100,e25c4234c9b7a17b160ab877001284b7ca0bb86e60a130403cdbff2efff785166f0dfdcfa6bfab4948f05f018f71bd5d0428a7f5249811421712265d85b21f0600 +56,299a233bd5621f39fe0e97aa2865cb4d87641f0ad9a0a2d298de9df7344d7100,bcf7c95115bcf1c978b44371810b18f5ea88d28763eeb804902dd4816c7a849b740908de97cf8dec76ca7504d1025ef039857b29e52260df7c2e81d97b13b71f01,2d2f6c85edb93e49de59f4ddd88a95a089eb70dce45b2c1d98c3b014bcae0e3142bb5372a117d0467c43671908408f387d87ca5e71244ee736bf0482f7bf90ce01,b34025e48f71d47cc8c44b9c1f29048945ed8fb14edb96a1f6b836cc9120436330f96cceec3c16cbb05aeac538841f9ae0fd4ac0eb1f91b1b82bd790a254660101,163a3dc47cd0a225a47bf1175d99fbf04dc7f09c8c3183c49191b778b9e9ee0c4399f28269c2fed7720180edf087fed1f583f9bf09657116502dcaae24db424500,c79240d8bdd55e645ea6ab336c7a0d57eda072ff6783036803000eaf5ce77d42746dac6bb923bd30dfe19368531f3e8ed2870dcb019bca23ab7472b138f89e7701 +57,b5a5c7d8c664e2d927a6493f5a227eec98b4be3c7141f1b09ebdf1746677b1dd,c2bfa640bdc7dba791496c59ab51bf0d5f2be10e61fc0e6dd4a79655a55445424626f954c13e8fd5d5947c7476a6b250cfaa1ac54a85487931b2df1d463d3fe901,f393f697f6165f81be8dc1ddc5ebd25daf2166277793345373874b80474fc40e18121b620d7e736bdd352a924fd36ddbee5f7e15034328928aae2df6a6c60d2d01,514ab3cbc1591238e63f5aa1b69a34d7aab2b58f26b867590cf2ea5c9b4ec3f50c3855d73bb1d6cd6083dd2f5fe75f6a63452db5dcf37eaa207f4864a132458c00,0c785d650f81a79fde4008e93fe422c3fcc81d078cf028a56bbd2bee0f824ca077444fd41618fc981688f1cd09c7965f82459aedf6a6d1aa59568cfd939acbbe01,0494bd59fe236e35acb0b5f03efa6cc94b2b5f75e2ae0f865b4b11af821bbdf65b6cdcaef833dfb2a0c9b2188a71ac65fe18484d3c69855633354f8de743190001 +58,7a252da6d1984155006d84921550885e3699c3d0cb7281a4aa42d2693b2f9855,fab1afc3ef524eeb8bb78873190ad710252fe2509e658899315ed5055847f57e65d5709e97f170fc49976f7f35946d1daabe081cca462c70bb5d43810023f07001,728a5c611292e6b7eba24784c315d095fc66486380045e80538f2a5713786d2802bec1cd00870999396e8cb5251a6d05a057c46e161575b840bdd3de2f9ef90200,33d1cb24646d42d7ac3be4f9febde2788e170efa3e86ee053623153c073d44346c12fbfa975b486157e96812b9ed346769148f09b5a84e7be8e572bfe92c467400,02515bee41155588641529c0408b57b0c38139ffc3c93dc3af2a0130df334c422e1f809ad5e637b79cd5216ead384bffa9f69485878dbac470d9804bded919b801,95b78f602b9ace6b3b5d6398e27743b715d057b121ad3359c045584075f2ea92026aebe06dd4a6b6b6b098f4a063e080c6ad2c991b416ade11ac2a89a29ff4e100 +59,5549b3e3cfe39148065e85bf5cec36fd4dee7e24cc898c17131e84b7e0f9bbd4,98d6c5c575627fd8b1a066becd05265cb2cf5f7f7c169d87cd1488c5f8ca15a95f29c20ed7f33a3c6d83c09389f466c9310366af93d8aed3893aea8b1be907b701,bcecd955a38138a585440a52ac59d656bb17a1901ead10c7b11dbdfc9a3b823869e40d3b4178a2295c87acb3e817d79920a0d54d2c755fffe3fb004c4d0aae8501,dbb8e3e9bb72f33e92bbba53f4220aa5d8f0648f921c2e570dc0c9a385817fe104f3d5c8d25b11a0db3fb516ac32f3adf5e633f5f171c55f9d29d7dcc2c7d11500,caf54907578d7c859ae35e43b7399a76ec2ac13a39c7c7117d4e0724a1c3d4924b72e9d549fa2b6f7217d0e513826cd310dd3b04bfc5e6b3b4c04b2cc49fb66900,f52617a7dd7b85874d7b7e2b4f551a66440fb7dc9f01c13fe715c45e66aa95d660448736c9f42e68e52f75ebca9f7a66ae0770964d648b001c13f1e399c2232301 +5a,5b8b71289be13b6c01f8893da373f051419fbe020b481319be257bfd2214ee53,54bfd226a7c08cf2e1de3766ce63a00935fed665dbeae581e1047e15dd770daa4caa0efe8e6324e6d0265e4ce41bf51a728e80333b2552a05700657f670dac6200,93c203a83c9f7d714861bcb5fc14d2942c3bd32ebd685646b5876ab8ebf99d2456292f7f6dae2b617f5d83857fe93e961ba3fba5d4654f26438fac3ae222a7d201,f0bb8d6e9974d24d98470f02fb177eda1e4647148e94bda6f42bb2bc5e5d01b405dbaab21d43b85b68a2dc8bfa1087a5b3856d191bccc23cfe6dd792dd8fa9dc01,35d509a3772bd81f31e639afc4a294745edc83eff66954dfcc2ebd2f827737847f8212d4564b6060e72727030098e0c1b241732b75d5e403e29d5440f76c367100,1142c8057ca3d96782e4fea5f82a10b996dd6b4c15c8d1c2cacc73c37cf4d5277f8a171be4da0c8fe7391dda3612a138b0b69629b669d6a2194a7afbb853eb0301 +5b,1893810205dfa0c473d207b50fb9ee7f3fada7783da211f26eeafe92ce556544,34a02ca4072df358a5d15d884253f23b8fcc15fc6f2a276cec80b614cf806b0820a12daf18ade033eac257bf195c66ff568ce0e73be11f1df7f013f3043f822e01,8aad3015cf2a9b705d4e70a40d48d07f720a55d2c22f19f4aebd4b19bdf49e776b89b098b87bf665767db0cde6ec91c9347a2795b1cb9fdb11d9031c92b4024000,e9f3862c092554c5935fc189709b94bdfebadc781dfa3e214678d2d305f439de3b46130533385fe4ab47b696fedee0e07d82ec5fb634f16bca2ad1e837898bd401,d28dad1edad30423fe0b974d647e53e21e1f3f21169ceacb0c29a5c407a7e63d3eac92e1c3f7f097e11bc7855c58278c92dc9bb87fc16d7ab143eef7eb962f4c01,953a1ba5bd88ae2f11f031ba775540d8da7104a688da44c53faca1ef23f44fc561c22d4051428a5997c8ef333a65cd78fda9da7ff61b753c51148045971e6a0e01 +5c,0effd7443e3a7e4ac56c88658ff4d670b58ff674d47fe5a44492ee304ed47742,3726fdbe19ca7a33d99276f49892148f7fd8c502a356c049b231b6665dcaf68942484cbf42eb98839fad6b6912d76fb5540320aa757c75204c374d6f4b0c0ff500,bff4a86a40753f1fd132fda558ddac2f5877081b2641b3b5a58c644562a3e7ef6994784928e125f70ce6e060f10b575f0e01d9487dd7c710d92f210efc41d06a00,af9ac05d297d078d900d4379fc68101ff56bff40760da6a2ccce39b634db566d611ea68b48384deea8ddb7ed5da58f020c0c70b852a347496e5deb0e9bae41b301,835b0e5c29a689ca9412acde77fcc0bf9e8bce0cb1feb60efd3b5c4c040772e6090ae5eb04171d619e6b5d1f75022f86304e91622f7b6d82c3186aed615b5d3100,785cfc5286215e65d241b7908a92476478d219ead1e2d2d1d33ff302482123c805c1b639352d7065da358dc63bdddc7d29cdf4f94bc34846ff70c0466dd3a5e801 +5d,f154f51232d278ffcabf32ffa486105f6baf642d05e8b62b81063343154bad04,ccb597c3ab56731cecf2c5e1700af7cf8fc29d638f9b1a9780fd7c84fca4afa51490223b787804d87a675d8706c24b6674dfaef8991feb924578bb2f0001d08c00,311adb0e730bd72dc63163d342e6e5f7b08fe096f14d7cfbae2c576057d09f517b9151b3f1408de1e182c754c24e541ce40991e8db1e374abc2be24c500ee92101,54711a46c8e79ed937c927b84dec100a0f7ced8ac9ceee64505aeed9ca504d5d53cd82a2705eae5543f21003ea9c2a6072aafef34402dc8ca07143dca96ceca700,8c9d31b8cecd82269d66a8cf8bc23767478601a9a256442da436a5a1c8a703fd73e9c363827982298636177428299171a3409b85921f422f3d5b2c7aeb76676301,aa6bc131e704ee5a8f9dd216da0887c6cc54686809066637dadd9dfb0971fac302748491d5708fd6b29ac9d281b6fd7aabcddaae2c694c5064e9f7161396771e01 +5e,a70c2c496f5019c2b218a4dff82e9fe7ede4342184a0249b0191ba76e9f6282e,60ab2d57965bc176251a2d9202f3a3095c677dc7a88697f4fbb2d5a8b0af8f1f4320f46a690f94979f0614e752cf8fe37ae02ce5c7c1300facae0904973cb26401,f42763c8d3dec5a62399beb65881c490ee64dd1d03dda6b4276e0005542e9d4d633d4421b99f8a6586e5a154b96f7c6ed31d5ac80bc4ca5e8c837a8973683a5900,dd8f6846988e1a290aa3a9cac51d0404f50f1e0e8bc420508e7113d164d605db767f84a55173e222239e07a0d6bb2eeb0d37289fa293f7d6cddb8d3331917bd200,0bb3f65d4604a64ce98ad630e3386d504a21d8d10fecc9a9217e1389744a1be80a7cf7a843dc928f1fb96c1eeca695d9ad89db2d42fbd817bb737c981f6d1bda00,57f3abb794038bb92cc62e437766b6999d21a62f87da106e662efacc3599bfb13fdcb1737474cf6bc40acc0a79e46c183e34e45b3c73bbdff955a96a4f824ebf00 +5f,602eeabe3d2dab3f4b22254ec3ea1be5330ddf1a9ab28a54fab1d93b5db89d97,a6436543760fcb9f99f7dd55936af3997bf99698c4a1d04a707269a89d0fc04b76bf127919faa82b49925ac442e656d5c85a02ef7c6e72c1f24ab402e443747e00,f6a7c420a0a8fc8894055da53eeae2373b1601bcc7c9acb50b575d036119d8621a3c8cca99ca28f183175fafacd9c21b4ae94539349262e5dacf339251a0b20f01,6d422d39dbab1b2af97bece21a79d8a2a1e2e8e620312cea40d2cea287990ebd63ea91db397930e1d8cd740d78901386932af209a2f3e92ca461bc894d3456f201,2c3f3d6446aa7796a8ac055e6252e49e3c449aec857fb80926c9aa7acc46b74a60ba46a483fc4ea39b82e706f9b9068ec0847a45955c85b0a3bcf221da266eaf01,04738055c87621397bb8d45979da551006a9fc75301749c0b158453117c9091c04cb0101af385f70305aaa729776a3e4097d812776885a0f73efbc90603a683400 +60,53b9b8e3eb9db257a61836709070b9f61b2c56ea619aa4111f7e645af4045ec9,b2dbb1640e8be18a5f33d6b998a4462a500dd74a40f32a9f41d62a40731abbf55743c1f1ae738615ad1ee8b65ed0d5ad329740be97800b6d0c5cc3186dcac99700,a25b8024dfd3028a0326f676474a6096b3e57ffa2840091995494f1dfd6a67f467d0a7d2042101db8d2b6dec3cb462f690c565afa0d4ed53392dac085d006ac201,cbe9d25ff7f9de6597c3b68b8bf7a7d8a097cd93c90879032a6b165db487005d25db7c09e36db3e106b616b1858cbfc41926d4afdce83061988d1406bcd6223f01,4fd016b58d4758cc8117db4db9b2c6c3bf644880b2141c884ca38fe9106ca9d544d693a74ae6b65fdc7989efc55c1dbbc5591586582ec23907966c0c96e1e7a901,f624103cb07edaf0afa55d5ccb9d41c6c69589b7fe36111666f3d3c5a502218462502938c37f048bc0cc34f3c845d400695e16b817d3b1624c5fc2c6d1371eb801 +61,880ed0649fa41a1d0bb61191d3a7825a28c80330436864801b064660fc82d9ea,ef10cd25385688a2ef5ee47466625788895cf34811e0d217660a3eef4ef7fd0a3f6233e14dcd4f4a2c06ec085ecd2f154d6824d3feb3eef7551239c59ffbd4d301,476e437304376deac2d3192e071394158f8bd494c4d96da464de95e9c876a06043a7dbe6eeb45482d5bbf68f08d4f2d13f210cb3965b1ffd605125767896db4500,cb5b5a0ba2a392bd9b5654990cee4e29fcd741ee48bab0032ade2da76bb122d4385693ac0d4fd192c9059595ea6236a7e18cc03fc484b4ae34443932ce6c5c0401,5981a15817810406581a807259660b46e686db777cf846f25af760de4b7f53dd606f8cced5be665159c24173332a94e94310a3795489d3df061dff8c359a80bb00,e9afdbe1f1566a0a8047e155ee276a8520a3d9b8e6801f31d62c27c20b1cdfa173a65389f29eaae0d4b4440a8a79d8618039a2f51f4cccd38c063632327b0fe101 +62,9428ff0af9e886523a26940509a0139b99c25d0ab9f3799ddd3cfde0de6b2acb,6b52cf509a0ea08bbbde19d9721f70c710b9450483a4a3a164a00bb6df18b8241b665ff0cdcd1f92f20e38943ce59f6e6f6a0fece9c9407d40aed307b6df476000,4b88ea3d1257e126228de45e373dd556ebe2b4c87cd67a1cabd9aa769f28aefe4ae046f82e4862757947973752f110952278d1e813606bdf4a1f61eeb857e46d00,9bcef3b403d88c75a25c25d7d148bd79f3912f1d6414d1d464c2544dd5c79e83421c1697df2f40bed0089454120433c3fdb0ebc53c52ae020131b6b9fb364aa801,7c9930ad1d3cdfce1e69c5e976a9513bbddc28adc34077b17c97e9bb164f8e481af8999d225077008d597ab4fe2815404e746d8cabe9ecbf4b9d0ae73b163d7c00,953f0976ccaf4ec1bc39ce6466cfd8637cd110720ebc4544252fa9d1f6d6adac00acbc917517fc4813a2a2f66f45e11a02317d061d6537be22efcab118ffe2a900 +63,54ea96eca5c71da6189e9388a12eb8afd34273eaa4b63cd39531db35e1034cdd,103fc183cf685bb2aa1027bcdc304a7feeff489146a45aafd038197490f3ce9c4531da539328841639e4b8000e3f9e3dda9bfd213642c5888bce69e8ba194cc701,4ab0b46161e925fc01a40b821806ba2b77c2d124524611221ebda6333fd471e56a056d78ccdab951dc2e9f782a11844b2c7d2b5bdb51aaf3ee48fb847b94f14b01,fa97530356634c0a7a94c4e60f1b7e33678675f9584e7431e563b3ad91c62b6a5158d9bb7191bd398cbd948dfa656543a1aaf909614f9ba4d7a2531f8eceb73200,bbe881c1c4f7da001f8bf652c4422edcd201c5b49c4f3ad14dd077ac9a37de515d55dcc19f9bf87be0a42beccf338afb2f26e14ad45fc85c975bd96600456a2d01,7cb0909e7f77229cc13b47158a9a4abfdb49a89eb09b4cdb0ea86116db1879fd53685417fcb6cc7733e65106ce5d0f72b092adca2ffc3177ba4ca4dd32af079c00 +64,232a03a923160e67a8245340ed7f134e8c2fc6b7b06d45e498a833a6536580bb,edac2ffe5493611f41bef3844d2af1ca03facbaddea46ad2a2ac87ce80448b0b5cbcb7475137988e0514e286d171b5b6b0dc46db42784c8509f6d272387383ff01,27decf415a20ed675f81982032e17f1e582bd26b4dc9444841c381949de805a36d34fa77c6d0ff378205636cd4e0f2bb8557931831942a33dbb76ed8bf9631ff00,4e52b3b18137a3522803e5a11b204e991ac7c3768c9706d3107fbf3c6e6be2972099bfa004ba483f33f944151c685faaab49fbdc6c706c3292b7946a8290cdc601,242e8cf7fbd9196455cde7457152773689abb196f6f63781aeedf21ff2f689a315aa1d758fafe5106198c2bbdff69cb0611aa11d24407ff1c4865eb937baa01100,9bc438573896910f1d0651eebc7a29ec0b6ff80abda76fd222831e40ece95ad93176c24a7cb0ef73e0f57568b64b760835be4b6782f31d3797ae9c32e096a59d01 +65,eea516ee6809a57b40b1e7224cc2f3e99100c2d3af615836c841b969dffbdd86,e726b2e1b63d85b3176ea39712b59d5f10df8419813135f112b4b193d1ea52f078fa7ca8797375eb9737b6f4ec4177f707bc0c4237a4ea85dcee620ea27af0e901,ac50ac06ee72d2500c1d0da9890e83e1f7030b4cf0e84839f1bb99d8fbc912737819e98856615efa662bccefaa778db25faaaf4bff3350db858b698087ce261101,f67a5fd41024f58a207c42755720bae342bd4fa475cacec837d2ea86d3e5a95446ecfa6e64dd7178cb28db9ae914ddbc2653cc8ee30857217dee751b5f9ea4e300,303fce74c4b8f893ec6da6a13bf52ac67517521a5b9c3a4e834bcee0cba46259533db3f9c5e49d73e66fce387946c04f3f831e7ac4b27a29eb2516e8993dcf8d01,002627e33eeffe695533ac7d705271c845f617111dc42d8b0c2ad95369048f41450dc98e5dcf5c61527458b160180271522111429ed7af5966292c46be30bf1600 +66,89ace01c8990a2101cc0c8163b164699e4708346db48292f2f8fd478dce744a5,efcdad1cb05c1719277d2273f0a3b0691ece7435f0106c0ee2aebb85da3433a000eac39a213c12abd41ff9209f62f38b4f3ee1407ac0f38e1a5863b7cc2b3c5900,3b820bebe6235f883c80c61e06c566ab3d410e6fbd75ed620ca21afd06ade2dc0ec1608943fa2dc46a043fd6c797e2a7126eeefbfb334c4ed6b89fdf8f4665d300,a0b44153bf76179d6c55e45bc04fa0bd76b1d6881db52e270e43515531c1c4592b7ac1fbbaf19a885e6cf611499342f6c9ec6d6f8801d926abe3b8db66f8d1d600,f52167afdafeedd465783da2fbbf638d0904da1ee720001775790cb4d3f5e0ed576b6c2a9fb38c29578a0545be5e26f4248fac0f3becbd8d4b443fe7accd6cc401,bc52af12b4dd652cdca2d7a0194da667bce812eda5cd41a8950756d36f1adbc21fa3cc227060dd55faa1da7d9775546e21658f4246c15129f502531b4ecc3bf001 +67,c24cf4528b2aafb2707edbaedd18dd6c34258b4e72b0743f0f0bdc055e90f5c7,688b53d8641d182363c8d74767e233dea4b0c8304a867f1732e33e5b2a49e84d6cd79e7d5118f226c536e3af5544cfb2765b9a07a114280c4c7ab741065aaa4001,4ac9cac682af20c4a484ce4ed79e53a7bc6961ccff46ee6f83c3f78724c973985e629693b5f14ba4e7f5f322de49178cfd5c8b366d5fdb5e9bc38e2d04847f2300,209042d7567d241105848306e88d15220e92a4436c5989eaf5e080e5d544cca0085420a02e1effc3716c4c5c3dce2f98ecae6cf88b41cb0e291ef2035eac664200,5bd55c1ea659b02696f09f4aac6418c77087e7512e0ab11428f469321f07dafd27cb43ec8b33edf68393826eb1a1864a64f5bcc1fad712149b2601e2b48274fa01,921294164127e838e0391c4510cceb1dbc78a4b1b065cd658c8998583ebb59b463ca954d8b4c441d6c7e060a0b7db468e17df8b207e29372e72c0c0489d7b72701 +68,b9085fb5594a95bb24b75cc8961a0f8d089e2f584ecdb711df36e73a7e46a50b,e85b9a6a6e9daba87bcecef4dbe89e826c2f4418e2d9b4455e99a5e3f67598713216d136609a843aad56599360f9d11a85ea2e76f17ad1870d3ab286f54aad7701,1725bcac9b35ddbdd390d68d765a756034335ace72a42a4735d6070bc45c38f55bd48e0cca5e79c77ee5c9f70e28011720359478eac75ac7dc50c4cba38d8a2b00,b40a13461c187ed06be5f8fe5807ddc9b0b03dcc381d9006ee4d40fd06be4f4f1b9b056f6c92892885f9040c5f43df77db7f30c1bddfcdf9461dc4678c1e06a500,ffd7bacfea783c9c9731b102ae0375a48516e1260a796e8ba2fa7fedd3e7259c71c37cfee0e1d1b3b85f7f1f3a35a59319d2930ad7fa6126e1fdc3ebcd55091a01,ffb7618e9cbfef53ec5eecbd800a0bd02a8bfece52b2bb616d2d3f136e49d40a104d7433d3230c23b85e6784625fc368f0762c0054bb49a299e3c0b54164107901 +69,432b4b9c23e5606fd96e62b05a1c2011639c160c1c1aee611799e86d1542a73f,074de3d730bc9a9b800b7104c81f9ce5bd5ab41d650c76cbd89abda68a8e7a2c1213efc4c48551b702c8c3ca832845aba1211f4026e508a276a0452882f0db2900,2e2d4051d9bb17ade9c0e48b0fad18748479938af204aaa4d4e9aa4c46c135044ea9095229690668e1b6dde77486e66ba0407c46ee7f68bc37ed42844431a75001,47cd7a2e7f4f50476de385088fdf14a52ac8590f858b6a4dcf9069147c173d9830408a6f4e7075d13fd9f701a39051902a77acead4b4b9e20ace994f44afc49100,1ffea91c862d91d1c5277123e783e3d1127a197f9e8847482d21a97efac79d2800c85a694571aa0662f11a33d1e7a4b5e3067123f9e9d976ed7beb79a159d21e00,ed18d3251385763be504c3fbf9fde0e0d64410a522cb505d285c2d39f5de70a15541e3453dbfa2cb46613382ca4feb2b690ab2888a7a73e038fcc72b4a543a4000 +6a,3ef6cba94a89aaa772ec58f32bb6f310d6f061af5129f1956a40150df91389cc,ce3a746dbe4ba6a33cf590147b3159a03458abb50ff18045d99c1f91ac0616f0344826d1c6aa746a016d907d2974865e22b5da642333488309540d4eb6f0300900,d6223d517c09562b7f4cf32cfa276d8944bd5e2926a7127db0f06d0f8fee495b01ba2447183a435d40af74c1b9d32714f73e94224c979a62739ca9dc4640c6c001,08030eb676e1a2363ef76702814586cb475c4434eba2eaebd836fbaa0d5b18d433be9200010d2a7e1cc9aa10ac283f8609ac9dc0c0cf6585265a8d32417f104901,44a2016e201afe54995ae94798eb161414cd4d592c8b00a7145dfb720352725a37a17ee440cf6c0f10004fdfa851254f22d9d445bf6ba39eab4dee288fddc0f400,c9b8807d0fbc3f6b4aeb66164eabb88ef915b621d01955d9772be6935ddb9a233d6a395b92231be1b5b7c986262bb938dcea81eddc87fcb228f0a1080902739200 +6b,d80f1a0949bb142c6bb06b432b3f568ec2e089ec248c3030a8b825d2413fec4a,4f9081c4058165fb9ca751cdc4ca29c901ad062137214287af29291c2ca1dbe04181b239cd4613c83555b8e637b15240dcfa97bee76a0481a08896219f7d64c201,42b181cdc765a9866a4844d4ba53c06c50f94eb150ad9b1086bf49dba0c13d3a07fa7a204a827e440b66e0fcbd8906979417766ab8ffd9e9f2ff572c1f9ed87f00,852eb7c94f329deefe7eddf5a7a400e50d921a8ad16677ab9c3845fe7a76b35f469bbbec9f0dd77768f2809f1e100df8dced5ab29186a8b15ad8028c0692294001,646ec55850701cbcc51efbd40c7b0e5a47c0d9347ee7b0726c841366d0707f730b43ba0746b7b0a9e0505dd79aa8f9cc8cb35620b3d9ac6d60bf1ed71237ee3f01,10d3f9589c75f631bd0036d2849e90f0ce0cc1233f570fb443ea218ab84a8dab1afa1929178dff6631f7c00b64734c2c77fe9b3988c7d35a9aa5174a7d4ed83e00 +6c,0ab5b11d23839948a20f19121ead781fd341391d5d423e50b33e7dbeae639afb,bf3db1579e708ce3f3bb8b3dfa5f4020da395c789391dc7da1d6d343328af1b53f8f262604bfe2f6c6669516ad5a5b5c594ac728737bd51cf18004f9d715023e01,fcbc161acd0322f9584ed710a74d5d7779ec19c1d391e203f5bccbb1a46c65c16c435995909313a249e8d049728e0347e000db1182100543db13d30ccca6e18a01,ff46bca486248e6d4401a547406e735c21931ba4311462ab303c6307685850815e2484d9b6633edc60e6b0f1b6459e0b0949addaa9cdacab33b0ba523f515f7601,318e51e71cddfc84cac35d110de2c82e17ff56a10ffc00ab070e1f4fa842e2947c912fcb36798ffaf2333421355ab57cb8584ac4201e08bcd1c75c77b36b72f300,fd9221f97feddcf8029d7ec3768171d96d82e052d153657dbc6d0b1bd18413991be47366cc76dec7ba15eb907825232e40bc2b4cb4d243aa769b9126bd70d30000 +6d,1c0e514bcc43f55762606fc24332a70404a44226d4aa16763ce02c666506f1e0,de33c66ddbeb987272e10bb0784f8faf3444cb8e8976f5b97d26558f7e1c02a047718a3396216f342343b369e48d1d6808c7483c41c2726841c219145c877a9100,53f33b28cf581fd127527e2bcca6bd5662216d34f8e0e380029dadd3c1dcc6794fdf9fd301260a6b1acde2e88bcb17e59de12a3febd7962acec4ae99386ef3c601,1578c1d8a6fadebbf02e17df6af007a020aecd09fcc78d142f19dff5a68102693c4f4c6f8124f1360e33795a4c0304f9e9ab035140cd7fa72ca831d4696851d901,682b224bcc48b00f1acfab931c2f7835972b9c4a462dd676ae1080ea82fac109068f671162cefb4ff8bd9ad822f52aa893e660f1d0e1a24f09425d75b5755a7801,ffc8b317be5a84bc03c39c80ae288bf691c8b7e26c386fe6fc1e6124490a1e9a69721b1186a21a289c6de552da74cd49671290f22079dab6fc6d649a1dc825f901 +6e,13091892dccdbb575008430e11e3c340de13a057cf96c1a77934c34dacbccac7,ca145c754bf6a432379dcc2351384f687881b3d7ba18f40cadbd6008a35137452250cef3ba78faacee199e912674e1c859889c769c6f73bed1a2a4621e9aafc800,5f25ee869f79d12bedde1098263893a9348f961710199aba4582988768e961e3764462301af4a29401750feef3c3c888ea2d07ce9a7cabbdee272c0c55db62c501,138e7a4b7947f9af4aa4468610fa55a847a5daf1c222e632718f4acf7beea4fe06510baf99d30030cf99dccf67a2795e471113ba0c966ac5e09ee9e1fd87767500,60a0719ed5080c09b5712feea1d7fb2056651d0bc58745e0621283fc3cf3a45315b596ae46f17433e36b77236e4da599e30eadc3194736aca18e89aa5bd7418e00,f2258805fa503f3b8967a288685c4fd5fc50debce556941925c58a0c840aecb76dbf909dea61bd3fec230aad6f9d1501b72aae48f555b143bd7b671f30c4547700 +6f,6c89501591ceb3c07c006cd6896b29ea6c73dd942cb3db2e21fe758e86bf55b8,d6696fee8dc24364f49c5b397e46b70f216312950698f637612fb1d6cb55229d61bf03f6328c4532afc69c0a5601cc39c25f22b078950e1500f0b661631029f200,c31a3a0f111b68318be4b8b39d3d4f23a614308ec28fad9b76305967db2c84f15f848fe1ec0dbf7a23dc77d169c1be8f0c63930f5a19dc1c762b4de285623a7b00,8de339366e67dd9efec58a204c9267e0b9ea3d9f5eed4c73834e255e5bf7dc7131a86e00beb25149ae1dea2d6ecd86873a72e1d99545e4a8324dba678e1eb5a800,62ebc7924770b1fa9649b260e83aa6bec78c36f4315dc7d2432284d1104bcba36074ed22c2fbea2955435c64efaeb881153b991e1604aa130422fa4e513f165400,1f5d0abfcf68eb4f1469b579063087da0f8e3e5e08ca7a0cca6c80be262f47cf6c82deb66dc3beddb3c66da5a51a58a4877a921234536c269f8543958ce9bfdc01 +70,ce0a790fbb1b000150fdf5220a1f2951208151d852e5e667b2c29268f29181ae,dec74124df1632e08bfcf9b74984d62566bf320f6ec7409c74cce542514575622f92ce3094ffca7c518406cca1ad9bcfb9f4fc2b7043e0bf49c7551b773414d100,4e4d80acd4359bbabb8fde56418214ec11b70998ccf20f106b74565aa9b2570b6e0697765268b2ec0956fe91f34a1d803d7a56885fafe25817f94c4db8f605d901,9677266ea29cb1344182ca2c5274ae5ab1e80d72db08a90fb72beec4190395d60a28d6cbb0af5e15e98d0e8ca408ab9a9d3aada2cf13300b7cfd8dd62164b45300,674c77e8483dfd94fce3cda6688c2240fa96b8534d1071beb7d630fac4e64cc52618204bc1b98f4716e6f63575039d4e91c584cb311b746f9a68bb14dc6bf4c801,8d582deffd3e973fb32986daeba3d1aa9b3fb4beb6dad4cdfac6621ffa6359be23b2992c7c0540e2ae7adb0e31cf5a9144feaf6bbc1d7c0a292c89f96c6a4adb01 +71,d27f33fcc5384db8c19f20f1e6eedcb2fe0697d898a7700c1beb0afdcb923d08,133e193a2fd432cd3384ed8d5b2273dbce50d36b95dd96ec1e34819d55244f451786c3258bb317eeb6c0657ff0dd03b7d0becb38da605d4666f5aa448742249601,cfa8d710966d438e8296cd16799c25a5386a38796f7e59ac68780f4707cd92646ce32b11b456f2533724ae86db21497a59bb0e41758c9c364f0c3a5fda4426ee00,a43a647a7de3ac0c17639edab2adc29abb3ec089666522a71b88778b42c700a96e8dade4c3fe35e3c73292f4cfdbd9812796753d56e9143d82c11cf85c94289701,7ea2524ed139b6d51766f18b99edf1d9cbfe355d934e01fe355c0b84339f11236369f83c910411bcad3e8eb2673ed8cab70f1b9110fd54be5cedd7f47a9e1a4301,8e0a7897230698ac03abb5960c3b0e1462369ffacb418aa4ff9f5618d2a7d6b8287e41c6ad41442ea6cdd57dfa2792114d63e101dd515f4d6984c8ec3005f6a601 +72,cb48cb14888802e658dfc49b29955b1e9b6d1c7750acf2e695d6f646167717f8,266c2a187c9a12557b56379b176871b13887cbf8c59a016b808399ae27a66ade09376aaf67a3594eb95d780af61c50b6a14296a065bccc73709570280e6a668b00,8ea350360984220acde31e7a3b421bec49b0c02d26f4a1062c1226a8fe4702ac21b3cf8cfc5850a966b1dc23d231cae50c5366299941dfe3e9cf750142303d4300,054e6c47d1740b7645f1954a3027641e8dc02b0a139d4d93bb6ebb8e1d882ba22ce9bdfab255f0158af8057716e459428cb0a64974ac2d9d64034461e0098b3300,9938cd53aced6fb54fa705f5ed5671fbe2c033630322f574fa748f766c57f53b6b998949e91c22b486f27f166fc82d0b4718e6a5d549ba365c14499ea523dc0701,95941e367d033dbe818e63d5f9c17bcd4e59d1c30a3373d349e1c2217072bda56e32713aecb6dbee5e66526f0885134cf5d75795f6e7f51f639acbe577dd67f100 +73,4c65c1d7359a7ee947995af1dc613985668ed9e155115df4055f81e5e191d58b,6e33f205d654d9a6a223dec79811e0ad58e018c6531a8c4bfb472fb2c020b8bf37931c245178e37987f8bbeaf3be59f07e6268cf0af38c4ae1df6b0311273ace00,7ab1be56442692b23064d8103c4bbbf0e2917486966313c8e88b0d482ed61a653d059f9aca8022361843b0f1046a9e626b1a3d1556aef3749764b8ad9c575e6900,a91f1b5b2b9f7380e98138bc8469bcc44292023d0cf7243a2be7968a275df11b2fc472949027459b2b17bff2caf7cee65a6ced2c8de9edcca037f0404f5f670d00,c771c7e8fa23cdf8cfbfb5bcf23a490ab9fd1dfaffe853a3e13e7ceec275e1ca3d86fdd2700378a1ccb96f13db9a78313dbf1efe7e21311c5e33f08969e7154901,ef0c183423507815d6ef6f86bcfac0bd54fa6079235915277045b331dc3a4fe8484755248d3cd74f86fc704d650c841affe759bc57ae422ef69b323e6d6f4f5f01 +74,9239643c0993de938c817e591285dd21e9aef26cdff520594bffe6ceebde5b12,be6268aee10c8bafb0a02e35388610291ede14f545f076523dca69e2af6a908c6b58bf5702f5415d4992d233309ee96a9f3e5202e631ff3d12c38183269ea93200,45328f8f64ebb1a49e250a8003d317511c841bff6d9d0cbfa20d225972dc7877569e7bfd260b9d540e16d9519944b8444bd44eb11007ed68d10a96309e6d990a01,fc2521b04fb13e2f4bd6e87f1e4f485c937bb515440efee070097550e3c09c4220c3229bfa3d4e8168221571957b14d81bc571ec87247dfe3903f1909a7c602f01,b96d04bce0ce98ffa0f7a474e27a6ad4fca1b2b817028b5e0dd26334cd1b971359cfa906f022441794c2e6a7b133f5f0273b43c6ea5aca48e6506c8f25e0ed5700,271c5836a888f1aae7901be8d019afc628a0bac83549b71d3eda8c5e4f0aebd85bda2db6ee1168492fd5fce90708b27c95da99e32e61121a83245d665f42590701 +75,9042cc2950af0640a538c1c04c83b63a05552affe91b1db79e82110e63de9537,4e88a018fe86e2ff4b2563b8e1389cc9dee9d881f9b855e28e136ba6bb89b57227e4c882a9778ecfb2c197b4e42f88dd5651c9246731cb7dfa8ada5a0d16984d01,8f108713f7f8a6f3305da626947b17f7040f4ff00bde9123a925a290453f002960bca2e1229b8e5aa4e55996f279e8e20b0282f71fa258da1b9405a7bb62f05601,45f44b6e2b43b8ba2da683acb0846e2578b1344a6fe91c80292fc834a0282d0b02287f59c8cfa57324970743e72fce8f6305d48ec87b51498735dfa1372c08ca00,b50353bb140997e24897cfbc3e9fe6c42e1af39dfa5b86ecbdf220947948fba43c0051a6302588780229b42a24cfe874c071f6be1ba6e90722e74b98604d721600,cc1c8e4f1daae0fd0771b05ab698c2a26ea15b048ef0526d37bf52de6da36919599a7be61670968febd15c46c59e284c9aab51bddace88ee471207a59625e52801 +76,32eb2c65a487fa35c8bf761a5a5aaa32557d6c07f03889abf47d8ca60571275f,894646ffd697dee61102b1bfff51c8b97e6eaa540869b52544d1abb5839c257d0c14cb8414ee36c6c3ad851ee18e3e40a54de4337422c399e387440461514b2c01,ce24dd8ff411b04e12b6bfe5c2fac4be8173b413078519c45ecad52eaecc66c9776aee21e2837d0aa8d31f9140b4612ba3a80199c13b4fe0dd67ce5e6dc95e3401,f63e55719903153053a7295499a39cf5bfb49dc4113e7fb0cda953fc0476396052c2a96719e0072c90c97d2442f79ea7933a97b803d7f3216230e297fa623efa01,084e8338f2f39f294a58aa8f88b9ab26e0aae0af37cfac5cfdd32ad5c5edc7c3318f2597fbd1e5a0b47fff52fa2a7cb4d78808587c297ca3bc0fcfb707fa85c601,6cd7fcb3ad79f55c9a62a7475b402af939657318875a079c641675b578c37f3220a649794cdbac19eff2e2c6ebb24efab201fe67a835e6a3860273807399c27900 +77,34ca1b8a152aac3cfe35aa1a501378e6d52d9c749fc523361d0fd5870f97d0c5,cddac9ed36d79b8fe2b4471e3bac03d02c340748e40cea1e7064e8324a3badad04e3f49a61a43fdb7696a8864b52bb81ad494b0dbbb5c851d5d3b3e6e956464f01,c19e15cc82c0fefc8dea00694f778ce485782aabab806aa2134bdf0668781de31e79b8976c4f33e11fc7a6699632512aae28ade70b00afc04691d09dfa64158b00,c620de0cace9dd8763f1595409e2a950eccbb6d2d2fe54ce87d857dd5a0478964324756da1675b2551ed1e1b78e71247d42d872dd7a43e2aba8955acfa708aa301,31558a864de8306a130e829bcf11956208bd32533e4766e2cff215176efdc7c25fd52909efa4fc92b97d3f9bc48d33ee1de3c662a182ce610cf7becd3042dbec01,248d8850b249e821bf581f52e55b01ca689734a3be434e8ee2bd4ebaad8f7c160c94e337a2c99515a3fdcb4d9df8156c1cd29acadf2baee8939717d70c28563301 +78,1d2fbfc97cb31c0e2836eda3e07bf28715752df9a31a4690778cbd74c21189fb,2ec1fc58c42d34b2dd8905f36affe2364ef6e000d5bee15bdf04304c6399923b6125c43dd923f9c355dbf8746369871f4093ff17aab8209a394e34ad4d69558e00,383769b374418011bdaa34e9a1dece2e69e7ed78bef3cc23ec8f0ca833a1a9a448121b60e15cc5c360299d1e653268bb4a442bf7edc67ca790d11e97bfc6249d01,f8787c0a57caf08612e0a2217497d6858363ccd7c6fe136f2bcd4743fc285f9a43eacc7842d9b8b7fedb7cada20f4cd4b77e427cccce76395735c5d93edaf2a301,d8dd90c9c94521f27853f67ff0335fbe42319342508e7da022bf0f22b1891726362affccc7902b087f0b0097d61d05aee7083da5cdd9107fe1fb834bb9554b3c01,5189503cb57085e62eb53b4a40f707ea2b2d7d65f1d2927a915ce7a1616b9b8c415dbc5dd732f09b556864265cd3f1dbf98373792703a03a6dabb31e970767c500 +79,33323b99031a787e106711d3768bf9e6fa27413ce461e3273c86ba56595fd8dd,1a4a660881468ed892feb541914575e758ced531fbf6d251ce67806638fdc8a350872e6b08a65873be59b3c61a033b2c32774dc538e85e964b88be5d908bc43901,d75013b7790d548b44dfc95b7d83a8dc73f7989bde9957a8191ac202c89740de72d03ce19e14e7257cf82354e2763a5179bad330d01b4cf02f229064e3ce69a000,01b0e060f3b0961f5b357d252d31bcf3470b3c53950b185912182ea6d380a1e22a50d18fd628b467451919eb74f2fbfdd089329574cb7b13c3cd1ca1a9c9176701,dc4eda3c707d3ffe3f1ea33889c2644251fce1c81adb83c0d8d87f730b4140db2db00b86ff60ab3f15b3a2655f761f3ede15a7621d4c76531e30efb075eaf77f00,38bdb7b2908e9ca0f274b64ba971f6fc8202ec4da2bef19202b42877d54e201a3cee7b5557f8536f0f6f99401b33f9afcb8f2e5d06f8a1fe9e24326a962915d501 +7a,ef042dab98eb93c4bfad7babb4570cf9161242d1aefe70a6ecaf6143b1e62186,44fc0d254cfc137364dbeaa118d3a0a3498eb51e30f27201e005f48d64a1342e75205c8e54868e933898618f59331b15684b43bb239172bc4fb418965d92f1fe00,b9deed52886cf4975b4f541ffffb946bedb7c663ac2ef5963735e8a501a37a2e30529168eaaa7cf86408c687cc760f037476287cbb3370c33ff7e765d619eb6401,74ee98afa8d35ab80c6eec548aab3911c55eacf9ed42c1b7c2325cf26e260ff535b017f56700749e8dbee991a4933b25faae2b81622fd879f8f24191c159e08d01,69a3ab02177e57c31b35506aba6694491455a145f494f01ca4b3c384063eb1de22b32d8e21c8ad010137e37f9a12f3e5f4bb69a5a1151a515b87164dce40344201,5ddd2baabdfe693c7e65ef48d85611688e93a6b78a66203dd2b1c506bf302eea492baa3bd390c9c14820f56beeb29ecee2c08b4ad4efb8977bf4dce73dcd058f01 +7b,f0f6f09e4de90303e182c0ed28ca6370dc2de87876712145828d9281d92f3cd5,087d1da8b5ef54e0e663a6d21cd44118f05ff52090f97f8e792d707b1949e51f7e24de084ad6de707c605cbbccf104b6387a440767fb868c9ce41bf2364feb0e00,aab45b2565cc6909409ae1aac05bbf53179fb41d0d87c3c1d8d120a8271229dc4772c4efa0d227548824333b573967c50c3bc3b6edfe159a1e50f64be719e40d00,cb2dbf2a50706329aee226ba6ff85e6a1f6efa356ea01ce9f87bb7ece64772e25ee297c997e07762b503511ffd0370f387c6faba116f6ee7499bfbc91cefe57e01,2ec574118980d454f737c4beca3c265da8b43a152b81df5ef82e369eaebc5e475f279316df20ab9df38ac4eb033c3aab3297798c68c97b11a60339c4c383b37001,fd955b213cae267b44ecbccb90ee30f1fe0a8ec1b8265f40668693eb1a1a793872593af4cab04beff79219b361309395bf1bd1196e435e0c8b066d75a2e1c0cc00 +7c,6bd8419a52a77330e772d46deb74a9c4119865030ff56ab66594a21289cdf652,64a9b1931e187a9f4aa1386c06ac80eb0782938fa9076931c136a05408eb12656f7840c8bf96a1ff76dc53eb23da79ab2ca7658905c6dfd765e99f1de902d58900,1cbe392314f5ba65fa23c37897b00470e7b7b770a0b9dbd03a0dc89abe0064c900ff169efed02f2f3944010ce8652c2cd913aacb65df99a91f453ca4ef53daec01,b0e753a1a3f7836f221c96ed7de94ee212d0f0adb99aad519020a35fcfb8acaa6135b51a67ec1dbc46d296e0dac56d94d036a4b05b89cb7f97298d01baf61de000,f65d46dbdee269aeb39055989876991ffaaa9d59b69257c5f2ceae35774540b67854aafb67c471554f0b600da6113a071776d4f342fdec094a42552f79938dba01,110b5c9cf7bcefe9c3079ff218d2058be2f9f6582dc6d56286af27bc5c188fc5763180086fd6a4a151581f47c9863f089f654d048f321f5c0ff000e7f1ab5b2301 +7d,b55fd8f03d315804eec269b116eaa7ee3e31f48ed87e37553733ec75f58956ba,e6201a900f1c5bc354884a367b55e4337bd6a0204c58813ec8273d1f3752563553bedf15a352378f3763e1336d07e8194f570af64609ec4d65731e7c6a5c698100,24b21c8e80f1c138c10f48234ebf68d9cfa2d58f3c8748a2816e4b8b1f110ac43871f62fd22b10624a7f7c75be62286c0608228f01ed22becbeb163c87bb0d4001,bdad997527446d6d4f064702c03271b6c27882a0f514f2d8e58c7237dd95a3395517a4ab792ddbdc4de9cbce9ab170523c791fd306e708efcf45b2414b19ae9301,bf64333cc78cf23aead9aec7d613490482d2155186a530281da20d222ed4a2d1038d74b58bd9e08bcc6965c9c4314ef423e609387ad2d180b684456bcdac972b00,5fae4700ece40a0e7cafc4ec6e4637558b8e1d014fa9c173eb0b3452022c9eee5ba2e852920844ec417121d61a116dec1aa2b4184d6d03394778a8deeba790ed00 +7e,08dd79f45a9b3797815bd6d81cb346fa834c86f310c4283e5bbf162538778ff1,aa66e9c08939a7c34734dacb7b906bcaa2186ba8eedea41e2ac80241791a9d256209e26b66c85129e39dfe7ae0b04626df568cf86650b98d2614c30f8e47b62701,12dc83dbc868ba5779afd8c6f370ec5c398b7c65afa3d2c3a2948f22652410270c0eb4e464dbc0463c7149780de357b6e3a066cb8d6a5145cdc4b0232bdf412201,7099824d531237c8b1a05f84952ad564657e29ad173ae723c9d5a970ed69ccd5180bb686c2b1a2d950ce06e897bbfc21820a05d72f25d1dd50c2be6eb65b540d01,8d6c40bc85fd769df97db74aab1bb4c7d14518544cdf7463a5374e13da66a8ca2d8afdb582e180b57762585f84767d6e573c6f83a956ffbe47e4369e83f7b39c01,56c62802df33d72196413c60d997bc2269dba7ccd3ac0e7719feff5800ce61616dae072a068bfd8e10b6f23510ecc70b660a9cfce6f5c7ccf192ea26488d1ff600 +7f,6a58a440b37e1dd5d834909fb31a312ac48e3a37962fa87d5c51dc3b4a3245fa,acaeb0775750b5f414ecf8c7eb82570c96ce07160f6e332505141a1dc2bafe94375f24b4d8917f011925d1e4ede75e04df4eec792971e08ff93b2fcf154d595501,c848fb263a79225a146d072da3b4529f5e570a7c1cc07db9e9e05d562534511a2ad6c692c83e72d58d3d7fb65482c14163eb8ebd9f85095814d5e04879f57cf301,bf5f0237473a4373103fdc601114ecc1fa67eab16a49c2812de08fad340b409b25c1c52952a5ae2c22a8c835fd706e68ac2e7ba6cf9cb32db4b5439790930a8f01,45f9d1c0433c8739d33e45a1834d4b9b09fec7c7c5a99b97956e7c72cfba8fc86dea4a08b55e0f0b0c5883920211f0ca35388c443f11a756410bea920490457801,c79a806f65f6d453cbf253ec4fbcb45649e57d795d979d64b9039ff958641d180eb449d5ec6370da0cddd6b9aa596902b1159daf63a312b77b388638ab6b211301 +80,a092e273bee6453b216c8ba681e9e7186689374dfd3faffab2a529ee6ee00d1a,62cd5f625e3043b0f1606b28812d703e5a8dde6bdc53ff8f09bf7506a63fafde4e8690acedb4d6ffefe6462a356b6799aeea1b96bf21a03fc64008a963b6757c00,7b81e07722a4d9a0d2f77ffad5f00fdf95bd3565acbcd691a8f050a7a32a9f4e53cdc8cef55bac90e80ecdc09888233dfde6e2b0f21cf14c7dd4873906291de800,00e2af909d023865bcf2da14866f458854efb2bcfd06e5b41a79be7a00c864b36c0deb183ca01a12fe8a0e406d4d9169cb9ddaeaaaa1bbca6eb9614a98afb8b301,a308f0ad0cbb5ee796844c74f1a968a94ee043c7bff789061a69522d04f50af440a0dc2b03458a89b72099503c087a1025fb10d80314b41ffd583350fc23c1c200,07cad88daebd40dbf194fa2761eda671c08e3655333010236431a2bfafd93b974635c0f299f49a7f4219be1bfa6fa492766a06623402bfc1dfe18eb68e8facb701 +81,f3b3340e9e56a5398884cbf7cd1aef72a614a08103296df7db0f7e5b6f0ec468,22cd2b83ec661d7164142797adcfed395c2fb14eef44ca68a745870730ae6a5f1fa1e9b5f080d1f79231d3d8ed51b91841b65888c41147eda62701b2e59cd8ca00,bc6fc542a863bc268b3d73f69dc1827ca82ebf3f09529c4f86ea1ea1eb7062866255883ef590fe1a9a7776730cae59ba347e7d785d756eca10fcb22a61cc20e800,52cd30a246ad6da80d573559ecca88c4a9a1696ab814404ce5dc15b781c7d39c359391c06f13b674c515892637837098cd4c492203f365c62264f2718351cccb00,a46002fce5b337f19a4d826d117e2e50a13257618bc7835367c8f29af79b1c7b085126a4cd678a6b96def5c8982dd33930b74b6bf64dec83266395a1d0a140f600,c2c27a2386890582bffc01c815d76d4d0a1c97b06441db792df2607d10c193f9150e408a770fa89d4fba39f878d4b1775c10f8b4c2e5b1acf46aba3a5714c4d401 +82,62b8274d592cba68afa540961a902d18688917197013b010a7c690c433946b51,d053fbbb9b1d76e16cf3479c4f3b3be1b69f04bf74aad1db24893b7aa087ca11374f7a8e9162fd81959ea2a26caac2b4a9ae15225eed2161ccd28b51b4481f5000,936653386f36b03ce90f54ee0c98597eaf7bcf9418c5fa8acacc015242ceb98f127a8d1f0aa036dd3fcdbd27351fc69db2d348246681f13d1c30c8cabf787eb701,920d4da5b7442a7b67427b0c7bfb54d9b5a654875652f32e834cbec23f4dc85d001c427fec375db7b84fdcd0471794bca04f37339fcd5aa5179cf4e42c8521ec00,3e7d077e456c105fb892432b5ecc12b254dd5d6c63823ace072058e4973103c13795ac65825703701ec72036b6b14d2832ea6e4198a107fd899aff16b489324501,24fcddb23032795df992082f0562c314018135b7d7b2166da5b977fd0bc239fa458c846444f5ca0b5c0fdc7462dcfe19bea434254a9380c970647f5b94daca7500 +83,1747d48bd8f86e7762f29f9e1407c437b28e255383df1cb3b47420cec9bd02d1,f327dd74502056bf1602997dbe1d6294af698551c563645b2483b4b354ac923f696e1189200af65822b1dc83ed4b223b96b3dae526088fe55b52ffae09d7df8401,0e5480a1b3c6042c6f9144ede79d84b78c9bf3a753fd4839a0cabd97e71e9a8c1a50bc9f33618f98b039a5caa28884d764c9f012aba5279cf84f283503c1d89c01,cfa4e318a1d47b76b3c01b68d59bdedb3454378df75e0a77d0040b4f812ddd8e546791d917693b634396c083b3ced167a2a738bd0d9d6713922f7e7320c2218101,217292cb65ae79c5c03976f612dea832cebab82e7e9c43373534c585c0ccc93378ef2ae752c00fc5ecab86a7471972963e276d541e71fd853a61a11bd571a51d00,1503320fcfbe0ff7beab3f9f7da14a4d008f0bde66b21136864826ca53dec33e397511bd13fe25362ce8db342edc296a6eaff65e8e2198b2bb8964bfc760ab9201 +84,62210d2d288099249fc1958c17ae99bb81c0e3fec032170b0284151f5853e68e,286b03198f47e9ec291852d8320cad78e369332e40907680b44a25a77f2a5cc3013b872594b748db3facc25ce0aa314afbf6c029be47621079109851abd5eb7201,f86a5a5eb581b581562cf3450629ab3f36b1c8a60e810352de83dac2012c20ec0f9de5789cc64cd25788305da7f625b29730e5220c326cbcf2ed02f4b5ab7b9a01,b39adfd79e6ea6bdc1e44ed2da14afccb5bf5347103c2d40c7a2ca27697902ec03a3b87ab6b57503e1b9d46fca01744654936f05c79d54966296cb5402ae365101,6f0953c5db7ae9a95fe9666647484a88f8edc96af75762a280d504fda515aaa57813c5f278af1d8da04d3aff4773fcb6f010637efdfd0ddde36290e77ddd41a601,ef14a56022becb6825b7c750923f84d703a5da4e7711f765f9f6ad23da47463431dc22b4d019008edddf692c50a25a0ac184f3ae22ea0d00e9ace2f517eb94db00 +85,f8931c12b38b8069daabd131e62f92031d3a39c00b335592e3ecb6a5a4bf3944,b5a1e3159f877724092e0cb49948f4e5bc2d61b6eb56349d1cfd0430ecd473ae53e8d9938b3879325931c10faa129792d24919196aca6d3d4375d2f529efb9c900,e53c822abe526ddc8cb70dc6cb82916fec7d42236f219f75c5c9febc327bf37132273f2fc9e7116d9557bb64e3ecfd0c3c8d78244feb46e6bf1e0be3a5103a9a01,1f91908f8367cf31cdfc963d5c39b2caebeb7b04c7ca59890f50fb61a9e023c049266226b2d4f1018e633c510fcba6e3255654bf75b17bff8d981627a6f07f2000,f2fa0a0cc7cf584c159c82134315547d9317165958fea5cc3508ad3f5fb98f826f8c93f4e2764f47f2fbaddc0e2f5116a939cd1d397a9bdf3f870db8337449ae01,89d78b78e2790a84b2152bded26d49a5cb79abf2b0bdb6f4005019b3fac92f693f27b1da981b1f7898472f43ec97ab931048441c66b6249b121ef54351f103a701 +86,4efdb2d01ea2b08da06097931216fc75e2f2df271e4a206fa6e2a9ac844711c3,a5248d8ad03eb154718744fae7b6013417ca5fb066bd34d4bd10a0e4963da2cf73e1969de58a77280fbd69300b41c714222cdc56c9787e94c4033392d4a1210e01,a9930caf8b660ac087d36ef48046f5d35c3e588744e2fcf196fea9e0f19fa9b07aa4a75e9e1d5c67ffc5412e3b4b44551c3180c52411dbf3ffe6b55d4305a39401,7e9d386549acce25f7f390a032a5b1c35ca7192eafc2905634bc2f4fee4fdb0a6ca18175b015b39452ea94819fd42e11635dcbb379cfa5c7065043c2986d3bdc01,cd83c4c0108378a644f815989d5865d0729071678a42a7ba73cc233e65cac4fc0a16441aabbcebc6c3821ae28048dc9d281215de05aa9460117d3f42c35697bb00,8902f99662a3c06668cef31cb8ab06820b0b4c66d42181c93bb1d424e6f8ee977e8e9c7377465c991b615cf473067dd5273f0c07d5434469ba0a084c9765d75d01 +87,db248da1dd47b46826ee991fe62b738e2c74306f53907a3325f09baddacd7989,705540c08a8ac85dd0e8f6e87352db5c11b7377215ddee949af0a017a049c24774708d40a68795b4caa0b7c63ad660e499912ade61be1d2fc5e06466e1462a6300,235564b5ef44ba3e4659a21d5430983828201212589c0de18ef2728e051a216b48728057b85a72a0dc2bf0cb5744985cfb8cab825ad419ee0825f5420f4a91e200,e327c037a0d6d26103e57e563f507160aee3e0cd7cd30e7e2e4e663beb2924561d6eb2d2cb8ee297fd92728f247dcfa46ef9e960897fa4ecf684c5666378f99e01,bf8018eb6851885a6bf377f6bddd7ef8c2d2fd94011a04cbf5f7d0484695773634f56ae6cd6a4b5154d96c9b6ceeff50e20bde1771db395b0785af332d4b1e9200,b9ac42136b07457a8a2052cb4a56f5cbcfbabfd84dd1be9ea9a9f3cea012e020485e59d8e6d6d6dc52add6f8751ba17b3ee45a3bb80757881f4da32c484c6e4601 +88,c847d621a22f3b6d2446bedc8b628697e67381c98a942e8bac5c83e11cb3fd31,3534aa36409e2ab53250e070c03239c0030fa333fa3f9eef57ab632dc9dda66b50441dcedd6d371ac4aa3db0ea9dcd77eb721fbf7a705f3186d15bb166d006ea01,b9258a4a81b95272f189a79dab909782292e8acf04dd2f40f8e2fb21378e442560a86b176546d48c4623622dc343e7165a365bb414ac2c3e5c7b0a43effd417c01,37bc1dce49a73879ccf5765b98f4f133e44f310d1bb2ada1279ead7f25c73df95d170a71fffa49b2b64a37c6f8c29a187a6a2fe5517932b03802a7c135ae062f01,dbffcbb178a99a062922d09d48fae6dae562c98fa7bd5139254c6aaca4bfcc4759527d5df832e632b66def1a50afdfc1e29e90d3eb790bf1953a6a3e66d6daec01,7ddb46945fd2deb8115a55d55228f8c35c8c36015604e95f0550677373827d52150d7f36c58cd4fabf002d5a3e4997a372cbcff4394a8b34d8dee04b8c9d56f300 +89,d7e0b97a1bdd4b5e7cb5bbf88aaad657d6209caa94c47fa65bb83628effc9774,333149cf1cb650566ca5c77c02f2eb82b2d2d9b3f7788ba14bee2917a9966b3d2eaa8eb3f20b0ff26dc5125b64e47660433c0b565c35a5c2a2d6b190084f048900,3dd12d3863201ae13780cafc8f0d207c3e7ac583f9584c9b1a5958fe100f5f3b7ca9fa41b88075911a4e4aafd50beebc52fd871b7499b45a2d4c848f46194db401,32e979c43292c810003c245c490392c153a1083408388360ac7fd9f6638152ab7bff9d48396bf9f2cd84af14464110bf175f0ca9d11c01f2d1bdd4c63f4074a700,aad1e9e8073726de7bf846d2911d80f894e967c46bb31e6976d4cfb218293be739d2b807d28857a0a8ab61b3327823e50732bf3ec2e33317fbba94c42c4b6c8c01,6ab688e3f10cfabc12be9458a923661ea2debf1f7be4361d50dcc4cf4a677b5d59e044681a6500fb140849c129d9a57f99ac6b274ac7e6040c3cf1d9a22810b100 +8a,82feeb1d47faaea1089fd0ccf1a86374b3a66b5c7bab6023e18ecaaf88c1abfe,1309eb5925701b65b62b006f798ffadf039bc03fcbbf04c7bd01b8346a6a58b637a93f09ede01bb0d7af95a110acc6d7972a7cb6cdf09e39297bc4133add16cb00,85b38f0393b360688dfe61e924cae7f40e41c7b8372b103d8891513cfd11d2ff605f5ba28a97f5c360ebab9dcfae227b1ac48f931faf19403da54345f8763d5e00,75ba3dc8408946b7d1cdcad2c07106385a446e378e87d9600e8560c46f2c02ba7ba0b8bc051eadf6b57cafda3ee94774c7623c02bbf5fb902876443cc27c76ca01,2fa743781fe04c8840273cce311815f7c8a39fee525c661b45d336c43944266c5378ac9589e32d461cb02fb2cc7a745baad6791a3e8ce7df3fa66d35fc4ae65801,2181e6cbfeb89482f6cc4d5d1cbbc9ba87813cf323a9bc4924b738c7b7b9f67d114f5880d4859e34d3636915fc58c011a22e02afd00383de97cd35107734d2de00 +8b,356d9f6c950ee2c5147a007731739f69bf681c864070ddfb97e2de7b27e20112,ac56c4f07b5c26d9123b0b20120207f7f86145533721b10c6b92d01afda68d877899e942f4937d5ff512ca861dbe0773bf7f531dde3487ae38f117711cb4a42400,bfd839e74ea9ad7d5802e5e8d99ed32cd0d534dead952fa568bfc1d0a0f542cd03ec14e7c0b82513a308fd0608e284f24c1497703f59289624aa3c189040fca000,e8fc113b43787a895d83236e8ad0929d56a38ad9dcf348424e922f1639bbac3672de1f1a3702382047f2ee19cf661c0cbed22578a32a718c34160588f88a298800,13f1f87311ebc8953886cbc3edaa78b99c21b08b0451f5462bdc2ed1158036724af8b9a6643033e36853e92def348c04f38564533c4c57a683a98b772ba7908401,6acd5ccb37784ba1fe97b1370d7ed993c3e6aa0232e67639c791b97564cd802d3dd132fd02f1be558eb37074a09dadae4866cbeeff669305b48f74a542f764ea00 +8c,d9edefe147d314ffec05978b2465be0eb5a9eb333ff01a1a281fac48c07a99db,cc6580fdae2015b0498b0122846e0eba4dd733be54ed22ce17df16d2f2922ded63cecf0e0967e349c7eb7a71a86bce0db8437ec389848f426449a2c130c3759801,58b3262bb40cbfe2243d26816db0a6901f896bc066a59db376076ff30fd90392507cef62bd3c34e4a6f8298a9aeaea405d3847feb514df6469ab5e963d1887a900,ea5c0f1272138c008a1e76ee0e4d5e04ad279dfbc7f3c6300d1f23a4e4077559109192ffb61fc34f0ac5757f25fda0ac02ef746ce0ba9c2efaf9621808da7c6300,ddf58cf9f9c70979800fdf2e91aa7a134d61bc4a1d02ce17c368d37809c8b80f00775ee9e3ba0ae2a399c7c3b13b6dd76ce5c5a5eed38656ac9faab1a796985501,4480b96906cdb6d7c607a1b59860e1bcd0998988c3e3ac2a9b1c661f4f5c5d5d60c5570b7cf8d341df12c8ed051da59003de937b9c57aece7e1bef9b85a576a901 +8d,e740b5b2d0ad8cfde25be661fe4b8393b67bde06496c8b167ceba42de608c13c,50c8be06d272136885a51a0233bd93527797aaf36e68f7af1773355de2483ce2016bd7901b6ac91e7355d058db21821f6d79ce150adb222847de2721349d2b4500,4ba5f888c02a3bb9a0b85e1fb7b044ddcb5d831686cb24aff48a1f1fcaf6fb4529345ebd90c7286aa15f5421ce0ecbaffae5ac3187732510f0e70ffa4593743401,a08683148ac58774d9c32eaa861b31a386c68e2f6c83769c682f12f01e0f56f97ede58d0e652a695c7aa04dc73e0e891008c00759d73239679b730c864f25cb300,4035b7926c564775342c90adf78f578857f196aad06104bc7299208e6cbab39a0d2eb7e83c591d9cd33a712207250f24761fc44128bc9df24098c57996bc670500,131365265c24e5972317a3dc2b9604d981fe81138e9b1b588fdffd0c23f067136708697b4abb139ab371faeecca71913b913019b993316c6b0feee3963ca477c00 +8e,071584750920ed19d9a387a53cc80703d79237b2787413677d3eaa153a201902,ae7f064eff86f106919881b7d9cdf3d6ef743d7b9cd8d39f14f1abe16e10df4a26f8862b68e78c1c1e6fb0a9af5bdb79b89c95c18d34b33c8c110cc15642c6a701,c9aca58fec1fd5c8d118b473b9f9ae2180461f44ea1c5d5e8970591945786b2056fdf162b6f0aa381bbd945629a02e25c33e924a9c33f282df6a0eddfea014af01,cfef821f52042ca3f55a75229dfe0d08d1cf2c3e84003f8587e3bc5b3085b6a266191c5584222b62885a91ee9a42f856c9302232fdc4461c1368470a0ce1386e01,e8e85a4fdbae94ae364c5380cdd18a8aa3edee62daf1f1abbda1ac1b01ac2afd16756ff3b3f31ddfe69622f722515d1c13cff2555fb9b4cb629cf2bb6d2b06ab01,ef2cf2936359c5f8e8bb77805e876959ce3b95961955c84ed8764bd793f668b643afe18f85e072316bc0684175878b6bbe68c40055a362c0182e86a98a9648d201 +8f,f1244639e0b3dd7071c3b01a4345dae3df31d17b4231e4eb94c732ebb8e71792,7f177fe3d03be73617ae4a79dc9164c71f4073d8d19bc52ae6d33772de0674e86c7ef015b055000b5d3e62ac6d72ebdc70128ebe88901cbf956f04c119f441ff00,0dc3251c0e5cc8194d49cbbf8d515da06d4bb17e06d0cbaef717135ceba09114544d8f57ea586ad3ed2d6f62e3480a61f9575f94d9fe6498eb1cecbbe569b17301,311fcaa219b6dfadee348bd4cc2fe85299206be8f15cc38952242252633cbbc22579ac32ea53b1018c206552913e7cc3f34dbd6c32fffc8371eea46ada452d8400,45b534d5940f1b535a80c0cdaa73ca2446b94e7942c091abb8e9d7070d83cb6e0e318af28038899a82105494e1c0d56b9750e948dbf48603b529e45fdb9be65400,68000e31d5bd151c936da255c6185125477586e2f88212cbef4e4f2bc40c880d001cca4b9e60eb54a4616fcce7c2d62cf547f17751fe2e70189ca29cf4f361a200 +90,dafcead866b8153c55a31218d246c52f81258204dbcf6054894704a38005fe9b,5096d252a7b643c21571d85c7d43e3cae2a5d012c28aa4db68aa19691d0a1a413fa6e685170f4cead1490f4dcbb4e25555f666f14cf8bbacb190fe7b21ff983600,1e9f591f7f7e79bc54365e8c538f848c839edc2c7dfaf84ba42323773890c5d55024d5e973ce70d0fe9c833ca42a11c44c7c3c318333b054e438c082e91624ed00,0f90037224736a2b577e197955b0153e968358a2c743cb4a2fbfe3d6cd20963b3965bdc061491fea7fbaf09c34571126ea088e17be469b2c2e9dc8196d79666a00,c7c85c979c98527df5a1b2e5950b87c02a440eb09d0aa8a2ae990e96d6dbc658642f12848589f8d25983d6aa897a9111f3a788cf6153bef86a5c4df958982c9001,993dad02824496689e2a985e66108f51ed00dcf48d9f9d32cf9916c105a9c12d55fe81ef97a04b7279a63980c61ff5fa9c2ea683f89625a9a1094b35c2efc09400 +91,a4e966814f857cea2fe662c87382e5df83bef975c73b82b951640edaac8caa6e,e4196c0665791b093404f1b84f860385ef6ff0123a5820ccc58e227e611e97d27d6bd5ca8ad7f3d5346b55c9860ad6af4cfbac86641ead5ab097df708154c83400,51ea720e92109c0f0a0575cbc7eedecdec1174ffa27197b11f809edf320fad4b529a886cdcfe2f12bdba9eb65eeaedacffc86c9ec0822224431f5f29bff3f15900,0d814e648325c210cc50b3fec78f447da7abd772623671522c9c82503515da89124d875f1efa1cc5914fbab0f0cbbadd63c524c19d17ff1370f1d1c4791b3f6001,cf5c9e80f3763548b4001f36f9b77ff547191ae648d7758175c2d712295008d05fab41b64536312705532b495329b171c3eacc85dcf86f0e7cfe5e70f799776e01,94e16b7cd4e1ab037ab1a2ddf10dc0a14501a96b29f14a4c8b1d46a65cebb88d731c90c7711e4b27940893b945d30a1d24b7388b78abe7640a5d2f6990efc70600 +92,9e50916ede1b89f14df1b2f9388cc9bc56ed254c4f01668b65da02b200cdf98f,4644ff762af8880b526833eaa567bdeef619f5d278ff12ed5a1f7e93786300c8356b69a718aad041455ba7c0081187dc46b41f751136f0186da9b360e32bf7c401,97f3f2b801bc4cc7d9e7abae97ab0160864ae9dd151fafdf371763b8dc7f17415d04caf85433f563f4747fed2eac113e688b15fcdf0998b25c7cd6f1e82afadf01,96dd6fdf37b92282aa422c4a6e477b65685575cfbda56a19f26bdb4c78650e8f217f2496853db4d5edde99e7109e2c9801cea6e31aaf43352f770fb0a0fafbb901,71d03ea532c8eb5da18d7d92da75d25695a9c3cedc0ac3ee22dfaea485e04bec2815430b1cc9a072d3ee84362d07a9c7c81f58cc1e8d6b303a17615d7aa7339e01,63efdd13099c87e84f19af63aff88972d9d0c6783ad4dc3375797d53f98c54f73d33d40fa6c1705c9468a2c989f5e39b1e3a00d2996def83dde40bd2d60194ce01 +93,253ddcfb7bac3dc9e3de8dbfbf02ef4c8359e823ae4547ee699203823d21e712,c45171ad5745b709cbf30c1dbf26a56b84eb3e4cab50a7b8a7e4d6663a84756a6b0c61ff11fad2560ba43ba86edbf656d67d0c6bf1b752ea7c0ffe1ad00a408b00,121ae4eb126a9b5a777ca4a23f083dc3db6badb3508e141a1aa79a6ac27c0ce6396af3f003714d28f11181734bf4a1d19f84f6bf04e288459fbf147f5ab2df0301,596c69c28a8342f257cdef2183db42fd249d728ef7d1ed79b827e731384c50002df7eb2f4427b77022787cdbd959c581ba47ed6e05a4d81626f756ced73e44c500,fdde4e150f732b499a071d6290feb868cb3829e2cfe0cd1bfdf2604009ccb66c41490438cf47ddf0246521402698040daa25eb452c656b40f582ecf86b7828fd01,18dc5238f1d663b69f60bf969bb7c704036d85079623dc15e903a9935e87beda551b4cefab25c778e88f90f2e03b0608e2cf4ac69327f0c6f8ee7940e24920e701 +94,ff9a45f88e5c45f3485969b1048ebf8b9be49cdc19d5977556033e1a111d3305,ef479e66bb911ba105319dd6bc89dacbeaff7f13280b0df028b5b0390d069d133a7c8d52fe364cbbb5a77919a56351a232d386a403da46628c859c3b69f9c1e800,147f42427b3a0a57a9b78860fb24177e6a3c84a87739362ebc992c831a802641239b4bb11a05e4bde4626668fdd30526bac82b983113a449104f0a46e7981db101,06f159c7fa02500aeae4c8baea51001333b05aa12f0680c48e394c0b89139eba389e996292656f7af647782b3ab262fe76bd4adf299a9e8a8b634345067de6ae01,16f738b9b85746a0bcabb0cbeb9ba19f79abc012c318a106ac2e19d2803a94073ac64462a1011c52263891278541a49faf93a8997c1f1fc3e7cdb3a3f8f5f01700,ed2288b51377ff6f0af208920b958013dd8e5f2bbe2ccc77ccb59cd0b37908163b5afa83ca5e73fb7a88f1be6f6a75d8f25457e1cf17b4a9c6d5ad958876655300 +95,09811e4f88e8ab9ba9084b2fee4225368dd497473867e2f3c89e80ab1c8aa30c,785509763e82208690db9eb92e13c7d9003ba75cff371a635cfa93e1aa508af15e6ba7331b7310361ab44d1d887a1ba892ac0bf28682ead96ff4f98450689b1d01,cf108278a24831ad2c74ac3e312529f0044f14b71c71a0779800038a9f9e14e4723ff0f8a70782ff4f081b6f84f8c3e7ca2c718b78ba39be4ce439fbf368ff2200,97994e72817d3c9de6a2c2b9b6f9ca03c0a06e2214af67d8f11914716c06aada6d6fb8e418d0eb341595903e3a0980fa99d0a2b0435ac8029670a50f27ddda8400,aac3abbb866669049a31b7c0b9a537593aefe51a84238970927ae09593eee61b1a6612959823a72d860e59e8ef4370a77ff2d75b995c00c279b7a406673d234201,9b54aebbe94e36f269d1ddccf7c6e7b34cd6b90c57fb7f953ab13d3e6ac89a1a06a9c5aa132560eafdd0050a7066f134c6e6a4b8f6f75681ccb79326fb47922200 +96,96150d0b0a7e2ba4c70503e50ed62be0c00aec7c19d9425db10c5ae8a9452a49,8a0aefad94b9adf4c93c424526012ebb1a087cc37dbdd0defed1c81e5841ce5a210f5e68e6eece5dc75e2962d5a9262576816924f5376464ecc711052d13940d00,312a17ff7fe8d56e3cff4b89b3ebd3a66428d25e86e903615925c719293648e54ba776d2cae719516ede16e748e426d39d566a7a0e703ce7a8dc5f3afddfefb200,d9e1800302d802a2c04c7dff199938d067f6a1b5fb09465821d3230d1348994c502a6ad6648781d301fdcd4e1b383fcf5348dfd5464bea3d439b096cc3bcf11801,0d32008380c77f93d5e7cb2ee0cdef6b7a4b2529f6c6a1a2385db6b180764eba0cb0a3117779652d0167c57bd2b58526f683aa3ecfbba54790466f530d04797801,bc931ed1de4c8ad4bcc35ba305562d8169fa30a724bed05bb4d4b5c38a8bbb5655e19ac9ffc37d9269644b0a9078232800dfc5fdb422bf91b0c4950b3395546800 +97,490d1e71362515d81d0391c61eb8ad213ac84548fad4548283c4e94dedf9dd52,d408b856d6873637f1dcd40dadc7d13df7ed01ee13e21b5e1ad8549a22a637410fc8233bc6c0442e9812f1e35841cb37062721ae388d89f9fa384776e943440b01,2416a69e15285e36e87935db70753db93853e81f394bce8c1ff48b09487c46ac051f132fb34668c78dc790743f36826cabe6f8ebe1a536b932b5c2e534364dcf00,8d4ffa577cceb5eba5e819152104fe012175db3d3851260aed77b47dbbc7b8f820068b7cb88fa2566fe0f8d32fbbc3e545f97e7b0bd284501266a367546ad82000,1d6d0a50559facea521c947f375cfcbf8ab1a5f24ad7705281189e7c6289e13f2507ef16c89d1babcbd312c9496bb32b9d64112c550e492e8c03c8d442e93bed01,f0fae7d4047dacd17f6ca18f8263c899cdae9077aed10ced3336e781c3f22e830fd5ee7869f9afe292af5921cbc7f0e2fcf7e8764243fea1ad65ebb8f668ecba01 +98,0b99a4bcbf2663c00478edf0c86779fff5bf88726d9f04c028a51b2c94b6a4a8,407d06345c05c7b7516bbf9057ececea1de6e0982f4b4d38655124723ca757f3060532daf0f3e61243cc2b1e5a64c98b395a70cfca56426a0fc05d0541d4ddc201,b9b802fc0305a35acc0da08f9f3b49ac904ee3810c547e0c6ab9ff81e6db09e74aeb56e223f859da28e9d8b1a72da7d13999754b5ef817aab73b1c468eb0f65701,b9d066fef193756d0e3b3c36839f1026ba340c215c40274ae48b0fb42e45b0f121da3a5b5fd5e1a369e587ca34a62fc7c1740ce8261295dd0061241aafc7d3db00,8a1f3c869c5bae210587a95e15f1d4a8b4218822b25ce4587882185ba1fc8b042d65ffcee80da80453e704f509bc7617c6849445bf8c483406e62a83fbfc3a9b00,6e4418399c892cb785681750f72d99ec5877ab616297460d446f96458a8cba3f4aa73f7c6067483026cd58268cef6fc1a89b4fd87e8df3a2293a76fbbaf61ad100 +99,6af628ab5596b84daeeffc873523f0d5e0091b1fdb049ec81b8eb1b99640b5c8,5d2940066400c386f74a5d59058ec1446a4d5cefa6a52634b4639efe0b6d15f05d365f93d83550ea6c44205a164e5336b53a090bae4ffbcbcce9d48c15e7f23e00,3e20f88d9c5c1c9ad14014d523fe5c0a21ace9610f9848d75158db0bee65ffc944f547520b76256c292bdc36a6161ab429bb21f3ee76a8beb17d0084cf3425f300,f10bb541c629a309effe9b637ef43904d1a83f3c9c2913dad0053eb48297483b30558da7a0f62c428caaf169ed9cd0c2a600402134cd3b49b49023d85bcd2b5101,60fdc23422f5f283df2739177d7bcfeee5d082b17a3f47efeac39eb8298ed8f75ea832871c302e8ecb4c1d9b6c98ec3d1fc800de1183102f124b87034293ff0900,0a32eb84a013264ccf472a70362d72030b47567961f0cc234e5a4c6dce8a4a490e64f0ed3bb3a2a43e207ad62bb03bdda15d36d97b688a8a95c1c0a4b5b0194901 +9a,ba7893daa290a904808427f92853331a032b11071eb354ee8540c6e35609a6a1,26424ea5e32855ffb7dc56591df5dd79d4d424b017ede99ff2204c217976bfe9653c6faade92f8d2199616984d9d1348c5411427544a5ee55ea1b230551709eb01,8c43189470184b317bafdf3661039244209ef4140553995c5369361a356aebfd0baf4668d5604727cd3660a414cd204f1d26e0531fa1a2b6542e1be1f471f58c01,ec5158ba205ed0f78e08dcfecbfd08adc2c6181a5b325049e4514b53991122a40f07ec534b1d6254f441d985a360e87dac2b1cb5ccfb7943946acc98932ef5f500,c226c2747fabdccf4c23a2a36eb6342269226cd2c8220a6cff5bcf3b7eefb32835d46bb956506b7d057f2eecefabf636d7109b664266f92319392986fbcb474b01,bc0777f20dbe00c14c7a732b1bc322c0c862dd8f4823099e319dc35e3c56dd2760b9ecee87405a3fa50d96ec7f65a95377c82b766a77b93cde4ace920d35ef8500 +9b,0265d8bd685c77cd5b425e6203526f4739857cdd33f5d75185d6f63d21f263e5,4ff7a4e51938992b11dc9208db0980882411d9fdbf28666324cd7935e7b96eb02e77f673629072e819577c33e37d80d137db26a5909b440cdf44ebb27630f5af00,9b797870daf1145e89dc1b3cdea04ce2e71f96381ab4b777004b1d021dda73550b1429aa89ccf29e8e64c124ad400cade6ac9cb984e480a46199aa92ae28e7b700,1639a6e5e8befa5444da22cf5465da3bf13ec883a23765b42951a5f6865cdd9b7bdf3fd60f7f9462df0c580ba5120e5bbf6d71adf2c4ac22d71c00aa893a664000,64e56ff072bb6216c099e129f1965a3fc8142a5f3e6d753f9ae279b59d14b8cf1faa55b6074d6316f5acb8e69b2d3bcd3d086f6d1dd6a9b1e77ced82b46ee04900,4a6a32700c2c4114c92f80c4fdba9db084bebb35ca99bb1e14f69d340e303d577e44ea5d58477e1b6ce2540911f2ac0c1acf4cd88cbc52ba0b0ca872aae6f56900 +9c,f0fc1224ac9ea60dc14601c7cca70dd77d9d10330c1a4b3562a38f2fed8a7690,852335499976a57f3dcbc09351978db48e2bc1159cc75076afe363ec656278a30045d820521ff37e96981ec2c577742704b26d42ad003b3b74a37ff648fc21bd01,b35059fbb9c2b84b19a21c4133f325b6deacb50131aa5e8594d821154b5ddc513a4419850586ec36fb708be1baaa7361328d466f6257bfb8345438f91e8d7a7801,0023ad68fccb144deb156e2d020472ed122dbdd020095b577478c8631043e576512b583886152698519b3603a9c756036cd2fd0e5adcac386cd96fe12bbba1d300,34881fc683debc039f3f67164903ff9ce932436f590aef38f9d8f315eeb17c0c299122807193fc0b16c330199e8cf9316957df139536c011f885b5ba2fca3f3800,4552cdc3d88d39bc2a1bbfcccf27f8c684cc9eca2ef4910679c6463a6e795f9505f45711822f261122d4389a3f0fe257801103c9bc44968c5012c782ef61c11601 +9d,ae488416acf66e853da229dfb26d6ea18a06a6b66663969761051ebd56e70ba1,f907464fb15796fc9fbcd595cf813d8c13adeb68d0e4d8d0a3b96005aaf2f76f21a0cf6a5d83fa78c69409d1cf23d8d1f5fd73f7cd098bebf7cb8cac0fcaa04b01,12a282413cc680f10dd7c6f83f7e81a19de07fcbb491645e26a03b669177b9c1299e4aebd02912e79b4ef6858cb2a23ac25d2818400140e5a2b24c512cd2267100,603a52533ed9ffc5258e40bb10e0df7f4f8e51e3ac25411f5f5acef141a792c454f8afa1548720aaf728c8bc840de5f2bed8255680ec1d3ae1247a14a5ac477701,9851952ad2cdffd127abe326345f381aba74bb280206db53914cb04195429ba45c41e4a58f67c3afddc49896088d0031de2d2ffc5b305b3b81f2adbcc486f9e100,52b0301363cdb1e77831d671d09e32d8344d6fc4673c758f686eaefb16e0b7d97b6c17cb7de99f073b913e36a20addc1c20c690b64e230799fff2ea638d82e2c00 +9e,112ad346885edf933521b3ed97a3380139b1eee987946610f00a22a87213beba,84ed3e6489caa457a9043a3cb7184b4c895769ab5f9188538d402b45cd45c93249900c4bd486887ecafe82f080c8c1db4aef3a644f929423a1e902c43d21c64d01,159f46ca3916d5df946dd53d9c67d586c406c29ab303cf2651babaa580916f27713feee3e968e86a368c05bb56e953bf2de0f309313e5c6884a0a738691c9c2600,72518a58406bf770be38709ad78240bc3a0ec0f798afd124ecd1d2fee82aaf6973a1327a250394d5412bcb8f38dac48b9dc0e9ffef82a732387bb5329c283ef800,62cd101c735b17c75522a2e025b8c5d176f0b306a8aea800f627c695783d0a543d8929c76632b0539e7067c4bf5a7ec34bfa85dcf9c99fc9f061d0cb979c12f800,99a4e67242a59c5b16d1ddabaa34939e9fa625c3fdbf57735684f9e986a58922315fe558e33c88f6b80334415bd575a2a2ba12f454370cf9abe426357c60116d00 +9f,8e619c31f8b1322ff67976f5c36930cfe69d8b905158ccf91e78c197f96ce290,8a7762f690dbf5be19c647f010318f6f192ace1a14f1eb26b429380e9b58c191036520a2acdd9c94a12528d989bda1b87ee35e23cdf7f6c8fefb1d64069e454600,13d5f8fe66ab7a8bb20ab741848492bd8ff93c3aeb895397076b57fd6e28a1bf3a5e948128548b1ac3cf9441f000248c1b436919ac2a9e533a8d7583b821221f00,55da5c387eceacd706eb6f580d0752c7f819916c36270e2e3c4ca098c4b3feb066092204e76e470300de58e282457898464d9e32f65adcd74469cc1bef88ccf500,ab7ef42080ff751f76f2b60ec91f06fa7c703dc415c326f08efc206718d6e1e711d5702a745646a93291d30d204d8c41720afdeb7468985fa8172c43cbcffd6c01,d377978fe529496fdf458688f3ea5aa1eecc7eca8e816dc98c9f4d190f8f23b5005300deb8387adfbfcf9da72cb741d1666a157e3843359cc6c68f98abcd15d201 +a0,874ac3fc0bd0cda41a20e0eb5970cf84f7ba45e8f7c3a6304edd7cabefbc59c1,a9a63c7742dc9ff08daa22988c5da4828d038b30f59b4258d17a665b4383bbf928d0eadda5ac5cb2532c77432b8b376362f3193eafe1342a99ddb508c5c2566b01,e3f668598bd8e6044ec7b49113bb8de165b75694bd7bca501bb46e34e35c14266aae0dcb342b8f66a3922655597bdb0ea3bfa5d75570ff86fd596f20df843c8201,059a20e7d86024244098000d172b592637d74d567e2be7a979105bf267d1fc522e20f324fbae4cac266cf8df38bb0297c3cbd89eadf57ea96331fc8e8f1b9cea01,9edc50906e300e055635ba68ee9271a27160c7a3ce71102c9c77c3248fdd610056c8542bf961ab779f2a38ddd225c5eec9c3a9b2aa6dccda66763a00478d7ddf00,1ddd29350389a1834121a9e036a5b067356280991ace28924f51480d8bfef7a923be2dc03efbc914373aa87e623bf382d25b789c88f1b0d3f77376e3e9bb7fa801 +a1,588db50a5f012cb31757641dd433bb7fab86b403aba71e353c2ac21b99b66c38,1aeb74189c6ef7665bce0d217b5175366943ddff11b0244d7f771008777d630d51cf793a3bc35b218c7a26e7d3a2c956f951320ff289bbcfb4c01821f81c260001,72f0813ca6f80c263092ea111f4dbd2e02aec4e636180fa338fdf5a8f8ce2867482da0b858fbd44e086c77b9922d318f26b1d3e91387aeff72c1c05e6fff2cfe00,94dd94b41c75f7ab9592b264dd115bb092b842783e3b00c4b9a0176f8a28c8e9115f83c18ee616bc7b8443dda1dae0b5b52bcc13242fdecd7b68ab637dde400300,a410da6da60d5773998ae1e6df61eaebcaaf5476f605fe7ec6ece4be2c8c704b762e2877ce49630ad6564cd4e83558f17a36321f859d829802e04135be441cad01,ce7d7eab8ba972e9c70e24c86d5ee4cb368b5933f71a73ad3bf60c2f224b9cad660d507be057c5e300473edebee10337e72ab40d93d4353fcdca81c5377d361700 +a2,72efe3c2181c6bbc644956487aacab65732cdbe3596bd31cdd2f05bf23fe2780,55ccbc2efe335b8bac2ea2ba3ab4e1dae0996d35f660ba0131741c34f42a2d3774201ccfef541a8c55a32c41f7403e330cfcd8d641030bfb6ae0d90d697e473c00,d583a36e298eb7b569d7d7bcaf9c9da7ca68684705b9f0a35d05aeb3e56f5e6d6ce13a9db7e4d672b509f32006716cf293c11577370a358570ad71b22a25b60601,79e1977b6f8469626e605039105ed808ac7c2777dfdb3a6ea7ab1df71783a9b510dd9da50f42a96938ca0b29a855fc338132661c8feb0282c212aac5e9dc4e1201,9af99e692c197be65b6039c41c894171a909909a3e6c27d14e8b8a3fa18bc2f57510d053cceab8840d77737064abe3c351da539da4ecb76be3147a7f7d346c2700,9711c2137ef0278d723658cb845d7049a32be1d954aef380a25468476bc642f23b00433df95739ee83ff412528c8104c260ac6d9e998b0c46ce504d4a917e6f001 +a3,524d3b800f321dd797b3c0883935d2246a314ecd8ed90849eefda1a348386864,6392fe906f6bc70a78d695a5b256de22d2a1f2f0fa7e3cefca90ce2a7919c12d7493c04c31b321fc9c57e5417b4b699b9b68aad8954286f980bc54456bfca0a000,0b61b78fb687137bd6addce9fbc088c0b24c3287d1ad38804800d3c7854ed1d70a52e67831af33fe967c827f0032dc7232d107212d3c8347b6a3510218858a4801,9d09f635d1f95e352383a6bf703f08ae5e007ae256f5e478b1ea4e1bcb7ca6686d1f9594eb437a42e096d19d78494b3be7e9d91b0c5b9e6355274521b718967401,d9c9d1895d39aba0be6094c558d3094dd6e9404cef47e9b1d7b8498aae9e5d39309a0534bc85735c442e1237e32139d4dee6a1ccf9231f4825dfa2c06dd41aeb01,290e7d13ff92f2dea9f72b3243e1eac89b2f825496017ca44a5b6108210706440e5464c1452bce777ea943b405c3935a8a1d273e918db307274fb7543f21fd6101 +a4,497c604daf39ca78aae29f2f950d0dff8a4f6ccf82cc7893785d5a0b97aea4e5,6b5da79074a8ef3b7ddc5ce30f969d082db12237c68397a590b605782d92c25e0495e65d359056538ad9873c92d852f43d997aadd2f395f1fc1a9f319269aca400,3d1cbe0959ea97e8787c928216a039f2f72fb5c7fdde51c1833eab1bcfb5332e720ad5c17fbcf7567571c01765fa4705cf1c016787aafcb81815fb600c469c6f01,d558187a03b1778504121d2214d21ed20f1d2475c9dd04f77f173fa6ad56a5eb3a63ed658ad546b30c90fd83cf6ffa0dc852a220a4de679c1100d5cc1c4db49a00,aeb250faaa3e561cd39276f2e3d7b3e77035007764c54f21db861452d833c7fa0ab0c7fa2c328c243235833f5480107f49a1333ff3dd3612bfdaeaf881d6ad4a01,e967b8937f889b44709c49dd5232f17ce911c05692d6a73e7ad70aa03936fde93e8c89e37a54429885700bbd81569ed8da2c408bda6b58ffdce3f012ac3eb9de01 +a5,84636bef36ce98c091a095e1cb89f428063932528e989a382ea5b58da962daaa,001c285195ad74a6340b9d328d5b2244c652671e38cd88e514933f8173d3847233434efd4bc23830466b1ce696a3b15a6d8d388f4e1809a85d2b04877da8e72101,9ac820649744620301a7f2e49df939d85cf9cfcbee9e4d585c59eed7d467fb3f3f2615a0909f26dbf57a6e9b99d42211796e5062cdc859f61ea3f01a563785d601,4bdab52fb5a9e6bf0fd506efe701bfaa9beaed6e3c085176af86b27f52bb3a3e176924129cff46061f7724373b15feb92edeb5b3e2493b6f77a874c4d4e2815c00,188b67ab43cb0e07039a9d7608da728192a90ad5fb0a9ded0500f1631a7c515b41b43458bd61426aef5ee3a4a3ffcf1b61ffc4d74e053b704e4a0c281b1d9b4900,6fbfcbd5a3d09c360d02ab0b56ffc060ca2c3558e704944c836ff2156ef3b93711083ecdb12bb23f88d99608eead07a0370cc313725d806b8a2cdf0cfa3923fe01 +a6,d52e9691b63fdf895415023c18587b61606a8c879645a4b1f9379c6fc54cc3c6,cb58ad573822f661b03a4881297fd9cfc58c3b5ed854ec4a7fe455ea033c7aaf79edb7ac943182c7323e9e3aea08ab2208088139f3c621a7eff7f75097a288e800,0d5223f7d4988f0ff82d941d56558ecf276fbd816116c78253cca3e6276a4b31657793451be5f5e6c022f59494e8f659d6eebe699001b4958e180039263c161b00,ccc22d616d8d6607652771ef9d5b81aeda7be56364a166c212cdda1bf7a762347c9c228f08bd05c5239b24572c0d9ea2e4abdc3dd13f7853dafe8cc3feb0f51b00,5d9b7a2fa80400618d3e1f2651536f9409d04430021267d05451a94d8c2ad27911c85b097e03ac619b043d73655c4a9200715c91de209641247bf4360fe5d5ba01,18b345e74be46b20a4fc8a230a733675bcb57e0a8e9eee31c8e902c98aadee5e07adf56f3b1589a00b4358a7215c58757b28a9f567d087b906bbae2c2fef2cc500 +a7,7203283bfe1f8a13618348b064368561af49d1d6ada16e67e59734ce54823a1f,9411d07b30af0b1b46cf7324db08e04f95b34dfbb8b72f488f0c828e75c77e6c49d252f4ef74ec10dc68532629abafa87ead6654123467aeb8d078dcf6c0ae1000,caa82330978b35b6ceb0175e655a5f7432ff51f25d7ed46a742e3c58c237ab13384a1ae6a05265672b381227a242cc112829bcdebb763682134932db0411f2aa00,055a8b848067319a4a07806099c25d8b6a357970dd5798b0418c528c8163bff257f0ac8007382e52859f2a4e0fd9a89070589cae25564f21bfde56f8a297495401,5f5cf6620bd444bd2852593d0c5b8ace8f1c9358a977244bf0f6fc15cadbb46217e96c50451523ec24b090b3d278345f7b8fba5558cbe112cbb1a39916d42e4400,940898b03f8f541ef57d026721bc92e5bcf8b035e9f665cf64e4b45be30d39d13628cdd05dcff97c8e833e9f0d769574dd60aa2f0442594fcc807e63a30d962800 +a8,ac7db9b26b30f751d18dc86637b4a45554f4a47c800716a4efa65ed02c6c754c,2ffe2f52fb7b47e1f2d176123756998e76a48ad9ce207728a22e4dff466d266e5b0365eaea6c4fe2a7a88ff121f495b9563d6fa99ff136289855bccb4b96369501,91100fcd554474683d0aa9782f67fd3eff620c0a563eb11c5938f89cd723bfdd0354b11dd6825f21c818fd7b19d6024aabe46efb1bc862d57cc0504e203d460501,2e24726ac79efe78651c4afe9a6704931af4a6064e3fbec9475bc95f690eaef152e3a3105cf8d2083d629cc61697f309fd3f7bbaff4c3d1a255079f327a5397401,6c85794ea78da9617597b98461797f98f884eb9d48d368742f1dcc500178c8272d788f027bb5d5d3eccf04925299735d2ede32309deac8ecf3f9ae556f11f38901,f73033952f70370ebb472c91ff8dabc2072de46d90fcade6fb445f392e46a8461401c790566f6fd7ca186ca0fbc7fefa9b2c80c8d35554676c97f7c7be43d9bb00 +a9,da9c719192f53dbaab3bc2db2dfdfd2e851f9ae86f6e72b084e3aac5fff5e70c,5b6ee12150057df2baf9ed4d0af32072f81a17b02b0285dc0887cee63ce754570edb22aa0332f6dc2318f025631e78486063e619865afd0beb1afa0d30ffcb7101,3f98aca07fd3d8bb02b055b1aa8626e5b32625b74ab957dbef4dc3868b8e7f3608f4826f7f5f044be5e6f696dbea458ec3999ecff1a2f28c78510ec3d8f7bba401,ec6df727cd644693e1908b64ed980040ba604fca3959a9a492d654e14338475c677bc333c6a9c39c1cc76d8b4697e2cd95c9404f120a8f8d4ee69e5663412a5000,fcb7978f58b119e6338dcdf32e6cafbd71546166f3d299f2b48c7e2874a47a4f6516a1084057d21c53d05320a66116b3276e1eb8fb5feffa7b8739a9343913e301,f08f289c7816feee60a90017972617bf84e2ee1ee49b090cd0c845ad5ef7d8044677ff8fd9f4852e0c8751c3dcacb96b8d5bcefedbdd2e9b9be68015c3eb27a601 +aa,6a79d4093b276f392a984ff69dd7e6f4d7511b676295f4c3edae4fe72417ec95,50e9efa67585f42df558d365599990342bd2f16647e8937349fef725266bed487b77eab9493d18840b87f7182f84eda440a32082229b7e86ea0e00c804c71c7401,ed4c8af456963e177d69b7369a754647dd013b45e719d6a4a289dbf9d8c551f951fd2ee7865cb00af2d2ab616bd250ae2a8568ad72dc11c7ce51cc341c6a1a4300,de3a77262ee6d6520ffd0401148263e835f53acff572beb183d7142fa05e21c72011bff582ec0f0cfd498cc56449049f8c0a01543a1733134fbcc46406f9d9d400,c90af3db4c5419f3ac93d3aa7b6a444b7ce50c328df00404cc6e8487abd12cd60cfbd8ad00f94aa9819d788186b2d636053d0525a7247fac0a8998a6d5c0020f01,d7e191cd1e5021d87f74efe7b34b588f8bb1aec422fa1ece21b33534ea6c09b122a6fe34518c99e144b4a299096726d6fb38075ca18b33ac7d9888ad8b9ad82c01 +ab,a22caf2f6cca96283899aedb27137a1ab25b08839faf495a36c2269f0c777ddc,84ef7e537ddea30ec7e60644b48c6435179e00005ef63ca18164768f2f60704d06bb61dde3d18166520dba7ee1bd430742700cbf18f48abe722005006f6cbd8200,b37340ee4927cff178ab4e404ff561d6d1e53a9558d4548c4c92502c4aa733663eb3cb8e82cb4ef2fb18d8e73c5ace374997cb254288552a8ed686934b46c4d501,d81655c6924d015f53c5626371ea6fdeaef8fd3b82324df84b0784d4eab98d034573f6027a4776af7f9dde390396a931a7ac02037b449d72dd94ddf475645dff01,632b8d6f8364364b42ac0b4dbdd545454a0e043a33a8562557e560e659b5e2b971569a54f65a5322c46b50619d07508905639de3837fb9cfa2886c949d5a898d01,7f24fd73d0521e2855b48f201478cb9187f1b2f4b345c64a9e7fb05318d9603d1e0f12aa3ab2bc551678dafa8a57e07e8a5efa8a60223f8befe59e2ca37065ab01 +ac,d5d9913f6f4fbeaab0aefe9e5e33b75881059be0c1f7f0dd0a687704646ebf95,c9ccb864a03826376b34baf14f3455a3757d7a191e7333ff7361316306c9f44000feafc71e2b2969c3a988858b63555afff94baca74d163aea656195cefc28c101,877e4f26fc5726db3be6065ade40842823bbd23b68efa012c625e20762f40cab31a69589a206e012374f8ff857e703e0ebc6036d1ae549ca6b0227184885f70500,2c3afad1b3bdd2f3ba736c961f66eeeee24b661e4f58082081e395108f7aec320207b28b28cc4c8e267afecaa035a66e45b4c00bd79a0560f0d616e0129a806001,64e2eafa47e1189bbddb90f34810beb62d2522e64ea65fdfb01a4b7d9ede4e1a42d98ad4a2a15e53231ffbedfb381aeb01b30d6c059c9aa20315534378f51c8c00,0f5f29e19512aab465b2acd0ffdde1eaffa857b7b5c976ba45b6524c377ff5db7a80fd7f1ed1db644b45a29482818553ed0e7db5dc7e2425a12f49a4e635f17500 +ad,c1c973f7e2177e1c2107c08479798171feffcf9f6f145702337e6bf12c066347,d71798cbee5a86b946d190fd86e4d0e0a61a67bdca940b500a15bbfa2ea329df0614d2fe177774ef5ff6c8a7fdc30eb4bf89a93582f6b6ad77b419d33207df1000,c7cd410e943bef971658322efc78dfdcf50bdc02235d4debb896a135f69e4aa53baa94efd12aadc8d2662a870d48bd88c2bff674633f0de28f11f22e6656ae5601,c14efe7205beb6ec8f1808e6c1c013aacd255118a8501d6a1e0ac17da61b0c754a2d40329803f10fcb59c620c26e521e4dbeb66226ab383cfb29dfb1eae57eea00,400be3346a8cb85eed6aa1381796c70ba0572b5b82a0a215e9c3a9eb94a72e087fe72069859af0a94a2d414293848c143174358cc4ea55ea943ae882156ad4a500,196c8173be3e21d18f6c823b2ab76f994b1815590e1d448fd145dfcbd399b7877d56d537a2d1abe0b373f2b32e592b39e9875f5d89cd0d505aca4d6df375d75b01 +ae,9933179629de7f6b35c16a72c9e1f8dc58add2cb40f16325e49805b7a7320b45,874fa74e5df09d2c13db3a4dbf8c8b79c82f96298aaae347a691fb0940c0556d5602fcb47b864ac37b55627cb33bd5ae6b474777682c59fb1038f4b35582dcb500,64a5ac83fe908dde3b7b1addc800d5e4243cf6d8286387a8fa92baa6208f96d366a5e72bb7100f214511f68765125a350139205280ca7cfefb004370425a5f7a01,8c73fb7ea4c044486b6008038fdf4e5e5cce848d4d69b222877d487b0c99fa127235a63f819b9dd47b2f4a0a353dda31eef0eb7045479febec19f7d3b3a0265b01,31d279b3df8b7683ee99f135ead9ae07edea5e9bc09f2ffb77b95afe37f48b0c7c9503335e24ccd4fc642317d0f750c573f39495ae955e353f0670c850b463c000,230440f30ed84639bb41c61c8b94502b72b999ab28698045303a5ae6c1fd73010c082a3c2c5f357b7b70725fe77d8b891f240af99f865f13c7ec1d5e5202692d00 +af,bc4b519037a3d59df078195e1e0f972464b361c3667f12c33d46125a2a169acd,bf22730f1a3ed85c6226c0db5c86d7f18362c2e79612771c1e31fd607cafe5b319cb4a3373c659ef81d0a0c091a263b73ca053191fa303f057b8172ac0eafa8500,19deb7ed5743bdc676cbd0544184349d1bd12fb9a3e32581d27eaeee02dbbce51a4549c833585ca3c3666a062459268320f04f492e91ec40c5bf5ab448f2f3ff01,65bc2cc652667a4f6cffb332a40fdc84cdaed5a56885332e8ee7aa9cf42b8abf24b0c23bdf7512a71b970eeae184adbdfa6307eecfde66910fbe1091dd46451d01,08fe2b7a2a388ac0762ac92d5c243453e41a6695edb48f6f258c182dd6f3837f7ed8f815597cbd8ab72506c1f186d22ca70637cd23e9d2ba394c351086ca69ac00,1eac8e16c3f0caf78a04037f9bb7272f176be1061b09c23aae39521d97f04ad810b41d00e6d87d24ae56f6631cff3f1fa67900e0e6c02eb48180970aa54557a601 +b0,f26ea7f7e6a1c87e8147039327b6829b05b6b10cc5cffc6375a7019e785e6ecd,1a8cb0111ec55db992dd590df7ad1425ec5a9191bafecd384a6199e6e37b1f40592160a5affb12c52b7d8249c4e743a0e6264aff5b0d8bd3754899f27fc573ad00,73c163792255347a00e22d6967ea817a3890f0e8bdd6f74315c4691d12c13a4d4cc106475cb004ae96662ed7fc7d3931d0e489b6bf1feeb2788fdd769f67de9401,4c5570ef5172071b27bc91553b3305558de09796b0878c095f65afb66e3295bf2636495c8edb18ada9dda7e55bf98c4e4604ea22fb4f4018fdc1e79444eff80d01,00b5c19be737d8c74b814f44d6d06d7fe9835349de23a0548a9679984f7d442e3291771613ee8119d850f6fe12224643cf597314ce432f1b7a2666e045f7a84400,671fe2378f68a1bce5d17507752c94db855ec74497e1c96887e4112dadb059e30c9e1b239efe9ac51a862422b8417e84f8522ecec82fda2d94fcbbd9f2eb0a5900 +b1,09f4906ce73b8a40657bca6671366da5b2701a7c4d6319244f394c2ecb28f060,80c231a5833d5d5a09640728a982add86f80765225e73491695cd27eba0cd74141c8fce2eda027b5da60c58c5f3b4666a818107d4a31ec980e1547b4fb840efc01,46ddb69a43301e62b7788b397b7bd322ffd083ce7aefdd53e34b25c99184adf30aeb91b84a439674cace43a4ff3badc0177c735bad4383d5f6494e73fb8c0e0700,59672e721fb3b77758467559c0c8cf7c6dd91dd5ab6ad589018ef03548cd87e93682f254d8c9909d2a381ac643db4041c97014e63e57c38e5eb6a2d1f43c0be401,816b085e4202d76a36ff3a0e666be1cf43d2e9122d8ba83f020b73ba22623778558269c406bf7b70c9082baa4513bf491cd4797a346ae189bfa8eb2426844a9d00,81de64970f186fc555808928a0098ff2ccfbec89f072c2240215f69da21f3e3e0e7d5837020c39ddb38dbb0b00df9fcd6e7828d949faa8e96ec8cc12472e7efc00 +b2,22bbf0af21790d0f4c31ab79188c4173f9aa01a6aca5fcbc638c958cb9ac3422,4d9e73d21e65fe9e127fa2a040d38f4543e5647e1c1f39c419ecd32b45d3902c48e0e9560daed824f64ede9ba6af89d89b2eedab25a8b6bb6d556c48050b9bfb01,5a3fb1aac80f366be3423b74d7cc2635995c0af6e3a27d325a182b7a2367c29e7dc8bcb2411dd4e0c1514ed5c8a88e97d258d98bb7016a5acd3967ce5258686101,0d4de6c14fcf25674e65b8710355ff873de42fd3453490ad910aa698f21dd2bd15c8a96b35e1872a97c483c4281bc2787873dc8c89d044ce90e74889dd0a6a8001,409b3fd36286e5f543337b9bde60f2cc52e92614c7626e3522e09916819187876fd5e3bee66c859bb8309214aee3e8423c44e999e834d104b5be969f4cda958c00,d4fbd0873ceb2aeac4b16bcafec0fb8e6ea164381323aa2c3dbe0742457becdf47aebd92c3566f8cee401c9ba2bf3fe822bc281ed825a81e12d6298b9624bfe200 +b3,ab027bc6428191db38cf819995b340d8d8a24445d3a5cdd8ca0faab444d1c6a8,f2f21ecb923cb78db1ac39a64bd1e43a556a4843a0e60ec78ffa4b104fd5453d6f22b1fe5e7a50d010f417e8081d229b6106f5d942ddef05e3645fb188c53f7b00,e1baa8ca3631ac7f1deaa3281f2f4d24b293f74038d58579a836022a44a253c36dcbcc52a5f1a67d9e4a25d9e01cc5f29374951bf5259011a27acafbaeb2393501,6150eede111a91e6bfcdfd7b7b05a61d178a725d7035e136bd007484e67dd0e360281640e3e53f00df0da031b353d6f1bd4f2b61718fa6c5413857a26ead61f000,0107ae125b90a6ce018dcfeadc54aced5382f47b6dfdae3c4bedb5eaf4e2a66e1f394f6e80596f5d50925e85af163ded860105bd07b755ed4acc3f648e2cce2101,6436106182f2115776351baa8796e6c63cb84d56b7fac88011be189d299e71001694b0bcb7e2fdd2c3f7084e5afbb96e798741f2ac45e0cb09d56d27d85b26b401 +b4,00d4d48134d64e69018787ae2a0fc2a19864dddfdcecb9fc7b8a694c9b2ebe55,bc5e6ae95467be6f26818161cafef8ed35f9738d4c81c28022a5bfc977dcc7973dbee982d3de41c1e2269f60298f6f8c217d05c193d703ae17eba65be03a1c6a00,05badd8bafde5c62db7347507b75ecc32f2e8125ae9f1a8638b54efc1b6e29990cc5ff95bf7c8e0f2f83587306e69d59873807887009ae8d7821afded435edac01,989d26a88fa4763a499cade58059d4b49076f0a373031553feb10fd7fc5d2e33414522cdaaca70a829e8ec60fd36ad571f058ab1595b19758e3ecd2e87a4e2ca01,583734868d744dbb1041299cf77048d10bd10e9b854fb89e47da9f2b9d22d2154f9920170e7bd08b575093f50eac2907896da48f831a7325c7b9b6c5fd0355e101,50ddbe9246e086b864a4360437103002bd10053c7e00d79a78fb20cfb09c636d5e035a5b06e0b703993e5ccf6249d97aa78e30e08df7ae238e7406210767649f01 +b5,c0810075bb2194eb08876385efac392398153379ac878bac9fcf9593c5331356,69928c51478bc51af12818294fb989709cc8086d8e5a2872a0f01fa2e428d2482762a67ef49fb570e78e37a63037fa3cdc50ec15d4c4692c267d4f6be1c5d90f01,d32451dd3404e66163f2493096cd698059f9cbbd15f8df6f967ed5ac15fbfda4016bc70e66c557512300d88c244f96d7d23f885b4a1b746ca27ec08b9fcdcc4a01,f912d926a510ed249665bf0a76eefe2022bd3368cad14a4cb6b6f43656d062bc4d5b77bd80909544a27012a6f25efdea826eb59cfdf4c2d65d7668922f7ad80000,5fe8655387f3fd71a39a4ac15ab0a2041c552783bb0afbc10d30aa9a995048ca4f5916c07ad4af8494e20c7835663fd407effc87a640cd7530d41904731e9dab01,286bf7c128f335aaa098032e971dc6c43319a0adaefe22a34cf810f4e20a122608590c8408c94d3613dde56d0fb9538f2856ebff8fe41958aa8a9a0dbbfab75e01 +b6,acdc476866139bb0b316ab35de76551d7d3cc52e7e9fa8ca21624aea9f8e33be,4a989d1b7efef86bc8315fecc2e792fbba6a38427a6cccfe3b1ee7188f363c2023e5fdf17ee8741c5ce02899d6633978487a2c2001e2d69fa5233048ebe073e800,c98b2b348be16b0dc5af2993ca68f2963e1de2c0fcb7083be44fbcd85930e5bc543cf2275517752ee5dd21b9872c10e99b9d6627cbf8ac9b9d6e7c2931e491b100,6e84f0d07438f7935b9e9cd63c9e7cd12b141d1e4b9b7f497cf11897583127f0173bf3ad4955d8736dee8960d96a3d00620a75359befae287dfca447ae2d9e8c00,ba39c6bfa02c6e230149aa774466b68dd2502fc4a2a813baaf8885ddd87a42cd226524ac1df1d53060d85233eef0a28a16d1a2f6afe3e1d29c053ed8065713de00,5641e884921c460f32477f97607bdb546de020c5c5d7cab9eab9c3ca41dccd9e15a732a053b076392be3587c1c396502a17ae94f7e59f563557bd66d6678ddb701 +b7,e8c08f655a2f490167546ad201a54f726a458cd7ec23802874451c62539c03d8,bbe2271e408f01867b6139fb88cfa7e55e46ffea88453ede5098f60ea195947163f7a695f3672d2870c1e6fc1bcc9ec4cf48b0f11ed056014a51552af6f01be600,987e9e3592e8b057e06f6abb63203150a499397ba0502aeaddb060b72a3d78fa33fa966ebd536c6d1b66117d9e6c29eba365141d09123e513631c8b50ce749ad01,366d38aaca77b2c289d32fe1a54beaf6c2cc96537c9547124914663ccdebb38b773bebcad19ef679568e24828528ef4d793a3587c20553eb3aa8bc705c3a5e7101,fa0782a1965fe305fd6b6b01108cf84a3b7214d39329aabd1df4b01b13a6d2c80eed6a18480f8b2295f5ac18328d3123a5bbf9a6f081300d683256789f9500a201,38de089306e3e80f0a75b9ba54e177a129bd0f16ccd5199dc4947ad6c264c93c5c924aaea3b284e5c990335d44a1dc2796310bcb6e23366b1b0d8f9554f4636401 +b8,1ea3c8231d3f37aeaa602c0b8a473329d26f183954d12718d76320b23192e36a,8124ab0ba43e1d01dbaad2febd8d56ac8cf51a7e135ee689d174d3fb525cce1a1571390f979a4d77d3349ff97fad64e0e147b4445d03f55bbcb5b69c30bec1da00,69ce39b22a6e41227d0013ca85f9f07485615d9d189e26cd5f8cdc5b173532a97d165e556f93fa65f1a2b67677ed24e8a032e7442777d9a53b343b725ba8136100,cf9588e25a45434b2aaed4bc1482d8e2aff46b191fbb185fbcb0e66f3eda69be28cdfe109d444d94fc9a8033705c5ab1fd27449c74e0e1d0a0315fad2901f72200,8a80c1ff31b94a6732288625131b6c0ad6d9246ac512d0e74737e945aedfc8204b39aebda865797ce3067fa61cd4a03ba1d70d9cfdf00b4cc40e3e27bd5e827901,f8af8b283b98e00ab654469f95fd767e5446c74b505c3a8a5d57bfacfd46a422377416d3a82e3a9616cb3b1ee0842c9eddba91b592ab37f9e5c2dc65b2aceae001 +b9,9da9eb794a17bc0748f8193f8537ed9a6e9fb43c4708e98ef3d16e80f3cb57d1,61526f4ddd6080fdc6779c7e8c0802e588a65896ab11c7c6b715aca6e37751ae2c42cc72fa9bf4f18131dbeab5b1c6db290fdfafa89392b1042d2cc0cf79fe1600,d7e2425d4f72e82f6f2c380c7da53c817535031e2b18460c5205fac5d11300c54aa30b79a3ac15e86bcf298cb21a75b6b20b6d23c14188998f6edd840a9c41a201,4b54a64fbcc7a07c5c8161d9bb8f917159cfa37e7bd01f94c8812643482bb696236479cd166bf478f1e031931ccaad7c271fefcb67d5c58aed9d8b8f05698aa601,4be65d0412e4121711b7bd76021f4a46082767f5d2b2b8caf9c36f724be12ea30fc401a46c42f6f544410ab79c160356659c0e3499352570fa3d22678e81eb4b00,36099cbbe0920b3aef3941d48d0597d54e1fa392aa1111275b327877a31c6faa131332259d44b249a018ef66e2069dff9edea51649c0d1035b67c6c4ad9312a500 +ba,1d4b04d3c58ee82aeaba86727f9cdc07893c0340ab73197a843bce5750879cb2,42cabc509ce8845b126b1a451b639dc9bee78e6d027790294f169687a000a47a68b2157335c9f184a2d739e226590048024d49e4f89d4b1bdf39a6ed957a390101,dcc42c4a6ad0a1d4e9f6e9748ff4fcaa3fe26b62808c0b419801ba4cffd63a3476ac02871346f2fdab441acbd415ec454abfb71cd1c2bba8ec890141121f530b00,270c550b5ac0f5e2aabdb129a9fe607d3be20983bb34f67bde167bb9df5ab45b27a07df5161d8375e265c505ecd56907d1cd374009c1acb5bef29640cde5b79d00,a3350cbb3bc77c261a7c2ec0145ed9f3027ca17a175c7a6b7cefca6e2e7ef0863c5bb886fb9d295191b97a1bee448d39325ffbf6ad255136fa742dd3b986c78101,dc3272cde8e891cdade237ed84d5e872d98512298320a997a0da59c33acd0c654a73485607141aba4f3b3396bf3051451b1709ff2a74fa454be7d2761e0f925800 +bb,6ee1c2cdae9909d537b3d2a8e801a5bd437a298a4289f50cd5f31a5b55e223d3,c511d9413668c82c6b24560947bf06890c0b79fa2c2ef21b9f3b1b3f2c0cf2ee369cbe32d03a12938b2a7d3af31ed4e364d8f7aa45b2c0ed415448bfbe00a0f100,73d21de79df796e5644ac54e62024a99891136b030a01bce7ad87a9ed4bc58607dbe106a1734b466a41b0204b1ccf82d43cf2da326c3c45c6e843c5acb08900600,f64d6bfa30c9357846096844768e47626f4a286f9559695e92a0c40b60639d240d82adb39b216e84140a27472b59d935c413e1ddcf7237b42ebc044290e6704f01,8db10beca1d424d31c5882d42d7002d67440d999cf81100a9915dd21f3164bc54c870f731a80c396a09b29e28ad049e078cf9de9af17f8df0098f778ae3fb4db00,a8acdc0c90dbb9c464d42593260607e12e53db180b51ca3cc6c96740c1d88f72390f6c812dc2c1ab6f0e377c3a57de988541d764ea9745adbc6621965235747e00 +bc,4c9a5ded13e14bc56b3fc4db7841f68fd32ff18ed510eaf1d931498739349388,aeb47739ca4d664afdf6a9bf91b3a182d4a8e48ae0f8e4c5d9a056b2b2cc30f97b2b07e65980a6a49a02996b8c3adbd1c82844a433b2d246f56b32a49823ca1001,9b46c2a39d1b5a1605012e7d3d31bce7a4dbb8828e50307b2e326ba7dceed6b52c262585c7d53e71fa40595a8af356b8fa95ad9cd098d0ca0423702506f9235b01,7d6a1702b0a1e3e4e806217d52a26b7e86fc6d5ed1c7ec861063aea929f8d71f425c43ea1e7a294c73ff790eb6d1676a7cceb669d6dc14c799e74142a5484dd500,a78b32bd4373a4a455b0eeed574cc5ab3ef5b3bc59ec190ddf5cd948de334aad468595d7400e2a985bf35873d651ca001022b969cf5e287a18664e1e3ec0d0fe00,d35a45af4027c7ab6d2504a4b5d0f588dee1c384eeeecb9c22bc4edd3ff3c5392c7c2aa39f26888ae4b48e0b017dccd8b2b0ac2455fef65d36585b147e36436d01 +bd,eaebe2eaecb71d60dc989c666c305e6ec4afc68fdc71c1ed6d69cc89cc0136a7,56ce010e26e4b3b42c64f596e07abc8d5c96017f23cc63e0cff9a67a623767377cc2709019c66b9804b2abfbac7615380cbad5dc655122a42e78168384eb0c4601,c0e44cb5fb79115ee80277361d8ad781460a1d1109e855957f4a4816c95fa7d629d1fd59d5e6735fca1ac470efd80e6f5df1ea8ac5b31859cbf5d329f5cd692d01,0cf55f31e382c416d68420c024ab091407659f22ca18653f807437fb28b56ee7207ff2c4a7549f2442c91019568e215ba34b224ad55d8b724c41c085c9907beb01,85f7ef80262acb3d99e24f8880d9b7be842e980877381f19274d35242723ba141aa6213ba911ebe510a784df455e4651d3d4d4d2f8a703199d640b3a6251916801,10ece8e166967a365238d563552beb7fa9221e1c5290754e4377a1f97b5490c2561a621f90275c51829d895ee88edf09e4563386eb97637b6113693c6abcd55701 +be,d056fd21fa940e7d4301f466a4a17f81c5efff4081c90c252d72535aeecd865f,64adb1b9eddedd205f20c5b37a17e66f827431e1d9b8f278b35b9b5a1f34c195363fef02a0b09783a637b733fc4f517d748c556a74118077f1bad0820e4a11d500,d627d657193b0b05049573a8dfaef0fba4682735a627f1cd09ce5bba2957d44304a7f06f15e11e3fd69c7d55be0b4363448b96f592c570133e27dd391f662e7700,2187a3e64fabc0dcf4bcdf89af317c296e9d7f472631ee1b0a398f618555cd474d5e671910beac47a4af109aafe9972369d314db0011fb5ddf0f7680a72bc27001,bd89236c8e655fd0529094bdf1dd89b4dd1a7a0a19675edf289bbee1123d15f94affc9d5aa691bfd1a567ce96497057c97b0dfacd07dcd6b132b4238e34d330801,7cf492235137695312caa0985b2dc15bd158203d5f2733956f06e3b9a441852e028802c1f4bca2414c9eddba256c17a0d056af7ffabbdb52f61cedbb62d3d78301 +bf,38ed53694c8d2857ae54319f2d155c60e6951879af5791cf1d4e30b489bf3e03,456f67554195aa8eef851fde1f06cc9e9fb1c846994c02a24abcbc441c816daa36365978c8f7e817697be28f1fda12dcf7c7104bb6f32bfe48b9fe480d8d6e3501,889d6bc591d9ce8509550c5a2418028b3c3641e55076dcc926595975d9d097475ac12c7aa30f5b8d32dd2d4e4481047c2d7afc5e0eec582a41963b3c85eb622e00,a74b1d2a41e4a44c0062f2f0353e357c6ea57ff450bdbf72de332f5d900adcf57cc46cd79dd986e217fc0fa8c545e5dd68f324cafee1d32058cf2134eab676c400,977bdb47fc4c1c58930a51fa702ccefc22daf2d5526bb662c57eea8f7508f21d22e32419204ad25c7d251bc5b79f53a53f6180c1c3e3bf5779f880cd477ac43701,8f9be1b59df5589ddaa10a0dfe6a49aa7402f52a18b6e56f475aee95cf65d5cb3c1e1c896d169dd674a6ec3db62010c69524c2ca695d4b4623a602cf6b15ead601 +c0,86158af9a997998c304f152fb4205f4e34ab1ed9d0608e7b4b3d131eb8583bec,90bfa5c9c64cbc5e143979f3a201a4630ecaa7c81518571c2d9f5d408087975c4a1559b5374865b4a0f4a4672e4acce6d8edaf51f1184e16187a485b410556df01,f9eb8d07e9cd96cc8ef8ef13648a2e865db6e42bd142c73b7bb3571d60742bf25ad9cd72029fcd5db3daf56b08139f5d9d056e72b750ddb71212ba4fac9e158c01,97fa237da0cba21c6fa95512b278588b35931eb01aeee0280b97ae080f620a8679c19e3d4ae43ffc3d05b8d11e00d0789c8bece02c27bbf0b53eec68a11f7a1500,70984cb570bd3fcf6a7e19a63b611a691fed1868910b63b43e652a625b0192c96f254baea0148ec6a3b8a67df40b599e7530672b6bd1a38fcaa43218f984b97501,2a5bf264d805404dc934348c8ddb624d106c27ce0b366e693ef2462cec36ce8b47290a99b368e87f6c19761f704583c71dd03e145ad78cbdfbb4fce7022c958501 +c1,84017cc4766095bc05426e84b31e4203c1f77cd96efbed1acd3258e919b654bc,e9de3ad841ee809ebe53eaaab8d5854286af241f2f5c7e58504d061228bc399815a86b5f3e6f7f30faffa27ceb8cbb326637ab8583d5b832eb0b09ed2cd3226000,036daf315ed9a7abb8efae835675cceda806be6e266b2d9a036ecb1dc9eff9321340fa7fa844d0533170f5359d17b1c755e82fca53f90c41bae08d1d5bc4b8e600,6fc94c93eae7fc7156dec24c409da0a7a041f6dee68511e6d671f0210febce05626820740d88d13c1714d113f512a108fc4fc5edef14f5b05ff2632be08449c500,327a5e35ceb7a6cbc73c7922361492baf2c43621fff49e0599b2b502def87fb3303fad698744af41cd7a9016e454de5b43ee0562a744b3fed4f524bfbb6f783300,17a1201c728123e37b0d186ad5995460103c6d551fc67ed126086a31099a3b9c79767346684b63ddbbf818daf6158b7b485736e5ba45cf0010aaa5f4a58df14801 +c2,75e65229104dec7988848cc491d70f943101ffacd3bad3f0f217d201d1744cc1,185a57d9deef290abe0e8cb5cc0b04038a83992e6b1cfdb519b3bac1c549cdf86bf89882ddcc57269efa0ada4edce5541d2695b167a3ac43fb9f97daaaa6c22601,05aef8273253fe911546f9767183b2e6a306eafd2b8c411aa229a0b62d48aeaf69c9dead16cab1ec705a581b63444a0a1bb26091b77a9bf2df97f9ac17bf021e01,c4288f306af0c7b7c8ba47445c41409f9fbf3e69a6ced19ab217c1cd422c08bb60d2812c0f3544bffbeaec4e0b220660c11697481966ca75c5e32d2c15bc824401,66b9f414d7d72f5a6db0498ca27d9b5cccd2b61d2cd9e85b6c7a6b1967c57cce735d6b9d6e729029f02d6ed4442e9b210da849ea58fc03b45291062c8dc5cc4e00,705e5b4e648b8326197617a4f2f40254ce85bf1f0db14dacdd56007347bf457147f3de0dbdb9b0070c01fcb3dab179bd8bb48f2f5741546327e42466772fa41600 +c3,95c72dc3f985221206556304b01b1fca16a9794b8aa39fab67c9471396f366b4,731d2c5a47e0556252420e5b75bb160971b459a592d949daf31a088b158aad4658ec766179d63448e1ae94bd162f7dd980af94736284c170f52ccebe967db90701,ef23b1bc594b58b73d9b67c0401f6a13aba8cae1afca9441662fe432e8ae6f2d499f9f27664e88d19c89aabd7e1861b00ae580b6eba315cddf69114f2f1f854001,12a0963f774a24e64474b0c918c0c193e4b262f0126330fdb371bc8611fc90f36077ca25035c16ea380a678e511764a423becfd0b76f1d2714c2b6b8c9396f3b01,845e5aaa89dfba7c9f70351750b028f8ea871ad2004c1234c58e68c197cd6a7413579fafc4f4511f4d4a4a6a3a0018cd9cf068de510d76fee86e6697fd01bd1900,0fe75fb8318ceacc4550228a12ff9042cb8217cd256c925a8eb20b169f9923ef3a47538ad274b4144b4545f5d8451fb3ef066094b13b713d5e968af40145c34000 +c4,0e158a155aa855ce785945cb12a39d555941221c783f15ffa56dec8e789635fc,a3987f5e224dee30907f354b7755f11636f151e612d31f1a2859cc52df59fe2f69675d510582e5041dca9eeaccf435ef50ea7c10ab5edcdbd4cafc8c84a680a001,157f45303924e8708805279eed1c97118edc59b18513e269d89b0f098e213c9c3e77c1738660862c7b5678e65def2bd9d596e7dacabc8f0767d7f70ab46569a500,25a934185aa9e5cca8f9d8a44adaadd2afe6298e2dce24e29220c819b117f1367de655fb4866447362e5fe1ed205538baf505b9d72077379b571655ca01a96d101,25df06be5cbe86b458150de0aa2a87f27b342d5877bcdd5a6a95b5aee895d89201eb3e91611983d6ad74d41ad25d0fd87f017a58733e18d563c6f6a78e5de13901,9089dfe45d55c8e0ee35d0b4934bf1953b1957d3b9bb1e67d1f660fa10dfe44f58a1681a4cc83f77ad2caeda19c78a1d4aa5e91ed9c0e8b004d881724cc3d4db00 +c5,1e5744f9af4f2760d72f2cd0b4c6e6862b68fec211bf78ac1eff84068c1ed9e4,a2dd26fd5ebe9cd7bc8d4b54d7f4962c0866985bfd7d161ad5abb82596779608506b63f084613b865d1c1ae08cba6f7ea949a0ab383dd9e68d3de67a7280d0af01,4b6c7aa9f5417f0c8d8d3bb56258ea32022316e2cb37f4a4445b48454d6e10262c0f884c03d211f43e705c67e608b66cd02bd0de1c9f3b43a23e73e0574ac84901,08038d62d697d04cdb2aad268f4e544d6f4d19a1b8bcda172ab973eca90763c007742e49cd3b504249e688d30c4a2c0960f6b54c1a74a3dccb04969ebbcbf2a500,aab264eccf39ae101e566d376a3abf682b514212c5567a77e78122284ff0c8ba5a2b7a5ef3fac748d0356a6f0e51b71ba7dbafd638d423b8c75a9a94fcb3dda201,a5690aa43c8f40c6487d72b9fd26a50f75ff97059357f7de2f7c399ef534c1775f3b2cd71b36299b3a122641c057c8c79e9e797b256a47a18a03297efcec552701 +c6,3004619c927bb2a29d01a34619951e94642e132e01f368736f60a59c71d3d0ac,b58a2b9536ae42c31cd0f5a740c3f5eb50dcf57cedd42fb1821ae2a863826828740b4dfac68272e910e98bc5faf9e9b47778a9444eeb8f8c561b0915ff9e54eb00,02ac69eac225478c889d7ab7a28950fafba10ea12167ef5f0969e399dfe148521b29d5922048683f6546062f20c2f0a3898c3008d93eee05de0ef5eca900508a00,9c8ffc36de41f7d84708a9fc31edaa9460c138294c52b7254881f3b7fffa013269a32f80c71fb0d1a60bbc87eb46438675421af091d4b4ec0387763ba91b793800,59be599defbab707a648e600b426532d8375d9b7deea25b49da64490917024cb3986ae80c42e9785e321f2f2cbf64da0266b9fd9b59f85e0ee22d7c6d6d036b001,ac8e4673588426548620cb16f59efd83e4502975494ca5bb7c5a3faf120b26a724f85518b595802155020cded8444f9af0dcdc099b4024f9fa02285e0209ce6701 +c7,0c9edae2ed2dedf8daae74f5352fe5e3708523a004520397f03788ec7e6fa9ec,2df393b9185141571aaa7cb4991abcb12e8c1bafa129b43663ad0011937bcc6e1a99fdb06781a8a469fa798e8735e229777e42867c75bd7791427cd61375303400,d538167969bcf4277f7a222f184a7987ea2d4797176a9e37a0bd397dc9441a137528ae35324a0cf712f2b8f0554fd930fedbed83e10231cd01326f4fc95fa78601,9e121291aabb070fc5eebf3f1b5f2a58cefc0c21974793f3cd829e992472b384626262807a5e649016ac307ec5d4638d168562a4da883f843ac41e79b62a213601,e2f820dc7c57f95cc6d160680f19efd227410a49dff93f849d62f6c61188008d28d8fb8fc1caf6ee74f0a2c350ce24c6242df2a7382ca559c8c0c6384667eefb00,6351f68e845afac1f62cdc552bf772b41f37ccb98ea9bfa02241243ee09c2e057d775351ae8f5ec2fe671256d21b0513f6f3c7b9223bb1332ffd13e0c49de45f00 +c8,3a5b8dc9634d54b7dfa576d23d509152eb7318fa3dae054fc29358850001e5cb,8b7299025eb2ec9e367626b0f1aba19e58f796f2f98a158079812011e1642360503d46f44c9e0337eb5705b1a890758bbc9767cca2582313b7d3e6c0fc73f01801,3aa7b1aff7ee544e8c5e9f7f03d3c4d6ce93b9878959437176da0442d7e23cfc112c40684c67af33398193206926c507355610b550817e26517820194666453800,69c5507d7d1c47f48ec59392cca2099a2a0787a43c8dfdab955632ba8863717d059080fbd704172f32bda8f23eed6d486ae4ce3f7f63723f371c95d6930aecef01,ffb0bc9e34c1949540ca571b07e75eb1438e5df5a8b8bba211ca7a8597fba5d17117ba465ac108a503a7324af2881bc782371feb2233d05541cc79d04ab0328e01,4ddf5c80c96bad4605713529bef8b372ad63aa2789488f914e3a0232f19c698b303735c96def48213730f85d9284381cbac8428b2b22f7eba6ff7aa7a594afd300 +c9,cf9e5e5d2db77baf95af9c1c7c2321d6fd465c9df3923594ecf773b6cc2a0e66,fcb1da088953889f32b4b6f455806027d38c05f5c764d44925f3c7f8f2b8eef810cb56c313ce692480c76ebe7971ee9e955770872c45152b741d8f7a9ee7302500,b7c6ed9ba6dc415f5b536326ba0d226f17b46bedaec960be4f48b845890afdf769f393f9865570382c14f79be4c6dcdf6a992d90351b703acbff15fe9606796800,16a3561a4bd8c3ecf0a2aec8a35e2f3004bb4ad63cc6536d3960fa49aed3c55d73199cd47a23f7619ae99d59e14e5b38253e7d1e065053d0e7f31068383c81c501,efcdbb6a55ee73164ec33dc13f0956bd8a88e4c8a15b82b75e33e7fdd63ae6b30e422be4c622003c15a1fd8eae88baeccf49d11d5c893a466b1e85da30aa6f0900,20253e5db29a7329880c827a0d9635e2bbfaaa5fafe48af4ffd26c69a480b1511c596912d9bd7c5f1133e88ac8ae408faffce2f0e8c1cee29283c8a8a89fcafd01 +ca,7d1cd0dc41a812c12ffc37ebc227b8b58c34a313a34326e07a4ae748b67571a6,9a3ef9715c4527b3ab1695fe1f0c96c8cb40ee24bc393ddac1f16b728c3d95692d4f5f4c4df411302bca23df9ce03e67f1c5596fb08cbfa92f0259432819071a00,f1709a7a34e86c147a985af91970b43fdbcb280f6a78e8bf55a40d777784c24d09032d467b34bfe4a94bc49275e644d8fd6aa2afda08f2d343016ce6292405d701,e9b5f3b74dae5ffa4612c7134df62464d73b7a6058d5ed7ce89dfa780e1c1254614236bff73c22413bce9c19eb58bd30af2571f7040cf710dab4c2fcfc5cdf2201,16977a5d69d22c48083eb053f93b323d2f39cf8be44e1f9d17309d060172f0ea72b726339b4850f88605a0e7ddc8b262da56be2fb8dfb54e82cf693cacd8786601,f9cb0286a97bc0dea7069665bd672c8093df0185c551b0f4dc4cdbc745a3df2e5ca51c5eab98cf1289941be32b72b07589325931b628e8ece705267ee89e0dab01 +cb,1ffb590a9026135f65a7e2cdb2264a7fc54e6a3a6fe3b25ca257fb742efe345a,3e8e0dbccd0029157a842a843d02847a0d78b3c962509519cd2c94f3ffe1d4976bf05053b02a20f2717ffb83378d09b8cc09b7099e772c37f39e3e4ebd71488000,074f12f581ca534bba6895a24a7ea8ac8e18e758f83db1b72f4bfacfd78a11ed4b8ac2254d0faf735089c7e36c021cff67e2f7cf3706e5ecd93be4b8ef73d98a00,25c187071085a67e2f1504626f37a258e797fcaa3c383815bb5a7932add80a57396503b0f5d6692284ec025f49079328a58971c9a1f30f166bf36a5883412f3300,42521cf854fb87dc22d418bc6d4f8f04d56b503a9e28bdd0d207968d917df2b30de13a2eaa54e1623475359cbb40428279246f5f0016e39972bb00b89d9d895900,4d0a2842433ac9239dbd6972cb4a9da18178c7ff75870b9e835e086190380f2c7314fcf8c604bfae3fdc2aba6a117b85059290bc59627a8b6132b695e0a5311400 +cc,9309b51a9541b8091d7555a1fdf42036fa1cd4a93e381af990f51237889c36ba,5835abf193594e580cd3d6709b0d1efa3632ee7987e126f4246b2335535a868b5bd60f628b3be5b3620444a38d085b879d522864a60df45153001a01fa1d8eaa00,aa9fe29ff52f23a5137ca42510363ed49c714f0e2ea130525901c8117e8ae4ef788676f1f5077efab2c5dd7eed9b33a5bd7e2157c73d54472826a91379e1d2db01,ae7ede479b138100c25ff4459aaabfa9acc26ba135d13d8e198e89c5ee611c4260496dc1696a6b481884668aa7d5fc51709878b96b36cbd28d4363dff3c3f48900,57d7f6aa29037c76a55301a1b8dec1672d8cc59f3a02916ea82bab406461625a2b047996f323fc8d297cc28b87d955ad65faa9a3e4245db3af1dd7cb6d8af37d00,75c78443d82c1e204db47e908e047fe6b984d4d4eae2047e68a3b82cfbae721b6994e2f27eb22972e2a264513225d28e4820e261edb3a5edd056dba0345d2da600 +cd,c3546e410d2bd35243e5b993796a57963c8a3045c6d5240b63664346ca9620dc,d9eb3c0d79eea896e18d3e52d276287c4885267912e68751e64d69af47c3a82915cf5db130e5e7b244403613f34a8949765599ab2135e67c0fc019f57d856de501,73d3be58b5b74ab22c710f59e49258df44638120cfc3157657f3d53855c364fa7647475d9241ff40c8c50408dc027ee870259b552158e7f2654e5249b37e73d701,b14760619d551e614b387e04fd79cbebd8ffe00700337000627d6e2a4e3d0fe55405a12f304696be65297fdcb63f9470080540c49765a4c0a06bc2f6393b95af01,0251d4543ccfb65b9638f0a438fbcba88e8f89c805ef24a32b1454bbbd5098655335d7df4571f75f5aa3a3a57e2519fbf9842e9e72cef789eb095b7709daa3fd01,481f4773b5115c36d8d0a47c4b740aa3fa00b575ca4b78a67fdfeabdff4d9f4277f338ca818e6482868ff1a0a64a630bbdc1ef41cf14caf03426ac72f39e0f5c00 +ce,0b018ad09ca68cbd8fcd06aea7019e3eea987d562d57f5afd46dc20ea4ce3a7c,c6251ba0e69ac075da67eb4e619d863039d48eb723b65dee5e726610ea0439eb0941c923c2dc76974657711edb8e90933de597121776b82b0b79fbf2aa35d9ac01,aeda7d365f45a661687d50df41a52a0d896d461aaf3f67e78bd72534ed16398107c5f08e7503c1be8513542ea684bc177709ea1e8c3d3e5616507c3792b375a601,175e3b1465d87f59eb981f020c4bcdd2984e54ef648644955950ce23df52d5f427f9a103f1df0a8fdf5e7343f3c15a3e75cdcac53a160f0656e1d4f082a5dc2400,c802c5c999e172f5db75100e7189d79086b0ac123078fe73372798f85ad900ad183a2e41b64d3347e24baadef860c587b27013cde7f93bd86ae667961130569301,7b77fbbfa237d47f209a0c4014bd9d2679ce84abbb55881d415bf9b3b6609f5c3e21664097200a14d005f2c12820a43f9bf4c02332485834a9c62755088d61f101 +cf,f28c9a61f9955daf8eee828ae2a1ece6caa36c9192d40f6355b543e0ab686699,ffb2b5d80840aa4522943789cba00792bb2c409a57195f9c7dfccc7ca09e01bf78b582fd13897443954930bdeb9ac686fc0d663f9d9207c7153e69300314a24a00,3c7fec233e7ad725d207b96a8aa4163ddeed9835a586f11e2b8cdd9d5023aa297c3bfeda1b3cad1ebfb6881039da49e1dd3727ed2dd335fc6faf50c46e0f1a5d00,f62a1fbfec24959dab39308b4d5223803cf23f6481af1a8be76df068add07e7908b5b367c1da54181d95f69a6d9d28e5853a061538abe36f04326176b1e72fa101,c5b7b08bd37200ce25cc74067c71fe589b0c850dd1b665be2c65293de950c39056018a7e32d20b8436d576f24a9dbfb90a42e8bbcdcb470f5bcf40a9a2238c1501,3d81cbea63e31c99dbec0e6aada9f8e1d928a9d37077aac8c898998a0bb12ecc06c29e2e13fa2c6cae88f80af8fbc6079839041c513efa3580254340ea93e57201 +d0,cb08be0992fadeb14ba6ba68e6f7cd83aaad442e0c32ff7d79814fee450ec95f,0bd12cc3192f61089004056e0323004e262914a9c95fbd044e0e3a9a76ec84640d8fe82e5117018e77410ba7e1307a1a86e39b26192c4ea60107641be976289101,0eb287a29e80f148bbdfe89da5226ae874a81dbb9c1b36a95be00fdb53954cf87b223f7046b2afd1c32152b4ef82927186b50cb1b04a6d23f76bb88798e65fc900,3128390e50ad522dd127bdbb1d4278df6eb6cc48f662dba8583baf8d87f6e37e524e9db6f242bdd9fae0623357175522d998d69f00e89215d2a9168da0aca49200,ebac564ae7302946b1efe6002ce33ba22eb9fd3e091c76dd635a3e6f8c76cecb5c894aabd0f3f3e17b83bfa5b2ff2169894f9a3b75794c30c64d89dbda5a440701,79d796709ac202c95aa725d30442b60d4cc2cce262f4c8234ac33b14a4bd4e2c3bf7c890e77cf4295ea9cd00e25f8e10770bd4097df495af1ea221be203e166200 +d1,09ee80f2d8ac6f05b6855742ac089d67fde51857127c2bf0f5abc4fda9debcde,3c53bd30e9536851b4d41904e67576e784f510d015bfe1c3d463ac308967ec5426019a53d217b65ce829d80eb73c4edd72c9e9b9a5d2fcf8a6dea39064d8031700,749544168752823e950dd8aea1e8fa02cb6b8c784e31d19e8f635fb38cde0459600054d49665aadd9caa25b4c146522da1b8472f52a50d5b59880d67051c405d00,7fbd997b521ba12f340be5e5647caa7db36238d9c514513a4ee716047a2d5a36089b4293d1f3c2e8a4a40982b78de3f1ee3e24ec1a689a5b8338202f8b0be18e00,215f1aedae6cdaad2fa32d95f0edd402b681266725a4eb9f485fe4665bda9a7c750383307bd35fe84283d0d637ae9569e132c7c63a2b86a699c3c01d318e8e3f01,b431428de189c242eecac16bde7eab88a21b131ccfdc7e64dfd981ff7cd321362d0289d9907359fb19f1fb15709e4b4c7784d047254e702dc78340716fb211b801 +d2,20af791798da262464a44de22a62b2fc918a20365c8d4687fdac3faca95edb20,80271b2fe9f0c8289a91636d5fa2abab55cdc686029cb7b4c835e2ac5f1fc8da6792aec914d659adae40ad299a0bb5047a3a9cc39f17cbd1ed8e51998603df2000,bc563b22c08fe84f469d2f659aa673c138783432e35c9d195e2744913b07a9bb506c1274d525b2faebb7c9404e707e1f9ac3ff2014448132b125ee9f7eccdb2c01,d8f0def06070e20d97d95bd7fd269ee12a9f34f6ce6355710f472a8c29968a6c0a41a0369c7b4aa9ea2e061f1f3b758a4f2e77e9988ad3eea009a74d60c0fb6b01,d6134a098ad0200ebc9c72158ff1b2a1ae59945ef1e411c623fbd0d4af4acfc02f626ae7d552c4acf46bebf5e8b86b040dd6e5e509e9f68b2bb94d9a2547737f01,2660b2726bd61db1793c0f2a79b254e53d4e09019cbf15481cbe49eda6aa0fbc546e9dba35c26bac0420c1546f27b6e469cf1835b83aa5024714f66f1f7b964f00 +d3,0860ec4f9d26a8e0e62942013291c769003adc67bdc4f4848a6c764ff4137f38,d6644c7b683e1d18238485c9fea4ddb3160c59fb0e37ea51033495271407f66b66ec7c6cf7c588cce7ae035506e5d56970586414a0abeb8c008bc74a4950422501,e589955f38285d9f8c36e7feb02ba4b6c5a600c7fee651c89116bf612c21f26c3027759ba41cb1975aadc823f6f947a1092529b9f8587e413344b406b6076a3100,9e0a7b8efcbd6969f353e9235478aa416ca0217b5ffd7b57d088b550f1177ca3002ecb688975a706672f99fb72cf9a2c0efc85eefbbe383744c06e2ad70b644601,c98e1e42101e68d43022424a861fbabbaf6fedf4228dcbd6f667b7f370050ca63ec8eece2aaca7d102de1565c5619f887325d4d4cd426934bf3bb5d6371ad13701,c92bf15dba541049d41ac6aa423d6b70d2162aca63d0227abd0e9c205d2d24415548502058c2caf16bb2b7c728c450e5fcb93f55d0faab49b1bb957e6e50657b01 +d4,0d544a1e68284262c05e7391064d40e84a9e276c944236c61dfc9d4e10174adf,903f28251a1d24648d67a35ce047ef2849f5051af44fc9e740d7dca7549191656fba3175097d81e373f555c24a4c4946f0f08d396d44a9fd817b3c8958a7932401,a399dfef75788bc5acb4745038127ba611008eaf6761acac3cfa5fa6604c3f1b776dcddfd93d6a5cb9c1a4c7e8b1c4e96f7050ed5d2f00e9e6d0762dcd35820900,a388d4212aeea88d4d04f8593d56bb63035a9a8c2db203832713ee8845b4a8146a01b870fde51a44d0b0005f2572b31b2911db69e30eb6f9a17cd61c6c298e1201,222b0653892b70afee82c2b76d3721ecf97181222bc386a47111291b7d21d3f60dac284d5db139f4fe01801a48bf4a6ad69f027e31b8628875854672489aa3e101,e806508738670f3b659599795f262b191b3fc4202f54d955af3279abfad942f8713d1d61e282cc5dcd6f3133a658ff379677b3d76e7cfaacee02712e49caaa9400 +d5,3c4d083d5525c5ffa3b6d96f4398eabcca5cf252c1db4a7fbfe6c2074ed064a3,78d0027d483873d917a03487e0da799d32ec3743d3874bfba8aee96c9a8e570223bc261a2e1d8caaf2bded99a5106c381548f79a5606a5e19cdc90292e197b0600,4d9e87b176a0f94f530936ab735f671f7b86239cf4bc86faccf18b820554b83f6855aec0ad952dd16022d066f492533f588525e044b4834241ccb0324e010e1c00,96f10faba05ce7b2ed3a595dd23f613297a5179a045d4f4c5d0c1022467c60995534b8033936f7d0c4fdefcbcbe47f0adf94c8402f7bec3265d6e7d8ffb60e5600,130cfa8132dc8a0dd2f2947514e98bf66a1144f34d8726b6afeefc5578fecef91c80d156f92bd17585a2c02ce8b3486c39b926d5f178cc8e01efceae26a57d7d01,9309a8cda6621f70aa7c9507f3e795445557a81c854f8beb6396fad1736e5458049444a27b7fb529da8f1e0cdd068b7d3b9881bc9f39b3182e996fa4c811a7af00 +d6,6f194170343b529d4612cd50a30218e1b8a7b4fd26398bb1a950e692b9691632,3fad5526ae340f35390d994c127c482ed5faf495f36ca3ebf64c68a59435e5e468245e7378e8ac26f2844fc877b09452df84b4a61c9445e6c8d0a3e49afe82e100,a3358071f056d00e74493b226daa39f31b76bb7988f438aa584ee5c374d314302af2b54ad5b64cfff8769b19ce8bc49b156c1aa78f8574f31990cccc6b0c879601,47f2d24a944178b590d694d8afdad85df1f881ed2be4111a031457a9c13244c93a7c5f36290287a9f47fce723748ddd1b1bf73c74ddffe5f13976fe32d007b3e00,2358696d942ea3611908fe4a53dd6228fd8fd62454e607ed14a3581b41ef1bb908b221017c1b15dbabbfd4e949456385747d6b7075dd4a553248c595428595fd01,96b6b6d16932658d8f17a45252dd82bfbcd9669debe7b81e0ad0897072a925fa26e5b1800f9aa712ab0c8669096ba39958056f80b4530f9c267b9f392453ab2f00 +d7,5206cee2a19de6a28b964ffb504233f1a90348d417aca08bc24ac2a54d28865f,f267ade9c1bdc769ab116026b7defc027150e071ed274e122753aad67ecbd8966f5ed494461c3be4eb50acfeacccde61254fd3bb619228ff02a8844a9be1b89701,3c9afc6ca54fa8c487062e19c7133861a7c0820fe56565de578356768afe43dc6a6eb2e4961f5f1c850d70da4a427ccb7b3dd0c8f9502767f015c51429a24d6100,1a4c40f72e6346e7d144c846fa271159640aca359c505034dbe7cff560789aa96bf126658eb8723d4a7608a372c02775be1df1fba9ff1969891c4aa9ebd0f3a100,f84955ce84f32e092666591b91336c47572ff02059d0013928232478ccb8b55462d6f2c02683a9d33e84cf842ae21c493dc9dd239f3b9e9d8fe533b7b7e61ca900,5a535e891cc212719af97030aaee83a94de4447527c44869f3d37f54773183fe48b7543dab34c0cef3ff6e361e4db547cbf7d3464c8cc8e92f1f9fdcb0187dce00 +d8,5a744760a091188513cc63e020f1c5f65f04097aaec044d7d9e270bdb26cfe30,2fa21d2cfa5b526bc58b2d57454a0f071caa79dddc580fdc5c490ffb21e0c81a24f601bdcb6a448602bcf60252c5164a984dd9756fbdcf5fdb155058d09126ea00,e954d6620d49a7bb5478c03ec2e2c1a04cea9aa3526c6e94a9450d7bb01f4b72504e75247836a86924b41be72e8905b68a4fb91e516c41507db4e83688aa32df01,2221eca771a47916ae6f91bc51a5e31c76e15783a5a8e301b59394f9d4d946234fe1a70abb17f19e8405319c10d955b5fba12b82e7a1ebac6eb6bfaac04195e800,5678bbbc5bfd4f7e956ac282d966fdba19b969c66364cb6940ec4f68b336b50b5fbf71739930b5aa813cc22b6067f9890e09f60eddf128e298ef8c6215d99ada00,1b41da54784022ab3752853930eb7aaac3c2f368ce6dd57fc63dc48c163560b4428b6c560c440922c7fd028d9af9d3c6e5fa89841eb8bb3e71ee3bc59f27905e00 +d9,0995fb2d423684bfe207ac332597c4a5b1bc155ba4940bd2491bbb8ef09316e0,5acfea8b7d9abb6ae67ea1b76f2c1d92ce0b85e801caa2f6297744723682ccb508a09e4a97b53e829f3d2ed912c1028a9115c5afb6bdc181328e3757283f483b00,58a2db6bb7545a47adec827bfa740b0a8685b28503c43ca59cf4b939886fcbe7337cb74a0f0ddebe2be783c3efde4801d44fe049bc1b80a8a2989c0e7f4a160f00,7e7003e42b7f8b6ae932b55fc161dc4fba3eac00c7be986d5aac7b058386c7f535bfd526c3b3a9e721e01d92c10786446bef28fba815354430d5b96b1271da7b01,b9efa60202d696d5eb97b6fa90fe6893cd0d256b7e3efd5ba921a3e5b858d7de0643d5414d4e98060cf7e85e822fae5498b52eb9a88af2920d92561e7e50c05000,de04d4a9c9cfebade372de601e963629de8f8984f2d798e41b7c4d83045155c76cd09bb654144d0150b1d9e885f4e3432d570838104b281a98880a925ac377e300 +da,2605c734c61ad05a3284534cde3857f27fb117389c8ec2673d10b9c2fa2c5a46,0bf6bf88c1bed209738b49f88c00d8aba543f568d86e9d2ec1f947130ca7e2d678485b8d7fd164f11920beb13e060e597d62c6f922e48a896af336e2025f53e400,d7cd0b822efcd1b4157f32300f82365df57ccca5c95eeaf613dd3ced5eb8073235d2a6558b6e624ff4eb691b8e3b42b730c840e914e422428c69a2542b3bb33b01,03346a57cfa42f874b5a7087ff176ab1d63ab77d717291427fecf0d27ed7c5dd234ffbafd51096a074188012303ff5ee0c19d5e97842bc17a0e4a6fbf65c43e700,45c364cb8fc3dfa83af48b28f3022edb1e610139d63fe6409fce73c1cbf0bcf22a1dd29b709b4a548b1efd2a1e6cc0b61b3bede7b921dc478d8345930980374b00,2b2f4bef0e3ea53fdda3a1a625f482bf0830f335b2c6e4df3e04cbd64ac05af9614fb3a697399ec2b8409f7dc57496998326c7a51dfacc10fbd0137ab828221700 +db,74ee0d02e476d9ba956fd9f5ff7f130de33a2e1b7dd6c6705ff81c72b1fbd52c,d43591c7fb952e847389a8a4bb06591f15219d3f52e144ac4446214814453e6264aab6ae584b04f281cc8f7ee381b9660d5a107bf66a82977978836250b8a9ad01,101d458f28c896e090a61e096dfc73e4cbbfbca04278cf616ab6728b89f0552d30d5b9832de2b94e8ed30b4a18c557b0f33fac39641759989842797c6c15095300,cfc63672f15a0f84c2926fdb0d547e5f7c904d3c60d7832ba570e20028b495e01e259decebc7c3650951e750c9c83c75b969e0b2251f7fb5a02248960a09d2c201,609759f391316da3610d60e595e6896cc1695367b663bce5f6f7c330ce4e3e5c61e577f6e6796ac7c29c63a7bb06efc0245f1c06eda182c3d2c62b21d5f8492300,53b16ad0e454b4dcab37db3e01a71229939f9a6cb4c08732d9848ade8b930d794a41049e33aad6332732a0d804dd05e89c694138e10fe47a1109bb754f99c70e01 +dc,216a11fcdcc4ae5206074531eb2093922d8a8e5fc76f41264d91379fe2e60ffc,179dd7f7f8201251ecec615e58ace1cd2cc9e26072c517634a3fa425526b6087507f459216356289d50645dcfb4b4ab03058d1ef8204617d038c33fb07c88d5700,599f82af4e62fb78f517a280eda583c38b68f4c7477c83b63adeebf00eacde72447ca28ef59c674f11b54b644ce38d06f4425502d78b184edae5bb0d8f745e4400,fc8b6b981c61335f23c62a7e9043d40d814aa26f5df023c5a4ba47d000a83c6e0d17cd928aa27b056a446f57ccd38a9fcda4d7fb7caf449cd248f4ae5649703101,2850d1b7c0cbf7b4975bd3f2deb8ae01bac986521d6899bf9af203c3c8e82d0b29c2483445a128ee1c2ac5acb694cba1ab9d6bbb5a395b5b738f39986f559f9600,9c034fea8407c80dbf2cc3ed7bbf74dc1ec8c4341dc3140b370d525a60258fc0091a7bba83a34d1ec292b39659d5e843c7908ec2491e8513569080df1a234e4300 +dd,f6df29f7095917f69ec85d852e8d65734f60dbe52cdc6beb42494a8e3aa51c20,7fa1e8c7361f9624266e0820b24c1b3fbdad62a9e6f6b4144f538e98762c083d25a021cb31ac53c411e165c0150acb176cfd32c6c483d94d3d1384ab053ee61b00,e92918dde725070c8af978f9b26b1a0af2388974b3fa3b9f5e91970e4a24357152920cc07f345105ae85b8d9e233708af2120997dc225e858b8e83471163b92700,479717edc5514922e7f3daca37a9e6d03f5fe529eb6089e4ab9741f5f35eb2427c8486962267820ede8443b57e528eda2a6e1ebe6a8c0facb32ea1f340550fc400,c44dc47079f208751bc9a35d53d6ac920522cc3079508a1af0a5e43098eca9a4454c6a67aa19df88f050b133dd72ab0da4f84a61b22b0f56be9a9b49c2b5ac5301,d3807125929a8c6c66a4efa58767751eb743ac7118ac7b1080a583e6d039c162695c88a41ba1b3a4e1849e8e83da55c8f4d7428e0f6c5c4b79395e69d7c7f04e00 +de,83ab2edc1bc3bdd350f64234d586c3ab7e9666a5d5d4d159d8ab8cc64a1c07fc,9c27f787ee92e80e7674f9bb7fbfb474a544d1f592fbc05fb4d3229ade4840f93d90d5008d324be3f3de6174abbe89463711dbe8c4734aec268547591388373d01,2d7a07c061d9d18ca11b369b6ab0478227257b862af55318614f06f331aa7eb95f62707778f3d88d81a362a50b3dbf0ae1e3bc04a9679661fdbb64cc0244d45c00,d10482a0b2b92287b2a8892582b823dc66c3fc24d8c5f5dea1f65d241285c55f7ae101cf1f56db89015fe79a6e19893cba589eb5ea12b6820e442a459545fc1101,78c47840f41412ac0c8e84e081c210ed019504e7c69843db1d6e4d1e54480abb5e122d366a7bee3b0c16c0949269ee5ec26a12f05124e41f765c93e78ca0418200,8dd81ef3a6691d6225a0048d220077d9b808e7f5da4d87ab439ce4a0945b5bdf21429392d9a7c6ca7059d7dfd66eaab0e88d8c27a492d0b3141be69eb9258e3b01 +df,1d43622dda312f6417133ba0f56ea2ac49d314fe5d76dc4244556c050babab16,8d9f1d3bef9687e6b833e52d7156340ffc9268d4d8764e2915a2b70a7cef914b39c0234d66ced4ecc4656879c2aa211d64fcdb18c6d8eeac7e0933659ad347db01,76d3820e9f51ea0c247de73c551b92df1d9ca448691ed103296e7211d25517f137df115a7bd25df56aa6b8b4160a1129c690a4f14e4f924fbe14f4b4ae9f161901,37cda4df7573290a31dbb1f31b93dad73818fc314f9aa2a9fb26867ad11c48c269d11e7d1c1d72af507b7a721e97505dff9674d2a37258c0f1dec61b93d5ee4600,d43ad7cfc2bc1774ecf2ac44c187e337e27276696c41704148d74220520e6a9f20ef80392943043c5be36f65459efff3867cda639769fc94f27fe361bb9050c801,1a07045a2696130e2f19c12b9e04a2d4059821f189fd64c8ae1dfa407418ee73658a3cf659341eb1d4450085ee8c1dbf926499ddf68dcce710e4417897b63e1b01 +e0,281fad515dd487c3172315c179f88d14955351fb6614489e745ea8a880353643,72dc6828298d3092747712dd3fee06dc8e6b433913c3454873f658d3461650702c9278e989af0e2ed3b287142434ad0cd975dc11b9c499f02e6bb483170767c101,8c8b1f39c984da5c8904a0af687c8e1f690b10a69c06c4b30cd552c60ed22d4974fa06b98a692a806ab0e7529491a4c8e0f05852b29674961b6e136df347e50d00,e9f975c1731c68f19e594d6dd68ddde09e9835609f6fdbfa9b0ecbbdf5836a69587df955f723a5b168cc61cb51e0d798a06b9f4f4735d1b82cf78402bbe83a6401,eabc2afff87a3574f06db851cfdfdf2c4108318e4df4a8ffc67e3f838b5d5b9b3413da4bda889fcb63ea3b02622bc5adceff64db9b53e41ea48b90c027b7b79100,8be0d6be52d30994139c57548086a6d6286f175db0c1da1b9ce47b5ae7508756324565327c53488918931dad6292937ab31b4ace55e9f949cdada0dbcf0dfdb800 +e1,ca9254b186442741f0c4418e46ef016a963a7189fcd8f290f2f6d4432cd9c1c4,f8ce5815e835ea9d080248c1785957462d8837b2bacb737804ff4185adbf59e707d5372dbce44e48c19f3168d5a646100e32f61d192d4404da20117ddcccea5b01,add3d5a15f08bdcba49667c118e81456a922ec678d7820191e6b4e9d8a6fbda5009bf30d1d32b4cb01da0e843ce15fb9a3edd5b28104288c101932fcbc495a6800,62d8343b1dc109bf4989e08973f36d5d7d65d4f2942822e6dca9857be7fe9eb97464ed24614e1a5128428c036b048ba3d9049420509e0fa1c022c15288508a8001,968f9506f1f9486dbf37243dd93d0767793e190c103738557af0b2fa93768c47285482cb7ff13d248e03fc8d44440b06c54ddcfd4579aa4697684ce83825915500,f8666de0ca0b54d9f869fe2bae7ac8c0ede5e7eeab80bf48f27ddad6aa7e18fd34c778ff783e80e005a4406bcbbd4f99db674f41b01e8cdfd4291065e1bfb44901 +e2,f2cf56a3807adc4358b6e03fe765e926fcef6c3431a22587b8a4dab38cc0f905,2b7cf822fe70b826409cc06ec10f375366ee74bf5908bcec7d0b8e61844c02527bf6070d1d7e71ced4a5f49588bec181213c9bffac00e2467e1d0781e4e48b8d00,fb3968536288fb8561380dd7ea1c7f6eb4517860e9d79947913d89cfa86f09a32981fc4edcf1f53ce65db6502444b73d8e8c69b843def65bc88305f3f2d5deda01,4ac691087ea6540afb145e22ea70269dd80e6781482a5c45295ac5dd1b642be8689a342bfcf177004376555af4e5ddaf3f5ac47b23c4e41061bc6647f3175db800,8d51e8d324cc82c4b4e0f4abe1f7c1dd1374e1d4661d4a69d2a65f6d83c2ecc21ea0d21e5717ab978f9b53b3c21a963253adaf793da12702d2129e998a2ab7df01,f04b876ff0322c7444f96db50df799c34b6a9dc6467913c908051b84cdd8fd6120b78780bf9d0f65a709c377bbe707dfd4ccf731de56e8cad800bbb6216d02f601 +e3,b4508e8dcca8e2e12eb8455af21351446337cbf0b4cbeeb6fec2a04b2787808f,b551fe05c1e1d7f4c164d2626b7cd7e42c73f550e6b0672817b88d77b3dc7f30420f9f19bcd6d7e7688576ae5c105c53a92d557889093d1e59e3c56ab46b7f8401,4e05926abd21a2678f364836da8d1bb06aca616df029326ed7047d14fa4541d3345e0ec2136910687a8f7365d170bbd5fb616ce30fa410a17709d9329abe9fc901,5060a299c91f95718c6ae0c4540bb98fc41069b0858c4156fc303fa596ced14a40d0bb48e2386c1b858c6eb0b662276969c7f47b80ceb3c9502a70ae801e979800,48c066250920ae38bdd3fd6d66df08980a0d4a284b94d10df0a80f68cb5993305d972b78557f701af95f7e3d2258c10397a46170d5c3d4fcbf601e83cf6a168b00,d20e146a672bccaa30ddd56127568165cae47fe0cd390f0b52037919188843c70de7012dc2572be4adf79bf19fe446b3bf872a9ecb389f801726a3d5cff011b400 +e4,20a9c8bc5a820446dc1644057612748e875fba2000ed6d285963f854cdf3b703,1d20c41c517d90cb114cf60097defefc44e2a9de58554213b768d2613de50b4f079bc9f0bebfe2668fc581df4ed3e5b983f9755e2b0e215041ed6bed9d37f19401,86faa924c556d8dbde6066fd2b55e2f07c5a42ba62ff9fccf5232c011ed4af371ebb188ee325277de85e4f1af51b8cc4c78034aafd8818bf98c1c0db5c0b274401,d48980b0a77db91f59a8e9d2764d68028b1fa7daf7dc5e6df57c3b848a52fa096bf19c88d6601125db9e8521a56411ec4adbe523a088ed2a1f1b3feebe43333f01,3f7e753c27f694f5b6ee2617824f3c38eea56d8345bf24da1658e4f947de2d7b7d8d753252e0deeaeb18820d5c20061480dfb8d3eba21dd6d85e0522a3b554d300,6346197b70c3a074a309e4e391431de0bed9de1497f02cb87b0a134db3a36e1b1ef0d838f7ba45962e14bd912ce386fed6334b4d812d6e995fb17c6d003c266b01 +e5,fa1eb496ad3d77625de5f3a0f6b2d69ce0b9b8c1fb2f92798025471048a46277,c5bbbea9db35fd6072c0be5ad59808e7ec0f6a8b793d32e47518629c645cef564ba2bbc08dcc32407417b50595e864791d738f350cdb7f83e4ab605f1833913201,3ad595774486199671792a0c04a14b0e34c1c8595a4859f887d04a35c9e29ffe730ae422308909e82419575d886fac48631a03407a1cca2406329b7a7cca683200,5cbd8dfba9c1162a2bc33eef6066be5ac9f4f3b1c5e29aa95f9202f6df4310ac48629a7f155baf797ec774ec622991d48b2722deb5f59bab6ec123638bf4d83701,6450b7ebc193dd671624e0a4d26572def241275398817621b838f74cd653fdad126c82d998d7089252b36558a4e97c6de51ef5250a302a84888a1fd8e3ffc3f701,98ffcf9bdaeefbb995aca011baa16ca31eac6fa7bcc0eff268229517f6f591fd112e762ab977e0e59b107c922e490b88f8389c330fe3c1cd5d3f0dd2836ff33900 +e6,d64b9af322a0e3926d5092732020bb8c83978bc65ae81d4ab4ef3f97f5242b5f,5a3ce2efbeba0600171ea1c1b7d4cd74ba9c555b8fc52d727c47dab463f4e13c09be5279770a0d83c50069d51619b08e5d03867f32bd40a37caa7f8717050a7d01,a82f084d6b442d11810c81d1c5855f63ee6508373bb42ddc8ee9b2da5f9bdb7957207c9048a425941da50333948d5e6693bbd7067d013777495f4852a67c452a00,4838bae9153bd6dfbaa91dacef36f5b11a63dcf12a77a3cb951d23eea01f672e187243d68d3d80acc3814bcc9a8a175fe82150aa6bed1bf5aa30edddd6a95acc00,251cf70cab923abb4f605aaed0bf3132a1eec1569e7dc7cad7f783f5ae7ebff3278e54c97ac3203ba2dd76a491984bb2c15ff1388c8d81aa47315bf11e60f48800,23687c6098489f431842c812e7c84ffc996456d850967a32c30adc97f22013cd7d632bb1a20af2770c2aa350ae1ad5a0b3a4a2ad67b184bab8bd188358b1fcd800 +e7,c05a935efc92f1a5e7908ddbe18de28e5f8de4ec0fe4e02dab86948622ac47a9,45182f651f02e44d7e262d4793f7146208fc3b4ed39f9bbc54f3881ac622ce6a061c2fc73dbc0591a522f2261983a67965a56251efb92c9e7026fe2e93339c8501,5525bfcad73aa530f38abf13268c4f0d07ef311fe6bf34250c1134ee9084fa12288a36ad6c4f563d52c2b1b48785bdc82a817f45188f89226357fd1268eeae5f00,787d32633a4725b9d3e1befd1f143fa9c09f4a964986a25d04015592bd5dcfe14668468de7972078900a3c9c10e792b26625cce71b9398183d278667c1ff738600,5ebaabc7a99cc6a98cd9f8424be9777066ffdfdcc80d312f750f2ee6e953c3ba19bfaa04f60b07916519b1e68d8adfae2159ebbd06cf28a4e14d9e1d806cac7f00,b9fcb115b24830ccee4114d45f131ec7810b69b998c1c85c32c1c2fb22328423519379105d09cf518cf567831bbb6e0bcc118a75f13ecbd04b17bf38328d189400 +e8,a35051f6ec6f8232304bb18cc3bb5576620ec7b383c8c08920df911e57a4dbe8,aea46ce42efce6d113507f2860b3a2fda9799fa50dc94e74f35c2683fea30e231e4dfe054956a465db07f7c8db6b5fe65d2be604db548410252c3d94a3ff9af701,2be35c4366d251fbae507cd0e11c0cba5eb1e5ee6c1ef935527425fd33306f334998407d9122ac0b0c8c839c862281d5429712fb6523ab9f6ea9efba77226ee000,1df3cc8e0b76d0df0304dceb76ef4062dd85935a121ce93cfc714b60179ab1375e176380502598f3b4545ae2327fdee3d6f1525a7e015af443487653780f3b7d01,32379abfbb92396ded82c2edb077c0c53460fc302bc5c3ada7fd6a252eb63293373ab3d61f43a43b1c3475116ad9ab3c39fb0955d4796279a769804957726f4201,201cd91300efd81e87e908457a8cb995b21be8a8c97ae5ee021d1759d20627b26258a8106e6fda95485a9e132d36a391d506950487bce3d6649eee32a961d3a600 +e9,04af6f54889c0a704c3e36d82764d21633cb2373b10f4168b189bef5597c7865,aa5490fb58d6a09d954ef2d71bf3d00fb63e6ad6ef94feac93ab79f1c6a3bfbf1560dfa3a9fc8839cd9ce79f5ce28781f52df0f11a9dc626eadb85fa55f014f701,c42630c7e241ffee25bc547c4ef71365eeebcae6dc3f6cdb92386d8096a7e14a0f1e5196c201671259c8822b4f6709b6f618eafa6dbb3c73d1735b0a15acb44000,c66d910b2e80ff917053d5c1d5fe44b45ab448e4b7f73f803801539a1c0154994a6cb045dd10a6d7d31575c35bc4538aefca8e4eebcb7c6ec462f237a6f3532401,099f22c62e043a6b6ce734fabba22edbcf6df3d3d07bf6227e268e14a9c5909a3b86087a99554a8064bc1c68b7cb90e54e708381ea9fff96a3fa05d9413173cf00,8c73abf96bd5c48350a526667200ab5ad7b29d6a0e6b2947f22a7873a6f641623e07c5d8026b77ebbbb7037e3fa1e8c80cbc6f3eb2412dde7d89b798f2f1332a00 +ea,1e9ec0d7ed22c302b7e7c393cbe495f7bbb1f5ed54dc5b152ba5b17da002f7d0,198ee4a99105e9021901ada4235fff51e88c4830be86d017536d29aa4e53d1770f6e464986615d43dfb0b10e444e906c0bf79ec077350384f6406b05fea4429200,6877f933a114e95356ab1f9e9d934fd24997cdf11acb45ab6a247b6923d3aa8d18838fcd629cf8f819c0df2c41d22c669e98ec5911426bba346b7db50d67fbe901,b64251fac06cdd531ac557282823e2d3a00f3decf85ae2539266c7c191efe3961030bff5313425415cfa306879bf742c953b450e2bec7cc68afd52b244e3582001,1827de5471e251cadae2891f62c25677c7a049def9cc20b10536c299e08c2f251896783e64c829bb7f52dcf606425b2e0a9ee7ffdc72832b1f2c0e72b27a9b9b01,842750af7e188a444e756a44ff3a07c367b224a67eac960fc5907ca0d9b55bb244849911c9bc26cfe8262f7e6215e74d34c808725a45eb9eebf0f31da77e213400 +eb,c7d4c6b9905d1bf56e2af6658b099b5f9b1fb1aa7b63b33857ef29cdb38d46cf,8e395b4a9c163f2d708a26dd456cb554acbbc9fe0b919c05e9aea724131512dc4d84bcd346399bd9f3e9029cbafda2d293613242678a2936942c828d2f819afc01,4993523ef642a526b6cea760a9025352dd6c6da85895b62a0898a615ce5454e352d008cd1a5841df381fb5a8251976d9d45c3b298065bb47fb52d4fea38298d901,e1e2c0f23c8e2be8dfa1613bc586372f1e89aa752995711e0d2ead22a4367579608ec6a7e4e5d63d86ded18fb46aeeb5282fd7b71c725fdb5b7ddb868a1c2fd900,536957d5e4cffa096883d951ad657cd2c5f15959591553367f9d1ace8a6c40c276d92d695f24155ab112a646d2fe1c6248dbbf6aaaf9a3d64215eb5ba010ba7e01,32912fd29338592197d368a04b083e5b18a068cd269433d0eda05e533f4af9e4744ab194ca4fd38f56b75298d3d9a3ae8db2943ff2a2f31c558f2b014091106500 +ec,2b54ba9e7d5a6b9dbca46d2b8f51a3df1ce0bfa809a6a0ca505292ddd1c4d9d1,0c6d3613ce1599b1cbda8054ca66903be78cbb8afcc7203197868c3c809fb41804c9151c75d9e92e034733f83e2e022dbcf784f8e17347067515be24d1aa1c1801,cf70e33725e89923ff740ec2269ca5a117b1b7f4692db09cdb617d15e82fcb7c7a0782cc417a7568553eb0b0632102088ce8904410abc3bd77065672eb120f8801,83ef3bcf8477803ace53a08b209f010449e4fe208defa8425fec7e4ec0e72bd32549a07acc81891543fbfdff5d095c29aa562fb7e22830ed2f9f192ddd4b2fae01,2d26f66c3b152f5f6070a65be45420372f5614194021c27fc181cfacbf4f8a55779e45e54853349f7d743d5257e0d739605ca5955298391ec6c39ddf905f922d01,8a4bdf5cc3c7670355bd59a29bd9dd608d17fd3215957fff406b66bfecf072aa1685038608d209f9b6e69e5eeb86539130b22c7ca60cf96a266a4d8a988390f301 +ed,504a17d29a3f582a700b2a60db7ce60dd59005d281f07cb0e8454f324eec0812,8b2c25004a47f6cbcfbc3c4585f344baac1387ededc67e9556d112d69a2886b4642a2b24423d0e504b79817774cdb134f4448b2834d5d990b563cd7ecf4a92bd01,68831aa1b32b3684b5b5f362c22fa775f7f7e5cfc68a95464bf1e26558589a5777de93f23bfb06eb2664ce0f9ec27cffedf35108812a2d1a23b3eabaf292c4e401,b9db32713a8d129b2d2d81b90cfed7d6d4cc863a174e32aa0cf39ba512c8876015d1bb306f9259c15281a20e54e19f9c499fc2c410d8e7dc696790dd66f9fddf00,973ea21560ea1be922daa02a0bffbae68f837a0d5fe7db2e40b7c004b752bf5a2ce706a59fe864010e1f182924f9b83bebc31cf07b93e061ba204036881c4c8301,cdf915cd29c5f0222667f17c2dcf2b5d14882cf1b910a974526c18dbed1ef3b9336683a4c893db4b5f7cc7c5e8f66d9762aa17e69f296c268711c2ccb885112a01 +ee,b43bfdc62a56efce6194925ebdf57efa4ae3bc2411cd9da27501ac03e72129ac,2343f7aaf9e61856c3d4a8bc18977a7251fd628a5694dc34e44f01910f46c13a38c1e5db8d43093066015894ef5beee1a49717d893e75319cb73d826244c5e2201,cb808b1e6f743554ee254ec23582fc1ca25072d49741677ee76e3f6634182a9346f14548018b8a2b6ebb4e1c16f7e864086ec8b5bc1fa70236b46c420def7bad01,aeb230147fd3b1f41ed03a5a20bf8ca03687ebddf63cce429748897ef9fb1c66128a65a48f9267504a7019c52746296ec5bce0322f5408925196a6b5c8385da900,37b35a9882d3f8ab6b1f3429ce2527be97591674fa8459db51073a869a0fb7e974f6a192cbfd366352d1dae3c5f3dbac74c98ce2f65cca6ddc0959f236c216d101,2dcad9064bef26c92432f23b6bdcc4911f06071a5eb547909291e0395832c4800991c671ede40e327b13187af558b8d9be9e3b08cdcd1a670b88b95dd678208801 +ef,577ca995a82247477179d70b6ee1172331de5bca940a98aae8254bf862e86d1c,c2332a6c49be9025ce6ca007675f89fdbcb57708e4b70185c6bc7b55518e3a0967fb5a1c78c2eb4a873c7feec52211dcad07e325ee97e5d472acdd6fcd12fe5301,2bc191a287b974eac3ba1a23c12c39b2b63438f2ef3ffaf5ba858c49edaec163401248a0e444e169625fc921da73661bb159ac6dc6d99dfe639a98405395260900,33f686a342abd728b2a4f9761e6a1e6c91241ec0be959803b1fc24c186b8c2827b63ef49c821ddfef472b377ac1272af9fd49d9c968d59ec1820f429cc8cabc301,f96370353334006adfa0ee6049ac436439a901410c476e2ce479e0c2d6953dd72d64b04c46763603e04bb390274759f00cabf42c6ce66582ceb9115085f03c5700,74fb85ffad87bfe601d306e850f4e577888eb7484716f8f5e0eba2edf40d395c363ab4de525cd93d759faa010a7800b0406302f522d9f03d6b8bbd4d4500f64900 +f0,9c33f4d63d511c959ede766c2c284549d5de2520bf2423bda66453c575421e74,24aa7d2a0e489f80904cbf74bff9227a8ce9bd7da8a335dbb79a863fc5888d17269b7bf135af4e9c560688be46afd563136226f86fafcb0e78ea7e3ff242b79d00,b5734471e0b717c0ab30eb4bd5742a15fed94ce5bf0512b621eba79aa314d9c918d89cd0c35ee7fa4a55c871974aac79e060b929cf95c24a231ae757f3e2bdde00,f0e5562c75754a500b2773a1ce3a5401ddec46516479cff6343183427f50b1246bb840f6470c00c38cf5cf05eb90b28aebe4f837e941337ac610b121e23fe74901,69ea5f0cffb195d1083db594410c2eedbcab22e2c33cb208991eda89eb29c07d428d0d23fe74bbed1534aecba87e73f398e1b3739ca50b9e37a175cbd5ed3dac01,ab1b82a759a19d3d1c3470493ef2cee1458a473d8e5c62d5d6590b3ebb3c514a7c22e77e714ec6cd605e8e43b3a05ce828a36d08e2a17e49554dfff9e00bbca001 +f1,4ae4809f8e64d1d4e29d86d7bfd1fc27c00fb4a99dcc8307ddd3b709ce972e3a,509b116b3f1eb016bb73ff26cc89ee367d4ced925c913faffd2db7fa4eafd41c617e5113ef8e2bdd594aa7250d347d9f551760b0da1cfd94d2f5172b0dd22dd000,eac773ba7cb480758fb23a8c0fc27ec9080c881d509d7dc2ad3e5f46c2122daf606b461d648edddc2c5f2c646c5b657ec8b35804e1f39f950547b8cd51a0171700,d576897d53ee453520e085bd7d708e34694a4a55ff4c9734ab7dc9d1d1fb6d0c34b51beea57c8d270c4bdf1e4f8236f3efe961b6c04608adc6519723e847c68800,f9442bc8e58df6273bb52aabf14b5a687cf47ade0fa68d2b37d0bed267561c926dc4f12c47634a450a688734bd8333fe80a2f6b6c2c5841621af51f54b2a680e00,09c9ac34a0279c8173909ccaaaff537d0dac3b7376267317f954ba22965b195d6a448703c7e63d2b3ec3e91a510938f62c7120669e703917127841bd5758151b00 +f2,1047a02601670a4d39af598206278119e6fdaeb5ff57bb845a9ab43fa20d643c,362ff3afa7c80d7f71ead18fa3fca412ccfc79a10196a8ad5ac9d55e1f74b21c0fdfc3bc37ec6ee0827bbcb56bea93bdd8b14e6eb095695626dfe9fcc53af97400,d67c231e7e01d6984f9670b7cce913c598fc76674feea387de7f3ab8eabee6761a67e754ce7c54b955ac0b7f170272b7ab9aed3a097602434849f28b344320d901,1324bb30341256a4f7e1e3149e8707f56aff44579cfbec98ecbfabb0bba4d96640b482b112ed1178c17e35b77eddef182b3fe50060a67cff92c1249a798ad04a00,25f1d0d46ba54a5dac19540f2866d34c5cf26de9cc32d7844378e3cdcb7e3e866a0bfa70db79cdc2df741ec429f46a60d5749f805e7defa29430f22b83366da200,fbfd4eeb7515b1af778e6e44862832749cdea2c7f324e70936b54247002ef301634d5e50c77ae81edf9aaf091c43866d43a947a581a8bbfb140716cbc7386e2500 +f3,db38ca35e882b9d7191e77ce3907fddf54885f50d767a5c7b2062eaef7f9c7e3,6220866c8849717dffa7e2bb6fa59108934499343eabbcf7d3a08a698309c2566a2cd39bc6b2cf6d99b7511bb324da246eb110ef1ac8b53a360f2518d4644d9500,b10a3e24b813a1ba44852c86069e60367d72e642c286a628bb34ab421b5759ed6b09636c85622f11f0aaffe19afa9bff6abd6acbaa8f182fe8c15bce41d8456901,24f2d93d0fcd8a53219cc8733972272834a18249f651a6647792f56010d038096a456dbff694a213408a82117cea4c6ca7f08696d5c6d068a2ba34baaf4a0d9701,58654a7d2a67e1e74d4f4aa2c78062bdfb05cbc6f10d193ccecea00fa24258ca6c9a8d61781a3665c496ee39b460bcda2d8cac70b2e0ba018dcac45f4ff79d3d01,811b4899d4c3ef729b80ba59b61a7f79460fc3b3dd6598d8accfe19c10f254f919a554ede8abbb83860ac3fe030084cf3922922d503a943156e926d83e4677d201 +f4,f2ae3888349d2ab97298a737d349f8574fccb89adc9260c6e8ad3659fddf28f2,efd2bdb716489d7830bc69c6245ce19041c11e7b6324d2235fdf1a41d3b62b4b1a4b5fcd65220bee111336f2b44adf0400f4cd76a327bf5893bb9a7b8dc6562501,223abb52ea1a0a920e39a587b11380761230fa78d4e12b2bd76f00b23e2f0b204c2b7c3f51ed0f850ef09ced29a998652cb2de36b108e27600809a2727c4449900,a799f94f4ace285915f8400d9503f161f738e0c6272ad74d1c4a4d6452c741b8421cbbe5fade5d432a20a782cf3707133367f1a8dd60edad45051555c4feec8300,85a1bd777d2fec6b67371119bf1002ba5eb4f9dfd245b98738efc4ee32d2ebb149a5893a9236920d930ce0335954f42319c16cecaf89ee6556bcc11d1a8ef56901,22c52c5e198f3eb4fe70729b1a07c3eedcf16c36539e7cddc56f53cc3d3b84704f44a13a5566b8fb7bd013c8a940c90b6d0aa65ed264f610deeb192752ab1de901 +f5,3ae3c5f2563de4c3abc00586cda492ab160a0c7d77f488c2c7e464186c0d18ba,ca1227c06e1147422f59623a713530b240b5e57f34d547d50c82181d3c3f53b536b66f73ed6bcb0ce9c92b4fa0c62fd8e3a700061a91492451be96e029f3875b00,62f8eb49744c8fba0d7dfe1c22c5bcda3a333750f5b452209cf133174c12e7c52a4fd403fdd264cc890e9b47c379d4715117d5196cfbe601549e02a3a0c27e6e00,50fab496fc99475337abca49937d884c4c0f51ad8ffa6909d4a0240a45cd73845eacf7b35ffcdec3bbbda24e5b8afc9bd8484a416d18b452635a12b6cbc7c87201,97a61d23a415952c5116c86b87a9b55dbe57447ab148a90a5d5162f018b705070002310f0a3c929acde7ff6d5931b0bfb4b5cb3afe8e8e5377b5d2a1b200914401,62ca0b773dc0fceedc196ef1369b41e9e8c06fa95ce130d8682c45e4993da9c517f07b44f4a5fad66e3242a2f9372f474529039ffa7add396bbf2cfffe21908f01 +f6,a45534f768f60d81943a7a1ee922b82fc9e0a03aa923fd9efe3c7ebadd9c4d3e,e13dc9f4f23bb7009cefa23ee1583b7a01d1c4acfb189cfdf3015312980f6589385516b09254cfb4af5292aaf735f45624c9f7a05a11a4379c61c56a2c72852800,5c72bf985eaa74dbc721f54a78c9b86f2f974ca486cf49f2ef88da4f21b77cae73ef5a5d1d4bcd5243b8fa97f5f63920abb082eb342c2840632106e2216e339d01,167d2f36568e61c9ccbc22d7605b348694fbb440c7c9ddfd7236ecb224ad508e710024dad83a044996d46a147a191c6923663fd46aa311e911855ece41f6609201,c7b18931cba0c6f88ef05a9d56de70c19eb7d424560ac8b4c7692e4eb3c1c0dc71e84549cbb619377939858408089ee2a962d8480514f38e5646e1feb73494e301,e8204985bb09678fe391d9f739674c0b812b06e7032d9826c93dad650fad93ff71c622e551158295e380ad74f47fd17f91ef79c3314dd7fda6fd4e1a4ed5e62101 +f7,de3b32e3efdf923d0f778523caec7ffd445a05eedcbfc24dc500a451963b6a57,5b01e0027c6a25d1e49e635f356ba03ec024d59a2ecaeef2a156b0df28feb9b50995f1fc4e64431d30c522ea0382aa31c374ebaccd90953d5944a6eeef79bb1e01,e35e135a3a4dad7b535a01ea581baf470f675977397e38352b9204531290266a49d3256771f283454eee270718a86edcb53764e58da498d5807177289340d9f500,12eee5d05045f4253fc08cb66f702d06d98dfbe4ad79f07c90f753a2d59bfc9f26f8660c4ae0ada4dab0ead6b4a8143cb44399479ed19dc2ef2e2472e0d23bb300,f3ba7874fc8cd5b71caf0bdad09c42b41ed0802f18d0838f83f9e21f5deff864588dfe6604eb6f9d3466289deb565c4c73c6675cbffe0c21206d15db1ec0437900,dfa9d0ba48a0171538104f6b25ebe37399d729308633c03e0393d83c043f8a955676ba460c60bcc5c0470675ea0e35bd26eb09d8cee9acdc3755ecdac526cb6101 +f8,7facae8c93ab1a26f0b118ade2fa31dcdecd835e9bd6e4f47e47648f1dc196fd,6495d3d00be8d01b3632e7d3b4f8134ed38399d71ce90c8d4b4e9ee0b8b69a341e03f353f235bd9981bcd656534d30913a6bae167d44df9f4129afe29171a75501,6391bc31b462929f4c7e5a6d9b47131a07f1c8baebd8918d93de7059e4199798391a8e0d52d03e4d1bae59c9580023dcb431e5f9a6d8a29a62a3385f90de9e3201,561ae2651552d87790e3652a891024caf11872cfdf6f52d49a8ad3a73446175d73a90702b93665e74c6e319bd0048f8138678ab70326282ce3aaf7b4ef5ec5a301,d37ceb9b29b0554ebe2d3796daafc6750ce7ec24fd5c91658719fff94c30146d3e264baf988dbfbef651dd67b57fb63cfa653a5ad02b97519bf1600f0c26709601,8c42726474af9a65960ee497748dc0ff79d79bf57370d990afe8272870d57e4b2d73a47d2b4df8f2e6aa78b59a67b7f42a8786318e7d3bc167976f13504cf5e400 +f9,d0683740a3cbb35eea8e80cacdc66a49ed8a927765e362eef26adf4c4f07ee19,cccfa48612b8abe8f17122596dde054f6cf6b925312c6c17340aec520cd07f267f05c3a462832deaadea19bbb3578ae901bb11db43ba3696fce1f62c095410cc00,de76da497e96cc33a49614e070fb09b4408dfc8979254ba1b95c1ea9c5b5abc863a1db40c8f72a53d407033f325e8662fc22a809fd2ad063e62162e45dd3a98801,14bf421d3e83ff7cb6044ab495a9d7f0bdd268e0818fe5250dc96ab6435740f7734fdc178f61cca0be93eb174882fbbc44542af8154f4ced81ddce2c1ea53b1800,7ba4ed15f91cb9ddf961e69c20b62944ee656f20659b5bec53ccdc4055744dfe0f98651e87fccaec751196eab3792a06f880401481aaf7d7e689d110857d317401,7ef03d7f515c89f220c5074331fd4e8c502d5bc8a617930bd1536b3fe2d129545e6d38185f0dec5c43dc1fe33ee6d5aaaa36c6393a81d443293c3209b16a5c0101 +fa,ba01fb0454ca986aa25c55aa71f3eae3f3ac048ff745a48e35a9a15126d8173d,2f3d8975da432f6c374e40bbd264ff6bafb679d95c2b51dac8b1f63240ad275e08e08b43e39f4d2b09634e74200dd1c94f09c0c493b357d5b231bb60221b03c501,d416205ad1bcbc256a00e795be121f95cc7bb0cd563a9f84ed9f4aa6c730387e6a11090645df035e3f749a1ab96c6f7f4a2c3391b8d6bd4dd1d84dc5355dd51700,85e4d2daf751e81397e49ee623b466e9ce025eff77ca1943e0f1856a29e8549a52c655dddbd623af36e35cc0486083beb787b32af991a0ed27f590c63eb3091a00,c55fa00a04c94028442a18ed5ed7847279f527521fa88e9110ca8f1906b24762113a4db073e92cb23839d2cd8ff72f95a0ee7d2a10d1f2c43548374231128f2c01,12e83a2e556acdbe9109a3b8027490a4aa480902fc280dac192593af30f92e385f83941770aabfa4489d0b243428d6f508ef17c85ccc303ebb9a6b8db5a7cb8d00 +fb,ee173413bf276d46d52adad877421915818b35e1c150665a5c730e07096dcb4c,acb323e01ee262a7d78d559ecc88be9b9df2d9d80496f33364a266cfe5e64713686cbed11f383f900f699c7be19ca35c31e38dbf99395901169947e73e82941f00,8015a27e369c4216ffd29a9ea3be4480aa23e3de593db93fad966099ebccb1542af9f3f1fb8e2395748d3cc9bda9db567bbc13fe6bb4437439d5c18be765499201,4e277af5dc295bfe9d2b11e1206d8bc5f4d670dced17f357207054c5540152583632781e24ca3c4abcbc5d3d2074da3f73ecd26ac45338bb8f631624c21cdf8201,f32ab3fedad9443a7af4be56d71942326c77e6db094d35a98483ec73989d785957dcb972f9938f0618439c8cba23f9c08c41ecd6daa033491aa5a2a5b6dc780c00,678da52ec68800b25bbdbf2c4f9cc9663a3f30629c57b653e2d431716886f213582fafd4b8227aa7023c2f002ef4030d9407ca7a885dc13075adcced425be90f00 +fc,159ed86a8e4a2aac32c818b14a023756b0c5d16afa34781e21acb93c47c03ede,c1d4272c019ad9164c182cd86ed0559bc2c2ce24f9dc5ef81b55c685c51128dd79947fe87c49c907cac2453a061f2e028a8d03a81a56acf4235b4a52f066b8a000,324141f22075a631148909ce5f31753a11370b96d65e718ebdd3fded2acde82a12896a2209ce95f2962e4013632351ee7fc808d946a71f072a6d265fcad3dd4a01,9a2d78d252c76b9656137dc7c04f19de2c851b8106dc60e9056543f56bb55aaa55b8185190380e7f8c4a855a68926c7de978be24f04b00ee4f4cae3bf316c84301,d324f6b45cf3768f1245e46f7646cd9b00ac55559385d0c42a679d9788e8bd5f4daca2df90729e7b5bb493defa8b7ba8b642dcf215b2aa08504fa2e5640574bd00,80f12f23fadf0e7026649c7faa5bf2d6bd49588a5ebbc928ccca7d78ce77454e475dde30e5790546ce9563ba55a5a6dc76c2578cf5999ebed77d5ff12a36c1cc00 +fd,4a6bf92adabd5e48ee6550c334a9ec6f199b83811fcb362963263de10b54e885,feedb20dcc3a80674ac155f6a7f216fd566573840cc0de1c94760a5b368138c1396b699ce71d157f1e1b06c359cad037eda3c08691e83dcaed7634ce10423c8e00,dbea3f32a6709e8f06f8b510ed2030d407699ac67888f28c50ddb6090ef9b46e06fc8174472fd87a58e10b0d82b1f7776bc0b7ea69092280cb47bd6df710450701,4c09704471cf1567b0a055d3c889c23fefa254e7a3f5367437d530d400e2fc0f76485af6747f7a2d09ed4367cbcceb06e46d10b8a70836a0e9910ea29667c0e101,2a1962d7f7bea4f26cab9bd004c02f288243fb0b2e620d43770dde09ccc99e356d311a63e84f7cb8399cd157c699f907b91d75e4c8e32737b83ba0fdcef9c2c600,9fafe27ed5690288dd1db9d66b8b88c3a4f83db3b191f770e86be5a20aa8aa504aa1440524852bb5c564e3e65c9b8329ba3e92cb9a1d07ef22299d350356bcd700 +fe,2bd425abfb08a38c53b16cf60fdf82f98b02db3c40a729b2d544e6665aaaa7e3,4b8f4f6817c767a040056a103de2796a213d50e0d09c0ed2032b0df0c76b1acd05fcf5a1e551b5a11d480ca4de7114928279b5ef920ab879341f1e01901e8d2f01,b9e71f5e08f093b0abe631bdd6366bb56b9caeebb9b7c0f2e7b50b77dfd612713b0854d83b4f9a989598c836a10b0ff6da82f0e3ef94f6dbefee36595994986c01,eab58db0a63bba7a28596fa31e92dbfe52d57e40e7e74072427c9eaa89d996a249be85e9559194b43ac1166ed5ed130986cc12f5258e6be612701de0b7ee453f00,defb2a47c6a91dcb92af6f7a85b5ac6b7c8463d7fa9e819d8d7861aef2ed95dc186d4fc72bffafc9a1db71c03d4a3287918ac2691432c6c02544a6f6229c766600,100989087fcd6348d614986a439ffe3b6e7f4bff5e736dae6db0a090e37574ab70ba2ce0484344cbd6353e0a21974fa841b9dd4bbf89aec87b90185bf7ed940a00 +ff,f38e21738fd5b58230f61a0718ee3aec59357670170812802cc2d62212b76328,4ad5e0c9c6e04e2dbcaa2492e6b073c58e9cd42c72b44d80a92453a41ce860727d3520ce5e5944a93eb91273e6b127495fb3e79f854e72a73d1615b77156b1f100,01e9157716d038864747fdf278f63be84c44621a0ce388dc55932e5474b6213f6f6d7720ab81cb23fcc2691ca98fde886d497254755b6444d5c14a017849fc7d00,894e4c96f2af089616b8f0acc27a874583af29d9269ac966e999c3b6017a622865ae9bc45bc052f3d54b61eabe4bb60b2d4d732131d42db1f2a82cb934f7584f01,0536cf9562f9afda2fd6ae14c1e31b77492a1508ce3bdbae699f410930937541582bae4a5e659dc84a827fca5d970ace52fed86f2f9f8e96b18fa309a042520c01,212bfdf615ab9925cdc0680d93971af6f6e2684b68c432e22352154eae0e573a5c1163adf5a4fcd2426b0409db5cbd7f5824febccc3a2d1805bfa1ec37d3acdf01 +0fd1,3a6b60a306fabdf48d7d279d489d517bc742b6ebb39e2edfc098519743773c42,dac6fa33060b3d378c43eea3ab7cd6ceac2321923434ad4bd178515b4f4cb66409018bda5b1edfe03677ae8f3740b1837a86e14fc0a2be4bde0f24d70f8f847d00,5114735b5c58d2439d2dcfc37058665e6a904312f4ae91a186e9bb64908f42fc13d25cb9e33a2d0ef4bfcf093a4d2dbecc1d63908242d535fb5bb269ab4e459601,acd0bd93a6ec1854908ba679fa6ac8b78861b550749d8fc40f4d8deac9f7574c191cb6aad121fe36a92ce0d7cc74cc9f0df9e09e7499b8c493a7168f9d99976c00,3351a3878311e5daf00ebe54dd314ce0621ba4a548c955237f94a43388b3c2e246710e5e2ff091e8ac8920e9e62b45cc31c7ab4da0e7526d68e88fcad21458e300,af2edc60c757edc11ff38bd2db74edcc85c18257788f42b0e920c82745f01251655f63cbaba082fce992c4be93e093bcfe63482f0a582f5ec0fae9bf01c50fa800 +ed26,51c5db8b695a0c1a024804bceda01c48ec9b0f9207b1bb7e6ea44cb37164769c,b97e2bdea0b7f5c1ea4e94378695a58674fdfb6b334f1b57887d801fe01a0c90051223a8c27253a3c65d9025fe292870fe1f605c9717297a8473cee0ca1acbdf01,00735c349e14b89c62cc5b5c54475872d6e77eaeabaf44f06d3a0baeeb8bd87c50b04d14b4b3f9f08f56bec45bc7b6ea6d9af1136f97212e261cc02dc4e4c42800,d4547160f25b6fb5378794bc360dd562a9477953443776a242b864079fe23e2134d354989a8c0cdd3a6d1e6a2fbc152c718c65bc750b85632607990e9d6a478900,2dda2f02f8aff06b9c90db00ca7d73279afd79fc989b11a0e676297f2a78a0ea28eec7b9b9248c7b7f71c8b27cf7497a7f2ec1261e28e2d59e1fdd3831b20cd800,6dfa81cdf6a734d299d9eb90c5c3c20d1d016b0af25e61b51f425be5a8bece0304b663f77bf1f541d7b0adf6ee3fec9b42384504fb17494231d276dac01ac68c00 +a63c,97f06a6fc728c661c1e6e951acea13b2fcfc91cc6f319e9bc76b865a94d86e81,4801426907535fe674f6b9919b38e2e06690f33620d438823c32cf5fb7425cee398ddbd28ce8f411b7d07bba3afe8f22a260662c4007a39496dbd61ee32de6c901,d8a35fa7950fe967d286099c8cf499a97945ba8baf5262f2495b9bebdecc05bf3b5715268a2290837b567764cbd5043ce2552b514c66e70a123b10b16d23927a01,436f8fdd10ab6d8ea7fb31a8b035623a63cc4b088887a8c798c9135afb756aa673f17a36df76dcacd3ea31dcf9d1fa9aa5ac19cff4f64ac7fa866a6abda38b5b00,b8220f4427ff1fc1849aa024a57f9180b5136d92768299fcc65e8154e8191caa269a8cd1e4726d76e42555563337b413867f5eed411ec4245d57201ed62cf3e301,261ec8c3a1c2290b390681499977a5e264b8d0e3e6b2416b37861a4a43ac931d7a0a6aa43481e39ee0671e0c0a26cf64fd99f6e48a66d347c822f7efa4f1e7de01 +c65f,b429426c80a773f357ff926bb460b23c49b5c2b8bbf6b3b61f5df8416f1ff99c,8f3e55fc82894b34c0cd00b3d4a4755d37e19be884ddb18fc52f874cedc3b0910dd9d7cc9af729a5c4c0a4908ab5651349138ac3bab038efff3fbeb2da3366dc00,4123e6213ca720b27f03206aae0a0b095f00fdb77d240eaa6005539c8d3a81393f8ff5e981eabf9d642b2c8d3774835c670807f351104d77dfd32c08bdbaa75a01,6046a98c6c381c3ad79dfb1223a48d218b1e47b34fc746b8f8a1e351bdd29f732693e61e84c574ed13565e8ee5b0114c4ba129b553f3aa1c7d4a750061ae42fe00,74be212865b01afda529301de9f0079fb2a9a552658e66b2d3bc208f77a79a13684edf27298d0aa9622df225bddfe58d6844e23a821b4f6c5b99836025f2011e00,c2c04c932607aaf5061531dd3c71bd82ece885b6558d68873622a09ebbb725bf24fa83867b55d5da266257f87099db756855ccdf4ba1c5c8bc23e93ba535acf000 +2bc5,6cfa153be8b6fed2c4306503b8dc13056f71c1a1d9fb6cb4a277b86f8e33a443,8cad33bf241147310631757cfa51556ff4f749767c18666c7ec68e72b5a95e753baf18e7a208812864e14e3ae6f885faf2b790883b09e6ee7160f520205c39ee00,e493af5983a82fb91ab8ed1f34cf54acfd4a923cfcb0f2ee5d31b48a31d21be831e592bc1ea17c0643f7c8ee963f1a3e3a2ca91bc1a2f456149b570577738eba01,1bf90a4d3b89d8c622419ee7aad7129e2e0edb545b7dd7f3bd9f48a1449f343f770dee49e81a26dfb418b7235ee61df5314237b4d5d817aeb378d8d0ae4d1c0800,f9be0a56346cfb790f1bb03e38354a6e98771e0f07bfaacfded705db88052eb86b493c6cad5a040ed6c51ffd5b4c36d2abec807f13ccc217761424ddc2378d7b01,6bcc018bdda67ddb27a638e5fd66c68ae2a6ad2cf5eafc9fa55a7dc9c20d860c30afdacf37e5f29f96ef8df463287a185541c1718efa71f710b22f513962284901 +a0da,76dd4e30c26e27c39a4145b4b759008e195db837fa70c66d1846bbd8b60c75b4,a3602e44202b1b3a9d206b8c58cbf0e398e77ebb568ceb4a0e9b3908eeca49fb4980fc3327bad26600b70d8eea42c276c057c075c9acaa480ae290bf3733fda000,1a14ecc9e37a6c618bd6c5871799681088de75414e190aedf20dba27b94425341f6d466354b3c7aed54f851cb0ff19cf32b5216c1a8e203463f85d75028ba3bd00,0cfb0afadc0deeeda663249c547566c49e1c1381c563f2423ab79477ada49c0f0fd6ea5fb40f78c43cdf20e3b010887d71d4ecefd98a6cf80160c1109d96c4aa00,0930540ea89c1a8455355bc04a8842987eca6eac5e90fc40b074e20a90b00eb02661f06aaea52b7e129ded1f8bfd7fe3a5ef55900816b63c4d93c76e6452260300,5ab0ee93a84a970c15b1e694f46ddf13459fea795fb907a74b4bf16e70e900c81ee933a17d80a898b36caf164e1beaed22b58726e903532f04e88689e4675d0801 +d937,de67e1ea32f947d9dbfd04822491c12e87c5ce34bc2a9ee3d7f05a4b43309e98,04618533d19b5a72aeaf085dfe0e13409f3e4c0e1a72642a3eac8071693b94672c8544809529853d81933faa2389035c5ae48ecafedaff50313b0bca1669b76600,1f81e46cc95d89cb80ebd92f6036f9661f7ab67d34a4b8ba3d4aeefeb827d5934fd73d04c98d92af83593cd06086f5a9158b261d12e33f3fddf9563906feaff700,64007aaa20b649f5d4e288f55abb6c005b64554d7358de9badc2ed2b4eedcaa36fe8b6abcdc8556b33470b124a99e0b95f63c8ab5f724b1f8c9dd7c0390b110901,e4ee12f992369f4a4841a19baf9d14bd61c745cb8eb6eed568d19cff89dac9ef28e413623689243aa43cc5b271ce89bee77ccd79de4deeac0ccf43d7b1bbe73600,a39b2ba45b6cf900b865846bb43cc535128e4b1d46dc399f43b307faaa619c6311aae421063b9c0631e8f870f4c256504fd9c44d3fd38079743c1efa9590bd5a01 +25a5,5e91c15868b7f7804c9ca6a51500c6072f31ed5c7b1096e0fd22431ae5d69d9b,0f4f2b7241930252ce39a1c69b08441f4bc51e4aeed1293de28a5ceedced08677ef9f4ee55943a57c57cc82d1184450775284101ed81d4a7e212fada60fcb9d301,84029fddec059ceb1fbd04b4aba326a81d5a005a0da10804951e23327d3f633730c157d34737f05d38db376111b7e69739de6b8ea1dc31014f8188efe4ffcb1601,9a4d2a9b66a694cf4f3c7dbd0ead538d4d21bc3a63ebf21a9d49a71c00eb46430e5b79785159e3888d38c6bcd8de7b63a4ece592195ed753da1b650ae2be8df000,50db88a3556cbd6521a37f3b67042d64b0e07d619d9f2666a98085cd5ca89b5712f2a29e47e0658eb4cd6444b126e5540605c57f2c39c03d4a66c18ae238f38100,6c0622a459451fb210475303b430488920268e0f84a565e9602472d54e132a3f0cf9830a4c821e037d5bc07b870ec1937fcff19a1ff0b546117f2d249e51a90501 +8c0b,5ebbbbb19b11460ba623db7a757445d0291fd861ffb90470346284eb0dffba7e,e4d4c5fe22fe6f64cc2cd3df1f8e494b86f0f0b7b1b4e98c707e6256dbdb07b26c5e7402f9939b5a380e5c0e34e4e9c593a0368a1c17164c4f992b5f731a5bc901,7157a3c951a1acad0eeb84e6fd3158fa699d496b44a59dec8e3464d8f32d1b1972bf556bd01099e0c4edf507fe8ddf83f7f14692208a6cd3361f15a8e037844001,535194536b7512703698ef8dc43ef713b82b10dcc713e90c12e52df7222ae46a12491de2727e3f937d32075a850985b1c1e3138dc91bdb72e03c44a4b8dfdac701,1d24e6bb57407f9b84fb9d8bb68c8c8d2ef5537bffb9d283faeefc6852e08e0415e3c60a1abe12abdaec58cd08ce21cace4fe997617068c9a7d18e79e29afd9600,e3d143a857cec83e8687a70af86163cc996361d2368b6e3ef34c829807dba7801ba9f2deca72d56865c6311aec7cedf4a2d2e32e078334d0817b6d8925cdb34900 +bb57,737089cbdc2df8f46470a56a9a82ffd123fd314a5745675032c951c5a8fb7c52,d71e187e656063f7f6b64ce24c95a32b2f58bb0beb2436ef6127e2535895d84035c2a6088f8e3e597fc5fcd978364eba8916288271e2d8e7d49714742fdd053800,4bc53ddcd5f8460366910c52f3f40b706fa515ace774dc3b65b452521150441b4741eb256720055b0359919acb72716dbdf6e2762e5e0b490486bc078730721100,74210f42ba112bf6e6edfe7ab4d0c2a03cafe02ff8f2ebb3463fbe6a39f01f9b50517e1867a47822944bdd549a878618f4de77a5c84d62435d348b81d804402d01,5bf0a2d730ff2409e46d207fb3d703fe0d01cbbd11211a19a7ff104afe9f486b2645c96bab0c0d36cf30fc83a9dc871a3b8a6a7817d3f9f14df9ae74c2dc90fc00,babb3744476ff7d549ae39d0f1e80cd1d109375d24b7cbb8991ffc4008f0e62c1c6d8e3c591b6a8dd952394dbdcefd31514ef8e34ead00b1f3e775c0d3f6a00801 +b31ce2,9935ba4f46acd705145faf36ce343571ce7a2ec91531093973529c938a9cef9d,31dbf86d6b846827ce5cccd88cb57694873ef25949e10fac43ffd945e8248936642ba7fcb1f149a5ef244c4abd62af5bfd0ab3b4a43ddf6db67b6a46a25527e201,487522c21834f225f857cff2f1ac32672083c6214525dfc2acf6d442e41fc1bc75263d6ceeae8be8018735e12b6751604f8575f97eb72211fe8cbb14c58bc52a00,cc05be248fdcd003778b8b73563bba65137e3bb8adc622c89e20668c8d9a4fbe4de46cca86b8f25de4d0bccc3cb1d0d671f2d4e9f02fcd91d39f811b3e59d1ed00,a9a1ab9e801dd3a846822cfa844b160e14536c67f4d50ec9fc41ffc9aa42b54c6d9eeadaf26c096598c0e11ac344f1c9c2d481c595bb564c9076a6f21bb5ab5d01,80c33094f2bb6f153bc7d07a806a0c9f1177e2f940e8647d32898f6e8c2e8d4a02269b7a207401f5ce8b79e3049ba3ec757b8e21dbbb0b9b223e7550015b028001 +0b29c8,e76476eac9bcb88ff154d76525cde6a86e81fa2535e16848abe768ffc0ffddc2,57055af1c8e2731661dbc729958210d4b2b0e6ef21242330d832c2316a8d848e68746a343f0a82e3e12ac3cb4ee5f058aab4f1dc62cc0b75981b616b1ef860ac00,4174a71203eae2895e9d00bb0dd307a8a4d99b0c7ce37fb43d76903123f946a3437a22fef0b6890c2010c43e5f5746a18dca0d7405bb8aabe9d831238526eca100,5ba3d75cf6c68ce4b569ef7d2de79ac0f8536f26dc229f8c8cfff50c4982aec2447ee39a4e9d16754d7b04ebe9fe63fa9808c0a15f270ff4a8935b3bba01c5af00,cfd2e5a931e19238aff5b0779f4547045a3f80a90faa809415579a32b200b3d9727e098d395291fbf4a83fd11c0a4b4ec9c953690ac4c4ba79d5f969feaa0afa00,843ac820aa320502b19ca172597e540880ad48b1bbf31907e26316a5881b769453169b5601d964cf5614df585a177000a9cfeebe676c99710b40d00e8581c03101 +a92626,5c61e25d05721fba32701274b8e8b5d855f805845137e9b116019eaffe20488b,81d5d4dc8b0c665c43533e00a54fc7e44a9b5bfc765e6ccd118dbacfd19915ca76bf809d8bfc33f80436aa1e3c21cafcac2051820a182a181450cca28f2838d200,0aa99fb703b942ebca8552bbaa657eabb25f701fb81ac3e9d3e3889fc1fa88be1eaa449eb1ca61b08ae5fa3097fa6f51edee638d0f49d3992883f10defc4de9f00,eaabc1294ce39030b797458bbb295a71f76fefe742e543e7c02826cf5584890f1c81c8702c4a3a1caa8d6277f43fc9979f70cc2d2776a565b89c337b643a6f1501,9b239c43ee8adce25fa801acae7ec657ab7564367512069a8e300e948fe33e48329c02190e4972e2c3e684fe457f6e64e5c1c458a9ed0588f9e698cc7d74d04800,8059a38f752500ccdf5320ec3bacf0433e1f58979a502efeb8399881ae0e18165e4c02c1cd8478c69ea80ad3ad73c59089196fb24d9a1ea08f9b000c6bdc080e00 +b5e87d,a35d5fc576269860193d9f8f83592c7c8617f424c84903d9544faaabf984bb17,4f682d0bb0f5635218df058050acff77c65172eb6f762c52b2623d72870f794f093961156fb5f34bb99d61d357d1a15f5f99bcb1df7d69c4427d5c5e0ff5497500,c0e082c8d1f6bebd41221eb8115a54c5fcebd92174b8eb53b73aeba6696dba1536a76e245dcf3a4f9937bce3e77a6711dd1f1c2bab1666dc97ca89f34bd0dd1500,fb96d0ba711a5e9d33f2fef37599930f11b8cd71df0b999e6ac03d8ae60da1955e7cb065cf028516e87ce3435f6f17253004bf231fb2b397906279d98c42949301,569910e829d42b5593b8ac6e0d35d322cf3118e9c398e0b24691d575b1d5a55c3cf7ffb30eaa7536db6d0e53f039b7bb4ba73a87edae7300cfd9daca82e6682c00,7da2ad5105bb77c6147c5e5556024373f255a7b324c91ddac1b209906faf60554e6e597cff1842b874a069607e4c1789ff8bbd05915624e60c88b8bb0a426b2c01 +0c798c,97079f73db7660d862d3b40bbfecddc9cf890bfa2685058cbad9707860d51bf7,daaa800033824a49ae2a6605487971f96c30f83bc2283ed856bdc2e2b6c3d7ec03f3c990b8996f352fa7ce5f267e385afc8347368ac9330cb52b74d8acc7d37700,bdebd3f41b2f1534fa29f278723e2aac9ae3bef20f9a5fb2eca0c3893faaf76d6f48513b167557d3687d98b1b64ea0fcf489ecbd28780adcdb0682ac062231bd01,4c2120c0c91c8cdee6a822c5104e063b760162e847f39f77afa7cf3da3b9b6a21aed12b9cc25e992d75aab95033999a9bc1875f1cf9428d2c80b99fcd3a8c99a01,9a87c1073e95fa7b0d956a7ed4302e4b2aa6acf93f355b1bb4e122893c2ce122263fbd01231adc5529c37845d885feb2d08a0cb25c5a003bc367e11de4321e5501,0088c4d8e4e9a8f03e49892dc188bf682e096a0d688d7fd8bcd1ded3177bac5e6a65c9730e913c08358bea7a02d261669abd428dc27f102f54d8389c623d458e01 +043abc,f2e7e6fdbf55516cf59a77e964dfb73335d2fd8cc8a818005ec363a70cba40ae,0742ed8470d2cd6695b1da75e548620ccc7c83a00283293047407970035e2d075b7d4939cf9c06d5f2ce39b37c774a8fddd22820a6226392556b54d3a3cfa55601,64e1c6eb40906f7fe96295d4242726f0c78d4a973ed399bec67292ab6a63373625608c653c4b72c547b8615d99c4d8c7c4cb7c288bc22fb18d2a4b1df4c7728301,f4dacce44c737f8b34841bbfd4a3a60b2f6fd8980aea4537efec2eab03f834d61ce6979018e9e1dd89a200d60ccc6b6c350834eb5ed3d20ad23c1872a4d04e7900,2a74db901e83a2fc5e590d5c61d3608a0a8ae4f96a4a29fb62e8dbebfcd63fd64690499914a1d84ba872c04928e3543c531788793129eb6826a32af2d0261b0f00,4392585a5bf5ceb36ac178e9e6dbe579b9d16185d50060f0b3792d9c8dc9ca8c6b36442dfe46160db662cfb5ac61441722b1506b5af5b45ae0b009d0d122f36d01 +28563a,0a90c4bdbe55436754faac28ff2bceacf6bd84aad2d5107384e9f3a959482978,3b52d9bbacddbefdbb329e3da786d6a0476ea077f0c0628dd8a48e7a2479573513f4188991c4158919f84ba519b2646b1ecefa734bbf629892711dbccbab81a101,d682fb2fb5068ae774834dad3a14f394acc558b0423010f6a5a721c272cd467944d37bbcacb26c66da336cbd17142c6e58932dd365ba4074f4f1bc4c32d03de501,8caf105f125c673780ab4cc1d55f5777c415ea36f5bfb90890d68a26d28a7661192723fb74a6dc3095ee859fe99efb900260d878505e81fa867b2b607ad6da7700,360606984dc9ee5968287ec35c4683cf82fd186247d3d5616f857a07eb3001ae12c054e9bc11e0c2e9d2c65b5fc7e338e4e0841f989eacdc54f9806ea6f3608400,e5c9414ecb5bacaca97e4491c1ac3e3bf90cfc68e42e22e7e23d09fd3cd172900cb5fa7f7b4f4989efc3bfdc7bda496fa8afc5fe617c3f866ae6a8b73838b1b700 +fb7e8f,a2c7ab087418eb1865b713fee6ecd60e2407303ed883b91cf6e379c91edc76c7,03b3f82be4803d56cebc9440ca817182e526be1cdbd64a9b63d99a402ce8fb96295801b0bf2896d21ea50cf60fbd646d66d1d545ddc8d70a1439f674ee388e9001,3f5f39cfd138ab1816fa501ffba72843668d1d5e0a13ba154674e77ec42b111d35808ceafd9f60383fd4b16035bd0eefdad136ce4e13aeb722222b36b89a771300,ec961fccae60382049d13bcf01a94e1b564e993d2577e04443a794e6f8fa31d12e5ade68b87961ab76ac00f97fcf3b9d26725e8e1eabda7d9299cdec738f00aa00,7ef91a1b8876e6eaf981485e828d9933f96f9b737ed94013fdf5a66c23baab543736f9a78ec03a7b70c2cd1eb9055526a7f882e73057f6d907b19b9e24dacca800,8fe55e8bf6ae3151fd2a1107bb2bf9afe7d4462bfe1fb8f32a27ce8efdb5695511fc2fa66925def44c3eedc05215d5b17b4566bcb366a09160d46cac82e5adf600 +85566d,a58f93785f7fa71072228d8c7c347f027cf012af38af6b70bf5787fcbea4bfbf,a4f412ab69cc27d7fd4f8f484e91599f2e054dfe9312c09c6b97d8ab0b7fdac246d1483c483565f48f1ad3c75b218bffbef5df38fc7d311cf6d475271def96d500,a7d9e016b506971b1d5de45b997bb19fae5def13e255160fe3379072b10ebde218c4ac7ace37f2ca84658257519ea1ca8352dbb490973f0d0a779d38a557a7a301,bc8c4ae4e4e4ca8dceea6f1ade200bd8143ca62a0a3b89dc0e19a91a7c00ebf340af939c39affec1914cf8e3092babf709b05e3063c8399b0da13a054b6cadce00,5696dda62a9236afd1045d1dc07ccb4d292a7a271beef63186d3cb566df7eff804ac2ea5baa2db563180bc169fd23c34614073200239d1e23e33596ae6c34f1301,4e7c312376a621b22a09ba0b1367275aa4ce92fe019f98ba3184244331323eb0621769398b0c7163440ddaff5dad60f893e6b9b82196b52185bd1c07f3b8d3d501 +d0c456,7a85783b38dd624ebd5eedf3e4428d80f7e55f29e645ffb2687f3b9e84cd48f5,63b2938def0e6a0bf1940f3f815652b070c30351cd8393e8b1f0b000e825a08b1b55fa523b45f2edd455f55385ca532f843ff01df3ea538e70f80a4eaddc2a9801,9ff2c090bf0a43ea32a533b41ad0f52495e364fb2f6d50218496b4ed1981384169e4a89970a2c731a137a501564f4ed9d5c09d219e0b8605a9161f36216c883601,60de8f84c9adee1589df52b34cf36636b5b27a730fd1f5d377125af498089e447c37e862947df4685ac75ef876558b22d5779b3865a1873b6628f5c21c4821f001,a1f400e2fc5888f7e7642ac872979987618b4891cdf75b16ecaa817561e30ab24121fa9ecd81513cbbdb3cb335118d0fb3fabe6da31f795641393057a5810e6001,a452f8bbe9ffa8b43a310b60278404af0612b4a1501d0f2b320c78362ddf67fe48d0fb5bea00395bb0bab392e181b0def58d6f146cf454024854be0471545d8901 +53bce687,25fe2f6c0a89ae185fc8b9964abe332327743ff67fb6765d0ce45fb006b2c41d,12a430fb0bd11ee848a266228fc3b938911896fddda1715f88f37a57612b1427279d5f58618de88c734884f4c5964f417dcca00944f220e83166489071c414a401,57932529b1fe72aa6b1f90614ce452b729437648b606db1f0164d8daad30f3d443c458b6db90d143d8a19827b6eb88c9e7889433fa398b4aed085c2035aba78f00,3eb9e7e1d65f45918b826174eae8ec5cddd0259d5def9dbaea33d069ee348ad55375029e1499a76fc3b3afec6d37a2f3a6cfa2dcef5e03ed57da588226efdfd301,66143683b106d8572e5eebd52b656b0997e6a83c386e321839ab76ca7ca7a09318e9848c6782233c594c6241447a813654f58048b501ef83f32826c66ad72e3d01,7c752bf8f0292f68480d01d9b1d863459ac7a662c13290000c7e2089a7360e411b6e501eebd2e7ebd1b3b12524bb7cd823ebc61d6509488a11514e7e99603a7c01 +7b7aca87,9f0dadd8c7a41f7d27083ab7ba30e920e9b4be68e2b9db8ba2242d12b3bfae31,0584502586fc7d381918e0bae8cfdb8d87ffe39a6c5a45769b90f553f5366cfb2cf51ec18730b1f2b719cab207217674d24c422dcf51b35776abbe2526575e7000,2834129d1a1d661b0f19284e5af0d0cae3ef2cb99f8a297a5e0f9e5703dece83521ce40b34b32cc2f0c825efe626dd1f9e429761cdbb74360432c835ac4b90ba00,b60fac58d4f5639d33452d0990c849efac128e3f9ee1c08fa19b7cf031ab024c6f727a01bc9fc78a0b578013f9933a131d3103e6600f7aeb1a2bd000e7bb69b001,4748fb1b4b3744ae1788a2fa36927919195d1c9739d2774d00ad6d37e703f9e860daada6fcfe237f3b3219e88dfbf3144c5065b3e5aabc2b2e4398822f32c83701,d36e2993c77b66ef2399770ae599bdf0ac9f1aed9046843d1f367ef37d7c9982630084c529df914bf2a8f37e3e30407c1e49093d72fd3e2805fa48343714100b00 +4fe24031,0e8b4693e6f174a31ca5c352e4628d7404970f30fd8765a1f922f3c9615fa364,92bb0d0e7d31100328510a09cd662373e9c320c3ca476c45dbe282d1aa0fee4000db8e2009875c1bb78668634d3832bd320cfd09da123960847187a21115523a00,3619ca883fc76fe34244ef36e1727bf31e4fae7c1182b19e0422aa769528090769901eefbb18ad5d4457283011e07b9ca14dd8275e2b94c1c5f0849e50bc79cf01,cf08334e389d93a2587ebbeb9772777fb50b415f27679c57794e0355e00e81e003f67891d5b756266e6a331ce4e8d9c8f363304444f09840b2e9fe447ecbca2401,3158351dbb34b73db285774cb3eca93a74e2264b107fa200f49aed39089f354a2be239fe9d132bf377f3c0aa01e3e3171aff0ddab9538c9d9299dafa0f83beef00,dd34ef5d0c84911009e6aab60b1f4d188acc176a627fd5ebeafe8cf994dcb0aa0e2b141ae87d3ffe011b05797f8c585ed4f87f43eb802ec60837da7e43fdadff01 +f6c38291,3b6dfa8899497240dc99ebde2848f406f6be704dfb9ffc31c3c36d7beeee10b3,848784b1ffd57d04544d9b113c91f65bfe1cf41406e6d5266f66d264064095eb5662159c16b86a96e1209fb1a2a426f5529eae408747d3211448cf45bc30209801,088a70e4b754f78ebc44374f55806280a89b65dce1ecc0f3dd167fab4b38899c10fa7a3f3b1737bac87d0fe78649cb1b5b8cc03e3e6a87251b3b301866450b9d00,6d8405e224e9e5b425256aa741bb2ac53808d1966aa3328e7d51448cf8e3d8ed16202b85ed65299fef9eb233c862a6b527dcda018dd5756793f564da818378ec01,c41c476b56e860319e9f053d10a6d0a40dbbff05b6a4184ad6f0518265e2f25e2fa58daa0c89cfacdd32b89dc0c8b18c32d3b2f58e74313e8fd4889bb00b39af01,e66b5e4082446ab950aa6615173a507fc014e2a262fcfa36da5d352672e0a39a289de8c93b2bec49a5b9c130b19d580e1e650cebe65298f30d0108fc19bc0b2800 +350f6455,3b3bd0f8a2f470d21d57fafdd03d772ac04d70dd00555bc15ed9487ed50d2bef,8affd46eda82ae99af3c48d0b480a1ead6757a6dcb1fe66981081e8b2fa56c0510f87a29a466342bdaa77124a87a5278391c6c4a3156fac7c95e44b72d9e07b601,9b458c91b10ab9bdc80a5ae0e8e374f6cde24492e430ddf785620e1902e3952070de2b8fcb18cb23e2af22ec94437f478213d4dc3a666ff3028cebdb2318cb9600,481997bab6027ee5247fdcae61268c37ab4c1a313b2525817f6c2dc92fed70d9735d25e029c41ba669a70e79a84a91d8facde362e678b9954349eaa1d350f6d100,2af107694cfb03b6128ed1ebd686970c1e02c4e493cd033e1034363cc10f84b83bc256632894320e39f39074b277f67759994243a65a81ffd25b2cf6c7a9d1cf01,39c20fb8d90a7bb90a735ee451f654f021604c854b029ae28b9d3622ab8c33fb6806529978a3c1f23113a481b6c97a8713a4f53ffbd65ca4d3a4e72ece58ef1700 +aa31151c,eb5063c9e2839c6bc4da39619a6a1b67a9b7e0a6471485d96a67329ed60a6ac7,7f74eae87e1a1f7189040200801983808049f790ee7a220955a75ccdc751ca167c1cb549dc91fd2d447d2374d222c9aadf142ed6ebf5879336d2f15b1ae5870701,259249b5e2f4ec9f7a08625fa859d57880cc8ac915de5ee3f64a34a4752167181a93ac4bc939e3b4c3f4080a9bbb88fbc93612734f8cfc366c676ff2a0376cee00,178b3bee825e66082278d9ebb9ef4557df8273b34fe02bae998fe7b7d7cfbbac656b32852d6971a831c420fcac22c51f8dd959d3a35a3b74700bee326812ab9000,277f4a1f853f443803c9b58f03cbb345c4cf931c5ccf25794845fcce735019f3726b64f0a23fa705b83d22d70bda6b328386b080d8ef8626529eb1c7c10fc26b01,a07df43d676dac672100b4cc970b43cc8ce0d56276f6215967ce2db2114b4bea77a6c849965b1ab9dad319690854e07e1829cca2b12b4e1507e367cc85dfea0e00 +2a39610e,05207a8ab29df9074838bdf16cc7cfffd99d1b4de212c45feb1faa17d04fa4a0,00b729943169b7779f393d9f7e9d97b53c9bb80a1c49ba05172184c6bce4cbbe1547e86cd0d4ce4fc853bfadafc983f90d4888dafe112f6af77987061ccaaffb01,08dfa3a94bf2de97b44196195cd31657bde9b7f342157b3c0ca702c3269629501b0b3e9dc2a95d8a6f4465b7ddd4a194a0c856c51458fb8ab07cbc070e58ae3e01,96b800e3e9f61b8af72ce205c2eb3364427c3ab7196705619443ced3b14e3278007dc709ca3727bb0aba4ab46f1f8e848915febf474f2fb0e03236ee24a0b3f400,3d894e781bd882fc4523bc1e983f185c747d15e3e88bd4fbab3413400db3209b66c88663856ed9261a26c2818c98ed6b8b23b2a2b13f6c5f780077e95c2f6d7b00,6a8a0b68415302bfcba09b0eeb88f808557c1629c95033f965d5d668cc26f9f238df020a1b71f670a2d1629e62744f00b338f45202483a125a506acc54c433d600 +71561460,2144a8b90c6a2197d6fee8fff091f50aaf8e1375f2492bb2cc00e1146e64f128,9dd55e809ce2395c841b8a24d8381e8f4a62d10062d4616a811fbb5a384df29c5c03a9d939cb4c871183414180c17fa34f373c43827b149bd5e7be73bf1a04d501,5ecfe1ba06c0d6f30752f8d248c412f48942fe17e221d3e4b0f75e4d7aa0e68073d2a4e72bc30eef31a646b0c236b4373f12e1759984f32682db8397ac87040601,8c68c32c02e5d98fa4cfa787ae72e121926acc73b0b442ca7e3d1b1e9211cd96583736bf0dc784b7af336d1ab077eab8953d1e3dd13e50acbc3839127888d9c200,5dcd7fbd6dd95b85c564abaa50d8203a1ae8a95840238b2b45c4dc35cba9cc736f5ef569abd65ab4066e9de0adc8ad406df22f1c1831c9772f0036c9b024296c00,d9551cae6e21a835810ca3ddfa778a670fd21db2a70415a02ef2440cdbf05b5926f8b874d3ec12c0617b4b229262e5359edc705e9956652fd7f080d7857eb1c901 +fa8cc58c,7fb5d70eea2b2d974395ea10018de69c11bc03005faa8a010ecc7ecd01269226,8339a7a134b4447e9deebba64c04d95a79fc4e9e21ba0b9330c46b7a56c43a47402ec2ff30838d765bf189b6275ac7c54728dcd7b5bebc45a55109f8d448db5000,d5b072955879263a22b93194971dca50380d13e0f956b8e1ef379f0085c1ab636820711b10aea2b8f55e56a6f7f9657f661009da187396483a4377194eba4d2800,75dd9da0d5e9999e1b5fc0b74469a60a2be4d1dfe8d1e2b18b4e0ec5fd1e5d324a17b73f829ebd1a7f1b68578ed8d8b437e8c7df4a06b8ae07719621ca7e38c300,ae4832d9fc97a4cb0e2fcfef555f881368a1a157940d1d276467f8ab3c6027eb341bb41a950c89fbd218db9bc3fc90a442b29ed40b554af06e1971e0817a562000,0a06cddba818087c770cddd7d61060daf9519cc5a2efd807f9824ee635e7df1b46e9403d60c9c18f65339368095ca0c52b8bd91519ef7bcd16b5c38ab483d15401 +536a8615,672b3c76af7395be5e75a3df5b5f2cdc08b40b809f0d8c50707950e972c374ef,1f35195267d0fc5f3284bacac6b953f9ce7f90fe9d32708efef419624e1a47b811eb6851e3e5f680d0236e455fe2af2c60668580f9b8ce1a3cae9f94ea671ad000,f5e8aea865f447d299e7ee176defbc6610ae6c426e737ae221c83f9ac719ddc57f5fdc4a46f91cf8e9de77328ad949735669e739c8cd5533ecaeba375422d51a00,1ff9e7dd1d7cf24b18cdf2e754b6922253e8ea8e0a6e37d0ce79ff488c847e26069b984e22912c09d55bc7e563760a321d87a4fa1e8193bc0eb7e99deb395faf01,81bd7268c88cf56db9f1e57e854f5d76051d4c68174cc2dc6e636257c66ce07538066d11c49adb6fa505c77f8212340707fb57eebef0951773d84f246b19d20301,42cc79dab67a1e2521faa4601af03d6802a94743e698c82a005518f9ecfb7fd2066688ac134a3adc47c6f76ad4f23a09102148e1f8a37f99721e6955edec33b700 +04928e1cda,305ed8fa2a661541e74aea70892737e020ded64534e342c678af33eb171a8a3a,a5beabec3d5e08a3e4c9796a40b4801fde1830eef22885d1890aa809b65d4c18700acdcca01b675f5a9b69613851c5112ff2f520d7df02502a82d22da1acdfed00,11b4699184345d0e3c296588dfd59fd75d02805f1a7d4df5691b41b4baf8128c33b85143097880248d92a8699e35a46b61c13a5e430d07a24bc500bb55cdf89e00,e4a97752d82c71a6a2d4dad6005954cb89b00b418b3f9b93f3ab5decbc745ca14a0333c55dd0ae4689096558d844c07f519c728af32d0106898c40f840cebcf801,86e2890846c3281d22274a7f2fabdfff8a08251b7d16c7299dc75c217fefa1fb64f8d3a61562674f000c320a0a85feeafc264f0d88cbb91fd432d13cb30d29a700,fd470c5458938465491b19d3d5fc810ee0cc82661880c9761ef62a640464a8cd24d306a4f470096e0e15a9d6e7387b2b1a2bc5594beb448ff75d4d91a849b90301 +090168970d,85842e3ede599ec093590b941a96270cd97637d11df7348a82ae38ffcb2fb469,c9e5a2c5c50dbb154b12b18e05c0aa69dfcf0d6d83fb89e9dfec9ac91937816a708543be60a0a7e38272277175bfc0dd303510f72f189aaff3cc5b8026d5c55500,9bc04bca5658b5e7e5c2a303b83119101e4deb97ae6dac86897722b5996836ae34a4036c054f06c95ad6c5c87bc9f5aec7241252fb72baeedbddfe84abc56a9801,f7b2bbf2be4d82fe4d7316aee84e68ecf348d7e2047a00585c1050f1be96036049a6ef2ff44edea8d8fbcbe57dbaf2627ae803c8630baa97e8e80d87e94ee87601,7ade5ea5687da3f16d93736ef3c9c755590fd21a0c55ffe45c0aeea5c18bb49732d51c08100951b6179560db067df681ef0ec4b3c57235ad07ad0e4460dd746501,4458c293eed2386529c0795a21af0fa54aa6a2fb4d6640ef1adb465ba1aaf80e6627861116ad77b8121b7d9e1ea5e6843c457d5aad6e173a128718349d20154f01 +6d25c0a10c,43ed97b51dda47461fef3d1cfe8f9e01f4e051df6d5aa053e02e34590a178888,6abae8b0d6aca726526b2307b1002ccefb297180b27898d05786236a381b3cfa4dc352caf8bae0844098c0db0f5422ba7498453597622ea014b144936104928000,bdca056dce0a84ea1250abe582ecd5bb54401068fb6d34f90143e2e4e659cec70b4d11cf9c0ffa5b79614aad270a34992b60d28aeba2f0ca92ce09da20e622b501,0e37c479c75c5245fce5782fa63d2a608ec496aef0a9e7765242439246d4485749507cb89052daa469d01d06499d8c20bcff5d8e2a8fd402aeb2e96f60c6a07101,50547b7948c58946b52f95b3b92acc101c8ca42b3dc7fd76540fe600fcc803e17f23ee2c0b7739d430b73f361dcaecb96edb5b8f9ef7f2796c1db3692397812a01,5c07b97cde3f58f24a958f3a2f7437a64706b644ba9800f94ddb3eaaf69fd3f07561b2d129d1efa645b78bdbe36365ee63dba4e4f4fc610fdc6f00ed8f9d17dd00 +1ad222a8f9,b31d1142b647cb56877afec30452ff8e8aefccf857840d1425076fda0d125b3b,76405e99e4a38f268d1f50359ab76013142984fa2bd9e821eb9faf8a2a06595726bb8bc9bd81c5c72024717640f802bfe92337a336571af936c8d86f0e4ad8ba00,fadaa5e21ed95f43dae6a138eba83ba02395d9b0bf6353c7557a793533320f3762bd2203dd04dc08c91cc3b7cbe30967dc3f9aa19121e285bf0ded4322ca8d9901,9a3aaf598a3c8365a8d44ebd0e58eea48437a0955ac048ef46d02253169f0f6738f37cf87d2bdac0e8a1f09eee6783114f4212431ae976774030d211d192943001,8321162e45004613fb295e8093c7ec79e5f7584dce7144c0ca7132978fb0f7dd4bf2f12164920d06f5d7b6e0be253a700f2c2d26239f154759a80fad77ff4ee000,ffcecb651b97286c576a148c0cd124401c1fa7296942eba35fe7a02ed8bac3c636f4f169a388550f93e8d89c27708c51873562e0e41d36a07f93be203a6d234100 +223c155bb3,acc20bc50a169d7b8cdeedbbf5e327bed072fbf0f4b5bffd81829cde9f91b34f,b452320490506c47394f052fe297f290b4786338b0277e135223daf0db56912f423cbca71ec8e9797c1be6fc03d9af72098d93d87a46ddcf71f83a0184bbbfda01,6c877da95728fbceac6052d10bfaa84c572da0408b2dc072847bcdecff5511392dcd3a101e7d14e143b8ed06241d9ae49724740e9b5cc84fcac6fbcc38ed5b2b00,77b19f1023ab9ed7b1839e39ee3a3b1145d97903f2cf3b4a91bc384836ba356967f8361402d90b7f3624a6ebbe06cfacc92b42dafca28d85d3609eae7d16ef4a00,71a561719e3a683ce2f250d8570b6c8340a5bd6dbf6530354d34873d69b370cb4369f9d477647f9dece059076ddaa0ecb1f852dee8e3e293b0b767c2d5300a7700,b2ff5dfbcb8c454c1801b5ef7c8f1b60fb1bbccf4741921a642623c79bb438c841c0dd18fa6b283f72f12ef8837878c1f37703827eeb275c63ea1589756283ab00 +cd936f2cff,b649428341554bf3003972dc989c2260abfdbead7b7fdd937ae435ace1570cdd,dc2757e1b7f0b1cb55bf656be22ca6caa92baa9c6cf6eacc8a9c9fb13c6282a60af30cdf63d7277a7e8916619af00e829bde6d7401fc442b75d734c15139904300,1c6e9eb61d675a9a284f292c7cb0c839cb24bca7ccb4c97e7330ec50a49f94693ae6c885a81ea83bfcbf973c0e58f6d7f3e730fc1d30e6df50f1eb941357559500,22e3c5b94611394c33af4e5300812156b9a180764013695c470b580cf48dd2694fb57c0bfe174e3ee86d6c1779a3a812e92d1f1110a0c246bc0847cf12eb7ac800,e8d915dde60215a423f5cf5c3f4c48aaa7615218e5848fede6653c9656b2a2a341ac145b1c89c42ef849d733a60664c37449f8546633ad5d7659ea4a83e0336b00,8aa0faa6acec55101a26546e69fbbfec35cb7648e61f2dcc9b9ada2a6f7063d96ee1216a5878124720db6482b8c8778db09216cc3072d77a4b1f566a8b6df39c01 +c78d6e3184,ce154c1bcd73bd384b4061a39657d48c229e8b801807f23e5e81aac7e8999be6,1a7d168d4badd644d66a80d8924b8fd1b6a9d6a94061c746f22fbe62ee7b428e27414065041ff56f6f2bc5215b5b1e926d137b3f2c73325529371a3db06a3cda00,0bcf503f773433d06a343bfa0f77ed6fea92d90002381b2a771c1ee4a2dd6af730d9c41647e9520d89714b5d3a63825328341da329f0c65d3d2334e1a641b08c00,50053b236260e4ab3227e5f046333f696bb64d5026383fb342430530ec4383474f5849852d6a85565dfdfc648a1b5ee9f005aadc670f81eeb5ab00b386c07a3b01,c44b946ad52768b8ab760e6e6fbe6354bcf4b80d1ad453c422e4b7bf406e295276357d921862934f2bb762c5e96c70833af37eb2fc5d41a529633d0636b6dfe300,96814770d6522e8088347960151899c711c314d805f892233e9910b946720ffe060e57a285936a62b3ec97ae50591225f52b5a3ef0677f748df7329026f909e401 +a33c323721,b8719266d7e5e4a35f75e137e81aefbfaa0162b6713d1d5000c316be94e2b1d0,38c5781691c809b63f7850c43911b111723ee2215ea00b40415fc0a5a4013e654a360034de750489133cc8ceeb3ccaed2bbd2ca552d9c0b8b06a3c5e4b97e71a01,57fbc87c5dd50fa97ec76495f5c8cb65a06a3ec3ad14b29133505cee80376901464a971d6d6cc8cd395978cedba624b0ae9f5364f9ac9b498c974cf8dbf6520f00,2860666addfa1b425917a3163ea1baaed92035a1ceeaef3826cc8c000f7a18be241389e13dfb19a9e64fa8bd718ca290f65ca4a963992e095765693155d2f74101,9f4c91a8a058ac26f263393c00d9494ca73c54d6a943309285c78fce57f0d48703a8109e8b1f0222d2ff58eb3b1fb3850b0da0879ae1e11621faa71ae749cc0201,751c470e771d03c68efa2886d54cb2a578e8333ed62a697fdc96e308fec299cd64461e7770d137c7baa56ce4823ac04693cb52e981c2c6c45693baea259451d301 +4980547667,e617f79121596bf29633a49f692dc0d93d0ab74283251e1247684b836486683f,95c102f68d7c5f4aa24872419c359768aa26c65269834a51ee56d52cc64cf75c75526a4ab9fe977111beffdbc9f0eedfad29f59ffc614e00a069bd1de93ee23101,e12861d4136a4c39146cb9624892cc1f71333a4ba7e2d28546729cd54b84616854d1806f90efff88036e07ad535e17fb32eaedb10c76ce9b5c42713ac82d610e00,bf3867499aeaa9ed766af09b3f6a447952cd888da4ea706f69a034e97dace9d53b722d75b729449eeaeca601a4b6dcc44f4014861e6341fd91ecf8d17811ea6800,f094ceae798498353bfb9e474886f837691b69572e197dd41696e3dbf6ecf04e13edc98f7a01227240be0753551d2e92dbb63de78123265770ed321a0f29ccfc00,a25cb9c208202b264db09757fda80ba959e00259e74a32b69ad4af91765bf89a6f2000546c82a5058f36f0630a71a994f38120ed7717c128547239eb5dac2b4100 +50e5835f6b,21cc01d1a8dd6fc02f2a49f64b28c7e0a391d656f528ae38857690ab75a4a207,435044f35cb861c7e6fe27c88116c9e69ac53837cebf5e4f0e5bf869c918f4fd3efe25aebf50f48468bd55e3654455e2539d55edf9c958566346173fd6f2ee9400,f260785e9b25f456fea634f38016f806eb818107a5d83b282e0f6778a99f426f66b100f42a10f84a1e5a349eb2e2d2e520783c98d9ecbf4b2b7d47ecb92d968c00,63b5316cda3628c8d4e36eae3b1b42f8e7ecdcb8ea137cfffe9b00bd93c4d35f0225013ad10b7a0ded75febd774fd972d453646f8d8c0746d8f093b366e8281f00,25df5e742345fb04017e45ce36b227895b9f0b7fbce85cdc80cd620b56d448ac4a28e68040da72c69dd85f4829074ad6a6fb3a4f4b3f429f19b8cb11cfd4196900,df749064d37ca3f7aabbb72015e9633d7dc745916f24a964fd37edc9b2e8df005d75a29e4b16d7cf23531790672822418d87afa42fe9c9fe2dc391783176644801 +a7c6098ea40b,0bfb59c1894e40e5535a0c060a384126dd9d9c1b6fbce546edae52bd19aa5a7a,0f2d2035eb66e38a402bba87ebf1060d8c28c494c8f23bc739294288858b60a439b19e03f3bb9792b6d72642deb33e7ef0a92253e879e1a72dae7b123b0a21d801,8468630e31a584bfe0ce03db24d6c9c9b95ea791a4c04a9f0d8e53d7a34fa4e72d5d867c866bedae198a85124c5ed71ad8f53e34492436697990071897f6bf3300,deff44c8da8643a52fd988a2f4ecf082c788eb7e876cb4e68782609739dd5bab4604d6fd6fd395c17db65c274900275d557e755be9489d277a0bc39021bd1a8301,f7fc5e26473aeb000f7f0b8b3bd5c17220e82dfe903d129eb8ee25dbc19ad68f7c326a098a71f332c2a41d5d2d1e423a42a7ca1cf0c579d731c9352f1c603c5601,de2f3cacd1e8250e8e095c9b3b41f084a149880babd513468de9dc14398890e322a531b871b38ab3b6cf8d513fa9e3d82ba66e3f222f984bfc519e7fcb011cbf00 +712e47d91f25,80a1f70120834855477829c80e3c109e4ce5e0e06c80e5e1c5ccbb446832ab0c,4d359babd56d7d608c000bfc9b99b97e2957e8ceeab1c150ff0d4d86f2df34486d3f85141c93e3916a79b89d8fe524359295eabd76302e524449966460e3ff4000,99ba1aff634bd7fefaf482bbfa55823d9821119a952f37ae7e6a43512bfe8d8042752cb2100b970bf9a097f395cdc1d438f4e473206d6fcf442599423401ee1401,e7d7e376dec9cbadcae39a42569c0362d9711beed4825824f99726b3f428192a66748497da56fbcbaeeff07bebbb6676e31851cb130c7f4bc8cf0a59c36d04bf00,6e58177625a7c7e116eae1fe8cf0f0a0f8f3a07d0bfc0b3904d0b95487f34e520882c7e1a52b9a6fe89365744b2f4b768c249213a635c92faa1992bb7f16610601,7dcd06e294b1635acde376d1fcd40069b6dce6ac3971eeb767a58af4f2d5749d61a69d83b6eb4c63dbf0bdac55e46b1a9766975fb8d1ae10935808cbe88947af00 +f545254efd05,fc7157365f6781512c8aa170ef431785a9db6471dc5b1b613625a3511ca26ee8,219de4609c8b3351d9d25f3989948d0783318bc2ea243b3555442be189beca0f059171306495c9923a44bcf4252565f972f451ec7babee38454194aab3ac9ec601,f623eb9b77dc13a5d735b79a626d37224057e23bb986633bb418115039899ab127ddec7bb7464b22b980b812ace84613983eb0f93e9cc2d3b62f4f761ec4b89e00,3427bf988be9d729c6d01b01c42d011dba1fce49f3a05d7638e74cc09bc6d6177ec2040f2153f5596c903f022b0517cd79d45120e285b04703d791b854cde52900,a9b3520c8078b622ca5828866ec4c624ffc3e55c4412ba2ceee22f7d4ff9ccb90008cf61e127ece9cd0cdd1f29afce61abc6564a175a154c7de005ef5cac07ff00,174d07ff62fc020ae8cf551249b3d8fdb101076cf8cf199d2b876695e8e585f30d6b41133df081a499c8a1e5e3b5ea32361f45eb705e7e9ed59187cd0f17e28500 +9232a755f95b,63e3d9378027993a971525cc132d679819b102702b18743277403e93dfa3e4ba,9893b8c057cfc8c6e992f11a503251e1505592fcbac288c0504214a71d18964457bc5d3dde7289dec8a1eeb1e88a40913cd3a4bb5d5c31c961d2b30052d25f8100,442b3e0c8f83cbb8a021ed3c6154f7a097f164404594792dd1b0447dd1cac8f25aa46b4c116166f75bebe5fe2da7d231b628d88e94b6461d23a7b1554553e71100,0204661769037d426f7922bf64c0b3bc9c63edce4395fe673218f43a854b22830a51db8811eedd71a88973176b694abf21cef452e833b019c0923fcb487869d301,6222d64de92dff8b8f5b97e9643e783874856702509d13839d6cf1c0efb7ad6679a62911540f1488bdad5881b7675a3b4c258f1ff8f9318c0450e134448032be00,75176cf57d74533910b96602fca51bfade754bc3f48db9be310c64470a76cf527c0cd1e500252a26c3234040c59f50d63867e929c6df18e3ecd7e597607b306500 +a9b4f84723ff,f662bf29ce2a9e4b762d777074e7f2d7d3e8bacd490d9df103c64d1e8d636edc,f0aeb9079227d9daa1424e4bee372a41731647eadbce9baf19508eb130355a1928739241f5a930a70099af76194fc4c43d674d518588ec6ce5449286e0a5b75600,b7504b0c9b74448cdf49e9c28c8cbab3dc367d6ffcbb1364b7e2676e7a52dff86faefd44baf5c35fdc129d4b222414f452b564eedb89862acaccca9e6cae708801,df6d05dbc36331eea43605f990450957f75242b45f4b264d56aa426dcac7cc971043d45449e7f6f78c7c857bb9a319e88773afbe451e9c0c2e7683a0ae5293bf00,bd700eeeab6a3d295ef916ac57d9da9a07324c153101300fa18c3becbf3d50d001f5ca2486aa4cb667ff9d29c9aced2691475fab287be1c1a753f175d77b985701,9dd5f2512d8a595ec6632b91486e4ced29f7cedb3f238962e4388463105204fb7ef5bd623bdfc406722bb2acf98082506d085a0b191020fb0865942c71a73db100 +8eeb5a51b7c3,5876944251364a3e1c29eb9d25c7ed82d06e61f5bd2ad77ace77171ea6b0e728,7f0d55f74599ad9372859852bd9360df4c59ae1f8b6f38638af540ae0998ab8c78e28455c6293b825f956bc4f3bda12b1100bb4f67c3a58bb10caaf0ca4ede8f00,b35c53ce83e7e53db529e8fd4aaf631e16245e1a6a509a21260babfb4d0b7b641bda0371b7601f7a251eb7c664ea1d71ae422997dab9ed22cddc2d4223e9dec400,ce85afdcd332a53dc4c980c3b5caf9c340080ae5240ec6a1d351dc1fb08b9635711de0ca41b5d330eae39f6d02f97eb6eb32d0f35f351a7cea1b682b1403588e01,d1158ac62130a193ad24c090535e848e118b0701f890d4e15806a424b20ca4cc6576d814e6701344f496cf2c0d53c7f422309a97d86fb21754136046d815102c01,190f159bbd474f1004a2261219a7679cbad90079c52a72f8e38af391aeb7ae2a260cb2687007dfab2c53f5c5ba0d672899292fdfd7066dd16cd508322be6d37200 +ce30560c4bef,a4e8b342009867c2d1cf7bc8a9d8ad37eb89381b3dc4894193d6a261b1cc2b03,a23efc7d5ebcc9d8a9bb0f6ad27048e9f9174cda90dc617e64079d43c1cb147f448bfa4177ca7726a9f325c9c48e0466b15bb85c6a72d80b94550abdf58b86a901,154e0b97578b26e7e935f861d0cf071ae2c9b70b1e8e00e002da39ff105519d8091faf1ed6c92ab0de7475183ef2e6c9ed1e4a4c97c54d95be00e4d053511d8000,6319fc8a77ca057ea83963c48616eba5ed22f557d908ef0a21ee45d66171cccf2234825e7ff6b72aa561b38f0900b179437209c06503acd454037048af72c5ab01,88d5567660dfa8ac515352162a6ca01b077c461f799c14cf2ee4e760631e7565101ce301e4ba233c90db274ca5b0b4d67c86b0cc08bbbbd81eb90917865c9fd601,93ccc1cb7b73f915111b202f742941f641e98dda48d346f9f33232d30a25f5fa079312b22b48676d13c691031dcd938f8885e63243b99cc942269ada3d4f5eb901 +bbd7d77fdc6f,d312edde98f9558ff16ce26f1431643df935d2b7da9644eab090fb13fc53072e,dbd7c2623ae4f385de9dab9feea2dbe378bf6eadc39c5f263707a67e78c401201fb566edafcd74661d6d79c64f4a053a8dd218c97563510de2ddc7331ed3e68500,e1f931d0f8105e994b82885553737f637cba0fbda14705edb354fdbfeec8a9743c41dffcb1b5709c39b2c4468058759fe6548a7a41265a7dc929b8fba1b62e8801,7a69eff98227ceb6c5d9fbd1eced486bb11fad1df1d0b1c626c374621922af937aba94300d66047f21b642830c0822ff41fd32741dc1b5b28c26e2a12a98ceaf01,44fc500e9acfff8bffd5408a41d554eb9aca9871b7158c1d54e2f18edf74e6584717b50c4bd95e90bf3c76bc39f8e80793920a90d5f894cecea27786d2614d2d00,db84ac99d2b033a1bb32a99892b89660d1aa79642201ae1c797d543aed34f6f353c88b81ffd45f7ca5cddba7be82db45dea6d179a141705dd874e1cea1b49ee000 +bcf65f76f46e,81af7a75b2f7feb3e7a370559210ed288caf06f3cbead7f6111fd8f73fb3d736,0bea43a28d8b2f40f0b16663d9b9f146b63a240a5cfca437b1c541244f37f95d6af586637c58b9aeed5750226a0ed2de4ad41fea184319fda36ef718de8ec8bf00,a574089889059f10a386c23853b23d640d7c70fad11ff938155861227b8555d22c34981d849194e00b7b75f4fce92f80f33a1f9e2932fac57a2ff3933a3d001d01,83b3dac87ce1c37cfe3896fc8d55d4e8146957ad5b9b6c0773df8efd78005569073e609c2544128b376957def75c6d934b7cddc53976cde86270775938b410a800,76cb57fe6c0ca2ecf402705842d5ed322dd0285c1f8b6fc8568100fe976bd620699c8d6a70e8830578509367d02a4ab15cad9504cc8c8777abca3ad9df721cb801,26d4558a38459d87346fa03e25fc0706129378d5fa2e289e86adf5003a94a8a437aeb71d9b401dd3fe98273c8ced9da23e08a070b49c677860c6d83b1bce61a401 +6be890617c4a,8bbc409522011c590358002a3a27e03e443ca33051a8782ca9d8d92e842aeaff,9eb0217944a0588946a5b88912532966de4dbe9397da1dda306d2b2d0fcaf31c3e0d4a297e36a3d41d51882ad54911c5d96aa6e365af3568e838f70884dc623901,7675bac9f2fbbd11b105d01d052a09ec8c770f7ec8295008773737a1765bcaf904b59bf4ff799a19fc2043dd604a9e92f41f40aba017ea07b8c749e1fcf9b3f101,c42c3e857321015ba54596de6ec1269e4848e8c42883a6b96a9466d1f03aa8a13e344824fc2f890a9536eb84e1bb46747290ad9a31bee1ebac193cd6767bff9501,09b111d11831b24c341f06b388e15beb6a03130abd9d1368fc3fa13122cc7c6f69b3eac7b12fb51dc7167f63bf343b0fb8aeb7430596cabdee4e4b526ae93f2b01,0ba18f252b6c1c79deb94193a4a6f399c9717e5455e1d5023031f7d88a3934385b420d7df74d9a0b61eb3fe99079ad224b19d96193bda6a87823ad58f7263f1401 +ae4d493a87b59c,84dff8603a3f6f91a42c43b3ccf6fc7ad39fb32882f3c79cf6eda9b0889ce5cc,10f431747a03e240b4a4b6acb0289e10190b8c4ed54ace200f1b4957160c544a26c230ec2694a1abc650a4d9564d9a14edcbc813dd3bb4f37e09c2c24678786601,ebb05aee929688028f6f1989ee18c11f3bc27f4748292800f4ee57e3b81a676602a349eb09c42c7aa8a7a65ff42c6572daa86ffda9ae71312d5bcba9e648c23600,1853ff603591800394b344134d3afa681087ca7c5de4de349e7fa9dec841c06e42c100d547ea70af9821aa32de683352dea547b7918681f1bb7fca9f373b8dd100,b7f57bddcc9a5c036c6695248d2a62b3fce1eb2819cb3660ed84edb5ca7d2503312b30bc9b326136b0c7a638923287d5ea199ba0535263a955bf5ddb4ddb740600,a10455355ba1c564610b647ab53abf9ca4f335df9e7882e61944c1f0af9fb5d42a229e164f56cbb403702f08af68be506bf4967c0b5dcb98664b9308f795de8500 +b03484be8308a5,2f886617a972ace61d1418abdda1c8d27f55f28096652d0530b35c69488d0c56,641ee7398a81744fbd6886f31381c0acfd541bcf7d85f674c9f181eb62a24ea83997bddf82d2d00b8c10697ae27f3d82aabee4893a0be024624e1e36328fa4df01,bb2811f00cdef50c7693c40b6232787af836607d935263095509898e8bd7a91b276e3cadcce05854d0855e8a1a17ee00f5b95689ac027c6a72130a977e201f1101,380dcba764b9e34a584838af2b043f56c90156edff9924deb4cff03d3059728a232c61e7b7b36b9d6a05f36a063e2679a07426ccdd32c91c6203f2cc708bf85c01,c70c0e60cfc904713ebb5fa2c8cc1bbe59245ccdab0bdcfc25ef620416a448816af1ac4029c7bfc8a7278c2955fb4777b0ee58f97e0a338fa5ef73904ce14ce601,4f750bc5b1b785a05c9ac49b4e43205ed9cd946e7e9b5d606dd015748f919b473aa0da7e97ae03285c33492878a82bc2277128f2f9d1b3d2ca270bc9ff6c887c01 +43a37653edc265,482a2c245f2cef12071627a28eb9cce6d32b8487fdd35db8cb33c3dc311eeb23,85b241a96ba0df262398c1a12baf2af46362318c960dcc986e04b785921071162cb6508a10ba7c90588254a9c25a0c40aed53112f42c4cd23f53a9f48ae1bc7000,fc928ee353f15e4db65bcec7a89130de9d15b106d18da5a9cc8f8e2696c9618866a3a764cacc52d25cc72f322ffb91116e88de48f2e7b320682086d23fdfceac00,66eabe8f28798af8d5cdef4e1e12beb2dc7273296c284b6f1efb18b8f77e759019fcd00264c134f42e77ce4bf4267d86f778d04ecc0525322b80341c69afc8a601,77d16d993c7e770b15c4bf4c8222018bf86b4d7288972c4ad312c7cd59fa041d13f91650df6107bd0494626f6ba44b031708bd824d8e925a44758b53cf801bb301,a823a4787ec0939add5e7ad3c79223f2b2c9d178f128f92b6a6a7287fdd82e0b06d6af7a5b56001d2b5dfb73a53565dc2f7d4eecbf3a0924793d238facb3efcf00 +973afd4f57eb07,0a435b2aa9f3c93e2f0e6411fa41f5644ec91aed3a679e6b0eb71dc912410e99,cdb1d56e5ab599e991366f50e83920609b001d9b28ab1f4203bf9d1de00471fc7c0d06c323f4f2ed4ee609df105fc915b35fecc1ff4386f671ff611963456faf01,ceb6fa7b294844ce3c6120f12766f8a067eb57f6242655884d7230eb794d12c039719798ab13aebf383c3762c97630a17226db83dd1b267253dcf13b5c1f2b8901,b9fbcc581436165cf0f877073b569b69540f896a835ba98a8046e5b750bf3d73079a2e5cf1f8b355ba6cf87a2d67420af35d9d669894112c11677a466a7040fc01,e4e28b4c12b7234066e5d6a5e7ff131500c9e6c7c226a4ff9a63fbf5a329b2f70950f97be47f10f1e13c9f4f28b6e5b6569e1c9a8a1ad112756dc9574e039aff00,000130329461c869af911cf928809aba07d86471dcad9dfa666ac6e6a506731f04b91aa82608d09edd36007f290d707afe50ad5b475b2c83fdb5fba2926b6af600 +9e1efd2d89c628,838d457aad2a12903e448f9bc23f5d8d7afcfdcb56b77eb241e88597114fc75e,4565338ec3d11c104adf8e5906dbd53ca2514fc4628f6a16b22394b9b8dc373922e2e3b5319f4d7720396f688e7d1e2e40e43962f09c4b18f281950184c862d801,8106ba22295585b1849fda72aec48d4a6763b2ba32654e1e847ebb28889feefb660fc7241b5f873cfb1abdd6d4a55cc805a2e081e21688cd18a53df5d08f892e00,5b34df017228fd07669e964a7997c1855b7bbcb99e87fd689f97e8f6dcf4f5207f74d34f379e1dceaab44c56f82987424a5b82b823f66bf4a9cc39649aa88bab01,0481feba6e000594ed18050d2c3ad349d960cd64828056d359051e9be962ef1d07e54e9acbff400bc3508e5eb2e476ab42b181eb7cb4d39960c067eebd7369c200,7c89a1f09740a9ec432e304104f291fb6833daca6153111db64fb95295d97761349147e394eb1f55cec187e9c498959d1233e2bdcf8c5ac925dcbe328e60c6bc01 +add9d32f29873c,02f1fa8c76737a02ba73c1cf2c7d6e579d9eca85f640be6ec660803a2a9bb115,ad8dde4ea68c77f83c3d599dd5a3ab504a9530521371fec051674df1a67bbef976197b2255a4a8f62811dd44a8df7bbb68f265ed32ed19b7122a1cba2a79a6d201,6d8dd91aa4ff362521fe0cdd86da83487017fa34b208bc1ac299ed6adf71f71f3debfc32ece361b87fad41708fc2a1c403fa6b376a8e438f5f274508cdea91af01,103fc21109417fa704a7476e58de25fd7da8afbe14bc687f56f51849f589d1ab4c79c9d936a064c6b1be42fb1a7fbdba5d939973ccecdfdd2136e7c688ad762000,d117b0d77a6f2cea394567d6df9735dafaf092cac226278135b162895f0962143b535903cb285aac208c675704590a982b667a10f68ab010c2c0a1910d00d63401,c81db14ea2df20280cd5fe8a210ba0ff953cd11a25434168eafe610dce9d58e80351efa8a798ebb19b0d454219913b6502b2a8ba279ed300725608a74291e0f401 +11c5e73750ee0f,bc87f7f5e0c040e5c2784b495b1bebc80fab4090027776759f49c4c7b8169848,66f5c938b23c001e4e92f058454e1993f5651e7dd90dddf01a952466318e18f4615e5660a4791c4e53f3309244fbdbb030faa3580e567fdb1baacea86ec88c2101,2e5933042fd5ee94ee28f42ae3018bd131c3d3a786b2113138f68b472f0b74df1d2e2d267f1503b563ddaff43d11fa65456dec5470eec37180dbbe75207e300000,790d22701507f10f8e1845537f058d5b981c048eacbf8daab7b95597d77a1c603c837d24048917cfd194934186f187239dd28632f6fb6813017394743348a7ab00,9656144e2b101ecf015a529009784ae79d4f6aa7a310fa490fa89bc2706ceb9a5b840aef44787d47c2136ab584fbb83be0683eed8b6b3d49a18fa51ef780618601,bd4ca49343c545ba93fafc145ade76332b2fcd7a3239ac6ec66a5b833f848a6d1d6eb68f7615c2e61d3d077c80910d558dc20a492daaef46f6a4f7b422c6339100 +3e35d8f4edf41c,17863b74443a3632af7ddbe5f312a6f873ef1666ac0110e1b5bbb206f71b8751,b28f6c16b51659cdc62306effb32b39572ee621b4f89376b35e4d42eae7a6ac75f5f54204da1846bc1641a9cbb6cc5de2561f51cfc1764b6b5c82cc0b5587dc800,dfa8b787a81e5274f9259871e85b8b7bab90a06c2ad66b2910529593d91927ed162fd443c0bb9efff2bfb345c38803c04ac87d14fbc87cbcad7db091fc8b86bd00,afe64620f38cfc2703a764d83c2307a1691badaddeb9112629b3e867ec5275f1726a15f68dd9e499039f14b16bd55d7ae786a77562bb01e0f16d3cfd66c68d6801,35143d9ec8f710b16d483a6617f779ff95bee8d290b82ac16d89c85403d986fb008ea04c25432cd342e6a52f3bd4491292a9d67a3d9aeb4223905b3cef18dfb901,65a54d342b6ab513a15e8e9d71509cde1a7794bc75f802d854efc49d31c7c16f051f6c61a142e35955a88e12184087ad543f9450d0ede0d817218789547299c101 +699369b1b82138,bbe9493e8aa8faf0d0f572151b03af53c7831eb42329f251790070ee8e7a9366,03d74d134311e732cd3dc5f0c009b6bb78ef11de840541203bb0f4dca13e91645f3dda6a76e18d2ded3042f0415c88d8998756ac6d118a06337db8d41b8152a701,77a7d33ac9c9eddbfbd558789c3bdb9abc6ec7217147182f0b6b1da20294d36b147d49a5a64ac8d2d99e4253e317a490aa765dcb55038e21b84c44f05265834200,84d7c9d26f1a637446d4d9a72807bc0a6fcda203af410fe224a3fce598392cb26d97f71fc0274185ebadc3d17698dfd8624ff594b6c3b93da9434f5db02409ff00,54ab1ad17fc021123a1de2818cfc7be5d02920bcc654ff3bc32f7ef94fb91ede080ae3a739d8e889f1abbf82d20667b872b341645a09c756939abb9e98fab51201,2bb0919d4e2a1e63a725c7c1cb23fc8e55d1abbf8bdf59e9581fdef569e1df41331b563e765c4f1945de53999148db75a549fbe26559d4b51623e0bc5068b1e200 +016a8b7c7c8c4d,bfe08a34407c8f54e021592d0f88b039972009371176f6f75dced923f2a5ded4,d219b6064f42dbf7546d73cc6fdd217884624c9209ee48b184adb3aaa01ec77c07661addd089499228e5b322cc2d78f0fca76c30d71b7df936e38f0426c1b9fd00,638db1a3cf4edfa2062aae0496bd5284e3a0818aa8a225115315d55c19a64f65484f5366c30eae56a63a6d108e11d4c422abc38d3c09d249966e867ab7c0d06f00,126200338a7ef80d6c7915c21fccc6771ccd9867109f38b3166197a2790fea175298298389cb15b597d3235b30fb9babd7095b89fdc9f1beeb88d13ff587e11100,a8da513d865e67daaf77fc41c8dd478b731d305e1072387d6dbda8c153fac6285de8535af508c7435d1a85cdd9584f7993f26259f0fa2fcd2a8cc8a9ed41815d01,17fdf47298831dcf5ec7d65521d47bfadd417f185b21a0f7e69eac59aac2078615fe868723f4976d29292f31d4b3fdb8ce2a660666d864df75e55ec230973b4800 +05d16afda79a6c92,a95b95c5f1fb573b807c6a996886b6f4b37eec86efc3c45ccca0def7840350e0,9782a48f5aea530269f241b3b1e0fb8d0e58b6986159fefc36dfe93af335e577517d058d2a259f0c07a3acf76a05a97bac233a5222ace7ac28834588e60d8c1201,b4a4bb915314e60b3f9c04f9aaad1348c24b1e09939a338802a05642638921224936f2998f5c0f71d2c3666d7ea9175078ae3bdd76995e41fe4a7f121cfff6b901,a3e81145304b1bfe538f3bf04086e00e096da80811b074c75102c99dcfaa0ca85dd7c346fefa548c55ea6799fad287879b5ad013b88f532fe1923055b994fdef00,7a2ca5ce70aa2833ed14ae96fb5a4caa3673906cf457aae02d7fd1a00dbe777471b8bb24dc0e424386625c1ef59ea25da85fba7273583d19a3d6fa32355576e101,f8ac3db09426def0b7b0c386c99d24581e8559f6eef9c2ede49ce7265afce9177763a7aae0240575211cc556b43ebe831740d240ae34da9e4441b53f93dd3b5800 +78d4e22886806244,5ea9b53443e8ea000bdcfcff56a23cfb4a3fadb64dee2fc3bfab48d69921fce4,b0c2c1cf066037f42b7e51d4ae8a4670d8b4a0cd7215e14f7bcd4be33d2a1ddf0e39779ca3187c330c994f4dfa8f56eca9c80976f8c8500e8b15da8d59cfda0801,6ae56cda5e0577cef03e3d44ecea7f63498f99c80e49005c3339d2f07115d30449f124900110edb9ec5ed6cf2345d3542868401203892741b3a599c37520279800,915eb90383676a2a474d941c8acd79a44e0c1fe83744137b0d78855107fc01b031c841b780b2131152e355bbd4f150764df6f8dc23b10662da21f3b6db27476f00,b6c2097d48302983db50b44c128b12b491df446777dd59fa087306b6de65a96610e34bc5e4fd814abefde19035ebe49ebd57c89870814715a5bc5d156fcd86b900,2bf35d5d93c4b5a9a71566c3b5d443b90c33cf8e243d2e845307160b57afb6677a18c355376e7b8d9efcf4d027e96f058734dae56103cb680083a837521088b001 +37e45bf865da5aee,a15e11e2ee15d95f733233809a6a974571ecc3edc2a333f90784f83e276d1e78,a06f360faf2becf3816648ada37a7f3092f8f137899115da2abec5c892e2abe00b8de6fa9406cb31e25e5af4bfcb959259e34ff22782c03da44e19a9474faa3601,efe9b09c0be42ca79857ba8cad111fd288a08e97abb1d97591c9b08e35051f2946ed40d2c1b1dea95ad9e8d0aee53ff7a8dd8473a76767e55a4a5064e557269d00,4cd6c7a8167e69d00ec886eed3a7e4eaf9901aebaeb524385e6ab32c90fbe3a9123d77103c3e9ea11bb9d95666e927ef41af7fb606b0b85c0bf33ecc9a49180d01,603628f4325e323228ec660fa588d6f88f7f3b21fbe01b57b32b2f87227400a01a6973dd124f62820ce761173d1e512a63d7cb1c5cf100e7b9a2be3e70484dbf01,bbdb746fd17904701b3fc29fd7a6f502c59c9a5b7bfc019cbf2cc414fa3c43444e51aae4f125d1e108a3b5a6d131c11a2c1d69e719704043710ed362d7c95a6c01 +122a589f4025894c,0cbfc222e50ff63d1e16f5bae0cfc246a16cd5a44cc40b5d99c421a41055ba36,3d6d8fb0db50597c9e0a701b5ca67c858613eba18bf417329cd992ab3238aab67b52a17860a06d913df9b0e7efa16674aa2f8b1ef2cbd8b2c03ec585b841a09401,d5ae5e8453cd74acd0c4e067352bf1e018ab02347507f88c6d0f168d954753d952e3f073c31580ac13c26c89e3e8d2ae52d25b2ede62fe09109dde3fc3c11c7e01,410289571c96d7a9a4ee18cd479dc5077838aa010892c821981be0b3f8d721cd26641b245e2a27bf820867fe85656ff95d9464a5a1fdb4d90416accdabcc9e5c00,358ce0fda341b32102dc17f10899654b9234f50684284e8cac27626e0d9aaa444495b9a4b78ca9c3c0fd0fbc3f29b09332c8f60c08e12be2ddab4c4454d3d55d00,ae232d41384af4e4fe2b4b8959f3162cf7c89caf07f94fdcc0092967a7ef292d571b03b1df7163703a7c977467ecac7dd52dd4f53e39f0006bf1b5a71029344400 +a0d053eab90a42f8,55e4b95dcf35409b911760e316f072ce3d193b49bbf4b9eabd867a926780731b,c31b09f175837fc40b3b03e7678a0c677a478551719d201f9b28f66170ee699257aeca3fa253a4874a88685b2143eecb73c9b6c6bc3ddc1f88b24069bc77cf9301,6965cf06793eb94d266b13867fab456dba929935c347ed0535a428acfe2600af47c065ad065037733f1bdf20b8a784a832beccea90d0d3e282626f63803a550d00,31086ac57181788cb4821da2f9736f054858100ff5f422e8a02ad930c550f72c1a588a1d966f69f3051d51d8f26ead6f52aabca7ff577c29100ca5080e70516701,75149d36d8621ff4095264ad40a23dbbc5a54a9d91a53deaedb4dfb42c8413b1199c84f5b499fcaa2106862eaaca000d7bbcb06717a5fd5512ca1f1e555b5f4301,f8975bd4efa3133207a63a09ba17fa4f5711e5fc71ad596435ae3cb3bf9b16ef031428a0c7422bfd37d02cf9a6a4f23cc473b68c9cded9c251eb97421ae53f0c01 +3fe6dbd104f74362,7c3bbbb2ad96fc9a2b878ffe691870c2b72a979bb49e23e66e8c746b8f24d762,ca3fb3057f3df83f4932339246b7a4904401255684661da472a83fdc246276f8522f0c4d4ecf1f1a81fffca376aa56df472f99dfb2838ef059f9e95d78d98ec901,3027eaa4effc958a18e4e4f21029e4f81a7233f48e15f64f88869f7664e0dcff5e1e31ad13fbf52731d68031ab4e152417c761a5af9e869d3f5a35ad76a0618c00,b24f2c4f42aa982de8780486127a2563af16a2b47616ef63525ce6ebf777406f044fc74a73fcd1e535ed00b74d8e4d5ffa7e58cc1e20a543d8b33f8973a6a36300,a22ef6dd91ed5c5efc72878598ceee8082b3a3cbfb9fb24c450b3bea826af8c11a826b3226ee3be1ae49ca6cdbf039ba0faa5bfa98a32c40374231f23382185801,63915773eb3aad04280ab8b7c460489de0a4907140ebe3ed4bb294b28c2ac8921a07e6cbce16da3b5580d973dafa269144384e07251e8663efd31745c9eca23d01 +c91e7e574afa1c27,3916df559bbba8a35aa6355899a8b8dcdd4c1b90c7bf07b7434f40eddbcccbcc,0919b2b5650b0f89308b5e08423ab7b0ccd7920d3dbc4b98521bfc2ca1a5aea123118421d3087317f280dde8f7ab2e850427a9ae18c12646c400c44d206c521500,995a29dcb55d62fbc71aadc4a5fc6e417c89447770db5586eb3eab360dc451e24b4bb1943be161e1745ac1a26aa8f59227b011f07a8aef63b0fbb21fb3f2355801,28bfa656230ff6572884a682388584f7cd5ad71140c2b7707153de6df54b5ed04d613ade7a70cbdaa91f1c40b18a9393eadea8141c92e598cffc6b75fc6d988f01,cc9d6d0f97637e81710c7f90514b131cbd74d7c4be2db932438878af964c8cbe0e0f696dd7f0a62daefec45a757e1c4e982483e85025e00c3651d11ba460202101,453698f16562d57a99c36478ca6950a4b05edc000d4f672d4cdecbed95dbaa5c1a211fdedcd2b4ea66493ebf4413fb5f894d9e1208eb8d80445b7cdae0e5261e01 +ec7e4b0cfe12420f,75ae70d5b0ce30a8769a59240db76f7b9e5d581dae86434a0236754c77616a95,22953fc7d8fd812c891d00c47e876c71f0e26a6cee9e9209f0d6617a86f24a0c22a620aeff2361155ea0dd3b8eb0915b150b2a98193a63c847a18f3f3e970cd700,554899cfead82e3c1aabd4849ecfd9a0a8165fac16ca3fc1ad849d95df03837a0eb9ae4fdf762c77371152f2e76415f701b411167116c67fd0729854f977452800,985dc3e01bff83df1639dee08115e088a30e3a152d1465ef637456577275f95a732af9793712b8e96b5b4ea9bf19db9c9a516e3b3156555c8f94511003ccb17000,3ab4fd050529d0cac8ff4a7e3955f00dd67b7ea8668559f4017687918c27a1ab1c47342cf3e0827ec634c9930f748e1bfb8a44ed88b7287aea006ee182f21fa400,7a42263cc96f2397fc514c0e8ff11038607354f5d8c14866012a9f9e01f33ab81c207f0e80f30f3c38bc3bd14a3d5f0294370bbbe509c6a7d24d2a46aa9af18001 +4efaf31a8b3190ee,59df6b9bf9c1c4867f7654a3a6d2eeb9fea51f91c743fd665ace8a4436da259b,5a9fa91d61841471d2b68ce2798d22440ec5faa7a873daaa34ac3a1433dd95d90615ab189cd4fbcdba26fcdb5b7bb6c428f32d9dc0668c1387c9f16cdae9f12f01,0dc2774194a16a0efbde4d709f2995181ee5cf1b4bd0da8e0c8511f2dd8a940a23236abf1ee23585302e1daa906c9ceed5ba48e88b800e0a92207f7f5b67a2b800,ea303cea467eb810fe2b8735fa97598f2159a95355721673cafdf5dd3b9ed8ed029d3b05a680b3533f10e6f2b298ed29abeee59205e5dcfafcd36850be4e25f000,f6487b3b6bd234d50634325ab04b3589d3b52780af6e9d491adaf986ec923816419146ff6d07274bc8d0ef12dcbb1a21d031b1c2a10d0fdb2aeca3212747d1c200,0e66f6990ce51476d92c6b7dee8b2f414549c999c314e6a2d8f4b434bce4f60c025be9b45c4fe10bfbc5868a559fcb5de100ce011c10f9eacc7bd1b9dde3c5b701 +4d456f1ff9513ea5,89c54438660f7100605976aedf6ab4c686c55c59b5f2684d15fe7c2515a1dd0c,20fdf9e92d1062182b5e8ef5aa4bec8d0a3fdb28b0f3b6ee6f9a8251ca9a1e7f55395de6e4dc19cc52719a2c5f7f6645a8203444697be8135c3743f0fdc67dc100,7c97c36f6acf1a129f98a9f2dd22feff37e7842d5986018a832c09625ca14ea803ce35502058842c9ed11f08473cafbfe5d055834cc8f814b57d82c89f806e7701,8a71290576c37cc5f420a1d634f444f1706452f2e6c8dee4d20ff65673a2da0e40c2451415089e1c1341c6bb288d619294cb0e210382105f7ee6b5d5431e19fd01,79a8da2e474f4290d3812674612e52a66dc3b36263929d83a087a73776e7a3b00e6ebcae1ebafaadf6b6ec412a7930d9166ba1dc51c6828cc4a411cc496b19a300,67a491224142583018119d8a85f72cf25ccfcfa162c851df4178cce8e37253b00fdd8196511fd2f31a313af1bd98d020f4f909cceea2fbc13780f17ba9a705d600 +3dea18359b8ca9f11f,9ea3f31129ca27ececc2270cd7781f4f995f5a6d541d7d52fb673e6214b88a4a,663a2831a7efabbc2fdc01e22c9d1922951dceef1174273c855cc845bfef4cc61d3cd2cd2408e1e4f7726c7071b550d294a84021a1b4a2130b866f444a441f4901,342fa45eb8b55d7406ba4faaec6fc70a2598bfb80a9b0f6418a3f75772eeaab57eeac70f4a5f6c34772644681a9c66722fcfe3ff4c44da6f10eb7b74889a6b9200,eca127fef1b780e184a99b6cc128c046515f389f109d82de8a035bd5713feef271b37cec56364b4f0a97694a78f0043bb763839ec7451327329a6eaec4df154500,43f7ae833af34b495a8f2bdbe66e92a72199845206aa7e9f8dd1f10355349ccf02e3d6fcfa445afe75c761a604399ec8ac4d889cc458ba6c68123583cc99b90a00,3867807349b770e83096756ae090e71366ffdf9a66927ac8d88c1457cc4696f313d60ccb06c167dd992ab8d35c7c48b1a9acf28325c1d320ecf0450122d9ff9c00 +1ab42735b0c17667d6,23d2281ee4cb25b211f524c59addc77221fc7b961da3fecc79cf7d80fdb2ec0a,0b4f6cfb3fbab9e90f724713aa8dd7ccafcfb375587ae2ef30515595714a01fa023dca8f40107bd4d23d7827dd64fbdaf7585c1ba2ac8052759af2428e7ace3001,8edff8c842b47ee0971cfc72318d68999d8589754691e59173efe76e5a226f92790340fcbdc1916478adbdef23cd0fc3c5bec6c69a9cbbbf6392a45d13bba34d00,ce5b577370ad110d91f5c43de57edb4495a8b04fb701e9ae38928bd9ab556c92570f53454ec5805af7e36b4df5997421d2fd8cd705cb8ba762bb9920ec87a8c501,dfbbdb55b9ed448401bf235148995ad41a49f3fde4b8983866fe3aa69bedcc3638ad613d9d12137ca8349ce773d22bd332d2a16fcd6b5ce74d7de1410d610abd01,e6f7b8025e5e07273df739053b632508eba780b9d9baf813ca20ed4ed772a82e3d98428906f6ccfa25f3027f597846716a6369de7241389b11302ec16709b3a701 +f5a794afe1687fd76c,46cf77731870f8041bc16d9079e710b55e1f83c0de46e7797c9c779fd67da82c,85eb7b9d1da2032a8c74943257b1c06f820c500c2a0b54047989bd184f6d571618c68493f04480e49b232fd5b0af8e657fd13d9539c9e97511ef5073806452cb00,478e51af0b9bbac790e292ef6a41088445ca67e53ce1dd8fb8163de2f227ae9827bfeb952526cfe56b89e00141477adf45d3ea54d459ead02f56c49eb36b17ec01,c6b660b3245612ec4e26e610384cb31cf5389443449c14307d51706c167717371b1fc9e1f840044c4a79007d599fb7ea271a21ac89748975bfe76faac4e80b3f01,d71a737e30f465edfaba5a9660ddeff86439f693b37131d9709e1c8ac190f3090e2c4e6cf5ed833e3b5cd7f5a7f36563340ef95910370d021c4f8bca206a18ac01,df745523a16fc9b8b4019a6f5541fc760203aa6dc220762cb7f7a22f917fb7716b12ecb743d1c8fb694236cd1373d4cf4f78693c074983019f32e05036fdad8500 +4d8909438187579b26,18f06c1b3729d65fa813ec792dd4b619cb9c9ab843b43fb4a3b1c83b13f1dde7,3b27ff5598605287839ff265bdb02477f3f0a19cc8da65b5dbd416d16c2ae16b32953421b36242d76a8e0e7ead76a7d2f3f0b679c1ac39276f07b946efd7c60b01,6d4f29eb87b2f38fc9305a2763233e3af1c79580d57ea6a0389f1648cd7c335706dfd7ca6d9e3aadbd68ff35fd31b2e8d451df8cd373db109ce0017e9d4d777200,ce9e274d2038b3cbaea5b90727f779b4f0b3e70048dd11aca938b494ac944a3e7af0d39a08b667bebc5f4b8f8faf54e09a9c002dbaf9122890bf473e8d4af0f201,c1aa7de4c264deda17c8c526d7368e5d8cc39e68e8142f97300f2981ce15cd764fa5fc584b29ec4d553207f51ade67103d5ab7cf2514483f938cf14a6db0a4f301,c8f5a3c246305f02aadd22069dab4b9c64803d02f773b277869054573379b342086d28a30ef645e377e66253caa274dd4fea8b3bb03f830ed60becd2e11f6a2901 +f01aa9dbed39422b17,3a64709133b98491bd76b05a785815a9bb5f59325a1b68b34f6753e745962988,d0d6a83091b04def46d7afceddfb8914f9b7473a1a7365d52ad7ff45907e60ec7ee42d4d4b7c3e4968d354c9d8803ebf74b8ed9a6cf85b87e12dca8901a04cd201,2e436d93b338286ee8012ec7956ee9ea7ab558615320f24825e6a395698bd8364524d04eb7b172d6433be7ea0c01a2bd471e5075bc1b37dbf626416f25f7878100,9c7df18ad74a32134c268cf354ca864d1c9e5bf6ee4844d4d48fc1ebbe7520c332b34013c0062290a8d2f2073428ef6f8cdbf0cea4d709df2b5db6e1965444bd00,c3ed8ce9d91d2145269e7fb81bfc1128c1c857b4a80ffcd797eea09316fcd2524f8076143ebff7d582e6dac036139bc14b99f45d3c71db3697b863176925268701,5ded073a7a395a4b4daa63d09584554a31433d878af48818416a7651f26e669835e08eedd4fe87769d8c1bfd0ddac49e906a3cebe8f4836b9853cfb38345cd7401 +0f3d237f161b2f4f19,ee6cf220954f41faf2e6f0eccb240b7aff0ed5f758624ed2fa50d24f934ecca8,6fba7562374c7d1899d2d02bff1a0bf7854021f0fb10c6a1bf7984dd5f64f46a102bddede16e6196e91bf450808b24ef2bb3a04fa061dc1a1a244ad3e04adb8c00,d8fddea907ea0b56eec100d268880716f8b7a60497eb1e37befe3e48292c27c91361420fb19bb111ea3f27d26b9b6c0bb15d855e302ebc243affa31b8ea9a2d801,36f0ade9743c10751babca99876809aeb5fcb3b4611fa71848f3186ac405661b021016e8f8e44b6d72afb0cd4a1199e6aa6f9be6ab0781b44f74726490158e8001,7793e2015f05a9d77cbc32808dd954b76f6653bc6b2a1a8d50446988d087e7e77e263fcaaa3e8a2486c895839a814139307747d2e1d4981ea137b65cddff05e400,b48f974cfc1f2315fde6fc0822ac0651de4f709959f6e49c4866144350ffa0a5673b69da0576a1d4a6e8361e981fc9242eade7835131d8f462c9c9833323990601 +fe08754adf5e4e7182,6d3f8948308bef3796300415a2d7334277bdab706bf264c5ae5787d757cf397e,e51c17b710163cc8711c86a64997aeafdfea9e0304e7fd1f4a3e59dec98579d208a571b1fe051aeb4a43cb817531bdc970f6561526895dbc6fb5245034bc6f8501,ce484f19a52fdbb33aed04a82b346e4b78a6244a7f2f5f37ff89af6ad262efe07e759eeb868c2b452568085a79020f0904ac4d1c5cda1c627c2dd72cf8f3d15201,56df4b461ae68a2aea34bc063983131a6cca19af6689ce29dc720d3d0adec7db7bb1348751e8925eb47c8a7f917fdf0cda054aa73c9b31383059313eff3ddaf301,4796c99a199cf14473c2e66841d6cb805bb19ee80a6ed98cfa44e158b00492955997db8365f668cf53f068f7228e2be2544bad360ac0d1ff0e876fbb3ddf081c00,dbfd0d01f222790d528a3855fdfe933a3573e4832bbe78bac68100e4fd4c41896372a8159829d1a43aeabaf8d866d46f8f1d71c71e2051cad7be43e8b93b087a00 +cc1188c4dde62e2e62,fb6f5b53965f961e4000f42bbbab82055b5821cdda3590f7c69f5455e9122b71,f5bebe86a88e241974de61be84d721160f3022310a5f4d1e5f7ef9d5b83b8997786ad819941ba8fb2c72ccf212359db41c5598cbc543707d6da6d58a79167fd801,307761b97deb1a402c47ed1b73e78df4a3d701c5da72110a06d09aeca4a2e40906d011a27715d82c885f54464acb3805c557d824ed953762b3a192a9a08142e300,5b528a4ed35827a60070952abe30ed3cef4cb4d6aff6fe1bb0ceb4b5cc6625876b8796f45400c772efd121f13039ea59b7a5077ff8a1444bc738a0619919309801,b54253347ce91287563b5eeb59774ca6d1de6fa5f1357f1540c566212c290bd51f2df061974a0a838048d977897f024cbf3e2ca8ae035aed352c6308b3b76b1800,1859c9069d42a5e842c3d6ad6d68aebc0cf55d948ee89c13bb1f1df9f996615d58577e63c7c0215bdea8840c99b571fa251975b2e944e11099e2d0bc50b4a32000 +851509f044776e4316,f22e80e7b48a5514c454ebe836b48490c990eb1c6b33b62ade09e2726435894d,f1c19252fccac4e9719982ae799ba1f96c4ecd3b0711bef0524230c478d36d8f258abb54a464a4ce7961d1702a6af86f3956644f3b3531042f3d7eaff2f6ea5f01,8ae78faf214dadc5bcb1e3a6dcb7f95863469f944e12ed7960eefe6b68496b323ad33a61eb515c2241e4c9a2ab610796b0445d2959203e298dd6c656f572dec801,4fcd7b5e8c9813905b4cab4e0b357cecac49688c4fb5d32004e108cd5652aae02c5503c80bc70ed1da4b954f2c63ca7b80e6e463a197c4aac89410fee840f35a01,54fd90a82b5c55ecee4dd17be4b9d266bf1bf4c8c22915a671b7cac5d61d24a01312048de90dff3f64a55bc7138b52eb7cc11d00ef4dfa3713cce7124cb1f13001,d7085c94e0571fc6fea6d7f76dbe09add2104f518f0460a77f4e4b41f6fbf9b4570171d6165a7052904ff2560b6b8db5104c940ae2c34023f99b15d06248349c01 +dd7abf05922b3c3847,e307f8dc2a0ddf65b948fc9453ee683e5593916ddda484384486329328f7352a,4ed0d99ac1eb6224cc8e224268a258f6fa73e4afeab3091c4d0453cac7216c4430b4f80f24641b1a0bd729e34904895269bf8fc76cab1495aa27f6af5f5054ec01,15068efd6666462060b763dcbf42722136d255cf3e7839e2f74592e583733df019bba6ee89f4cbe8a09ca6bd6bf910bfce9ad5f0e8a3e1a8e9f6749723535e2301,7e5337e77362652fb9607702575938e5c87a207e5466a14147405964545b340e018af8b218770e5eb4bab09a47689b3c234b7dc9ca2c98240db4d35fbce9056900,8acf2d9af43fd6e22ef8dad93c1cf49c5a6156a17cc014c9e5effa58d8c6d0b60873f7d364f8ebc26bfb76cfc8e00b2ed40305848e06a6f7921dd24fd5e8690700,faf65e96944abbe0d6f820699041132b89f7ec7e22e675cba4bd4f637bfcfc116021933bdb627a6de29bc8624c77bc22029d4309d4f5996a93c03a822e626f1f01 +fd6aeb76a1ef24e1e596,36f338333ed33b75f04b9143ad87aae0d2a469bd44f6429a9f09d7b1a8c9df85,87697068e8cf179dbb5afccdff06ee73f6fde7ca2b95eff6f46ab0915ec2fbeb45650a1a08fa73de90f86525cd1a785bdb52cd649e0134c501b7b454103cb33f01,753e7d6c0f44138b752dccbd997f2bc0f34bac7dd5d3420f2f55d266d760c7607ec158228a69bb92b8b71798f0b149f0fd1c16944aee6eadd2010d5057dbc7a200,2d2a62b6e271f1c993453395915567b03534b0a7a229353e131d408f2852dc13327694bda90ea363ee52f0f4228b4416646b578de3ce243ad4cc60e6e3c987f500,401cf2e34987b16a6c2953edede6a3ee4c0370a57c9aecc9851b74c76f94d25a74ba0546147f3a75190cecd05129992bffb1a1b0a9d4d6724b0265080594de5301,46535d912280102b8b0b4fc6ac8473b1a8144fcf1bb78173c8d36f41385417eb6a43a31533a961d603baf1e49245a6ffe48ec316f655a25c2cca57911e80a74001 +fa03fc81b01e0e0c400c,8189cc7d0f22b7eccc20947eebd06bfac05914246ea57f644717820ab3c80e96,c3ce5a57caf75e31ce02d8fd9f9489cf43148e32aaa5c2eb8c8b33a675274831681046479d057714eea93a7e856bcb4143305fbbbcd1ff38785f60c9ef85894e00,2e698e480a39f0c802b7fecbdbd0f7f65faa1e24f0103a8ae5c366edfcab08341e9d47b09fb0ce3efb8a9b6948b8193f17afa4bb722a360cc14da60aca083b6401,f36b49e4edb95cfdd777cfe89b1667a28c543d9b30de65a1656f05fe486f67a3460443db6f43fec0d60fcaedf05893cde697d1b1d3e9f3fa0a988eb95a64267800,6d38297f4d24d850b9352d0d7d7fc7375cbac1f67ab464698b7ece2230609f9a0478f52a568b188647ff78e7f6964f634db3354a4375387cdf7e0d7df2ec25b601,181df81f18ee7474c442dd2ad0166d2371a7f94f6b657f87aa97937574b22d0372ee507b4bf4639446d4d4d4197cfe6e3d8c477f206ae43f5b97fd489fa5e6b000 +78bf31cc4cb3d1eea355,924216859b757306adbf49f549bdeeb9ed33ddcb945f80b4ff2e7ec402aca7a5,7de70309cc90a33a110bd534bef5d1c6230c8c8da2da0ec23146376085deb1963a72978da1675915946650ccc0bed333598923debacacf98b694fe4617dbec0300,06d25671eb0261dc33e35201d9ad8ebcf5db80c7d0629d6b1ac78a08323054d766824f769b85ed9deaa9b92a75185b851db73f17b2597a202f9eb687c2f61dd801,6a523717ccc3e16759eb5463da709ccab1788e3fea0cfabf9fedd8f4217961a44fde8c6ee8a75d445776ec586d435d6e51599486192c41961d4175625cb8ca7f00,f7b674c7453f2cd7f5f7e70866ce507a630bf2ef279a0e02acb53d81d20741d0478c296f988b5d3f93a0aa0d5625a39351d022de2b654b53d6534c597f2a102a00,fb15a5ab5dad939a6842aaba937f2efc7050b89ff1db9e88e3e27926ee525d6c662471dfe326186f241450f09bbfd9679b84afa06ebc758c5c6bd5c88a4304bc00 +d1121a31d9b547bcbd7f,4b92126397fb78fbbec08ad9e20df6281f3cb5e19d85e7c73af40440eeeba8ff,dd10e6a45f0912a7b6c2fc3958ebc08edb0e1f5780ee25155289a6950f6f0313220e2435883c1a8a6d8276c7721848ccda174c705305741de03ae20943d519e301,28530ad96afa17fd55e16db3c747a1dc17a3a739eded3ac989e4c7d86b780fbc4c7d82f742d58c745c6c140fb1ebefdfacf51771f1215cee4b7bbdffca7a105901,a5d16c4da0a4dfc8459621a57abab31c6ba32765423d101b6423443115b8a034700b187caf05ac3a60fc46a009969a60da45e25833db3687d29048d23b5a318401,f47f8abee2281f79d7fae96a5c9c62b3c37f9438bd95009bd3578940ab509b407f34d128f405f961b364b40819e668cbbda30d869e03275d1053c41357327c6200,e3a9eea731824310171cf5729267770f29a0a1036325026cef5d8efa0feab57070e2c8cde46eeaed2929e5c0c3b5181fd6ce0a0b0ce77a93268c836bf43ac2d700 +de39dfad6c59a8d1a9e7,a936970d491b6e6ea53f1d24dc3b317d203f7e411df1c2bacc88acc306d906f8,ba4e4ea68545d9a76c9d6406367ddda2a400df2689d58583fe5e4ce8a4e0b4820a8b24129883652dc3238de14ba6f073cb744dcc957a8a8bbe4830e5e8a8cd4900,108f9098b2e32e418bbc0c7062c300ac72508390e93a2c284a3f8fb1d92375236cbe227c7006173577a1cae11c4945f166f2539db24f721deb4596c1f7dee83300,a516115907b4046d53c0ae48164e87918653cc51b8bb9e87479655d1bb68d28b1e725eb95a8efa66860b00a709186e0fc572eb895220c059edd2e6b93018209e01,1867ba49408fec9cd76b52137763e729be02760156480a7374f70972d0088bda016e280108065a0977c3183525fff7fcc47570bf3a83acf8321326920b6dcbe700,38ac0dd6768aea7de69e66d28b82a3e645549815f0893af59ac31285e76301bc46959835d9f7ced4b6cab76114041641eb94f70df6945da9f9567031fddbd72e00 +1e0cb2aa021e499a6696,33edae95093c1e3137db8af0ba5e5771dc3db639ede2ad8f04314b01efa74191,b8b355ab0fbb651959167c1ce216f1095d0f8bad133c56342367a5b4051cfbb04c7b27d52cb325923774cc942a8dac222887a86727effab3ce3a48107571786601,7ba42e222ec878a2f250c286bbf0d288fad77be60498ca0c2d181f8d7a2272b121c4f7bc90affdc1f2b0cbdef1e5c275fad71cab95b30332d0bea664814ad99c01,a5eacba66516ab211ef48a4cabfbaa55f98ce164d7b8d31b0b0158b41726e73a1d1be29be5aace9498faf7b732b1d103af6e16241bacce662fe1034c83effda000,f67ee1e4190d2423bfbc4b2f9e5763ee8609c496d07e6c0cb7a2a8eafd351212466265a19fdf9619607960450b0bb4559ce81a24c103ae4675521b1a306163ad00,7f5bbde06eff9256cb6000933bec894872ef4094c0c10833a1665eb5ebc095ef18578e548a69ee124b286b389bc7d410bc38d34370863b76d726eef43ca2c66f01 +17e08bd9cf85dfb76ba0,5d7cc0f22970caae2c5099587190b3c008ec71a4c4072fd0ea31d272a3676cfe,10d75bbb6c4f5fc8a41838a66b8125191c53b695042ea160f1591feaf52ef0c66a252451e73fb2ff277eb0d14ee26b152288df81caf469b05d24c783df572ac200,84099c5d0f0efe0137a04dd12f319efebd3a2ef1498099d5b4a54f6ef061bdad3571d5da9717260eede4db6c47ba26dca039a91ad2325c6bc487c416b288c6a900,76970b44676fc2f203788eb313009109c141004a09746c368129186b04be848d0338caf84340a89a0af1215f1271da2eb97294bd3d9faa11bc18d5e29d59ae6d00,6256533bda216b5823e764da8086cea09ef10441a5dff22b1ddc456b6ee5a321646d0dc00b48d870a3048b94fea4c7efd80234d1a05698d2396edae0baa1084800,bf80a1a59e517499a3fc7361004820dbcdddcd23eea1cf2d343e4bf948ecd45d13e3eb18a2c05b43231ff08b312652495ec9e686f5c227f24edcac50a79b95c900 +223fe27bec3094491f2b,a4406caa4473afecd8948ebd8427c1c0e9e5bd5ba3ff5e054b144ed7b217e395,55a773327b269f266a75b0e35374fcb055655a6a128185621f284ab5c0babe7b6685024af28ed09929b58a82816c6a3f067a37d685f119472876bf739cb4ff4101,b14a6ba353cd051db613067df523e77eda385ef434d57c922398440001ebf3176fe9c50d78ba6558b1b248a26d8635114f1c67ea8ddbe6efdf4c49a2d5623de801,a452a8567070e5d40a84bd39d86e45f1d8cbb161b73e85ce96666ab18de856856295d347e9c5de5d3e89bc4e3d85d12febb30fd7ad95be44b844cde5724151d100,9fa04463d0dc5e1c47d902615dec278ef653d1e09c1f6b73347ededcc5b24a7b01f9f8dcbba2fb5fd1bfa93e4e81a7af6da3d8752bb7ea436cd81851d331333201,c70e99ca53cda4a01a01258b785b42b178a8ec38d7a3a6540ad58c2d35d8037b439866d95a1962ae64a191611dc5c58094307ede7310a42f8bc31ea678cde2bc01 +3bae320634e28fca77ad,83573cf0b21078e46522a01210fee475b29ee0e2a160aeecae98cb80473f0eee,1f7722747e001d635aba38a6a7e7b9ea5fec8658f7aac1198b1489d2a238232a0e36a4d09a958e916ef4e9d174a49bf9756734b6fd5aaad86782049e691b26cb00,357d88744f3dc3f4b9b5b5a51da9d4392cfc27ce94093e797a64e8a30a5460e02175e69e9b57bd24ea43e738255490c3c6f4f7a976c2f84b374f99911104efa500,3f1282a204724244048b1b7a3a2c91ba3e4de317cf98724ba6539f5c948c533a62bd8bd4193cb789e02714b6b6df987c2b9af1f3b75355ef3bd5dce47b92b9b400,e4a52b9cf2af3b8c2488b3fa9701e47e974ffa56d221bc34df6cb617107049c3556d026961387dc58507dc3c90c6cf47b5127f8d6fba4085b11f13b064fccf6001,b736842e4a5c7119be7185c338d4b19ff1555dd778ccb131fd927d085355f21e486cbdb97d0a70d3caaff7552a1988a78817e7d44704ad7bc087df285dfcd08300 +2b0c80dfc064465e8eee,79412c1052a91db4e2195d15391bb015c472a4b15cad54a5aa6e2aa9216717ea,743d0ff305ad44054eeee9f902da4f6fe8484b0ee6a72dba76b84eedfab2b4046725322265206e15e587f003f14ced254394144eec6cffa8e06c69ee68ff939601,2ad4dcef9aacc9d9a9d9c568a6b3f73f3f7543d10d48af3f6bda5fe33e611a5d740f70accef7e9bd687f1c4dbb574977813d4e8b7761895ddd1212023688421c00,ee814c35bc0bdd2c5344a105cea160e995bbc5d141bb9a5ad2417fcaac75d2de1a4395c758efad7d34bddc05f9383105bddad3005d8de009389c60c801916de800,adb6af3c87da66ee37704255054a40b676bea6a3e1db1c3036c53290577be7f01a19dc8cc5fac2f7ebcfd653b338e06644086894568e93371a491c52d7d1358401,1c4cc00ada704b4326637102f2b42e38b19652d26f75f48b3a6069c5d74c83546305bb1ed70396e87fc8f5983544ba40a45abbea85dfbfa22997498adef8ddf400 +38ae5019853aee9f27890d,e60b5e8b5209e3794c55681e0744c3fd4cdbe2e56c6aace5bf16820c391827ae,5ec7207198363bcef3f3c37deb32e431ab42ece641267d7db6550117a51e563409a578e4ca7adfe67bf18b42238bbc7e9e7ac770c5aab63135019d63928b166a01,48c7bd06be4b5c080ac1c9ed5c6e9a24f788a1d71a24535e869d135c485f357a7f066fb46ee5e9529411db184b847879d3514cc8a77c76b4c1373d862053c02500,b761d9443dcdade767ba6730eea2c121456c993c5dc4d0aff4bfa7bbf94080341fb1bad636f2d67bb5e71bedfc7c0bfeafe0cf8a7a046ae2752942c170b67df300,ee3c1e9b0c1a9580a50b514db1ec0287febd44e86cb7033f7bf6fd7cab03816453a68b1398b9b82fb17da9924861ee406fd20df78fda2337fe7d278412958d9e00,7b7b00ae1c91774da7224bcfd834c5fc6f59c603bac6a95fbadc2bf112d2b074771b16abcb6b5f8583cb2621c2c2c1b7a571f40eeb7753fe32322961af6d71a501 +9e3a83d2431d0d44868a23,e3fe9b3c9cc3371a3f1e30a0956a29126ed0a03d3de856363eb8533b9868a255,936cf7c646e3aa46ff1f3c340e1c27711bf2347a0cd70de9f69e2485af32953469dc23711ac23aeb620f94595ccf26ad3ba05fbb9d56cc7d571b91f8a3cee3db01,5cd1d33920e64ca63a7e15ed81f9922f1116eac2a7ae223754849aed2f8630631058191eff112f0ee5ed0173c8176f43cb87826cbbcb1da9ee6643d836e3c5f900,e9b84d5acdb89f918d0672e3826e3fad86dab57bee05310356a89b56ad83808e3f95af9a752dc8fde02516ab927b29415b35f5a8ac7b39cf084f014ade2ebe7501,d04874d995dae0ccf2170f259e502932587afb69299bdcf72d10a9ac381101ae03709a83c3862d4c4e9b1ddb2054270cb0da22eb9fa83e9049f0735965707a2c00,926f3931b6029e78ae9bce31f79c178b8e0b66e0de956d3dc4cbcf56835a4ec311da7c5c64c7da051dc1724bfc95ee5b260b741f21244d7f31225ad8987b191100 +310c802317462ae6955a37,16ccb7ea439cb7456dc0c3f527d073ee66821801933226e7d9eee0774b2b4705,320811b6e68929b1df0562a6601e5b5983fb5ab8b4c121ba4085678babf2f99c6a257a91a87109a64f680d4b37411dab1a3078bd05f1ce4954e7bc86d6e4289500,81e4c408e4da2b5ab468df276a4211385f8e03cb697574594e0a9b754ddd0d637fe318bee069f8723a64b53d0e532a0429d5ccdcae66530726b637b880ba4a3401,15e219e430097def9ea774816b27df270394217ea9e96e38cb3d01ee0dddfc0f25ff43986355d7afcba89cbd4937b44fe0ceea46264baa37a54b5e4d610eb24d01,71c39b6002fb0668e706f016c4616bffe8184e6ada0b3d789964114df725cb537186f2138370ad89516ac841ce32213472b6f6abe8a0134bfe6cef49534e4e2601,8e106261e9289bf50d7c77c6a172a7e4248967185f36eef2ff0e5aec101ef47d6c23e2c116b8636b486fd3b8abdf4e99b02edd7b503165191d77234e724ed9e601 +e9cbd19a7db5f0b53c2457,2604e625ef70836936a4ee7a67761d15b2b86d37a8a441cea983ca65bb0ac650,e931e8d42911294b27139545698d06ce7d5acadc596761e2d9f4e7e8ecb61aed7afdc83a6b8ba7cb4d5bad45ab56c47012c60c9c398900708a5987d92081d48f00,6df823d0146dee5e6950059346d79df6bac1889b4e4631ff6c04691b63163fcd64a4e01108ad6c323e2cf3727be844a3c3c9a6b8cb1ee7ddf91738c39c88169700,21a89a2746f971ef50477a97606808e93c9aba0687dcf5e0ac7c3e73ba847c6343b04d9f754d9882099a1bd0d5847e34d15a261c9477b59e6be1ad05500083e600,591bb4e654d1702005091894aadad6f689f84402f2ba050e3c0521f135bbb8f45a7b909403363f30f25f0ee56e1db1ac03a6c76d8ba82288d9641d1a8136d63601,179bed371044e195b557899315db441f6856ea3c78ac1de3aa4efc6a6cc633da3c4691e6b01697f0abc7db71411233e31ad09df6f7f5d7358878d9b401d3da5201 +16a7106003273cc45e277c,4166865e7ce34ee77eb5dfceae1abf71c59a83a1ac3bc99226469761d8da0835,69be225c9a34daf5fa78c457a53bf124dba60c7d6aac8d42bf9523c571aa0e6359103feb015314c5acacc5fd5c7e2c5a6091d9f5f7092d4787b8b3fe7670f44100,4cb06092ff2f0a0a614e8518ca3b17fd663fbe6a46cff6d6ade589cacb513eb14e09f367047c6ee89ab8f13b0cd98b9fb79f4e579590161c714cfcd0b37cdf3801,803121d2a0776bee88031ad999a22578f69b7af3f5f6afc87d6c8a4441464aa97ba331256fcd19248e9e8554ef1736dc8cf2f0eb0acd770835459be0419b1f3401,9bb8dc04398457ec1fa160357d1364afccf85a6a9411d3c40fd67bffab10cbf8422057931cd8e1669a616a45ffa75e66d67d11c836ad323581eac92aa0aa927700,cebf7d7a651127ef01e654641eb9b2a65318ea057d5b052fe07993280c745fe462101a124dbc4c901cb83464d4624158803ca75d74aecb89151493fde0f3783300 +f745595b72f1427299e652,9bcb5c33465f257a8ca88d982b0589cc2c6b2c5a515168d1a18078b3260f6292,f6bfc10fcbb440cf625400cc13b383316dd0df4a4392ffdf990dca10dcefa85f7cd10aca979f4a37c48d32e7e7edf69b9ec0f3751a11047e7cb381f45ce322c800,1b4855f8f3528222b392822eddec5324384b1ca823fb405ea162baccd7f913c66df19ccdfaa8b657af00e2e2addf9d4cef29afc4dee8bebd07efb11c7bfae8bb00,8f4686c40d24a5414c2163b21f6ae47345d91ba02d71449b248eb68b80d3e1797356e053b93bea5bd15c3def2d21576c840754676cee8be0da32fccb343e5e3801,173af0f1b78c7f67d497114a049f9713990b6125512c79dea2147a1443dd56da2547164d5739ecfb06bd5164c2b7dea451c6606f4695956c2a018349d5ea8e8100,2215aa5e21ed0f5f426146667abd97ebfa00fe36458c01296b07a28fb4d8e4113ab6b025fecb8d450c720b13da04848c96bc92b524c517f61ddffb9dcef5514701 +8818234b459a52197d0903,03022f7a0489e00c48715b9e72b3894f322a3ce90df8cbd63661d7cf79e25f53,77e67c6e402d07ec571405e23d0a9294900e061de85c80dd6ef2e11055d475bd07b66bd957a3281828df695726641708130a9f9a229ba3fbf57e729b5d3ae3d901,0faf35b11831d20c8a7c0c96af6e7e4fdcb15de685a6f23161dc31bff902cbed2a23bc395de7fd0cd7a8a475881186778eacff0d657f17d6c8e70bb43549c56c00,cd5f4637cdd4d349d47ddcd25b9a77033e690994d91d06071b8ed6a68280d31452c4338eeb5d335f216d2c5cabe0959386a9719e934c9a4dc836b244c4129c4401,560b1f18f32e6c3ba0e330b5f5f59a38cd23d25454e54e1ac778da70089ed4b347808ba0a8e4f55aa69e001b5656e534afdf70c32672aa853636c0eba7fe639b00,344a366966b6e0877e18cc08a32c524e0f69a24f8a48d6095cccf3401d93ea817953f040ab8e59c409b683cf2cff4a3b433cd778a023880e28b83775684ef44600 +1c5811523ca8d6e1f751de,216af9f653d1caa37da9db222f22fa97012e49990dde2b6aeb2f15cf3c5c5398,a81d607ed5cdc1f444a743665236fd3fd48bbde07f204ec895b611bdf080b3c072894ba09bc01e363ffa3376a28b8230d9e02f5a9715bd97433e105bcfa55bac01,e91c7ccca7d3a724a5709e321ee4b2ce454772e8b0e56d6a44e13c3c774be3e61df0f47b13d928fd77cc1442a7cb9edb64c5e8a3d4d3c7f6e1cccca04490be5d01,aa7d6b6a678260a439ee591bf8dde8d89bc70318e2c7fc9cae4fae46d47e067468f9819db6e6f65bf2c5cbecd253daefa64549b915ba13c99c9bfb661cdcd43501,c9649a19f73c8abb2cff721eeb0f2562cd79fbdd4c4b270705551fb1bfb4d20b287962e84eb5282a52b38c38700b38e64b19f0003725ee6392f6946638316d2d00,6f121116bffcebe875094dfa162365642f9c5721ac41e02ce3178e9b5ae83912261941cafbbb6e0c79bb07c3585948656fe1ad6786fc70c1bca797fee344cd8701 +210a712a25486c09abb76a,12d47dc23bd2eaf0e59677a3e9ccd2ec7bf561797678d3c5943b0d08fb6d583e,0dde2fa1f1588fe0e5699494bfbaf8d0e791260aac0c8fd5d729b5e33082425b7d20cd53fc03d76879b11b5a7a608588f6b6a1345280f923961ff94bc4bebc5f00,37c03c5b10ffb1aa164155d9bc54b3de0b455f749b69b6126becd96ffe8fab2559b429d8ea72c9b77a35ab414ec763739446925f11a77257d28740dc7fbb431001,9610a277947ea17c99ee196570c965d182e609ab0fc92c2a98c0c4296bc452641256bc8d0e04a5bd30dc41d249a306007c7326c0c571243f7c29839636fd47e900,f8a5685802a72f176b388627f6b19e586a411a36f144403420fb9c9143bc75f04ed49b4cfa66ff865b43577e12d77bc73540faecd54967a83096106049d316f600,c376cbe116a5c7e1bcca621c0b3f62ed6ce132f19acd8de49e9ee77905e3783b49b50959043233c9d4dc4de12bc6e2f49d1976e9297353096884321df8f3771000 +5283c9212076d41a4b25df,1fd1a1e3c222f0de3d38a493b0582022a098eeea1073b537db05c1c8bd84af40,ca84e0831cf3c4398c2819ad88cc6c985030f439aad42e05e61a4148cfec23cf711ce3d398d67b51bf53a5c41674e1ce44efd1a63b424b9ed764bfa0107475ba01,38e5a6b03414b16deb8539fb86a08fa7f9b005da3db0171fc105d0924967bbc73c4d5f688c0829e309b221a3d16b9396cd5f6429e4e0f5e9931b6f2056b6fbf100,37d1cab3d5392b8dc01f91c78c4f07d595fc140d12e58462f0f66ae8fd1015d57fb2fe30f457c11f90c298fa2c59e451a650074a159ae8187119a2139923694a01,dc9b834c084ef890c0757ad2eb5673e9fdd6e675e9343a21fe8388615de5f96e2c750dbe31ade0dc9c95df88a7815cb822e1133ba8bc68e38a6afbd26594017400,dd857e7be2901a5750ba60f97bda518e67c13b5a0299cf54c6b2f31e00e0ab7f68832d1cc3bf2f922df72b393dd9c44cb23f8a2392e3e02b0b6419de931ba4c201 +943c92be4d46f3d19de418e2,c81ab69b89aa541fa0540b5482c997fe2c876d8e596dcb2f5927f7170bbaf967,f14dab3b1c45375f73079687d1af7a5b994d611acd0bf6000a62b0c9944b35bc13cc64aca75ebf99a2b19e029fece0e785576133616f2fd03e315bcd9f68da1001,9020146246bc779c8ca211b83479c97ea3798fcbeb1add41c67782b20c83a3d65310540d3c10b9ba9423e23f2e3ebd8711c7bea97cd03b4771d83bb2e7623ba201,991f288860e35cbe0beac041696a58a80fcd2320ffb22acc6b8246d8613a32e437adf19b19623b974a1fdffab77a445da46e88401704ae6b479c5d659a7d5fb901,916b8682924c9698da7c0fef07267b6b867768e64b907f2c774e7595e566a5d4658c38b296ba06d6d1a294e76226fa1a2f769002a4856aa68ac1fc648e0d88e601,2da5a17d9122d119f242fd180fef195738a80609533525f5ed15508dcd4ef2467b9ca9aee6153d7257eddcc64fb7293662279cee75183080c11818e26e1a878d01 +41423ac5597f5d5c50b327ce,dbc92212661f19fcaf15a523da57ec227d4caecfc6f8abcd838fef31c60f5de0,a2308cd4581c29404bdb510a3ae8df2cac52308d17584ed6e2dfe3be1e94102820256bf23d6aebbc05ca8a428be0c4000402eb7a97faab7a1ad9570a94ccac7e01,2d6ac6ae294f5dd3559375e0dc31f61a28d8ad5edfeb0981134981bfd5603f3e262d07fda47b710fbcb1bfa2b66d47153fdafbf7411b991f589ac5c1af6ff64301,1f2f7b1d723e8a9cccb3c4ca8aa8dc578d6eca9df67c4b44acf980884e12b51a3b69063c043b5152b951881f3dbed98fe1012558fd76520a80ce8e8f012cb6b901,ec0e0fe6c3e39fe18954880567dd1b2e83c349d251ab6dfe84dc6f794736ea93302ad20021e4717c6ce4d46458b253807d632553732a62b40ca6f22692bdf80e01,9f513ebb29637b82da9411c6ec07add9b4f3ac15f62a1cf3c19c684b7451ce6549fad825628cbc5d8f7068d948f58d7d92a678d4317fd998df92dfa2d620a06a01 +2d8394555c37f9bc781aa485,4de89166284d9ad79a696c408bc0a4c99939147a58c9bb67d30fc9d04e4baa1a,d1270324127031c780f5b727c1fd8a06c759d3d81757bcc59d1af20c80b0b7e37195d6fe15216422880ab4201eb57e6455c6bb5c5827760039fb00aff9a0c24200,4c928437e717f682d1237e8e8578e87e5cc388546b220d0dc4ce8fbdf6695585618e8647d1286d310f60b0990ff0d3a57d022db1eb521743d703cb0829cc89e000,f911012421b7df68965d6b9f913548274242601a4625a8b62d13b226d05343d85febbaad34281a562907837f3abba66f19db651365482bcd826620fdab151c2201,3cd545412cd6bdad491ba76d155ac49604ab8c57c9852bda99d64aa5a5e603da55476d1f367ff4255aeef8bf5f416523d36156229a401a4586fdac29799ae77100,c36bb9360dafd290ba5b92f0ce847a2e1bf19a6c3f701974bb34ddcef2b3c50c05ad9b885cac294780c30f406715d19b8dd724a19aa78a237a096ae288d11cbc00 +1d38173366934720a80f4146,a8e08694559e349e46515b98c4d55a5900f1999461975a0c77fe167249b0b88b,853f76580dc7711e26517c67e0dde68b02bd0306d082f55f799ac50dae72838a32f5d5a3ee656e0844e54d6679de22c5ff3f4ce0792a22782c0f47d62dcc3fe401,d24d55cdfb56ff3dcd3a208ccabf8f24d1e173ea881b4498947c24f7f1ab2d4743fadae89ba69ebf04e15bf3ef122545b10f96c1926117c02e96db0eac660bcd00,734acae17a8d9782661ac667eb8f3d9ad8f1c212cba0feae1bd71bc123af052c31a8558024f68d666ead2acca254afa5539e467fd15b55394ef773dfb4c13e7e01,fe1de040e4cf8110d09bd02e5755b4d8645e7c4048a07185c528ead85178161c6c1fa4bf65156f452bf3cd9496a8835b0f2e33cfedb4229cd21af91a1ee36ae901,0a6e0309cbeec7d5983ec54836fec03aadd236051718fb7697e75cb36d1b121f233300d84873bc1c4c4b07c07b1d685a954399f0a4a2ee00bc405990103b686c00 +ff77124a9e88277f3d12c820,fd9f4623fa940b2a64a8d1bdddc9222bcd2b7da584ae7d4a3e7958ff20cc5ba4,8c89e91dfea0776b989a82f8f83b26deb3c9c33510618ef8f992431f8f5525ec676bad4e1d4d5167cefb1b687a9c53a503b1bd7131ea7e764b83d8fc732f2fb401,c889f6b4af4c8104d476945af86fafc1291145482029451f22441905e4d4fe2b1adee22f73ce448bd8cbf26ed61da5003848ca6e01eda4d357d9d02dc8dcb7ab01,4f4c4c4a63940db9202769618e4cb3988d5fc90d01154060f84e96f7d926b9e963a12d5fbac75347185fcb5f64555128366541d2a32dcae60acc9ce94c5477bc01,03b18be524a06a2aa3e81aa165a9fbb8817830b09af6b396e652496bdfbfa2e417c11189cd4cd1eb579c69a1f4d007822eb8ae126a4e2dbf30fe9805f23b037100,aab97967a22ae69c9f4283b3c2f9560d6cd8749694d6850b750265a3dba364482c4daec947ca5394292d0024b545455a3b073876da20d5862d132648919db28000 +53a32bcbc1055e7e31049ed1,b71972db05070d77aa4a703e577121f3dc42deee93d561e2aaa65052fa0b1936,8f8536f3940bd3db1f662ffda1c3e1e4cba3037000ab770b3dc0a61e56a60846423293fbe4c4998787d82720b0cd9895d5937d9fd0cf2676b42140592d598b6e00,a5c004808da9f93dbeb86445bf4b197b94396bad4cac5b4ee7afda7a1a167c38674c6983df77e6ae4ba38ea5191ee3dd74340370775d9081abe8cc65c3e7b61d01,8d9d2f64851703606e2dc0c1f5e38dce10543ac95ac71bb114ebfa08cd320a6e59f95faa628e232e84652117b89a872cc42572f1544b27ee60953a5818c1caaa00,957e2abcd4c067bb44d18e88ff481a5c9cd4c083727e56399564a0db60d3fd750d8eb49d66aab97d56c8dd26ea357229f791635073586f7971b4fc8bbb4d5ff800,e82eecc862112f2e2773541ba8e948aaf271da3b9ccf8c086712450cd1bdb40664a9f0b2b74d0436dea97e1f075901a9d80a578cba8d99f41c38cd4123a2e67701 +713cf24cff89a60f69c8fd40,ee4f8ad4874da336107cd637c2acb198f235349b0833956c96eb98df07bec493,1c309a4f0ca55ad77ca03161dc75b8be47dd4ecd018d5c852c333dd267436f7923ea87e5d781ba9e2e501266c21831d3f91cc2d519ad5d95f2406a7cf900441b01,bacbb3aacfb3caa7144313df63fe5639aebafde419d9675e754ca0f804cacde46f2514b9212286fc6388e605f89f9be458a2e0bbc42246abf383a850241ce03000,7037ece79999b9a2124a063f940b0b322be981689d940793266e91d54fa8727b412a0b11dcb57fe76171758e211267743b224b81649c5d377ed6e15475db3b4300,2d56aa2fc5d5c5c17ed47818edb89ab6c05f066fa6daca2c332268093b595c0641254cd953a25bf4493db885edcda3a2eaaf313d54608c6ea0fc7c5d069c9c6601,bfab5ca1ff55b853e60bab598e9b8e406efc6bb9a6a6d83c3fd39920c38a145210c2edb83b44ec639bc2a2a7bb645dd575f2b46f26947e09d79dda041ecb4a4301 +1255453e171ce3a2b224114e,a122dbd7da119125e62243ddcb737c498baf3c3ac05548fe5546669da576551c,d9dcc6a24a7c51c0af4bf7daecf60c0482ed1880a96c516835332e3ec3a7d74d531831727f0047d4b49fa07d868b10b7270dddb1917ee5adb224189640afa09300,8667cc8505fbff2a94ea7225b51349261f61c0f9089467c35e1a475b577fee435e5f247c1e86fa00e90277110298911e13e623d69ec32fb00639eead473a617d01,75e2c12a408ca46b381d7843b6a181e2068ef02b1b7a49a5c444b511a68fe4e7215ba0b308bbfded4c1a42717809846588c94529a90a9a39714303742cfd7e7b01,71cff3675003affd775af1d36805dde1a2cacd9af137dbc93c537d0c496930c06b2a17a26a4bbe48fb6bb461484f586ec3b8eb37f5cdf57702021382cf0a28b100,e4a6d12417d32d666732c8537221faebd1429c955b11335aeb2aae4e14faead7788c403e104ba702b9d13f069990456a8e4d9ced3b1ab15228f284140cad27b601 +a2fefe7517649e02bd01253d,3e6893da0d8e130c89aafc5be7789dff52e297a59a2997783b80407928c749b8,3516d440ab1a5c16744b4ab4eac197b418bafce06e9a319575345a3e8480ffb85950f3d41179d95774d68bf9b11dfcf2f7ded44dd834befb5b47f2e1cd5bc44c00,4a3010cb1d983b843d834ab1bfdfbbd101ca31d7c4d81ee817ef50b7d5e34daa18d788455ca37312a973286bf824b9a660e448a93a2e293dfd982c4d1d95976e01,70fe1fd09d0b946048c1ae097274c08847d3ac5b85d9070fd95b375d4b77a20e195a951783105487680112505a560ec445426ada2f144662de41ff3eed30289a00,a8f76e734055690508382b3c9a694eb3bb6d15137b80ee630df37b4a0fbe14371903c40bffdf6137a8c2e53bb2f65d8d60360424c910dc2b952da44b14c4626500,e5e44d55293a108be76b519fb9579c4669f93e89daee8145063eedfc11fabda508824094ba23ef210ad912347f29d3590b71189f44daafb8308f8fb2652408ce00 +6932c638ca070795b4cb993f,b01bb63d147328f67c9e5d02ce83bdb1c556532d40bd98834c7b89c5786b2494,96330075af553448d6e9853cf28105a60bc9869507a638a0375c6cab1a564f910b265441d52c4dcf37145203388a3f1b4d666267b4ef623a84b70cf73bef78bd00,d261fb16afbf511c5040f6491bb7d54e73d486930db0e5d4166f7f1961a8965626157442286ff84b4f823b5eecf9f0496130c160f5729fb0c458df64f28083e600,bacebfc16315f70c6d92c107e137103e6e85b23d3bcf058499acfcb1efd5270439bf54bf212b63cd331e8a5427cf36ce4c017acaa67d009b2a4457f1b75668d100,92a5ab21f52ce99e4ce3c3d4a10a3814addba76e094e59d1aaf3405cd76d34312648e88dd3ea04c39dfa953603c9a21a303c67bc84bbae003b169f04a8d7f17b00,55eb026b70c872b97b0c945078def9a7ebadfc2fc2161fa514dd5a2f19517b186c8491cb7c05777a67f71af4732595595e2b34e87b3b1ede31489ab649d6a77800 +08717e183cff2532294d099038,f8dc627c165ac91e0fd698f6f11e5e5167a0b91a5a316e5f5d4f8badbbc3db68,d3cdf51d52e1463e7045c182cf4e6562d458d1d1e5bb9eef4b626cc1755b857d49f9e4d0e923670d100c93a92792b0d148d20d4d6fd027458efd442a6f2b69c600,39d6ac71fc5e8fd9aa3d88c365ff88bf2943d4efb4ffd84112b789e9c3cd0248581622c9ce980181185fa3a04c185428d75072bf62500eabe54f55facd454fb400,d74f1f17204255a59b2b13ee669b9097b175bbbc63f939cf5f359c05da4ff60c204dd98fd4d42b102cff0670a372323d893331e69ee144bd559303482f35979301,4695508e064cf08664a17ef3d9f39f53577f41784ed154b4f0c593f74fc245b81cd59e6386af82cd8d70f13c6e3d8d6048bfa6595e4f454a18015647da7cab0d01,bfe960d847efb5b4bdb8c77262c978cbba763f39e0c34f7c5add33b1e7a7f6aa40bf73e75bf8ad21307516d77fa6eaffc0fe61cccc35cd53eeab358ee638896c01 +bfd2db08840eb797887f7d9ced,18837c8cdd3497144e977a018ad50fb2b054ddec0239a2ef4220cb0730d07267,7cbaca9e417d8771a8d352cd186956dcc0902670d908f42175c800938a6e3192734114e055f42c158b25f559130c0964b0f384da0b715d9da1af8a0545df0e5c01,6d8f405b06f7e748ffb7a45f84bcbf9046d35c3a2402ac65677ba70f7076657e5fb066ea2b463945143b73a0169f2cf471602ce0ae6e0cc5ddd14940ea897e5e00,995ff66be6d15f9c7fc23539a6774451769c7aa7714972bc69c6dce053ddee45413a1ec561921ec2a358ae6bbad010960e1c36cb8086424d65da51c80b2bcf6c01,9fb5c38d408890268235b0bd294d1714d05fc1be6eeb2fbf67f340bb1331769e3c89c9da7a792a2fe02f7728bb0f58c46d6eb69564904db863f9f5e2f52b732401,58db995b9f33135fab423fa252cec70a30c5b4a6eba2a6a581a4157e54df8dda19475a46b21592aefc6e60b0dd44d10289af53080b241dde61dc163f1400f57f01 +49c0510255d09897fc4c98f1ad,ede0acbc18fc357e6ad2f2597792df7611871ed68f1499290edbe8646486f7c1,507032d0a234162fd90bb27402681945ab8ebba4eff2e83f679367de30c795e150f9e6fe735be9b4993074128e7dd0faa183a96553099e1fbd6fd02f43b705cd01,1df44591beb058d7fe8ce0796563df5b4557d6571fa7656a8c48165e4df4da014539de4c2aa6bedbbfd14d850590f49cf4adc70f35d2acda8eb039fe964a2e7101,ca7c33e21a64620ba1ff244f05f5aa310323565f95312eedb619985c30c1c6c408ee1ff37a5eba3c04ab41d7764697bebf1de92fa33d0216aca73f51e3c217af00,4201a0fd81cfc9f3b7cede2cd25e0b43e09a44eadb66e497157e233614c67ca125732b1c0728281b17774bee69358f4b30a39e9c430b1e4c6b71f5b18db42d0901,e068bc938bb145095fc09ac4b2026d77acf5da7538bceb724573eda11e5d02db3f61b0b4e66ff7940dad08f714190164045c0b90c3b33f154c934b1d9fad6b9701 +ad221095f2ded936de2948ab67,d5c065ff5d8e321b2a9843c7c8bef1ecef8a58d300cc74c83ad4439f541ff305,217b9d155a79daee4384e111c5009bdebdbb2923b145ad5bdd71f74b6ce098050aae3ef4df5e9b13433b4ef6373ce16fd33856305b805b88845076090cc4488a01,960c2f54e7afe4edd659b05f5c5a1a0f6ecd1f3c295e95b4f26c83e03190a4c61c8c75314fc6d1cf8599d8f8290cb25a8b287cd0be303bf108d37978e6a2985701,303b02287ccbd45359257d811cd3930e408356bca9ed3743fec25f4a6479e2900a84c6d4514aee4d7679d265b1a0c0fcb7c3bc7ed2db774cceffd195bb374bd101,85aa7a6e6b4449654790cba285a2e441e1bdfad102ec3194f2bf94cdaa31d774504f170772c059901541496f840e575fc62c138ec7f6411a50c9d033670e1b0301,e5c5ea4558ac4f62329387649b5c4368da46215eeb01a4117e4d9bf65272ac186a5f97e8852e4fb1b80570fa4317593e944c4dbc186be3f1660ab8571ab553a300 +7bb4b6c88f58f891e27fa1dc27,5161d0c188fba524665821dcb2e5f2bb948c19d006ce299b2ab56abf0fce4101,2c1d08f51fd4a904d1b9bbc698f6992e23905dcfebf77f2f83a9faea5016d61651d38c733ac3422626682247839a40fe09b2288b71694e6ed0400e1ba9c8fe0700,813ebada4245e1431bde7538db668c216ce46f5e5407d396633b56299bc1c17c1146f608471bfff12814a10ff8845b0c40b399d9f3a00cac99c3982b143eb58800,e774c4c2b0d70a126636cda837c7a3e940bf1767b5e9422012fe1ea19921eb1b175241cdcc77df9f5d702ff4dc3f7afdefa950d8b67c747b07e3072716a8578701,d8bdafd0b877e3cad3c2c05d1717dc0814799ca33a6266e02cd5e64cf9102f1d280f7e53be8d617472120c14b9921ccfc8bea0bf4797241843b518edb9fa045300,d234ca01d7a923a7bbaab693054c5bc945856dae3155e5e36723c14c1caef30f2101ae986aae3de1bee475ea044c1ffa95c1747ba13787016b0a1c7a63e20a0d01 +3dc42bcd9cd9fcff98e6c9dc3e,6699c6a934d81337e4f0e957390b1761652561be3dc39362b456cadbc0b8dfe6,02f649669625f1c2051511e46270f22516422ebff56815b5ad8cd41c4f1f348f410ce11d713802bff5503ff6305412e2a042b28d3345bb35f8306669cc52e4db00,ba3def7ebd02cfa38aa5dcbf132ee79928b0a96bb4a36108f958028bc91589e25da7be0066c26bf9d56712c955a72f5a0c12b5aca7b89a865fad07d3111edb4801,d0500ae17a4d0e6a6ecd9d814ff836c52120b07443865e52111c752139dcdd4a150b1abf5538be793bf6e243b317da1608310f46f7005df4c4d4515b5f7c1e7d00,4bcd8f0fecf42cb194f7afc7d9a8b893555c41598c475e4d9da847f96c9bb4d57b2ef7f12c16b4ef3d7c0b6162068c8e7f121f0428cec840070857fc78260df001,210ce7e18fcd0949cbff915db206a27822fc67a3e76f6b058c9f6051d40078530eab44628f0e1730442ba148613353127dfce152deb438784a0430f7759918b500 +6d8d88c8241c15382fd678f3f0,bbc95aaf6154802907521d72dd75d01705711c52e48cc806a6d74a734d474c21,128e340942890c04d19b9e9e50a1366c61d58552bea18af615a1ef96bae05fa5197d722cd900ab9b3cccc9181644678dc3bb495ae4f325a5a83aecc375f134dd00,c4111f34eac714d9ade87719d72572099375da6e692efacc5e38cdcd57d5ad6041ff048dfd74edcd6fc831f2d6774e03865f3fd9ed69df403ee63ed52f70ff6500,de2357d12754b66a333ef89971dd12f780551f67ea097c162d378f250378230679cd87c18a645810a6077980016ae636cc0c74cd13feeb59349c63faec0657a600,b4e8d2ada0ab0cdb52f3c25e6af2a8d5fccf1b1fc7b60645f3a8b5ce6981317f72186c914f180417e96c799aed22cfeae92a582afe83602d199fc0be59491a2c01,e59cb7a05a1e10f0634b92712fe9b629607faba090b2b7dc6fde27921637971a30db88bbf3fb1bff5f1aad6580b2fc4ebf38068f2433f55c07d8a72429c12ff301 +20b81ef623944eb6f6adf4f981,35d4e74c79f39cc1594b301e21aebbceed994e53da3973621d58b0e4172ddc9c,f44d503d48c5e16610dd172480f78ab995a419ce70768e9017e0857ad1be2556773ac90e7a003cafcaf1c7e2394393c3988a6cb1ab9198ea57e900940d8f2bad00,8296041402d6fb0fd41b77503a570c974df25d0422aa1a1a30e3860156cf7315496050265eb522c93abe5852905377dcd893cf7276efb357d49120a1512de66401,513328c7612c36f318a2e8abeff9b1db0885998def3c141da10657448953001f383e78d61f9ef9bc302dd7cc63ff9ad6926701e8e4bde281da7dae4b7df74cd101,1ab075e9a014b238678514321d566bc0276aa81e5a8929efb5abe7909e71b2435e942fb35490086b92e038c8d0113c813912c80442dc40a02babdc7b0473337b01,75c959755c309fdbbb7f70f50519c063ca74fa44231e9a3ca1f1a07ea691e70b7d84adcd3a0421407ceb249d79f524d404d613d64c98f2fdd65660908d50b8f301 +a47c381cc2522ff404262e3d05,397ceca2ceae8b5dc21e205987f432e0aa6ae8e7e7f4637d353c779443f3ab91,a450231e83758f50aba5a1f9eaa9b21b412d0a04b69ef859470e0b80e08dfbff77634c6745d666a62be1985f7b69f35ba7bd1f9a152d24a2ed16e50b264d575300,eba885f6070042056bb844204973dd0d27334404c312159f25fff67cccc2899f2f25d773e3261c546c1e14614e24c2567f59bbe41dc40b981bafecae2d34f09601,78c0c097cea75c43b5cbc14a0711d8cee80d686980b54e84591f9db9318e0b113bff1bd66044e2d1db126e3e16bcc4f215d4437d11faa4242ecbdcf657ed779500,acab3cbb34956ec02718a052b18efc80060bb9ce39459cf73e9cdeef39af7de97d2f517d2fd872878945d18c6f2b9945a7ade6ce6423184fda3f42fa6d16f42501,0f2cb264f045abbc942a053cc6be118cb89bd742d5bb69f50bcb8abd893816d33f409917fbc1e58b1c4467154c7411c8b61d10177215a31e71e65654593680dc00 +6a48638ed0f72b72363259f46e,e68fb5db2ceac09127e89f167ad1fed285b4a721ac66fad9e00b31d668aaa4c6,9342bc6c35d9650c3743395cf618117614b3203f74bc58fc500b62d8df021daf574070c7af4f87dc3411dc76a2db197397dd29faf0b032eae085609433d6addb00,b6ae08be0d59702dc802260e592bc7cdadc84b8773c69b1ba3a9e69a69c6dc8750cefc5da7f4f8547bad7512e7051a760bf7af25d6d4e9c7f46d1fcf811284eb01,41bf9e87ae07db5318601c7ae5ec7f6c281fe4db0faa17f45720fe92b5167cfb7435720b9e91873cfe21332cda0f9bb6eeb75e2d274071fc4463ae5af8a9f99d00,58d1c14996a92c25755d6d0aa4aa09e9848207d550417eb76bc34bbeb0a083362898187125d2e27c1631433c43d24ac7361e5b62804a7a0d76dfddbc65281a5001,bbe80e10ce70664527aec03bcd4d2200d5e89ac3a1e06bf48319e925720846b6138dbec52ef3b0bf0266f8ab3f890ed2bc8ede51d07491e26f1b92dcea3a06f800 +bb2563933ec2bd565c2fcf87e15a,42c2f41b9d14cfa1a18bd85b2fba29d24e00f8ef631aa47915048f1c15f76d50,aca7dcc2ce65a78bd7f5607779bd0d7969ddc4008ee8ee92508aa7071a5556ab1fd4ad6c79c12cafe81edfea35367598abbdfd4e66cc6d89f0f7386b6c4a143b00,db17382b40f2d0493b2063c6b980862f441876baf776601bb3fc611444d2067073e587606b43147ba98efb0ae243d1d0da12d0fb0d09995a0ee0c95ad510bb0201,7e61497d629cc0179c1c702815a4832c2269ddcfa994fcff119617e7b12887a666774af3a02826b191f5f42e8b9fca84910cb22b3df956b0bc6e7ecd051fcbd500,e61f07fa9a951668107b0ff7ca0243327c485be4229edb0106dd0135630f41332e22139a08fc83142aabf3933143a4de880b1d317cb44503bee6d588a2fcc07000,b0f86854690cd1faa2f4a03bef1c313d3b488e38a04d0b53b53ea9384fe989b0525525feb3c64502934d872be48c528f6e5fa3fb9975ee0605638e234c16d86100 +ad4a039c9fb1daac02e1408038ac,cf5a5c8089de39229da48a8b67dd072d6134f2010f7ec2063c3ca920cda3a58a,c09146091efd11789203a83983b3b45cb57ed9febbfdfcf2c2279d6be5af89fe438542eb2a654e60e5dccb97482c1d612f866ca2e190b56c4010ded42b9f009500,d6aa4454dc5e10cf825de4be2a6aea6ab8878f22461b0e6fef47baa6d98cce311a219982260baa9e8fe0d27018e1b156d1a5bc1c6863db345516fefd7b0708a900,49eb60d1cbda017cb90917bfe08c15e97b3946e0d13cbc633b72119cf71f41c568510887280d6448854dd10fb26d37ad5938c32ca2718ca99f42738662418f5201,4c3331f4f3dcfaa545c30376a0110abedacbdde3541e9e9c57656de0d40a189027a3d10f88bc54f0a71725b9dd37c571ca1520891b58d0a47d8a856e6287c2b900,e3d07d7a38f24726dbf4da2c0c6597ce76516019f5540630f0353f8bed402c65764ebc5b71a1cfc29235238b32135ade52451b102fcef47b80235ce7608cd07a00 +3bf40d184e91c166ce2351e05690,e3891694b8c5dbc8c3cfe3e8fc70e2274f05dd7f3f34983eafb80289cbda634e,c2c63d8bca871c9b1bd219616ec97d0b095c1c3dc1175a699731804ad43c0aa751f380687a79e1431974508d9387a5ab5e811db12abd78bfec53ddcf8c853c3000,c292d3cd5ff0bf1a2abea8ce1640f3b259943b7c6ac3d6901f34af29889b971a527a7493e3c5c4944252c4286309b1515f7c86deaf4d2561da9ba39964b68d6801,cf5b6a5ef39b0d0d466834b9a88030781c157a138e72d30fe62fc573e99003445491b1401c9aee5af6fbfcf2e8b2916c642e22cd8d628945459279090466fdbc01,2789d57eadf0700dbdc83a1a0d9ac4e39048f10efa1bd0151b536442f9368fa76622e2f9150eb8bdbc19fa10f231b5a7d5305fc40880683c1db7ed016f1a505401,6c4e6e014d82b3d19eb669b37755c10da2a570f44f7c3172e8296000e0da74930fb52c18146aaaeeea7e06fefc2e0c2e2ba2f3d9e6626b6f1756b61119b081ee01 +5e5ad93d9129eb95f7f908921904,12b6123944893267da6ae5f7bf73b45769b9cde8d420595ad9f8bc553d2a3a21,f1cfa56478718414c1e5398f4025e3ee39514db8288c6d40abeb91a6265fc839605629dfc55dd5b970a51a47259a3225318081b569d8406ed04aab3de862f23300,b78d2b5d92c53d7339ab00e1c7e96162d7852cf226aaa3083bf002f6265baaca5945524bddb2e18e03f6223aa88d2263783b3fda63a6f9041c96a6727484747a01,8b6caabe655df151b23e5640df985015daff760dfbad50f6e2db1ac37151b0193564b54b52005f7f01de4968a1cc15baefb3849b51c3d05ad08beb591b84282500,2c563261722f8e20ff0c701b4401ba9dbd2b2311423edd0c97847880022ba231671d87b7adb30f3b517fa79dfb029b84d25833ed0b3d87233b7485dbade9415e01,c8f623110c91f78bb7a46ee2606c2c6762807130b84e07b475dd2904f1dd98da30e4226065a1d4dfea69dc069a0101674d3ef1ab628c622f3cde238f3b3ff49e01 +ba850002ec7447e29241e1e13a60,a0757b1dc381987c2c7d7ae31f07d5962dd065daa1e28f18341e359deed027dd,5c8cd19383abbeeec78c54d623c2cfae81b8c86a03f19045c28d0ff832a2fada559d45a11944ef2a6580455986c0174c41153b7aa4d58fc49de6bdb35d830bca01,b7d13bce04979f9fe68dcdbab559130340ddb7d786b9ee2e8e1dd755156eb9db54cc1ec4645d75a6557f5ca83a8cffc0f0ab96e5f106d9f612b2cc40354261c601,3c7afc17f722ce5101bb4a3e6fd1adf3600f9a6207e0ca209599444cc2ebae9114fd7546f14097ac6e18552e3b8a7a09d849b44ae2412eb39e203c29eeafd70e01,508160993f1cb9211910d40e5b80a3a7f6624280a142e90c8b314e2b33939d3865e7733486cb2c0e65a84c4da17f1fb9fc3c9cb03cd254aee3749876135273a100,94cd71f7c4ea31eaed55a68d11ab8f94b69bb65859ae27121c5e053a9390d0e550f9bb2603f9b4e71702ceb3c8e031b89766a79f733cc86a248296959e8e97b100 +26dda6e9839b1a03808b8c4e580f,4f153f29f651433ecc27e6cc214f272c3e8838217500cc2c262cf85020c20951,4f97f541fe9f5697e83d9c27d9e0ff9c9a7412d5f7c4eafe4446af0b8d074848653511e02c0b7256ce5d268bea91df4b5da7ba6a6343847d88d98254abb6268f01,3d784dccfea6bfd70dd365c03776805897ce6f0948146c8bb2eb5163169a7ffa3fc43ecc7c87538de514b3f9fe48f2ad7f6ee2ddd1e55113d6a1fbd5da65ea4c01,c58562cd9b27462d43a2ed7d0e1a912ddbfadb7303534b51371348ac93812bb5362e823d8e3e247255588a0e3245b82d3bfe46610ed7e4f13ae20483a1f1d7d901,b66e082b3736a3e0ad8adb90cf87f06e13b3dde0afc90c2ab6a3e23029be25ef0b1f78cac504c44bfb0774b987179fa4693428ca7858d62fc655ac15e9ac5bc300,093de03cf79943079b94b73714933b8f5b21e9dbf6878fe1b7f96d7fdb67ed434ad2e6bd2088fbf4326b898479c4c6aa6aa6cf178e3cac4d2653c14c327e8db100 +cd110967cfee80a51c84bea09766,cac99f7ac690133c111586663af3176be2d8da8f995995cb788519e3c9e8141b,5d1da49cd2b29c379b47fd8dfee7f840d21ce5a7d28e8d958f9f190581bf2d855ddafe4c3140ae5a068def09349fd90bcae46d45d9b641f828c6ac3ed2a0528c01,bb742dc53ca08745d70a68309fd5d702d5e9fddd950abaa64755ca43a37f7d7b1728cdede001c86e32f33ba695a0e5f2e1cbf290ee55be10f882e5604b470f4101,6432cd152d4691103ab331f0cf77282ea0fe567180502ce23e9c7a2735664ce450f011d72cc08974e519fe0d3b6d11fa557f26e17dbe153f690d9c39e0e7899a01,d44870bb243473670efe1736a79efd9138892186084e382653f73f115418752a31e03b502012509de2bfc5e1e9c6c10f8b112974268125d19ec41d4c3310932801,2bca6c261819b19bb464d41ec0b4d32c7fd8b16573eef177047682a624b4d54368e97af1280dccadda5b2750364e5ba380279ab8022132e4e771f7cf7d2b085a00 +f9e2709ba1daae1ca6a99c2f63a2,04d8277f67b8e5a9ef44712dc881e473558e5a8c6dedee9157d07eaf5794ea13,e16c327d5850934dc988942093376ac5b3d79bcfcb92fc42e5d723fe3fc81a11323309ae97de3c12d048b4f9ed65cc6c61ccfc63694e8d68e92c3f2fdf73741300,1bdea2daa0a0cd806094c1c5695c64fd99b5a4c8c07d0010dbcb5040cf080106033bf96d04326128df78fb8d985350683b3941eda00b6b8753c0f6632dc6793201,e28b0f20a2603f94445ef2ea434fa1cb69eda846f9ffeb1a624b50d573d57daf32faa21419c8863799c7a06bec1c873c5a30e5e7c1fbed94ed28ffd8b2e59f0a01,f93c3112020f491833e16f014b6840b8c09223d15eb6604fbb8e3617a9f75e341d3ed509f4df05031f387c5178284a785e2b94e760832fa04ad32cc9588bd4c100,38084ec3fddd046fea86d15d74bb034699fa553728bb0198fb35864b79aa84996e4a9bb13b2c7a4aafc285bcd5e8d51ce39a55a19801bb2ab4d2859e1923340a00 +8c8209ae2f8582c63cb05cf564d4,050e65775beb8b4f0d5740d2ca6f7d9e0a1c7b822aea92b314e3b5e3e23efb97,58dc000f95a0ce316b60913c7f4ce6963d9d04b8e0ecd1e8333acea2438a17fa650f427cf6ff0aa7773b8f6372658305e1899562b62bd98ebd828784016e8c1700,4961ae5c628ca2a694db418902f8f588b3ee5304977c2493ceb205a6e210b5006dd1e656b7a593b910184cb40fefa083d6c7de9b8f5bd8f8a08a65a05401ebff00,01a80b2bdd80b89f71e99e8cfa1b78d2a602b07b21a39c616c707368d1ac4f6558e9065147fe9bb84bd1ca0e747de92bb3424ba6610bf536d7f4d84bf673e48c01,fdbaa34a447fcdb86a1c77f625aef89485a2f10667d122e4658078985f432dce4258fcd65134d053f1002de9a085c31a4fa1dbaa620ac3f8fdf6a14b0a63fd1d00,3c902494ea7a3b2c01bb3d13549153b02416718245fde4518acd34410f9a661c170a5f208cd49101bd2012668edbaa5291d16e59eac26a03d290ab209bcabceb01 +b3f99146cc91c484ab9a01c29651,53d8cc332aa0e64d529920195d85bb7627fb0a0f46bf29ed2828062d837bf133,9761185acadfe1788b988695de87623ab181800dd2ae138a404237699beb700e530ed3cdb7219dd66316bae874181f1491939197d41402b27220ccdbd142b8c000,0f4de76323130d02fcaf9b25840ab908bb57a35c30ed80a0d8c1d53da79c62c61ce2700253e90a124b424e89c74f6ce1612d62bf24d55a61309d747b4db2539101,78b5bcfc016396fa332ca531a674bb658d67e7f605ce6c8002f7254f4d3a308521bf74ca19291517466d40435a3f6558ad9361ded764d813fd2601a1bf8162bd00,e3ac92147e47e2084390c38a5ae02c1e5f67fb4bc180390d452e255e6f206be729cc4ced942cf3a41b575c9820db02dd107a0c1e1b8454a892c1780b7ad2a33f00,0af780ad156807161306cc8fb399ba60991106f19fd91d5227ba6241ea2474fd074b4188797a60fc2aa5226ef42f17edda704325e3d526fc488fb8d4fd9bdf6301 +519b11d9fd1a392c0bfad18c415a25,a29304a8fc599c6c5188743f5014c32bb05ef13ea091cbc60e560153baad36fd,06e96520ef0e4fce2a818d2d4635934ab810dddf26f3fd646c2c6a546920587f44dce6638102e52564458cb0597b961b4148d2bc4ae77c88834e95c6c38b19af01,07b261af557650ed50334ee0e5cd48e2d4e6ff6f832af3833951dd0598b33bf308fa870e117e2b4556f3990a9671592ef569aff97b5b6683dde7927b22e40e6b01,f72463892aaa6ca05dc280026a5192bab4756d69ad12ee0029c5da56523bfd1f0435abb548671e2197cba19b68bc0a5f207ead4945ef52afd54404b20a3e279500,47c0ef0da0681ecd0bb20787797d72b0b95c04c7f9cc4569dd8bbda6356e09f95266252e50ec900d044466c36a288a477f22f284f87567ba016b138442efc05800,a55c98a98a9cedeac00e27ac45bf0aae8aea998df594274fd56fd640db215b1e751f6db711187ac78b98b15b8b0cddced1a4024d7c43d5f1b56bac9fe721582000 +05fe060eafed86071b04d1c9cb74f0,8089834fd85ffc1f36d477b82b2045c7b1ac1c4f07b5d30c193915f5d21c814f,2c14ec1963e256653d84db51bc798034d75a431264b78fcd38be0d49cf39cb0840feb765f98bbe0a46059ac7795fbc4df632ddbdcf87153c76bbb931935a213d01,97b43409b0d59b33a99a788b6c745df0ab56c107ad65351afd1527471a102ddd091192e0296fde9a8b9088bc6fecf6ec59d4b10f30181474ba986dbad3e5205d01,5ea9cec9da0b3a170c3adcb49803c50ead456ef9dcde409c581e77c9849f8fed1077f1dba0f1208984f6cbcaacc8ff633239c943ddfa690bd46d19597c82b15701,9ec3c60f2951d8890709a8b738ce3aebe0cc8b5a031c8d21736a09ced643004f36fd24fd85a2c7566f685c0167f93de2da9e71aedb17f70086eb9859524b782a00,65704545849a6ee39f930217bf7fc857236f68beae693ec3f30c2be6dc499d231efbaf340756d1508ddf0e8b5d9a7783ec1795d844835a91344f8ff5d768e58b00 +7ff25cda0db448acef6f6e503870d6,fd368a1b74ab70d5159eec646019de3a89bff9724c946ef91bb598cebbb29179,80ff92bb988e5cf52971636999253674df1dda559e0a207a1107f1ed7a8d349b03723b0a94e49a44892571feae207dd2283393b6ca3a6b0e434876dde0015e5e01,a7e0c967d139135dda1868bf600c2e170d8e4e4cc419057120d2804fe417a11a47ed6766db963153db3a1c52d8a3a6903224dcdeb3257152cde7fea159abf64900,ea3d8975d2c4352bdf6ed08af39defe15bf7b3bdb50e7f58df51937985a0dc782a69db67a16170ca19b934b1363d2f6cb5d622f59366af6579f8643584f82f0f01,fc13314d593dbf80fb7ef31fca627b2af1fbf60e8729d9dae8872e4e1bfbcbf21635efc10ee2e232c57dceb750e00c322b5d1d0e725c19b971e443a2f384e03401,ec47992b762588ba3c75be798f25b4c07eb00198530ca401ae754665a1edc9dc159f34bf44a7746b3e827a7f7cf4cfb2738ec3e6fbc891bd78d8f4ce5ebc43b400 +0311372a0be15f77d138083e9b2023,72f3908ec4df5fcca9b33addf161c4076625b09165941c871dc7227757161dca,326c051c710dac24d0d110811396547bd3181040f88294192aa7b92f26637df9690c15ed14b09fcec4fe8b730354387325673d4598280173ef802de1ea5128fc00,104eb1fe7361163f8d10d18e39418bb45668a281cfac46548888d25edcb8168c07e47719b199f36030c1e26c5663baa35b5d61a1242d4c832deace1c7d73eaa401,ebe58dc8b0cb7bb0041ba75135b1289c6a280bdc6ebf578de467fe30d9efe51e2793e99d000432068c84898c7e4ff3aba483d79031a240aa5efdba3b2f66a8e300,376d5a51ea4e8a66494d75a355729f74cb340dd90eb8294179bf943a8b458a6350d2db903bf633494c5232c18612d730d46ed4c1664c0612fd8b7cb4c6e5618c01,f620a0be3c5c68a83f4730517d6d5c3d8c1029722251b24bef740018dd759a9248360ab3aba831cb3bbb5553e3cabbf8bca2fabdc24cff73e6f3680aeae8c1b501 +fac32f128994b6c0630baf237421c4,ae85a936645d508cfb2ed1c6b37bdb0529480da3018de7c1a37a74921533cbc3,7eb7f5bc1c42d2a45cab2540aecac99dd59cf744b151775d14f631709d09b09723646393bf5fb6c9d20affd4117090d5a13ff4cabe2c1808df83b0d82f6099ca01,8a954a53481b3e45090d3aa6c3b3700aa49430795b03d06c78e6e2ce0eb62e7a675a2f878ab645c15137f906089d0d7529bc5a1d2113d87bd25c973f0fdb100900,1f33d8e40506abf22f13ab18135f178befd417c3e2036ba22e27cb765dbcb33135802d3c948ab6d6c2cb837c83e01deb6a22c71abdc1619ee622d6ebebb6cd9001,49229117e698e4581d33bb5bf290e5e53d1ef7774baf7da73eaf7c6b6328aec95c19bd0e67b42a80719a1b722ca5266e8b94f7c1ed82cdace9604677fa7e39cd00,42dc8dbbff53a93070dea751a298f53b86084a23608ecea4003e60d5f0d0534a4b5ad288c8653470c1f51160c99897d3a8045897a2d83a1c6c389972505cea3c00 +04b7aaabd49ac8b8b0f0d4f3848c77,b9be058357347b97536da5c3cd26ad0dea7b0c6924f3896fd5710097b0c18028,de43ed2aaedeca608a73bb889a795834419fdc72208af6d8c6bb05145a01a27573e9f34cca3dbf36741455612516b8fb66a314a9d7ec6c1d62877e858243fb0e00,9670e9439cd54b9db2ebef99f5888cd9b68ad384adc6c299e00d5f4d4f19d7844be8386eb2c4812f28b2520779331119eb33064cdfac9f05f68766ba247f8a6100,d60f52d01a205d61fdeb41f661dd372a7aa1c81417fd4c6ef9bb2fef4eca6c4a6cdc77d60d1d5e7a8d494f8d576f753299b3a0dd88ca2e062579706bd8f2236400,40d4adca323553a5c8fbed8f85bd21872aadb77c1c478e76e6fdd350517196020df7095421d6015d8d66fe0bc558ee6a9d5129b08e612e18fbe8185a3a43cce100,36a42bd0003ccb40606594eabaed3c35aec42ca47f8731613c69284f9e2488ea12044cfaeb752eef35888a4febc9658e3194a90196fb67f31c5ac79bf872d90f01 +27c56401bfb1041c4d728999392850,f2e122d413aadb2c3228420bf6e55ba4c369b1eed09785f4f3f7a428e63ca6e8,0f4c1deb7e3c7f93a084ba319bac4827fe2acc9eb5c8bd6cc5abaf8e547c3ade2acd26d9b3bef7183f3b2a448209dfd03a32216d0d345e96b3d7357349f1151500,90bfe1b9246dba0fd857f9894e15b1447be1cb5914143771df3dfed146277b2a056cc77170fe449d99b3cab47008b02e285d76537aaadb2de274f215e15ced0201,4632835c683d27ad45d98a7ec951967c4527830678fe0a2052036f8b6a0dd7b45e48098db9879f08da5d4fe6d8cf48f828af89b7b7c798b618920df1533d034400,b8ebb25fc2d70c2878d0345579bb410c99785d5d43602692250b8ca8b5e7ab5f700157eb891a75ddef43cbfb8028c37e7297043db539edf8e2b42b0095a169d400,573bdeac2a65af5d7af21f5e27f7339d5c5867671802c644686cb0002b7bafab4e5d0722883ec9605f281feeac0bacdc4ec29865da651cad30d33eb42c0eb2a601 +d3ed5671be501b670c1a278c8072e4,c56252802ce5c1c03a53d00dc685eab7867a695ce97743b9eedf7a9c605cdfbb,23fb36d4a2b4391525e95c99c0654164b129e2687b6594341c4f5a759833d1ab03ba4edfeb975cfd7c19b41737a12f7c54db8597037e3195a8a9a251a028c87701,0c58b089b3ade51094d663cd7a6f8406a5213dba85ec0eac01f6a6b053cbbb080adc210d8f0677a262fe2eff6838ed23c33979ff2a4f7d0a09d03411e424800c00,c73b46f3e180b16803cd7671ace019b3f8f1fdc7c879a826aab3de25e0a5447c6348637bb81ab0548f97848bd113193e7ac6443209e02f8855c2bf84c21c370301,74d7d00f9b0e2d31fbca3f8e52dc4602c310e114d3f75498730704a75103b91a2af9c40e87329b8f37066402f5dbc10a4a330dd39d15b3df6b3828c89618df2201,58925b01bee937c963b706896d481a23194b276b724e36699ce090e5ac4d528c335764bb6ba5fbbcaff1e11bdb027ce9bc0e8a07f87f72f0812ed6bbbe2626e400 +d3b5dc75af3eded376604d5b081e74,df8373f28d36237ca865c41016e15bc1dfbfdc9a2fcf1ca9f9a7aff651e57a5b,59fca218aaf093b4b9672959b391199b2529f9d1370c158c43f53477f9fb6f2e378204895389c846d3933fd3afcbd3e0805ae36e634b97f39f659aafe4b0ffdc01,3ae989f60700024bed9bdb2d691f97703c2f545c498344b50e4f23930845beba2831e720a2bce323a36c7d0fdc128bcecdf253fc1b9c3b9ae34bb22555cef8bb00,efb3c48ce2a8f7ad8c89b2781089f1bd7fc469ec478be0229e4900134138eb514f379410ab22c8603de15a7b70d43c3afc3445a47495c64d215506e879eda0de01,2e9b4d369636511de48ffaad0eba87f605d73eaf66f6f26a2ca811140d950a9830ff80bc91a7094d1710775af4567242c27d80f3b9a32b9a62ed529917b76c4600,649576c0f68bd877e83302e2fffcda6385976d3c549db1a991e63a304b12807e10fba0c8b121a0cbcc8ecd6267221d6c0454ccf5828ac4484b937126235dcdbc01 +03a9b7a1ed35c44d4c013a5d221bbd,82ac5bc34e9079725d6bb1a84a01745248f75b4799c890f216f4de38d38be8c1,c3113cdd922ec888f525a01c0e1dcd72d18e2dd943de25995a1488d49c2c4ae03c2d37679c9313e664e39b5507067c3c088449e6fb7805229ce9eb6ccb5afe4100,12bad8744ba5af374c6f38d74a188655e293148cf2f51ea7f1fecf7deb45d20a00727683aa466f5ce5d78747ba414c9b77ede1c7d85e67b6368883fbcb176e6d00,130dc1282313345278dc85e6cff7f1af3c342a148590128b4467f7a2357cc3fc5407e1a0b3d592424ce75f4535e3e58fafc04e93454175e5c9cd68ef0c00eec601,940c15a285182b8a856ece0296e51bb73e7a8159093f89324bef579f67dd2703103e216762ac917f946d8f40204cfc2679758fdd241177123c1a0b4f70b606b300,571daf970fcd03c4b71d2d7e13a7ed53adef20f5292d7280f86dd8164e51c4e76c044eba13913e8a77f6a0c2eb3e389277bc41a95a4fd260096cec6c1ee6a94600 +e6e62e5aff11c93550a4e48f67fe08c2,130f8833900eb1b2f5a6739cad867bef0cd807267465e3606b645e8994a5c0a0,b5c7029ef6bbc27da69dd8b5514876f0ba3a76679580b6083fb53798c31ac7ca1bace02d3f9704ef14e58a45e5092c3561384ece1591e6bf69472c5ef387cada00,440550b281c3f801d282a259ddc10df1bd3fe8685bd8aef0e86285adf7255fb57e0a145ea282311cd8a8db58155780ebc3a5ca542df8ef6d03ebdc5cad3bfed501,42811a7d5f3a6f3fee5befbb5c7f5426d1fdb80c148888cd98aa7143259fb3d5653fcca5ac1a3bc6de544e6d8f94bf12566bc2ae2adf3ec522dee8b7174e56fa01,d9b98a9445dd831b982d852b5197bb27127ef3c5bf8a552a18bce849f351146c0bc254a5c4265ebe149b4128783581633f4e3a90bf2a910335aad587d15befe301,71ed8e68f7fc9fb76697b74bacfbe0505ce499f3f4233ffca8a634d8dc60bf2e327f434a9546d19961e6ebfcb752d5d08bdb3f3c492aec5a9631785705d98c1e00 +d166fe9e7d6188e06e095cce850a5d3d,6dbb78e0fcc789c0553e4d19bb2b23033c732080868434b83df7e25fbce0871a,0a59fa41876e8951e95179b79dfed2c35aa1e2aa458f8dcd807e2d348927def44f8efb51d605a657026a16b69d4230d237f05cf8ec8dc38999a4afbb5a4477b601,bc89bf32a62f6ea16362f2486ec6524e39590ab6c0242b31e13ea299c0cd252f2023bb3c8c96a7721c81af6d2e3cae00efece08b82f8b5494aa6f00d480c77e801,e943e47f783f44c84afcbc12fbd53fb37aee52cf9711d88db0445d83390f5fda394f5f458cb315928aa6d7e0053210085f46b0d6a0cf55323d5fd2e33597b0e100,9e13f2730f5b9f2c6cc9378bf078a07c538ebdcfcbe4e0ad36fcff805cf7b0f92f98c6e9f0e721c45670d15cebcec85ee72b528dcc96fc094eee7db084996b0000,76f32ac6a8682019d03a628752b30e6eda30fe507d19db4e292bc73bd66f6e673cd5db578a170e6602a85d2abe57fdd6fd42b5c004bc5395d329475e2535e6cf00 +e5ab5d1a712067a15afa9099f36ebe86,e19b2118272077fec797d48350571fca6be58851ec369dbc0b443272f1062067,a9bc5425da95fd937dd9d079a908b3b3352949a41c55587366b1a1cd645967674a7fb351905424b90d44e443a68112c6a7834aab224bdb666c1dac05ca4e104301,453e5d97eb250ef2df46337bb028238f88b516c5752e8d4f2696a821440efed62c8947a43e9012ce3fa621119489f3bcd63e5cdb4948905615450fa770bb2c7900,e5bb48d14dd3dcc2f4e67452d19fe7f252cf88d08578b5140e0c29c41d9775f745e2e1ef51c591b493bbddd4f46d7fbe4624838d03c8d89b1c1dc5bed9f93c9b01,4ffeb3a121e938ec4d2bef5e2fe47c36d0d5ff69ba5d1c736305d8218da6f7324d4d25bfad20e1942f14dfc98dcc2e0679b9e08a2a9796c2b4e85a57cde53a8e00,80a3ce34784708ccd29785a5f4a4a6f1c9d1b9b1c0bc94846e72650bdf8446dc5ff702e3ebcfdd3ec993ed4cb2d3a43901455260e1e8c6a101259dabe6f287fb00 +a644b8a5a5123b3fd434b0558e4c595b,92ca61121703aac2f9185a3a61d202a4a9bea7d4927d5131b3da132972bace49,d0f7a59d2827300c79b0aec6fad7cf247dce16973b89dc0db2e27edcaffcf7fd1ee1477efce884573da8e257d8ea59a5b23105d8416667e65acc0ca8ff9533c401,2dc1f6551d32afb3d9083ae96cd3b1ae7a33905ae6f7c15397c44e74297d1d931c49046415cae0d0631c8f1860a1cdaf484913b63eaaee5fee7bfea46d66c6db01,828c18dabfa70ea52a4abd8cd5238e3d9b9dce25a3e4ebcb7c42b5554629cdae63d59800232f88aee330bb56db106a2dcd9fce6f7aa6f13e06d0b1aba2543ab300,2713f6d206531852286182cb48a304253aae6b2ef4980bcb4ec1195cb796081040a429bdea43af0e563776914d6b2749c76cc31c82c38deef80f6ff05ff3659101,1f362c1fd006ecaae866825b343c0d7bc33ef22cdcce47535bb0c378f844c77c273bb6f32aa8dfba8b8b3eed9addd6a813a7d03f525aaf24dcb5713b9a72d8a701 +17c7b8cba9979cce5649c0f780ecb410,ba71359f8b03e8c1730f094d7f31fdea4c2e2876dd92a50623c39c46bcd1f739,9afa0de6b7a76f7178fa334392bfab0c4abb9755c46e301f091bd1dbce0b0e2f596fc01125dd25ceddbbfabd4700561c3bdde81c0368bd7da47aa89758b55d3a01,7629aa669301c552ef7390a9a84daca304c46e29ee1ffe95348ab93c2ce6364a6a17d793a3453c0b769c871f302693747cdd11972306d165c5b598d8492ca50000,f27395cbf9ec9de6c1345f14656fd4c91d16b19516946c81d3bcda5f715779db76469264b267aa072216b7731d31004352f9afd2d5d8f7c7c6896fdbffef328d00,6e01d73dc322c7b8c3c2d5f42f0d466a690a7aea0f84dd1ce603ac7ce0b1ef72019c39dcb3d99e83c3a43e1e6089f081a128e77bd543a9ee342d67a4348b4a7800,5f491070f2c79afeb5b6adb76fd9b2b5b158fd8d27b2ea04c3dcb794fb0dd3f52b94acb1cde032643cff75ac8f3af5cf01fd037942a3b9e2ea8571f95574ab4400 +a5eeab65b6533691d22ca859b5313167,8ab63928f8559a8c971eb8738e8a4a1347cf21ccb2ab02d85800f8a6e6c4a56e,3b619725d12a845b7430e56bd165d714e0c586267cc543b7ecb3c7edbb64dd8b33c3c83e38165b70f61e8ab3b79ebc62c5d82a45b3a950c9cb769fd0c7f6846600,a10d1aa717c4595d2ded5eb0b8fc853abc5d86200f383cb949cd7361516dcbbd547ab45f26c5c7d004f621228609d79bfb527c0875feef0e34f6b5655e67d2d101,4f47dd840529fcf288520668120a322ca6a4f78f77156f51e16a6428f664110f6c57db03279a19112b306a9522ce5b1dca6ec6d4db073e48d605b1aeecda573800,3be7e981b1e4fcf10d526dfd5f2783ed611793a66c8c645105aa639b2c27aa1d76e4efd6bce7a93402b63cad6b450f2311c8ba9fa42dbf76ee212224f03a49ed00,843c639ef4bc3c25e5d726c15a221e319f0f80e09f7eddcedeed3fe087cac8730f8dd67551406879c78796eff40d84f70bac4999da910ed44fa954cd2d5a6d7b01 +fecb38f52c606e4e5c705f0952eee97e,65bbe02b2e114d5466da503658cafeb73189a3cff9b54f4674ac8b55c7db59fd,c0745bbf1d15425e2875258c2ae689525c64d577fe4802bd0d3cb5802258d6b76c4c42b2bf8bed19a107b744b99f704a41d64b179d1b641f63c1bcc729d291e600,45a66c5e171099bdd0540aa222b749317dafcad849b9d2042b79a0a3effeab8e13b4039772d4e93fc16e0c452fb16c551a351006ee5a1dd69f0f2d012749c2bb00,7263bcac13bd2ae6d00d6eeceb9bcfdaf99003a2bc27db9dbc9fad022b6182523f6bed21768e3344d54d59479101d0545d9aa373c91a87ad76b14e19363dec9b00,6dec57c3b54c4a88926ac71891e40a8d7abcbe65b29201793cc84e800c619b4208745385607fd03881bd35b7f5f6ecf25f6797cfa7b8d0dbaca85e02141d032401,7f84ec6d725c4c917bac449e43b9ee2eeb9c987d051c428c399eddc4221060a20fa23f00430d02c8aae55b89ff3a2f92994ef72acff102ea5d72985ab1580b6f01 +bb72ef8c2f2b89a3b0f4e79f2cd18226,2cec38a3427a00c69f8bda885575a356a312660ce1977c0ce373b017c182c64e,da72d4e4ffb880f8a30d2b50f02c3e0f35f8ab365835c4eb9b7d730a7885bbd80bb207d2fa1f9b8b2ca0255c731d31cb058dcdc1c20dbfca64761ca3170bd6aa01,7839a0db18e2a71f36cf928fbaf682da09bd50fa55cf2cd28bad9c845617b4a37418485c05037dc7ab5c89b0c90e1ff9cf96214c167927f018a92df55fb1a2fa00,9a02cf1656f6e970aab3e71835b7fa4aeb437441b688d60d9ae02a518acf75a64848e55502097d837c77a496dbeabc3c7e6f1cc083724b67954c34785e119bd701,af23502c5e01fa017fcbd08daa8f2b26ec70dba92831e6ccfee009d7f270c7d916b4cbd8b1bf486ab267a17ecbd7d33402373a1eb6ba0b6e251f4e3c054da2bc00,b25c5c2655b8b4272834a5fc755d7e1c110d470383e799e614eeb8b53113d4662c69251cf3437b0a0d6ad32391f3d0d5870b50a9ee621dafba7a3900f38ae44901 +046835457089930dfa368c3764cf0cb3,60b8ba146d6c06f5b43ce4decd3bb6b2f51f0e147da2934b85f8eac98f322106,a772b2e802ca468e1c02561e67714c14b3a15cebfcf5f64f721e3aaa7659fd0133f7909f800865cc7a5dbfa8658eb683344bfd4c5f368139e1530e1acccb8eb401,0e324780d3ffb90ee79d9a1dd2c5fed10f57e3cc43c9cec035cfd19b483f7f9b1f769b80c0bbb74e7982710db43ae9c15b9df5dc11a44a53735c1b3c8ea6caa001,918829d7525134938d852cb0e637b81d36602df25a85a9d7192d2275df4cf5db7ee6ea523a09c8b61ee98f3b3c1a5c5dcc122f753b074ca332fdfc3ce9546c7d01,94ab70f69129d4a2b49bcd6c53f74220c6b6bbd2d6b0038b98a1d1dca3e5aebf30e3ae9a7896dd854e3223ea10d85f8902f3c7f0c4a4fc309f297f231ac6fc8901,93a5a4435a020644dba8e298ecfa2acc95670293c22597a062b23416f12b6e494e5017bb4ead34321139da4780882b11ca81c3eb1a73698dc8c77fb0f939052b00 +9f2b02496358ddd6ee2ffe4f6d0580e1,c62630ac4929b5c7d81d3bc0f6328bc364cc27e3a6acbabf90a4c8f3a9b402d1,a97796ab5785e91c460c6dc53d1722054ee6c6fdb9f8027d6d5454924a3a5aea481e9259ffe9818b72ec1a8773a4387628bfcbff55013c8e38b115e26a559e6101,0cb7805be7b7238bb7277974a576ae62da74f4a7b02af9b7f87d9b57f92541656eedca7d8be4e0c660247fce5cdad8fe472e943e7712b32c87ba38331bd84b1301,616f62ebbe097a07c1bc9e2096f2c9b8d3d8ea3fa4accd09721214ece98fb0bb62c7187bf095da8a397d07e1ba3692657490f4f67ec541cf67d59b0868f47f3500,bfb332d112e716c2e3d0c5df86473c0abe4716a74ade3478f38c93a2058338b42ae8096c6604f8af8df72ce9bebe9ed93c42a442b36f38faa57ba3130ebcb1d701,bba32bd8034c7b2bbaa29622e8fbd558869d89afd4f66c91461d33ad53277ac3721acb535dc416f693554f043ab36e9692edb32f4151f36789f11cc766a83f9200 +a8ada1a06ad23b45bde5309cf6ae520bc2,146d88d9ae04d0c9d06e2e82338659b8fdae52c74853fe84f7e317f63921b273,09b9bf98a8fba1bca424d8f33465a297c4f0c431b914d6fb370d019ef824ad1e4736ba855ffe890c6ea578a3fde12e4d6c807d464b7030a620697aae08ae34bc01,0307e66c7c6399a67bf631e2b56b5c98c46687ac3908a5161d548ca662b375f97541c916ddda7cf22db67878cffa9a204291b8415a97766aad56ea33d2961df401,0e29e9fac14b3d04276ea0fb3b6b53551fa1b98494dda454297d092b07db7de820b425659c0864fccaf1d5869b24e312400f5357b1e7cb9249c161bec77cc65a01,da7643462d295c729aeb05c70e58ca63e334cc9df8ca1e76faf7311d6cb1033e7904b5c30814d456171aa9c555c34221e678fb38c5f13bf7679a69345ccca00600,238455c93cea43695a1a0a1ba76d97412fcc1982b449b97a1921136743458d281e9112641b8ac3e9207f3049a85f5b1f1e26add6b9429c9a64e9cf57f7ad535b01 +e74fc96955dc8fb309aea313e52c0d5d8b,8b5ea33b6dff5b956cd8c6b434c8ca9f7cd5bc7b5144ca01e02c54a351d83c28,1a07fe9dd0dffc3dc4023c7eaf8b18501341355baba46b0e5ead6db4645530c42eff8a55476f640016a7d75fb647551f9e331be7e651f58098b391b4c21cf89300,8700729f22e015db008b4295e36ee7023e72c14d84988c1bf1fc4ff5e262fa1d5de401f2d4f66bc626302c0c11149bdeb21a9fd8bd9a555a7cf1e6cc306a498501,8dcd6169bc2087c2d296b6c0be806a3f14c9c48064990a74c7ceb97ab7f94d1f51edd62f7ac2917a09522aea9da6448790a56fc460e4139ddf2d7eafc1a4379000,0fd632f595d5aac84d8542dd8e161851952a614d081f5b061f5eda1229f7f5746fa448e00e8cf45b42f1def0a2756cbb6098f0a58993483b0428b235a973f5bb00,b6f8d35cee3b0514587973b0aad21e0cfa779ad3bd0bab4171a09fed89e83bd0541cda4b9a3b11ec7d0c14f8e1d13d57fd810feba2cfb869026d40bb78775ab400 +82b42befd6c92f89c5b7adabaebadc43b9,5df0516c344ea5e0b9106949a3af3d622397902a153ef1a38cc6051cd8d7c0a5,2639cffc57801670a11c669e3156b68f26085fa5f276de4b79902dc421ea8f6b0b2e4d0db9be85f5751396e617d635fbad5b26b183bfe5383c40ab4d8bd63ae501,3842cddcd3cd183f63fccb86bd0b6e57e38324123cada206a9f778f84d9736f1080625f163118a56dc243c1f93a10c54fb65adc29db80b48dd6e9d9a8ea706d500,31205ed3f1d647069c2b78fbc8e630597c231c3fe9d1f5d3f3f038c578f0784d17eafb7958bbe0d4492b6fa551b1e3b33aadf0f9e4196b08ba8046c745e1d68f01,381a294ece31830c964a5376d8ac9ab812d3d56427e091a28ca038967e5b80d7361a739c02c4f3b5d7fd516f6fb5870a33cec86fb5ebbe01debb25cc7ccfe65701,b3a89aee5fc889d94dc0c84bf3af0f9618e08ec15e07074b4fa6e2d481ab29b14145c5fa676dfc9eca12ca1f543f7737ad52a031d03521f9594e34839c2a8b6d00 +6f7b529d15a228aa952d70ebe21ae3c865,469bf2832773c0b6050a54631ad1ee84f3dee17daa30c301ab88fd80916cbf91,db37286a8068d7396e0f5fe07e24d204fabffc732d97cf3960e18cbe8277f61a2a69880c5da415ef83d2776eb67a3f06259d283bfc1a46aebbdc6abc585941b801,7b15fab17146ecf3fa5134ec0a2b0f721deefe3ac40a78ac22bafc1c37fdbe1c3a805cb9b747b85c8a1d208ff5c0bdedca1917c1f29dc321dcb6e5cad8fd978f00,fd0c3f5d2c6a79818495e3131e7dff00abacdd68780bdeda59dd1a8089f0d9cf065a446d7c18419a7cd9514e00faaf76d1fda5e4a7444aba4d7439429ea49db100,0c9c7423fb89c3e97ce4b6ec18551ac31d551ec24b6f997b9095ae871404511b042f5c3b00fea7113a55b589557f347d7d9e7286cab16f1ea97d4835aa0ae53401,fbef3dd0b5c8077e1ff8296ed37388a4a01c400b5441eda64e8ebeb0b83c71be427124d72a5be966de5255ee3050c99596f97316deeaef92f031a6db14952e9b01 +3aeda6dafea6b67be4c51cd88cca8780ad,28b57f9428c25493874fada4d2603a980320ed50f0141600cf00aea9c0ed1a3a,6333e766d9033734635a86dd303b071e8418bba99edb4ed372f52f03e44f7ba016320bb10e45338241da6d6871a6b04ff5450562cd60741f6b65e5c12b48000b01,1885449c45ea79733061b17763bd5f7d43801872e2e7ccc18753b143033aae00305f6a673ff1db5ffe4b76b2a6be961d8ba0e049a36ffcb4edce16f4a9a33a6801,467e4fb397b830fc590ecbe99c4c72e9f3cf138252649507098aeb46ee360caa0dd962fea653ec64fedd7284fcb7c4137c839a264616d5d346122f45fe1e574300,285905904309aa4a187e318889193ab2a3f2a781cc0f0b18f15714c9c7b60c6835a73af09b4b975d39c6e023ccbb410c2d2cae5968c59bfdeab981356104c15e00,5e2dbbfb851788fd52e5892ca5e42eab553eb3374dd70e564c311c6162e30d5e0d56f880a352e598f1b2df8eeb62fa80a8b9c49dfbe2b5e1a7c38d142e5f540b00 +f85f29bd043695f936f9e4287897f194a5,e6cad32728460115c35c79e4284e8922dc637df3ca5712f65878166ff370f375,dedae3703c1f892678e26b665a5bea1e7e2ba628513953db6c5e0486db0b7907001a052b13cc33b1d0ae9b6d9224eb326b0f315494370d3c70eb24e91f270f5a01,9eb3abab636de6dd0accac7edd4b3be424326c0dc3ee31360ddc3ca0a635ca3a2d0184801ce754aa6ce46731e39664af7b6dbb05f9e2e4fe2241fc973b54523e01,de4b33d5f54abc2eafc71671429f855fffe8c09b508f436826490da7b8eb4a37319a76030d090423788dfc4eabb5cdd723299e524a91f866c90a5edbd4d5ea0f01,7c25287a2eeb4ba1c51721a10b9633a6dde9fad8cef1ead36396f66068821d2e143b8ac04c2612d264ef9b0341b959e7b8f32cd890110ad4faa1cb78b964704901,6c9cbc0b59fd607cc98f3a5bf208e459e5a52c6108d363b298dda7904aa06fb01833936bc3beb8d1c0fe96593d693a9feeb2f5aa1c4b68db70b91fd5497065b500 +52a0d844d74c5224a3c778b130c0979d0c,ddcd0e84cc3c3475e3f93a9b8fa5ab6a560195d8def94c843d69d149c51315dc,db3880a88781cf6f4eb5b9432f49a74122df4bdb64ea0b4e98da7fd05d9400db17d282fc163c123c17e0d8d5fa1894c03c3fefa5f5d83e585e1c447c06a8661c01,6cb365f1b1899c9b285fa7007564ebc294305657fc790cca87100aeb988c2f411be9a2ea7805cb1d64516d37aa4406183d62465197eea3aef917d1b94d6a24aa00,f65d0a158d9be6ce1100a825021973ad338495bfab9314f906d014bd97a66b925d13e7164e5f44cbd218ae38fbccd690f38bf70667621376659e585d029894ab00,26136f643fed1ae560eb2abdbadbe1c3120d4f654c2e2e4e94c4a790806de398591f1573dc18bde1a1ed46d63ed2b3e04a9cdde04440e1f51c6e1a30b44e472701,15dc9f22ac21faebe1936175fd193676331ec7f4935fc0380f48fe4e25f4fbd27f0656054c162b91ce3e6c04f76dd8530ccc94554eed613fae6052746268aeba00 +2db3bab7b9aad3f92b3a1f256eee8c2b6f,8befd012cd15c9d7631525e99ee89b7448c2a376be142dd559e9e17106f380e5,ede3f4e088521ea4120032335c98c53bc62f0e35920dc1a371f7f9669b21d6597d7b15b7ea4b0e160f791e491a0bd489a5816dd02e21ec926cedeeb0961eabcc00,0023b412bd9ada32e9b9a9311ff34fd9a33d1e6b5a742df5bf0c399f9281863d08225a8e519b3f40d5ddb46811bf56307c1a7558fa8f708bb0bed9716b2af6f000,a726bb84a0a4b0abede8e81379ef7d65932d712c1d48c7a4c44bd3d48f910beb1e54108691b6f382b44e8900414d8cef7311dc11d886773a1c13e7b799c910ba01,abfc90e21b5345cd0410ef6c2ca6c8e77bac194969fa8be5b12885d4e75d9de66d7b69f789e90f0fe688cbd446a475f1d26d1125ec995f959460520e7a5c73e401,2051de6ce50486110d2c9af925565eb174f03ac83dbf1307208112e3568e774e6d80ca4db415465cb630afbdcab318b8f0c18c6db20534ed5c56aded7ccb590101 +a7649e2a033d492aff13c6300f22b9ddb3,caed7837232146587b1d1ddfe8f17f72535eb24c866c171ace59f56bfa83c984,d2b53b18d2f197269c919b509728c3a82999ce75982d3b5a11528abf28cef15342379478604ff2e5bae7e995a25e95bf23799823b162ef71e4b78a415baf6d6000,84f24a77e86b59c46ad6338b752c73184846762c2a4b517d23d8f13770af6936203bed0f557edfa9e56ab7c07e4bbcdfeb14454307249394711ef1c0b777fe4101,5b740f47c5446decb72f373d248d3deb353cf43be81486acea7db4b2bef0d1287aafc84de4cda1b1abc8ef77c1294ce43674cf79f1a61958cfa03a1d1791934100,b426a5f5d19b38b2daf88e48466b3f8f0c68d7670db25693399a4634eb09387c48de20174f2f477db4f63f6c42f27de05e9da754ca7d0ff21a362bdf4a34f67a00,7eca393b8da712628e0a38fefa1fbb9d4eddd3c5e16f693fea55e6b2b81b2c5f59063837a2b9d0bc471519da81b71c5c5ca8d3a5f0dd673d098a4bfcca89365a00 +988045320252a49fbdc5ce68063d419858,5f9bfe9dad647eb50101eb56b2fba6052630735beb560d0cd6c219f79233061b,c52119ec719c9f45b868de43c89f047461063b3f0bbc3eb7e5635257ac62888a71c19efff7480b7a534f2717f8a219639fe44a05262a7efbcfeb694a3af4cd1700,f9e2dbe22cf0f955bd8e9d55c55ea6e08cca589a2e231ef86c522140703d07cd4e321965ac25367cbfb7a65a1230d8cf1a37212b45d62644a4ea04e6deaec8d301,78ce2454b130d3f1c5043eb63cf6b8f134ce36caf955cd32c8e4b27b57e1c9f37f0c5d717dfacb8758747be887662e9132db76c385c656addd80e8b3d07f19a301,0c68477348fe6564d7b5962b263c27170e5d39ee69fae2ea285c82d7c1a5357839658d815a4499febd9e5873b6869fc38b20c7d6a148c403ff6fd4749e259a9400,74bd0e15a65cb75c4980d112ecad83a6c3006e54b70d68420d077d621849bb8f19eedf728472d48130ed57c1eb5822a291064957313e102c06da73721c3d23c000 +aaabc74a3025855edae40570a40155750b89,5393503b879ad143536118362eabab65ca78db2ad49f58dd78790e962ac0c0a3,655eee45e8e3c59c33bf30e3d2b1020c149bd29dfdfd93f847003358494e0648098a2f733dc7b7b7d91d7db81cabde62bd0469c2bb88c8bdb9e13feb919d0fcc00,2c05b79ce678503befb1304bfef9f59271a4f0ecc145d514bcb64c774f63567267dda0c86d26142896bddd483d98578925c02f0966d8e472eda2a3bc0e47f8b000,75085fe8bc58b2f6a1559d798ded2297542d826359f6d20bc30171ff9665c3f524d621e65b8ceb3ba591f6789cdccd7212b0a2f57b15a03b8e4824097cd8ceb500,2dbd976918a8996eee7d71dc471534f157e6d6537910ccffdfc17c568d734ed57b6e23e4ebbfd6cc3c3359d5917c21c2975fc320660a6b09f85dda282177339400,91b67a186dfa551e030b4c51f8987a78dc7504e41889d746c3687564d7d2616d57eb165c8469835af5b616b5ce0a14f6e25c437c70ef8b5afa733cf2bff4da7201 +b187f3624d2e7c250406f01824c027423d9d,c5586f65edc2723ff73d8e4fe2ef63841bc55df94d46dfc58cae2d34302f6187,768c1494fc14861a76f6a71be6d91aed650537c0c70e658a8db2ec4d273ae9cc279e72b9423a00a607248d317dd4a15d1a8a8bbcf5fa295d0964e6a3100419dc00,b8b2c1662e5a676edbb361cde4fd5d34b2c95c622f05aa1e8564692a1dd119f1422feb8c0fca5a2b9b6c6571d25d7ae04333276fa33ce8f8b6500d7b282b9a7d01,ee502f23dec74bff52f3a498b4bcf39323f952e1665428fe934b87bbefb1c0c567e405817f0ccbd2f1e557f6c789d95e583407cf3b2834963f0184a0886a855c01,af4c2c44221b5a465007d75e64dd03a643ad885b4b53e6aa41a93332c7d8e0012e8f78086bd3b6ed748cc5a38c4066e739b8561d3eb1450372a0e98bf681e6be01,0cf881bc72a80a00c69e8c80708f88fa292e3a0d96366f92e5ea76bfd6367e6c03098a810be7b24b04da38d9cca5b3053e172fb86d54041778e098c57418192800 +984098e59d52c6dddc5a1ee7671d335ab6bb,263295662f6897fab5ed8fbb5f776ef92a341dc6c07eafbebd25642f2e7ea68d,3c72a318f32f93054ac5e25d69eff37bd50c439f66453b1fa9b6a21c53ce654b7025e1053cb336b7a207143ee556a7f76c05d4862dc55acd67787987e68f574001,149d796678b81a294590e5410adebfaacbc99a914e87e71d931f9132d53859df76aac31c3a45d248ebc8c39c87b35dba27b8365a0f4541478d3f0d41e1f1c10701,f3721de3233aaa32eb09a078ea20385d96a36da8be33c6cdbd8842fe896ee898781c7c2b7869a380c9ae4d8fc228884456e9be832ca62ca86050259d1ce05eab00,7f81a37566c75925ae06553152ad8c89e2333a50eb67dde083d72166f51a91e2610252bfbacc94bd3c365176889917410afbee4484e1a49b2e7a9dfa4dc343b600,514da59a648fb2f93f1fe5d89ff67166cf11f58e72c35f2cfead74c950136af30c336be87da0dbdfa003ba1df9f90792cc92fa2c687116d08ac7affe5c41397a01 +cc48956d9c9b02c82ea6428036d0613cba6a,d534e576e3449bff8babe8f07c59e4a8e2135b9906aacb30d7b30589a897ec15,9e30b9a2e977d3a9b4c18c5ac75f3f5b4a14143c7e8ccfae03aafde52836972266c921082126326f5d230017ff6b5e20525b74f28025c334c86f3c15e3f9787801,cac97638a1a3a60744c5cc458b482091600dd7c245066db1dcee5b86664149247811cfb72fb5625c88f23d471e45e4e04e3a8b9daed0d5df5bf97f3668b9326501,3b02face4a105dc81548eeae3314bbbfc9bc1c65c1da47e6a920032870da6087711358e8bb853f1910154a945c84331842782a011bf5e5df1c6e167c1babaf6900,481510c8529e556a26690131df236fcde14b96a2e1e6d905574b82b3b7fa64c204c0093efc60fda3e420f34d8ff95da38a5af6e394ac7ddad356792681c29dae00,3c2104bf55a2ffe77413202fb68133a4beb8a2a91c5e0b7920b753a7804fe72d74ce76d759b48daf30e08d62b31d51113a697a56c20333a7814ea645b754312701 +3171a33ec82b205e6c4437363af464326b20,23cdf55be310d7eba74174bd97b229bccf42f2a6cb65749175562b2dd6fcad77,98279598fab227111e5dd2b92bcc753cd05597f9c06f843ec4e5107a4b52d6c85918ee1af20b1c8c8e1f33a6b8099d11e6397006c445bead803c7933940149b300,523ee7b89cac8b98b04c363cd8d5abea452bf70572cac0cf3280091fe95f2239606327eeb53fbf372e727595c5b2f1db71dc31acf0abbe3ffa460bcc6efdf76500,68d37025fda3e4994be201f315c78a677a3f930695f67772645076dfbd087ffa2d7c59a9e9094133d5728884a5a07874c62436c1c5938f58c0cb9fc30ca5b7bf01,40694460f16348ef9f72d0f46ff673537dbd4644a2deb1f9eeaea415ca67f2357e64bca77e002fc62fe2e8b2892633ab63d72c1e47f336b064859c7ba570fe8001,b160c6205da4ca637e4655fefdbace3b242bccbdc2a2f21c78480d286dd86c234ff1ba0662427aec594d0b6fc3ae1ab07264cdf20c03a937fb465d7b314c43ef00 +7bdcc6c48315b27983fb318e482a8afa6a66,1f2c1fa841c272754bde67e894034e394c63579a73465f3efb68ba8d6cfc1fa8,d21c27f7ef147479b7c7e8248b6bd8db4a1738fe4d2095bcc9a5670f6acbfe962a10386888bd1b27576879e49761f46fef279f4148b719755bdae9025684ee0300,d37005d5feb26e2554ff7337dccffff8c13ff9e3bb546713b59534c075fa31e33bb6f7cb55a7a6ad5cc74b72dbf0961998e9c633327ae12a229796c2034c6db600,9367968d406bef57b611fc0607c955cb16eae8c5ac2f62f375fc2b6f312131f142e96fff50342fa59f2febb5622d2abf090b27f57b4a5c6167b6e496a981e2df01,47e9d12ad0632dca5eea6c914863659c736b4c63edadf8dd6e0da1439a288f3a50b0dd9d8ce2112b2f19431bb0cf491fb3b3c27e3c5e5a2e2208d5fd26a646e801,67f5e60d345623a453e482c9bfbfc7a2b61133a776b5d0cf497f16692644ca896fecaf89b6824d6aaaa081df100a0295b2c8b0946d9d0f98d3d185ae15ff8e9f00 +d197fb7b3c7b77be5af73d03cf1f052f100a,f887b77ffeccf4ee4f246bb6e73f8b2ac4d544ed3c9ab7fcba69e8a3b04eba3a,0b8a843d160b3964864a06d94dc5436e72a6cab6b821567f3ede0de0ec41eb9e7b53a312ea93ac7e3fe193f28c9b7bf968dcf69b74345855fb27a5de5decbe0d01,56e9a067e5d1dc3b8e1d17f3cbd3cb1790431f052cc97d1a67027f37d9a1659968893c51f0eb5591e91dbc8273987da2fda479ec794ead36938a137f88278a2c01,9d567dbf4404308c24b0daa0eee151d4fcff9fdc675be84a0d389e8c1c623bdc1e4ab9f51cc5b23cc62f3c51c5e01b3be011c4994b49e1c90b251a2bd2c8a30d01,ad045ed16af446e512a4adfb61c893c0cfff0a6c4727919f5e10f53898696c8b1cb447d258041b656e6b34b26e9435773e39b3f794f323ca9405ae00dc75b90a00,b9caf58480d5ffbb2555a4fd21b5aabb033009f858c76b4e93ffa85345d6209f27ef8f3ec4a901aa3ea4a31f22812323a583ceca7deef926dfb76df46ff167e900 +14f413059da85d6d24dcbf8ce726ce218857,91209b5a0ad19166e2d8fc69972cf6556795df71b80e10e17d25f5f71fa03d7c,7b59b53033dfe82d978443851bf95b539d2cbe6977892252660287c371b7a7010b944e2a2204a6a5548eb765c029a4712b2e87e7e25b7f943cdac1b3b2e891cd00,34c584c00ba9aa0cb91bfbde72b214a6054444c1d8ba03c5db40cdb5f95a6f555eb3700a5ecce7bcc8ce20da692b568fd97cbcef8822b5407aa971a0505c153d00,9557a9f10b6f265d1d4538525c233227ff6c3872313b2006707e079c5ead32dd0fe2efd4d49da6592cba426dc67455d01a3439b562ac152bf378d247acd0896800,5ad66c8d9e51bf4b0765f532189bc35536dd01c93faae5e3a95363131df20d8c261d03bfcd3c8676c9eea7180c59f27e89f3ae8f2b4a9ab6028f21c343bf794b00,3d24800ac1b2ae7713cf1054b96b8ce87ef0946533cd2a4d13729b06158b278e25887ae30e758f9e824750cdbcf196ca036a48b4111e4b6d93f6c5d42dded2ce01 +5025410954c033659db81d7e818cddc28862,4a7e28d4f0d070a8c31c03c66c08aaa4e847e906c882080425934387a323d143,98fb877144d431f14ab281806b74ab021645af7310388fbdd9c8ca33f23458031b8a7ba7a7f6ab09c297940de53216615489798f820c197cce9def6e60a38ea201,f1bc130df51eee9b999a6e257c86d08c7f21dd9863d04b57b58c8d9e5eaa6add564023c59652187eb26c6b377e3199ecdba6dff9ae809f5994e1f68e2080189600,07968a9346b6d25020057279270869abdf2adb1dad8833b300ff426061f17c505f8ed5c6295090685590c9e5b088a7035b0903e02a74082eccfe773c60aa3b7100,fcbf40264851c66590fddee1bfdff5964f5d3e8da37c3d45fb8a71e37f3844db791c6c0d61474f8d4a2f398782fc87c962f34f6e758d50128fc72c4d3e30285000,9682eb1ccdc96fb5451570663f9864d04bdd22f7f6108017c0fb4be5856b945026eb8ff33810d9bd5797394304f2b8ff19a7889563a2a18658ce64c2d7d904d000 +99089f675c733cb0a448bf42edad03eb3a5d,98b6b3a0a9aa67d467aa88710525f876bc14a94c0b44f328dff668325c4e1cb7,fb1d77fbef402bd52364340654066106808b35d9eabd7b6220f255c04b1d1533440121488c5b67487cf47b3ff94475308eed3a4bfd239df399ab0ab297635a3f01,322e6fccfe2522cb83ee4c79733625da26e7837c93a56a2a6428cd9039624b4b3c9eb7ebac9aee936eb2a6758edf787c67e964b6c8c475734da0b3edbf7d344d01,32306a57f6e8da78cf0eda7ad43efa03454a66724ee80147eac581ea436ffb4c721b954fd062229ff0705eced2b7de4d9cb11706b7d5d23f34e3d0256204f34d01,a76c32bd251acd215ff53802736099d27ffd2be6583eac4231c1b7708aa650494fe654eb013c44c173a0261486e45c3cb24b0c51a19e843e4f781626c7a3f6bf01,8d160eb08f8207c171177f583ebc0ccb2fbf4914212c88a740240a80e8254841128f18840f0de34ddbeab145fb4b65577af519c332ad10292785c66b55d1248d01 +8463876b98e9e693cff41b8a1b368606e94e6d,466c79bf9f0dba8df95860881b964ce37f44610e44bf38067fc7efeb948e3854,dda7925cd09c965c6e74a5e61caddf83c4155c5ac261585cb975323f786e1a6270cb26d87fde7df92857cb0872f920c4c32feea3c53599a73382a4925e7d064d00,5d8de502c720bebfc7fed78ac98debad142d3c3fa776b9233e32458ad6e80623120fb457e7cfd9a0a858e7fcdd909ffc725249ec8790c787c9cd0e75e03c401601,d49eac26a3e02295f2369991a34755199a0430c40a9a8816a8f02a70e443eed233a4b5ca95c46aff30fdb6f5a13487a08211efc89e7912822c2d118aaba6bbd801,04b1599dff55f63f6bd75816b6bcf578ed781a8aba758cedcf574c80dd1e9bca091e7c5102a33949fb0a447da66947c5219fb8a4c08b472ec7cf4fe69eaa262e00,08977f81f5953578136e9f6323479aac0bc18637ee7473ea8ae4a666f5b35ca76140483abb40e6affdc6f794ed850a5bc31f80d43c71c2c380cf0359cc6370b501 +5ca25362dbeb575a40e4988bcdb31e12102c59,8f79bc15c7db27a08984b4616a727ded92056898cb74fafe982d714c746b394b,4f5fcc93863f242b3588d28b600946bf4eeb283134e7abbcd20407cfe9a39b094228490525b577808b81197ef2f34e2e5b4c74540ab84d765cadc7709fa89dd201,4bad7646daf04b1179005e984dbca252cef0fedfefa4b2f08af77255abb1e8ff6d0639aa692d8bbf7fc73dafc852d500069b49ab355fc83927977deb5111791f01,782f00ce71728651235c2afb8bb26a198e288ebf8e8a199d7f14492b56d4ea9a5577cb5394b8f539d0cf33f18f06306393e21862a3b8e85bf544afe43947245d00,74d8ff214c76b820567aa6cf01d1b83377d1ee7b2064fe8f41908843648d2d557249e62f6e7825713e0c3305e5b690dfc82a99d5383fc3474596fb201e32af5201,ade9493e8086760d99a6f6f55ac874bf86409ebfa6628dc5395b46bd2e70d13c3d0fb8d20a7cfade61219d895629fb4cf18abe583033b10665ef23f254f8a9e201 +a37a6e340aad049f88fec0f64c2dfd7cfdd95a,6424f255199ca7d5aa705bce09c94a8a1de15dc705df48fc16d76dd959b5e8c5,d92ab19d2445098b89cbb40bd6604d8622f306cdc8d79f89703d347ddf75085116d2b4dfcf81a0997c5c13ab1031aec00ae64fb3f8225f824e9ddeb2852d392e01,1d94e0b78d44f06263a014e9c26897e2b3b506fe04db1e344d5a781ec14171710643e4f363a9507e63009697534f20b895f86fcc53c4dc5ec48dc201f893fccd00,87c9e4799579cc2e3e3d93c80368b5ee50c2c1290b91f93c17f577ff473934f20c7f251ce026ca3eac34755415abb682fb99cc893d9a1b8d3ba061d1a6e60b9f00,b3dd44ad95a6fc92542e9e4ea7a3fc0738807dffef2430c1dd8a7b0a41b996de29ba2d4d57d5d6d4518bb6711fa42885fb1f729dcf4cda335e550fc9028d60f600,674459370b8aba0524f6ee0005b8c2e088a6bb404f2b7c0f094750bb9f30e78d700f3f1a5e304dcbe896e0a0c902b159997e0f78ed31cdb7407b9c08c68e88c401 +beb080c1195eb7f2b521b1488a83496ff7c8da,28ba81fd2731a8a7a13914fa47f745cbce96ca15340ec5e7a9816f923263d1e9,3dbb1e3a952d29406882bb5bd9e38032490c1ada131f2be8e4ae912360e2a65a214fca3b231f54b454e7bd507ac3eedad48c580181895f885630c3b61f54d60a01,f59619a9e8829d04cad7b85e0bf01fd1bbc6ad0948ffce31a3c33607422990f764738c13265556a8e1d4bdb1f4ee2b35ae2ab92b6b5d19114721f895836a618e01,2b7e38e1556cd570c8538b326f3e786778336cdf66b3cc77fe50940a20c08cbc7784d68438f6a2e8dec935a2a54ea438f2112f52c8ef03986dcd0c4c590b041301,cf3d25f44a6948d63d8ddfdadf430e994cb051337434ce38db008e493374985251ae5400e6c45d47edb386446a37638e6dfbe6b8dca31f83088c2ded3916bc0500,1583f012175eb459f193e82a37ad0feb8b4e38c90d8c8af5d62c5befb5ec9dad06e22b02eae908e3d8425874a130ef1f68436b1ec2e3712f35774ab130a856fb01 +7181bbb5c07be5bfdbb73b1edf39dcd56bfc09,cc00253f6f782dd07dddee5abf3b65b0ef6edac909100134dafde88f8da40176,853aa4bb58da3e7c3407df37fa9a5977fb8d232e63d6b6d8e44f51d3b934ab56353395c1f29c4fa0a9ad3789c82afb69cecd12f60bdf3f1365472788bb5474aa01,cefd569c81eac0e7d187e411e1d774b16e7ebeed67f60ab9c48914d51109bc335fcc39107f6868009b38016a0209d7112ab6c3168cb6709fd6441e25967f143400,5398fdff3154d0570a1856dc2e8ac826a4afd580d0b07134127dd025fe3210f10d447363340890939e9004d71be5f9caf644dffae81b12b40db061a485b0783b01,fec020b84a3ebe24108551624655d85cee97db57c380992a1411ea9e0683eb475f84f515cbccdb8530f4771f54216faa6927bedd237580f8b508721f69c9070100,2b6190e2da617056cdac5155af2741d011b3f97b1787ee655359ef31c5758463642cd35a2b966c50741e6f35a83cdbec46d7f0f9040f4ac85ffdcc87b34c8b1701 +b9fb94cdc3f22de6504c31167555ec31973001,0dbafed0dea218b881f41447991c2cfce076fc34b166029ad0538fc8e5f05dae,82e71be9d6f9e7f00266747119f9f154c300c8d09dbde36481997b1974a9ccd05de0b6e8cbbc8c6d8d49539724213d685bf43d0e9f710a196d79998c15d8950900,3de2110c62ea2fe6b51675d75cb8b7f184c5bf68144cb42097f8da9c8365892f0e1f4568855ed159acc02886ba74b730e260d5c10fb0768e2e76e0cc30053b0200,61dfb492d0d6922e1b6d7e91036b1efa57ab256066f356ab49e68cff1931c24a7143a33a271b72093741d28340ccc9d5f44e59df9ebac74c6ddcdb1d6bbbb5e801,3b2b65dd6eb55d54a8923b8e5ca820bafe3dda90211c9f6696c93f765d6b9c724ae53f96ec974d52bc452c2fe84cb183ec0ec341ff0b61bd20bf638b02d180f201,980ef560742409307ad2b5f76044e456896907ba00b6e17890088864a167f3100ae64ac615e3bc4752cbc9c3b6d1ec807cd0ebdc128961f014a6f53d25d8b3e301 +c80f73bca1532ddc6b0252ff949f66e75a43b4,e44e891177d98f1df5471a6185410d541057c401a0ad4ae21aae137b5a203f1a,406aab72bb7aa77c969a56368b578b5e431aa6b79166332dbded41fb17c1c98f5f5ebc1ca7a9fe65df50e260fd7ff52b98961606640722ac31b63a12f3e7697a00,e81499865114c3d416cc90894ddca4dc942c729f99346b77202703f1b2d2a128287da4fe288f08dc7ba6b3fe9b5ba72f43c68864ec57686fe5b4cd721f453c2600,ebafb774de6f027162b82e07f867f98895ff227b19ed2e3c2ddbb12e178ae80372fe8892c729e3c10e6129b67007fa6c16b4d345ef3a90634200f2f55ec0e62b01,fbdc76f8e4d43cd6e4efacec075bea2d9263d938833a1cf92852ae4e5b96637d3efafef63559df9b5d8fafe14815700310befcd8d12174df1a3bd6d087e8e85e01,6476a858e53be18e388b6e76d2a9f9d97a9bbc0448ee32bfdd087ef29e39936b5ecb3bb574ccad96c4294657c6ed35747422c076ac766956ed632f02cd7cc09200 +6c3830fce33c357493585194eb8d578b6d06d6,33844a944eb570f68bcfed9f487aa52c491017f598318fef3fe9decf34a643c4,b84eaba1cb2a69acc9a68cf6d0d3627b2a541b77fe9d5c6c9c0236a3964e4b735f4174a8071d8282a70e3129e037233e403f23eb3012ff97cca6a3488653dcdf00,50469622fc3729c92552a287ac877ba87a17a4d84803da5096ae0c77074c1cff2a539a15ed9a89808b2fb06946d382a416945a5dd265f22b7910ca6a5bb3d3e101,f69a3070608692dc60c2c1389137fb0ab1d1df1a9d96300206c1c1ba4adb8a2c05affdd2200db98fc32c082e644c66830b6e1e895fde52cd3a679da4ee15320100,6db739eca559b82c339057459ebb59e47128598ddbd0f52b88d6a6785e86aa7805e4c1269a58028741682c4fa76d3a2f4d0e27fee52d44889ef170edf161b03301,1b4d201ef21683903eeb310e3c96fa6392f26e879c69981d145753345ee995990df054c84b7c1cd83cb1945ef88f18e1aa1c86910de73f36c7b17e529d21500501 +d49ceb5e3b0b6f4f488e6f829ecba9b6674e48,3f81075f214181db64b4094ab1f06de6ec35b63fa5f301c041b749ff5609110c,a72331dc4b0fed656cb01f03a9346afbee9d43c8babee79244d6bf3c27b69e834e5b1e04cebaf3c957e124e7807a530e391b445d83ccbdca19a77422237126c801,e6c664aca3d49de90312311df76a7f201112351ccd4a7419e07b8d7b71c7c7e664bcfdfc6d5514315d6171bef129b131a1438de70ac2e50491356d2f4f19303c01,b17e8791ef1fd0578086a84123b2986952a4e7e1c5d51744c07aa26b1307f3cf2f34277b388059fdb0cc4073d5bb0975783e0095c66081c46e5947d21fb5f79701,2f2ce099c5bdf67a618e275a47593ec66cc33d76c84e93694f5f946000e603bf52c116fcf33c886c7b734053424e7484ebf88ba284042810b00f7c9bd552b71800,108ffa1567f9b3031405ef17d1a317ca9b31950d8b044e59697827164b7b00e472aaa74e1d7d9b1f5685fdbb723334dcd500e9ea00f8db4b5b8d2ca767b87dfa00 +5d5f8ffb76cc05709937377610d09b88383599,3f5d28a61f40604fe76e8aabfe8d917c1b2bd5ff0f760101a02f49d5c1632a89,538c7b442285a3a936c6eef101d6e10498e56c46447f8b4550e7afbe68d2ef17538a7b325ae0bd879b64a2f5bc38dbb028a913466c6337d474a68b3893801c3d01,9802a45573d0ff033276d8ceb9530b0021a1d5750a27a452ff8ce09fe1d432323e6339ce5c5a82f5746c199fb780e03d9ca028db2e877ada72b635b2f9d500e501,8b337b3f4b09c0190501a3206a344111ee9566048ad959b7b18ffc31d04682cd78e19d0d529ef61f0c297c331400ce329f9ce9084e45f4dfdd405097c66c823601,6ced9495585f454c4d3a6ac485d2b212bed6d35625952a4127a6288eefb7e5b565ed2eab424dbbd7337377951ee44c8bbe23e65323bd5ae67602dc7ed593838901,41656d987ff6e5e5b2cba458db816bb0379db50476f2fa009365fae3fe95b772380a926fdffd4741b5084131943e7250cd3a0e6efaf9e763da37a4e258ed100001 +31053dd472470cec0ac9fe6b346a6f8bc89bd21f,b50442d6f99445ebf154580cb984dbc98ed04496713403990085901637a08e8e,c641a3887d75d8b7310edd0db6b18ba965803044ef339014c932e577c30cd62230cec30ab1aa0dbad49a22e1a7f14f2ab1689b674116c0e9701c581707ca438100,56adf54001061089ab6b73c0d289d9ea4761a69458f1d0525b6f2978cd62eeaf1c17fd7a5111a115109bb04afb3ada2eaa6b3a7bdfe483e99f8fd1ede75114e001,a33a6368e5453a80eed1bc1754a6714a50ae1dd3960cd9e63bcdeb8b8229d22d514cb82e0a6063457cb6b3829281ada2542bd6d615a34ea55a060269727a085c00,c29383679549f92669d082509f0bfdf325b9152aafbbdf58ce01852dc985f7aa153547bc2990aabae8f5241628f97f6af45df412a97e5d9442c428afde0bdef001,b81bbc2178e6b43938a6a63af107ed1c8c20bb14fbbc9fbf3ef33b1f69bbbfe66f75712abb51a93b3428ca63c3bbd27930a2e0714ab7b679f045d1d6091c83e201 +c9e8623b9e869b990abe5002201e8ab9fd2bbb61,73a9cc8c3f8cd367bf07eeebdc8a7409cc470c829de10c8b4c311ce3de2f992b,46ee344efb7e146d01698a3a16587f5024d84a11f7d07ae8db39a3ba84ebef835b2d0bc2f83c89ffeef2f0c36f184f6df8bc0e8d77c3482099bbca1931b04e6200,c5b915d3f25bf9e90d9aa1a71e3b946848e1d5aca9fc583ad6f7b4d482c45fd30452fc7fa4039837cd52ef0b05836bed63733d70271abb68079fc0faa207007a00,20b356d96328eb3bd93eddba8bc5d511be72aa74e500fde34a91b1c982440280714edd1df7fb0d7595ae8c08b1cf5a692ac1995da75c575ec2cf1b2bbc45efa501,a287cdd145695ff8fe14a85bb8877a4e89e4ddbf86ec9ac641a97875f6e6246558cc68a4db8907feee785a9ab28c8915a83c3d8374ed23943f372174b9c9163e00,2e1310da18aacfc77e362f975994a7652fc0d84f22a1d95f5085586cd4acb2674250689bf0ab167f5ef787e8463e99aed9742ad5401b538ca348f8825c97c0eb01 +be424a6ce6d7381ad2c9be2e85d028e3f371ba70,2e8e2f570f02b8efddf7fcbd4130cac3559d604a2c15b039e65c432fe0449cbe,b2f7adc5c27e52c6badfe42d5d49748e46a9fa3f18d02d1a7b5eec8dcbe4ecf635d20d7d0aeafa5d4a21b6d9e0a6851c75a32227fd73710c453dc2bc467a0b2000,5ec3fcae239d55abc45664dbef7c7fa69a0b6552423f5d7628850d8f174b5baa557e1e9dfa60f4261097b7c2c06850b18b829515b7c81800e3d2040ea34d4e9b01,464c84d1501957460eb6724a8a8d789e4716dfda6a94e33f1e37549d4de89553702ae574ce0ec3a75f39876ea9ac0cfd6e83e0a918ea2d44ac78ef82205838da01,b590fef4c43864ed2587395d262e896fb6c0e304da0ef88b3be09def8e6da0b56d744be1e30fa862745dc07bf2aa0d4d78593add9d5ad151c83d5242e3e4de4801,f776dd3f2c89f3bf6707b788fa324c90b6e2863963f00d1edd5df4a97bdf47bb4944a31457d67bf694111cb1dfdda8af687f5424ce6cb4598c6433e00fd1000d00 +b3e96a634c875c1627a9e437d6659562887c5233,88e190938b049cfd5a7784dd08f36d7b93350608c0d187bb5d5655599a2c9564,9a71e11c578554e26eb1d98972264d7d87b39bbfbd35eb5698c700bfabb447f50401fe94d00fd478298376d523be9ff1b4912109200f4178ab83403bd122337300,2ad32dc0f1cad5b229bf470b64b8a9a529d88205a569ac0e3e527f9b8dafaa9a2e0f599e5dd6944e52648fde8a02bb489f50afc51c4ca4f0b09955e6bf2d632f00,c0c864399db204870b58c6295fb183974e02edb4481cbc6ef6d63ff4099fe6df2b1285cb16acbd2542d768f884d6d8c67b27b495bfc41a9ba741829d9b750acf01,d72951ecdb98c0ce64c52b56eaefa7b1429868ec1a086a8cb49e72782d6b03b0446b31f40837373bcc7094aedc35cdfdf6f19b696c684bceeae37ade5eb2072900,8bade0087af5895f11823d89e8474bf0adb1ca7fbb2e0d6ce984a57391283f2a70b8b7f6cafc1e28733dc31778121640d1df8f6f881ba982bb6fceb6cdeecdfd01 +d538f2de3d714c405649a6d00f595f473a2d693c,0ae7b1679e86226b9496bef62d3d4d5c412c289d76374c1a2e0df77f4a79c01d,cce8f5bb5c9602b57926d304b7fae4c94ce1f46809a54a8d7faf0088d83004c6784c634646d1919e4ab1a359a3e516a5a4b0f9643d89d768b9973dcc59b4034000,b78ec862f81db3b30098aa5e3ba13d3a7644b909acae19e26a4216b0d94b909358fa652487a8b460c30e5a86361c8e62236c93955291a90f1012a6d5b149ef3800,f8bfff6ce930f218e823e1448c7b4277af9686966df0e280d2959498fa8d2d9a5bb9f599339acb9dc22f2c6f74cb669109fd67e916f17c46dae30d27ae5f0e9401,dcd291bb002bd53218793a44195505d79978a9c311dff4ff6dad1448a9b3f97610ed1ac4e0202523a6e4e11074aaa6d3edbd2b2bf389258d76f46b0ce9beb33901,6fa720a7d4956e8bed03623feffdf24ae56f2340ad51f34515df2cf8a5585df800ef91bc23917322830c1f5926cab55ce3e3cf6e90cf981a1065d214e263854701 +d9b175d08d8ce52e446e3333050c74fc80145efe,40ca0c0b64b8a40c24e65e7e73bdf7a4baec572b96491c34078ff9abc717a7c9,814a0dea17ec261059180455461d450f7cc0c805e86b5a321777d2a191582de54d983f68ef9a30f9f6ef27b3072f1234ef08d58e6403ab86f160f41beb4e9a4a01,0e04ec7bfe2d6632f7daa03b57fa3e3c25a67e2d014e3835f58fb32992423ce651b697e7fdf6c820521a8a9c02df5bf608329ad606a47e6f40006ff4e8da9af200,169c20473506950f7c5d20d1292cd7346a7373e25b4dba59cae01931ea7f3b45461665fc17ba634757c4672c5481d4d400fd2aa4514e242b400c0041d192b77b01,9354a8843f633bbcae67dd6ff9c45b9ecc071b2652ce1e40cb8ad64bd63ce96014981c5f16eb7e8beb216128f588772ac4c543355ae41e7e10ba2eff7c43974501,cd45b99c686d74c2ef1ff06c6d62cb974a94900b326263bd5427cf14c4af818e31fce8942263b4f5c8de94a02c07e9dec00cdb89cf2b7748d7172b93887fffbc01 +5f279fe05ac7e404fcbe5c192a313c4c6013fa81,377f2b9657dc6d9649872f914e37cf45e53885b6689c729b1a3d32784aa9293b,3d9e68993786da4ad6a9e8d787346b754be629c699f964f2fb99cb3114693b0408a8a769b5d87d29a59fa95adb37e82b15bbb078ebb7e79ea98bb38b30729faa00,8fc9d8344cd8a180578fc42fc968461cb3580f4eeca1bfc0e9ff8fe5df2eae5e7f4fcfbf629add5b89dca6d22419ed28e4f2c6ecfc1bc608213db58c77ac076000,8d2090d5bf348a9160c037b63f6f66e18971517200a5e09900c24f8ee354874500090887139ff52e9d6f31f3f8d8e81f02f0820769d1a6119cfa1d9ee6df10d300,4243309ea1b6ec421cdfae2c62f4e0f3865e4fd9c6e8c2de6fcec8e0ad7d1fac7d07162801e108fa7bc28c3b8bb5785c4e544715c42c20136163944cf1fe562101,f595f945201f14cb646c4217802f381fd660224a22dbf6baa0ec8fe17317ecc5562ceb98a41213ac45f850cc8abcc6e78d03f882388b29e89223b2c4d1a741f401 +f2ed242f1574af37cda4eb5dc925496c68f61ed2,8ced11d33180c36a67f4b4a080155028dc1816478c6d8d739873f5a45bb493c4,1689ea4a013a25ac7e70addb8b0b4a5d1360110ea44e65d89b7f10c246e3cbc904c5e3135b276206b09a4277fdb57fa69f29b9fbd39cd0e97654ece02212451100,6b6112d1d0a8c4c8315322b09280beda8753a9c20b1dc5de4483bf3b3500b6470844e26977b0755c413354eac80666ceaa20543a846c93cc3b8a888308e2fe1701,dba5cad2318baffb75f3c41b4b9d936b5689b20d3a5eb2ddf86d7f364565643c0ac59e19994b2e79cbfd09e3636d5a73e3c51d1ab190291ade303ba086f7da2c00,2de053b13a1173c107ae3a9356463711173af7ff2931cf9f6e5e0bdb5b4e9e4a1263e0b82f04129a61675bbaaea6e79114f957985890874c189f1e8946d26e0d01,d8628fcb0a3a45dad58ef6fed8fe1473fc5428ce7b4bc18ed35406ec9aa7979c75be94275e562a97f7e7fc9205c4ee4eb1dfa78eaf6c317ba78110afe7200afc00 +b987f4a5230c57a3273c6d77052f8bbaff81780d,030bb1cea84128b60a334ca9ff49c8e1f5f63b886f17fc7173dee0930e338f6d,0d9c74447a41da6ddf4fed273ddd6628151e56d0da3c94f4b37a8d6cf68bd51721bcbcba8c94c82ff2484460a35fd2fbfa45c0393ce1e55191cebe04b3806a7501,3e4b26d26cd9788c40b5c7b10a26057fe629e4948179672d7755d2782d9363b821d6fb9be2917166e423a26bc775b9e45fa66218b58ff21b376313dedd703c1a00,53965cb78694264dbca10ed2d6488694e24b005d13d9ccea6475f1f2d9654df476491236b6816afc064101f7cca0bdf75ae013f62d6cf603f77752d4dcdda1b500,517ee79fe03b1e109b58df214da1add2719ca8af6fc0a0bd43ae9ce8461da7622d1363e092096772999d07eff8d850b8f5cee09a6f5c4bbed92741e5eefa965f00,31fb0bf627d6828315aa309061e28e4c6cbcff9fa2b0966edcf80c39409909005c3b415e211d18d15c48ef64f5576f7e4040facff6e185826f14f952161488ea00 +988b17db703959ec38ff1154cca419ed137241a5,d3ab61747f680d25aef74a8ff13c5c74c9a5d2ce8f3147f44f429d4dba4822ca,a3969e3d9c5ef81d8a4e22925a7f97036162643785c899dacd15061c4f1958c61a126762c230d11943906f127278c2d3bfbd44f9b67f858e21598907b719a3d101,60f5e415e9946b1cf7e6c702790b55a08d7f97557937de978a34c3cfa0da54b4030873556bbef785613d5e497d86ccb242d61ce213855ae00e8f99c521563d5101,dbfdb512a046d969d35b03d796814b602fd9a2b1aebdb1929b5f9c0888dcde782edfb69a480e58f431d7191b25d43b0b479dc3d5026c2a3742babad610aef6c300,45980ed96ed1823aa574ee184206e2266bbd6fbdfeae4613e4478e59249a24f45aaac0d44939fbdfeacaaf1b1c4198c44548095c10df22de2e479c612b82590800,6063ab631f35c1fd4284e6ae02c60841cdb36897a3922c41cb90fec3540dc2521905297f6139061d55ce91d8997463ca5351bb9b7b5c8e5bb36d6cb226221ae500 +c907691fbf21c570309dea49640d9a32a353f6eb63,65aaba13ca7fb3cbcd3eb9fa95b0225749cf311959a3126573cea690c6a60868,d27230213338baf9043d329cfef00913fe58978ce13d3401649acb879f8bcc5a185c38674700fb32182cb1def23239ae49fffd028ee74d1899c558860d412e4400,ea9a8f04ac55f9ef07490cd27399f061f0c73767671ddcadf1925acf9de1ed841455995182e187fbe5d3912302a211ad1382b1ead137373746e604e06ee78afc01,05c24c883505455fe49caedb7ee00c2bd094ef727a452c9ac03b143161b49955514b935f48c8469476d99acbf6c9e9af87157bd781dedc2080c9f6151711b32500,7b2a6268ab461e9a97cbbe252ff8ca60c2be959ddd0c7b88c469c82b08a34e945a009b7c80c6fdc6e921130e3f454bd339d643ce98de6949c76b841a0ce6964400,72f999c01f1ddc32bbe24ad5350e1a1efbf5b8da4514d560c817daf53333aca70fed9852b439e45fc7ca25ffcc44141548942c874e3f791f4efb0c70270dfc6b01 +4dbe8d5104622c28a4b9b5567be267d2872f1ecdc4,7530fe790898d26bb8188ecf927056211569288ed0d10b9c8775a4f476d5451f,a5a70afea937f004c0c9ce9ae6be9b8e9d303ef73edb82c7ed85dd4e95fe3a4032819da056b0d47effec13db89a13c68a6436cfb206195b8ac6a7330b2d049b700,6d00eee9faed4bf7adff42d48b9cda184fc4855d6f323acdae305244e05f978b729388a74c7fd6cc17829f49a42c6877005071b85e54303451bddfd60d237f1c01,06e22860a334fea71c82f5c90022d37e2d86a3f40cf2ff4aef5b33205df735c1189d70897223bbca95634e9f448a425ef78c85b1c4d054661f7bab7d003215b600,bf84199090f63e46f498248b3d331162968f9c6708da25139bb7f7bc983294765ae04b929fc652a201b349c4894ef97a9d28f253eef04850b8fd7d28dc6a81f401,b6299b5c558c098027e0e76ad9f537ca6026755c4700b08496cd1d5d4a86603c1e315e19eee3d463c0163d555a0e00d5119caf9460a17af6d63aec2441f8a7bd00 +730da058d05cc40bf4e2a48f800875db3d9070508d,58a7114d3c4a131f70015719dde666d83326ed17d5db728c60af2ffe66c8d107,2a3868a6bc06e2bf901c980779365c9c7dcd8b4290556a82ebecbaf8b557998229b0bee62cbcef7a22c035aecfd945e579e1354238a1fa6182bf118077afb35c01,9fb89f3a2e231ac54884758a665e1145c52f5f8d63d261beb7140aa04c6c4c955d486c4b412c7459da842a04a176fb6ce1c3b7113d783d2e1a4788f7a65b884100,48b32ca58d87d0460d9b7f61b6189a8ec8b7b0d839fecfe51b46b617997f9f3a2a3ca94d4291732d698126e8902312b9417766d34fcd88c8fc56118d55c09d4d00,70ce20de5717a12e5167ed4d8b2a71293f6b26e212df24d3e8a4c5c5de156bb51eccbb383e5633a3cb162647819f033e6bd61d557f26cee622332e109d951fda01,61bdbfc08f6df181e44fbb9ad9ccf0e445b3ed17a6178c9a92a614a6da48ccd767a3daecf9c7825bd31b15941cb926d7185ea16ff90204bf2638536eac1b057b00 +1917307d00b0c3c40c80d5edccfbb49b94d576d87c,393cc2183dee9084ef730fe36e13401af80b437719e2317080fec9a2a442f90c,b867a955bfef63351b96a429b9fcf2736fda3d5bf4fed49535df4df34a92e1ab715b7827159c5b49ca3677a360c6dcbf6c275ceb302e470fed7205ef0f76fd1701,a73b79c37938f5f0c0e05ddb933497cccc0a7c0252de8ab88b91ca9fa0f63e276c33439abf186d31fa170bc7ac23de301f8e38329bd076bd1acadb3a3a833e2901,f627dcd7d6f42526fb3b1c7d2ffa411c1671490c5ef99d4b1c0e947eea2ff43a6f0360918af1294f9f8622f8c1344e1de3fb2433e7047b1713fd65ae1018124f01,7c10cbe71a9b0d5b512390d77cd317cb9bf165295f7ec756e98451eaaf38d0782fb6b3057073fea5b12695973fe4a3f143f1f256e64de0a9c72c6587f36f144401,f653829c10a4fc5a2966eafab3e91a5837b8e29c48aa28c4236adcddbc0e0b276b46aecf38873459d1a7d65d09f19707b3d971630da01f87b654e713847c992600 +11cd32855d0a3bc3bde9b99017d85b4645460479c0,5c91334c05c26787aa3b1d3e0faa531e9cd445319f3c3e2f5a8736289e63e002,4528be82934c6c0ad87fe0c802ab6ab485ed8b3325d432633eae9f10c09d28b72674125cfdc45f179c9641b12091d96e526c1f2ab432e511f3a3744b18e652d000,d8f921b7a99354c7c13f129e4bb58fa0b47485d5447baddb650be1072ca3c0d26343d28599356717647e86cbf1e3b5ec5c0f7a7c4ef8474b3f119ec3453b32eb01,6dbc4aab89053ec162a5d95191f2f57646b63a48446ead38fc46218b9db14fc16e3319d962dded59a3501889b7677d455e607c6336f24b33e3184c05ae6ee8f200,a3c97ab6f036c58ec6dc1549d15606425b2adfc8c11ec93541832bca3e9483613db983e5a6a4ebe56b73641bba29b855f1f2fe396f80163905a90c3b7c96824f00,9cb1f8c49252dba48f5edb18398d72084005982923c9670ce511bca81df669ac3aa225e865ba8109560120280fd87169236166a6167a556d05890e60d62912c600 +7dc635a015870dd264ed4b5f86bb27908f7bf03574,df94573af1766ffab38bee702dc0a7af0519182e3c894d1584c13732dbd40568,af6675b92b46463d396850e477411dad1c9cebd4c119e0c629427fe9493abf4d6b522bdadc8dff6dcaba8134ad55899755e4d36d60feb2b601a6be3e0270f43601,5012e844ac2e374532c32ea610911e6c0a61a5a733d783e87020e1a2c25ad3594037524786e005d056a7463e1a13cf3476591538e7f3cb285e8ac20e869efcff00,dc775a8829876c43c7c34c94a97f66c193e488f31fbb814d76e26aaa302772c310ea313b7a0e76d99a77fcf663bca685ca59a81499a94f9e63ba0ded7ce41c2000,7f42d86cf4c7185bb2fb0ba618b16a5e3e51ec3b21c940748fec2b46ec037d445aa868751321efea1a191581a9abe3d78fd7e112d19123ba8aeb37b767ad92be01,622726047aa3af092c8ab1d2578359ffba4b47c3f8d50da854779b9883f119cb51293c3b1720629a711474a9f2ff5e35242a2b62f11d09caf31c5d87e829ba7700 +f9b439cd44eed63d798a1a7b86a0b6778a0d1f4448,16191439b7efb2250e21f0ee9fa05f07f87d00408d5f9d95f7531d79f461af22,4e97aafe5dc9a8586e6462b9158b969d2b2e172990eb467db21ce931187cda8409a955da7d3ac6bfee9bbddd1f018b0aa0763e51f0eabe344e419605ba10cfdb00,f021c2b8ab6d559a9529c847e5a6cdb26bbdb41149ea76aabfc7f5475f3cb5ba17ccce790d73e99d1ed2abad31dec65d21396ee1f662d4e58e5495531fa0209a00,bbe7be42c0b580c9d25a34981a15e9e00ee3d2b80fba07d5e461d3af8f78cf8d3d4a71678b463368c6d58921278506b7bc8c8d7b5abb5585e6f3f1138229113e01,8c1b5f6fac1c839b0beb8cf23bd9d87012da8288ee7fc5a799d71aaf5b852fab5229949b8d161055dbec06b31e3bc2be7b29447ec276acf66480d3fcf9f8455500,3059f65ba3f54cf1dc742310c5863b73e16e7e9859a005fad163fcc88d1570a47924d002d09159fe227d15bf59a925e89535c9b56b3bee1eb3e2c0810470f7db00 +63ea9e1bd9a47535a2c72f374322296c62a3251c4b,553a70d49a1209b15e87f438c9bc1f12ba7734f0f799d82d8e73de1cc542101a,6aa1edcaeaae6640371412b29b0c95a63da43fcb170550eecc713363a62198e076cfc46e4f692f083b76a1777f3141192a0acc5cfa1383ebe5193dbbc57c10b801,a66dee9b9b5d9c099a95a17681a43adb35253303dfa57895bbe629d7a55050072d508fd0ba527e8a7b033a94f3c1d148ddf6dddb926cb9e30111d481c63dfa0601,077f1ce1ad215371a8a2b4b20e62b4fc642e0aa20a3e68fa655f55560a698b761f2bb8cbabf773f4f7fdf39145983de7308a18044b4167c22f8baed0c634629001,c307f3e70f00869a7b1d5dc681ee9c39cca48c8450756d969b7dca2e0b8ffeb13f7e33ed934d6de51a17704a91d4a4ed79f1ab4976ce6fc2b6434c041ecb75c700,6f1288bae91360a2387f52b22a1e59f05ce33bf7d5809bfb389410247577f5690d1021bc347d7afe0a2acf63143737751a3671b16d2aa267e2e21c83d5ec992b01 +5b4730e9c427cfff77bcf9f59e8c009a4b8a77395e,4dffc398f4cdedc30f7294bc7ed77c99035ef3bbf529efe78821ac18fd565ea2,fa440ab17c80219534a417828f679f8614b2c8f7d66b90c05210264c1aeeb1bc6966981308afc4457713f5d1ba64c94be32b2403c423c7dfd7132e24d471235900,520f198ac90eb410685d8c831a8e8527c92b52d490a1c3388ddcde9ba99a7f0b46a0954681f6507309b484a64d223ad67fb2fc2e3af10db61e71ca56710127cd00,b2f26ca85cb5cff72c8c88ad56db7ec7a4aacee4e55015fa604fb6827628f8697c2eeecbe230e36d3726bfbb9a205018a5349da24f305beaf55cd75d5ba45aa900,9799177c7a5a56608f3320a9ffdb088115524a398b2edd917c9f8223bbc3633c0a70aaa9db38063f96bead8280488cd9ab525a1400e31d3bd03d4427e8a482cd01,d79cd147c92ab05478ea64d394a118de13f745909f2e54d0b4e88bdcca0338372e2833e4cbdbe94d95ba0ae5ad5151b73b039913850d9903429ea28fab31680f00 +90831e1198f2a14cbe0d901375fc88bf97c73ac335,42e0bb84f8e84eb27b47a844056b66b1571274bd4e376164bdf59c7aac0ccbb3,6a9ad71a123dd628a7acbe1686eaa4e20e642829dfffefb6e0d37d02543794f23a46605bf0d5c364cccad3e3c3fcd8546115302704c4d5a2e8802870d0258a1200,98edafc0e093c99811765ef159577d60bc205d6b235dec0470fcd098df472d152e61dec804157c0ef357ded52b77b35e00980d13199463601bf3ed35d3cf383001,4bce0cf1ce7c1d02e6955637c9bd7aceb7cd753c4e3dd45c84d7677673d9e72957ead6fd284661cffc56047330e606699bcd8fb668f09c02e2337fe684c7552901,35c15b03b6ff74fd0a90d8edac8f152fb87be660f3b562c275e9a788fd4e4e98019d3e81532ee1e90bd002485d2d6af49d971c0971eecd704b0467a8cac2176901,479619213eba8bb30ed559c21a7c91c8983b0fd330447cd39cb1c96df16ee0a43277979e0cdfdf91c44df807a9aa6cbd18650529cfea8d7dadd8a0c1df0850cd00 +b751679af5b662217b5ec72f567fc9ed6c4f01b16d95,41587f28b244eb40c6b5400e7558cd1018490f73dc5c2f65c9d7696c46468d46,4758a2a1518e0daca6a9809bca605752ed693a07f3361b9b4907a0d1a326db9a3bca7ea5ee94705a12d10cecb965af8b7dc71c478800a4a76714fdf4e19356f900,316e0af35c5ffe42720e72ece6179b42b2d919752b2545f1af5171104bcfd1bb0d0b7b95f13b3580e7965b2f06609620cba6dd01cd23fad2ab2806f74f171dd900,b34193d1a89ff112ed2db074f90941bfef270bba276c97372b902341c3f736de4438fac04fe54a5492c04743a7f9d7d5500a757854cb2bc9540209a5562a34f801,b8dbe9c71f5a9028c4f70aad3e87a1a31d6925e5d004a5f8cb36fd11ff053cce588e4049c419172c78d428fcf7bd8331c2c7a4d4c8e49e94ffcd7fd5e5c130fb01,1e11babe2fa1eb2ff3d8f48981c7595d303aaaf6158d8d7c93abfa87b8389876406d0e8b1740df3d5630b859cd66051085dcafe4c804980e92d3aa2253ea1dd801 +00a5792a69786682fd25ba32e5e17f5b3f1d8a017279,58845a88107d478aaec0f26a4532cd6645f35a2389daaf6420e4ff2f97bc98e6,8435158014da8e48598453f0792fff1e68b933bec04c33c95168c746bf9b7993613c19020327c99e2abc9e83e10cb9c888b262ea0da96aa8d3a501027d152e4801,f4d1569516cc4fc0b0e842934247daae95d9c207de5334bd5c052f0c5f05c5577a5d9a62503af2bdf03d0f73d6718882bec12df84b6707e5364a1fe4d24e77aa00,536988798b62b52fc824204037be13896501be84bd057c5dd299b8ba5c3c9528501ca06f39e732875343a22864c75521b822c84f75435217e9709e95badb438e01,44347b0bd4cd2cadb71abb1ff6b32a90299d8cba3e24f86bc1bc066352d578f50ae246a25c504d71410f72535dd7de19f7f4e983b1fd5f3d526a3de5c82fa26e00,3b28757f6b5cc947d89471d64049f1362fcc770cf7d5e35923b25aa31651920173e0f31f849bd349a2512e4a6102dd1c95f9293af5b06e51c8e70e5da53434bb01 +af1e1e201f5f628e24f8ca6e102ae189b9e8b2dc3378,4ea68116b5bcfb2e6e3dad4650782aff3374708dbb35698f7c87270bfc203246,b1b23b6486698baac6b5b42204f192a302f9a3b93bc758a58d50730846a7a33b23bcde5d3608d48da58e2e82182dccdeadd603772d68fc5e7126bfe1ea04281a01,6656375c50d8dd4691b2a7f2637696fab9f3c834533de903cbfe06d3e299536573c540390a702f335554a07d79dc57cbcf436af07febfb8fd106e1456961c42001,296542f9c21b032094a76102aea00d03f102e0d27daa580a42c88754b9ae1c7608c0698815dfc8e538700e8af8c6eaf1ef482714539b3dbedfe3b298391083e401,4c4c7fa1d9de91c705bfd7297edf8fa3307fd5f8b6cb535d877fe2373c9349d8369295b84d7041b3781368497c7aec30e1f2de63cecaa2edb3af9e97cecc4de100,9776c21875a3eefeb72b8844ddcb5310463f47788a2dbf4319f5238003aaeacb3e4f6b5e44bc617558be78baa1955a6e97f73ac62dd74efeba9763547aa7ee2401 +d9e256f7283867c6bbb13cac929797484a8a04042754,0ee2d13faa63dba483e81c8b51b66e928033db0a167b98e0369e621d47f65b3e,7d9ae1c255c985523ccaceae7119ff815fed343a59699e997ebd1a25d19b6e774f41707d10d807bedb6a3b70fdb4dc0821c2380039e7b2d858557f3b32f625ce00,19ae836924c5e597e54413f20ee0a140196e4ae02ddfc8bbfddb6ee6681b181f078f8a3720ede3f01de45ce5a42fad2c4f2e0bfebff8eab52a212ca54f287bbb01,6257cea6aa6b2d29188f4bbda6daf0d4c46b90ef39ff16dcc594e2191ce4475856eb48074e88c0612cc239b4b25bc872f36dc0a6f426cdaac4bc767d284caa8d00,cac47e87982a3ec58f378c314c9e9d4555123017123a2334aa867d1fbd380c8d52d2e6ccdd51ee1cc5d0674dc365fbf3d087be9da4ae2ed7697c940ec9cde21101,34fbea2f25b7a9b325828fde25c6ed7f22c161f198af60dd9732438f7e9a448e36f150064a227a091b5e04c8544bc576ff8d269055f296040bf6cc287c8ef5fc00 +b74f39931383d0674d3c9a6e0f1729a7ce0240e2ecea,ad789f18668973c604740b4cb3360019b9d4164901964062dd46ae2ea09e0a09,0915d6737b2bfa35e327e39eaab32df7dd3b3c46f5e68bae1912c19df587787334e196535df8229f17f2e7c33c55304dc38e9ca26f66d51d884c3b968dac175501,fe05a399b4689c64ca72c0d6d4345f79c000ea1d6756cce6f356394e0cf0320224214bb5badf126ae0741ef8f758b6434881527d36a87a924593910c0f52361e01,7ac93451090d3691085f203a3bfe8904a4c9e851cf6675d5ac03b89670e96fe603805ffd5a9ba8d546f18ae3befd5cb13612b9ee90da17aaf80e7d1fa32ea7cf00,107b014d5e0a8a9fa01f079ab48de6c5b76a6337652ff67800d42d2d2d9f82293cb4ee18d008ee8fd2e73a34bd93d8172c505fa0dc42d5642f6011364fe88d0a01,eb8b3ba70ddd81dbfa4553f4cb6d04cb3c57553a8c8b7c4297d4adef676302f4556ff181e8487dcb0de368ee40390628ad443559f52f9c5b39afa25106e78f0501 +5501377b02c163df8ea894b8eac866dd7ccb38a76b6c,4925d17c5fce0fca77f85b12e77a042914deb1c8604170d0dda43487c0dcabdf,37c3ef6e5d1d2c9b0260b2407700f7df160af6987180006d1a55e0c9ebd24e3774d6ed2afe43b6fda600c923fc8f56c0bf6112db964fd40bef804d0216eac36d01,594af0114e2e64c5c5604672b9b6ce8f7a9e41ea5168dd252b4051c99229b1a87d65ba5508eb68124f9b2ba0a45c4df1d24672ab5fc6f86af0cfe567f392907500,65e49083a90728dbf5b5a4af66c1af3606f6c0013c8404cc25e9c085ef46c277498febad7db231ab391ba492d141699dcc879c4c3478cdb2c9558013fb06349600,19cad722ba8053d7c0c70b5254cbaac0dc8f11f4373c69dec940c79ff1173c4f0e48c6f4cd3090627c3c0e7be13c1b1af793a9682972865a6b8e7af0b370b63701,e03d5d86cd60176640ca1bed62a0730a54077cce6951c5b533a3e4b69892cbef58fbc56f1a96919bb1227f35175a784caed15759e69e4e493e3d36fb85929c8101 +fda040a3963e2df85d4cf73b47041f478b97d5f9093f,7d6548564dd7af6107309aa6c87b1939167f9f00a8c7723a630f1b0e84618a10,ffb28f366d989be1077bd3d0c8cb8e8c9255e8784742a2505176234f08d10207141c19d7ca97d0ea40765d9ce9931e7173481637e4700d806c99c97d9bd8e0a500,b4aa8c3b2c419eb6ef8030a44e3701648c81e12496b431b361549f5350bb71bb1ee480b620f202c05533fb67da9a0fbfe3a06dc83065f5b3563c7c620a395bde00,c8d754ca494eb1ec357373fcd5d6cf0dc433da3bd0f8760706ae72a5d46043273d8686b7481244a196e8bef82f7ad69cc60361c15d44956c9614ad9cd9f2e70701,ba44dbd6e70c35de49ea406ac547eb02d22d73eaa533e9b5e904c1c78191adac193a01b8f705ff786603d28790f549547bb2cad347ab8638016290ea530b346901,8e9d9f79eb78bc1e85d09e5573c8bcaf19c1753d663b638e9b695c76a759aa4c13da9bb627be6ae1d2ee64ff0eca204268747cd184e0519a4fb27e31b711333b00 +b92093f6c6d1cc0445496358638448461cfb082ad982,c5985710a4aa6390306754d0812c463f59a1d9a4665be0ea98867a749d205089,acbdb81826d42ad7ce2e1fb4daff27bb41e3e419ef55a5bdbb9017a98300225a3d1e18392b1188a3b768437b748e4199ad308f3f62c376feb5c6298af1dbab6301,de07061875e8c5073d0ef7e7306ad907fc63311f3075d2e012acfb8c2244729458fc4e1da9707446a45cdd88aae1c361d5d01d17004ae789ee398e580c0983fb00,2e8290f3b0639f09b940ccf5b097af79de6563499b9cf412592997991b76be501a6e8376cac7f8c32fbee9a8bc3f707e8ebeb7d39330fa01fdac29c0e18f4ada00,1eca8a2994a10f02a23552ca85197f60c1a619bedf1b130563b644e4431d1f1e227413d410fd1ddcdfe23eebe9df4e670a4c0c0d860d057c9160e0801cd54ec601,81c8a1f73006d0886045db6b77887f1c6bb2e354d30eb688423e57903e6446a860318ebf76e47ba389b50aa16ab1902963616b7a7971740795dc7c0ed2111d6700 +4a7bcca423f35c392c267e4cd0e6aa80c242feb92230,95e3fd9603ffcbe6e180937a00276a1cf9652ec79fd9b903ba72dfdbcd4389a7,fb706f1865a493ac7306a1b99cf8687c5b5f7bba88074172511c125b3d3fd9703f5f1e677d32041beab79511bccc62e54ce66826707a3e7257e6146ad073e8f701,fe6c0e6e8c94a84067e626886f3deb8d94b6e29e40c6c295e2c1d68d95ce10d118474a8237800b9cb3ceca250f84ade40221c87100ca45c5b97ac3a3742e1b3500,eb06d7844eb864565082ab799e0a19b52921ca37a2a79ee54e078a7ae36d9eb37a32bc3f9724d89f0ea67a910cbf0cc5a517896c3fe21ffba4864bd2e08b667901,22055339c1728db9f42bf0ab7713c5f11265108e902bf842a626d44dafb734087886032b694781f3f6a2f69bcec7e51d23f6f84dc91dc8a58c04e5f758d2ddf500,c7bd1bd2391cc04f5f2461968a8bcaeb17344d2054d5ca2d7435895d3fd6a74405aba9c3be664b93e6aa115e0c3301db6bd66b4e36121a8000c36acb28225a8800 +8a4a497aea178344515e0aa86842991cc4275eaab5da,8b004ebe9f996711cee5b1997186ebdc561e7c8b4cb9755019b5b37b10dda4e1,3325c6318a6c4daeecb452685fd60991ad59512a2348d4691ad4afbcefbcfe6c77f0897737e678b70f20160bd872e8193659d13b382f6ba6fe68582f0a032e8b00,25679211a7274126d20f97d8ac64e1760f54833f01c4ba4af9e98878193bdb1d141e8e443b27874f2a348703e6640ca133c4cf378857198f6a4685da5aad1a6a01,f00052b2e9c60aa5f0f76424fbbe37b11d2848c9f070ed45a039818ae422516e2443c3c1f2b4b7e8127d746ea81a473b31adf18c67a283eae7b91054a700d35d00,0103349211822cae697fe89fe593a82bf272c296c0e4caa6456fbae8ad2e3a1d48cfe21489e7942c258ca68814adb902cad858a7f4af4a115030a4d8c4a4b10801,d853efcd5205cd9556327c11b3bda4c046e13a6f03a8ffd2e564a47d4f4177c11a5df96224a97e1a11056663512bdb2dc27dd64a37fcd75d9f4d47dfe95659a901 +14def80d8c466171324af9ca99efce766b0d41528f4d8c,11be02bc5f85217da070bee3bd09d54003ceda35c231d76bbda11bfc18da650e,dbfb4858ce0bad53511e536fa496227e5ba544fff4040ae2d360e2a043bfd8451a8c69ad3b038f855b1724368897068aa799024aca221515e87c5bb431d4575e01,9104f3be6cdc340f09674ac92976dcdc7a3ee976a159ca2c3d3d181e6a0456580f6053a79dcaf7097c9b2b3d72c73df1271023d06af24600108211017b18de2901,13c09773589143fe405dc55fa8351131a9ba52297a41657806f3c4b9bea609be35724c2163b0448a333f34cfa127461a51efa85e2a28c25902e06f7ce0c4ff6400,e7f88cb06e2a8e7a1e9c5493769811738928bef5be8925992324651b9b6cfcf113ea735e21702242cafae192377114b8f9aba50311de789eb3a0c8c9f07673c501,4f98da972acec6d514e4aa0df320ccd42bc80961f9109f04b1db4079feb28d2b18d120b61ab8fafaf58a76b0a6a08027275cb47bd4f0f0a4bf4e51f211e0be4200 +63fb52cfd0d54b40e5b4ae85e56ceb9d7979aa498ef6de,ca53fb3be52a352cead97a015c64c581af1c6021006a246ba3826659386c3708,06a406813b6a703a22985279f837abb9f40b5228afb386b269f33765d26de43e72e60fbc1de4fec1f48ea1155f4404c8d5ba2a092d7de8a7682f54c48821132e01,3b6d3ae69708b16905ace27e195b9e3fa8acc6c5cee9b0b5bb2fb1db6a41154c38931ec81df5cfd505408608a449b67db3cb7d6a10460788d3b84283af350e6500,159f9d8d945a0dd0cc095681145873f6303781c5d5a4ed4b37b835d1e7829a6800656a6b13fd311c621460b58ac6157e7de5f0e330c1890c0c9bdadaff6c390e00,61ca6d2c0bedb914616f60d281690a4c34cf93009235bb2270cfb2bf83c258087c5919f8a41e54d1223aaea0f23460a3e9fb8c8108f0a0f53092dc3c907559ac00,6cfe05aeeb2dfa61befd829d533935a9714012cd27fec5672e1b9635db799bd53f8a71e8dd01216f81a904f9656f25971f1506b9efc633733c6885aebac471e100 +4385a7aa5f88d63c914023408143692a2c46cc75f5eaef,a274905e34ef29a58729f749f4b8538ca978af1cae8b84c120c0ad409158c090,0061827c957fbfc6ce2b24ac6310d3b401d5d6ea4002de52af95b69d33600d2a72e5b3a02fae00e2e20f4230896cb6232ca3154570c3d4d28b4ca45062cd955901,e3f64d332e388015344c30f9e4b2783c188bddbb97dbf08c3137b809b34b93050525d86cde213e42fe9a96e389b8708bfdd570cb98d370ef2636db9c4acd6fa801,7d2bb0292233ca899da02ceda63609e4217aa4756bd901fc48c33512e6ccec613ebb8b9dd73f7634bae6ac9c6bd5571361cffe88c80a66a06b231a00c93a963801,10ff9e26b214583d48df7be3413c043b47198f61c9e8bf74d41a8bdfae5003b105fb4fe1ff094ba8236cfc8211195a126f6f62af04b0013abf06587a31def8c000,7de21d21d82b4416a249961148980912ebb957ea62771d86782ed6dbddecb6732ba8d91bc4ffc4dc598170878d6c13619139b24c63416e30612d2107e1be888a01 +47ae4719c39f64eb57c2c7c15991883c2f3bd2edfb619e,94f85df10486a2c441c0a43d9e030037957008eed2af47a9be8a877e72ee1580,96849aea679a5e2cb22a3272022a36013d17e02ebc8c94e5a797352f933899896f2c9bae9440275ac7a118b3879fd84540701b4ba105d3aa2ddc62fe81f542cb01,e2cd14d5b01d654c8025d5fd22c74ab2e1c72ca7c441c22f7d5cbfd479d095905004594df58ff6c2c26a907aa26ae3563c289d2aa56d8115902700d60c4deb0100,493becef0f2623a56a7ecc26901a255cb521e4d5772f55db3baec4e6168c3e13416480c7d11e4329baa2306ccc928a14303f14cb02979c4998c229c806bae3d201,04bcd8786b1cd8add3ad2fae8d7349e2c6cf369964281b5ebf07ef1ecfb0b29473f1dbc7362da39d967067a9ec926f0df62b1fe5712fca4f8ed806152c1e216d01,b05d7e9ba69d3f7c16625d0e50ce93af69b1b2609b9935f12a93951876825db61fce056be9d7c387f16edbf11166a827790c4281f994bfbbf1222795ca17b35e00 +10653a09841368ba7dbeff2278aef461c7927f5299011d,c7131ce9808106d5c5763a8869b5e6cb38ae4f2a6b97e91a61e5b2a9ba37641d,0a523bea380602bd25248ec22cf6498f7a294154c8cc182ee315d57bb6309892064baf427d11cbb2cb43ac9915dd44e8b3d7228d5b1036f2adb86a7583ab66d500,fb4efb8702b4f7c6c104e3c3d1708a5eec965813121a0108a149faaed2baf7be4dac009956a76e0f5626605efbc3dee28bf09a3d20bdf93d92d184b0edd3ee3d00,36e874fb96907f4711706bfbf13fdd56b9f0008d7842e3404cfa5e130b795d883d2ef315fce177782ca037d3c03eb25d4eb9071a31af16049b1d297b4d6c35bc00,53474bfafcf7f1e3970e63652ae0cbac8008bff6b0ab4f54a3c16b12e499619749e115b8930111a5501f223da20546a8b337df5c7d398fd3eae6b73cc7dbbefb00,72ecf752b97aab6fd10a57982954a3b5bf2b44313ae6a52bea3dfb6a9a33deaf6f9cbfec8456bcc8ba88b66e2deb900ea8b6b5fd3ecd218ac9ec0a0391d8a9cd01 +2c6bfdd53c44390e3ab202e648d6bbee7807b8554572ae,c0ee5c51d9d49d9e19ce5659e3f6ead2078691bde092667e86e6bf3c67762921,971b8fbab16a03767e107dd425a895b2901155b25b66335793e7bfaa406b930c3a7a063a6f53784d55299714edcda9c536fa13f16b02e98b40129f356689715900,2cb814c9bd6b0ff8879050913c42b0e103d2fcc4ce171773bca30890aa119a6d03b7c662a7c5d384b626eb52f7ab04cde94cf258d30f3b3d219bb61bf4ff241f01,81bf9c6915ceee048c554eb8e456b0ea26d0b2f34ec034eefcd50ac277c50c655a690653109140a7de27d1e26dc30436f23d81c04ef3e4506f321600ad9607e701,e445246efd2e34ad173359251043ab80d49c38744eff48d7d24040d65ed3a0c410ac23e2da476fd8e23e71a4e225f5ecdee3d1ce9465398faa0e96ea503c310101,25161209c647f66bb5f677f27deedadc2cb8e5896f11435c2959e04fb0a21d7d48aa4a4865caa48d30f7241732cf8dad79edfcf31f43c213113eaa7a033314e201 +6602f0e87be6e9e0acae3121cf0c758580685d27b91061,9d32d59c36a86a9d15da7749991ab063e1aff0878c48e61404fc47dda6f4f7ca,990b11286ce4b179b9535518f58b5be7f387060b1cb76f27bcc3027d79b1d72870d3ffca32e3b43c23abb7c02c8f2703c3a3bb2d89fedd15924bf18e8506a33a00,605957dd730a5ae7b22a762eb9ed26a098dabfb65d4cf981d72d9426948e11032b843f96117067fef98401e7656acca7886648d2e08289b336db72c3baf5313000,a923d14d7f39776554ee6018d9163ff6a83d7833d8ebedf27c5bed83d6cc345e662ef561825745c119d9db8f8c74df98bb95134a09e24c2b5c8744a08ac9fd7301,090e0aee1ade2b545b1c3f857b683ca6c18273ecdf37ba4c56a1f9384758bacb1561a17066e59c7e64b9ba80fcc0b99dab2d1b9de574f7b58109835246d2f2e100,4232b382bde343c06161ba48aef74d8ab74c164481edb58ca37e2e6450b0cbe601c6e0ee903362c239016cb8e0b960b21b809c0cef0cea02dbf9b599aa1eed3301 +9ba349b78c878f4c405bff7bfef474d3a6b1232e3c7f1e,70fa695931096392d9e9b4d9883734781360588aa7986dd63e648b34d89079c9,895c58f85808a55e09d06da98aae3f6ff55a09fc5317c1aea45ff8d2be1ad5a033ec9b44ad2fa04184a7b7fe9b50e8245fb3b0481daf73c020f042a0a927503601,8a5cadf16f62e8d1e28820d67ea12a12a3cc535d3d77a7cd65b81d2f6be7469d737a883a03357f6edc3d4c99a20e648e5da1eb6f1f82ed0f61692e4d99fde9bc00,7443dba436ef8c01ffe32ed2e232a57fda634356e6c2b9ad904f44052358ee6a1df66b7613533fd86180633b5dc1bd235ee07290ac7e0055f4eab218b8cf6ee500,81cf685453007cfd60f9d61562cd25ecf2f2fc1b0028ce837aff661d89404dcd5c9ee7f3d05ad76af1096761e86c8d366c405c05fda8ef02c0428d038a75b9f701,ddc8a5db16e9532a10bca76e6e536dc0d945850b49b3c2a703f0e980f5e50c2208faebe4b16a816d15409fefd31765752f3a4f4572e0c985deac145a41113bac00 +f0474d1ab299a1353da4349d610ce4272489b89ab94af1,f1d1792a0da5deaaf6fd7e4391a0eb690f4cc42c8f5300aab30d80fb404ab498,2a0f2d3bbaa71dfb3f84cd706bd78e6f453551734db601eb62a881c53b94e76d06f38629237149927e63a155437208104bad8ee9a23011c4b8ca64858bf7db6401,cd551ea174fc2b12e5b9e1e75c05ca880ee4918fa1bd888c51c403659e2e58a070fbdf04ff760e3461914b56bec9cc170808eb9f28e7ccee31c8022acaf4b65f00,9b8bf3090510a5ec8f33b5fed56707f91b04452a40cfaa8a32842ea1d6fef8403fbbc2e458e36846c5185b3f508e2a86f898e5ffc35e99b3b54ecfa519baf84800,84c9b28718e6fc66a4f111ee12baae8945e0be31772c127ea1bf2f50df8df02066ccfc449b45ddb776bed95a849c8bbee8796c0ab9265fe8d2c9a6e1850b825800,44bf5a9ab238d967ff66d3ce6fcb8deb5c911fd8127d982941e4af71a34427b45b48a05e54b7c4e69f6c145b80279308441b214449a5cae8407110b069aad14f01 +880c41ac11bb8e14ac6237fefd07f4eb6ae9832974862d,87b94565d85bd795023f9805ca350ffe37f3924c3bd540359717cd667a24ba11,b76d3d89b00069c40fb826321a8db8e9d3f819ed0dcc7245bfa410ecbd18b66100369db3a3e1f9f95aae1e2d1e506bc11c38ee4b29fe8d0fc79697dafa8d08c501,53c0448d35912d83239700fbcf50044ba23e5fe3dbe25e06c313b12c747a737043364af178a30e02f6d9b6dbb1d4838492a37176971d26c6e55d473cfd86963200,2a034c3e1cb0371fb0ac9b61f36a02cf61e656360d3a7fca5381ee1842a386653614567d0a010e7d317da9d536400e19fe77e43e17e6a11a16016251a18a450900,14079376b152f4cb0ed6664b8fc8962febe92ec3d46a3d5aaad5306fc01eb87c59729b805fb89199862e4f67597b0ef1b582c22653e2199ae1ad735097013ea800,b93dab034e0c3260e53fbc6f4698425059f222da83b513aad69ef64c4020f97a51cc20f940d01a891fff3242a5912bdb0872bf10c19626b7bbb158599f3cad8000 +fdbfc24f851fdc3b743629bd091edbc6b6262c1c7a84e8e3,e07529fa86ba1f9b65f358b2cf2e70ab7454499206c6a74e695de92f1b334a50,03dd90cc448f24999c2d625ee2781c886096b23eb45bef4251adef4ec74df7be21af102d41c9ebe37c0705d6026eaf94a68b1c73c0869d519ac02cbb145dd63c01,b63c7d26dc375b2855bf15bdfba8853e8933ac40597597fbef0a802570869a6f0183f44846b87689962d8a419d44d5eb57a0dee8c54a6e431354c2952583230701,175f95a1b9e039720c5b31881788935d3df9e1a13704cc43789171d513ad9fa1457f310389df0acc6b885a5cf74ca5a3f39633bfb8c023bef339509b20734d5400,34af5ab9a4728c36c8f86bcf5e094f95d8f45f7b7fa12c44e5afdfddca62621d00bd8cb648f6788a3c6083054aa3c1a181fec1be5d37de649c6dc37aff5ce6c401,11b281c2649da846a70491ee6f26e8fc7b11cc1efdfe580e28a401eb9b17f6296a8d92a0b462686d1a0b10efb0b2fe6c5483981eb99ee9fbb671ae477626ee9400 +1dc0887719e537e9f6a2aac3cfb9ce52bd097c4fe8941d14,abdfaa953db888dc876ed65ecc28a59cbc95e6331f74afdc8f5f2c17746194e7,1a2d143a2055b88418fd2bc71002bf529b74d03850b596bbc1ab619cdd039b5e5dc8eb9626637afd984c32b0e2e67b8ea1d5e7093d048ab5c25576cdd00c225401,5b8533343869c822b0ad965216634da7134f1293e80da4fcea0006c3d50e55b01af1f9ddb842ec575062f48183e82208a2d32c533198f41b2bfc27524d32b47b00,cf91240822fa9ae3977743cdf41bd2e097c330213282493f6a7ba1556f329bd8140af5446badb9f20ae4f647e59a329135d356c6924de37be2ccae8faaad2c4900,ceee603b9dd24c308c854c7f02b220ffe9c0e196da0b9af2be6842ed04be07c630acec684e2046d8d8ecf8c603589ec7ce2f54f8a99d0eec33150b857ebaba2800,51bd0f43caff8efcfe16e140acfd75a7202bf69d88f3daeb40b4439dde5090811405043437e6271198e8dd621b258a5c74d199d999dd7d0a4cdd585038e8e16b00 +0212e2552cf922bbe63a99d30fa0614878d4ff73a5a0cc03,0e115608818a1a7d7d97bd87c97379e748cf6100829a53c8b9ddabbb72331505,c1cb08eab7afec3ed719a263a17fb916f79f27d08b8be77de8dcc79ccf0ca9b676f2c62c6880961eb62fe562d71e006945c94460b4fc50e3a189c631e0117bbe01,8eded170976825437ba96c5c564f4ba7756900ced1f68dafdf3524ceb416dcc16e83ae9d4255523cb889f0a3956c9072b1afac722ec0eb70d8ce25f8d1e23bd401,2b65320fddc376b71f3291326fb362c71286d793507e6ad01f30eeaafb1c7c4c71aa1256c3e4254ef6c7a4ba3484011a00d4f6897daae76471910e7c543e9b1f01,500b6d2b398c3422796b591416e58f76b6521c42f9e907d39e9db06cafaec3bc3c146c97e51234626a5633a66bc0523c3e7ff4d8c3f08f63fb1babfc7ec7ca0d00,cb7f9f53f4390e57661e4d21bb88a44801a6bb34a97c96d228166003bdee56150d8cd77701ebf33554b9a7d345eacb3b46f6277bf8f93370782037fcd4a6887f01 +87c55453ca53a427e649806d5f6075a80a76d97b1fb398a5,c425ccfce54d661ac8a160473e7351af08a7f0e5bedb4768f00411c4df11a097,212505ea20d438f191d7ad460369e28af1799eba9bb1f358ae12c2536114712a647cdb47b5921576d75a61108f6ed1e9dffb619580651975f3d829371ba8474601,2b8b92095662189819d79bb43a4dcda102f459458445800666a2692812ff398d7a63f11fabde8265975ca47d3ebf05f60c2cd448aa0d3712980fb64a727e83e601,bbe587ae4230fbdf85ab8011ffc2c99350fe720ccc935eeb40c974d336a43b8f12ae7870580dc1bbcf6b7370e143b25dcde38b5566ddd9a5c2744478883ecf1400,6b805be29640cf9f1e87e3a7fff722fa39e77c4a6671cec58b31ecbf9d4d1f3b2b7571480818047d52e2ae3006be0ae4b164961ad079735785ce0fa6e12df22300,85e1e19a4b26b415c95126804ad59725b7b6e50ae1e0249725a0e760fc9275e84255a237a029247241a566fa17b64217ad1f1190f2af89266b7fd6e127c61c5900 +cb129c406626eb76c5a21e7a36237ca45ab109f2b63eb06d,597304cb04a9dc56b256f9629b553f623e12762ef0ad298df755825378c5df47,8c574eac6d6cc02da2952bb1a4c3ae45ed00b31f13b132a3d5ac590119c25ac21407940b033fb9ae54f3c17ed9fa9d05e44bffeba8876884d9aa83e9b73244d901,415443d6a831299b09bae430ec3241cced806b5e1e7536bb48a59a2f2c58e48c51a43f1761024ba86380e3579ecbd3a6acccfa1954de07e8ba422aa2ce56e78900,f59674024b96a67ba051d0c777ee5ca28b40b18f3c9f776cbb6dabb634a60c751e5a6dc9f5bd4b6cfbce66f96808ed9b25525b31ebbb98c277e75c93c63696f700,e0d272acb60329ef5196822914cbc9e5530e9f756a618c261eb4810fc11401545c548e9129559079545fc4e77ff864151d6c1f77374eff02b169807afda26eb301,543b72b6e35d55e3205e62711a75e843027c1935de417bec94d2bbfab95a5293303ce61917accce6e49817eaee2d94ee55e0177e462e493eaa0844918af6154e00 +2825ea8e56453f9621feedcd0f206a430c068658fa308962,c9ad71acfee39df155c82c2c1adbb5d50431a96b7774591493e9c8183c211899,cfe6c38926cdf26fd7c4720507e7e1123c4268384e5e25613a2e86590881bb295da2cfe8ccac0486ff023ac0efeddf8cb620926e999f642f8700fcc0180613d100,71f295c68ef8ce783f9b337e72a9b820bbe3c3dfa054dbb71ea21e5140a643d25da2d602aab8acbb119340cfb1a61f951206c624e60c32e2f69e6f807008f69d00,5e2cc86e7b7f35f9543737fd4c41f57bc14ff31c343181316b437b35da1bb0a67696e71f73f598a7104b5b19357d3021907076b25b9d9e99b4dd1c00c2ffb9bc00,05e96b555899260a4f026dc02cd9db14495904b8e4602f6361c1054b291aeb1142452ebd5bfd2edafbe3341f858a076cb1e877c993c43c405b11b850e8f53c2f00,9446c5c50e101a2c92ad0d1501d437c509840578f09f3b77f12efb0bf276e9a84caf7578831ede64b6f672a4c24fa1bf80a85b7c89e3b96fab9436e6a11fffa901 +6b710c360581a7f6d5a55066a8b3cb13a377c14ba4fe4519,f75225fcac5d9832062f35933029334f259603a79dda37c3f3c2d5bfbc4ec7ff,8f021c075dcda2744b1a1f03f104e623d5696bb843432e6b281915a9676867ca3ee0caad6b7caa905d37087f667b7e2faa63696753a827d603d70a9c5072859a01,0fb4ed1c9672e0abeaf169748844f02072cbd517ebbb32b3be376599f7cbbcf72616f0d8c035c731dc42fc0607c22e49a4e045332bc9ca2e10f9c815dd2a000d01,cd0fec81b100f12e079ee8fa35684fbd3be47ccfca875e8752f6afd6f82047317d710fae8bd2058ea96f22354a833a69d46ec43bc873dc36d558d085ec45e4f201,440c550e880927fb648b54b641dc8cf5aabfbb1058d5fb1cb6303020ac0045416af9626f22e7ebd525ecee275f6a58b09b1aeaf540829406b9d6aa3bcf0248fa01,6c168af458cab8a246b25b8bf3d7064b2babdb4427edebb1c5269139154bc3c94a3ff70b5be84996c012ac3a9002ad49a8c80ebec3860ba84270774d64eed36201 +74308d13e62ff511c0f97e3962c6046bffec91f2790317da,8ae1e2228cf7a81e895bf5dcce0386b41af93c4444aced52b63d66e14abd5956,e2312f54934029beb85ee9de655e627c8897461304de4f765b620b3c8de354e10b125de7706f6ff2425dc54922e652f8ad3a823c09166562d7851aec2b0ebb5501,47166baa37489ed3b0508d851550412949ea646833ed45d3260215542ec4c790257db7f7efd9750e46452c0d5dfc1eaebc6fe61805127ca2fe2a3e372f6c293801,2de6f2f3cdc1edeedb322a624161eb09cb48c16de4bfbeadfc1458c1893a0dea0b03ed5342c4eedbc75a5d7da2331e03d10da509cced10ab49f8ee8a9c214c8601,d1db83dae82a078c7f95ad1ee6ed6a8ca6030c6e84d110f3d18feecb04f8291a52df5b2f53d7e7b9df4a1f4735f0660bfaa28ea692e47986e2f9f9974845bcc401,2e6e243381e0154f83449a321bddee59682bc3524c984aa1fb189e80d82588b272878d4141fd80067a8979158dbec6167105d4e02d564a4b4eaab07325309c7c00 +0dc420c3a0d8ec7c0f86554932f879f02423dc87e4a6b5d1,2f6c662046b70db22156287eb82db52af1d1f7ee4e52bb36244640d4258338c4,88493fc8ed05163a422d1587a946b1ace5724eea5e6147a70293847d628513a7262ca9ffc89110b145e8417baf13b22b0728d66745bf13df96b356efa77f494001,e4ced4f005599bb2f6ad3f64c398ac5c25442d015361baf43cd1d3c9c848dce4541338515f54cca16153f8479fed7d447d2a4e6732ca59d3a5e2f8892ca4694300,a8487aebfeb0d0ffc5e19a04b37cf8c5c3c37356975e898dc1c2f432fe516989401de396a0e365d7b1dd0d6a33f9fb2fc972d4171a2d5552b4d7714627af12e701,e0a87ecb611c4f6bf0844505eff1e5b9b319ddcd477d9ba21ee6e9d6b4eb20f708261053e4d71f74212d7846725650103775d79e9b9a8d5ba2ce50163073a70401,8b22f82fe4123ced7d68183088a35ac876920b49a5c66f35b484f8726b54a4874c38b46fcb47c9503c0f62bdac5b485f15f65ca7c47af9ca26c7a0a4a4414a7300 +1346c8eb10b0ac8d023e7cc8dce3a5859414b43b773d225c,34c149641077a7ab67b32fab977eabe0e33feff5d2ac6693f576a5425b322e18,ccb916abe87a1875ed07a8a58a3a862360ca65155b399b11963e8df04e91ccf87389c58c06408cb27fe31d94c4bb3d4f2b3c23971a91264cdb7ffc8ba36226db01,a6064fede3be78ed80560d7a852d4ed0cf9f2fbc346aecfb01a3b32d2618326056ecd1d626e4205e3345f1b01c98ea44e39d0fcb0b9cbe02d0e36d4092c4878301,bb8d58f73e57d24735201c7d6721a294eb850d1b1a0b8206a5c87835ed258a533e5ce316dad875148f6823da0ca03df002eb5142cc2bc4bce54ca50b4942b10001,1983dd3a15d269a49d2f0586a6c955148a0b014a6d1c4f4d9bbaf9ee65dc9b120eb18d744558d89925d13e24f4f84dd32ad1f5467cde8df15df01970a90e8ac101,41537afe4e2f61549a58d8d48d6dcb29dbd65f6ed65de583e5b2a91ead617669054fd4d6c46c7dc18eccf7607750a22695dc7e3a88ca6db23288fae811d38f4f00 +ea4a4549c888ac429e08d1d8f57b20a842fd399f5c6f3344be,c52f17635abe3a34ed38788b39d90dcb1da2a022575e1173f61326787e80c005,a1a008eea0f6e100f994e652981aeca0faa1927a8fc4fcdedb7aa00f0cdf45f15898c50887c1fe150ae43fd4ec75877e878f7674343d70f234c42e9790f29dec00,d262580be0361471de591797a6cba66be8936bb742aa4dfce24195dc56bb42761e8d54b3bd5c25ad57555ff3ea1ce7bc0744ee2b9d37ad9c384394bf9c45ff8200,160745d30d56f14c88e1b264046ee53d7e1e7ea78c01f661b478cca20416f32b0607d871dbd0933a1f0b084e1336c57c49e178df77136228ead5cabdcbaf2a0c00,7af1c7f6d37b7e6c25019a73fdfd3c1cb91fe07becd0436759b09000df9c4c9e00c189f68f49f576e2e0817b890ff682729258858028b2ccb982dda452bca69601,eedacb9c87ba9bc2c7df262e761d803e8b4b14d793497d11fff8a8b8d4d7f934650ea4e9cab4cf5ef5eb55906f01ba2a494b6a7bef4b7f5ef0cb81d8c65c042200 +27d6e539fcb5d664421470a7303456cb6b34591b9e93eb5487,54da0ecd739d7983d92c10f1f0c59fc14af6a48a76c3ba826d680dae852e8c46,9a178944b483adabd83cdcd0ef9a4aa66c726970524e7ccc896ae9d21af893c908fb8ae188617a556aa1b20646fcdd8af22329e4f47f783d585d90faf36f05dc00,822f7df42315c949a50a32e34451179f4c4b9d19885e18bf9df3b9c34584d85001c0e28a3079fa853534c50d85534bc471a80381649d634be0f4edf312effedc00,83b0220a98be4adf9f68464be0c263c2b7a436c8314a4f2fa269f997efbb390121c9a720360dea9a6e52dc9d334badaa51ea04b71b4929fa508e847586337f3d01,2569cb8a2c0bea4e5e7018e3b675d624f73f7019760e7025785b61ae662c9d3b6a17223ed3fe0767ca7cf8d9f242c37b9c6eb799627865d00888eb622db8088300,0d84d0d872d07f53dfbe63b29310dce6ebe9479253fcb8fa867b9d95de0bfd1215aaf392d168b0ebf1e2d2071bd972bedc962121d6a0e1c370b18aded2da503001 +3debf86be2f3fe04bc3cfaede12251a1fe8c2dd3ad4d4056d3,75d53e6cc6d4c5d501ccad7a33683cafeaf9084e0bbbe1e876d6d39d6f3c33fd,567872c421e9173089ff5150dfb630a30672cd93c128fb4f01adb510ef3e883a428d4883fbb969626e000cc19f4b7945cbdfda73e47c753ee851a396362c0f7400,40b507fc2587cae813e7b14b177b814c436d3755cb0062af5d9ada1978d90a3d4026c0818dd9e21807c44ce9f5a149ffa7fcf73cb9dc9f928ae282a854442cab01,282e07bbde706b9cc99339e6b94c9159501d7343bc89921f07814eb2ada89cd43334c5bfcef4c75e460b03a29c99a419644365b21275f81beadfe885ef8a0c5601,f4c274911811f01a307782337c5c298739bf5aa857e28f1f7c00a6e275ece8876e0287addfb08cff508d8bb020b26eb1de31b42126ee9778e03caaea90fd9a0b01,d20dae11269b69d046db025635ee5d8cb82701f140debcd3a6bd544e7a786f361c6b02154c6d38b5254e402f33ce13838b3c6cc46e8168cdc21736a312e10acd01 +73054f8e080fc8468d2c0fc2fb49b26b7038a46b323629e0a6,7fc56e2c5b8766b26dc4f9e38a68498cc08227fd202ce43b920d9f80c8b72fea,f64f7456d6613e5dfac7fee96d15a2fcedb675a5044845db83c53c6c79c1ade84196216273b847e33c8b6639d901136638c0d23e5d5867e3380ee57ac683dd1101,9487608392e227a5e010a3b6377acc202698ed0d60e5cb82212e4a8ea8d16f6a1838a42023fddb138f5bb0edda502c3f5e0329add7abd803bc2aa3f4e6b24d4700,5cd46b4524f621be21733660260ab5234b4c913561f683d9b5c2b8ca02b88bb203e485b4cfb12b84f69e354b2ca9e29513055fefdf0429c75d2223e8f257039601,44f53b92c490332837b331e2666e7d604b31ee51c9cea72facb6e0bbad2e8f1f48905f64e29ae1495ae39de34bcf4f627a973f357d435f2358c2c29f9c3c4a8b01,87ed108bb9b1b9ad0cb0eee8527b7f888a1b122f1e947695dff4ed7b7db2e5c51c21039eb26e62e5861f5ae5872f5e84f5c10830cd351f3c5cb09a941bb630dd00 +e989bc9a2881699c7c19f050d2dae8ef5a26e5806d87d274fc,cb81ec8cbe723c516a9dee754ff6b89bf8ce89f92204c2c195d3e61813f1003d,37be0dfb8dee5f0f951f19f1c8e11d01af7a6f0328d5d8de21a5f2148da310f51e3576d442bb91891744c32ca8b82ba32a3874cce2978c6fb4315d6721c48b1c01,010138424ba648f307dc39da20bc723c33fed306de589d65ee157df08de526be2ea380764f9f2a091bde7341d0a0b7f58e070752f0488de73189cae5218228f001,70f932db51d5ecdcf9f89944d572aa3c9b8147e7b0f805734450d83de7653d29359d4faaace793a34b85f5ad956bee4b599cbf678bd63659b1f136b339b3eda000,7a00df9077b1e0b3d8210dd430974f6fa63605eb260d541e85c6fcba3a28f8957757414c0b8447b79934b21615b9dcbcb7feea371eaf0fb933da94c8df72270d00,a06a5dd5565236f2fa651673783b5b22cbc171b7f8206d0ea10831d20250230e114f87faf5f1792c1ca630a70cf468acaa7ac2be53abf1152c963746e974b42d01 +0297787da180ae99f3dbb0545e59205bfc90a5e0b89523e4eb,deba14c2d628961ad0b89c0c254c145305d1c7ee2f8e10daa74ad6eca384d1cd,66b0236c8eb0ff3de2d889efcdff12b7fa77657333b64b335968f9bdce702e4d0dbc4271f036cfd0a87655af78b3385a37572467253b1f16b7d5b8fd87f97b4201,be555c5e7b8724f7a1f78d155868a25f393f5dfd163491d00361f5d827c00b441c944306dae92d393bb9cd5692dc5f97ad88f429e5fe9425d9f830bf05c8ef2e01,b0fa14ddbc6df6f59277650adf539c0e4898983230d47fec4dec6f9ce030040033276a91c02cb10934c403a76ac478ac049f363a03c4d4cde69b3d5f19a3835000,d0ff5f03f516065454eba75927e7cf63965e8d92f9152112dd5922d1c015d9736d136095cce49ad49653a6229bc0994e897aed910f37b1f69145bdd5493a2de401,fc6f88692358c29f2b35a1bfe6947ed2cec91057b4c8518a1e8a49715802b2690957af9b75e328ede3bc77e5d665ffb022648ef016ec8e156cac9a0c7fa9c72f01 +953408b4abf1b64c27a4647a8d1ecc0588444af7b80dbe1adb,e98c258a623182a80bb1c7ae07543c48a0e00e821fe7378b13bf83d325d64236,d1d739763cc10cfac19933b7351fdad50c98cdde546af84436671d69fde3260d742206fc705e882526b206004422f4c99abb981afa485d431ea9bc9827f801ee00,79842d2a4019c8fe72101ff8d9bce11d4b8bee2803c91c8c21b45cb4870edfea3bbcdd5f8b8db388334a9f9b3d0e472931c809b33e77ce627b69b4c99ac7c01401,073b2d90e12424a1df4e3bdfa7922d3b0cc6dd7a4e4d1e2db680886b0c40191d5258bbb7e1e1b163aca380daff91a05fdcb49325732ab0c965f05978aabc256d00,b2ec3e664af31be448af769c3cdea38e6f9129dafe82add60b7a4e625f69ae5852b6c524427bbb441dbaf9e482f1358dbb6128db2339730e2944175fe007c33500,10eaaa0afa162e41bc525e8a795b1d691bd1d8c2872ab72990f2e034c447c6d85965aabbe77d9e69a111a60cf181c76ee01bc9af0e97d757468cd8b1ae050d5701 +255b2aa7a66cefc4eb79f9cd8aacce2b59e4a24ee6d199ef08,de269633006b37c6c674ac1d3786169bd5f22439cc955329ed8c7fd0b276facb,dc06cb222be3d1f3f0d5761b6b24c4ba8d9a34da26169d08b1b57bd65dd886477133b7a8a32119f0b0309e13818ff3b1796e27bec1b75d0140a066b8a52c5ec900,15525a89a41ec376ec94ddf4aab7c51019ce24fb8f845d234162c95a13db868f74f9fb78c79a9d289c58a3ab91b63df1a541a0bb5df9d9e38941930d00c4fb5700,141881b01c866bd6a7680f3b21f27dc6f842fdd77cdc48cba19d3ad9b34b8cf561a84cca48ac6d7e2cf16db7d45123e7985d233d69326d54b81ad284fd91936800,cfa0a7c5e723747415e1ebdf97f6ae9b1c1919e9b1db300e2d374f22a64173e318ab2d20e636b9cf2c6378425e5d28266d025c3bf64d32e0601905fc14f2da5601,22b494f5c3655d6fc9ec6262fb114121eb0e2703defd2090fdfc3c18bc6cc1c22732223e6063e3c9406c42fd4c8e8370048f9021feb9e8de25101d77503f710700 +422243161003f1698b39bc2a9fc88bd9bb920cb349936dfbc8,7829896665a78195d4d211efb1161a55beea2d83c0dba038407451ee86dd749b,8be355f385e9c008c21a8bee5e0446ddbfcc08a9855a5bf4b63091f34f4612ce26db2dd1497cc3b9cefa178716eaf62ae80646d620d8e1b380f94791355afd9c00,c5377ed8e9e7eaa984715048fdd2fb6650926ba33f8372ef0c076a92eee1797266b64e591e2d46bfcb8ca07ae0baa35f1a3d2174021d3b443c253df9bf15015700,322f8c0394ec6f9add5517d4c5c41428843b6ada6f1bd94443ca127a4fc992530396d938a7ccfd1144b8e7b91c530d5f7d3fe4549e61bec672784428431dcc5800,62ab40986d8c65ee73b37112f4b90e40fd0902cc06ffc04858c15fbcceb408251d2db8fab7f12a4f06a0b688c1caeabfa2ad6ca6426dfd27e727b3af2623bab000,aa58c9c1e9f28cbda071fb39dc6fd98b10bce95bf0ede3c89d20437597ca655f15064f1fec2789d1f3bdca26f5ff5ccff7b25c6bf93557e786bd9c132018f7bb01 +e5568dee2767f10a03776b066b123545c4b0b22d1acc6f0908,b229a3f132f0f1c5f7615077ac71daeeb53ba62aa00d79778edef4c3d3cb1565,8421c3f99270264c3fbc7ddad2928df8f5a4c37a8085b88559aa6babfc797bbf6a7f5f2cc4ba56dfaa1757e320d9321a52f3f2548e540f05316b698beb7c6bef01,ce78741cd4c061a4f3933996bef832c2c6de8bfb6d1a6f1b771ca83e182581ce02622a9c082a19b23b13739c4301832d1bb7f25dfb16604dcab0a243a97b7c9b01,f99fa3f6697f598a37856df068a01c3b3fe75d1398b9815135e25f9326c8abae16851e16fec6d92c940d858034296cae9c3d1dfab9f26a2eecc94533b07a5e3301,cf9157751eb6d27fe3be7e686a8d263baf18c826e254a3eba894f5d1ad10a7677a225f726191a2be1e442c5f4b4db9a9eae237a4ddeae00dd8a05c0f6f51600100,566bd393d0fb39b3fbb8d944df76c3249cd29167c4d8e25a390dde3f44aa926271babc9c32449d3455c7a226762462340d8b2565e408621770656b677033c26401 +b864b714134f1d09897132ee7edfdd4bc0268b084cef38348c80,97b062880e97e2e4a5c0a96cf4aed12414b079e22caf2bec5589f679c9b834b5,23aac0a6882bbf3c256065d012142431908e9f781e26a880c81b9835bf38a8283b6230c8de17da9c8d8528954c2bcfb043f43afe494161f871ef6bc88d67f71601,f1d72e4096163102879bdd4fc5179a23942c84bc1c86795d0820036373cb48927cfd37378a8747bbbd74a82ac3c6758ba9ebe562074af2aa7ad6620daec68be101,1d8341abd394aa14a4116058e29388abc1b73316c7b7c47a81de37bde0c134d3000e9c71e09c8b40aec62ef688d66a28d82795e22422ac0aadede68de3ade9b101,8e74d300b0847f54805b4d58be64b07a635bc6aee9005fe9c35aa5aaa701a881559b6b67cce25b2530ec3b7adc6feb8d68d7fd9270004c83c2d4318e0e65baa701,4c0c1511b20d4f32116db5d558a8d611c833681fff31d10232cf16a9208d57ac2e36fd917fffb9b9ab339dfa8daefca945a85217cfc211575b2b4ffae7239ef100 +c67ff08070ea2bd39be8b01976a6fbdad176205a252adc791652,99325181d7b9b2ca2ba9817000e5c59241a35eef52412088123517a912787ff9,1a898ce9917b12026c01e47ef69ea2dd098a36dc3f27d37125dbb7ee1eec910965a1dc1c60d6ceb56456b5eeadd5dc37c82a02d0a83635b5cf6794a20488957300,225bc29eb9cb8ad5daa381c2d230792e912bd0b22d89dadc7a21c62110b7398427adf0136e433244b4d194fa993cd85effa5533a2d2dde7d62c23a5420587e9d01,c289059b3d5073e51e9eb2325981830d2ccac9c6d52aba60b48be0a1299ecfbf59c23a151c5176a14f3b2b09b68cfa8a0894779949f27d7b7e9a87b2bf04214401,c16b1c284a96b41cbd06d94ac4de823d9c672f4100a6333945ebceb6f91fe9577ed5ddaabb9cca7d1a8b85bf6ecf437225dae91c45b2568699dd97503e3cc88900,90bdfccedf9a8d5cb63e51029a9a69bd46cad30638123c13b6b418f9bcda848a31fd08f243eb881b5c60d609fa95697ae0ab14f72faec6d9999b61185a515f4d01 +c23f60687d5baaf1d9eb8f21c2df78da5743e5cf33fac95f902d,e2a38581d32c7f143059d1daf46bfe49117b44cc650a31326e83665a4aef7ac0,6bc162189233f9a957774372abdf49039317e02fcdf7d38d2f33a178030bb8093897f6be3672af116b032de737c28cec3d8ad0e2e7e2733604002611666622ae00,44981aed55dbbba5ad08f0256a3fe807fb73619d2ba9f44b3ecf4fbc43b412c60c47a41569dc7e0c33dcdc085d947c6942b4482651c1d9366c0b5c72a7c937ef01,7a4afc637b39b56b907a4c561b25a9f724cd0305483ba746073ff2ad92125aa414ec4dd9db96de055498c835d0a321e8d405c9283e6792cefa31425b35f23a4c00,450e9615ed84493b4a9334b8da2de454fdd0d30b075f98665210eab8d26309de2d426aa52a5094c0d540cc5025058e21d1df662d6d0798b615c0ffa56c60eed400,c22f6fbc555ddd8cba751cda1e8ced32092c9a7a566878d1aa243cd16840c68b35122bbbd171cd08e4f23d826a0ff015144bb6ecfb6b4f8dabe81bae79525d3d00 +8fd003fc6c8001cea7dfab40b8ace9a79411e9ad8d1ca8a441b3,d168f38418173538ccb10ac20467d9d1e22888dbcae4fc724010491ff25040ad,a6fa6819ad88021ed788c94d9c69347cf5843c89fe20b9b91ac408f35d0f38ca4ca335243839f0163ea6c57349b1974293b1e5179d829231d6af3278b789335201,ef2356641cf62323196c7a9398ffaf6632140715610902b9e05de29a9f9429b52ed1503980531d0be9b9646810e5353f706e422984d75c0402ff6131b445a08900,d38dfb04c66c67296880e542059f987b0e365ab00f0e0c90559f66a2d84ccfb576c3cdffbb0e36f536203fbcbde407e3c0e3547480faecc2a24c87736e74859200,3dbac7b06d36b8db1faca83a10adabf58d3a486a492325bb268c1b10795c2bef22b1708332a787e4db52951907284e22f3f517cd82d35aaa81ac78dbd53c67fc00,8eeeb9fe1b56946e6117c97f320b1fd0a977ec19951e6609410eea3785e59ebf0040bface7629c2982271da03813a62f8e4d75f8c1191222eb2550500754067101 +311be68234150dc35060d5c8d71652067493827f3f5acbe8dce8,3bdd532c1ccb6a0dd84da17724938622355be802e01e04f2ca9dd83a61692ad2,03f4270eed3b0cb72fb1a66b630b6b31fa76c1ebe2e72fe65079da8e5121a48d478f38cb05f357a9d0aaf03ed702ef928c1f0aac893d52adaa8580903f6063c800,29ebc8523709f104a2b9d010d0d10e43a02c777bdb8d311549fe6a44409a948272151e2df2776bd47bc0683229d9f0c65f00f9ebedfd9ca109df2111ae6d759001,4238ec30633099f7453551622a8d4b2800c12e661c1bd652d7532cb2ff8065a02b70d9535beef6fa63b8f6b618aac68c080f60e909b5b3a17e156ce2da77f70b01,09c410b9bcec1045130ce28f9729557654505bd75a44ce91bfa9dfe1538524616adfb11e55567ca4050c272881069ffcee34d94da7824d38088221e2fa7116d901,7276cae778ed385c4717706da410b8e8989bc2b85a1b281f0f11a9f93be4bf492f5808e1785c8d174867850d52819f30e2c33c3665cdba58bd9b82940eb8d05100 +88d44052cecbb4677f3d6f5c8d367e962f4ba611b147b94a3d02,07fbe36f5b1451b8f7a8cac05f6701ff58f61639624ced3837d1d7043e339e01,65b2a965ca933e4f2af0c4c1c5ba102a02321e4df8783139b6ce44bb61beeb1a0eaa1f5c800cfa96aa1a1a8e9f8357eb874b1ca4374541d75e90d534049ef08701,f89a11b562a0628373304b25ced1992b719277eb4894c78e2b78087d6b1663d265b609eddd4900c70c62bc6741da41801807572c1736f35738cf7b307971cf2300,69e12a883f005ed88169ed70495a68a65090aafba7affd3405c707050c09328f58f29eb2558efc9051395d4943fa13b035eb040e8d3a3edc67b3ae479425136300,a735bdcd3e60233fc29808afd42f2f35cdf8a05dfc4c1b54df075b1ba0e666bc499fc723870b337e34f02a3a7494c0d8e7956c1def230dce0e88054d06aa978e01,b42d94fc65d1395332823a37ec5b82c3126f0aac3d0f38d0d3ae293964ec0e15783ebfe171b692750855d08e39c9d6f80292047e003142402544383fd906a01e01 +dcf5d0e78b5ec2fec9c6e07f15ebbdf89babbc0ae2812f3ca2b5,b543d896a05a4caa8fe465f703679b1c9d9e9a16dd4873022973bff4d75a0239,3a565026fd425ef993d7d2459d0009d0fe3f916d1af9cdd179981eb03af2be0865327e7c2005bd2487019ec610794419ac88f2860296dcd363012a473c370ec501,6f05fcb4a373ab83fbc71009c7ee455f87f5cc3fa11b64002a3896f2ba984e72078c46dbe1f06581cbcd2400f924cdc5750c37b250bd2b9073a4932c344b7a5501,beb7eebfa4699ea6faed00cad3325db7e2bb9af1b51683d7937dd7a235b955c926f9af33ac83b19bbf49c3fc7aab70276ac796e2fba89073de3136afb35f10c601,184131fdd38e480706ef9e1d332d061e49408b3ab64e20aa97b5c9fcf2abe79838cb9edf1246bed9930b9fdb57278ceaebfda18bdcfba6bb1b476c70ba19b64101,ad31ab16751108279aa058df1bf27e42d2427f18446d41166b57ea55478c0a2111cc06a9328c8e721b952730cf2a44aec682e45ad4a622d60e298adcddc1b77e00 +24ac80f643316a6dc9b8fca2791f2a7153f959ed1f97f496a18c,ed85bb3b83ddd059b209c672f86dbfc75bdbb89501b48fbf2c60bea72d4db000,05923bc6c562a5bece638a7bb51d7abc09fc72e38e1c0aedf9d4b831780c77f316d724bae539690411c67b915fd778a6c446b6b756ef07dd1856d754db268d4e01,e807851f54db5c6e4c253c97baae41bd9563f3c0aada18f2b40935d3562119b6780fef2597418df61d57a96e70787a4b36b923e725589f374bdc4b4ba4ee56fe01,d47344cbec79ee108935052143ff22ced8a29f82a7b8dac0e5d2c29f0485edd6785e80a0ebec69d0874a1c2220685a8623d0911fcd00f8b58d0b8e416d714f4700,731e1fd4f92464780e7eb23185bd46fe86249974f5ae2ef663150c6f0713bc932647540a968a8a5e08d4534b08f4870239b80cdfa82f2d5fa4f86af863d1273f01,9e8aae005e81f2ed0249de9028fc9ea9edffb9e4de21707b9c4ec0f14f2a9a78373fce1c32f5d6c23579884e1b0c823ef4adbfe6bf3a9731e69e15cddc6ff24600 +cabccf3971bf696c42e251af10e9372834cbbfc72503d59099f6,d04dee7a0415f949bfd6e98b798fe789af33c21221e7e769c1e7da4ff2f3452d,4618c6a9b19dba1be77e90cdaeaf0448f1e3f2713a392f3588d920c136bedd2b6ffc7498bae9d597943b91e3f3da35d37e16b84ceb386df9a1a16e7eb9ae405300,a21ef6569e9b01248bb816129bc1e3636a778de335dc29708c492a9b5c1b9a895625cf79c4c6d31dcc87955f79c9882fe269712c211fa7e8a0eaa9d3312fd94400,ad7a28f2d27c658245c7f768feb6ac3b35b89c4a341d2e7aa47358dde2afe77b15bf1940eb96ac3864e2b1bc5b273617a1ee50f3d0aefbbefda9bbc9f314e73400,42d7a1dcd298b8eb7aefd84d4c93cbc0ee42a592ba5704de18d980cd7ba0e5c0071f0d583c8de06137ba7aa1b02d3ec3808aa6af3019c54a0544a1c8ddf4144d00,f0cdda5d8d2cb7f5d4ff354039618dcfc8eb22a4b6a17a099f39991cb6917db21cf93cb56238ea8a12888dfb7ba9a3965c1c86ad5b7916ea88676ff2ce2ac6af01 +334091c13f0f0c4105342078f5416d728ec4e7292fce952cff07,adf64cca1f081154050d9b0ff29e6240d0fce12d2858e738275705a2f7f9dd2c,07461813bc62df57c7cc03f2834b183a65ddf43acbdfc5e9fe9b18886637f1ae1a16d16da8ccdd49e6df9b2598a32474df07f4f0234076b076dd499e2c3cb1e801,88edd1b46f4018899306a6ce0638d88b9db0ad35407cd03270c81ebc48de6d22606105a8f477971742222c1281c49162822200db069dc4af7fb802f5f9a51b7801,bc3f2f10f692849a096cca78ccc1622a2517d0a55addaed122fd02e5bfe42345196c28d5e965c2bc4af8a693c7bb9488d386262e7bdbb15b4fa9a00f960a51ec01,17d42d5b62389868b614b7f7ec1e84932cb4832a0fb96eb5d577855f3f3631eb0bc201790db30b36c7426d42caf1b3323218e849c82dc5f789258bc16ddbe20a01,28a4da7bfec6469173d339641a40f24e569739a5ee7896cd60f66bc16bf8215d7a74d7ea6b744e384d6ecd8ad960df2c9a4b3d46153e0d0e1a30bf5e40fb822700 +66ea6fae4c4084134676dc03901dd8b00f29e51a93844458ebb218,a91770914b3f0dcf667a2a0681d32c1b28fca2809e041a7c0e2828ce540a6fdc,df6d5c42a3b7e45d7d813a42a773c497ac45ba0a1e1ba04061771dd7a2b6e6220c86f490affb974b9cfdc7c505bdae7795ae4b629c202b61fd0b01737b97914401,1160e5840723cbc76afb9e5578cb0c066d76552ad844c95a1d3ef3ad554d2a4223d37e3a5892cf1a01b49790a95d87afb4e334ccc663ad5f8fe4190f2a9e45a900,109949ed9c0a8bd726dd30778b71ae9e7bd038cb78693520d68226748d056ce065bc7171ea4f8cee034ff0d5cc162486e42203a9a352b519747e6fcdf4f16f5600,c441ba6808021c55c73f4f0f9ebff65011b68dd6609b6719a8531ec5798c7aba4ed576f85f1b610b1da59459487248fdbd5e47ab2210f62d490142ff6c267d2600,3c214bcb5e1821f988b145142eff026a091be36c2202496aa1b0d14e9216fde55217f3aafeb9507f5d2e56e1b65ec42bf95199cdef97a76551fddf0b2b6e919c01 +b2b46cea9749b3029f5bd3744544b0fe7d8dad31bc66e5d85c441c,4fc16877c08b48c3d2c89409e9fea90376d5b5881cc84df54b2431f47761a7aa,d729bbd772ecd25de7d73397c7cb6c278eec88d49c8b0f19a4e24f1cf03b7b9722e917194511f6991a9eb094bb956d4a29d32651b29007253164b11856c7763301,a7fb2371ae643d5765c1682f9a84fc61cfb74f557387a7bd7b1dc2b7cbb82ed4297b2f50bc093b7ec31e8dcf83a1b602372c397d14de5b32a176e5bb7e1bc17b00,271de9a8d6665ad2e8be485a5038dfe81bec01c54b704bdea7aca9816f97db4040e1882f3dcba6b7caded3e7e4baa50141f9c1211e091d34469dee539a5eb26400,fd9624a890d1209ec32b65e1f2cd73ee279961186bf24a610e875425ac5caba02fe652e55449fe9ace7b88028b4e17d8b94ea7bf63d90faa6add8a04696091cb01,ba3010032adeba543f7919d3353f58658c0563abdb24e68e9bb2d8eb85c8606914f2c5a8a0281b4a09b721a99f4ee2a9c7f49f17e2693ee8eee4057f2ff9ae5701 +d52f391d481fc3cdfea847b79b38de0ca6423b7adf9fb730b64a25,7c1aca191802e1ad699b8b7326f0b94f5bd8fa2aa3659b631be5101d264d9a11,810fce7712315755484113ed6573d582acebcf0dc028276dc2bf6d1a4fe8827c0eeade80223199031b7cd7264fa0f619e79182278f1a2702e08e39614f52a68e01,d4e542c274e7aa7763774913cf9d8bd0faedcae2da8b5e1a1dbe1d37ddddc6ee299b67a40281a505bd032934f479631739d11c031066185e2d903e30a16a605700,12a0a06a488c071de930fbc7ef2bdbd0f0da76f93396094e380728ff990d90d52c2f3466ee6e95a35c04d3fa5d96d3f4b3c429c3a841592dca58e13f4d6a696901,c7e48594585b1898676e6cc8e4bcfa0a28e0ef300de3710cbbaa5d568a5b18e83d214dcad39513d0b213cd98931db38d6a2a2138ee6c2d924da199e0543adcce00,839e626882009c6570f82230f2f0415370ae14ffa9e146130916a26c9f9413775bc035bab245002eaf76c9a780c3d32f8ed60a03c7cc06ad4ea59f009c5c354300 +b4e3378235485ff923df29dea0083312db4cf29953dd60a74960ed,d6b6b82fd0e95fcbe5fcace1b3a157efa7daecbeb18a5c04798439916c1d495b,9c227f11abf033c6412bdcf35a192fbd40b6d7ab7608b96f10404db8bb204cd80a092bd22795761ac6c377241260797fecbf615e9e7224d108942fd0db2eab7301,f08a34382c9cacace4d60d368975ab03b4e09d327c167b0caa4726453d0ba8f7431ac17bd5fe6953cf3a477eed9a5a7403a6919914902fea691ac063c414605401,a1324b7c34ad85db917eee8cb31a166fa5c97eba257ea0b5e767e2ad109a1a9b5195052eb1c6ad43fa08834c40e9ea32ef485db7c11b69f042187e89fa78956c00,47818d92bc594eb64763f945df7dc05ddaa17a883770ca802a7b5c194e67b4c05c211a1f2bd578481d260af5bd81b505919504637591edf646177628aecd8d7d01,21af3170e060539f745fba8b34da032e3156dc0d249edfc8cdeff80783735ca9413dae77ec6a7f6ecf52d020df1f75d5deb5491e7b06136d3d6422a27636d17201 +013aafcf48c7d9089da117a9102cba99dcd694063bdda959951a72,89718d2999e3b67222994ec4f809d9f41c3f4e73542e32a29069db7c795123ad,2aa17142b9b96281427d825f97f1cd50c000e92cc827dc7d2294862f087d6287403e7e39d21d870d81b5cef5af7867ade129a8389008b9d2b096ee706e841a6001,c69c19b5b9772db0cb450d02c8e9b6671de2e7683a86bb09cf5307408923e7516df8f550f1f9e18ac1b189931b60cb369a119083031fd392284a79a444183be201,4f6469b4a886fc2b72f1b5fe6e5ce8241e4a275c7dc67626bf1b8b0a64bb585731b61bb42fa78561c11741f94999f672086b142fcc3fe73233eaf0cac6a354f800,3b85fc4c5ca18e0c5dcfb9691107392fd58196360aa5ef22e59b2b237223be6f5b90341c99c206c0d7a079264859860145182db9465d4c3a0b0ccdfbdc41b1a500,44f5fb94d5487b48c86af7df712613caf3c3111f99231a42d6661d9fb42adf97296f029598648f2bce3277a4215fe7c53ce7c102399def63f5b16448c5f6d3fd01 +1e1c2da77555e92a49e4ab73af5e9461155bb8a8facd093330692d,540fdb566316ec7e79617132764a801aebd5d843d6549fbe78c9d38cdc6db6ef,76d51babca8388693b21a813c4e4432709ea1129dfb74a4c87f94dd54091ea896e3e06e829255834341301f5785d050155e0c63ab6fa61025f93ca619f8192eb01,b21ff4e98429182dc8ac49421f93109d64c8f85ef1b2d4d7b5ef2d4cdb5f48954691f210d623094e7946338612a500c70d8b61c3abaa413e0bcebf70e515743201,ebe079dcd8b8f08617448a439baeb86dc9886abc579919005d34a79a75b473d410dc6bafd57ffbb1c49d6d840a6d3702e1b45740e549d25c32ff8b6d3bd15ae601,295cc5d06d8a5192bb3da49d26ea1ef3185e81a18ea511a9e8af49e638e412ef76c2622703ebe7f4596091a577ad00bd83ec65247ad86022623f7fb33c5bb69d00,36232923094820a7a9bcd8c7cfb7cc60a40f04ace60b2573e657949fdcbe835231134d239c477920063bfbf5c529529454ead4315c6b8b8f208e738c1baf216300 +53e9a846f62c3051159b94791e22b33bdb4c79504de12c47456ada,173d1bbd93d0d1f6853ff3c568ac675f31044a13fd3bfce13f014110df8666b3,ffb2b40938836224b92d6b4d1865258bf694f8680d8ef638a93697d0b9a4ee9755b2e8052e3fed73f0d9994e77198636e32c4f9b17785f3e1863c3981588208500,754c027f8cf08d376e7384e9bbb7bf6e2a3ab02ab199a35d9ea155ae5af5517b107e5f367d5d260829697b92cf9e56ea41aeea9067cb1780d291f9816f04c22800,3de3c52dda15abcb150dc7663b43fcd9a61f0784255bf030c8456ac9eb9cc8c15eb5ee2a48b0c3f9d7703f354196d66bf81e97158dff9219d6ab3417f566903301,d1313fb18fe7cae31f2b7d6d30287f4feb8e8f4f92a8ebff21865a6db05b6240758b0c2848f292dcfd854abf1671ab0ef822d6143200dfc9725082344dd20b7101,7eda5b28e2e12738072f9dba0247fcbb4a535e21673bcecd9182ccf7f421979454fef45b1665dfde170e42cbfd0aa1f4f0060af5e4d969df2c66428338289ddf01 +fcc4c4d4c95e5d7fa43800dc5b4391b8052ec53f49483bc4b247b2,29bee41929bca1a005559de43c679a89c97f4319d3eec545e55fe9d2c32dbfb2,d9e6527b342e36ba5db50773f9ed3c517e8126e893c6328866af24f946d1c2732ce5abc4cbec673727c66661190f24e1e180aee3ab97aaeb5fdcdd45a404ccc401,36f7dce9dc6663a986412c2ade3ed8d1a3480bc650da6722930f8d6c57901bed64bdc31d27f0a61975289493a8c6c09d9a7fa159c3ec3eb634e2f9df08e1cb5901,eb1eef7680c1de567fb00327b673f574aa3e3869a7ca585ab17abbd37e0319d908f201f61d8cce37f93f6f80d7623bcb6a5b6f58c16f3dd191b9fa7c2970f38300,eaacc7210517541f23b0657a4655e4d32d32825184863fae7ed80cd5c955fba04942be6ce171fd272285a2a9c99b9817c530306e8227f1f99a178ab7c69d572001,2d2e94ec7d1934c490d7552a89ab3137a84d2bf84442880aeb2c6da4414a8d6a7358ee79add685ef60fb30a0d9f84b86d4ecb5c3f6054614c0f07696fb8785c001 +dea298953a49c310cf18723f8d84ce131ee875ac15d256cd379c52,92875cc244cd76e57e071daaa3189235da4078e1d9a334c52b328f5539a370d8,2e0bdd6ed27be77078faead37b25393eab694453b14aa084ec6dd63df6aa016b57d7ebf4eb1e7e176e4ed848b650e9cef523d3e8bf1406237c5bf13ae4834cd801,cf53ec88c83fb3401aadfe3216a77b111e6e4da1cf9bddd2e42452dd75ba4a3947cfd920de9e865350a41ed5c5ec4c426fb7ca0fb1bce05dab44a015a1ed106800,aa06b78e67303d129e1eb72cb0ae6818e2cc8702d48cc8923de77ddd8d9956784908803dc299667bcea1440997567058b81914cc07fdfbf0829459c27e95a42a01,e17c1e15a0a6f7800036c507b1d9fd24ac4348f4cfcc3ffeae617d50ecac026b30d526d0339c5696bc3382223331a35f192782601441d05e3dd014efab7eadd901,6014b1ba88b5ae5755bc3be1a86caa3adfe4659d1d9d9d087e964084ed0509522b5ff5d5f73410cdd791c65c064564ba2d90c073e2844e56646b75a703b63f1101 +bb7d0a621d0572520c6bd64746727b24221615dc2cf8ac198324a2,736e54510cb28f21d0feabaee8f4967bc9a6a314c781c89248384473aa3a870f,05fff0f600f88f686216705546742cbbe06d320adc03dccd799222daca31752b00cca102fa251a7c6bc5302464df0b691bb437545803128d1dc97bc7b24bba6800,02fc49f7a73bf570654a9857c3c7e4e5977749d2f147bd95163417e308b9909830352c04ce6b6f7ccf0b4855d93914361fe9d1af83f7f3ddef278e8ec38d5f5901,ab2f03a3ec1e76fe0803ab22886b5fb77384a5b8ac3301dc4dd56926350ffcdf4c64df3165de47289dd97d3fd67bd3dfc2ec8f95eb2cb3db343edbda19d728fa01,c64da64f963d62f78c8cf464c46e8c44b52dc67a4f41e314f4f4bd5e845ac5813cb78e3d4f36cc33104cdf5297cf22adf70ed3334126ce6bd44b5fd8155935c700,c100fd930ef52803b31915d6bb3a007be6d3ecff53c1165041fa279f25a547c63a0dbe0e4aca198f32d0b57b276d892d52508bc4c6acabf027a940ae0931f15900 +bf7b7df53e081157bda9307332404d14fd1c7e04664f11b26f9ab074,24d615e0b9cacfe70c013e740bf020c7b3c194a44d959fb584933179b2f4caf5,05f2183fa72f97112ffc2e6041d70cc6c4485213afba5ee1e078a9c53813b14747c8dc03581743c21c247d48ddf9112398cb01c7c6845530df352a8077f10cc001,7b821b4582b459f3b9cf91961689aad373814d06670e739d09649a27a041582939e6ccead073f692d6e4b5474f5356e0a030f21e2aa1832e77175c0648c3f9af01,092a8b767f9872ae56f5efae5c200d5ba7e449d6187389bc9ead3397c8b803375b0465b18ff60ce71d922656cd4013d8be909b1a6d74894d46b03ee04c94e47b00,c0f1665854a481d29834a6f297480c0a8492f7b79602d69efada2f302e8955dd3e120e77f11ba0e898c3307f41192f9ca733f68d305aceb6b5d2a3aae76d52d600,d18ef5118610287e7e63c26d86efe1f5c9f1eb90f1390fc96bfadb2dfb24713b75fbf2b793316e5740da2cfceb21ead41169d2e5ababc14f2631246eedb4220301 +61dfeeec90dc7d90eff0b32c6957f25d06699eab0b58ea12cacf9848,cbf9fb3f8dbcb03050ca02f3b67dc273067d2b3fe2c79ac591d18838a311de82,f2fce49c1fcf101b7364482ea12dd5f01a1dbc1bc16b32517f1859b1446593ec0db74db9e4999db08e46a6cd7950da8d9049564bceec1b3a5eeedfa554f886e600,28ff4d85702825e1285b64130382bded692a69c95c2ce5dd0f5642556c52b0550de741a668507c421abfb082ec5bf58423b50e9be2ac8c548edb5680362d627701,9f928b30e1439f09626306599483ad4422f904b1889576f57caebd5f6caf9e1b24f047c587df784e9f987b375aaec32ba36d250c440a6adb96c09fdfa92c36d101,a9d23169f40270274e0592f5c08f66c1de5d318aec1cfbbd8aa5631652a2ff89239f8cd91c953ccdc8370e212855fc55bc914d740c2709eb98d19b7e81f00cd401,8946d9d19906048f473fa2f6dbc73cf47c131da460dc3393c66613097ec3e91d0c5732797d7b1ae72fe63b9f9701d882da2bb6179d3de1c1f15602f92ca0901c00 +5a74054ae547133307a8630a8852133ee1e75f3b9c8ed2f5675cfcd5,d24da30f4836cbc499e9582b9362fa5c0a45329cd785dcdc192c6b4fb526ec0b,5324f0dbbf64cbd30ae941a7364e1abf2242c6e5f3dfe2dab10aa306dc5e926068356835bebab8fa7214c0ab58cd4534bd812c81caabf736a8467bc3898b434001,cea9662b775086134547034ca03f3e9024965be88a0919e6ab08eb0d768cbf612bffd6b0bd049841e404a48dbe8099fb98f32f7b84026bc078c340227a818f6601,92611b6dee37c9a0cf3f46bd7fb35c778dc4f6751cb4ccaa076380c8e0d26d1300863202b8bb2313a3e713fb75ddf209909318edb620a7d9b3e4243c7c6c00df00,9d9828075f2a9dbbb00ceb6504e555896289fa7f9a11dad02b11d724520076587ec2d889fe8b915ff4f5105400c2f684815dd0f28a46e960e4b79ec9568201d101,0a52044199f0a03a4af639e0cda86ff009318ef926b484c6a9082d41e0fa19693a2eda7db5a3d4b5671dc80eb2ee5a7fc3408f681491e03a2249e61cc4793eb901 +9f9b9d3847ad109e880bde9ac2c95d041c5cb74c2b6da1a475641618,b82e210c5e41c82a3ff8bdbafd4e15fdd5c1fcaad23a9c61ced42632679650ee,df5fb7b2c2af0855d6ec59e1e7da02d88f4ef6267af9e31ecb81b5f09b92b1396c60fe7f9d33a92231dd509947a2d0d8229d2c377532980ec41d39a6b6dfeb8c00,4d2b81c5096d8c13ce512e2177389693dacbcc36a0b8da4b6a3cb0c5663a234041461c199dafc3d55b149d5cc94613be567cfbb559a005841121204e2e70fe5001,121f0b45715f708830b3e39499eecda39ae448f054baa2ea5efa45de365c6f4979ebf94dd90bf6b71d5e8664bfba4c8f43ff52e7148c25fcc3eee76da7aa0f8300,ae9b45aec05a084dd646c4960364d007a1822baceba7b9020b967558bfe05822768cbf6dae53605d9ef4d2962b3a84234cdf837e021cbbbef9c969e7902bc5a401,ea31c2867b6bd7986f72f4e2048e94427ab64c23be939e30347f7e20e365b8c35bd9d78e709c5978cad7feceb42daab1ec2abd8a5b47b2b3b9be60edf968084e00 +1016f8f0c22d5b80e4066e42ab43d560fc179bf668278321411cd26e,523dbbcad9f452ce9a8da46e046ac6acefd24e888248e03e945862e1068a5bf0,13652c08e815fd45c8e404a29d7cec236431c38cda122ac1bbe50f0ea0bbcd507ef0dc7cc965b06a94bd96d241b863b37ab85d9b26967d442c2cd8d1a4133b7601,0f4e76c7d691d4de37046a6f77ae99a96af9d1a28773e861e0810507d5a1260e553c98cd78cc2c700117f943f6ec034360e9d14b7b64a26ef96c71c12bcf89ab00,095305a937923a3a2a45f9403f8d501c4249e7e5707f20e23e10ad0e8c3711151ac9e03fcedffc8dee618bc6e0eedfc2e3e9e699d0fec039082a6d9f947c2d8301,b1ccea917bbd4e996c48338249f79bc7c95556c07b9b71648c75dce33ecf5a317af5bae7ef0d29c8407be910379110f5142a913f62050742e2bd8bf9cd82520b00,323e0bb37ddaec430519ae50280497b2eef9c3e824d27e7fd3b42f3408fd3e0754fa6116e033bbf39262a4559fe6be863572a6460e78710bc698afae83cff8c101 +cc917fdae426fc22044a4e53bda322b34e30106684ee38ec31f7fee4,dc0569623a9fd8d457ea434604f0aac756c8305693c850be375e09fa7fb1e47e,90032948e45e05ba3622c5d5aa3fad1740f0e90350803b3ffbad51dceea4a0437d0ad39ba47d25fcf02f87779a1f3134db6f2c49cd0cea41fc9407e36d53ee1701,8e0233861a62f55df830d9a8f6b2f34919a53b1ea978da70b2ef1e9d330a92a3013cf60de872a4bebb61923afdc1bbebba127e0b66093c8925d5450c8508479a00,f93b8169fa651cb1e1116960109cdecabb8c4bf64e4846309377b126a1235e8563d858147d3a926e9f33cf4252be7ab932d04f59887ffd7ba84da5ff575d186c01,81f42f58cf045f078158cfa3640e8f56ebcf0f6908d71bf518f61dbe513b0245610b54a5735b69382280a613e7ed3e40216d91a523b026ccd8554de5aba57bbc01,cb1dd9d9061d4bf9b1bb1a1b310c639cfb1048b4ebe0964272116c012fbb1d623057c628d8ac5bc1268b14f4f52154cd0bf8c2cb268ac5552e807e720784d58401 +7849578e44c12f9ed2c4871348cacd3b3c08de5b5d0c65b85b11578b,ecbbc5a92f295a1c797555e7532ffe08c6ad521525341d8759bfeed7b4fbc3b4,99b42465f79c0187e09f9287c4fbe6caed4c15fb632a4d3df1eb1bf0a3d8bec523ef73b8e6d3b9e18f25ff6e52ba071a5fc1b52bc248f5f6b846449bc06939a700,c376041225980d0cd52561b307cec46ceac28a534cb0eaa8f7bbd69846eb23db338a2f2ce54a9d3b9d0a9b54cf2505ba6737d8bd76e34cf2ecb803bda056579401,1eaa016becf9719f0ca5988a20430f2c42ba9404ce8889842f07f7c4a0eed9fd09e593f3e05a96196fd1f367a34b0e96fb400bde5d049ced7a208b60330c72d301,ec0f26b0203aa234c64ee3a23919b825f743645bfe702002710ad9791d5860660895e58b20c9f963e93a611719ebc16e929448d0f15e916297dd44540027b56200,fb4077747cbd708602b17512134663a6d4d6337a8010de3c6a9f73bc39a2287552aca59d18c65ea40eda835897df9c068268b84e03f890aaa7a2e996d426346301 +81fbeebe2b83002f86648a367cce10d5dcd112e66b5bba94addc3e4f,7365bc18353acf08fddb768f1de9b673751d694f58826d10569910c003130aa6,f693c2138fbaa3ae0931d3f4fa194325f946afa833387ad0ec7b91bf7f8e675a289de68a62a0e9591ce3f67f64624aefd8577c8b52118526eccaf4ee596b648c00,349f4a80b405f3460ba71065f026071ed0806f5eae10df8760fd620c12b31eaa4e485006caaf5dfc2640c1d84b272fea4ad2aef94d53c944c9e64d9eecf3e21301,984529740f196c9f0eb835d492966f5cac9d2c938c449c8015831bf340361a97099ec661bdfb0cd9387027131fbab2e56ed157ad5a28f0b238b7de712fb9452200,f7f749441cafb8f3bf8417c81956f9bcf71f09becbe78fc87ab91747ded1619931aadcdb4daec2995276ec934779d6c58b134c9f2976817baebc030557b5e7bb01,14e3502d67cf2274440ae34a8c86b630e03c1db9d086c1fce64786974bee1e7e1ea001978c435c7f8dd6ffae89842b58d7bd6bd4568a98ff1c1e835924dcd1b100 +610f9769fc6046d9579bd16399961e2001e4d1d4ab477bf7179b1718,e721925c3d634ef67225dceafd86b5fdcc39b3a5819852011ead9f799c545b2d,7cca57cea5acd574c1a943e174ceaa3eaea1c59bda226309244b9f157f3697722ddac0e57600ae45c3a52557652a3a75cab769fcf97c739b162134549df98a9c00,db85c01e072591f8fb88446abbb27e5e3b9932c7b33b0a112583c0db103e252d54d812641ce5ebe0afcc32cd2b17c19d3bb52c628cef0ac9c61b4c4a2dd9d04b00,2202afc2096a1003259a40d219d5766b756a771271e1761c15d1d30b8734f2a76d3047741121dfece3640142e398386a6ec195507c655d8c36e728d5211af08101,47056108a0328fefe1db03335efe9de4bbcd5f174c4bf7760ee4cd172dae95484c2b1f39fb12b20eba0306298fec3a98244c4538af835aa8925e13a57e6da23101,055a4e323f80e609949ce57c794d0d8c1ce535f1e201e0562ea1d292c2b5dbca2827adb172800aaa47f3ccd894dfeeb1ecfaf8e18dc676b31ac748d8d4beab7501 +e6829276c5b53dbfe4de1f8b4d820583528bae4a5ca06d3a415b5988,5e4e7ec9af4c3639d790c53443cfa96066009e89a2856338ba043630e0abf5f5,e3cff6174d74c9e71f21c92d89749dc9a25112bc4ea476a601cd708ae620b8430850fa20410ab584e51d53c78a0d3fd3415c527d2022807b924a6b32abd3e6c300,9bfe6288d7cb4c8681e317ea5e7d6bf2693aca9ff48df58b7520426d1a4658c441e37a0bf61b6bbc0d2a7b8c086aba63b334b228a56f2dba2325b79572b827e901,a9dc32fe6d3399c24a17d0337188047ad58704ae341e88571ccb129ddd4e2dbc2324418c3583068d18e0fea569351240cc8a93ae1d5e2ccad87e990280c75c8d01,2a9471e1c6f52865040e594e993a67ea8d620d0f20a39ab5660d52e6e929eca534081eb8e90a298376ed5d2e92d526b4fbb02c54c4df1247c27b951c0b0a960600,a8a7662fb39d430cb4c6cd67386b21706798ccd79bbfd5d830391ecbe0d15068036fa1a9ba53f6ee4d3a25ac8182137c9195e3d5a4c3e9e22bf3b44b8a3031bc01 +923f3ceee618bdc90e0fefccfd5ecebb3c51121eae609f998d9593394e,d024c02a49e7fc2ddb9000271ec80b92ca73c0d8ecfd86509b4436f33fc6fe8f,cc246f9cd7d2a5f45abeb97ae7f26c52231e8e2a51833a30a7cb522e01179b0f78f06916a863bcb43d55bc240c286836169f89179f4353addbd9bd660355b01401,e2a696660294fc38efb3050948456723382cf1833c8cab0317b32f4de560634347754e21162e4ac2a015ac8bb44c722daa39ee94a31b8d203dec85fe87b1b86a00,4c0c34802fda6ac1df431bb5fdca3688b991f8eaef69f20aeafe953d3f7c3cd775bed97023c9d0907f5a418bdae07e04aae404ee32a35d94ebf3b92c72e1ad9000,8514682463e563a60b2a0f4a4f339159a1b18b8cdd4de14e96beb653e6c6e0ed24070495c7c5a3ed950367e924c7841fddd61bcc748d7e54e90610352dc708ff00,9ea92bf58e5feadfcc8886c04f66fd862b4c2cfff81705de23a6479d41ba69392ed4291f1437499e6f2c907e3e23e419903e971093a7bfcbc80281eab85fac2400 +cc7db0e9fdf1389f565c057e20c6414edf5628b008f830b269a446b441,4771d2d6b8e4c8c441465d2123c40a587113f8fbcf28a6563e82949260b003cb,901b68abd7641f877bde74060a8cc4f3503e7a38c212504aafb0fe8f22e38b4f25ea3bf3608d93beaa5ae7d3d7557a54686f0c8ab48ab2192f419b299bcf166b00,ed5b1e39985a301c9135ffb5635da0d36f33a471b1991a016e31f8181a70236f6be46e5dadcbd28f8d811906372dcaa49998f016082de1ff788ae0f46cca0fbf01,231d3ac128bc84cddd432757ffbab2b96414080f2c4f7ca9d03efabf7be998b9788c2189107985e0b0286f9349ebfae52d29f9c70a23c12d8728f2a247100c6300,f665be112a082e2a2aa6cf1ed8bd6406e5a012cb4b6034534db90eb232cd424870ccf2bd80aba9e72ba7b267f75c76e4ef947332aeb4c517ac426555fa75b00700,afe4883abf592cd8fd09d53b880ef9eddea081c4b95181ee5dbef21fe3569f146e87564464ad10d49d81ce1687b049c992ec46984c9e0c28c3dca84f1df70dea00 +af1dc7bc3df5014474619afab29072a03c2bfcf2e32b56f3535f39fdaf,7f44a0b1308a7de514c89c0df1ab85d29c8b7ce8ca4bdfdf5677609d7739b676,1d50d3207ebb99d780b336865c2acd35939f0e476803763c7fe29913b5aa0f8c1deac029a0485d562f6a60007ce5e50629866a2486e7e8dc1d642627d2d2a42a01,e2ef9732686a5b733e563f7a9a09f5253a70b53af0be84f29f9cb675c1c341d34802a62bd4b136e79588204077d159a76fbfddd29d936e1a72977593db1fbe9401,56a9bd90671eb7eddf3cc4b3b6760666777175c5d23364e67b73f2ac80a0d7f4643663ac04e57400384001ae1a42add5c675a78751743bcc1314e7c364da341601,047b2dbcc4c8a4ff2310101a52c308280a0cdb10c056fc3ace459032c14f67140161f1572c8423202f9a9d5afaa20934c622a80eed286642a36a01e18b79881900,d50813a1b6fd0f7710a1e4b1a0ba9dd0d797ccd8575f0a07d69cc29adebf684806d835d090c854240f6d0a5822246fecacff4450bed385ea9c434b28c2ebba6f01 +a34a1c411dc63bb72da527ebbcfc7da10b3a9a0fe0f4f4b56d95530a21,91775cd261441dfadba9eaa877a92fe8d10714b96229739a2b92f40dc6ce5382,b9d238215bfb822cd6a48fa09238b126d36b20b0aa6370630a9d99cb9484ef13412688b8ac7a4aa690effff57ea4e59d7990717e49c702ae90744568ba7a0d4b00,caeb9fe5470ffd5f8d07527285d0ef8a4563314fe79a5ada144c2f79e6de7afb197042601da24312a35768d371c53b4ed079631e41ba9cb93da878647a51fdf800,b2140fbed159ce9d4c19ca734f33b918003dc4aea71459e1564e5ba7e7a7df806d0c3c15fae150b43c23ea7ec86390777516117a91a452b2b1cd2b9e093f8bfe01,cb3936f3a1d3cf0d1891221b2eb10df7705870db34af3120f0fa36c64ce1940c27be1e63b3d09c592e433d67c477c2c9c9e63b25193eb606b67ead49541b24c101,62d63cc3454e3b332965975d5295fbb9ede64ff6673d6d6fab3a13d5eb8717b652a719a9b730f9ae8fd424c9f2695c8c0d9ea6734ee772b73f34a2d777d35f5800 +9c27be82a6654292b68b874a7ebc9af71629e1ee75054a87856022efc1,d7e7b9dfb011895533f70d2fe8379843c5c7a16f7e36c43ee7ac16fea9c26964,f0aef4f353a912a16a0e165880f2de8d9cd52ed12b8e23197d3a57b21eae3fef6a679d2feea7e365a1a50386442042fa9f8fda765e749cd73102215f4453709d00,c46bcd321f71dfc22aedfd1bf4c0ea3e1f994ce00d929acb3866644c8d70546149553976257d12d42ab1e4d08ddf99448388a857f06d8e80b74405b5f03361b700,c3a73222b722993d117d9d1606b23251797cb9e0130c833c6e98b94e599e3fc80b59e0a75cff387d64e71b0253c13a7e0f539fa8dbe3a365498140284b9f192b00,9c770dac162f3dbdce0b1e99a9f8f9d69148ce1ac3ae6a901d947fa5b7a8a54b1c02bb838f94f726e5ea6584c08b1c4f9c6c1cdc92c9f6c05d6c776a72fa79c000,2d968a84e1dea1f4cb7610da75bb8506e774c4c4f99973f8c19c4fb4cf24e1fc41d8e4876f70e126af8963a6063387be63d0d56b95f67a928e7e34cbb45cd4be00 +e8a28206a1b5decf5e7e11911ec0ebc8b62db0baadf91a32dfd94dbd9a,96020101ba7521d2f4bbd6f995bd3481bc03b9e915193f771bf7ba91275769af,96a679c82ddebf95b41ba61d1fac833695a05348fbdce6c40570943fe0e96fc52390c64cfceaf29c26e876fd9c8daa933901d64fce2f0d2ca1008d48174f13e100,7b5d8d7557ac68bd922532cfdcd61befb7802ae263b533037793b15f5d6334e4424f3c2851f12280162befad69d195e604a5459c2c902fd9327bfb49c520638001,4b8c29d70917ec16a15a83d90667607e41b43b2ddd6a60c9f9202a64ea878f303c39f46a379e8aa9be53206852feebb0e4358230e14fb7f95e1af3d06d7de27e00,0078e5a550bd61c08621d592bd93b5aa3aaf8e0cf895df81b3399ee595e4f96b61b4964474daeb2951b6c8b3f9f1cc33417feebd1eea29d43f2f25596433459901,bb4da4c829ea69a4fbf2c0a19dfd1d41ecfe59ff8409ba331052ac3d280b83d22ae76307db21f76e0cf982bc08139fd80954fb1fc541f41fd8d8142afc2d697b00 +4801507578c536485f72cb42e966192f09ca06664c7cf4324521bf0e15,cf12d15e4746bde59dcc1b49b65c6678a5756936315af63fc6be015f0b8cb893,b81a1d5cc62cd50b33147e60d76f694ec135163ba2851fb3852326ccc7ad593d26506934ab8e3c53b1a7b7ea658d5390ff0bfa8b5410b38a7d808ece81b4734400,413c6314a43ff1b40ecc238ee49cbd2358d6cce6cfa8e7e8930adf22285cd944453a334290a47fe7b0fedb69414e532e2c7bd05c75f94fe4b4caece8c8335a6901,1d2aa958e5ad29e489b5806ee9f6dcfa7b3da75973e28897e9635c8ec11e18bd4406e4cafc1907dbb346b9e824649dffaea0e3737fff9cc62e60f889b39cced301,dc704df9bc766387e894044caf2a151a4d48cc4b2ff7f7175b95814fdd1f138262123eb4d2e8cb81cac251ec79e9968238aec7a92bee749c77277ce9552e4a1401,46e65c3649f26d824ab038aa30ff9079763718ee29e99c13dd9fb675028fe5ba2f5a8c0aaab0a38ff0985f5497549118a5bdf3364d735d3258338036641c229801 +69c2c00a3f0573cf5e0af14498f0977edd0da05373eb55faeab78af524,1294829877541855bcd09becae86742d1c288946485517a7148b147bbd1429ad,9629116d7be11d129e0d8ef6baff5c1d8b02e457e134d3caf53d64ca0dfdef277b42a98b4dfdf149d4e279e84f108f062490c6cfe2f907119349b160cea4e0f400,fb48e64ed55d3114eb242192ef04bd378eac70491fe93279223133d56fa8fec34da18c737a49515b6a8aca78d8c47517ddeb149a1375836ac88d0830f6caeaba01,2e73059f187ae8bc09e1ee7a56cb8e6b74fb4c128d09fe3a1e9e84cd8b53a83141c485126eca283f9bdd824e77f8ff546e55ab8d836862be885b95ceb843f7b400,a50fa56c8370a3bbafb46beddbcdd09f5fa226d2a5e1bac62579c64fc79208e4733352b862cd64671920284609aa610b783753ea99395192888688425a9b7ffe00,be6d399dcc2e5533f61c0406e10ef97b3e5f3547ae0bef994618d022800b03b77dd92f52e34d173274a34b4a5ec156d47d200ee62a4401139cf5b911f107f29300 +c1f340b5a833110bc462dc276f514adecf62f352b22f45be3e24ca9b18,8c0335e8e621ad4bb49a2e8d5e9ca226807f236e4ebf74bf2c09074701608a15,07dfc8c4126fb80cfd2566089dec45dbd17e731c2f171d70758580c4fc5048290cfcb66f98edfbbddd751261e228cbf0750ad1b8500353404ad8bc3c24b2931801,505e4a964a02941a8668e4c889c1e47e8419c7f13555128f4534ac84073d15573f8e82f5281e70359e142130e48eb7df004cf5e092d98b62c450e8d70448e92600,e9c3379a0b6eea729f65d2a524101288cdac681e3e32b74b96bb225cacfa0efc2d179929a4c426e74b86bdeeb18d1209a3caf1cc6cbad23673f7d9ff4b1816a100,c3736aa14d9daaf68c14765bf00a8c696387cb655ee46e3f5235ff7153599c9920b896b47699e6b9d03cc343fb036ac1501af15bd9283d4947d729960bdf12c700,09ca52f304d523fbf010d06610a4e9dfe1b2ea7785c50814e2708aa0fc0c7cf540ade426cef9af68dad5192bb5736adc1a03f10db8b6935bf785b3ae4a004f6801 +8d3c80560bb3585657389950feee979ea81697d74ac6049f903ffcb7da,91260acd08546ab0bb87a0638ed798dade5e2f160ee61acdbe99b70fc9163a76,9758068a2662d9241ab248310a0c20b29707d4265edc487c70b474b706d1ea9d316393afd21b32f25667d8c6e31f641d16a722aa7efd86e605dd504e734c68b401,a5c4df93052c0b892509974ec914794bff2eb53d8bc500ec890739f132c52b945c576ab4089b08b4f8069ce3d26646eb6f6d0546bd409b3085fe3859fbfef40100,476b7175564b615c8879114a4fbc81c3132e27b903a524f7d2243c940dd76ec233b1972656e834a4a9e5aab8a42f47bf6a60f959898f342f0bc23a0e96d0fc2200,471909187476e7f25025a1b2e1f54da75f0d9c8ada3ce39e2d4d601ee6605d0a35f882b0ef59e4635d952d4b80461b86908a1a6d6a1fda14369a25c2894affec01,58f0f9a88116da28c8ee490e45c6b59275c557bceb19ee43113ee5734f30b6f65e9970694e59d0597f94e5aac75d09e67b3dde4cbc10a61342273e06f04717c301 +e04ccc8908599d6aa8a4b60644952847cb27aaf77164bf8a1e92afdc6829,3003d59620e6ad896ce3ac9d11357670542f3ae583b5b898f903e703255d4a1c,ffbc3a6dd5c7649d9009d7883f83e2f08d839744307f1d48afc824bcad3b74d20c79d6931c476c2a3df5f5fa01103070f037130db07c452df286b82fc986e17f00,370cd990dcde9917b2d99f4496c6f86a0fa18deebe7ea3fbaffe0b790437a69263fabd1dc63d4666a8753a2b750ebd1b4382cc2682e63c9b51f6e05005c1304f00,9de97cba2b879aad63610ecfdd246b2a94aca91273faca334d3f21a210873a4824af6cf16a3f8f888a57b870b8c48ec40ee2138ab8d00cd19d9f2357111a308600,391340567f105a48f534021ff77ba41d925235f56532bed0edd0e99b91470aa12c54f3eebc476c8b48ddee2cc1cfbdfac710dfd60ced0fbb86c60a92ad012e7001,4c675bcfb12c8a8005c75d185eeca9a80e710593d9cce5af02e0253091207d423c8292792aaa818f0d34ceb9dc244a887dabf5128283e1444ce48160acdc086901 +cd339ec57f9c7539381424a70278177e9a6016e3c0a891b07304d4534328,6199efe2a24e9eb1920468cfe8842e4fd9a66afc898c1e9bff641dd8a483fbbb,419e8b41fa60b1511861c7dc7c1c99f4372a22129a52605fa445108be21118644ea194909db745886ab2d241f92fc56ba8310b652d70756329bed1791693a71000,da561ba511b858d718fd5f488d23a881ce9ba136d50df57280cf0f08363697773e2cd3f074e049edfdad7c6ba3831c372bbd5fbb79753871494bfa5cf667b66e00,6c205438b555fa0cb293ce4a720e6c5e046d7572fa391d9ab03ec50ad6e7a4ff0fe13dc53f011b774836f0a319740f66c7c438818e639391463261f4ed5b0ade01,e38536bcba3162b5c82034a35f9d89bb956efbce7b9e4fd80fe5ca04d8a396734aa59784b6e92501e5cdb1d687f429e3efd3463602ce60d06de51a9e1a1c2f9801,a414464053d5ec59265304829867e856144721b50006aa18cc40fec0ce6ac70333c1a02370ae7aa7dd61858506c94bd1f3f6bd224069f1985e46b6533eca9b3101 +cb99c7b403d13a4e51c534e54775925ce1b5c0096731c47885d80ef31347,48552682ce27eebb4b8bf02336fa7d85580d409599e5099ff8c181f17a752136,ad9f26e979ecd272577a38eda54cbe58b420fbced24896d7e0287bd727478bf665eb511c14e57b137f198dfb190d7f5ee0b5ae83b472830f3fd453d64e152cab00,0a7f247b614f41bd96f1d638a7386335c4d4a34db6f79c2f98d01a88d42a2ea24cda64c81d41553a5f498ea754f378c33aef76cb45262de556f81cc864ab4bf101,9ee2c96b8f664138afe0d767c072655e98848d2a4d4534346338cf1894f0fe9468fc7f866bd29b910c4ce73ad360bc2bfbbe57248f321d849fead749c8377ac501,6c3b92745eb7d00912d1413c394b9dc98af5e7676bbfe6568a62f193251a3ece1c80b561f0924d79a39b8c4ed1d69cbd93e6bfa7e7a96cd581bb490937016fec00,b382769f1d5252bffc9634137147ef4bf62b9aff0c55645ad495300195297c844aca2cb7d7ee22831e3c0201a5a25c64059dfad7c77e155bb39d8fe98f7fafc501 +af4f6097e276586ef11b506f8d23610e34f534fea0ae2d1c892e9b9aaf08,d688ecc919ac357f13ccdadc663579a5c8876398d65a24d025bf3ff33606ded4,cad9c402c339b04340d66747ff1d84ca004140841e00b0d9d661a6ea261986357d502e4cc3a3205ef4ada5767aed88761d4371d805b64761eb1a08e155d12c4d00,1f2c91dace81ab5cf7408f71fb1584c9d4f0805b33be6f8b5670d929c943bab15e1fb54744df66ad4c3b7019303fa30ca48989d317a7696b09c42b665f64f57801,f44fce2115ea9c4c20e6d43690a1f22a911a3c39062bf6da601a171a9f2cd4524f6c92608f56dade91aa7d497c89483d530da3eec3de25b4948aab2b5e26f6fb01,b90c150b25fcbdbfc8462dec005ec9ac550f326af09cd77f82cad4221e98f0ab31682a9dc659d1cb8da38c435414e2e6eefed92e44ac1d7249b7c478f486559e01,7972edeb36fe39ef9b9e05db7d7a5b0b38dd1695bbb29f32c75863d2a3d134ee6a85c3b2b5def91549e9d3c250e07b30a9f3291a0c59c0aaedfc5de7e505c3bc01 +1e0a0a4e1b644ae3e571f7b0f005028a6716bde8c671f8bff83dd136a29a,63028d37277cce69006cdfd006794ca061e2240d610cece40bc6502646e97b48,9dba696973f76a08bb8629b7603356548b37d79e0f8df7fd8719e307ca028e6d467b0f76c0da55cd8b38d60202bc8e275a7ee96bc93d2736306dac00882a5b0a00,990fbbc77f54ef67733a5f4b6a36de67587bad1a12aec442d015523867d403db32aa7b6a14d5dfc2541a399a89d12ea64ecd296fdbce8c1bd52d1f596596dfcb01,7107d040d01f0260efb8ff67f6aafde55f836f1dcdf4950565d0ff67ca110a1d43747eaba852a4a0032617dfbc55e2fd04fd7daa3fd306f0658f9de2bf213df901,15be390eb0ee6d76e31312219cf74d3040fdd7afaa9d1db2ece962789d1e48db74fcd592460f8b39a99f1e5d9a3aea634feef32ef5006cdd323c5491786101bb01,777c7e2de152d130d714175f0db525b15264da5835d9c25481859f69e4fab76f7d9c804b3b5bda6ff5a6c0bedc117191d57cd59f71f8941e471d2ef9132091ee01 +c30153b1d813915244d928edcee9743bddac2db455e8b7328fa46a10e9ce,6c7ac23041856743ebcc3f61aaeb6ab151bf37f2a9524507e7db4f791aeb0aa5,6d9d3bebd5d634d8eea8b4167103127d6a61f39a3e0f9b30eb0ea3ba6c079d3162fdad17441e56259e0e5e61378b93f5aed8ec89c28f4382ac1f1532e01f2f5401,f0271304338ac1274d03d38a88854a529b64b765a3bb647e582bc574b0acb1643aacfcf8c7eed86cf1f41c8fa6946fe90c511e2360d760dad3f59f5052bd5f2f01,3285ceea29a0511f99cee78880ca1e72ca44118a1147cb03329fb7efa0ad202e4177f37739f057d781f0907a2c17d095a35d095340db82651017827db8bb974e01,d2991f7cb304972ec69c63ecbb56bbc7c8898c92ceee8dcaf9f5ebb54129fd7838a9b58decb23799f8bf4c6cd425da2c2b75b3807e6077edaadb04dd9287966f01,0ea02dc05af659084edbe3fc686fe37622f48747a75e48bb821fd690dec84b0d26ebee59c4c53e991770d03cd2ec2ac93d92663e992843c5f6e4453e66b1350600 +7ea0290b2244121812da904254401f901d8f08d50be8cd2c17c385784225,e25ef37bf59c019b9364fc87715ad4031e8b37e68fcdebd22f3fc7b57b87101a,3017a0e82087bfdec27ff65055b7bca98f3aa76a8d65447cadeb9246c7ebde18482c8937282d74bcbad8f2bb618ca76028915c91a2d89e03786d34fed6dabdd800,bbbc31646f116ae138739da68731292f1515f51594d3a433e2d490bf4dedfb0f3008d44201ad2f51fecb54e9dfbea707d53c21faa2a483cd498048f00bb8791b00,2a6a712c648250b8e32f64d378186ff88a626bfee657b7db623c55107005f7aa787f7c32c883ef63297f6a11e8e43e29a02539ce291e2984ec7d7e90657ee5e701,d6b45aa0ddda10d966eef3d5a9fdfa82567ca53b0ba227fdb3a3a916ad0e52f646a9ac850fad8b434da072112e5a2ab0e3b8aaa6fc888c0a7e2791172f04ba2201,831bf14dc9aa9fa0e96c3e8eaf685e8879a0a2e17680ea3aa16c616e99cb07ae224bbbfbe11853a7e6095961f2d686988a3bf145b63f76b26223eac0ffa86e4300 +65eff6d667464067b4eba76a01956627fd87ec659ea57a7e355b25846591,5aa5a92e54d726d43aa8b9130995bd4e64ff81786d0973df981b6a8bf931e1b7,aebe7113db92a533d64db249a18a0447ddc844921cc99d7c56e5c6009fbd272c3450ede89a9c178987912707338262b8c1bc2db16f60da7c04165c4e3d1a13c900,fbe65d9edfa5550b7e980865a9779374bf60c316c9ce8f8734466a3c5464f3dd07b3463f356d9dc0c84b79b528f4304e620c6a8c3bf4a038497d1ba13ea14c5d00,a9c45da17f7c3f35f113084a51c7ef0d45e03a13a77f2d3ec99306b062022c854781161ff0aabe2045e6833915fcdd48460a4a3a2a4a1ef7a904a23e273ee0b601,89270ccf4121194310af99fb08eadb56d37da56bdd29cfbf85dc5c9dd68635ee6c4fe1158de339176a42864bf3a8c3f8b6973a233e95a9439723aab6c2676ce701,748e86271fa44a3709146637c6b84ade4d31f7cd425cd3772f5cea71f11942e47a9e05358acfab4fc4bf09671430c58a568bad8f5348b5501a19c6489a380c0d00 +23b474051ff6a27db5f1fa3a4021d3a1e070e2ef48bbdae5af6b82cca31d,0c318372c8f7b3255e31b1852a1cc9e5139fd280a49434b94f125e47d167bbe8,51a5c188805813952176f410645db06448df08248913db743a35774e2bc597be7ad5abcd64587497d8bb12d4509d589bd6125a06c69f66f36a1721d2a51b131c00,5e583a7d1baf629a9d386dcaa9c6e4fe5bcf379e31ef765f0768abfd399d707d046c20681dbf3f4ff9b090e331a5febabee62769bcca2a59a3955f5ee4ff65ef01,f5984c426cb39bd4fa547a50631ddcb49da6662c2b3a5410272b8f74ea5582b164e9a121ee093e9825a4677918143b0c216916795b81c393023c2e7cc38c09e500,9eeef6624fc1e260d9447442b0a3e9bc4979989925a1aabb6060eb8c461a548b2b1ddf1b37029a5a56d283a593ef9db72b3fc70ad706474d1194a1e1ac891dbe00,8a4257ce4ea76ec713b151ddf1674e4ef793a6d464406c3050e1f0c4b227ec9c26678dfc4a2794f0e822f5133c579427b1f6517dbf814a887fcfdf6c0a8f48d501 +2a4a4e58b4fd46bc9e3b32c91f692bd6597ce0d81aa1a6eb7c7467d3eb7b,4248f407bd7228444032dac5e03c209d845cd4ca1e148894ee4927b51a881d8f,183c8b1c0f1925d6a799e1f362d1fe0d4f6f13a86d7069a2df90ac865933362c369d793d7030f780e760a0dc07dfbf865c16ad95e833c243561a54d5f15cf24b00,00e8276a48601cf7f453a36506b80a86f8aae97258642bff8839e9ff6049b523547dbdea50c5b9b8a6c58d8fcc703f3a4288eaa28994d9761d1149b04345368d00,7c97bb397172ee933ceb7bd796d31d3868b93f7fe68e4d6ebe12940b4eada82c419eb49ec6a4500a804bc07c6ad41416dcfcc8d5cd1ff1b1fd03da0d184e5aed01,a3266f5f58438ea323b9ed2f9413a6ddf97cee4a0a3f5b8ca454460ac734e8ff27d978a453215a9ecca535a39f592838430a2ea59c0ec9a34ff0d4263542336b01,e49b9973e70928062942c67b4dae164e243919fedb62c977ea053f42045234dd722a2e06486edd1d4de0f4f3dbceea0a166587ead51ccbf1c557c0f52ec9d57000 +1a3900bb56449d1b155e88a94edaf24a5910be086a41a777d7b25a32ba1163,95602eefcc841eb87be4ce6e562eea0c0160ea8fc6562ea31ff95b2c3f12874c,db6f334106bd68dd5807e5b9cad83bc7c447b4a7242a7eee094ffa9a6ce0b6b62542acfb56bf5964a25ab1799a3df7d8b2db58ea0bce7582d29d8d3c95c7246d01,820c56a54f34ce36ff0f61a995e56234784b79b20c8362e33d51a7559c072ca0136ec40cbc491c048481eed2c3e3c9b6a810511628f5b314c22385a2e636e70901,ac8d3a79b6e7b46ec8b4eec8dd29a64ad4ab9469eb93b154908de5e68601f5856ff3b472fb361cf138c733757a1a946dd3e12ae67de5dfadd5825a89f80356c200,61abc6705b4cdad48d150dd9f712575976f59d921452f2684efc0a992ec9e7ba18f5e66a966eaa4ff776862bc7924bf2b3a64c1d8455ce02a2595726106b9ce501,e5017a6e79defe9cb2ea42e3bd01c9d8ca2294e0b0c4a48f4b990ae5e0afb7df4048a5db53b98b1a919c6d5648e00c5f50de14db7cb7f29fc8a40a949b53834601 +11a92561f17b00f3be5f03b0a316905af2acc743a85fddb957f4936516471b,50c16ef7501a62e9027b8d9b2a7c803ebe340470e2cd3e029bd75d5287d0f533,2a4b057e49c1f57f1cbd68268f9c876e006394265f9a6703e53caf99edabdf0b749c709e367d9acaa92ec24ed62b020433e0cde0d49425503bafb6484af2797f00,bdce78512839bcd9cdfe2def9548a374c1543de0686aa78100db7ff306d606f75f4f83034e99f24d15095f950af204a5ef445daa5d63878a671b6df5f0027b4d00,d042211be3ca13fe86177c14bf6eb021221ffbd36a16a68b68c5361d9e3552fa307eaf2bea9a7d1dfd56c479d6e2e738bac4d4b12e81bdaba4f944bcf1e70b1e00,73d7bdf5d869acc2db5b6053ba1bb69bf07e1df25872bca5270111d1daa37b836d6837dd41ecd5f1ac38767f1a514b6941ec84ec75642c06e0d68271edd505bd00,8be0dac34ef3e50f0ebabc03fc1d681c1f170871355227245e17360c1ba9ccfe0fcea5b4d6a8c9360f33cf71c9a06cc19129106acf59dec4d11f19fd2b4ac09a01 +04aa89ddc46664b8dd5227e629afb6d33b597c8b3e4b65b1d32e42376821c3,88f33c9b46456d91d3c87ac686a543ca4d7a50c939c830d5da27d24a1572b786,5afe2641943f6190aeb8ae677b6dd444010fc414e229bdd134af72eb45fdb82c5d9129d4877d0c1ee047f927e1e91007d5fb63c8de847d31442ccf55f7bf435700,e7f5395501d4f92facdd035984bfba6e869a7f18cab14c038608a9b63d160b1371c59dfa6812771c342ebeb70beb11fe00de5d3fcba1681cf153c6f96035c4e600,5c0f1b326c05c6070fd83290bdfdd28e2b125ec0b66be1cb6a01dce9b914364d7ad9b0ca45444ba453cbc60ce355dc2f71c6a5bf5b5dd5b55dd5e708e592413a00,8f22317a499975fde031c8237cd3262a7d9ce3ae2819ce57411e9eb97d6c895966f0273b618179ab794f45092f50dec71d56a33597ecd5b885473a0ff55e208b01,3be66fb80b330f54fe1723abd63504ad50e36d6f7d30f59c9025034eeacc5efa702daa2f1f91baa20cbe61da61842b7f4a7feb2b93f77805e31c59bbfb0bb09000 +015287c0b3967e8ee173b0d37dfe67f284b38076326611882bc70adf3fdb0a,1053f0b240b929ce84c0c5f694d610cacadc7e338dab999ad947015859a5a11f,85b8825d375674386838c876b7c3e7cfbcd970f3722bd240cb5856b18d0cfbb6383a0ea18b34fa00bbfe7eb40817efb14fcc96fb1f8286907847368d0a4e964800,1e4a33e53c43b697ca22701421a8c90a7a0bd0670d36b1c439a400eaf894c54811744f281dfd308716d13658c6bf1112caf2f84a3aeaae2d7ab8dd3ee0139b4e01,8305e9a87251c64d8ac6399e2cbfb285241a3abb30fe81cb6ef35b269a4f38dc5ae8ed6245ec1b54a23a15369a6ef75b2e37d8cf2e1c706e7e20ec032550bae600,9c8bbf59749096265a57e07fdf7e50950e243d43f27e98ff06da9155003ecf5d6d9873a6e38ae3e863790aef862fd9db6dd45ef4f448ed94ac903ce8d54df9aa00,783e04951f33a32c52610ddc98c5e0423323634fa9f896e46293bccd1b78e909378fb07f7a8f63a4f09cfa915c6cdaefae52e8fad64ab7e373650c2807a08d2101 +f28a5075368df80c83f46e362337de9c72b31f0b9f6778981429ec57251a29,f4b5c90bfcc7d1ddbd5172acc5c632e4c1d0bc357b5e70607e6b54ed646c53f4,660bd1946102bd3d755f9ccef908430b0800d58da3ac319027061e235866acb50c5601a1c575af3b34e9adb81fd3e0a7b0570e0256c379b9a3f7ff2a0f9e1f8a00,22f3d0efe5fb9c42559f8ecedea5ef80fb78e4b944110a6e8e1361cdc9859f0f0fc9cd341fc90b225d5835e05ebf2bddd27f52d4c80676ef03d37708e4b26ba901,3afd3da1e171dc9579e58e7b142da8fa5fe1886b656fbb1be0d81ef74fd6b5e5718f9f3b5a4afb32e11d7193ab2aeea8fafd7093cbbee485f0bbb19d5f870c7a01,8e333a756c890f7237d027ea0c897571493e86c2f4040cc67207fad51d0606ce612bcaebe24c6ba6c1a291f86cd940dd22e022ad5a7ee413c0b763ee73817fa201,fddeb36770672668b4c8e3b5d92e32ae3f39e0f8233aa3eac2f5a1605a01478b0ab0ede8ecb26d11f017872fe13d420789eed456d6227b598432c28132c2f02b00 +e959beb2845170c402a09462b54e5e997f1e8df8c0bd933339e689970ef1a1,00aaea9fb4373e68ab21157e43d1b2cee08f87c63298a80bbff7fbe2b7b94105,d3a9e475bff59262f8a89259cfc7f22d0f67ced6f38585cd42c9152d022f882e47f06dc3d928b4e9e43a23411f8ad6715fed156771cd5b6f4d564e13869b16e601,b802c41bb24e50e5acff58e64a17b6ced067f23fd117d4a4a3f53687a6193010766b44b495528eeb4874efd79f1b3c3d5b6d3b69643d6cb9f6505da0aa3e834600,aab970e3e60734e427da78fc3434130c8aacf1536120e71fd3443863ee108b3e37da93c387c14a914ad3c5b1aac14673841b1bd1043f79aa2195dd049734913101,55dd846e90597a92f116998206d67c6c9ac8a96da3a071ba3c272042db212ef514b545a9dfb9e3f978a64d3119ed375bd99cfacd1d2c3bd9554d2a2d12aed8b100,374c5499b08d490a1ad3e172ab3af1ad62578be37005823b0640b2655f4c620f55386539edb48fa62cf90d5e7e4c666cda849f358cd125b4aaafe783a38f7f8f01 +8db11c47164e17cef5c917ab35b30bd606e5413ad9797d56badea883a418c7,a46f44b7750f39faae061c4b1145d1d98bc31ef24d52d81e76308997100e059e,518fc54e13d0551c4e276cbcccd885851d1b4372fe7745c3138594de0a9ecd233d376e05105fc18e495e752fd5b57d1067731feee5c7c46a4ee1f6b34ffb165201,acd013ed9398c1d0ea2f347adfaf49df9e6c3fc9f0123f6822ab0c54c6f668650f54483b74446e52a09c97903c02af676a03a94dea6e38c330e0f62a2527c8bf00,9b54128a8c757d7dbd587f8d096fb7e584921ea3761beb34d0e26435393d680871e6485b51666d9483b3608c33fc0aa447fe616487046c6cff4413839d21305f00,19a12081bb11d463c47a0135e94642ef4860ccfedc3ec2b4096585a87f48b712782e0c3e0a6723e0f21b80acc569db62fc8bb7042b4f43628b578c66b8e17c1501,599950e4a09c6d4d0265c8d0f6c58e06a20474ade8ec5ddd1e0888fc8d5fd5166d10b0c98033037dd73e58994c90302a8a73a27a61b65ac6f2db556bd618b41800 +72fd82c884a5cd5a90fa7f0962fa0de0e1a1a523f7dddcdd0412b9b9df1488,7f65fbf09316c318837a61257e9a086b7c8dd7985710a4b9e5660ab403a85713,27e60c3140c045879dda7ba2c4de0e7780d7c5a96fabfce141865db3fd414dde2b5327f135550c4f4c1b25800a7d7a00fde8a7a198f0ee82f5c4fe4a8eb9b1d701,4a2071b8cdefb094ed1a9c3ba69b301725f568858e3a1ff1ab25025d2de3461c41cdb37afa6650ae5aa2288e80eca7da65b077131a73ae84d65a01a239d1b92e00,55fc46ad556bd815541c93bf5ee1c40c81e0cdf4672687655fc409d25285b51f716076d631dbf952ce64330af7a14d37622706cc297582c61c313c2f89c1932d00,c45e567ed103511923394201b50e63319d61e643b4f4de070074fa5c4a325c8e7913023026ac807e09afb17656e0c6f3465cca01c394808f7826f17f7a92c1c800,ba998cfbe7af05267b7181e8c25da680c64a4a98f599a17b68807d4cb36f6b9c5b4f7fa31949a630c29dafac1f592acc0471482c76a1b5c601a75ab53b841cf100 +d66cb78e1ac22f3d45a2a75f8ce392e3290473c10aa96c399465a5fdcba71e,4de4849636803b46ffe9300c0574f8c75f60f4a3f96d1cf10a25b0b9d0d155dd,25c002b6471d3998674381ba64e849196de17bf9ae801e35f5d52dfb3906c98e7de7e989e364a8822159f8038eb67006006ac676e8e864d87ddd5998ec57f0c801,42d8607f79c70f928b6545336a8d374a04693159674ce37edb95eef08c4c0f211f51e8e2916bec6609e44d4dd7f838bd4d7794f25c5077f430658c9579efee2200,de2730617698d4640ec535d1c6211f3955b4f04cbf9a397883f48a12f523445c1b5dbafd3c3f8e2b540289298c2902fb2edc2809953c57e53fa1101433019e0501,bb2a1cb41e76e9aca06823c13df99f8675a387a98678f6fb989a68d69694bd4d1cee5afe52a31f59762d2b4ffa27dfb2d1fdf4e73ced8ed426393e0844dee8b600,99467ebea78dbe39a739e09ef11e90d7ee20af1635203199a9fa1d9a3ae74c7912daabd3734bd280eb2f9d126f8ae7139be1eea8b3b358bbcd63d6a20ce3dfb601 +fc44c09fb63f468c92d9d35c2cad58d29dadedf14b358fba9bc75578c1117f,7e0e2732f45719488d2a853b30c01dbef0e791a67c4c086951e5a8d58fc29f81,de81732691d0a98b3f784e3686a7ad6bdd63ed54cae0024f0bf6ae5787871fc71b307f1ec0e65e9d575889d2cf16579a7158b55d8b6f52b558d8bc9343165b4a01,b74afebaa510aadddc5b75d57b6f396bca5883d86a619dba053abfd9e69d7a62231a322d935056a9f1268c6f6ec619bf8a2be8f0b8d4a717c23928b7ad8017c300,dcddb5e8b078125d19b8026611c7d09a9d2369fb002b635642caa84bc9ff67834374aa7b8f8b5feac2249b8c5b52149b77b4a36c0afc81395e6757952201aacc00,1330b65f9ff9e8acdeeb78d4e1faeeb0f39457c1df94e6c93eab991668f15c772f839fb618c6fd23a459e51c02c2675aebccc528664559acbc707f0ddd857ca900,2f2bf947a7fc1fc788a5d0d08a1d8321c1b0cd217147a607f99ea41cd0bb696f2ac29d5916728e4a64c8473b0fd2ef1f7c3f38b664a1ff3b44952a6067f8fa3601 +6e91a82a91cdd4bec30d8f4e0b426c24e366116e2c494b050ee6589c8c4c395d,4db5eb15c7a159e176711bbdb3fb85ce01e5e246c91103f44847c8aa5f83d840,8204aa46c3a3ef714bfa660b352b30728c89744647853a7f5d9069342e95251308bb381d162e19d375b8000d40c7274af1f77e9f95477851fcd4f423690d817a00,2238b3b8ac85af2c74ac3b3d08d372744b064a9ca02b0423fd7e37c40f7c2f524987b9d67800bd72e1bbb78ff231242551286cccf0282b4556b5a581a5f9070301,d2a4bc598b273205e507c4fb6ceda99077f9a380a3a4008a505b62f44e4dc5200c2ae412a979ddbf8315e58398bf0765924f2cfb52023c58105403938ae302f201,61ddbb55547361fec81082c97d907d601af3f7e7c085c88131680143160033d76f036ad1bad48cac7d105a0fe6a2c586b6d5cffaaef6710b26bd63314b225e1f01,83514d0e45eb7c2823394fe38f39ad7479dfc37510466cea75639e63400dd19d789750e91bf4dd46186591d0cea13abc0d9b889f3dd0f8d75487ce7e955809d801 +586e40ed92389b95f8ffe69358a009e3a641bd1cc47b81fe8b3a689dedb31869,f0347ccba310334ece25eca01580aa6982f5bfe336ef5a704af8a8a5c6118ac0,a81555c38e8c054842cd30c4162ff9d38d508bccbbad0042c558b75d8f25d2f64b672f5f46e45ae881690a6d3629f83d3430305792221ab269e310f6de33201900,7a7b3f897596124bf7b8d1422285515f660670e12979fd10756f4c93a70822590035aff3149dd838181c62190589cfd822012d76060f4f4698d63a514ca24ce201,a08746bab3f7c384ef605eeab1f4a8728db67a8ff98b4c99e55b4a9ea76b4a466a4664b0caf5615c62203bcdfd5fae8ed5bd357208d8156193b6fa8a983fa54601,acac0a2dd7afa8585bd49e8a6e06b3fad5a12fd7a76b81020405486dd4dc560d144296f40652df59e03ac732e000d1b39cfec1412d643895d1d7388db93a84f300,c35b750c3be2ba6dc5a3dac0f41c55f67f854c3517215fe6ca95142b5bab9b1c5baf192f3605e1446389e989e6ec4a26563cd1a0fdae0a296cbb8f1644e1cd8300 +34ab64e4381fa83090a8387f9b5679dd35272423ddde5aee4ddb352dd6074151,0bd0f90ce67fe1064984b2997ecde26ca1e3e8481dfda45f9933b6027b55ce4b,e56b41cddce99b696707f91b8280a49460eb6542b3165cca16a192dcd96bdb00795f99b6a823bf7ae261abf5bde6d6feeda56aa99685d8077bfafc6b0c4bca8501,47029682100b138de0975a313fe7cd47a61815b9d598c999263078b0ee2b58745aa4b4939c37989afeca17a563f6be4de2f423eb0f5b34ff01019fbea42b032301,17d9ce28f5b405556cbcfd04247027b055701988a52b8be8b4e768efa1b5ced318941977e481543528eeb2824a65f0e202095e824cceee38d37cc3ead5f135e601,9c92fe34ac36d725616681a3b64e7143d5ca53444a376c1a2cd32ee87fe6881d69633a8b0b7a24d588dfec5e974fdf7c7c96a9f08f6229b440a48def8ea383a101,9163d017f382ad2ef5dddd7995875fef531e830c63238558b20aeadc6595219f6888d9c1b540c38f79a12c46e0b422d10fc876de0a2f4e6b13ca426fd61b69bc01 +fe6c73a4062895a30815a73628c764c4804a687d707884c854f7039ec8d5421f,d2a7ef07295e58ccff9a004da70ddccadcf64392def159ee3de97da4a46d8a98,7154963a7bc3342db7a350641a85c626bed0221de4b520894bc3bf12a3d6caff2bf311405344fa8f4e939f7dc225aba639beab19c16cbfd4964cdbad1e1a0da101,b3ad01866484f636e745636e2a8f8dded162a83784dd9bc7626c7f6e8100c28c43825f3cd13b28a65e402a77bd7b30b7026ddc92938b507fd4893e99e17318c401,f6c59ec8f03a81efc07e0e5988c8b72140009ed8add8d39fada6c1c7a479a5cc7448d59ee8dd6ac179c5aa58d3ba6068357e328e4e9fea19967bbf4b456f9c4e01,5b7f95fca38cd0979edb5cf2a4a73c0cc197aeb30a24bee10484a31fad074f4b10796eae75b7c38af4051cd0de928173ec9e5cde8e66f73486a4f7646557add601,4d29fcb1f00f91a702b5ddab809d94737bf6ed982851bb72a7693bd9e4e6850579e79fa38b9c8b9a203d44119b26b3ca68a4e96d8ee556b520b1d1cbcef5f30f01 +18fa76dad3993595eaaeb6806e0b3affad96ecb98255abe448bdeffa0c4b4680,3c87514800105b59d35aed97285ed90a61c070ffec295893f966658bc980c056,ad14acc2656657423910bbc9cca924d1c5716b5f30b730cf0639eb479d0abda820b588a16e5ef7d1dc58afd726ae5801e39d9eb2401a9c1c0bfeddf88e3ea7ec00,ba78044bab09cda8d6892d04a65d47c32053e582bf415fae91d9545fe181e18a6c3cd03e62db96765d1ba627667e78c8c53076bb1d0d8e4266a21983d62c18bd01,04ae3e723bf8e3c04b92024ab1cbdeed7445a0f12491166ea4b0b8b84ae19e8d4d1ee39e35e00231f248fae77acc32ad8e76fcf9b6fea3c16504ff09972acd3f01,df1ca0cdbb4b00024ef25a525bdfa7f44cdb80781133175261360d39e3d18449103f0fa4bfc7da6f22da1ff490dc4bb754557c6628170e94e8fe98f9eadc4f9301,f14e357527adf64af8938ca00a854155c90f66b75603e0753dc8c4b19d7d55a10284196453f00b19c4100a24474920a55fa60b38165ef0529973e4f6d175c43b00 +0629d956c7fa7f4df21b0673e770a933518f3ea9ddce7b5914c71481fae26aa0,de875736951b405692a5a458619c02e370c2d3b51b8a2d3af69805604e33cacc,b0d9442544f0a8c641d33dea68522ba52a87e7efe32d64fa01418ba7717cd2d7578bdefeddd21d4d9847250a72189013f24e41f7416a10463bbc31597668b51401,0205db094f7b0e649777c6bedf9e985f00f808346a4c4f88e2fda4fc3e2b45be1aef049648ee34f5a8d64acb3a12c0c7e56bfb0d2cff849716daa088576ae20e01,590a6b37f4dd803c6127fd513fbcc2ced5a84bca612f477f6797f602df0ac93d5a7747eb7d913d3acf5da9b59365e445687099c6579f5192f80d4614c1fd6a4800,cc6e0a218d031b16129c35e057761901fda07ccf7e70232d4124b29d60b3ad827aa51c0c910da88e6a0a896c2ed4710b123bdcacf3c7a14979c65eed9374de0900,150dfc6a561f155481ad97e0c7fa3d0d2cc59c55efae87f052b1fb942980e6be76eaba470ec67c58d45c2a32eccbba2233388c6fe5cca601f15aa40540d57b0500 +7facad90cbff6758c8f21354260b7f7fa4df959b45c59bfc65a8765cdf9c65e9,bde6e53a46873012c129649e4315aed64b1aa06b7b424d29e51f5a86cba5ca89,c65a25794577a6b26873798d2ff047f688d7fe46593f225fc99d352971a0d4350155e06a5373499db71421b733676bba2aacae732d3c78252daaa9e1c857098b00,9434891599ed92782432c2c863ba17a1ef970ae2e152d737164f1d9e1d0a4841616b3bcb00d044d801fec30dff24cf33180fd0132752c38949943a23960b733000,79720b89f89fab25d58b30818a4928c8ec0be1df46ef7cbc2a80bf21c9127c237c5997581c543e2f0ab6162d65db5a05fcd5341a12b1a31ca5ae623a9c202b2700,745aade11d0b9bd3437b9fae447a827fa88bdf83ef48dd01c84be14a992c47d00bdf4874e640fd7b5ccb60da0fad42344e969728c28b5482ffbe51f2284d318300,7df35c8237ece00a6d289b13c7eff69523eb55adee63fdf1cfcff97220d3696811198934d6b6b01a0b28b3d91307db785e38e26f97e1b9eb1fab816a2292cda001 +7d94ea93375b39fb9b5728fd31099cd7f20f62d64ab53bdc268f852a99ab4701,06543f8a5ec44a418676e5f887007aef03d31850b4df5100b287f3ffc1d96230,e4bfe94c60b454000cb4fdecfdb5874fb9d0ab7f9c71aa734911a3ba5e707cb36e5bf09adb1cefeb8eafe0eae4ce6f668407f318a93015a2abaa6e21676dd6fa00,1929aa8521761a87a295dea15229c38a45bd49f9285c7964481edd5ed3abfd792b733eb29dab67a7119f1d9190de002bdcfa75c687a5d5cf98cd125faed028cc00,b282faf1191665b498d87d21977024c07b090c6465523ad51f915ba3ceb4fd46250b8ff3ad97cf35e0beeeca02048085638370f1d8707a022c9ddc9d377625ad01,73c6ac88bfbab23f04d7d974baf0c3a1f4781f6500462147268f848a6f4e8aec6a101ecd703a1e1c48eaad81b4c47711fe936c0f1893f8e2356f19bf78bd1dbf01,c6773e035378a9adc1473f74a5b3b9d8c955f887c24dc9de338954e5e7846280621b01875689fc58b09bf1ce9391c24b3282ec313a69a04752b6a7760f03793700 +bed39bf2432a92244942dc7bc650566ca6c2a1c2a14da528e2cf78275c4a9518,289b2648739cfc5c7af6e327c343a238817970beb7e4a45e6e66868148f586cc,9892aff2cdac56794a56fb61ad17a36169677bafade0d0ab09568827c892293d512c82dcfc55fb7061c91c498859f4b55888f27f8e81a393e6663ecf6784ff7600,1238ff37b5feb63a7e92ea4183996acd52f968de2194ca2710e1eae8785bf4113bcf48013fc85f09e959e0accdea504e2322f81df626981f0e8e3fa530085a1f01,90debff62df0054c8826072edba2c66facbba7be06264df5353e6993425a1b6c4a605c59ae2809e0ff38fad83bcc374bfc868326ccfbea1dc534deb11917cf9f01,1463be67727dabfc318a91589e4d8826944ae9ec1a01938960e397e73b8cf085597d19866f349f100c6f4354a5b04dcde7a2903f906c1f0bd4ec1e474b30dd0600,669382a92edf21e0f282daecb722c147a32df9e2451b996af0a1fc12ea675c1f374d43d3fe3f0487bb0a909d099583e341c4792512845aa3047780c42e103d0d01 +64bb4f745ee0a052c2dc3601d9d72afbe3e1d1d5dba449926ba7f9d14615da4a,de7bd01cc80ad9d3ef6ef48b0995bf2ef96fbc50c24911c78fbbabae96d05744,27ecee3a3679d7c75f81693acfa0c5b4a34ccaa3ff7d1acaad7a4e31a688ef473a88ecd92eb4a0598ea8131dfe8897e00766ea985d43cac229746c3478e1086e00,74c4d30644f7e1c0416f7698af3ac0dd31f8c9c19c51de3b75d7bbad9465e4513e7a21053c792084f98aa78f0c0fcdfd5b2276321fe2f9d23f78122e7afc1a1c01,597588930874fb1903e087d3356ed35025833a6f75e1ba335e742c19c376362f60ba980dd858ea1cfc8bbf15d1a7f75ed20fcd82559ba69f12077b8a8f601df700,578af4f3c59350c2d3ec8cacf130a01780c6847c2c932dd2adb41deb79c69d124a812766e94faae528a77076f41b363127e67e734caac5289e239ee172dae1c301,53f775628b874874832826804a5405fa48d44c88fb15c7ece306d687043768861ebef754fbca9c2c1c0a242e2727a6e564b415fd0bfec0627bdcec3b82822ad501 +09d3a7cd23a1666e61af1f1a488eeda875ed4b5546567f2fa5d4625adf3199d91a,2d4dc7ced28a1060664882fb04477341b664589fe82870b015e121ebd8788d79,f3f94486f54752496887ef8c84d9d000e4631f337c24a44bc391b874dda5e03518dcc466f879c49c5625f58ccd6922d219852aa352e54fdc4248906bf05d898b01,0a3ba9865dabb24510a1987f1f6c3e420f0faa62fed268afd21059319aa323d67e2a0a11d0a42a8037e32fc372726502e495de489c245317260cf35e3a0e6c9800,0eeef6324bc99db6fffebc4e25ccf612b5d114c322ca37af67764952a35215d602316ee741f4593dedb1585f137bf37a98c50c167185a0181d14fc069c94424700,5ca275ec648724e7aecaa9aae73d62fee453bc211d1153ef008ef7f0f83c67ee5b8e8d6b82e9b66c58f2d6f601769fcf7147270bd70c9eb320dd03871fa007af00,622beb94bedda33f73136c5cef1af5c41c5661901d5273e12b1cd1499ca6487245642107298d9a056f707fd317ce7c8636175edaf261b81ca4381a79b034093801 +d560f179fe94d7c4739d1e3713776ddb31623f666f836f702135ddac49556e09a4,7a29115bdb44fec544fe3376ff91c7be4a063c7b8d79ca6296da25bcd7756711,12ba54cac571f8317a112972ce2c6971eb90fb4b7fd0d8078ce9954b127a5a8f7c20dfc0d5f305fd706d61a1884b1e64382c228d332b130811c2f66f5f513bd801,c2c9d716ef30cef8717e06ff4c85e2612a3f5a3e05c2bbd92111feaa9feac1295255d3787f09eda574818011b2667f2a955998a94b9f154b446ca854a60041b501,0df91c16e1ac53ce4dd78a3d9b27debac4b6a00407d6fdac12c201d94087bb27170e5a331911b0772d405d4de7e7d8f138c5bbead8f779ba67987206375506fb01,e06f25b53bc47fb2d3e03d17c8bf8b7434a03f3840748289b386a074eed5d952230781f5961fc4a4ee1c633cddc0315c0a543d705209395d8939808a0b53713a00,432bd7126529f8212c7d68c7651fb7d507c54c230747f99d30c5bef1299092b776dce4a10a647d6649def5526c22c55f1b970b969ee44501f2aca7eb191cbe2f00 +9ec5ed17f5cf47a8a3b4fc5cf56812094d51996f05675b601ea4b4b820ded932d9,fa84ec9422e8146ccd9b9f502254690acae502a73e681327c89c7d1183e6e9ad,c4aec1c593e52a2340f1f9384a506af198338db080f79f5ab691284117628e6d60d6bd1a236bfddb267a8121f53474b5be08d331e0ba70a5178cabd584c741d000,62366ceccd33671eb8f0c1879dea6eed5ece36e5cb2d47c2fc28523fbebec6c46394ded6c0238866a8bf3cb719b8f038993e0a13d5b298d035d94e8515c389d101,04f7c4e5dc3a9b7d098cf255c9825ecbd29b4d0f37d18b84a7d490362064825233586e8aaa0adc898973811b9373a160074bb310897f287960187d2cd4efce9700,1e8888c22d762325b8a571d326e1b4d3464af8e0fb2e87c55e3aad794b8598d727c4a2a5d67ef6ed9b38c7522a584d36553a7fd161c3966e7b38788a03f2203800,13c260516ea1c90f214958c21bd590d2b43f5886c13bfdf5a68198ed046f9c660c80c9f9cf1f0a052b48d4bac6f748cfcf1020c81b90427e127516687527838700 +d6a743a491c3a810e9f683cab82053081481433bfaafa5517ee2a42b4495c0619b,6c1646e462ef609db1d01349331545b10aafd079a815be89bd06da15e9ee37b6,6b9963563033bf6b17453c005c746d66079e6d92c0e8137072fa18e063f9ccdb0759354f95c224ab3e9520aa2d63721858a72ec273aaf804a732b90a2366f71500,d755eac44c744afb2e68a91d92bf6dfccdf24e11ee70d034af7eeaa66874ab9a0f8172e68e6c5432e68c871fe70e2a051eb8243fa05d2fce4ffe2e05996b809600,fac8ded7232143b1abf636379b1f5b51e8e5dc805be596c31046ad17ba5974651156a60ef2b711b8033f9ab31e7121c6e9124965ed04b28a9d0c631c6478c4ee00,6ab659a5af6e758620ed450e9a25d95b447024ed49bc83f7e1d2a17e2c739a8931df1a52caa1f4e6997fa8f83681d956e075d81dc8f54ea4904ff6287cd0572b01,40f1277b6edac834e30e0ed1c558a49e476aa050e7e078f2cffc1a2471804fb333bb767b2b9c962a68644ff553791499f942adbc8bc6c2520280e2a1e081efb501 +4ce48c9a634bd1ddcdee0f610b583cffff27b8b5a932889ab59eaf462ceedb9a8e,1c898678a0dc8fb1c3725b39f94dfb88ecb16ad4001c2e3f8e8ca79caca2b87f,0ae19905fbc76014cfff3dfa08116c0e62b7aa10b7ef657c1e1fbd919c4d238e044ec3945a197d90c02dacc5fa816d292c619d2e0fc84e06f4f7a7e59b6c6af201,ed01f175ed97a5fe22bca797301443670685f9a1783f5a641a90dcebaa7e047e4513807075642f5a63b74a7c19cf4c25140132ce3dd0904d1a3ae9ae69796eca00,72fe212c27e2652a2f76c65d2f7786eb72522bf6a5bca82491ca94504c55febf22f59c10ae8b46ce82e5188c70b144733d1183d0cdd5ca06453014a6c2e0aa8f01,f89af830bf060d7eaa7196b19a89a079016147fa3bb21fef61694529e4ff999321ea8597c88f05ac67155efe989a6ddd972b60f0e913e4b66586ae060edfb92400,5867c3ddec2025283bc75c6cf13b0f81fa2399d69247e11d3335504016835180198a0b9d9edd1413626081fea9b0bd3562b884bc49d7bf44a05bcdf4083d495d01 +0896da9bcb5822414adefa566a8fe97c8abbaf896ef965d04a9e332d043a08376d,ef82fc6564f8e0e90ece2e97cc1cee14b1bbe878cd4ffed4cc99152343a7cc6c,d86185def8535a200b504f7d306139a76b8ce79cfed26d8ee64c53db043c77c11d8b9355f7fb163bc73b2784ef2692bf3d3c570482d9cedee56197cf6d4e70d701,8957b4a1ddf43b6eb9d60bce82f7fd3c73855cbc2881e2b31172219983ec9dfd30bf657a570699bbaee6b64de0007c5606cb9e1b67034cc56da2bb81b1a890a901,3d5b83c4f6a9c21b187d68998c1f0d01128f63a369b847123bb8fc0dfb4d37ab27ef5942858dc2a3c498e41466867c8857b89c250ad4cd220e22f3e0b073af4200,0d76c47a9bee41de35e5311cfafbdb4202e5fcfa11f1783d845de2e6b5281522498afaff4e9419b8c96b5561f51ca0039da4e1bd6d7d9e309331608ad4c016b401,f70f2f3eb6ce600ff5480cb655738a3215b13f37202313db990bee1cd0beacd768ba25d5c3146ea8bf6a09df65e025009a7ecd70d5da7a061339b9b1ac2acfcb01 +8ffcf48c416c1cd6c1ca6142aef6d3c62b3eebf9ac971996ba6cc4246b6ecde594,1fcdaa82bda67d7ce6f833c750d155bdd9ec5b37c60dc81acd5e37d88e069a23,737aacd0c9490a2f3dc8da9c4ea1d94ea479d92bfc0b7ae97fc17ed496cb6dd20932b143c0ad466314ecf91b5ccd6c261886ba282d69a963e8cafbfe4626b3a001,beb60e6c5280e0f28565966fd91d928a5eab7b21ea2e37e3671b921772fabb91469ef44f13807f1095e6d201f9f5b27b1582013d25749a8cd2995f88fa4fef1c01,f200c7247932fb2774bfe9c7b9ab9d22461435ea28c57afc2acb6cdcacf152c132e53a4c7e859fce0e581fd0e404339ec61e862124456b1fe5f82472b4aa49ac01,c3084596f6cc579fe48071093fa7db194309b9f98535120c65691dbbbf66ca734b5d1f5cbca5a292dff88b7762c6e18e89a29d847d7927aac2ea8b664b3b4ed900,a7518ed3dc9ab16e61a659c6800ad0aeaa2837d9d071be6276d9d323f0905ba946346b6813fed1fc9009fd3d5c481b7051284b348c9257572e9a4d22297e55c500 +d4d6492951e892a99d454b8cb3f054df4e87f960bca13d845789e1888bd351c6b6,013c33d5780319e250eb028550a3e177a17be56df107c3d01dfc26fd96f6d1f5,db7f6b0c72c4a637951cefa13628ecdc14d1d250eb377dccef575e1a2684c6443214a09b362041752ff261bb3fcd9a8a8e525cca25374b38f1c4f6835522b21b00,9dbb94f4dda307978d95627a33482e327207a73ba74d971b0ad696dd1b960f805898f8bd9a909ce85c5b8875ddda40a7f7703cc54c98d0c0b2d6444fbfea07ee01,3f196284075dbd0b38bd9dab8a2fba474add368760679136405bb48a53c6435d7400a320c4b3bff7422b4de74a8afec5a1b43b3c339e665e321c1870fc2082b500,f249b98d31267e6b328904de73233797957341d13d11014253753df90358ed523f9072222e5bb810c6d7e0ad02617761eaea272cad3cf7a64fe578eb4122160d01,f8f39b2b8231d1a15e918f28be9ee12b5ec0c182766119c34c27062d8d16923102533e894ee9df88cb7c0a12841d710b7af5f7ffbc23cf4eb597b3a470659fef01 +88b039ffc9908bcc6aa99632c4f7c2c24869307d767bf2be3d222479ab7131016a,1b87d43cbafbe9b4c9e6a0ae3ab5b6ea9e34ebfb9f2dc1b8a72a93b69b6b9fc4,e40c5db39410e0a96e4136abc351dd6e40a72771c524ace06c73fa968b1c20eb11ebca51b1d226a2ead88d5643c144cd32a084b362d017bab2681a13e45b257f01,c988928a410b773aa996e9eb9944eafdae5b9bf6b07510de0d45e7fe15be38fd5d4f6ea5a64932051bd3ac658f9e0b1dca9ce86f51d268eca879c1eb2f7278f700,a2e040167e00c464877b8854769bc82053eb04cf0482376301c78c47585410266178d8e96cb6d67b1bc984592cd2ba910423aa0e1db63c6cf60cc5a681caad8800,7ebef7724637af24120925a96faa17f76435aa01f66e7a3082290311d0fbec123ef8426190f2d82659b8bc1487caf45b1beb268896bbf731fbc04bbac0edf41801,6df1e7a5d21a7eba77af320ea0c7af4c5a7132806ef290a4aa71cd8631a84d39290b552348fd82d7ad55a65375a41e91f3ed16f6f6be6b725bc85705d454ebe400 +9982ad211b5ed0bcf0eba8e455d2154426ce5494594c3b195784d43ef18ec0f665,98f444a44939392f8e1e0641fedb1ece9993c864c43a4a842e9359bbddd22fa1,96688fc1d44f829686081c3a0c9f74540e1ce35bba16c6e1ff49f56401f7a9fe6a960183be7d0b9f7c43f5cc1a04300a5387b2fa656f1baf472d96a62cc5a81401,09dbe7e6e172c159df06d0240467736f902e9bd0ec447eacfe01079baac05d5a0f4bbcc4e64118563810175423f6b867ed0f0f98139ae7f896ef8fb66da8b90f00,cff8ccb922a9137d27466e644939a547c2e67816844d27a04d114bfbe86a4997181b3d7d1c6d387a34d1dceceef531f1f9ac8f3319f65b0166e198d8f69788f901,54cc4da75354d39a29c5946360c20a5795e3d805f7e829e32d2eecd9ac4d586c51b9992c74c1a4aa2861eceb81d7f160091f6af67a879f6ea0561998e14eed4f01,792cdb2b11aa9f67c6b9ee81b473ca3bca79f4ea4afe9c15f14703bc52fd441c4a2761220449050bb1b0cd74040d1808e7ac8df3474810e74c54006f54132a5400 +cd7a9c789821b0d8d7367780040fa4963ff6e3104f6519e347ab66eb11055b42dae2,8e3cb05f67f7b571d6a26ad99e6e7557bfd79560ff60b90660401d8f1c33fa5f,7e4dce888f75720e044e020dc1c4a20ae0ccc1cec4e7e560c81f36b43bc862ff62893ec53f60b4310ec1c69b4505b694acaa0d3f907ec2a77bca5b3dc1ccf7c201,ded257f42d0e393317973a2db1e20e0aeb65ebd7c4ef9b04a2d7de461244453e0bf5ecf0c91138d62a3ffd971b5fb2a11df77ff1437a1c55ce8a78319845fd8801,92e8ade4d6fa21a9c189a3f88e10277b0b3e23826002d6bceb091d3eba2b419f782bd2988d2c6d5943c494773ae98282b883d00f002e35253299172d7be707b101,c16133930536a849497197e14b38b290a47c94bf00f423994b29a89b1d27e1aa49e455e8bf6cdbf93cf3b570d5bd24f22c3014b435c8521bf752393d8caa42ef00,4150de32af9e7390176ad9e8de776dc036b6976f5e414dcdfcc1429573fd8245058ed4fc7fa93fafca533725eb6a9f224154fccacad4c18bdcfbb31ae14e188100 +471020b0e98504177a6b0ff45c511c0caaf9424e233bbc1a432423ed21bfc4c5eb7f,6ebbe6d9a8365ef79d27435bbaea0580df2d91643d94735bae101b882bd779cf,02b1e0aa9ecdef2c7741d25e92161c09b068feba7a7379dc7fecede3af424332421046ce2f0810b999c3cf6de0c9c7271b4a1fb2d95ed0e91b4b218193e8db1001,c8506ff3692f9b4209213f1fe5f3ae0ca03efa09163621e167bcca3d7f233b4a7d59fdf5da5625873eadace29ce362003ef331701620e63c13064ca855cc516000,611cbf042cbf190fdf8105b8526678e4a18fcdc19b91ff7bf1231d60612d6ca935521f522d366838e7e3c9952edb50775676e5f92e3f2ae4ec079b169c10733000,f71ac227bea7852016a9b6049ba1331e489fdf16c46dc5d6f159df3a5b54506564efa732ce4c6db0e340ceddae96a2016035dba5cc0d2615506947a553e45f1700,2758fca7dac0fe89a5e1a21d89fba6f31f3f5e72a822efce7c7d1ae4d8c455e026bc6c49945d25c6c8f2ee94c6f36d2970d57f2495a5ae27683055e1b3df45c300 +5bb524a627bea20e8868a952e0201ae8a0727cb8ca21315fb82215433007da8e7f8a,cd8c04ddafab064029ce155aafb13a42e81f7ae242782b1a61746158052d9f0f,e6a5881560ff45bb6c01897d908694d2a684dc3d3e6db1bdbf3b2b0449411c6f6deb7f1eb3b37fd13881ff81890d53e7b0da05d00df7975321e8f9b38a0cd0f801,b3cd8d53fb68117d00165a00c7d59369ca640e541dcff668572f0da7a0f7bd442347787ac4f0006b46a4f626d66643c235083efb79dfaa86e194af27b5f7015b00,3e3ed7ed95f776ff644e619933ec2d460218c50d803c54ff61a5af7b5a21ade814989524b2916a54707e0a40a96a3f11c517b28d83fcb541a2d31d41f78d21fc00,24ebb47bde8ffed422282f65b5e062e3037da1b2dbedb688aa2555c89b9cae89639945740bd242754afbd2016b272e9b90bdba36ad92ddb078836cc0c49773c700,978ed0e7b68f91e1438ae73320f9cb3806bdcd3929ca74ffda54ebd09ed0516059f6e6b4df36e22541432d2381c4f38047ab8f85c47da7b0af77a5fe938ba07301 +debd9ca3d3f78071399f076d9b8ec3d73e341f51d14abfbd041ea644a2f6eb3b0176,d3c55db7417cd8db918c24d1061040495fe35a6ef459f0294621a8951d10b21a,431a47a96d32ad9e71bd8d31d997f27528c3467ce040d1b7d814c57e014b4be84f39eedaf2ba5790b9bf978aa30c31a95fcc8052e9841ad5918c2f6bd6c338b400,2a33b93465bdbce698128429e6117df7660ee8d3716d08252b6eac984451782d49210c3d09eb22a1c30f6f6ebc4f12bd57ea4a4aa1a7a12294569ebbfc30748100,f011ae153ad9099acdfe6a1d32cb6374e5086f7b8c8922f15ce7991a6f4d62cc0a3998db97b59a68c0d4ea915936e5fad92cceffe6920be6fe345f34b140cd0f01,894867289cc00f4d8a1d97de2f05c11a58665c6da9437f08fa5fb1b509671bc96b40f93d011b0527230f2636a32893474c986e7073934408e52a75c180564b0a00,32e4ef5a24116df0e889bd9fad3045dfb3359a20b288f2c53d9dafc5a2390d5c400e8c96f85665e331d28fb9bb26476756ea737545cd8f0b3292986d97b1c42a00 +d9a9de7f2b64e3732e1e1a2087eff7fec992e07ec7392da9579eb80abcd4cef1c4b4,7323a6f8feef5801614160f4f4bc83537ea16091aa2ba4d227dc621f98f758aa,822a4bcded5abf46696e004d43126284092f37939934f50b4bdf83c770b0f4a4485db1e424970577b1a96cdc7dada32bebf8ae7d31ff8b299e66bb4c0510abbe00,0b673cb89a5653da7975dbe1cc82deef927ecc50c1d6775f2ca4b664ef48aeb777d263fbbf2a84cbcf9a0a1365f036c484034e3c2713c584b8d5d58351ba8bb801,394f927948c60df7ed871b115832831edc86f7490eec92e9d0138cdba71d5eb47236da6387eb2669e10906cc89e16cc769823f5d7f2f539d1dbf269a06f2464800,3de7c8cc0b901b966fa6f2ed2c4ab2404c67533a9a778de93c19c8350776e41b6cc3d9aa8bae4ccd65182bf5147a2bdd73d5565b5f313790258ae54bb47a740c01,fdd4232d4605e93ae9ccb8ca73c5aee31f712576dd9994b6ef9126562e8f220b0c2058797db258db48969513fe30dbf374998eaf3a940d0224713d20c9b344c900 +39b01efe44843868f4da95fc3466b662bcb296cd8a9d6baf50dbfa7c831a17aa8512,646680f53050e88bde6f294ff0bbec2142344d5258418aa4e63b27cdf66c78e1,d0d66e9ee25f54f447890352d58b5c6c66d83d2ddcf344e79e326c2bcf9207f849bfc26e4ca181d96d15ce7a45ada1828d158df5deab82c60f75fb4c985ba6fc00,a036436628af74b5e0918ecc1940166f0f5420cd962b00fe011a4f7ef073d931714846b7df2fa4a517173e31808baf4006f900ecafab3c4dc8ffcbefc4c372b401,d39544a3f75a17b0cc561b374ba339a2683932b4d454f29a75ee8a0f898b9d7546c86bc6461a0accdf8bb364ceb4aad20253af5e34b7f73b269d31f50914bc6800,f0d127625e41d323f74ffd2efba1dd6f870539ddf8627ee1d59de8cc67944bbe5f80f0d29e17e66c8b4758d77ee23e7ed81e83189f083a12dddc70c86cfa409800,0e99c68bd2ce23af3d0bb5d560f80dbdacbcdc2db4a91a2db11385dfdd336b0c73bd285516b7719827265790fb97416791ac55bfa74796eba568bdbbe29d74b100 +99d5848b8c15a4070901a39bc369654dc668b832849f97c22ae93da0b0c1c4f27c85,42877eecf64398463572900fdf89a99fa129185f0b612f3ab30f918223232543,256fd4fb729574cdfad57acb48eba5583383bfc7f662a6b57b36449bb9e05ddc64ed4f42c35bb103693b8bb9f718c9ad508ba7e73dd7311e4502daeb42c7c40000,5eb5bd3787e0fed10c9cb33a530c252736e2964a6e2e9a468db52421487ee691466b595261635095d6d146b2d5a969d6e544d39b0f827b43556f23804904182201,15007cf74d8ef579271e17e74457af3f0d48fbb73688abee11909448995af9b06c328cbf801897136e890e4eb20cb5f4d6b6e3234b2442724bb11791303579c500,77b5195f40d108ab9f5265ad223e15826669d4505aca17b4eed2405f940cab4113157f79420ed546272554f7081fa82a62f94cecc4162c580a4e576eb983194b01,e6a817c9e7990df91f4db2bffbd5c4521513c4bc542d63e8e7f4ff1ac5b27b161980674d66ef206fd78fb3a254613ff1e5624bf8ba3ad8eb8f1e37b0eb7c0cdf01 +2c8dfcecadd539f0924e517eb39ed6943e7369af11a9c17f91eaff27ea0d24eaa48e,bf8dbab7e71ca49800870bdecce04d531b599f2f2eedfca21784eae101d36fa5,65d9152673c9636483b9874f64930b9648eed0d5c4fd5862c2da34c7303ea56244f11d765100b736a43bea5604caf4b10c9a628c6b91c778ee4c7e7b9cbe31e101,94886955e24ea8305ee77eb092c88de1148303b58a7fd69041d2b28b8adec2923fcbf60addfbb595ca732f04ab2668f2bbed7faf4c9c4183fe534f9e781121cf01,cf259352a1630e0d573a988abbb2f087627ddaaaca3beb74d51ab286c1f0e98a6ebcee434ca7facf98bdf6cd778059e459cff449140326f0c821f0cf933f7c3401,82386c636c08e7f7ef28515f8bd3427047da795fa1670c44cd40ce1bf1b162c510e0d79d72ac52475379fd1d381c52725882b80cace84ae4d2b29707f5b7eea200,690158a4507b466b8498da9d3f2dc1342ce5b73aea02cc8948331601c0500cd409d0366a400ff7262278aedab49a727ccd23e040e813189c2c9fe872ed30dede00 +61568ee355e18a930fdc3ea21633b33b8fa2a41155c54009df5ecf2d1d0a27ae6ec9,a6dffe541be446e2a330e393908155d01a4d21af8fb1dc027a3f8e224fd686f3,15800bd6ec157ecb9d6a7dc0be89eede8bfd27f84975d7805c6afcbb7a1fabb35d938a98090014a1926e6dd9391f06486c3b5224ddba1c44bcb59f775a278cdb01,0ff8f3b9dd6e1c852e2c93ce642c317ca58a1fff7039e83e2e2e90b81e833108295cd717d131ba2866efc7bfd685b54ffeb0f75e0eb94ae39410ca94bab9671500,7315a0f5ad9d72e541d2953b8786ad171cd353cd794ecfbcfb9254c93df1e0c7099b566230c73b3db470b7b7c95ff31982bdd1e1b2b308a03c5b697df44ae05900,696ddd5575709a6da930870f430291259b55839302263f7c92bd08367d6142b5383ea3043c9b2503066d4905e02ad7107dc0a75a667526ee1bb1900bb1df32ca01,f864e810f7f6d6d934286bc98c2f00f9c75f74f5a97def9b65563ff25a4a90f504d3dea4ee1aa8ddd77887d814b93a3144ac41776469490943c365d53592d2b500 +8017930f70b895517cb0f94f595ebfb43cedc48f889dadbd7bf56e1fe0ef91416ef5,63af27b99969df36526d7c0072e04e9cb05988098ef52a0cb469dca16b8e4dbb,e186525f383b49e291b930f2fd05e6ced769c07a15f60efe6a168d8caecc093c28ef5673be14104bd5dbd25285fb0d85ede0a836b88f6b848e4577a1f268e9ad00,b9c187dede2d8d2a1acd6bd0682f497dddda3a939754da912c6cfb09f630feef2d48fd824e05c3676c6b2a92abc955510c57a705a5349a3c0ca00246a70e352a00,56774c972594d118b8a28b6190324241db4cddd644ee69ebe765d6e72d4b44414e49d91b650cf71055f60cd150ba6e88556e5386491c83610f20ae164708114a01,36e120ea71aca48aa1b37c367bc220ad501b2bdd31e99f4b46c0d17edafe68783e78eb681c9c4243866f87d535180ff61283524e709633aa09fe0e6615f80f9c00,38989b085256ab8d11352bf0e5c2566b2ffffef4004d40b21911cf52f33e73b0487c02799e1cf0b5dfd878ddd5511e4d8e095882ae48fa73d4fc606e38ae420801 +3ceb9b2d088b27cde306e6fae4c89a9a6cca7da5ffba357f8ad37d0657b76d66e3a6e3,cc54d23d71dc9f526a599543babc096acdf67e3ecc0e22d8b3c9bb0a1cc72ec3,7cbe49a30cd8b7eb5259f92090a9923a13f45a3469d5f33c9804bf4afe5b3b755dc4a9b8a79345ed3f5bd1e85b42b8338ed8e42826d531f736e89c1272a39c2901,61eec674b41ee791f22403ddf9ab443f70ef109ee95db4fed8beb9068eedbd0760bef17dfae2dc142c60f3aeb232c876b895e2c5a19b6d50d02ab99ede0e8b2b00,cdf308e47a46416cf9ebcc79139fd7313d056b2d3e07cfa5637336366e039343070e8bb6f64bb083c0a1154c012ed15edb687682d661cbd68a249fad29d57fb601,74ef7d9e31606963e9ec5279a20a6d28589d0625c98a77a699a67d7129c750ce70c6b522c575c5f94eff61f4592f9cc9efb55ade1ded596af7ef45544d4258fc01,8a7d8b9365c30b50191e2dc34f56f3d973ee797f8ab350f7663adca5bedd1b0974794555ea7fdee14cfb2acd2dddd6bb695d59a21457e490fc9bb35fb478640a01 +146fdb105a9b0015790c9835d568b7958e49226f5769b7c6361d25e7ef841b3bb1b972,456eab0e031d18c442e524e5b7c85f138e62a258aa7e06bacfd751187fafc39e,b2caab81805ce88500efa47c6a42b849b12ef2f271146b9e3785ee5b192101f06d105b24a558aaf1298ed43777ce019cb4447a180bce86e2e3776f39f1be273901,c7353ea51e933dff22c5e920233e978944dcbf2626e7ddb57c19437ed2de71005c1ee689faae8c88e638da7ae57ce0f3c5a37852e2f984fa2c392348c42d965e01,dadb432e556d3271341f12bb419cbac743debc3e796e87e26ea8d388b27bcc9079920dd5d3f26daffef0acf32eff25bf9ce5491c96b674dce5fb6a557251118701,1c49711447b4b047d1094d2df61ec09a98e9ebd57c1acd6a2945c9e3351122a638c2c8f49a99f2c6673f40aa30910a5817faae767acac8d90d5d16a3a358dae101,bb5688e17f5f93ffea0cd2afc3654fdeaf413386c54f76c4d46e2f09aa4be99809d42c68506593905826ea9a8e7b34039ac8a9665f1cda36514c925e07c1c85a01 +3cbbed643bb9f66389ed897c4d642de25cc66f3b1f207ad539c6c3a99ff4d824d56bb1,c169cd4c49273fa958931103fa9b56df843620e1fb279ddf1ad356857bc43235,e13d8217ab52d231748e94a966a6a00d542bf2d23c67876348c4d16c168a011b3fde1054add777ef6fcfbce494e019c6f8a61f18f2165a57cbf883c39c87f0c400,08765b1ad4b3e42751f864484dffe3cd5b51066bed10e1bb652d5002aaf8f1026bd22118a7debeeff0ff455a174c43b1096de57278a24118c91928d74e4dd07500,126c4d967be07e35be5f73e18dfb9e20a93354d86f5585c4ec66f55ab2753f836b6beaf17ef4de6eff4559721b410519ea8fe039a28683f0cf60677cf91b3c0901,626dfc44df8c62eb14589d541c0cb782c8497ebce9cfec5e001dd7a53c8cc4272a76797229ef09d390262265fddf6b559eeacba5d73381cc8d138b5436e0598a00,a6fd0b7e7a3c467af703cc044a293bb1b274dbc76585b42d533ba14f40d9cd135626734ed45555ea6bb4c5893924d89879e826a8306ecbe2d7bb090869164b6c00 +f167f4e001e5d5eb497add0e0724dce3ba7cb35fcadb3e0915aaf907f66e4c69bf1d4b,3f7214d36aeebdaa8fab5721e694063ada505886840fd6bc438cf29194d83bd9,e6e721e7cb2cf85087b9d12498dfa3b59ca9edd80414ebfe7976e128a0920c0d51f4bfe5c7238c44d8e7cb8a33fdc0d2b6f68c5da7fecd231ca3bbff6c91272400,9fd750e2410125644330065139a45a4b0e802655ecc0f825c9768b32a6026e221004b23ec20acb74ef11cf41be300901e5120404c2d494e41de7db5b47b2fe9b01,f43cae59de8db23a0915d767cda3df1cbf7f6af1e2eb74f335432dc5c3e87fe07fff73444de4652260a23298fe95697e93eabff4f892508564be85d00f5c2f1100,00c1d1c89f823a2dec63b715176355be058083ef52740109ec806c8d9ba846fe1dff7c77b43c22c9fa0a2bd202491efbcdfc233c5ff9a5021837e5bceb9047e400,6f413eb1f6b3c851a289dbd9167f4d2810c07b2a530f9746069a948e3da479732a64a29559f457af6b43b1d2f914898bfd3515e13f2d3df085a45d5830c68c8801 +4633e59c6e2d8024fd2a0c26bd7868b71d0abbc957ef82bde51b7d7d0588c3f0092d70,8c83776e25f84b67dd2f7f9d35d33d3d509e09b5c3e4a69ee686479e50abe881,0b5afe929f5625096a993f83ec02d3ea315a10d7af8da189caa8ae911e0b99d412d23f774bcf14189d04049f5f376d8ecfec899fe8be8e5dc3fab528c6c3174300,9bc1355a4a69c7ed6635ec541a2c4c66753057c9e81d004686f05ac33f9dc24c7fa57cd13313c0aa94028c26655d353c41e858ce3fbe85c7cb78f237e17602e800,8972a9d4e2ee04574a502b9d70506f9a137ae953cae00211e1bdbb895664f5831a0f89436d8d8359fffb60783636cd4c0b9ec5491fe3b5e86afb5b0d1d3671b400,78c3af94a6b2a236efd196e9e31c4fa09364e0d5ce02a6d5a786a15b202f899c1c22ad032403ebed52c55ea23df7f56cf5f89b1a4cdb6332538d78c2f18f63e300,31dafcbfba7da3da1e87a1bda9b78aa03475e43ffbca22a1c9eafc3b18b5af383e7c023c81b3a574b54f13ddaa89620d1c0cd89211453e2eca9494ca98dc2e2601 +6e88acfdafbba3bce0824144e50465928156d5a231ead99d989bcf42aa5bd0d3320f64,14595fa410173c0d06abd22385445ea1d7ae583ad1815f2bf00ec1775f8a4e5f,99786b750fe6bb87dc099da73c6d1adc645db7cdf5ed33f0182ab5c9606a6eaa5ffb7a9c8c969bfbc6254f13c6329e7d678eb23c5e8bcb2e8940f7965b141ed200,e1188c398e946cef7fa1759a0f56a2bef74098df81c95fb7ecb7024f6bc087bd14da30b0d42e0d03d3f00cba137efb3036f21dc339d2838253208fb2b64a961501,1df0e10956d8209cf3373ea12e731732bdd6bec2f4cf7e7660a70476e092247b0b3cbe3c6734ac59f10c979f0da92835583c1194bb57aedabad365a3ae5f150700,a6b5bf561a918f6bf97713c7acfc56bf3d88c67b94c8a6cc7f9f502f538027723b73abc20889ef9dd92e94e2cc0034191c85f1db55072334e80303161c9aceb001,821feef11a41a11c3462f353bdc4950447668d215e88dca659da3bc00abe3ce1226b293e4c1680d5f3bbaed6165a7b06ab4b08dd4fcbdd0498a17827b07bf93600 +43ea5d15a8d82df1031770384641ded0e6af6eb2a08960db296a4c5080fcfa309955af,7beac4e5ee3dd79288d8cbeb7097fe5a86fe0ea2478535a6b36c1f9d160aa36d,968caf4aedc38b7b69339815fe0f0f1ad893250c04b858afd146832e91f8b782028ebd41dfc691089b740c0afc1211a2dbc6aaf9bb3e3113103c9ff626de73d300,9b96586a14ea8a5c3f24bc5b2cdc5a4e1cc5459491e3e031749f94ba32cac4896aeceaaaf118b7a0e45618835f997b313781b1b323eaa607c293b68f32ca12df00,2572db65b79b318d5ac2301df4aa541ac5badfa39f8a0a1411fa4c8d50dab25f6c5fc896b9e1fd29222c2ee42c4ec2d4d38f700d165ed5a1f263c113d0c72b8d00,dc333978e25ee175a24cf970b7237d91329baa647e1785c9fa35d882c49eb2583904814d7811637299ff17b5272895ba2ea833da64dab17cb73ed945e0329f1b01,1759553a8459e040e7563ad6a9912901539db5ff886edbc45b454b28990481233ff9d56283740cc0c0df6a41fc07b0e71f183b749052c4a65f8a70794eda3b1000 +71803f9368877dc0eeb0c2345f3b8a46b44682aeb2b2b03e95f4f252185e61c77642e6,1af7c4b78b4c33d98bd2cf2909065923e16773e76b1e8e225d428dbc6e3a3bd8,420ac78e4448d901befdc787df1cfd3a58d0f1d56c8680025341f61a50d2522c218c928f9d123736b7bbdc8d6da31bb1a240f858b0be7ed6c6811c0def4ae6cb00,ce20ed9e4e79182eae4cdd6dad0b6527c3f390f5117d82442ac6d730265be05d462d98234ea5fe7ced9553783e29c9a31ecf672b589c1306dc5f53936f78a46a01,c42a128b16aa84e33c27d565764f95ddb04b8aaaed64bde61bc22436e562503b6f9f28d958d60c5ec5c8b253a559f21986be7bfa0709552bb81b739b3d74ae7601,7d19b447b37f9c1caa3134fb46cb2ff79306161378180276c223dbf6beef7b9977a2a25467a8bf8934fb4eb80d250d055aa965ef02304ac9723e815eede164fb01,ec7681f9d068ef43e491177ccab473b7181dc7552d8a07355d9b66316c671f2d37ae5d389be9edce16cb26be22fa4349ccdf4c1f65c85bd3b97c044193ae25b600 +c114e7875ce3050b02b3990072ed2442c00ae5ffad2aba6214253a010c4ea83114a87c,1e562bbdaf5b269d57c1fe6518a677c0a53498dbd0517ed3757370a31670a85c,096e58412241bc5ac38b827d8013b0ac65b1f48c266bd7892e0ea5324b768e045bc59d33b16de73ac106ffd18a2e1429ac5c3b813ef01763ebc6280e4f1a4b7600,85ba25b6f4b5d03a729a8530881ed022a579f6a089f716f50e6532761fb21f780c28b71f8ed783014d69214d7e7c15f9127b4e2bbeb2f8b05eaf80e0717c0d8400,5ca2dd10f52a6e069e711747b43d50bb7052a74a86bd262153d9575086c0b3fa740d35fca9b34949d1b5a61b669934b37e009c835aa99260b2cff63e4c23059601,a1f037c6fe5e80e2de7416ec1c49681232fe49b197862b1e1359cfbeee2b09d14b7b031aa75ba22190c26d919809582381f901837e5ee060c66ec0ccb56a092600,abca426a1d2728555e630f31b527446c40a4b1ecd7ecc88c4bdb103e9f985201166115e3131a9271b9165643a1df97452b46515e4ee90efe4523aca3357de00c01 +4ded30620d96968c9153fcf39ec502d04544e22451e4945ebd1c735587685710b4bfa4,78338603b2a5cfadec022b7e0b1d5b758078383d2bca6e8508ea89121a8c8c66,e831c6c92887bf020c5373d6323449d0cea9e026bcf469576bcda36205b7467d2818b17d523e24258a34714838a940703c15e551dab9632670d01a2606fbd0bc00,c550593e6e577e8ebc931ce9de615dc28e1fa5d4f18fee20ee78026a4591fcfc01ea6e8123b6b7c838111f30d5a6f27d8d663a5d14ce86ac79f319af59c972d700,ad7e279e25be26060d6e96badcf0ba054c25befa6be73cc6388e1e2b861617b5747cc8b899db98959815d5b00fe8298134e6395fbb318ea1bb5377b8ab11461f01,3042ca5fb34af116817b7fdb182643c4fc018d0e2ad8121ad5eae16fe9361b535d6e7c9e61a4655fe54dcd3f229c02241e760ee61c14906ec9f3c07b9c9d32a101,2379605bd7417afd161a7d863d93eaedecb13c0fd28a98ff87dfd0a14526758a20453cf02acdd63913a33c46e6cc0567687309c6f69a1ad2b02d2cefb2ce0eac01 +eb49316426b7706193e7949e68151167f59f1318d3a09abdf5a3ab82fac2caa32b2fcf43,1e0048d813ec9113f64711adead428c8ef441049a8d5f47432d2321ad3402716,6b49b274377093252ef02652ef7cc4b330a70757c8883c126cb4eac4440fd8e85ac7a77be6b4a7f7ea3591ae1b9ee1c02e3aaa1e8a85d44ed915ac02cbfeb30201,9fa9510d53c8936b90afd8bd099095f8a222299e0a08563bb5c37f39830828f867d11c234a6117e0787770e6ea1c8196150a1062de013f982acf9ad1f86cffd101,9af71c7f7d3938179bb0d344a942f1798a6254ac9b742154cf50391ac5438eea7a12320764feaa1d37c6acce045c50910bded6f09e3a93a5d9f925faf290487901,a28d663f198517b60ade437472ca47a1bdbdbedf2d48049158ba0ed9b6bb034338e192d53e5f6ed8894cb5620ceb00b355efad04a4371e574e21563bfeb6f20800,4c35be2d75b2ffd62c39e22a2db0bd84d989e5d44d21d0d6060a5cdc062f76d4435a7faee3228b39a8eeeabea37d8d7b1357345903217b44b75cbcad0f91d00801 +126be9a5d5005f95892614d5a73d3d6412e6245295096300cfb9df1ea6a5bb67af2ac0d9,2d67840ede276bea2444de4aa89ae308fb76295ad6f19ed6c3ea540ae72cb3ff,3210bf8c7f2d1d9b832e3402ccf0a48fe7de294b6163904d764cc980f4a3239d5623d1389c3ace80bda195993470215aee032a39bad030386617147c43e2716001,22dfdb60b94d65dee9c011fab1bd034c82c5af0896a6fb981449e920fc5c19397e07e9ca50c60b686af8d91b0e377fc3a60aa4da4dbb9018d899d02a8c27e69f00,469120e4673c0de9ddb1d9609f9920db70c08693ca9118674a30e6da69ac40c55b34afd6b8d678731eb66d4b00abf088f3bb277675800a68dbfd76e1ed9a33a901,c1d59221aa133dc54d30653c3e195a5c295fee0e42830ae5dc32e9453827a2803952d014c40825196e303034ffceddd895cd8195ff076c748820982b6d554c9701,fba08502e81857f44be1e7b80fcaecd949d056fe8cdb476df238ac4fac4e26df4c3f2f6bb6043391750cff8b99bfbc01022177d0b1ff22a91208e8519ebab23e01 +4cb8910ede45b033072684fa31b36253ee1c907dd7e10cce6d6ddc788e4045213005d723,2ebffecf79142ae9740925ef26c26774d25b709524a663ab178a1587d626b031,645b2f4ed831cb849c9cfcf2a74d4bb2912552b344dca8caf39ece632bbfbc3a203cb3334d7f6b04627ccf38328d89bbbaaadbaa233f97258df0393fee3e48ab00,8d913aa0e9fdc5c7fc0c51937bb74181eda2117f7c343b199856a956370269fb105f45ea403a015bec5f0d51c1248cb52a1cc06cb72c80891ffd0824dbc93f7a00,26b80cd6ace3f44827d7f01c2f963a1a25d850993d5a0d082335597158862e9b052b5501589c2284534b65675e0a663edd0097dc1b07a180f57fc0025e301c9901,ca16eb41fef4dbcf9d8a8f2ecd3eac80097ac9c59f123b5f613f8bc8a04382944b68c4e0069433b71be30f5a31b73e23f071fa65a4aa0a78e656d15d889390b700,76bb94b0dffbe058da3871891977a2cf6842eb4f0abe80bd3b2a9a4885f9595b6c9a841fa6380dac62f25c5c1cee5c22af679a54ef62c9cf93989634772271b001 +117f6b4da84d0476e1dbead03c96e7d311e36a6385c8f263bb778e4ddab03333f6b448c7,1f72ad8be1cb02381d6f9d786b5ab8e34b8bbaa6590a0ae5e12f0d675e94d794,e859d199c167f3bd4690edd3fe76082d369e8cbe973d142441881478d4eba8e937281cda9719142f542bcb9e82efa4b72a5127a98bc3dbe8681098ab75abd2cb01,0129ca30882a6bb11445134caee323866dc32e4fbbfcbb449a8386fae49fc514032afdd9ea792705554445056b60807d2bfdff832fec1b0d8b4ad35726f43aea01,7a66f4fff00aa013cfe9b16d606454f1596cf23aaca3d8e431445de85950760d57035a89505b8fa0829a4cddd7276b64d8a86a9cd08cc0ed83ca7c24ebbb07a201,8728bf471ffa38e0055f649d16c300caf3691def490638fb35019352313139491414053598ed83e3605e334766f123e1f7967e0d9f28577dd9ea98c7d13b3dcc00,5c8d5b4f0b109aa57b9c51c3085532d33c53dfaa3917695259815b7f098ab2e23373f0a9715d6c680dff4a97bda275fa3929bb4e695b49b69d5255fcb13732ab00 +67b732e33be296ce996486bed2674090f3cf8aafd31307497966593b676bbf8c485a75ec,d27851ba4cb19fc02531f7f2cab12c6cb77db32bc65651bad5cf00b912568cb3,5a13de43ae4f397d37afcdc9330f1d5c2147d6ff18f55958d5532478b348972615be8b59324baff4b1a1312579ed360faa3e676bad6967dada67623ee38a9aa201,428a913a20f6373bdccf2556b9864f89f8f8d30df910f0475f52a7147a337a9a1c9566ca89eb3c249196e205d0e180ec0df3a949903e748c24538270c01770c400,8a37d57811fb48993cb6d49dc532824351f3b40f95edb232729396cdb8a892617b2c54cd644b9a1555852d5bda8297c8a9946b277f7ee3b16ea2e1b3737acfe101,0e1656fbc7fbceb902a9a3d06a8ee281224498367686bdb23b6d6506f25aa6e106170a38a6503d65aaccb39c90d49ce992cb29bd8fb6ccb4285a9c56bb945c7100,7e4c75e92a9fbf535f493cc6b8fd62811d9968050ad1a0c4ff1fd89049bf03bd12fdcb3c8628a3805307555e261673a9f609ba7024a755c5c63dd4528aa9336d00 +b062382cc6556d917cdd09de2ee48ae8c1e2c39902202e4f75425dc03cb84ca3f782e3b5,3795e2ec362beb3872edd06e492e433c17200b2c41b27da48e7da1ba2377e10b,1b21ef6df887bf388218c5c75d2cfd3fc3668c39ccf63acc5c98bc1231eb943007e3b194307ecc2a2de364d63f24999f3caf1533c1b1e9dc3d8a236d2589cc7301,3f61f9e523b38ead7384e3fc34a8ffbd7bf4d6c96f4dada16d39a97fe0afbb406cc17987f39c3a727455a8ab486cc058a42742d28b54251897a9f945fedf8e6600,bd92d4a151f57644a2d26091c53388431e2914579492ec714544e56bd681ec6f087ce450644e8e79b971f9659d607f3253919d2156eda87bab03a9f9df0d183501,1e681834a43637290bc4b509aaa2b357b33b31035c34f4ecf8683f0f8b152e4d1c29d56f7b785b1134bbcc395278ed86a4ae51cda9e939e66800cfe2652bd52100,a301429566e7cb9d5df4e5faa530d2fda229a36bb0e3533a6f2a779c5daeed5b02788313340a2bb16cb03c5c49f7fa2a057b00977e4a7654b892c426d4c0e13c01 +1f68a1ef57c851be5c45113170a4a2211d8735767896e70f713a31307953f40875775cfa,7cbd0a79b0ed9d9aab9cd92ef9bf87b5c40079e72afd4793a1cc2a6c16f3bd22,f19137c6443010b4e9fa0513892f04b56debcb54fefd7a25dd912bdb3b99083416e0de80d555800ba6a971e45b8eef9d6c17b8338b74a88a51ed308b4f6d4a6f01,eabe2accec1863133e1a47e59a58ff3accd920d6d0004bea2fcfba2f3159ca730a5a38ed3bbe85756ced872442c3b9c6c9bf0b99625d07d61916d69207508c7c00,37709dd7f5993517a7afb5f2b9cf20b40c6f0318cb741e972b5ed31e7d10c1ac544241e0831199583922804a7a9314c432a2d29c2c4c5722b0030d6c393e6f1a00,b26159f5c395ec691d05ed66061f311fc0e3eb4ee9edd393ffac67ded7909db27c3dbae383fad20d931b5a87891d62f4b8a7236a0bedc38c72d78cb083c6fdc800,23399a2a645a055091949ef9f3f3fc6be7eb9a7124798537c30522104b11b50c21cb39eb2fcd2ec3ed9b2a76c0e64ea941ea9b6bb3c378f13a85ee63a39975ef01 +8678df7d66401094f230a0b993a1589d7821334038f96c9911e06c1d86c8fdd716d8ed32,07e04dfb5156a22b7f68ebc4f4eeb19568ccd0146d29dff71cc80053d3871780,575fd5c0f37207df18400357641de98487de5d5c1c2316f86c52152bc659d248665f5be7b40f238ff909456fc4e19e3f2a0888a9d73fbc16541630cbf7afbf7901,290086e250caef3f3046600f3d806ef3fe96bb308370e5b18079ee230f052a9074d5d719a1d6d211e660a7e83a10d6fa82dc673b34d3b9c60232a92cbd21d68101,5cdf16d413fcc790d0781812e2ccc12662fc9d80fc0c3a29b6de5c3afc3d06887ef9a6528123111ec60ad2014e525521dbfb3ef401061916af94b6d1ff1cfea001,e17e8d382756cd71b9b3272b1cf50a410112584c11af7e05f4d01405215206b337fb0fd940c394b36d0975bdb697b1a22b11cd21a08b7759ca7f9013c31d511901,32b748df74b03c898b5614a542b9d8b73dc5cb6159ea1631ae42269ba4692a9b6ffdadc0dc040edc72f0c5d7059060027f485853dc17c84f0d924910c624bdd800 +43ee76b7a7acee54964ec23edfe24592f6325366379f952a957bd7580fa909dd1f15fe3a,06981825dfc077391fc78de65f93a8e8e3a31515bd160cfde9ce606d8206e90d,0f5d185f43f80744affff6508f825e41f4b65cb4d817f47695622c10b2215c9c3284176d4beac3196ff43a6494a1c2355d166118e2179b4239f8c610804b915601,ab154af62c859a54ffdb3428b236b871ef550ec11555a804020fff0cd87c3677030e39d3b17a0af0b029081c6d10f4c3d3fb9fd3aee4b43faf1fa3c6471bf9fc01,dcfa1ccb60cdd10cf700a545f95bf031ec8af541c4371e24ffa99a11f0e41735483bb2170c44b90956737022369877b554c4a76cf87386de45e965fa78513a9000,2be2ba7f6cf586ee43f480f78a5a62d80dba1471f666423ee1e8ea9e196e6fea659abda51a2449e610ea5927f421c69a46d7e80e4524c775bbe63b8fff84805a00,f1f41d94274d2905e9bf07f6508bc4992d407adacfc6691cbc010f471a2305c11f4a9dc9e5eecbd44e752cbf1ae8dec9a7898f4cdb7936d0f509d590f45dd3c300 +8a58a41116201933d76a3b746a8b12f89bcfdae4b2bccbfbde2934cab5e2cedb9c83d9d7,539e9618da97434c44782e349b011a3515791aab204c4ea6037fde29dd406f77,06ebfb0f66bd823457843e440d893619dfbed94f6a18178c62210f5671c533064a3d9b5548c2a0397a583acd9f33e333cd55c08e2428e45edb8796d876fab01001,8b03b668669e9fd48dd6fc219764b0d6637d2213dc4e40519f6745be0ec36ab6428bfe0a8a5c043443289828d0fda225b43f6152ac468e73fa5dda2f82f1a47400,bde431d87581a79defe4ba9429141cea5efb704b0e37ff7434becd01dea7910f70d1bf3e87b64afad15858395fca7581a1a85627c5d34e41e775ae2e1139446c00,4e7c6a9d4294ae12ac2d38e8e9dcc8b3083eee7ab44cbea5f6ea6188fbdd86223e0b5aea15066db44d15b312116c9eaaf610f8238ac8a0e8a2cd287d61cce9d501,7abd4e0b7a504ad1e6dead5e331c31019febb5fa6409b1fc8c49886bfa5059d1142d8b54e2f9ef643010eacbbeeaae43bb1c0da344768eea0b79aa22ba0c59ac00 +e3e3126d4169a294ba3cc5cf207d0c26b82a30bc218cdbb901eb5031ede14f44ce4cf173f1,b54838726dad38a9a99c34304354b246ab72c6fe18bca08775ce17ab7042686c,8584c74e3fcce3ef493b33f5c7cfe66cc4dfc25fea26a03d06ec7a15f203d9a01c612409446570fb0345b574bc4f1467dbd6f7b3a358fba449af47255340ba4801,1237640b5b74b1107ef8d60e06a3046ff0c09356ce1b4fa59895a8e40b47aca7707dfa1103ad65234180a4c5517d55897ed91e0dd846234185332b2df13bc35e00,bed168c4aa9aa5181cb19a053dbdd41347a4fb96f8be0d82945082a8ca4cc6df2b570c3a5a65095c6157e8cc054cd259cbdd6075816a14472bc685365539376e00,f25bd66fe020017fb918600a317f7b18e321e3a81dbc21fbff7abc2c743eaf2650803fc1dc65f0710092e348edd0a6ddc06f6b458d1020f04a46f1c7e2a038e800,ea7ed6602ccf8b87cb62e89f0fb65e42368b8547338c46abdeda5ed64c2e35e83fc8c64b9f8a1bce14412aeb05226f190e682180ccc64c402f3dd79e69267fe100 +122a3a6313b53db571883bea76404e15c10cbc0f2d941330223d35f48cb7d6ccef2cbb007f,4a14d09bd317181516714644540f3c5632719c9b301a247a115ee9b295c8abbb,3bd2f558fc766d09dcdb66cae4948c95ce4004737897f2c2b981f8c69dad56de4ec9f6e6209f2f807c57b9416acf30695283bec89d766f7ca68b4f0015b669cf01,ed28f75f76a9c447db917041dfa8b728187969940e050ea7a023ef51504c387117fa50c456222e7680180ce814fe68dedfb7eb2cccd6852c1192c5408788c56901,b881f50f2adb6a5f409aa4264ba0e586bb43d193266db823d1987c530161780e0f3c835969a06edd9ab26feed6cdd97c40fe97d88fb3d1cae5fea80984e748a101,c62038c66bd3e4dd6e4815c2fcc2aa1c9c59860880fe757f9e4a679ef3ef8a2b3a64e8b937b4fc795b33d93e1881e1eba9d7e3c6695951f6f842733423e48f7901,46264e5213f14f3c47ddf50596b36e83e1b6c10600d7084c4b21238f531cd2fc5c3d45b5c68a9caa3197e3c6e88cb0ed25d56b95126c0cf7a36b8001b5a8de6600 +561e1073dda2a8eb9c0085a45b19a912caa554f6ac76a9c3ab04b6a76ff70204e5ce788fbd,578c1c716a708a415e7b3a646f4f1a8ce25e4b243c75aa8e5f0a88bd19da3364,08b082168e7f1c5367d8f40cd8f276908e732ec101541ee590e952ae7d78fe0a5866276bc81ae4deb83c458e8ae52b04e7c53612f2e07063b7ee34aa5845ab8401,579cd380f34d799cd130a9d0cef6a43f1651b70eb31927b64ab3ef865a88f44c126b34c0101c1439ca705f9618c903e3d10066afa23135161ccbc6935e08a9be01,4579615466140b7f1d1d816999bec136d8898d5ae05e42a69e0b074318549d150789c8385166b7820e1269eb9377a2986423df8019a77dd67aed4f11f9f2bd6700,3652c30816e4b491b4c52b4a0fe694bc73cc818c8cff865bd60688006e5d694b727d57fa385821eab34e0b6746100a9345afa66acfb67a3426d6f352c864260e00,62e93b65aebfcfded29553bd4f5180df9789491451a1ba630e316748300696454cdeadf63a960e78a3ad8cca638b3f3ce80604ab0974faadb5ee6cdb5a5c768801 +20026f0144dfcaadbca49ce76949c3da091a4d7db3748d722c4954cbc4af7bd860935d7947,9f6944820b06c5aed6bd3c61dcff17f7b9abaad37bb90a53a372d860cf3094fa,6f4c650d2dc74ae2448b10408d92e0cfde5e0fba52ff1266daf0227eca2bcf9b04c0f2cfcaef113eb987d2261e84b80a652bf5175b3397aecd145a2af81a3f8c00,18ffb5639b9481e3f46e9605e726867d2f334c10735a45e8caffc6b1d92659784296fd42cebd2f1016ed0c6f263ea18990596e5ded7d3285da1b4d81e9ca88f001,6859e3467aee6254e81d3a67bf79b6c3d59ccdd2d4c213d0262e3479da47096653e4714278af4f41942146a615afb2e2c5ca22f6cef06064d92a4288de483b1501,ced82ccd58d31dd09132121ba6d46eef1241ad85b548d82208fa76a8fbf4dbc6716876df96c89aa91df5fc8a172a032839d5a890fd05700d42d46bf5caaa1a7101,ff9d6c2dd27015bf896c9a80d51654407f7603d852d2d7c189e0bd51bc8fc7e52e1c903c1c56cf8e37ac3b37dffe345a2b040f55e8d6f4015fdaed90f06ce65801 +e2e5c5fbd598034e3d49a2f279565f5f867d56c1346199cf191d686798c6486498a7a5f511,7630dc98ad882befa88604cd5246f09ae4edb9f7b6f8d8235327d6b25035d5e3,a9143100b1fe899c98cf303190d1f5f775160bfb467893f7ea24140ce49f45de1bd57697d3ffe075aec74797a7d0860548300ccb7d31e3884e6ce756757bf38b00,86ce9c448b57823a1bd6187397cf0671fc09a5c89d925ede7bf639b0efa60a1d671f41399c9911616a3756b23b33d3919b8a8db1c1a01c64f08f639b705df25b01,2486f2024d9049651009d5229cf1046489d6b93e12da7e98d56817334a494cc659593f03924943e1a60bd31859319307ece67933282eef8ed5dcb528f7ef46bd01,336a72510689437a026e4ffedcd416091d033083c78d675642619a9d937b30fa27a57201d061ee659dbd687c8b03378b3e396d1e6f41d377247788fcaa55cf6f01,694f95c134bdf88b7cf042687a8b78e3f1b21700c4ba42b55becc5d29ba02c25374cd14faf9b41698fc42ad8ba32b299934913446f8e50e3e4568439f6928b0100 +a77a83d3dea9d16d29d2604529d551e58714719836f9434787d1d147ce4a794b55650a023e,3571ac4b18f5f8045b7ba9337163f5959be39c3148a694ae5367f6bf96a238e6,b7f4aebb470bd8aeea921f0a1b90faffebd0ef71191562d516f1f23039a511bc560b005f9c5df640514862ba23a4a35675d7bff0f6c7ceeba568aeff1dd3fe1c00,a251a53755479da721fc3c2a50f38735ec885b2ff2b5a7e615e9297e8638a5f60be18695320abc9c71f633415459230da9d5b45747c13df8a048a3cb5fdbe0ee01,956ff9d7d51e283436fa4f5373e8a1d9c436ca05affca52da236a3597e8eb0ef24af3598e6d76b2a3b03e819b5df8cfcd63f94008dd128486912c7cb35ffaa6e00,a714c1a94643e496bf609c634eb61d3f1e711b289f949b8ee3bfe913292b1b03369fe52ea6c05c2668e5209298ae4ff6f7e357a57ae1124ae63e920dbfd308be01,c018c0c6c271237a518aac4ac63b6517440727700b7211126053817be93575fb19e4e2c21810cdd45de92295a7c5856463d7598a0c8d3999a9ad9ea38629eba001 +52bae529456e9512d04730f865681ba81f9b4d70750962136efa2f6acdf5ac20ffc9ddd2c4,aa42037f0407bdb27c934a8da66e9e24cef02456152b4ad9fe20c9cd7135d7bf,9e6861ecfd4086501d6787321d311e378abf9aa767246fce32bd9d518c946b2a5bbc8f3b8a127ec50ec5cf65d07a5725ff49eb37391a8363c42609de481add6500,ed6845352cdd76bbc2cd65ceffba44cc16679368e997ec0825303e3ee19a7e603398945477277ffb5ccc2d57ddf70cfb2b2fb10946947f58bac1a43e7f0d715f01,d7d8410e90e907a39c57095bf2287446e28d8e992decea0903dcdd2135a8c8542f79f8d14026a25750124d544f1de2588e510fa82f7d3d771ddc85a1f210753301,9e3d977f1f7b555fd20f3af4a036feaff01647922f9a92c24e6f3328662f00a65fff8b178a60e83f1c39583dfab8f1fbc6d23d838cce1d2d2a47aa0cfa1676cc00,3fb856013847fc2339a6567c0acee595081b7dc44faa1126d5e49f9daa5c9bf716c226d6336219b7ee81545cd598eff3860f190e407b4135e43bf68046cef7bd01 +71dabad62554d59c5c78be77cb667fceb7cf3b8838e59b7071ac7a28116c15c6653e884db1,03341e6795fc4264bea84def9f19dc1e65a830647f7abfeb8ccdf2ba199185ed,63f8402c8578f58bb2bfde32b25535797d46d7db473ff7f676bf18fcfd69b160734e6f92342aac6745ab887a1abe7d98880fe021c36b620b04132bdc13cdac9d01,210d8249631b0f6809910c01da99a3f0395012dea604a23e5661a0102b1ca000002023b9c6144228a2b65cedcc20e1c8a870e392279e07b5b8dfbab2668cb6f701,198ec493ff461c42b66a2a8891052f2f7e76a6b7d0869d5b70667d634999b8d412413b878f3c7e4feb65788752bb6782b51e20a0892f1422c4fc06c6bc006d2200,e55bd4aad77fb1639ba75a64d9cab6679d18f60c2188399ec0d0b7afe7c5b87a677c78fd9c127fd5de2ee8c785ceae347eb6120871e84454f6c6fc734336849801,f655a60c4c8aa7efb9323dd374eedcfcf249bd2443485771d62fec18bf6a46a4704e4f115c99092f85e31cc07a96123e801442084f3d3bf05f8da247c4181d5700 +cc54aa6799e71997879c76eb22b29354a177f8a5e870f65ebf859cda3d9b7e807c4db2c524,45edc664a7d29429af023210a3fe905ed8072db2feaaa00a989d6149cb698518,d74fc6280ca9fd90ee76b36838431d6cdaea83a31d3947323068818dd36beea84c2db55823aeb8f65130cb142ef64530ca2a6eba36f5db09d1126d7e2e96e4e300,b25fd52fcf59ba629ed495a04bbb7972842270e0cf310b8bb712fce1874942006b940e7258828a3d012afa81be820633ab34840204f832a1956f7149641f516c01,248d31d8b9b91300031ca043da66eff8621046ffaf96290bd6832b46482dbea53129ee5c864c01c4023d3993a5ce1a561079a8ac6cbe66da8eabc7506c7978fa01,02d8935f484850b97cea428a0c9990bd317a532569676a08fd61982b68f6ade6584328fedeee864ae0c3ec93227d8af0a72d42d66727e230a9184eaa453ea69001,5a5a594835275b5f5c11f7571c1c0db38d403b248867559bbd797ea2d4d9ba363bc5bf882f6d4911e93e0d904002684c53cdc24c354fc0e4b80f4dcbb1d78d9d01 +f0856ca3229e2393c4f39c0ebe7ad209d78cd4f4ae8a6b7d7041cc50d648413ab124ac01e4,302856eca81084b86e8f58ad1e85905722aaa32aa358a9c85595934840c2b916,0917fcf6a7e86f164f554a7d79522911d7513dc1646c5ce3a1e8abab1c59938a7fd5b5b6c525427b58d8fc9de4eaa78e32a9d4ed0d038ef2a06be54fb55e5b6d01,6f6e8c7f999008da929e5ef924842d611369f4d4a844bd88d24b68c391690c245c731e870b33b9108c3126dbe2e8dbc1c7d287b96f6c1de233cdb9008709c3a400,586f04278976b76bb0a4982d51eddb1caaa6edcc6cd76c032ec7b23a27cfc6d874b972aa5dd19837df6502d1efb8711d7500532a1b02eacabb14bbf144b1be3a01,962c2c632c809a752d4c5fb70cc691cf876e26d0452a9b99bc7c466b0cca3259134c7ea481aca16dee0d1e1d5a83613f46ab94f869879932bcafbb18a4716e2c01,10b2999b5549f28b5f57fe6687adbac135b8d57b16d3386858a13bdb6b08c23143d54d93255bd454ab5f9d0f4f0497b3388cf02bbce47305a32b8579d10ca75601 +7dde206e0df0ce1094abe1540d6115f3b9022b74f0f7302913d370420871df4c847abdc6fc11,4e4231c17181c9f58cc87974ba91983a9d4613279fb13687bf98a59a11c0143b,9fc8d0063adf3e19199343cf0b6120a10b98fdfa3e7fbe28a8a1db6bdc847a7e44500fd9574e0f7025d368d8ec305fbb6468d5aede47ff6137cad7b530be8e3701,61e5625c00e6fa09ed14b935190041dc359d60df22a1854d0712ec5097856677602eac252d5aa3515630526188216bb9e8297e8efa62c266ef3fc0729bb3445001,318e67786732fa06c28e2bfe212e8b27e129d106fabc998373eb591efb56ba131d3674c3005123ba81486c01867a173ac877c02f41f6fe4de4687d0b254ac83700,d315ca611293f338e22697f251dfa0137da0bcff2edc8cef2fd0a957c62d4d96434ea048a2f069814689f4b0f2dc4c7c43bd328f9c20f5af977055ece5db5aa000,8249b611628b82b73ae6531fe6f20200814f4026da91ba90303c82d0ba9ce8c77860fc7604fb13421810224a883edf6999948fc412c116f1d9c31136a9f2d73101 +09dbd9e377be60e666bd22d106b326bf49288005c0941ee5096f17e477f8a6e466bb710b301d,a73283564be211f215883b14e759fd38fc337c278338ca04f8f227eb18337784,a7b12dda61c1c04986fc979ac7b135440fe08f2056cdde41add82c5269caf25377bad5917864c8f3f23b3d489277cab13cc9e119e851282f567a00f157df3a4a01,029d83ee70e1b57b4e864c9ffe87d7156b5de773ecbeeea38512b5fda105acb40fa4261a0d5c92ba8130089aaaee6916bb4c9f041097df1f033400f46c4b379f00,6b2688d89813789aeeff122b4e305042446897627ebc5cf9d5404515a45840e01aaebda94f5182e073280e1aa87532de97c37da748ce1f32672902831079f8db01,1945d1f0a6b4ccdde3ecae1d6812b117383373c46658ee66e4285ca7ad3cd9fb4e910fc905270151f7bb7147def11ad37f536346af4f8e5e22a7e77712cae64800,52804b3acf4bb9f3e652e377393da5c67466a4aba33c68e9bae2a5f778cc524d53be0ab32400f3176f3d0414b88c2d04d5a1fda3bb9e425c6e388b3c420e141000 +3d28da96db470f11e31f5d184e8383f073a381f727f7242cf20b7e302452065ddb9f66018771,57779302045de8916747ccf48d63cc3fef886042156d24c5872b7ff9c442ae2d,b36c96396c2a7a3a686b37abb95b45acf6dedac551e74f7d2a947b7ce3d0aba44e447b7d7309ab6dea4d5cf3e7928c25b50ef135684b64d5f10dcf31e4784d7600,1c7642d382306dcef3357519897bdfdc76c33853dd77997f3b159c70991169230b3272ee5ccb147009abadfb8825750495b92d9ff78bdeb726cef2bafc4d920d01,19e32f589a4224bc1fb4316a806ee6f023c9aac744b8b44d1d3b70d92c663d6053307d21a3877fc5ebfc0b420ef6a3eccd78730abcaea06036089d0ec1c8c94e01,bbd3473530593b8e5d6ea4658d4f8cac6a761da9e6af46dc438c2ecaddb61a73712c84ec54a55e72982ce53d243b67169fa34ece3bd11d0777ab5e1d1b4a062600,2b826404aabaf8d149663b14f98296ed45a8e1a8825bbc492a68d71e1522cc9f3179e109ecbeec7508fd145ef8f602013325b2c154b672ee081b2c8e41166fc400 +bced3bc6e3c5b53b91dedae8d02d497fda28110d2d3cb9359dcaa0a3b12510aaa4c4357646af,fa0f1adc81d8d043fe2200eb69b8772a4efdf028a1d39086055bd6f6c9267d57,de555ce2a910321f4df9d1d0d22664b7c22de37ef76d7f982f04fcdfa4db516c28852d67a2fdf5c8f963ae0408bdc60d4764e888b0041a3acb0ca5e40d468e4d01,3b864e58fbbf8a21f26ba74f933cbc8ee3f621da37c0d4ee8e79f7de69f3a85260768dda705969140072a7226d6543a0dd21908b077e7b0f992c1b220133272801,f1474cd89adea9ccb9d5059880aef9b845619d3d4a4d349a77b7fa300eca844c02b6b666e0dab340b7de766adeb6110c8e3374a207197946ab1bd801566c69b701,92a839323ca6217676e688aa5a8d739ed3c2043d8eb7778eefeccfbd31ac22fb2718b93f8c342b9222547ae610471e24301c9ad0365a538168a427040d4562bc01,277a9a3c93c0d84101eecbff0904a3a168cc6cd29ac8632f99eb31a8e6de64797bcd346d157f2360b58f8acb6a3a27dd9ff787ea65c61f06b87e826a12d0d05600 +9ec261629b557257e68d18ff9798283ce0006d6fe40aa7e11ba2dc23c29f4aa52275f4433165,01b9602e77e2f66003e9efe92bdc4b98ee27f492acdd28d2a0ee50a76367141e,ad5cd485b94ffc709a2d4e9208193eba5805dc71b850f8b02d7b423ea67d771d16ecd4d4aad7d6cc011e16bc36d04f9e3a062e84fb1f6df706b0b977a30aaaa901,850c3755741eb9efcdc126c040328b3faa8952369c9f57cd12cedf969241c82b305e6965d6dfacc4b60fcc5a4c141726b0037f3bfd2eadedc9c9f3efc60272cf01,fea315092ad190d53b3be0d5e251fa647d641f077136a07d9296e1098bcc3fd41364d80adce10f98a0725cf0daf5a3be9e56ff6592753169de65fdb04b930af301,414e7a0247ba4646c2acb67849637f0f3ee8febc77866e64b65d07e447903f763277c7caaa6c2c0409090d3524ebcd36bfceeb79218d52248646b4dff3c1d8d700,08993b0df3d156bb29472ed87ce14493e46e906e5f449b87fc56bb8915408ad1293247f11177ce39c1c56de05cd3344d3bd77542eb611c6e95310cb12b3b0f4100 +41200fd076623d5a6dde2b47aca32d38b80295f4162e9c53844647014a65a6a99e80732e0f62,5c7e5663328377a2ac1c0d86f5d145e135b2bbb002d79e9cf80283794b5a02f0,9290ffb42f155cf2273cb38c08d77b35a8ff7aa7820c12c8f93f433954d651c80170273d302b5ec90ce36ceaa13a0d5be7c7d5f5a0886534204b019492ba253d01,7230f4520052c26f3092086ba51536303814f536467d9d0fef4e1668d1246fd7749b1381c2a7ee9ae179fc1542ea3eba22e4d60692a779a4c86919dcc77786fa01,9d10981ca2f5a218d7e78b1ea73079f5e469c14ca1a0ac8b8e50887a4625ca021dbd6fd29d0253d0004c1808230a6f9fd48da30782da0feed4ef7443593f636b00,3c3995e284a17306f08e8a7d022a7bc7b86f2387e8f889baa38556b4dbaea909081f3289519d8b2ca0e470e250fa2e0029f9dbeea922d38606e6b01cc7dc93ab01,0597436afbffa7c383f544471065c40803ff6ba2909a95fe587c1b4ca7e3e9676f4fffba3c014ddbb676115156e68de4a46151c8101b6db7501dac0e90ac54ba01 +63e2b6cdbe982627e1bb326e4e8d888d5511db0ea9ce76cbd9ba5af9004fa43bf18310e26762,67b3959e34fff5bec364cb6d87c5eb305ba0ce0bfaeeaf3dfb4900091abe1d2c,4f047b0bf0dde5bd627c70efc33f549ac41a9451c347bfb142baa94551eac7c777552086a61b4dee03a33c4b5aa567b1d33db20b97a91dbd67621de7a401114700,fd9b00b7854c66fc9c4742f46dc27bd625445dac43cc75423eb7c530e1fc09b362f9801a8d7b8a66fcd216772abcd03928eabd91987b38fa8f4598797479d1a600,9728ea0e8b3f237f37024ed21b894215ee938954a11916cc8028fb6e339daa553003c214851875754ea4c472afe076f7ccefe7e8c2abcf0bf91cab9b3774069000,da68b4f1296f94b196a70543b6d4270475c5eb4fd2a66c70168aa0b7a71f149d40fc5fbb1b096a1b1fac15ea0522728590bcd1478f114109be44f70b327076be00,36d6ea0b79be6d4370ccbdf94a328c6e10b15843fb08dd852dc14fc8c0aec30b3991fa9816a31b60b424ce6f4ed9a26fe29b221e9a84b69260c81ad5b413195600 +c3f7b5fcb38dd0a9d7d525ef6cc1d2e32d8e1d6bc5864349ee8a9d68d960122a8172db8ce508,a92b7d3980ac95578033e5e9130f19484ef6a0aacb15b5ae6e89339a0f1553de,18c955fdb0df495d5021d7e90c9685987084fccd0e89ac5da85351b9b72dcd386468fcaac64d645d299b57a847a62f1a02a1766d179334600743748afd2fe31700,c559a4706ba5a383f47b86e38fe5ab4580e6a43db6156a7c611773ccb31e8bfc7e337a5ebe4f21cdd25ab50831a32b5b32d8b11d999b3a7aea4cced6e004ecfb00,f3715b048fb3e6d45bdf1f840c2a87fc984e6bab3cb3eaaeda65341383555fbc0e1a066ebeb9ae3868ebbf47c9c8949d97fc5536ffa417101742c5d90f7349eb00,7bd831417686171d67d12fd8cd113baa269d193ea2ad72cce343d068ba08b5973075cf1d83b3cfe1ec4698ddc4464200fd4bf9650ec0f0879c149d24d3a27ecd01,3e95ff66d33d8824f4553c4c540adde3850f2d4184747cb42a539dbb7b8d5fc26472b5f7023056ca5d0621bebf793943ea813373d8bc2a928be84750e2e7148501 +608d90b6abd4caf9d1573ec4c774ff4a93db2a10dc6ac51b2ded4e799deb79a3b9d56fc40c53,0f44f13d07a9b4bd947e2130e3d044650646729775fa611ff96dc4e98f3b4112,86578cba458dd35f7d1531004eec6dfae8238c4cc5aad2511ed7e19e62851b0d0682d775693a985fddf1bb8b1f3910795323ffd80d5cedc56f0e37807ce1443d01,2c228064bef90df441a954d479d90182287efd8bb2f47335a0d54dfa071b3d9d7d27925bddea2b3fbe7d32fd70f094299e82c9f64b4dffd4cb52e79f93f3da4a01,0530decba6f2b9068addd75f0ea0fc8b9140bc2515adae5df62f16acf108679a22f181818a66628e81052cc5eb0c716b36648b5d44e8e49a5dedd989669de62801,6b65f6aadc797b7ece2261dbf8ff2315373e3b644e1fb616147c543d4bc48bce0fc124cfe685eff0006d507d664c5185873347e7c5b6b5f8c556058bf4fd8e0701,8b3efc828186c52942aa16749c4a31e9b13c16cf2b5c562bae39e1c543bee0ad3741cdf198f653e32291248eb88d95f1964553403d5c3392dba3ff8139bf7def00 +c966cf79deb9c88e293b4d3fabc30438492b137ce3756df516620fe71eaf85d5de57367c6991,1b4decbc843643454928fbe2790198eb3d5a50d62577cdcc9dde250fad1dbdf8,7f2ae83dd7a4a9590b03635c5a649788cfd85cc81bc15d3445757144be557cde6e092bb697b6809b6bdae83c9f3bec71326960f7bc8f54a9fa134418f796d51f00,28fd3b210a1a44845aea87c0ebbc0c29651b7bfff4818531591fa41d4e8133f001f593126632626581b7154607d993161fa11c5496411a0b8036b4618a38ec8400,1396c4875e446d02979522f0b00e1703c798198ff94f9f7cf64960c92545a912150f5e65cad52eb1756c1b47adc658fcada9cc7cb7e6736378397d991575eebd01,562efd58039394c645f71fa5c848c0a70ce704890903ada8ed0e68aa0accb67a6845343f48a6fda8ff2c63964e8964a7389cded5f4e0a261799a907a1a73adc700,56fc0d4ce7597e2181d38c9072affb587791cf2d59a33c8e6d51a34feb80c3411d48e62201972dee3a55a30f560b2cade6ff363d190cbe688fb685aa0ac9ffa001 +95a05ff5db3201bdbe0e64a0b044d58c849a9057b914cd0711ef1d3aa9cafb2ff71aebcfdee122,d51e7ab192c90fda8d0cac89d3c8cf403e091f3ad9f3ce16b81dd1d32efed296,5c614bd689f7642bfd7389598019efb2cd379bc8bf621edba5d1ae53f35959de439d42b46532ea2851ca90723e2d4f4acb0407bec47c942dfc211f1f2fcf70d801,6e38c9b3a5eac1a953c10e51370edcc6581829ca6185bcafbd2255cb5210fabd150df37f228b01271f6319c2f5888a13f93adedabe228533d161de8addbf89a400,73cda1f7c498b056c63b258f9f405986afeb134e81d256ecf000460d7519bc0a44fe4295e022a3c8a26ad88a9e68211b099cb90b318e54bae4f9e576d5f82e3301,d63a6d4f964265c368d5bdbefb44c5ade8f84fd7124182c24d4bf542e9c043270e7990f9217620ef59656ef91115656dc7f3de4bbf189ee284b3292f21df749400,bcaefd78d5f9b8560d1795c1c66b79e817af4a65c92533a1e4b13a76bcbc98f613687937d22472cef344d2d5516f13b73c9b41f72654e4f471f8540d9a6cb9fc00 +c73e2294054bcced3de519fc417632af2c429ddd7527d8fffc544bf3e99cade8d3e5f1ddb2e111,6b036d5b3d37f40b6d34276cd24e7505bb63488a5e833b234f4090b74e832d4f,6c2bb4be0b771adea343c3528a5df91c2b061530b35c3814ce9fa360568b3caf6d1a40e0d6228f6443b18ffcaf0cd7dc64328e0745bd7cc3ca9a65030bf9ada700,ebe88aac2f3e5d228dd5f028ef58b76a418343135cb4bd05368cd483314ed7ad5587f492ba6e77866e27e50fde0f129d7a240e634a6c91b68937ec1c8658af8b00,8bf6a61556c2ff8ce179c9a430937e0f3231f5dca77fb832c41f071bf891dfb112359cec020d03da5513317c9ea48c01a6c6b3b563bd3ffdf065680dde646df700,54c9b1d8f4f381f961cea38bb9bf1edca6c267e833a8dacd6175bca163e96f512cefe64dbd954bc7ce44be58907e9d0644a7ab27750a6da31ea06ff0087659c900,e6af6197df0142fa06f3ce8492bc6cb9e5e2e73f1f5a2ec91a9495574e7ec2ca6763366a322db794ef869662122c540d6a9f69f6edfb76df5d8257f1b9bb144f00 +300af9958fc197fbed4f1029040c7cc577582331469e6421ea5b869e961a719c9e0b52d464eaf6,332fdab1263c99398515a819059aaab0c69280c23881d972a7ccb22a5cde67b2,05745c6ea017a537cd4448e0b75000c162d9b650e9b1a82626dc570f1389606e2fdac96cf9a9cce1612367b1547f76c16c3bf09fa89b05331b290ba13896a22f00,637875f97d861ade2cd47fc0e16dbe1524c2efbef7fd5a602019657858ae78ad26f9c1b76c4e288c8df16fececdf468f7e8f9d4c1956cc5c49cb6140d801508700,81b530ceeed7a1a4bde6e80649247f670e242d5e4487933873ad46ca92c9e0f369136472f6560ccbd64f5c0552f97a829f07d646393d5efd6249c5fd101089d901,eb06dbedb6f3bcbeb30a3eb028f2c9b92a4a11d1c34f090e379599d1aeae05305f52eddfc9c8a5863905dd89db363f9569b287c69e6631f13ce3cd481384685101,0556fb4054debd1e2f1174eb08b0320cf541f913a6205ed17849392190e617007629bb4ef7270c1203f439437372766046ce1bbd518e7bf75f0b62ab9bd2b6d300 +c8c664036278f1836f2d95ca08a4daaa775b1e9ad311f75db5178a2c0a7fa6eb2d8808dd9dc74d,7cd2ff588e49b88b974961caa2e4c57dc4946e6732624c4a3409fc76d901c5b3,43ec4ca10879332f5f420cda9b4fe7c48f69733e8ced84ca04bc76868c6303704c9e5c7d52dc297188ab8c4a6bd96b0973fcd2018de9a30c499eb3eaf3bf302c00,86706e8b0c12ccdee09e5911ed76af60c3d7769d31657c431910b3ae1ee85eea341d57d4c76cf93fa85610d71bfd1abcdc4a8fb1543842452e46b9de5bb80de600,22a4b412558f194b82f4734fb741c0d0ca6e6c702dba92b1c6a665dd83779ae124420bf15eb6f90c666c749ff89c101a0cdfd7a10087db38fda19695bbb164cc00,475c581dbb3abe70c2b50d70246a40b4aa5290e53c024f769272feceac3587c677de385be5d3cb8130f951f2b24b5dff0bb5ec071ffe425ee1bb24534fae392601,e9e764b419b3dd86b361e7471f0eef91b5d8f98b3dac4b04dcdb095001f850df13a7be17d82d4f49ca0771842bc7a380380449b5ced08511f6629217623c144501 +6ee60b9b440764c520ffedd34532b20768d656dd438b890fc696df967d22dc9310f9472e1ef1d3,9f88bb80b4819889ed6cfa484f1dd32581e4de844322c9c32f197e46fdc53d20,edf9a34e06f7f50d77c348461780a4402cc1dd1e5a978addfe81f6a9cdb8afd83c61e44595e0aa9918c22cc43ffa8431e17b03649bc71a734b65b0c62123203a01,c2493e25bff484400c605e243d059c958c54fed4599c714ea535da4ecf56b328711edd65f2afa226868723ad9ffe8d3c9236051559e0097099b607ff88af39b400,8138a7de8db66dcff390c624a788b2ffcf9b3a2a6b461c79b41fc0d6c1e7d0615fde271da76fa3a237ba04d4a9767f75874191e0b49bbfc928fcaa29c11d286001,0c09e636461242bf96399adf010b9887aed5f1e70ac3afd17eaf6df21d84251f574377fb8225f492be5c179c293ce98f515ee203b243e3e76a2c7e5ab0762d6000,ecc3055ffae8d18f4513217f78e351383c283ff4fcf938eef82e07bdb40700c172834dcb43ed3d9224fc7d908b8533d98945c5d52435149d7a092202dde8366600 +c9a444cd30af34d3765291e48322e5f5ddfd1b948420c7a7bbc88ba5cc24cf1bc90611e3cb3cd6,b750513b247b2091b0c1f111bba0c5fd8a52f4b84f1a69aff66767aab07ab79b,0989763276d8aa9e8222a53a76eae413e69a4b47ce0dd2c922eabd25ce14178423f9f0661c330257b0264d51238b8065f67c3c8cec0a923534325690e475acb601,b7c130fb0544973f0a763849d47b379c539b0538535e1a4cf26a7524aa9278fc4645091d3c298c3599aefae5b1869479c27fab824f1fe87391ab2bae0beda7f000,50aaf61e9bbe5f2f97c6b19a0fd7060b4a91e4be8e6eb3bf8b24890ff635d2b071529a6b7cb0ef576f1b8cd192dbb8accafd2abebc4b4803f114b071f157af6100,dfeb68d308e7278b8d7c4d372c95943ed3a293ea4e98e936d945dbf006eeb94c4c369847c8ebd7ed6f3e6b6148b6dd431b05a5f2188602c2ea1ae1965bf2bd1601,4190666577644eb1fd6bcb9e5bd256c5cb01b7183adf6b97f9cd2ba327bf5179572e0ed3c39451f14f0d1aedfc90d07ee7429d101552a34508b8158a2caeb16d00 +1a1058e4d31cdb666763aa8ba161224cb2020122102e6ae93490c3685cf7a2e481328cd4f5e6c6,74bafcac8572b95acf7d9f0a07693282b377dd058793c0aabb3b513f8c4b400b,1e36633efa6b7d4d6ce8169efa8f09bdc81fbeb4b739c6d82c901a0ec07cbb3007549c4285c5d722d8ccf9f0ec806d856155cfea901faf64e4a791c6d75e0cb800,e1a348aaa7e5fd25ab8bafb1ceeb0940a3f8bef6c05338cc209c8c7a5adfb016264baa5d1f3e1c8398425d8838279558806192e6616d4721d32a2f0981d914d801,29b5264b66f74f3c8066040979c08853572a205297694a44e602d25d164afe352cf8bf0df72ee2e675bbc46455430b6d1eadf2965ec1a789040851c111302fbe00,93c422a0ba67242bf5a269aabec129494b52858dcb019340a32602741598b8aa35150f045004a4a09478cf66f383e7300a4473c4b4a5ca7032c52f1cc132391d01,28e6d3684ca5b1db6674e27e690c21059084c9f93116552bc32c2953dc578ba82aaaee220cf2548853e0035d21e94fcc5bf570c9ed160f36728174b507b6b2c700 +5a7f42a059c97929145fe0326e0b97938d9a3dfe9ca0e1886ae51bc1d26e8a793d6c2fab3c2282,ab7af5d852c0b8fa82beffa6b6dde09e176815afed04d93921d143a4c14ad4d0,c883aa53ed671153a9671be6fdd3f1948273e1c26aad915ab869c6553e3b00924755edf4193e63dbd889bee277654fa9978498b12269c9628b7843707b5d751700,7312b16d7a1c89afcf38e42ca7259d8cb818404ae4db67ab2e5174a81e8107763dea787dd247aa68ba20487eb16f4f270aa629dac3d3ffbdd27defa5179a0e6400,e7e702feff37f125212d12fc7348eb1e6c829dc240d48d7169ae9577fef601fa7dcb2492a2adc4ce5a5d0687d6e372ce13b071ead32611b49a05ce72acff49aa00,1a8c26d1eec703313ebac51dd72af2cb14bfac88d9eff342fe4899ae4803d0c133b612afcfe08c5bedba2c241f20cd76d65fa08b89ccb577ea18b3256f19a47401,39ad3bc792eb1c605742de9f1c0f0a97d4c1ae7a5db0c49b939e9b1c19584110147bf1eafb04f56e98aaa6a86c57f3116671c2907013971853a4e0476a9b8a2600 +9e38321c150dec46b85051593156ab89bcbb3b2c3f81a74d95a72de112c4be274fcb3e2fbd69cf,235ddad3d166f0ce40a0b82da2a4a4c4e37c8b0a39eabe03be8d945c5d739ea1,e5db6bc60bd82000a040df732374ac2a69a08fc9c0e459cd5982691e3117ceb236432e0dbdfc07fe6e0f24d42d846729d5f2ff4143ea20152cd6dbe8c05d6c7800,a9771ca1f80eb8c3f11113db237aab6cd6cca6ab5f68aa50132271a21ec25fdf5fbf4586802f555fc587f81b12e296827e055c1d5fa8a1b93fdc31fa49c1e17d01,dda060cb471a489b01eb89ed48891e7a66a57bf5ee9f0339ad78554428fa7ba04cc96e92628ddd0374f0afa36edb2b3cb5fcbda9fd2d2f8a6438b5faa16f817a01,dba51a5ac20d9bb7d93e3a211b52064e9f75ca5c2298baa6a8acd982e85607f126262430c2177876369b3571fcfe4111e091f9e780d7058355e426ad5a8cf8aa00,62c07dea59fdacdcd2f408ca903e3cefbaa060284ef1ed195ec2a8c53b7677833a2a8ecd03edb488ae8d520d46d094829f9ac7c4b78ad1a89db647e60566341901 +158f8b9a3889edb70ac8809a59844a21cb62c3f909d971da1b57d824f4de7024b73b21ad9fea65,c94992a0b0a4e4ac0189e2f978e6fc7bfe5aad5b2c8371c9e3927a9d37ad44a2,b060a72cca70f6ecbba02b0dfa21d12e484418c5e4f32e783d8e0ecaf83fc1ed19852c38d05b46f5a1c2ce66ef72bf0d6b419fceabaff62ff0ab926715cf7a2f00,c206cc46105dbc567d3e992b71b94f2c362335038fcbcecb880f005fb29ad06e6339adcef1d2b08bfb42f1d8ee795bd5d4eba11cea3daf8e49275d529781b47400,1bc361f8efe3afcc0510b02e9ab2bcecb1a1de3c041f18d37f6435c58497c53202d4842e3898eb2fa26affdde0094e5e3fd89a864f49c3316ea692cd92d643bc00,22ea93c46a712b37f03e63a5a397afbd5de0ce112382a614f2f63abcb3f0dead63ef4b2105c12c3edef9086f850ac0e5abd62415ea4a9f69415693243dda513b01,92a4f92a3080c271c8b3d8de0f463f6facac535fe8bb0e42e8421617cb89256d0ddbc430ec837018534256d5bc771473694e4d9e2a57d63028297b92b3e2390c01 +4d474ec657419365e1b65a9340a6d12cf973ccc50fe014938ad28875f9410d963822ff1460986661,955bd928fb6d6d4c0ec65eb919969bdcdbcf9ed88b8f63790f834302b15d5e5b,8b94f2fdadd56e85a00c663fbc8a5f730551becd3fb0a7115e7db9e69a8d2ebb2d0c2ce07335854421d6d54ea5597cfbfddc2517c1e650b16048f5d2962ca76801,1547a37764eb695feafb9945e41d414da22b3da5424997b241a6ac5aa08286767b4a8cf88458d6fed8cb2b43053967d1421ac79db5b8c5554101318a85b76b3000,79c49ab9cfb8619e2670602cb4dd18359da2685e3e596ac19354edc94a738f583792c7c9637e6dee91e5ff2edf9326cd4d644a86af00f083561708818c4b530301,cb8c8130cff17ad536ba4b85c868878bcccd8bbcaaa93088fc863196b62483d04d0e7b9214ffe312af4f2b0155ad381a8ac88fa7d663dd74c9cb35b741e0b30000,01dfa1a3b7b6db6d3ebc2775bb428a8b08921813e0d757572dd6c323e45c002409e4d799a49be4e98d2299c4b7758a34386bce02b13b97f4e7ad4ff03ec738cc00 +dd2e4c327502ee714f11a02bf23d17582cbdb12962613318449a52ac70d0cccec4855a3e26987ac8,729def3b38aec8d68a8801b315c63c5f17a121cf31b7157e5f88fabb90941972,c350c169c1b6d72f7e9aa62159307326bc94b3fc7d41ce7047152a29dcc2258253dbfa748a50e20aeeb88cbe81a6676b68108a8cae91690f5be9b8de51ee000a01,ecd78bd54648e481e9b8736c8da0707db8d7e8cd7922acbccc40e094987304995a378d9715dbbac81371ec256791fa76c2a9da1af38f6bc213db51900fe1a41100,b99c62b12aca72d080df61a662f4c2cec7c5ecd5cdedc139fcb9936d1fd87d832830a307aac305a383f487efe694ff14c36724e97be725907c6bbab7906f2f6b01,1bcda66c506590205e90410cbd1d6479c5cb2451ed9c61516c9f4d6f2a7237090d484b7c3900cd7cfe8b943654d8d352113846660feba696a2518f0cb2dd2c4c01,62fb759ad6b328ef761843deda0ab8e3e37b274598a7426964986212533c79dd44cf32aa077758134eea2e91659aff759d9d87a562eb1244f8b73e80cc2663be00 +ae3cc90cbf3b7d10139b7e3b5777ada208f6ee45e849b9e25c3be8ac393063b5bc95ae9d0f0542fa,bd5f6f51b198f36fb1322e0f0c0bc1d33aeb0d26942ec58bd863b6fc0f425fdc,7efaa4a33d2e118c15c1c9ab5de599f92166b724b483d884bcd12f68178cf0c25d6c3820ecc2aa626d5f05eb1dec670b0899c1b51a1b649a2b5e45739d897fb200,fb172068a6fddb4bf8d44cc177e873d7ef4968050e7250c2d2ce4f294fbc1e0307b91190dd079164032c3cd309c7cf1fd552d807ec40577b043396a336ef00b801,36cbbe8a444fdad03d3d5d4eaba6aff6a90165d953e651bafb828f4821e6cc0f22aab3a278928fd1ed44d265d69c6c2482adb771573d2cfe035609fb0e8ca8c200,bcc3d25b838fe9f94a2c22e6efe15e18c926b9acd8663eefb714e601b17799651406362632169c8c5502155ad6cc2cba9324235da801fe00542d8974a06db91e00,ad6479633f6c52901463c45d85a04bee48379c0b768a7b8b12f31a896007281068faac630ab2e6d88d9865648d41bf9edd5bdbe7b1dfb7f5a7944edd3bc46ebb00 +336fb2e6b4d99999f22f0e5cbbe7099e7f4f641ab820fa6347a3def7c8c68cbff41ce9bbd7f2cfdd,770bbdf785452fb901c19f41c5f48a48f60e5cb6207d7c63b3822f362c533cae,0555cf14e38975b992714673385dcdb4ca08372f039adfc5b7d8c3dddd78f1b84e45dda24155684f895791347e77c00323a535f9a5c93cdc72bc0eb5d0028b9b00,8040a97d690dec099f02efd41ca361b0153418643ef917802bd2b9a68557cb0c35b6bcab1238a6cf1cb90f7ea18e03c3a9e79896c4db006513df5d8583dba94200,1db9cc274ef42442bd85e07dd9ab85a40338f932573cad14ff6f4b2a52ee7c281a81dd6b610bec00524dd64ecb07ff4f9b3cb5912be88d04af10b25ca89b6ad900,56262f3adea40bb1a4b9599a52e2337aad65d80c578d35a5649bf89121c8869c2d7c84cb7e72ca5b99b462b82b1ab0ebe8b140918b6c082244c0a761df58f8dd01,9662e9610a69f1cf55d47a25c6856ceed050f35f50353c7537f13168c3b60ba63e7787145d9579eb4070deb6672f4eaec970cf563bbf77ae7c435e6707b0cb3c00 +32ecae13ba3c0d284081dff5eec4d5d2a07599c5b2653274856d1bd966c4347f6a4856296896f939,00d1f5994b019919864f142f02b1c0c3cba17a6221a0d3d0ab74a142f70ebc52,9cd190de7e70fba1c2086b8d38c382a7a4fdcfc78ea1cc7aafe10101a0ac98404a2b119a32f45926df86a0a9b784ac77d857bd0f0bac35a48acee12ec57afcd901,373a412e82635d38dfb4014e738225bc76adbaab236037b2386750702ab3965f0247558b6a0a6f29ac39afc1af80d728a35afbc82c022a354893db22d5997b6601,63651a5d2d8de0a109573bc5f527b42ce63e65f2c7a5a17f42e6f043f48993150138998faaf59327042617656935757026b7e078a4d0103d0db62e9c7461a9c700,3ab0d4b5cce80cf292d14b00190552a41830e5180397941bf463f76be134190556d1e55eb39607300696feb7297639af1e2d94f0d89fb73a795f9324ecfea54c00,01fc20c63eb9b2f6a30d4d04b727ac23439d7d4b3f42a95d95f477622e838a4d499c218981e35747cb2ec157a3d1ce3ddb2d9590b978676b21bc8d285da3a0da01 +f4626e5aefdb5dbaeed202c1c2a852bb682d7b6175f66ce5fc18697d820a72097a4c4f6a6cb1251c,a37d28d8c68b7232a638b677d76b5b90a25840f883e4e48852497aad9a0ceb82,4c9a7c208ac32747d0db20ec55c90e43343518aaeec183f9e71fac4b1c79671d5c9c8c16ee3c55827483d0b6240c404475f2ec5ef235bc576f5fa2a6d85e953800,c731d86ee7cdff01e350a5ba3eff7ba1ed208c2a160995d035d923d5d793cb3901b4d64c60f46521d9e328bec44e244f1399a62cff05c765969fec2fd46417f400,145726d5851b893fc93275c91fb74c9ad77aa51f26f5f9c09594f0f42c9489981fd4bad2c2127db58bc952123eb526b08807edb701d837b869ea3f6a1319313900,6b975f2ab6be1f1fe78bc54e801f62e10c223b1b49c851e200616b2100bab8152e50ba43a107004286b6d998bb78e5a64548275a697c7caf77252bad88714b1b00,2e952fd83ae5861d86c9610c68d66dbd0d3007fc65f07568c1442579bf73edea083e62e8e08f9be203792f2f4040165c71028b7a900934756eefd2aca5bb1e4c01 +44e061badea45199e973d6c60622efeaf4c937f559d93d60972a6590e67ebcbfe881d05c17869802,4e86999013bc99aa8aaf96e70d11356dddea7215e96c433599feb4d435119554,22a02ce59e6b4425e9097b0a768fb27c07b6105d28a4ab9bc95707652f489378333bf3371a9fbd7b025cddc913b55e7d87525b12b0dbaff4ab67df3a9973ba2a01,8cd505e5d56d324d582132ec7c7d3e10bd04dc1520c1f13b176a61011eb2dbf11640da3d462255ebc91c5d50f8494a782059920bc470aee1c8e9a5ff49f9934201,cf16a70e22f237d2d4f0911d2db6790c0f962ae2cd961a65d0a33a02dde783f1298665fca55a803ceddfd2249006690d5bbd40dc97713e5d986e777d560ead6500,7adec7a049998090663fa37cdfb544e092c7624e0e3fb261be96f32ac7ea7c210dc144e62fa3df8b9d56b1b1161c76bea61f417964791f26d6d385d859a7458a00,57720451048cf5a13d2e6f5007f8d293b7a4aabda5ff4ff265ad26f769b502f1507dee5e04dc09d2c90141473d8655a59ea29904550f0560ffa88a0fc960a49900 +94a82d47eeeb90557744637d2533676d1c949a8e35349755d358b36f863c4e7cd567462aa5737a06,a024420ddcd8e98cfccb319aac0e94d9eb2a5900e60c58c29ad91aff0e5e0db7,02afc4694970e635b3cb1a953870b471e6c140ec5777ed3cbc1aad8b46ddf1953fe86b65a0cae508660fa368205c69fa5db2cade3c3a4c83a272a783354a8b4d01,42e4b19f1675ebb10ecea88bc215c8a4670ff9c69dc7a07fcc30502900f3c7be09f772ee499a4d7929e0c54a5dbff1346290000dc7eb903b7c1afbce05e7b1a800,aee33f6724c8ba59d9a9d3b4898df1baf17336660ff58db69de4bc1e3277f95e5c977f604fd960535b01f3124ee88911152a67e54a6ab6082907d5626eea87db01,90d0a71ad5eb6519fd0e40e9c7d98ee4125b5ffae3fd827015b7102f3c8832a66d9a747a816f2f343e690eb8ecc4a1188fffd70348fe0373c78043ae07091af901,0bbfab385b365b9128455a3c13d18e72656acaa405a9becde484c0157e70f5c738dcea8d11e59063a3028f49a7e17d868728007ab8da3a4237c0609fda1f752d00 +fdc1d5768a0263b58a85fc569031b205d87fed1ac0300e7ce5ed6411d2e93d6044531063c825bbc3,12fff1dd2b798b29ac75004b9ca6273b3a4fb7297772f0c7ea0a8a0493f2b14a,b4c037bb510ffbb7a536d4722c5a05a0193af20aab0ba124843c1343fb8b5ec55220a32a94c227b68b1fb1e9f720c627b775592853feb1454f0160a4bc633c4d01,377db18d43a810b5ed78e545cd1b870e968466b0f82a5edc3fa44350625e7deb64da96f64b35ed78457db0d38eb0b2e5d2fd8d438e2115f3d4aa973f5181ea5801,538b064105bd67dfe7a2b8259ace33b6d732b528b45ff70e8e111ede438540fb372b0afcc89cf00849676da7dc830ea2dc968e4eabf8087d6824f48f5344b15700,c5702aac8178384dd62a4b0767711cac364cdb4afe6a8a370525d5c705fa0e9d40a0781e8b7f70c10d900376f9686a1a898300d4c52d42b2da0079127b0e83a100,08c4246115f5ee9f021a1d8d9f4f159e09c4b4fb97a8bdf0cc3628b880864ae2290880a1480c8bde4943a66219fd6cad765437d3bf1c01f7bc60c0244da1c1ba00 +df12167381ed63113aad51e193370c3789586b8ce2bbdfa475d7f995c412dc78c32b17c51943fd9f,5c3947073de7544da471810413868ce7f439f1a7b18a989320033b317488f56e,850563827fc35bd3b7fcb5d26e7236291ea7f33e55e4ba9998c44e6e9b804c894dace336698a325d1a34b8c33235e1c34f8a0845d3dd7767b3684b58b9f9bde300,a4baf983a5480aba37357b1b192166e5bc908cd742d38010b8bd1415ce14b3e75914c5c17933f8d5297969eaeafb8e8f885a16133e98be478411eb71c2fec9d901,c0f31758a923befdad4b1d8910b7f49ab0ae8ccb4a2538c4eebda9b38bb028f35b070dd26c5ed3a812b03b3d77134025d61b1c280c3885b6a8d11b6ee15e08e101,ecc8f7a3629d72936ba2f82ad410517bbdc7bb5a0e99b24cf30cca619a29d49139659b6a8a8920a10c7c5c8eb776ce3ed709ebabbee6560652eb2857c9572dfd00,212a04bc300a1c80b37996d46cfefa134244e9d8bdf9ceb1dcb914afd4f72aa357e05983857f8fcb0fe79b14777ed39238057f8d3115ac9b396b35432ccc48cf01 +ba304e18e9b1a0f0bf7b4a476be23e4dd070c21ef394b2483f1ed3734fafb7b66709a3c54548271fa9,bfda4c3df4732ebe2e9b351baa1580bc21653e7b7272a545a8e68249d557185d,14803e36ed180b0ead67f190f997b11ae713ae4598188d3ab10117ef7b866d06402c326884e9bec55626c3dd123ad0961dda5269b3274de80464882afc162b9300,6bae38f62b5ffb25a560634b777f07ce4d33227c7ca2e25d514aad553b3e2bbd687567d9a400df4d8bb7798b1e082f52ad61e6befd2bfd290d2a841ffdafed5600,f461c8e58ac2548fe181ff4850fad8b37f06915c47627aa7fa93163680d6ce445bb5f7293b61eca63568fb836e23247f42cf6e5b5a8f376cafd9e34b0bf2401600,affef4aca33f16824d427ecefcb4c145c50ee5b610e161ea4e09e10ac184a66b4a1b2684d1bc937b32105578b6c351beaab87222acd487d76fdb22f85f865a3800,d9e7ba99fcf3b72b233799cac0fde9d49faba8474350ccf200dffa75d4ef7fe22125f8019fdcb8ce77f3926a9f4e6d2f762ab0f2ededa17ae23ec2d491d30f3901 +80f98006c6c89a60b8681c0175cb0ec89bf4110f7514fec62708db202e8568b60fda6c67d674334c4e,1f26cefc84f5e2f4fc96881945a65fbc1422e6c6fe96f599d99a660f544123f8,8416b3e05fac0c752be4c65846643c9d2ba8d97627fcecd7a07461f870222f9f49ca47392984d01e52720d8b95ee95f61cf2adce88c2493289b64126d83be37a00,77e4c64787e88a6c5c369bf5fcfdbaa342e6e355ec1b5cce6b39f2972879526202304d0f7189d85283a13c83267d0ef244edafbc1cecbdcc1a6766b425085ac600,2a00d055eff0299cdcd76c5cdeace294720eed69766076dc375e5e0a0e32d05c11edfe711a00a888c3fe0af9587ed6da620edf0d35583773faa5d84c07df6fa900,402488c9d86934594f6b21a913af7fb1403e3e51afb5bb6763bf119f30ef956c04eda77d8630d1b6bfb213f31587230d9277be04a01fd08364fffe74c725e44800,1ecbb6dba4aa433362d21ef10acac348b6ced98214e29552f92c87e1941d8d237936580f0557c36598ec525398b48aee9b1052d8c8a876374d51b4e0471de35e01 +b2f9caff8ddeb5f09f8c6919a6a98eb5a9ec46792192ef225902eca62b2bfce9aa2582c313016f1648,3721e2ceccb718429b37e713ca1d07f50affc208af2c8fe1aaa438ff6c468a5e,ecd88845acbff2f20a5df2abadb8883e2fb9641806fc3b4717dc4c7976841a8c6d246e55d7d59a3e078f061e081f55273db28ea932750950a1aba0a860df37f901,a230c98d2bf506b4e95f626f1e3820c4d494d07127c9561800d040636c0b844c3e2270beee18a07fa257959d170a5c769cf878b1778f9ec52615df6f627d924b01,bfbb0bae3d6257301c63a55bde09542d7e918d0fcfb32121bc7c8283178e374f5be9fd7b16e8d4562d7aff0e63e363457de9d66438f96c173c9b79bded11d59200,a8615b8ad4e2cc74455a0505db698b0063f9312ca7ceb55673654c106a06bf7610951c91a77964e393f0b199ee0b0a2259c8d4ce91fb0484c41968ee2b63a35d01,dbe600d6d0e35963774681ab73bcb4d11fbea53cd6026792b025c63ed55e024410f891760391a7092e1509580d813757f7b953406302cc574ffda34961a755c301 +1b8c9e2b279d9ed6faff6648a68ee23673351ff08b789220f079696425cb07ad70f83ba15bf994436b,90597e28b074f1f3e7087d2f88063542db4297382a1c624c1d21d78b03981d8d,edcec3f7ec5e8e4f174ad8c9b901411a16932078b8d23cb42588ba4bd64a99146b614061dfe85678668e58a8a65acb1c1934d68306dcbf5146f607ed4c1d7be500,2d6660f8be12c823ecf7a8cf27b26a3cb1417fa775b807339277b01c923b70380ec6e297f3a8787829a5461b3c8257913629d500a44aa9922446e3fe4cfbeabd00,dd8008e7ad3e2e4d9a7a369bdf1a7f955bd57806b073e6b71687f5fc806466d848f58fcafe96b9836dba825e8a27bd449f5ea7fe16ad81340d0b51596469db9e00,5e99365396d61537a14ebb2ac8310c2f792c8e07b002994e82c6c90425c281e151e023e63a1dd897d4c84b630a63181c77c32e75f4ef9c1f4ac8048389a92e1d01,f7b49cea7e0b49e61a31e822fb823e871b2754db217210db64fe1af9a4cc88234a688f8ad6e0a9aaa2bfd06896758446854b14c3ab050d90cb705a106d2829d700 +64129ea902fdeecd340c98267095722e627a500a23b3b93a92d5de37cf263289cbf41e4ce09af77fea,9d6c0c56afeeaff322bf32072db9e18942493a2fa4c84362f543c8b756385839,8cd9b858a897bb8236a186e7c6f2a1fa8b2506b5ad2619f024206509aa35090e77dffea09ce7b3ee4fea0eb2c97857feb60b56207bfc3759863b152e4f11c81900,1d1ee5d38a0047a3b2d00fb2f17c98c80f0db4938603c795ab29887066b7b8b56d625595202085585605f19848e66745309fab24bbf4e13fc1ee19767c4482d501,b8b07dfd37f6514110e52bbe12368c48b0dc39354cb7ab9fdd9a57a6d296b8c11b7620a90dd7124fa7895ce5e533f714cacda06dc3961ebc6b6a7b11c55affdd00,657009c527bb165463f8ad2729f79c31b6e824d50686075f2ebe4fdd9639449470ecc60863aaa510ccc026376418736cebdff2ab49f59b85ecfb2aa9a80fa28300,b42a6bf9ad56c2b8af6923b2256aadcfdead64287800c20609a8a403df237d0b6c6b2b879ac7f6830c3423d1582a717c42441ef196f43c5153dc5c5990cd389800 +e8a53496471ce90ea03bbad2d2f94875c92e37e8de0117bbf56d7b01a75e67c061f25bfbcbd28aaa3b,c0091f531810ffdded20b047c249df48eafc11e309cf8ae1d42acf1c64963531,4a2abadc4854941ecd4724dfbc1412542c2fb63831e552f44c031ea66640ec96504dd0d1fdc6967fee53dbc08cb40691795bb77ded07f6a11ce5acbf2125347b01,cd84ab9c47762c65d5e337412df3782e29a7dbe99d947d5fea5632afa2b1053f1b86be355320d136427534bdb4ef8bfa9e1f08521bd5afe8558813283b5b74f300,fe14618c5e4bd3d6036a557c7fb4284257d94bd997ed0a937cbe304f4f83a88115974e056c62704c45ccf61c9835c9fd81c741704c9d95be7fe4b40e2582959300,a07128072a406b4ad04fa0bcb8f9c304bb61b671e7d8dfb33c8f6e6184ddc9bb30cb4e7ba47c46a51504905b5d5b8c33b1dc3ed59e5dbae18d89766c50d0b4e600,953c6402cb507d799c87b1e35c9df3c521419d91f2c20b0c97db15eca0567deb58f1b3e518195f2a64c29ea9afc11ef0f9f8d207799f7619ff37a84df2ab263501 +4bb6ae9e4f05a90dab374323fc67f104c14a810051fea59e5028caadf0bc42fbd14e4eecd5442cc9e9,7484c01a83fdd26008891d322897b859cb8b8bc14059fcbb9cdd20945d28736c,b31e96b6e8ac77301661ed8601686ee5f63a2c21ee677fa5f2aa0e62144b00c50f60ad1ffba6c5be781de0a36e613861306f481cdfe91c738689bdb5fdb5cb7c00,2d7bfca542b127e561f96bae4c7208f3e364447d3fe72e28c9d3ccfc992e2d384ed8dda128066afa34c7edff51e05154ab25d04340a25f8e36dce4f1f693743701,a2452fb63c7c2b9d46581f760508735dfc99ff215f51f72890e6e294ff20f183627717cb2bc50ce7bd42521430ca02cd94ce3b1fabd9c0a51af334894bb526c001,1bdbb157d0886968e6146af6c7d571a44331020d7817cbea56172690f2bd1fb85c35da69db87f53ceea448bc64b49f167e7aa38b00e7b88f33c57c6f6d4e54c400,4a82cb37fae1aeb556c9cd59ec4746fcd8cdd3c79dc5e1b89366293fbf404873442e2237acaa8f7fb2672a6e932286c020949444ebb3a21e0abf35407dbd07b301 +2ba94e4174c70864864c07756966336cca10f5ae02d95da9940479b8bbf348b679cac093a692261906,320b348d6972c463348917c627da4b52d8c5c97f11310afb0055ae329334cb38,fbaaf32ef904b959e04195fa31332bc196a66483acd87016f7cff23141dc0b3d40efdaea7ce9be666290a6ca8c9311cb9bd00df8c0488f40ca8e4f1475d75bb200,b723547b230b81b7a443205c94f16081354e98a1a40c259cbc2cb7fc695fdeea543e6654a1d81cb259323dc5877a9b7a37ec28f804ef6653632fa1afd4fc492b00,ec3b6da4d8e0e3fa001eea8edbc3567b3fc313f64dbdc0b37e020a6f856d38a055c6c28bb759da5e204a2a7ab914f299182dffd30a5dcee21cffcf3f8780ac5300,196e5e5c183f4142acdc305a113865a61c2c12ce7b7f0ff30c92c2cabafa11396f3f6462e009a4fcb7e7b9e8b208c661e5dff75d502d8bc1ddffadcd9c3ac9a901,75218155c31cb669df2b510ad662a1b90e5a935a960b0ed7ec209f3d49b7a27963d906d8c40ae4da9cbf1aa1c21ded8814bd1d875a7046d2647909fd9dc74f1c00 +a451376f9f5a294a46dd04d2c85c905217faa4785b4751c30eecd5fe1fe772029dae37a95bf0a7953a,3d6851082aba84f49eeefe4503123f98bf0866204e3e93b9825382dc26e552f7,06a805f86904d120cc5c05cc9294419748de397f6514f5887d9681e691b1782b30183c6d8c8746a82d528e959fbad20e11e96bb9ba55fe8d248a26c2397adee101,05a6dca03224a4d149aeb0f700088aec60f138e7e183706cf8d673ff3cea4a497dbe2c333eb174139f559a56204ea64e8ecd2b4a653cdf12d9258084be5efa4900,f7ca20b810c24bedbe54e8be5c19416991d6c33ab748be31743e3d9a5579aca2498aaee214304df73e13152043eea5abeaa2133fc858334db64b8a1b3e131b6100,2e725c4cbfa7edfce2622fe7668c917213bd2745136675469d19bded4c8124b67d5b7de83e8ef4daea0ecd1e97688fd223f7e6346edf0e3836dec7cbee6f14cc00,f5580ec73108726971bca16d193a13652489d0509b0c2c5fd19aa39459adf16a324980df6552a085e55b2a7c35e959ba3ec64d577fb120378c0069d17bdf031700 +f0eb8c441c4e3fbf479223aa90bf0c250141579e3aa05ef4d2e2cc63ae18b572b42cd27cc8effee23e,95cbe11242734abd2bb3ea153f6724c96d3bdf56328f68a616f9d73602a28e4a,830976590365a0ccf079fca1f676e0ed04e7bd5151da74342a54b3ef7e6199e030f37f7c578506cbf8b663c7b4c459202d47b14f770986707845cf9982064f4a00,47d239304e7efe5827131d138e1136c834a42a3e557c2727565d1c22b7a2aaf467d957dfa0df5adc783e2e005d97b26ef02d600bbb7324a064131cc9842cd2c501,f1a3d62972a90c0694b648975bf3f419de07843823695f88363f1f8be03f17b31c1c15c60f9e006c362a7ae99aebfc8299453557301639ca8c81ee1c8486ec0801,168cf214a5dc99ff33762deeecff158900cb70eaf3dc483a43f4ed97329f0f4d1ba3aad5c1cf9de36c3d30b8947ae80fa784751dd9adaab8fdb556d1893359e801,848b58d106d1150e83efa58ae0084e2c749c703b3f4a0c677cb29a8fbab948d24bf07eace4895fed8e280c62a0c4c3af6391c3483f6cdd68632ede27209576c900 +084134c8b7f0fefd12a06b02fb6fa23d62ce3282a456cb67f028defe267add54ce241af0908e6bb78ccb,a466d06fed992d90ae9e8d3f451e7b3db948dd95ea1aeb5b836ef60aff2ca5c4,a996241a9e11a7cd6bfcc2cbec8ea214ba37c27ea9f49d27b57f08131355922642f7811003cd730fd662dd358e4940a5a8772f2c93ab4519fb16a79a86bb856000,1ed6a749cf3390c1a1ed503e91d6b81b5275e7c9880b4fda0cf406e133b497e1642103710378317d8de816765075eb5355003b94950470b8274f03d6a955117700,68d7d05e9110214d5ae1c9a36c73c0c2259f61e09353129a0ae40d1b7ffde222767c5c5375d156512849306b7731349953221d13f10934569a4b8d068845119900,feade43b00432af8cf0adc48828eaae8144b286e79c42fdd6a33b1a75d670b05508ed02e3a061a7acf69e567f975774f57658947abccb2d7143be0b9a45f136600,5f0beab59a9af57da5ce1eea685352168403cda09bdd8ef253dbed75cc9de8c06c5c5edab237456f61c03102f29871b3403220b93380bcd2909158391613c84801 +5f3fc5d4e6690dd8b4411ba7640d617051a32ea486835eafd25ff06f127cb8220361b0fb753ab5d978ac,1b2717d8a1b79d9d5f0187ba24f57fd3e5bf97d9db19af20e717b6938d67d0b0,7dd6a4ab053a3f00e5f56cf72fbae50690f4082aa80f5a6a6b38eb342e3b2f097c68c47de1c9700ad38b46beeba99b70bb93cf7e93949303552ec8f048d436cd00,825d06a96e811c1d4aed2828a9c234c1a05ad02a116f0036c662e3c6e205c246416fc5a4fc971b485ab12f617e67fe5d89af45c2e3ff05bdfbbc1f635f43d99f00,540d1d52f8eda049fc28928817c848b209b2d27628d5d3f7aa6ca6eb6929f2f15885c76f03ed5840ebace78face4a29cdadcb31cca8b7af2c3185ee13a2efe8b00,c69e7b5f961385a797cae94dd5fb4c58ff2d35be718845b87524484dfe57729d0e7373d76f93fa52da2fda06e7a20559d063332be02ecd0b221725b3b8c5b5d801,4ae73060bd8495ba19de5d0f4f1a785a50aeb0b8309445075492c09d25748cf3532dbd6c1c45ded411f0ea3ebd22996e4a63f675384754968a192165b409c11b01 +92a9e8db760e277bea333a1ec97c44d1a58ca90c77d7ed15ccbce86595362296a2b57d20537e1e6ac915,6fe9e812c89ad2b511945a06eefb3e9925fe408a784b2e45bf2c20036a38511f,6f5390d27ca61aab892c30a2f19644ec9944a921962746d56be9302e3449f9b45e6b0ccad50cf9ae885df0208da45e81af95a3037b67bd63f7480bf89941fa9100,04d3e9647440b5913b998062d58453b8f5cd9aa5de43416f9defd01075bc41d83f98fb727ba4507faf42e5dc567f1c3c23fd4033734030772848dc006f9b4ba301,6610b789ba8fb2609abd5b3448f9bddde8b232fae2e6445a8024dff17de842fb42dfb265a4525e1024759d0cdf24183321bdffd89920fe72de26e530a0159a4401,25e2ddcb289dd238e8b8b9f0bb710575aabdb9d6eb7453cde5a875234e6f531148fae50d5f653024a25fc21511332d2f7336c52e5bc0af0f9ba0df6a75d4b80300,9f458b7d61bfa80fafba3415d82bc70bfbdd43d1916956cfe12e604b220dc5bc089750700f0f93f13e805d8e62a4dc4ca34353e41b9ce497a5e94662f74f2b5f01 +3f816f56c4f60e54677f481d94b3bb043303060fd9b1a5fef234431f96bdfaad624ffc1d27c663b458b6,a1c351457f167cf2704bcc7200bf613beb344e5a5800c1bcd867b3774b240588,9ae067c2e1178c505c07b0733acc4813a2e16193b1047c65c6aa2ff7c6b10e234d246df5e4e63396142aa46c5627bfc8205fa9b0c70cd1d483fd02328a6be48c00,d4537b766613ed656b32892c9653bf412addfe0b69df36987e44c462e6b702b37c8c64e04d04986b273e7e11bf0bdaff78ac542e3885f44df09dfe3ac252564300,1390bd7849b5933346b9192c796f0886796e58e8856dce4dd463ee60078b30e36deb00d22cedaa054ae73aef34d5f4b5083b361aab1704f1bb14966695f5917f01,4a5b0edf728da2eae8c25cb2838853eee670e3a09ca2f439db643244f1e05ca77e0459e7e0451fa3591ef99fdf6e92ba022600e529e2d24c5eaf845b761e68c400,78e65868069119d43e1938a9500f2553d7f3d64b6f251ea048a47f338cf97efd388fc2116a43486250405465ffab308fce821b8a940723318c5b5f74ec62069c01 +434611fd5664eb1409ff9bb8d11fa6e9a23d80e0a3f985cf771c14e322e3927ac21f32564371b31b23ba,48882f25dc94ecc9decdf8397419378226af8550ccc13e718a9cbfb8c6e137d1,e9a75ccd6aa605ab804bcfb92a49fa47cb4d7bed3e1ba8e51a6977de52754ecd7eb0c9900b9eac46d0516fe6389f3d7aefed26e3b1dae2308bd81f9ae19e05b700,26add141e61a60e42a99164ed7b03889b267369cd7a4ca3c67c38132deb9c00a0108982b84fb973f8c772c1e6080215976a82e6ba86c1984b3749acce8473c3101,443d356b8498d8d08ebaf1ae041e0dedf3aafac9328b800fc708853cac3531d9287bf19109c529910049aec46f24dfc9187475788c4335985f34f1f65d13f1d800,0fa63a89cf72abcec817d2c37e19f18d9e56f8c02881aa4bbe4c58bb665862896536dfb46d739bad321744a48f28514087785261fe66163eb83f193d5b21950100,d1bc489870acbb7f0997b5be7ed4599c8aca3860f71b229e91ece0477aa990d94d5755cf016a2fc4959e3fe9c8b732f82f11657af57e3faa642ba8c3f43b960000 +c1b60aa4649f734558ad2e99632545947cc737b4cfb5472d899ce1950da242cccd018f5a3180ba14d2f6,517b09534856a15bbb730bfe88b2566b91694963d0ccbdd7e0602c1dedccfe15,90055defbc6a7bff2fc96ea9956c94e0f9484f4d53fd44a99ecac3b17ef5de591ea5c197c5a059812e4a6e3f881fc0bcd5cc3e7f2061abf1638461abbf4268ac00,b57c4450341b1a7db136ff31c4f98fdf1f82c22b49d3aa5e0f1651d7e110712375605748e55f42b692df56563f18adc71796b0e0ac372c618148340d10b528fd01,91a933f223ab3778923f71a7122d6fb9f141ec12292b4fe96ec8d51259b1369c7aa8c6c6cd3f4b305305c6e10297d57b4c7f6bb9baa9a0e1c248d8cf843f175701,7640e404be134ebd99e91c93bbf067b30fa63f67a852235b94f3075a1ba11c6e13c9ac9381bb3e206a406cdb76416bc7d6ef0986745c88c2f42f8d4b0cab23c801,3c66bb0614dbaf5bd7569d24f76eb7492fa31df30e66b54bb1854b49078a50842ba65fc95cdef7047826d3ce8dfc73a10367d8daf3e90287225eccf803b5772100 +c6900d90c05a3e421ed9924d0a3371483b6ba3ec79277670b81c2781a06ca097da69050ca1243f746097,3c3c25bd9b2c3cf1eeaa9d64da59687256bd763278dde6e8740d9b3aacf91bb2,0e0c04502e449b9e1f1f63c10be970b3d09330984464c6f22f332b939837517b0ab9fa16dfee6e8eb02531a9579fe1bf95931448a83ab441d5e505be5b5eccb800,03db9751958d7d95b135a24f02031234009684ce9360705e88bd8e0925b84fa345e16a41ea2316b69c19549aace7450e2e13d1d3d914db4acfb30334a89f2a2c01,b72ed287d04770a571b855756d90cc2738501fe16134a7fcc099214c1810b7526fee336e667ec7fb199b3bae43eafc6615eb15b920981861dc26a1c30a62f19400,7c13cb7e0a0bf80f13ceb5e0413f1ee8bfeb159795d0a6b4a165e7790189fae7126d5d0275e8d389217383a8b5d0c0008548f7d7c0e3dd22ad1320d5354adaf200,04932ff188bfa5df43c4be5fc91ba0c0cb0aacd70db2765f61b80b0d56375f0d2be6424417e5852413de7f26dedbcd19d5b867cd181df46c5538d427768e0a1801 +5da32ef05c9303cc51632f16eb5f92e9ba4be4185e2d762396b960725b514a0fab6b08a7cd2b5e562265,75584695cf6128c2096437a0191ec998402687b81eaa0a90f4bab8b13d3b3775,832a6bb6ea26a6c27d3b67c0990eb32cf0158f857fddb2a38431414202bad82a2ff631eecd5f52c0f3214b29d6b00938417ad031b385cfa5ffff8aabdbe7996d01,023ec6ebd8fde76bee400a7e2bd3b8b9fe9acca166660639c35db0adf9b5151349ed6210c3e1fa872d4d865a26a575ec6fe342bc4b7bf9ceaa6c9cb0389ce76601,d78ffe8ee40d9ae0d87600595632928f27edecdf70f66a37e8cf77d590f6bd3d350063f3a2d08bbd74a1a3a1f40ad2dc7ede5787448173524872d079e488ebc501,040b635048025db301e441d431c211a6977f4912b8c123c54b09ebfd493ee4f06060d35d8258cbfe11f023e6e03571ea9cbb1bd2db4b6ae88c3cfd495549050600,622bdef7825db58206d692a882055906a636f66793a44cf2f39ecda5364a67c42bb006624cef09564945639feeea094a6fc8ee25bb6901bc0c4baac7b4b4a1b400 +c152ff13d55640f3c8a11d64ab7961cce5fd290b260304875732f688ab5983eb1397ea43fdffc2847c59,96decb7c399d239d0a6e0166e17f3660799272d8f2975ec34000941e458ca97f,84017f0b226d911e2f12f8d096bfc5b70f399e9fb771922cf2322295a3f0f8645343f24815f4993e09328efa19cc730fc7677dab48f0c10f0cfcd941bfe8caaa00,6cf6f42f12e16c8acb26ac6699a5c5255b247679b7074761e0f9adfc1e36fbd94ce5c7cf18ce7cb2cc0f67562114856bdcad16b203b89dd4055c7c32bf543fcf00,a5c2ddf993691aca5b0d57f9731f67c098abd683aec9abb8e3d5ae6c3ef905e1414d05762aeb548c5809de8cd6f7129d629b32464d8415a8d7e9eea5acfb3f1301,ce85b4f8993cbae393f4ce77d3b75bf2c645ca99c8ae58fa291b3af1f6ff26d43bb6735070a3f7bfe4653c0aa821b5bba212f87400ede7e03112af677c60df3c00,effc4711a3d9a447a33fa01885bc9d1829cff35a5b641b53002b25b5aa58ffa675fdf5076393fae21bfcbd6d2a2e06d0d9e049b8562a9b655b058042b028a0a400 +5cc812cda57091314230670d6f6b535a4f6d4cd60f5be361161e71c6e23e5f297c1cfaa4df775a970e81,59b5bfcc2a9a701a5d929e5f5e9762cb5f08edc6e05229d9ea9fd552130b2d16,e24cafa6e5ca3ff72abfd2a0532d3e17432d8f6866515ba876bd2b80fa3824ee6f791d79b8b1961602bf3fe54262e96f1ae45f090bcbedbd186b5bea2861b87001,ece5159d43e0b88c6fda413c70094b9060bd9189e577a6d6450933ecf880157e4578c5f23cc2228008f3095bcb423be0a5f16a254ef2f067640c7a842854c6c001,620d6f60f0242438407236b003b52ab6599146205eedb10108ecda39bd4638066ae034ede6b3e02121d812400a99cefbfb4292a44586bc9e2c247b832ef86ff000,97e2f00e3dcba0d1663ad10e49518d2d7d73bd4c0c49441520f56ac8ee727b51594a58df413d677a2886c4b6d5a800e150d4437cbc96ed73ecd70bbfe6abd73200,cd9becf967b3ed1f0186292405905c3e8b9e3712bb4dba4cb6462e38ad420c315226b760c6eaf4d4b3df2b45f20dd4653a1bc8aa03c58ca5dc21583eb01a604600 +6b7a2d274280ca61775dd6cf8edc39073245951c064fa14dc9b293808f8580559205fab29339ac957cbf6e,cdf29228429072bc458a7f7228d45cd7e27e404ef2e0628ac88f22c5040fd26e,ea126a9a8e3a86f0824d08e7db4fa32832652c3795179a9c032809e179cc8499136dbcb93efd8c4fb320c0075ef34a435c306b3211d766abed816c836c256a9600,df02dd29915aa92b53fca81aa4c4d03970a8b20c8a204cfaf3eb2662c3035bd83087ab5c6d099716909d83403cd8692490d362352682f7ef61cc4442207b501a01,795b9f0eea7cbe9e3e11fc9faf0196822630f0c90fd9d5b67055d6f611121c2c7d733aabd9cdd208df507fe530da62014e49a8079311bf614c8a9a754d3fabe400,538b95090d97d1ac2e69d4ebd92485c0e5770014ed2670a49e35efeb2eca9fd0349bc7bed8407514ec6c1856c3e3645d86ecc6438e6f59495d1c538a30fc662300,9cf48e4200f5a502907d13b5349ab7f499476ba6b15e7ae49220b7175141ebfa2e3e3008a3d43e205940eb0b27908f62d48282473b0cb5b1bdb8456847efce5800 +2ac43aaf3f5d7af5fcfc21d24fabf8afdbb1815b2aa7bd5f3c7df61213fe30cbc4b3c2abdab21aeaa5949b,01e58a4ef97930a000bdc46b2f72f19c2b90dfebbc94831c147fc86097e37628,ef97d0cba54e16ec3f2da289b06d62f9ff22695c79cbb90ba965dc1718ef744161a7d48aa2811b8d65160db89f4e906adb203bb02eeb3351f3eca991512e732c01,c9762b1671c9a62b9db19ff015a5b7e3d35c2ab57bb4cbca7ed74ae0c424167a4d693606bc9ebe44275d262cd8e606ba6a38e77cb3a84df0d878f0c10abbc61600,bb1a088746c35c9c3bbc7f0afc0a2b09c9ed722c458e07e815c58603d1ae9a5d5356fa5b484c93cd0678870a78ac9fa93e021976f77be157153c0ffa4cf5b44700,706ae7b9664ce60a4c21fda062e3c3475528991b998552ad78726f640e91f3af36d1667ff158c35f8dafc49439facdd2f3005079809f4d2f5d022f94921f349d00,a0541b71f4fcf81b5080fb88af52a107d3fc811ab6726a842f92046ffda4fc9c08852b768cc2133edb5d8f87a9d1d282cac6ff1a0b80a4b22441b8f7d446cec601 +a3217ee04a2a51b0ad834dc888aa7cf49f2dcad10fc15594a104e13eed096f8ca1b64fd58efb52404fded9,d25ac83bd9cfeed6cc2bb8e2d238957ecd6c92c57cf628236a0de0946e684c2b,20be875631a3459ad40c69998be5d722ae57545baa590fc1c2cb74d89ce94c2b0bd629ec9b0e54b3aff7815c7e7f426ebc39947c9c3930d04c8662839cc50d0901,126e19c98c56151ae9af6c8b46d966bcc67130a4a33688b00c8129875fad9122461aece71b781fd296b3a83c0abf4b6816acbb2d6059eda095344ac6292923f401,cbdf797f88c5c7ba543a5e817dc97b38507ee47f97bd0585aa5ab05cdfc3a1b21f96eb7901af14f43564a02e27931969ef83b26ad2671d2066c1922386db097201,5fa2951f4d966e024438043a03b7e865cc615b15481b2446f90359d79d63151c020084e15612e0c3ebf37505ad8ec45eadbdd8290f61c9c196a79200af507a1000,5212d1b464d897105d2219fef77ede719e9615ca8de9dc984e4609e610577a053179a2122d46ff5114598d062bdc62a60eb962ea111ff2075211dd3e376d548201 +c25956938fefa21bbf74ab1e39d02a689cf5039c248751fdc9fc7a67ba0237a067692b8b04b5b58dce4bbd,d4a4bea14db872b2e8d4e0623e13d1d22d9448afbeba986e8e9495a842a289aa,28db4f6ce820f122b71ec78553d7ccb8cf85139028fe675fc0be1f8db78b2de92c4878dc2b0a501de03e3dfa8cb637452292d23008cad901f7fad37198fc053501,12bd79234c07c7dca60b7b5f9dc2e9f3ba0fa3b0b0550a9a875c4575e81ee94d5758545714fd18157f93f4560588ba91b710780f973102357ef42b116d357ae901,036d3da84aca04e02e3e5691b7e92f20567eb22ee71f206724d41ec2420746aa62adc42c4fb96781baf8b009c384157b3f040fdc2a996c6802c0097f296a93c301,3110ddc778abe1d43c38bd188fffd4eadf335a24a072b3e84bad15787bbc05cd7eed9cdbd64d47fdaf9da9c9fb96cb15b45e42bdeed0dd8a5848f3a73a66af5b00,69b3e970d9b875861e1d4ffc22185d8df090bc6b70055ecb59c86557f686f28d71c34a09395e36c18c2475fcbade9c9ff386947eb57183d6a235d995e6aa9ad701 +ffeaa6f539587cb40cab573294715595084210220d232b3ff67d132cf027476649357f02ab515cd90e602f,2e35dcc069b8f4c01d49b504beb202239d6c112b9a934de21dde8e892ec26d34,37a333aa91d6ae99692173a951a64353f77177fdbec0688b6d335e11836e5b1358d7237b8e2b4e05a631fd1c9cdbce72353d8bc7bc48536ca843bce7a74f3c3400,837dc800468c559990562369355f6afd87ff91dedabe6763f165a62a1a4cc28d0590a12319d9e2f7c77893a96b6ff51a2ca220263733a6e930f009b4232cc8d300,366a00190733012fcbd6287265f29d4dbbb9fe17095a1e331066246c4cfc3ff652145258516c6af3420d36a3a5747dc3863ea2ce43fb07283050f51d719a0fd200,5cd97b3a989407655be806399b5dbb87d5c2f14f721336fb639036c6044b39f63e22f61f1dce3ada40b7aee90c9f544ad6fb66a9024f2807c5b976c02f03240501,59d80503f019cc7a1346aadae18470a7ab79c4c238dae5a83039c4e98497501e0f0d11cf386c3e6a04e9454681bea0e86a2be4785bfcc270ffce966c4864f1f901 +a44b944be7ba61dcf00b9b3f77e40f838aa50b0eb9b0f55743c12e8b20005ab8e2df0285c0008483efaecd,9243498e040920c5f1117f78f447010364e39ac1774b6d3ca99ebde6c7824c26,175688e2d1ab108adf001097a804611d5d2816eb833efead08d4cea5a2289aa402611cf942315f1cc6b63f7fe21af2f283993c890386d172f144dd1f2ad7cca801,746520efcedbbd9baca24013b8322796c4f3c6333cc7418539b537fe7d15c37525cbcf824543d5593e3ac02d3439b143ff7c73b9bc60ba59fa8f65248fd0f72600,4819499bde9e12291d591df0a467d0d3194006bcc1b87afcdc71b1171815e9e50424988a5d3f0db749d89116a801640788a4cf007e66691ab160277d8ba912cc00,b151a7365834ebfb97885461b424fe8888b4ee48029c58b57fceb42c419c7f926b3f91b3b98063cfb65b657eaa8998ccf1709b24c0f7dcce9a6320975aea852e01,509dd87aaf799f130846357af908c628b0a6e3375421f35c11946252b906722042eea836417318f1def633354ecf12679fe2b2e2cceed495b95b6057f911b6a800 +4dd6f35068e45a1a29ed3f964d974ff14dc993cf996673986a4b2f184036e0c43c688cd47bfd50252f0286,c3a37aa0b828d0d3fb203d2ac739b81c02bdc0b9140ad5120437acd6f72b59e4,dee942c28a5f5e2c17c45f458f27aa49edbc0d8f78634ef2687828d74554e54e60d67e09904cc8f0e703d9df3ea4603a6bf1f9833288cf54d6a831aa3f7fe3bb01,95f09fd2e4f88c41461eaae2782360ff3e986e4d667969426c56d6dbed18d93b3d351ff62fb4e8a78be4e9a0d436a5a2f4aaf03954d28e115e98402fc10643d100,141eca14cdc6aa0fdf2ff711dfdf7d20902471a868a7d696d805f18a6e1ea887644c032068384d24dfaa896bcf1364800b1d386da29260adb279174f85b4554b00,2aff06134a8a7c8c26a616a3f5b115ec9a9438fb2121b6c27828bc98978c5902514682d55fcadac33dd1232deb7ff1e5d2895457f8a7b11035dac24f193b6b1400,1b30dc859b0147c64a8ca4db740f3ec39915967f3cc5aeda30b289799fde24231544c463900c9d1999728462e4beaa0445fc39993fad45428c505eee89a6e76800 +41a6f6af859757df55c2d0b96ff96288ff2321f457581a9883c72f4eddd202f84e792c276e1d2299d03a06,3c095a5b74e26002c07105d2c4b26e5e6093df3fe7138512790196f80a9882dd,aecf3cad38671bfcc488c0469fc2e077a32681ea1047ccdeadf2bc5f15cf32356ffe900c139d81ac10da9f459d81c176676bc39ec145fd88a430ef909e4c15cc00,2f42af02ba2c327949ff1b16e18ef182c0fc0b841301e482ec15c05f7565f470153e5fd6a837c060f1ae2307592dd7a89ce590da994d44e5d66fc657032ebf0100,84aa8adc2036682543e9ea8a91e20b2eabee979be8b2455d66619d21efc2b12e2736f983c0c9fbb247f072a66d82e88609cd675bc1e5433a7ba6f1c7fadc3e1801,ca1cdc2bfa663e9da6a901b0f2a565f7081781eff56ea18529d8940a03315bb964627691811ee40fa31eb9c64d287d58edaa4e3f5dca29afe9ad39611282c0fd01,c203bf13ea0d6b9def7de986d45a03e1df9daed81182c7748f535f9c7e548b8f40bfe1c06c5d5c2229683be3826f68ed2c7e5d45a6165c45b888778222a1306b00 +24265ddf10095f478d4103ddaabe6aa361a28368dabe254be94090f11a108a5eef965205b1b17144c8c6b1,eb05f06c2e3cb4c8e2ca41f3d87da682520e8371c7a47cfbb3897a7bf1094bd6,b2eabddba1ea6be060a2225b96761ef14da4231da48fb40d4dd55b83faa46f4e3b36e31269fa7e820ede21554c389f97ab1fdc76fa691ef3e42bcbf50bd7c5f701,aafc915968b5690f15d839684542a039be961680fa6b9eec9f01c301ac52ef7f1cbdc4432a909208f7a348f1aff34f184add99f532885ebd2aa686a4370da03a01,a4dc6a87f2efa26bf4c212ceecf5723752570803206618a284753ebdf26fdc9f0aa50890457c4de843455d1d37cdc586556b9a9b38d71517d9cf25dcc6e4f7e301,2f9055cd8261c2581829304b3984385c5ad9161b7dd0b23b624ff779498604895923d0293d0e2c61c821275b5604f967c3b03d3e27a24bc840e1e524c811884001,3c18b6b8b9980b85db1c6ce14a46d01984b31723928b3d412e55049236637e1146f2bf4097ed80e77f29a418f0e3d74e1962e6158a1d6e49575a4137aa7ea70600 +a32cdb1ab63becd0c8b8eff033a92f6feda14e9c9fd75ddfe73409508bb5d4d128eae2e55eca449dbde688,a12dac78088b1c4425ed201648f25f14e2cdddbf94384b7522cb40c0ddad0409,234e8dee83444d5364d84eda90ad8b1c186be6d8f33df468a0d61f0a2cd2429077ff38db8c0924ebd6e6a35f9acb6b699f38a8d2d2969bb96226e98d0bf1650600,915e45819f6f743ca426f1373ed300fe2658c3da7eabc77e6733b374c6228bb91d1618edc2156250fd1deec75531dedb96a10408688b3f6efb282a665343da9c00,4d212878c611d4e4fb57dee5f8e88684b29a3f913fe455b577808a6a2080e29f6c473a36dac2891de6fd3f9a6f1f49495b6b3f1f7b077a1d5eb9e150d0ff201600,caeb702c31a5898c718ce5f8a3f7f050e9d86b13d479c2b7d11e769b38269f8c170d5087d1d7cf937ea812f78024727c9fba336bc651244e75b407b81f252dd500,49953dd00c40bb123e103c45fb05e3d7cf579bf3e0425943acaca4c2fea3f55562162a8d1cabebf2919dfca0a258945d388ed51293faced807a13de38c20803c01 +a55ddde8a6363132a811549cb12212572121071c53ce5316d1914ccd25da35eba63d05a92f405f8585581379,0e9a350cf8249f9283a5ffa4d437dd7f41a450bd02c91c9a8ecb9298333946e1,af6ff055bd3bef8508ec76bdf89edeca6dd3ec16622e775f6348c12fb32f2e02608eff4b20f5ab9eef84b31d81f4d40261f442a27bf8cf566d99f195d8a0f25c00,37d271958e8033a2d7942cdcd3d9e937931cf307dc192e54d7f5c020133b8c27705f2428232589a99a096ea2c69d3c1d731f1ab484b0e156376665bc23c8826f00,fc53674e0f848385faa89014da89fa14449399622edf168a303c5b41c3d8e9a0207cf595557fee21b187bdbb4c2f8aecfd7174c02bc7d4cb7a7c3f2757fb5c1501,0fb172ebd76722ca191b9b442fde331f328ffa7ececb4b06ca5933030d7f625b417b738a0760d4d6c2854b6aa2139bf615999f513a2040256d76cd21dd0cb31600,a461f430848bd7c9c0ab0cf959ccc07c40b652b31def20279bd4064507d186c155f0bb123f0df685a0fd729c78046aacf23868d711bcbe706f28a3d731ac5a4a00 +7cf8a5bf7432daf04147138d80a0c26000b868b5ee5c073d3d13c11d493927876f3a60afcbc691f855bd0940,561c8ecb4358e7a446ca0e44dd3a40512e63b10984ce17170e271b63b612a560,79eff6f6793d7634abdca692fe995b0a8f62786ea843b6b13eb8c504e54e4d5b51c700de3a7f76e635f89e2b4c3858d8ca8d5f4c40d7cc1aec7350daeec8db9500,ff2cfcf01b3014ab163693d967b3eb36a5a41ce3a1170d9f0a318f8dfde84d0402367378a419ab72b53330dd7c0437da6fd90e67e85fe5d13d32100632d5ae5701,2733213515a3bd9dced96591b013b2dc3d34cbd57575859c8a13df6d4a192d5241c79b4e6bf4be4976d163c0743957794acbfc03734cad2ec96b455b21cfb02701,da4315d7702957e54b9d6ee8da646da6a9cac481250f040bcc7eef60f7fbc93204dcf9042651324493e828a2ffff24949f19a04f88d104365cce2e86818a2a0601,e0719bca65bd56aff328ac255f2b4bec866398534706571d04b95d6a1871be4865529ac36d95e1a5e20fd10869d8742b0df5c858252bcc4bee1baa9cc6ffcc0000 +e4193bd615f70a354d8428ab452c49d56d7af758e4cfdc44c820a9fc4c8ea8c00e4c0ce5f8f9ffc48e2b6315,2db1b0d5b256d38503f5f9b0956fc9c3a95ec5b51b3b03b2ca247a0d11a4243d,6647350880033bdb5c6e9d765f60eb2c4a88aca6c495630b1441117e2ac7242e6e6752b76e6ca2829e0afd0954da389e47cd83c954085c590a6d68ba6145cc5900,4bafb3d1a2ab659f72e558c33210e317ceff8cd6ca49647e2a5031ff7f80191002a848076eb4005c919ccb3464ab714d797072285510b8bcc5a6609ec8350bf400,640c7851c92bd90fce21d515e1f5e314eea57240adbcf2a89ccd5d09b667ad3f4c12b69f5b42d6c1a63f342052fb4eb2d9ac0395295d530a13d5b47fb8151cf501,939d3fda6dca6b2db7ff12e6198f25808cd7a79fd58e5b924bd2bf3b5f07f87056db7f4729f992fd3dd57f721faa6a5c43bff3d108f71ff248e3a9b717f532a600,4e6aabac17700158318a5e67fab39fbffed094051ece8ea52301801bf8ac897b45b2d28b3f19192ef3d311e558a450d42fb52a32632af0e746e5d475a0a5a93800 +71152a31a7bfaab7194fe50cce5ca718ad64d614ea5404db9913f91d98f9c44b51bcc2d27376a44056b7e472,9b5f2b5b3227f8ed7a88f479cf134265425d4c5cf253b1a238707e4c24d1e49f,da4636e72f8e0a7a9c8e502f0d16f09f1be325d4b76042a24e372b1e204939ee17f437d6d9afb39febf486bc2aa46d0e06479d33af74770e1c0a535b781b13ae00,7170bfadf686be89a1ce5c6d86bf5c95f316e8424ac89fd2c7607b426c591aed06cdf2ec76504f3fb6ba829210be9c07476191543a9216208074c7237ccb6a7600,747681b3a9201c4d5523d1e8452a8e6254a5d6732bf10ce573827f42dbe73b2138472b4e54ad00517240fa3035592f7460f5502cbf964003dbb066b1bc23ff5d01,59a25d55e95a042125e4d1d0cf1f12c7b20554ac4509720cf4c3164ea05c5303124e16c80c698a41c2588fb86031ab6c72a4f2bddfb460abdf0ada67a4a2e09101,3f687f1b82786621558b3ebd1235488ad50a5711f573dc9a6d17e90a1d11746403adf98394221b74b8c5c25b425b0717df1eb288a433d38f184304a14a2c334600 +68942a4fa01eb782b3c4a10fe0a8a417063f1f0bfdbfb9b461c49738172ba8bae412ac92e77565708c80810e,7026324c5cc79e79584a7fd7cb6bf43f877f5eb4ebfff74ae0b1b2d683ddfb3a,1ce8cc1f08e2c9cee4d0fb93f414f22129b7e4addbc1a5786499c3343c797dc52ddf2dfcf0bf192d79d49b04629171ca23c9746117d4c6bab57685693c9ffabe00,5d4740c5ed19ff6442287159cd0c9d9c8b43c3df7fb8e7793c1f00f07422dff924c76f872e2b05c1046bb7354d9c234981da23893c0033c23ba4647ac9e57e8700,cf76eb193adccdf4719f2ee4c4108695dd40dd533b806dccfe3063c02b431833010b4058b8df90e2152876207a180259888da785f017c7537d40f3c7cfeb859600,601d23cd8f4850d45f5fb20e928962ccb479984df6a2060679ebcc159e7bece15722df7bd918d6d2806edb9a9e07eae089fb580fa5517b43039dd6d31bf7623601,d9bbc91d676dc79aeb954fb05785ecb42b40a0afbbcca4075acf39912f9ca8f154d03668f44eecfc26b0c4e04233bc86c561f7e8b2534c296e398e9d72955b4701 +33a990db16f8d070f95cfb1e4b74336bfa0e1969594185f23c719267e6435aea87a38d3c3849b0fefb8f9bf1,2501a8f3ef7067e272f8764665eec84dba2725e801955e58bac073a9d2e3dc48,89cd22655c20ca88b095c60da612d89f8efbc778b8ab02c56e61412c1ba5bb0d5be3b01a5f3fb703fc18d9daf0fb72d844296e7e96e24529939af7dea5cb1beb01,0805d8c0f2ab34bce2bd3c85e879f8fe84319d75a7ad033be6b75474ffa338b63341a88bfd21e6502d92706a04b537aa329ebb2c56e8b97af01d2b5a7738493901,354077361a31265de1c6836aedcf0a3787534a669265efeba843c5f672e777920b9f03300ba05dbbe560d5d6733de87e71d4543cb995a951af3317713a2c521900,4907e8d48e6ea15b6c130fec270c1cb63a0fda62008a91379ba0b6ce3f771e572449ffbb4dd8ddfa5c5db287be3654a40b073aee6ee8f0558fc9f0b60fb9b0e901,cad0967a13b39fa1b535a7f3725d61b1907679e08255e2934a3c09d2216966cc664e5179a7d30bc0b58327d9fb1f02f1476aac7d4b675c5ded95f3d314eb657401 +562f108b5b43bd7b5e2e466a678f46939f2af850dc4342c0eefcd31b2bfd035593eb646fbefaedf74b77aed1,8de2b7126b5a22a20bc8f008b1eb61bba14c94b7be918930606e814b9fa9ebde,f24292a9cc1f1df52c3be8692ef3ff22b3fa7be8b2337e8c6bd0fe603f7e68a20d2506eef5765e56d0f41d6186278badf8652f2075329210818f530a644ab28200,57640782f5c58e7f9888f57a785b84b7860e38b78ad338e3564c4d8687578e2c3ac3b6c33cab37c9888e8877b9310e31a825640406aa29f18628c0019a11a95f01,86cb05c621d1a79a2569dfc2e860a64082534063cb807385fd8a9b0fb776666d7c3fc6db01ca58925216e62d56f8717e9ed79a9a008c7016086661962865dfda01,1705ecc4cdb84f22a30bbb4ee4d22dcdede8272f799a029b36ff16cf1076274b04d7673ebe5eeec36da4018163587b365fb3cc3120b565e482538bcac66c48dd01,7706ee7712e98fe3a6b74d9248f5376e47b3f93312fea401a897fe64ec4e5c4d567c3fc3d01a1a2337ce74021e8304396459a3424b0c24a9a179f42c0d2bc7ed01 +6b45baff8c24f232d08c821f89d06bb2356923031fffa5a69288c918bea0c19f4338f800c5e734b13d9a2fcc,b76e5b3eff2574069291a74f3cc419f6bda77b425402074f1cbf94ea96f9fe6f,8565cb94048e3e20b5e00cc30e3686bcb00850ebd4696c93e1ef61225847a17a1ece71a6af5c76f06420bdb0ca75bf5f6bbc0f657a47d7f1fd9fe9f03d16edc900,68194933d6b0e33407558716b334025dba5469bdd9a665206754c80d782b63792394d44cd5a16596fd2657badb5e602a2377d58db6ff25638c455bf8d0c7fe8d01,3ba6e052e03dc7acd140dc235a07c6e07499f1c18fe9518202bd8a9f557f8192575c17a368951b3fd0dc2a9598134c52eede4cadee69586d5cf0a068f0a4334001,14ebdcb7b62a0f674fd0f17da8ea1fc30d567187c18731aea6b504966d163b3f18408479f5ac93bef2b882331ff1947b6c32ca7e1f82e645a4c8e7e389f4835e01,e4158502b2a9c0d6e40aeb4ad0ef91d49097896d29e31c76f594aa9a6148844371f241231d110e9b5262a4aeddd79f630091845e8a5b31c9f6c73ac2aa897db401 +cba4fdf57816260ad5f30e38187d775220cb34e33211c89ba55d23c7a2b53848c0b33624c4aaf952dbb49c53,1f0a45056f0dfabfc428230d4a2103a4487de2bb39fdc9468402829be1ad4ea4,f6b30b26332a81d2c66942cb074a616ecc7c3c74ff4bf92209511a20f1684d3f409db75fceb6fdc86c4d6c31938c8dfe2fa3cf933c66cbba12e9cd0fd5e1466400,2423bc824928d070ec2f0ffec467a361daeaef66bac02d1e40bc265c354b41ab74cf240569d48db72216c08a804aeb5ff18e9ec109280c94543c4e196704948500,11d661622e46d9ecc01d011a410ddd54292062719bf6755ada22d23fc3ed4660310b84b5f986665f4233265d90ea2dcb96bd087c978f9e692973908d0994d5a500,7fba2f19bd1a54ea2633faed85014a34b19ffefd5c89a68bae7e050e0f8e9aba03e78707adb5764375e20d1bd60a1250e9e854ef1b31b2e1f527813064ff780000,6ad993f067e5fce2ea9b11f68a6ba062b13c0fdd629192bb26b9f2fa6e5d23b1518d5fb298aa8383bdcde897b514969558677640544f72f75d6f4a46e22ccca500 +94a474e8e981643052f0316b1a96ea3977ebeab03071f4da76fa32bbf1a0505d5ea4d732024a51bec8804a41,a0422df31fe0330e83695070dfefb52fd603ba9b34a51603d8690d45660c7cd1,4ded7c4b35eb14d2ef00e05df48e885681b6a53273c62bea9dc7ba8420cb811a5e7d97303574078bb6e48ae1a58fe94606f6f258a916b6d234cace7bcf6257f501,b55ddfa527fb7e1dac9a8107b96654a19773ee6ff3967da28f1e732a71ab22417817190d85903e7ed5fd1cf8fffa0f4639954576ccca1b2994ddca6844aa2f6000,ba466cd052d7f66d5e2b661580962a73d156465086ca76b8b023b1ab9c5538580f25278505280818cbf0e892131f6463bd0b311fbec4e26418a9c209a41617b200,a4bc4e986cdf4a2ce47d630bdfdc658c7be0a0dd471b3cd9e4cb2ce7b8e92b8763b2f4f6e49f7a18572449d449322b0244b9fab0b1aa2e9d4f0ade41058b3c2c00,0a12f0caa9d4c78405e99624fc5a85876ff3f4917c0a3f7da58ba4faf0feca2c3289e04e6897a0aa00021c990439d56d2333b06332294654abd5df2abf360b7800 +4676292cf0707f7f66743cd2b12e12c643b6189fa15dbfd357cdb286dd5991bef9372efb8f3c1162e2b0191adf,7b93a4b616b1b526f92a807307631abd9ea222ee2d0081053e8576da65926374,e4547a3a1981e629149f31c56fb8b2b7a32e354b082229b2bd3399e222e453a97645ec323d2e0f14e3864cf8324cbafa95e38a748f5c2fc3214c81e639874c9f01,011c87ed05d4a5008ccdd9044f672a90ce064822bd92d742fac2af9f0f525da1791b785a17623ed10c804dccbfd1cb63373f75078fc15bee98a52d915064f0bf01,899caa77241955764457df7914abbc397ba6ea4ff6f0273726ca7bbabc74bc42783f6804c16e1a843821bd28f6a5395f08aaab42605be717f1c1ac1e1e4bc16d00,d65cdf6eb63114f6ed41e5a072063e41f2c94a5c142d5b90d856cabcd206b0f11cd459a66b3bb8e5b3e689d9b5e05136f13f1976b4bb3046b3d5775918e1170a00,fa47d40edc63c16f4f905e7a6995c1671156490c6ee0db283992b8d0e57a194b147c709d28cf4d94431195a4db47ba3a5b7619859f1e8b0dfaae0256d4f5d2d600 +5840bbaa7e7ec50586a14741e5e3424d0d2b6e07ef1abeeea1d75f4f45883954d53bbab8c775fd63f50cd598a8,be31f82949f676b64d7bc21049b512c7f72cebc2840c4a50aad2d9b8011e81c2,425344904ed5381c830bfd01aab81e2e239fc435fd110ec9e9edef20d5bc83b31ae7bbb889ca93ea63eb42d8ec09901028da8560138c9ef69795816472e9cbda00,1f9bb94f389f7812d8c3b62640b99b20082e0202e67c26fd21ef869561a6fb253682d6ceee323a355420d102727c193edbb9e2959f516a86486b9bf1171297d400,dc698837fd75e0b4ab32645a6220bb73078077d5bb4f189f7a9a855378fc633960eedbd16bf588da5ee6e14132064858e2e43b6bd7499ec5bab2111b31143b3101,cbad291d4ecdc7c9795a9f0b451e469dc6bd14193dcac831c943e387f0b838371f22d138c8cd3100ca20cb26e950378b6c0f716e8f374ce9e9f63c909cffcaf801,213b628599bfd627460f0b840ec547eaa28a89f7ec1f802a8ca9f4c5fa7b89eb77788f8a21ab5e6e92f1e9429c89c1a7a7e8106311d2ef7801bb2bf0759d99d300 +ffcb645c2337212fa38b70c523221d1eb7f42f8cd21cdf1eb198f413cfba01a26f59574576c9be78d17001be00,c779647725128182020ed74f90a9b9513c518d746a89b5288c0437d529fffd29,3af12a0f334cb6adb801d3a1256ec4812b2413954a586e388405bb416a18f30a2b309b32ff367bdbc96842b63060d524fe851cf3dba72ea563947b1522b332a400,bb182f28d2384914b100d32fe18b02023b717c2b47d2a073097d7e80154fe4fb2c6bcc509965c8a30aaf399914f01690d9fea9e224ccf5d23fa585069c34e40301,d2be859449258779ba027021859f92f8da3466039e91158c6b81303d5222a14669fa535d373a4725f937e21878d58c22839755ed0175d28a73ca4eb218d449c000,e7d14329f90d4132a4b3254c1a221b649776bd8f49bd8ea378fdae8e9d2e12ab75906cb87328fbe48edacef21d2b937f39f2afc48c2d58807c4df1314464f72400,cd3028c07c5d28521ed55e9d6bfa3834725f4b756488ce0070ed4839d6afb3ba5c40c2df1f91113cc6e3aaf8a4fc75c5db989b1adb8e51d7fdee8f521e41b97800 +02b82e49d8fe6ce5e559c74bee38597978210ed47f6212f7387155962e73efc5772740186f7fdd24d0cd0d89cf,8f4281840e16deb1f52cb64e7e454458115c557f5282b12184206ed562d11721,569d1f965ac6936e44f9af3295f0f5bb42f5aefd9f90ea32e92ffa0a3c912a7d7116098a8141d791fe78d196045a9b74ec137c3650d078e80957d60b96be7aac01,fdbe4c34894c43349df2ab531d27d549a929dfb14413866ca96a095568f23f107075efe129e25bef264c6fab0f06f273e412c61ca18abd5e348331443f24dc7000,b332aabb0acd6a820f9f98e0e971398cbef4628b1250aee394dbb9370508c0b22b8f7c2c1891582dd7259b28d5125feb50c881ac1e6e7e6cead1a572a921798a00,30b4f8ad1759cbf352936dec4d84a65059d16380e9a8adb0e36ffa769728e5297bfae7e44a51ff8c291495af470326a5292195caa1123fdf591c96ba1a16b7d901,3484a8a5e59b08dee28d7b758b8f8366ba756dc977e411d961575b9441283ec44ff10590328296b5ea3d7b4b6251757f818b6f1287d9931de07b87dc3317918901 +ad7d8cb3871da0c17c9e2adc48a09ddf22c8fa60a95e1f31c314af2a044eef4b25fd47dd7d410f4b35465e3fb1,8d909d89e44e118f056048bec4564920c01f1711544bf225e267e3c94be4fac0,7c12a55fd5fe710619989143a8a50202beb6d72f231e5f44216933d386408d3c3b5ef4020b29ea368ad86f1fa0a82b4e22653823dbe5299b530b0bb900d6bd7301,629d2fcd020a1118b64c5eb2208a6b95414507c4eb48e7f77ca64b8b816c52bd0d406fc06a99da76c2e87881e9582cdc11cddedb907c894a61bd4d8688a200d701,ebb156e256018fdc9bd7f4e8c70604e62ab02e681e889c73d543b36f7df7cb562831934a71436d9df3ab69073cadc037c09df15b86df79952c0a7594fd24d97000,fe80a40038fb4f84004ed9b4819113353ec548d62e18c8ddbf40e0f4ce00276c1277b7fdea406d60d6cc9ccf0f018ec3970f1524f5279ada54d247d18f16cc4e01,e6420c9659ecd94b0651154a08b11c23ddc91f9f8aba44f901b37fba0bc0d01740d8233be81148b285a384ecde38a5a6ce2ee825afab9cc51d0ff08a204cec6101 +7122d2e21543e23ee5f00d51cb07757f70965983ad96f6b14930c8fec9da5d537c788d916e2d9d481ad0c974d0,d63286ea67a5181ba12699e27170ab48a92173ee293240e2090322b9c49a3b8e,2458087a3987bb4be72077116055ce22ac55493ba06f37ff381664b9899502c565f0db28edf13dea9588b32f8e35a8c44dfac691d8637ee82ad76dd3715a606300,01736952332d51ae4b87e4fb1daf46cad0dada5ac8894a504fdee4654da196b647479ac1ab0511184b559ac5a5d62c8724ffd5755201d3c157dac8125f02786b01,32f04946360a66cd179d12a8d24bcdc738f5340279a55aac51f8de58a023a32821227d601391a9b3b699796f9a57436e8202d6d723108fdd30afee52e13b1c6900,14ae2c7c694a7ccd09ab90be21aa731ad5aa8b408e5e7f66ac2d0d179c9fd6a1717b9728e0ddc439316d2ba60602eb3d1653baf5a97c37412d83803d5150709d01,63dd628ab841d44831f87b9f17ab7b4b0b9b0939fca8997e79f1175f8c0ca0f46d7c731774ef6d91ad23de8d076c5359d1b339e0fb68ef309f8d2f30b9ad03d700 +815e55f1aa8f61e837ccf1ce33cbdfa7cd591e01072e7982cce5ea5858239a24e83df7eca3927d90d75ce23a1a,d7a84beac48f93ed4f55e7ebf1655f99140ec3ab2c5beb2b2bff2fafb3d68a08,4662fde8fb9d7dbb9b25596ecb9cd5d7d434d1bcaa3ad03864a1c34c3f86e382372f45832aaa5b9dd94efa07e44c14238f4b01c9b3566a5e88e31610b0278cb000,6efb84c7d9ffc5ee56cba13e8eae9c1497836c3f21cebfd980782c96ec6a5ea8375649ccc8ffb4f24064f57b17721ac109bf30e066f6fb288ed99ed18b40dd4501,e21d712e58e9f89a3df9dc7ba57fc5001bc4b9322bc528673b46072087ca5d033a4056cf7302856842760f07bc7c7b55414edce2f88ea14cf4b4104ac4b992fe01,4507c77d849f4246a66d198dc5dae5a94f365667963988073336c6e3bc589c23639caecf803dad6a490b7e45ca288c6cb36ff94a46431761ee5a3e8372cb25a800,9322cef53470a7f86463011cb644be53c76e5436e0b95ed98d2eb3dbd9178785685f57f048b4578b90d67abcf7bb2d9018f2deda89f704fada168db73b4d3d6400 +4caf9c2b88bbc4648bdf21052622a70058f238ec4ac2a30308927971dbbc3327ea4841ae104d2813989ea8fa38,85973994e6b49c7cc08971178c8b1299c989303e22e82d10547dde35de213838,34661d0529a5f8a90563bf259ee26dc577700c73284fb2247addba1e06367fe72af98f4a9a704f3e8ecf32968481625e3265384145e78d7e737d7f3e164051a001,beae7dae9cf9a54eadd07a070e4c6b91493c77a2cfd70ff4e01b267d4aaf5d1e6c470bee882fa12d1bdf8376901869cb545c15b8015fc295d55e5d4364b9963f00,32c51e41acb1eecc7a89c9116cc490168e916850ec70a71d3fe56786892001a87f65db193bd3602c118b2abed6b7928c99a3ab33c967d1e02073c93fa4ef420f00,a782a2a0b52067e123e6fa4d9de22f79abaf48a6b6db4a3c0a2ce0ae4a0815742825eb9bf10ff7a1d621f424d97da08ecc5dfe737065d731389a0e67e739026500,ac41cc88bea42737353b65e7ffe0be4ec05944466c40fdd6ee771f02402137df28d60b527bf23ffb70426ce99898e0263f8c1dc7f2e8e3587c8221e2ba55765301 +b046b8764fdd7d05994e635ee83216f7bf28a9dbfb0ad93269626405724caefa0c1b9ca8cd4f226e71dd9a78a2,396e83c862272457e007981f6dea8fa58c77b92ecdd4d91759347b6f6b2552d3,6bb7862d1759eb40408993b7253ef8bfa44b09505134911bcbf27a234956395e7bf2aeaa0a89912db21ea9aa01f82b9c3ccb3cb71f905ef9646bbe61c2c7af4501,3ebd0a20fc22851714e8ed819e94ce50e55fe17c75c84ed3f678aa2ece7385575ddea4e01085435426e2da235a13e8f46a75269a5eed2c63fb52211f963d4fd000,14843f3d3f4c41ce3543a2555d455b317b590bb74e889d4c8605d085b15515141e203ab0c741e83a4da03401cd11176b5aa517d4de3149dfd1a86a9d18b95faa00,600565d339ecdc722771c553ccebb4e044c742d4503a9f5e1bcd11d17c28523b6e9da8417369067dcb0d8aeaae649b1bc0835c647cb8f86c13ac1f27547af3d600,00f5e382c96e651426a64e9e523f1041ab0ca6bb0bd024e17170be5ae8b0fff12faf799d249e1ae1a056c5c303d20e2ecf77f3e09e8db476cc50f579f2bd98ec00 +13e883184955b0d64c8b966eb2fddc33c6b092aa89b98ab3be60f81297d7c85af2c3c4d4363f075324317158d1,d66aaa8a652fe33f2fb1d81487bd092a684f2e45c9f1bd3585707d585ab4e641,7a76dc0d89a3bebc0a4e99aeffc74ada54361fe057418390288418df8ed40dae6e0c8ae9fd8f5d394c9d71a42a841e5f15c3eaad76c282abac47c72be170e47a01,bd5b0aba528265cddb63e0ec943043cb2cbcf9f9ea12065a04307b2882fc8cd80516fbcf42d383b2243dc22257eb4968835062f347877cd5f36cf4ebe9507f2800,68d0e7d8e245074f97daa2bede530b559eaec897a8e945e6c11e44a23252217e41a62d24a6b764bc3e86dbca69c7c5d1202c762da494182f3de262c79bedcea900,ccd96545a8877993264dac400b9e501e1d3d376c29ea6798f7f56f40f44ff8690a4b80fbe1d08216c4ec2ea068f41466a33a3b2566d27445c68eab8b1d6092e500,4ddf3bb876a0ff2c540c3f0b458eec285b2214804fefb72216b454ca16c20fe329212708f21a7dcfdd5a09fea22bf35354b285cbb6ab29e77f2e258489f4fbd000 +6a57199a9ad7191844eec6f02579432f8a55c5cdb79cb367082b860e5843b22b16ca38a6dfe256d5a1f22c602ce3,86c318946eba1c2162ca6833a0764d5041c3b4fe842993feacf299f6f025957d,252ef155312d5dde7494dca9cc4182ee3af2442eb652f740e328992d726ca1f52a9413e935ded3b546a75b5b110d3315015a1f83f16897f13989c71a4b784bfb00,0c6e57f9bff9c43abdde18e7cb5ce9263fe41d08bfc8a4711c243c966584d2d32b0ad16752fd325dd8490af6473ad5a439707027c4cc34dd61eec3ce9bb4c01900,bdc7fa9c03e09365140704d5ee6ed1ca0bd407980af1ae8fac99759cf8a89a6827a72d8dcc9b369709518cf393ca431bb16c52e8f05a331996bd09814f901a7c01,9766ce280be0752f246e55dffaa2d49b4d760b3795c7f6d161b3d83446502ef74ada9093667487603c1506f2aea990d37350f7a1813af27229538c9731c6b11f01,b4659402e4c8ad653083104eb5435a94eaac10204c66a21221894dcc1cdcb7347f9e72ea01aaa430c689663af2a33a76480edb964885d264196d876d22d148ea00 +982a8e43782372eb841d4e94813a320ed1cbf0835dea77ef6638b9226c2cac70dfbbf9f9ac636d16a2efbf89a2b7,182fb52bc7aac4f1441cd10ab881874bffef2c0d04993f4e397697e46889dc96,f70e7e232b9b6e583fdfcaf4e731cb9d85b96f6c5b5010d1389bf684d5bb9b1d43585dcee55dead71581ae9b3068e13f9cc2ad613336f8a3a048b9f73c92a42d00,5ffe65752ba11af29554551c7ff087b1eac8936c74279a76837b7a8703841dcb44323f9fa1e77fa2d98843e0356baae0aee883f997467dacbbaa14ce0ef6301f00,d08ddb58c6d60a89e4358e5a7305f9fd5ec731e67445fba470c63aba55b370845509940e1e32a787b560780523cbe660b09f2614d6f4b036ad89641fb8c389ad01,0d2f15e247c12d9a72acb658fe15ca8d30228ca4c89ccb516f78f2b3007c77f002f341d98ea759731057061a409ec86f26b2d906be4aa2f8116f3827c4a3925200,d6f89b14cd8954b754d9b98578eb89789ff167e016e9d86c1e750261daf9ad493df61409b6284120b8eea8a882297611806be63c335ac3ec3f500200d9720c7b00 +2c6e123011f965ad0fa308b797e26b381d71b7189c3504dcb83e3bc04cc637fcc0c1cac478f460955805b59de797,e855f0aa9bf60699b1c36571f66f1048a85ef7a7eed03b38d71036ba3d463d32,a4d3578586a2824c3d4c80ab19cf0eef2f60ef3792627ab2430c272e54be876023a4858c1a75205e082dced92ad9757861adc64faf634726d72bf80bdaf95c6e01,269950ee5db2eb34e84b2682c8fbafe59d0ee1a1f8f345232d2fee8aafbdb3b31ab74feaa11f1df7dbf7ce3f654c4969a332f3c6be77d99472018c768106e97b00,b69d2fa74872da2c54689a93d63a647b6d4501ac621b54252eb267c9e6feae1344d6573e6a4a638c7767bab896b907dffcca47d821c74d5800e4212330fdf6bd01,ffde90032970e7e2df692c3344a184470b08c4ffaecbc5c4346a871d3e7ed05e4a2e04f6e11579399b787f82e73e935c87eed749cc41be7fa0e940a27b5ac08e00,a553509aa31be6886fc1cabaa47bff4e3f365ad188a3558702fc123648d4ce39770dff2a125dae11cc7c26dcef3595ea3a880817cf285a9bf5cf37601c6297f401 +f6c806a7f426eb3118b867867b026e1595f0439f5710943c4a01d60f49bd16b2838c242088fae9b5719c6dc7c8ea,3b87e022706f7f11445d8592f5f511e4ee90fa1342bf56903b929df8b9ea007c,09e0215a005157319fe5bd215ebd37540299f873b894b2a0570ea0e913eb160a48c27e8cc99c2b11f8babe3a3551b2ad2b9a384475c38bea7ed8fb45be65d0c800,e6e4aac27f1e5da78ea69efb2d1e56de1fdd1a362b58b85c5c5d6cceeaa47b6a7556e8cba8a5a455065705532d762abb431ada83b1b1724c582ffc9210736b0100,0fcbd9eb98a55ba446df4adde785544f7e20e5485c7e1d382f545cf0ba149e196bf4d14a0e18f35966c41e666b8aba1e7bc93514f10cb6c50b508d707f2ad65901,13cd83ffe524348de67bfcb3f2f6a3aeee26a334bcb16c597cefcf802eff091856ecb376330ae6e0ff9ee433b464fe39d3ed642bf172f040d6b4ebcba3bc977d01,fb14f40eba87447edeb3d7edb0c069ee6294f59d1647b85897eb43d362aaa24f0d9240d953fc58c502954c77160df4b5d4d5a0f2fcf4cc3352369f77b679e67f00 +3646af7d0d4895dc7fe1b3cc4bf42fc47aaaac86c67d69baa669f46ef40dcc33079f3d9b2080b7de5d3e7fb17b06,ae2470c14c9fddaa3c81a76273390c7c860619efa7ced478768192dd54126a53,65cd05de637442078feb2a87fb3a84c78a16285771364c76e248cd2d48aa942b1904dca9c6abd50fabaff065afcae8792810292b8e571d1273b2643f4d8a8bea01,9cbcc4c3ebd6906dd66c2b8aef640ed7ec0d9f23bf17e1e766fa6c63b20a52ae373ffcba2b8c1b197ec38242d6a53d76ecf960ec102a936654efbcfc4d159ec400,55eb4089861b75e6ee7fe2055e3519d6851c23e7b83977176ebcc5979fa12df46cebab6b812fe8a058a37ab31ae8a186bf7e1dabf0b366a6fa20a33e509ac34300,b3d76b501c5cb298c93044968869d4faafc8ce35e0ceeb6b0c456ead06db3fd87bffec0d5d63f1ad092ccda6b0a02716fb4c81c5e870ed453c78c97a80116c7b01,2342050682e2ffab4e9584b3f56f1020b9d36b362d7dbaf4d7f5e6b237848e977c22f7a4f803ec1a5015fe0352d0ba220a578c573e52c30631151bd7bda00d9f00 +7383a07027642eaac3012ce2984fa318054cff47e5198248c65b66de553b0c527ce12baad3abc0e7c5ddeafb7a9d,f3854eaa60a578283e4bc1c95f24c4f9a63daae2d6c973e87cfb4a50b3ee3186,e16bf5e8d1189d61d79030c4a1de0a604abad7044397165f9b0d78b3fc8d6b2931aab8e515b6277037902b3513b0b8b58099310033751cb8c756e0ba73b4ed0d00,7818d5e00d830ba2d9f2de634b3167bddb20a8a19743703ffea345cc93abed237c063824c0fbcc5f7ec7d68b649341e2e68bc983c00b6f43bec3807f3f00170900,49ceb556fb046a5bcd2405435fc3b9036bf7951d59d71c5345fafaa6dc1475112b7f47935c8040dcf47d098fabe208fc250ada3ee926314970130eb0a99dce4701,6f93a9db9ec51d7098868767b2811005035cd9aad1574db46526b3e494926a6f7ef3681e190d41f2c22e560c77b17da8ad0e7d8a0198ff5c91991bf291cd025c01,623b3b732b3d8991117f04541617957efaaccd318fed84874004594f4ff6f2e96d3fd23ebb55ad04d2bb0f3415277b9df805c183f870a6f1e46562f1c4aff49101 +f1a8485c3b2095523d410535895b29907e9cf904f42ddec9fb231930da6d7623e978941c8e594a08956374dc42d5,8eb33b1fd5d24314d220acf332dfbc70032a38b5683b7e8101e7acc5f25ea493,7a3d4cfeaf3a0672ad22641efdbeddcef3e44be16a866fc16ce06c39d54bb06944e5ec7c8c795e08e86b39013c94b9ed6083a64ae1c7cf2bcfdb93a732e3b08600,941eadcdfd2383deee936c2c908b3a2839e4c4f7286176265ad89f2a418dc7f7144d57a658269175fcdbaa3a7f0c38d68d821c93885d5eb3cac5b34d83311b3500,7201d2dedd199a338e732cae05025bb41436720d1b2bef1e909274d0d18853b21565d1cc5794fb203b18b79bb3ad8077a730df1d87d473cf401c3817485b87b201,617dd328b87c0d18340fb9e5c157bd81e35bc3ba9cdb395e32e159688e21080334a3dfcdf62db532a5b4d9420f2fa24947f67f6fc9240803895f4ad6536a916a00,3ced79000805d0acf502501260f5a4488e33500ed087054ae00e95fcb08fc34a5e853c5eefafbc2dab49d2d1181d0ba6cbff98ced75cd8af24c5dce8a9ea1f2400 +a1fb95ebf96dd284d21775012d9508b6ec2bc03197bb241f299797443c2574455aab46560cb61cae6b5424c4e9b7,8900e303dcc3c00c0a79c207bc82ca8cb958396a764979f1ec1c5bd090c1185c,78f7b3c588c0fde43c1b66465eebdd7b1e1152d7067a20d2575f84ca367a75a75ba50ef0becc43e66a176b826d0a690951dcdbd9cd2d6f4a4d5e9757668eddae01,8d390a61eb77f4f256f514d7767325d5d4ec5a816c510a49a9b88d7e1eb65711741bb821fa69e15201a8285c79a2600398723073dee613d5c9d4b32ef024383200,f1007313df0cc751433b4c02ca6c0302ffdf74e932ee4bb8e14e944343871a1c5405799079ccd3f209fd4020bec65c53bf72d1a775944eee165ed14281db476701,78ddd734c3c1cf723c9934857f12139dd1619d57ae84ca1dceebb7a757c6e2877fb18bfefb0bc78a7850ee55dd192052176b1d1e4fe75364fd36f5330bfc169201,0042b7586b37c3107c68dcaa8d4d5e9f19e7f642107bd4ffcff96fe58f028219097a5bb50d82ae98ce548497e93161923089731e639479f0ed3c07c4f85ba8c600 +f2c9aa22d26e926b903e94153cc95afd7f35efccdb69eff9e4c8188b1051c9717c7438aa5024887e94bbc79e729c,384d78d1fbbc367d59d97d18744b639ed45103d3e6c39c16696d2ee0ee2b341c,b62db32e6eeaf42564411e516cf74bba89000fe5d241a21f079c3c28d884f20f1fe9e4ecbb193ad65ac55e74c587b142bc156befd36a32012efc68cadf57b2e401,4f72fd6951a6499b7f7e88cf11e7ce5099eb61010061bf0a05d06bc928223acf2838db0c3745ff13140bc3ceb9c29739c020c173a0b8683df0e774d74f3a291700,bb5301428dbd6141572c6208f30793c8f5ad2b25a704c43ab2b198c213ee24b869857416c9fd45ab3c53578372e452da197cd57cebd3737b63815cf2b04962df01,55613f26d61c756121e85d49e5eb9550bcbb2f31aec86dbfe757257295d1c1f564d7f7097e0e613ce077635dc5c857e014229eff7a4f7307be8497feb3ecb82300,4c9addd4239feb71a683e02dfde6ec29acd13536a44432f204bfa7c64336d6ac7f45df38d13177f737db5993cfebd381c8ddf11c2d71f161ec8382af6ea41eb001 +a7b8a2ade2880fdb92252e8a3bf7a13874ebc9127d315b3bd67304acaa536dc87b63725140a31fd3faebca1a5ad2,8b65fc692fc0ab8342ad9d29c17b545d13e04f53d979a52ca9ad280bdacb0f40,4bf82c21ad137facea7e4516d13b1b86784d780819721f9af315962d08c915ab5c6b3dc82880df997891e2beed978d2d3855456a0948d9633a070eb69eccae6701,3320b2025de42649a283f0884e073cf940d269a40eddb68bc80e5e52d83de05d5f85a7cb0a14b6836a9782c63268b3fe414ff7142c34413e5441779b2d99f89201,e375f82c72ff0018ac3411aa37d2458023ae3f46d068c651faa608a891752d082eeefb3ddba99f2877b30dc8ad1ddf717ef2474bf86db14fe05a38f3bdf66bd101,a5b29ec03a6c347293dee1a42f48dee7d5ff2428cb1db44a00efaf85972ec6ec408b7cc8bea12de932f845b32c859beaa85ec35f194fe5b9a9e983f1ef7c101f00,494e2b2369265a2cdde4d2e4562baf391ce64387d106dfb374707d5a28f71b652a980cb95dea8fd4d6c5888bb96758d77a8e8b74819663a8f15c5d85922decf801 +a07463d87fd5a9f88d4b9ea9103eb03394928d5527621ce0d0de4c1eb82dfd690251c23acaa2b2f116fabf99d12f22,86e1e5d1def4ecdc384d475d5c6bc33074df029d9e8fd032d2ca705562a5b4e8,b839f05b754afa8423f3fe311e83261bf1ed9496974e5e411316a59a079cfc11606879984c661c808c4968b609445262945f83b14f875267d017ec328dbb48b300,484f1d474a19af8a6654b9e5963e63fee94ed71d96e06e8672af4983ab289c843f413abeb0b4f7b5d017de9a0de3b68f60a7254a4420f11324d72a6646f5fb8c01,f5ccaf75adb0a5e6754cdea9028745068c641237c673ffe65c8e6b80cc40cd082cb1fbb75b8063d5a51f2cffb43cad8cb46a4b760656e05f0b03d32d8460af5301,95a7a44364ccaa8569f7756736ee798c61cafdf04ec6f0a1440649d6e0c9599929410b99cef40f121dfda249d18f04891b0c2e1343b066cc28497686d136336700,14810ff4b9af6e830eca66d4d5fd03f85599dd3c2970c57a2595510f5c9bb12f7458952a0056633a5b69bd48d00be81fd4793b050217014516f9b2992b95356001 +db8973084a02bc3828052d2a6d4d2d9f032412bfc657cddb8edaa943b76be342941478c44c1fa91d99a2a48bc15058,4e512e5d7409a6000eab6243947fc7fad9ca956713743238e17cbd10fe885ecb,2a9d0b03cf153c45b5c98a8fa31a7e61bc4995a1e893c73f6cbcfd5050722b440db3deef576515aa4f3f53ff168dbe72f2be9cc8155b5bbcbb3e270834e8709f00,2b898072eed255346f3a34f9c15610f865026d1bf4eb31e93a05bd24c0391adc11706d73a88415137e78b557193402a8807f55a351d825313adb698f59960f8800,3271facbdc6557ce9363bfea559df8365370adb8263a3db9b7eb7b60ddc37db906113421483710ea39397ef0ede039ef6a8ac75e2b887d42cb0ce877a563855400,7641b535d829b5c382ee5c6807c1097029ae580d8e1b87af6b17601efe7385e82a9aa78cb139dd228fbe8ea2c7981293f3f8aa408e9b7b7369f8d16abbda194b00,a79ce85f561792d58e30ec353b648411bb67031a928df14019fa3a239a69bf0f29cbd817bccb78eea1fc869e2133b6a631e56cf92d15de088235661cef37501900 +b6acbb4f951105485fcaa433b5fb7778d680a7568b48ca11cdf6ef9b231a9d1a8bc48cde5b02d5412e54fe196a78ca,eda52cb4933ab5a1e6403f37e6b7caf69873db7295a0d7855831f0b4106f8ee3,53867edf5cb3ffd6556654960703635fe48f390289655a5a82d329e6ea6500bf7eee2fe8f440a5ccf5e644be85e894a6fba7fb2811189438ddb9fffb364fc31801,8ddb218ffbcda7c3811aa74866242ec479f989cf74f56e9bfc02d9e14f7dc90a3f9534fb180a48395fb25ce5c8a2088c0521c5a32f95735029f57a0d26092e8f00,6beefc7abadd3534d8aacf72b3b264095610a5ffded340f55d4e349c76cea015528442ca40fea6d662cf4fbbc420f89c5edb75d2c7c822e0eecdbcad29823f9601,201b5531f151af51cf9e6e21a24cb4e5d170d5b2101ffd20d929f2c00b455c7827029c2f9867ecbcfdaad78d84bc79309bd1e23faf2ea1f0996f25cc619e940800,3183dd23d558dece214255d5c2ad408d030bdb7b56ef89bba2ee2bc6ca076ee76fef09a271711733113a0282002f5229859508395b324a1f39dd8a0ec7772bdd01 +0811c666c8b5fdd3056357c0b6e5a20ee306abab7bfb21739928aedfdd173df9efd209aa41ccf7a54a828f21eea4fa,e295b5084fd1ce0067fbc0d3a66fe0d60cd0ea943caf5be1a822b60214b305a9,4d886d7816bc4a2980d441c84b95680eb43bd67f2daa4531086a541a2787839479f87cb3a43194bbb5bbcedca9da803757630c65bcfc91fb6326134fe3720e2b00,e64d6d28a998d8d7a17ab7e319be0941283a999c9982e57f3d4d2c2f936414601d65e9454f7ba12882b78d7c7ac628ccd22a7cc8ab1af838e5b9e46b9aab056900,37eadae803cbdd6f1b98d3a6fb867f1a0f8720c1e6be4e85b3b25bd972cf9f6550acb381e4e134683304fa6ee3e1f36b8d7b25baf618094ea6ea3fc6b131319c00,5f2d87a37707739e818e6539d4cd9d76d0d3eb6baf93502d283b1b57cf6b379446800e313573ccd495a7623e066c0b9ce7bb2a3c832b08c38b502be015ae4c7800,6eb731a0fbef84dec31a6222eb461300a834f7bd3ec3c8f63375349b58f4310b3e1dfa64b6dbe2b3025365d26ffcb6adda7b504dcceec5f0e89f87c27232241b01 +cb1c85f31b8a20edb1524114072ac1d5a8065759b1e61634d51f0d04265324fbd941e0bd4f80f221c796a660b00112,759f2e71b932ddfd41ad5c115927f8834d60317de0a926a7356a614933653c8d,946e7ece1fe90136c1997724f2ac3e59dd618d4640c815e24dc22bef72bdb6714819d1916c134a31e31456b01079d897b9f42ab1d25a2d2565fd4cf1cddaa95700,93d92e10aeaf7ecbb775d93abe2c57be3df3e1d99f9bdf887704055e007aa87d3a204da6c6279d642da787577a446cb337cf82366c943c8f3275416845c49df401,f660bc680791a995b83093754bb8b9273c597e957eab9a8709d37013578af47b15a2707f3395ca0fbbfde0f5bd7df537e9dc84cffa41b2ebce34fea3f9c8e69401,aa6effc52e43733e08666ad0128213f96b2700ea11078c9b6efb43bc0fb235ec28c753651e4994801e0ccd60a5d4546d1d8f1def4fc84e18fc8588f901c01a1800,b72b707ec86a732570d52845ce5f8bc0a2e4016d28f251e5da6d416b44bf04b523d1db8760ec90909d8bf523cf30b3a046bac67cf36492360e9fa75e7fd87dbd01 +b4e1f02c436b344f8adaf877213c8c22e6f1a0735bc498842ca8a4eb4678aeb5de5e0a717d9a3a9bef86a093f25763,4baee411f890f0279157a37c9dab01a5dabd4bbd7989fb42f4268c79f956ea40,9aa8ac6f771384fb9ad4d67232ea0eb46cadd32fa083779a05389d51dc6163c90bc5d6b36f31a609f2b47c4756273cda8edaec0c1a483032f6e9c0ec750b978b00,ed6bd5dde3567fdbbb66e34e16192c0e6c95171f1890cb6ecf1c5706c4bfd0493c3bf3be02b92cc05481fa2fa3df3f8e1ffbb59dc3c80f7d81cd52a631c83e2601,9c437e922eaaaefedf9c418c446a395cb3c84aa65c094552b8a3c12e680187b07d6474117595ade733e092d63840832962046e55a0bef999bc3394c7789bff3c00,add28844200cc0d711123bc5e867be6411ba29c3296e6fef593e7b95100b95527b0dd9f3435315b80902c180133c3612b620053aa5a3284f7703e6f59b0558b701,f224afa6913c2583b6ad7f402807b6e9bc32142f68c037f24f8126f0605f8bb93ced9d9cbb2b73d0dfd0e32dc731bb843b44adc41e5f88c17707145e1d8b7a5101 +53a81925bfdbab550571db926da6ce9a81130d6fd9f8944f9ef18f4e5913ad93edef2af5d79d1a8e24876f0edff634,08e11ab3cfb066853bf54ea203de3ef551ae4ffc68e6cddd4e23c22d3e596eb7,0fe479d9b695dcfa0bd6d61eec98064611099a3bc30e2ad3244189de3ed1b66239323c40a92a20cee90fb490ed3fdc83a03194a3ddc6917e86e297fb35d0b49600,5255ecad64fcff3157b15d904644258a15fd8867365e6cd0d3d1ec78c5fdbb4118ae750fe85d6148a228589fdca9ac26c027885f01202f36c0d2a571cdd0940101,4350d7bfe561d54f19023bf74fec4f665359ead2e29c91ded975c2478777be524b7e8bf76430cf78ecbb859da5e2049cb2bddd7f5008c63a6cfdbd9d9f402c4d01,1af1ac67ec502c030de357545b2c546129e335c6e7c9a4a77217ee816c482ea632de82a69b3310ddfe3ab9d2f4fcce6ff85d9defc5ec69f783fbb356960231e800,54a94291dd14a59364a87d162a596f23a91b5615e7227b43fec73a70255365d83e3203371c8b09d2aa779de2d763e4cc6d66dd722ad4a995a81dc3d4b01f490301 +330b2e8599f0df0c3b74dbfdbc989d94134d191b08111609ee94243af526b0bc680b8e295a9cdd89180e591e5a542f,3ebf168de02bfcd4398a43a67ad73537b4a82ce96b72138874cf10ea270c7ff8,3331af4fa4a858f763ab056a020dd9525228f7362a9308264a2ea33e58e3f0d22398c80f0f96c849a475223f09bdde37ad3e8015cd9035bf4633745aa75c48c501,48a484f203b1a2b898057e1461b55ccf641ba8c805b45d68a81e9fbcb94b155f36955037d4f114d01d743309983009fec41b1828ea6bdc7c2681b150f33124ba01,78fd244d9ef93f2a998c0c92b1172727ff33915ea5d5c7e160f69fc8950f69c947de83c29d3679870920c90d6afc2f21cdf2e220a4a65ccf2290897048793afe00,60dca4eafa615f93b67ca5ead0bd17dd1f823a5b3da5872c135bef556cde7737149fb022dde9123f0a8e5994171dcdf52bf7b28d5f2756c4e7ffe580e3c9079e00,c37d5cec59ff19be50e609aa9e0174b37cdb81e4be246ba0b8ec30f3da737c7a3584b21c4e005119e3fcd13b3353de6e637780be5ed4ef0e0f832417b11c63c701 +34a572632ac767713b63fef241af9e9dfc5bbab139be9dd3de0773bdd53592cabd982469e0810ea1988108172a5bc6,5abe85bde9530af5f2fa5f6de7a0ec5d7a53ac797b4f9a4a897d2f557675e928,d0f3b69e67076ccc8670a760fb9166bfb7658c3922d24c9123243d4c270bf17147e37374d6183728ba12cbfdbe07d7b6b666d9af04139be96ea67c09b81a635f01,e4fdb8438dad938b42647cc326fbc61bee1905f50216a90155819bafb361b50f404eb07c4ea0a288b180477b110a60c28d36bfa0d448fc8f3d6036eb5f0254de01,809ecdd307ddb92e9baee08214a6faa8ab8cc7fea306978e68414a0aeeae3e1266440d23cf986031109ff69ae25e07bfae99cbe0b8e1ba071794f475c0c7fbb201,c7389fa9102760fb275700f9a0c06f403c7bc1a41f646888cf559c7854466d444713b29993d8877913292d29559679fde9f5b75695a6104f327b71d0f0d9dacb01,e600c5282d9d0c1e65f0232f9619653e22dcfd00d6a1820e868b18e607276a14091d2998d8542272b108ba819d59b374bb26407245779ee3a6b3735788e57fdc00 +26519495dc5127105323eee03b46c07cc239760b3871151e2257a9d4cf26e2aed441cb57a5ddc68fbf2dacf768a4f8,2537db963c2c194b7b7ebfe34b879c4a4eb730cff72e1476a918da499e252c4c,a18dd437dd4a17b5f83bdf1d49b01c8b59fdd6cec4234105a2ebfe248506439c70e1b5ba338e12929bfda8a2605af43437208e5c18ce4ffffa94571c2790e54601,6ba42c6ed778a66b44e3b15d932e6f5a2c5b6f63fffc5921cbcc5621f4470a901bd27ceb81e56254324f256c6255fdb5ed2402ddc6a1a80d61ede6f3aa5defc100,9b1420c5e24b093b6d85febe30689f7e3cefa74e09de20725f8d978b7021c5366973029d3e576d768e8ae5c91cedd63e232f108ab5631e28c7acfffc87ecdebe00,15f9a975c1dc9df527b72ceebe5bfda4a47cf2331945a1f36b0fd7d3cda014a8047df3f8fd5b1dc83fba651d0b897191971a2a1d30a87074e0890d2d0dc2c2a001,4aa3cd3b73bc8dfb847262fac2dfbea06436dc1dd84ea4d7dfa11ddedf5c544044e91644aad6f5b7b1202f8e0ea88e48a449f45b74a590d34a205d6a88f2949400 +504e3ed27e78c686da53db92a915f373b8a38969f49325e8bac2a7393ded9066ae362422eac9c6229cc465102e036692,7d5e7293147b856e66b798f73439886518916e74df61437cd251ace80f032405,00b2c63060d680765e5dabc9729f3d3e758452cd3139364a869eb946f1bde57706043e6d50b03a2bd2e270baf05ded1011c2f66b8400827fd1cd79d92bccf1fb00,90c57b0dc36ba86d17789d41751ee9579544676ab019b40c9f477490930b0c40058661a26b95b0065e30b3d9927a65db51ca2f8b154abfe59cb05a475694bf1f01,541d06da457ae59b11ab8c1ad85e9c246c91cafe2f34095b4974533b37943ea10eb72483e227b839d15cc012cd0bf31e08b743c9d491d7cffd9bb1638d7b6b4a00,38405823f98a9b7779b696c3a2cdae4b294d293b31cc30b8938b168b1be09282190f7c93d64df854062ce905a7bd1f8ed08be690ff99f655f4fb24a438362f1f00,b7be1994e8aaa166025080a31518b80674956c89425bf721e90f099dd2df01f645a48acd0480a0ca886303a5482750caea055ca728b18ccb8e2ab7dd19a6bb1300 +16d7aa9e616cdbd1935e9d6175c0e8a1db5eb083ee2cd5fd06e679568ef23dca3f58cf43116d69e951181c4684eee58a,8828e92dc68225c7c2990bf406e08a163f7a95a68756b7b2ea1003156717830f,fe7bcea68d5bbf93a9b59baf776d0e3696ce476b1d1002068cca7b59790962e81c1b1f2affb403e566f6c6e2d4ffa40165e8eadf0edb50d72e8606897438dfd701,8ecf0eb40c36d8ea9d5b739f3c14e16acdf3c5b8b6452c96ab394c651f92b0ee6e9e47e5c9015fa28911e5374b7f3a7bffbb636ac91f5f561cb7c30966c8f03e00,a896806428c6333ef5b286a18fd136c034be99aa30638e8a10676cf4a98da1f56d7a68c40b17b5bdb0a139e8d0bebca308b447a4bf8753d2f206d24f40f240a901,66392e431dcd34bfe65f4684c133f37af804ff8bedd3c3448fd8064686c2b2224031e77c2e59ed34e2e842005da93d030dddd9510c8f456e65a7150d2b22e10e00,cba395ca5d72f401b2c147e6484c9dad26646b8df602a3b506b338d5635b54c922b606badaaea53208fa66ee99e317ad73642ad7f92f51801d3876150f0a667200 +87359b4a472021a14a85536c16ecfd1c7b6cf8440ac06804f732bb09c3d2ea617eb787bae3eafd6b18e9d0fb9c4b2a6c,c209a78f4caf57fefaa497d26310dc9b4c1239f99b897deb92b25fc936606f1c,09c22ae59b9798ae9c7d3017b22ce9f954f9da3c711dcf7daf63f15ce2b305710c6816b7cbfe5ef8b4c912451fd989f347c202533fdb706abe7e8168df8f4bba01,ceacec4bf890767c8167cc744ef5e0396d16201865623fabbc1e8a2ec3b5033841660457a3e1ca37cb2800ef7a954e64ee72552055f0c37a16e2524018c8272f01,271c974e08b0e953b73012e9c2b0414b27dcb88be52d4b6b23eecdb6d2e1109914992ec69e29fe42a4c8f0188694510335b1e731cee1faa695f41442c62e941100,e200ee38c7ff3c32627a58f209a5e925b84edda655403bcc6744587bdc38f20d061d4fba88e34e39900f80db66a6fef6f8210e9c487356422067f924c318e94500,37e2e09608f042aad74023dc9f41ab7b8c85af4a367a25d17bdf4526bc7d5e8d0f75e60d3f9788df5fe87f5d90567941d171697b611f771b418c243f0e34310100 +5d9c879bd9fee4562c1ca16603eedb78991ecbc6c572457bee2c5948ff9e99030efc5d1e1bfe938316a25b04860d5ac5,95387ce211e068fee6a39754c9e75183381030bf0a43d11b19e58743d7709a4f,f959db99d12d7a2a062d725bf40ca1974f86e4f3a8c366158bef5501e403935e50e856f310a88c8ac00cdcba8bbea5f36963b00676942d6c113454b430f9550b01,bd4da8e6d64b1d2cca3d48b4613d67085d16172997e02f8304105d16eee71f327d98a230aab7e5a266f3165bd05edf69d4607193b6fb4a4d414c2572358c13e400,0358e0397c3738fb8366da3a4ee21ec7245d4bc552d9bf3fa9e3bc1d36a26cec6a3b5305a1f326a876392991cf7e08876df67a277132f16f2a512b892409d80700,0058a0ec3b985e719ade76a77a67397d62505aba120c6af736359216ceeea57d388661fedc0b3730251ee4ec06423b8275ae166eeb55714e6496d0dd8338b06a00,bafc74c43861cdcf022f46ec616624af7a151ad951a99c798f0338184203523467b5db4c601e3aa8e07b6fba55034578ab38b7f4b7ba2c7eab054603f3ac0df500 +159f877db3bc0f6eea66f62f77be7dbae05db861f95675c66d4c71048eee03d01dea46ff6c7501d199437262515ff5e2,d619a1539974703943c960f05224a9b0601113f2e56950b19ccdcad2778f7e37,683cb56383b43b4bb8ecbe14f366c32c54b278e30bdd315ef89f827fb021175c40001c93f0e070b46daea97b45ac0febb67ae39fe41b03befeb7b7bad6614d8601,1e42f443775d367268895287569718b73260ddbd08f58602ec9d43faff71271b35e01067c940711d13d146b03980925216df5705895b7e5e3f8168b02035518701,e1bc434d484e740c9690199e356af985faf6e1ee41fb2eb75314d5a00b2501a124c4e78d8dd48bba376fcfe0633ecd23f00ffd4eb048ec3415f4c9621d03fbdc01,b5f70aa47cec160b5c9528ffa8914a4f6a0fe64cb6747d2eee3c72884e181caa4fbd60f73c0b19815aad4a5a3fb626a8d804d92acdda3ab67cf0e89324ccc45a01,668aa166a8160e74b0d976ae41dbb92dd934359aa933a4424e7fe3618b4aa34d7d6816cea76b18df4666116f1a61e7dbe88b689d2e7f2decc37258d8b8c741f200 +9f9b1c3e7674d318a95028a735bc5615e876e40a7e6676e6f17a3f2cde00fa65ea2e8febedbe78d7d0df2555cf6a7f59,527ea279c2fe85916a3c86861faf72f0c70f65fa57dd4f8af69d0dc2c58531e5,45aa32b08814b26d8c4bd5619966e1e3956311481377f1189387f8b23b95cac50ba8a398aad5f3e9d53656dcaf1e4505435c8f3b9df48841e460d0029c5cacc300,54ac9a519fa23f04a3f17deb449717aad33147e9181d85e328e0addab53d14f174b2f2f860ab1ec109f08d1bec51500b0aa081b265bf8f87d78f8b078ffd66db00,3d0010f3452b465b12b80c892f19267c1736bb455adad7163ec6fda59d4e56a41f5ed1bec7990ce9e340d2b40973d518876fe456942ecc372d1dce45b05318da00,909ca0d6e251d40e95118e837c802bd30106bb737aac39768b4f975d07c11e9c6e8f29de6aba2ccbd328162318ffa22413d4f714ba8059c3178946d3faee8edc01,830a2598bc2347f1d202cad87dd7f60a8c3f9200b5bef014e91ef36c182034107a7243b62a24fe1bc4219e4fb0e9429705e7a26573ff10f26f6a57056b1353ea00 +b7d024a7824e40570272116d6c2c0f20514b1da1541c1fbf1292071f4d4178836a6dd079c0238b1a78e73e707bfefaa5,ceb9bff326e13445742f023373e858587697a4dbbe6fb81aa72d5b699e10219a,58d96c9b6a73829d6a002e44e63072332e618c94056c75aa13b65b04b96b06a91d0147e7f96273cbb3f55b7009e85b4b6b3b25a857944dd43ebac173f4ba0d1a01,a4e8a11051b833b08ef65b68de1f20cbace85d753de53f5faeac3f71837f383c4374d83e8dbae5e455a9c9b09bd5df1c265e4187c52b3a40dabe43f596a466e300,cdde7fbaf32bc3492d5d60b052e32db390ca16a6b8dc107f026e95ce9cb7360852a1f5577a93d83d1e16afde02590cd99b35f6dab73993cb72e335499ab7583601,5199724a1cfb2bedc64724ebd277d467a266eea1265607ccf237a52b6f55210c21268b83d635d3c493c163a166e2f6873b3bf80086a805e059af3be10ec83f8401,aabb15bb3c8ef88dfb7982cba7bd4ac7b961f557dbca34da168b3d10b206d1ba09c5dc259a4e2c69655b82e935e496ab38738350df4cab2679bdd7977696cb3100 +4fd9cfa71687d507d0dede19d32e8e16cd11dd3ade70756c3023764a58c9cbac91aad3fb1425298d7a8bef68c1b435a3,92c5e749d8a13100cb4c1e7d03654e48e9cb23719403c125c074b7cb25929c20,e0066a483bcb43e0657b12def167e8fd3cba36e25fcc98c4a5fd0c84f09022c949b3fa4db9fa0dd22d22151ff42953bd4495aa7fa5c10fee14825158764bdb9f00,63edad549f164b86e4d0b3edf3ae27f7906296dc12e1f59c78f155c2f7bf25403887c27d0632a400c73eaa0d3886c113016d08e363959c1a1c3d9efb93c26ed101,89785bb217bb489aad834c32ebda5401093d7ff6a0f9f2f725f21a7cad22ecba122d9c77ea969ac38acbef2e4e46de30d1de174e7f9d40d428be5baf566f682e00,4e573c07f7d4f4f4d77bdeed6b39e8392f474bda9f3d217f33d745670bcc398e3b678525ea77430b2b6c5e91a4ebc4c37382ff49d647619b13d7fad73acfff9901,e9e34ff6c43752529e3a6805426e1912417c76ab5a9e310f70e7824eba709a492c66b6713fe844ec4de995cdcff3aff94f7ef192bf371ebf91664964b2845d2400 +c4a10a5dd4ba20d1d5f7f5bb790039ecb0c364973fdb73316adc672ed76e1625aeab0cd9359fb2585a92d0a339d65750,2592a12b51e9b64cd936a76fc28685292df1503e9f511c4401197116af0bec96,dc42daf663133c549222e1bf9e4ab85bfff7b631586e174a9584b6d6d9627a2232646e03e46d0e3e9e5f5b8519c4792fb00ae9aa50c445471db34f923141eb6c00,7102c51fa158c6c70fa24e101a4382b6b41fccb3defc94971fc82745bd3549d167fb1416b26db2a8072c668f57b3bc6e46aa9f467be7a59a6ae4d79f3baecc4600,1c7a367a28d8ffd3d4dc0fd64121d26c223fa434d630cd6509430822f0382c0751c8219eca3cb8c5266efa5acc3d5f43d87a4fe05f10d2733949f9b4132dd4f900,61707ed8110d73da4d5799d2e274eb25048548f2b64b3374c3594d322ba763e042e6bda5612b82251d605b2b362d619bf48e7a09618f335a0ecab5936494900401,4244505a9b94cbef17332fa5406818c7aa34b374d4f002c89f006ea1e26f030a4ff2f562d7a5565494a06a8de270f4f626717ba5633734d8acad414e216c1e1d00 +46e216118b1ecbdfe7ca053136d9433e86551b3da2a44d8dc2b56faf72d744df5b8e328d825bf6d989c91030578aedd9,3ad1ddefe3dd353b64de9a0e909deb47bc283b9ede60bbb6f4ab26344600d022,5a4e05f3f7c0180ae318c85f678cb8e2f6bcd0922fc5fb6de861f4cfcd0ddd8e4484bea04bbd54b1cc4f9ade2278b9c2c68a50504405da225f0e1fabe47bf43c00,50284ac5d709fb5c4821c6c373c4fc9bbe308d23977325d857248ebf5f13a2285ae9f618b88cbb4e175c9aee16d95bba08268534cee316d680db2a9233d9f3d400,583642df94c0cd87e8eee5777df9124d97418b26855c9f5f784a79fa172264824cc3793ccc0827383afa272a357c3db67d366f0f3a883f1fcddfd7afb047cbd300,667cbca1218304c827594ac9c841b52c5dd5af14ecda784ec1d7a15f8a683b4161b1203d4791e2f98ca7e92fe608ffc8d3027a871fb9a46bbd2fb3e25e2a174000,f67dc862a3e6167aae688345a15dd82c2c0c4a92b40644185efe7969f33a13f2017b6ed78c7b5b6c8b47f290b6a46d808ee06848b82c2989c0780a108b58711700 +43d6840d3deebdda03dc9db890e7551fc6506e6da391d588e86901b0f1d4f9478fb40fd4e56bd9146b6db30a95aead7721,7575a0fd9a22b8a69354e66178b149084933745c8059414512f13f2f1d7e9038,16da3ceaa252487447f0ded9b7e59f96b8f05e471acc485ee22e8c1ab5e428d318d08340faba320239fbe895ebb2165a27aff578658029709ad486ddbb85e65b00,1ba20948cea07d626e190d866d4d16ab9421f605d369bb751c6f57dcfd712bce31b3c9f4f3abf34678faf88d939ae20311667e6100874c7050e474ed5ba144e901,8c38433b8f2860fe099d4d8c4de4734a34802ccc2f653917dc15fc5769d186c67b2907ebf1795913d778e5962fc86b28d026945570c7bed12c28b270a6de6e0501,9457d9e5eea4c9e466844f1917e5774abf2d718c9ff305b976613da3ebccbb1d694539967bf21a00f0cf9b9e220db813db0e6220c30acbcef91d84c76e9a682a01,84e5bf5e26232de486c5dc50eaacf52630b99325bfb1dbcd34cbced354a3c50f166b7ef2b034b3618532e58e7df8b7ec03ca9af52561a938e67f14fb1f31a08601 +45dd5d4240e4f6351f976ed7604be991e2d84285fcad88af75043a8cce53e5060a4c18892295512332a85c22c383f88c33,fcb84e25aa4d5e10962d0e49a74e1e0457593a79839ea42f0f788e77d9d6e1ca,6115e62188922bab2021ed091cbe972f9c265ead53e9aaf7adb774b061120c4c7d8f65de5faa12c25fef1fd29d57ec4e8210a85cfcb20603446b7e4e61c7890201,cf5c6dfc7580611d93cee784f31931478b617312a1a27646327caebcad6932f52ffa5443993f40c456627e16afa02ad500b419b8391f13aa3322f2712170c0b301,6f2a2c1a46014bca93a1c37445ab9834e2e6443f6dec87b857ea5ccf5d7ff2a03c91e2c12149de2486dd8dcb9635f6c979933c25ae52d41a74dbeaee41d4cfb601,8299136df3630e412dc9f96ec26d5e4d5489b709ae897bd5f81ea54a48d13e106cdd7fc905b17d051d65503acd28c2cf3ad7ffaf0fe9a4703b24197a0393b5b001,c66af5348e6bcb82ff8f446734cdbed8099cc34ecd7b7c43b28c17c2cf7bdd5d03c1a8b5cb4e5e90198b063c08b751170ef7e71ba3367315e1c79624b036219200 +f1bbea1a67d136801e0a1de811023671f3df520f6da70ab4d577cd1ee08f597f426be0a2a6f13a8fa9b3ecc7769ff36c40,08eb6eaecbec2334ac3a8b8972ae3d1f68314a9da93bba0ecf959d22c2830290,af05a551cb6a89f021f6660d7d311989f50e00b66d89a0e0c1c6a24475bfe6e24cedf866bbb2a4060cccc9d65a0ae6d07c68cad1bd4b245120992564c89962e601,a9d4866cf68ba8fcfb9c254adb331ad6b9cc66a3b7738ebf72ba210f8691fa5335e600daf3e718fa88b4ca2473452954102d9e0e801033a75b879080cf520a9c00,f4b9d67dd0521678c0958b48fab2633f1473f8bc2f8345f481c96b378137be7005f6a82adfaca418f61b20ed64066f8df99c5863e977203c4a48ea63e6c50ce601,1f39bab2f6d0773cab5893d1ff958523bc30bd6532b82a3eea4412389792f0c21e66a1f689d2a651bee893b79fa2619878daf4a728837cbe023d55d5d008337e01,b116b50be44b2a7c02b9ca18ee212009d769bf80063d8d69f610cdc43dda3e604b5d9ccb2224ca19b84c397abb48fcfb8f37a83d16492e6ea3d0455876a4885000 +2f0867ce9c99fc96deaa478787b281f773954e76b9da38a031c13e7f8cb3bfec59477098857ad85b6b6c01065e704345d4,a835b46b40d2f62bb30f5bf4aaf489b46d5afe8e6fb4f3825b872ba742112e38,09353d9bf438073b5796e47506cd138b5eddf8a440bc6d00c9ac1cf47b40b9e72a90be503005b79a79b59c65b15fae3e5a4873b537ead64c1ec1428c696e43e100,fcc155b61561547af46393547173868acf27f53c55cabad9193eaec0361026ad3ce09fede2d212319c9387c904758c2772bfa9a6b11533ff09a1624db63cae0701,c0da04422aa1629a2bd176afc568aac1cc43df4f73f7864cf04c407a41ceb4de6c286d726e27186741dc5299d9d4c8594b5fd14fd77751a0b9af10525b17e1b501,bab62c6eb809793cb0f5ecd58b13de340e247f520836faeeb5160208dbe80ab11b2f196d0f388095371c4715716fc71c9f132ec356ef9dc39c9cce07f21b5dea00,efd7ba95d405cab37f4b91d292c9e1d9ec71a17f903f3f179a152c12634a767132a3ef57f2be983914c8c5b543dff79dccb25360b7403b290b8ab2461c9871a201 +7a8180c2b92377b828826022947bf4d50d99e23d862e091cfa5f101c65ba50b27711bafc7d376c98e9805f2849eec03ed1,3e50e788ea1f6f4871eacc392d56eef801600b872d0793fcce2c17d06723a634,3a98d52fddd55b3019c3b3c2f764244de9a3fcad38ada50252a043e3ba3f80c12ab892b6698ef6fa4e3b0322b7d527fd107154471aa3e9fc4915200a1444ed3901,edc25743f84d62ee6d073c0257ab543a0751aa95fbc0138e25c67da54f6619a34d608b72bc0ee2d0e38f6d1c5ca8a4f271a68f3704081f8516b75a95210e7af101,dbf4621532dd4d347321ca917e85c75d05a7c02cae8eafdfa13f1b983bf7c9e154d376c742ea2940d4d9ac754e6dc2c1301b594253e3e4eeb5944596b58dc92a00,adea0c06523ad690fccac102d0dc7567de7a25780b0f325e8b26fb5ede02190b6d0b90ccec8994c5a5ac1b07ca8ef142e242fc0b9c2d068fd9f21d0e0cd0724001,88485f6e00aa64d2c66bda90d1e98e9eb4bf7952dcba159f943942204f6cb0bb420f64f7d636bc790afa2afe908d80666e3539a9644be5fad40f95df2195908a00 +0a1d98cf6fe3313351288dcb7e4b626832c5d97ceaca728440c46bef85b94e7b8e8418564460b17772433efc2a0e7468a9,5f6b6fabf8a6baf650b3da572bea350205ab44df30658ceee80dfcbdd222b8ea,1cb46f33465bfdda6313ae607d9995e821226e41cbf4b2246999a67d61b836dd7a11315c3ebc9ba3541b0368b7422a68207adeb5d8904c7e767e7c728ad90c0d00,c74e4abf8d65fc942c1abe9f3d2e4c029612e93fe508e45fcbf2ba28f8b0c9f667c3453b78f8799145f7e7f2971eb1530ff6150f73bab6dff2121d87b38404ad01,2894315e5511b15542b3af7566c5a4b1f1b81e49afe4bd58314bdad440623cb7077b283828e2a707c62c6216aed46006c8ba3757e1d96ab5dc083ee1df1524eb00,fe745a4be355e9ff009a1336bd60f09ef0bdf1c3397ab0bfd3b6d93404a6b6c30396c5224d996129e552023dee11f05e6e0c2294e49de85e3c1b5bfc80259d5901,9eaa33d4814eb84f2b18d44b2c21fff7fd5217ad2b264bb9dbc88b577d3daf86047e99819010e7858d586e7552336c6081ddcbeb6fda0bb7c03a6b086609effb00 +da46efaa602c63d01a6a37f785cd77ba35f1f620ea97662dedf445d11ce9ca85fbf462420c6dffe5ec27adbffd275d796c,d4d874802d84ac678fd2e492682cd88b40fec3484dc3a41b682071c8ab2a002b,1f0a628d7e38ae6cf9adf7a5769159bd58b8b9ee4f1380f988d435bac6c064914caaac4934de4be179258d30442670d4fb526354ab1d171901599ac277f0c41c00,1eca64a8ade350158152b1b410a986476ee17048a7143fda541db0df859946d42c02f23f0dd4c6f59dad970a8bf9f5501b8b2edf137dcedea253206c7ad9ef7b01,e633d41a6a440fd2edce73f11f21daea93be030eea532ba654170e2b08d39a21757b4b69aceae9ed3ebd8d06de278fd547dbb61d225cc3e1b85ae5c3e006bb5001,a50eb62bc9808e5ce1d9dfd3cb64549c550b71713bf5dc6eb55ccb2ba58a7ae52aa178b5f58f78b478da918561672108d1fab8f3d6f1b5d5de349b37242091e501,f4284fbf14f6eb0599d7d9a8f30ca02e14b7dab17962a8cd61078cd7a73740f85ed1bb16ba3a288f9cb1ea8b87ce0b2431ebdde3dbdca759aee074cb3fa1861e00 +ac991e70b9a04f5784634cc84fe34430db29cedb9900c5a5e6676054bbea0318d6157fcc1ee5324260fa78339ce3d0f42c,9a4f0d91890cb85f1fe03a163e0e054702333b44baed676ae77acf01016a8596,ab075f757b039379fa8e751de3d0a92e87a0fda78b525d863c75114f0e38e3ff719aa1a42868ad2d696b721d093e2d63fdfaec3492d45428bf9a3815b526aadd01,dee481d452af95e4b7a13b91a9e8805b80a71b7949d9d0bb0b47829f08e738060d50a693e43d92b98e3fe516dc118a0d9037e0227296901a09c653a9e4f71fd900,ae865a74ba057aee5d4f0aceabe7d1d4487e04f6f0504783902a76c1f1ff406d3734036060c058d2fc7bddc14659ebd5e460c9add1fd5f5700f4d6cf04b821cc00,5df1185754a67c1d46820e00107f298d1bfa24c920ba3ee19633f0a352524bcf193a2f3d53f72cabf5a48fb4169ffbdbac0d70ad58e92e80d347f00cec49c9aa00,41a29e560d4e130630d7eb542cb6aeccb7133d071d6bb38126e9a2218fe2ff8570430e02e3d147b0aa9587e73b9c11d8cca8cf60669f9fca8fb4cda1e8f2d1e100 +e8099d7ac891a849a9fd416addd71940bb8b0824ef8bdfe479e97b69e1c8fa0d3221ca48d021ee230e87377584180b16b8,39cceb9c2fcc88a4f3b98aff174143bdf747c4e6aa662481db45c83b16b6072c,04e9e67a2b6771100a88688d4909e8744e3b4826ec8b65be359d83cd2755910a0e3ccca31fa0cb99603c98fa3d00c4aee552cc3abda802b455bf0acd39f4576500,317c43e47b781eaa589946eb287c59a5915e858b9f867e24107df6ec047bd9243b0fdfb887d26c8acfbf4d8b4472fa0ea7726279c6c8df81358978603f5e00f201,c005ff219bd9be874ad744187b7a500add3679abc36a68b532744b1d7364c048111f8f5b22a1433667666515901a5faef64ae5ff1c9ad551e15b2fc457cc2c3601,7aad8b2c0a6cc27740d1382a49a135cae932c15db904a0da1725d2bbb422ddb85df0df9b4cc396f3e4815ea82c0a5239ea0be32d04e651caac4962356d27711101,dec2e997de6c90ac32b263eb6ae9ec33b21d38d2fa107c703be1f825cbd2ee515e16aa1f088205a3bc7ef2ab110124d0cb31062f0cb96095a821b181fc80328d00 +f8ec712b62b5e2ef589379b75fdc6d295aa24cd626a174d0150328c96079247bba7ad2ed21a15a3d196048f61d6996498b,2c37d8694be67651933dda2ca88ab79fcb3e33a8857f9f1ee61d1fccf3f50ac7,b33a4adfe72cf77cea68fc6e2167916aa0b28b77e5625ed17c997c32c380d552344b31b7db5ceebcd434b50f00baf6a2dd49a15d0569e0df824cc5220ad61a7f01,70b5d48bcea86d5620ac7fe9b35bc34c34c36ce2d97c24582555a1da52d338645d0d775abbf94fc46b9f1eaf11534a807d9074049a46c4ff04a868bce19b218c01,ec48165c6c4481cfd4c53b4945b9972b540acfcfeb6741d45800fb367b2060dc5b859a5096db8257256099ab086bcd23a8b2b9ad5ed494fe3a1573e20e05369701,a759b67693548cb4e67c341c164adda0915dec8597ecbc749a992f43102a5b95398a6dbe182bedaffcc4c87f2b76b761b3423f62e8dff651250c7e444b0e07b100,16951c8b0de1187e95580da97edd59a454c6afbbd2ad1e58e25e92be7e87c04b27247735c3646f3b47707b4cc52b71a0a158c8c68737358ca36a101c13b2717901 +d7a873bc50796b7d752511f44f94ef42e569387f3925d149d9cdc7fa209678c55167424e015be5a20a15c1910613f9b7ea91,e3d0009f6f90917ad9701e8278c23e5b7d088b9373ae6556fc0b42ef2468bc69,602f96bfeaf5bd284dc38b3faaef7ba584a187fd1a471103bb3cef3725c2d89a2f86be10f0a6fbbb590f68381a6e9a3b0332e7dbcefd4dc967b2458ed50713ec01,f38a0086ea235dac17b6d40321bc6f0681c45ba467815000aa4fee19a93ba82c4ea6f9593543ea28193052a53aa7c94661548983a6ed2c82469c6df85077c45801,acd6eaa2d3ad6f0e7053ee0469e8cacf78afb45d349f3bb87caf6bdc1c723d072f61e1b09acf72fad58dcc3d1c189fba372fa3e17f494ac8077847adcf88520501,428f7f8487ff0b3060a788b0deaa6a017e7339a0105cc19900cd73470047d1b82d70d2bd3030875b55fccec46b40c4a9f485b4cc256fe5b457a3044eaeeb13fd00,3227c64ea8a1e620ff4ef635732359b6fb4c674b5d95eb8b5748772482a354f46e35182bc3c184d3a105d993869387afbf5ddca7a0ba10821b7a267ffcd1f29d01 +4f4fe4b0824806d044e7537700c90ab058945b78d1ce42c29047d15dde119e2aafbad63a7675fb11739331a916cd60776a16,59ace4b47f0d3704f23bb35c2a4580dc4bae54157b033ff9776f5b0afeec0bff,7d31788d1e85c78f4f3e3396da2f841c509cbd458fbcd09d814a3a1e7bc7858551ad9fef5e030e4f25e073c8c244ddfa291ad158e265c6084561812fe3e5af3900,97c5350a998edcd967ae8f68a1b788ddb86dae2585520d750bffd64a0c94103e401a2e32fc580aa80006bab074ff96dd449ed6fe050069eeafd2a86cca5cedf501,ce51385230ca1e128c60f261bd23bbe28c89eae34cbc037f9e2e7b97e5f698972c522d49bebd56c2ac209e03e822af16c133ed5f8c5c2e35fbc0a6f02aa7bd8300,405de38969a18b076cd5c5d5380927557b668b581e122b872bf8945890232e55183b2f39a836b855768014cd1e18d071b08bb4dd3525b8373ce7cac82d0be6ef01,012ddaee98ca1ec26fc20e1b9f28074663e264573f24cb59b2875cdf2d76a77914b521813527317522bf7e9163790ed6989b3eca13d06669deccec1a993a698a00 +3564c91affc264ffbe9cf2fac9eb7b9a75924c1b3b6f63bb9436db85850c146462eae0d1c1e145ae72809d6ac5445a34bf1c,5f9e661f20e0a2d8438904f03e3b6e389713f9df41990c2c255afc5052a8901e,0458a63dc8fb2843adb1d72977656f1a3b612017d33124505ac9c60aa679cd255d4140909bf5213f32118e60d656a4c951639d5b001e54d1c033857fb2c9bf7501,3421d92a8636d4e0f064597962b5dd3cc89dcf1991552aa19f60cbebead172ba3a74bf79f263c5fe40b034c01c29311f73a30374a9a7cf790ad939772b66077f00,e31f24f679e89cd048a09da2e1fe55be4c54ceee97e188df004edcfee4ce0be069dda8baf71161038692ff8f17b6b48eb6b503b2147acd2939249eaf34860d6900,09a50556a5ec5979547160d9dab2e974b77d82eb63013dc5a17afc8f2dfff6810ce30940c5bdd820c1f39a41505633b15fd40d7077da3f9fac081c08822a186700,5fde2a3172bfcb56abfe3087714e8f5126f3a7496595b2b45834eb1e26dcf6931551f07da4a077ff8fc4cff600224c9bc53e8d7f8aa8013d81087b53bd40a2d700 +e648ceb2073af482bf286402819b26340aa787d076afa889c2b666093f7cbb75c62265e6a7182522e6d42f0456341a27df1c,4c3e999efe249315dd707405bba7190afd0aa515d86b03b76c7a9a836193da08,7bf50a355b7dd8eb7836fc7c0b0f78eaa2662555ba39c28f674d6e86cb373c9931df8380b3b5d4d933b90ef14f8f07405c3e7911f52f57320e587027064171a801,2a581423f56fe3d2d531c0011d1c8d346f72ed53f1f09d511699e1bd199b080a31e51bf8bb940b4c44b1cf49b43b85b0c161e524e9068708b2ed11467a66f54e00,3e13b3a3ccb9d04a40f9f8af196fb65ccf622a07a04189f33d55a9f2b4a8d0071e07d7f38e4e61bb6e44be329f06f838b5bb1a676d0cbf38057cc0b25f69889500,7d4ad64486fa70fd3964fd38fabaee9b831075d8df7223615d11d03286b7ac034757e230bd8152c8785e69d2addc111ccc77f80c320d73e533b8c6a47f49f66f01,08b7cb69f53ec00b0110ca7d2de760a423e310cc5641072ec118b6c620f77dae0bba0e6efe19c6606c01d16407705a104593cfc384f980c5f457160a1a3e658000 +b5fdbf1d6c2201578ca658c0d0b2ffe8cdacebf7decbd7c36c61bc175f2fa7d430947aeebdcbde64301799b0265b764fefc3,6c0d9703d684a5bac4a3c4c84cd46a90f0da1cbcf70cafd5a262ad1f7e653aaf,ec9e6393b28d9ce1a734cb3734341194c5a8e1775ca24d18d3862a02b905820047afd71e1b5ba855756ffcc9743a6c508fb8544105f4785da90be2822edf99cc00,b5a1733c6534a041ea70abb441c31a4527be7e54d644f161513eaaca1abe957b79cc1774a97420ebe7137a685835c10114db152ab2404927083fb3e58226dc9800,864e679872512ecea787d2c21a18a7950814b345664db72256bf4d323f319b84126d888baa5f2d863e70f9653dc185dcaf6f1d5596a3f858444b115b4269f9d600,b035f0df2c7c253653843bb41c74f0b5609a95cb5c51f5e0579f4959066bb5fb7cd8fd27f820d10f52458fe887cc8248a4185f312e75d2a6ba5c6140be1debac01,7ee43c535553d1a983b258ddc465ed8825ad15e3946728c726dc8741193f83e044ba629b4230945a6940fb6991ba7f1a10541ef36adc77c8654cac22fdaffff200 +5e75eeae04de6d2f06228a0fd1b8c05580b8362ecc091a9ad2e32258f5d885c18528656dc82a65b71ca9cfb48c1809b44898,262aff759e913d66ee6fdb77cfe52251e7239df25492cdea0a3aa33e0166e143,208ae234340ac8c8f8f066cd28feafc91b1a0fd49a0cc5910432867456d7932767b185942164029268ecb0f9c378a255c9783dd520c44e0890d5a19cdeb15f5d01,368ba8c43c25ecca46e8c0d939eef7e3fb2504f2cd60882dc92900723273be53652191236e4ba625eafb817da3d98543e98aab3f4f22b4a9fe3d6d2c7e222f2b01,f06d7c9881db902fcd4782dc892728ffe02ac5978591c927cc4e957a25a4217328ff5d39409feeff4e7a38b8ff29b6fc934456542f4bc194321b5ee549692fdd01,23e2c1659f3dacf1cbc34073a8e52ef69eca63afd52222e624b9b1f559dc41f50a91eb34386e9fc2c1995c533c8358e835daf2ed7aa7817f3bacb1ec5704bbc601,26cebcbc484e827880a01dc98044f1187f008af346906a88d17f75b128207400315bd7784f03fe7a2bb379ccc384077b2b06f37dd0728849328b1b5fa5b1c96c01 +4da5776db527602f557376e968cc5f3708324d6fb0a33a0a3a109fb2e7e893b4b021da27374a801a11074d68fff86ea18260,0a5eb6b09a024d8f1ef53f55567c461c13cca629a1d8ff24a0c7de85d3a510bf,50290ad1fb09038661c2a85386c74a261bab7ce6927d728d9d9469b7537574417bceb8edf2f19bd19bb55335e24ad55e1ebe3f3e30b0c9ba3b87e3372f35482400,17b7b670c969a33d3d49739b88a2f200ee0ada9e071bcaa5d809b2b8f43033aa4390fab8e0de8d9be7fe5ed14a3e283778c06f1b2fc636b49ed0027cdcb34e2401,0d55cd72980c92acc174eca878369571a6d3be85ca0b3ddbf288119012e8f8373ff30de7cd6dde3371fa9254c5c3414f15f485b1cd786e20070f803023b4cf2201,6b28741ec65c197e6c5df6a58dd2d378e83646a3bf070927810b1028b37e5c1c041104983f820eee8f1ca86d2291b4a502159ea0c61994449862c9ddb92901f900,f164ba1d7f11ca7003af6d1ec3e2cc942fad8fa69ba6aab5eecc849c0c43c83150d5b9c37b0ed3a410d65c9a16efc54bf07a8069a9a89c72bbe43ac0a3a992c000 +c1b6ad7cd999685fce9f56213f210b16d66efdebcd7bbab47505cfad84fa57533e58412fd2f010d89bcd68e84a5eb7b6f43f,3a98b53e10cd28b8d626cd26721d8aa0d072539ff948d7c2682320eaf1b7fc42,e07f598b43c3184c622c6c00e05706a25ebae685c6df6409e420089b2e9ece264fe6b5babf2bdf0264bac4453faac8a2ce846de785f06946043bb1a1616848a800,81289448f6540b84a94d242168013eba345e1959b62b35be11c3739c39ed0fd54dd08a189a0ce09edd066c3b22fe4ce4baacc72fa96b26a429f11a9e4788716a00,9f91d26b1da0d01a06566102b5e2d4479f293864533e93c9e4b0f23567e90c3a1cecd328f6284b89682caa24c50f317db8670ec95ed0717c396c51cf7fcb1c5201,9c3f4381d1dfb8f13a783102cf1eca1472d7a983cd9db228b78b665b840c9198329af6fe9c5c430a7b191bf51a1382e805679476f53be6408b6035dfbf9e52f500,197523de40502d6d100107f1993af3794ef30cf5d762e6030e32769a0e2d820d128edf60d31d0fc32e2eb25b810c0019651125e746ebee4691b07b5d2d9444a001 +49130126c144ae6747b48ffc7d3607f7886ca09f31b59a2ddbfe736864cf172c189c1460b5e9497a0113ad743daf4aedb473,7346cd884291f307945f70c865f097b5ad3a10d42ed436d0c2b1aedc39a84ca9,e97a7403d9ff0428aef1e6987e9712e567474c0ca8559bd03742942828790ad95d20382870b8bd8ef977411c41bd69117ad96ab7263434782f4ee52248881f9001,9925df643464c3ca2edc67329495a64ad9dc85aae7ec9a3e33fb0580c33286e169fa5f23a8fa694fecf57f036771cfc29981d5530d2a5451b5e64c2547455dc700,87457c3b18616d7189afce772093fcce9076c6e8bbce18f8e4ce8d86c72cee7e3edd5ebb52b13b96597ecb3e39dee2de78746e6dbd6daf2923c968788e1e22d301,a17f7f181fe3db8ab275bd48cfc1eafef7de18c3c18252fe5440568cfcab1a79749aa824581387e3ac1fe4e8141e41021dc36045d2d99712fbfc1ffe67320cc800,36ca8aa4530750f814d2d931013087996eeea1b3c4e22a884a1178f2ef72ec8032df2b069ef146fa34e57f0a2b77b2cf678b5103944782bbe3041b8b084bcdb400 +2ffea7216be4a0394857f62b9af072ca6537a6aef069e1f5c5469c733c25f059f68ca1ef7730ac77d8f604454dd3754b836f,5fa22b55193c10ccb3a7e1e18807e60db7458555e2a147f5bcb73368105ee683,d6e6c0ef09cdcc5c152597d1795ccdef7c994aac0c80c65bdef164a8814294bd269cc59dea14c59ee6d60a22113da41cf5ee647d81e03e2e49eb8de3b445fd4701,f0daeaada86e3effc5b0ecf92854d620b9994b77f7fd7c6bd0c329baaf314c255745da04334c6c0aa7917433fa6234c2d5791c2be701c20fb0c6972e8324d17800,85f0509bf94ba94ee04cfb07d938e2bb564e0a448b336a203bd75257813e2c497823e18a9aa23d1d45a71e1ba5c48cbe18707542fd1c557049f9c8c2df8c26cc00,5a4179bc50a40d8d1c940aa4a807c91d2fc614be9dc5ad0d45198f679ff9a58e0ffc8976b92cffa97886c9b664915e52e3e55873e953a2023008d35e787403fe01,9b430502445516f0848f2674ce54d534ca76f146ee6d9ab71e2498fc3a27258b42dab2a2ee1acfbb069d77bf943dac5eb7df47e3fd0c553b9e589da6675ad43201 +bb2cc136938129b673a733cc588875d87c1e91813abc0e70942d161f884f42dbfe7156379886836282a57ce57f2c81794f6718,a96604e57dcb013d21167994c72c93dc4871bca394d71fc0a811f1fe180d79d5,e001771b5c7d7ee52000192a7f18c84c656bb82d9517512abd57bb0b15a985640f11e08cb004b98c442f88a55ceb2a9957ee09855af9518a2d99c9eec5ade5b201,7563d67c962e287f179ac203240e6bb9062a875f9b264a4af905b5299033fda4691862df4dadf7260d309345ebc1eb1b152c7be7134e1ea40e78fa98f60511f401,c25070bd0361ba296cd30f490b75b6f28f67f0c457890127726f076ca1156c375e0204aefe861a8215233220ad4614b483fbc057ff3bf2d983903356e93c9d3f01,534208bec0b8752bf9c3c3b81b812dff6f73215efb7aed0731d172902a7f3cba05c89f1a85ec0dae1c020a41f7a442b48d2f4cb1e45f03ff3d459a2d801255ea01,2830aa6e0e7d5a3e57bae96a074d2997bbd3489c50be5323b757d0c07e138bd10da632f98bcf41b88a689596c1d31fd000948f616f0cc6c22679da39fa937ca700 +654436643f00010c3d0f84fe1fbe4452ed488725d0f6a86ad6cf8ec8da166e6dec4ffb5eb2ec6c1d1c5d9397bbae937c19a533,c3672880d6c981b8c132496b5ce87d452519e319bbdb17208eae52b90bc44365,287feb17d09c75b31ab7a76c3f68f55bd10f6ef89d0a8ca9b1af86543bde53e4654357f172d3aed4720c1f2dad92a1d5de04613fae07835fbdad174b2bf76a2700,dac8c223edc424e595ccff5719741936cd062a52552a9312345cccf7d91dae620ae2394ecefba95d9c4bd4214d23ccf6b614d1ba3617c6ea212898f83154604e01,d42e97f43eab85bc0cde5322e4871ad4f1bf6c4f0d3dce5576257c4554b8cf227ae234491ced5371ec853fa3b6298054d57adbbf593ae3b5f54de05df933afc500,5069f2ce52f116a1bd9cde1946b494a209e52d4df409c3a653b95520c78055eb260d941108f2f07221dfceed0e2b00758d5ca527689747cc3d282f5b7914a09500,4f04a06c2bd53752b14b1c816147377625fbf33b65496912c44f5727ab8b890d2b1fe209a01c749021cebeb8caa5bfc04d5c052aa5ce640c894e3725b72fb05800 +71fdeceeb8e294e8cd0b86c1a7b274da06f5c9544d072cd36cb25225d17b5dd21c75f67b6e7e7b6a9420348c49b427500d0cc8,7c7ccf8b02a323a9c8ef68d17324e09989f29351c17a0c89a91e5ccb43542071,2f6f04ad220198fac94c2862369721b8ab52df107953a7390762fcac63a71c5e7ac69ce4d371328b7b3c97688d19d019a29ebd487a68fe076cb7817de43f4ebc01,e3a1b5908beb01d79c560ae2e97fa0f37898ae60a828caf29c0d9e36b5e54c4a0a7dcea8120e6fd575e1aacd6c14c80146c3a9945e15ee62305d6efb51e60ae201,c82097be01c4527c269b8fa24418c08d3a8f17decac7b541fd8d9182123e4af31ff6a71114a57194ae2f5ed2d4841a240b3b8ab59c99be8ff963a479f4087ff900,60a3d3759dfbe178f0f1fd60cd1a8011d9ec6141b98bc7e9536cb90a4061cef6012ec273db3ef09b46d784d2a1922a59dffa861e100550c4b12a65dab05a986001,0761487664ef4c755170279f7e2beeb1343d545f5f9962341a334c40f020fcb94df25fd047b6cef0f75c1cf7417a6785a5bd13215bce74883e2ef5a378da5e7501 +683276bcb81c3f6a642b75d95f0e28983309436a267a5d6b0f4bb618dc1a2bedf6e6bd8a75b8f1249d91b98efd7f0c62035074,2be1e7edc7d61ebe699aee1c2ecfc873b8b388fddb47bd3e76fcbcd3e1697269,1de73e2c99da5c88a4ee1cba2fde69ee819b7b0c2bb29d25a99d8bc4036d21e07a561ab089dbdd11b7021852880891a489926e0fbd14e84c4d3d8be70e7dba2001,8315aa8920cd31a0985c6471866aa4b648cb41d3f9d147b92e5f9a726ba147293af0d99988af179e9c4ef381c790375b1b3e54bb3026178c4fe3cddca737840c00,79291d2acbbc99af8335cc8b93a6e0c2a28f2c372a03ad418361f0e0d2692fe233da3a1faa1db8cba61f86c428c8f947a74d41e5f3b4b2e579d688d62a97e90800,03e8420dc6001741e8b3946093ec7930742a1b045d5dbf23393df722c74ef968439bef8e17484c12225070929707c283135c1b140a711c570a004e677a166d4600,e40e8573c43db1e191ec8d239c0d9edcecf9ff339bc92c368fd5bbc874149f94184c12d9095c0d1e92f4775b55d2988646950774e8e49e9a2fb80504460bb1a401 +3f8b25de645d889424fd9a257106bc8d59688c899370e46bec392daee04ad17adf2fe716af3a7151839960ce94cadc0b526ed6,3fb8ab5bb9e43cf44f7db03d4108bd4d1ae15b37e879f902995e6468cf74e542,00f68a17fb845735a3445a9a398c3604cbde4347679df04599730b414fb5f8d9204fa5242fb47bfecf19b84d8a4569228468eb420f2ff57e7edbbc8145659f9601,62b9e0fefb5e59964c2c812dc6ef9ed01fbe5525de75e67a10e592e024ba47bf27fd6c772526bc1b7fec322389c65fe24f87cdf0ab2cf37ba2e32311a45bcfc201,0e9561cbd82facd38c34a9155e88268cc076b145fa0c889282610323ec68907d68762e9be400411a9e1b47bf3a294e2dcf80efe9852e2c2d25c9bcd6353d904800,c3370693a446242302abc82a4b477c6b40223ab1138866c139d48b72324b81dd414c20eb29c300d1a5f9bd9f359a92dd49d77e6a0af005c57d94062e5b2f306700,fc7e54ecc79a421ef64286afefe30e6dbf8becf3a6b20bfb41bc2a000b5e80e7133184bf3dec74cfcf2e7e1bbfbb99e77dbae3e5ce97a1e7d00fad0b745f371700 +bd779aca692e30471b3be2de7672ecb6fa663f7a5ad0a32f15d6f25eeb8c7d43e091aa922e89573ab1b275937b43ced1340664,d8ae9e52d6e6dd7fa501f0e5a1936bf157534cd668f4935a2da99a03bc578da7,06aab6c6c057fa0ba23bd15ce950eb05e9e6234e3eb6fcdd1d22531e19a92ef27a71d8e05b448dedcfe09da3163d36347327f0c23e1ef919dccfeb430361fafc00,09befdcd642badb7f41198cbe41f2cac23ec3d2278bef1e63272fb6867df1b525b60ffd2e1dbb9a7ceb132ddfbf93f69ef1aa44a433bf38e894e5b47ad0de86700,0a41dc7654d8822791437a2d2604ea037565f21d80f3d1ec7616171fa8d605c23e42aced3bb0c43c452f88db6685285f4c24458f910231af86cb8329679c4acb01,f8f2190505a2836d71755914b03ee9a7612fc32ca0c4252a7c48a0f229dc037b2e18509feeac4d755ea033c72815eb8e00f857ec96318b7bc98292f4f12e0c5000,5311b591291fd31f542e3a5d6f425c2770423d6c28c9e06b96102cce0d35e50248066b700f0e95ffe0407016e65f6e9ef302b78e429552957b418bdf5b71654500 +5252244ba2bcfd3c1511bc5736921abb0403d1aa737b770ec6a638e431f477a723ebd1ec5cafd4ac79a194d867a1e00dc1e9b3,1ebbe63b7ff48360fe6dae222dcf688bf3c3985000bc88f69b62111adda1f4eb,34695f789f0a4f4a8a39d75740325704e718b9ac574c84131bddbbaecd66135a5b01f35730ccbd4fd0243ebd8cd38a9c9f3ac19325afa9cd2ad0b74dadca583300,4f498016cfba145909656ad2c3e89b22bde950d98a7d2ee5b56e67893b3be22b2b4d7354f00f11ddbb2064558b53c8cb858bddba8c630e661902af053ddbb89c00,478775c4b65d25d097d498161cf69be46d7e0379b652a8c4f769410cc406563f773bf47e6ff43a13f1cadb1340d87b281cefeedd4182c88495dbc1f855e3460301,01558775bee5f9dddb5d734055c081e64cc8555f74fc167046e817c1ea9566920a57220d4c9e4115b1d45f10bc4219eb943d2bedb65faa7ca53e82ed264aafff01,ed4942ab5b837cc5203fd48ef5b82ff60ceb57c76a8438b20afe4169d72d01f42370e1c0fb554ea3ebfffe41bfe0aa6475c26bb801ca705aa0cb1ebd518994d300 +9732cf88a90ac77be8cb93469196cef1c5872b9c5864a3526c815c399d5ad3c9eb72f1d05108cd8efe814712b8e2e5be7d2b83,68073b85b0a8c9b2b576341a0c9813b0d451661070dad755527bdbfc56cd3a09,46e32c011f1bef4f9534f0ecd97f756b1fb123b12b9c5e43609c2ae83da7dd432d5b7377d87554e8ea233fce77d4b69824dbda21f920578dffcca20ef2e24fef01,b022c25fb62a38bf41baf8fff98b8d8464d4de4547d9becda0332116e68d0d05063e7789945821a5e3ee0faf2925ca686ca9a6c5ffea3538b2fa540c61c9469400,4490b8ac24f73d688208b10d7961ca920833f5d502b19e54b9e052b86265c09850110330e7384575252eb9ec217d2f08f43a0b7f95431c5a87c005cf6dc73ff800,bd4170d6ae25c58563811cf86637726cd8c371881a4c1c3b54383ffc5718b8f41d39eb1b87e0ede812153c7a70783f36f8fee85725dfc22803e820b5f84f8cfe00,f6dc738ba162c72d195c84e4b7d3fd997537062426b46a516f8f4ecb04a6484732dff484227212e3ca3b5a11c1f156840660d2d1a3001c97d47ef4d2bcc1bc4e01 +2327e4b1d47c67050554f292002894be86d2afe01b3950c619257df9854912a39fcca9dc72c70f5c618641d8cdf2d0507777ca,440fc8cc5169f274eaa0298e9db2c6604f1343adc18a8d61f67926c18b0a730c,93068a648b4770bea1abf5a4898376910eb57c65821a8a01530365978c5984647cb899c3e9c4203ac933669b9eb083b69bc31128fa94b3ae9b5efa80724cc46200,40fb73320a994a7aed8228566b1f504474c38b3660c5315ac7c7c8e74259f1923561c60f84a1a576257b663264f484965a0e39e17f45a51906d0ffbbbeacfdea01,fe9cf2ff5ca4888ebc8819b292ff5dec2eec8e736e2580a0078e6ab055703ff045fca5fff5c21829a2e13ff887ffa35a757fc2410afb775093aaa28841cb5cc900,3dc6f162bf14efe9df97100b6009d4a18566f1b66731b64b3d6c7074a7b297472866b6f848dcd4c74b28c3a181525056838d6276b52fdc27ba3c1d9eac3edd4801,5e4d7977d7204272d31a3706efee401e16f01bd97524926f4d9084e42618994166c3e4498ad5bd58057b68b291f4a95058120d415806d6a37ecd6c262f18c7d601 +e34ee933bb48fbfbf5c9ef358c04da4852567f278ffdedddfca05b1da47bb9e0c44c42e0a7e8c20737fe338c762cb655e5fd0f,5162aa7d3998b48d9ea8f04fdd76ad86500bdc291c7798b278caaaa96a309694,4259f3bbf8c1357c446f94b0d3577fd3d2c5044a843c55c4692f2d1c5b03217067f02e9633392f37898f82e3c82b7acf565340713286e85f037253f31cfbbf6000,23d55bbd76c8857563c8df444a21849c1af120a0caca15bb0e162323c3ba5cbe11c474a3d91c7c033afd7d062742ae6fa37daa0b648e8ce61b81359f554cc22e00,3b546951f0b1b912f0265aab63bd3f04a4153a5a61e237ab127419e900c00b544c96fd6a39775ac4753cba7cecd24e258cc32f61714fea1b3b20d8d79e33ed1701,9bc4d5aa32d264682667a3a6c1aa8453a5f76e1a76cf9b586e984d053e27a04d0167a93b36a966f5e499063227d8daaf94452ec685b45cee8b63a6a94045af2400,c89c4026322ea2e35cc5bb866df5128e2207071573d5d935aa401fd07d57064f01d0b876d64ddf256d219bb1f44db16b8d46313222633449a948d81fb8a2d82501 +ba38eca3b48e032b738f1ba3b461b4d435f15833407e5ccc9f15b7632b91b07897f825cb132d7d41515c80fe228cfd36a19324e6,f0da7f63c1a59921cd7fa7fd818cc5810b1c8a87bd8f9efe23165cf44811d294,befc377eb24ac25253ba6599aa7401f28756efa93a97555ab6d086c6b82bb5b17ed75e0b66a6508848f353de114595f689d7bf367b73b3586b22a4e93f9a34b101,944cc9561da8709ad4b055adae6a518323bdcf45c8d21eca1693426a5430061d538bec5db5ee65f95e09f934bc79ff1da80b12287237fc40abeb7f5ab1c729aa01,1fc460d064ab7b10abe8cb9d75dc125b11f6bacda084257d6a6cca1d5c3fdd5902a634ff84976227b9d417fe182f7e61df82a6e5dc7517f28ea9cb091d0ec43a01,6d4a49f539b1d3cfedabe25cb9d211d4091ab7f046e925f8366eaa8c81a12fa961a032d6796b6166fc57c6bf079b7acc63d324a835ca439d347a51549219ef6600,c0452f2383ca96a512e0211561ed40b7520693b5d1604be767f8efe7f1b693ee1327e9d4b23601935a7389d7b459e8ace08939dd551ceba23e9cc0593dc1b33101 +2fa489b356c814e2a4b0218fdaeb30982e65612003473a10f50685d68c2871ea1403860f75004e1c4bc359b561df963c981e7e22,a4ec1dd99f6c2bf3856a7b7bc60a1e93f235007a85d1410f661729012a20da2d,177607d26f85285c8a2ddce182ab5392f4b42874536293a24ee4908c0ef03aaa6aa30b689c6a36329a31f12783a2a6682652bf9e422e0ef6d288e08457f648d801,46b08a9c28a6b29ed6748111f66576ce89557145f6fa097acf7dd0af597077603edf2e2372834a592e5f62ad6466e07b1caba9b6b29aa583a52f65596989bb0601,a2ded3e33d12a5e4c67c7c3f019be14b512d4639d128333be28a11536ff479f14b2faeddf1a3c25e61e2c0c591dcf3ac5ca85243ee1de080cd0521f7e3890f8b01,4e8856f4273dfc52da8484d4140293719302fa0f7ea2aaa70bcf7f58a63a544e29798346598f1be6cbf68ff1684cf632491f2c1ddb6d99096babd3ec0916010900,e7bcdea267e334ed7d8ccf9c674292ee343db6bedcc5a425d6dc1f379e6ac6e1058b1c7f880a2bf03eec796d42fe2f2d606eaaa7b19f5f5efe0bdc4a43d3746201 +5939fe84211889763b6fbabb0dc252160d6b8fe8a7e4aa9ddd12740af52cceeeadbd9b1bc0e502d29a625ea9d33ebac7c3756b33,4a93d14e53adba9854b15c367e9f70667f6ec063d26b982844fc06415646345c,afa9d23bb1a8f4d21ab4a384cd52205f95535824020b0dcf894678980e4737fc676176f5333cddcd6ce7fd4c0b583c803190c84cf7756ae3c741f75cde6a96cb00,2221d0480db70ea62d10ec81865f444d3af592e8aacb581365ef14ea22e4bf28128f0974eaf1c52233fdb861004a5dfa9aa8c1f0e3d26dfc8fdb9599bef220d000,4728a5116e058af7aa9f6a3a114125d48be6ed89872e3f3579b50f0b356154536419f3a92da6e303e15366af7bb118b007d4e39113819b42c367229021e8710400,7e6685517f7e770eaeb243aa4c7accb34d0b0ee454987a2a3aebf36945041fa0626023d324043eaa34c05d4805f813ab37867106c774ac908904ced886af708a01,1261076a012198cd4bb2740bb272c0fe12442c903ec00a52c34b993677fe412422157bf571f536ea0da353a7dbbf66638233bea5a98f8d3b6e66d5802e78ad4e00 +199e432aa890da7c256b25b231aa982a3217c3a2ca70ba0cabee09bc941025a5d6301af402e4265db3504e23d701d47c8fbbfb4f,8b10eeb47c445051edb0a42ddc498c867004d0d875291c55a90e218695b9669c,a7b593be4476618d1f72248d36599e8a3120d48eff2384850a5912cfbef12f204692ee76c01ba11b7a27ddce1a4cc976ffa70f5fa228e442aef5455aae72554400,a2a5f565f36b68a408454dc6f43ee64af16b3f83fafde6cebaaf50ba7fd6be9d1907027518566994e972f6db53d700f01779cc1b17a3b972a00db5a423b8b3d501,c79d86137aca304f2c909375c4022e5ad986f343c2dc0ca696d5d1887a351ddd261d254ae5221aba4cfe4f23999c665f0647f37036de12aba6333cd0b829461c00,90e0a493e42d786599b992905270585c9d366d66d6e4a4b6d8a09cfee2b4012b7db57093a0daf10d1fb3742af6b2e2a378f11b946ac3e6b8eadaefd78b35be8200,c4feac06e81ff5d1673cc401f5e1bbe08f97b2d9b37214b57d9dc3aa7886e340258dc12fe7851d17bc26c877f930ad49adff3e1ae84f656af022c5fccdb2036500 +1c4e0134a030ad8b23cf5ed5e938ae8c37ec47deb27f2d7d97a4cd681af7e77e6523c8c3dab7b092efd44fb47d2c9355b3033405,7263072a521a07183ffeb5ba7b3222be9f19d7f1698b4fa901a6c5fa746b62ce,dd0b1f51e520ec5d2076f70b59168e8c630b8b2562e1efd5fa4a84a25d4f01fb1d48a0e0bcd3831163c3f4b10792f80c07ca7daf8ec528013d1908649c03dfd901,1abad6b2e863457906c9d1ee374e5ced63c06fb474df81f38a02f68b11bf4f26260ede55669f9d9c3e180351ff999b81eed67f5bc44155f42da5835736d3844500,8314f99920232f946017a25239b6b3438e12ae1f87c76d876dc65fe3b5c58b756b933673d60844ac89e51cc0b743b132c9e8ae1cf0a3727e4096fbc0558df69e01,abe9947dcd2dad15c9a4b0c263edfd1885528c562db2577ac3f9b7c66285b4ae372ee7dc16a206c52aae3b7e6a4a5c0c1b59aceebec82e937af29943ba458a3e00,ef9005be703f5e16aa5b73c9c78c1335771fe8d59d1993c154b9425015c6e08538f736568de7d6f230244ac47363a27e649d2ef83fd297c458b86090c69f60d700 +d2a365dc08100d38ac89a04276a5aac2e697550fff30c378212225a7dd3a5a4762b2eec6354aaf34673f97a30ad2281c9f819034,c422289883ee82d84c32d3f559ba52f6d5f0f6b5b17891b13fdac6a5828d2840,34c0fc121de68acb5ed589861ac96c25858a40fb45e58467c86f9085776b5ff711005fd14464d55f7a6067e1d19ba7b12ed28f5a34ff4b726b44763bd06445ee00,6220d4c05f2323325efce417a34e15c770763085975999d3bf7ae583bf486fc30e3121f7bb884b190c4fbf7914b71198c268a8068dfea6d50c8a486d4828d53b00,c5789d69502008dc988fe47ce6aa9b0c4e251e3c0cb6597b892c0cbcb664c2426821ac9121228003e6a2982e7c51a600f97b3ab85b61a5e19c8a4f943d236cb301,b93bd5075ced1bb49dd018556097518576c72c791c890dfa60e6135f353795cb400b9308aba7297cf5d9851a5da0d5f083ccddf3b9221549bdcdaed557f179b700,5372dd5cc7656ba2f4782ff1ea68755a0f7955bdd55623323aab9df75551dc7a33003e4078b69ec8f51d2e0ea350a6511b3acf76e04b6850c702aa65ab6d22ba00 +8bae6fb53f8ddc87b68bc85f21fb20b0bfa05885818ff9c3f5cb610bf5ca061b3a3cfe7c92f30df7f13f5dbd21731e87c4411cf2,9c2cf2052e696731c5f80c302507aefd10fa32503deb304d825af7b091e76a6c,d820aa2787bde704d8644d73854b4bb4fadf9b71af33ee0f5e25c24b08110e6216d003cd970bafc615771f07767ba35cbcb43826cf674b9f00c05eb9b9af087901,031a853233ac19f375d84da2c814c5e9e4b9474a10a246a54b3b88deee3e24cf43346a195a7c1aa683f6893f678045eae838b11f5e875ca3adc89f78bacaeb8400,fc1aceaa3cffedadca8d4767119c2e372dbd65d4f1e50b9c22b99d40bc0f292a4614ec67e8047ff6909025e0a304e740ba72e94d954a4f1b74fb0ab535a8a4ae00,33c0c32e2eb3997bb66a79b4d8eb207103e5553e73263c2dfacc81b248dce91b1d17c2490d7450737cf58c81cbc0e7fba63a9e99ba5b7184c924af8e0e9ef38501,52b72fab7d5c8263555c1fe25ebdf6df833f2d1ce0c6c42e93eb4f38feef428f5399f1184373f9564f0a4e7e4da75dac2a9539c8850ba1fb7a00ee445ef2fc2300 +a625db5085d5105a0f8d81b090e2dac00398393f95c0bcefb464cb4574b7c28c18b51db671e0b9d6c60baa6026e710e233d1833d,b69ef3fc090d17e8b4ac7440c31f72fdcc140ee50822b2d881b8544d855aed7f,c42bd5099ceee165a5ff66b0ceea8f47564b8f56454265f928e5267c7909987973204e6cfdfd7db2844a939f999245aa7931c2bc6f7bba85cc2d1593e483263900,0718906435ce2994be66bf6440e662acb742d9c36295a7c857b81774c60809b359ffe8d07d8d38a1241f59d362b22853a07ae2522428c8608dc58f8cac1afd5901,b6b6707b857f52fb1498e3ac3bf636787bb4f18ffae1fc2595455ece539aae5e1ad155537e23b7c9fc87464e61dc14add6689102cd242231535f26b36d8cd22201,a32e04d650e8e6fde259f3877e21ddec5793d6f28d3d3a7491cac893396d1560273f3bdb52039e302e330006d62e8a326e539015c05bf580097a97dac998f7d401,9d6ce6a595ec0449fb3f4b05b3ffdd6cf3bdbe2e0327e5601cfdfd57b94178b36f13a162afb061d2624206dcb34b36a19d5ea4d223d75f6fd4cd4c8261cac21701 +a2119195bd9373caab9ec19883cbcdbaf4f7e79f5eb44d159a5f97e0366c48ed2482d4a2903fd9161df417ee61502aedfca08cf7,7acda149481c6131b28a1e3a671cee10a91b33a174ad87d84bcedcfc08a43ba7,29b11aeec2553d98b0af6a0ef5749cffc6dac3e0cb32a441c37fcbb54617d25d5a23143000379da99a76b9cc7db3e7b0a41a180d40a31af9233a2f45a0c1b8a700,8496aed15a941dc7557d21bb12c9eda7a515ef714fb845687364c50649612a6d6f57a602d93c9514cf690ea53c60e72f249b59bb40d356765dcf958519bccb6a01,8138b1ba287182e5e300d949c4071cc329b866b40c97f5d20a1881c60f93f532616babbd01f3c9c51ba83ad9a904966de290bcf0426da30b2c9d016fb4f3feff00,89601cde745dfc1cc8df28947e0447d051f25a04e684d9e97b805b18d431ef971e87145de791ebbc4c3003dbe765c43135a861284f75ddfc0689b9b4b09a044b01,50007bb63b4b2bdd52ab4b91171a63fbb98d62cfc9d355db0d0d111eb5c9452118ab1946a6b3183ee38b643c0fe83c6f49dd0e0f3e1e58c072abe7a038d5390100 +319dc5ae8261bb2c7d1891a81dc1831222836b630eeae083a76d5339d8c7a0f31811acfe9b2f688d61ab7314cf6eb6b3689effda,c698d35520c947d9bc3ec3d28d11281f25f1b08352b67c0580d0689e2823fc71,9e85330b71556ace6343c3692320a6344e6ee472dc7d19e9f0519c5e6f9d14691e43279d33d7c2e39e36d76012f08fc8986fcf281893fa459747f15a4f91112100,188e4079532bacb61a80ea4d4fe059e4a2f981d5d23ac6f93cd2ea9cec6edc7419e837dab0b4b3708efb8487370fbe3409d68f4fa0edd390fb46a4ce1274626d00,40494606c3daea8ecc61c143e58235e4e651f31cba6c8c6c735d4b6506efd58644ba642f71e7f8956b375232b5e49de93d9450b7ab675bd330460f879f16fb7801,28b2aeea7a3d36b6a0d1dc0c8f21445063ab81e1d21b58e099603204d4c7cd1b23a35179dcf803647d0b60cf0b0b8f8cedb7038eddf1366de2fcabe052d9aa0601,ed058f2d87e8ad96b3662bfb238dd0a4d9fd10a353959c168a42d829076c773554b247c85e722c68eaf9165bb36605bf8ac9d2f1b962a09d2a38db2ff6f86f7700 +3ce81c848821b34e306860c894500860786bc495a6d3642f376fd790d25cd36f9e13d40685593b690d6523b19b5762afa4e4709e53,ba087a5d82927ea1f3563082e2f20c854fd0c207ea3ba670b4d6b53af3158aa4,1063f20cc412b122a49695308dc8f2b9f095e7cac018bcc6e0ef2b2d3c95a6c55a585fc51d9c78df1d2f816ffb8ed2f3e141e4fbf6b602241f161579e07a786200,07dda661d35a22f03df1fdf9ad408aa7feaacfa93a7c68bbd3bb5df92e8e542a5263153e0b60d6bf86be5aabda562d36da25dfe2887822ca2b9a956a4be97b5c00,9e15503c42838f3022298abf31aa5939dcef71a3876059c6d0e46a09184b70640320a90e9a649a5b909e5e56d7512fc02d67ac2d5bc189b2e8f1845664f310db01,240ef29127c5fd96694400f7a3c421845509b93ac053fb3d8571379ad82a98427102611088140608a627d34ca02d5cad3dce3a5a27bdb6f4f5493588b688c87600,023d057ef8db87b04e4ee9c046b7726ffc0bad265984123e1a914d28eab0d54453d1fdfb34a91aa642bc27087a87cc992bac1ea50d380c660554d2d94795ca6701 +e5f585e99f4ba3909c9507e38826fd4dc3b5fd6175110015b46a2908043d8eafa360e3c65792efdef9b9fe50c13707f408dda91768,ec058798f8e07895eaa1960ed90c3bc66261dfba2132cf1d6db8b9f557920883,02510df9f29457164fb2ccde31aeaea19f2e71108f8a94a7eaf9e09188e3f307709ead2d861a2db98d5c4738a71985eb4cbacfc0e9ceac6a8a319c19e7ad22bf01,4693c8ac820c1b713f21570d951bda87e198c4c350b7dfc7ebbb1328a8a9d1d16415ced5907a020950825b88be067ede9a9a67125dc01ea256c1d2217e2b846201,eb9f1368f7d22ec92e548a1ceef3421653c403b2e192710309e3b3ca59985c2b7eefaab9df951df50f23151ab57d95986c8262db798514195d57e7bb8ad443cf01,c2fd1bbffd9311e2fd589ef245cc88064d9515f6380d21fe9fa79e7f174f4fc22540160f80e6f78c9ee047dca2104cd7ac785087ed229b2549e74dc8b6b7375100,818d9a4c5797b929badef7eb10f06d6fbbee801679e99c464fcad597f1080a237078c23c739407fde98f7cbba3d49ca9ac923b52350436f5a9145c2b7125719100 +f0e3a882e58f8353db64ccfa9df76b1afbdae8f8214a7e987fac5803c0d39af8a489d354d9b9b79fdd5e5de1f97fa97984042d7e7d,9e08daa6dd45afe8fb5de154efd943fecb37a0ef7a324d7f8d8a2130ded03705,5b795748c3ed567bbb4e71714302050be0565c732273f06d047251d5410837342ccf6eb1ce19892b361c01d161c72ef0d90de3a99ff5890e1b954186e2da161e01,bcf3768eba60c4431ccd3d0c1383f806c5340e288f2aa2f0b205b548ea4c9a18127ed13d7e387da3f067a2fe7c3e63b61e3b2c91b1e69552342214d86c46c95300,12063c7cdcfa782e94faf3bbb28a47d5de522a9bc27bbaa3acd16e85d5ee2b877f340eac0576846958deb2f90be32e0dbfaf220407b984c9fe2495374a27b0fb00,f873202476b92da1fa8d020f3d225e9af5fb3c4ac1e3e4bd4bf4412c03991ecb119f291bde9898680af28d839775dd706ddbb39b5feab73231ba9043406bad3a00,706735d982ae653a9d2c1ece133a04a50f9f9735c9757c625e503b21a3004dfb67aadd45573d7c1c72c7392b7b76fea90923c9286e4b76f1b7f619a2fe82449000 +11c4b343c5e9167e5facea98531142a46e8e268563e1d4a3c0a490cd63038ee8534b5051effe4b6fa6552ef7acf0ea717e52880940,12655187980612fa038ea85de441a37fe2a5d9a90d587c58c81436b89b41b557,66a0f4aca49884b40f54974a6ed123ac770e07f9f7a4c5c0bc8d5c96abd765f33785bd42cf63aa327695c1b186c1692c9d93ac1dd789e88d6a10413e8feb602201,ed9796164dbd6f8c358ded87c90dd196d41c96504e3dbbc8539e412505d81b700387fbae2903454e55a40e4db9573f5cdb64338e3ecb731bda2963d87803df9c01,18e816dda1e4a2c288c1882a6975738e60e2f699da9653657e0414a1d76c80886505e3ee6ac066e8a07268186109d0324e7a08a32ef241af6c6fbb3a999512eb01,3bdbe75fd66da223c05bf9c4c10547285c5de8295c7018cae1fafc235688853151437260d67f372c0525109ad167cec6bd542e0490baa7bc470fdd8c7c7658b601,fbabe92d8f80705aadabdbfe41853daec94d528ed3cd86963e36ac1a9f4385d6072283bc9ca25d1fc8e7764f2b2d27e600b3a3ebb20a6a06fc531b4ae482ac9501 +0ccabe3d9490b3eb7c4ee4733e30bcdcd3709261e83a90835fc175417ae19793ef7921af8ceb6ed508d7e31f337eba9c85a44b3d4e,e6404bff97e3f159412a6cf206da0ac1878963366c4eb0b30f4227ec35fc04ab,8e239866ea83ba1fa074be09f840af7d9a797b5477beeb063d39191f4167f39a3806e6db4b8d25166560049dd9f28f69afb6aa30b905359b7d29efc2aaa1e3a301,9ba9c35357bb189fdf69b86c00cfc7b394e52b98f745033aa06aadb5e687108137d29fa07dda123aaf4280c92666005c2f8525cd899a1a173650f247d732f64f00,958435afa6c86a9e48899ed58782dd2cacb6813929b72c18f4fd00784721416f63f5561d2945dc671ce5c94db34d27010de0b98f3478d8e2c8225d8f3b5fb07e00,94397e3ffe76a0239b53932e8364691af43b4bbf8b4ac8ee8cdb527ccf9c98fb329cfab19dfc7af4956a83ff21ea73a89689c0613ef97ed7cf7781c93e22943f01,1a437bcd352279a1e2c9eb669548813d855410c1a2fa8e918c1aa3d79132cb5f046d98c98ec9ac07dc1ea44c03e3eea57cc13d7d548ab861231352545625a5c801 +de2a435ecb7c1043d19469e83e0b25af41774a8bb92526575e24a0adb357df95dc0050b88b2fac0d05edc409da761cd2690298db76,731be9ac64bdf9527636ea77d7b1978cbff4a943e00488b598c2e470dd6661be,8cd2caf47d77dd99a46a19452bf74be8375c7fabec3f1ec8f4c243c58e28a0b752eae2bf8839c4d7362ff990c4491e6597dd509622294203ee0b723436aa9b9701,84addbe3c4665908d60464dde3958e84933cf1eb5ea6b403bac6f41d99df3ad51f38595bbfe98a9569ce6a81349e3856c39d9bd450bf7345de224828dfc719d701,936ec9adb2f379d34205e3efc63bab511b87c1577171dadd2f06791de6415fbd7dc45fd72566b656b0bcf7ddfedb4a33499efd8914cb6910040b79b6712f8e3b01,4f4d1050cecc27bad5251c4c728dcf1ebb332a11e08b42ea7f35ecd70bd9480d1b8e95386365d3dad042010a64542e17fd6ef15e861aaa1490422cd5d1c56db101,73a58851d9cacbdea1fe021a099edb4a19b90e8e60dd874e33c048f62fe5e6a84b9b9479af4da0e413590c0c13260606cfba2615da401751d4dd843c7bf785cb01 +107d95011eb042a44ceab5da53965744eb79903194adeff4a39f8b26049e6c3715e18f927fd9923b924a4a12682010842066fc1123,1af5b69fb0da7b3e1999796fa961c65badb4977d0c1770e205d303182094ba9e,4d688a2ad625acf105d990de300f5eb66fb73e90dcd2e3904f224b0cb0386a693294b2684084f28ae5b59adc0e04bb02d7ce376f4fb932ac8d98fc8ab24a21dc01,e745aa9205410243f2ecd12914fd594b8075bbc4d12f6426aa44c137ff24fa1e4357e685311726d5cda15ab7c11e571e2926211d1b15712ae3a4faede0b91fb801,96eb6054611b86e0cc25abb362fdde280d1b726a5b3bc446de57b6504427216046ec898107499fd12692698804b4b295ba5594ab5b1146352f85396442f34fd501,30c330d7a8b81303ee0b7e74f74f7f9010ddab552d8b5071594b38498af3dc8b118f81d7811fda8fce8caa6891831ea514e72bc4d07ed9e996f5d2d300d4932b01,f988896716cff8f2046d5a60fc567e70cbd9ccc13d7ed8ec69a585774e9d316f012c57ea412a1d014b63577bf3ba1f568fc25686e4d28593b13f63d0156649ef00 +0e7d0bb0f2180d1439c90c6d89e1d4994efd46298701c3d0818baeb6ddf0dac462e16900def1b80b19d835c06d68f8ba0889557031,e22469fee53023192762b238329581c275470e8bbab2acf20f6e0980db8c9226,e3bd6f2a459f95a5bf03e9067c21aa8b141838663d45d5613548a94e3bfe2957003a7638a57c85fe85fc189eec0a24bbdb56759d26dfbe8239d717ffb030cd8601,af4bd58baaadb85fbccb1816455078ae9bc424ca3c1d4a3c79c2c5d3517ae8c54b77fd08d7d99650f005ffd07103f3bfb7c6f2fd9a3146147245936d5e95aa9c00,da54da4e34385972efb72f4ab5bc628d649b37bb2c4f95128ebdb081bf8ee1b32af9f6faf836a8594d14757a2cf63f7b61713dca99c139b44f84eb477b89c87a00,84dfca5e53bc1bab460dd6abd1d1f1063f6c41c0b7968edf4e63d99fd6c8817c0c0c04d4fe320849234613a5abd705b0429c36b0a47b403bc90fd4a5f39af7d701,1372ba8d0996ebb3d34b38201f09dbb6cdba92b687c41a578eb0a61acf744dae789a1ccd6aa56821f1a34b5d5c3ac54b3b85266813dc4de959d3cf986d0ddb4a01 +0b0da66d5d3e29996522275205aa0359daeee239a5daefb0fa5c5ce2cecd70e84375fe7a0f4acc255b4da58c92b6b80eed70d11cd0,4d9cd85a3423476c7b54263e0cfdc5d33d39ec322dacda5c9f578313d0847b55,09ef3a836bbcf4d879a1522bce0cfdd8198094b705306e4889d9fec7876a30c8610d88bf2de130204727f4fd0e568ba688378170fa470c32c963063d07dfcd8401,421c551ea38f3e9ae4887144a0169e45b46facde247ac36e154c9cf664d59e076291e11b12b8a91d19b21259072a47e55dc944cdf9b7f2bb5db929349fbc365500,72c117a54603e69d5fb0fc8a09712ab788623dddc5d47baea4fdd80adf0dd9510abab76219b4a271e238966c6ec8e76b9d26925319b8930e84a911cf5ac7775100,a8dd3ea469383997a72f66011dbd7f4d7d7b9edbc72e9222a7b01162e6af90c3790a95b5105b11e07909ec6c53f3f1f029faaf94fc274f1b9acec9469f697ba900,6e22527a0fa05dde434c34806825e90c144027dda8b3b1a57dfb3b47f5df8328002169baa8e07a01e87ad1ee826ab2d810c4c02364206f9c40fe09ace967c72200 +e7cfa2c7f8b46575e5bb2ad0e3453eba5b073ac668cdc1b7db1e2c4b8181739a524947b162b4ce37696eb0fbda6ae8ea5a45898d97,79f6ba64c99b846f7c466749c14a0c7eefebeeea27cc3daa4a48c195ba52ba92,6167bd54842f683679c16715a51a1abb9b1c7ed5cc69a8d922539f309db916de5d06794f0996ddf6e7d32a8933de806b09c6722ebdc48fc38d0ba6334f91e98700,dea8c4f81ca6cff5f09b900b00a3d892683e0abe47156aec68b62ecbf1429ea7487480c56916fd798997ca75e91acc0750d2667ee0209a9e96f897e3c9d3e8cf01,e8df8806f9d4e48d5a68527e27fffeb2b5b93ca0f347a5988c3bd135292670542c7e952a2551bd3125b462a4492af3d2817784ab7da9e19f18101ef1d7423ec500,190c78ef1995ab1fe28378c8fc8f785171cc4a85f8147595abd8465f083b170921ebef767ea5542783ae9a9b9ea314aa79c4fee4bee17de2d6fcb67d130538bf00,cef07cbfb41d811cad6be16b044ad5af4235f44b40354bfb38087f400e4174832f1a1a20931a0f8c735f2585ed8f140d566ab86a94d1a4fc0183c090786a91c000 +601090d29ed8c2c1f30a3a7e206445f555f6e4596017d3bdd9d74a08e6fda9074f3ba8b65613d5113053bad08c2f0389eaa6650fde57,7ccd6fd86ef93c8126a2371b24eadbf1ab0571db4cadb353a00c41078911b630,a880f9a1709d9e087d48694d51c752624e618c8eb5271bc66f83ba0f147cc28569a372cb880cd9a57106f057a8086be07f43ad457b7bced8959f45040c953c6100,4fc8af17d9b51a9702201aad42e6c724cfe5958888210925e62a81ae90a4480216a4fc162b0c85aa136d696f5c7d0e2a34576bd90accaf6c37abd4de4b6d3f4e01,7ff3da3d26af0701dee11dd284b3d78c8f74dca3388b91c17307a2a21b7d8220639e7b5a6a35002a3728e964d1dc5558d8c3a542118a561cde3e13bf9bad699000,9ed4ab7ca403815300cd824a8991c87923689ac5d6a4da9828496f2aac430a7d3c06a0b5f87cc705191a049c574245bfd97e0d587c827c9b8d8f57afab69574601,3c87ced6e33f28982ff1c49cbc7f10f1540484971a5e97dce60c799f01a83d9a46809643246c85deffcb6e0216aa0b29837cf2ff8ff99f4429347b1ed13a558000 +af390f97ea08d89ed26cffaaf22d9270b2a5311b1aed90067648a31c359a168f7e9e39231998dbe7110272861293a90ca5cd9c8c94b0,3b6870e9cb144644479b37a98a941e927aea1fa751f90bb715a72ffc4b3b824c,9eddcd5e694e353c720b0c05f0362630005be1a2388e304c1ca6c89fedf1913361bf69b326f24a11ebb0450f9f49852db167618cc6b36dcececa14f0355d772601,6acc1060316e3268b25a8e9a62efb83bc84ca3431fd394bf8f02f66e099a2db05cb198817ce42a11bb3777468989a0e37d4f14f7ce760614631385812850579d01,bb36da25c0eeaf3023d6da8bcfd765bbbce23b0dae12d5466cb428d54d8703f32c2b503045192f24a5c4780e781549a90cd62f780f332e54f892c6d14eae7c9000,afaed951fe153d9fa02ef5eb0de7dcb044085989428f5bc14e309bdcfd250b41282d586d58300ec53b65fdac6b8adaa87c3666052e5dcf60a6cd8d27af7e2e5701,c91bb16c4db4c957cf785429a9d257752b60942697fa94ce5a568f69da5973650c9254eb18207a42708fc668c84deb13907cdca6ab0630fbdfafad3fa35ef09400 +94f60d2147ee7ad201affe7ba1b48bfc55bd6f4fc01ea5080efc0bb39a88abf8567ff986d57b54db79f5cd4892687d650836639ada7c,a73b970d30b73a9041b241b52776364a0204cbec5cbc649151e36c3c52c2cca6,78e0eddbb58ba759cd83c6034d6d59829a7210e6143415e9b72d23eb595ee1080cc1f0003fd9641dbf76f261ea763a6b1be778753314b6654e823507143122f300,fbb4cf517718daa3138e41be7580106174dfa526288cacf99d35d01068919b587db36878ad0c313b576bb26b58d7fa143156fb1bba530c656c37b20fdea17e2501,f609b5b41379f746821ac63038a778275ceea2b2d1ed6cfb67011e133c09e2185a1eba730c50f3c2bfdd066a8008f168eb0fd7f05dd69e992037a8e87729ba2900,b481ffc2b9ae40bc802412d9853c52a000b512b51fb8d2f67d4f9e63572e8b2544ba96081801b85f0ac129359f71bc553c8761477ccec26aabbfd057b4ef339e01,4a30e7f7cf3a7055a2b391a31258ae3eef1ddd740fea63461ad92da5c3560ce224d307b9a792c4fbfe8415e268f4667c6def92f86c9a593abdbcbe4458235ebf01 +03d0caf84b9ecfba3f68f837ce42eb50838bec7f6ff60d415cf7489575061906b340ee8008137fa20e323193abc16949d4f8480bfe0f,5f85bf5652a94250fe1b952892f6edadb73ef95329055bb895f0153297781167,06f357bf1a22f2834eeaf45c50a7a317f460370cb32ff49baa95a17153040f2517995981a3ae3fc94b23dff537a24bb06689a700a673441fab8daa11b00ab8c000,904fe7eec5559c8d5d45d7ccde093e8256109c27b0725beddc18cba6c3282445712c4f1a769ae21b7d7b0d3a8c1ca8a332bb034aafa5334c68a23e91f9faf83f01,a620f4acb6c78c2b005fd02876e5bae136202080e851398c0e09324272d0e39744add0874924194b87f1b7f0527ecd93e2ab83e3f29393523ccf007fb146609201,3836d1c17cb5db5296600fb4d47090079dfda4d27ede3dc4b5ac8ee0e803b73578f573e158c832db38f4a3da90e432a15a116cdbf13c605bbd96e3d7f5eec53501,5134673cd5cc549ae723b7a09d3c5a172dbe06ec715f6b5b3e8458d9519948c57e001862ec90d345d003046ad3e5a4e49a2f9563ae289d12dbc97510be3873bd00 +991aba42afb0f482cb09eb0689ebfb51ec9fd99a5a95f3dab69256b98a39f8b1dc83298c66e6ba873f448467bdffe6503e77f238fdb1,9c69d55a5a20e53c6d3c978feb56ec38020e6be7beb1b82e5dff04e3de08d1ff,82c3d60b6b8b749b1954458aadee7b14c2e9ff99b69917d9e44b6388bd140ab9685ee164c96fa07ac60a3ab7fc18fd9b7be0df2816bc40dc1ca72eebd38580b801,54051dab1fcdd2fc2ad234f4d8f7f065012cf14b7649ef9fcfebe6310424d0a8367dfc409623ef1f76b6b44f9172d2bb656581eb9387b9193989329dad231a7400,376ba7d906b89ef4fd93d59321bb91486e6d6b901a0b41727fd683737ced5b9a5060711961738224520655c5c2bb9f33d964b00ed6491684dc3c9e96382cf63700,a5ecc8359e54df9734cb9d6bdc829995a322fbc06cccbf976a262228e190b0c67db59c63404925d845cc02809b9b31770868df880ae856e953e36dd9327b1d9e00,c157f55e33e6f8ce31ba208d45ef0308a53ad8e2a03d9482ddda9775d2fd9af07b0a09b638fe3f94c134244e0ea0efff846fc9c1bbe66b393514b0fae17c60ef00 +fbb7602b15ce827553762ee21485fa421ec0da4cb79197ac02d60376b130b17b6f0d7ff5eea2261f3a4e6d56eee5ea2e5c43a1cc6f90,53912b7158901ce9f764bde76e590edf7ba510f7390abfddd5fdde4601cac4ae,6842a2002cebd2521191dd3c3bf2ae07d6b6feb5db929737f5942a9d931ac4141163305b193ebe7fade8f318f679f629aef148d6f6fa95dcbe509f0a98c7bbb700,37a73b20c32dc5e1d47373d2f82d72a62b6b4a19584cc14c004333f0957af22f71b0f8e36d0c42c58d6ac51fe97e1d9256253bd50ea8de2c1312c20f42e5659601,1f0a591237158db73484fd26924cb6a8664b5ef5547a55e92d81d83763d30b5003200147e28652ef8e37a0d6f20b0538b893696b1ed2fe54c00e081d3691d16401,1c610a5381f1d7ad7622555c54f012554a476b7ab9be20dfb8e22d431521dca1386f866959c96cadea52024c8b31f53e4a9ce47fce1d2c8525847a6335bdacf400,19cb81c133edc5d06518afa7f6e247d2d7512860029c1e3a9dde8b874d86ec690a32cface45caadf9fd0deb6c51b2dea1eef3359aa6a0292023754d65d6a4a0e01 +cd99b58410495d55fb978f24176f85d68450a8db91ed980287c788b3cff1446efd325a452e76526349711e747936e6b1e49677be0bf9,6cda3b2c2dd3b1ba0b0f10dc239494f7f52f8cf66ca9c91d21797eba6afbeaf8,09d799133a0920bb38d155195e92db066f80fd5b1068260087c2811691bd40471d87154a521219354a0d46e624ac481a02d6a9ee86373c833874d19f64978ffe00,59f5760e64d85f684401c2143e360b23a474c1bb048e306fdc75f94efb4b85d76c4c3256f2a6fd7a8886a424f9dca0d6ea373e0aec96006096e0e7b7381ae43a00,be980d6553e3df9cf0023f3e86f5b2595f027d164cb50ae9ba16af6ee01df26d7f517f3c4fccc8c257fdc8297eea5d139a6c104fd0c11baa115b0ca43ce5465f00,4f1c61b3bc9d31f343cb3078cc021a490dd7ab5a905244a49b918ba41d72bf7d099634357e7dd9c43c545d166ee68e9070fedb17d767294d4c2f7621b3c9e6ee00,ef67294950eefcfb7e0efb44259bc2d51b610dd0cadcec24de9576937876986f222bbae231b0867013b2fbfae9496709907d2628e23f757bd7a062dedf91f3f500 +39db43c5c7acc1158262d47c76fc9cafb5f9d73952100f2bb40284c7a711845cb4c210b8fbd9a1530daa06320308698fea80a6fdfafb,7a9b9b8a0c8b9156c439a523b8050aaf3674c5a418eb67c41a4206c7d1b9732e,c221250c46f8d88ec53c209e4413612052960dfba9da4b6e5216248d57382fc67e60086c8f1020562e54c38a5066227c6d35a51f6cdec1af6bce899a9486ded600,de73c25025235a349bcc38a9cdc78dfe5aa7208a00c5863b23043ebbebcd178f35464dad191e36b2cce004a42b66bdaed2c5e7e5c16defa8a57e0ff62cc5614b01,692c4090385e95aa43d4eb71438dde952f4124b106cad6cf3b034596d0481c7e57d26148dda236c96216e462f7940a540323f7275cadbc6d134f9aa77d3b496501,e684628361e46e3c99d9796ce127c17917c0678a8062386ae51e371f9a9c90600e2bff7f2b8e37b57edc2cae7ab3ed1ae31c62d8a4f7a4e75b7e3bf8bb643a5800,3426b711cd40883ff1aec1bc437653c088cece69627d22ded0581c6944b86bbf35baf789423bba20fa7007b04d36bbbfdb4d2b1ca44c6cb967d028b36476413001 +858d6b6b0c629d881f72d0fad0c70b684233c71146f7fce79df05db7b1118a5fefbaa4ec997591e59af7a380960066522123b319b4d0,858a7aa4fd27df9171aaea083c142671eea52121d63b95f12164338ca4f9368a,a7e2c0ef46a6a0592ef0c4957e9cb57976526b9f5e23d11f8a207a9596b7fbec6e853138c15fb00e1d494f08f401cd6a544c114b735555535828e94dd34ce7e000,8a62c01cd1da2259623271b6384b6a0482374018dff83e655c869ce410f8a74f7fc61eac815b256e90b83a68fe938b3555baecb83a75263035dd086f9fe072aa01,73800baac89397180a56b45b1cef998b80e5fe8b2f8274e2067ff66d5a42cbb017f61c7050c03659811dbac05a959bd55c5521a17e91f641adbd765fe40a158600,e773da3dd0dee3864a8451ea53e6298262d5cf21dc0f6229edcd795af005d88343bac9a057c586dfcf8a52417e6faac3bb7a30e0d934d648324467f692b06ae701,bf0aa9abfcedecc5be54c7a3d452f53079527d0ee949aa751ac9d1eb4de187563e94ef1684966a466f1be262cac42d17ade55f92f0c27b0f610a90c1f0e3957101 +745d9698c257b6df3844b85ab879f7f255c7573da6acdf2e3500ddf4d74d896ec5890b5c0e1169665a139228db93c2fb77b19ec1c829,1a40dc104c388d0e497ad9c86858e2f3cb0dfda5d049a528909182dd8bb05f83,305928674390acbddb2200009291deda0b0008e94ba5d25b96629a381ea46afc3295aee7f54eb0e98d77428254ddd61e509044071f22a81f3777ef708ebfa93e01,691cec95c03c578a6f746c2133a97d5ef45c189d136c73e39e281327361f934963391bb5fb26e2e9b9685dc7948d8decec94e39d2e165f238d2f95471cc4322401,353fbcda0705e1570e9df23dbb6a6e98ddb20759e268c5369f5f91ef5fa4126143cd9feedba4981d10a1b6ac92a90405e537ad7445cd79e4fc79ebcbebd8c2ce01,6ec2f5c1751cc9ea46f8463c8822bfa32843dde9649d255e84cb08cd245f5b580c34a6799f736e9bbb7454d24c330b7947575228393c7ac155fb5f42dcb63ee201,e0f275cccc644b43c6a02798347a5dde80756abc50ff90247fc575c7c9fefb332c2a4bd6a569684a33ebab62164964efb07ed90e31cc08e8580c751c1120ecde01 +7b8ab035ecd6f882f6b534dec6cb693c54eed1031095e68fb9df12f691455fd475647b092a22b8f23b5faa6f379f735a29fad0d49b90f4,d4e6ab0a001929afdf4c60b5a68afc4a2ed7e5ebac4e9d84957a36074ccf693f,2f7afb93906e51c097dd5c6864da808440f3cafe413449a23000c03b492bc8180142e022a50cb30eddddc62179aabff7dc2bcd9878ddcaf114c3c433cf7dbdf500,b6de63ab2a80a5deffadd229b2109c12eed88c98dfd57d726ded6b917db8459a11bffae23557531811fc8a95e328cba33de2f344d454dc72fa9b21ac12764e9601,77ea46ae7f8324e5c8b2e55eeeb63e0b6c5dba74a3281422edbc4aedc11dfe24249fdd29a4ea18deb05410407afcdfb5cd0c18532fbea075c467bd2e6a83045801,310437845f348ae9c0e62360935b66d35d05ca7e5d56398936322b0706e6fdd96372bf6d46aa284fc6507d1c64cfe2aba4bd0e1e41572a231e1a78866146632701,c2cafdb16150b18e82e427529ac51a77aaaaf88f16b4b4e1bc078babf5c4efd02ddc36d41928de7a1068eb5b0d33d78c3cad7467aa81b2c01d20d870cf18a87f01 +47d4efbcff51ef257262eea239c288f08dcc2352fa1ea2e3bb0db223ba2f204e3abcb271d3f66db5a578457ec99f28b466868d9b9399a1,f3859542d29acddc5474c5fc986ab466dfa1a97fa6dc86d534ef152b85f7ba3a,ce1a710b78be9d8d21976f23abc814ee40abbefd8c3cfc7cc1e85f83e851c90238cdf7537831f70242092489637a65d648da04ae76d42b1e68da9d95a539c89900,e121754fcd4d2ce60e11bc7800e62f7d1a478d468e4f60cda0b446c41517936135fde94fb33353a378b5fff4def52a7ed8b178c7a32aacd6d067196e3cd575be01,627efb29a768b2fac55acaa03617be0584ca7d98711467e292d0f07e4b953de356f88391e25f592d9838c2744fbad49d2d5bcc2448fd7bf4a49731f578b8ef6f00,26994eee8ff6c691bf7aa57fdc83d5536e420733d0d6ea74e21257e035b389ce15b9367c57b2fdca5ae016053b38afc4636bc4ad1cb946038e5432f48fbaba9501,546eb909893ab6e9b864179b3ce9b60f9d8439d8dcb7c435776a9f45c99bfa936b8c2d5673cb6081a28ae9c79a9273c399bfef554156f1f02d191e88d684393d01 +94805a3fb027f7c58b2c6c4400d5b575d0d82dcb3db468427b0585ca5b3119c02f69244d132c44a76672f071ce2e2a407a2cf44aaea825,4cbe46174da70aacc5ec69c9a0837d018c08777079301a24d5fcee78a01d4af8,f1a64712d832faab8ecfbc4b476d088ed97fa7bffabe4f2b17a8f247364c9c476fcc2db50d48f978805621da8512c5991550caae0ada32d54026006a95bb15d601,83cd19befe687a92a94f25f8b6c3fa89ec3066a12b3b71c386551793191279835eb6f553b80b625745ad1059f3882133cc72628d3b9935d68c5b2f3ebc5163d901,85509e37ed657c9efa743db7c96c7c752c4cdae8ab86f6ba04687042e542f4b142b7d26432c40161d9d9e33ea9e96ce08ca6f7e01fc6a18644c053c9840c67a400,93eb655dac34393fb0277133694f771af6f085b9ae66d4d4165b1566e53efa5d43abad47cafb3feb3609f80f0bb77944628c04dac549635553075849a5da5dea00,5dc14b0d9ec6f1a083a8771d0992e562e737a47285c339605ffaa1ad6ab6ad07396d3c54f9bf474d0ea146a9a8902b09967099511dbc18f78369654eb703f15300 +a7d8e27ad1904831269f03b9b030b91a4d3483c160610b94315eae9faa801f34abdc3c7f9c12b12bff5807c0ce39e0c7c7014228a81f50,31efd9f5d51ada15cb4d64d97b664ff6edbf513c852d3f5d271d890335377c38,4b81fb7dbaadecebca8a8a33084d2b9f2499639f1772a7b40e8e47ee9b02e9e67ba7133d5061b3d720105cf75de100a509c12c7909b106f33e6a0633cf5af15f00,f92f87affbeb38c4dfca3598613321fdf29d55116947a76d984d691f726eab284cb7fabdb1135d07bb2f55d5a6ebb2e44ecc6f72953ab6db585cbea32389c59000,321179cd804ff466b8614721b2c86ad937ad5b405a50067e710fade3614071907c3651f9bf835d804638a4be4508c6d29720f9d606ec5c090270397caec94a3e01,ce3fc6049f7257e4a8bf9549834dabd42767c9650e9fc9ea9b57d289c83b4cb504a0aa5469bb586ecf9d7eeae2674089fa75fd64a440f4da95a81e1166d92d8a00,f7c084e521390d55841b4149bd52f3573f9633953aad2e382c87af0429b1777664ec1dd7a8b04f2df551c3f78dfe17e18ca49fab55872f922f0b92863c6cf79000 +093d70bb7820c4cc7efffc01dca8730134da5620b2e6ff5b62a6ecda3596e7fd3e063349680034bb36b1008c4460e580ec3a0cce55fa4c,92380bc7a5b20af09635d614f2016592163df4fc87e99df4ba499e477b1038dc,023b6a97bf840bf5e0c39db86cc4cf3a0c0e4bcc4a950e1bd50fddbd273be3e13e7cdfe0562ebb860cbc48375603b0491c647b7d656a39aa28b8e5a8846704ba01,5d37cfc1eefffde4f25045fe187a3695ad7093307cae63476c7323062b042df662abbad99a34ceba4928859482917a11a219dc23a180257effcab51717a8155b00,e2597eabeddbbe2c7e517dcfc8de5899f3575f699e0c07cbbade978111124daf2440f9646725531b576d51c83f5ccc851a02d4380d0c66e5beb8e4ac5036855800,ca7c0fa7619b2c1222860a4f43e38a11aec40f23ae5ab73dcfe0ceb5636ced0e752ff64000244bb5c1d49ba326c853dbe402f61474601e9d42bcabb6bf45119901,5714e8e61e88bfd8be5bd6b2cc365c1475cce7c9fe33e3a475082eb18a29b3681a3c901861dd033e3c0a499b96741c225051824a5179bcd67cbdec09fbc18e5500 +495f8fa2289d3fea0ffb07278277dbf286449f388836a4d8f34d03b6f4a32a746e8a8b438f76e874012c985551b652138da9c3f6df9917,a167b139d39a39d09c7353080c8972545dfa476252856eb5ecc737c105bd2a56,870e6eb5380a8c30f24b7168de0e9c92c6e1a87f6d8f859c126bf7cb109ae7fd1824db45fb6dcebacce0f63b2ca095443c421d57d4260981d2159b1f296560e400,cd00f95049a27e9678518ed184ce4491dace487564960d6572f0ac23014ea7ac22c1c25cdfe191fd02cfd2c10c195b505e045d5237aefb7fa8e2aba9f0065e2401,c5a754bb477c571963eee78982bdcb61f34643540973d120b02b22f593f217946db131ca4a62d832b6b781dab118fd5fc0fd227420917297b077f105153ab3b601,1683b324781d6dbc03cae699e8efdcee9f715d10c151695bcef2f59f0cf712a458dd8a6d4ae068e77420c55047e97d7e3c4bd62afaea47c1049b8117ffda475e01,b388acb4f19c8c59303b435fcd71b47a8a814579692990bd6fab00355e8af2aa6895fd2704e0f3a262da3e86d0067fc512db1786d3499fecf651283137ce29d201 +6d3e68ed17326a5f8c80a0b552431159c3fbe15fb4c63692b4a2b418305026429ea28d7df96985ea2875551a3e62d93f167800e61b751f,8dbfd6ad706badd9f0740ce5c4a275618f0d4e8eab0bde4383fd05a0cfaf8914,a6f94d6da53425afdf082552de9865b39af15c78b0d181a2b19b3445a46ec731409eec65fa8898731958525549594bf77ffcbe54c4021447bcfb18f9c97760e901,9d07a25db54ed9c70ef07881f6700025d25c1b826439a17d9719fd23f284721a4c2209d159b009ec44e886fc1ba489747cedb6eea870b70cbedd6c73934fde0500,53a8de1534b9c2c84fac456fe9d64017397570b5cb3cf956f2942ec28bff52e64989f134d97cbc8db6375a690762de725b0aadd425ae48e84aae889af22e860d01,ec108d5043e6124dca928cb5fa782935b27491294bae82165616d59ec9ef067a472e4458baab31a437edfb683a708aa2ddbf61775e006c754acf74dae4340f4d00,86b879aa50866fa018ca07597411a9c6e065f8b4609766035e751bb3a866d4f51ebe36318a005f642df48e9cb5f4630ff77d7b7f5ad931fb8583adfac802461e01 +58d3ec703a79c4015b55ca50315e26779c8a9759207f6bfd3fb9262d8c373820286ff80d1a0edbc5055ca8f300fa0cbbb9a64d7fd0259e,ff5061d34a2bd371d2c76f31c8bd3e2c8b20c5bf5791e3500cce512a570ca4f8,7a1bd9b1a998cc60fd85cbc59c1fa5f235b0d2bec24f176d1ed137383e18164c6f267557c6f31b9cca3449ea4e1a4ae26c25eee56f71afc8c031debf1af4aa3401,abe1cf78f5c906c0812b8b0dc1a6cb5719ee02916d532a44b14fa2320dd14aae03f692a65ab3fdea1b061ec9002c773909aaf7d2218119820fa16edb6e2c35c901,1696f724a1dd30a996b07fb6b81995c7a994da5f8e7eff98b312078aff45d77a42c6ef6a2df44d2ed4658898c65b52e8695eb965339b23e652f64d209136b25601,2df4501da9a48b5323aa068e51a203fee9fe00e8d72eb7a65acccad5824149ab7a7eb017ddc7b0196820b627c334acce130393572f7117ad622794769cf1b27d00,352425f53719e9b0446da974085a47f7e1f00107b5fd36595bac58c53d5a6b082c0ecb9f9f95a79c4df96dcaf9971fe72d06506b6cc54f6006651b3eddfa62e401 +932f7c8f8aafbd20788faf9986478977c8ed820adfba37624eb65b299f90a2e7fed33f94b71be91e343ffc5c3c66c2bbadd08cbd5a2138,dd60d9d37ba5e371b87f1b97ec74c66d0c4038801d6ae6f0931e6a127eaf30b9,673b20e5f3a5ed98579b911c093e2b7496438efbf41dc0bab286f1684632dd0d34d06abbcfa54b02c082ece7dcbf3bfc3dc0f4756cfa69a1146e9b106ca0041400,db4dae88736bd1c17ceb02e33fda077cf503f42b3059107ebe26699734a1f4a04144af16c1be696558fcc5fb70053a6c5c9529a46b10133dd3d6a8e44b466e5e00,bd1a783fa8331d6a1f2e0eb527c51828c890d34fa52b453b7931ad6e3991889d523b2ecd0988794925a65a58d5f77c23d0cbc6e620df1392ceeb80ddc3d9a6c301,d04c4b3e07365a716f4bb063b4fa6b1e6b36462f770e05a6a01d290fb5a39bff17225110573b778c6cbd2ecf00707e353c036972b3a334ad931c10c62916be2201,16a9a601fc025f50c62755235095752d5cf42026d3a6655b8b5e4d77f89f51c64b0308da328d5a8995342e7c4c023ee3534e27c419507b1d07dcb5984341a1aa01 +6cb60088a3057dec1a5acb4fce6ebbe2384438eeaeb1405cd92a1114d70f420e9243d6145f2574d9e995f9bcf0ca7d01816718a70cf09a,d0553179276599ee641021829f903e0c1c780664c002983187db47063a974607,845dad6455aca5d0854c51e0d5eb01c2b010dfca86d5cfdfd74957097a6ce7080bb653b4507a3cd80d8bf34dc1c76e905e909c52a3464f2cce73dd1c9fc0230301,a0991456f36999318fd17b0f7e54c0b47881beba0755a4859c985a100371cf0473b28857a90aac4bfcf51ee941954602ab5aece0943228d17e45b5b7719d903f01,f726730509208a6d4a4172abddc0148908b0acd38ffafd64f8890208e7dcd8054aa5f2df99e81ecf751ea7b5d49aa5e2c0cab15aed2eaba4f8ce13a698b77b1701,eed38b30b40456ea7f77257af04397ff464e5b987663ccf6423e8f53414bc8c92b87dde98e10fd8fdc3575675c2d0839f6140fc85b397801cda330aaefd4eaa601,f7e2471956d95a3925129d42ad8636890ab69ee52ed4ccb008d346776f58db4c49c6b593a6495856d3ca0482e2015cde2b6c081362f907d05d54f16b73c1b30f01 +d7f3c4eb69ba1da7c4a3e36c499150a972901353167ddba154571d139c3adf787744ab6b387047c4a544f10c58b560a8c68d2c4cc11ad3df,aaa3c9ce1d0da191c20495ce1bbab383dcf63e3730db31f6b2f5b894fa119967,5df17922b57c65907190fb466880d8a7e859a576a24e0cb96112df6d704d508533eb45112f2bee04eb1775894e96b256d5c9dbabadd353a9c3556324125ed11c01,dd0797a0d4c159b4a43b71f2073e301a9b332c7ca76efe45541c179be0a072a3028d6063efbaa88f9fd3a5d117aa69927458da19eeefb7852059b10ae62c1dac00,5bcb6abb053c90aeb030fe92df238a9caa00d118f56d03ea23146c5f5b8b1e874c686b3bea9f7791d0b2e3e6dd058a902ede6fa4e37d5146b0111408407ff3e900,7b8eaa440f2c8a9dfeb895c52c718df3635a1e9d9ef8158e12ec162701966ae43934c3d0c49a6baf95a5f849a25e82bd7af2bd5d035747f6da3e97d8b065aea400,bf3ba3f49d6c792e07bad4840046c33a1d3062e39d2a4ec1d43a784616767ccb11eb2c524e13a4c8a8823bf13b33eb6d726a2a38be438bd04ba470f81370888d00 +64728059f446baca8651aac9b8e9c07a9676f72298fdf531ad8162fb5759cbb428d48f1abef2922dae375ef8f64c070d8ded6b949fc3a334,260662956ce58734df24ce5f43441e8d2bf7008ce6053d345e4c5c8e11c5c6f3,33cda56f2dd02932f721434006d17e069126760534d7a124d2145805c09c283213904d61702e83a416e39379f1cc3c80cf186796867cc5e43d8ed7cdc3c3e4fe00,7abb708b2ba25fc562d0ce85c8c72601b36a3f1fcda73083dace848cac7f421b40b14da12d28440d820573e8c39c3ff6ac8c88f5c9ed14540185ebcd70de59d001,cf4c4fafe7198db6f64808c43737cef993d2eca7b83b7375803f85fd9da139967c4c3a90685e69d5dd1f1ae72c06320e9903e2581c1b041a441f5e4c444b599101,3cb22f680957228062a969d9f80c8a923edd3c7a39d4fa924b8f248006d168e156833850c13baab341d12d8a12e4896861dd55e57b4aac1d1d9b151afe8c5b7001,bd842caca6d015d749a097a219e3cb806b35730999ee8aac1ff05152ab13601e708211e5e5941af9974341ed5303144578d869f4c7c9cefbd0e4e73cc99caa5b00 +44a45621cee99737ae7572bc35f34b802123fadf080f7197886c70b79eaeed1d5d82e02495e2092c055cec538ed6243371c919c21535f4f1,e2225c32a808eae042c3cfb8e805b1841ee8dd300f32b34e3c49e6f882bc437e,e32c871ec3992beb2694a231a2d3b4ee31a845b61611e95277018138e739734672befe28a1766aee87e1bf8165fe468a178e32410c5a00a49e3fe0a51b79475b01,e7ab975a70f1d47a655d4b4e5fc24e881e5e04f1b8ee7caf575325912caf4dd80905eb286b7f2f3a66657baacea440dacfca94c49f7a533d46c36c09215a57ad01,11d18136b3220f069c653bceaa005ff83c1fed7dbaed7b13fdea3a0e9f1c96f3069d31a07a3c77953e4e18f3d2848c39d7ec431ff71e4bf4e1ecc43ec6ccc3e000,cacfdd3c15830f2727895bf633e4e48b4a8cf2346f708d16629b4128d2323dbb60ed000ffb2a6a08c5fe3c92add0f8c3b044b59717d05cf07c98805ba5edabf901,cc33adb426a3f9097e3230af0278e5e0d87b75c196781cd2493e1f7cc060aaab7355329cb052e275fbb453c4b4aef4381232e027bf950b7178bc1151b995a7bb00 +66a4f97c58fbc3f891a29fdc7a49358f2040c5d7407be5e3c490522df3eaac8240d9b7ada4222c4ccd1823dfdfc1242582c2e0085701427b,18cc0f84f327d2390734e63cbc2303b5838e1fa17a465fd49c9258d715ce1252,103e9fa0aa316473dc412e09acfc276bf953359e878c2e04a9e94652f681fd05751041efb818df391ed1dd607d290c8446532c7eaa847a6471eddfecefddb50901,51de496722a86adfc51f80746fc7ddfaeccb7be5f0eb2d2918d8e3e494b604f972ea2eb8b305e9cd05ab4acf819cbbc92b4cc99d6aec830d326efdd8950e32ee00,285aefa94e8c6839e3392d6d35a79eadaf7fcfd446bff15d253ec996c33fa55f22527ea9aa741de129d86298e191b5dbea72ea3e9ddb3ad73d4d81d854374c9700,87c1d9a99eed78ac6b17ad71cd1c8127773c29f8f25586ddd95a0bd9832d56b12b876154c2cf7e22534ea057acd1394fb8523d37b6ac6081c113bf69a0c6313900,86bfbe44085a7d76f27b0e1c2c78b555bfc009b406b73790e95c43ec62dc8a315d66fef7453a914ff28794db87c10076c88e7dd911837570a8661b8069e96b5d00 +95b76b5582977e839311b18d9437804c4cb4f1c6555de795f114e35ba7745f3c446ea48de55522b869ff2dc19bb1a9028a6e190ab3fb5367,aa2db451b55ab9812d4f2f8c5eab3e645bb2783f133c5206e4cbb15041b96375,4d5890afe391c06e8cd8564117e6c06a4261496b37b959231cd61709e5b2c68925fa78545687c7d3e9a7e1fbf37d1af5a21a88d2375c6d4310968653d5e6722b01,5399c40d3723662543105572f7b9dff2cf15b0d5024e46f59dc0e37b6e72be905f4518913e1878e7a53cda3af631416d7db6d3ef41164c8980e27c25373d9add01,e29012fcdf5dd32e9a681b81d2d717a4dfb6908bd750b1ca9d4807afeca008404d36e9fec5f558a0791fec2449a2f4b4539d5e594750198c7f8be2393a5fc86500,afc359a89aa32bc4d51f8ac7abf44c5e85198d19dc6d8b19e3c869fff83826810364aa03112da0cc7a961cb30a02bee2211dca2e92aedafc60c1382c8cbc869b01,986eaaa47c6d5b71587d7a6729d35b60cf209aa94bd6e97979e926b03b127c74517a9ebd345575678acfc3ce25d5b4d500690774e62f63cdc6e6a2fdc0c6621800 +7c29c2fa81399f17a3935a3a8912a99303a955aa0e50ffb9ab44e85d16d21ab45c1190717a1100a13c1dafdeabe0ad353bdcae451d652ae3,4864289ea33ae12361fec34f9269a94ecf85a05554576d53e7e29208cdbd0d6c,2fb309cd435f1e056e2e762d5d508d2e6e31381b96431ea2a426ad78053b4d483ce32ba073042d26e14ca90fa7b54ef536d521ff1213eda67eea8d59836452df00,9d83f818fc1b6a5911d710132dbf28c8eccd3ae3cb0c0d9ab01b89c1c13dc64819268aedf6ffb1debfcfb45f3d56ce0f53be145aca175097750f781a029cf4cb00,c7b860b336e395e3806fb99677e3825784626df42b267a00a7e5634fdd1a4d1b16a2140c75e0e5c408743b053ccb3936890937c208be970c0b8feb6563b69ce700,15ba8acb2ca2cfab8bd78c3199eddcfe2f89a5849d33e83d43d4e66638868e4524b2ae2d4bc0beaefacc80c828106dc7a7edeae0e56874fec23c3497a266043d00,13638040fe68129c2c5605840d78c8ef909c26c68912c758df5e54be9bf991434e290c0c4fa8dfc833e80d2d398cda820b17aa672aa9e864f04a541524f75b2e00 +f12b8441d991ace43c30d873c3c9cf442e175f88b4f274b025b4e58740761a386d0b8217d2544ba29928e841cd1eb45f592b28b5625a40dc,7904fca75dddb06de5b26e00a3de083050417c7d7e0cd805a2755065c221d1a6,967f61a188b2db7a71b16165830039b94426e5d7aff0dcf9f81206d27b58f71848093841c38cfcd1ec2272d1c62ae2ce4886f028437f9ffc43596c65b3fa386b00,ee6030a788c7df3ff31a52553b1d16cde0d2d5a79966a27cd3f85bdfb0547b214369e5f215e4282c401a08b9707f2efc3f52f347a83dab6751ec24e7ea34eda001,8a3d1b1f0b8b4aeab3466871b3cf363d4f5a9dc1e3b648655ef3673dd539cbda3e44915fbebf0099f1c7c3ac90d259265299d9c6f2bb64051eb18a530e3a85f000,2357dc5ea4a944c65c8f5ba7950d563f0d197c0ef1f1c9698d3dd26d51b139fc33f0516136b382f0e904d57a4eba01397e2082a61a911fa3d545cfce9a3b49f600,a8b6e9cc9e8047a5d2e321925aa2b87a3c411bca7d308276207a275708d962fe7c5b09e7bb858481d9f7da4ec54f1c9b04bc8e34ab56dc083eaa1da22f7cf23401 +8cc3bd603efffc21cc146ceab1eeefe6b29a273e13de2d3f872808ab42060f376b9e7c2c7885f7624da09faa7ec9f39b9d45e3ef648b08b5,5f74063f07b69431dadb4fae3ecba83b14dc89785a984199c67d8653f47bc606,0f83f96fa7f9ff7be6623bcc75e2cac621f32f1d3412920515aa8a6b8abe71eb11b2edc8f24107931edea99bb01151a13fe400213fed3d348083d72e1e1c1ca700,219c530b45bd2a2e16e6b7081d451eaa5fe4d0e5bf670105ac3116205cfb89c1514eba7073f601093697189138c19e93bbc702ec5f7e953165adb8f583628eb801,20a63d00e10267c3438349adbf119b59fa02c4a60f260c19c26304846816eef50d91e140e0dc765944d150497a26445222d96639c61ec9096774ac0894458b0701,df0a724889f13fcf4d86b5946528dd4e822619419142e8d85e48d2ea847e029416d38c2d09c7737a5b27692ccaeee8c8c93428f2eea3162f05771068cf742cfb00,51832d477adb47c9f6bedf4ddb3621a9e447eb17fb3cd98c5c026c0283afa29b23871e07e5954bb5b3010b71e7baaad8e1493449f3a4cb8d97bd4f217a9b44ed01 +4a95e1bbd0e4250ee5d4b8085520386f4f5c06a0b9482cff4526374dfaad8aea0a8442989d20f722ed56091da86d5a3467f893fb3e5ccf98,d1abbacba2a47b44db99680d35c9d36da328b708012801e9096909a44fb69cd8,6368736415896c470b51d8b83842ce1dadea907d8b12092c8369259a350b137353131408c083a6686347a29daa7b7d96ba5bf4e00ab72baef175e462d83e4ba500,67906282f3fdd82e27aa142af6581bc2eb38ba0838a9b4f972c88590f57af63d00b87dd0aac741e9149ed61c9a7172b2d55d1ba75dcbed549e3d87d1f4b39a7701,d459f0dfcd7f270db51b05dda40e39f653cf933f1685e6777570771fcec3745c0398e413c6c8d525e663a7cea531baf02cc555f5c180bcc782ff139c67a5f37101,546a6d5f9e5089cc1a8b64e2a398a646dfb5b50b07fe3d077147abf3590c4b9f6197559ad84161e0f8cd927505b0bcdc7211f7e2095b454b2edbad60058180ae00,0cc1d097d323e580e0312e4321aada55d3e7632f84e78165b73b479919426e3411c86500b10da07148266ed401b299c9869d6e1f0def4385a69929c2bc10563500 +3cb2a4bee14953284ac6ffe40e9203fac203044ffbb18f0d2b942087cf74231b4272b279991abed9f45fd216ef0e92665abba31facb3a99e,0721c965e213a361087dacfa41f00f00c97fcf57506eed7ba1fd9b0a67460317,11be2f708cc62d23e96e30a0f0789070fe2f3e2827d214c09a538223bb1296ed781f9b9408f0b3d009943090ae8ffe95fbca62a9f205e2a304aca2eb8bf8930301,ffc06aa0ee3383674787279f0979b16778c514ac22ebabd0e7c612b148e1fdd810dfbc2dd3fe2e62ff53a26bdd3dbdce2cd8f8b744ea2ae111e5b9d7291514f800,f3dbdfed92232fcee36fa5324e5d733b9dfd7b14d38d3f4b2619f8ef2a5574ab4c240e7a627e3657de13ca3a804e07b4cea690977aa126e277bcf7201320e1a301,d763dcd86e1c8294803a3a20a00e9f412c49bacbbd77517fc00f822bf249d24b09396ddf301ef934ee1434eb5a2650d71ab2e842833249200b035b84ae93cfa701,f67f2d98a035c3d8d19829ba21cf608a7de5ae9c650e06c7a630b9ecc7066c282c20c3dc59589f032614dfaacdf7ddc4b63d63a6b63908db0d56f18c7e90a28600 +f4276d05a103847dee56b524998394445b235b0258112ea520dce32b899d966d101c5ea15602737acbb74e0aac15e4a6c9a3992e7438bd7fac,7b1ddb9cdf3fe1bfecb4c30280427126e07db33ec8cbee70bc0a8915c3fab2e5,a813bd9857313e67f10b0220cd421338031f36437002eb5c6f9cb66b57e6628340ab3c5a07ea2c9c5a947108cb5fefcfc4b6f6628d26b20ef35054b458c1575900,207cd160b3622ffa4aae2dd25fdc7d2717a1304cec5540514d59d9d3d6894404577ff64ecc2fda2642265f342bec4c871d7b2caf829142a45b6709d2968c9f0f01,6dfa2f1bc728f898ecbb493a47258614717039a49e33287b8d94a43b1b02c364711fbbe83655070370ea13f584a11097927cbf53f17e379823e97f284b53c68f01,6ec1e077135ed968842df984cfe55e669cfe949d047b62485b52465b5375f0c559cb45894d06725ceeee0350076353d4c25989c92db63f4d5c222e943114230b01,e2b6f71b8e943cc1e0d1677d3842adcf86531d2dcba67a7fca845157651b8956352040cf6d442ef318e26c2651c5480005d1fff6fede1d7210e2423342964efd01 +ae5521cb1f7acd859a113679820d8b8a29f9348942c370a62fe91da66cf8436740a390f2d2899ca6e4b9c21961818b3d08854a1e44ce8be815,b0e5d6e047860fb07ab405566d7528a6df41269bcd1dc32fcb7222ed653e097b,f186935196ba748947ad74edc86e05f0066217618dc3c397d512897e3fe57d436212420c5a07cb39fca95da042b587a5cc5a2cb03fa68840ffe44a70b9e95e0700,02e015e6268ccb7f4604d09b13fb56f4f6c65beacdc9e1cbff1bcec16baa8a9828812240cd253e0afd4f259c0f95bdd49acca5bf02d046d92c5cd7e538d7bdf100,180e9eadf7a693326fb0a11c7df6606866a4bb954e09b60f54539b09f58307c27f7008ae05b80222624a3010a1d4510e2747ddd4ece4b100c82c80ffdb704cd600,a06222ce9714300694b7ec47b01ec13a19dafd214ed2272c8f209d33324a662d0ab9c763418f306db1b5e9374426e8dec9c9e9092d96db82eae6d20ca4ac4e7c00,1d5aed9adb5471b19e2facc2aa019e0b40f659e5ccb0407ba388353f6fb4fd9c428c3dce4256e86cffbe56c45579fef0dedb0c7e186ea9f9c4be372c7ab7332200 +4ca874c542f6641aca7d7fe4ab9f4084686c4e021b759c028c03685af7fe20871c833628738de7be15fc7bb1398b26eaf817ea5790844c760b,242a2abbf7dc4cbd6721351e221138782c04c5d3aef3d4210f82498553b88836,6fcd58bad5a4cd4d67c96414851e82d484f65032146f0a5ca7cd2779a4220d9b0dfaa391fd3098c71986be23cf879fc5cf30be6f67c75c2a385678b7f6d8250000,161f85013d05fd1bb1c7b28683be51ab1e6d72eb7a330503f7251604ba602b8d3a73f898b085e0b510c31e597749ea13170234658c912e922f16430d626034fe00,12be4a6dab43d4ff2625536d47ab92652fb4a1e1e5ee90922f0b3b9051eceded28e9cda86c98c5fc49398d6de4f6bf93f41cb0be7949b33d656d5485a592325901,02c821f318a754c5c3c2bb6f68b84fad6f2937ab2569bffcbb5917cd5f478be06dadaf132769b8edd47341eab404286dd962d4c1697b2f2f96d3a03c56d3f31d00,03aa03cb5482e71a8e0024ffdc7d2a62f7dc484b941070e8279eaf276fd7abb76bdfe0e343bf26eabb154aa7dc8382c3eb2cee6bdb1cd7eeef9fb39f2042c35f00 +b8f7d180abf46498c58fcf0366adda609dcd80ff2a3f02f7d0ea3c86b44142ebfe91f458fd528eaca51b5b753ce8353433c24ef13fd0bdfe1a,c2fa2c1ae8062c18db5068d7537934ea574c1ffb7683942a9e2bc827e7020f4f,949c33958a2d438a5970041802e71bbe806babedd71dcc59502145acb204baeb54f064e7d8b45d792ed5ea57efc354e2172610e04e29cd25d483223a8933077301,aa6195b6c8106d02ab18f9bd758d26e1f1219c35b99a4fbf7f5592e38b8bb528212a2f3ee1082808dbde29f6237dc37cac2057065d68996e5ee13bdc5ce84b1501,0d39872ce0e8b8c1a3a5ed20871e426c219dbb11025ccabda29d956d259fed184e4728a6923e147a703385bd545fcca15f27dd342f89859f1e62651c658bd65501,6a97a39f25173cc015d834734d0b66d0b4fabd65f00c99a6927b3f71442030cf7fde518377fc1673a45785c31ca18d77db027bf07eb763d6d90842a005f5de7801,88ac79409433d4325a86975f66896025cb4fd01dd1c574001e266741cf3f531433b08d713ea4f21b29615fceaa61f411274a6337680d185939ac149eb1e7296600 +96bc6beb4bfd730ab50ea17859cd84f6deaac423fe6eb41e054d587771fbbae2ae0e078a2d193a342bdd15a5601d0ff0540cdec9672046ea07,8bfc45acf3804d878e8f150717ad85d2ca71d0de7ff370cb6eb45a93e514c5e8,294482e42f01fe31701d759b2456cebd77b7e63976f7aa176f122571fc3bdc4e74fea95407c35dbf5338741e02b50faa39811bcab688911305d6b135b76d83ee00,b4b2717a5d56ef0deef7327cbab012af01062a0b628e7749954112768df7369422702075b7c8cad84353609ef1041d627659a26e3e3b12039956cde866845a3401,80eb53a4a588532d199101873f66263086f0cb4d097d72f96870674e6910675b396ef6dcd4a173a0170e1ff1c70e09c88e479691661c8008b1aae6a13a294a1a01,c3609e024f9b906ebc39f24f39b3dcf8c11ae63ac4e2b2be61efbb37877f43f218f7728603259b4e7050ec5354f877f243ccddcb06f844b38791382449d03ac501,2a0aad52686c7ee84f3c7f0fdd4e582257928de3fe0e0e497b50daf7397d5afb0385ddc2b0943d01e925bd76553ce871ed5b253cf5d6464bcd9e213a83aa222001 +fb5b3e1096ec21e104c7e652d1a1e853d47f34173d3d119abf28df891c7aa17587821d9ddac405981bbb16c35c177eac83d128543515198c3a,f1775c60df63158fb8d0d232ead32e561a466ca7cb7b3ce1c0e395534b3ee8d8,7803bc7f8100bee6463052119d4a79cf8bb450fed501d6f4be7f4063c4b3e42b628cc2f886d7175d2633ad6e0a8066a26a1c36e2c773cfe776c9e6895d36708b01,b282586be0263ef1ffec919eb94b14bc356794cd1d9a24170947eb8c2889d88d5ede28f26722646c749d54611a4c91c4f42f0104a184d29d52fcae196e2f7fb300,a0ccc4de67a3e035ac3df183a2359411f2538c28273c1524b1a304b4419fb1937472843a863d1170335cbb26759df37105338dc6e9cc5b6e0ec02c888db8ef3201,ff4896c736572d807f879b8dc470c3548dcd6ab5e8a6575c85520d29b8f41d1e0d50b2164138ca8c5a94f23d6dd7e1b93484c5d57c56b8f9c44a37c8bcccc9ff00,cc57149d87da8a9a130085dcd9d3cc5a30378820b1e8c01d1a2ca42351936cb6475855f2e8624ce574832c5f54c150ba02d327b40b634a8b3172a6fa3af9c57301 +2d44a95fc5588e9d27d0e4cb220489f4f1cbe0edb10f0f6ca58bda4b1748f9cce641a54c606b70ea272e245567932fd3848fdc04da3b18059e,1e06652223f5d1e6ec720b078f44082b3cc5e095220d78e0af9e2997b41b192d,fd01a1a2781a58e66bb639f43a99fedc5c08530a54e63bba5e8f271c3d1ee8be18366a1070e2668f1a065c701f06a2b5c99710bac5566b0dfc1494bfe9d29a8c01,45bec19b5bfac47e87d253b381723a1747bdc27c18f5222ebe08ad24f0014445418d03ab554e729de28cf207008914a429820d98edb85d4ac1a97b99e8d451c601,150e351bca3b9ccbd8c0af708429c2e35dba7301c32237e7110bcb41d32e40e57a7a6cf7bbc8df8568e437e76c623b1d84fa16ff542adc4369ea63454efba63301,ae7102ec6a60d34bb07d42a2d9bca2726f7f4013c38739b07afb15d3f727f1ab523508250054dba3a14840a04d1307c349d0dd71c6472121a9fccdc1ee432ec100,32c6add902b0897c90706aee918d881b2e6335c9e52fac30ae406c8578a5b2a2392f8c5e9d19d0a0dad841bd332f1221ffb0240546766d68c09b9132bb30792800 +225447bc1f916e166a20800cbed0107ca8de085e74b7afa1a30fcc8c50c32b959c389693d70e20fa8e8e05fb354a0808eae101d7dbefbd0e65,2ab11084516812be34c7067a647015ae13e6db2d2ef9e7c2573e8970abe6f6e5,3c1ac97f09b578ce325add225618e4e4f47c00eb710478281dbca0caf7e059f768b74b9ab12193c4f200f11da34ec077f76a747c4a8b7836c16dcbf7e3627ec100,efb8f7db9620de501a7f0d3f0d8684fa6b41551a430ad631709bb532cb87317712cbabdce0c75197c5841c749376dc66307711e7ea118a57f5896ad82493699901,29c4b174954e58bab9b516d912ef2a968f0c9c13fca616ce611064a7fd9e9d250aae1ca069a39f6d3629656d32fb67cc502c307db98dbf1e5b861784d5fc565601,ef6d232caa3f91cc7255af22eb789c2098109a83d44259c1413016d25496822c4525fe449facdde0e2797439213743ab28decdd95918bebd98bfa137778943ac00,598c54f21e6741b38bd2a704f4445d4f21601780d515337483db8e9986b7bc5165a89e2a15684967741f2153ee1be3c1dcc7ab32218dd9c08632b151a7759d0600 +a1c4abe6d2e99e099f0e43a955bc15ff54f46de211096621c71128573e947b2271ea4857e6e17c45516641b087a84e60d6c92f0e6286baaf17,75cd8ed3c21cfed1569b36c6366b4f8ab20c8c58e1212923d5e0422b36ec25a7,3f97c1ac33246da185c29229c025e9c5afdb1af30bbf3f4370b1154d491c2b992d7de7860f1dffe1b0daa2452844d04913841981b16b3e088cc80b2d9bd4473300,20d9caae49529c456703f86a6d643460d73d9d054b8d766dec1f099c4cfb921833d15504d38884c94380fd4030d7ef4225db639c8db2193501b7bb2af472bec700,07cb2802ef1f1bc5a29f17539a8f6f6dc4327b2f83da4e212f39eae602611e5b5ef495855cd6b718d23c129050c1b7ad18a0d2289a034f379101e3bfa414f57f01,07bb5805ed1d1b494ee6758443ec7149fabf668b0e1c4d4ab3df40949b8845466379bd9810a2a04009aea909988e1994a07e9eb50c367b0f28a974e228dffa9800,d2c1747b4e0b0f26feb3cc10b3d915b53441bf51d609b912319e79d64ca83c224328cf9181e6b9f5ae7acca93ad9382765f16d570c6b19aba86483e701cb236d01 +7b20d8206a6ef4ba8bb42e40d32045236eb2b86822c07c6200a1ca5e593e6e094fe4f87a501e2295c20435d7b56ce1376fa8df8213836d963b,52191a46176ae53849387dee2d7b0a4d20292c15f545156432ae8c8d0b6ed13b,4ad6ac6a7e0072491e2bc26c8048486b3fb20f4dde1678af2856b225960ecd9329bb269d0f848cfae29dae9c2233178295ddbcb9b99da224342ad89d8ba6131101,d3f38014efe489438d7d9d125f780a3781dc76994d6f3f355742c2a3b6173c0a25922c44cf013663e56b13be11aa29d22bc9ead6909b6d89529635e511543d9900,fb634ba3792f18d3c991ed6ae7267fadc030fdfa0a3864fb1d4a7242ae90962e59b0ead11096b02b962d49b3acbf8708427a3eec7ccd98c531c204b5dd3b55cb01,9564ef8ff08c2ccfaac9c0cccb89f6bc1a1daa85ddbafb403e772ba770bbebe040ac599e8654f4f8ae412629e39056aed04150122eadfcd809e64538713f025601,2e7053f4d248180119e8f82faffd9c13a564e003faf3503dd36e0abb11513475099a552f790fe6f0a56b7f27ae8115029d28af2c858c30cf0378fc590f988c7900 +010a1f0187af47bc8c9d97dc11082a7c475c580c918769aa3dc4ef7423ae2d011da30e3a7b8c05d338f9c96cf7644961e37379cd6d82b606c6ff,ee3816017e7ea57d2e437a3abf38093b06846b4f613d4aeaa5a83b0e023f8efb,f597cbe136db780762765adde5aad29fd3a4d4b73aebb53333ce80773fab966a70a435d21d7baff4ddad61a2d440510001e4e6fc942fa7c563cd51d5faf154ee00,13d919eb26822189f91d0d6505248b8eb1b91f9932af5c9fa856c967097b3a6138123a0fb327aae84326e13059bc87b623d054482959f616144486c4163ba75700,890016ea16b09946ec720b83cf0cf53b469c22b2e3672a119b370e6c52bd80830bbff2e872d48b6f21cfb800f0a3aa28d5ac96c530b3de29e676b89db381045b01,4d87e6d0deff5e9ab5fa58756065090c9243ea75c89a9a5ee8540e38032076c60061c5cf2867ab3ec1e7e33982de994cdb7a29dafbe3ed2d69a71c5ca6466e3e01,6e3028575ef9dc864529d3a28685a5e5fde341ae4a28d0b81ed716c116dacbd0359d4449eca21ab71344d98a6e2406923968afeef9d609b87512e8cbd6efdc3b01 +532e91075b35201d462b8d8e3f556b1a6b315bc69b20bac4b8188fcc8999d6605db8b578191b1ae5be2075e5478dff112eb168ce02994dc9eaaf,a87d464186b6d41c142fea6738d6e1c9ed173ff218f3c6dc7cfcd9209fb06310,b5d928f9a58c0d0a043f40172186735ed7486a82bd8409807832235636d598c451102c7820605217b55d94349e273b960709df24cb4a6140475fa1e109de187901,3bf22879c406210c1b0fb5314c8810e6f417018000a10c851eab6909205420a32ef44fd22e37f90904958baf48d5cb3c2ed78673d9fa0daabe88ce724ff126b000,cf72c1a01ece1dae6fcd2daf367cde732eb75fbac87d27f11cad938a740771bc082e80cf9ccee3328b9cd9f2502b479b8cd37978aae00978cbf3f47d4d2887b001,1f07580dcc58ff0d7a31a18c1948e61f8b51c0ce9967afdbc6921295804138cc49ec1946e760cd7c84a4cdcb7a0a6ea9b8c1e1124f20cf396c805bd1e858d1da01,f093d7ceac4436d3ba77492a5047956b86fa4f9c3b75e599b9f8c8ddad871d014ff1d8729b544d04c5fcc5c2abb8d5bbacd6bb5a166820e04051df44f9d93ebb01 +a771938648e36237208f28cdbcc3b1a1c9b9261816b7b67ee7f78e1292b99d468a282270b1b18d6c8fa79b39f0d2a610c2da9bfae17cfda728a9,7c40618636e067b8e07c39b347b2f473485e26e027c70f987c98e694226c753a,4fc52e13bc88b4ee5e85cab59c1d45b19a69d10f511ce3c1d8c2e09614fff3940a2805be8b95ec3d893e310432f4866f9ff2c5a4c853b56339225ed0c710305901,b3b112ec4633fc332fcd105ff3c2fef94a891e59d9186ce887cc151984b19ee54ff0a2e32efb691efb73d2a3df263d91beab8307b1f94ea45b81aafb4aabc0f001,3e6848102c4516a2a6aadfcc895bd7e4a3b6e88244460f4df88c3f5d09f836d30b717f2d3d0aa13d6ab243680c7f34eb22ffdd327894b69d96ce20d21f1c56de01,61dee99f65f18133c5d6529603e9249bdcce9c5e75fc9ee4f2764019711e08521b9a31931b1bd9b00a08bf9d8f7ae2045c7e0b160df5df0639f92c714b1e17ff01,09e1ff12f03b012b0913c4f33923d77b8f41410bbab19ab6a3954121a5b5f7ee579ba6da863c20c1934783d0a7514aa5bd90840729aee240907f6b458dc0370100 +d7950df9c710cc1d1e2a41c6f7d4f195d4de6c4ea370aeb4f335182a17e006b1485d754336b78697750f61094599818e2fdec0db79b6333e77f6,26efbe988581d3b97e189e41a91906eb3341b2317f1a5cb1e691172b21729c64,988c34bf8c1af748caa2f13eec5ae7d01dd41970a498b8ba6b69b9c459e1e5905623317ed507819841ba952f0d5129bb5a0b6dea5b0697e9fa1f3819c4419f8700,f6896f66ac69197aa22245968c922e552c548286fa352774926b4d9076f264945a09196703887ef20f9f17f8718a2dd048c632d478d15aca2573cdf9cc06523801,d6e5d5ed365c6489d39b8c8dababc07afa948cdc2893017d60a32ab5491da14476872a937739c59d49609a9461fb67dc7482181116dd2ea8906bbf4d8127c94e00,2c404cd3e5466dc841b246d864128ce730790c5eb4dc0294992366b951b6f14d41a720df9a14f5cb18237e146ac65158cd1b9c2048139406c1c32aa860a7578001,c988775446317f52c3467cac89ff4c10423a312612ffa53ce17de9ab9b46968157e0f9a804b85debe4ee785f1e3308b76654cbf67ffd4e684eae6823c86a2bff00 +24e97169b905044e7331ef915ad5d6a682a4dbf0f00323bc87686388991c2110b5c2cccbf0c8a3c2faa040df01a1985819d543389838d246c08d,2ffcfe08bd30557f824150afe19d817e16a2b28858144d679f1b78f172306ebd,eff5093d8c898f83b5904f175279be4a1eddb21c9473692f65f5ef651f8b31f9671331697bed875985e86229cbbf657e5e2e552bb3339becffb9849ee77aa11101,a126ebacd0590ac4fa69cae07cb27213af01eb2117a51d588c21db0dc9add45f08fbb24b196c9d2403e54f92968c30fe08a75cf26ce47b85ba81e934e8a521d501,8c514ed518baf117a15487c17d951b2d01efee242edc666c04b1fa570878f8fd54fe818cc660aa8f3cb2de28bc84ab57e3625b95bb7339d1e73cb38f4319160301,aa8356edb4e42795d2ed8c3356d5a14f1f86b0ae011c86fb38e59636348536931228adb73a4acd03f150c5535b07b7e331b0f74c2aed80fbc73a4d692abe2e8001,c261d568c2067eda6d4774a937891c0c572b83169186bd6027f775e5ac2a52237686674407d416034265f0b25d95b14bb5e7d91b8e4c911810c793f6af82f48d01 +5b2aa72a7562376f632ecb05e53c91686d449bdf6cc2b552e1131c5bac3815235417673140e269e2bab064c0485a73d5cc547e1e64e97bae498d,44332f52503dff3d5e67db1a881a49222dd3ec1abecf166769e34141be945673,2de84c87c728cb614d1f0787a0dbe1c27cfc027ce05aff4afd754a0c3ff810f95e844eb36305004d3e5eb291bdf54bce58f2246c5d8dee048b8244728e1a9a0b00,eb3dce1c958d9536d85d8038f9504750e2c6caf2a009329b007c5559e3ee80b144e8321f0c65694d5cf6955f89f4024ae4ad1ef8e09cd5d8f5bcc532aa17d65000,88e3d726135d27e5ad4493eb06e3fa0681b6db8c516ba05f21de45f4f751a88d7bd37cd7e5fe1264be5fe411ed0d5640ea9d136a611a8f2118c9396512df00c301,2bc0d996893d34afaf846ec63ed91f47d52e56a2e5ee6ae5d4ea3329a2c8e97016e4122ab637af3b044a000c5aa8ebfbdfdc996c216f8dddd6f9f6dc350c49d100,3731d5cbe8736f4419e3c4c9369bb3432ef22ef806b83aa648712bedc34fea9c04955c25100c17b0f1222ca084d0c593fa860c60e328b8b84bd6f9d44d54b0be01 +14cbd02fbddc8a6d9b38bf24362a24cbca6f1afc924823cf030408810d801a1b2a185150f3d5a89a9fc60872c562136f5674fd5742d17e218bc9,bc394c4dabe80752071f7c270701ae5c1819dd969a7e72eae470d3e6191acb24,35517231f3e75015662ba1d895690012ca09c336227e5c85e522d875137ba55967d9c5d655927aadd4155af4068a1c84f4118c8bbdeb0a4a73cb7f60ac42224901,86d96e305450e7406a59c35b1fe0cd8427d2aff67e1718a56badc6b1846756b55b2675b8067d3266299cd5e18160d0e4034cd83701f65025c9377df2ef19ad8500,a12d1f512e5d29e4d644bcc7dccad4c40349d1039498f3aec288f8143c1becbf697c5e17fc364422486f96ad1cb8f6002893b641e48591d16c1e0d7fc56b1ff001,0e6561a1f68663bc807682c937c06093b6566ea635660e1131f4b549b758c47a059c14053e1979050ad474d241394bbf3bcd58c4f434c94b8f44bd268c8a1ba901,097f25135d0a91dd66e626c765526f99335ba9e59546f0779b7615c4c99e88833bfcbbc1a199890cda30d40ad0c71de09084af33ada1ed08000683d7b2cc2f7600 +8d1e8ea634454dc9720df225997c2c86ab8b874a99d300c4fbd43f079cec5d27ec00e90e2d36989c239951028e1df45a9023fc897bc92dd4d340,b30c58757421c9331720665298de28d8a32cbba3cc90f8d0f1421242198304e6,81a0a9245f1a1d1b1032f98324bac29fe6ab39c21fb3bf291350b9402c18611715ff2cfbdb5dc04ced233a36651df71be3ff2627ca36bb7160834c69db9014d001,9ffedc62452565eb2759b04b2e48dffe81429e4e22ba3e3cec9552e96a6d335a0d140d4a0906ddb18431001d42573828f60c65535ab60eb4a5d809db12e128df01,86e4cd2ee85a3799088c56dc354d8ef8e23f08bddc77dc8b219679aa57664ce0416492823634d1b6f2a871f0e4c09cfdd352e9fe3074ef7faa02c14b8ae5369701,39086ba4fb972e461ef41b0d84e2079dd44d73315d8374a1f10dbb472733b04061f730f1cf5112c4803db50caa2a1cefc6504596b3e52bb7558b3cb4bf86f48f01,f2929c1c44400789fcabb094706389dbf65bd90925acd7303af822844edc38611f0a3ab2ed4904efea6cb338a5b5c1be8d43d584ba0fed2590040b054a75e32701 +9d1e3639baf2b11adf249b26e8e33611787579c8d095c43e03ec43d0e5bf0efb81a261ac5d310a23dd65e6c9a1d03d40898d3c034b291065ba0f,fbe9bb2ea89d46402af3f00f0097ab6ee4db8af8897f0026d80955ae9f817862,144cb49b94ca0835f7568d667d429f0753929f415b82cfcb98b688b7d37475c947854d9a7c11383f7e46e61eba83966d1ccc6d138b1f05f3681285d979859ee101,2b0f04666f15a2fa54736ae613bb21a1c77a64bc9b9296eaf7ac842001d498ed0990969742101b27c322c4cb9afd22ee8752e2ba1f65c2a250072562911ec5c700,e23b8d1f943cc33b54fc29ea7de159d04702486f76eb029b832f7f827cf46c95053f79247c1d97d00384d4cd0bb53894a69641b5141434500d531bc7264e45a001,fc2b6cb8dee6e18de24c6a2648cc219ab604ad4d98e26501cc1db4854f1b16604fea92b13566ee7b535672cbdfbc7ed46a18d2d1a44967ba58cde5488af1ae9d01,f321be344206d70d5cd461b3076dc632d609065fc5c691d88d4592efc60f1a081691144e34c1754c08191b6ae5f1a78958cf3939bf0d5950a0473f0ae8744cf900 +aaa2f49cc41ea275d6c186606f5fd3e5b43f89cf4bec4ae915bbf725ccf51fcde47c87edcc8c13b1027d1ba08997b2cd0bfeb58cbf2ec0a7a18c,55d1bac72cc769f5c1189cb0904eb22ef5d445991f8cfc03d2c50f1ed6df1de5,20df84cb84275b439f54a099ef66b7c2b243ea42925aa49ddc34abfccf41c61b154977bb8f3a74999c0a7fb0daf246f6ed147ca18c9ce166f91aa106beefb79700,48a2e7a2ca8aad443f578c42bdbe4416d8a088e8e4370edad1c01fb1099fb10258567d7f975a7fb84caadc87f2cbc97cf2a1e49ed8127a2c30e878c4e26a463300,674cba41c8cd6221ff0f09d510ff0b63d363ff4b1a17d5922477bf6550f4a1f64ccfe071a23423c3ae1937b6f47ca1e4ede2eb9cd6d9529c35754a9dc0412c6001,462fd01ee3c6844c8a9745cb62375f7488a1733c105fbb64b973f710a7fa76225cc1cec288243ca9800535af0858b5d1c4d8f69188a9a8dbb612c0e8254f76ac00,d31df5468b6ec7c8adf3b5c6ece36dc6fe21b1af1e030b35f4b9246772dbdd3d6ac8a010bbeaec54606f4963a0ece8119243a3f01c19dfbf937eeafbc921f74501 +be551a17c6a72b548b8d943c5a243ff6e5294736c8aa2f00ea4c389e7709c5b37b8cd0a2ede35e30b8b7d87e23bf81e9c9a60cebc50dbfd3731363,382d73133cd1229f35700b732ca0e1816b2ca91a92192560006992ae4bbf62b5,3129c52fa18f7833a1ee59c40296770c2fe73d72f2db7fc10e57f81a3a1e89cc627d3f04d35d588721da72e46c00cb2a51fc6e58bd12dd976fd8f8336bf49f1401,7c0aa826ca4b01d01e9d69426f114b8423ed453edcf1a7e2de9a727da27df0303e9973c4c938c3f580fbdec0720030bb93a81fb3df923669f2f757e1d2a7492e00,9e033702fac043028ddc16efa2df663708f033bbbad7316f72128c7222a33d8b556a87aaf33278ea96b42278522e0c5f91300e9f2e4439dc59ac5d112b0bdf7300,a484356b99091267748a8fa0fc93dbc7edfdc6d4f8aa6642768e4df08f53e8a220e5becb405173ddc5e76c3ec2b5b4898f75051a368134b9bfbfc6c2963a6ad401,efcc8a106515f1485e10b9122970d31dc1d219052bff93bf692d3dd7849519422c173d0f2453f68741ad868b7f6e387fd1fe8fb45b8ca17db4405a5e08d8d61301 +9ba13a55d8c5a90fca82b0cb6ac3a9bb251992c38f0307e06ef87e003c5c433119b9919cc2a64009b98fc32b2bf475c98d0ec2925b2d2f97e687a2,c55e788812704349853d186dabdb93277a80573f282a494f5f70dca744b50712,28cb1ef80a417246b2dfe035731d0f0a93c0f1ec0988c326d0bab990a71655f730b9eb47e5b773690ad56f37ede26cc54d0c08a395e7c894103b618fbbd1e0dd00,e200bb6d195f666f37ad05c213053efe0ad40c8864d38d824597a74729c1b41810b5f1835f39fdad50216bebcc73794221f260de5fd50b0724975eefea5a1b6101,d170e17e0455f530b8fc70f822a270c887c65b6b35beb2908dea0aef08e6b8505a95bd99e9f84f29d4feb35b5588bb573325caeb6f0a41ab1280dc42d5613f7501,5d6def5ec4c6c72b818a334a5a27668868d36efaf2c32a265f27a0319ce6e32d6802a02f09d9b2ec95324dfa402bb4396e022d80f8462cb6829e51c65a94d21901,89dce414b66c48a5e1fe61b2eb72cbea5a13166e914e9a311e81201a97ceda9e6caa182e631811366763671c29d81b4d5acd7b2f53666adc039f8636c05eb6d701 +73313df65319c291834b92b17f7de44e99a25e96990e881c1bff3d73beb69bc503a4cf2781166bf53c4d00e87a556dc3cde006ed57a74af533cc69,8a59246bac2dcee2ea06af86a389cdcccd26b601c110f040e0165cbad86b9de3,7ef6aa2dab9dce61dc8c8f3b740acfa88fdd0c5cc6ade4b691ba1b030fd8fe1b214fc11ec0450ae43dbd0a24f0093c5f06d4ee6a7aa62b1f4e190a115094a69700,cf77149c36977770072ae782701476e88b97278b8bff182dce191f0f16b7d64b3e61418352605c9f5c98194a789ef49462c17388812fd3d87073415bb15d206f01,116babe0c87496f8bda21bcb50a73d0cabc829699e82ebd830eb33c5caae7c071da282e80b0f522a9124c3ba7f88d452cba5779c70b82f5488adecf10c1534d400,7aa682d9c16f386e67e4eaaef82198b6136f01e20f7f41d2c2b4598c283a2864112f07322c7cbf5707feb3af1774332979a36906ec8f8decd9855f5590e054d601,37e6fd18871e9621dcd957f4aec0180496cf29df607ae94cbe3dbc6e9a3edbf6466797bca02f10598f6b74ff00a51b5b86ff78ed446e650b957d80e519d28d6e01 +71100630c83f16ac45e6decb33bc9178bfd96d53add2be1de401b6bca557e52e092c02a4370db5325f5cf27ae8cabdffbfaacd0f7ae582c250065f,f00861b0a5b41755bf299a250151e155532b195962eb7bc5bab65da59c6b4a58,fe0e07e65f182e41fad0b4a335c63ee596eb34b612d91c17812295b167433bcd6226e9cbfa7c75edde1d834550848036af4a78a1571a042263836486248be31d00,41d03968d02b3d8171d3b0457b0552ecb9a5597f2a57875027b1762264970c3066df781cfd5aeded6da1d434e1ccaf497e26e9f9fdb2b060b12e13e05987b8ed00,c5b379fc8bd46e323d9847a93dba37bbe502214f1aebbf2f344c4f62bcbe53db39c6df5f83c3e07fa2c5cdcedbd4cabc1226e66c1b0c683416785a3b6890c0f201,6c491cb8bbe5e8f7886970b650eff7e8db5b1b0dfaa9bd8193751a320d5c16447cecb0e1827d76cf727f23be3a69f7abae7644a02f659d8e11b557dd81fe76d501,6b0768f63fc6584e77cc26db4f78f97d57dab66f07e41e21809bce01f0fae0772b37e5fdd21fc3898ec87db019c67f2ade92ef870aee2d42dffcabf793686d7c00 +e8ef3402f96e50cd7b828e18e35f8758899a1780e66f45c2b5163123606731c349a1bf12180b9ccf2a8b2f31f8631e8a74d74fccd8d26964aad846,1044e0c1fd81bd8e6579403ee95d292d3a2e336f6ac0e1ca377a682b48d8857b,786ab2dafe0cb09bc3bd2e87fd7b8a72b53f5c7b0d8857cb87576f3b4b1102913ab34e9069b249af124974b776bf39e83bbc4b69190d17572ce3e23319f6a88400,aad6e73763d4f143ca53dd91575979b867ec5691972664fce0c95c7df599d681363a0fdf63c9459c0e02ffc8e986a8e435013e9b7eeb3b4f4f5f89dd29b44d1e00,397e5b5ea990764ff690f76af8e854260e51e8034d71e7292807d01582b602fa6ab5f9107ccff0d4b9bf52a54d17767e8c84a7b9cd01f053267faf9159d0ec7101,0965d3090fec0b5c17c03923831ef745a8dd07f0b99f8b621e5c3e2b44962c9073187fa9b32514bf77a8682a3ea9e01a9de17722cd716960559fe3e197684ebf00,b442a4c5b7dcd068b63385220290335da6fb1f42246eb1793da6bec9decf959a3e1364b29ed24df5bb66440bbaa220290efd4ac6b80614e189d485f2c1597fa100 +494f9acb1dcec665e8ce7464080645eac4d1751c9355dafddc497f967e9a1e63cc5f941380f31556e0d18995f0c884f70570ddb36887803a248f6d,42592f63c6621d369f8f4ec6f19254fc4bd5bacf0b64caa01a385ee9096ecbf8,5fbec73fd35c9f28c715be75de7df4f82aa22eb1e16ecb0027de86f24c2c574c1ade1a3b40d78377b6a27751779df2ebb9f316cec36e72da4e05c8e463ac158d01,edcab635ee5881f6f07449c35e304751e2f0fe714b38c236812cfb11c911ef4e41e1254a0de3eec58e87a5770c9c4c24fd3da9d5186e4e6ccea370a63fb73f8d01,c2428be569a9c35233411bb7a80655ce7eb5f99efaa9ce8eeba5c641f551df486fb606d1691d9817751c1d86958a851e46b7d544b432e84e000a49acf948c25700,289b5ab22ae6852e816ce4136f6943f8ac1fef849dedc52b0f576f2c7a5aad6c521adb64f3167d906076b42469284e621ffaf93fffbe435ddbbdcc27c756717900,5c5f03cea9be7e03520f8daa846d581acd7ebe7e587cae20cc200c0c5498e027229062f62343d52ef67039cc497001cb591ca28ab94954fbecab836c2de7571d01 +8c781d0c3bdd89d6aba2e709e51030c65352de9f9555197ff6b989de246de18d90baba71afaad8b728182a181788a651b68eff62a7ba3b2170e156,40973cb3fec1d9d01f1448c222fc3912de04f2fb7cec93c49ccb55b2f11aa6cd,064480eaddd0c70117d17d77a44eb224bcb1fc9d8934d089e3366bab795776b15054423d79ef1d5059c582ba03b75e0dfb847fb343b37709ef2104a3b7a2c3e501,23b7fb29e91f185e8bbfb9be69a687b3a7c2df22bcdcab6d4dac6fe5265e49b7796dfa3dbc320784f7164f8da896215cb59402869db984015cc315c94514485101,17a6699d3d76cd12da20363c19e414553068b5eac05a4db93b5fb534a9027c8174c98cabc04030e378b84560bf7814add3c6b2bbb043c4a2ba1a5e1b3ec5192701,8b4313158102b97656bb5473dd237671995fc2ed163ac0636b35fa177d3e21d42d7426341746a3a9eee72b5ce3349f2dc633b0e6f716228b32502112c1d910b300,e93d6a6a20545b6e2a9426874754edaa3599ebd4dcf78d69d356c3efb6cd527e569f68a9cb7692b44ff8896856a77648d9d4acc7ed3e4c5ab94639b7136d180800 +5d4e772a1e73624fadfcabbaee4f768783c87209c75da3c39f329d9332a20f94527b478be0890812ab7133044b6131bf760e4ec03f8221640c2b61,ba43d5f16643c07ac12f88c0e69e7fb945da23037fcb7e404e048bb8bbc5eb8c,ec3974c5a12437831b7fde09ca8de18b23d1e6ec0aaee40944dacac7d74c66440fb58b0c5e54f7980df0c0a71923296214d9b48031f2fe1e09f02c41e5963c7800,2158c1d6100709c6c7ed932e93fb214486f52cbfff50c328539b68c957b5eb24750fde6ede34ecd9d035eb0ec2260023c728f2758d4349373ccda1ab522b3ca301,906721e97058bb095377f29e3324b6104d2bf51e1d24335ab402db890f4564ff74bdd6afd832aca02fb5334508e06ac4681c367787d0606c681b6b7b1cc327c601,28262bbef5e569f7f5d32fa5d0aa55c8e2b121ad4c0ddf6b7f29f8645ae898e274cdd3c0d8bbffa8721c841bddb56893534c1241c29f85c2417bc631cc7c975c01,27a114d4f98afc4e0174e751573cdec07ff6f90faaef0cc9ae1d1a676ffb25cf1bba9f751e8b4d49a97035051f5cdc21eef31c7c890b14b30954cf8a6fbaea3e01 +a12c02be653d1392521de6b5ff061edc5d41c374b58bee7741f681f09abac1d73d198d23416ca16bc5efa13d7d95b618b43b792078c4b16e213839,1dc697633ef2cee167c466a815d2676474f2f4e646d3c7420317eb511277ee24,ca13bd26435890b6ed05b8e748f10d6d1ccb93c9704c6fab6e2d5daa3d03c0721694603f3c366d9ff0cfa318bc6009c28fbd3306fdbfff263ba821298a8ee0a700,46c4edaff2183f1208ec13d12c725720cf78f933818a294aa3c77cd07eb6c5837c0e7a45d281ed783c2128d0871ecb6417324f975c7ff81bcf87cc656478b8e501,2e71c3267ebdbf0c01f449e638054b8014f2e5c30e5b624bef920afd4a78ded93111c5e39306e868c3b27df5296f4371d1bbdf6cfc5b247be12e8b7ebe57bab301,7fd210838201179c3bb5058663c1fc356e2f98fd49e35fc348bc8b2b515db87c1dcbaad7e484fac52f6e062a0c4fb4434a29686f6871c56f57949d78f479ff8001,a6a797ee97ca872d54eba11be735cb54dedbddb99cf53c35c0d564ab8ce730fe64dc5ef0752c7a638c7be135392e6bab10e300298c18d5dc518c57335ee612bb01 +c4eaf54f5655e4ac91f04f5921acce9a58d183fbe10401882e5608a36f9d3cb874e51e70026edf885db3e8f95a361868bf83a4e770531df04599e3,5354379d5c007a121ea6eb10b87f956946bbb6ccc901ffa7bee593da7f4bc6f8,165c8b5d99802258bb99139c47406940ea8b71654b056259e6de804230d045dd03e77221bf7450296876e9100e0dfe6e4e6ec675400832e8eb8066739727b81501,179ca63d93e2026e8b7708daa67bbdda9b4f7b736526f8ae48b3c2cf6e821df05b8cb706d19fd4670edf74ee94c970a52ca9d6157fbb6a0fd33a8a75aac8751d01,1b52acd7283575d3bec198087fc252cf89936138a01ce957ea93262ec726bfda2d9be0f97c1a83d1ce1d11a262a0c6e9dff02e29a2c3185f54954cc65022fec300,dc2444cf9940ff3da4e75114a333bcd7f02298e128d6b8a93de7ee7be2717e5023c2192366a391ff27cfff70d2f3cb3dd5b27f9cabd83bad0ce506696be2beec01,289176588f0f52938efea3e1f35153bf519a3f381a50f38c2db16c119895cb864a005e673e417a3bfade8773cd9879ef09b3e9d14040df36df90dc1b5611fe4201 +b16c61edb6f65061f0fd28fcedea86ef153696b68ee5d085fed45e945ef2add10befabbe094ffa71a8ada853c4523052c8da30aa569d2160dce14fa9,88778abbededd7d88aa340abb9154489e0d5d4aeab1709e286ceabc7d5340455,4f4862e9ccd6983730a37c97499850a08bb14974c055853f0be5e268a6edd6ba061bffa58711a664fea0d28d331518d8073fcd73b8f0def5b5643e2f795d391500,4dc2248f7c434a0ef850b7cf4423b9d3ef3a071bca73b0d951a96214027bddf7776899854caf6026f653db9ff8b168b0a4a9607311d9de5525d34e8736bf152d00,f0366d9cdecfb76c7d14ffe3df42a26a1dcd38c91d1b4275c42a51eab787ee1e563a7643a162c27953a83ad7b52f34dc2164ed503e71dbcbda128ad376d6641a00,23de3b824b4139eb6e54ed7b6447ce6f4d25bbde0e9891280b62bb0856b472451cc453a793a325234cac83129ffe1234a59db91dfdf0c14710c25abde1aaadbb01,fae841146fc4e28b1e3e460055f4bbca120c419a0a6bfdbad83b93c616276b377668ae1c3b1b57e6268dc6704bace3fb58c51b30c63dcbfa3132112d92404f4001 +b5f68d86cafbce9b4ead5fe81ea62ddae4b81c01e494fa14521eda0aa5b9988b92e23e71485a03fca7d8ad59ddec552c7a14a3be1fa9660d9f18a443,9a91d7ef557e6391feabb7dd37245ab778674ad2bc03499940cd2fa2585a5b06,76a8f906666ecd00d6137c844437018caf28519310cbf1ff0b137c87c51ca8924a310a1832ea0c56b44b37ed77ffc87f0294a4f7f245e30b5104c5ca7bfa6ce400,9d15c62f68d586f6596bace7a759c9f3bdb23ff92920743093bc109bd21371c91ef2ae023493333e06e309b8bca8d6330b5fb385764b1d279977f1240780b4bf01,5ecdc18f6243652255a9de578576f45c2d2666f92dab3e70dd4d41985924871a6843b73d0159acfa48548982169374c92bd2779cc863bd6d4dbb9775b962bf2200,3975d716f74668d3d4f6995b1d7ed09c54f811aec1a09a15edf3c3347cd2a9841205e9c48ec0a1c0e9f42fb277c0db8bde76b5c6d32f1877d307535b515b53ab01,43dc7b390c7209753c5d7f3d26d2b76c4ea814d4dd6c3ac6ee6a52068915efc772eb529ccbb04f84dfff4f4ff57e36cea3ffe3134ddfcab0e06436a9b86bff3101 +27eb3a882aa2651edbfca84313ff8d355967406f385040176cb411f4c003580b34385cb35304a2c62c1b5aa86991d2aeaeebade7be3678daecfb08ef,f2d1dee9aa912089d2c5365c138cd6a35aaac1466e444206d976ede4102aba79,c78519c22cd7d9b95505434cc77d344e7d32c41fb7dfbe035eda15e88b83622a456a40a7535ada643bb00a075edb70cd42208415d92e2a23a0bc32de674ed78400,cbe9c46fb7e5c80ddb6593f3d7c60b3c6146b76947d7ea5e8d454c842b3463cd3c2a93bb474db9bfa89568324c7a4dd08975c8ee3e77fe2ea922f572201325f100,560b65e2d963e455bc9dd991858df5ec40ed382689963367a90ecf872ddd0c974964d99c9591eac28c75dbe6729ee5e572558573e7f74471ba700db4b5791f5801,573b84f35c5485958ca04b97c783ee1ebf57cf9acea1f5220270ba9ca1aad2aa4b6ed747a4da4642366d2663830187d3469daee681730cb596f71ae42e6a079201,207d9bab55dd20fafe41807357af56c525be66dfe0e5361f4cc4b4ee24daebde67985dbcc92b732eb37ef4205272bdfaffbb47597bd629274d3ad0985a5a910000 +9c15965751f38ce0ab3e3f0f85be48081a55a4088b34e504db06ac6f7e4f93e72c8296678f381bbcce48c4868fd82faa8a074569752cda1c022979ab,bb4970a2a6a2a2c869a0e80ae77158d687c76e866686083ab58a7877b1266e5e,9c82bc3d0a642151d753bfd89f4f96642039c80821fdd179941c27fc6fd44d9a0cd8b22843ca8993b1de2a3a34efb4c8d1d9d8d6abd0586ee51e2a76e43b5dfb00,02f5f0caa0c5cb279c3af1e1227d6c4400a05e90e9e7ab6d639d6e0d0103170343dcac4648d0c4aaf8ff1fa25b454bbabf4b36d041cb9f57ccff26982be52eaf00,4507b74cae42c3284a158694b59bece464fc126df6ab027166fd728aa21108e61f81824eb0f5dbdc7d827a17c2fe33b1fdad0cceb58b05f1a49d094c857643b800,bb712529d333b5169e2201ded8f1b09b2d6593b1bc6ef62b89e716c24afda2782800200467486d3e1fc0890320c7585600198126d472c2049a0c28f804e47cd800,83752f7c3da22f6feda776fe9896047d082c6a049d826798dc6a06d7771ba9284220883c0fb7591c12a42671c0126c5a862f816d12a391193080307c364798c701 +3346f353b2a81267e55fdb335504ba0d5f0144efb5ef5598c3f765783ff01df4d88d87a8f9471dbe169ca38a747609c0210e8505f71b8e2b3fd65b33,10f1aafa805f82aa002bdd99679f7a0ff06f2aa920f3210e3c219d499f4c55e4,e9a429369b39c74e562d4b5f400ed817b88f91a349d6530538e60edede7cdbc778adfb8a577689b805ef52cfb19fcaa146180dde8b8fe2e52319b3c74620a7e201,fd74688f4c6f6139bccd0c32929d4a19fe792797c85f029e4eeb89bf39b2cf7617f242e170b0f509cbfc78d9b16e1b6ac6867d920ddad5a02b1f4b89416e844e00,8d31a45d842b22e930ff4bbf346b8fa70b151410f05a4214effc3e80ef0039be532292e64ea1addfa05a0f6b3e68ad2f39ef51d7e83716996691552b789ae34500,a133f13c12926a68d42a33472add92543c93f8784cb86eb75b9415a0a70bf7c2323f9f45bf8cd482eb85bdcdfce45dbb132f69c8de9744509acb269d4eaf57ce01,048effadaf5c6e8d882dd8ea440f04e7495269a00b22a842f846a3c37e23b6f054a73bbf8650d718191058696630f85c5ce20b9a16566e7cf6ec9af624ad516a01 +84149cb82c7cfaa968364619833b2ecaf38cfb2c28f227329473215b4effbfcba999054ac5a9f68ab2401e5baf361d90ba06a2b5641a6935cb1d7768,a2deab5c1fa465dc78e837411aeefcb0bf9354aab561cfe7500022859c3e70ef,12eb18fa58a1e4574375456a0d73166e3de98c5485d7e5739e5322e77fa9a2af1394d4bf8751027a951c85f80cdddb5c038e45f1d984f1dc463750a4a49f129600,894036e60c946ab49a7165e19e9abe5a30562a53e58572a0a69fff194fe4420f3cea97b67b176b619e7888e48b1809bd46259aef98af19a28ddd8707100f446b01,c97ae5e6b213424684b3c149ed1dda0ba8e47d1947d19956a1f8d649e29b36124309df0cc1d72eb0f8ee925cf9f3fb670f96f9502f36ed0789f13b868bd5acfe00,d6d825dc415348812a7a4715e2e6ac744c56d4435c983a4865fd95dd7aaec669047c51752f2c41ad1e92ea772483f03ed5d4c36c7b6d7f8fc254c3417a0af07a00,8823ca6ba4f06641c580478e71ed4b62bd8831c130c6e279ac1fc994eee5aa180c5e7a1c2bf2209769870bc4c2c2d45727018325e4ede3e1ff69c23e3f75472200 +6d11e10e917f0f043316155bc0db4a498b07bf668caa972562c89ca167558a6e7009da6dab7fbb4afaa3fb54987ec21688e70e0bc4cd27d71e8c7b6e,bb28a142e3dda5bc570b2484ab4bb00c3ebb9cfa1fb017c36a5f5766f83565ae,36909e6fe2ee4ff1c708142814bfa40ece1e372bca39556a2ff3b771d87e60b17a319c1880ab7b781f5b8008a87d030f36465d339895c4f96fe4450605084c6f00,d1fe45bfa9d6e28b14676655211ab2439b8d7c23ee4f7e02a051c9725a5a68f34cc0306f3aa7935e76f374addd9b961d26045da6caa5b5d98b5608e8109e975c00,d2eba12f74040f91d712234d637f7ed5e06a450d0a8880457e936c877856481c1382f1737a8baa33e2aa9f5c218773e35a32c52fecc86e15fdff0fed9a0e6e2a01,99704dfd8f012980b41cd46624e908b1b37ff7da873da5a8cd23b4140c5366f61c95bd116c84a795ff5194a8361ea7baeb2a7d808922321cf1a42cce4dcf07e401,40af5292a4c1867007b074f6b38450ef1df7fb99b82b8d7791e4e1d4771291906f5b9246968bbd7335eeef9336d39914f9dee190c2a3aa75ee71e76ebeb2b05c00 +bb347b277bd789d57ca48d63a5f5cba573cec08d0a20f13ea445cf717b0d0d01842e2f2d4e3a9379433ea7655dc275ab2d640bef54e84bf4bcc75bf3,cdcbe0f442777a2dbf53def5d7da546cebecb045b2c352910226e5f3017e1884,ef4188011b1d2876e5fabf038ad5f84eed03c53c08cc6215ea02fad6b8072f0e4a2fbc66ab4f1ef71f88b89f103a81d6f0e7b2971e6ccafa672841e034c19ec001,fae8f7a411cfae498a7708e4822854d278fc143c2640cb8269386fcac03cf4bc6dd44da38167126cb85dad3dc9f19b4fedb9834b39ab449c4e69a8d2ac9e74d000,5823216486029ef77bc92d281eacd4ed90495ec71c7b803c088b488f2989278253e00ba8fb5904835c3b5109a028b7dc87cd853b332166ba20540f4249f10b8f01,f091473a55fecd017248627babaf58adcac85e3e95715cc9ae536e963630865758d8bbb32e5256b445539334d4fbccacf62cd8fd6c662e6ddefdea2889c7a50400,f9e18418e2ce27accc3880652b1de3c7eb54205b92944225f9bb380c92a9d0bc29234a932e37059ab88f6089836d5460e7c1a029bb1f2ed68e84934d5793026800 +80a709d7590a2dd71751dafce5bde1bdfc750465e69eefa348831fceca9dda9824b7ca213b1a7bf06439fbb0c2009c33d87b7d80c7c2b0a7994816ca,d13ed24e75cd9280f2f381104c92bbc5e894dd5e153c61b615f3b7dc5f7374dc,790314020f0c1bfce4cf43470ff243e61020e3899402fbc21db718c79c1c219537bce2a0ba84a422d532f078602b10ea70ee05868c3d52f9f2a0592a8538b05e00,b040158b5b15c81228701cbc2959ef47d24cb3d2304d96b93d70a89f3461b20f7ea858ff13ed3b44ea2facc2b3b2886e755d9965fd8219ce10c3158dc29cb47501,f1f8872e408f7fd8b4bf2095b9758aaec473ff31d8bf28eeb72071c96802368222b322e709609ca9390335e8227118773f2d33e0314a26baf90c76d887d4984301,1e95527ac5d7a000a6d128f50521e7254cf924c8e1c38dd8e6337be6e5d2ceb64d8a1fb2c779e7e1152e6b9f2dbcf1da2af39d8f20e81f045ae2b0c1d608407400,fedcbfba48bd6c8aaeb5e9f152907910d39d327e8dc34114bcd2c6e804dec1ca40aa75073455d98fc33ce0b80be7b22d63ed8ffa60265b58117f5473e3741bab01 +b6c63df24a3f20f4e8402ac9c5713522a293d0ada49cf132e1b46e1c69d319307b6c678718baf734872592c08fd233f8707cf0b8c648d709af67c60a,73ab5aa93372ac791940a736efb14938d8992d118b34020138981d122a575270,7a279ddad90a66451355f2abd142b08e243ec5639b4f49cd256a110d5cf2dac20a4d410f5089d629f27f2f0154467cfd341b41b56ddaf4d66b18a346266408cb01,bad4c53e7ea08cf11d59132eadb45d52dfcd43cc396e0aa6308d8dcd2dfdfee94b1e05a7df8384bfa5d0b5bfef456d7fa5bf9218c5f7b537c490795be6941ad101,983d5134a17e80a883a096e4e809da1ca42cea3d00b10d8f76c895c4155351b90e59592f1478799724d84df7b786f17d17ec8f9ae3cb5fc3681c37158acbbc1f00,35a70d6ebd111a4749d1bb9f6bf7b06717eb79ff9c7f2b02ff4abb90ce154ca469aaac26702d7c5e786dee8106331b93d1c688348d7dbfabedb7b5d4100c3add01,9e4df20f70ba0b1003ad9f358dd9ef5c42feeb4950c52309ffc8acb549bb37c43463f57367418c1c20f353c517595e3ad4c43b5d12efd565cd9ad9dcd1a8bc6d00 +e65290883d647cf55c5b3a9e11ed423e9d2cdf55ce30dc11cb032aece0b57cc1b6c87d5870131568ab75fb5f92896fcf24c77123d873be72b395220d53,38b7066b704b955a260cabec09f1377e2d5ed1faede5a213d065507c83ee8927,c9bf76c633c770790e7679aa2c388aabe7bab484c46021b6db11bd3288fc1629731860a254c977c5f9a1ad762d702479ec97f557dbcf4ba36000455c7d388a4000,afb8a0e256b09d3cecf247fac18df24b0996a893c224b9095fbed667c160da1c12218793db6974bcc790badbd1807db378f0055294119d3a714ab61da87edd4100,3a0c6c91a8fc21b12337da3ad4ef0b6935a0d659b9b911b14a58ed28c6a408296125065b202a2ec678b325f2eef77c96debe4b6e21ce78fe923f8a733a80822500,98a946986775f4e883cd1eb4f5286fc5e4628a35272ebf185b5487f2b9ae8d743b0ecd6dfae46267e95b5c82a439c377aedad1867530992e662cd39ea8e7ec2500,f7ea7cc4647d9b35a727b956b9fa149fe536d22d889e14e76bfbf61675f4aedd391d31dd13ffc2410ff0c90e39a53b58729f3066798ddcc413d09632815929e901 +f3314266ba8189db23610ea0a7fe7932071aa7d87c43501fe725c8a68486f48ae66bf29a193f679a76fd2e9c4de392874853e365336e9ed5283c91f196,8875e4db90712490ace373878e17f3cae5e68a9ba77f6b4ad4d76ea2fb04d2f6,7f1648e5453ce4c8c0d1a2497bd7ae743e73fffc01187bc5ce1e18a65a553f937fb2fa16dca4260b5b00235a30cc83c900d7002719099725d83f869fb06a61a600,196f1e5165c12b17705c76779f9fc7dff0a24e03e99f0804a18c68e7ccdd61f13b2d5458c1a2a568caeb2bc313be0a54c9534a3575be564b2f40e7bbd4286f4900,505d33aeb82ab7913e06c2775b097cb0deb906b59f87b80584d6cc3f296a39975e7e1e83605b763c46492a9f54303adf57bc3efdb08edb3f6e35e0c8ab81b51201,8aed5cfa54b1a70e0a9b8e847cc1ada46e2e2929c3378ebc94bd8aa6481c72552c35322eae4c16e6cf869f4b03ce242c3a08502dafedf868e62599f8121e5c9a01,cc3011957fb18b57fe38bb752708b0232c70b46b8010d7b0b7a32f2a508e41f13dabff9a5fd79484919369b1a9fca3256f766789526fff0c897ba5095d06567a00 +9291b3b67eb35720a86e6a65740f7435f050b0c6556bb22a211fcd287f330e295efd199727fb848044859965899bda78818c5e80a709e661b0b7ab8eec,64656d81944c63cf996d17526a3b93f3ee65c8fe59b6bd7e443ee1e40a172b54,c19bbf946b8efa5a09bd709d78168ebbf1f82481c8c01bd02fd3c6f2034749ff796abcefb41c22756d71c6ee3a6cbab78922286137f71a0bf066f8f5b1a0ade400,f094abc06295498a7bec4d2344aa211bdd9d03febd27eb0b31c502793afb94a74ffadf295e99b052052dca3b0dd716b5ab1cb3d2438de436b20aafd03f006add00,5428f84790622f997bd6eb76a9a945682b633f8f114634b729dc4f31124c1d54615b180373bef1788fea37f48e9fe0b9a693940b5bd828b1bf838ddd9f902ff601,1c1f99fd2b21704c6e2207b72e0e5fb85e027c3f6b2b308eba18736040ed7c8e73872050c00df2e09304476ec7798b5011f2fef27fbc933970d0fec036c66d4c01,f62ee511991292d5a188291f7d9fe1c03ae5a9722421b3b56d70f8a77e9e8a6550d3d14e74854679063fb808341f394891f8b1955fe0bf0889e82b9454679deb00 +a24ea99763df1afca9c1291f2e3e10ad130478225e064d3c8accece6645fa7579350c6ec65ca2218ad69c6bd83ccb7155e237dd97c1271612d0e94fe83,dbc0eae22c05d04bdb481305d822118bebb92706ad8a65fbdc585d3df4d16528,f9f224c93a5b988f8ca501a144854c2c2c77cef70f8971fde174f116090156ce319994652c133fd991732ac030e4bc9959d42002564ad66ea176a9fdcb08c1f600,dfb24fa3d374856d2dc8db9ae8127404d25cdf71c3298652acc35a9228eb051453a9d2f2335ed638596f9dfc27d80665658f88f66785bec821bf525603c46cba00,4e80384c5b142e3eaf0190819f50bd6aa1d82b101e39faf7e91a47b1e5f91df023891ad6c2b4841426960d03caa3eee1a5f809cc5df09d0055da4ac168ca11e400,2417be2cb823e923a5270a7647f137e17b76dbeaeee54e264dac5c58028554072725fb9423e8d3d48cc48f7dbd831ba219a59a9a89d3fbded5c0897235a6a74100,c9e06df43a2ccd066485535f31ad11d9d322365fd451c4dec0911be72feb5d9672be960ab24374088c848ed8d914b93541c61c69c1e9233f1b954693940e88ca00 +dd33c5473be301414c2d96bb5edd1cd4cbb8dc307c8b7b10e2857ab8febaa0e90a757a3feb8d352568b0b0ab77d60fe4259de720883a0cfa3f71ca021d,19a4d58ff661a8f33d8094d011684623aa13af45f15cbf2e29ac8ef7597b1619,5b83959e97506b783322c9cd314fdcf819fd7a764c7d6171db9b4f27ebf5706a07e907259a9eab44b08a8d756e660c4dc8b4e11de4e7f95654c6fb080463a9e901,2b4eec9ef2b03ad37a14d793c7b42f77ac981d634a2b70b81858fd774ceeb987103bf19a608aa9d10575b65e57800add85c3264d12cc8b5e3c7c22c92044eeb101,c8f58bf59dfdae225fba3300a18669c05cf5c23620b9dc772f5b66ec69a90b914c65c77e75f59d82628e834c33752393f92a46d5a8b4ffcb363db8cca19b3a9e00,18ee219b79ba0c0048cd150c2acf6256d8aee298c258dff7ee65977f2f96375a11b1ba02d89be262b53ecf5c1159b10adc4a9e9ddb3a1bcf4a967d3771d8ce8b00,e49a8acf807f0009421462446314b6736996710d2600269c45c1ab413dc9a2df57ede76bbc66a2c481ca2913cca6dfeb0fee5c4a29938ef83e649dbfeed9bf2600 +9fbb82ddd8c1927f8578c99e91b54d74ab65369a04cf16279d867db199bcaf52c045bb61c2f1a19ea1f79f386975d3d69760e4da9e4e40fb3fa484f83d,ddd05923f264d06cdaa249120d03c03f018fe7e7c847f546744724d7070d0204,5ca2b11c53e3ce6109e5fc4169d9bc3246331e20b57beee64eafe0dc115f55394d93d4aca82eb9f22bca171ccbb8e8b9eb438b484bbd28bbdea36cad2e9b9a5601,b904fc9999b22007019c4c811563fbe8804feca9fe7398b3f222015084b2e31153655c51bb0dd07217d8cda1cad89cebfcb44ab7b8fe797a7c18c5e58113792501,5c707e8b829707cf3746c42255d9f8e2a5a919f82f4d5365f0f446206914033f401dbe1de2831bb556cdb4a387dae54b34e7e96d79124b62f1ac33a6fbb87bba01,baa2755f2eb200f51caad1ba001dcbc7d9757e95804935213f9e21a8c17dcce1394f00b8f24ab4ec69cd088bfc7e9c05f07650696492baf2c0e5e739a8a139c300,a40ac6623474e86d0b659471bd3e9a98da1d9b9d9b29cc6286469e6e3dc36e6a189dd5f0e915f107e790db3bb7ccc9879600decac2938a9060794cadcb39004900 +b30be1e49bd2fa36dc746c08253d31f213acae781fabd1eb6cca1e82d9f2aab8d0af52661be0978efc379d11da0eaaba2e710acfdd84b35216daa75343,f314d54bfa3cf431c61ec12c5687bdd5711d1f2126f357fc9ebc706a2156d409,b2c36c7cf013217cf734e0f7a76d7bbc517c81a02c5d435aad262e269804985760cc4a17f0e8dfa97112cec81ef5bbe950d577099cec03ab87d2d8af6c0317f301,8e4de00b0a5d9ccd02782209ec95b3bf2baf4beba134ae58c9987ba02e66b17c643fed5a2a05563807b90106424b5381a8c13ce45c66177eb292f1df002ae54b00,afd27bed9853b766d8a8597813cb6d0cb479eefa4475ade2542e732ca6c8c13c1c9688bf8c831de209e952b5c7277ba2d377c0e28b974e001e8c10ba0ff3782600,96fd1f770d428031c4dc249aa86d488239e1d50a0badbd05e08009ba04e59b624f382dc75fcde018f3dba956372bd65ad7f13f48d4d7a9f9e54fe5cd4d19592001,380939365dbba1f2c712fdbd5ad9e3a618ae109d56b5e4ecc7900788078e3f122bbb2cd11a4373f20868a5f35a52d760c7f996f19c32dbc53aa0acb306edce2600 +7982e36dab7ae7b39d9f98afbe8650cc53d25c5b9ff15a1080d86fb11a4db364d4bf565970154b4f44bb5c075cf5917cd89c89e4c72d224c6b0971a3f8,33ccb505d6cde566b2021ce2aa956073483eb1f715c03a516221d6a61f85cd11,b0dde90bd695aadb0b601d70d7be175c6116405cd0a15b42a82bd752e8a672a375053b7c79bc66f3a3f92e9147679d40f736a6c5823e726f1f162fa8e52ed3bc01,2604213cc93b847ad16f203222dd64bb57af345287d60a005ff28ef170180dac5c745605fadb40557c02c0b962ea9f6b58923012ca9439a96d00bbd8481eeef500,18c5f80cdd9d2e89defd8064065b592a84e9ca9626d80b0622cc52c57dcaf4a1469fc5fde924f50119546775caef8f4847d0766568997628f2d85918f2d0ae7201,1f5b01b37c272ed6bf2fa5ec0fcb16fb4ea1d41253e35bbb5e7598810860dcbc26717a827f5d0febb90b5284bd2f9a699a1e90fc04ccf6afde79036f299a45ee01,4d38b5f5fdc6ff191e7283af5e80ad7efd80edea2da7b3f5ea36540e1743d6da1ae1df544d26b8d1f2040c5a1658e79776de4c86fda3457cac991816fe23760901 +38c222c6b67addda7ef4f1889125c3a98ec381e8ff46d6c8cd98eb83e3771035a8774327d484db9202dc25f51fb99f8374d92989ef993a3c8c8baf542e,13ed9d28d8428ffcb47290501a2fe86410ac220dd268193a6c303191fe80fbe2,4d9c648a7b02d3fb45ad21fa35a1db7a2db2a30385f78994f599bacc12bffca342571cca34e44f4b854dcb577f2bffc4e093baab5361830a96d5b586bef563ac01,2ff96081f7f8b7f004e12f100e2f901f57419dc8b2a2a8899dbc7bf804e40e6330b4d6638f0cb3ee4eb0d0e0d2dfd8f8a62825d4f8e97c6ac38eb092beacc3a600,68e7b0ba21da8091f40827c64a65540922c295a86e5de7c871db63ff2de6776677b0e1f2870ab4e8746c79b904faeca0005041d2a989fc0346d342a204f6ea1c00,54f4b6317bdcb1bf078abc8866c18b6a5c02c6d2be1dd4357f8e489c7d6166aa1c834106f907efa8b79417b5f53f8178482269eb470b6a77fc1d1b7e02d72b4d00,047445c1292104136cfc83fd96b526ab0a67d680d2b259a029ed31288bf4d2265de707772d67e3b3dd1ffc5c12ef9e95ac7e72819f61e049dcda4ba5bf47da8f00 +1e1eade52780c60ccc301cad0e7d2206b5cbafa93024a3d83f8b5e782e19c431d5cf3541630a4d4973e4e176dd9f8a8b7788d77a43930ce563c7e50250,c473c5e1db9eeecf2b85b4116066f9fae3c5969158fe306a5f97dd7717240c40,d27d41bee623cdac800f32940558df1e5f9476a3f49316338a5bceb9835c38712ab73d288308d8585332151bd88ba3192d79f3b376f86f16b7f8cc8abeca398a01,959997ce9116e95ce732dd0bb76355edadd49cdcbbaa6ada8f3668fa24e783546aa9a90d109937bf773414f233b6e19e20302ebbb232ad2e1f11b3f1c7ab985a01,34a9eac7e3331623d1a3162d405575f3528b980425adffa22150e73cf1134c77519f67e22f65172eb06beb968bb641ad5f208c5a03255fb456baa307811444da01,df466e2b9c997019cbdf802fd81419da0cb498802d2ee47aa824243969c139210bd323f04ddc3d222ac4f2ba405d0a7472ea607625271eb9ee8a03a764eff2f001,ead11b3b48d58329885f1b34ef751bcd2b3c8d6e2a14d536a0f810eaa1137f7d36f9587a5b080fc5e85d7947de1fd0d7b08e284d675419c78fec2c084f6efb9f01 +da993ec7b4ec83de5fa66f8d8a229aebf24c1ba18fd0acd383abe9d1efd5164829a90226f4bc999b0a813d8bd02e1cb7636a262a46554cc3d1dce9da38b7,c772341c0f65521d15adb58649a91d06febb812336e6b53eeff769a5e64d78ac,5727a1e01daad0650bc39c66e0c17e85e8ac8fa8afc4f795e8e896cffc6d185f14dc386a413485f6c95d6c5e3c9e1ae2910feaf248d11b3dfe311f3419f99a9601,a3c3c2822156e3245edb9ce7b68f544e1ee5976428f9435f47223d7e86deb1455a868925210c39a9de1b19e460d200bd43d9c1074fef1ac6596ff171e1fe2e4600,4acc6cc2351d2ac53eb8bfe3e9739c568e8abfb22f8bec9bdac80271004dc7ab7e96c48d7011c29fc16615c7db642d7c3964f136d79c8b00bc0b686de24d89ac01,8e091b1e2f625347a2804381b4773f60ef73b419bddf2199bcf3060b45272b266b4d38ae5aa15f4f0ccafd8741006615afabb10b63bad2a91384dbf0f0106ead01,8a92162036589a9d598c2876c98609146732a29e60383ceb0db2e1841b1fe88f30dc34b2fff1923bffd74fd5ff9ae0873d72ddc8f3b823ad4a08d709ee491cba01 +9b517b265b6c00883a72c4e46e5b1b6e36a07b2090acf3af6f35f20d1210b2a341e6ba9f9c205c51d8f09d343161558bc186521e2345e562dfac76506ee9,92d5f51da6fa20529257be99f84194e6f9300d4aa0b2b393fc49901807233fb2,56d714d39348f947ca1223f6dc520a2b2b6e87382a6afe037d6ad7c9b6471ddd31098081326ad61552401f9cc7390e1ffbba83acc8a40fba9c9092838ca07be201,b1e01116bdff791842af8000dc375c0c2121fcc0182ac7e4450c28cfc95b9e6d5b702f6e3bdadbf1762cc351bbaaf75ab30a207460eda8ccec8a7de406d281ef01,76e250db10ce198575679b7190c570567cd534d80f2bad75f25e60aaafcdf78558e0df368ad22e9056fef26b053f4a101f151c436ebf211a532bb472d401ffe300,c6d7e9a09ea3e49b5705bcdbcbb11b9ee43c5b4b1d0c1ae0fc24dd396f27ccdb038de6c36a3723e5eb63fcf6d64b30f17d1c25296d315c65cbc943e36e0cfc4300,7d0b569e1c934b5d4df15fce526f961ee15932d3d54bd3d18a899d9024eee9ca3b4ede489d81240c7fb8089705437d8cea069f109e2566041383400c433f4f6100 +2cfd03f98f6639a54bb902913cded560185edfe6466faa63f94c635331d2e1febb9a471f016f2280aa9994318393fa35ba8799c024b1f64abdec2600a6fa,02ebe095652d715958893920bd23404ba49d87055210ae5fdbe60e4989fda9d2,99e57b7ba32103388ef8b60d76d2c9e2aecd49d128dc8a33add3fbde18052b5541f2846d5254e47083a508ac182f963632899654d3ac005438807001a11cc7ef00,d478f3dd6fd7858cc2fc00d3584e5e748f1f0083fc5c994b248c774d224336494344025fc6e536004a20ffab84684f52250c813d65b4f252589c8be0016636fa00,4a1dc86faf02bd116079528a6cb5ad133de60de0c85ed7280bb75223bc49472e73271f20ccec5f327acabb1fb251a7f298d0ed539475df6eeb9bbf9dcabfb8d100,738f5a836f53c2dee1d15c42bca8cbd18535eb4677f510a576a534d989b7206d5a903f5bea62c53d1d5c2b3288c9ab322638cbd9358f81fe46877bc25c46aa7201,23cffb99bfc4bc2cee451fc940b666a6327ab9be0e85ded658c6db0edfdab0a640ff230b5ee5784f99720276788c784e5bab830566b46ace82e62b10f316617800 +4b4b0f4e74328601621cd24509376c576480c842fe196cc4388fb147f3113f8dcf05aa6d5c426f29e992055868578201f8d87f03a2f9daadfcdf596964fd,cc2fc3cbad32d4fab585df66076525f521288ea5bc77fe01ed195cef33dd9cca,b165f7ce3719b611f08a9f4d039234a05e82c518247f8990d9548bdf86ce4898056dce1104c2c0a9459374b3621d1619f21a525dd050e3be0d129ee0e0a95db301,1df2e96012e5dab326d81e694be4c5e174dcbc52f275458af6c9d86302244a4f7510a7b4a1bab1c5cea407f782b4f4282108c57671e6533da51a617a0bd2107501,380fda20f32360f91cb943e823205fc451ce0a133f60d460351032e12f464ca165e0948d022e50d9767d6138f904440bee789967149ab702ca7393f5e82dd60b00,696436d32d444c4feeb13d3f7c363554a417789d79cd2c6f374c72b736cf0a721da3c4d6e78e46b33ef55ded061f48d86b18043038c29e6bc5309647f314ca7e00,84bf01ba95c8fde52d637d82ffca0cd632508f5cbc83a8147629cfbc83d39f5f25dcb1c8030468a747a456dac3d05e2f83d7b630ed85a1694025deb513f63b1901 +7c40141a15eecb1eecaa16c55aaf1bf7950d3c6b0ccbd2671728f4d5a299384dbdf8379ae0f47d1c400178c93e4f4b154b4e2fcac6be34a1908b3e025ee6,fb7351c65254ee7ff1e99c23e4bb7eb0ceae4e987e168591119ab994603e7812,14f03157c7de149053dcae40d773dcd6f3c40417c67c2cfea3ceb74321de1c5d2c07b4f1633435c947cfc06abb1f5d19e303d692b97a880d4228e183fea3e5d601,c7a91bd43c8c3bbf023ad9fb3cf4dc573304cb517ed3a2cb3378814b6a8834603efbda389985a49cb63d263d58b1d5d349a133adc4fb7697e51ce176258bc03001,e9b3db4ab476ff32ab032f3061171e39bfa849241d16cc1699778f4ac055c558671971c2ec5cb233abea673a9ac6d7f09ce845c7eb12244de85ddc9eddbbc32100,f4fe147ce9bbcb6fe2546432ec7c5786cade787cfb41b8f15729ea2fa9828442725ee6274683ddfc2137da425600180a3031d3441ba0131abe9185c99f01f13201,74884a0d4a14691a1b175706eb351b99fe976090274031fcf28803f1294829c82d53ab2e382ff84e9aecacfc62a470d0ae3b38fd6dce0d1ba12042820d4f553701 +e9278842455b39a819dcebbb61d17e91d054bbeace527c3ae406e85949eb4c4d5fe65be5675ecf4eb281bdb68a72697a8d9be56409696e06f671ec23f349,7e219aea3f9088b68255a1fa81301898434d1eaddf432a27b8a3e3e88c4af61c,6e3a0877e1214cd97988019fc1ba489e3568fdb7f0581f85445aa4f37c67a7281e025ec495b33fe4cc81f83b372aa576808af6106257e3d84edde34a3f9476ee01,0593ce2c0f417a1f363a30f56919000b14d89c2bc9bd78725ba0f793b1ae273f02eefe26d63407d4387145c8b0288586fa0324250abb7c4411ac99f6b512ea5701,337ea33e4ef38e2a61ef3b2867fc63d758c1eb02b435b0879eddef1b8a79cb7a189d06e208f6e7a5b31203e79b8da6dbcce7da504d6aad23a9d91cf75a70390e01,e28453af8ef3fbbd1286d6785e5c2155a231e9c337a4f4d3afdec40ecff1bdcd72ab88d730f8278efb4f089afa95bd00306f59d7411a923920fd7932b1e0d74d00,e2c21e4877a811be4a62ebee9d9f267f0f2139a63cf6dbe07d8b6c5a887b46995c486bedfb9568c875e4298f7dc9aad7f0e6e46ca52cdf9f24ff637ab087fb0701 +af4cd0dc26d2ce94352584d4d6ed7e429422d66fb828458879bc0dd703c128c87d232a08c70dba2ab4342c31ea13cc6bf0e6da50062d9e00310ad9a10387,2439ad79e71c8ebec0644bbf34f9e0780395c7f1bad68421be746956f7ecb9ee,4ac74a2cfcf315f3453fc8e01f38102ea2736bca61ed236ae737f72d7a75827c075353257bc836ef14f1822d2882b4b3d6599e4f2e8999b9bce83758ca448e4400,33a5db2857844850b8e4d002ae4711d39cf9fde5b1ae6bfae14f173f648e36d271da524e023461f8dcdff599ddb1c2a9aff4bf02ba7e3c3064843e2a516638b500,34966f92dd8f452da502264d51cfc6116bff7dbdff52c4db0698f469b5c35cf2143650f8b461b9f9a9cbef23b6db45f44b2fa1cdd0fbecf5a335892c9010ed2401,3810c360b70285ffdff5337645cf7a45061736d829a4381ff1f3fda4fe94c2982ed471f5365f23630e59042bac5e53b3cad54532e6281036184eff2d245db35000,6e28ebc064d5c8decea66acb91f6fca1acb34ab289af540c708061e402a8c9d17b859afc2e0621becc3f3b46c587a529ecf096c0a67920e5f588c335a1a3acc100 +4efb19a69b65b5b371ab9a2ddbd9367d3647911c2ec5cedae375630ce8df8cbee66b1c45f77e995f72ebc9c585171107bdad682da5b69fbff12e579c55dc,461de8126f498fd3bfcdad25226542e2c818c7c537fd9a0cdd186a96a6b57423,e5c1617f3007452261fc9d2488bcaaccf8df6aed147f1e5dcb95f10fcfb35e3a62d9bc52ab49e655661013bb37b7a04497f88720650c1e4248a893fc1aafe9fa00,3f943cc8ad21226d0394d41fc81cf4ef20d633b653645e02a2816cbc2419431419853f8bce7d451fdc1dd04a697cbce6af5bee534575be42136ee7b2e1fe80a901,5bfb867b19a16dc2f98354248e4bbf189ee5d53f4972f7dd9bcbf029652ea22c59be33323876c2c86b666ee4844d351ce82e7ebabd87634199e03d0272aa3cc000,0baf180e840fb037bae8c8666fcc5d471cedf2b7f2ebe00a6bac1196278130da146a0b148e33e792e1c77dd6879f86be12467ca5650717fa39ac6363f3cc59de01,bc73738f224f9a882bc3c7cf11706d5e0d1f659ec7269f7ce0d5cf1cb09628d97bc72fe69f90713cb9cf89008a17fc51e1dd8240cc1e077006d4e9be0772ee8101 +afd76fca79c80ab28b898811a3eff9081d3e32bedd6fc04d61be5e4116f8ed119fddfb848f3b7df3a5c59a4986674ef1942c35997e67547946173784893e,ccc614139e0ab3214f99c446b7b444e3ab547acfe66643f6083f8048efa73452,844d451a929c7522a1662e237fa48755f50a384749577acb59d00b939ab2dc90057a078bf51e159149ad0efdfb01838a11b329ff3017e562e20d7a9436247bac01,624c82df60d55aa226ef1d054c914b3325d16946693d7cc2206091393b7e61e05406b230878b43d1cb9dad8ffe645fe65939c7fe8dd38ec02eed7199ab2796f001,9a5ed850fc5d594244a857bc554aa025eac909c8215f8fee8e67812d33e6b3964eadbd1f7532df4ebcc0e89d47288c0b2e19f3b94ac20376c8785ae3fd33880400,4983837c986d41f3ba2deca664520add0e894b6eac8602dcb311047172e98c2841d075257d4c8244047e8081cd3d28d5d0dd0706df80912bebcf92a87c11819a01,2d8108d627e8bb11b0df972082acdac53652919a3e32ffd0e6c32a27f49ed1666e833d09a1b1a14f4df786c3c46d05c7421eb6c211feec07c117604c2af569bb01 +76937c96cddda69875137299bfe0c0ff3781c063ca4357c30924ef0586272c65782c6f40d81eb04ef60acfc6f5d9d0622dc294645baec7a3fe7b28aa976e,fae747d9b9ef79837a4b300db581686b24079d33318b14efd056ca871bcc1ef9,f62f7a4cc4634396fada745b5221c15224b55f2fa04c1953ad9b2ded24019beb7bf03c72a2869d65eba2edd1d38b4c01f442f4a51b0ed6ccfe84d4340e1a148001,f79492d31433b6837760e25101c706b4508b9e5f4fe615f0db0800ab261382560826bf71d8343918502127c63b38ab6a290f2ec4cd0b55d99184ebb10da6fd1e01,d44eb64de05ab5487d4858ba71cfdbb2d3caa1af5f7fd2916fbd3b074af34e015ed490df94710fa082dbe7fff721d902fec5cf86b243aa176c6fb2351b30888e01,7e9dcd7c44f27dd83359099fb8b812344028481c0ae31bd92f378a81d4f22cbc3754505363afaf02cc209838afa862104c8c5009fdfcc247248ad17a54a8669b00,3961f5d653ca99c70ac24b738664e085cc9ee52d599a8b43c28e25d5598dcaeb7ada69e39e4cfb0cf5c350360ecb655c37b4133e74a5e45b643de30007df188c01 +57716c30af362529738f73862af9220bba64c9af3f3ef0c1f8670e1d1ffe8734f49cf93bc64103b10d675921b56fd03b01fb478fa6fbc5c68260248da01261,7173d0bc1ed307e29cee4262c643d48b3be30b36fdac88ed9b84e6cddceaac9c,55584200f11d7967c04dfeaae3f32c25fc116b8703b996a24c84c07e20ca3119593975ae70a07611c63492d3d6f1736543933f843aab16fd63e950d01a53e8c600,453c0a042045150f37298a84a29723b80a89a23de20ab9668516cdc16fada7ba319974d839b64bc55581b89e410e2dab298048fccf85d387ca83224fb9bc83ab01,b4f436044baa96b61fc65b8852b65ac7187aa3c9dbf09afd72d0540c986d788c46d2eee70fa8e20188d58d279f7c8bfa8cd6803409eb7bd3abc52021811a4de201,b1f8f8a0fd302a5e91222590ef6b56bf915c3ffe7a0bc3fe325fdc60e1e2ba4c7d2088ffb4c70eb9d4de50f7a0456d3b4c01ee4968c68c01450c128b6cacc42d00,417698f8efe8a8aca56de0fff124c8bae3f3ac38e6a8090ed3fd2e60e0f0cc3d0d18db39d5ebf7d6330ef76e4ed7c5c164efa36db43d851706ad6e7096cbe52900 +ba04fccb9f3bcb91d45a3a6a64bd04b0066663363584a9fca3b24b1fc498441fbcbde292019960948910131292362314a635c662a7500c399267fed2e170a2,4995704ddbe869e59fb625994d1f960be2e63f8ad451e4ebc264a617feb82900,487e9add8301582a86d4be99e6b477f660031f2495ddbe50a27e2134acc346375b9d59b9df971811edd89e7a9434b74d26fc440da7f70427eea7b20fd1e066af01,61a29400b5e250ddcf8f6be26d7e042743db7a1edf3bf7a55c840af06cb01b763f118bc1b8e0cece317603b7eb424b534ec0757771a5c15d6da243853abf773f00,b85f4cb92046166c0a2c3dd2188628f91b5ed655c597e667ebd7f3fb9c1535d3599e1536c30d7735af28bff2d4536c6714b23882d54fc02bd8f518936149e63e00,11aae76a727519bb56a67892781a8e693b07ce802d2d256ec6daeec9897c0722112916d04a2a84669e4ae2a8de7092d0a88ec60f496e8b773c4b165a8bf5b5a600,5908b95112d8f66a35fa0b4a3362ee5771415eae48090c3dc46910bf50a69be71095d3f8db0de44827dce02012fee14676727317f9b961cabaa412f524f1e75e01 +5ced3dfc0c71d1c659aa2dbaa45089ce6609a384a2ced7d6e12694bbf4b5a32582d771e793fe7511c260f415a99961d056bd5b59c3c7d76f7485a3f7fb4c33,eea17cdcd3f77c29e953168a75cb9f3dfa6231f7610f2350c1da381f8326964e,32b1449109c83ba5333014eaba0b04f66a17c91fd92c2418c586eb576955611905158b2943c2379c33461fcd9a643f7ee794f27c524a0f6dfaa9edcf7403ffa600,c2104e80eede1f1015ee2c8802470cffa2077dbdddadde96c04bee446fd9a0892b4410a80a634cf039ccd3f7dd48107f29935d16321166ddc49b313e1b5dbcc100,5544a03a859279806056e7dfc7f0256d3a66ad0012f51ac90e1ac986d51a32d9732fd9515ea3ba31a4ca6a51b0bd2a7da85692f307ff7324a833adaed8d9ccbf01,4916894e931a46b8a3f97eac237233240edff546d171a036c2319e9cb9fad8327b9dfbf57d965bcfa557780dd591d7990b3d45dccd75d07af1b5c2d3ac2da45900,005a8a0aa8f8c05025b23913f61cf488fb45edcdbd0c5b979b0ddbaa42f55ae166e1f530699f42c8abf431ad1998620358fd198ae64d5f93911c3544e381e8c700 +a9e5c2013e89a23de2948ccee73032a60cd5631179a8f5b9ec6622caca7ec68c2dd8f5022c5147e269f4c6fa67a654070b9ccf81322abc1871d7ad2eb3fc35,f5e53dbf4ce93a46b7f9846345bdfe936034c27e2902b09a87e60f7eba8bd7a0,427edd6536f081e4cd8fe6a33215d47165834909e46e8e6916fe1ff6943aa36f4fc7381b1531b47aac0d7e611e23153bd96bd5238462f74ecd11035a8f8411dd00,2134e174a4ee418ca677dd0d2d599b8f84c2f425210767d786d12b06e0285cef4ac0281fb82796e6e328a3a09a53692fa4711dbcc0c823d764ee725c319c550401,8e3add720705c029c40a1c6424c90e04d7cde72a5dac8bebf35179204c80f03d5324594d4e98bb7e039e8840a523339d0278579e45d71e3cbc0cfef43cb8a4e101,bf48c8b0b5b32f91f782585b5b3dd183580cbb33edc56e2988cc593a81d313b251fa48073240e13c023126089b35741247ddbe267cda6670286beef94c2a985d01,ab3e87ce862532f813bc99dc9624d8a6eeb275bae4f7502b83d127fd7e552e015129eca27690f9e7bdceeefb3b640a1c2ac6fc0e243eb366a6cd594b578dba0d01 +66dab6cef2fc56d5b3b66fce989ff1826986534b35dd0f3ea129909b494affe8d08d4cdfb02eb2d68e203f44b15f6b8548f79419b9b63d6579a4287f7eac8d,19b013047dfc03f85bad7d533915f538c94d024acac4444cf6b989bfb9551b2b,7c607906be9d49b75da68a62b47a600aba96d15a9a4ca75f67b4888c4f323b0b537835d25b3206f96d12fe38879b8129f03da95d8b705267ad0a60859a59ad9a00,2b8d92d6864491879a5cf7a8afb357f206927deb260e6b8f1b21c7bf1acb9cf23f055ee8b3628c2c220b8e03d61ed356199f8eaf4cad760a3e59c65a13ecf80c00,2da3614b251887a44966eaf73fae263e41f55547d1a699b5c61a62a9282eb13042b0d8dc717fea70135f52fbe573912a51274c8a1e58f1a956419e2024ec134401,2aeeceff6aec26788f1a946714a764249b11f71e51822b8fe1e4257780e58fa76c992bfe2eca25e99a5da395eefeab3093fb03a34170d069ada770c38fa4772b01,121c94354cbac28e1e2ca4b4936edebbe38b4e64f182bff967e1347583ce6a5d56f264ee6aa1ad7057be42481afed605144a11cb770908f1a0f408a4a87c097601 +d96812e220b4fe48613c285281b8fae0d49fc94d471cd11be30126332116c853a933890687f15d08ae8cecb88256c661a7b55551a16725d333d616067ac7e7,154eaa169c8a8871c355aad75b16224ac34ae400c7fb9e72d28ac24f6bf0582f,36dd7198a772079ab5ab3e19d0ee71d9ad3fe123a9323f068d342c32868ca4a85569a2f26e9555672c09f060caa74ca0083ff5cb6dec6c515a69c81edaeeca8000,7fd40d22d851b74709965c5179c5b7cd607e4b88efebd0eabbe4587c0519bea530f73ab7e9346d7770784b21b0ac71e995be8076ca1ee4e3268ab84fb568d71101,f6c08f812e0ddb898f512a339c1fdc95dff20a879becccc7062a97cab91c812204e9c7b2a2bfc7a20019dd65a66f88c6f9a01d07b39b06ba886f134b50b8e52001,63bd7497707ad06278418beed746d434f02bf13a87d53846d81996e1fcf692f4317fbe2804b44fe8034a21ff13675ff573c305d18e419b97c722af7c4c86627e00,846083a1fabe08aa308c0bd7ac9e516aced18611dc20967cab9aae147a6895652ba7af37355b34de45054b59fd60e8ff6c9955bb02c30bb0c8e6932943e8c4de01 +29cc0fce0f8e0ac000c6ffec20ac2f0be5e56d6c8a2d4a7dd90b774ad392e6ad8d773e26686db05c197261315ff55416f6f9a14bc624cb0b9b48f1b3da912e,0a46735b5868c4ea44e5fbeb894507931fbe6869ef178337fca3abf2ed70f45d,493c510fa6323ae44111385889c1646f6ed4a62861a4a432bc9efd2b29c1c0e4744ec0e7fb76e4e173814875a5b2a8fae49dba12d244808c6337bdd150ab0d1d01,30354af95ce17ec1158591f8a1e95d5971e2f130640dc923e886dc9c6a8babfc552f66aad41c5c52c1e8b308d8e9075184a6191fbd0a5b352d14d963eeda408200,372f22e62491006285125300c4f362e7455f2ca80a61bb8c1961b1c78bc0b2b027d7281ff992a421a3ecb9286b4150a9daec713ffbaa13ff0ea03f3198294dc601,b1a6fbec45c18309bccc81693ebd012ee4460203b24457db3fdb713410b4051d2d96848ea7adaa495869967371ca90ec29cabb78a2f107e97cf85d7d7e9b0f0901,d961b70d3150f475d2b3509339d336804ebf9b84a61ab9beac22f64a792a62d10aa5cbd96d44c621ae457270592be4740e4cb778b61f62829413a1bd9ecb6c8f00 +9e1207fed4dad3fb711981ef88cbd463450d0d3052979b3c221b87347f693165b81c1b5d3c82c02fdb2423ddcc42ab08ff21c2c11ead404c782f23c5f81aea,d4eb7eb68455ff320104510e11b32ad37ee061667dee4b56f555a54c42cda043,149a7c9fa3954e60f29aef06268df6ee75993ed58b9e5a052dba2aa844714f5b29e2e03a732110ffd7648351ddc62fa88cfae637cd044c43b85ee9d98f54f01901,fbbc26ef9fbc0f8ec5619ede6014bf4b3ac7bc3d8a6ceb97baa42bdcc88d47d326e6340b0c57ac9e91f9bcb2c43cf323713a2593918cd22f52d45187f4d030cf00,e717bf69858f11ff84a04b108a70547e11636cc81590ae64d8bad8b61260166b190e935378c64fb7435b6feff789c50dbeb4babefa1e97c2ccd2b0c01da02a7500,32294126eead8c72eea03e50bf612813a0270fba85630e94a200093b549602bf6214961be81de1e695fa067526ca8f01d2bd9dae945e146e78b5cc00715b9cad00,46ee034f30cb37c75c6c3e8737a798c6193436ac59fd93d651531d1f1efcdc1634e9e757e5d30a2f776428e3a94b4393b0e5774a7df64e15cc517810c2fdc53500 +005052c913ce31ec3a7e6be90fc65b3b9fa8affa51ba02c575ed5d75a4607dbb8176ad61fe072d3565fe4d60ca9dd9ea2b7b62f2c6798e80ae9b6d957e43ce,6630c7910070ded151001885701ce9fae0672eb81a7f0de71a319f13cf210d61,07e5170dd73b60c3941c7ff8330133cd8650975adedf59776147a9f22bf5c48d0c4d14d1365a1e84e770740b3f90c9c7240736c506943cd58ecfe282753bfcef00,257b9e6b81464862f76b9cbb0a3659c9c3adcaf69ce7405559a453d41795b5e3400d1b755af88caaf8527853503697db43e28470313e85629b6ec2aa6efde65a00,58b38b86b361cb52458ca5966c7df9b60341d9cbbb88b3ae69d2d6419d98b129198e47dc08851a7bd6d8f3a47309971069b27c69c04d784b0b63dddc8cf8bbc801,0f7ad0b5090a9849f5a34446456f6a4c4b480a56e2766ffe5f7f0a8b3b8d44b009e56d73fb56c0c3285ddc5d87f9b64dbd0a16e6961fcb3ef60e39812cb5c59a00,9841992a13f9ee952a084dd8d5c4fb275603359dd5a9529ad1948837305d9842278ec697fc6fff704d589cb713c7ce1dfb50186364019e424fc41048332ecbc400 +69643320c46957525c2d25154540f56f725924aa9b9a39dcfd9d034f407401d376dbed84665ec6401e978767dac5eea8991838e9f0f6f9096db200a0b352ac,c128c3faaed4d31fe06007431cf9c814089b97cfc48c3161296f9385ab26ccea,d52f912cfc2772316fcb06bcb11c2ede97858f31ff0e7e9dc7ea14356d5b2c00263520df26b86d0c3b9bea2eb807c5ad224a8216b54e18ac8ef92f2359fda33800,117c84b6b02a64bf35316bc73403a06693f3a009d894eb6c4078e34a19a7ae9c092a80903864e37bdb8d7b6e4eee1c9af27aed01918dabf4e3593f44d3cc698f01,728ec44c5b23bd6af6edcadd112e1d68452c506939d9cbf3065852d0bc85327e11ee7404f95d84d3cb3de8bff279d8c0ea3f26d5dc4c66fd3a8fe08c5623573501,416c39404269d7e9eae0897d2ace8e7942f5bdf37da285783fc489f7e00d9c130109469a606f580131cd897c07582474e764eda7469296551722a715b8a1754e01,731cc87a62bdecdf266ede3b89cb02f6ca20b68def87c5097837f479f4164c8a503d3038d96ddc9e05b01c2490a0f6c4e4157f37149275db0e67a17f751d69a301 +8014d68213564d95cf77ff0f7497ec99b3d4fa99a8bad0e91033aced2d0d4fe9166c1900ba7fe56e02822268e71fbd7259047744d572cff19fb66495a4ae6f07,3e9be197e48350f07f34293d83cf9e0455b5fc5bb5afb6b503e27368d06eb52d,56350a084472f7bba8cf52f29400011f38e5f0cc3d64ffacef089e9126a8ace5326faca4c1531d20f60468d7a7ec65e4bb33bc74724a68da0c60c3cb32c80a3e01,63b3823e6a1b1a91ecdba28605d99eaaa6d8d0f4315fdeb5d3588adc54607c77173f47cb6712ffe315e0f29c7b89713e1441f1659123b3f188a737805c09a1e800,90da923525f1e83787437ee0d296907c71a6b777015bbc0251b26546fae254c624e27fc5ee89a73e2e8c032566d6e3313116fd621e9473d746e9efeb0fedf7de00,a3dcd5e7290c4d96ffa090c948282279b81c6b3d46551eba28a786c08afd717f1cda1944f08eb2a906636fa6cc06249b9db32cfaf1b570c3192423aeb789195200,54f0e284196d6e51d6e3c3c240f024335bfbe6f22e77583d506483c89b0b311b1824c5c00bc529f47a4d908bcc017b4b3c26a79a1949512eebf853397c1c671801 +2f08e254d9b73343a144612befbf449a79a96824465179af7ab3d82da988f7b3d99e5799dd0c9565216c74415c3e2059d2617a2097cd113f398b367be09671ce,6d95e242ef62db4f9672a7da549e78f8d8016bd4b6d3f9f3ebfc97e644d3b80b,25596fe90127cc7f57c792a39e08d5e3b27c78bb1f253b12e2f7deb8b0a0790e535582287fc3e9a2793a473d4fc501def87a25da7838d922874b219abcb6130e00,656241691b14acce92ea57ed0c06086f9b5c12a26d58719766d36d8df4ca23296977a1428cce4da63a288a13e5eda9be091ff4e60306f36dd829434344149dc901,215e3b2e8a7b57fd05173eeb21e1d14c8d5aebd6c102199134afeb143b0d53ed57ec3bd1821a35972f6d789e5011ca70b1a5ace88585b492d029452a8b17890801,cb5f88a74edeb1aae4ed4eba3ab615a0abe65062e1ddea84eebae1cb896cfa477c3277e82720c7f5cb105b4a1822f8026712eb48ee8d64b673faca693584103801,65de2fec7b5fb92b90e4635df19d330f73f38159de1ccc97c3e9199fca0d3b1674a1d0adfbe5908c0e7c595685edc9def209f810b9b03f65f273960357d521c600 +0981b008602bd392a129ccb50a1e2fdaeb11bd3f95959585af3ccf76de9cd9c664330ee7888cc801bcd514ca96df291fe5526782fc448aa8cbf3563241254726,69ad74efadeda992d83695f60ac65537ce7084fddbb3197969b1133c87670818,02205ff782dd42b118c98bd5c2c66c64c779e195d2555081a1f05387163bb2236dc6af6166503fbe1e47e83868d44b839f91ea10cb2f5527a3e24970b45f6fea01,0678dd6575629899d93e43a5d299d5aee14a9eb0e16293781ec0c5ef78c578e514c7c99823d0efd8d2a32492078294e339f4234270a8cca03702cde079eb48e801,f25c2f49df2498c6d8eb1edf8191b0d53ce3a8b1e83341515ad0991085f8936c7498858bb3932b49c701f3c647e11641dbc7169cc614c6f2d5410dd69a36d14101,247e80ebb28999036304d819c92242588946d08307ed65c32387bf4f8d16758f7583a8937418bc232e8e9794d662d338bf9acd9e5b45969c8cb04b26143899a000,32c6556e87b4a71ba2c9067b249375e4de9f4adbbfc97bbca14bfce63f1e5a7a068f5a867b81b15362d0886ad5c3d37e70dd540c8948a62612d57c3678114a0501 +7ae4e8ea2eb72c0e0ad5c8b215270b2715d7b3180714776b5b755d70631504f8b9853d8dc4e96b6210e8287925784f9ef238b5475af5ec2994f85168c4b67875,d7881dc1c6aa413c7010c812356fa3d534d3678182db9db0ff898dd7b3ac9295,a46c2743abcf23f2891bbcdfa86d825bfb12782522568e2b06f956b6f3b223493c86f180793be0e8c5d50a78b3b3d39eecaa58fc741a95b2dd22e8de4736ca2c00,0d91fbc21a48f692dc59c9494a48973ec915727ec8648e3766a5853d0a8ab8c810aa370d3c78274d3a2505ae371cf99ae535f6ce5bcbfc79ab35f226614192ac00,ac741781d109c1b281c739b43a90dc139585eb568c469f858dd5143b71854a9420493de3234aa6c20a886f8344066d242d0fbef54440ba8c05debdaeb3983a6200,f94075a760f2eb9c2f76c4258489ecf823eef8ff36830c706307f85df2cf3fdd1e37d21ef5656685e8645e49f2ce1341b43a6292104366e6bbe8f55af339bd3d01,202e7275a307cb171d2084c8ae0dad035a8fa92e6fcd22446c039a865252d3f669e9ac22dfa08ff31a7fe8349296869aba0483fe064b0ba407ee84bd9cfdfab601 +1890bcd1ea365312ead7e986c4c806e8e3eca3dd5bec3cc41dac9c5b95e9370c7b7f701eda02670e7ca6d1bc5287603e789080f44c9bc505ddde407228bc22fe,f0a8c6bec5d230c0c1b298c53bca87abf8fca31dc68eac1e3a0aa77774404274,e97530433f2947cd91b9b02ab81837b3cdde5686f5dcce5bb6b087e222e48fb5297d62815fe9e1dc92c2ec6705717e78f102bb972c932d4d91df2faf04c8e7dd00,deaf7e84d2e8f3ac890d84bd1c5c7832a1647d38207ede741f6e4ea3b396cb01484112c2c8ead7cf0508e23cedfa8a8e4e8edd0dd96e5efb690cc2ce8d716c1101,683e6214c0cf6657b03c435fa3963b94fbde7145daed9dde968f47ef222bd4de684bc47575fcffbef03f2291440a6ac5066b73fd41bddcdce5d2ba161f34d8bd00,702092381959ce08b7fa51055cfd99dc010bbca977a1e566e600747b7f1aafe93dd10403cef1ffa247095132c820006e900af4114dd5ce69fbb865877c99a37700,4d5bd8167f3ccbf745c8703ef67a43b4c51250f6427b747045a86ffb3500402560bbaae7d1c20b65ca6ee7a76630abd223002c694d569c0132a9130dbe09294101 +2cb4930629d4cb9cb42fef5451526a30ff78f5182de42613be2027e6f4e3c2509fdf1856813a08ccc829a1d9df8f4df3076140ee9dbaea497a35a55ec7db78fa,e3b392d3d8e606fb7ac4c8ce63255d1ec0209d6542b89dff37ff89c0368da1e6,e5a9891a232333c3483943e044f9e4bf485e19518543ea4862dc735c8a5f2ca47e130aca73a7f848a8d3f5f7a40293261d0bf3f9daa514481c0f40e43612a4a400,712ec9dfe3a83a7e20f9fdd04d05cb21c7745cb868f6f6f1b264065fa9fac7a83d25976a731d2e3d7dcaa40a7cecf4e535be8b28a386b7898f345ef714974fbd01,6ab6fa0cfc4c4a8eedc6e817047950fb57960956d87c91457a1d163a55941a5b3c37ab7b8067854acb214adaa50159b7854663e9d4758969d8e39488fdb569ec00,375ff123dbaf7472bbf3873048c15a87384b519713ae4622e97135dd1196579c7765823e3affff9b855d5fa6981e93d1d66effc9b13ffb6aec4eb90579f93b2900,4d5ee5176de6627829d5745601195d8d1df9ae36a899ed7b720c4064de68565e76a2a18b55d02fd31af3c56a08610eb4f6f7699b522008f9ec8e11f5bedc8aec01 +e2e27b722beecad8dfec079e837dd47747cb84177988251e0644ef0e0ec74e3742a9d0f9296adb29b6681d5fb6429355c9c655f1eae2d50fd88d79f923371142,4d16b44f7f399629264bc731a5af4765a54d1187623a13c8646d02bb0e5d6cb6,4a3ecc8ae0af799a8ef7cb9d50ac9d07b0971d9d1215862fcd9fe31faa9b43c16ec17552e3df593887f93f1f3ae415a3ea5d43d9aac9b22382445524cdddf6d301,ba300478a49ff8dd7ac448b27680c5d22ab8ae98566979cffd55c8f145bb0bd34703ba9b9c8feee267ab70047cb466fe9cfa315d799617d8b15e1337b6f98efa01,c4a305569892dc4b6720ffd1ca508fac7120da9e35ff5dae8fff3f0d2951e19276e794b0ce70930f38aaecb6788392162d8abe747af55948d969fb90d5a5f91700,0c87ffcc173243e20d6a01ef130231e745d3477f3862acec56c560d5739c5c1f0c3f95a56da7a647233331e81b7cd4cf50316360e26bfbc2c7b70f7768ea6a0d00,1d806c34b145fd1d1a591298317da0576cf0fb9b63c0edfd95fe9160c9cbe3d517fb4c7c1f56c940268e2b1b0a62c54b550399b9d47513ef1a1d0bff124ae6fd01 +d81e6fb3db768822b77c7e90a0f309c7cc717799eac8c3adc0850d4cee407b3dd2f367f516bbd2e0cb1b8377dc680abf8d17b71001b2d24c3348359322d5eebb,fab19ac23b9d3c2c7f016fe6a5dc24948c2450b55523f54a41f1c3c746b8a00b,a51678f9fd5684a47446f9a935d117253ffb2aaa6186e299db25d7aee93a15a93c1c84b9e25e703727486ff8a6fba5d174af6689020d3ac0e70168183b65f06500,8d4c3f2f28f9be06956cf333ac68b6f29cb596a75355acb244265d26611245f14e0d89ca3b10785ac8a6fc77e1e7181426f7aa46ad3577a22fe374c3f96b2d7701,33e590a8313538f1f55f88443c7db4f1bd3df3691950d139346dddc4e912c40238a13fd594813d919ffa4a235e9bf45ede96d3be6cd99304d47e8a215801aec701,017208b7865b1bceb4fa2e51e1aa49b2b5b3be6907d9a7c145a83994527d027a0dbad432a910c0b231e3c9e224f08316f38e206d160d6504236a47adfb1cf49c00,f3de10e2ec8a1647393a4af0b3ca9da23e2006c316dbdcebd8c855639ecd858e1f3208322996af9d84fc956da3fc5f69ac431fbd047231aa677f9222ff3a11aa00 +40104f5bcfe19be659032b4daaa0ec4b01f56ce08b86e464e44810874b8a6d4d3bd25a4cf93dbacb88cfe92ce7c93c62cc91a259ac20fa5644fe02c001d2fa89,c4115d6336313e95aa6065cc7bb5a5034dec7e96592a29f87858105200b5796f,3cdbda808801a3fa8a047d28f85805ca8598db98d4072f8eecb27710e8ab6bd50a09a0dd52962257e67ce52529ce6442385aca1994dae1c1bbc13ab6fdb8ad4a00,eeb75ca7257af464994e21a1ec8e37290b57f3b8436c057931ee76e6d3fd03ce3cf7a4b840bff2be59f23b3bb196cb776e275beef19ac58ed2e3a08d2eb515c900,2998a248cbfa322fd40f964b8812f12696df833360f9508323313789debb259537179790be1baea2c58b1b9536fdd9e95b22638d5a34d6cc6792084cef0c819401,812b861069072e24785821c684144ca908d6af927881cb74bf6f3aba3ab75cf42f1c9eb994572f14926d4af7781b5881c802c5bdfb56d8899d99ebc6e6cdfa1b01,2e24504813e95f6c1d3297d86227685cb139b6b5482a2c29da1aceacdc18918271f5e79d59bcaf75b6008030d1fd448830dc11286a2fc426bd83970a1d00247900 +97f60559631bfcbb338500a1caf56b37e642366f635af08f7a02bdb4d3e8b7c2a1bb7a87d59674ae91eeffe2966cb4976d4de8cb525aeec1387120e21bb9d81f,596b5c134d9827a457afef94f814deaeecfd9579f3e2d29756bdc9207a3a6e1c,9738884ae6f5f2c2e93c8c9b0450bd423edae0dac4deaac3009dc84206350dc12bf639a720f296ea8bdb875408ad602da1df3d30f93bef548b84b45955df257001,9610a13d89cb857472b440efe76d185b1c6784d89767249aa23368b9d1fd1be7242867dbc07596c1feb51ae71de09499343b9e235103a94c306c68e17aa2152000,e2d7f9518456ccd51144652496aa2a2def22d4358ae6284dc6942c99076ef01c2bc216f2c291ed719ebedc9476d81c3daffcf86eda4bbed783832ecd5fab1fcd00,da698a9bb7c33fbe527fd93a8ab80758682b04391e74609cd669d0b9374e3a126072e099eb060b1f2c19598075704425d93e3cae8d8c7de927fbd1272b01049a01,8cc8591594efccdd035ab1e9ea0763b1f447d45ce268be836014e40c0d7136d83908532975c81630e65fa87b51a1a1d1859c8c00cc966aa590a3602aff334b0d01 +e20d6be9c1934f8019c57cf29ef7e10d9d19906f49ba9473dc52f12b65370c02125816f8e7c332dcc9e7003f5b50a2114e1ed79159de2e90bf8dd7b53bd35772c5,58c6fc4e49b3d81962f0b62e72c8157441ab76ce573148e56abb3e2b69a59179,398d6b6fd70ebe75ab630dbd68c49a3c889a12d0a4a753990b1f0e6a1e32706c4dd729da6ba57a65d6e948a5561320bc7350c89bcbbc97f8e55070e5a151d9c600,11427825ff8b49e0170a4aa0b9bdc3f1c5e8365c80ed0fbb911326878bfa3c302a0853e341fbb2586f9ed60570f86ffd20abea3956501a440721ec8c913cf9fa00,4f6e0d929710375d7a6c058eea07beff3fd7329a26ce19db65fd89f3bec6638f3c90fdff8fe37b56582eaed174391fc84fd59f903d0f6b8bd0e20bd241c2a1a001,90911ff141f5fa2c06ff5e0562158cca2020fbcea7a8afa5256e8e1dfe398b3b4606dfd9c977f94d8b8cd2e12ef3a816aa3c093786dc1b0e6b01f9aacab0d92c00,47b7d7bb84e083ea6fbd3962cf7f0909baec9fa889f5dc6860f42715472f0f854e98e3c4a20d309eea810886e7d96cd01f04f66b8032c8fafd7d376c3215ba6300 +a3a59a12602ce5e107b1a034e4dc615230522608097ff8607b8d73ad5a246ecd7311d5b613a2eda05dc5ed8723b2e6c19f4d45846d77e51c2f7d1785044307eced,aa0c0f05220ca72238117440f10c0289f8bbd104fe55195750ff849829c17667,68b8c6227d63f69b23229d40de4c5ee38a4d4441f0e7a1d5650b8e2ff19415e04e971a094e6027cb2e52765cd6fc38563996b4cc9dbe9806c9bf9731931cdcde01,e5a96da54745cf1ec7ae5b0fb547d0e7fdf6e316f8cadd5a0da3e608768145061c9cb5ba9d985a44aa550315eddb0ea4af4592978878c9425b81c7f23333bf3f00,2d5020eb252af2d9beabd2fcfbed28cef49c0b9e05f2dc983685023a52f0a7b5171949248e75265467e55affe252d0488fe8eff7e385b41829bde852f3d3809d01,6f6a7d87ecb65ca283705350ebd4d035df58ef161b36dfb7427e7e04b4b74b5a40c6f05f90e0871faa603fc67c426b0b9e0dd09db815822ed9d8dd2c30959d9201,cdd1cfc6709feef178d9ca6be6bea53531333b46c79401cf436d26a440e212592e697488779a04aba7d4b2e5fa0dba856ce22e135b66bec0f966c27030e0e8fe00 +cf286bc096537d95f99e03de87aaa7b14f0c18ffeb680d753f1c053df18405573e792c9c31e3866ed12af2be30d76a52f55591ca4640fe852fe0fcf01ef0453352,65c686917e3b851da4ea35c989c44536f448b292e04adc1aec2ccbedaaed8056,593fdbcceaeeeab84037137aa321641b1cdd6d5c28159a3d70e9eaa14a99efc843861d17404fe970b9898e019303886bf069f5e09417e06735e7a3c8cf58c67b00,dd1b140e0f606fef9fa28b7d7df075f0ecb93e0a5a5f4e23075b3746ed982f3e5592d24e877df65bae810fc5a68450429216d83c800c4521bd7c1e20ca39c85300,b89453a02975633ca7e48d15fab800119b59d21300690fe712fe23876169bac54538b81cb83d6b4df67d0124a380a9d9688baff40ebefd7342aebb6c6c1c3c6f01,8103649d5873a4ffb29cd785e50ce7df87049307a1fc34c67c9b4d9b28b099f10001bf45fc3f2a940f553f482be6235429e70ea8c80b449553a166bed0d2d05d00,30a42770f179a02ecf774a3f309b82e765f0454cfddb027caf72a5daa4f6243f2199853dc3b43742b41f87bb1aeb5029b923410859e851c54689ff51ff63991701 +bd04345c63012ea2eaf4c4d80a8abadc52dd1fcd2a91e8909ec460fb95b60f1be02f33b65d3058c13c64d0b860d8d4df2490a4af529aae480ab243372fee13c616,e345cfef2bdd8e6d26cb7c34587d93c3b311d6c3d642b2ffabdc08ef20fe9d69,3ac5dc39356a255c9d9fdd18f4d74a172efc11d06d66ad527c16c99e7b7406a30e816f871348f7c4660a712e4d62cc01179a7b3447d3cd73d57fe8b3b59df43100,7361ad9e933cf2b3c0641ca96cb0cdd74454ffaf1a42afd624c733986aab3eaa71a1492c620588e38c5827aebe1f2d5591cb07b91f23c2cd2aea793f1c784d8601,c6ee90dd857b7a0f3befbfabf842161133b09496f3dcc6f1ba0bd38d3029ac196e75d5bc39b20a593cdc4dbb46d7701982c52eab4038c18ac24f5e35a7a45fd200,7b9fc2032a5f2b5372cef986a748580a39470c76cc5ba6dcec31cc6431323beb47805114e1abe85e8eecd264828f9a98ac5a40e828f57e03f2f897f47f00400000,b0ffb3fd3de007604571c00adeab265e570037c1d981c2f456ad09bc149b72a22aa90d140e2be277a35c3016b0d56d87392c8d1a1d17a9dec789ba29fe4d259800 +2aca25a429d4dc2f892e59cae12853ad0cfc784eadbf0d85c06cf5b12e276c75ccf65473850cd33c793a8c59bf52950e3e58191ecf69a478e35d7f77141aafcaa2,3013c68474e902e42a8da60eef02fc2b7e3cf7de0d84a7cc8aa8650af732b7ba,8d609c6c92b2a48387fb28a4197f9504d7c0252dd5a398a74f09681c6a4c91ff7af9a4beaaae27562cbbf60afbc735031ffbed5ab7810bd541eb88341f3fc2ad00,7044a79fb58064362cdb2cc31e89a798f6b5b750ee662b185e4bee902c7ecf1f606a3d9c8cadca6295244c2f2b5e68606c72d5cbd8c7d5c651fba45ae9a94ed701,d71db1d3a425925ab7453c68d27066c18cbda8386a8f190a071dc508d89e5cf73634c8fee4c68354781bd35e4ce8a8055f0ce63b9dacf20ffef0d12a21f672e501,7a056524d4d2a77b690ebe122970a33200dc16dff4699acf18dd4b86751d2b2763b5f7c54e2f9b6b9ce67987930c23c99989d3daccb30b7779a4afcac661b88701,dbae58cdbc8ef9c7e001df3685b04fe0814a73c5215898189889d0e4ef02b73555fdcafa89fa0119490123b868e5a60c3c9129b2d15f302d18254f9f2229a98d00 +78153a8d33bb09bb9631b2c0fea00611a647c55af9f767ed9a16a79648bc8ef9b58c74b9100302a9b5c1735308098ea34c6da1b9ff90d63bb9d8ec08a7257afd74,a85dbb625791d4cd920efdbb214546fc9fb4a5ae9c0d9c50f06ea3090678ad9a,c4c59ff44741d3a3d64e46f23ec2327a56682f7cff090333c32b51e3de7133e567d345bd23fa8208817f158f204ee7d0e44501ae33ba764c346037077f117a1c00,629d151c453bf792abc02c7ef86b197528c814acc6f072e2275c87c25807283a615886fcc5dade4b2619a73392acc595d898f5a489caf479c612aad6e632898301,6edff14799f3f2c0f82223b7c81f36ac4952c3058b531999a2149457e1dc4ad140da89de5260407a881b11233558e9beaf8d1e482cbfca3fd33cc3c592cae82001,1a6bfba398c5878ae65e23736e500f2834313dc7e22e2a1452dc923f35f68ef140713557163a6de9dc20c023e2a7698ddd9636b72a7ab9cbfe09711ce57e550601,4d3a458a72cdebaec0c33b6d58679a63a7e98a1bad8e95b9df5e26968ca5e81a2c6197fc8dbe97ff171547c1f12961d3fd060fca631ff045137ef9643b43f8d400 +0aee650cb7a159a14042f3a10e3146d9d957964316db05d0f1a0fea5208524c015b68875a2a60aa68859ba2da9f55b19ab1c6c8bcd0fdb56318fae8039a6d2b496,c7ac8cefbec3eb53c585edd4accf3a3e81e642a5258a36cf6fd250f9a4378ff6,724a689eec009b65b588abd16155c0bbf582c18c31fb6d17d6c93e6696018db431e4e83bac58b4327f922a0efc99f2f5440790653c04f2b84d86c855a237571d00,c5722b3d687d9b5af3d2ab5ffe7cd55cd664550977d8630a2f7021611f52b1b8265051f9fab371df97fd3bcdfd2c48fafe6d3e53922574a3ac89dd917896c81e01,236917c07d6391daf5482fbf3ef4c0e59ad1b603fe6afe68daf4231081c5a2d5442f6f65ed7babaaacedd49ff1ddb9e9d9be9fd9f66ceab718e8766b6bd98eda01,21c1bc767b12d702302443d6e57cfbfd9f406ffaf12f6693301e80718e13b9f01de4f13eb3e40d80052d413cfa01aa54347d72250a77622223f99ebb328f2d0a00,f3445787df54519e39780461709facd1d6b0a74177388aa196fc09f256dd128a542a0ff61c3ffb814c185918d65be3f85d4b268f1701743da877c93a6f4238e600 +687d486332c1086b89dae98c7863c35af531101afa93074d114506d0f1e02e49cf009632de94e3f3668de2d6d25586115784f52a7d66e6350ceae20cd55ce8bb7a,59b9a5782a1d8ba19bd98cad6f320cc1a75fe5c8a28a2d07f7f5214b8fc2fb08,d1cfb1f408f13c39134f26b9c909cdeba5b743ca7408b6b7d9ec7c0b54da34df574a0c898005b7f6eeaa4b0e900d74c8799a4ce651c263ab43f5e80ae3acb88201,8fffa1f64056e1c58aac842805e46266b1ad786b5f9542c172d5f35ad59b2e0665ab7af41325e635e50241f74e08de314dce84317290c1171acc299ecf450c2200,f7fb2383dd2064cddefb241d8c46ff8bf6d9bef6d1d4659fb225285dcc0a71e363423b295bbd35ecc7571db462b92643107fd751dd90ff492c350e33db47bfbc00,eae6c4f95f4e1f1ce5461e7f3ac5ac2cc6dffa64b54d07615165f838d4fed740751117c8cb34cab1996d1d83626a3325bdc02096f5ed79ff07b3c677df7e44e601,39c7ad6486da734e2c90ebd0ab1844b9fea20654ea827f4410f7a3070868f29861dae190c807b9c566b8fb6286d451d79a8c67c078493a46c7415bb40e7788ff00 +884d4ea9eb1a25e33d846f43b4f0db77964667d244e5a923ba06323425c1af272c886b26d8ed625cd54abdacbea14da7d7daa89e9d0c41abd3fc8f9a987ddff52d,0a5d4cf59a773ef76b560e8b4efd32a123434ff70231cc2e9c120df0f38487e9,1c804376c62ea3e9059f10773b02e4bbe84cc9bb2b0ea5dda04419570ecda957667008dc7fb2f31f401d1d3263e4bacaa5c9d796f0ef3894a99da5696a23490f01,9bc3cbbb20dbec0acb593305baf4ba0bb1b0ba130ca668a271f59febc9ed0ae3411128fdaa18a4e5072a9d7c5a2c7fc2fa8aa1368ab6d2031dc037fd4d184e5100,ea4b50a094f980e8d474b3959e98a25ed14f1e087e11e200b85dc7f36f1898f05fb2aa983b3f6df3de383bd696757176e4e71aedde3710989f4aa1f9e3319d0100,2fe7c4847015af27b6fa20127f8d13d7227110bcf6c0cc445e7d2bc470e50f15785429acf5756a05109f0b25bff87b28cb3e45626c436f42e085fa4c2b777c1001,35d3d96031322edd960a25b46f81c49a30a2cdf8369e306f298e60612ed1fe074af39a260e748759a8d1df4c9417bc54ac687d1552d64c75a9aa1c4bd576c88a01 +2369d02fd789e0fc325912d255c02ae620770484e0e184bdd2dfbcf9e4f20c82e675a0bf76e88e3f5f872121da8dd12a33e2b42f7d010b8e627f79a1df873830e3,4920b8561933a1e274e899447fc84a995370af5b432eac72f6feee1dacf4672f,a8566be9a8b9c7f227a3d562e41838482e4f996e67e7997dcc223a67e4875f4076d16ae17986700da057ecaf5e3cca6ce5c8576aa1204b1de7ff6cb17f38a52401,ed405e2e3737b34d483a4f5884bf471211f74e68dfbc706b5a9930aa1626570d7e0b6b5f5817eda672d1555f8865dcda30d44039fe1d6592140531f1e5c4777200,02eecf779a515e4947ea80302375cf74e4778aa07834bbd2f542ae593f05c357065b235a58a00cb387dc6cb60f353686b11be3c9a7b649f5be12c06f392c9fbc00,041d3f5c67967f6f2c75a10ce9da9604fd5b221f8a71f4d2626859af8efccf3c3b3f14b2f7678bcffb662e99333959566b5314cd67a3ba958eb0948a9720a5e200,a02508790e68c5b3a529e48b998dced47b53f19364c6aa8af4038248d141ba416087dcc98f71cb1e15d802120140dc0d603043cb9b47496b0a4396c2e86210f701 +f271e7c89d92c51507a326e1d00b82d855ef35817c0e220d806258ea984a8c56307d4e8b70fe2c1ec6c4100bd7eae99cae6d2c60f84e04cad8724e53e2021623891a,24659b0151113f819fd6ff77fc78cce47256f311b1851ec86f198bd8c446d02d,1bd56de58bc6e00bb2502837d3e29d41b3f08c5e8455c1ddbc7615068745956f0d5d64a9f5badc92b344038ab9bef876f6331168b3c8209521e9dd5d40c00ea301,2984b37e583e0cbad8ba0e11234dff6f80515cc2e74ba8c5924da831dfc3c61b359380233b3fbceacba8a832ad96b14c971c292ddba6d6bacfee873f3c9fdfc601,923fe71c1411a40d05005c90f4ea2f68806341642076ea425ab50a5489f66d87364dd9d5aaac842124c42fed058d9a1ea950253cf684166756ceaa49525db5bf01,087c54a6b0e7dcbd9869ae3cd6c1aa0cec840f8e26d9ae28ede3224ea599cef41b07b192a04e2416376fc5de30644fc269889eeabc86ba1db6663abf967ef42301,b737041b176b4a20ada307d1919bd147b824c1b15a7ad91ffbe8a7b665f9bfd655702531d6696d7c4ce9962428cbd3917747b998e4b1a6d8310f361c389d58c400 +f79d5206a881921fef6618c949cccfd790d16809aed47a41a4fdc75464e8bd76deb349d5eb1aeb62dd27aa218ed6e74746fff92a719316168cd34334e5dc8d6ea7ce,0abbb3968e2131fc7bb7502c97bbc692df885dfa4f37ae664db783e4828cb0a7,3dda3987e1a677c74120ec3dcaca43e60fa0b2e9bb66fe403c1581116cfcaf110f2e28608bf9c9a3d46bad0290699eb001c1f3b73baf1e1d3732d387108af3ac00,ecd33dac1243b9b34941fadbc0a5565cbc7c77c76726a25a5a84a7061790cbd42faa50f9f66cfeb3368e69c23ffcaf0389b5d9c029c2688ee1169bd46c5190ca00,d1d2d9d89585f52929dec97ac7758b798262cf80a539718ccce5f832e92997620ced9087325497afc30bd06d2527ec39f30632ce25f2bd1e31db8e4e28fbe26d00,877e7fbc40f4dc8f38d7fc824d4d519ecf3df0988d6f76c13c06c17bd8a8466c1ceae1f5ac22a58576b685cb1b78501c0b98801df9edf8d363bdd95e7c863e9400,7ffa70e49566f8906ae5e25580ea491bc63c4230fe29e431f1cd73192f0611025a6c9204f9372e051dea02384013d4a669e53915b800c69486199ad6add6127f00 +b3908e604f26a76bae99417c02f7ef8f4d8917b59baa58446e79c9abdedd072c61a61651465e68d669674b2a4c970eea8beec4e7fbd51f7e803242d8d00f05de79ec,c2a7f94242d9aa24d468666ca28e5823d8cf2534c7e2a36ca093dbf225139c71,582c53a45406a410b96a47e5ec47c897a2beaf9e7d8aafc0250a628a865ec3303a49f25a7890f11085fe04661a12e8811b35e8ac64deb73c75f97268b39330dc00,b60cfa24141ceb46489227354fae1bb05337fa57585e30567ae57f216acb52b82a50f98547459784786f40fff3a373ebf95e6d9ed16f4027dba1849ba421e30701,ebcd023b1db5d660de08dce6f30c1e18051afc36b08a9dd84a0b151e04c50f896b222374aca02e1926502e23e785c1e8bdc364af8f1abd812b1819404fb6fdee01,3be601dd4b4e86758f310645652671c64bd61e558a3b7a6171c3c0b4c91240e7276b7ad419b1270b28407c7fe61a56b22859093505637ac720b0efcb70e61e2100,5ac15d14f9ced916be23ebf682f285db2c0b2be8d017aa39d1a03d50a63542f0687ae739263e4eda667fdbb5b44bf59def560acc1bd4564963aec02b7d8b570c00 +938fe7770e9eef35d6812af448771bbd55e07f7be38543a4efd38c81ce513eba77d02e8e340596f8b8b16e506d3133f1f4321e552a86f6f4ddbcc72352c9d6f16b21,ee911bf4e12d51beb3562022671c2ebec5d9dc57cc941216f326d41614e0be31,d553d1a05462c6d9966939ead62c28c8b3f3df9fe86cb675393d2c02ac227ea721c47c308a085a31a6344cd1ede5c13b65d1fea9616f5db64d3b3e0d57e6167000,503446bbea57d4a16c9e8bc970239abfae602035859534859be717a4f11661c913a353a1a725533371d4a4df72760ff9b29dff130db61883b1af106119896ee800,3b3fdf79b13ae65477ade486369cb3d0a7161120082b907642aa94d99046b6d94ed3685bef13e02952e4df4e0aff47b9b8ec71837c10ad505f4dc10fe0ed332101,85da1d2df1c9b528ec3f89066b19c72f60630a79598ded79a6f895de6d370daf45df49795723fe5994aeb5143fb4d76d7783769d1a982a8d413cc99cacf20bfe00,7f714c846915395fd443534514586f88ded0e3808b1ffb0a42b809afbf9e65e563ac8af5e8e02c9b44f5591e21ba6b055290d8f13a5be2ba2e586be2e81f74dd01 +23fbbb1123cd0e046086c5123b69c5f5f0e24a0c3c3418f3178aa60900986ba6063ee3adc9bfca05db67a7c1fc55bce1038fc3b21ff258a230464f07867ae111d437,53271c0892f472bc19614e9b88ec61f721ac7d2a639d6bde82af62de096587bd,dbc4e4732814c5fde9ad87c76cf199f9a46a9d978e30f2532229ca69bf91632f3ad39649c48d917dc6a2fa6b75f02cc868ff56187c98721ed5cf9f4bfcc852b500,6b431ce5a41c44791ea3d1e377d9eb59b22671152bc7d65a0d71756553bc22612244f280f38c4a2d9af7b7982842c2d023b7c1b7729476499a7496257624f04200,9752dae1d07ba2f7d81505a852cae57c4b0cacaf39e17e105009b1ef26c97de0553cad04c5661845c631dc0ca1ad03fc34d97ae006ab35b8f507525fd0da568701,45b09545a53c7d7ec248e8e2282ce4e4aa0a29965a8161b95732edee989887026c6d6e3cbbdd6bb9ac0f6d678ad1d6fd378e182e4929148c47bc19fcc6994ad901,08015f2347e1453fda7f9ad850ea1bc15540fef964eeb6c2b612ab7c41b81fb40b7b5ab89c39a808315b91799b609ab6589fcd0ddf0402221ba29bbef808573e01 +d4e1c685c3b32c4edf18dabcb63b054c9b28ef0ad4a9ad489b8cd9204e6fbc0bc8fa7ed14ceb88a14c292156a5eba8b7001626129f6a2a9bad90112c9d1796a802b8,b21cbe25a8b9bf9cd0913bca213d60f395b9f93cc600d604223b3ccb3c2dba6e,a3cc01756b46d2baaf5b4d93222585d4e59ae76d93ba4dc637ec652359f8ba8d6c0f6cc3a27d3b64657b08ebad33f2078875f00b0d7350216ae34895cd1ebada01,0ac5a7c7d5a778d00525d62384e17d33ad6deab4a4bdb7c65295d06faeec58081a24776ef126c875941f3d8f935fed5b35812811a3e1f7d31f4d565c9cc1ea8401,0cd087382a46eb517a8b93845b2968b51de224503290f0f6397e87b69f1d15a040a77ed88a63f6f275081657e8ea82ff9498a19424ca4b774178b82161ecd97c00,d9190d9a3970ad0e7c84267ea52aafcacd198eda62c5fbcc1d7060ba4e1d8c007bd0486ffc2df2ee5ec81a522bf99bbd29908f14b9240f4e53bbf1e84f0c2d3a00,98bbe5aaeef3145acd1ebfdd2defab108dfd0248b79caf059102ac754198d0ad31bedb2d4db4653258c0869c962bea8a254ed412cd5c9a9e4c293eb06e3fcf5200 +af2369e2ffa0fe3814fed0451dce5426ef9f2e460d441c8f63b3cdb3174992d12fd4b4f425787e9825cdba9345a8e3f6c0543c12237b9fd1b897397979cd62dee039,847eae66f88c2831cf6961ea3c268566755f31d7c3e1ab2d0ba77671518cf36d,f037b1ddecfbac7f9d067b89838bd1ad0c7e23d97eb57d7bd36a19df55c92c8b1f8cb9248bd6e96be582184542d3e8b2c039b1bd4aedcd09ea38dfdf25d71b4a00,8810146ebf818df794256cb9afaa4567d8a65c0707b75ff978b8e0d5e47f923d7d50f988fd8048e6b9da596a4b5bbf00f5295de5dd54e557eac304d40f0730b500,0de03dacaeb01e1b354cb514c249e46209c5a86d73880cbd02191b7cda5e718147ec09c9e45a059e0bb37e90eea49199180e6f72a32814297624b45b061d8acb00,57bf0d0a69e7d1a6bdc25ccdf0c9e910256a2cccf1649589aefad0bc46e4601304b8147ed33fd03bd381190d1096b3760157e7fa4571d64a1ff10dac2f9c01a301,3c37b1b3db3363e9cc8938f2f61edfbb3c05ba1ddcb599fd26eb80fe675858cf1c65a719599e8e7b97b3cad3fc5052680158d72cc28dd88c12211c75c87677c201 +1f6948e0742085f95bcef0534de9ffc2bb89f850ee79b8d889082cd0dc2d30e19e2e3a2b27cac4627eb0946b019a55fcffab47a7976361877dec618b5f445e6f087e,f362be758740b6ab9e36db674dfa67f9e1c401dd9ec20cc7a189b23101c00aae,b8f66e0173ae0ff893166b7e77907472d60fe74414f784c10972b95a7d85044c0ac0938c923a64ffa2810cbec1de9be98cb8d50e2cdc2eaec7c15f5b8b2891ac00,ed6645666cde1f26e360317b0ac7e41dadeb385412854d3e26cfc56aabb660422b8b4a536f80bdeda8c87d841a8e2e8519b9f56b881c3bf76d6b36e3cca98e8100,16b7ba2b9b6f8f697c3dba434e836e3cfa5a200f3f4915fcb27868719d2bf7d47e3175690027c0c16d8b1cd6bbb4d861e40dcbf806c0c69ac1a58c80d7ff0bc301,8ffa1090ae146e154ce39b6631f77b80cd33da8621beff7979ff412227e6af8c78a6215e599a7e840f684b3bd6f9bf0adea50d4ead56a109384f05c1ba34eb4500,857be355ed634aa01390fe6ff649c33f0602bcc1ffd99f7500fced95894289900a57d3adecc60ff9f715876e8661e9386ce47c5d3136a5060f6189ba2649260f00 +3e6516a703dd58bc0c89b8168a4a30c33285075cca6519036003e882979696fba8ff6570500eda3b10d4120271b8dc9173788a020109f75bef759aa4f402e8b3c0a1,52397028dfc5a5b5d1e1023c50a68baa70e3674a54f3a13b5b531d90df432b44,3289dcd0c65a98393bee9d24d94eab9e6557e51e72ecab7daf0db8de6bd5eff201027fb6a9af1e47ba530352b8f130d9dc66538830c4ee6fbba7bfdec9fc264401,2f7f202e35bae6a1c16e6dbb5923cc97cff66a9f85c2f7154f4c28439879a7931506bd469e880ee93d9f507d1a56e4f2c2a49b01ddc285ba1ed69711f3723d1901,fb07b4a609ab438b55a9bfbe1feb02be816e450b07711cc7917c652da239feeb484b7b543586aa99ece895055045f391bdb06fb77c9ad9bf7e92b2e2fc9ef3ae01,405f0b7ec224554fa23a61bd6b98338895d61a7132ae8a13d7f9794e653cfd0b6fbd22e5a21582d8f3ab61055a598d6607e9406cc5b61836dbbca9a58289854f01,03aa8bb20137b3da4bc468980981a45f07515f6c21b28a0eeca63cf6e0fc90b407bf50ecd2d22feedcc19f3975774d863b3a9897a46ce4a34b3675657c6d678800 +1c5128ba68f6ddc53ce467d27eda028e39d6c615d60b96512bbbdfba61f8d3e42226246596431dc28c46851fb167c286cf227ffcd293dacc497fc476be7792afd301,333b82699b38a80b7ff04996bf01c2200fd5499884282e4313a4ee51eab6a003,5d389c76fdf87e72702b36411dfb42413bc0f7ecdfdb9b7fae741f4fa60316d24e5994beb7e1951f776a4aa281e436cfbb9ff3ecb02a22d587a613618af7167701,908111b29d9064c24273de8922a011de8f7ac210433b12a1ac7eb55d711a830f66c69cfd0e1d8fada84d4aa5c24cb0bd098e3e0d9c97d10523c6407c955018ad00,3e35f856dd26483b205a2d573c972d94554be6f7e89d9de264458d0975735ada547daf8b998cb91fcba825ca18d579a65f7e3618859d1befa43df106aeaaa34a00,3408a3360437a89b60e5dba3c546ee16aeb32d929e72bdad3b7b47e27961d575038809476a7eb781a4c71bdfeef22848a60673271d1d3c36e86e3fd44b59aa4601,a139c1e5cbd68ec4ac4b7ad62f35cdb48875db82314ad90dde4010848e2e983748f398ebbb7f2f5e0d7ff9f61bdd276a3a29860a64c6feba3025515ad5ddadad01 +6f96a49d30f8d2d0ddd20a2de269afa261908a9c2d725f004064bac5a4422c3dbf957bf32c03bed2e48cee57442a4f2e4a3ac0406c2c8cf9138a4dc6ed97075059d708,4c2638e9b82e3a91f4c96da0e4961267afd600f0dc45f021fa7901eece6beed4,a171dd5fc41804f4c3d87194229dba9aa63e6d33cadc1e270822edf5266e84046c7e4ff4f96610906855c070c69cf4084d657a3c2b9951ff2b4996c1f163c27600,48391574101c4e82216f9aca8de245238b35df32efcecc64a677fff00a94c9ae7ec4ecae35f2cadb0fe14ca43bd2614a90b5abc8b3b6a182c621092d34e3520f00,368785f0d373112ed5dd3ae437e41705b73e1927a8c1dc067a102ec884e21c4f7ba344140d5df0bb194d02950d1e5e6953bb6c26e4dbc8832961ea28037a148500,d65717c7c637eb482ee5d6b3a9b4ccc4ed2b874f6761ec7ca971f849b6fdc3732c8aea668b4acecc82029c7969da73bbbafebd60dcda4467eaa2c2ba5db2f6a100,4c6b3eb56006723e769cb95be15fdb30dd765d054ad52446dd1ed2fbc2b6141342803f15091f3edc9beaae44da4e5e45bde7aed15bb21c0048136c4fd3d662c000 +29d910c59f76e3e39ec847a74335ab72e63a147937b2dde43973afcd962c8464de871cd018e83efe8442491fb3f85ef09943e01fefd63de15efe8e4dfecfe64cafd98c,65457d2d864cb2cd7d0dc4229f23f9747030293ca2db156c1345e16bfb374a96,069571f300b3ee5373b9db3549280aaadc20561075649f1fcfe7dee91d3a2a256c40eccb66f5018f17bdaf69b9f4d43f64c97ba6249b17cf0f8858911f620ae600,fb5b0f7a3bea77508d37653fe07fe684d45e618c11c83d103e0d5696121d64dd2d174a2fea6d522ce3ad2aff33f472d8d47dfc388d1f705aab3973dd43f1074700,7d9131f36435f4a096f9b4c90a7b2626f894d695625c7df92d1aaa0a51702bef7b11efb7c0532a43bcdfb8c0533b2e04cfed2316ff93aae10430faba9ac904c000,99cc33a5afaae9533e545e2e7bf4f6b5a223b69335379bdb6ccfe1f5503dd0086c5f0e8e0253c574e2d651f36db05fedb6c0860515175457da6151c52cbb958000,f313c3cb9fd2bb1ab61d86077ee92c040d20763ea52c0c1c214d59331a5cf8884716c49f073854a054b04773ea50c7f275ab6a9dfa14fc0eaa074ad640cc97ab01 +7016f422131e128d3ebc6e546fa4c824da68bb17ada8705e17c185a92c398c4f516feb8db6e45d52b528ed7f449729cd7b08bca6a088dbbc81df8aebf56a532d46789d,099803020b4b7ebc365f78c4973bcee60f217c0129e7363e16ece14756a3a58e,de698708fe3542c8ea0fa26589af5576b488abbcadf04897971b03bb15049d5e7bfc5357aa9875823f3d0ed18a2b358f7c55b929c0a9aefbdfb1d872d889246600,6f8307f1addb5fbceca0288e836e7114879827335cddbc0b4171dc1d3ecfdea517a329f817eaf75743b2827fe96f2476fa1e0f1e53614f72c0c471104604a07a01,d16632484f1ddbdc22617011395d9ec397053a7dfafdabf1a7380aacb5be72ff30552444f18491e7a3dfb529f544cd8125eeb3fc9bcf542b24ccdb22effeb8cd00,c41705ac2e899850aeaa161898414ef4563d9363f2445778ed6533d4e9bd40962c55d673b25613ac5c25902a3348ee3febe68904b8b1cae3f4381ae14898033801,fc912e837cfc9e583cef2038ac48619159fcd2a2d13b5b48f1572440c5d88a041de395e7698684894bc5d79647594d2c1d6590f41666c8e5f47e29cf6e82df4500 +f5a93d428c17deceb06a75aedb5992693f343e6969b8554d61ad3d275cfe60479e2821a3816c149dfb2d37833d4628de46c64854fd22bfabe6bc838377e7c6155c04cd,8ab91545a80870ae4313f1cb76669ed1601b09a4bbaeb2f01f4a4d8cd24667b1,543dd0804f8a8955250f94df4fadd969242ac03d8010e102cbd2fadddd93c945314f75dcd13e6484d589faf6b3e54cf463ec372156553cc819a619dc4957eb6601,9ade5a91517c5f833f3e2eda4ddfc3db244703fde5365a20c55f79fa4be2a4ef42baf403ea33e095d4ca35fde5502ed15d60f4d1abeddff8d93e871d4ccbe8ba01,1470d41ca59b8ccf70ebc6f2042a8a32ee68422b8862755932c131a0e16d1d1f20664363d86cc0845a621b4a29052e43450fd1ec14473f530afab8541d77820201,8a599d4f06898bfe7856bcdce0bb5b3d0dfc6ce62b393ed0c1191d5f8b79b65b056796d6252b157407a9d236caaad6e52f1f1c7dead7b1e9fb58f63209a2fa6801,e85998f56ec88927ae2c32e9c2a4e89bd8bb69ee1f05bc84cffeae3bf318dc85165bb026219773e48df0199bbe6b95897eedf32d43c422e246c97380173de80c00 +409e06c6ce5cf08ca3813a0ef94cd5131ee3f4fba9acb60a84c16ceabe6bc8a3455863357a5ad78fb03f3c5ab80deeed2ba7a11e736f323c842ebaa054db4b7fd3a12a,2c615ed4ae1fdafda85db794b2055e6afea89facb105f85ca91eeb8585dc0163,ce16ecf27fbcfd2a2303ff6df83cc7abfba57764a6956a24e6aece4952e8920f31c564f41b4f4b9e274e1279f245c6050d05f55b34e9a2c980e6c9306c65dea701,3e29b1449f1fb01492cf4bc36aaeaeb1e711552749963c17a293165253fac7097ea389d58599b930e49a2038afb25549475e8372f6109de39de49b72327b17ec00,321cb8dc6cd9337c39a70e5b86d5b93da3e51d79d5c9ce6ab8afd7e2e48b8a807e564328f4374eee2c32425c7b9245850adc53f384fb61c8453e14ca2c07beca00,d5a3fcdbb4aa2ad0083fbdcffae29aed3b8bd1bb04551c25975ba9075ea947134d8559804b066ce61660d1fad37714ed6cd2fcc8d195ddb9f722fe48da78022200,5121d1ecfd8a70bc19a45fdcbffdfcd7d2dd9dd455fd1ccb9b371305df69aba706301e1fdac9f82247443ee1a5b79f802e920e8f6c391745aa99712ea83150da01 +870b6b65b9f2af5ca8c7173e23c3410276301fd4020e0080e9acad3bc067010371823ea4c32eabbf57fc685cb7c186d4c8cc99a2d788ff1e76307301b9914b622aaeb9,957bdc05d491d2b863d73e33b41080fa6913882286576fa3442372b784a1c495,7b1eaabe8c31d7e73f60d56e7a388ab7565c3709a01006870f4162dcad4c00bf1559f47c164f796d5563d4bf584d25eca1a974bd94aa9590283354715cd757fc00,90723b403f0a3e0f8640cea0e06989ec6cc0819a86d3512a2c705ec1e5f28f7c5f2adae56bb789b33f2d68805face3c548a763de663e6919ef140a7167d7d62300,9f9b093f4f9f94ce9d9ecf199d8be1f65f52dd1a9998c77b40ade881720347ce192ff5ca0598da5b522d83935edbe536d1205eb74e7313bf1dea982edf2b88ec00,e59a4afc410a305dc242a93df4983dabe456fd2094513c3ccdd6745c6cc582ab4963e769c6a7d67912902ae74342645868378aa1135c8321ae7b2e17927372f101,3d4e9c574c8b470e0cc87dbad4e2ed40cf5394202a1cc010cb9067220bed713909dfa3b9fa363b8e84aa1d7b16dd2af7e227e434041ef0d70446c64f2240df8d00 +14cda0f2c6112bd052d669ca37cdf0524a28b1caac5e1531f3ab9e2a96673da2ea7070c2b4678ca7b73740e97ab4b241255713c11a1de53f325249d361200072a1c271,9b98ee1fe8302f25d7a57a86186fc074f33c2af3ca6411559bf95b3a2d49a4c9,c49dba15941e9b51c0e1e5d7303f6db0a4caf7e02df3866f11651de3b4366f144988811159145327eebd821904daa51676c3555dc05feeae497aa64aeba26bce00,b88c21a9a233edaafe4193ff475f836c415d55f231770abe6ab900bb7d3d3af15d941542b7316440fce7ae99ca985aceebe85211efbd669008f02fd181a50d7301,12eeaedd370905a072f9aafa7c3cb290171bc3863d98dcce853e53d3ad0a3e554445575c00f5b24a258f432af4da5518040158d58e1b4604ce48ee9d2b4e0e9001,db663dcf1a6e61ac729e0a3304a291656adb91a6c3d8d0a4aba692aba0f1816220e1c9d12675af86d9b6c57d426df1d0602257f8fa0f6d69236f55d015265b9700,22573de514d9bb77f2422ca695ebef0e3d039428988d30d29f3dcf372e28a909230f1443623485d2e4b285e8a71045d89c5a14dde0f2959f6dddd43b801fc4b201 +3019ba0285bde06fdf2086dca1fe22ad5d3ed61aeb267a4593548d2019f19bcfc3e7473cd4d24aeec8731282e20f85c296070387080114c71b5383b3a340aaf14901d7,dd6e862bb915be804596a1eaffa40bda94bffe4f8191dab2b4d95e9dbcbf441e,04b12e5c8d0092fad8d61405cb57d032b89920ee84f0621f0f2e10e324b4c6152d9f08708abae1d57d14bea7c1947062230201e171287042ca7065276603e92f00,fa5786f5de6235898d515aa8f5c59f2342bffab18a38acb0cb09463a12c6b546202806094039bf1212bada6e01a758324a75981f53012a3dfc45c47f9a67e32401,be1f604d2f205f072f8f32f69ac059e8d83917c0c8315b235028e3a2db08f92e0dff90c48fa4bef6d6dc46e52e68b2dac6ea9e6d4033c43b0640953c66b5c81300,a0df3cfabca3b80843c794846142fa129f8c851de0b57fc7e51222f95801c8aa104f8e10268737552de4f0b449c6d31660175b2ad8c28c376cea4f25b9510c4400,5aeecae5fad788c16ba29b7d8145bf99727ebd42d4bdf781c9554571cbd77be9672326db27a4e5eddd7dc42c71ea61d436f54e7f5453658e8ce9cdcca1f0715801 +8de4e8d19bd9536445fcc01b0dbf9f40f682932778fbca31b5ab377dce196fb4d7a69c205356609b71e094f927874607d69a0db7468fd1e3990e9222e09524096fa59c,4b482c67043cf24505599c4a8cd8270f3e526577e4be02fa9dacaf97b3f1d66b,85cc5c329c68164ff67246d8d400bf0a5b73ef721a292da48a02dabd1bf81e567f636b2679bb03120ea5f38df78e93d1a2fbff720fe3566521922dc66e00298700,80792ba07eab3a0a25ca9b05334688bf7e60cd430d6939fe04a82177a12463333f1a68dc69e39380b5b43d477a36c4d09f84303444c0bb372269e928b1c0ee8f00,ab38bbbb212914af75880cff04a8073c11ddff934814303c65fade97eaf41f334f7d1305192de3b61f6d383374fadb8989608571f77ec4898fbff3cdc659b27201,6e64fd8baf98b4867558fa6e089bb8e85244d321d5b9ea933424ef8e0dc1adad101a7c4fc0e5c746668c81eae23b6fd5df9be84ca2fe7a6852d165139fccd57b01,33dd0acf88f171898498e670a4295163f33446bce597bca52ccdc7d2078e511d48f63c182571227cae01a0c1a3cd75c54ae01762574f1fcd70752d911fcf018901 +7ca7a322932c3a2ebab04fddf910e1422b1967267b31eef224020fd66b06ab77c3e87402636999f201f01234de0ff4b0f9045a6ad9fc9e6bebee62d0880be57a141653,f120eef8568b5731f65309dbfbb396b1647d248e6bb9f6fe5a57cd0635c12e19,6db2eca4c746cdb0595b7d9816dc79c61edbdcef8c921254a67c96c9de2537e2342c52f0c844d75d2df299ba17a966eed25abc6ee4ec77bc0b4521adc0b221b301,0e654ec22bb4e19ea84617439a5765dd7f95015705d31aeec74fe457032fa6805cf0c22f80bea0fc4d5b214c5185d5e2ea7a7efc3a6192a66e0568dddb81560000,421600f0e564026dad2d7fa4ea99a723eba7731dd82537ac950490f8267296027fa9aa898c934cdcd5a232e93ceb3ba91bd467cd9108aa2e3a549eddc467bd5a01,060cbca55e3b01d669808e15f91e0df062596efc4d1da927813a81c92c3b7f572535fb4623df8cb23f949ef31207fc71b0b7fa17b01cfe05f2a5ce1d51461c9000,2af8ad8a4221633438b6a9684fe8ef33e3dc73611eeadeac755b6e3acdca6bd772c51d2dccc77c78891e08d8cd40132042bf993bbe73903844a80850f306613b00 +a9237e961539e13b5c827220bc02165dfde9e9e7992230a1aebbf4fb4d5c16932af9c2ba281e905ba41f1ac82aab1e8e2481b747250de1e8200cf9ab3c6d9b2b2b049c4e,8379aaf7e7794ce0b6296404480b8e0ac4eb8b5a8cc4b6c50f68599553bc1610,9641a4b3d2f03d2e3fd5b9bc0d13fd5a7e01c3db0ddb548c8ad23d770c9e38cb2d07ffb73bc55d2dd0a58b15c0e2f7ba93755a2f164de9ec292363b873fe00eb01,0799884ca2fde8c0dc2be0cc1734b0bb8f684890e2762638986449d38ab3ce603fa99bd1f728eae534700b9dffe02fc952045eb675ade4c058c0c20ef6959f8f00,469b15e4d4d2c9d250ca5f240303e6db7afa21c3296d260a7a55d0de2024f5712e18f2c020c1f6c346ce8fd3a20f75a1cc152309778b73d0dc63a1920134dacc00,71789f792f0bf0b9fa1c0d7c9ed3ae1d099c19ec1d0dc9e90261dc971586dc0a5aa976bdaaa76cbff9060c662e0dd43b45b33d5c1be349c9af78ccac50aee7a800,e77bb8224590abad5b4710f9f06f7cba2fa6d811adae0c529e7ed009fcc19dca6785ba4ef828f1548b482bf64f188c8763069829a0ad89cf15d819eea534bc6100 +6c27a9a6e3338d158f2f7a104a9920e8695fe4fb1c616edf892c61c6031c6cc1e71cda4290148ad850740c19c3c8c436b826e8a6010463e78a9d2824f98cacdc6476459a,fc309769fdce1273aae626db89e7b64183f6e8b85c24342e95e65937edba83a2,c75b39ec61914a3728ef2a547fd31c7693dd05eef9e7e3b6b797d27737ae5eb65019dd663bcead707bd47f24173cab518b3a06bec15d132bdc75a12cea3f16ff00,6105981c88ea8ec57918f7589ce95687392e63b4b72a75521502ceddfbd645660376531b082ae7d3cf5e07c363b775b39c96dd3ca408999d83401fd139441cfe00,b6c38cac59f4ba882e02e1b5285f92354842560f39d6fd2765f9c1067936f454231d8b2214d6b1bc50836480a99e0c66ec7853f3b38b389fae41bbf26dc1686101,5e5b7b9c151833a7e514910443ace6476ae6a8eb1fe6c31dfe24b975aea460035664498d507e783814467052b6f7d164cdb505a2135d03772fa3419b9b9bc6a500,5b8fc15f9eb3a3db1965fbd657ea7e4c6b876365528a98faa0f71afc6fd060796a6e3df6218f83df36ea9366ef4b32376402d9093c5eeb544c3871ed451f221201 +724f5901bb87e38afb2dba902dae5fc7f3ef414e87932615d64c6929a637b10c33c295c883d3d48a2e1ed6c63fff07e91088825c0096d02d93a8ae0ef4d9e836772a0920,88c2b5161c595b5fc3ed841f173eb26836e82a24cceb063c1ace7d02e2c6c61e,b238a6c63222b52abea3028e5842fca69c0059d49aa6b52226aa6387b263c2163a4e0ac0946f374dd726fdff4775ef5a076945753a05cde3a758fbabaf2ffdb400,fedbeb835c3ddc6ee562679e75291adc562179a1ef3aed3d5a5769f79d8ff5f45530e89a4ad0952bf71262aa2b10bf3edbede64bc0d54cb0d784e0059d9a871501,e85d969a55bcef1fab0770a05ebaf3c37b3ed190388cc5fc9598026d166ba9485d5ac64027f1352166eb17c5db42ceeee05d43cda18cb3cd68b43332901547e800,63f200026c2fad71abc6a672e15b2bf75fc0e4dfc3c3508745870114d9c47a5c4c3af7fb6345573ecdccfb87ceec8741b5cc49a751590c431264859e9a6bc21a01,ed3bccc0b1c8de129611b867cd33e07d68bc25383c73a6c31be38be366ef4c402658cb478f29c76904b67cec4cae56b49cc9ed524a2b6746044fe6b785b4a24d01 +93b4fc38ffbf86f0321fff03d09d7d18bc19a00d5560b0b3fc2ccf68ece4f9caf9716337cc9cc0e34ce1ebcee975c1a419328d2b83e8e2d389be40fc0eae3dee8ad4b457,9b03ccab31465297e27a49af178f89c1609c4b935abdccdb151f501961139031,39361340da333c369f8680abc237958fb4512d3f10231149374f087b46ba59a968b0a0ba0e98c4892377900a0a6c9598b98e4132b58e9bf00c10a9f5e0c959dd00,f4ba9c27fe0942324d138bbe9773672b66979e9653687d178a1ebe10cdbb0cb25385efe7f399083fb2e6d1c1974a8c1aa50a30693ee254b991768cabb0f29cd400,e668c867d5068ebbb87d406f08276357f5cb0e9a3287269dae1dec328e315b550b27c60ed69105fe6e6141b4383504405a65d3e5df4afad2ceb6683e4799ffbe00,070feb2672c35110fb2cbdf0fe58a70c0dca04b9fe567f98c7cfadccec73088736564f5e60f6eb3f1c40c207b9e4fe1e76c80c257ca33f6b6896b8b5c4b71e5201,8e72dcf1a5f3d57726dcf191f2917c6ca3ee982a0a8b86243012da871c48295e47a31e398f4c1520b7bf0119c043d6cacb0ad759a3cda872a7c4e732dab1105500 +8f5c0d8fdffa5d55d49318f75761d58485ca413501b8a009fbc6f504fff8e31fb001e807d3182ff9d52ead222db5cd53e9cc422e5a9199571a7a6b0025194a42b815032a,d76d5da1a8321f17b9d01e921c0579f993d05329c4e0eb7ac5a18356738a7c42,32b04b47af1b811f91a262e6fbc771cf706fed03c301dc5a2d8c4c320ef99b3a05c0720692ffe0cb6f0d2896d8a7b9b15a18b08797b305cff48208a98828848200,6208b133f36b438327d5ac3fb1679e3d593ed5a03488350e5f3a6a4f2789058652d02266d4beb74189fd7a64a01b1406f180ba1305d953a54d30eff59ca019ed01,e8b1c371c3db7819f9ae0908e31662ea84b3122fec406427d2838793b08c2c995bfea5deaf30b83c142a7beb81957f9d91630d838fe33e79530fa2073bbd5d3a01,e764a536c05e82ceb4c4158d926335555575b1742798de37343f2f9d5ea55934458d3bb5d43a57056e71acff5a95acbdf26b233b1a2854809690ab7ac8035dd601,23a51087c99420b636f7c44b352dbc42127af52c9e9f0b792eb5d0549668efbb264bad94bbcb33480134e98731eed2213efddd7abca0562f201a0602f0b9dcba01 +7ebd755ab84579f03393cc3a137034347308f0408f34d905b9def8ba24644a11c01cc6485eb4a048a08f1d425dd690688dce8877c857d2f676ab94088832fc98c5ed2537,2e6395886bfc6db4a1cd573779c1bcd194992716ca105c0105ba8d71985c3140,99f9e58b21deb3e72ce6f7816649f84668858e8f67485f14af1b80a178a7c9952e856beab70cfa6e3da04771b43841b70cc6ac6515248a90a4219031ddae60a001,1586d8ccd050629f0ce30e668cfedf3ee377bbf7298a84cfe5ec911bff79524549cf406cde3d42feb704c00761ae19674166f91a4196fee65308f8e5321b201801,2435f90c7fd2884de71fbc54a0f2741ad4f3db9275d19658f36b05c98ebf662d6808488938a13b3d8e00d6728fb1d00dd7edbfed652d3792c1a598b3215475f401,3e02d80d783697d11b8c3f1c5788b9943af61c25465b026af0d979d2e0723b3975be41bf66fc4219e578a72b9a0bf0b896bb97ee66546f3ddff601b27994c8c100,9411a91741ef1ac15972e1c40564e04dfd1c61d2655d27d591f9cb5374668aeb4974e8e77f66abe1396ac7fe6b618f2fad3b184f07b26c390a50fa1de81eb5bb01 +8674c26097d077dc3b3f964dc030802498496cf64a729fb3b2e65957620ba98e78fd3a5f257d04e89827c654eebf1096fb47532d81ab5d87431a4446cc103e5b6d7e5b19,d1d0dc5d11bbc68b3f70d15a01b85231952028cc6bd7d1c720da3c3666505c97,c0da4be88d763145ed566ba72465e658e33c1926579840acbe20bedf4bd1050459c98080a2ce80d9f64b3445735d311465d2aebfe79a4e87de27c2e4b376b97700,8dc47fc02820f95ff994aa89fdbd0513a885aaace6b06b85c78eec1083e903147dfc9eeec034184903bd102a0eaae689d50bb915d4643a77271a7152f5fc976101,c077cce2d56f58622191b6799c388febbfe68cae10a35d82fb25d4ecd09910d37173bdf67f7ee428ad2ff3baef21c09d137ddebdb5df23b9b363094d2997713500,bfe33cd4b21a1cfdc8a51c9142d766abe055461c2562642210bd924341f919a06b2286df5077d88741e8fef0e5dfcf05a127005183bd4f0eaed38c55bdf6974c01,020a2e2d4b7e6f0c7c840ae73a17c2704e78d602d885e3afebeab893d485e58f2e184fec150bba921a476182f866986fe7b4571080dd747c5341a8652a618ee300 +fb0bc2163dd1d7c4f0d9839736296fe06e72b8fb2a1d5530176cc36f66c3ff16698cefda9488a6e725663200aa271a76b965de134224abc6df6fb3acc905d96caadb16a1,b4fa4ff9200fa5c94951ab5e74712a0a21a2de0d39cfe3d6300cd1d18604b8bd,150be8bc62f8c93c7f676450a9079b365d993f6a7fc80a70a35b4b4d3b49d6c00083c2744dc3aa37f783b6dd153363a14a0497b926d77b826b42ed0e07a0995600,41ed417bdfd85d56161adfb556dff0d5f6fa8c297593eb59379e43f25815081218fe64074a1d983966a4be6593de2ddc437bb4fc992d978ea53cc7f3a76a557c00,e08e562df9b5bb0122f05aa01312d7471641099d5f43b76aa45d4c005ffd62d91d3601742a9cba8ef9747e32552cba4f355ad37da726374a4148edee9006a15300,e630adcbc633a128327787db9e642bcb2c973f048b7cfeddcc511658d677789a12b530c623004fcb118f474c8290d24757b901b0b55458791bc41a67612ed5b501,8042349daee5c72b9adca6d150b83d248b4f096c4b2d932f28c0c438b48d359f1367aa3d59296e06054f819a3aa77d705a7f6535c6977ac7e8d42ff97a65e2cb00 +152517f326b9717ab9cde0500efd33295ec1d8ad28e28c663d9e9090053698e40fad4a0e124c5469ca1cce6ec009abdac572d7d32c8ba6b77612ea8985f1a0f67ca903d9,17b80017bf18147e137b4a417837f6f2d62b674a1365e500c50181062654b28d,be3b47ff88d86fcaefae7792ab80768d783ec85101af0f27b4b1d567100cf7cd5485bd2b573e089c58c5584fa5830874758e2926aa58052ad3a77df4f495374c01,3ee0e23d51b4bb568294902c4a4caeae1a98c1a9bc1f734e6cbb058ef701e4241211264a9e0a8ec19fd310aa7067ab0c57cf94b6fd3d9af556f9173fa945410300,41bd6ed0111225bba615b10cd479a4592646922ea2b2caedd1f1fd9f7865f03c30bff2ada766669c3e3da290a3e3c55a630c2f4006f26ccdcc028bfe6cd6da1200,decd01c4feb023b9ecb117064d43319e55d3e800b5f0deba45cbc8c72eea1b6f042405ce6a045c363e7f1079446bfa020e31bd4e1088a98031eb92d56553343100,6fe2c942ec93458047831cf37f57fd61e6ad656aa3168852efd5d9fde57255a24f9a2e4b5ce1e0b58055fe46b8cad182c9df4967e4876f0def03dc73eb69cd3700 +13aae7d54d605b4ce4cd6e0878fca59fb95ef88d732514caca206c9df058086038c1038631074cc4c18f41a3ad3fafeabd60eb8b90e293cb4cc1ce9686e4bdd2fe825dfe,f8251a2a24c0ce9877fa17e8cef276829b1e62fb963781f9cd076faf579179ad,308ec0903b104319915fa8e9ff9e8ef620c848706be21fbf018776f3b1a66fba03b2003492962110b1e396479175999a47139d10fe7c2af21fbe1d435fef424700,ccff97c6c2ee979a66ff07bdee36f5efe2268cd245e530881463dc6042b9604a07c0e1216b4deeefde539caa6d1d9cb032fb3fead0df56ae8f6efd85a785919b00,d8f3cb5104b2615617cc3b844c1e6a643996a3a9f8572f005a06729e6763e9f374c697dbfae197360bde63dafc9e04e604cabf1253854214848071771b8d1f1c01,933d571f9ba32d0203d0c6d5cdbb638bfe48afa4db7f8290716bf4d98fa8cd1f0d5b5f899e81a7d68c779e934330089979765dabebcbf4abb6380010aa50ec9b01,4c796bd9529356e3d4f02bd283c81b850c78e4a710c544fd3d47da2840b4af151961debb4c7bf548067fe78d868413dc5dcbdfdbec0b6473be247f822f03828500 +4ab668c87af51d067fb190f8b73a60e777b8c244b8d18bf9e20d7dcb5195ba54fca2aac81933154bd85e014f891c47ae5b49ef51c90c91baad5f2f0a0293b294a51d2ae9e9,6899f24b18493c55a338ea52ec8cb0b76881aa9926591675d55923cd14ec000e,1d7b68ee1b46317789f6e7907b603fc1df47f10fb0df0b627930ae2f8ef9b08d41e164ece5fa7d764e4ce64b36f6d9ba5ceab9a9e1b8caafefb506ac7eedaf6100,730b89ba26efbec256580ecca147d5fbd73b0234e744e99cde73c2233aa133ba2176030909855043b3fba1ec6399b9ed3f6784fc6bae53c7be029015b8a34cd301,964c3761731a75ca7e427bafb91f5e223f8b9ef4a305f0620e780a9fa0694ae75f6fb60c93287de42149d938d7355acc79448672e689118ded066ae767059fa501,5ae743cf493818aead4fac42872ff80846a16e827d2bfad650bd646f12f78ac8270f9aa8103a0de93703bd432e4a887ae2f2cd6d380da74e10d5ca36ac97f29800,ec76e0deaa81d41450913941e73517c637dc0285a9a0a348df06e3ec3e063b666cf8b02c327324daa8a9bae40b21f44225321d04dba73a0df5047952eb560d9901 +f1ad11f9014d6c3e74b4a138d29535a325c37a1977069758764eabc75c214a636bb3cf24bc039407625b5258d9719207e48488f415e62b5a539863c43acb73a6c2574aad0f,b3a8dfabeead6bf9cae9d3dba0dbfc15850f07125657311888f2fee41664ccd1,e0f05cc91746c973d7c71c44c5caf0828f97beb4186f2425febef2b0fec74b4243e95ebabfc73221c55c1c243b5370f47e7b0ede56396a4b80fd9187fadc123401,41db20022a16bb518d001f7038a760a1037adfcc2222a13cb98cb25d90c705d402c18ff690f62195441c104ee2acb9afdde9b17ed69db858674d598e67f6acba01,c32171e93465576b89b7da786bac9cebfc448b51924e92b212240a45324735904f0940286038d945b37098419462e9c57d7c2b99e677608d8904b659142ff65e00,9fd948f77fd5e9fb69039e082604b0db5b859bd3dafed23c40da00a2d106e98a0783ca35d48daf96496d26badff239d514c0058f60eec5509e2339353819770200,728d2751496c8d510eb4df6afe023634475dfae37db4e94ad48abc455a059ad622298fb328943c6e843e765e4dc507e59b8c7f5c2f8a2cc975534b6c375a37f400 +5ca8e5c6e1dada5f551b1cad82b99a6a891ab08a43fd13ea6aca60d616c5006fa10049b60a7d2d00875936470ceafae67a5877f9404e15c7d29e15e0c171bcb2f80410d7db,b3567eb8d77f6303dee86bd0478dd3d02dd470bc7dc53e11ec1022511223853d,e0fbfdcd8a8418f5e2e3885e6ae932d2e9b23bb178a96845b78256e1bc2527a12666996f107cc04e78263fd1d4d5b468f6c5dcb9de01ea5df866cdde8abb430c01,9bc303b35170ba8cb401f05ee94506088ced0617e1e26df319a070054da1d4db2bf56acd83ba3b1727c8c740bc8fed6f2a6ad1b307f0d7bc20def27c5f77cc6101,56976b113fa5146da2acdc34c417dfd45b49e4d7887317441a82809e5025bbb36dd3635617ede255cca8adad9e6848349661f37df81842f3bcde13f0e6e8260701,85a39c481172a06817878bc2130701d27d2e050bb8ac1087bedcfb129866f04f74f7b533be7792071697e4115ccdcab2afba23e03ff07f6fdbbb253cef82014000,3d573335f2595db38f58324097d5e9fbbe74b233f1345e38555fee0bcb4763160eaf316afcb29654e9f5aa2ed70a25e20f549a1e1df477b7e065a77d378a1dcf00 +8bbf37d48171a52152b4b19d8ce64125aa9de749f1ecc697492909e833c2d43a9c1c7efa61fcd166c35af70d147e8152a211ef3dcf50c918d1e72f4aca6b83ab43185d1a0e,a01232f237f8c540ee1461f4d3ddf0e931d23d405d72722f37198dd913c35053,26a2b7ef6ec6147b91e28b237cfbce5d940144b76741977e5370b413a6b2a8ab327a024c2a64dee0a00b7dad00d6e4996bd35769533136721aaaee9e6d55b15b00,22127dd508da7511a3f28398ab312325d0fe3897ebf87dbf5a0c96a82cc288216d72eb076faa51baa001d1345ff0a148a6ab7f4bffb9bf5e216606565dc9291a00,d323f07780cf8611107c3afe5531f5b20db21ec91b760b58021c95203bd616de14428da51b898a880196e026f1b8a128acb42774bc9faf7033ffec966aff189001,ba1cb465da065dccf1b2c5b1999e6cb50499aed01e6fdda2d8b03dcf99d185205580d80bb3827538327b84dbbd9b78a1a4be1bee7e3c6521d56c760b786fe82400,5b8e08bd2d205febef56dfb5e5ec2babc3167c0387bc942ffdc018d00a80928a5cf9d2ca58fff429bc380d85931f50b6695ff9daf7fb9d5d51af89f6e5b4162101 +cbdabdb5b57998f091a0dea3b9877a4dff318a93eced50596e44a93480780de6acfdceef54ad01cb750bd7dd682e91fcdaaf1c3d5871109a38549401519a7939a60905febc,6a7d7788801322f76dc9fdc5e24e996a6b59969304956b4d271326d60d017b23,a8e49ec3e8e84a60c113ac05ecbda4b4cdab334a6c289b41f28fe00d692b443d23e0c1d1a84f7bb9e79524cb6469115092ef8d692580f48f61a14c52b00c32cf01,61e4b1e6bb2c1171435d376b291d89e83cf51d622a409db6e07b966ba6d95f7f08c8a152613d6a4e11ba13f2883982c8981a7fdb85e79e2f6230b69fcad216a001,35cdc0d69522c53e853579b9474211193b686de6e3eeb87e1c17c0a5c6cc70a4404c3dd650135da97dc2c7f593a403d726a28ec6fd90454a125083f842d7300200,1e925c692920df3c86106a24cf981c240096c7d1ec25ec8f852b66ce5521c863233d1b9cd3d770b7882fa3874fc8aba72acb99946bd65a8cd4c1e63425eea7ef00,618b73b46ae5d7a3577b67615a28dc58f04ae57626cc65ab77ac36a594c115f97f2e118dd2e134a32929ae1eee08a64cdd83b0e135105aac6470f8dd65ef0aef00 +22addbd7420e81764c2c5ce71d1775edd2a1f54ec97c542b2597ae3223d47d554f0e13fbaa6286d471be1a165541fda9154567980ea281d38268f13e62f6a002deeddd8681,fe9e4077912818b6653ec36a095dc0db2b9f615947ead6b09a8c9f0e68014df3,97802860c4e5c12bbe5fc6c8f61f0beffc5eca4c5eb3d3c514107950e90215415ee96c101ef6c14d7665a5850a63f47c659ad9bf1f9ca129f26ec333ebdd8d2d01,675e50e12127a5feda1f51da98dcc70674cc459f91fbf021e6a82bd9e68bff9a6aa76f6f750024838b5422ff0ac97081a24c24bfeb313c107e64560f1c7367ac01,8513ad6954a861f327a08b130da72531c88d548e1d0c14226725440f1d6a13980b1b7714317a2bf35df6438292cb1d1e523687e6ed3fcccfdd394a40792093e400,f4263b03c4724751a30a7bd24230e15bbb5ce2ddfbd5b765c1b2e73ce375c8a42520195adc69c6166b254bc543a846973d27fb5dafa5e108daa25f7ff3e6bcc601,b5ec2fd0eae43ec1bf73dc2b0e9a1f0b4f2ff58f7ae370700df9762eeb5be68310742ecd86233b5a64cf4d04780ee87e76caecc2c219e862a3e115568f108f6000 +4b07e6303e9c1ce43153db0a2e55deeef286ce9cb401f453741da36924c05b8e0573f0239c3db3b7eed02f70ba59c7f2b73a79c035eaf1c5379ad52eb344012b19e297a09f,d9e093539bba20b7c5ff728a4ce0963ca0ccd8c1f582a0eeecc95955bf96e79d,2232defde96e99abc2d5262959ebde7c39c110876a5d2c24643c73aa6dac21a670d7b08b613f7c5f661560c167cb06ff92384e1740837be0b06a1eb2df9c43ba01,8d6eb0daa5a309e086c3c98016da53e02ffd8700a3fcecb4866a21726997eb5577e48a2aadd93a1c9777b64c9e70926f7833edd54d451275e0060cf20bdbed9800,1019e8d7c6b96fa634514b7d5e8ac6b678cc5c631b0ac0c66595bd134f50886a61dcfa75e1b3feb43d1aaa4235a476669a54b54cf81de9d5d14cf6258193aa3f01,2afc1443f18a501a32081f7eb0c88459626ad27d3d07d49f478bb1eb18f09bfa2bd87da86ed906e320340efec640416e79180e0c71ba7d8c6ba58ea5055ffd3c01,e368dd7752941fac2332c2beeca9784451fcb344e873a0f4e0efbcbe9d0a29a37d839293f8ef51f8ff9dfa42d7bfdf708b3f80f218566b05ce087ef96dbe9c1101 +b1b41fdae00f05d89c149a85f628bab409ad5f331500ef7bf0d78cab1e6999e653b4385d1d98fb9a9fd84c91e8949fe2f69a8bd12bd282043b9969dde5aa54e03c844c7176,4b2678347d7a1224d31ad4dd16e62f1e330b62c005db65e8a1310495622f0425,ce0f6ed5947db9fdc588ab3863659881100600dc1198fbef88e0cc3cc4089f1c2f9602833c7d11f9abf534e1bd35222b0be937f84ada4a7bba9ec786dfc899e601,ccd31e0a54fe89eae983ab0da76879fb73a5aa1784086bd56dc989955f9c1ffa36bef2bf5dd82bfb934090f7c4dc1b9e6a31c2319471c5b650748d3469074a7c00,680398ff20259878617b164c79aacb1943ede604d82b8abc216f05517624f9720f6eef79484f76ba0ea06f902946b2e0f5de083145d882dd37117c9517a5a68501,2b8cb6a633e6bea15bc9a71e155f758190602d038de449bc78884de4eb12668e041119fa7b5b4ba8b26451d2faa789b6e9ea4565406bedb249330f5ee001b29a00,0bb30747b606f189f61527ef22a7d4a37beb24689ce8f5f51d8b81d81cdf49203c709794700147d49bce7d2dfa51d14f29da9790bcefbcaad9c0d524653375f301 +4bd9f1e1b315d54b37be4691e90ebc93b3649cf0ddbff17e9e04b46235506f2283f1afabdf9486c6dcdf7eb0f81edfbe99b78341f5854c85a484010c0a789b461974afd30c,714d12cb1a78846ea2085aef8d5a0df0865d168348233e0123897f618e53f79c,02429435db9a4f1c38e9fbf1006477bcad08e2fa7601aad5419932d6ea294bd67cdf3362fdc4375ff80bc3c40b3f13080716d19d6f1453b4ce125ec1b8ee50e400,c0bd0fdc964d9023538f7e55447fbc3da2bfd4447f80002755fdf18ffad7d08a17e9e92115dd3ff16dec29fb9a0bf29bffe5035c4529621898ee2e4a10ae9b4a00,861a70fce20d85e6604ed6266df13086698c6cf5ad387f71a39fea92cdaf46035085edd363d76b3bff2a51d35c06897c460572351a0a1a674dc3f17c9f6887aa01,7a62b737cfb63b9594fc5aabb55e74084e4234d455d203bad0afc3931fd5a10d3df5512be17d4482ebe78e463938f40c807e60f4453545efc76e83d7de797b3e00,6204a12cbd132f8f5bcd4f5eb011de1d0b50a207dfe211f29ae7559306a35de4405c4cab20e9ed0622aebf4ea7643254472a5a10f790e4e95a426a973fcfd3d800 +ba201113eb3b6372bc4db18759cc2816d1a566999468a5602d5a16a98602c598ae24d5fcbb44aeadaa975d9ad2689cd531e514ffa31028caf280751b3a4a1c262f95359f5d,6e3a84a1c6270ca32228cdb51f1cabc0c7302501b1ebe3b3d52c02051f9047ab,1df06634c255d6cd9a1d3a57455c129ec61c807e8b919f40e06370d7e4dec3bb7bf79191f78aed2770f8dca5e35f85af531b8fc75d36c8b39bc6b7fdc01cf83800,39b44356b1cb601b551d089a4bd200e3d15402003523014858d239e1d0910ada5475c9b9056ee0b43ff4252d644fe18fe048a372547ae61696123e7ff87ee1af01,e168d300e79d6138402c6cb78b162af7e330038f1b393c235a66bab33cf2ea4723fc535df06ecaaec495ddf1ceba6ae6ef487b6c29113d74b0ec42b54b77e61100,4bb8914cdb79ef2715141dae542ba135549dc4f9c19f7ccabbc3b34e316f5f51703f20cb057415fb578304cdbbccac5c83498888b04519003afb3bf34e867c9e01,939975e1c1e1a618a34660c36bd34c530fc5574d33eebf59eeed6579992661324b48e9855da9fd6f768c6b0815ef8dc1641bef6b7d49861a8fe607b950a2cf9000 +8f411403eb0b554cff85960bd0ed7e2ddfeece46ce8f634ea826508b85e4dbb126706596032def6343ade14591338210c89c00bbc14e5748e5d1b15ee8d6b0c9436b2814b949,c681bb627cbb58b7fcca194b874a11ef34cd02d125ebf8f83b982503861aa20b,4503302a3d218c1885ef169be3fe9814b3f4174a6a79d2017efc9af51df59ab61e65a3c71dae92942c5a24ce622e7f91fc77b23254ad1eddc9b36b0e4db3595a01,a3173e40749a9d57b0738a7567075eebe6796d63660d41fdba6b0f48f76e72834608bf350536d496f8815361db98253c4dfff2b7b24c39430830644a915da30e00,84dab30ca8546f2291055f3ebdbbbfde6881eba1a0122587a525973ecd1bff0a573d1166b07280436f389fa5eea9e29342fe23ca72688bbafeeb48f6087c0d8f01,bb4b44e0f0900e6061db1518e1880c41475b42eecd953bba1f6a5c6f8eb577456c67f819dee604434d6a6cbcb6e1579b4bb84e0cd69a536bd9468acf8466e74701,4d6b5b85e5fa149a4f80a14ba45ea139854e0f8b71e67a88ba3cc813fd18a4934d9e5057e7f439b968e623383d67089993802e165ad0938f0ba3660bae36478601 +cbb6132918c60002d01b362a1dd95d2c0653aeec87484f6d1721821ca9b1ec6ac4f1db06190b734f90f6d6f302ff2799176e06eb072e6ca1a7ad34ef880cce30cb2ec6b0c507,b13c4846e40ee62a07d88fc6e74f7a16f4eb277e780e49adad5b06c942c1975f,3ff1da3f06ea98d4eae5a7e894e238f5d0978810189c7fd0680eadf059461fc754f0e2ac28586369d7f4cec851a47adea045aaa874fb64ed9add8a78da2f37c701,8ec511f4fbac0d7a2793a6510cde53a6b5618908919ec6534224f6cc8a9236ef7f4614b6643e2be4d4537dc4d30b5ad0275d30b115b1d914a3cd89f7b4dca1fa01,03e6803cf69c966ae1710b7454901ed69d6181d93e4a4cecae3f3f36ed8c3848760cd0b8746e1d088f3daf69b585505db52fb2c7519f2d59610cb17e7678e04100,5eebc09d7611d2b77fd0983812be64928d4d250de3267c59002b19f83bd747522ee58496dbeec495c68159ed8e387dd009f7ef05b952fb949af329c09c7a827a01,f29ec9b361e5b5626d6dd47a82285789a9f4edb044e5a7eb6276533221e0fa603abf3d583f4cc799b1742010c33710953f6abe63206d552fc9ba500fdf145de200 +278a730b0c6e47b95036d1a33a32317c67007d1a8970ce70807ef8d56bb6346577cf706e99a015403eb6612a5d5e9729267d4a10d46aa6ee9617706b4f3180a8bc6069a2840f,1bf5d50fc568fa2b503374a2507b8be4320406ad28bd4e42b65e8777e919a679,4d98f59249ecedc2fec2dbf828e3c7ec61a8d7cf37f8ad42a5249ef9aa83fe6b74b0002a239eb2f2151b615bd331a999992e7d5e3ed2a421c989f6a55c465a7500,01486446e269b1d476f44e22eb79311f38ccdfa28cdfab4f2f70934b90da0f6d401f3640f648992944c2ec6077543e42166fa5164b7e6047b8fc5313ce09b49500,338398eeec0f9af80b581eefb5f38cd3ab5aae956a215b07155f37d245a41a723e6d6e1928bace217f9c84911329d1223a6b9d77d34d4e9461de0d9680360b6e01,1903c8cc240dc57037c9717234bac4e2e735b667bfb645ad1ca90e1812a73ebc26f075c4ac1e8f34d9e7ff7ad22f6c9aa4ad157d898fcf3101083e5f776fae9000,b616fc7ad58cf03d2ace8a2bad3baa60cb286c5a59dee850dc7ed4dcbfc46b3b52824c5d2088e4e4ece3d1cf8cde0674c6e5f92329019c8d9833e712c07854a801 +560cae5e9c48aff538ffa5c4d532670a7cdba99a4e00c1f80e9c977ef9cedfbb4f109324aaceedf8eec0a2bec423a4cb44c11f56776e97e6c08be792e6bd8a6d82fbe2483f28,5dae49309fc641069dc49ef251c481712e92890585a8287a900f8e70d3fab56c,82d672c1a6972410c3c7f40675ddac87c5b623ab14a4c8af236855de42ba861a77346d1b4ecad4cfb558508cd7a5bef75608918c7a8606983dbe765b14c8e93201,be7b1baf08e92e0b5aba8110b15854b11a712967e5c45f0f5faa7ecf9ee5cd1c6b237f0a8645867cbbb29d97c595ad986c92f319b71d95ff4152c99359aefff701,5fe013c2dfaa06d7cb5cf03c46404e50711e18bda7a529c89d43168cf5fcaa5c012c77162497184dd038704afda4662a30a0da4acb960cdb44b56d8a7b09842e01,7f0743a62c934c7fc5cff000942e9eddf264a6ac9942ead26038d290104b08c45c92ccf039be63ed58ec8f833510f7c3514cf61108d8075cae9ee7385e2fb62501,9f5917971924511e680c6ae7de83062ef15ff5cc7519590b616419f4d17c9a5371dfa4e642b54eede8f94876448d67788bc5a867584a0a28a857cb706fcc5ad801 +ae6a38463645c39aa7abdb35b741e18756881222540dbee632fe0de139bc9bd616435d50b87699ef2408e35c006cdb9f1289051f3e1ea364ee3245772f3720eb38d43ddae70d,a65e2c0ecef753d8a880a94a029a455f986fcdabe8b3a2696456c0ad41bd8a8b,2e9313225915f08f73d73b652a0db3663c327a75675703045325a18cb2177b2d2cd8e5ef7573c4363e709569d3511e90af390c0e3a89c0a9ee1067a2977af15400,a9d4ab93df5eb20d50a2e754ea46c9baf413760910a77385898ffeb1c3de13ba234119448f869858572786d9ad4ede36492f235b2b4e9e51b6cfc09ef348ec2701,48fcdf947c20d814cdfe33ba136cafff4ff3bdfb1acac4b959d11ee190d530b27c9f083e2bbd8d8cbb7aa2a10aeb4d048f50ea82bfb9967f006b80308d07666e00,78d70e3b45bd835522cd2706660d8e1c34d3942272755e4b0cd9b29be2cd160c2c034bebbc90b0d2902ed11f94919a73585b0ef4d4ff0cf515ab4375ce81d3ce01,3be9a0d64090c819a6c62ea6c4d33d9664a6212f0a606bda219794eddea0af950df870c90f500c8e4a3d1a8c69ff6edc8e93ca05beaea790578a683e2c474c6100 +64f4ee55c0e79d7d428e89c456d59b028a30e056fc4bb66f258bd3a762233ed455a917e1bb9e13148420b40686a259db3bc1d13554c3ecddd2e8781e3f571aff2910b12e2048,d40ea935712bf141c5a8978c149b9b48faa8b69d10961ce0e5875af60222c1bf,94789217bd84b15506aeb594c0ac2e1d283bb3cc63dc3f8758859c93b4b08ad170c5d7d4af40d70dedbc952170573132330d7a6cc5271352d98675650b53d12200,c1239d2b6532dd95f8c1113a6031ebabe9fd2f46ba09cf8d3e9574994c04a2045f01b003209ffa144a1cbc58e15791b7cc93a7a65cdfd93e3f1e645fe1ac1fc101,25b59dc41ce17c91d0b6f9186c202e154cda6fbb31ee6be3a22b28106e2536201b1ef0fea0ae0c5a52905261c2a19d10b4ed1b88c915ca8b3444486b70138c0401,9dcb89b94ffb1e4a82f4cfb470a1efa5b6530e8f3e8ab67c40a869cf57eadd616fdc55a44470402b39a9b47880cd059e5e2a03cfcce1b4527cdefe941b7cf7e300,e1571bbb6561b55a85e5237759d1ea4a35228fa9192e4b3d00926879bbf77c360d35b0e08b36adc7e6e2951e34149bd03cf93858e0290f708df794a4f3f4c64b00 +913080f088ccf557a2bb7399e90f5963f4f2cb6fc10893460a97b632c42147de1258207a29005075b9c30685fe3089ed916ef2da90e456e48971f2c564fc0bbb9f11cc063cc7,cc6ca2aafeb9334b0d519f1bb1a76e97b5f58d8212284187b7762d3e34d6d0f3,ef34b7e98137defb5bad9332648e158a0db4a6f13d89787e23d59d885a30ed8c36075a2aa6e5ab1cfc1ca20383c1298ee782ac2f3563cecd63bf2a6cc1059c9c00,4538cf864e7d0a41c49bf5c7e3a1c059741a1cd560dc543f977794d09783b25b2376296d84f5b8bb90f6a6428376e7105fa2b8ff96768669482921d30efbde9200,50b1dcdae9f67fdf2d9acb5847eaa0a7219ed404f21c1340e25b570e867efb705dc9d7e4406c1f2a227f9c2f1ba58f03d377f28503c802d196418b1db9f8759c01,91e6dffbdde438144dfbb8c8f779758f4c197cb279cafdee46a7ac7e1f0384f159078a29d85f22fdace68a0e9560ca864e664b7946e1828c4ee795f0f7ae87ed00,d03cde3fb0c4a5f19a3713836cee7b8e95ccc167728367728bd37df7ba376bfa6d8ef515523a81e1708f67afb92b2b412c6be21328a3dc8021e091ecc1bcc76000 +609331658e0a6c9a652d58525d100b1b32d77a95deedd2d6f6f0eb2eea01b54e02dd4002fbc45af5ce9708f5bc6e15b011b1b335b63fe9aa12377e47708657900da06ec68710,53873a12a77f20c573ccf2a3e26fd1beee5a16b301f59a07b666fd621960ce61,29cbd335fe596b93c8f73742bec9c2c0d882a53c4a6f06515db25a87fdd2a98d3f0b335fdfc1a179ded44b665d3c362a63adaf944b21b2b94c39a08c0f2b395b01,9aacbf2356bd4a94b36dcf9b2db3fb25d5d906ca9e468d5168c146f1d6776b6562f8a46c6ca3ef6f7a6ba026cfd65258f6b2e95371d3e63f57829eed9c8414fc01,8d64624825b8f57b0c1e88ae050b7e5778e3a9ede8eadf9f292dfc14f4c4f4db7c89bc7aab2f79fce93ae019a0a75915bce8f26d68d4df86cf64c5c45a28bb2300,8ef471eec96f42c4a68134e06c74a49c9944b295d8fe3d0f1c73d36d9b49553b4747a0c09efb78722cd0952e40d9f66c9627ddeef3917ac4836bd3789c308c2501,56dbc9f17f64d21d326d0a25e99392a9085e879409ea9e9b08455374177ed97801bb3e4d90ef2fa98c1fc72540ff6d74245c18892c32b9d1a800a6d782f9e26501 +2bb822314029f689ac710f04bf499ebbdea0529a798114e103027117959cf7e44492efd7feeb0c1dd68e7ea536cb7280967eb8d82417606fde7cae42547c164b87326bd93ec9,1531ef2590888f7003299df90998def7ba9f4053848d7fd5de329490744321ac,dcb074daf52cdbdef51ebbb58af800191273b7a6000a34b4075320ebb2c0855c7dfd1706c6fecf9932bfe41cd679baf117c485b321e3cf52242fa5152759fedb00,deaf2fdacacfe7cad486ede8fc92df4fc80013140ca322504b5e8d36f67287501f3383ccd8b818f2fd5f7fb5481aaa817e70a24488f64b6882068a2ca47d8bec00,b9b199937690363910638e0d38d9bed5a9745bbba2ffb3bc77327cd510148705499c5e15db2fa67e5dc75bed8b8563b31f861c4e9ae78812260438784429c48700,0fd845292daadaaa3b4ea98efee45d5a9c45588ffb7efb07c47af93d194f753c0d56579c96405bb467f3467ea7d11491fe32f8f0ec1b107d1e9dc82d07f3fb4200,3915227e1a5a875a0fbed39020ab8448638de9b340709f584a41b927d8b36c573189b182ae863b62384f2845f9287cf6e024598f0ea0bf568877032b874e60f001 +565de040b97d4b36c54d96b581333917504a3ac4a61264bf63fd16352a5e5b851f2d6edd6d187cb84163ff682d6f93fabf3e866dd0fafc890c19763e5d707ee080c763438f36,0a8016b79bd67312ebbdbcc11eea299511842555ac6f7c63ad4ef671c63ddd21,70c5c0953e0733625a4787134ab0f6f1844708f6d4ad312443d75ff4dd2776406991cf76d1f7ab674332d8faedf8178350ef4681796afe76daddedf88cfcd26a00,3950679c8e96031f67ded3f1a7e0640b0bdace3da8acb316d58877fb0d82da06237ee227b21af63d6c9f3059e2d6d1203973651de6f67696793f7913194855f000,a1d33d3855699e86535e4956ca226eb72e6f9c43d26afb2a01fbb1bf9df4549a3b73c2114543b677034d76e385b23776ff36ed4c4f4f3b5c1b87fe5440f195e801,4dd03dec208547fcce802c5f0523a2be5b4bfa64cd8ead0eb39e3b85dd67f071294fc5b63a52426308a5ac48f3ea1c17b7f2facc0c7e0b48febfe93c6f4d198400,cd34d0d7ce2683d254db9196880d8bf726f050a2aba764dd3fe1c0bbe6cb46b034f98012650c45077c075eac243a37003088b68379b7c027c4023ab3e5e2fa7c01 +ee8672be377dd0473e95118aa0ae976555823ea0e3b8ffe4826e0d856025699468ec8f4ec6b65fe5f0900f3fcc497d9d365a6835233659436fdfa5db3f5e4895142abbcffe2f0f,2f72d798ed9f7be3f6dbff27bcb478b81ccc12fc316d1e655baa3addb94ee6bc,b647384e31ed842a2e1bbcf5b0633fb0f0460c45068e503ba305694794ef6b3654ad744d27f8b5ab12b058698fc6d5caaa7894236cca1dbc350683994b0ea7aa01,129dffcb08c665777184fd8320fcda4cbdc805d5294afb7e9a48254f248b772017df0e1fc195f7f280303291c8d1a49f00fb9cc7654aa7f009b291d952ffc50500,0cb1e1ea28c8e1e9d10add3a49bf4d95a73e0e8134010528df40444f7c9819a40503a1db404aa268ce067621931f2d770108962ed7ae19b1dc2d4ae78e96e47101,612df87f0472775af332ecc0e69d394b7bf61f291f7ad4f76263156a53fb3f2b645aff899722e6f1598b24bbe945d6a92f591c42c28e09a255efab0ec4e9132901,75616f061be9bc8ce1184e162a47684e4e15dc24c0df6a472761c51054986a4a7de2b800b121d61469a5adec4daff25fcfb469b563cd3dfdead86c67c80d274101 +aa416f7e25337babaaafbb5aad950e6b9d7226de36b7374a731c95ad2e31e4278f8e93bdda30e7ab3951b61cf725558fa5d5498b2bdbde3c9669990a1dc18b645e1fb2d9d14e6f,90309b8daa443c1974be2cbe987a2f39b8fd7e74ddafe8162fbcbbce913aea32,4c65c68953c1859795868ecc781339eb6cd733edfe52493ac5fcf39df96192d02b6f398c5f153c8371d839fdfde2190cbab39ad9cebbb5a937cbd7ded292e2f001,d9c45d88308fba95a8e82aee334e8781fabd4b99e5edb21d462e8dcbfaa41f9768658939540233793cf28124a70ff118434ed43029471cb63e4834935a689bc000,ff54daa597b62573ba505d81075b7c92ba99920d806485e6a219a1057167ffb64ff62889a486c46c94c8482b9bf93df77e428f2075123f9374110e9afb4e5a6e01,b02f071765ce93e9f3a4089a1fddcdd41b6f488e6ee94813308a87361174149163c06ea694798802303136e8b9c65d7455f2ce75520143971b17f4314a1b28bd00,be7f363c62b73ea61497e509a1417f5e24fd37914fd21ca6a358f4584fd920e43dda84a32774d545c016cbbeb482a6acd1dabd9540bd60d930fb692c3220635801 +2a627d727e0f5fce0464470ee15defc7a0f88c49ce015257c28cdaf11873e6f7c48c09ce53f6d830fc572de413cee59588688c33b0e46a1b1a2cad20e12ee81d83800572812565,998034e1cf015977b74ebe7bef909655e5fc4247c89c2d02021c34d01d8c5ce6,90e16f56bdd1855a9c3f9800cac1a4e08c34533d0361eecbf6dea618076f595c0d4259ba90a5848e785a901ba2d9e0dd837472e0a4ce7ee0a13f950d7e0a218d00,7dc6378917f23e9899c4644557c3686eda32e0752f069c8eac05f19ab858d7e27ed3e2fdf5e20f3a7041900c1dc05eed6573d08b57468bd2ff505c3548f1ca5d01,0396a60355d940d207d0fa991d32d8bd9fda6613e1780904e5add9f1233b0ca42336a9f9dfb96500188ba7c973905743e52fa7cd34484e51e867770f21dc98b100,8322f8d92049478db85f157b0b0a39200d12f0078ae0249a4fb8deec1efcb01154dba4a52622da6729ddc948565dd35da6df2aa504fdb156f29ce4910ef7be2a01,41fe52a8b517053f7ac1d4f6dbad40983c2d1bd9f72af21f23b2c0c85ed57e381195ce46e1fd2abd2ffade194d8f44ed875f5cc9f92111259e7b79ad7969a80600 +30fd3b1d1580762e2b848496c717df8163e2e62d5e661d0227b2fa95c360b884096673b5c9ba0c180bd36f8a6b829a400e54f20cb43f8a80e9e80efa4cbcc1b4bb3a6581e3cea7,6160674bb8495e363f290f78657bec03187dad296a566a8231a8dba40871f3dd,67b6530d817af3a55762e6b46d788bf947728e7b699455f99095420db8ac024f5841d2976e991ccc4f3ef41421a7803d2203bcbb8445268896b9636874cb3f3800,56f406691dcf662bf3e582d2faebc114137adb29a8894790546df25ee2feda1220d52aba77bf0e21218356220ee7c2924993a89a480ee43378fbfbcbcede850701,cfcd4fbb88564609487d4ae3b39ee55c6e91c04c5b463ab7d0086c5c95b06a9d7691f2a3131a4159f3d3df6011424bb15c66b70c3a2c495a705143a5df54b82700,a8e9efc0e2239c8060193cc1afa22696496ef1a643717ee9eb7127ec5680019d45516363c95a02444e0ce90a4102a199b49a1f07d1ac5cec026b7c3fa49607e200,460545b38cbf7808eeaf00b4c3dbd5289771a7828bf5ee5fe6bafae23a1313365d8c2702d4b3b017304796ae0e3ef3ae06113807d0248fcc738bc417d7df9af200 +1d8781f20c90fd533406b2672837df7964598a666480c95b8ec91ae37b1f749fc4df68e3775e008c91d7e1182b0d6f5315eaa70a97220ba6a98276a8fa9c6841d9a89896d0c97a,9cee19ddc167454022fe1d2adfd5566ceef92e7fd3921ae580660d38c874835c,63708f782875877b03587be0876d8caed8af42ff16e3dc851f50c9cd71bcb2477850ab8411338abbb8b66f242f2885930c10171e23d14db9f34b88ae1f371d3000,983dc6ec65df337162e42599dbfc20af3becfbb0503ab8b9ea1267002860fab51d373fd4273f8273034ed7a3dac38f17bb8c11dc4db2e15568b42e38ebc4166101,bb170f0210383cbe284a2a7d15e4e8f6db31bb6d02a27c727b2e0e05edca3f8361e7e4ab2e8c8b3d955eff61cd6b42d7f7918a0352ae9dc4832c12eb81754d0900,b63e37a4c21f99e6e76dd98a124b5d467837439b7f3c341a927cb8d8d87821504b540f799c5540cef6e736322a9108b131db4d1ec9b1416c448ae1d39a0bee9801,e47a1ebd3032ecde635defe4df49f2b3fdf63cb4ffe1940736c2be28f755b8c8019e5f96ec8cd82aff8196d59d59d395c7f90933db38ec9128a94cb67a1010b201 +051eb942622b74b4a9cce7cf8a8407d6fd35d12082c9cb985172e4850d6f9a14d305095da79d040f2eed820ed4d43f91ae149bac4d088422d661bc28ca7cd23b51fc76aff4e7e9,1151342c597accb33eaf4e21869a7764ac8d6fb87bef9ffaf9c58507585294ae,7a0a8fd5d9f7f37c783bdb07a89194fa130c47dbff4d8ccccd96c24aba46006c22dd3967a9852796b3b637c3d410a539c306e9cfa9897dae68c62b6041dcc81301,fbf4304f411bc1ecb51f8eff1996a5e7523a895c0036430babc29b3c6c21f99b5c8d5f81695cad985185b4b02a33f8cc74c2b84ce5b2484449f487a625638a5a00,a6177f900cba5ddf9309ef4fde6d0435bae1418a876289010c88f865c05886475c0b3943090428fef6cb387a4bcc878faed008ac54e2fbaa9f81d0fa4d2633de00,396f296d11a84241bdc483505c6818f96075378951528e1c2200652bd841c2d91e02fbf5d81b9ff714c9c6e0f4d0bfb6da7db68be57cdbf4a1fe205ec14a530100,a3cf2e300fe51d6774a1727412851195b9b47e7819cd93446cebf15f78dee2a02d6ef25c76af3bf0d56479bab05099199d47e49f524e327a6bddd5999822723200 +6e44c080752d11601520cbfe5977dc0950c3e842134032855c30c0fafca15053821ad13b28e1360b3d9dc7ca5505d0ad87dd4b681621320fedc1e5127f3a16331871b4bbe0e4b9,00fab7f1efcad8a2c28a56f9595519645de68b3a3fa546b6c2a825c1e710b059,9ae2d03bf3025a7d1d9194823ee6f58425f789025058b7f2cab058340dec4f1774d3af588e89bccd5ee34500f2511d1cea36fb76f266367b9dbfef5bb62ca02200,1a98a5c56296ae09bb4e0189020db3a4dfdbd3c34b4e9339c1206cea6d40a75375ea0f0b238dc07ad4a65f8625cbcb292de722f8bfd35266cc3184687c5a823801,8d5de38be9d5bb193dd4dbda10904752a17fddf7cf49f3d30fe52959037bd21928a2c61f54b607aba8ee18565d7b69e98ded57b95c1d20c26760fa3ee9287b8e01,29fa0ed8bd4880e7fceabe7e852b504a0ab30a65b8cecf3406a1b60a3bdbfb6c22c67806e002b51a4c555cfec70a61dfd7074f54f108c4c60f1d3b5a5c6cf23d00,8b5aa50d0aa0081027ab3c382e17758faf5824f13b9569716f25426a550f6b9977fa6d9bf1ba63ea088c7ae3946d188e4c246bc0d6dcc741de6f7cfe62431bcc01 +dd3bda3229e48f951b984bf0b2fb11ee273f4d4fb4b2579143624af48785824c7de9121e4c3e7698ca7504707a151cf34b83a80ac69458947aebfe046e32b583ec2d9418d33e16,109da41f7753aec914a305499cf346f6b684c4a0480ac03a5bfa34421d8dbe89,57edf98d69eced1aed4047ac3b7e0b4f766cce610a5d7eec7dcef02dbc1afd6c3c594c5e6384d6391c592e6729547693bce8421030dbf42a97255b2dd0ee9cf601,a25a5ad4c1f5d066bcc3bdd9ba32932bed0cb9ede228181390fe010ffe3ac419059a26e23cab6a070d3c09d3eecfd2fe8273b13bf0c6f3233a4917e0a54419ff01,c860fdca339a06308a86c6a38019ac3d111129d898315729fecb1d6fe3cfcff32f185df71ad4f44e546a84e9962e9904bc5fe32cc1fb07db11201123aae5fd8f00,3f601df9c9f629a7b882d0a91e98dfdccdba0172317eed9080fe0114706be4cd3d57f827b646fb3e3828052ec58864f347ce13bc016ea263fb28ca3d0f638d1800,226ab0614a4f1ed03da19897be24f3e423e815b2bde30417adc17abe3defd92963555048b8c04eece531543692d434a999f8d6fdf12e22b04d23e4387202ffab00 +ed6c5da6b6e7b49301246ebeed6492ace32cfcde590bd86a704851d0a856751652ded3e199cc5a73f694e8f18e5f2d6deb05c270d960ca51f22afbeab23faf0f8fdb03d7342b3e,8f2dc50f0a01abcfd55628a66ebd8d8a3bce26e062f986284aaa7fa69af8c5b1,d0c440434c09d08d0a549a6700ee230943b153cb3fd7994e183e6f7a0ef676ab210e1c51811e3a2afc9901b144d7bc73a41776f7143763091e4086568b19a3ac00,4fe5056bc701974a75048afc725dc3e88f2f52ef3a5f4fd2869ea88a917fd85b15f312a044fb5c388f91cf709ad069e8d698758ee109f7084d6c21c9499c67a501,fa63e8cfb85e83889891c4c70573582c5178076b65eeaa512cb45481494d8efb19337d7a2ba3e88614a378aff8447188ade1ee62f0a6e9736574ebfd025c0fb800,2f8dacc1385936f00458bfb9c1b67c76131f306f3323a73cf1b5b293f814ed934b9d2d4d53d975efc45421f376f66229783f4a0dd42073fd8630d33ccb09528501,7e4a65e1866bad2fb50b49f86596f38a23b2cd5b999c924a29360cd833659a840c812021f24bc21aab6c976d014610b0e9b7a7df959d1b3495c49b02bc49238f00 +44788c4d2067652458d960f55024910da8660b28588e39e7d093bd0365e85d7747c6ff6a44f34bbc3925246f602c39f7368e6912fd0de3f4bdd66abb10640b99ab9c503df4a621,2a0d9d51b5dd0b7b8e794187b9295030507ab50f7d2f3606d1b22c7c53032014,a99596aa6b450ac9a374c0305bc80d23bba5e31bb5a30b6021017a9050e89d642c701d11acf76879b2355eb5b09655aead02541dfd471ccdb00ed9c74d1db36a00,0a269102d6053537728ddbd86394a4127ea37208ae685df56485ef5f59ea873f360c4d280234b38485198541fdc098fa359a5c37a71510391bef74fc6a888a2300,1b7aea4307b98e6f8e37ed7ddeac45fac84fae3ce25ca6ba13f78ae9e3cf9ba466a3317ca74b46414b340dd43d03d4da7033562b7957b06a9b439d312c99838b00,7fc1ce37138e9c75516a58df9f1701522f6d1dec466a96783cc8d0470d2852650420f1df7e9f3f002834351c2652ce79b2667f76a2b8fd92751d017d02a73be301,074ea2af1fa89caf26910c5715f9d48567ae8a825441e2c24382166972f03cb8449985cc4e1f17610962790fcb05a090ae95d25b28f94a9ec905982f5b7ee4d601 +abb0b2cbfda7d9acdffe08c5641b272c8fb43b659287f9df14aee41c9d4d549cc81c42338fc05bb67231f6c8aa870dff81f7aad2b988a9a8ba072c8856deeee22b4182d1fd452c6e,7219c18915f4ad2018d286b4a1572134914f7e05e7fa436fba8328d54d9c5b53,a73a7739ce05fddbc564324c26cdf8d24dcf4fe797f67c36ea8621d5cc72b4b31412dc89042c544e14d2570a35c22dfc4b1eaf0785f3593ea3086f5136d6bbdd00,44f6d7309dc48008bb9d30418b595d69b342a9c2d37bbb6b3216ad5f1ecf96605b72f8898d508d668cabd5432f3e20a4f84639bee320278fb86c1c50f83ab33301,c16c06efbeb39aa1aee572bd8220e429d83750b44668aaf160dfc4ed96e44603567724754d9af35cb85bc019bd360fa607ba98a1d6dab93668e9510f93757d7701,bff9c51c3e202085e34eef37813b21a08f799f8cca6f054e80eae45cf3e156a0799601e0919c62b31b824761bed9a7613c418e66e49783ce9587f32d6d7c38ca00,8c65db841a8fc4164a2e842e933775f874163f57097ddb892e31d74d32f0e4a81d78f1ae7dfa1679d115ddf68c3defb99fd7dc3da6d72226c195d800cce8b66800 +7a568f1f70095fcb2ff2c647c07ac02f4da714cfe343db6c17100983913b30ccb2bbe5fcdb7238e46ae8613068f8381746af05fa81a1de386eb5bfc16ec4e0d42aebed4f371ecf6a,34873349e8a525eb42f9b989d6f2052eab7830a1f1dbb3cf6bf2dd772af8b6d2,b05c2b7975d548e68a59eb1a8f16fa7a02c6a196fd55fbedf9ee277a5b1dccb446ffa2613df2829da28b617adc57dcc9dbfe4980070a46b42692f5113187253a01,3716b38b45464aa61abf5996a75c321922305fe230c4e67adcf1b272e93ebdef0f2d567f8764d6cfd7b0fccf24936e397589ed242fe609e9237d9a0be82c79be00,6586a4d16d3dd121fc3a80d7a64e82b0fa02c0c988764d3b8bd5145009242cfc06624fa02ada23a7f9b0b0bd02d405a8017d297b23e4007c042761ce131c7e7601,07db4691ce8a174c46d866555cc35e7beb29d19886dad95d8dc4a61d20f815222d4c0feadd67434d75b4089031ee05b94bda8e99032d35f324400b23c9d7a04c00,29aef6fbc52330d171a3b4025ea2dd0d4309c398c0d5fbb944561b772e6fbca92b42687851ba4b4c37ee9aee55dfdab060ac6ecbdbd36168da73b72d4e885fe501 +6682518bbaf37f322261054702fca68272141c670ebc0efe4679a3bc485168f0f0725793b0c7923bf4c588039513c4d2cfd9d4ea6d188e2b200038417c4844868fc1487c106be0eb,b0b36ca23cab6ab4b8d8d4573bb72eb7e1cb5bfc755b47619994fa8e35f4d56d,d08338354a13844200ee9bc0bcc73c1b41d7cd9832f34e622b0f29b984f59ec1479c5dbe8f1d134b6a45e2a55e0c14d7a2f340183d5a258ccd360fe22b70a67a01,3921d9cdde8fca864e536e784464d17f07b3bb967b84f6fac42e162c7cfc15365c2b8e3a2ab23d751403efb64f809ad525ed5b9d2619a0e5eec4a7b94a04448a01,47f0dce9b6231e340ac6128de2f54bfc569384ab1865709c644c137e1a7967c31f0beb04ea58e5a994219673e187cdb041fdad822b529c9053ea85dcd1f473f400,8c21c32708dc774394e3bde6c8114c50834d03ccd036a277feb7ee336030b756488023021d0751e205e0dc760f3ca72ae3bd262102f71bb55f1e553dae5936e501,0098bc7168ee258390fe359184ee3b5cf627bc9fc8099dffd0f524e6c65178fc1e06bb8ce723cc1fdb8ca7b77e0e4c4ba24349ab844e1390ae7702c5da78dd1b00 +3c33239064c6ce163236d357270b06b14673905c65f9c6900861d2e076f1caa6aa58fce337a612a46185754eae6b5ffe9d7c4ff3dfadc55ae2304e9e9e9501cbb6f204db51ae063a,2faf1b325c3b0cd0bc33f562f0fb211b6ca60e95cb02c01dc5bbc9f7564cf8b5,747c7577649ab411667c4d7652831c61d722c20ea2c151e973ac392a6e56fb8440afce828609aa408e54f9fda7a42c92b181e41a55d4711d2bbbe3dd7a8e8d5f00,0ccbff8d39af7f027fab4d81bfb65c20d01b38c2a5301f1e432d0a46aa09100a43bf47b5f858d478f5fecd7b7872a274f2d2a96e9e10ee6fdf4ab154e48d9f3e01,64d0a9faa3ddf1941fb5959308fdcef69d7728dd97e56e8bed497345a883927e29be8b856e1e199034ce374c33728321d20dab08bf3efc1799d9d032fad0f0a700,0e2714c7c35f80114ec11ee57f3c7f632793c65a9d4093141bc7a3ca4066b89559d009375092515bcee88434ff112713026f1389bbb2a46d4f071be01542b9a201,88ea4a804eb577772383ee843e87d4ba359dc7f8023c0f7c7747f56a6b2cbc5d5f9b11e2fcc3a47c54225eaf1fc9486effb389662d5fed18e17d5af60cf3bc8301 +3a3e79e9802f31fd20c96b67f81b800a3e88aaba39b76b58770ece3232fcb9b13385f8cff09a45a31a206cd9feae701c080f4b50d70c2c039692a561c8819c01093a357dcfc8f92b,04dbb5f2d75cdc8310aa8388a147bc141e0344d8653dbbd95aa14eb4cde3c250,1b0b8e9dbf658152794ceee923499efeaeb190b7b28a67defa73173e6e030dca02e0a1fd2fa504a8b638df001e38f494c52ddb0a03106a7e8e214fd558fcf55701,5dc7555799ebd62c69a1b7d32e1d72a94309f28e71b1e2e5dbed30f351ac54cc10092937289d6c55b12b47d8cfb244eb2e9f98c9c938791fc40b51ce7db0f10301,2ae3647057f41618d27a23736833682b34823b89a39674c508ab4b030569449e0f8a443982b563fd56663c6fcfd4b4e34dd7a44a32a7dea863f87764cb400a8e00,6b741f8cd8b225803ea5cd2925dd77f09d905643af9a7e7d7d3200df2c3b0afd3ffe94d42ece90d2bb44470914864ab45eaf30845a64e1aeaaaad16b3e50862d00,4e009afddb4ce5ad0dd0ebff04148c7ecb8760ecdf9f55e57a69f9584855fb491ab3290ff14dcdb77ac414d72e9ff8ee3311fce82da140f03f875f67107b74d401 +810c5eb268d2bd2642338759c4e43d75f7939e272a5e14bb4db52cbe0d992539709af96167f91eba74e586750e97dbc64beaf4aad76222d0b49aede08a15232982ac294a02358fc7,319821f02620efb8b6fa1efb3d26d2a4cc80b8f6842ae00cb4a217ce26613b16,1620465e63fef3143a3e3b4c38430bb301fc093aa9eed81dfc9e2373126fb1e01455f8e7cea5ece5d891c7cd7ea30faf72523e903f6d5f4a866dcccf35450e5f00,e98f7d53583455956f486ff2e40f1ca0046b361b35e26024389a1aef1c82adee119d16ee2525486912ea0533de2b48ff6ce0dbf4494db1d90efe9e606dcab28a01,2fdc3c8c5aba82af225d68ed687cb233d624cec3bbe30203858338bd7e62e5222cc005cc0ec40946013942092c6f2f835e324d3a75c16598da230e91c30c434400,e09a2dcd1bb6a229c23b64e7cd94002047616cd3a82944457f0a4db3f75cc6ec1a481092d125e25ea2926e8ef24c5bf7bdb08fac1a5090225d9b89079748cbb301,027ba3b15d96d8495d30175ae54125baf0e3ecd48d46c1be78b7975807b71fef37325088f015ecef01441cd88185c22022df75a72f8ecbc5863a399c4d2f7cd901 +b8a007f451e3be287a0047489e55441e38cb52fdb69f6f9a9617ea877a2d7360e330e43ecebb1303e4746e3b574620ab1af7d29668ba4fc21e631c6a4b14d539d220369bcec4fbd3,e5b7899601044769ffce3d5865e20fd22cf3f868287afd6c7f94e5eb132832f2,bccd7cc24aa7e55b58f8e6acd0f50738bb9ec2e6344f1bff6f543fc1773513f652200401b85be20e7dda184e486190f02e9c7534e356c246743d83258598386e01,363817fedde8f9ba07463e6b6ba0abe1f4df3b05ff4887c3db16ad1f513782d83b7103396b34c78aec32295575dd874dd2edc16578941c032f7aa5994b2833cb01,1041327da9a95814135f311f7c25a101b7b0f9d821bce2088a2f9da34f1b6d3b2a66a995985c06489f28ea32ea7f7258db11cfccb66eec2c997daf9c305823c501,fc0f86b2c614a85a93b7371d084f866f1f22a43c5e2f50dc908ebeebc99e948e4ec8e8b9447845d8bf01bc0829e0e3014410bf758a5e81765120e82c87e7797300,52fec003a9325d9712731011f614306917b7d66b997f9c081b71d16491142ca038287a32b1d31553613577acc9a80de7c00b0aacd33690dc8be8f99f44d4535c01 +dd63e9aae3f0b0e8987d7c5bc771d39ef567eb736b88cd91f8b881fa26105cc3495c0400ba22327afdea2f69d5ee7379c2f347950c910cef4a9733c881a487e1978692880cdf204d,ba83f60881e3d2dd9b680bab12219f7900b51d8b3fd0d1ae38ea31232fc987fc,3e31133fb4287f104f3dfba28c964301f469f0d2e9d0b23a5b75248fd24639bf186388024e368bb9c7e8464946f8ea4d03d8004d1649a953457bc4c4382c942d01,f074a86a626efb6a6dc16cad384faf03d6fe09eaebde71936ddb6ddacd46f39a7c3a546afabd1f4e006eee05e8969eb5b087aaeab3ac0e3c751bb5335688ee6e01,c314f6278e60ef674fda19458fd432bea32d3d765f86e0891995eefaae8cd3e63ea29fe46931db0734e1d081bd06971750a733d7d6fa71aa67849d4ed0bf4e8500,e8982d0cccde8e574c91396cf27098fc2a1418b0bc8060e4bb0823260ee184020f9fb8addceb7cc820547bdf46cc45bfdc1c5557042a41452d53db1aed8d2e1c00,6a6390082b953fbe1afcd0aa6f20487b8669f02d89e927727eea65264799a1a56a504bd4db5b6246e676cac9a999857b1dda2e92e7621d69d8c85f1d22bd8be301 +0f32ff71a163ebfdf6b3e2c59299845c3436a5b1f8b673f1db14379666cedf6d2934ae4a4bcc879266c0be3a0c02f5781b9a7601657a54a242d865af7a671145d7e962f40fa2c77f,8660409940141405d3172cdd3ba90d7f544686b6ada7ee7b2de748528f0e40fd,d48ee2add6adcb0afff072d3c6c4742723a611d8cc8bf32c0aa2b9ade025f90940cda1ca11452d7bcc778e98bc4b2b6c69986fb95eb3a58a45382dafb154454a00,44051cf25692c58e6f9da3a9e0127e223c06071deae7cea1c4edaabfd609a8032b211af457004e2e6e050997aa84222d2fbec610fc6520a00126bf403177fcf201,773ed3078ba4f4f033dce00beb24eeb9595e2a4cb50a49320e57853b9c14c7587e84ff9f4221b7e2554abeff2f996d35c85e316deee472f37f727c7144cc6d8f00,e4f03a8a109dd2fa5b26a4dfff9b8c8f3bfdf897f600486a461eff99158b253a48f441f4fec5a770a26abd373c07831a4ebc161820019270a400b70f8c8df8e200,d46033ddd58a1cb1d911e1e09d7ae385b64bef90b16fc848cf108bff0c46abaf03ff84309743c1f6f808d704414b36d0f55d93605d06cc30e3dbdd3ba9c640a301 +6b3485388c8889acdec14837155d924a94f05c4907023146f7579f71bd9c0b00febff551ee1b5efb87752ac94b6c40cb1aed61ab11ea8ea120c05de69b1d7ae4380da99d502e62ce,dac075d72524e442c5bc0a2e0ffdc5f991dbb2fd0bc2b760b932664c414deb44,eaa9b7cefac35a8165efb3f9c6ab95caf0b888b7327f5b9f9cb1335e3fd33261031291d0e2ea6f512431d225c0d1fbc95fdb3f9f1b49fb7a56b481cb9a6ac21701,748317d61b0b8a216e03759a72171a46747093767b31fa189dd8e78f04eda9b354fa05b6ea085063c07b024ebee872d4b7361996934cbbab0da6e91f550cc13901,2498d0833657b1ec9ebf872f7b359cde327ec7c5db82a6ea45d192c40ab11d431bfabe074449e594a29ba0df13c8acd86888362a5d3b9deff62cb7ba6435603100,a0aeb76dd757f8901a12da8ee993787205507f65a435ad4225b02abe0d35b0ef32cb9be0b882f7fc637984862ea02f98bae600b8244ceb8537317b5f64ad47f500,b3ef023093499b907d6dd7c801bb6f873ce878087a9c71716cd10764a253d14b62041716c8b22b1adb23ae76e28bf45230c87fae8fbddf33ef1459d06ab7ce1600 +de124a65ac351fec0876bec8b5c03e753cb3804fd2760e519fca99c2957a0530acfe18331e26ae4eeb31b748d8e3f2d0da0dafe67e46b43007d50017edf33702627db91b77a9ea9710,ebecfc32155d88804109ea9000bbfdcdc5e6aa12c8844dd1522b0a8fa70d9c31,2e5ffc982874a8ff698f3de63ce548276f6e538ae58dfc34c5a197a19ca223c405b505255d1e8485551e522fb1c5dc322aad5cb9172ac07797ffd38d071825a800,eec2431b38bb5c6467f494738121b903604eb8e3cfe461753cb8d7b82f2740f94b496f96c403bf2e2e8a7ca363dbe73cb2ca5e1f6f932136399027f9b6be246000,73a6c9f7441af13a947383ca1e8a7d97519b7880651a42e8deab90057b00b6ec5be0f39edc1eaa20545c00f5dccb6a18a8ddad59bc889e85f5a81313e004954c00,b3ff813f95bcd28eecb4652b42285cc6994bbd6a0996b6aab46e7c9102ffbebd402b1167588958ded6663a028156a36ab1bb0957e92593c5fa414c8693b1472e01,6206a33aa9bf09f45ba0931cc7aab0e87c6cbb32f52a1eac7b420c997eeca0ce69beb2e7d0fb71ad61f3fcab9d1980fb58a073f1dc7b81b402f260cb5db06a1a01 +8c79b6df0bcbddb99d62291b0b8692585ebd71e67d67d61c829c0b5f78f7bfa0bfeafd45b8025e1c9dfbf05b3a6b4db7aa73fb2ef901c17cc47d11a5165d9aa0be99c4fdfe2153eb0d,b9434ac020bab569b71bcfc4a5ee582d842b682966c525ec515296a782f1bddf,0ec785805dc876610dee0e9110c7bcea18be63e44fcd6b131a7d411e13bdd74b10679d17f7ed129eef05a89a82ef424abc2e59558a5eefaf5df4a9570fbbe8a400,123ff640a6604daa8bcfd7d650603c421608c1ca0455e0cb1db0d16c94f9a9ac2085267579c2ba81b458059c84b1175d76e7f548396a964356385fb160cc1c3a01,04b533d55c6277ce4c23a4d0c6b4d252420e799daf0958cf2a90512071b617b932b51d5e1805d02469233b575ab3462dc01f8183412946209f3f94e9488092cd01,1a3642fd197df4d7084b7ac3a0a53d6d2493d3899130d0c033b4c0466855481c0ed7701dbb2705632540300bd750391c1fa4c033ab083a9e05eede4656950a0300,971a86a2d241c45d65f0ce4e11030b392bf8f77e28684ff39c0e5668a4a4baef4f8df9ef936cb564d7c6ad3d82bb32344b4ac1d17e80ab6a29a9f44f607f7bf901 +57281eb08b592ecc3cf22e2cabd23d82e785d09921f61c228de42ce39d29acffaba6b11e50b9755702763f60b9cacce70637d62baa946d94ed0ed51ebd84f97011cfd9eaed2cfbb2d2,345b98c76364e25a07454317c757812fc00efac50aa2186c7f9085a26a06304e,f5f0bbe062d4db0dd86c4fa20da0767b083d97458321046a1cd87b21c7138f8422eb36a6068bacda4f394e7fabaa643f70faaf2259650b1930db4c09fee5fb6f01,09726652b87817c5c9031cbfe0746516bdb314a572945648a4acde4b855c1f097a564ea5de1fa1544365f5f32052c46a0928a3109adc8bead3c48358ae56b97001,d88cb2acfa55125729757c40c9350fe6b9cfd9b4384104dacdc84403b15de643287b57c8f0ad4c5125549378061fa24310fd7feadef2f5b1f27935b6f835cd2401,c4d51fca4daa9382d33863c96c1e68f9b6f1e8e68fb3c33a15fd1f207b59b5666baaadc2079a052b874c167c9509a8e9f429541e791f264d5f7f57c01dc31be301,f99b5dbae84c94ad27fe03bbc89870f1271203a229161debc018af540566194d70242665d3b303a5ae34a7387b2e588fdac6b569fa569bf40c37165be7479a1500 +c76e96a5b06387c0a6928e87df9ecfba7b6089638d9c033ef6ac02f17220b19014a2f3e89d658dd39f312983b60b8cf558d7185841402686f8590df15bbb7c324505b5962a4bb145cc,96de7f3bc626884cfe6a48e5d7567967f200765ad07d5b2360333ee76340595f,93172c42456fd199e37db8d769bcad9123884f9dbcf9139281850cb3392eca1f29e4702a3af62b23433505dfadc54256de932f65b1f770a758f9026ddd220a2e01,c6e1e41ace54ecc6fddc2dba2f7dadc25c7f76b5bc71800be872cd8c8ec19ca33d38932c8648d9e4c5d0e50917352a29dc34feba154424670612a6e6d63acd4701,6e0393218bc9e8356c875f94e4f00d702d1f7a473be3edacea931fdd2ed10d383f444b67ae389825ec00461928fa5b003d0b4b108058049a80c07c05690499ff01,96c59631a9350045dc6ad17cc7ff76c3a0be4e4acd251b469ef2bca878a8709610f6effc3a295740f563c1f87adebd29de9b67a997a55fd110176d31235f6b9b00,90d31ba3fa7fd353d8882c4b9edbb572ff28bcbae4ff18bd490b9e7fb1ffd5f446e46abaa6598c9e4b1703773271302bcf7a7ef973167322df36c0d52ed3ece601 +c2dc87273b879e15b58051c780711772ca321974472a97263c0886cba3a5c2da09ad14d3d7da83db08d48258a5122caf7d4721086a90815edaf9d8d09bc407a9e6674464f1d1a0d09b,3c75e13704ec7cc35532b2983c9258fd5d3405fb895ffdd77f0a441d211d7d8f,13622d7123dc8774c88f9fd8978e801c5958c1fb9577f8c364a6f46cdf80c0bc4b4c39b0588cd3710fe97af493a22a6f2e4b79db554da7736cfc7b169a57267f00,5aaf6736f912e9e39f124864a11eb3384c5e6ceb38ee5971324f6c94976cb90f667d23bae45a5c9cb80b55d1f68496ee5b43d54070378e7a461e981d6e767c7701,6213630a70cea96c1d6c328ac1ec88f6775adab8833294ab3addf7bbe9a53fa2408892f56a7e4595178fdb21be6b8ebebca11f832d2429a75aac503e3d3e930300,776593319d1c2aabb5d65dd71121d4a5d2943811d66ec2d45222340f06fabf9e3a49a6e76ac8a0eb462a105d0299119c60510a07243608be99c5f991c198bb4d01,6a48afb528b8f1f5430fecf26289077866eb30698814efd4877463172a52097b57bf9f6857a64780777d1d1b216262dd43ada4a76da60042b5d29acce2ac6f4201 +eeb1900b3e35287799281fd2f2d65d247be6cec2799cba50d67d97748048eaec6a9f477cf1f406ab68b0a4316d4f56399d5185d495416ebed99f46aa206b1ace38d5fd9666e3eed05f,65dd2bc71de0af9f718cc6d656007d0773dd18af72648118b9382c700772b19d,5f2b206cddced668bda445f59741271163945e85031366dea64db5ff5927c7316c63a0d83d316a7c6fcf0d0e1f40b2c409561dc4d975325ec3b40f2fd82c0cdc00,584cc4367bb1894cc09cc01885fdcc3d514033bdee76cbf96d2cdec2cce7b67d228cde831b01f28b53fcaaaa91764ee27b4444f7ee37dcbaa531a8fe0d9996e400,b199869787c87132c75517cb8488e407618740a047ff16483f096c27e1e3ac756759d8a908d4f6cc34d16149dd1f4561da73aa6a859299df255d0365967530a301,c5619325de1197b48eac7e3d7546985e157e982ee358047894ec2aa1f8c5654c63f6f837b64bc843b3dda2af354ddf395be3c655fa7bf2dcdc1241adac3db46701,e463d44d8caaa52b0c4e524407d58e392935deee3471e6b89648b9148d0790f33a6f222e82d465e92cfcf76416079d0ceb29dc2e201e22cdd590983affd426ad00 +8c75d7776f366cddf81a33d059c9082c8474841c73a595d7651630cfd3c80346f11173f22528592c7362528e8597ee38d43a4ed235e3e4518e2482d8e847559b8d51eb50212969d0bf,71f73cf63ad8076db9c0b3c980a13b41464cc4e61c78ed5a4a112269e9d1b7ed,be16ba8c7e83c2d19bfc318682b55a6086cd34c4330950577439567e9b3fa9fe4d638c750bd0eab6d2af32d9f38edccbc23458ddd6169eb2f46769a86b98af6c01,17717ab8014d07e1eb334035edc49b4f5d5b55003779be50d19449f1318d59c040f93467717a44b78c3cf8c3b9e721ecbb59dd9c712e4ffe26e425d64b0f452501,df1575f17e64993b8b1e70a446f6a90c46de467e0e6886950436dbea9a74bb772650faaac70049463db70e0892cbbdcd2b6b411b0bb42a22782761dd20642e5000,f71ddb04ca476ac154e427932196092e05195c3c93075b00e64f32849a254f302dfac6a4afc683fc3223b9cecd1085163b75dc84452a817cb2ca452b75cd796c00,7408d00068ad852e6dd4c5a322fdd47e1bac1c54b18c2623056bec77c020418056d2687f64904d89ed282fe2f80cc47bc7e589760afcb13134b137dd9e68f1c600 +52aed7b8ca1109018e4bc196f69c1d03e2cf3172a95021ff491bc9f1f542ebcd0bb6dc818eaee421028f279b4d82234c9f11790487255b19590aa80348135e8680e4aff96714383a8f,cb027956dc63449654adfdc1422101b62bb3c49712ab53386521548405cb81f4,f9a9ca6d8295174a7ca7ec1821409010381709dac2dbad3ba1500e103f90960627cd5564fe60d9c8f4ea37d79a4687381661a63813db75e51a2c8f2e8448f7f200,f45773ad488d24a0d92242243788439ae9b13ea9c373d2b6060a9e69c1471495663200de8f658a60cfedfe2571061504fcf4894f90b5826ef882198819eca5d900,10b22d909a7c3a33316bcc40e18b31aecceeacab98b32a176f8b67fe5e7aae0c20055a9b8ffec55f4008eb085996fe737c6b1ad7e22f13cdac3fb26bffc3c77b01,4a3f901ea4219536ca6d93a4ceedc915681ff30f67eeed929047101ce0f444386902006d73b58a9ddca71795403afbab14386d1ff3d476a9f9849fb34f06a24600,6dce3ce32bcc06b652024a24d4b78c11fe270bebb9734650f307a897b03ab56f133440019dee1b74fdf06824b79272602f25e4e40e3af42be0bf616eb2225e6600 +18e140f3f086276d8f85d876ce2d95f21e7e199365027f22b806b83f2941892dafffa506ce737714a76efeb45542af5635c874b3499dbd8e3579d073709731a15ad79859f7457c1390,172cb04bc3c7cde94cd5a7a031ffeb565136e8c2961669963ba9f288ae08bc40,55d7acef7b3012b2f9859e37bbc6b577cdf27ccfd9cd1dbc673354a4b47ffc3f489aa48fbe9f1a19dbf9cab24be450c8f61f04e8991e7296f8db33a870c9538f01,3ca89dc2eb1857590c2bf87c04caf3735e99e186b15a08cd2cca772f6a8612bf5570e2e4d6a5ef1b521267a426c8235d94f6a15f7c6135de88da1365b63d223200,043bb109f098204b376b6aacddd0fbef7212e3a8756b886c42e148401087f431371d27cee15e0680033d37ad8461512ce9d672503979997f72f1c654c60af5ca00,decfacd1c1e2aba305ebc963e288ae1f4de55c4c34375e0558e6caf55e183a5654db80c6bf8b8bf29b840c1a266b250d4c939ead1aae243178b862d6475c15aa00,3753a0ac71bdc70a61c14a4cc26ae6f46c14ef603691fe40509101d3f9933cf84c5d2c692156e687ab18ef8ff49c80b7e33a208d15855049df0753299de1f3ac00 +5b46b98c3700b0176ff45ec4a071e075c2635c8be10791d2e699ad1ff9091f2cff648e7e13ed3c4b4ec3528bd22c797b818c997c734852df6f87eb1c2dba7def183403b1d466eea004,042c56f049f07f067f51794792d423fcb455f09f2dcbb9beb4df323b082ffe81,8be11396c7118dc2450e01dc5f7a6451adb1a37c3eec9e1766904984bfb99c1b09c154db855e5e802a610c5a04760173a9ffeb319a2901955d06657de02260ec01,e67f0da6f7166fcf04a4750d60a50924e0627cbb58a8c6a78e022f5b64db87b434117e411d22a9db2b814c8a9d6cb4dd9100fc15464693d2a2b2cd245436650b01,686b1cb6e510ad6ebfc39de9a5dd5048ce521f9c2099ab02ec2a0938b804b6852a5004be792d557bb6b2dbaeb0d8438f5f39164898a6a575c6ccdd581b378be000,daffa6c401504034c332579f36482bd212c28e72bd621efef2335d162c09d5173cc8a7fd27c49f6f6791433293dceaba2e4f8c0988f3cfe907a9cef50dcc130900,d653087acdf608fa1b40cae7d76b35eb05433e7149601e6317ef96fc25081c4e120548860c66415e9e6fdabb645ba2c1f437a468ef72eb6bda59028549ac811901 +ca8e9b0fa28ade3864a417c17e26710b7508c731289566802c294ad2386d03f3d4ce997dcd09c754f093e6e7ff79fb0837c8cbf9dd0bbd41f67634aaeed27c4a5d1d512271c955ef6f3f,c0febcfad73843a5d5874fdd85c07a338d9021071a466a85a91a7bae6bc5800c,80ba088cba2cc3d0361ce1ac8dcd9dfd522df19e536738eb3f795f4b19c91e7b30e297cdcfc306f88a80376dde2654e8a20bfb2831453f2de0b211c9d363fb0300,b4fc242b4d3104f91d31d5582a26beb8476bf86626bbdc54bf515675f159895f06452a51c143f60c32a2ba3e633ba36a8e4449d20cb826c8faf9a9c65e28fb6901,3e25ce79aefb82b8fe2ea69192dbaa8846f6ab826772c01a52525ad0d6ad470f50aad14e06ed6646a91ee386b1190918198191525b41f04bb94db7f91725a6f701,2eac1a9f4f57e924b312df0601d16f89b9718f1f4b019615e76ca2f8df78a0467be57b7c3fa89cde532733f77f87057aa25213810247cbb8aaa696039a398d8500,7e408a149a7af3c501fca48f16b0c5f93a317a7dfa44f377408a1ad243be98c51c311800908378ff710fe1353ecd68e8bf1532f0c4a994f8f550ed6a041f8d9c01 +41a530fc6831934def89e37f56777bb3e507e470dd078ab1daf78bc22f959d51be89890d65a5fc3b3fc1d49c28c331cbc89b6e73d037372c94d7b8bc94316573b7cca7e46447df000ba3,86931918a5d58e18f712db9c2121d475d6ac9b459c3fe36102556d13ad77dd28,0d8977e29211847b9efa26c0b4195d5f6013ccd83b99ba7e5256f89e853211bc2f9c19c8680f9dd7e12cbfde96072aff2d49538229609d8029e53a290cfea9d500,d3ec5f437b3cab30f1d579670f3e81857280bad45d6c83505d3efd140e2658265a42de4dbbcbbb0f876f149d959bf91c95b4a9da908fa67c8ae2565e324c91b500,a94654f9b35cbbbaf39ee146c312e307b27c27152f572c059565719fa20e91b54286668a6ddc12a1d21eb59b73798c0131a380ac9b298d4507f8f923c139814a00,79a136feeeb6872e7a60f4900ca0a43382c6b09a81782f6498da32a0d286463f55e3bd985fd4506c6ebfdfcc4598e63d20be961c347b4c91faecdacc578eed2f00,45e298fa2ce6985195430621928a2b1775efd4f2cff7ec513532f0a0e55ce331610a6313250cf90340d9dbac09ccecc1630344d7cd3eabe217feb045ad73a6df01 +084021de1ce6e2e47f5bcdec0cbd3023da0a89efe4e280bbec4d65093eb2b07190cc5d6faeb597fef8870ba556c5aaa50feb1bc0a0e9fbd3887b01225e656284826f923f59920cbc0ecf,2ed81aab77bf2936a0079b487b8db675c3a7e5e1728b163a1bcc4370b2b828c3,ad77810574be426b6897d54d26abf85a08755c9b0bf9915f36e4b27b376eef7c225917dc2de4a5653d4ac102b624cae67e3cacea097fd886ff402ba68b08171c00,ace9fdc3e69705f06e7d1596adb86f4ecf3953eaee504e83d2adf8abef6b444c5c003c7f7736783793f61140a116410a96bbdf8589f7bf1ee26459aa79abf7a500,ed7f2ea7dcbb55c37f2288b8c57c694c5b161a04615b5984bfd200b7520452a132cb9d1a36a1d59ef361394e974c213b5ade155139a910b490731dc49e5e5c3b00,0c743cdb2d8125a4cd53e9cb8b994893e62119a4380cfeb159e97a107ec8a2e920c0070f3b638de03e79cc8aba763dbc2c03d34327349edf2ee6a2298c46587c01,2ed19f309fe90fffb9b5d312331d018ff2f811735fd59e4e0a83ce3d0faf5f5b03587d8e34f2ece8e3213a5e0b29183e6fdd9170f6badaa80dffc70c3fae8e9b00 +49361342acece2c5786298add6d7948d9febb59d08fbccf4e40cf2f6f538df3d94477f84758f8092cff763c858168ab531b5894fff368f005081902b21ec0a0017dfb3f211958b9f69e6,cb6fef7c7f399e0b599f90b43f03af4a8948488bc1f777230d045425bbfd9dba,1eb8a619daa974ef63f601c3ea9f60b8edb2b76934053c1a1a9ce7fdef51d5375bdd02c9ce03fdd0d95792f04ec358fd77f26fa7a81fc0bd6f1966191dec93a800,85b5091827d1bb9a720a8b19c30b86d64dabe3a802ec9a78a4c29a1f93fd515845f05bb28258447393ddb2ffe743cf8f4514f4f1eaebb11809896caa0f2c958f01,790079fb882ebe18a9541125f8c193c10bf7659dc5c4e9005fc2a026e61bc15d043f8b47937b6a552198594a8c3efc07830a42c2c7caf3cdb9628bb3e97500cd00,eeb4d534a0f568475e718db46091ce7b6c26d08b9fc7e32f8226098439dc6e1e2a8c24b9d7df516fb328950111719d7279763437c913d091bb5cd5b6b946917100,16e4c803fadd6bcac7c5337e472561837f5a5139ad1d8c64287229faef00bd0c0256c5b890d85b819d80ef14539ce83471abd922f596c2abe4ebf326b217e7d900 +521fbe0aa6517ceb69dc7218342080c96b7be412447a91a06f79180c3f77143a3664a0bbaaaaa0662e508c290435dfe853e56469e28be02f73e92b370b5982a18e744061414724f8bb2f,6321a4ca160cc958e9199d8542cc197b95a54599ea3b1600c8615c988aead102,3a2f7feac638f90c1d717eafee5ff04410e6e79b50f7be2b98e47bccbfb4447a5aa7d4c5411bbcc30da712c0c0a251f1bedf2f8fa9cf4fa57b57a66de746c39601,4d5251f6819d10589e511adfc6408812a0eb96f7a9fb761c00002a7f57ba09e2526ffc5eda5af5fdffff60d30c318226cb989171ac9b111e5737be746907a35101,c1e52c6878b6a3f42b1ed4e52c5eb168daf34f6cfde9061068af397df403dc475bf78cc47494ac93acbbe8497543c155719a56dc487b5054c4d47139ce071e7a00,c3d5af4a88e3c2c37a6e727446c89d27d5e9b5ccca67c85f5488c4426bbadbdc6aad9e94e2f17fcbdd7b14d62cb0ce0b3ccc92b11548d8dd13889bf38ad16a3a00,8a03027308972f68a93d1487c62363b61386538f471e2e7eafa3e649e331fb254daace6c6a87165a092ec66b725dd0a6a1bbdde399cff82e74f5bd8e74c788d801 +053f7384f55b6a454b118f7c0c7967c71942bc4da695248283a21153b7f1ce54d552636fd35e582324a9227cee949a63bec35e59ba36ce9d80567a357ed185bf54411679e0a820e12a29,1ba70386b0df7a18099cc7cb282d7ad7549d55457d4cce0ebcb35c850d56fee9,0d4f851d9db78becaaf8df236b471b83a6331631150005702ddc30464587892902144166e2250ad424539ba5623365a78e24aeee9e8ab3fbc3a9fc1164f5b97201,f7e3939098d93d7dd28296862cf675c6aacc28a20866cc23b83fbeab6829fa3e5a59f1e36ad51d25a4177f9abbeb2ad9df593fc078dd9ed184004e37fdbaf9f001,081d1e19426ddb91d4510770fc2a31d8da641838f340152c5f951f1a3581039b649275d3f3a1ac88e7908e705d2854d364b63c189b48f99362e603694ebd05d100,edf3b81a9f84551f0119082219ccfa133278f3e926f6e6acbb784fe3cfa871cf6832bc522091ef96dc4eb445694ea00a82827165c5de2868b6334b5860bf277000,e7e54a4a8e8cf0557175bbef5ed8fe69bfecc0d4ed2978199ffb30d33c34c12a497a3e498455ca6b86100bee05441962e0c81d6cbdb7a92a8e4566800ab2b6fc00 +3137781da989eace368fedb371398347c8433ef2f57b9b3b9f8f5d548203f8c2dea249df2bea1d2f4f61d28d47de88503db2609b4daca4f8016bc2bc86b8898e2444349d1bc3e4fbc04f,46dd0bb94f0310cd34e9b77b856cb5f5bbff05969ce59916b35b5cebeca10fd8,9aaf75815e4f7f2cdeaff6e9aa731b748897a3876481597a1c9631aca50f800a241ad744bac63f0d2a5657b4107911a35bae5c27b6fdcb9a824f7b0b46b4943e01,c728cf5a9914483a618cd06fccc71a5c53838a6b76f260150ac9ea0075da85cc3d19726356d0859e8bdf16eda8ad8852591d71c9b6b3dc8f76debc44f4a0345200,d5f456e7830c221b72329232ed6faa1231248a44d695c9e35bf87acc1610cdf9234d4403d934af658736a4e6c8e3f40794b289b47dd3f6ac0a3a369f34978a8c01,632c5bd5b525652a43b378666f85b881cea9edb211feca2e3c85336828723a9b69def8cfdff76c13e3dc9014394f30e85e1b77d0740608a7c6f201ebd934eb6d01,e38ee1b88c5555bd0ce473436ecd6855c6813ac197a66230d44bb4ff3aeed634646d47f515de47adf02336f4089b6ea66ee50ac8225d4410c25dc32821872d1b01 +d36e65607d1d739cb91828111312c1ae25a126e12d7672d252fa958a4f4d95678dcb25c399ca77659cf9267cf089dbdb06366927a2de5c5d408f645d169865bd745a7a7a5395b89343d2,e0d8c6d2096dd74c65c4c2329f721f9b3d6058044acf5619fd09f9e18776f570,abe6b9e0e91780cb24918f2ecbf2d4ab5dc697566d8138f361a012714ccb1fd7753c7e887eea42d30df3fc2bc9678facc528d32ed97c33b7676ae8aa9ffffde600,16468d8ae5a6033371a3518a24e77c36c4cef2fa571c4d7b2230f6f59c162568134254c2b13d243de3f330dc459baef3955070a55de378d8ca4aa133462dd14d01,0c7ddf0b121000a08829be5a2fc9b0c4a97429e261a3e1938839ce8af01ef5c80d5561c27295380a15e338ac5297ad384423580be8d256928642dd8b68062b7a00,14ecf056b7273c72c182fd5be0a4e0266659d7160fb8947d9a4e8822377aecf73a0c372590fd4fd3af6093257e1a01da5d072d3f0b294b6dec7440928aab223101,bfb7a33a55d8947ce40667cb297545003898ba6e5c2025111c7171eae727778104c01431298ed153aae46702f8244d568dd5d1ef1c38ec96cd03e5034f0768c201 +67406a932558ea3a4978b16217329540d967bb84d396ce2c6275db6f7aeda9ccc1f7292fd6450d3c2a90a6e8d6cf800100aaf9aba00389b0f728e30883b0929d0188d7fe3cb7ff529bfb,5c78d2a174c94b3e117f0806d727f3a66794805d0eb0c2988f09c92fe6f4061b,c1afcc631abae32d74cb35269e8894eeb41eca6e2e0de785254ecbe88d85fc803c9e6c1869fe9e9d7fb589fbbb378a302a7e49cc8c656f1f6596e285d07391be00,a5ccba9d627cd416518b2deaa74c94e00dd30baf070f292513d6ec515b1d64aa02eddbf80bc9b0851649c23d465ece7f29c50c77b3294fb07a9ae12a715bcbc400,36b5ba652fb853271dd49934b7fcb60c637c7adc7f3a8df4754d674933fbdaca00e37ddfde79baffe608b9bee0c34b35361e1ec2f127d4881574142f0b3da85200,81f3cbe8239bb5b1f3c836a6a46b536f41936834d967c815de76ec30a54144174497622020d7f71d3d1218f6863586511df8df8e2897ca3afcbaab18542c97fb00,5d122ba071774540be0851f3d76fa0ec3f4318590cd913dfb2451ff6f6b0339765ef306d063e1f741f4f23c8918dec5aeec36dc017a23207e1f4a890ffb7e63300 +643b0a53ddab5055bf972b9f8b42b90961375dc04f9da90082eb137cd297031ec1c1002951a15cce0c1da871e4e5267eaa7239f2ad4f170cae929a8a146b49d539201e5bce7751cee111,18466d2024b1cc511efdaa62192a33d6d4bbb4ec25c5bd6f7ecd0c54d9724424,bdad1ec1de27b692501770e234eb4586657e982e990aa7be060526c323d1084a753b511f13f813c762c65e72ef295c4624c616e855c16f4b78232ac164e9455d01,8a3e06d1effaca150f02b8eb96cf277a676604b64c5263082b1e19210fdf15372312927f18734268c6a6101c3f658b93ae77a97a57391a44a77432e5d580636e01,1c2ca05ab06de147cb2d9b2abe0c8b4670a7bc16fb729a713075579aedac4c846400ac1f3ccce110a79ee420768fd4e3c067a1c2ef1d9c5e0c74d7ac846f56d801,c998150ad84d3a00b8fcfe2864c6e629bb73f5e24e7a642addb2ba3e108d0c50575af02de0089b55f351b02918b64d71f819094219a76edaa926576f863ee79000,1244fd162a6706e6e91f91bcfb6a1db98003d58bf290c395412f4a9a7869a53c24ef9d67068824c72a2009586df82a4f56009605a87267615df74f95f45a3ffe01 +97166dfc363f2f580b50ce165731bdc479e42047fc919bf863365293cff200f1c73dab3f0b730b623e9f0121ca5c42f18e4e39beff44148db29dfca9742f2c170a64130cdd0eed78ecf44e,47abb5c2bbec3f99873fb2de9aba29d6108a0f0dcad454403ecd32fdb7c5eb11,3f61c276da44d5971615c65a0eb41ebed778612dad98ebfd442bce2c7f7f616c12fa367d1619d49c8096b2ae629b8427f2d144efaf03b26baecdc2a3b8af0fc700,1ed2d9bad3ac35f6242e73d92bd0040c019ce0c1b33da668617cec20eb38302c496501681d84898a4740f3a90e9a2a4888bab80939ea41ca3de3af2637d9f87400,54ccb3741a5a27b88d004c30362f0fd0f11fa25d42b5bb38082a9cc65fafd2085e2ea5e48a200b796040ae928e1d22a6bdea39c57696a70d7d1b66faf6fa900400,c3dc67115cc6981b5f95dbbe2c0d8492142ecfa365acbeeafd6e3e5a11551d05499ce686d020ded279bd006ba25964d82eb2144573fd27cd8d65149c4950f00401,cd8f9c017bb90897d1d1733adf5a4292dc6d56871dcc7b50a04dbd608034d92121858037159c33a0b14aef22d6e17c01a8c6e694ee854b9261e10e8694e48a7801 +ca1bb332f2c523547c3e5136ae6d093a60db131f331c355abb7d2859b940a42312b5677ca5ce1d38cb28ec84ff389b444e969647810107f5589a7f564abc2ea1001541540e7ea2d6ea6844,4df4d4144587c9c48e8f0b3c1633a18f58fa410dcb0ca51067b46302c6843d5a,c0a5b161bfb5b9d174a99e80beb33792ebcf599a4cb2da33b0e9be710176eebc6d8bfed5b25219c813067577320c3e5d1e952bd3eea1548bb1c99057530b911900,77a27370303fc7ff519e1b1f64fed022d98b9978d74bad294a76e7a31fa3915b57d16b498d306a8b081d79f46295f15427cfd945e48333fcc9a75faf723f686d01,0afe270e63acf942af4e3009b755a3893fd55438a060e4295d6c7e0a19e6a3401985286e3caf3f0e66930169e258afe60b90133b2f6fccd596d7c8bf3f25642101,d06192b6e287db009a7cc7d8cb5c1dce9c187f7eb1e8864c92cd10391ec281627d64bcd31f4a44d8085880a0e855ddc84a8d866988fc3fbec109d4b9080c700000,174c80a5436c38dd08b9be3484773ef93547fd143a584f478ecf3f791f47cafd2e83012735009f14bf84a75c4656bf19ebc92bd13e1ceca484536045a2e8c87c00 +f50a7fa9828dac25b1a6eae5c21dd0f9946a31d60810ed28569b50d8a617cf3b469d1836d6f7d7a12fabff5672c60d535363ffcb6666283132324de1cb537f098075bba61033027f218368,e5c47fd33728517b547ef06ea5523956a099a52e1f0703688b9de7da6be91df5,52bb78312b44c457ffbc284973abad4a9f2c00a3fa3fa24c104beb7a11b30f7873e9da4cb085a21f7a9b333ef46aa08efba7e48ef75a9affecfcc90fabf21f5f00,42005976a101d912331ce8923b080ea2dd38eecc10002ff17c209e8a0fd45f9e37515e40a82c80c4c715cc4764d1597ec54f78eb74d26cb07d485a10e57f0d9901,4b62197ba9583146ec2a9ba7789f0cc7a04656476645a4325026ade9aee130e51d873b25978f60f30f570a30d09e2e18bbe07c66e95d1472a3d3b9cf3e2392c801,b6a3dcce4d17589d500c44b575836d9457e4b8c38b71289634d5ce52d1fab4bc5afcc73c6a9ac37c7c8f1dcc3a82c2ba1563aad0d9b02e357b3cfee0e634d98101,34f52e8e7569ee92812cd4bbc96e55050fb0cfeea09379d911e721e3024b6de404592922624475f313ea59ca2eea5938472eb96dfacea170f355ee6080c880d100 +09683f804b588b0535b4b8962e7d9856c4c5fec4357412cdc1fb16f5d514d520371911436b3c419a45e4c6b14284bbebb4cba19bec35d9d9dfd0a77a5a3d0c736ede700f654fe474d251c9,8a45ba234d91e220a7e308369f8f5ae48a55be53c952aa7122d9488b4eb649f5,bc9c99274f8b282ec4d6c4360990a77ecbcdcfb9d442f263012d8e96614414012f102cb6605587531f5802cf747735a11a9160977857204f8f3b9d03cfa9a56d00,2664ae403459ccc33bda32e80e40f32a1c62e95987e56e86600fffbb9f1a735725506993559750dee0d9048868be16a465100087f644f8d736acd4bfc38c8f1000,1ff8b2a1cddfa704c2e8623fdf2bd87847dd97d119e70dd40d761bf2fbc8686d6332f509fc96b6abd325afc7de578e6c99cbbdc2dfbcb827713b10ddc9ad44ad01,056c03ca894d9ee77e2f9e425bb8339242fd28a640b006e9da1596bd60a33c224c329374053d561ec55b61a1ccb13d248d6e0b74bcc74e59e200b1d07b5a785501,0e7c600d887bcd34c621389d49f19b8b40145f3418603fbd51389acff44f2d3e7399d3d928be9b924e4f8014f511895c28d23cea2b87c9696823976044cf6ea400 +f20066e84bda6f8dbb82bf01dfde2d1de1f315094632da05f47ec9cd7d51c71ea42dd16fe1ae8e8987babdc2eb0f94e27e95ce411c27dfeb9fbd784a53803a8bc4e397a46f3bdfdff1b9f5,6ba96b4eafadf7d5e5dfa05ef964898bfa6ba01eb6808502317113b06f94cf38,21ec91e8c5f761da5471bfd8162ce32d119ba4bac0d8c89fc5d8e243aa50489934017dfe4100a0d0b015b8ad74e61a24dc0b9a354e1d773da494520ca179d00e01,434cef375ca9c9480d27a2c7b4d792671e8153846674e81ef819285116f8c79c4c35174133803209727ed466d2f823c921baf56a21ad5393f605e08a9d23753b01,8ec5b91604f83486a6575e59b24cd23ec595be5f56c3a381c1bc6562ba5057dc6d85ede5efaec0779ad17fb15cad4baf43a58b5ebb8ecab1ae3fbc05642df37e01,0e1a924fd713bbdd2639c4c5df3e4a2c81b740daa4d4695daced3bda1535ba5b616c147e584b6029b29cebd6da103c3449d5ad7f57a90250dbb50a26324f7e1200,bb7765b3c1e868c8e25743e3a9a55cfc2f1c2f52e9414fb70363d7fa8c8f184536babf7c82a6f0a2f9b4b3d76c368fe6337769b9f8d26e55c08b0b63d49a864301 +0857c9c2a7e4086686c94f75dea29d57d6ef69d2e942e57a0a3e300d2d085fa59053f490f301d8c33f5d8da1ed53386bc92cfb15b77343bb85e9e80758805d8db85243e79cf5f8f3c8c27f,b9786bb44587e26725bee164a65b5f039b317138cfdb0cd717c5ce467d93c60f,1ae33756eba1cb182a8fa2cee9cbfb2cb64f9dfb9e21b5aad6693ce029e1af5416f88a2cafeebc24f64927cffce364d50be70c2bfa2d809897d6cfd84ba2c19600,d0c870b9d323c0e0ffa79b4b088ec72be934b9c5074aa2e3bb64a1f9b7c60dab2ce361c5a0b3e695637ea3861d06c5453de765f000350daf809bf49c44cd148a01,36fe8e6ae07c909f3d8f431b7d2440f4bc7a68b979fb1c6665027b158cc32381280dd3f38f66301234281e9bb0407dccaf7c39b922b99439fdea7fc677778f1e00,552e966f0afa46ef64b44ef89e32bae2437a735f81f6c2be3eeabb115d03a0a9546a3d58be529c76aecc461c484e186274a69fbc00ecc97d6e4e39e39a85a16b00,6ea93c5ac15f387d3a7eb4e15473156a3aa066992499debba5804399cbf12d88261970ead0e8e20b7ea5b3f651ad51159d940e655b9f8c75009b9d18ce7a9a4700 +ac9b4157d1644c2c9e794d68dd3889e39f60d0136f0550b43b19f6f1769232285af218d95e3e1d5b5652f6cbe0bca3bf0e1587746aae3c4c83f24c023cbe58551ab3ae3f7f984ded4077c3,67c88335f73b264454ea57e25179bbaca48c94635ad816efb316d478b79eaa42,b8f29c00f7d905e6502ae2f6f98b8cf2d29853342fd1b534d005cd3f66ba038f7cd72b2d16d410891a85afb2d313444ae154d7414bad206d0b7422cb499cc8ea01,fe8b147209b6f07ce82b6983310d9c80fa6faa51a6c7d24aaaa828884a2b73503a03be3f2f0ac530027c3f59bbc8596a79103e3fc904b9ce1f21ed60dddc096f01,8715a0a254b3ffb61853694ca6c402f84e811c4745fdcaf24a79ff6cae8bdf69123a06a4a33fc39678347589d14fa9c2d501a61756ef1926f755c0b78257e1e601,8c20066458549f07488147d3cfc3b6578c4e08cb1df6b4d05cee29c5c09e927e193285c2b2fc59ac55c54f8c71d88fe3e528b45ce05aa9d68647e25f04919aae01,d8e673d20bd06211a91e2269a4ad2ff139852421f8f92a4580e07afb5c157da976fde8e5927486e7e8e75929e3c3d5f1a51c234070982f184404b3c0eb43747001 +df29247590a8ffb6cb963b1656b9cb0fa900fa927d7429aa28f18452f4652215395d21bda03cec46f188a09993a7cc39ba71e4a6d7f1d5f3ab6b35211b6f5284e8c679c211674d2396526b,ca6563749a7c323a473998946e06ef9d36341cff692a6c22cca2f893d0983cc8,e925795478d34ce773757f6cd50aa5409e926f07da6f6d30ba585861c40e15ba7a51cc7ef18c061d148d0ffc29472dbcdec9460216959b060e2741f210525ee601,a7b99df35c9b85bc8ed48c6a251912662bed9c66df99c1ae1fdf3d0e08189ea34a05997c4d9b57a368058a6245dd8139ac3b80f32fea5c1783a392e008f0a12a01,5747f47d3f55f734f091636d2df7e0948fcd2175d22c097f63529f24235001a57cb7c18233e72e4ab047a22374bb6e03f24654189c81561604d9be3c2df4458e00,4340ab6294023e571a8bdce325fdcbf4dc6984be7e99829ace3d151cb73510bd22b70ce416b7c3a277b901458844fc6de59252965fc268398eec5c575acd75e201,bba7900b800aa3ebe00166a017f0eeaa22dc72f64321c2645ee30f328e8e3fe7108d2809090800e71e3b0f5cbc2d8095a6c7635ea9174265f1c3710caf74548a01 +70ad95eea4e84ea5de34b1262c1aa6e615e6bfe910376d61c5386e33790610777f8d7d171ecfa57c9e04c711f28e544d23d3d342ab44bd3ac9cd0f49560b5a347d3c5fec6dfcec85bf185f,964a20e539cb027af4d4fda6ffd36fb544b6c413dfc1815fd85aa5726330c96d,abc46700bfa312de8e9260870c19a6850d742ca9d7820f561cccd92656bb3bef4692cfb039ba8bc479b008ca89a6d127fc1673b4accd8bd9aa229d0824dc35f900,f03b1011c325f7932b04e45684155e843438e4e3afe54a8180fc747a27cd5ae36273f38cb137b67fcca4e7b0156c40c30d45d2428c2d8f17c80e15cba80882ef01,de546cd919cf6ee483d09f1ad8b891aeef894487be576c91b88b4e04fd75c6690f33ab075a115f4909564f0f5d6ac6856b52b4c62eadf0cafc861f47f4346d7900,7b7d4d965140962b9a4cf979d390e4b759978139dc164103c924427bfb0f68d5468aea39574b3e774b91d7028eeb0688c1f485d1086b4db8e653198e5bd3f05601,50c7838dc1da086d4ffe93ff53e03af2653bb81cfa213d2d2e640da7ad7e7a6237d7ca989e3196a93171991a935c44a613d5d6fe8919e019f1d8e7b7ffeb9e7001 +df40501c4cfea273130f27a7c36b680007deb443dac862d97a9c0b740918e3bce7e5e8fd80aeb1bf3bb7d577619eeb8f317f569e9c17e898360ce7b7025d0b4ce910129c747506f568e8c0,6814a71ca0e82d532856b956c75d6233dbfc47a9083461f3907e22e326c137ba,e58c43a7dabff050346f0cac06ffb0d24a388c1782342389d373f9d2d6c006a16039184cf3893800b72b292f2b15765c624cf11b0a623795659d0b17ded6364801,c300d27f3b6bd5ed4b8b19fcd98fba7e944b066ed2e80a7d8685668f77ea8885015c8dfb7311839981ff54d92a7a97d795865bbcd35a64f2a805c20ba3ae852900,6964a67e73a5c71069a64c0e11141ea827d7f35e68f3afaae5a09df3d29c81f102aed08186de2ed9260cdca49bd700cb965e75e80eed511a3e328d66f78acb5d00,10fdef16395b2e572e29ce87f0faa68dea2e6290e31e5cfa913c6b8b2ddae71f4a7ea7f75ac4a7e34fdda5a80db0d554bef7e0d4951045e8a354cf2de943326001,b08fd4832f4c6264c04e82c731e9e8586d1fad9cefd0d873a3ad0af1e57768554ee254e0ff1358d4c00153e0c3eb7f377871d885326b77f35c2a63d0e2f55ed001 +5df69c9c91f2a6a1601253d5280154519dbb224e186b42d15bb60be178789c3a1c4f338653033e6d95283971a839862b50b252298e894b3da5f3dddaf864d933a37ec61b68f20fded642fe73,8e05bea3960f0d3ff20ac6e32c19bc8cee9649088a6557ad7c5ea4350c49eec2,e3ba21dda384f333ff2eb7eaa9c3590afea7c8811625a3e6bb00b8caa178f1d07424e39e27ed2ebea0a529d6bdda8d218b05c18481e70acf2ba7d09f3c1fdf6601,e259c11dd03a0336a8de105889aebc76534a8a4853a722326269f348e7dc72135a9e250b1c0c0db8943d7ced4eb7b33bf699d3ddde91077b29058dc1ef11bddd00,15d494cb4de5e7fe01fbcde137ddfd6d05ad8bb854695056367afa0008ea8e905985871ba10c6f29610497db2fffc7fc760b605525bc5fba02f080ad2a986cab00,5860b9298b54039d150df6a7e77a46e011af4d3383f49f78c815a267a96b4cc66e3185e578371b8effdac8d4c00cfe23957c3d73f233d16b92956dfb6a10cec000,0c48b9e521edb494a9025202401476036dd6e2d8cf946e8cc4477e811ecdae266a1f717130b3f2eb9c62c090d849e870f1edac896196540fa917cd5a5ec2c76f00 +151e9912fbc640bb249e6e01b9876753fb5ee5be4a1856e4e04a6fde4f4d3b41bcf2a7eb716db635dd3a3a0e94c4683c76fe72e7c5ef1737c0bf9f4c5378ec3f3cc2f049bca03d82029df7fd,d7847673cdbe3597af8fc2c5a403abc4c001ccd62c8f6605a36ffbc5f50ead4e,727cbe87e5b2ba4649bd4056abd6f188cfd42a328f1b4a1469859c8fa3f093a903924493fe02465fc5a13733d6bec15990a6c752ad893f61896e79bb97e0c7d800,441fb60c7e5a296641eb16e1ef03733d424ad767c7706b6744945b9172b357001e7bbc2a7e97cc2a0f8ae57589e6637d83045d7d25da135bcc5a4c775ddd61b300,a19d8a209d91753c7c445c9f5a3fb9cdf096a6ae1cbcc83d2e859dc7f6c962a04d1fe3976095cc267caa204799d74d1478c217d847be07b399e2bb1b0b24e68600,24e459049a727fb2f83364b5b8f192a7e6c599eb8055bc7e917f1dab83c2540043f3c935bd1d5888f0f0c45a7abb811c3753eecc85f02f4f4d26b51a276b1fc100,091d27740633581cd3e0110ef766acbe7d5a0f5cdfc6a3e6ccd099ba6707dc1446b46e3823cc31072ca49e383442735f7df8263d0ab595b03ff6e50f94b71e5000 +3c4ddf3c72929d93159c6ac991954ce59c0a4b07e621fbb1fc179cd438d69b5ae4f4dd90cd4f2a8d1fd4427145dab2fdfece62af348749b38ae51d5ddf4ee5e172f357ac2b92b2d4fe7a38e7,eb37aea993da280ba7f0f162aea692c828211b2f2e2cebf9495a76279da586d7,6ce9511092ce8db870a0a26b18ac0151b2c6c72d4cd5bba3251a765ea33862ef2cf818bc7e897231ddb44edb4d2ef6c7f69cb165921cffc33c7df5f7f14e024500,fb13deb620e16d69b534fcede3b7f9f3f1b1f1a8c010b0ae4e63aefad88ab5ca30ae8c96dbe38504e045786809c37493e0c55749e562a374c567b512ef2f0e9e01,c6d096409a02778af5f3a0efac38452663ea7971f3e57c3f5bdf0b1caaec254b34061b715edae4852214f41a5c9220ce039ef02bb6786213e2e642f76d925b3200,888dd629bc9a5168d24750603971364aaf92293fab4736890a54854857db5bbc7a864e6a3190bfdbcd40a6078606a7c3c8296a2fa70aa6d1d197365477ec01ad00,e21213ef0270b6024908cb6e42c70f06f4edeee29a5b98e5d0d46ce423641d0110575ea393511b7f6eafd35d650aae4a752100a8386cd084cecf45b798466e7d01 +a2acabd9215461cc6fb11f367a14f23851e4b44236f637d9e69d2284c5f98728b9f893db090dd5785d319796980d2bc6ffce47f763c597fd9932eb6eb13a37ffb3189b74c7ab8f9f74a3f3b7,7f3a02178a753d7bb5e40916ebaea27fd1262999ba8c3329ad2692bbd1e2d1cb,9886f313688d3969bc7820628208b42f7b3e2b9de6a4f0818e1828fb7a0c8ec831370d96611e3ffb215cfff33226796effb35e0b0736fc13b9c5719eba445edc01,46b39441f6035bfe00b561d8e5c044a4f28fbe8fb28234ee463f98a8bab3533c6fdcb1f449e3d73f9496f208666df7242dad2fb25a93459079e98d2c14a9f59500,722ca5e2250940ac0ddf627d5952002c71fc6fb8cfe6f5cb266a0e860734ba845373fbd9b5ebc1086abe737b635882a4808e70c05a999a1d945fea88a7ecc2f300,dacb2526a3e244050f3cbbbc9c45aede9c241865b22e753b9d4016e64e13bd005fcd9b024ff821b784e77145f257f619b69400545cba5af139c1022ff54149a600,53ce342eceb916ff99ea413ae03cfbabeca5dfe856ff4ce737227c54f681cb3f14d4403fde3c9cb1e3c0b65244264aefe375f3b81172eddf1d0743dd440282e701 +34681c23a87de60bd6cbaeea909e3ec98e1771ca67d540be8f6b6c91f03cb9ad3546480a230b02b767dc201b257b9946bbbb3bdd32860af6c3f6683a855ab2c4029446dcd102a8acf27bf86e,2421017d84a53557775a997e02244beeae20ab6db41511c8e45f0015c063b9cf,9fad443a5bfbc80f0f29f7ff32b9cdbaf5e3ce0070c7435c25eb1fae16ac1d6e203486a6980f8eb84bb076be438d0f9a8b9ce067ed95ce3b923ddde4d61c415001,290747e1f567c9e1b2d7c1e13e2ecad46141fb6216ff536fa4ad76fff025e52a4964d8ce8971bb6a6256860198a45d9e96aabee406e8da4cd132fe420af1bea700,801395b589b5368f7ce68e4da7555536acf51aec54a2487d9de6c4a86e7a5a601a1d09425982fb95660b7fb90d709b4c75814d3523a65853d314402febe0c9d000,d98b7976e7d99f782262906a375e7d6d7aa8389ac88b87c4e1272589e95e276d5865e54de8fa6b39131286e55d82950b1546796572a195bd106fa30319325e4000,492beebbc202892ea69eba0dd5c16f96840edea2394a2d75ac921b2aada88903705122d751ed5a608332bd5486e12887c64c408d3fb37de651aa8cfa3412026700 +246a30ae4e0bb7ed2e63a08b34491af6f0da1ca1c3da6374b4a378ad0b38ab680a304a9dbaab76944d7bed1952d10bd01aad78363ad7f456f7665e1aa45c9f50997550d2f084954cc6f2b9f8,39f38399fa4e3995537f335afd4fa66bff73badfd8dacba486a2bc92f287b787,7bb06806723cadbcab8b6ad3cc0cd3bc090c29f4e50359aaf19400080f2e68586af29a425c84cd300cf6c5e1203a68825b4fb9f739b297f735f946ceb1487cf200,0782e9343332eb14254e0e9db0e77a3637abcb6704b74d41c725d22ced6cc2b67027f0100827f7daa9001bd85a6a487610e34cb868cbd15b2cfdb791f88c172b01,a5e1d5ec8a0f74e8d75e2ce0d706d06479b82991cbad9f0868f8ab57606d3c93666cf2faa6bfc804b19ec90c6fb5ef9214976e7408c25a3497ae615363d79da000,9502dae095dfe6ab48a4ca6ecfeb62f36f76f2172b806db0f0fdcfe563b2b099451474a3295c36ffbdf19927d18e64887ea6e47eb3ead078bca70cbf6250661b01,52b147452b748a0527e2bc08259c541bfa755c6f5756b5ebec6e0de4c5f18ea465630ca7ea27314c198b5e0cd3341439c1e90f5a6c2e7a05899389c79235a3bf01 +baacc7cb7f9708138d02d4e4578ee8538dbde3590696e143f325685bca4d09b77f4d257617f615ecddabdf3eaa8e017cf503ba83b182b22a86686d3d8832e1bfd6b68ac7ffbdc898d2b8394b,3fcb3a8e75130f0277d58c97da35734c920352a94b25ae332a688ef62d7dbb8a,4a5db308fba567d73d78ff20aede1c9ee701907f0031494e9ff9d592e842f9714636829fef1a2e649969f254367801b9d370d89df1f964667328c968dfff689a01,c4429231ff346080636605b760702bc094a738424cf8c853a6cd064cfa748c98278a8a548dfccc78da68831d5d2744325a999fbab920e8eb2562a4b0379cbf1f01,3dbf5b1ca4a0b68a580f9ba93a9882d551e3710ca67d5acb3be5294773201cfc2f928de8c6d6923d97f4e6c988d4c44a781c6298159b0140b2e6da9c6e38369d00,0ccc7f5f8ed70803632e17431cf2d3ab18d9d609a168d5711d6fbae2e9e8fe554ddeb9c8df5751244d266c182537980a0d4edbe6757fc7d5fd80b8ef2940c5a301,889b0087a3bc03f9c6f282a3381d33356a2a09490064f215b15b6c328a91a3e9674a702a506f699d83899d8b93347a2ede251901c35815dd2d8244bbe873257000 +54195d9db2bcba98ba1b020372123d61e33250abb6c033333847e6141838fb1f2f629c149e7a448a4385560355741c874da493b723f42f3d6284b306474b1f5368ec0633d24b785703957de6,0b5039bb89f63f9d97c8efaf3ad05bc02e7af6b31ae465cb1a408d8f5b5e7766,b3b8c43fce826fd96c6a8b598ea5083cbb166a9d59b3df3eca21d23ca7ef52b1232ed1b175b968324ee3ef387cca75243226e57fee18f69c7d27ea84483f9fcf00,4a2af6ee88426b9d1c4a93b84f0a39bda2423af1a2343981c901dfb182140e9f4eb7a9ad6d171bf768cfbe880a8b08256cdfd7825c45a243c49f6488292b0d8601,db72c0f201bf46b0c2c1a09e41db5081dbac5b0ca4eb2341c57e6c960d6a41a77293c29f0950604fcb1dc481ad4f1ae70ebc475e1f97432e336e0defff52c49a00,9f25d993cd47827b72f855a3c507be2f78778fe605f662b843cfc84369fad5af3cf33e8ed1c50526288f32e73d3b4bdea3768ecadf8a75d55b3702b97fc525dd01,351d8160e5f1e539035446fef820175732787c5bfa9d3b72687f3e3dae40a3171a21485b2b5cb176a638c4f630679ebbd1a0f4b7f16afffd2fd7aa087aa5518600 +83b2e0aa2b10db2776cf33106c1e460f721b16a6747b18dfd63c4abb96d0c74f211a208575c0b81b235b4ccb49963be4156d1bdfb6653bea46cba3a8fe9b37d8cc8de5e7d8ea153f57c6c204,4d5f18b561bed5895d6e9d5b8296c30ced7120fa7f705f68e2832dd34a43f0ff,35403821060c310609d03522350f859e014ac219f6a0d7e0023c780a8cb24ac737aa7d996ce5da6524e1b143762d26f5e7a460e1bc94706d02807066cdde602d00,386319e5bd4b7dfbe0c8995c04f65dbe4df7a308f7160ed2e79a5e1b8e67d32263b056c1c77ea987f1258320a4ddaf015e4d2fb9cf450b974bbe80df5d32ff2c00,68814be4f55332f2f4b6da246783850ef18848d858d077b7175c1bd7c11b8f554652811cd2b7193188f057aa01e94d88a87cf3b73d479003fd55026ad76d104901,04d960e77aa787f1849dd9387d2d723fd6690b707b87b75287c641fa10d0db0f5efaf94fdbf082c891e55008c182d934582a238e4db4def209664cf25a43e5c200,a4787660d5295b25064f95e86fe5e800339428aeb7b308e5c44e0934be28d54e7011c1e375ca50b4368a9e1f53c90cf3ab26983a6cdbf1448288af0e3dcd59f301 +8b48a18b7748c0b3fa0aed6cd8264760d3085e7a96b4e76f77bbc29b7df3eef9f8415d1b51f441523f55295ec797bc8b3dac4b662d2ae5681cbec2f2835e56ae453dcdc532a80416c973e870,ec46b6c50edaf8d39a6a6239b08e372a6a71e86a58b8af30d2f188bec8cb728b,79d381f7ec70852a7a09791a48dcafe77974efc4e9abcc5a602800c203a0b8831866a343909090fd075af73cd187bf4c3f2ba645378d069d6d897d0e1b889cbb01,7367fd721d7c5c941d6dc22ceabea4f2856e170a4c411ac01838cdccc31c30db77ae4c07ab77b5a64e7ae7139ef25e8c4bd71fa4eda1486cddb44a590e44028f00,c6dffc80157e9cbb098d936edb7a2b0a329d2ca1baec08868d1fdbc4d2606aa4677e15c8940c8a721cf0211c222c9357e4987fec21179ae4e0e0023acf0705d400,cd45f8a6823c1ccb3be20856cc712f085430fccba9330a835f0126f343e9c0023763930da1465fd4856ed43e44240ff3bd87f9aa1690b3afd2d024ad3395a48b01,027f4a6175eb2e9f74927a00a51470ef2f2426f982a18e54e755d686bf8d8e88395c22bcf3f1cf7c03f4838cc68500af27fb74613c8d77ee5ad1886460351e6f00 +488268143ce8ca0d596253784809eb00d80318094396ec6ca7dc799b77603a03832d38669b964c46c27ac2b8647d07be6b789a59498b7b6e7a0480e1affeb13d33dcbf296600cdf740f03c5016,6db4b67f78728ef14a3d297e0f36d6c041d007f5fe82206b14daa95928b84bd0,45d383870e677e9b3de271e0fcaf5cedd82a2ed289aba4d424fbea8758d3860764ddff777c7b5741d1e738acb55977de45b030352f5c657ca5f6a40f498883c301,feac20c0ee7266c24fb48920c7d2318b58c3579f47c455a221b95c16b937c09764e2c5e34dd4dd07c7f239ba3866ad50510fe76ce45169859ce82e2a6a741a2001,626dae577fd69cc00fc3e8349cd3efb28144641700cea97c8573830713e0ede01ff7e2480297619bb92ef476f94ef3fdf9502da0a454b7f725d988343394260701,f995822e4572ce18767bbffc813be193f8852b0b1e270c306cd30ce1e23bc96e225f7ea678939a614ab39f15a48b75f5434e3303c732773f389610f8d741309501,270692c30da034cf65b87f2a237122dbc7e26ff28241f1c9a56b1eb2f0eb10762ee3805594e537f4859366c0e0df6f5b9363f6a7d65c2a63611f58e13a19ab7c01 +7daa1764dbf885c22b83e21897482a47e7f0f459abe5bdcf80a635d99d9419b1e54c309c64f6f9227c1a501c2887188fde2cedb6a34d5799c010ff0b3b3fe13ba6c14209ace3b224c27105d8bd,6cf62c78a2e794489d8b2803c1d884160b898fc360779dc01339ee15402a4f22,5edf4a8b411b0a65c019164e2c884390d16d3526fd42f010a965b63340d2450830e38726aef759f4466135835bd961e7a2410dbeb456e0a08769a3093d2203a501,8914124124ed31ae32c6eab126b59c212bc01e6a5fc170a28f7a6e09e303611f052aff56b049d12d65939575a79f854cc5bf7ab3f01642120e78d51a805e09fa00,3d2e40c057be1d0ea7e3425e9663d2a3736b25dc8db7215c7f8c20818778f07c26766cb40f28e45e67c6e004dec77cc094f698e3038450571c6770c184bf19d901,2f5ca1f6a00c54e4705f6bd0e6db77488bdeefad30962b0b331b366036e4004d7082d912c86ffe5c392d1a111ab0b6ea7e278739547a63cdc3c9e8e024e9f1c500,281faf054bf968146c3a3fe8eea6d628047587974404da960ff280dcbfa6c8b55044c5b0de933665931f7bb2d740a2762ea33de19847f0fd28c8cd4a92116a8900 +86c23c6e0fc5da72f4f39a327e1b07efb9e89622b84e03388992bc2ff70cbf3f070fb65104ba15b7e68a1d34251f91eb15776205ede174cff31e82bc0b7b730328aa9ad83633bb9f7859db2e73,08a27ef010a8511e9a9cd9b2906be3957515784a3d6a42508cb58e0865982ec7,c7520f14c50dfabad4c9f584f3e0105861b3f112408e57fb9c74c536685dd153615e6e5561d6f857037b742292a267f960477406c2178bb7dcbe6554459ff0e400,7f024af8253a9b61dba7600c6bcb48626844864e1ad72c56de03850c77e4d521448453263a408ed74c871278ba13f5389db297c5482607656b960235d09a5dc700,11f0f23e22a3f001bdd7d3010943b2bceaa0609e3aefefba22f6b66e4fc5e9cd4e21fe96fc0823e70d9f0c33aaa515988ffe0d5f7d644faeb011b04dc443e0a701,108da9341a2392aefb83e3b3092928111015ae9bfabc68734023f30550592bdb167bb40f09c899646dc3126de0e7a737adcee26c5a420354480725aecf3bbfd200,98252b2f9ee8ba4cd05fd72cff9a24760f0dd8d9a83c6112487fc850eb86f7727fa4d3f77f327876c1c60d17ff3fb8938a6bf7bd8ff0b45d1a4d068edecffbef00 +01fd0d9381d6464112c256b7b2ea9afe9dd6c5a6ab5614f732f4890392340fa46d507a69ba7c1f38a8df16577ff2e540a3b4413aa041be33ef02347ddc6f47cccdfefbbc7c2c3f2dc2d41c675c,2307c25e1b749f74159825a4820167dad5f99f3064705d4797944e15c32d62ea,46cd76cfa6b68c5e719df1fa9fbf79858703eeaf57ffdd651ba877d4d73804151a3e6952bc55c0db32e164f08891aa7677d3772c5cb16749980bfa9a8ad3478101,64062dc6a321c5704fbba12d9ce7e894b10f6f87a649eab55c257f116f49d064003a5f5543cb751c481c9ae061f756f31b57aecccd3d87809a86c522af40e28800,81e4ef2c75e1eca3fcc713b761f1e00e1ee99794fb7bf503aa3bad45fe6afc3a2a0244e3df5920957b5a61c308c0c1f57d39dc5bdf5f681f24d3efaaba99628700,37a7b859d99d015c966e40332f751487a0f9bc1b219baff5319554222bb7ec6d00446d9c877cddf66ec261fbcc4da79191016d639e992d10e2f41d3aa1aeca1000,61d8008f5d5d989339f93b18d9202f0f64cec651453c62a3b21038122cc0de2e405d250893f558ac0f2e433fa477c24f0152848ac784a7323ade4e71e29f789900 +a71282a2a5294ed66bad6f856da124dd6b8d095209b1a791f05b2b8b875171c2c95f818f63dd728f64a6d44d09f092ced2ef1528d50965ee5d480307af49265724c0b9f98fa4786dbca3ca6477,ea5e87f184e2b7916fecb2144d93cda052c32ee0d2c1760c68fcee3d145d1275,f6bf69efbed1c1759da3369c68af76c0b7b7992046d67788fe9a2f529681cab63f20fc677cbdf8471d250d164096eabc60dd9e5dc9b93c4827bd327910bd214401,7039753cae56ede46d3a609c579749af1d7eb1c4f1d5b0522d65260c86fb3a2326759d07cf96b1ce41cd48f6f883382c1b67c086f028aae6a62977a16212053f01,55a99c5a306161ff026370dd0781e990aac1ae4971b8d37bb542bcfb08077265715a711be53b9244f2de60f86ba42129ce64047dcd0fd7834c96ba1e323bed7301,d31cd9c9a812767425555704605088b44c3c76befa098da741b69a2475def08f005a3187cfc9ab9849e86887574d4a9359fce6a94c6d3b1f60563467f831191801,5c4993c883813a1ab6434d8cb29bc8645b09a6160abecf389fac49d7f174cd527d02fb05c1be87f03da54d08ad24f2bedabb84fd54684ff5fe1690b0fe0b37d901 +f727b4a7840b87540c0752ecdff693f4145d4c74482e6a8b0b34368b60452c9308ada4c50a7d50910a5685d965e8d006d19a04cdad0b364cce693aa67b877f23d0549ee50fe1b0fdcd2317e9b2,19eea3cb2d3d7ec360ecc4b0439a78de9b7c9d12c6f5f2fd339610f0639735e1,b4a315199034dce38b3332713502e446e89eaf9b92c91d06125acefc3dd6c1021693f17bfded3bfc6c734f411623658aa079e68e9a5eeb394dc6017bfa3ea96e01,c28a123359a7ffd5d269d3579aaf1aa6fc892577674195e896a12abfc89f70fa3694d1e81bfcdec0af5dcc2fad61ac1e1479123afef68c2eb92a67cac5d9ec2c00,6f4dd11a8d1ec600fc31d053dde6939560083a3febedbf6393262edf2622e2b61c3e14b4b9fe014a7d17c839177f1a35a45a2367685d164007988da5d9ab9ff301,5f4adaae815c8da4fadbdb1da477b893756f59ff9f84ad4bf17707a3037a04f55944e5243ff21804ecde08573cd42752e785d846e605ebb53f89436b1063b91c01,ce542c4887031b005c6bc1298dadca77e5ebd1c70eefecc79034981cd090a3cc1ad5a87670043d55f8cac820fb27ca8f6466b79d862fa55ab8df44230d57982400 +4a7c9acdbc033c8f449a12e48fa92bbeef9747a048593ab7eece700d3c19f922dc5765b10aa61d9645e340705b788efbb5d91bff7091fc4124fe8826ae3244bbe03cba40a240492cf2f1a010c2,59f277bce28228a8d1e32a039a6e2534e796d39d96cc4c1e61a63f2475264b95,7004c91c4107cc76606ad4cd922586d7a343633c8daeaf3d134fdaf779464a90576cc68df24df3acdd538afaaba287403add2209451f961884b9ecce5a7ab11b01,955d2ff3ac6fbae225ba58e0d17f056aa30ef61521ee43617538979ab622e8b34f7710155ad3e54e46b436d155bd1b6606a09e5d35b7bad235f9be8bc735cca101,57747698d8fd97e6eba25031397862e5571a828588ffc8e70c90cc767b3f3a6538d6a65afb29f2cffec09bdce29761a06297cdf461ca4413fe21a2a5291f561f00,18af73dfed8ab1fcd5d36d3cae1c0425ed391f26edbe6695101bf73b0bb1dcf60aee8dc9c5c1a4e9c20ff96b702a92d5e27225557b3ce473a8ea801829153af300,5919f0ff6dfdced7bbae8ebeae0aae24432f3b3e3121c8f3663ffd80e869607342dc3c2c284fae54fa077604374adb819438e339f289a15a57924cfba8e2543401 +a557197761d67222123d557c79e0f55f98c6f0b4df5c4c62f20158a9e6c8c37d85dd287dec98d04cbd7b62b4c47c7834f228e7eb0fb6d58b6347fa88d081a21f8b51c27e13f7e29cde2112eaab,1fad56bf74bcdd73f7952d5f119d5352c2f74d358d8613830a34045a8551163c,061b900f4a0644bc1611dc0622b5e1b8f2f0d35c70192d8224270e78707f67bc6ce0de013b6a5592ea6e2913a8ca3fc70c53f95a1ec828faae0d8b571e3de0a801,0c4b06674b42ed9d8d1eca755511690adc4b242b329d5274fb6901899d4e476b07e38fa0cf289fa0fe413152ce7317ed9fa034de1987b3e814d1f5c37a6d166301,9f8e6626997595d22b1e00e063384bb2c3c66670ee7545acdf9181e2ac3953817e2e82350a77defd7b63bddc6f39fe071cc14c77373277a1f5bf20df5436788c00,dfe6b64b492d618e11a19a07ac9211fcf803a4b52529ea972b4ec0b65a6fa8c24b793622c8cfd0e22ca04d0d041f3b7d25b36d381d052ba2d7708ebaf41ff7cf01,e8340e4ebe4553e2e4e7d673c04de2f41e416b97629c4e343919efb67462e1162141300bfb860384443e15bf6a15a976c53dd101663f5a96ef4c6810f69b0d8500 +744880cdc4c9e128ea45a46ba77ec7f506d9360f1158dcd29696c95bb45282d1dd1c01d1a372f48ce7cf3fbd9d85ee15109b950b253aebe129d6cbf343d30e8c37674f231cfb67a8711f4dc733,ef01d0c1d65b389c55c98c64f2fe800d7b90fddbc02959b25862727dab8ec025,b391b88de4e79255babdff9c5e84ee9b9f52d8a1e15dc8435f3b3c702e64587940431b2ea1f61ab1006abfe1c54fa780d3ae8018d88f4becae73d8d7066a5dda01,553e85fd8c0f9a0f28ee7d9280e1cad035048f1def75e6017e7319936dc1f1ba55111d006af06ce5818024044e17548166954c9b44220c46a66f1f5e97ffaea601,52ee38b2f5ea0cd1bf3399b21d22d7e7a262b48fe3ee30bb8fc9452cc554e05174c1331ab40f24f930ff1725d0536c00a5037d1d383a9fdb81d7e3542c00987b01,36644d94aec73de9cd3b41bc98685f0a95fcd33b8c7151ab0bc4b42893e513e66b35c004209ef0e7f2fa98749052690d931945e5866e4af79f727a758770cabc01,129a1843f5d02f0767f7c6415d550d403cfc7e69ca20f77c229c45e83e841031228ffdfd120d77c85eb685df6de59a513f0983f5470c173fde130b0db3682ee000 +72b1ffbe6190329cf8fb1c0196fab26d59f9544f8e67b95538d0da55aea6eed1714135dedd296c7c257a9784ab4a39294d8ead6b86b072fbfe6c2b9e6a42fec4974da7c67b28286d0895588e17,718fc3d14323e22c8ae73a4560702a696a651b73fbaba64e40e1d18a47c55d2d,2333ef9f19c693ede78f5262be8b5531c6bf2b2c3a589ff8dd356c9feaef8f182f55758892b060c5df1f597c2e56e483b656e41c0bc7c3e28d195c673a19766b01,d1afb2f9e278c7ea677bdfc495c0170ebe2f16d37bb99040e120f0b3070cd8b82bb98392af542c067eea8b78145b0331cdb5980161dde0f1b7610b73e4d1551f00,1534c9dde5fcd55d6ab4fdfb10dcb58b791d46834d2939957a17eef698c4897856a60387d41812fa7db212282a769e54bdad7ac9e0f3a4c93e9ba59fe1faf99301,92fe9486655d8537196f29fd8c5446ef8e7ae2673ac81a09ade631a99e7d603819887c0b9a27ec7362d0f505f0c399c37f62de020f27d13e310e42f0786a4e1101,c76d25c48f9f2fdd249ed74d0c06f64a3ab44bc8572a8588b7891ddac80952ec2a29fd7c7cb45f2124bcbbbac301548bab2e106fff686d56d2d09b2091ae060201 +3d07425e80078c6954306646cff7efc17aa1e2fef878f2b5082aee7d6ffe329afe79af14b5cf954685894944af995f7aebb0e735719435dbdd3ac37636e3d8a8a1c4b7f1cf4ccdddaaffb6f21014,adce2d78e14d93adc872178b6b6a4406321cbb27a5e92eb9f31acaed48d91e08,b71892a1252cd4e68506cbed0eae046775b6b46eb13b844ec847b731afbca5ae62e5c6a9bb01cc18820e62855127b3a0493a15c91b4963eb215b128158ea90b101,643b0732df60f688734cba860f8740a76d90049c87731e1525ae2571b028ad5e070bbea0fa72d93545fbf10feb0666343017614f2a9021c555747cfce10a0dfe01,9069f4f011c5b6341dce9a19b0b18f617fb2400bda669d77fd6e561a36678ddd1b61786e2234677c4078eaa3fa0d1d56f08fe2ef8e79f6620d91df59819ca96a01,8a01f75c6e5d63aa300037e310b76fe104ad0e297c9943fc770e1f7d02ab900b53a333f3ba3d4dd89832a9d9d5b01ffdc1088730ec58f2df05442891835e09c900,08f50026a7edac98c9d5182fd8fea44b40d82f2edc897521487e6ffab8e40767718f318872782b789a30e2ecde43cf67edc5e7fe2a0d9e9f9c64ca542387103201 +dd4ee60311b437d371abff15e340c4b93bf4a8ffda72d4c2861fbe72292a1cda03ee99896b201ea0544db56582ebe97ab4b3a73a0517e3c7d12ec6152e1ddde3c108049bc2d8533bf62f41e2b12e,2431c19db08d435e9e3bcdc1a7ce27b962a908cc4b026f9d8b9bfba1fda5e6a3,7b7ccdbbf6212c0c443278da1501b37d4834bd08173fa8e9915ea8e187d8f01b435c0aa1e2bb00f356cc4688e1848ede9637d53af4aa0cc72f14caa008bb823400,3d32c5094ee8beaede65f5089b78890b2c54f370f44984b780f574b5bc43da6320341b7cab9f3b48c562960f0646edf22be8891ac51e48dd5e0a7a75d477d24a00,8eca39644299a322dfa1fba6936ab6bda28fef70ad52f2ffe3f43da878b933766050fd129311cd6b2625268d540f6b15354deb56d79d2b6bea28148156826a7701,ff3b2edb6e1076056b2a4179bb04c04ed459a0b2dc840f3f660b60c7b75a2ebb4219394e88fe9de63eb3a2d7709f1a14fb8fdaa05fa15cc5f5861d7c468c297100,9d05bcebcec1d9722f0bc2c90d0d3e803c12602329b9cf5620d48bfa4e10eaaa2c808be6e16cf31fe653803123f6960e694a9bb2d86d7059c272902d66e336ad01 +52ee85b4b8c663313998d37f323835d417c0a28e07a02e19c83e9ff62fdd8e7d9b6944ecd510ffacdfc4ce9f3249604a7f7a89564e85753668a9f523fbfc58f6dc37c34a82ae83f0a55d96cda135,9dbcca64396be00cdb099c1bcf83fb5fb7f2e391bf1684e4a7b985a7ce9b522a,80a22ad8d6f1d7c7f47d496cf4dcf82d0cd4ccb102c16783221f948b431b98374bf9ab231d8fa9137d960f2a65d5a2c0a25c474c3f27a7763ef9e33c6ffe584501,bb44b30c400d7ddfcf487c86d27be3e2222eaed0acdebb836f9765ab564abbcf345d47645e7e8350095396e836766b43af75c17f02908998da1fdf6e5dc7c8bd01,27e17c9a4a9a6925ae316d0dfc805e6015cf5f3b9f0338363e24c2201c3f41be50ee9b0c02979ff5788d8fc43e4522802e170a174a0289783b1569b155eaf4c100,754a3aea34fbf64c855d35014674c606e81c987854848fd9d520b0d3719be1524ff3a8481b6ae4436d426eaffaa607fa069168f5a581ed3c17f7041eb5c61dc500,dcb120e0b11a0eecee1c4e140e2a2c63d4be15fa9700889db600896b9fd1b251715f6e1e63d5c71ec5fb4b7b03748c87d7c1cef4b58fbec7c0b8010f1374a3b701 +c567eedc2ac9b95c8752b190a6e77f9e62926d58181e0cd2859eaec8e21b500cbe7105480cd840568a1607bff4164b00183ec9482a72297cc8119725cd11407d2b242bb71eb385461570d9714fa8,c3525e32839c713e59de1b726d1df04de7011d35b0b7347f88815a36f1769698,d5df707479e37249b9e0156ef798067f9134694fd47e50499700eb90eda97ea85ae87183791e32ad909f87acb065cf74e2f88aa6f69d07171e17da78bc6737c201,c6a2e447eaa447dda5df38229498afd27690b2262472ae7fa6b69ca17bcf78b219dbfa768b453d25b2b742b87c1c867c648f3b7687074a99bb0e00e4a3c5799b01,1ecff639bd1a1dcc17616156a71be132b40dee62087150cdd80847e22211349841cfc1cdecae5c0876b0469e5f5af82c05538b89f98645bf78116d56117702ee00,17333ff817b622ef4a0b1d6c276d6ffa536a7c624667377b03a42c760f9a02b95788ae6026c4bfd68fe295bdfb3f6d61cd9876f29c7c2073f4a52971ddeb758f01,4bd572f99d65081cda92493968979235f2631b1f3d3bc0cdd6abc1fd51460f6f6acdb2d3a5b8607278dcdbdb0d2781b5db54b66ed9d9214ae26e7e194c8d6d2301 +52adcc9f76a6f6e5420759ac1655e9b5d65d1ca1d966670c02d9ad9ac198d57aa51dd1945275f813b13f2b55bf0e2d1448b48b8134e700fec046e7be29a63098d833320d1cb7b3e1cfad8f7522e0,c39e7802f176b8befc5350dc2c8a456a84f7a9c9a2286ed39bacd0adb3443e6e,0a876b782cba9a61ef3713af77e626280e6bd7a6f1b903904fcc14853b659926322ccd1da3b9867a3ca60761f85bbc02b9cc8cafe0590a8fe511f335783784e900,99b4a74449cf06cfa6b1b2fc4a2626cc51568798232b55b9f893f5807655693170cb6674d08067fa57a186b1b12d8f341a1619a84db310515c199de96b880c6b01,363cd53a91c9969bd9a18c0e7708aa7b3c1e944867a67a0c4aeef16d27625c34492ba606280ff7a8f9fb7019abf87b945964fb7aea70cbbee1aeb3d0cac47d6701,6255acc4f3c34669ad7765d659c35f4a172ba5b2c840bada8b77ff84f98748337400465d75f9c633ecaad332ba5639ddd165f3579803f57aac218b688570297000,75c538bff5bfddd86339be9271740f43dde0cdf105aa8b554c7f6ee8448cc8d61931359abe2e668dc35e8005f122f72696a3773ebcadda5080e7af33d799c06a00 +d5399000e73a179454aba8bb274fcfa3d9e960c9ba1c3ffdfd952afefe10ad289f91b1552beeda5129b9aca3ff173acacb1a3a6cb63280b61edae81d9cf47221a3a3194880535b4e510303153163,342659cc468f2c21746e19b49f06acd5e28e961d12ecd6c7545e2116b7193035,009f954a676335dbca10d2e24e88d2df71a9e9e992356ddbe34ad2011841749453e3d10553ad026f5cfb714e445dfb76de630c40ffcd7212df2451b0abac63c601,1bf2a9a57f02c84446d52c337ee88b84f9030cecc1e509599ee669331336f09c66feec007937b14c5f44be40ceb4106749a9a9a00919e5d27f244cc62dc3164700,d1cc849f05f0e24b91feaa608a884acaf445ec6eeda84a8f09b0d5cecdf12e1529785548fd04d97abd61d2d9b8106a44546b742300d5e195f59888da74f7b1c500,785e3143fc6d4c3b9f0a1c4785e55d77f8fb97c0e1f9ecd9003515798506daed2da1b76eb8b391cfe390a561c9e61a38e644b63d16472bdc4c7c5f22d2af376400,5132915eb341aec6393e895d129f91d3b3cea13c093178a24690fd641cb6fe452b29994343f790eae08f9b61b651b951386a6861a90c45d802bfa5c8cbf5692101 +0ac0c37525abf86e9a29daaf450342cad62fe212dce22816c6b95783b1b544024e879eb4b81bb2d0030253661c933eba8e509e7999ec60c2b3b4639d1e1c668981599ac6be7d3667f1a59125122b,deeb1a78f802a9d0c5d9dbfc810936dd5a3ac2c37d19654e13cb3e0f265daf6b,c41c2a910e717ceaf5408587f334b9567c4a4007ed165653645566beaa0a46544935496b3a29d95456b0b2aaa8e64f81d2123925621c70e5f3c78445c0b0fbe300,7637410484ca5c70dc55c5ea4434cbb35eb6ea6e95acb9e247de3ae33d1e4a24314c81900ad0cfaef9aa5d00ddf6934f5c2c8d533ec27b8e70e9e7942ffc039001,9caef6ac18b577038d7a142b02f15e633f1e3753002a0206159ab357f0552bc62fffad2220c4333f058da10a21808241496b836533dcedf948262f67f9c459f000,ca3a14370223df0657f343c272e37f150e4bf69915249486744957ef9c66cb277b71bfd2d51b0568b9e52dfdd90ecf2caecac7cce90ea1d9b47fc4b3848aee5001,c8718cfae3be3e1dc38ed5c298c459427ad6eb9efcd2b5700a9c355e997f89e636ca69563fe1fa82fe47daf62251235251d813073f95f664f19065416b71f52001 +5eb732a3e436ad2819a227c42de6e23d781d0a15c97f9f129cac6b986421b4fbb1f67c5fec8c4bd1fbbb3fc7f6899ce1930f9e88e8a475c7e7c0ddde0fced8e11879ba6ced756d761c9685930c7b,6789c86bac2a975a5530bdf68cc45635de309a6148ab64913807748538cbf212,044dc6e3c839d500296b6df6cbd65ac9d8004f8906878ad921637587c4385e6a300110e32bfc1ce8e09dcb134028ea81df5af83e98ed3fac5f75347cd2eac8d700,be71d56bb344ec2b4db43ab13f92669a622f845f6978d664107a6b896c647090301501e86e6a15bd72bcc29552c1c064b14ed5a092938570eefa1e843044ff4401,0e255c86dfab0733cc890b1e95026a4d382ce4433a99bb35c06f3b89a5165f582df660a21665bdd994ab21b27ca812fc00c6ab2a4498cbaaa38686e8fd9592e800,82f90998150cd7d594692a867e433cb8c9eb6eb105d24599b5a5dc349b545daa34f4016adc8eb1e747132a519baea568ebaf12b9f0d5dd16d05fe0a543315c4701,9f0c5506df204756a810501fb23062c30a7903795f154eef3107801416283a6e3c94370926321bd8c09b64ba3e9a59fbbb37c472073dbe47f65ce86d6b34658d00 +d82a359583b1584c5bdb999fab06291442f22f71053d823e7411dc1c7cca253cf61619590b464dd0182decf04ff65febd240b049a39e0802e005478b406c789d7b8e94c79fcef8a5879dc52899b3,d5c58acceb7535920355404051af075b8ace46b3017da83028f28b0eae77d1a4,d31d363fd65f5902cf4bb7c3fc4d26478a95744f5c86001dd7a6764efc78f618510fac6447f09b81242d413e91f3fd9ed1cd9f66d0a83b81939222b2bb455efd01,cb7dd9140ab511fc6f4cd89ff222a69492936d022cc1efb6601e6df9fda8161c7cba0b27be038aa42aa5b626b2e4539d46623f1726c647ce178e6feedc57860d00,2f4f108cc0df2003bc92dbbd8370f939aa63986778d61e753e6cf8a2ad9c317e76d2e0f9719348c724968640a7e16bd3002eff26cb825f6d56070f7ce53b8e7401,dc5160211874f668ddcedd1afaaa4bee4a11e8a184caa0f494f6851bda39a9600c8d9958e91372d80cdcf0dac8ab87cacf4b2f3d76c6adc9764b05ee17101b3d01,553af00e1104e93abe0c7d6ed63ad9fced4a53485fa2cea2fd6b353c45787d9b544eaa9a45ce4c22e3aab6d6c90a8cecfde4ddb4db3c1013ab14f11d74f046e801 +6b7ad5801464aca0a5aceaf4187e9ca3f672629b129c744cbb77eab9c7238e9dff3736741917745e46c425ce6cebb52357a6c37e11fb411674c321f80141c262a30e62c743d9d20af19a137fca56,2fed3d5600166884d0426d6201f9f7c48fe328e0b0417dc56135bcd29dcfa4b2,7545319c8e33100d6bc83d30a0d3b0e92d8237053230df294c7e3ed5275a6b255dd23cca0a1a00a941864e7926efcd7e93ade3321e60c41e49e8c100ba4c210400,10eaf9e4fe5d09737dc2a24547f8c98409ae4efd0faa85e980293eb133af15e643fa522259a060e87be4cfd352a9b49328e6f54406459aab02beff177fe0226201,589982c439d23171b5da9296e61ae5515fa88005727bf48ea88233d82ed442b75272681505b30b1982340e0ac32409103143d76a1707dcf87dfd48e0d8639caa00,805afea7c3d602244216deb87debb9b476d9b291f6aa0f68d627007b5f3ab7c03ec2e3f81d3e2185d931f56c7a99c429af51985878e13cafbb335dc63ae24a3a01,2ca7baf1a9347a1837d56a2705caeae07ebe040c288f95dc5a06729d9492dc715fb6adc185073ff3aef181a801c0b075edc3ecb13d9428c3d47120b84b9fff4301 +54eefebb7e877adad553ed7890fb0c07f0c9cd7d5371e3636fc649592264df47059424641ccd6a53478e7384c1141bab996fa7111f490432362f600a67c157c7ddf6daee015ab5462cdf33bb67bb9d,129754f65170181cc3f3f2b7ea9a986b4913b15e1a3bc612c6540049f3da3309,a1ba81de3781b9d7393d428ff3f9903863c0499faf116e0aaa5b41b7c4c32cfb193b824ce56d9900800ba857e22bffbb4903b61a40b991c5b3b6fb8c8b5038ad01,cc150140943dad8bef72000ebb6e3acbcc18b7b03b41c79d366fc758d56c3a291cd311d6512d9dec359c1d46f12a0be9abbffb9cb8ad5a7b6c3fc36336acb1e301,1c31447d45393f47d90c4c68c235b14040c8e8fd7c5acdeae948c6b638a7f920009dc9e199a2eb0de0dfcaceb20c13b51a5c3e17561ffda51de66f341a5a752800,390caa6ab0511bd8b02b9a93a18229a9183925d13f673d46e3829cdff9d4519c32a73b605dbb7ef641cfed09c41bed6bba49ed1ee10437f5726806df2ff0968700,c793d583ba2a98a836f699327478a6910fbb24ceaa2ef6e051841e37a76b39961d88498d08e1b119946954d17685a78606c0200b42914a7e350a24c9a2df1a8101 +b98beb8dc0bc485d43d872ddab6529d868e0e210f70838598475fb6d2b6ace8774ff8bcca28983a016c81590dbbb5f03b781e886542e5bb0b80e690c656067e4a3e6be72d02834f570e1654b71d827,ef71f0c03a6d1d05dd97e9efdee39b517f3c307eefaa0f02feada779dfd0a796,e5a1f466f52df84618347639dc076172a09d5fc97f0a37d28b5413d0b31dfe91721a0d6505b06fa0c47696cf3c7f06d28d1c032002c5b43828d6c2ca7791219401,4a6144b64ad2ce8d1f3df0d03033f3de940ec7deefff6e54435d497c7afec81243d47f273fb0f44dc09f6c3ba1997d1f2fcb4ec26964cf3e7bd34324a41adf7701,d20ac7e38c6fa4a5a7c3ec85d36c63beed3d9e79063acb2fb6ca487be778794b041cb1e874ec6330daeb4d578635714645d4306d430cc6b18e264155123bc11b01,db05d9072d7c251f4d5391d17ca670f3a383261cd4f0835d334634ca2534f1a565f9ca1503a6071811b99806b586fbaa08f5cdffc608709a584c016a5b01978f00,4f9ef8f97a61cb905d325c072abe3e08c763ca25534cd1529049f9e93a0c608c4d324ad70f786851dbcea095348b98cc8b176ebdef3313e9d9ec82ddd1f079af01 +320bc129db7484581200cfd0c9cf9a4c2d2a9e54ec3072d73d65da931199669bb5e687bab415472b83bb08fd2f8a051b1b42e117fb6ea5049172b528f5f1447ce219cf9ff6b25069836995037fe277,26252ff218804477d8e2f9ac55fc50b0f8269b6e9f315f0ee1e87fc9c5564e2a,43481d14ab9b08dec9fe3c3adaaf3b60e4a135784e6d260b1467a1c8996f314f565d983232c4e986b1e313bbbdf47915818418fb9159797b1e80af4a2215507801,44b8affee4556d9fe32341522a56c313d58c4f0a97ad59727a9f8e7c6006a0186c17a420dbfa9514b181dce79cbadab0a12ad32e6b397058bdccd8ea71b7677600,0db380a6b1f667c8aa25d6741b1ebd5c31973cb1503399cbf3020705ea76b308609e4b6074391437a9bf6a5fca8557cac664679837a9f51b987d2095e0c9144100,c93ccae3e42a08156af0ec390cd7f125f4db0276b4fcc5337c2b68bd73aeebd06d55200bb6ccf1e8d98ec6173bd409d7085566d4af46d3a009ea1bc165de904e01,65c54169134a60166a48c9187e509e6d8be5b781bec80094c405a3e874abadc57c23fdb2ec26970cc6223441a654294ec171c7ad4f4d22d332ef0877abaa7b0201 +24d2871d54c588040904e4373d604e42ba7d251b365246fcbddafdc5215a995f09f8c074e29c871aba03378e267bc8e90f9f8317100202e12f01f77ffecf80167b469373f1f936c6c0bf02b61d6b3b,0f4714e466dac54e790f50ec30e69506236017ba072e1b2365c8367010038169,6ba977e1d57b071af2a0b200d3bfa5e46b015a00cabd9ae3c7e1ebb39d9b379461606f7191de007adfb3a79cacac6f381642cdbef7b6b73bcf324cb3eef5315a01,0c07e7c8594c6dd794c7a4a25ba104f357bdb4a4b5da98acb684c0d1651334ca028e2f3fe95bd0d9f62ea7b7d4cc4864f5f9fa88093b14425cd2971d05e75f0f00,4b10efa48b9ac27d3c9b183efd2ba0bf04918ba4b7b03d8325829de31069d7594758aa692802a04e26476d7cf8a5bfdf717b0e654cf1151f649758905cd5b66200,b52fb2c5a060e17be7a4d3698ac73f7e631023f1d9388ecf905ac82e8293650754fe46e99a9f1f4e6a2d783d0948af81a37d4ebc121fc1330c36a3ec0991568900,8cf33a5e50e2fd14c84f47b0fb3dae45af6263f8afd2e10085ad20797d2a86bd31f1f71a5097cdf2bc5dfab107a87df2f83321740da2480ea02a837fb2c2b69800 +45edb4222bfa9138439499427e8012f2db7876eff46b8be5b4f88ca7451bbd42f8e1e8c89d6e0578ca07389ac305d460417702d137770158a1f5854c388343d6850a6dde6b24df780b813d11837c51,32b3c04078fdd07f3c00aef55d21e8552f6c5795da01a873ec4be212e0609daa,75b4208b8ec60d600fd852bd733b8a3accd6c71405351c8bba38947986738e8b6bd8388e2b2a2f927ccad9f4c1fd46fde974aaada800d2fcfc980b51bfc0111401,f26168e7569d50b3dee18869f92f65cb81046ecc43288f46f92aa0716d5f729c2db2ee1af26bd7a030837e7773c30a725eef09ed561497e1d1952088345a726600,7c49caef51c6a386949a04dfcdaf8e034072c82809f5285557a0c468c25892be501748200c6aae56dd4ce3160f34165e8ecb706e6c233978610d033ea9c19c9701,b8e57faecec74ce66aa60d37e7118c5140a39a4ca2078d148306d34ff9774388327744ddce3f802b6fa9bfac285f9a7b3d79cef419b52f313c65fb303c07108800,0b5640a39ebaa2940da5033ccdb3c4060236f26f3d6ca0059ba1eeaa260dfa3a02ceb07f29ac84e7c21e90cacf520b7621fb5347392293d1f7fc2be9c177afdd00 +ff490cf53264bfa3a5a8ce1f438df19b5e4d192a909a33e9bb6dae7c41acd2c89a6d679da2737946aeae1115a65f53741b1455fccda4f692e869445dc1b77e63724993f6514367e9ba0bdc2d7d846a,05fe6fa0b8b56fbd0290e73ba683f680d92d67bce8cbfb927778918ef5b470ac,b43872d795d1e5da972982dedabdf1b8facb18736f2c35fe30891c44428acfda6bdbf7af07078b51c530e5dd9581703b700569e4ea9e69a983651d6861d2e6c801,eb56f86048155add2f64e9797cc1cadc74d0d139c88916bef0a606a94b063b795da3aaa498731f308d750f36fc0820605168514f395d55e81f0e3aae36e6f98100,b3a4cfc3f1222861ea8622b20205c13335e17b0b3640a822209fb8a02ab7533b7298bc336ce22358c352e061c74b11921d6dffc329b0229b374888856e9aeab800,8254e8f81cb7142728b72cfbcdb2b0b12532558afa000340e2f303d753a6405c49fb4eb187ba3e310a825d3ee19b49b250eca2d53a4a4062da5a9fcc4079c73901,fb6f04ae3875b5b5637fc86f0a0d9215df55f8320a5ab08be3d824e52db689de74f5501101edcb50e92ab00e52027c6f1af4cc64c14e2d51424e8f10e693597701 +b1bb5d06899cf86440a4058ebc740a2ff267ed2704522a6abeaa0e7b45903aa691751e110577cdb2d62695841e9da7a7e7e3414d976e29c79d2c6aa8b90cf5f2e392c6a4fa5358cc63785a28bd8c13,c0b305dd5f802e3d45c85a7cea9c42db64120ab6e3685740b53ac25fa81888df,78fd41f95f6eba568238eded6b6a3cabcbf336e05a67086fd2a521de291981e852ca9ba4606a2df42353e92a0888662f1cfeb9ff40d9bc339109c3d0e92cfb4601,06c0754738b01169b4ab1a89045b404d2ca96b56e8b29a4545fc7bad17b5eb393ab5c82631f27e01d293d589f08f12b321cec9520123d21596b8de231abf0f6d00,5aebd7ce322d5f128962e20397db1d2ae91d5038bbc0f10b12ea296d72d64e7d786dd3b0400fd1b998404a67e4ff1c2bdcd686c1826ebbe1cf8d1a3ac81917c300,09f7ac52c547cff86b20b8b812dbdaf555b749294043ef2c079e078549ba07c82d30b5881aa9c7b58077f8ea9cb4bfba28f7f69548d7b9118903a8f00f0a72d500,3f7032dfc1f2ca6a4472d2d7d88a8406e88a24ce64e1f83db387bf71119f639f34d55f41f2b1bd11f8d9b0fdc30906eebf2eb74df11f348cb2cff0cd98809bb801 +0b1144168c8ace1787d0f5da423429cad404562b64aec3f16c4de84b78129f957c59d3c728f1a6f8a21f72681f9a84f91dffab3d98292ee09ebbc968d0d2033c3d5b4c884f844136bc10cbb9d34162,a7e9f1263797e197fffe85a94d34389f7e14fa07875048fb25cf14015016572a,c3674248104991d9e17fedf905e32842563b7196f203fc0d0f6fa6cfcd3c35c86b6d4cc5db8176215e32b194926eb73a96bb2bf0f9dbb3bebb36e66b649648e600,edfb84a641d8a9630d6130b2009eafc3fb311e9954a487ac6dbeaf4c43a2effb5f52871f4ec1ba60d63101a85fcfe27b9cd2615e4c74a882a99a7b216930598300,92e892c5d6909ee80eda71bab47251443eecdeaf02d0b1d8e758982d08f610347e02fa0bd7599f788246e681f37edc9b9eb2f26af80062215aaa364efffd645501,29661836c8944e9c4ea87a475ee75fde2fa42771e48278ea1c3069b80596450201be58f315810aedcd1e58696c689c8894fb7c25a06ff1fe1843de14bcc8385600,6cd071057bd0f0dc76be4aa225a40ea5085796a489725ff9d623a134c1c5793326546ce3c042b99ae9deb9068778615148ebb0255ebe52dd0555b79c7ddd866801 +c8445046c02f035bda26d4837645e2357f3a83ab4fa48adbc7481360428b18d4b8956b5fe021b14286386911e1d701a631d719c3e0eb13f7ae14f1df1d7f563eae2feac837243afa86107556e83036,4e788dca1294e4d1a82464b60636dde416582dc62d5c5cd0dbf1e2575d98da4e,a26145c949283309983a1857f86f055d8c71f9618a3ee70886725fb6ee9a45881fec33b2a0748a4d0b2e335a8e1ec06adef3e23df41019e78af5be2cebea033d01,fb157763d94e71bd40a1204cab14fa8bbe0952fdc2de8d0054347fa02c053d7871ed15c51558291d221d4ddd4ee4771787f96b6fffd6a0e6544c0e6161d69f3200,9bc6080680602e0dfd59b6bbbe5c2805fc2b8cbcc4549f61ebb5ba4a9c72ec1e290b6fd77c1fdea2d7d427f781086760d424c981b551e75207df8359c51a6a0801,7af8b4c1aeed4b7d4d2cae8aea86ca5b109dbe4d3077f6db141b4028370fb2d54a366609c5bf9ff8fea29410d04436ba1e38e952ebc357ea21ccab578f59449b01,7452660fed5a06cf2b370fc65b6f4409fdb0c9e1618cd7249d370cbf7935f3cd73f091bb1aaeff3fbb2a8c3e7de57d205c1089cc57d8f32c8d92fb964211861b01 +05f011d84df656ae8bdd0ac9141e232508165dc58023b658e4c3e9c6341bb233bcf89bef30f7a0bf81822c9c3bbc09b5b60c37987e91bee48b4168820e3be1e47820683c60375b5c7f812c9b8b31d5,3035f54e0bc95ecb5703b90c7d9af3179cff15fb23a2367402300cbe237b8c59,b5205160838007dd8e5239f37dccc2909f12cc75c493b6a4a200498c39cd680b45e3bf611c01479c54a5169a5fb0205186768b7c9c30f9593699106ed99fd49001,9f4ab01e36c640b60a2e9a87aeae8de4d2fa2d5a1d0c6b399509f7d0c2bd8b881cceb76a7fca221051a05bc15729a737ab734153b276a41784eabdb46c0e6b7500,926c3434f3434af7c59533147922487bd713ecf3323813e0fcc039cde14493164f4bef03a5838b37cd037bde2ca34561d33660975674d0f7a5d70c7cfcbac52401,71302492ce05ea82490c04941404150a6125eb1c9054b14656ae93470f5ce2961043401107dfcb32cc172fe5a916b27bab1492aebf69fe810541df0b1a833d2101,b9d52293f34199bd5044ed5f19e58876468f7695d21a4aa95e21a5fecbce1d5846a8e1c179fa4b64f5482af2b5e1bd43ae859471270e93398b748543b65febd901 +a8185a09a376dfe20c88e9d44c5f59c52fb20ff091bbc1e458f80ffa4efe9ba5e9126e2a22a36535d8028229ac2afba8dd191e628feef93ec41f13c0d99d262f602f8b1a989719ed96deeec38b7ffc17,828b4be83672db34ce6ae15faca2b6bd4347878d68ba02333b849ea67a5682a7,f35a058607c0e50260cb86de65f1e47db8f6c625a01560dbe9bae58799b8cf82403e9f9928e9e852e392d00d8ba7214c001b36fb7471591afdf3aee7779a192400,f5133ec9b75759a2bbc89cf928d7158de81403be0ff5269b75596fe0275cca8f5f1950b3c51615e17e3e8730fc2963949c1b87758af9d494cb1e103f17ec0f9201,3760b5e79d2c71c59ae144960c96eb929b6d216f0f7ed2424559fe7129bfe2ef297a01e0513056c0e382613b20213d09bdd8c6c060d47fcc2ac63485d323446901,2f77462bea12a8ab94e292fc3af4aa9425a7d7a4c65706c03d6d954cb61999b01dd2319f30917507d61b5a837543cd17166d7d8a2d7f2a3eaf4dcf697dffbb1301,3bb45ad2f50e975aded7fcb2710ee6ac8b90bdda211192f241468ba44418663a4c55483baf7fc33e446e6a873664432340bd29f78f6f04ed32b2abefed12931200 +42165fcb12dee3033189b3e6f6ede18c1eab7a5cc7bb8d9421ff1b21a120c93cc2560239a1aa9df69938cf438f4ef4ce4bf245409bd3ee27cec94f735424b079352e6d846d12b201d06b42e11687d3e5,9e4a2204543dc524dece940f1972c3910b4039ca47df085606423fce4756c4ee,c045ff62e80f228c1e73f71196d3f8497ec756a219097da66aa31d0074736129287ec75871b9eaf04fd61bce303884e41f38f57635db9b2df3fa461b2374d14900,b4d7189f1291f08a345d8ec025d4e9a10593adbc520fcac0b8e1f76a405464353926abf6e63a510dc1ce99891103109a3b4f094781775bca29f706fc2df72e3101,636ff1a47f377e8461109a6294c9f32ffb7bf9553e57f58fcce8e4a220a4ac7159b0c7f5bd9917b1a8ee2847565cdd1c93348263fa3dea5f6a8737281c9853ff00,a1f6054ecb27d4d2b2c9fb9692393cf604ad0a7e04d62fcba4e9fa95bf03fe11181e2cb4347f7357203a136bd5de43547e607d500c3573e3ae44f90ab203c07001,3e2e8b45fff005049b9c01cfc1c4f9050b0d04a68525181d654153ebb1a004362c393f5a434215e800ee7a2e6b76b536bdaae0fb6db91939780a7d5fb6f79ca501 +ab20dd189187ba55027c6f64a67b59c42161e28dc701e4345e46c8183a03a77e3ade4d64dc01b9a43566d77d5a4141ce08052f24b55643b89c85e160b960ea47d187a5516ae2190fc67f531ffea4e330,eabeeb17ddef192379745751939831a41f0244ab1a9250cc0265a053bc42f9c6,f5526e6c9d822a7e9f3d70acd4b6ba1b34056e5239c54dc28791e3cad2d65c2a404526fd4636d2d8e362513ca2fbc33b106a8546916e4b51ad6db172a95ed1a201,4801eaa27d9acb6d570a83bbe77a10192b3468692423917845221e9f4886c8fb19865aa7884d3dbbf7d37f8885b8f951054fff1fe273b22d6261dc623aac95d601,cf1051ad43f222a576af4d8912cd50e970aea89b7f91c48ca48f5b7cca67b4112aff394faf73a20f9bcb4d34b21c9aaca19096adbc0b126ea40d27c3a14c1ab600,40bf4f6a359fe330c0bb1cfb2c09133a3e7f5f3f3e6147923e479fd8da9eaffe2f8606ae0648d19c2079ced190cac33840198881e0dad8c522095aced01bad9401,1e7bbf975ca61c325803afdb52909f6b506010a6c3a6b7cf95afe5d5cd6035c25524367904d8d871309d9d120c63c2c1315314537cd0a45b70cdddbbe7ed979801 +953ba6e638e542297dbdbe16c7a8845bac4e687504d7a5ebb182155c5a17c62722cc328993da691981a213786fdda3d82d1053bddcbc01ef799baf91d2cb4472607fca1a7aad20069b67d90f3659af0d,27eb35d3d684c246dd09dd77df2b7b478ec1d5c288f45ef8036a09af2b4d688b,c43842a5bab99b1a3da072da58384ba8a9da3ad2092e23429902b21ed0ce039b1ee358c465bcf10dc1d46c82128dca06284f099eac30b972318ed9fe52d80d4a01,d5a49bf04eb9b32ff34c768865210310e49ab7091dbe60e11588eb8e0aaace3756fa7ba699ef61a7c54095a0ad7faa41b832fa07b0329dda24caff0591b0506701,9cb9dd292e3f7e8c852fd26c302e84b8ca459571cdcf3d8038967b602a70e1114bc83ec0b0611073e057802ca2879e863aba5e059da42bdde40ee0348bd15f2700,e8eba307bd9133df8626c34df0b8f479265a46181471d601c563413eb500f6107d1db3c1dade94680115e4484144616a28859ecd77ce2d2ebeec320b6b3da90301,be75a7b22ed0e7dae074561a57e52fdc6eda3b8d2431b4386f188fb72bf1975923b63c7e88340513168eb4a047ca12d993f315a1919377e3a1b1ad99adb6b3ac00 +0ec7206540bae6a2c8e449b0d3f3ae392ad68b69760b1f6fbde90e22d520068ad1bdbfb44359520ef2cfd7278fd2ac8a2f7668e63dd2d3c4fdbe6d8bb42dc35d44b58223b847616de3197a90f2ae27a2,1a5082a6548bb50c70bd3ed28995ed9e1e0eca6dcaf94f60fe30b418577b170b,08e637d9ba27e3e712b9cee572d064d64d657ce858cc93d6b298b2b445e69ce8092bdbfbad4d532ab01bf831d339b9f0088e52b4d6163e055f4c18c792fee26f00,160dfac025c1843d8eaf45467101f4cbf374bee3259c8eb2ea0eb255c50a3396075a5fda658a60541e616b636a483c1614f4edd0b0030b4478d81af3cdb566df00,f300b65f9bdda2593e3fd2ba28eaef5e2a5c7786b19c5cdfc8d9ecdd1089005c6242c61e9e0e97f2c929bdaec3f5d21363e3dbf2479605237e42924321d9b6af00,218c03d25d7a9a3de32b640f3ac03cdd932f413db81880cddbb37552ab90fb8127c7c4532640c7d0b5ec1a34efb5cf3e79bbf06a6a2efad4614ba786789efd6101,55068cdc1d8d8c72c0f09a9432fb12aea4de6806ff71148fdbab4a37a363da9f5fb22d085ed4b5402854d247530ade3b59135e5e1364a0b1d7306be74fa6cbfd01 +8da6cb5919d2186bce6aa8b460ee748887502cfe6f85152a3195f13661ea1b580d377a62f1debde141e01e705d6955758bfd95673bd14add87e9326d54ae212f1390265d0b516601f2524ab42d59e6a7,9f1cdf321bd3d99720ac5b9d58553a9a38abf85bee8dccfbd52837d458c90cae,bfa4229b87a540e73bcc86273ee1bc30f6b917521ef2d83c260535e68e547e215b0efd8cfd6e5970fe3c613b1005fc1a976dee1c563ddf18d27e45ace9bff50c01,f510db25e77d80113fb6f5f7dfca8055930323a91cf1b6c331a78eaa5b0c55673a2ea27b053b19427f49ad16aff9405a7270da4e6cf23a73e1d692a2509704a800,3a08891b421f20471107049fb9d048b2a98f86fdbad772cbdbc410415866dc021197bf8f01612d11414243e293385b7dbd3a10118062e6752e7800c3de4b5f8c00,75246c5d6e93eba95b3bc6007a25df391e8751ce319f45a2eae9e48fe74f1aaa3c652abbcbccac1067921f60c5bdb181dc9a96a8fc4479ceb843ce2248b4a19f00,e8d9bcda3d61a1e2891ce97d9b0be2d249ecae0b71912764e58ea96bba0e549c4af5f05dec387a23d7d7d5537cb017368cebb1c5639e99fa5ab6e71087388acc01 +9f9d87b55484d2e7aeb360563b34673ea97203e624dafc6f8668bea3de909f6739140dbe53d7809a3408f4e08bc04c4c41760d775710957f4e009a599d30d61f0c2c9c12eb02bdcdba2f99ccfaf28ba5,0c96ea79aa2c3355c0e5c4e6898d4d1def6f234420cae262756245dc36fcd49c,ab7213d67f247983efa5859295e239ed6a63d506a8b5604082426a5d825a6e363251cb01ef64a308ebc23ede41f7c5f93add9b64acdf991b7a293eff8d91830e00,0f7bca8510e09adbec5ded9f298fcaf4bbbe6464f5712c601d07f9ba331cb573136867c62ca6de98fe69eedf5c3c6d4972f822a918ef279171e5b2140d51975600,a11b673f99f5c6afc25d5eefa74880799169794883fb2bdb5bb9c8d33dd364a82de2e085c237cf22254cf97189966ae626a6f182cf037a79c02576f62540790600,9a0b4ed094f9d639a296c2cfc267bb2e366cae0afb208a87f4a9a577fc2f1ed35e544aadbbc67c09a87078848abe3876ae14eeb4a3c01b79c5fc85844474f9ed00,311abdd3d8e0ee484c0218fe8b37da671f2b32a344b5de397f244b969c54e8de49e52028c146aec734ec8f9ad75f7d812bec487aff92d70409237730d42b0e3400 +c9e1a66c70e1b4912b866df2d99613ec242973fadcb8e2bb917aa7c91600a9025b091ff354ad786fe5b525ffadad78d1af801115409b80a0f6eae5a0fdb2fa4a72db08e6ba1efe52e73353987a5e1bf5,f27ed96a4a53500994b059ae552c59c4c26463e8aa7326ad12cde27f96822dce,b26f2a44a0002f132a703e713b15499bbc3bff685b214af569e68ffe03e618640873a3dbe2d91aeed62710807687a73cd2f3f7da91524c833ddbfb9dceaba61b00,0050b0d3de42bf16fe8c09fc62450903dfc2c9decc7b9fab3c6e7c416f30deb842b6114e7e88d329fec13b50a99d763782e05a76b25e29c56c5605fd32a7949b00,641e27519e8fe6815b2cf41f84dcacc6ff744c712743a68277980fa447757c6f7648fd41d71b3b24b3c1eb98e37bceddd30c11bcdd93f9500880e13525c47e5601,cd0a0065250d29f21c410863596ef0ff2aae2d5e2ac294f7120ddccce8e0780d51646bdab167c06e59a9640e87af00d3b10410458ea30fe0f8295c7fe90425af00,f93e9c50ff5501dfad7b49a6b46aed7e60c4b2b6a6a42e10f5c8bb6f2aaf769512041d3862bedb0455a16d79bca651e875047f3f209070097c2bda73caaeeeb000 +adc8924741da25084828c6292023a8297ad25f94ff93f1cd99b8bd77a9d2cd19a968656dbe11399b3f53b89cf6383f1ee89e7898e79eec5eb547a98e8ffc566f6df086b71a765ad1a8f9e28617c55a16,e59f52999a272a725004fb5adcda901ef2c249970503b574efae2588cfe397be,c62fcbe20f05fb4228f02ae3f0b2cec1713791a83369df644c68adfeeb29810a46a276f068cbd28e998eaecd78d35f31f1cc25de50107b52fef3fffccb857b4e01,57cc662b598bd5908cdb110a61573dacbcb7dfb7edbf1cca188dbf0f25fcb5f5796d8f72de6c8d0da7ee36671043cb03106cfa7bbf2492f4607d090e292c2cd300,c5e06f1aa9e7450be677ce9e916a6e746f6f3b30f5764feaac4fb55522b5286f26dbddb81e389d2f3f140d55327e75bf1dcbffa15362d8be53572d07d8399d5601,1d33a87838414f4a8e85f0919bbb24577446279e66c0905226ba407f8ffc52e0494995a24a4a4003fe31ccbbfd4e6151ff1628d72782299ca14c56466f837bea01,3a4ccf90343d645c939a585f1a3d5c6f798198faf4a6f1150b8cdd1aa459009a590ae66022aa16f540a309508604e70fd7dc3c0b0213b16f0e24d20c2c4705ba01 +71341f9645a3336127915dafeba5c7c7c10d5c2d7605e58c94ef8c370763089e19bc7ad893e806bd8d72780c5376dd8eb0b4ee67bf28bfa2855d1d417f7e59215646e5fd1e363d6ff205c5824c74128e,b257f9b3fbf277956b4d432c43a1d1617c45d66693019a3fdd4b144ecc01b737,a3c45680ee60e6d65b826dd1f8fa2f3800e69c189c6fe2402e450e33590a2b9457e7efbfa59aba942d2e1ccb5d35ebf5e306856f0aa75b3341b5ce209c8ccc6a00,23668f707aaa7cade1fa73140a3fe5a3ded331fec83e3cb75d818b989bed3ae41f1e9e115311bc21a988be989264f0c82631fa4e4100003cd3884803844c6bdf00,62e0c1fe0218875653bc5764fb09186e9a331c53b5beebe8c2848dc43529864f000032f185df38ece0b2e134f373f9d0f58289d82c747973b0b6b4608f83353200,656a8dc878105ad85870fb0516a516ce764fd2f77ebda27e373100e2a1eeaca82685b09927f608ac47e24d56ef51f7ceb8861e1e50e33e31997d231039d2318d01,abfdf0d8376f9b1eb9edbb27794c0ca9ef216a74dd11bbb0f5cebfbd95f41d78411d60fdeff3f046d3a7516a68662a75bdf43acee1ab15a2280ec2ede709222200 +60dc5a9f826da826cc3c9209595f6624f7fc78caeabbe6b691ffe9a5e948fbfe85507c311946d2fe903fd8782900701a2e4720520d73eaab2d09353f84b29b39420ecf29a33e3112d86fe846db8bce4aad,cdcff7c4f6895a549827c505f4962c161ca00e040f13cde057ab6c945cd8d324,27cd864f255a1eba6145fd0ef67ea8117f2d5695d432d37cf228545520827a2f1deab40d4accb26eb571f9df567b41c8a7e674ca6c2c11ba0d1be71b78c66cf400,449b51e851668eacdc88b9b5f6b221f9b466e92c5a0f15be5b707cbd6f64c2102d05fe1d730e92008d096342c59daf76e3adfaf65a24afe5b991de3f581b975301,93e48a8d8e895b886db76796986f33858a642ee4a9108ef9fc301282b127ef862c3eb38de00caf5b7b92b2e361c59141a07f4d9945309313f5a433c2f8f86cef01,08c217f14c3664c66f11bd60cb077841a8dd418b50a14b63afeda942f3a8a0b771f75b16ae6e2e8fd51d0fd12435f6dc6fd7180f9f8b99c5beb65f5513dc3e9c01,9dac3b6d64fb629f85b9312514a6380474889166bc29146d87f7aa8fcb74b0cb0c0e56dd322b7fe6313a300086e7778b85e0e0ad9c1968dd38fb63c4ea75e4af01 +40b4747bdd8ff9f93fd547ed4c2f1eb0fab9d68d840828789914d91d8cb392e5c3e1c053bffc03f86d1edcc1cc7eb084125b0fc1bb2890d5bf25cdd6ffc015aaab662348298236673884c384d03801ea1c,774b9a6c46ceda6a6da9583573328d6a19d83c163fae0d0b258de73044e45d34,f8d14cb27ed264232d29b3d715402ad86dc7dbf2cc4c266d3f039400a94c07587fadf191805aba95bd82600cf0af10d4c04b9a9c59b20ad2d5ec7f4ef851687201,b77f7dcb8ba0e12d67e9a45cd743e561d7d13cac82f54b96bce070afe26ba6332a3e6c75b52c4a3b1ac1fcbe7967f87615adafd8983eeb7808e0f1415298419900,cef5730c33cce0fe8be51ddbf3d7b0c8cb86fdb20c0e7f0735039b1a28d97ce754ffc62e1838afd397aab18f538a6f9b53e5c28b39c4a029c318302ce33fd72301,b371535264567a8d729da9a3da1ac357fc2cfda08f89d6ff23c66f349102bf452cbf35a7ea26da703768d9e1771f2bfa224a46038c876e75ba18e7bfa5dceb2700,166b34ccd2c5ec92e7f1003c89b9da0a74e61b10b380105206bcb80b1690f49d1079979518c4a950afc96f8a6ef96bc92d67e40f1d54bd45ca4553063efb6a2800 +5cb5dd7548beb12130b5480500856198da320cdbbdec4ea0c0a54a0e8badcc132adcf1ebb3c27602be6fa49a5598ef7f831e7418d49ff2f9219144090bfdf377dc6a2bf67835cd429543227c84fd8c5a7c,bcaae21fc67170342c9690443708ec429fd1d16536742eb059dc8ba700435853,e44bac637d1905d697ca2eb9e3f96c5596297f134bda55a85bf8c4b29cfff8f260daccd42e22f05758cf5c34a4f15a2e5a2688d0a7bccf100f3c06ace9c1a6a601,9b0ead7fd5111d8fc6b541c44d4162149903d5b84fa45b5bef6081628172880a4ded9b804dfc6a1c323f6da33bf9d9b846c764223c81854d0b3e04b6e73b9f8b00,bf74ce2a85f88bc3c950ab0412d323fb351676555f0cc1a861185a77d3cc16020c696c70eb76c093bebff703ad6a68c47b2cef70724fbaf0c13175dabbd6cb9200,6d75d4d3a28afaa934b261b4eb86e108456f8a498460ba7ae4ddb49d40b586f20f4dc81c6322544f43622d3e87c2fc4a01c0b9976625ff4d4561a53740b14ef100,dd3e35ea1f5b1d73ccd3e639c8a0029e989f486d9dc8d391cb63b05cb82121c62592ca2a29e3da6fef4b98efe38a8ba6e3294b2033de268f44464ad0f889ff1e00 +c1ccf3b1b23073beb47a67d4c45e4b6694242a762226e2e1c016b586b7e1793fd04f231e22c926a7168f8f817d4bc43fbc9be0aa323787df08b1c55edc9a483cb82cf6f5b8be85b83a7e7e24f0e595a638,faccbcc11d045075f5e1bbfe57fdda567a7f0e4e241678aa0066c4e70dc0f212,cbc33ff1809641e7d95251f65770e5691faeed25ee16fc8bb2f3c08ac285e0666b1cb8454a7da041156edd7d1bc168e46e0209df9440099fb4aff78fdd5a943200,4009183d722e0a494008b27d934aa01af8bbdd182b4250bb00bd93dbdbfc44684d4378076fb8ae2d1d0e979008fe65743c530bb78ccb445ad90db6d781e6801901,eddb7c1c430d2321d3fa81c955de30c9f694d54336393a59f55dc370d071461047162a7f284a10c0a6d92c130eec33af8803aabcf0682735427491fea49a769500,94cce8645823ad00ccfc853a228b320f417aea6eaec1207a38e25bb23aae2d0e17dbcd4e54a47f88e51687939935d5d86a9954d44477c4dd01366f69b64df35600,fa36203dac99de99323c2bca1ba49920a5bdc77fe028ee23112e4643f2ce4fc0297b6da88cb7add4a783f4179348ef0eab01aeb7db72160f58d36ca89b32a23c00 +9c457961c788349f04d9730abaef9bcb822b1ae44fbd2b77807b7f0aac3ccf14079421aefc85c32d25cd9892e71807526769aaa597f7a90b083318287de8d548ab56c61eecba255a5a081e7991f39c7fe4,be7a8c64f1f20eede2a7288bff4cb9f91ec352b5b6bcfcf6b362f0599bb82f8c,ef33f551430c16df5c58a7b930b36c6012d3aa32b5c65f7b63edbb65d09b786c211400ba42f8db1abc55f73244d5dcec0901a4c60d9e78251fc5c8eb6cca4c2101,1a773b451be9dfc98648b61f32cc631ba85e469e66198e076d5590b474bbf19441efec3fbe481a13dca63684adf61a03689b2b0527a67ad168bb60bd7b4280d601,3f2e55b58baf40b4b3ef7fa448cdbbebc4fcb8e0a9b8e83b0bbffcfcd810e25d0843bf825fd363e1e7a448d3fcfb5df0c05d3d3afee2cf60e16f9ee27543724e00,4442dc269db1dfe61e2a0d919b930a585483aa8c6e02ac95611d98adffb809e4518add3371e0607398ce1ed9e6125fbd105d8bbb4605b9cb8cc103f6431121fd00,30629c352ae411c00820e0e65bc6505cceee51536f3d3965d2ec3586d2b4ff955b630ae69bcaf103c133295d2a7023903bd800377d3a267db72ff838c2540b1700 +34da20aa2ba8d21626d5ba597c0271a2bea091e4ec1dd0b86481c289672ef5194fc32ea2fc4b741b2720766648a3a44db45af956311ef6b33f109bd297d667e62577128e7fdb522e30065035e1b3ccc50a,6fb2a27c4aec65b01e28255903665f5a72891c087bca32f6950a1a016dc430c1,1a4fa02af440c9f70e563389d88c380dccd28adca30483836ee7f50923080c97369ffa55f8c79cb43538229c2a777a330ddabeb96345f9ce0c7ea82121a696b001,f3b69449890a771b9772d362a7680671315b96367031c3d94fa17ee5b51d227f47f07a0aac49fd0c17ccf984c4c8ff4c2947441f514fe879d3c9a5b1cddee31b01,e6c302b19c533a6353f31c5c5e7abd164332c6bb3a8b274560ae6b7c82383f9c358e2815b36b02e375ce025405762bf3ec691a8317861252909bdf6cac24bb5d00,36f42d5915e70d504977b55a1e2ca457db9b282d49ed243621381f9c3891f98209bdfc3244a5671c8cd972a89a47ecdb36dff3599dfaf79558a87be1d593f2bb01,89f50fc409e2fa0da64599994a07722004678d9abd30d740c9da5b5ce1364f062eca1d8f38e974a7b743eb19b2d71d8151a2d69acb9af25412b0cebf93ab9a1901 +1e9c6e474a607e9b5583e7c60f8be8203499efb046164484dccbf4caf763e269cb200096dba092fc1444578646cdb5e10c67f834d8966d6cdf1c735ad79e18c112c8f1a9335a5bcd9f2a4a14986350cc86,83aefb59b739ed1bb861932968e8956690ea0c0547cc464460d4c4139b0089b0,63ecd01272d2ce352e394f2f5b783b6a8f5fc3a5a18e11587651f0234611ad087fae65ccc726e7eff3de18e63a96ae42f593ed5d368436c3fe057492269eaf3200,5a8745fa989e131d51e3f65696d23a3b27536dce8483d56d365672c885ac59f31b829f962c13368a2a5d3eb227fb9e253a2dcb06fb5b10756ec63721ede6c6e100,12dabb887ed6a8a1fed1779f9a74a2dd35321c268a8f8004a07b82877f23f5d26661e247b679500280b203cddf792647ace1416ace6fa175daa92d43293162c600,37e12d4928615a403eb1d1d29f4069e20a489dc2d4038666f53432201277f56953cde60553475875a305e832c74e5841ad833282c3cfdb8a21f3201eeab8389301,539298f9153085a40cb8df9a09c54273c91c45faf2167ac6b37ec0110f9020cc327d79d3b260a8faf60ac4b687771cf007c3456d380b48a40df3b2b2beab80fc01 +0fba21a46e53d70745498a5dfd323b123f5e808ba2f3fe2a6299b8b059a68859e69354b5a6bfa685c1b1fedcb3bd3deb5b07f9284c0e3f7b514333dec9bf49e9e322009b0fab945f500e6a89397e350a44,5e707ea724fa906200d9e0f7f893788ce98283a54a2b72bee460dcd651e8557d,fb67133ec383162efe1c84b1221953960acea421cfafc3d6e3a2b83cf1ddde4951ec88744b7768c8ade8f4b71bfb2ce78585643d0d4350f24a87f84a8718c1c201,164c95723bcae9575b182a782d2f0472ee4a4f014674daf3f3be397bdae6bc76552565ebfda1cf6d2ab5eaed90dd879ac58ec9043c3959f30544b047b1b1613101,3d8fc20329713f24346242d271a925af487bc206bef4cc6f7152fd11c8d6205976e2dee714dc71f51018e06c3fabd9cf5fdac09a63f125d59ba647e09064a3b201,628e7dd76b83dec24181daad7a7fe8b8b991b49102d6c7f738f8381bc49880aa2d6919cb3cb26a11ebc54b21956a849f38816a18ede7233bd53fd2bbd688adc700,e058e66c9260e5b9326ac9486ea39eab1ac20bf21e5a75f0db35ca9a895e31f63d937d07965c89d47ccae2066725d63e89b33424aaf624cb76b9eb22252da43900 +3f7f70b7ef1633c7b79adfd08196b5e49f99c05744be7d688f95b8f46332b557888c4fac3b7fbb5193efe4cb2059de72147c795c1b178f8fce9bf07890d28a93bdffbeb017ac1a13de5f1513d4df085df4,485e58ac4446a6d64a33ab40e344560f1f487125e562e8fc4b964e7584ad00d1,efae08eab354dc101cb1ea2d3b29727fbde2438108270b83f5de2303508b856b305bb80d6b1f0f9ffe0bb9f146e68d2bcf3289717d17e4e5b38eec078e00823200,3929930c96504449ddd672e365bc1d419fbf1ac058c3d007014e7c6efd0779b92094bd578721ab22e484be6c7a9143f9faf61f397bde88a484ef667c3155995b00,f7cc19d5a9ad1d768e14f94bc5445741b6bef16ecc1dc9ff9ef35288f48cd1a31a9c401bb616f817fd808f7279ea25ba97f01b1a9504ec1480812a0dea31832501,4aa564521f4c08358d0f9ff9f404b6a7aca99bd911045b6a618e2d81ef37b3214eef9ecf604dbaa5c27612ebe2ca001e026f4e7418a36faf5012251c7b19bfeb01,8aee6038a5299278c9951cadf7765336cafca881aab71e20e37d9736589e64e15026118192d14f8997d202c3b59ba6d4be3829b388437a23cc5a255175a0495401 +219a38c12620de7c0410a5b0c3abafb15d25bcf2b10b2ee8291b62a2b3b3090ff9e76b452c87ccd66ee9c1b9bb005e29fdda072499d72cd9796a90f87fd50389b3d6ba930d3f722cca8777eb70f7233dab,331375ef7c8e80cf12a82ab95c20aab8f90ab95e77738ff694354b764995ce06,6a24edc88a9824d672057c198409a00ad34bee0a2169efa1edaa8122c3eb0b376975a27407563036c398a3dff9cd648a87ff9454e2c3de0b175d25cb95f015be00,ae7dab7247d11e619ad6056e9e19c3aa97b8b0c3bc8868634dd2ab6be876d18e49d189d5b4251d2e6f3d72af420c6b23780a46df6d035de1078a37c0ef2323dd00,c38b5e9c61ecba1232ccfe4784345bc357c7ea28c778a2565f20b0e74b1e6eab7daf041ee55c393a53fc69c5710e95941a7bc4a9d04aeee73d7a9376467723fc00,380c60062a8c587e27a2495da327da6984c050225cd99c13a9d96e6b9bfcf409348fcb04d773b397817f985c785c2427328509e6a5a8da39b5d8dd55630c31fc01,21eda6d3e4c817b3f3d139a98b61fffde49d2bbd94af8278881cd7228fcdddcb5155845ac0880640f4e70480bf2ac65b2e970e44e00537bcd69dc06572d0bce401 +ae1ada32d8a87138408ddf0ab21858079696ee6b20e2c83abeaadefada8ca8442bc62ca5b59c6d6ab0cc1ab6655cce9f0314d7a92b91478554dbbfb0c728ed618444a78a8485fd2058117c25c1cc079c8683,52afc7be89f73ea40b998c1df2b37954eb1f8d413e585bf568b1f6cb0847f42a,892fbace8335ca3ab77a6c41afda7ec13e0b358fdce498effcfec178bfecfee314217b11f41ff809e9794d299522bc8d85c03bd5cc9cba5ee2e999960fc7163301,64d94eb2fa461c1b7373394812bd7fd53124fc83be2cd86726458393321eecc14fc39e8cd07c27182d0b9179e561f2b7dc022a8e806d7d36ca81c9496288e86f01,c50ff6b2febaad21de30cc455ef1fd68fcd9cb56481b91871e5537fda6ba31e85e5e2f81952afde397287e787d4ebeee632cdf983f65c3286a9ae559b711a6d101,7622858c225080278c595692dd22fc7566ded5aa855dfa75f3feb43afe069084231f12840a7d3527130ce20a4c2935aa68465fac381baf29388d3db39469fefb00,ac87d31946705e428a613ef674f09c8c51d141438cb9b67dc5da4c167aaff61f0c80eb77954b5c27752976dde4e306c1b8e0c086cc344694b6c6b8e527c9abb801 +43570032ae31f3b6efac996adc53ff2c9121a98733514491e386bb3ae132875d95a244559f6afd1a84f172e46c1216dcec0146801c90ba2eb2ccf8774bd2085b188253bbd6f2496706bd2796525d59cbc482,4a813b5775837c90ec0e14ad92ebd0ceabac14ac10673b3f15736b5aeedb0de9,ac7fdf4b5af06e61e96dfc346ae90311abb3be5dc3c10f3b7d4d97b1b0efcd0172bae62e8c1757bafdaa9a3ca3ae27c723762629d543290f02a5e0607901615f00,cf0f9d87d4f28763166b699fb055c3c54e7dee425829f4a805599b21a25f5cf806794068baa08d45609b75869cc2e18f7bf4dcc71e01cad7be9a7e4519b9064501,2a59f51bc58f91deae0b9cdd5a223c433faa6f89b6b2b2da0c70f3a50ff01fb07139e319faf55fa0908ffa3e5b8acce03a6f09a826949b7f5ea45ebe238d233b01,eee656012635f1b8258cd53be1cab33459f271e471099371f6c6fd20d7d942fe4e9afd3373d076da3f37f6332bb17f8ccd28efc06a938ecce7cb30bab302153701,45e4ff3974fddb143fc0afd23f169201096794b945172cd32eb041d3000b80346d79c9d47af0e23eabf8bde36aa2a93ed46b51df86bcb543cb234a3ff85f209500 +85247faef7448e35cec4bbd77198c9513d1a069193d56046d204e0d89fcd730eb4e5f36d57170b3991c58087d918dfdfbdd4b168eb7a5269d06e93d5cff8cc769b4467ca5b33a0fbc7d4c458b71ac256f075,1922a406a46eeba2ac0c58bf51fc5de0707334df2844f005f678e4406f5a66bd,120bc4553529efefbbd413974486ffa3ee6b150017439faf51d0684387694055592923ab957dc4a285e858f1471f627fb76969f359e91ceec5e493a38f8678bb00,caf07eb3237b16175c9c26830aeadf37f11dd4eb8d563790d76e67eb49a791f473ef7e80686f0edeedc22ccaabd60ba34c0f79dd596b9b762d512c3fe7654a8b00,0cea33c19f0a5f315d5eeca0aa05a15f4d6953f3cd2d7ba5d8ca62ac0cd09d224f32e6c0660ddb976f9a3f9d5312d881f909351105c8b8f661b5a09d2d85031001,fde93424cc8bcc33dbc6b8976d6205bb2850ddf88d9d1ea2c801581499b04871118912b1d95bab6620706b9cf7c1a02e03d4d43ffad2452531df82e86ee7f35b00,b7e38358068f742e558de8485fb6105dcf81859d30ee81f956a60d4887304cca02cee99e074e4109b14b1c269e4c1ddd24cc0d5ee2b7735f1786e1933c5e19c100 +4cae6acbaf2d38dd4c15d7f71c6d7f01871e1458ee0cc68f240c05bcf1f607ec91361028650e35a261b10438eae48a2f5bc287d3d2ed39f03d2598d4c3fde436969dbd35329a1143e517187f15d45f177e08,a1fb2b16ce9402485f2b7f7d2515192e2becf46a57c9c782c7d4353f8d937c7a,6e90c9665a317b60c4d5092c3fdce7f556f47498d226e8f747047a12424da255745e5d602c2aaa13ac18b0cfa09a3a2d454f7e49729f70cc6bd6c4adb429972e00,4dfc615adc4e610c2b7fe4a00840c783dcf1cdd3561b9d3f8431b29c1e9d97275bbe7b8d1e4b0f6791a4728e0f63d8048d9b5b6b6e3c1a169b7aa1eeb637677b00,1d59888a8bb7cfaaee4911b5d0c013b3429c317abdef9364ba74f843bf1cdc4b4dfca352f5066666dbb11fc329a24bb5e5dba109b03437c2496dc2996f56367a01,049e765713610ee4b8ebb40151b6c53f3a3c3e76510f6316ab6f49b8f806454443211a655b6b28c4a5bc7a62da700bdf5fc61fa233a2c130ea50976a737d067000,ca9d68132549a6f722e251767dfd9ea383c7f99e6027bda12e54f97db77b89b959932746b5b5bf46c777c1de249a9d5a09b35115c929349445f76f6deb31b4e100 +16c24cfca6ed5da12143fbcfb1ee86e1df58fe6c72612e0382d407d4127209bc4bb11a68c2a65ba2eee63850bff042e8f6c706e015c505109dbc5957a9d139d37b13c76c8b14563008e52fe46afd4869ffe0,b69170152276ea7509a7c73821d77fb8456b18d80ac5dbdb3d8d2eec78c172cd,a99d4704fb0a378c5ec609b83fb9f8a505880960425a2ab1263e76a2c649dca81c8bf8bf47a050b4cb279b23658c289cfae7a9202bc19e71200de41616768f4c00,4792a9e18502ce784e507e0798b9e6a55601389f4712990df76f8b48f49321ea23cf8135b45e897831e426a41792b39820b15afa15d95466c48cbd1c3c17866601,606cb2eca772a918074b928425d58404b07644ff43c1d344445517cf83ff04fe6992ab16f41d809c7de29d2b58eabda2c3624b522762d9590cdd252aa396177600,6d56b612e94db22ceedb0404580e440d1b16ef08dac227c4099658039ceff08555fcc88b0aa2fcd0027fe4321f81f6650e5ef27a40af79ffc832c8fff984cf8c00,e14a17364bf5b7f4763e2c0b6185343b5617140e30a00e19a57e2c65e8bddad75b65b05d0ae9e16ae5637c59b32890cef7ccfc22d2cf4567ab2f2545bbfd04d200 +292a36b4281d9c31295dd4bb79bc41103a4b2aa838c37e38afe8773a77a45961f812394c665961d9a893fd550cd6be67ebb2f4e719624f8916e795c3b152fbbe9abfa0c31b984d859db0b78eec1558b0403c,22de891ad3642d20df4a573e1123ffd76abac60a6d7e48cc0677d207f34c1fee,613c0b18becdb047ce0cf5e7c8fb0ae138eb242455f03a64765bf31654a2db5724834a44a17c2dde78c2673e2da92ccc0adbf3da5886bdfad791205c5f5c9e0d00,3a429266567c7ecd97c8e7982cc5f3132131ab9db9350231d26cb7d12c1b98f41e5ef64e00f63007de954b473135627e1912b3919da86ac75aca18f42da46eaa00,0929191dd76efac5258ec3553dc91fbb968f0d4a3177a523c3d37e96772e5cda6efa662131768f9efd9608c632a5f63fad55dc6cd7dc1f98992cf109b0867f5700,e76e666bb4400f471c1cc5be10e6baf14e3ffa76b99eee99df50199366094c7365a6f1fc63958f9d7b8d45ac9128cf640974e6392031e96bb2f4fc32dc3e67eb00,f31ef9eb471c9a75f58700ef7049120007e26b5ebb7642aba7023754d27478b85ea8a1728302d531f05c7267623428f623bff79da9832bd55671e413030915e100 +96c32933b2005358860be9a46fbfa7c475f5e4d907a7a7c790eac811f16e829f63a2e91041a75eaf242ca4a8ffbf8fb622855b144c4bf4148b442bf5dd92f85ede52bb2fd8c047aff63816bdf6dfe36065d9,833f0b0a8f8e86d6e35a811437101b1f325e91fb49a755fb7fae16ac6e75072d,88c0bf06c46e192957fe648a09a137c8581b1b30d50210e18f92a9e7232e62e64287c4597eb07a48a855c10ec31351b149867d462cbd9be669b1b17df75a4c7101,52dfa8b385c44c196592d4ef3dad6edceb56df302592d8a93d12dbcf33c0d50934bfe814f061b31cea1fbd5fb3c765fdfde52e803b108888eb36a49d315286b300,e01ab0ac5d27fe67f1374caf35390915081651a18f232d81d133dd1f65da2d5e5209c362b8343c91dd2a2738d1772b03d7f82bf495a9c320c2ab2ffc9112478001,9b91db40730d7f9bf8fdb75934651e0e778ded017322006ce1f2ff7e068927c31eac8c4ab09300f0b50791fccf1988b7bd8cc12954a6511db39be07cffc24a9f00,e3bd6dde6932bee36c0844c5e11637b922cdf53cf5d2c95b64fbfc69b32155b007c2c5b6bd70ed675446a6873794f974863815c175ba3474eff64936859a3afe01 +0743295b3c57cb5be57871baf049618c86b0708b63c3c82ca7a9c2285913ec830499c63722e764580a5545f6db828ad3f5d8b01f792a9bf8ed2fdece6f1494a1cbe093d527352059744167a0c47b48018a3e,a53052f1ed0ab8ffeb723a6b3c2914dec7512c91f287cce9005b58aafbf80824,591ef135e3c8bbe21e5917509dc918b5c3644228ed2248f95dfa72602fa143cf0a49f86530d78fd31df61b1e4f4f22005cb2a286944c4148b1422743df920a2101,c0851b09f4c73dd79ad5e9967519f9bd3f4d38e027365e82062d8cc2eaaedd3e476aeaab6713ce045d5e0ee94971d9a72ab1756068af2565fedc8652d3e01af101,21a5abad321d02ca938c026d42a35bcd48ee7a99da53d625ff4809f6bd1585c37f85d02f8ff1c8adcd76fd22189a4864eebb9bfa03cf45fa11226f7bf40b88df01,006ebbcf0c8e0985b3c2312076ccc56ba74424963d39e0102811da69a28404647d2d5bcde8430ab4aa47754131ce4c2ea4c1844887fe427b305832f2af52159900,6d7c133b601d438fc6e4c2d9bd5d217ccd335c30a6d92f812bc0b0bdb11481d472507c0e80f924f4476710c0072e9d3ea901c54701152a0da6cef5bc1c438e3e01 +297e2a143db517279f69db4e7f274371aa649b7473322f03cd97fd200181e03bca3dca9bbf5fb2da17b528a77bbe217efae21bee6d83bd10984b08e9962807757718980f4e17350a417157f56f2cd14fe7da,8c2f8d4097950b66381634e3c0d64c8772c516c0e8a41c71ecf19ced7deaffe3,8bd2de160c897953a0bdb2d465edeadbbdbccff069365807a748d0dae3d7c68500f17eec8d72a0e8719ea4145a6d9eda21fbaecfa4a195492344d27de7a9609e01,e968be3596adb466829c42c5a10c519b4e7e9a44297c9a504ec09090936d823424ce75837bfece0fe5ced3aa3a8c154490e8e0d346b58ae5f1167352a71ca1b201,03c772adcf1009bacfda1a17f07efab16565617804bf4c5b7fe3cc1ecb29532d2c3fa7156c42a1561f8b988989f39983c3c7dfb4612c21fb6fdb969dbd2c913a01,c2ef5128b935cac519db79457bf6d6bfe1a70857561f4843f53ed10a1b60f52b7a1b871f0b5889d970263eabd6c65a27efedab2a4c2c804d1af07a8fcd0b9d9e00,2cc7e235536bcee9369856f795d72c78c71863e6cf0ac0a3ea6121ac445df5f82e3dfee79b01ec8abace4b00f72fb8acc21dab1e2f44cbca60171bccb6ce1b9101 +00fb9a664189b01332cd44459d4437f7c7a3522f6b2a70f8c1c772d13b995652f7bf69501a7fee439a85e75dfdfca63b75fbd1ddd16c90b8c57e69d52d1103184313e467eeedd5c40d937adfd0d8836be973,d5f8ea82c8b189cc82f3660a11857f02535d8c3989e9bf9a10c38d670d95d684,01194648198be67ea5789dde499bad886aeb384306a0383a92fbc1d1674392327548f34832cbfdfff7db4409a937f53f19a5fe98ec8c7a333e7f9158224a38ff00,1884c6149bf24ab2d4fe65653eef7d5f1902d11a065ef0584a206ef966299b967434a1f5404f3c57f69b978f23b7ff0969d217bd47613314213bf26daefbf18600,7608df5e860eb830cb431e9e927ff769d6c9d33ed47ee63b374548aeb82dee2f6c5b5ef3785cd0a90219ee6ecfe531f05a189dffa8a0cefa3a09325aeb854ea700,591c8e1db433fb0270550b174a0cc1fee1255d88db6b1caaaa15b1ac398cdc3c1230dd6c31ee028a9e938d4c5ab272b639971331b4983a5edf08bf19cc9dd60000,13206ebf3954b014292d3c455b55d189d7181d1f1e17a6df72ef5da3a17e8cd70ce29325248e10e7a01b74a1b61cc18e0405238c539bb24934b69781be33bda200 +1ac0ff461e18a08d27abbe8a0ac77ff07ac2586acd928fb2bd475693227f3ddbe58fe5022da6f5ac9e4f36b9fed7734292141c299d2f5b7159befa144e28c9c2bbb1e6be1c45468a2acc2134320768984f7e9c,07e69371214e378b82b0dbddb9a2c9b6d77a8c6b7648311da95b483e00d6aa7d,608ef3be0fda5412a2f888bd2c88af955048fcc26774cd4ca7efc22e7a7e19e35f200cc15a9e02a8617cd36cd25e6b308fe58f5932152b8b79319472f9b326c101,1f317ae26b5279a8d8a3aeaaa0b6ba1cdbc4b129bfc7b9f2963b9adb793a58577b7fa49452d3bd32acd678fc1af4adcaa23b7179c7cf786dd5b6730edbdbed1301,3a3cf338290906cf02e8aadfa8cb5ec5f385429f27c7bd5a9ca2799012a535ea36d8c556321d5cc8cb1b409b4cb2a538740f43282ed9c516a682342e94ba628600,5abfbb59f8958262394ccf38660b1f3ffcbda0d1710dfcb5285741cbc7e93da3378811166128f57343e0a313459956849e78cea771f17de464064d2eb6da72a300,33dae3933eee3879363720f9925fe4e067676390961c38c7f480d7c14c678d8e0282aa2e9df5211fbce053d60a91b9503853080a63e7cad21f7ab43d7be2a83200 +29c4cc052ede26045509cfd83290baa49e666c19d4d863792f445a528a94f6c83e73f78ffeb31a86fd1fb855e472f7e6dc04034b94fa82015efe1b19616e8d297939e717adb1da75ecf1d88069fe837b9fc06f,ff951d727ffb338c57b70e6a6663c0a19ee66b7fe2d5500c00a0dfdd76988e3e,3ad830dd2ca2589803074d4e95daecf76c20317315e5185dfbc92d897ad4518f0bd9d3030d3a9ed611664199289f03dca022aeba72ddc2ce3f8feb95fcc031b601,5ea6b3a32d91dd3e7c22ddb094574123e245d5e33faeb6107c266edbfd2389781c5179e7a14c03c254d02b4a298973c73ad9ea6677c2bf6a82b5cd3c7d4f855600,2ead7c45a9d72536e8302242f17bdfebcf6766b0df8528b12b3248597e12cb2204d1b59899863a7a9d90f38c2f4f66c5891ac8b56d4ff2e0fd7a9e223f221db001,ade298469ecce2892bfe7a3c72d89d0824fafa1ccc2387264ff4250fc7fca3d928af054167c9d8f8e6d241c27ce53b02214f78591e62ab1d6ace8bd70fbfa9e801,c42f6640cf41988aa65a6c52475eaab23709da73bab0ada0fee5a447cbea20312a0a2ad5bb72781e8c3956b1dcf3173926ce33d848fe0e2747d39683c758d04700 +ec75363d2a7a49c5c688ae42bfb98f4a6a1b2dffdc2d1a87623e9438b32db0cecd3f2fb4517d77854783af03fff85bbc12ec0533735fbe2db65ff0888e6a08ccfb68c16a738c90a9ecf216a9683f920268060a,45624b1760082dedb4199149c423f8a2a5caf490d210b5f8a90fcdc18e494411,5d5e07c110ca5bc50bd02510e0c6964d2af6b1b7d785b32f9e875a9bafe82c7114a783543c6ed441e0e0488bcb2ea5066572bb672c9417cf865d0d2a22ae6c5d01,fe64529464da73fbe90b9b1db453304cb074d978f145134a2919734bb037f6a36469f2a5200057bc6f09174d74296e2f34dd1e33ed700821673e9396663156c900,9d63111ded00a944d9a6ae3e6d0b066c1654b00f3fb60250ee2006c3cd6a6b1b5663d3f2016d9db9b2e90c0831c31eed9aac49c9bd57b776fc6c0860ff4e9e3500,e469d0ccc5dbc062f2a1b31c8f77b6fff62e639a36c085696f633bc2e681852760c5c0594bc270f685b5753f1fb800d1b64f0890d709714146586630bf6c57db00,2f9993a621530bc74039c7b9d1ef5b7ff0909accb9dbc640637c6836749116113b10e36c53899ccd4800fed575e608a95d09eb2beee0894081e8c7a5b3c7a45b01 +35e6631589713cb402672b17283056d60a1e64ee1c52847a2640d3d9fb24eaf09334391f2980f98e0e92c0798d2e1ff9ba4e1c5ac53586bf5b10055d89819d7c893a54462ea30f52a6cb1cc8d95801db6cc73c,afe5dabe8235cb24021b2d6b6d4f337b7e2abce44256432e755e9183758fa193,7b0d3d6ec80971c047664c22ec61b5e30facd45b7a179241c2eb8cf5f2cf671f3621b14198f724b46aef79a955218e31dbe9b35232ab08e095029d1b817d939b01,e386596729323cd258c8006b1519a38926d0e601c1b10b64442c36ad2a424ff162c2474db7d4225fb01397d1d0cbd246446402443c4eef5b50d1ea14462e5c0a01,75c2b62b27a44b3d9ce719cd1e24a88a9648f0d0ce27cc7ac8889e7677884c63292ec8b1df2fb9300d01e945b028ed3d0ddf19aaa1a0244c8cc7a65b084fffd601,c965ed5d8973ae0e059dc7ecfd48930a1ae9150ee5e52ac899682991a44dd3fb64d382c9b3ddabafc0fd3f611db11b77d6ff9fd5558a993a263808ae584e1f8b01,0ceaf2068ed55395d6c5df495869bed94b4fe7af6d3fb0da3055e5a8e67b3ccd6c6ff689d4d4779625ca9df4e4b749ae11f3dfa63c54210dab4ab8680af9367a01 +73caea2975be8d7889d1fc7eec970d3607b168e45d0046dc7556a935d68b556898538d672dfc1f043092588e9d1b449b0b6d3d5f1fff135ce6e268c65dfc46b9a7b525e72dca2f785732e2be5a8c935a7a14bd,114326c028a7853cca4f7453f0781a4fb0beba08db51c7388243432196940c0e,3bfe2e401ccd3368b6c3f8c58ddbaceca42c4589f21735e3b98628f51fe206255d587af2bae91497523718502892c2bff099438cd8bffc26d6c8ca3fa0f6ba4400,526c37aa0537be06382f123b85826bf7262d155259e945726e491f32a3f1e6ed7caaf6c54c7e7388a4fa3146247fdf765e47ab88cada61da51cc5a130e1cac5401,899f762225369e5563b614594d3282f20bf7c10cf8f98927fe6483beaee9b79c549d88c3eb7dbbd48e915ad39da536b8d32f1b7fc5710e0248eec1e254f48a0301,0007110c8db82896fff6127b6081eb3126cfa688815523e87a2f7dda2cb58d7e2f4e4121ef211ce087041497dd72cbd24d5da372ae29cbd2c90b91563829931d00,41cdd7875bd421f80df0cb425881672098fd31c1de1f6b459c1bbeafacfd6cbc5e23df9b1dba41f393f49ac8555b1649748dd09b268b001718920ef08ec84bf500 +04143eb637a7a643954fb6414ef11f47b25d6c73525034e0249e1212914db505c7864bc2ac32322eab7a40f51bf9b0815dc7e6759eb270440a47e2846e7de3c5c15c55f6c2f2bba3530e4f5e835c901eaa5de7,3958e66cecf003bb51c081c54a92dcaf67244d3161bae73a2620bbf2b8daac3e,988e9967c26a3aa6f4c7d53a32ccfc8747d39eee65e7c5576fc6cbe420ccf7f07ea3494933435813c4748d8dfc32a8ccd864e1e88269dd7a771c64de9249568000,c83c4ad3b609b69235c1a1c3d61c293a4cef7e6ec21a4e2afcb0979843d56d806dea1dacb84e181dae415b57ecf256c1bfcfa8a147a7ce10493ec3ef65a3adec01,d52f27b240b50e09d2204074de74c713a5dbb9f982cf4063dfa0d3976cd02e2d6d9c6c54d2c1817500882e446511a62372fd22a43227bf3d17077cee7bb07fe901,78dd84a8f4df8b630eaffdafb9d02033474c09f4af81779a178934bff2e02fc1442606f82b049ea6b021286d00602115d533f555e606b2c0fd6d1f99488543fa01,d7345af753755caec6cac3e2ad8f4513b44ffd10cc1369c301e807f1da6e9e2443a641d4d4817eab77f8fe6e59f470f5830a2f0e0bf48082b6b2dc71ebf90d0800 +d5dde15e0a403bf6fcd0cd40267687a094438936eba09e002c02d5c967fcb4a9973a3fcfa6f0de7f129d353c23836ae745c43784d943aac7fc0f7a22dbd303b87c82cd6e183d180e3eb32aa0c803a2515c75c3,7e01f7331776404c41ea71f40771e014cf75caee648a506e76e27be1379ba5ed,a27ae19a7eba2622f863aa83d1359861165146e750cb8593b00ad70e91a3a6f73ea931ad02c7849482b0e5745ca766fd70be3c02f7f97c819af109747960984801,cafadab5c9a933a23a1bca19e252548f9f873db21663fff25411bc93e4fb3c6761750f8650a79796a7b73881938bff46869c3d321540576b046ca26437a374f800,de1620126b12eb807300be57e369a40abaac39a84bc94a30a53a6a752a87c5c9561483b89b177580249f249f2dc6451e4f7ee107c3644f133aad5e334420187600,07c3b3b528fb2325afc676a596f08332d68977bada98c44f9885315d3f831be415df33291e0973eccc2d7dbe617b70a96c39488b70d956de485b8eeaec38872a01,a90fbd21c60ff6d66090527313cd1a515abad4e8828838f7417c431edd8285b871f0374ba0b1d6c4dc3018020e7b36606ef8cb5f046efed4d3ea751ce1fa53b901 +2686c70972193b02666e84d6b3eed54833c8efec601e7fbf75a2116b985db85519eed4f7f58cde5dd22e13ef5f79406453fb662165d4ea0c7456852cb4dcf8270cddb512ba910a51d77e7634c9bbdcf11a6baa,f8fce60eca400637ceb2c8a7a70f3eff06c4ed94a572a752e0d7a1ed8c0cd524,e6d88af8c788af743084c5ec646b062a3bfcc79101ef1f26fd4ce5616564c6ed0bf00e5f34d1e2a49401af02215230204c36db8ef648f5f45d949740332260fb01,fb022628f600e511f7eee4161d99c5b3634b008092200c13083c7b45077a398e70744739c3938d0807f7c54a1dea9331e3b2d4f61d1074ce0cd6784bb8f2d55801,03c1de1b29d0fef525ba01701cf8393a355c6fda4fd8f99648023cbfa789588f2ab9f5f1f5074e6311b0a28629aefb57cd6c691e89d29cdfcfb410a400d2b84801,29c81dd4ba7a3106e2ae1701e3725d1570a8a9eff495586252137cdb5fac6158793cae602410ea125396298a8c0b437999d6a0c003848203cd99d7b357d314ef01,aa38d95804fb79bcc63ca7d890c48e0e8dc7d0bb754917cad4ad645f847541cd155f9bc6c5e49366725b3585c0999cbc89e29ae8d17c818eb5f2977cae438bb701 +10fd6f0c80ffc1d46b5182875013e4e5275d836afedb0b224e362d2934016df6e1db17e28f50f229e500d245d82269782f0f9333cbd860cfe0acdd02989a9b993e038d1f19a0edba8b473e6072463035b50844,02db0a90eddc903dbe6aca4831d0dcbc4e42cf43589e78156f7e7d9310306c45,b67e0d033541ba05521ebae51b33d8fad85a45f2455b2823c80d90c63179ed1545719a65de9018b467b8af959f2c9710466a937a3363019659b24fed3b65e32700,9488115b538dc21650fa66bf6594829609d683fbeefb88af0931517a2af11a2138065585e1009f0bec1574308d955dbe0bcc6d86ead22554d6e026b4bb07299301,4297cf79dc6c9303fd9a9cd7be4b217b70c6ebdc5da71b57b03a6e3c676daf17018feb59465e911bc6c4c506d5b43771e073c0ce8bfc0b4bff41503ab4526dfb01,95ded4d79f683b9ff9c8cea8c2b7717f4628af48e79a75960d0fcbdfe9e9d0005f494f3ab96e88aa48af7ac1292daf2c6c6eb962b349cc5f1e7466f97c01fc2100,7e1bbbd31b991cef264cfcf1e1575dcbbbadc1a4efc80f7fe637498d6cc4156e235d9174baf97d1ab220f874e3c89d4b5cab30654fb9b1cd8a2c6cba184cfb5101 +bfd6e4015192770ef0c6cc4febda0dc39b6a786fc6d927eb415e092a6fce0c4ba264754b76f0b118b9b569e6936ffab0c0ed86517f7db01a668a25e0e200e9608ddf464ca19f518838361eaef0be3ed6ca3497,952fb8e68d713b77674019ff74decba3a470fc75b0c235efd0727b8d69d82f87,99d0ed4514b8d66fbbf0ccdf9afb28d2b261a34e11a01c3dd8592f8ab6ad18553b8face83c478ba9f9802774ca78bb55696491828faed6fa9e26aecef7e486b701,673ea8c6461c20f7974538859921ae42e0862515f60d56e589895ebe5eff528b371254d60649232dcaf1300657852b1d287b1b2e7ef3028b4041067b050414f301,c83dab45afb122ba30869cefc27bc952d03400c59429653709ac55f8f579c4e126841ecfcc8a1cfaa342ec218a87dd83b6559934b3c7642a51a03e6c82e9ab9700,514bb09c34852276a6a4d93e63f6300633291fd350d0f72aba9a6963ca7c73d1042d951d8e6f2ff5b306a157469116712e345d7edc317ecdac9bbc3e934e5e1f01,aa5d73c0967b7b8725a740ac2b7ddfcd37e08aa671f2e130b558eb75e8c55e4072f9723be96096701b94c4a27cbef341707ceee4be51b4c9d17040dda675350e00 +02a8bf8df7a84846c18a3d8ff337527502ec93d77c837242c1d5544efc4025a1e1d36dd3f3c6aeec9fa684b56e2687e14616a268d7298ee6abbe422296b4b4a47dda2297a0dee73339c3135bda8f48832b7a36da,1e3b437876dfe31c12f82a123e4f6783c2e9a104655a0e2a002138f5bbfd74d6,fdda4c78e75debecab577ebd84a9718e603a6060fe31a2c2acbcf3cc8b00f42f5353276ff19c0d1b188315a88883d7f66ccd960252756d8b81571c1b4035157901,f3e62110a868c7506f8c7418ae5a8f96fc54c39e8be7625771c588b9644c1a027466ce2eab4ce5b0546524f9c6c8ddce98004d12936f4428986abaaa06ab36b901,6ca243a516f1ed6eb39ede2e363c760479982a1ef67b1d057f620f3a56da22277080b6202a3d4b931f363a76160fe9006992d23b3395eb07e26d7aaa8c695f4301,113af10f180e11f80215b29f3dd0d97c47f480bf152db19548904d73779bf5d642d822b18449945767ffc995521c8b3a94da2b767a936f76af67c6d08c646e5b01,d26c70e56aa36943d66454b5f59d6a5adba44b9bd44db894bd0e16eab33b869400088c277a99fa951d755551ab1dfa9f74be0b8d62db78bcd2e9dd41e6dd8c8401 +e64c34aed781a992720d992cb43c893e7d6b16051fca1cfcdd8a5632f9b5eb0c3f5c56c2881c85961ca0bc6b02a420a6b23aa493e03b40c61a0713fb182cac8a78efaad07683486d9bd9cba56fa388cb0b52c95e,11fe067b91ce50629f06ff201ff09b37bf13ac12a86d5e541cef26882ad0d8e2,7650d3f79318d68ea90b64f9962e42cf2137b6d8c4ad51f0cea15c2029b7ccb94319fd9ae7f110a078a51d2ca275386ccb7fcfe00238f36f71f1d6cb5c760bf000,d3f86640ebd2ec19030012f7f2b18523358082aee7a56e881ad719ac716d562c4c614933d4ce89ad000fc66773cec20242f1c901b8b527a2660594f56a622c9e00,dd5cf142ec4147efdceaf0173d82b678c1e9865a9c5a39562a99b8aee595482706734cbf19c2bd8282b456d72c236b8c38546d26182f32a6360183bee61d089900,7c4cf3cdca37eddc5aa5b84bbfe32c7e6546281bad14a55f2caff83285305a4305fb5993b8ae76672a2a96a7a564f34306b825fc09c2a1864b7b2a7d02ba39a300,235dec4ef1583efbd940f3f46f8b205ce03d11f958e41fd9d4f3286e3efd3c493dd65df8bfb8f2e308a82d6d0a3708de524f9fb4f2739abc26a0eac47b802a9201 +94061235be9fa288096c84a031c31f09142f4b703c55914a9727dc570873f05931f07290ef2e4ea0c93ea5f166131463b76f2219bafbd9717c312e1c607b7a57be282671bffb4e0b161a6477777434b2defc905d,c00ed53e88ee26c3eafd1687677d938e0387040787536a9bdc83fea9d99557f6,b5cf77037f9a65f0c38f5d391bb7b9d51057bfe6bbde225269f9694761c62fdd6c59602df4889005cb87d8c6be07f5c7ec6d52192c7d709e6bedfdfe1d3c857100,0a5ee91f4308b649b65a1ec3a4ea9b576dc462cd052cd31032f3054e3573b6bb29371c1cf8e610e8012c1f1dadf0ed804ee4c7ce75747159c9e22983dc739c0801,a61be052e291168d7a6f10706aa4b01be19ffc019878b6611866fff667b1db5d4e2e2c6b2a9768f7f037756f47af8b63eb7fe3b1154433f9e2e59719e4c003e501,353bed1ce0e7a87ca4f8d51589ddaf7e49fbc540e98d5bbcba9f706516e7e87e263f28a9c15fe1f7a958bf3ea1647eca2cd3b61e7d2d1c82a5549e31e91323ff01,a0a6b8035bd2eed5322a0f2a3fd0f71da3f3b55dfefbaf4a6a170c1f113c72e41d6623a1e042bf018d2862b971f4508cba57e3b8a01454b73bfc346ee8ff414c01 +26af72ad654dc17f6d32895e6b842625c300edd7e59686108e47d6925dca1d017e44e7e4e81855385279eafd67fb75ba19b2da8eedfa42dcfc98ba40281228e4515daf2a835d039fdbd583e29b5274c09dace04b,95880d364fe58c347fe200a1aa390dff497344a37a0a19ed65d89e777f4d9c2d,a9f929bfa1b63861c76ab4b7eb04718a06c377c4b3bcbe76d8159f965cfc9ab266b70074d03dd7912bd61b3fa91d8b631e2add89856fc41e0c34f5c9672e497201,7a359da03f5693324d5efa2d90ea70707e792c946243932bc8cb4ea25318bb851b6e3fa0e838c1154c209c63d7d536882137126ac8e67c02831d1958b806553d01,af7d90e7b82b14d737fb72d76ee59bb413309fecca280b7094d269c6b4cedb4e49afaaa08d88f723ece03b58fcbbe8d0678c7c8712ccf4dcac67514a550738a101,126349e5307e195519d2b06f57df8eb72430f6323d3e9342da0ba16c6a14da2c26c9c5ae7d58c13a1704882e9d8753e13131c76035b16a38b08e5a04d4af20fb00,a51e79e849a8dad9ac413306b661e061c99d478851f6c0ab7d6edf3036fff29616f6c381e51d0d88ad596903af16ade062815bdcea87ad3d15586fe9f8c19f1f01 +bdf40880d5bb2dcb15eef1dd2a77c0f25d4d069b6ce3b96eb9b0c0fe56b4d15936df90a713e43ce0d5516dfd86fe050a6b93f484c43418d4b56888196ff7cb6e4a6769f617b5cce237ae41bba10674b1522759a8,f0803065c07cbafd1820edf1c3a76e957b83faf6d51c5903461342de3eabab0e,768c7c09d061db27f9dedcaa6ec61e249c3a49b4b2ea8a936a3cd56124c7e4894bb902dcfccb5c8aa20bb12c95c8f6d48509e9a5978a6aa159208c9a0004da3501,03d0f1a8896cd1b11e6ae2e62a0e94ae247582ca3a00de14ad5dec97526fc43b3ff52138c7e48db2edbc60f658b07306ce754b5ad9f8cfc4d8b644c6646a88de00,61faa34e80b9647a6ffd6952c923bc1db9da9181b6579dc149a66dfcfe55202c4f9126cb17352ac5d4e17dba7dfbb157432cf448ebc4f595608fcc503ec3d0f501,66e4da1df73320ec0e212430afd1d023958cf2482735d367197eeb4590509a8378e97ec4c1bebafd13e2073e0fccfc9cbdd7cdca88d9c2f29b6660f6a856407a00,cdc5f9b1c28f46cfd37efcd71994d51b0c652b367a0118d786294cc025f09c607da6957717dca8dfd13734fdb22bbf08a3191ff0dd89b4f2c26a636cb3d8474201 +ef0f2ba5d7743327f13421497c89a4b7169fe8ce4a358d685610ed47939b2c08d7d9b1296e2de8a6d5f7c36ae9cd98b5cd8264a2838faa33a36a312c2f5346355133b3c6e69693f9960740e080a2fa9bc7fe80e7,cd3a5bf932e45b76daf78da4cba22195cd3ac78c6aaae529d93387ca95f795ff,32c2cafb5a76be90eb24199ca9aeebd5c93825828f87b80d010305d845716183501dd75fb40b81fb19f206709ba2481f70a7c062ef68523b78396be21e60ba8c00,0d80ee38a5aa504e605bcb1cdce7437dec15e6ff6d2644fe07cf5ef06ca459ac713fbbe45c6823aa35fb6089f8a152000f0fddf61e38496fb1f1d9277308492d01,66ff3c70beca78cdcd7d14e3f0d5665cc57eb58002bdb085dae31bd452ecf9d508d422442219439693812541f0f87b05585cced391a141ef9265e85ffb9b9cbf00,517d7c6c49b8adb93f438d77d7aca8e62545954bc897ab0e1221ee0f2ac8e61777c45c8e6a07c568a7a72af65182016dd9e2a7f3f86ee6551aa3ba7bdccc64fc00,c0f5178c2cc0efc7f3db7872ed638486334973387bfef796de516f06b81cb70c74bd1ee5426240c69bbc19e2f3ebebf9b77cb177ab34df0cd87fd68e75fa429a00 +63ef7837fd00ad34dacc279c0e6e7e4257a1eab03c8c367b7a103ae6409c2d4bddc79b35a5c2d66776b2bce43e6d112b1573d2bdfc7222d0aa9eca534b57c1e3c172098af16bf981693436e84a2af031abd21478,ec608df55f283c3966359312afa22f1687e7d05440459ab76a844e8558d80243,6b9a0e906b27a78f28d9784c6d64efccf9942168c3198ce8231b49aa3a2e16fd35bce6e381c99274b5519e3296abaca501518bff50b0f4bf2f34a43d8d8088f000,76960ac45be1afa9dd784370f36c8fe25830e08050f71980a2c3a958464f7ef76a53123663dd18f521c44175509b097bc8caf32cd5fede9aa815ba3e8beb644d01,b55bbe4d9845fcce26d213f70623eb33292ecaddc22f87a4f4e1ac8cbebc77092327e93427e228241f92c59f0a7ddf01b1ca43db95818d2685fa7439101060b501,bb860ffc6f829647c85e56f15b3ff0838f91fe4345dab9ba2c50d430de9bed7d72273258b0ee7e3fb3ed346e05a509ea518022d8ede8a154b775a8150ca8c3cd01,3777abc7881e021b73ce6d4e6d60287ba032984b637441956e8e20b22c7c9937505ff14dd501c35bd2dcb09473a0d962d581068a33e2a37f6c70d9385eace5c000 +c9b3e3c72274c577637b9dd079bc5843deae4d0800648e3a3e9952987ac42a7bfbf7b81e9a3ed25ffb1945281fceebea599b9aafee21f5216fa70a36517fd1fe21ae4b9bd45482c78df2f9728fe07fca3c86a7a8,f6b63e035a7f887860a5e15608ba9ff25d90233aa508fdcea8d92a2c0c4fc5ca,aaf273549c2eb900ab2466cad95eef833b573a08a0413f15d76d0b1d1a653ef91639aa5fe3970c7119da2e5f2f7f84e1f6fc832749e1063f7e9f78adb68139c301,515983e5300d25a52ed1c7232e25fa3426691bf21544670f12b4ea3fa3a30c8a3602372e70a1157b21041e6cc584cce07f419a037d528e660c725ebe61cee98201,0b21d9c6c486004d9a70894c459aa207f7b86ecfa201ffa4349b920feb5c9bf118858999fb2f079c81d863c228828b07e29ec0b4d954e73bde6e873825b9ae5300,b3c428095e74fbca82c55f11528d6db06dfec5dc1a0728d74d214185a4c4cd8a16cf6e81bf06a05fdd012260853dd1240f279623ff3cba1f918a3bae238f26aa00,110b96af7b21ed27c7083fd8796ced5e9c20f64e8e3388df5d3bd5514ad2e26f3a737c32da926d80f14d468a964a671cc2387f5ccc0003756a7421da4eb122df00 +586dc1021f3dab5353f4c3913d18d2af6493864a18789764f61620b5fda33ca76d5ce3f54ed9af753a84e07781f01415ba4deaa66d6bffbb6278722b73f21fca27620b8784df782ad6fa11949fe275e47da4cc06,0c9883806d58be39ec856a80360d71a0971af43db68adf4207e21339943191f3,091116b7a0e40ef931e3a01fbda2a4ee8118a35c53e6ef14d4805ff60fe60b432ea7a0edd911e3b78186a989a0d14648d5edcd9b6d70b9fbf3e33c4c0d2d784401,98bf4a178b12cda6410b8790aab0f0661f839166440ba5cf12d43177699c1bb206d480918046261835a8c6503d48dfb4890b066e8cf6461ba1b7a7b1aac11f7501,fc543daf107cb980c40245cb833ef6e91fab4125d28226c34d68d55128cf724c7551fc491021781763775bf0fa54e7dbf4ed8b847cdf12699cf0a1d7e5e648df00,644a9e56e78a0059891dae65f4a7d6ef36a88afb0ee6c5a2230ebdce29cf3e7625ae837056682982c64c8c99331e202f3a8ab131e2d185003431efdb666e1ba901,262c68591dda195fe2d003005a1900587c206e8342df2a73451266979258f1cf3e464e7b654c63a6bc9c7f59ac0e453aa1033d510f2e3fd9af9f4d62da70981c00 +08ac823f0318393ad711bb30ddae8f470a5bcd6f650c3dbf014eeda41c8832d4216b6c0d1e6e91a11a1e27d05b6204da25ecb3e9189cb8ef2dd30b7d33d117638b8144dd028d3a4e9293bd8cb6729e830adc06dd,382cb4c78b4bccf7420c492b8440d505a69a36e8de03418885f88dce33fd087e,0a2287dd54b49572c394e3b57409b6f3ea299787990cec81bc2036bb0f4c3c3d37f563565713bce5036a1a8dec6411eee0c313ccbb13825274f56d3ef43ce28700,c62944828f0ad9583f6501b63b9729ab5dfa88bc51219486c90258496108ebfc6390bbe4e0093078749ed1ccf8c5db4f345f2362748da4f0f367fd5e1b7a5d5b00,0b30b4a8b266c7ec2718f80bbd99294a634dc97ca87fd38b62a7e1488ac4f24f0c0ce091ddbd11a7ed9d0dc35d865cda2ca1d0c84cb69ea01fd238702170266a00,91f2eb0a663accf962c0f9c23d8833c6688e0bc53e079d6596f07008148855005302641d995aaa67603d781a90e6df6455be77395c2c686a399391fc7fe31f1700,0ebee6df9acf3fb209cfc8258f1ec87d6121fbc0db67e3eaa9934e7b4b4179d9316c08cf5a74e3de803da64f79f19b205a40b4e60c8c0c3882b7a43f806e5f0501 +841cf8917d139a469fb13a612c6cd8f8b01e951be73156fd26cba496fb122d4df7f25a055a5676c7ed072b70dd03fa84fcccec913b149f60a586175314bea4be2dd3744c57c7df0badf999c96b8be650c876a2fce8,5cbc01f5b1911317d87f4dfbec7d00b04532d71b33a7318084c0fe2ed9d53437,4d4c67cb1b9e04d6cefee3943291ef8eff2f192eb6cbf5b40f88f60e9512b0360f787bd5529b4b99fa6f5cefb9560926a0ef6e03cb7beba091268c65150a4e5d00,a9f9ea398099cc5eb5565381a9599690b742bcd585915f9f9246b514876ee7df23937faa6fcb898728631c49402dd73bbb0569ea0a0896368638861fa95428c801,428ae9f23b6589687e13b0fc863bdba7d994349b574ecbab3720d17dde0190b54d3736fc8cd8ed9f12d6b0eebda546f43220ad58b9755fa7db19dde568219fc401,5dbecc6b3e29ed0a8e99e9f48850977ccdaedf6a9b787b4b6c0843e636bdf12c6d1e8f58bacf7c3d94293d55d7119b0a0f7ad39d33bc394720f1c3dff877237300,c2f75d2891294d03a036ff0a9081413c94d480222889ffa4ce4582f4f6eba5450cc010b39080b18d5abbae5efbc50bdc84b04f0c87027346276c78271219dd2500 +3592239eff1c330238a17fb520c657d4741bdb227a5e7f2c3c4391e611dcb851c4a06c6f5b4d41086c357e92c8a37183535eff0d14f504e9d7ef8ba9a0e04eef01bed00a86a1ae5c5dc81b21a82e0f7aea775a22fa,70a8538f2925f2314636fb452a4da34e901953992a1275945ed1100a60598121,39191a9df2b029ba1f2659c3e0f56c2834eebbfbebf38ea16f09c5669d5db36218c0b20cc43744d4332c0bfaec9f8178ec28b80fa645c91dc22fa1983887364000,b2b535c7c3c3dd19125929c34ff0b257caa8c7d04657322d532538b7f894898d76c6dc3c5c059f91a72c0b7a26187a0d57307f94372544ea890332a7a84b7c6a01,24298bb6baa4b778df109c344095b0d90563c37ad8bd49f5fef78e1b4b1d1a1a58efdcef3e8d1af43c1407aeee9d7119cd749e8bb120f6e9640570e3f0d1001700,b5b18f50178d09fa5ee0f6a594f8f21e0ac8508c5ec7df23c0d8bc431d46f11356ce94cea020f9550ffcf0e9df815e35f1eef770a5eaf8ea07a8c7ad8bbb37c800,db989fe980a4e4c1534082e96839d9711587434076abea7143ecbdc6036669893e42cc42adcf74253b6abc4de9c878cd53a941e43dde2ce8446e6a2efdbb3b2900 +fa56874e7426248413fa5f78ab5a356a44398b83e6b1c06a51fcecb7ef59ea23e1ccfa74a2d3bac448e96dd3564280066098a914ab96cd86d51283cb6269a6cd11c97df869fe1e95ab61f490f39fdb1c7b2d2e9e35,5f8e5d829a23842692c2ae2ff9b464385274a97457cb572feeb2ec66a3148c28,6526e12cf713af39c1922e0b58c442163f780454fba2ed8205f83eff1457991a0b2ce65ca301686cec0bc642fbf0a76dc678f0e457685bd387ff37f87f7e816101,69e17d6c344309f4524edb98f2d8d054d9f00b777b882c5f3190c64461f350d1601dbb648db99494093bb933e29af29774bc6d41e92adcd7305e5c5cf99b570b01,00bf8867a382a9d86766c439a11f8504f8fa46394928d55f7ea114131843d49d201255bf866d3f93d1261e456dea66d66ff76a2fe912acd1078566e076c1d36b01,1825555179f80ce71609cc5796b9ce2b3706492d637017680587c2d93d5d3a1f0cef4333f0e7b9b870f27441be9cc328ae65e8c6142a1336aec51e8fe5ff6ac000,2e5afe3d816094cc188ec88bd43c5f2524762b22492ad76a78af32fa5594c8236bf67a53d9473326a9c6c907f288f9519420320e4ad9a2e9948e3ca743bf8ee601 +ae3f4245d904c5f9c6af7d1623018d61cf5384358c09db2050a2fa299f4ed90ed75e9b0ff37d59a2f7290b4db86092276bf69b3cf84eca0fb1dd1b89c4616cc932ae827f10faf794a40545805ba86e3a8045574dfe,f59242bad1642a93f9788280685b329b715e7b736bb70a4c71bf9cc21c5e688f,48f41000a4dde3a124682bda1b015310bb58b7b83fb0baf73af06d413e4ad11d1cbceaade590fc534025d74ce3b7719fe10b4b6545808b4dcda9bfd97d19713201,9d002f095d2f5de1f0f9d18dcf81715e47b26faeb26681e97fa33adb45e464cb60fbda8f496af98201578a975e3388ed928146bf04bad77248442e73c8be9e2300,3cd7bfa7d9a85939ffd97beb1dc737d708033093d849536074550e2e85a968f83ee5b258ee3aa205a238feea5d6e2f04415eafff031a768d36f62ec044150fb300,da60b109649f1c266f466b836dc584643ceac99c3c5fafe8030d26f0343ced91457780b8bbbd28092160386e9c3f6ec7d250e0213b82d69c5c808bd57555445200,c7b9888e234ae89a2adcb69ca9b835023428ba1d3c921860139987797820b31d56d13bafd1e8ff100d4512afb7ac880bf366aa75b2e153cfd356c2aeb1c6367d00 +4ba0d3ed324f6aee3f4e673f7a0d6a87c7add0b2c2e4e730f5b2de297f762b46dbeea4788c06d5faccc86aadb4904fb7300f85f4a5118927b01deec852408793bf66d0d5d753799ccc412628781e2b8075609a5996,469847f6e770624597f72d52350581acc456e6ea1145d725a9bcdff38c6f7f3a,443e6846848d9b15dd8486cfd32d588387cd7d208f2803235e00fa08876a2a8807edc49393ef08ee7f713a4a3129ab0ca0a74c4c5e7baaa74645fe00ee69a2a200,1bc37a1fa8b1bafbb3b6d3243afd1c373165b4eb443422b9538baf44abc60c443e3b92496014dd7d171c541b3967f05db76b64f91dfc731b52150ac5e5c4564d01,e97e89ce4f992819de2d8e58c923f1396c6a40c64a20b399023e0252c2b81f8442cf25464d0d0f4844b2cac1a7708fcf0c9b0cac2c7d74e1ce1b56d7f4a8915200,8768fdb415936f2b2b3474829b3b52bba1861b93b2fcf4736fd865910f81aa4a245bcf57f12cd5cf9d3c6a24c8dc71e0430afe5bacf8f5ab79a63336db54ab5701,fbdb6c5f3b14f73d7bcbf46598e6349be825ae5a7a3c642458e7d6afff657c493c8b87b4ad57cfe07f25f8dd135996625aa8246850c23c7e2f4b92e35b4910f300 +a0f98d8427d412f565e86a4725b70987dd28dd554694733e97752f6756353208d90e977d246aeb517802a0eedaa4ff78998bab65741afa1f0c2f8e0cc6f6d7be98c1de593c771480401ddc265115424c6d6c1e49cc,d267725d5525aa205077f2991b8b4d2e4049cdc1a32e2f985b8bd041ad0dada3,9a3c129228199aeaf09925376d4639f43c016285d35e7f8835bbbee8074ff39f0f8ba5136f3d3aaaa8354efc32d9a10db3cf973deade0273d66ff9f0236c8d5300,b271a4ecdd287f22790daa88a1dfd2e4a4dacff88564a0413f372ede7de868994337a2249d96c4760d01202f2a78dc29b518e7194e96e7f1619b558b32aa0a5000,5d389a9daccd703af7f587a153ee1318b9ae13a0b6aec8d0c96a4aad33805176551bc16af1a69c5e9549ac4b967bdccab02858622fd5e7746c0c118ad501695100,de91568a81bd81ed7086d564cb4e8711b5b9485478f321872d815ab643ddcf05704d420e7ceb13306efe902f6857f1eb986c7b9594e37c27f0706654b2c5e7ab01,dc14fede95d0192e55fe0157b844b69d0561d3467ad2d18f68ca6907615bf00c59efb0a76febe9fae0469a2df7c41ed05d80da177bfe97d3ca036ae7b759d1c800 +825677165a1ee398574e43eebbbba118f8805f133117e5e6aa140e1c337d839fc3f7f304eaaf33bb3fdc9164f166f580b8211cbbb1ea9d111878f7b0fbb74be7fb68f36093f5e67a40c86d79656fa4ea2f096f3a9b,b3fd204754223eccda7dd3d891c63d00dd4268bf2146fa5f69fd1d0fa63f2ecb,9d19292b3b8b545642d4bd39e3ecc58715daa52755e1bdfec73017bd8fb1f3a93f6cb6f97f826055d8416ee860631c27d0becc7442ae62a8480d2d3da721bbf500,4dd9c569fc4b129e0bc06d8560e99a1f7923efa0a18596b6dee71bf601f00be0096beb706b78e0139f670097ff1ad3bd0b4e33522b3dcff521e7f0727d2e65e400,30ceb5996db0ab926656f5ecca79d99c21096405e69d95ccf226d438cc179cd41db3ff2393c005cb60e9ed4debdf55e685e1788feee237545cf1c47df0b4bedd00,1b11b90147225b7de79598cc7c8d3aaa2717367582ec7a1d1114f3128d35931a0be7e81497b04fb16a552cb5cb37e9328700522086b36bbc41d89e536df522f801,f954ba226ed31e4bfca85585b188d9f3b2417739b9dcfea206bece858132c6c01ad8935cca3ccac3284f5cb29248034132e372a3b17179578009028a13121d1e01 +2d6286dd6aa28590fcf3643919b59f4d0420b25ff45a92ded79f5749a2b9309d7ac81ba4ff0da5cfb8d0763e38284f870c7b94891c1b04a507961a1dca692020629ac4b2594b2ee45c25123cd735ead1cc889c2f2b,9048a9b477bd557e055bae89fe70c9b2624ec0b4270e8a8a197167d0594125a2,da864bb70a6b5759f75a7549ba1ccf6cc9e2d2f323eb1842de4be85de6ddfcb15388ce7a7417af14f3a1cb32b4aa726c57d6cb682677d9d8520c952ded331ac400,813f770617a37f379697d921230c76ea9ea51942483d9bb09d4e43637699de096bf9b9e8805741e7122be5d2ce4ed380f29073c0a5df241dc6485c03a548765d00,a1ad80da96729814e3f0bea3d3a0e6dd47119980aa3e192daed0290ec09a574f05967f8ef90eb15ae53ff05192e82f3499143c01bbd2d0823484f102e4fb241201,3733fea9ad7828c028a3581c9b680592f51c3ca1043db78987e9ec9c300903a42c39b9f4cd8ad96e99905a81356b62a24fc78a70fd410381b14788bd1e37dbd400,27970ad72077d1d59d5061b83cb73700e1ed30ce16756cb8c4ec117c46f8a7294cc28df6c7a6b716c390819d530fcdf39283b7df8e08449e128972190c622f8600 +9568dad4ca53defb752ef1b5a48d8e2f41e89344375eb562aed580defecb67a0695394be6d404e149cb935a3333c8946f5bb753be77c28426a0ad32dd5b979f2d3806419409f3d9a1f6f82fc402b3b16628ee02279,86ea45b4796627e5dd8d1b227de718daa9edc923123d5c36596912cd38151342,641cdbe512e6472a80b296fffd9877784687a71a834ea2ef35d7d41f24fec9bb6fb26f75438736c29731c3a00a61d22923e3b4b4e7fcdd5774d8142cebfb6c3e00,4ab644c0bf4317843dc5c12f1c34250bea5535a14c8bc84b11a0648dcc633e76533fa067aea46c5961ad3f4b271acb78c5d35b5c7714cb5f1fd841b69b11379a00,e8b95d887b1468f3c604e63bd8eb57ccf8a8b868cb9bdca5611a3806fda3e2290b35dafcdd333ca6dd58ce9a8df33062bb31f62efc1fc9052e11194afc785b8101,351b816ad1591da5762128e073b0cb240bfef92f44d23da54ae26644c82b95060e8c4e3f1d100b8fe89298b7217a53559f4a8307d9d35597aa63f7bf210a034c01,3c2973220662b717564d18b19f9507f1bebb3edf5deae81a04791712503d87f94bf3673f513170e7b3ed2a0bb65dc4d3e7877040d88327beb750d956143f0f8b01 +78250116c5ea11897fee49f0a74384873b4d0c25d1f9a2a9ad1b2d3621cb6c44f60e3576cc7e700bb5bf7e7e43daa76d267e33457fe6744b2ec11579a5962c87fe402420b70dbb8eaa9737853e740566e4c5abe976,f5529e831ce0494efb4f213a2de99fbfbbded12418c52da262d5ea5fa41b88ba,a116f9be923191f6338fc5b082d99077be5b7d443304827b5aaa289023abdc4d30deb7bb3f2c7e9e5bf7184597ad359b7401c6e1e49e9e1610690ff36662364800,ba94c211919177e87cc48ac7e8c88cce17f667b80a98e0a68cf9836d5d3ecc7c61d4b4583150c1426668f8418efeff3ad1635f4ab2a7a5e7a61b5ce06151a67201,a12fd421d3a559706cd8827cd4cc5b5b184a7f6759ded43f6e0656c7e384124941a3ae4100ce509842713af1e81deb1c384c0cbc5a01f8c86dd0da12f0c23c2e01,bc3adebd5fcd57db7e2a325b8914998fcd1c2f2e12c227868f7dd8a00460137d36befffac6a35748e1fb6b4378152717c0bda196f4f2c5040592bd052f8e064700,997ea6713b33e021e3ef886449045a2d211e92d703f4c9c965017818574f36585f2edb65b570517e0c319c1c2879a9e3271fa2abdec5227a4f95de5aa239f17201 +12b538b095af7c5b01571cb7cbf12bd993559c190b402c52d26621ec2207aa996659eee9bc2ff93f9cb947112d9197838302b3d9f3cf4b4aa2fd69f01afc3a5d77df2dcc5e4101c3890765d17fb4e2b8c7c0e6215347,5983c7cc9892c52f32f404741aaee32e0a83bbf5d7a801ca31bdbb7b3b67a771,520c87a7b55074e69317f3f58c2e593a4b5c3473b340d4faf2de12548eabd0bf2fbfefd274677addd5c0d98b0c2e1ccfa5526f3321fd5f8546193721ca5f881d01,3698316e959c536f0851e4a93225573f21c0f0ce73efa653af4d53f919ef43153af3099e799a0f85fdf19115797f87e879f0fae8a192a0d635b368f2948cd72401,824e7dce20433448b1fc7b54e2a6e32b5f94a27091d317b456804ffd5604c8693de45bcb68985b5bc8334e17f115ea003422d0b3f764c8f331136c7ff10ea1ec00,40dc7900ecd69285c350752bcd98982b28ec29b41eb8a53110d396a9731161317b1562dc4c7b7b7b210762ec91c6f409d0bfc16bbe1062062bc76a11a04a066800,5b7af5ffe1835a8f491acf1e616298e1ae9448acd030cdd33998a3cfe51d51cc738fab2f9ec1feb7e1e4015cc2b8e745dc517413b4f112d2e45fa1785c5d63fe00 +4b679612bfde5cad93156aa4e0e7ecc9209891f0cf97aa584990630edf667adf3d7ff76cec3f016fc7e87d368880f4dece9f8ec5609e942b677d9c1b97b6d1c6a8459156e4ccee300f5310ff69e9800279673fb10996,4166702d5fead93e4df8ec52c070dc355842810caf9504edc2c79917b8416bf9,3c7ebec7d6b9afde1b49e7e2cf6e611c616678930beb67cd31dc4dd00a1b7c87774c178e99abe65128aa8850965789abab500db4622d838831a48e11e52883fa00,c3bd4e8f3a5425309ba90beb2850cae55f0cdcba000090908d7c199349aaf5a60e1c082d1bde5ff3930105c585c382bc1b78c20d60b7d259031971e87419ce7301,cb84180199d0136928811a39cd9558db31769b0ba9f414da6e1f0da6d6a115c6438a53038f96c38cf9ebf9536c66bb29ed2c1e163f66b712413de12ff59c9cf201,63fc7c3ce78dd27250c6079e27ebae775f8fb54e3ec8a2419687c466f32bd68d04c5880bbf23a93ce3e7da534523869965550fb5dcb9d96c945dcd40e4263a0f00,52a00875280c62a38a022892879ef4214cdecd1a0a36b42017c9bae7ef43be23589bfee762f7892f1b8b67866b45f5794b64f1e1e8c06ea6a2b6b9a7a975c3d800 +08e51772872b7709d772a5c69b088076d7ce65f6804bb9f0266fb4c28ca18bc726e7a47a1f52b41af41af5398a55ce655ba9ff5eab318595f930ac4732dd06381f37d67afba16566f9420919110666173d36273f27ac,e706e77016e2f0a847994eb31f1f5eaad4742c7153929d0a9fc5d05a7cf875b5,abc56996f3bab559c791a9450a32f7ba999bc6009c8105de5da04680341af08645fb7a05bb884cf3c245ea265cf2e1c59ecc2acc04ce5f1ade97c285c731de1e01,04f6ad5a4e6c0a3c786c59a9aee1052deecb6b58abea40a11177adc6f5cddaca0715e9b85032aa2a21cb5f01a341b3a0ced62c48ce52c5a67fdf06aea7f4c05101,a7e4e9d1ccf0175d3ea80a75d38067a7bdd08c7c90edc8c3584f63afd2a4ab414d7421593f8135e6cb549d8d6ef72598b56aa931e9fa1366eb2d0432803b379601,036858c4f7f879c7f71e15d02c79528858e4f3ac8ab04438308296dbf36db96c6065664055f78d04ad52c641677f343d8354a5dff1dad80409aed2aa214fe4d401,f2aadc31e3a1abdad222c3e9c20515e134b6bd42b5dfcc17b3b458780cdf715a10eb23246f560076bfea6648eb55299a0161915fcc12a0ccb7a71ea7fc35bb7901 +5ef1bc17f96f7f6269d8db69b14e58864b26f39bd752a7c3d1631d6cd8d356edaebdc3193018954020cfc5bcebe5f337158e981a4fdfd6599db4729158c83751fd655cc550135095d46dd6233adae288a88c86c4511c,09f3b498c3a79028c36a09afa568fac87b8c98608202e99eeb308bf726115ed7,3936064c1fd671c77c39cdf9f8626b21aac20bc922aa26a12cbc4de83eee0d553d84753a516eeffaae732d04d3076b8c7cfed3ccec486ab78e84cca0bf7ee43a01,2551e923c280f9414ce9c05a9963d1e8f23fefc3fd24e30e21f9c920d7184e97057b3a4cb903c8154cb2d86e8202b4f95fa4c4b76b979258ab2b06721fda476600,3e9987ca1caabf1f946009e9dbe78155c2b3c266b22de97b77d9373752905f90154dadbe12af665f49632ff665caaf5722e7b24c9eb3253e699b5d24f7c9943500,96b0ec1533e97a1cb8f7f1a3396f9fc464655d301c41e5ae195e25ff83cd2df218ee37d45d5118bc23ab8c91a06cd90db5876aa960199cb5e950d3d20f9c7a0300,d17974c55c412ba766b875a15c8d9d2e0fa41568d69819eb44ee989688d30dc7036e24b76e9dd9a67c867a394a072d855fd94552ac7b944d2aac412532b88acd01 +7c0b511d27fb731d9f1fed999955e3d6daf9dde19d1bc361f79b4356d1690c4648b753b74d0accaee52e574cf64e92077161da91b60750a09dfed5c44abb7bac0b989992aecbf131980020e008ce1397c8efd5220406,7e94028652252b887c9505efc13db98c9548598b74f2e17f31af7427fa38e9f8,7895bc4ed61c97863eb51036727d998d130b78faac02113d258f4329c351969b4f83dedf45d11fad86294cc270b96414c915992a0b9457ea2e57276a9ba1312200,e8422533cbae46528ea2425909604d956d73cd625ef9d1ac7ba1429de7cedaf6386f09c62a673fd47aff5a6e3db562e455ad9e4084238e407b67630fc231cb6b01,59f43d1f66301b5fc1a336f2a248f722f03f32e523cc76f5f83d4ddc6858b22979301620f898fbb01e6d363ad3f8be59af2ece5c1860d997a68deee3edacfa1801,3435d53640a575fe4f53043e5b85d9745618dfcde21deebf8bec2c27ef1177bc573516896f66b190296ecd5c01ac4de2bef307b2302eca2a07fe2b50d6a04eee01,7f99c528677e513a947d6409e4c4849aaf1d1b71e1ab02e6cb40cbd7ddddee2c4fb361392e2c13fc7e9f113f538dcb883a413ef1709208ca2010d2f78ad03b1800 +0f55bb09cf97716676b78c1d87098e45980117e1a28393e8fb3e65976e242c3977fa313349ce3ad8b4c6148d6ec2c181ab1ff562571dcc44132509836dea9e9ece76fbb83aaa336a4656029e7955b150079586851307,c2df93de2ade0a6375e5b9c95378627b3cf3a99f697acaf097844cbf93fd1082,bc9ce335335d63dd97719eaf7bea8d2c5febeb8c0bda2b66fa2989994ed483dc0f452deba0c3a6a30330fa9a510fc29889ca7880a0967313b4e888b6006643c701,2256d66d50b0d1a537359a7fdb50eecdd3b775e00e1972a10e31f00b5bf3809564c0039de527d61eec8f8a15449516bcdd70d79a24a1475b7ac1759eef8cb25001,2d3e76edceeef8ba16b93c87320eeb999cb5d5f27f351d5e08b3c8c3aced793366fc11eb21104251a5c4b8b984985b0c0182fc5e33698dd5d53054004d85a5ff00,909862ce7f2ade0f51739e48385b99d3b0f56f06772dc343cd5d84d9878ff6cf70ee99182c929c6b50f8a500870989e6d9a259b2077c6703744b08c4d5febc7a00,ff6bb0450d0247553f9518fb430d5b884c6dbc8c89169a30480182c114a0acd40ac049de0756173d1f447046f1312dff1652b1ce3688e4d58bf30150561cbba701 +9cb389b9404bb4c662f12d3800478b64880037164e7e4aa1fb2254d79b5a323c96a5c6f5f5676ab5f42e5ada8afc28466e4f5f69a84bd5d6dc92fb24c67b6dff7141cfc91c9e745333a47f59a588eb6b52642984004c,f3ced9969121fdcc5bef1dccea8d74c224d02986550baf8fb11cd3b9c2d86e62,90b5d999f83269ee0c22912fb06e26e25b1b830d920a163dd81fe1a33d4584ba7a05646c696a21e1b2839e1a27f1e700f9fa20f2cca30fca75b115a677888fe501,8edfbc23f3f5c021c015c3c7011c711f1704f7e06b2ef1ce92e4f19570501518035440a1c5cca59e1c61eb55182dfcab3cb2cf218940a2a5b4f50be697b0278100,574fa235514cdcb2381e098efe0159baa81e354bed1e76cc650dc4596680abbb7c418320c76ec687c06f0dd33f62494e2f4bd947abdb219582d61dbb5a98c07801,00ae3a41beee2a216780fde23a58d6f0575a182d28f290c1848b339c59ccea003450510ba949d8c5d7f6e5da3d3fa83c510e70fca8eb363f58506dd7f7e4794a00,bea508436b3e071e37f3b327e2547f9c25426331188d6687b28a52921b68669325ce5b59f8e1e8979f2a2185aa9a2c7f66a774f49038c860ba8eec1df37d5b6d00 +09999c599c19dc0eba9efc85b5675ae1e268725945b57b7bfd53d9e6df236c14a6013e5fe5a72007267888bd139196e63db92f44c931a88d26b13bd280462cafbdde9f115c69907d699281101e2437b29e4b1e113dbb,1f1b6ee28ef4de446d7b38e1856a703caae16001f113d600983bdb44ec1a9167,6b270edadefeaa77e3420955792f08406484f8e3e2a99663855597635fcd226d32ebddf4cb9f3eba40c94b1f2b6007a458b6ed88fb98c8a0bd820f0f491ae90201,a7ac05a08fe1941e21984d0e61a2f9e24e899ff0e36cad31af1e100cbd2e076f375d1efb4d611f4b71ec573730b66247af9ffbf690aa6ce334a3c1e2c35149e301,303d8cc235ac0075f83ba6445648a52b0f9fe64c415ad8c92bdc32af7de5bb921348596e0b8a16d704ae730fb2e4254993a6e5505172424eafea87218260c01701,5a71636268f288b053e981ea1f794e3ba57c4edc94cde8b7ecc277972d904440522c6c7a2feec366f456cd243d203b6c4ab5dde4212773c51fe6779d0639c8dd01,551fb5e0c9416cf0d5bfd202ffcfedfc52e55df952449d249912e738d7b8d92708f58535b91da623b5ea2b6e3ba38557f94b103e2f7df612f37d59ecab84804001 +56575aba5b32899ca96b52b7b69490047b74a52880bae7c674723d1e33be540f7bc8d5745f6bbf7d7b802ea736db68a7751bc62f3f3c1c79f5a5001562f746d5727faa7cdb53d2e5f0d97088ebe9929d8af22a5aa317,4ec4a628e715ce51d39859ea123fe8bd5da03c4dfcd8592921c31a97596201f8,033112a39e6af00b93203deaee60b5053265df1621e76b540b53f3658520f542090b646dafcda249e0b2089c77683d60da312b81071d93c4dd76cac2a08790b700,810bb772c97ddcc8ddcf1b41f8a92531bce37b4cd35e6afe40d103a1743bf4ac1025caa24c7b4a511c5ff9e6885111cf8a6660f5bea7258a2d070b7391966a4401,69fc39f7bfcc7033496e3adecedf929f842a0dd899555b371f5b414397a7a7db2ff71c5ddf1026516b0aef234f485b770bf12fdae87a88699daf9b44febc859a00,b3d4744a8340c3a1065265f74ff035545e1632734bff9e6fd420f8680a7e8b0e7dcdcacf7b15c6a782bd6d67fe189af50cd953a0df3697ea47ee4f3315df24a401,24c5536f77c178969617f30b7fcb80bc171885970daad5b0c7d0ea497d1b26975a4804a243aaa6ff6a5fe9efa6dcd3ec0b8d5673f554aeb30148a3c6a061241001 +70d265440ac75b607395b21d264ab0cc7da7b662bd34e0dbac82fcdd8df25b51a33431f04002028828be29440b6898c777e5050c1bad0d8d7f6b83973a2ea1eaedbc0ce5ef82a49792267067df30948dfd7d050809a9,124f112abf682c6371c47959d140858caedda84b1684906db728bde52fe8e1ef,019f4ffe9dbcc59c1f24f93f8b7683c83006df279ce5ab81ffaf8ab36bf577fc24bd70221d32b72e2b056a1050a49ac2a327061b9654f7e9b1f1e0939639ca2600,eaa35f1435c0aca09c49757e43d9cc2ba130c82ab1807239622aa14b7323a2192f89d7ca6a17cf4f071f91f6276a76bde6b43dd19e9686ee9f20a2863109ed7701,6e4c186e20289c3e496a6fc36bc35aa65b504f2d5584df03250b51f65aa872964262904fb11ea775e65e3bbc0738d0e26dad9f9f39d14bb934373ab3a5be398501,be0a02bee0f64a3710cdef87efccd56e8c6fbadeee444ca638ad11a01d3de0d2583d4a267e9a4432997303bb09c40c4460a47ec02700bec161843215eed9011801,989eb61b7fca18c981b38ad1c8861699a1894a951861fcd559f2d85fa6154aef1fbfac5a8cb939eb41217a82cd3d19e1b104c405e459493e0bf67ebfd3b70b9e01 +4e29eacf88793a5f3b1362e303d1e24545ef8ae6aa01ac81c624eabac74d6ddc929d2c62f7da7f80116fa577964ef78c783b007b68684c596def11fe3fb30292ea75bf128269d72aca9f172be3f8f2be61d13dde8965ef,54f1259b54abec35167e6a07ca1e54490fc4f9b1704a0d94dfc2eebf7490466d,f52dd1f973c632b89fa807c9695b197e21052e184c2dd0bdda33528ce9a7dc887cdf02fbd90bf1a55d51e0fc68f3354ee4267ac9e45756b1b206900611ac4e5501,3b00c631aae3a95fb206193e41ed353f6d1d8255d4624e29521dcee0a5bf53bc7037bc5b717cd4d46e89b6b86fa255f5abeb747a14a5f580bb4307e53653289f00,f41954d3ed73b6283f03ef80f5e233009f113ef6cb96449ee9c3fed5b0ec1aec79a93152db6c5b5d145a7dbf76a74f2f56c18a3de6a2b2ef4e8ec158db01bc1e01,567fc71bd79c83f0e35af6ecf7eedf25cab7fb15f9a6b39a3677ffb60ee913017757f0717c05c500de918bea79c818a51970271b3c2645e2f8d0c1a2020f1e4e00,09163c7f9bc961ad643e99a3b2b52b10d02fbd0d4df73c27f8b472ffd7626cc41254766eebc139e03d9c9a7648b4ccb79ddcd77702d5468957ff0e32b275fd6e01 +9031aa09829103ba1b127a55e326cf2fcf36a52f29df47b8585efddbfa6d47db0c70b321630a913043455c7b5a9b5aa4864639300eda0b0520be2c03aa8a0c9405780aa5f752fd0dbe9d2051c84bcc210c899df25612d0,ef467504a5753ac82fcf294ca77619b0a2c141af1596bf51029657b4db74988e,718dedc48f196fa3f9597439f70ad85f5ed224cb0c9f8205a89107d95e32ecc97f14a3baab875ecb3b397ece355e5b7527118c3a0c82811aa56108495a4780d700,15cbefc9dcb8125877c314dfc7b150703043471a86481d4bef22e62feda139fe5663974ab7a32f1278289f308d489fb0a320c1386791d04a0f1bb50ae42b640e01,e86d55d0f2275ca6e9fe8707f7b79ef03cb7507f32f60a6e8512490ca523e18364912373c917d7524e7eaaf6092da643eef43cd8651fc7f7a99f012cd41decb601,5113389cc3b35c1ab89b02ab9219f4cbf80fbc60a7cb1733ad860882c19d7d7f09a8eb41d55c8e93ad600430d651f22c73b2e3f91aaa5e3c1f4ee2b857d93a5100,24197e55ddf115b081c900d8d44bbbcf4985c80adb3c055fbc31427966ae2b64627a07864bac2e2d4d8699f8608656cd29b23eb2e1c22efc141e76a43a5df4bc01 +bf8d5bf5eff76ee82aeb59bf2a720257be647a3530f18ed03f8efd44376a2c588c08f6896c66f24616f71e1ef424f98ff0ecd57495de20b1db8f695320bbd3f54bb0f52c9cbe810725bb572b37565afc06472346795ded,a9b89a871daede109ee58de64998383f34d27b71a4bb312b623344c4537db220,6227cdaad825f1b99c507059b1e1f2712b840827f863a95cfeec5d6433b56a772b7a131321abd2274d8be9b7b3e5a75a5f444f67f1ec91676da69c051bf9408900,b80fedda98efcd222631f180c30edc1d4b939fe47931b700986b7d7bb60ba9db269d7466060311a2affb291e7bcaf8cfdc5457a224aed8450e15205fbd64f53701,d8d8d68ddbfc0866e5f0b8fcd86e3493a813e04b4663b4a914d17ece0574063f4fcbc1821ae1a6720d1e240160cc87c37ea6cf2efe1267e218def68fbde8acd900,b53753a69a4f7fa342b40175605ca64097ce517a80e83c797781a0285ee334ee13a9309932efaa8c33a5390aa7e50e4f19449a633491b79fc0d1d19b6ddfb61d00,043eda5ee52163bf634ce77f141c8cd5eeef5a18c2737d74858ee5f5289dfc226c3cf035cbedefbb57fca14113b605f115847e85dd631690c3c6ec129498059501 +02c5d286061b4f336e8b76f8039f90dd3d255b2ff16ea9e250921c1261608f06c7a0542ea7cd822587c5b05826647d3a24147809114f1932079103b9e94efe5d3d644ef4aa985853771cd4ca0d39496a316dc256db6caf,31600ddf4e9f81f2b4e6a4a94ba8ee024ab0e16f6cbc203e0b2088b4b112e026,40e77b901e9e5082a93a42118da25d36d100d10bfdb33e3cb78c581e922a41a261754db3a5ed83180231f097bbf1b5b9d138d6389d100414ea1ff08ba4bdb36501,7977501e7bc8347cea3928b6b3e3cdecc05b5113ce93323002ae3e3396faf4f1166b31cf073adeee276ed43378cc3b9c28c5166c26b721e17aa6ead5de08863300,ee2d8c1f2ab889057ea8b4c493ee527c7109f9543909e3981726992715211d0244d93c1fd98d56b158747525ef153b2ddecec7a5317398326066ee0ddecca18a01,4da4cf8e786bfcc16e7070645f7143797d95f85f4eee02e60bc5bbf31275cd2415c96699f0de721cd8ac6854bed8ddc351c4c8f0b2df82bd4916cccbaea66b1e01,30db86b9b1caa2f1c6b6d3827ad9a74a8592f9c96c339cd88d01afd171ecd72f263458417f8ca4ceaa953be3dd132a84a93cb66529019f40af8040a068231d8401 +bb4bb62289291cc484698724eb5113ca1912712e3889fca5d889d0b8abe5ce52c153eb5487b1554dcf90338154d1558cc48fdab66928bf845a85f5de952a418b64fe513a2f6a0b885c2bada00d099bb22a3f1ac94fbee0,390b62f9f9ec96687179608a0a9b9273ffbb4006008038dfbaeb42128c6d3e05,7274d8cbd4eedf2dfbc48936bca79485fbc63a85f9f1598afc95eb9f19f8fa31234649d5ae2c738f045cbf938e55c24908d4a619f19e24d62e71757a6a0e2dfb01,feeb42cfe3a8120fd5c6fb173fead625d24daf212ea89a1fb9edd439928eceaa25e45e87b7056b1bead81fd885d836f383efa278b8ba3e7ffbcbe2a41e9d3a2300,cb4030607507d8158cee8dc778ca2f15413839af78feb1343dd5c576998db7a8590722f1fb1bf4add2b7120e2432f5f9e553507a170941904bcae622ef72cc0001,c832c04fa24fa8afd71609108f2d25fdf76baf989295e7ee2c0abb9618d11c45736abfd9526fe9ed1e81a2f97f069a8e2108b9c920eed2490794b3d7731ae91000,04c3d91cfe0d70ab85fbe19f2629b1a7e2ec75e714c454cb4af1c90c869ca53a65bb163086e9c54b9c091709eace0bc89e6c70f943d772a356a1f99fc5c4567700 +645704308218325abe9e0f8022de05d5760cdf8f895c9d4a0143637c5eb5c4856b4152c3d7b44df89b92b00df9a8995286ffe8c6ae03e96184b94dec0e2d249595b2f51f74784b813e1f23bdb4f9d3dbf911bb741610c2,b6ec6e0d4199a1954efe14e344b6776f0b107cd3068ad807d349fcfa1673de97,a404fb5f248a342c39abb0243dec9ac4c971310772daff09423ea30d4312eae43f23d9dae5fdaed84df7b970f27c5567dbb191369258c5d9df35f6d4621a544100,309054676b837cfd99fe4ef02d577380df8549295f3afc8a7782dfcf339d7a1c5aac1f5c26928a5e4f43729d379b0a46992ebc99666508ddcc7095ebd2a44a5400,2d679e6e7e6a8440bf10797871785787a4e855738c11fe2add23487ca92decec13c0110ea11c417f29b8beb1d500ea76b66fb9e64ac73727b35fabe358916ece00,9d8836aef0cb4b8b22be74828bd98e56c9baee0d76d2a2428ecca69e9487c1c650385fcc12ad19241d64208a6577968192c625eb6f5011ed69ff562bf025830201,d5b977face7d967abe175ff176b5e35425ad3d5487dc930d3dc5b348879694a67911831ba03d47a03a5e3c2c7647179f5dcb2477b2301791b1a349977c3faa6b00 +894bbe9498b4c8c02d3522babf2e7ef91845d61c1a7393faec0bfe65f5b4329f5a9e762d93d1ef0e2fcb7b91c8589ca6e60e233471e3b6136acb5f39f3f8262dc419bf6af0d318c10fc7c34418b7d5589b14f40e37b539,24d96a52273dd2a3e92d6ac14214bd518c79f6c87f342f6629f5709ada45608c,af0c4c845ebf103723040658e47fa3dc6cd25ae232b85b452ef79e0727338d466038392c269e1e6db02314b9e1243539713eca618bbfd499b029308e21858c8600,973e9729367068441e701583079d53a932290c64b3163f58918191da0fe52b8a59c064435419c42e7560195cb6f103deeb0852059c7b14a66238504b853a898600,6d330d6d8b803c2e56bbe7a5be4fa635d144f8000b59f2ffc47c91bc74410d242511631faba326bcf89e2cebc25c4f7459957bc6e4275b1c74d96f18712fb69d01,0bb1f2bb7c9d511eff4ea2c54c89ad9fe5aae45808bf4a7807ccf8df4d719b1727aa17bf7830171e3f5cf25a86c77e3c25b68c4bab9cb957d91884650bc0c59801,5223ca251b45a38a1cf2378f5d11af73c80703bc13ad3625a7d6d2271b034c095a55ce0f692703cbc3cd1118f9d3b5615c113f248b72a0ff729ba35076d1c30501 +bf5a2d479f3b49935d32117756cebe9142111ca27bb0c5a354759aaa7694931acefd9abda44a9627f6f8890e9f32e9913ee1e4f7bf657ab64f9e05d540c678ea9014475d65912e1bd2059348ed78521687f781daaf6462,dff9b5efe2ad2521e3d60ad14b80f2c02c7487eb692f399ff73bb9fb2c8fee10,c77cd86a6cd0f2c54b4c2bc13bd6cd3474f6cc3f643caf0ff7df9aa4541ace8d01f5ee171ba1b028173c2f34ddcfd9d7bd22d3b40148689eb1a780da4e688f9801,56cb16b3e363ff4b89798831a9440cc0ae0ef18a0373a3d0c32eb96a665c848d7287517bc0de2fac65dd63012be54636367e0c86c9c4b90f9814f1b8c5a08e5f00,33530c5c1d806f6bd58abf74648aca17f0f487fe7cab3d3a43a3ce2206e8514617961c591c2c30d87177d6c2482cca4e66b2306e53eb12f66423022a30c1badc00,0e92c378eba5f71b0b31b3b14834bbd4e3bc493559fc2f7309cf7c8b49f2c0104c73d508dff0e3a9ba9060b547445f37db46a48b4cb2e2562dca2035013a942c00,0114db78291d84334c69646b13ab0b16204e442eaf838c08cd24338754a4cb353d87d451a6f26d98f6c020353cd79cd144a8e22520ae4ee086e92261db2e746801 +b55d46ed1cd9dc64e0efdcc452773d16e5370190710816849ef5915c186434ae4af3661151eaf1e27628d00c660f110994d107824546909f7b4a59b43651e91c92ff5500234e1d952884e9fd5e70bb0ed7746beb47ba72,512cfe2aed24b554673b16d7aaa0de97eef2c656c71b1dc169a49f80b7fa0387,2c49d7a1895e8176adffc0c4064e255937a5225b3dd0ae1567ac8261b94989ea2808cdc6388e078b9930d9695eb45fcda2c8d2a4825c521fb70508ea0197299b00,45230f94c4066566fc4e186929aa4bf08d4bcdd659916096228f3fa94714cd276b683bc038635a2cf2d408bf020ad6c9e25ab9e4d77259fd2b835da1fa07e36400,46248cd8695f3e331fc15bafc6d6d6a5b8565d023ea24cac539d4365dc104a4e5638b02e7bf610e971fca731e893e6960cf4e33bdc58a77755e622ad3245a6d601,d6c1e7414b015924bc8a54280882cc56c99271903376440ebe3895765d12707129d9149b43b2629ab060c1a45a1c6d8444c94d948903f00ea4f20ce2c3cb4ea600,271c92f144e99bfbb50273863778557983aa0441fed302ec7e4242dce1336e665bec57f3a0ed2e96dd15242ac64681f798c74cf70dd152320d784dc74df3650601 +bd5e51bc7c9959455264e2f74baed9fe79b9389d6f01b606c7943d3c0c400566be2be96deec7dad131e2e12aff6f7734b36fcd3b8ccda57d935c8a2dd28d470949b7bb8bf6a3b88a0e1bfa853fd505dc728d3e6c370f2e,078f3584743c165c205b2006b1ee34b9dd6c011de4be4ac8b003195affcb5433,b8b48adc4e204fe41f73a9d002e60b5bcc635e9b18a22fef07ef8525d7ae19bd473afe3bf05ac1b4fc1f423d8762b7ce942a8a93e4c8a497f83e94febf9aa57900,5ef6a95d291da41266088fd079fb324e96fbebf436b624bf1724ec7962fc3fa93ca403bd857a5f272ee6702a8417efe43e41a28507fe71377a3bfe038f135de900,7ac5fe0ab38889482a6782c407d9e18f9219fca2b0b4f6852873cc28471dd0cd2fe38eff5968a64372316e69e3b8edecc1d9aecb129e5521e9c9b87ae829bfef01,4c393673d2b9466a214208aee42a9df2b72e6577ced42ec336a16092c2b969821af8b0b58a5b45ef3254bcd73f8ab3dd0df04ad4e60f32cf19043918b701ba8400,5f5359b2d105ddc9ff9f6d8ca1dbae9e318cb6413ee5bed537d4403e497d0dc57ba18c51fcf36fc6042462c5f5f9eb3c2067b0acd317f19fadd6fab30bde9bb201 +8c2ba6f607275c277de9827d4c537be5f00d758d8c6600926263b8a2c5b7fad984c818464be70518a380fb58789ba302cbb3e0c324968f43d72b0e82d0c01eb3400d3d45ebbc4dbf2c2d3dcbbbb911357ee8fd611026957b,90a249207f4768093e3958490a3f2e5f7139d0ca458a563497656b8c1726c4ca,ebf4e62ddb5d3574c6087c2514d6355f95f3b55467e45a7db7246d0773cef0f460fcd73789454b709b04afc4032e504a9c5f8c745cc3ecd63958650cc6886c7c00,465499d782ffec05316c237097ee3a396c6f6d8cb3d1b82de5f4f71b7d032af418d3be0f92d977ac0e8ace14d61cce344b06eaa454a1bab8753953be2402e6f101,b691111c847e07f8cf56a5a432bbe87ac0c467a2750c0fbb1cbd99c49d5865453ebbf4b2550cb666d2db2af9fff4173f27ff54255fdc753d8bdf728a952bf24501,c52c086891f0ebf41aaabe0d7d5d6f4d9698f90ca9fc26e01d5bf705e9e4fd85110c92fb0e8511f3241494111577856f02ab5233bff406de030f660d59f024c500,97d31af6439f0e74e6a5906d231cbedaebe59d39cbba1cdc940625bd9eef9a2730b492193ba9c347b8b8a5b1db12f99f52d6e84b508ad18656b4566dd77b4dce00 +7ba5eaa74a76940ce15176ab25ef33d862a853ecdb589f4e82968ab5c71fb3e3a87255073121ea1fdaa01e02106968f865a8e57d677e8c6f11cc638ae44fdbca0c1a950bf8316080f60e8f53ddd2cee6027e09a1aba14f2e,094071d9ff21afb94e6fcadbec2a12ea43726dac49e4b34d15298114d6f564e6,522f176ac85a2a20cf9a6be877b5d34c03b27bd3fb7bb74be70f278e78d730131273b38792677d4ceb00795606a7a789bd2d5a505c63f2dc9c5ffc289eba553100,47030660ed5984f44b3858e8b68e603e8d1ded52921b6b40ecea904e054534bd203045eb8d5c27f9fb3999f65d6867b99fe443b0c20bdf697b9ab594ae68983e00,a22b2e4259bbffb4cc6f93c44f583ed5acdea6e2c9106b028386de60097a6dcc7325c2482beffccccfea3f57ea7dd1fb2a42e77a259e3ab96f3510abe63a3cd101,88704ea11fbd364ac8dbee7657b3171f3fd326fbbfeb3646ffa337d51349e1fe178ba65f13028d6da818bddd180b218e88a2c1dd6042dab802db5fd01fdf012301,8dc4a02e1611836ca2bafbecf6bdfd2c4d46748c656be0268490c9d3f98687f645822c3955867b117a783281d06897c73a43cb0b3bbeb1ac95218032bf8df01701 +c55678c6d639d7a497a72bf20e6112dbfc6077a044ccf3e47514cb02a9fcb94ad5505bade10d452b6245b8922e1bca235c76c819965325e74d374f93cd531a704b37a5920045f6de952d0acb49a947fe5588fc8b3a40a04e,99d47ea062c7ec4fc083efdd70298015c404919b9226cd0774c6ec7b77b5006c,eac0a5570f2b0e78fa448f08c619424d8bb1f7dd81d0d206f6f845e357171737438adebb27fab33167527a94a60dc8038d1332463c1b195f8ef96b81e017019b00,bb2fd78defddb871be6920bd0030d3be2f33d5f58c76acac647e753563f235cc723c8d35b022e1d946f87e5fdd7db632a05b103760eef98812302569cd87719d01,77ca7cacb41f1fba22becb477ea436fb5098fee7c904edc1aa310c8ecffc93a93ab34eb869e3525855b02239e05ff620d973e1b25267ccbc52f9e60bec9292ad01,8c16e9a41865566fc992277baad1de37fc617895e9ca0535cda8e872ea738c46799397ce6caf2ad8862fe45aa55fd18e72f74ff21389d1734234d0c0860dd40700,ac1fbe96fdb171ed328570f61c86cd783ee72cc920ace91b680c26b60a5cea420bd30ecea34dd1578aadf94c2c43c508f370b3ed8a78c83fae66ab8e75ec810701 +325c99e84c3f78bdbf458f9271020bda4190e249baf1d6186658ec4f5ad42b3815f0dc076b89cd6dcedf7f598a0d50408fa22edbf4ac1255bd4c65d2428ce80bd3324ac3153304198852b1236fdcc15e374a55586d5c442b,27e41ed1010e9ce78058272d2dfb7e4193809b67605fbe6eb9c56b23b87925c9,8e806a2f37b68d80d155969b7c80145025342e852e252f7f05c6e36cc390a70c7ef87ba7211e818746ef8b6dec11b30aabdaefbf05e09bf2c4689cf5d1f47a1e01,ccee69b030e70cf14603d80a0dd44e33c48c2b76c05293cb803f3df6caa78fa9340964c600cdb09cf2b2931c5151346d08a79983f28d012753f7fabcb510aeef01,a73f9c96829dd098224ce3c768c625f0e2bb8879526e8047a29fea74ee87b5e903e98544407ac0e9a0ccaa1f378083b2471804e52b889712aad4f099b413de0500,a56e63374bf61a919104a0b3236c517dc391748088551df33f71ea37a64e2bc819e180d8606b36e54f97913e24d64fc721df397042f335c600159683c7ed458601,0a5391b640ac4ab8855c4765fc4cb017687e1364f36d99628368254b0a7ca65a33ac32828ef22d654bf33a08be17ec4f6e9a320e17f42d2474f3f679a164cd8800 +901ba46ecab7f11fcdd0f058696f8774b0790d0641cd8ed5ef764d12eb5e8d36959c5dc7bfd4087896a2523f9161af21040fd9ee3c7581e8aa773372cae8c683bfc235a4115147fddcae80292b91c28bdd17c08c3248f2b8,5946a87f3038d2bfdee8dc7af58a0812c4bf11db7982775bb1531965987850ce,91f0673335043818233ddc286a476711f17f38f7ee727a8b4b345ec24d15fd7e0da5e27b8e72aa93aec93eb9bbc17f1ba282f2a29dacbf6c24f9901f522ab95e01,3b5d95b24d6e76302828e443a1091786583506a6b2deabd9e58663c0e38612fc2eec85f22dce3d1b7af2908848ff7abd740592c43ea8cb5a29231c40e518c4fc00,ae951a088aea9f27b50bb60f79f2d757bf44073c37e5df77b6597050a85a00c667af7934e7a68ae12f2a1aba0d906d61858184f0f6922fc9ee513f3ef17ced5301,a9a3c680f7cf0b99c6d1d036b1c2609e8df607db2282ad9d5a28edc736535fb73d414a348298230412819b50408ca8d533fdbdca13974a6c7c1aa6534b98cdee00,58e1885c386c6e02f998f294748f169efc2ca736ab2e52bab28f6839b62ce31f3fc3ee4e51ae2821c24d16dd2ed3680f8c73449e8d0f15d75a74de11724a204601 +14021b2cc5cecc64d86f873780b22c495d2b79197382e0b49b7937ef834a6ba144a67e932b71cb8b0a1cf219a69754c976370e4f49aa1484617ebeb639ee51377b63d4e8696bef7b6d2769494a3b55333aff2e7f8f9a024f,31ed62102c8c2226e13dbc773d2c96bb7e7438976a179bd851aabb21b11c123a,dbd6d6adaec892b0f217f374da2c788953695cfc832bf3976698c90d9e0c92cf0736494e27ec258354ca0b7a9bf066b03f95796f473bb24cd7d5c1f8dc182bfe01,a3cd1a870d56e6a2edc4059004d52141cd4c174fefb5d7135578b47599b114db4e40690d3cbb2f077a6c6ddb75bcd6fffb302bfc38d1392af60cf2481627c00501,caa78b84c78e298f40050d4f860c5d9bab552102c859a326c8568b04ab0aff5839d57eb8cd72109e620778703cbbc197a57fee0a8cec6476736b45a7ec96ddab01,96d85d64259df866c17c3e92224532b592665e1f30b4858c90867adfd979a63b0f788e42720b50c2d8ad756a5b97819092323b727f1a595a91853d6d2781d3ef00,89d266a51843407b75c80e8c4d4a8e8b775f33b1d4a2b16e4c4272aa41e20b571099a943acf48f788e8ce8691f5ed7715e8dfcffe315889500ee027a4a7e63e700 +fc73ddfab05b42b885355a43042f9a4a1ccd32a8cf035a0ef1416788949c42719719fedf9c4d37314709599e7894ffabc26f7bb4ae704bc9a5c3739f759c63268092a46705463a212dd3f7ffff084913942ba0d17428b797,0419a7d4dae41869c5a6db0804abda5b1eac041a8e11583030a64edca9164e77,2bc04846ce079fa246690a5146392e62e56d290248d616234116db4c811b9c287a38501f9ef9bb312af2d8935689a09c93cf4c34f28f2b99460170f7a60d240401,f95717b0e360a347186a748f33973420da2e9e5bea4f6b4d8874bb927e6b71e51ba9f4d57e632bd20ce07561dd06c992d8235de882738d482318f36cee9042fa00,87326240c38ed678efc154dd3405b8bf0ba054ec43ee60332e78efbeb8dafe576bc5a3908c8a070f6ac24b92aeb9dc32fd35175c939e5965284397d96b4a34e001,5af027f933eddb73e753a4ae5677f19c66c759b341470968f818564f06e21c20219752fe6f283b82482eb0117a62a8919aa18c2c4ae15c8d2263d10c3c17b33200,7783fcc840098ecb885193053aa90ba91ee11bbe600766ac3061c7505199c8244eda556103848b993160df1cb7c19cc41a23d14daa61fcec4cd89ddeb6ca69fe00 +e396559831d2ca15e9214f1b50181e6e83ef167ce9e5e481ef20f3d4b9f8757caaa4d08697a3b2a28fd7918591d03b5e6c0febea70fb88039cc67464e6c3b775c7aa0e0ecc067d781883c538b547e9e7f95c03291300bea8,543bf7f0e12cc1b0ca1b96ea9ecc5b6ae2f81721517a905bf112254db9685471,7c1d4c5510e63610bcc58cc1256b40692261cb2cfc813b90cb41b4ed262b040c508927a82474b6e7b68ab018c40bdb4741a95c4c63871f547d1788614ac66efb00,b39762ea3bf7923a7f569d941b841471684c755149190ba27f76f4f40dd331091586b28fc2e4d8066f7de77e24571bda41736f47e192ed8834668077702833dd01,06a13992b48483db7962a196fa9d2cb022898bfb8aad0230c74fedeb7c98ff472331c164f950da62edba84d22cde4c829aa9be3b77537099c1fe3b7a7a7fb9c001,3d94ce14578bdbfbe241367c8aaad2fbfbf7494c5a0ec5c5eaf413a28317f1c6232ff7f5636520b4916b176c57c9a1d273de9955374ec2ed672d99115c01bbe401,d3d64e4411c2547a9b0b5f5482f36c6a7af055152c5a958480092f71cf9b439f5ced8dc78e9a5a54d5ee5e1b62e98422907e52847ff2bd7208305518afbe161401 +b5ad6ab34720233496750ffc25728f196406bc8bc93e72c036553b3bad93d777e5769c7c370fb301daeca1760d1da6bf77a0814fb768c55fe70388a4d4d5ac9de6651830cb013f9f72b9b639a86e3c7af861801850cbba5e,fbb6813270d9557338d0a47503c5d76c49d4fb6eded4b14d5c8ea6e8d55cd7c2,80b5f42cc587a801a0c83e52adf1a3dc121f8dae93caead1d8d45e15ff91180b12dbf30b4565e99e01b409189ff34b864fdeb8107c118ec971adcd6e2582c7aa00,0fa31079413a34a6027f4e7149350a26d617c49197a5940dbb09f7b1e16b6ddc3868de5212767c0601e71fcd1a1f81351137a84e96260160998fbf486d6aa7b101,affb471a40b460cbcc8df35391668c52540ef5dd4e48bb6fc8a18d8ea1f3879a6ca47768cce77f981f933f0cba594236d7725792ea4c11c8f7ee98145e62625a01,a07c6c980b104a998f3aa07ac89b74b8bd6c93c02b4d0856f09b905497a049030404d845be0433d090b28e4eb2b562663b098a1be0af3d90304a3b9f7941a8cb00,c854ea081a98693cd9cce08b97aa48e30a67d3c226cdb02adcef3ea186951e7a2baac819c1d0edf5f50ec1e1faa59ab7f6c4bf419610bc1771375dd5a47a7ed500 +98c5af590d793f12e86948c5d317637b8f0392e026ae04e80654001058d948f642399fe23fe60817a3374f4fb24635b8fbf7582f50d34df11a1a244a8b412f7600f17ce7733dbe316345003ecc1ae55e9a345979fc2f7ebe,cd563544cb95203c92484d792bab8d9b82cc692158c5ce5a901ea762a0305097,2b9cce923dd7fb02ac9c2be837d659f8a024b9ca5ec0538e58db77e641e4bac36cd403aca4eb77dd6ece91d6e76f819cd3176cdffea1524fea855cf82a9d60b001,d2cff684a8b2cf68583d9beaaa137a93d2225ac9951882392e4a4508189df85f2b022914067ea640f2f8dfb9bd29af30e49804340f0ead088959c78ae7d2db0600,e1617bf492b87fb6ee524a4a20830474ef5140320c9fcb8d6cf654f104ddb32f7c5c14f06bba1332024a9e2bd20f250ef3ed5c952b26453b4a3b5a518677549701,70427e8f3645de1841b74dca626624076b91ed95b9d0a477e6d78eede7179e285138ec53e250743003f6e0269dda759af5bdf450f835dffce096735f08b533b700,08a2fd47726184f2853eb70d3ca78c7739eff568b0d832ec73b967dc02f7ad013043e5e3c48287b74004abbc98fcfa96cd97128a68e1c1ebd7243d6d7c48ff1500 +dd22f59047da60fc5b0f57f6c34975abf0ba01480d8a475db64a7903bb773ca637cac95769b7ff54c5d46f428b25349f3aad9ec8233622cf23048987005ae6355c9bdf378ad7149b478fb22f884eede31f84a52d50dd866fc2,32ca0216d6c2fa5197499b2ae378c048739d6697c9d3b2e7e5767bd8f3ba83d1,10fc0ce459ec9551a7c7c3cce2108ff7c5fa8ffb5006cdb5140906e0b6d24bea006429151523b7e3b80d8f122d781fbc9c2d2cb655943a48721f922d3208f7ff00,eea84ac2c17a089bb1e2962690de4a89286efd69b8b823e0b8615706a64813502dd517f17ae341556ac205d8845b076c2049570a55bcc8ee9dd8da95cd3bcb5b01,a24d572779c4d36b374e4c357e7f7358dfadbe57587216c2a440e1442a6009fa7300d7261abbe451358476d14084cdfa99ab6a49547de6fe35cbeb8e3294aebe01,0ba9bb76f46867c5f00333dc4aaf3de6b79229f5c9ac023fc28a11fa189497e72d4b7ec50a5fd2e5970d618f7871839b9016be9367ca44e73690355dd946f3d100,3c3a4498937fb397ec2328a277b8db3441f3dc1acbf14915ae02c4e24f1369541c141b29e684d1ab862ff92d176e01c3bf5ecbce48342c9c12dd236745e8aac800 +d362b2f4ec4e23de5d1f2b9a006fab1b937771c975a06cac7c4f76e3225b02bb265b99a22ea7e8824e9502e0badd5a2b0dfa07a8eb3dc61440ba60ba94eeb40c6446e69fa0c13d1f2fba75c4743517fd10658a2b8b2ae86dbf,b9fe6269ecf765096e9a48ea2afbf992ae9a928a9167b080af7781acf28c29ce,74d16e23ddea40abc4b0df0a0ddaea59c4d50e9c3421a32b958b1b0ee69e4fc9367622d1bf935cd679ad963ca0d7498eb8bb3cb876c6c9ea010d9aae69fd9dee00,55678cb3543e94cee0aa8f3fb8ee2c975a91b0c433a4b97f6033bf34882586bb58e288c8c05254dfb4650eb9cb21433a14c52b977ed69ef6253f9b34d091de8300,453906d933978a7401a7943dc314342b06c2d83b48cbc20673de73fbadb025d87eff6fb0199cb20c3dcd8d50dd552a832e293386b1e96fbf8a1973fff9faa35600,610aeb26f3ebc3e775ae113ca79a0b328f3e0aac15dc2518a386c5ac1b45c58e04c25ceaaac65dac559cf4fc47c4570140a27e3f249e5f506c6c39fec192153900,997a2d321228b275b7b7f0057c5d1fe794efb4aff14f47daccfabdb3e4ddba734be35bff512234b6ab8671069949a4eb5420ad1013fa12578bc2ed46353907bc01 +d0e65978e5b7564d71d76434c4e45acc17a6a3a70a600191fc683525ed9423d320a82377b35f69b7b50ed6fdc0d20ed433a4d5d6fe8101e523c1c447b4113dd8381cbb37287c7f45c6579ea9013dba2495863df9ed98908280,9fc589765184f1aa7b7f13f464fcef7fb893d6e1312683dd9aae0cb38e872b37,882dec440190111aa7c565dd4cfe3537a4c176944d315c56a13826a314e547d22a137b144d551e1763de493854e7a174771158aa5c42575db5944cea0949c8b601,48b06b9fd34f2970ad0824a24d3cab5acfc37810fd29d7004d771aa5017598dd79e0f53d20512c30ef63a53c0c17f118870b10ab631d8a388453d379e424d17001,4851a5dad575de45ad5f93f61e2c56d7d20d3f8cd0f2c0d7cd5a8fe6f80930ac4d33b8ec5d7fca74acda9af16eed3658bfbca0a1a72b39e9f19352f8b943248001,9bf641b7df701e4bddeada728cf85fd2ad1df9e07e2f3dbf6183dd030b3c008025fb7bd7f81418c6a18a71612e5ffe8d6ed44cc04a1d70033cc558e64cf9489400,4f273e855d01df80fa3a37c7f6deb6f6b25db905a086ceba7b0955bed0885bb220a2e29ba0c810726437378f2390b618cbf5090e4f200271a0d33dac739c679201 +e9fed3604028d0adbdc12061b1c3a4d1ba5890e8c99eaa5156dfa7bcfb1fb9264ae07c690d7f6fb44619683dbcdaf8e896adff5838dc2d130baedb1ea6912032cbba82432b77e3078704f608d9a97efda503189590a44b8780,f3779a464dc8d81735d62a53d580197077eb55c2bd5cdb0f7647899ab9bb67da,6486d3f12fec766df6c8c95b6b56f2d92eb34121c72da79f78500960b41284186079751002d5977ef15dd12dc3e921158a320ed276dfd7ba58cc847dcbc8bd8d00,c4e5f32c4edc0ebce4b05786971064912b2bc4bd5a51a9365017ded9b30e205450460fdb7ceea11c651ace8c43e2081ba898e2208f9f552b8aee9e992262f01200,0b6d4e83095a3e574be68284fc10a1d8735b41170f39483de5e2c02154d20bb6735f1edb05d5208d19cfb7885bca2ea50ee6c06693ce6054cc9d2e2b83e5849401,9374de6dda7aaecbec11d70a548d52ea18a7c10a03b21167c46c59b1bb7344d7345b112dc10b33e1fed02b81c4176066394bddc0810d8988cb9ebff428a786a801,27cfdd8a2bd2761fc77e3f5b81f8cb25e3e1fba6a89b7f6e94c724783d85c0bd2c2a8d0b92689db6843ba0df5207b1e654870ec4aeb5c09d95ba67c1e1442f4300 +c8ed2a37660869555a1f3313e0d18007db620da727492e4e36e9d395fe0ad40cb2010a70bdfb257f4f09114ef689ee5d6f73b95998c187838423a52b8d13f6ac19d7c6b6aecf863d26102565c043940c13ec33eaf02b2faaf1,2847bfdc74e25077d1adf2eb7c5f319ce7edad2999663d504c5b9aba903a47c6,f7797512c672da79f7e3d7ffc1f6f1280b9c673726413e56999ae70c7b257e7e302846a876158604fb9434dcfa0474fadf576760d706b4885d5d0d1059712acf01,e41b6a88a6467ba5599dbc9c985a6f7725ad23aee5f4e64a1412f68617ad1d014c72cbde4a13433fd390787869eb53bfcb868d55ee9c203990776c027a40a49900,4bfb76c70dbe28b65006a9371496cbf8bd02e2a612a5e2166c095639c660fd7a2d363fc8879ebe888c95d9721269efd825c1289873af0ca3841aff47fa0b732901,b4be709be376b3373899004694bc999e4d4f5ae8bb19556c4a260331500bed10069653ddfa852dc19311a47c9fc14a9471c4fefb1ea901b10ab29ab9cd49048901,68c72051f0c5d2cf08a9ae44e8cfc5ce68159f430c7a95b52a58b982730075e857c2b1d377ade365558821a6e7d847b1d643e42bb1a8f80ec6227bc107934f6e00 +c4696b39c7f58cd205f049bfd217f2fc56b2b1cae1cb7270bab70f181eb8aa59fcccf6995d1716d4c3ce95534438f16c03a1230dc559e713b149c01fbb0925d1af8b9e7043237b9baacaf1347b3aa74eaf0166f02478f3fee9,630226cd30d76259b5721cc33c5c64e3647cf4308d09278c8df261512745faf5,a2e5128dc2990f5c08b9aac17628f12ec8254c0a90821171e9d54a6c452a466f24199dc9e382235f902e8727f4d3a334af63106ddac2b5298b387841d7525add00,8889148a850805dfc91d39f77950515d292c5b1c0fab1b8a3c571087b7db12636afc70f4f7a64b1c4d65569408c440067485ee906998d47a12334184dd02c56800,f5e43620d68d7abf29fc3e80c1c3030e751978249df85856026c0a278a01fae13988d17de5fb7fabe0b3f21548443381da744e69e3322ed1bee79c797b11b1ff01,a9e52ebe1c9c993b6061259c4d2e1dc42b43627f253cd025cbaac7a0b646dbb96b08d7cfc4b694553ebdf5b41346a53abdb67031b82fe56a9dbd620857890f2b00,3766f8b75868f6114db0c4a7ff56f107970c4df250f678a8c2bdc9925d3eb1ee1d658beaaf94c29846e2fe2a764aead1e045acb8662ff02295eb149ed100089700 +277706671271dfbe4eb6d80fed96b339fde716758328ed8cc4eeb6ee5d8140bd238c504fb7157caaec8924d247555fca1fce847331857ea9f959f9b2f81900ea5d412115d7c6f55025ddc5e96a9ec8c753ef0f074545f9e117,e9f1d49256d33272162335ba15df0972fda46d24c49fa7c4bdbc93f13acf89bd,89f455ed56408decc8d132f2c32e43c014236606545df6a3418fbc8b91b56d36035bb6d247c92fd3449e25262798e7caa0b36cfe724ee786706a4a746c6665f901,0e32a46b18da9fac0174a8c3cd3dc5abe174dbaa4e04c081f4a131e412e875e62c92127b3781d0876bee6c1046435cd382d1803bf238b236e7b7a737d51ea99b00,d5d02cfe34faf1fcb198e0b3127a2bf40a74eb0db5141d8b21bbb1109d2bd6011fec8b9fd50b6f86c1b03fa42329d3c11d4d749f2f37c607f889521c7ce046b100,2f5c2fd7f42e11d3855c72d2a7f203543c109a07ce0582383489a26a9b28e8d9400a93eabf02385ba45f5dad00e548abbede86a303380bef38080bd3735a87f201,78a8805f430aa8937da4bf596c55284b95a9a05eecb22ec21e4b40f65c6ecdc0136c1ceb994cdf1106a6698f39542e24059e969944ed359e1981836c5c09494301 +a332e983b7bca19985ece9e313fd2e5ffb376089673f8c851306a546507a3e0d9e7e6aea32a0430e166cf176201b61b9fd772c0bd1570ee1afcab6e29f6839eed9d51f4345b68043b93ba905d7f8951f8d55bffae5f87502f0,bdb48b16033c77b3e157155b669e28ed8536bd5c642a5b467610ac4b41ad3f44,8aea426d68ec80d1ce25f06dc752844531e1d264080d642ad1d565fc4629155663e26e2f3dc6a21b33957a8eb144e053792567eaa709d8d314cf25a7dcea46d301,325c05a44066a570610ae1a79ad1d87efbfa982e2b1945ae9ffa954a448a6719420b48dee76bd825e0ea35e04566d2bec313b3a44d618d63773ac9f01130924e01,e7970c60f024c5119933a57ec2bb78e02385ef05ae85020c416390f59ff9c0fe190d476a824bc3146670c2f4e7a0c19f295f021d0a85a656148cc6bbbf81b41600,971d098dbcbb9c62b17323bade866529ef41c3b712a524c1a10d1eb48a81173c23f7fa77a3f7b4ab12d37e81301f535a0d7100610b8dfc302821df0169061cea00,11248351203531d0508fadfcff2e293e3fea6d96cd405f07e03cfded3e1a61a3681cc94d75a1132bfefa054e320d8616e39839a0703bf29762e3e23888021cfc01 +486020f66d1a8bb1f7d5617e236e744231706c7717c1e54b8f3491d7e38aac45910f6f2612e1211aa6d4611550a75d75a850ea0addbf42f43aa6b2180909393321cfbdccfa94c60bcff1ae8297fb2937800180370791b091a8,1a56c7be2addd98888da6607e74e0e54c26d5647df8e98bd35eee9c840e27f52,dc42436975f5e1d5528f0df216013588de2d4eb5a6e9dcab6a05286f499c75b22a39318e258318022ff1fe038312a41a038817d4892ae50521713f3be8acc53c01,c572b5f17bad406cf1e76d40ac2c1ae4eeb8049a10064c46cf330e3b56b962727fa87e3fa1c84f187651f109f04367d36a5f36124af6fbdbe95773af2f3da30e00,87687309c618822b332795c62f4e1f5bc9c5c975f35cafb271bdaeb401c067415dfb413d816329672be73ee554dc3675d083d6cc395fbe6fa666c47730eef67b00,73c164691859ac35817e0e43564c0014ec7334a23b702b190c08d7c98783921a56bae952104a5c5943d26743cda1048c7d5ad5f84772427515fefd99c93c963800,27458e7765ff66ae782d413b421c37fc14bed49c7fa0d13af056ff2c0ede32b217409e6ca015a01eac109114d7ee63d8ccaf37d89b607f9312d8ecf200b82fae01 +f617148cfa2180c724eab80a27eebb634c0d3d8e633028eae6640bc23cd40b82ca532044413327bfeb5de85e9ff82e13eb11e8edf34a0016dce64f2e5735c543e259799ef921afec24036a8428949b31553a24319c2c2ad9bd,10b348bafa61f284cc2d9227045534b82bfeb220191c749347e35ece998646a6,0e0a1fbbe176663c3b34de0597bcaa8be96d0c3d58b29b8e38e7330b288550a768781da682c3fbe987096ca2ff5ba30e48eabcf986c9aac562db3df5442dd82001,29be77872b5b046ff140de2c9b231fdc53127239a8eb36d81ccc539ad3d19eb5433e8676f88ca687c18cf6fde7a4a7da45f481740077e61c4cce167db942876700,9771a4bc8d04a4b1e09e48833c771de6981ea373d561bbd57a0c78e7930347da10dde51ccf6f494737c45e55b4e545782f7e91dc72792ce9739d9e9619a1b1de00,01b60ea198bb10f89d1eac827c9eb6ab37b333aad44b4b2b3bf1fdc5fd821862106e5135a4e91ae9ecaf5a1a0f952ab8a1e7f747d7831513c918f04406f74b9b01,b45e445cf4f464d0f30b48bba1ebe7c7b50da06c65a07f5a1c47b6068ec67b4370ae8bf7afc8f8a102e60fe12d107889152fa9bc85322c9a8a682aebc9f793e501 +37da3fb676708c0b2af9ae032ac7e1ac5624401d2a27fe73369c04ba45a1702a35ad28f8fd95516728c02fee502b37348d17d3a5d40cae550d4eb64b78e74225ec7293798c5f3ebd11a89da5add7f8ecb32b47e8250e4abe087b,0578bfca6c263981b4eab057dbadb5350915150efe4b3f81c4293b5faaf162d8,3d6e78f4938381088b4f946378ae7c7a978432e468b2be98de25e3613c2fca2947616c2b2e7be5908556067d80d1362a93c504496493b9c01d32bfa6c98f603f00,49a406d0914d04b9a5373be34a86c05845f27d69c13b86806ac5fa8ab55c25e54ef8f739ef34195f4ef82371644f1a3632114ccbd167082cf4e6505804ae6b7201,d4412c75a2463a9a7e30de3c6542ce4058d44fda95d7776f8d320c5521aeaf2172e28cd7a10e2fb11b224e82460d578c71d563c1334962ecc224424665b51d8001,da1cd8625683f9817fc5f2e68d7f5c2d49fa7daec2d38f9d9ccde0249bf7b9447c4a41cb43dc10158b56cbb8eb11444607cc520ec5fbf5a5494ca5eb07fec18d01,20bc4ade9555edceb50d50a93293dcfa12f389a5f85743bf8063d7be38c6294a5c35db5f093e57ac801803b858b4b44fa7d06c439812ceae22489f56c1a773d500 +ecd86fd4bab9a9f0272ddbb6d8fb562f5a4ec74b922b7517f592af8e07dba4d38f1ca663e322b2c50262f04b08e49e3c5ed3123cc75407ee76c3a13a6ca8daf4ba817f90100e1e83706a94b4a034e9e4fbd0a0453dcdb9ad5cbe,afeda4223793857fbdc66e3f5391c7f865f3a1d82dcbd930a09ed75878b6f650,45dc12ccccceb131692c7d6025f5aa08efc2481291865ddd7b8cc22cb64bca6c48f384778ef2d0aabc98f032bdbb1627c3ab3e236390b602fbc1c8c9314de3a001,c226f7bd2688fa737ea4a3493329ef42d0fe3cee23a49df36923166c4f7c693a5becef0d0fa4ed0d288d5dac90f3af5ea69fa22bd13321a6e5b44a319f49cdb001,945df6f22845a7f61a6f9c7c973d4fa408f1f91c0b7e3480ca79f52853f2f84d53f769837520d9d967aecda54133c8202ff817cc8aace47361775a1c1b1791bf00,f6ea90cabb6f28d796c8fc2a0a08d7384e6bbe57e48de37bdf7da3689e1c089b0f9ed2dc07457029f264ccd526a0b245fe379c765dc3bf371a30d172c41f53b400,082a297a00a955f968664b9724092efe19b47465cfb10e636f968fbb97fd42af2652d71c642d5920441c0b041327f95e68b31ff7d1c514c2f340d0c6677667be01 +a59ce8d64425f422b5d76c708ce0ac2367d6c7ea7a76404e4b74a83998dfb05f851ee8654c68d732f45323f75b6efbd9233ba4cba321c4cfe1d589272dd26103ca46da95143a4019f8c019f397b91e0378e53ef2b513cccb15b8,9a9feb3b387297aaf5f176cbef2faf1418c2bed94143bbcc6e964dde1db6ebc7,10df461d5bfd8fef8b3d0b34eb1c70228bb946aca74790abfe0d13542b42ee887d8d51a998f8fa234a0d4a9fe1eae1a1ac53cd0a0d6155a3d08413ec9f48a5c501,caddabd3aabfe536e4a125e5e7149a7c0e2743bed906ac0c3757f0083742affb662692857b491dc5f4ebcc22406db2f48bab2cff2cf65614948b97e17b25975f01,63f689ad5c31f672352ea74e7cb02ddf97f4c0a184b4c4956b3ebdb25e3aa5cb1cdf0e2cdfd89bb76f64eaeaf15a59020d8516990258574335bb9eae1887ea4001,893817f044a67232e880b5040893d1881824721ef117adbe5082d87c6eab6de92dba3f160094baf20e4f8974cb5eac4b81a795eaa94a13374d4a5dece6399b0f00,e2403a64f88f91df3f60b4569278fc24f167d1b0ca0fd79561e778a1f205e80524d7a1e4818371e029fa467075c3848083226e0ad864cca62ac5a3e98592b64400 +4f31eab6504b2b29a3719a333bb7535d0ed769708fc32ebfa675a982ef04e143a802107bc91a5f18bf87056157f902f6f9064b12c396ce0d4bb4753c20a75cdbd335ea1b960bc62b13b795fae1dd0e56d08353aa04cdb9bd5b5b,3a7d3c8a1a6a9afb3844c501cfcce255ea0e06ae0bfe26d37d9a399a1fee8eb1,73314d03291b9854fa444311257f44a7ac4451ad64acceb63c0763f1e155b9131b21a1326a4d2e2bd81b74d0cb45261bd9336ebf0c339b75611151a44e72e34501,5965902b11cd90ff195f2fd1ff4397caf7ff14e2ba7779e62d6032157b6b5d95439ff653d219ed0d6247be5d9ad142e582d404792b60f3dad3aa8525c9157bec01,c732bef9726ab4776cb75653306feb37e725e79bfc0bb05200b0262d2b2133975635d41d3ce45fd75f30eea8cd91424c51c9be7e35fcb1dff1d90d596594e8c001,1a0adc3f11cbd27d35dfd8268f5055311336df2fab9d0c8f38326b467e2b2286302fa1ae05eb26f8e48ea1e6ed95cec0302e5c9b160bd0e7d3ed2a91002e91f100,69136e1348746a395821ee537f59a334ecd3cb2370c189ba793537f56a65c1af5027f3dacd91ce30b5eb2019fd25494791f0b5a0f8cb9df3f391c9768d3b3f6d00 +a963a1f74dfda942e8f2d84e6e01d567b4b7dded7778c052758e10e09ac5b81ed43ea9e7590b73054506c7a839797030154e6571b514686da6b5f87b7a98c2d03078ac1449c34d579ee3b35cfad52ce06833d2097b3118e635c6,cef0fe2527ab2764bbc6f9d00fd6d629d475e8e12485eac2a776a275ddab6a19,e57fb64812c1db54c6081bcc7909394bcbea67550829e608a52f7d549692306a612d27e435fef9149d06010314a9cbe4a4bb467bb37600d1a2e047158e51637a00,719783e290ef1932a67f91dbed1023d7ada8887ad6c88cc671d53bcffc0242505bec4d022bbd692fb349e806f516c11e1ab43f1b9c49661bed32f340201a77c200,2756bedfc79f08bad51795e07698bd9797aa0473c8c7196afe89ceee40c7c66827a8e446e70e85a6ffdc07325d0d52240d491d25d2b10f7de34223ea0fe2896101,f6ba0836202e9db41709562c810ca23b2654ba0f78a5ac54e7e905548484e1605d5d284fe7ab1a5b28567eb73bb43c0e48b79f10709b32f2faf645e6990e289601,5c51dc640eb531489e704bf4eb2a4832bc73a9762e573f6fe05d637971e46c6374e46e16a2d3fab4b54e26007d9782e5974ac4e35c9a2c575868c11ae408aac301 +5b4d21c1a97f632698bea033507bc629d8cd48d321b24c51dcfd4c5738e687ad495df11206871e6bfe7e9d160d3f6e5918d7811613c9e89f8fa74e260cdac539ce0197183cda36f92a400af6f0710acde1d66a5cc5a558657967,6227d1ae1aae9c79919cc384504ddc2f561e5447a85d0135ea14e2934fdcc227,a2235f30e1562c0fae646dafc4131b2db50ae4b6cb60494804dbcd92678dd71738f6756dbe7fc459c5f9711de59a2098bfc7c2f833c15828ecb26f6c2cbee37000,7bbb2f043ab14baf8fcdbdeb1fac927fdebccc07767b93fe244f359387f3e07841965a330dabd8c0a50dc27f7a445c08fe775fa9b9cf87a9059b1c87cee57c0201,2ecad5d58eac99527c27a0373f426f7a592251363cb5d142cb0817ed7b2fd73016fdcee52c7a01ccf46685d586fa1ccbee9009c52234249f5ad21849a6901cf501,0bcfc43792b6ecc04c5bd2e3ac12faccd58a284be0721a5b9c6bb3423b69426d0abbed5479c07356b1ca9a140905ea0db3dbc7b885d7bc293cbab4472f8511f800,bb631aba7f8f7901dfc8fed0752b37d90a969cfffa22cc0f2b37a795c37230744b9020e6d97c280b0f9ce44fdecee718094ed4cf800bc07d113e3934cda9a4ac00 +95b5bfa3948a8f94a2a1e7a1e518f52eccc095fec05577bbe53f8194a0bc92129c8b987cf5c2fcbfceeb31ed8a6aff70252144398befeb0231170649901000e4b2d0535dffcb658c78f0c741f610dabb7d8e538a4c8578ed0c5a,4effbabd046a9f779eb2b72bad067a47623cd3d196c29f15e0cb710d9f8ce5ff,1b500820085217c4bbdd4711cdf065567649942de83a52c87ed86b0b6d3e3f1b5c34e58efe7d621a6ae63dea47c0f8d3d5d1631fd5131c69c421b011edadeef700,c0da8df45ae9cd562834c69c7dfe86e7cc54a635d3477a73ba60e8435be43cc05724155bf6226db5b56ad413b9bf9efd594b1cc827ec1a43f9db41154704080700,a148dee438ad341b00291fcabd0fb3adacd706556c9abd3fb8803018cd8e061671210a7555cbff46ec9107f995d8f55e0088dbb5ca6db3de3f6324b8c2b79c1d00,2a7cc1192755108cb23ada69525037eb0d1f35c33ba555caaaf46cc92e429345727b02c88f4e8a4c50df0b77c00dcf652f0092c783f90eaa908fc34b0379d3bc01,b56b4964098640343fbeb2cd52f825392e77c860e73fd63abfaad49eb48f20cf7dff61ebbb00854bde1ef716e195275c2d5dfd84a69d8f31b79c15dfdce6520001 +3c6fa556936916927f24c23fb07b5442307732bba5dab4316688584c4caee72e7820e5f5b897a8565905e4934a68f48e10d3c6c7f52ef0240655da2499816a15d6f7e28248febdb1be7433510852430bc648a32a08fc37fd23cd,ff6ea67a3d559ae725854830a57a323476d947f7163bb9fe8db883a33d7e0822,3d8494616f988b5d28ad46503277e877291762fe4e12355190f2b336dea6da884370a71183ba42310c6fe2de4fc635bc14dba9dad1b9f0465bb01ffca2dfed7a01,010b24d70db1e5dc0a5926b230dca564122576238bf120ebd9e755566551dcce2e3d92b07049c857d2b86de3d5b7d81653318c5c08ff334dc3508b193ac1564600,f9c854e2358c8d8772214d86e7e2bca38805a9fbf28019737f3c0f42fc60d40b329676bcd39663d4da3c06a2e0af9ee75190bb428a38c0c17734a939b347f8bf00,e2301763d60430072fb208807ed4515cd50ee3316b716dbdafd7db94996b04f45dc0a8c10861a472884b3cda92fffaf509329fefc996d6575e69056911b2b6f200,149c3fb1fdb106fd3c64bc1367fe37f6b0ed853f845a732c8865795a38381ac87b139f7cca8eca65e123f562cc4d7f6f7df6e36a5793ac2f432a942b294fca5d01 +9781e9b27d0d730d29b6f1b00a0998ad1563efb2f0c6a6fed025b2a1378be2928743e770ac15d5d86130b62389699820cd0706505cc9311384ccc2ea79f9b852f2f26a4b05646d481028519ed06ddac2fd430d46698af288043b,7a20790cde196484bf142e3e2fc269563f4608962a40ad512b19a971b80eed6a,5ca38d2e94de270ba955657dd5e32a956472e6ff3f657b97faf8a190a75567675c329b6f3f1d456f6923c4b6adb2685825b32863f1173d33c35b2fda1cec58a901,25a4cb1f582b680f52d1e439ac4a9932d9f422eba4a1f8b889c4627bba4a810c2e07ca63cb28d28e0f1401ce9f1ca679614056efda2793901d172c8f26dfc3ce01,684c66d77c3868992bb7a2a265dfc5b14b0ee01be10c01521772890a2e32b4a20508fcb33ef9546c04cb7beca3d92dafea7d09b662762c57f1c40c69eda5d5a700,b89608f385df3c86edeea2c4e104b10295f37bff179416f6c24770e70ef2ce69183d9b224d15078256f5ee395131addc20fce327c88b300093a9e66fcb957a2901,1b6471c24691118f3fa32f7f85195889fc1b4595207386c7582ec996eeb771424c5a73583a1706ba4d27b1b3237aab25bf5c4365bac09e9ee47e733bb39d5e6200 +2491ba82a5f632a3684a87e46458bdf1266c588f8b6cfe9466ddc441d3dd22e43885956663a4b401ebc8eb074486250caa84bdcf1d2e56cc11a8828ac958c6f509e1e15cf0231f2bf82bb08989b471263ebea68184a62255b7f4,992c44b6f7ce05ae023061e8042e49f71db2298587027c530fa3baaad8707f64,e018e22bb0af5c53474eae52f9eade10278e7c047101e8c4c6c64c418c9d6fbc7a93bfc4e98716fd008e0957b1f5941910440d87218f549a0637959e83f9de2b01,5a400c26689bc7d68023f1e19ec9aaef64ebecb1f5236765e1c03074dd7b97615c6c4a2dd34dc824f99b639923954acf240a2680f6622ec4a54c29bcd4e571b000,6c57f457e166069384eacbf73455c788facabc5e53264ea80adb192c2a64f00413166a07430bc0ae7a20a336d0d7aa1204b56d27900e5b349b70619ba6f6490700,481350f7389d77b95b5c61d220014718c7d859c1c1c018137ee1372881da320536231872352484fff12cf5c9705c76b6eb4c809632cb475ce2b160bedbb9f8bb00,d86079787ac95773e2d8d5b5f4453b636522ce1af9f26be185ca547d894282907310668bbe2b7e7f76c8682a4b69cb7293c42351e92aa07f43ea8a1d23bac7ef01 +5125f617e3a4075cf1a6cee3f79891e554ae77b3a16feac231845eada8b3feb05530c9bda83c4c2f23bce9a9c20ae20b70626ff851b0fe76cd2975f836b022d0e079d80f07c8cb2008677d72e04f5830d1a09679d14e58842d1e3b,60eca4f755f02991d0ec32c84b8fd891f8cdbbf22985600c3c8e4cacece14d60,98c572aa1af66cd401e12155fee737b5fb5253a6f3d936558c8bc4d38677b4ca5515c778da6878559c49d38aa78b158f96348e34697d0f75910f56d7bff0806901,f408ef1a152208ab1f72256a5ebb4d0d1655b9ca4c8e76d31c789e306687af7d3979f87114a359a55bc2398d437abcc22742b5c8e3fa455e0d0e787721494f1001,629122be751d7fc013b612a21f7eacf299b6c9a26c41bc51fab03ec62ae6ae5a4c849868150a4b4a376123219264ef502414531b6f06cf2ee33d71ecb6c731d900,02ff68f672125eab126a485825d883c1cfc58a0a633019c8f82e5ccc180dc5897d435118c80499f1cdee6c6e580d5b6a08d510c3c3140ddac81c6181992bfb3c01,5f6458e91cbb8e4f5f9cfc56a02fe5a5c1ca98f070e7490629ab2bd278e61009058ee8441afe77c44cbdb9f77ddff36664c0aaa3b12f0a4c6befaa81d691a14f00 +4462f43b3a713fa2cb236cd16595000ec80e7e4f71e0ad361c1aa2dc61f5efe2b3fb3f447eeed12b24951d9c4536f09ff22864cd8e0d49f4a22b5bde30d53a2e3ff32ed3c8e7b09894eee330ff7233b0e7db1aca5e77e4b8544241,51253665dbeb430fe08591c70b2d28a090fea0ff4869d4d6b8001d5bd5e90cc4,fc93b20a52f204733c9f8e5f1d1ee3d6f3d5ede947bfa6a025edfaa39bcae7c14519c687b0c91902a3b28058d59796529a4988f2d2223c20d7a2729ca7361c5601,0e0d67dc99f1217cb8e44b67f74410ce7725bbf78e3d16681a6aacacfb68dcf57863aa86c854daf1607aae922ae787ee0483aa45c465aa02c32bece7626a27ae00,edd2385f41b63f15d871ca692a2c3a693f285c1263e03945b93c83bf9d8787c96c2a8697aac2e2c16feeecf86ab1b63014d074a472dcca9b46a828f786d818f000,7f2946db3725a0a6f1f7b8fbb6d882bf4395c2d43956a22effcf7de5497bfbda3de0c75c8714528c6a959bee27d9103c512315c805ab96b0387c76e2e602602401,4df62968062d43e18f8cc54ca4b624db3e8732d9809d0067e0d9f3bd59c0a995009f2d299529b9593edf12c914770f4ae9def8c17786d2b6e563a91f39600da801 +55af01a3f51a56f6b528150244896617ee0e4c857a1d9d61c45ddb128c1ba699b37fd6a80138bb21d5f7454d82de29cac31b2ad157a5ed4a812fd152ccc6606c3a290d974a0e1fdec288f47840cbb502150d9694ffcd1b6a393400,17807ebd29a284f119c8168eb51cf6ee9b59e9881404d791fbeac36d82f8f72d,18e379f3624f0e30f6ff0496170c6be1df6c4f8121b30346b0969b47bf4d33a070eba57f32f42f10cc3a6b05f2fa70471609b9f7b0666a34a779755afbde3b0601,4ea8f2ebaa0a3c1336d8202b1481391b0274fd9c979ef752757a6b75e852ef474aaba6466ce0813e58f9229356ca75bf5ca5432ecf2f79d499c7016eb6167d0b00,9ed7ebfffa2d3834178b08db35c864615cb699a5ca8742c983cb1577dcbb4ba84a64fb307ce9763f12fadf054f81031626c5a14811ec4e8357c50afdbe9dc92700,1d124a98d0a206727e2dd878f08fd7c2e68f10b237e841b787d653038bdf67fd14e002b87bacc3e52423b0a63863194a6caeaf1e9e363b3d1767292d61895de201,75d7a0b3f382b2f30d736fb62185a2fb8300aadbccae0635aa8da9fe8dbc11fd45a5dc76500889f16f91a107d14ef871cad669ec20352905158860eae17eefae01 +2d7e258f0373f116bd0e5955d2cc25b3b5e3240c4b5834c995d42b8a27339d7deb48c86c467761a25e5cf4f3a794583d7932160cd48b1a8407adfcf7e0d7bd531e8aa6644028c9e90370d980509649de970528e3d89f020f5e8e2d,b39c60512aea9b5e3c2c7777b16630070c088bf144bbbdd627ddb82378f7ca30,e85a186546f3a42876ccf23de58d82d4fecd9f059deb5f5370a93e511440b2c018006b0523608f1a4f364c1d63875639308a717a900c73d503c45a3ed19f6f9f01,6211f92757eaa58a597dfe4f2c88083c6bc9da85ab29eda6969065a10dde322906972c8fc002b94c05896303478075554a6057ece62d29d9779c70a9d1c9837801,50f9afe50b2e9e492803a36d86002e7de39e1424451fc552b1c4db5f8b162398474d4a6517c8c4cba5f3bf319eb98a439adbead8bf70040c3181314d3733f01300,a4bc91d144f8faba9d230fac314041194fb723a3f4500a9fd408c7c17cb7a57d2e7b68e4b85df208e7327856654c969104050c14a9be2511bf45ce6867d13e8200,0f8a8021135414548fd398170e8a846e6334f095a98cfb575fb099e26394875927408c707f377d28790e91b7ebb7824ad8133da4c1d7cd7760d4de62be2e344b01 +5c1c761a644912947f7f58233a15bc1534e75cc42cf0a4f42e50b9fa0b600065b85cd33feac4c4bdced61611f3d5262f3fec5016932c6b828963c97a815b642e62237a92f273151b0e4d76acf2c27987289524a69319956a349644,9ebbb091bdf65de61acf7dc2f4c9ca9c65791cd8500be2707f7e65ffe83ea5da,9b06f222f60097103ff70c8279036ffe760ed52acbabb1acf3cb003bcda1a143056088bf1ba063bde9c317b31aef29aac92d031c1f24f469eb2fc78f03f5e00601,f2907b171c19e87b03ac45b6cae0141ea7a2327e90b8e1429b60a72f67d60b9e13b53674a8e965be38a423742987946cc8d1defeddb9ca47d79f1b1b76bec6c100,84c9df19bb1c998db5cbcfe2f9e417bf358fcde4f14729acda04b7dd60ca2ce97ad8b6c52443bf6de1b09c338f16ff23bf357373cf0a433cb88314a62a38b1c801,b91a40121ab5337ed2f73f09d31937d48c93258abca70d4d8574163d02934d230d36285ea3e87adbe692a316255422f3612e984e37d238bd39e41946129318cc00,cc5110670084f63a0c2125c02123e1155dbb253617c98783f687d8aa3980a6b63a011ff7e7d4bdedf5a2190e367af5d0b33644bd0f1d858703362fb3999c4ec001 +9b8126dfd9ca1a12e3ed09e0c5f8fc30c446eb6b9864ba8e653a9b5a551bcd002b6fe52490613b3bcd29a93122a75a54953eef76d9221b5aae13eabbb7a69d6e750d0fb6694e44011aeb5faf1eb9e494809f3e26e265e25bf99945,3d6515730c1dd6c4c96adf22881ebeb6fc94f56433873be798a4ee6052a8d656,4415ea1825afb78d37a5480270108331043a4d28461bb205f6812477c98c562513e46221d24f5317dc4a112098b266e5a6a7b8404692b59446770c24a1ba57b100,4c62dfeffab241fa03e78abfc7b753e175f25745be6141d5b74461d361446ee51646ad09d21731b8f8ef334429e53bceeb3635ac3cc3bc99fba3b425b2876d9f01,821255030e71fc90467f748842d74e53a83c8be15ab13688285304c72cc701ac0e8b5f7b97911351a59f1dc3af2fe25dd6ea53921ed53d98efa21a828b34077600,6c519997f009fa50bda70dce39cb9f44549f0be6b45c8d212c12284384623cd54b690cf9385cd0f4296ee8b45f5a28f4ead2ef0452360b8869764ae6000ff96f01,88bcc0275c0bfc3ac54ce82fad620221682b6aba340217262d7b3df997425cfd16711763dcdfa135541cd89a536e7b8f7dff050868faa4c700ea077158bf7d1d00 +4051e8b723774ee4ca17963c60e5269600489ea27ee5d0d7fb5f6d018fa46ca22150eda8a7e0a9979bad7878f5be0362526239fc8b057a46b70438503a33d43a4fffd32425c4cdc16ff85f2c6c7bfbe0130dbb4dc21f6b2496d5ca,e45a1742753e4fe7afa7c5887de6b9a3cb214fe0588fdf3501a57ed416ce3565,19f564420f657ee9d4e4c42841db383547125af47b12750198a3a59712ad30a42c4358b09e9135f4d454ed0b067f0eacb8df9033a29f3fa80f6d116a22d65a9e01,df09988623308e1eb68856eeaa6aacde5574dd4265c431044c7a281d8b7e064d697eba22cc4a1c3e9db81352bdcb1de65eaf0e255690654eb47eebca6639a58301,a4ee88507ccd7ebf926b6ff1cba03b004ad626b25945ffbb5cd7eb3b2c132e8c27df4d97f4501625d44902c8b868405dabce2d8685cc5125b0406e1c55bbc48101,e9bb943f0f46b7709e4f2845e165dee70c56e8f9fafa657cf0948376f2f5320525896a570a3e6e0a5c79dd50ef4852f84f047ed7f5af039420bd9d686ff7355d01,a504bef8ae8410ab496301f51636c13b258d266f7859ad94467c968c2bc48a827335f314b0062c658a0823455447543d51d4567e252751820290d35055442fac00 +3f75bfdd07d2a1a42fb9255d2bb43acaaae56d53695656bc564c7c2c44d366a6723fa3ed0676a379d0e8f8e0011e82e18fc943a7777ac14a4fef7c854cf4aac0dda65773b19b8e884480991b978cdab1da7e81cfc44ff749f47e58,d43da126bed14356e2a873d9a57fb3207856b737a0611f3cb08cbcfb061584e4,f221b501f5a2cf9ef5063bc03a0bba6aa1f82717c298749249e1c192672e70783d04a1cf606be63b36b909ea0f2cd060cfda2023eba5c9cfeb6e2055293833ed01,f8bcff68db9f4d3eb47c453b095208f587b0ab156d8698e8982de5c95bdafe9758a02c47a17e090d19e4faefb356fcfde14ef4a181eaca2d65270e19ef458cfa00,1e706094dc810ae08717923256150727df26f68b48caaface4d49fb87270a0fa36b864d86e8d4997327380ea56ef13faa438be4e24c67fdf1340dde1953fd68f00,4e2f1f970c76186be0f8be7559f106788413da660392d55b4800e0859ca83e7c48a1579841123e9c912e59b9d5d19d50793006df90b86a5e6b9e9c151e446a0f01,43e10372e55250a17a5c7131d78ace55c530fc921579f2e7098c5572a1a48fa24653996ee0544e839dfbde4cd11cb0b2b4cbdd7b0c961b76765998d696c4c1c100 +140268696c88521d266fcf3d9a0a931b1ec9e7514f2990ff4b064aff7e70500779925ce2491c8050e8583682bf559d08a3690509a7ebd97aaf6d90b6d3e8b5203ea4127b9ca0318c1e66551ae826e3e1afce8d5e592fa20e648876,f5368a1130b9cc0d0599dc4647c5d5136b29a54154af9b547417cb1f84613fd6,8dac2f286aa6d0bf0e6865905ff8d7cb8028e08a669238559b75299d8a8a4bc67d44fdb795a308fec9df03d3e558d5f157d48f79f38ed0ac584a4363d5512ad500,4bb0ec28269f5877e1fb229f81387c4a6186da96cb468fbc5e115eebb3279c032ac3da08c16dc87811d6a843f9236c239b013d159c4b3ca9cdcdf3b38abf61a300,db65e90df6442b5ec0fb7f3126ce500d164fd4aa6f7fc3df2c11aade85b203cc6c34eadd3c21c683840da86ebd0e0bdf370c1789029cf312091ba219ec91f3fb01,41e8e280e01be9927156caa7ce016cd7975a1e7048218caded996264ae68e9ea414c9be234447c070c35d5511295ca62b48713811d16ddf0adf66d24cdc0352300,e7cd0b6070a48159d58d196c436c8eabcd31e77ce14afbf8c7905e5ed0b975e47a4aea4b433ed26ed02aa779e011418716fa73d1d4e1e2ef6629486f32d29a4400 +c51227fd679f640b9789db9a68ecb2c53d57bbb4ce07a4277f72382ae84300473232cc2ed1230243fcf6e7ebfe9ec1b8b540298b75e543554f46f5d99addf671791fa2c2683065dca95ebd38f94c1d30b8aa52c36a0d598aae0af0,53818851d4ab6c27af9e585d83d43f3c0f9a0149ed019d362663e25c357897c3,9ce17bc6fe8c3db384db0c6d80c2c407c6675563142afe7b5adf725b0de90faf559621ec311760d8f20098595d063eeb5fea8e873d2497d91e1c4cb1e63d82a301,ee470e99a42d1052b7ec21d340a0616fbf4558408bdc115902f0a4f4ab6d7caf5ad1725e2fb71484be07349cee47c0ce865103d438f43c1fe5d76f540bc2fa9501,9a2130342ec907f5fc0631071e987a4eed4d6355bd6e8fa4b9e0a0ad139928a758826c5a068e307b91dbb66db49878499a3a66bcd6b03d5f5f9cb872935e65d700,c73a2d2890555ce63efe544534046448b7ce5a2741768a314df3f3ec028e89124f17d6a98f5872ba213a2a7e0e43dcf28cad49675c38842860131f8cc7f05bf201,0ce93abec7bc9e9e3abf7626896724e61e85a53ce11d011dc99d2bd44d5148e817677729d61beb5da37f2f4bf2385736b2dc3c119738b4dcfd9548b915a58e4f01 +32c23ada311a8db2e0446077fbc0b2766990849ceea055534a6e045aee24588dd7e78d6f0407eaa3b51e7861abf9ba4c4b3acec5e35bdfebd3772503c529cd347a14de7505bfaa6296c5898ad925d50dc3f8f511548671dae31b50ad,087a68da4d3bb11c0d6e01f9317ecda564962472e7f5015cab6790096f3c8049,53104ec88dddbaf2337e4bef52a61071ffa1cc94848bb085ad0146c8a0edf13a67bc96a1071bf6d759e53111d5d38551881b81fea525a88a808de2ee6e20d68100,3289999d64ba0947d02e3cd66a378934f6c0e45df960f9a6ce7a6fe96942f3c2752baa9e68c766e056a5823edc98c35bc81dac697fce8085934d37a84187f15000,254e7aaec0e3e0bf79f95580b1a0fcd6aa61362059212f79787e4d6a1a53106570588e89bfc9d917b0873ba26799e4a807025acc3a951fc5d6dd0e6268841a7700,aa497dc7b1d4110d8fed68f41b94d48e1af904d453d3fe052035bce25187955d0672447d6068ecae49e95fa10d21e7944a835c3acf3002666f2d8bf1c5f8125300,17676d0e37772ee93663b11266b44663d19c35928401a6c63736581ce204ec645200821e5ebe677cf43533f77a3ebb5ef79a1f3ba4738f01462779add68c1a5200 +a853cfa75e893051cb1418513dd2b3dc47cf83acac51213da5d718d1af8d399e803bf7e70508018f02381329fcf023e98ddaee723d1e3ca8cd4b6a157c28b6ac9c4a57bd857cc2b21ee9cecacdafe9b7501c802af6adc0985ad2249a,2c4a53db6170d802009091b9aed8ca4c106ece8c74c57da7fb8924fdc588750c,0b7feab804d627a7b892ed2b9561558a18a8e2d8db80599dafc67b703e2e29a43a88e903fc17e44a116cd6b3c8c36420b281dcb36c90328563bd2d5ce30db9d401,acd13f50ed9255ac5c53a9da5f75f64875bd2694e30db320695f8fc80acd149665bea19ce25be6930412a99f2c299e4986f935821a6a292cb9d688282323783801,9604a55e74e67a179d11578f4de56b797c0f1b32d93712a6713f65cdff407c935e5973909cbb85b813a0e8b8639f83c72bf1b3ea23dfda104fa9e15a0b3f1c8300,9dc2932c5dfe903b46f699e04dcff53f810a356716e3a6bb882cc91b164040454e81aa35ec85feac516a761f8e14dc20febe9981d76f4d281f4ef66ca06aec0500,4956844c20d6a013529f62ce3a7ce8eee0f7a2a4ddf9822787e23f73ca2a1f852701ef902eaff36f3bd7111294633cf2ad78d31d8b907aeae99f0d1bef30935500 +f1bbfb7197aec62c2acb8938c56349feb53c59a9250763d3e9ba146261e55b7e732afb93c2c0e9f46dca7e21ef5fa59d9a6f15e08cd987333c21cbe1a66ca8094b42c08deae2be2a5d082f0d4716b90f330b8c12b751202dead5018c,bb8054f0a13edc20ddaad1a85a7f7a705c19b34160d9d1f04dd25b28ea8445fd,b03971b88975f18864b794d3d44164fe7063e1263da29a397a437a8ce3e4308c4be5bf5346581d511c8966f84580a7f8c2965dd50b1120521af690b563c195b400,41602a73a653e94c1903f1fe4d3024910ee31ee460302995925339a247358dee41c6ff31b7c6ef8af05a24668bfd4f0fed922ae248a207d01e968ec7e821684100,be523d8c14610c9db12d4e7a54ead4b0034f9a9ca0bbec400bf5e9dfc3269eec6abcec32cccc7cf1bc354b8f25ee5d705c3f4cfb1630e349065cf7af8508349f01,2028a6f7c1ecdc6bded7616cc04cdd6c74abaab8a347aca845aafbfb217fe08710e31c307a7d90ad26c3fb9f7dddf2d338cc5d891eb7400affd07925de919add00,63f3fb774a06fe5d464fbfb4ef7bb30c700777f40dea99490d53bb458a00fe9b5b53fe264660b91d89b34864377341b565ff527bf09facedda0a39885650ea9201 +05735f9227565c27a60dcbc6b5325e7dd5d5d0f4c0cb4c3327df70231c1a590496b34565f1d4e955ec39529ee27522fd3338561d6704db16f2f8e9213ab1add6c51211c06916a3c5bf4011f649d1c7544dcf4c98b7e8f0294020a5c1,084ec5c7dfc1bc85560244134df92faa7fdb42ad0fd8cb2aaf4c69d30f2cd28a,3b77e5d2318754d42bbdd7f382eeb5d19dec4dbf47ebf01304da26fac02ef6056817e181c8a61061230ffa5a7d6b8b93d89db58ab38c2a61afebe9306b6abf4501,b77c0a076d3bbfb286e055ae06a11952fe2eebabed7702a11436f8f3e863db59675d61ec813563a36c7a5504cab58bd3986d634d74bcde3806d770eea68e4e1e01,4f1e1f67453c2c2785ff3367156a1427d71731557aa63bb9cd296128a71aa89a585684062a86df35656f46e5f49e94f1e687256322dc53489a7f6042dad0962901,27a68cd44d935a7e81cd229414f37534fe4fd9efb17f976f74b8897729099bab324a1e429555ccd83c87ea90aa1719605474911ce1d62baed9d0de772a1a536800,342b8f1e1d614ce17ea447120f8c75083cdb10680682ea9e7011cf00785efca418f6378c9fceac88c76ff652ee519a081403f3b23cdc30b637398351a966502301 +1c99ecca828a03ebc2d3df952682785a96dddbce0ebe925b5c886f15746a6fec6a9d245d7953315129545d11ca0c012be508f0479b85b61d7f661ee65ac3674aec7453ae5d3c3dd054c74ee01e36057f8bf5218c0347110fb27112f2,e0b9b5e1c722f1fb71cc2357a9b13ddc22e9667dc113fc47b5a1adc99f431b03,7209a70dfa2e61dddb8375f2391aed2d8c958d743f0929b5fbf96e20aa5a13533dd546ac053658b59c1ca40d81bd9454354c243a102e87199a3f8bf814e713fd01,85879fd00e16d7ba92261290c5be3c176ce1908570a53ea568e3db01c9eb8a5548a25adcfee4237ee53fa28e77879972b4af4aa5ae6f828a1f0a39f1f573b59700,f4d8d7fad26d83f9023b832efd04c67aa5ce590ad7af0b02d063296ed398f66a0fca674d1413e4003cc80fa13773450143bdd5d59761c4b3b362ff4d071f31cf00,cf956905b7851dfe1e58c03103e73b2b66c59bd2853c3f9aae05d294edccdc90531010c40cebeb47434ed37b92267f66509ebce480c63952a2c7a2badd09f74f00,28ce951a18d433babba52bf34b98aaa7180aa01c8497e8042020d93545f27c1824d9e9d8acd6b51e48bfbe215f85419c1a0edda3c34964536b832690d39f979c01 +d145a79d682df6bb8a68570ddca246face49abf35a0fed1cb1414c56ab1ce1b5ee91ff7802f82442ffe05f6a21fed62d8f53fbfbb086e28b8b3e070f65fa53be968f3f783fc0b7b7a021e02f64af068d53176518dff2f856cda10890,a8c70766a7ca6fba97291ab6f1eebeed3bccd4733f5dcb89cb83f3cb594fb8eb,95b7de8d127a31d65230f28f3100f44e93f840dc9dd1f3deb9e78bdb8160d3350c8c3f7653420529f86e86f577e0cd6aa730f7891d799c52626ab5b899cf5c3c00,7c654f2d1dbd163907fc51cb038a42aee7a3dd777f14113cc377b1627d56aff177050cc78afecc20c06dea4845ffe4600ccb20c0bb68a53e4c971771e7f0dd0d00,0693233cabcaf51a25e2554f12573fd8e873946f6189896a8e7058963f3f1067217253707ee11acb621e863fa89ff17f7452103f6d09e4bb27a62b6e0efb272801,9c99942716c315eb9a13afb2ef50242a85d54da7e432b29473fd1583a5aa484a23461a0feb0d9606afd2dc62761b02a83d047021053445f69ade804ccf4cca6600,4e82139a0f8293b292a0e75b48e0c5475b64a46dedb32997fb640343275338894b7071c9e6a8b83cc1ecfd7c83fb6d9bcd18c2d0f09dc940925bb77a8ad358a501 +2237ea4e93cae1e0beac436e96dc3caf9f259553e4de717c4b1565083250f5cbc7ddbc576fea21cc7cee2b5097fc801df9d6f4cea6789da03b13afbf768277646154eaa6302e405f31ed78013d27fb93a2c1332d5716c8a72f72994a,09624a23b985607355aeb2b28c3dcb7c3c0f2a0868ffd31acc859736eb7eeb73,7680d4c2f1c57357c6aafa3b6f521098a8347d8c05b50bee0141eb0d7d4afe0e5d9f30e05bf6c8e6a9cab9e3c40d600eb46a56e72ca4d2193ff6f0936c5b59ac00,d3520f87fbae07604a394876f19500febb09384de36f9791e580870a82963cfe03e23c39040028e5df4086cda9baaaca38bd6879cb02910fa8657a5f43d65b1601,ea38f372e16a0c01267239dc4c6a0978818988589aa77ab02f24636d7337762b3517d5e61f7fef5f42e3f26b4c65e8e524ab0eb3a3886487756d17027abe2aa600,24a464831f6dab8da5ce6141af864aaa22a30a591dc8c36cc46131d3fb7aa3ce615b41f9e7472b12c7059363db06c62d7aa04e034c9f85b1fa028290a3132f6d01,dc4ea1197362c902904dc7bd2cf8840ea11d05dd2e032614d06577d3d9eb7d984b21dc05a692c8f07230534f2f826c5e15b268ad66c734e3578207ab2d15dce900 +ab6505a2112116c76f98f5c94e40cc7b436657575f91a59a8bdf71fe785e193e05eaa44cc432a8f22529d0c13bf5dac536c35feaa3dd41f82b842baa1823b590232932f6addb6a2eaa5a647a27d1f8ca66dbc650cf912e666a96f955,4346bfce279372341dddad3a5b87feb469ef08e887643a55414aca63417633ef,ffed693306c341d29340c68c39f29bfa4b4351e83f3eab7fd63912fb1178d68618085f83e8401dc436ae2d1ecedc065563733cc5559b2d5a339fe6ce02a1bfd500,34f5e0ca900b4f9d39c0c4c63ff346c0ebe2e3d6de7840d5924b22bb51bcccc7400bd7b90001a7cdfaf9863f26d5932415b7f07875674ad1b471bf78f723cfaa00,92efd73fefd6734eff1996a6355f22d7ac3e4698a7f4bc979dc1837ca10540a148c9ce8c3cdf69a78a708d011302a79a1d79326670153abe192c62b377ec12b800,12663d354c351d2273252ce436266b7a7239f21dab5c49eff1d63c52f765d9bc42981fb6bbe1d11ae0901be868d23accebac1ed557532dab98640032042644d600,1347193d1b939f6322bcce3e53cf9331bd378630e7b6bb2f7c02840db92e9cb14dcf279c2905270cafcec9b32d82b3036ef4236980a90a2d9320f7f6b060cb1e00 +f45fa80c890c87af907db73f9166aafcf0a8d29265329e38e32cab9fce9b25dbe511b5e959bf222ed0c069afdb598eebf9b23c1b46ae2ed45121525561425a183ce9c1ceb5f420f7b92f8cadac5d9d9e2a8679f80517e0894289008c,ce0972860c5e12fb077acd41b04161e71bd89096b35ec70f22698cf93da04b05,e40c487b85f21484cb97c25b8ba0af96e8c0118d604df8c44baf234f9f03001d1d4d1f3c1d767fd099b22aac2763147619542006a98284e80e3f9d22403034c600,4fe2f6396021b7c30b5ea73c95038a6063d7189943e6d0320901b7e5d9537d236501ee0e3f6cad49fda7a634a7e7b23e7ee643b59724b30f8720a146c8718d5f01,abf50014a9d0675b191cb1fb3bdc83d081c16cb442bf4840fbaca6b60e1cf0e02c3595f6cbd18d585cd14cf3186475430073270d77b59e4d3040bc12fe2bdeb101,53083dfa9d8930eaa391494432c1cae0397adf7bc72b9b534b19e85a8066efbb11b229b870fdbdfe8a7eb9132776648184f06e58f3e63b76bcdca4384f95109f00,3a76f6c49a10afb05e3ab8909bc167e66afd859966a4aabc2344fc0c5b3ae48343f96c99e9d8b47a77e966d08274fa00b12f7470682db2bbac1433b05ada202e00 +1a67b290b2569edf35da9122808bd0cb31ff2ea54006d109b165392c3bf0ccd4cca48c64f5e172e8b0ca62e27418604cef5df87a9647d0ef13cfeb8c91c41015b20ba83053340ae72d72378e23768a2c09e4c014aa116a56a7d13ae0,d34563eb1e66bb8f4383a70489f5f9cfc40a5554479ce3caad289f085ec977e5,d664d508c3ba1ab9cb87b5bb86e5c756c82945b942ac89b1e322d82dd89b17544168257ed4fc83344fae45d5e6b9744ad04d62e856b0a97098b26ebcd13f533d01,0e2fb73427142f4adb92476dcdbe996f94db8960d5a6a24dfdcbbb88b11558da59d53d00efdf8d737db1eb57ed69fab15458496479ffa3b7d67f3d65042aa39801,16796ffb54e351b374c5ab5e86b6813acffb52d5367b4a340d951ec60b1eef7444633c17eb04c55d0294c7266819c29739ff0aa1ea36224babc25e5cb08ebf1600,052a56b52d4d8c0e3bb9e1ee37b0562486c3d70e35987e956a7cf721871b0a6511addc3ae8385f45fdfe74e3e1f6ec317e98958e7ecec2da969eb66739df356c00,8ec0ea7cf2edfb89a9361aa760a02734a0503facbe3d82670a3f2167d2e50d27599944008bd2b79d293ade56eca67acd3ef4dbeff9fc997cc2a2ec4662a3b16000 +9809a30cacdfeaafb33440e0154cf75f4bde146fd5a665319768fab3d396c140066d8950036c8c37791120aa099f9b78b70831bf5b605732ddaab6d7b53c174440d183af7f35fcf31ed193a99bc6ae071311e4741b5e24f1f9f6b1afbe,02f1d1ef1864f857c785ccac04635fc7dbf4d4654b33aaf5f37dfbd00369e8d5,cfbd8e736034236e6cede59b49accfa3b5b92731e9de105ece1a12d71f2ba65956527b0f192870a8e0fec15f2c9f3b69b8d73ba617c3a2c09eff030738a1ff5000,3b3927e8e360633b948e7be379e0963111a39d297c27a326209617bed7aabad7162b2e0f600fc0a956c41aa087646a26a2a3101ab12e51a988ac4627f48c414501,f01aebc91a0067567d6950aeaa74310ad5cf0158ee388141174562addad61e031e534124042a89c93fe740d47f962485adc76755562e9eed9b5e2be972ddd59b00,e2b0fa9f2421f79c6acfa0a1d190596b1c843b5c947a8337ac773e4a9e632d3d335f1597fb217a052558eda70b721d2f5c0afe2d4560b4c281f36ce9a4ee157e00,735d10efd199cfd0e8478a9c21fb90925db64adfa6d0e0ff729e38843fc9cfc0482930e21fd1ba0a7d692ea91886dd9c839a1318a884c6d387d93cdc6faa1ee100 +544698646446ee1ee650ff959ca919168bca84ac65f53c79100b9da4eaf87ea1f0afa87264d0b6689878ce70ef6f3a4ed55bfed7bf1b91557ed86e9293fc3bf5165cc99a1c83c403353fe3d81fdb633f1363a5b34621bb8204c4a85dd8,dcad5450f48f9b33b23ef79fcfd87025729541d9bb5357889f5f42cc4952d82c,e1b42ce7a7cc7c7fced153f05a39dd9b573eb725a95fb988f82d914273757a451e3a248fbfb17babc21c9f8a8820e28a30007fa128a8d44fcb96a117638d020100,6b41e365467b52fc73090f42614e9a04dbc4876f886bbaf23bdc1062cbd0926d7dfa8c5acab4404efb876ef638f6ff13e515b895b724f8549fb1ec9558809df001,ce819c8d4515be61982d8971305ff630211ace85e74e355a556a9c1e274347bb16ac59176257ad1201b049024ee25835fdc32cbeb4a8e6d612eefd44aecf11ed00,e21e72e7ec2bc7e88f255d80799189fa0d3fea24cb02ccdb0e283e30867600ab75069aa7ffb07ca1f076327e348b098c63da9cd0326eb53784fcc7d4b8c6c23f01,9ce4c826b83fed3d8ba8109226b9b9337157396d494af1f1eb2ab326c10bdd6351de284d5e6a0e161ac1464c3838a55b609c70324e7a581c3bccb0cd0f56927400 +854de88e2f055c146e48ee59e94f973eee694f8da34f99a0dd337c4cd98118b856b389186d39c78b3a21dfae0ec54728841144dec16895b39952c570df8d341a152691ec41d527abfa5984eacb815397a96fa4d2bf1470b3e7f685ff68,39e657edfc0bc16dd33e507f76c3d2e8db1d1bb75976942ca0d7b73be4356cd7,2480b39b2e2df265f74a0c9c14005eeee76112b4c70ae65b7fac017a447c73ed78f719a2fd8c7bff6199d39b77b5cc9ce838a36529b0db729bcec8105201a77001,d3c58c07b0d20b8ad27b63c13c9dae18e3d487504e939db5ad26108896f983414c775b745fe97a3abf02ff5874c12babb900324994dcef484bd2fd15b99bf8da01,24bec7a14d7d6df993c13ff67c24a88bc29141358176638c253fba78602bb6dc0c3f8e02e516ae9e647237e429482fe5a5be42fbfa1e663e16060a6b9171c68501,fcc0186f332cbcef45977c1ca4d1493c3e239fdbaef4797f0f10fdb0d78ba0d30468fd1db78acc84d3fe1aba8e9273a16b1eca5c82420615aa3bb59f6377767300,56e780187d21d354bcf4acb28ece823019fe4d19158d8a9e91972d0575fa0eb7055377f94a294781cf369b7718e7149fc206654f6a5ff08964974e15b2161e5901 +2140b594d5df06492ad4a582d64a7938f5a437adf58eff21a4e1b5708a2f486aaf14e5c8c16eb12a5e916e142539ec124e9a530ddde0e0ef8f50495132c1150a878c7c181128b97a3bccb181e7863fcca75be1e8154f73110216911608,ddafcfa400e77475a0a51a56d9f1efe18a7541783887be6f0c252c176827af9d,1e8b654a5b6fd286f8a51a8f13294f8db50ca40ac327812ffd434154bb8af8d740b4bfb886adb1a766905789b2efb22464afe9636632fc9729850008841d374500,00e4eea21b32f58ef3a3f673a9a59c53e97c819e62620e40f4ba218874e2f2c05cf4b778a9895d3f6c8d3f8dae0644a63f63f71610e7a8f64d3ed6731fb665fe01,4b37bdbeb840204e3471dea96440e84c05811ab6cfc82433e6488ed330f87ddf0944fcafe18b90c8a238d5f4b4375e163a73d419db970d8bbf6a1944e4b15e6c00,45b9262b503c24b13fcd0a5dda36cdc6647cafd4a7b70fcc7e956bd877d859bb76ba870174f11f0fdf6b7f42e33a09761143a69378155cc9123fa29606c5378f01,d99aad42f504e89af8c63a9935219b1ded4e6b36ddd7287dcc6c63348a98705224b4325671dd1e32bb59d3c35e0451016d766df974806f46609115af1b0c2ec700 +4d676e23abdbe55dffda38e181ea39ccdd912183a3e55557c907310a3c3553d0a815cd0b1294f74f074f5b458c713f558ac8cd4bbe0d7b887aaa9a063f106033050211bf63a1e38dd79ad2523f56352b530af45e6f80e0eae69781388c,f0c8036b1698cebca81b3247f540114ce4a4c577481786d47ebe05d29e580e61,da2171653a73b4fd784596b3b265254ae86b9e0f3717ecdc10c52ba9a9abe7c9672bb1ad4d88bdcaff8464530e5fde089025d93043cae0f71e8426364859899901,cc819310b2db69e22337da44601b4ffe089402fc3bfda535240d17d1ac97f48c33f424e72cd2d574d398ffb3575b61463952641b017141076b4e64ab13fb39b300,15e649330b7bfb8758c3ab96bde465c39f82b46df0ba477455d57470f65bb38d4c719a1af565517a1cb15b2eaba59ebe0b850d9738677405c4cbe0c5d5e13a0601,02fd7b2e9ab3b1bf066f0ae969ac3f37c30502ac0d3813def1886539c0d5551e6fbac3e118e481af4eed6e3860c25e246d76ee85846913550940a24e74fb8fa000,4bd4a8b19ba8bff4b2dfafc3a0dc7141b4e042f955ae8b4607a147ee96871ac453849ba10be7ee34bd587d13fd7dd732a79c27c79f9918717cd935c9526c418a00 +9e5fe92590da9b06f803d49adaf57f4896417a22a08b68a233d4917a42bcf918903c81ae76fb804eef158de628a9366cc63fde40bafd61e9a85e0d3ef4957ca01b88639e46383f0dbd1dd40cbf993d27c045935f6c01d67391629a5483,62be01258706bb38cf49ca88a05cbdacbedc460c6f3b5c2b0ec7286afa4f3656,cc512146c0cc96ef5d7296bd645fb37015e93786d6411ce14ae20889cda67dda43bba43f3318eb27db89a6299082e49d4b00ca257ba494d067687b4ffa5415ab01,d65eb1f90fa80e22eaad6ee7f3866a67ed632e46f518be2b6eb413147783395d7612ee31deecc5558b304e001fc8c7afcccb5b08ee23b83e97f6b35f9182597c00,ce34abc24888c2e77cc66479a140213636fa26f543157ab584a6c4738fcfee5d4d7949158123b5912e30ee070e611831d5323759c872b957c34a8cc696ab0d8300,4acd550c597f47dbda794a2f5088612bf6401880f099fe6364d4c4dc22648b4517405437129c8a8f341dfefb39f9c5e8865698d30cb48bb30c98bd02bbb0f41f01,f3fc8c763dcc17a31bf38ba7f7f8acc3d341fd1b788830f05f3ce37992d141f51210457e99e69020ada6d7cd2b37a0e1fde6fb53f27a59b7cb372ddab2108ca301 +2e7709d152da7cb66165ca0d387e886aca5e002ec277b4e065f233023a93ac102e825bb380915b7e909d15897e18c7e22dedd5afd0cdcfa0d1d8ae0704458cc0b69b938f9729b5ce2b9ad65735c646be54783d6b3e6a9e03e05324f1a3,b5316f388260080e7f29d60863011f81a959047d388b2f156b688db6d2e029f9,47ed11c5137331a7260dbefb74df44f57e1985151584009a9674fc5bf9a973055d41a1518f5bd8105eec9b2ff69366c45456c4b1d238a155146315100ca058eb00,f50ec186ae444b2f0667e96b7850c71bd21de29b08546764dce8dc4f5c1cd379434f13e58f632f64e9c7e173bffb7fc53fbc88d04a3158fb3a2a17d0551b64f501,417392641d03cd6353f54402ab574606ba86c36ad9a17a6fb4747c518f87f5aa4be68ba773b82eef5580275a214c7ce2c6068733326e6c89a6f57894b4b3b54101,5ae0d2e805ba543e7524eb2ccf8374c61b94434c356dc5d76c8d1e862030ff1d392d3e6a5bb255e2b6630262dc5836e772054a3ea69bf446d4a56714497fae9500,bb8f55e191094bc1522049bb318c8c31e392f757fa7242418c344f0d80fba91136c301b73ac0b21f092aa74ce44c4f532ddb75c7228e397c06537cd2ea8fa7ca01 +0e150aa5a0613dfe03e62c31cec7b0f8b175be4fea0ae8701f59b48f5de764be3f52405721dd7a658398d808ae87115bd66e7c4e51def9913a6fc1eab3b24362c79ca257d2afa452141f2bf790eee265816aacfdd85ec7ed62a5d42388,b7de16c89d44335dab261e67d59700c4d8c1fbe609da3bf83d60341cc3be1208,3ce270141ce2a5b39280e45d4d59a5a708163c9ffe486bb3d24d5881a41e71310c3ac15c2e7d2f75db2d3f4c3ba303aabe45daccfa81e739041c6ace00c15ca600,eb6c325ca79094c5aa1622ace4588e9b9612c2a2eac1cdcbd215319079bd5d93641202e943e87410c4866b76043066d466628d4d03c5fc1ad0f1d485a9718fc300,fa9723420f965bf811ee92e4325dfabbca584e434d13a6e37b4a1e8ebe2fcd9519f16fab9a7ff6b43e342250bf611c9055eb5163fd9b3506a15f453ebd8a55f701,b3cf7144ff01965ae1313ec57ec196b72eda40a8a1df2610707f213f9d8c7dee2a82aa1c8fc8a0ff5eb285b7b8f30b6e6c669f5a059e909ba3800412ef81b23f00,e69ac39cb4e2f84198333b8641bc571ae0bcdd84f831a5782204a5d30b3879f324980829235fc37e86d93469b637fe9dc73c8f28b1221acde91bf4003eadabf201 +932e99f43225f721062e016b9f24abb535484b7579134ec9c89937ec1cbffa7adb51676cd3551881a353cc31d247a26632f3b0ecfd911479f1e377084beba1af3acfc12327709db02bebc0c8ef43a7cbe9111cb66fc238f4ac9da39dc6,597cbb91609727194022e92057fa0e3a330fe5ca1aac26561a830a957b108c02,59baceff4066cfc209a70bb59c59110be9f4877129751bd5a730c083fb1993a341a1d26fe5c0bed6354bce6a79f429d1417984b4743b57de6d7e0d284345addd01,754a92672f36513d3583a924c8780ee5a0a336c8751f0db6ffa1093c796847f357fac90d526f826673ed5af877223cef4ce3692e74482fcf85edb972bf0acf6e00,1c165dbea8be1750514c02e37241d7fb6d6eeb5ec231c27a84285b1cc7d689697d3bbd7e8a232a0cb542790dfa0ad09750b3e4f07a8e8baa937913bc8738cf3600,606b2587b520f52e8de210eacbb6f76efa54711bfe69711d80a0d46a9b263f3124a19dcba52a57f844f8ae7f1ec4d82b421a30ddda457c8134622ed22856230301,ecbd422743d1001f09e7a9493e3f15833713465113e95c5c838550048e5c2ddc5a281010f2d7d38048a9562262cc24d62921b1ab64c384ff3193a67cc680f50700 +920a80b04fdb27934bee965b0b7029546dcedc5dd3bb06b4edeba769afad4e7dc48a0624831cc348c96a3a9beb8f2f8e8eb30650327d0cd6264793192e8f9afd73300ae7c38534b9e5d0a8c36d58125a74623bf2ec7ed0c2d04fa8b47d,d940831e8b95b978322b6ef1c76923b6a7807b2f0c46fa5cd00be81ad61e9491,965495120a005326243b92020e6f4de96230722f0b802ba02967f8b083d0ecb41686c2230f265bd95b346caf4db2b208d7d6138c586a0cafac0ce89072c5059b00,058e293bb61d0ae3b993732a7d214436419f67ffc0e7ba930bbf60e1f703ccd05d2ccd2f29202aeef46c0a680fb98065cc4fb333d697cdfd8b447728b18258c601,4a4e5b67faab27bc2565794848d1374d1813283d83971dac7c467552481ee1a05a7dde8e52ffafcbb212043448e5125b271d6f3a0ebe58167432a4aa2948664500,51535a8d08e0680457f8b89dd8ae684fdcf282bdd95838ebff335b4d46e309c54b7951abf1381860b6ee03482baafa748565979742cbc04106e7079381ecf13900,6097edf2ae7174b76cb7102dd7fb56dae8c09c2c4309e3055c59b7dd630fcde9375388f5ce19254a9326c1b3fdd0e232806e0ad19956f87bd08a47a32fcc77d201 +f8096d33cb0f6891af28e741953c1d5788912ff5fe9c174f69accdbbf295271439ee0580b1bf419a28b32f7172c1c66357f3313873587b2bfc69a5e4c30defb05eae8eaafd5b4d38da5c567327556715f4e32a82f84d2eeb61315d593f10,cec5c5f2556bbeb31c3e3b3711e3ffeb5f84c690d7ff84af2a7c5cf11b63991c,4ec7305c8a4a5cfc9cfff11607e4edbeb97618f461f4ea30b72857741178092a10226791a95216118240c1a7aacd75e3cdb5ff3b7451482e109998bfd984fe8900,f79029060af160942c3d1cbd677eafc55e73f65f6d67a0ce5356ef54a13402801f837d301128d5b25c2d7d7d8d1ebc90dab4488537c5e547b0bec7452da8414001,df9fcaf02bd4ab1e6f44ac49ac5551c916fdf56acdc8a5fd38659649a490b4ae28bd80b7ab149e0d1f4d99c47ca9854ff71d642a6c37822c83889191cd5ce6c601,ca795b5706ed04630ebc87173dc31d2aac411adf31f0e3befd220e43acda7a1d4c257ad4b06aabf2dafd560c19525408e945b31a926185b1cb25b3e39ae32f2f00,d3b8a5a7022ecb9f763a0042a9aa401295f446b98afed23348341af0213db86307913268a6aa49418701ed341d2f8120071ed30a035a3c023bf8ea0815d82cf101 +6b2f4f1887058670993a2e6e33af769e169cb8ec9cf805923b50e169ffd9996192917d6a28cb22a60030567c6a1995f6a1ce276aea455fedfb38c1e203b7da203f5b9384cadf89ca9b9f2c2d0e887f62484239b59ab80a489f806d9ef5ff,aaba9152f950fc8d69bdf4c37db5eeb697885b38475fa63315d290651ee64cc5,248753c41f2436fdadd93fcfe2d26a7d132306e1ad1cc2fc453caf582d0dbd503c159ed6bb59cc1cf54405e3a2a1dbae30537539957d356b6951090155ab10e701,74f40b9fd4dc6ac45b6b23ff80d144e3be0801323acb5e644ba293978a9ae4e764c0856f9d2c4ab7a28e20a10d31c9bc44cca48037455c8a76a91c1bb8aeb7d800,0d0fc786b907657ff92e4dce8e279b8ca15f62396f56f7bac685303cba027af86da58138b8f9916edd8cdf5975a4394190dde3ab0137c513263a0f248652e41701,0c399ba47b8e0a823a44361cee05a6c55f7d7f59dac9e9ad569a9488618128f137d864a5ccf7098b2852b38f877a79fa7a9fe7a41eb2a0352c7e032ed9f64cff00,0876e53f0732a2dae55df8ff5a7f8a328a0f82fa55d508c16981fa9910c44da514e9cfe5a4b15f02949c687f7f2b50f01ebdf8eb490438092f57371672b6452001 +9393cc797b44491bc913bb169c076d99b9f44b057e917d9fdafb400cdb080a7e9d077ae88e8d242279abd689057f4a69c7f95c32519fba9c26f13eb544beaaa9a6b996b941e97e0cdeb3e19b3d4104442f22fd3c3a653cabadb69bda88e1,4401247e8f9467c9772ac72411113b3270e6145563e58620fb348ecb89660110,dcc014059c8d76973c4e7c0c9a4bba93d241240590d0e7d35b9e5f7da999fcce1cdaa30fa24ce54754af1a4e6f3721954b171ccae645f128ec8a76b99522238500,d6fdb15c9c124d35145cf849e60a64a4b8f37f1c573f73053892cb2f2f44540d3577c6767fbf1d8c40e601f27fcd9015a244365aceecb83084bb7df3686c0f0601,0d0718e57dc37a391707bc4e20f3445986767d291b46ddd6b36e525b062faabc76887c23bca0c5dc68ef3c3bb8cd6b9207fcf14cb8c628d5150de2e08513fc0200,1da9af10542fe4d1d3801fcadd8b2f1d79a67ac1a8d3c608163ebfd93245ed607d91d6f5e1c44b5a74e38297de89e0b746d3a748826bed0d11a4dfb051afab3f00,58ca91861cf18acf269752fc3cb4d4df0d9051342cb79b4e1a6d789f999b6d0677e58bac7579cf095142aa10bd28298356c4fda6f4700f19a1839c34370f871300 +51cbefba3e4d26748fd1b9082d583e292c4a9db0b1a6186d9ed956a86b5213d9532fce266d427bf0d6c7cb124be6427c86f6f7a8751372c8bbb7db0d8d9e569c5d8289d920f2d7e3a8a6bbb322dd7a588c1613f84c19575d6fbfdcd18e20,330234822d3ffa6d6c1a0eaa8db85e8c16390020ed892917a42e16407b80bbbe,b3e1f50fb1700ad47fd2822b6eab865a7bff7d761fc21be17212264545642e3c3df2c9dae4e7f18e11f93b2a8df9857a8c5b3197a82825bfd6958ec800dfbf0600,02e38a916dcad9fbf3c12749b4bd481ab59f659beea77a748a64981930463fba78c23b9c00a40134058e829038ea59b7e0ec56b8cd34bfb65155c70bb1b33bc901,3097efd241ea11245c55fb4a2bc22ec84fc7e1d080f3371187b14095d0a3bb9e7b60d2c12f878eda8763eecbc518be4f4b69d12417f641230d8bf7667214b4e201,901d60c462fe7cbf1f7559db0fe2f169c69193498dd32c337e2015afe249fbc67fc40a65f97f22e1b5e4ed5108eb90892d8c7e0c853a4aff5c5dd91d4f91e20e01,c92822373be66b0e0c8b4f8fd36350e674f864a62b279d2c4fd89c0454e897bc7befe8506580ca71840c054e59670549c2457160b59592d6a9f4f3632d2e7d6000 +bd4ba8876c45fabc3adcff11dd6eb7aa8fd6e7125b51091882cdc008814c4d9c4eea6903327dd57ee6fbc59651c89b0d49ee12fdeb43f6a13a1581f61a0e0c85eca69a24eba010015f1c8448f3c087049c806774f55a4d813c35c10907c5,cbdbe56e5eda116b0347c7a48f3101ff544cda6a6ce77d52a574364227038a62,68e4c0ab4b5d358d37ac503d6fcfacf79e8bf6dfe4f0805cef32874beff20c310329a21507171ec9ff3873df29b0dca8a3852e388e58a865667694cba7b52c1e01,bd8a363aa89fb9519736487aa34960e437c420941127997cf5e21e4aed22034e7083490ab6bbe2e30e2c5383416d305736f5823f0c5060ccaf6c39ba874649b101,05ff4fb2aac3c6a37cccbdbcca3d05028cd5eee005f03ebfabbfef6d1eaf1aa239e9669eb4c936d4ab7f9720d8c5988284b2c67394fba8e7090a9c3dd05b386000,abb7a1d8c231505a6110cae47c89b34f62a61383e14bb81319f67b6797ad35e63e729afdeff418ed7709e0e7d48faf2899296e0979c7d8768e83c29e1c5c19a400,d76c67ec1a9187185a68c5b5269b83eb23a236ccdbabdeb6cfd693a91a4b78986965b50f2e9228b68cb8761e78e4ee236b4ebe8320da538e8bb876b284adac2b00 +bc4a227d53b15468f186b60b5ce6afdfdf5a7b7c095ead6522f776cf8a4fce0e1a27e0766c5cc2d9bc6576c1b18feab4daca7eb591da87414d3f34b43bc66f5aa3b92ac6a0851406cb0b99fe4ebfd38d7290d1c29c6884a13c691890bda6,b5fc3a803bb1872b25da7c43693d8669157f11396f55e773d2d5aa09d124ac96,22b42a6676132410b511cb3017b628ce568eeeee6486199ef35f92b354a7cbf5766fd5dbed2b1de3439bd9880ad2de0b1de780ab0337140bd088c397d40cf1a700,de7391bb5297a39a4e49d6f76d181894ebd44f145d431371814c9ffe84248eec6348c1e07af6aa8564d6e0a77e2cf63afeca3957ca68d14b2126eca07461f8a401,84711242fee6e2c1ea61a3db965ae96e7c5be07e96a92cb935f111b9059e0e327f3bea51e90e2afd888b6b27979ce5a7e8f16e61327e4b78a0ca6646bb986a2901,16c7794a75e802c5f2de8130d53379fac156d0eea7b7b23405af165c2cd06b025d2641222f99e42ca56056ea8a52209a6b213227b1e9dc0d2cbb06c7fcbcd9a800,bbc7b9e07a72123d723b9b9fee4dd9573f6b2137459afb27c765be680807f02c62b067adb728e7bc3addc886b7c317bf0ae2e2162aca53d6f3bc5212deef9df301 +ab9dbf6a802eb02dbf36c036664faa11d4993518a91d29ee506b3a8d5000b765344d0564c89f9130871c7d1a58832f1e6f676f25bb2fff10088a3962c43d043374cfa3050dbb7395590d9f54a2f40b4a8ea44d67572b1e7d23ed5c09c6b8,353355185f014f2b824f5b83f15733b47756e8c16498fd33dcca39b394876b35,f04348f1c2f9039c5c743d9da053fc8a6bb48f2091ed933e5d1add8a4242bf3e30779f8f5321431254c3412efba67ea6ac07bc5eb268d36dad94447afea263c201,58166b532120d11e8368e0eedf942bf9ed50abc804c54ef811fadc84d654a2123abb3e1edff989e60d9ea6fc7e827c0993cdbae41034c99f2d0e8fa04f59249901,3f7fd13901067c33cb7fcd918b3437f36b9437767101f3693e772e858753503772bf0674870179546ae7701e17e2448d976aca46aa05d71feb66adff3d67fbe000,ec50b48eb8780c82fcd3166c09c15d3615c79365040e041a971f43a67e6f6d79668826b5667d98c85c7fb79fa1b66c57ff02b3328fc6a30905f88876ad1cc88f00,bf1f7d2a7201d67fd28b4d4715a1b58dd8d8880b5a19442c0dc2b4e8e9fc86cc1eef26046f97e9d4efdfcf3b4dd63d02619627598b50786d65de4b6d2f4dde1601 +b99a5ee0010f2c9eea7f07554d3758a6c61f9df2dd1d63a11711b1fb5fafd5e857de432ed214c11a5f6cd56dc19fe334d507fe9ec44547e686fa521132658973b189699ab9cc4748b46bc32d6d426e228a7be44f803ead26c7f2427acc81,1d5e5a01f67e9d8994c9820ef5d2357de14c8fde6c3a79c33c04e9fbbe07e308,c8eebc8bca9033b3de22b1c43a4dc4a228616a7f48f12454994d84b39f23ce694d1dc348a3104e339292e86cbb9566c94985bc00d33bb3fecc2f9d79632b5c2500,c9fe059ea8a509f6e42a36d4e5dc2ebf645d7be8bbefe1e6750f68544a188cde13e87169d528a48a21961dc7a4b762560dd6615a861d22d96eed8cfd8cecde9000,f3808049bf7add57ed06d7d4b819452aea74c89d31f3b527ca1b8ce35cdc3b5b78fe024b4908f5c4f9d91c6e67fab8b0ad239a002239096f98aadbd8c4809f9c01,87bdb979a151fb514b26f6b752fc46da7914b4bf87f08204625ffd72013be51d2eccc17817b89c95baa5e0f6cb3b4bd753b3f88b54ccdf2f54e9cb29107188e701,d1f396a90735b8a737a05d44f1ebfb1bcec22bd8afcda91fcc2466ee6278eb0e534be074020420111ae99fddd4e3acc65f76df5c1ff16066ed839571d381561e01 +802a0ce05a99f3205870579b3d2a62daf901f3c98f93bf8ed762c858a8f7ee5ef41b90456201c5b631a43e685590fac8726b330e3c7ab38b241a96781263a3bfe5db8de9604d01e1731977f9b25d15f59a98f3227a102f1c8bb1b51d312c,8d64972d2b90218f4e86afa0f02d6b620f9895fb08743131661986ded2e6a131,d06738ae412740d01e73fa884197efc0c7fea79b8fc8e3c03a8315e6cda0b1c45887f666d361d64bd5b6663bfe04a79a3fdba6771a1bb25d8f0a0b7303efa52f00,23c5c6df8fe4b05025d49c74ce5e9fcd751e6143f9ab11f6adc938f6be4cc722018bc93808626a967be847b2cf6781aad4b851fb17694a0acc1009b23232cdc300,df3ae88fbca6846372a9e55678ad00a61b956a859a139e698b9ca9f6fa6e1194525b6129fee86aeac4b00d7fc61bda335870406a69fc9e7715446981dddb292e00,4adc9d9f5e4dd75d5ba02a7637f84ff879d4cbe2ab438a323eb8ac7ed9c8f20330b10f74c760fe42bb52a809280ef16b6b911c86814b785e17d44307385afa3501,52bebf80eed10feab7f091e59592e0eec9b573dda81f130d9350efbda680942257bd72b4f351fe567b43e89b430d7a6479461dba51baeb4520da5d6b9a58160001 +3f36a970a6a92c22a40aed82312fc57c64c873c5da3dbc99ced622d9ab87e878e5b45782fe1c03b3e094d6f8fbd1cedadb53e9b0cbf27f8c2aa39664d9b503b5ab504daebe9e8fad589ac89a3a99386e10ef46a35c805b748bb638c4c3c5,8c4b850e14343856ca0a3057572a2456e13781ea26aa31e9fc2e623bbfff2986,09db5d23897bf042361f0a12ac7139bdd4b29dfe2706dff44be9abb34a4560203978915cb8937b1dfe5a47898974467a3c68a39fa2ee1b1d9801cb79cc4322cf01,c93209d65cefd164d9ecbe753431bee05930d471f3a7c81aff6a68d5ff2e59aa0cc1ed9eebb0e891636b7f716c58fedaccc754eed0b5005f3d07cf969eea3bc801,2d6f345d8382b36722842a2c50405597b686a6a24289a7a0f1b8efdfe59acb1e2d5397856b4d43cecd078d8c84faf83dff90aeaec4d6fabf5ebd57540881707501,d3c3bce1a02690c7cce58bde58fbe4a2f58f256a9a5c9252da7a8b6b27b3d812350c724e7bc794425ae77d37c0cf6bc09c3b222314d09c89c5cadb64ccb2a65000,c5b48b06037700e5515c65f21065b8665eae958e91bbb70f2c669831651aa75c66f549c97f2e7cf75942953737951f2fcc476bb130670913761ffcf8004e9bb100 +def6664c671e26c58a865878d7d2675f4038d1e7366ab6acfadd95299f688af065c0da50ad951f8ed62dee2365eec944e8c48bc24e8f9e3c28e320253d31423c8185d95ef21e5b558836c81274d08f6cc479e344d58e2f094f4a069db9847b,8eb9e67bbe687cd7b724a820f354b3fffaeb2663a3b1eb80f6a3c5b8960e5c7d,b2348c26752b56b7201e5136557254e4fac56a369a31d66be6deb1c3e442011b185e2af68e82fc84946229cd15c667478fb4bbb083e0a82e97bd5a9f6de698dc01,419c2e05b9593a41f7a3f25b428e9255fa91d30039a0b4995814b6c5e110fcce58e5bc022e9dc5bb65470e7cf35110bfa482e7b332eed09b1271e22a50b7d46101,7894f119e993b9009c458a23b166143cc1ea8a15e8e3fd5b7e3b87c01e93a0736ebf617cad8e5ea1249eae65b29e58006cc056af6578fe82d282aaa2049549a000,d4f44a645e57977e4ea5c2ae09ffc30c54964960fb80f500fff7fe403eb8404a1683397cd7d9b751e63e0ed6a5951b38b5878ea5fd610198145f2bae17bd1cf401,b8344e10e2692788b907d146aa01270679fcea549b745e9be222d6d6d7dc9a3a507b9cac4ba92821ee16c615338538b7d89939bb04ac803ace2b36f8f9e6d36e00 +ad111881c0ed6a18ba9a3928e3c7a9379422033b9eb04dff4a760a9310a155aa085b8722eb04d7dd2973dbdaadc47836b50917e11372cf79aa2646d3358a9b2c3dfadf73e141c8f5b53436a31188031a27de0361e351ed68cdf3b3afa1848a,55627792193abd93f2f1f4dea6920005d72d2088b4f2167e9dc86229b26e4df2,109fe70d5e190c16d13982068c9f02a115918fc33f7129616710788a913acc333f5ccddfed44587c08b004dafb5ad73eebd440eface9349dbc959f1116d67efd00,30c08878c7ddaea4ea1e90ae2229da27deff393818719e46f9c0f45d46a8a58a13a34094f71be1cf682b727f15c02d890ebbb08f1c6a43a30c10cfde8fd2338400,bd6542091ebf2848ca00e4a3e6e5aeb14f00535da94a8cae18e6ae1d91babb4a21964bb09250705a389e0f3828e3f8cbfaa08f4bba9dbae1f6bd1714da85245601,dce1ba19a508b01bb255eb518cdfee8d72e81a843298583080833794ae3ca33d37d073b905f0537f0fcdb2a89d8a7d550870c6d066310d12299078ed848e486900,15f4decfd5f8d6eb2bd69d263bf71157ddc48596c2703b2d2b976d7c6add9708075d7d4dd07681b6517a6d1a2d7e811c3b09e4fc570a2093d36070956c58970d00 +b0597a1b8989221e0e1b108ce87a1f16f926b5ccd3df7042bdf4463fede274d786c004e8bf7ae16b427abedddd154cac6a7273acc84fdc344bacfcb870287f9f8602936bf90cde7683d98cc3ce3c7510b92dbd982cf533cf8c18207cd4711f,4c5c041b03d27073bed2b1dc2b2a1145fe2535a8ca6ad0692c4fbc868bcf3f44,9fb28e493dca41eaa6715ee42aba20536f8a73de87650bf564e85e5dd80856294a18f50b47ab664710351aaff33d4d026851f828e8799832fd29f410b04b97af00,eff64f7e6e1901ea0969d9d26688ad76593ae22b481847a366add5eb380ba05d2c3a51c7a33b27fdfdbd99d23a848f2b3bd6cee9c19059988beb95b97284d11300,121367ae296ee5d660e796e46b67df452a7cd69e34c115cd44d5380f75b7c84225348e1f880d67b42e793bbf53ffb894c7e8a956774648145daac70e1aae370101,8cee3a21616c46e2a4378c421c8f69318c5a875e96ccf7c1235b933cc2c815c22414bc8bbc33c490b766b5c4348012401687baf6f799b27099978c68b3fa780700,b9ba21a97b5de0bbb449d77245f5422ab8a11e7fd84c7d9cd6f2d8b415dfd4a83d9094043a0298de5ff576170ae0375cea643f5c34d2a15bd0b137df632fd58400 +f9676465e93644d6e1df8d7a4dd2a2d41f97ee07731e930f60762a251b10864f60756d21301b9aca5051a8c72be5402857d55d92e2ea64b58c170a764f40ee0b1675b29e0b78a5c8baa331cf87279f0c29fd0b1c9a375f11ce2d7183bb1ba7,90ca776f5496984c1d6c6bd4a4eb502b5db861a57369ae1a345f7d731841fd73,715206f41a880f33bfe1f29cbd5dd10c0c3975e62cc6d4b0f2b766f7dbf64be17c31a7c38976a7e747c972fd27464cfa018abca567753f7f7e4eb0ffac285dab00,0beecac2ae491eb014632501d0e9c348951c7b03672c179b267c64b725208ca44b0cab6c5c074775257cc195e06f3e3290b3e068cf515b61277b3adf90329c8e01,106bab881769f520f5c58e21d63266108f23b762546e51058516490ba69c73c970e1d0ea25e207fabc290b7ec20b7a1564f13708f5d9d92ef97d76600037753b00,24d973af849f67fa1ede143207269bfda39e3aa5364317052b9def282edd773c02dd3acadd8ab4ad121b58422a92a60da3e77f4ec3b721cf6b53e1d0d53a165700,f6315a7c33f3e98fa15dafad1e5c54f18d5960d53862c8c242292092063a0f8c2dfed2db62008ba0e4c4ba5ec4d85489eb43755fd52941a5f6a388c4208d002b00 +1244bf63798e6fd9e53afb34b0b320b322d4bab84ffe698000e7386c984204382cb3e93e21042e33f0dc6dc2f3b6716612104fde19aba2a69ba39ce80a685ea37b0f3fa09d06a0a719ae1f2ce53c2a8db3a065cea943706b8253ad9f32fa97,5d94c5031041b73e9eca92bdfc6440644e09281c5364fc4126eacaf7abe08bdb,fa3fb4e683177e957d08723f5ce85f76879b5e9dd1ce38662047c6163c93b7d547052d63ba72da1ef811424a1ba8c95323cf44e028198421bd501fcbd75e7ed800,b0cc8f0422a1a278c57a53d1364e0e4582b2cbf21b033565b44990ecc2087754576ae1c0b2a7e99e146c45d9ab75a24bf58d35f45bb42f7536134e5763cfd88001,1ca0233cd16346e2d5e4aa550a55d4a17ec236f66ffa2d1341b9a857997cab927f1fd3606fdcf0d794c913d0f50b865197136f33215d7a382a19329d454eaab501,1b1cf8a5ae9a6290b79ff6f4765efd5cbfa822699af196e6002796756cb1cdc63f1f11f4c6143626a4575251f16b2a123a10cf8366ffad2110de9a87499efd7600,ccf1bb720a3f157d75b94ad9056faf03a0f2bd03d868bb063148581e1002536c58e92a488717c9fb07cd560fef8397db568d91f1888209f9e35429c32430276101 +7cc69b2a338f4be6a436227b132c2435e6a599bb13e2b5d2d2487927be1ab500ec7cde344bdba202ca5902c2ee6e7ea10bc0615fed3612415975f6a0367b810cbc17259e44577cf32f98eb656d0968ad1fc34948715860899b606fb5478e54,e0714be1d082d1c896ea1f5ca000027fd399fc96f19ce624f6ead8a1cf063874,305ce19e63007b4d2f2b2af304933e50e6181a23529b035940f43d98214c68fa24934795281d7d9ccb0686089e11218dfd4c93fc68b0b319f5afa876d151b40600,ab720be43e0beae787ef6451d2c017de08bc988a981c6ef4e8c5a9186d56e8c74e21cce900054f356805c535366c6eced9829d955a7d78c37ef5f1d551cea1f301,ab7a095b551ccaeb7accf61df12a6f6630c2e33b43a77a3fed550be8d2dcfdcc135aa782a123a31fd7a1f177394112d9fd35849e8ecbc41f420a19e7031a067c01,2422f4c27ef150665ea31d717b7b647ed66e7be18ddf651d98a719034f1cb16160bce9b8770b26510f932d68f7690fa8fccc4fd4019cdf7ce657e0f711ce647601,3c017ed1a31fbbc5e25a05753ed1d745fcc534fc7c8fea1af8b3931604a1268f751a40cc0bb992355bc69b4ab8ceea6061b1369b1bdfad09f8e076e7f64c2f4600 +533d02da115378c624076656c7c2ba8ebb2e6869c26ad84039d487486d070eff91bd62fa98c49a8a4c321ef18876e86ab12b471af700551f670aa4b85909a906defae9ac645faafb2679185e97567ea36f559fcfa438b7850b73886a8cdc07,71e3a40a97676d315689dc8770bb81273aefe53c0da3a004752c643e0d67687f,f158ce2ea1714290999250034a1bc43a41954c58f80a129414bce00ac878c3d13ac940dc21e88d6c86f0b29d0371a7fdd7d7f05e5033692431beda5a5c0ee99d00,befaf99292fd1fa0fb71061f2f92c4fc8b9105cd0d90d8b9efb8278925c70a6432772930fedf7be2e29d8db148aa528c40a87d6555f1e71ab5c78cbe6980034301,f1d4e08240535ae4df8ce8608c37452e22eb475be59322282d90dc5f7b86e5397fbd70b7de31cf6f0ee0b681b236d18da6c28b264261e48b0bb1afa8ccad87b301,9a8a33c832b9fa024d49b0cdb51206641081d011ff5fd55942b199b26b1221ae7aefff6ee7079fd23a8efb92aa12ffaa4592e6f7ff4ec859a8e0998e132b37b001,0c9632ef97b8401d459288e83566b4372dd150167bd08eb06eb619b434e56dc25b33e7a421db9625eb8851e6a03eab7ef4f3438f250b2e9cff825adb45a4c75201 +adce284af1ebad1dacdefe5a3d993da45ccabc5a86ec60d315c4b22e339e6d1d11adc25ed43a0a87b78724ff352d8eb3bf876acb34d65d7538487bbf001a316f955b92e2330daafb4b9f20a4d7c97b11108119f9e66807fded8ef4305e7390,733c0e9ce41bb5d9ee8049f2c52b1da87f0c1137be757a361a689f3fd77fe173,51d983432f27c91997ef7881ee0d1cf9210256bde940a8de6ab019f15abd3b45799f5e08d551c8b26969171460abfda02ae5f3a3f641e66d53fc6848cc794aee01,d73e6d4569d0e1f7283f1921384249c3dcd3ae08b7de10a1fe28645f4396c4e1737ced0b3a3609ec1e19f714c02ef89406c0f833f94ea69ebbb8d2ab41c252bf01,6ae15ba34b62b30e23ba64dacaba6cfb31d96d88840ad7ecbccf7528e42bcb0600ded3bb6ae52ea2e7f421df115b5c41fa5f816bf35e3763ac1c6faddbde761a01,8697e19ce776567557f7b1bbf5e722c3f8f07ee48f0dcb59b2bab5f71e054c103ca1801483c1730817dc4da319140c8cf50e916813372db8f8623f3ca350b78300,29b6a2c45a90551ec96308877329fb9b64d559a23ec29822c536a54f6cac3e4b71cdbb9a69301437b6a7da9348696ac601abe03b10d1d9d601da116f498dcb4901 +55d2ccb8fc2abf9a8dce08d8c4d56e9cebb9a06b86742d18bcfb951ccaee4c6b7a9c9a40e14fcaff7c634add4cbda8fe3df026db48641e78a21e8ac28bfc433c9d54413792ec49e1bb58757938dba50d9b3eec4ec2d95c3c7197dbddf06911,440f50089074e5240bd40318f10e99ccc37b5a06e5ac0bed1cb6f9b976688682,76f5b151fafc8025fa129d1c727a7736791effe26066cf95f5cabece6244f8f90a076135732c9abf8e1e08ef5767c99c295c94e0b611569f31c773e0dc83938b00,4c9fe0587f9647174aac9631d615207052dd7a4329342fb580a1a1f6b70796d5065b0bfad79ce225fd7b0d827b3d9f93d0305d50f5eede10e7d509386ba50dda00,bbad86b8cf778bb9813e4ac5ee482f6656ee53e4c30f2e128a6730bb2ee85def59fd91e93b63b237f08279237ec63c73050dafd9e68ff511a33e1b05cd91ff7701,83c06ce6c19f569a1de1297708d87c4cd566d41a327feb00cd118ddddcb3f90465e62f80d00f537e2b805f769a90456e1f19d32004e3cfbb35b38d29869b85e900,523c6493a11c7f4ef88130b504a120138ee13cc30825c0bf55e9c8703213181c16190fcd0b62bc8ae601d6f5725a04ff1dd7bf08f85f9ff31dde6c62ba52f95a00 +a0fe669bb538b5098204bce445ca7fcbd1c72417805661b8547300ff3fd3be841195c8ff1e328363adf55cae87061a3042aa916c9fdeb2728532fb2a468b2a3bfe4eacc052f2af5999e49c070e2e9d5ec6564f3b410efcb7f574454c89a86f,79cd5a8934af5ed49264cc5c9683d338cc90aa29d97e9b8b056ae8d22ea000b9,4b8089dcf76edb3cb984ec81bcb8d1881bec787a22a0b9a69b60bfb07d2713d665e581fea3287b91efa5df14602e9cfc3ea26b0cd20112b209ae752beaf5043a01,be5fca4d9912f441882bc06ef6c0a04bf6579b5ab5a220bcb76db729184ced5524eb089fd3a6ad2a71b133649b6e0c9c84f1b31e600dc682f1db40c529d0a41801,f31edade673e6fbc36c72b5adf9c841046b69e76920d3537e808cfd570de520b09c7deccd474254ea7f9c634a896bb4d7926e85100df9fbe7c5b1b95368fdd8700,ecb7c8043b1d3f65cb84b36bd41cc733af8319888cc40502eee1f5e00abe6e2c7c94f59e810f2a51ed8892d673215dd3d68a2a0947bed5d628476c800a4d297c00,8807486baed2d5ff77ba774023f3d4dca9f505fe19798d38de32f85add734a1e7e6215cad012dfb9913ac6c4db68a49f6df506626558641e95c35e789fde04fb01 +29b5866aebff23dd110f54fa21ac965f9a107e00a758c69db689ebd61a90bea770909c342dba149fff6fec8d2d70c4a8730c9ecdac6129a7b42de00b096caf32bac32381921776eb007d9ec46e7d8de21436c5f2df7fcf876bb6de6c2fc5ec88,cf8333122def1297af0950cbcbdd8f514460beb45ff2d08dae3918e11c40b229,13c96ccd875853c3d56c46e23f51325eee5733ea4fc74f52b3ee7644019bcbf52caf403df877b6eb5a4ed34ad5d87e548754df5afdd876853daf1596403cf01600,3db0525ebd67e88361d477cda27a4b8e2383369fe6ada8a1f65e5b213dd71f062314f8009d851098368e1f5340b74e1ff4bbfcc3a3fcc8e0c6704464c0db724c01,b5634e28bb9c0e98eb221f5cc7f17bb4f93ee4ceea9e53adb662c2704bd175001ebb3215180445c5aac75e1e1b298b3cf42a37738a5c456837c82d2bcdf8fa0d00,2d8efe56e431693b85ce8c2a4c311b78a261a7c5369e41b4cac7f431b2955faf7990b16b1271118edd94156735487b865b0802126c2a7f8187c65998c89e1f6c00,59deba1e2963acecc76b7827bbfa0280045055952858d907a2ffc5e2c5bdc99d64bc20b1b167551b3b97c69c6d36b7771df715234580083cabaa18d8d2f9ac7e01 +ef59151ba17d5f0b9046c92ee4c9d061677a00e4134b22ef614d6f63c9af94da9eac699f470a0f507b06dce6f610a3349e720ae9527a177246b2c97b99bb6ebb28d34210834fd35491125d971f6b4d998f6e1bb4df57bcb59dad4cb1695e9ab4,f7d5b3cd0f204122f41279d4d31498ed86e09217fdb594dcc72f38b26d203123,28cda5014625fea893f0eeed501ab3e6cb3eb1a549850f604e1951c65004bdf02fb393d5f9761d0025fb3a9ef882042ed779104a45c99591d649af006466c3e000,570bba4b05c99783d847961c18b652671afee1d0f382243fae755bc85e5f7bf6051960f28d68409b3a853c8d46eb63450b9dfa7f918c6f5d4d1867a2c6c7489d01,ac8cebb49884d604ea45c92199773d046bf8b4a89f8b319932fe69735aae4b4c6868e7e1c8761ceaa520113017aa02513cbc6598d3cc9f8a4fd753f77f65915d01,c7d67b12d9b9c878f6eea5ae93af3aca8aee1484b9d7c8c59118391a11f305b50ae8d9786072784ef640f956602a9a3b251869005507472f00e66f2769f0bd1700,307f8ebef19e61c893200e9bb3ffcc02feff2ae05d29e8c4bb5dbf3ac9bb2d6537c0f5be31491ca34ae5dfe3819b830ceeccdd8ac5c5bbb8e7ac317c06ed149200 +03a302513e77a412ec8cb064ff0ae7d023b75c70ad080b4c2890a0be1661bc60ae6b5b2e5e790a9551c027ad3deaf8457c289aca7a28530e79c900333511d6677cc957210be161d6c126f509fd677c68e0e266e9dd78ff80d8185b63f52e4585,3f9afdbef9ba270b5cb90499ff10e5ff888398e48719102bad8e1ac6ee116e3b,c759a8983a2a05ab1a9b8bc8f073896b6d453a94c6f0c3ad36c022bbcd2c958406b4a0700cf8e55db184c9708e77d5649d1a7ea1a99dfe01c788556a192d02b400,b7f2f680f90e2e867d4cde42dcfc1216b18e0c5607f43273e6f90562d888b1d472fdc7216414b2dca8ab63a7468d72d06102676c5f82f6a97c2e6171f364fca101,4c98256d38f5d3fa323e8e8c7f3a8c85f6a4462872a43fff5a517098a2f430a9761c369d12dea5d2441c233c85057633d675a686c6ba764f8d30e73c62e64c1600,3ba138a3317e2c3dc0b7b8137933aa3a04280e8ff40ba04be779c4e2d56578ef47351c5d7b405b0be37f02c2c646b9cd5fb9b3ead0eab8102e681129ced9a42601,83650acfe6a30c791d8d63ba45f20e2de37430ee97dc4b21bc4e538f5e4d150555d4be99af3aeb74dbb2fe1a40f06a019e044ddacddad9b5a477cefb90aeeb1e00 +f703e68241ab17e383555baf7442969dd996b1dac0e150b027d315cd29484dfe79211694791986e102111debd51f9c6558e1883edd5183973fa0d3910b3a3ce8932f0163bc93b0a7c342cbf2cd9c1c73eef3724046cadd558ae63640dfdd0bac,86d4306c7cb4b659aba0cfc5313ffd0de75fb6656b5f3c53690d880133270122,7cb3c0d19bb69804a324bd4f8428a6e60ec883bff93dfb4c71eedf19f7d237d1501881ca550d99ba10fd6600628c2d4c0cf4c2497818cf551b262ea7301e9fc801,18109fbd7c8f76a0f0552bb696113eb316954d47832bc9b4ba6ce5a6b9564e385c8369f2cce8ddc18392570a1cb0c42886d9c15fad857198fb10ee262cf6e68700,1ed90ad954a07bd3bcb69aa23affc8abcc1621152499b0a090d99139f0b7362675ad77cb1d77e7e131517b0f7e33ec2cfa5d057fc6c708b7c00ec9f0f055a39501,437acc58e6301d2295a22b9216d53234ab6cb390af8c40c82f6a62d16c30bafe24d627f5b50d93b09ba041d49484742a5f4ff59d0b1bf368a42042b2debc51e400,3ffd6ea82f446b81c8081f2b6d9aab7bc7ea28fa5b8592fc3644e3a3e6a534b40cd7f327b6084aae492b625ad4e6fefa4cb6547d671be849133b9b46b5f2509000 +82c4fbb132782d1e7da7acea2c2d92ed693ccfcc92808b45bca46f5e576bcb5af7a7cd5bad942fc56e3262d0e587d65d303891611602e0d3eb0941366d9090ac431ffa8cf1d93bbb778e511dabfa0c3115481c03f6c476b91304287983ec9347,ce3a47c68907a0e27f1c790b3594fd9f89fd6f9930f36498b3e655594484f7f4,8e6fc4a14313cc586f46b1c4c853fbe55e3c044468a817795c27909d6416c7a513c72e07429e71deefbb05292b6822c0a4d0611257e631e9ef78964f278bf2ae01,86195f4f69f8c23cc14883c2084e9ca7ce1ee8983ba1bd8cd8fcb8827f3e5bb5208f29f8655878c011b0b2776a1513569cbda32bfe751854fd0db3e5bbb011a400,793946612336f149412e0d4f3e9ba6a9d6283d6dce6ca80edbec46d122ab72bc6e2b695133db81100c907ac0e595003fd1f8f2e2a26437f0cd3804efafe4260d01,2f2415ada6e3916fbef63abe6deba88a1981b544d6dd7f0d7b2cc44da8de7a59192700e72eedc799f6e6b4be8b6922585bb7e9611cfebd1513f88e491742544000,c3c8052931091acdbc36d4f272baf51d6f17330605e6809df0b0d8bd44c77e0010596281ecfe173d8a85d5e9d5193b8bdfa92548cbb6c248252a75028c8d4c3300 +61a170a6ed1717f353d2c5e73f576ef11d56b20f24e106c1cb717ef4cd5efae8aa5da5ebb2ac1a284891f6f57e3c62ccce8ad770ed0008906413f2c215b316d72fc1398c763fadfc2dc5c8f7d6e379ac569e5886f6c047afd0fcc64dd6f288ec,b678cd1f426a93ca25572a67263f699893eb489401935f6a5dfd70729f4c7646,9cf6cc8962de765faaa6b95baed3a21ffbe9ab8ced2d6eaa197a1f32ef2eeb4831d3cdb0aab6f2d5f1aec9b5e52f0e6bb5f35f0ddec6305aa6aa3f425844c56a00,f7ac05583719ae9556fd8527a95296f5081dcd72cea51e5cb50bc9293c2dfc984b321eef839ce0878b90daf061138313e63f2bc0c64de09c7ce8ad6f888cbc4501,1d0e402b15cddcfb199d6259ed9ee75916dc01028f3048245c8e0bfffa09e91835d1edf2ec80b0768250490bae5272abb2fb20d87f8a3e284bb6c98bc4b2c75601,7fc0f20226817cfe22f7e53cd83001183bccbdb3151594507161721b54a2601b53c821c87b4ac1d46874c9a6c6f8753ead5f773bbf80624abeea263d18ea179200,31840f7a42f58d56b57fb2aa82e0405a635445ed2ee5d76cb84d04a147e2743372238212606c63e4b69e2e79e53dcbe6489a30e3baef43b1866a9c3a2220f2e500 +f4c74601b88c61269e8e995dbdf5f4feeda81c5787b19ca0c34cfe0259aa31db2ee1642bd23d7b119f44f94b643295ab88d17bf9f4099de135587358425e1732b318f93786ca999d50be1da2a805ba7a13c2f62ba49c5c56038bec7a8d562543,7cc9d75dc948c17ae7c3f5edc934226161b0df1d71c38d9e6c001312f51f0f9c,6e24e29e64f4d27234cec813bc43dd57677eea34cab0ea70685d2ec2faebcd9213b3718449bea9055974a1a5c5e02d4add0cb8f5d001088bfd4e3a32141042d501,204578fc7a9bc0e0dce5a89801fb5d29ae760988a1e4b99e81d8293e0c931c203b7bbb9e7a4ca8a3c6a7885811ad54824c8b015254514aa4dcf8db4fddc6f31201,ee51570b5287e2b76192ca29cbc4b8fc655c739a098f81fe6c3ab2cdf20289e60139f310e7b4da7137cd17a03f57d8d823f63d6783a0232d1a3ce2bd2120566600,92574a73f2576d00506450a4140e6d72858da6a22858fd5e23a7e3581c081fef27324a5c442511a61e4e3f810b89b4442f28a85bf2fa86c5da7d9dff3bf47aec01,611129726b538edd5dc5f94a6f5872aff94215c89af9025c60005909c5c3e3251de1e7375b1f7a4fcf215387904ae3bbc0035c9c7f8e1bca1080c0faa484d01000 +a2dc9efda74950ede75d54194e55b7e000077a83e6a951b7c16f5b2359e74afc12aa41318c0a6d8e9e3e05390fc7d0050422fac06edf3b4676d95af79314096e5e81691b24f803e9554c09ff20053f574aec4fedab4cf62d458310da760e96c8,8bf90152c67fd6612795f66123fadbb44831b15d0b65cead6dbb4b4e0d93b6e5,a2a9d55910e4c1392b3b552c053ab234c818280695f48c1328f6f829fc32f148014795d441d92523ccea5638de4c228d1de9f67db2ae12396c7c3425f1606f4e00,1fd2a76dd3f0c5ecca8fdfb13a639b5cad560f2f114a7f5c7c9cfba35132a6c75fce11b5129d181c6603ec42fc0b48dfc40f92b66a46ab5b83191771ecfa0a4101,075a4cb2a87b209adf623b69d6f1a29f62d8ab350cb03c3c3e7d909cd3645b9f50434d361ee97fa4f7a8f065afa4649134c090c9530bb3f835b352317d2cfbf701,387b60aeb69485ee22fc0d787474de95bb42ecc55d2eedfd1393b2c6c08972d248c083434b7b346d8bb8ea9408167122826bccaff9f5fcc4529453477c2b6a3700,e960196cc4dbeefb9bc60aed575596a88f887e8d0439b97bc96009d500b7bc6e6d172df326bfc882b2a918f7346a406afad27f710289162a8f9349a6bd8695c001 +959677a8fc85f36a8da5849519cf6de97dfdb30c61f91e98a94f3b25aac913f92485c9e7a0c4f4d83e8bef00736f67781a38187cf07a0b65bb2dcc704b8661c48e61c57def7e739b31d6db3675bc52718ae52bea1618e96ad27a76e50707f1da,f5bf8b6c3cf1eec1a131f2a1aeb9f94937966eb844909f1d656682d1460d06ec,337da78b746104d35d7a33d11e82818c4116fb0c3ee94502750f8dc1991adf0e37eb90a540a96fc890dadd52d9bb527b98057793f50d8d8d8f75f3229826a21001,8b540bfdb7bddaa7386ff6d0c382f6a2be4e4ebb839cdc2b4a21d673d86fcd46704229969f653dee0bacf2fa8152f5e6fc1b81c205b1ab94a2aaef55dec44f6801,0bd1664c6cffa23136277a4ca2098afd04ad5b34b6694d66d61e49a25a3c56105790c5b6735a8c44ea31293cdeeb073282c8b02202ddadabe474deea0957350c01,81657124fb2d3628ee517041cc0f1a575cafb1b578d54f9dc826ac7e8420de2d2ac6f2dc21f28538ba335029e6abb5fa6a89c1315146d46b89f73169d1d88e9400,3672fbd4d1c8a099a42e170c54656c236ded28d931a708b6c5fccb6932e4eba60b3748c38fde3334d3a8c70954d2919cb90224908cfc02fbc1f02300e798c32b00 +3040be9452288f8c0e7d5d775192d462040f56b1277f364e00354c4308052ac7dbbe2edb412f39fe97a5c72c41904710b237b259e756d8162011ffe0365af176ae88a526e5612f1d6b6f2588313af8d7026782d6e75be8f0ae7abbcc30026c3a,69e8d6d242be315d97f9c32a7e3ffc19c06955e9a77e5428f795dbda5eb77c0e,83455840d79d9c0e99a92da3eb91fa2eb82e2e3346e19cd9a717bc682026470d2f3e4641f53faf866b7c3ca039495839ace499849f6c0e8ded702fcfe56673cf01,fdfb5d2b71d1f52fc7c172f1b929cd19081bbe68c1c6ebc8e86b3c9f9633ac9359809649d324875a126c2125a1347c500cfa0fad348f1f8df1b419a94a86a1c201,f4abf14c5ef7f83b81225bd6a520bf0f2725aea0feadac70d3e91811b3d66122218046ce1d5cce730b5d72eddd9ea000176e227b4e62d921b0eb0a21154b383600,93d78e59554ea6b27792bf8a56a2d658b42a12d76ac4aa2996b504ca98d3899a453e7a82511695776e3b773c8ee9ef1f69badb11bb21ae763e2cd71ce301df6a00,e5431be35e3b3d4ffb8f8748c1fcb70b0e9d958c468d2c89d09a50ceeacba23328ce16185e66544c1aa7f5c7fed51aec004d3bc18d48640e0203176f484adb0401 +2b413d95ddd3d716a3096194200cf3502bc217baf2857a0d950fc1a4e0e8aadbd5927f4069146f98c8d9bf44a66bcb41a1b1539d8ab35bd306fad0bdf55305998c7b049ccb8b0f16362bc92c52a6e131a5fe853cd9f500d37b533b5617d0ca54c5,d2e8522072e2347b05df1adc87b80b7b0733c43fd8d47da29e426f6b08aba441,823a600fdc3125bb2bdc25e7c662f8feb208761e8ca14544b2302b9085b45e444da0cf1f4f2c2c4180b13285259d20289d6cd9f37b5d09e5db979f486c89781b00,89d1d7fc31fe32bb464a451b560c708ac5c99abb8d446e503775e61c2f27ee280f15ceadf1a9c66541cd747c93c19823b47d333b56671aff8ed43d13410a438101,38b6a8b166274a8f4cf98962daa2dba60fdcc0ab7fdb06994e6661d2b724e43e48625a89e4d8e40781ddae0c2dea5b066c2a06cb1e7601153bd4425e3f07520e00,d5f5b0998d08e972ebbffd87cee2dd14079eb0e6f3ff459fb808c7420fe7d0f0649a05ae30eaf86b83dfd2e05f3b6fa2250ed3dfd5b930a3ef2fdbe4a013faf400,0c33b4cc048b58619945c724993aa7c1709e5332583c105d55d22a2a23d811df6f68d41a54d3d1e6054813dd9d6c49b23b3e7bc779b4b1fb9218be26b10078c701 +f9fe0c92ec8d1c21d5fa9761967d80854eabd648b2f0d7fa11c8a3dde30f8188e877c073cd6b0741111692cc0185d52d44c9a033b619063013ae8e987d97f98e383071ed9c82896a750581e05fc78a42ca04fc509ba5ce03418b8d0ddb0fd00132,25554abde2112faa684eb005677cf4e4d9a3c8126687a51c852231283ead2d36,61363bcb4eeaff66afc7aeae033cfe76ed2ddc0a2d4152cbc2c1eae2b7b02af5067ee37f962a412a8f95b797636114169cf36bd0b28d8e693b4bbb8cc6a4848c01,7d844ff7bce86a626e5b6e13568bcb26305fa5f71a684596522ddfbf3e44eb0208d5605a2b02aaf7602eef92ed1f354bcec4ade4fd7c96802c6c62cc7627307501,6f87b5caa7ba7c3809dc77bfa589aea56d9ea1bae5e3569cfed95b54699fb31e49bc0ad8032f952c83eb20e0f98568e73061e0d82883dcc42d8d24ef44f2194600,2f2b8b9d35cb4838abcd22cf6e61b1836abc40e7d51474afb5223570c8f8e5501e784d7a89446bcbe487f1c0d17e2b637664664245752c2532a830c727ce008800,99a37298a38e41ac7bc177f80af2faed2997f7b441465dd1e72b8527112198a96c5ddd08aea3f736e345778ddd42e5bed7524c22deaa63cd1f50b073be86940201 +b93cccf1e1a3ae4d28a151ad5715437bb1e69e414450f82360ce40d8024165e5fac9b982be619fddd51e2c7f3a4f75c68d19c73bd51e89856c1a074027c8e4ddcc99741337c54e0d911ddbc124b9534d8369d445681937966419bdfdc4f4c3ce0b,083a4d84e0925c415bc2b4b3280ff20aaf92706563a4361d989ad7eadebbe6c0,ef391744db9b2b5417c2ba75c1c0effe08e507978f7da16c21f5a6c6b8c06b556c0dd93e874fa7107d67f6b418c939a08729d5e2aed8441d7234450c8bd972fa01,55eace5f17f699089f3dde4627e493495c84494536ee3947f13df41fcdae1a892929569a38d7994a1bb18ff229da2cb7a510fd55034c25a1b86f03c78713882601,2dfadc58657162527a7ceea3757713304e9fec9efcfefd6112b400acdfd898491fd9a62dc585ae5e628ce51e73dfa72782c6f3c6e9f46587a2a16348cf331da301,a2c9b917deaf2189283e1688b04054727c6a112ef41e841840aef36b6330d5a41f18f30389889fbdccbbecc0f08cf95bc9eb61055eb0ba80696b6487a357531a00,3884a3b460ddb50770f6988994f470ea3f2038c148a90eeb93567170dadccb162d82eeb3dfec0dc3faab098c616475857b1ececc5ca71ea8034c3b6b09f7db9400 +5f9b9a0cc8e7ab8b9a60bd0c1c511b004d59652c100687d52919f0a45ae90a8c7c9e0cd0b44b784a6e05088e49ed0c50a5f02bacfdd12856532822cd9dfcbf180d3bd658e667e4ff5e9c604294ca2a48b5c739f217159f016300434f072945ff94,d3d7471d7b98c8624cc50a9cb0836872f7b92afd3a828ac59816902bab2e2c44,b94dd59a9015ff9b2145898a7b64552243541bd68c1a08c579617832595cae952fd7cd83441747136654e70e28f8a082cca135af4d21b835cc0b690006a10e3300,3385c3312e7624ea17d2c1889ea4e120fe043f4299ecbff2e26ebdf0aa02e1ac32c2c22d3cd2c7010cd338be7ce5bb40d261013f5324d6b770b2efced8e24f3101,03a0aa730cd3b8a383f8a8d03d9d07e404ba2359ebb10e8b77c9df3568ec5ea3020116ff3a78da472d4c05e2ade69eb8cebd7665bf195e44c04ca5a28fe0124701,1c43b1962122b66a8d1290816e7c92fb2a66eaed9fce02cd72c1e6098c915d75019d30c51d5ebf4bad81e42cc954ce45caf974825a509bebfc15549b31e677fe00,c40415ed0f3999b1edc522b37368344002a8ca532b29e31d095e3b34a7317bca3105b90d7e3c085f75c53b751e13defc9dc7a96b6c2fe789f6d1cbb633232fdf00 +fa2dfb8f4fea3c53d16f182806a773f34dd18868daee5f3137c11f2232d41c2313d83f44a32eac86c454dffd3989a37d5f117fa64c2ebdbaa63410bde5776828dd760427fa1a7c2516ad3d83fda5d569fff6f3dd83304773f188e99fcdd389a9ee,113f8cfd2f97c8f419f7469debc84a716c94fec8d99609adb43366659d724748,2536d8966b42940cd4fc36b256935795418b0b8d6bfc9b6b63a0fc2940bcfae47db498c3eadf2865de28507fadaa60e5e20b0f4b1c481ada39b1d7fe15176fbf00,71801034236e8acea3a8ea40f7f104196a12a2e8348cf702304913bc1ced7a2b5c7125fad1ae5d9fee47083a2ab6c3ca7627ae51694ebaad382cc137130840a500,d45199cc513130b0cc81ad26a8b8336c6ba9d4705d7e8c7ac588dcbb28de8b0304b6a45c230e3d7d97e0b282947b7b6e3428102f10cb1296d1e9a0d3089fe64701,f36e50654f73bbfb5da0fa01bb9ff38da5756c77b286d4cd61179da84deb027629f08ae85cbd09647b61b2923db47289473fa76999fe678cb2a8c5755a16589100,fb4061ca082c60df0fcf47cb7e87188c0eff2ee6ecb4306352349d8a7925812e5c1a2618b371f87c3dd9d04da5862c3a786e5f6a3d73d02cfa151068b06510f801 +bbc73bd719ef14f589df77a9a725f06450d17517be758e3ce73d44ebd4673a9197dbe28bfa9b467f34e67da73e011ee2781ce2a4b2fbe2b1adc895481ca729debd74a56eb7d7a52676200ad4721d08ea263e5b59a920e086b05c63f94eb49a2fa8,0d33a73696e6b5887632b8a423a640651d6b886bc08026147d1e450627a6ef9a,1828e442005637ff933a0378754b0b93fae45d10bf5abb7f4d7aabe34b673a350f780a68adab3d0d7f69316997186c6de06f6dc887dee9b988c0d9c000f3af4501,247704d88fe09909bc14c0f9b9c82fefb22dc6175e45961a1fd0b49ca4373b0a21f5a3d10de2cb99ac0c5b2c1b9bd58c877d566d8024a6eb0406201d770d02d200,32481e9221ade0724cc90788c6f683fd4daae4344807e3c38620dc6f7fd3e7911654c9bd174109512efaf69f291183ae374440323c6fd231ca065335147f274300,b1f50cb6b456ae8ad80d5aa6a624ddc5636c8941cd77da6f2da0f01ad97bc04e5b7c6e2127ca4a241563690bc64111c7b0ae01abab765b7f555aa9bba477188f00,5ac1411dbcc34fa1422befba7805c67c71accb4c4dd20797db7d6273fc8685f77230b110031c6cdc63fcdab17f133dafb87b9c38bc8769505634c3c0f5a4d62d00 +aabbce2b8c13f3cbe70582b2d8b7685ffc6e5915626113f1f243c11e0d874b8e717af131d0d6e67a02c571b9a13b42ac583e8a069a3b9e31e6b68f8ad68d411096a3a2323493de0070a9aaf88fbe5fe277e4a8e49809b7d8935bdc5a06b2e51921,380dac8629cedd7e3e3f144bb81e85734f4a0813fdd3233b1cc861c4cbc228dc,3c239527ea5cd320011ca635acc4b80d1e09d2f3057a0c5f7237c339c9da379a206609fc34eb6660199d44b06f96428078a9ad102a55f8ca373f366b7b40b58100,a53b1b157fd176c9c62f94a0970d4aae793ec4d1b64de02be37f873101a17e274a86c2ae2c683fd494fe6ec7bdb1bc603df1d0714c255365b2c0561ed67256c800,41e70d5559cc37fca57f4f9b38eec282d39525a17205a385b128e36b542b47bc0a6719f00852ff4e384aeb7e8899f9da7f9cfbe88a671b9cd38ef1e26cb7ad0600,fbe8ae3eac90d7421b74137f5a42ddce4c24f3744d61e2abde29b4dcf354bbb323546d522cfd1187d3a51b16727b3174fca818b906aa0b032069cc98d4a4687601,b270e8ecd8937cc54a969b2419211df225b24ef9eec33265cb7f8b2febe5d0da75299704fdc737e64c8bc608bbc1b228ac0b7ccf2c70878f594883913a6ce6c000 +da982748db436b408fba39be5feeccf08a869e911f983764612177ad4c264dbf056e7751a8ef42dca48f29548ea98190a6c45f710fc31423f8232d0882934f19bce080ce5b31a734ceb13ab62269cd029f8047235f08bf7a58756bb6b3e1cc5529,ea3a086ed21b173afe4e97966acabd5758211cd884e68151b35cf4ed9e8a45fc,c2b0b5cb9f13e965d0b372862ba7cf6b6cd1389b70ab57f33139edb55c126536069710920c729fdab8b05020a05358caf4da71ea7dfb50458da8cd9c5229953501,800cb7fffec89f7246bdc024c7b45abe234ee6b27e9f97d48b102a8b0007819129ab34d33b348fc503c8ce89c875cb5dd820f8cc6c84abb0a90d8d56d698c1b101,8e712fded51c54c1e60b8120e6a0970592dabb69474f7345de3bff408bdc86985eb0db5af95de5a1f9fe9acbbdb7ac0b7cd36feb33d9f55877f2d90bc4445a0e01,3e2402d082a8c4ee6405df13934f03694afb771994fe91471d7c8f055d98291a4891812232d4d794b82905b2e2187ba0cdc748fcacd35676ebce6b76f2b599c800,ea992c2f79109e06b044891d2aa0e7fd05c952c4039a08388397d5c14bd3416a41d58a3ef56ca4f6d4bdf41de6e7c3d6cce31baf9bfe652f546b296fe025029f01 +c493d2dcaeeb5297c2503138535a4ef811561d63676efeaeef11684d81f26c0f56753f85bc3cc6ecbfd046e8cd5513ecbd8a3b7ae94bd7d9ca5c639a708893f00bef2505c1e8ccab1503631b5cda6ad72a1953b1d01734b92230a88d6fc288cd44,1d10a31942bf63bd25d4ded63814d0da1c37323079dcebc3765e3e09fcc1a7fb,c43f6604da1c5103c4c5c25edfabf22da7de5257edc2562605b358d6ec1082e7176b267f54ddea126a63e3c1fa7174ed378d9f6c55610b569fcfa45b66da3e7f01,e38b0fee35dc2ace8956d722a13083b234debe00ee4307ebce62ae42340b1fec58b77be2f79e6270cbfd1a984976ff194b631d074c918273610e0c3781d5f82101,de7b4753e2b9faccf5da569e6da570d3adfb509b4dd5abea0abad36d5c5d1a1c0ff7d9b93a7632455016a2efb9fbb86484194ecec3e5dc945904db8bdd53d2ae00,88cf6f326638af52aac55af633d8e0550b323805bda32f2953934f808cc6f68c20814be5f4b8389599607e42234b6206358dfc4ecc1e0a511ac500c32e9a585f00,5e1b50e1bffebdde99c532a4c68d6a55042a1e901f949110281bfc903a7b8b9069aaf1591ad8e705f4d25c895f3a680f71965c65d9f50af58b6f9c569e9735e200 +9b5682179b7c0996f2bd714c3fdbce8313924b21e1897151ff5243d604726a4892f4076e6472d8880da8da1c35fee0a70b4c86350325b1148af35ba6c84fca6770f2b9079c365193d1cbbee8b8d8fcd779fc12d65b86cc827afd614e28d96f38d2,06741a7e333eb7d9e335beb57abc14d9ce97e74f935d2b182e174ea2e0d4fc72,5f3a24fa068fb10619e7ee35de2c473f5061d44a067e7684776c23346d5291f26fb066e87c266a7549cbac4ba1b16e351dd3c0b5828979a8c602fa7aaab3224e00,c8aa3d9cb02cb6ac332aafd2c5fee834464f7d6a87f4aca038f3766cbad7ba467e2e2c9823387d0ed8bb22c49f21044c9c9fc2fce1a5aa4eda2bd40e9028b26601,cbd0bd4b7159e759d437f4f5a1e4128366423b2165f85ad4bab7c0b432ef98154177ae2c49a354ea27254ad4775e1d228700a7736b466f3945f951dd9d1c7be201,f67d2e32c99dc33ed52ac5f5e57caed21224145f6f80704ebb42e0b9bb3a0ac137011267361d06ff9fb17478dcd5ce34ba8fda6ed346651c2bf846d1406e8c4b01,b745749496f4dc6aeb73e8dccf063564330dc4dc2d9a9d59c6bb5bb9465fe5d154e8bee1f379b65d2a8ed1fefa0a8ff939b6adfaf4727716059ef021d14f6b6200 +3e846d8e46b6e811dab96bdd301248a76b3c6e0f52cf4a0c8cd6ab04095a68e8952a3b74bc36ba84fcaaf8fdea65bb375396848a0d8db368c6fd0e60e442c846d98c052c6e754ddc76c8812d8a594c32176348823d46426adf78133d5fe035cd4d88,dcdbff70c2e9af1095f050948606def1c2e12fb26e91a74c341a2bdd0ebb1b7a,6cfe3f7c9d306b42e00afab5ced2991a908a4cafca9f75a074e4886833011c9f7a6bc560c517cd0646606b549b1fdd9ac873f8f1e20c6b43441ada6cc7fd4a5800,e22bc3d0703c982201fb44a528b3248e10d9932e8852c38321b396a92d28fc9b6b13780958959526175cfcee0b879242aaff9bd56819bafd675432c037213b7f01,cb49a9fa6e443a6b9793f81ba32533b3a9be2912628389b3537e901d6f4c4473723ff355f5505c6132d0291c90f291f1ce7725cf010769ab3e3a52133b64f81601,454be720c1bfae7dd85d6599793e0fc31536602819bcad48ed95236ae1912d1610637f8c6fe5807ac65a19ff107efe08cd1d6b3e29d1cfc649e0439345a269c501,c322674e3646ab65c31e4f14746a875443f7c7a2124cf1c57b2fb05609008ced2d10b0212ff68dd405b420bf436844b6fb70c38f3c1fd83b4a2249bac6e5deda01 +61c1657d701cdbd578d12927939ab58b3ed50834126f817d7400b2f4857eacf7a279b7b971c7ea0c62c0bdd33851916ea6afb322382e27ef0818bc31b1f3392844f0b809547d27a11404e082eb896dca8731659cec6f57aed06896e4d5e52467860e,f5b3b7d0824b486f5bd2a377813d21f985a16157613a6263ff42998da49cde57,5618a24fadd698cdd1f408fd6660b04edd71e4a2d9b2f73dae75d52e8003499f5c14a3eecd639c1854ea822e510dfff2d5e2e6fd64b995bfd68f9aaba1838ce701,864513f77fb838eb02badcfbdea7c2a0d5ab56fe9a750334d72f32ac6e30dc4c6de38aa7b57eb81c6a64174bc0aba2cb570eb52cbccf0729ad09c507ea1337be01,6727d313602a1d7234716392df93550ca0b51f4a40d0b1fb603845027163f88064504fa53dd70ba03c93882470ac9d34b9b6c76cdd72f0e7381c0599eb300d3601,5bebb006333bbe8c7a83e4e41b2053656fa947d8e768ecc6f648f674a2b760311e5e16834160a6e56f114f3ad9adc35b60badfff1d87b83f2867488994c9b58500,890546789ba5d3ba2ec4790790d1a572af1c9c48f235bc6b4ed0a2d83e80ea826c346ddc67c85ee1028c2cc6c6c896ed5b229df9dee2abe55fe47b506074f97300 +2cc58f3ee807c98e0009bca00b6161b0d88a2e844df5067e66e82e9116ef6ad112044344b42bca85924c08b2da87444c028d16a86e431d5eab95beef06b2d787783ad4769e46bae18704ab37d86f761a4d8b7894926858aba628492ddb4c844b3639,1e79276ce727b1864147345d9c10a7f123b625882ae53970251d23284c74582c,64d1b4177d876fb8792e9ad49704c5de955f00d4d8e96bd97adf58d3c6530fae27b2c690fa672138f66f3aaa4ba4d12e205cf1cc713e327a6cdce5512a043c4d00,c74a401e35d0393dd752e3638eb8908bc2f0a47a5e299901c3fd4accbdb19a6a5fbac0ad7a29a8a446fefaa7c54c3402ec99a2817a7b36629c12d90ecaed3e9100,e8aeb720869d3f2c84b1fb137e1b0d0d5f7a0e2c42812af60b86dad3a2f12bb25bbd0fbbb5db1a19cee245a73df1f3dbe07a6e31d82e565c7bcfecd9616cc27101,a5e00049c99623be1fa426d001e6e9c8c6a55a19064164f64b36773ecbd135810616b5f158751cae102ebb5127c756daffa75a007b8c1749a9360daf24385b5900,12e889ef27706ed88cb58cbe65c9f942c89d4da5e3a09bd43ec723d11a80ac5b2851d6965083c4e054f8d3a7d4d59500ee89335630fe698cded4ace6040a40e500 +3bf8649cfb78bd21ee4791521f92b14e99c49e0fbc708724fde2e797f569540650afe6a17acf6b0ef68d99aa6546c291e140f3af43bfbfcd571fed11dd4f3d5a4d35cb805c786c538f73ff0650811dd953f6dabe4bc0679746bc747af17c031daab6,104a2acee0276adbabe5871293da93f535637321e3e1eec2d7e5827b8006f026,061dce110f22c9376284624edb722ee4b3d11542cdd77bb15b5f7cce91ec0ec72de9cb3a91a3d86042d35d9a9e9235a94439091d2cedcb08dcb4ca15c3fe240b00,5c3e4478b481eba6246a0edd8e5cb1cc4706d71e276e2e2eb82db53b546c7e7445d498efc9c31c9e3ece56fb7f358852007284602f2cd9e2d88027be959232de00,6d693add51d3fe375b7b367758488b84e1a755e787f3ea69b703264100c2d7bb2a2f49fb14a5e73bedc54d78b7904ef8095d25008709030aec87234a0db3eb4e01,321431e4714e17115543b5ee7839c37c231ffd8b625d4b2acd84238b78dc155464fbc77ecd348691e403f1cc1f273e014d95d41c3421c3114727f05ebf5f182d00,76a596dab027ab1649789cef4f13c2bf0d5b969a4722d21c82ab5913054e39cb4232c67cf2c3a48ec8ef0b1fa75e666d0d87e0217edcd333364bbcb2c6a4872900 +5b9a5e82e83877fa22da2a145dbeedc07b308528ee6a8875bd8e0b21628721d07dc84d399316a454ca10da58afc01496c320eb1c05e2f02898c94fe1379441f75e3d7eadb42b96ccbd1f1b0d3acd696a7c4c2e7965a7e4c2f95f76b2f4ecd4179bfb,04c20f54b52d13a7504ff42f28e9201a0b89afafc84dd56883328572bf4caa01,a5f0a019042253845a945831988e8f441c10d33ef8a847a8c2fc3fdfe5db404913f0cce53c8b09a5547047df0ccdd4f3261b438fbba3f761f58db45d2372611a00,0fd8811bfc0386ca8bdbd395853ea3849eb877c3ab043f6bc6c6daa4b80072586a3b8822ec3e4661991fcda896d9d19a5f1f9bc04ce76cce85442344b3c70d3501,ed6188875882c4d049ff39a2f38e09f06013bb385d06e2b045735985de98bcc46b997fc9db5a9ce6590e14f8828573d99c2a96e6b761291c468db88b5efd2b5601,e7af7530918c9944297680bed568d33b3f3a179eedffac76898610fd5d38cb41058909181fd9a2d9dd716c7eb2ee2bc8b19ce435c824338b18aa33a8116ea64b00,1c5a77866426fba853cbf55cac61a79772f7bd771da51b43daf46dc3ae7a58554c90c6a2366d76a52d8cbf510ec14a92bc0e537ce49e72c6ad835a5c3e317cfc00 +faed95a3bf7f61049ec00f3ff22c647f0b22cd3090211e62c1c84dea5d2c96d5e70911c4acb5ac054f7985015fee5b6a8cbc8d3e606ceda5a2a3f331055c69574fa374c1b7899785ba7522548fb1f248b5306cb6ce22b8f58d7179839fe7557fb8a2,501bdbc6c3afcb7a75327a1f1eb20a23c2ea0cdf329f67278f1ba979b1b565e7,f97c55aafbbdec413547ee0fba7fa4d94daa4a474c7b1255196b5bbddaf1d4644cc0333b6f80f2b27e9260d12cb1ce630dbcededafc698150353a9f94dcafbef00,9938b34fb8b65c96e3150d27cb93814d773956ac95d74a49fcc8e21518500a713e185d021e38a0be479de98a9804468ee671488ba71819cf84461119ac967d6100,8aabf0289ac162584212e3a3c6b67b299eaae762aabc8a6fae1a755beff891870c5eceb383f49f6638750a2e2f1886515f55d1124ce430c472aade09d439e6d401,eb25e172723091ec9da6383a9d079e75f3dfd74b638f14977532365e4174b8aa1eefaf4687cbe289251ccda96bd9b81c8c3e8776e9f1028a2ecb495b4268907300,3b41fbd0dcd7335d553f3d69dbb92ec753bfe018f700495dba930df558a409086fb13d9dcbf2c60d753832912aaefdcf6cc0c9f01e6e8ff841aeb39e7714723d01 +ce16c5a0f71c57a072273f8b87b5f4ff314547c577aa3e5af356c0089d5c3926d73b046b09eae5fb70f9ad743afac94a33d076df03e02674b7367c92b8334c6dafb5ef363caaf681253fa2422a8f88e1eeb569919c0cf9e2d9e995c29b6c3d7daf46,0b911dee4de1573f571917712353f829f4665036fbb3a0b225151d305f43a00f,320dfe0f10a2324bdf89b4c0694a7cde164b5418c63591218f0b8e169bc955cf66968e29cd365e83d20dcd5513610fd4a063cdb725ce6e92319514589a73094100,bc84811113b11dc6db4f78caee27ce7a2c480b62cab52fb8617b61b14b5b88a4557691460d751b0feed0327601fce7ebce97953d935e1e9111cb27dd69f232b901,aba35184359632fa0274ca8ffeb895037055b901758e40f426c66b958e2ab1bc78c54bd2ac00310dca0110df50cc67b94f12b64d56930279f6323794c0b80ca800,730b918b82cd5ec41b1f924beb9904540208bdd24f4563b975ddb56a8205424b04ffb4cb61faf9f7cfa047a23753b489f35ae4cbd5788da531b2123cdc9e813e00,d40f22a5c59417d2ed0882a13a1057115de5c3510c3267290caeb6cf4a49b6280a81a4155299bfbb71a4eff91729df26bda4da7b1a767f13bc6559eb4480554300 +e62ae8b7ab3ffb4f8e5b26f5730df4fa61d8b7823d6e88f95e2aed3ad5562e2328e7a6733d1391534d9033d5c6496649fe5382b8673772ba3ff765e340375fc8730eabcf92efada34761e5c72651aa3ab44dffdd91502b650f266faca32320f335d7,471188e8c2983a145d1800270198d55e9f2f4be1091452760a41a987aa560e8e,5c11f35d284848982f79f991faba2c80e4a5ff0b4d2234ce996b50848f665068408ba542788417dbc3a4fdb5e21046a6bbfd2b342311b28d3a2cd53195180adf01,21152053780a7ab2a27a08557e680c326e34c30c620579313a81950b86fa71177565f3a4803529cd7bd452280021e0fc5d0f6d91dad1479a932aaf4af86e044e01,8d201334add9b109ef8d32ac3a7cef1a609fbd83a548627297ae1db9fcbba7ce27ee70325a3a14cfd6b95fe8b7889195a06e3ec45a1c02cf5769aa468f08cf0f01,1df66430c1a72d5b1fd9a2d80aeee8495e54208d55602549af9c5b37a899193531658b28084791222b7e5898a4f0a999e6bb9911e1230f37699b93e65eb3796c01,dccd1a21d0b3f64ca185722347cfcbab7e5ac5ed811cf2f38d7b0b1f328b75cd3983c854ed4c6eaae68c9d2a7235cc98055ace191d9d81f69e1ad44277e6b4b200 +a616664c0a8c752538f99ed3868a96780839b139d770a3b452c78e59d57702b013004411c2c7b31157b412e8ab48fdaf0a55c621cf435974e1d22b66fe4bef3e420ff22aca85ef686e167b2003c073c92983d5ae4b0f796002eeb7a82d7915d9ee4f,209432069a4bf5fb39fbdf545d8cc09a967984421eca9b00a7b6ded8cabe053a,c685e431fd28fd0b30acce43f40dee6d4a9955d8bf69256cfd2b915dbdc1b2621e9e0f3516eb78e5c8ea5fbe08c6e7bb2d627f714923285a83c86fc1ead7907f00,6969313cc1b7f86686db8445f9b78d7977bd93668df9ec49906f61823a37921a5495f4d58b631389d4409e8e46a83e2129a1a14eb57412a2bb68a3638578b43800,ef6b5d586e09d8e5c081c20fbd4d4b11bf8e20ffd0370017c5f5dc31c9a9fce56e85735e7ea092ea0c3b688ef420be68c47bac25500ff96290497cc446d29b0701,1a9a268e19406aa6c3bde614b2f6b9c5751e7c9bd3cfc3a63bc8053cf371e0d3441ccc679ef12c403436941af3ca1832bd18946637970e3f8ccf2a010fafb07f01,0e599d88dba2a096fe7b85dfb1074f2d7b4744088e63061998845735e4db59a65aadeee0ea7fec4c8398c5c8df44483ff41aac30c458ed8138d37fa744dcf47300 +c29cec7676fed8cca0977315dc1de0fd16e7b9b2f12202c880cabaa92215e9134d38af1d6eb83a26825f4bca27359f4654b75f06de9758edaf7ce0381f514d025b71a06a8aabacee720dd85620f69259938cc6f54a2036cb78917018f83e28b20e45,efe7e2b7aa0ef4f34d3160049e650588b3483c93ce73c5063fc55351e9ae9aeb,415b3132e1052a201f1bab305c22fdaf5794f21a9df9ddb733134c4bfedf68725e195c18fe0199245fcdb0590a8aba9fef88b281a5b0b9b39aac36f4f24a219601,344ea1383ff21931ff489cababc61e897fe4987d0faf524257a91eb2959df934658932d1a3a3d7cf52672428a0768c79a3ac65ccc32a509df46286f7cd766d9301,adb5585ab9873236d9f15ce243944ebf47c009ce26f6f6e86cba0ff270505f1666e399b1411a7dbea572d1552b8277187700fbefe4cbd5bda9af93184629b45601,9bb64e91f12b6207c72e0c9b7b67bf21734d6461635be6bcbcf88fee7a26c532404383f42efe11cab47c82cd05bfbce4a6a4f88a8f9501051c8a89a64327b7f101,8d65b93f1c970f03d26b70b60f305e32f2b65661069b20d549a2a1a02e46ba502512e2273ee1bb0f35794afd21ba7313dccc913d8bb8766c471adbdcfd54df4f00 +64df1f976e54206dc6c7cea626bdf1ee01dc40d7ed45ee6501f86758e8d3f0bfaa689f2266f09fd0220e4d2f09310c580fd0db1ff797ac4f3f1a7881fdd88a92afc83a76aa239305db48a5183c76f32bf7e0b35866e268f3ac52a47b69e89d0b540a5e,99115271f77f3b5c90f5dd51cd13d0d7fd0d1433f1fd6469f914d1c8186754b2,359797e9576f8d383e24d3782907aecaa5b94514be0c9bfdaaa36aecec18967f152b03c207b5d05bc777bae13cf66ed9805a8550a3cecb50298a799948862ff401,9647d44a3914f1497537c3ef4f7a1944cf6a4a287b231918787b43bb04e5c4b61201e3a35fc721596b318ca77499dd57ab8261c2a7d66d99fb5d87b109bba24d01,56929a1efc7215bc5f49af262a22fd04dc1bcc71e866e8776f125c7900db542c24e94464b1d67a31f370e48a1c9eb5bc66c405c48ac9d4ab73fb6aabc8b79c4c01,0ff52801282fc91a88e0cc2e8907486ec24f69c342a3afddfe2d487fb3021d6f64b6565aed563df09083ceea2b0d9dcc498e951c0eeb9854f69c8a81430fc81000,935f36838eea81c57224e05b1ee48d492e7867db121b4c201c8d74c736cad0767f25a3c51aedf09466b769c81aef42ef22f6551f5d1ef4cf1a3ee73ddf19571c01 +fee3a0b0581bc1340cae272713950e36eda6ff5c08935031f597444554d79276cefd593316a89fce373cf8852fc875c92843bb882b3618233936595615da0b67b8a36540b71d5b79cb2ba33035a71c58b58a1dda607871aa299dfd0665d7a66d204a93,c79107cf39bc794cd2f226784915d10cb845af11d47ab05f25f1730a8e65c96c,9eb1e50fd3bcff99837bd8a9d0dc7fcfaea661aae9073162f4d12cd1d7828f6b29f08e5dd040310c0222af182f41c37ef3f5b6006c825e9902b5b61ad3c54d0001,5903dbb24523a91ea534e9c7db00412a1c898df48e76f273b909935269e8bd85404b0c77fb052a32cb818ee929eec2aae2284b6bc103a141a811c417530ca49200,9d6eb8d21dee6df40007d2c7f7c65e87410fa09bd020680dd2b4171abf78d9995cc0014fdc625fb140394844cd12b305cb501c955f2134a3a5d86a6b0ef6b91a01,c4810e1e5780f8037e86e048335c7780d10171bca85c9efd27d2025a70fb55b85b7295e35e756170e2582c2c8d12022cd183f28bda587faee22431b12334740601,83f2f5239a5aeea3e79d0b5368aadfdef798ed0e636abc50003815973ea557150957a6868bda7e96dc347484acbb6dbf51b2aeba69dc752db20743e61c22746200 +138f609a26c2d03e0a1eb313ac57281d432f30e4441daf0b419a184fda29a3cc3370c37d2b6ddd51bc952412bbaf290a8a3151b95ecf7dc223344439c61c1044eeec2689259468d31021968761ceab15c528eac8ad94ef536ffde8046610d8c97d768c,4150c1d9261426774c9e2ce30b269daeaed96726ef7b702e9489d06cc861d404,9608bfb1bbd95a7b1949d9538d1d5f96bb3c08bb9845585b59ad3191f6c24a17113b2a0f6cf444a5c2992c970215b493635ecb08500d1a38a269deb2184f28a900,e2be4f2665730db28b0388556e32570c71b3d1dd20a580f9b694e8ffefa208191319ae4c047fdfb0c5af11650155f976d1d08530077eaf9172f498e6affd736201,5ee89caea3ba2bcd74c1e152190863615b973b6ae12b9ec787f7946d394de24b5804374cd8b61f4fc97187e89f4986f10f047bef96fadd0bc3e71f6a957666a400,41755db0ff5bee88de482c5fc770f4dcbe0ea7192d20e09f6ae14f026f397ab8423c589d44940e8e4e1fbca2b5ac8c9fa13317b2d47b37ee755273a39feee9e300,877f4fbb2c26b6ee68b927c7059e05ea998e7501e52f75ba8ede93a49b20bcb271f0d716d71518ecdd617e96b33f7bb09f11fb5bf68e39053854a89a0886e71401 +d8d5081d7da7bb6d5e7c5920744694dad766c3c1a25dffacde15f38f29633c58a30455ef85e07f60be5bbb86dbf227a49c32c9b1f726e47b83e194869a3fe4df60d0d233f043a837f78a5d29de95231b2e6a04d38cf087aa4508f761602dcf8463c1a4,383b89310374a27a2d441cccbb7971a3372ef8c55dc27e837c7ea0c995f0b7d1,2f46a682c45a36930e7bf6e4c2573f53110fb8365113c66382d19bd05f3dfdf0113ed9b3dce9acf0646db19543cace65f08f6117cae54c40c6c1410049ddc88501,ad379bf0a0a1cf5496150309e7c82618dba343b6fe2e58c94f0ac6d9e3d5413b5980e824047589f0c8fc1538464fd6b53f5c4f26ec509d836d2c53a31dbe259e01,c3ac006cefceabaab050475d69ee39c613e94110787825b54b412bb1c2ceeec611576de043e81424b3f67d707f42c095852d9b5e4cf838e8e3404551aada9f6601,30d6619720b78b81cbf4ad7554862112e8cb06c9ef9d5404f352753bdc37fa992f493fc5c19fb2671deb6c1b578ca4d6d64243fb948c5e7e679e8079a098570901,45835d5ca83ed7ccfb14acc39d09045c8698aef85085b4aa00fc51422e6465b95b44a28c7e8d958368f2c075291d0b6d58592722f8c3f2b77ede92e8e1282ddc01 +289959966bf93db4f89540a04d4c2c208c788d072f9d79bd2330e33aa74da4de69779bdd966b5558592855e67c8500210157615a921bb1940bad43a7e815f2671bd8c87eb96b36ea34550fdd17887ef16496a43b03820930e6f9817fd05fa38192e1b9,de2a9dd1cfc37f490f8325c36e3f04aca45cd330b7d76f71d86d4bab5a6b22d7,3109565f1be484e96d4dd0ecb289c4e0f2b5ba3bad20c2143aaac99a3d59e8962dd97d4f53fb797b7743c7b4a9d1804caf71712ecdddcfc6517e9b62b407195d00,c21222a4a0dca369aed371644a6a28b6cc94d31caf7251b05f54c2b9d4f6a1813c7e47aa12f50d40fd4a1ab41357e72b6d451e314279d4d9f57b24f15555a5db01,bbeb7b46bf41d26145ecbd9e74cdc830809bb684acdf727acd49efa236293f3f082cd2c9d002f3398a012f10aa345e9eb86d50e61a1d1ce9d6ca708c0c8190c800,8dfde6b747c8e3562d66ebe1e88e9792581d796fc4b03c6b98d39f7f5a31cc5058d26027f04429f1f621d469c5fe7a9fc246f470ddf928d9aa8f170fc0c04d4c00,87cb7cf38c73be7bc42a40625642f4127660e02ea8a3a893fb11274d5f106c4f1682d9ae89c293b16ead6f56e39c877e80abaf184b3ec0fedee9c4ea946ef3c801 +6a09c8d75ffc849060861824a1603472c6470e8cfa25beacda4b64c962dab30c81e323aa58caa381fb31f2633a9aaac9e28de0905f796a36cd439dd2279e79f7df7da7cac06195c1c2a058f36c972ceef4942a51073aa87796c01907fff533fac7c7b0,6e7a42b74d5819895ef39c83e0233f0f6f2e5b8696ca8d12ac999a351865f835,79f6b060fdaa85fedf89c061c8acfb2d9c87054de251bcf14b44df044f029bac712afdce1fc1d1bd4b1fab3ff5f0ff5350c053fac9a7ccb7cb7e01ab5bb41aab01,e918c5072eed8ead74b9148da9fe291e66a7bc53aa59a29dd442d7632c8c84f12bea79c2ff5a4517a9fc594ca76aa1e10904c01e6821111679599a5ae0e058db00,c29a2c4886882f02cdbbc4585c1c9598b830b09f146c24e90e7e9e80f5abc7db0ecac076009a9ac4f8ae2355660f5a69a1263dd57e305a4909bf1be7849361ea00,0b1c60238a05ca4f28d6055c5cd175aa84240a69d169d38fdd2f28d80b46be2716194419325708c2e2f52f4f02fbd159db5319edda80e4ebc1dd877ea1ff7d3900,d363b339093541afb5e990ec72f6ce9a6f2c438f43ca8a02817130da8b507cdd4025aeea832c31c0819cc7ac60716bd15f453481e7019bb7012ded27c05a677e01 +3371a38b4adb3bf07abc6a56d073d4ebfeae9cb4826f63ed9f5c44a79215dbbf1755df18913aa9e3b3dbc715aaea5f916d7ce601a6f0735d77360537411c7b5cc1f5831edce4e99e48f8fe118b8b958c0b607c28fc6b7bf1eb433fe659e80dceda21fb,2f217240b4d11b8f119f5c690d90d15eee7bf231211a657c428ed9adf144eff2,7152771e97a214a9cb8b304263568eebb6be03d437bed0f6f345b804deebc5bc6759c3d9698e0215a838b8ca6075d497e2b5e4f57f61306ffd19cfdf39fdbfd500,e55d9a825532fc5cf747afb42670380c3c36d09e26e1d9cba7047f91a5d427c70a4ee9f77f5f66286afc76b885b50842f984ac7516647875e4771e4d78a4258801,81438d36db4493856e37b79a0e8ab6026af272b382173090fbbd3b10bd5c547313f6bd9e4b6c43ed2a9e2a7402a962dff4242e6da66daf1ad760da4895f75a8401,20758064004d13f9ce723f067935865879f83224c57c90ea9e340fd677f01a7e2365a50637fbacb47eee89e5c833a6b190956b26a39b54ef48376176743b92d501,0950582c81d9c0334b3e1c6093107f82b4a1c98a21d9dcc84a7b6a76a3b5681b0c0a4e9cd4fb20e00dd9341065521837f4f61e08a896b347efe8a71008c7392b00 +6f2b0dfed3581011a3d16b80ef0db3d6622900fe5a2056fdbcd9aa0afb2e74de11e8ead0f771eaf79f2a6e95130659a59b4146cc872afbd8cd2abfbe6d548aae46954b973d4a0dd24691e07531ac30f26e9f37d1da1f22dd594c2c06afb480c8384449,e9bcf1ee43f7a140c3d0b04ed584c7e794881138847eafd464bfb9a4bf0b1b46,fab5506c321ad3f07736ba24add89e24edb8628340aae77d6977434755f297fc101f2c0dbec0d61b8aff1dea745cac91299eb6120b098d9565afa7a731661dbc00,6bc997396dedf7158b888c9d35d3ee66901684faf812623a34c501944e87c5d27d30d81346a5dcf8639adb17b655abf9a03003c933070605fe6d263dfc06d69a00,5d45486f62fdaa12163151dc96f196a1511e2c6cd899be5c5adee87511b289f437aa7f6131a7f83880b2dcb5e68f90c02637f03448ffb351c28578cb8015450e01,b6b2a363a535d88879b11267c0da9e6057d45d790f099c7762400766e2338a5b39a14d532655f936fbdbc7ff623329fdeb5ba4b3dcc4047e3a1f9b617e89152c00,91b66234435d39b4be8421a4f9ac405c8f860f299d87b25b9c81539374c8ef07324040f5ad6ca0cb6b883a99e98df9f032d86ea52b02e07f91df9a93894aeab900 +11c910c76fddce159d98db9b4edf45e6de8d90effc9ef9ce5328cd644142ec07e1c2060c415da4887c54d7f7ea5c12b37b676a93a214ae9d3950143e2055028fc63883263bc7db80fa39490dbc351ceecd85a6bfcb0e694a50fa27a598d302bc547a3e,6877d1d76d46ac6b6deefcfcbfd631f948de7df2105c41ae8a0b5a9c98ab5835,8419248b800e8ff7134e7cc0101b5b515c454f344981aa70e3f5e450b94294e63edfd750fb1aa9732bd9a98278fc0c7b5867a90d03d8852d4e91c765ed7f65e200,5156ffbb7defc3846585542db00f112038ff391c99f331ca1670e14075d1367f7352e4ced171fe02c111938c046c13b6ab248a8b4f4abdf7c436f26956818ee000,7186f17a56111125db669fbda465c27136b41cf7b953d9d4a9ac418ff9bc46861a8dfb2079a5ef9d0559c9f018c584bacb3c504847455963d476ca2c292abe7500,1dde0bd6f2d3a1d27a0514bdc4ca6d0101538c76576f30240aeb1d727b19a2877c655561f56cab6047727a68d1424f928ef38d6a1008641395372906ad9bacf201,e7f3e2a232e887022278e13d35c02d84889b17a9bb1f929c5dccc659561c0aee56403aa9323cbddb87f90492ddef999e4c88df57a34bf654a0a8a0cccc4de7cd01 +090c8ccf008fc8e8cb49bfdbe2b078699718c29a6dc23cee42d2b98bc533897b5e0f48b926f4d0ce020bdba9755a8e86bfdaeb89bacca32a0f086cf9f2906581dd8779fa3b47105930ccd425eb8e6fe0b32028ec32d2eeea771c6d5cabebfe150fef65,9ff9d98720f96be784fa0cdb2395c81c06235198b0aa08103bb8cadaca7b0a87,3244ffb85ac9992e9c3d5485b380c8b85e1a77a044ca769d027a66d1e47cd4930058008dd8e41114989cf89636082f7a9650f3262a76f130a15a0cbbd41abeb300,5ea6e7751b80fef957df077909b5b3df670f5562fc45029c8de43723441a4a567e4a96b2ba4419b9ba8f35c422397e27e212d3cb27d6b09592cccd449e6def4a01,5ee6618415da903c7ff0d90b2546ea04674965227de9c3141681d02ce42c07725c5f31f12c596686e8acba16ab0cca90fba3243a543c986a9f677afbbb511b0d00,8642bce668a73cb682607061c475f85e5b6f0e0f5387a2e762f9e686d2bb429616eca8cb023aaefaab8e6fa0e47116e8ba891c79aa487990bad5c537fe6f4a2300,506b7545a035088e99c2458cdd7689d0dda4cee134b4da051cb91738676522fb37f534afa4f6b53902f73eb5ad5bbfe54c9e8689efc53580df51bf06a80632a801 +a8f2af8ad5f135e7a57090f69c56699253124f05deede60ce138efd30c0b5bd7369ae70d05b34420ec98ec151bba0e4ed9ac2e6041addc61bf64a01c407e71b9c432bd4be5f9580e80f46450e218b572b163b3d2ae69c5682349a5a996740aecc1120a01,6b48c8323a7ae93ef5260e98fdd8c4f33d0c0f12a637911f41e96cf7bb2f3fb4,232fdde21a3509e768a59d25f11cfe226adbb15c12301233bafec68c64d2ea2034d40e7ba1ff74a160b3d8fc05ab0b8f73f980cf4d0c36b0a7b20ee42f0cd5be01,340cd967806924b0f388967ee6c315a10e534c86ef22fbaf0fa2a24d975b69e5688d086cddaa232697299cbadebf4f8770a6d0c0099484df05ddb9a885fa28f500,bd61f1aefa3aa5f9a04f61b24bccd297a9ae5166b05510e025fd6852224effd237cc20cff3d97b7466d4cb90f4cc62e751572f3228b4a93e8f629265606db30a01,e37c77c9fa592049399d493d5dc0f82cdc053f894b918f241dda28758fa49ba317515a671e78978604819ca28aa8b7cc2be46e2f8107cbd7dc7854d66d01907401,7469037f5c350ac46d4b33a301e207c94c37db804841d075436194e0dec9d13a5d7ccbb0aa259d141516466e691d9046b7b8ea525a7e425bac895947e0594f0101 +4784c83edd21fec287aad10231a689305367351f66a6a9f1dd4ac7ea598fcdff5934271d35bf4f5722f8e322efcdeaa533498c50f36c5b59622f61d803e1abeefcb97cb88356a34d818635aaa7db9260f921078bc0be87c43713e810192ebe7ed3fb3588,a3f6114da985104b646b996c7e3309a3a57e66a367aefc1bef6a99b1a451c0ff,d4d0aefb75578f3ba1c49b89b1f118138e226c81ccfe57ecb6cf28ba80bb44595f4f2837693dddf571d9a05db1f5e1b65c29b9593e6ecd0f7b995a2707d7a6cb00,ccf8b6aaa58c93115783df71465fc923c5a492b74301b6ca6cf869b838e6e1ad06272d8c986a0232564b69e34b972eaaf5c5c42adba23e4ebaeffe83ee2f6c1700,8a926959298e4cc5a77c2a0a94344f4647a973301032288b271522d313b9066b6c2c45447e5c290e955e2c79c68bf35a000f99b1df5474bfa79927ddf01c326301,9e62133c76f5a7f0d10661c6a9a3184d36c8e47c40194e51f2a90bf8513cf10272507b847d0701db5b333c6c58b639b1e140139a7dcf3aaecfb75e753c74909a01,d6506934a2217eb8d9a1d5c78ba2602bd0f3f93790e4d88fe37765ca0e5f89be7cb9b127df0230a4a0be65e89f8f61fbc7fc5574203287dd7e4af4ca892e85f400 +a5fe01c98ff012a1ebf961a9d80d21760f738767a1672d7b1730c7bdd90f12458fd6deb944821f93deafa2aa920c21d9b509dfb17ee7cf98b77dc250eb50de634f868cf302c0fd164a8f1c0de86e8911e4dadeca12edede2510a8d9d8ff9586b9c68f250,b5d7d4c5efe65ab4f378cd56843a60f23e78eee4daa48dd5154496b811792602,9d9388be275f3bfcdadad8b0032f9a5403eb3a4e4dd8de812d71896b8827fa301d6eab6707973d24c607d7c20a84c972f3742f999c8799bdd054d24aa3ad688300,2a3dbbe1c660452f6e68e5a1911716965db66849569b1c483bdd54c7827721e06a2031006175e07578984955aacbb381be320d60a55aad8e95e9f9693339681101,346c29aea4def48138c9aff4a30440c722a4f8582fd2df6e902f719e13d16ad00584af254f2d5551547a99d28963faf7ddca794d71033c1ea4fd205e9833d9b501,22e7ef5f2722188f606e50313360eba368a2a35aee474a65fa36ca5907f3d305308df26e6a00b2c6f672a941e5583598637008ee53f2db7e4a1405b11906ad8d00,170bba2e2c9cea92c095eadfe6a89945d6567e8decd07832fa1b2341279ede3d5e6d8431a3975cfa42b9228b894514ab0cc6976e65d692f7685df08a1bd7517e01 +a14ed4687cdb5f31813c4f65f980109e5aa20cf1877d4ecbdfcc8240678b6582c386ed450a1e8db67095441277c43084e1dc5dcf187ca1bb452130ffb41a06093428c4fde7f61cbbc29fa83b27e099db63d272c9b75866bea47de2986416475d3c8cbdab,a7ceb28c3c0b987611c4511bde1bf0b80b9fa5e52b3f34786fa8e022a9101fdc,fd5f2b3fe953cfe16e623cbd10483c0f99db9ad9af1442ff2639f72cbbd50a024951c8b2a47e62ac8c4c44a7098749fa6155969d325f0503f4bdbebd72e282a300,11ef24ef57b6f43798f93a2606b492ae8b6d972f65384e9ba83bfb3cdcdb7ab41e6de048100e95e1f79e671e85152a34887081543da16302839f4456d372d4a300,10d9e5addee3bae4ac7682e294f9f67f9ddd987a5025299ce58b55886797562a0462d239be0ebba083fdee39decdb11cd11b53f47628c38bafcc314c7487ed0000,c49f6163a2c772070ba83b2d6d3b3822c2a8006646a9eb46fd2084185deb14c616fe1aec67eff1b668f20b01acfc09747bb48a62bbd9153bee2e369df20abcc200,1d4e31c5a076421e3dbd19f795068058d12c512554e14354464f8efb663a2727728e42bf0122e8af6b20bcd6555f1d7586cb9f7c86e52a5185e5788f57fa49d600 +665dfb9457757e68301645c5cb0e0694d0487d56d83d9fe3f4f6f64c4df9b008c9788019f793fe1fce66e0d561e1de5bd17d44e4ef0c51023b8920f6996baeb0e616f8b4732d21a018cadd3e8dc570c12d70fff94655ac5f0d989401ee4c7651b31b4756,7be5420f8ebff85b4916946116436ca1773f02f283f416f7ec090d4274ac8329,e43d46256df896b16c3331891410ccd091601644d2cca999c74b0102f13231795078803b2d190e4c397f12dc01e3b09428f1d614b10194bce31bc9737515911d01,3416cd69eb18e74d1e601a5512709ad05bedd53aff31cdd429bfdba968c8a71777e124e9734143a8c41fd2a3839d9b54c3204df7808bf1dd6c7b0b31a1b7f30500,3a873a917dbb24522656c8950a442d4ccf744e42d3401a3147d06239cbbecfbd519d109ad16ecad5d619700b880337c3013cf1c1e6f01f185b7ec640b159bd0600,5bdddd981f42673805f858aebcb75a1ccdb915c56351b76fe1fd2e097521dad25d0ed9fb9644bb23d16f409f468c348354c5a4c4ebe4b3c7a6164b7369ca729601,35107eef078c295e67b0b4c94730de43038eeff214247bfda68b7c8dc250fdde30ddcc6b4f7c40ec02fc8f06ecfa8ab0eb11ded9165a029d0ff6dd4d095a1c8a00 +3eaa9dc7bdfa9ee55e2beb353f957f4b384514e893b5f13550d46453efa4ab53a059c081eeaf56a43203077997cd2843d829865df57d71a6ea74b7b009fb21d2801548789af093a141e65cace98a4b88a6ea8963654321481dde9eb796eef46f7dcfdcd6,3ddba062e3139c64e5ad39ddbbebbd1afb9123fa7acbe6f239d8cbaf5d7b11f8,092aa31c6486b774fcedd436851efecbcceb858b6937057fab35cf4ca61e1dc7783089410b9684a8ba7f87c8e193933449b886a477fa5783fe73cafee4ed5eed01,1c4386021a33cb83d2a3ac2301329aa3761f3036cffebf954d65a315c3f5cb422a5ef579b9d684d22f481065a47caeb8bd8346071f466706bc04f2a962b57cf401,fd0dc5886a15e2a369cdfc6943d95b875be814f2a350d2e308b8cd79af5394b07df453d676098484764141735a37e046887266be409cf6b90d9c943ac1d6a3a500,f83ede20725c1293e93aa1d12f957c5646c99c27fd72fb614869963480ec02075dd33c72d01c63d6111fca6524ba0847da619b1fc331e5b109f4e192ffc9e7f401,4520ae0368be2b05e783076b22ffe159c91c61807b2fd22d7ec470f9e60447b11f59ee0efc8967e35bd536a9049aadb3d8dcbff8089f8073ced17424b556dceb01 +173df9f535445bbfa17c069f5d45657f860827245b206492fe99a466f2d566026d1df08c69bc0cca9909ba01abf710499c8ed0fa0a3a55aaaa3bd21a82d03b52ef93e15b662ce7b6caa55d15ab85d16a01bb97a8c7601289d82692499756bf706657ff0c,e16e047a8b549511fb732c730b6aa675c6816e4643d9641812ed31584893a548,7f23fe8efdfec640f89d15ea2f124e46319027c1ea7f3ed99587a60f4483f6a71dcb33d155bdb3483ea306807fb3f43eff1a0f098e5d75dacd3bad92e481549d01,1abb7ba759bf6ae383d372a3c6ccf7ced301f7e3f74fd763db3bdc2c72eca446414290cb8dd40758b092636515203e011018ffb31ae2806178f073895cb6fb3801,c3f0ee08bfd8f70d4d556609661a8e08bc5789dbfde8315772a85a302ef2935a266bcc027b56a05ad4806dc2741cc72f97b630cdfe1f3a8a941b7f75b89a1f1101,cab956261845614f4f3e0a08f25c88b71a90006203c022799e2c44689f5f1ba10b57b646a75457d6883cda1a108afc0f7fdb4a373dde84f28b83099a2845871401,c9b709d758c0c84930c9cf489042f750be48ea58d5f7b2d707fce49f37eef44316c2811367a03ba76b6d451f052ec6638ca9d3034ec92b4211ebf60f45653adf00 +137d61d2ce76567d2e9138e447af803079958d92d8b1c7f9ed1bdabdd8a302cdc00eb7058c30b4ea4606b579f17d74610b5b6ad932c8ad9e7b5755cf65f5bfc273d95a435f6d38b7a2433030d561e45059571f4bfa352e7d76d2287b93c9d91b0c600862,e0e5246ad03c2adf8bb03dc6876514095933ee9b5b6817d895959bbd9a7855a9,093f58a70ecb60f57fb774caf020b05bfa9639fce2d76f90cd6be116dca9be8258db1d9aad886741d870409699098bc487f64a215c78d691893a0c133d3e24f601,9f9a3a473fa8f2c664aa771a49403bcaa29c0e628f746b39b3379775aa48da4d70d3eb6784ac231c16a9c405973aebf328d898141fd3a77b936f17e237c11e5f01,4d7e8b058906116365c04bf9e1348cf69273c2aef2e4756ce0f62ad9cbb9e5993d76fc8b0cf2a3b948b882fed11bb7eb9934059dfd1e4be06fc9b328d9957e5001,6698abdd762ea21c58a5303717d3fc24ce1cea21564b4cd646a666d82826dcba58099533c5ae69ebb9876e1c3d2d80e6ebe8f36fd57e506d0829245dd6562ba000,5f617cf38caf71ff52f5171cdaf855fb0f721c6f546ac1c4fc1677935f85e7ea4edc17a78b9c90e644130ce9bd5175e062b8f6af43f38150a3cc90ef4218eadb01 +7b724a650c6e024e809b7e36b7e4e079689e1366209c12eaaaa3b8ff0de5c3dfe8bd8c526ffb269faea4230dc2f6c680aa2c752ee595ac9751011aaed7e43425ccb509f795d092887eac95c7a025f10b684255edb14d7fbfcb0a4a6976fad53c3073777e,200e4d78d46c29c396845ab46debb953ade7c2e27bda786dc5ee7371c12ba622,fa44f75758e7096796a60c449f20a2c09b5595a947d15070af47a9647ff4c26e51bfb3827602bfd5781d3ccd068aeb853ace92638a0900cdbf638ff6d23a885e01,15551406e7369bd5988d0aebc49e638c08331ef43c05939d9426387cc1eba5aa738358d27134629d900710b45de6122df95bce793e5ee7259f10b90f8f388f5d00,5b39fd5e02982845b26f4e5f13bd474154dba9bf3904df23e65ca8fe0172b847732721ae1f431185109ebcf74876571a0ad4320a44de07342b555f201dbe383700,6b1215228a8257fce76f11e1a1c924c1d3166e1300faa8e9ec9e73003d08bb266ba4b01c1116c9046a98f475a7e9f604e587d82f5812fab0195d8ad19f2bd3bf01,180143ef64621b2492a1a5f01ea6ca9e3832a2a2c4c8df432070d933ec4c738b43ff706c4ecd5b04f4461401fc46c7124bd1e46997070b305f102907e1dbbd0001 +5225712120311c8a58f79877846ae16f6112075a564d049f03585c2e2cbf8b121fd8845e4f774121102538ad764184f3d11d41797b04b692a2ad0e2ed4d45b7134ce995ef29101f1f733bd51f26eeffa0c38231092c04eafcf66527630be41e2bc9d39f0,8c2ed166b0344923fb827bfc0e6537438e450f74c85396122f3fad1a8835a93b,3100883b07aa8ab3a9a81621e347fe7e99135f1daa79b587e5f1702286a0de7a784f2b404375801e00ebfe3988f30d2c6ff1b798dc3a497bff92cd7ceb68a6dc01,0eb9caf1552f595bbf7c60091bc5aed80cc264a4b43728a362c52a342d293ff5372deb00515a59ca9b2e185e0011b5be4315b75a79cb4c7481b14d78a60acc5701,f49311a6f25729e31f2baa40e1122d7cc9627a2b59587b08a6a41425aacd2fcd6e459ef17d1af941ca1861b1ac8a51fad2d8820b179ec65cbcc2462a0746e2e301,6cd912e42e7997007ba67016590200bd515282aed9e54c96bacdab7c76839aee6513b8bfadbf5a5386cfaa4560cd64186d2aa785a8b881b0010248086b46383200,cae26b7a359e80331203031dad92ad9385f7c190b4ed3bb26413dd6b7ff51ee87d282c95f46bb03eece1a056b8292fc657bfe47a90aafca2f7a18a4c74f252e500 +4122b8fed6aaaefa6fad8163b50976b4846f8151a37a1870ca3621d630e11adb5aa81622fb21a9f1e39d548b02493f6ce18650b9eddf979516dd8274c43f9aa38001b858552a086e066c40a935db70554cdeb06e44a00ed1f15784aa2750750fd660ad3bc7,e7e915f40f30ec85873de801b2a549ecefa1da45993139ecffb2a415af452397,1e137522273c10cd79e04b5328e5f48347877f5ac0cc679f512520213a6b2407389b23e6f19ff80651a062a7b5abb51864eadfc064f9ac6454f7134cdece3f7301,470beb997dc0b91094695417d09daf6cc4797dd2195fcf06f75a273b276275901bf74353428cf00be47da1571ed11b4285d7596a5f87a6601fe0966fe7090a0a01,8df49eba91f887bab573e9956ff8c1b4f37db24ca816db010486383fc7f3eb67512b9345fad51a3e2bf4d1de62c1112c0fb689c370db4069eebb6ddada40b03800,7c2e36505a71151dc0f0d75fe6a87b0ba8ca430dd59ec4c4892897bb261a25745763b93d5ff426232cf5defc78fb22e986c9901716738b24b2031475d9932b0100,dcc32ee298203edcf10b8823182b4360dade8e81a2c8ad6a1bf5f4fcfa7485ee66886eba26ae26c722a04043e2d26a6291ed1dd7e7de21b85ff30f4a4f9ba44a01 +82f05de3e93a218d8b200a1cd1738a8ae0f727fcf35c3777c7683e3f3ec6d61eccce1c2b62db7142f816294522b8ff5d7e27d348da2b24351cb153d2fb74ee45dfe5dcbc0ae2685a26725ed2e145823874e1ace173242d117aeae7a46018be264cbc1d932b,dcb63b99835e1908c9ee590b52680acd8e2ca53c2f35745f1ed3f8c423e4eb05,3db16e720b00b9f4bf73db1cadb5a37612a312fc3f357072147752d43356bd530190c93231e5aab93a82f9a44279c08086ac3a8d63ce3cdfa936e9567bad0c1601,419c67c6d293b3cd6531a5a449421bd128ebbe1c0cd8b1eae6e9fb934b6237a70ab6df0d8da606b88b15f038525f79edd0b0d6bad12d7c67165435bc6c34f96e01,ef0c62d9c1dbe2e59459607d97046f5300501427044a911321be07964918b740001a621c42493fcb5f79896fa3b5b8e1a785a68575e8ae1ff1e2ca5120a0bbe801,d1a876603e6f0011727a390b2edc9872c73e2e7b499e675010f67a90f8ea6860378e560288fd6e48c691a752d92c8ef72edaa658d1fc80e795cd0ba2ca889f2301,36d90f85c4f23093747691a4aa317abe9d674058e64618d564b2c0ee831fe7bf1b67acc33e3874d2bd545c0c824bd2fdf016afbd421d05211dc6e5ffbc5fa7c601 +e2650a94feb11e367e3fdedf4bf049a2be3b0af7eb27a9718a050c34187bdbff17512f1ad33d6541bc0a3da36b8da6abf8ee8db099a45f78e8df07d51b990163c2bec5252296bf21db9a98d6cdff4fed5582c4b69b0ceac3fe2e9be4067c8a221a74de73e0,3674f775bc17ffb54e954dfe6a0530d18a13b74737389a70fb201294ce102d1b,a2de6c5c3d3c1c8638f4f53da8b4895ea7a6177313698d70d3016ad1dba78db61b522cc9bef0e2b83ef0b39008399717174f280808c624e66e465b98ddbc492801,e292a3f7eb64cf3fc8cc17b399f5f3fe275748dddffb73a81d37f2d67f80803c1d3bbfdf951d274df797600e6fc7f6f06a5f2968fa3e233ab8293048586e9b3d00,3fb03196fb2700350e412bc0dd8419561ddb4eafa056cfd34e591b70f7e3b911656b8f0643ca0c33b3efafac4d09157e13b253a0bac64c9d9502927d633eb5f900,5b5a900fbe2dd2b2e46d424c46bcf3f55c8ce2d06928de1c6170d4033003d03e3940c5da45f43affad1c5a96fe7f104cf3c8c5d1c0634e172f162395bb1d828001,ea2a15a761e9489ee2de91783cec92ff56d9c711ee94599b9da3577936f792cf19654dfd198fb3cdbb19d8839164ca01c705423b4cd461abf858320383714cd800 +b8e91f022acff6abcfd11c273a82c111cce200e55dc7bcfaadff0dbd3e3a5880c3764a9b1eaf0d69d25f661438e64a77d0aac7b2ab62d354e8a4798e4fc5c3e35e3e0aae335b08de34414dd415096af85008480e261043679a8e85bf0874887e61cc6d7b2b,13bb69624eca770c1bc27678e82d17fefba2d9a561c3cdf96c28b7264ff50736,2327bbe7488d0a2d700cea7e6205cc24546fcc9007f4c9b630adbca2728475fd2fb1f3c73c63dd3bc68caf3447f52ad202071c6233189117b8813d6edb48b76c01,f6511926020967af8f5489aa98684779b5cdbca4ca98b3f5025ada98eacacf7902f6ec1bcf7124806e2c3da1072ff5fbce8b0b68fd291ef64cc89ad859f2a58f01,9cc19601c9ad40a2e408a110e908cbb00916bd451c4b9f7a69a0a3e228034ea32d109aff267406134cc68651d8d1681497b7147ad612b1a007c3c81ce66864b800,0a11e45e3efe0ec754b5829cd95f58f9b6b03f8ca378e13eb20732a7102cf1fe6750e214732ec187e92a600ab63b8f2f95d67ca7f45720293f307789511b8a7700,2dd7e181fd638e22dac2fe76331d76656c4d352330cc71f0b81a46e6dad6916c794bc4769e8325c9bae4fdeaf31f9da639539e365341d5901b516428d16281c001 +7b4c25dc4faf1089a2960094b4a379dd979bc8e4ad1e0130175237d8ab9c51f535f44a3ede473468d0f716f6f769f8bd855456a0d2c3860e8aaf17907135d13fdcf925cde6a6cc9124abbdcfc0a7ae0ff0b0566d5c2cddbd048a0b28d0639e7727aebe27ba,f460708922f68ccd350f8d2e01be8b5579195112a5ad3d90688e2978a09fef85,f635f8372243f4a8947f6b0ed2548eeafa1911edc21a9437f7fe9263538a24ed49b99b803c7a918b61c7961c588df1d790be95ac2433e199fb3fd31b4495758200,6c5f35dec17e217280fab595ae0929f9f7723bf0cb5832fbebc5e8d23d776bce4469292ae74a6cfd1aea5b23e83a1905cab33ebcb141370acb782ce4c6c8c7d601,8438419c500846311a7faf1f410d171092bbcf2c306867758a51b8b153fbcb045e917aae4472cbce1d877ea958c4b9eedc3f72cdf5b4640776f024313dd9c0d800,1ae08e8bdb437f8ab0c7c71809b3caeb421fd3f7bfb5dbb8388f43b5fe2a90bf36ac7237a871b8dcc781bac0c33100c95808069cb86b3901e92582c36d0d3a9700,b5196f1fa8c907fc7a73457c5ae80469b44f16960a76f9e07969a966996b6e05587f6423a109c328ed4dd154615dac9e76b91431906edb97aaa13a3cee99590800 +e1d5606aac36ffe78de95df376fb740e68a99ff71bf1a1e53e73ae776b51a0b95c06c1f02438ec8c3dc564a72dce4ff019bd9b7dea3ac66c2513c6fda9b44464c4964fbbc6b48fad206d0d114453f9d9a7b159f26b7f0d64891f2cf0612cf2a3e4664bb73b,33d9bdd49645a09375a2e39ac19d2b470787ae229ccbb436c115e7b654a28011,bc9f2fc3705cffdf9d5e901909fcb8a360911004421bdb5d4dda499c1b6ba32723276276032b53b875937cb37dc271f15bc0600ad42ef6988b3c6578b675248701,1f76a8778417149a6005f44d524fd6f89a84cca37efaf5c60dcbf51d161f5b606cb437bc404650f1c5b963fe85bc1a4b0bb3545531dafd29c1319019103dd38101,f18b79fd5fb7220b2b03249400ab8e6beb0bbe06ae64d0a96323f5fb4f2a952764718e36fac9837135f46f02b128f3fa7fad6d95698bf007eda16c84ef40f71b00,46914f01fd42c55489f525e718de7b4c1faf3754d8a555371ef99253839052980b4da2027714b4e17469e583cb76d7e3c8686a2b300766b72f38bda081b7211601,a124b92c748a527ea91706f45adf809cb065ce91ef88df5470ad7c0552d40b4a49826c33796237b67283cc1d782a99cae3a47581b0d29b8d435a581b823ff5b200 +7a73c1fdfee98ed3b33990dc2e46b2d87be5ead6a96511951f6b1fc690445f39b42d39cc73ddde95109f1541c09bb349984ad8eb8b1ef2cf007d8b33e2e30f5c7f824706f53ccf5621bf19ed4d5650f6de685e17f2144745e7d75dbb129fbf5b72eef038ea,251f33fbc1ebdd3acdab2e089cea0da7bd7abc14e05b0df1f1a182fad39f1c43,73a00e38cdecc12d3243e3de0d78ca19fa6bca94164a2333b6fcf10cdb9252981719bfc5d128ba3a9b39c4e181eed128c09e56bca309be092bfc102847f4093c00,c9b9a305b13cab9feb82555532f90efcf349035ddbdacce4ef495775e43f83183721320f4a320cd1ffadb24d9458788b79093529d812e068aeb1db6d522b79b700,3cda45de6917b576c88fafcf073cec5650ae4266753482b97f1f230e6392f93150228aa2ee00d2b23f776dc7efc470bc5f9d7193cc349b0388172858c796b8a500,f5a1d4f6943be646e8f3302e5ec487e5a6670eb2c85eceb911fdbc6fa890b6964c3b889e2de3f5fc49f7433998cc70daa6bc38535fe4653769c68a3522bb9faf01,6c01f25183b9ca971f3a9192aad1dffdd53f81a3b9aee51368c77b785d8852572fcfbcb600ae7aecf26fb566a847612eb9fd6de4b2a963d20db1e7827080fe6101 +4b478afc0eb29c22c243b5c18c1b8b7a8c4f338bc738b17e8ed7fd727aaf6c9eb29860695fb7586e34b23035b85200e5927c30f79bbc0a102b0158cb927ac2098403f05e538d311740350d7c1b4b2e8afb3a767db623450bdda0c6dd2c1baba7fdf55b427c,68700c32383f289d7e556730423a2e0fd4435736bf7470cb2953765b9d112d02,5eef1fbc9aabb7aa11e0aeb6c1eac2ab39a5ef4926657db76daa92b9112b444b3c12e1d12f69893baa284c67aca39477d349d41671ec1403ff7c94ad0e2509dc01,45d012773911bfeb586dc2949bf7b1209df8b34c2e6126952687078e70645a186c6d8b1e2ae64dcbabb41c68a5d780e370119662997803c07af7c9d74583320500,e06d13fca4856b273cafe2253509a6188b8cfaaee14a8b75a346fb2b667e359516b8c84a6db7950686938a32155c9dfdf51405064f7365fbe71066b430dc2d4d00,042fc7e187d83af4918441ed08fe84e44878ffc7351a363dbfdd86b0496f708d5a2638ab14c2c04022dce279fd81a626187ba7819c5e55016cb3226d8cd8e61f01,4bc9beb36d636625d9b1a0aa8f3f773cde3668943eb4abcd07a97297fe93e9dc4a63d398906ce6f75d0b07288ce1a0e14f65b1221033f2cbebcde9081736e0aa01 +1cc362cbe71c57fd4e8880aae68a867e0065cb560a875fafa99bf45a79f394406ed3adb590dcff5cd569e02426c38a5c532fa0a9b96c9977ccc0f259a291aef556d576e9159e47ef8c4be1bd4044749360986b316f22852238d4223cc24f8997e64b3bd7d7,35a6ee1855a335b07655172270d8c9947986eca1c57bd8970d1ee7d9e26a0a13,73ef985e795aaf47b8ba3f5e6b822cfef5fa38e8e4f65d4a1611609b15f9193b40b8c45f00307c34c14b424465c2cd88ade99c9d28d36d19342560a69e3232e600,98ffc305d89788e6150d15014ef9deb7b54875ed6986dc79e94edb26c5bf0c3a31de2b9adbacf978b63fd978fd77c7c3021b670492b77008c3940be45105ea5200,24e6163c04d73e828c4eb07c36c6714f8a46704c51b02f03ad7f30351d3bb1b778494313921352df2c845e2fb464939e02246622abe04336cb863e826e6404ed00,3e712111fdbcebad8903466d538f617f9c3f6aa89508c7687452e76e991d12ad299c59e34a16cfd9587ea6ea292f5bb62e6c60fe9ffd616c1bf01bcd9a726baf01,144dd948d220bf82cf9fd415b07cf24192767f936c471a4d7958dd72b4f326ac7e71303a23af0a1e78674f3305985d001665490ad8c32b0cdb0ba291b7edd8dd00 +debebf5dcc862b58de44f63d087f3d366fd9252cb01430140747069e7f401bd523b6e7ece7d7457e2541659374ace77446c26b63f7c1eaec7cceed8c4bd4f68063b88c680d9dac5c8eff992e6e499917ffd0fd4d96aad01ff50d17f1863f7560ad7e948834,13f5a9aa91351efe130eebea04ea4b61233e13c543ff3c9f5ffc1bcf11a56a48,538903048a0d26c61397efdd5e821f19ecfb2b911156e514c3381cca30bd241911097ad449402040d4569d4c840848fc8dcbbd3ec1ff29ac1bd1e4247f586c7600,552e50ec2b5601d2ad9232060def4a34d33988d79169bfdfe7d3775bc213be532b5fb66732329f7ab0ef7f68c893ef5e84c020299a4bd74754985a0da14cc01100,5e58c8dbcd68c1bb3f544ae3a48186750832e5847774e6ec5b7463fec696f8f35aabbba3501583b13a62ab8841890021914d82ae30689a5ec6c8f9c4bfbada7200,87be4d745ced47ddb8c1cfa4db85036fba3d0a7c76a68e2c70d073987caed68a010cfa37bed22c5a59c4eabafeb56b0fdaef7432d6af1a17960ce21dd948d3f901,17364301c32f45ebddb670ef37952b9e2d2482bc977ce36b2fdd65f970cf39af5cc64dac59850a2ed7c51087722ed0a45dfd565dea41354a13980a07df676f0d01 +c97758c10b5e0055522f5bd44ec642c1ffe085ca789e0e562d62b19b42dccc9b95fdc833497eba8d6fa2e68d4a80be7ea14873ea18c0c6e1e1768495c8822d8067086e205c40305ed21636bac6e589df561efe3e653b85a287b2cd5202bd200d761fb1a9514f,5992c11b18d753484854df5b4457f339878b8cb6bd36ee358c5ae96ea2087b39,50bb6d1dcdfada4819c6e8b85ccc5fb7dbad7cb9b56279c91c330dc069afa5707fadd667bea7e34c5ed7bbdf456df7d111125e5fc78f91e1cf2e227cb65ea46501,7e2b6c83e3a27ff6017703faa8c28e57fe15d78beb4e0dd121d4eb7188768a2469ea6f70e9af58b2f1559d9f3e39a901512d20613227bed6caefde17f82b5c3d01,da1a6d5d123ee929290f0369f60087311a6184a30f5724498a5307f3e84fe1a53eb2f5d5de9635e1f20034deee300c87b0b93458a63b21925cee76bf78dfced801,8113222379c47300fe343b18efd964b6600ec1617445b4525580a7840d43cfc67346c314a138c3cf4cfc11619692f83e17b084e61c232d9b973cdb2551d45b4900,f2af53ecaa541368b39378b584978d9b4d57ce27821009be2d82f29d32b8909643594362271f1e7e393208f35607d4ca46d7514f24663bee8a26e6216885e00d01 +b937f70d5a85837c3c06287d3a9660c2a460824bc27795459a48dcd2d1dc3d6f4a052a3be7b549829c4fbb8da080680ef91dbf235b839339ed810eaef1fd61dfcaf6b5f6e412522adbf04750bb1ebd533602ba62eff775fb822ce17cf1f0d72fea0e5eb248a5,8845dfaf287339658c48be20316901927bad7710d2e0cd6b9b7856c77c519ef0,c30ad5e8b63b800a570322ec9dce4ea5b5e3f5af81833dcfdcb0bbcc1d66b0b70030d5039b19b5163bd6f5430fda137c340e0aaa0dfc69f2cbd7d0af91e4735101,0786bdf8754f4702b09cf901db5f8a8d3ef0442af20ab84679593a00b21b817936ea350968c322e40d9618d9e5a66e45981512117e0b28918de921bbea592d0d01,afa571bb2b2be8b858d91652147684d2c0f5f42d441fd2b78c2d72d96bcf151927e1896c6e499b79db42a00c456e0c9b13db71c3fe869525707717f511bd507000,f7010a1feea3bb110a1b7d00a7c8353fd297bed2d125f529f590ec88089bb20b6e8e9be56d6caaa3ea405df9d8d3bee014239c93cb9a6c798d4169282fc0e4c301,24e86a08bc08806b492c32243bbe1299b3305f8637559957f5c9ef2d1a68d2b25b3b8a38ab48c0cb9de858bc8306aa1814fdeb370bfada79fdd04fb3c5b5834b01 +e95152dad6d2543841598bf8b099fe3bb599c9267dfb3ab5699446e99784567fdd0a0a82069b53b9749fd5a9947acb74965551589f184d339c7bad3e7a532559823d417ad71ab3e4d791e0380b391f9bcdadd079ddc1dedcbf6ed11fd56a06a7677901205382,a86e243c93e34c904406ce4823e1c29344c32d7edd113e0eba8312c07d6513e6,f44ecd8dc3dc44628fa411ce6f91be4e183208778f3284785405f4f02ec7ba6d5636a0d1645011c818ef219fd574ed28c17a150c4c2aa2c7d9be20b6fefaf1d700,082b89768d726d557cc8957d721aeb1dae97c5f32bdd8ae35aa373d95a9cdce814c7e40a8d8fe4809f7e3a3a39d1d5b7f0a80e89bb6dbd7b5aa78b935957287b00,972063c2419bec0c86e357c5fc0c76a3e6b9915fb9c4ba03b4b4dd520e3855c6568615c0c1d5f8a76d668e11d1143c2f9da4ddbe173d1bea4ab72a5f1aea30fb00,21772b3709d769c9134dcd946161e0f71c8fb2f2db2046ab1aa7779ed50c418b6079769f486482b7038edbef8ff24003b33341854955ccae804c0a4f7d55fa0800,1d6850dc689bef7723bf1f0e1ad80540f1b78589ba8c0713ed66a7d34dbb9f0842125e9a151fd53df9c62aa66c68ab6e8389bce63ace8f6fbb991ed5df9e9d5201 +7ef0e432f760e55d1ad9f5839eedcebaa3c0924bd90cf936ecd76a12dd5cf36d39a418367277a847c509216ce2420c9ade82e8e5924482f78bca3fe17d8ddea2ec10578f62c262eafdd896510d274c91f54438b0d30bd4eb9002adafa4a6dc9c21252b7d5e5c,bb7d93a807a1a9ac1d6c2a0d5a0a0778120c7146470a76805cc63ebe218c9e49,b1616e986d9e7715ee58d0a8d1784bf92e5920a8a1f0618ba2286bf59394d10904491fc7a96b33198b540b98b97216eaa31a6b0c18af0ef592e99685b47d5bb301,2cc478064ebd8dda54cb8c889aaabed0cc27bbd594c2d6beac1e341213a76bf362dc876370305e087c23cd57bda8df716bb81cbba21ea84ba5aea26c3bb9620200,1716e8ec44eed0bde6d1f14e4b70315419182388f7fe1d42750888d96656a08b4fb545ccfd625410c9837055f9a90614b71b42331705e062e788a4249b7c4f4200,4ce91ba59084ce8d2557af9cb228f0d13c0b7b92600d12046c3f7d15d8ec66620283cd9553701bcb598aa8d41768d466b9b0cebce55e649b46419b5eeebbc00500,806a6962bb416104358f27dd6c306f7dc45651f2094eeef6c0080c0aeb8717270f9629273f41cb693704e6a1a322bc7e1ecd0fc467d08cc966a7155131c6181700 +8feea3f7d2e9f1fc51f2ea09e8e83fa9c8b09174e472345fbb4e021706e10d800c4f35aa166adc387679ce4a3e97a23cb1cd4fa130da10a5cc9b046b8eb406615e646593d6dd939724d5210ba0ab4835ff9953ba9d1ed5b774b893954fb3daf298e6b3ccb6df,bcf4f87e5f2a438319a0f418d129f4ae6390c813e057fa2808001b9712aad75d,1ac2234d542de7c0eb39292743381a9d2445eba7839fe6cd02631203909fb80e5235fa777a326ead4f917a0cf8e3e064939247df6e254fde35a5593fb6aba95b01,3846ecbf3bf199ded0aea534341b91521fa67a608293e4ae43c5b6ad281262ad426a6ce5ca4a3337ba87d8735888ba94af642d4c545c3dd4e46087bbd5759d9000,13473a388825b90ccb045c480aef666a7fc8a3aef2872def5247d068f191a43c0573499306336d1cf8e385ea4d8b5b20dcf4ad7aeed57a20a71eca491f86471401,3ea8f877894dc7f8b454552b9438716fac70877eab600e4a37452db81deb2e861e765996c8c86eb9139041bf44e4749257d6218c6bbf047283c6eea7ff0eea1601,d5b080a978fceef9da3fca42b0e808e3f49dd377e8d75b5ab404de503c482ff20c869dada2f54adaff025d6df900d34ea5b1320f5a5bc79880c1c4bc6cc3a49600 +fa42fefebf0c518cc81a98acb17c2922dce6457347f5d39697ff1c334fc32575d27b8561bec6730e88ccad2ae9aa2ceff1761b2dc2300bd2e77f1409aa753cf5d6d1e9a648825a4edd57399056f11ab255421b18b49dce0697137310c4ce7d10f54c2937aa75,3822188b35db27cbb2a9a372409e84b2aadbc95bafe7c11398a6e59e260f8d36,273315e7d2fa9daf7d4dd340e9cf22d6f9432c59ae99275991926caab45e1a1c5822d3ec9df323cec345847e8a35119ff870db1a51dff919f16872691247683f01,12b441dc9eddc480a7612eff6fc4c6c806838ce128e551a1bde7937a839da064214ab0968b4308d0bb2b1d15bfdf040eb0d92e8d9de5659982072275f848da2200,322ae0cb16a1b40f5a1c15c7e17cb526aa4339b93cb073d87b61f35c65989d8f737bbe69798ec9bafb27d8e65a43f15d979910488d790d91f743d827347d31fc00,47ad6fddbd9e5bcd23099afbe0334719ae771aac0832fea6718031b5f123ef52244c015b08fd23a02539fb08b1ec3938931a53506bebdf3079f95507b4d9405c01,f487fe0ebc8019da99e75f8a8d1b350d6bee59ae438bd3f30e0ec42cc94e8b726aa67f6661ba84780fac8fe70d96c6431bb2e8e1f6db8d471dc5cbe45743cfa301 +f26d6c123c174bc679a994d843369e584805a47f7aa4c33ecfe721ec7faa030694863205a0e2e480a73949906234cd6308dad2913c5d4e41f8fde23b76cc6e6cb50bd2e106a0557ff60fdcf9dfba12072ada11a7223db4c356874cb6abbb1019161de6c57549,7dad98d4dfb0447fcab0132baefaa292ec1faa8bb3b5c79e57f817bbb72a93e4,8188534105c1213123d3a600be257bd81d8d562231b37a675af46290faae00c71e059595e0af302deb3ebd72e14b4d3a74703b1451e105ecd7570c10cc5808fd01,17dce10be930a595c03707e4acd0228b6b966619be72b0a9856859418edfc87b7c50113ea02ea2342aa6dc4a92934640861ade9364bf8c7587404dcd2dfb0ede01,309f3159f1f46cfb9cf8f2720049255abca1b553755dd9884aa61cd832f3cf402cf160c6f6a0e4f00d9d09641fd3419561a91e2143908893fbcf9c2284597fbc00,aa451b5dcd535968f1eb849360b0b59d76b78f665c3367d522773f90a89a1aee3a08f25b1dd85c708061c7b55be3c4d90972a8af542e5d1022b0a25035ffbd4801,c0da565c7135a4c815204651644bb1a91d915b3bba25a6f5b4e768711fdc4f6202a3effe104dc253cc3ba874b47fc00ece7995a8b0dace6ef0bfd7969908110401 +be1b7b39114bf17f9baa9b19a1280fc0d5dd2b02e43f20ac58c4b67748089c2bdbecb5af9a6c10b42a4ce9a0b07dab3dec96a85ead954a0dc7c172ebca932dfd0a1a2eb5087cbb7f3be77286a62d2877bbe78e65fe516ff1674e55118c9843e9094100fa0037,7d71564c97eba6638fb3412451c182556f707b72a1eeeb8af17f22f242275684,8b9d5d8a6a158d6dfd104e88c06f03b93b0c73ed00677597b8bba3fe975a8f556216cc653d059553f6a3c0f2640bb7377547e756b9594a7892a2412c5e37fe5201,e3a3f886f701601834f193bdc308d89c8018b65c7a9d4b767d0004365991fb700e254d285e7feba0feb78ef72f803434bfb03d82afcbfc86c4c4781d44db228800,3f684031ea20fe4b8df0f3cc58e460fed8c1848d9fe822f579ab3151b3ae07546a07f16f15737a7c368a129588d0dc1129209ab9876b481a50340aca0d128f4b00,5f5bc708e5f193615906664015a080a48ba2d534a2389352f476e55f27caead00c35170b4160c7e406432b570c30134e89d2b3c0128becddd1d3b7376e88751601,b6a7f442993c05e275c77827277078061eb1efc94c4807fb66fa1eb3ee50b64b0ccdb99a4d072b9865c28a36fd23a50abcd5b23d1d68bef9d8f063121211831c00 +e4ddfe22f413a0a50316ed63fc207e7d949e9632d888ec7ace60caea409d9fe872517d5a487f3f5d2abc6f6f901b75844d75053f75441679a409cd5417f890873830bd0ab18fa00b4b792359f0c4a6a5ac7142f0f58a43d3d241b683e7bd46a4e409797aeb7f,1e467f8e1bfa9c7f54fcdc0e6c039400133113a3c4d5490f9878e25a78ef33ca,b3aada753d555bd6999cd7ca73e07e0f1bb6804b069e31a2594ff64d0a5166d85f0317b2ebe7f94f5a668ae4e71a7041a2d34604055886d88ca5f04ff37dbbf101,bc2b7a03885bcf392b828d7d81547958a9eaccd76290dc1f71690d281e19baa668e1704b87a433fc8d14471cdcdbd5da1068d57d53f2a3ac3b464d845c71d53f00,4e87e07161fb13a1a6e583ba5510d767c4abd4d1682175585d631b7ffda42cf215830a0e7280351805bba00023e44869340fa3da11182e396e09c729ede407bd00,a0726019d40f787f676d977630bb25f0c561c7d110bc91197f8fdecaed287f350bf2f1d11390172ab719b2420aed26fbb3481d55b7567fd0402963987b046c8c00,cbef4d3ff4794051cdfff25c62cc32cb6fb08082c6b95059002e953983bec89c4496765920f6d67199758130db2c5808525dcbae5b2d220d2367aae1d91634bb00 +6c30abf2026b1df0ab20facf05a99574014d6d7ef5afac669b465bfd65937c96f4564c4cf6dd3b93f1f6cf04e8313973e194ce1df7ace335b0ad4b9a694d7a4f2bb18ed59acb22e87f7618dc288a89491a48cb868ae2f1573faad8aa5667fcde416f71f39f16,fe145abaa2d2e1421e812040800a3c93ceeb63cce036bb2a5df1d232ea81a36b,5f362b004b0e01031283171bd35313322bc11fd6b2acbd4614e58f2765ae9c6c1c113293214746a5006d4b4e1d65d73479c1b46a27fcbe3cbae4bcac7dfc70f301,229b09195d8c0258bebbca79ca90d8a43991e361ece121e477d8bda6feae94814d53ca29b0466dcb5ded9148accfa33f0bc7a5be0b6a9a9899d746f58468eb7000,5f58db77151257faaedec44d8914331e38f90a2932e6c25506c5a08001b6aa926b829dde7cda8d0b51aefb7740c88454accd706ac2f08a2562df52d16a05674e01,8e3ef793bd2d5f84fac147f02b0eadfd6c3304e5fcfb565d5180ab3f9f87790a36db52ffb031fbfce95406405f59f6e8217c102a6cee3d0a41ea1a8879d3c2fd01,38d115e135c6023d9bee775c07524dd8281633e141b39cdbdfddc7da08110146330a40b6bb3925cb564dc14d35c0880afd6681ed1fdc98fc39ff4e210e9d860a00 +e240c622a96a479919d5bf8a9b4f620e86387eb8ea4651c9eb6a71b679d3d7c6fca20eb249b120a6cae9107cda63e8753e8fcee8d7df5dac935d98e234802c13faa7ef26c969371dc3b5a1008c0b14a16f8f31cf1f5f93135965092c87b5eafa4d7febcc4e11e4,8ce347423aa821cb8823628b963b0379408c3e503a8932dbd10a6462be97e2d6,50bce691c74dfcc1d23514af615bf85d62e484439fb1d697e18df8335f5f823b72da95b8d0b04376e5160bac34d3e9a771f0d5a36041978acada8c8a48d22ce500,84c0d07d31e8f2bdd135f3390dce0f047e8b7d8f584e407d2250b75d01f4f98079b0a75f8ea97c463cb8f8240fcd2838f07add24ea7f45ddc7a28937bf1124e201,61ae1221cafc0515f8417519b07e1766c0175bd65ffce775f026f19614d3ccfd0a8c8c10f8f5fb386aca01da1e9f623bf1c1406f1e05de04b17e4e3024593c7600,07a3c34b0521ba3aa52d06010bf7aabaa99a087bf2c44e854aa9a7f0040004276daaa986f4ff269cb6307b03676e5bf030f92ba44c9de1f59313615c2069ead500,14e8725d647d0a87decc3795e7fecd08c86e0641bda8ff116473baa53280245a07b31313d588733c1df3831c1929a0642beb04729c44f303be2b0c829776f75401 +39f11127d63134c2fba0db53a1c55f6142de2835d4834b36288cde2726317c450afea47dedc4780dad806d7a2c88b1e4c8dcd93624da1ecd51d840496225a44ce19f920840ea577dba8b50875d08f898c5dd6dfcfe61b5d9a854c566da477cfdf5295ed620cb5b,3af020b8f3f689865780c273169fd4da2fac33ccc651616f44261883b84a0156,023e82b2b90b9d88b789da16f452ba8ea162acf2573218aa8c7907f7a066de3935187d988f6f85158db1ce85c960f6c27391407ae35871eb94e4704e2482a8c401,104b8724aa3b599c5126e861e3e12cba309e3c63ccc388356fc2cf01147c8e7f78614e8fe429b7b8a449672149a93bb04e477a9180089ba5c444706cea41330500,600ad647c9257cc7a4fd1341d59d71ed837aab18ed6a752c226bc425c76b574364ab33de97608d3d78168410e69d539495b97239627f1c1e26b83f189561cf0c00,ff0adfc4a69f550d1cf7316fcd39e9a3b5ea7eb2df0a23237e160590b056a3991351905ca08ea5c3cb0a8c01a1de09fcce768ccfc1a3b1b4f41001c7c8d61d8b00,8e9c9e0724bce79cdf455e3363766f24e915ae3d96f36cc3471383f047f5909f6f64276da8f9cd26b80d6692c2ce0838f26ade9f20b81ef21429b0d0f11446ed01 +820a4609d7b5b093082db98a8fd6bd758115ac1232856240dac06c0c4b31e3d1100b699e474a8319a364edbb83b44bbe9a69b0e471cbc02aa4b93eda5ff22f8d5260f1260697167540e133379ca3fb12a089afeb8ad3cc6dd1a4d395579d6243df4d6953ea19d6,649454f899b96fb4ab6187d8ba4e1529727c8b42fb264a76ad6064da3f150c5c,2a1bca28f00b0277fb6ad7d4b1dd3caefd5e02146c8d0d541f8d379d386a42ff1e2517b3cecdb39e5aa3471127b29d2673b8a21aea678bc4e9c04b76edaa2dd101,d9291fdedee673b1d02568abb8e559aafa496c153ec810d01b77f59ffc95355c2232c74b1b3b4bac0022b42772c224942a61b0b48c5906558f87b801d2eb53b500,56bdb59008d465449fc5f8e3a55352fa2e2625948004d9b4b5e4a1e23c9313ca6337ac2213794d4ed200932fff18f6a702fef47b9b021ca21627f22d9dc8bdd500,a11301dc405ce81e78e971fe6514532d776c31254c8a5a2bd70ce75dacc136ad30ac9f545d6bb92a0531bff0c68c54147fab948c06c00c556d5c833e0502735900,7eac2e2dcbcbd70be967843e3830342ccdb923b8cc5246a6d22695ff6bb3eb9b2a30d37aea47cfcbea22d88a0d13ad2bfc2b894bd4313c95e64d034fb3b20fee01 +d5682cd244048bf9dc33016ceb18d40a8bbc30ed40143d47d4a42fb9054bf02b13778b55b4ed8ad130259652074199daeb53e0bad8209c4b80d739de7b8c2243060fb3d6ef5cc0b0e1db93210525868b15869cdc0e683f922248aad025dc1cb598fe279d965901,ad571f1a26e281eeee0a96448e8258b9e3b18035f85a3a0dc9b1841bb65b36f0,33f6ed475ec71612a040f45cb83498481fa6b91a4117d5250ffd767d5ed4a166587d0ec7cf1f85945c1d5351975296b98fbd3033b136bab84ea3dc7c3ff015c500,687737dd02733d34ce1bb50953eb5633817845e786e4df7567537e080035a9572241589f5cc25d1e5f771fa28723c0d9f946a7e89319263ed386bbd8b68003e200,0d7488ecbde8d37f1c691144db61a0401864e37ef1d81f2e94eb36a0bd70cd3443d0219e51c7c529d3adcf3877cc12f4f62f76aa27b5598e6729599686d2a45d01,2bcca0c288e80cf17e9c53c537f3b31f4b1af8f63feeaf7c16827af23f3e805938204bee212b960d5f3ed8371a76a98213e4983cba7542dcfe2d83c3f807292101,81ccd317de58cedf72f90b277b6025bae5cdb6f234a4f72e2a7f489376521db666c46b0f2935553a4751b3df8899a8413bf646afb3fee1cb8f929ce62157748701 +88b8a2ce9f51d24727ffe4ebe6780b64456f7161ffd4d9994c71e27d451d52a6bdb0442f7e43e44c25aac5242a814ec3de35200d917cc7967162eb3b7390d28f52b61529bb36fafbd289e483870ef5af17d9fc844fffdef769d74ca4ff78046a1e31e758d7bfe6,d01efe43f08fea8cf8be34ebaf7cb821017c6454fb920394eb6af077bd852e5b,b2a8159182e6ac847b5a68baa7a6178b3c3e7a0a882e676d49c49675d2c677532f9c5702dc190fb4ce25184e019c2589cf34280b12ff597e8419df3f0a19ba9a01,beeb3fb5819761e58eeb030660d81006e79c37abc57ae4cc57d5609bb330d2b76004885b5a4bbcf4ad5efca3ee28e61365a337632ab7d4783b7176345b8970f400,cb937e0fcf633e6c584315747ecf0e82b98ffe7ab4ef63a7a9f3f71ee2de4e800368e4c2cebda487c862a8c15bbfdb1e88f052e8a98daf35284aa2ce03221ed601,46db02c3b413358a19400877e3c5bfc015cc4079df6faa15619e9a9098fecf940fb02263f663b423280e534c16b868bb90b27718459197a79f39a762ac7a061700,90ff577d2cd01ff6ba6537c5ce48915ac71ec7a1fd97c06587837ce598fac5575242f737fa83e0947d8fb96368f1779d35ed27edb101d5bbc2e10012fba7f02900 +4261d77360b8c131261ee228cd424d33c25e13e30d4140751f1eabaa7fc3d4cccf1e6e54ff67cf2502a04c18f7b3f6eb0493100e043ca1cedb2e027e7e6379bdde951869a52f209b4804ad367522c37e5e1eeeb07729971a7e66a8a70664203914402719a1f16a,d35230a45f00c04bffdf5b0bafc953da82da187d2b871e0d05cd6725eed27672,a9fa32242dbe16c324546bb8b3849aa0477b5a133ffe64065baf55c5427daf086187bf1d9ac1b5de876ffd41137c7ead0e0abf2966ff97e840625ef812adece601,2700ccdd09689bed9180103e96412ebfea2c359c945a8239df647d4540f061821dbda90e52e3d053bed85fa241dd19a6c64985be4fb552179bd5aaf8941baa9601,1ce783a70d34c842b5ce084f9848cbb20872f4fdd3eb2777c18ecf0ced7b8b327013e3dab4aa221daa5bd64d2c47a9b851f2c7277b51db7df6c554834b36c98701,51e234dd045d3f148625489d058d4816603f96fa5ebaaa6cbb4267ace5192d9e457b785b6617c7fe4266aa4c12e370464c77ef3985e0b506c8b6ae05295e289c00,4d7d73e92ba56e726ac57ce775c8c05ee538f1d77cc95369843c568ae9fc9f3e42dda1a00199637b804320d61d08ae788eaf0ac1eb01fe0ca86a9f264e0a508801 +8667d1764e4012804926133333a7fb7f402f331b903bc6037ae0bc4286a0eafcf8f7b43240159d8868704f89f583e5aa95263f69742d4a8406e1cacec38316ec49d06ab40bfceac5e6e21c9b846758c09c1a7c6d967bb59c28af9008fc93c24d376e3282e5b4fa,1cd916784bdcc859dee0003960434c7d2d5397c61fc0fad32fd91550d014e63b,b3bd3068bcca881a0325b29142cb3b308deb3de64319af2f4fc514cef22515e3435cfc604a5878f9743535becfe1e203473ea7feae2f3e17067bbeb5d087c90e00,b31a31393cc2b96ee2fc13b38863f2b09ce61fa5eb1ce1931e38ca0b74d8073833783097a602f85772ce074fb5960725f49884b396ceb190a227736a4263ce8600,5f3c8235f670b412c29d4910ddb9a6838e87ccc26e0f8bda01d7a87604a1d5db374077adbffdc7e9dc6e7b75ff2c3dc0d8f71d869c1f5d6ec3bc8dd34af8af4d01,4e676bacc03f970079c0a523cfce2a875e638c4c177448288fcbf4546b527c2b1666ac84975a99e1275aa022d195b030d7c28d9c19b09041fba3d4463eb895dc00,07650222ac566c337d1538b2fe6366fdf28f6538e943b7842941863d7fe07cad32750bf467daade7f4e1fd372cea6723f598c612a3a42e1a90476280fcc8993800 +79028c332530e143ca73869d59813550eb7a7153fe7044df5b790a9fdff9a03043b4d4c08a10b9761f7eb166e695689e1b721f6f3c592da8177ff0188d964621c9667f7142b25582f0ba5f994afe19bad6f788e7790fd1c18857ab59c09ef7b482012008f89f63,83ea5211e481c44220e1b0dc3cef3f000a2fb7faff8507dc5c89925f62a1b0a1,56fb708291a6243a90474729a67b438473e007207ef18b0cd43d019fdd3fae754e568c952d81a10aec4b092784f326423a33613ce49dff3eab7e242b1170a12a01,6a5372ff9379350cadd103826ca9cfcf0a16ca5688354a5a5ec62f5c70992c755bef3bdf725e968398b686a441c6235719e27b0f2e12f356a75678b5c5127f4b01,e253292012e0900fff56d7569197853bbb010bf143c60fa94a0125e7325593a673d2e17f36ef6c5a20d7c29e2b9383572325f5a5a8902bdfefe1b9a903e370f901,1d6a051f20cccc1b5b22155e7c0e46bf5255cd58f6187b425df175384184da2b20715c28b5046932344befab12f0b8de0e37811cdf110747932f5edad3bce00500,76a79dfd2aac089b4ce685f038c74f49a3f9fb996e53f2c970b122b66fc871a21e306528d99c4f4ede503e8e9f0568427aaea622c2deeb4b2fc2bb477c82651600 +e82f56055f2b1b2df9a0b7623c9139f2e45addee5d0d8a6a2088b0e367804e2821a73c4a1df1a6a1675c1ab3986d37428a39952ecfdda9420fd8db53d4b49e46b8dba7023e9b82dbff365122902ac6b6f566f625f715dbe3feb5956f2696aa14a4da8c0b1a05db,97e70039a8040bd22b930ba70abca18e1dda12d1648847782fb499a362aea0f0,fd71427de850addaba60c9f67ec3a000469beca41785c4e343e7818fce9bf9f94ff0fc461690157e9b595fa2859a7ea9dc226d3a2de51128b66f662099ddcc9e01,376ed12b52001f5588bd18bb6be80f5eea81f06d40d1bceb9b8d73fb0fbfbca8731c0952a9a55b52d2ef171f48d78e8ba1c375cdb34cc2387f0a8a9e7fdc121701,596165a47ad6e8e35508f0d3953eced49ad3324b91a85cb2a158cd0602aa12bd0bac0729f89e751cf05c7eea3ef9d3b6fa26eb58671d1bdab2ee952b907bd0d301,05fd8e48e117c4ab448d00f4f7fb46ef730b8ef4adc2a128f2dbbe473ed985946155282e6f8fb7c2eaf55a1f58d3481d3f6ddc1444444ec60fe74b158d804e5d01,1d3267778b936fc33048b17e806b61bed22099df4bbf6c4be216f84e5d26db7577d0e2e3917fcd5a0e20ee26010fff041625ca42848d306d6120346bd9d1047501 +b73debe5254c509b5d0b446cffdcfd24bb49b2bf43fb1becb4b6a020c2b234a3993c1dfa692cfe13e2c56ae8429d686420b12716d9b1490b216d674946217fc63ee6288cca74e6fd39d3bd1e5b7e3f9b52c788f851bdb34f223bc84918b039380eb592839c396d,a83b867318a5ceea0fac119f2e575c07add33d31efc67b3657cc7a753ea18188,afbe7c04851e5a3f99525814a4f5fc2e0eb5da0f3d220d37a3521992f6a57192549f8c19e80c0eb20c98bbe55064fdf075ed93e400ea54758d4a79725c7ac42700,4fbe5199e65e7c0bf3d4435dd07de630db62517c9e74077a62e4c964bc928b2d084aff1e624b91805c177f009b9c190ffa63b90aa5882e248633655c02b063df00,e28bfdc834262f24350eae74994041aff45f42f4688bd283556df1ab291ce81107cabff87b10dd4a008727981e114467cd457540e4c9807c3a80eb02bf35ab0201,22de705d1d706cff6218aad5ba3a4426f1476669e6a5c9850789bf3c2c660d403bc28d010605717ff1a9cff09cc247179ece6f94ac3c7e03c535d2d58e3c3d7a01,aae04e0cc14714129a3e3d48edf242c71f1124217c5ed4ab25161006d9e2eec60e71125b1fe85c41f09437ac13a041ae0c673245ff99770871921b1f3f839fac01 +4a4a169fe63c8df0df6a4f426cd181975dd0b3b17de8dad94c9f4c737194c0db706b2712d7ca35abb49ca502a2b8edc4319e5bd28e6bb2be4d6ee74d686f2d17245523aafa274c92aea169d66019bc826d8d1c4f6c9d601055d3e0b3e890bdb51ba00ba512b6bd32,2b672a0de61541280a8ecebeece7703e083af7e10580e97b7e27b56f10aaa9f7,23b67f815a9c04b9fc843334f03bd0977d12669d91aefa33f460f844d1cc80ec0527850b70d2ec1b5873b7731572ed5e8f68ebbb7c96352fba4323645836a57401,906432fc43d430a6ebe6c685899425034ec73f81c275332929596eed345e7a9051ad5569a2a464ac70a9259aae8984fd81e80bb8eb2a30d5821f7beddd8e51c500,fcc3faa2e4680df8878f34f6820c492b1ef37b9bfaa45cca7c56549b815ca77e73a4de0b887924070e43990db2b64088171cb694f0bfa09aad1b4c3264be6a2c00,f79f587cdaa8bdaccbd93e13351872f68d6f0af6646fc30e29ddb72e28476f4653583f861c0199884d1bd7d87ffb68c834a6f0981e8ce08e2464eb70da770e2e01,fd4fa00095c2c4d20e0b9bd266a4e7ddc4a11333ef3fa9a2ce8723e57f43630145bbb6dcdcc87c144d99b422bb3041085d4ea267b293526d21ceea8c96ce583301 +6a041dda1751c0fbd2c2b3e6072b6577c7e78f3bfe9656246447c0a938de749fe723fee7f885321d6986cc203a91260d279134b849ea67654ed5d99cf629be78ffa67a93ba41906610c89548ab2aaabbfcd53bf88958097afa31ac381294177150d0a5d9fe4e0bd8,a7f1de65f7100d841281317dc827dc69d7328043386c6a52455de5392cee70dc,18127c7edaf0d176dc212c85a35d837afd6e89543c54737a82a5971e9ff058164b35b9ee457f2fd36b116a1531e17a8058e02a806daf7be93b2707404bbe2be800,75a3cd1a72c4418e53c8b5183b3fbff67bee58ea9e7bb76cc820c374132a1abb2977b0d73533ebd9777bfae5d01ed32e673aa243cf819ffa7e77fcb2fa59a9ed01,4e07d90dfff7ca7f0ee3a81c067691f01e20757422abf7cb9b6284ad5ec1f6ab13b209405f6653df061f07ab3bedee841a731507ec4bda3c19e7c1759a48c41f01,309ad27afa083a6b3e03990809876b3d7a7c9e911f99fad37aa055b15fe291367730801be8849ab5037aced7a01da9e83b9746a60dd02478a95b4a288f6663bf00,b3abef9552e3fe575fe1c91c0339b5a124601a58099fcdc065f397beedc196c8529d1b59633735d693778e46e1a2aba51f630a28e94e41e502edf1420dd9748800 +8cb9bec20425874aab8776dad1c9b94b7e28101996b84eb0b1467584c38d19b82ad550cbceb3a1b5b71249e8d4fde86e41f600313d08bfb3631fbe99d6d2f50929b5a8346e1a14927db9a3e7ae49a8a3d3b897bebfe859de94f80984dff976f423c6df1353eb7918,044ffd36de3544d3773c3d7174bd1887794ba4f3048cf7285d92cc56a94998b9,bb5585c0bca09ac576cce3f0a9d8dd217381f27f789f822f2af62ec4f419477d1fef775750332fe60d76bad75d6577b67a7f745d595ae021f5bbd7198a9b840600,34021dc690cfb3b0efff55bc297dd90b200b27a8e7fbbe2fe3bcd352a050e751786b44df8fb8c7d6ce7edf3bd851c0f073e23e57a214da207d537c58bce2a29201,31c03652e502998656a13975205c8587f028783ba347d956ea06d6e8afeaabcc14789b590f5f977f47e24c656901cfd2e981c73f8dd3f514e5ba23ea10b9d2d200,d8344aa1348d226ff0b1f609ef48594bb5cc408d48fdecd8ed9b2a4ee5ee2ad41f0852a312d64f911d7f2f4fa3d96dc4fcdeffc785fdc2ab2a6ce490a3a9cff700,014d04e12c59cd08766e69b10f072bbe55ba62c08a97326d7a87c3fcb10b5c227d35a2058f5ec4a7906427ccb8209c728b41ab2852b6430db5f55b60e7a968cf01 +ee8b133856e5cd90e83f6d99f4573175931ab5d693875b5e2a58cdb353b227f0c38e4e9b1b495c558fe36eec4bb9e05d39fe647e2d4991e358625e05d434c85c412c56c43d8332adc43cea438227f755d491fcbb1d7ea6fbddac2508ab584fb46ad473f6168887a0,03df3846dbf0ce6430ea75338fdad05856f452a039d6738223243f4e9ac29d1a,e220ba459ab1e104f201d2580f3866a9fb8b3c0fe12b68f1641d0bc91d4d71ed28498081714095a6c83374647499ec9c651c6e50e5777e2370fc30c17a3d27d500,0d99aba554bfbf0fa2fb94f8ba03e706cc21e0bfd1712b67aef7704b8409f2c31f20d4d59182c9cfca25d3d3c811dd1031be9d669f04411076ca966bb454610501,c693aa0772767c038099e0ca02326b0e989721344e92fd8dfc643b384a7a90121c38f39c5da38ab96aa67629caba7e77d6ea209ba88d6289e9f5949576d3a22d01,f3e168308cf39c8dbee7e748b11556a5c4d67e198b7550e24b7aa57809814bee22ed5046bf0634a047eefb269731950015f791f01031488e96a967411213dd7c00,9917a2d4070517fada751f6d905b94e6a0bf940435687c4078eee79aa6e858537176674504dcf419e1b8e6e21497a2723d29299836465831e949cc866d45173400 +b88acf1d18ef6abf062083e96c6174a518c954225dac75d2fcddfa4536e226563a0be427337ca778b42d1a94749567181def7c9f55382c039caae063df9ee2d3a14e8ffc284292cc1d9e2267a496fd71b2f7bf29322d0f00eb4a2693d0bfbf0a58765e935965e626,9abf9eb5df13f6a0c44cdcc7ae35fd1aef6693f11483211a8f28f556421ef85a,0eb2e24e3a282bbc911e6af6c078b5e8a825400a0680ec9ca2c5521ecbf59a2474e49cc753d9b7c72b8c97d1951792cfc0a7ee5ec2e7356e447e49ac534c370500,bcc32775c88072048b2756bf3f942a31e7cda7cded8ec058dae7042c1061ed8f34e8349ea958e8e5ec1852a632e2df606501f21cb98a74fca6a92aad06c92d5d01,ee3b552e9c9d31ecce06279a78ae831ff09e2581921b3537c03ab20688e89282480be0692f7401f1b101f5fa8cb1a697299ba6d03221987ce96beee8cf98c47900,07cd871cb023ebe9a350f2031087323cf8b25bb0e4e2d376235653d974f4a1cf569b8bc5b67069df1eab790eca2fa9bca3ff0f6c7c253fc9a23a8badd6f89e2000,db4d9434449d62a1ece819cf37acecdfbed632f3aa6f7da5141bc9a4e131923e15cafb00f271b7293a66e1a493b3f5c73d28155781a327c988922251e7afd8d500 +a638a8387b38c3fb471865f868fa920e608222c020ca4512c8123d7ed4dc92d9fc74902e5078f7d3fa81a478a0275ab7e404287b8495565c0f7e5178e5da7cfd37e4682dabbf1bd1361a863aecba368b1b80d0943438b2c0340926f4422e312b2811869affad939f,3c0d7f676178ccab9046e4c78559ba43357d6281bcb0856e89a4965fc1904473,644e91234728372c6b7213f4bd4acf6f6980cde73dc84eb3757f975c09a7c4a42d9264d5f1e771e04e1a121b86478a4bae4db33eeb01e27c0bf1062adf9566a200,9d01b4f3c62ec8702a66f8baccff5e0af911c11756f61ace321ca0b9b845131d01f164e0fa7198ef29a9e9b828682b3a757fd64074fac81fe37a4ebe27fdbadd00,cc4c15d2b75dedaa8056ce8da1186dd2000784d1e71716f9dee13ebb57270dc704f12f9525cfe425bcfed1a3944f3084705561c6515959dfde3c010556a3e12400,2c12b760fd65f3bd2686cf16ceb8cba4b60ed7e8cbb1ccd465efef777faa6ab0494b387df521a8aaad0759569cdef604d282f63f3eab17de63da839a6791ba6500,96aabe40b541dfed39a0181fb9507c1e6ada9c86f3cc61f88fdb88b2711a32b80639a26ed83fcdbc14a67e1a2bbb35e48c329628954bcfdd743597b502b0b63e01 +8490af46df691034c34e102786a9911d24d35bdd8a20b7fd725983175a95266f0c6cc308a87117b372327fcc2577843c116babfe4592064eaa4cb6e256549ca044acc36168cbe448b094868c29ea68d08e1de66842aa48eb71ac284eb5f25e0d4bd2580b9cff9887,d25db1e9b599901f2bdc7b5e1041cedfeda3f4a4c988c15307de719915096d0b,321497167548b25a35b9a688c57f2183bc5eefe3a55d9717a69d706ba48808593650e35ee54f65dc5e78194eac295a09c50d55ecaa00d36d02a670f5ed0ea3a200,671fc09207c6d123f669248c1719c494902018a04e293ac82aea6859b857c3924770e527e8e63ba14b8f6c78f74db1424cf0e4e0f5ed4234753aba5bd30b84de00,12447ab131c8052fd0bc7d3a1b0410775ab07bcd77639fff495722cdbbacd2ee18567d18cfbf392db206b6898d4aab6f07c3a00bdc299a637be1b59ed1d3a11c00,6956edcddfb34c717e42e7e5e3358b285439ddd45a73665ca25790e86837f6f7022e999756585b25003d5ea34d14e7bbf88dd70005cc397564a5ab3f4023f2f500,03f685fb036e994a91f8a2a84e831cf6c641a3cebe1d893b0a2fadc852053be959b662f738845001ea50585b1a5628450dad4281c1dc7af30945e08d725adefb00 +ddd1a96608b7f3c0de8e758642d999a7c1355b089291a0f59dfd8684b704ab0efa52fcee51c1040c7673cb7723ac8705a05c3818677f89f5e4ffad99eb96bf4b5405a9a9410e70ef3e5df06a0be2f9a8dc3b1748fe836ac6913a83392e3e24032b1c6f8e5fab3ebe,56b7674041db172c794309b8989ea65b895a11f7d480b8f66f253e15af7b0a1b,495713ebfec0247aee367b1ac4c6dcfe88b7b4d67546ecc85a6a61af1fca97ad67517ad8c5e32ec8935d2211efd3299e995861c9b68e9bf5fa92b30aeb42fa0a01,671181f7ea680fab568f913eac5fd41f989499170a6d90013d71d97f088fc183305902d08c6e61b50b5818a4f646db1aeee66ea57e4ca8b51ec9974c3472b53100,b8004fb8d0663a766fd3d57ecae039638f3b19b4f3df3540d3d016ea36e4950c217d66f86154d371892953438d2ed654983070fb3cd950622709ae2cef4d1bac00,3dc592dd1f30cbd543658e13386a720a9d43edaaf1d963f384f8af842570408a152f23a152f20d29148efb8dbd40166681ea7174d75534ada35b90a85bb3d17c00,91fa28a01f89fe9d27ab34c3b019b8b92165a517bc278b48f56a5924e3ad581718ec01c9b06c2a388f0504c9f13b488ee0bc6da9985acdd61ea8cc35066e567301 +fa44649e3519c4ffa5556b838add802e7d4c443a4d3162caeb49857a92c5105918f81f67dd1d04d426e610543fe076998e4e960ec0384aadac0655a457a05d0a0988a76ac67e305735c072fad6b26354ecb3a00a777173a3c00526cf9fbd6bded43a7183dae288eb,e77f4b583c0287562b21d6d53edfbed079106e18af5b33985a166610a1d9ff34,b4c5e0d3aae281dfa11a7852656252117c8c258be1d40c46d8f152afc663890020a751a40da36983657f07a6afe543cb14b0cba4b7a350a9606ffff1d671420800,41a13202f24b8e3ce33ec3218b1c6f7f925104c8321789c7b3884b68f19605ad2473abba132da9922688e95a2cccd30795d42dcb4239e2f28cc6134a099cae0e00,2805d8462f4cfdc2a138ceb82222f461e2b74d6e7958b8ece9c3570fd0c612220c18a1f534ab411a32daf7acf848e7f14a7bf1e8cf9578a3f6a143e0f903350701,1bd0c94286c116e5fa01c27505b16f074f4be76dd8088d0f20d45904c9cd5ec14cbd30c51736a0397ff294181c16c5fec1db4b9a69d15a72eaa1f73da110a69e00,48bc59f6636170e7c56d42859897a1c7380d224a54303fd3531e1eb2ad71ecbd059054f81db0b0a9517a740d3dae6394980079be0e15bfa162dc4856cf52074a00 +a629acb325deabe9332ac9f6df8a87c56d9719c3c0220871879792b7bd5f3a48db904a900357d9e8ca917066a7c8007fff8bec050e5674c7e0fbdd194473adbde681c811596a499f8321c8caa7454d2a8016c54b05ae7a5aea62095f45b996c063101510adcf91ff,c304936f8eb7e3848421fbd0d3974e5f2d4e33dcd611c100917d1477d80a1f83,0162254026f77883a783f065605f17fa6e2419437c14ace3ee2e7c3f499b25d16a7a868c07531f8db48669a1323996a4f37600fe3ea2f0da21472958e23cd84601,a8b58b5a76054cdf321cb2d40bcab9840778bc02b6b28dbca52fbbe73025b93155f5e27f65d8db5a894ab5a83970a14c178a713504c40de8bbf7f0b0fe1fb2f701,21f0df0b67d5376523200ef1b80ee7883f12e0da82c117456c81b5c4ed94502076726f8dc752355be36d99fbe21280bb24bac5a6e9c2eb17de153ef35a185dfe01,4c86b9211ef8ed64cba2711c2ad0902b2daa9136a52aa9841b4639c3bd72eb5e69645a5b52c812db1de8af675c5ae40276449d4f015766df0b75ac3a847b060f00,209e137ee0fa64b99de940572149f33904725b6d83769b3acd0966d78af9386a44eb75ac63269b4ba3e9d731f4448389531d584cb43e9375336951027c8cedad00 +d8187f45794b41e1949d7558c1276b99d1d6416389079821442b8b94194f0670bb9e12adb7f5dcceb8846eeb300b405ed7d36849bf3a300e7bd291944a695e1ebd5f8017cee2fdd6f9447fe841c3624f2e9ef335e66dfe651ba1d04bca8f0e4d43b0ff459fe4c82b02,cb2ae3f6fcd02e8eb034e6af179fa4c796877a00f91ba825454bf27fceacf42d,79b4009340511511a7d8cbbf0dbde8fc9e206b88036a47bc1be41ccca4cf1f487694231b1e40f790728fd3cdad093ec2f3fc500b0d52ff24da151fcf4814ff3401,085e859ebf6a15543ce1153d2623ee76b9e40bad3ef8dae5869ada15ffce83ea3e616753a3937674db82a3e6e4f17aa603206a44c0c24d81c78d9225c0599a0900,4a2acba52b37a3acc715665dcaabe4ebbab601cf96ac7479d519b725a17f254d5b3ec8e0cf529bdabb2a835a0d3ad237aa0d6cf3a5b57853715c59619217c4bf01,62b11e1c18a947dc607764c464f6155c99a07eafa89b57d3a56d09ab795196654106900e9014cc13399ed3c606907c12e90637c90e81bca18545861b45d3275300,a8e8e77a54c09a8c4226773a837eea78c65171a4c002ef2b9188ba1ef51558460a20f44a48a7e87fddafbc0dad98c445e021cf54e97c4037e0f33eafd022298a00 +049eb5a125a70cef478a705e7ec4915ad3bafb4a416598c1d9d2ea9b22b20920ac9d6685f034ff35141b69f8e16ac3e11bb31de97b2b7b184d56131b21ce6c91ca455104f16a1c8f9695c2b59ad4f41fd8241576a120f54a90d4b1a5bdd399843fb0721947e7e459bc,3d1f0a73506062a39e937cbff3799e2db08a7db5fe406fefa6c7a8b60d410451,39832aee658e23401b5681aa06dfb6fef9f00c9ef5c6217f466b89a85f17101e431f4a4e245895e769a958d64ba798bd3931c8bb32f936e7f2cdba2361cdf13301,2d965ca53ff9257dcb55ab8595e462fdc981f2b36a4df96f3a21c542cd4fba2d5152d1f79f9b92b09b01aa411100d48526175ee3bf29095821e57b7e2e3f40ea01,022d7483022d85704b40614c2ece76b8a418189644e044931952a065328a5e9920617c2942ba6646ebad8aa69bfae59c5b575076384706fa6309f53d3878421700,28d0c837b1c2475119bfcbc201c727645335da70be152cc092ed9ecc4ee4cc28674328e4f66078dc467bcbde2b874dd207aca00afb64c8fa6dfc8c7c1ea24ad900,8ab5e8ba54cbed472210cabd718e06e176c6249b3363065fddb3df571d02a6c56b83f5cd81763ae45a069f4280e3e374c1333328d1e1842c3edeb50093ac931f00 +a96d313e5944ad646a0e8bc15e324a88717885dd4aeb20161d3ef4bc451be81c096c621cea16e802150f964c447131dba88a3548a1be3cd435a452ed5cf6231154d12524431b7bf349dc2ac7117322a21cb3e47c8eeac613d47005b1e5295c7f1fdd5b47d5678590b6,dd7a9ba8edafcb91fc55d7ad58e8cdbaa15cc3ec8d1f19f17d8540c8c583ab09,2fa348fcfae7c3ee46085f31af2884786e4d909b4dae4a0bb4cfe0036995da727c40f8ddd9b4abbf44da688e59c5489c1d0c3ab9f08959e4f9eeb34c40cad3f600,8d40ab972ca3f834d35cf1519e790e1164ee08fda44724905630b6a8252b7f4d4581ea98ed16ecddb4ee216661712f156673604ed0f05f5308e72be53058082501,bb2eb39274f404936198cc32ce785a218c2f5e71ad47b141edf069941c71f7cd2cce960b3a2d755828c8fe2b08ea3aa7df81d28168df372c265e583824dc56be00,0dc2b19ee38a2e48815b52e1507ee1a671eef017fe418abc9253459fa44c98400727b083d9d4d62e814774fef7cae29c8f57d114324d40e347395f0051b9e11e01,e571ec7d497ba8b08f49f1b3e9ff22399096491b2104134cc301cbaece650b8b5f9ed5c31cf9ff90d979544600ffa80cea2523404dc2292ea5e2858896fb066901 +6808b71d69ee4baa68af356bdd4560ab9972704b1f594498639f6133a0a0c6587122e11b7c3863423bdcd7a9c03e2ab42871114f9581ac19628f7b33f762c539b555a48f296a6d82fd5c89062430b04b4e3c768aa02d39a672379e932a0c9fdc495a738c576254f3b4,461f67ac4bbf8f9f05ebd151f48bbb2d46b1c2443945d51347b091e70bf9eecd,95c2719e7fb66924eefe5f55c5ae2971bcf9fcfaee61761c99f0624e593444c47ba5e4be785257331574d011eeb70e48499a672b2a0130e3811a0b37636508f901,7829753e5cc5cae55fd186366c3ac7fa00f410f50e6a26771364f07964325d472085eafb78de4f08ec8c157664e789c8db090af810a4ae8660d2d59334aecf9901,7f84ad528875dc72a1dd31820f9ada56c9b1629c84ba7c76bad161beebffc06472a4f9f75b7600ab89cc39371fa6f9ace4454e3eb1570a78f0e3455fb2d3207d01,0a619b77a86ded230f2e8671960cfaf567de1bd19f5edf9ba0df1a9c4f55fea6043d3e75997a236a77ee4b136f94ff47fe6eee316c1b73e09a5fc0527a3358dd01,0bb2b2e613acd4ee476ba467efbd1f36f0a03c97cfa1cc5a4e8319b4387ab7f419e6333d2aec7253c950d58e193a1e9a82efe428f2893887d40f956d9616920601 +5646fe783203a4e777bc9dd610f3a1b575f8990db43706b2e05da6fbe3036f7f225e16977facbbc133c86482261985a44235452ec2fecad972a1335d4d05df8fd39e91d3b10fce5bd0e8eeae556969e2a37bdcd2d9424b4ae25e3d97cb667f8fb59aca95647782c36f,45c3c8340518fc5e28d085f2d636dc0f1383d019d7b162b2c3be6a7dee6957ee,3a7883e3b3226cf981b687561474b4059b5b4e3b415932e1d8a0480c974f4ad40ceb984bd01b6a3e019d1bf1a4131974ced8ed05e3953b70aa1a7c0d320c579100,9fdb12cb5ccb041987dfaca4c5d899daf1301a8e277ae002cd7e9a5cbb11904c061d34a6bc02a165e0148e807b090ed7fe025e7a52c6fdd036e1e9138532f9ed00,6ddd03bd8740fd5dc4fcd1c64fcde34c4a27f955105c139e164f8d3bed4dcddb2f75d60667fe3f63ed792c5efb431fde8f7233907684e699da58c8deccaec67f01,a0b0ea7bd48c234d68fadcbec5a7545ac2cedf64aae627380a759ffaefdd641d252790c44d135ab75387055d7b063ac3a62f5beb25f242f0397447a96012f63001,ec6111a56680cf40f46cec323a38e98344cee7dba25b68fb9229bae414607a4c16d46db7b24ee49ab260052826f89d1990c9d13f341b53c80fc4223aa7793e9300 +014b8371247cbc154126e9ed1c4649b447e643297c8d3f174ec2d8f0000944a591f387c37c6fb88363bd41310076fd017dc1be5a3520967fa723b697cd54fe4706c7d48bbfaf72bf7f6e427a175d702fa224433c65152451eeaf461757194b9e76d9a49b9b3ea699ac,ea5450cc2adcca443fe5e92279cab8f91f6691c4084b3a35406c9aac94c1fba3,fbfeede94d846ca90ce50ba095d4a5f3f8a46fc307cd9e692812e2b8d493ad932dd0f520987c6445d40a3af8d3c6c07738b098898f830f4e7b0f52f9be5f471401,c0e0ec2e60c44458df722ed5d3b69f34cd8d70318d160320e91bdd768c118514592a78470abdd7dc00e4767eac2042777a8cdbcb170f040bfdc84adaf31a1f7300,2248e42dd8a8857afe784bbcc8456427df3600f909dcd84df11ef52b41e7c0c165590dc9a6c11c6d0a0e91b944cc7b7119c0886e14765c663e4b963e6e2862c701,c7e810978f7103496d9d62629c4f343200d7cfe79f2e044df692a32fa43193f0137ddf66bdc3d97829b1fd7173720a7310feca2b454cc10a16a8dc739463bf1801,4b05112c6a6e18094115274ec3f5a6a4bcd375e759b6dafdcf616c7d310183f45fd3fcf3793ea135e0e3ddb01b1edb40148ed7dafd00041671fc2895ddb1452100 +f25e5939e44aa750fca2f3aa36d18f718ba6cfd50d631288bfa6fdac44d342dac84aac2e1ece4f934cc127c25d28ad220cdb8cf08aa1779054fe9cf2effa53af13662f66d4ad80153326e708bc41097a60cd8f3ebbf69ae42d50e4bca15870bf1abfd5c96f9810581b,ddf51b09433ce871cddd51cd77752cbe08fdb25207e1db98f3e2e445ac66e5b3,bba8a0840d68b8f1bd350f8305884db8e19c13e83c97015b813a6bd5968985765d9334cb30023fff8f5dddec559291b24cee9dd0dc65295afb1f420756bcbe1600,63398716a48e65db7fff08dce742f791e08ed9abfbdda40852a77a3896f2129e1b9280ec87a922e77d7c0abe3008d9793f6d73439c71e5b6a7a917349032008b00,b1caa660ffd1429b243acdebc127bb8c479eb7115d8f7d59f432914c1172b0c3540ad99255bc970f53efc95de30201ee02cff548b5144e0b8d10227047e1e82100,379bc2a39ebc061f8d0423ee00caf093329c8e134d17bb45c8db2b076b03e1a210a1892eb9fe368595a4f9be63fcdc8101da78936814d4a9a3b1f65b323393a201,5178bae1ee76a238f09948ab94a6c6fdeb23960ec6bb236117f36a2334c94ef930f4457a1d4f2366e9762c707ef14d71a94e2ba097c78410ddbc930b246ccd4301 +c39e44858e4baf8e02f2fbc9d744ce841e23ed4e56a6f1ea95efe713e89621b2fb1b7ef2f8ed3cbb56c972767eb81134dc3cc6afaa5879506a3e55668443f4d6d689cfc53586ff731cef39ef1c694a2da1c29b32a78d5ec75f6d45d6411d0614ac270fadfde6ceb702,084eb66e92353515635af29c234444c6314ca35fb1e8beeb815133f6147f8707,288408c1c8a6fc11a31364f2829f867cf3f0f30350638cd47a8a051f3ade72fc57cabf6694cb19b9806cbac63db19843b5f6c242988b49b986259422159f1e8001,bf11876b480b123624a438892beeed5a0796f8dffbce328fdd74ad7be34bb4e8692e974b39c00526c381f974fed29651dc8f154bdd04f5430f9e8e018e30a7b901,3771e31e41b3a504c3b7b5d4a84a1da664ea7968ad33a7b612deddaa248f38f73f0b9250d3e46aaef582c84df3399acdf27682fc554f7e511d3bbf90b155a9bf00,d55f2f94b758d509a58cedb57a438112703f01b989adfd63549111e4803e87aa708435c7c6db3bf7769cf7d30904693008090cd7be1b82d4fac89ecc8f934fee01,9da493322cb4c50ae8dfada00840465c5c91969d45aca127c7f45c75e5d80e0b10587f4954d44e9a987bdd2097a048d69888bfa8d75e6e0489c7e23496f9627d01 +2defdcf791707357688109b47b22dadffbfe877d71e9fd0872f84c1ff530305ffcc43ceeb18a8532c74f14c20ddc0a9d7959532b3f09fbbc6cf8254adbc2a23c69be3b5a87beb5b91b01b0005c2a8a4cf02fca8833d9bbcee3de18291c2f58f0aec39e8b92ebcd09d2,49e5fb40455eee72abad9dc8980ef88a487621b4d26fcd9b3f47a3118c9a3132,7e490de29fe69154875972ef46260bd255fe9791cfca20c80cffd88cbe81f2040ad04abf36b22a9f3c6d95d5b35dab7d6ccfbb0dc773024886816a42eaa458b701,db74daa7d12b532b086ee86746134513916346e7083aa4c5bcb923e1073c32bd2fafad14fadb0361512ef444280794e244ba58d8e546aa23dac9aa1038d1cae301,a2f77c10dda33e58742cf4e2e47cc5f4399f551807c573f338e24dfbabf973f249c8d8ce306ad1bff4ff031739ad88a366c5335d4529e2e6e881b4b811731ff700,92d396ec1bcefcff4bd21feb9861c063cafe706405817d3829b09996ca73c3626bfbe44d286f1fba737ebb67930d4487741866c5a8e62b81104f44cdc1f7450a01,c2adc7cd91c77f32e6492fc327ea05efc95900732b55a4b97ecb5b7c578bf5c44067467b84ff95938daa339b78cd4462f41fcbd2c2db52fe2910e2d7846e24c801 +c4c9cc1eedf27abe796bff202b15d086c84257b36ae3666531c9bebb3c56dbcc326654fb3d9906782196d3841a0b07d4eb6d4ba61c55bc206ddd5568abf950f8bb4d91af2ac7c0828874571e68942ffdf5e782d4feed07ef8ad972a3cb82c51a4163b9d166a20d9792,c64de598f43b4050ef4d1849125674b3edc0ab27a3b428f3ecd21eeb09e86d47,3af7ca9c41dbf353f5c2346c8b4f4bd9f5a4e349e3d769ff862fe8bdd01344497262151abd3239f059de03c397c760d8b9e97a5203c0478332ab2d2b09950a1c01,24c2db8af99fe3b75f0789ad5ea3530a93bd9f7c25934e0d3986b8d7c32ed2b50f06256b7204d82c8266d58205c599dec22d0964c877c2dd36932eb9426cbdfd00,713406d08783cdd9e962323a8eabb490fdb53c0e2fd7db9a88f298b1a93b4f8a570ecb7d327aec5568252430b2e655b98a046d94cbb987f8164124622cd5043901,45fb208a6331d0f90017e1ec68dc8e293356f8090d5c2c79b709a2f749809e6a12598d349f881c847e7c78f92843ec83fe266a3a74b6c1623329fbcc71f775dd01,4e714c9bbbc5ad1e83cb6363efd9bacd568dc24882b8895ccb8d38c50103d67a710a74c6677b429f2ba5e7b54a4c261fee4fde9187067be8741d6026c627735a00 +c443e44748064d392e9c6d1c7069ac0d56137f34b52553313bb8a0d6c380c9884f1d0109882be356e0126e2d3aa1c7c53cc19ad6f461d1cd99e11bc6018ed0e9b5bdeafeff3026e3a73b098f7a6592409b49cc7b1bf9703d6363507a299469771a1a41dbb00679872a0f,2f8ed6c47216252b28b5b26e46e53098574f63d12f87d10d9900d535d92c37a2,c808fd33e4954dc536cb4daa67f607dffd729ba1d26dd63cd78781dae2938c581397ad962580848ba36b08f50721475eee735a31357cbeb60e80b71f794a394601,e685960a42ff6339ddebc4a7adba52b77ceecf760654a85ad3de5782e56963441b18b6bb13cfed66ef0bc16efe27e522a82b49f11efb6bd13ef04f827385c57301,b252f1f12d8f6ae257e35b6b41c9c077c1fc8486ff4bc2faae508c7240b78e9e7efd59f5e20c91fe4511dc8148936b558532b04fea0b4f92ea8195d8f143eac400,96fb52eeb5255237925f76cb9d01f85b06c6cac208758e11eb01c0a6d815cb1049a56fae3b1cb07783fcf5bdb80006db1bd07541554271193eaca1660ea4fd9001,86a6562b9bf7f58b20182b623ca8b76f40f617c8d3971d73d5da761a0112c22f643cf598291c288528aa3e2810641b0869c223cf918365c47a33104e1e148a7000 +71ebd0e7cbc78ea2844eff5b6d4d4ef2e42f766e5e3f055f5186c0d131d42b77fa4ec1fc19a63a4959c19f2674ac819a580fd29de310b49e7a81f94b59356975c84cd23e50fdfe27fdc0ebfe9c2810b28840dd360d46fb1e13c4f9a100325440036ff74318eb5fdd71b8,4583799b454b864792a78a4ac4e465b67d47a0a1d3a75eaa00bb5338bfc1ac7c,a7604c0a83ddf56bd0803521c63c634291a3b5f585df4f7c7c0231f2acc268b30b85ccfa925c00d36261415bcec58869bf845c8eab83ca7a4b25c805d134e2da01,1a759c462e6a819db09866961e95493cd7b582fc5ae5ff79a03158575b14d0f87f0e8d7d66b31df3a22d271cad9440f3ba2cba9e5dca42a5dc732c90ec3c146100,ae154abaf82a9659f74845075dd2bf95495a5e14a577f158f2721c956f6de30c3877cc7c9f5e2b5d3e53f4b4a2b72e7fd306b63e053e5935b02f53ef5c0bfc5d00,531b0c86bdc1519932c338151298ab3dab55f9a4038c403892c43ac365670d8e7f0ac82962ad2faf700fc2eb1b7633f61a106c7520a7c1e9b8d06a5e590a3f6301,eb466918038b3c78612b81d053b858e199fd819927cc7ca5ff01c70fd51088cb34c9ac908205ebddf5cfe37dcfa94f064e6ca4429934be9e301a4a0e3566cff100 +209acdeac25cf26520a8e7480e66f823cbaa35fc898769ecf5ee306831776eee8c3af1b7d6dc2548cd669a17da48a5f6a32dab6902351bf784c75894311ba766c2ac4dc3389703d6ea4abfa50fd9cd587d46ff519b22898ef7bc1032d4b098ae6920676900d2d5899d36,242ef85850cbbf016aa3a07d9dcd386a621f8f4dda7260793cf2fe64711c9274,130074b1a218ce1544508fd8169c5c65ad636e8b7e141c060375dc2375e3e42b079c73eb1cc53e01d4b75c9854428fc85b5c719f58c9b0c1760d286d0394823601,6b2e4a916c93b1e5d7c04991788eac4edb3ee71c5ea7660f609713b2d02ee56a746174fe523597fb067c80da277d6bbe088b864d590c33f0b538ec903b57faea01,e729a8625689a5261ff616b0be1a5f08535e00104e2a85422674255091a09ac611de95c9d9ebfb265411d64ade18ecdd9b6e67fd5ec4630508e95a8650a53dbb00,fa38333995937da5f8cad99565485939759e5bdacaaffbaac1584e4d8c7e067c2a8ffdf13c23c590f049589084da84e4b8db72a7d77ddbaa89b6b75f66de2edd01,00b296394f945c8e0c2b9aea1063ae07dca8f4d80f8f36de35172e62085b8bd76ac2ae3fae35e5c45cad731a675ebf43f1d9cc69ad5d5273180961a59bf61a9200 +c40965f6e0ba87ec184dc2f5fce3f3e5033cabbcadc9cf4651cd311155b795f5db809704af9cc6ec342df1081646c7abd371149cb479162a8c8dc1b46bddbfdd1de92a1bc579aed739524fa0acf17a40a903e51b96df4d0025ac37f9e3fd98ae25857894f3ccc57c8042,f02d50489537b5c85dd15e912b7d3e28b10b1617f6533ede824ec91a5bcad5cc,ab83e4162a46ac1897d46da098c5bdffe8344f3a13dc651c5127cf96b96eae597fe2d44385a6fa63f37b25d9ec5231e1542644e89814c3a3ecaf6c05a11fa09a01,66164ffd4704e59361bb93839cf3c8bd4698fde38414491ebd4007e3f06153967f12b7a0faf2facd90f10a0483041ca13a25dd57eb7b108eb9b1797bb9d1bbab01,989cbbf4e029c753a0555c3224814fea735a0b3cfc992ea645c6278f444aedab7b383661fb3cad2bdba91d35fdb4f87b4052f8f5a7a5467db729509f1cde559200,c6aac2552286c408b7867bcd02e115de633100cf75757848a8194e1880c4959b1d9154a2f2ef6a4467cc1bf0258167a7d0ed9b26a85bbad2e776f3e055208b1c00,dd84a87a5425c633e68b776e40c45af7157081087b1f3b286ad873a5475fd5a7535306cc277f1fb5374877de89ff230d19c0c1b56e2db0a9b85d1122b3bd215d00 +36176715d4953821a2237cc4a0d8a8625f208bec267944be0f01c7f65c807593c69ae345f5043d3e6b7a2e094883f1a122d3e9c5dd2d42b12e83bb7eeec0eb5449442548cfe9ce82b4a8219e88cb77c02934c934f88bc3c446fdb27798a7b7007bfdfbfbaf16f7a1f5ec,4b1988e76fa004704babc00ece55b4f291d67c8328f1a6d18b768742fdb2afa2,8e4187cc841021a4f636f77b10896281a11d2e009515f5b3454c312444911b0846c0b983d0c4bc8b576c8978de66cc4c01254c27f2260ca0cadb567de1e28a5a01,629c8d254874e87c495c137e96cd4a9df389e6a68771ff9ef79f46886d9b9c407ac1cf12e83cdcab47c2c9c7bb00b9547b88565d68f2697602cbbdf09bb9213000,4c8489be7c7f77bc6b58ddb848d92c47a9d2e11aecbf402ee47d391376ab68bf4229e6bce00a84aee176aee8b4ee2fd934018587b5a5288866e1a3c00589bb2f01,81cb2aa9c4a19a30d26df687235af2309ae7b9bfaa6b5cb6064a76e755ac087c2e675a21909aadac94144fe4680c0846129da2d402104b295138ec5b7a31c99001,5d6b790651aae7e527580f739b1866f94c30a94527746d499c00e8d8dc4a15411ce43b9d36b560733a735445e89ad76a93819bf42f9fb36d186d6b5c2062557001 +16acb73660c0800b44892f87633080305f0b2e1ad822e9da0c621e7e1660fb287b993c9f4f6aff18b4da7a0b0edd453ba3978f9fca39126d47d09901cc17406780f5adf406de578018b72b3ed3d047063013b4bee39b8f86911161cce05a22c6cb3ee0bddae4eb825853,288aff59fa6caa9be31cb2d79dae6f5406797475363526156fb6e49420a0abb0,fac6376675eb0f771ad78f441cd7afc5664278052ed3e6eae57adaa8139b027e3cafc735cab58121438ede1de960e7792a153786294acf3e9c3a00e3507f4b5300,15dd41ca64d760e27bff4391f3feea54957f3ff45c5d3fcaef2a7665f29e0be24c36df8dfa6705e58ac2173f04ed85b22b05c59679ffec8b52154bf64304ffa701,f43b9c966fc46d7b7735c61f80dff4d29245791b1fc05a4c8b9f7ac9f7be396e079a349054f4f18c91c6e72df75e6ff88f2ecd7c2dba3d6e774017eff146f18800,c9fc1b744bb4a2beabb8de7a8e1f9d8b516db1b4d7fa7c19c73c7bb45bde5fe715fd7139ffed0becbfa6ec074a1d9eedb0671398ef49c7e7f58fe30ee000249700,a80e337cb2a4e7b33b1006308d58c725571da4b3d05bb7a8cdac2449ef0e39a6416966420460b426fd416c8cc3e2860180cc5fdd34c53aa4ab9617bba379a49500 +0257121af8562f85e1ef12b7ca36de2ff2a08581845849f56e8bd70971d15419460ef70ce4d4c50d8872f7550ff9a0ef9e0d5c5bb944e3040da2a5702e6929e9cd5ef03d4e09fb3f2c0aa635575462558c42e900572c8d99b813c037089325f24b3a4e3c54e14b64eb04,9296f072c8171279f4a5c9d9a08c7643465d98e25d84b210cd9787153d496a5d,f3c6c81bfdec5a762b2c94e9994798184d5c9a9569d4dbea05e749bd8efde04e6e65540ed559078ded94eaf6c167dbd9664f49260390be3b053f5878ac9f9a9601,551f7205f45880538755cca183047c964627d740796c50e4f328aad2acbd31bc1a7e0ac9e629ebd89b1cae1d064cae10b785076b4e53bab2a2f2007cda42c70201,3c3314b72a6634d772752197f6feca84857e3561f1ada6fae9edf819c710a4c63c68e5a27966d8c2d2665994583631cc8ace98c0eb6753002433245be0f4736801,403111584b411ccc039d0be73cce5e63bb813ccd6f77c95afb4b07c2576ceb781d05dd703a8d737d2416196d7616c04fb04ea489632c284a65800ee2563bb20501,a0bdedd608a2f1ee44453f668b0e7fc0d6eaa6f5b67389cea8cdff9177f4f2b737daa176ba8e83c204fdb6f671dea6a05121aeab8249ba695e92754c3b0acc2f00 +c8c1142342f7b76a352ef777a5f0588d1ff7e04d0e5483e02edc9883268066dd09c877539996204207fab590868516f954e4a08aae4e09fafc13785d1fbe4bf8ecbbb14c4f1202cc9415436c2097da1c24bf692fd450da82e53245080a5a65203f8c88bea004932358a5,c549faefd9f47d930efdc5b8b4e350821997e91943b313e36d54496a384886b8,005b8b04e6361491a630fb4ed76f05b6603d435bfd79caae5e76b8868619603c64b14a417bad73ddb31b597a7ea88f8c645ab38b1bd2580dcf2fa3e41401076600,7d921fa459967750bdd2c2f19941f3ce47a6823abf1f52baff6152c86f036fe47c9297c892b1e30c8bbb8af8358f4cb1de3a5b5db7b330d5f3b3786b37805cc801,fc1db7c46a729e4b35a8cd1cab638ff34239f32d5972a0b6d5ae900937c3769934c7164012c5fdc693d7b117f22fcb455f9e924dd8d054dc0496de449ac5ba3b00,4bbbc88fc3a0938fd8fddc1a9e4bf8af6742a35bb3203727aa1b3b672d343ded236d41d753fccf54bcf5e586ff4d4b6bcaff80bb05d5c52f2b5643a732df48a300,d70da72398cfe98db5de41fb7daade1290430439c0b078ff3f24d749b89e6a9d718cfffb51f13063628a4f7cefde942649d740364e615b170236b14f697c986201 +4bc804f1d1b1b42d13fdf334c41e7d78bfe6afde263fc8f5e9361a759f097ae4641f335ea83eea582d613fba71f7facb6410e445fe9c36edc423157f2a01522540e188d4161daf012f01263cebcd89d5d771131b11748c274f146872bff9293c572fc9f5f2c4b79b6bfb,2cfe72d6e9979a772cfc1b7d04fcbdf99c078e7ca2dd9ba81caea2f0a3ead39e,9a5e0fdf5ea10610ea0af75a13ae6638b50bd2502f086e6843d11a42f0848db6360c03aa722afec3fd7a456fee730ff41ca8a7617199346be0cedba83acc6a3901,791df8ec9e2bc793b81a38652edffcd0639d828d9b2fd85b91f7882f66890cdd249605fe5c8a134ab81ef36f1fc5a1b0abef2175210b70b63be3dfdf5f1a116000,172142059437fbca7cd62d022f2aad7a568286affb4a687b941799a479a7a18c72bfe49bb1c0d9a94dd4a5a2d6ce5917b3a4d7dc640a91ec80c4d25c4e35f53b00,a90b310248dca1c22bac0b14ddf87161c7ef422c361bce785b6a80150e5b209108ce9829f197c12c3786951ce3064079d0e6c5e37cb6e062d21dc8102bacd94600,ad1a178165c03749def73ed805440687b5a396aa7060ffe6921353204cf9ffe630f400790df45b52111858781b89cc21ccc8ad3411e7ed7cc5bb6921ffd20f0100 +7b03c6fdbc4340f1c4cfde353a7a549ee275d8f54a045e0cfa048fe16ce83c4e024e600a165dd1db2d4a5954d63ac57dff422afad41640d1b2d71f923a17fed51f9ab261a2ccef656ce634c801b5779a09c2060156257185d66b717dda24af51b4a7360a8703ec71a02a,a466419b84f8fd648860c224d5eb0dc4388a03017ebe1994e0ee338d553df03b,be3209cf3a3e1da42b694010428b92bf8dc4fb81b2dbb58eb981ee41a261fd096e093d8eba5b48e491c51718a1ba6d3d94de4795b5fd8de9829162ed2d24115c01,23c9a92815089b62435d9745e527915d14386258ab8289f251fa602cb7b8cd4d6b5d60ec8011d49aeb26f4a115ec09374dd14b3c2e05d63ec4f9f44e9ba629a600,4b61c85213d5c93c44ff34b9ee7d5cfd476cad613bf2375f9f214ca9e69233a725f98ccd6551d2fbc67fa0c0cc3b5818be35a46b2ec9ad10c3d69d0e99b0c63201,0742b4a2d4ee5a73583e1838f280110bf7c61f6563558718705e4d2a875d703c5a3bb49fd40130b930785820978362bc2a3418f61c60a946177102086577827200,627b93636060e59c63661c727e597c849e4ffcc4566bd7bbd14140633b0f4e3e3f467c69f45f9d55eb6c665b00b13a4ac208b7fd53a0415647b0b8d36dd953e501 +e0439da0c154872af6ba80d60efe496d2375574615b854877552f7bc6e4fe5930fcfe23c61d724e8d80d6c9f6837b3b4effccb208a0b3fe0923be885d259b0e1d7b4123670790cd5b4682e6be2d57ff2f968ffdd22c8c999edbbffb9dfa56205af4f4597160c8d542a718f,bb195285031be4187060efa52b1b04038cac3dfcdfd3000e72a3759cac422ade,ff1bb745f10b7840de15aa573e3ab557069a6657c0c5ff32001ba6a339fe72c75a2e72bcc9eab6231a02d9276178db5378ec1b942501afb903a32eae466e789001,f880763be62ff5e46471bd35adbf7a1b78a9ec058e89bcf46f017fca6c24ad7413ffa2a8c6a116b8aa8780e0c0972c581201113e32a1ebe3d6384b9d24788ebd00,d2d053fa82d56b7387e2230fb1695e8cad7e9f964305671ce37eb287450262b2778ee6cf8cc53326d4051e18b4442ea35aba79661c2cba7c2e91de3ac3d8987400,bb132e790d644e79be0a419269731e2827b64519665efc172e1700fe09f4b702796980924d8b363441762dc2d05c1360e98485e42363fff4dc56fe5ad7d4682a01,ed8df637b4f73e2b3df21af741c10b14ef88f3dafa66ebca74dc467eeb9a3be566c29f1c350b630cb2c1cafaa01bc5a92aee787f898c80626df30208394cabf200 +3e18ab1a20acee6c3c4588423e7ebb06eb49179bcd349b161c070b699e15dd9eee0c40d2011b23267711e880eb72370ee5c6c21e4b51ee12e9f404d83858a66f4bad2484a515d8db29bed7f7caa7fd64f0beaa2c62fcfbab7d2ad12ff31761fd4adaffc776ac4afd3c930f,27aa8a439816ad58fe4b5d654c835087a1d0b8f481d27ddd9c975953a4f8f530,64eb63e4f87bdadf0fe438916fcea38a8663e7b11582cd442430f0c7a7d29f73207978ab31810f7f908ac487939c6045c14beb80754356dbfd2fec598b09a05700,99b4a9cf2f35b4b51c21d01350345fa7a533d31cbb49444d4a36c66ddd2555c873f61cae53bf0976ddc0c6a7d5c80e74cda46e22924aa1d14a560d5491603ead01,7274400a2587a9059283b0de4f8ae32746a1caa914b730ee1af1c243da7cec4c240ada16545c2d9d5cd862ddde007b251b2f0613dd89ab7fe893e910e60e110d01,cce7224b013113bbc0a66493ec4a02013480c77ee7c7fd0ff94b704bb8645a6862bf3767625b1da7cf4331108b515bd7224b5ad9627783941d74147d9648a5ce00,3684fe841a53ad92d89142105a666b613dd953f9f60a303566f84f073cc028103400457410d34466e3b854e8adcd3b24cf84e81fd72d6650eca7c28874d95ecf00 +7eaf7b7822add91f626541030631f5f4572735b43656294607de21db955cd59b56c417010a22182c13f6386bf5535876c351bcb43810aee3361cc254e10d2a9e73586dbdbdca58cd537817f163fa04cead5fc06de41c4fadcca29be0c46b778f3f5764d2f6a1ebdec27603,22e695334c8802b8854f7c3db5de6c4fb95eba84d9219ccccfe6848dba1349cb,7fe49093375925c7681fd006bb069dcbf4992cac99cdd1404c219033a7bdce435bdb7f9ad0030b72e2e8e86c0229bf32c6b3829c2a0a1819d06bc265b07a1a1c00,6607e0b6820e3d6d0c6eb24e0e64330d7ea4375ec7f4bb0b10e5931d7d18d2914dba92f410280ebf213d245c945a4e4e83f3798947bd1d29132161cc5de2f47a01,7d13d455e045b123dc9bd7179c0f4b115d9a757967bb59a25e2c87f2c7d91b7b72e88bf50bce5c181d7267a38c93245d7b7de4d13a0dc08844cffdea1925e0c301,7b15313e115a55438d301fe3ecc2ce22fad67b198a48fa42268feff6e9fd6c1113ae58c696b166daf1761be0d9c011ed7087116584a6947b4177bc5a86f4454800,838a25a11c235653391ef880f7ef23104605439a7945a058519872fc7bf7b7175977a32a4cd180eb24beb2bb213713e490d4aec4530261de275aa464f4030e9b00 +b9304dbf90823b7cb365604e895c4947cfb544d0d0404d85496748b7a3bf90669c011de6095ae64922ec19a935969e2fba6931c43c621ea009fd26884c606fc39e0ca73b34ca68c0ac1a77b37b9a4f00a6f42d3bdbc0f329d3c4abdb28f9a03fbcb03d683f53c707d9a007,5aebef84746f9d6be80381a9f0b1b6c4570638f7e42d4819261b474db431de75,a1530003e2e05f7c3153d4ad0e4fc0c3bdf8f4e6ea966985e1fd6b9ec71dbaa06b300220170baea6178e57e24875b62539221131ac94494f41828556564eee8b00,2e6d62ac0d23375cc5b908bf3ffba7b8b31c50c18d5ff949d666cf2b7e4f186716a5979962b53f34013c7e8e33348ed7740f8d1dfebbdf2df9a7bd0799711ebf00,cac1ed98a036033efa1809b7a9cbc54dfe04f12f1e4ad562375db0e847ba09592c42b9ac45ad02bc6808313efea6cb5bd60e487bafd02e5a08207a5e4011fd2f01,5433b02c51dd77a17b5c15b6943831b0e2d162977c22833b557d7d022cfa8cec09b3e8fbb809e79740a55da9e24666938a145ec600e601cd5ac4b3fceb880a5e00,d9ca0556d7821e458039044f88124dc3f92262019601d344d68d66b1a8307803051d2e9848fe5c7af741431a0cb98cc5687530649c53be9d276b8bcdf181d13501 +d28d85e6d2325f4cb4e2b2bdce728c705139c916fbe811e0fc501eecd7f16a80c89429615b8b31d162ccd891842482c05affd6fbb2b5de1f30f4890f68672d4e4a6b5d5e6f5ad56d8c6a1cf60b626f878d8bdf3a62b6b76268532cda0602b3af9ec07b6b6deab7c8a58393,2ee7291fb544b0bdf7cd827968c80511d642420a587ba2b6853aeafed0a9d1bd,80019c8d2788ac3d952cd0f50046f69b2f53386ed103461a85ef0fffe7592e116d038e437b80a95ca990458ba9e1ebf94a898d7eca4ab21323a5d5ddfd815c4601,a122cefeb572055d492fbbe9fb191218bb6cd142677f24a2f0a7b01850de4e106642dac32fe1429559c5826bea40c848e95786c8efd3f736e3e2dd1e5a6b73a700,345a5a45feceb7b7245ad424d4a989b3557b7252c2b6e8fdf02ac9ef6262ec9d60eeef13138e10deda2534da1e0b05720e173b0eea6ac42311888ace8bb7485100,eaea6d8d192057532d3a1bfdca8b960fd5ce8836cb18f7d3f3acf883599330892a925decdbe7592398ecfda12a9789bf7c0c54146b8cce6f1277f7da07f4eec001,5102f6987867a2ff64b25403a2468ec180f4df2f8a4d4c1020972e3fbfd9fc800171dc5decfb5fde8edf2168605d3ae0daf2d11564249537d2016c430a3876d901 +b05add2162c5969bb6c34df7c0c00c252079b629c5c81afe618e39e5d9f838794bafcb43ef667cd1cf40ffc2b44c624fc4ff1be5fd1a37b6ce864733474828e0167ba214680e91ca093c5eef666a0a07276dade8f647bd7fe0979510148787f3abcdab1ab0880d5eec0a8d,655c16763fcf20f1ab5af7d6f836c058ad789adbe0bc1084d75a949f91c13bcb,4a0126445add93a657e07a640acee2e2b2da9bcc34bb46b9775d75a85c7f88c77f937cd0d11ca9b8b8ea23ec2128b7e464ee3327beff66c25db4190def266f2c01,f47eeba7fdd9785f75ce6be98b19ab4c212014d379893fbaf3aa632f17f2571655cba320b947f83aab3bb197494cbf109135530b9d3c05fbc8051349471c2dc500,e46537bdb05e1e21b0010355e97752deb162ee96296b3ce9504aa51a2c57bd7a5ae04a8fb7fa9a81bc9e896d1a85332fdb5588d468113f6e30deaab461450edb00,502a8def563013c0e679fec5c9d91cea96ad139f1a67de66c34bde8c1699817b599883c86f6bdf735099b328e5e630ff913397e610e336f9cb0d469e4f80fb4c01,4f3a06c5e8002751ac91638f8f1d2e565daf33960f122ee064a9aafcda381c3873965cd73ac3254add6a4bcb7e63fc1246872a528d2ccc10dad56c5a85e9ae0600 +34b8dd53343379338add77a0d13557b3d0c7934013abc18c1899d8567d29c4d25181686da250be2586ac5da834a100eb54c680ad92e09746751ead797a678352f3bbc450d3e6aa5aa12ae38b9f20a7cad4b5f0da1a894f0401f08e0a336b87d5eb6d0a793a11686f5f74b1,df5dd771f13ec1c75a411ef8bfcc3df41a017385912a5c454ee960ed38d9bbf7,e40a87f5a29bfd48c51e6e558bb732f3ba1cecb8ae77129dc1178e012bb2704c7e15017815a60767ea584c997a7d40100bef5ea0abb574b0a691b48c5c7662c601,65f9b9caa73ddc2d4230761be9cf5be43f19993ae2fe62835a63aa46987b45240509f30dce959e80ce5f1ed23f928c7061140ca05e905b00616223e4ed3f9b9601,d2cda2ca7a23350ee4e5cd2ef3a7c66e2077a0c20cb1e84461f59003563f078313b6765d5e179f4a7e52e9266bbd3c6cc5303753d46ba8b6424021a620424db801,f2c5c746caba949a6270c58aa92be482f841c35a10f527e567db978c06a540c752bc8c3537ebd58fdaaf409b3100ddb8e656bff2665ce0a8bbef37608c69e77a01,0a24e2d1fb28e5152ed14091e88235690b1276fdd0895bfda466af84bea07cfe66cc179a7bceff837c4fc2548099336d258a720d16342f95cd5b92ad3a8ce86e01 +9993559c7b9293e7814d8dcb29ab28cb75557e90fafecbd3b29374035215a038c27ec2f299f0f5247d560ea6710cc3d8066def14a74e4393bc22e985f6b59c80b5949a032bf10d01dda4d83362babaeb33c69a1b2ef6f58352f018e8d9a581d5349399acc67340641c8c99,eaf12db9ec4f3e9440b1cc7c42e33cadb201c978027bddd244d49f6ee9c79625,6018de8890b330262767b7432899153117281a1d5d467c811da0cfec1bb707c9519feb64f390e2c69ebde44b209b04953c5d8707d8b2f1d5192d421462ec36e300,1cc48833f89ef484503a3027784e4245789f463116d335754336c682233738243e950e78baa5198ee7f244f8eb2baac56ba114cdc953b491c0db928ec88ecf7101,d2e312d69ac02db0a321266ed2cf7942bdeeb9f07650284252f2cb476f49545f1ae4c8d3b30f02d3fbd933a43ab8e6c94fd23d68a5d0d93f084a42b8eb98804d01,bee0036e2b6234d2a974855195cca83d2ac646df1487fbd523787ec2cdb4c44c7c1cde6646d8f702ec190bab6739a56fd3556b52f0222790a25cd37a603ee39a01,e1901a1486c97b27ee991a4aafe50b84807674b3109bc8cb017351f333a7896807bed8443a488d66273d3365eff040809249751d493f62c857f6c60b94f1b50f01 +b172c0781ccb509136d403f29a1698283209b155e5c2de38dfdf02d1be363574eaff29bd089222124b26ba19b2b535a64283ff654e3e16a067fa9414a3d895383a7a9510674a5eac63ad852c3e3facc598e71a06599fc6fefa187ef926b942dc742d6954f60ccf38513983,3a23d5da6072c5486d1b5bd8b3638708ad6952487535684a04b8e8b7867630cf,90ec924b6fb8ea4dd58bfcbe4973e3ed90be2623e43a70c10ccef084549bf149747f8fce57bcdea66ba3cc38c49ca4041a5c7ed4f63c2f65b185ea9dacf7335900,e8d6d24ce73ac56c9d2bda29caefab1e2fcaaf505550e264f2fdf7b40fdb50fe5982c2b37002ac6f9aa01b84e8e7ca989d2156e9563e008bca79caf6dd345c6b00,8cb4641b89ffa7fef5663ffd28cd5274ca78028759c6f72576c82403e81fe8e6383e9c9413286475182794cf2b5af1bc3a5e833a573b3e0b9e7e161fa2a4777d01,a379100f58c7e8e78ee337648528f8fd9345a90c1021d6e62320e2ac7ae7c3476ee5d520b42c8ced046daca64ae9e88a2062540b1043935af5d9f423e4e7d0a800,08879620e36b1e01eb80c11562e35abe9ba20cc9afc092273cd085491533ade94aecb110d9fd2ca8743e84187cb472e5cf942046c412d39bcafc602797c30ca300 +68631d36a2b1c0223e5f093f54f9842eef3e03d620992adcf58b9274d8323eb323b34b92192531645ba75f3e029ccf69543931bbdc50a59b9ec65230e5c7764eb00e8898b9dd216a913cfc01c3ec0a31568024c110ab59137de2a126254d0b4ad4f2f40b33dd1d5a520998,05eca3e2811a9f5a885fd44d1c6cbd76e422a55fb119b8b38200a9eb3b202f11,d35712a19ec3ad0455e6539f50a6c0dbc44e17bf246c8356bfd46f8bb3c657bd1f4eedc756334d70e00c1b8553b868717195ef13489441ca5fa7d6e7f131571401,4dce5c3f3919fa69223b16d35bf7261041a40bf68515e554ed723040af4b766921025fff548b525b781dce36f9d8138eafa200417b3071627c9d3d09e237b13700,72c47d4328eaee163c9eb3e2ed5d6a75a8272fd2e723b325cae490d3637f34cc6c035f46bd190c6841c13db28f74086d80e5b53c85cb43612027d05cc96823a000,43ad7fbc549ebd4cb51743d4db39e8aa2a7dcfaf69c4c17a3d7555fbfefff86e294d9dfaf0a53e2a95d80ddffb7c199f8b681f425a8622aa71d1c4ec397e195401,bd8705b82f899e8c863f13b007f2d9dbaa8c3c82ffec0002cc97b376057db8b30fc2d0ca74428ae7a3e2a9fb5c648cf24bc04217b84ff26a1fde66a624f3f7f800 +71345f92e0f513ad46cff7e18266b73f1bd95d4edd7063bcf3913e14bc1eb6dacbe771c064f953cde7b7953c6788162cd1c3ea0acffee4f84f35f230b0e46b54e3249091d2b1f5315923873d5d287c485f4073bcb9c3df82bd26072b41700e6ee375a379b7ff1b4a47a34c7c,289094f7210acae3f321aac2ddc228cdcf8275463490b43a9a21ce89e1d83b69,7fac1ee1b17da73b48859712e391756a64aa60f7b7ac0f1f7ef85d3d33f09ce544eddaf114d70a72b8b273bdcca3087111df841e6230cc0bfa72f774b86b65fd00,d718c738c6cc2c6ec1291d0f7e78c55003a93477222b841f7841b1014e614235538bd58f53d9b765e7fef1321e3f412bb22a03b4fdd3a60cdbabc02996f413d900,1899b61223f3dad67c3538fcd979c70eae9ded3e7b940bcb870d88e50b60b8552316c9cb4d3d9aa798a932189b231388d2a64e029eb2627295520351b9409a0f00,5954702ab2677089d61daf57c528785df78562bbab618bdc6a939090f66ea6b320b99cd75629d77e3867a749ad7c20f90c883a91c43f45898e9bda3c60bbf84101,00ee35cf49f155193aecd89e2c016e04f9ae5f09b9b06e44737dc916dfe3b2757ad63569f1e5d4c9d8e564ec8b1f2b9b1c7c14c9da750108d7e3e77ed4ea6bdf00 +37057970917797e27bbd69fd885ad19808ea9cb6b496cd9b5346903771b7c72b9bcbd7130af0fc0ff75945cf8a54840b185f4e7d4f8176f38c2897f3c78d38e5c09c604ca00aff4d878ac5b4d04b6f5cc16a8b0d53a53678fdec67ccf59c156be827bbd118e7bdfe8fbe12fe,350d059943cf77aba67d9f24b251a735d4d3fa0cb16dc442475b02b72d02f6c0,a393abceebaea2bf5114dd4e258524e255398b9adcc9369576e33fbf65b250bf6654c0ac25cc0f441feabe6ee757670bd6daaa23f5d34cdda1ecfe0047514aaa01,adc62cce25d5ddd4119ee837718b2af00c36d9122e609aad7e1721fbf2ce9e2732b194efbc96c76d8c622a6aae15e31549dcf2ca2d0a937e7601d8d3213c7aad01,41fb496c6829ab5aa48e29d9683ece539ce7f1f876efac256c32501c31748618735990c91c41ab4b83142bacf383edd831ff3d24fdc3f4c6b6ec54cfe084879400,6911a30e2c123207b142e13cc8853e836957983d6c65f5aea5c3da80810450d41760d55e81c1a21e7993606a711ba48bdc6a9ce27b19cc2da4d9cb26531b7ced01,5799e0dfe19e425b6b007042f5268a9a62dec993d089b62a063f9eda2d13a6067a8c946b85befdb8f27d65efa6fd8238149647062a26b7e0278ee3f733ae88af01 +f22ad0a8afe46178891fb7adbbd94fa946b34e7b0b99744cf8382293341841b59cf62840d878087b0fc04b74873c88c42fc10e4362feca563fcde2bb3e1fff555bca24947dbed8ff9a4e9dbde71f69082951cead9e0bbd47035215207fd19ddf8fcbdb2a810ab1667ece2b76,f3a6a7633101f9355b8ce393afed24bce0f63cab726a7e9e2db350b399fded0b,373c4573f1688fc0dbd1e0608db01a03f8f29bd212b82e48064b4f97b503bde22850f74ff92ba21b6f24a3a6d9f7b77a8208383ee1c8e823bb8b60032f7c984500,7afbb8b682ad5dc6b9f0bbf5889b068e03e5de59545d04bdc31c96a68d7ee64124d4c49b989033487d7db33d089d00d90d4365b646ac878adb1a33561e44165b00,8a9aa56898441b6c9576ecf22971fd997b07ce412ae5212f4848f347317ccdb45ceb52ef4b468dc972c84b0089bc596cf3842183e34caead17e64cc9ae6473e700,8d4dbe10fc2ac46fe533d97cece5bbbf6f6b406ea79fda37589ffec61d4d76a32945cc66a7e595175891d8403262b5e0db4a4abc4f788307b4371de5f17ca20101,320c40772714c56428257e5452134ef64a176968b6025b5c8142cbe5e028c1ff2c078ccf2b2400f33930e1fbc095479a3a1afc0dae7789a221734ab1eef75dc300 +3401157db3cc4b055576835f375149dca97794863d9aba6e15d22058139e7074368970e17ccfbfbbda8dbf4707e6c16580a3318944928cb0b7c4a4745c0b6fc366e88420ca0e5990f0cf1e8eaeaed85b4becb1514a5734ea2e75ae31312a5e2c970dca642647fb5e629f437a,7dc2180e28ca053a25918bbb2ce46c20e5dd38b4d57ce77148d2343728624591,9baec0a7a07c404f9de350fa29d72f055cd7f12b3906c485ac579eb08a7a1ade4d6f5fd1a36f1eb19b141240c5c26db2259acb0adda058095827c317d6c40dff01,73bac4ec9668194aa09e9959785ec9ec7b0d43ca4d34c7eb68b6f8335de94a733cda7c710c11d147832365c16ae5c7fe9e9e2294330b2dac2477ed5bd99ea27201,d18bdb691d99264dd3d0fc1e01a9cabc0f84bd7915165dd3da02f04d97efdec9662df3cac6f246af9d3c244fd081cde269dd954d7f1247c0d0a58e9c35dfd79a00,1c053698c9fd1087643aa7fc31ceee0fcbbdd1b97c30c92293d8b13e003a39cf6ccd643bee89291e8c6ad72ad059d45db222afceb50abaa884d86c719e10fbb400,802c71b7d25bdc7683a97158235f4b889f1f750497011b2b998c039129a7030e0daf337861ada031cc7ec883e9e2465c066f947ef49a9ee56a2118d813afd31900 +d9654cb835dce0a15b1900dcd4b27fea1eb815a6bfb0bd98009d4fb73207f5b9ca171e4fe2d155ff7e773293f15d175094c378d0088c622c90181685082036393e65fd939f2a3f690649d0dea95d27624932716a11a55d14b08eac534ad967d5be6fdd5536e80521bd65b393,6b702bc8eb268d637c57ddc6450cfb9e2a920d5d9f89154501537092b0442d7a,4aa065fc2b61097c6dbb14008bd07fa06201cab9b62c5ca9035fbafbbb630778005e2bd81fefc52d5a0f6d630a3f22aebd23ed9c4e3be07b1a14d776fd031ec001,209c97dfd1f2fe630df644eb9394e0319d82d87ac626bd03480f28cdc4cf37535620a456695dfd46757c839336a34a1cdaec63b0d61f33aa885d18f4ec77c91d01,5ed4291be36a036291f4d5bcdea01f547f1586ff2898cce02286d3547af60ec2008d12cea015cf2c1a0f9e456244e730d8dee348c5f5998f987846f9230046f101,a38f4dcbd78e53b3e12b44ad56288a8e320ee29a7ae3e46ab0d120f223512af82f2c6d4608d10aaa75432c0d16cf2a7182435b6fde4c4d22fbafe64a11b8c6f400,83065c9ed5841b4ff95579395b0caf0fe4342a5307fdc5916b10d611656503fd737c4e18a2acdcc5590ee23486af3e5aafb8e4132cecbc6672b17df0fa44f99400 +910b47e73d2cd94078d20876986c41fb0bf8f73c286c70b48f0801bf7532550945069891c37838cea27917d7602ae2526c736ec81f52f739ab01778247aa8b87a57776a746a6f879505dcd19a61361c892cb808ae95eb2ffcd0c8813ab7ca2c8a8eb16e4dcbe8510f4933c59,3de8896a3561277c36dd9576fa6b4dcf00552111ba898581d2f9902d891c6187,1f035c987e1c8865a086c3c558cd21c84e00ea64162e4352f5b9f3e589dadd356ae681ea0990a174e9665e56742bb2e1b5ced41b47f8090b6e6a257e7c28622500,9e2157fef5c20dd209d6bd96dc3947df4667f166b668fa4663128323fe147d9226120331eba884ce5b1e1d4fe3684bdccf9172835eb1a7adf070a4dc2ad86ef801,269d2c76966da7676fb357eec1596e2f78f12c0f58d4ebfac2516605211aafd96e1d3e1253c4ae48a1c57b87b90a168b144b83de7097e41e2440a4070bd6758b00,3fd9e4c3e25be527012393ac2b77bc9e1cd03b720c8a92c5c532799fd9a64be01a90140ec0fdfb4550574e1af5d36c5aacd7970813119818fc52a85721c8b99200,9d60e0495c6a525c0fa5978807a176f91cef0667eee14e9f003ae759e9731ca20647d1d71e7c272f7d1f1ff1827e17a7a8f3271ad96c3c888f96c2345d1d015401 +706778e55e903a0ee41eaeed7792c528c1101a817589c5575661881653347c30ffb8682c343341fccc3ef22529681e35395549729fb96b21cd694c7290db9b509fcfbdeeb60ca7fe2fe7ec004f4729e7d41af9a15f645664a7202037ebf69f89d49b145f8ee69871e3b6cc10,d94cf641ba57980b1f197cedc26df8d7ea4a70ff424540acde4e4553d0e7cd57,ba5f3751b184a1c6097a443b76dadc53121207b151931c6eda5aa7cf2d0f9a257b0d6bd077251bc3de0503884111adb54ef6d4f263fc84dfbe4b58d1e8d91b3801,5da5ff3953898c6e6b27250a49c25f9a9c319a4a0a88990fd20de2a4e9b3f5ca11c3ec36c8124d70a594a970cd25468308c5e76060ecef6e2dfd1f463e05460000,1746c8a8600e0c2549c940cb96a6a71eb66d95c5fad2fa5ac1cd618703b50b7763678c57ea38cde418f0ac1f3ae13ec22994599156b8334b84a16fe667bc8a2801,37d6c07db47be70e58b53e17b00a007a2e6e8435d3cc338976e9c92f06f615730767455e93f20893053beb253a99e8ade142e5b66465497d12ef23b6a0f6883f01,c78dee9f49cb3fd6ad98ba459aee337332d4101321cdbee4683216f64c9a8b860f71a05ee3709e1d06bbea0742850dba905294486fdb139589c5c9446a46056300 +17789a4332b339740390f1d01620306e5fd0097c404f62b0a4b75004437f10e711ba0c8104563b07f1fa85719803a6d891aff75dd82caa1a7119452bcbe37daf26f388ec5dc6079bff97254c2f7da759194a0efb8eaaa0acbdfa28c107004bf5fab133b910375346882248e6,6c45d049e07ff3cd43a3887c0a3f5c14fc6a7ca29647645bc1d9f36f720c15f7,dac226645ee6c19767bb26ace50a91670242931b77f8a952f652b7dd1324596a19c209c4f098540c3daac7b9e85c80873888ed16d692e9d05779ba435b8be22f01,d405b2e65f76425767d26646f5e1b67068240da90a2e6867c880328616f69adb692fa1d92f7ac1e78be085f72125268ce5b568c0e0ccf590fc86dd759f686c4101,3a68eb5fecdbe50c8525ab8e04a34272d58dea612600ec11e3f35962e18e4b720bde03795de21f9f65ab4603eebdf100b06ab2797a1469cc86c2159a0c8dad3600,c3781041900a33ed39ef31f04853f7e4356b3ef80521c3324c21d656ec54f10e31897daab977313c01e4c56edd510d3e7538ea86a8930fff8a72e4f275230b2d00,8b8bf76f483a3b3c3e784076f6256f3bf2f0a578598eb5395dd815cf2a9cc06824c66fd29f9e13f6ae95cc4b96ab6d4ce3bc2ca4cb347e3165b2abdaf3d8198600 +0272eb4ee1a903c49838a6b4c0efc92bdd4458b29f7e8a0c57af8ccb3f5969fbe9b9f4fc4624503fc26407572e3477b4697037e4d745d15f18ffab43c40a5ea7db4307ad912f0485c05fc2497d5576195f7dd8c79c9d9c71e1c0547a3e18a2e0c6c19bff1d1b6f1e11ac8410,92f88450d3338529fbb244b0c1711300c45d7400dc9c4176a5a0a91b4aac100c,2a3d8605b0993211bedc7f4af540f2173b7ece8a6e76a639b82ee5301762493250c31a64402330873a24f5c2a75cf44e0fb9f5347ecb6bb63b940d69a02c4c8601,2ca918ea6eb608d64e1f2e7ac9b60265178c2e728d774274b6122ed437f88e9c317f6b0d9e69508bb1b89f69b4fa80052e83d1530307b58da6b0af0fc9681da101,d53ca53735d874c79bdb4eff9ac67229a920067b09b83cceffbd84db05d810570e8b6be4c34f86482210e705f036a266886e9cb5f0639a49cc7a4a7af45f3e3800,9470fe5503077c1a3c3c41f5d5f3de13bbf183e068111693599c58c3e5e542c960f10d623c186c0af5abd623a44499be82c7b542c02c591f9069b044fec4e5b901,f83d4dde18596a0ce3933ddbc26086081e61496131f55c21d753dc1d4a4c51e7260c5d24879262d868611a82fe0d2133888c0d072f925e04e823630c4dbd889200 +60929693255684a52083a7c09a06c514f2a568af850fd03cad7af903c4b971d641f98fee8a4d8ebc41ddae6b44635037789a8316a75dfa70175eeb5bc482b0a56e75d943ba3a43a9297244ae6ad869afb5d3f08c39d14c67d96d3e8aa5e4b56d3bf59d697b3d29d1f996a398,538dbc70b85bdc005842fa90f26ce496dd7620cc6c24fac2e0aa3974497ee442,38917634589bc814533214dcae3f911b98e4bf82227b597638b1f5b3882f3f59175b5347f76a7f2e57cb5a4e8baebedc1a95f14620e3270974be64396a0ded0700,c6c9b8a4a8b351ea113ae21cfadddbce90b3625c43155870219529033480ea3575bb91aeb5934fc5beaf692779b04847b0d92fc8fbc593b8a95fd0ae6cd8ff3101,baeb7bdf50fe7117e66c5847eeb6be1bd70a67b6e7d6a071059ab2a7fd1a22e3247bf295c4528663013a588f36c150c983e3b47c1319d9ded3be7249ae89a43600,bd9966b4d1126289200e7653d46da2374863fa7e857b4d0311b1459fc4cd250152bd2460f3a425d38f22b7471455491f264ba10870bbdeef7f355aa7f95d697400,9795fc2ee37dd67bb57ee0fcb52c3798444f9c1ff024740c2bea13ab88becfdf3a93761cd8156879dd7d28a14fd10705a71b45276531a66c73e2c7fee48b1dab00 +29d880e7493e77c4649c83a290400adc812948f35f04f3c57b9f1b588fb04adf2cd2cf7fe8d3d420d17c30ba278a38a00a91b67913a3dd1d0615bec6e0a0ab2fcce6fe23cb9cb69b008ad271fd33024f3be3adac2da9eaed25e988c3177ffa5fa8471e995e6f6bfb1c43c66663,0bdcdd6e560a046f8f53955da51f1740406855f2f475f67e22236b76c960b5b6,11566bd1f755fc9831ca9e126e3720b5a56d15b57d2afd7a59073c72a993744c1459aca6734036ba9ea184686a353c9261acd54c5f72badb30e0075859fd7a4400,ef39173dd8e6d9d2b60b8c564ef9e55edf2ac818323a5ca375fbcfc579c547352d8011f6d31d6729970c0f459833a2d07d8039777a5900481cd84e6abae6c92f01,57521224d0737b6c453209323740a13aaa6be16654eea3b26d1ae6ff701056f36f20e04af564d41b68bf2120c45cf7d4d09afa6e46edf06189f8b5c862f38da901,cf972e5c6434bf84a908e5a322e0152a71660c61814fe1eb0dbe87c634e4d89370c47a43687355b897037b966f82041dd68b79a753ae4c20b910c898677698e301,f4fbc4c47dd98684323f639d8758c1b8c791fea932cc073481a84f0d2c936cb705d532de4b4c2740e1a90ceecc9a7950aafe5a65a3690b32f5065673b55fc40c00 +6d607dc9fd749e42a0e61dcb51cdf40146116ff8762be3b91937897fcebf1df33f9265e749ee7e46cbae56c581ac10f8b88963ec4b46f6f93dc3d4cfa0bafaab53ed028fc2e12e7e4fed1e487ab552733b7ea6bb41361d5124d30fb82ddceb863901444cfe63d8bb625b658b88,9b3eda9926a5c7003c533001f73178f283dfd8c9f0bab8d9f0ebbd47142b904e,a2c6016bde14ed8831f93cf6e0ead4eea948bc827e979a4fb42ea8d20652b360323174e3f96fb48d899c754acfd07b1c3a6b186a0f4d6c6a9086b558cc39fada00,e26d4503e3b613c5cf146642a115d3dc04d725f0aeb841a0daec7d4067f4c0fc076f6097f42d9b3c3a9e66eaef485e5ae838d667d23a7a23ff87c65469c3bfa401,393f37d55767e7227c31cdca1bb0f5f3e29a37c4e6031cc6fa85209b4d91d5e96fd5f4a97866db360050d25c3b907907fdfa8908ce902b1eb8fc370bbbf177cc01,1d82ff7233ca8409a604a0f90546346650aafd19fb90a37058a518c69e5641047d1e8f798097b2b8fbc73148659f4835c1d574e82460202a945f5da6315c476b01,c137158969c24128bc69d2b8efc85898e31c906c5f00eba2afc13a4f599946ca388f815c5b44e77dc8d7b387b7097e873dbba1978d59842bfc861b0239f3e70200 +83c03ad1b1ddef1a65d0672cf6667d7e231463da9d092c89dbd180326b895fd706a5d79f309f74cf4f3e28b8b615ddd2cf6ad535b4fa5e4fab07d1fb81ed10f835a6e7c567fb9864e14a97eb922d8197b162b619825de0bb48ef76e42d2215db3a4f9291ff67007f0d6633f2d9,1cb22331a4f2e0d0dc034b764252702a74b63ce54e603346156d324d2ea3f975,f59d135e6a4839c0f68b7dce87cf99b5972ad54a2f3c4b1ea787a3169d34432d36ef86455dfd684a5157a5fd74cc62af0e00e379851be7d5a9152758afb92f7201,05fda925ee0038326a5617904f653d14027e5318cf770b4fd01551e84e56e1dd0e081afe170109078a06c4db50458d231a5334a02dd4c683cf7b94ad1090009e00,4da1f8a0dfceccb3d95392af09e33d98e60ccf26d53467329a8b0d837f332f163505bf15a7af367ece8d75568497ff6b89fe96fc755efc3647b88d35e603a12400,4fab8d726d6deeecb6bc8edf1628f26d3654b56484e9a1dba398a8545c77ad137ba38d67faf65295c1f286dbc202fbf010ab345101f84bbb3e22893ab7b67ffa00,c071347e2585ca5bb6fe40cc189c8493e150bb7ddb3e7f765aa8ee36f6fd8e6228dce2ad77efdb6c6b3b1e77fd533bd9c575774d80a071a1416b07febf0767f100 +86a5d4ab80078228917970fd8174c5f32694e30604425734f5b6c857ec27f2d14bd5e02d9e6af35f8569df2814a6fc881e74c053168b6b079356323cfe85d4c1fded0ded4d9b4d1e7dfe37bc229d420568b5a2b3bd728493d508a0bf314eb7b41b1ab84d685ae09b1169497824,ba588d5d25f56f145c7e266ca5712086c925c2095d90e5073b8acb30c3eae3b9,d73e16cff61cb112532ac2eaf4a76d1787682b6e377114a0e9710af0fe8325d23855df91f72cc66555cce411b8fd83301ef2285e1e032da44cee40cc0a7e684000,1a5eb1426bec1ebf2cfe22d8f181c3ed75f888c0a69416e47296f266fefae21f221de07ad6b6b415bb3dd4b5880e9ed301931bfc26148d475aaf6b32b20e679601,096a71791fbcb0cbb6e29be3546ae232f34882565141c3e768317f4316fcb3576861705ca74d3b9719f4a4a8ac5aeb622b8924ef4c3d41752d6c098dadbf290d00,ef6f7b4fefd6613cad529bbece872d402dd94edeaccbe2009fb215cf229c517671c1ce6b5ab1783c2a2c8327cfe2166556424b2d5154e8167dd992bda6e20b2e00,a8f927a0e323d5d29bb8ca525d935110acb60ed4d5ff46e77d01283555c8ca007b3fe01516f7ece82a640b6728797db83a1e6a8c2f04387dad459e70ad74535501 +fddac76614cca96cef6606ea964e1e0733d8bc9a7f6321d996e1fb932fa56aa3d7e1d899f86171c679bc0aec5d0b2b0aa28393c733a09097115358b6382888176b6c52605d3c5efb62dfa997dd115c64e4c537c6c514913ffdff3462fcc1344701f346db25a00b2a561e281f0c,373816036b7e28558bee7e80a98e02ce1e1a2ed4c2ee47398de3fb78ad95a6d3,4081e6ab1a3425a94398b1c66d9dd9b0de2245cc82fa7017387a6e88f024271e24f553e309449694a558e34d22158d257cc35ae32757dc884059f6d1daf9d88201,9ed7b219a707e0c930a4366e77e2893334fc8af39164a7e2064f81184f1973e72867c399d320dd372760a07bb2a775385d80d9fced83083635f15fbe248830d800,0a7aad2e06fe70903aec1b792ae28497bbc0a4f26765c3e69f032b4f1010bba037cde76e54d2adfa2da1ee93eacce76ea95677d6a0c02ae0fe183560cffdf6a801,e9571b61abccb205ec7d3b6fef0035d74b0f7071ac082f2dafc41fa3f9b079cd45bb559e081f4a1cdba26edbe69286bba5754a8f51478053111f31ee34b09b8401,aa3adbaf67c4e73759cf6a9b1d2b556fda6eca36e80f432faa5c3cd5de97c9a56b0cc74ebe49c64a7e9748ad6e7b36edc8f0d10f7206ca57f0939e9aaf979c4e00 +c4e194e378bf64a849552acd6746333ef1d55b75366859fadd52f7d460b5712c6d3d74e8b7cd912bcfbbe99eb439174e5c8d10e238dbc6820bec6a315fd452dd53eee2484c96b9ae59c74879b66c409ea43d6dda87c0d59f0e96efb442341da0a1a4e9e02889665af605bd02ef,da5a453c90a318d384edddde94c759e90662233c0b50d1e77b15672fa3e6ec35,486634ed8068f55a953cb09d8000244f66f12038e282a5cae32a0d6a06555ecf7cfc53ad30a11cb82db5a6415ea23a60f762f0cc3355f45484e06a6903ca2db300,076955302269f18cae7d758cf8638f766df317353515b8f44fa10e3c69807338709476d23c85f0788a0cd99441f12e181e762d568bf85663ca39b455105813d201,4b3197b65d1873815ea1b8d92d32c45278d22cb6b471b726e8cf0a5ab497628424a635b087a001440c68052310cbd7d03ddb59984f0d32b9312b9e4f994ebeea00,fa7b60645b633719f86206dae097fb86c57501d468bbee7f4734e04de40bc01f64d88c32198af124eaaee27fbce9f871ee172cc2d04e0230a29c71a33ed3e23700,b28a75c8e28180469efe1b868a19969cf537dd3d2d8ebbf81062f09f8d48f470104ae3cf499301f45d2bdcf20dedccfa93fc607c5e5e09bec9deb88f73856b7400 +d0ba32b06de11e5b24e4b924e185143f4545e0523a32bbe64d50a6b9ae401d7be3c452a972a34402e1006d273499a45fa91d93fcd4b6f498ecfebcd1787c5830e8bea3dc5b349d3828b67fbc87c7f2b0c057d86eff464d0a37bd1d87918ed436a320f4072d88a9d16a10a1ef97,6547b78d9668a7ede758b9d6525d51c84ef065efb93466f83674d2bc91d1ccec,4da33618850cea3bca4244077b3e611f3c67c11c56d4e69c59753465bdf7e6bb773191ac832d5a001d1d2ae8322cddfa664703d8e0e6a6ea71968e1df09c348200,3c3fe365154c107b8a91beafabd0474e9e350ea4b0f08d8cc60ae97877f3b45238f5b3dea867b6eba44f366874f1bc2c4ed8afcb4b15eea753348a938c531c9901,4184b6a8a5586c10916389f486196593f1eb3b992760c74094732d57634a97847410052f00e286d33ee99e6df140bf14125320ea980fd0b99fcafd775b0687a201,d25dfb5416154491000388f8ac52e78172a564023664561acf1a1e4bc3ace04d28299e8f77162cad2431009f9ab1cd78dbc468498d1b539e20776e548cb1198001,9a09f099f7be43c2da2d71c9c6e406610cb7506d22bb897f9a1d3f09857c060a383baeee6035f6199e9e176b60ebc5f15f7e5f453c85b24fbfc18cd563efc70000 +ef610547c4a41e7d3199a7f2cc8ab66e6098799d95206139785ed81743120f514f111ba82eb803e15d64fe5ca5d4594cf6bbcf4e166f9d04cec32eac9540424c66e25b441456eeb55521dc406716cd0be471fbd307a77dcf484c9183c121cb4974a65c0e5d6765b6c25d184676,f30e76fc0fe0905e99d424c2c512a05786fb06bda45cf086692cc3d26d906b7c,c4bfd9543958acd97e5ada6480a1350ad7102f0cac6d56b0922b2173d54e8da334bbd84f6e5c08ea14dbe0a4a7373c7c6845181883dc353b927222e1ff5c159d01,37bac958db8b51cab55fa1e0c4601f12958d57c87cb36260ae5466b547fb3d2265481d23e7045df18ac916a5c901e6b91f7e4d9474ed9830f140585e9e17207000,20f90b2164deb0d6caf8328ed16f570e89bf9489d5e00de88d620d446640846723d2aac97ab6732e598decf12d4a816958c9da881ec01a2eaf1471007497964800,758547a6a33628622cc14db0f537d0dc9194376f5fd9dd01c011f0a9eec8997377f46cbc18076019001b8ca729c0da56daba89f8ff993724c0716c6e4999ca3b01,2030e38d7326c97ed0b98fd4e52372475630500e6b5973f287097ceba75513e6089dba1f31929b0ab32f60ff329048b08b4f2461e313939b73b34acbc535256000 +4d3cc9e17660ddf383bb9cca6710e37b38c142eccd8fe8d2a83b0c5c3ab670cde99337a8d7ccceba97f339bd17d211d2358a340f4e8dff01d5939904e86b2f813536a43d4260e463a66732ea420a68ec0b8e64d596e8eeaa1a5662f0908ff1cbc31bea7e7e525f199847cf686b,595325054eafc21879cbfd60ff67ea97a8659e36e4724f1d1ab811e30958b30a,fd1a0c554033aec2df6adece319bfd667535785fe80bf091da6c8277b86add2030ff7528cde32b339c4b531fc61c7c1b3507621e5cf92aad5b3af6564c6f1b2f00,463c6fa0bdc346d7f80f69595a8b9fe074af412b12ff6f82bf1a2ee025e82c671fe72de01f78c10e6d18e08ed0d99c7199963bb50b77df0b2b2ee2501244b6f301,9bb5f74394d37938f93194b5665b9361080d8bbe5f7a47877bb69fa7f2cc38326cefb34b102dedc350078c762aa7beefec7246b4b9dc4cca7b214fdce157f14500,f0855a4252ab954c44506f24c49e81d89bf19cfd28f7974ce848e49118622894396fb48a8ccf401c044c42e00ef4108871ac4aaf0b4be10784aa1e93206a486201,789bcb57438dc186762c6c0bd0bd72e1303e4edfa12346b92694de9e90e98efb1f0c45be0feec2e06f648d302e40061ed2af6da39a1d0ef5e8843eeff8fee8a000 +a7080e454315d9c08110668ffa5e1b47fbb7d51d3025b28ac31689544a848c10c865245c65c9809e78eb5319a50ee5bccebb594bb35d9bdaff23f6729e1f90ace98ed5ac4ee655f16e9414bc3a0d7f69d62af0279a52bdb6acf765d5ba65ed1e8178ca21a7e18e80f4545c9c61,77a2cc9ee224ab94b96b186ae75934a7825f76cb268a14d05f688babbc55b9c3,fb700455ce743f3cd0017f0818866ff6a27f7b5bda132a17c29333d6290977102e1f9ac36eb84cd1999acf37e022fc349680a09f96b7b3ba4470cfe31f94bfe100,d3cbddc9efeda509758f28f291ba571df9f93d26cb42ebca4e93dac58e77f6ea2edf2681f807fbe9253b89811d4cd4bf67a2d306d4f89ee3fccc4578f230459301,cf6bc773163b74ea81377da8167bdfb8365d0c6890cccdd4ecec0125e7b5e5eb279616e1a7c96bc10c829663dc2733ef0de0ee30407c6baf8893366ef2b2bf2701,9e540be47705bef55ad34560b6d0b7e6d7441cb5e79d4fcd204943503d6061bd6dfc81f7a82b5fe5e1754376db00402dc979439e81a5d24ba441782438b4c89800,adce0dd7cc2f633c993450a350d07ed8b2717ed3d4976196df0ad28fa387c70a7d1efbb3934de86c78d3a8654dfa71cb3cdac3dcd4fc3962ae83fcd068a27fa001 +b8a94180d916d17df8fb953240c4ea77c1603fb0ade0c0630ff10e338e47633600e17c53d90055817bc4e262583d38e3dc089667a181aa2252a6b27aad1f14efe443aecb665558a0360ed0e437d0cd430ac70e28438356dbfa7ae6913b33a3532b34d5bbd27d1d4bdb6353ce158c,dcce0fc3313683ed89b6cfcda74f36f925a4a7fdea0c8882a631b73ee374cbcf,d80808eae0f8fbd312510757d0c2973c35373772f37baa2cbcf1367b9a469427320559b4f5d7154473779e17a395eb2d21c6a0258098b8ef0c36c7b77fbc663a01,75512850f8179b46999366b6db3ba74fa54f19f8c012890560106366df3731bb55b41ccb0af2f5f8f896614c2950b751008155666ddffe3c47941d3fc7451e6f01,8d22c4880250a5251b8e2329da7cb7d087ae6d4edde47bd21576d3dae245703f5ba7dedd3d35fa9c5c09f0e5260687bb31d5e84b878b1a355f8668323fcfbd5a01,919441e77f0fc15a7d2c0b23f3a2cceb816a740fd8044e57b7c7ba5e5703699e456d43f16793fdf669bd990326fff81d2f64c09d0ba12dfc0a62c955622f674e00,c25d0beafa9c12f5a215382f5970924c6ad9957dfb19c45a3f5b1aba9e802b7a070efcc9e1bcf059428790bafb1937d10dc4662c972f791812c2c591114bdbbf00 +d9395d41964d4a56652bdca5a4657b9b2edc1f78a8527ede9856555c9b3d8d0009cecdd65b5680f749a2c7fc8b68e8d92e8654d68d7ef670277b916833b4298180ff22ad2a53bfac2f0f7405adbeda4dd51e5bf04dc9b56e49f8015a8ad19a23e5c8f3595a49474c5af7206f2daf,e1b4238be1fc46360482a5a7f03c2dac9dc496c955975467cce009db3c62f87a,fa064617343b27b1bafb7f78cb062364d32aa67f257dbbc08fe22f20ce639fcf7de370a2faa8bed7097abfe2dc5387bb465f36382714b02f81a67d93707f2de200,0e4c86ac38dc4a61c7afec7cd45ae8d795401e733afd9c289633508ccac0c46a7fe5fa2c6e56a45c80d87adb093b1faa97264f3d80d277a7b9204fdb9a96209b01,142c0a1a904f5020a879338a28fd3713b795cd9edb30a9d4512567c2f31594ad0cf76e20343b1a2a1fcfcc0217264656d80e9e37555428a8d2be64bc0328288100,eb10b5d3e9452c375d19aaa136be32c832231f1a8b871c53b7f7093af687ffbd725fcd5cb64eba016b43a50e35ee522741b77e6e7f4b4926a882a5549176425600,e28c81d37c105fb9664bc2e02eab2b17b4453a211e5143b3623603e58dce3a827e0539c84d5ff5b6eaf6e2987fd6e0d57d9774e363f85536dc2a0cd9d16d26f301 +ce3250ed9bf1d2e8ebe24729bf9acabbb1b85e4a576f0ac5c35a4caf835c0431ed1e35490482eae916de2318dfb0ee232fb75d1c64e383e16de7ca6b3598073c73de94556a00b8fec533b817e3b3a8d52b9fdc37877f525beb4e02ad18fe62e7a2b6e2c1bbbc56407edeedc24bc9,b2d9d380905582c65fe7e36cecfa734c8a2cdf094d1a663ddd3a50036f8b4c94,0cedf75945d4b6f98ef14c413af83a8c156c9c0d026f44b54799e78d637fc40611c659ac6c6b473e59db7b3705594a51d0b93fbfd4f2d2bdb184cfbe4c593c4400,bc56738e66d4edfeedb0c7db7253c76037f733e0211c3bd4b1da7fd9c6729d390356b4b3d57c4c6d434538c9f551458eff3596d1fdbf83810da8f9bdb9bbcf6501,582521c8af0a9a79f2191fdab8ef17a084e5c88fef27791939a3abef3c65541c413ac0f1f9ac893390fe39d63d73ea5a9a9bff5355305ade211f98627bce379900,8c10f92f4b4bd6e1e63ee6e43c05f9ebc5d751e6395dad8d33798897c17699630b37cf3bf2d8b48ebf4c002b6aa008e85b0ab64cac824c96f0230e8c3733e9b500,10286ea5abaf95b4a47fa416cd8ee57a26c47a5e82af357a41dcbd56b8c5c27f44855a4eb246bbff51e412dd1c24363d3f9947610f0b2a501b72865162ac363f00 +325567002833baf9779e52b7e05e53f60bbf4a5e2d5f5a7fe235533a23671b027c5f5f72083d773b1ae299964427d7200a7d521583a15950fbc7c588b99ab05081122df0863dcca4a9d73b16060f1b3ade2de38bd8237e0b16924f1b7da0b93104067f2c56313ed074de42ddb522,18b6ea42b69b0d113db8b27930590cbf06ce8e7941942f6c4a50027d4f71ad8e,a985bc0b95c3d5e8acdf687de0f5bfcc35fc617aa2a632bf3fc67ef138c0adeb1e432fa68a849c106a064a73de1de4c232c99128cf06456fedf7e17a8851615501,06a0b3243aa87791b9b0b04d2bfd3cee91206e962928b5fdade6b70dc393e4d32c4508882e821242f42b458ad4d008ab66f58444d601c74b360bb15af24ac62d01,97dd995fc18bae19ebd106ea4bafbf0130e67e764fd5c333ee961417ef218b00132bd1dce24b18eb95d204a7f49321d98abbdac487f6c2207dea39d2886d801600,8f8507c079e9af3ece465fd0c3009df83635bf13732e7affc29a10fcd4e3d6df79f5edbf1bc08d0fcc3e86674b58b650399901ab7209143d93cb868b9fd890d401,a29d24e937685e6c55a7169e3b364668855b8558d16f4cb61b86967f1f0b98c44b4c416984059a62dfe0c9e8a31a30d669f9ce5ec177ec3f260bb1e36a35ec7400 +b0f86b0170ed8836b7eb62f8ccffa8aa7f125ca76e5ac56942c4ddf5240ecf9df56857dc84189c79a287e9add944ea7dc4481868924b539de7445847384a6c3551fd2958a93434612edbd497fb74c074896fe9bef0dc4ebaa22f140259072573260b011111a79ca4ca9c0095de87,9c5a5d14221bcefe8dcf0803fd81a3f45d6f6f8d23d509df298cdb9ad0664260,01bc19ed335f803c07a90cdac2c1f972943c547b8e6ee6c8e43d576f96b1730c64434edc6746364972f6262f9dcf071b64b7037d06ecca47323a88fe0194a8fd01,8718d25b0f54e6239f9591ea71e6ec5696fcc9132fd3dafe3a0ae51ec49082743a858d1a59f9f7d7fe001c9904f081cde689a1d6f69be5c23d838bf3abbde9a301,af64b95c03316ee4ae4630ee6858d8d4743e5d530cb5ea1641b0d98c579fc83232785f21d8dd2b8e5bd23c457ab5be819b573ab0ecfee3a7e871b19022dc56a901,9d5666bd95017c4cde0cfb1521fcfa905cc6d999d143e427d4f6799c7984165569ee5c3fe5a58c24088ec84fb091dc82bd138a081e5b77ce6ccc17b5b2cfba8d01,62dfb74050e4809b7b27fbe424594958a57d95c99538a1f3790f08c405c3c17b0ec98c76d6c5b84d81bee31c38736c6ddea219c85597a93959717d9a8f1cd5a801 +c5dbfb8dc5bfaf0073f90f10fa9aef43db0a777341f0c914025ccb872ec3572801b545249ab7437f1c58ca6bace80f7a520c64767e302ad5211b1d836b26c8dd1d4461f47389e63bc7579831978f70c91ba3b8539a5ffc0fb85d93c68eae03185b9576d45af220e048c16d19aa64,af537b5535cae22716336224a48bf8293a23b3f6c348517da7078915297a0461,a14c9b08938a7240723888d1641405338f3272718c179481a9aa3a4e4d41062d1773ae0db328d69010ea123e83e1cd56ab8bc64bc449d73bcc67add3e2c3a68b00,a8b60489e3aac6b1c63edb8d789bc61682e59d3ec46f6f8c7f135461db909bb46da59909f9504b242b1bdd3bf90c668641e1919e41664e37f4d07528b1ab2c2b00,a4c54c61c6a9ff07bc706b0ef37b3be5392fa9ccf3fee6cf449c3db253d90fa4039a55173c4d9f25f3ae013c51c2f85d58836dc51497bc325699a75cb148507e00,bb96682f6ecb0574c85398f868dc7453249be654c6ecffb8e88837a5b50682610fc3a1b5d8fcfba57231e6a864733b1a873f34870b717cd8d16fa9aee5bd3eef01,aa9bc9b887f950366cdbd2e1dc2ef429b060c681c7eb98ba96f1aaa6281c20fc707dc09201f08bb3d975943c60b344e45cc81837fceb8bfd7c5e46570e17cb7801 +029d011346f63d7b37f8a3ee6564555997861873267f7ff832a0673d476fb6c5f7a3a915b4dd9240b34fab0e25dfa6fb09b345cbaa460f842420a974759384294970b828be86bffa97bdd21bba28e36411d18960b205a92a0fb1425c15e5521fb515e27a5c540ef6f97cad48004c,71276d3c6a10ff561fddcb7cab8de60866d6d648e8a9e662bce0b0e75b71cd6e,fd8f7fe878435ca1674ad0ec115aaf2ea7acd821199f096fca7efdf95be60547689c56ac64da50156d9328273271e1fc118cd32b611c31b12848b52d9d9ea82700,631f02a0cc3854c6a12fc7315937c473db6595ef3c92046cbe9808606f1d573b5a97d2257d575759e456a72f0f46111036795732bd5d21a63950b4f6efdc4d2200,c4de01535a99f76a251dbbc83b0138e5e1fab604ec7fc131aa7746caf1191000212625c1a068814bbc93b9c44d9c97109f864db7b65c8827600d8a1914a1e6e600,036b653bdef2ceeb120993fe1a61c4719378c21672ce3f4c57fc7b1f3481f3bf4968822a4b649dd4ccad8f47baf2d4c8c583bf644e5e11495cd7a3294b8dc42f00,e692dc15d16f2f627e7fb14fd469c7608ce8268c3990cdeff9f112899417ac463a752db413c4238f01745e626a2653aca9c3fc95a5c18018303d7636397e86cc00 +486e9bb009ee058cc0d0527463e30163734cd950f1d1bebba5bded57da3faea6bec3372d8fa4660e763b63b0ba49beb3cb342ef2181fa80c24450b5baea0a3339f084e21ffb66338e662d0b1b7f6beffe0f82a08d127ce941a0a04ce00558d2a172925f6a9c047ec7a53de909e8f,3d284fbe532e13634cd26838ccf1cf4f4b7536602636652a6fb4e892aa0ab591,9c2ac4f5834166ea34b3315857af36eeabd5ffb4ab92176941097f221c26b4e86285771470e2e00bfdc8cbae32f613db3dec86b7e1863835ca64539a484a907800,7e676137c38bd8c8fecdd2c8c315310c331d4d51f7e432d295977aea6714ea872b7c249418c847411be98b38f71cbbd5ad52194ba5466dfb38b24974d87801a701,a3704da4cba23b5b1ef4b58731cb8ad56ec4ef6d1da10abbc00653c1a01920074c481b66a600693134db25d3a5cfb5a7fce2922c3d7d26a343863765c2a484a601,1535daa85e589b8ce71a955d95bf94ecd30d3de0cc2d2faec69b73ae122f6f7b273542c09e897e87536fd7bc725b285f4f144cc905c008350462c86de54cc0f300,194e66450cc81931f08961f5f3c245c621953f7f53459224471142da148d647f330997de5a3acba5572b312296b450b68b07e9fcf96f4075307547cb12219d7e00 +d8a236ab325fcf2581fe557d9b9464812f9e430ed5fa1e705009419f91102545ced00d29ddd80742699556532bf0e85fbcb7faf0690471d13ece0b40de6c3b8b5cdc89729634d405afa1739dfe413cda1cfbc9803459c2eadc56bd5a78c3cd960bc98bc11b2abdd85764af39db6c,12f2ab8f110fd269167c1ff9dd18e562e69ce95b50faf20c6b9756bf3764577d,14fba13d62104d7a5a3973a90bf53308760514ee4deee187e34608c9b7eed827577f5ecc02d6e6e45bb14cc3d8518d2d9c1e49d2b239037d6247176396a6335201,4b254a92abe77942f054fd76ed2a3137be35c185d55d74fd184189dc869a68f045da7a5104fbe38ca690fa53e169d1196137621eccc91320308389dbca5be8f901,9f84bc1b568c5fb7301c54e16bdaddfb9a802cf5864e61bb6227237c92896bf331af1ee96fef4642cdec94e91ffa485d4df441c75e392c495a9825577757c82d01,04e3cac1b9fbd8f39ee9970d2fbec46bb52cacab3ed378645d56a3969cab22b527264d640294af26d99a053354c65a40827e6071cfacc20a1370e91819be816b00,8560fdb2b3f81e187cca3024a43a08fea36c98cece85db94d3f5f05160c816302bf2e750a0d30ed2cc146a1deaf0620e82596871928ce75bfe5f815fd7be298101 +2347bca34f1749cf41100afe9bfbc0fc296191d46b28453d80e6c0e5cd6e8e0074b9a94886974ef9d67a31ea68ce878db0d00a64ed47b7485fb75c082cc13832a1f143b1b332e8dae6f8feb3f8730cd1788f523e75460e1ebd1a4855b1618755ac7e00be4be703f8a5fbb532d3c9,65d60caf96f74bd02171cff41ea85eb7a4899d0f98740ed6946ad99ae24dae83,fbdc19f2dc23beec423f25ce351f577ccb834ff8674efcfa3fb72ef7b8b951ca024bbe3a11cf3bbc25d656589719b5c0932634785ec28cd4b08ae80feaa6335300,8d91913490a39de77eba58d2b4acd2664b5c3363496208a76c48f84ce8adfa38311e0e30b90b7c827acfd7e7bf05632b939e6967e2e7848414f6270ca4e23f2401,5e8e3df438bdbda95133b86b0d95d08dc8ae7d707d6762b65aa012ee978e95535c1b6adc84f792441675b7876fa5f63ef3c51e13d96b41de88117879d482f61801,05b420d710907629f5f73281ceb15bf7700d3cd6add1d5ed9240255c3ac6bb432c69736e046b606b0ee1f56311607dde399c0df4b1e2f1eb5d6e9048b06959fe00,b9d706b2a120db2d51c0168f520447f704bd5a977a542f5df8afbbab472e74c57573f62eb695cf97b67848ad42552fa20bf8f5e564922752fbe7878351e8af6501 +a174a825912cde4cb3c7bb4d5eb41ab770f77e0313fdc7b148acac99fd1090633e12244225fd3052e21749d14a4c424358a091a39d35c10c513fe96ce327a64fccbbe832cf8541a858934cc6b341b223dd2bf6bb13e1213fc2e7ddac5682bc7ebeedc8d93435164d1ce7a29bf96cae,2529b7e769bd6ba25ab991a8806d5b533880b022c8162d12d905e0052410da44,8750822df4857fcd3008bd849df55136a116eb161c972f4408da624c935d12123ded4633a4cbd262d47ce701dbdbaef2d2f2d67b8e1f15806de6fab0b0a9a6d801,d2f4972cee5278247a0aba97aa09d2604701c1b12421fed2c1f1e0670153928c615cf1840fe167b41caf49e46c34dc01150283d31ff9377277f165be1d02e7ce01,07026da4238fd7d89be8bc662357c3324c36888c341c3201c7ee1452ec12a1e83e6c7591d6163e4909afbe9cbd01a4cad0875f2c8556f2ea3fb176a40f8d8b1a01,a89a66b4dc348b85543a16d3b6811c97d5d035925a31feaf561d0979336bd85c7ec980c03a2e3bac03dd9c348d016cdcb8de79183a15ce88bc5cd9570594aca501,2b8c1464adab71442a3f29063ed81131d512cef5053c618d1975f7106737450f1f3442db054a91b99ecce14504fef535a600a3a7651e1860514d61bd8b8f5f4401 +fd0af020232bf8cbad9dbcf3db861a07c1a7c48b092b7da75e02054a61d47ff7045561b1c9079b7ef34734c1ddfeb82d75059efe8a6fe77c6fabec5708d642796318a77e8efabd18ce4ea9e5a93b446a23ce4fa9fee0668c4ffbd9f1c885b82bf44cca5b3cea48bb29cacc76e1ce77,8c80535d75aed7c976244494897d0769dd73d7d2aa6dd83b8a5293fedeaaf98d,09e01795e2d68f5d375e130b814ec7c45d16bb3f3a5e7fd44226949b933090d029ae6995e64ffe34214f0095e119c59900157fb740784b5425dd5290a345a0eb01,c948d164e53e017a430c70da685497e9e1ea8c2d555d4ebb0a87a58fe58000ca3a092a72680cf7d9ce07c7b1a6def0449991034503331c4f440e4dbb4018481900,9c8a59dc268ac070b7b8fefcf6a640f0a8fa61011ae5217f9d08d8de9ca491b976fb6da96420e089a00503280c8b6166a2b968044b83ffd094cd3f9e456e22ec00,a856bb0e78136a6a4ac02c134ecdac4d801a4003d5651a85d4b2ad49a41c122b04aba2f168d26f10bc5c13ad1366cfecac69bfab6c7ee961fdab9b5d0e22499c01,ae4dc042cef7202595e4d0b8583e17f33e362afbdbc4b23237ee0bf9a7667f462efb68e099a0bb1ddc2735f3e357c38be397d639807dcb975e93dae21faedf1201 +b0808744c46f059e63e8eadf4ee9bfa9726ebbd59895bd409faa3651fc90cb0336aca930685f9d24da4c9fd417c35e844a205e62569161302a70f3480335d6be83c55f554dec34f53199df7a44437603493fcff78e1d7b22a872141f814f1a9bb26b831836bd0b37397e4d1fc6b6e5,9e7ae08d268cd6bef26226ae046660573fe101791c7c25cafe7ade2c35aac310,c640d9d0200af0f83d393232f967000c5f1eecd39323cb77074eb2af7d56e03a1738584c97fc0c53692837b7ff2eaf62992f3eef20094fc2c6e921590ac619b701,bfdaf015be121b2afb5cf58a1975efff712793f79d6cbc5ab9446b5b9dd83be717c831773ba4ebc995edbc493c7e2b6d67c54bae6f2a428244aea46b380263e001,89fd0c871896fb4220d3b3dd0425526bc4dc4d30cf9e4ced1f8593e807c15ac4258407801694f294265dec3c0a0bc91dc83b15ecf169f913c7eb37f28c40295a00,773bfb8a219e5e60bda05d28fc12f707d95984064059bef22ab83312f5f8a6702acc740bf2298cfbfff66593be2c15a22746e8f1dd4630522ca6b005c412a09d00,bf6cb7be09d6b7f95b7c7c5932658a9f4d70791128ad856652242da66bb1a99a4d58c03fe153be7f823f835fbaef91fb64a1a9d33d9a384da8e4ebdc1f938af001 +7e0df705585827f8581558ea299fccf81e8bbbb005ee62d86e4c99de59bc02d57d0c8b8d4b153b4028327948c4a87f4c02fea6ead1bb97c792245a6f0309a3d6d6451cc7d3d6402575c713a754c6749b9881a19cc9c5aae72bc75fc38b90612fa0f6349f34c72102c8f83360f1618d,0ed745b3883a5b8a7e7241bfd22683d2d0cb3fb0bc60cf2dc1c8977cf08f48f4,54d0a1bb45de70c63c13d38b80dd8688c9bf7ac497a5edd7de1e99fa9c79cf4f4346d2908b06c0d858491401314d9ab9a01d9403f46b6ee6dbda2dd99863496f01,103e2d7a1b75cb32976453de2cb27d097d7b427dbe0b29f903c8f8ff69dafd716361bc3668f16341b21fe5cb78d91332a7d44e88ffb0ea394a38b112c18a7c0600,204d9aa821f83efa19f0c914a11afac4cd7afe9c2741fa5cacdf9daec0560a286973dddd3ded22115204bda2b48e2e67888e8cbb215ef093f7941bcc21753ff500,4911cffe33c4821de02c04020467932f339d960dd666049b08583cabd6e8636b3aabb386a83713b0e8a2c39c95d84065adeea18b7a4360e53c5cb2ca5666af0200,1422db4a2101b77312b11a5a38032264ad42ad5082dc66bc1c7e49a6c5b511a26fd52d43fc092d7c12de184963515d0a53a4cf802c358794465ec0b260ac0b1101 +c66585b817f431d38d868bc8b211dd2a4937ce4e0b29554121dc08a05f563f25cb29bb588b63a01b577f6643a81012cb1e28ae7d1519b7af74634627ca060ed06b664eaf0bdf99f6c41a2b2d9bb8cf4d6d1e316b63b4c5b4b653b8f6b3ff6e75e0be51e32aff5d8edadb089748c15a,4a66920822db08d208dd3536e6f910a21ac1f839ccb66d25673810d6c5b2937f,18139addb69b9533bd88574c13b9fc810cc449a6b3269c110a96efd33a5abd4e0dfb61c71e3be5ad623035ca30fa9c288ea3fadc3896a6ce40acc8b719832dbd00,57511387765b912cb2d75883781af9ef82134b985a6658d95d76c8bbc2278b305db645387bdb768670fdd5aadb8eb4126d626fec98c91e026859dec541c200ce00,0e2e20f55d1af7d78b0e24c29b2d1b7f17e952c91918bed9895ab1537d51dada302b08991a3fc49d0d40c1afb6a90b3478c3f43bdda73106f89857fdedade3b601,a32486ce28e8fc9d685642c7c9f1a21c05a47a3b86c50ffcf04d9596460d33322636357cbf3381015a644801b41a3d331b7a80ef839e1a3c2778f983e83b19e200,43d5853ffd5672165cb9a0fff3e5bbfaf6abaf7c62d0cc0d7e6170b824b57be9572b165595b956652f2ba7ad851b9635dcfcca8c0d5881975dc3f1ec3871e5cd01 +8762ccc6240e4ac8dee4bc6237ca5c713dbc4cc43b50f6140fcc0185aff95413ef345a95ecf2ecb4236b7f1f1b9c490a44baec478b959be38461cc9d4e94dcc2ceec68f2d3f23353dba0f1742573abaadac8e62f3c2711c8a88dd1a6c2e4dbb94ac0f33234e22251b57414236912aa,9316219c81be2719d31656436cf243774f4334090ef39e21502ddf793c47eb2d,c5587a2752242e743ee535683f8ff0a37ccef9bb166a9c48cc8c23f1216d35da530a3a86bb9f3133af93d62096cc0c63c51053f2a644c41f67b606e23911a88c01,e16d350c346eefee16d21de59a1452f2db3849260eeb3c3f381b2fd43a1512260b23f07257f2b1398473b1ff6a5d6c630a913474166070b44efe7ce594030eab00,adefb5055d61b9ebe6b14d78d8304ba0034e9bd43444d888e1eae82a6aa8c1d72251328d2c56a4b2f9f52c5a3908dc409d49041c422bc2366595b1a9a3d3a00500,11701b6472cd4471b6ed4228f05475246c4663c850a643ba71ad95725281192078505eb9030f830a6d58e55b9739a4ff62d1397ba78a2c6a70094769fe93a29b01,541876267d36d2c0b53e108a58e01ab956c9e5310a28225bf8abfefba978029b5a93392c92121eb643f94026e65e06d0746234305a955729f6dd642b9201aaef01 +3229cbb4241c487dc50c0b21d0a0ae31974a23ea4796f15de9a5ba458882eca8b7bef58f86b9c30df02eae2459b6a28d9dfce8793a06285b269d811d70a19168a95ae7b41e11f1969654fdffcb6afc98c031306058d5cff629c62e89b521551f94c660d1527ad83ded68f8608e9680,db724f7664feda97a57a12578ae6542236866b2ea1374f3179209b72e5462ad3,1df9e820c9f90d050e44a4d2f9b01b817f6eb9bb489a61ee923a444a4208efa879f40c115f6923f77aa93a8a3d7835dec03e18fddbfc829365f39acfb5b902e000,4818d68c74a83e470b622a8f46963922175592bdec75e3ca8cc42673d8c3f8b15680a2a333241b27b65572723529f2b37cc4cd1dfebaf33dcd16600a12bd988e01,9e482dfdd22198eb91bd986b14bba66d22285cfce085e8302246129ae690b83e7e9dcabf33addb0e3cdb465e4b1d04f8d979189eb6680136f813784b029ae3a300,f3980aa76abff5b66472e76932c6ac36560dd9d60895698bb9ca8336de410fc40a82c8a65c3e19ee85d98375e16bbc4b14142ca7c9648e523cd54e4c22b1f7d101,f1a0c6f5aaa897966afb92c0e8865c0d8393d24fdaa00bb6990b2c8d8d26d4757fcab68e51a4fa3c6de96b90b6a76cf9d2414e5c2204a320f0cdf9ff4b617e6f00 +9eac844f5b101addee3b4f969708329a6f41308f6d5430c3cab10980c19676c29ca2b5fd6c1899e7c9f6589f18edb2a3950400daedc8502cd07aba6c50cd92a125861f8fba80d320f80ceb7ffbbc866e1f4a6d3250f27d23983b7f78b370babd24251303dd444f72279272d5136ab7,e392715a69112e297f769046be1fcd232590acc137fb0252f51d7f0e953cf05c,5543515016e9ef5549a97c974e20e531b85725b7c57c90dbfdcf1253d74b6a3e442e8ebe4ca5e85beb3a94f6292d30ec4cddf3c268a34267b8245d86ba7a1f5200,70ae393b5d64da4bc939929c4ff82d274d05102af658f5ac29eded48d6b48ceb04abe97723f1bf48f421f721f75e938fc7b6ab79baa8b5b8534ba404c47fde3a01,812c7b66b4039233bcbd47634a9e2da5b2ba4f127041c8f312f383924dd2e3d619c693de49a917576bdbe9003848e267e3518a5076c777c20c29359db03a6b6101,4bc4752e70d171e0abec1cd71ad5d532d083b37f44f8d46785bb8fb6ddd2f3c8734dc74467f8090acac8bdca7f3e41b39f3ae3d270d1210260ad01755eee4b2001,845ad8cee49c4472b83e612fdcfbfdb1bda21d09bd2515f07a0c064ea2ca8a5668c0cf9f11aebc14ee92c0088dbaac01c5922506551d57799ba91cc86a472b1f00 +f10b27cda54e5f604050c92b51b9518b4819e47271d5200ec43dfea648c22f57c3c41f746154827c83ae664eaff70265c3c3e38ed85476e17899885ecc6caa43af7b3fc3d285e8a503c34dd3af088b4be882a0d001acbd4c4ab34330a5bc73fa35d58abb061b29b92d8cc43cdd2baf,4d3c2d09a5bcb9a8ad9eea65c9e335fd0c9ee8b29979e661ca73b375b92fd35c,c4335b2a02751466dc934a5aa4229e8cb406e18cb3aeb79b2e61f0515c2262510a32f2e04c937f479500af0b16451aacdc5dfdc39d5fb48b1e412db2eb3b09f901,11ab2fef22a98a546a94dfee359a965ff318be7e7351929540bbc6fda955b2f63076df1db49d2a8ce7457d1259eaf4c518563aaf3bb1ae15e5147f64f6bd576601,825cc8d83eca306b3f8309a3d507c2b2d239928e8ec6c161f41d9ab918a93d8324f1552f4a61fc6ab231b495696a6ab75e94f003f8e4b8a3af244ba71ed3cd1300,c6a1a4f67ad136a8e08209c8ddde55969082349dbe4e48712815402c18fdc9ec3f86416b80302f1f66ad3af301a6db0b7e8703945b5b62aadfe5d46e9241fa7b00,78a8b4d28bfb519b1d7558dd29d75721c25cce3d5359a9a7296dab91aa24aec45f207741223690567af17fdca7ad13bda724fa6343abb954b5288767afb6127501 +7b822fbc8cc53e8c751419346bbe1b7a5baa580ebbad0bccae55dda5873dcda64a714d321c60c2c3d4a40486a2b332d44569683a93fbdc5f40153b35c5e05204216cdd00c7669df6bcc89b1200b8f3fb1c7945d803e6739253d4e405025257b5e09422f2fe373cc92ceed8ac17714d,b5275e6b110f72647577ac74920b4c82b5aba1dde01d915113192b4c8d2c5b26,d8244ec48e944134bdb445fc1b80bfd3cd183fc992fa572afa7e16d73bda6cc002fc87c82997dea089d2208829e5f183e45a7e07c26dad91a12a4aaceb8362af00,107c84e6896c62731153bb80e6756872c99cea2e4bba96ac284983af2bc4937e2db122ddc383dfa3b1b544c2a8055e8a0ecd08b2c4ae142424bd1c225e15476e01,c8213314c3687ceead57e8794a2f656024643607c167cfa9886ff2332ae13e355d11e8d2de27d839da716bb744e221338cdd66f53eb7f5e9379f7b9309611d9801,c717329f85e3281c62b694f9d4451b27cef1eb152a5120e04ec89d55a023c3dc337d97e2e52bfa580eb888c34d82189f9286fc0e87b5ea4852eabbb5f17723e001,c063df6fe37b6e142b688a5885e0f49bc47cae2795bc8c26e5f597ca4212d3540759c833ec593b2318db99072c2f998480b813be1546f74356a9d5579ba7e74301 +494ccab9378dae1a8b27d05dabed62951f4cc1aa8d3fdbab8b1bfc40a07a957a5168df5b65cf17428e64aa47d0c80c94b524307d3ff0e94cf78a556d11c922fad718b3a8166df25d42b120193f18acf9e743db3a646b9bbd3d95edae43f0845f416a5a2f57c6f13e472e4ab4a9c514f3,2dc13546bd342ab0a8ed7ac98fe058159166ab35d05b8e7e652b1c9c938d1a3a,e2ff9bafdab2c11c92c0f2e823e2b33f09d9bef1440e416e915c3d7ea6c4283641d839b0bae49fa32570e1a13d6a97d40cac80f5dcfb88e29a316959e97b447500,d92c04266593af5f5bccf8ca0f1878604302d77322e71332b764708ef4a32bcb3cc4977321313e2ce3972a81647d4e225a27898f3751cf7fa4770f16161147a101,b9dded4815d62b358bdac2754f8438cb9fcc820012465495225d85a2d6f438093ad28b3a567cbd9fdcebc8614b49e32d9e6fa6f3312a4702251f632cc1e81e1201,bc37a61ea5931b14de98edb0994ef3e81b664322f00f8dbdf8d077796ef6619f68ba055e072ffe1e3bea0aa5b286a1b3bf90ca13b9e56b4d2cb0204b7eafc80600,677f9ffbda2a075d307c3de5dcec75c10c4cb73d71204f5a312f3742f90da1aa38365e4f856d9d68fa052ebb2420e85b3ddd4b05468a69e4b6f6e136cdba1cfe01 +ff59b5d32224710ea63953fdddb179a88c59c65373d3a799991de92403c0a61ac9bc5186a418850620a21aa1cf41a2ccba5c9eff494ef269fc564317775096675e700238f819e353a994f3d4a1c25e8d30d3e2237797cee4bd4d874691e6c0db638189def30397213511ba03954cacdd,2de2b7fe8f66aceb2495c1c822338e5ab1e6de83857447a22971d2d3e5266016,34a98ff5d307eba568105df7d94f875b9af46adf5bb6ee5eccb6dadbd9612efa304091d048ed8c2027a47746b61da36e7fd4f0b04b2b6b540f78a93dfd3ccb2500,948978605c92b4ad09a018ec0705751b10fdd25d9f63cb5c1aa75dfd352a2b4b1449a0f646a3c6f3b1cdc85d1d0627bfe2847dd20312d73379185500227a211200,4b1ac1f15f7f0b640f7612f1d736f4a0780b7414c19f8341333cfee2554a57fd2b2f59bb8118fa514673a6002ac87a3923b4a04456e6fb96025697ecb69377e700,01e2713f85fc832c609fa6cc6a7edf200a49629575de552132a2e4923a5a7be74bac2ed9fc6ecd6328ef2a6d34c7c24603041bb64bd5a4860f4b3e3e22df7e3300,aabb5bd0a16120cb9c4621aa0d990eed48e48e4c51f4c772f242b656713bca2d6bee690181d3fa3f09d774a35aa713504c3d61c8660983694ac8ab7d03aaf27a01 +40d5c9e90f034c5ba98f77ed8cb5857646a7652ca0f174577e2ef2c0f48f7cb916e556d92bf03f4f45cc662f1b525345f7a2c7115249450c71c6265d372e910bd48c8e3fb045bf9f6c01efc033b0db6dc11c7c4eff5d211fb6d55ace36024c22453dc3c4854e9cb621ae4802b8fa56a4,450a64523db69fc2f38601e7964a8c7c53e93984133e91c152fc20ad6ef93aa6,6168177533d54f34d669379189b5ef2d15502bdeb0f4ec91ca6925f87597344d7b31bf1aa2bb116057f3b054d3f9bf6672ba0f42569afe172c04e967dd39c54401,66d0709ba94f3def7e865a38954f659de6da408c1fbc7b047478b24207b3dd9c425bb8c37dfe0be2de5879cc96e67c6703951895a05d786882e7bb2c45c6612400,8bc3f66386783adc5deefe820c149cf6c06f453e6d601930b971f579b82c81d43fe8b4943569588d761ca796a47d2262ac49b806a908f5349b92ce7748551b6100,1f8fbdd8cab44c3916a0450f843b1265b7ab2b1ed7b6c5d9b1aa4046ad76bb0e19ba6bc561eba414b751526e751be11907aded2a4c574966b25a88d85f3990f301,9c7742c96fff8e59a6bc3cf990e40891ca3cd2cf17f427319f7c4c664ebe005613f141afb6b685bf5d5e9e739e7ae6f3cdb5e83c181b0b487c35b9caec3dee1e00 +0b360d578295c58c1c72dcbd8da80a23628a8f5920e25923e11a3cfb23534fe24c6368bcf70a9411ed1068c57aacce1a7412e92187d52044b88755611f1453199fcce80813312df156cc353e9edf127bbfa7b457fca39e0d82575a09706f567d0670fc356c157659c09ad99f7e3507fa,ef7bc87cf6df1c18755a22d918852c2bc75c0256d738363016fbb0566d3e50de,a8741deca7e245df4ef42042e504d6499012bdc114e1646d0d76918c89bad4e4074705c105fcf9fc8988ef8d1f50a2e90a76da9f6a04d7446fc0d20ad3d4fc9500,c8c55e794580b70bdff161c1e7ebfd8abfa8b99c2648938a3e21dd70bc9755d952ec78d5fbf78332f7e949d49b6fe9ae0348a003247a54fed209b2d5c1a1dc5f00,cbc3a38521bddcbd8bfc8d4e4075056284928451386cacf2f16c1253d3a59087120edf4dff6c1a1444ab9c5da9408131b8bba4716542474b8de9cde8df3113d500,d43963f48e891531243aca67e43753c8ea01c3430b0b763a1f0ffb4ba559b947565868faf13783e02c5fdf955e35b4f9fd2cfdf5f1c446eced2ab37225fb237b00,abbb615bfafc8b545548b57ad517a64573931751d007bc4c5e6539cec31a903050ee824fd7f7c908a3401dabc2ccfa78a065ebe1adcd7570e7f072dbcd5b094901 +a089e498da5e30b28ee2767cfe95ec9759b7dc1681f0f8da74ed6e9461644a448f69d08b4cf5e71508d738b9fca36d168577d316f1b29e35650afc87c2b72d4eadc9a7dfca0efc8d1a2e00714b138a702c10e4063375dbd2b057b50b9c969cfd35e6c2932daa01ac1b3447b96eb8ca12,1725b9b9663ade2f9e2f404f499a5820472253e1e749bfcfe146a473d440af2a,00762c2413de6db5f4a776fbbc7d7922a3fa31881c88a93ebff11dc64d61fe8313d8a185692aa967caac9604cad5e6525e50ad99eb0677e8058789d758e85a5a00,9939b60b58b5abedb4a87ea2f444f383baa4f1a57e4c1670339a1468c51a43712cc8ca4e5fad7a7e928e3d298d082264d4bf8c6c7b70d13abf9ce4d18e731b3c01,a4087778cbe1258b405693d35c5d181a236df65b9d16d526b4fdf85bbca420d67c92684a3d1aeee4d8effe803e4acc524e5085a73ebb4f50007dd896c8ca480c00,a9bb6bef1db0383355222dfbab49dbf363c16dfdba730276f49452efd2d5d2cd297dc04dde96fdfcf1aae8a43b34eb377523c027e087a71a7134a84dba38ece901,7e65bb64dfc1451bf649e171d95747003821f8a1b94af849a77cad35dcd7696f48a9cffcd78668c4fdea9f5dbd3cc4639e78531c44818864691d3a668233ba7c01 +75c619b08bb7975e4c106939f047370c05bb91afa90bf3540114687942eabc2300cbb24ddaab59c7f4efa3dfe1220f3237b6152e965aa70dd917fe1a5d873d6b6ea996d06c5722a940b5ac10664bfc8da6324bf7f02dd26c6b193487e9a5f5a133ddad6e0d3a8a1f6e86e8253f44ff22,0ddd377fb5a884f41630fef85ca7d6e84dec27113c5b840d197a721868e9a566,151d98be1c011fd1910993be55650ae1777d4303c21ae66ccb5671903993e2316459a2a1c79ee6d08e5874fb7cac754b8566ab18222b09cd7578755dec8ccf0300,2be4d5261438cfdb3defd1ffc837d467faf73a0a970385c105479fe55db3d3ad206eead0a319b2cc5014bf49c6662a0f2827d0032f0ec208a5400966bcc14af601,2278a0dae057bcdf63d3cb160996750c15a1fc6f2d6aa108a9ca53659c804ab04c237d16e26cb73fa1c08a047aafbdd4022364a8277a122c69d3cf186f79cd2401,154577244940210ed00e3873572b7a7224f75e9c03e32f784102a9d0fb0bcb1527f06bb8bed719d587838df1de5fa25c1819fc1e4b9c469e678c047a148022ae00,bfd0bb094e0d819cefc98ddf0248b10b26e089fa6d96794f2014b30ce7b2fc9941ed9f772a6c6f9bbe1f7ccb198701d928ac5b227c999f523999245219b7cb7500 +d332b9cf021f16d49808c6ea37bad1a269708df4763ce86eebec495d8fb5c317648e7992da627d864b2348f0a7f249ba9357ca100fe611e6c87681d542970346881d82b0f16f0b19f0cbccb2813987ee8878bc7742b265f70ac321b8292f46663646425ae5d3fcce3c768ec426271bab,173a51718049ae97c5cae74be2ab2a168984c28278afb3cab2f33677d3da6ac9,cf2c6da1a268fa467487ade5557cc8999e077151abd193cee0706bf04adf65e061e526847917c384568d1016c13b7e3449ca9710c7ac5335ee03db686fcde0c701,b154063b46ec98d9d9f2d055f2e0c2758dadf57a7429f61474ae73305f2496213c93b6a11123be8d156175195e9f879fdab787a792f8a0de1e281fa00a0d6da701,c6e221827dc89598b232ca0671ae2cebc42e34fd9463e110898e2da238fa4e7873bb74a27cb6830d60ebe1fccdf9b3da0732f95c45898244f19533228ff37bdc01,db340dfeac5a3c2702c9fbba86f3dd57e5ab82e05675c9d3ef8f70c9fa96ac0c32a9bececbe896ffa5fc034fa2a492d0de75413ce07aa5075e490a73324aa9dc01,502c106939d7e1559e2e213ceb888a9b298dd00c1d304a30e570c1d1c4fb75857099c36487ae91e2e1c5e05ca9e32bc04819e816fce5ba4cac47b3cdced1693601 +532603237c6837b19d525f2c431cf8c486bbb3e3982e2692e58004573f2bae65c7ce1e82c3b7aafd85baae78c9ed19c9271f8c895d808f5bf95bc46683934091a77f8d7c4bd2ff69be40e28ec948dec25336cbf857864c9ba2afedb4f4f70220f0ff941d9daf95ee0d10999bec81e673,ae645d6029ba847363c763a8943f06c9956cce188cabdcf4a2967b8ecf3f7881,ea24c3bf9acffd5e9f600a84858fab23878a9b64aaee201ee6e83d039a0820d303112150566b43ab9a7feb93884762bb16c0d7dc563344d147ef29dcf9ec935d00,c83d09649397bb05461cc96cff71ccd50c41bb3db4ac544fc0501e44bbd0563c361fb35fbe22cf62495c246e8deb4afa29e575af1a4d95b6edc2f8c11ccb202601,2f73675fabe9b743531cedf54eef58a7a32c0e071f06b846e1c4134e3facb01b0c166d5d9943591da7da08432458a28f3978521b890b4f51f5bab8881a87737400,5664f79fdecd763f9e513796183b6654661154b65f40f56d5ffa018fa1d0279c2972db4775c0a3568e3385f5ad0ed693dea536571c195a5d811d0a4e576f41c500,71c4e2a2c0305067827ac7e4d3aa936718c22f5d9a3c045b83d509bf840900e21ad2b08c3e7ad365f6fb97344894615354b9a3211ec40ebde0d2a08cc9014ccd00 +ec6b9a74dd1be78a833c0ac39c4e370c355cbacfe545963ccb56ceda8ba48bb27ce41ebe5ff82b9e89b7ebd91dfbfbf2494b4f7735b32c2912f97e8b437b8c6b4c850fb7c9bc007e26a1ed482da81840262160281eef9b18d35de5492a39af08fa645c739c5f5ccd3d65f559ec400b74,fda11012afa8f75cdad7e878ae752177ea29dec1b9eb4b78eda3ba700500d9cf,106a2e21e66a1ed90abc60d5f0d6afa070136134165c3f63e05a4bd6a2b8f31c178c233b142117c4644f70f0aabfd0fe10770a4ce85d4b817c587192fd97769700,679abcf4e04f452d876e1e504c1cb88a916a663eec4df42274038349e1abb95621ff14cb1e7d50b74f2d7556c3f9b9649367b46b8042036b940e4c4829d4c8a901,0f47e2d64f7d0ccda0832f27aa35ca9b9bc78afd86fb5a428049154d351679773e73d4737a96d82bb7ea5a716f812331424f8581c0c57d7965ea88b700a1390101,e79c938a2979f927c69d5214b265bd93d983be17d6ba7ca852197a67550e18d67dbd8c449c84558ee6b9a246734073907f5b002374f31625b9d122029577a05201,b9f7e0ca73355c0d89d0926e61ea65f1b0ea436c7880633d3f588e496b81fc9c39a88b6cd7e73f59cc48931ff2e7fd30c2da71fb431a68f6b2ad6d1cadcfa8a201 +2200ce7cfd5e49546ccff74131401174086638ad97487c83c2ee680e8c82775a4625256d4803703dea9579104de6c5ad7c1caedf7d3c061aff23939a895f0d6bc7150281b1fa849f0ab096ec44122ad4952cc1af8920ce6a76bf63e170d813e6fea328b8a3b45e3375b3fc9031665434,8da26ec117c7809b3c23d8583784196ad2203b5a07fd3a096a84d1fcead0bbbd,df0884594aeb42e0f44e80d8685df6c1984b1fb76a82ad95620313bc39a72e591357ff12c6c651ce45aa420c2149642d087d121e5704d4587a7c723636807b3c01,eec316f30de9960cd582b900bbe1c83bf4bf49778d0789b7a0db8bdf14bb1172343afc189e17eab7ff1130ffe9dd1467e15e5b41ab0e59104b497cf3be74763d01,5e31aef8d303423a531e9ea6ff3c3b90b348cbf6dabcbd5985e9d0fac3b4d4fa2ee2b9e9dfd6845a6435691fdb42eaec1c495ee65441c6a082745668ff1139a701,d4dd9679ed1e16f0845a9739c68693bd6fcb1436c385f5be14ec08b3b44ba1d775840bfebe3818ba198a44800c08da7e2f7d304050eb595fd8cb83f0b22a50c300,a04f29d59fb78a23e61ee71c6c6d0cd7a4d80af41e81baedf9ec81112d5b465d7635b809b02d64082340bfea5f3af9d07f43678e9d1c15b3cba0a1a709bb339101 +74363b9f29e9ed8c2b9cb484b16e27d5d95a1029c75ede9e88fb5e5fcdd9f9be021620219f8ead1fd6c3a84facc18b440d35a6f01d370ac1ea8b429948a231cc286c2b4399e3d221790fb9c8f749f819a5894843cb055b634a009ceac701756d2693777033766d88fd9a791edd1464e7ab,df7abdb6e3e36814dde6ceaee8be66bc1910385b63ad744ee224a404423b8f32,27d0869c45a98cc56455028d23d508760437c578fe7863f2e47457ceec38f8dc53ff574b205a74d99d95b66ad0982db581586cfd8c46c2005b37dfb2f842c2f700,cc67b47a84ff0973609d89294731859884a11e6922bfc2174c4166f463f9547a1f9f62f359a5cd2579224f8826bf806dd8b21b268f68188fbadd8a7085cdd2cd00,14225a6990de6dd7de0275ad9c71b0d1f546adc076e9cdbbb855dd391c3404683d58e392edf27ba72617e262c2daca7ea2c932c8a57bd2f4c88bbea92faba22c00,a18cc0f7cc5a2ca746375b65352a0e6d8cc9f2db5fd4c151bb2673a73725486c610eba6b294a1d2e4f5e793e781abee173e923c7aa2c8ea2477e1fec313d2ff000,ca03ea982c110e182b01d938cef7c8682894ea5293b0aa675c8e6be39208c62244232afe515ab8ee4d305d424bb4dd26fe84e35ea4b54ea7f20c490b432167c001 +0c3e1dba5670ce34647cd6c3b22c43c1d31424d4be1ff265bdf363a7c777f4fd5e0929aedf02eeadf0352fcb1ead5f0aac5e6f08683d39df083c71ddb5731a1d2259ce27f715070c3852506de89572f3ae7bf8e743194e94560a8f82cff7178fc271e49c697a8be11b585f127d25fcda84,f5ab72bb2566deadfc3101f5fd481f57b9cdbedcbd0ed4ec3f8275d5434080ac,935acc1844d08e0d97a9a8d727d9c5345327dc7f28efed356efcde0fc05a192e429ed9fb9438a00b42dcce60bf640c7c4b3f9234ae6efe230b29a6594f10f4f100,8a63183bb258bb84fcf75352a7af532e4b35165efb3b4ffb53035099910d5c6e57804eaddf80ea48badfd0c06e2aac580ad083edcd6ae1f28e4d1a3537c992b201,af54ea0afb4de02a6965da170a6cb6c9452dd4fe0dcd8d14b00f33ced2218dc44fcd6a2a64ad208d3bc7f7d8a60af0aac6d01f92027bc3c865021a7acf69971200,93723dfc865bf2accab42904a12753f221619b517eb08f7385cf99c24984c0db7b2ec963417ba00a1364849ff90d91afa339849ec23347cc2add49e16ea950f901,36e1a656b7d59398e03e6d244a2a6f558d80fc14b9a7a578c52e1244dcdad1c6078a32aa735fa29159fae526c843ce417c3bcf89b756eaa4c7c867aa3738e6e101 +ca91040d4966d25b80c343be8e852364fe3e24feb4f792f1c7bceb4f355844c269b2febe1fcf5c4ec14be55a8cb146a99b8bb5005e86c5f545eff62b0a8b082f4c434652712ea860a8fed10b3bd6d3b5b2523d0483b6191759c85485420ce53aa8278525094d9b40a09127ec6ba18c129a,b848447ca035e66caa7d7c0cc5300d71e692cf98d5fb47f23db6e40024a4da8a,d2145b56e60455c5bd509f04e4fd72d6f592adaea0741c13b5d672b42f61b1a2270f70b640747304985c16daa70705595c398d1baadef10ee9693099ce34fdf000,7fcc09f16e2cb96cdf7933935b3380821a894b5ce958011a8f19a3ed4c1e8ce60fb9e8c4e56841a6050ffeda0bcd0989810f4511cec7205cb433bd2f863c00de00,496594b4df2772ce38e1018cea262720e1cc917565af7769a4ee7dac1035e94a720fad09a27d199061474c5cff166565456b21971495669d66bf1359d182db4201,daf658ef73a18f26c02f6849bef76bc43bf68a8074bc3961e5deafcf091971702f21b90cbd3d8e75a51046ab78200f3100db70044503880d936ae8d96cc990db00,33baca2bc9aad5137b99a15257238a48c44ccb77c1f6f1d031cb8590a5c7926a45a55638174a44a114c2385ab57c0cc7702ae91210e30aee55ceed852ffe952b00 +e99ad185422fae584919795f698717d0e9c82f314f04e4f226edf997c91e7f1235693f0b3a1e69ebcd1011ece9add950925e37c62415b87b61178a0a0ac009932f444ae1e8752ab0ea9bead05195efb5de029bee4e703a869cc97553159b484427e322592e1fd4b13544f7d8fefa4b2b52,5f81f945145cf68948bfaa6bb2c2e9d25a95f2aa7e3e15aed45045a25584b863,9d33d394d813044db0fcd084431fcf30f2fdb171d3251570b98744f1a1aa008244ca500a81b101319cdc7937384788342b3b895a409bcfd579001de71b27ca0b00,8faf38ac8e2c1aee48b66a5cda0cb37051715277595e65da6de4052cb761432645304161f9ea5d497abb7e53955e08158d0a66fb70d538ca1add55e9100e8f3601,81d578c2360456f4c5b9f9884605b7b32d7741dc6c89442e8108ad9fe830591256c8b0d318747565699019dd534469f475de6b279ab41578a51c754e4adfd4b901,c30c841e9c89c760853cc5b3340974a2cf52817137a685c53e01167c7cd24d0945262cc024af00c7717d6ea0f54c6706e7759da979b76d2ff0fb06981e47b92a00,96416fe16e2c7b5e18d2baef02b8b49b0bfca30ab31cae4cd01fea6b0f16b3b31172fcb363eb249be7fcc9c97d1800ef8c367fbd7ca7d655d6e41a9acf3c84a801 +20d3890434d70b83ec70cc2a78d3a4cb09a0c96e91e9637a552630990abf6a9e5179d3b5c50149b632e1be5293e89a05e6abaa7ef9ac85d6065f150b858bcfa1c748eeeccce8c8c8ec3418665b0052269b110aa370d25a94d339e665cd79c9daa62c9a4f47008ba7824fbdf3dbe0c80c0e,075b550337a188ecf4f092b6437f5e8d8c5d2dae8bb090621ddde9f42a0090c9,f6f1cf933f8fea7163fdfda76e1bfe424db4fbf77190ebedf90163dfd6e0001128b8c5b31c3c218fd46f082e882a05c26fc91cc17096ff8f5558bdfbce1edc5d01,c5d0f9147ca748618a502e6b006d70dfdccf7229dff46ed56fe08374d01d6ae0454c9553d5954d3a0c532b3b8a63e37f1e2fe6d12ded1a4e4c89af6e7b7bc43901,87803418afb3243529c8fd813ff3f32abed106ef0e864d86793ecab3b45efec311269bbabe04125adf0ab5511bd983c5815f1d4cd4976108551b5bbde32f305a01,37c9d4907ed0e6f8a97c6de319c688385e7602a9e2431cdea14e6128384567a7392dc8d6d37518d503c36c2f07984829c3e5ac0dee144a1914c6cd1f684745d300,bc2af80babb98e27d6c3255235631bc38b1fd40f1d9a6c805cf6add6fea99248433163fad40b0f2fa44c57d4ad6378d321e99a0586bd4aee4978b284f407ecb600 +df857ce9330602a3eedcfa5770ed2f043f2f69f237b482316441d082fd4d4b8436ad12d6acb8e0156a20002db251f6ab825c78a95e3cb9407244e297f309e2a0597ab583821feec4b6c9f67cfb78255c492239867af53b341dc6e59727a86e44ea185ab55fb8860f5ebfc1e7cf28ecb32b,bad94c4ce9c0fda536170bde5413dcb1e1fd9e23f1dc7d19925575ef2c9046f2,a3ebb2e43362c24e8ce76786e6b2de385a0560a757df094365010596c4cbeedf21b41fa7c44cae9d13bc807c8ecdec83f73d65b4006dae7513124f11c9e07f9300,a916b7750b66ef9fa6fb0add0cf68327281fe8f66d90b075026c73a5dcc2be5610bbf9cfd633e153b29f261d88e240eaf75ebd881d43a3a6e198fc8db73b9a3500,6cfa443fa8ece91ac1b083079dcc8435c8584a4da4a7fc388f67d87a6306f1b524956dffadcf8fc51ce7bb1c89bb59869b0fdce302cf2ea0f7f6b596967f5f6800,70f5faedb747c00eb460e663966e7da2c839550483a73c89d6b8f7f983f6224f767728f86b1fe6681cc7a179e05d889b72783b751aec3727b504fa7f1b4d88b201,6a10294bd41f3f603a1965ab765a347070a1455327b06f19f18c528b659bddfb408f120bcfdbed59346699e552de3ec402df67f80534077e5bdbbbbc9287d22a01 +f9a98141725294774390b90b7aeec9fbb4370487a841e6ced32ebfcd974e2303861585fb3b1bbf9dfc7467a8fe898ebe3063a011f813f55ce25b05de6fd0284cacbbeecad71758b6c4a732a18a0f57cfbcdfe6b8ec312a4a73b1d03595ea6bc1cd3735574000a8745782599d2f0f99e0cf,3f447e6a1798823920c1102c8d630c843ab3c2653c7aca1c1b1bf94b0d7252e5,24a9c08c1da70c20fa1b17d6c5526d1b9ace364c8ea35b53406953ba6bcdc0893c2c5207b358f8b68179930ebff544cb218e84e086bd800159e8ba06125e3b3800,8af671d6255966bf9b6b194ec2cac142ff8709ca5600ab8f1ce0981f605774a51d713c213eb4fd9e6efeb78c1858b6f3fd0795cee3c97bff82f1c35afce92fc400,5296a0acfdbe4d8cf36866524ee77bb6b29b9f209361dffc628e58576f218a5c5f40dfd6716002195712845815ac0c72dcfc7403f22a95f3d5891a525e3d9b3300,299f11dda924ece3ac82cbb380e0d2c7f55e1dfe59cb6f6e08858c8f43ac4314498e13ec33ec561a70c1f52815ee5bbb3ff6d693ef2c4c10f06da7ae6d32a74800,8ed552fb8386dbd3a7d00c5ba5a93c68c309f4243336b3cf1e08e170f507bc641e3d66e53d88d5da4269575d128fbba4c84dc4be5f49e6d13e6fcab5aea9854c01 +5738ebff10238b55a850cd56b38fd194d991bb72ada59c7eabe9a0a5106b22cf0da0ba9889ac9f58af62128251dd653e1779900218ddb406f8a7f283d45a2dae4e6f03e0f8edfac6ebf692665275ee1d32cb064a436879fbb0904e654fd929d0797b5ccae2cf7307081475290fe27c38fa,e040f12f0004a2098717445afd2e5c8b17f67a77ac2ff3485617da86561555f3,755c234e697e43fff9d4eb725156707117daec4d3c1a0c6cff832339af8f90d24ca8fe1c0b01bd61750ce1c3932aeb6072cbf04bcd5f5ec1fd75c112f645d1d301,df1d6649e9b3cba430bc167c7152e9ed5a0bb66031b1eb5a6f991ae38845afaf3b818f8f0213bb5d8fc35a71f67a6fe77aabab2e461945cb6605b3b5a62e8a1f01,6c65301c0a9e206028d21bce68d93848a806137037d07a99ea97b0dd5e39268b71c6179abf9349699c650733e99795d898c46429a9c28cd968c0573156a0d92101,f4d899095c817c4cd63f8dc46c46e84433bab6632b97aaae85fee1778fdf60f87cb0144295946d08a8972473f3ae4a5eeb223414f7617b12988cd652d10803d401,89081f5545916dbd55376b18ccef20faf661fa9cff92bfb4c13949765cd17154613578e54f07b14b36d1e9033c6a8dfb7cf74c065e4e6bcd61fb8d5eae36e48001 +2e655bfd31be2ee89e00a285dbf30ca5eb141b56270f928da47f597cfea85142ca20ebc416922e554906efa8eb36da4e2f6f57b49430110fdbbcc17bcf3792a98d860a197195d0c23d04380946156de28cdb928fd79adc2bd658af4609898a74e4ea07dc9f7af16a73e4c308c60b5a03d7,89ff09d254ade7e3315173d5392baec8537d939d6fe2fb01dbdd7c7576928800,1e6e7bc57723361c0119fcca3dcff411dfa73325953eafdc7ebb75588770a6f613172580c8ce4de2480d7b911c089b433cd001da5ebb1520f5e082f2e24ab7a600,2982cb09ab77153466d4020c500b4e38fdac592627d88d38d9b3254c9d89876c45d9dfd0ca864df4660b22f0f32f75144577a9f5c756eee5e3f6b8c03261015e00,7e1c554eafc36acf803da5ef51507531e750739e5265baba7989c1194672bbe42b73f888b3a8e0436a06950eef1e7f2d593f0ba4ccf19c87e72099531112fdca01,a025da44bd57ec80dc9ea546646ad26ee88e5a544d4dc42eaa904869e6683fbe643c37eb978a5cac42682796213dc32a170556106b9ef3c50271829f7505f58c00,5704e4e7849acf9f06ffe1c1a3297218304249504b0e89144783f9e5692c0f1d2ef74b7988717a5e287993c70a0bdb1d6f6b0763b7326aedb9164ad59f32b00401 +08a689925496db0c2b32e5006d3cd10995025c788453c9934ff2dcb592db373d8dcd79c30abfe25224b39c326f1ce1a46d6df6618b5419f02c15dce6804274074e376779015bfe8e25245c07ecef892863a746a04fdab83584c55f33113ab2f79f545087e0fe5e47ebea420fdf07336f74,9ef0704f1e3a4ec79080a7fb28baa47f535c8245e90c6571abd60e31ca22b5f0,554b4c67878b6df48ad977f35bb08e53c87c8905a2f46a96b957f2bdab8a1a50252779ca2d806ced5193021869d94b415cd123df9d429af432332737e71ee8b801,c41666930a021893bd6314c0877708bebdf00d1702a862d94da7a260e2884e9924925b4a0ee77ddd6733fa56691cb688267ee429dfa0ff0110c1bde9e4f7363201,860c6f7d8932ed467fb616b1f7b0b882878275dae4e87868f385f5758704b7c963565da7622348a6854eac23e3791f326ce87f5bac8a6b526780dbddcd4342f300,78535d9e49494d4ae326d32f4dd8ae794921fc3fc731bd0fcb77b628cf1bdaba27a10351ec23d59d6c1e6971177a7e063eca087a78bc64ba263d6f15ad6da03d00,d3c39774b07459b7616f5d3a2f812dbb6a1cb169e1b881043760460fbb6581a00fcc6cd85a18c0f9539838b511c860c7f192de3d77e70a1dc5e2ec4bd8174f9100 +faa843f7325beb614f5c8b48ed2d56e76ddff0f1ce2bce6c30c6ce2eea824b0692c2c8741806711e68ed4386bb7c09e66c9d94e184bfe050e73fa00f7e5b367826ab5b1aa3a2eb042df2821330a580150f7416095e0e4363d59ab3f3155e2ceb6514b81ec63329e6d62d695d50cc6b01f78a,8e20d3cc9b0dffe0aad4c277465f82c1e364f75b01931194dbf49c36919cbc2f,9b4033e896cdd0c35548a0386cef1e14dfe53da689ef6a805f02e2cb09e0a1951eea0c2b5b63105cb9f5c0041ab7a468777ec275a2d8875bac09384117e9fad201,7e644dcaec908e4660ee2771c140778b418d6ea74a7c6deb3461ffe31bd5225f0cac61d8df665a5a1f21228b25d431ee52d1558414ddfb2efa2342ea8bf161af01,01ab2b5bef36bad30b1b4da099ed9618ebf0e487401d7508a608944a626ea92c43075336db085271cb7a9908935c0f28d64782c551ceefc0e10d838e9bbeb8e501,1888751947ae675389f16024add0edbcdc33a81a68353cb673fbe872cc509db3124227904bfb38501c387717094a6e9d394021d03dc8e7b927eb0cc276827a1200,75a61ef42225085b543b78f4f82794c002be716a8529cf8f9c0a941393a3688d2e51bb978453aec9b84a457fe6b58bdf8b0762b0bec2d74c9c0fd6609c9f755d00 +6b61e282586ee12f4b7d1a1f721c6b48f58acbf61fd3cb75d3a5dbbcb51e03ccc0db2b7d99abf5594a3dd32deb7e23161d80b776257aee391a1670e8826a32c6a32e3c9463d92f840924b3591d22130976fb1fbbd2d5caccac907c56bf5f33abe910193233d454fed1642e78d60ba26fb6d7,a8f915b18b85d8dd9a3dc6fd1714c3569b4b687b4ccd91ccae88ad26ead58c3f,225bae12a15c8525dd9f202c162c11fe9e68f94b8082e442a38bc6126776b86328bab1fafd6f623eb19ccb00b0a578e5c9e77ea42d7e0d4ff990de2ebcfbcfcd00,ea62a30a7e86db2ea28693b53d9482e7b22930758434d89878c75aee4518c4706b81dac4ddb9640b943846e469860d684701ce8f6fedac8d4186f4dcc8e26b3901,95de9dda3990393507a0a3b82baced07b0a7078e91b960c181861e8719760a19003b534c23c7dccecc8b99bd301de2bed3b97b49f6c727204eb8227d92fae80901,5b06e6e6fdba8fd883d1d1e2e40eb4e4fac9ed2ca94e924fa4f560c466b60e31200e1abf39ac0a091b96620fdaa83487e050f9ae772ac04100ed5aaa37eb544d01,e403afe9a861fe539212007fd9c96c8e526ad04f940c39d7e4fde7dc97062f8a0d35ea0416a7d82ae35578a664badfc952ef55aa8f8e1c8268860a500fae70ae00 +765b7606ae87277f9b8fda83fde5ab5b05fa80286e160c46cb8aa2bf99be413296e08f4ca8331da0638993a6c45e53c05c68965d925362bbec47dea66bab6f246a00d228161d89017bfd9fb254e2680ed909b7d23ac50471eefa33beb0316a0c010d6dda472e7ca4e189314b2aca9475bfc1,69a7ddcefd192b45bc9a5d962c9de4d4f276d82a54381c9e8383a77391afd621,c0d3d8fa573f65c6678c8b160b34c5ea73dc8bae7a09c1353109fac955ad63ba036836fc89fb7f13d0ecfeb625fb732e3d7f294d8b393dd0a95b13ca75a4034f00,be1c946b02a456d09f826cf2980790f22d59a205bb316691961a650b9be9430e093d34a44937745ed68f4f8f28c678751fc6039b0ca748045cf2759a40fa21a800,f0d25e918deee393c6c9ae67f2a56cbe3f755549931e82ec3b6afc4ec0e1c5ed0200185f6b532b23fa6844bd57b68d41e5c80b86d480e155270ede22d015b3f701,391cbeaa3e3c5d8a532d9c99e8881b8e415567679ff60fc64f46383d5b2081f975e7e31af2cd382190d97a3b7203b7a23ad03eab3d058174b0445d5e05e99c3b00,843789ff0aba08700c35a020fc27e4f86698a1e901b9c74ea0a1e40df2211f7c3b96954a5ee5a194b7f6ab8eee90a662ad52c93966a01d0f8886a96ed1316c4800 +cc351f38d638284a1518c4c6c459481d4a4baf86c19d03d869729ce0afe6ccb283ea8e6001ec25a1dc29700ea731e26aa100a24abf819c600b505607f2e55182e634ca35ea60baee564f90272217729473cfe5ecfc3296ff0757b09667e83074a9a8f145a959e41cf84fc73ad4d0a0b41fe3,03e3c3c37dabd2bbe1258e17df3569845b969aacdce2b8bf3fc1c75792ca6b14,3df69dcbb797a4a2ae5b87f0808af834ff928807873e657ce5752ea134e0930f5b9a37da5497cf69c7783887d839b751f6b316ad1dc029f6771cfabaa10e6b1701,f4f7df8aa7f243eeb75a9d3ec461643f8d7c0bb2e83a9d31b9b7364a52eb75b0548551d953b1b2a2de112eab7d95e215ced2b6c06b4f15ea12a91670c1e595f301,0fa8c306e4e15246dca4ac21b3f3937386b40e3310a99765aa4edef4965dfd5f466e8c701b059f2ce993603d6c233e0bb0f1b8b25e26eec092daefeb9b4e6e8700,a89ab51f6905b6a8e2d548589b93deb54a5ecb00d93f75a2571efdbbf47a0328500c0beb213189c064c90cb655d8fa96c033bdec9eb30230535a958c629eff5000,0d7e793df3a70704b324b7210463f170b524e4357cecb92b0edaeaa636cdc641033a9648eacd8666f67bca2e294ed4e821676aa0974a09767fd7bffe638342e301 +f3fdb09ba6c770089be080aa5d52edd6ed2c525b6b556a56c588e05d34aea7ad33e11d1995e49fb1ed1530baaeb773bd591118b94a1306e4d84217cbcd3180d29902e4f1be4a37a06e9c7d9dbc35a2ac2bebaf89b12c4cf9072222cce5acc55fb14ee7fd14bbf0388eb77144aab1461625f7,ffb7730d87668078413123d117f3b63fc241473d3133a44b1951db063cb8e56d,3ba6c49c15eb0e06f86229e5bb4ef4419ed443e8ee329b655ef1eb42f9615d3b36b87ceb66c51e5960551bc4670f597ba185d4d5f421dbd30a2255e91fcee5ff01,11325692feb8a17e6978c8b06f1872802897130d5fbddb70f947f365cda6d1d774664b11274d7cf87202f0514a9aa7d1aaf00fe1fd65d2bd95b9e7f50ceac52301,188bb0f59ce56d0bf04f5aaeb1006f1ac660ccedcb860448eeb26cd07ed12c6f277bb579d0999cddd2ce03d1830edb11dd18585c252ac543b84e7ccdf68dcb2100,2161b8b98722e6a5e9cd383b8aa08a2fc4e40835780a62f4e8b2eea85ad2a2d132ee379fd5cebbc0e54a33898dd5c7f52c1168258c6247a40230520628a0d4ee01,f74744192ba0a0729781a8ad0ea734755707ea710cfe3f44645bda20723a3a8400054ad9a96f77e71e855acb8347194a1cba419b61ee2cb581834a0bfb286e3401 +9be7e0647951518f12e448f8f45b9991407bf5a55c32ba7ebe8a35ebc992bc0750ce7d06e89e46a1fc17afbadc24b977ca26c30bea0b096c697813559b1f1470f082a8f8a8bef4a000e401d3ea5f65a2d1e43f50621c5388b1c88dc97c07a6cd72bcf241e3ce9ccb94107852de6767f639ed,15b9f2725eac5deb1ce65343e32c6972e498e4b224183ea4b180b93537ac4ea7,48917b3cc23982174ffb0765c37aab40b3e852c2c6b69156519b09fc128cf2f80b01ba326df433c7273536a5c525f6216ce75cb53bbbe7a3aedea89a02e5608900,b2764c4005d2ec572d2674adfadae9b8d96d4d131eaa3c8d1bf89050196d8c7f404b1bfc1169544e536c0af9dd00b683fee62e6236ec97df8d65d5c32a30e73901,43df016e83fbb22fcad289017223efb459abee5f6ecb4dc78d56481b80c9be5170b9ea32a79c43b422a970ad88708018f55f9a127097f24953cf0ade78012fa201,fab2cdc9037578b29f3ec9f0264df80620e3c72691630fe4a1fafb6a88aaab686d7324ae2549a5be4de7bb336a49a1a722f9517d1581cfaa840c755c0305be8201,cf447c59e6acbef05201600d91f54ae7c3830a0195e733d1f959262c574f5ba906e31838e67f76329282951fafcf8f1382307083bd19ab7058bf12945b7d64ae01 +f7b3b67421382b24a7048d89e288d93fdb2fb208747505c309c67070b5fc3c8db0e005a9668c3f65a4745e9604e434981547f4fbc613a192a95c25f1224aa2e70e5df7d69d21b2c528de5897e3e88f4910081fdd164ba797e391b8b54e111785332ca0a41c34a2616d25a6c3cceb357216d9,6696e6362f17e7e3404c1c60e4185d81b854925d6466c2cb4625179b0e8c79d4,7dabc873f8356a2af5e5f319dbc658b3fc113e63a6102f1a756971600f82630d6a15b076f2762f39b98835f5b71fe7b7884e9b2feae210fc16dc291214f12bf500,9c88d25928c1fc06ca3f1fe377645502262aa6a5e1a26046134091eb8a8ef10e60b436c0894fc20f0087a99abdb09d2a6b71d37822cfcc8a7848af020d42222e01,3b98978288192d1bb007c5e5c251f062291682de4079d8b2ef86e63439a36487599278adc0fbd538ce8da6ba7f6192ac6fdfd59fbd7977b4f32449e5c0cb77ba01,0ce04f36643b6e044d54d60f2798bbe3e56c3beed7109d0d535d8382e34d6596753a7fe9d88f279cfc825994bc799a5dc998c3da4d2c32cd466d2293f340e03c00,a35effd128207c527bce18c15ca25d77f43e31289d5d921455379503be3262144de4e5a21bc491e0b124a672aed10929658be6d7e48a86ab483eba3241ae3d8f00 +324ef3681c269a6ed1ea8094cf553b013dd00135b8835dae9380b1f1a594aed8686fa7e63eae57c0df783b1aadf02f83e63f2ba00c93446b62789a33190385c2f8d2b92f2066ae42c85462959b321089d6bc4fe4b1c97f8d13fcb1b16aab4af088c2943618d9140e7d29bae42fa9e83169c5,1ac1ce5d8cbb118509181e2e81b0cd3938e82d632ee70da6f03a805fefb162ea,e96f4d9f0daad2427e634919953fa620c96882432bc0030838aada0619eabc88000bc60842818ab48a66c28851b6e7cbb12df83d7c0d5fc8aee291069609719e00,4df6813a83bf8b569005b6d1e58559b0414e80ec6abb6567d60fc3221cbba239592cd91077aa94586b879bbf56e9c23eb3d3e76ff824d9a03f7fd218e53ccccf00,068c54b1fe37fb32ebb6b7c7b328ae0a336a48be400f80ac498c66a1559114b212909edd9f9f27c9b1f794a02108af32ca85c7b0ec3ffe123e498792577eda4401,c7e861d03c8c00b88d097e7454ec2b72a7a966c0d976cf3dc836f6e6ff208c57007290b1efd319b500a9771b3b4ee4ff614acca2a854ed7e65243f1cc1ff387f01,62446ace3c1348508848bc4e42451adb8e5dea2b49b1f7b5816b31609f892c126f6607d230e4a795eb911b60734b8ef553da38248ca7a34c1a40d48b6240627001 +6ef5829a9c55c7fdf417269748ddba1a25205ba8742e36d9f21bc48ee8c3a0a8c5864309a6fd73a7c285dfee3edddf0f41fe038c4fa509475a14b975ead2486e5272333b8eb925c6e6e4b2cc5c4cdac1ddf30ae078cc15555f5f9856ab63a6f257803d7d28d99e3d576d0b64f030836c1f29,fc7b6f8d830c66da3d2670333591321c0988bcf652189fc2fa13c0da70ff4d52,2e8c39a68767868899ad3e8d284f28bb258326858f05e675ad95551c4fb48eea33ad01816ce62cd86a326060db42d5d140f3e6c166fc464aa8d21b79c7a74e5f00,9e693884331cd69c9556ee6130c706c16576f6454055ee4fdaa21b068d24ea225d1486677f4a603ac822c7512a603c60f746f274b573ee1cd9ae96edeb5a8edb00,93728ae7a8ecc68f9db3920dd5c4aa309a15259ea0c67be2ce0f305f11c2c59613c5d5f5e35f208bb5330493d95bb4a01e6e625116493195faf9b7bc8559ea5e00,2208070d2d3d50ddaf83bb3c3e895ddec46c9029d0dca2dc026cee5974928d8b5522b7710cd826d749bda909e39ba173cded6d4db07e064e76468b5018ed948b00,ca78ad4382f27742140621b1997e15075c4fda67adaeaab1dcb4f5195fe946e831130cb3af6fa02d3692594dafdc6904f3f1bfd84c1b0855538f1c8a28738fb001 +a7f711952ea33b1cefa737f92e469571befa0e103277b375ed6a9f44db9d08a3bf70305e7d5c917dea057a44b5955652a6fd74119188a536bc30b58e16debcf4cb7d7bfa3c61d740566d30590cae6eb8929a9c8b30659ad01e25c35f7c413256dea41c244935bf11d95d5e2a3c151600498c,cf88382864445e8a7d84d78f5783290106ffa4823cfa399211528d79160e8f6e,7e23c1e00263eb3d279f87c10382faa0631d3de784c8ad273fe4ae96946a51820f632f3bf4a9b9ba50b8b7926770d024ec16ccc2219a51aeb38035b8ed3d275f00,01305ef5ef6736781ad545a6895fde8387de74be071f480ec75e3148616c8a2117d70da89f74316d721eea6b21f635e9d20fa6cb6ecc8c6d7eeb8dcc60b17c8201,1c46f013c72e164c7015738d6805c8de05a78691e68258f05ab21a80fac208657623a048b9440c2bc39c51ad6ddda2174177708770640809bf1fa778bc3a393600,b84ca8f8673b6556e3fca3ba8c759763d993bdb766d32c467c20138e9c1be85c03c45618905bed54bfac2f52d73f16a275f775d87600d8a2d0886ad6254a9ce400,fb2bc8e41d89c01bf5e4d67f7ba8b225f61d8fe418b81b91c0b41997ee3adbe7196a01ebc1d8c07e9fc02f4b67b17322b1543b940964c0f7f10edbe91174cffc01 +b89046bb3b92821fc5384976f812d7fbbe58ef6a8f610ae85d1fec6bf3c516431552ed91ffc9b1c14ad85d45698d50dab72bda173c89c3f4b768b3b1c9e6ea8623cbe6fe2f4087b3e18289fc2cfed0a833a013398bd96b91f0801ac4477c4f9ea13eaf1716b18745eae7adf5a77572c50fa12c,1c5f8237c55a3f2bc528d35417bb07f4bf1cc7aed409d09f27c9d82946ddc729,71dc1fec4f10a9c3bafbfcab55660bf62970904e34dc2f284a8e51081ef4d3732bf60ece9ceac5ce8024cf9e1a8732d9bdcf7afa76b6534fde7fc1599635e9f300,103a672d5bc8a18dfcd0f91bda453c45d21e70ce15387dcd07de546d26e1fee147bbf62fe6fed70a0c7316d53f88f6ef86993fb9bce334642514fd142ef9244000,4b1a656277f246e1af68cbd46412e8525e67c8bf82d56c549eee04c6eef9e3914a56be773a19e434eb4d0f86903c286bfd82ae77c3fbf5079873da800943493f01,20786420aee0ae249455a4d74173a028b8f09cc1cc819b32af485ca115c32bbf3732804dc4fdbb7d4bed1f1f4f4d67644ad75dd9f0f9651ced9a0dbc70263a7b01,d5dd0bfcfa56633fff5d87b9e612a97cf2432d353ee986aedc7cacbe9eeb2e7839fc413b2219f85c4b6a3292508c9f5dc48f693cd0214368782f7c4e31ee13ed01 +51dbc6c4c0a568865c89bd91fc652b96f9869dbba02b128faa96c2ea3e32b90351f4c20f27e2eea3e7169dde6ea96577599b3d6809d4b18b565ec4be0dfa677f49753eb0d5fa37050161bcc681779e599d50ab7433b1a847f573b82f06e6db74ab9e14dd8bb3188b72d6197c758ffceb93a1ef,c353e6a4c4a1894ad32fe8ccaab7b9bac5bd9033d16cbefb576bc11e18570868,bb6120006f1b0e76d05db8c0f9905987178b08324f24197e96a219c5bbdb767b3fb6f418b2d699e2ce54a3563a39cb2e66306e8eaff4c63e178066f49624799000,83019e165a1c01e331662892999962982341eb35311cd423231fc7899c57ff8457d7a84864969d226a89019b26c6dbd3a683dd17b59e7b5b9fee543bc7fa520001,83a2ea8a5ef29b516fa8486d09b55daa028761c206b300dea0cbf22a3b824e7f2ba71f371219d01465624e93962525bbc7e93f24c4de328db57042f71e13685301,2e327164084a983febe023dc29d31eb7dc063052713af0f7606d4b0b49eb914a1e708a5752928b9cf6777311b4334526d6a2f3202555ae71150a973cf9bdf21f00,83292b92b94c252cbf7bcaffc35b231947c57a39a6ff722dd2dfbb0e0ff964b8779427694f8ec057cbbbb0dbd5653087a001a1f30c0e58395968528433574e2801 +586f841016778e0b7eb757d3a4368bf74f97daac4e1b9a286d36d386468551afccecff8da3187379e9492a420d2019e67984e6b6af02a5e448a0986b6c573512e4e1ac633442229934a1a031bd5e19c934a46062b8f21942c83370f522aaf50245547c62420bf7015f1d220e249dcdc4a7e0f0,42dc738c1071766a78c8cb3b5c37e5b330e8fa913fb58162e465ef348477ca6b,0cccb96f5872b3ba1f8a89394449893c388dde5b36a4825cabc206268734e98a3409a9d5c533fd7fe30cf8f1d6f310772ceeccb997135d1ee70989122eb3002f00,73e92efc5cb2dffdb2d5fad944072b62e87c1beec869d096aec19081f06d61e91eb15cdd85fe2dbca770b8f24ba727bfee57c42750b8d40efcfa05eb5a97e75900,5a64daf00a8ad720b6e5a37161121072d8e0fea4e2afb4d268cd027da8272ebd01f9c94963e0f2846297bc02ba29af58f7272c4cadb9da7e588909c8166466a300,6e6589c7618f0ab1ee0499ce382476f0a5f25d3256e8c022fb9c174505e805ca4db40fd3b72409a53c6401a2c7ce1a2397e8ce0340a28c887e8273de5ea3a23300,5c061f631bf24d0e6f4c49c965500d35420324a3bf998790305a4ef1e1aaa4b2735b9cb171b34f6becce4a1f2e088bb6ed5d0f04a509bb9428e5ab4e17e7f3c001 +482796eb60c05ba8955660f47b8103d167e7ac61b47dbeb3b5e18b5d25112b1dcef35d6fcc891f9ae535019e7e7d041250fbd4196bc0c0073273dc7d2de63ab66fb6dc354737b56bd90553ec4c273b1ce66463255e1e63e9ef21f85c1d0af13a1b653b13592564c5bdacd3f18581702e4260fa,5e4531c35f7e6246077e8ea53838db4d4e216103108dfc65843a08eaec131826,5e1e93a51b74b4e6d95295670086ea1123d01db32131ed03b12c8da4c08ff2925a696cebfdc993585548ac9b650107ea989213dc73bfefd7a5cdb687000064ec01,a24e83875ad891ae084d97dcb484a97706f93b8b06422f6e681e9cc2db6341364e26644398045a3507e2aff01f8f806c34f6057164b7d1d34111c71e7bbafff800,baafc8ad67330730219644f33aaeeecb1be0d2455a60dbef295b6ada428f490345b265a22898c9300fc9d956856567da046b5f7ee5701519ba801b1a6b952ccd00,08d19876c15546305d69d6227f0eda81e7aaabb9e773671c8723342e0e3e20504a6e59ca2701d455878f96917844960b7e8b7ff29057704d4134339ce0fb6bda01,1e053c8540af61002966c213cc26c689eb194b1e85c06bc543f9e6071a7dda7a4bd7053a5728c17031f7d9f149f5c19114430adc82f977fb37270d1ccbc069ec00 +49ba0c72d286965246621ba600a19d8d11adc993e746719838e514d903104daf75d1bcfe1586057c7966fcb526e1f93a27a856d366431988b97675bd50a8fe5f5891acf3cae562e6cf6f0a7420af2031057b521f8f04347d2a357475e34015c88e41fc2a254163ca6d4067e9100be0bf55a597,e6f088366ec309e2f798a83e27358bb13e8449653a19be50aa1507a8a02c7182,57b732db7086322d50682f44fbc9976605544fa271e763740eefe10daf2c797b1e817e7d3cdbb7a1b083052c0985b287997ccf672c1e7367a2fc49df5d7e1fcd00,da0f459cde2f58654409ab6afa57b0bb6982fb10c63b747e93542db3bcec9c7803e5df7e55258845a664439161f8b6e0eb4fd7cd9907d4e257590f21f6b053e900,cd7a9a76e6e8f7667fe64692c6f2cc39c861a4bd99335b6917b585fbc8716b3f68100bdc17a0e76a27e901aca7cd2b4772e92eb1225624cdbb79e9aa3d2e583300,93a56c7b6fe09645e1f20d41f9e2989a16a63698c5a61b382268ab06ebca46d80f171364076a0ba5c5bb52565276374544bbc00250d7aee6fc4689ff616b586501,c66c1df352aac9fe5c9794994e588ad3d7714fb3a1a3a3e06d8d4b6386b582b7372d67930e920443dea1db646b93c5ab04348f62842ee6b0f9463339668d172100 +38614d1691103530e05b4181d89380c8c198bce89b2b3ecab5c253a5800a66591f1029d873868477e85d0634a0e675554734d7e09065516dbce4e3150584e548b0cc9cf4d83fec66f52bed3b3a46c2196d82390a16683ea793984b126904b0b3066f9959bf07b4f079c6160bdde86016abe993,1cfbad2ca8d007e2cc5a90ef36f9f62c0ca2feb5d017666e2222babb67bee46c,6cae1f066e6e126e49668e4ec54f68e22e026dbf20a6dfd43c2bb99f9d398fc75df4285a5f1f3d4388a8e848a79015c9168822690fdd603a432351101c97127c01,06e8e06a1445c2656d0169c2fb26b853fd9d28921fe021b3469faf65da5d6a650efc0d2361dbc109d5cbf807a8063f417498d13b3cfae10840ca2883df06c21501,c2a39c7f0ccc2c9dfda3d4358260a1b6d811254bff705a1c2d43d2a331d79cc6331885886bc4c33c440f461bdd7259299f79100e9ee5c3bf57a050824683a38800,f8de3861db55bb55d300802c1d2e1b44133997ada7f43f572aa6f9df5ad2549e4a7535aca597041490db14eb5fa6599e142162363008dbe4c7aa1661064ea9f201,58e045fc029b5daf6cd465549f87af1275a9fdd7fe36bfcd26e9cb24f75cf3f546c46d3a8780120d9856452883f91fbea7ba2e2ab064b1f12750308be6da7ba501 +b014c4df080f15e677d328b034d3ee88e5be11e475b237f95a81b568f7194118e04c17237245843a039714e434ac8982064c42957bf49926ebc730cfd8472329d1b4a6a012bec51b32aef143bdabaa2f18e68a350ffb1ed4e07526308f5c9fef8fe5fc1a6fcc3065a7af8ea4909d0eb07ddccf,d94672a190f3dea3961f016f9f2e7860f366c00c30fbf37f098cbe95be34847e,32f95e4ec3f325d0ea0851d38a65e09b5031800a6de33264adfe8b67e31f4cc516d6919a34059ceab8eb32a99908b5d083b5617c33e73dc9804bdf2aa79a47d300,65faba55deadbc5a827e40ce400ae3e92c41578e3aa713b3192da557cc5ee08c6b60bd27c79c755b3c6602b36242432f7188efe31693d94567c2debaa9b72baf01,e2daf1d19ed2215cd30c23bd8e05068517ecd114ab8bd38d64cd7ff2469c190e7631219c3ecc56b2827ce8c841d58bea7b66f113c829cb1ccd171ca58b62c96700,18cbcac93fcf2f869116ed305cb6f81f8c497a53ef16cb8a87a4f7c52d89af193642904e321d8b561b110472ba4a7dbfaf7d39d5de97bc1b9038dd571c58798a01,a903767726c1ab2b7492dbd76ddb4c52f43070367de43d75d39108224dc7875a577e566b39275271bb88f8fe32809f09f715d1ca3a0a697788262e19775f9f6101 +1b44fd43e418e85c2775fec5de48fa18f3eb7a3d7b8f07b251ece274dfc566cb596161969de9921c25c6edc2fd0a0e75e9927e03d68b7db89f393f623dab71003b54073463c1aa98af44e1fcc0b1471906988f49895a0fde2296523532768c32061e9328af20a4fb0f5e24e4c9850b912a3e85,caa37352f0450b04585d4df136c7a4b47fac508aa4f2cf1ed943a85fbf360aa4,0892f01d5e205b361c0c7a7c5e3f55333ee0cbd65db0228c2ffc18b042eedff42f04d701ac60954619dfd94d1f0637957d062b50c1fa39c4119e8fde2b26da8c00,79eec82e791a986bedb5ee0ca38396c94f0d9c091837f3a23fa9a27f4f62123a0731c1ce305b2b33e91d11a512a429b6c359f711b0d317a6a4f7595e03fe140200,9175cb1b8e5e365fae8fa3a78d0b9dee4b4f72be6b3395ef0df8ef6b2dc79f4c2e55a3c18bf485036fda3a61ecfb7ce0bed9f1b6973b312cc6d10d757d17a7ae01,4c139be53bf1b5751fc961e2f08aca1c32e1cf505bab850f9379b5f6001a6c474b267f714490b348fa28301b251d581acab1f9e5a31097fed35051f2c538742001,806432a5ddbf08028f28775ce631f137d43ca8d58857dc7719758661b9e443020e501c02f0e663c3e21875f945e53f1b02707d982efba8440ebb4091c5b1cddd00 +0665781b208bd77a9c78f04b6b0306bf994249885180c6e1cf20b98b4e18bd6705b0052eeac46478fcb45796bae9bd42177d0aad346d2f76d65fa25e8bf9121203664512ee66bbae9f3683abdfdc4bbcc15d6ea8b3eda7a863b0d1dd98c1c547b1082aa94048afd44dd68aec55d7cdfdb1402a,0eefa15b8beefae7c56a0504276e5eafde9d3477418e6b7394b9f355dd74ca2c,2e6b7524e782deaee6ae3e16f4e62e10c3f2165230a798b34a27a580d4e4d6e8445db16960d4d2673f7bb669b576ad5b756845d06d8aebfa51bd63baf59c8a8301,2848dfde039f2945c0c764a68faf638ac9584dc9166f5969accb711c1a8d61132ff618c2d70b762fa7a6c41ef23da8c9ada9beb7a8018a94f265a6133163839f01,b97cd614529f1e1a00c681721c487c2cdddfd32d69a239598f7ee44568884b2576b904f01eedc4acfb661b2cac30fb067ba30556786d6edc3cc3d2b15a490b7b00,74bcff19c0c2d630c782dfde48c41291ad33a14b4ae42765b60d4d80ffcf766b007150393e482761f118cf5c330c3bdd5862b2503d38d3ae156a6a97297ff47400,cafaefc1ccc36cfc57b5e50ca7b8bb5f6f5b5314b40d52ecfc56e8ce3af8e95c6dcd10e1bfddfdcbfb40e4f7ec705976b7abe6d17ad0ee4b44b35c4074d8f1de00 +8f9ab79f5add8cb424f2f48534a0d775eb74991aa5bc62004bede7a500c96985c86ca579f62abc0570a21a4912075f42220e4dbb636ae8a66871240576c6c2ba4f76ac6c3512b6eacdc7eb95a83717164d48f1097d237745f955e3ed810f159c716bea8cafd703e789699ab2130c5302d9a566,ec3b63a05cb5b7964c5c243f38eddea75508925fff0fd5defe816374c14d5786,797ed4bc10b361a33b35b6b58e375b2e53a00a5d9426cb112380458ee73c14dc6eea9f2b93612099ac5b60e89930bffaa60e0a9a78e02f46bb067664f6810f1300,235b017330b4850aacf89d662d0579757549b2d264e9789909eb9e11acf856d50f8ff4d38a15b5dc8cf607a68649e2a541fc732fc71337dc1002834aba39be0301,e5783ca90ecec50be6fd50ce41168bc7dcdd9bd7a04111d4f42444a49fa5a0247fed31da5c13b0cff8ae913ffb642a73b55aa67b4b4f50ae8f2d5a441f46e70f01,0a881169c7571a4d0993e572431d87d0cc3af27829bf8fa55fdd2d329c12b5d83cfde25e107c238a642d1d06ddbbc2577bd95ad1d20c5297aec97405c0c3317a01,c0800c73dab87841fcc92b5e9273cf4d80abb795436c7ff75d79dda3f32978740c5721eb3cf6510be832237f6739630c059cb7476cfa729063fe89c2a977b0ab00 +9c5a35706cb3338fbace2bdbeb22f03270f6849e553a2a77908850535990e1c413e0a4e22b38be7daf9b8a2cd373fd3384a8abd89c9fbffa0f72b50ea29f93874524ff21651ef1f09c471669333ef92418ec3aa562953447d27627fadec43243dc71b2133ae075b4bc1b39708a72a56a5a175c95,a77d8df42b1a8833f19a48ccbb6d8fd28d5dd5ec4f02dec8d8dc8d8c182a2c4a,87a788c1198527e4f8dd3a201a95699dc4f76b8650419d2cbbee6da8f86699020298386d026c533d295c1de5fd01df2761435b283132e96315f23faa1fe51be301,1906c41eec9212b81de0cc8bfbc54fade2e7bdf9ce134e37766fe499957797ea764a58f00e594a08b91609166932e7887b387c0f3a3c52a7a73a1803d7b1261400,bad385a136dfa49f8c6aab38a76924bd76c3c4b6f0ac2597f776dcf490350f9a5bb86f4e27b3b37fc6bbe334322b7f72baa7f7fc3cf3d9c737a33003201b27ab01,69aabd0c14027a55c210dd78d70c99b6c9841eaeab7a8f5c1652efd75fd5c793690a455a21514bcf64b08069d16576a8ec6c90b5dd574051e962c9b4c0b34b4f00,55c28fae87cae20d29215b5902a4005141ec12c1d75316db8e2689b53f790c3b0583259d2b6794e1505f4f3b73be0541a09e86a4b1bc2f7d8158dc6496c522cc00 +d1ffc949fecb2d7e2957bf3392a3e5d27cc56cc4e135fc68645cd3513166c603d0d34eb5f442327ef37073b36087eca47dfa5001b149c52e6f5830c386c566327beaaa4ae130814bdfb3b9519d2565e5387a27aeeb62bcb98cadb727ae2cd1d3b6a1f6d678a4ba91867c583fabae7e1610e66876,793d3e98ae1e3497394b42eb92e7d981b47e2bdcb72c71afbac906c77af7c2b8,ab00ebdfd67d27b1a3648af8c6a30a82471512f5db4d4d5ba6b786271c458eb60561e8660f633a496deb8a29b554e3032430d112a993c4e9088453317877cfd601,d3640cd43ab7f033b0f1ee4d0f33509f4ff1cab6493ca6e406ec3c8555054d275a1b8e2675dc10edf6804364c295dd4f8ad264f3523cfa5c8260c688d034198001,98ed884f881b6131683cf5b9f55f9bdc745dbfd88b209fdcb71f014c7aa3597f5ff43ae2d50563e473164fd12576c55fc99fa2ca0e45633f32603666569a667301,2c66ab5587f54cb7b9002c874c46abf7e736713079652ef59ddc5b9e9e7475ab1b6428fd83153860a647017241fd1ad72ec180b14338f4421a0ff0c2d0e546f100,a4a7d4e13c71c2245a224af59971a39bed9fd52cfad031e3f25bc6109523fb2f52fd376ca236fc1e423a6645465928a292a8edf0343bbc072c7e46ca987ef16100 +722dd6dee9afc1ed4b1a2428fd88bcb3e6f06bbf947e22dccf45254cdb0267d445a5604f22bbd988397ee048bdf2b9cc95a92f2aefff8fe7d3e3c63c25fa7b3874e404095ee2753fbfc2e7aaa6a2cf678f64997b51b1e1d740973f0c55cd3a9013bd772d51636c24ff5eb5539d5b14c0b3bb6415,577f3f00dbc1535499af46f4844b0301e5d1c38e015633653d36588300ebda29,7146d9ca3892684bfb75012f48fba9709ee96775de3bbc007086b1083bca89cc79c6b7354c15960dd06f26e068a60c40beb3f7616807dd57819fbebea425e4a900,420304b951f3f70233d49bb6fb7dd4018f0489842ed3207cf583bb85e1a677f24fab2918b8a9ab8b885f37b918e433bde293adff63151b74186a17ca96fb161801,7c1d0b016af4bb44e26f25a2a6ed5e917ddfb523ccbf2fae607ee5e7b2a1913722052dd6c858460a9ef07d37f390cba1f9ced94bde08419923d29f5cb7fd64cf00,c2d112e108e9d899de0da2d4f076e3865c001f79b4cd43bb47213075793e49bf3caf5879c9e864eddb70227bee36070b396ac68b9826e82ff1e01c582b22a42200,f2abb247aa07bacacf63939b26735849668ed0db2ded61cd0ab9f4320ec3accf1086f1df9a9e8c63c07b99f4307db74c148b0bbb20bf74ef7f4a844c8f87d63101 +876696d46626802443b72d0b33b9e11b8e824bc9f072020e3a2537c72e03365977446b8697d761c4e31eedc724bf6ea740f58891c3580184684afa6cfaefa1d6a5bcffe320f1337cdb96f8a4f804cb1752e12a5317da43481b4000c7903904b4ddd163a2ddf7b02e750cb60503d693ee6c0c182d,99cde9d9b55852852878be4ed49182c52961fb8d54ca41fe6a4fd667ec1515b0,a1d43b739c36365368e661058af0e64cc3c39a085164dd5c68bc02be91930fd2590e35c2fe583380cbfcd5b8cfa6cb3f3a5efb3cf7fd33261320bee020f22e8101,2f0c076e4fc41975c67bc444708d6ab48f94d6c3cbfe07d5ca32814f3802ce0f6cc318cb76581be5f932d34248a5a0bc9f27e5778b1355988fb1e3b0bbc7aad300,a9f3b0ab82464053b79115c35f69d968317ca2590040cef71fe5fb5ff5ca3ddc493b0126a882a4e699af121de077ea2f2b56dd16fd6404d2ca04a86e54818ce500,d37639b26cc4e9a5bb5e2c9ab1e27c30477396ac306a1a00590f6e92be0439607454e04d120cf74c5431deed1baae1098f6ab92ef29d88f3479f71253c2a7a2400,38f92dc96955c6c1a681f6e7286eb8c864067e6017ef824dd45e977368cede282f51c11de3dae4cec2c0b78d4da681228f24802b356e9d15ee34a20bcee5c2bd01 +1d4b31507641a53760e1bc6681c69054450304218f430cab5f977ceb1f8f90d4e17bd22fba0f8383a4375e0218db46ca41b748fda413711fd405c86db7e40ba1e5992d3f69816b075210f33a0cea55467d3ef3014a0dffc92e115c84ac80cdd68d0fe181dc4c9f69d260cb1353971dc3abf92d16,52e66b343767763be5f28f4b0c7f4389878ddf32321732ab8243183edeebe7ad,ceb0bb31f1538ea1ca574b8cfd233246af16a7fed31f9344e87cec443aeffe50751bb0975605da44c80e647134e90d3df24f905b790d6e500f7198e5a9e6702c01,926149f295f2bf84f1d307e9bc51444e39a4fd2785e82691d9d1247c0a8356e85c8fce5d4c8d24bdb96a0ff08eb8a865aec7b8fd3ddaeb8abcf364b8566384ab01,f45356d53a2607f4eb2a10f135a1801e7dd5951496ed492a2b3e46b1cf6f37bc653527b44c747962bc64d522b8b63733b41ce44b96f108936b5dbac345afdfa601,448b20c0c6828febc9bab43897b709c62de8b62486b53c6529a8bac3fca4e2a111766d005518875e935a43cc471ab2b8d2787b15ebeebdddc07c83984d82d2ff00,f7a0215434418d10e7d7c2a7da19f144649ca445fa02c9461b5385e8be58b80750bb762fd1fdd90cea72abda49b6ecc96e43960e4d7025b90e92709efa46df5600 +e51f0d8588bfdb9c3b5b8e6a5ba7cd5ea68f92cce8358019058e9d7b5db95d2fdaf064fb9fa593d80211453d3f08f1df4c54d7035d4e37058d6c71599ce4cf66023b5f511cceb0107dbd483121001973b0acc442ea665a4c775f42634d4c21b470b654f3c5df966b9761eda041b358355a237099,43cb2c7e795ae751e7317a9db566daf84f0b35a69589c7ff444f730ba2857bb5,ec30a37deaf291193e3be31a06b5f79b2f6a9f1cb64079d6b2a611365c55d8731ab65dfafaed2d0da5aa2c9096550f420879d7088bcf73bf11505c5b86a388aa00,365aff817cc6d803046dd569c883711bd5c6678f5d2a98c96a7a345b8027855951cfc0bd02b4ea4a91b4e2828d4405c261cbbcc6dd2ae3cc8b615cbb1329599000,711d54f8909b2b1922c14437ecaa608ee82f706ac27a59ddb65ec96a6ba1826e5c0ef5ec15f9821cea24a3be41578c1f6374ae9364dce98459378f500e768a3701,567e755fea12b37d1b809898e767fec07949a92cc8d1ba1af92e877ef126c76f105bb1c1c39ae9dda9e1101d1c88960dfb9f6cb490d39c02f9bd575450087c6500,db3e8a93b5241627e6d554d75f0f00a1d76121ff38ed7f6f59d60649b6886a61389410265d538a9b1fa60150e0fbf754f9a975efb786c8141c31816115f63f4401 +99f284c33fcf61fe56c521cb95ce346b5fba8244815baeb76c00e9f17ba8779045f09d8be7225000136eececada8711c66d9406f28a509f2af125be1dba98e5af5aeac471423bc512e5de12bf8fbae326f06106f43b1dd9a951278e60b96c90d918ae8dba4487c1ee8fc7e6adfd572d687d204d7,76a15c8262ccc2c9d0983e04da5818e8e02e2f5da91df675f9b0db2508d77672,0a998a2a17c469af7653a3c51ec89587e490670852766a56c174ebf604c00b8f157ca524b01c47e3ac9c401dba6650824e6d1794e3c455e8e2a74a13302f3ba201,47769c23204ba0d1653a43cab0ac0d087dffde1d583eede0be4dc92cc3b41ee934ff3e869f8bba3413c2c5b50f1d9ca18ba17f8f1b3211b05440c05039af01bb01,f4535e27a5faba0874e2e6160cb40696d00d1232e9dc2aea85858515cd1d861d3cb34d8d7f1de06e6a5b074f4ade811c979c3c0462b1351686fac59699f0667300,f06e43a1545d6967fd1a6a78013fd287f9381a6bc04ac559f10219a53f32c9080edd617eeafba30912bf51faf5e9edc8f9db8260442bb06a37cc88ab35a8820600,c01cbed270a9ac2b4cff2b73f43774d52ead4f916e178a68ef0fe6c8a5560dad2bfe3aa44f5f84310b54109c77b9bd7f241c21a0a3f85d37474836c0c046500101 +a297a579a30e5bfe29881068905d9b4e9c7dbded473fabd4a6bd5245feafa23d03f1158434ed0181c4c71a6e614cbf1a101996ea08adc5dab56f6fc1259b52c07d7afbf572cf1f09e5178ebed3dabf186b92df71b35ab2bdccddd6c92d2b617fa09ba5298f3c0918bd0be4e556dd6f01cfb3c375,43c341ce0e53121cd5ff084a47af69c2801ca1ccb0cbac11eb8d3b3f3291d521,59c2179f570a8f1412021d2dced6c4b265e3455dbd9cac6a3ee81cbceeebfe297bf366a56028b0f50082c20da7cb5cfd0d00429c4934ddb6f8d03080a794651d00,e4fbd751b92539936b64dc49170ec1ea7d0ef7e5b324f6268f74d562f9a2c3e76fb6526a21cf03878724841925b101ce39a82fd133caf0707abd9a88bbc995a801,fa9311790e6977a4dcdf5c6acd8ea6280c8a5ccf86c9155bd5e2958001f7e8d457d4255aaeae4837c0854a1ff079f6923c127eafe3530c5a351146a66c3a623e00,6ebbc5748a9a31546ab2fb083f8579953df4cc4b8dd2b982782a6bcf694fb6ee0a44977e268073c2a64a3af86f64c81235b684f350cfc0dc66ae084cd03b6f1f00,8c26d49d8bb0c68c135a5fd0c6ea2c32430ce9ca86fe57c8bebcb12da1777e737fa55e52407e18d470af7ba9305bae81ac456d3ac7583510db80b5fb03e996a200 +67ec969eace67a7cd7fef3bbdde2e09869fe6bc2b5c91c91273ec1530f8a669bbf03432507f05ba2ea4bfa5ad832bbdd937b09af6936b165456c6c9faebbae52ce0db713476a89eac98b9642d66f154198a646f67f2a26c6304704c415bb6781b4052f0a014b270291bed2f6c8aace3ebbec3535,451f9af1685c214bdbc92651b78c4d2f0de674d6c482407db2d80698025d57cf,52b742cba9aec9d37f40217de77e98ec0c884518cde1336562bd258f551194bb456ef75305ad2817c939c64a0d7023d256f2ca67bf3d1bd19059abe1950e3e6800,8fc3210ec20c6e86218644b0350b1ad32abf04afe3043cbb3453d4931bf8df3f1d5522dfd1f72f229fbd7a631ce17c7cbaeebfa2d328b6a62294dd9b9412344901,7627cec0b04e9db7c605c024d09f88bbbf074faa90a4bef31ccd087ea3b19db4427cd4e25717510b37e5005aed6805d39b5971818376f11934a71d112e7a8af100,8e5d2e1735eb27deccca0238cc784a980e3ec32856535f79e4e7425eed1bbd146b7089c25d35932e3a74b24fa1e4c7353b1514dc435fbfdaeca0bb12e3cf63b800,76a57e72a43711b53d35b997f9a52251316343fa19df5f4bde11aa58cac40b8d64e40da4635c9ae3401b454aeae14c06922d33db2e049a7bbff4cb1010d4c13400 +e5d49193da806cc438d13ab9ea64c8beceecdaf9b8a96871b9b300f2926607b766cfb1fa320882d6115b01d8121d25805df66ad89b86f98cdc078a9e5cedf22637e0ac535f8cd263bb118887384ac93fab01638e65880ad0bee56379cd846ce1dcb707d292053fb6dc3a0b595bcd8735ebfd5048,9d5187e4dee0d2fdd683dfe70377a816a1fec42ae1534224b19e39c7ecd38f6c,e6460593bfe0c63d985f136e3107badfd9f09cca3fe1aa2d2f2b0b38b1cf2211605727c7640eda75103fa25fd9f0f8cad4940d3064fe0deb4717d6f9b7788ea801,b14e9b488c8ce725360e8379431977987a34450d0d161cbd1efa3b0bc04f9233171e1ddab496b9fdb177c0d8aa9a4b594a006d20288f1fc88c7a57539047b7b000,e7ae80eeb81a3d8ed33dcd27279788cf28e44fda683dcaea3967f479ec05ac0202ae770d12ed57a98f9655546c243267ea838afd492db57ba82fcdf917fa71bb01,32d1ef5b81b4aa1abd19933bb266340cffe0ec6d3562acc4db1852c585dc8dad74f044bec29c7c8e3f70e5170c62c834c504ca2df5e40986daaccf34e4753c3701,befb84d5e3aa75d0a6f8a0bac449052505614d44015635998982559ba7679b74139bdef65168c8cfd9e624ce10221a219149dd04991e97ccef641d2bfde40d3801 +e6dd535925e5db2275531483a02601242238ade6e5c9ea499067e254215498f91ee90b0661f66ad8691a4489bcc1dd310ba8d7481a4a154d5ba9568ed51cd2f8fc0989826944222d5f56390e001bd57006749e448e97ba2fdedcf1dfdf5cdbf829013c84c0ac33396907ac007df4b0f482bdea7058,914124e11d79474f58114331c82eded55fb11bf223c59bb07a1c6caa068176d6,d60f464815860f720122c34950131ae01417c0e84b03413d54cd83f23eb228571a7da414c2ac3da1faf403c343f2f98b47f655cd093e4b83975c4290eccacbe301,0119bb43d4d81ec017ce5cebe404fc6bde1246fdf8a1665768ff6cb0c48447760024a10b3a77091baad8555fa5f42018f66167a5e683fc1ad1a4a4036dc7a1ef01,1b8e7124d9331b30320c2680fa790b0d6cd34455dbcf55527479277df5af141c44e193e587fcac2597ab6ed1329d6bd4535ffe3243b6a0989c521582d57960ed00,8c666100c19aa68a0dfed4fb68afcef33b8e2ad5202a9612222b806a39718d5a2a0c9da6e9ad397177a8913626d3e25ed1c428fe8277493b44d31341ac86c32d01,c7aa1a88e6fec5c2711d2f50f332dd1a088f2bee1e3233c06c5bf26b5856ec3c1ad95dacd3a7117a42d94d4a0f9ef03a355b53bb15d6c841ce7bc59693ea86d500 +b0aae57f290f97415fd7ef50a8d0c2e0ce2cd2d16662bf1569afd55f7eb6e3f319e8ee2108441eebf4f836758a8f6b351157825a3b76a4daf7430a53a820e45f78ac30e18e32110815d4ac35d316cb56e1526bc500b8d7ceaa794cd853bfc2d7e0377d27c7794b577a9502a46df081783b26546e43,c6e011bb6f91b6652ea5bcba5cc6e36412379155a6812d1bf90b9552694a7980,64d557499bf963254222ce4d8e0217c9ab39d4ab2e6b7e7855aa52a4e1eb13f86ca98454ec8a21587618bfe83e5143de0b9be032d0a4ae15b18163dde7cbc69901,5515402cbafa083e19b11b9a97ec5c09dda760593178bfe8f0896ba0985b96fd50ba0456ea6867c8b00d9b136f734bb2c07d61d1c394901627977e4fcb0675c400,11970a7712b61fec4e097206cee79dba422e98dea9ffef790b49ab971c7392301e80795d5693adc5932aece9244a79b3a6defa02fc97771daa05b98c85b96bdc01,ffde9c104f7aac477b8e0c174721d9f4fbab36947c7992b7be43b16869ee0eb23e4d8168e0fa3452c097ec8c16621ec23d919935c495e8ff856045cdaf24e3d000,a73776faa1e0082a354e4ce30db32131f1db3b6e57c49c5b3d7c85d74fc51e16621ce8ef52f6095229df8d0910271b8a76d41923b7f189a27f377f8829da340f01 +8520b674ae58105ed676ec11adfaa641d1706d202bb1d55178055bd526d1dbc938223730f3cb7be058550ce406ae4c29a1ff27722405fbe9aa938b0bfdfc00c0822be6f5b4e5dd0ecfdcd80b0e3c37c33d78d0457b1f2228fdde6150b48d250797728efb2176b86ca5103f313fca6a7bcd5b8d3be2,1602861f1dc03fcb6979cbab300759a45f3cdd21cfbb7d46b0c206ffb360bf57,b6ac75fbacec14dd41e482880e2c9be7550b75e3e1e4ab95a01fdf7188bc66e01e1b58f1a737cbbcfe130b86135936bd4b1330f9d98d88653c80237eee2b572200,b582e9cfe4a4a666475aaa76eb4a81c5a35e9d6ea966114d50410c60929fb3f777085c5fcbe652f0244a385a42c22a5b8acd427545ccd299e4c4ea6abba9ad1500,0ced94ca014344af5e0dc7dcbbb1b1d3b11a2fc14bc09e5ceda6e21fe28f14ce4be7ec66c954f9dd8df1d1ae81ac7f1e5f9f68ea617d7fa764c5df56896578b301,80a98bb2db27ab19180c91171f8915d1e839f980f8f1eddc295606c54d7f283c39927dafc26655993552756effa647a9b3f1977065e657d04b7aebeb436aebc700,7bfb20c1a4c3061754ede54de9b8b349a145ac8c58b1450a367176d1aa3557e164408b4a2a7af4fc3f78791ca428f6e5d57f64a52d80a72bf3d1b8da677a36ea01 +6988ccd10703fe8ab76ac36e8dcea48688f43d8e5530fec7955ef04dbf2032b017bf186ddcfc777895940951a0959a543eb8f02815652d989f2c5373624dc42ec931a68cfc4ba6a7941cc6445f9e43455f39069e8dc8e4d0eddd7210e2c364d0b7a285205ebffc58794709d98cef1179ad4f6885dc,a07a09ec13c79b5b48d99634e1555be34401fbb18557020b7724417ec2feb236,8f31b3ace086215e325caccc72bb2abbe78c3b98410fbb2aef93c4109a3119de159e245916deada85f8a02fcb9bcd9383c2d6b0e088c28c2bf2ead6e75c7f8ce00,8b937b2a7c4c54d28b7e6fa5601e01d6e58fd83aa3c47bf63da77bb25ece55a076326a80242a21420d0c1af8450e89c5bb4616274e283caa03d2086bd92f43ae00,da2a509c368d8f5ba89b19107ebd7e4b032af8d5025afb1368a698fe068f2e796a39a2e636e0e5dfef455d61381b52c9080dcb24cc54afce215323f6cdfff9a501,29a876353fd7075c2545d5c7cfa03cd59e6a79d8d8057abc6471ad359a8230ca33d7fd2aab9eaf93b85f3f0af9fc22fdd3ec21fe54629a34647bc68542df4d6601,1cc5ae10e8b21c268577c001d8cb7e064c42ec81f864b824a4c4148f3afee7a6191527622939b4d3b9ee25b52a9c9ca4ec7d02386926abd16c8e01c75cf5076600 +8389025f7ca2049fead514c4e0e9efee17e9b63fc4a217ab836fb81fae159b6492c02bc770abcb4e0178cd02e00183afd1ded8e07a7b1aba61b6b44c9e34d61e45746ef3e983b4c23eceed041cc8583c133cfa814be849402bd1b42efceb236574c0e2e3bbd8acd4d07533790b5c00def435bf86f9,5e842c6476011c4b4bea93713ab0ed99b1deb9bc34731e8a2aef9befb44c4896,7729c7dc26c6d2f62ef4720d891ed8effc36ab42b04a3da7117e4827751ef00d4abac7ec90bfe0c66d20e54df1d5ba66e331631fcdd9f109ba2a1a508805bce701,c886ae7b4918bcc53a3e2ef0ac5f14744ea116cbf93efdaf373c6ac4c5fe5bd166878bb9d16097929a60915c5c2b33c5892687948ce4dbee972e854e4ad55e8a00,7e87dfdba2541a7345d9be3815688c98f9c5da0e44f23635e5a29f39ea8da107349c3eed05900c7ca67f79844929075d3a2bd85130641f233496d6f8c7b1ce2500,3b60a034b3278cde4f65655459071d83691e0cd1b876d0466b1c036664d317817805a9a586c02664a9199aeab5fe19809beef46fa1af5030c1aeafe0892c3edb01,02a43eed3771c03ac21df1806073986bb6530980dd5f132ec46fd6dc944f1c3c6347168434e2cc2b3fdf6fb7758130c44f84da16a16413483d3b1903f57f54c901 +62d8b46da0d2aae6352dc9701a510e5fae8b22f2ba9faeffd566a8ad30b771545da2362f0a460a4fd5be0086ab81b18ff3a182f76282224ceaf6cf650d3a55d695232e90c40d5f6855dc230029915305ab9ffebd57216580bcc145e7e5a91db64dd0a1cbaa363c19ff22470fabf3181121f0cf3d19,199eb56c819b2dddb92efae0e734c385cd487ecc4b6dfece906375394a8566e8,37cb619f1a9dd37e82386d7f6515cb6cc187dec08b94c0accc5809ef05671b2d1679e74f018740bd98ead4170f1fb5e4bac965529c8adf7b95aa31aea3c79ca200,e66f851ef464a63fcc35264677b0b00d76e7ea98d57c30613256b86783930849742aa2d3ef98fc293ddc135ab13114eab4df02ad519ba495bbcf53f73fd541b501,1b1b1bc7af3fc2b17a9dcdbe998ad4feb087376a6d26813b1eb893aa646ef6b23861a4a7f7b7909a58863476a9b913f3d7df6eb12d5633fa4dcc1ddd5abb7a0c01,f7e252f6f5bc496c21ce7e54edb17c4d119639c623d801739a51969eb31a87ba36d457027906b2d6c67dcd607e0e64b55cd1c9ab0be40d6d41ee3b9ae78f958001,2d4985fceee2273df140569812168bcee4a01b0e2ca569d8f0a538b75976b6ef5a35aa863d3856edc3b2b6547aa4edd75505aa7315b295d5499f5de04f58a0ec00 +856698104c8b3d97ad09b09540c385cfb5656c1da79d096a10bbd56123a7227551e233e306e51254c7709035f15610c930445e6a6c54a800818df63c797d891332d091a4d8f2753981d94399c1a251b782b05e4b121c3f666af8fd0c47ff075a63c5d2fe10eae9c00e1e8e31b4629651c0d33a1b44,27db8e5871360c14f1a1230553d71b638eeadcdb98e18811b4cfb9191741f145,a2104481677d9ddbd2c5535708a17c3b274478c5322c75a2cdf1290d0506e7f21571dc798f7fa9f64e1a0f550d3d604da70333662e45945a3bd0431247ec070901,9d2978d55dc385644ab18a943205ff231fdb44e0ba2299773e814745da180548439abf29976008c18db054356384ce916eb42d9a14a16ccf059ce14eeb2b3dec00,d36c5bae4226f90892a61fddede0de777d8fa259fb6b02462d1943729c2cf91d78129b950a0adc88e9955eb10665d5acad2a7a5af732da7b9778d134438df3d200,b2adac8c191efac7fc93736ea02d3b6a29c79bbd1e61197d4052f889d92e6b8623aacbdde335c1ad40330c4ec2988698303969182fc4d05050be2a7c9d5af65e00,9be06bb3230b78dd6823e47c78b50c4c977eee8c769ed81bee0bd8ff2b59f25b59ce32d4ac8d482324f52ad879e45b3648288ff8883e117162a923221306645700 +d2ff71fe0ab57cf14fe561d672f605e820e7bd1bfaf9c8f84214167dbc18c250893a79fff7c7aef67e0f19c6bdf8a1266595860818e3cc9bde22c189344806314e8b2751eaac2b51244dffe48379c2f5807c6268ab59b8ed2a8f80f005466ec94e7889dddcaf6a78b1e6fdc8413e7344c82b399d31,90c5b51dcf764735f90342b45fc890f36e8051d8db76a57a2e68ee5b460a7520,335d828381769e4b9b0e0144e75adbf5586f48655ae1e9fdf130852e5fd8ebd0104de20523b4348aa9e69f9178a2fb64cbec1a5cf250ef495f8a61a81591b6ea01,8176c7621d22285a75b25082ff78834879a6ff5866467983316509c1786d91bd4f452fd9723503190f094ce1c6a7f2bcc05814cf173b87df5b731d3c616f59e600,4e7e8ad17adf23e58a8e0e84066c267855a05f53213b1e7a7f50524ed7803c3e59928d7d91f0e928cb1a05e8cefad44462c3d72aeb6798a2dbd3431d8b6c5c0301,68c30c7241feca51682a96b41a9562cce548c699858aee3080f518392968d131125cebf5734fe03c5cf7ace9f0dfdc84ec92479a9a46c18d61695a17651a379601,99fd12fe0b588a9e458412c46412f8e8e29b16c474dc92c79d6970ac8755d9b60ca87ad07e94a1306d0c2a1c6f593a7ef91b6dedd4a90ac0b809957d43a30e4a00 +f27f46bec0be9cd00ae10fe22b7ad947ffc3940c18ea46c15ee812b0702fc2aad08dc33afd7727f31311afc98477b6971db665c4c323a6e19ffaaa838015ced7b92c218b1cac8ae694184a898bceaad2000186e27cf60a745a5081b639a31530cfbdecbbdf9fb4edbd67a7b9af41086f6fed89ec12,e86c84cf86f5c6ff08b4df335ec7573caec0c446859668790d83fd5f209522da,7d728e5b33d222ad453f9993e468aa7051b70e7b00bb0132abd2d4018404f23c0644d38d7574e265ee510f08401222cd44be3b394cc496343675514ea34b89fa00,744f13f6158366bc4627b219da6531f59d60a990691c5c26057c2b9251eefa3d19963ab24915460e576279a112561a2b2fa404dab8aca848f21350c842dc4df100,09994de802baf7f992f034f7953ebd724d8e55791ba2b28db73d87949f35855778be8bf95be235d0d2f7b1d11e998b45b0392664f9939c69679ccab5e3bda9c201,f0eced07509abc1ce8dd410ca55a3364724caae9a0b3f6c92cd44d2d0c46dff848ab52304eccb6fdc359ad80c23da0f5769d34c0fbbe53040e68b5abcd1d2bf901,ed271aa91d0b5a4b8be5f88babd12ede5226ae76a1552e0bea5c754b241b9620015a7b6b2721e4e0620923c30c091594be9727de999126d5bfb9b430dd0b1f2f00 +83bd2098b58b38fd72b3803c05117b11d111a3fbb5f10d3b2afa470a4f9f1f5d39cae439ce69306ed104b43f65dc550f1a75d2edf4357b13bdc4f8c2f5ad075e137d7963f17460a3ec66ce8abaea4c4c0fc5d690ade879f27abb46f3461cedb01e712ad221dd4a1032ac4e14a555e941913453a234,c1ea2fc5c022e10b19f4ff4fdaa954da530cb35590c4de42f394ccd8b8d93fc1,7186fd2e73f596ce04b18b4945f2e51bd70c498ad9dad277bb10c050493a810c5eab8750a03eab5a37ac9b10440ce7ac22171bcb4d42238cb3d74c14b9ad7c6901,b3f897d0f50cedc9f260114f0e6a8161c9696ada17fbd1dc81e1a3f45a654f404279a3328beb476c80700dee0d4c47eae1baae9a52f0565cd3409f873f1f757c01,17a211e6a1ee39e8ab4aa35528cfe9c800876a0428536fdad4ca54f88c672b6e7b608903d0aced7be115eac0d803d7a7f14293dde74f5715d1c6b62673d4152300,c213c85bf1e1d478e85025fdeed753475370ad6704d62d56295430e30a65ecc3723beeb311c4d49ac4f8609a3c2008fb1a6dbb8e02f49f399421d8f27a120f0500,ab48e5317087488fe77f89e951c5a485a3b45c319d233c7377d5145aede8acd955855e4ac5e51a9b83a410f16478a3b731bef3f5c7330f6f0411f8606a2db38600 +41d2d8099715e75ba8a59efbfd99a7d9bafa9441b7360e79f278163d3d232799fca32a659c276ac4cda946c521cf9bfb18a63b283a396f16bcce18cdeb595e6deb327c454ece2a6cf0f2d0277facbcbf7c7ddc699fef286b40cf49683e5058f13cafb02bb570b21a7df671a3d16c9e395e60d3fd1140,aebc96f2a15819b28928ab5554a4a0ff651c8b245521d3f5651e3e3a702d3f15,b119c44114e1df5dbae610ccd8a7a5e24812b3f0074f1b39bff91ec54d934efe301a6318560c72c7185d10744dde1de1e375acf5ac007bd6d06eacb47a7678b700,f93ab0855d9d4fb47801e7da6da6f289b3e785377cb0544c4c30330eff4aabf64dffc9f70d5e9975e64e71e2277c81087855e77f3c2e7de9dcf330d3a9a54e4001,9cf419ba1d164519a2eba58054f0abaff8aedd903c83c57aa4640488cffa1c84194c28c1d63e8dd8c4afe24066db746050ab22fc84952ce463f382ee6a79a40701,c4ae9f9e5723b20d75b24c867948c9937031072cd858e19227b064c8b05f35490daa9b55f94dc66e5ba7186fd76afe2c0d86d68d53b03e1640703b3e5bc68e3001,5e18b1109d52355b25fd265cb8c8134ce2c4da7d54b7aa71c974e00e0a0aa3ca7d06db41c87ca68b81431a641f498b01a974a44d08f11302c8e55986432ce01101 +d8c4b461b544516d224d2336976afff86e2151c18ca738b289fdb6a7ce26eb9c275c8890deb3e3028d041528d8884fd650f51de64bf51e698b85f1131c5c18ce62f712e2b21af31673553f68a67291990c6bfff76d969b14f850c63b62e10052b0fccdaefcf696f64eb1216380e4ddc132b27ff4cb7d,836a9d930c655a9272b03cbc46bf87526d626b1491a087d14d1ef7d62b816ccb,09d103f98943d4d088fe19c60c4c6e23fca58df0d403ff920559279bf695d4aa2ee35c437877a0b155431c9fdfe4b923150388c1a4683cda2f4a4afd40935d7a01,ca78b8b432d850e1b50d693ce112023bb67a36f0519b61ed560b14d0f537da145c656cbdce708427b2c2a8dc13cae2c3b2545b553e5f6039d9ba96fca734d95701,807809da8402a6b5438490c5ce2f45bd7e7c96539c163c236257e927eef247271d155d9ed8c20ed065a7d3b2afbe0d1c344b15c236a942473856474f582417f601,061b08451446d4de2d8e36f70845bc6cec8005e83e244b7b8cc911e702d951fb5c9d32e3aec9840930783461fc452016cbc1409c6f8b92a724c88c538d06039d00,26ad54d47a4c9c0f84c1e0f13ee00c6cdeca69f72686859200d3479a22a0a9fb6537d905d2e671bbd15db553ddfe8c2602d99d8b0c14d22b62764c9e961dab1201 +7224f3445f93cc55ed13d0b1771eeff1db2ce2d908058c8fbcc8e3f1578de48d92f63353c62721f6d1be5627f044f490f427903108ef5af614f0442684af842e6a06c60c3b4fcceedf28d0c14cafa71849cdb93df1b68987578aa81d9c314f4f859ed3260087285cfdbc494d622befa19c1c814e86eb,c729e02b8370f1847c82039ab260d59b3bb20b5600674e7537bd282f981f6899,f9fa4194adb1fa08fd2180472df6de466421525f53814299fc36941165c1b7977a6ff4020d8671e41bda032536cb083321f841df7abb5352c08a42f6245cee1e00,5564649384d9b9e49095455a21340ffa54a8f75cf534c9f621bf45c66e1ecab43d191d1558046eebd337ea03999a8995befabccd7f42829f752ca29acdd8a25000,752e7d3ff7a75337498b8c86af14c2b77d9e2c27658610460112356e3e96a61843d56b864e2faf1e84c22f8596c8db937c1939f5b756e6e5346064efa1c12f1801,a62ac6d78213b43a0adf1e9bc8a6830ab5860ee086341b324d327bf716930d9c27eddb8e29c979d0d7a134616a1d5212db7656b9767c3ce1ead5e2bdc42238ff01,c84a470cd8a8c5589fff8b944b27d624f36e58f54fda22b9a55fad7a1d644e412bec1e0042064ffe368b1ca22617fd70161d92def12ebc86d1ecc4518eef6cf101 +d146f27feed7555a380265e966a9b226b7e23bdd58d98c813570d6216456dca467ed6a42e50865426a21adf6060d19dcb1c5140080897a896ccb8c271f92a0977b922704f259a0a1d48619a5784e28f72da25c2bc52ba4cc109de76e007a6ade82374ef95c198af0cf9964efb38d8be14ac8a5811b5a,c23969e0cb554970dfbec42b67fd0b3d16ac8bdce34d3efd6fad488a0fdf1462,5b578b012ef699c7142c684e86d45a8995d5ee606460e8525a1a72d0a1281a52050ed32303f903e0d31afd1ae2012981c7481dbc280410748f5ee33919c6f17401,c8a1aee9e09bc4ababcbceb03f7d2004885e336e7552a4bcc17eec9e115c691914865d4be0b6b937a7e0738bc54720b71f400e4098a77bd7027767506ed8e0cb00,29d750ef3fa8117f5216d6bcae0c9dd69b51fcffd5543cc99ec9a9d69db2214953f45ca2fbe6016d3ed5f8304a42ba6c161a501c10d347cca0b224a0e06993fc01,08339e5b44e6779e405a3bdba2cd35845d9e7cecc75d221b0950dca414fc4fe12d0bb284731a6deccd1c7732d9e228ce45af25932635593966e34443fb887f3601,f910085e172a82b88cad1240d973d8a298f37952d7a4d691d43f497b96f016db7abddc0fb8836c5dc6eddda57da3a52b017f5f728562c27669fe952ff88a691200 +149284ab05146c3ea2c7e29d598224be593d033cbbf58132528e6fa77039fdfcc96087ee6a1aec4cdbc8b53348693afce365636209488cf53c1cb65a6a05b3ce4675f55a129ab6a535e32e9e19484147b3470c1549d836f712a02c703a78a1b768b5ad8553f04ca76f3ef0d3e182afbccdb7c94a34ff,c5eb6924c195a163ae7ae6aba82e95ea6d57bf5c6cdf0c77662501bbeaa458c3,4a4d2c97cbe1584cdc5cd9e9429490ca22095d0bd091463a51f733245212315d6f34ee12c494718bd8c951546a369601b5322e8ecfd105a16f6107fb8f96fe3d00,d0c12a7abd6f14107a46066fdabbcf14578995b0cfef560e9d9f64da6787470264dd93e070ab606b34fc18cacfc3ac32b34e2e6a65a2418933f53d373175b9c901,e11acf94823061755cabe18944dd2bfd0b3ca7b32ff93cf52589651312a8faac0691ebfbc1b995c4531f9ece0ab88ee788aacce29cfb74213fd16d0b5cd42e0c00,aea980d87b81a09aa61530790a05b5b9c744b698e0e966cf686232f14889907e22384d90cc79d5d06e4b57933ac959ae72f02706a3d91cb6a45f0d72c70372d201,901485baa3ccf2b23399f2932afca2eb16cc006337300f7419dcab4a8e3a33fb6bdaca1a6fe18f410f6123a9da7acb25fea2c860733a2286453d1808299c2e5b00 +efe51442ca8b0876adbad8e7603abc0c193378aa702a0c5fde08e68f0b997efc05d8db9e0759cd21d86d9ddbe90faf36c2662c745719d8a2cff74c65f65f3f6a19e84f88b64150a637c018fd6117002ae6edf2a695c6825d2af81eb4b56f6e19361338fac65e72172dd6d6a463feb37c72de979701a5,f6d34dd3a6c6a9c70896019dc0aff3110484bd80bb3cac8f29bed9c870a3dc34,bc109a6c26d83ca488aaded6224231d76005ba146525196bc330e926709ebe1b14a59b169a6a98a1758df0692322294d83e5804e2d2bc9a15822bd8b92ddae6200,32e4cc8330c51de4fca0e669faaffc4e95819d1330e87c92612f96eea55fb29562b6ccd52f2dccb0cf9895aa53f89a1a10da81435189dc4132921133c0adfa1401,a424661c46915f41eaee7a0c466bbb012da577629b00cc7fddec6928ab246c691885a86e8cf6af9080eaf3d7cf7501d0339b67274ba0010516549bbc1377e1f800,ca9f30403c7b14f15ede6bd649db47994d29b10c9b7194c003b95314ad038f3b0689e53c4b1cc84d04ba90c1e3133bf2c260cc20d3af22d4612a64b7920f68e701,b67be9778b5543e165216ad347f8d34352a6d50484e485a0708428a74664fc6d27c2563534e62cf79a444858283e5a1ccb6b0f4ef2fc06affbf5ffd33427c8b701 +d207b471a18e9613dbc3889e7b96d306c34123c6e0c1ce4b50a5895aab28d47a80d15e7cdb0bfd3bf00373b083dadd8dfbb3487f5e7df669b65851ed212e70227c5110b2a6ffa1bdab4d9cdbac61082182604450f7ddcf2a01400d5ebc8682e20249889e6bedcfb232f1a21e4afedd0a34355febffd3,a5e3f8003990e2ee3b9314636b38dd04de49a9ff5f85d3b817f6e939b461152a,8a7e5857ae5ac8f120a511928c5288486a9fed68f6b4c04f36a93d696e679c1e1c5277b6ea7a18969dd6035e048255d60b10faf46f5737011bd8a2ff2573a04400,7bed45dbf25bd439e3d54355f3b0fdee22d3bccb6eefc79707f628c338093eb723e224a7acd0423d76a4253eb4902b2dde03b78e1ac6992e99414e9c48c44afd01,aa3b976a010c1713d9a7c1edc55a66d13e37f2294a00587ca0c4ef7f61bf277c28a804056b0a80752900a36447233626d6da6ab6631d369cf5a0fc5f9355e82c00,03b6ca298e352a963507879f1c8a21c93913877e7b9cdc9531f0f6957954c49a55ec643f5d15767f455d6740598ef9b04905b706e09620134027ad6c20c5cd1f00,aea77744df06708e5916635d8c9fe905883996da3fc36371434322bca3d5045240ab12512cc0b29747112dc8f1a1e4d4a1bf3bfbe9f2584560a8fb9b06952ad900 +2c83978dfa2288b8b99c878ede17946bc19f05245f0026703ba90f6cac725eaa950b1bfe519f17db5e03232bc2b3e693efa46a3a367a8125bc382d14bf483050a3d99cd9c5be1dd08fdc9d9d550c6f932b97a9d0fec6c73fb9f6f6da4f2bf39d9a9d081021a8481c95e31dce446e0ef87e37d26d360a,8b764979c3837cd80ba0222bb813a6bc6740c87c1401bbca89defda6392096b6,ae23f83aabc16de2f5f00cbd2bc28bb1b310a7acf6740cb3fade7527e274205c12fd5c1969f3a9ea63f9038c9d4403810f1096cb902d8a4a4cb3d2120330d81500,c29ab87129cbfd4e635178dc4df71aba34d9f42a3938e64cd7c43a3ec46a2f1e45d95342c7ff375d56d3cc63ae09154a77db093fa3dab4d6efe71c39b4b608ee01,946195858b1c0c75e9f6e92888a3f44433bd1b587a31485721a57009a05e028452ef0faa5e48984c1cf8e4b46ef2d60a857e037f3af8a7653728ed43f611a42901,513d7f6cacf427f5b2047fec2b6b91706b3dac7f6350befc5133a908e63b01eb42bacfb3cd96d884c2e0fb5d179ed9bdd634d24292bc2ad718051d01c7349ed901,6f36895aa4c50d7aafcba45944ea07ffc8828b1e0efcda08526d1e2c0343878e7e40d57b54fbfaff005674fbf6f9e97ee33cdf5c049951dae4286075cc3bcf6600 +3513e4354b365e57fa603f5401645a34e9257355f98a7d33b7685b3047cae277f7d5903df61c0e60a4bde07771cb1e7210338801806373fb05628696f8507fa3b44fe660616be44cb75f00f8ef4eacd5bd62f319f7e291f770a072173e7a9907558e48c91a11487c1840c26569a12f8b8272f68de332,84a02d0c3c6f53ea95a7b7662a1225600547c5a0bf90de7a4cf84d2c242c3ded,f47ca8c6465a3618cab7249ace2f13f79edf3af4a6a336496318daa4e3dd8b904dab43dec6377868af246653b4cbc85236c65429068bce73c5353ba535239d9700,6a1a7a0b035ed6b5cc209c3816f3b0892281762bd10c2d7ee83de95a75a64cdf20048904ef2ce4dfd130838bc45c716aba83d5592f65445c095329748fd6745900,f02a13d09daad06aec88149257ec9cd0756fda82e1014a0fb03b775818694282554935911c7e2525d509d8abd38d23184bca27f357aef1c9debff3cc581cce4701,1290070fe2ea90d9af512212b5c20699126f5d9eb3b5e4d3ee21aae09c21b9fd4b1b1cffd0c18383323a2a71183f5e2d9fbb344ac804b3548c315b9433711f8a00,9f4505efedd5389d1f86865b49b265bcbea8ab7672d74d8b79105db0bbd069a71de4cddb2a777897b7a679cfb82afe827f0a972c59c1821e8314bccadbb1c9a101 +1e6b4f16cd59338a88ba504efce171fdb424e07bd72b6221c5911469b7d9f7687107d1b5fd19384c068e3fc981f3a1f11428c9ba57274a2057db14bd3cf18d8822501deb06f7c60959dcb61fa418a0011638b3fb7a6a0718332d83d21d015a0cfcf5943ad799d5a49e902bf866d16a6579b95a7496a7,a9882e262449d36c0a20f38e7e65cf731db3193926d8cfb55ac31ea40481e875,6718f3f0fe6f6ce055e00f2a86e6bd3f056f202f82eed14efe3c490f4f409456053df08c5f1851d1a32cb7b1e6270fff09dae89528e3c9d2615379e754e29d7f00,ac542395a322d3903f251413eee5a358e57d1bd30d2b020db0ddad2824bb635a22a9847edf84ea0c36be4f8d89c04fb954751edaad04bffa4356e786fed8955700,61e656a5661efc85a2c78b7350f688673cd163e208334e3293cc6f555928afc94274a1002a4d0862d4afdc8a76fb7f378d0d058d2d0fdd181eee0ad5c70a88db00,747014e0a0eb75f0665ca893dc43c52c83d542bf5d44423f8195610df26db3a663f973443b551a9e5e0092346f150716ff5578865b46788ce3ea8604e5c0ccc901,66f5f5ad735e99f63d54cfe0552c59d4ac714cf38858661ae3f22047456116ee1a2cc6e435118fae9b3ff1b0512e0c97086eb6f26036bede346e56f05abf603800 +4c131377232d3263d92226ea0055f4b9a46fd77b3ea8549a38ef62a97c67faf599a6265e58ad4f7f2469385bdb73957bf700b6a76a7a979398ff184ea51e9385f715be3a372a70b0bd67f0dd344ba9e09b203f2ca4b85f586abcd4d22c566a0b3702d6aee5d0050d250c4b2faf34793981e988d905f2e3,91003d7a166d9f3eb3d28936fc9b9db2ed18aa70cd2b830a6ebd32494d68316b,e3ae0bf31c1762998d5ed19269b0bd56559e29dbc4c6949a5ea4610961779eb849e6f8d689e5fb670133ecd50fd92c5e774436316e07a0df99672a53342b719301,f1f21b230a294d370db8b68cb88e653020ad3fcb9afa79c5bcca603bb724197077aa1374d69335ce1d3ad33052f9e9c41b121ed4791e09ad205103aa329dd57f01,3bf7762bbbf97fca9f77c0e42a8065ffb927ef862f0ce02251a509b2e02ec859549e6000728c1c6cce03a6aaa847c5eb7bdb268d1955c4956d5539393108ca4100,ed67cbac65ea19c19d7e4509388f53c546794521e631b73de976fafd0588fccc36fa69a22cd021c60a40ea4e3c786aec315f6b05321384e4d121d6e7fc059ad801,6f84bb6acf3d5a7aa4e928cf5974c3712161a07a87b4540323f0ed2ab49e6fb76de96052457dabe457747d97ef1ab9cd8319105f27658ecdf5b193e20736fda900 +ff231c91a96efd20d29857b2f261ec24006d3388b4f11500be5ab68124050bf002e0e784f28224bab9d302f70bf7d3d8a68b28f547c3b2f63e62b76b3ca5685cab8f4ef74636b8c07ea6d3c681bbae2e6df98694949881f9607e54c527c7d0733ba8d26021a40f5dce330611056f30228f01f3177c4de0,5004061014fb8ae3b26f593ff33944b5d93866ef096dd4b3f9f7af064bdcb362,07e902ee7b24fc0076ed9e319dd1f24318a4c59719d43ec50643f1500916a77c285b031dae9d43faeaa8d4a1f1228d683dcdc2cc97c766bc9f24b4a37fa3171800,2044dc1acdd1e88f6d2d8f1569b646cb33c0af6a47c5b90c5745db88f0d5be747cdda39d25e70daa9e26d40af297c3697cc31e0179c9e758fc535c0d07f9e87001,50da95fc6791e5638a5809f589124945686dbde98d1ac19a029e7c9a1344cf763f057ad7e332473de188889599afd94d9b40342094e772a32b40add7fe48761f00,c2967956acef5918016da09666878c1a133b5835eadf292aa852ea114447e7d305c0ecad1eca02b9a3fe16c00694c506771ca2710e186bc1739e3853a74a2b4300,edf10da46b8b072473a8bda320ae4305785ffd9b7c3ef24c3300429ab3bda79256e5d3ad55bfffeb568b60f4329d20f2c0257d97b04f89b3c3399633f572482d01 +cb6e152eaaf0d2ac45010d463fd1f31bc124c8d007728a36adca459440fddc23bc9a5b4987fc2501f44534e4064a494db290869f717051bc347e06dda8683f0b45c180a76ed5ca10eb5146f54a0c7c85f93ac1846ec37d222ac9e09b00a813685ad2a1a5fffa10f1e115c95ec8b85c017f4a48f8e82f3e,99a208942a42f2432201678866668068cf5ef6c940cc26b8763b323ac030f4f8,93249742444cbc90689317e487fb5d160b909294853885c1bb045928d2be4a4138b68d27e5b01720b235fbb41a113a7e9f2d515fcb72853c5658656033d5599b01,965ea0ac6fcc591d02f266239afec71d0f0ff1a47a4cc264ab05d1b2e1ef32d243c250af46a371bb69e9db03f8a2fb3631f4a52dfc30cec72a00e9d4f708298700,34685a0387b44dd0488cb242e7ae7029e11b0d41fe9927c8d17bc1656aa6a68b0ac9a3d471339d8c9af7b606b9b19a8325ebfe1c0a2e648b41ef9117cc1806f800,4a183faa575e944d4db846c7635460dae8f6ceebac0aff0ec32601bb8ff915fc09152d57b93754a892daa9ab7354e60169eec8297f7b41824790d3ac2d2748c500,549d72cf7e8ad262796b238bb72cb385c6098846d1205152c31147ac70b76db92111d1fd491bfbfe7fce59b74a4c0ec33a2c7b1b917737f1aeff64fe6cd85cdd00 +4391a0166b331196746b1b8859b6ac15e8abc4fc30d67cde400865ad9bbedb465d0729f2a03f82136b98407d045822f8c0d3d912b87b49abe3c760ab2c7260d866d656e60b01b15e90ed378c55ae449cf37fee15ae7e49a9fcef187c83dd06812d5eeeecaa70fa910230ac70e7022a75ba5d5a8e0822b3,e1f4e275bc34901ae706762f6fb388b1e63907b84ed079b59c300d91abcd58e2,9e454dd842da5d7636d67ac6271d7857af6765b0117a95cf3f22bca4265b4af02e2cc41dfdbdebb1934986d0e0c0331c66c557e3697077428dee07221517525a01,b01c5d1de2cd886bbd2f0036a5aa75d786bc01fd80f0af8c2b4b884a2b81faff2a6552cebbf6cb91eb3600ab1b2569f00c4da8979651c08a38b65b670f4ac4c601,645863a56407b7d03dccc7a7b41bfafaf755b701299a3785685e8f2436d0cf815868207f6b7cdae63e0da22464f22e161e799fa08c29ecf28df549473bbe97ff00,73dcfa48bde220e55981326fee44f22d7f8d8d54826da1b23b15408ff1e8089a2845e46852925e320f23bb4aadbf9ea9d89f9f1c656ca48fddba5906edd8b77f01,209cba0e1eaaf684fc2f6015568c341c402c9c6676a42af4ca6652e70f0d1bb878ad218d06cf533829f52c08ab5297478a7c06b925dae849a9ce9c2aa937211601 +7d0767c23728f35131371c531b26a679ce6670254e1d1739095bef9e6d8cb355ed013afbdb513112a6547f7d4dc5e9da979042c5c6a704c830296575430e16c49272bc5ab4b6845ee3f59d91edfa69f2e7875855bb5a605de86f5ad91143085941f85b7cd0ed71598c4ceba4931026c89c0479d1ce827d,42864bd0a9480b603adb4054306aa0389284490df93d73fd95fe1f46bcfdaca8,ff1e8418fb1bd1633bfce77e584cefc3bf466301f3a9c0e83a59da26e33a0a76092cda3e2babd77424ba9d9bb7298baf31c4f040d69e3863a31504f16dd3695e00,d3ee7fa12f750d1a9c8e3e2e9278f3107309eb48a07446efc658d1c9861a510054a3f81a367f46917c06bef10ce9a640ddac4beca1ef69348ee88aca67ee741200,a40950c90542975c57bb0bdd826fc47b80e678927e31470243f7ee72343660932602acffd74c64af42755eaaa73e7ebe92e72d7f4afd92b2372c0985a074a7b800,1a00153116ba1d65305c85bd0e132f2afe6a5f647aba52405621e2e35b7dee0b26cdab4430bbb9601dc4573105a3e7d2ef160597ab5799b49830082e79cfb8ee00,927c60d3af18d502564bc62cf9da7ce8a24f2b10d2023e6857ccec96998f2e6b0d46bf02c7bd7dd9647d9eec9b8cc96d2522b5367844c6e4dc8fb07562d5a39200 +7422968f0115a8450ff619a1138bf20efdc1e8b2353f1d72f40957f0968037235c0b4ab7b2487381caa3b08f390fe0fb660c4a83aa2f38c87eb329938263cf1d885c354668013a7513833335d0f3bc6e02ecafedf18508ffd736d8dcc477ab02459bc64f7c8fc4210d51aad9567f071c4f02dfc3fa05fb,040f3a5e939ad5f03e5f642502df5ff4652c714b2e02cf6773c97d5016dbc6d4,10c733e8878ec4644e373bf28462d9db8c71e25b508cb217faf3c6fb8fc048bb194a9e9941d6c5d908fad13a8bb47294fcbd88aeef4f0d965c7e40c3c509305000,5bf45949aa39e9e34754949c4c061d5e792e7b758ef1a0b8fa4ca01b624af0a435dbada787e80344edf1ff2af577abb57b06f01e573b7bd6fb42fc8c4f8918dc01,c38687f9db2306c8225010bce8850f4bf381c39efd496353cd528efb880ae9786cbdd5734f2c3a0130e611faed5baecfbf738daa8d4be57bc6438cd75b55a99300,a1ba53f316082dd03d2f410c405238ff2d51b5679cac25b3e0de156131691fcf71918b374f8f57e8f3a5fd673fcccdf54b1a45a29399da8e854987dad53ae1da01,afe8f2e6db24e667704b2003f69251cebe6b14db50ded0339a0ea506d7ac0e4670b08bcce225e84961817af3229885b7eb4b4c929400897c3b22f2415e7aaaab01 +10f4b4abe7097e27c8294af1a996e51285ef4eed3d9e8f85a68cbb02736ffa059f883ec49be7d65167063b850a26aad273bf04b6d12d04c4c1ead51d79cfb7dacd208dc551dd0ef4a1717fea19f09bd5f5174319c6d3dd6c335e0038ebb61eb72c818d9300b4a7816c3ce8e4513c7ce309b5be113673e0,58d8cfbb4645c0921a0e3940e9049143e6ea2fb129d712b0936ec3aaf0692039,c7937c44a230292332dba96299eeb49a5679f0c11a8dca5aa626479803ea99a656640914582d322b0ab8c7467defade6cf593a540a39705d308f705e7302e5ad01,d394b10a51646504a11c4b0ba78819756ac9e20bfaadbd918346ba486068285018e945e50945037cafb31f0c9f3cc828c075e0bf9c07824e1e7883a35463869f01,9efd0f46ac5ead809925082795b737f7d8365b0adc20bc1439e1f50cf57faaa7124c63d7905dba6be8a5f5160321aab74052a980a8aa5a8aab1805f44ca261fd00,f00acc485263aefcddcace2302efaf42ba9ab46254fb763ab8ac5e1ee8e0ac5e32fda951f345e2d8eb60e6c74769b6ace53aaf078392a7bd79950e020e36e8fb00,3b8901c314fe4e47d7fbd68a856649df6916abfa668ce0d603fbfbc43c4e9e573b969ea5b8040f410068222976e951320542a8ba594a61f41034442736627e3000 +39d5b2e909258f2620f91d61a060da9f616fd2da267211181b5e6d5df8dec28ee249b95d22f9a8e01e3995593070097940a2a1c51e52742e776d01f288bd244755da88303abb1ec3630bddf8487c765358bf56a10e04572f15170c0d7a921730bbfa50dc25c4ff407ef35013ac8a63c1c3b9f67f1412b6,e5dd08a176eebf3404836bb6420b93d74c656214cc02d98e2d129c72cb135e8b,3915ccd5bb8095e27c2334372046d81996e083bb98ee8a4942263d1fa5109fd944f63bf775fbf6355b10deb77dbcddcb76bd5fb36861e7b0c4e5dbf3175a650c00,4691ba59842da9a68517ab4127626618d487f3cd545db48cfbc22410677ef36c5b36c544ea9f19051c6627d620dc2ba6668dc0da45817b88e948f7997d9dcd8801,acebf9198a3087edb2e411c3eaffdf9a8d29be92aa551aa893304356b8683a5c4459debbce32780756aeee18ce65788b5d81aa59b666a426d4ce10a1371c0d9b01,d01996a6a956f5909654757bdc86ff2bd883a58862eb89262bd27d345cf801517d2ae234bcba2f859a5346c8358e76bb9393fb0a6b131c663b27d6f5398b532501,80d5e40bf02303ca51014e84490afa2f4ca9144d3707d8ea0117e883c40eb217345e29b835ca73fedc3e335bbdcaae1339fe04e65cb5506eff4c51cbd461c60e01 +5aa1650203b9178c7929b124e53464e258526f3ae822c9f1d5647150b3e3dea28bd55860f29dec03f7ff74ae6e84a316c399372affcf0ac470097bbda16431679e108c3b060653e1ca1f117030c00c308940b4058b37578d4459e8a1135d016ba5c59b7cfe24e50fe11bf1c8e6b8d6a81c7b277bdfca59,be4c3c86191eae52f0b3c6b5cdff3315ed11a5195febaf45ae027a0c5d550f0f,9c4f8ab5363239f99a8d833a62c1b976e2ee838b77747acf24040fcfa947ebbb103e5c902a47d41e9ec157ca63f0a9ce7f45379947781ee96c1e5290832fcc2c01,6343b463926b4e63da2282ccd57e98213d502c9323476e54d516389956f9c46b2c67509c21bc15143fce76d3d89fb3578a98eec3f2aebea20625e6a5d3aaef7e01,1e1fe8e5009aa9da151841ce138316e0fbc3f61f5cbe6cd6990ed0d00a0245dc6685779256824febc8206366b66e3e411c0db73ffc751ff278dbf39618e2efe501,8117997264309592331d21bdc3c2ce8bcc8ef1bc1389923cd008ab95147cc0e37b7f6d4caa7af7bd053077180877f59411b2939e6e72477b496b408709ffa83f00,6bd3833397e0e196a684ac2e50143408042b760ebd58e256af6f9489196c122e689317d7f14dbceee7acdd7d58eceae0026139ad5944d021e3aee10dcb34227c00 +f1275a59cc6e8f498714d07b645d3538f5bc8e0d3964cdb74dd032d2f8aaa50693ae66d1de0a98ab7c7b4cba63e3846d19de1fec6c95b47b69212d89b79efda1c59f85d391b060aea1dad26a6802e0c03b0cfc3213ffe5da1066f7dbc9267e41cbddba66ab688636da50a35b31493afd7603df9c5f6e1d,dded6619fbd6f408fe36ef78c18d4216c8e0605521f6d90254c3b3291cc16871,0914510f98853938000943a8518ca2035cbaf57fd78bf4a2608f4af08a8c26fc681951f2e49d6d932593e4939bc337554003058c49361ecb3cc7dbea33f6588e01,2cd7a25b78c0cde3b2f483e6d222af7f1dd522e776875d7b2c204ecf0961a1cd3bbb170a4b899106bd6b4e169fce81e7381b84c0cc311eea84257e43300c2fb401,ee4e72914d7065daf0c9b3ba95428ffd6ff156d024845404a301ec402a5e25692a200d8aafaa5bfad523203d4c2709d48cab33a5cb7a5d6b3a0b01119189b5d300,fe353cb7025e6979c054df3b94eefca35d605cf9fee3077e92aa5278d3833bf31bc8fd5be680a2e7f87295a26c83d8961699d3f4fe0a2492c168ad546e66a33f00,d16be686b8ffeb00701a840ef6c6d8ebaa8df6925d0d5dcd9408bdc2941f8eb00eee970705c8cf4fc430119a777205a694351aa1e053d6dba1a6495f93f77fa101 +9415e02785c39d964cfee8d3bf139d8db7ac61719ab31b47e306eaef798a4eb15a2cfc91ba49ded813056428800257e17a0682fd8af0bd038f63e3a79c983ce53f43e494735668edd8c4459dcc558a0f836b8f8e261f486061093dd46dc727f5f95747b961ebb1d97deab1e33e2a605b583a37c38bfb2270,77351c3156a1522ec81414a97426d1fb2cea8bfd431d8140ae017d81d8204c8f,4ec9d3d744e018c9295eab6c3655e7fbd81306ab22624fae720f1900c65daadf66c9ab3694dd928f502f9645357714430a5272ca153623549f79f2f8bac0e99d00,2e46692591ac30b7ba43abc07863e88bfb1972a5486904f83cf68b42da2994ad63f27117f7f26551dd49d6b6621023607c2aa343a0bcf953dfa7878273c9e0a801,29e48412610aa5a8497a1c8b6c42fa883f5420dd65edac55fb52407b6ce32a727ca1a96907031800bde6fdd53318f568296ccdb22a166d7fe2e3e8eb38c3a9fd00,f411f44ce0d222c5d689ef2e937a1a08fffefe3aa9f31a976964bb8de249310c233283a8f6fe35bb31800cf8c800cc3b9d08589f8c3678ad5b302fb5d8e4247301,8dca4843efd128e2c9f4c15b72fc81bded37b06602442ace6ed4ab635442deee284332cd089eb0a222b94264f60c6c2a374ff115aeaa38f707052ebe7f6723c000 +923dfa81a0273aba9a7837fb3715f483c3238fec844d1780299e216ff741fcccbc2b658eae9357d0db3f381a7c04f9957fc1d330e2707f8547e2e8b4697953a4eef275b4e90d7768613cfe19ccea5ce151c60910af5cf3fa400e73175e630403ff9dd6fb46aa417aaaf68f104d7a7d66c948a45bac69bbdf,e347017881b981221fe1788233fc0b0e0a2de95b64e609a80e687c99fe55a446,cf77d7db4c83559110e4843ca04a2096fbd0b304d52f89ce7a6c01e25960442d7592c3e52d0de0dfe470166c2080a88ee8014d076798082135379334d744ba1900,33ff9fa6c281ddf6667c57b367e98e7fde556c8c952a8ed3cfd47bd4126c4c2c5248d1b68971ddc50390c0c85ddd1cc49ef09cbccbb54eb2e32076d55018412a00,efe738456db4331453637f7191d86d62006d9575b1d2ac0558198880fdaa61572eeba26ab2d5d8316b22a42a7fca4d0c39b454a82d307d806996a66754abc37f00,b42cf09214294eaebd5f54f44e5fae7322e16954eae5355b80f02fb585fb51af160744dc969e539d01e78794b396b6b7b2942d06459d41183e3eecf9621bfed601,ec4ebbddcdd6713d0e57893a1b1c0e9327cfbeed20937d5ddfef67ae291c6890745e6b57aff69d67b4e28b93993c7c9d62c6f302c98b152fa66f7288b55e7f6701 +3e9e708f09b4130520a32123a5f67e13296cd151feb793f3a3ea1c361c0a579ea2095bfc81fe1d3b51129891778e2b4d355dd771f0f3a692b53dea7cb0c6f937b83f28ab7cf5d2a25944b349a72e0df2f7ee8082925c61db607f4acf328c677e7fc5928f77a7bc5e11eb0aa3e39107af97c005d6369b52a9,1fed915ec21706b3cb9983d0e6d9c04f7cfadbdbc6b8b6f8417bf07b4a95d52a,c17f281bfca61f372fc14cac4b8d9492b55300e39f51c44524f36d34472cc8aa4686518813e4dac1cf492ed4c019771837f99ffd26dfe94dba435d1cf012d6e000,8ca4b7627cb3aae7de985120d2283924df5facc505b336b84eee1bf4569d4b3318f98232508ff439d30428af887ce8daf6e5a7d6bccec876b69097b107e3952801,99157ac47f4c7c3c371b29638f55f5c181170d2521e01a7474d09aeff59e74340f66cbf9dd00a7763e8e1c235d1795c962a88c61bf777132f72cc68cb4753d2a01,9566bbf6f302a53c15d024cb02db9db8189ef429b4f39fa0fb1ef6f58a53f8201bf8ecc40369c189d1fae03895dac229196e880fc63da971d4aca81bc7b1145200,857e230c3629f72d82d844efafd93a666a0979eaccf742b003fcec8c4f35aae86955d73feecdebd9c4881eaa6cb8cd33518c6a95603687fcc29bfdef0afafab001 +c424897c94481d22bd619a450f29a7052ffaa341db6e510ef038078dec640459c06f50996a3a0df3b5b05c3928828befc3431fd8a49758d147061c1287dac35fcbac7be406beaa42a4af883561b8c5dfc75e1bee028240060ba09e8fefd6b01ac03b255e1500a79c41ff73cbe2715eebe8c23682ee22cf07,ec0204cef1b299a4be369e7c677277b106fc7c2a18737aacb8bb9fee6c801342,f40697370d916c5d1c55f257e40ba9e29a81730ce9b98ff00b19ce7eacb363353761642f8afc6d53a6237689869cc4a7f67453d5e88ae28915586862f7d90b6f01,b2d6560d9819c8724eb76b18a098be7b0370fd3716b5b1636d85c989927291e30cb53d71a0292c92fc7cfc1b52b9d06a9959199ef96446e0e2e58eda24a94b6e01,f8f4121a9471def5afbb7bc220d43b37725f4f4a5c1dec009b8a885e748a1f136fc7ce6b552497bf329d790130a703825011d68027ea95959cd08e86bb916e0d01,9ffe2dae7981e9383459d975a9c9a127772175a3d38c50d7093caf5d57db887406326da85daf2270e58be7b296530ade42fafb5b20d6261a3bc00972d439737301,abc58414174684ee80e58e990e4101a5b33571e7b5b9ad71dad08c37978f7b732f1ec48308229b1ab778bd9d02d3738d9dd78e4fba2af3599b09ddbd5e45ba0500 +45d0c09e6f2eab2be04602981c9a79d981d13922815b2195712c33030e274da8337d639acebf1da50840088c127f18280699e17c2bf0cf862f696040c8249c5716a35300bc24cdf8d0351fc272417d7413a6a4d0000508aa2830f4462711504e8d49bbf4ccce371e13723d9048de63d9c31039a3035cbf3d,a5971c1517c6c2c24c42f047835cf974ccf6bb9ebe594456559e88570f25bccb,b98ddf5bd85e50c8e9d1e58cfe752cfacb9c3c599d25885da4023387e87b729824e6615c5cbf303bd6d0a7b17dc16840314b057ebf6335d5950cebba53c3710800,dbd7ee307402cf37146b96a4d8701f511ba1d10a0edce92128559f6f43b05aba3f8873f98771c9103bd03a18e76bb383858c93732a822da0a8b8ea94f33d32b500,b1ae63ec668a0388597bbf6e885228f27dac77365cc63cf7e0402707fe0dcf772897cd57680c60ffe7b8f9d800f677a94b4317dcd5f648b37d471860674ddfeb00,da06b0c32c7d11ae549a4731ee5bc1a8955025fbd667d24392ade2295e669c7459248e90bab29b2ec39a5be9f05f9b3dc73f32acb8b67948f3732601a308638601,a6331ef6112ecc3388c632561f13d0f2e908567e6f6a50b17fe83e63067391792862669cf97e55d28bb220cce3c1839bab1114356b57ceb678ecf48f30b3971d01 +8ed03489e9200523570bcc0ce9136971bee6dba43c91154a0a0df04bee78a8604de359e5f0ad2e21829fb00bf844f5ecbe88885fbb3c4c6de66135f963dbb933600c9a9f0b163f28b85d28859af4a9d77e989f17d9a6a5111e7f4282a16daf5995a27dba93947b76ee25708368de6056318c3e17320416ba,44a26eabe160dde68a5deb0710ce9ebb73bc32a086d487d56cea89c090f4c045,cd91aeaf3fbc53950436002811a55b0e9c7846da76e9088c7be30b835f7c4a8953beacd8f965bdaa7ae3cf9f610c72d2243d9882b3199dc6fc99b4d972215e6a00,e85ff670d2c11903ff90e16a78d67c0d46b7d318025d20f1503e8eb994b707db679f714e55340c85006c6769137bdccba06dbf56dbdc234e22b9c43c3356933301,4e0c8d9f9ac3577f443f9b5242dafd2e7ac0ea611e73ed0356466722775b1309729957bcbdd7d0d6a65eaa66640916907b1f9a111e81abcba24bf7e657aae65601,8731f59d1a3005d7c6bbc7017265bf0bcb1dea72efb4e19aabe5191bd7ca9f393644b5cef0b4cb102af50095b29918f941385b5630c4ab58ab30a39d6255efee00,463805ae130e7cc5ecf2dcb5562f5edb2ea0de15810f8dec854c8067f9b2a8110e4517e42bfe10d5f68eb215869afa290d109aa3463d89783c5ba55352e86cf200 +a2d2211ae512c8c2070700ab0c43ab944577457116cd9f0619b16677d8eeaac278abe6569546b3df8e043dc812fefd18cfc82190015d6c30f3a96f2cd44504224ba8de4cd19612c1c55492d599a72f90413053301277a23025b8b6514e2e003c4fae5f938299a9e2cceeee4f740265f18690c5e107781e4e,73dd147b0f631cea1ede915def5f8fa0577f5e4b05d03546f237af0ee44fad97,7a69eda0f1e6aefcd4d7f3d2d83d93abe8856707c529ab9ab66282b804d0cc8d057f8a4d5352bb9512f7a5515c977b9b3694aa007bc2b864be2747a095541b1301,20062fb37705c38b864b7adf65c89316c58176d23535eeaa59a3290e488e4cd330d7c8915e7557407e44d0f8ad1b8f2b8faad4730e6f5e41714ae88e5903204f00,60646811a6f5d03dfc25913379d70bf237d32f3f6e8334bd6f671c1e4b08e2006ef0832928db8bcf74903886a7393fd204774c8fd70da57d207e3526958d37c100,2716f2c15152f1d5ecad0afedae14b4852f5ec8f0d7638f35821212283c801884451026894ede901e341ca9f1ae18e6412fbe7a8d83753ca6588dcedfaba17aa01,7c0fe52757c6b24cebbadc9e133d94580a3d4deb9bf423377e177c554d113f7804f5be19b228b94b2c8054547c3271b0c12a4a1fa20e235a0341830a38ead0c801 +0e611609e5904d5dbaffeb942a5f46a1d258a62506218f22fad08726240fed77551a90bb0b5e61f3b994ce656328a3f7db75c888575d662533e6778005aef9c991646124955236e40b59e7961cea0f98f0e64de87b5708fd74168a49fed7be3fb90b67803bc2c1b6e052a0ec7149f54903423ada922b23fa,5e4897fec03aaee71182c30778f07f47d7f9a97a82c5e3cadf18bb447b2e3733,d27ccf5282815d35baf63ee82b847a40fe7b392ff9cca8b729a7bdc24abb6d2f71dbbb2adbb78896be73b6592419a48e54905264d67989243a85f002af364c7100,4a9dfc24e8ed1acedcc2b7042e157eef0885fbef7a1164775c7c51a85995821b6219f879ffc97ff8a5eefed0f87e735ce68713549d05a132a0a0c41c193a584b01,6cfff42e3b80c19a10859ab9135dc7d8d7d5bdb812dce55d156901d4c0c2a9986a8af0777e4d923bd560d5678e223403d41d54783895a6086ef4bf4b9c69b53200,cba566f3bb9edeca99c5e540b2f0c6b98222e96cdca525b2c260c8b28a685a4b5610d4bbd72221d7c55259ec547533d02bb2ac25e3bcd50f2acb8ff5d52ab74801,c0188cb51a4f0c497f9c9cf1be13f8293f0afaf6e97a2efb5311dac6191dee0c5ed81ebc5c65814d65451a1a76fc67d3de5ce16fde68d2f49955966dcc66165e01 +32d50b1c5482b8d7b0ef20d61279b312b4fdcde0cc63d98ac4df3cd17e96a4095f0f962fe18f568e890341f5b6141abcd27e9f8d2c53f2596721196d8b88ec6717c533c5e80d85808c396bcc429fe2fbe9eec9fd295286dd7499db5dc346b8a3a8dd9979ae921ed6b91d810f458d48f123e13fdbd387fc8a,d877611580c5a0f45ba417f2cba9c7b1d275fac57e559aa316033201b1f94413,7a92247ec07d2559d923102cb61163bae3257ba04a0fdef9e5165170f766b7c2725922d252966fe29f469bb8c0c5a45ff55403e6c6133f4db5c3d01c0818578200,16271aedd00ed2e2ea592baf50e29210c9df47570d3179de3dae619cf22451ba0e7bb77705a944306e182793a92a9488cd18f053534ac53627415ca300245b9501,ab5cdcbe452962b16d895e9bde95db7ec48e57821a1fa4a11381f83ad8bdd46904caaacbac165a217f0a43a6cadda36d09c1a66a080a12e69664a77d41d666e500,395ea48b2605567a2ae042441a0e31d1431b36ef8478326aeea24a11988af36f741e8acbb7356355acc1a637b5928809ce36e3d8c49a2586556a8ed1f640c95300,24c72b4a32dcbc70492edde49c54c87a50c86ceee3bf10314c4e01bef779efe94bda9054cc93e16cc90612a379daafbe021c3cf687121772b29b602bfec37ed701 +65b85448c6992dcc6bee04af7552ca338da59c3661da958edafa379631003eaed3c8ecd5f4248add4ada9f1681a251e4f3ff8794d9b11676c96b80d11a92072139a825a8ce2d9ecb5ea09d7ac997b8ec10801d9ec094b47fd0297d29d0318206f7a1edde9c25b580a3c00aa91cf25682f23af57b6085de17,e612771e441cdd6d8189f39c80e56d1ec85eb26aa754614b4c6be81866638f0b,a361eb4674c96248fbe63034b39becf9add68a10a362654a4fabf8f70ca672ee120abceebcd73bd7da15456f152dfc5ad80f8efc76f067494f089272e9e1b84701,c0835e070a003dbe9be4e575c91f7af438d9de6d79aca40190d489963b4ed66b4cf947c34a95e79972e9bfda086c45f7b24a7f06539ce6040a7f885afb31d5f700,9f87adc7e748b627574222e0ba1f0fdca3ba6df9e43a3f6446a2ac30fdecf196677aa9afeed0de922c5199b30aa1a50ee10765b437ef1defb194c95e9ccabd5301,45cef9e75e9dbed05354317a0faf8b0bd1f90db43f03243dbf5ceed6d2696cdf0224a2604692ff4209ac0c0705f066177d38eaf89ba8ce38a63286b69362209100,8ac056e0d143a4a0189661b422276af9b75f24370eda2b20a670cd107682d7f32ca46af62b411575b08a6d3651d063edbd7879c46a7d12c7db30a6a5bf04f3dc01 +fa6d95ecdf9a41d296dd42654aca7b8faa2a9b756b3bb49eafb02e74102e6438b7cd705fb58b303cf09189ba42457ac628c0959e80059fe593f7321e01eebc620dc12f31b8226f83de9f131f79ade29e0306e119eb2bcb40751d34bc1710b40807aa9b351037b15885a9967568793728fa1db0bb166079e267,8be763d245f276587ea4e0fa044f9c83d9c6f5972803cad59b51dee88b048712,2e2e8b458fed9ad5b05aee576d5d3df163065f95a567c960b96f62dfec17c66c39e29a47370321048727455fc6f88f53b4bdbdad8c85c9a4aa79cf38e2728cf601,be69bfb9faa5c37955b29b571b15916e6bc0805b3b95297df1bf7d1eaa641ad06c661b6b5e21371a320075c22136dfa563e75c2e2a8358a59aab38a92ac2d34000,a3579ae7ff120cfe121982fdec2f116d455a4b43cb719a4a2336951323ded6aa690dba6b3797730bda427d3d698691386bad8f643841a818963ede25db8d0dd000,673b64d278c73fc895caa55db052fc09e366050d9c71c49484c8d77361c650b94cbf0f37d25d7080e36fe599f166710e0a70bb9785910fe5d317eba73f33263600,79ef25475fc696d992df0339cf59f3f959104734e6d9b4a00eea6eb69999c9a77e8af2a0892250da3bf784362d16bf3bc8b5472b33c125ce32a37fe33a8cf3ab01 +96967a18aec2bc868bf735646d86f8f09473e98cfb9f24bcb32c56121167d8cd610da38baff679fe10b74c717880d43f61fc9aaef3749bd5b03ec2d2a1d00193ac3e3438c3dfbc1f5a54004bba81f58417a8baeabeec99b14db7794e4bc4b2f1d14f0efa26895befb423e7031c830ca07d5e26eabc312b6726,064ae27e83061857097f99328446ba85694e8946dd9129f24af4859dfabc5fe4,95058828f9c3d3cc8c9454b6602ce6c6de3738e36a0735a68bd36942b5d58bf72857a66a5dbcc5c7b3568e91ea7bc4a81a88e5db1c107b77a02a59046cc8281c00,468fc64a541707cb41b50778d11a13c006a6fc149110dc99b4a19b21bb92a4b73227ce8eb843847a7b0bdedb85a87622f1b1c773bb30035dbc567f83e2ba4e3400,f6d71193a095afffb2e63bea880b543e50bf3a8fc080230848701655ee1af9cf0890a97af1d7f917f0b665f929c5be0f317fb5e2d1fcf014c6b0fb73fd839d6600,ae0780b5ccb2f91aeabac2ac9f53059a9fc6ee7a03bb17a9de00cf56aa960ef775e544d4306b0ebeea696b40c2eee8ed301c643f2055a6e8b960ab50b90b443901,549d7e28f0ea4a965fff280fdb8a02838afab4dad61f6bd8aa4a7e0506b201071ceb18a756a93add44afcfed1d80d588c3cd83f2f2c00df8947f9675ba6558aa01 +5f57dacafa879971d6d505dfe572b83b7afca85b74605658f31b4e1894d8a15c8dd90892108bfac3032305538928de00236c3376366da9b6ad46d00063626f2d43e6b135232a3adc80fc5c6201e0f1501c76ed23a91d75f6fafd29841107777f2553d02d8bf25ce89de8f89d4b4659e798e6c6ff9766d4dab8,c4d960576cc284bb85889e5e35c9bef5192efeb049d4249e3084824ab3d69385,00ccedb6a62d420e146ba89ae838aa4829f7cd471185e9d55430d301869724e37ea503278d82941916a6d4c1cae0dc74e1509d3c6f1f2a268a263d69921ac3e801,b4cb8b8e1460cfc347f79f417473dae4b5017751daa2ea942cc1ccb2b1e793b81125e4eaa8fd0b73b37aa59b41e755799b7b20f36ef685c49027ff2cfe9cb77200,44f531fb569a6ef2cc84315d8ee5194d94b802f675d1c94f54680c7dae767cb87d3141828357290d15081820d4f1df572428c198abfa3b2e3b19d5458aaf99f401,7165b09563832dacf7f6cbd84b9249b503388efe7da77e83314e132793fe704a13275f3ba8ad83cfbbd175bfb7c71f89beda8ca3b78fec936e97ef4c0d7230fb00,9014fd07f138691a877ae0bd2bc6ef1ed04f7de5b9dc7c332af9e3903f2a629427dafc08a4cce43920025e151bb413ce19b0080ece9ad1d902f692dc28c83c4700 +9b3ecce8c99b01902f4e82ce85f301a14d784645b67716629eac651ac8c28ee74622102d0f188bce648a0138ed593e545bc9a94dca2a5b431a2b826d67e7aa4b72e70d802623de1e4ce17e04712a0964c18f76ae077ba1c5169aea94018a42464d92e6607c1bcc4b3b8013040c496dcc9493a3717a3a9304fa,0c8808300ee09c5d059178968b826ce86f37927919c0e1629b6d94c1ef855f45,012b933725e1a06f0437021462a493393de89b589ddd78434188d10aa98e74b85623392d03454d848db626d0cd1caf49b56fcc2dd66ebd9e7943482766f6bb3801,523616ce745a06c3ccb6835fb0513e20c1c080fb826126c88a601764385473ba035d233612985509fe4a82abf4c176fd749598be4cb0e1f8a18c4b36619463ea01,c5f028d1514f962f4f5f571ed494377f9bef83e6ea270648361e2965e780d060428baaa349694477860e372dd80b38d3cdc3d4e833ceea69725a1d15f0b74b2401,fac0919d9023906b1b866b08e990b038eb3bf15747e8a86ff85c55b13b23f3823ed510c08d33c991cb71204df96f2243d1d3c080c55ac8791529925092cffd4700,8d756ccbb77d8c4ab3f5dd15cc4ca92cff63cfa521c93d368489c14cfb5c841a62ee595c6ec052ae696c6e9420281cabe1f96476f5b6d07314667bbb089c948001 +bac69406121150f6b541ff7cb143743e9e57590116169a03a705256051e9b8aafbc131f282ef96e0f1b538c4a746717ee9fc5cd02c5c4651b84bc63d0b03dd00545ab1a8a35c8a31b530c6199da1d324540ffe1cfa7d8bf39d9979cf830ee25610a946b292256c38fe0c4bcf601d035a9845a259e10acb39ae,3c87774dd34e0de8bd1d034c42b56ef6c9b1c09b2dce9ade8def5434273c81c7,9b2cf18aed1e5e07cee5cc5dca67cb717a11051dd80cdb85ca0da1532c2d364c33753252df78466a41f207cdbf9e8d1f29137363568e15626b3146660b88f2d400,f34ac81e37a00c44c0f2605ebd1ba3eb36583145263583b0e490d228d21288df4428fa24964d1efb517fd96cbec246a733cda287a6b7e11f23d9a7a35f67f01900,f77c1523ddf2e4d2f1ae45185aaee8d3a8332f775cf5251b5ae4afab4998c7230bcaa50ccdcdbe186f20e2458df344225109a4e4f7131b5383be457e17e2cf0800,ecff230850a2a765498c919866571fcc1dfd0bdef205360cd6af70e631c13a0e33a90b621d24473cb524b9bfe81e1921fb5b3ce723dc4d3656c76998a2bf749d00,88567895d36280fab0ad1016778b5f83c5c935583b5f2ba39c154fdb9d586c4346f358d5516b882cd9d9b3ee494d0fa0458234a605b4772c7caa3bb91443c1a401 +b8f58989ed15e47445dc9e069b5d4dbbb615b0f1e3e7a6060d5fb1fcd0cffd1dcf850ce8908b863ca9d60d120a4dec2bc9c04c8e4b0c6873f04c2747cb386384c421806262779262cd3b7fcf5366f10db7075d31b142f468c2276842a89c82afbc87b55d809ed0189d855540378f16c4880a1c05bc2b1447f2,0a5a1d68f4a5d5bcf72842ffc7f657109824426b37ce15c5b82ca6c78e6a7eb7,7a7d886a83e7bf7e3ec4f99b74dd23cf53cfc2108ff68c67188bbaa78b4d8c023c0a997bdd3a8d7d0cef1f4db832616cb729288c4b301ba92ab0ea638830087c00,c28e3f575d4e6f886bc1a904778eb8617d7dfe6cb9199f3f6a6f22a84438e2723b18cb98bc76f386b74b0a8c1f881be2d1c420ae1857ab34f5a82f299795b8f500,d19ca00fe821ea34f55217399a3f9e8f78916b448b1243d9db68d4985fe0082d760f4e580ef67936fa833566453d60aa2b698b8ece2d4731318846254f119e7f01,09ebc53d9d82c8a8e432006042a902d43dc1c48211c003b08d0971ec539e29ca0a171a034954e2b702d8e517406a1fea30075ba99baf0478e131846d6beddcdd00,a53cea30ad0deac930a1cf8d0ebdb0e963ba00d0b63e217920917c11ba9e6b911b12bca48fa8e789a82af2ef9ff019df093c69abc68fd8f04221f5e808cced7700 +5897c2c2ea9d3dcd14f704678d03ee563758757d04e51d3372aef7948645da49ef3c0ea11764b13d2d4cc809b6a0f1d34e0259ac225d483f3aa266c9b2c99e8e1e6c6c088359b165ce36d036f4ec4ce11c5e2cf28a5ace2e623618573188b4d5c5be71c86a5f57cb36ce49b4a941175f2e26c0f3f9c218c30a,cc220ce813c09713e0746e41320b732fd820f756d84d0a5f3522cacac916f427,b36ccb93456bc7367a71971dde946ec6547dc970fbf8e4e827e1a585977c632c4bcda3cdae28fc7edc362453184a8270dd31a2487d6a77ae341ce0a051f42f7500,ac4391e422f0edf2dcf9eba11ed13dc8a6fbdea803114acd9b0fedba95efce193726eb6103fac9a34b30fa03266d779a0a586fa1900e9e5959988973fad2ee9901,74e61a8747e032aff8023f135165788d8f012fe9b572e943d0694a360d915a627d71bdf902764627c40a57ede206a5360f362f6c846bca6cf71600e31b072ddf01,243e296a6399eb8dd3639f5e3141dbeca373b8bd10e201fe071e3dbd28a5d86e63d41e846fd1cbf5acff43db7e05cfb6f049d45a13ef5a0dd2ac748f3e6fe17501,56ec52a021807bf00f5bb9390c6753e18871d6b4cc9a586030487d59782b30166d06c9ece1e62d074e05fb716e08603a932ca5c2815a0e1025b442a9779368f601 +ffa19ae90168d0f51e2a39e1e82a33c7755c1751e6ec57128d1627d6b6cc216f30edabec2800431d8515fd4ff482d55ea8d66c62c8074d4b70d5eda52aa435661e79257b244d68fdfd40c3cdffa011d84e429581855f2cb5cd0a2a5a30b7740a56acde9c31223d29e14c58f86eaa95d8ddb3a877a4f7665e17,18162dd631e5a6533c706c8f432c595f331b3d0042587d6a6e3807aa55a5bd20,50e5981749893f1b0378c765d7d7187927390f5ba0c7d1be02dcf3853d8666e8570717aa74b808f700630e63de1726fffff6e54fbc5a9e0e5bfb03f53859a9f801,7578f379fa4edff817ae19b304af78585349bc1f2907a2200ca3cca79d2d1594731f737218cc9ecd41fdf4be674cd9d2ac30fc256312a269fc8393f41d0c423901,a9c446a67a127965186943a506ba9bfc62b21a11f75cd49c2fe5b2221dfffb10643ce51babf746e66a8d2eda5a1832dd921f706f7aa7629d718e588bfaf92dc600,cf8a61c4654faf7587fea6028b79d0d22ee385b6f09dff862b23a7bd726852a1381b311c7a7a387564b31db1aeec40c081129023e87e2e92d8caef475498067900,53c87981c2e16ded03700de7cdcc0e0064084892f74405e21bfaaac1e604d7e253b3b5ddbc033b94ee224ac41c8ac0d77877e83839b201f4931fe73cc565919501 +c454b9a91b6fdc5943407092848f6e22cea8c0773307dc9554ae2f24f5e88fb9327743d72301485b1e2fd2eb01fa8423b53866887255add7785217a16cc0831fb827f6286db372e6d7b700f92f8e6fa93f5c2db30f0fb9b8212063dd626fd9e27ee7a9ebada2d58198b56d8c83a3d2307688c86092eebd455d,d81f2a2210cf173f9aad0607f71be541fa5a335e3aa7478c0b20ffdd8a8f9a17,42b7b103628a0adc5a196050371bf258a0d7529c0055bcd9ab6774fb1131ddaa0cb46da37c49ec6c66c466f61840ff1e7802e657c4c23804152aec6aa8aa3d0500,ab7d93502969c178f8c7178333f0d7afe79b9629efe0bbc7449be60d7545d650152534cf4cded9f3ec1c6a7194ed38080a56f65ea96fdde9aba907b2e4ca6e4900,16d6b88eafa8e22189ff385512d10bc691ead2cc0cd36c517738db08453aaf4d06124947bb8d056662feeb5f8214a60b9c1fde1996d21206114aa1e4c0d3812f01,3ead8d261a7c7ee037da8d1781894ab10b2bcb1c4435f81e4bb2896810d71eeb1c2881eeeae132781a864b455af90668e149b4ff087545c9e9c9e2fa697d43c800,9ab80472845d52b8b157ae57b8d48aef8291854a258ba2028f62372caaa284be58c6c9672bc14f0f97316956e0cce090f599361449be2975ee0d4f9382e809b100 +1b82936aacc7d5fa05ad555c7a0f69498b11c37e8c9c93a4024ac9896676173af3a350ddc088c815ae006aa4ccf7ee18afa6f300c603e8cf2af4315623d6d5bceb16b32e13f89cec9e8cfb3e814b1f633143237106e430749ba3efc4c82a4ca1873770ae786bbe451b195625f268c46765a7cddba4a8562da2,638a7447e9ba545e650f1971763eac387a21a5fd145de3ccd75e31ad0fd54246,7e933f122e77510760584d945f1d3b5a66a03db868d81fe6796ad9897ce7c986597671db2b0b0d1991ecb7272669fdf9aea55479a24f205e14cdd0831527305501,49e3a77c7dc00f7af2e4b202ef65de417c5a7b8d980c79e2ef5baf58b50e97cf533c10fbdbaa30b3e47d4dac0b8670a15e6e8e03e66bf71a404cc8796bf3988300,bc852df53578ccf022a54830a6de3dbf46ad8ff1cc356a22f0856447750eec270cf2665f8e207977fc86317d637cf4d4082508e30eb6af756657403eb6fa551100,fa495260aa54782b5466e2cefeafc5f7d93157affca8af410d774f84369f816a7762de83ba3e1dfce6ecf30593e266c6dc98dd45497146d4a8567758dcad95a701,1e0712e8d8e7826421e1f54714e3928a0eca4d4a23322313b56fa6ea96205daa010e010cdd45f013c01577a2fa1279a6a8c315b58617c22528fbdc0060e556be00 +f5853d1a4054123132801da4eca13fb53511181f068727dde9ac3808e13ecb1046636a83f46a2f2d6753a8d09a227fbf1a5984f63bd515d3b953b17b61004a25e410f600b4d97ae447ed910d5b98a8a320a75cccc48926a6444ff530bb6ab76a9eba87d1b18f5638c82a49dfaec44f41575869fe539c8d8c2d10,e580801c3df6f92166fc9204dab50c8c5f7bcf439ef7a4f26df3671fb2f0fbf5,6455a6edf5a5a4f7a5c63404ffe3328177a287db19cacbadc177236c2c756e280dbec64f304e1495641b87c923ae130fe3ffe450932ecd1ed8168efac537900500,bf3940793e028879046697d76df2a2d1da1c6d6947fbd987717a768c24d059902ac0e6673d0cd6d7f8c1221377b39af49a63191a5f4e56a1c759a15de93d345200,a7ad001898d6a4a52943878d9d91da11a4af9892b2567ba6ad44a6d26a4018952ef84b7a50f570496c6c6660f42f15b47ee12c1c10a8f1ee5dc33bd2f8884bef00,d51ed65a962611aea04f5dd21895733665c1a426f4714ed8750221baa5c58cff78c0fed47fa740d04777e3e2b3acbbc58b423f494ffe2fa393ccbfd42829f1f300,2f4b58c73f3c9708c178552d236486a5d03739999cc1a822bbed60ac81634ec06ea59f144822135b7c2416579fc2a3a4a9c1fae835c185818d7c77b50b4970a900 +bf1e46b52940f10c9cbadbe9b3dba307c977a2b4d8b5b10be2996f435790d17722a51e149c25a437762987a5fe3f8df6515807285c0bc9d2f470e657a0a169ff8309b12ea860be03a32f7b63982bd8e50875a22e60a6acb2adbbafac483aba69adddcc67b6d0eb9427df612e58caca93dde7434864c0c72f9fc5,ce5e554b7fea69b4ba704e1e035f37608021de87535e0b8979c03d054cdbd21c,c7a815e2e9d49c523dce662bb4c19891ef5f6ffca6e09058eb3389024d5d2291051e5a4b83622bb385d92f780fc6a0090b38781235812a9b8e44ba1ddcc0492800,e652fbb5346e3b1c948344667f4ec9bdd8940421e2c2553b2898bcb14fcedebf7f6af9123733d2d3f5ffefa20a4a5a06ce3a9af345ae701b096d4914f1a01c7300,dd9abc649d0e078e916c9a62907840cc2ed3e0d2024f9754e6711d60eab92e6c3f6118398c1a296c894484fe47873fa0dff43538fccd171defa08fd73016118700,81d46ef6e1b72f561ca6a9060e9bbd7377575a0920ea9889a98ff92866d2ca4f4c7581f1637e7ee0a92675e9d1f289e4332f7851a93f60169a0412b3ae231e5600,47d800e69eef787a1a081a8d4a67c60fe939e1151b989a5d0921632e05bd463833c705b0b9537e51a0341415b0db1eafda45660c4dd850044abed4aadb0036bf01 +153c27e0b98f466eb55d2e9e0782245a376ad45180dc1bb22f3e3619b435ea99f5a4eb8afecb892bc288c2f471513745df8023e1f32e1c4c7485e5648238a845b72fa1443d1d15a93a517f1b514b4c2373e0338cb007d890ccc89d0788a16cf9380024cb928dde3b988d229e3febe1473290a1fa739ebbf832d3,7e066e60a040c17a23b16fd20f4229ce323682ab6a7f145fb61f46d13b367d40,323506fed328852338c7fbdc97cf87b5e8dd422d1e648b234bd2da0a9d038a28080ea28d6c5e4474d790f578afdc583b4442f0bd69cb9860bcb7060fcbb448c401,a8700f70de03943afccd511f0465a212dc2a9751e37c1a86908df86606601d840aa8f2db73663027863827b42b23d906680b3eb0ef5f43fabf0f75bb198d52af01,b041884bb7174f6396fe845d34286edc2cc24de36bd3a31daf8e068ae1d33cf14a5b7e6ec4ef7a46da2814b36397e059a20e11cc7e65a4c9511811d64f75058600,dadc4a7aeb8059468557cfa5fc0732ff9427570259313bbf07fc6b8dcae4e9142181f6e3cda499a5949e8b0e8eb7b8450027e6f39eb28a21a8af0990645e3e3700,9e660034792269d46cdedcaf8716527e391dc1503e5b1b6121ec859acc5700f2016d114bd3f366267688927c630f3ae72a1025cdbd69b9cc33927c4b7671b28801 +cfb62bce764386588d86d0bfe2099c9d8b5c27129d4f0ac51d6d9b354bf302cd5ca0af75b8378616677d7dee6921add3bbe0332d25ca3315d171198bacafaeb1e3482cddcbdbe6993d7cfdfc548209dcd80cb52ab5a2699dd33f49f98b5448a901195329943bff4afc69958936848ab42df96c16f43475588c21,fc647fe95975c2c5ad508f108bc153811f551426ff53392d67087993ae9fd910,ccae0323aaf47de6646ea1cd098f7e78e078631730b3df2e9bcf80b9758435c839d5f85b5a6abcfcd2a501ebf56f051e015b1476eb8950138eef05cd6f7dff2b00,92d7f029d505a0643f99772b63e6e5f61e73709484056f665831fe9439be831f0e112e209cb1d3bc4a9095ac955920ae32e0ddd54b4d9451bb4e93ec27dd54b001,87683f3b9e161a05f12ecbf9a4dbe307703d91a2efea5487090bdd111a18285f629b732f855a7ca6bd96ad8f29cb3971301d03c27761302f636b028a436ca3a000,76f7f50a7c19ea33d9e4fa0838f09f1c0100d2ee39a127a48aab8da18a71247067ab8c85cb8e2783be5e3294e4d5f714147ad735ca462121593fcae511ba538e01,29eed68ccfc991594acbcf8f482cef4c15341801bb63351a20b9e1a6aafe79433e1a06f034c30c95fb9a11643cbca231470a5d6f40666b8a8d8f687f9d02551201 +0902b9a5c01cc475632f70d83dcec6fb0b995fe8b2b524ea93b001c4dfe2f2ab2894faa0e995cf8400320285fd7ce8adac653c85d0a77264e61faf4bb8b76ed057c2a060bbfcaabed3e31656e6cdc107c939a89eed2c7c2019d8161ccb68b4114cc7507b93a57d1e4eae8e5c2c745d9592bf713266f8ec490072,d2e12e3027fd3a2c797c6e748859359a0f303aac475a25829fececa97d919a12,49fea01dea40697af4584fa47347c02ac5ebe12fe0946194bdf6bef2d5a822930948bf1f7f20ab5f8ae3a6bd748fbe935eee053e78e3ecb6233fde9f4bc307f801,5602c05ff4ea8cfcc3cafa0cb422c43d89ab5f99a6cecbfed4f0fe122b88ed0a3b5963d36102d448acd7d6bd0834aa6da55423fd2490d56cfd568b4be7eb707b01,2ee6737a79cc94f818cc09d5e4801a2097587ed607862a6636ad90a9ada64c2d28813306c35a48e669107612bb8ee01c1046dfb30bf23cf12b9857e97b0c84d401,9017c23c0cd85f832b4ebfcf3bf56e76cd3c1519b3703430883e7e1c3df817d710c69a09af4895e5ccc31e017f5ddfeae05ac21d0f2aa288767df8da9d40ec4f01,b832c3918bbc1291c29fd4fa5f5e2e04dd63090d1abec3e6de57f279e2cd5ebc462b4736653fab1ca42b5c095017a2a6fd46bb627f94ba144d07f838ecba5fd001 +4da0b6428ed5c0ece278b65c40c5f7c9f66350497465b2980b5191b289c4b5939d370340cb1c5cecd461eb68a1238e6f01413049a876ac71a24fe232444096aa993ff46ad2a25ef2fee24bce6c5ba05561ee6c62a23259e5876bc2ee722301c8f25f8ef5525d5b18736896eeb47f509c6f7d1d08692c412f4f34,b7390fa8b5cd65c9a23a4257f2bde8e34f7e5e41242db206df0e4bb7cb0055d7,1f462ecd10ef3bf4adb0f97d7ae14c0e87e72cbc7e13e6d90a75a99900beaa8e4b190d7f78d2f91950456deb2daab6cef6fa23d8cf2d2edf4e8da00008e7f8c600,de9dcf7e78eda80b6fc3abd1c1d8597f8753381852f1f3b12ca7873372b5287f54b3c89cbe1a3595434a14a8ee508827c336351789c1c368f025b8e8fdcc781601,e065179564fd429e0af78675ce6c1aeb4005744c3381e6dbe69c1b58e118ba097be4560e5926dba4d596f12a9630d1bed09dead2a48cc726e20bac7f5ce6079000,739714b527cd5d093060e59f9aca46ccd06d37f5b3d4ea643a84a6f5a60f3e233b21f83c65b8ba9589bc4fcb46230110bf3897e0d4f350c0927b7f471161a64000,5b73908484a983b3f564246a10e53c8fed070c22cb54aae18825fa4f87e1d78a0c89d8cd871ea97309e835722c23c41c005a1ae12e4c90b8d8042c6aebb5e86600 +8b3096db634209564ec0d7e82145643ae5f2a269b455d8ac7ad17b7ef1f5378922e04c39314c7536af5f84235c9ef6de54f29d424a6bcc67e209925bed509b53e9961eb3e62929538f217ff6785d64c1b2caf278f1f106d881a806fafce36a926b5573b115727728f8e8bbae2b7159fae0b43304b432640081bf,7561d5881fc496d3f5368e1ebd199154398b16e3ab385e2311f154a7a73acee6,507b7fe446df373667a2033bc187ff774e050239ff2a57dddffaa93751e126735e61cedb0107720ea8fd1b4cf3be9487dd25e2351bfbd72239773fe7ffffb0c601,74b929660862383eb79831190835634fc1ec72cffc16519a8eb3f53ef50d535019b2f6c740f88e1647071cde8ff1f9baf37d8720aa44a1d88f101fb86b6b2b6901,263322ef189b3fa1b33c4d5f1efff2aef06e9e6567f007b92eec452ed960e01f2ca70161d0374b9e0f5b98f9c00c3dbac20b9be3050797bdfb3682f72e612c0b00,42149531de6d4ef958485af9414c26e2e6329e1bbf709588578015a1dad85fb02a1b6602cea1d340f830f3cfe3e65de4c4a043263959fa28b2279c7c8f834f9001,045ef3a271d8fbb6d797300715f786395261ea358ac3735ee32a9ff191dc5fda18407c1dd047896e60a0e517d946647e2c2470b62353d0b8d6559ffb684e984d00 +4a8d8dfdc24102877050ffbf2de6453e8bc1891b7a2b008c0d7c880c1832d4d205fde46a9642e3b9189279a11af51835b3ba589e9c00326f26e6d9fa4778f51ff15e686c2ebcf0ca30f61e9c3062231fe8e25edab8ee198fc3093aa12d7109163759b6b1cef29043254ade44ebfc0aade6fc9a662758369e2536,f7d223bb44142eaa4ab87a0d749ec832515beddff802dbbb80179d4ade9a5185,133bf1abb1b8a37cc867d0a3055920db4bdc8a42781fa3e0f6ec7fedeb6f599a655c5040fa2e363eb2f4126a6d26570c25e0b13e9ca29cea6cd5cef8253573e801,1b20c0bbbf3bde74e140ffe2a424f2be57fb9f3b2f928aa096b4c79a016d32f05aa80df9865168e368109be18cc4930992df4989b1219f8b95f0f9aea72a728001,dca968e2404e71f0d94ee482eb54f1406aecb37a75e7c3baecaf5c53fc12b53e343e75abb4ce7a24cd34345abc2b79a01ee6b20b5c4eb529fcf70f01de5861af00,3146c573ac5abe64ac78a938a827c3ef08445bccfe0e675f2a7576efb6c5383047632f97acd42f623cae4a7fa7e24555c579cc8f4fae7a7b2d204ed38f778f0600,d365b8cd950fc36fbef9b19bc62b8de13eed99542497aaec9ee0967f966ff0a27a997f65fd3219d277dedf6a5824babd7885c18813f7b132214940044d92d4c500 +552107f4b76ad80151d026348313b09acd5d7cd9a6ab790019a893881c5c839d8ab870e2fbc2411627a10560a41cbf0e0fd57981bc7398006e2312e7f4d214e59e4691ccf5e87dc2c8ced44745399ad861ae1781eb3722df1515e9b512aad4c472a1881e2951897adb5cb7b9d59bddf6e84c9e6e6f308215c9d0,5b60a2e7f6f004bd9631970bc4f77cc34877686d0dbfc9f9a085991385608780,c51b5c02b4a523a0ddad71ad12321b673b3f6ad3f8395c28a557738f97f5bb273052fbdbd31569ebcd2825ae7be86eaa3f32a530c6b1d855e5b3220f035f7bdb00,81ffc6ec16845da601dc4f4ded20b1b1984549056d230110aa623a371d748a7d3735563d9033f039442b424313f04b5f44fa053c1092e470da7f40c7318c64ef00,7ab0c16705bf656a61e7485fe7e6590734f1c851ba812c8cdfe3b1d027fcd4a61b5214a8a2965255a2d05888fe43526e36c52ff2210f60c0b1c378223488be6400,02112ac885c08aa7268a2a04373669632504354b5c6f99896a8f446bd0d4648d08aa78cfb966c4dfa1f79dba51bdf1ba14bb940492b424853a4968dc7e2cf86b01,835db8b519b5fb51f407872199728d180bbdb8ba85ee7988d21e698e1c669cd87b21f57918ccac2d70e951a5481b0644b05f2d41615cc079464d03d466fab72601 +2d5c109fbf29db099cad9b276760fc9ee246e1619375d9c2b1e105b120727cd2e787107160dec36eb5dd7e9ff005a1cc7ece2ff720d6504a7fd9e4236ace77c25a8f97d0a3c631096d82e54bbc81ef4c838340285a427014fe9558308884a63054ff42df23c7336dcc4063a0d9771a21efbb437aef40a9a2ee64,37cf8a64aa0e1f2821fcaaf4088c9092ec77a8d1e08d97bb878d82409754fd3b,769b7587fac534040d6e94e4b827742e38a960fbd16157565bd469198586b4a907e640ff71ffec5fbaef80c3f90d5a89fc2db8b7d500e73cb3bc7c28f301292c00,a665cb72a2ad7c14901f40ddfc9b5a5844576adae184a1e2adeb1dd60ccce75e7913209d9e930651ea155d136b4040846ab5192c9e4d099e62470f0a8a1111f200,bec4f98612478618e2f9c126a575ab8f74c6798da0ff29e7fddb0382a00bda214e9bdac3c7e9f88e225cbaee4ef6d26d0d3aa1da8fad3f3e86b731a4353e38d600,7753b157f6e14e05a0fc1028ab18d4ac56de0533bfaace3fc85d0c318afa00782e3d0cf44565944c5fbfb15fd79cb22358eac0f322b319f49c05ca9d5ce8b40300,a59c11acd94d3d0315b02a461dde80b1dca5351e1da26e8d8f9c3ea930e0624b7e10961da01662d785af567a59ae4651c499dee4c72ac9aef612d8a1df437e2301 +986c5dfdbbba6b0766d9c8ddd9d33915b6cb8341a3f162976172104018d7444efea5101344227f77a6fa68845acfb70473fedaaf85a4a9d38f3586cfce4cb5bbf92b502b4795b249ae85481d872daa5209adcdf2b1caed66d17a148d2b8987fbc2650169948950c35fc113bfd77f7cf95a62e88ad5797d4914dc92,7d9d09535102edae1a80b03c3cf4ab82e4c0858d21b33e50cdb458d902da2213,f4321d9493f5d625fd95ceccc1d6f9cdcf77d5f105d331a789c99571828abae54045e9ecbd45a9dea62e9371ae437660ba96082d9d39db84c63fd434d8dd9ace01,0cf6f36374b638dbe682058b394d0eb50e014012ac309111039c50bfcbc6a04726bda39a0e36115ff2c5b40440b9cb52e68b677ca9587517f325a074749d43dc00,748391381078638a99127c7067d01b88c5b09afe5d2a600016f1cd2f52e34ce7377c82314d7a7faabbb2a5c639a73d6a64a18d05e6813f285aad1a51897057b000,f534cddb8c3ede590719a56016d4965589e5ed50184c9e65b3a7f7375fced9371c3d935aaf1b3e92ea51b869bc89c92ac83bcd651504478e91db6b1ba1456ced01,7f065d59d698d08b6bf836b545337f927fe1067706d6dbc9b17303b110f2d76a0f77f9ef0ce6864e3ccd606ace9437f399fde21b8cfab57ddebe1431150290f400 +94caf705d12b4cc7969726616f64a19cf9498e94b412b504c33fdb3134d995a5f779ab0064fb5330357df5e8b27bec076221d56a6dfa32b036aad4c56b0362b3976063c5388a0120893f4deee14b8fb239bb04f55b45e40fa3edae5a3ac313ddc3a37a2e80bb71c2e8868284334a24febee5d2a317ab036ff2da45,9cdeca6a4762cca6423b25081a4c8c13180840ff09423f83784617b2ac059c77,fea909b77a04df0125593edb17c2a15ed8e961bf6d96f4b142e0c496e4f0c4f30d7b23148cebbd2f5e701790596f75020fcaf9ecbd7e9f94b86010f1d05b6da901,138300e7e38ad61c68dc23398a53907ac7b083c5f98bfe7fac4fd716102dd30d4c5008fa2ebd36cd5cf82978e30f37278cc26fa68702173b81d5c412fe1626fa00,a34a189865947193e7e1f32c2b6b89def5e39dd81d26ec8c202f516427ed5bac434ca8b4bd21d793e5ab7294cc7bb697493c0319d42872a1526b919e10a8bac800,7bfb5c2d0099181b125fd357605591564296cd28ff3b0584e8d4aa8e74a1ad9150b5a21f9c38f043fbe13fbffda589757e770341433643d3a97c86f09178230201,707c39483cab4609913870dffc60f5bc8c7d906da9dde77b59d4cf11df0ff8492eae4b7208b5a2a3007f4788edda168641fc973d6809f0e280731c79267e96a500 +9e88ca438ebe04c00cfb59f7181beead0e4a27a69c45fd20b73a4519ccd1efc4004b1852b09ef663286f3185b543914e2ff3aaa8faf6ba9944013d91792d3a33dd424b6fc26569e57f043d6e8b6f961be1428657b60d8539fff6054850a67d2308361fe39626322ee83a1aea903c140fb0428e950fb0621cd096af,880fd5dcd783aca13488acdb7ec8413572bc1db28d321d70a9b40038c262c59c,09c178a45e8d0aecd786e6299bb93a6e4c1b476421561461f75dd0679dddc1d206df9af30ed3246c550df57ca657c1db43ac7afadd6f730775232507bdfe4e3501,0ed4515bc73d44f0e75f8f736388c175c399fdda6340acb32d2bfcd662762c93283dbdb6d9440791c6d8d8052e592c341b133050ea4270f0ab207b7f7ff6e11200,9c5cbb878f4e2035fb48f0d5d112e3ba87eca05167a979330a86ecb4175ce90b56d7d49ea059035043076d5c87ef6f7092285422486cc9439a277cd2ee196ba501,30091168201b900499346bac248dd2350437f42f7131dbc9e3742905ca87819014ad0850c0dec348085854551ffdf74bed84ea14fc578135e1b92e86d096c59b00,2d60ebe9234507a2c664fb037e2fd10523e4582f18d572340e8cdee9409d31d03bd64a4098c429eef234ba4eb2fe58ddaabe79d61daac635b47e935c35d8882301 +ec31c09a8325ff017869dfd2ce0cdf0cb74c25a6cc038b2a16a3e1c1a895e7ae7b870554f56599b0ce4698b4f3cf16dce8d346d42ce19b3c6a6cba9df62ab31e28c2e27256570da770518a86ac31f1202079dbac8efd2b0a76fae1f59d3caf5ab5836a2bec3acdb794444d9bb3de0a124924c304c02e18dbcb016e,9ea03cace74d606055512e493179f0f74f7f8dcb853a86d861ca0076299c8d05,256863ad498d2a8cf4560bedea669236d92ee7648457a50b66c2a4a78203205417dabb65bd19409c693c2ab394f5bf5d27dd08c50675869891a02dcdde8a085400,0c38d67ce73f4619766d644efb84832bb599f866b1da883e4afa997c4d0e0bd12e2c47aee51a41a74e0a7edfc28f914e81c20d3a5e0ebc5fbb5bdbfd108f557c01,aa0732789f4d69952d5ae23b2079dbeaed9ea0811b8616c36ae2aac6facf35a21983b696a46ebb5712123beea02dbfe447fde4073f19d6cd7d7129cde599bef501,0b83d252c78d87c1017a59bbd26f73c3ad015e5f2759f7c9f2eda29ce92c3ba26757712237d887248e4cf59602333112107b0142e8a9d2a3645d6a32a5cfed4901,b06f2ec710718f3dfcd95081efd1cef8e23bf9e97ceb66599fbaeabfc250ba942349f437c1fe688b1e09045dc7c41b1989ed3a81fa6509cb12dc0175867050c200 +98d4bff6bc9efeb6ee4f331512ff15451641badcf94ad64f63412aa5b7c5ba2fed5796717b7b56418d37e9048db1533b44fa23aa7af02b7da811ee9ea73a52bacf786987569af88a90e8a6eb2e523e944fe8b640c1b37af5348051b6738dc2b56aee8d9cb43dd68977f133f22d52f3fd74496ce1dd853666c1c6dd,8c3ed5f7360578197e5935f5fd3f69b0bc6be0c781e1e8f3334564cb49d8efb0,e57434c2a82be8e4c3733be32436c125ce2585048239f1f1a3e6d0a71278510c0637de117dd7f77deaa0a0e814ef2a37c73cd2b0fd87801efd4d946ebd995dbc01,124efb68b5ae54f85c51e7a4facc5cd9fb70dc4a8284d1b86c938e60138768f36d36ae93bb629b56e9ed09132420fbb1f3d83e0f6a18339ae28ce5f91df6327801,1ebbe81708c16cd6c69f493c09f2e1d8e7cfcee9df7bffa35e30025843d152ad33b41424f16db1d2dacfb58c49ad0d7d6f10ecaa9ad0e0bba76de91ddca2052f01,8152968ae2e7debc245665a0581b6f11a1aea8e3e61f7bc6fb0d415d8fe241fc3d40d2140168f75d96b5863c195bfd6c5fa3f77dc1c63c13b9c468e8984ae04400,96ea4039d742a0d73be917e90e61e2cc5008dc626d4843c8e5e79355f4506b8350546767a2224bc8d884d540631ac5350e2d8d03221a2b22b92cdfe6fa2307ae01 +b06e36d33e07a969c2f61dad76e4575624750c5c0a2b31edcc5849395558cfc01823d956780f127ace6ed35881e2bddf8a6d01d2e80aeb469d6fa3da14452673a7c052870263d74342b2d6ebadf8f451a9ae8eef1937f6cf857294b10ae9f7363195cc42bca1cca0145439e87a41423515410f8ef225fcf0baaf4d,37b2a7f2f71105d869d44811199bb6034df709d77413866b84d5a49a9993711b,be4a46ae6911556d0d8d62fd1d49c8cb284ff7a69df1fe354dd68ef7e9b281b727c57dcdb768da3fb3f181ab800208c2d56d4e7e74c345b4027f6d9edfa8382500,149cad7ea9f8e69f1e283c7c58ecf57ba090fac8bc76b4b3f5e6df0d5b0c83d105ac0d256f560b85d8ef7273e6c596e32fe3c27f22dcbd49e929dafb02bc255a01,8b928ac706e5b6a3c4ef24be961e7faee6a3630215b8a2cb452d4820ed4817876f129240b9b6d2e833362eaf92ad3dd5143d1daf6c5effdfe16e85b39c5c1ea701,51b7e5e0d0947ba733d160d7b09b171e40b76ff487b6dff574b1af335af68865099719aa1f23cb546a21e31a2084540cb26c705e441ebc274ec81cf267de235000,4704c85616e893f275b54296b56257bf264c628434245c6f5dda157f236bafbc2f50e750871a1ce17accce2735344aadcf4a178ff407842434d12b1e5556335c01 +80af69c39df0fecfe82d88e6248d467ba5770ba11e9d74e849d560a30b70c75e19bf5b0e04a560892ae71087e4d9fa764175f802a18bfcf974b64108de474e15455928368f54535c818e8d2a96e441dde95dcff854b975a65cf0ba90fec1df4c358404ffabd3445b8ba8b159c02ec36d558ea6990373d75fe3193a,cdd3d51e5f58514e2bec092d233b2a1b778febc7c5cf62c9e97ea70e645d3aba,c20c3a97bec07189cd1e0bb42e94c1815c5b1050704ba98fd42cc59aaba58402733c79426425258ec9534ea6b2aba4da00d431dea646619c2f1b5d7132be0af401,ae06e7c61989c47a4a2065239aa2f3c140bcbd78f41d06cb227b848066da560e33c017ccc7b54aa34f02e65cbe6a8466766bff3a6e6eb065a42c7241efae9a0200,64ec3f20a2f1f7ea340fb0ffcf00cd27f6a680dc5bffda0897482b15a632385e2c07383c8c7c2d270ed338a3c26af1920758a677b51f144e083dc839961a17b601,14d6a20f9d86c6c7933e339d648f0da4c18bb59e655d6b846f193dd502979d4e1133c10827589d416f2ae09b0a82d18f0b1447a72e336c04d05e4f3c6c71c00401,9fbb98cc914519f02aec760955e493e2bab47791fefdb07197e419b9b28645052b490434ab92cc04f86fb7ed100fedb649afebf736ed0d5a1945be30b8d796f101 +f487e7325768b5657bd135561c7b0e45515f84293c4ee6e6ee4eaf2ff93e31819726b19f0568ca98d2403a96045cd9ff6eba74b0275dae03dbc1faffe6f5159bc10a4b0402beab646f7311f0ab93a80124ba58975c53d2d4fce967f73cc930e1e6a7e67f2ec94f8abd9e9f60476d2ab2f75abe7d033667c6288b4a,4fb9c3d5adced19e5278d0cd3f9e3537e4a67815a0a7dc30944bbcfa57fb7fe3,faed73b8e331ddc5e18b2484b638e9f90b83504e8a3311cfef02b413985ea47317d42a9a935a03d7ad9b6f219a35137ca2c5efcd4c9658a18289be38acc9125001,5ff4d6a5bfe4fadec200a4d45e22098e1466289ef956db86b8ad4d79aeca98ea0a78f4ec6df454c9475852ceaa1a09997d10c704900163e9c41166b8c35fd0b100,8d717427bcd26153a46fdb410b7b1998d0c849cf6cb0ac2c95d4a8a3d80cec0d1a4928f9b5e1c65a1abe42825e1cca4be68c4d86b04e58282b2541634b14fe7101,81b839810b46c7d5af96b5c563cd471e6ff91454b60f74b0cabb7b7c686f43ac0e4d4a090784f5e016b4ad2b2e94dc1275956b70631cfe5543b2dfad5b85565501,b5e325400103e6321afe4613882af636eea542c2b027165f33efb591f5f3b777573fb084255b414513f281dd6827c9fad5f797ff18b653e369543f020bb0d09101 +1c0fe8af141433773f91625e14bc7635c26253753f94f5f69e6fc3168c687c34098c5a4e49dff3d59542af0717b491c3209dbc423e771aafd8fd20799748589dbbfa5a958dd64cb3ca34598eeb53dd14e8c31094dea8908f9cd25b74e95655c2f33c618f4e28ddc0fd410d1929e1e8f02838b8debce875b8a9f079,3fa3226de6ed441bea1ba05e8bd37a4b37fde3fb7ff48889d9b013921801fd05,d4c04bfe6de36199e3481bcfcecfd9c8740bad0f97fb71ca17e3395e0489cbb138c450a3ac4d1efb4c508b06f5fb7c99da613feb67249d606d909de858d798b201,16987b7523f4e5221fb65c4bef0d79dee90101c5e06dec45ed3943296a4146b41d5d12b1c29250156b6e3afbc7e2050e0a5d6e2f9e759d2b3798d477b6e5101c01,7ba39b8a4f6d1f4033d1a72c2ac2c05e8a5ad429acb2fb36f14ff427634d8aec2faf57acaa6d76786dcfb9b03780e7ec52ff5bfda5de170e5b4b7dfd039052e001,36c7c18f3d0e09586eaaf6305c654a31b495af436b026b68dca6c8da8535900e485a101ad60ee358ceed6bbe028dd70839928ab17e9ba7fab30e79a5c41b173d01,4554e90dbdaf17adb8ce711757ed1889466bb3cf7884100d1cfc554138ba32a2744dbe77823962f23e74367b240552df3ab17f2adb1c822415a06f12c022a24300 +c2f1a20067b49db82f617253bdce124dfda632dc42d852148292436eeffcb0f6d08cf7fabe8d6cbd63db33fc3d53db6b468c0f93e1543f3bc952377d1bfca96bf5d9a7b465a9f729a144bd71d6a902a56651e6cc0033cb41076d82f59cc2ea3a33287184920077f3ae528b59b48e9d59600281a031cbaa7eabb820,669da872afc620135ee9701096e1565c08e08008ca641e5f6beb5f25fae61af1,f0d97f70e957f6e48e90a00e7236fdf7a6e953268a72760d2f9328e68fb1f4207f9afe47b5071fa30820ca2903241f1234dd296b03be6410eebdb15f8db1deae00,a0569dd1f82269aefe209d3d35e2bf7cfd05ce83e7554ac8dae395e15b06770c3a3c8a9c68365fd82a2a1dcf3b00fe2136bd64697c084dfcf4484fbc770501fd00,d197401105d1c4e30e2bec472ff6381e1447f3e773cff56bab077b2302c034767d9d76b08afdb9ce66b695461ce3865d46034dd7188f527e91298d0f4f36291801,a5b891e084a7444d93b101c2eaf971fde81abc42c707e14ba793badc3e98c34457caa3a4e951d8b60a072d4b6de529c6efea650b726d59c3d520b77308aa333b01,9bc1fd79f33f9436d2b4be91a23cc52f404f1938959dda93de15bbf9e5b67a183bc42fb1d6bff03e8de6058a6a2ec690653cb9b38a123b1ff46f06f1a79b092400 +95ede2523e304624959d8e20b91c9d741b705e88e581d2d185f051fad068d835a70539fa8c32f65ca6aa316e28402703879162f370f103d2ea22760c58970e1d960b40da3a921f2a907978bccbcd164e9a330b1f1e9ceab03c3d0079449587ebedb82b2d11db5eef58a11caaf9bf8d277c0c8dfd7892d396c1fdb7aa,ee6104d3b1dba5ff7231f0e60415b883ae57d1bd394fbeb872a2adf0821e312d,7d2f562266a5a7ac0750ed8e3327cc4fd20be0733b91ce25ea6be20e19b8e1867b78bb1e1a33a8070ad393d3bbbbfc6b2633e449a8b74e49af4eae22b1f26a0e01,e0a41432116876c6bb0db1b48a4ad1272b075fe620b47cb0d1a2a8c397131fbb173ee9bc32eb95e3952a2d43bee08e0900f973d75f4a6f64f25ec60f8de98cfb00,0c24df08e2e43c40ea0a5d880208b6ff7eecd0d7e62e0cc73deba3a84099f7b6738bb29b22eeb6d01673af7e2cb70a775535b4e2c0f6354d4ae1975977d15d4f00,30dc9f2d97624b1df7e162971a91f373c5fe9a9a532b6db120f6a4f3181b0e3a1fdf95021a009d59e2c044f5cff1aa7c752e71147045f54384076c5502bbfba000,22059101efeccef046bc4b07f0af66070efc01c846a7bb22b36f92176a1be23e39f074b7a369615e754e8ebbfd13c3293e3f30382c5c5438f8a7eaa93c1781e200 +f3a698a7b39f412d228205f7d9f547cc43eae8d93f372a4fa25c00c5d8009e2078aa32d40c4cb54e3292c902d9b5bb51444d92e154b3a2a6e318263820f9979d5b74cc404798049cc0b05aa6b1b172bb446861bfae1e132806eeea1e14c016a653a6e54f99b22e130fd9d55877345acea86bc5623775a1cf20497809,f640952978f1facddc57ce8e2d63e916c4f25067bb40bfde36df53c30f6caef2,c22e37f4ef829e781649beb38a6cee074f89228edc82fc77465fd08b7fe1fcce711cf293e3a1ae1e12e91763d81db0ba105eac0999a517f0705a73152b41226701,9bf8fe4b078274cb90c0d2f78b64767cf6218ce9605eed28777229c525409e793854a4c4f00c3d92d5346e5f1dd17db7672f10923742161733081fe34f79528900,79260782ee272507de4fb9aa05f43effa153f55834f1d56b0de182f0bea30b336033f7b806db1c45e898c0bae50b79182eb631d35f89919c014424db3b82383300,8f5ba90f6a0ffdeb5ff63ae9f895ffbeb0c4c6f4942398ad435da6e3db3f7d43089750c69c111527c53e036cb438ae1fe3ef606d96a48d714c08f75bb3e2d14501,2d228f36f1a36fc5c3684f964a0de6067f7d2a86f3f5587d7e6a7871fd4bb0bb39c955e34fb817a582d167c8d33a9a73f0b6fcd9836df53b691dceee6b29ff5e01 +f9de1818ce74f4aa09f06b3bef4cf338c454b6d38795dc28b26a541e8cda414a682afc476ddf68dd7af930374ee38a62e9f10379323626bafeafbabb74d74780085aa23ef3141adeaf695590ced69d761a8f30bbc771d0a4ea9343c889fc743c2a7d93e076f4d0b846cd8b50206d9949c69d6240b5fd0263c5d77b6a,af4b35d4fdfd9d1888257ea25b120c91176c6d783e7db38b1761bedc006aa07d,7c3180aacc65b799c7160dc71cb9823bbae5324dffc2fa606d2854bb449cae1b361bb72414b0e74d25f9f729804c6407341fc7f467e586d2cd801865cbd11dc201,1b29a92fe32ed4c3c0f48aeba16e31c366842e34d979d5a341c048f87e17bc7570d5bf011783cbd95aed6202ef13980adf9c67047df27d7b6d43fc9aa1596efc00,95e5590f54ea6cf4e2b5b27c2f53334644a9baf2827c02ee2afcea29c63745021a5c93d24bab2670940f9794e05ee9de1ce5fb1f52869b9b3f6121a437ad285101,0b32e734eed447127a0431d5d3c0c64fe41ba33e75ada5ed10c65ee1547b69921b6aae4c04e4cf3165f7c13885f0fd85efb9d48801e3432f010ccd7cfd78888301,4983e9c2dade58dba4b140e539336e2940523ec6b720b2ac49a69b4c29e024be15b00f47a10610260df83ef0a41cfabd7681acf49ea9dce7548d8b2b436ca82d00 +7f87a5e99f9a92b021067fc7f6398ba341e5ba1dad2ff3f60a249dc7bd55b1eb1c471fe177c0e332b1e75c097efc9ce77234db2d4d2342d33a37af90d884339c00329cad09995a1731e3f434f843562ce945783dea0256bc423ade6880791c463c4244cef2668febdc5971c72d081a4d3792b749835aab9cec178398,bbdf58d053ca3722c2f3a57745c5dabd167ab326d21f1e6593d1d69fc7ed7e26,cf717b69f0c527ffe8b5b3bc8e2fd6426d7aecdbec722937f76665a437483cf711712e0dc3fbf698a72d0db1edf7b7c63e3ddabb4248af428adec5469dd878c701,50759f6f61f14d1c198fab1dc5404160103969840a1ec884c631b6588ad0c9e55594fd95bcc2e14ff6ab375afca6fa0b504bd415ac1d6352a2c2e17657d4ac1400,684bc9f7ce860aa0f6228b0a51d240c6f266b03d76c88524aeac5685f8fa1c8224b8c909ca4f9ad57a02e4b55ca71e48694b5b4e79bf0769b4eb3f7f521829f901,15ce77ac9748883894cfef735195ca544b73a8137b61cfec914f15940b1d90076ff41f7bf5b9e88e71d42cb96e904964c882b5e9e8a7980b8546d9b3a68f338101,83ec193de467819d396aa2fb55daaf234dd2c33359da50db627230ad5f89fc675af738c374fc3286b8240547e964ed78f5e620295f875c8a4a8a9cba8ec4c21d01 +61840a897fe715ee2310b0277e8b6c2ff8dadb5e0cdeb7f0879b60e62fd8426288055f4a1c9d3b4e0865fc1236e3fe6b2eaf7d4b743dc260fe9d209c4d63474a204f33dab62fabf35c5f264c65a8da0bcf11d4a7e9259aaad29182a42fe603b1e0eb1e820479c2cd41339058b4d8af316a9458f64b6590188fa85cb2,c19991a12cbf88bcb17a1b60b01cd19ae39772d0f45a2c5859f330df3960a684,1a57cdcd34d90983884b27f944eace5f29611dc8528413c0bf2dfb255b428518481a076c7b283318039d1dda6b7f5caff8a47604652265aa4366d5fb3baeff9b01,14f4926269a9b1f8cd9a304e6d5da4af5db65c4d10d645f40e1ab80c6f76472a75df63089638d6e3e255928db820e48ef998e33c6885205a25cc04cd0ca86b1601,f423887bffa5403211a2b62bd319ef25d8fa535c2321c8e10b8fa7f0c0d2bf0a300b8d93c2234b1cb91bf57658402bd18007d1ab43489b5410844de06a89f49700,eb337f4abbe33b8bd5a1286ece4b738f8a1f2e133e9a0a7cfd34f6b01007f15e021ae24690e834cbc05a9172dac6cfd23784b52baa2b1ab50a0c8243312ffa7f01,5c87eda073635ad5f1d72134d45e04e0feb4439fb85bae1f70015fd0a1a6a9d84a1a2f442de98fb072a35da5b1f958f0aadc7149b4bf0bdbc6a79e621f9660cc01 +ead0b0cdf8fb508055d177cd61677a1193bca883de35a6872fa137e4c23c60354b0f118a1f1fdd5e16755cc99d19574d24a16a633749c7a4e0151d8ef4fa1b7ca4300f67123f07a1fe795b409fc69ba1fd95ecc9e022788b4eaa2bc616da5f292f54369b062491c3faa134af840995312a2cee052acf636470dd9953,87e3418de64c594b25392a3f37756bd0c3f413ec36664076bb7de35750011f6e,3211235bc0e19909475505ec86f84de3181b36a34fb05a313bea431ef2f8d8f14dc0dc1c73e968a82ee54c1750df8a8e6b5f0aba187230d956b4b4f9ad10263501,bb112a0442974678af44e6277b4a0db45c9c34bc9c2701817919cab71a9eaf7646a975d1f1a7cddf6f9a84686220999d8600e176dc0f41a15d4a40d6dcfa9cec01,9348d60ffb85fdc13ac62f31b5dc653696f746ea11ab6a8001bd892879e03cdc6c7b5c1e07c5b6eaf8973701caa606a359f130d231844c1efa69d57a0039e27a00,900537d440b664bb3f7ed96e64a06e114295c20ae0b3ea088118a23ded2b86cb7a92facaaad855050df5d0fac44bada20596d0b9fee22a43ce1fb407eb5ca82e01,83bffb65293ec0207c39cd4c787526e22020813dd2daa46bd6fadc0c78ffc58e5d30bfc1d5e15b45de0bf7e734304a87661121b8c66cfd144eccba92bca3fc6901 +2e2ccc0e0154c284558db8385b543cf35814adea04fcaf7c5f9eca52e2afee906bd31f3472101baa8b3a0dfe786335e07d24553415d8d9f70928fe728e67845fa45bffe4cbad658623f9baf14793d08fdce21ccdb96c1af4222608af0cf16d578dfc1b06d36f8841787650b58f35e26d16a88f7291732577efc8182b,9f57800b2819f61500764cbf4ed3d63e2b62a4198d26073625c8aa886342df02,aa133118463b3ee851d7794114276dc0598bd6ea32cb295638b1600e168533db4ce5fdc19a7882ffbb2b62d63804db49cc7e665d2c54957cda0ba9913f2c55f901,eeedc81d0c7289d2e4636f1e363d34ed6d86a5fc7ca8c039dc1990616eea60d55512e6bd654af5d85ecde625d8d28cae9618fa6c6bea73a666dfe6c70f7b52bf01,b7d1951a4c81f4b3de4e97f6f243d1c9143f8358895ac85ec09935c226c1fe387394a1dd191dbfcd8d79a6398b54e7b6e23768d133759cdf349863ade830f0b301,1aa6563329c21457719205e12e5ae4c81623dae0de042ca0110efc07d6411389355d4b93d8097e58b2f357dad2699a0ec40ade58432c5594169663d708360f4b00,cde9ec19fa06dea7f2ed958209147d50f6f3a05de247dd2433ee06a1814572774dd8eb2fd24f26fff97010956e31b7621c9d08923a06caa6757f9ea1a4f061af00 +70bd26d55602d9b659e2d3d287609ef63bbdbf12be05d59c0c85aa2330c4c672cbff518d7afaba5ec7752b1d8585a72b86d9501721d918cb9ce5df52551552043cddc9a2b11729caae160027e718c09522c4f450916878dbaf648a533d627fb52eeab7668ccb41a246c226ab9d3fbd77a4199d12b5ceb531b5f78412,7fb2bd4c9f39cc2e531dc3d4e081a16bc52563758e68f236ec73a6c44c349014,a19da3f6e62fd8a29e6ab7823a599568684bb65ab79f268609978ade5ace16de65f85e28ae927d4a4a3d032589c0d6dc236af9c2d65edc4eec8100154204dfa300,1526e5cb42b8cad0feb918a5473aca15db2e8fae1cfacc92d1ff4e045b701a784956485dd58b9cf20e852d4107c1e305cfb743c54d7bdcc80a4722f27ec5cc3001,a6dea9903254d92b3c422eafe6690e78a258099e9b0ff730e1dbe691319c99471b6a13c94577503ea47c48770c11b0326d8469fc80e843d0257f96686b74055e01,6ac8076966ccd31c42113296715dce77b8113a21cbf39b4cf29e9478ac7a0d4815e7a09a2e004507fd0d36c7ffe94a6dc9e8950adb6eaf7c50c7be89c0e64c9a00,9cf86e59be127fa7a96cd1b67a1c936bb14dacfb91fae38d45512eb23fbce6cb0b5ba89b53898e55235b18dc71eb118bbd28a8344962425084cc74b435dd7fb500 +0bc41a286199ca49cba695fa21f1ca2b044c971b6363951c6a722efcb14adc86724dd078f0c7d1006e6a291c7f189278d0fdfcd869b2ceebfa85abd8a4df16ff60e42e674dafd4ad2d5603b9bf720f37e20b913599e98d586525b91affa79ffde0c629437faa01bc5b31d42d0ab8e4f63f731f1091344c8b28c08dbf,7916510d471c3802f6c2fa9c825ea9c32d94c98f7f113b7623f6d2bd8732ab10,cec278a11a3b57dbcf2646b49d563b576813de758361e183cf178e837328e2233e60231226ed4cddfd72f966443b3e420f4e87945a5e64a59fc7b0975d91879901,f466ac1cc3ead4df593722b2f62d131a552f79a6d7cb31024fc0d41ada523508542f3cf59a901d11e4b95b40e75674b47291bfd7dda96a16ff8a14ff573da57f01,bf33131f01eec53a3439474c54feab5049b9d10938340a6c412c9ecefb0f0aa54b6a31e82b7a24adc1cc15c2654bc0e97098ac84c67b79601499397075aab71601,2a0c3b43592aa083d8eb1538630632d56cde36f4dda4efd9ee1039b4ecb668934499a4d020e3dfa4a2963e8dd6f390f4f49c9679024c140eb6158b96d2ab7c1900,751338e9f2f6507d75bbe72351e479f9691e018c5e3fe62867af29c29eb0cf8f6261d641833d18a5be515f2bd90aff5d0dc8556ff73b25c4b13c8205d413ad6201 +1d18d38a823623474a7a3510392f71b4656a4370f0fb2b6463858b406de50f2a4cbae08ae22c05eb0b4c4d21cdad21f0c2c36cc768df1f7291864cd68d496cc4e1baddbf6fd74d29c1c97f2869bd0df396fac99980ade58fcba5672bccfbf5bb55cfa7cb775f0fc0c243d1c218eb515485bec833e2ee63794d4557ec,9aba281c5cd3237473b0848dfdfb4c4b07f5521997456cca29af140eaedc92dc,3ce633a5de3b31dc3d70d8940e316a22947e2c602f50da78c3aeb0fcb0b5da9b537e685c2aa51fd0590a1b5fbe5db06db983b6f58ea3ee5c74c29f768142c27900,80f7def742d9b9723f8f038c4d18d21f99074ad1a37e56abc7bd31113fe055a77d2516784382452b8e41fa17b3d0506c61a57ef1952d6c377246da0bf6953a9a00,0985b30810478fc048db4fb3407d4562abfd1c538cbb75fbdd827b1ca7926e0106e953f6d5c53c4087f07060b55cca74ab2b39f497e08109a1f483641e275e0f01,db920618116606a0a8d81336b6a816e1be4dfe5c7dd83b8d6e52281d36d59a2b26fa5a5fca1f9231b717b8a3f399b6cfdedfee6697cba62c895b1c2987cdd6bb00,de31e609061a940ef4e2bdaf9ebc970e6fe68a9607c566566471c4d00718da9b5b244de54c14acb72aa4819f88b00e0319a214de02ebce7d368e79182d889c8a01 +3e9944d86dd9395d95c89e0ce4ee743c0122faf263fb91f6b340c52f220f08b5271b76077a839e4fdd41601989c55fc02871bdef8c33aae3182ff0de8cda450aa93ad31941ab73db9164cabace9034c091b5126669f41d4b458a0653f4cbfa95fa2b497e8502a3e8369ecd22f808fe9f096508c031fbe5e41984f511c1,7d265c8a8b89b38a538a379d39124a5a176be5808aaaf8e2304a4d4b7e406bbc,5f909587259d572325bbd90544aa01f9c03a42d42769f8301cdfbd11fcaf397f4ee7d0f6a0f87b9d37823b9d64913d723437b0a6f50e3167cc47f92d94a6fa2900,5b820b8e378abad15353cf3067243b243a5937a24c04e29e1e6b53b7cdd83d4306d461d21aedcec41f8f84e37af8cf532def5c7c268e67681d9e8bc69b9a85ba00,d9e9a82284043ec5d14368b5d90dc5f0a4703338bb06ead866c7d5ed92d17c69086d071044a36157436f3ea0cc6895bd4444a9135862abe18685c481dbb9195400,b6958577f70f43a473a7d2bcfc1b166422e0a24d17408c89e8ea2a0757ef41e42582d3ffa570403fcd539088d5f5c5a462ef8e3e93de0a13023c61914a397f9301,71ed1c9743b8397fff468037f935cbcabdc9ea1705d72af2c9d66b422e4915493eff8bb9865367fa1661b65821c8b5b1691591581df284309feaba173804ed8400 +cdff8407fb782f550a4adbc465a1ba4c60ca700263eebd4b34f65e612651eb47e8957cf68dfe6828f8a4f5f73e6e9b756925ab136b8fc5db9abfdb05349053bf61ddc934d82b09615b51fa04da08b97d7e273bc91410edad8e26ffd5b28df0c46edbb4d43268c45bd2819c5893426afaf7fc5d107812d337463ba0bb56,c098aad43317dc427afe2d5703db3d5ef2a5809f6c2c51cde587bb5e7f1c0cd0,d325ac5e5cf3a07ffeec9c75a5a57b4afdca00b22a9914e0ba97c081cb5ab4aa161b04d40bdcb79d587face11723cfbf860dfa1c72dba19aea1b0154ad7f148a00,08515279944b0bdb09a3baab48fb6766beb985374fb0add422617013abfcff5568c86338b883dc3258d1e5a31961b2dc504afb32a77cd1f9684d24f0d87afe4701,084541a4acc9675b1c54bd7ba31e32bb05c96c7b1013687a1218880eb83cada74b86d2bb71fddaeea3ee06c83e695cb196685db953f14e3ed88a99f495bb410600,33d833dae5833ca03e00d3ac97ea03eb4caabe66aeb4fabb838b753f42a53ccd51b09dc479dbeb10320a7555509bbfd39f556c68aaf14e530364ae77456860c901,ecdbbe24685f2a3efa972c2162ef7d9e9ed67d381be7262d3c41671bd1650d1c2fd5ffeac925818446e630515ccf41460a544653244bd050de19caa39d75b18d01 +a203da248dc1191b5050d41d1b298473d90695204754c32d11185b6ec433c3c58217aab95343ac568391d1f02e419b362939774d431f663145a20259b051dc8002a161709b2197d19851bc76ae76bcdaef19de487c5856155b9e1a4c3a6e19e4587fdb2d65a9c46a5334c3a360a9e24aa2708d9d05844ef25a8c34c68e,82c2a6fccefd321b85da548c11822c7dde1606e9c310654e8d4bc0246e7d6db1,c5a9deb1f0df710e4603963537b0eba56bd1663abdf24051fc880b469cd757b04cf7d83beb0797fb01a5dbc7d5d12db8c319c96eddd79f041037dd2946c2bfe700,4aa5c8a926623f41f36acf1f0a11c01f1936c0f21494840eb70af3ac35f5601557c7570801d3bff6a444cead04fa31cd209b0cd0868df945753764e14c7b366000,a9ae13af6fdb1829018946e530ba3d7580956c25461ec5fe317e0557307ae57758436b22e9a6f5249dd064be144d1d0c78fc386e61052145159990818209267f00,815af56a610b3ee51b6730b69cba49f88e34de515c5fcd85b1f5135649750366105ffe0ec5c5a695396b233603715dfb6f86716a250fbcab3f178d208ef3597e00,83d8975f25e6aad4ac7e0e4b83bc15ddab4cbf3365c355524354993c12eb0dce53bb07be906e6a5c26ebfac530781e085f7c59199a18c507837d2a21f654da5200 +4b638a9080698d509859bc2215a6ecee5c31e4b39a4e2dc8339d7f8928649cb7ef6e3393899744a9ecb65a3ef84844d8472387e6b6cea4eb388042fc5a52d3a2dd4c612806bfccc011d2cf4b98c3c8b1ddfd2f27648f805bfe46378b4096edc699571a0e58f42540e2987013ca6ca4b2a25d4d152f65484678a1712a9d,f2929aa58eee2e1eea63509d613710c949e3fbfaf94db711c1da450b737d5b40,b4e62b35eb60a8f90504db9cf2c13d2bb935ad39399c8f948595297329cd751078055bd8b68c517171fbce3d0ac0d5c6454f00be0b9d59534361ed4d464ffcde00,7c939cba0eac81d0bc38f565d647ea8b4429a13b0e523454cadd9cc0608d30f711a1237b0bca2e36ddcb162e3c94a1ecb50f4833f544cc1a565f28a01292315500,c31031e80bf970aad65fbe70d48796d1e541c6e61d5dcff037f481b497afb9ff70d16b511826b89261b776de580d9faf5a9942c0f57bfab1c1b654bc2a5f268d00,0c9f95110207ba3b5fa11fdfdfe6570060fc717170d4d6642722a7af10a4f1990d35699ac41edb50a2d1caa818b8b2603211b9676bb8c2f1dd2c5c81a5c7f7f501,3a05850d34fa610c9f73a228ce9d467221724a6b15b60742e4eb926791ddbcd458220c797d162585ac4d815fe3d3ad94d6c79cecf6aaece8c738a942b037496400 +e08bee1c3adab55a5cc4bcf2d5319a118b6423fb914a32187994d44de4559aa9f4f30235a3a8b15a7f71516fb71afcf9030b9d3610fdb7e2ed4dce66c49870c07121eac27a53a0be4ce760fedb98d5abe6a2145a8e60cfcf59c7d46dfc41e68ed5f88e5613793c8274119e2a39135b1b1a45af3a8b113d6e832815bc5d,dc2d34aa58438068a913879a93b771c2b952169cc7a7cdf3d90a0dee3138bf71,c5f7530a8f7f65b18fd78b2ed5dcc9b53fda11571c118b52192002589f8f4b4933c2dc2be72861f8a1f4eb7ad75dc2b514279da89ed1958dda47b91500f834da00,d6c11424c8a2bdb88643eb715573a57ac3c98d8002adf918f7f81c0abbf666b03139a1cb254a1861bf0105a03e1a67cbd39afd9b93dfcc90c66de3ce9edcc7db00,86ae8e1b01a515a3facdcdf00cee8ef9433522cd4209d0914f2d420b58b667da1235f38eb87f084ed5aaa70d779b259fa0abc684a7514a802bb8d7ec0b82a10900,ad55e54b7e67d83105b4553c00ac99d020843c50be2608fa15661ec92cb63f397a45e39c587021a65e79b0986550e079d5196e826e3eed871889079541e7184601,c0e998da63b3c3e353faea6d951fafe6b0c4d2a939e9d4e78d47c087dad6fbef082bc4e179fe5ed3bc52a873f2a065dea2668ca5f031303323b9b86e6d1b901401 +0e9ec782169a7c604e8717bafc93c343e20374ee614b7541247e25d1d8d22bc1b426d3678910f2c3bf84f667080a20d966973f91eb9467156f750cd8605a51b1bacb52d702a90725fe726bc2008019ba9121ea11493f69c19da259ff76c60af4c8e60e184476cb8943c637734e15ac401d47dd35f59f53f276a8928cfb,2e9417478bdf664f7f23245e349c8ecb566cd680a164c0504c01a89f56e788f0,0a0196a2ab5b1949b2771e44883cae77259cff6b505599c080ffbe388c6e478640cde408549321e0b74eca5ee7b08c801c6ebf318040569c5a59b398ed4c0ed700,676ec70cc58b8c2a68cddd70e22e8dd1f881c519e207f0f4e7102c327dc9b6c2351c6208d29836d28a6bce372583921e30b97fc8866480814c3df1f50013d91d00,7b7c5be6d27d17448b046b0934646b4765523896ca1e8ea35a7af543c6392cd55928ac42042672d25bd6e7690ee13c19f45798a2efcd20952d3f14d1a50e8fb501,38fd15b89a6dd4b89ebf1b9645f7948febec7dd41fb529c6f540e7723a6329fa6db76754fa5ad1f8221918de5c19c8b7dd2acfd3d66e5768e949aa6f7621215000,6970772f73a74b5e059d509ab1bc1ba7e69c5b7637b55a2a941e881636ca307f0a34f28f31eb588308058e924b52e9100a5807b5fa68b350046cdb5fab5d7e0600 +f90904f1ced0d61d6ae2c529796c3746ab3dcdc0e3970222aad980b5148bb8fdf2d8c7e9f8e63f5dfcd753d71d7b26e50f999312518ace5fb65b68496b8201c0a9f31fcd4005534eb59288321ba500224acd57fcb2fa7c126bdf1476fa245f7d8d8234939e2b4a8e267c0fb6dd643ccf087ad75fc28af7ba983c8892c1,7b716e98e0773e33d415f514aaa3ce61818067a02d2e2342b11371cc3b7964ad,c5317e78238b147a1fcef8f3381ffa114b55efc3795e4ebb873be1ec57d2c6886001f2634df93ef054e2eeb3fd04bc47371cfbf9a5752fe5c411a13648e8e8ec01,4eebf247f37222362dc63e985aafbbf4e747004593647741cf35bb76cab094e370156c3ad4cc8cdf801ec1b722ad0b1b89528049a1d7ac29c9e45e4f1d22464600,1e04512389879444ee551c665609b0d51efa84b774aa399892f93b1656b1233b26232d96551d8c9a9c2cae8c198e09f6e1bc6a307633af04527ae61762dfb12300,9e0d22dbc09b39e1edfc6caa483c7febb170c61cc6c66d9e19b1c0ebf3c91d2641da9bccac169356cdfd644d61461452ff855ccb068074902886babdbfaaf71e01,c3a78ac8286aa1ec39b692613be82f6e34267c76732bb868ce4f03278ecd174c635fec29a8553543ec21b827469e4d2a8c69d55584a1b9e3b1d419421d3c33b501 +160e5dabcf34c9ae50b905f479600fc8b2f316a53afda032ba9cd2a86ddc428916537b4ae344795fc0bc9540ebfe017f894b6de6eb4fbfbe636a49382ae3282beba24fafd12e8a031fdf68596eb6058b257eeafbbd3e005f6fd925dea20d2ffbef19938adb340c068f469b7bafa5d2cef8fae30c945d16bc226a1c3819,854c9fef3f15dfb5edc65c37d8c1ecf2442b5cdcd1e2c2faa909590f92e27df9,c3f9cf9ff6b75b2113160f6cd05c67b87a3445bd36f3eafc4fbecd4945ec6642501a02157c12adac763a49ac75ab5918ec50eea184a278083fe452fefd7452d601,31061aec76f911f85fe78911b99a6702ac24613231d72b65a58bf3a9fccd2a7b6236228ff2e144312ef3343e7f23707359af7f17d986827af732e00b2dd912a501,433cda4ec531370413082f9dcd9d944728c68c2fde4447577fff3bc3d807c6ce258c10b28bb7dfb879314aa9ee2efa290af61a8c5808b0a7490e34e8a267b7ec01,2ce4fae95aac4f49044cdae446b838c019ed0a39a99c7fcbba3286ac35783fde70696750323ddfb4fb0099a6f5170359643683196ba2f284ff67e3b66e0b5a1701,6b4a02f0f3ca0ccdfaee8fee98ff7f98e8507a9b9e13ac6d9308b3e2e092aedb77f4f107a3884d7a4ca7987d35b26b0e0c70df5993d34e47905598033fbb986100 +8aec1cbe60a958988474a46805ea1526f71534c03ab03dac7bcaf94503334e2ad43c918f6ea3cd2ee30af7e08d93284a6c8f5f58a488f8e77526f3885021047157546a693d96c313f5c3dfd6c635b40b56d25cd53361830b9c05f38c50f4f3743fdaccf7c69365624feab7ea8cfa82b3406d190527cd88a6c0d9952656,c34da925ccd9ef1ad3d400b64511ff869c58f70f66f839cf90883c7c8cb23148,757023e9c760523115410ae0ee36aee44fe0f86b5ea9bb888f12148881925e07414f9679ed5ae0a9f25db898f5f7b9865cb2fded7868f3e9fd95774ac1048e7601,00c31e6af5a167d16ce83d9abd84fddc88d51f271208c09060ecdcebdb5ae4f04e0939dea9a99bcfc847a4cbe40db62d16fbdf43b5e67f2e34a37888e740cea600,666bf0e7bed6740ccc78f1ce6c666634f6f6c497e2d64c1ff0fb0017552b76e26048de6b129a87355ded5706a4b53e769eed04f8b866f96c28a3cea88944e6e501,60c64f40677f29fe9111df94cb6e77cacb311064c85601cac33b73f4f8ec0dbd00fedb322eef35cb4c042cc7e471cb929462c05285859247b0dc8c28477fbfb700,a999c1e55dc3c0c778dfc9018a4db2fa3603ae552cdaf72f49034756364c80c34a9337a7ffd82bdfb6ce5d270a6560fa6f1ff4d6485b7043336178a169a5c80b00 +da365ae1a39b7448aa92de8c24439928dcb915393b060dc390b39aa55330ca32726ffb83a6f8c0b09c1259d96fb3bea011e2599649f0c8e4a0eddd0ca4abfb53f0f99cce74124f601aa8d8ef4c13cd2049a00e5887a7184a512ed3e710b4cf714d49454ba1d2485583a6aa5a3a4fb046bab4d14ff00948453d1517a74b,a028ff1a292232fb89cbcb3c4ff6ba870830dd19dcc2f51334d4a05196aacc40,34af8cfefb01b088f702de318c07c080e442b762f42db0d4ae1a6707be4b228330cdd26b5068718da3b67ee3ce9caa3a27edebe78f9c94b661f772aacc0ab19f01,c0fbeae0754d01bef20985587e0cedb35502a831f0ce92d9e3c4d93b2d7b64fa03196ce0a8682049cff89155938c6c11c4733ec70216f26f385020288f1c21fe01,8a4a47578a874a3380ed730f6a3042bae68464106f4533eafd79b98f6b261c23681049a8115756d3bd89154822ec7b299f2608518aae4ead204b60d87d40b86300,2c0f59f907d19faf2627b9edfc3d4d91be4d7ad7251f98fd78934a2e2338f7b07f9b7c8f24654b95b5976949770e88e9f68178fe659ec2999791f4529624300f00,745eb5fa59cc56176ca6a8cbec2a6edda713bdab81b15e35e648cf93e5f90723633d2754b9d2809a5180f8df7505ab61bd514d9faae4aa322ceec88b6df827e100 +5e5aef91b06667e48a256c86318125f12c7b4b32b36f768b28ef9275fcbbb72974bb6cb2bc623beb0245e1376b7de044d273caab3ef8d4bbf0a772abf03a08a63f31f8e359d60227309588a5d9129de99c58d75a35915ad64665ee4f40b6629218db637f9b6562a82d50b2aedbed50478b24b361b468e184c9140fcae143,0058dc9fee3ea242c2e1caafd7738b9230ceea7ccb0c44a94a98867a46cb6d51,16ba480734c8ad4006dd0b2ab7c75679ae3015c3035c06cb512125dec77b42ab329deef8928d976820584f412e8826ac14ce2cf26b96a1bf5ef102b2eff2d87600,a91a648fe29c631fc93d8e8373c06afb3c1e2eb4cc158c2c30b7ee24301dc4786e0636a8d7af7c5d3c9afcf413242c8f44b79648c66933b0893a964a425b538f01,31473c30aae5e2b9ede3f8c01f84ab94112f2f160f5a0db05ed5bc07eadff1ac6c450740cbae634464ae18336e75d37da34e5db756984bbbf177f0ab69a3130c00,4b806999f05a51557fd26c53c97c4e30b25fe6607fdd5442da45d3ab5bfcaa050f89bea5f9b23c6d20aaa034b3c4478d4ba2794a4194c3074d7a9657f99bdaa901,3b3428a17d8276312092765c8d7fc654570e9ab203e636299fa52ec884903159699416ecfffe24d7d34b66254bf910be0702c84566cedaf3e16a5b16085bd3e700 +ed96d0f10321bfdd11c3cf974ea361ec4c600651a909c6b3b187d7b6d2844f90fbf10642acd3a4ae94148f00ad10e0a623262e84281e1186a82dacf5ec9acb6a833db019486e9650cb85f5d2939cff6f7a34dfa7f792dd6f8a45738e275bce771c62bb4864fcf44982dcbeda530186850e3449a5adefebab52cbbf00e953,763cb7ce8851debfad2a78b603c0feb1448abb9f60b0301f7a35ff954a31ef22,8576f6fd32cabe514a412a6fbae86970577a7749e3a15d88fa63d2002b1ebe0610963135659add1261d7d1c93244eaf66641297b9379c0260cb85127fde7a43a00,3e01b4f9b8a5499b295e8041aec71f8a05848b454946c2b3cac8432915969c292b813c81049d6fbb13c714e9ba5459a47cbaf1e775c9192553beb6142d86551800,aa8eab3b2e09e149266a45f435d5a9dc4863f683f1a7ed2d683dfd1f6bbbd09d160e2b3f193331053062d8f3a596755dfeedc5d81a8d6cba4ad3c99d2a8324c500,b2d5e3d00e3d018c846f232721b66436f8109d71ac75e2cb0148c4540bad5cf6388233ef2f84cd3f496431d58b31ba6749947482c803366381fe2b83e1b7a30301,c9f84d1ed5aec5d67abe2739cdcd6856a870d8999abafdba9add8cdad9e781d83b04ae22f9f7fdfc8c10ea29fc7e68dca2a8d137b62b64e43eb70f373db4240500 +016f0b461d4710a167c6e6f9a52252cf8d96f7e8a88b69c22743687dc11f8601a73b194dac5ac146abf372027ebc8f54344b8e4a49834b786badf63ce3c028e29e3f520bb73a14df6036ee5b6358d980fd18f4b6d99367344001b18163d1f05adef8c54ef19a4fcc05cc520ebf06f9252e43271ad5bc3176655132570c44,a9b0f19a6448edc5d4a28c9bd9ab368780ad7ba1f76799191a50a7d3ca692b30,90f6caf9cde2eeebcd9fb1e53dbb9ad82e2c49d04e22664e7322072b866294987f077d08f67148ad7e1898e6fdcdc9b8767f946d12c27d32b361a2768a75d5cd01,3091810e20206123648a4fb0fdba426d2ff90ae420154f5a389546b54e95dd3f59fd4fc88adbe39d03d38e200df8210de0a16f9499237d9c54a848ba29f127da01,2652a44cc0649021405d1cdc2ac0c3b4ae9a8144e6f0d3e2f675c42388b8a7536e15a7a717134225f33ffbd8c42c434279530ec392c3070ee161da071a70311901,ef7546c957c20048e6bdbef825c4bae0b4052366b30365f641c602beee83aa860ac3a6a111ebc8d6735379e9f9162a95166d029324e6bc6dbb58738908795ff100,93bc62d875acdb4ba8a44b3367ea0b01bc306f2e79f0bbca5362df9e3e1769025481ffecb3163808b541e37b756fadc1217e92bc7c39a6047c2f889bf5693c6900 +659285a285c35959fa45f4d511299c983147bed8849f8af166e78301c5082984a39abde381cb65a5bd27408df66ab000090f9bbb117d97eaeb1ed2720e516648dfb2c0fca90ac5375aea40ecae2bdf0ab870fb1d748a9ee6b4a9d8fbe2e88cce42bf745ef5c32d7ad0b6e41e3caa1bc73b0fb232c8c81b99d027022a0fd8,a244615d09194e92becfc356daea7baa0bec67731a831f4579b839063f8e6209,722328be7f72ecf163ff1e3d06ae542e0229afcafb12814e4928beb5327dd2997900f05eae69b9bf0d258cf89eea7cd3b4156d48a99f6d2da4fbd292266db44b00,a1065df98426593b5e1da2ca49a449e7394995f80fda294aae44a0bf30c2cd373bb8206d1236a24867f4ff312ee7d613a2ce620db4bffde712d93454fcd93cea01,7d96257c112e8f64b752960b55e3976709fe21bbd075024598ca2dce594c84b34216b92fda20c2e2f3d3be6e0d747f374d3121a618aa85b40f27e0781f875bfc00,cca48b943a55ff2030a300f2676aedd311f887e0a570af7132bc504724e233ca7ade8eb88ff38a279e4a703ff49cd7721c150aea0709a312a206fb696b47dcdc00,cbc1eb69babb6724cbec7f764d5eb0356ed0dd9c8ce8937452480220481c586b26ac16ad55d8df41d0571febd8ae04f090e53878f7a00766ecd4b06b188b6f0c00 +09ab1fa3221274b04edab6d39bce1bd3aae4149580b7a8611e51d77a4a9a8c4870a6b9c918800dbadda41e618754136e3e184161d14270b0949128768a096c7a36e9e2c3ef4829b966fd7788d78be6501c33b22894aee38734695d75953465f7f4c118172c2393fedca4c13096320897876a8db1c224e4e157fea25c7ab6,1141c17d38103ef639ca252982a02d3cc03c46ba95476912ef31e5946365412d,6ee886b12cbf9f23cd6e63efab5634eb0f71bb11525410c99153398a1042577e4962b88a90b3e0822246e611e9c11b761322d0d723228eac785df18569ea334201,d44b6e63705c0ad356223be3b3307d2fdc04c4abcb3a5943e95c4bc7f501fc7377f16d4e71d5b4dcd986ccc632a61afa04aa1f458b4e39530794b32d56fa0f6c01,b04b6d598c50335008a5b7a2301a6edf24eacc80730f2b185dac375c50b8331d6e7acfdb244645e4e402f5b877ece2385f0b911621cf5d6511e889f7a38e5f8000,17e52fb3b82b1a6df863941d8199771f18c2f6fda512e110cc59c15c0b50d2063d234aa12df17c69ea023d54fff2d5b3ecbc3a8712f68e728cbfd57fb0e0872300,dac68ea7ce3cb4792ad4bd434a9ab1a288525af45f766f2a604d345434a8288c53eaf83887b248ed02317f4a50d12192418c095dc6fb1fb888985734f73079ca01 +b67e4581f3b6ac63877788c48473c6220e4ed374ff4926583f494aa806fe9216c987487303a88155140687e2cc9ec0b4883df1e57616f6054319d393c18663e8edbec326fafbc37c530184dc5c220e668e2a81338bab21bb066597e763d3d0f5a18d27374a4ed8f97992681b4937772725057de0c22c49ed97331ca0bf2a,f27ef2f7f77886dea175eb88e2597a8aebaa4a62ec2342ba0a422d2563ffa9a8,d79a4c78b09b8287a83e4aa31f0a1d98b124bbf14b94d10ca7a3ed9649fc08535268281f31e15a7bfe3adf27f2625cc7e65f71ca6bba2fb9b5c26674b080b4e500,e40008e459b454a7e6628dbc8df88313d825911a92765c818f41993522265beb6212a47a0a4d37c6c04f3e22496b75ef2d6b2f6b72bb71ee54402a407357aa4e01,a0a1ba4e26b213b12e89aecd60b25f39b054928bafa495fcc0dc4e037ef334413e11de2b9309ed9d3c1b1be711305aa2ea16ca6b97d5c21fc0bd525a8ed7837400,8d133b753de29f723d77068ad77249c0734e00dcfcae71c6f9ed922acd1138e0720d2bf8dc33e0e5f39c088a14a046efb5fca1e6ecdbd5ff1da3f855b5a2871c01,186416b05b09b7b56f89acf1f25b4c8cf268b65d68e1f16abed363213ab4b7580bb8a4a628053f3a33b056705f449243b9e80fdaf0cf3f4c6d16849e7d89a63a00 +0db3debae72af449b69932bca3afa9d9efca425d8c899b74194d0d474792ef59a52f4afcb93c1e2c1d28b6ef64515f21aedeb92a688469f72b985ec8db151bf171d4bb6f24fc54250c2f12b5eb9008c62a8acc39172c418b5fd1268d524b870a0612e5ad110c95a8bc9f846f5ba93e3ce6a729bae600cc5c06d526cc3f97,1cd190fbc709cd91186f707332fe8b6af8ede5cdf36ba8e2b26cf5941e48a466,3edc54fe8255b76cfae762d09675a540a00ddabded7826cff8d974cd61b6561974a2f0cf37e762b15e6fec5294a31d29cea3784ceb07f1869a98f814f0a02d5d00,c8627fe89849dc76b26ced2f7ac27aef23d1b38d64dc642c48e06fc68370442919292123ca5533adc12b58944f58b09b1a89df345c81e7a794678b62deba262101,b64b94db50c3b196a0bab09b3633153485820ab958faf7ab533037d0b9b1f694030f6465fff2c694bb3fc90fe72e9b56bf0d756b367fbc373e95fa9797719a8800,787fd2c6d0a23055df57959415eb9b88288b45e6f7a97281a75b91d52659c0ee7fe8afbc48fe8ad5fe9c7774969aa2b794fc651145403c25407d2db175f4f5c500,8f26536fa69564b3394a0ab222093e87b56b52924e2daf0c95d41a895652602b544dff45eb47dd8ec0e2ed0da1b5972e86a57b95b883b3e517b4a6f3bcdf303a01 +cc1e6197d899881915abab3d75f8bf92f553ee170557ff421f1691cf8720e20432fd896ced70d90c03ab4a3d0ef336c16814e65b0387a4d93e751ecb7820aa8d4e00d28899e5c3a6f3973a2090ab1310a63a4e84e8b840aab2bd03c0b30115e4346fbe7bb02ec4608b1ae8aef8587adec1d470eb4cae07721f157d2c5c43,8b1b6dfe0dd9caf8fc8e0e4444d23e36e702743c772ecc2bc278a5324e2632e8,36c2a162f142b4052d55ce0ba6495763e4121317705bf78937ab73bdfdadee5708d8494d70ed214ff3258ac864936f5f4945c6b72e69c3b348f411d22614a29200,8567e48ab679df313621a763b5581f5f9018202b386a47d483b6292bf3b2866112650c5d8dcf18c565625b67666e347da444f6168b596d28d4ae4887fbada07d01,8868e01aa04855f4dada913302801c4438bfaa016c452f44018e21e73d7b5db94e329ab7ee7bb34d5664b2b73df5b7d7c037a6e5d8231d2fbd9530e9a981606301,63e939088780d7dc6c8e3d92d996dbe3d4ed64d388b7ba4e7f75adb1ea88335044ffb425e33184b0fff58edf389e8eff829146dd035a16b8b649fc05d940700d01,4e6921f4d999382539d6cedfc3efea184e247a04cfcd65f266bf0b1b77f178c91cd53b8f22d55c39035942e04777e58d0164bc7dc46911e9367416cd95c43df800 +5973adf74e3737b5bc29547bb5cd461ea32e8dd4ec7491e20ed0356f94cb89edb0a384f767255f859074284da6c7e0ed7b4eb90e57023ce6c756bdccadf39435253cb8b01a2a3918fa8b9bb1f49f556803fa82855ec655dd351bc76e9513bb6fe8985ac5de38afe745ece2c9ca5bfaeb776d0ec0efa85197c734127be14c,35632c6c52a6fa1fd0c13b75d4cdfd8e3f4420e39f2e29de9778f05a7f31fd62,96dc7f91191b96a41c0d64e9a0a8501c28e46617f0a2e45859c81f6e9d093f13591db2d6fa55293bc09480568438867d2e84d97096336d296edc065fd9ee1c7001,c76652f4177c51c28eccc5d0001c4d7277e1aea6a7d4f9b590f52bef1c679d995e9c44ac09c074610cdfc7f215e755839a53a1ca569bdc3984d026063e34fec101,89701546a57a7d2613f0cd6a2361955d7e0bba7c1b521faedd95f48244b307de47af8da215927fa1a0eb27dcfac4c8bba84e6b87ac7dfe15d9c8f96d2c7547f101,c567905e75bbbebedf7b2689e6f7055cdb963934295b771d476ddd0bf09d60ff087559465b2fb901c82605144294108f6b62eab5af0eb3b87f5104fe3b108ed801,92d054ceb902f1f793ad9597aa61bb2cb7c71e3c261b0d23afc0f0b4286a1c2f23d89e872840feb625fab46cce8be21be171d78f8832205d332be6b3b95299a400 +12a3955ca9bdd622e0f14e4e12ffaa19b0dca0c2fa93f67fe7cbff08fff9616c44cf24a34d274b3aa7fa2b8b20c32ae01874c926af239529ffb5c252f93ebcf32436396f0525f32fa75deba4508cbd490a829b3af9d817e3078a92e32bff681b2879b08694108965de9235e4ec2a7289a8664132746c9b267d67c36a56d3,5de4e9f485083888c47bb82060c89e438dbf11af36de1d4e7fba47f29b7d98e8,009fb78467cc83868a4e7e47ded6b7974599411a21003d755bad893a745ec1652d44e87f49c66b1fc22d96681fe4e24443b4598f645b435640aa2a9f49c2b28301,49b333f6f19fca8848725a2f7168584ae573065b9ce4689d69686597926c75c03823a8a4c86d5946cc4de0f7c2dca41aeca0478c0ad98da9181ee2399596c1d100,ec3492ae9c080aa6b8c638be8c54ce82e04bfae5bc76e3f5999db7e3fa87e00b618bc434e572fc34c11c13b9c55b71b017ee9c607273933a3e34833c2907192b00,10abc451e30bef79e969cf06988001fd5772df96f2a107b2e2c461d47e0c30eb09b22d089e21f82a0dcb69733c75ffd208b5a301ad3a63c2eae00c737cc3be4701,9c1a84c082dc51954e3464931caf6a72b9b0d0b501f97f90c7d373ab363ebf1d7548404b29a86b49b1a978004127fc3976d98e9c4bc84f5e938b09d2a05d25a501 +fbf0d5956d70b558530c2111259da0fd035964d0f3be497609d355935251fbe4c9afe9a1c659ea8026d1ca1bfdfacce06c95a7282f63d38a31bac48fecefa22f10612b5cb086d049aa3e9da4d545a7ac11455b05d0483386f117eaf413c33826aa600c27024ef400d8ebaae36a21c07fad7986e132a0f6642b93e887846911,1c21a7ae83ea12c4339de3c3340d8eb40a1f7d238fe9770522b466badfcadeb4,455f60e515564bf34ba2f7777e51659a20483ba63eb693f605baa7cf2771c57347c44cff5720fac70e0605a4e4ad8255a5ac6bfb8fb1eb0d4ca6b3cffd2337c401,fb1746c6fdc3de0e39f5a909cf060d57218e7c8777b512d64262b08b3bf3d0ac19c32a12ddae4a3f5f6b35fe4833f51ba43f4e804392140373ead85332dead4a01,983b4ca904b0eb01df65eb332ed3dd35f62fbd93674df10085aaa5e77b2587c963ebea8ea24f1157f96b39357464152022e0fd745b3005215539f783a1ac2bc800,0caebcdf59f8d1a1a36ba680de77efd84a5d094a3068b235bb06252359144c151aff72e36a975d6e7cf4728f83438a81b278bf61562a3e254e4b38787bc3e3ca01,361d6c1d2a90454a05e75e6871e633f9853ee3972e00aea716522716f6b9f44c27e40c91d49ed752a33a1f02a72792c35ec7f2bfc58af2436c7631b4f5cf2dfc00 +dfd24148c43572dc71e28ff2e84d143d5516daa363e81e14b1587a858568676860107cc640f016158af2e9f1de5313bf525420d0fd972226e69c5a9bd5c3a94f604ccc5808992ac5b3ad0ff5039621d3860f8aebeb43003dc0a816840d47fd3039461129e8c9a452ca3c0a02452fe61a6b4bef65955a60040e9559d5d135ab,d4f221c0943f747010c6b3492df27d4c674d6a562769211e6254440a6d13cc0f,0fa49b3d36ef46b012541f5ffe9abb02fe64a053edaa0b0fea708ed4740c210c74e5415e01753e45f395b9d43cd64fdfc8a675f8cc8b6926781af707f8a6fc4201,392da1e24c1cceb17502dfb1758d82af936ee19e63893476fe48a89c428e090106f78cee44d7d722317e800325e7659d0fd761f30ab60da05ba74317ec3fdd9900,53e788ad6ea7663c9ea84b41a68048ed0d88d7d1f7b57724456e67aba4c399b329a0911563c5936c364050302d54daeea6324f10393080413f4c9048d163c3fe01,6fd552dd315c4f0411f71d403653244ae7148e834112964c9b68cdca6133d22a241dd21cb96b499743e76a9ca9ece33fbdf90981b15183002c91c98a111f29b501,bca77bba159a547d98864a1ca0a2087e15a0e736fcbc3a63a87a9419e4c3c8f321bf2b6134938dbe120e0c3b81e37fa67e69688611f5992339461db553e6dd7801 +dd8cd089f3103c14548025686df3cb86aa90c54cab055003c491bd390c88542841ee50293add8e2aa31f42ecde61fbb20b886555280750a147a7046c61f5af741b34ed6f15446a37c8d08cf28ee61184d682a327ab4f23d5ea9e5b5573f09474aaf96b726f09fb092b5ac7dab169de246c534b496555aca45e29766fd2e640,1a1d6d9e2db72b5d7f136cf89f8e92baa2174cc7bd6dc111e4d47d5b9bb19b35,45320a59c3759e0f8187851583a109cb251bd193516642efe60f806f47281a95615ca36433f7727dd5bacfaa0379e710ad3ea7359aa329b8ec3e5a2d9ff4f50100,74dba918490d86831fc1416aae367b454dfda49c40d7ac14a6378b2ae78e3d2b5a977434ba511cfac1bbecda3271e1d7cfc9273f70d5fd59e851233f2dfb60ed01,4aa823bdd9621a81bbec7d24da00a0a51c9a413cac213d77b78bc83216f18a682ae5c2bd1a8f12569d709455948749238a01f716f8ac54fd8c55752eea119feb00,2cd77d4b568694caf7c515da927805cb145f404a2477b8e12dbfa271e0f2de6d5f87d9641579791476423008ef5c012756399d62715b0b13613fdab8ed8bfd9600,402f7d346f8e7fc91580436e1bf16dfabdf0f55f860c492ede28a94bcc2c361d6e0496161a4ebf95ab6dcf1bae7d74fc5292f12e5834edd24da30ba2130a3b8b00 +56b00ceb5d00de0e062c2aeff3a3b4e613a111aac0466cdeef6616790b6a947251d167b43ef46be4b3ade4c7ed0abcb8723e9dc36b0a7dda20dd44614ded30a41fa5d5275dd059f43e6a227c129ea8b178054eac7f90ffb518a1be264f21149bc48e8b103896870d0d93f90a0b974c91ddc59d00d627a5ce1e90006fa46e3b,7ccb8a3e11c6b36e36f2e4590cf6e73b17cecdb3be61aa67e6b7a231c1378513,b04fc83629f0f7263b31f11b59bdb0d186d37c1cd77b43360987e618a9ef78d427e9c74547524fe9d2cdace4506c56f83be0c9380bfaba909c34784507b5923d00,6416b424c130bc637e40dc7ca9e9c3c4b0909362ce1db6b8b439fb7dad048f1919fa1c3e64e93a73ed982e99b5c2681e72e2b55034c84725e0fc0ea449fc088200,1e1a659ee49ce4fdfcac817d0de869c12a05b83caa666b3a54a331725abd0c431a918e6ab72ef6063fdeda9dca58a4f82cbb9c622cc55f37060a6aab6428f22701,13327e04438859d3ffcbb0a0f1d357df58b857c3bca8cb7ab5b7c0183ee164ad46d61b4cca7c30eed77feb9eb1fd307b2a05c370d4063695453e577f93f6077b00,01a9f531635ea7868a11fbecf2c5c5e8e35bdb34cf81b9a74ab5225f31b1add25922c285ee981e9b3dac1aa96996742a8da258374a8d8eb513d9c5fb4eb224ff01 +8d96276a59029edf58aca98c278d2ec44931b2433dd02ab8b1244a3b89b6bde17f5599955f8c6e274a7e1759204b69271e99e669a66cfadadfe5f77e49128ef08ad9268f6c2773bc4c2dca5695ec89a936756d21d0371acec5a76987fd77a7ecf7b0fbc1dd9716fc0ba26c51b4d282d863ee8156e149176420d2bdb795dce6,99947e556f1b5a681e6da2555e59fdcb4e41f20636453db6e80527fc1b90d79d,a9ec37b4a132d620276e36e783519ceb2a099ad2fd5f979d502a3255385963482c52efd10f6ac960bfc3721b61ae08c568290e54ad1eb7a146ba13c5c5c6f2c601,71a6e9638083e5ce42863b08268d75bb980c86e15000e67881d78285d1abff67595aff0c74815cda1f636a00fc81b80379f0ed04cc754264c6f3fd9d7b4bff5401,ff39b23dbc3cab06b3e4151b347400b833e7504ea793c0083b0a10cfca98443321e7d8e52de315a80e3362aa641de6d780d561a0a4f5cb8e8cd1befa8c5fb4d700,3726d7ada577ca914cb4e63bd65484989b95677f38464ca157fdb84df7b627a55ed51a9691d810a9193c827f7e5e13733d7fb33401dcc482df6dc679e7a4377c00,a91385385a31e1175323d32d9901ab355611bca7f88f6755de74d5ef03d526d84782fc35f62c30f81b2916991d46c49452e583915a031d7138b5e0e7f320ab1d01 +0fe020d24ec607cba5161daed4341a2562455d1db744354038b7a91a8a595cfbb1df0f307c5784e3bac904a539f48d677331c180d0675d11b81080e44a6ce0f782396e82cce9df124e55f49089cc62e575e55cd55768a88621aea7035e0ab2d3964aaf8d418de0b3e4442d0a368600c7af2df06552b86649f18ca4c5b62924,aaf7b50ae41b365c76fa42f51fa7383e1fccec27af46e6f3d0fec96d8d05715b,49467b640dea029516bd7d92cb78d987f8f626de77ed929e4338e062d6465d071563d19601d355f86a0d913280370eb0d4d88dac2aa125877021fb782b50534e00,b364e46778424703c89a542ed03c7cdfe1d2402e538f1962f56ce505dfdb4cda4a846b223afb188dc5b8cc89a36be92cdd55c4447fd2d42abfcbc680b91808c601,26d653fac67a571f808769e0696d09147af8a9346e0d35ec0ed7938ed05c91a57c666e14afb0b3ac78db9622c7ebaddd0630a540965a64e45f516ca8af19522001,ebea1427cca16002c9a0d350d595205389e0b3f395d2f572d2bb32891bf4f482584571ce4fbfcb93f831622d844963a24991644003008f375e11c5c85a5f934500,f7ac28ad2d89a7218747792846554c8ddeb90b2c4526a859a8cd0d3b969b6fb73563a314b909cb9ca7eb4b2ffc6a280f1d2407b0e261aedd1815e02461befbe400 +2fa2b30cfc80882dd86ba7ab8fbe94bb158a159d00a934e749938b73995e2b028b5b6071206c0ad1a3056907edc61e44221e6c8802d7e567bd40ba0d5b51fafbbe73fb4619743688312c2531beb874057ddf6a0ace93ce6676cff127cc60d926d9c3aadfa0dec4421fb711c868538c3f12551e5d1597c80d570043891a7a9f,2f853974b77d4d1d4b792225a0d25482ac3b4ffc808942f66f979204e0c47e0e,36ca5e2ba405a1591d79c377c37d12ab2d21a05a53ffb068827fa8400d0b58107278178172cb614031c61f4826fa04e8c943e002c3870264e7836c9bacf9df9000,a7f225e1ab2be0df7ca7f95533c91786b78c918c709350e2a5461aba2f6731ce0bae46b60b10fabb67983b8177408054ad94ec109ea72b0ae18e575a8b88c18601,3c0934d9e347bd2e534044fbb8a10191811288a244102a6f7b9cea4306ea4c791d652b606b4da2d209761f0822e2b848ec87e91c564d70ce777c12bb6767fd5600,b73b5c6e21b0b3ea155c90916163d89d9f21b6b92a72d1e62aa1eb765d6d5dc45a98791f78f9751a683932e42e8d7cfe648b865bded100029389e1de6d2ef76a01,4bc712e835f4015aa12ff0fcf0dc825a8f8eee177e9dd1ae2c302138ea28fb4b7461a9a70c17a8d0ad4942ff3d1ca86424245da67508257a0f3dd5bc0d87983100 +59b0bc894291dc31a3730402fea5ae78b1f95623684118a386f3800bbc935ef25ae7ed60944f9f473f4bee539e2484eb1052da1b2e25cc48e4c168d0fa78ceffada67ae04e4380ea2e8a58cb1eb52b74405fd0021c70a211884620aec3403af4adb7b0176be7f18ca938317d4b596d8fc4cadfbd5dc2d91bba6b9ddbc10df6,5d2cf515dc5ff81e8276787b46dd5b20dd19623dbc48556ed244a8e1f051199e,452eba405faec18c0e111d539e0b53466b03501eaad7073dc7e13f1f58ee29df5369ce4d096fd5afce117b1a8317b33ca49777e8d865564189bc49078f4ad1a000,25ec28abbb1952d8648b1e88b925681c5e1073b7ca1d1cc66dcd8919f0e800f73b0dcf4198a16fa78d9d2d49b343eb75aac72e1bf8bdaaaee8bdc961c04bb6eb00,45c9a8fb357cad81a7114e8e581852446622dd49ce97669b4154862db3ee21416ff300952634169ab9a32bbbccefdf89bd0b90e06a2f2b83dedfd86b3aaf7d8d00,e103e7cbebc5eb232d6f1ae78751e3e3840bf880965769419093d196b4d2e21f34f5afa06990361cb033a1338ec4de6c75f063a5087d7deb9847bacdcb9a2f5200,318d1bf4f0289eb8ecddf6365d52f5d99996ede81218870ef297066f3763ffb15957fbe91349562477bf50f828f097723324c6a1691922102f4458b68a8d03f201 +055e3e958c8b201cc54c73a20e3796cb920ee5d844707d6f1dfb91a522a7540e9f47ad283021ee12053ad9a9810ff2eb2d40042c5885da27ceda000762293a0094fa42427e4dcf4dd1452b7fef0ba7a9d0fa18288b5ae9832f6e92e729edb4c69133018bf4b5a97716bb7002b6f0d446e46d043862a659f4c99997eadbb7c2,8f8c0a1af0f264d3688083c64b132e03a2b5b08420ee4f5bf12296d73dfe6ba8,8cba79f2252d3d61d100fb5a522ae6ddd05a95ec4680747b4d44e365a94180395a36c23519db0b3904b4c0d75523ee461f52657bdc470f378dd37398f3c24e8001,174887ebccc96c0cda9940a1994f5844fc22a46af31ce4d8b0af95a22dd36d520c1802a98ae1a0692dbd2daae41429a1c78001d2c6902b3a932ec1d9f34dc8d501,ea4ab53c3e0c70d95a6e11d816f43114a4709dbbbf0be9d014998912a82dc7d623c21f297075594c91f37d5bb659660be28859af27f260800f8e0c47b02376e401,e2517903fd74a54449bcdf91c41647760c804118819c2ea1060b55e0f4ddd6ee770e9284bb06b36b4f298f03a48ca62e3b26f64eec09028c64a78a3bca0930c201,35b71c3b42f0cf46939f312b9c4b67347cec7ad952e8fbf63dff3378e59ee6876fd0ce7bb0c20c8ce2a167d56502f7461bb6378886fd359b8d7f631af44664b000 +7eb6ddb9aa5d4981d2fb31816c1cfe42b8371d1698b66502f49c8013dc36fbf483fca22c770969da552c58882025d692ef773a1f8e559594a0013d3a344af661e78853c5b1c5a590e90b03ce53f800a796f3cf4cdacfec0942f2572fb4e952dbd5882913409c25b471aabded646f43c5af266d2a8ec435eab3f9241b45b318,4ad694cfe767c4c93a8db6c7c38764974136e597634202b8c14baa0079911866,dd7d959233bcd9c0268b71acef6e1e89ff914d5aa249b5e015fa967e994f25931a678431269b5fbab6b598b5b87d1cc93805be276a9c705f54a1ef26d1740fe901,26364fd6568e63379b98e57cab0f54a215f5dfd8906d2b26914467ad4266aa0f4477ec4ce897ea6b83f53ecfd5366f1c6cf22e0ee10a02abcfa36097196736ae01,865209ebc746d32ef63a5c0f4ab12d5d4cbb0005ff4aee107b34e161180a8b0d109bd0303eb4c3fcf4dfb42c8b57475e57f2fda34d55c86cdfb8bcf6ad57eab400,6fcd0132c4ec2a91e1c5a20ec442696077d01c8f66ea0cdc999084482e2f330d1a6c232180458946bdf970f6c98d0589d98a4f1d455c4782354b737c46f0365200,2f5332bcabe63058560b37af6710a481b80d9205c6f9a1a6d31412baf473dd823cb0e6b08de8fdb8505c5fe2fa7a9039b92a9c11b8a4137f3127df3e05309ea800 +a4a1ab815366fcc762ff9b73edcfd1c74c4157ecf3d6eb47084309c03317e8400789c579801c906595e56eb024b0d9239d4d6445cbf07add90b0c895e309445d7b1b6a81452a7da7d36e01cf70fe79511b4b6f4ba997101cf02aef7a02f2e3fbc668a588f79384c98e5eb478fb650d2bd4220393bf573a4d81fc6f79683307b0,170457c755b6b4149dd8bf03a7e09655f266bdbdbfc24ed68f1e5e54d3752b83,34caefd6fd716e256bdcb30af141cc5b6f7d19f84a9e1f33b1c2869ccebe36926c4cfc221ca1e83d0c5974dc1ced73751b5ab15b8b22e49dd2fb1d2654efcbca00,f52d4b894d75f260cef3c7ad0d23afd218db8b932ad8107e0fba2eb4a82b6bbb0ec9b4c9444f1efd572fe6a93da59a77bfa80936b3e7a363bdc4b98414f347b201,1c55baaea6a02bce9c6769d55d57b9a321e117bb8d56878bf4821933a22373b118ac1a9f161d589ea4f9c1380aae49b4910647a2ad30fa0913467d46f63081fe01,aa43252e33dfb177efe20e8bac0fc552b96bde945112aca6ee29874187e5adfe08ea455d19f574da427611415b82887dfa3e128c0815d3ea3720795bfc47c36b00,437f1665411d8a3c5ff33d8b208cbb298c9e3c90ee8e3311dfff04b18889a13120fc0b9b76e4a4714b43dd2cbfbaeb3c4f97534f15c41112578cc94462de644200 +409127322b5d6d36d7695d3f61d6f6b61b3cf7468ccbd95c731674eaf689864a70c76327ea07090a11c9ad57a1a2fcafb40728dd7b95cd1d1c5437ef67395cbbde35bd1a65e68b33f599ae837828d238bce8d4304adde9e5e88e2ff17b97f3e529550e333b2f1070aeba58e4ace3a8b1fa5bdd75213f8c6dfa770dd1f0b1dfb7,ca2383ba17c08b79cfe5d16d8b370a2fde48b4eca002cc3338fe011eecc0623b,3c9fa5cde884ff9c02c9f15dc0af6e9f1012850a317429f5f1507e0c22cd4ea66018812d02d2b8ca53f596220769c5c74f0785a85d27712b03af83079d80d38100,dfdb0b1e13e708a9ea559de7d49f48cc864e72175ec2e164502257b6992c94d50074995fe713078b17f8c45f1e3ab7a5a9e7046835d356052009f7b9ae3c81a501,3a625c2ce420e12a8534d3eb8f945f1ffbd23d3db535f023ad20025185ea1ea40e048b0689030454fe1832ae7682513b147272d3045d7541da383699f838ed9000,123143950261ec58d27af1bc3a3f0ad082fac40c50036b6314de54e77743df085a6187aa24aa548697234f27067da74ff1e6410e9f3cd13aac46966caa3b35a000,171a6347cd6d464507ede55bba01228bd66f4c2489e536451b4b431fc9e87a541abd1dbfc0173062b848e3b0333c4e81346115ddbc7bbcb12e3693080107620701 +e89febe9fb7cd18ddfec36fa1a3cda59e2c173c9791f8b3a7b5ab6f60aa795be388c9c65c3e4c62edf0ea82461282b165bf3c75e418a6c77b4e59123ac58c98d0f21a5e9f651b73d406c3b401e2b355bacc928a06685279243566ea761d1297417a3308e731c7b80246e46a64249846c28fecd2e81322616aa057a56e3e70f25,941e6f879ec275c06be7fdba578698289c532e0b6ba216306882ce50ef27e03a,56daa3db35712637d07e536d296791435d01dc2654e8c99f9350efb6ff4f8a9127458a897a624ad550bce7e3216a29d81012592932ca0759d52b51ea957db63900,e330aa9c039cd125a31b6683dd42b73726fe2c0cb1d6a788ae9d0be4dca638de317ce2e24db056fe292eb383fb2e9f9426da953beceb74490e05d604b89d776e00,1019a3ece76b296c84582baa04dcaa32f8d48aab92350eb4e11b12e387b9a7211328905f61e5a38d243cb7863a8cfabbbe9b506eb79c7069282f8c301c3deefb01,c5b44021000df6842b3cfa22935fe2819c87fc478d1e647688f10e2ebdbe33737717245b09233aff265a144fc3dfa413e935df938f908c0ae041a669e8c2f86201,fca0eb4439946ff4dc0b65c353b663600b7befa3369583a1f976b84efb167e6e74f5f5c52b2d8cb1961d241cf3b70561a525d33f70d5260ab84d5b92222c817901 +04dc5f707389db246d187701e342db0397172a5841afedb990e3c7fc419061e1e096b1f36383ce973e3b3b7aa3d595bfa85da163457abd8db27a342f0ae3856ce8a578d00ec93eded2b898166f205e73855b79ed021f40815df983f662cb1a52d10efbde90ef13c5e4a14d367ca9e337df610083f22dfd463467d51f443dcc3d,3dec6ec73daf6d55f31e925fbc02b5b8dd84b0da7481899b8a280cf105534e63,93c3fab0eeffbc4bf7a714a02fd0890203f756c4e810cbef1ad274f43deeda8642158ef5ba1ddad01348fc34338994e727bc568ec6735fa74f814961c890ed5001,ae35f583d0ebf4ccdf7b5e93e6bdc23f71c10d4fe6f0119b092934da73443810302b922523fdf1d78208ea22b07b5ea87bc0b5f9f80c56e1180b7f4c0c8a9d2900,be21d0cdbba9dfe81fd9c2df11d2a2d59c024cfc97efd3ca4fef04c874dedbd3016b4f688748a937e0d9b4ad6bc8600dfe51319344208d024bfc914232b065f500,02ce22be0a29444ac6ad21532f495cd9b9a7a947dde0cca8519c4b37ccb3322b543f354434d31bd8af9680a3762ad2abe03f5c683da037c4b227dc26ae0c1edc01,7012bcd4bf22f9aecd623780ae9ce86aca10d456f007acc8740c33e6aba2c0631b517afec74a647a852fd99f008d74ac6cbbba45f64f68d26ab1b79a755bf40401 +d7f8fdd9c8fafd74ac29673283858c634eaf006b35772f023c40624c37d3c4d1777d5bfe4662597440a49a781aab03e794467fa527374d8b35ff0eb18917a56ddc8fe6f69026e3a1d3c93f12830687f08ba801132c411a657373ac36c7de13e93ea6ee0e9693bd4a214bd4c8e05d85b150713a77993a70c7e989f81a2c3fc178,aedbbc3d6a962d2893a311f5dbe46c881715240c54b62c15c10fb3caaabe6dd1,81291f3fdabf970bfceecdbed369ce1c380ba33c6ba4a2c7f9bac21cb202a2d31ee96f24748f38523d4d7bab9ded8812cf78a67d7bef6c055d4ae2731a1daad201,9168f4b5c90e744a4c0724620416c3794a89d53dd5d545ce66fb39c9f129c4546ee89b4a85e54aa01da0003bfba7dd3af0428bc77465b4d57f823fd3cb68fed801,4ff535db07c15f95966ebc5841a154c36e91fb718e756b7aeb4277a0e97d56f0750eeda269c8df0af7e5fb9cf4327cf7e5e1e711bc76dd90dafd52c33cf2fd1701,c28260befe9d77a7748210ba374ecfc56fcb062e357a45ea2421b7941e05437b6aa63f660be8507ea97b53c3f214760d7b0c06042521445c23c19051e1dde70a00,19f7f4fb3357aef280eeaa7a783711de73030d8a6af5afbe55a2b203d9a964472df32a54fcee1dcf805b6abbf13bef01fcc081f6e9f06a72ac3a55eb437add4801 +0f5774f4e357499231ffc396adf64625a992e4d50d1106291b43fed284bba96eec3a441ae0232e75de4fdafbfb45dbc99374ae7c6b334554ed48fe2e3a258bda5eb9b81a7c0860acce6f2c55a37f607421e3dedbb19e198161cf2b3a6ca79ae7b31a4eda4b4bf4093d9fd1b1f084ffb574f33b72938ef69e678a0e7f5afa7f49,c7c173e5c49575bc6ca9505a5c671efff8c1054053d3fe347b00d201ee16859f,7ca76bc090699de17e3a50016c9aa53df26c2f0ea08b45835b88ada629ed89f546e76cd9d83ecf5e793f463645a204d5c2342729196e933f30831c794bb4d2ff00,f3c07203122334fa1a24edaa5b8e9d73f02c2505b195b1b18dea8f7e0139016b685f54dfa3f22dcffc7361b5a4877fd5eb86390861e022ec275f0c14c4fc25cb00,b886fa4d6c6e62aefa8e3f987cdd6080edb247facd8cd4b8590d503ce770ddd57cbaf2695464af19b537b82b23d13f3f2dcff3a21a7fa2c9dd66889af4f6423701,71027bbaab7b6a9e783f01e539f8b7101ccf4bcc43f65c92e03c20430b97185d6c94fae962d970b8fc43369d8394cc5719cabad13657bcfa5d15583129d2b18601,77b69ea31ceb48b67422213712c66042b2655389b66fcdf91829530e610933be2f0b9112253620775a7fe8797e9e58d2d18ca4e8870bf352a7ff7e9130058c0401 +b5532081f67c5df1253a5c25091fb97d65411b7eeaa0909b96dc990267b4ddc9e3b2696fb82318dab30ddea11dc9788d7b20ab61e7a33b9749c47470fb1f067e763e933153cdca9f5120a2f324c6f12f8117205e5dccd473f58d034c99d94f0647e7753035329f16ffb275449679ae67ebce904c51bc8b638744bab4e235f9a7,de716648781aea68736915ab6706a8c9f601a6d1b86dffece7f3ab1284a70dc9,ab10bdd63d047dc156976054c68eec1d0ce37833e3ac6601f597731bff913ff75a1ef34e0ab16900c3a37562c8d9fdbd20d0dabd6738b4ca89a9a0d21b6f3d1c00,35833285fc14fed4b9fb25ec7acba6072ca7cd4d2fd4958fb8dae7b472f479112fa99bcc508cd99094cf69812fece2de260864665493be3015ca61d43c5ecbb601,ffa93b5822662929adbbd6edffc42d3c272599ecb527db285543d545c8adcd733e9c11ffe0356e14b1d50bd19b9de8fc4303dca6da25d41492c5ebfc15e2910500,ecefc3c9d254eaf70ef83b585b5c0c2bf3f577e47d55fc116ae8233a39d449d5074409ac1b5880ac716e29d733cc4b3a889054d9b5825358f2fa26b1ad85767200,592082886f33a5a824da7571b59528912599bc132a288c26cebaf01f83a676a65605bb801dd23064c0d682fb369ed6cb0af71c493cd297308b450b2cb134b19101 +e57ab11f090d459dd8e5f989aedb885d071fc30cffe2f48f8512c403c2a9a7a3502607dd004d5a28ea63b4f812f4acee22fafd3a1c121e54c7b1c0a76053c97515a5f85d25604a75e7bad831ac7e69dbb1f778078738a51dd5896338760449d173a866cef68e78e8d93f324b89f3c68a8667c1fb516137a88257347fa396e87b,7d768f4c811d93f8d6ca068b1f44bcc8266800e62b1509743f81dbe7d3ac1b4e,bfd7f233b87dce0df2cde198a8eb277738bdb3e7f3b2b881512c24b508af67252d6f44cbfb90c9c26dde1b770b43eedbd6c8ef614b979c77b8649dab282cd27700,5871ec2b9facd3bf031e585f2da77d31cee25f9bedb803a51692116c9354164a4ec7408620b121099e4b3957a43e1e72b7170ded7c576bb2665c0f8cefecdd3401,c1d53acb50dcdd7674694948f1f1d548b519adc0bed8aa7c3b040ab9ee9f7eb360c33f29b8faf7b9c1c1e3fcfdc670129c4572a3d6ba22ed5a8284ce921fc0eb01,44afaa17c2a99fc622b2712138e33250292f15b518be7634087d9bcc2f9fd01c4c2e5505df8412b1e14a3bace039ab00df6720e2f97bd7ae971a268cf8c0082200,b7d42b5bfda3d6bbc6b68f9fcad1397284280f7ebc6c3595c791bb809fb2c8560056db527c48d4f9a5b4c239b9894a23160ccaffb8e28072bb0a65992dffe95100 +6094eb838e03df7de834f1e415194f72672f77a94f9531317cc0c5a7142fcc7369c5c81111737b6f9953da3b9af53587cf56bf23ec2645fb448dc5cc6f921102ff9f59e15d65038ed599be760b2fab140badf29c8d75c1824321f7469057dc7879065327b34935ad386245486766ec3e78dc1945f4452d75cf1e5361dd876cdb,e2d0f7d030e6e5ba59162ecdaaec17d47d9736f32e475a9af34b66cce2b765ac,4dfb45c40615a530b89bb6e45710628a9757ec4ec82e40676bc1fe81f280578f266c35debdaf620d9fff1d0c1557ff003a1e9c8dfcc7a95b51bc20147362979500,0e684ef52af8b1306612ee927cc843649b231ed51e7fd0f825d678d2b6147e8f661f6e744240d9ad6b988e38250436c4c52f5cdf30eb8ff039a312787a24c0ba00,a18cdc2599e47f09632c51ffc5ed2e129ad17b1d594fc06cacc464f6f6781ff65f54ba9ccf414db3fa9b128a78227fbb7a7e7a080df8854ecdc49646fe9d902d01,149b7daf5cf27b4e2ac0d20866ea4c672f065381c4ab1bc5803b20505a654c50264c9a5f4963b6ce9f97c413dfd9be55c19ac0162ced25991e9aa2c407a09c9200,698444ff0a8b90655062bb99adef0d9dad72a82670b3dbab12295344c84b924153e9fc54b2a11fe9f36d71c320759a3199cb0796d8a86a81b594d028c838ab3301 +ea53b42864ba16982f57bd38a3b056db9518281b5e68920a9e2c37401f426dda0757501417d726d62dcda9e6c81c6f0d86c02f58bdd5e798e6255866bd193da6e47590782e490298bd21482513a68536a76889f539ca33275c2f2eae0f4a633b2217dd8b77b362023671f5b82cbe45a52b04a6a7d71d406a51a157adbd011b89,e9bdfe7f19036b25177a509a4da67a8a619d41df661ec3611cc40ac5368717fd,0567cf1441de1f0a66a0a120b0ae6d08a2406c65eede82da912bc287baeacdc25189e87c6bcd830a66299d381f5bf3debb1752e66b48284606d2fea9bc8989e600,8c58b968e551cc62875ed9bcd60e65005ee214bd7c9efdf1b11aed53b51d43373a398cd41a848b331bd84d491f73c3dc63ed9f1e892c41612859842a046e9b5001,4ac94bd99f2f4d2664247c7abca93f79389d8ef507c9cb7288c4b025d21461b968e04ef9abbaf0a035254a38772e316e43b3fb8984664069f168cb8b3c729ad300,78b5ae01a9f9d0b77c4c9949f3a11b707d32616e0789f9db40b37e167aa7041658b7a5d18cd008e1f30efd8ed0d8e82cb0ba23e9e31d968e05d7fbe5ad1ae7fa00,3304f8e6e206ee17222ec8998cc60826c9fd48dc73677b6d1ae0d743a43e57882b17ea085c647517963e40d1095d45e8c9f3c1a84a90d9aa9ebfd424e9c2f3de00 +8d8983bfa2c04aca59e57b5d6befa967a3532dfac69c71d0dc1f145da209625944c7bd11b5407e5210b71d96b521ad8d04d93ae16884a23a94b013311740573df7396423631d39e27f68fd91eb69bf700acbcbb16b76da1b7d735aa00b9937ffa4b2902f23537a5e1b38adb15eb0e495ca4d8ef4bde65963507288361047877cc1,05cba679c82b6ddc6436fcee85bc884592d8613bd7be348dbe906a7d8730dc8c,366bac8bc3b6a88ca927be19c6a384c6d07e892992a70a7f232b6d66a44565745b18907195109313e0ecf349057af61e03983186248a5098f315313aed127c5101,863db396874cd4e9582590771bab66a7fed6f85fd9d468ea4e5e277aaf25b2280d12191f1e28c0dc0939f4a56bd45d90aad0085fc7aa0aa88c4c0fe145dc5ac901,672bd128490d67092686f8c7b971c2bbb0c511a5518516d4a4a585d551a42e074698a9d369ea1fd9189bc5d1cfe311f1618525e8944f189a1d415bc594cceaab00,b0f968a983e879c6c94f86ef59a7028b98b1ca1e51f55372ede5ef94ad0a3d600b860bedd06ae9e03e1aa205718c674a22dfa93dd2f756345cffd7bbcce6f6f300,4b1847f3dafcfd91dc694c85c3553e1735bc47c07787a1894508986e3f7ee73c101d934bb2850244254f6a09ad8b2f2198a9accb01ee42d1e5fa385a717df0ca00 +0a2634c4cdc340363645ddf88e5e4d4369842b631b58e7c84a1c7ed39d509013a1924566e652e9861727b61063f4b2cd4a8da3a7fa000a5b4c719685b92dddd3e37417383dd40a7a4f81efb8ddca05d7ccfdf3f2d870a0065c30791570457f880cac549eb117c8bebafbed86667770ca22d173e6086740a0d2c7d0cc353624e60a,41aba2fe8cbb7d1763ed8bbefc0a78e52a917fa8abc91cc4a62acde5dc335d1e,6a07efb8cb6cb96257511095ee93a6eadb96c59fd481e9a0229e04ee29a005c04be826710e0a42eb068b6a9323ce620d3ba4a137937454649314163f123a95e500,b1e948f9689282856af6e6f5e24bda06f68886dd1fc4f687228065af1cae34f8626e047bce037bdf2295f82cf966d858a753fa59d7b62cf6e37e6edccfc5850301,fd01d631baa9629553cc9d508e69f3f03fcb00fe81b5bc36b31a8c0b9611c5d771cf735beba204394757a854387e1d53b88088bad7295bd7ee18ac5cd97fe45b01,c52bed2b768f8a74eafc3d665c45c74f7cfd112c9cb58e3bc00aca74c5e259ad227152676ee28fe65c848acfabe26b4ffbeecd71c0e7d82671c8bb490bed3ae601,290443d447641eaa27a8530f99579a887c04ff2e509c10ced5580054b4dab5fd6d976e6606024935fd139a9797a8b68c9044d86fab4b2e4f833c3461281b85c200 +b729cd8fb88baee5ebe1dc37424e31dc6bbad71417214460bd2b05d2b8b7770ad41ddeefcb7e37addcddebae17926911091d22e19545366d4b30e725a780b898cd778f0dc42456e7d65fc244b532dd3a28404529f5fe1f0d58432a35e8b5161b0544b91ffc2a859a0d875525a12e3cdd03eda1138b8668feefba6f4a178ea3f53b,cdf44df684f2fe9752de1411cf2d13277fd19f8302b556525a8ff180dbc0c6bf,aa2e119942a310a182855c9bff20cf034e67c08d349ba39cdca557fb36ff24296b023f5a05ed4e9d3f87b848090819c22619d1093f3f7eb100ece08386d7b6c701,630ac851be9bc9f3fc70932820f905521ba2838bb205964feaf21c68440289223c505f300fed9af329369e2c1757359b44b1905da2d90e5ce9078ef5516ced6201,078983b553c7275db1ecb1c81558b5e1fc3062e222eec0cf245dfe5e552879f876b01edfde9b8324fded5a6b6d716d2113d8388d79cb77e273511e94fdf5c7bf00,b4c6313607cd11897658a9575661f08479fe16158714716853056ab2689e3c3468ba465afaa4ed3b803d4176e0b2522ecd26507cd552aed8e959984a89c8d23d01,b6a772a41cf082672de8dc3e5575ac633a5ebc9aeb433be13eb4f27bffbedbae3347f86ff11846d04a93282c0b7332ac40361f7cc4d025589371337cba573a6501 +8265dba5316556a9d505154921ccfe7a81511d75236d17f278f1453e27cbe1079dbcdea613c67be6f475a932742c9ba4e5a73d528ef4dce7d8474b10417c3d7313cbe245a61064ee9e5a13dc3b361b07a06cf821c8ef1a55db399584ef8ce2a82e892d6694343c681ca0978625455d48191a2ef9f05c4edf624365c8f4c1d95ea0,beeca4a07e0723424833902f589ad5c642e66bec0b277c70012ea8ba502e7d8d,93b5e56c73f8fb65aeda2432faa523b0b5e6bd4f2a4f53d32a9554d7636d342239dfab8d4eb36d3a88b4a6cfd6caebfb53e1c8ca0c114b95c3ea13e3e71c1fd001,3038bbb575897d33c19dd99e8ca37ef4be5db3c868f5d40ff2e21597d66729c520a195f3e30474b98920788e02a6e0abb28b2aab60710f19dc517d75029dd32500,f18572770598c1e18e67df2c59f91902b73569fe5404b725e50c16983cc039e24d01e697452bea76b207af1212c44412bc0f6547a3c8ce09441155f6e0aea6db01,8ed55b6236697326f5d99a7e7292339bb8a47304005856680cb1ddf9aed89e746c0a1d86a15e2b3d45bcc6b7e94cd3d34bdcea9de342f77fb90894834248e5f401,df6055d2c8062fe147d09de1c8b011b9d05c54d16f265e63c6425a753884f902566fa7531a6d6735163e056d0b7cbd0d16933b7250a8d645e36941688635ab8e00 +0351b1dc8988c094e6a774e952330923f2af323907a3329118b348a50426c07476d19479bf6b09703f2a7fa593d53bf456847edc1b12f3b7295b2a935a2e4d1c4e276db9324adbe083a2f04354a95224a44572f6e2010849fa15d7659f447cb2817c37d66f6a5535ea65ec6aca2087dbfced42f823da1b02cdc8560ac5765cf127,95e29225fe2a5d491b42c2b286b35f83b665b262a102695b6846c865422e2b53,20a3d4de53efdd9e6d02fb708b1bcc4cdf1dbf0f080f5cf8de2f0a761717ce892573ab76b8a41261c9cc92d5c0560cb371c7f7e398ac010c1e032dd501ccaf3f01,1bf3cc0e5d1fe5562141fc29996591b76f3e93afcd0412253860b0a7798dd97e73553b96732d61b74489038ea7441936a432bac6ceb9afec8ca656f8aa234a6700,0e595199989ab443930071a43b6f73e4a651bbef7f28160828fc6fc655669d3e61bd70b0bbded4ef99eeb7418ad805c0516bf6b4f142b71c19cc6e137dfdf00300,faf115749ed271de6e8f1f7c34f38e0ad3682df9ea495a63cf6e0f0073f2cf07184159410951099f2d5915af90529723ada3442817e866f4a6d005eba1dfbb9601,f3a25e568a5a2183fde25d3c0eb019cbb0d50d7d1906c08e38dae18ec5528cb74c5e837aa21ffa1c93ca93428d7a4f7cf48bac6fd7af18fb56b89b4b5de9047901 +954bf344f3bf690f2f5968a05277f30f89b502a243db3491195cbc4d288bc3e87dd2af17ef5fdba206942a4b811bdcc50721eaef56e4e085b7e16de3fa871776b43f5dd257f5efa40365451e1155be8122d19ec66d6fd6a26f74c547cf7a4d726f82fa006df8f4d2f6dc770ecf89aeaefe94b0100a052af6440a498fb818351e55,3fde3f5ba241bcbce38b3fa7f0aa24f8cc7bf47600e908f864f0cdf324d16303,5701d36cd470d7d095e53d986256a2ad13e5c7d2be86304d47956438f36b341358a4bd0dd7c10ffddf9bf9a0c8920b2d281e8415dfa8a3377a867847b36949c401,bd963a925c9d8984823ce9d5fc537ec775c974d64d560c55e2eb1121efd84c1c2195bba296456b40febc44ea44e21df79c76224ae26e1f5163bfea9abbb6d21701,af25711812ed7be91bb9e2ab95d63f2fb1010fe36624f7b45e123772ba8091e47b404341b1d9e1c1cbee07c57aa3868559c1dc8a2479a6db1a5c8c55115467ad00,303b476e58c39907ba0f37505563514af26741836fd1984885d11f420bcea11d301cdc4d8609708423876b03d34cd77b667ae319fe02c6983506b40d19f390a500,27e0f388c7c727e828bab73c695a6cf4026670a366acb2aa17ecbee57b27f59b793c92b1efe26ecbc43a8fa1296a2048dc6de510a55577ba6ca2be7ce085f37a00 +4d4e44dbe355244ebc5da30cd27ccdd60f139370088140db0896eabcf7f9cdd1914dcee17fb166f643a5a3c33f3140b8f401bfdcd51de296e138bbc3c9a04158c3b1a9f8e49bda75060c98d7dc961db9f0df5d82593537ccc11927a6e54f866c915055d6ee758f117bb44b732d61a633f5c6b06c65f4bf183b8afb5c164f572172,ce852f98b1c4c2576931a2f619d1335b37ec3d5016776ce4bee043bd367a14f7,bad69d6e80676031ead758c03e28bd773a45012529a72b92b9a597f216af4f830b7bc455b407d29fc87954b897e0b929c0971af7d81b963cb05a886d58a7438500,0a7a217182e07e9541af5520de2e629e3a63b9ad57e654b89aaef2d83ddb033e113206ee996e05d765923cd68f3d317a8ad656b5e30dcf42d2ced77521f0b5b001,8e457aae5824c428cf62e622e8b8ffec4a2bacd19fea17863fd206927355c73f14ec59836f532484a76cdc4677563be5329a72969e9ecbf99aee7e6f7197f29b00,40b0fce7de1b964d84749ed3d294ffa3228dfdca5477ed5d26433615f1d537080d046caf13054fdb5507df5bb725bf53539ac1481aaa788cce950a8cff737a2c00,35abf6963aa8edc73b147de0b4c59ee97d2f35aac8d2ae9d6c09611a1a060daf5375e1525b93b2a7439efb768ee9651aab8898859b78f5e2b210253f40b619db01 +544c7b0f96b3bb8c9cd94177e7053a862609fc888d3bfd7e9a03cb19a3d2fbff16b3aa7140403eb3ee08dd84812d5f6d48adec8e719d88096189466393350875b0f238398b86bc6f50170696e3ebe8e91dad4163257d58b2422815e535f16a5a9ea04407dd282c6fae54830eed4a647433cdcd234a50a302a7ac7e3e8cf0820565,50050ae70c6682c59a3057ab4595e4dcbc6032c729eea1607d48ce0b1032c612,8806a64bf42b48344cdae4c7c112cbc791510a7ddaed80ece2d627261cf334d64ad3bd4c12cf5836b7420efbeeae7f00044e9b24bbc0c897065d7c12268249c900,23dc1f8ba7257f6609931c1cf5db9cfba195cfc08a9532bba00a14353b5883dc04e124536a6cfb7d9e3261d08b815ba72ed548b1f32dce7fef026805d94e2b4900,733980708061da856d673686beda7462812af8bebd3939abcbad54407997f4b27bd97d23a4b7af08daf8670ebcac7ea3ac52ad55b8a6640249cb31ad87e2116200,3d4f526dd06e157f8077979f0b7e5a70577d4a4290ba8189b901f1e7e6314f8505801a5f2f99ea2aea1bea1e14315918ebf747d7e00bdac9328d6e0259229b8800,337ce4afe2c792d409f95dadcb056b05c5e684ce59b391c8655fdfacad5737487fb8849d46131dbcaf7b6487429b3cae9a50cc730dd51d7f772ae942b16f18a401 +4409c1f7fee874b4ff5c267ec5968a8b37c2f0cf5f889aaa346a9a662d4db70d9ffa36e9f5e318a0a876cdcb293abd0c6e2f41c8628d26973ff39032e042360f78e2dc15c05be4297ea237e2ebf539f80d962079fb6f35d8871056d0208396b9c3fbe825b970b492668ca686b948db917d7a2c1cba0f9dd953bf47ac973e0c2996,f95ec978a613cc6c0c7c2911eb3d2de6c68e617a4b6ceeebe50bd5fdaa061dcd,192fe4598be648b451c067a33b9d66e747c0f07c97ac456d156ca9a2ffa111cf56ac181fc23ce296839116081ffcf7d9e3b285b4b1659638f8bec3f5aa2e25e600,d769b39add394d905cd0d4a273b238d0dbdbaf30003b58532499bd223d7b142d7fc832a5d8d0e42b0ea51dfbc5400cd7c9251f1f9e971f203dad511031fe9f2001,cc875a4e31a03dc6a9226a1f63562a236838046938bce819f1bf52fe451535020043366ee4465d3d44b82fc1d5a0ab6a8a00138cb4e72a8fac962ac1cbedc1a301,e2265df479f56df3a541ec08fa5ffedfae48cce700a358860115afdb1f0f584b3ef59fb482c78b24f2e2ab5369c2caa0eccfc1a809909e1e93bd8bc543b34ac401,5f3f13ef19f4fc56db2708ec01b50ae5800ef451a8f40986223173b2295427dd4ffe772d602226b1af7274c53fa52a7e412fc2af2dacd441d312175300a803e800 +66771fda4ca6f2d00eb5ff88ee78e85fca4f23a77c8bdd7588d2722753ed6fa228a94179ab6b93799b97c311a84df10bd4835ecf5174129ed19307c3556a9463c48bfc51a4c113e334d823d3b80684f46174a4dafb526013943d90171be5c1305edca3793d09cac85c9d51b64c4fc8e176f055ff38d810190b997cd69707afe4aa,0c034af870d18bcb1a10547cace46a2ed71a1f36ef71cc512b73dda292c2d296,669ddcd38410b00913101ad81857c4b14ad65cd00e8d9a79c0a7b25cde9f462170fecb075adc7b1558d5d2fb595fca3c370c20796271d34a658f808ad3f8a9a701,2453502dc06c70fd40b33692c86882d14255f994eabd3611b73e3b9a0af6babf56ac67bb9fcd9c2168a92fe3bc822fbf24befb1cdee147b06a78650710be6e3b00,f2546add57ddb1284b9bed283e077fae2d7a03f769cc314f2f818247c7e9c32243db489a8cf9090fec4a1b409ca4dd688d096ff089f98968549e174c05e2435b01,310d96cb16b6531416908c259e7d96946f6cf6dce4c0fb031314768576dfc5827d60bc2e8a9a656ace919873f391fc70538011179f5b031df08f3df8089e2e4700,317b968fe9d8173733694fd1915fc48a90d7b99c25bfa79157dea240a7a19ef20a627033cf45befe44c31bdaa041ef3b6ad2d23230d3eefef81dcf8bf59d2dad01 +53e15b2da05489e7e749d04fb01458b895c5ceeda67e477943d438ffbbbbbb25e754a6dbea398172dbec1ca890dcaabe029dca7f82d3c34d734cd236e0d2dd710d13320d80321a2dcdd1529b1b89467dd2764c8a4a5ce373e6e2fa91c5fdc5942c2f9fd9936bb6aed316662a39779dff1c12dcccc1dd37caa8a76f20d4e31a6bb3e1,4590651a572ea61bcb5b08dc6563b87bc2c197df5aabd0d45624888f4d05a927,634fc3bb3a8df64a858305b854ce71f68ecd12c694b98b2b8e0d631475376e3529d002576783609dbcee902ac444a95ca95b5b7145cbd715837c7dcb787dbc6c00,3c2459ae006356b7d112d7ebc3fa64440d7772fa2cd0b69b0029b43ee0a41b145a092d0ac35e659574b11fee6daebcd4f4150b1561d37a337c3a4a142d80ab6c00,bb87f05128505aa088e1e79078ee173388d9996a2bf62952a2f7d597bc30dc84483ee9be4bcd14f5dc3dec6d81bf2628d3ee7da4f90b0e50247327362636202601,a4d1d58d6ec5615f6e7094cfdf8adacc9ada185a2e97dcef903e547733842cd95b2a8d12c5cc7436b0b86310eab1c68634b5646f492eb97e2cc1983e599427ca00,7ad177a9eca37e5bb9d5fc4910216cb74ec3a4103203623b41f66cdfc40018c342ca93bbbacdf52e836480b3a0455acd678aa793640a413e72f2ae1c09a1b1c900 +f5b115fb6ed1f1bd0b28c129e1c76da54c69a3e1f46464cb07d7429ff47aa3e66a129736a6cf4c43eec5a95a68dcfe31be3595bb33b706cbc1643e92382c215c51eb43170af62e06b734525e78e28c74eb34ee995e58c6be4469efa218fe8a7625a943f3e0a8a6ca829674c4aa7cbeb5aec556628a85d4e688dc84d0341b2cc1ea0b,22bc1f5eba86014e6fe8f6bea24e27e639830f06d3b0f4b1d5e335764f7da2be,00628a60dc00f01a138dab70bf7a2838d31c5fc7fbef2d4c8965b15cde093c0410cc91b737ecdc21343e22bf345c3b408bb38b39ad3308d1a65a9712326a091200,bd97d9595f880828e289bf9db8eddd406af3029a741bb79febf3fd5b8bc5bd0e1b77fdbfab004285740e62e4f054d83960c929b8345c5e27ca6f007481b18a6f00,9a464536117e137b68219871061b77cf08bc15f8f25bdc72f2d2c75d2dff01ee3abc0af001a38197ed285200883910d20e1ddfec40ff910a14e80cea5653a8e900,b09ccb1ebc5aba9c891848d43cc280ea640c815dabd00a2adfa73f6677bcc938424eddf4c04890367fc61808a7bd3dcb4aca23663070ae59763f1abc74cf02a500,36d991bf9fa9a63c4ce7f20cc1a6afe280b9493872b548042b2583bcf2144da16d4e61360ef262974fd9185a451fca2551c602b0466ceca9d523edfdbb28e29001 +c18c5868842f1b442b7a82e0e8d5f1f308e41d0be2889a6b3ab12c7877b3bcae7e04a2d8e780232c9117828be5a386ed1ff988a154fe22f2cace450e1bd2af786e2f5cd77c05a649c05cf1984421edc13cd7652122597327975b9a382e905d17d0920507b328a3d994bd465c8153003bff0d02cd4b4d4e0fa25a1f34526b9c7cdd08,694f773964d1894d75dc791a7e6fbf8c1c88a55f44c122f3323396e907739984,c85b0cac2acac0f741e259bb0562be15c226a2615f4c64ff3847652f4641af6d31f9feb4fb438627d2f12831d0482196fadc67ef78e5c73b35f32fe9451fa38c00,0d417e5ded0812dfaa8da5477ebb33ce586498936ec39cd9b34d199282349b88253c3553881066f731b24fe90ad9e15e78005eeaeb155629ba129d8b2acf585a00,f71f2b0ff36f0448419c88e572ee2c5a239aa83f9ae970faeef8daea55ce2e3331b4e3149c43dc564c7234aaa598dabae9b12fdc231cca350048808ab4212e4700,2c15a07ab79111e20538fbcb14685158deb714de4b9bf929abda4a68ee525d507e47e4ddfd40792c386845ff9d38ebd517fe7d9d533a00ea225e781f3b24ec0a01,6bd6e8abd52af9fc63ec7b566a5be42cf86b870dd48dc92039993fd5aec803cb7901de77a88b9b4354360d555bc2b3d15dafa510f0ad682e5f8d3e210a23cf8c01 +f9887a316ad85f97f55e0c91ab5a7f42bfb0004abcbf55a40ad36d925be66f4b8167546a58722f5969793301a8e0ef501190a864eddad614e743c5b45392dcd8604b26fe300287834c49e9c3ca2cda6304a5c7f212e8e0adaf5b345ebad0a3cc78c39d29eae91160c15b310d847b6c760b3e2afab25a3c4f303bf3bd90a6eb55c024,85f8d77c1558f676c7df8466fe650adc340840746516c74fb79dd9f79916758e,98e2a77ac5953bf4240f8a978bb9bf21c9798ed8e91ce0ac40ee823aa224572538a8c8c99ea48e62d14b44f54344fc6eb9d9645b0d0b32117d70dcd7a0da6e4100,236aa247a5431a101371e40aa660782eb0397edc373dbe3159c6654894dfecbc76f0d34c93571da1de6f15fd8b1face5f7315b76ee75bd6fab521d55e38962b300,7a91940d34f0b1632efeb26eb4c5080b7f4e956266be4efe383b06b03ca6fa685f17b785f617f30beb724cd89a8eda1222a1f6c63debbb9362fe61633f69408700,c4e9395c08a424632c94a6bd7e12e1ed6203b61d813851991554697b058f6bee3b813918da263fa4dc3f9a9198d3123552085ca9fc68b7e47904b406e98a9a5801,e7fa87bb598269103967a97c45789dfcf37d7bd91da2ee9f009fca3203e04e06713dbbb0ca1214057149b7e5a239c629bcda5b56c039201af71927db1e31209401 +2cf0f918dd5a70e1a1fd446a471d9535867a0bd3f3e9842b3e9ed035a143e0b2bf5ebf129ceb1732c54ce2c4e638415313ee3b048327870c8df35cc8467adefeff1f1ebfbaf2217a96e5648288efd456d9b5c7f49f12467f6e9ec2ea5aeb7d01c7685b77098087967b1c1359714ed64760d804e76c8e53c76716a50dfebbaff0f869,d1d0a2a300080c76a38488f6b70fcee6de6c53e655530ac664188ab72f032757,eb66d491d64ce8371e420988cfb07416930636efd6f8fd504770db508ea723910ddea9f2949df5de06b50208d691d3635346e5c455785fedd6dde1b002b1329d00,98b4abdde48a546d44a3aa31e598db5d72df86e4b2a01191b79a41edb025e2306140806676664d83c48235730da5c8a38b82b86c89f19da06c696a9273609b3001,790d13f7a78abe96fe0153d3b4057b1bd8504a12bb767487fcc00e9be743ca0919fbb164b6e6fbf7901450cf86d0755a0e689faaa8dbb4ee6106f99c2e05bee700,d87ec06b3c171ae90872099d3559ffc547cf24d6e5577b1fab22adaf30dcb7211efd6ff8bd9f96664612a79cc8a8b4113f2eaaaa67faeee40ce809ddb60c062000,d3d35737d9c345f02f735a361e1b6fcf724fce2c034f80091e8fa7703c0b94a131b97afea01de5625477c53d5ac2063cceb14ff7eacb91ce5e4bca8b2246d8a301 +503252ea0dc8ee6c9ccb45d2254858480ef857f204c30fe06561e5e989080019aadff4b4c31080bbff6258d9654608e8f90ce720e5b86e2fa9116b8756a313ab075cee9edca60c666e26bff3f9f7de902a35e3ea66a36a41c781603cd108e2f4b7229d17cfedd0ddcbbfb0ccde34c56a44a479b1af953a55ba3da43f0b6bb6cdd7c9,8c9b206ac695aa61615438834a3523fe8900262274b5927eaa0f1225b5e58b60,217a00f690a0979401c7432e7b1e71d01b5b8f17e3b86456caf3a0279217d9370155844f0bd6e8cc7d6b087ee44565eafb1bd77e63f167db0916460ae74a37e900,6434fbfab13c06812f381ae58830ce7ea2096503c55ff9d2a6018660a9a129f85089542c5532c148fc376314a21cc7fb7133fe5f51fc380918f76e6f3d27cb3301,7074238c8a22c6702885832c03a4cfbdb12ac6801461b507303078d283b61e4b740cba18cdbaf8bf3c47faca14f231e47077697f4e511b70f67967549d9917c301,cc4d51979fe1071b3327445df54b753ae9926eb03c5969de46b95505960785003340146d092ba57f5539e91e502b4cfc23000ce7cb5986d035a09b140d43c94600,961d9c618337543efd07fc92b3c5ff0e04ef3862a55001329cd30f823d974dfd7b4fd45e8ee957265b93da7d0238ec40a712c0c496ed9918a2256556674aef2d01 +e44ec9b467fae69d4491609db9db89993f2425fe74fc7fcf83bfa28440e307c8caf340388c13a754e2d329fa2a0e0f170ea2dee62cc4e106e3a3cc1cb8d0509cdbce484fdc6bd977f08fd5dff99fdcbeb11a22492b4f191a6309156df58621d50f2e4d2b8cafcf958b0cc4f367550238d893afad94aefb0b7949043939fd905f045f,d34a076d58c0938825db90e3915ce2f8bd66dbaacc4731931c76caac9f8f147b,47c0ba5fd6b526eaa49db446892fa43dc80b5ea050f52986983fdfa8f097bb04776000eb079f7fdc2697af826a41e9b99e6ff1c0b97d6c9cca338d023201da3100,e04adb23a6dbc908506e0860e97f65c52b4b7b59316ec299c9ee5056bb6287d74eeb2512c03be2e2ae977b3f8dccfbb8227de449ed8ec7df68253c13339511fd01,044676411391c88f41910080a0f3d0420519e6117654437665e752ee8698784a0e978f34ad88f85868f38067490687650947e6f6853f1af9b77c1aefe631469601,1695463b5578e49a4f85690f6c59b345401439e15dc53a39535309f6aca377f355086edaf26a584e51127ae3ecf001a8957e1b626e3463f23926236d76dcc64400,ba0099727780ad113f44c464ef71581efd6fcbefdb86b3af18cd3db91882bb324cf2673c3366380f09276d32afbc8fa616150f18427ba6144e03b703764fb69e00 +fb05b29963e1fe5ab513745953b19fb1943f5443e88038eddb4ab73d6b786df3c8a5a3e64c22161f000c9f42e42ed85ef05b4ec4aec0812b2aad0f2b39e437ea763751f66795a82dea3c901aaea559180b563e1f4b6a49a9be02c1746156f88cdbe7e12bd121c160acf453ac7c318df6f6ea63a3666b155a7252744d8f238249da62,6cd7aa998de0c5222a337f00dbd193258c84e111bc992e5eada39711883b5d96,f155749330865efc8dcb3f2524d8fe3725543bed764ffa3295dfc1ca7df67df5198f762da5a33f79efcf579d587b86089363aba822939f3004e6aeca5a44917500,4edaedd4ea65c0ef648097c70803c0ba03061ca6cad29fb4f1d81a2f24b6fa95628004cfa19c6ed654ad971c68d95910fa0eb79d5128c7b9c2a80731e9a32ba301,8f30956a6a899af26ae4e23d22efe61029832324fb5fbb69d3b069a3725d35be493835528e1664b5588d29b6c0843931bed953ef91119cd76879e7716142997701,579aac04e693d07d52c7db53d153edf3f955c69c4a9d9d302ecd8c2c8bd1e57c3d298df75055c7aef0584b17cfa51544a978af4101a19f71d038ddd236aed92800,f5ea80ce34ee010aec4e943bf974fc8b3857e581bf0eea4d445278246b2115356e0e93d9ad4aee1b2829b2a6d126dd629821ac3092b73310b872e7ab957d919900 +1879de37ab544ea0f90e1729272c14aa652abba1628658d143757d17b953b42db912748e6c1c21220066ff2a917bd27fd7e86d020dc67be00ad6a735c7fc43d60a1177812aac360b2c134e264d49fb8a4e7c7837afd606b6f849ac4bf55140e98bcf531e086806eae0ec5f0aa4a361b0bcbaa45db8138402e9e348327df2bb26c780,6d820352f201c4c6a063213b016ecb3d9c1bc62946f663002c28b28eff0a33b2,ebf77402bb3d1a5f84e66e6c1988f386df61d822c7bb03fe076b904d1c76b6716540a6c3af2e833b4a918a763975495572e7d7af9524749d6bdfd04d4346390f01,4cd2644403e2589958835e07713d74f61fdd3cb0ac0554b2553d1d7fc204e61b3d5f7ce4acc55cc782c5f9f42a9df46cebc7cade6299752338a229cef3df1a0d00,a7a8d017ac260a6167f2f2cfe028eb3515a642051580af830a0ed6528f1543d373e494e4517b7f2ff206f755c6d7c40882bcecbc7d455f3e326f8c36e40c181b00,258a42e5eed3b1088f843e1be3dc56a33a1d2b84b028460a2e3909aa682736091e5682ed0ddcbd9ff8dc4d68167c64a0c18be5a2b3226f323f016b7cadff886901,cedf75cc9f480c65ad3025c3120a6fd0ea0f6abfa0016ce3e233d4ef36ce72946c5812a09714a3ef25e700ae90fb6efd03053e68b549679a6d4e07db4c92341f00 +2c857a13301dd953e05974f2fdeb8d0c31b0b774e497b0d4568b82f60fe1db4eba3fa2d6a83af65e65b5016025a3ed34fedab81e200163d8eb3da4b52b7283f54a90a4fbadf4e068706bcb09ccd1f85ad041417a3f6be48c3bb41818622c39e079ea0938543a461a15f58219b4bc89c70185ecbc6cfb838339b91b4977b5da786710,89aea8c9f41d5251477202f76479bc6f4222483228291651a481b920b7b3808a,9e2d74976b6de66e8c3dc1816ee5773fada8558e457a8c78f0230a17975ece9144610b2bc5d70deffbb23cde544c4dd0e0bd7780bbd544720052064b78f2392f00,6a1547073b680ee0d11465aa62c55a8b73cbdad61c675c7b8969f34294c2d7965e6d9d8022c2989a5737050de41b2b0707f56810410d8cadd6a733bd9131c77e00,a642f6a4081b9881252fb3fe5ba6b06db6bbeb7a60898f70e8d77785726c5cbd7003eb9e59f02b0ff29475890f58164c2672e082ad83f4a523105fd0072742ab00,da3de682ca0ed41e5a99411db57c5e26d33f5743b6b5e2d438558a7d97cc60312628a272a5b24acb90afdc8af395b8bcf07a7e918ea96f6530791fe33eacb14000,2aa10734c6d1a7224a85546713ab490a7ccbc6930dbf94085f0a30ccb63030de741a7500f8065d72f65659ed10c92268e1404bc5f98401f8065bb7c1fa6a2e0900 +891ccc41070d9c1079099ff297501c3906712a4cc1870706f4918aaa1c047f5ab3b2d06f3f429b8aa56a42a67d649908f2753fd9d681cded00de934a38dd7b7adc4ff08a938212e1ffae3d723a6557aba3cdea1adaf6f4e889794dd97d2f50e96eb3c9ec0f93a9820361a251508506257a626f7c1c4909e256ffd2210c72f3e88bd919,ac1697dbdb7d08d986f09b7b163acce1385cf89eeb01b0dfac0de7780de88127,d6bb2dc5da1b842cc994e1baa1cc8426f4b9e82ee76a38e0f08f53f1ab0bb9ad08da2061bcd23331c06866687b24e517e3a8fc31f9ab6f167c4de996eee0223200,986bb87d6f3428455bd82179ffe577c2fd155b19300178fac8b97614c15eeff93bb198b79c68760524e5a54c2d02fdff6e7e6754d4e8750b9fe595b2aed0acc000,cb19601abf7cb95dab3884044e91aa94ddb836d7e1eba9a1cb22cbd1cff6435a00d573a4521b55c054e3fa664f4d7fd6e308ebee1c62e5022bada32af4cd745600,451cdd8a347d90058ffc879a086a306388a8c78b27c2d6d7c2bda1466b887e6743cd6c8a57707d846812cd745e67ca32dbd1dcf5d31b9ac34a6295cfc2a7d9d700,6ac5ce17e4aca9f1580913bb3a671c8acbfaad6cb2171a5611ed617de5f7733a5eaa42dd0733cedc10c469147c292b3508350f0397093e9fddbe5f48a0df4af101 +65975a76155d68b45099df67a44151f30fa3f67d84edf9917eb056b22e97369e4a101f2bbdd8b55d6339f465475d6821086a526d14b3a0d9cedd2c0cd8a81e4dd4236a87d00c9214e78ae9719b9fe2dc77449466cea0c6eb39fe0fc3979cacf5238c8e3a8055fe39ed6d427300ee685d06dddc5381ad6d10d1da096b259464243bf964,509a388a5a095df1e45c2478a6eb69286cb3d18dbb968891c2cc34bfba278ad1,f9ec561ca0e01b66ade0804a6db30636122bc65557ebb7ce7dbe8ada728dd38b5ed10cc425c8a18d8fe1df31eaab58b579de788c5ca200bbf1f0a24e1d6c328001,67376bff7356a8ade9f74d1c2af291d263333698a11718588ebaec50282f84766923fe77360000f0470777610a93e1bbc905a78c8b76eb2de11d25583d1f43ec00,16d48e25f2ecc14582eace1a55f25dfffdab95f0edaad03c25af5b176d7364992fc1ddb03717dcfc852b7ccbf6f3eb806dd9b7983cccb992a4f1823b303d36c200,ebe78ce56fca1de2bd71dd2090178eea4c4d136f5d87e7e721c692bb099b47c31df9897833e3fe3977b26736b4662532de1eb1fb6ca21e9c15043549d54a052701,9cc5f77d4291f39dba52628ea8c3ee8f7ff906071276fc16e3d7828885453cd12061f58f31564596d6b8bf7f86f4bf27f579cdf0ff4af5c3cbfd30ff0e364f8701 +f65b598c0892f722fc25ecff412d370723d94362859b37ff4b972f49f555245daf08de007d5d562a1f8d951525f44eeda9499a9515a2b9dd21dec79464e5b3700c24477b198061bd6a964220f0e4ba737c403e495db4241e655b24d638a6370cb91ed536202c14996a605a0cedc573334f9fe168598524ba214df193455311e5ca1377,4aca231260278a2ba3e27fb770dedce298f9bfbba29355cf4877f7354e38f2c0,4047ded181fe3647c5316485580b5f61a25adca3116f08f04c7e8e3d9343d8e342ccf0deb02918d5e938c70750681427917e268de66169818a6da8244443834000,aacddb411e6390198685d62ef2e2688c612486a97232c036e9908f5c2ed533543d6919a8595de8e32537eec1f355e74622dec1aa8e55256ff4be604754348da700,d071270f546929f2b0533d009107fb10080e4fd6f1d5a348fcefaabd8de7c5b0372b2fc4372fc1dad57c35a9985ba666116acc49528433cab98e93e98e4b326600,165872e6d3a81a6cdb99a80796db9332ee910874d981ec44ad882f31532944226198ee05b85c0d4f6eed298e1811a41a69f06f492ea020740c3d8a8c27785b4e00,204ef5acda36b56c7b9bdce550de54c4648476289036bbfe3c4c7436abad01b64d4187ad88668df1f0022b95be1ef8aa9b69d25d30b63557c74476df8b67234001 +90107b2fc2a01926861bc6ef4ac7a11e7b77b3ab5450934803a5ddb7ace2cb8cd6baa26d1c1f0978a32c0798c27d242116c0137b890d2780a9cd35862f86cadb48d1ba008e869a0a192619965a6c3738e8983f724d1f6ad375084f3c3640b847e04f909799e38c9259517bd1af2825f5839de93bf97d70656810f17e7ae3f408034fd8,cb751894c9e24bbc8dab9c3f0cad3bac566968cd702f0c0cc02e7fdc73a5d51e,f73958df4403b4c8cee4bd9ec070007ffd4c2df56a55940ef8ee961721d9dbb15fdb3f83ae414fc463de67cf341edae90247df6a7a7f626bafb0f6b4c3b51bdb00,36cce8cdf3000077eebec3d9fe8eb28815e9611d7d4334969b2b66e3e56136b959fcc54d990f1eb7a21732e7768e1b96a6fcab5fc735debf42a6f771bb27767301,6b796b64121cdda64594dddd1c0101170af717a80932c5b20d9cc03a84b3e5df29efda2060e54326b9eed1df6d4208b28c1fbee1da1a8c8d54eb32ad2824b10601,49160e9486ffb7b72fd6f1d74a27738d8a61d23de1c6fbe9060388662004f55c16875aa4988928a5723d0cdc37785cf86ff5c1d69fb007cad4eee7dbea946ba400,2bb1c2d085bff5c21c130750f8df20fb0ed00fb3d1bf78553dc3092d180a177437561e0c044e67cc66f2172a8448a9fb98f7c4f64fcddea6e07deb96a2ba481e01 +f43c2f57ef6c4a3336be20a80b3ee21276da7c52313646719f1c8b7ce60bf6d8b8ff8eab8fad99c5972e3f85d839cdb820d915ff7e8be86be01e1dab454b05fa44ebbc13e5974ba00f57752b300dea73d067c91de96cb8370ed3df8dcaaa2f9061446cf03ec16d74c6183e91ef50e52747ea1d077633ebc18c0b45b42209619089cdf0,664824d8220b4716e659362fc0b538d087b91ce9bae7326b0ccc4c7ace77f540,31539b7ce1a23f3d37899c81e4e929560c8eec51c5cf42a8d57b20332ae1310631e740f81746bd4e13de56c92b6a019ddcdeb193176effab582b1715885bf46f01,871583a30cd027f9790a7cf336735ab181e1b224a07cd5da76649d1ab361893228ce6c51ac695f3966d4dc0b7b2e443076a73ad6256c89332bf63d87e599174c00,436dc3d1f2be57efa107e18f9de91331ae6737158758d729096f8ce2c87e3fc70e34991715283fa60a75917ac94bbd6d85e70492ff5e1219b6a52a054a940b1c01,512b984339a0b9f02a21b391dac93756b49c8c76c413430e50a7d17049ad089e3b6dbc3803cfe40edf5a05507f9e22be9bd8ab5b640bc919d09bba9c5fdfb20b00,42fccfeda4edba008701a87588dfec68c39fb7d466a84cf2bab2b9e78946b6d852eee0a8174710bae6ce2ce88ba0c476ad66f939791c505b656bbae09d0b999000 +8985226056f950d385a390a8777de796b715fcb4ecc2c2c03ec6182dfae48fec04add10ee44484a35e5c07ccc52c0f8d0fb30b4acef346eb36d8353f0c10bd93326ed86447a9b410314a10c116382d7198326f055fae6217cece53d9ec5f8f5912ec58273035cf265929000fa4b00e6e7b402285635ec1f731bb74dd59868242a25c8e,121efdbd66f47ce5b4b3feebefbb606d50e5f5d0a185b49801d6c1999c3b54c2,9a3cab8f46776f2e9d20d67ccf5e26b35014a94bf66334bc1d41461af6dda10368b3a96bfad65708dfa8fb3fd0a1c01977962c29f14f35c8ac3ece607884675300,0cf19cf2cbf30bc3738fe186c46f5945198a643f86df43785e65141a7c1b4e3707f99a16716cf9b5ee8cd5afc281053a553edc22230cab56da7f4ebf0f6467f101,754f8c7c299f489feac7e3d3b063f8e0e427a9b0484657bdb6351ce862c3eae5304ae92d5cf1bcbe9edbc41350a56ecd5886e3bfa1364263cb84850c84fef8cc00,7e848909f5728e7f15ba50979e9ccb2491a7b4718496b6a29059b7f76a50665e5a28155f6f0bb521f7ca9212a23230f69775cdcf0d639112b253dc9969999dee01,cf26d8edaa523d892bca637ed5e7a353a4f2d75c0e6db857acd9b93f32b1c1320b9f0ad5a9233a63d007cfb6d9d5547c4336f3aa6af10df567e9eb4f1f6b941f01 +0c1c78c46a467b7e143a500fb95fab0e7a96e923c172c9343fdc819a50a7043dfe6a04dc162b6edbd5931992ce7cee08830acb44ba02c21884ea444aa16e07f249a4e9b1b4170d113e3a3bf27475a0dd50e1a4f814e04e493c4ca62a513c215d6b46d57f651d14c2283d37adaaf1d262babea4d7515d301ec1c4ee606b0f99f07aef88,d356263bd69a45fff3096b7cdfdff72b72371a3a76539ddfa63c6821cce7ea48,09185c07bc58e82337255727553c0e3c6dfcc495757ad3c9a6ba312318995c7d1bffc8527c04d89baa7ea149be7e710df4c9359c49d0d0711ed63c15df54ff9900,2c2cd9f8303917016392b19a26b7484014d4f354cc83697c9aa5558134ee0b350ca5212c3cce56dd5c402171728ad3e906edb43136048e5a18d0eccc53a4c6a300,db3cfa6c7d7be48d4ef433ef6cca0af6d784a51c91163ab0c9706df4e7805b49439140df1cbd1fa3e044cb50920b66c2187013d91b147ec6428c19acd848093700,120912377df1c22156ca69799b2740c3daf9a633ea97dc4f38eb3553ef28b8aa72c1a4032279d4cb435633798ea4267e17cdc5182a4249edf6d64d67fa21c07501,49a4956275cd0f6d07ea039b0a74f3ccbfee1f3e09be92da987af4aad6d744037b3fa3663904a0f1e0af3e1488e497427d2cc8183687e6cf667875ab707fa7a401 +0e19abe9a9a6d357e4ab43eb234fe9f39ec7919c16e4b154173b86449ef394455524fdb44a6a96838efcd9003d1ab15765665343e364922dec2bee703dcb4b8e1d38ae43195df3e10e61013503200adb725ac3a8b0d4b6d2abb7d89eda842e16d88151acaddd301943dd22ff9497f45a56fc7ea9fcc21250e0fdedecbd86f278cb609b,4fe70791d7949f1d167ad927cc0ee5c764028b5ef836e5a861e4e02efc471348,dc794f19222539edf9c71f838d4283da1b285e9b4a8462df10b23ba8c4175b0c6fe955950af2da758168682cf91dbd7c2dd2a39d3e182d5158c3ea04080a268001,b61ffd0ea5b101fde504ca9e4ce84d122dbb3ff95e0b4508d2a56950437967d06152607a4a3096ead91ca116fe7329773be44b582d2baa87838684ae4629be9700,aa5c5e3b48f9c9494361c8ee08548f7719be9ea78a5d43594fc43cb6ac07a7875645c888465f875e4a75261e482cbfbfb1a8d3faa8be2ace25ce95094eb1227300,ceb4c4f0ecdb4bf7b7591005495354a11b243adfbd52c59e7b0bf325f165fda63ba47666bf1d56bea2bb13854b7682dd68f53d95b12fcaf3076319faa2058d5601,884aae2903d28e169edebe7dbe5a6c54782503ce1006cfc7da71c6254d3231177e82ff717072eed3772b0ee7447fe05903eaa29bebda387a58c118a3cd2c62a900 +e3c1dde9a3e0133e4af54f25412d04a7f0efb807e61f25a32b251cff576d0b464c002c60397ff8ffc31fca33beedd4a2794240005c89378c74cbb3cd67f323620dd60921314d334172404f133bab401d41c6ebe433d8197a4318bd2dc13169da1a5c94413edb00dd02983ef332b28a8ae16695c78540e45fa4f5c29ee95f07f1edd8f4,e06909d1eff2499520ca8a91b2be5e6dffbdd4bdb27ee910a143a37b7f54934c,c6ca710104e77ecc6682d1690f8f46350b4ec7430bea35c5b2b89f36c06ca0e7239d6ab0648f04f2936b9d19349bd2c3733fc946677c758b536d51e0e840d4a201,a435ff9603653af83be24e2e83ab560402b3ea29b7e1feea6b7a7e3b82a18072428fc5d2d985f9615939b3104f3fe543dce1112ed49096f7fcc0376e66ed96e301,e66251168c5a35f8deaf829d7234e5b4c5861dab115c3abf84e9a2da5020da6e08edff3eaaaf1d86e3c9829ea57e91edbb3c9c8f476b0a4675cefb3ed829894c00,0b76cae548b23aa1b902388d5d96e8100c94d9f64bb76c514394e253a09ff919213043fba15eb0f2c0fcfd897d4639a50265dcac61adf3478b2fd39ff9bad88c01,9e14b52a09eed0dd0f09f6e8cb76a9beda516fc3193fcaf5d65030476447e8e75aef858d0cdfcbcf71a811fff4bd116373ff9cf5b146521572d441e79eee53b300 +b351233bdf77de987133d2e29b24475fdcfb8640b8fb8867e655d93a763e8cceebf67e37d641c81ce28f0b99a47f2bf3f11d59738233fc4642eac5e2a0aa1f895db3543f8742233b848e61e2a7e0509f9bf9cf3dd299aa13590c7985c01c8e3a7ac4481f4e6aa7f04cd5b5688b9acd5a17fc485b9692718cdcc7848fe5d9db9e933a3c,838f18d78373847d8430ebf4d13a753e4ef0dd5eb25f9f66d3d3797507350ce2,8b7ea12deb774477b87cb95eebc70167f6dc0b752afd835fc48898a49bfc6bd969a14bb81c9f60eb9958567211e3281a339289adc1a28e9f847c6a31e299f59b01,6ee446355db0dfe67da61aa55f3fb052672db5a7e58dfcb85a02ce6775acf1c26baa0775538747935300031d24d17733a0c912be85fe8f726b6e6533c35b40cd00,033b69c19db8fbd53dfb1e04539c09181883dd17d2b74dc18229c695e502641b6ff203d34dde0550aefb0e24d28ef49c066c6679eb29b07f380fc4d7b067506a00,3497d7e25be4cfb7c908b2e6e2fa76e0aa27a0609f0fd861a207182f0c92548c4af087859920cad0d9f84bdfeeebb5de2446a4427118c5474afc519f3db9c4e701,1f76f3e0bf113de27cc6fe6b887d939f25a452764a82b58512dd23a174a3e00b1c02a82063d513ded93a6b5d616fba731ac0a39e9f5b5f2e71744f338aa3998d00 +271c91cde3304d96c1546f11e4deaa0bb6a733e0e98cdbcec47dbf6f2a97123dc0a0704e5f95227de0bbc8a2c2a1cc98c4cb14fca16a4a1cfb6ad72a1ab0b202df5733375f7f3bacf5acda289e9a9b57d728f65c0b1356f41af12c93362a9157d9499575a494f66fc62f0ff738919ee58f7a6a953ac165ee68ba13fb28ec24bc096a378b,3cfd824c6b436944a8b15a00eb211dd7c4736fbafdca183b12a14e65a8cefd40,680d8fbf9050ee291b1a36ae3046ca4d661274e0a0a08c808aa9b26dc5132f8d2ce29c498df44cf21bb05a28bd04591e553ed1793931d374dcb345955a973c6b01,9eba0ce82f64a8eb5372d2ae97aa46aadbb19e1411c8c178bad5a91a3587fb883288a665083dab6b549621f40bda46d8890eaf282905b4140a5cc21bf6bf78bd00,267dde756d59f4c4d0d7af8b30f5f184ee89eb6ded3bc4a99359b24fb0a1f423366625b5e3a5f69cf601161719773d050b26093b61c94a364dca9103b749dacb01,c67992329fa66846ab513ea1bbec559cbb0b7683358c7641080d132508130bea7abd219f1c4e1f4c42caf18341c8db83eb0a593fd0a8e1129d898d0157ae0a1a00,9ead29edfdc5b41ba6a4433f5f9167128c0fa84292188fc3c86bf06b99c507703e2bb76d2a6f188d36b2a9922d263c4380b78f878cb9056d426010e9470a00c200 +9b8bbc38b8651e80204947b94fd1dae9afdb262259613e22be54b1ea5b7c5214e200c98b0aea70166be4497f6b2ae929b495be90d42b18c961c751a6f208d9f0b28ec82c133b289633bcacc8eb041f7ea24f61af124d3c357d4e1e2451a1f01c36d97a82ff80aa6be65cba73f5cd0e8cf01ea85e7df53eaaf09457d01b721395354f301e,26031d42ebe75be80bf91017f77b0d7fea38773bc93599c9dedbb0335b8ea7b5,6a14e4b3b49b67161186e285b4bda4d12d0415c6bc9f88a7e0ccee3218a1d1b1682157b51e6d6a0a483d81b1ba2e848c2f8313eb1ad2f2a6ca3482be4b85fa2c01,d1b58479f165d9be4916536cc9ad384c4f8de4aebab102cb628ebf21e2b97aac16129d7004f233a49528826729ce94367431e0d7165aff20a1453954be2665fc00,f99b1d1812bfe8c7baf9c3fff939fc14bdf5db63a493a56b23bff6cd5ffd6af4247ee533d2261993f0e9e99dae87e4c4991bb2be34d2c2e684aa7c242058b7f101,62ca1843a0f9917cdb6660e868189d8d14e51d66a58caf9b9d1105c24561d32d49feed3a5ece22bbd98b71bacc145ca80e36bd8f58f7b79eb214c6f4e0e612d301,62613bb5690ddfc46518b7c888dcf36688d805f400275a83034b4e6955fe093753e0cb15b15951a35bc7d173a515127eeec86132a3ef8f306e98f4dbdd7e254901 +22fb3b9139a76811f398ffb70914b84e87b6db2f6a9cc2da367be5eadff7d9892e4c097bdc1c8c53a07f21d9f9e81acfcd5cd862d2897064ef489f5fd2244a75d8c8b26c4deed194ef479e68d2717678fff36984d64860a63782792a13e9d7d45d6128b361eac0bb8cc8e07eff6061846f71883de0ab9a2e1e28d7301c734720043c2b22,bc1447461c544cde1d05217db06fe9221fb46d445cc6007767e30068848b2745,7d1665b15c2a90400f0c0648021131a2062fb70a60b100eeb77868dc8ec4a87f4c83ce515af9faa8bc654f49e7a250aa32fe63c18e371f1da88c8c6299507d7200,0458eab6b9857294ed4a5c9d0d1c25d3ef81aef071bf866836df5a6a8e10adef04b7fc02de64e437c2a562779ee3d173eef81a50a1dfbfd8fcb2b3a8d3f8ab0501,2cc507ef328ef21bc6b9bab075c81c06035d38a27c2b8819b205100d1c3dfa2b16dde1ff618f3e115050ba18e0da8db1b205272ddccbe0497fa522b37eb669d001,6ad162a18e21bfdd3d91c0dc2ca827b97919224641afe3719f4a063db5fbe3d94451f2729d9f70ed99124c7f30abc6df96333f01e4b1efdb5889f1f1a7c71e9001,039987fbba7d069fe4d1d81d082c814e85b3b592d1451b6cb89696d0a501451d4ba39d00ebb0646b8228abb175a0edfb7867c40d83f354570faae6321fe8c33700 +f13287d5ded78a8052de7e77dced3d7015ff20ed2a0a37eb10b3af3e336a99b759213500a018dba10d041c4f4d5ac44a77d36e2845a9881e69e9d6fea3e0924d0034b5008091ddcb3f86e9f7ce469b0459e6b2f7da60d668694c7fa29a112befd8bb23dca7b93ee94d6e497719f58dc857ccc716e76db82d26c353af67a46ca2dca20f43,6ff4ee48006bfb3168103c3d1d661cebed8f6849623b624d0539b0e08280ce97,467c83a6c584e4d8d2ef8d05848bf3841493ea0d193a939ab18b3beaa2746d0a07e99ae3353d433619639c240a22b7497dd04f2c0543056f85cfb2075ad41fb300,b05a103146f3c976cadb8d1ce848b22baf6aa25cf35389e0a481d58d326725545b5303a79e267d9896907956a377500f6ea7ce90fbb48b5b375772ae607971bc00,fa5828249fcee7e92ef574c924c967ff0bf1b299ac2c7ce4ded5e2ba895e2ca80c8939429b81526024d984725d32fc8a0ba10a77950076f19faa8f855916e72c01,583515ca426c325e8e208c367c777091941cd805ddb0d5e5c619826776b85c1b266ef3d05471c71cd896b757e0128ebf38d32dfc9615b54d4321d4c05b2d1bf700,9d3f49927b47b81d88156aed172cacb7e0f1f256721089fb3bcbc5824fbbf2e3224bf56049e22482002a258b82e491544dc4695549d599a1dca37ec73316764700 +6d7e2194608d4f67c6ed3379ac33cd8eb9ee0003076acdfba97c52b173a68b204da7ebcc5c35d0f796eb677db0401db5a3cc0b16a0de5c0a37146a876ba87034b98d10c9166b65715e2b9e23ac3048da3d255f90831f13cb14f57ea3a713acde222c1a6f804624b1e2eccbd32f057de3cb348f79aa28f2e0688c285657c0acac9b941eb6,486c74a8d123fe0688ddc8d002bea7d5ba7594d17bf3e029c9c59100c3c0c9ed,4b5118a4f11da1ba54c2f7b27a9dd0bd4bae87b0b32ad6cf723e23fc208946957597df33da44b43de942dd3fde1e93c86e00966e16ac1d7bd1dffd303c74bfac00,462ce80049a59f6ef1462793707abd654e4beaae32ebeba922dc7bd9ccfeaadd31956b2deec4f49f7196d54b07b0e1e590f7848ca4c8b4c6f3eba4e330b08c9a00,16fca0bbffdcd6b96788264adcd399c9afe429bd4a7f66d987764915ebce361631789c9381e13dd9ccc7bea6f00a9b7a485c77b8d39ca2ea064c0dfb6295497701,0f2f3a14f5499f993b00049e9f4c6c7368a9590a5fd98c7aa79ece391a3d4e3e0d45aa69222095d68181d8eed1b28cbbe04136806784a48d6f6f5b0b4a80d7b900,083cc6b12deaa1417ab34463b4494b3dc199be9c6d74b9a2648cdac0719f33240211d54a1d0320f2daea405e0cd38f16d606decb9fb61d596922af626c3195fc01 +77c14d5979e9e18053abde8ab72d0d9342d666921d95aa104db5bde58ecff74c7ce4baf8b0a28e6875b6e4d842b6c8af5588903c63fbbf8ac8919be96400c1b005df63671d2847dc6b342690c4c8eefa6c8f8d61ac6515f35308bee0f7f59d28e9f05d676fa02869576e7cd26cd0edf23bf03083cbef90963ff11add9a2115417b1f1a97,c3baf8028353c978c005160a238f2408e4f01f6ef3fab46f9b1659e4ecdeb378,c638f81df263bc9d463d70944c20ed8285e5e62bf87bc90141c091d2fb5a1a7e7ac0b25d2cc0838c0dfbcced19ca170e87791562841d16b11df30ef9cd6225b600,5255da972e2b4222434a246e2d4fb81b3971b6984f8107e3713dff7314ea7f401151418190afcac960fb195c3b090999474e0e227b25531dde4dafe59f7e66e901,d519f062d4b9403db563b42cf8d2c5609d554e9df6d0aa3789ae51c94dc5b7257b224bf9e5792e34ab7ac599c8bb7daf50e4e9f4aefa25a53d860f4da2992e5e00,fdae8d28ab592a5e0297d8db8da555b47838a322e51bd7ec7d36742e40d106292073ced841d4aeabca000e0f7c247406d37ebacd9a0511bc79925c1c84c6fa5e00,d317aa61fc6303d81af62122105b2ffe31716314f71c74cffac61f5eda1579f316d72f243924e75093606a7b1b7a275ba2766f3768f4b6ffae04df0ff2cebc6a00 +9b599053f41711195c2145a75b09ff3d2614d0528a772b629611bc70a260ea60c219deba9b4b65fff7061e819c2d797dd58b7be6f074cd99508b9174b2b28998f5bfef875bb074bc9a62302dec5f85210be37329b5688f33d3273fbac391b624048d0aba07f702c1534686745f9f517045969a247766d1d60e270311c3046cd16d21e308,589efcb4bf10e393a71078170f4377153df704c4365f50df424914047e277ab3,8dd6cc04722d29734b2e2c3d4566c46618b0a002e2f0a11b0f43aa358961a4601a211c96a4f459c8985b48456c0a22e4106c653fcd59327f39898a5ac5d1fb0d00,37430e270ad40bd022add8bccbd428a1ba5c7606c848052f195a07afe9ecf4b34684d9b7a9adb4297a2ce9c4d37d0faeda8e99e01d5db8a5694e0c851207753000,eea59f0a9544bf9a3d98bf97f5f0663c48ab05da22a11c8f7e9fafa6694e19063136f98b27562fe9f0b33ce224f4280d0d3e9a057e1f1fe9325e07c57b12713c00,b7ca9d1f8b769df87ad684fe72943770496947871dc04b2c29dfe6459b68aff53426fb125dd03dee59e92e8db1fb27444f320a4b56a4527273fb14ea38fe2b4a00,eaea1ef8d2125a64ed32d63e15a53daf3988b5452dc3ce1254341eda7b62fda155d2410f33d889dbd29d33cfc5228f689bad9b4d3d99a3bec9fe7291589908f400 +4dfe49ea6cac5af2f781acf53a852a013a0d2a847643bf1a06134afab46237d4e46d0d3da17a23c15499630bf331be930516756bc9e4319656e392c76c7e217c2b23fa1f8c68f9b7be827c48a8b0d45171b9cc49c1da3e0a0183972073c3d9fe001c00dee751d01ed5e33d4aa52cc1fd613b17709710f12d3992631303f53a9f9e5bcc37,7bcd55e14c8b3b5cb26e7f7935e22ed9981cbbfbbc652193141413073e7e7b6b,ef173f099ff434fa95b99164751d56c2480e1c84457458018c9155bdc06329c07cc83a8445ef5645f45290b77f08ba4c9e881475611f0b927b3d99f37b6ce2cc01,f21e77ba97f920079f020cfdff98d603cacaad6753fefdc8f33c65483405163e429c5659988fdfbd2d4eb9d200780a27358bc2da28818317b1fbea5ba77f86ce00,88aa7d65f5414bd304b1e362e02335bc2ae8f11ed41a6d59ba6310c7dcd9bdc829457d2ffd5f0130381c15624e45d78502cc1dd5c3e45acde8f535f0efe2939c00,7cadbcc20a6a79acfce6e6eba7cd7f5259b2161a2ed6e7b51a91ad6244327e313b24289460e13bfb0bfbb7257efb95262640777decfaf5677561a1998b189e1301,16a6f2a4b63a1948dc60a502104fc2a5c0effb9f59803e8b11a17d3c8942ddf420164a03dc867cd0b8d22a16ff08e4bdf9caef57f0e07459a0083e011506054001 +7005fbb45a5c957e8827002af4dc7ce0644b500ef8a60b1ca522de0bd3c13140ef33b97d496834a6ad7deb1520e8e447770980f27f2640a5685ae880e45f30d9f78a04fdccac58b7ef78a8a3b68aa2fc2b37b631872cf9d9a77ee971dee04a0d67470bbf284f9ddf087ba856b10647d969a024dbf705cbe26ebbf485604a75251892c338,591a2a8db89eb6cadc3f9e82a716569bb243fb4e0593f2d591236f2702f82346,b2824825dce44f5da698c1b9b184f8d362be02c063df8dcce81ae0194f12685b4bd38c3492cc565738048edd4ff66e614fc75eb61dbfaf945613fd5f7399f57700,d24339dce2459b6506b09d1d66ade280fd43e0020b65df7992477cdec5defd201d46c3b596fb1361f4820236e6aa7e574df1c338815ace0528b558157c331e2901,b5aec7c569cca130fa7399d51162ffdce4a240b610835d6d6689e40248711d36107d073ef81289103b7f2d81c8806e354e2b4c13225094e5966985406c96ce2400,1c8478d5e0fcdb4a97c99ec8e6d0a4d9725e4d0dcc2d3bbc81826239ce19493460519149c7388a60dc5dfbe3867c806d9899db70f760f24b00d2880131bcf36e01,a4b0137dc90c0027423b657f1750ffee89bd5d6d2dff441c2bb71edd81f90325285f75c879d2e7b740a7f695a9305f470270c4bd452a7cc03a0a90ad79e275e300 +80d1d22f5eb8e20a080e44dad49886d1dc313efee0979550f8fcebdf54c9369e2a7705a272f01c6df2f49b361e1817995fe36111e197f82540b165e4ec9cb61d02edd81622b8c1b428315255f1a90e62c5c2c1542e7e928b98e889fea8ae40e51569003c87cac934fc97a569c1151c0e66c91cbcb3e854e05b8dc9bdfe64ea61594c0674,5ac73bc862708a6fa51c4fc63362708934825ba0868a0e2e74f110a74fe33fba,c67d84898d210b598bfbc9accfd6c7ea93d5f4d7db2349d1ed81af7cbdfb9df70da9a892d4963865ac1273c17b808a49d010a398db8895faab724b632dd0916d01,920c79c29eb119b31a1b53f4e8b24c0b7c579b03e8fe9af40efa16cb5f92409f240ffa8f1ddb3bf0d5bc0b4a86b6a6511ad901bf2c75db23f4e800fad3e5b1da01,465f6102b2b045954ef05eb7e8480dae2d8900e09f71ea3ecc52fce2882be47c63bb1cea3310b3977633757289308162363cdb2ebf0a7e92195739712184232a01,60d53c926c924e2ac60235428fbcf76d4ed5ae2043521c18e93bf62d0860c5742fd52a831cc64720cbb2d0d2baebd08510013080fe0ac537974782da38f450ee01,f4af2232748611a3fcfed7c741f7d8707b5574b8a906624b8b96bb88e00a173179d8d7a970c37c8d1522181fe18c451bcaf6f495b13c0c3405a9563b6eca99c400 +53f9e23b6e6268507d76eff54ca7ca6ebdaad07af40db90adf4c4f3d545fb46162adc41a53af5a5736045f8a4120dadceb53ebe1de52b453526261842e9df67dc50c8cd05307b81407a23dd6155b5c3524b65f4bd5b3eebd37a4628cf7a89513bfa99475a6da99545842318994ebf466ccf5691964c551ceebf12b49e1d0c79d9396d749df,3c6d0313eaba888bb8ebe90b0d87ecb5141da836b1c70a6fabe07a99b7295f49,9d2c97958add139e78cda1bbf390c9bff0efda41878e36bfc9169b93542bc6c53fb179d66291df5b36bbf39544d4b8ce64814d7e22dfbd53daf194d74200e98900,355f382d065a51e8f524d6370c2615a3f71ac9d2ed906fc22d996121e97e11a4670faca933e078a00efb9f33ce4986185d8d747621812fd69a8c20231e36536301,fce78f6dfddd2d304ea5dc1869f0de12eda20cb944b5cb23adc21cceb4c045681c11053ae90acf88aef77a07fd35c4b16b09f6b081c8b1c94dba26f44504d7c501,5d79f0c68ec2bbc0b1883dc8e0aeb672632dcba6c6133736ac419209d58ba34d372ad38ae9ef641cde277161c2b755d85ac37bfe495d37b9129bc3270f05673801,c8ee38d90ece9fa9f1e96c0502cd0d539402d8928d6853fb341d62e4f1f9d9433ec52068b920b73a24ce816717897d72566dc8adb27dc835df5afa578788645801 +fa7ab8a855be6718b00a890126af7c3059b108570c6c30ada254cf7b8d4bfaa755b458cc26bce12a0d5c869908ce2887579e65d0e690a68422c5797339a9dfd64bf4ca66b4851371376f30b4af02d2622436eb3de1d11e5bde8fc4e408d8f06a419013fb27fe0387e3d390acd640f38eabc45dc44c9bbe030c1bf2c27dab0a119fc38773f0,dff8c05267af70c628e84261dbfce7695e0c8661d6eea5cc1496a0f2d7bf0527,e9a93ab169e36620d6c29be26b1655eb6f5d437d900f10f26c0ac898a026f54677ee83281c585ba62466c356ce48d282010f8eec12d487f0fa53231957400b3701,023dc26d244341104075637e8d4b7d4b37f8d89d723e34c8506b5b1852e2709d45c248762e9020eb45b06f75c58546beb5b8d3ed72d67e21d3c93d4e5abecc7001,cc3af62d2ce285c1fddeb9847a7923f850704f295f6f5f6d646be0c07f0b88e9121d4f1a2df0925a321a286d35fd89233c1251789b7fa39f329bda74004ff03c01,8bc1459292458a29a760a75aa113fe9f17c73f6388050e8e88039bcba59dad9469ec0bd4f7ea6a2ece79402a1a131366ab4d0fe792a21155bd5974bad38f850500,c8088b86cc56426d685f16a3d834c008e32eebb30e66c32e04e6e6eed01401e8325828d39275b176d19e735bf199cea2e83d6567a3418437309d66e7f90f279b01 +e017dc2adaca44b40d13d1ad0186d6fbe93b5557655be889df502e42e73e7206be34476d8962fca46a2522f7365539da95f3596318cfad5219a68650d70dfa5d0481ba5da2334ddbca5cb76a85b4114e14542ba1bf189826739b2bfb78be3ea01a7efaff631027b45a7c31389954379b69920fa1c3e2edcbd3e2fe76b2f7587a8fcc0225f8,ece373eb7797db5197a3d72ad89853a05d6fcb352d92c7b30cb6dcc136d21f35,14c93ee33fb3957520fed70df6d1116c5dc3a42666abab5a6b93dd4dc2946f19038b20e645ac915bea9067ea6afd93378644779b9bca5bff82a86be29d38855900,b7de18c000ed0399a3ae732214285909c2af9fd40b6e6874c4eb703a25d2bd1746fe4e658feb228fe2c22aa10d8833b389c33fdc34b409e24e918e627a8938e100,d3f862886ca69f6c672184a99c472d1b6ded93cc8146b543ff65be626e3949bf7c57826ea6b3a42d27fe17e32eaea1077dc12b2cd75b3391140eee670cb970d001,7a1f70453be417b68d0ab47e700b65da823ae53d1e2256a7295d454316c4fcd008b0e271ad97795f30680ff760038c0302d2723c6658fd5401ebde463ab6a3c201,de0635a49ee75d3c5da562bf72a7aec325cb650dd59a945f30a3cb3b13f6cd730e8a6e0cd40102dd5f8457510734ab5d882656566ff5b6f42559b2b95a27dd1f00 +6e40ccb33b27a85e1c4810eae53ec6eb174fbda52cefbe946435c556fafb632368b7a67908258ab2e454953b105dd3eef2c28ab4394a2ddacf8a7ecb3aa1f686112294c45779360d5e49ddf53eb5c072298afd4e958afe8ebecc16190d92b0338877fe03c279a1a76cbd5626edb941b2f9bf6c423283b616206f06345e4995b99fc1411dc4,878e43d41e96ee0ef4278d0e756e66a4f34a6136dd39b374d42b2f00acea32bb,14d2f0793e3468cdad817821c56e42e99e58a009d685bd5bc94a19473e5bc70562a1b0e96c97a4222b9b8f36888ba076cb00c984982fcbb410c5d3d8c171e4c801,c082619d16c60be142fc2fd9b5deb55cf3ae01e12f6ffea10f0577f12478650a41a3ed399ace11a1bbbc00d5b03c018ca4c4dfc8e592b586fb6bf5e0b8125ebf01,fd00094fa7525bad7c55a51e4d06c371380d020b35b9f987e3bc837ac86c9f8f0d63f7ff1b29839cafcef0c604cce1fdb1230de0c1f2d373240e17c013b48f3500,f36c0a2202a1ac42011a9e5a3b5d11c0c8c20be1675dd73989ff938cad0a362f12d1efc61a299d919e8cacc3f7834498a5193e442fd37327b3d2c2846abba45b00,7d1d1d99a8541887285d967643aa6016138de8621cedc93f917b326b8565e82f376713e1ebcee762e6e76ba096441b563a57ab9dcf7b2d672dfb91e76670203c01 +67afce83474257798baf2c81f25945f8bd4f2426b8c8ad887fbe93ca3b91539b488d5f5ad078519eeab7c6cf50856c4ead69b260a2e7299b965db0f50ee32505bbd87b27fa95f6635c6e9558c520b953cdd0c12d04fb8d7648aa758b698b90c5fd7e3665455fa33de51308798504973e39e15ca507e538b262c021b029ff523c6e8cea6726,44cc7cdea45b4a961481fd5d5f9b1fff18da80d1aa445c3260cff540785f1d47,b075a54a45c1b76bfba19012cdbc868f103c4bf6b417a5209113f557fd9b5ffc4c0708a60d2cf9282b51c20ba67c519f43986bbc8d20615ec6d6882d14cef4e000,daf14ea78fb17c96752eb76ef3857652e76cdfb19f4dd78a4b34267a7e0ec66472e3191f23b31fc87c9bbaf28860316947a8eea53fb0107d8f45a78c374b1d1701,b83636f2a0d301369cda943438c5b7c0bcec4aada1d7011761da82c236afe82e161e2582306b18312e2b1a4610fd05b38ab43cd73e24c83410518d384458524700,3fe1d403fb7a0733d04ebe6419d017908e3defffec6766017b78c29aaa1ed9851ee2a89c1931c721b3d972f9f394a912c475b03830b9f445dfbdce77948705ea01,b6ca0c46f4cd950fb7fde39a678307adfceda249c61e31734bf01c0dad6825cd119503a124e2595718540bbbefb2a976a55fca408518b97c2201fe25f76a28d300 +8ae198618842631b99ed6d3812a165f24ed2b8c15f781a6858f8ac6699a56220b1331e0955466cfb57c51dd3795670fae74484c901fb59e809c8d86e2fe35c7237526469abfb46c7e8e1e0dc7faeb59530a81b88765c18a2cc9d91d3d9b5003101588174372445de3628eb6822bcec0c94a6be7b3bf98580b718a8be1574c7853ce3bba614,680019c6be8b630032a2a3493dd65245b29ed38d4990d6f56f2a4a0ddf9e65f7,2c9d6fab1955b1d0e1db3865bbb15cab3fec59067a29717730c2b374dae0f6e356ebcc4dec06d78ecf849622a2f2078c97f86742a92b47043c172de35b461b2c01,92cd30d2b4808339f80db913b7f87fd143d6a0e92ebfc2b695a9de2ed66aaef9150dfc5f6ab24e39ca2badcc654e1ff51e6c444aaaac426e2e47003e91789aaa01,ae55f79b802a4846e029bd61cccc7ee79cbaa033f7061bd81852cdcb6d3e7f713fa8437ed8f4479063e66ef2f5f8fb5b4dfaeda270edec9412a94a572a79b12001,bf25b3ae724c45127202cd255d9bc53d3d8810a885aa3a860f98366729b187853e228d13f50dc6295896aeee96195e2043f982295455df1195558d6ea0e3f3fd00,ea68a64aa79e4c8d0f875878cd16ddd83618971a85f9a24a233facebc10c9de006c0898c1d652447c1f801fc396bef94f8070fdb340cd6ace0e8c1aa3f7cd7f301 +218a8bcce440d85ff8e62e51856fb36aff87caae97e392750dbe8458963da765788d9817db2d0892c8f5349b4ca6ed550862c1d7ea9566d4caf0797bb57b9b01cc8c300b9226a4b6b965b6558d4d75b3437147a5993ae80fe1302861ed1745488a240c9aede78a2381d6c55c89784365bd0beff2aa9dc8a6b2cb7f4fbedc4a50733dc9273a,e180f798f3056131d4016cd0bf341e55d7a1657e0bfc5ad699b08abb3b239a9d,22342adc7c4ba4401d7d2156225724ea3c32d1067ca2c9294eb0365e1f1353336368ebf8f20250dafff9174020010e3920d55245c9eb9cf0366689c09a98269e01,974358baf808c17d07b7abda3c8a7d7501b0fb3af94cd10bda643a8a5203d631438a18bca94eab4abcaf562ae850029b1ec5bd1974628085d8f778dd3925f68c00,f12443485541fc46f4c6a417ecce738e793d6647ca302c80846278bd92d8fadf0978e98d7323f4a8027e7197aba5c5c1906e96dc4866010e9ce0c4c1cd97cd1e01,5ce41ba2e51c736ee37ee61cf8fa46c57e583ff2b49c046e7d4edce2d97f9fc66467690fe3ee61b2833a7eb9cb51b9e5ea2724b3b2b5d1d009a16c76c11efafc01,e1420c7a23774edb185b2f02f91bdfc97f6df3525ecdfbe668eab605e7b5d094704d219db4001d594773ef06ca3ab198996a9375d3443ec3b1bbc4adfcc6960900 +da3f6b00bd0f7db294e54bcf3be4a7e9cea51141c32c078f78787a81095e52ad0a296f6cdef40d52b0a7d42df7a01ad595748fd066862845d05fe7503e9bf820c649dd884598aac2c5c90c85a54f59b8180d2d53da361c8fb918e6c1c1afe12f0389c21023f0e1cb4820e093fb0f67b1eba148fb72520979376699838cd3b30bdefdd9bfe8,481b14ef18d48fc6d1400a8e693b9b1bba4752df8ddd4f290041b2690d92d17d,6124e1eac86d6959e246a457a6f8f0bb7f628f511d371f7c922e12f35353459f4d6da319c3acc16b5be82a79a845bebbc46be8000f6547de1aebd7b001df728400,784c626eea7fb200a9f765361ee3fd7f89a351bca95016afe7311e70a2c6ac282f0f8173142452e043872a3a9cd03f3acf54a277437bd2d7b1d3ac815cf2525c00,4ad85c914e606f592b703894bc4861d5f0d15bd835ec281734a55d74c155d9f179e8a8ac68486464c232761497eecebb475bd4e4b3c82caefd5dc9805df57c5901,0673014a3a2cd648427ce33e527636f4fcbbdcdb7d3983d9c9a26246a02ebabc264d1c0ee821868c1b225145b80e4e1c4a9e5de72b67e702a0eb85437c9e541801,a806259617513be0421f47bd9af55b1833d6534dbc8954054ae89de7b529c1db759916ee78c96370bf5c040feaa13d22128ca85689f67f4ed9f53201a7b5e27d00 +5ed6b449def7f6f666ac1f0dc8b17451173b69bf8208653b71c0a9a3dcf3f4583decface2b35eba597779224cde081f0dca1f97cad7140b73302521b9507a1f91b98d0478f85cc0d8661f5f48e49431dc2542218cee4c2ceb5cfab54d0683c869120ef52af52aaa5250903245fd26da056666b214701ae5d48abce08bf3dbac9149227134d,03027bf1f784b6d13423194b9667256b4d7e036ecd42f3734330cac79bcec115,9dffe57fdd06f272e75e5f95d3349261243d2d5feeef08db7a923181baa1e07373c966fa3b2bc82470b1310eaa66014293e950cab993af2667a709d61f14203800,85aaa24cd0c34d9136e830bad56d1f32f4c7659c02b79f72567d09e2733b21946faee2fa88d652e31bae9d72162e8e0f335dcc2504fb61a119037ca4259f26c600,709b9656c231e95ef71aa6563334ea19d102d878fc30075e068e274dae6434ea5157c3b7b842fbfd9f22aaede12b4dad869881b1171c0da16b504920955d01de00,c8cfb756652b284938e9f6af0d1aec329c5c261becc606b15094905c5386701a01f9200843b38409b14e82d276b3a592142698a63831d93bcbd07576346a899f00,ad83b2f6d3e85af5307e33b8bd8f438f1a4d6276ef57fe09ac7950e9da3095f925507ebced245aaf66c99f5e007103d6ec7150d427d6c7131b85785112ccc7ac00 +ac6e363e07fe28e01d8c9853646169b2202f4b35def57580a0dbb0f317cda7c78cecc51b57655dd9ed38b97f532e8b11fe82fcd706d04058d3152290307b6b279211ec30e130497654a484c2d762d2ebb928bd80038a2cd57045b32efd39b9984c89a8ccb4757cb2d3ca43fc68b7fc4d49569742cdf1d8b5e4b40bbc4803630528d4af7e36,7d01a63b319fd26a9ffa3e26efb444f418435d46fc43c928a5af8d33e6d43187,677219805e4303395ef84b8b1f476569441c934f725437fa7097ce9eb9167037184e8c698624c5314d606df3c5ddc30891d6beedb8432758f500e7caff53974c01,4af0ea7833210d4f05f376baef445e3a952cb248cacf4991772bc39f490e6cab1cfb84039d1bc43e228752dfd0f74d203a50a899050b5921d6614821320665c101,7a55d674bbc910a29ea4c64b7e3cc783ec3ca975001edf9f13982cd72f457ae228426c90f6f97286da4c43b82f6b6fc691e2e81714c6722b30fb8f2735796a7501,a274f8902e79ecd4c618799024bc1b29461ecbad1d57e1adee05b288712da4e23aa141eeed5fe6954fbfe50db9ab81429c69d444976e458b0b814fbdd03d419400,2286cab69d45dc481baf61ac2d2192a1d7ab9c4f7b8e8788cbb23f170ae6ed6f1f9261ac154551472cf7f32cbe16b1ebc05d6262be52dfbcebe847bffc83550100 +d984f0a8171cd15a34ec8e8690b69bd0864f7dad68aaf2e949c8f87aa527fbef1218c4facfaa331228f2b9ce09d36887cff7a843456a2d5e854714cb35effbd3fd3d448509dc61be4b3eaaccdee6ed8f441ba846faae9956aa1799f83b8ecbdcb12d14793f4d0d999310423137f401238fed44d4e69b835e4070698cf291666b2a991dc3e6ea,7c9af35c92afe22d484526b45ff99898b81d8e3562526e0e01ae281c1f34a35c,73a2ae05ba78077033e7cb3ed714e5936549c1666794b934cebfb2f125812dbd02d696fe2ff78418b017e1a9854f31a9fc55b43bbc0f6b571695d0de57c8705001,58053ca17e0fb945ae197d14c29ba3b55b6647eee14955ed04dff17fec99b5ae2f78c7f3fb279089e99c7dfcd6a9ebf8ceec972d5d54ad1af6fd08a21c440c3500,7706e7364bc8355b1690d63425072ecd91a65c90c27a1c452858aa43116e1c4843100d9dde9a2d29b50d34093d6144e19c23f33c42fea346bf8f9133f55e95a301,97e0f489066cf34c0d1ec296caf5d989ba68e8445fea668417994c60f58d18d65c74a7933bdd7eb40a8fe5bd50078707fbf2cd9902be94bea8b97c65b3a60cbf00,f9344a7377ccf5b12d4b15c3c95a8fd58c9f907022a75c3d8c7a67499221144b0b04266f4cc48268501d7a85e748b403a8a389b7a62f89090d399a8421fd6d2701 +4e282b944faeefdf2780794d317d8979f06ee1c5d64d8ebe8841a062d87376808fb0e6e02957f974d77aee695b41177fbd343c004b772c89cabc1ae85612d297dd5eec74dc6046750c6417abdf33cb50088b2284eb8dc60544c8f763c5a48c607740aca23a627d29e2008a0096f32168657992b2fecfd1beb9dda2bd891bcaa595e589a93e17,f0732cad8603804a939416f66aae84b602aceb4ba280c2952e6fc2460013e98a,5fdde2647db77b7b57ef25fe485b9a81119c42b65de40ea39acb74610250c8ed6654566edd96dd1ee38dbec781b3a2e7a313327efd3ccad05dfe3898a040da2900,4f620034b688d60a57bc11ba652189a722079e04c676d6777936eb9dba26afd46a556c4fdbc939679354578a01be1dff2f1f63b5ac6a31ee7de045201382b57200,801e38c847ec8f129a47ad10a06a29ef720e036d6803a75715fdc2a6fb5beb53456226945e59342c20bb83ab9f142e11e1c12766134522934bc3a3a2af51a10301,344cedca52bebde6ed6831953421a2c85fd1d6b421e9c536789e470d39056c4553fe16b82c1a236879ddffe093912f460f02f5071eb49d7dbda61e78019755e700,0d3e4f5257ad54c808e081654648761ae393462fe1ec10dcecf0493af5255cdc64340541a717b1db029422e7febbfe02f620fd5f6d660bc618f90840198c084a01 +3ec41227247dffd82d48ce8e3b8cc556e6d8466426070d43e28fd3dfb57385e6849dbc2d3e1d572c2eb73faeb7e9c362ed91dba0fabb4007e3f4ee6db998d94f7d1b44e5e6c8a5feea6c44ca4bc736c18348a69bd5a291f10ba11b8c663efd910b8c9718904548bb9fbeabeb006dae22f48e5c93a82a78af1c86d1096e88897c82940f734765,fa08214fa0ae20ebf68fabf8741181e453aa927ffcf583b24bdea14190cfc446,0b51afe57854d8720e56ec457c3b35ec87e828ac899f187d026d6c937226a75a21f4c1c125e0800ec888a7640e8bbdd04f124d878a7da6c60d7ab92fcf787ef701,bfbd6e0563a3955632893e785e4c80bfc06c4d14bff7a5cfb96da281ea9ed3602c4d1f656a59f5ab9564aab912e0478378815ffb3872d480aff463f89bd03f2b00,272bb078dbec232cf75953f5ce37b08fd88cab55ce8b60921460fa3ef5aa623637a54783e785ee62116f11183c5dc0214fdd73a69e27b919df0cc25b78bedf6100,698ebf33e3be68577562c2e1c6081b3aad0d15c938f1128e3b4f8ef2bce881291c4a2724ecdc801ad0efde704f494a6a4154aa78c90c60a78f9e2610d6831cbc00,2ddad8cfca4913abec97954fad0768ee2d0a0f2615988ce54d895e45210b18cb05164ac80c5f790d62a6e11afe44e3c9a5c1df9cd952bac7fcde7eaba9f56d1301 +4459935dc3d3180eb330ee44147a7886735be94df320388f1a44afed0838e29e8a96a1429c9460f32de7a84a8c015e22089705c4c2eb109f4d7b244bfa4690279337a27dd7f72e7b471d06659962f866a724c5f65d2ffd3bd29be0973537807e84cb0824d93e4ea0d2079e28e257fed74ef89c8e3d0ddb02dcf3cd78defeea5a494a47e149f6,cc97f43f78e44f4acfddbeb8ad63a5108b29151dd2c2fb0845343112b4ee1894,0993f2388edceaf6ff4ab8d6450bc26bf92e7835e3585b38c08b96d01f9713416cddfe3ab45740711de4340992bc93b6985db67e7e0d882e4d825a920f7b91e700,366826a303529c38e0bae12c55dd63eee21a2eccb0ee9f758deea3fff7ee1f915e9b64b3e5d4ae5ed2a4e09ec713f59a3721454267ee0bf012311293dbb2b67400,96dc63d01f0f111380f27734b7897ea1b816551f9b7c3dd7ba1651edaf40090c163a2b9156399104ae90047a2f55c5e8f0e18c31aa4f86f8705be39aab4cf14d00,8eef8f06fb137a02cad64ae490c5e54075031d92d2c0e9c9952f2224d341c0fe5ec6b79b3c2da0f3136ebe967424611b348851f657b108cacb97076a536317a400,5ce2d185452c40790f0a0929983c9cee2d69e1e1d4cc7e305afeede6ad0b44dc526bd80f9870276752c755ec322e0bf9e777ed811d50080d380c1b8108027e6200 +0b9794f15f69219944dbf546034e1e3d750fea91710ce7dd52aea65da0a31064eaa7f0f29edfbc994be04dc6a097aed85a515359da0281b7a1268e6ff9b4254de679f9d47cf42fa0eac1f8a329031b6492457bf13231c0d62d3da3cdbd217a709259f655201618d6246043f1bc16eba828574fcfb276c78b08db72fa8fdda6413bd284e48857,d6581900ef9361d96fbb61b2075624795106ac77a6be17eabb27af81e1a76054,d694b03014bd7adab1daccbb821d3e5760765986e284e97d60102cf4f41e530224dea9a2020b1e1f60c15d1a440f014d206a7dcfff2f28e9ddd06053688a24ec00,0c5d26869af3885eaa54d614580a9f2bd27abe11c89f913745ffbfdf0b96a2704c6aec32771e4743e3a94d6d1f70b03494a8e49957d8d79d7a2e61d7eada1da701,ba10011ba45e004f1e0d26b503ab2fc12662738517c198f51aa7350d64f1790e67eb5e32f52542e3db49be0aa1770631456992daeb35508e5770f45c9b0393f501,09a2795c2d94ad58a2caaca4e3d567463e15feb22d6aec9748aa66a30e929b7e77eec76d5cc7ac4062bc23983b54bbe5da911e4f9a02daa8a9ea05289241b30001,60069dbfd389d34aa5d717b05e394454c60b8755f7bb7d4846de9f0f2ff322ca61fba7e7f00691a1d08948c9f63d7d529f1abaaacca00e022c1fc4e7f307bf1d01 +d690b2d357a4b2807214f5d2392ae34dced4293dfca6d73a559dc17389967ae30ef7cb8231a466d7dd1a4c3fcfab204e61cfb55e03f28a6635155d7ab03fa87052be715dbd0f9cd61d89dabb206a338ed0cd1d385620585e206647eac3fcbe4343a59eee145a1a78200391f5ca6b362ba7fff2e0e70db7c96779a3d956cd01347b50668c5b1f,c3f05ec5340820d859ce3cb4f6c0a9493159227b1138b3415eb26990cdd25190,e550ca97760b491fd87dca5d5c8a02d943bc8313f53ff247df0cda60c2b3c8be0c065abbd67f2425298ef77c331f10fe36369cee7504af5b67731ca71cdb8d3901,6068a04bbc107b1b3e45ebce645dc582c569caa9a59e31c2721e51365ad7a47451405d08556db0a7eea669113fad11a9147369ca9c279063816decfd1b522eb000,d77a1a093efce7adb63ea9ca2f7082a8faa7b1752114a4e08fd0f374c55d75a44db68e4ed305373bc954921179cc024e4e47c6cc0f6a77b56cd6482fdc6122eb00,3931f1239b334749dd2f0263fd9dd450cc37a93d2b9a5ab2bd0505e8a7e03d542e963427143e866547fb72e4b6f0ffcfbb652734e2ff6b38c4297d6d1475992601,03f298935971a18881f94b53aeb6a3c3dfe631008f2248dba259762b1c5b762b5fde41ae1447a2bcc1b994734174b9a4376facb6aea67648e3d82522c831a3b001 +e8a73ea7c8d23fb66c5632e284de4588b662a867e68773dc592a428a3a9f071be86d8aa751cac23a3e9386fb2ccf2bab19ca8179df8b0a11f7ca53f286eb5f2dd2e5399abe372793adff3a94f9623025515b33529a70919b7d5344de634d44c3ce4664fcbb64497e9592b1fe640cb1fef266b7b32afd1ad254df5311ac6a3d353cfc3ca0906f,7cf7b048e1c7bdc0cef77667b697fb525723687d6922b6fa34e987d12d108a43,262b5f854d79e42f63a94716791f428c995f0f187be8f65ad6254b2e634eefcc6485902257aa77b7091bfcb1dadb08990f19114ddbf615acd5116a6540d3a36301,313c5a6fe9c9e71c19bd3b8a49d9577f9b5b862903b0fc90e7e7544181e7a7e626505cd368e05782e8605bd97c2fe072239bc27ea69e694d364bf240478f687800,6467d9edd608ac07fa4ced75f7b826c88a94c974c31074b00111c2b7c467bff54f4fa14b255a557f719bdf5387169b196612d6f07516ab45da9ddabbb509630301,9cb7c5198946ab0d7429c00c51ff2b8b28e1d63055b1edc66686003767f045c560ab6123918ac44ac7e5ce81a4a613d9bd5bbd454cce2ea3747df5fe836935f600,f95f00947bff6e4485da84146c5161dd9ba794659458228ad5c7d7b4bf6a147c5a9b7571ead3f1ad6fb14e8140ce9f5071b91ae7fcd2e3dcbc5defa0b608ccc700 +4862cc8123aaff92dc78a8722674f0c1f9e4ca3833c6f33018146153f5faf649916b6995fc95eb7ee13d4e0d57a4a543708860440b7ab6fbd60bd7a92be63537e6aa9eb21cc98c03645588bdac0e428001f4548c612dfeeac440ac9b6fbcc43b6f2875c9c20db7d56b9767990a4821779833e09942d1b7bf2d128198438f0ee4f18345a9ed5e,a534800a326e91a71d64297c3f05d3ebe88ffb2e7e51e5a097536704d6cc8909,77acefe54067fbdd2590af9f3e69017187d576dade32d6638598e9f2286dc72e23d0ce48995ae1b733679697818a88fcfaae5c0031fbfb0bf6d72072032a95d300,997b1d13f621924adfd4b2a9b69fd417de4504210eced752972e311a6b1894b02fd0d648fbffb4fc253f2d20af7e5f38c8425aed8e80d76aa5fb55c093fb05b901,0b016910c503b777fe6c93a279995a0dedbbad81411abc29a6da2363760c405f31074365b012b28db5f65439ff2419de38adc573e2676ffba647881f8bcf21e900,66275b6a9179ae6a5c5148691521d76497080c8bf23969210652c3f7cb3e924e2833f2f4068652c73ed887ff986a3e009749c9ced41e8c77d557769c644331f401,bdc5d405b0578a40f2aa70cf375df3c3b7e41e579a8d1bddf58a2513d3a2a09d75eabcccf9047eacc8b341eb27d2d3a7eaa8a595310391c8b0ebb4331478de7500 +86170d5dd550e92102852618a174ba95c1ba7371e17a9d0e0d2d7734a21386f51c7817ab23c694136dc03d44245a7a13c74a01ad94324a6e4a39b794c5c22a280c3861cad67229600169fbba4afba7c25a6257f95f0a045c58555b4b933607347ff09171faec875e8234fe23218290fc3bbf9cfdd38208aef5cbedbdf08e1a20f6dbaeeaf71f,ed6ce294b2a4e10267d606ea39f3e41801e8303f56464c1235599db727cc53fc,71dace01fd34e588a17adf191dca5b4ee71ae821280b9f67bdde750454fa344d09d78b16f357b8e86d1f7102b83716751034b35c19a5e729118f1fe4398bf9ef00,d27c14c17519f5bfb1841b1e030a118fce98a313676fb35d49f3b1d439b20a3b170b1a57d46616c48b33889c8652a916ef96d516c3b912ab66ecc5494f2d4ace01,574ab6424bd090f9fbb4705a8362edbab11748070b7bc696b57858eead4642465ae4cc0a917f936dd02f95c4a33a38b9313f33aee8037750a48ea04e7671d7a601,542bdeef1fd5f33d0357ab74b4458e66248a56de036a05d596508ae0f472b87b4dcda48dc4a4875150ac1d2e2737fdaa3477e45448e4dc8ca8446e26e5de489400,730abafd55ffb5db92d21620828d8ca1bb345a382940ce7ee1ed516516fec7026c711842179a3027cfe902c235dce974433c34250ae9bb6ad2c82488877e565200 +8170bb9bffe6a2837af1baef82912cf9f03270dbbcd45d45375cd109e64cf426ca8862ea49bfdafa30ce0a9d07d43261ba6ec105986beb0a8c2054d4f00cca5756f34fcc660581a20660cd04783f31719d1698cc907ea8f33782ff042cc70734956ad09abba91978e4216bd4d6744e5c83221f366ed78153a117a5f9de17a9704b7e30281729,be451ffc36e6b9cd460e438fd144122511b4f485e2c0cfac2b285a0e3cfeb5ab,edb52ac89d877b6a0d28285c4f122b602d48207b2ecceb9cbc6954f052c13db528640f27451f707b637cddb7baf20987ab3dc072be55ec8f041407cab691ed8401,bf2fde66ff7493116d002579fc7a2cce5ec4f67ec825581043955b15034e5eee4ef0460315b37e2586df3cba0ea47cbfb5cd30375d79e0e9a5083256fefc38d600,04d5f13ef332095d91fd532063248da1433b5500ee7270ccd064064ee142460f1c7077daff6d36a84c0f26d991090a3613e018f80f8652683519288cac339d2201,c3e401612e5d4d847b175c6e0b46ed1434fa754c651e19a0d46625e583cd6f4410d58425280f0689adb4f15482abde54a5f850e64c71a0f7d79e0b22be8a309d01,5660e77ffe14785f10888d6844b961003ed3e3ed183d67e3071872b86c533b2b0962658c8b2dc04b4130184b9b25ea90d08f44085c9089215355b023e4ed4bea01 +e2e121ed8b1658a97e0688d1ad7d776a79134fb8af036010a286ede5a9375f60b26993f10f39f9bac3ff115835f21bc0a378f2a8b570aea867cf591992f1ef33285c43d7625814cb7c286a6782dc99cad6aac7bc60a352096be8b3baba9b9c2d52cd468e000ec2e0cf4913e9272778bc1908bc6153e94c91bd023ad0be131651262cf8049c0bb9,eecf99ee76de6a12974963f9dcd7c0d462fb632d676abeb480bb0431a279192d,6e9a6c6d97f258b32a939998fca535beaec568aa288a8f2295f19aa0845a00d54958198b45e8e379ff7bf79db25a9d77357aa71d8c78edd9d8e5b0cb2ac9ec4700,fc8251210ae2e8359528b1e2fd8020cf9171aaf37626319be495eec52d21b79918c648ea07e8809774ef12108d7d403b3f539193001d56f5286b2539bf457ec801,b25f14a265798864c895af76ffbe13a7117521ad5f646a8c371acd7877c86d605b0330e5a44b1747af0e5a16c53aa5c86ead95dda995a2d5c8102a74d574cae101,300beea7a9ad8eda430ffb47961f60882a28ac45fb66e753d746f4dac02722681359b86509d1456b776248bda3b30a1be9f621c8c412481f6ae98ba3ccdd1c8000,322457fb3ca32d48158de9e3b672998d615c7d240d1b54a54b9311978220a1ee45f987fc82e57d3c6ef6c54a3e078dea9541847684ba0153a04ede329da4944301 +f6ec8e4e482e5c6903819cddefd6b28942c71a51a936849e5c0c6586695e189e3cc97bcde6c9e15c3ed742d96961aaf6c172e806ff3577bf309d124055989333020e5d963a5135da8e337ecb3723da856f0920e5bf3b5099b8d5c1961203fb065917810cd5e50f5f450d447fd14a2ad6b5212c8fa58787e115d5bec9fe1bdaa28736983766c671,3ce396069bb30729d19127dd8fe7b813c727352e6c9f47c8b8cddc2b77967e62,f029daee083de6e68611b47c82d2efac1885e6411440339d337175fa941311de4c443ea53c8344dad7222450ed1b350ea2d2b916a803bb528fb55be36ad9788e00,08236bb4dd2814a5f66e6e3ccf2450e8154fa582725b9c8266494d5dedfb1a1671961d06f399c080790942d299b6ffb6b290d35b11b2683a21fa80fa3a5d269801,b742df174cfff49a10adef8f7199cf3c915991778727322e66210d3bc96247834218f77138ad927b287b46a0648b2ac7355ccb2cfa6a42af490877203b8aa8b301,27818fa63126a6f1df13e730b111ed45e59d4c54f8da1a5e52a7f306ac7b2a656322f8eb387234b02351935f8ee9add9ad800d0482c2c457a627c43aa63b2b7d01,68d750652a6bc8a4205cb3356350e6e8e8393fa13c0881303268dbd6ea3732b20802a73c119e7421ad028714631078fd17e24c03fa727bfaee15db3792ae8d1101 +e106bc4bba9e7d9925c5bcc49c6f03b2d5cc3ce92ebea555a40a53d8106da16f1e9c261bfd5b6a0218ddc10bf6ad896698ca885a85e2f3d43f2918125b85d9d3ce79bc78ee6828ee4316e73af4f43bf7e100631e8e7448a6c18906aa282da65f8199e65825c29c45104fef3a941d330543c0f61c32dea97da3b6bcd6bda86ce8d3d84282481bb0,af8ae7a6fbff82e250bbb1790516dd999706460ef8ad755da2d8995e457b2d31,00fca9cf1e592ee514b50e73f86e356ae802e0853fc17ea5eb9959f3fa87883179a295cac6745cd1e3f68804affb35a30de0f1a4c4925157b8959de2d7f8daa301,c9c9f76b967551c1f1ad1f439fece4479e5c212efd5ac87a0dae3426469979014d767901ae88e0d267ed945cec9326c7a8a45d0cb6a8d13988bd8f6b93c8296301,d057259c14fdcdea2e6153ec992f82d6a7b083faa9c695712f5eb4fb655291b924eb74ad7792f9a655087813b0a9be8bf9a7735d51b77ef1d9b47c7ab1a5d32200,3cce2b3baa13010968dc59a85bdc54e621fe50f09e20fa58128370dc831fc653518c495219a77a14290d1f4739599b2a9f930aace33186719fee1ce388b1e7e201,d9b1f378834e6036b96094cf06c3c4b92d60c8170fb43eddcfbebf24256d05873d4945221c7ad4d1691eea2df318956123be1e62958381a00cd10d289715488c00 +100aa348bd9ef856bd718b60d1888060c69fd0da25e280501262d1ed040569a0d136db8e174f21c59b0bbc7f1c93194f37428ea9a0bab5926d7c1f30e1bb7aeb107585ad80779223a3029f80cb6f212b414bf8fbfde030e9c9b8b5d2e2e0f59b4be06c537095d9c5e17f108619ca03e9c6c957790f50c4020800dea44e56c1d88c95a458fccc00,5feea1bfec2fbd5c1d7029ab143f979ead977e4f5e251547e6f992b64a8e68c5,e853e48677895c84774d5f7647e2a269c9d463a58ce970bddbd7ec2585a1d7fc784f92f8123987158326520cbc0e6f27742aac86ed95ca98fd0bf1b621b44cab01,80f4de0be5edf3a4d0507c79aaf492745e5713c4b5744be46fd355ae44237e316e07f7897bdc22f8895d9a0eff688fc3a44bd46e70618174bd5ddd1e7f73398600,cbf3f27054f12713e68df3ac2125eafe735bc0663bd30bde4db996470ea6948c608fff86b54eeed0d5ac7f81a8f52aa2bfcb8fe346375d19f17cb1bf175db08301,aaadecb8643a8679f3f6ff52acab2125473577ac03aa7f695f57c2c0e0e683642a9d10a0ad31ef56b25a366861efc1d87a1737926be9b38f5b30a2871a6a85ec01,a602736640f6b44115986badff1e91e6bafc2d2df06e883c12b8a16a817b1e9a0370f50ef14188658e0a1c56f480c75e7f414d51ca31976b63a14a2ce67b20eb01 +91c781ceb3fca7001d2f8ee4c8367d7fd9b9ea9040af39a2e63fd092541435ed430decff037c126818d769d88c1eee401f23147c469be480ad039dc225e20ebc5c37bb8ec859c6421219d9b8c6f12e037ac1d56ea9a7a3c870f689f4a337a7ca3b9404c3ead6bd1346ebcd2d9af7aa2eec994aa1179b926c8eea8b03a8e53fc933398d35181461,64a392945878706373ffab76dafbb24a219fa876cc0154f9d304ac12bea84c99,26ad6282baa767fd30d92e6bd6580de10e4411fbd305347abaa5a6746d3d6775088a941f67d9d491ddc81a24c4aa7d58dcc39832db06df4dee74a760083fbdfc01,6ab3c8db45a06442a442e948cf3a19c0f6882314e625566b1c96a9011c09116a33a133fb71780a459b9cbf0ce2ee9886e19be631e6a7c0a504de5ae9b3158d3000,87debfe033c97163daaad85dc73061421519e0668e453551a56167c31adb3a746d8d0eab7485a8eebf773b1fa7f049767c0ec65ce143a86f4e3009cef98e458200,c7b37cf3178c424cd69eab65975c781ee4bd3938338d9b5005a43c7b64d1c0535073e7b06e3e5d4c342f8cef829fde8852e62b27353a45b4e63fd3dae3b662dc01,3719c4fba2993f05626cd7a584240a1816014c725de82b76681fe0fe278ebadf7cb9cd17110e64214b93ec2e9ce01adbf7e92579ead3648648fe684fa7057a4001 +b2973d8e45c2c757ac2eb72a8d0bb908071468390f940846bb60b8e06621291a231da8ba3c230dcaafd3fc16935764aa8031382f9fced2c3451e2c4d85c1ce2592dcc89014dfe4d13f528f81a0aacb2ff82259f0824f302b241df74b97eb9466b22c8dd315811b7369a16ef850ba300f6044b7cd87ba58bb80a0df551939be059f1ce11f05f90f,4d913f41f697c64bef4b200c879fb4e7eb5d72c77e41debdf6da18112eac7722,f3e8b5cf07e598b421cf004825913bf76ff1c7969b4d131cf3bf7dea5d81c8a1469bdc6df3d2d66d466343828b3f4ba142d52d8c56a0ea25f7c8689172993f4a01,cb050e04f3008844f44c2c2709d4355b3d8a8802f152a5fe03c398874b2d110b1b7ced2f4c247b1ce83dd9bb21a1bed2c686ce427e418c5665f0147f5ec0338601,fa570395ec3838c39b06a7bf4f8ecd975ddb8b7003912dd21fa0353f74436abe04e3be42bc4c10ab580bc5aed3b7da43d9e811e0841f691c333ab00f7b43c17001,aa91c452b07ae57ca8abd76965009ba0eab5de6b99324a9f5d5e9369fb6fe8207d15442abc4c7b6969a0041a4d23b0433a10b1491b6fa3b20e15ea75b6a194e801,7b5584b4a9d6e382bb6e84ddd121fe6beeb06b4f5ef79c56c78a9a2b9433c47801a92693925ce146cd1d5955d2c98744f2ade8494b44d74c6940db0730d9c28e00 +110b3df449008c0e05bcb12655cefbbfd7438d34b2f476ba5546dcda1f0ed59d9354655834a848ff1291a71906cfc326c7bdedc848e52d2cf119b95ef57915f53b2f9d907b93da1e99fc7f0584887f858eda324a556ebb819f9a00c816e9c2ce6cb8027c63c1ea661a98d690617f9fd71ef8b4758810e997faeaa5305136ab5135017e93fa1794,72669f684e57984ed31d505ce224f1e6a1553b468d4ec1bc1e49d7f0069e34f4,76d6dfc86aa3a0b737391696f5cf504cab3ea560a6bce323762da5523d0254cb63395f31b3328a9c1ee2ed21e3d197718ee08e929adffdfcb413e76cdf7dee9601,0c10cd4128eedcf87295e34a51979c6f7b26b501143ed1cf9bb93fc514d290615d72926119e9a9993ad9a5b24f5bfc9cd1576961be0e4cd08629fb60c027c27200,d4b8dac80c794e5724424f492733657d451434385b3d4ee4e59ab9d47084748648d844146859820c49ed326b3077720f841871e6c5b0abb207a7227b3c26cebb01,426e98a347d2d7108078b76919d5dc49611bd3e0d7710a60716fdb40d58551a151639626c1f6c5faf9b1d5bcb751ea2d851805c7b740ee2ade2b1ef9d44276ef01,211ac819c012c63fb0bee16b27c9e3eeb9d5cb79f0d9d68c7d15682f19262a01201787cb5c6e62d933fa0d55ace7054d9ca152caec2c092362e1d1523818469301 +f08bce04738422ebac87e3d5355c29a96219451b8cafd96e5ca6b0a10d61395958941e9de63c23c1248cd503b3e10714e76f52c1c92c43e809ad41acaa32eaab7fc3e1698d188a744372f973780d6804d97265eff3105f06be3fe782e9e116adfb07066b4617b7c3b3d75c0f5772aade8b00b6c751fc4a2445585977819edb4b9db755aceaaff6,c10c60a29e2bd7ab6bdc229c1d30c3d4d1f3f60da27a059c6766931f354d0506,346436e7569fb8eba8f6de875a513092c0e025a4310fc4f673055b49100d835a0456043c2fc8563b637facea75d7330989c884367f86d1c5f18d6ffa374c5ad700,b413daf4091570968af3e89cac7861fccccb87fd3e62655c16c0911440d9f927139cfd82a7d84f6a33756d9f8819499dd6550aa4218c1a52bba5b2c2f172a0c301,55e0f2375c7d170cadce39ef4aa6fde0a63ef257c46ac0c8c930016f935027182b50f119d0e1fa224f2e74f06ac554441900a43f5814484d1a16c3b7d190709801,ac8557ec574c1bc46fb41427a8215ff56ffcac521da6e3e8e859f4b34196faa776cbdf9e529af3431eb50efc4c5269c4d1b8665875b936fb5de73cf71f16c69900,b50f58a58c536de44bc95353e9bcf6c8082ff84652309e0e46523c19b33a6a6b6f5938e4c6da5083dd8930abc8abbd5ad20dabba465c7603d74b96105adff62901 +5bf526eb51a88e4a9a8a4c7387ba0e4be9e3c1923a45a4f7ec8028283f839862c59dd6e6b416411fbab7f9fa320a26d846670aa455147206623df2d7db08828dd2db9b82e40e4af38c9127b0061d0d7ab20844813951381e52db1358c75a15d966cbecc0fd6c2e6de179cdce456c8725be993a98b1402eee0e86a16f142daa30b280ffa5819d25,b4330353d5c16f357cbe09fff9b0427fac4639ef730b80c0af7334ea7c771c30,17429f45ebe331b7cca9b8e99cd59c354142fc8ba3a4f3fc751dc718894d05462bc6650e19c302e96d3020f55a766e886b03327b0a249cf67e5d962e20b6e28a01,76ad7782da06c7901d94a697068262243999aaa32d5bdbbe17d20aefc3881d0003659dc5a766d104fe1992081234f5bee35b2c2b561effdb6c8a33cc80a5f09800,14296faf6ef120d61bb3e7c26d8ca4976b43a3f52cd1a259a4aaa1fbe09c370a35a211ace731c1ab0b688eb82128d818dff41056971f1bc73f6ed1a13e4b6fb800,3c4b45c97baa9ff8abeaa9aadb0e4ff29171b2fbe0195a2ca93eb51ab88240742c46f12784dc115ce2a4140f4d2b10fccee04ecc56c821a830ddfc67a0dbb39001,6a1a9842e02e0f3127c973d460791bc93c909d7f18557cb31a3c7e5053f7b85546dafdf2ae1b7ed0b4f00a538144eb2bbcc6c50eff8efa84c901e6a0798bbecd01 +7cdb91d39979c400bfbeb6ebd837167bc4846e13e482a90418f2dc76188f481eb0137994e63574a8ab4c8fd4a9ed57922f52889973a5e2871b41ae7b1f03d7d14ead91763f51e364302e031cb8d29390db69e3c5d001ea19732a504979d675534982aa52bf6875ec3d5fc0bcdb1583dbf922d9200c3d4e84565102cf30383e855f2548caa83d71,8ef5fe904a8e436cb1f53bb3788eba94bb4c80a4e1ee448cb4aa23c3f0f7f1be,c837074a54ea4ff845ba51291d16cd07e2acf3e2700fb6eaaca128710709ded724cd65d72dbfc803c79a920cd10a6e7b1f6c8f84b763d0b9a4a0b093de303afd01,4687648287a95e8562257f5b0d221a6480cf8a1bd9c68de7bb07ee27bb4253cb39603d910a7e575226f7f96b924714deb6f6277977b357044e05b0cc7bc5cdbd00,76a1535e6f0f3aecc44c8008415c971af0fbaef5ce3ec1f7bc31ad9baf115dde770ce7ec2c93706c83160ec6bcf65af587b25c8416f616e57cec3194e13cd05b00,868d667b0a42ad883febd0519c525f86444b2d5a45016d98572b2299b153a3655525afde7e8bee76bb1f9cbf4bfbb77adbac1cc5d6e5019f78236fc2bc2b0eca01,d26691d84fa8bcf258e7301e49ab59a81c46149e94fbe692d62b6b47a3aae0ca54676fa199caa2e4ae10994de4acbacaca3b745881204d9587bc947cf60c7f7200 +92f90210e5322f1de6f933ca9354c4432acbf9a77dd46ce3a864c6186ff050a68415276f1f797db79ca362ee71188361ef3586e78a8303ed01e3382cbb839480c70879b5e5c56d39485355b09bde5e6090bf743c16c2a3d51a8076657208ee5ade0a27c1f97853717ec9bc4cb9b95f4179e99d7b5b228f2caa91acad392debaa69ce63af8de1b022,b8c02d7d14a92c799ba52eb4ea1a202bfce8a227946fefa5bf2f6b719954d0b1,448199b64a9c9f3926458b5d689850178ddec24812d2923d8f0db75c853f1b045a54211094893dac791056a285a4e1daf4e2b520b0f784829c643644ea5f598700,0219808d91cd258a9b49bf3ddd48ab6471620ca8891dcbc14d84c1a42059b39111163364d42e49febaaeb1e2aad842bb165fe5204ef290732a3ca5d7fd4869ad01,675145c75016d89289cd0ae78c88213c0e775e54b00dd49949d9b5c2871e4010163e8d1ed1cebf3bcc72527d6cb06a6f81dfc0148c3ff5f2522394540cd4429d01,766c8f5fed3e05a2e97ee04208b92d4d7df9592e70bb09ca855b2ac7a4ec08d0039922e08d648ec6b192b7a035ceb80a49dba0eb47504f23997e2344c062329c01,168ea60cb1c2fe7ca7e559d36bd8f91a91196c16eb01c2d21b24ec6f1e3f28151f435eb7117f92c67cad312d73a29656a08414baa1eeec5422a5023175e9772b00 +51a14cc722ef2bd312df4c399c9e3eec03b9766f5a8f9ed603a1354bbaddf1f2847464d5099c426dd600e3cb1c51f3634c63c927a1d8d4b1a6b0b146cbd96f7cd4206ee16b09a6d88f482bd5808bebd0b0c774f61f986a7a6fb735193a3b68f26234a4d81361ad5bd02924c4ff7e75522cf4712221d77507be1c3f85f946eebc18a1b602744e264f,b9fe5e63c0dfa3e5489c78bec622487be99ae4c703de8d5138c8b9f9cabc50f4,18b5f515702f74fef7cdcc1ee6fcf218a1544863989cc831382643e855072aad0cf65fe1165d21c6f3aa329b3066bfac6c097454a2335f11bc46a3a654dd185000,898946b8009ccc72e4d0136b4c5d9df2f569f41513e7ec1c05d928c75682449d73ea6da05b8affb808ea5fe5e828b561f01e7ff883fcd8b136bec0ef68e5d7aa01,ec45f07486f3553371b181c38ee03cf878e1efaf5eedeea8c86882188b49239f7e317a886fb23a6253723900204cb6adb81ab41ad5d0ed97de7664d31999524900,10f7ed9d214531a87a108057951db1d47892da1720ab9a3bcda58195c66d84d727c6de1d3651bc0ef49c33805898cc21a5cbc93b18c9dc537e2db6ef51e278ca01,36042281a3e3ab70e0e5ea02a1b1ec53da7473ec3c8305cdec80eb23b075a5dc4e1b1d2a8726eecc3217c3d673900db02a15a014431bcb70f9a88e4cf9604f6601 +a184ce3c62fe823d36b26f38f7009c888a2469c8af550e4f722601e8ebb4da4be6b3948b7179a1bf6773f482aa5f60cde7b1a9a5990c9d3638f66f58718f029624d74aca51b8f17abf3f821eec54d9b1b2efa8f069f54f8ada314c1d5d068568d2d35df7c1a06ddf42509379582aeea904d55d8d11d1364cd0c78004581edfee70a963ebcb5bcc0d,9c2f1926d53909f2d6adffac2993dad255ab5870bc15f22f8db53c3aef7edabb,77d3dc98e99a1dfc44a7d839a3381d9577f60032e260f314e0f6805795f63f6f6e6ecdb84777d5522c1e7612e8b3a01ba7b66609b99f43d9da7d0a4bb1ddcd8801,98914eff9b616fee3d8c8ccf94d9f8cb67d27c9fd50d670c3e6dd0bf5e15eb5457e128054092408d9b20cb83b9a106b0fcbeb8dd1fad630c2612b89fb099edb901,a959dc7f83758ac11feaf32580d166b41c75968610b26feefdb5c20817c514b800ec97590b919f8f258b593b91e74c066d356825ca43c2b4881b946189ed528400,71044597aa3d9628c8268c950d1035b8b34e78ac9fa378ff40c8c9170f41f3c10a891d9880f5744c947e7b19fa2e486a61bb7f0a6e8a9a5b53505c38776a03a001,2579d2a5e8e39288bcb512439ea142d3cdd435a1c787503d5d1869f0b602135921d27492b8226e727b4d5227bb0adbecd3f90cb4de3be14ec2503159ef9c0cc501 +e20e090157f0207e12274efc6f03bb3017aa7449aec45dc38c82e9cf986bc600004c2d5ed348dcdd510e681ebb5ebaabbeb4f135765b2d589ae9c1504d99088e376576e3942cb87b5bd53c9465b8511f536039b8e6f06134d074f2c2f947813f0d27165c81d53f4600754575edf3cc1609917a641653f4c2448d2e43e0ae6703b9bd562d3449c55d,a395d6db9a989ec16950f0dfa4cbda125060bdb81043d19249cb36754f8b35a8,a24e1c2e583b5422f6d98f16446ea338078d16004dae79c7a79471c040428e6354c1df9ded5c1c2571fb7d4a0cb740e4438c3b7eb3e12aec72e530e80923daa600,972316bd82ea12d15c46994d15fad2bc2855e8b464c12ae078f45acd26058b0f4e9d602c51554c400dc17cb219d13b94d0ab635ef4bad0e694f163cb662d185c00,8acc1d47cf33527a6d9c09504766cc7dff46e6b0bf56bf04b81155e934f36ab60978d0112209ef1567c9ace39fea1624b37bd95d7c937dd0c57291e27e74c56e00,69d662ab981e7a1e8191aafa3505b71659945c89c2beb546cb0175376b73abdb13e1e8bcbf333b35fce733e648a5ecde83166258fb6c3977fab8f5542cc417a300,122d9db78e79f2a6ab53bf061435144631249bf0968a4ac1c4c6c3681b39cb1b735ea20043f9975b1347fc00dac993f1b7e228708a5c3c291d81f3fd477a03d301 +dde3688dbb85699f72373575ecd3b1d13656da7949e64d7a0e0b5f43526a23352967ede7adbf07a3f017951ae6d57e24efdd1b636520b1e6b3eb43c995e9655d52dfb56dc0a9ebe1dce92b1fa7e425771a6e16f2cb7d44c1dedfb021137473e9b54cfb6f150c332ed54c8805a8c9d883238f9f03cfd16e198e17363ee74659dcee6044ee3903644a,5cefc17d999923be547f7fbba5c9076a4c819725db62d2f34f0d26dec821d6f3,c58a42c3bfdaa74ef2f3b8b53f88e66bd12fc8d261ca61b444fc7097c1e99e367714e21baf5555f42ad8d387c2a2a0b047fccb644263a3a1577ef2ddb18c6cb201,5438d2af5b37d72a035ead4ff17e5d90844360d374d6e78502730255f806c06a1a9bbdaf9aea6b13a0f37c74809b69f4c0ec74b4c6d971818b0bca556c022c8700,1b8ca3942d64309f35da27934b34cf5d520bf5e103dd365145868bac95d95072090d30259bc17e2d953e4ffe642c9ae17f5eea4ef994fc1fc3c93ade315fb85401,27e08e2a238c143c871a2aa7e6ea68207243ef626b5a45e9106a797eae628cb17a7562bbd81d40b0df24ac428582706e0057bfcaa7ebbacfcf662c6609446acd01,5a46833e3a2609ae78ff763a20e01f11152876f47e2a37ea7b7b8c5c612fed3c0d470b8381f718c2a996f798bc59ba7133d8b8346c6dc966c2857129a34730b600 +e680f70ced7ec7d302b839eb5568060ce229ae149f16f9335908b122a277b7582552647b5593b25166d81381db1dd18d5c985e4c1a270dee0e499ded8eaa85104942793f00d7a72169bd9c6aa522adaa436af4bf79c27c47de6d351f1be42779ae0663454721f1bfb960a59948fc678d02431feee3d304810ed72d60bfd07f6cac9ffa67af540894,7dbdc7e42bca5ffc2b4606d3f6d67f29784510dd4ae3d1cf926d846a6946d5ac,50708184c9c2b9b3a16b570b028b3b557a36ed2d95f037ed5dc733b22028d5a83ab20b5440ca561d293090d304965d7ccd5ed0f9255ffe91d1bbc4ed947c98a901,eca4e264e837837db76d5f1306ee706f46f77ca7c1b54ff9fe5db8c927962e5a652623633c85b7e683b981350abc6602365f8eae3d4b9db6408beb00d489446500,229e6fc76456058aefeee4ae2776ebd267ee7813fcadb793951d7686e77ce892730fc4c85a5a862ad33d99d2348b8d2fe61494412667baaa3d54ffe44e9169f401,5061c69ff56f6538bae61e9d1ec5a4c740270ee43f5b6ef37e2cabb394b3522876c617b4ca7cdbd22f8d713d376d1f252c0d3dc5b59803864fdba39a4e6cbeb601,fcd354f1770116450831b6334b3ef802b7a2fc8b52ec5b83bc0771341212951c121f5533b41b5405e8d0f2e6e01f55fce3f239810f694bb71712bede364ea8b801 +6143b030aecde38843d3087d4b2e143338f53bf7c1ff024adce01ccc743760e825b0a8097f8e778386d9f6da6ef570b1318d19a45a49bce01f58b884249a48cc5c27843951f66a257a3cfac4deeccc3c41b918e89be8b86fceb84a0f07b8a792a057fc933af0dc98a2931aad21342d1b590da4a5be5f025394dcf6535469f3944fac7aabc08695ad,1d10d57706e2176bee412793a4521c61ceba2d4dbf554235c74815540a8472ae,b68aa9a06e4aae912e4a74210f1e5bf65f4eee86dc3fcb91b80d984c4aa20bbc5428128aa05ed64135c78d5276908269c984e814c0efa69dd300d2bb72dac8ad00,e17dca97351b00634e76ffb0d57046e2e58436aae8451284979ff8e6f6ecef2a6125da34fbc917bed55433e1404213b039b1ee02bcb66a2935cc21b76452d55701,966d0d191e343e0298e94cb80f197959f2a471d6f64586db0f7ee5d8e3442f6c650c9e23e2f4804c01d55fb4ef12fed1315086e7966e74d2550b364e4e65cce300,81676f4cb06278b2c2d412abd107e76bd27a8af04bfc6614f701c66123a2e9152cf134030e0a65c7a114b277c793b22cabc6c3c45b29f8e022de5d97a0c7909a01,7c68a0887c1a3b3fdcf68f339626a78d1cfcfccdaf0e653316d76f8ac63f86061f4a0363131388b1e307c75e6c0de8be209331fd8904b024b0098c22cd90cf2200 +01992c674577eae03809b15c0e7e22d57f621fb1d01067ebb528697729d7da7f510a1fb0022ecf8bbfb8101782a8c5a736a47400301a3fd96309d01c6d565b5b7ccb450b0245f825e1eb254bbf269254d6fd4c8a2d900081f22ef9e38d203415bdf417cc3c8964cb0491a15b49bc0233dc8a09899058230bc1c03fae766f93e7935e06aebc1db723,0984b85bbfd4fc754e87659679a1b486aebef79bd5d525e499abd987b85e49aa,bcf6e4fff25bbd22cc843ed2ef709086e00fed1a4d57e2478a142e758b013c8f1bd382b2c97c7c266cc783cd0f0ddf297947854b3762525a9534d2d4db3b854e00,5c2c239ab9a312d294d529ae5aaeda517a45d70e9adc333e42a32d76281f8b59469b0ce8667bce447542a3211ea6a884cdabaa2566f05464f80c7402cc990ccd00,ad6eb3c744c72f31899248977f1eadc958e86c489cdba9e8edb17ef507b9afa7640485d5ad5eedcf0531dc776f2e924e10be13ac2f61d648020c05b1edbb469b00,a9aba78f157a4095bc7090e2aa2f30ce02efc97e05c3e813fc6a3c1fd947cd16427c3e12b0dd90e856e5e0c79909ba5ffd5b2d89635edd0596da1ecd87a785a301,b3e1460b8a161ed2ef9531348d11d1220255c6365e1a015dbe658f0af1e56f09391263d1fb7caceb8ed4b51c2a6a1d8c0d1015a42b3e6b1c58982c8bf123c98400 +0e6c6745e8d98255718dc9d343398b09ad912eb1ae2a4f8010dad85d5011b3b108ddc00518004578eae546b6e96684f903c3a31fa8ad83872535afd88504204a255ae034230151279a8248e5180695ceb70ccfec452d2634306d9e68da6a5fa293122a640b4e90379dc7c082661192f5be0f8fcf3c8c69833d91c24e5eb81b5dd1f6b9c71a874367,2db8896d73ae2bca1fc477814d077e678ce4ad0775fc7978a7b19ef8784932ee,fdf327af12a2ce7e632e63bc030d6401fca12ab55c9b1e040f6c90303a20b61a1adc8cad4fe060e42cf6cde247f90ff9fa847c42d0181a2724d6736071e6fea700,2bca6a6603b0af12819b2f4eee3ce582d89c48751668471a9d4e6da4b4a22d2e2e98a8d3e9176c765f808235227481e3ba2e1f2c38f37bb54cbf60969824f64101,b69017d2f80f9379012dd908f1a7b80cce71f5778063d161e7178d341a3910681e1954096666bab514ccb415914f1b1c7baf9e2cc42b2b03868478460229a81d00,2bad525df74757f3bfb1b01aaa92db68e0872749ca8f2b0d0a54cfdedef3d4592504ae45116429aba36df05ac67a898a499849356bfc5e000f20096fd6973e4f00,9470ff8a44a92e486a9d6fd0c57a2a2c3060d818df5483af467251d6ba8dba3c2510c3bf271dd6b409103b0b40ab9486eaed844c2f6b65723c208a9b9384d54601 +a9fc8977122b14c97b815de1b91e4a03a567e28a2a78a576b4f0f932c6d07d6c623d453d66f791f1c1ebbd511d9d03387f028adf1e79cdafc4de4601052c48d15163af9673957e4e0e2054573c25398cae41633c658a0c59102035c86826954f469142d23e6bed3daa9456a04f7fe63cd14dd8d9efc1033cb72797182d5e126597aadeb2f8d4b47c,a35cba16040f175c7849702c83c6f1dbfd6a0f455565977910a064901bf56534,3da28b4a2fa19507cd0ca19afdc39cf14b6db5dd03f990fa959465474381b7162038570f296245eb9123c53c495e424dc27a41f093d5e9d836ef9c88dafdfa1601,2216a94f378285a9c27de0dd90d3aa691e0b4ae6aa76f32682b1d501fc9379eb084d4d18a019684d38754b11a02e930bf25409e0e0b75242d8549081dd13cee400,3ce868bc0dddd4efc7ade576f384da2b05868a0d13fdda50c57e2f210b82921a08f928a29263f95f86c3c0b8e6af0c20babd25ab9667731b513ca2bf24e6a60100,267d1e9fad24b2ce83a4581886208820adfb03b90d16a7a81903f17ce952501d2469c5f205a19f4654bfb8e3b33e2f3cd2231bfc3e6339183a78a27f413eaa3a01,936f9bf3c2d05a6a69352941d13bc6d66e3dea2cf94b78b5fb29f0b13227973f3571c219abdc62107980480235ef22ddcbb64d287f4d355f0b0d25e730dc22e901 +a13a63915063fafecf62b92cf2cae197a91f76b450fae6c90f990c7bc931a258ba129b55297ff8ff63795b90f167d51410c481b405e001e54dea3308baa654de9e809e290ec33ebb16875ef263c10aa32a5d61d1e4ad3e28a624d0153494a6e09188f8e67880f9355584ce70d227695cfaf73afeb580526a4a7ed63443257b8fcfd800713c57ac1217,cfa6cc4677036fe8ffe2a3cb74b8528de525d823ea74fee0532d72d761ea4909,700d464cf413f3b6b86b80ca494311f080244d7e9abdadae9ed70ca94a9deb8f268ec79df114d51ad7030926911837e84d7abe7c35a36b058e154ea9e5419c6c01,ac54e5bd6a7268c7198c2339925474090c0d743a0894235cac63954f62ca8f854e9859b3a71188e31dc01bd1f64c373ccdeb45578cab77cad6522ebecd18d83c00,32f9502a46d3abef4aab3e9e3014a98e6dfcc81b53ad34d01d96df6e7360be324a61978d31dd84c55859a18e424bb143056cfbb5b18d8c347ca2f5877aaac81101,ef9d950b2d215bb77431015bf18b8f424a79feddcddcdd5a131c8b0ea2ec106179d14b9f79b868ed82aa69d2a22d3cf684698475896654c1d6edb6c5247f2e7901,e8006939d7e9ef1e353ea420ab9e6285889d1bb7bc0955382773b15b1cac36293674aad220120d9a060cb12c62655f2760fa1004a373dfc688db35b470a3741000 +b43a077455efc7ecf6b00d487424fd5d85af93c52b0b649e66d7a48846585bf5f774233c0546ccdb3dc59b7f9cba68926c12d447f2e2c048658b852ca170cb52136c99110be2875bdbfc4025b52b5fe36de090707c84673e7ac8b37badbff9fb7345f84a1f8602f713f872bade8099482000dfc3cfee99a92998710232df48ce7131b9b48cecec8c94,f5f363fca2ac34607b93d29732dcf26bc96eac11d41bcd7041071ee979ef2d06,0f0f26d0db07e6e19c99a25e655de4e957a4b0bff22676e99ab8955366feba117cb604257c4152b377912ae5b696398ea872ed586f7e660cd9e04d21b38cf5ff01,54350c8530f30cfd7729cac3059a6fcf5df397ab85325a6f9243168547c7aa266d15da15ca15c14da044906e728855c9c8b3fea8085a4b7184282ac92e66090201,72bc8f9c528dcfbffb4139117d48d1086d98db8e7a773455fda2613ffa2475c23a4c6aa96e8f2291449bbbfb2af7ac4ef50d5b670aa7b503b85648ead736c9f000,e94e6b6e5fa4d7e94de163984c5693c7799001f21d6425464b21f9422402fc6c0e9a7951d854e1fad4a19d9871eba6f81f4d58846bc8c06ad56b9322d8a3161a01,e816cf2814b7e0bfa404cc63bc7ecaf8dae22cc355872a3455014d756d37bd3f3027d62061c859246f61c6076da9f8f53e39b85d79f86d4639c402b90aef0f7101 +85f5de9c1c8534807eea264b4637fb8a1af6c325f9610a5668719106dcbc31ea746ec76409c9616cc6711c54d4061ad7093ff5afcf38a82af8d10c913a8732573c741d0e63e151ac16c1c503389e28b26d1166aef88c7691bcecd6cd803f1132c186b1a7aec5565c367d6af2451c7c18d9055c5289530c3765eb275184cc2ff136ee1e931d5c50a299,939d1a96a466be536b1ec6ce6dd85dc06ad9b0d24c77ccf94cc73ee67b200a3d,e324ed3068842bcd61899175bf835b27309df113dad64ca6d3137fff1e4892c54ab332f45692923542da6c10eb6c69d0054917aa9b8a578ee1006d3363d9164900,466e9e152459dd7b90dc035b00f43e73f8404e01ca07701d18146b0cc697db843d2e1317834ba21cf1761c353754a0e4c96a152367646b5c0d065120783136c500,98f20af7072fd7c8de988445b7746e69b98d1a55be43aad8e900f4098c95da270b1a6db3017e92ffccbe34fd79bac6bc0720983d028e456ca15409d99694a71d00,afb04afd0871ad85b29e7ab41d8f46a968f1d6d93d70999abd21c2e57f325ce1749702ca8cc1b22c062466ff6ff38a509a9f06a07300c1ab0f28e667fb6e3a6600,40a7e0141d4baa190811a1df6b41df5ec850f16320f86784281395258e7c2da120ba4a3e5cc11ac575c6bb6a5835af43dcfa538a1ad852593e1f9e097b4a392d00 +fdd6848298531e4baa649eaccfad0f0296e2ea97fc54aaa6a1c05419732b3d91705715fa1169bb056c980b64d4639d6d717473082471fb480fa757481fca86f70ef88f83a07b16e325db99276b6122c10e0d1ef60b7ecd5764de2de0d096fe1cbc6c04a0abe7071ea99602b98fc8e4c0ad81c9e6e3c907929323534b63928a0a55fb12474a698ed915,81a81d5d2d50aba4b84af2e271d48caa1ef41f65884b980ded3f4a9a69bfc272,ba2ab13fed9ff01861b4ccf7762c8cea5060d129723594bd3e58b039981161a02bf8fb2bfb59085d19765baac8138f54ddea5eab8c17b2e79dda4ae475cd5b2100,0c67b1d0bd82e038539b1c054b8b6bd0d90793bcf7ed4b2d8f418634fbe01fd344be53fe0a25d539b3906d349019bb539d0bc8aac8a14a7ae394a9842244d20d01,6c2493a1a8b316a4ea899ba3acc2c8058b1e33579aa22005a2e4b8027b2aad4863c08f8fdc3348ce17bc11a51b1b47d3994fbaac5fcd2529ec086e1a09f67dd801,4ac46d254fe8e3610bfa85c43aec67d7a63a9d5dda91ed8af2fb99b5a68827ad63f7d0afb16cca0a818e16bef6d5c61a937c7d00542680dacf99c0717965831000,4fe69b206f1a2b96c8250d5a1fb8126d7a36ca1b2fe2b6d5d9a5069cdebcc412659b419fbdb3b182a5f540fde5c0e08a5a77a77afda0008f3fc8d3a1865a29da01 +faea2f12635ade066bb6c36e5d57186393d4dacb519494a7445121ecb2f564f6bae3630cd6cd6c3ccf2db5f49145dd05be91fc9ebd4476a7f9d8824e06bdc2a2f3ed314c350d19e43f4269ee5e4d32c06bbfb73498a1a58b79b6cb8bd405afa876315ad3277adf77cc0c0ef4a99ac4d96dde6069a6226c7675fb28aed51ac2baae4c07b74eb7c50951,1a419ff44253ea86f4c11f919a55522b71e77d70efc5176996f6b2990c8ad258,14e72f183b15d3f2b467a30db75b0632f8102e212725ac7af08c87439931caf23affede24207c49a1159e0067d76cd72879878b5cfe5d169074d581af9ef5d3901,2841b755ef209b8bb23da0fa740941665a367031a2cb8da79d0d318e7f846ab10cca8e4945121ad1d4f47fa1a110cb2f63e141d94633ff207069248b20624fd901,b9014bd6d9b03c4712bbd7f867c94508d546e508b168b61f657d3aa5bac47dd96ded9846544c85cea6c113ca67dc5c29b45202c8626d0b427d0d11d66f1fd8b700,ffe5e8539b2f476271588f6598aabe9d03ba940d1826a4c91faf8b37f097f77f74ee4429ad2ca53fa59ff0f8818781665182ed8a17b9f1f97b5bd9501d05d16b01,e1c53456fdc5b631db58d02aa91c5fc0f86250a3f808a196ab90d7e2fc6e0dab2890267c23fa23160cf6d1f7a88902d6390466b4a5b332d3b821969479f7fc0701 +7d4e79cbea51fff694bcd93a6d1ee237c36e63732f50e7039a8977d34f41ac6ed5742d8d9d635ca32db6222d60768e52615c52f3cf879cb2dcf22b56766f0e219bf60f3633776588a742bfd4a33e0c7ec7345e245af142332d2c8edd9a21cc9fb4d0f4ebb08e92b91f5a6babeb2e0b46538481ce6bb2a49eb0ccba1a35c3ae46668b20b3c8f59fbdb6,3e5e58108e7a0121dec4272997a425fdf8558a993d3e2d8c40a2f7890c739a74,15071163fb129166e5e8df63eaa25c4fbb2be0c266fff958cad18be871dc78c87ceb078aa84849091645ab3007de887dd2cf75f16f579bb5956002c2550b15cf00,b89bdccbefe873fbf8f5b23c04fb01ab2e8f40a16e6fd4fba59035fe377c20b3435673bf5b1d2b1ed3acdba81f273756f4cbcdbe06c6d90f4f260aaa0249911d01,b472e7cca03ffc4184f4b075fc5bb3daf9a61067c42c22835232ed3f55f4285950f0266e28ee2df36b1ad7fa206976a131add885f6c43a5fb51b015f4e39db9101,2163618c49f5091693be6c57eee93b876745585e9d1ba6d239bd848cca0c04146e49dcfc582df8d83a775ef695cdaa0304c62edfd98f286f6f89ae988eca416a00,56777dfd0d4c8650c9f0d1999d0ca90423fb484e5ebbb03c6651da7b3deb39820ef2d3a21c94b0cb9847ff20df9d78922301216ca70a716ce6b1b900e0d5806701 +2e9d631f3a50df81b103a15236899086fa9554fe1d9e8f81c0f1c7afe325b0cbdaa66c9c117956450683a9260d593778e7dbe98ef449a05d891f39ccb931a2ed2d947080d696ef9a8c98c7cdf12ebdb149469a4fc595ddb29d0cd259c50a003bbaac490c8d48277e93cc79cbf60baf7cd84b558a8891fe6818faef3f351e30a17442921d14277657af,614736430e12d84601dec5fbc41142c6cee063cf11467a5530bd9609635aab3b,611f0a26c98541c41e328f213e277a7f94780894d7a8dcd5d1fd6ffc8ece500527e16061f2e4c082d3323e72e44e1e3c1cfb6c44d1bb5d1ea53a5071a0e7a1a000,8c1abdbe3aec5f6f673fa79d4f5f7bf8474d319336f3af6565dde09814ddc2774a12a49c353bc079b092df855da15a6cebe5e68884ee6eccd1aadef517b48e9c01,a8ddd363baa993a9a174a72524a0299924aa9f0f48022a91630f580d1fe4c6b47468a2ca6c79629e0a45c64b538de3e32c60796cfeb26e994de6ebcca13c0efd00,110168a63f5142126c08287f6dd3d066e21b1e3a24e2e9177678c4e11cdb31014834cf5b297dd526226bc89fde727e3e0d8256e8898a6df05c5a8903f39a314600,c63968840fd1dcee058eb0cda9cf145d785b3755df992edba510ae3cb3f5f5fc2736c2a8841570d2505adc2ac78a3381d92b0530e024fae628f0075c89e82b6701 +50cb43c59710d384ad284ba2f3a525487ef1e739fcfebd1b0078e06924eb645c3b27701d43920cad0788d5bd6430ba2c079dae7754f2bde137350da9988bdcc721ad7c07e1cbb72338aa5b4884efeefd19eaf1ec008a3a9cbb5f43c4771d2d7e519edb472e5936b0729abde22f6e3c02e5c76d08776a3799a5bfce5b45ed3e2e226503a74a3bcc1e37,280a7c6abc169d02cdc8578fba862d5085ecc391b5b4d2fcdd7ab9bf49337e10,d4a67003041e4b3515e8146bfff80b5f3553ef944cd7783b3e0dbe167dd5c13866785b10efbfc01d471763359199913d38e7c61bdaabacb4d33fb3231ea3ee4d01,af0f15aaac8c5ccb2fe0fb80ef3e08aff20bae260f34208cf32dbfef24fb61cb53521a7c7639e70504f7c58b0fe66f0844c7a0463c4dec179325b0cd51733b5901,9e18b50f50268925246dff826efdaf88736e96f4fe2f9b80f493e241551dc2dd7edc02989cbcfc3fdecfedab791caff50507d9abca1bdf532e6d737e133cdf1a01,925412a32812d87e05a22252aa91bd4f5af2333da10d9a6a72bc001e9793dfb139239a251a5c5bf9b70c2b684c70efdfdda33b5c9492613852f513955ad3a0f301,2f7db3cb474adfbb84f011aaed3cbcccc5520069224b92e064cfeb1493d2984c3844ef70bf6d3ff842f182e0840297d0608316c97a5ba51d9e8d6eac849059cd00 +494c9915a9675a011cdc3b0a085cc24cdeb98f24cdaca16a65b7b77712845693cb91fb34f08cc3ecb9b8d7da69f9301981fa304a5db791fd34b2b80ad6ea93d8ae74f9b06e00720563546860d76101b7bd06e471802cbee0559286b0723b511df36dc5661323aac49b0fb3b874d5d26f6096e4a609a635b775e4ecfb3ad4fa988a39495ca4203bef82,e52f21a38c0eabff717c91cfdf150623e164ebc4481b8c75cf71a1b79ead9d57,dc87df1f2962180a34e89acc31a1a96bb39200ed8163f428e8a341d0eaaa5a855cabddee7125fbaa228f8b4a9b92b262213f1e918f3801475cc57589c7f1247801,8811a60b0d26f49a8c3d4c7f24bf3acdd0c41d357289c348ea03cc985706774144b1c7ca66675b72f46d006239afe900256d197a639dc1f13e9deed36fa9e23300,f484d3be0ab407f80066f0ffecbdf5fdcc8938a92950df096421338215dd6b952ea98ad654153aa90c3d0cefb221b38cbcc7f7f99ffe4f6cf1c1313ddd80b72e00,78aea71cc296660b586223e786e31fa8210c674f7251f2a33bacda3304fdf3d0416796f4aaddc8eb60f1d809924337ba16b1cb38ba310307128da8b3a84ca3f200,b08c43099cea5b157611f64df48dc3eb34772484ef122aeec177578e3946f54d245e1b9680ad66a2d89733beabb91eecfbdc8617be49b793ea71f80e886d6ef200 +fae427942e1d42a6caa11cd732111b5e50cd717239d105e509e9d35f594251c7279e0f6d261c4e221304de4f91bdf90dc6745110ff80eb501989506a0748dbfba40b1e8308d8d314501501f25130b4f095bcddd04df6bc4304a4e867c8091c93ecf7642f8b9054b0f69cd289c3f490da9abe6a722d7a05ec2855f557343ff7711bcf2750b9e5128199,6e9e7d452d3faeb604058d37cbde3dd2497507237033121034382d1eb0ee9a23,2d883f1bd79c4e3f878bd04fc1f073321857fd63281ba0c70300ea22b280f2936af1b284e5b03a3ee1f12f12db0bf79a902ce31655004afde15eaa84d789a8ab01,9ebb0b2188c94db01205cd9a3357999ca443bb35a4f7400cfa5c762f5af9be044feb60e531918534536c50e64f7926e68d85854189ba0d48704f14656884d2aa00,fa3207f90ded495fdff060cd2567e7f609dadb7ec6dac3f10370309cf520d6621a33cd2dea76976f8282f7821ce70920ea75d73610dbc4db6f9f8fc8cef7e17e01,805b725277e42f080bd53fe53f2f4b34149a8420d6a7f3ecee92817b3888112e20a03bbd8af04046c3dda771bd409fe6a0769d7db31a0ef03004c8acf948319e00,a97641b44ee70cc190246b0cb79a558d387cfb74764d5d1e63dc5d7de08c7ce143fd0d26e749e4c7f58f49007900c0cae01b676d11a0699e42529b47b1c7a47f01 +1b81c27fcafbf0d874e56df34dab82f5d4cb920f3eef185c2413d865ede5d5840fe7ebb998c22c6f50b31640d7b81dedf455f49ce89a793f9de21df56188a1b3350d4ca4bf687a297e7768d9832c90a8b24fb749eb83d1f3ea3be274b09c32ffda95d6ff2f85bb21bb84cdd4e79737599600d4031c256f14426fdfaca0b992814417b6ba472df88e9aa3,29ecc9ec707a299d4cd82ea8bdac4a527e7fa44f2d65a3a879c7bb5d04a149b9,580886fee2479c3507159935430ba8058bd97af41d9a6fb069692455d74101f3385778a2b587e63ac20ff7e6dffdc17232ec77c18c0b8eef65de4ed75814ef4501,f0146b32d2ae532668f84df2a98c792a1e117b863eaefe546433d8c25fcfe72c127cbfc01a096312e1d04a927c8987b5116f1a2a369acfc60e293f1fd0bd29d500,54ca59f3a07c906a930a1d9924f693089a95942b78dd2331670d74be24552f6334038eea09c51ad356196054a2830439d408f4f294707e5b7f07c2aafbc51fa201,b9d6d5fa0a1301f01d6255b8ab4f7fb21059964520971a7d4b139a0d7bb498ed57a4c2ed003c33f136a3b17ace1909c76df7c3b1d4258374fcc0ede2dacf536701,2918c15ec79dee78560b388c9f09344b2ddcb630298f726de85c4fccfeb39b9e0957ee345dc2d43f4dc7775df3bf94731295152609171e61c06dfcc7fb7d369200 +42f8534c363d0f2de742df2b505facc5181abedbcb080e1e7cf02259fe371b96833ba602f231daefec2fc1a25164f5d630e15ef8da12b203d34409fbe433475635752b17dfe396a29f508d41602de7bf089c1135716fc970c8d22afee98bdcc0d781b49263bca50ab8b3fa9ce3225d07cd5d99e51a6da7edf968107480c775f053a6f94c05e569d2669a,737ff7c06b27b5e2d1707e8b700e3843e3ebccf5eda5285e95e5be8d42946bb1,11235381e7b88e7921a73f0fe47a7ecb40cb59b61e6dce451fe4f658016802560ee11e8d05a129c264aee0ea34a7a5f311d26a73e3df1790553e90bcebb5582a00,3b098e76f87e150b4a2335a689a2be385b1b8dc3808c1774e2efebe116f65d03009b2613f77cd412c386d6b870b20f4723e86f27ce26e4e6cb42a6c7407f300c00,38274d93a093fb8abbbd45f5e1dc20c9def057091a29a8b25d5e150d474772bb3a19ed6d27a404c49cd95cb020b54bc54ed6d79fce5f9ae69886d0b7c60d6dd200,4e3549a39af3570e58d3c8bebaaf565c7eb1b58644f413fefe36c2dd5e3a8b812a82fd0b09a9b05511af26ef5898374c545d3db1ff866fe332ba2a6c28a838d300,88177a83ec4b6bf03b833e634e73d31574e71906c37dffe2de6a5a141bbb623138ae532e18b86b8bfd4cbfc16baa17cbc4845518a1d490cce8145d0443e5609100 +11d4a727baa004fc6206467add56916fc68811101abdae70a32929e413f51773bc59d6f3a51b4c35e593647521bc9a18ad0715a79934033809e360cda46e7009321486d02932794df233daff573ee66537f4abc431cda4039aa76c1a38b63b03afac97a02c57e45ad723b25eed9e8e139e01459c8cdf108d0c985ba0b385442842f0171e07ed0f50ee1d,e8017b9de33610ba3b1ae71043d8a4774110ee487f2cb3240fb3ac39b5d9dce4,ce2157d917b355e9779af3c22ce3ab7b23fd2d8cd201087da90ea4bcea712fa461991bb76d79a533e9e135a81cf1ef0eb265bea0b5948f541bf29b56b74b6fd601,6a7b9b289039af2c41870ae35ec641456e234fc69a10e252d3516c2a28044af210e86b1cb1887f1815c85782bb79d23b6fe9789e22fe03c8ff99c892f9c003cd01,0703d2a8af14d34822c598f2eadb8176288fa1799042cb2f71b64cef10f882c17c3c431ed1bfddc2a46c13a7b40aa787cd1654ec5635703cd931b5bb5088462e00,3efba3eed2556f6c64d0d1523fa96a4d58a0e7ccc74f63e594b610e440ee89a822a3b307d354f33bf24100066fe3998e7251577abffcea6b410aba1109aa024b01,231ec9d8639910f20ee0973a388c6d550b523e6f91597a3ebe0133636f17a65769ef66eaaf0206ddcf085e33ba5e6a7de0ce96366521b4b7ad8a006d2d4bd47501 +4d5c6805f2b2cf321d05b445de738655e71d9a121ef50b2a7f198e1a03994b225f32c0bb62fd513ae29e8c07c4b39682913524260acce30e90f466eecbd232566d31eb82e0d086b269368bff70ae1629c1c88f056442441923fb65d36137f2eb4aa7ce773a4f5cfb64d52e0b7818dfa79a44670dcb8f6b81311635811d83f165be23aea6a76c02454b28,628467ffcfe5b2c02fd4d72bf812ea24ba171594b144c2a1643817e91faadc4b,95bde48578131735af85db5df4172151a176540a4b3ca8afdf36b7abe8938d6e4cf89d319ef788f6f182d30e4bcd04f1e167413ea0103c40510a0af77799461d00,7b43e442973ca4930349d7d00037648b082f9cd76a6c7954753e4ca5a4a527e04e07e454df1f8c94a7d4114816e1774ff7499dc0361d4635520d91bea474da5a00,0a6dca1f987d8e12c2254c4c76e4c596dbbcc683ab3dc30fe09cb3a28cab05c127722c85f8a1aeb10ccc397060f691dc518e9f1ea9e85935e5c236613aa31ecd01,acf834913ee83b63f9385c5ba52075752f6e94e2d20298c20dd2c8c8aa161eb450f5031f5a0de479d1e0dee6ce0cb43bc450898bf8b65e1529d51545ef58108a01,f0c57edb553e4302f446d84f73d3e8fc9b40c242f5361f6093f7846fca70e57040a0fd4c2c3e89e2c344127aed022b55e9eb9613f31b4c8019fdadc4aaae62e800 +498de046c54aad2dc791e0cfbc438a03a0722ebc52b1fa46d69752c3010646acef7763baf12d645d91c544bdf03f77d9a64ba2faab5da6f6cc78228d59c11f51728a887c12ad0bf20dba752d378fb70631453f9da2a22a91a18d6a5561d3d64a9aa41a41564bc93b4c5d3ed25841163449f19053a9169017015155bf18a7821725badd69a253722752bc,5f875953024e4ba115993af3058de95307ddaa87050e432ccbb6de9253bfbdd7,b4f94f74f532f1f5f79b4732c6552ca422fa05f8335d5772390151cc0f54494e10055286eaed865bda2f36b133837027f94ce5e92ea19bb20dccc25bf5ed8b8b00,266fcd59e7fd6a2b1b0656c361f1de624bb1c36e689137fd5e005ac6b659892d23163bcbdb134d90d054b256462577286f63ec59553cdbaba9d5020efce013da01,2d53dd43862940fab7ecef744b690719a4faea3fa5cf3cb8ccc023b8def647c74b45881c68ed64411ef92bf771b1d7545bbb1d522b4946d67df302bf88b25a5900,9a8b0d2f29f6b7b5681abb30d23c91d1a086bc87adc667eff7a77abbdfc13dc162a4224b3dee158a1aaa70998ed234f20afee92f3dcaa6ef5a001af6139acf2200,c235ea8c3a9a30a6568b9a2873e49a7cd4aec7347d036dfb444ac192355d723635ba7270a852f9c91b2f64c40581c30d2f7689e0f7dd36c4779239bb3bd4fc1801 +8c559ce814addb5e07bde744b6999278299c5b4343bd6daa8a34dd5a23c3be9f5bc83ee0d3d3e89c978a62665fe8ef340bf9db2545a5721746962575069cb9aeba6ed61d3fe1c5b6ad142df72e126904c7cb5eee8f441f076ea8f8fa8a1ecafbecfc3de7d1766b92c44bf2ec7ec6c43c73e7d4227156de04706689f08f790f171876f25f528b88f9e866,65dc1dc8b3687d52696b00cd37f2bf4fc1e9c517481fd188faecdb81574c3f00,0d3e5bfd00c0dd82e33c336707600e1c0473b06c00c77d9e30a3cd6cd57578365bb186d63507d0a74f029fd1f5189cd8d9e862312deb6e6fe55f92bf14e2c9ed00,2d8dca97a52b6b9696c51d1520c28c2f1c10c6c348d61ed71e40d4e5c3773dde0e3668567f5051415c0cdbdb17b4c0c87b7ab91bf45117bcc6bef5c45424417501,822711dc10d723573b4437dfb91ccfb275a1fac6830ef633a8a735971c7c62ef23c9b744dcdf0dc31e3d58212a01248418220369d5c6b76f33a0b3f159cb40df01,6a32700293aabbfd318a4c1816827d0f30e059c0b5cf92eae37d19f6c3ead7425802b538c88dfe1fdf7e1381723c6937468045aa36a19811c44c9d18b670aa3600,d067494e1af3bbb595846d7c61fc757ecf776211ea2fb82d890bd13ce4e920856939b6dbb9afb9c18ac1687d9e905a9297911128783f5a1fa26cd72a74ec3adf01 +a27762947d1a5fc55af291a1ce145da9b6a77ef1c0b7781004fe32e43434efb2a115716361301250a72cf474c5b1b07ccdeb70d213f9bb0fa901ca229cb7684e4e8f1664c09ef512bcf2b54774a35023ba304bbcd59aedb0adf4ddeeb9d5c298fb45236c436011991d58935641421eb1b7ba3ec23988a173916901c9d6d78fdfabf9db176b44d444fadb,553632dd2cb0f4002ed9bec8ed6ee6a8bce14f366f66303b286f98784443a2b1,39be95b832dc5562b0f082325e1197498decfe5fa60fb443a7c7554190d4ea291a7b2fad9b602c1218755f3f5ec2419279af1e3b521162cc176f044d60dd869500,402e4428b88ac8f04092885ba74fe5aab066c87b1a9a11f12ac16fe8f207fa1801b03058b9d8a4f5a8cd80e9900fde5699da115329f9675c35301abb2738b93201,1920a80f1843b0d26b643e5cd29ac52edc691ea72b70f57bf53dcd3b8a81f54756e00202ccaa8e798d41f5289943868e8833114d4ffd1e0d4404f4a88598569a00,95ad5ad1c1140ae8831820874acca284bcd3ddaf86757d5310bc5ed48488332011faf31a0d582900e0ac7a68594ee8837179c122dc9ff346b68fd9be7e2ed88801,018fe4a5d7b94afa8ad4869d6657a4dea692ae667446da1339dfd5e3817aa24c5506fc93896559ae945a0a3d748a281dce774503c27a1cbc00ed4149f5ff4bb501 +a891fbab38ba9315ccbc5bd875eb41239e4d79a627e2ff2d1cc20a94c261a6a3561cdbec5438ac50b1a7cac422c49500fc8f31418eb1fa9260eb27c1a423e5ea06b9ad78c2708c7bdec3041ced814fee929ab0fc12bd638c40cac951820c1445ca18206584e780183db36309624db36a9523f74981a237b85e7cece6cd6c208c263368fd0f22ea2581c7,1bd2917397fe4e8de4ffe67a1255f2c649ddc8de80b5e291dd6ecc3fa7065e80,105c85a54d4cf68983468533998df06d78b45ababacbcafcfd85ff7ccc6c8b1d37f277ed2f50960d7cce2f754b351b468c3c4a5dd6fe520728024c272249adab01,9dcc36f35e1d22ae895c953001a67d6e1880d319eca1f0ab5f14f32910d22e6c77b21fbb17a526a899fa101cff16c17f802c87aa8eae34d78d06237d330b4b0401,6d0584fc8daa5c5a18b040986029fd6ce12f99cbd9b2d7a10fe11cddf782767d048ea00a57e73a30489606ce337e9d3d3f30ecbc79d9e0a740979a30c34fe70800,4c469401c50359f35f768e45580e772b4626851b77a5b122aadf171b7626d4c921786513e31e0980949fef171edce68495824eda41e14b5823599b34be9c816101,69fa9f99beb4d8c0e914bdfe7594df44964af5b7bb8c351224c0b60eac6c2c3d38a5c8c45ce250579b05cf3569581f2d4217582d217e4d30c4d2d8e34509e0e501 +e2bb384da12c8ab2384b1defdc5421e8cdd95de2975d2644755468e0bd42d9961f8f661815a7da17ba64ae78900e2fe1077035996daad7c8861ed9af984bf3340c10413c386f3a4112b6a5c525f9aa02dc0b3fc9fcb422aa974f46de5377409f8ce52e8fe4be2634802266e67b0af82d84cfe1d34e52b864aa72f46187250269612cfca1efb1b5f92a12,d6cfba7e57fc61f3692f532d4a1843c4361acf96f44c5c0a5fcfbf810415f35e,16c90c1278c9265ac7bcd15f1d365640f938d0e7d236f1f722e1577bf4190ba56b861c9b23e14f10a7251c82e5b7ab4d9596bb36dc17a00de18c106106cde53c00,75255c61985ca4f05776ea48c6678da1804601b824b8020fa6f8d6f5cf8ab8b64d48077d45d2963a2e16eff4c62a65bf7a4e24e365707894b342d3dddcec44bb01,70d761063dd7b20e4b4cdeba364101a43482c6231ebfc42888ad1c2b7d19a52843dd762c8683c9216960b1522cc87533e7403354dabab668c261fba19830682600,cdade4207615c3cbcfb7cfcdf99249cbca5f353ece43ad044e0aa05da627d7f74ccc3fc6400c1de3894c739231631be74c0188b9f47bf4c4fe0f2074826a5f6200,385234d48a18c40c11b916eecb52262e685c690e1df1dad6bab0502b1daf6c917b57134a8b4594a2f16c4c19089e69e6ea9c8f95bef54b9bdbfbb9fc067a52f500 +b2b68bf681d622d7736cf43195cd9ca1754200df75572527b9b87c4e354bdd7a04b0a0a827e4b971c80db0565cd35677d466562f349a6362f53b644a7ef53d5c9b4fc9d55127fafeef80fd6dcdaf76071d5877c2fd1692fba98a30762122c5b4e44186f07b77fae91f90c82d91ee5ceab80e66eb2bd0af5c9b1444538a6635f9efca23374dd0bc0a718e,ee3ecca718723b92d2d8f2f0a5072492f760894c999e68d841a608b3424f4d6b,10cb8903ecd725c4ca911b8aa07cf2d3c1805514d825f19260f3009fa18c45906761bf13fdc1a1398979759697f6da15b2e4cd9db6a14f0fa16b7d10166c4f6500,00c14af8d7303b698fc4816e04a81929ffecbfe71e047c73c571efcd0cf50fcf2fe9d164464b2fcd14af0b277717679ce311b3419c04475debbc3345fa8c8c8701,3dd5bd49e1b89ea510e60dc48f3bb243f521cc442d74fa544e8c71a7a6cfc1e44e859cbca421f7479f1fd6f780dcad3ca7865d220fc0091b3593d640c6ebff1000,8c862b5a22f749ca901eb4b686a3bc1b8737d52e93d8e9f5ed97c1be812e9d013b66f4ca26af600881dd0f8279093ce2b284ea848ddf99a4f99aec0ae74fc03901,c69111bd65f09851b200a24758291490e433a524c3251a74230ba1688aaea4fb4536f0d73512d80c7c9eb4eb1ae800157b2cf1a69a20c383066f6672c669d53a01 +b3dd24cf4c64e08c905eb12d9e9e3228cfc9b47970f5d0135f74a38c5e7f8e4c9a71df0d8aa55d19dfc117ea02e79c911810938080402cbd7d85341b069f4c2bb283b82f8b73408ccc836122b9310ef0c44fb8163d4ce96d5f5041797cbd59cbe1f477eb9645c1af6b5d798576632d7784cefb17cfd871b5675750154d26efc4e020dc3edf2051d64714d2,8507c8f49807c43270d07cddaece02010bcf24490f3a9d9ef08caf2d3f90484e,14f4a561285a63b4a1451179084a8f1ca14d99af5145376321dec304bc25469e19f8b4ab51a3f246b10973b83a1e1586964135514fa6110f355fa8cd79955e1b00,5c7ee113e8ff0d5106ccf6b33d153a29a1f99e0b6ae6c630b82f3360ae8d257226cebda754031a3a3b49e232ff60ac526fbd310e109293f08dae4d23c68ebdd800,d62b425053c1c26ca21a8b5805b7609fbdd80e8f41393c764ea59529a07c1a2506ce8ed3f9cccc8c6ab0f33a48ff8ca84756094766d78a8f1b7db8e8f503158001,f559ddc485a7b0ecdf1ab69708cd37b4d08039133c4f048198c42a03194fae9618f9fb0e114bfae80d54c5044d81cead73b7baa1306eaa5672f3b34378827a1400,1645beb4f686c461356d1bc8031a427d3f85dd150cd6bcc1cbdab1e2645679be1844be25af20e31fca7d87a6bf8bedf2cc5846f859132e0f93fc1181b3791fc301 +13555919f7b10ddc7a4e7eb8404c8b45be9f0c65c62de19dac65739d9ea2f4b13e675780702584838822f9ff663821de81f123f618137f2a493e02548a5e49001c6b16124a4fc9c8acdacce2a8845e5bbc932509d8af04e0981a2159e6227a8107c2d82f8193cc813489473f8bbaa66413f83c04c8bacf6a37d826138c5811c9a96c8f9448c27668ece4b1,ea1633c3e3621f7d25acf8ebeda7cfbd7ffe683499906c64ffb6378c02b94ebf,ca3864d3c554e6cf0689e0a99017a1b2ff15978d112d01b7a6b6a72d978219683f7cce25cd580292f3e0896942c4dbad45723b6877f1a4ea7972e4f52347e62a00,e35edef74883b620dae4e822d6bb8fb3aae6dbaa1ef03921cb19b7ac845f250d5cbdaf091b4bc8bdfaa7017451eebfa13a77894c4ad1adf332aa8b372b86ce3800,7d37fa4fffaf41a17ea52257be5e9174299f6d6ea18aedc50b7e53d45029eb257f9b107f384130b4e11ee940895662182f93beb7e85eb45607b137b0fe74775900,bdb6dba0548aa9acc96d3ac42ca099036fc6c3e6bb3e9722de8c44451c53be854be1f32d1bc172943e8f66d7adf76169e2c3426977d9fda0a42bd5cb0b82695d00,53d712299858b2531e4327d072479e0e3f271855a10462ff142fff8239512e591c1fbac0a20b2c0bc04f8ad8f9205521bb25313ef42fff74c8c263b5d743e74600 +06cb2a0e23009b83f55d43b40fa1d2c2aaad3cf69c4ee1edf0cd71c189c0e84bf81c99371501871d45e489eeb7f999bc6f15bcf782443a2e0c6eb8fec35aba62d9ef68008916fb5cebdb5c656ce23bec4c73e6692cd68f1ce63eb124fb35f1f32526056936072ba43fbca47f5c1a3b3bd679db9ae3b2a4959337f740029d8a3878ba5e54b91fc4bf04421d,da3cbd4bcb30860d047970ed128dfeaa1deac2ff66210556b71dbee587c058c9,af934b3c6073bc09e47cffffd9b09a56651a182dbeaa307faf77520453975efe282c0ab1e75823c42178642cae940f02e5e1439dd6d645cd085e1b147e90902f00,49f59745bd7772c234994dd4954e97f0dbb88b17e56ff99b7f129d31c0c3b0e4643efae66c3341cd23b2f07992e4423c6076c872c8a4b5aff2ed0da697cb185e01,06390b4e81feff883cce0891082308b19f7b3360956de19aa47ff1601b0dd79837fd4b4715acf98ae0fe26c90a6af43ea418587cffcbf8f499a1a6aca68a23ad00,a317b9c375e524647f2acd9468a9c9d5797433990b5a7451c874985a27b9ab5b084fabe223a215d88a15bfbb1e9607e431923bbb1a95997337168eed0790fc4a01,3fb0b30deeba9aa1ea42a58b85cda4ed4cf5ec04343f5e6d92be81c933d202e841118acda3f4af4d3ce134b0994f678a2452cc3021ee406a82c06ce020f410b200 +a417407785de37b3f5fe0de1ca5dc5bf23cded6c77570f3877d2dcd6b348d3e80ce130a1147c917935635a69d07726f7d379972b5be036d832fa2685a030f677e06f634afa4a54f3ee2125abba40a996e1dae0dec0a371f1d2f5ce5f280c232d25415590d07e8ec2aa50d2bede34b5e7455cc04a97fde590e4d8af8d2953b2c53fb01418cb168c3b759f7a,baba82ccb4c01585965cac5b2277f0acc0e01a825b73d4855bbd4569fa07e074,253d7e40ac3bb7a77854cf88d3d2a3df5cf03111ca63989979cf4f19f642d5d90980da0ad5e0e979aee06568ea265fec12364374fc3eb7f58f882d5f3a406d7c01,fee6bf3ee355c5f30024e2b02ba9acc1f0650a243fb88d565e8b5f95f6e665f5132bea18e89e30588ffc28e6d6013e4ce754026fc6e64fb78ab433bcbc6160fc01,6f8c06deb710654a423b15329730b47b01b321013e9cdc4eadcd97d6403c121e18aa9d5d3f51f97d28c932ac9f480d729e050f73bf4f66076d5d39fad5dced3100,cd3be6a45e663ed86b359c9ae172bb5c245d42fbe9d7ab3582401f47e2f7b69a4f436e3b6c4713f945d9ea9d38d3338327e85d6121808b899aeb350be19134b601,0fbd0c9ffc60446df6fbac691e6d29f8176118b8e4cb2883c60c5a76de04d4dd52e2122ae397f1db10b4e2123a0549c4ba5da28ed7034493da851501326245d701 +cd85557fba03ed19cde4f1656ee17f2c2604f2793102108119f5c31a5df61f68ac96fae9d1b205035e7db1a4be84ae5945744a9da55fb7bbf48385c823c34c631edc0b6b6d65c0b8237a9377f6d8c7558019c54adb1560ef0cc3805f7a20c362cef86e95241719086a09bc6c266a41fd9918a3fdf3045801697764a02aca5d471998a4de2957b44894ce7f,219c52aadb0c5b9a4832d352d82a3f2fe53b00542039acf401865e4415bdcd09,bb0c089bf9afdda0433b91a3935b71ca3cc4e1785aed200c18209e37153a5a4d6f86a4ae4481cbb8daa959e30a2f88bb3f46e3c4976a00d689596283eb3d0fc300,a9af0916d13d65ba63b72a4c5ac1853a739c21d0c36d8322d44a5413622fdd7813b7c73931a68ffc73ed1e7f25e37fadd55a8a2102a09be9c75627e96f69fe9e01,a8b516ba36d026c3a8486201772c95ae92323f475269375b03d746104d38b17a76d43dc3241220a58ebf9d2b12fe8b952c4ebb63562f85fbd37257ea597072a401,96236b56b07ead032a4306fbff9f874b6b0c118a487aa23d7235a2eb277463dd41608eaa458db054a34c91720354a0250857e32ebdb19ee9af7f6c522944653200,9725ac16632ef4aac540988f6a71085466cc13136696a5d3145516de350a51181ead42cc83964d74aca0dfc1c18cb5926e1c6ef9f39449776b5d97f974be3d2601 +bfca74af48115605511eeacd524ba137a535e26e62e4264186f6ab9f0d3d3dbba9c896a2d2c981d7d40d138a74228ca3bbef992c446f8acf19f8807b31d0c9a5d9d6cf3298b431ebefccef5a6bf6488a82aac8e196df08130ebee798639c46e95b79d66161f8c2018ba5b17879c4071be855abbcc899ba7d8ea36acc5036ed4a5a2f42e32039edf52a8100,b8ad1162eac9a6349a11301375d20b6b119bc340294bfa0ed4eb4b612f78bb4c,c913a61fa1f208172d211f80a7e9dddda6d2571b01ef9184428235d5277060b87ca5963e4a54268eb5f4038949eea54966e78a2bfa5545ec7b12a57a2b0f1fd900,799e78eb3348f8859acff1d7a48b69a22d7c19ee62c96fbf8432563835e4aa6c5754adf9066aa81859cf1513e95c69c26e529ff157dee988fa0dd6881a28a7be00,dd36c42912e46ba2f5933118caacd56c63e7cd4f7ad79ba98518fa21e15a0b8e735370a628457aba7311b20cebdd5cf09ade78c56d590f29941e80a7d05577c501,8e8f182971d84cb9244a53c0ad3dd5bf74822a8db1753334b2873661e5739178488223bb14835e6d7caf5ceb1b50579370e2fb842d1e5e6fd7780feb4917c12201,e4df3eea20c948bf60f6b4229e83e7488d9ece0b245efac46a4f681da88879321185c5def5cddd2b140f28e0fcbd9527986750bbf31e7af961a6c1cae8f46ca901 +7507499f2f1b4aa36e4a2c78905c911e623b13fb58fa65869ad4fb91e4a6d4064c8513f2d56606545d7b5e7486fa090e577b9cbade225eddbd025a6d98b0677fc38000b79a1be42b86ba1ace216f30bf5a694a6ad5dce634e41087361329041a1a8f61d542cdffd5097b96d3640218b7b0ef0cbd2087ebca9669e14d51514ff4de7f1783ec33e4a12be961,9d522bb1c96c37d75e8e23fa02bd7ec9a5a055ba1e875c3e7d9bbbf6970a892a,e0bddeb76df5fc4fd9afb64df9b5f6c09b5d04d187912389e4d69cd2692de7046491d7b0dfa19ffbff387ebb22f6c2264717e32a07531eb429fe76a80f3b8ab301,73adbfad7e2f8ca8791369ac9262ffa69e7c6b09f1af433d365a4327a6ceaddf69a0eb8042938b73ca46cf1d94c48fc5bf2c10578f5f16f945b4a213b8b6b38001,a7f5e005bebe7d9d08f4b8e317b13ef22061b4e22849336e8cd60efca48835225395f4fade33fe390f4b2ee1618f27e16512ffd3bad4155489365577c74811fa01,1629e496fae84545d0d3aa6ef49b8428dbf944fb5666e4d2777649a9889b6a112cf74929e6b496276c2c9ea8d047ba9514f82cea2a4381a23f0c9b1569fc60a900,45c3b9827a49bbfe61aa144f975d3f298e13d4d60e390034e3d46d57e19d0352376f60edc4b698c934bf203f1f7088387e6c8d1682a0c4150e1e388cca4b997400 +5b4f81f451bbfce783d2487982a22f7f950c0b13b18dfd59496ba5b42267c584e9740fee0f831c8d6bf23ef36e9311b70067e1da64101a4b3d54d723b9ac62a3a4cd26197bb6d0f81da8a4b2a1d57c03c90de6ff319e28c7d7a341c8e6a6e69b61cc4cc2330972bd6bbfd8cec63053a944455b982c0916892df54889e017b57c11f433735a352ef91e2218,890ee8b1c3c0c44799ff92d01b9935a7b8bd33586cf5bd5c969d6ca181df0bd7,ec62b1ec9a6b26d30e7eb58960dd6bd4dcfcb897e4f732977a4e34fba29b2e1926364401eb095804f565b5cc6148f4d017cc470f9ed15c93fe4aba449b3464ad00,300fa8390afb1eab1b440b6cde30184b70e12401ca0d3c449c498fb778d5c7192b2a4c500f28e0c03260096d5a457f33e4a0db22d4b31d4b0da9e255786e1d4101,eda8195a831cca46993698d64113a44cbb54f20656bf072bddae92710c47d2345006447fbefdb790fe591c951992d6d34a8564759c0cbdefdce9ece4b73d574901,e2f22400415a6606653b82e9237e2f2b651b32f8e088ea6a6a02749dd79d9e2a282be70bcdfab2bc20430bef0368edff984d1709b6927816d620b3b0bbddf53800,89a2546913a4e7bb1dc5198ac9fd16ab14c36b7f671fa690a070a23ad4a4835d294de89475dc44be262378ba87d5ded5f7dc04efea6278972e524c5c14468be900 +2a7c00a8f37fc363d3eae8e54562fff26d03450f8410e4f4d2a6fe6773261390d176b9ffeda12304bf7023da6683ce27ec94c2f908dd347d16104d9a0a8c3bc69da9e5fa3aff34fdeeffe3417d7c206c15b95009c600f3ea564ad2928dd6bf6c08616eb48c3238194c3d748ffa07fce91a43f556331329214df3c759b7e6d8438b488f3f4aaadbe9ec23cf,1df93c17a58ff9f6eb71d3baad52b289b2ab3a377d1332c9ae1116d429076d33,3fcc9284f7123771bbb70c708adbdc79ffe3373a62cb3a47d4974804a77092cc745effe7e9c4b0fee15a2ae806006baa8097aab9c426f2da7826e4ff7b5661cd01,cc94455154855bdf3a2c2afe9d3518a3085594b686b975e1f43a2ce0efe555617a879704959d1f3a0033ed145cc05f03dea74909b459fa71777df7817e8c775401,40d9c904e7467b60ecaacc3b65c928b4ce10e4c0a80f224fb86bcdc3030b109341b8f9c1cc54fcb59c805300064e72218cc5b007972b6ddd967cf26ee0e70fa801,25c0dfa4775d1c606823a14accf08b9bf54112988e41c30c4476651858a4975176746dbbd383c5b6409b78e7ef9ce73fba0ad371193b0ce1f76e9c34ba04594800,087cdd61566b46f7a69beeb5bb4a174b35cb5c39fd2f7490265d1780867149af31eba5788a4ec3b797cc0c2d711929ff08c6c3d1e0bfbd664f7d56819e369e9600 +55c73f60fc1141f9bd57994148703ff4b77cb5e6282496cb116f13ab3fdc408c72603612fc69cbece99f0e00da2d61e8cfcaf1c520dde99c0d1e2b69539c59484243d0fe2dd9de9fb6007b451df5bc5deec3aa8bf9643396c920be45a8150a9509a9d36878af937123fd3ec87262c0ba58c411404a24e3f2cab9615b0868906e05c48da10229ddca0fb9aa,a2a5826f140f7d1ad5fdd44d37d426a5d4e752f3ae52948bffd27c007227bda9,fc57ebe3e34d83336a955bd57b3b1c06e633be86010b667096947f858d4a1e1137c1477541ba69310925da8b837479512fbbdb53a9924a52f7aa84614d88306700,0c399415c85ad46a1928af07fe21742db97c22708bba36fe2887033d57ea8d4949ca021defaeb9238c71d7899b4dc65f8265ca3a976d805d1e9131d49acb5e9000,c001e58462e30eb1faa05e4846073545bf82c01ff486cf07585eaac663a9b596483d687d7adec2ce7c8b4d2a111615763d1d7dc1d3f76aa738e2c2b7f1ae627e01,23a62bb38b658ac9b6b0a7be5b1a3c5f860ed3d877cba40a5e591cb1c6e2e0e22b1316821e9ac497cf46863632528a12fb6aab1de3172507141501da9adcc1a000,ff072a2aca12d19b665489326d3f9e2b9032b4b53d70b62d1873a0444f92654f1753e4256f4b582498509cab6651fb669cdf97b8c7299d4acb2ca1c6c511425d01 +dbddcde5859d11b990c6ae185a6138fb4d8c354ef4908f0df1a090c0566b02ebea0606fcd7faed567e4e4dc44f466d194e25344e7891a3063bad82cfeeb61788e6a2438bbee7124766301dca6361c37cabcb872fd8dbac720965d3f99e282dd24ba45d25158bf963f71d12f962d6f50d67dbd0ee67d1d09e94ab6fe7323108b47affd362ba8474b20079be1f,9e8bc8e2eaee7ab4697ea641a66b69eaad4a5d2deb7198ef62ce50d2f9918d41,3614ac0bf3ae978b7281f0a62c5d394ffa7129935638f5f448f402deaf4e51984187e4719c4871e7defbdc8b3addb0b8663e90295345c417cfd48162b6c31a5900,e09123e6d3283cac834562c0483fa368fb753eeca1e670e2a91866297e603d6d09344ba3f09d1dc95e994908ff4c3aecd2c949c6452c42cb73be924b63465e3a01,12762c0f431a101bb9e5603eea5c3263d51f0685da5463e87a1a71ccce053f8b70ff2fa8b4d0ca3e04a622c2d3012933148c7239772d633a697f31b61470227100,dcf2ee0ba16ca9d33229419f6bc95092c368df9c89b9ee85b53544dc263951130d4205fa238dd9553e2e2a3b4e1fa43352e3cf7eff6b1b4b7545312ea8cde55900,6e41db6fc4959d01aefc6b8ff8a214f1339c5ea5bef238c0f4b8d6a7cfda8b4b79279a9092e009662474e9ca95b063229a6773e6dfe53e2d5012a4f45231a42600 +47b8230161a5ae9ebc4e95d763260f107d104d7bd23dc082bb3416b323edd25eef5ff9ccfad31a329099d998ea35c97da364a8b06ddce129ab389605dacfe80efac24c9c7dc029eff649afaf14f1caf6cbfc31d5111b383f9cfc9bb1e3543a5a66f148a3a32de02b74af045eb153ab353336c2473e6001800c7b35d73623c80f1f94478dd7588e5a6dd294d3,10fdf8d48dacb5204675bbcf5a990cd920c193fbd37e854b91d3c10f2be5fa93,865fa765546208828f62c7ffc319bc6a6e1a5229bb7a8137542d9cc0a5b50bf177b9aa76ad4559072bd596c729a09d3296914ca0211fc517dfa65460ed32948e01,e77bbf44a055eacf37c82bda7742c9631c53c76256a8f13b1235f0db0010afdb1d24a410ee22cd6864069cd49218f109c80d52ef51736cb253e3f356d214aa7201,7841f7310f4d7950605d41d726ce0eee770e9bf54a4957cd82614a6a95b48298712398e1f66fdc63115a04c4310f15668833632dd726b8164caf47664d23731000,ba6da3a2a060e5a94621be11e7e0be9fa3d3ecbf317020454b83fc4225df09f4318acdffc3ae32c6852efdf9d20d79d9767d37f07716751ac7f77ef833e9ec4b00,b40b3e7ca0ef671cb0d4c0144422b0a5747fa1c7217d8da825daeda4b7ce47ba7c4db51bb495a1afa3bab3b2edee60f27fa8a2a73a21f28877c4968688cb824801 +43d57a8456a483d9fb00c8f30daa5126a7968df186342fd7df98fe705db7c2d55d5ecfc20321f9d29ed52896e81be7b31edf6f8bf8651682c455aa5b78adc89a1b6dc4b940dabe1969cbf53fdbf28bae1873cb73ff3a59ced0a0494776d16ed069378eb274d33a9162e52cc18883cd0985fef24fe92b36172f7686c80f6e337aa621909db0d25143b5f6ff2c,d7cc79b74730711fe80fd017e6389e5d88f4128f7033d708fe5e8819233f0cee,645a85e84aa6abc24d96c16ea3613cc0558fbe373eae989fa445c423c4d6a5d2421b8e2f5d66931580151ed63fb177e1ca44fd75cf6d14f6d9b372ab175f4cf301,eefed67744d3892b16da146b84d2c46963fc590e46884e240622fe2419d096a13e800904adcbb22bb464d3be5a827555cc42dfd9d5e5e8170f09fe44fa8c92c400,2251e8eb486a8f2e3cd708a31e5558c8ecee799bc5b44959c2d179f6bd0b395a144d368c9abac12fd599fe6bb950218c36fc2373513659adf50dd0ccd32f069400,38fdc19c9ed2fd6194f80fa528c5869752a021898e4d225cd731b3bd9fc9584a3639955dd109db58d957b83b1bdaa08e3b7ded2663755f83d8b28c07357a4ba801,59c21cb3f69c0586253f0551f25fd82ce3c6ff941c8270ce4ed39db3c58107e87f870c3f1d5935201a1a6cd95a67654d9dc00d700280626f4150df8549bd3c9501 +cff3e6515902ea7151862ca36787cdfcbc2aeda0a49258d378cc241ec88a77655aab66aeeecdf4b38fef7e30eed2984c5e5a6f638dc2987ab660b0966607eabd088ec9a6cb97aa2c15db23d843e5ba1f4176f118936d0042b51cc6692293eb2acb9cbd9db51d88351d25e112c95e7eff28659affc5864fa4fea400af7f9feb3619f378e794785ed68dc7b1c4,6d9a0bd336d9b5e18d968fab2f2665910c92e83efea804007857a140428e960a,92998115e321e2b061f6deffc0737a91f63e8d1e1ddb64aeac6d9df0374c3328220e4db4aabbd6b4ed9aeef5247a1182ecd00dc1c364e71bd81c5b6f44ed87ec00,70c13c28d2c350ec5668adaaa40ff09b3e42d4ce9e99a27a106e42451d321a8d667be547746be3b5bdb57629d8ffae7a68578ccc7b2ef3c8a9c31c08c405c51101,8a1cba15c2b244e9feacafe90b9deb7c17fd3b610dafd0bb64c27b36e9ad539419969a43952652c8a805ad30fc4741b07d6e6f3970b06cf8d1357bf3ef80d76400,592b08cb6e21b5142d9eb31c25ba46088e28d4dbf7ca5b23d00371fe660d84a23543a6bf5f4ef449ae76e09d4fa9fc6eafebb57ac8a16c17a95cabb2e76dd30b00,41b6d1e0c389d2aac3301af890edae5fa3f3373b44b3b43061030ed2a273b77556578a2a90016dea48ffe3f6a1524b0b97800e20de3cfe3f25e84d28c14c803200 +07fa32f1f0577f70743b9d6773a8091f6ed35e662644252c05d70c9fdd2eba4030f0d1ab03c10b2b75604a1a268ca0fd30cb4c7a7fc93815fd66c3de913f592f1619a8831dfa8f35a3e667116df913448a33edb2b2e7b6e0062b2c21dba3d87ca59598e4486ccd35baef7de16e913ad780576ba83937944b93dfce37774ee67dd0961839339ed0ad3234608a,ec45e873a2a39cdf24851ff3003619ec9dc74964ea096d941d3db0e75b5543be,f0d4602a416ccf4fc8fd5442f9016f9562145792edc468ca000ac8d0801126d254dcb13d7ac1e8d887bee9bbaf7a75fd57111b52c18531a2ef251ace8ec4004c00,1f017e4c2424de863653b4f004f62ec12bb07cd9af23b8d8429f29ee7d2356cc6622c7c779d736045e0df047a1d4b077e3ede07bfd8b7a6ae2f340db56c5523500,5a916c8c6353ee2a74ebbffaf90707286b08f5a69da6538973f894d7825dfa7749b9d1c71a417401e6a0b6eba6caecab119ad8792a4b5198700ed7963be948e901,f08a6d7490e17b83e8685f2e65d603f4f45751e7905cc0323093a53ee8f852bd5892e211fe4c7025c64244ae1c9301bd67e578628a9a56bbfcf4e67cd4f5340601,1301a1440c204e2ab0f34241cb283fbd5f1a3fe32faf47f4dbd4956cd972bb6a49693063f54481b13910240582ffe03e105559dacf6b36b415e649b1d4bdc8af01 +25bc9e6fa4a8496a113c021c814a0115a2554270ea6bd747e5e18650223a641fa7876648c300cea2a13571a598b459449ed515ae711b217955b64fa1a311fccb16cd532ad61faf39f87d51f1cd78fbdc6b6d05a2b4597c7f9448961a4631648fb0a797a16d801cad99987177b7aefb4eac8b89dad3a38fbbaffb271b47db60440d835b94b58fb732a3bdd6af,b31ecebe215bb9f85077a267823f9002960aa3174f80147089b0e220ce9bc55e,4c1df2f535f1ba349c6c5676d699fd1300fd04692cea8a3eed6e5dcde60a2a580d55e17663b15e9f6da66f82dff2ca4a2c571f8e8e16d670e33dd04d076d83ef01,663aabcb0d580aef205105f84d60588c4b0b28edb1d2dd0b6f4bba7dab9121ca0a35851a0c5ca45d0abb8a555d8b2896c3cd90e7612b959418065993795fbc7700,e92dca93adca322e4e75cdfe8695ccdcb83ba074c9a103e6ce0310c5066ae824738a69e39dcba0c2239369ad31cfe61e4118998ee0f30c82b271c8adc1c8e9d801,8c5de6f3e3cc4b455d138fb9f7c6cd7aa87d3b6c82ab17b3c7c63a7109d581397e5e5f12cb6a76d2c45c2b2271294dadb30f24c623402549de3327ca038ed1e800,61f59962b8e2ded7c11cf50659a0792b219c864199f6c185eb71cc79383c051e1452adf4f0df9b4e258fddfba865d398893d59cceda67d654daeb5f10b3875be01 +322ec1479d9ec46ea6536b046c623e1b7ab829b05ab894e2e532f8954de5eca00eed978112189cd1303374768cdf89f635ee657e3a1e3d928baaf0ef0035de0415d2a1f51ce8947363acab53110651d9f31b0db3f195845350b77323f07db09ef2ac7afe29026e3e243b0ca7f89039b9943c2541ccb967074abade9ead5ff4841eafecf62a819311a45ecde7,2b08281a2a9695b0e89c4baa6f1434f5cac2e440f36789e32d62da94962031b6,65ba8ee7c2129cfad68ce53648dc893d1e9a61ac52dd83d12acb375b9042d249115a38e2b903b10c51a08a7979c85b52c22f5c6d3aaa3f0f37af4b33cd5b6fc800,a943aa9ef453d317ccd41808b040ad56bc3a819b8b4b5860a6e010da8a251bca7f26489ff7c06413d8cac3b498edb14f2f7859ce0e894880ddc55b3f98b5c5ee00,464254af47ee7caf717eed35d04400e472014dc72c6b0d80b318288db8117f42375ae39840b18023d74f0e516fa584426fd01964f4006997fa8095ecd0e0c4d200,345e843fb4363cd9b1034010e9a19642010403b60a542797e2cb436290a9201f5991168ec626260f4602a7bbd44bac979807ef50c8a4f0f6e39f8a843aa5b62200,0499996f82416e744eeeb933a02f6cbcbc5ff83d10cb14ce23bca909a5c898c81b6d4a7f952450f547eed1894d57dd98f5014f998fcc3b1926037d448f24889600 +0237b202c78ec1cc5e9d624c4a5035ebe01a9e777b6915dfe35fabeff1c04fdc868b55165e4360ae2bda002263f74c4da0455ceb55ebb65ee79eb39b789ebc0882c17913df441a5cef24caabb40ed1883bcfd7562184e4a7bb20d60d84f7a2b944bf52d01bfe49ff628422acad05553032cd059559cf30c2b26bf48e16723d3ac25bf8f096240370b05e4d7e,bc860b850bfbd0181b206276c521976750596c8a88f0d6f8d5ba330bd75cf103,55b55efc93f69f885a2312fc90b910f01201d85dfd28cb7e047d0e6f18ee5164526e75fe97f33c1a12b4f83e78d66d2cf4525ccae57abd0c7341470cf18e118c00,ca0ecfcb0561df681a0cfcc78f2aff8a080b495f73a9e4d54c69e8aac2d5fbd9263ddf9455ab239681a814d71260d7919e55921de026ed79b1b43749cef8233e00,5acb279da535dee5756bc7600fe50df5fdc8c077ad306272f7054199242ab3b070825887688b21435679f6d2db8d8d4758ac7db59770452120765d22d05ae38f00,8cd17610958c3c1ab8a249c7b9c765079c34db47ac8bb4818ab74e08667313ff0b126514e8cc955a6d8a903063cd523018f8743a9f6a0d155f817408e9a6326101,07525bb5b20a23599e0c3ec9f25569c56253845206c606e368e9490d695e39eb52311302c0746662e58102ca47f05c094acdab682dc2acc3fc44d2ad8164b27b00 +29eb9583d7d0b778f760257de1c8aea8f67b1cb587f49d2693b0b4a9db550e50054a08cfb8f7b6fbd26479cd2a3279c30dfacd7928b2ec5ff5c5e7e4d14cb3fd3f4e98c8bb8c69ca38ac7dd4f3427ca6341e8792c78b57a01de7b86d06e915a407859b3de3cdc21b0e065cf8f40cd8b0ea2d181ec7efc985bcc9b46002f21916fffb8de00e059d7732610aac,1c31e489d3db73590e58ed24fc5263ee5a22dd5b03bf699faf28521688c8b52e,edb91d7d12b9b34f46228ee966218379b681ad6cf3a4e2e51139c86a005b24b6115c7068b5be93cd68a367c6e1115689b831b40f44ead9412731711a0ee95fee01,e18d495f54086991ca55c8f5f0dd4b3a033f75910d0472e9e3d02dfeb3b9e9786ce53c803a6d1a758ae930a7bc05af7ed11add2bd29c97e9e7c267c50428e9fe00,699707653b79e3256dc1d4ebf7cf3ffefda3a90028146d248c60d812f1a0c1ff76f3abec4707c3887b428196bf168a4dec0ed314d7506781f46ad1a055dcca7c01,daaee1f15d4007686ef6b10202fc508410c86f0343c3d4c246ad5a184c1099c17c3ac402b0de8fdd2bc979abefc9f94222f0ecd2fc1c0da08d282c988387f0b801,96689e7d8b145414db713a635f42d1d76f1cf44a178bd9770fbd731b00fc9fc5588b19b30b9000c998f3030d43187c94a75d08ed33e2575c1cd0b1e617a70fba01 +da450c3a8eafd46b476b5d5f2100bc1d06a686ceae8dbb737a5ed775c287e4fc8ea99b7c6dad620225a57cfce8c75d6e3d6b5416edb24d3a8fc0c1afc51e79c4be62157ae16095fa97f5a6642322f81276a2fbf6ee971de2251e63f6b47143cd883bf2c5496855206b7159be453eb3258367930f572ac331bc856db99af1414c6d149f41d18a6a12650bb5f0,d9bc98468777d2c54773cca8ace32fbbc1faa10d262901b7c5c5b021db8c1344,8310d4828de3b57dc086c5104e88de28ea5d9437a39baeedb43c6c0e805bdf1733bb207b5a28725e1a9d874ed0d3ce4af2e8ddd83782dc281b566c982f1bc86501,85e4867f14aa30cdf01e54c5b0354d79452de1132f78a519612c4035df5002db5064fb79ec0deeeedb224025cdf571078a2c17091a53e2ac996070948557f06301,5c1bcb71b8f38254bb07c09b6695aeeff84b05966f60d763a08d3824aafd4bcd0c56d8e7db8596dea717b53e97bbfd9a3a5de7b295f62106355892a86a35430c01,0cf0d1402f38d872a43211d69fab31b0a81c27b164169075bef6f3afe184c5b4710bfda3a669820c6fc5956c86599001c358e37cba3ee2c067080c9fa6094f3501,255320ba998a38f43ada380033059e379789d0536d5114470cac6afeacf95100725786369cac6bb7919dfc23af5069ce75d416e403a3f3315f38f9dbe6eb7f8200 +3164e2be477f48d2630a6e0613d852e8953062d2b9be864551cc16097b88f42f34c61b78172fd6ccc22d33993efd6dc0a94b9f33512c18084bdf1c5f3d7f6a90c76491e1eb63e52db5fb7f48e0855092193efbeeaf3d44f946d554b262f86fb7a2a1285338cf0baf866c351e74be7a00f2a55c37e3162936248caee0874c3c0558dd1f9a739057c1c654b1b729,761a54d76e04479cdbdaa57a32266020bf649f1120794161d2db1fd47ad599ad,f8fde906c30f8faff35bd873c6127eec47885f4bcfa23687d5c2df51e44cb99c411f265b3e081cb5fd9a109777076add5d7cc4e2a1f9f03c613b9d1d9ae322e701,6a3a9641d962cc585be97aa55ca7fb5d076284c9a3aeefabb5309555fbc0d8e524605865979ac58254846d39f0b2aae4fd7a56aec194a2db1563ca1ae5e9c13701,a990edecc33f2e157a3d639c4b5303362649ee1cb27667fc932b951c14786a557dc90b914bc1e56d0ffefaf872a272e63482190c24d1bed2fd9cc841f31f303200,d3acccecf60a12520f6e9b916a43f9a11ab7ec60734123125b1f1c498cf255e347a3b00f39e361f3ce48d6a7931fa3505bb5f3a216c486ae7eaf19c7d8bcd92101,d8eec677b249396c2273a3edc96e6265a0aa91d0f60236bfbf0e1d9b2ee87c6b026f5c67fcee8628ae1974c069db8e080d36cfbf757800e92590d72a916f932f01 +7ea87233ebd7c1b6f0d4e592841e79516256de8692e764e5dc66bc40b0e7c2ec4bd473aa004ef46756802e9827df6f7405710de04ad5be1a27760bc622cae12a8e5a7011d475af4fc6ba0ecfaab62df5aa8f5656910ecd2ceebdb2da87e3be9441d1a8cdb55d058a14e7a5d81e33f43ae4cb81ac05b7fbc61cd5701d0a18381d51537aa7bfa40235fc9025ccf5,80ca5eb2da77dcd30109bed74b03765811b61327d943f74471b081499d186c9e,4d9785f8154bed1dd5da807d8ec0c64f1717eaafa8607809e99bd7db9e2400000da8a9fbf41687baaeca21a5d869e982b92bd3b0de2c9a365ac8902363afe09000,d6b25a8fe45e06c0365e3fa17874c181ff5114dd14087f7e4832d06b630c901152e462d2a258a865824817e9397763dd4a16333b8e376ccd5d57653185a4df9300,80e9fc7000199aad12d81a25d735f67a2b47e7742f2b081dbc3f14dd78cabd2b03c06296807c86081acff337cc60e8aa514aae37ccec2ec16e12e544f20aad2e01,2bcc6a205ffa68cf044cf471fb43906043eba1f6b1131fd4aa620b52dbd2fdd6580126e1ab26e9887c7eda86fd3f9acf030baeec65884bdf897408a8e53ff95300,d21b9f8dfe223fb4ad4987c354c74730dcfdaf4fbe404f4faa3b662926466d713643863db711dd8c4ccbe45f87d7334df7ecc982a19805ebff6fa73b97c814cf00 +3ab5a04ec16823f9a8668e3d6c38ac89c2c191b0bd2152437ab78875ac28b391a442295c1f7002b0c73cac6356659affd9ce3d95ac0201b57c192d7ec59616c99d4235f62518598975ee6b09c6634fd13c12cc9728497fce958c085ea238da0cc29953e6f32b3c74a84bf233562baf15150e2273e3629259156769d3e7b8d824b8b408d7c1f4760b7235706bbe,e5c986ae68fffc9fbb0000d5cdae7e9cb2410dfb7f7185061f0b4b3b4b7db022,656eeb8d68532036bf4dee305770a214815c77b365c8fbd540bea440865ae8ee5cd9816f2d9c7a0a1225a5052e7cf87043f5f2230febc15ff892c539338489a500,8f76405fce67a311053fcaf4f7b8c32b7039876b8ad7d0e542e9fda213572b6a640388167a42c8b971050825c3e1f3ba5c2672bfa967c1e6cfe532761725c50c01,561d41b544a67ded53afa53dfe309c0e452e820023abb3d6505bfd09faf1980d208412ab8e8b3b8d97b79eaf3f6b1297cd1bd6a373034af77730e2ac0c7ae24a01,11d0d11ee3f464625655f23703509cb4762f11943491cf24eb8e4bd62fc77bb104753d1829bd284c7d4e241f0167a2b2a4abd632e7e95636f88bf68e5228d13c00,3d31473b55e3aeca1862c7a72bd5f0f937526988adabf6f9fc9084852e11360f0209e5911bd1b265b4a21d28c573a3a0d8b62ddc6932d335a6cf705a04ff9c7200 +cb56af088c92cc139826356f75bbd2e58a6401fa9caf0e07916d23c3cd10348c591b754c6951d4516a0882edbb1daae364218b324048847885d217b28cdd78ed8e3d3acd13a159c92b4d07c5e2e37ac1c25bc7dc16bda0daf82afbee4d505d9036bbd8e8ab0dc21c14cdfaf788085ecce7da8bfd4913b8131b620aecfbc6bc2ea3f27a219fcbb6adbc0965ddcd,407cc496969fec375dd78bf036174d6c8eb3f3d5ea82a3a53c49db2730f2dba7,6d71708849b1b5ade299c15b793dd317a75266741b5351cb0832e96667d04af71ea5f18e9b7c9e13f8ed5a8cc46bf693c6b85b0b30ffde3a42e1a88ccc42e8a301,b55c482317cb72585dd1bc7d552838bd946afaeda42bf90802c82083d49624de2cb8b14ec33325ecbde06e1a62445b142a7757602ecdad8be829209e2b4fade400,e90d648752b0eb82a555a59c127fa04111683b4b50e42077490ac35624412a2174bee002582c0e85bdc49c2337b06207e0e09e4ea45050da84f3b884316f562400,2fc900d088c2b80ae034b80263860c1c898df9c09963ea85d3c1025ca59311ee1522bb3db933976ec9fdc08653f20a2e8233443e916ca6d4828779c035375afa00,2c5be95d44f6823eb5680be683a88560aeb83d1ffdcdaa18cb95275d326b5ffa3a24b71e130ed05b6724e28384669b5a1702ec2692fcbe1825a5e5fd8e9a64b801 +1ea511f93fa81434dea03b108e7870b0bebf3bb10b74561f785bf1443f464d94d26de5938c89961c43b980d6674db903af55cd55f99662d21dcee4ff28388149d560ce04b90bb7080d44bfafa14134fd25af7bdcb0f1063f544aadaa0f68894a50c980316ca2134b52de8474074bd77f9ebe8b5eaf77665ffc5cdbc0acaea75ec0235571e9f211439610e02631,d6780ee9808c4ce7794d22b1645a173aec483b691d69536e45aa5772d4a86b0c,72ccc61cb1e98c42fd9c3fdc95acabd46631b3912b5ea2f91daa72b0437e312a37fafc0b244338e11e07445c5269fed75f77a8d39e5ffef92dfe14eb442ee70500,59cf58ba1021ed93453e1ca7f69a4afc0d78c711db25f0e1fcc234bdfa10fbd704a2f97b39b196c8ee6a1d467c42d6d4187300c4c34971c3f8049bfdd4186cc100,5ab9e29bb397fe101cf63f35717b884451bdf90bd637cf8c0bf23b1fce43cf6e522b0bda96ae8074f008ce487b99adedf642b0c87d30d883dbf5dffb44544da501,652d015c2be993903d5d8a0a45df615ee4fee5addd5f272c2ad84ed5ecddff6f1fda52fc601b09edee5eca83f880ee9d4689ad52ff150a3c37ce5d5ec3bb57c001,856af9b2658711c773e948d81e96e799bf1da9debf7ff3507a101cd2966050e31aa759662ca59e22d15d647436488f69c24b85f7bb3a031682a3d5bdba9cd23700 +d1dc716fdfe2180d051de8bf50bd28dbb56fd49b05c7c6f7460ba167d9aa547aeebb69cb2b03cca6255c0615d1333b495d47367772a6d3f070363d5a917ee58122942f7091ef05c2e7d09f5aceb46ace6401a82a71f41c228a5ba03160a48c4faa77ae40d4a53060b42907cb90f7679b950bd7d1714b1fe0365e1176448286000c7ec330705ae40e8233be99e5,8159e1d905892a12e4ae83e3b5f03fadbc44a89cf33a6a60c230ab5b23869c2f,3ae1830d76dec36d47b742a563be1f53bf6b09b18550d89f9a014ad778d6263e226fdbd874b79caf5f52de10ba3a4726d5f1a54e77535caf8520c3f86edeef4200,35cbcdd6cab68df1217c64c034ec4359c29c3fe175e94b77d729c84a43a283f918e6ccd81dd3a492fd27f6ba2b91a58af7b4118c2a61cc80711da28376d512f800,95baebe11bf9495fa601e7d98545ce68470c0ab9c09719de1f76c66350437cac738368ec62e975b60b24f6b6c8f0e7de85b0f25b541704ba5d4b391f0a808f1200,b79fc26b9bc2400761f6830e2793893587ced5d069c81d6d785051c101a8df300df9589a9989ffee220aadf73e6215b424296b1a7c9cdcc326b33186980b8eee00,ae35e4261862922529b435e941c489482f28b8825d260a91c9e10d3951c69768168f22e0a99f6007ed764ed0717cdf2d8dbb7cd1025e828653091ae876da555501 +6c81721c775fef3f101674d6c77d037b152f813d883344f0b73761ca20d86d5938e839e23d4b2dfa0ed9d95b2883f49699e0bbb549943976c44bfc9d6e4d6fbb1f4fa92efdde386ab93feb4bc214d8807a7e25825794000801f12b26e948bf0fb250d402260af1399f2dc9618dae26f067201720dde9e88a496ee43707dc340b6b2676dca674a3864291597c0b,6b5b61bd873862059204878a83f4c9722125944b04b728b0ba7d784a7733b1a7,a49667d3a2161a1c5da676069b2b8d49709da1b1378296ed3fa80ab5b6b269e737a5e3efefa61c101f068cb79a2247cef6604e0f57d59bfc9f8d9adae686741b01,32e7748f4f82c1acc27f4dd05d0b53cbcf50f7eb4298c843f8af8b86793da535725c6e46d275b6c00787a04252c27dc0b1adbad841562d970da27c6ace7ee9ca00,63371832acdb7f2ac531bf684c95b414d64c2d1eea65c27c5f60d3e0e057aa804322543f6453b0bf711e79f9b6f7c85b956685b875c5afa2c848d9171555b90c00,a388968fe0c74c16336958c7667ee6b0b8b96ec7e7d1907f7916dd22fa8dbd5704f984929084e02a0441d980d4798fcb06937b58cb65385d1218d1050f3e1df700,107b76cc31aee6fe48098ea7a46e2b4dbfd2a59bf76a403918dd4670830985b5567189cc1865da0c6d65d7a64dda399be6e4d9d53ed90f5169d7e99fe9fde70801 +f127cccdb3e18f60bcf512cbaa26d71d8f75df7a29fd515e63a3c1a521e7a886a2abf0143a3cff3d0ee6ff1dfe790dec393a5c2f208fe0600faa38357e750d27bd1a050aa28835ef885849d3fbc50e2020a3e56a74f3b880fe3a8729d498ec213d0bdbfdc04fd0729f7e4d9582d13b44c10d4097fc21d24ec219cee2827e61341376e65656fd2ef4433c851d09,de53bba82fb07d3fdb4d4b0d4607584ebca15d9a2bf2622e37df6a8bf3c4f86d,d025706faa7c7759073f759fcebcbe791b747b8c262bc1f4a0f3f7d51c0eae3512fac2ec9a22300d187ef285dc6a814e94d0fa419ec479c732c288016228893e01,c41fc7e51edffc21abe43ff7cc9d83bf339112d981aff39b963fb74c336b676a4ef7f0284d722f3c6bc318d24d7b94dbf92bc8a984505d7d5a2f0ea8bda8c99d01,17659703436dbf2ab874e8f106dcd1f9fb7d1ae2f0463a778e0bfe19777f9dce381230a198dfb498678c6eb3ebbe7a3ed5654a666da6d71cd60b263fcac0816901,5a9bc913e15dca9abf034d15ea7b33cc0ff76f51d6849b568d69d2dcd381ae130882556f2b256faee77ad670d1dcdacdd4e58f67d94c468a5c94ce12527f993800,c9a828b385f5b4b759e844373e5e05d14ac603aa5ae23d084b6f23e295583e311ab13f9cffd30c75ff806e53e7fb7676e3667c044e368d21dd1576f133ca85e101 +515be05d04cc97755dbe9a18d97d15e4376d7c43d0f6e6bb42a016db717e5a0aac327e40cb68d2e10b3e52c7f6d90b4725b6901c1e3a8bb59930acd238f773e857ac5edf36236cd44b2c8820f45e9643baa357c2cd96d2ebc51af0f643beef3107165ec30f64dbfcaab8387a6a98c494d8b55ddd906a44fdfb3d3bc85353268df17df7fabd3980746de3feac6e,1214999e877d5a69c1ccf5d037dd30e2dc9c503a67f3a83f79c08d95f5f30cb3,b046bed72d3924e11ee3145b68e4a464b4e00405f787855ab751547daa83d2f9219e8a2de978c757a5b71baff2887d8824aa98994743cfb2197f8d52cdba77e500,1909a4069031d037a7c30c2e9b7adcbca26dc0b73aa2cbbfe36c9fc55a3753690edd8682f2177e79b20dbe772f2e8d8bee1e6e427db187753ea2e7834c8b636101,0833f4aa59f07a07772801ec44cd0a9eb5faa401c7cb670b4a19198cebd1918d6bd3ccb72992196360dac8f611421c0d09bef91bca33d545602fdaf3a34cdee800,6d0de9893b2349dfa593ff7cec57c3609edd67b09c735a9f1febc4190130b78a394d4bf37d6aa84e0a8642dac4b29a6cf7e12b78df6cbf4e53d419b686e3381c01,656810e13f5f6dc38215c6990c9127887c6dd30cc065f5c6bb650d8d12e597a00112b0b95dcaba5f3787bf77c37a74483f462f3c9b91093eacc711482f484b7400 +8e891ba6fb394ea4df01eba956312346f812e967449539c65b7d9751df8c9630dbc8a43d1b3569047656cedb4748b37a506daa2d4abaa6fae776add5f4547e63a6b799e09e385b4064b0fc916d8e524a2ce1b50f0d2ca146d28a17d09f5ec3a0555f25a5be5be3db1bc43b177f5cc58e6d4bb98f6f1e2794644adc7a252a54e3a06b3a7a3159367e26fc25a4a5,8d5b24dce38d84e3689c9c8cae3cb19baf0c06f4d55f126b56b4fc23ceb238f3,c758f13e61cb13073c6af5b1c3aa55bb0cf16d6de09db44ff9516b4ec82e6e614667b7be39c35004e39647f22043178c380d680f0ad40bec982fda7f5188b1a300,b35454d823179dbbfa7e06f9aefeea06d0bd76e4ff0070ce942f0f43d26366ec50032c97d21171f4149dfa9528fd6488fe5779e1584cbb63bf99e31c280f4aa700,fb0bf3b3cb07a1635ffd54e4af8464376d58747c23d0d32ae1d2aa708e1dc8bc58c7d1b3d9e2ed06df7ecd9b766b8f72096fe1f717ca74edcfbda1ed47ca464401,55fbf7033111523e6de40853c8bb02b601e6624f1fadbf6ad9134ff8620ae458276e2b41589002ffe8547c389d6e99b57689f9152009c2c74c99df21e249d8ea01,c357a36028f279f81ce390ff292bb94e4c83147c79fb531c3bf33d35e4130f2c04c05c8a6b1b0bb42145d2a8f3faf0c5f0fdecb9a9bdc7079484741a90327fc901 +46bf0e0de0303259b9b2b9a97523a2138765d81a5a712b0cd13318455b378aeb7bf0d5b27b108095a051500a8e4570fff4c7b7a5a535c9eb7f56c1d5f82d39698799d2766cb7ce1c7d9bc6fd0de10efaefd1fc9da45ab62b98a46e604fc4385914232594bceb52530b611f798742d17fc936ab2f232429af9d8310e282cf88bc2d4dcdb70a0896e6870ff908a0c0,7e9bd026a7ecf063a25ffd915bdc2fa330561b770a9d44fdc9b634486f0aa84a,55b7c06217ca9850961ec76ae6311cc206709cb054f443dd58230adbca5d1413728249bdc418125558296c158a11583d8352c066937455baf7ffb5b9604ccc3401,1ee3ef2ea381e4084800ba71c5de4f2d56d5fc759c97bd46ab44de54b42743d63f66bd85301a608c9654367b8ab0bf091a0446fb94f204c36b0e9e378d6c595700,340caac1295cfdc43dd1fd62cbc7a58d208e37e7e2e8d9a1a819ccc588f0141b513240e1e05aeb3fbea86ed843814d85177141388b0998d930d9f9be019b012f01,dcd587348b85bfbce765454e7b82830be2bb4e19eb09eda211fa58892bc6c6d42c967ba1ba68577f4449ea6b67054a0ee1acbed1da392e373a2be19a6a784bec00,1b56fa23e12be58abe886dc5ce377da79cf8cfe0f0572b23e153b45e8f470172344c395ac8b7fe4c2655c2358d2f8bdecc0f2f11413d48f7bbe356171b8e72da00 +b3dc0ce23061af64404d17b125871b18a5d760ae344f934b82a47066f392e3d81c7526453bc8fed731d4d5db6a075db191682de54a87009497121e456f9977ea476678c9b4806bc5bae92f9ac61e6c78c42fcebe47c2de6c7c1e5504943b9b3be1bc21f6a4de4fad8b4a4b976ca676c6b42a383ed0f86e16d67b112bfc602ceedfb24bd34c815d9135b136618083,f3aa9b361ab44363265d6df35e4947dd9082399b885c257f56555e77217f1f54,9101abee5f3d841355c7af7b35568e0bdde355072c5f1feafdd219e384c1bca83d0eadb3634a981239bb2231dd55f45182b17cc7a26683d46bb97c84688fddb900,c2f9dd3cb5d9c330639151cfe4214afb3c8c05073047098d18c63cad17099cf23c686293a116d720dba6c1996097f0a9a9eea80cbd92f0353b4910446d00b0b700,f43c0ca666a8d5d582e04928a84d45c5243e357cf2304098393b5980106ffc7f3e8aaccc9d2cceab07719cffb1d8deef4aa61a07ce6a0e40dfec2cccd220ba4401,eec7efd1f8294aaef49aed2c0f7a77f51230926dc4e1cc73c83e91c4d9f760446034daf85f67ab2c27071d7c7b94c57208107c8f8c52643a77c2f5100610aa5b00,6ed83d8a03a32347d8b8350daf83f816b91093b2ca5d34836730950adaced57a7f5aabed0796b74955d3d40c2a8fe5aade20d94862e87143a44a2da91f99e5af00 +023f1756d017cfc7dd89de23b2767e62db683233b412397dfbfb9822b3f5d794b71b77f6b8b067ebcf41cc456406052240aca8b221b2f3d3f4871acd6b33ea907ebe4acdf4946a6fc7891e898626411b1a12394d83eb526f6c5eda3d6b9e28286958d7db19ded1409b2f73f98e13ef7d75848d86942602fca57bc5f41656def9c3102a35561da94c5b627754e181,7e42c959ffcc43608101ae9d916ff7a4c165ad654b0d4dd026b83204e2a48167,3818c3b9dec0ec6121a2b4b9d96554cb0a5243ab56c4477b551be38390f5d26a399c4ae87133c9e939d3ff0b47608f631bb5571496d847bf20b44618faf1724b01,3a06f6b4b6d9699bc32cb8b125172176ab1e86348451737ec152956fb9ab5e2740764d682a792ea72cd16c6fe2888a445549c97f72b0c34b06ff42d04297e66901,733588a85f944ffbaa62e915654299ec27cfa1599d7d941a6b07fa8dcb50380b14d0932dacd50a62633ee9970e07db58c54da93424e3ea25b8535842eff69e8201,193096920ec32466ef737f7c4ed91110dfbfd6b5b39e7a36474f7afebc4322f74e88d9f1a6de4a77b5ed0e3e4ce2352dd746942cd67487b22bef5590b465347d01,f0fe566b6fadf3bb827292a08f5c6adbdfc272d14461f99cd94e685d95e542b106c4d26b0865b11e57f0a4778fedb4d4fa37196e68cc934190a91f170ea5dbb700 +f743b3b65f373b98677aded6c90daff3d6528e80cea275532bc5b553bd468b9b3f848924d84ab4f57d8bdc2e271fbc04339fa85a570926d997cb5dedc8df91f845f70d3a75354a8ac8b435f10d0da4cd090190a4584e0ae7ba09264194d2192f4fc0e8aac27511c6077c5343e89223f3522a891bfb5c3b8ceb41bee1ddba765c437af880cad66368279c1658301c,18a4c32c10e6011921aa4db1055ecb6f9928ac85b12d78449ef432553d7b1dd1,4a563dbbd81d0e6a3286b9052d2ed4bd6579f12b86ca8d8c4fab36c9fa3e8dfc72b4346b0baec3742f9635b8136f13e34b444e4a4dbbf08cdf083744273c615e01,ca86142e1463d513ef7d0a0ffb511a07539cd661f306af55dcf8c75b2c80c0692dec0bebfc28fd72037e896f12b0d483582097c9cf7adb96d1ed7af47c09a08b00,9c5f0d3f2de05a3503f6eb2f0eb52af7017fd9f7eb6c7bab2832a7447d2ba904173c5ebc7059f4ad3564f312c1ebb12cfb78b529892543eacf57f692e7888a1b00,2de95064f46d00ae0e97bff0206ee3a2cc0975273b5f938d17861e76a643b0446feaf96da712f7e0b638174b1565b2d1410db1c58d2297db6a5b1e7cdfaecdfe01,cad514e4e2b5f511bcdba5dcd274e842e560b543625b1e6bec93866099109a6013870a0491180010a57485f6bca476b727fcf5cd73f3cea2ad4fe5571d724dc201 +7cc2ad45aa617f3bcb48661ab2b922b246ae071ff0fd83b44886b85e87d2c320eeda6dc11849e67b0d95b866dac46645b74c02dd7ed00c783771097a797c016a1dd805a07051b823836b7731ff29d2773b50e651f8a4b78ab1d9f0292876ecf1153d99ea485693273a25f9d42a8dc4971b77933181e3413ce852ecff1c0a95255b9e57a5ae0500723ba00b78b135,899867b30b8cd7b250cdc2edd71ea2ab4c4cb66e4ba931e7533dd203e4682609,abdc17b934657e924e408369649a96a4b544d55dd0fbf00e3e8d54a6caf069ac5a883b804bcd5abfb901c78cfe913862e93d97f838532c85a5e9e7cf03714a1101,62859c1ee39f75423962ca2df43af7d27fdc020758961d8f7f357b2398f874575d845ae244ce53a33c1a4f99cc84022f344ba37a9345c7c50a36928670ba44f001,76fe6634b302b860b3e1899d02978c2694de7b5c530e8035f3e6855e69ae0630573772349a16a8d8c41f9f79880c4eb0a3e950907de6b919c53bd10256f6361401,5beecbe5ed2a094306e12b594515f94720e47dc2b20ebdb4d345161c9bd8005d77647d125dcc401375c6a197aa685a72f6cda62b9bfb815815ba5cc54fd0017501,e2d64085c4830abef49b9ac2ca5b9b202987652814f19479b67af52a505790b168b8d32f42a0c746ef304e26cd5ad06bcec610805111a8e1d21d5c488c1bfe5a01 +c326973a59f25ed24d6a4937a0596ecf3d476862b525a404f669670b6b991963667f7599c2bae385f9dbe899339a06cd8cd9cac6913978755a9967af0fbff4aed08e4e76fbeb8d2ea31d512e20e6123cb01cabcd9bfb734695a7c1ee2febc75458cede9c9e6df47daaa9cb2f4eddce20a3c556ff40792a0cebef666656fc255037e363a5f8098b9427d199cc353b,4d31e40d1b62c70f8a0313a2780266e525256485b4ff7de171d2445b63f74827,4035b77fa1f0eddb50850afb456bc84d05b8d7ef1d4425013a66acc9a072f9ca0ada871ea6e374205edb66a324b413a9f0551be2c8006bb274f8ca63c2f2364f00,70ef74276408e173d1f6278b1a1128d2acbe18c52007cc9df7d245c3ff9551f162616022472a16f6b20ab944ae5f2c580343bc240f6ea98b8b5cb1d63b32d8d701,a12dd73093acc666fbd35ca776f9fc27cf392783afa301a45e115f6757109604087b86cfccc611c90f5a24d146dcbfa4352b4119970351e03b2530f91f471b6900,087ae789ff9fef562cdf18db010569046f5a705bf296215ff66bda72ff999ac275d747045130c18ece9a1d32ceaebc83e8d6427228cbd6d50723a30e9ebde40f01,3c9ce4832039223cc0fc793f0343049f6ea2259fd2a2ad32d2dc5b79ebb0f07953a9edd4bd27357341f32e768b5748181bf171ccd31d8a5dbb1badb03a5c98c600 +08f2f5c98caeea20af2ad79044876632ac1f7860531bfb8059b128e82ad2ba4e7d94c3e30f7e377b8e87c7a6214ac5c5e7848799a84252cc303d6fbcd1f7696afeee4a462c51940b9e2840689ccd0681c2c25a1e5648d6de7df1bb1e545c2a348661094c1bc20e43fe9a7bcff8a5dfb4935fee46af7f15bfe5da9526a95af95e3bc161b7b163d275b586d163ef44,48042bfb52244455819fe4e87b9c8d9613b9304aeda7ed306c97df7c8f0a0881,81b3287f40a0862ba7bb121a92b9dc2d47579c4cd0397339bdbbe1d44c831ec9050b04d345e03bc31370e944318f870fd91115a4159ff651981e69e96364a1af00,e0bf47fa449f136af1b623807d044e8d0882a9d1e2295b7ca76a38b6046a82cf1eb0f2972a0be455d0971c03ab5f4545d00449b9cecca9787075056a6ceb076100,75f8b9635ef75884f44fdfb41b3805499a41335c14a5affc199e27212dd5237e32d9f6cf43d77bff1ccdf58570df6b4e1f9629269a24ce713508528f7cf8e20e00,acb08aef70e4291cb095edbefe5f1cbe727a7e813711a7a724035e910e2080e731389533090d2c9c255a25b273e4518da55ffa41c5cd9fe39e626e04f8a2347500,bab0edfdf942acdbcf530dc0f87d855b52a7f3b2a0852ac24884f6d97107b863339aab702a7e2f0878fdc6e42848b69cbcf8fbbe9cb475acc6e1773c74bb54e600 +99937e210c203cc90118dc6cb3b9e20c6290d1f90347a1efb12eabdf6cf1023ae8cc41f98afc854bc68620a9fccbdff7e8ca31b81026ba0bcc8a5d5206abe8fdf3e928e77138e10df6f816535bec3b1cf4aafbefff16d10030047f55ca046a47bae263aac7eb656bed99542f4f8e239058479aa6950106628d74e37d862292f6b9a873cb085f16974442fcdfb0e3,df7b94d3a0e2c413b1092bf8bca49c3fc3ab8b28de805cd844c9c83c36fd10d8,4e23a5d009191fa3f94bae6b9a2aca929fbda6f18277051a4cb4f8fd7d432579190e7e3410906323c6b46854e66aee562ade088ee0b7ea2d547e14446ba1c97401,d76e1adb1e192103eb393d1628f1c48d26c9b21952e28c3982d90f215429de6915303bf07dee1a130df0de0815c875243bb3ea4061a03ae63f45bf9f30b1418300,1d5295be3ec0b71ca60203f43ba2f7d98fca8c6840d3c01f36a52109bdba5850235481ca17470aad3ab0350b0083086024615247f274e25e47a7db47d9f48aef00,e09c0a0ad9de50fe3f49f614813a275e2475a69b5f4b879cc650a69592f580e33c542152cce3e206cc3120d213d62c85c865ef58b3bd7c2739790ea37151adf301,50d0278b8acd1e0d1d153ce5e12781ec4c826bd05c1a77cb831c86110a5df87a16e2c949e9fe85b14436c21a33dbb7579763e1dcb5098eca2b398dd2dc10242c00 +7715a4f76dc29b93fbfedb774d718c80253b92c3f4a4bf542e104d8e5abe106528d0972f447b8927da4ddfc0a13f6e96a05e047921ab6389fda788ece0917301f97369d64f110e41fb96f1b42623107f13b94b9832b397a217672feccbfc3592e5ac0239355ba43204cf018fa21228f79c4a2b568dbfb7e829ccc2ab6f9b83d6743e8cb798c5a358442a4a9aee21,043dd645b9d11b185480e171c2bf7f4ea9ed93eb38a491fc3c562e0238e2763c,5b9b84368b0c72f1c0e7a8d53b3f3da9f8050df8510839f72b428ea38fbcea533a502502a2cecd4e4fcf695e2d6e66bdb49d0b042cd9783c8be94c54457119b401,17789bd9b51b5f547027f4eed45c7c26e56a738a09b75a95d044ced8f23179ec77d2f2fc244b60fefe81afd977c18cbb1ed9942a8a660689de9fc2a745c4a83700,305ba2f6ed8ebd797ae4e9b94fb992c513c263db3c00a532146e6baeb56dbadb4faf24db243929df61d5962c593c1c4c5774005a15dfa05c23457cb315040f5700,01d3c1becfd59663911cd776f9df3708e854d9f06a2ef828014c55d433726d8f45a746a1d31208a0b33da544004189c5c811d5d08629030cc2ebe5735d9fce0200,178b16ef2edb85d2b92385ccc3fd5cca0366323865dcfc797c9b3ef0abfcfa227fa5afa6749750587d742bc54c1a3c6db455b2455edee12626ed5b9c98b4fc7f00 +7e733fde446d7b74631cb1a8d93ca8034726c4edf9855085076e6989335b1860482aa9c389983e8e500e8228a2a62aec5479c6a8d24c5e5754228fd24a515e5035a80fa9d647443732ee8d4450a001cfb300cc2502626b92ee8c30c09a46f065971387d53842ed2b4b17b11cf947468d33a06675cb30f835ab50b3cebb47229e6a46bcdfacc97c0454c0e9dc3fc4,85ca51657621e4c0d2da690c360fb28eda34973a70481cc2470e5f09ddb7ae97,637e71940201d9697e7c47412f97d48e9c1f5d59d67e665e2b84bb06f42972150f7f4dae8f1f492d38a64238314312a49daa5193451fcb0e1c9b5f6a9e5b13d200,3d5b2010aa3d8e305e8e9f7181dc9cf940daa5240873d5731d249f2f02503c00270f0d042282e30dc37ea209462de57f9bc1aa44699c0e085f0730bd51b084f701,73fb15ce035ee41db4f8e823d3763f36dfdddcd2c7212f724576d88b3879bb0b7959dab72c68fb3be64406984e41a6bfeccd75da0402a2942fb46e2a5e95c14e00,958082f126e9476f7d090cf8878d435a87e8e5daccd3257b0bcab0235cd7c9922258fbaaf38f865ee4577af49f88202bb2e9bb4112450c7a0c828bcddf5751ad01,aa02f6ff65f9a686bef50540a858aeda9f8cb59cc65a66c0f2f4c30d2ffdee923d0bba0cb11152fe3d1f819773e9b6ec224cbbc09f8347d2a042a1707c74262400 +b7730ab10220877d31103db74c31f609ed4b2c32138fb471b4f11c4303af9f7eda951ddff05d341659698d105cd6a6f0743776958043c29a365b1a99b9a6bb51fba1cf81a0a9e385d6455bd8cb7bf0bf596226fa39110bb23c6795c9d7c927cf25d00c3abe8d3ffd5fc556a4c48ada1bd03c3c1dc53913e5dd095761199450ff16f930d048ab0ebd6fa45826fb04ca,2db6b92747c9917a82e7cea474b737dfc7e6a6bbe65dcc47554d5ce8bac7bfc7,312d7fdd8f1a8635d4716db50d28f355e9062e8bb08a7fa0dc017df6c5407ea9091cb4ab279fb4d388f3ea3f865ce652de7b8b7495f7a4b59357b6f53b0fb1c000,8136d2b1318e1a16fabc764bb22a3d4aef1b1f76f0495c521fa04c5c490a91286e86b6d464b0e8ca96d7679fd42e17048a7f87eef196e65bdf8604a6a773a1b000,377148e4e2a977bc45dde33a5fc0eb205e644a549b0c5ad26655307e7021f6c0177a54961b8b92d326a1ac4489517d6fae322c7c3bfd5a30ac9059f7bdab5f5100,d14974b9394cdcf30851e26058323466894abb194327323528dee8b94588a38d0c72ae7f3eb73dcf159508dc31f5e36af55d284aa730688878711bfb0d1a090200,d0c459a62fb10009620cf6cd4d1b7ee4d70403daef83962a495f2e130309567714af603e0009bc3b48f0ced9fc7b340580e78d896fed7a31b420168a8ae1393b01 +cf8d33a55b613a86f978078ae01bbf1567ef59cb5ab30037848d354eb3f8393c99263bb45262135195201c492ad4cfe9e5ccb5c2e17ae874d2b96576a68f746e1bca56a5e92fbc8af865ed960d264ac3e47a63b306066227996b903acbc644be52bd33c64c537cbdae728d017841766a5559be9aa227b936d77e2710a296be0f8d1425a257e24bf34b5f2176ce7604,c378aed7d602d3715d16c99db04a1431d2728e824ab2cf34da3fe8488d475822,965c29990a679218ded75a99f54e2316b9539f84e3716fdaeea92c14d0271f9406ca94a37aff973a253844b6f3c2360bb1e7ad265ade9f0e2d47e1feea3ab8fe01,ff18041bf357e77b82f9c1748b806ef0f66c308d1940038e378b949fa372d9b877269a1b9cb20aace7e984c1e349f59860ab6fb15f8335a5e258a5b3487bcbd301,789ff32882191d4c64a134954e3b50376fc792fece3391beba0d6bf1e43f9513483239be9c45350114987ab72ad9b2a548e53e42011090738554d444b74d59bd00,0092317f59d9e817bc91cb0db9aa76641e1e5c433df3f09b5dd86b5a4010895637d22b3a2d5f1986837a3a30f2fd0cbfc84fb52068173ee42f9a6a31b1dc33ac01,be98c2539e865e169bb6220a9da825bbdf16bf6213f12456e7c03a4f9a8cfd7f447c5d2c03c3eca66b7d153586ba15cbfc1632e43017bd9adea6fcceedea137600 +389f44b7260b3f4115234b079dea1de90c58301e70eb4fc89d23f022343b1f8263187de2de490e485321fca09978477adb783532f72cdf57c8e7da8d2137f56b1870624e6f655e51e4df75a12c47cbbbb98034a937c9373f3ff54f636540775d1d87f2c73837a293771275272353843f2f8f51a2894afab0d213d911fcb4c18f51e2b8ff3ff9a8f7695e02835765d1,37fe11713565bf9757ad11877673b934c5d200c35d1187944e7acd51b533d164,2bf7ceb97708ccfc4d8ae03cd06a55ceeaa9ce5c22bb2289f936b09753f2d8705481bf81fd04125e2b0b47f30eba759cc943f647a25a3e6a1c2f4f1a1fbd71d600,d38bc2239e99570ef5d54d30a5b9d8e1d4bb52cc104da4de6eb5937fd051cf0b2ada7d56ffd6a4b3655dd86f70aa4ce13e23e78c583ca06d96fbd6b40be7502801,bd7ef6f71ade68d1c0d27e8ca0d3d62d41eeec808a3463fdb162784209f2d2a51ae28dcdcb299ae0647fad34dbf485782cc67548e867d8ae0fef7722ef8619a400,dc202ffa047bd08bbbd79a8f9890952e7e5f84f2636206bc84c5b7af444b5aff52d3f0becd5af99a1ed14d8773640c309cdf35d045fe6136ad7b91ac0da549ef00,96372f8f811d7685ee145017368015aefb9e053c504f7fa5e8e9c3c13d9cca8f3cccc3a5e9d98f38534d5b489b34e7a3e60deea4c6190acbf759e806ca5b987601 +d85ed5b42bd35ff939ce21146ffd081c1b051123ae60d6442c8a313f57a4f57defa016d7b9a7336f544e7cbbf0fde081732c631fad331da52e6ff07987a56ac335f9d695a8ae5ab77a7aab0a01695978aabb8d9870e4f8c5c3c629ac8f4c6b28a43ad868f805bf4928ba14af83d8d7acf657d6262cb997f132ffe0de42a1223668b1c3e1cf47c884fc0bb2874c3e03,f8f2c1564a37e109d9ffbdb76307bb710856829a1e44d31c96a809ec5d1e9f21,69478386c7e3cd4324fcfe0a9c448c5688b3b6280ae142d59c49ecdf73632de27e09a548b78adf071954355bf75499712a77e7c1f0561d31413015a5cf964e3800,4450e45a0d7ab9e486b74c0154adde840de823c8a1c83289d3b89ca06c17d81207a68c3e676df3c4d26f7d1540850fb5e80a2e146f98521d53d2d45f2fb45dbe01,9784698ef9c6261c2153a24a1f1b2c7ae28e04541c39871665a8234a2c1c6f2374aaedf83dbd7138a3ed9e0cd681afafaf2582102847862dcedb22b8f7bfcd3200,2df87ce683973a5aedd0e3ae5bc70bdb780f94ffa2379dea2affc36c094ca52a45166c9c2f86e4be8d65e7c7341c91fcca23caf9d9067175b94dd6ef199ec46901,5110e428b96b26a82e84877020471b038beee849067c85252c855c60baa09c255900199eb71b322f2f740feaf26e9ae8f240bc36845fbe5cd25fd71b3b94cfb600 +283d1a406849de5d61800cbf94e85cb3ea2014a782f0af56a3e53c1113da411f74edda64659a9ef9c8a5e79a9a89acfbc8daba3f2773916167ed1fcb9ff0bcc4adb3dcb6ed3eeb9f12e93fcc6662908f4f53434f56d9894d72423c09abc0c3a7c6618e78c7cbb8b2c8e9c4bd978230813fc280c53f9244942cc328fd8cf34604df56427e2e091e6df64b80a886f650,01873ddc2fa79249f65a2b090dcdf08c67a3e6a952ec1204d1773bfdb6f06291,3b35b63f35194601dd2256cb71d1daa1f421b4561bb7211c0d7fc56e7067201f4ca76a1568764016bd16da6f8222e67268af5aa68d40ea69386e96aabfbb6f0500,e2d4d577fa8bf58e7c453e6291a0767394ac1352bdb3f4f7d723a3ffbc5b8d245f608e3272191919216161445e2366bed4f29f352186bb1042f8086630591fdf00,6ddc2f79281634e3d28dd2ec92bb37767514896b72352408bc33053fde4b317c5bd6cb78208d65a034620b8efdb39e4bb659c254805c99327e58c574f1f931e201,687812fa09607c3f27739962cbb078ae811b764ec5680de3b99ef0fad849bfa7499ae7a1235696a41416c9a0e88eb76cf54f71b1378fd4115445bd9871cb701400,e6053a2b6ea936a83fd552eb9d15f4480f5e8222993a6305720358723a33dc4c6c107f522fb4a13a7f9d660d1538fea3b52126efe10961e471df6dc83cdec8b500 +6df54aa1423fb52bfec5d378619310d75d4465a2c21ece3ba6f42d493bfaddb6198b321a0b5a1e877d498cb812a38a63f2203147d4cc4476ba06b17d09e2ddd94e95efb03a542c640b3daef1d6e28bb1b2076bad1e314d4ec1cd5a26a200d2a8ce8a0d97796f9b9a21785a9502c29887f16f9fecd340ad9523c665984ceeead38325e04429fb4d55d64f907f9c2b7b,9f98ed00c2763ec7fcaca3ab3ce761da580defd95b9cf8ad13e92efbe7ba8d69,4e08d5cd182bed2a3b81aaf9bd8bec03b6657421211d0e1c093fbfba43fb6d4744078078d9d307a41a3938c9a87eb2873eeb12a1f178b1f3a69cfe0440d320de01,14de56bae3c9b343cf7a1e5ae1881332e83ac65976524c3cc723ed326afebac30539d559f4c1fc094866e0cd45504037d3b910a8a5397b60c13914fb6947da1700,487b361db8c32dead825ab4edfd155356c4efebe4c8c70585fa63a55a5d25f201dc3113372bad28b217afa206d37104f1a354eccc1e7766ec2ea3f330c6f046601,0ee47bd0b301c1fb559bfee1fe1f4757682bf283505867162a46e5d5f0c9dfe76c0eb2d12df21dfbd9632ac00caaf5fee263809c1b1ec11c7305eb75b05d57ea01,c483a1b2952251954033cef5543371c0bc64fbe18a532565f0e7028648b8ce6b7875882214d4e582ec36fee1ea7930c39b3795506866d4cabf38b7a34ad165e100 +039dfd8f83b69b93e15ca94159381a692c8b99901448bf3ddf7386be0d694317472e8ba7489972f07e9518f7df6207dcd7634099730bdc80909c7108444b3fdfd2e4575e781f1062f29ffd21b7bc1944022aaa76f738db2b06394807ecd7c2bb59a4e5fdbaf3243168e5e2ea61fcea5a201041138c37cd5a890489e47a262e2758a4e8b760ac478647ba0f001e8ec8,ad1052f5d8a506c770e6b09bcca49b3b17011f91632df0747b9de72989809476,4965394ca59406617b0df393b36407db0f9e90bd3f594886f592fad5726c79a05a0514fd19f5c22a79e18d0d20bdfd6fa029216d16ebcd37082a34d008d00c2a01,bd36eb8d4445f1e93b440483a01c29fbea971d5650afb47ce2a1eb77e9cee7e7335021edf5c4dff622343aab81b66ad88a2a03c0a661ab72658fa764344ca88101,37a2fafa3a2abcabd3cf337fa3162552e40d6cab862477242fff42e140ac0cf90d4345b91d448bfcf78f7ddf59b068f8295589346f040bffffe9e131e3868c8301,1b3b0facdd4cfb6f409f509e498c54af34f39da023ada749229ad7d8aeceed875c6e546fd384d371ad11f7846f85f6aee7aa7ab1414c817ed6a0cfc5fea3a51f00,ea6e3658d8bdd534217bae7ea83d63720368584101fff07e1c720ecab148a4091cb7de1cf343e63c9891ffb6adb0c46e0608ddbccfd597c5707401ca26c4a2e801 +87b03acd0ceb91a2d4c99d45322aebae5a2bcf35d981b9fad72a359f3fd0bc16fd4d3f89bf462a6cd4a9d936d443ad5912893c3011a29f5fb938c61f64dc7fbe40e01a7e9c61fa211dc723a4cc817bbf65a905b8e3ae46bbf9a915adeabee812bb99e454685f95889508765145134ff82654d54edf034a449e8c8655c169f3c4b17825ad0f2616650500542df93515,8e1b89d6f9b9355cec8be9eb2e3b19f9e45496ec43a9ef283325ac1a9f782615,0dd52f2a27f0179ba03233aecc0f8c03ecec738767c9034d3f20647af7cb5aab49931527dfc06abc4adbe152a0920e54879046bf757726b9cb125d77f9ad744301,1c5d3758d1531e6dc38d9d6f904800998b74df57905abb05603cb93a4f6b00703ad145ad276ae9d0572759c8d970e1b23e37ad62ed942bfc90c2747c31e2541f00,4e2157751c6e20b03852769ed3211581257804b854aec5c100b21a439cfa878f671201f82d5200c9c205cb97e9b7d782916edbb8d674cdd938da45d2fcd8c99001,74174ef19a8e2b2a7d68d74c97eb5e62b24e419c7bf9f00e181dc9fc480add2e72dc053e7022be7742120f239570c99eca7dc2d251452185f350dc3fc07673ec00,b21203d6117d9640441f79fa53719db4951fe33a817540a1599f3ea97ae7b3d3492df2989e94e032a8aa9fb4ea31643bc3715e982d27a63975f04cd87aec269c00 +c2b303d23490e806d47caae94ed78d687b67b1c537444483f47e48bf6f866790c8086f2f23620e80bba1e137feaf74b847720e26de7dfc8330e7cd1bc7e9170e1c5767a7710d84d435678d836454cec2b7c2eba5d867b33f6699bf42e66942498fabfc0e96794fb436c3057f4079a4f06252737a8ef4bd360d278ccb8dddaf6c3069b6d9b856a5a69d5ea2942eaf9c,ab846bedd381c94616aaf49bc7c0f4724819e99b264a3c24c272e7125956b21f,9290b765861b0ac759af369b45c7de7adf5e3b53689e02c0118c978986393acd6cc67ad1225b745f0ff11afcad7b4b8fa1c95eae161564e6aa5cd26143a75d4101,c3079329423cb6ccf02c4f1089ec349cb367390a1197a6de0a46829494353e460e1e52ae29e8a33731aa41820f8b4c62783181a3a433b50a9893820a4f0e1fc300,fa5a0ba1597b341b8dbf2c55c5662d20be85d31480f09cc688e6269cd4096391567f20d972a4e3d3d7e860d47ac9963f3d24be45524484157b0590574732981701,cd38adc9e6732fecf8c0219741dd6d13975f44f52a0d966508f5dc04796b77013133ab28f7dc5de3fe12ee55aea4902e9031dc739dd79f1e6cdfe04630bfadd400,98544b4d5ec3fea0269ea658ff9cdcd9409adb473757fa479b435d22dd6e5e8f00c61c06dd8be73d86e3a66ea96e1fdaba7e5d719fa76747e45948847706726b00 +3a3e119c64587c07bd5b3da00238f64a4f07adef986c28085131863f13ba118d40f93562ceb18f6e94dc98d56bc89964e9b0b2e027fba95ee92d636cc71ec8eeaaeff017d7ccc7b8b65cbb40fa2da371a8b2c3e2bbcd9a89162bb77f5faae68a2747053e06472f3fe343abe14244b4b3cffbc75f418153c483188d986ac2358b3d2c4c026a35490169db1262dafad0,dddc72caa81c1c281792f390c5c6864ec0b50c84b5359251c1fc47fd3d9239e1,b39f995627f6ab0d6ea6869f236ae0e7b3a23dc04f735002f0a8550607e73cee62737b81927e120662c5f452b68cd34d05b95b1a68e4cb57ea74d6bf2780a05500,0740323b27c4ba967d715d6ca821f5aaed3f0cbaf6f570c54dc2b2a6b36ff3f1590d67dd3588421ba7542a808edc43e30a49513d4adb084c1ad29067a931107101,caec7e74500ebd65c39ed3d446a3fb8ccae3ba4da3d653550eaff912a3226c61734ecadec00adccb08b5136442e59ab47009c17229d008634e20abcc43785dee01,e19b38dfc958665860bcd1c5b61e481f871cf9df32b082e5ade8eb850c450bbb6259d1af7272839ee8ee427bb2aedb489bf308dd2604511fb0873b8981864cd601,090dc7077c733985cb11116c7af4d3ddb50ba9500f305b0c9104413514eeecfc0c64a86c26523edc76df579955ac467fbf582e71c9d05e99f06b06fcf64f911a01 +b0fe0539abbd176c17bc0fb4ef809bdd75e59995a6d986c55a92085aeda00e6f133d6690d23a50687145e03588a0bededb7c84daf0b3a9d79e51844fc02ee3ab279901b43feb851a69275f6ea71597db41623b5d6869b32ac2ac48900dd4b5dd43d50ea61db54b75ca63d5cfe0ca5168fd383ac2699cba8d7d0321a9115364a2337a4f5b9bfd377f5c02606843356f27,c07aee58a00530a20612f93eb43236fb40f002fa1fd440ac3a192793ad807b66,8136393390edda5b95c4708f51743d9e2af9c36f38a47f7cd7d15189bb2f5ef446e19d6594ad0ab265156ae6f394e998deb0b3eaf8753c93e27dd6eb0a494b6400,37c001a9f75249b44d058d830a7eed25826efe1f25744fd1f983f5493f19e71332ef743947163c498150672f872d07f7905a95f6ce6ba092dad1de311f1aae0101,039323cf83d426f3529d6fd6bdc08329a10a7e1d74ceffb932b4f583314f2bed2a36f3d8bc3d40dd103569bc1185ce597ca9ed0baad95217422a626ef95995ea00,0f898c3dde0d508fe2bd00eba2dcb961477774c01c255fab4541c240e57818f153d9922a220bf6c592628183a37f3c2ea0da5a2b2540a3cf10849c54cf4f77b601,9c1f714fdb418ac318d4b483ddf6614b6e0caafd4a9c0b2cea7ba1646bbd7a12222efbe79eb2346441b29c2f28c4199cce69b6816a9ff281daac7df40075363900 +828db2803febd791f8facd5f31259366ec928ce84a96f861806f5f85d1b14271abc53e1a0d3c7432b3e42e01cec0be71b038e7321eb98d1115a2e78bd4c4b7f59e0672a283239164dd47a233b039053bbaab0d3a9b6d267c6f53bc5a6e37843461c109ce7c7c07d04a65d308760908ab71ae05115599ece82dc73fdcc8c20fcc674defbb2e8d210cf3b99f4da4961628,ad988760afa2e610e7ca3f76711c22fad5308b77444c4f6da5519d9facdd7acf,287b39b3a4fc31173a33247b13129df6135cc0d4de94f128c03b6f42ccde5469250214262ee88063293ec1318b78b44b2f6e373a21ea98b5afba7be0520a034e00,77d9aa3e83212c54fe22fbf5aaed4a6a533e0263c4711d487daacb3e24dd35166a08145f8b3939aef3e03e1ccbb67fcb9a586e96c44db1954249eba3626fe11c00,81a737192957c2e51bc93c208a8e565f56f084a8451be536503c585d22c1d16620dd29d3cd312b0a96a0edf14dd0f9ff245dfe3e17b11b52790265cde4f0556401,7f6807c1c4ba1ad56f3ebbb755e739427767317d4878da46197eebebe5f7ff9d79f7deea2f6f5c52aa89f2c306dbee024ce167cbf718f2fdf612fd428447b06901,2ca8498e6e812ec4ad4d868d9da31125c527630c42572e26247a3481e6c38fa840ade4acae362c398528382ee76677a94965e43b5803a2f8b7320f3d765390a700 +939a6c35b65c68c9d36cc7c1a1b88f1d09093b3eed8e14e11fcdacc54751f3977d58b3f91ef51339686506eb8fd23156861af482a4a949f3e5e593041458e3b1463debdf253a736218c76e9a70b66827e2ff92296346df87195f1019fa6c2041fdbbf2ecdd00a87c197c21006ae1c87885b49bc20985af13426a77619285efc30ab6627485358b24989f121cf2625eaf,bc3b2b59c4470bb02c4f4fd95ef199a893e51694b01a44091637d5e2fe8a431e,c26df950c8d517ab4cfbc5fa70c0ed0e571ef90aa2c77183bba9ee4ffd5655210354298c696f24f6c78d7e24b9cf96f1533c393bf1725d6841d1804bfbdc652b00,7ea6f53b2f8b96988b018f0b8f0310a34ed5ad3c7610c413aa9b87bf91dcbf54673d8085ffa852edd8e11a2a0ece1315c0399a8f267a63577964055f1127246901,cb1ed9d14d29e714e1d8744d9f32ee7219c2bec25b8296dce3f03d2260318792271b6b9551a770ebdd6868b7b84507d58974e1a2b54f4dc2cd294483d69019d401,b0223fc6868f1ae9ec6a07cda59b6ccf7324ae11aa3f92445cdb2d504c75d9e746504fce49eff56de611d764cbf1c420e42f9bfab7b0cdea0a19da763fbccc7d01,ec7f28eb3ad0e955399b668f5396e5cf5b66ba67821996716a7fee50ea20e3651a7eeebb3ee3ecdfcd8953c5378406074d199bb600bf6e68a4db3429d649b5ed01 +eb3e6e3db19506e2226e7606223c7a15ece159f6199a78e8bdfefd5d0490a560dac39b0051b59a00413c189e1eec5305e1994f136323b9615d0b1c52abba01a00fbf8cdbb555d0c1856ededded2cc35786b2402555e17d0945a6eabf5676d2d1e1086587726063072a7bbc2e6e9d92f00a56139f86a679d299dcd8808c5d17c051e4e1911bfe257a333dfe3169ad4b16,5a693683f83c3419efda7eaff91e241f987ecd0cf2d2870bc62a850e54425567,4c0eaadb0d8540101effa8e95ffe4e75465a76cad73fc327ce2886b5ef09fd6b4be36fbaddd872cc3789826a006e481799e2666e36761fa5a260456bbdf4f40700,4be663219e1ad37514ca324ad32448b4d420812d675569814ee662f92e041a9c34ea2e027a7cd0d7dc0159621dc4f95a1e6ae734a84aeb074ec74ec6af69fb7301,034b65aabf45c3b15aa8c100bd4f65d7d809572fe8bc48ca8c3eb6bfd7d37ca71ef78c6df2e13a25fce3e9744a1589e540920f42dff79081caa913d319955f1901,b3c901ad2bad4a4d64704a0029122c4fa42eba184ff84bd53eac23224a3d4bdb7423d7cf5a2feba524e15f9b42f535ae69d23927575657762fe23996b25f2b0801,20c5896eb14a16392d40cb066d6e5b7519d3d9ea7d7ba267907b4ced9f1b1ad52ba5e7fb759df1b0135fead67c6eba151eecb2d4d0dbf8304fc2fd10a3f5256e00 +f315ea2f641cfc9db52120b3525862b76ad4c68f116100d419856a5d707851f4524b16d1f6e6d92c02a6d3543b3b80c924f9b2d12d4c85152e40436542b5f2e437fcedad40f60873870fabd87b10fab927cb20d18b5320c79faa4f27200a90487923c1b25c6216427acb08e85dd5fff7e7ebd4be3cc3822d2d22d623454a2b251aa1ea0e723d3b8f4382d4d338fcbec1,9ca7732c13ffb61e984858078ec808d12adc71692b341069ebad43c04f88970f,cd1bccf4e105ca90249ee9a99eb12d0c0239b2a296b6d9634352aec0619bae0d208891e4d05df5b4d52ee93c21bc300d96653efe540b9778ff97465af1c1af9a01,9b2f7c0f700d5b973f58c0db3ab44bbaf636a6eb72651682739e20490b0827712b2d6fe8531cc976aedad5a6c30448896ae1c0fc12829637f25b36b4daa7dbd200,b075a0b515e5bcdabd3f6279021cec0a9f4ebbb8bee4a08dc62f8c580d07ec5d0e5fb36498b8fea67d9781ecb8d9ba0e9c8e2633b616ed2c02f25d7fdbc5e85800,ba8e54609441f0a8269ae3f8228e9677bb50e091c683edd081fc5d0ee68bde9869bde6a5c37000eb53335c02627a0c02806405b37ccfc8ff16cabb25f5ac1a3700,aaf1486eb9cec34ae9ea32dbc140a1eff943c144ec3e14b7daa934bd2c43a72b2d5e21ae5d3dd87096e51323398a581a8b835d58acdee2c8329f4bda03f06adf00 +5597498719491a22383e4a1e651c0a6dc9a2b38a18b8fce5c4155a2845333bbe42a14d2772d686f2740c5f4f9904ef15fe78a44613463c4664b1c600dd33757802f4a6c703b4c28a3c680f129f26c17a56af5a1f1ec07a7c8b3fdfe3b8f8d0992fd09373525528ed169ca159b7754306c1f7e9ead2ee1bc61e84df48de44c8a4a02d52df6e8a9e91c95711b7632d309e,508901f968889c156713de90bdeeb5c7ea9f1555bb1a236d758ebceb8e38ac95,7a00e3a72382a892d813d2a947f5985356c504d5fa716a0d7a3f554708a226d319a5c9df9c1738fa15ce4dce7a7a40f6c00a21ecd2b3966abbf8678c3d18359c00,c4e9bf9007649f1bd3a3cad486cd9d9ecd497ff4a6450d91964ab6cfb601e2d93d4dfcff7b2c8ef20274e5dc7eb35fda7bebf4eea6cc30ef992fed3008e2dc7601,5a2f7046eeb94f2aa84037af786ae2b504b005274e2194f325d5293bc6a454421f50c572988bfdae6ea7cef864323c00965d9f091dc037a5973c69b060bb359d00,98f7fd057d94a087ef38eb46d1789e823698bc537f7a03daffd18c6d00a47f6b39f4c59e27aebb8bdd6b67e6b12ab5690fe4291d1bcd042269decabe53712aff01,71fecffb0b85b17d2e2cca04f95255200a86539cb03ca630c473071631290b9710b94686bc13a8f3aa994879ad95e609fd634cea3d43e8fe933224f8813afa0a01 +a156e774a95ead604ff39b79694deefdc8044272ccaa7b69536a88007d9faab3ae86c8acf2c2d85746b9111813a761a34df0738ec9d5e5c8aed7155d3a9128619e620f8bbe2b0dbeb6b06bdfea66efb86f6a9ca673da3d2483facc0b87b8a4c06dfca64ea61ca1cb887c18a0b42333e928a65086dea54830337d90b4e94246dc148b94ab744a423c769c1b9ece777537,50aa66c783caffed0ca0507cff273522b2f968072050a7bdcc27799eae925796,55e962fbec96db1fb926bdb92758d52ac83aa258fd4e8c4bbee3739e066e5f473a7ad650500f2e5eca2d7a824f1a3541170701da1fb9d6ef669e70b86ef8217d01,ac4cc64a079c6c98ad159ce36812077dbf49de9c358cef5ded0084abd9f460e071bc4b464b19c5be457de8856d052dc936f0f33e8424826475dda0b9e4b9f94300,bd7d47189068f43e6ac0b641575ebc57836e3d769d38dd9fcc6f4a022b9489602e503a56b3001c306ad4c86cf85c0e87a4f2ab997079162e70cf38ea4401a96b00,71aaae18b9c4c022d5d84850f48a50b20d9971228db8086f83560afb1ed63e544372092d1b839f01ea69e910b7a7776ae5ca21222623d09caeabf0df26d1686f01,4c39b621f7d70630c17c3364158f8759adc48ae17ea13d29c755e7e3c99bb3dc3f4050c349791e16490e2f6e4f7c9b5cec1ba953877ef06da63a02e54824f82900 +607eb0f50a0282d877ad65e6e1145f4f7f541e5534e77791d01e7fef451e8c41901efd24ab7714021aa6d6e92126a60a50be2cd5069bb50300625c4a4b1a649a40d30aaa2fcfe82ff919af7781ca2df2bdb80b82fc2addb1194d842da87335bf6dcae308dc1fc354a18cb2d4252cf689168ed8e1002c94b43b05b56f298e27fc8b808a926b2bf5b09adb05b4229704c1,8245737f37b9668f0092e32109638a1231d0d42fbf665a4d66f920289c7c1842,313931170b4cd1cbc48841df686f8f71c539d8ab805329c2b94fc86889b02f5b67ee74371510b27017bbd97ec58dc6e167e842e073e1a6de03e8e7f9f8300f4d01,5ca48fe9a7d3e1ae621ee8d9ec70c9d17a37c801f82ad8c91a507253c6c02e415a9c270a77be86e396e4cba21685b3bde085360eb6fdfd367979869fbc9050a301,1ddd0c731f40d6359dff1e60b338c03a4e560c7790d20b31e96914e57c64d80409d4b3bb4d96cc3c475f88b9ac499f3aa6c6003f61ea61229ce95eeb71c7c01a01,c42f289d3bb542274a3eb4a36671cac70cd9a05ff03a08f172d1ee39d619efef07f900876a60300407bd3787aaa6ae569a7552c4372ff2ef21d65446392044b101,6b5c14664eeee241f8e95109e10af5780a9e97e139e718f36b2c23446d34fd2f1d0e2b00889acab5c9a0b4ee7712486ee881d0846d6893df1aca2e634200f3c400 +44b0b1c44dad7b3d773285edcb0b8680ab8bfe1cb347005f6a194f465d2e0647947d761a9e6ee1be1a69fd7cff0508416c027417498280ed316db691f53f5c149f28645263ca500369aa18768c6b070f3eed1bc5928bb9fc3590eb9c501313227bd23a1bf29da297efd9abdc3bdcba9aa6b62a810ea5aea1f2d93bc8c98f9ca2a550ae76aa5d8f66cab06c1e26c04889,ce7bf7c591bad94beedafa25d877f04eb8f65e5573aab297b1d88000dc6e2f29,bb0ad1a7e03996ff8c3edf2faf182f042668df0702326ff27522be34fe874c3a400311eeecb3b240c4ba8c3f3c6093061e1d953ba97773f700fb505255fb13c901,026a36f589e49a24981ad7e1df771bd33e462fc58ff24b458ae7577bbc32713220387ce3cf8eab5e4a1ccd313051b45a5af328edb0fabaa09349504270c6c54500,dcd78bf61732eeb772e5c50084b987757550759a3fba50ba6da4bc9d0ce18341349a7abf7113d405000fe6762062cf2d733685b2f8b80fe40aff57814df4dd5200,a5867a5beefce45f1d74be8b476923da5211cccbed62659f49446e7a7f40b8ef25056fdbf30f57dad7d86302a054088bd5abe0c594ca30e5ca1c40579b37980900,4e88640422c1d78384ff2e13492682c4c219f03dc6457f5fdadd04245841b6ee4f836edd6f8f5559dda33c5f348cb36b65ec8e8e824f1810028d3a9d206c47e800 +46ee44ce104eb06f095f9d4d3bf6deb39cdea39cfb123df112d48b47695741b6a2730daefe67d8f092ab47b58cafb57a430b3ca1b56662735ff60c0a2456ce7120570da1d738fd25350a6ec1b13294c09d778bac79d2f6ba5838234517336b59fbbbbd3f2c2c168a0da08cff3b90ec965a99500521312e68bb9ba94edce5dbbfa6d66a02e3d785f5f63adf0b71831175,88be889c84118415c8233b847fbbb233820662a6fad794c85d7caaa9dd9a9596,6a665ab91a8b7152a0f01c567b05c70d03846544886aa5a00aca6ae7d02b4eb10e4290a1e0ea1f3bd49317bc34a81c0bfc11139608fe53d9ba00de627787531d00,77fbfe96b5a27e46b2370f2ddef8579810e9a63c140a9abbd2ec016f735c57524204bad4f6ac6f44a71663a0f6e9b35fc94ebf01937b9e694f5932c9042225f800,9b37d3cf1625103b670eea22a22ffd1442a5bab25834ea00189cb19bf6b59c0f3a5a2d71c33d61604a1d0e0c2e1e269d713b4b72c1fd4d1b7a50748948b62c6f00,db6cc5127c429859d4e264d9ac48268a60a68cbde9e1d4e9edcb9ca38506a7c17bbda6782165167a326be5ae6f4dfc9d1ce1c33c6e7eb91fc93ac933f3a89a9a00,31c3694e1fa1b3ec0bd510db555631426a047df1f615bbb60218edb125377cdb58cead9f061d4e79c8165e13ca99bb5139b4ac72e0ed216d11e8ee1c9282c6df01 +3762d6ce771ca2477ba929cc4d3816b81a523d0f2f9e105a2558ed615b1b7c38f7274554b1a36784f4d95b955ea8431579bb492d81e6a15ce76f251951f5b4c44b671bd6c2bfb8986c5ef8e92493cbed7cc8d2a9197c85d9ef03cb287858e520a56ac81813d61e827cd1313bdbe727bcc7f3a558de98f81701a55c258d1eb8aee16b3661b1556efc83de8c522654c62254,b9d9fb33b1ac93407ff2ebf3b68aa87f8371f83c12b039e82b68ddd7445a2e00,263010591bc7c5ee0aca626400674ff71a162082e5291fec9f096457eb18f31e71448323e510867ab8e0036d5872765ecfe9fd52410aa98da74aca558b63f06d01,1b4ac62f433ea743538b5d05d0d59dbe32555d748fbea0fce4c99aadd0417075240d99fc7d35a57f9263eadfeec8a8f02d9294ba926deaed54fbee1f2637c6ee00,0928030ef407e27c5d312bcb736bdcbe104bd13f988cf36799724441ac83549d1d08411409163593018e0cef1be96f96d8453ab108aa1e1aa611ba09698c63ca01,485c16632440937a21d91291dbba03b8ac39d682830e04baa62f8fb6ad1ec68f313ba8d614f5e1f3671508b28ebc2067533818ce2d503a5f7ca22f63864b42af00,07a06f24d6a2444ec17f75b4fc6e3aff619c960b16dae548ddd349742e4dfcea1b28eb34fbf6d59ad7c1035a48ad5ffb3d036e5c38a03160dc000d807a71853900 +3b7bd9cb3774a2665b689d8178c4bdd17de4f0c3fc189758a6e23be64079a0c628077b169cb9200a267e48276da00ef4d61602f55762d2b74b83efb57af48c092a9002169aff1ef385fbc39b42747b544c241b7b0b0afaddd392d7e613c75981682ff236d01c6067617e8e26efbaba2151225383e914bd4c74c2da8717f48b7270bf7d39a7191aed95ca0935c23862f1a2,580b9d73ee5a88974771b1c1baccccab070a81b17eaed750fbba4a49fe08a8fd,e96420b3e1532a24a9a0a4a166e7f308b2755d6dc6da4130eead61b8c77526a00de02b9b4d7cf9c71fba0baf0050e1076f457cfe723b701959b763dfb532694701,2047ab46d3bd3d4042812f40c3504a12b3546af38679fe7c9faa27793f52ecc65fa22b8bb03dd878d9e357425d60e6d177bc61ec40574ffb3389aa6658c2e7a300,bf6d66f06c4094d9faac7e37925fa272cd9343e570fd4c750f02541ea0cdff401655096cba655365450abf5ac08c4710ca52b419dcaeb770c498fd2663a1ceac00,85e595c2d06f0bb456cc41c7457131ac101c51da9f1f3a906e622a70f073a01d7e1ccbd2792adacc6760a9558a47746913bfea66d711234ef7ff90a0564a2adf00,aed33b24445b98a5dd51e19d49f22d33a178c61ce0adfc6e4ae979a18cb816e25d4391a236b9845c4482a3ffeec445d0a4b663094965ea3f488ca5def27e07b800 +692025f4c235926a591c145cdfeb2b5e677d164740011ada11e736b29320632840ef7997e7c53446d74177a73038cc047a32e40d12a30cb82e90af95a8174de05e3d2ab9e6e1d10376f5514d6114b46b7764815e2e4e70b18e9dd54fd64310080d90544a0d233d7c6cf3c6a196ebf28f6b9f25d459b391419388bb6cb1202b905721a6e593c5f14a5183941b4dffa1277f,cfd62e687e53ece64f1e69cdd1b61fc63a9e688e9f89bb74b3548552270fb543,4631a56dbcf4417a5215cf6294c647eb3801a0a3e9891168a9082bafc802ef1b315aae236d8a4c2fb2af9b4a8b97e0917be3a860ce2a7811ff8ec320c12ee9a801,aaba6d8c832677a681a5d56734770603afbc14c28c623defc5da0c3506a907672b51dca8a18280e15448f0b994a341cfd276e24c8b1611125a4963a33217de2400,46155ae8f83667e71469e4131a79a0160c16e080128aec723590bf1a5880561c0258b50aa3610a2ee265861eb5a54ce251a3433fe59d3367f114c0c920f9778001,10cf5e676f8dbede2c338cdc52db922c9312d1fa5f9766e13b338ab2042cecd91609e300f67aadda9ec3f7b098d1183579e860bed29a0eb717e6c10d0e246acb00,eef347b79dd0a231dee961b9cf0ac1ff5b8f8d5b2f92c6bdd4ff9b186f4bb7bc4c6f7af4c2b1a646363c5d81eff36f5f396411aef215fd7c870210542b3c8eff01 +03dbe8ebd6e0641966b8178d63203dee2ab665ade465d0990204027b79a19144006ce741dd3a2a56a63aa0787c1eba076fef9e089970c50383f933c7c3feb9e6eb15bd982daa71c22b0d885cfe0efbf54f0b69ba05a18701e8e81795a2f22dbcef476f0e3ab878a0b151516901a2bdbe84f5b3ed9cfc9e9896204e92c2a208e52723a8229c3cd6eb15b6cc954eb123cd08,07a1b582231872997fc10e50e6274c41d674fadb834567b214fbb7bcb215e680,dbd7320aab625cf9643b21cbc2eb830db428d14cf77b106ee2e3b103f751726217e9acaadf9bc467d2f7b26e41a65247784160be0d401fb107624f3dd6db947801,bee252afd2201ebc95ced1a7d5aefb867c3b7d0fa6dff70da1096fda8f25031d15a3b3098deab306ae555e4f7743dbf532e6da63523fd1c36b628bc78b08166200,da4def3919159e10eb7d0249e0ca98dd8300561c181ea3b16f60d55a9ec079b01d81a2b1d25de524cffb68d90c7049e7d9c636436c0791d2b55ae673ef83ea5b01,ed3d4cf5ba5791a0d804638b263698d6d6fa668640249a2f6681e3482c5c27217ab209ab0d8ced9886e26bc996d0c5a9b6a91af8f9dbac93a3628fd2056f113501,db51cb73465153ff660bb2156c0ff3216adca21bdf242d0c358e9e5403b4fc5b4948c7ffe40988ca03f39eaa06338a1332bc287b538b7bade09ee856174da4a000 +24c443b981bc54154b75be97ab91fbb143b6cc3d2d1cb9f9ab0956e52faa179b1fe0618d7d079c10deeea99fb991ab774f4496b83bd3fd1d468029788ad2019dd14a90f31f851b2254f3fd4791999108e06e21269250c9ce0779ff53b66476760bd4fbba52791ae20227496d4910083e722030a93e0530fd7d94c29a62a40b0fcf06db75d8b3f700d15ea723fe704f611a,c2778401574893c8370c0e2240370a1593a38f90f9fdfbe3e201adcfdd6cc8be,2dbf230993ab5bdf8f390ac2519ab8ab1187401effae8a1453e5864a7c4559944f4901bda0bbcc305d3770a4304545527f062c7be089165ec7b6fa27f516515301,5b71f834ffd4b84ef0da8c58dc8d56432f97faf2b7db9115215f2f4c8419e24632273292bf5cfc71e7c205dd899081f9876dc396909658eca90671ed1bc2845a01,17af1cb5e0a18ecdfbc5c9fba16ae25707337ce8e11449531be1c9a550b635675c3226a3d2723e2c248908ed03fbcf01c37f1cd413ab7120c53decd935721b6d01,56d6b0268a48bf8e851501e099b351ff7a985b76b555ff4b3c38ae5343ea2ac337391a94a495501afa20078558854b22dccf6ce2f10194abc7417a825b2523ee01,89621925e07f7a57af63cc82b8838e822281190050ea85686bd7992ffe3fee447767f999ce0d3c938ad4379ec48c1882de9b73423774db8f26cddda4ab68978c01 +503499c834afa4c161cba4725a3a4c36f1dd4ef429fb18c27b8a65dd8aac7201fed2beb7aa59f3d511df3bbf27bd5ca30bb44d0ab965d7ad7d68c49fc3dd1063a9e41d228ff78dd83102adad5d818eab210e348d29f96d40ea0dca997edef0173895a510da007d0aaf53c8f60a591de6b91314471011d6e809543ec56b88f58b280d80a39380ee8ceab4bc808643062ae7,f865cd4c6ff1e7f875e10b4f80bac97b3c1475479b5332dcca9cb2c9249f42fb,73556f5ef6e8c3dec7c2cc9841c6dbab9beb62387f07e251ea0b77a8062bfa06005f6ca157686f00e6052f7a8c89253dcac150a7f835c26946a4fb7e4c4ede7000,c152ada40d19a3a2bba91c27b38c01f3bc005a9fdd052a14763da547381ba5484b2c91e9d715b8fc824e76c85e615487c007986dcf1675664ce19f23ba2b3c7100,c9e20366ab0b269daad96f4ef88c291fc6fc8ea6c02be29b0b6ccfab24c1090d6ef57f8fda3e7b5070d46eedfb4347d09dd3252a3fc0f79b45302824c98c33e701,b57295eb6445e89969ee6a585b9eb6044f4c382125d02a83addfb341c620665705bbe73380db55c7307830389cf8f7d9116ee6f1ce4594b91a6ca6605dc0c77801,2657344184dd205ed58635f26e668a234c515f847d48781f6cde3758c68ee4c955db903274318951880bcca78f2747f016575a49b29cee5b8cc6aa16049491ab00 +946472b40974fce597220d1059f8f9b4042ddcf51e82986ab11378e9d6da786dbc749847ab3104108c46fb5258314415744fcd717409027715183fbdb96d315a24f8d6ea391aaf5c49378f3eb9ee0630c8ebb48de4d535f7c6d14b4b15b3887a2a2c03e0dc0e49871884f015ab69e7a70ba302cbf05c67e43df5a5277f47045f4436e43844b8fb735763b0591eaa95fd5d,9028d24ac70bda5837398b1c304f436dab2bb91afee87a376ed95375e75297a4,862e1b112e65837fa5fddb68b3940a5d5c4fc8b61bce22ea48112cfab681dbd10bbbe7f56f962f4363b4735fe719c822c88c53723ec7ab340c611463f273185500,7f4652154e77b33cd691b9a29239f426005eb8c47c1f37bec0419be53a1a415a7851a70f2a7414e04d6ed311ac6c686dd2b16b7ea4fb20c7498bd6508f336c2a00,e488fbd9f462ce2894db9445211d7f5537323161700c124c38af226ee275c886316e30fd9514008eea6efe1b532f95b14de9f8923beb0ff0f3fc6720a20bd2ef01,ffb544a446ac7db84b47535cb18eae2b6ffd2f0937b7339b0426ef1f7245bb6f3ca314e0ee630e1f341b58ef052ad4a709154045f7842c95a3d463e10bbd7c8000,f58e46029ce390e92b1fdbf8547b3922726d1ee5106d8fea2b27e9ad75a025e760d38a14d07cf0f195b49a923cdd8ff23c265da1e91e2557fc05cb18d6b00d2a00 +5bf02cd4663db5fcbc32d88d22704c259675c90f5648a865db285e8575fee02d390b12a6c121e4264c0f4a395441c4a02e3bb7d8240bf2da4fa4a04af868fe615dd62349a06901f08f215febaf19dcd25afaf46172de1dc09d57f0fed817554b44321a747aa2a90e39d02c615f932256caf3fad068f52bd68ec2c1d7ba8ae0dee561725894df5d9e8a52bb10709ea05dbd,029e6f1948879326e1aa8131a84c35b61dccddd1ac364e014d3556d9060dedb8,49036b1bfb179d49b553db8deec7a7f73bcaf2080182648c7fb58a40f9790c267c38e9eae71938b9c19f928a3a0900019814ec79d3948846e695ab6d67dadb1c00,cab3674cadc4adc5a1a3786a05b6ca2519294e54b4b0e76a8900e4dfecc25bfa2ecc24a0281b1361c6279e73beae5ecdff7e8080a4759f16db88b63c13f5daff01,37745e731b86e1e5058dd563894bf85d111075d60bcb28283aba08d79af275f420af588d045f270b1aac849837947bbd2e801aba92bf6fd4d3449093f692aa3e00,f389cc5d1d651757cc793dce80c75120c76fc7b4b265de6bf4dcc5da4123ad172e9f8cb9c8ac6cd7c53ab4a347133790a2853ebca68aeed0caa0abf6ef6e5e6a01,ac979eedbd845838090f12f05a26dc8dd1e191a71ac7288c8829d1770dc3ee83312ba31eecd6a21582b06195de6de40db00ceaf1890fb9dedef8ccfb3b77776301 +30094b6d7a8365fbc7b3957993ea8fcde19f0de61f25ad9220cf52255acb9e82c74160a0bb7a8220d64b9fc1a4ddb6d5bc419922b2df5ac63c846b5f5807bcebe3cb87a9c90affbe869c79a17916dd125153613e2815b2a09819197324c57880fbc1f6bc42a3d4ae107219e76daffb77e2ebdf9acc8cb9e097f40a594a82b12999bd8c326904fe663d35aa6655edc7ac02,0d80bd9c3714091052432e9229194c136d0a013d1cf0968434d0de678b2fca53,e18d45c364642699165a83ccabf94126659aafc7d2c006af7dd52fcc161d2f3d6bde6e94283d1092ec38400fe2ac5b9afaf6406c0a04c6a3f1729e6045b8fb6b00,f0f21c08ac0147637d853fc671344220e3c970f8994b32a2ac842c458797f9ae005cbe418675b8516c87f09ff1874d3bd77013d24d08e4ce95f805ba98cc0a4e00,32fa4435114c077f9e40c56e619c7b13b13cfcfe4fd87f3d86fc8b96f4ad002c016e49573c0517a968e6b07b2522e086995c7f1c09d0e807455b98deaa8cb13a00,3ccffda51a294ccd428e31a44c72ce51e2cdc81a1406c687bc144259e721fe7f5b5ca74e666f8f13d4057ed10d162b39a5253b27ee7a22757353a6c764c8a35d01,f08f361e81c167b8681ff473b7c5a4e17c63191c3ff998ada69c0582f620ad2b058ae5284ef1e406143b0cd3ba14d2472d4886d218bcea378d92d80db484110000 +918b8ff4400116a10f2f5d48deb3528f483c538697cf5af2942e4a2d193b0102a1cc88091f3d66b55c5667dfa286074ce4a58781cc334de5d071414edd053a1922ae24c4ebd0a82dbb1a4ad28f6f152304a936d64db0ce5146f915a7f00d2d24589e0c449add7e1ad76ee65a00a56f2e7d1062b29fc1296460a2bcef90b8a8099201eece31ea5fba0b4a32c618f8c19ede,1ab8c667fa4b75bb767de0efa370c1bd06f9ee50194cb2874b72e2ca683bd025,5c6bfbc13a9bd61fe2345d73e809a4be85343ba95a45d04c01b348ca18b06bce32b45986aa1bd4444f9997722ea9d66f6daba641892dea8f79a87e358d7f8eb501,036969d3a320e3285fdaecf371bc18f97dbeb0b008a4cbce449a10dda6f86a042dac9b39c8676807a3f46e7354549234fcdd1ab16dfd95f52932abe5dda6de9c00,dcc95f68aec6ffa323a60b4200c6581d742a9a2747793830ee50ccd8650ce29527017d879299737fc38f709e416748c46b584e689bf10d7f727651f6f0f1edaa01,636dadb08a03427321610866deffdce6259c8d066dedfe21bb28b0adad82563b30c79847ad7c6ffd4bf4377db773af727b299c8d191040c79ac3866ad9b1259701,982947c6a110a6a7128663f3d378425cb836574f0ca8ae25e852922660b461de35992bc76a6ce6bf1b08de4def008d674a67435b5c0cff118752a6a2bc8b41ce00 +882360377ccd34be4e931342b8502a3d8f4ee89b03fd487f956db8436e461cfc4d9ac259b2332dfe375340ce52fb827d77ecc2774c1cdbf49e4bd1d1824337c2c2e9b712ba8c172231eeeab527bedda850649e9e0513e9fb0fad8bdc8e4b94dbde0bfce492350015970940166ac8995f8a2f2389858c8bb4a567824932e36986a725a0a76500d03afc3b659dc5e94819d7b8,9f9a6b5c09e18d6f1bac52a083430028668582fb7c589278cc4941313ebb90d5,174df1b5a2ee69b9987b44880660ef3c63dfe5d17df9f069c0c47f866d052c382360ee86302f20ef0a3f787554940a8c06e4b9a94d479f9857509be8e351ccb000,7b2ad1f04328653852a8dafd2c682d3b5158fe9ddb07ad54e58e85bcf996d02403f532df1657df732f801bd3c59f7ad4b6f1bef4dc0263c8a7360e6d36075fb500,80b57d7b883b8925528f0d42f83a2ee4c66027a1c58aff7c7bb2daa080f89d6a30948cf6a79fae63e1e9449f37682af48f1795445796ec2526849d83df40496401,98f9235796b3c0f5cd17e18e72dda6b8935c44427547ada6c97ee73fe0861b4275d5bb10ea73b376d60769e0cf1b7ba7f37f302bbb7e3554bda3face85ad835500,29bcc2a2d614024f92f469a2ff284ef3479f53ad55710837c81969a111695aa469626c7e6463141ac0df27666a9c75b2a1149b2885f1c73b08727c7d0eee3c8b01 +9ad628d7f9088769a70a2b70600b896cb486ccd6abe4a25fe3eed1b502a1aefe6b6456400cd29df187037449ce88d2eb63d46fb0c73225632fbd9fe8ea4d2fba7c8a4863bd5da93055398a9476164f91ba5e2409176563c6069b28a215fd7bbaf33318d67cd2bc366cc54202fcfaff793c008e1621488f893c9e61c8dd823e9dde755cda865f9be7ba33ff8c0e94b3e66d99,da4412bb2c93d787b3cea681b7b47fdaf5b2bca541553c24985a3f12830306eb,7192df50fd9c08801ad2a4f22e2bf765c578059b77682ce1fa1f8e2c3bcb3b0301bafc4d6541dc3acc718b9545afbdae291503e02fce40b0a76946de24cc807600,62cc59c44f83169670e1f797230e8504755115a5b70220f3b85664ee4ab5c2172c6e0194da81bd9a5c9ac00561500405bc81c5cd00624f06f3aff2c40a37b81501,73a121c41fe09393530d480724cc9e0e7fa5ab66e5fc0930d8252f2900a37343436c6c72920f8af9cf81368b1a013bca3e4f02b4efa0e4d191ef1b3865d48e7600,a1ac81c30eecf7fd665b17ebaf6575da69b1808a84ad48c43cc5a005d622c9b67de22d6c660beb4b6ce8133654bc5df9b076dedfeb1d92ba18981b290ac41c4f01,68b8377d6ba3bb8f3c39e4f32a6b582553d5bf5805b4f561c34c0cab329b78575f94017098385ac4cb96aa0b17d41f1cf5cdb113186b5ada30cd9d15a786033101 +ec6c89efc2b4e8e56ca61a497591f20db24e4165be2d2c6a4c3cfaeb082a53ceb65269b992be4f18fafa9a8e957a52b04a7237f7ba13921faaf907de7a5422e9877a168a4a50146db7fd8e3a411d9c08ced3aa993d92ade4cfd96dd6f5b59287ba19f93a3b5a9aae76dfe74ff11c438801abb5f83d81890f6edbd9cadf9be91c4419ccb07ee8255e768b132d68e6a33f07c3,f9ca8624484be420e1b82bbe2fc6e9c1a206ca84a617566e9ed069dd3884d523,01f3e1cc68e8c0749baba8d7ce17e13686f7b2441a674f618cb4f223ed7d50fa20917e27e833c9b0858fa46f93e95f68ce40329d1cd77bb9899e0480e9eabcfa00,c184f4d24128e7fd63a624978a273a48ee36218e73991095f29a74cad975370c7c4c6677a1cfdd899b692d544f69c0d8178b6b892b6d024b696a72a7874fe4af01,37f2bad305048798dcca03ae3f0e94fc26965efefb0ae1de6e0c35d69bfc5fb066ee1c2d720547e303c1c6f38e91b5045bd3f79d6ac8a26bb4dfb075797001ef01,5d11f0e301b480a48b64347cb8d121409d266fd866285359241a97122d13c7851207cf4635e4dc57541a1189bda58adeab3fa17dbfe2e799eb73a099e400c99f00,77429ff2918dc33fda95fabe4a909ed0ff5e7022367af011fd355a8ec718ac1e691dc5d85d9f3f54a15d5a70e6fad884cbc50acac0a6717e3a5e0cc9d664937100 +4e7e000b3515822556a2cccb75816674cd62d02c52fd3d673f57b4db2b82bc5ead10eff6fa3e214fbadc2d7c742eac8f671d3341b621120aa8eda004a23044f8cfe5641ddac79623247ca63ec2475371ef4398e9149e34ace51a16f4dc90cfd28578aa45366784f1ac706ba0a8bc3315391a105952f0aba36edf8edadd90125c8bf8b27fc0db1433e983798642f8244fe72f,6d5b5738b9efc90800654890f0fa1ea97f3a75964a278b1db75514826c60cb30,ad9b456dda20c423a111bc82648f08a9001124d2e0a67a079cf65a061cded7e6394d0ae9382398939efecb906e423faee9f3c68f90a08e0291bfad915df6715e01,e05ecd9f4d7a4cbe8d8a15240453a58f324a91826a6c824e6ea07eb753bb34942106b1fd266171e9a992643fc4e6fbc5f35e3007cc0f7af9952b0fb0ed45ad6300,6ba80d68c60e55cf5383888664fcbaf2698a35100c29763b8db251ba7ef2c8604f13d3e8e2faf435e4a96f3b7ffdfb5ab3a3a5e96bb5e5f8cbcdcce752ec2e4f00,299500aac8c5a967954cb20aec730d68fae3c70c5088700498137e8ec55e2aa97635e52d349f7c5422048c09c4ca6ac9e47c6e17ac748de19478284a3490916500,31112149efa20151871b84f21e52a05fe7d09e9b4786b0508b2b6c6eb5bc6e736a36deaaa3c9166fdf409c087e6dac515631ee763b4d5a8d849afba205d3661201 +bfa5581481f541653f480c9d0cf3ea96db0fcf1835ba236c9fb17b1dd52eb7665702f496c014534ccf93c69574c64ec1e9af3d78fcc0577731bf80b392a31609214827884f0040c97bf0cef30cac7b48584aec4bfc24207ae90d4fdb4c5279a833c0740bf68459d0913253ca897ff6c7c003c1898c414fe18b5ad71795dc0434a38e67bc5ea592ba849950f1e812a600c439,495d412344fd4106ad77d268893ce8f1db72b1fe7172198dd8ea0b3ab03bbf84,be82e733422aa042b0de9f6fe41986a103f682934b3b236ecbaff852e610f0154edcddf1134292e099dfff2a439ab546ce366fe4306145f68a8a4e88c12f964300,35ec5fc578f4b579fc9fafe81ce39d0d24ad4c0e300581db6bc61ecf63313b240647df009cd5a883c7c6d929558cda55b310e4d5fa5fbb274360dd7f005dd90f00,ff5f7c722c1959ed47a81e75896ff5ff151f78533a63b1f986d5ab40036941f73ba52ca1320b9904da89de7700c47508fef7d48e0d639d1863b3bc05d360d81101,8a84140e713803387fca54cf75f4bfabec1c04219d3bd14e5bdb78a5953197d275b11e9d6d242ff84885ed475cae0192a794e1a35c7fd866a217452b81f5d81201,1c07f86631faccd8bef94351b72db3e36cf090bbbea1328f4bb89fef797085fa15be7b88e7e15e9a27f587b7efec756983e2c3b45b7f8591dfef80117364a0f201 +0417ca1fdfb4272f08a0f5271293686ecb89c67a804027b4bb2d34e0a523bfc8209c4a56337a44236c19970c1534c511f7c5af22a111ca7205a7caf75030479cdbce7e2a661565b8d1f19ca934a847cb93ad51261eb7a1488564f054c401d63af7740dd7c34a0a77460e96eb98d5aca2ead50a05d47992795a91fa5015e4b68a045cfd5a03a0864073f8de040d857de5f572,e7da8ca4963d466f03192123ca6652bbebdb97c7b85b15490d8692c8d5386b02,00c056ee587448fd3a0a199ef076eca20676b96d84c50a67214438e807ae326744ee95ecbbe760108e3f19d7d388b5d7c8c7089b515e8aa9292070f3b6eb75c601,92dc141b358cacedb31735440f290f12baa4831401e8a5a252b853d02137d9ab5d54425363abd9c53a5efa9f9e25a6dc35d161a80c4413b2e976b830490f67cc01,08d7f8473203eb3c60284b403e8844deecdfaf7c465c20a8c62653a52f8cb63f2c10e791b58a320f5dc3cb6ac5445d635836c9db10e6d2f6be65978f14cfac7101,30055bed293be47a135dfe097e1266296ab090c363a7cdb5118e5048aae4f983402fcb58c12dfb83fa6a98d881a7e8786cadc7eb18d0c41658f657c1caa3673b01,50692f285269d88fc2d6b20a0d9377bd3e1e27c3096a3de4c6d746f86f920d85558c9d3e2aa716852105c4aecc904a03e0c8e2e3c33c5cd51edd3f08b3c13cc500 +db467658f92e6826c84482fe7f9352fec642ec90ba04e697aa826e231efe2a71973b3966f675293df561964ab6ea5ed126e8430a1332279a5a3f7c92166797b0993565bf912e8d2e9282ff50fca79307c28fb92ef36c240e67c2a9e58edbe8d47f9681afc5ce677de58e9f2c4315d8b995f667923814d5974bbc74cdcfc7b8edb9d8dd34bd9eefe4787535ee273fc8b28780,aca3e2f9e9af7e0554335cbdf7e36dd618847eed115cab762bfe3cc44f8e9c72,7d674e8ebf728f8a939055677df9a7d8bb10a5f6689cd20b0fa11da2af4052e71be69f717251933c30c1f249baae529cf29417ce06abf541f633c9285ecedf9400,831141c3a83990f7fa12bfd71b3b982e80614ed670a288541baf3202fc10c79f0b1a17c4851b72c5064d0f3376956b035ed1a5004be545a711796b70d6d1c5d401,bec88388583ab77d27bd6f23bc4584b85c5d867fd20fa5621f96872e7ab1f02d1795511d2d647b186d9a31c802333c3a97f729a499494aa723182f20390c708700,b8b993b27d216df1d77852a5454e11ff265d363d91d4a050b0edc9642fa3f7e45f8ccda15067837f5ac10f42d945cd235171c470548333cca2dd7673dbc0532000,1175e4d1ec1ebb0f891bd304abb130cd8aa4ad7b51e51eaf116762673a48aba57722d6b881c45af32e1d613e3265bf05cb52dabdba1a70ed2993c9978bce5e7600 +f51509aff10427cc1b422db6f6dbdfed50214f5be8410010e2beefad36f871e8d1b9ec03a75bfe095e57a011eeecc7cbd4cc7e7ba5636672096a78fdde3e21a13ee58d420ae20d108e7241f34f1e220dec8fb7486827b1f979e8d2e47bdf9dc7e6db263464c5cbb06211d898973b245d3f82d4de5095bca6cf42a090855e5bc9cf89254ac6d9a066a383d20200246d8803da,d4450a8f6ae811a9013b686ba254608b7357b098b018dee7c00681c0325286a9,690b4a048d280bf7d65341636eeba52da18b8298b2f9a5800a7d73ef397928d54a991d0c33217986409e5a28e7b53a6d8ad3343cd7aaca5e351d97f8382f5d1400,ae82052dbeea5f50fd61dfd3decd68bd6c2bb201e2880c3ad2a256b7d844a7cc3d29fa86c768baa3e2d4302f228f67c07faf372206b0dee6a9597970d474516001,f796eafb46a62caa2f91dd35e6f68ea3db05e775f2f7d1e86032dd13c981fd555c00fe8c0764a06045b747bd300e757768b9a9526524bae78fdd9205324f2a6000,bf7d5e1c1ec4cc7e500e5f21b0ab0bc00841efebf3977c3daa7d5d4750ec108167ffb8ac5dfb0b4f769935275ae1bb8c85b93e3eaeb04d7afcbf018a835a395500,33b0e731885859a749f8cc38c94af5692c143fc3efd16b4f7130b58eec3bbfe674ae073908f9795d08dc52a6fc9840f0b7993bf25b56936251761912785069ab01 +6997fd5ff69fd218a099d4fd884b6ca8eccdcc83a42701b98d7dc44c723d603617d4e6dc8781d8e1e1c88fe093fe111a8668f1ef044ef7fa92a25a29d0335982e18d072496828637d47415d464330c4e87edaa799bc009b1b2511aeb855701fc8bfc2fe9287085df03d36bf304750ed9862bdc3699d895b6e4637aa9572f065376c6cb1a27ea14a4cba8d367eae2deb26319,3b4a56a9676d26cee3265fe30522faa45e8ea0e350dc41585259782b0d00ddb1,2329864354ebb72b5c83703cd6efbf32f9fb15771ad4997899b14bc2c43f9e8e71c9a3197238154f670aeddea2dd327f5719276ccd6c8ebe8f27f2c500db75dc00,f0bd4adf2863089c21739a1e7d006792b32c23f42f28127a438daf2d0fcd514414941d35a8f4f53b7f95d36eb0f7e0b6c5fb273c18cdd7753501be92fae5610600,d0ceba9549757f4b0fdaef5a2271da48cafeae1a3353d9826d1088c35f87874e0d736585b70f7d0fd41b6a75d649f99c56c1781cc681d55b9052b66d449024fb01,c48be44eb3accbc2ba388f46df1ac5fe547544252a6d2a80df1d4ed988363c3745c6a12ef15818919bf797ff0a03881b6125646f91120f63db14cf19a87b5ee201,915b66165bd0f8bb0d48e7eaa475c7aa14609cf151684d6d3a8f0b2790101fac44f86769986c79e86bb2b60ba77461d213a3fed5b0e3d0af0e954f4ce9fdfc3700 +a74c4a09e1e032f64b925cdad3c2cfeb1e089cbebddb26bf1840bd3ad5b42011e72261a1f6259c48559de351e8fa1e8c3c18f63c5bc47d1192186d571b05e2711b50309042d256a9ded87c40c01f4313df6269979e9d30a99e1a60738c945310b51902c5112a1cfec3a8b835d1d636fbce45cc86e787c6d067840c7f75f6b60e7802ed35b1260ec984260818832cc7b366c9,025f0b22893cabe373090d1ccc755a945b83693dfb45c21f73516bd86872c823,96e26dee97f4865ab56bbbf5bffd9b4acf62152477c4adc4cd5f9ba7b547fdca4c52976c5aa448c38a6d027a8e3029d24ff96d8bbe6b7c7e97b87b37d4ec89fb01,dc91dd5ca2767be989bbe43d4064f4dc3defc276b49c29eb0f8156052e3e383b2b9c9e48687b3603ddba604679da47b5bac0c692a69040485a45cd5d2b6eb78d00,0047ea884232ffb6ae3107b6b0cc936105e1a7468ec2ce3dd600c1aeae76654f56990acdbdbd30928e4bf35f43c7666537972d76f3e50a849cfbaab15b34d2ee00,996af8f434f61162af1183fbd4f9d70937b46dac3f87a00dcbeff1e13e4bbf093c243549c56e9a4f53e64a040afeb28ca1df75ba7c1a14dde2cbdc0956865d1400,05769d71c3daef15d0b86a47d9e4e1010cb39779455e390959f1015006dc341516453ad29b8f146745e2708d098db45b0c8028a632db85e01faffe478f6487de00 +b4a582c6ea02b7f0b1c71dfbf727fb5d75f7c901f7e0d70b9047279170dcda3a69957324e2bc31bd0c94ec975f8e29655e79fb581404dfa5d7c23ad40bbf9383783ab92c1f7dd95c73f9c192ce9f9eef81d89bc0af1f54817c7fa1001fa8400f79262816350e31a8a3c1d9b742ebc8afebb2a009b3c5cdf78b5a8e8a179519f1fdc665c3179ef2d75ec849e70a3d271bd382d3,4057159fde30731de0e16d45fa8ac6525ff2964bdd5bc0115ca0707ce570d492,f31cd30ca137229044ac72aaf255a41d0a3b79bba0686a20d6435a17c01a2e535f082be8ccddb5f806865407b9a9b22db4dfd8b04f3dead627534b1973b7024c00,98653a852843659a70f719cbc0b54955f208e22ed4fa4699be882d57deadae6d56813354992f6055352b7e79caedcb95e9a47c9513c2715411f0bf7984dffc4a00,c56e5ff1e60acabbcdb5542a414971d11fa998143506e651cc3450f5711b9e627ed2adfbad4e88cdf4c1f1dcf4e6524b336f074d56c3d88cf86398ed1869ff7400,1602c7465b1499e6a715387cc00684509160cf827d702b7b4f4db1e4f3068017382b7f513272a031c660fbac8b486540080af129efa64232e4d117121b57b4f801,c069865975f7d82916505592899526ac5dbece582f937208615b3cdef9395e080c17d761401947c7a8fdd89ae12801f8c5514c9b641962a6086c3e02c4dd0d6900 +70e43349768de976f9cacfe0321bb80bdf7744ea5e89ca929eba6b96dbbb5b427b87d89568e6ec9752cfd2519d3523570d2fa133f6953331a40834178a9e73b011ddf0e8de7c51b49e0800d06496ca5dab826a528672a2c4ab9f8e5b0f85b8cca18ed2d323fc5f0adb6e5cbcaf51cd827724d51b8cbe5eacf1241d83a8ca5dc3a8daf62f501da165b7420a3146d59f90fd9d17,9dc4a9754aad761e94220b959eb95fb7efb3b4c62de715e99962dab9973e3849,569235cd5a9a327544763cfa33adc7e1ce5690880d250aa6b4e658e06a46aa7c6ce9ab21af874eef56d858cf29f40adf392407af01bd4ff604bf42e39dc146b300,60ee739eaab37db3c7565a1224a8091fb854eb26c27fef5f6ec3e27218aa3e3712640edd7a27c8a8a9561a4f5c3e48e6056f2b5f4ca3fd3f59eaa632bde98fb300,5b8a9f31d5327c871145dd74e6730f63b692cf85a12b20b6169f330b605d4460745bae22163db3dd40ad2f0e558d53e62da2bd200ab95eb68643a87411515f4400,c6a32059a7d907b6d5c1691d7b20d5d6077432e422c241dc758f776f0e023e913918683fc903d3f059cb19e870647c7e2b17ad4871995789c87fdf866d75c26201,c659a7ce18662324843e4099579572ed76c5322083348012e5e775932ff272dc466113d0ec5aa8ee99d739e43cf4cd4c7f4df8e9451166196c4cc0651c7218e500 +98674791c3c17ca3f837f1981017a1cca51160687c6d51afbc8a0a1d8abdfe83c021fd078e0e5d250ff27b6a821a404d69db521801f311ab3157c1680ad9746e795486b3b2e2df7c271b31779837dc6d0214c50b6d2ebc0a73543b8c41bc17c6613847a089807bab0aef258d1a93ddbeced70e0d308aac35fdb964912a5002b4ac36899c1c10c8908839928b314d41568c9401,03c9944d55be051fced7ec0325dd6555a41dd0362b86a0551c59d7843a344ae9,8ae30bf5b43b7c79e4ecbfdefa2d79635ac87bb310b8d2e8399cadff693bf1341b8d9dc73c898459794b4992e617ebcff990f0319122b8e2200d853373de9ab900,577dc1252931cec674638072f2ab4996cbbecd94df9ed31c93b7549166d4d82d7b37a83fce0c1d577fda64fbe116cc4d4e8a553e326828d6aacf6fcd415ed66c00,ef7e4b629743e80af69918c1989afa0d7f8a7c5452ccd8fc594ed6ea317e8c24134a6c3e7aba2d84e62c3c80859828dcc736c3717d12e9f77701c91473fffb7200,2b22028015c6e9f4ec2554f1e6230aa214e559c507cfe736b9ab6044e9992bb86a676c9094443d251817e0fa4e87ffe1e9921f3c2e97b8d73c1bd79e1c71364b00,15f1d2cecfc0727644167f1bc3c455c4fdbe02a9dcfe3a827e675263907b6b392133b9e44cd6bd9b87fe0b35899797118f9e2417286a337e61bc6b633642131600 +299340db3aa34d996a086c52de7d0e60b9858ad78a92e01510089117cb1606f22bb7a6e1ea8276f5a816b3e0c6f582e769c837c732f47ca4956f463fe74d35bffdfd5e9c8a7fd90309257570d29e434e86fe26fa80e2ab10d4d9d8bea9eced182c2a3b36580d0894359673acee87c623d6e8884a9be8ccacdc9dc8b91539f9a90f5b36e5a1752e0c5e831e0af0e71727af0633,f9637100aba5321ad2dfeef58b62555e46f4782dbaf0afdc063d004228fbbb5c,dae1423e6cac0bc57dad4168e2e4dd788c7c3945a52e7e125cc22e032b58df97781f9340377121dbddf3336cc0cd571a9a87039de7b60c80f156805385e7929700,6eff307970a852343ee1c6855f734c4eb00633946572878d5b5ef9db10fcdb6e2bb44a6dfcf501c66fdb9adc079c5c1c13f5e187cd06c0fbc903cf944943ba7b00,c5d1d2c007890c080f9bd19dc730d115b3034b4c98842ec23a63a69a0fd0864379cc8d2b091769b333545c659dd3847f5371f7681ac9d64317b3da7b311280ec00,271b3b944bb5a73c9e71a4fdcc9254b8eac1a94c866fd93222e39bbb1d130324645757112fdaf2a7cac114b1fa4b3bd189a771ec1484517a181c27b72af70bd201,23338d87e0addb4d9277f3e0a1582197a4505e1269d168c2b50117b9764841eb6ad2bdd33c6777ef487cd71aecb12e5a1ab1fe0c634de6925b8e2abc226d99db01 +97616e2f8ec767880c397bf75169e6aa882240241253032383f880862ddda7fd48c08a26485afa3c7aee6aa829cb9d8951ce2f5c691481ed5fc1cb63e4646852cdf6b8c839594d39fdb1f5dcdefee383d5b293e74b4870d8b0aa27e336ef768160079256b374522a5d2d7b374c11119741b49c5fe12f0d10f5f2e1bad1db99bc5319b29a5e269e140fc044a240037dd3316216,75def2789ef2f11dd5f8607276fd1f4868f77920504504a8d389a9f30569dd4e,d3c324bd89c6158beff17dd7be9ae721752628e3af3721a1d46908686f68b52957eef583954743acb858b9772d29b50e9127893457eeb59a9a3c57ea3d347fcc00,64a14b744cf0c3285bae239cde411db96dc647f1e294095d61046c851cf28a257dd5a8b7e03625bf6c96224dafe0fc351a125ace7d570ce41ae32f09736d9d3701,4c08924d55501329e31df3cf872db6eb8dcda762a0159435d8f0e10139cf5bd0344985ea6b48a44737ae6b788d841c74884962fae19fe7e0897d17063106ce3c01,193a29cd94481c5cff57a3397c11e872612c11f36490b6d20ccf4e901762b406313148c08e333e1ef4f772b65cc36deb5c4219012567e67f902144a74cdd62aa00,5e9c734c91ab54f664369fef24a822019888de73d21704444be0bce97250e2d747a8cae63a5491ae49526815719ea530b6d9ccaa973d6a1d534ce9529585ca4200 +73233b7fb0de080fdaea6e9db114613b033c52e3500c2e22e2aeab36cfc1ea4db7b38d8aa0a079d964544d3df34799b4cf635596fe34b416b6f7dbce2c7cb90a266f4d9d6cc0891f761ddfb4092dc9ced17a8a215068d483b8a393e551eb5652b353f84c852436dae66ca4f667b0eaa33091fbb83a36e91c46a64969752576c1181e7f08dd630c18820958401c7520ac3c30af,2d0f5389d2ebffd58df64029d9c2b22f76fb6718af0200659ea80d8b34d3c086,997c9d59f019b95f787a7d2898091b517f6a277e578e09ed4614ec321952cf5304737280a7a92a6b41d1af92bddef22a54c0327e26d2da5a24827ee6036f1e8400,9294c6c1e59cb30d311d8312c47fccc3709e294bcd633e8fe6ec137d2a260914653259014d86d8b97b40f612a2bc41deac5915c74933ce2d647bcfb2167b56d701,13ece424485960e4848e2af285d50551cdbc13a3df7fdaa0cb3316a30811bc74469e760cfaafae9bc0aae81a6bb536a88826f24deb61ffdfa66da2d01d5c6d1000,2932298c5a3af3068e9ffecf244a3f559b3a6818f1b9bbf7b38a286c267eda414e41c4a5626de5a5a2369d00518a5d2ded85c5c4a78e90af1ac3e56727911f2b00,dced00287b4d11d69a0f097c4121e04e0a724ed77c2f0fc770d80e2cedad8e2c5d1d77277166dfcb8643181c1ef94b42d5fa0b8931dc99f50bbfd9026676115401 +37eaaac4aebc8f085078cc91d1623e70d9d27a6a1168f1280cf10fef638a25207da2d555706998a6da842259e48027e8f4746ad1b42e26bfaee29060b33cb2de3d0400b6bc9d35b959003ac6e18fa5e6979e41c9fae6c69593f37142922450174288d1a05028fb2e3a11a7fff34e05618cf88f14cba71d3a7f96222ddd381be84f6c7dfb8d049edbfcb01f7548761c06f3564d,4f7e82a3523a109502862e1413b91c24535c992957802478da8e55f57abb3db0,7e5c33fca16b526ff6957866dbfea4225ecdfac15d3d121602f0fbfc41bc7c800345c4e3095690fff9d5ae9cb67705705704af1a6829b01f9275fbf25fb3f69f00,9d206f0689d841473b4b03ffa5e1321be861cf9f8f6366ec44cdd6b749b8af5b5c14fc8f15b9575ce9dc691f11c9dc5be02bfae40f09509ac20ac5bf8ce375e100,dd8d2e541285b1aa40f2c9007ab5d19051d61fcb38b8bacb32fc8ab70344c6386590b3c38cb903dc6f41847f1f41a021d9ce8bdfa89eb57ca6fdb0286570732800,ee12d87fe24c034b8a423dcd38aeb06b1316455049ef8e17d0943d538608ad2646cef22c352e274305316ccb862f086fa3a1c921464d7f9bed05655725d2ef6e01,be40eeb028ee27a38034323a35511cd3f94f244ff65a12a44021e9155c07e6050f2854c56d1628c0550ec4fb671d7e374d41174d55e753277a8c24e61ac04fed00 +80b4a2960a1fffffecb89c5ba9b20af44f925ac77a1be91a7343fb33ef44fe8792a1e7fd20e232a1d64b0e9eff81315e50368236e0092bb3cbe70d416d067107102b564c6c3a1d453447bb3125b8802bd7cc6c9b37334c3c96efdb3f937bfb775a43ad7e8469f7c69a904e6b8c478d0e4349f762018b18c8c6a24729884869c9fa2668a3cda4996d03902bedbd3fd4204daebf,fcd60b02492b965c922ff9322b76d52c8af7e34d2c20eedac62a5a8136acdbe8,4dcb53c1ecdf9767a9d24bb28a8d3b63a6d8047a75a1da884265dfed62072e5d569a3695179ba60a3b02594913d5918abd09f047f323ffaa70fae9b7168506a100,b7b07bcc74e6892113c0a2f4e74c699dd7f61b7554cd339068e010d4f6b65be517c117a65cfcdae24266c7c3925c7a7253032d78f31d8bf8f8252fe5b090d46a00,011f0301c9edeb8b7156105ec5da238391ca143500a94e5971ddcc422d8982b07c4c6fd1dd29a3ea51f18515e216a164ffa08243aaf7894acde850de6da9684301,9f0d63bfd8bb774f812fa71494e4eaaa929915a89dde0b948d0ce5c2fb1f4050237b32cc6f8ba47d3b01dce7a26740c0395e7dc1ea4e83765a8456f03d5b160201,6b8f6db2726a9e942031b21d5dd56a6fd86783dad416c4b9297e504630a540ea014fdb439c8b337feac65b41cf741a024e117401d7182155e0f02ae012b0ade701 +ad74b98badb127c52d925a04e5459b7e210986f3234be9379ee5d562bb4c4abb99b9af2df8955f1e61989b2ef1527c0436e7bf336ce6d2edb4d07909432ed5200e2aacada9516b0940757475cf4c4734d731993db1988a5268dc3e0c4ae31e06bf3e6cc4e810e264b1cc9cbee92aec4109baf211fb9886694027468eb36864cefcede59d1eba76e7e7b45de473cd014ce3808f,ef9cba5d49d2365536a7f3466469f10c47ea0dbd7c483400396e1ec3e6b42bad,2b0a57243996f591b4824ddb0abb55fd43506793410bfca7284624039276d047299b644f42103ee3bdfbfc7b8ddf7dbd09d885380cd44ed56358e4156738683e01,219dc2003f81cfef91ceaf8a87f2a3aed03bb5b17fe6105ada12c0b998937e1f3c86b0ff181daaf7c96b0ec4687ba58e1bf9e376e429c7b751512c50459988e800,abb6040a243c72b04626c13e6af1e73dd1943a09ed31d3047156e5ccc53c01e25c685cf3d036dc0c2856380ece3c113366e15c8cba6c1f912b8b8c514642f31a00,16944b5029ed42e375702d09801bb344865e8542079b02a9be140c7195bb98a879abc23cde461c2d751ba2cb0ae53aaa5ebdb536b2b34c60baa3bc5c85c76de000,61e35b3ed854c01a64a7c541c42c500acbf085b52860aeb6a2788c822022cade3a208f5b4066b9c38c250f96afada7549df546dc63fcdac1ade7655ba2a15feb00 +707511132e35cac93f6c3b8d1b2e1f64180734b4df0a8a14f5417e6300a3a33ab8e9af1b6657bbd932f6fe94349067abac2b9cf1b676d86840de25a2db66a6c90fcd0f55d0550486bab29b6f78f628ecf84af6575f9b204f7d7ef5b1f93949d0d5ac3309eeb3807653b6101d1e83c714b7058e06b813a29c92303ef41ccc00091165491bdc3dff8650c4c7361b45447cc504d5,c9596ce0041b91cc14162cf1a2b92fb961e89b2145a2ecb08fbb86b27d6bd6ff,c3ce17cec876f5801cc4041de043020088e71a0d42cf75e4b938ccca2fa1ab80569838582da24d7277875dc03138ce470f151337efc8718646dcc15627308f9001,f5c4c5d20ca7d42f0bb07e482b59453456dc982f037677578d208a6bdb45d64a30bbe6e9c3bd62b6078b6785937197d6ea2ad8b15df2d900b7808078f212296000,0b9437e6271a8d0affd4ccd0938357c29f1640bcbfd1dbfae3ce5be717200d2c0c12812b213c3de22bc46dcf6c2e35ae060aa85c6be606e984900255498a338400,b0d376bbabc0b9dbb75df6ad95a3fa9e08a33aca56710c3f5b61dc3be3f2ec5b51c04675aa60df96a03c064dff73e39ebf58a187a6e66c402260905d40cb114501,fc4ba08110125fc65135cd2a63961a920c47a6eaff7da8ef72cc88148883334e0f3b04e59e553af83e5f0a5b6cecc1f767f1e175137ff246a00c4beda165c57d00 +f48fcdaad29c0ccf4f28ef788e46b1405746d2a11bcff4cd54efd2b55c191b69b0ae2f773a1c994b8e0907fa36c89683a4480baa8d674dee865e2c82d03ddeac2b5e660a23ef5d07ef2fcac1bd944e71bd0bf20248d2fe83b470ee8bd956e77f8e81e8df58a27c4510f5114838f62e924cfd6083374ddab655483c8e3df97bf5070c787b6c53e5d613ed12ab1660906a82c5b62c,50ae3c77af6a4776ef8dda18e7fb7df9a8c58c67d1e5a180d90d1de33ca32bc6,afff4a3d719983ff461cf6e92c63625c4651af20e313691279c35cb3086727c02b6a769b963f669a69fe190b7f66ac028930b1a85f690e4d0f931ffd619ef2eb00,72d1d6b51c30cf7c83706faa932a4be8bceb092e30f64f69349529ed0b5e09d25a7de83ff7a88d2526ba09546661c538392fc8bb26db5c1b25626bdd330c02bf01,9300e073df08c9d5c98dd3e5549b515bbefd1bde3794d8485b34837adee83444736e0c7eec7079b8a0aa64d1d07a37d8ebdb03cc68d6e7c6964330878b42fcec00,d1335a10d23ff395bd74f234da4da781bd42d82862af3b778597bcc8f55659f212fcc281e0eb4106e2484432f8fa905349fd50da2dc129d34a100eb5c203290801,4c2718a307cf307c6b40e36e50f5ca3a46d59eea542d427871f18ac5cd2cf1304b15a86eaadee0258925332e945fa3dca0bcd2fc0a4ee833e63df376cc9ac64201 +423ccb73b5fb48f94d82affefa6d4619e996ed4b30a49578b7027c069d4870df9efaae6a1ca5e6c1b6dd992191a12da7d12903645cd4792534f241818d67cbba60d5012f10f238cf546d810307c75c9616f7a138134906616591d9fa831b832176441d416c1a1f8beef8c3bf15e1d9529e4641f12645dbd216e7cfc9f8b27436b89a2fb2bd02dd8e6fb8ad5c57ce187f4b813d85,6118ab3056b5a20b9fbce71427a113028f5c8eecea3415693b16fa2e7dca7377,325b69984b2ca4c00a47f86d2563e6602ba9f0dbbdba2c978f45d2a12942ffe31c827cf8a12bb5653caf8a74b50dfcadb4f7bb87128f8be32efc8740bdabf26f00,db849257ab11cec3c3dd6c99993461748b7fa488cc717185533c33e7c1d6e59e1e4f4dfebb08740c0f69e474e7a201a63ce7400275fdffbd458b01f867f8ca4101,e88e73dc0c9d6e607919a7484e845747369623de8954d7495306b5f15f5f764359ab994b240e15732136c6f9059fbb2020e1ce1d7cba57ec9cdfc3e70313631b00,d70cb0c80776699f1a12132dc409aab5d983812aecefb43afde5282c002d49631dd61b8da46575f9c38f125a2f2668341dde1f92a9ac02a9bae0e49493d633bb00,e014bf17c82ac3725b4645f68d5b8e5679af3486de0a1d90388cd5b1880973f9350bf4c5161259d14b15a51d013e422b2adc961cd5ee641f9749935339eb0beb00 +ec85ae8f4d64bb74db3155f139ec525504911dda2deed6487bc6f388dd3f5e8b2963c8de57442aa106580e690cfa8ca0b425c4c7e00987e51213c76de25ac49f1450f276ae1f70526e25edfb78bffd8bd6016222a7b82dace37b07b58d24f55c00803bd341a0ee0c3ae823c0b917f6e22a99591362ef7f488dc060e9b4d766d9327a1d1b2d4dbda4351092eef5a91d243d7368f2,2ce7ad38694bab358790942ad40c3a9e09d5d2b0e5414127aa8d121c8273fc9a,a2c01a4fc0d714d366715187c4228f2c8d4e46b9ebe3b7f5f5775b666743abe67f33e2fe16563d41ea47f0bb18c78df5c94601a509233c02c15505a7a2f0b77d01,d4cb244a73d04102d4ff3d0d11c63a588d65f9243787e2d4055fde5c56e01d877696c03157133686cd7b27aef04d251f7a879aa1b4a6ddae8a1ae3556496172900,fd1ed8099e846866ead4a5410689202c1fdc4b854b0146ea8832ca8083e942e11f61a91af65a5f77b8dd4a7db435a8b8fe45df89e25ba5550581836c0388bf1e00,c6e7ee70161a72801fb9f661ebf1e34b20a8fe91f0a6d51dfa2ac21ea514437727051b1a589ec0f0d5a6cd485ad543cc3905a500eb2014d7f8f5cbf44965e73201,71aa7eac6c6694ae30b8429a7983274c337680c51898353fc50fb105017a1fc5495e55197f0f13edc57f413f7a2bb4a1b814d312ad479d2c14d394bae91d186a01 +3f72ea6563bf168611a788a3bf65898ea4b8a737a4c599f9566c0736dee4e887710147db52893a2530fe87ca3bef5e199021a2c6ad88c66731177a546790765ce5bbe853503948096a06e87ab45ae19153b8edafad6e8aa6a005e6ad58177ac7346457dfe93b0216ff043df69e35245b67850f464bcc587b4e631b92cd96f5f5c4f0bffa5be20d24d1b4578e267e7bda8807ffca,fe6c24afee738f736bc2156526d2c100ef977bafd15a4603a00e0ab4ae3f2233,f7873e6ef1c7965665cd7586b6ae89786d7e9c920532a103313cadc69e7dfe134771974f8dfebb8f1b3be03532bce2adbd90cf61bf707a5699840729aa272eab00,321950624fdae4d12d4bfc5d7dc6e364222b1d4d9894bf62e420632e9d6e903d4ebfb99410a70d1aad601ddcd3fc4372f281472f50eced500d982a482a13b08700,d961d06f5853dd5cbe56b93619b262afcd94a42e83c380ecbc39c4140e81f37b76036b150d9bbea781290223a9d8f3f37b309dab772946d5179b92385bbdb59800,5997080128d69894c91ce76a98ab2f1a215fa1a7a8a27cc466ebc0fece93148716ca2dcc40c2fdb41091fa8040c8323f0e4ee9164a571778d36656bde69eeff100,00295772d483c0b1977060f9ab89bdb25b23cb709c7696aeaf214c6681c538dd2cc84742ea1e55497865d436139d4e0d2d4dacfd6a9c16367c239d4539b6839901 +eb3da2667606fa20454b95e2a3e1c3ddcbfa189e1b6ec79688fe3bf341fb1eca2c75d8167bc705ccf214d8fc48846397ce1833d888e143a62623004298a6d6f1241bd98409da8e6a0677423869e066e4d9ba7ecfd17ddfa587e55a11148892374a60b3a58729de8a833ac2e032c455861469b2c22fe2411cb2a8c0e4e86973c37b887bec46d1735fae692d0528473be0b48e865d,793f12c82f13d37db78a774e86017d1ad6b0f7658b45e2177641010b09c79b46,f53b6f519fb8922c3f62aae46da47634029b7a3a9bcb3b4df021d3356901cecf5388dd9c2c58837df11aeee30baff208ef821704fee542c54f12468ddd6209e501,544eca08239a99b0c9f550d27953da83e17effcb1db9a2c387f99426bc7eeff526b1f5250b62949cdef1a2a678dabb1f6890f32b22843134303d66c68fcc387801,e8a67c728d3ce3dd4a4813b889bbe4c6ef41ce6308bf797217a72b314b11af3b2c30c9413074f56376412143c046885f8ac2e11322b946f63131ba412ed9125a00,f932e9439a6e9a82b4bedcdb850217a847f725f3fd7013d7c1732d6b3a441d944a35d72d0a118d8cf9a669bf1d38f4c1bcff98294be150d038b8184c68d8bc9501,eebc996a14f60fda7615f97104f2a70cb72bce23a928a4058407179e33ef0df8557f1dfee539971659ba4d9abc427da3737c8b0342023c607f22790dab1a32fd00 +22a7d9f167060af56102f10b18cc41681e3b2a5ad9c5c1dbd0ebc1a833090e5cd3e4f5b53b90468e875cb81bb81fc3ba936a70f5dc1e651cd7c6c6cfc712870c0974e5e8144b737b938c679fea78de12d04476519bf70e995d95a6f08ebed85e75ab3e987638085aa6056d197b71188978c9f3867f75b88bafed2e92d952136004a59bae96156a81c669994084f28a6d585d9b04,9d21e032b80d0659ce58a73dc32ac21dd20374d71b4c870208f3a065f96ae428,3ef9f88837a13aec5a00c71aa1269530fbd1d91a764e52a57d59b2ba8e84733d1abf4abe65ea013009e7936172524cc766e8149e1771a411d594385de4179c0101,570908ce0ff58fb66811c2493d6509bc218b48d110d1567ebfd224b4517feac85172993d478b1053469bafdf9879d560a7a439ebbb4d84a84544ea04d3eeb20201,56de31afc8e2c85ef59957a9f376f60f7941464fccac3bb43e8f17c7ee742b5a24f1c129f818c9a88e87a2b10af2acfe320a823c104bd59249166c4c42904f7401,d6c697b88a8b83232150251c58f2aca1678222d8a8a0b8043d14c215398067e013c1f1aef382af9b41411b6bb9eb0d959481998f3cf4853780750d7d875f4abd01,001de949bd4dd0aae69102498b6c695e565855a9447cb28e6ede3d27e8f245362c9af2e0c7e248984deb1706989588c727ee97e6996b79b54dcbf84c8404e29600 +760e6e9bf4eb0c12ad8fde0fbd9e8c61635f61c519b6d8d1d300e2d55c98ed92c13897cee4bbdf2cb722c1ea37ae34941b9c7d9dd5a2445a28c9831a133c2a0aae5c7afa24ec862fcaef56cd937361e76d33f6cb81044468a48d341e0cd1024fa9848ce638f08de2a0e8f0e30ff17ee0a22b70e80b4e220cb29a1e6d61896ecd24940fc1f52d0f7c7f8df0e273462af49c0a6022,f2d80519fdefc5bae3e802b4f95787bf835266cba5598ee478f603fcc854c453,11a7c9756d62c3ca9ca17cc4a764714a76db1f6130837be84f501e5926263eda4d1ab3f1c3668cd4729bc4ca6d83a6d50849318155014a49122fa4741ed8e2b200,7adadd6ee9d647bf38cf130e379fed9aba144dab01ad10305bbc218e14db908f3265bea07835caefc9bcfbca48144c556bcb70ef711a5a98d92b16224a24ef6801,108faba6b0c3f91117354772ed40602509857f843204a167e1c76aa892dd08803481176a17a6afb1a67c02dae5491632d21320b12d454f1fc6062f9875b7e44401,d484f513912ec3b486f5dd2c028a5855df0b181c27fd03b7418518d28884e6926f8eecce7f2d38899fb27b7b801defd6281cd3e9206a80437636dfb573eb54da01,b5f64720d4377a983fdbb182964c830b5b20ee71fb5d992307c580e6ec0471b836286bc024b66003b8e5030c528a3d80af23cae5279da430435492222ec9b9d501 +32742ae70a69ec1f430fcd7ce995d161da897213252a6967afd273a318b11b8aca4e37f423169e539378f282804e353bc691efe01cc0046a83602ed26d7ee3b2faeef3537c66bae90bbdf10ab99382a385f6d9cd5ccd9d09b27a3d4e226aa809df850864193c88acfedb7676d94e9accb30a68d9869e14a3ef56c01f520f6aeeb06486f6d1c19a0439511a15e95413a219f0a2e0,6b678638b744cef1309787163c0536f3ee52773ef25444127183e5a9074714dd,560ca9c23094359c0c3a2536619bac368d9b07abf87aa567843e47bfa055d09c52560e96ad02e9a6a3c6d5a138d0f24306e416e7309760df3f6bf7ac3c013e5701,85fab75126bd2c2617d0c0b9da90e6980ffd23382e3856d669790bc0ab227d725e810a207d12657da939f98c9804e621aa71708f428aca632e07d0d7f60c9b1901,bfb384865593b4747a6bd74b6c2f2f79cf8786e26a43bead1baf80c12d179af776ecae141444b4a11d8fd6a3bd3d286933eb3b77aecf74d40eda66d9c0bfd29a01,a533be573144b47841e75f24bf1bb5d22068e0e3a891338823eada72b9a55d460885e5c6e35e5abe7acc17949eb94757f72b587660f67d4e89ab6ea3c84b7d9101,f7bd8be575730c358445ae62df25b78736d90e28a29e6071cf1f7fae5794ad056449fb22af990f1085413b19ae2403fc5950673e340ba79e23e080cd035cca8c00 +fee4e1735868976ce09e243dcb26e5dd64477b55bfa07d33b33507a047ab38caed0da778f751bdcdeef94472a62ac3e0999a8fca8055ca58cae711fe64bf03677c1271b770b516d2698ebce4e0dbd94659700d149d7e2441a3694064de4466cecf19bfa0111ac9a9b43e83a6438608be5f2f5b9152a6c3640d0cd19f6f9990290d1885959968ff513408a2e77bcf8f474d5af4dc,55de87d3c5fdef32b75cb04fcac9725e838d89bff00849b99ce52c89d1ef1ab9,6bc473bcd1046fb82c6704f8f6dbf8a533a78756205cc6a55c930cc6974da5673b648dbd91920a7b9be06fbcaf9fac47e77167fcda2f285a8c7a0262c2f9c5ca01,b43bf1a79e0a3eb3dab36aef22a56374dbb018b2f1d4495cda7ba8ce36a2bb900fd60458506ae9e26c7a97d2ca0c2958deb2e2f305d17dcc81cd82b6ce1a475900,68b02499f900998c1c7987443a983ae359519d46c2892ba802ed8b2a77ba3bf2516c7d262bb44bf7338b8cfbe209584a616759df67e592f4723dd0ed8a04c10600,4cbacd6b1aff6e26512796f9ebb0f92e8af6b79f18f36ace3c46e8824fb2ec923d3c626cde54a7a4f2e2d092b6846e94e7c7b86e9ad00cca94097e0a8439aa3301,76cd1b9795bf60c2929699634226691a7990235da4b2f92b5f9ec920f1e34ddd5b9eece300aa271d9d3764838f0a48d4effda3a5630ebbae8306f1b253624bb601 +0ce38e07d224e3744a18d825147ead72b7e5190500c146307db2416ddaf2d1a463c76b8e47c16bc9bf6a7659d9c560d23d4c60f8273a517d872a91038bc477f4027e3620d9b8b5550ed1aa54624be8ebcf61294e00483b3bacc797711324af3907610bdbf84dda5152af24b8d3b465e4177b30580ef84ff8330f3d0a75253133fa51cdb566d26fb2c0512197a8f1fd0434878aa6,3f2b6937025c5c6057d4eaea157e104e2fa056d38a37758534b163afa77cb9ae,89e2edf3e9c96582c1c80df1d5d1971ebf9f4843d445b6890df4864bb36deb0b59fa103a0695c7002e603cb020dea127f05d732c5c2cad034fed14cfd95a4fbe01,d6d04b9428e4cf2d4f2942890600c4e3e40a394aa02daeb743fbeaaad7b141641d9f5a081a1dbe3b455324490e0b411c20986ce7bec51e219adcd7e3bd7c19d501,d12ceebf215f930eae85a643de1c1100ddd6b784931fe755a842319d18cbda0773923c043c5162d75b222a403d96c5587219ee4d8f61de74880efb895dcc7a7f01,66b6fbf55da6448a53111b54ccb36969c1644e5cb9639af8652f9aaa4e2dc91c49189e45aadbf09c7a8ff95326143eae71c7f17288c61343dc5c2f175ca829e301,96ad5243739c0297d342babe09f680941e96cec996de0b916b13b6f0ea7ffa755265a235ebd86a53cae4e77a593c4035d97c5d3d5de29a67d4e8b41da579fd5201 +55841c16a13a1bfddaeb5b4a9e21fe8f7ec9624ad646fcc5a1607861303ea2b4ce73b22898e6d1463e9c35669452d62c90f321a9c5ddc0e1f83c8cea835bd707176652909d1cf00b6952c5657c81419056f21a7adfa64d0686ef8c6bb9375cc828862620bc11ac1d9d283af6ad4a94c96378eb0d0b9f951808e59f72ffc9e492885c5514cae3bc9ae5339f0e1ba4fffb836000e9e6,0bd56e023f8fd54b69b36af30a1a2a20c235bfca1c890c9b88be4073c910f931,4da1ffbfbe303b1ee5e98b67646e3cd842163a2b63b2b26b3fe25e20959b6f655edd1a55bc50580807cba8f17454f02770701c02a4f72b00085cd586411a080200,381dcbd59be84883be09fda0982b7360b426833b82c5b984eacc7f690c6c11551850384b773768b0f3933cbd39ed5d4840cfe98055edc6987998a4167ee50ea601,18c64a5057dc14b5453e5dfbb0e593e9c27f5980fc0bf971f5bd0c45a63c53343fbdaa5c6afc58861cf30ad37f299980eb1709e94aeb01acc961fc95bfccd4ea01,70c550bcd0e70d060c3e29ac87f6f8096ffb284e00a8a86e4f58ad63e11caa731c93b402a84d5a8f888d4daa667c75bafa756c6647a4e86016e0aafdb922ccb001,de79638e580a5a3d1061cf7e12cfa6de3590ba3c4d579cbeab8b395bc415f28d13703e1aa0fbf49470ba3e968ea46600df1f37b64c8d418df3490455d3b60f3501 +1f0edf76363c73d3445d9d55eb0b98e4247784c5087b255fee5bcc029a12b75bafb0178ca7ab4d6d2136c571f774aaf2ba24b6c8b6fe29d163581739e49a00202d95350fe7d1f0066b108d985e57bb66213197cb5efd0e14d7b6531c0cb714d76c9be16407a5d11d1be95dbb11c9dae1ccd59907555fe1cf050c0bc9149ee2aeedc81839884761a5798464db5bcd47a31b459dc837,f52c64cc408d55a7da706f2221c8ac396e4ca37a2065ea1e8f7c443b41de1fb1,7fb9697abeec52cfc1260cf0681ef196c36cd9e94eecf754771bb233850809673eb7f11c6f05c8ddba29ac69eed7da6a6ebd059327f7937e0426ca83aa872f7300,6c047424fa67b805d97e59b116ce79b4332cd0fdc936d12d7e30802ca5b395794681fc2cc5e5e89d0753ad0ca7838e056bc6c802da664ca49578886576f85b4401,b40fb09eb9b580d7df9cd8db65e732a292d517170f1a582ce0f7fa9b1a6f07df2770ffffe043d2fef308dcf4c383cff23ded79bc0444bf51266ab0dea022c04c00,80ba7b0641c68199db5b26b579618dabeb033594d9c81658b98ff29e102c1b785d5ec2b1ded1af39e0ae600664d22f96ab6aab38ca243763a89eb3825ab8610a00,bdbcc3c690defb9359622628106d0db3246010f0fb08c66f7530eed64d11b7353529c926c82ca54532de97f607aaab10c8e9d813204c7347a77940e0ebffda0101 +e7654a5bdb5cd5bc848a2c1f9fbe4c3e3b54ca82f1425741992d4751d340e6e24057ce14852e3342aba23cddaa92046fa6e8e9986c932e7307ccee724a1f5356ff8047ef36598d8a1ebade0507860bf704e0895aae108aa1631f0546c4f2b4d2c132ed32b86f2251855eb576f48c9947e1f88d419dc439ede501cb35a79aefa3f10287071a632de084ef0a66a0e1f77dd9e487c494,deacc371c6cac9c7f1f4cca743a0c78e6f43469752c73d1608c38504b6e84272,66368b6d28b5af1e4599e4878dd26febfb6e8514f97d29141e1ae905de21667c671e82f148751ece3c658b37f674e6305cce1422067653cfeb96606c61d3e25801,e08c89de2372970f029de538d908f2f8cdc987cfc7f19dc73380cc3128e4dc740df84b06f07502122f543e1399d082e8ba7220eb57e5e4ea791841971fdb7dda00,4a570c7d8d4f0d9dc2381c32a488ccfc628c8bba62a5eacf5653743df2b0445b7cff7b23ef5080121e76c6293c4c91ebd49d0b9274f09aa0bb7a1046d161af1900,0191e95a1e4c7f048e2968fccbd602cb86db63ac0256f59a11636ef43e6ef6d465ce0bddfe32cf4e477c29c7ad9cbcf126d691c7cc600a045116d9f0026e48a601,5082770585fa93c2455e1f981b29d170d014328c79ba95f0309fa8afe2cddb9754bbe2862934d51442a3dc53062bb69ac05fd54a9f7b1c5363a31c5f0d48cfc501 +677a1ccf3d4fa89ae23b6d7cd86d3b14893c186ff18bc9f5e696d5ad0ab0f1a6e49af221af3ee630f05ab93954d213c7ef08714448c9abc5f12a7044d353251c4e41d00a8c93b9912220d91b2c6082427702a4b8b5292245d44ce801fcb296b39ab1b5be6e6af9cdae8b27707703c6eb25c7b49b141a9fdb555662215c2c720f398310a91195e5b0e7b01ee5b18184e69db76dfac8,f720ee3db43e7aabcfae4d00d84ba6cbf9561c4a4132e2ec7e7efce380bd860e,bc16fc5baae33b246f6bd101bc29424ecdfda6435aca4b62b4ff92fa42cf334f4486e854caa57887e68637dbe5f3811681517d5916915735a94c27d6a9a0bf5001,dc2fb2254aa9a681c1751b2e358b67c6d0e9be47bf1e6acb5f630fc9d68c1cc20141465e436041dee676bca5295a0988a1f9ff830299841cb382e8d8a0e1915e01,ebb1b8ef10e628bc5b6a4b77517d9f1aac823aba4184d57e072c49867e3a1eb752c95e05a435911519180bb9642e46de728665268cbbe1e6af0bc4415859e00100,701d65d1d4ea8b37b684b14928e27741e7a4cf8dd7ca9cda959e4ca26dff6674241daa7844432ff4eabbae8eb349908f0bde97f6e180b8bdda7ea6bb68cf27e301,6cad099ac645e94baf1db4e0079a68991036e92d4462fe537d6588537642e1d7409ea8696bafb263686e054755a1bd5a5c41aac6b0fa27517c3d4d06df47b82b00 +70933986e9760c9ea3302d35edbea0271762af8fc8bfdc0159bfe912701883d121c0788d705f7b1b2f7dac855960458158303c4ffe9cd26c465a2a71f31173102d8afb40ea3962021f035cbb1ef14878da1900447037105a6e8ae72dc01a31c63f05816ef146fccd1f91447158eb026092abae9669dab85bf7493c848b4c771dab943b70678dfa6c4cc8c58d9ea40bcf05698dceab,833a3bd525d03295d7474cc6a6c4debd3c72acae3ed02041f513a78f171274e7,592bb21411142b89c379564960ca27b49c658ed8335b9056788dd270ca7dce6b56ad6265a099d05a2e682597ed50b680879495b54ded8169cffa6b560ec691cd00,108af768c3c43e3f94282e4b4157901340bb0abdcd7120fe9e9b161567276053122b68c8f9a4df47f5985856211717594c77b438550c7378722c6ee77727d24601,fa7d8ee29b1fe50a8ea936ce54bb2705f27699c8cc017e413a27c78d9f74d71d0d17e7ccaee5946bccb137a7ed6d475cfee5470c6fbc946a4ccc892aff67bca201,350994ffd6d7884304d715882073fd24f02116cb610401a66f0d746e16cd157215b12007d3a19aaa6630ea84bb12cb42348a13c886aa88ed02d12e48f0eb389501,0dbe6a9e649e2faacced102d7a8d0ff096d6999e5438689d39d749056a70056f2b66e0ca9a0faa5972e2468dd975b85a951e0e6c0273677a00430113ecbef8db00 +1499a893f091bbf6363672a298eacfd40b14afd634a08f5a9e28d9f4b675ddd029cfa91f60bad28a5b36f6bedd5a4755047a8bb6080478c7ab4a3503d2b95009d9249f4d4217ffe4898fcb80623f82d52e0d58ef9585eb84f68ad1ecaba229b0ef2b2a1d4065cae74c855f9902da3f307f1e1a86fceb83fcb88e3a0a979a976cf12b4d33f119a90587aaaa08df1dfcde277fcd4c62,4f8a8cfaf47bd17ee6139213cb99e7b79208e5694827d00271d61a3efce387bb,a47eeab2de884bd43e3cfadc6e0838f5d760783daa8923f9f3e95e30497a24ba65b310102e1d976b5792c65c13297654a4cc28c787fb67442b07e110ffa5fad200,0979f5aee7fe9d6b7a9e4e269477517d1559b5db918713661faaabbd6d963f2c1cc9f7d6a1508e0e824cd7ca5e479a768bc561349a93497ba6c569477d9e601601,028a346cf9e2ece6a289deff6817e6f2a8661b8bf2f75a02d1d326ddea0604512e55cf24a3e5b8405b66089c22a057a998439970a28df892e791b5149114d96500,b6a57bb4bfb8118c26b2352c72d899303b09eed1d74afaf39a7869909f157a0027b791690b678fe7201594e4b3fdd350611398a80ade193d2a62ae920f8a3c8d01,29c44f1f9b7a0267787053920fe9aab98c8ef337f4d37b195ce917c1ca9ade4b1773e00f2d58aac05722e45da936d1e58cd534765ba108e2cd809f657d64041d00 +eb87d766ba8d303c74d95974ea3eda44f41416db036d73aeaddfa6f9c716596ce0ea3bc530da6e8826c78dfc9a29aa9a5257aedb1f5c8bfd1cf55312087749bfb21ffa33b04bd3b16e976493bb606666b1095da6fa91e4fb6e479987c817a32cdfced432dfcdb485b245b38e930d545a210c88754781a196d470ca645226c397037be70b1562b3843ee0fa1b75f408cfd3839b1e7d,739721294c2dd3a71022818a7f399aa4e7aa8964c4ec0ddfa529c4bb46fd8902,ae7273679daf9ed3f6b278d9b39d36b6f6e6221919aeca035c6f8641b30d3db375255252344f121c310b969a3b2a8d31794cbf82328b3d444b0d4384e3782ac101,8c838dd2eacb4e8e0fb0b9dc6d43cb06b05bb6b600a3553140bd0aeec1fe38621d4c7f8ae079a22286776250f64cd1e5f103c2f23367464655bc0e5ee291e7f900,9ffeadbd0328bc90eec8b502253c1ab71fa36ab36fc2479c5aacbd3582dc2ef13f6f58fabc614c870cf7ea16db25b879fcecec6cfb5d4c8339b16d81567735bb00,85d7465329eef618059a339b666bf9a14d90a06cbc28b71fd8e7f945ac6c2b165072265aa5a29bc551c3d818012177d2201ca6786330624d3cd68f137b1efd5d01,30b496ff33daf429b8aedaf81651b645286c6dc3b3b1ffdc29dce0309420cd677e3d60854518cf04326346cd0926908c5aef7a5172f990aaf8006e4c94461fed01 +c299eb2366a5bbf72c19ad3e8adba7adda22fc0f465b186928e138db9397c2b309c76601d845b13ef80a48d11620a8acee05fac15435b05242fa5f2a9c84541332cbddf681cdfe636477cbd49e00373e7489655152fa238c8d7b1b483610552842cdeebbef82fc8958200efd5d33713e98f41e3afbff804a782d5ed2a3a76839e4244794b79f7df572ad0b91652063e2b4299aa47f,b616d2d610541ae165be87a12fc2eb23bdfe37cb801e1bd44a5cd56038d91c5e,2cb11351050f4f072622963b1c61e79132f7ed5d40499286d6233d0e34cc24c500346ff501ce24fba9093ab6fc56c51d58c742f26d614ad015521baf53bebf8c01,cd5df634987a88711f07bb8bffbd9546e609fb9488efc8badb1fb5c695f66bb10eaad679f069569d94b32453eb1f809e58074aef52d9cde13d8a9e24801c80fb00,18003943a74a2e67d6593de7f1c0f3e13d288e36dfa37ffcf0719dd96a1123b83e237716a34675ffc2a8895997fc7e0d32b76495dcb98b1754373066f0ff597b00,5aed6164adef4e513b1b54b7334b8e77381443c9de57556faac0f06421f1a7c3144fbbbda7b4c14bb08fccd863f087ba4fe70b600a5c9fe628c41988ed01963400,a49d031ff438f7e50ec68b092c9fabcd82d14815bb326efd28d90bd9cd9c896b60c816da1ee5642f60462cd3ea8d9f2487f12dad8b415a5f8fb440d30a6c609201 +4a6fc23c622f20b9043d3065e63522887087eaee6e94a2810622a61e432963909cda1b86eaebfb636d7c87f4aaad597554127685c29b6ef65b46ae26d4d454f28bb1c1eb2d9c9f5d0c53b16a5f018e6aa7bcf9a5f002509edbc4bd8e89ec8b5dfd0cd50caf3ff58d286caa189cc8957d39308cadd87cce24cd0bdb7683c75bca7ca3fa41706e415e192aaebf1ab4639b5413967393,724a4d0f38fb0e19203dd8516d310a16a49bee8e9f394b433421090839027886,4a2d781ee8ba940b7620f6ed2e63650b535ab07d910f4e8cd8e3cf9400b6d63644af23cbad8b11bb605f77e63348886f7777301c12b9cdb1b8fae68546efb8f700,d075c9e6ced5099613e9459a00fda2ee9e48f4deb8d6cd7560facc56e945366b5e3f12693ab26cdc02e83745910331671ccab3439c59d6b084c03d084578893600,e4a84716ed05106c762237d2dfaaeb062a19ed582c69222275d13f6c8981b5654148faf64b8d57c4f7c26d868c30fa96df03bb091de0618dc99c09926d04740401,133623cfaf8ba7a95b4f66090f6b4fa7cf5829ad7257625af058b681e4e1072c7aacf09e19682a479405464d1d551281e9d7558e02687c76fa82db36121438f100,c5258e520a808f75cb549eb1e062ee88e8109a3b1bcc1ad31259f433105e9bf46a601f643dd7926f3fd972ba7e0670f88bc4b430d19ae5b182cc6d1615a75a8a00 +1c45358d1834a1c3b02a36d2be7c5e06f8de694a8d3832172e9a81fe3f9053b02c616b9a6f95d96cef68fc2e54e2ca77868b40643295da23f68363547b6cc88179b54c4f1e3bd2b50024390ba611a5d5dc425c6bd42d6eac070ab8c83809858aeca0517bdcb304ab8823e7a9f4e5f449fa1b21c49dbc5223f4e38479f5286982b1a48aa503772b67982a80dc69a0ddb6fea71d6e1d,9e014c4c2b0f1b2e9afc6a3b784abeab50580163dabde0fc076f538ac5c3b3df,9b86d34c7fe37c89d7bf38842ec9d0be1e47ed1a5a4cd66dfc002f87ff8109dd49b58c0fab71193d7d511c8fd0d46307510f2ab8bd110623ffb5f53e07c3794100,5c6077a1331af13aaf074e53011cd8510a9a8919ee487fe1da965cfdab6097711e947fbadbd533d020ce4a5db0f5c7da9bfcc5d03a42d76a9226dd5ff4db2f6c00,b2c311554fba086aebe0308652ab94907b77f8cb6ac7d239e770df3dcc0691f96b9126f8c8dd85af18558aad08854ce1fdde93d4dfef021bcbe41054888533e901,89c2fea5cd85c8fe45b4f3a6b2d4e9971fe0a05b7210083a0f082bdce8a91ea707e64536bf0f680a5c748f5271fba73839766c6a4f2c60d55ec6eeab2585359c00,75a7211af861f6f75e961a76edd826ecb37377a6f46327151340bcc112b046795f5b97b2a966c460b7c94735e1e6458554eaa8dc264a6413639ca687edaee07300 +d19e053ecabf368e8343cb8afc762a996513d2d1a3fef829ce3f9367369f17a0453cf50f35bf79bd9b09f1de7ff7e6b637e0f87e2388c05cc6ca8817a8f2697929ab3ea4c3f295508e1c7e297001235aefc50d07088777d9809d290a0b50640e4d6513b68f61ac3011ebc76ecf528549f523f78998abd53f97b572dc12cf21ff2ee0d2d95175834349b4f69c709a0195dd2d793cbca4,e57439a56d12c412df9c06b183e3e3d551394ec12e094964db8d6eb37709bd98,4aa3ff1445ad30c0c41a51167f6f467faaf9dc21235a700a4ed779788e1d920235726350a9b646fe90620c69d064c76fcda6254cc40972dd7cd018df1505eef800,50eda512289ada47d797401220e44c3cc7659a3cbfb0512c6f1978ffaa1cbbc4084bc78f93ebe02b1cec0ff6bf54bb59bb62db638f5fdf4205cf02f1b4d556cc01,467c8577d7d8114ef03aaae19c5a91d82b357282d0d9a212a9873b7822d5e9223744c5176237363610815eaf144a3774f1581c357c748757e90e78a9fbc6c4c500,4629c100d25e7ef04e7569593fc54c6fbfeff2c222984668b6185146f3daf2564c9fda0a9e66148da67941257f387bde24639ba0dcaf8023d371d4d297b1e14a01,74b60b72f38255183700db6b557730b6f8390bd8a87d6e4617d634d7f2b4390b4574f36f039f83027adbf578f50a556ea3daf373e17ed413612d6e0e3b96dfae00 +bed10ae7726bf10b23b69b7ed5d81964b611c21ede3720564fccc2c4b3776420497c4eea10d930acb32d015729dd6694bc710d05f0ce8e1167e4ce3f9986b582974db939341a4fe06e381541ce38347751b8bba5bd13b4727ccb135d48d72ee6b198559cbb6aff89fd475cbeb483990348706277fded7cdc57fc51551d570e3805bb57b0bf850290d905960c479d55540ffd9f519da4,42b3cf255feacedbbd1e750b8081a523a5fcc9160cce75fd87cd05e84ab6c3c9,fef6639674358302f8010c38f979d2ae6a0d6facbcd3ab3a38a449263fa8d5b62cacdbde3dd72bd05cdb69ad7f126eba51b7f5b50ca0838683b31feba47243b901,1459825395348a4c0607feb6f38d57eb388c7edb3df61f5c99c93b22af99b88967dc1dd81b8977e994828248f2cc5331a83dc31505cfbeefde643bb91c8deac601,892115a797ca74c7bf5eafdd99c2b3ed4b1b2523538b4aa95a32adff1de5eabb668bcde1ad97363aef4eb25f84ee0c3a24d53cc4d2478916f411200a4cf59a0a00,73f361d3c02a2474e234a11db5cbae0e47351ca21f760a7a5bc20db3ad3c769a712b0a71e3f21c80deaf318c06a4bae5010aea0f3fe3f1ac4ee0d8d8b52d597300,32a8194c206dea78a44e2cfca1841a7f6f57d7d780c2a5165b3e545f12ecacaa7960de0b482c799160d2735c4108a2d4735731bc255e7b94e3a8b5b99ce7943b00 +7abb3a2d21aa6451b620f8929eb624779394599c44511f3da09051f068f57c2760568a3e9e2c21d73174f801cd2044b8189556bdd9a33251f5673f3752b0ff65833ce38a6fe6078fbe315668d9c42ec1797e2bed43220efabeefd83d3c898df3eef433c0bd7fa6261b3b274a1f8cf3a8c7156de60d9abd62fee2eb37616f53c886a6a89dbd4e97912a531509d61c01dc8c98d8dfef28,1af0c15bf741568ab4c040581a4e00913ab3ede688a4ae9f46a100fa64b4caac,2a8f33a27a82fc95f38c9ac8fe26c500d41b32ad2571064da997cc5ff3a23eef00b0fcb8199e4ad96a49ee6febaca7e006395c5a42aed7b7f4de475ca62f340b00,4e36834bdc9d4731eccc01c7ef2589aaf8dae7f9574ecd311cd201f503d4db974b5e15fb4f08d270b156f74efb360d34c1f3f39cfd8183e3b78550600b443f7301,7f4314198ad7a79806a39bbbd3d2ca92d4ed1d0f8ca9311382101b0e3142f9ae4ef4da313ac9ffcbfcbd770bfc58864ed5711b964e31d09a4a7188b379076d5501,da595e1b0c136d19836b8c9c20732622c7f8d9a8606aba88e811b7ac749ca77d3f2612f1a2395bed113a293d33cb052570a978c7f2ac98c1f34389cac06ea87a00,9cc335070cc4a2dc4c31780b46ffbc6ccde5c66422f732a588a5c563f8bdcdd45b1fea97af2e9405c202117d93c648497e2667256a2711c1aa96571faa13b93700 +0f2406216cd8548c0c7e6a91d13335096f5f14c714cf52c8501523a1c9f7071cbee19e53bcc88d39e638a382b63ab028becc904673aef0dbe2b34413dbb2f9026a4fca678b828b0571f283c35a092e1a6e8166a49fad0479940bf316ba873b5d4b9ce6f31ec8ae58994a11ae02697e87617e36119cf02f3b0379083cc15003d97d6004f79efe36fed045ddf8a176ee2aace36708741c,9c297f260e63cfd66424d2905aa6821e45cf33e9de6014a7b0361d752d931b02,ab2d234852ec3b1ab6ae0bfe889fcb86215552c31e668176af10ffa07b0b94a56dd928e1fef581f4d485b94477a60b7035104318ca564257009fc3c227bdc58c00,1fb1cba695080f646c76d262c680018e9fb4c37a0152a377b6b3e902dc4736132dade66f91102b579e3f1e18c3131832059ad85c5034a1765c36574e226e175601,2ed57af7090613aadf4d200a1b460d8122b58a06ca9e3e5d8c7da9a6c31efc6603b36ae5ace69c2718f70824df2fd3f49b773d6d0fa41941c8514f3e21e28c3b01,c03f37ea9b7154fa28a205d93e93ab84419926fc38013f19e2b87305f8f1b1296ceae994b4ebea6e21eda31c5350d93e259b6247f26094f9784ec82b7d9e81fc00,1088059bda15e45a40e62e42c5104a5ef199dc90182ea459ad865488147fd97e48a546873070098aafd30a236d02698d28aa539103f9b45465d538230d1fa8ba00 +3389021646b52c39518b74a84c8631fce1796cc68fe9e9ca048256a737e76cd729406fc105bfdddde54931e91f06f2fad50a196f4c17ddd420c8543a4658491573894f8e50c2d2b75c60d12314ff8fc730ee1af11e8eafd176642a6c6320d8dffeca5f5889ebaa1dfc68f08b0a8eac9e449cc4b02183cba11abb108f0810d579f3c6c6418ae885e899b7b2a4ec149d4944b8f0762207,68b69f6f5ab4360082e1c190e5f62cf9e9832aa054188dcc8728dd0cff38c994,f78c39a587eb233d29c2156f7837053c65fcb794347d8eed1351d0f5798d0661559f9d4da2cc0b1577afb1b2c5f431304f74171e6d7b80aaa7edde6a1c80795501,40f862f97c1d94a7409b9fd25b0a60fbab9e1ea43b330d0e4ed8e7afe464148a646ec6952b58279a5ec33c8779df7298db93b5e8a6cd5c093bb71c7e3ed403fe00,4a184d51e031c6f54faaf2f88e70d076d151770693d74387a5b6079f5255d4f02e2ec1629199161ca1298605d2a6095a657e891c2ab9c2159a8efdb4e78906eb00,3f1ee1ce50947cf79479c866751c2a57e139314b9ff3610a67bdf1c3b8ea4d1261139e3c25570358bf8ad91a4b4e2f6bbfec02b9baaafdac2bf544ac5095d8bb01,20875f91a1f6ac0d6e6e864777d0cc6d95133c7a30e14c1bc3bc998070181ae76e8cfe2d309888689ec40f33091cb8099a6c6b8ae8064698d975dc80affd222c00 +ae17f5703ed804e37e93ce7383ad67ed9cdd15808b82818a2dc0eee52dbb172b6f9687b4a11d531474863399569b3a757228818c465cdb98ee5260209d27f65c52fee33492f12a6989015b9a787569acbbae3e11372cd61c70491b8e0a0b42d76e801a06eb89e4efa251a6410e4f2d49333541327ba3fee7d92acbf6e106a089f79a7104994c94ab819ba712dadd0f8b964da1acb3e8,05b678b537db05a82aa43dc3141ed4c0975fc44803bd0b872c7db016ca9ce305,24f022cceff4d35d816da1a52c28f27e5f43c8649b8647aceb613b8b31aad63b29d3ad1f63f437890dc99489bdd41bdc45f1a71136d0db364d5be1f9ca26bdf300,ee300157e010e879556bed9776ebf4cb5adc7513fba8cd386d3acf7df56adf005b3bf2b11213aebc0352ae3fe1e7a46160157f3cee5c4025cd45f86a612c693700,1a35252eae51095552b278e23ad4e631b8d4b81f5344f9d8ab5a9d070a37581348c439be53d741fcdba1052aeb2002e78f77a4cafe81560ba76cd9bce989b57901,b69ddeb49efc4bfd30743f5ac190f0b2fc3a7bcfb33382a7cc185940abe252a14f88b6c965f87038e8f66e279ad162dc2f980e8b156b3b96693fa872caa5b2b301,3d42e1d679dc0585cd445773a5265ba09238295085e8dd7ff219a8a6ee354fd32b2670b26567a3dcc0e27c4a020c2a9903cdc06d8f6d793ea2d619a0219ff80401 +cbddc8b8ed95946b41840e30b576f9564abc7c1a81885c9dd0a805e3da173121e1160b2a0814e515e5791f192b2f0094c53fc8109d60830421228d64aa4ad17114c0f6cd92f638e84a6184541b4ff688c64c06f7a83ae8f5d2c6ba0f5363a57ab7b23551944ad312113e2ebb73a3a4aa4e3e537e1747c3d7de7e0e0dbc363a8bbbfb4aff897016650a762dd7be866dfb670560d944f5,accce4ff8ce605b3b20db3a05e649c1189576ee63494e9e05f1535572d7dfc1d,8f2e6d3d788aa6dc02e8c9b64bc1154b85a7eb3522d28bdc226a00e64b77100f125a40a0bf8467a11b9dfc733641ade71b5a75c4ea50835271b1ad1e4af3b72000,bddcc7c92df6bdf43a3a4f7e91203ac2a1d48254735360364dc7a846e774d4f871d225d3d2e8f0384df4e3ebf6c082990d015b93fc9623cc3ce67d054c47ada601,810413170313dbdd39603caf5a026560c1d07db47d8546e32cd51ef4dd8c7f9a3ba57a1fea76aa5b28b43b2572b30728bcfb8f971dd3b904e30b6ca6fbf2580e01,eb683d3bb8a8ae8aa9eaef4646f8c2d6d81824f8d0d838ecd7ccb2bd6768d9df602d82a73c31c94a2144f591297b9dbc278d8d867d1884173eb9098d0dff0c8801,a9d6fd92d01d2c4a8920915f8dac474016919e87bb3263a7f2c2b0a00582e02b2469e66cd66f054ba76716a1ae7edf89faa8c2bd422bbe385064e4b7686e48f901 +2c3d9da862861c7ea579bd56751925a21fee6bdfc4d59053e0a72a22238a9037e44af83cedd4eaf35d1da8ae663f3ce63a0638ab4b133356ff6ea0f06741cd4995ae81ccc22584040678d1a5ce5de232c00963e6b995cd02e9b90ecdec21ff0173f63c2b75c9ef028c47c591bf80b4edcc02872682e5a49cc56302169e41647d150bd0b242a9f1e75c1b354689b38e0982ac08af589f,17e1f21ccc58bc438ca89ce83a5b92a948ea2b4edde51e34abe97ba47450b490,6fd094fe9cc7adb0c78e901c9d44346c62e2848e31bb6fd910582ee34118d021326fd18a0dc009979a65a362430cd51b4d75b51bde681e966d4667618997f3e200,69cab5df12a293674fdd1a4f3bc26733f4985eb064de4bc9841b93b1a22763724225e602fd8d3d7e44f2364e19b84e24b4b5e04caeb8995fcb1e292dde3cb80a00,9c21a57814359d9f6969753c6eab1265f8cf727564d7aef3e19861e5eae3994125a5b364d7de78c18e996bcaf6db9ba587f3ec30798ef857d33b7d8ea1dfbfff01,23cadc466ac5160b5aff354514a571bf2ad0a3b3dfbb0963916f3bee8e896b4e64fbf52cf7442174ffbe8f70d7ddfe8a7572f413f3e70f361c9c34284f1342e100,fd8818372d0c4e23388e5cc0c3702353e2f30da2b0c7f2c388ef9b95bc6b08fe373266a6ff7775c73d274e7f6e79deaec46649387a3b99bb4950c63c3490af0f00 +b824083e7d019fc01f198291e6e3278eee26e068aaef66f84f8ffee240267178ddb84ffe68a8fcb3ad72c59cc7c39e80f3cfe7ece3abc26906a4910743d27292aea29ed6b9618b76696e33dff71105f81feceb1b2c540b8893b921f4f5e46c5e23e8bc363d22cab23adf02068bad2dcac28d1883b404d96358d1eade6aea2ab0473a7492f6be73c2bfac4467482076e246684877232e,62ba3bb61ad77558aab6672cdcd3d2bb573737fabc008abc6ce3f3d52927283d,787134cbfca856ae4b6a196eff26bd734370119093fd8cd1fef8879a5e10a2c5716d506bb55c4bfeb0883062c3a447db324795f72e6eeaabe0502554c16303ec01,f305fed66019ebe8dbfc2a1e186639b9b8b909aff6dff9d6eafbd2ad2e48c4ff748a107498d816e8d1418c81cf2eb1eae91a31f97b24f50668f830a5c9db1a3601,22f959445bdde489af8097f1dbc12fb144b7cb4f5d9b4692e4d9fe58ce9ec34c77d5e9cda036e7d144bba5486c1c157fc24f04db3425bb9dec67fbb6ff164a4701,4e3fb9efe041667f0367435e4aa4f9da45355e20b860165a9e4b192763c4f9f6243509afafcb00f268d81d7db593767bd0fc65a917542b4958169c937db46ec100,294fd89576f9fd48233441a3eabea9549f7e6cd483980d9c41fa10544be3eb0d69085ee28cb4e171a3f5ec68efbf162977220160e87452cece466648bcb5725100 +642784b31df2500f8a0004cbf184c227bb56141cf2c3b3586552609b127ccae61cedd3ee387e00d7f5d699411e66f860502d64b404f6a5128a55dd2c044a5ba10a7f458345464b2b97c1728c837732c5340cc03bec9cf7f431b1494a63b0885a45d77e2dc35235d3389f1f40008ff4eaf585aac8cc6ab1af9c1be226780922ed2f4ee939194716bd21536d0a60fa7e08abe581963edc,455b99b9720f05e2ca3eefd7418226430c4ff4b2838641b26c9440577c1efdf8,bf4148509ed5af29f311656090fa9c0c305017f8e151edb2c1cdc50afb0ab8e620a7c6584552fff6b3e1a7eec9cd05830f3bf98d5926a8fb84c881911bf1e93001,ecaf8d9bfd4086990d78d9a4ff4fa356066563c1dc73f90693d0a65b2d9922f016bddf4ed2e79ae98b0909956d80e35c9206fa0216e939593f22569d7e22570700,0bf861326b0c95724afd27421361efc904e479754e75170208a256107bba31081a396e563784c045480676b075deeffc72265b56475124a292e9fb640202793601,1dea6a2cacc6d79064b062982497963bbd2588cb86c8b41ebdc19b6dde9cf9cc6bde573db2714e4779f0fa038f48fda6bb799962659ec47790ff2a1049463d8101,f25360cc1fb47ad69e096d2c3dce85e4da74635fed42feb6a06b571592a50f952a7aa2bd0bf1d6a75f72541643acbd5de094dc29c946016f1aed638806368aa200 +19fc757095a2a56ea21f8006bdd13121f62e49a1622774faf53f03eccb3e3990a62a494d72a16c90e0987eb4b4f864f2b5efea065fa0ff4ffedabd1d51d08527f5914cb208f782a502ba12e4dc2eba289ab3f20949903bd1b797db1aac61d56fb4a0976b5077bddae93ab82c4e5c15d352070128a2b16c9866b83bdb0f98904bca4c7a7d397ef66e1a44492079dc11b62b7a1d5147cc35,72df51fd4c79fcec700082bc9c45d85024de7137425e986701239b4cbc766d7d,2c9e035799f36341a3d1545934ad5d93af4f189facab1079cc2b5df96dd5b96f34a1ae786c35806267c9ee8ec19f3463945792d9883a41372dc6fcbd697ad8cd01,927c074c7d0d01102030b68e6f58ecd06bbdfb635dcf116746970ccd8af0105771f8a09d3df9711b4a6118685b0245a1da34e8975e50933fd10e1be2781b73a901,ebe1929439d6b5d74e531de593949b26d7f0a095bc11041c0a3d8b9e04ee14aa2804f3b1aebe65c75d940139df943d1f3361f91080547a4d76ac2d11320b0f0d01,cdce0194dfd9375cd744d6b2b1fc1ad0469ee7d00818eea7d892f8805045b44f76a451c57f316dd7b40435ef21b226acd7891778c69fba7b058771aad7fcfb2a00,41469e5c26610196028293f6b77ac1af8ce748f7da1e5d8a1b4b72ff91df65bd3a48f758c1615138576e9a72d51c856c6f3d7ce91fcdcf46a1fdfe0f639455bb01 +d5f3ca14d9fc99f912fae065c595066f4ee2a7246612f8d8b540a29bb085f808309b7487b91995bb4c8dc6045ab006026ad45b1af0307bec8a4dc1f0eff7b9d75d21d6026c01fd5c3969758a4f930a482414cbea33eaa4f24f5841dc223f1464c84128cc849d79c7845f6b0997508df00e44ab898d75b04f75009e48443f3c5ab70de651d2b0f8a64a79f867bf7f43378855ed2ee4b1af,18118cc2c25ca72692ead431c73c4b8dc288f08cfbaf6caa311083ddee110639,4017d6add9daa4aec4781538d29c7656f9573471896b123018ec5f5d5da92d410cd29942e5e37d2822fabd952f6cae74bc011b84f2ba843bd6ab46805f64e5eb01,2c2e3c8bb8dc302a868d36228e93f3306f75980fc61ed2173632c20fac97dde3474a4362fb8b0a2a5edb23a01b472e8a0cb1f032469639e6cf0660836743460e00,3063ea7060335d310db063b6549ea71b9060319f8eed614c372619e89ef727483d49da41a60e2f41334f7b6da1a148b130b7fdc4076d641b7ed9f4d171db00ef01,405c74c2df053ae4499803f09c85b4f816d445588a6e999a0e9ba76db1e6c4940cceee96b4285f838db1f41280513262efae29fc53d836c5594c005bb637870b01,44497582172f184fc940ce664493f0d318f36badac084aa674c596107c9204105b052e29462552911a608f11cf413725f982679bed10c1aa6893afd9298bcce700 +a221e72631eda831398e53450db4762bf67a4501d0149db0813fc27394ea7b6b9b08a632ebc7ad9ece4e35182ac64e262f5af2028fe7b39aa04b543a6b477acb0b7f696da2989aa4512d1fe08295fa34d23a565ddfdfcf5ae5ee723acbcb24bcfdb53b8bb9d2119ee5577593fbf58d10167016569c96bd7bbef9c967b4aaa29a50eac1db4d532567f1e9563b0bf7416953150558f313e1,fbb89e00121e13ccefaeecbdfa7480928f8ccedd86d0a7375e5740be838fbb3b,e1fa5040d899faca674d94fe65c208223fea18caeed453d6bbbe4537dc1dd25f4da9e06e1915c05d333c34f92f8b02e51cd4d3b9bec991afccee4f5cb5d6f7c100,13df22e0267f8b211328b1dcd333722fd91ce19d1dad4fa105649dde8cfae3ae695f3e4450e6852cd5a5060915024ff64e1f043b7fb0997c773653e03497860a01,859ac09576d590c8219fb9b4a60c906bd4d909c6da9c79e3b2d441337d6b48272f73b6a0ebc2b4f4e24cbf0a45cc0be8d3517a6660fc3a6d9223e1989f13b29301,716f2c9932998f2ab775a089ecd39ca9ce8db2e1226db67104cc530a27d95dc75a53898c62c35609a93153b3550c46c8743998418270f3a180baedd2a2c62f2b00,35c18226364ee5ca0c802a3804ef280e71aa21dcaaf90cf433b8def0204316a17bb7d94e701c5eed04b79ea550f61858210baceeb57f74f95f607cf39945949b00 +dbe579cce3dadbe9894aaf1707d327f0a2fbe3cc4529458b643d33d0cd2bc23156be6a3ec974115b56749e9bbe5aba2663c08f11406188053a379ffaf5b37bf0c45d624a9c4fab08b843ee4af73d7732007231d704aeeeba9651680995999a3bfc2398d462e37d38a6f95c0b8f50f8c427640059166ea33f17a4d86834c4b09d8f850fa40cc7edb7bf45897a4e684862c94c7686c3b82f,b44f9e5ee06ee4f436e1642620711685f47b3a750e316e744adeafc863b93fd7,422f28642379f86aa269e20bde650cfa074e84eb92200b90dccc257d764386a9674c474541ca20db36e7d2cf702d768da6ad8b3c6f36fc3be50efc8ce7a6675a01,34c542ce7481f87cbb74ce816b9b1c58b6f9d491815f0402e6180f2be900d2e960d0f608bb36e86d259b3eccd3302f3c2855c6c5616bd7bc463a2da00bb66ee001,20a20411fd075f9b9429ba4f814c7ac67087e4b8e868d9a408c23211e2d0d49f73b499ebe80250a2716cd2507efcf8c97a03a25041b73a9d295e38e665787f8600,f95529c5aa6c04437f91e6538cc02010f399203b7aeeb38eb534de7980b926b933207557c08da6fce98e90027c16045238994b39d5da631f3b5ddc871d4f1a5c00,58e66518f502bf4180574ec5964d9b97644eda96ba155afabeb7260de40a64c80f958a29f79e0b6718c4e4d1e21969012ec227befca104f2244b9c890c5558fc00 +641355fe2f8663e615d4955ef9702806c962b511d300312e1a0efcbab9ccd3ec1a7c9e9ec5649816dbb36b310610fa04b68d531d2335a3f39eceffa866b979fb583d031ec6fcab1f1b8a3760cdf504685f103f77250b378d1820501db02ff8e5c9a684c5a2a0dcd3a0082c3f16d55bfcda54104012a7372159e35fc7f6f163d9e6a125b456b111e508448a68ae3b4b1e9cef55be84195e,73635a3bed01ec280bd547d41c7c6f8e1ac9d1d90655e986cc39e4402ec8da26,941848530d0c866a32d75d6dced36ce1e5dd14fac5fe4d07a7177aa77c7d21aa52a2c7e22ad2f473062355b6b52560898ebe7055beab3b5f7f60adc84d6e28d401,636c1c5b677f07e34e462ec5c639465ac4542b3e164d2f7f989ce3c21a172a2b02d81a46234279e073cde322430b84fba0e65a77ab565620c539ccecf6a99bef00,efdca8aa7e62899eb95242fa313af959e49fbdc501fb72550471e8ff9f7d2a6416390f8980bbdfa2121b12dc358f03b5a6f38e084172fd24bb90edfb5efc9fbe01,a9204d2ec298d4dfce0fed5918e0f5fab59db73305974fb4f18cd470cd38fdb4291c0e34d7f3a7ab33900654efc571232badc1766a3dd675939a045060995fca00,f5862e4fab61dd73de6c24d342e14748cb1cc4c6ff834048a3915e34a8fc8909653016ecbb66b1cd1c560519006d79557d8e416ef0b12d5f39357771fb3eb55b00 +e9b1a6cda64e719fab73a43b9c5cc256e4bcf96926685590134cca8e2c4e78e730f4181c10fd18676045f4b937d12b56347b102ddc9d40e5a95ce0bed1fd446dd9fa1249a01807525f661a3321131ebe74f5cd2a59d36e81cebab713a60478c554bc66a34f08fa1d1359850e87d3dceadf666a56a889e5ed8d9d025305b3a3e379877c54ce20eed4aac3a9194b5e5835bf4798121b677d,592a82e49ebcb2b327007ee53e2a1082b6a51b7556afef5066f11b0a4429b75c,2f72bd5e922797eddf48e8fb8d82ac441682eeb7ea58fdc75ac36385822d412633fa0e9c1608cef9c8a06718b4e3807255307d1e711a0f768904550f8c034c4201,9572021e235e728c40204109bf9ead1ffab3971a0036753bab878d3f3df348ee2ae1dc925b3d467a94d94d83913c79f9682a75a0e270532e474536e7425a3da700,e245988cb280f4e5a2c120694300791e953c63a6ab2a675c6dfa512cb03eb7b15f923f73358a6b2ecd529b21b88710578463ebb19971824579085f001ace07a201,621c086c55b1295453a209ee052bdfa86554950cfd97f26748a16d3940cceb41353ec1a0b14a257f12a89fb04a8d776c8baa4fab7925a3c60daede72cf0d633701,5a6d94b2c92471967ab1967a510cbb2bfb6bcf2ae395aa2b548736e8f0e364690b8dc997041d1f2adc631675935cd4a133e1902b911138054ccd0d4a69f1faf001 +cc356de4795ad1c0ecd9a215486e405beb663c78008f96625ded4018f3d265b7f6244810b588bcd2a04e11495c8f54d4a3d51ffc2f2035304cd47ffb89a74cc1ee52a912245420d18de8ec5d2f906ead5b553f85da0a8797491a5d99bcefddd1c9f6391f3dbf8211d4896ba54521cd4c020722b54f1d2c2853cea6be64f21aca390c33cb420d498775480433b1f7fe340637ad226881f3,58d99784c6ca908e682b9c04d373fca72ecd2b4ecb71226bdaf66403e7e8b142,37d941424c2be9b3e7341f0c7dc264b5661bd5635e76120fb1e14dc8e53dddfa7c04c67d6251c182796fb25ad5db584464e48e0c28199a7a49e998cc63b31c2001,9e735d6d73b954d9cacb90252784201dc8e0c72387fd66c8b925fb1a2ee6d22300662dd7ec1c79bcb93f3b6ecba594f47daea246841ca90bbc8705d4613216dc00,c3e2eb93c8fa4fd3c4466ac8073f25c11558baf424d24391fe1a93405a7bdb3515e1b3791eb0256ae3b208c29726d2a004925ce927139ca3ef16032141a0c5c401,023ac537bd87ae12e39652de8971b01cb71d642e1dbe34ebb821dee107ba0aa61915ac8a1d7cfa400f1dc0369e067e282ef6950625f2fb3414cdeb744390a55e00,144d2cfa0e0d369dc3ccd99a86cec3e2c88a25772c053c9c0ac55c928d3fc4095c1a6e599c786ef756753d985d157d4bf66366572d5f0d7ea1ab871f842eb1ca00 +6fbbd0410de1a002bb71a1b69012666fffebfb9906e8cebc5db3ca067e089f0fc5619822b0e2c592bbd5c842b5329a68300266a98608b7e6c144b758a19d90df738b95f2a4cfc63bab6b22cda7c6a5343c748f09189be5e39e53cd76d48dd9fe9a46d26182e1a47a447133035d88abe936c22a01a32a9b4413db38ebca74c9b2fdc8260d0b0aff2f17ce39c6d20fb76cce848cd1907cb6,27a2f7ffbedc412b2fe06db33861bdd7ff9e156f728f380a57f3d2ab2b99df7b,6867931ff43cbf17772dfd846ff6a6e40f4bc53df2125d597998d5c6bb2f15106c23806158f95a8205b9c8d525fce6e348979cbc9d2dcd835401741696ceece301,d30fe57c20627ef450213d8e49932d8d9bbb1ca7a74f9258de39ec58052c42dd515fb1733ab4ee1daf7b2ea646f3f9170b4a1fc526c6b6d4dfe993482977e46500,8b43d2d70c70aa0098c01d1ad1cdf5df2a7ca7f77127a0c1aeabc1b78428dd76552643dba2f3c32bc75b862bc16303f65e74e8c01a48389884fff4073489cbd500,2ec966efb7d6729e5b3b43d34139957d946e9e4847785021355187d76dd33d9656fb12f46b0a665a19587d4bc5edd4b0aca056692e22f7a44ad24de80a567dcb01,2e773737ba76401bfe39c937d82e22d5bb48c4c2c22eab942eddd2e47083fdba31f0e627a7580d8fbba7cda7581feacae0adce0231f7e49fe35ec8849ef0508200 +55b385111c04114539739a23f0e08abadd09d9261263f97ee83262c7fd6ebf5926e187cd02241e3bb542f789d914757bd4b8ebc21b76d065885d04db41652a974222ad8edd7fcfa50408fa22e59766a3fe5ab2fe825e59ceb44f7c564ab9c8ecdbbe29ed0b5ca43267a52636d3b72ffbbfb18d3bd4d5ac4ded7c9b84572ea15c66b1cdfe3bf9bb7daf4733d4cc4d6e1fc420767f037c05,dd28e1839e74285cb6f51c972a7e296d356e530d1eef00ca23aceaf3837b73f4,9186cbf80206eeaa8e452d35027aefc97c0de18e660fb94ef2b2be606c52b8a77bdaa5c9306fa2aaa058f2a4c6398b25bd4efc836ce50bcab4767319c45e748301,df3b0b40f7f812118d25ebee840230934153e4127d3b63739d3fb1ba10efb96724d2bf0cf2ee672ab1473f6433a5b609c90ee71eb81a264c506308b3c1a0e98000,47443d96981d5942f1e77a51f881d7d62e7cbe1c377dd71a1003cf32d61e3d387092234c68c8b92ffa18f1509c1808b2a184b00e1acad7b96967edca7c0ca3f600,a575e80c90ecd32fa14be02d94618426523b538824b712940e622de1e084fb96601d86e35f00ed53b0784f16bb38fd17e5a30f4f96ef9127b4c74cddca54f04101,c37080df5d80b39c59e8e58a7a9f80a2059cff557d6fc3f01ebf82e2f270ff3e10c8359d60cf15716413fbe95cd9644d01bfa20341d7ca42d0fd52a4366aa04c00 +0d2626d4738dd1755804f70d539d2bec3100a3de603689398f24a2bde1e96b126fcecf30fa78f314e7b3b8e7e7776c2c50b60b5e7e51ebf9081785d680b44dd0ada856c62d89107add73973db9100801d2993091b9a3b9b7529e39cd1a56d020fdaa3d3b10026c7551cf695db80f1b38edf6aa2aeda5f23508f361f68d15994fd26c4410b48e2eff1983d108c21df9c8e9b5f8279087e0,f2d692906a4c368db66919e04042d3420b0672f21ee8e9444749cf8e545a0a81,08aa6e40fa67c799b47b1de909d721a9bd9a3dcd9ab8253b7e3a421a7089fd5f3a5797efe69c3fa2f9f4e5d9039ccf642f0fb20c69e70eac20e9d07949bc456800,d761669099781da53d1ed7a2f0525d5231c3cba4d498487493e5f52b53f0de506f95be234a425b69f153e0e64463daddf7a8369a9225ab9a2c21ed403abb811401,bcd111464cc98ce5d2fb9a664743c06f41871aedad2785f63f8e6c875d187a9d1c71a0e7d6d63de5a6a8b683a3df5238d894bf856a665e17feb8ebcd7c7860ca00,68916d1734c0ff301c577d6ede06e1c7af66a8e8b06b40bf5c39958956fc0ef4551d725ec7653b9805fafd67ce964c774222920e483d62fb1dce3245316c36f201,e6200de7b26c4a4d0c02acd7d0312d69c97415713efa0343ba9e0e8676d880f94f39de8693886b23991771fbd5724504f7ef73f45b841921d84b1b4daebac43e00 +f0fcb84e80a7b2698f7da7793efe4f477e66aedf63314238a6b075d54fc412e5ecada9a9f949bb2abb824a9c935c69854200f9c78ee3d0674570d1dfdc14d46b34ad43097b20d2f95365863dc56bafb29afa12c659f185e402423d8aaf9f1f88d42939480c4a69d091dba5b63de30e608caef98c76735ec2633cc4531021a9fa8b942624316b790415dac493ab26f6b599b2cd2302ab7e11,533399250a771335a10c4c93297656d942be72a5d74119e1e2d240422c7147cb,c9f514e27fe0afb75fb51c292710740f5a95d429803d75c5365508ea66a742276c0f08e4316c893ecead2218dbd09afce42aa00ff681d416e70cb5ba40fdf6f401,5f33102597515d1b6707994f97ed15cbfdd32bd7aee2c3faf5788aa1cf3dafa84ecc9cccbd50216e3d474137d0c4de5454a78b8ea62be06b6e111bcbe648713300,37ab42ee37eaf38ef370281317ca18dadad638dab0d7ef1d0073650f6a66e58007e3a2027488134a5252332738d3c30e0554036a27a6ef6fc937a4bd932d773501,55ffa47b4c7a27d55e598f9d6f82f6957da507a90c9625296b80972af7fd3401314e82da53fef8edba80b69d06221ac4dbf1701505b0769f04ae96c1230079bb01,77ea24be79484ddc7af741b408c708810f1cf0f6ef46c5509a2fb8f954855fc60a790c10f23fd67a18d17576f5d983dfe98ecc83bc943fc075241ab72cd4ca2f01 +b1ad9e4f0bcae82830d49eebc57ff67d8e5fbb04abc924d373e89e350c08f71cabdb11256d88ce73a00c2cbda80a693e56dc0d4cd18a11e5152a4e86aef337f436de307bb40421b6c14a05d0c4ed731b36b7caf5da922ff4b23bd66dcdfc6da06ddeb384dfe2afe1c5c6f7fd05d6932be0f78a59c458c87a16d14419d1b560a35a972ba3987a27e15c0f0a8a9518357cb3e472a0c14e5630,691ed9d3df0f1188991befc2dc46ca31fd69bce51811db2734a9ccc7e7286207,094b7b603bcc24002f4cc727b8be7040523ceda4b12d253d7e1c299eccc201261ffb8a7a95a9bbe232550fb5cae337fe640dc507c02bdd4a8eec5558a79b736601,87b5ce9d86e4350119c5b1de801b1a4352dea93c31dcd0f61244f7d77217bc094ceb8da19d182b9a1140cf0ef30f0fa3def9a7e8fa056a542fa253547ffe60dc00,1cf7506b2cea4b2e4fc7a86f90de816d820c7fe729da9f79c99f4812fe0a5c347975f0d0e1dd85fee7d52db7a4832be4c6a56f61167d3c8f73d4ea35661fb75c00,d9628e92a69d16bb6a92446c300c7d32a64749a221035b75f1e9bac43e8aa09271f2052b89f2aaf09dbc92f2bd023f7072f59e6121b6ea5c057e1013e69ee4b501,567327b0d700bb7ae048141cf4b75e311a7ae8711e3e7d77c01fe5aa3f4e8d4f728a2704e50a6fea6d71f69605907ea70fc579b9879d0166a1276b527fdb25ef01 +8e70fea3e275651a0c30389bbaab65a4f81d310e4dff1da9b5fe79317a2e6f95bfa8d0782b90b33a510af289a127d5bb556e3217bfc65f173f8c5f33293e2f359f04133fa91a732ce2694903911132d0be001c94a87b4a783a0f12f7cf29ca2bc50504c58bff18e676908ec4ac267d0232443bc0960ba5b27f52196ec74100f8f157c5b1a52b8a413b3dd90aaab0df75ee7597c51b96cd18,985181454a73fe555c312c97098cb51d283daa65e7733421f15573db4dc0561e,17df8fb50fd30ff0d5cd5fc1423fb9d7a80ee16afb8bb2e0c54dfb8fa3128ebc6e65ca1d693195a6fd85c9ce18c10c28a4141b729d228e59d35c35a58d27b69d01,18178677eeffd7893df9e270005045cb69fb00a8587f4312eb4545063c911f4276600c45655178912520e166913b163be75bae81be3c680d5ebf9637bc640d1c00,889570285e0be5dfad00e9ca8918c9794a8a0417fa577d66c8e1c5e01c354c96782ca58d52addbf88261c815a05be4692a51c0ea2786d91822f98997cc29670f01,2a47f92ba4080a40d960ad3928ecbe4e1dccb7c423883a8773fb1e97bc8782b25f7bf955a2f59ae9589d149e0593a9a8086999574acd4d9e16d5a0d0602dbdba01,f49ae72294b26c0e554d263fadc5e1ed89a32a19841378d5d758a6a62cc530032adc75bcbc22c729af8ee94b1f28e315c145f31348fe454476546da1e23b0a5b00 +febb4075330989379f10dcdefa797b006477d5132ae76d75f505a003c2a556daad9f4986c6a3fecd1c27e98bd1dec66bcdd808816b72d0de6f506b9495c1cc6b3b270f59c3754d815bfc132842abfcf691cfaf602d101d99985c2facdc5431ceb5ca34686015db3ae8321cb568a253c7adf251e6ef04f31d8c0f8482144042634c7f1cea815557cd6e38a251cbb49bca54f8bab57ec1285b,ef31e8d5d7e439d95c5654aeaf324cf40e7d35c1cc4d113c4ad6a5a53e280ba3,950b566eded30eda8230326d57cec23b429b907eee3f30b1e1d74243da2690e93af84fe89950c52ed9b4d8d608277473950477ed56b9593c498988d69d542b5501,60d0752758a6e8cdf7cd9957f7f7035e260679f0ddaeca9a0e440e09c0151dd22aeff81ddf6741069cc38c2476b10599f78db26ee45e1d3c85fa7c5f6642633b01,a196eecbedbc7adce55478b67e94e39427f41f615c5c8a908224dfa06546290f1811690bfa9cd60932b205a4b2834519be016378984c685eef17155caf02f58301,b4ec625c3766fb7552b94ede641fe16f33e8551c1cbf87fd3f5d476e64771d7663bddca2165a759537d2d599210cf5a5082dc34c7a2a3d50673051b52ef31c8000,e0d2c712703924d5abf72bd0d79ee69b85bf375f1b8d7e924184dddf79a718920d29a1903d31124eb12b5b178c9b604765593a7e4ce50ac2d1ea6023ba67d87600 +4671c404b4cd20df073a6cf61270d995bd4d18595e1509c3dcd955fe70be81a23f5ab4aac27314fd67eccda62d27db68947337b3a15a871627cdee37efe8179d5f67324b451cffef96403cdc29620ee298d964e97d593d56b65225921fdbc5bf1fc5ea0110af1aca05efc4c26f50caa7f250ac0efbebbefac56b3bc6a77edb86c2f890da2fb6da64ab20feb4b4756e6552ac23d6b816e02c,ca2315aefb824fc86ec77d60586cb7ce24180a4d58fc5952568a8261cbcf8e17,61c56736c798f7eac78bf6b25ad48cc086d659ccbc954a6ae0d0e787a6edb2f027d55e0de277a7621f48d13701fcc66f94333bcd3019179ba6f5c841151ae97001,a4109f91d8f339d4dab70415f95b2514ab49c8724524893112f1c8b285b89897642c4ae9f5e939f6ffd5ba654acafd6b09686082efd23c0214edaa4b9274cbd901,e498983e7b7ffef5c3ef07a24eb50d61387907f17d9911b99b2dc98e314a02e856ed2d3931ac62ab16e0448a92d5dbb4eba613c33e6baea2b683669dabd665a601,571e721e7d90f2eb38d93bd2367ca13c9ecc8c185687b176710bba7f1b60148175d4d0160676f38d053f6802fee268681016e46f53a3db18cca3a427adb1af8e01,010db0f01885d2bc32803fa942e0d955bf8a7042cf3ef178623b571ae3ea78b11076382bb3fa28edd6178d7c90921c3724127a11b8a018db9c3067301f0338c901 +4aeb0ae015d4dce87b560719a7352eed4a89d9ef7bd0169416db5b4ffc1d229f7b9f460f6b1140054adf6a3a52b3be3108cbef46cff606ab2a1f2817dbf45b81b2214840c54ec2f3f0f6c067976661daa0a9e29edee3cf21a7020e5f6a0c3a87559066b45f62a0c8857b72ec19b1119f2723ee0db54a5fedf1213df82bd8e45266e2973a06f6cc060a79b46face11c7fec098f277406af3e,12cdba6ff73ec301e731926c1f6df543f6086c0b5b9b19885f3c6f8abdad5b87,ee8ec24c3083d75d35a19e323a7d958e728af8e2bfe83db526f3aa8495aeadcc39fb85501a80696e0d3bd2674e970ecae1ccf50f61e3aa2cfdef64e46fe0141100,fc67bc2c8c3160813c31aeaa8f31872310e9743940eabf9aeea0f35dbcee93706683dfd2e206e16247266276a6beb3b6ef64b7bbe9d441b5436876f66d55a73d01,2f3fd26cea870bb3b2bb49eebcc5b87e669e151596a95526fd7728a2abf025b021ea639691163d693089007c1c8138b229378de5682c77035c48a2d545473c8800,a20c185d7b97d2137ede39c9c6d9bf69d1314dd40b1553dbe514b5c2919d943b0abcbec7c7507e1f3b7e47295e7e77354720b5b7bc6d4ce66e13c87a3440420200,7c9fc45ca820f8dd73354dd42d3b7ae3ff47d5e967d83083b8240e0f0a81117a52aeb4f5f17bdc2e05904a7911b5c4c4ce72d838fe3f348e016196bb9c79e52e01 +f5beb3e696da26122d0345b6beb03547eccda17570ddb76b619f2237bdca2c1bd332c1876fb58068057f64cd46d13f09f1900ab651104fd18ccfa858961a134ccc80849d2f3ad1dce1369bb3718e2f63a1f08efb4599c76defd9997d163e9891f04e1c57a4104bd83095710b7e2d7500bbe896b27c19f8311a9d248507ff0877cdf83fdd74b6ed438c5d810193ab6e99ac65d74d7ec4c968,0da805c20f9681e10e9c5ac2bdd3eb5427567630cf243aafd082203cebd7842c,f91680d09ea005b246f0f7b30785d8db2449e8e886fb18b04a021f140b44b0547ca809897ee126e62cc4db4b832a0418129b96bc4a7a4685ce03efd7623f4e2e00,717fa5e3f7897601495798fcad0a3ca5246837e125fcb8d585ec0a3b633ea0ec4ce41ca5975901ca75089df09b1c324e7f339ca70e33867c7224b6651104238500,f1d8f0e466740ea1c1aa4be959075e0e36a66474931a01d23ee1f3643a4e33d26ab60ee9ee7b5fb58e4ce2183c098a18146a4b56b97233fb5ea59bb34b04a3f100,952d0a81a5b64b984d4adb9bdff7597ffb9cf49ca4b0441f28b1d44ce9d171166da7ec02d404a0d8634bc34f76b907bed0055229fcf24388c9a0e862590dfd0a00,a65dd87afc8fa68ddaeb220a78a70a75171f7a6a0ab047a0fc905cdaba9d709213459263ed43c1916015010e5710d5d0b7dfaf2e777e0f3955fd31a8f949a6cc01 +e3dc59c0063a40dd773ffd49d374bc7fb28655292291a6823c4e7cb44c3280e2b7db7f9c4c14e2eaf975870767362d48e5e388f9b33b633c5f3e83a63c5f3ba68cead7a2eeea74628a1ff8def8e498b45787d1f8856f70c783a29997cff75bfd9db08962f3423ba6e1623419f05c5bf03dd8e2c1b6364f3c72eba9954c7dfb1e0ea1b380f81c97bcfab185a385e99172b51722358df3566d,87559a8c0ed254b884aa323bb85b0d27bcc5164130ea0ee5cafbfe76b8f87575,8e355dca1b27ae90bdf1f9d9df1af84131c0d27199b115f11f461f4f3dc941d777b2da96c1677cd75dbad6667ebcf70fb35cd77b18e0a1db131c39809f94b96b00,2c4745d0e8f3973bb304f484a643b629daaef791c80eaddbec54d643a08aec0800af969d0ece8cbbe81edf92a0456c490160f8d1d37e6693ed785a9ed940761b01,655e157168eef29bb0a5516c075d6f3a55be88af2220ecc968040f628630b8330d8f44195e8bd81582cc9d9fbe8d8ad08833c04adfb11992b4ec96b37ba452ff00,812909a23e2542ab8c3b283b8d9bfd1bc56225659782286ef668af2d6f2dab51399b21fc9389519c7e9a173642ffe7d18c2e0871bde6b975a3c628e1b5607c6501,7b5d5d6cd4dd93977d0b4316a71724894134314a21c4a6c03ca86b48801c725837d8233f6f0abd09801e95d2ed56211537a9d4514a5466b271179509b9622d6600 +c57ced49ad562f50481a50271fcc9a39a5b28f22925f3228192c27d5638bae2bc5e639c7d34ae76e348cebd87f7dc4c667413fb461a18c0e5d7c19e009a432d4c56ca627c7187a58362d4e20503edbfc9a93cb6a87df07d3cd1b30b8c213330c041856ad794a913bced1fa7b22ff972877bd48c8992f780f5e84d9c2a85f3cea2faae67dec27501893c7af7defe8c2b19f7ecdb681bb8741,152cbb5729136f05c070348c4d02f03fdc48dc36ae0d55428e8b80ff3311aa39,efc975f52ff1dc5bb629c2e58356b7d68ae710579156b5e3a6e4e1296ccab79b3bb922d39d6d902f1038115c69d7298a4e73fd984ba189fcd3f5b1293f3c804500,e311bed0435fb70936f61ffb77d4e5111ef98d979dbbe674fb96ae0746b501855850aa1c7c14895193897b01d7a61d845a66981f236da11a1b1832cc1af405e001,3f63d944beefa333f02a9109e8cc5532cd8acee0fc381dadd0a11aad680df1742a622739ddc77bbc87262c0eaa3d00ec71d31e6c97698c0345bc222619a78c6f00,a70507bba9fb8b22f03cbf36fd2c14e0386405b9b2bd407722e9a7645db6b78468720a60a3badfdb4360adb520a2e0a3f4c1db39035812d0134b2f3836fbaf4c01,49be3ec285a6db1de91f4c81aa9ef73a52f184c7dc32008fd085441f1131453a7413ee74d27ddba4d5f5ae3d70dcab4c5ba48f5a1b06a7be367c11dd1a2019de01 +953a3d57584bdd5e55739714ed4351c943a54d56a13d08f8cc1907b893c6ffcd1a0aeaf98e68d72de5dc027f12839d9fc929b7efa7170a445277d3f254df4734c87bd0424809b3972ebd2900e6a9fb7d089c1d4e1b574bc6934d50f329ed055ec715b60f45049e098c60a75e084d5bf8328338a1571c49f20ea64bd3f7f1cd1515f383b073f8dffdea665ce333d3c4c5d1858c88460e9c66,2bad64a4921c75da903c7292c7c2c808cf95e4222a7a4de6bb4949562a0dcd6e,2aa78ccb3ba63e2683b1bf0e3ce0936c95d5e2e35d5f5a4f5c6069eb0ca3a80a4b39d0945f0eae09469877d45c0d528041765c79a0b7c227480fa00d315a020100,bd5b72a1dbc9beedad783e60cdab84152d49dc2027c4b156067042225bb5509658dcbd5517e7d49e4be3f87baab86c822bd4560921a2dda69a65b07caf24238401,5ad51fd0cd6ae27e599574a85c6a9d3706c6686f96f62421edcbf91985e295f877e2b784a7682d449ee18152b4c445940fe636a83b37bdf7745911ca76c5e31501,8eee0f96b20e5dd9a48bcba97cdc03106b41052a5cb40545825ce898003ee3eb76879ff0425a47930394cd787812f45b11ca0142f6476576b5b446aac671940e01,d490917abafafe034dee87a0867f12c5dc8f40512d36fd908bf844139f6260e512d634aa7504fca3d48d3e02903537e8d087457f79409bfd660804c5367ed32e00 +e67575d3d41900d9075c0366cdcdbe1d57cc125fc2bd8409ad983916b40d1e649cf44537d6274fb673dff15f7ce51617fb48dc472b6caf4a75a4dafc09d117a842d0d7af96558bcb52b38042f065c5c24bc94354dcc1f4ea19bb55882dc9818d5ccdacfe2a19f0bc2e62b4702acd4bd355e329a9c648f7e1d836c1abfaee14b0511c22a5a2d2bfaaf14deb478d155bdbdb846b4f81e3f42423,56c58435077c780d23b5a408cc5ba0ca73f9708c6150bbd4d159bcd1fce2cc7e,d2a923c13ced8ea0ff7854225e63dbec7a4972ad8e0561496405b6c7c4f3f9953d28dabc2f15b732b297f49fd3f93dd44636426847d671d2d41390a0ecb7022d01,08050dadd18119e329efcaa722a461c6a9f5f93fa1cf336ae000c373400202c316c2fab67cfe69f535582dd5326ace2baadc6b8c17f07434a15510ee0cbcc09300,cac90761f45702cedf67f3a125bc7386bc3d3d9489074aa1a6a950bdef1766d441a6a5c159958b3f161715fe1c3db50dea5a0e06ac6628a4e9a8f829c295cadf01,2f5055ddc70e536eb883edd97fb2ed9e966c9adc3df99514722e4304c098818e4458ac79defec4e99d74c25855d859c6a9f4dba57a8f6a9190be48bd71e3aec801,5b46427aa3d97d70fd03de5b50b31e1a83be4a9579385aa55e2e3028129560c5284ed1dca86feb2d0709f544ad192f7390b06071d249761e2c8e2155b6cc400101 +5000efa0fe84923b3d0f4a99c1a4824da883302c043bd4602a6563bfa42f974e911bdb8904596eadb0939bf171d2db5b34c2b2a2c68419406afd699c5ac9b95a52e256f44485fc04ca2c1eb4f407ab3e069419112c85d516321052a45de08241ebf3978d771326310dac8c5411e2a459305b36c9f41109896b560be60b2cfcd648ff1f761633aa924fec93844a3f5cf97591a11a127fa7fa00,a4190062fb5d92b053c6bdc43a010dd7c17c8d2974f9e19997cb359561c8e46d,1f6855c3beaff58369313e27fc19aae0cff2873c5784cebedb67e1615082cb70565942672c986180b31dc929b58a6a0402af94f1ffda2ba3a9bf714b9ff11f1a01,13c7d1e9e135147eb296660919aa2e798e49bf156aa27e26e6ee839a31ad7c61538ded14aff6821f671dbb25247ee94bd9f18c21655bc6459232214e87384fe000,ca723cb729fcfd73ded962d504af1934ce96fbd67554f4419e8e3c44cfb0a6c94c2427143efe9ac1c9318ae5a74d6bdb901b92e0d412f1621f6b0dd9b6b613ab00,4f913df3f57a4c57b07c4bfda98956d475bc200371d7a16ab32327e421cc20c03d690c558987a4564757e7e1a189f27d5a359d6082d2425e4a937f51aeac880601,95479dd035d935d4a5b0dd50ef49fa31e86acd561ec5bf9424f6e513d428c7236fe2d981e307133f9055e4f9b383f5fb3bee5dcaaa0b2d524e380fbf416f90a101 +8030e01a9be0a381c0f2f1474c69b34c0bb2d3c48a7bcf2f08f8435f02dd0f218c55f71a7798a45ae24f07577f152158f5717523dd00de1ecc358dc88eb3c89559f82805eedfef983f0d7976bd7488cb7c99346bc6c7c54a71683939a767c616773a109aefca85f0b7de510661256b8b26f04812c58307759d33d922c0d9cd2d37f389596cd9ad5a27a0ef43cd92bd5d3e71a868b4f2faf031,60ad939847fddbbd36379a5fbe43e7b73fd96b6e4a91d986afd94afd0dc330a0,dcd23746272af6c7e660d97cb170495393a78fc034cd9ebfd44b583ad30e994f648a3bd10fff9f109d95fa60090d9da04b0ce16a4b6fb4c0920928a51103ac0000,7dfa6a8537ab006d9684a4d0f9cea95cac8131e4ee3e7023292bc01daf394933017b88e8cd83c3cc71a93d66e4d1e99e52b8ebccf986fc9ab607419c213aa63001,55f943ee1f5a5f273d62244813001b5ad7799b69dcf19214e01785fae24ee3d6676a515e8267e81bfae5c0c4222581e72c9c30b0b331cc1d35502054f2e2b62101,dba8b299f5617162892b8aabcbe1e3825fe0dcf81af11a6534f541a270751491607d56f4c4c9981a1d98a756ed501e033446f8aeda71fd019862d5b30be5b51000,a4e7a077e5a5d173c5e4e576f691d087a5bb6f983da22c1df142c905bb112c025bdab17a9fe15388adaf417d927be763a826674b437740a6d8cb7e589b0aeb7000 +6983af507a15237cc312e1687a59caaf46487b3d67211e5822a70ee5a6496503ab0db8149682e28c6df1fb3b17fb13d06b92f03c49cfb278f6ee512cfea0e4a4413f0a6bbdb3b555fa323bb176f194060479691ef5db3fc082ae9da53a1f161f9fc66363caeb3dcacaf819b80c17d3942cf7d0a7de78da1cc1b510a24940a28c018e89d662484d8bfdb4d2cbe0be2b6d25a3e0b6a2f7582242,b7e0b94978c6e282f2f0127c8e5e421f3512b10b1bafa85795ee0c64241eaad5,7a93603efcc3deafa5ab6395df665d1120810b93e6d5fb17a8ca2df1e5ed139f4bb7b01f817f50304f2389b204bb6f50976682123a5ebc55eb92f31cccd2064c00,82b3818ed7028b163247a9d5e14a521d7b8c8633611ca28b2f2d35a3979df2a17a12e55e639c52189c2a6c38af16564dce745d548f04bf16d2df95564683e3e201,3505b83e1a69d2b83f3b75226c99ad4e1a3d3c05550557d8ea03d43e1a42e49519035d413c33ab0579a9c3d1a3d129cdd94a6d56c85b8a524e28b50a364e68bf00,e0f0a578d9e67360ef6ac5aea05d15ae80542de25ff4fbf63232fc358df58da27d86a316cac86987cf8fe8c7c47376607bb5511eeaf772139936cacecda65a9600,1b248f5a3c1fe31a90c7f3c05a8383e588343178bd36c164b7e26a474d60553378961bcceb0f7682b64c0048050329feb55ab82b17de320ece8f71487dfeaa4d00 +8a88149a505d43eee9407d756cf4e5b2ac371b84d6559717e7fec7657c6938fc18c77b34b5474413e0d8d44ea47e6394c510ebc5838f0ae711551e9114fda2a0c4b25e58d7ace1035d4bb9e1bcd5d29be66651a994c375abdfec55f1307ad85ea8f2709b2e028239e15a6c5ceb44928fbb062ed01f8cfccd11b35098af655da5a20b5e82ac982744cc3c2ccb43a7f850389a63ef7f71d5ad72,31c0dc6c73b785f15cb05e1796761a802ca08eba23246e772e99221db54bda15,53ccc58322f2804dce46dc3fcf69e45ff11a39aa32a3a33dd34eb8a0251b5ec402b8b531a961e8100e1e9832f5bb808a1ba48bdfc86f438a1c6feb92c465fc5100,3e8d5d974e5d9efcdb0f68ac7d7a94720b6dd015144ee178f441f4f31d43c3a12efcb6c83b0b4cf345f309f60fa8f668cf407a7f68200c17680c9ee9fa1f379b00,d317cb424c2668349c00cec0ada7da115f74a7a433cb633de9c96a1bc9f1b9e9342d257167f3840a0045fae4a9313a39f1f4e7390826ddd0d8495cba1ac5278501,bc84c1af06938f78b83dbe59195037ff4a306511959275b4a26c4673ef0508491f75f2b42033b6f25523ed71c8455d882a05b86a1b795cf503f371683ccfc56c00,c0c0984b976e25c8720b45c5b9db79daff64ceeef412d3079ffa747f82baa6c1779224e88ca6b15c3c989b95552a424449a944130c2b8d4dd3785f77eddded8a01 +543cee29a1aa1a1049362b0f9c107ffda985d04f05c7d7a56cfac0c291f7f821f538c1b6ea04dda89c40e9aaa99ed3a9577bc9bb543ef802588b17bd9d7cab2efa6564a77c7cfb784dfd14b5cf0730e5d244aed971067d2e957127e82baabab8d417d7a19e5986ed9893d349bbc8b5fda6f0f462f14b1f3b6bedd73b96239c7393d09ed8d5d295b515c56d3e89994412e9a601d329dbb39d6e,ed9c47e03f533622a4b87dc2db9451e0a74881955b8ed09fc7b518ce61f5cb1d,3083f9c8ed96ee8144e3e9eea83ab9df60ae5de3de407e42307faa5181ecaea31ea7370c0d29c34bae1162128b7e985985fde1c8863a24fb37e1d31e807962aa00,f8577250e5b881a87d807d9374ca4b683e8e8bc81aba88f6721bb8541a3a30bf24dca23c7460f7dcea29e05a1b9869766bbd4200d661727ada9c73b45e94152700,8cdbb06b85b236ed568f3f53ecfdbe8a311247b7be24cdaa3b1f4ade0fc623c63b346519dea62bb34794d7fe26d5524f3128a6f4bec4cf1dd41aed7c876ccca300,5dbec62fe1900c33c81e7e268759a4585966cb7a700543f81c88ec0342eda6f6784e4e8b7ddafdf29e34f5de4968f5030f256907a6b7594e31be5aa1a987e32b01,e59c52e50ed609484caa13fbb3eb920520a7d80df986d033baf9e4c2ab17af4f11d9780980d951045451aa3b646bc1131171ac4f5e13bf692251141553a52e6101 +d13e2de7c38a168f48df8397f60ce7072176cd21e4abd0c31518f643a7fa7764ff2d075b56621ed7c12fd88f05bc7f840213b7137fdb1c135826286023fe42636344bbaac1b6d2335e95c22a434ea50a038d8ec1e82f3e5d2d431d91ca0b349b2f0ddbf0c3ecb5308dc9308265e5db50cb5a07013afe13dda67ca54e1db36cda41f3660d838e62d55a8b33e86d236e8c41cc736e11d31fc4d9,4533710c797ccff1389d528a45c344c82be6e9d6d776edcf7189b1e5d8a7cc41,5159e155db6554a500a849fd9924c8dde47a5355c0963bc45f920a3fb9afed8a0bf06f5f7e63b9ae4c59131b4f42221d3afdb1cecb6c334d1691728a5517580d01,4af5de47fe53a9ecd8fab122a16bf6f8be9d62860ac0618a4f7a371f1d53739c7b690f599c6548d681bd043c294faa40d55c959dc38a109cf98e6d53b541764501,d1178364e61a06023c54df8271bfcb06a8a8792d6b8d204877f6ea9b6e5b6d1b5f91d40c662f51c931d64b642a4964332aba38889c8388804951a6b525bb2cea00,f74116c719fb472a4be648399a6c0b1c56c328e7bac9c249f9b860f504e78901302cfefdb54d75a64dd4fbe089263642f6113b5cf41dc8b377fab3a87932875e01,a653f3cfe292b6e96e892832abba466917f9103ead9af8a168d5b2b77472577d654397bf0391e5ca1e6a553395d8f7d234e201c19ab6689d90a5ec4b0b52be8400 +f417e68fa36ef1b9b45e53f3abfbce3764b3cdf77aa6600e05a895b4606323539b2f0662de890ed7e7436d384f36234489988cb01977a0eb52ae0400f94264d4dd83e56f9925b701095e4d7eee326b76235cfcc046f1a3fe4adcd4f9e2279ac75b6983cba8ae0083f00d42431161c4c6e8efcb181629b08df27f6fd67d866132e4ce400a3be20f8c05dec239872f3273908de4e89801d6060c,227a339203397a215c7fd6310a15bd6fe5df69559ca3e3ec8a4f97ad88ff2c02,5f90584a29a6488aea6c1a01942294cdcc6c538784a575b7f5077ea832ad7bd7546e651c14f0d8646d5873f16a6fc74831d9a494dc5ea384e32537e17b91573700,9b46c66ff0686b7b51add100a58347f1495583d4f46a4e1df5d8bdac3df225f54c125d9b0819625e4fcddb6ed47ce5a89163360e2e1ad2d2a5352feb8d89ea9401,5d12321b1defc1adf28ba490364db5be7a47c5d73311f131bdf768efa40eaef36dc57b462b06b0a7913b6712415ba182209968774ca8af8dc93374cad9841baf00,287c4d901dc45b0b929752d6bccad7299fc06b983651e65a6fc72caa67f8d8ab2bfe3acc83da1da3bc5ea3ee000bf1a792fa01ffde9ececbafa8bd7bfa9450e701,3700d2e70bd63c49d52046b34977f8850f13b9ec91ad7cc743eea97cbf3af6b50de81c31dcc2fe914792e44a3cdb8067d537c44cd48509078d15bf4d5f7c8ac701 +1f2750a9cdbb2faa4fcdb30ded4f5c24a58986a1817f642c93ceb021dd84ea2711d50ffe4f36a1e25a11dbd706a0bfd25f8fca338506748dc2f630f07fba4e2721534c825a9d121a5f0d324fabd881501be15450794f78130631ca64944ee3e5465773a97c4ee84cf6f24615995839cb3be2cf09c6e3b76f8d89eea1b0d354009dd4e9bfe00bb0cf248cf3fe01a59783c693bddee48adceb9e,92cf6d107d6ce3a459a1ff8eef4e1ed24146091cd7bafb83d55c49b5891ca78d,cb4f5cc078060a2c2dbabd8184ebfa270fdd6336860bff0a89afebbeda84763223eb16268c12ee93b05c7caf0381812ea8be7867fc04c1ef6e66b816b3d8de4800,4a9635578f46046a4e5835b9843b299b354f295cd338c61457aafb1c326a76bb6d8a4e8c1254cd96723806c2e0d7463f23826b4e96cc823261c226cad806e8bb01,5de5a6d62f337f796c9f3f974a92f2025624d5169137d74267ed648f0ceb88677aae32d5b600f33c47a6788a8fb7cf1122c76e54710fa6ad2b1cd932a89f7d2b01,2e581fceacbd7ddd26ce008e573875b6f68bc7f7971854b4688042b3dc527e79478a2f279ae4c8cef45df465a69348f6ee2e6188b4c8ccaccb20396d1e9b0a0b01,44c9d46ca96ea93a97cbfca7ed558ab23357f64d0b358c8d7dec123c1df7f1e940f90661329bbd722fd28c0b585a3cc742b2b2eb4724dee3766c7c4d978be2e900 +513154967455f5ef3e2336d14a91920081a442e96176a808b5c4010573b360ba1e857e834ce1601bd0bdda66940655cfe945398e1b9ad2255439ce9b2420009e25a1c3144d5ed8dccde68e3110e940b23f1b11de0a1348a22857317512eacc483a45e0ac7384f7e9cce69875917a2900dd9637c2d398a38019ab46a5c63b087c4175e1e7d01d3f0d187787770389e73d7346a97e19cbfcd599,f3903e7cd8dff6c7e6ca382a0db3bfcc6c28d9a3eb95a17ef79780fd87bfc894,1329954e0caa57b30a23d3840c496442b1024a7bf57456aac1422b30dd6905681dca070e435f1bdbf24eb524663586fb71e9f5b46588bb4f3e48ddf97d76d1fe00,7bb13c0b837f7061c224ae058b0af1ff55e382d5588b7794e3660357dd8f988c6f76886695de2a76a00e73ca8f0c9ae82d7a8423d6b5d398017d926f771eda8401,2c1d682e034685b7a361564179e251a3d5c6387818dd42021d0e365be64d0e2f61be4af887b2912459e5afbf8d0d6871f122a68bfd658169c5a6f46f478269ec01,4cdaf18c9a675c426c5299d7e0e148cadde369d85b7c747c74539e5d0afe0a1f6c8dd37f35e52df44753a5af1a6df68654c49d533bb2f53f10b46d8cafbf15c601,6f7d693da2b7feddbd3575ce6eda8dd581abc1dd9789c7f38eb91a2462bcb97e35e92a2f693c2c412beec5ff4cd5af9f465fa06be68c9d75eda26dcce693473801 +8d7a13fb5c72436f26c8275a8c67cead36cce41cb41f804445ee601270c81d133a432de21d6d952d112f22be6ca293c865efeb9daa02cd7c340644266af38eaaa169e6df1ad952e9ced133b345ea9b1a5fb97ebe7ca250d70f6228cde37e23018a58f3636e937d8b39f30b3b059841bd9a28435d133720b72dd3f354e1589676a3e43d9f9236ecda7bcc6b0e8d484babbce1044974683904aba8,425a05bd33cb4ded0ee54269c2d78e96ca774b2e09aa17d8b22281d89934081b,9543e2ac1525cfac3d1743a87ca49d0b8c68a26db9cce5ec3639828821c0f85b2edefd0850d261a6e43d6e17bd2c1815b6ff90a137c8f072f2ca82f96e67c2e400,a2ccbe4bdd463ef07793c4cb21b6e9d4d993f046c368d4cf6a443f6237a76a994d2bbaa6ab33e60b8887f28ed36cf138fd04d02ef42adf5592bb5d07074a104701,3a2266a50714ddcc58ec0fbe66ec6ea064f5e495024ac0c8fda82c38d2f6cdde620ff89d8e12465576d0cdae473bfe66ff6f9528f59867493bc7ca8f04e0a3a300,cd45febfd2a7e6afe21b9bd9102962e140fe5f7549da863cb555d12c3f07df201e96579fc7d10c921efefd3d2f4a9fa780f228f5b1b2b12ea80887240d58a3e401,6ba24850d5b8f54c55393a84de07d441cc3d2d9c3c13a61832b3db100ad9791f2f5ac0a6e7b395f4198a7fd30b81649f6f4e9971a3b7fcb78c2877605552122200 +b1bbfaa81eba7317b83cf1da9b9178448feb3362280c0f3eb7a675b6feec656cb5201392aa9a555d5311f6d8b90137bc29986cef2f68109d0a22339ade5e0e9c34e331809366e894422a10bb428719e48a1ca5e05b1bcc9be1b13f15bc6d2b43ec914babce4d8d06f517088e105bbeeaace3f9e3eeada472b8cd4554d1e935e466b6c43dcfe0cae6977af85ffa6edfe4cb78997fcf3b2eec619c,8be1e0da9af55e6aea08a82a1ad7e1a3f96c51c9fd36d8f32602853652641203,466787c4032a7856e6607641599d9db6baff20259f15784c6115bab1d641cc6f3225669c3f49ad4b7a1d4c6afb2352286303acaa35925fb8a98a2bb06406cad200,2daf2c1a9389cf6b776758685e7c5ac918630803aa187c81806600391ca22a766224bede6368f5642ffd83a2a82d0c12baa28e23d522a88a44c7232fc0f7d9c600,d1acafa5a135001987d572b7ab12fd9cd73116e9405f64c5403e6a90264a850e20c2f58b88c972bef72f326bf7822260bd8906424380d38048938911997ccc2300,c60d93b4ecca60021c6852631383651d021231c0019c4afe0177073b92210b0419230bc85ebf23e0a4a83c4874120972b73493c2776223e4bf476ce995646c7b01,ed43dc35520e291ec4a529d8c00575081836e6ab0c764b456979bf333138959e72bad164f33cb7b9094332a6732082fcbd95765c505763b396d516cc1a8939af00 +00e8b3d1821c602dac83095ad9e45c54f6b57ca80ef7f2f10c167983cb62892c89939dd58f93074ad1891bb3658ed21ba52802d7648f84a7a409e6d8d534f7b24317ccddaee6458094e73c34444fbd0cfcbe9e900b568e7c46aa549a7fff0af14d2fac7d5184f34ef4c81c97bb8bdf47bec6bea9eb8f4d99046691d8595550422bc7f196a2013349c250fee0a67679ceb4dfcae49da3cedcb0aa,cb49810a68b79aaf7eb7b35c440e7128a7cd4b1c810b42882d016d2a5002c2b2,efe5f9353a8be21bbccacf59b392c86713cdf9db22a0f75b7e0dcad8ea00c8a936d353ef04fa1eaf053602556fa73b51ca34391a7b3c1b16e2a16585aebe737300,b3e170683c18424147134480b9960790b842a62723b0a1c27a5bd4cc2b866fa14485e47f9882965df7184a810e95654aad975bc8f752b58c417f1ab38b72107d01,e926f3897ad624f5b09e7ce0dfc77f61f11d0a0cdce4c56b7cc5df8371ef96e06b9f29bcb74b4e4c85fc52d83d296f5c635e88f828169c1e72a07933eaea43b601,184b8486228d4ac8fac8442c158d6f9211116bd3f9f4170e89236b87f5ad04ed3b11f922e392434aa2e60c1adc3d9133e6cf394885ee5dcc1ec0961287dd34f000,1c5e3913349b6e8fecc39bd1a97644197ac4e074d5580b1305cb133ece5a38cd288c30746e29e48679c72d28fe4c4e88f08671b84587b82ca3dbec27521d379901 +f7f27c865eef8fe389070ddbe61830a81de11115734c80b05ff1c3fc2972878f7140065036c05e583909f4e5dbab794c20e094d9269827f47654b011fdf80c1dc67e58778abb1b24ed6414497bd23ee4fb83a6172567f7df025bb62a3c4bfee146cb868007a5c50c645f4c5f693826049906c6eb6c4c665628b6f66628b1d032686bab80442b9d1d2bda284b6815177521c5589f785ce56d25f8,67831737baed8a1a47e57690d21e723b2d9b61476e092b2056801b97ed32e4ea,a6e9e6d2582508cdb83030f10d1233b3f0246243de7c627f4c66117dc4fe110235fae0fb0dde395742931ea9fef21875c137ce5c3dfd3279ef13ad97c46ed02200,67de2e794b0f6f0b04a4daebb429ffa25df1e23d855d1f854afaeda5d7d6cb801896b704199ed0afb4f2db5d82357bdf31dffdb122f5f93c16914e0ec033ed8a01,5558171a670fe4a8db06fafe3eaaecbf2190f907ca9300a9bafcc416e74f63ce1228edb9bb2febf20bf0c3772f7d9e14ab1658178fd3529908c20fc8f413c4f001,d290185b497c2ed8679637dfc63781867845eac7fc65650e8cb144c4762a61b072be96cf636645ae5a297161b356d9bfd5fe8fbff1fbcf1ecd5c9afb1ac2770c01,f3c872059e6a20cade19832dfc840e03a183be048a1bfee8e3028198b0b34bcf45ac89213cc03b4c7c0fceb758aaa283e43f92407b646f53ea0e3c0eebcafbc701 +da6b902901c5a4bfe3ca432bd4cde5c654eb374ebc379024f5ec96abb2deb0647c6fac8691b49a65d668097caa769873e0ceca6be245cf232d28ad377c7f20b52edb916544d57167b7d2857642327108e44ae6ca424497f398cf609792a98b67d889783429f58e7c795b83e4dddafbcd5f8df73b453bf9565c9de606698e44d2c424c3eb9c3579b413b1ec8404dafe4347337651d9ec748c1948,ceea1624c70ef923ab342fd9b15fff7a062c60be241b01e6740e38496d2246c9,1c257b6897e22d9db89573ef6c8e205215676a46dc03cd2818aeabd37c2df1882ce64cfa04569aa34371d4c3a6a0a1b9f9b9e7d5b24cce83b0a9a0b53679967900,d183befa0e97dbe96367fc79520ff4b07752ea6dcc997468aab8d3e73592e5a33e337199bedf684fba04926608c5f4e993894e3d54543553aee776caf467a71501,8d7f5830fa0385b5ec6376b2b5a1e74a4d75ba3aad745d0b62b31fd82d7485de4990668e5921d52e1e9d8b71636ba8e0309abca78b6618fc29ada60737d2b58c00,2dca5aa75785969e0ba196da96299b14b05ca91b0120c44b00aef479b3b597da48cf8cf03ac5a567f66b273a74ec06a1ad029c610826fc3100ed92f7415d797b00,9eb5cfd948d07c8f74f5d32b1489f9ce906e39b624c51a8e60bea71a206219eb4a6f455504d88205170bdf230653af0fe8ade434bc5af17ef74432fceb15e73600 +35d0fabd4b244f6cc0623639d652384ec994fd741c5ecbd1260c5fd2d283aa65dbde5559ac6d4b629986b7bc5bd41affd90052fac046e97027d4d9a66facedd9534d3830eebf273237b6562c7bfb94370b2a66c47b21abd0a40e8652d06cb40744331733e2fe675fad64155f7fc66a710b93283eea97462b2b90390b4c0d1f39509c7d3e6b2b779b1d03732d8ae0564a3e85dac3f44e89c54538,c0e7585ac54699da2aad7583ed7a8eaebfcf2165ad9626f6f55b2e0ece9b8d2a,2b6b2b11380cfa0ecc670f4afeb08715715ba67bbadd3a3995dc88a7b2cec5583954c3fb21a1dfc03ee433b81066d87cc7bd62a498351f6975b8dc3c11ae376b00,b81d46c5f0af4c4872a39ba99e8e107adf9d67fa12e3eb3a24037a3d509066c7751764b6c878f8d28430a0860c34384c3445e623fc2f2ccefec968364bcd70fd01,647a56c1d0c56a4a965f2d46b92fcbd72b106a9f6826659c3af4e552d4cc6bfd44847372735d6b86cda8647d42e28f606bd3b8d4425a5ff417bc5523e01dfe8901,f742cbea583f98a69239b96f81473ad9c5f3d276e632d8abd8683f6c5a4163477c798a7278f3835c8b08d5e403734a17c02770d857197277c872dfae9299ef7101,7cb3d07b9e8a37f4dc24f704e5586c1c9a9b1fe113cb970162699274ccc8e7f74f200e7542fa2aeb9b80a5c74934ab0e4c7ad8d2b13a0f60c115a146b7bb103c01 +786b12b800bc3517f404712973fc6c96e1342b1118673637ae1044d62942597ed5ccd2aec54233aac16a22adb19dd62aa01354a22f256aa0b12ed61200f24d4597f983ed32b8dc075cac17b0da25bfbbd3a34ef97f75e849df64f26c6c9eb1eb57614cd3bf1ecd51c7d5148fc6c2460e05ad30c68dd0cbb303caf1ca153583e2ee41871742751adced413734ef7583ab021485689ab381d4a622,4647e19332eba1c5c4a9becebfc92879fa2d50552797d3f0160c6041a3f23efc,496eaf8454e1ff48c8b99cfffec4bb693869cec062c742e8231a3939eb921da715b6681fba12ab4ee1e59b4b4440c2bcf6a78fc4e725af32cdbd039cc346f2e501,af8c9074121b1d8c0133f4d9cb0810e17bd55b6beb57042d4b842b2b624b8cd92d81850ce8b9f3dec5cddd0d97846e19119a9f7a53ca2b0cf50828abc6d311c801,52f3243eea98137cc84a9dcbe20fe58ea2e98727f5fa36c2e7eceff5568ec02c31c66a3429739d5f73f5350320e57ab10b967c1841888ecb0b54816628a0983400,293c6d4344a4cb419411cd76e21ed03161cf71911ac79c5add51602e55e7830475dc689f4fbe4e35b7a70724f56f07ad5ae7dc6889d4f35f9dc9d09e6f82ffb001,ce65d2ef1ee743a95d65fe710fd33bf2fd9b6cb5b5fa6f7289eea3079a3a2ea608f3423e35c80356a5a098541983066d8167d0823fb88d8cdfdcfb013d280d5100 +200768a0b1d05f6da3dd861c5eb1f296f47b62d388811f8bb46d839cb0ab18dfb31d81a5602d2719b727eaf9405599709d5803b583878428b869ae91cd2913209a30a2af8839b7512ae1c6ef157dc94ccb612e476cd808bb54e4b72a158c7e7e3f310e43fa0214ba1db0ac0b0b7dfd30256f0dd58fc27abb10fbfed8da99f5b1461aa1fdccbeb24695eb4859b4e43fadb925bf1e2c6bc8409165,7d862273a3b30f8c9f8863989a536a33e0d97c73a77f7e95d24f6dd4fcba56b1,b074e8f4c51ead7ee9c420b88c977cc0d5040ed46117dca83aeb2767d1c1019933aae6e668aad5508a8c7ed602bc4e73ea2b7821456710d06665b324ae372a2100,68e9a71abc2625a374e0c5b9844115b59f496dedf42f70b85ab2819ecda58f0644729b5189bc27929aeaf628919874d3a29d1e15cb92a192fb39386a20cf363600,f529ef3f2e6ac0049ae5eb9998fae84b013003503bdf673a6c899fa4c16c696f4123763c65e32ce00394c52a18842176dc971e1633d8ae89911b8f5b55133cc601,fbdcc0ff5f2e9b6e44b22270cc17b49194aaebe68558f21047b30a27431fe6603362147beb51166be8826a06cc3fb36658efaea3f68a839f5614147bf93e5cac01,ca460a760b4bf6dee8e0145d5e8566c3daf277bf4c30e346b4ac3e2642216a1e1fd5dee8a524109f4676f6c2a03bf1e0d3629e761e521178ec59dd932a0a0cb201 +78af6e96f57bc34a591174cf62d3cac44effe89e015b50d2db582f28eddb3be6d6a201e196261474f634e9af2b5557e3983fe1a6da2974cad03524e41851a25d1f88f689afa4c65b2a5e047fc1de0000d1c1e642bd1a08e9dd81ad0e96b256dc6bb4a51fe47aad1f703fd9c88b231983894cb2ccb2c94253ee4ac89520856d518cfa5d62c4e1f9bf9bf3e5f6011edf8de23ffea34f5a0ddf6407,ea53aeb8ecccb3a5badae3986c9969442d70f43b74a2897a8ae2152664c2c3ba,c8369f43c87908917f996ddd2cfa98a099d4e9446d27d23662d5c3193344497d2bb6a79bc0870cd076ef70e4e80949fc682f9341639ad5a6c9827d7fa114ccb401,38d568695a70ec097bd93e732166b041bce0e485381d7729badced66e281ba7a6cfae63ba2ccd24318a53dcf75a98a142b40265c59b0177a8edb34b2ec2f4a9e00,1617b53bb7449a13ce5fda9ebab64d3358cbc1fa97d656ccf766cb248d0c77b876c6901cc02f4ec5f43b6d8945d75256434f0f4df94c90c9252a5a9031ebee5100,fc8c63fbe39ab7f097dab6160d0940e81871c0aaef5a547175bd2862c42136f213445896cfff494d0cf0c5d0ecedc95ab8d491ad326612e24088bb656733f01d01,facf876e694bff252dee0cf02a0f3540f6c46ba027a4791e5c7a6e3b7d9043312954042874ce0f4bbcbe0dc008db2c47d4f148d2e3a9149c886cf4f2d7041d6e01 +d6be2d82ac7572990eacc94d50c3baa2c72a7d6e896dada30fd398f5ee2510e391916075f6c8fab773c32e7c43a922bf0f261156a4daa2412c87b540c027706033a5a244996aa9d98a9cbb7d0ca7f946fadf0594e5f9a3070514942883d4a121241a17c5e5ee051011e7a8b2e23551db7fe64e20fc1d57e6e5f98f649b0aac7b0aebcf0a73097667c1b15e4b1e303912c7f5dffb495436ebc20c,68bedd3e7347e2f9694ea1fcf9997b6707cbc65f98399eb000dec15beba4972b,c628aa2270b541adc394247ae9634160385131f9823fd697903b63870faf825b2a500206ee317822f5638db99b412f5dd52ced12bed24d3ac7d3141a4dc9655400,effb1ab0e4c5b39a3782ebc7e2f32833bb70d48e5cab7938ddda1052ba4b68741b7b58ab57c394ddf8b17afc1ed8b61aed255a94ce4b88d9c64f577227557def00,eb66f978f5ab72b1be415954d4fce152253acbb1cd6557ef5f03c81a6a124c8231f52f18a2448a74b814763fbd30332d2211a929cd5e5c25afbbf94eff22811700,ea6e4cf9e03bf484f125c22321e03735b84e285ba1dfb4cdc24ab1001718a4dc78aa52b408c4f6d45c3f1188ceb7a93722bd683f877efb63a3db7bd0278d19f600,a95b7c8e8acb2e7325f1d3f672b68010a50ef39882aadab3207d87751b97072561a3b7b00cbc5f70168db9c43f1c19fd2f679bbc8ba9a306b6e0f79aa32b72bf00 +8353efc63535d464ad856da289d021d5a2eaa9154029b95afbbc5658d611a8be9793f9faf3a59869deefba7e547b92a9b8eea126ebaef09362ee3524718a7bd97f613c2133e3ce10e93522659e37b7b984adee2831672daef2cbf074ae1dbe6379dd2a27c74fac01fa5064fa7aa5680d155c1cb7b00f4f373e9e8cfce3409f2421370324499e08c318e87dda7fe290c60ce2a60270bda9d64cb0e8,771dc778a055d84b7167657b88dc34b5fa70fd0d92a5986c13e138c8821e84eb,50cfd368027d7513d695d85290cda54ec04f500ba19fc066318514c47ec976307d7564136977a2dc0422ef9f0f5955033ab87a310db0bfbdf98b430c4988c75500,207b07d5b5bedc23ad6014bbc615dc354a16f8e92198b8afcfc1b1259b09c6fd147d93a67ef53b6eafd5e3dc0594edb86c9d0e84506eddb14c6c21db355da3ed01,e458aca6e7c170455ec55fc163c8d02beb988728e9038cd1a8c911809f680e5d18acc6d2abf72154cda051e73af325ee4cbd77a446fde3c1cf1227ab2cee030c00,46e4cf2934a2c43097953e2fe04ba3f8299f1ad5be268ace3104951db9b5260f001d0de397a5b5407535370850192553e41f72f3db57dc4c833db2a6d75bbe3d00,0d67e8511ee218caefc0048c9ac12fcd19bb8f33efb9e19c70272e2fb5b540445ed073e7db5cef6234de98c2916bfe48a654d928fb65fb9edd31634b11d72d1801 +b42b68617451b70b8b6093605eb0c7880a6c6f77563b939aee620d3bd338a4811199dd6886f2b103108ba85bca96f8ebd7ac59d4376dbd43174fb932dd6ae0c58e61cfe8a76adfe1b2e5c1b67b27e48369309497e0f1deb22226277fdc7a1f00bb680ff80084b7bc12625d511533156f85c4a75984940cb37bca4a53e34f9a1f9fcc5515b20a6541851d29f6c0dc0cd561584cec745c7e10efe270,a7470c25a03feee6a70d6d193387f899dbdab3a107c85f8bc49741d199e1118b,b3325c57f610073e32c791a76a5c8df98cd8687e63426e8a9e23914328a78a344484ce70ab084e12ec8fde5d768d99d1a1f36d2b3832e25b6e13e843d44a75bc01,6e74b8b7603b57a2bddc6e93a7285f73d16f8ac22255d376458f0fc6f72904e830e689e0694c2acd67967579257f4b1dd6923f175593bdabe16308ea3b92fc7300,d3cf6b6866c1c58c27f7d726f4e56470b81d99d793aad93f3e339d347af105f21aae4c194ae98b69674c3c7c5da629725fa0f0c5803046c819137df6f2a9f6cf01,8fb2c655fe9ec060f5d0550a9c831b48bbd6ea64dcd8a27fb7723f0a53d7ee4102b8df85e092c2c114895817e1552e503abd6709d5e3dbe4d250f3e99839cf0d01,1d41bc7b872a6252a0e8d3eeb74bf8fd3b546c2c1eedc54f3585995ac415b00f1b130ed88fad4b938ba88c3b19c738ad256dbeab77ad83e625ae128a82899e7a00 +86ebdeb66d0881f4f2657ec9856a1520e660d915a395932b09bf9de0428beb344526e5d593eb7e1bbb59a589a65d8d49ede21f4cdb835a39b0787581fb52e0ca2b07bb312cd2ceb6dc253fad546474e23d826e07d561d993c45bcb7681b30953cf6610a0587c21e681f7be337dce4a9ef09cdef8fadfcd86be883e5f76ae89478dbc066f4046dfe71456791e944abf722f9486d463df82a2268418,11d4bf1e958e34cd4c2e03776728cfeaa9e326bb5e059b01125b178a9c174fda,51aef0bbb92cfb3edf824d46e17428a4e457c38e161bef05338021bd57d5eedc0822ea1be6729836f0fd1c0ddab344b5025d2a18bef0ad649b35e12236f9bf7f00,013fddba48e0a238a419cf647df0cd00a881967e0133285a87da9670ecbf35060e5c68af9e3868162597bc9f4d5b0d043df2cc8bb333973db5958ce6af0b376a01,372ce12fba5dc31fd6a9484fd3fcad6572004a557f59fc82a0a0d2fbc645ef280b9933407a73c7988545121f5b1a196cbb2d9db87fcc5539dd2a9ff07c446d9d01,db62d0df261290c2d7f0fa8402c0e03bf3c0e628f1d6e6875a7d7629943d583e20410a6ef08bfc2b5f03e3da55e7ade345d81018b5ffd9e7881975686817435801,46a87bcf9b18597981298cf17da5bdf8f72af21edaf638da024ec82ecf49d1b216dc76dba3137d49efa34766710514569d0ac1f93fed0ead74222c3654294d2a01 +48932006a08e46c4123eecc68f9060417f520ad839721741b7ddf147f9ab072560867a758b9d658ae97175727674ff6308ad06ac15ca9fa8524c066738a0d1b053d742c3066fa48909035985e6f53f2c7ba4d060d058fc58d76c9c49e724300e8783ef6832d33ecc8ead94fd2489e2f32393961de0baffcddea380e65585b3bd5a3dbf70085918040597e23f17e5111a32dc4e7e03e27b7a02b571,30f49e0281feb7f58805f803593e95b34cfb0ee24a1062dfcb86958d5ab1ed0d,fbefd17338d2779cf47d1143ac1c6afa0154e14499237fbd4377bc9a55af781e470e1f87891f79fb87436863b03da5e16e1e7bac179e75b11c30bdaa539deb8d00,6eeda3a37327f8a055b05406d2734fc2648f6ebb35bd141b211f13259493184c67ded700ce0fdb2496d1fd7b3a4fbbcdc1be485533cc40bc96a19a36e887939001,1ded479b3247a8044ac7ef7a5fa6fcf6b2847cd5c51b1181f939002a7f56dcee5f89e2ed3c0db2d870c35449446d10e6515e8e1b343d65e70c8f73d0d42fb23801,f0194cd8c2b51d41eaf35936aa74b3825aec065e75cabcbd89ba2dd2e4d6184d032bb34a21a60f8960afe2d54d30b0305a24efef19f07e64bdf388432e46a0ec00,3a2944d7b625a409cceed09607a611c1fffa639fa0b2e6660c4ebdfc7495c67f0878e891c16c7048cac47ed47c45200608f4bd57e980b2a959b93afb6ff2326500 +69bc56c65114db05236d9ccbdd781a79b45be283b0358eb78f5f33c115fa33bbeafd292ad566d9d836bef329dce98dbce2e17f3a4b73097dd2f7ef50aca4b0e4715b07815797ee65f3c7ab9d493f2bfa625d54a3f3f5e1d3685146d886ad6ad0651019b078e4551e56d511441333ea6cb9ba575186b5359fcfecf93f3ac27eeaa2ef3ba3fecebcf1b4446120c150b527662662c73a2edffdedc843,0a5d427bb62ca6faddea4e87f5ea4eb08e9e292a17a91b941a2c1d5de2953a23,213158fe34938feeadd74d5a17f3c98155d5c18a1a7e152022c0d43b9ee33a2726e46c5ff58791f4125c47ed8ad5314e65a396a51c07dde4432de604088f69d401,97a2dfbed7b9cd0315f2b8fe304e97a7aa0256df550a949bff41d79de78e7d7029ad86191e82d18dffdf50ce0fdf080d745d8738162c04f9ceda57f38ad6ef3b01,45d88d28c968207c01453366edb420fbb595893a2ba7929ac4f7ec39960654f841c1289590b7ed2b7467b0924bbf4da05126671037dfd796eb524f098bda0d7f00,db8d8d85184bbd795f6839a8d3ad4efa6ba02eb37294f63b45f7d7a7dad9a0e07cec9f68622d5e99c23f68d43cc16d967550740b4e2652c300b21480bf43703b01,78a46b056f0a20cc8d40084c3f1ef3b6635b1465b78ba2f1df6eb2a9ecf06f576c8675ccc1182dd0603c9278a75f06a0b98fd77c0a8d1b77ed87c4213ab867af01 +97fd24f83ab4271b0f5b93f1009c114118620b539b209e4da4e10b158c17e44d523363172848fa428bcd9021f35ff034ef82c9f33fc6bc40c9ec5f289ba2a84d17115d3c92048464a96ea7d2f7682ad9aac04be2e3fac45eecfd2c8d36a1d998252504af0488aabd6812d9b5d3c8b73a35696e7d53c525ad8022c8ee2be9b9805c264c44b55698c1da507b50056ffbab445fcae462a73f538f7a8b,d63a99706b9f56fb18502d723e73a24455e4d1328fd5e4b93aac3ca91e0613a1,35cd3d801fbf628b1f519cd1f802c5e240a9cb7ab048b759d05a985debc84d3424e426aa347e4696939081731eede63b4eee113ffb2c5c06d839d28624fac07601,2b9c11eaafcdf45ba605fe1ce01799e67cf8dfa60770d042992c3aeb95e5c7c7083096bed64d7516609bbccfbcc99404ba24b5dd240d1538c9f8e55472fd48c401,6e7fcd7c4c09d902d998f3f09acd372eca8aeb99ec86df135695b1e5932c81267a02244ea3545e2e6ece467eeaa4b83bd619d11c6638392b330698abb9f03dda00,74d0799436d59927b4eaa43f7b9a0ce42411dfdc30786d0457d087766a9a3bce0f2c6621fa54a35741d69223eaacd171c675cdcc7c693d4ae3ad6863449a34c401,e6f7c3b248cc5492e958323b97e65e6b49113e1ab1bbaced5fdd593b3b0dc1aa2e36d37cd1cfaa1aab5649310945086ff8a35b401dd99fabd8f0609cfe1dcca001 +ffd3b53a8d5e740d685ac9b93a45ec1a6291bba80aa8a8ee565edcf7e6796c5e825414ba0c59b1ca01edb185dedc93d8bbe730bd2a95006050aa0f6c8ab669bb6deca71b27e1e6716eb4823c9c4799accfbe08ea58e640ecf286058f53e73a256b233659c57610eba64e2c68370530f80a0aa6156d835f0c5388e919bea19ca23f29cc1d63d58785dec03f5099841f41e4026f56f077abfa4a1018,ced90dcf0430c4e946a7dfc45d9bfef94ca042ba83aa023945499f938a1f3e81,2085c68a5750e308ec3637cd441949f7034e24d850d4b65fec232996c0256712311f8a93e7f241e88db7b91833d70e4667de7ad5cb19c60b63b4132ef53706a901,d0e25d18010c5f16a035f198e92845e5c2562edcd95300b5854fbe6578edff7750d7b282c1571c40b4b90b428398ff1756af7e3743c460798f4f825b6a479cf601,92e13bbeb1f9e3ca01f9a99f17323eb152b499a2748193874ed8edb5754b971135f0dcc9fb5c49559ad962f786e257fdf32ba4b182da2b0eda25900095c59cf901,59d07d227cc737705fd945c28d09ff4b9e863351e5d127e189e8781f70844d7b0245e8c77d5b68b7b8f98f5b8a8b807617ee65f7863387008096ac41d921f6ce00,f5beaf85fc92b5063b34a690e020b337a1b13e0699a949a0f220e18a41f0e2f2291b5b3ff985636fb2cc40024750a76032b0a3f13af8dc6e5944fdb642eb043001 +49bfdee713988703ab7804b2cfb65c397f421333cc816a581c4d7fa3782eee2c5140eef52c89cfa5186cabfddd87fdeece53e0d485c285aa276974193684e6c6a8eec886b54fef8f541558ca9bbadd0be2404fd369b5cd0488443bc1e615fee76111df0ae8aa78882a69ce0be7df3395c09fcba31be1c93051c2f97597ee3c9c43924c67b8f284435ca73109f8c60b4039cff55a525de3e8c54195,cbe31d0612d8bca669200675adcdb6f9697f68c6c006d27d34737b353d19d6b1,dbb147729ab762a60ff02f6fe70b9c525b0b31b9fb61641c61a76ff3c03c1a891ea401ca3b70f64d9a45d7cc1945b43ebc64d68919e88129f5626d2b680e92d901,ab1c9f0b2a5339060cf022851d7b05f4c08f4c90b9e0708009d140c143e2fe594877139d0dd7130b7cd943b9aba6b98c7e98c712d806fd005e09a4ee9a58c9a301,f6214baccd79879dc376a3f95cfa08277d4746e6f281e4f6ecc3d5fb89f0922161db0c01d1e4c355d78dca8c17f0c5574f38330c342bb5c7a48c31d3775bbedd01,96c564f1b458cb4aa97cd49b0fabda352da93e3b9f67e95b0a3bb38766e5476517362c02b7ca0901c478654058f54296aa3ddc91959ead7566c3caf3ca2266ef01,ea1124dd689aac90aa9336611db3333b1109a1c281f43a94de4c0fd9843dbf495d706379251d5a7a538608e216169e9df70038542a94191794cd8b4fbda6897c01 +e29476ff12e7510466213e9db99cf3beec8aa571fc3f1d2a3a17ad0bd73247cc1fd5be7470d43bc501d09c24d2baacb25a7ca1c2e1570c9be2487443bea4a41e6d3638fc205f347613514e7221528e48c10f5b5c8fbd6f3ec4f23d5e59000124cd0207955124411eb754dc92a30a5f7a2fe4bc67190c79fd4441d81b2beea1107eb8e7ab6388c0659bd5fff3b3c0e104aa2b98b59d630037505f96,cc496f10e4bdc9ea006e4571b8ef5d2be80e648f3e502f04be2557f82ed82465,66fdb317a369b464cf4e524c6cea48e32afe57319267e80c312fe1c42a771f044aa2c2167165d40ae1bd67907aa610f02d73ad475d6b2cf57261f19668c0c1d000,abd61ac22ef581fc01eeef2795e02240e3128b45cc04fc748708ee3a9cdfa9f844da4ce358229e2e5b4649554b17206611ecf8653283b0034fa9fda8b63e9e8901,6ef2d4e0e1776e050bbba599b12b3abef45337540856b926cc1c9f3ac685a18b7bd2f339b2baab0c741c5680aae092f84f3cb514c59c0daa1c019df5b994c5f501,d603ad44aff0736f755e547622ee59a67789fdcd3e7c6e864e4b4ab2244dc935004a09eee07493ae01c18fbd61c14943c0f7eee862a332567e096cca331b5aef00,6c0e8f4225204be218022683ae09e55392ba012de805f1f78af5c87ffcaf3b5879b260c48695401900cc711ed43299ecd34a740a6e877cdf9e093e3ce8c0e4bb00 +50f831f5a177e8266b910f74857e0f46d8557ed43b35c3084aab73a64139e053abab177a1ea479e5543ae152bf3e017ff2ecf62e215d6f18cc2b736e7cd3742e83e2bd9d7f0e1c1cd62299b317216a0727edda27d9e12487e373be6f5b485935b61bb06c377775d76d4894c30ae4499da6d8a7585785271141b914042613815cc4141e71a5745a22571479914ac670955ee802400dec693082ca1a,0c8e3cf5b8a9417107a87b3eac4157025ba41d66a386eb24c5154f3a18e749bc,b3fcacb62a380a77c7680e33e0c32bd197c6ae1a505e12e7a6728191238997e32878e18012b643af540ea9a3d5f03742fa50c2e4c8fa56e2ea7f0cc4f9da386600,1e3bf4cfa9d124991b27524f6d193ae0a39cb72aaaa6f9bf7f87fbcdc0cc9861649d519a9df8c664c1780d01d13ee71b32341c45bb48c0914c5b05acf42e589a01,465b4c4d3624c0a73de81cc1c0c817865f1f7d117ff0712878d67cbf352c732250817ba586465d0b5d4f947e43d4694297534bb7b302c94a4daf6736c5277ed301,23a280a35d62f8ceb5a43d33f6998f458bbac6e8a6daa75d0d3d9759a56ffb4554a4160c9d29a7f04736c3c1126a4cdd5b788727b3aa7dc6a37ef41470f0383100,05a1198bea8be30e3b2246ecf27d977b62092253d04f32fdc50ca2a138f3e3ce1af24792207fae55eb102c16e6cd369bd136c6c656c811e7fe7749087359b45e01 +56c053e4aca8887225710c0f77c38804d1d16dec40562ce577115aa6c4a55ce2026383e6d988c2c22f6383c1e1399487043ad38b8ce3aac8cc5b589d8362d169b563512c630af0e9b43460d28c1cbacc162d9d4582f5f6eb7f34ea724baf0d3aff0e9c349b9bf4f3f60a25f663ea6faf11388348af2407a21a93fa2ab7f8cefa5ff19859902270219320aa84a56741417105d6a65157aa986afa9bef,58db7b534940052711fc355eae05ac25c76b45c6d12c825e9bd703f962e0b596,2a17cce07fbc5c67c99318a9643b50312bc76b58ecf49cad1c3c5bdb76d0c4e31790e9669318cd4fa79733c0e8b45af213a805b6e1ecca4c31c52958db74277300,697b083cb584899cb2f2ca0acacaba7de8ad06883e36b2879280a477336175a345edd3cd9f310b0436929ad7ebd8ab33bef4153192aec2bfe84ce7bc455e361001,61bb7864f9ab89064830df75b0d3030f02f89fd7d8163454924cd8b295ec8e1c30d3675a7a41fb745f2d3a786fb9c44ea5ec64353dc50e0ba217ec6199b23e9e01,7bbcbdeeb48c41eb7146b345fd8b17294c6668d59d037dfb0806073a917803950349e8eeccabb3132b97bfff0a9c2fdbe0e3841f0c7923e3a20e7bfdbd548a8800,c4da225bc92f976c191cd7f9a265d9839df2facb795391ea77c0f75f3a0da96c3eef0e33c675fdafae98971d741e7a61cbbd791cc71d2ebfe3c5c1c82656141601 +fd955c63ca0e3fcd148806b8f0469bb1cf4d2e2698dec9974873fc18d50ac3cfc690d53c70eeaea04aa942d1543f756ab66a5d74bfd12739f2b933eeed2042a548a7cd18d90b865d7a8cd7658815f905fb31b23a389402eeaecd477fbfbaef90b17878e675b036d07d12640b3e95570d80af3188c02b51d1d5c7474b666ad303ab53b3643b972952163dbeabff9ea1fd2c831946eba1dfd5efd02ab1,efe07d99c407d3da507022f09c00e84d1c299b3b6d29db8a2ed86eb423628290,bba5d308e43fe13d7e9a2479111e8cfbc61d94de60a921dab306660ea84cdf47221016cdea4b53358b97d358ba463819455e155f7b7055c34686384a28edaa3601,0266124b60fe41e22a641274f28b3a1ff2834f0d2247c7c28e06129144832557722d93676fdab02dc87cbc65db5f25687ebbac8b4768470330567c5a578c69f201,badfec1784cafbf305b5d9ad3cbf8b723663daca9e5bf1a5c7090d50bbb2d43f24bcf0cf820880e8a832394df1d76b897f154991ceda75fab0133558d625421e00,109c165ca53800fad88f817d084644da5663b65867b562eb4c0dd56b40dcad0b72baf4b4d1fdf89ca2f852f9f24996b8573d3b08456d08d578437bd24563a77001,e2c27dce35c3234c5f6084a435251a6936e77ec4ba6e3b724abab5e0f09e6ec4723d7e206990967454564cd1866a238b9ec5998065d883ce2cd2ffa7dabfef0e00 +772ab642e59013de76491b61d3ec51f522dbb18af446b2eff8449f7f199d3c2436cbd96f72841c6b00b96516388fe470112d890cbe63b04a18d16f4473bf41c2f1f1f0c6325a0df39c85919c4ddcff5e51965b3e6e410db52f49dffb32c04eb723d1326bc15ede488c59c4429520305951de527d67ceab89850342a73a2fe460886f9e1fe099e7502995a00e0b04c5d72234f54e2528a1e0b18c13e0,9d84c89ee19bb19fba67840a75c2b0827694dce7c54caf3797d1dbc20c414171,147fdad539aa6170832201116f7facacef7b07723f4fe4fd941edfb5f07e47614f57a65534add53f5b3527b937ef5be1f11bd7280acf7e169d890703c85f68a400,89f2462f9be2dfac8a6d373f12c7baac823d9a035c65f5f8948573aa0312a50b24601f1c6922b911275de698be6c654aa512c138a9a66882915e7bfdf481bcde00,fe537ec69f1763cb202aa08e0c4896c8ba049956b7ce157ae94bbb59a961a0337d737033a628116ebb3004ce6b34683e1bdafa89c7dd9990e6d2cad5de2d634501,e00e82624826dad5d6d567d0494ae635bd1594ab62829109f76a3961f38e0e990b22865cd7aeded57d8ef2c8cfbbd31c8b3c8e74934a33f8fd8903262778c45700,28668acaa06a94ae6340b968d7352fb2fd97d0614df17b148b8ed162644f24563a689e32f3c43a46a92d6d66ad028cca27f301a2df8a649ee4fe25ae476c25dd00 +793cea599ddf8d083e89994a2126cf8524c229d7ecd721cfe9c6c9b2db2f6e03ce2e90909f3ac9413311dca501efb485c2fe2453f1d413e11f8ffd3dfb4a1873fdf7b36788a85ef8857ff4938dea0e39f980d8025981e7dd0a4829f00f056e35699a086390cfc20071852309a8425ad7a5ac6139698a0cd3d31076357e8879c491475793b21a8664d340b480caa7d67f2cb5a1b868f55131ec6dcd3d,96e44ada52d3e82ab43cc6fafa7337fe45e20bcda1eefe7ec15fd54348f6106c,d0d24e0dc2019247fe4f1cdd7ffca0daae42110c2bf86b81da5aa87c54f692b94d346b7f9de901855cc2addb877b0217455a06e13eae07ef1692ac7bb8006bf401,3bc5843717a52c883f8aa527637e9c0677248deacc804158188651810287fa355e63181c8f772def5a166f767b1e724d9c7e7bb457e13384deeb45c98a5e2b0201,761284b8be10879239d60510ad38ff06f2990c9ee4f2d441419b40ef40208689231031ea8e4a5d8663c04a5fe5739f854c2dfec09ad0ac94aca12d6d6931c4ce01,b95af79c33504b13773f2748f0d05b8faf5b1923554d0062db207d79df4e7f2d1e090b57885618e4cbf465344c3062ca47cf005cb32521e11933c26821bef66201,aa9e6ed360c9a651fafebf2e04bc7ebc3f5aaef7581b36ca191928000d1837ab4728d461ab9cc1b43fa087f35524c398a3f398edac025ec150078e6cd6e6571300 +e99950d1f554680d1c45973772b3b3f9bd53e96da6645d0d06230355e52682953ead66f587571baad86c549e1921b0c9521a628a100348c12e00e186355a3460232d7dc7a2978779575f9e2d9106565fa0fa167c85ebd1fed1aa8b2c093c7cff102bcc6f100ffe06cf14e00b01b06d8fc5501a7f32d4750c1ffce1c807ba3040eef4a477cf380b83026c4897f2b5d5c94f3e8a4bedaa9b7eed03ee48,dd58b7eeb17d942cef775298e47ec816db53f706007c8b58c81f2c62e5aa7af4,0c4367435add5455cb4ce941be78627be7a30caa9a2b818d1733703eb531bd19202497ecdee883282ab936842d2f7500ad89c442c8c5fcbe8ae68fa9082e01cf00,a4823f0bcbb5909f301e08b4f45a9be0b69e0b036284b27704f744cb371be37b353ab6dddbb42be8801ef61fa7ef50aa3af843684517ed0f763aa713c4d6f00400,1cc2330827c85239825f6be68664ee8174b05d01a931fc12571c4b469110d88f09f5b96de27cafdca503acc58658ea6aec16f8f87f493e15713ef5be80fc32ba01,0cd508f483ff2d371fae2aac8615eb0c1838ad2a25cc731837d10ed0275b33b4081bba01f72e1cfa0b98dd0cf7313ca5a458a17fc6956f8bd6f50d9ead67569b00,4d48110fbe651b2af191773e3290e3ba5a8b59afad6b287a00a49f8c5810ddb311d35dc2d5c6979e5131af631f29bd7fab953c0367b3f3295e2af1ca655970bd01 +0ed3da4be540c8c4525cc8a14596d1b274acad00be2187620221b1621f3013b82f4082a00ecb8edc9041b2ca624ec151307ccb9da45bf80d0eb215c50b2825d0d4066db864b513e3993332be059058ef47ba65d7ad72d507dead381f2d11f9ca0b5936bfa3306f9a8426a99a73bfd1d43ba41597542a23f9bf19b90a294664721efb0409a5e7f211cda48079cabf890871c2e63c2a6c4dfc894e4b0f,a2d13304266fe7310d4f1ac8dd3085babde50e57bb8c8661c6f06a337a1d07fe,33a10622f19bb8d91e2aedcd155b9b1a73201f9fc865b60409e638008da32d8f5e4b3c5a0f1083aa371676e63e86c502bca25f891bb3c8c3171f96e640c8b30900,c9169f470fd40b69a925dfce192ea4d2dd1b70e16d4872329b659c24a317a2f1784fd3caba264b581dc64beaaa28adc68742e350d98a82e54b1fe06290f8a00c01,ba3f2efd52cb89eba99a28626b41cf91edde5b96e46fd11ec4a1d6140f3fea2271c7c7a12f25ed8de0ab90196aa5f3cba53ee4edd08dbc8ab75a84479edb27f301,00d5d8c8f8f5b546f85a85af6ff54c1f184159466b58a602dfeb05ab9ac505fe504491cd0c376c93c9badc3e5d1e773a36ef0648978283ef3c91b8765f39550c01,5b0eee18837fc92796f1ceb230d52fe65f0ea637bbb65da7a4e9941a4b35720327429758d023dab3ac31be08fb028adc94e04f58ef598e54571e1f9f7d25b8b200 +42dacb941d9ae66b731eee9d5003046c025b9f8b5c37f7d4c4097ce4efb45a8f86a13406efcc1d0ac91aef71cfd02892ba01c2bcffb633062d4015021d2f1f14311450c37fed8e691931d81e9341a1b4b595e67cd2bc4101177759741d22259c14cd4f40c248a4ba9bd7d33a27d85121b4c66b728c58e74fbaa85ba83d1fd86e096be0769350f91c06f3e8227ece4daacd1e5e7dcab8c12358ada3ea,1e2b2d9c2d44cd565b2a06721cb894ff0b93b0ec2909b288a31c5799110a2fb3,918c05eafcd666482d5a694a1269bde61c2672668a9a2beb1109d1ab6f0855f410f46cec64352a7762b4bce6c21c713e1b19f595870e65beb8061d502484316a00,420833ead295655a83362ae88d7ffba3573c5dd880b0d657faf01c7fe4e22da3177b605612d37d6608f943ffe4263dcf109283caa3e552862ee3e3e18d2cd41c01,2220c5647d93d5e11a475a7f34015e69afec17c9c54fe3d97ef57e790b77239f4ee010b14e66f220387e5837d1fdced5220b0bd739ec4c21c10b246d076780cf00,b3f451ee37689776ac590846d2ba0b6674cda742b42fc16f1a3f1013c660bd6e228fe732142754f456a3ad52d7a72bf8eaeaa1a166c58f6cb2e68471bbeace0800,46d2b2f105306b4551174091b4edfe648d8ca776e997f977be240e1fd17a0cff300a94b7d191c33e9762f35b749f419b77ef52ec81533972531644ca06cdec0301 +db9e150d4f565b1a9a8e516759e475e076e5077728cb096b724742a4d626c3a2211b97a30be97e1dea3a1362747ca0696e9d763843f3425619850080778aae4eaf2cf6ae48a0e1b65745485b55f73c4836b1751781e2ffe1609f343e9a262f26d99a0b2a4a55bef613a92197f9489d4fb564c0d7aeed30f59364ec4cd6de11ab6bfa1c5f2db76531b8e180b711bdbf4a102ff7613167b5fe0ff950da,c4b9f6ec0fa396a138a335b484520baae588a4e0b293cb5c0351b44844b5e6e4,a2fae9d734984d1b0c3d6966f7a95c58051552a6276bed0d2ca99ce65fd348e97b4a33563fb52ca6fc7e7696b3531ee9b24bab3c3605626a0707694ccd7f270e01,eb2b4cbc72c6d8212e8055d65bfdc5a4a0ab962d35a6a0f342bc233330b5f87c0a40dea5e2fa265ffb5785d856ec0074c3f664e4f460d58b78cf63347b6cc16501,6466ba60a53c05a7f944edcdc5d071cf352c06dfc757d0edae46d5c470a4888229ee36cbe9844b7399c060df1b52b23e0e6ec8d01a5d65e6b96a42ed27891e6200,c5199dd723da643aaa005d2db8cb57c9c6adb4f97b073d2a1b2b03c82015da285e2303ff6b00023079e213b4c6e4465696c9137bb71be290b17814b33bfb681000,4cb0f747ac3c0bf8a91c5373a3f62c1dac7bf7eda1945f7f027c495649606f9661496848c35851d80b72686e289baed53b86eccaf35d889fb3d73f04a331563e01 +7560a2490ff43aa0698d934f007a176e99e9b5839e125e126234faab8444190455abc9d3fac3db849e92b19839e1c2236fef5ceb5136367d2349b582aa1aa652715af88baf087894783f0d82c3d613e75417c32353cf582479bf6b72ab2ffeb87a0de01290d2ffbbeaad2c752ab151910f17856199241f9dea3dbe3b29051892e3e227d04ff8927b0ba6def8cbdb0d3bc76dcf0acaf1413eca120ed7,c759a26d49d404270981dca941b807a6974d3f76a836d863eed6941aee6cad7f,88fcd7706f9ce5cb4a83025a94c61a3af88480b131250de15ef0b2695b3bb2bf0284cabdb8ee02a5454e0241966399eda540ac778d106da921825f8d89ed0aa601,f1119ff70bd845cbc22ffa1eea3d695de385c20c5e215bb1c9121a2ba13fb3702cf5d527036985e9926fee1f69124c21677ae5b1d19d216012b9366f36095e9b01,db1e8ed34c465b12ffd338ae0f68c9e18373c0e9228a1c02cd97f8256f2fd86a3905ba498628ea33ff363d0beae0a7ca4c7f270742214ad652327b1eb06e833301,fb48e65053bdefbd4b121e957958f06225e60161602a794d10afd8a1cd907dd3577296b0cdd1fd878f90a0a10251314d4350a1051b5698bc52170c3dc9b604c100,3c94aa530718008c0eb325c597770569dbec92e9bb4c63811a9e995fb6e89af77c28848a07c5d16dab88b19d4741dfd919deb7dc52792bfc0a6e67f872b9cd0e00 +5957fc47d134143f271ad560f34764b642afa6b86c45ad5b16ea87b5af6f4a4dfc5daa697fa1b1617573a993bb9f81b42f87d742a333fee1bac15a7ec214135aa21328e6d7d046104716b36abc666228ecd9efd0d1093962352dc9fa132fd537f50824759dd2cbd0188ba335adb86d85b398c919c5037a4fb42dda32217d34e35949baa2770ec2844723b70bc0aac9f34ea73e6a6ae6bf8cce7cecb5,12da9d9b38201fc663e397bd8f7235cde190696a8a9581a52429a317ded15d78,93cd525a6ea92068fc412f25064185b7eec48ce780312bb38635eaf6639fc8197f4826eba6df0e498dc77955f9798c3c0d84634a01e2a5d3c9d361ef758c806900,b88b8ed273fabf4b8c812c8de0310a04d2d10e18af9787afb2ee9fdf119dc5964eabc9d41f0d0211d8c1f73880d901824edf24b29a73d3eb6899d03f20574b8200,4a4e6a1235929866ef6e8f54a3b96097899dee4e0b38699422f171ce0295672a3e315df1c0288870dd07062af00195e2e1addeb5d11c7e1e39cbe59202fd326a00,c9c4d5edde555ef80b87b92cb5ade164b8fbdf982069a9f9d73f047e9a9b5a623c44b13e8e30168bbdf67bebdc42ea8696402059a75fef7ca4d3d8db3fddf86000,03bde074075d8376283be7b81f79df4528da41799248d2e7020d08c7cd3b0953398cb2b758cdbf5ed3cc77588f7f8ecfd752c272cef8a596ff923418ae57c3f600 +e83da8c0ca3648e4c3e5c45aea8e2afed80114c437357741b75674f3e0354094000b7c3f2cd27564a79b3be4ce2bd47e220315a9006b51cbf846211eab7b9346dc5ab9772f36333b57e87966d888e747476cc81a557523b7c80586d1c6472612959bc64b78e6c6f1713a01fd378e955d833401385b6214b4fcb90672ec1bf4ccb3c5beec18491381d8ee05d43335b93cc2dbd45439e548f752ff768c02,62fd6ccd491bea511aa12533b70743ba408c8a3594245c8490935b02dd72a456,b5c6fea384a90211be0ca978ce57cdd90c377fcbf872520c1dc6642600efd833066ab3e230bc8679ce482f2710e7d3733d36b63125d847f2aa8ea1f6621e10df01,94f806b0d6eee7446321fbbab7fc3f84b9bac5ea7a979cfb40691f49c93940d61500f0f81aebaa5ecd2a0210acf523d6cee37b51031cd32b2420f1aa7ba1564700,661550ec5283b0a7a15cfa76a253e302c2ffc3591d6cfda1b09a26dfe4e5ea741883504945e1a73d740837efce3edaa525330f97922b1929e7b8db094dd86d3200,742a1212672552356a44b61090a26f396b42289ccf7b72bbbadd8f386ac36a2c51f3679f52a6683074681a986c1a6c138e29807c1dc5099bbc9deba9bbc5922801,68df2e8390fa0dad4be180f4f3b44d65fed8bf170139d5f90ce229ff5ae6df153d07e3cdd7c6c9902982b04fec8ddd5640b677cf4f0f11926fa0905a8c43077001 +3b30c8f02993928945cd62f1a29facf9713c99105c2cc13c5de1e7cda6f18c4cac1fd78b50debc70faf54354246a8fb35c5e6e36775bf5b5b299d6c7511e0099151340d28621e6738fe281326976b50bf336a43848f89ebe007c53e80dea026037e19348f3bde5363eeb6bc12db92f259f7c96580384ed1fc98fe1ad7b4e3bae0471da4395fb1a0ca472d07041a7fc747aa28a3c32c847520bc0e8cd59,828dc98235037d5ae62dd1a7a6537c47c13b84fb2b1f52b8599934fd9f46ba71,0c2ad923f884b98246dc8fa1c4e1c8b41e7a6a0578d3a7fc4baf05ea5691a2a82374f14dd6b0824637c5f19a8c3411eaf4176e372bcb2d5562a5ecc90ebd374c00,c649be81bb95d394dedf750d8c327f6a2a7103ad51149f1eb8839b2726e2f383446e814477bb0ce568bbb1aabfd3fd3986423e405e4a1bc47e923472135ca84d00,6ea680365eb2d721ace2a4ef92ab4924fb59293dfecb4f3c6990260ec40f88941e821f74f1bdf6e91434df5cfac7a3fb65e46f6abacda104e0466bff89635a1101,4be200131676ce7def2262aa28cd922c7cdee3a2e402c4c9d84c06911607226c1611244d51f82bfd5c07bcf6d966d2e72f1e4343b83ff9e0c76546e13186cfca01,fef355b82bae71bc39639b30ccf03328064810440732ab445c0b4fb5318f2dd327da5e50fc961d0da629f0a7bd9e44555ea571870d9eef51f1fd5bcc3d6a9a3001 +ab27ef826c71581430604992c252935b28fae38cb9dee6a2d5623f4d7d0c1b17170a9df965484a2086b10a9277f76e6fd8fc5b7d622719549aefafcea730d4fa999e1e4962f07deea50c463c506d24c5add1f2bd975fef028cbc36ea1c06c8ab4021f214575fc72ea02d5674967cfab36ab7f2d06ef8e87a900d32ea7019d6dd2bfc20f9684327d7defe0d30a27ceeeabbed9ccf9a866258926ed98e74,b1ce3a089f01f3507bd5ad7853e4d125547022bf663e30b9f1eebc83bddb0665,eedb6e6cac6020b641eac3b62c0f69f16e4d2ddd6d06fb082bbb57c8a3e724131ec1419f46c89cad52b0c8fc626311f20eba1dba8eedddbae9127bdedee6b5b400,1b4fee04b1824a3a20d76613763715fb4d55f4526a831719bf821aedfbcb38a52d25cc8317fe835a0ef9881b1f43f5afc824c1fbaaa1be4a68daccf00f53de7700,47da4a8e122a15acf0d724f419b4d6cf21d6ae61ba198e292dece29f7e0522e02cc13ac38a580ce0044560bef54fe6bbbeccfa342e228e8f52d802df48d057e401,f6382b1f80a06dc2ca1b74f3193cb171be1d7dbec1e072fa7eb4f2bd21818c31183fc9d6ecc40778dd150d04b296fc3c9a728af6ed033d42ed92ff86e75e648d01,472df136d99468d6bbbaa009df84e79ef51465e7ba4de183a8e4d00a56c9c47979c461059a1e473386b68f49dda9063a3ed93035fe5ad23d49da2d25735b677f01 +990541dc55a7b8a36c3d98fd45421a9b86b9f6b5abc046fbb0012f704caa7df5b3838371a5fdf4754674f54b81b5ecd3b324bb0f522dec7b343723e3d1618a55d4b99109f49a7bab81cf961af73a59bcc7f5f2852761d4404ec283966f48b6dfabc8aed0435662958fcaa3b3eb6dae5e7c22e0a8a8f966642acdb2617828084b6f415b70e922ab016c38d557d16586fc43e7fb7743fbbead599d5680b6,8fc07b2ea6b0176f4575b29e982262f2fccc95ec62c8aa99d7abe156f5450908,4cc186e4bd241b56353eb4445f854c998c6456e9b4fe946fb4295aaa90296859186bf50c22007c2d39dd98ed8404c8553f2e67f2e61a988db3a6e010b7daf7cb00,40f51b01f14ea3faab3dbf2d881b5a335716e751ecdc4569a8adc6d1d18415735eaf2fa03b9e9ee2c52e6ed9949840e98fec3281203135c8423db860c578a95d00,4b833e8f3ae7d2bfb8e939f4fc68f49b4d3f82abfd1ed50b8884a6756599a12b609d63ecb302a533fe5da94c1001e5be752af6f4f95f5fc6a9043e2b0b00b0c100,0c7a3cb498c8be331bbd2a6ec49fae9106f47beb085f5137048a9c61c7a48f73577ce7f79ce2dae404750ef04f97933c388821c5a90d1ed91c4fc61696e700fa00,a0110dba41bfef900dd7590dd6904a64014c64d9ce311fd250b75d4c85722f301126cd4c7ce3c5d92fdeed91d7bebe92602eed383df337395fe73b41ac86482f01 +95160aec23ef7c08fdfed44746aff59cb601a3f393fa899479c0c2540c9f7f8618260db4f942e004ecfb66399073c279e1ce330ed1a89715cb317aa57f39b8ed18e333f622d6c8bf42e32c78bfcc6346083b124f3f43565631ef38be0fb6cd985c95e4dbf2363968ff02eeeadea79e69b6ac0f4033d19aea7cac314a0e4ea101cf42473b80603061cb70a363bc6f7ad447d6cbe1c41e72b845cdb911fb,0676318e50730aaccd672c41484ed4115e2d996a8c580193a0c8ba6077224198,c2787c5dc571c47b83cf2decd3254847e3c7453fa8c7926cca83d7b0f533d72e1a984be545827d2815d957b29fc5fb25eaadfc7fd0d0ab25994a0fdbce62f3cb00,38c2aa281ac45323af86fe8bb21c8c5231a1fa366b6a125d4f4bd527fe64918f115685e385e83c747ff93b9b68efa05f7f79b97573f1e2bfe1474a7f63f0d57c00,e78d4b300043dcfd990153bc1728511c8c6522131aec11bca8b45b9a9a09dddf29f30c98fae0686682c93951512c50e42014908d743e15ae6c405a144436fa6301,bb5f0f21dbb39793fb6c96cc9187cf32f64a31c7ef1f15278ca5cfbe823a57cc56df13dbf56e1e4206886ab93164c8a1c70ba97cd7ced0a8cdfeb937ab5ca3f900,45f532b55196e2505268dfe743cc75e35edc7bd9f279995404209d5de7c94a7d6da2da180c9af98b87db02f643a25f1a919cbf4679a8e716a8462152336edebe00 +928447fa25b83c6c8015260399b159c1432ad07e6da1ddfa629b94d771403f789a44297e449b698c8b875b42b7e2b47887117d0eb7fad24d3af03bb7d2ac5b89380346b36ef90a4c81fff3959b656495117ea1c679df9fd9edf3dd8c670363ae6047734482aa1d49d61a1eb0a5cd17deeefdf457b0d77a90089930b7e51b2c79be5c591351d0303747bc0b54b0094586bba087cad9567ef8a3761db285,d9f4121da0df2a380bd1d6085f23f2e1bf95fa4c95547c454709a68bf2001b8a,cf5acb3a46e3bac30fc8bfe141634a9a62c77af5577f429a099766dd56a8a716451c090302753f499429e4f67651b0bf845a9b523bbae4245e81b848ab1a753b00,d93099f44ae156ed19ce22dba54f158ff296a26d8ecb543899142c8e9eddaf4f589745c196b9a8e82314691aeabe2a5a2ef0dbb7661304e789367f9e33dd3e7200,4bf429677a9a1aa8e890cfe4df0e96d1cdb646250d3a57136699444bdc08cb2b31e2e113829bc89744f1ad20b5b226a2f9b2da2b5abf9a908dc16319b234465800,c8c35b63eace3469e4f2c9db68b32cb46d9cb0d2303838f305ca38e4e53b656517624e7b537408a2579f250e45decc0f55b816acd45ec45917f2b1a0aa30002a00,4e84041eecb8cb0b7176de00ce201ffc2a4090435181e330b696050e0e0d0fd64f1280a460eca6d74a3a6c352be6900fff76fc92a3bc629f977cd6f68d87132501 +72697176e9d10463499d30235a4c33a50f89b22433d68d7b8fbcf4e022c038e3932b9ce8b1d0fee339a0fc4e9ef585203e653322f6d381b9e64e80ac3e166049a2d2e5d5bd34f68bba4eeb5f57178be8abf95889da6ee640a37fa8bc1e7f395374284319a48d63d38fdab0c8905e157cddf34ba255658632684e6c521a59e7fd53ea5acbd4751b4d34a76015b61059c30d4fed362b5d0a196a75597775,d31367560ec8ab713870be1628275a799763931c973e457d575b72dabb3c69c8,3d9e37d70b244af9b4a2fefb996cbbff4cf14263ad8772d59158572b651148186379b50ac8b2ab19a21d3425399ba051b27ecc74c3eb32552b0cc5f5d003bc6601,b9bbc74c594ef79a10f3e694b15cef6f5482ad8f8c0fd37a3c7b9f61b4a053926de51ef2e6a074781c07a1b3cc4112c2188835ae77373f9260c5afd3a2ab778b01,c844a4d1b29f1f32c87b4147f03c216aee6334fa1cd560bcae7bdeabea64b71828d06cd964ff4cf0619409309267b3d0fcf4bb53a69a90fcbd543da99f8b172a01,a311d9cf04983121750d953db82d3bae680d2ff500fbb080a0539e7b915e3aa737118be38de15f769e2bf6e5c45fd79698bfbd48e8a1dcd164a61a751c32212d00,634dea1c2253122041a5460f16e74376d4c4c704a7b46febc40627156813b66c5dfd848eb31e56c5054437951b5a91a145fae826280bb89402c01e9f1a303f2701 +737c66492942729e4dc17a04244a09474d7eee91ea44d66a8f8e5376fb3a777e26601d3fed2c9f729ba5034b8ae1cfef782f125b665fc8e8ae3c7ee2942c2df802fc6034be76c3c37e8157721f4d2f7cb3dfe4afafffd3b463fbd32a17655364bc435a15bd49bf0fa5c5724e71837295f4b5f2e589091f3ec683353f9004053ebeaef1ff8c466cd6b0298e40171a85ff8e64e4e5257f9233183ae6a535,6ea0da8445d1a246aa9fb89da068a06ac406daec0689830ab2c385b974a15e13,f89654978444c0b583d931499fe9e1bfc1c47293e08f98c128df6c78cd3ecc2477f8bcd03fdd10e5f61a128d1c8a23fd7bce214aad8db10e4391c6658f2a626900,90134a3a4464648db47bafdb236ba7e78e294fef11d528ce0df47fed92e79147442787074ddc0070de79066d343ac8a1ee66765cf3b81b98ac57618ee9142ea401,82d422ad03622fe73efdaf47829525f40d7c719d20bfac7cfc87990bd797bae8279eea2691150b32334c6d0e7894f9ed123671d9571134625a88df1037e8007700,bb673635a3bd376ad4100bd2c23bc0dbe1a28b3d1beb9a288ff191f0c2e858e422cb6ff19e53c6567f0cc5a28ccdd1f1bb27f077e6e96b6957c2f71d66194cfe01,4fa41b32fc4eb7be9d377e934d4ae12689211eb34cece5a4d8b92608cebcbe497518e1cfec80b0a962afa38fb2b3693dd3555058f733e6985674a68d886a40fe01 +66af765133b825e866a17b492381b31a2b112e07d7b380eb9d94096d532526d4aef73f0b1ee59fbbbf90c448289ddcb700bc5589154ad97937e1e3e35e7162517d754321ba483937df0d7ab149dfe1cb796e180372c915abffa9027091d2aeaf5a9534cd477aceff45e3951bb31c9c96949a5a48ccd1c85e29706c984e4041b763a4b03d1133850b17741c800ab45155008687e6dc676efbe2708a5540,b68c7c0d168c879818e2ff8017fb9c2578aa74524baf453aebe1a1b48047bfa3,5773dc12187c78e325df959ac9c7a9e15ef6863e65ea4607d3c739405bbd21fc180fcd9e003211f55bf037536af5a868d7a80aa4b9e91c83be8f59e3df2e736801,eb7772ea0bfdcdb64b9456bf958f40e3ffea99595db68bbff2427bc71cf105b238c8526852232b956252acb83f8494aa2ade9d6a48de421a45accd5873c02db201,2194f87ff44cf379961121c1b07e1e67dc532aced130ff30d286e7bfb58d89135654c05036d1f9565698e2991af7374d4fcc3ea15a88115f9e1f739e3af429ac01,802b6dbc5e79e90c1cafb724f4c0fc5f1b7cfad9893b22faa1a5bf27f0a058c6774a863aeb4d4f2b89aeff9336dd44112918be3ec1913a1509c7a143b7a615ef00,4c9cc5518240a3d3fa780855d8728b247f6cf4e383a33c573344b2cb89a60e3224ebde0e37fef62e72d78cab23fe89e126423fe7e06598a897769af69446e82000 +fa82e72496c08c378e3345d47f57550f74c43097b4fc3b83246f42a0b4ae5c778166588a080e4a8390a28bce0287ae04d72eb8b5c599e14f598403a704276bbc995f4d747b48a486239cb645ac3b7c137e0ca2837d57454132f7486fdfaec6ef35a94cb218effd645f7e29d0406b3c86921ba9d1a5f50b090c7739c1667a8e0ef5f2ec34875a576908480de236a347837e456f858171a9cb3ca5cb9390,27f45302fce34b739e4cec4dd0694e9baf71436fe83c41c2fcc6dd3515bc8d96,0f181c4379681283d3ff2ffb0cfbdc2769d507873258c4a220ecae4672f5f14e430b6a0e888b8be8ef7757df621b60aa448019ba955e4086af5e4c5747518eb900,df5a800fe2ec0f58e3ce2b19c3a26623a7c922317f073a527e3d6b417d5becdb39c6a5ccfcd72ce9deda46795b7e19ee9cb8c712ee8c73980cdf0242cd3d94da00,5973bbd77dfadf72a64873337d28aab91636c3b08b1fb45d7a6f27fa360818ba4d3042fd9d09bcde2535430def071c87a107cab3e7123a6241f272a67ed0574000,8aecd5e587976fab5a4ed73a32c231cd23e5f11c2868915495836fc424e078fa5649a191af4fc4e57c3f221b1c3ca60f36f10779809d178d7c7e634a8c53060601,56a50fb92998c78452eda5f8cf0fabecc088727b0f82638221ad9b27b0c85736589fce27645dd93c1706eed4731fb800b617073b6d734d64b423855ffd1fe93300 +0061b1cf86612c87fa42c6f0eef06170ac6c9fb07eb0c8e6ad822b5ad57069869a1175b21e67d07c06f7dac400945ed5241d628ea1e16d6932cc7bfb5b052ce349c4c6c7a12e401718d5a77fa4a150668f7cef8189f74e883b3b595d6d1bbad4284a4f7d249403fdfbb496ef7afde7b70e6b13ebc6a0c95e802ebdd107215ac2629bb5bb73ec5dc76d48a9e57020d68d5d1d30d5109400936a52389664ae,fdb0ef383d6afe71a53440c890fbda3f8821c61f56c572ec10d4f274cc3848e0,c47aabbc6b08610a7c989502bbd0e80cb7f9523de9ed0d08fee630cf171cbe12250e35e71389738bc124c20dc4485571a0fbd3ab198d2845f4278b698ff2399500,9c6ac4ed4ba5f395b7f3468d81447f5110e9adaa77a729adfd4ccae1fffc839f4881e76f01e689630396c00944a9496e594cdf1b3ede9bd950bbf1bbd81ab7d300,6a7f0842248b37a27f7f51d825b42af15558d8259189433e3e334cd5da57240f061c6ed4cab91edab04e59a12fac02d3fe9ae3182ea3261ad4edf88475df2da900,23326bc83991acb59f1ad5621028621c92f4f9fe3c94c52f88fa3f10f3947a6945062ff32fdf429907420f059478f354e1d7c4e11bc29868bb2b410ada3bd71000,4e2a6e4ed97362e043a3c6abf905082ef3054327eb1e89225570838552441f72301ee96d9e8a94c214abf9d0b078eb18a2ab04b9269412f3a9a794faeb66558e00 +66f75ea3779be4cf40c2bd6de94bde596a05a40d9b68f5e830471787e695160738d1af33279e24bc9d6f0c72ed9b30e3e93d95f88349b0283e0b2a222b98afc1b0ee1ac4a5d3b8f599fd34934f00eeddeb8fe8747bc7ca7bdf63ebe3cc5cb2f3374530fbc5b4937d6605689e98924e5dbc327ff82c36f0602be0ae219cdaec6d10a98d4f4bca9f07070229a6d2f6f65adc7b79ccbb20c703ab8fc4d101b3,2435faadbca420d652143ea7a3d58be476d7a5103a388767e5a6620b8df06e42,443e78434c842c26ff7c91934edfd2e0e35b7f01a86ce61e945b56097726a30a2993a83f6380204a624e3254902bd38b008d69f13978fb2fa0b7b36580c541f001,ff68cca01553833ea2c520a3046cd70e455126ae367b24f76d960cbd48a788a00f5dc2764ce40551548283d1673251e6d2e2f3789e09177cc1ddb9c33f2a2b7701,13813ef56518b643578942544df3c70f896f54807d6e27bb56713790b4b0d83d4fb10906a8dd1cdb845ecead017d433a1d2ce10c7fdbae05e97a519ef6032b2f00,79910c77fb9cc5696396a8e34b2db5ead84f860dba52053accbd89599f7d79306ecc04b439221ffa49567e36f5fd195722cb0a477c2adb57441a3ecfae2df18f01,8a65905b006017edda1e8d127ca71343ac36f4e14a9d09ffd798e63e8580eebc54e9c473d68dc5e8fa51cbefb9339fb512e75f58d9781ac5e545dfa611cf35fe01 +403c742ac77b790f8647302eb16b6f3d7d9de1ad5a0b3e4556a2968696c43c2db74462caeeaa92c214d81f8e574a491257d5741a7b43152b58cac6b156d4677ef9afd8e6ee380a5b4724fa71d7dbe9161e62b820b290f8e12f83eeb82c021a25df813ca26457da38d4332d6986d941a2280ab5335d12f0710b06b0dc9e32384cbc818ef2f9a9fd2f7ab713b50d983dba9d3da91451584e5987cca53e35dc,a8b6ef47e66521de1142bb7716a80b7830b77afdc55279a89df0e44cb08bcdcf,f7dbb17aba0b1eafb276c48c989ff982cd17d88d0252ed9e40fb6323bc5444c734c806159e9b07bd3eefd8f6dcce587313d444fd8af2ae14014de0591c67516300,47717296650f06599e1b7273f536d24b75d6e79c69d66db175914a4043b3341f2c875a87ff25126e2d8f502f7381acee8096b2a9dfbe70f4133832a267719b0000,8ab2f08d7325e2ba58e824d658d961914116cdb2b442b60af1de9ea02ddf3e14339288653abe1ae58b6a073c60c31c20bea37e395531c2a831a47495636ebf2c01,89339e465e704c9154abeb62df0b8b4dc4a228e1f0570b9cff58f4a94f9951423a8d160cbbb69d05fb652d047029264930fd4060d8e7b202a25d500849d9bacb00,a0e2cea4af501be06b02b42ae1090828ec87be6dc5555c21bf8ba8f6360f4fdc34917bb896919e239d4cb7ef6706f4bd97bc89db02029ca635c04916aa7e3d7d01 +c217f78e48bbd178c88e06ab0e7ef114befac31164aab3426bcf62d10d1ab1a8f7231393d941df6800bb28a640613f30a7b9ab4d7add3f166652d70461c896553b044fb3542449f3250130bd37322002d541895861bb25e10d13332f7392b86cee2f1b69ea85db9ae843b971c60391d81b96970807c1829f00190b0b5fa83af3cdfb3e07a597884651a6a6b5a159139a6dddf0f3ce5c80419a06528d37b9,4156fc83eff8a2fba6b7c606b59dd439e42d3cf7fb3045cce30849b428c62244,83a688e42989fffd46c9f7c74e2fc40d0c3fae1bdd3e56cfa2191563c9e80dd25f9a84bea51419b29a612efb2823904f34159f453e5c60dad37dc9bde8a6867f01,37666875c209da826d53473c8fa3ec42bc149f3f92b215d0c2c6639014ce53ab1ea1828c9ee73a8d71a747494a8afdad111fc79821bf40838ec5e9d1ff1a4ecf00,bd7fc210c4ac05e67b0408bcba631fc68ac81f732737962dd62b59730dccc2573570b3b6988a7f4d88cfc478b431ad81617dfd9ec1787e7c590a38bd1d48e1fb00,eb03dc8e7d73ec5c3687afee6d0d85fe9923476b0e4968fa8fd957dc761873e91e4a8a179b20606db8811258d2c202f5d0184119899f9f0e512d33d4ab2e2b2600,561c6ea1833d44320c100274cba5022177cac8a28abde06f2af3e56788f080f540c8000d21f4aeb1647cbb9163a083d8a333ab069ea3fde29cbba7aff2936c5800 +5eaa55ce84cf7c5145ecd8c336f451b1e52594cdc174146759290b57e1fdbf71405a747da821bd91d0a70389d8d74a45fb3f3dea14737ef8808915bd7c100359b4f29cc5c21f1c38b889b47c3d6e32f9e5949ed03318decd3ef945276fa0a2a714410cd169522b67ed81e39b8d4cb320952b1a92180bcb5f26c565b781cf254c2025740452dd3cd78d256ad7dc723d8d73d741723fb723912badf0f9ec58,678ab88b7cc79d7e5bef144b3c827f3cb5a47b158881137a393bf28f1577b460,98a439ebab565efd6f7ce301859d8ccdb429800c6834b51cbb38c51d2e1e058e6f38f1d3110ee9f60b5ec0d453345af831805e33fd930fcefd90cc2d3c55874a00,5168ee3f4f6dbc75506c89d192c63684611667bf3bfb6c4f346f8f78e1c358d93eef85edbcc0db49b3cb1dd9b1507e4ebc2cc8ccf7a26287aba20775f4ac537f00,88c887b3f379f963cf6fc84408185468a7eb9a5faf5a046a6ca17f3522138e5302b2ee82f3eedbcf14549f40ca8ebc5d87c546fa2009f972f6501c857ea42e4b01,852870685a41e73ed1eab6a2d1142ed06a6f3afe4f29793dae37ed8c13a8e48b1ce99249274c84c352d7415fb3552da821267ab375d304fd5df9ab41cb2f58a801,429a33acb77d01224a16f36fadc586d2736744342c6e8db7df67a21df3acbaf4653eedc327f1934a454b535f0e203871b69603806f77c51d4a91a85513060ef200 +94ab26de6fffed0fb149bba333bc2822f8b96af37cfce63b95e8272127878fd2a4c04c00ea34e4848bb795b3dc5f5b8ea919a29fecba8af22695e4f3b52c023f93ea77ba33ec37c56816e28746c9128dd7a13254cd92d8d4e089c09eafb948920a70fd780fcac2c6d23ca51f43c91b14356636cf8c3e20e528cb19883e8faf1588a8c225660735202c7183c2acdbeeefa57669f8b27f894b0eb47fe99324,5fe96295298b5b21cbecf27932cee8402e35584f6dedea131fe7032ba191be05,3e93ecd6ce3ea2371b5d3bba04218ac1aac899db1f4d73922841b6c47b25912d50721163030492989f465be73df85c103bd3138c761657d5ddbc22aab12732d201,a8824480b11250907bc7bfcd5306f21225af82c9cb0f96050d299f77624b1554535823d9e68109bfb22ae2f9eb9f2f1820681579d4456e54b764ac3d5fe174ed00,0442dec2997deb95fc1305de6bd1ad553b79ff6b93d9c87a72173a6b2066676226a2dcc5bddadc83d27d75399c2d9022c968955fb3c3c60722bfa79f14eaa4cc00,f129eacd6fa274d43832f003cca2410c81c9cc7da6eddae29766b9ccea4f9ca16e0c04eb3b75479556d566b067ef8f7dd432abeca13c6cb6949e8ebd78a2dc0600,16465ced0447781748e04486e84ffef4edb7b841c643cb707fbe995dd69046cb031d50cb6feb810746385292ee748c7e601bb2f42a6426fddae5ee04cddfe1f201 +240b536c34b9863534f0940c7ab46f5de0cfe87f18fa666a6a4679f9224bb834450bfc7dffdb536865697c127b6aa444864b13f1fe6e4fb34bf77866bbb356af9f039c748b24f019d926f3387255c4972672a8cd452ce936c4e534601b83674e66f91b9a5b02da47630c5dd8646e52c862be15480c3be7a0991ba902d51f16e0a5a59ea472a1fc1a3564358bc6c546cbb3cd5fdc85f36e898622e9fe9a20,ad1d65233b084446920f06a46cca86c8d9310cc2b8d6b94e9247c68156758739,9911268f604432fa05675dcc885c85c436a0d5438f98d99807118257ff6c9a083e4996f6271374427f23c3e67d34b320fc4451a7ef8419d5bd58e2ffc30dd6ab00,ed359a3059be3eaeeb8fb2ce705e85b6017347809f37e2b097de52d4bccc3ea23d29738af17fd7c34e214dd591648dd472140561aa8674e38620ceade7cd248b00,a9784e8e5dac8a9984f7f013de5eb77a00ee6e431f3ff2de7a1bc6eeafee72057632e6a3d932229dfb042035db0e709e648fe30d4632d36ccaac24d26103008a01,c4cd26c79402e2a9522627c8b096fa941c466f0b935fbef675ea65464326d3162050742e2a1803509ec3410e55b881de375b34c54da65f4bc3ff46ec1dc5537201,a3cd8f32f485dcf70849dc1bb746319f5786a74552460a6f3ecb4975ab1b656f3368307fc7bb593476693bf5b5cff435e0ffec33a8555ffec4693d1bf996b5a300 +141c0f4b4f93dfd5efc3d8656ad7063e8501b8345a0ef2dc7d877af8c077aa56343da4a0ee070cc61289296a9b7ea4e9269c0308df90fae88c136139b9afa7a690bf816cd64060f573db7e2aeb004546eb352f45d7beac1e7c9de9e3e84aed20233b5488cc1b36e9673f3c094a810eaa43effcb8c42b0d3eef844caccab444314575f2be9c74ec9091bec35eb3af1a0a39856e35c99abc5c7c58c1c16f77,3f5eeaa3f9a333095990e5f07bceb3033b90f53cbaa3dc674cff0e34a09c224e,995c83fa405d362f73c594f2afe7b3046a6bac0fe515a2b481525001008b4d2259b011537439c6bd39d23595903565daecf5c2ff2a51c20c80fdf4d065a2076600,862cb16aa1c4f2b62df4726c5c20f87da06a39b5d0d265d87fdea3f84354b10f1c7e3668f14671f847a8035a2458d60f46b0c591e9b26aeaab99574f5d4454a300,6626e699209b0a27a0950beb12d3b70995cbd89e01a8d89d04dadb1354b36ab146e854a761557defce0bdb5c118621547b677a4c3186427b951c8aa7f183183001,4a18a337bf7e667a377484a7706d99f32b94588369af637b2c4d6ff4d5e4ebab5c7e72f7e2340a9a1a65d2739dc4ce88476e7aeafc9637c398545542f3bf9a0b01,c1308580c0d94a82b6b39f4da49bbc4a4d2bf4d8bb3e161ab3ddc43c068ce41155c1b9e5f975daebb24569f52db92e133d3a565a5307e21c066ecc5626c50f5a01 +ae0f5ed0d56954b8f27955efb5d69baad33184f08b222d2785ffc12c20d724276ee5e6baf7053cdb1be6f4165efa8d0305be8508485f592569a09324de44550c2b654feb605b1fae8364d6bd10736bbd434d25429cb40550f0372bb5fa6bfc827f3e71d75fb440ce4e9247b0c585ac593a6bf19830e3e9b5d67931b9c8711db42f0cd9203dc5a4ae94e7868d53e8dc1aef11b42995b7a52bf8c80d127fda,d0ef579a469b54ff4479bd6069a480f205a72dd7b396453846fda2fe34efe687,d7eef527f49997c71563dc6ec2b748afb12ededb3653ec076f2a662a75259174657d2fdcb21dec3a130ac3ac995974e861e69f8c268bc4b8d1ff98ac5138dda701,4f63f8ae8320f46ea489ce809adc49da047c8d51a9cebb8ccf51b58a7298cf3e3020add5c947a8115f5096d5d5ea96dc1d5a98a2bf3f29dff5187829d73f49b200,1a5797886712ac89e9241d26a476d0194fb7e4cb5ad265936c5c90ad07a8f22648483c00e719ccedd32c9eb355510582ef824db1824619c5f6690f67064aeaf200,4f9c5444199b9be355451a38df673e19101e3e9c57b8cab83f6033207d0644a401f8123bdf788b5684d738acd6cbd62c6477a0b50260b46fba214b441c4c232601,a05198b3963cd1781c4759e71becc41dcd1e5ee03a9b6ab67ac0d1bbe4fbee35446746e3868a986921a12d6bc306c6f7fe4ce68d1eb40c4d703d434d2bfac98800 +a7a452748b54a1a51819442f0234a1aad15321d26ac2734a6f0e6efaa35568f71223b1815da4d86c39de88335198f421ac16f78f46c6fb5a0ec0ae8de9d02a7ae49a1f2cb325f71e8b50cefd98bc4b523a8cb48b5a55c99fd101b329c749f02bc7619005b9ddcb5cd41a0172bfb5c6bd73e51b2317da6b12bf0fee4a96a949e24793a298a62284cc5ac0e60145e497814595c15d7faf2f8d951e50ea9e44,a075e549bda29995fd05edd3c39c88a4c113b0123d571a1f0f5359f291bfcd03,4a5832f98a74fb1ae930e0a7d170f9b392a1b5c8fd6c87ac5e5137e78c5a80a52e4be21572401453b64c2b52e89bf1cf58b963bc502a77d846bd7c0a74a518e700,4626b3707dbfbb2ffb5f4bfd79d5c1008681919afc185d5567a25e1f1acb8db45bf37e8932d5eac6ba08133f99886ab6ecf04d30d35ac7bbb5472729b38bdcc201,2d4ec68c5b47f162dd7aa7f93080c063b10fee75290195fbe2f3e6b90f4c669b3e449faaf33abd5319812e15989fdcd9d2284714d088ade1239e9858bb2df2e900,24c16e67798129bcacbf19e2f4b3110215df44b4e7c3a72548ba29199206b1f662b41da7d7da79d18b7ea1ee9ada9c5c05dc73e1ea2c9f84585bd1d0ea9ae0af00,e25b46859ff33323e7236855f1c5ef08e85c8f4ccfc9eed446f6806cc4c12dd622ae93cdb17c6d5222ddde79d758288ec20e63af79332592d453787ae46e0b8c00 +181353b8d8b9205db490dbd2bd25688d68a3974067d64247499b4c11dca35101c7f4ea8d1c70e7ca6a5fc1534c111ce17aa8d0bcb9fb4778f617a9d25a54c2536992e92a3a0872ea1264365f73a04648e714426d8abc92f8477c854b598f90334ffdf66ac03894862506129b4fcc85071dad3af6294320b8970078a1f9841b2b2dce5211cc67d6403a548aca198aab1f7b0a853e14c1ccd41a6256017419e2,96697c9c540df381ace943690609b7d9b7bec2b2ff6f608a8e70d3ffd58dc9dd,7a1abf0890a5acb0ae4cfb2222d65e6b42b16b7ebb6979627279ee64ac7a7c0537b50920a9af0b0dd5176ca84e8f1e590f291c0b7a10d3ea52256c3d4de70d7401,d1c9a8243ae13b0727235539adda0043b92c28bce1906b34479140f537b056030c46aa480f5c547c11aed4fc20a94702bd1d965b0a479f3c5474ad4374b1bb5901,03439704e076e08091375bef8cfa563a8db4ba3053c86057618274722611836d2cb9636833ebee1f10ebe9be437184cd0d037d692b6ec333de86fe1a4930780e01,1478851991a96e9e01d8b3626c7c66ea8e9b3723c07ba045e03b09e860590afb0dffe9b11234e9803bb8f90ae3a1202d90f3e77fd274636e3035236b2c65b39800,4d13ca55018966a394b8e9f3a5540be948b29cf1d679528040ed439f7715e6fd0c5fa359f90ef1cda826a32dae47829887d7703ea2e14a5c06ab1dcb9de1e48201 +77f0d2ca2c6a37b70aa5370828e16e3c4caa800a634de40ae79448cdd8512103aa61dc9224e2dde155e7265e2de294e54f67a15c6dc02845e483353d2ed3c941b4f49cb517d8a10e2558669c0c104083f2cc3066c3b575eedd35c277b8c686f90a81211f7a7c43fb851a47e34f38181b45a2a9a429434df031979b5375f637f636e0d6f8ce26a0a3c19e330337d2746eba13087b590c7be9dfb908ca0e34d2,00674d7134425b84dc3b42e02550bc27882fc8562aacf119ee5eeca4f5ba7b16,c6ab3c7115e71ae0db872e8efa8614a1db7dd182f205d9bf4d3d09ada14420bb28ddf4ba670a0a7994824aead98b3ed0e5eb7546c7896db3174fdd01d985ae7601,8cafe4ed30061b7933b694b3b571ca357177728b91438adea325ecba2b6365c105308adf2cc319cfd8009655e22f131105aad3b78a0cf2294de6fd93f4968f6b01,923ce860eb3d7591bba3dddb954c7840158dc286c70260b60d5b8158874a63b00841540814d7eb42a2cf4d829d91b65ea4ed30e1b961d1cf0b397e87d6a3b90c00,014a71530a47935ef5ea48ed2456a7462fd2c77d2c00f5ba6ae6aa53f976a9dc6b3656cc638b06e99d911d8fac120e58314344cefe1129159180418286694a2601,f4e2d342b391f3c368f640cde2c576641ff6f30abde31ed7ba4f919ae3e6179422d8d453c6ece2ce2984e71fd6cbbd04e60437bd32e103506c0d88068292d9eb01 +08562ecada0a2d965275598a94a006c44cdbf67e49d79b2a7809da687968b1b899585d5a9805ce68db771cb26f29fd56915a688c186e44da3bcc6cb0ed523fcd259fbfc480bd0c33d687d4a93436beef9eb4576bc557a101b6391dbf4c625131db56ed5b8fcb855a0a2428a809347de51da23ef7c0b1cd873be8a12bbb0a6354b78eef64f9d1ca4f0d33afa9cdfddc0a982aee66d2dd81db274e970bf34f0d,ec59789dc0d11a595f1095c4f6cf27bbc35d9d0805199f8ac2aa884d826a3ef1,50592400ab5411d8211225f75a52443b8a743d3e1dbc0295146907c92e7f13cf23a3393e8314e4b8c4f876090ef54a216fd03f0dcb529f5341b1b27e3f6ef82b01,06b9a8e688278108e199c775b1e60bd6d726662d4a45435c8022280fb15f863838de809ea283eff162633cd4fbb3ca38e56be5f7a55e09559e4e7bbe6c98f0cb00,1441db724e143af9073acb7b0bd8df9691ed4239ec749264f31e25eccdf5df7a73e410847991cc1386257c21692f1f2cc2832fba7ea1b001d74379d708f5358001,fce55f195957f06c7b0bca496a248cd00bfe6987f89ad73985ecb2a4af9a4bdc5dfd069d8a9ec8242dc16ac6e760134d70b2caf8224a93ac8612195ec21329ea01,c16c39807547f09ff7269ed44a74d6652aa3e38d4d840c2119bb6662c2d4d8302f264a7bb08b03bd9bf28337362020aa2ce5f43d4deda9c22737bf911d05356f01 +7084bf7658748942daa40258e93bee8edc2cec7053e9b80512b396b6bd1fb48e01e0e85190589dcdfaa3c4c3960912d18dc33ff6a6705879696b90c61a5468c06492acf1669cce0945252cbeb2538c42080afbb13f07613ea7dae91b1659324f3c21b069f8400b60eaccfd22cac3f465ec060852b95dde2d806adf4a0011abfd9c31f2ea764b4bf539c63ee0484f9c2d3936293c7f66a1e6c25d14381a78f0,8ec21b28dd4a1ac7e085f766bdd50c300dcdedcf8239ebca262de8dace6aaa65,47bbdd036093e4be8c74155530ff6e49118a2572d46633be64a8cd7a87312c9b2e212d9a6b3b560000a80bc67f99e3c07fe11fa77ab0516d1ba212abdafccc3601,3655d561a82296a367d67e58d9f117aec232c78b35d915f4847d0b861732036f184b2fce97f7b81a03ad4c88b1262754db861322f20b8481f09e5fd01657a9e000,10a10e20ff7689e38977edcb25453c9345c5f8967acd06da66997239d3a42f1e636d2bebdaa45a300b9feadce2a685b4119ac122171f17b3e32f2ef437b4cfd001,def0e6ed8a32595ee2f428b4b35d7a220d2ba62a8e3aa3e31f0fe9e60bbd45bf027dcda743b21fb7e5765a605208882ed1d08cd65ddcafcdd9fedba67b55505d01,1cbdcf9bb4c618a648155bc0032d647c97f78d83cbf3f9c770ae9b29fb649d637e78d9c191354c24bc539c51238a94da0d6b8998424be5227ce55f382a6b063600 +21c2c5c605864db801cbed9e3e5c623549df44645c3239c68d70b6993adefc970ac119601622c929e9049abab55dff5d2cda61ded607a3c692929e78fa24a21b29837ef37ae7d6abf142268b7eae797c66f0e6a50ef2766b409caef5d2c51a63ca5f1461460cb1eb5b962a8e2003aa57b0a78b04a4404a410cad86431e89295b1bb023de1738f0ff8f946df69799b187338361337a895ae24dc984f4217b41,1eb6753add9fde75dad117f943cb1b7acc5060495c52abe087b3fe782205078c,3915a3d45b02c4cd789cab0900129b08276530bf4893cb865080a496c94ec4da551cb96d6c8b3b26beb0c15f14c8d616b5ff1a6e55e61dc468de75e1ad609ff101,1e49a25024a6a0a956c97a98cb2ca337c62b6cc3b87cee8c6261ffcd834b2df563ca69d1e0f779ad0685ae32593e8b5b25d91684899e585594f1c264bd26206201,3b5718aaee94f0a78197cf5b39e159b8048e07117b0b012e737a42805e03dd572931857e459830b516b20f2152ed58464a2e1ae90c40d35b0013e44b17637a0700,49b6bca5b132353f49920b49e4ea0542cab009db9b00ce2e9967df6a53b752ee611e10d6f62f0609c0f4840b6ea5404a47852317fe4ed9032088a5036c1e2a0000,9b33ab25265be53cfdd96ef949b1f45b7168d88d60ede38d8cce77eff58e6d303fbcf0dd5874bac5cc113d7dc28f072a18c87ec6b3389583041805d47f67480901 +357ce7ed2a5f8e7c05a38901740b4f5ca1fdcf98f97b36122d7779e26a31b6b1eb0de34434827e672ab2ff1c6759cb07166aeee5a9d1ae9c337df919c49c4ecc0bbbd9ddc5b70add2fc13ead32cc721e4139185305b3d1183b5e09c6822b2d9cb674472913d90851dc7eb566029bf56d18160933ff844910eff90d72e23f37d4da5278f2a4df20b590a31eda32bc9d59171048b3fe3acfdf6f034737088f02,63d035ae74344128d3429edbbc97e8b98a2f826205b97277b34d131dc382ae00,e62c27c79492c1023865a1def5683daad846ecd30a108b86f1380cabef0695d8668d2e88b7603d3debb992c4452073aa92f03af6e2472ca84eb459135d6ff3db00,bf7695d49f4e12936aa125539c1356b4b44d0eb9b71d27ef581ade59e2ef0c54345fe331ecdcd037890e37c5ee931bd07940e1c1be48052973c01dbe7f84318d00,6fb1e85171a3bd9901776d83a612124babf91511ef6186c3fc8f3c56fe57468e0feb5d49a2b004e3194cd24f7afaae32ffa0a796ea387f428c787b4dc7572d3f00,1e7ee01f314c3a57d7614639cb583347c9dfb22c2f22b3553c8792dc800285aa5e71af7b3a1640a06e2b33083688fb20a6c6d6a0321c48b898ded6598fa1392a00,f0d93dbf0b325230754d776502f502c05912a5fc718125cb32bd9da19af86cc87fd9616d0b3712b81e3fa7676c4cb3a819a4cf2731c96490762cc30e14362e9101 +56810d8e8c830c7ea0f3dd6e4494416c664fe882dab3204ef7db65c8fa926e98b406a4d9412866abfb8c7094e2debbd4a47682d704eca1aaabffa9bc350e0176697fed62e6b2992121b5dd88ca7131f05e462f44b2cadfe95f5970dad165929a68b468086a402730fc9758de1679060629f93be35ca09fc6965678c32fdfb699c65bd98496334115fd31a03e9c61589bea48b658c108334f0cba3bdffe925d,cdf1a93463edd78c9a312b259b3ca10c6219244daa36e6dd6e84eef84030c767,579e1d4f001fa08f5c3dd7a25807f21647d64a064facbee4b627d1ac8d8994b52524b61312a759ddc3693c78ecdd02f7e4d55993d35da46fb56d59054c21fdd300,ac485058e6599344c877d217d86c5a62534fa8c4631f9249d803a7d4b4caef5a5e5f7988f6a9cecacd0df0b233bc4d6b2cf303752cf18512449d413afdaeb27c01,0669f17c99209be9e0e5e3942ac0c46248b47e521fb8624b20e5553c099c71691db43c9c8d9afadc6c88c7c0c14c38fa3e860d8f7a0b64b950706a3532158bc501,2b3ce355f040da0b798c583c9287b02ac5b9ab68f5b102d37f1acfd8b1311b2b066ba314362490b18c99605fd28cb88cffbad76892a188604d250bfcdd044c7d01,628404c8b7c03ad413d73e433765c92dbe8bc5fb3b28f61ebb838d0b2e8a4e5c1d71a8392648d3db654ffb18aed7880c5bcdb448f8d4aed1768c450d0ad7403001 +165a61181b3439046800552b6808ff4f10160eddbc1d2ddaef82af0ebfb43df1acd716f7fc44fac2895c496b9c30416008b85ab260e96cb1c1afb33544c43cc3eeaf41d2f4c4abfdd0ba790ebca717bd531021b9af7045407f3d6a383908c657d350ac0c9bcac6211761cfc60a3f66abe070539b8c7d4518396d35b63477c73c646ab9ff8a8a3e061a5b7398aa9ab229a19b5b8fd9be6aa0dcad2992be2edb,e2ad7449bb4db43d832d2c390993c93e20355a059d009c24404c5fad851823bc,bee4e14a2ae6e810d92063d1c407f131f31718402d758434054268d43758c28e47c781e3342958b9b72f879ebf92672f6c5156480dbc2e6aaa96c9a86559958301,6baf6e7cf5d2d36bf3d648b24694d75839f87dfebf76d4f4c020d9e4c430e2f450ba5e61184785f33fdce5311c2c03c9280bd069edfafb957ef22ccea32faa0901,014c1d541a622fb7ac0c9e0f6c9669a131c3b15904784f6530042dcf79a7b61c79bbd6e913de633d4109017560d7745a9bab035a847bb42f742c0b686849703801,de5cb80cbbb81a122d0101ef62a09b5765a4226932e901422975df5fd61c0669141e42482a0b01bae3f1d6641aa765a5d1fad76a094a6c146b56b7741aa651d700,4cfe0df0877f0271d730a3538cf11c3a4bb9e0f59056e276026214026bf09e1021a437a2bb4f2f08aafe9a1965ed0bfbfdcaa08d3282aee951efefeedf08540000 +f65ab24a711e7484c05c74ce52e52f15c2be144594d28d6543f2daf257ba155ffdbb8c196e50a15173e6f6b322514af20ec41cf1c28cb4ed1e472755568424e470f2f449b7a289ab9a96cd303c537e44065821d779b97928e89587fdd5a739ea2c67622274b6cec9a2539a66b9a094fbe766166876ce39e4ebf7b1e1a44b03807544d3a64da06cc2a970058d095c935a3b08f5d7d6b3db257071d69f51c463,dc552711aa0bba099fa5070bf2f4752b69a2e9e1bd46a963114a5c85d43b3159,055066b8be1d58a54db74e2440eca8e6591d5c49a2eceac62b9d5cda8698a31b174718774650f57041244a5914d7e2901a0bd8f6f66dc5ef31d2238e4f8f3ea501,430b740e213129bb5987d499714bc9ccb8710e7a3fa6acb9cb10859242ea96de1e5c628bf9dc6d41a89e82be035f01d23870091d3942d48304670514e01228fc01,e095e0ccb5bc4bc8b6095b48b1502caf85e3b9da6192fd8bacfe5c23d79434d93ca653e5b849dcf21e8deace8e32304070e4b6b03cec8a48abe1a29b277ec79e01,73a379584db5f7491532d9ab2efeb7160e744e3b7b3250ba9f436ef8941e5444575488b9c1de9d44b46ddac3674b372dc2ec241a7feca27bc312c78b16f6e83900,37c75c9a5e2a12cf084736baa7a2bc6591ebf6b176e4c2ac647e7b92ae255e93369a87cc37e3de896e6cf990733bfd8c184a5e7a8671464198d370a9a263889601 +0c88e511be4adf383a39e3430d0e167a33148ea81f049f0e5d8c0c25dcc128f1d1ef6b28b19fb73b1f241bed0e6fd2e4296cb1397c483ce81fb30f9d57fb9d3602d3760082b1a49ba511c7562588c8cecb4d29b56faec6b13127cdee246e8bcdc8fd978d9bc51526f21ad0b0bc723344a6b3e007f83e35eb4f7db8e5432b3012f4c2f5f022115cb8b6130cf3dfc690715ab744c0f70017d77349e28149b108,12456565df04c74a759db6781a70f9aa5dc62b49c29d2a04533957d9d00f433a,96636a4a27b5ecf7c82a7e1662d445094d90c686d0319bb8188e8bbdc341f69821b9efec93492bccc247a3b42d3c6a25567084b4d9234b730f5f5be72e80277800,bdc2fcbf1ee92a90f7b870f652fb3407d5d91df69b6de39dd98589e08d45389c0a04b52e6d89d600806f81958b1d920711ec66d79b4c3621d62226bf9d7760b300,103fec25542501cff6524bda9ec865bbffafe77827bc8fff7e76684dce9269c8300777ae639fb6e12febc0e5e56c2447e2767f6c91df4ea3a1f268404c9d1a3901,fa801c1a18adc5e3e3a131f76bb5f2ea079088ceff28f248dae8f828c2764398603c3fda70cc1a51a604c103b8eeeee3138d8353b5538af69a5b8b41a7cf66ff00,865b138456694162e4d782705f07608c4bf2f9b659d45fb9b6b88327e2eceb510535aac1951fe7ba2278ae2121440bfa1834f140df45bed2d820d46d6fe80c1600 +3bbb2984a957593bb6cf981c8a8a2a935f26b63d952a723dc25979843186b1169ef04c4041e2f24f2acf068ad90b1a2f908bdcc214d566ab9dff89cb6865338aa26b9ad5ebfed6bfa2d220e0720c4433bbf85bbfa544a71f63f0e5fccafcee48312a2673f3c5d699d764d96d65415ecff3cc52f50075539ad6324442fedc58b4d79c6801c7bb510df7d66bae33715c5c892264c393da404a35771462c6e6a65f,72338f42f611c24060cd44e85b3be065f1abb7fec74a25be6d14167f8cb8f362,c43aa328ebf0f6e5369ab9db9900042fcc5f452b0539d04c76f87b81ffc1ee56082dc7c322ef47cbccc42107c4f3a86cc5ca99de46a7650e8810ba8b78086b1400,54799007f5c66325ae480d0ba12d0b1326b74c79b23bc37bb8ab5bc1adb05b483661f34ab781d2e0ff54c832de8cedd0317eb84c2e25883b557fe9042577f16400,76aaf096301d5886082e57cd47228be615219a6f27ae4c39745d0f04aef2a4493615eb68dc21e5444bff9c106f2d9613313c1052dbab150ebede899b5329b6fd00,fd70c9bf3f09374dca7c0dce338e45c302827d4c7526b1c07e0d7e010ac3bd3a627b98dfe515384ed7f27ce0b8fed96bb9e625fbfdb1a07d6a326888e611b12f01,6b811aa8e654305d2d263c3e98e61626520469c4e08d08f282c26929ab6c5fb55db1c0352187c4d1d831fcc30a4249fdf324522a5329f26acf65cdb861782ef101 +ee0bb9d3bb0e0172dc5590ef7ea823a6f713e1e8873162b24d6dd0ddb52fa12d63cbdb0da712df9c654e9f9fdb66f67b1c6363d3a302bce453ee427422d88b05b259bfdaab75d9446cbe0e94b838b65b6ca8a56253fdfdb15b91e3cc0ae5985fde9e8cc1b9c2fecea4ff6d64d4e75ff75fd10c9f7c81b4f79d32b035d0a73722c3e8c304b1127823f58b8c0834eb8279f4c7af82b01727bb32e39550850d62d3,66ec6f718a7b1f958aa5cd620367d26851a8977babf19b8b99dd9b6b785ff625,19372d78decef3ca8f1bda49645dc49c4976238b07823c80373fa5215c88924e4e60ebee209d6e0295b3543d9a69005e9f91aebbd910c86022a25a0133a5904000,7a0d8cad091d91bb54c76458df78d51c7b64b81ee4ed527dc1e3c935cf62941929de9b114e07e4d312c36bab8ab4ff736d2dfe7d17a3b7908aa23ddbe92e484a01,3727c1f7d8929bd223241b2ad55dac7054743b1bd02f7a79498a9329f45614402ce93dc904ac02ec470c3de77df7cbfe8d694a01a4d64a87e88b4b6ba251e44901,b4a1818d56b1a3fdcd7e840e1a1f770e4598dda993e85dc84c8aeee4281d638c70f3018f7e55161a787047ea66b8d94362b80b651e112c28f4b01241a6ae9d3301,addd6687de855eb6b95c88445cc4f0dd6bb361577d02b9d1e4223bfb22de4d6e1b36fb5541f68634e43381faa80b63d28d00a21cb6dc50c0abe339cecde6e4fb01 +860dbf8f1325e5e5b37cadbaa319ba241ff0a691dd9c699194df8f19ccc50a6c6bb932c99c2fd63e32948a43f3fe7f1c09c231df8d3278a40c61055aacb8d42bdb7db493ba8105cf7694160c1d6829337ffdf39ea0c75cb9d040c318daf127e03bb87eaaf3d5a13f3a5612bd683688c3b3d591316cca0eee1e6e8ac3f60d66fe00993163f1227ab118acf5f3a085437fb3508ee30b424e30e9dc62def861dff1,96d0566ff6e02806808436a66e04ca6e208329728ee66d9b5294ff5570723489,99ee9b0d37b1c438b81ddcd51ba46c1187dbfde447d9722b5323c06e557c41c13c52efab027746925a7bced49d41f46ebefaa3d013d9a9b9e1434db0902d739d00,619ae0f47f707193e636d9a3c0fb80cdc69bed335656e072fa7a264f76b5480e5a249ec0b4e76fa26c6da16d74a7148f4959d008dbc6e4e7ca2740af18e669bb00,3b6f62084cf2b70e91692cc11421471d5383b2cddf074b728a0625c0e96333a4718ed9b0ca9a630781ffbb11d972207d88919a2dbaa7620cc0ed77ba22a1a8a700,c761077ad3ba05629662cbc9f46158d401ad14302d48ed78a416285035153d4f64155fec6708abd73626752a5602b20c0f0260d74e11d5ab9f2cf045b85de06601,d3c48dd4617e68745c0e3837ff30033956e2080b362885a47601b9512004ae4e44f32773f746b78e941c5a1635e60522fe7f6cbc3198b5467c6ec48ce62deb3b00 +3a80b94e761d27215c03e03e2aacc726068e1dd54f5921873ea2435c36aba81e8f0fca90999f06fb80fd96e8ede8d9bad5181ed877eba2c3809bbba9d15e25174b6e069cb09c2fa7604e4c855f03918eb8d81cae77d42979f680b24d6531ee0aaeb286e5991bc4056bf2afd9d86e3b98be481d6bee4443a97090d441eb94eca128a13199986cc9b4976b0abe8b00a72d606f9bcdd7aa61f4d340f8ce908366ae,f264662b5753667dcb79493aea3d7b241ccb94103e22bedba4acb7c6bfc9df8f,f8e77bcb5711f99310b349e92dc3a4ccfb078696b48163ca0ece414686a273796b13d5cf68563bb862d537f69f3572a55e42382a164a38e95b17c143725e2edc01,29293cda6b04d9953b649c11ba3990e4608d6206ac4be4ec5d6fd53aa4456af447fc5f3954e447f19752c674b7b7347effbbe4ee473fe3fea2a8f6aff2071bbc01,892ea06d8fab62bc8579441e95fc27f255d4331bd1104ba2c063d03f8dd507a07d6f65a035da72cf1e9c5244327c97d43e1cb6aad280ee6158ce408603163ed901,8f75612d5d2bc85e957806d255ba8024ea7a87df67a0b9042baa64a0ee1465c82cdfb97309c288a854b0750e55ecbc688213eff4baf60d8384ff1d55ec61910100,f782ece40aaaba0e8ff83f97e17adcdfd35e07841a8a89371fa0a71ed7b22c294d677971df61a93da31f97a7d4a861010785458f2f42ea8f46248e5219628ba701 +6fe0f65f83d24bc4beab8a03fb801dbce87858e051208cc57d6dfb90c1038fa63fa7cea12ed6eaa53452822f362868f25ff9002793f096fc814d7130651f425e5f740ea8ba4dce22ffc01e9802afb08a116a4a4c9ad841ca5781eddccaae61f0d30bcb3d39f9c258d611cd8fc392298ead64c1795e626f4b9f19bc6ac92fbee752289d167ea6eacf8dcf73a2d43db5aac372f044e586b4a16591988e376184de,4182b515fa54e7d989e2503b712a24a75dd5cbabf4ede62be8e6c3d01008cad9,94b1a947ce1ece5d7ddac976d2529c2c7620525bcd4aac7e953e4ded6cde3c467756d0a66846eeb6bf913c35a5531d0b84ed14e52d87e295eab4fc8939eeb85300,c3b5c1ab54b437dd305bf59dd7ea8abb7e0e386829d4e745aad356e6d451cbe62951f793d6dbdd4670de83b629364f933e214f0ccd7691d904eec2300ae0eb7f01,80acfc64bc1be17d9d61338b82ca412043aa861dd3eb964a4e67685260b7dc2739effed762b644a0047bcb836b9321ae3eed20611713755f8b11110c4296401e00,c4e39b434a192bf65035cd48a28ba513bd679a3e3bf88ea53174f0a3013cd3f543829a6e6730e4fdde84114002935cf962f1ca80e68468e4efaa9bbe09a63c7000,5d84a2442840307be7b4d0e5296a40b91e05659c3760f7479765f7bf05a685a0763812238ffaeacd4e031bce76630b2d75894b7d82ee27729b31c30809125c1f00 +126d3a34ca73d78425f64c416c14bad7ad4cebe65042daae365af5287efae37e4b82e58b408c79489ebd7f1b75a4eac5b1b6e36e115208b310bed581dac15b58c9f2dd0498785debfa37463535cbb7fa690bc85d7cc0ea5949eeab7920e0b97898df6d1e5202d7c59ae22370bef8980d28e8e1f6998a2c6ae60c65524ad833a04917ac71c8056a6eb0d393a94264152b33dfe36ad16e40f5d8b751bf8bb6741b,e834bfb24553b6b8abe31f4dc1c2886de27cfc0833af92dc2e8f7cacd016781f,518a7ff69cc07c77350a8b636d7bcdac4187e823a6d428fecb1678df0174f709178f73b270780511b3d618533589db0c422e6a206e28a552da0ef5815fe346bc00,cc62f25e0fa2d73c1d3607971127a68c799a8f2e50f7bb87e3a3cfcb860ae94f5c7963bfa940bd0b0ba808dbb21d3db15f064b2ed155d78bd2fcac29d41b511e01,11dc0cd486b8223490e223cb434b6ddcf826b8d78f3fcce1153c8190eac4bef8071638f3d2af8d53d68c16398f39190a0975ced4d1afe6099ef06bade37e55af00,865d1d119c979e3f46549d2c16072c993b403770b7b085d89299cdd0c1b7dbec052daa9f62fb6d5cfa4928078900e13a39f4b526235d1437c09932c752dcaadc01,0dee36354199ddb8e40ceeba741f9b2df1ec0c33e5335125c68097843c200c792fe5d4d3aff7fdf6a73067beac9457ff01f543cd5347409f47d85af583dbf3c501 +83f372884b7dc4661804450fe9ab0bae97e1f56321492377602ba3e3cf2914b7291ab714700a9564b76f29712089c0ffdba775154fc2624cfb008f111888b3cab2504fca4323072cbef278544039ad5a7c07e6f6e317af77b7865c01051b3de184e2297f47d5552719eea60c2e13e61efba93550ae944e0a9df55bc76c1fb3e52e480eb71ec0a446a563ce7ffdd9cd8c95b9b0f96a42cbff9e487c1efcbe5251,ca0260d071a7b7eee7195df5589fff01f522105b05865241a697d997280a3d20,9bc589a5f113176940a22d499fa17a1de0140ee465acd443b69a3079e962d0de23a211ce68f5f5ef6cf2e7f5ce9bebb9f54c384bbc7dd8fd72f204438bb1a85700,28018b1d608f19e5cb475ea5bc1e8d7279e5f6a9f46c3239b8f60a14830b39963558dbab2aba8bd1e0f2ba5caceba683a09a657166a0a8d363b727e399942f3100,162286ad04bebb9931e100d15ebc36f103f47e797ba9a16c872741d28a23c87003f84b736080d579b1836b408ab9eedc1d7a315c4fd515b8beb309156891e31a01,bba6196eba04e2d15c68c2e3f638b0846fb1c2f61cefe299a0486a8a5eb81b4626b1244c2009cdc1875c6bb9727a93f4adc37829436db54901e69cfcd9d08c8900,86e4219282f05165540b763df7dbf92330400e3025a2fd80a5ddd54f2afd032945c97fe948f5e1c0ce6231224dda1f00e400897c0918087d8cd56485765bf55701 +cb54f1a5451ab88705a5b160ac25813fb89ee7ba8d4d4c1cace71853a002a640a3f7660592b0097e86e7c647c3f9e454d46cec51445a1203faf1f72bb1715b98c6fcc75e8c9a7b09e921e915a262bb2550416af7ec9f58be434af875b58be1fc4eed142bea5311cccc985fbe73c42fd9f3331fe0fe761231423afcfd5b044ef22a7cb8f36f487ac4d873505e72e8dfe3f61b1c96ff796ef7f30c7867d4916eb7,a0ec242eac33904d935e0d791c7420e8e9322d46407d8f747d26439163129062,88b15a73b5971d02da10ac8689fbd9f1b5ca40f15f677badf8e393dc7cd2f261078055e9978f9d6651c65350077177bb7ad94b7d63f579f11ca8dbd146c0339f00,ddb9952b5a479f515ee1c1fd12e01c117baeabffec7ff2142240a1284f4872636c80ef88e9157985fc943c579a89e4f88a2ffdb9861a85efd62ed9fe8daac7ab01,44874d65a0b9eba90ee9db945d366e786ae222f34cd1eaef7cf770480bde8b0d0671f586761cafccceb355b73c62ea22deeed0ac4506d50ab7fa10dba4874dbc01,baab1f29cc018221ec1d232382866c812354f3a1b1f361f07193ebddea862ff95e8350c06f7b4b44ccade81199fd81fabec4f415a74e143d61db111d614234c900,18a1e84194e6fb3f3410267ba7a40a38d9ee1c2e7a461fd1a0abc75d3e0a3b77101f20f795cd1ab1ecc36960ece71ecc8cba691146f6dc7120cb48313987c0ab01 +89a0ded6184cae7353a6a19c92c45b5eba86647707b4216abb7ee231b3da6b09ef574daea2dfb5955c48ed5f87927f452848971448d1404851285f1f01e81362b509a31f418a6409b60b3c9a32ea25957785db7b83fc83c698b822415880ded8edb701455a811e53067c3c8b8a5fd91b0f30e663fab221140a2fb9a28845ce6170213f6652648cef3d9edf0cae677b79c6a04d76140a0567da308d1667e382a7,24ff769abd68847bbfbf25f0fb10b08ad84f5313457db1b05fc64a287a7a573b,c154d770cfadb8dbf2800263c53d462d463e05dc2c26e4e223cb59a0e85925a04e1a940ec5b64fc633fdad5492bb8f91050543581c9fb5178a7c6da6dc039b2b00,ad728454ba078616cd876736595ed16de5ac4b2d7bd1aac4c56aaaa90ce2bb6d21cbd93464fc12351e0439b10dd5f4210db4bd3c93a33aca3874aa4567be464300,171a3ee17617cc32f1c7e16aac88b790cbcbf0ae940e29faa16e228eea2cf42648e04268264399a4afd40560b66e960347ea657994d860aa773428d23aad10a201,efb71c593bfadf6b1705553396127c886329acec76dc167cf34c7ef37483a6645e66d583ee102de60912b2b12d6f448846afbfe5de6648b018f8ef53baaf8da700,28c98473db25abc68320524fd95c7fc855fdae1dc32c6d26bf2547346b3ae0622189c860c6cf278b358ac12aa947646c86b2ac6a9e828205e664f5c50b1f036d01 +4812ae86393d2eb32dc0f060cb0eb20a8ed52bd8b063b51e4e813cfc57ba0e10db6675c1c4065c3c9d64980199c90ff61dc38638e0bfdde01193c40fcdc2de17e797ff5dd824c09acc1a5e74351469c1e1eadf7415484d1e92a21522461bac0c26d25fd8af9735344a1b0797f3f1f18d6eb7b306e2463bb037682e78c0fa091027b152695f6a2b89cd4c9ec7e9e7e097d87be5e8924cd0a5a1165206e7eeff66,f8812525a5b26070ff76ad7e6e550c84aa7b93cf8f7471b01fc3e32c9ba44182,6e9a1e8bfd458b5238f09e9f87dc79f5bd2d35d3ab5cef0a2243f747003ae89702ccb2cac96607af3d2cd6363bb084209409c627517dbc75cda8feb676e3c66f01,73b11df997045bf4d6cafca429cd03f9c2e004250b93660d356aec600b8058613594e09c69961d17f0f46ad71af18c2bcbfbb17f9c7e834ad915ada51ed5864c00,9d793c7f51548baf541d752c79cb89f748672b1482f39fefd3ae5911f358fe67031bfad82aa1c58c96c79f7ff20488a4a1312b456cfa6c9d273b94f793838df400,e7da8a68e81a2f2d3f83231b2f6c8fe071126577e633c6e0e97cdf8643614ba2795878890b3750f1f54f75a1d35a3d2ae77f15f4d61267c382510deb2a5940ed01,2a0826f22ba3985c1016afd49a45163e84b7d73ed447430c251e59a62e6b444d3c58c0f074d3c635d196ef10e196ed760a1a49786313e97c1feb6714b8af06e801 +7dd1be75f0941e1d9a2c15c0fefb55da2ba676bf774b9cf92b6470b487e5875cc64430585b74990638dc33c298745d0f5242e1b07a834648d1cc99228ca04f1ba72795458019bfa0208b2b116c4b9befd886ccf06261bd7e44d5133bb53e08e1a42ab7a3dcc576e18cae753114b818dd649e46491f7035d456a855942b1b654e4967780b274c0e31da311cdcb18d1b14c37461281cbf49f122e8c6dc75960da264,783e4367c66aa731d296d609339060a06a4c6d35027ff7348176ead1bfa9c4b9,d955c8e68ad8bb853a398bdab529a32267c192d95fdf00ee1e64924c6e8b4a5f6e77339f24272880cf213e141a97d412f743893ee6930f92eacfa52dbdbc7a7c00,90c5aef2f1c3f11cb8a2eadc2770452795c244b2e66383587291edd079d95865138673f219a208dc172b5bd8abeebb86d772b076145d0574e1ee1d2205d8f1af01,4966e935ea245c02a352286edbe2fbb1642e4e5e522ec2431f25a0a64dc049f46990060bab37f6f440613aa505b7407417f6dea129bbd500ba7381447d24eefa00,47b7018bb4691f0569ee8d747ca5d24f8b6151346d20913d58d1a631d952aff01a7c7eabd12a89c3305361c05eb32884e019efb8c2c094e932d8f9d7722acd4000,d7934f674c3dd517bb48aa377552a04de5271bb4e7c728fb18066cc18b0ab5ee11791e7702a4d1984196d0944f832093305f151fdd9003263888df389848af1900 +c85eb956af644bfebd0a99f829ef6f03eed9f8722fc714483b93a5cf777baffaf3e9c02e86a2e03a89bdcb7535463be95018695f463f0fd11e11bd2237ae67d173e35aa6a02c57dde98882415988031b92d7cc5183a6ed7493c6ec901be6a0595ebc2f4fbb65294724d752d974f8ba6f0cff5399c77cedfae3a6bf2db19faaf1a91eccb9d4e6edb40f806d75274af5c1d35bd5d547e4105b3103af09c19ea25d7a,3197eddbed3e2a98b43eda67eff4d771a181098c02e0742625d215f5dcdb3d9f,20bdf0bf27c1e6ddc20ce579a633a348f15a8ee7837ea7a121ae66be819a19132733146cb3a243b2c615e50d0e98251d61bdc971450f021efced1d44f5a2e40401,f7a1f68a21d32184861e8c2656a3fb0c7574794c8e3048c024bbc1b9bddd7d8a4fb3d25c730e5d6711452c4554e81669eef44800896a4d98e58efe615ccfab3201,983fb9774a9a19c39f527c7f0020e4fae342bdd485109fefc827edf7b3eba5db2522daa1001ad3302e3911a9960e96e4ddb85b4db689ad5d5c2883315b92649e00,4c9d601c463fb6f198310d1eaf7cd11060cb92f98b8b1b9f52acc9c937dd5762352e15ac2442dd98183139f03793ea2b031d97dbb113f33b312164fe3343447b00,42dc3bbcb706b69aa91bcf9c718c0254db9c135613de2ba2e78e2ed39303aa55306f0cc9bc3b9b7c886d7899b7f342e476f83437f46d37ca3039ab585b03b59501 +e304840041e6a32b7dbe9dde2164b5b7d08abdcbeb44e682f9a0d2f6287c971da227d77418f8aacbbea06b871c466dd92b59270099f23aa6b2b84167c2d116d6e8b9192e6ed6e587afd5c633791feb341fe8ebb25555f67c127130e99c591acc566cfbfeffc6489a5d96d4dfbbf9afd0d27fa6370bd3683bbb3e523b7a2c9640c4c619b64a80ceef9b1d1976a8e9973bb707faadd1b869beb4919cf1def19bc71b,3fc7d1c87a9862c98e50b23a7bddb6339421e98a8c5e920be53e8b729dba7f4f,94ee43e419334521cd230b5d4517011f0c6b128f05fd04caa910b349634b955868191f7d76126ff74909fcf2bab6bbf42ad3f27535c03e3c17f45b04298aa6cb00,e8f15269472fd974f0ab68b5a9fc9cc49ba32e85507e32a7a3884f2d0606448b607de00848e5e6db924ee3ced2ee4a69f7f94f12c1f80969a7621e766df802d401,65e3573e2f40312a497ef04df24889261c9cbef318f07a8c2be76233b1b58dbc1e1bf2f5ff9c2d9f0c35a552ff8fd12e17279a4b6141b5b59e88b83d550fff6801,ecb0c0f33abf41a7130a7d4c8dd2ca08bcb1f5f8ca721a9157302da2a43f71076fb6cb3748af666187022af12b9627dcbc356651d3849a7c7ab7ecb201087e3700,3ad042ef5654582802dda1ee515b201697abcddb24d587a39ac298394d9377213909bc70a3f24e32eb00040ef86b3a64228a7a40e8e9feedd5f433f1e5920bf400 +19797ac41a5d278084214e9d637d976176b7998cc99e0040631e97d00af37431afeb3496e053a21df379e35342970d19e7ae1ab8ad000ea33dac808c3f1bc3c76ed3e06e23e44b8e113c3069d29703cc343335cbef0b8345dfb217bcd6ab84118eb1b1f5ef9f8cd955cf4587951a24d2ed06a13763e0907a68883a5fc7c2617f30075c2da3a89a0af9e80cdc6e7bd32733811357522c4002ba041ca0f34264bb62,3376194438317832a1bd689e4ffc6de5cd0a251d4193e62027dc621c37155f09,9db3e2540b79e044eba623189f9fade1cd2c08d797e2a9e572b46ac70aa8717e4c58be1d0d9339c1b73720d92ab9e931a240c2f3733433a189e5b36442f6cbe601,23cc212c50950ffbc417fd1132f082700071c9329d1dc1fb8eff6f7ce5b262441058f93035c7e33599a93e792e4bb72177889c32204046b1754dbc8f5df0eb2d01,a5c180f1b13e2a5b743665e100ef1b83048e18b8180c8749a3194b64c57f87396566ce2a9730b6e7511714a767e999eeaafb6d97bab7cb03485de58f9fe2a90b01,43e835d36281d6a3e6f6b47c11a7252b30f4f48c52ab6b24415b7fce939fcbf77815269867dc85631420541aadde0dddf924f9c62d0fed11d36842dc2b99389d00,372105cd6e6979219836cf6307fc2f7d0861b2340ba9a9ee73abe8af69e5ab474fac1c96c53fa3835dcf5cc5e498f25b2a91c7a637ddc2358d58b1ce7cccd0e900 +052a98a575f3d88ddcf00d728529ae89b6ad974263e13c7ad37a8d2ac69f75d66b1488fcf9763021b9c74fba9c5443f9ec642eafe6ec6b25b863b0a128e47c00fce945decf675489fc941e1bf62a7c85bcf6a40f06ba5cd2abf69a703838580e2017aec076c4bbae03cbba993cb82a7eef8eff92eefa6515dbbe364d8dcecb1359d0838cd9c676423daedfaa07e52a60a891fd251b28622d2cb38a3242430e2c5a,c23dea7cf62911a1282c1438eda39a5a37478f3cedf1d5e907201b7d91f94b81,523e3cb636c4416859ecbd6e9868638dddf8b107191c33d1ad745a194a8974ab1f4e7a95c526cba2f5325e1dbc5fce158d913a8e33946a2915427b3c0ef1422001,65a9696dee75a7b1b5c9d7c72f9aae9089d7b62962e2845d9c0d764c0454269e4adecabca29455bbb921d63016660b33942af82b8f2a025edde5e561c7da8bac00,872bf1ef49cacc1bf08fa0af23773e01859f798c17fed31d1b172f7f4cea8ef64b351b723786c35e445b10f84d943ce72fd89754fc589d93c5ea3c8e2174448901,b48af42aaeb5a4019795d37a18e5af08ec6e6bc1d0d5d2bf640f61313dbf5b0821cb22baf1286cc8f143aa2928f5878d4c41d4505c1687c3d0208566983fb72700,1a949c9c58deabf4ffc179fa7db4bb3786e75c538808a78cec106c58eecfdbf1595abd975926b7efd463a820a56f582e8de41a85b58311e27143136d44196cb300 +5ffc6fe5dc02bbeb114f227b263311d6e265575e6d1726c93d766b97c42d5e83318e3567c6827ef7fa1f1addb7d4362eed28c63afd0c4a7315e872b1398ee7342b81a92366762c9072f48649b9c1b1bb4acd345d477a0a5105f7671d41eadf4639eb463076f5d38706b57246ef519f115d083b98aacb60654adb5fea47988f5be2fff1a69ff2e23f42b396e76cdc54524061b22c50287eae13c07946f4d8034eae,9971f69717fe75ba029474587cdde82d3020145a4671a4b4d1b2eaec719483d8,524e05db544cc35e9b97b5155c22cc2781d4806bc36c7a7e1cad8e03f98990eb4d371d2e4d051d90edbd7068931ab50a65663c47ca65cffddf6321968f24315100,88fba2030765762da49e8082b7325c265c35508fafba99adfd2550dfba1092460aab4f019af8245d87587cd39f94e85ac56c2d61142f30bf83a3ae3784c08bff00,414a9c695ed52ee2a14417b6c92b149f2c77ffbee2d4c5984596fdf0eb4e61236149c6f28cdb7ebfcf201938636c75d8e6c1f0665d1550c020edcb282ad44a8401,f8a32f87e1c60c38f9c55a99b865b030ad04195c1526a801cc3d1ed6939a300102d15bf4cf7b7b7f6b6286c4e84d0bf1c16b9503ef45ab50d13fef2a5f94c3d600,0a9b63c85e698e3095c9fb442b0c1785753614ae1f5b3d3f8372ff2e772f2db6106da9b617cb77753286c8fa0715b3b045474b4719ab6a9829fc52e2858d881c01 +cb106b323ff20eedd752be9d72bd21f552178142f0b94ceb687f10e5338ddb2b0718a9b8165183e813582a89ff8bb49661d579877497ef13f55d588e092563315e01f941dd41dc2f7d5bea2a6d76a5be4b22792bd9f40950804cf690a32508a3c493e86a2168c5d819a1664190ca0fdc7b78a23151dcaa0b682ec0997e3fc5b7c6f427b9729d17a439f15189600ed964a1793a9b26d5767ed4a6b123db68928120,441998c40e32c6cd06c2b0ed4a16400218d3d6c27a2026a46f52af55290bee6d,b5c0e1b9518ed60a6e80f57d5f94e8eb5e12a81e32f54256fd3c028c6377dd50612f0233357b42028be27d3023ba5711c0540bcebc3491510384fe0e293f7e3e00,acdc087235dbd06d31625ad7f54fe9da80590697b0f7d6f41fcfacc98e4136f158f57af75e8ceb89f6da795a06268d2a4ec43db9d2a2c07ef6cbcbc8ad98ef3c00,20576e453a8d656daedf7bf82c98206fbe1c3fc5372c2e65cf7c29e1a08718cf6aea8a01e0147dd6a70615878fd3b15effd3cf5c47b5ccb5a59bf228c8a04fbb01,7a5ea7eb0ba13f44fbf4ab43404633413ab313a37ed3522571a8e3c01f52372c7697add9676ffa818e55ad6c99292a8bf090cbc205237ab69e4b6aeb9439033d01,ff575579bd4e031b3b6e47a4d45b85fb2faa8b4fe26763cbd079d2fb41770e1e63b49d52c8a974f59546223036cefa7c1ba525ce6560522b51704d216963948c00 +d2740944ed795bf55f606a6cedfb34f82688d851f0e043a1fa0f908aefa88324e3ec3942b302dbf3bf234761bc8749bfe6d0655830f81392fb90a90f5390c39c775333a6e6ac489d6f58af108470525a2d6fcd35107d554448a86dbe174b1d6643e8cfc0b0be7ff823ffbc5ffd1e00123d9d782481db86b3d62dddad55f2a71c8fbed3747c3ec816f208fafbe3da55098ddb69a53edb84f3daadfee33b07e50b9a,cdf908d717de682ad40b6ffb0076d0127f00197e33ffd552a6942eaee354dd67,9cebb20584c8160ef1ae24a5e22d591a4a8cabf5f79e45205af73a2f7b7f0da91d3d6ac7b7272a38fb96af716439664af5b9c265a80390a9078f05a4b5f0f82c01,ff97592a6e1bc4cc3c3a8b78234e2e1089ce517d356afa0785ed79535a110b32456f662fbe349474217cf6dcb4060bc40b49ec29536c9a0cedab2a7be5f9efd401,44a1a6bde50feb2414622926b8d91a643bfbba0e775a75f0130309fdcefea3d44de4b62f3db4117a6ba97d40a21770067d609c8e54f8e935852ef8062be9a10d01,9db93465767ef8fe841a23c21dd0d26e0dcc1674aa1f12b21d784c4314d70dec2f6a3cb96c161cefb08088a7e813c556980652be8b13c331782db00ea8c3b22901,9e6892f627570c5939f6b0be91987aa2566aa6877b7b75b2c60b0239afcb5b6860b39ce633eeebfd6df25dc505985bb2b9790d6a54de5625e39e8f26a70a162b01 +fb395e5116030d7b3c0b89aa85934dc937aa4e4188c8ff98bbaf353f424a864d31bb1b7b37621b400ced2f16bc2e9686437d62bca7fe992dd15a45c7d82cfcc7330073e00aa992e3abe4089effabcd82b63daef69e09b96b1cdbef8e759ab076b4b4a5d711baa86ba43193a3b6c605be4cac82388ce846c054dbca732e40ff664112368048aee8e7b3008f0c6974b0c9ad3612ede19eb45e0e07cdbdef0077033e,fc02325a709f1fdf66cc382a7e5d887493d35fa3f78ea1c9d2c70d05d11fa7a7,ba6bfdca29a341c38ee51d2e6c986c5f47d918f7d4b7ebbc77bfed47cc11e709080501dc4b3712ed850abe9cfd66c11214d2e81a10401318045a63edb6e97d8701,12cab2bfe42b7a53ac722e3f977893ea9ad3c0c12f4c79c1fa350f3c9f1040d1545f7e3d3179260bdb990721f82a8883a92ebddf63dae2c829c540b3bc251a1701,af8cb1e6fb8c7fc8665c0e0aac74369979015aa15b56c7a215fac7225cf8b6987e098589679c2354fd1625a3c9ae4bda571e911b636cbdcd5f9e5402dac3da2101,2a1796b2cc68c5eea46e6ee40cb9d3a6e4b3458967710af95969297ed72fa03e44507edf2c0978664577db767e597d8cda6518c79e388199b4c466fe10b1b85801,74a3efd998f23bacea5862ead28e26bed45e8f52a3c67d02d0a36ef90e5b822532c3dbd336d69ea153a8048770a4d79fbeb00baae3ef366839f0a68742ecfeca00 +5af6124716afa97bcb3d1e769b4fe9226fedb94d6a3d7a978bf7dd55925c49ac1fc56e9b9644abc3c704899c5811d32db1d5c7d8a1c283fb67d6ebd5d43963ef6b42fc491873133e9747c1c7349366582cc07176e9682472e01eb33c9036e3ac1dbb678de0037c0bb33250d9726e0cae57ec10810b4815e64829293106af5540e90e8135957b1263ad1b75029897cda2795ac8df3dfdc53a7ba9bee89292b10e75,d5ff3330739486bfd29656869a8b01a6a4790a2224e23fffb939d092bc302cb6,0678bc3f6874f99fd6add0de584f704197bb0bd2656ec2a45c40e42ecaec4f8743c0cb248ac962eff0fd4b3869cfc05fd128ee94af68273cce3ec56b3a36558901,01c7e5db8c8ad7c3b1588b625eaeb7552d23a911f401dc1728416ac7cf7559f710cf66998a83e9bdb5e7ab5de48e4edb3cc59a2df3560f69d08d8d87c94f84d900,574658e4c4b1102fd9ccc9da6d99d0e22bc10042c2fa4de2d74f4edc5da4276e2fc3e01acdbbce587db4d6ba28226dd2d925871a71342c3afebf84e3df2440f800,eb80f6e20186896656d95945f49fe2b9fb7194e97ce38cb87a0bccaab5d095920cab991e12483c3158e019b711eef798edb2bf8e9916f856cb83037e6e5e041500,8e62abf0cdd1df3bdf63db46948bf21ce70a1451b9fc89ef78c666633b6bc2fe00c37480b0dfbb7d85bcdc337b45aaf1cd99ca51faef1d6a5bfd3a90f3617c2100 +f3bbcd06339b798707dc899cb74b3e4c9b3cf84b345edfba379be1d4681f978e65c01db5e92f1ab257dd755ec48a08f959493fa0fbba7900ad8924374d912b4cedc887173982117cae7db7784e428945cd565aa6941fa767da1c5bf66a8cff6d9e96f4265caa8418b4f20e9e00af68fa5a0f288d45407bff169d7c3ae69abf9b05bbd002d3c4f22b5ecb45447e08950f82d07b2666f2f855d34e4006642180d9e627,c2b22c0eb71c4eaeccebb6bb0cdad787a069faeb6a771da0a5307c6233d3ea28,565a03eeefc0119f6bb387ba300af0b612ecf5460d87474d2013efa00872436b3bc491794ce693153877f6e62e7adeba8f6628cdf4623d3b47910c7748b17c3f00,af0917cee2a2f4cbef4446f24f10f947bf2a703c2893a294ed278c83f14f7a2a1f06ef1da37019c802b0d06a771d7409e394d954993b61c19bb35a14da92617701,8bf2419649fd87b2034d45714f84cfcadc8951605700877398d20f2e80a2fa170ab2f91a8a75cf79b8a449544ae1cbd07bb0e04c3a4ed499e91f207b7f308bff01,dbc9d51daeba41cfdf41898869f9cdb7e4d9dfe9569157416978a02cb7684a9b44426ffe06c617c7ce2b799de592f2636be7bec9ed56b3b5304dd839cabaf62201,db2703fabe0f031b4f92d393ad976c2c188331328a85b8f4a5ff71581c5876b939f80e3659753d61865fe1a54db308dba3f6a6a00184a08e9606e472ba6ad33c00 +379b780e61b193764b7df1def3a6e1b0149a200873152bb7f91fcb40ccf1b035546a22d27047a81348c04a59550f37ace2148139825fbe8d679d09f30c1f13eb16d7f0f1e571e07d5672c29f3279a74aeccff15932b2e362e4d7f24ce4e07bb0d65e71156960e021d755e39421ce986d20e5a1f529deaf4724ba61f4d29d22580e308d707633cc21eec74eef8ca6ab6c8508be4d83b6ba7f6af198c1e92640a96094,022fecc5dc9ee317c4ff25210ea749b6fe9f659e808bd19d9bfaa4387f85e304,6920b996ad49534d0ddf2258258b4723d3d6b417c7d087dbf5ffef1fcc0a9488414a223a168e3f6243f56bf32d9dd37c6a9d7fb95ce627b0721fa87cdd93d0c001,237b2ded9a605092b7b4b239de3c452b151aaf65d35c3a8a160b119d7d03d1a9392fc4493fb91b4a67a523272f957a567c44dad1266b478999cfc0b7c071127700,875a23ce1dd9640d6279551b5f000135ff6f0dafda54307afd89ab5bf700f95264cdc6d14dff6228f4ce1256413b780466b5684aa4584340fce5c2ad111f4dec00,f0b8622b28cec0d8aa5c382a35f2ad70681bf2c987fbed5f14c5974022958c9e6c5c50853411dcff134dd477a86113abfe9e5b59445976339c340cb2aa6a561000,2e7bae044e507f51c047a2a58b64524e7afba1e02d6ffe46c6d67a772fb4a8f3536d371e15c62986ec6cdd57d31e90d21905c2cffc8da605ee79714a4ef794b401 +e69b7dcafbca34e14c5c90cbe764cc663328f807789a0434ad37aa93d246fcd1e9999c275cd7cfd08c0f1ada65dba86a31519814536ae11a6dd7cceb6761d02f22ed825965d16e54144120d627b627bc816b4b7f0dc4e20b9ee8cb061619fef59a89fc3bac40b30ede2be7732af9bf19f10de86cb61f0ca799266ba224d74be54e6d69eab2634e886e9b268b0ffec494726d05f7213b62d9c8ac68a111b5c62da622,fbdeaff0089c0335ff512b8b554c9ca45a30d2f6bc30df34ad14c04b20007b6d,69bc70f9bb9fcc7d1c56fbedd32eb890abba7ea634851f04208e0d8098ce3aa30ccf653549bbf9fc1884d521e5de8199e39fe659aff192e99897d77e6bbc92b801,9377709c5c5a4f83df362260d6c058d6203bfa6924bcfd9087966d73f5f1556457d7307507ad932d6fd4ebc7466105ba7566b5ce75d83102c74e9ee96cc934fe00,9626d8cd34af0d93dcb446e2883a843273ee9dfcb21d313f90e9cc0ff4ff1d663837464ef4f8492dcfc292bb71202cb2f1a5a7f87d0097419b4a2eec34347ec900,d25f244ed9a3d92bcb36452bac9b27a9205b5d974ccfbecd6fdebce848768ef369e980a3b090b51dcf8264155683f96a49ce69771e8f38dcf3776e8110cc7dc101,bedc1da0bf9b23a9f9f5a674076f5d07bc9e6bc180e49450a5c42322eb34d91f552f59029f64c471e5e6d028df3f5e3627aba8aab3d1d3bfa036d849abb4ca1c01 +f9c3e8e513de64ffd6826abde9aa51471c258e4941f3f42a284190ad42b2f153e18fb4036ed8e8e66843d01cad2bcde92dcc393034ed32ed2cf68af8e51203cfea70fb7e190674e0fd019dcdb3df41d1bf51d16dc3f04dfc1680acb2240051da8d1867a2fbc2841892f7b324c25d97c20e98b1131b481bb956b1941dcadc7bb959c8118c4c15c6de7316d4cce5190f095b8532e9a51a416c94e1eea0487adef6f6c3,c4fa6778803a19bd526f3b04b7aea377150c632f4d17143c6ed59a2cf0a8755c,3b3ad425d4e17a011e73f55b16ee399a82b13cece5b8124f6406de16d518d1cd2b4ded345a3babb229a03a1124975e6dc87f1dd47adf0284c6d3080b3ca29e9c00,d62b4f365ddce3047dd88a78333ee8f0a9d65a558ea1c422ed5c7bb7c5fec7221b2410b6bf20d3af6badcbefff4b28282e0230cea2d9eff134e39b719e1c2fc901,cf57e85f76b4b2bca50e4af7346aae1e747288d331fc46e11f5d0e22a4a8dfc22cd94cd0059681c128053f5961c1cd3c8103dd76b359479de61f680b13363b2c00,6d67afade8e35513af662358a59ff246e143d71e7e8a1e1cea6c1d5456ec1cf305df722045d1c682739d5065e8d073ab5984065a34fa482ae4d3a0c2f0735fde00,a564487e1aa8222c606574bac00c99b3e5d82b4725dcd86a0fa469fa410954a21e7423f5794bd87df3cfa83115d925023bc943f222bcabfc866f08fc3e04fac801 +81a4426b4eadc07c9212d96ecc10df3f80837fa4d14dd0b35db2c23f1269d1f7d6306bf7d1fab83ef4fc3864dc9197af618a400aa4af7d63abe3f7b5c41980130a5f116982dc087d8c3e46b365f1d386c86fe61481a27309184100910cce6452146b80f1470d8d0834081d51b26aff2a119a9af6e83131662680a243d66b1eb2ce8827eaa22dd721daaf1f7c32b8e04edf79699a817b9894c447fb3984bb54777299,87d45452fb5e14d8bf0f8608a2052744215b39611b6eaf7d5dab6534474ac4ab,309d91aa5a10c3df2b35b0e23eb0ca58119d94cc716a34ec5b64486af6dab97d6d0ec9ddb77234a52d85bc75f2bbfee566a72263fc3b36fa277d8834bc0c0de701,09b51c1200a21a72ec5d531900b268b07ea7fb2c01defa982083a636686e80d67be4d6240bbaf241d37f66f2ae3ab8c0ffad0c45e377acd246d20788eb9d6d5c01,d3945ccfdaa427b0793593fae5dff94518ec94070486200ca237ef7053d72fa415bf746ac41d6dce8a98ae40d8675c7cfbdcc223b60e0b32461d495381aa9d4f01,c4b143debb2a0ad00fe99547533985e12382d25721d28028226281d7737143ea0a83becfcf2c52f869b3acc735c40f1330dc6253c6bb89454473a99ce46200ee01,c135e8b83c8d6853c004e1c23c3a969c3229bf57a721305ff1725ce4943dbe156dac4f9e19da4ffdb505140740edc0b50f8f67d939f6bcef5d222eb8729cd9b401 +defb6e5470041e73a0767a1f290707c700390d9bcc6d41320086438011aa63f0774ec3358b98ef54f1ae8c578908c52820639418a26296af1a1568ea9e2daf289516e0b25d88895cb6eeb7f4066bb4c4cecf371dd3a3cb1c5044a88473357d151d7c20fdf55463a92e5407cd8d6721c207f19bcfddee355428ca95a92a269f5825789c6f99cb548758e37daa72183a5374a98622ed00c0737e547458ad03d98df415,cae46e9e05af22dbee6f13a586624f2ad512e5d90c0d9235eba8e98454db1b20,33b3c5f814027cb2b4e46e3d5a264b50dcd88e69da8338a166af6c588382b3cd14626dcd030e33e1629e3b941e17fb4e245efbacb11245f81bcca560e5a5b2ef00,0e1355bf403e62d39d046bbcb9c75f878908522b53ea2291fc4ca2fe4f79c0591fd395aaa85d3b7e9614964cff93d0ed40fb6dd4718fe9894d00d708b2cd1f0400,245062327f8b5296804161cdaee648ac9e941cf5c03a3f4cf199d22db2ab50f84c991c638de746e4f048ee62337370e4ca56818f3528b3285d94150ca53ead3e00,2aa6d1096b951a787e831e8e4258f0374a19910889639fa80aa1f2d68ffc0f90038fa8139b72fdae1f96ac309256c27b3adb00da00f427940f9727bf77e0388b00,b206418ccdf9b806b1c1b8cd2cf10167eb03d9439eab6aa5902ca4b2e1b9e36440cf26221691c53eae2c6e515c44ecf77068c0cc9cfd58bee7f5e25c73d2782400 +ef47b9b223a22e2d448121655a29cff57ab7b1f34dd743e845ea1dbfd24d379e578b1ce8604ea54200fb7680d683b7f0669326a8de904c02c6fe8ee3bbbfe1fc4325cb5ea3cfff0665d81c4dbefe61768d23376dc64491ca4bd7e41fd6ba9388aafa631766608c12a0ead07e6d53da6d03fa72d18451205d659ceb480e2771017d32d07d11f3aa6a0a5a0e913812a8c7d5baa2a9f5df539ca674f4b5b346880e95ce,b0e3fb16fae6f316587a394e7ff048a2144e8163c70fabf9fcb6603e2dbba7e3,19c6a142be1f5ba0b4d96a603eea700e215c54aa6fa165dd341c806e17823c2a5f11b469dcb99efd6cc779962282015d818179bcd6d6fe60ac8ed772e192896a01,05aff8f44c7571cadd67baf7332f3df686954d76e0660529b491f479112d80d75f78dd9117e6a9773680e427100d7619ce05526594b2131e65ceefc2da10b99b01,5319f151afe02d7d613a57427523711f2e8993685a7b1e2f80149d2ca932ca2e23c3d1945dd7b986305464e9962811001cb56380ea8724cb3544bc603dc490d000,4281180c7ddc59712742d873efb5dc81cac7398c471e6c0c4e285632cdd9c86d26706d7980c8756a1e96dfd24dc28d1aa57575938b1be98dd2a06e1de48e796501,16b3a72416314b25dc74f2f41f4d9247e5cae0a97886d1c63403f04ccc5b714a71b675f7682f8cce57f1ac98d94f082ba34a943daeaf7650d2007ce3f970222800 +dda54197690db6b4da33dac2dc4e914ef0f0f24a95a193d26fbfd7bf3b678b9cfb8ef121ad070ca5d81f1050561694beec5981d8a1a82d328646d8689c77dc9156c47f9d18766c39b312432bd2040cbf13d8f8d3b13124057655f8c071a32d5020dfd35c8710d9348e609419a34120fa42f500b9e879a927ad626f68078e6fb62018359ea80ae45eb986b8a76bf21c1d3f89e9bbe5d14466e8b6e80be3a4fe7a25c6,c2762c63d2b4734b7bb171dddcdb3639caefce3a15bb2abbcea5ec78428d34d9,38bf68e79301e487792f0e9c8152367dc28e4931e2e154881fc35054192c6b48567bd7890eeb55ec9e14b0ad86dae33d3112f5a2c62c0c4e7d1e4235577f5de401,1c6fb6951bbb5155ea03d0ced221d3138dca9c346d4b52c17e4d08f7dd37f4be33ec1f91ecae8b1674d2feb479ea36b1ab2b3da55616a1b0c59dc724674b787300,3a1c81a74bb6cb7eed51eeb1aab27b432574cfde48a6536bc3439765d19fd7277950422fdaac0a141ec0f8b95a85dbb4ce43418214effbffbafebb414ab4b45601,ec2e825abea35f8fbdad37136928c02513ea2e103171d3c929df21098c7a6b4f42e6641a91241449b6071c285e860051e630873ccf876110486e57c4169c547c00,7b59aa33d62c6b9e327fd32f65857e78cef78689d166600a66583de087f5f8205b6b463ea0dc31dc3b4cdc20b4116074d5c8ee40c6ef815ad8d8260be9b59fae01 +8b04a4b3f59e16f17198370dae6bdf1bead6f8cfd4df17b33925c6a31c05d2d4be59c498524c0913124d94601717dd7d93d1674d7d61e4f43c8bab6c91a95accc8863ead7e10b03e8dd67687fa9dd542fc9c854679aaba0dad5d417c9598abdcd1ad23c84b5431db3233b62bc46f9591b35efd1efe6a83db289639c28f073b62d29e7431d413cccbdd7b684e371dae0978df098b1fe7723c0b15c69ab183b3abdf98,ccca30619f8ee809a10432bb7f76d128bfe3b01cfcfe5f1ef4f477d42d6961d2,30aee09462bff84bf0080cb45e29790ee7c87b21d995216adcccd00b5b160ceb53c70cf4b8083b6b646d7690a89de5c9bc16e9f106003433c15e227e35834abf01,9888f4a3e17230cfcae333eabf371836a078e8b01650a391c8760ccb1a0b296e0c6a35b771c67f61b634045790da9c68ffbbc45bce126312dc8bb8eb0202f92300,2287a4bed66e3fb41526a5eb0073b39c7040722b8cbe588e51fe0d97d843f6ec75e83d3d47048493ebf6ea53ebe142f496c8d2cf36dabfbcf254ef627b20707f00,6dcd3500e47e923324ec620a7dbf0f0b137661fb460424b9990f6654572940d828ff6e989083bcf8cfea19e919ddb00d6d1dfeb99e4dc2cf6e59b3680e378a8501,46d398032de462a67e132b2f8630e3ae039a15adf9f8c491537b81e0c064bdeb1ebbd7fad81a6cc6d19db91fac106699f74baadc2b83f0b66043651ef1246c3801 +1a0b90b6d28cf008f4cddea10352def45554f13b67a45cc9669d47898039216c479082b6ccb24ee05466eb31dca86a4a35aa435d081f9794b18144847399754b51fb2228eb22cfbcf460f4109e7e2997f186e1c2afe3315ec049e6d0b79665dc0e34e7257a5f33545596f4f609c73db337c4d363176de719010f879fabc1feba8d4ca72397c00a93e53a429901bbf8fc5308656852bbf0c9ec457a149f8d90f9a901,b51a225d8f6b133dfbe4747c500e7574bbc0d289426878f5efd14b4cf6acce30,66c95e1e582d0245fbb425c3538c8a3215f0ca34baf114da4efdbbe6cfa4ad900c35fd0e464dc269f8a3a2cdb2d89995a9c732993a65d74fb811a94586fa511901,14ba1f5e59c0f6f51a4dd917b61da0fdb52940aa193549e62b2cada38da73f0d0ab462ab79278c3abeff24af3b2d33c53b36b473e0cf12c5716dbd18b783b4a701,443f4e9efd2d37fe1bf49d3de22be6428b7764dc0e695694d0686ad5ea3fde4e1d4a10754083249617e0f4c4c38b897043424066f5ace3ece034aeaa08571dd000,58b389528a15c4494de1b1b7d2622e973f5f661ee772a10ef37366099032fbe70de8ca22feaa5af5b25473f8a17be70a30525b10289c9a921872c5a3821b80f001,5f53f857a3e5989ee135e2746a00a283f91a0559c86744dd4dbab8f3519b6f3c14dbb5fcd83f9060727529beb6b003964222a7c972fb95365cee90bb26d7450800 +da234211628642dbe6286e7a2ddc1f11f456523d9907ef0107730c3f49ff04f62dd799bfc40f1164ee3369eef8ef7a0080a240803cd3188234ffa6e06593a8d692cba1c8bdc6229576d69fc9aafb80fe7dab231832f2461458e863f253dea94791e2f9d4b66be2562d8d191e82e052e03c7926c5e8e23f4c9b148211d9e0633cd26d9659a89e9c3d307ac67a6fc10a9fb5cee854853bff95db039d0b9229de35bf116d,9067f8e51bfc4ea814ea1e763f3ada71bc19266c92becc45db6dfdca18cc95be,ca19529238fd72c3d6c2e4bcf84017d5e78b7adfea834c3e9f1c8eef44996c54233bac39caed9e133f26d9f683716edaecc46dad92ab9ef898137ddf3f1daefc01,00a0c6aa4fdd62de70e314620ee2f49590fca0e83505da9189d165aea9e84c75493d0d2f93e7bd8d682385b950d571da38ff04853c9fc8e3040f25dd5fdbc4ef01,520f2789dbeee55e3d7d3efb0af981cf8a0f115445370fc84bd241b3505fafe9639fe8348d780ff13b47a59511e87f6a9e1774f58ad2b52956fa8401e59094ef01,ab0be7c6a99afb8f1c25b3957dfdf9567675f09dad5f58cdbaef486db2340b99546005ddac9c42eb9910f38269ed1b55576deccd5c2dc718388ba436def3ee3e00,8c2274fdd0a921ca9904498a5f22ef46ee1effc4ece4db362f8d790edc85e3c47f667e9c7c672c9f5b990decba2ac562abc836eebb71291cdfce21bd408423fa00 +e311e9e668672dc38e56d96e0b25f824d2619a715aac09ce1d69f3a50912ee6dae76b9de28f8f765c94c1ea2f06a649076a97f6d165e6c7d9507c623b4939657b9a73870703b72f6a9376004d37e5240b5742406d1f2a98a32e4a57297bcef3a41e572790f69b49b2dd3e667c2a64f7c3ed644745031a5822dcd8bf14083b35893176938da93ce649fadbcdd21fadcbde0857146ba874f6420f220eb42cfd3c32588f3,7b69a2f1af5439470a5209ec9fce09a12d7bb83a258cb00f49e927c0cc091510,afb2fe99c58da8efcf8da2d493dcf27f313d14fbc41ea89806665f3b008559447367258ba99b342f9e8db06340541acda9766769b70f4ec40cb1a26d7e3c6bf101,4cb075e3a6595e95c222bafa690e5eb32eba61df24839a4540f1b39d71b3a0ea3f996d2fc31bc230f8dc2de65494a7e8698ef11a18afbb051bdbeeb1b024849401,f41824d84ca5ddcfe4e0a123871a9606e7ff5cd5625d0ff6b78bf3221b6ab41364f02b038a4b28fdc549916faffb9b87e7f72b5ff2b2e12ed37f72611b42808c01,25fa20ed3227e6d029744fb657e2c288aae61332c56d8be8399793837d1b0c4b34ad0d047d2ec40b9dfa8213266f2d508f5936911dc1afd9f13845f44a07d2eb01,198d828da56b0164491f8394ab4117a040e5fe8e0f1273fae96fd5f21795a29e24232a0563bdf9bf03041228547254fb9e8c2e0f69bbbdca862ca6a9cd6e440401 +581eebf33deddd57dd23102f47852d5d407dbb1985f6ef17915f36cddfa8329d3cae3f02f9f1fb769c97ee1f32c4a37fb1292030c84b6c4c8ad178578f698e21cc8f1569fedc98e17b372df57adc5e98c5ab9ca883997f0156472a667928e5a34015f652a23ac7a97d72c3caad6c03e9d5c398b849aa31ec68e6f81b912106fa6b8a59f62f74bc4db086216a058cfc4a4315f76f45649c32a85b12c6c8a6010f4596bc,f271547f21fbbe16cfe5b661c8c8a9ce435dc15c3f37638819c4ea150e060a92,01bf12433d548e1e498966f99afc791ec04497a6621a8bfb724a400b633e3c5969eedeedeaa5cd0a1e593d7f87e0d3f52aa414177204fcf55445a26f1c7b834c01,4ae9b5edd177d5f0913d095b7bd54d9d2a6a6e405d48cb053f2923f54de1965b59deb16d5299fdce59d342b1807e5fe949f28ab23e576da7944cfc3e2fd260cf00,fc41b4d5019eee4e6a420be262671ff028700ad0a2c7b21bb740c92132f6433d3969267fecad838cf1582421712102ae4107254c5f8439ec64cee362999bc60200,655cc94f5266fffeea9bf97f34d1abb0bd6d4548af822311c7628df8de4ea374440c7a5f346b64201cbd8fe969589ddaaf852a02fe2c175da0c63460f4e25d0100,248fd0c69cdfc799adbac4dfceeaa807bfa8d875c3571e4c058149560ebb79744742ab3129f8c419ecc9f2a693e0421a59ba0ca4da1655b42ba949931983a1d801 +99b1acda361500a85866b2fefd44b82baaded6eef89918344c19679e8184d5d4480c1f9af34ce22aae9bd4fc95c821672afdd2c905e76c727a5b50fd8dcd99261949c1219fdac4405bf08734527e46c29febd2f0899e4b06ec388857bb21f0ab9efe8303278c54d139762af6ae505065f3dddf78121eef5e6fc5b18554344bc523aa148fb0df25eeae1dedd5d8d3613e117533e62082d5b9c93630b55158a3d09be67e,1959cdbfd42ef74425b00c38d7b7bc06a5b56a06a90da706aa0dcf560a7635eb,fb682a0c433cc82da8e556c185c27bbeed1a115467fc5015f8a9028e863a472e0c37e49c488e7133af77b9604c77308538a359c857e048f5c03097b3458b877600,7ca626bf603e959204fff49142ebf54018849d46a2271ffc27550c6bfb16a8db553375e537004972613a823c64724d3146220317035b0ba616a9c7fcb19a7ea800,6f7a4e9017342f2bc54a57455ff102209c8b1c328942c2d3fc9374f9ddfd61bc66a26bc2194191ad63306cb06ba79b9c83e1255b9dbb047e0598c30f8ef780f300,a1620ab0fb878d12cee76a0c0363f1fb5c4ebec815cbbb2e348ef0f1b6b4edc27d596ebb03a45034052b9fc3a5db9985fa4a2af0661265d56d67e28de23e328001,72290adc64cb91c1e07dff8fab88c65735e3532af208e562edfff424fbbdaa7b69cfb03a0418f789019d45bd6aa179f0fce82877648f3392ad11079eba83166c00 +318098522d2bff08d8b3c5b225febf94bbd6f880517d3f8522e2c913f1d4b1727754ad33f8104804312c7e582db0abbcd6178b168d5e5038eaaf884e1e4917964332b4d400184cd13bad35d5261828e37f32ca3b4fb86da7e5d514d74fde7459d6741a4e82ab604cc94d8a24dc46a16083f6333d4824588231fb56fe0c25812495def698c346a329fe7672926e6bc4855e3c495a0a949ef15adaeba51ac294d9025ab9,d65502020423fc43d15595234107466b14bc128f46cd47d0607e5488fda60ec9,8cad682e1d265ae6b5c4d769c07e30b731f1e80ca984f57c267238ee0d96e68d67efe0435985e85b1cec172a4b1da5efb007a47d89527967f82202e9a702f06001,fad33ccbf4da614473bee665b0012179895d18c0347feea69aa5173f1a1266b44c19cb7cbe0a00e0dc6d1d863678dd8e557a61917bba307373d2a61835efc66800,20f393390e160ffe49fca920e87a3687c392e00c5e46a3ad509ae84854f3305e696eec3862ba34c631831a9051ef0e71800e1283df06ce96f02f6769be66abac00,6eb94d95fa4acb690cc47aaab17cee85f83a534e4784c54dd7354403d4cb2a0a40f2690a78dc70f197bf4a8be8c0d284d6717295b6bd9a32391f848516dd13fa01,d934fd561ccd2a4eb6b4cd162a423fcfad9947d9a16c67fc0aa76bc9a47d0eee6fe89cfa7da1868a02293ac6abaa876af84cc98e95c36e0d7963e61c35a4399301 +67383e4cde0137c3b5039bdff3681509eba107f0e0d1a660ffc33fbaf3126cd936090249165430b6de81b95926d6ed582c536c56817dc1f81dd51e93dc2cd13288d1125b6bc5c30fdcb26686b23dfdb9835278343e0d16af295fc620fd4420d3671b63d75aeff07370698b433f4e5c98b6f0361246e8996c6e4ebce3dce47d46ec502e0919986b79b94f44b6e29c3f6ea89e672ab4e50b75e4e6c696e0fd167784685f,71650414fcf2ffe8df9ef2ea4404ec78278efdfd14ffbe4c53cc89d9ce8e1bc9,867161c096a82ed5b6871c1ca8460efad5ff54b2d6e5b1a551b8cc666008d6ef46c4c4780f49bac932af955a4bbe1c2773c61c00c2f4aae31b6ce4aec71c560d00,997995d1761cdf2c01449ad37db0a08c25f5192cdd4a194c773f0294c057426855d5a9b51a90dd59f5f32b1f1bad1ea9953c530d21d2c80e671449f7e5dce34200,30320784fe872ee8893bc0fd195538dfcf3c3b03db5c358188f545cde484bae261ae0ddb57d3b34c65ed86105c726a240e3b46f3c46a1b5f9a4451b1a0c3e41e01,11002f00fd77335c443b90f2fc7366fcd9587bd20c5607ac5d65db5796ea9972569938621980645c090612ed294c9b67f20d7cd3b6fdddf11ee8d0d19c7db86100,93a51b7c55ae645c6e1b571834529ecfbf23557b388c690bf53664fdd360e86c48dd3f4eab5f5470ae867cab1bc6df424451dda9aa5fe9444a2922bee6b8ee4e00 +ed84f4de200f38c1e6e1d07d497d8854eda7b2ca9870b7b8b3f8a252e657cd8e663ea87612752de2934271df02b1048fa94957d6b51a1abaf5d7db41eff320fd0486bd6c90a19327ef2081eeae91ab6c5865d6f49503862d37fcd2829183b6398f77630844e73c9d83c1abb6844977f93e42a041e9b6c34ae0c8f41d3ae81e25666c3cea26a598554f6035a1589d672239140c204da634bd9a4b22de63f246a99b3249,e5aa475e329175dd089ea049132d9e1f861c67196bdf1a78911d5622ed0d578e,eb59cf78659a8c952667b617da80a2d1caf64e2fed002f3397b20e0f501484bd38f3903b749ced8eb42d467d15450618e8e73e0d9b36cf62e4a00328d07f5cbe01,559bc491864bcdcd9903eb2d0d2bf6dac12e02f355b525263e70aad0478b96682c36e94d113117be05f8eb7604ff830a5ed14d117d2ce47ee39389e21261247300,812d85490a96a954ddb811866b1863d8836824f5a2edd9581f46a06d602676663881861c7975732e8186e7d29fddb91f28247c635010cac842ec7635a526283e00,96c95096cb420577cb19cc23ef1a4aec94500099027d9c3a278287d2f5975aa42dfd93825f524ad26260027559e685859a4ce1445427a1dc2a005978938721b400,0b23ce675d55c29383abc16f8e7718f6c5c67f52f5cccbe7b411a03bf0c9f9e76c9da3e670c23775040a966ab67b3c73e4c77d87b1bfc5bfb4eb47f4fd869ec501 +d8a0e137594b40b25542462fea78630d0cd233bc06ea60929abe3bb0e53d4d5009d4c98bd68d033cb837860bb8a9723eacd9e34945089006bc9b7bc1e3904540cc911b66986b8714d82a075c4c6ffabe81ef86fff83273a1a69ca6bc3c58c8b86eda2e17303040c485f87dd4b617469272a700538787a636aa1bb8efcc55feb1d0d66bf5ba7fe677f91705fe6666d35648be0c4f6f22d139d2f4719c1e03e24ad182e7,98497e3cabd8f217c6299e47fdf11f56090a231bbd62b758b1a8dc5b58da1025,51b125b1bd633b9ac2d1636b1e30e3fdc326928fe80c41eb4b587178293c36be425cf93a0eafc537d61962bdb0903721bc2e71d0abd4f52a26ae992b1341ecfa00,9ba89ce6da4894ef02548e1dcab6e4a7e3c57e89d650d3935270bf028c798c43394a6a1176e5c901da46a598e8ea4c91585fe9542198e519f4dc4fb625126c9c00,444679eccc1959f091ae8a3a2b3207ffc9cc9551a7491b377d7fe51ee671e1d6218c3497945f97f65a63c3e46e7df840d8f0ec2c10d83b8f8f32fa4f79ca950801,6d0f4eb9fb57d379473b47415bd0fc8c561ab42a9b009cf42e6289c6b2b88f28524460c32d3fad81b9ca5375901e33f9c6d4dfb12d24fb1e3c0c15cd6f8d29bc01,c23a24b587ac4c156d7ba72d0ad80e5f052f1885ce5db1ba9570f07c4a06a5ac5433104c6edea36f44a1d67d4413f4c044f12b03c4cbe9ee0068017b5280b18700 +b56fc8cbe78b3a2f115c31b53df16731e93867d1358948fe571f129453adcf51ddff5222a2a2d9833fcdba89649fd90875f5ddebbaf87eae6576fc9ce7b033bb862371557ad0534aa6d4597de0a6207681f1f01bd950c2c097bf322464650f80e379310a7d6a64d92a4389683d6d5103264dd30c847aa10632d7567f70f916d3ed85cab224404fa4d5a657e462d59fc11279af7a62844d233f97356a4209cdefa542e3,e916022debddc24c77c4a4bd8ae65e280bd4b9f335d31866f3e9aa04b36c3814,c72d546c51795d491ce74a0606d3df8970a6af4901699c23be84480d149505917544c7248d1f1f5160f3f96c4cf928ac1160556bc4d4c4fa2b3046da02f41d5901,a9adefd7c3c50668a8af37d4cc790d23209a31729fc482cdebbdbf462ffe578f523dbc5abe26b59d8986bc1642a89a2e1b0e2cbc0827a530777d980845621f7c01,debb0545d6e1e29dd45cca8ce0c88c6bac421222c75147c7f5557fbeada6ef2f6be79f703a702b5d2bab55849f88b2682308d95f21bf49691dcb6a136461545d00,28bbd90062cf1eecfbaad5c4fcaed6371e03b8fc0ea3f0dfaaf5f11637b6e4e13373f8092c58eb0b1c7c0acbf175c1882ee14ae187032403463ddff4bf1e782500,ea9a3b16a5ad03f1aa0f183f8cabbb1c0b053f588e30a98e50b8ce0522041fad7ec9f72de03112d1649a0bb66df01feeb58c18563b2711b032a44bd8d9df952500 +04fbc4a943b2b575f7db9e68509b5cfc938b1b30d0b381e653e204fa68ae73145119fba0d60ff451d60072b6c587418240e5e61e07f257cf34be5fc3a2e7d7571b160802160ac3f4baad47ee7d5b9fd7dc28f4c89bdd022454dfa6896a27aef98f5a6e38e58b45c97bee262ccefb9303ae65bfee9558ed2ab1dd822a708cc453668091fa85814f58d86f093ff178a78b02dabc08fe8d0900f3f8b5719356e474fc689f,50ad5bd7952f02abf0dc5a6bf0fe931b4bd8086a327d708e11fb4210a549095f,9129cafbe9aed42bab7b7251d83dabb1e5fffd6aa2563f9166a4c2265cabb6ab3b825276be381003f1af65f1935996c699936afdbc28d115f05c54ed6edf313e00,39325a010a09cc657835f9af53bec319a5f086159730b0c00877424dd90ba7dd17d28e45b729285d767ca266047767b1d734737f4b96bac1fdd8e9214154e03001,4c72982ca5b52e45848eb0f113d5113305bc47a34432990db921ac37bf6106895d0567185364a311f5fa82c2314186a31a16f47cdc1d9e6b9e3ec51adb8a76f300,1f527fc4a9cc2a94aa86e2441b2dffd02b3d620c4474968d95aca336cb0d49df5f2dfe01735ca99840ee05010b16f2ce00c6cb93dec76cce9358faabd18223ee00,88c43c205d28b6f524ce0e8110eec4eeecb79b487bb5bd85c04d917c6acf7019523d05936b95444ca85d6634837403ac499bc4a8a716606ff18686bdc809bd5b00 +88cf171cf9a4e015ff0415a87af4de0fede68258b84ad16ab9eda80512f9c374b72c57d7fc4b00a8eaa387b9997705d4ff234260d203f83d6ddccf672d66090385d1216a3d36355314381c6f376bef8d67dc44800351cc17073f11387a6d592c5fbae864ec5d9c2f22e379263cc3255f6b195cb1b01acd1198c4d1877ce5dff29b64b52ba6c22eba272bb535c01e059c1b1de051104cb1db18da90562ee3aa8e35e04af8,8fe1d89c8db16de5b490c4a632357ea7041be69d7093ae80f374d56bf3f9aa10,1619d28616cc103a105a758ef755c1fd1176b3638cae56a2a69b7914ceb936e37fa1f7b14af358597d81eb19a6b28d8ae230af91bc69534904c81cf5e3e9953c01,6b2cab074c660086e88d3317ffc018bed44418b7025bce6191f70a6ddf4bf69b5cc0e0b9f3a2ae3921efbe367d37da99cde201c6dde46d50d8020c10c44d295001,431a83578e6b93eb97e5853c4286b319ea8125b607f666a3389f009a09762c5a155260bfbd4ede7d68e09d3ec901eff284ffafa2a33010777f5de087d3685eb300,76e5bdd712eaca069b5ce9953a5b289ca2e9831f5cff6d0ee9317524e9ed876d2b792a32f6b0ac11f0ab3a28deaf665804ee6d5cfe0a1ead123af2d397ba640b00,5f5580a862d3d9dc1e6d4e195cf493f2c3d42b9673a522c779dcdd3cb6e2c17d35693042b135b30320cad19b538e67271b750c3841d3e49013809635fcde57df01 +8b1d242924bff2f20e0b0fe433f7cd6fb4b4f8ba9dd727323dd38dec4d16d93cd358df91af277b561013a69627f45752821dd7c223630070c13f52294ded4d2355e5eb89a04a966f82ce2fc2c9e797524ac1c235c2d988000a1c173b31c70ec3ad32e947b080829135b78566803acfa18665c5df1777afea2db091b3c15f9b1c0ac7f9b14105e4dd4da0b4de94954dfcfb368449090d263ad533ff8513f272f58bc2cfe4,fd3873225f4dc4ffc97b8ce55f0fab1caf4adbf262ec5b7505a47c51a6de5f03,e0a4135c80db92ef0fd1b74a8e3d13d4daf70a8355fad9ffa00fec19ebdfef823aed3db8523056cbb4536410269aefce953df897093a18ae6034cf18adc61fb800,54b5f9535b505197ca05b21d2966b3f4b66ea6208c31e293a4d3b7507ec88e3d4bf0ffe8d32f1a484f85e20e000f05dc5f36b64183799a1a0ee0435c4c51e5ac01,90353bbe8a12bfd71e00bde3d96c8c0b29a3c4cfed991cbe373239c9f4e4dd6d5ae446a121c4a88fae6959eb8c56f005eaa1da2ae9eb536d4b719e464ce7c21700,67ea668fd42e1d6afa41378021a32fc435add8118daf8fe03de452c0da7cbea71ff210e656975e5657517ba900d1e2a0584eebea0e433a0d0be61551bc37f38f00,e0a374e7505be0a2f6352323c3bb6bed0be394b55d8f1df56f8dc107b735b27713958bb9a4dc40837bc7dcb95a7c55ff61eb4b4e4a5f4e89c369817be6dbc2c200 +f698573bddeab0c89107c60260337f6169ec938381363950a5fdd492eb55766b94bdfd599c78b1b686e1e99ceb601dfe8aac8d5fd7c8ed38651460e4cdd053a37b1f9e32488e544e456353e3c09c576d919894c1d0f92778bd27513314dc3e9dd077a8370eb99060cbefa1d7ccf00fdcafe0b2fe376cee3763873c3cb9f724770828b9c38bad30ea87b5f481db61af41d7ec1b527df5c357bd9b121af7e5a97138804cfb,3a032510d1f79322da45bea3c2f2e65cdfd61c94c5b275e164fb75c363c545ec,5bb3c34d8b9057c59a2f4c4f048cbd226b7a2bd823321de9e9d2e5cd6354137a628b75d53bd1d2bcb4ddb0722e2d04f59a3473cf647018fb59ce127be1c64e5d00,b9dc93b4c8339881d376c01489b0a4907a53bda69c7fd4cb4ac04828d908cd8c10934c487636d478ba69466444ec7e667cf3837ad53fa0c6e1b602e026a951d901,1fe27c58ad455b2d5fc6a9c790a9687d2aa1f65900abdc1afac257ce292ff6ac76de81e9d4e1488a6d0b38ffc1ab1c502a0d074101b26c74eac3a3167119a31701,cbecc1a2063343d0e1bc7ba937fd66e4bea2d79d8fe1013e1911c264234ca4013c9691da354a50a39e2123e7f52f1e3bc685a4718703a0f3942c83ad735e1d8701,269623df7ec7b4a77003f9da51f2accd9080a92532ea9c0ba4384c68e26c01417dda8fe4afe8681b4f052f2ffcc3190f2250f1291428d060b8787c2ae8db5cc201 +99595f9a14a053dd33aa450abf6fb8e0090c7d9e6fb3e3ea9609aaafc95c2f876da73da5d081f7aa5095dc3375e2065d472b54c58b5985b1e5e5c18f80b90c122f412462c5562b43e27cd232fcb793dde1f0e646085a509ccd59f23f2690f72bef42fd6d82b5589459007123dce8ee3fbcca0e9fbf626cd27f2a78b2c0b986966f2e2676b42d3320297a1aeac680524d89e6c451d736d1a370a72490a711ef26eb891cf7,ed145732485434809fce321985e7d5a8fd5fd92bca1cfcc5c656cef6b06d1911,af7fc0f87f2fb04dcc272a7aedfe47a36f497746992be2bc3070131ad63f977000109016a121ffaff16ab00b80194fa7585edb76cd0fbf8f3cfbcb4675e2f6b101,40b04d4618d4189d2a644b260586731f23e0bfa4ce7456e0b34febe6f860e1773173ae40fc46f5a5ffdeea8e35d66c3df8880c4c2da7c7676a29d24780f8150d00,d94017a127be57c9651173954fc60ad5922fc510cf1f7cf26701f812a149be630c8ee4ad4b2bf91b66420fa12896db1d5a46ce82fd50793a5ae7c011020f083a00,144f4729b7a79c5e32201b762fb337cd58c3c55e70845193acfd0ba76d74ce075093b9267452e4b1bcac2b30071346476843914ae8de6f0d09b6febe6e3b712200,760eedb63c810d57ec5048a8ccd1fa632b4cfaea916dcde0d0b3cd649d0d09fc316a7ea15f55e951e92c9a4ef90c29d8b69599f668d9c059d3d11602f3de8d8200 +0aa9b890f30f4ad2c5725d8b979ccd0b023024b2714e98ee175f7275855112ddf9c64b591ce698aa5fe2f15fe920e41d45a9c2437df9d2293a8da60ee840731bc74998dd2fe2ccc8c81e3e7e91c52eb8046bec053d2a0b134d91ddf124afe3fcc2e942d07b5be49f21de23e7e68c717343efb8fe4ac4a6e6445a279969f059c8f6c225482f0b1d3dee5471f3e6930c58ffb7a5b7c1a6492b43ed424654e06216eb3681ca,a045a4ca9ad7a0eea4f4626c1a00558e2182491b0c1b09651cf3be55cbf8121e,c58f2dac98efd25e5a332091a4496abc20cfba96045f1312c7e457c3be7f046329c36977db37fcd6ca8d07d2c5f70dae986a91177507f0646a7aecab6311abf700,a078244a7f5f14b8b4788bca985df69d147d4c426de091a2c9c84cd4ceb8fe7f6d0fa20614ea3afa63ec780d2c42892ca0cc3be3db29a93a677999e229bd7dea01,97f8cdff726c6cf129e2fe0996e64aa0ea9b1a84c7edb468ecd5d68e46e00b700428f59f66b5d200d6df90aa6692234b5e98b05c5b5e874d0f2e30e1dde32bd600,5018a978a980515be5c62691dc939e822280e94ffd8e40bc6c87c0ed51c7dc0053254d5a9d45431d5ec9beedf4f9b9073f26c404625dd9fbb4a8d83421ba521d00,994b35bf24c0870d22716d11e2dbf426e2a26734086adc67ac5e688e234ba1f025b5c1c4058065f5f56a75af32e3b13c270e58e90dddde94070f8262bd34cb1e01 +74e61ed3e626f33cd924a62d0692c802c98c8542ecf7f878bd44c18619dee2cf04ae38de3379c719b957abeb3f7cd0ca8f8a0a00bc6154a40badef0bd34f7c1ae6c61cb9081270604e8c020301d107573fa6cc35b57f7834098481bef23f374c70528ca4015fe40506b07e252e7376b1950d6a443c1dd2ea5aff3e910cd8f2d57be34c246d906f930cfaa535dacafa7f7ab4b57c3f6d4dadc7d40da74cedabd27ebdd5f0,04a6f010102a709844d77fc7570e4c5e995bb730d319f11c4539ae70fd2bf9ea,99ac79a528d87a5f2091f4820bef427d0702234db1565d1081b1d4c89e4b4ac1643e1f49d43fb4c8cea8fe1782130a72a23adea1e353a605b891b371ccec06f400,a054df1ffd1b4b18afaa59846ede9ca5a5db195e399964383286ca70a55c9ccc414283a4e32094ce2a5e11f0bbe6059754ac2e3ecdd4238f5aa8cb2dddb64da601,9fdfca742a710150e173ba298f2fbd8ebed485bed72dbd9c6c19e1c32859896558fd5a282d158e7d170246ba76829eef945791369d89a1169dd30317e02191c001,0db324dcaaddcc28a76f9126497fb31708edecd1ed5338899eba2ee5e2509bb41b3fef9d631e7d1807cc0e2db9e914c84be32a1e93d6fdebf44eaf1f94eeea6400,c06f2050a73286c8df645da5f2b68d75204e6d5fe10128c93488fa3d9ab74d0f55e61a886020fd56173f2a662da71cdae836bed7791857a99aaceeac8acdb6c501 +1f0d7b4d7a80d7bfcccbcdd60be3568fd89157024a02379ae3a2dfe635abc2013de15bb497433aad16e10b6bb387172b81c21f0294f5e50bef3b51485b5e4e1e3228502f39ad6a04f756f40cdf6dabe9731b460efedcfa49dbb20715659270b205ec1d561dbf32fbf81a534c0d98b381fcf798803af0647642469c88c3258f3938eefca0dcbf51dfde43da444de7aafc0648b0b7fa62bc4726791f8cdd2a1af0ebb1a746,dd0b191b97d677c4fc3012467b58948ba18e33d916c065aa27785ffe83217251,83780255624aeff04d12eb068364ff92933a81e495dd50e3d1562824d752fab56856a750991fd787a342917bf6db44542ab410c4e530b157ad96a8991ba5f5f800,09976cd3a88adde9914d19067173f6156f7459f327388d49e00267dff3e79aa6387a6e02a7939071c2fe77f74ae9d56805122f309b92e700129db7149b47853101,eb74d42629fe1fed14a3281df458636daeee76b5cb45d8f8adb286a72ad02edd0a79590b1e2f762f4ec094fbc8a90a8d18b675fc37cc4892d8bfc7197e17894200,f5a7163f83ba8278c531fc5229e15482a04f6009da82e6099a86d6c680e8e2c308b90b0ad937a7ced218c27d580c7f237b4af04c735984c10d2aca0743bb831600,2ddb77e98def4222f5820d8d9861a243fe560b28c68cf6ad4ea8617a6d45ff5b6c73a83c6ca59ca2d0978d8daad0ae20ee2c04d5c51e247c4c892cd7c649d51a00 +a5d903ed929d035e311e4619c4f0af5f500d3f8e071cc60d45a84d85cd0135a7164df01f4012db62957d92333c0cc40e686abcf611b9ca7d31a2d1956c0ad2b64f5cc89bc4dd81f05f81b273aa5c325a462cb4bc6f9395228f6f9cde790769e0cda1fb77b82d07ce4f39a445538f5895dbf7f5a40dfba7e549167f9f935a5ecc00783f00449d710c4e2fb58ea479c9934cc30dc830a1b2114654d0e567b98d66af2e5ba3,9a7c3d4a57d9b5fdd8bbe97629ee5384e216a4ed1a0e054ede7710a2e7036f40,b9909386a58587ba91e0e7f0a00d4d2c2016da7e5ee26b3a63549706507754e813464a1b6f89c8422536ab6127036873c3ad69abfdc214e6191a74d674b7b3fd00,c4ceb06c4fb78dae4e08b6e1526626b38e0881d7bd44d67576900a54718f540858662cb48cfa399ecfb86d0561b23d5a068acad6711b3d7c591a1c84a3c41d6900,074a8b177dc8062f6088baf9c66aa0d8bba4f73fd26a21483b68c9acddba6feb7361f766b7a8104a8a5e58bc461cb4dd83e3d2f30f98933e8d8fc87f4816730100,9c50004376b555952f78469adebdaf8f668ec3a87eab5c9f43cb86bda6e6926a5fc05db421f765eaeaf86ea9d75ecc8ea8df5b480e2b12a8b95433237a150e0c00,68dc99179ea3f306a236893561999bc412db168791bec19b3a2f6cbc63c2e83c24f941a2748d65d890ae784b1751d232dfb60445a32b347a38cce60ca6e306de00 +7af65400904e31ad8cd168f86b80bcb771757dad84991c77c154c2205c7272bf4bc2b29d79ff69e2d5d2c239831f4bd013d76feab6731b0f2a151c081dd08b783a218951cff83b74ece689215862003f41e12804c804702b1883f4458231cf0e922877c0a4c057c1d5d558c62c242915caa4031fc637b71e8434c5c478a607b7e233f9aee3c3b8685bd3eaf4b471544c58e78120249c904e1476489711562aeff327526e,e85525851a02d8aea370e09f135767e9abff61957ee6b6559908eecf0183f0c9,0c090658dd7ac64a158ee458c7aeccbe8fce6b5dc2f02ceb2d2a8d97190ed6a303c0ed6b56fe5687f4edde2043e562ab29a025d04be054662a7f9c7de1dd0b9300,d718afe510639b16e15b0e65d7ab631392de79811f94ab6b72670d7fe409b6fb658df35331d3806c45990dab3d9df5a0226742a4bdaa525e4e1e816755de3a1900,c3abc0f8b11d004f62ca509eb4329387cbb2f12bed18c9ab1a1a15f5f3fe34a30a7ea1a1b190443d02409f6d9647260fd3ccc0102f0cf9cc34e523dd97a139c600,ae1e405bf59df0ff5aaaa64e0bf85ba6a17ee104c5356a0a6ba6525f8165416a7e6758faed92ce6d20266aba75333b6d14005baf7ed96763037819e92718dc2600,9d495870a1d39448deb9ffb14e56f5920b86f25c699dad9290e6816e85871e8a37fb3143fe41c5e314574605037e718fa0a5063d9b7fdf480c4711d84b39cb6e01 +f4a8fb5941d5b8f98589dd4bd371f752e493f1075091f13af6acfdfc60ce3d44a32a72626a8ef867f98ad4f6d9d2bf53f5bd59c0f4d1706a537a5c20204994634c62f9b8f530c2e17fb0a13e0c0f55cdc8c6a9fe0519dc4021ad314096b1d084cab2b8e3ad68817cf04ed1110af13312930056ee10ef72eee73e3786b322b458aaf48514bbfc9a38ab250b889ffc5194160c653ae2679ec23ff0ad9050539a23a5507c90,bdaa4d25d84e88732cf57956fea7a54bf31c214654e64eb6f003c9a1bec79c2a,4654d3a74d96c6725550cb496089c0362f880063a45b8b2cce75f610f1df2a020223e5556ef086354cbe1978fd2104c85fa59c9b9c3c7cfa85a44aabb67b2afa01,9d08c602c16cbf409fd8b67227157531d6c36dbd35073ead67b33e8e1c1b74155fbf3fbf2112e51d085d8db95a7233f4deeda912d6a5b4a55211b462bbc8d05900,0aed3c62e14096e003bb61d6fb260de9606e14980aff5c305a25dc8536848a046bc2377fd27d20c03770d588019b1246fec6e839ed07f0c4238e2763c6f1f77d01,75839922d29955d23df7b8cff8b5060955cbad1deb0aa83b8d83b2f5bb0a07fa2510af7b27e8bb7575f9328db9e9df8e3df36da463f9a346a8426af516bfaa8f01,ecd996968c8f1126634f30fb9690bbec1d007e8a131b3dce6661c58f007ea083592482fbca6df9731836a26f0314a0fa36af559260b382caa6b88ddb0c671bf701 +7ad882107027aa378900ae38d90413c75dc9a29ab2fc95fcae2f0adeda4869b072c79dc39381de28b0bedd2dc968b460618240461e5875c14b13e9f7fda9ac13909310af236931cd347f0fd491b07d7d3867c47bbdf15efddf814de971e7d47113899f1fa9da9f3d3a8d9efb9f23c2f8a0021c908cb4972fd6933264daebcf0ed3f00df49fec4c196fa263636080533e70a6db62a3ad96b96beb519d678dc217345548e180,e4c7587478bb93b8aa299184eab7811dc1933b0848e2447e9707ab705d9e412a,a0d1f01d910c4e69ef5b59bb91a8b42474631b9b1ff5b6581d686e6ea5a99e564171c4b9ec8771b40e3d2b70d7753aa131c30d51a1e27df749832289a493987a00,af1037336fbfaf59d9faeaf86e9e56975dc5f9a9301eae9ec6c3b4f5a4f460d327ecb0e0a6dd8d5a35509f6c498a866d97ad72b1e9113f958be8c4a371f0c0a301,26b5bc9c407e31b25b4553684ce12747f75fcdd183681aaed18c8dfa838996e73c1da0cf657a0b6d08746a66a09ace89e2a6d7a93c5a17c4cfb2ff9f21a186f500,da1b890d73c97455cb31576f479f9c4f165f412bb6d192c520c452583d9220a55ef392b0f6c75cf7567a3dd429352835583035e61450a03f1de2eeb4aa2416c201,588cce96f1cf3542667d216dfa4a0af044dd36f82f84e2d4df2e8ee221607717100b4c6965b603d3cef019d3c93979e5b427735676b34ce80be8390a144390bc00 +18fdc533eb4306848c5929b652e2792ca7a0d7bb08cc72b6194a8052a4b606e551ec48d7553a9370cd46a8baed3ae10228e9afcf599012cdcfdf216024b63281242777267cb72db8e41ddd65ec4271e7ed1645c48e154883bad702f906654f097d763cbc95721212cb98f7f3f87b07f69734299fe5a4c4d71736d6dd634e8b67c21daa835c8ba03427d070fd3c5999f3245aad62a993e1b0fd095917516b8946c1da3ff4ef,f448521fd1d10a007509f2b3100f5e465e7a4537f1e7d1f1b1b4ccf93c12d90d,5edbbc71c2e90bb2cf4bf1d35809a4b5057227c74e143ac6112f8179149e24785a70287088172e5469ea2270741e72a458c5e5618892926889f9c79fc4a0039200,c2b933ffdc0466824405ea00f6d944bbdad4d209681ae9011c076e8e59898aa36ded3049a263d9dab3d29276dac1056d87c0582b3833c1b27fb8077277abe11601,4e7859d474b9634b34c21cc2ebbe45be7406c74f4ca884015fd3b57cb2928bdb0ec4d001158a9fa31957c014e688ff9e3e6112e3bd926361156171a28b98b48201,d63fd672131df7d406f4965906a140d26261fe29d2206c12eb98601f105628b2775f841913181cb8fff4d97e9c0bb655d989c5a51a08e35d21f44e0c13620f6e00,57af5ed4541c052313c08057a3e1d1354fc4d3852f4ddc7c053e08352b2f10b762efb54c15c2c299dc562304a1271ccf0509e034f5529f173c7b0a436cb8636f01 +443911b57f0b058c4318dd0ac090916502bf5c0d87d2834670154cc00a007befbc9347c14e4a6d36d93e67198e669788c3a5d29292cda23d816251eccf9b970cfd9893babb89c273f78b572724a3a482a2f50ad1c0397ddfb6ee0cee2f2cf7433b492f0553f678ac02164d121e5f5618b73f24c5e1ce276949ad00ce8fab72fec3cfc7cdae9af2972ead94055f100a947695b82039e6c28f80580263262c2a206972fff4a4,54ffbeddd475ae009671f214c7727d6949b7f57073806690dcfa244b82f579ab,b1e2c55291b2d9b95f769c402caf3f57664af0bf3ac4004ab8177f1693304d0636ce4b1d531342b684d070c057898724c5a29c46514555b3024c119af8e2381000,b81012133b51e927509f2e79a43e1488d487e86d84f60292979b4fa3e64cb9d662268150340bc1c099efdb1f6cc6945383a3ecec38d874490285a722e5e0800c00,97888cd6f0ea75e2e02fc0018e94a4e0162b2319f025ee171bc44e3998c4d0de59d87b671e42e853d4f41130ef25acd8b8d2a47022ca3e3b0cfd25f971d75cb400,0297c4c4f4b7082c090cef0e536551ec780fd1c6081fdd2c0dc8ec3d83efea267b3938ffb2439c48be9259af65782282500abc7f8da2b8a6a40a64f34017694900,df2a2baa08778a7857b8f7152acedeb78e808a5b1eda9af9f7a3ecdefa62f69a609aa134b2467c7b0027657b8f6d2f62162a210a85c663d55934c4cbf26624d801 +659ba8ead9a2ab5a2ad5557bb8239c3bb1dd08cb625d1b6cb810a0b824087c04db486e731485a7e209ee053c13083a8e90c38fd6107e6a0554f2de1926a4f10dec5550c869569d3b9cb4f5eb67b1777b519535c44a6a762bce376530751823b6b438eee5f72b22aca32271f9e8d4b82757b4ee993c41f85f223cee92203ab3adc14251fc1d8cc17518f74b18664d4b9fb79441eed2a545f5e8fdc8a5e1fa3bc31bed097201,847a25757d9952cdaac627b72ff083189adfbd23a84b16908f67b673368617b9,190e89905cc6a058f3810b91b54d8a821e6f682d0470b0309a84c1d89cbf840313f2ffcc1bd40cb82527c35c4e6a1a541b3a6f4a16bb73e438e41280c522816901,ef7ba01a0e731112b73e948d8dd705c12fef7ccac548974762c464ee85abdf3b30684f308b48145fb2901323bfbb872d1ade3d99fb53767bd37543af706a15a901,298d71c37bf329daf7245281d0feae53a3eb9a9eefca3b42f40b3135a1e49645650652d0c5e7bd463f8b22d1f0d0ba905605e049213c3d6cd452062e45c52da500,4f0b690f621545dcab3dcf7d5abbc5e42be38d3b4812ebd323df7deaddfdcbde6bf89f4e8db7aa86eea906508ef1d9c43765859b66b2c5cc55c5bb82681bf8d101,f8ddf38449fff5db6151a23915cf43eab548ab7758bab5b5183ab07cba1ceed2327bc7e8242d280444b5d74da56f6c3b9856400d5244170196349f2650f89e2700 +a0a79394a6783e8b02dc5de6542c3893a4861282d230c7b0cd3bc75b5e974bb00039e21dc9686e4e46b79714098e636dab705a4debbac8cb8e3567ad4d95bad1b2a3415704613669513022bc964cc7e6ec9c05b397ccd642f4fe2d134257304284e939a72515816e2914f0334e97cacaa3d6c4c3a6da1995da942db77ed3d7c19d3702c315581d3f8af2222bdb41f64c4807457c6a1f7006f9518eda4cf049eb32363548b6,4cb4d192dadf9af4b5b618c2972c2b9c33afc44f9a3d241e2f3481e30dd7ab90,575aafdee6ebcc94fdf366388cf1d1ef9a7eaeae4a9075a50683cad65a0ad30d085bcb157bf8838b26264d30a1cbb821c1cc70d265e32329951cf76ea7d7d05501,c3cf3f1bbcb284dde5f98164036261d1f8f1b0b7be4ee67a98b7411d10a97a0b191f39026f34b0a417921610f8e483d8a83397140259ad4f4f68dbdf12cc0ef501,1ca44e85ec42c9aeaa88115526d81cb0305cafe2892435196ff92d42addb3b5b22d0d13459ed36c1d109e1a1155b787f020cc3360b208db2e0a3491727d91fc601,642e884696ba186df9916f2df018e3160bebf09ce1f6a50471c52ffe68b37a9c262a471550011075b198249cb36aca3722229e3fa77b4e9ba046d8367db4bfba01,303529608fa7acb181ef90c8258369f70472eb892148351c5729e193105f789f2aff4e5d28aa34bef37c0c27057e2d69f88ec24f9930cec707860382f4f04ce001 +33842307fe2385182100428a1119fc628e9a3c72c7d974d6b0b0fc4aa67ef1a3611642654565c5b1632bcbf269dd4ac90ecb80ff5c0dc599bc7cbd2903497191cabc0ace42a928dadf85de62e65ff2351153b0540b223ed976785caf4e00288619510269e6784bd6d2d3e9a945b6679a79469536aaf5e599af43ca8604b9c2fc57c31d9f55a71d4108979d0391ece2f42eeae512d8f8490c171cd3a682d6f1b3b1eddeafd8,0ba56beb46e174b583f9e75e4f3cf760da493393216f341225a64b87991e6224,239a436b8747fd7b1778593f685c4246b669a1236abcfb5cc3b22e93db7c971063139e4b6f3f7021f1070cb0a5fad9f0c253a1d705aae0140d31e909910b556a01,49a96f5b6028171baa76056e4d090a8ab147a68b4268c717c771e18ceb37e5eb0f34db2f300b5dcdca2fb0ac5b1fbdcca48adbeb8970963b8cd0d6a81310fefd00,253c808c712fc5a1628008082f1984ddf9712f60b53c53f7d6ca7773117a675a78e8974327b66a94dc960051da89252c1c63052e87628e0a747f085d5091abf101,5bca273e1831c7e61edf52805bd39e6be932bdcf17747ad15d32058f9c08c08c306356b778ce9c87ddc4adea4f30c024e5dfd52e0c4eb2e1643a61bb49761c1f00,c51713f44b4c52b49cf0d659aa643ef54230178abc15cf7eab6d7aeef97e725e15c490e35e6c09081cb53eb8c3077df5882fb5a13caee22d2bee19a483b5f3b001 +093a3a74825720d4fd85a212a75fac0bc9b56f19d3611de0ffad36e90995da497af95e97a89816a95209c0b46420a060e762e4d9a96f8f2078a5245c3ec87c8581ac594dcf58909479c2d92b37849655c73ae2a231472af3fdb4d3c0066a5d5ba04ad926a0affed10a585a11deb9c3f94ccf1d5a0d55856954da703eae597cead31796c7b8c7fc5c622b5410611907e6e5f1121c88c787b824c9cb4cfacd4a6c10f7966676,3bbff221ac9db8f5ab9d3abc185593861b45632e760d8602017398c49aedbbf1,1e1de20259245e6d41d29818fd5853ef30a2d8236cfad8a11834e2b69c08e255431bea97bf9b248d34fb3b4a7389381ebfd198e6f758e3b0e7805c22357bd9a000,8b924b3edf1c3b1da9196e55c548c9c5c05597bbf31517e211d41b7cb8d2438a7d3e226c18a260d1ec19ac38abdd5a0277b22980254eb7cc85b4ff91fd3e16e200,91bf2bf0b604e131855cbeb86d12aa4e92c13979fa126ea16ad9207f8e6720923ac660c1f7843bcbd06a60a396a7534a6eb8add972b3d10133917cd29eee049900,cb2ddf24c5c28cadf59a612d83b35e92b3b110304f0a83de746d6b22e2dfed48305cf234770e7aa265e5511bb0d82734dad2824615476aebe02efac8edd7f46500,9c4b3cf56a6c0b3c11788b8ca871702559fce47fdde5476a937986b01d8d670451c6fb8b12f6a49d5c568ba41aab684d3cc24fba84872ff4adde59b5b5b4824b01 +1bb9b2fac44133144dc676cd3aa4adbdcee200878af7596eeb2444c515667497cc5841ccf2941c14b2c087d0934a92927f592795f1d708b83d9c607f959b2a6d076cbf6d13231dc8b71fc71a2cf61169e6d34d62a2d91f4d731514c2c641d138b3a6057fc8bb82734f6a58986a393d1ca8ce27f83f3914967ee17c1dc7d07e97f69600fb115e3d9b266004a4e3da08395270b9145d7ef255c28b4e1960616f4cb224d12c6a,50d6d130f477e939e9c4ee387c145be55b2d9bb7e2958610848b9d7339998992,6a33c6593b0974f11ea1db7034d7b973f432d63c960956937f9c61641ec3b09528b1871f49db507b498a1e57ae4983d360920f03a3926d63e66ad664312ad15600,209940a62a79c3838edc4c1e98dca8f2e0d7a54a4f0002d89693ae317151b20c42531474878e00c3502f59471be507c3fb6264a6fbba6f71309a999cca7ab77e01,ef2f0272f8742312e770cf4c177aa2419bb52a3def4c860b1fc38bfa49071a19305598cc5a45a6375fb4971c6d93a41165c41951a6a4aecb76760b1d8eb9d92801,f7eb78629b86b4eec4010d99ede0c8a36a99e6fc115dcc33fab8cbedaeae06461461ed78376bcf18db4e626819f5e0448874de862144950e940d6cfa5924bdd401,3f7b82b238cd174dffd694cdd10af63204170fa47666c0b96cedb82d7affe15b7c0fc4df53454038e217a35efb08cd0a8f4cc1d5da53a9e214f72cfe3d66209c01 +5ec35aac7ee00e9aceb474e46d5d7dd663cfcd4930cc7d8a426e81b70152c91145f0c42f91ae9abc5be55810eeed74ccc9dea6fc13fa6a191c4f3284ced348d1265940c30759b8ce63d22d944a2f5b1357909d3555304acc263e9ca9e84f0661b4a46527ca03e1b582901bccb84caa9474c8fd2623c0b13e98c56ae2c3e7c9c58d2c567ff2bda2089e562a4f646fba14a34c9c4002634255ae50eb2fbd523d781cf0a98e86,902599f9cadb3ad6c540207fe16e7d9c4c2eb89366c920a22b5baa651660aebd,f61c3e28ee7425aa398c8668c5cc4566568d2657b4575df693e5adcd392cede87745f695bdaf8e965bdff5dbafaf679dff1ef328a80e47ad1d1e4bb72605f97101,b0eee3403bbea3bb65f09381885be04d0dbd14a8ea3d21e2f86135df149a279c6ac4438c1e6df9a1f1bf0a93cc6ef20b201493df5cbf97af11cc48789f2c042100,1160ff875fabd9b2c0861e4f57a8c3ede6a114068dd6cdf27b6dd10b6f27661739933a1cc8ad7e1d6c642e051627e49da4716cd9cc625884f698295e3b8d4cd601,9f770592eba7ef1e93fed271d2592cce702a76fc5085dc313d7b2a8e34658be52c417f632fc8193b4e8182e296d553a5d668d45e58535f1451bda7c126ed919b00,f5840f22363371a06fd3614c3b1d8d42de9d376ca3993263b2462ef206b770bb7540cd0a04588b2fd561ff0a7ed4bb34ea642b0fbc8c3573e1d5bc44919b336001 +f649ccc581f4538225fd8ddc55523064bb3c3accebd53dba78b59cb7cb54cec00e867dd7ae2eedc16910e2ed85dc32cd45ecc0d0af3df40c7a70daa7215e61f16f4ba72200d68ce88d5c6c8ab8abb725b2d4fea5cc28078d1fac8afe5ed768dc1a78f5558b4ddd6d0f6c0d4c51b85dc64afbc16672d56304b462debf11740926bcc7d42aedd0205e71b409b7097d491685d93f1bb5537fa0edff234de3d1c5816457750a6d,2dcb054b18b1bb4710745524c9d572d1c10c251c89498480fbc9df934f22ca43,f02bf957d44f3721c7e7e0fc84d081b551692a8b62534305bc0d3860ecbc49c379371023780ba370b5693acda83ac0a4f32669280158ad66c814a07a5aef645701,ef7ed5788984c546a99b223847d9828e789c952d692695aed7e40d57cfcd81450d2a4ed4594ea64db8c5a6efdc9da3477469b05f9d0b31502f4986b36afdcd8201,09b9939e4e9370e52b735239f432fe5820ffe66aed16d622cdeb1c2f45e750de5cdb30f9ef6a2094de780f256a4cb158e8a965bdd3f417e13eb6bdf1e1cd939501,8a963641590675ba6ae820e674d53947815279a3326fe4aff92db986ec5244126046ab5d5c8e8e87f8ca14e1da1cf866a0b4c92b8246c6978ebebfce7535f23f01,5eb7b767dcae0b5ad60d0c1f5996cdd691552458fd4f6f22815044d6941df8da1ee587a5d5b39b6adf4299a5c361a088d11e406fccddfcd4b31a994477f1a0da00 +66d63dd6c4c381d4335dc1caf4c20434254c7169770c9ed89e2978b13eb5b92538643a8d23f36b2c93a4fda4aaa8ec19cb0f1b746c100dcca64fc6fd14fe57271603849a25f19a0df6def47475a124e1c8d20935d2ff1e19db08d72c0979ad6cb4a5dd7d27f03d6973b05feb2e23ce5a5fdf78b86a9d85fea4a1055b6fb22327e1ec8ac75b19d5000ba42338558cd8d14b930e50d4ac1e51fa88b2fdf69c0449aece71dec835,08ce66e34fba135cb6562730e117efcc794411b9dbb708a10250bec2921b4cce,0019eaba07122cb5c7ff9a600482f4d6c684164a1d6a0efa165b29c8163611251bf5270a7ae2ef85b97d2a604b68006babeb172f125eef01d5f017769307b7ac01,15f05b75cf3c0e2b6ae494cf413c5e488e9d9e5ccaacf96967a0ad5c38eae72145467669d01e8dc488efa7e6f7038b80e075e7afc7f87363c671028066840a3700,1673bf333b2623aaf416a1d77946bb1ea12ae14c71ed8007fe24bc83460857996330fe3c93bae5d48f355b5baf30f798bf5ea38ac229e8038388ccd94a00c87f00,d8c034746bf87f2bab1fa97eba1368fbb2b8dab7d2deb53fce54be22a902e70a6865ced3781b79d74e7572535da8c4cf4ede0c4e1523e1d9d56240fbc3b5424200,e12bdca18e65bd2266f0c10eedbadc67058a568dfb5124744d2582a41c4694c14840b5c23486865d9e0b8bf6d38ae8e1e599ddd92ca8cee66b759e39e21c42b001 +5f45985246ec75be8ca198d06aa969643cdb0bc5a3483f58ef54de4f787a94b4d27c34722132c1d44732705c53ce577017b15a797e4382642a471720bbd28b53233fcb98f530eac98d0546281ce2a145978386a8378475f22cd52bee30f4103bb38f57ba1072ab53e0af9f6f0f5c53a4f0ae385523d20f315543c086020d1ce02aa3112e8d12ff78635c9e34b8f832dd04c85c91f4fae25d503a25304801a4e4cbef82469d08,d5025d22d55be4fc54401273c7b774797013879b9ada6bedcc5d53e52b0af974,172b56865ff935299f7bd65540b0a8d35c1f07d56df0513353ba49c045b729e16c512caa6a732c63fb52eba76d34fef95ef0f71a4eaa6c6f50d43215195102a401,24952f1d9c69ab199bf33f18b1bd48ca064613cca110d218230fa497e856ce5e236794fa8179c040b3ae7ff4dada80bf498feeef525bc56d0f68a6a75c575ddf00,56f71155eab2c48855c896f55fadaf6b97e18a75010d67dfea5cdff1ea2af5c20ec838cf0b6aed93eb4f856aebfec020ff7b4744e12b318a35d12cef4d055ee800,b5501a78469fed04d7f6eb2c50920ef7fdc3513ccab24703003ba01a66f9f62652071a4564e7a8287f2dfa152ed453a1e52b762007a2ec27fdd9b722e121d91700,62ff957b95d6f20ae2092cd94f04a716c954a8286338ae542d164e31304867b772b00694ebfbc16ea6bb9c598bbdcc63bf631c0ef20c320070c06e409f79ad9901 +273335e5319777da7308b15a2035629d77274961110b098736798d795077028b0305fcef8c6e8e324a0923fb78083a2a3e70753a2e1bb209c740f118f82377a73bcd5dece6faf47450ef64cfc257a0837be1c846b071b14b6f45d253d63e9639d900f5810f9aa36317c520bcb9e319bc8649076f8dca801966f575915a3b59546204de216596d2c36bdfefb3da5c902499a69c5f4223a7591ac1523e863180ddb10c58159fc8,5f999b3679ee28c8ecd22a692b9a2861cf0f91f1040886fdf315aa641cf9be29,56d5aa1032df1c0f6e9a3d784f2174d00890682811f81c162ee82fe5897d95932e455256e7db9a6c0f17e35760edb6f9463b7cd02335d09e30500b972499525600,eb7be1e677f4ef84bda1cf7d1b0962f16a98522b6a407ce79e6ba86597407599135b1070e4aae7e33f464e162750ed4a7a1db63d7ff4caad6ddb8c935b8d1a8d00,7a781d6da8487147de96634e61452d6f5cc232ff2144a468c89a7614fffbbb317391d133e13713232b23e90a2852297f39afb452284f670052c6d7b9ae16dd7600,55192916073ca313ab97b6d42420c27108eece0038eb5c19f1ac4b8f76388c7630c917ae80fa0327f064843eaccfbe6356daeaff769d86f4643767904b4a424000,7eefa3d4fafc89b95f4a5a0347309c44993eb70ff318e9b25c8552c607c2faa7239b6f44dc166bc8220d749db948c8f3f51ddcf742e738c91b3f77f3e80be75801 +c99e407a74eb4ea1fa9f67565269004d7933970076bdab4fdb18b27434274ce41456cbdca0cc0d04631399bd9edb501b3560a4b821f3ae2fab2442af58677425482520d0b0dff095f95a2649ed35614b00dbe0d061e7ffb98232c9fda36aadfa49161857f3b1c6a99443cfc304376a669ad8d02cd02e3c9d82f132a8a9d1ec5f8d553437ba24cbef10a78e2a51a4b20c09d41210e44c5327724f2d28b111c75a196f006dbace,ba099d4b67bd30f4ef2d4ead94125d512399bdce6f296aededf9fc1b172a13e0,11e845fcb2505983b20e687bee2386553e4cabc26f744c40514d02392db91077618dd0e0252f871e7fbc35e501d994d52dee9b8981a67614e5fe875e04fa0b2001,0ddfd16b4cd481175738d49b00944ee8751b659951dd6f5dc00d381bdbea774510ff42983d6359552aac291d16c49d1c09efcd9fceba45d86f3ebe941464f9cb01,f6f3daa1de107a93a11ef63db07a3efa9a74f1ec8040dae54b1b799693ca65bc6a6deaf5933f8bf473aa45e1401511b33d137e38887de2ea0532d2daf40c048f01,a68733fedbef23dda2837065b1a5dc963927e69c821e1702546fac92b9944e8541d35cc8b7a098b5cbc3470e77b5d87fc8ffd5c9d394f2096cc7894ade25be9a00,8775af8948413b38220acab8f4f10c584f791c69f6831db2af67681d0c38ac48565981afb891c76990ff929eb2ecc7e317294992c2f34c963bb5db611fbb6e2f01 +aa090a41ac10a63a7a710351b71465c301f70f3ff120e19c3afb7fabe6ae391b4216ddde9b3692bcd133417543080f95ffcd9d9439f1f1ce91b13ce57e6e343de2b291424a2ba213f3ac1b0cb10b5649d16a456b2ba2e1751d3560580e0a2e014bce979951b1119598630b40134124fac5397db1e6792a5ec433baaee005e0feb3fec54ea582d7a2a52f041dd2b9579c79b2b8b506fa1a8744ee2c01202da58a1bc3dc3a44c8,39813a1c9aa0e886255a0465fd5dae0dab0baab749faf095d0c9a3ca69f027a1,5a964230f400aa09f71ddd117a7971fd9f075a871b56f19a5bf3063037dcc44c0645fc680f5fa7bcc58238d3f108a399edd35ca56e3a4304ea1ac041063c4f8600,7795854da9af879e77d0c2ce2bb28f602497d5098982f647465311ceab9ab9836559a51ee81afb730b362d1d7c3b4ac926c79b43717fbadbf137efb04645d79201,05fae8c1d5b5c802bbc9afd432ece97c09d31c68c5184e4b0714d8af8203061d66d6190dd1b144dde0d887022841e3ae3931d0574a4bc47e614a1a211f4b32a500,6c8df1d87acf615378043318f551d2442a8b31ff5b815ba8b8ce13d08485085c21d51d3031aea583653135f2cbd9b34e54e31b166c164fa6fbd2a48605d6cbf701,79753253ea8337f11b9d7a46d88cb388fe1296f2eecf327f66c2d5bd1403f7b2442af32c67fd3802ca4d4023d65d2cdc2d8f188bfb960ac600a34bd1b8df936801 +4927a6b4cf3db3da95d834945a92461265ae6461926e274ea8b9bdc9eed3997f8cd69c1cde17e30f14ac14ee39d560323541587d68a5038830d097f89392d917e2d8fa8f08659f3016cb4cdd10f5227a4098106ac18a6a6cdfed054e4bfe578e4d3da8ec74a56b213ab2543c838406f506e3bf77779278db606d8ce543c30924006e0a27bb3e482e1eadb4ba1423bc52a533bc582f7e83effc89cde42dd1327862c14b0c37b5,c6c18bbb4b43a12f0fe764bae6ad69f4f30f5a57d80ef4094b266525a7463727,4cc9579477545d0734565f80e9874f164b7df235ffbc03098c5a42648c9b05c9588d7826340e29c6d602a3d2501bb95ec0cea37f2cdd06bfe7473eea592ac20c01,ec91789bf6ffc86d0a1e34f6dd8bcaad61987c803709c1b19004f794010213961af627f04f6b716c38ad9b1562896203811db43b44878347a70441afb5175fb600,a26961b01ab09f77a91e70e3df05fac3afc6130ee38334d5a4509a48a0628b0f3045cbb05ab56e40424aa3f5e38fddadd926403d81e13498f3837bc48e590e0800,071706353bf576cbd9bb112884da3df740700c08d8d4120233ecad3ba46a8058139f9ca3b9151dc1e00e517b8ac1c8545ba8e605e59189c4095dcac85aec32f101,843617488a0b1b7bc320ad791af6535a08851bacf4fe9402375cbc81084a3a4127ffdbdaebc0427f77d4feb941991fac935b9df4da99c4348c4996a2f27433b600 +4230ab7808f387a7e18c56b824c138e3a7fbe1a92792e4852543f8977a28ae82c7dd5839bf00fbe1a8f6468acfe521f6234a760e75cb6c0498a259e0ddd9873772d737bcee8daf9815dfcac1d692648fdbf568b5dcf1fd483dc24b0bb2ff1b3e402409bd4176c0a15ed05ee99656c38a8cc7f585c1b50edd4f25ff8e3a3394ea1f8f9b89952f2866c4d0861b5abb2b1a7458fb8fda04f7634aaecc6d8cb6cbbc463c86f6072e,eca17ea6de8ef6c281b0fecdd110e9062b67a4bc579edbace4312181131dc425,22a100d51ad0a47505fde9b9afa580710370b1609a3f0131325d49daf37f15df262c6e9eace4474fff8a1cf9adc2a1eb034eab4acaa564d0caebf10410c1ab6100,5fe1765faf47876af7c74cbe78af8534ed8b67fb93c6ea6a3e529a0c582068b4505bd738e6874e716138017a29737d0367b4eaaf268d10f8b4be49c5612bc80001,ae4f50821c40e6f7f04648a78e695e1c941c857f68b5cd6240cc08edeeb1aafa1e31979980e0e679ec5d236217cc91cd9922e499cdad274d384454b95e61f2d601,bc9de3efa024b280a30116dcb761eae2aa02875a397b2e9d0758ac02b2d06e5d279ba11d0b95f95ae079c71c4d5e2dfc74662ed9bb1db8b15160e79d7b7bcf3500,4befd828290090209d63b100de718cd67f38ed4d2d9c21dd5bbe5d0d554316b72384051acfa79b5c71e3d4eac5591176864bd248989215982880885f279ef93601 +02d0a0ceabd7b469768734f9d6929f1182e96dc21cd3cfd76f8c18314ea5e920b8a0a2e38db05f3f2319465475e5422e1cfd7b0367ee86a025db4fa4ce5e13a72e9b0d023e6f874a04b55ad3e9548d9cd06ced2c263718f5cfc0de83874b172c532988884d687eae51072f16f2354e9786b971fc3a201675c1666120b174890c9e85a1d3c85817dff7a5398e35f5c9825f13cf765d5acf2133f5e3971ba0208817549220bf68,8d9c126b4f49a1c264cae85f5357eaabacd9143d11ca7124c1020ed574335f3a,35ad4133c0c9290157329252a591b11689269739fee86046c2395f09aed71db77192c6f7e284df5f3407dacde817f248378832804afb4fed6a64e64f0b20cc9801,194751ef454b4a1bafbc66e8bae1f8b463e1cb4fdbefcf8ce79d619b87d4bbfc6fcbac72a73a9178ec021be0fcdb64ce4d8d243d85bfa2ace479d65d71e34d6800,77d8a70d7f9f745b44efa9a5282b66d94ccd9a7125821f53d1bd25bcc60859693f8b50d2c87e13160566a77eaefea475a03c05265d0599e52f3cff4a1448a4e401,147d0a1b2e9d986adfc34d0ebe34886f8c3cf0c2a50d3db01df6341055f26cc17cda019786b26cd63d773c126e4b3b306ff02f798a1b9cead30c5645f4de6faa00,32906ae8d2901446ac7b4cad357798ae165d592faf7fa5e3af5807d4e785fc0a48b6605b3ae2db57eac23585cf2404ce0e82cad11dbd50a02c1c3388c66a2f8300 +b4b91076ef22a5be725435070c6a6d3bb869686f9fac240ed8b66147268e57b0e9568a5b88823d7ea69500231a19b7a9d93d658fe222ae070757a11cd4ef192329eaccd2d68ceeae90c8d51567fd34b8cac5183c62c5c375f0f51609e89431295c8bec9fc631445f76e55ec3315ce7dcd195a007cf8ea4a28ad043620594f5bce616355c1a075afba4b151c18099188c23fae38595ee5d48186fa8b83f997c263b0d0a619816,f94d218571ea36d5eb7459962eb8c67660658750bbdcf07abf6e5269772bf613,78b9722fb534cd295c4863013497e1e70c73125dc009ef786c4da6c3f16c1dcc74217d81bd8aa810849c2ce98b59c4bb97ec1b0bd00974cc72be226463703ad900,e87d00fbf6dd5351e8576edf00495a89e9d8c934c6f5db85dce06a41fca2a770341e94dd20111df93c725fb9b0487b3502de021d5046fd17ff5ef798c4ef050301,b2b70ec31e6e8f1acee1a384d595bd8b4c13bb29d7870754b55365bbe2da4a6535c98ba84571d1bf73ed1442c1644f73f3ed2b42fdf3625487ad5c16073fb84d01,6b0129260edc2786ee2b059f4eec78551b1a6db2e2578465390548e3a292f17f3fc540b16af82f5c0e86572f1dc3d9e9e0134f27b603c8589381ba2d412d015d00,c739c7c57cd362cac0b3ccc74184e89791794efe5f504d4484ff32520bf49b7b1ce941b17824f6d0571e4a5a5c48be8d252bbbc8647dc4caa2bd57929283613001 +687f5d8144f12dfce5ceeaa709b9dab7f8d98d1fd8e07e6e7a34216e39c56d0b391e4cb0f5c02d6770ba67f6220f2ebdcf12e5841681f3a95799d662c69d0c2567b24b8c875d161efa79ef3dbfd790679921ff4dd231a5dabeab088b390672a87a39259c5e1563bcd1b6f6b53210c2e931ae4d9ce17836d4c9bb268471f154197e63c5afa6cd5cfb1bb7a854d02b4914b6bb53a7658000cbb7561ff2abb53ff75cfcdb019cd2,594bfd71a8cab65cded8b7ba97010a5bbfde4e59bb03ed73aeb233f2df3c2933,f31e958130864383fec5f865ce39e91f794022c9e624a591fe1d212527205f115ad510322590feaa8edfa51236dcf78d48b9c379ab227904bf309a2472d44e5c01,c3e233ec8e594f91165320926ef996378a07c094709959f62c10e2d07ce5547b5bb4813bad3c1eef4ceb5dd153fa8ac2d4a348df5455e793e6f2a7d3c689d87b01,e34f19051aace9ce95210fde5becee68364b3e1b72e423517cfc10d46321cedc6baff4dc20d525eb4fb4937f42e3e041325374122b53fd283fb15e70302270a001,1eb478dad057d2405717709d8d7284b25fa563065320a25084bbbb17de42c8a6700ccd78fb944fe636cbc5fb25ab8351eb674160a4ec9744d5d0c4f9925a188201,dd8c16d4c5621341693114fb3f22409f1df2b9fc2acd340dc856612797cde95d11ac322fb98bf537f9c8194936329f9f959df3ab1aa8ab521227bad0a2de9b8500 +d8735d54f01ba754ba0f659f96b20063561e20635ca7aa243e5b4cea652161c4a8a86c7cccbf81e6573245d753802ab8811194646ba11ebd12061d17ee9cf0631e99033486a48ebf725857a963a26a4bc42471b0464c9ee84bc93ec8cf71075b35ba65726992edc4519cdd7eae6767ded2faf5dd91ce249ae63d48310f3af26ca35d4333cd8402a37902ba516df550d8968651a391e5fcee707813c333c4fdff47078c5427dd9a,100bcf805d631ec2adc77c5bce5b60a6a636ae317c389d85cf6d2bd571c7a8c2,08c54608749e86f63ed108f719750dc89ea6a6c17bdfd638548dd3e1fac4a4d34aaf0fab1525eeecf6bb60bb0da26ce593b69132c66ce34ec82f2b9fe3a6198201,71aef06e9840c6d03ae968234f8d23a50be17b78d5701a73a128cc2272adbc961360647a073abedadbaaeb06d99a38445ada0177b9724a1af011c75f716d850600,0ab7c3e3377f37ebb3a5d364ae5142ec1c0024eb54a8279105394222016c65f13f31b52ef93d0e26a899a13a7a79bdc8b9efcf15ae0b1e422bd6828404b5151c01,694799a42173f5583c03db764c7d854c3efd5a4c2ea2293697748e15a67e40356e11281ecec2009761aa2d6f697926166bb2e3145a792f42b4a80d5c3dbb5dbd01,51981eb3ec9dd7f699e1187db29863520e24c4f00dbf633d0f82d1476a7727c645fdeccc752035b38aca838314638e14d71eaf5742afc949e7b2097baaed869d00 +75888cf6aa1b5e641733d7598b6698453cf0fef5a13d56955055ec2f1896598d9b82e419135d1fdeee3ff747bf9d1555a087f333be3b5b247cb7a4cafa62bbcab57d854c26961a1f2c50b92601ac6848d21c93ca63b5a705b2156307e033443d88e50c39ec9d07a3103098bf58a9df7b21cdebe98c0683580fae4261ddc65ebdd3ed4c86a4dd9a3ff3cf4da8869874bb3cc1b241b67ddd0f4be38854b4cd3650473399357dcb6e,535d75c312255684d5de3e63d86e1f69baa5dd5d7ab50653c0832334c9bd89c0,1c1e8d06e838bf05882e5cd519c7386bdca391f2f70b14b017c8b90083985ce46dd33c7bbc92cf5c09a6bb83615e85e3d7f8b173eda2a33c2bcf38a2043a9b9900,fa4e6cf5b52be368075bd1b3edbc066ff91df5d888780a8a1de97d8f31aa8c4778384e9204f3371c06f4f098ae089dbb871e441a7d891e514cb3bf94f9208b6700,18fd161d1663027d77cb53e912703cc66ffbd67482b4d32e3639a53acc45f7e052cd2024e28b24cd677604b05798982e12d54dc1ebf1b1fca0b549044f35ae8400,401efdda70a3b375e5be8505ee266a554ab80da8124d4bc693b2462d2bf2ee563d45570d3a563b0e120c843f8cef0bdc7d87f4e97354103187fc7fdb01e46d9c00,92b50b7e159be34980b4e0e972d1b9c70e6308746886c49dfe42bb19fa18856e3a498449d2a763fc2f3628a037fa491fb181bbbffce62d861cf068474cf94b0601 +a39e75a82b0cb449a8afea461c41ad746b3ddb9ccd91b222cea503f63dfa5497a8c935e7e2965bb207d5ab96e10478fa72a82fd58b6b2e9ed00af846f74e846de06a2fbf5d78d18d04dbf520f4db1c29d1b032131395600b62fd32653419d3049523dc56054068a8b78cca17fa234f1529006db557628d77cf5522d4bd6c5d6f50efed13d23dc825be218a3037490846fb6f548bce59a3f744b84cf7fbffcf37697929b0fcadfc,ee486aaa296863eb60d4d455ed8411d67fd0a90d8fe729d38e8460f2401e5351,af94412fa1ade5803a09c72ba354304862146ef4ae14afc9b204092b09d3b1ae482ce243875bff148ad1a7abae8c841acf919e50002ff2dc0a21fb47b9c1550401,46068a1787bac74505e1fec2a5d4b79002c9509c60f21783ab95eeefa3a8cb490c314082e62b2b0c6893eae1929e0181ba5eb2d35cc80d483e30883a37ffddf000,7db5e245878c254752e2b02b4c2d641d9b93453641ef79ab34c89e0c988cffc831c6a0709ed2391e7f84f8b65ad5f1c5606e37af4b452eed6e0c7b6afc792a5a01,47a87c7df0cc31d07bd9202a2252af91e84fa41ebcf74f7586eafe1f3d67664722811fa541dbcaca11756cf05209b2f2051f3751175a689e946bfa813d23397d00,57e9617dfa9413f42ca69e9cdd123323ec34d2334327f19884484dcbe46308963635996111724585491b14c69082d0e46aa8ed057e52ac3adffba5669cc98af600 +ae3901cbc2b4faf5140dd84f1bb362785aaefa373015a4d908ec8f9b138a7765ab1529a456c65eff23957f2eb438a5028275b4c8f2a244c0a8f85ac185d21e51da369a8b3f6b4b34bd2748e08f225f0ac15a99d6f524f8c01cbaed0fe0a209203d2e360be1b6057fb5706d6f2a4abef2f517d032d00458af516cbf5202e85318d42e2e30acaa415e056db7fcad826704c9e506ae97c0e39b79b003db14210d8c98ee17c96d0f97,6531b1017fd04c115559db8400b7699c84c1167cb2bb0bb863c3bb1edf475578,348c263137b6b310788a590b917fb68f96f0a33f4c08c1b81893e21b3cd0ecd71d61813eeffb36f1a03f9b41eb0069b240a0ee13443cea91afb4d9dc95dc0f3f00,7144591ed638267b1e4f0a8d892de27b718498badef7154fe64b58db6843449e4ab1f2cd92ebbe0f169be4fed9a7055fa873cb0793e59a24dd9fe814bd538dd201,6b4b8a76b278093fe75ebf05956bf87ff7e7284dd5324c3552d156316f55c7dc286506ac53308288bc97b3d49a2256cc38afbc249db0e5e187c1c1b107b28ca001,8464697230258d9194c8cf900e3103fd0e69d4db8cb54c756d14c199f3dd763d17890b647013394523506e8f2565e3e6d01a0d98d7e1a708d56e8a246b083bd101,c3ebf1f6557781d30089053d462026e5ede8102a8eac3ff218e783cfaab2c18d05dee5d6cef9155b0283b0032f7d568118ff86b0cf424963599461d438ed521200 +fdb5e4f8d8abd169d3075a7317830cb9cb7288289f4f8687e34e0cf7367c5ff6e2e6b599cd74394f355c875b2248764fb9cf1ac8fbb3a7dbde2343ed7b0d362991a9b258122e94e3839717424bb7e01539583e3f8afacc35da08b3ad9cbbb0d4ebc0878aa1826be0b938a8f790aef431df5e1282fee9ac5827cad685677465f70351e83ae56c6d5cba5875e3e4f0491c7bc6ac577d7be22e6cc39ac2e5ef4e831eba7a31081f7c,12627ac51e878b3186e62889762fd7f717c7b17c9b2aa6fb06c78bbae34d067b,0a9acde7c39a0d14f6861be4a263bf3fa25385f81d83d1c11aeafe1c5b2cac66345955d3dbb83ed448de036dbef1daef0d794065c5dccd83e62b837c87b8d30f00,2e4f7a37d834519244c41be1f08d2f947a0a4678c1a790a2e641270b0d5525492d51419f3e27882e4599ed8f0cd7f75ffb6a470d9ba647a998182e0e25ea00ee01,816a499988e92e2f6c7c04f2452c7d654b3898a5804fd31d4e99742f97b982a717a330ef71303a19f88b43614c91ca79c5565d9485921060cec0d8cfcb9c797301,8b45f95ac2bba716cececaced317a1b797da88566263231706257dc12dd0d7006e7443697ca574ad720a38c338b4bbeda7e21cf4a75e263c72cf73826371596e01,7567cd045af9087c341c573e9ab2659c5abe09346b148d8abe8619e8bd855a212b15fdcd744188830bb484d803de8b21b53b14740dcc5cc5bb05de4caf749a8600 +83847f9b98d25f68adc419d968b40ce19fe9f2d4584a5632d4fbe528b0cf7477c71b5a5ea303e473d1b55ecac1c36e536803735aa5c3fa1839a55ccabdf01d3624b4f96443499b865e1b3597256433dde798ec419164daa247f1e5c98fb54edc8c273806069dbeedfe60d3b390e12919381e1c2d2656cef4f8453dd0efb51672a1dc923f168b521176d6b0ba8bbf77c70a6cd50c7835aeb6a87387767f966ef65a7f69556127df,3ed77835e3671f7a0838386a895f7d208608a7f6ec311a1e18f2f004ca2c6760,4de359d945f148f366c8283926dd1040b841499afcd789455ebb5c592b7e02ac258b3ea75369945204c7758448bf4e9b60a7790b72392b0f3f4b2570d8e9c69901,607bcb83e5101c433f65ccd48d268c6bfdfd85b97c021473db7ab073d482dc730c6ce11f3394245dff7d479f96ea08ca171ed340d1e57cb944a028cac8fe8e1f00,52186235ee786e20a8dd687396450223b0b6cfd5b44892d8ef28deedfb4c353418c9d8bf4a43b63efd1c25afecb838963b1545e6b98762414e2eddb878d0bd3c01,b6fdd02fbb299c40ce2da48c17b576885df1155ba1a6ea241a233e840785c8ab37d865b3210e98cd77b6d3441d218aae3d9d68418b55ac5b7f7f29ac0c43653501,7babe5dd6b9a0cec546a0f9984559e079e812d8edd569a8910334eaf90eae0c17ef461d8fdb95a5e15f14dad51b2304480c47e3d5e9e9cc48e667532b6dc6beb01 +804f626032efc78c3e510089e1d9cf933c1f6e5218ecb2ed9161e9dc1232ff7721e76b5ed9603169505b4aee17a9209b201d1160a4f5c4f81f0fa5f1e8919523142686d0f23ca315448e8aab05aad51ee63074b29b95cd528fb314bba130b487ab2f413cc5e207cbc15f11c27aebe5424682822b8258453eb259341a33ea8ce8cb0e4e3462829cce386e8c480eec09cb49529a4deaec4f7182eae6a11cc977e230e2a53efa8f88,f759405066a17989cf3715a631af99a290602ec377db33db90fbf252ab2aa315,92207f4fbfcd1d31d15192e0f345e918a9547b6253506acbf04046593d78c4a01fb04f601a86647ee280cfec5167fa969902db904c8e2dc4b9b1ad11e4b4826101,f2f8edd297dbd3134980775a34ef6ac29e3c085efb4eb05b9096e639d8743a1f68080447da9c087d766ce6f1bf6e299b11519b8d2bfdc9f36b97046b72a4679e00,5eeee0009941636c54eb99bf195ea34df527fe6b35dfc9f5461668f00485bb6030e69b3f76a534b446152ed12a83aaf329a1aee7f134d82f931448a6558f95cd00,819b4ee7e098e4b8c1b46c00e2e21550ca113ebd93524495871b3cae3994c9fb5781ba86babd25954dc55dd63e176492a2c656299704cbaa86a1070298be6ebb00,1110a1909cd93cf396446d427bf367e5146c0f5f6b3207e0fa720e934e8912c624246f912c765282282f2797e7c541f4d1d8f0bc6a99437f2a1afed7fd4fe54900 +fe270f543c2f3ab6c06d2ed8af96ec52a15b663a27777f2314ed2b320d7f1109db229df400aba85f08702ce720df0f9116ee57cadd621ce05a4a712d127b96fbd93a69e267ff8beac9054a1b2a8149b523af8d86d1566c3219288e70278fdecf551de351ffcd4f2513e083f0c35e8fa8a52daaa5d7ad3ee5df743a7f20013caafccbeb106f1ef68fa16ba3e7fc7855f34ad348c930ba42291e8d22101d3c17fc32e7f1762f6956,f207cba58d817396ee2370efcf29e8963e009c8448d8fbe48a3f6461632c5044,731738ccef45f2ab6ddac3dbc76f8771eb6cb6dab71e3c04370d58b6be2e43643be573da69088cb502ebcb9caae07983c2569b3316504b8716f658c638fc726900,2579b86fc209cd744648215a0624e912fd77ab308d022de53d04f22fae9a4310717ed409b3a95e88170c0842a923354e987038a1c099971b8393ad26cbcc2ced00,d0222d8322048d6b102beb868429e25d965529cfbf244e7d608812571ced941844d1b0390ee0f5b6e49705ac773ec2b1265dc3c63bfcdd84658ee6787e526f3e00,53c33f1b95d391df1fe7cee616473e45c81387268a5429274c57230aa808f3654b83619c4dece32df3f84a2903c2d4a0724d1e3ea5be0f8238be0d56617c983201,dc6fe5d91d087345cffb5a5b56eda52061b645d8e8360882eaa365245701cafe31aa65fba96390b669fec113bd4cac091c97ac4e4fe0640173592dd1978b57b300 +1081bb96bbac2f4e2f14bc767a3484a8e3f7e287cafad6f680d41c0c6870f4efc93e319cb34035a9920219b5e1fa347e4ecbb9a8f581ad20befdc1b0054cf7d9024d884d8671cc637c6f82876ccec51a44e1b7f19c78d424fa26262841a349bf3e6b216a57bec73d28430c5c3ae636c0c49f59ddb74dc620e46da1a96f77be344a5cc8c8118a16803de50f92b0da7e617ddb1e88e4b4739dc8c060398f8790c2d86c92a9f17636,026ed6114710b41301128681c51bd1ab88adebdfc348af36bcd4fbc4dbc69ce9,fa071fd2ed4e5d97c32c9354187d4801f58f346169f4bfecaeeb3299198875401528986a241d27b86b2f588389bc7a61bc810f91396e0e527cf81bc35dbe91cb00,4d7e1340d641a1f2e851d1e17cbaccad8f6f217cfad6240852573d729697a0334d7762a3343cc98dae6d934de44c1c42d46ad89e06819a38dd27e3745ca53aea01,6fbaae5777386fe377846101f5fb84b568a0bb9caa6b3b50f049fe80a8683cd22492e4aed8f181ac6090b9f5966c300f89fddba9bce14fc5f6427b365aee85ab00,dc5093dacf7533be2a4c6cd6af84debedabf9abbc485334fc0de4003c1768cf65345db757cfd0fc00a2b5056e624da60c59feaed3d56ba4bf7203d1f43570ff200,1e00fbf7fd61dc47ce4a41b583ac3df4d908589e673873d6beaf487bbf5bb3661daf2e550098385960536b3b6d10a56dc0234396cffeb6130e71ad6602a8335600 +a69b98c0eed2f978a7a5f18bc28b9f74df1c301e12c2cf5aaea259ce47b71347bef12a4cfb91af3be75642d96361add373a16b74d574f6d84f255a759d66db87cb33a95e05810ed8314324fe2f6cbc9422da76b49bb15091de2bca9e613b313549fe9e37754a0a484ad277fa41af3d0f68841271d8bf0fa3c3224b2c2fec334fd5d2807ef3e06c5a29217ef6991c55c454d6f91b63569dff998f2441de37e28a7bd4ae67dbf1a3,a94b4ef2677daffdde78c8a822f753268beb535670de94039d76ca51827f9305,e56d271876e76cf90cea94f8834f69a588e0d4b54292ff432009e5abb48ed1431416032da721bb44f26b4d13945a5b997e160974a5a8027600fb8bf61da0188100,775a2a6ab128253b21287a03829b1294b17f37a5a6e74d7455abd16170f612ce09cd1f7dc63524541675a4d343dd49878eeb78156c92561d79a7c4f6205581bf01,8b511c9edad23deb5181ddc0db2e7cd5af1b17d5de3e9c33696f04b5a66dcbab554963385744d0c7fcd4e380bc11b90006ac85ad64171a31554cd72264c5e8f701,4394e37f9f2b7aadcd69b3403644eb6b3a40ec495a6b7fad0ab3b795fcbd44f1740c0c799e3f741eb5dac6e2486cffefb0e8da0853d961b62c082bc0151b2df101,6e342c20d6c45cd17f4883525242f58fd8d2e7e29d65f27129e80b402caa600d065ba789a37dd68140ff147f16f2e7b88093367a386ad894e4b5e7883125906f01 +ce819d0c3129a2e1bf564e85d9055334b61b25a4af376cd5669ac322ea9da022baf66c1b726fe6b6ece1c05d8d9ef2e528aee8dc2ebb1cc6393a4ba08d5c2034ccfa58fc1c352fc24d6fa71148251acee29f44c810c7f9903c2fc782fce54e46bbe8af022f597bddac20894c8fa6ef17e6a679d9ebecaab93a35d1737ef45c70367e469d3c30ff2986cff7d7b1a441e29ced30afcf11fc37557d2a37e89bc8be8eda05bffcab7d86,4a3f0d66d9819d8ca409da1e4a2dba288335e02acd786882023dc2060c85dfb3,8dae36d791dcd630316acfe38b18244d43ae061d952ba06e6577433b3f27dd71460409865035ab6bd59b5871dea18630637943dcfeb477099d364702744f77e800,d1aac5c9b638abfc1e7f85e6d11469e955a3532246441a087cb18f37d85bbb1d7f3ba7c4f0e9df138633c1561c4b50e2836eae9cfbecb506d2a4eb5ddc386fcd01,a1a712197d914fbf6270cf5f49c342e1c90d2a9e30fbe9c49bea9d822a14a128396a3425fb57791027b9df16461acb00e0b6da237ba5aa3f1a9360943cc522ed01,e32b6c01b157b275b4a6f6a7d75beed9d86a6e1c5cf61160f8e923b9148003405d119cf9646031b7ceae8d2bf2d9d61fcd23c7aeace2b95a8b0357e73ea41e2b00,a4e58150ae459bce100ffd75da90dc05ad6295a0ad6ede3e545067f8324c60c82c69ac3cf52814c1693c8d0a3629f93ba4832bc8d5c9f925b9e151b2f9e978d600 +f6b98fa31832dc9a3c6f05789ab70310d05c784045f234dcbff9bd7530ea39a0ba8a3ded972d1749c2461c4780b5b020cd1a2cf84803b020a58bf04148438ed68ebba1f2ed02713db08bcb5858324778bdb103a9cae3ad9b872135827fc06e9dd399fd04e7d97e59ef9d2fe95dd0abce8b0d3dba3512b30b50b719bc87386b2d17a1fd63c3913bbdedb5a12190a44e07f1cf5a8c0d7268e0b4188081baba3a80d87d5180d839d496,ae241571a14a4136cd059170546fd1c57f2ebc34f5b390d7c8901c1d9f607a8a,8a2fa12f9bc982628f8c02ff2d44cb674d0180a17acbe994576cdbb47291494c57c354591d1feadd1169bbc209871a906f97ed6bec269e347dc94e2c733d77a000,38f3e9f19dc604eee828127bfb0ece04a75dc52aa5c3b68ba52efdde43b1c47c6868079fdcd6dbb05640ad8b09905862a71c73481ecec6c3c2ea255e8df3ca3e00,9b64bfd516bc270b044b299d32fdb1444b3835805496cb9166f811a0ad54fe933adf05c7af1f4f60e1d8e90c06f71462f6023366e617f7d627ce05dc576a8f2b00,dbac875a1e0bc145b8258d26899cdae2d18b733e4298d0c107f120c2786979115c7909c5ff538454e0476a8d3384695046d4abc57d5d08dd9abb6c23481af9c200,03d19c6e623fa66cfd810e07302025c22d143bb430283840aa756da2eb7d44d66f5257b24f00b6bcf858efa203c7b5af4eff3f1cfac707189a3951351be5e74c00 +8dfbd24d7dd8484e3ce49a1be734fdd8273369d775242c04e25e4452962c91a51d4591bed2bceecf02943c45cc8fdfe6229b42c9d8c3939204213f8d890dbe1e404dafacdd266baa7c6eb258bb1ec0bc059ae93104f6f74c5d4f219927481647bf9299c6b004e0c05c2f5920b6e6252246e0eff35dafd717773840f9e6d07373e3e49b4e72c12e9632ef7285238317ab2f5b122511f69c56d46aca5a6c8140a509e9d2e97d9ab1bd,41ec1ad45e1d631596244866e9a3ad4c028079f947095be667ed23e6aa5dd38b,974e9064212d28633d1d00af164ae2bcdc53dea54b479333c8d3a65b97ce2eae5c483d331cbcb0b01374d9cb3b61b7d09f60f112362901248b50c7e50acf6bdc01,35dc1f06394858719186f5ac4ee1d4ca7372a6d9e80c301d604afbba2b25fc9677ea7b8e3e7de6b92f3423ccc5f631e0ef262b44b6f89f6e707840f92644e94401,09b1e3a7c3ef0fe4639f048a0cd4ecdd0d2a5a1f63de31c1793e1c4f01375157266e14b838f6254476e8a4dd64c69e178614072243716f8318f364048ffaaf4400,952937616299333c9517bc3959d988fd22011655d099ee30caf2bf9b56a1158330315dc865e6452bdf0d89c5fa3d48f1c7d1b005b781952d744f436204fe38ec01,4b5a32870d519349045f19f25867c5e3c78283aebe25ce27c3ee9fc71b5feada64a243feb224c48d63399601572bed4e43629ba2881d6bc748be90826a9d7a0100 +f6f8d7102bf03b139efdbd80448c5d48038b3307eb665212ef9e8c9e04a52e9902555c4ae745b65952bc4e45bf1c25be6a5403027a9e8cdbec7464ae07b8888073b63eff1b2c8cac0aa8390478dd8fb68801452db688f7c666a18ca0296886e6741243102e4c8e089ffa48b2dc1dabbbd5af5a720492ee1ff7ec6875461e822c5c6f44bc6c11f99e04d31f3e983a8eb647f801bb742a029557c5b71c2ecdec930e1e8f33d173e0a3,a980e7202c8b17ce75de22fecbc31cb5549b62e4ed1e2346a88ebefda3f88189,34035b08ce158750a7e14aaffd436c6219fb297fab6d168d4a2b72eaca28195c5f15429754208f656d652bdfc6d23d3a896ea3ce44d148f0b9bbeb4265f158d201,c8144cba77ab7fb9f28e392a48c82acdb2f760a7b89736b05c9efbdd5353bbb15a9b83c54f863d93f5fd4c12fd68110f3eea149f3888d48175dbf875b536257901,05a10e63195de80d1a3a71884d710ae0af67f09afd640e9154a18a7d8bedac003c661bb14611cb79cb7a78ce1529e572ba1fb5a50afe3014589743adae0fd78c00,44bd434914f11366c1886076e24a3c3126a22f21cf2b8069cb95134797b91ca727a5b76f3a6fb4d4158b0bed33c5c43b6f383879de35af485578838f969eab3d01,f257b59a2adca8715b939cfd6b09c1025b1c1b7a9e615c0168d0936f4ab1492533cbd847a66542cea42b4f8b5de24dbe8b5244c1e219b369c3ed83864ad3042100 +638c355ca489fb126cfb5b61d004e76beb329efaf532bf87c3f0db4695ce5e603f1aefa9b2135af0681b73a3785a65c0916257c657d15f486f6787f2a7623b468f017edb3c54a969f027253f94c2483350fc0b812d8075407372463ac3e952ad16642510bfd90d7e324b505dc48fcf623ee4f36c3ffde0823a1a06c7215103b585332f66d4d7c2ffd0a04e8c8904f7c8e8beb00cc3e57a768e20ced355d5801504ab9dab4aa96304,32f7b697c345dffb449e37827a21598935bc3eee27cc874a0b842bd2d0f264a7,dd0fc04c4a592630e16011f79464d26379dd1a18a0e413cff56ca751bbc1be2d09b83b47fd88c11eb719ff62ea54588c1548ea0f4789c9c7493cf1ac9f1eb7f800,49d192c1b1f2d310cace14e0507b1a6270e10617ee47e139746a18f1b8bbbfc54a14112246c12a5bfa0250d65a4f1eab95b7cd799ad0bd6aa3aba3decd4f12f100,fc2766c260cf330b37abcba96c2915f7736d6bddb1b6ecbef97a01ac9d28604337f41aead5471e134c96f62e7d40b83b70299645ccebb66ca8fe4a625fd805ef01,1ca0c0c69ece9b17984f84f738869902d998cedd295edaa6ea03bedb72972c665e1cdbe6dfa25537cfb15a2beb35118888764ed4fb92524dc7b0c2fd360ba02600,ba95589856909308da184e33980bc7f6fc0e72b18aac7e52de6223ef5d43c73f63889e8e04f4e2c181b827379e184d12a8880adcb4f15322054fe6cabe1dfe9c01 +33b227a5d29b0b03aedfe97b1f37d85ea9bb33cbf85e151c13581fb79801ca8f395cec9522a8cc081184e9a9ea7f8c3a173257341f62f41ddf0aaa021700d397e374ef777c2d3cb4cd9eeb9063fa713b9ce7da9e66e5b0c43755c428e29aceb08dd0f5fcb220367e0f6b3492500df132072a732d3208c4e6626ec85f694efc09f055bd8f71a2a41c37b8724fbb4f0c84cd168757eccdd51909aec0f8ac8591110e4ea5ad11e67bda,8e445449444192bbbb714fb9bfc1fa7b0cd99fcb647c6ef55d05b500249ae870,c2cfddf21fd6534771bc957febca3f85887630f4ab6d358c3362858f10faa347573d5d0c05566ee81ad45489aa8d22bc29cf47f8e90dd1daa85ab99d38e6e24c00,95160c798e8edc0417de51c7aaf7f3e1daf6a8c8c76544b6991ca11e8379b1df26f881b9a7fca547c7ddcdf62e9454b88d6b255366de3d6a2cf3f8a5000598e301,89eb47b6af3cf381ac39571599505583515e8eebba11baa9810d9f9640a31cc50bf4360f8dbaa70fdfc700fa06880d31f8f9d7cb2a66f5ef143d2bb9bde83eb901,9bb7b67e3b57a8276f32e04abca65ef9040068143e3fa1a9d4445a6bb7708ee21a436f62bc7192030bfc3dd5a3784fc642062ccdaeff62ee049bee11ba88773201,313a81364683d0efdc920b4aedfd59a137feb050324c30444064605c81e913082a6eb9073d9db95790b88073bbe03906db788117395356f77ab62146cdcd389b01 +5e7d00bc2e3eac165ff6a556b7d7da2c43ad79604b396497e2e8c13033de92b4b065f03860f586c5f79c5654cb15edba2c41142c8b3711c195c1494e76e2f615fcf6bf914336fe87556d163ede2bca963b7884c2cb41da14493909772605f96fa76f41b5ef1ed41f5ddba5376ed6f4c837f8bf5b1482c3a2a390dc7ff210052d3c61ac4a3f4deee64811304f05e28dec9bafd512692a176de72cf0dfd3bb4a318790f8c45432d779,686c8be5ae3f85bcc70c0dc8bac8596d63f2ceab35b403bbe5e7ca6757b29374,e8b32a5300cb47d7fdb0ce819299380978117b0fc9618236d5931f4058f0cdd67f27c39071d7b8ebd0c2d86d44e9257e79fc5810a1fdc7ffed28329ed3bebaea00,2807523c3815aa72fb48bb065514105d7b930e1f8294fd7561c9a3e0685f4f6c786634cb7753b60281d841d5721de491d159eef457587e6f91661a9f0753597700,1d340244e9bbdb51147a7e5c311e7c33095bb443b3a1345c36dc786b96799b7e1ed762721a1bf9689c50043f6932849f22145bf5d71d29fb1ee994510e39027100,6097d351af86d4a7beebc4255a3a63934545eedfeb5e99d1240bc1bc060fe37d398ba96e3924fe8aab35a5ff84b4c5677d4dd0a5e411b6e42f23d0f37760e14301,fbca3a029d11b09e51cb1fdb2fb74d7422ddbe587391ca3c8a5204d923bb3863657ba8d6c1affd718daca36104dfe78ac736a6409a5712aaa9753a0b4bfa2dad01 +7a9eba1284b7041cafb669198498bf94c1103ca6e8eb20a107fb0b81e0c79ff44003ec1a92198b4ad7391d8d302c1e43a0a8a395a6e568ded179cab8f560e0bd679e1a4fc57f992ea6fd404da419d316d02363a804fef5a8f358eed0dcdc89a9de6ed2230aff6da27f8a95dd5b5358a711bb2b859bb372d98cc6d109609418a22a60a7b5eec39e593ce002d099cc295b6e34ea877f11832ac39e2b54cdd622cdcecd0fb30f60bda5,3e3ee2a64d960744789aef1c383fce4b9bdc46eecc16f1945b33bb2837d943fe,45515c3e995513956ba444f0696874cf960490d2e05d6d611fba147e9d8327e27fb0d49e3d287e4ac155a382d058645caab155dd18d9880671aa275345b33c4a00,51220420f3b42f7b9b3b5c47ad92bcc3cc8cd29ba9a5a924a91398e60f07167a3ffdbd628f4bff57e69eb973455a64a7c8e7806d94339ac03f88f6764ae9772400,ca4495d2ae0686d83f8ec9795e6b49aa09966c34f04903ea1593480c856082465df7e8807f1ddc39d0f97881d693e4749eeba5909b2b87612e757aafa0eb2d6000,91b4a1c7d1d24ac5a78557f9ff7018a2401b0a15fefe70663745da460f45f28a4cb7fdae09379148d559785bf1ef8df25c4b0f70eae98af1d8b93f31a5c5cb4c00,861bd5704396b585372ffb3233fca6335243967ea4fa5c12b7a15a1a7a2187de3fce79765eb6126a168946eacf4ab76a3a1724ed01c1ef6d5a99070492ea07cb01 +11cb4b9429dd304542264c228771093024f841a688cd54015fd823e442e9a9ed807a1104b01401cf7ddefcaf9c2525b9bdbb265508a186007d389e4386377642088fa88373a493a571fe2816adcc898d8c602b1fc2c6c000fe387bef0e0c91076ffd779a2d1151697eadc0922c11db286c0c9fadb1bd51a6d1c0a0ec67c0232ef5819503f57000742833f53d51cfd5325e6173523e5222a52940e8ccfb33f08996b6996b75c02644,66505771efdf861dea74bd7828fb1fa39b0dd162db405faa8a6c024aea146fa9,610bac5ed1879f9a316ebdf3e3d349dbb33b4c988ca847979a95db658b65b3c22268524844787db5a79ad68d15daeef3209136c7507148d3e83e9619dcd4bfd100,1d821c54708f0be8fbb62a38289dd5f45ae83f35e6ff3c2238dce86918a329d56fe24a0daca2dcd3d9acc9b71c97d52669083c528d7d4c79b36ca780847ddb0201,1aaf3379908cd35719e7e05c60d67c5804d217a354876dc3a1064959bd8b8e7217c40d24c960f15d45df75dbf151b21a439700ec591baaef65b5f8aec49fdb4e00,3fc22f2b420dfa8f2f3c4d587594b542b26af24b191f6fc0b5b34361d4ea6004298fa19fc50765dd28394758a5fd5c1ee459a2f93768f66d613b6ec6a6c86cdc00,deb85ab040163f2de107029a55f2ba2bcd250c896df767966d7dad8d0320df966c9d92e191d8c87b3af8a5d7dbea082f403ebc518519a534b5d649f3b08fb6d601 +8b735fa0354c234b1ae1131903bb819d3cb30a5ef2fedd683a6ac02ff402a415b17c955afd0cdf988cc84bf31037a0ef3a0e407daf5977e3dadc5224181e666ab97d6bae505818f0b6ea072a7ef633bafb4256e1ba969ce1eb8805f775566af9a2ab754ee9111a379f735d2f608b3b091a5dc03733bacf32c5354806c19b3f1d79f86a02cb8221373fb9eeecd4f83d619c4820a79884de1ac8da8aeec3d2f1eccf73dd9e2338194e,a36927f8a80fa50f8ee000424c6b38c33b72f6ee36d1b828f25800fac2b1c702,737d3223cf40b7888669f6a70957ffd570dbf722e93f71a461048ca6e45c0e023dbbe67cd1e71914f8f8b650db5e186ef3c80e8c82c745ceaef988abe60b6e0700,78af4d3644bc0f5e56d96cbe255d9ad6a4b15347dad43378b2e31074781c79593520779b7bdf99e6a533cd4e2ffa82edccaaecfb54d7ae323116f5498e9d812900,68ffd48a31bf4a800b6fd844298ee9cd664228c44cc6954f0d2e23e4d11e4f5911cc80d8011ef0bd32bb7dd4b688bd9b5a12954df00900f090a5e0dd8288749101,99e6b2cb9cdae942e3ac123d86539206064433c055bd1130e9df77c6c03ec45910594e534faafb58e41b1c2052652bae80af5165880ef4eb8d4d502c3c99e09c01,da4c8bdaebf8723c4f99f7b24f71e6119abf5245a87f818974db6b64a4b5c80a51fcd937791a263c5c327ec827e5987a994e0662f13a144921eed8775a60aa6401 +8738b61d2c3d921445c7a8eefe88d2d7ca2428ef8eb6fc3983ac081a0bb51806323f7406b352f485ec2e22c62b2781e52171132c0e3be617e3c3ab5149d35f821b9ef7f3aff8b9f2b83e1e17b04af34f75d8073916b6520b3af6401af221f9f38386f3630fce2dcd7e8d72931000927758d97ccdf753d313fc0d9db0f1caeee65a8ab8f4461a347000074e7e689a066eddad8b0864835491eff4d1539305ef579abfa8544e3321f0a2,e77ef54b2a1f50197819446314670418d6ca62625e067e6f20910363df4490ba,c1b401d3e15e037b4ff6cd82f0f949ccfe9c441d711f5171de8f9f44008565296b52044b2e898e3fa4a9761103860195264830d4e10d109e1d78e2f36b592c6e01,868667db897c1fe8e8cab9f5fa06b9492af1ba70a6f190d88a99dbb979e326812aec3e1978516f86b6a3f437049345f2a82578880df520b8225cec1a017e970c00,0d2aee9de5f940d434e5efa43025da1e05ef679174a7262ffce224beb6f3888710ad5cdf65c0a66df4da6e4bba601bee622afd448aa26be70a3d3a779fda8bbd01,1b1dda10983f121b15841dda7b7eca0644f66795b6ae9b87b1396b7a55283d0e67e1ad3c7ade238ecb3e14642373d7329e456a622f168527b643991f4198f66201,a191067d7c3d2b43575339266cc143a924faa187334abfd42485d8ef91fb09973d2a6f3a28746fc57aa631eeecac7a7717769a23e519f464d430685c840cda1f00 +edfa1702c8ae0ad0c4bfb3b2497659c75d6637cea63e2faf23c804ad0429192073b2c50c02a8a942076d18754a20cd200bdd7955e71cc85d7325a8d429120bf6db9d21069dc6dafcd043ddb35b598060b625ae568dd31ea30d44bd2343a14598dd8ee837b1c6a892a0209bd6a271807211b005c4ddf32c15d7556eb803efcb6f9ba02bea6f613ac4273ee8c3700cc8085025fff4701cfdd5de88ed2e8fb319743beef5e7cb710d83bc,e0db9520baf93daa15a9faa50580069572429095a0abc2c062ce0a0720ea1dc0,7382699ed3f353652afe5d8bf44c5ecc95155baf36ab3b9c1f6ea7d8088fc71079d20519c7cf197b69e55ca3c71de39aba9366c2236a09fb7f2940df3021b17001,2230bb639ed3a6d81dc304a8605e6c9cc27aee669b17a9bb217b93f1cb6c89790d4243ecfac6850e25b6a4d9f470450330937bfd183df021dc78dd639920e17701,a90965a9d044a163b0e96539c4f0e3c1f268017e395aef34bde7f3a0c634bcfe430ea05016bf247f611818744a0be07853f930d6de6122005f0e1c22c2870eaa01,35b1961ec7b9138b8d6fa728a228e6c0ee71a3c1351e441d16a828d5f54f5b5260fd2622da8aae08658670fee0a32e31a0546a86aceb63bd86c837e0013262c301,11ac6d46262b63e10846a10a03348465fc9a7a8b8e02d6ec9921f83dfcebeeb05c345ae2da9aa86af2ed3e93f04ab32c5c31535204498cfe561c6d28de41721900 +d152b0d13b12031fb08b525540b2edd06e050f6f8aae6e6e7c07d72d9a6591c87966512060b5c1f747f8b3682ec107d924f27e6b20d9ab5bb4507fba2ce8075003b5085e5d4b680217857b91574c9ce6324fc4a911b7adab4c8bfa3a61f6d8fb8e2ca1357e1e7012a6402df4589fdd09c5b820fc5ba65dcb5f3c9c6f0d545ec07bee72d8666bac850197102437dab478fc00aa3009df6ed2ca3b96fc1e69be75c6f0214ae2e994f657,4e324a4b848abb8c476b922dda56fa6adb7ddfa0fca073977809fb858f9a803f,77671b6a4adf416b74f265f4d2745e504081ffd7488502405e98d0484e34b7df086b028b70b1ab2386ef11dac76a4b094253ac143b981a6e36f4f464b8d418cf01,7f4da8a400255be5cfb3af2f9f0520c2d53e6513d2d4e8212f685d573ae4a4b6632a925a0a415d3b580a2be23e655f21d949f3cdc04abd0f39c7f588340fe5a201,e299f48b0bfeb6002dde646a1ce94afe503c195f2645cdefc0d9176a918b493655ac0fbbc841b20626744559fdbca47330f0b233685a6366f2598eb4245b59c300,a9a9f387e7c244e379947c746330387b6ae9d0953bffa559d4d8dc3a50b1a014139dbee7e206a7c91d661d2814333dbaf6c7bbebeffad3453b6502c6e45e095d01,d3fba4d42311fb5c44523aaece4f0d8f2af387cadbe5a7e6d718779e2befbad169f140a80c037ef6931204cf3804637c34dfdc0aff23e7837df1b5f3859ad93d00 +aaf2e5e5397c9855be9bb8ff794e4ee8ccff2ca28cd0f859246e01fe7f591b15ca0c5257e99a05b877446eb3c9f3da2fbd226422350fe9096dc58bc3600b208016568acb98c1259386cd0b618fac2d0b08cc6e5834a9daf5e2bbeda59dbbc94f4233aebd3d605b6ad5bdece9e03de2aee35085b4a8731f76b378a60e7cccad6edb3fbec84ba484e7f84a8255cd12d895404dee85cec86a6b11a2048664fcf594358500b87d4513e0d8,d452441b606acfc1e508898de4e496b7936d69452e7e7076f7cf85473a9e91b0,84205c9172b226a4b9d80729c85d12b003c123de08cbd0fe10ce1773c84304fb5bcd2e840d4f2d638a5cfbbb18ddc51546b28630d5cad52581795143b6ca9d6c00,fce81ad05a7ed6de91d75e0778207ae298e3cbcae72618121a4f649d9c14130a3adf37b25626f83f7dd73b9e0957d01f0fe800fc42206a095ff550ee32e1173901,0ca1a7d65247b44d66c48ec3f10cec26b651f1255bd3bb0c5402a0a5065d8b840a83faf873bdd52c94b87f16bc1593ed3c6cde69a4c82993d49af5a5fb7f083b01,eaba57b993109e9a932d839c3dcfb6e8df60cb9ef2b7bcf0d992d57794838af4156b235b2c8fbff8a0d88c9b15fa5581a178e16f10b419359a4955d74463f32500,b6696bcec1364bd1586e7aea4e8ff86446c2c4be464d105eb6f72056531e449a7c8ecbf3c96cc29893cb89f1442cc46a268f471f88c20ca5a56b1ef50d22aeb901 +88718021911eed6b0ece89a649b1434e5550b4341d2d2c8c4afce0e17f524b5d57b80008b4efd0936de6af1356c9af847ee94e75427835e1162d014f70db49e0df899322ab01853f7edb603297a4717870238340616895d1368615f75c6caf60b33be1737b64038d9aa9850ac8be1ea7cedd094f30b8720ebb6acbab3d603c812021345f6390dde6b52adcf58e8996e58b940983a8bdb0b067c456d523e2153310f3f48d8043ad405f,d789313412b6f4e1575f8c09594d24f56325f9527895c0e80c3fe4e75c20b6ec,a20472e9e170ee4f89b7315fa498a636d0e2ee86c562e1675ca4dbc7dfd7d05740b0956aced3f4c55deddd170f26617cfeb80c498648930bae90211e7cda22ef01,1043568d270954028e5c663804bcad56d6865b4eb11b04854161b2ffc6969e5e0173e9b17168a7e09eaa5296d74db45f303a8293852188103b0eed9848f1656300,17751bdde9246102776d30933cfa67574a621e969389b9576d0004cdcd61416d78a81c5ad79713ec3e688e3c390602ac2845c1e7da398e6b8deca3b2d2360e4101,cc8ac658c17e8160cbe0979cd4853362026e005eed3303bd9499c217daf493275b6ccc7cf4b5f3567b7ecfe241109f670eda82fa8d81f23621247d2eb5ddf5b100,0dc90ab0a052125c6820536bcd2ad446cf1491ae34d40bec3d90f815b8bcd2913ce42d7f5fb320df7a3d9c8c36e9535c2028b67c08f934e73e336eaf0309525300 +3f07f20da1bee8c79fb799ddff7c433cee15049b48c6f88587f9762c3ad6fd2207c156e8f70e96f0b23f3b02972382fa34e1ebfc1dc197667c9d322884be0c54beab8d52f2ee16bd83eefa483b6452af198a489f87a4fcbffd06c93320de459187398658e83e60fdc3c8aa12523ed4192e1584f5b3be48e9240660ab927238518def2dc04433afd1a2396dddf02face6a808e43c87552a0b77928e7a0dad58cbcb3f5dcb88cd7604df,449abd9086120922cb66dbf59c8bd0bcea7d0c94d6c3777ca5e95ed41844a317,ba47d79d5334bee4f890502c5f9a64c3ce90e3978f60c269c65dc2aa7c6cca3d7c691a46f6d2ea520b8917d86a6e1fcf8b13dd3720046c634a26b6373a71f94900,5983251414080800d54432c588ba1376f872baca2adb1fff727c0df41da4397d4bd9f3799c7a41d7b993aa68849a957eb369ea5f456e2d41d1ccdeeca1c4650400,16f5394b0c30dbe378fff67c73a89f136c0fb498fd81a8efb4bf53dd40d99fb544858f105f3b0690f7773f911744da1d5013ce7577ae97a77765e8c5eec9dc9901,cda2757aa69a4a9920783f0e3938368a1d02ee6a1dd163c32e771d9d5066985e6c4150bae12e45d1f85660c0a42c9a5bcbcafbb63540a9b74523b8d29ebde88701,795d99e09bd8ba1846119abfaa47cb7a636265befe5309652d3a54bb4d1e148f5c0ab02028fde3e8c628e902210d148c36a195c89cb27d1747d4ab8436c405e300 +69094fb17c3a7bf1b86f44597a812c75dd6ac1539f8ed36d1ac41c8975a33033cbd3f533ff54357521351ea1d6d1b2f7e0d22c18dc4d792df14937f53a793029f626fa0761be0a0bb6fbabc6cdf33f6ee36d7b584d7c3ab8cdb9f0f753ec9d58f7adf0501ea925e5d8331d84bc70c7c4bfc1d69feb67dbe166641c6b2ae41a6b1f063236cc1b4abfdf76587ae289fa1e53a2d32afad042d9c619a406732d976ae27e2a7abd1d96643d,bfdd580f00f794f1e89e3dc3c24b152ce06040ac77f313c50fdf2bf9fc3893fd,9035fc67e8b004711483a3f68dce311ecc067618e08b78a7180f3a9b3aea27c97a8ec40ff81b16f69791911a7a4b9ba45fa5ed62e640d49d55c5684c42f49d1601,1dcbb14386f08c9d9eb484068edc53e26a17d8054d7923304a1097ca8414241060b6b7ba0ac798f8cb59d14c9e631b7f9d3bd8a9d7beb70285fad820a620caed01,48c7fc554807c77837e8faffae7ebf83302f16708becbaa6b8897b65771f7ca65ce8cbfca1c521fdbaa8d126a4acab21e08d1c5b78cdf534845e5b80115cf4b800,89a807554a47d45530abd8c44b15d8658fc076cc65ccf73d572a2b2c13cd62ca56e07080ba1508387490e0f7d059cea86895e9aff1b4cdcfb5ed5aba3315b66201,8291dcce468eebbbbefcee7b2e948c916a54e689b1815fcfc325288f18a92f7b5f888240fa593a514cc4bc19d6d06f6a0177fb84d8d63893150635fe7a50cb9f01 +b5683722edb1ecb35e3abedb045d26a48c7d56d9185b230bb16b0f4fe9b66c3cc6033a9d185b3a21bf7d15ff5319678a10a727beeef6be451e67f5f4d04dce5a1596347230fc955e6907205d36f46dc6ecf6a1886b0ee82f7871f11020d046a0d71bbc439449d77ce43b58b44673bd729c097f0957666618d162de4b28f08d2243deead0a8752b30c5dbda790d73bcf6cc5c1c05d3b9979ea046a626e29763c8999d4b47d2b990f5e5,65be3107c38531aff245dcac5c2a4d41e2f573b64192bdd9efd46947d5a71ad4,d917dff98f5135f163743fcf5631aa4dcbccc5d099643586e157903861d84b8731e4bf86097417cabf8c64f2da940a75b9c4ab4ee8c451b8704dacbc3b9df0f301,ec63b9288faf9ed609608f3591f5132fad30e9c33139a59ca301c4cb91c73d7f75688ab93247d1d65a45c7ad70f70b46e8f29172d830d2ab7daf00edf969f59100,4c67b750f88296d7a71b0debfb8506242e636596b8c80c8ae8efbcaace56c10022c64f1e1ff862036c7919dedff477f1960b0539c3af7b1d52c155e82d2628a000,46414c342495d55288f7a569c71615d148c99d2f371830ecc406a8be34e8a66a662e1c48009216f0e6fd5e84d85e2a2c4bef446fdd68fef30c1362994565b1b900,db1c61a89bde9ff5b6a367f54c7fa9cd30d3286300722f2882f15bc5b6b0d25f643d72d955ba389df596a92dc8352d9e0b1976c0eb07240c92cab79b170e98e501 +02d93df831a3e439ff14ebd91c46e22c9945fcddaacc77c6f0eaa50d59da775f2d9fc47a3c594a0a49b4cc437af816ea0b9a5ee8d9e8a0031bd774bc7195a662070459a6b52aa56d2b60ac9ae84e0d40ab56c1fa5c85a3fefae7bb0b2748757cb321e2b5cd9531f95c971474b39d0e743241b8769af84868e3c8ee758daa4554b5716296aa38fc785269ee8b7e645d713211403d225ab1774dca5ee3f2f63f931a1db16df49dfcc1f8,52d38b65cb46d8c1dd90553d4fdb9ba0cbcd5c58a476c0a7c6bcdf80eb786770,a70ab8e5ce2542b94a0fcec568d194dc7fbae1ec4db6a66355f2f5f87a774b0d2f92f7941da9eb2545df829c5d9b7e3f78dd7a3fbe41db2e38b258957b42605601,e068e79f0783c981fa35c5be0dd0452dafafecf23eaa0403adbadd25757dc44e0995e3cad8bef312ea6199bb043d8bea6f767865e74f95503b867d9ebb7ca6d301,7b6dabd2dfa5215b0eb4ddf8911dcf2003db120ed33382ea47219698f7bbfeee4a9fae2d040af4878234e9e082c0717fd776815cf39893f3cb9fa956b9129e6400,23a5e5fb2d8ba80fba0974c01b3ac1b4d835bff6e57b532ff10550e08dc1c16d767bbd126e72b4eb8d3b85e84a1451ec928906294d8a4a670ca1b1953fc0759400,66915027c739586a66d9aef9d2887a29b49f19ceb0fd6aa5539ea76f4c43ffe56a08839de8d71e2ebe0a87a93aff212a5d0bb24e4a455d026e73cc8b8314845800 +83121ec78763a224bbe0b724090bf5958bfc540086eac4bc593d5ad4bc13205becd51052a6fc55aa607f35619331e56f7901d42be9d833560a2a55ab3ef80e55b3ef2252203954ecf2c73088877fc38511af2b33a6a523bb26b3bf6f0dbd3f00af1a34203983d138c7e16addd1ad07dfebce989ca1758a287c36990edd76e87f7acf5c589463e64a8ebe841148c5a10667177d3a6651aa8a0b6973b6f95da9ae73de650ac5b3f00b20,9654488716b40f5d245fc0e2acdd1d3916953dabba32db8cae93854bbdcd8573,b4bf75615f9d3fc79943b97ae09c7464aaa18c70f2718a49f0693eaaf079634c0b40c0ce9f658ebd351d83df756c2bc8ca890e34f0de4e063a51c7f65bf276b100,7340cccbe86ba3895188fa1c8af07df5e21b5f1b22e77218f04ed8879339c86e43837f742e2ff11089915958b6ceb43dbdbafe257e996e9e34065d9acbc4436900,352939e58c57b8551b510f4a315c4b51004a62b550244cc5c75cda1175052e2b05d2b8c47e90e242a66286060c0f87d8be16e11f28a766b475b7e719e2ab702000,93435d3d55c403b4f2fcb8167e7ca04a38f9fc27e79ab095d91f2ca0dc4f6951143db3c08b1dace653bb2675d18e88a882f44d415c643806bb86cc34424e112501,946009e84bd45eb22a8481717758027f9e65456ad18553bd2681a09c3d2b8c4b401188fe828157ccee010eeec875a48f5544212b0862fd69dc1997844ae6855700 +610a95697dbbf5d135974247b44257f68fe11cab211fa913e2104e84b72f32d17bd8bd2239d6f643839a06cc285758989231c7b5da8b05be352cb0cb02d7488b7d068bd48a5afb1704f7c78b1ba74b4eea54ce3d5d5fb97b94e41f83966c256cc4f3e9cbef0262f251f5224bafe1a0e9c727598047eb2d6bd1cbe0762e238750cb256a3324a74384f8041969090dae44528e2c73c953de038e8a045c4eedf3d2296ef1a7da81cc71a964,f113c732764adfdc24cb875837d07d34149bd41a797aa584db45761e773b05c7,776be154e9749e1f09a07ae4a3ad0a9162cf1d40296a55c195fa4cfd44d897c721df07a0d50b59b91bdb9c98975d8f4050b05bf4e1a2dbd70494c6ad4c66687001,b55cb50044a7e947a22e573647883778f4a5f2c3861884f735dcf4561d584f281ab19446795a785f3a9d257c0ba5af99c3c86baa3cabbff7bd9e223bc798e46100,7b6ccc3bb08db86543dde0219a8689859278f494e619914d1ac5a2165ac76f51449861c853bdd9ca505878db5e8ed9c75bc2786e9ce786a42fd81aa1da2f1ab500,035fb2e29a8b164f6f59c0bcc55bea356ef1c9fde2fc9400593aa2cdd8dcd5a820b3d66b098ccf424a3a4b6189e2323b7642e2af9b20a1c22716f854249c33bf00,f8dec5877f168c5f44a1c288b7ad655ccde2f8ed5e40e37c144319e5085a803a10a4f6019ba9a03de18c4b346192dad880d21538267927aa510b06640027d64d00 +a71194ff0187f41537bbe14676252e06887af87071cacbc0db96abbf3da19c876325825819c2d1f71cdf5d27974896a58d5d8faf3f75be469ae4687293b3028ac2e601b647a50e946803272a790a5005cc4e2614a3d26bd7966959477c1c599c5a5f2d6c00f7bd8e7f939e6134141d259f5e6ad29f030f42492aeb8d9215bc828976a11f3cd1ac3f16650b3c2f55de415d7f4e94ed84cc233e33801b10acf697ff393590c51bb4b92060,e918cc6c85c100e26b28a99269f31b47315e6d489673024872380de52e709469,c89311c6a55e32060c37f9f834882e47321f66d5f426e380f236ef4669d9fcaa61531a2f5ecc408a244f8ea52e61f0c30b900b84559fc70ad4d6af641466006f00,9a32dd9e445431f02c02cea908e774884ec759117734c604d060a5af71ad9c216b0827402d71737782a9c98ef561530c1ed56ca241bb20c6126aeb3771befdbb01,2282c9083ac6a6de4536fa253905017a3489ce6f3511f9bf7d0d977d9ada2c1377b594c197a438dd674ea8e6210298a7332e362fb5b3536b059a9ceb2886874a00,bf5a8dfa2f207bc3f1b3fce352bfd1243c56dcda25d1dacd6282b7f202ddac2d71c7f32eba687d9a5c5426e7a3a2d5f7049efea5afe89b01c1c2ce58bb8c981000,69f467ce58ce3ef9bb756de674cfe720701c1722295399095e00aa1502fb18432e908279a6d9b999f80a77d6da50197403a563ede63e24101e0e898b4d97bd5400 +64e7bc81ccc10c7ca4826ac860b4f75554aafcf17ffe4b93b8be2d1a518b364c00da379a65454ee95bfd1b7c7431021d2d42103c92c87a8d7b7de799492bdd087346079779daa94c288ab5dd59dde983cd7d8259a8ea90e5380c76d0cdfb40aa592a2ded301e7cb176ba94d87a452ca6e3ac9f76d9affc1dd1e973e43d41af2303dbaa8673ca9303845c242dd80b3800c24e4bf71cf537bc7749c1b5cbd1ad03d3f0acb82d84b0710b26,8c9a2b96dbeb1e2cab7be5c4d3664696dbd92eea7bdb06e40542573df1d07b7b,48499c5b04e60843a33c44a59b9f0bccbd88bb4064fe7bb14583f3254602c6284974f54275fcfcf7a05fb9efd0f795882b89b667e0e6ee61a183b1b26eaffb3601,1f33a4dfd27cfc60c2ab1caff913d2948477a2a063312a420fd742c6dda01812257d40ae15ee8ee3ba6f5b3179b05a718c23f747e19a16cf9a0b0025b4151e7500,af0e40bf6459716136e59e5dfd305cb009e953eb09d1ff46ed0de1cfd4ddc3690a018596a77ece9dd96d4a7485ea8454becbf462ede3f23a2cb38b351c54c19300,2f870cd8df7c166d55e62a35aeb3f0b850d4673b39d57ae29fe5ea841819ae014a98866e275851741ab05bb1a5b0de0710a4633ad3bded4ec913d1ccb937439900,ceacb227a832970cd23f6d734882a1b776ed499e3d06041140f85ddf5669f50170f80fa4793a2eef00d156bef4eb08c7e0bda0704e2f00c1003539536eb996fd01 +3e83acf77c614ad1dfc0b6110c6b51e38a0a34b3071a5ef9b958a5a449a3894d7d91df7c92794439f3941a1e991d84d6b01d73b6fc54dce95b42936b27f19c6a98d1268f1a7e7505938d1814cefbc19776654ccb3780fd594d4b27704d9e2f6dd925b464642bfbaed4e75a792bb14cce6f8ee05b3338144c89ddcc29b1d7cb05adb4f2d2cccc98e422d7ac4e44643ec8220517155b5bf8ac47cb21e0b40fdacafdefe7227b6385a9bb92,022ce94bb97122deb23891ac32fc648ed729ed8431cf4ad688a211fe7db9d620,a1b9ab7d9b47bf5133b6d6639c4daf8cebb1de0ede4bba729ed4513e741eedd52c198fe4ed43d8bf8a7c7195d6454f1b302e75e3975ca85bb8015e7c9aacde9d00,f6ecb54a7cb0bbfea1fe0d3f7a0d23aff23a15e4d34f34bb2a28aa21b92e2fbd4e70645cc2ad62af40a1af11bb01718ad3312ea01cde115f9d9e560223fd2b9c00,8157be8fcb914a3a7d7971e9f2e704edce7aa01cf0f731252eef5881ff0cc92a0eb8c3102bb02ac556c189f796d0e0709727cab81f97dbce427d4bb2eb50dcc200,3e90f815e4a689dfc4e8e786c8d83808f1b3e68f391ef8dd4e245022fd425300128f25c46024d5695a1c78ee9e58185ea236a6b49a1a20a5c535d4246cf5a19401,0ff02ed5e8bd9f20d560560c891be3a04cf4198e6d262929eefc482039aded0013f3fcec38f8181412f601a58677da1cbbedd555777960f9cbeb1364adc465e500 +1986775eaf7651e792fff537c7c3a8fefdd9a17cc3b241781a211462792b388f3849e926ad8afbaaf86dd8af34655631afffc3f9b6be52ccce7c4d532154a6b0fdfee0e987e7dc6b1c6cb901df50452c7d1b4cd286f4d1e69bfc68a33d0ba77722a6cfe308e82c1ec13e497ad5866b8927bf664c58c61daf92daac444c4c4bf604b7254511403391ac66e2d96c3cb6d2cbf806e09db17dde33c03371d1ad75760d7a50dc2fac85ab9566,ddfd869618b70efff5898e47f51b71b4a51aa1d1be4da8e22419e51cdeb5124a,ca30614ea560f34ebf2e2397613ed90284429d6ed9186508fabf16c8a23f14a6278d7692db7a61ae8de27f2543cb22b4505eafac6de61b0eeb5f7e899220eb0900,26697c4f66590c98257ff3470a5689715a0ea26b71cb71c64c4537274c6fb3241ecb9eb84a3f47a506a30ef54fb61df1bdd311f446fd857a146013a299be657200,5584ce50b3874a5b44f5850d88ce636b379b7d99d861b8dc5cabde937f1c49065a1c2a7109fe1c494fc3b15ff6193bcfd4351014d0392c5bf48874a95847065701,dd1a3a96339d0ecd7f8090b32c6f31f42781f17d29755a46fa28a6cbdcfb510c26cfd9fe359e1588c66ce09412fedad80ade8fe26545a3db7909dc8df569290d01,a1bbcc865b77c01ec9014dbff455917902c522bb7362c3538de3798ed197e2e0112b5e9190ad834ca4292cc9a944462d61a1ff12ce21a90d4e7f5a5a050064ea01 +ee00b0b8efb2c2f1233f4db6ebb7b85053944b3d046d5197863ba576311d83fbc4d08e8025e415b46a41fd3ae3b8f56dd8befd7ecf194f799fecf5f92018d94f3298c010269d2b6b0387332353e4f09618ba82b3bd997fc61e44efbbbe84aedf42a4e21ffff6fe4d24816a9c59c51f7eee0e93ec22312680f9052e80c743ea03fd30bc9bcc71729d77ed40b6f7ae1c318cd7b5c219a5d2b270a139688d7522ea36a8b988f14983f21522,e10b6e7116aaf9ca6d8ac2c9e91dc370556dadfed2ca77161d89930a5a59e1a7,f71f94166395777e5ff1ed9ded17bc9e9774b89d3ee0f15d2ffd5de0f4810dae3f9e74df6466fdcbff5bea871a79d208aa20966a52f3f44e94dbb7c1d1dd2a3100,be7119755193e395ea68cea48bbc952dcc3fefd5bf1fc4e643ab195fce95fffc66f991b1faf934a56d76215eb201ce64d0bb861f245955f371f39204740e061501,f216c26e0272885c7aeebff77409eaf113c42fd985a8e0af4471b789a44091a644d0311819ffa2e66055e9dba6c46d26c1b277e81d3bbc385baa7d6ca50ea22500,e429e2ce74e91386bb52f63fe51807276af419c7604615ba4cb82518007257ac05dd787ee8eaf6ad07a8ee216302da9651f37c9eca3f6b6751a6b8ea503c4a8101,1de9051d11085f2399abcfa80a00e267c545a18ccd81bf9643c33fae9fd70db951573204e5bef050710b16a113fa83412d2fcbd6b87322868b02011dea705e7800 +520b5c1ff1d1c0ea08395ad63445ae40702490e282f5a24345da3b84e95aa82bc3e9a1992a500fc530be886481f31128d81734181a94a2a5544514914f6a5c4e9327b3e0d671d2fcdcfdcd46330d66c00e8b1eff5a6b68243492bb32390fae6b35d056bf937f0e0251415c8c372aa4feb2885bd8ec3d5c6e67ef3b38e9b5580313e9820e8e547089ff99600ff4502c22135b861f212b8bccd0d5837e4cf9e72cc7f4b20681bfb93ed375,3b3d8393ad06d4fa0ed4d3bfa2b36a48bd477a8eafbdc4bf9d5dcd35cd669cf4,b1e316b8d0f2e58df79d20aca14dea35ddad5991ec8aa2ccdf72b19cb038463240bf957e67e814eeb062b0954276c60ed90c3d4ebc749d001287d266f39febaa01,dfb09228a8d605e4bb67e6f1d3cdf69bd67389130ca2d124721aa0c1f486d1633e74eb2e484f97840c0ad00439e4725dff5168c15911d1efaf5433cf7b5325ce01,37bcb8226cc0657667cebbe1e50ef236315560492c7d42896a34cefc8532049d1bce16c6f6e066526ab4adad0c4956d4e66f963a82d64282e2c97a9e26b8ad7a00,94dbd4368e423f7555894422d43c275009f340da95ded8c112e9531a195a958172e246bd0fead2d4d2850b1ce8b061301153ee9b7e2b279deb2a4e04c4b693a000,40e2f95d3e01d8d6045eadb599330270d0ac0879360117b9b16b4d9be80cdcdd7e8567605e27302c12add48615bb7c441d639b345b415c1a54ab4c51588d9cfb00 +d57ea5c0b32e2895c6eda737105d05ffe36617723df5c348fc3d0e17f952975580e10198bc435eed0762a6821aa505354b715f7a5a8f9888c9356e22a0482131baacf1e8ef388896af3dcb2cbd92933b374549718182c5e67e8432e6436c18d6d7b1c3a91b2279f29bb18b649afad505e920b786a046230a0d5133744c33059367e01fa9d1a83ac4da7421ce24dfabf84d5221a64697df75bce3787487545075879dc048c5e16c343935,c94c4be89971588aa18b26d209fe5d65ea125efdc02fd789cda3391658ba8919,36ba1c23ecfd5ded50364c03b32acb77c956ce86795e447bd147b9c1fd03f8d136d81a1bd9ddf8904799feb04b820503d43c74808aac671b2d78fb6872144d9401,2bab3f4f28761898828f3bf79f89b8ce2aeb9febe99c9d33ecda02f8fe7a5a227f96552b51244dff4b333282b9f0588e84ce216e868a8480705153319e0f150901,278193a2e6be2b737a7e4348427c50065673cbde5078b5e4810bc4a9f31d3f981df4a32a753a313d6a047cf1b85f60aacf1ea3f025c5356e63af487f47b58d3301,5c8cef6699feb497ae52a0fa82ff49e1620768cc5da6998f3b72467e07a3c2430176612f6b2584206cf9e79f2da772b4a62cea3ba3259c0de1acef62cdb26faf00,eba4123cec83bdd0c198019f5770e35d41540f502065cfd64b898ff110aacbc7564afea74f7c1415135e001817206a0ea719116cfd2be9639fa1382da882e6d300 +901fd0795c9467e939f26ead3474f9076d2a6c4e08f85861e2c2446280b6b3e6e288bff78a5d536ff5656a0eb07c6e15358e2a29df49be1ad2470644232c09dd2f6a45a1ce326be7f8899ef5c43dab65d31d534a0c8d4499733f0f2535b27887424d2fb064aba39e7c34f66a4eabdd4636be08f5055ffe563f3a0ef08776d52534e60f7826f75e733e1cf6c6824be35581c63def5140db99e7629725432b9dd2f8cf8c99b61c7600cef8,e873bb33f15cc7979acfc73849bd14d4974e0cee35f0271d1b6d57361a2606dc,12f9e2fcdfb7b2dbb4d0ba990748e471d21c78e0f32431c1f0481d70cf51e83d40bd6e3b73184a7956345865aa6f042a6e9aa58ff353aa23eba902cea0c48e3300,2272f92ccf84023d24782ba77511a5ab5d26e0c9b1a3c6a29d5980ac409982814ccbb47549acfdb1e1f20b25fcfbc97b8be70ea8fdb94b206b72723e25f9b9e301,18cc01fd2f685b5abebfbf68a73146032d67d3fc9b1c377fce9c57835a84cf545af9964355ce7bb007080702208a47f1cb21608e6b5c61a663ebc01ae7f9e8c200,6c46192ebc626df1651f0558b7b17390195a7dd43668c7c9edd21e4d4d5fa5fa682eb49a5dcf024c126f6b5facc44ffa9811316d90a17bc579b5dfea928084f500,54a5ff2efe07de96ccab24cd532d61e70e612938c58e38bc0cae1c97a8d433895de6a34b4f5daec12b74cfb19c7269186d7b90ddb1bc681e5cb44e48ca56810301 +e52a23c7f5395af9810ffa4baeebb898d3b878d922b18e53d32bd0e6088f54b132d0d53ac4ef13d20c43b2f794ca27814307eacefaab7bfcfe23a3f7162450a37b3f5c02a4eb19b61a9b148fe9f3d615ba35bf3d720d9725fd4b5981bbcdb2b503c4d863b825011654b68ac6ba65d88539f6e7ef780e40da40c6210465a235a56e73c59ce1c58b44a15a368e14f17f4528bb3e689ca7d47a288707f52573412ad732f7095f2af5a5cfdc,dd9add8f4e1c53f5a2a52366d42c1884f1d2751f07e6962ee19ca4879c0477c5,2df6b3f0fb2d9691c64a737202f37d70d50471f010a9b36afc36aa99bc74d1242a4fe50684fd018947178c1a08cd6bff65b51db1927df322f26988cfa4148a0100,3e204ec81531d47a232f0dd2a5ddc93db987fef8d4c4db91a46c97bf4d5ee3002baab2e8898f3204c84a64e2d6ccbcf298008f7bf370a6b230ab53a29b74060601,a13bf3713ae3c761367b194f2bead3304cb06d7e490303496416e3978b64a6e770cc8a37fff7279e8e91c0178683ec3202947e9328d7a05cb43ab135563be6de01,42be884adf800be9cf428ae6ae54a484abbb613fce3e3e5cdfa97b6975216d8654fe00a1e3a892b6648b3e0136b1b94a9105fa9465d2884b97bb741ec3646f8100,f9f493ddb829e25acb7bd3ef6b70f55de67504cc1bfc062cecac7faf776d5dfd16d923dba7855d56b657f18c099087f93b7f934b022a5cc1fe3927e446391fbc01 +fa1e03e2a22a74b98cf44278cddd7a26a5984e752354664b50ad5bc6cc4e1aec7de97478cdb6329739eb44c894200fa6fa5253ac937a499cd5e1d5192ebd2e1954f551bf526c211205b503c8bc7f03d6bc57ff73cbf831f82d548b5693d2bc9470aee000a04f4f2ea15e57ea34b55554b3ae704f316cf94d883e1911fe28c01d1d7787449091cbcb7eb0d0994f419ca73eba627a055c9a15d17adf672a4af642c2948a11b76a4b3502b198,82f558bd452992584c75182af29abc170277c44eed3cfd3e66691d7da91bb6ff,55d8fb7c300ef2f762f267108afcc77602baa00d68ab41c63f13475e2f6cd32906c143285aa84f32d1438a0119f280e83e37f24f47e9aaadcf7e60f975a6d66601,2ced94ed3373da5588504811181e59e5f13fe09774b17d2a10c0b6a5900d13680d1efff24bc447507fe082966eb80f188fe12a440cc8bcea9f069c67792992f301,a4916438bcf1c9ad270299a8b09f9fcf1282a72064c6f730f2a2fe0635d2abcd542c4fa341a9127830c6e40af1f422aa8a7efeb3a75644ed3e37e8d6598f897001,e25ca0311316cd87ab96a0d50abe940fcd4719e8593fedb6b4256a0c87199d63505be067c8c622ca8471fcd17bcc42524b34324292979f17e709ed7f49b91d3400,2923f7be391191d0d349e8990bef4ee0d829d951d0daed06973983855c73366f25b3a5ba266ea39ace0342fdce931ec6fe4ff4d09faf726e786413b333168f2400 +a381c38b8a7916f770381da6bad847e26d62d67ef8e2794a910309675a96646b54a355b60af85b77293490f13461510a3b62ce0d03acc09052d698ed416661728a4a2046007b5fa83f8ad805a0b9fee6a2b4b8d560b528f695ffaf7522839324900f9dab390ab62b7fd2aae760a2ab37d7eab16f7cfd41d401c8f4faf96739a401c607575e64c245498aedc3030f3859c6ea4dbe04cf0e22a3a5a8bee37ae9eadb668c533dcbd42f5322ab,08b09b217c07b08330af1aca387259056f6ef1814900fa81a5e048f360da83c7,847ae79d3cd31962b408b97dfbe5ae6d8e2c004822b2d2123e21e1aa630683a27c415db897496f106d4bcf9d51d6b2f6f273a13b7fdb7b759a54a2b6e3b8f34000,555ef11c0933e70b425a37bd6160e6d1095b5ff86f7087015a34fbcacdb67a77231ce35261cc6abe557bd54568790d8a926affb60cc6396b3881354cbefc57a101,a73ebddda50e1dc8d6150a94c5c2a217f0643ce176a7fd2697d082431d512b8373c80859abf66a1d2d2d8965692b03a53f4b9a6c2f3c319312025711e3dac24f01,9090d2f9c1b724b873d677327d16d595878e9c9268eecdf34ad7ad17a4f7bdfd7aaebfc121d440af8c5e05a385d0c114c28239ea7afc7a26d0fb6f3f16ca79b901,132fe3969ee751b5f2ebeffac69c7687e0077cab84b0d20ba2254fdb1da7272d09dcc4f20b5035bf92f495369a733c55e3dadcf90156b43673c687c0c38190c701 +70091c4915be8135e54384f325b74aab187bd9893215b9d4a6bc2d9572fbf215a8d8c22399c1dd9259b29c6265bd50774b4b0a23058cbdbeb1c3fca5585d3e95743066737f06e7268f8513afe767a3e668e4955155e4a31119fbab4c33f660f87772c334b1a56bd7faa8ff962a5a729a0aef1c11a56fc65962eb4e685fbb525e423e37c1ebd995a914ab25e038ce184f606c222bb42d2817d419f1ff764242ab7eb8331830984371a08aa8,2b49e13adf027eae77b86d725a7723790cc678590fe191d640a42f51adc43457,379a48ee69609afaf363aa3d837c6703c4532ffcb97252a4290905cb92179ad962b76f00ee5da0706d3addf89a8cf6cb592e175669e9a330a6edd0ae45e295b701,5de942d7d47b87aa2276fc5ed15b2b69db96c2b572ed9854a06ea423b64786ad31419604236b959255a9ac2b3babe221b24ab0c1a7b440d1bcde969c5d5d338901,7f234f30affc092ecac81102da02e200140948d4f33a98f49f6b7941ea175d6e7c1ac0551a3748180df5c0c221cc3af3bd078f869761388e75bd906381720dae01,b345a2d879a58e84b78cc40870ac550ac6da6fc674dc530a90ca51ee136d67ad086b022bfa9e9623d2b9f2555fb56ca4b131c91fc1e3df3d5dc3d3dc0846ec0101,1a332e80b1dd093c4464b8067d823d3643799a9537403ae732bb213ca7d5b8c03e89d46fa048ae1385a7e104f3c05293f66d45b2dd61837381d6783b7ecf210601 +aea5f2ac180a6b995c47bdd3e678ec3b1a5a55899a5708a6b6968366ca2bd44b7153b2cd4a0e31f0c77acdd929d85a50b17e2b97c756edef130ed0367b32d12676e15ab7a5f52c8277a2f182370e7755afaf4d0455e834ca58690100c1267bee8cad2d0ffd6511a033764728b4cde018c39f3af46a2ba094c1a9eaac379478be3aeae3c5e3a28b5eca869ec1c2d2f556ddbf5a98ad85bf81a1e33f7474a608572bd154c02e0cc3517f762f,783ff5cd8e062b5ad00555db19f21938f3a90c0272d5745ec188f7c577066ada,4fb49ce6bffbfddcd9a11843fea7db29100e6f567e59d1db3fd1cda565d8297d79af5cc7fd7f879b85470ec3a00513e7bb6cfbd3681d70665a0fc7fdb1fbc7af01,93c0d51240f878e01ad1ec815b570ee74195a3fa006b0f1887452ec2a3d4bfd87ee64a8c53580387bcef87710a116a0a5460027a1aeac9420ec683041f55ba8201,d69e10b75743d11f9c39b065387c15f1ee88fd186583fd1f69dc9584ea29f650081e603bf0866bd492ba36b00482cbd254b69853c59981bc95493ba5a72442a700,cfe146fef617ddf7fcc9e24b2cb1621d42b7fff43265cdc8b6789357730bf1273407ba1cdde89a049b09721ec2e83fcf7e726c22354b9296878993eb82d9c7ad01,af1f4d7e33856c1967be33752de13c756dc4d2f1981fb3ab4a46494c6301565d4ad065f60c1118cf0954c6d414082a1b21da1dea7e6d4a5280c02945542ddf0401 +3764e27f13d3c67b26e139a37d1ac061ee326f11147f848e5670ef742a22ccae27609cf300e2bcfb19b4a8dd8cf6cb3c4ecdf2fb2c5759b681b5d6b6af55e5a4e4fe918a5027baf2564ad4e7bf66d8ebf67434ded684bd5fc9a65b3b10e4cb4f5be5dd0043f5f4e03daaf5ddb8ab62e2be83233626f82c4f56dd58aaf4ce2a293c40d9870b967f65451cf0ee398cbfa35cd56dab6b4007669762da746927a4a730c9f00a29bcde4547d7ce,d1015f1c45936e43e5e2258a21631accb01c2089bb533a498ddcdc855da11f27,dca658f34f80603b51b62295736fea65f3bb89b0a9c60fc12ee111cd0c55bb61318c7d134ed2edea2f2bebdb55c8fd9b013b3da836089f1173e1d930fe63128301,d18ee80af658f7d2ad0d00b6e343d71b1ed5d5b245ad2a3ab46fe36a7d8bb5c7240ef56b0ffdc8bac308186e9ba155501434505060f411eec0ce376af1484fac00,7caf6be7c255b7ab9eb88418cb3785a55bb682689c71d94a8247742d49c49e585dba7f5b0c1f2d7c54aa3fbcb6d20e5c7728d57f89dec5fb66c5c8b83bcf008c01,85dbbf956807c9dba4a697fd592d9721077b2c6738116a29c3d3437cbaa0fc595d45750bf83bab4620c540f122baa144150e90b4423b1dc382f2f8d8e3ff1ca901,59612b2a7b08152896a754fa5796b09a963a1d8340b6587104d15ccfd52b591d585b38344e3715cce412046043c8157cb8d2a5b18d512ca1e6952ed0ffad83e901 +d9747e2f48b690b951607bb1cbb1c7916c92765c8ad28125a81e8262aacd05b8cd021b221abd7b208ad4e006be2f9309904d8dfdcefb55a67574bfe083807d504df011d443786968e575cd8284e120b0263ae64254a65f7cefe0072109e37182173ff469085c35c1febf452296504c07d398beab3ee9c7909702ad88dd83a074eb4da9a6c99ee2c1affea1d4fd4a6941b498a989de45aa068822b763209321bdd01e385ed6f1d96295b983,0bc3bf77787e9ea659e3a6e95c22546d557c1ef4d66ff728d9284c08bff7cbd6,b9bbda335ed8352b3a6cc14a3696839602c72321ed3e676bfd0c7a5767d950227af23a00e84f4b5adb1e132e1ba94e6de13b7b314e33010ee5736edf1a2d894600,6a4d2267c0550cddb53f5f26a6f1318bc1fecfe8dd719806b7d9e309fbaf30512192e83e43d41989cc12b138701db17d591bcd8939a9973c1f883047d8f85c2f01,39df968cd5ea24c51a2778af3cde4baa8fae4d1540a0d2ed755bb15b334399de734d123bff6d5f9412f3319b8cc714ede126da72e72d41393cd0ed4530ad7e1900,207304a642eeaf33d073c24e914020061ab57a9c25edfb0a969291aeb53a81312df832177272630fc918162385c5414f056ebf8468f6aa109726b826c996340200,8d4948c14b73bac699278cd7e8be2f5c2a691914ef75127673710e0587fbfcee5434ef7f26b5276a0709dbe81e6515df3c67d08bf5f93149ca54a3dc9c2241f800 +8674cfff42b83ee1c9fcc6910c03eb112c6e46c8daa006aa585950935c6644cfbc9e8cd15c31ecffdc6bdba941e6cc63c78adac97be1bf631caf4e70d9c99f5080cec8145115949640be733300751f815563c318d802e2bf29f42b64389c53ba656f543cb9b3f599bc0c02354588f4711d5f05927a72036f04319318a234e59af0a03a06788d50f623ea575cbe986b080dbdf536e17ab2ba9411001077aa476318086df7a06c326805d5ef,043f1869f20085f6e8822b4d6288a724a9b1b25fa4f5b9cc20227b154c87f381,7cd1a10927692c182c1f0275e3bda53c9ec452f19eeeb304303d768e1338ea4565044dabe9c8eb28396d25d04ad66fceab3074c8a8e927a61840b950351d262701,b003cf9334af0f6021e1e5f60d70ab75514f4a4c4c2060f3b4148844cf94f91c049f4155de22b49620625c4f8744f1e13daffe470836d177ede52940af213b9f00,e9b4b9d403a4352d75f424f75a9c429776ba1d7245624ab07e3d70ec72088f3e62bc96c4dbe902caca4e88b61f7ec606f2f2ef6194d7448e34541766fd2c8d3d00,1663debdf32855e9bab7eb176473d94a7bb15c1933b6cba1ad6342574511c846572471e58af4ecb9e867b63cb88dd76a9030523799729f12de2e0beac3b74abe00,6fe1be73963c85ffa9f7eb6fcdf08d0bdb104878ed81edf4daa77bb3236341444c00cf00d7972cb5139eefd0672561ad54ffaa5aebce3f392fb1fe9924ecd96001 +c91a6f7424594365087c3f356a9d6c1f03008bba58a3d1ac852784c3e77f4b6c3c60244188ddf85005dcbf15138f1505f0dc41f3de1d86a37361022ea6191bcfdbbc0dc672408223b85e2a3ee349116e85d0325bf0f2e15072d7f37bc1033e51579fba32a31d2b7aa6670efaa92872dcaafc792f621996884adc2c74a605b08c79edb3ff84dc89e5c816ad388d84d9bab8b1ab3addaf749002b29558eb79c718498014758f125bcdb4068f,67d88a85dd0d175945a01f82d21d058eedde6f47325f3a32f16f9e2cfc66c5fc,e7c0395a35468f42afa1370e99364f912bcf16706f28cb84a2675c7714295e2b562014ab2d17fdea04a9b5dfb2492d84555688e32c643b49e689599131b6f80b00,390cfcc53d0e4be0b864c109390ff335e605b88144cffbe831e2322c60cbcb59628ada218d65c98c3e7294dddf73fbbef61c2f1ddacecf5a01a1dfef1f5a5c1f01,e328c18b985c9b89e9c91a13740d5c6816f61def7b1a69972b6e35e16db9251c5bf3f494d7977a7b320d04920c9f6b17c068203355e96bccc531c5a8a01bcb8201,c2a08a8a0331f0780f9db9312a418988c45fcbf38baf711b1e3f7cfb21e371812e7fe1c3c60214e454bfc8bb695e9783172a4e7e5464a166149bcaf61dc781c001,064368b8fd4e783f1226bc6bc6dff1e9cf72e76f7eaac764a66e0325b74f39b601c3eb3dc1384f06b531548044b61d479c45bdbc3b1718ae886f13d76c8d1e5f01 +fb96fbfd011e464ddfd084de52e5e8c126f7e4d77ad73146a26ca2476e70bd3157f9f5584ff1f0fa51cb37b3b3d89e21e678e163dedf7f67ad6bdadc9d9afd51f34cc56838999814730d14afef9f6f8febc73a13d47c4c022de03de5bb3c40cdc1b4214191e85d13fb6e075b5284f79e68b33824e005d483ea07ce582252fcb66c990f04aab3d01c9ee6db530591ab7b958a1e0ec18e87e36fd3d0e35e5f8dff2668bd474bb82a4cd69e34,eaa2344ad10cb772c1189bd5b0d41224c79c3ab07e42a1170901555a4a4dff9f,f93e1fffa29ff298f437b0577e0b95c83c433e3adb0791b9f31b81e7e2ac19656b0015aceeea4ec1ab6a6154ae97fe6fa0b5bda5f3bd3156f091299126e23a7a00,9d7ea1db9f2f097c56384b9f36cde0be6633b88ab4418b6816a24b997bb0c1871cb189ba6eb5cd0d761b06ef96b735365fd80fd17dcb50cee8db1a6647d61e0101,cd0c5d6a00150243efcfec3fa4988127a73192eb2964deb714d68011a93d49bc7cd117a32687a761f067427dc2de691cde7dc88d6b785a8f98d5d1c4e214da8401,1af9532098361e5193fe4e780b8b4f6fc09c5449130a1ebf12d8693a815578f001de2eae5f09f1d4eeed7a093116487c3e5618fe8daf1768678263ebac3078c500,fb28a037ce2f7992a7085c17876aa497a8cd29ff63b47a2dc75caa09989880e771ed2607ee86d7f39feaffba5c8c107149f263d4d8e83e4983d7285835874be700 +4492dedf0ac4880886895818ca13dd4398f312635e264caf6e9ce65b0aef28a861b1dd35037cc7ac36332c6ed4c20523d16243595cbda3ec24646cdaf4864a5bd8bf30410a56c5a45a48fe9b8db6056dda1d7ad04bb0c66162995d2dd8056003ec847f72e881c747365ce781e8484ac3f2b39d67ebbda8d4149e2ccbf07a89a4eaf02a38da4e31427ef4420165f447d676eaacb2271b5bfc798be029af204896020a96c5fff5f78a49a1a1,825b873118413691d1840511716346cdbbaf637f0ce1206216823376b711f179,cc91d8791969bbfdf7de705ebda2cd7899eaa40136c32f2fa690e6bca5f40d290c87f618c792215a1fa0478d86630479fab7236e714af3bccc57d41d779567c301,10db3da68ba3190e01172eb70f90b6137eba11ffa0aa0271f1baae547c2374c31459d6c3f549669587f109267c406a600f2ace3c0f8a4793770c26d58863e1fd01,f9daafbb271b3f2a81c0cd3e792a56484446c97e5df8771d617547a14f7a45561814f42fa5b05671207d928462cf53e768b79b4b93bb4167df1bfa20c53f7e7f00,e8c5e7d996a85def7b0f7b436459ac1bece5420bc2891b1a5c1909c4ef1a6c991ee9f83e16e3ef1366603217e8abf3fa070d88257b5eaf3703e0ac11174ad73800,8d4c4b45c1d025d8761d4a46451efbb850921c6ee2a2d36b8501f8e0feeeb29b1f0a960c5d6eb8bd045640be3f05722d317c6fe379111a13a6eb47c9a0ae872901 +24d460b22d92a3d239ce74a767872220e65607db39315df200315322b55872c6f05d52fa739252266d6b88dfc438e39e3068aeb19af1ab9f6cd129491f46781c891052f2cafc3d4661828b57bc5a0871dafdedf4b1ff669594582067ed59d2d297a54f3675a35d2b67b3c20a3d7ba4cd849c77d14d6cccf20ab8644d658018a46930890bb9ca16e1a400e03cebdc2be269fc0622f336ca88604e4c1634cb1020ed6074d3febeb5d8bc63f4e5,2432cc8789f4bbbbf3179887454ebf21d639fab2ae7470c5106c7dfc57a58d70,46b581882d31d058805c880350cabee70beab9345954aa3dcb177e746a907b120b6912850e65c97efac3b7334bb49747ec79d6a1bc404cd3a6acd65b0baca24f00,080cff86e4a7cf883678ad4bc43ca10d03faa497c08951603686571c90e43ab95e636fcfe8d99ad08b98585ff1542623f3a78946ea4cb0d4b75f0422dddf78b401,dd7bbaab749069ee043c3e20a9e8b2f446176aecae35c613f11301459f88d2643094e9204319c9ac0ddb29d043267e04f5a8849d07fc3974fd751ae68ba00ac200,5e112fe499af1911fb182c8e2c7f025688665498bc6a7da9f6ed3e9dcc93d88771b2156715eef2c4d8dcbc52872701ee397b44ca6315a1f8796e0c47c425119b01,07356b2d124488a44d34572bcbbb2f4e78f2609acf24afdc411e933bfdd25da703ad5f075f9da2fac305e8acccf9ed2df65aa62646fdfdebfd427defe7b9538801 +8440811d0d29d9e40384d976b986b376a63187d92e214a8865da3159f2c94aaa9859f57f76c6a5f64e0d403377a0a62ccd4e4239580bd584b30def3883baeeee6e89ce71021e89509e87e27893af905e0c6ab7541dbdd955cb5d4356c17e28cd87cdf0e6bb7cd2195ffb17722690b46c095973fd7513729991b010cfbdd8678ea6cd2e2cae21a28a21919b3ecf39fd77602fee3f0b923e524cfb9498085a2d1f229a54a6f981214e5055a66a,a7ed204e250d0a30ebe73bc4546468d3652786eb8e542bf8e17a4b499612ea6b,65c30d6f00b4378c05c1430e8c897309aa5629703b40dc607cdff88ead4c50ff1c7c3919b9686ae7889fa7f8bc7d32746ecf3ed1fb72e1e66d0ef9156bfd697700,b64191f05e30c5536256664c69030b7bc6473b7ad08a0972a6f7e53cda9832955828b5b30518786a81e444cb65024c8cd5e61dfcd889b625737dc0f3503f38c300,f0cacab382cf8477a98d39529179a5b77ebe4d7b09fad3598759ad271d91c3b1506cdf82567f6e88c1f7cdd5b93b3aae33edfa0c8525438fa68df676974e791601,2aa186147aff02ee4493ed4da50efb99f8078c3b1982c120d2fd44ff1b82e65e23f68b4492b5115a78fcc115228992e028ade49feaf2f1e0f4b1f6b2f9f2631d01,a7c452de0c12e8e463e1dd64388c6d06ce521055193ac5e517536dbc8111776905169a5f4922bdfe8c2063dc11c35c41c3c5f47f8822ee3e44cfc40a42fa146401 +e8369187236713da442389b7d2faef1257f9995fec680379c9b573cccc7b64abef4dcf4060c0d3212c2554111daf199ea6f90e014f9f3d54d8ef5203fa155f3bf0d02f2cc9469cfd365d1543de89eb1cb71d6e23fda6f5b5d9fd69ea91962d2b30e900a4a2121cb4fbf1574522ab0bf92422db93357006904b988e9ea44df46652b55327df553b2ca817f0c1728bf9383007a85e2b6afb8b9f65059a154bc7ccd0719e3a50811975a24fa192,629cfac46a6bd6ac1875b6fa30dde2199f29f5e2fa4b4a3619890d82c7fbb3a0,7c7f14f422994c566bb5921d7ffb539cae42fb75af237f8ab9b0ed85e5ae517a1eb920528cbadc0c58d99fc4143f182327a0d0f47d4dd94583cd600e647f9e5f00,430f58f7a70c96e76ae184a4b2eae8a6d52d6f1a51b1e7c9fef1d71efb598ba16d746f9cdf4616834607fbdb85fb227ac2a3602094346be8e603f65ffd3d772f00,a4c4282d5135f8eb9c7c2e4a1bc2d2921562689148cf4c81ee41797bd57cc3ad2e247443cc765559830b00a49cc7c3da52402ca61caaeca7fe43fb11ab88e6a500,c299aed3990904e28f07e400794409c24ce388665c586eca163eba47e647e72c5b80f1c6947b18c174abfd9c25510df4aee21f78782b9170899e46f93dfeaca401,355ff3b9b65b9684808088a09fc94e0f033d6d78a35be697614d0e93c7669519146c042fa446ee444d955fc033fd0b24fa36af947495d5036b8d2fc3cd30ce2f01 +2abd823a971c91263bd48a952ed6f3a774205df7c2d1f0dc4bb11423dd1ac6464c25f3dd659fc478b6416d9e2d973261840315c5a0968833acb65fe7848f30a28368958fd76aac048c4dfa301f203e2aa5e6a6f8bbc89208d430e2527f0b1877136da1ab38a1af8f67ba3b4939ad0779794f6e459bc844b91d67cf38e27a7d2ea35f0113a52694db70af3b78d2295d80ada7eac75818c2e05ae8819a0e1da47a2ced52445bbf4ceb57ea8920,6437b22cf2c446832590645c6a3b0790984586e43d001a9f237dfdd4bd022ee1,2030bfe57577a86e46a32b3162fe8a22c56b72d17c02c332078a604496b5090b25eebc13ec8888cca7b2f00980c0674ec6cd1a50b0887afbc615a09c79a24da900,614297820e5a7a0d969bad940d457751d2f764a20a927bad2082ec85db795e3c5788911774b9d2e0c8978b989affc1541e78e9b957c1c399f5c1c3194a804ac700,b8a8bfbc64eaf768f7062aee60f28376d20b52070b0857cb32b961ab66bfe73025877b88fbbbf63e3360c480e52b1a86fe6408e2371e20ca0a41be2bc3a21fb601,fa3f54d548806f5ba50b613d6113fe3e29f6500007d4587320fa40a1c91256c6632f39b32eccba781eda4cd0da18cda83efcd51bef0ef4de4068f77157d6446b01,94396fa2a5225ffceb91d135a72f3215119bf77e56d24b724c5ee17b06bd486a704fc8dbf7ca966595859fe0300fe1ddfac9e98460514ea4340e140814e5c49501 +e5445016b421d74888fdd99274e4b22de996d9db9f7821676ef83a9310322f3122d4dcaea27382668e733818af835735887f58f51d8638beca010619fcf6938326d85d4418311b9e391a736b7417a763cbf1a201025409d856e72b671947741392b3a30881de8d6ff586e58c4d8702bac1fd2a8bcfb7c046432a385312cda3cd3f1f181bbd62af2ef8d83cac1c116fbec55d34412faa0cf04cbb3784c132b4a4f4e85923e11452d87c0a7719,e1947081c8a14828b03359c155c64536419d7fcf317c77c34e46beae2977b988,29654b1a9cbd1312a3427b6ab4a8cdf5ee3fc0e49e47d0323b7eabf75ee8cdcb1a6f3163466ecb4dbd556b1141602145582a1d2dae6b241b5500627790b00e7301,c61aaccc1b428b63533bafec2b47f86b2220cf643fd026bb377b5fded360b6151279b726842918171c4630520131f05b15ed0eff7f071e58b85c79177cce746300,f16b69ff4478ff7f2c228f8c617de8cc3cf95131f78b73fc385710fa3bd9d05656a172f8a639202cf688e75e3949d9cdfad2eb483d3db353c24492a7fc8d16fd01,0db4655fb836b8f8ac9fb96e5266fcd5702052a27a9842d79a92ecb8b5715a7c37fd8d4afd12f5e87c919e72ad85c081d9de7a61f2630486495000c718255dc800,8f80fe06f1686fe1c850d4ad0a9ea6c0833ecfc263868f44b6e94aa7fefbbb9162f6392e7f1d06165d903358a8d23a96b80a11ae7e228be2bce9576b8d647ec801 +0b17333f84c0407a915bb4cdac5ed7a9362ebe5bd3d753922956326195fd0e0b2ac367d68f7c5c46be39282552bb774ada4a24a8606c6402d4257dca03fd6259040a780d28b8aa030219f609cd7afc866585a09725c345af06795ed74a0808a0a435236821c16f30f8c11e5b6578ee25a7f1a65a604351ffbb4c57e820524a225458b0d5ad88dad9258a21d6b47cd581b27be43fb7cdfcf379a0de86a95bac7f3b8bb2148613a7ec1c1c224c,800bcef21fbce31ec2943bdf855b7bee01ce94fa8169c2d92fec7cba881d17ef,8e9698c51d385d7af7d2917ac4f54a883ad1b2e5f7770e020f7c909de627cf78013969cba978d3fe257f4ad36b85c0b79bda672c8512536525d22d3a27bdd2f800,2677d9b88a14d8cd2e8e5b02c08342f252f3c4822a2c9964b9d63ca0d8bffc4408db04611dda42503be1d8cc54a4d132980ce947b69e4c633259021e46bc640800,a56c9d47e2e8d271e3d013735d626773c5e5cf89c8b1b1b748e7fe3b7d31f9a93937dc1b75fd4bfcc4e84928d3c8b719d42c7d8f089d16b69f4741c84153159c01,f9ce290fc726b3499d165f8da3db1d49200457df89bf2e6fc90aee54976441956b3e92cb190f873abad3cdb4a7b81a656e4f4788c8c5cecaa3d5eb2cef184f3301,c1ba3d80a6c057e4b5e6fe13e5d00db7716339f538a2cc696898790b1929c11d4ef4d059522a62bf9f86d89d33599e94f5e3d95209bb358b132a634527c2e79a01 +1ce1cd1d5187f2468d3f49f0168e6709a47591874ab9014ec4a1f93e71eef973c6e100d74f9fe75aebe7eb8e8f4b16af774895871931ba43f03b718cdd7d50a0fc6b0673496dca40a6d7c9bed0e3c04574b969479e0e7c70edf4a69d4dfb39618118e27b810f30999ed42d200134c96e03798b26daa83068dcbf9f663b8aa918ffac86e2a3aac294feaab99d5be06a324dbefa9bb4ab78d5c3619f882a69c90106a32fbc7e07451f9306d1dc,e7b4e1a651253f631deefe2eb459a87a65b1fd889252b664e76c46c00eab5185,701d36826f67dfc45c8f906bcf7ee325688c5d777161ac2c5434c93bc3eec7a64a150aff44544afed3560cc1692591edf72ef684fb69921c107222b9182532f200,273ea9fbed4d88d4ad42061813e44526516db1fd1f67f34476a5c5c18021fe7a78148f3dda0e580b532cbc51ba8a2c63b4655a97d4ef58bba87526b3be098e4901,e3519232ba5983b592d8a4707f3977af36c16c1bacc503111059495cbcb41f8e3264c7ae34d49dfd5a6e8572469b2cb7cd0c68caa4fcb7e1670014f0d9f5a50700,81926a50afec941779690793f63d7544946cdaa1b04e76a85993b4845d96d08f4265fcd9246833efb83e76fd8b7f81243b344f81b56635b65d1bf3d2514d07e101,4bf7a16dade1347531e10c09b3e2e859b0758cbf70cae6223838f778251a03012ed746a5ec8439688050ca7b8e2407a3b1a2d580002f0f63d3e91cebab30a67101 +8b622af991a867b40f1f220e8d25a1addb84c02e84955edaa32fa00c54f1e42f7a1cf2993980bdbcb259e20e346f84d7657b821904a67a0cfa7735c361d378ccee5b74217e1edf4b7872d1ae5496f7fae10bc99b8618192e52113db51647ccf4392198c2ce18579a80d7dbaa1570eb4b08df590a75d3694c0a1914416742917e4cab9603e2d2f18c6821040168ad515856a48da557f05ad5e21c2e5bb961ae780c57816e9af29ee32ed5f8b3,e0b72dc276ecdf711c817e4e744a16f29c61027f2a12352846e8e9becb2f278b,7d8a02a1e0682c4da938243d73cc34af2cf9f196f699a36c4bcacb53f63c55bc4de73dc7875b2c3b4a0230bd8c8e65caafaf166117e172a3b7cdec92c387c79c00,0b95b3dd21024dbefb2022470fd340c809892c23f6c27d4007b47241666213fb119acc0d0078c795c2756286a343b8709da4dfaa233f39d4ff274231b6375c3b01,25ba7f14f531fcf1735bb43d9fc31b037b4c4d3095069bd4d773b518b73def9e24961eb2cf9a745bb5328a08a1d2dfde0191ef6aa23e53be37cfa1af0772bc4001,228a403fb690d92538ca052784714e0fe820971613be6698ab0cc47f2ef9df145c83e198c2e75a3e48933f1b6a9791b1224357e41934bbf5ba106bcd6e8a3a2d01,0bde393bb09b3511a2a1356132c85226bdd83465707c6575757b7e8525b6fa536bd410e7ecff32a4a65fc2da4f2234ec3d49803f4902f67c5d2106771dbefd8f01 +89d1855aaeb1d618c3230bbef30162c9067e8a128a19ba821347e6c9954abc5c6464e3377f216bc481c8546f82ac9bab99403746c63e449b99066ad036c594895021cad04db5ae08f498730da3d71df96ac45ac7a45e136b1d465e1ad593a50972d8c35778a7df4ca62edd3a07fcfc48346ab6c182d369d9f3a5e2d92863ee279c641dbbdc5df741de24dadbca11901fd5a9218329b3e7b750517d480985353636eb4c89628ad642c9cfbf40,bf074472db361e3f273d725173d3a9368ac99dda1a6a5977ef1820516fe55855,151a9a48d936df71d5eac69e3a39e2b4e2b3f33af25401f69333e1b181cd62c404be0709dcf520b3088eab3912aaca7b4622a3bdddc3119f75540f66e553170c00,d07f94cbc89113ace308c025153d30fa5686a3810e1afa737d88844599576d5d22e6c1f62bb8b9fde78494faab3eeb467067a67f5fb76341789ae62d16e23be601,2777dcb43dc015817c0c53bcb9cd1d02704b65ac59d25a42f5b80c6fa5903cbc1f2f8f049b912f023fd854b8be7ced94a138e49d25cd5d537be4210ce7abdf2200,44d0f07779739da177158f4ccdb8e2cb675070ccf3f08227da219ae8740181b961c334e1da67e5b63c360a1ec71daa70798c75ec8ba41201286826437051214800,cd41121e2537c68d5e9e22060d5b62d7315865d672dbd00332c85b30bbc494e275614a29382d557d8198aed65bfd61d9b13086c5d65ddfc18a024c21aaea50b901 +fae26f7f19d239f9bc205e9ac96952c09518421391dcff851642187fc2b3703a94bd0e38fa997fbcb7675bb204fee3cc116cf741545eda48b1fe72a95116148c372f3d38092d2a96d6ded121d2f0332bdab45cf47b23de88c9ca6a2e87e511692dd2cbe422a9f67f251cf92deae4c74038a90d330a296832e646d61024cdffddb305b3bc35c5d8f256f3b000d4de6589b5c98b5826a2e0c577447ca64d9194ef31883d3ba91a7ff1d1daaec0,13f91138898516709186fce2e647186b727ef45afe617852bc5f70fce96b871e,d217332565d43fe13287f436bf618cd99d65cbd143819b0d9388470365002a293559565450c568c0a9b73a3eff353828fcd6b0a53146402031b9faed0f4540de00,09914adad56d0dd5fddc203bd503a968509fc96dc375955320c425c61f025e7b389a18597962693c4a6b0adf2a77267d8baded56ccf226349643f0c4b22d4fa801,45f17edb13af678716619b00d4642c900930d7bda65b557c1a5f1e489cf1bbf04bf97f588c3c38e56c80182e9d6123169c699758c7424e9b82da9ed27a868b9e01,cfbf7870cf81b284276311274cd4eacfdf3b463ccb3083dad8f5d1067961531c7588cc79cf741bbfd7d53c40abf1984d44f95b203eab016c5d0d9788894dd44001,5108abc496b93157ba687201ec74e952726125e39628e8179fd11104037601d26c0992db1d7bcce62d7497fa05d5648aaae139875e94d87e65e53abf0f823f7801 +8d506050e444df40f6a2af8470ee71f6ace83378f87075c9a4ab653a96a93bbbd94cc924b9d517e7713af2f90feec9a6cd7e57059c0149b4ab67bc00600fb5efd5adeea7268a28527ad17fca6f024222120ea6aa9c99f16cdc50fde4a6ebb3ab0eb945e8dfd99c8f3db4c92e8170a318af2bdb7a993ceadc8e6955c511643e85f331cea0b82101e125a7a007e9e8d490d5d804d42f1d5ee6e7e6f4f336cad67c5472cab5dcee03650bc88633cc,6679f48ed6e5a0882a2aa3f08c5e85464651546b5dc1092ae91c156aef7fe43f,56140638c477622b3417bb1a2a2669b7bb11fb52407b6930a83e1464f812d64b09259d3b345c774e19c4e0c398085821156fd9451c4282e5a6ef1c336b0138b501,8009db7409fa709bda63eeb26a27302b081191b1e09882f2e84daa28caf772991eb13fca1f339ca8f9ee7cb9006ed64429db736ac5a1174e7fd5d579e237840100,78556b6485930b32c0eb0ece2bb2c4bda8cd51e52c512d7efadc9e2df7ed41985ab077c6825cf2a4ea9f27158093bc5c6de0277a1e715adfef1921d4e857a80c01,9ea688adf171242f3096f5c33e4d08589e7916b473534129ad0dcb99aae1b88b3acac0a817a21a64e692982fd96fd4a96b3c522a37e9d391a9ec980b681510c601,e03a209e4861e20106295c827ba6b6a6ba2bf68b4f40e18108ef8991af53665b615d2f898cc7a147e5b0ac1f4f18f17a6b29719fc5281694a288e90645ac2afa00 +7b60e77b3e1b352973d41713f7d185747d85271e39e971e8fea05a1d46ce9d0fec7a14009f8c5732539f8d573f2e80aa161cb145e9f97d5314719e640d1a8af348430f97b8e397a2dae19d25164ba771cdbe9664969a01f1e6a14d8a2f491bbac8b8542a38fb12dd6166aa4a7ca6b91efa5e51fd8aab91b350f98706f65192f6c118639ae9331d2421dd899b1d00724654bf8c746e38c4f90db76563c6f3fab15fe305e56e3f171b3ed47f25a3,6545ba9f498ecd4ad0fcbbb3d13f061793c054672196ce49de083b2e10adefdb,8e7b2895a8946b4010c1cf68a6fba5f8a2aad9f923263f8a2385dd67fba3deff72364e8b84b9ab1532673dfa90c4293fe7aeb85ef5666326d28dea6ee4e79dde00,dd69a973e2cf89f0c93cdcacf556daaf812f7f3417908ab079a7b1cdfdc0f6e80313447eed0efb737889fb6da37d692e34f0ddd5e514f21883874e39a5fc808000,4af439b5b7fa2dd09b126526e32ab076eaa4eccd2275af0c4791380deedf30d1502ee09f43d38ec7518a57436b7a03e7f4fb2fc8caf0a3167baf46fcbe2aaf2900,f648ddc6498b1e705ff67b507134a45cc3da8172334b1deaad24dcf57c11a48b4af79c57ce5cc678ba54ac9f6fe9cf0852b66853ddf24c6c4761bccdcf40000d00,1ace77e31c5f43aedad92f7d257d6ec52f16c0c4ccf031e435a120029324b84e2fb13a6958d27c08e93ff4f4c0a7ca1b2754424201930131140a92a0dbc9c7dc00 +34dc1d7d40527bcf2cf851397f088d0485e8e3d4beee93d972571a4f7467822c06ed95301a3965e34789a6b6e766f0ea0d4a27273746ad82672198102ba2242dc2456a7cb07ff5c34f2aea854ffffd17e4a1933626ce8f440d907e95f24e2f7221a952c12b4affaad24020b4b737a13f4b2ecfc95ec302303cb527ee61c768e3766a2b391e8ae6c0076d964d1cd9f84b2627be457b5ece03330faecc8b84fc375a17e9b5d7646c0f3007082152,51c1f6e37350e8ee4cb1e2ca9260b876c6e8846e8d14bb85db5655cda566d5a7,d731301178495c8b7f1d928b99ffc4b0ca00ae747f0350890548b1efd575020f31608a93ff7d3e980ead01cab4815136b31e4dbe196000ddd06ca638dfd67b9f01,d94330634fe86977eb6114de2308b2493370de6b02250dcf725288a77cea2f9c6405218b91e077308c381d71610e7f8da8b79e4757d0a4439c161b9ff7580f4600,99e739f3c922d925b3fdd894073eb2a83c3457c3d2fb147c277544510a018eaa2692e5a8682f3469b605b443851b60feb6be109213242632d16527d01ffeb1a700,41bb608c4420065575239a0e6ac9c04f664e0d1992e5c1872956bbba5f5537fd5b39a58af30b1286c7faa09606e934814104af6e1438611944f97a8220a23e0001,f90136e243537a024eb459b8243db3498fcceb2c54b3909b61c5ad5cfc87eff52ea748ddd92f3184877094901e6a275b6a8867c5e8fd47a1aa3406fe31788b6e01 +10e5bfd92664f4948bd4f8a0e60da86a543301d2f836918d4addfcfa7a88bf24479a5f7cd2725d60dcbac1397e7866a536ab1b6febf95a915249ca4ebae42696278221fe82ebd9918119da2d79ac107abc1d68580e427a3a19af4b0cd0eb1d209ce5c5160f671682b6d94f417b26317f5a5aa2fccb86ebc482ad2676d8b37309327175a3e194d881feff013b9c519e0fa1aa72b3f018f9035bcb95a5c3ef43172bbd36c104bbaf225d49e6fcb0,2e4d67fa8f08978ba6d92c2469007214f44e63be2c3bae7da6aaed7d9cf392db,fa3a27edbe2f1c878e568c4b7d85e0569bbd8dd23cd6ab11339371943994b0b154fc451d1519755a2aefa6ed0d8ec65cca3a973e8211b9fbf0e5279db3886f9000,e17391ef11250b02b0b14da9f0599f66259790ef5f9486160be6817f45e3a2006d0ab245420a91c8b6040b6a36138c0e26c0419e5cbb2f477b3f13c59683fc9000,5a743ee026ae7bbbd1f56b83ac9936f591935f83b02e9fafc540e462c8803b022909ed9124bc4dfedcbb7ea0b0582be97d7ebb6b4850ea4bbd21ed846533856c00,6872a7bf8fcf6be139feb4bba87fcf6c7d4b78bf44fe1736f5db3e7784e2e11009cdb83be883c1d6b2db9d9eae03d0815afc0972087d48cb17d0a11c17313dc001,25003c8f89367b896987d51801a2e05c1c713c207b2b9df2cf62ab2fc50e154548b0c9802d04b27224186d35c12d3a0dc7e6c4e1679015d3e491cd291543ac0e00 +9787d138c743b12abf8268ac1247642c6a299c08a25255eaf4b121d279d4bf473c4696333f1beb9e0db5f57ab94752987d67f43767715a3a5b957a1e15d98a7c389dda5bdc7d0220b492da2711f5b3cde2350a002d768860ee676de8223e5973d4d9b389de102340eedd616a8b44010258357b0e12abf012f0c3c0f7c277ad29a3faa7c45962890896b96cee9c92b0887531d908c8b1c2d71d792904b3824ae1cccaa8b68622bb88c00779d060,4cc5e0c083183a9c4b8c268a0fc3c535aafc4283fc70ccd930169e4c2a489dd6,c7a9b295e65f29b192c798be2bdb4f284fe2f9c28aaf9280a1f79b2f717910627a57257b5210fe10fe4a08c4e1a5a2580509be207302479e7dc45c529071827800,9abc7770b8935c74881506abde54f68296efe1f31a44cb6cceb52f2eaf10156038cd853487a53e43042fde57fa16017e55ec1152b99b0fad06929136c45babe200,fecf66e3d53dab7dff92c8e0c22ce4a4a1cefebb40a3fe1d82b816d1a5fe088c0227a7394b8bba06fde2d8c04e405cfae939132099f817ea0e3544fd89e1b55600,3c73c65a6a4adf5eac4f1528b7d05eed8623111267a68605a8e225dab9b1f2a0418ff3723b159d96d7a1141259951c01be8c56527836080b9d91f184b710790301,3bccf2ccf3bc0e0a57634ba60ea80508ebfc01af94f6ee74aa98f1cde1afd69c65e4d07c532963de1806ad49c3fa096c3d41e4091e3cdfb52de3b31b0032690200 +7cc12558a20abf50730f11d0609c2786f2c37a6be693d49d906a05f96af8988f111386af3958c81076cfc9835f54360a71e6ad7b69e8eca879d0c706c5de55026b9cba3fd8405a8374a27ecf792b8425ea508e2601d38bb18d8b0e516d5f87a5d9393cee9c29cc5ac45e0224aac7ab8f66de011a2f2413ab072add7662b8a4f393743f38d3586ef0841fbcc1e1c15f797335645dd09dab8457229124281f574c18b9f5ce3b47ea93a59f32ba63,f9e20c07d3da66e92e946ecbef5d805678466bc545aa79de09a3749675879c37,740cd5822f6d075d4cf1871d6d0b4a3335734c049509a4ce78fd0fe88a28076d7d339a463aa7f1f5e3d4e6241b92d8aa893bdf1c8aaa839cea901fd2347b3c6c00,0eda4a89c21d547e396f10988826549ad678884e87116f67a8ef3f2e4221d9394f58cd5306aad83611d8dce8cfa3e9f6d97ccf11dfc5e09b9770816f0aadce1401,5d2d11214bfc1558fa909faa0a6be27abc26a00a2d2e68765b5d40bc2491a27c279d0aaaf8d818affb7e1b15917a55320093d855f0c1792ceca0554c87165cfa01,597d205640ba5c0f04168777fac631dc346116c686235ffa49dbc62eee33cef44f32597b5c63f7642530c02fc52382aecf60c913c2c1280ef74cd208074f197600,803042645aa4f151a13509c34d2ec0b1ea41a0d7d8162755323dea90ca17318807e4904f3ecc36cf97395daf68ccdf8dd88dcb23270044fe41d92488dc5c8ef001 +e42ada89b7159dd23545e7a12c15a8370eadbe8960c3c07711de7a1bd8a30101353aee5b99d98b47264dcd95c330f9d8eb4fbf4dce6486577f725954a944222abc96a38744244cc80b5ece3f6a15e2038926a7c65e66b83d3f93c02fb10a826f4ac8353fd96c0b07f2a2d0e0eeb21fc6b38808d41a6a76216a9f525347ae8353a444329673e6f14108c52bc4daf3dde320300c37b9897435978e7aed5b2043bd08348ea85dafaa7732cf0e8b16,54ea6216cca59b0615ff83966a5cae394b942005fcbf71fcf7b266723ee385df,a3add8567ccce2283dd2d1d38ec517ba0a605bf5247c9b44dd20aefddf5b115d0ba4e00c7cc168e329d10b92c373502681c25a0da6a55ca2e381500311c2000400,403b244c51f5045cf9bbbf6faac0775313a603c92cd3ed16b7206f881d2eb47655d5779d891507489d83f85d182f338dffb70c37a518174236403e459364f07a00,747929f80af1e1c12b7e21bef6cea5b39c82cae25e086a904f577f1775d35ee15505deeb714a83c4e42a27933b697996b51d847afc906aa9325d4b837f15dee401,ff166d8b7929e32caff37d1491b491d560d0781d637701f1a2b0ee8db0d78fc925b08d4f77df8e0f6aadec37429972263814d64cf572a76565d235e1ff24d28001,31f0b1ace48e59cc05ba4aede448e2396364721e1ec0f47ff453edd598cf1ea771188189943d981a5de7c6bda5f2768152a821378cea63a1e85a2aaa2f3d9b3300 +40ed0b2df2f1a3d6b4d0e9bc2b1bb86a17a19c826d89da0e83ca73e407ebac9d0606fd67d7c20394664ff594f6d6ac06fa25fd088263fa39f8aab690866623f3c379771065a34a2567eeb0a3f023cb3fdb24c5ae5d8ae991f9460fe87aefed8e84c8ee0d3b6fcb00747954a6ab0036e2cce315a7f969d7a08a712d8e7ca39d5a1df8fed17bf956c3897730c3c1234c4871f3555e24e6aeb9ad82c5710031cb5754612b7d610585a50e4e555869,1d1de41977db840063bc83e38d4ce5eaba1e8dddde63b435618f5051423d12e7,a6bb737e0d5f389723d7029935c8a5ff2b303990f35ba520a6ca6ac7a31ae71256102a0b2c87e5592e33f2e1b9ab20de682cabd84f58454fe0dbc95cd308592700,2bc2efcb43478d4bab7c483b6f7a6860a614c2a9ff22a46f0fc1d383395a000d48a6ead7b50da37b400ebbbf2119785798bb45b9099e74f99c147e998cb9819601,ab5bf7f07cd5237184d3bf0787a06c96b20b4b7ae09b4e44d1d4ede27642e69d650163b88b4398fcfda607a822d9ef945ba4db760981971111ccff7ba4d3909301,0b2e5fe1e87cd4cdeb1d5c10b6552ea2ada7425cd4a8de5aebbe756e53c4eb677a07489667093550f169c34213d18486b3004ef4fa33e71007ad2c3b819a02f701,fb4869525ebcb6e7507d24185cc6fa4b2c767dd96c1f30ebffa7233131a148622c86af4a0b31c1003d9fe909f28575dcc21e81420f702d5de145434a59a9c75801 +a2dde4d225c6952ae127691676ede22444112860b2574ef642c7ed2d31b91287d787830b9f013afa8b171a8a1c408d3eb09832f0927c35e636368926d782ba0b9ecc9262d3dca9ab9e96a993210bc95af234a39178a98c5fe3ec3c823e12fa57d28dc6a53218ed9bde01ad0a6fbb9a4ed3c1e572e23cdf3d26fe229a6dfe0ba109add8855c45bd3b5149c656ff48d2554dac017b51082168609238f734a6b5cd2b0fa2766746b51196758b6887,4c4f2c0e7e070b204a3d19096910db418ba1b33bec0cd3a89b58a56ad90bf5ce,12ff8c582a0d8ac2eb9672e0f02b8cd0182b69727d2ef235d528460c74bf4fa60cb25a5a6bcd1f03acbd85760ed36e3ba3554fbad32304f70f22dd5c16dd5a0001,b759776ee25dec3a9bcef0e7614b97ac4947411c575d09c7234128862c6ca5ac503857b8452c2324894ffda8e3e232f2d5ae4bc285e9c51c5dd9f143edcb841f00,dce815754eb1edf74d92ebddb886ecf7b0af583639e916380b7bb85ff5fb92b93aa4e4c4e6aa34ece8ac03a47ed9a38b8b6049e8de237c98e2b8f476b46f440b01,c6f66cafd270923ba791bcea3166c1fdcc92d7f115e99f7df2f407f03f61b9853ebb711cf2ad42f4d7a2f4837201ca9df3c3c42644cf70bbbac59a3d07ab48d900,319eeb1e5a8f7899f7440a81dda8c83097d15dd825730f8848e99c8e07b9245542579c251bf978d1f5195539a2243fcb8522127a8cd22b448d3f0478142ad3c101 +b3a56f690bdcf41b0df7c5dfaf7f527c37b944322ef47b6712a0cad426bd73f5ef56fd1804028f4ab8e28f273c9e60fb1160710e4ae4e9a8a7b4a8accf34ff7490908fec06e257fa2048b8308a1328c5e74bcbee114b074e27e3fb069cc3251c97a70abfc0968f26fd5aaf6ab1ceb9cefdb5e6794b0f553686576efd931d58f5dab384c0bc64ff4994f32bfbeaa7b11b383b2d48b4b2110f7d9e1c04721248d449f8800599d6059f71ab846e1a,fad70a2a242e7ed800395c6b49cdcfacb13fe1d10d1c05e35968ba13b6a7d663,4ebc6b0f25136217bb223eac8ad6263740a9f849dad3fae6ba0a7f3374c9fe925dc1500beb50973b7f04d7f4235d06809f3c9eb2003696e81e3ddfb3dfa9b46e01,0d93834d8439c177d6e68a041b181b06928fd9e2d0c68d2abf445c056fd258021d692664621bda104cfc06df2fcf00bc567c4ecc633a37bc8c8c814b8e7c662e01,cc50cf41472c6b9b445d4cd82a496899a3f6d11983b15dbc87102eda46e6ba445ad45e65c91f04ae58aa7aafa641326685c8aee02a6b9e863d53e591a065a9f501,3f10c2af4eefd8f32652eadbb2ef332efef4670e3fdffc03bdc24216d192e0a829043ea595f5d3acb179127f9fc86e9ed96ce7a03c64758880f462335563222401,919a92bc6c43300352cbadb983dd3a4aeeb54164529f577f97a7cd5fcb669e4401b34c2648ba31b88c059dcb17134ce848c817327c15404207ab7988aa63aaf800 +3282970ec6091ed47ac816f13fb109fd8d05d8bdd07ce515d92df4d2b806bc7a174f55e48c2fae656158de6a504ed09981985ab051d7132b7632c4b14bd048e213f854eef3db881f0aef06bb887e13f1a8b060634a2e9d55f8b6329001a1477a4b57d8749a93a4d4313b193e4c9451c07c29bb1978d98be73b804ab64b12c9353283c3867456c056cd21da95f62a2cc07ed68ae4d11f23ea14cd807745ec6ded1d4348b3212a9c8586abeb6d7208,93160a306160517695f4f3b3246c096a9bd0966b5e8e92aac9785fadcfa912f9,c33c066c26de688134a30584c242458660d9370a5294259266619d9911d3fdba3d7a23d23bf686e3367384bbdbfbe2f9795a30cf09d5860b510811b45a2771eb01,82f4e1c1118dfad2ad3b71a389df8f00702d8e0fbb2ffa7b13375b84f2ab5b353b4e145f8a9c5276ea6d77296c302ddc3387a92d0b8ab9d2edb41e7b258a7f7400,15954f2c18c1f654304684eb25677d9cb96e00fd24181633a81ced914198234d7d58f4fde340ba6f5255ed2e6df61c3505e511d2d825ce66b7c019f35b7d379500,bdd2f9f56e18d75ba208e120e22147150617b2c6ae0494f7600c32b50084d2ee13da43843e2058d0a235ea75e6b3eac6a44f56d86017dd0fe1f52c5d0338d21900,791f71393291bbaef4363d4111c78a5371b57630422d3c40e19ee28a2763d6f23dbb6ee53e5db39f03351db23d83a17771646c452b1a8b64eef6fcc0b43ac58000 +6918fd00df7029d8c7ccd704256cafd68fedfe00390580c2b31e31beee219ef78e5695248cd7ea4e638456af2a7c5031fd293cbb8a6190c4a5dac1ba7d313f27abe1fd0f6268e96bfa9625e9d27500f78d00d828362f079e6cea0fb553408e427ebc403521e8c514d825d33a59097342356e654188994aace7e156a2646cb75154bfc1fa6ef0883ed4d7fe7795374010f1cacff60a54b3e18691de30316d041e8361705403a5946f61ac62a20ebb,87de5043d7cef47416e038c7362e093f6b652a8f35a729eb88bbb19fbaae2bb0,fe48d36c204c7a4d2c3946d0287493ee2b5e985a654d5796f53c6906e5f7160e1b7ea979271557157483b95443797415526a4b2200142f810ae70b2a65173ace01,ba093511c10f691dfa427089fc6fa7d14a781822c2fc1b7ace50bbd1cf445d65190c86a7b366d6c92f34095e181ad7280697aaf9891859f710736ec81847663400,39a85ee8c5491b3b0322ba4967b6a0c2442cfd9adde4b6ddc7135a72a3c9955f47b50343d5c3d0920e707a94ad3ad4e1cd4d4e888a8720b3d4cfe00557d8a52400,a6e27ff8fdc038e8741589a075c33bfe54e85648f142456cda1e8df33f9d60a73be6057827d9507df8455eb14f1471add23bda0564e735f85a98d4c4af2d3f7400,37af513bfb7700584d53a6fcf7ab5a71c9eb6ec2436ea081c902a411443b87cf34fcdaaa9afa84a854befd757365610db2ff119d9caf6564be0c2a36924fb25e01 +b6ac80304b83cb5458fbc987a3171ffb42d346aa7853c1c38c651b90869547d9f6f0c9dd46719535079c697a7f97d0dfefec72a909e7e71bfce1463885b9584f531b62aba2dd703192765d00eea0be9090395ed7b1ef8c36a21277da0c3eda5b6012f5309c6f09224cbd4deb6acda6ea9cb9e6de877e204967b85410ee1d698f75a277ca1a7acf17ed227f05b3441bd0df44775b3bc76c7518f3d5b1fa4db5b96e81fb096f08a4936a00a67f0411,59fe972b6bb85df014c71db72db1246a8a58af649284189a9eee899ca58cdf43,a0433ca227717587a5a1bc1c688e4c4a87b209438004e6876d22f23fc61f3e9a2954c08ecab501ad57475600666fb5e9c790d6075947279916b17d909d9ef6a901,c11357ec722a0623faf6706376af7ffd7cbc778d343e43289f0e3cee4b1ca1935a720d3fe5ae65cab8b90a284e3201dd6d7ccb1549fd1d74dc6f8ad9e7633eb901,6288642d856aa008917ec61479b408010f355643c8b5dcc55edb830f7d8b8778669482d4a563d4e041b432c4946128fcee346c00e83b8a6acf04c606e80ca2a001,f1ce6adc920cdc4e8715cd0a3b20c6966c6e17d37d916ea4b03799ff98fb39886b021c46167d23ca46e4a01069eb838232b746629efc4f1fe532d7dfef872f1e00,9457698888658836252e4e1c69eb7b52d6a55c9a38e905467558d28ae4d6af1508a90edf6c4303faecb3b82959f3f08121641192a0c0c4a2452f30392326c7f800 +9f2c545f7ee17ad63e592915892703b3d47022f1585692b94101582967a174d48431862f80a5f9aab764c7c8522412a64bef1044450b0df6fead7072336fbacff92238389cf2cd35ab215d9ec4355727e94d635517b491a361f7b5ba5e5a9dcde257e3a9921d2101271ebe9adb1ea55e39633c63b49bcdef41450aa956e71d1ba027ecc671bf5f27c186dd1a44d91f0ccd44848e2768cbb6ebd792d4953310ff090923889e8e39cd6c5127925c91,a065fc6ce6f7e673d6ffbfa55dcb4e05933093e675b02f06183a45cae5a10d77,c039f4a8f8e0c8916ed263e9eafd8970f844e650d52e12cb2f43129a0e9d581c6bfd03f2c8b661eab4be375e9d71f2766ff3ab63e316fd4f72feef73a53ce25f00,1f0c57cae6533e4951f79d874b09333f4e95423d727874066d54fd6b3cab60ef456fdca0364dc686c80aad66c07454ea5d329e9cc1a7bc896729227d3eb69a9a00,88a917a5fe6c4936c4af97384bcad78b38d51f93334ce1c489f04753c3b3444b721793c5a7be1ed2f1f832db4ba77e9acc9f360b80d4f21ce86a8b4339da97f600,07efb119086c6c7065eabfd0064457cc6f24daec3950ede971c965d389a4a10e2372673c54ccdfbb529c25635688400f977137b422111ac96779bdedc11d63b800,fece6af393217a95c214b353aefe681621b654818156637c8734629c0131f3a038dade5780158cffc3328046cc966a6c40996370007f66d6158f807796e75c1500 +9501469e0b823b9d12622e193b91a695f2e4663e64feb6d36096056b9bbed7f549ec6809b46789fe98847083686ab4d2516a1513f4540b67f4f687ee755e1fbd743b0b3b2ec0388c3bb1415f8adf09a460bcc3759562f6a748b8a7d2377b00547dc805fbd8f3a4a3957a51c6321ec8e29513beb3365f892713f62bfaa32b06c390a78d7b799cb8041ef1cde377bb31e57252802b867ece92973fbfa25f6b2936c6572a15d6291f37d125c78bfbbd,58f29fa2b6bbd522820e8bea3819432a9819125188410ed357a42713fef6584e,4208ea304ce19eecae2c93e6450bbf4ad9415689cd8784aac3ae5f099c08056e675fedf82f3f31573a11166ef3d940d248d89eb77efcc6f0adbf6b2e7d637f6401,b443f8b5d9f54039f020dc8e60a3049d08cd75bfbceb7b98dcf887c7f1a81e5c79fed2b0cf01892e61bcb4b96cec5242c957948e366c14a89d59d43a747f0ad100,9da5d97a046e6318f4c179e01e0deea2e973fbe87dc34555be7074ade2a2862d47123016383d6696cc55bec86e3bb7eb79b69b178e244997b369c83e7f01146401,402dfc2379d5dea56cdd1fc1087e4a2b7aad8ddc64b52417f31e84a864a2ea80534e0188ed07d19a4702188f856f48d1beae1bbfd4270ed18aecafa1d6a1562201,325abda7c6c53a4c31dc1c0f636c1de82c4a984bfcf922a5578041bde8686fc7549e630a892b04751cbfdbabb6fa273b1088557d239115503d23bf606aa9af4e01 +d8db25a9d57eed1eef395e1275b63f04b4c1ee8362d35e395e7134e4040c45a60fcffbfd9dca202e4b67c3d6f57caf48beb494f7d86535ed0dc752c8e4cf605e44350093f02b2adefa21d5a1583d50587eee455e53edb90a48812792463757e349e84d8a14b2bd5a50d25fd07c648fe1b8a7b036b91c3b47735f9be8e93b64436b06847629dad6ab3a76e56fec0eeab7741682f631e83b9f3a78393b325b93d67e9f5a879490377d0d025a06b256,759c6eec2796dd418eddecbb95edbb6aed378e2ce3ffed592be12f12a68f2716,532f5bb85edc65cb620b65decd1297b3c010d8465d601c334c9f7a1557a4aec9087aa6be824766fbb0c37387a42ba102445cd422f2d10d12d0ba85089b936d5401,88984ff1c0beae449bf3749f19daa95e11a3133ea26be88528e34506950c90a56c9fe9f57802edda75ea3e88a7d09bcc8deca27e82b155460f530d0e626f970e01,274359f1649f42c13b265d30a4d2d77befbf3a35ece3055e5b59d93fa059569e7d42814ad8b93b8d2c1c35e8c4ea41eb23fef94c16215bbf312dc79f7e52c14800,56f93e9c18453d4dfd47cb7d18065b2b0cbbb0cba25a43338296537f88d01cff2514225b0ea71601e81752373bdbb98b21fcf9867c0fec66326600a3b9cb498c00,b3bffa22a949787270905746ac4d8fe3095b202c0f2d0e3f63aa8429bd7810d10aab3cd0bc91b2395ea721ae142d2a26a22ed42e13b5aa0af902f55fc91769ae01 +d30c7149858561cd855e794e840b34579774cc5dd04bdd9313a3b78169e69f65d09fe1a5c6a60eb58cc00c51d3a2a10fb5026032722e65f1068d83d9deb4f33a4cda4087e8f89dc95ebb9896a207a66ba5595149a63188da785bcb6ac332fb384fa2f7a91d1a362b142ee7b86128785f243666f48f874e97dd8de17eee4c71275a7a3042bbcbede722bc04285ec6a2bbe375df2b0ac4287f4415393619cd4cb597421352dc50078b0e286ca16007,159b52126a38491a1ca4e75286c48b83151e7f309a27bff4e45979d4f50127db,60fd27bffc6f4381f34848427e3a57bc116c6756d67190a92f4188974c329c960c85ec05b4f5c4508a024a8fd55fba7f2e9809ced6893b4aa70dd61458346ba301,2ec50ca82086ec678d99df29c724a6272a4925e8bc66f9694ec4bd2714a76ada16734bcfe104859466859b3922fb877c08f43325cc575ee8e2167837157d4d5201,5e4acbc4e66f525f0bf70ad2e9d63e0d5e5a9ba600102e7b2b3b5e5118cf93c5727e92d8a1adee97f07fddc9884832f6cc10d9c608efa06655d6160fdffca9c101,143d41e69e4f0fa5d09975708e29726e0dd41a9dd7e81d71f1d66a9b9e3bbd8154041aaf389b0b9cd37b2628816e09b82379bc8f5fcabf7c2df7c9537d32ff3800,aebdf5baade99e5c5121020425fc473d5bfa3aab357ec442e5689a56138473e90a3928b16972c9a79388876d6c5161b32e084e6879e0ac2dba2989743c233e1401 +e2cd3c77c19e4ce7046e872b227a5dfbad401fb9f0a4fad7f9daff4f3808d6933d379ae671f8b9c7f59ff359983734a3ddf8883bdb7621e311a307096bb0f15f88c8775b699574efc1f7b3538ed5be99dd6939abd2c066b855f4fe697eeb98abe6c2c353a2d94da213047200cbb75bb0753ec6d4e8763e7f897f1dddfa11fef1fbda4a6dcf0464e5f3339f4873c1505a25544ff93c1794d3883840d0c069454823c1b55ab52708acb62d49f7ce61,b5e2979afe6d5cc3eb6a6273f47e5ce94f57b3dd4df447ba53bc6a0ab70b3a71,e6bba1224242c51ae688910279dbb5cdf6d53870e2ec51a2ed0a1f62cecb7d4e26d27b8fd1c27507cd025b6ecfee491d6c92274656dc7698d44a2c555382532001,ff9742b24ede27c702dfb44e64474465020b8b607904ceb54ee63cb7d5232dcb04f82afa4c7c252158c799ab047c3acce325f668a57b1bca345e7ad04bb048cf00,f31373ea9853f7fa249d37a26a19d57560cc5ec2a9d8be63371e56e2d008d41f34c8cb40d96af79a1ba092cfa969f4070e60aa58005c79dcb5f84b16ff2026b200,1f6256e7ac756d3b5e00a35539679661888beb2ec3e67782e3b16c40a4c006a30b5e2b9d4372aa9d5e72534f7b935f1029371c016b9bc6e1f23cad50a469c93e00,b67d369c604b837a893035dacf068ca97e4a7717382bb253eb52189172d7a5b946d1e9c7272136c99dbbf5aacc63f3f5e6093c1ee7aabad6d543aef5f30d7ccb01 +3f8bfe84a6f7223f3897c52bdf8d14dc3e3d627ad8c91b25dcb44400b53a7c7f20446ce1fca23692728cae2d5b624dc104b4c7ea03346945b35f4157f7524418a1f4f05627c92ca44fef9ec6140e9a76cc24b127ff448bd31f6b173bb145e0511d461b35d35c75b07d4bf114c7df364d26f37472b8c390e86cd4f37bbda9bd03a12463a55e1d49ed786490be4eb2c249b4e5a39ae95a1c26ab478c8837030f87cb43f2410a1c94283501aa0bb823,cabdef13dba28e3d6394937bf3f11b06c99d82f2391d2a0c6369c0ebd0fcf539,7085c2e0b2a7a0b593554e3f51eb80cc0ca1d8cd1a3b25f3ca533ef10520551121f22b81ab948bfb93ae68566cbbd407ad82704d2aef1fcab2ede20059e0c02b00,3253b31b1a5fc4cc4c60ce9b2ce0a27c2eacd2bfacc5dec02e2e762b4a7ee7855bd27c5994021e6043d0e72eadd30ba1971bdfdfb6345f8eb97e9a67138c230000,4b175e25c4d60cb9eb6a212294431501f721e87d66758640700b149787d8818518a6995d56c8a1c9da0beaf1504a5d57f3f4935b4ac51015402f8cb0265a7c1500,cd2ec819d74a826741c8b1444a050f5e26b0bf316d3ee7bad21d4d5c01137a9b0b22340569629384647421fa1285488f70852803cd2278da0a6f220784dfe21600,70ccbc7f083303d15487ee623ff2cf489af19ec3a19b8ad11c1e0fb5ba58ece306f0e7a6894ca07f30457f7208ac7b63c9307afcff2272c03e8e6598449a0ad001 +78df35ab2b6fb4e542a3542382163dd8dcf2b9dbaa1e722bbaac5be70d3e64822a2f58289137dd721188c7cc463abfa94fb941ce19488928d6672faeb6cf005cce38316de5dcc7c928a2102efe1f8c9c63e28b208c009bfe44cd2ab4308c69a13268cd36bcbb3994587c2ceb3f4fe5f2f42fde11216012cde3e2a39b384af61649187d87438f39bab65b4f6bd81f1193877a108058c662c091d65075024a7bdd42d5765d9d997b223d5efc9109f5,247f6c9e12d053d4037bfa8292e2c98c2ef408edaf9a1a282c2b78e76b0f400b,4cf575a5cf3bd4cba70ebde7443c89f7c329d02470dc607179331ba8acef03a07fef33987713c0390ccb8569b7fc21f71c70f9c2d11e6fe5632faad402940f0c01,5cc6fd7e67501e4b0af5a229fd631d1d187c30a9cfb4db22910d6ee5a1b6054263d88348e44d9cfe3fe196a31f8d97db77c25d55b5d8187801ddc9d77eb3e7bc01,46bb56c1ef845c418ada5a8baf4e9644c16542b2a93381970f1595ee84143d9c7c609a43367e6aefc7545fd1751bf55ed952d2263b389585c18f6703faeeefc900,92998cc703dca6d01cf4c80efb93eff77899deb397d97394b155f7ee12933d183a1de0af651305fe30fe4a827d17f22b0913380584b2dcf1ae818781a8165cd700,fb30ab079f808ffa3016e5b092771057b15b2ccec04dd0331cfd7191912c807170e7b447dc20a797394aa07c1be898c410d096b681a749092e0168ac65018e4201 +5dfdaa9370adeca61aa1e1edc7cbcd84b17231517b82c6fabe036f6699d1c4ce9e061cdc4ea95f3fdbf470767ca159c652bb915aa72a430f11ed9e7ccdf41cfebde60243ec0ba9ff8e138427c32b3df4cf6f4c1ffab135ecf71c34a7a95078813226a6a6f6956cb087e94efc56303d584e3af3e5b6ea9e2953c4290bfe160de0ca173054dc6d1a1e0c8f8001186b7a1b304485ec52d7324ced74b4f90695ec906ee26faf307a26fc7c00360e24617f,8a52db6a5f7fe0eb26a3c43e32c83890830ef400ac30cf7590fb879966a2f3b0,8ac164b8c8be646bbe5acda4fb1bd7d7d50b17331cd1228df644808e81c7c1ad0bb5455d215bfffd05adef74ef9be158a05d846301920d9029fe8631c9926de900,6624a4d7352bb471dc205a57587f112ac5c68ea816f432be6bd7769b3dad32de73a2a41e050e46d68468244906ed9ce1304f8c2ca3946c734f12c2ad91d576cd00,c3c0f20103254987d2326880116ddd7cb3abb66abfaef1d7cda041aafe96ee6650ca762961c070b5f307cf55e9ca50dd13191ef3e8f15be6c686def66847d14800,c415029f19df9e0f41b5a03e61047f81d0c5203509fbe9a54aaf4f173815b9445c6e2de61b19d1836934db4f82988b1e497febd5c552c040174aa53b0144ff7400,55f190c63d198ef4351abbc12ffd3d1fa4dcf5017d8ebeb7eaff1e41f7f43af065d5fc3dcd455c3d0f699b8aa0f1928c1098598021b16fd15a16ecf3d166fea500 +9a156dacb95c0cbcac088c3849a321e315776a90e312b3c52b4050b14ad8307f9c3657ba0316efbf89e8159eadc279fa7b254e88387cfd9101de80bbd62f77633707e4ee87cd4643f4f5b93662f2c5d293ffce0f41db26157416ad98b3ea13b6167f922af2f3134d2ca0d07a840b572dba83f7a6b24fd78ac46e81419196c81ad3ab212b09606ccbabbecb8c7c0fb8332bfec387366562daefeb668287094382b78a2401aeebf77a694acd3d4e89ba,e77f4d2eea656a4812f58aad9de9b3ff5aa4936a62c70c2abc686031a185ff06,660cd275d7e8902d754934daa77a0488fb57115862bd2ea8f452c98dff1b44c96a5647ae13db691a94ba430232711a8aeba0760da8445ba62daa0fbfc8d8f0be00,00efee2d7c9e5dc2be685d6f6be165b5d9a7519e553069687ae1b4bb75da36a864b5b097f56cb36fd7d001f4fe7546d0cd9ca3aa74d1a5e7ecdfe9f957ccd4ab01,15834a66ec8d1f50593c131618ef607570faf8e70590a7e3821f598dacaa08f72244cf56ff71f0ffc4ad36b6481a2806d8b2c7262c7b9c2924ecaeed459fdae900,cc22e6adae6b62d6cf561dba32bb0544d8c6684d1410d2b9f11ff936d52ce2b15ee2073158f2d12afb6adeb698ca90bcc06c330af80e7174a45ce2a5c230925901,21d486b8a416bb52542bf7cbe2966080716302ee04fceb8d74f7a54ef19138b645f8255d415480708452d16ac59ea6e7c968c568e625ae33713adcebef7054e400 +f8c5abb73fa087e33936f5c4bd2102772b6e2e206d6b33663d1e755d3dfdaebe446827a03693e0d82f28d4bc33a0d86f4be999f67f1cced8e0df70065a12b6273ef64356b54b44bb63557851c9df3a7bcc78fc199aad5e9056e9e389ee9ff89b5ad6977800bb22a66389f0d3962dc6c1ad4c4658fed37e8543b2487eeefcd7ccb89addd61d25a6ebca165d27db564a3da60bc34eb6f9cf8558af5db7fba2f7a7f09367c715150ffb3f6b50f1b0f682,35fc0c059dc47b73b3f327704b26ede8cbdcaaa0b939b2a3e7c8d2a66f095901,02ed6aecacab02ebb3af99e71e409ee19f3e4c8b54ad9b24f5e9a5c44433b3e31d0fff9ed37a6b75825ced27d7802fe28e9ba4b11d999c931ed302cc4e84b1c101,b88f8942334d0db9998569014ce9e5924d98d2f8887b50d67c3b36bf2b67245b01e6a3361fa16b5e8df18a383213addfd20f5c1164f52202f8db70571b0aa84200,448968f76d7add7d863814b06e09e2fd201aa4ea60ecb308854799a043ca5926733e7cd1b4681910e83c8d7ac494587093060f930c70fd72558e4a602a8fce2701,346e27c498ee352d21755860d43b15167c133b8854892178e9631988aa59ba2959bb5f459c9615aefe80e3702cb1b459d0ee94e0576b9dd8a5238149033ba27f01,09966cb234f26d34bc7fd2443e401ad4d48376b5e21e328f7d788d0257f2c41212709188b875cfbf41038a9ad8ab7d37aa0b4fd93bada27a0f8a3b03a3f3769a01 +7fe662d939687a2ebd1e5ed2173976eeef6f036f8ed44f59cf8f326061ce9d0235e3464e7736e711dca0bec448aca86537c92ccec82a088e4ccf0d684d95137156d2ea8a2d777e1112d860e995d758be7218f22284a3ffebba11bbcebd60dea2d53f3f6b0dea7feb0440cbe7332c6e29befa50c87df8aac47d50e54d8e048d16276d2656ad0ea2f9c48d3dc4c4b0e3a3678572731fe17c5d63007dffc6c1088a00b93597a8b990406ee2f829afed25,870f29cf86fd2053ba93447788ca1a8804890cd77daacb4d325a46a56c36b9c6,f993c1b06a0cabf4b6364ed69051c7f8493dfe6c1761f23959542c4ea9c9dba61cfc4ea48ed858191a4b638b00878e4f8cd505c1513c945d0ecfbced9d485a8500,b6267b311eedcd4d7146fd055a513a51c371a72335158015d5eb0ed89a6411e803da2986356033f4bb9345a317a073b3829cf868f5d7b6a819b656463a540eb200,f9558549c8ee600aa481c3c294887e3b2f5bda89ec30214d95f688b28bd3ff3866a25595290e6a50a9e0d1834fc27f6cb3e0c9fca9822bb64dd7a60372e14d4000,4f2e270172d6ea26e564d4e712544f97da6740c920ba9d0adafd3d91ab41ed9e01965cab87678c16317813fc2eafe3095b4f3065a41e23eb27cb099cb373215400,80e8a6dad42b1ebca046eda763ce23357ca26c52908a15fdce82de0cb40ed9ac56b381097cde28e7e593ef45df03f2a613fe261d92c6ded3b88040a073aa33ed01 +84a047cd9466c53b49c4296a8602ee7bf9b16ce28959245363e7aa7019f722cc9fe4f1421ba6754c3be9cecd912c99e6c584fa6ca38ac5ade13e01bb96776f32ddd6936d72a7d09d656ffdaff100ac3bdb4ce57d96817d9778da09005698eaf5da482d87ba15196e1ed1e89fea3e8a14b5026de5fc44bec6470f2160de7b5f9af88bfaa61190facbd2debca1d2889e0d8314fdbb3cbdab4300bb5549010f3839f25bd488ff526f1d8355d41c8d3da2,975efa2804434b25c6e2c49015bf40320cfc8cfc360c804cd9671539a65f6366,71fc70f235e9ea5d92441fa86b7be1603f94463b7abe3affee171985ad62546d7f72fc212c15211ddbaca56052f5ac7501bfc5dcf2746df36862dddf6e8c572700,207b10dac12676d1fd2900c80af1cba823d0697c10f60fe95b363c40fc0119773e75a73b6ec1c450eb79cbb60ab3b1c6356a5456c6465ed87c142738daeb3a9701,2176cf011914e4a41d9a8289a712461b5c285acbe6dd83e7a8077274ebeb706c30950b1af7fa4a47e73021653542217957c3fe74f5ec1cf0b52fb8c7209ca54d01,0baffb18b656a481e5bc576ea54a4d6c2849a21731a7268296a4d25eadbbd09f7310f2c77e5cc89baf590e484ed8534abfdb4e84512b66dcaa1fc038a3f772ca00,7db69577f4c14de18593cee5fda825281ac4d10c6de6a3331636a1c0d42e645772b4e804e9c87d528c509ea7212eccb6232fc4a9bc303f8cf9ed69a48fec508900 +d296f27ae3f12455df14396f661d8baec68c871847b766b5b132a9802ca9f9fc8b7bcff2518370b6db4046d6d78c41816e0c55f38f6965065d16af962db678d03abf4d96dc98223a290bc329db1c501c6c96168f297362d871bf055c9a785f8f95bd160a63737b8d3085824574e2537c79b593900d629aa625d23f95ea8e3acbe1fe7b0762b15425562d053580524e255d9863b419f2b1c15e4abd2843200a78f4abdcf96ebf68bc57da4a681ab1ed,6ae0acb25700e43ad5d1861f494cab3142e502af64c970b784ccfea61d719ccd,0ab4907a40a90ba89a1521333796c673961715bd82a1f1e189efc90bd5e81b800785d8889e7f24da737e6820df07dd944374db4165eed20a2324dfffadf4256a01,51c50fcae38997c13332b7f25c432fd317f92c24ab87419fb52f9a5a8078d0357c4fd9b45ec7fe01e7520fde91248c4d94b384bf97e97e9e3a2b8a72e1258fa400,b77c514ce724555cc5e0f4012c6bd4cfbbe0d8bd37d016352a8384556132dc8d32b60d23d198da620986473fdf0e7f622502e6f9a74a31a75a2aa8371f99d18401,f1517203df0f04040364776f17880546721ba8bef92fe9de133c9d375dbbee6e362d799903c5d88fa7146cc1d3eeda9501258e73cee792ac6b5d26e0574a92f101,3968f221cf63972327fc840c18ecd7412d0970d9b61448229dc4f01a65edd4c472b9d2685530d871cb0897bda41e21d9e1f2b497e55a830322fcc1e8c446f69701 +d9519e681af651cefa312cd699b7a633cbe0999e1acb83e5ef48a5f2223f80ca17f3f2d9bc984fde8c6bb0ee0021d33c4a230dd5f1b367e3dedee9c98edb581f9bb04f1561ec2ea439addb2dabf0682609d80fabeb3f2609f6f29e3ffe720caccac36bd5d4ae256f4ed93a49c2bcd4c2fab9971544ec672a43b9384e95b863276341c39841a10831c82c2e015e00a3c5095206556df42fe544dbea791796b8efdaeb38cb238ea7ad58e17f01ee7815,bd35e2fb3766d0a54806db077a02b0d43d145576092b74ec141de3924a17a567,6e1c084535f000ac43b0ad169376512aab541fc78889409ce850bc93b19435d324e8bbe1816eb7201be21039f7f0eeedec78fc3efaa57fc10ea5db23b42455e000,5dcb58b1d78ffb51db9982e0f687ce4e29df871894ed7aad7d2d1d74e483200004b3a66fd7fb0e02485314ea0a27985e19ce4bd3fc53a44691774eb94ea2bfe100,c113690a54d20ac7cf77240f6efadd7950b9aec0366410011c77b88b8dea884a74d69f048c81bc416a7ddc60fc2e6c4ff335fbfea86ef440a36fc4fab5844b0900,bb48ad45113fe9ad8e8353c28bd27abeb4ffbed6655ae785afe02f81e175b1d922c2f76cc979fb86b7d52180fa85ea65c9e1a30b401dae4ebcede65a6179880200,d43d2dd8edbb16db621a5c0ddccdc73ada48c9d941d9d7e219b51467ddf3e29162c1894a0089f6e5a929985f9613805171ca76f614ab2b666dd4147253d79e5700 +f945f55de7973dc7cceb4959ff4bf2acbaa7e82fa723e4d95fde4f51114e54c0b8c27555b5d7bf689de200316126467775e46348456c9a7e06276c6818cd3769a2185f1cfc2b3436263c6498595761c077bda9584a3e9f33e752f6f0a85cc53a5650b0fa5bde3b67700f3d7fae76a4e6f5612db6a8aaede0f4847ae96f4ab20c0d3679c8c305fcf3dbb58917ec2f343fdcee0fa089915715ef261407c1a7ad606795c23a55c43e59a4fa04b4be3493,dbca606b4ccd62eea93fcd430b39e147899d7003b0d176588634239e0418e436,2419b7f069cb5ff86c8721d5d039155e24595af132c0c8dd5b04f4065eacbe9e1ddfb6c8c3ffb228e8a787bc1bee6d506ebb0207ff96775c9cf6447f85d3406801,cc7c91a862a60fcdc6796028ebd56bc8347a726406528d43484278be4e2b8a354b5ce14eb753feaa74139b1138014be2203b16f46525439ed5c97042da8cc19600,4216825c583467cf5f1fab66b97334d1212e89078e12bd1ec6b57c4ba9323bec01748e637e829db6defdf72c91bcf9a43f0a7db4f108144cccfa000b69b7000401,40e87c827a3340b008a53faa705864f857f866dc76eb76873cef0b2e29b59e7107e1d061ae9647fdc6792263a36b99e8d465a66639f4d38d3367980dac99b35800,8412a072bd119ca928efb1a8b3dbc982601ab82c5187ffa8f0ed7760a5e5a9375bd7feafc21337e8f94234db9ee864c61ee278541c3da5ebd74d3a7a67b7730401 +58f6ab56e8f3b6fc2b4ba3bc52cbc4c918d6769574106863817ccb925eb5e2cac68a360c213ca4c13dd5fe160a89ebccd31699ba76930a679582475ba30b0d0b0a453e14c29fc09dbe752253971979403edec0a3277f98b25a1d208d680eceacc150804b787df4379c3b2b81ba4fdf25cd5fdc841e022b44eec0d311986ba5f752603ec8db592be1e4cafb7b4d40240fdec30e5acd1915908ce79b5eaaf7d4b57d9181c39db323a0be0f2c2542bce6,f799b0ec76f1ee0d779bbc0c068884d73a74b6921122ac6da76100e193167044,e06bdd11e0d2272ba28d6dc1b4da931d9c806946be28394c35388b50ebe59d3b2201218ff38a9e0b7a51b892fdafc16a92942d429a0e1c60afed8377994649a101,19bd3b482ed5743edde2d07811c4ad8a79613e7821e40b9970f8f1e317035b2b6fdc11447e2ecae1fd471a7d10705977d421fe4833b7ed1ae9826a21ad9d58e601,7d125341c397f3d7b8a480daf1c22e74ffb4c2cf2fd319bcb01bc4371b6cd3fa4d80f7adf65e2da2b65a0647cafb7f7a83e8eb9fd79ebf1ea1688080a4baf22400,27f84ffc1cc16faf1223dfa5e426a1cf2b187450f14030a6b0349e95a3d4dc440b7f54ffcc684325ff7b245d0955bb29f7ef7a060679ed1ae61ff5db5637f96f01,1998594c9dbaf0c6ffd61e5455e06dd8c19ec0ed9be362e3b444b93a7b472deb07f732b2aacc1052af16d99e0919538bfa37a1729ee4e07f6f56333aeba940b200 +b87dabe093e8a9b3504ce2672169872454124f4e1ea314121177c8bff100b33651777ad265f97e9927e51a88cfd5de39041349e9fc083b86fe843dfaad3dcfaea9af400df17084b9be82f0dba86ae165d613118bcb7aa3d6fd725a8e6bad0b38f0f86d8d050700840de62b83fb4bbf6c713603940dcf58edebdba2232da38d9bfe380afec189e3f5fb4110e75b618223b07b4c8b56ac2f4eeeca3209eb487c99c356eb3488a7193fefb0a57d893d92,0c8fa9bde74136eab97cd9bbeeeca8034b0d37a1b293fe84853c493cf4c1cce7,6d9c674a2688208976f6e2c41570977878d3245193bbbcdf5aa8302c9a80ed1876d24b49b9dfc583e33f5b37fc68e4dad6c2eb7a32c7e273da7dbcdc687ea3c601,067410569ac279710e654c500bb63f596122773794d708d74ab94ff8bb8c1b257fa28bf849429112af89d711c2b1b3c4a53c1fad58282b767f037892fe02881601,f735d9b9af5e28b39771b657c6fbf1a8b39cbda2418b28d06e6106a573c84baf5fbb2c50340f5351a344725105637ad4dd1bc13481ef9bf5b47cbda2f2edd80900,bb67d0af302e4c366fc6581d8e3cc75486a7b1860a0f2edbae8ed59b5dad574b712189e7f4fa36ebde3bdc61dc331ef2023b9077a7e11b2372772205ca006bd801,54e1cb925c4aa07be2323f3a9d9ec1f496374e0057564a208972663a83e2e23556da9fcc786f1d03f37b042729f89d806d025185707519fb2917aa16e671e47e01 +b0b79629f8efc4df8ea6f76f1f534e9e25a497f6b20d28c9f4bf5b8db2502a6507390635fa108f4f363558b187757b9af147a01e1e04be4ade53a29bd3dc637765e5ec911651e4e0aa89ba39521604c438bb26240ca6c8114f7d312b48b945cf1614b8e227e5dcb929bcaca3b53b5d02216118442006ca17c618093cd84458e0d10d21f2ad2bc0f636a32347c4ffe490d388dfe2c4b555f60b2d789315d10b3d45ecfffed751d3247fb67031a298df72,fa4a40f4d0d30e770a13858651143c91077209ff77316300757f10256b8f01db,344cafd1224050b0c57bd8d260b11c8bb62db65e87917dc263eeab816aaed09d45ed72585b31ceb445e7a41b7599a13ff5b911e33309bfddf08922ebb58c3a4200,5d025190d4d20f15bc93acee9f6d2437290c7f8bf6fc210074ae84b675f1eded39aecc55870efb98dc27eda5fbef8bd00850b0b00d50fe20f0f9e316fe2ed23301,24d9c688c64e11d8d825363e1d721e61e0f2f55437fed514318f55b096b2786a6c91896e1cc0cc78c053c11b007b16db8966ab00988be54a2ee367af91158d2201,5cb06ab79f377c772a2bcd640da3fb710cd654bb59820c50f7af636e5bac100e564ff7dec7c58d0fe4a0659e93203ce55f8262fba592ddc1b13c0e175df5f27600,3641979c6d883afd5ce9dbaa6d1f4057cd7647ffbb4cf9066d22e9169f84cfa14fdb3d612c460b7d8b8ffbda3a3943c70ab1f989681004d03f90274f01a6c7a200 +8a7d3e9e129cf7dc43fbdda52d9214547420ea3a30b2b98b58ef3d4714ed9c62910fdf93abcb578e7236560aaad335aca1435e570e972e5f4cf4a86a0fbd63692a149035c1b9a4a23e51b653b3e8248ebe48533f15a69f04befe5412550bf351211c9048dc04accbcfcab092b43699acbbeb002b1004fb04d4ff4e66a764af835f12fa46ed5f2b6f6ecdf978c9734b69bcc317f0c1fdf44b42f937c36da5ea5dfcaa6f556cfac693a2bd51d8eb67c923,d9cecebf4b425a8e1f8c892e4147e7c40b6448d3da7221b6ae7579fb0931b5d9,b32ad897dff24c0c4bdd96ba12a8fc066a68599828bcb4dafdee6deb526c9a6e07dd45f5eba7d85dc2113289d77f2fda107b1fd1511a6680efd7aa452f26f6fd00,e4c2218ab29c2e18d3c2edaa808d4f94f7147cde3daa67c9f1ba4170a95943175de854601ab120ff4de72d3380db4f5dbb22aa67a47797dc6beaa0230f0bf67400,4a8145238d39e54a7f81583cdeda6248ba61d2516905c858bd432d8fe489d4dc288e4d9daf891872a611e051950f602f4278dff1bcbb61419b5e6b17cfafb08f01,bf6677a651993d0e607cdce2ee1063a00465b31d9552b85b797e1bf9fadbc91f72f150bc66ef212b9b888ff429d7c702347adef73e129d24c5e7b37eaeb6ba7200,1c6aef06bad1c5f681791446480967b47edd246d48768f5dbd11c70f1a3091746369d4751b0f5b523c8e97924b8d5aece929d329d33da38113a6b04b0722e5c600 +f21d0c34440fc0fa2d4d3566aafbcaf9e0df4ad4fab1b59d61f29c5bde6f28b59e707bf350480bbe053dbaafd8e39ad6ea50844be854f851c458a89426366b2b3555551d380afbfe0999e29d9bf8bbff446656dfab99213ae1c3201dfaef62c943808ebe8493a2503f4026c00a7fe5c431d104aaeda51ace5dc9b43011e39b66cc33a66c55f4df751a259ff2dac0eb6ff8daf35740e7e9ba952cc1e4a09292cbf8ca2d8ccc1a94171bfc26e56fd576f9,20c87ce1a9456be572efe1bbbed35d5fc410bb27747ea7b914c5894f3d3fa5d1,9ab468975a31a06cf3b86e53697653328f172c91b91f723e14fd4f3738eb2bfa13f27f950a8c3b94ee18d243a4eb6245523cf69992edb8ee6a4e673307844e2900,d1a56179eecf74a688ceca018b1c47526a314aa33e3ecedfa1fcfe8db30ecd964aebab43a16532b7074d460f2b51796bbbe9deb00a045e4b4f14cb33e9bf8faa01,79899faca931c54103496cca9d80e4052906982a5566a8a29b44280928136523659db48e4db61be2bd233c8fec4636fda715024714a2bb293bb3f7ac3ec7337201,0b0e9f868636ac2e86a832ee0ff1d87c411df1c8a30f7871dd63c3da7af8fb4b0f6d7e2c0dae99180e1ff404d77471f72da56d1998e4c65cc1b4abde7a4aff2800,b8291e18a2b947ecc56b7b807e8b666692f6f11fa534d61b0a8ff998be8174db6ab5a63ca35e50a301acfc233ec762877c5ab7de083bba50329ceaed9f3a4c9c01 +c20a32055dd62fb13481bff8098a51fd6a0f372b42995deae5ff6c2df05cc5c4e9338da4d15190593959bfd075dc2956e6427deea2fb663eb31c6c32f4d1fdb4feaee2e16387c6960126f639a6f7e3e6bfa54f1c1b79d936d2602363a6ce5bfa9aad00fc15273f86d07dea3d821ed7266f70ec2a0dc829b74dd8e5c3e0cb21538e4b0569123c2a65aff98929b6164de6a0b3658c589455cf3018682cca46f9cee28f1b2266008e332f36bbf2a207f4dc,2ef8d8e4d1687327744b9c3a80670d782009128b5b801aa66d17abede01c4c44,e5313082799bf8a6d0ff08ae7e231183d42b5f6ab2f1bb76aa4dba8270a9ab4a7e8226aa78421b8146e4fe1281071ae8956765cf8b480b305f59c5c77343377b01,66ab5096d45dce2cfefdc41999bd80ca96b6ed67cd76d3317d79551a2d79146b4f56f4d79396217f59f712491bde90ce61d4c78d410e28a88c08243b11a46ab501,8876f9cfd1dc6b6498c3dd373c2c25c672878e38d09257d93abb5285e5072be458bd47afda28e1d55f9f5ac09f270bec45bea3cd76d1787acf4727beabcccee101,2057c4293debc174cb72a4ab133409c53864e76e6626b80052d76474719c31a16262a6f1cb43cfbca9c1da63c433ac723cb12582c7de0cf6d44f1d6b16bfc8a800,be05559d2fc57405e1ba46c348c429ad056618d151dd7816d16391dc52d791b83b64d32f07016b6980ad468d2df476d66f781562d62986bb16ce6a9f2d90782300 +17b9c018a10a8cfd03be8efdde37bb36b5b661c19e6d1360ca9a3c9c98632e593a9f6f5e064ef1b27b6a010208d013f0a43c69190a91a669f834952d4d0e0dbdd80c494058d094e295cf4c3ae35e8b71fc450dd1b1526cece924bb89233ad10444f464ad2bc47554ad41f377ec87bf2e74779183f129306cbff58eb533caf4c6660b7550cc77ddf063e090d92a19cc80fcd7e9536b4a52d1d512d6db2bb207a47fed887b724780945903b353af64ca4a,9be3300656b61b6a1f925bc52c32ba019ec6002a55ce886bf4275f30860446a0,9d35f83673acfb0f47240d6ffda8ddc224501c786914d9d22f537514d2b8038161cc1900ccfc8be5abae7abbb86932332a03f1a821fe4f248f3a4430f01aca4d01,37820b73c5b3271586230e514c170498acb469e6e0ca65aef61004dcb613ad315214f665a5f93686e1b2c8de8012ed583a92cef38e5d921d17effe989acbd30900,4522f59a820e95bbe5cba42828c5c1ce780cd410d474c20091c1ec17fdf5b3bf3dbc407c77f78616c2309fc33198131b0d819cbf0275c6f14cb72b141f0e622000,5a5b04127437b9374a39146ffa4aad4068ddbb7884fa7851b13d9659cf4f1e1b31f2729158345e08db33d40d1e578f418e959ac1121f1e28e0785af09a19fd1601,0732b5d8c479675edf15cfb2eebefed69b49902212444f33ac091516ee0d8cef710e606358fc2382516bcee02d822814169083337160081367d7e427dd361a0a01 +4728eb3849a20278cb74f5bbd92d5adae185c8bcc922753cd45e7ceb0173c2bd06002293526c8abcb5b66b9028bc37315e677b1051fef5fdb1af9c4078d912c8a118f597fe4f529d8733b1f02c80de3de409ddda2715cf20f381c750c5db2a92a58b220631c88af2e41fc73a30afa01a8b4d76801fb6635274e6fb82bcbc73ebc472e8acf1f91e03038d66d36b543e2ebfbe88fd80136cd0ad3e9a2ec8717e9224e56196bfcec18f572da6792606ba1c,58fbdbcfaa5176923994fdfe225b8877f25f0c193c3d59d728bae926158ef18e,654e923242cf35fed9d0ccc846967d1d9b283d786a2135942100e23123148dc643da31867049cd9e20ce972ebf18020ed30b36b41c0aab81c586e156a90ace7701,2340659e1916b3a84d9c9cb721ce1f69334f63ad60addaf455d422bfa45076fa2b75b49bad1f54d208456de50f7338a5bd4f9b24b4db7f23d972186e647d324400,56482ed1301bff4aad76c152b014ed5164ef322eedd69342fde85796d463b3c41dd8b5156923443189535fd426e1af4fe4894af8c26cbb8ccce986519a73507b00,0d7dd117d737c9d74fb7f2a7b3db3fd1510a9f77bc7d598da64fdc973cb366cc5caae02678fda5b3ed63e31c626a2d0003622bd6db676067e09ef5f62e7c5a4100,ee3456875672668231dae505ced7e171e6828902ade2c32cd3b236d39a156c561728b08387697b005085ae430d395ddb0860cdb94fdd2a47ab61ebbb0d831f2d00 +27a292265446ad5b7cbed4a33442c6f0795babc5a17fce4ad702b4f403c595261db88a49df2b0bcc263f1e3f96cfb1c59ed8a4be170394f2012c22e1584fc8b24652789b1191f4b9ffb87fbb12d40e6942323db0732f83a0bd1ff3df962972936b97a3306aeff540eb4ab1fa039cdc7b9206f3cdb4b5a807e0c551c3fb457ea95ba2e5fe68b5d4ad88a2935acf3e947dd0d11e0bb3bff7cfc6be731dfda26600ab95a56c4d69f5192e2c999a0accb368,cdb866f12e47aea31e8d0fa56f86735f62d351302e29df490a7b212419263071,c8cc3102b5f6f1068286a09a0f018448f7150c7f44ec9aa7c763906f572513ed124feed102909dcaa0eefa7d0ec1fc1dafb37a28da9e7b80a9836a5cfad420cf00,8f9be682bd37c66d367b1d47b224f186bf760667f10d4bab2b95f97a5f8bb4ec34b220c010b32aff7d921f6af2b6004fcf8d147380452f83d15dfae5a1c2f93901,4f500b9a3d87a618c6928290d08121db966c90adb1fdc7794eb8f1206294beba00bb6a6b9ad5f09152f4271640cd0004f2d92f778b884eca0fe29a34e428ca1f00,620dbd68109c84d2b88709cbd981afbe97580a7df617f9766bc276d1f7ff508866f97a3d6206f2036399625d018e946c2965531cd5b7fd40df7173e1fdddaa0a00,42058a4ebafea76ebd0801995c69fd64324dfbcc0c5aba541b7cec8cc3a41c556f01be9d9ed6c2509460560d3214f2641a12117334457c47d946b7137566c35b01 +954710ea1d4ba5246b9917af24530ce1a2a083bfd51fc22bd9c635d0209cd8425f5c6ca94d013e3e1357740ada774400fec50f42882acaeacc58071e7bdeb1e819a0a46022f58db66dd3c0c8461d5ae6ecd373eec8d646adeb122b11dd0edc38c7c785a54cf5b924ca92031eea2714c3417b1a8b626b3ce1314a2e24bfc3709a38bd920ad3b08bad2b9da35a3f4f307a96c8b4d390c0af9bbaa688764d72f5af64419ffd6fa818d3380994d7b179fe9c,b5f2b767abd8b285fefb9d4fd4298da04120cb4f80ce8b39ecca5a7d7e24a7b2,b9fd33e0f3e8d14baab38b99c6bc38109ea294ff75962524c3342d1bcd7dc9202c4f7d004952f222fb500c8f8b373df6309eff4056aa57e2332926cc4b7d4c3f00,0d2529c60178b9bcdcb87bd59ceeb318cc71135504f5c0aa2df0aee3e28b885306c0d8b3485c0da4e0da2e62df841d9184096e06070fbd5114fbf8445e4f955200,218aa01952b153c3413426c45231f9cf18ad4a0b9c8d1fe252881a88b75ff3331481880943a48587009f2a87a3147d81405fa0f5e89e85e514f46ab3c7c0da3f00,71cb6d6e5cbaab26a539a022789c5f7a9a1ae70a45e7d23d24a5644938f0a56076b2a8ac192e31a6448eefd8d65e528de9c9e00e8f5cfa9f156a3abfaf6a3d9001,d5ded4836d2ba9023084e60f94d70a8befb4ebc0efadace0afe152183ef9a26766494898db29228d11c6913531f938765fe87fdc76c8d6e974023e29ba31374101 +d2316dc19c2825b6890dbeffa53b39fbbb76f0718201a4de49c33f44456c18d7679bb742778f7c4e78433c63c11226d949976d7176172acbcbdb22398891463f5c4d705fcf84f89c3a6b60e707a1e2a0388a3f4401abd82ff3fb6702808646976bb561135ca34e1b0384a598b36e7f226ceaa39e745fa29d3201522b480275b760cde64d20ab488e803a7a9dee944d58763e1112d60e7fd353ab0836be96b23d913bb1541c3111356e891f74930ed41a,48b41c6bd1557454d6a8255f9b6d911484a9727017da4130bae1228420aeae6b,80323ecc18c5140bc3ca0bf493c0a0572c92669cc586887248a1e73f79d7e12f6025d5b53bc6a36da08fcc31756954f141a2eea8cd10cc6ba4f1a32ca44d0fa001,47c1edd160b8bca0daed483ee39adb393b40cefc94b2ef9bc5036fe9ec5573ad51091e0b3e2c69c54a976ffa5c40b030337eb86d9a8a7fb241e70bb86b40d7a801,c6a7bcf9aff442688c84557f08c3f01de58610dcf9a1ad41c9e296270851caa230451fd66f02716388400d4975643711d9446872b6c2dd6090c1b5b18f69cf7501,74e34a25da8b3436676635d7a3bb62bae22384748d594363905caf1970469f871668175f47780305da46bcb1d5dd1b848bb546ffe896911d39a3f4de4dcf3c1401,3955f441e11b982bb12c4d5f250c82f808aab7d35df0d7df6adb5098a200608100eb42470a9baf9fd910e4262faf57750efd5e4b2848d7d956d4f0a80dfbe47700 +c1ce642bcc113e8267862fc49bc3cbbae5bf40d8fad47159c018c5a629d60332a3668bf852052f4893b4907b55235650e6a56408074e24924a6251039b0ba362bdf119f12bdc349f69fa995df736eed7fa736c35256557ba87c299c1af4a7791246d9b2a3ea1bd05a56fae39090db5fa23a4bf5fbd064af22e81db63cdafa89de3470fcca9425bbec65fca3b731cbd1cc7c191a8d57f370c9c6ee9b1b7b2af5601b7bbf3b2032c875ed59bc0ff60765b,5299ed5222d8fccfee80d643df258abc57dda6d0129829c4ec16ef2dc470dbfe,6f6299926fbe84a04f30739d12c8edab22ff0754ab03d75240bfb4ec4c7bd3fd72056110abc9cae0bfe0f0eac18bede232035da2f51e0f8312f146e2ce93af2f00,b9d3f45e730b7892381cc3c50a3385604668618c9160f538bd883899739fef052abc191e448850b38bce0be6d208de69e262127111fd205c1f3ef2e0c793139f00,c5bdbaddc50bb9f3909510fe7c25cfbb8685a96bd03a41997ffe73c9b8314832523ca3fe083389b1c0e32428580d56b1af9d72e70672255d8d0facd53f98573a01,c453141576e6919fdffce9906f80227b23db7c294c69a8991662dc6b893450e6289547ab86fcbe9fbfb31532c1c61415f3288820269d95bc3a1fb104ec0859c701,f1b07f662157dab786acdf20e1e85c0f8ff4f10f05c8cb6c77d49de6a29c4b8e531dfa8c836c16b364ce8b2237af3d980a90ac1ea17cf9779f02deba085acf6c00 +812a8dabc1e1cdc2f456c81b35965f17c8f3d188dd2deca9ffb88617206b7a500edca632b50e0875be2d43a50742de5781aaf1fadbc4047dafc22211a4ed844da523b1e27970c2b659e951816ebb906d6e0c993dfe9b23f497d094f52411d2445a6b7d6cd5a1e417aed318bf0f9dbb7a433880ba5b63cbecabdbdeac90a6ef3b2f7acf39921d1b0d98102b5c0015cc44e7eaf45bfdc42af5575561b266fdb7b308c3dad740aa0ea7f064309db3b3d0fb20,08d95cfde39f74c6914a4aa6a60ec768ab12c71d1d9dd0631b41653100076a52,dbf4715579b955d35b58a3d297ce85232d64c1245a6cf647d77c00d07b267f0442b1fc64016fca70580b23807acb921522e81427f2c8675e9889c1fb03f05dcc01,7963e7f16efda5006489cf31059eb021429c7d1bb258a0719d831ffc3189384a0ae724a5b52393cf2a955c264e0145ca8e4a2139ba7d1930cd6b8a52dd67eba400,4ffbbaa04513cf82947326dddcf65d0333d18df5216fb02c0f7e718f38552d06459254e2ddf606a2fd8e3371e8ec7663a5e27f7750fb76eb0a882a029a2cc5b800,53d64f640a466b4113511413293a703c6c8a13249d06d5ef4bef15b5f4eeabf67631a492edc9fe228038d6c0018c34af6136008b3128e4c8947df139b121636f01,c6a58b1d7faa060f56ecda2b19dbcc6ad32e5ee0b19ea0dfe143bd6f777269ad7632bd78382a71780737aabf96b767d28ffa76dda82011471d2fb4bee722b02701 +94b359164054ce9bcba79e5f482c3cd220fd3a53f72b87844aed335a69e31f11145a243babe03aa1c24ff31084de4ffd521654af5dd43a626355218bf597d01a27e627973dc88563e9287501a4798de1afb1e69e697928d53988ca7e15585b691829da1c8e7e075df0d069cf3f9c6dc6c4dd03209b8e38cd8ee50dd59511147e554232f99b7f31190b94ee46f421a83e66d6749bc13f917c52fb4b96a05f90b1de7f43c1a1ce19ad6d115d029668c52d5c,7cdc301a773c875add2bc2bb410d72b09f965f29a049d0cd33fc3231f2c36b87,03d0cc1c4b03170d2eb59b5fe14140d7b7dd2e927818af79b71d64470e4478ff706f68c1404a419971626bd1b45f08d06db785f65f3a94c5e86e4f4e4dbbd2a101,08cf18bdc335585502cb648455a4bbcb3d6862d455514519e3ed3f644f4c9d81148fee8f270e925b1a3f130a026678e8354cd52e6b76589c651f991711c8442501,23647e848c1ff0ec9c297ad729c6da3ba5fe84e033f3825e598782faec168e45621ca1d2cb30e0f1b3236c90a4709e53a20b748ceecca83868686576c612d1c801,2e3958970da5eb31bfd9ac3a9b07690d13811563d56f8ba23073fe6df30c9af1409983673914ec5bda330b09a36ea4482485a7cf99bfc352e03f801aadebf9e401,2428c2ccbe919ccbf5ae4d7e777daa348f4f71a000d9668bdf48d6f5a746adfa0b5e98d7b29b0d39f804d80b5c07c91022a7b425fc578a40df98d7f662a07f7700 +8e685da6e19fbe34ee13dd0cd8bb57a2ab21d0a60dfdf519baff7e94f33c5daf835d35f7bf118882d330fab3158a7c01eb4a8667ed3e10853e0e6554001d28e4671b2dd8cc99293ffa2f5df50c14994d2e6a11a495c705ba356f19c104b91e7f4c3b3a8f3ecea7576c87943517f7f09536f633fd3671314908b76bb54bfb9182dd91af0dcfd78c263e9681bac4869a9b04c96ff88a4676ab814a4df9f58430ff6b64af6be0f585e8a0a05c9fae1f0629a0,888210df163cd8e947eae40342452ec4bba6e196f788b61f3a31703b75973054,0df51b16e662cc2afd818c9e33fe2a98215240a1fd3ad9a82c938ade449b1b833731f793bdbf4fd22865b8ced2ce56428d075b55aacaeca618121a4c23a3984a01,1d074d73c3f04b82138d77361ca20b43b89f28c86ab84ad17248168f4e27144b5c0faaad92f69056b401607c771390eb3b0405c51d9c0b1d68397b1cb6b7d54701,cdb5afc9f419d8bd7a7e6f867b7423db83e96eb14f30c8fd014af00aa6f45e5805e4289b5fc41bc471b81ba395d4fbc50770a9541de36535d578b44b8f1618ac01,3066706a3b438473c82a0dfe60690435e2adb4424f4f5a4a570f032b74162dd251e5a996803527385ad069f594389cbe5795a6c8ad8ef6b724d25579ac146c8900,19649962e6cc9819d4d904d0bacf6dfeddfde96c924bceaf4eb39005cad2d20e76825c6432856b858e2d2cca2b96b49be614c7e976cf89fba912cb324082b9a600 +5408d09bbb94e1cc6f16151c5f103d780aaf50ad51ed587697418f1f30437c15b4774b243c5fe5f79d3329665f56a2256d3eb87112614d1eefab20dfce42ffb477a77e7f5c0e66ce07a4e343009ef2105398f07abd286a16ed262d9c9167c35cc8305cc27dcf17d24735e312c1adb15e2025df62d20db454f7ea3d2418043daf1b24adb6dd5989846bc95e2e5aa446154a2a890ac92e221c0723271e946f461c47d77231160407ca5faeb0772896ef68c2,ff2e0bee73fdaf195c5685758cc3731c421b959c152fb8b4b8b09df537c803d1,e7aa5e7cffd67dae28d3bac99858a73c2fc5240f46450a6a338ebb6a476bdcf55ddd5f752eba62038b24ab725cf2b7fa056a8a0fdd93c6f98ad828e2f5bc1a9c00,d67a0cbcdc83cf0090c365db3d2765b598b1aee205be0af273418dfaf0008db644ea63e957eacd3fd0b678f658ff395d6787caa2756fd3488ebadff6a5dadc2e00,b61bf949b1d11abc15e689e90b3292d2cb107eb21bf7b9eb301d46d041ba80dd270d0dbeca1a1f64112e1e8d5837806abd79cecd53daea558d28b3b976dd8ace01,fffe24cebbfdce6aa9c0473af0da6c1c399d3c71912243838503852e367a213b076818c3b9131f30c37dd62de7e0d25d272589046be927a77836b855510caaaa01,f0f7c2a8f30cef83d59bd418bafb77c45c063aca46f4ad1f0736a17f09e1e6a12738411116f3d21692ef1bb2b938a7d6e44630c711e1421477fa63e4fa2e954700 +db3cdcc4eb2d6ce17d779d5e79959328924a4f82097d7b2c1b614ec2248be402ec6d3e9698939ade18864aeac523657572af5dc98e5455c1c5bb310205a94072fc63418527b4e93e267c1142b71d8dacf4e749f900763e2bb8ef5dac7695ef126ad1f8560ebea92984e894507b9bf211d9c1fdccbbff4e1545da3771ab83247d37572afc8b539a932ac995e85f48fb8637cf688382a9f18d9870828557969b39f9fd4072943908a40dff6cf0f54f2b554c,b6f730ae444cb3a13e2e14850ffd76b2622b86077016e8e76434a04790bd92c9,3017ae59a3af8db86f1c491abe1491a4dc0cd7dc11e5d9af44a7c8c2ccc75f5012ecac83a804b21bf54e55baf23bb5e1319423ca8d9e49a784e4f47b715dafe900,94c7d0fe231cb05a28f12b502d71499c7d33183b1f6003e58a412887caa9954a5212bffab4d7175ef91b863d92a11efbad443530d75480421d85c6d145a2274b01,c4062f21922aa672cc8cec6fe584a443098e7e44527cc904421b254e5e3065b03a47ca42ccec7451cbe527807d3bcbc1396bf72c237acaf8349977a49ab5902501,777c9fc3d7493cf98700632fb7699455e4ff77f3d89be892288e7d7e1568491f33e84bfce40e7756ceb3ad751be8bd2bfb9b9b80f23a473b33cc88a119b6c5b101,3ef1518a648ce85f3a44037b82b0f14d9ebe2ca323c0a1e6e1a0a57636d9bd1554b7785dea865cf57b0531c55e23aa37b738619b37670f40391bf662d3e678c601 +32cfa45d5947510de3a4c552d8e18f67023898ccce2575958db29c9dc608f3f6cd2195aec86b3e25c6ca454c3f5b0c3f3b672d9cbf7fa38b15bfe2991cfa3076531765a98f7f54f41187eaeb48605ef7c10adf935d4ed3ad803bc90015596fc0bf9e66cb119a255451ffb731f8c49047976d5e154a87f5fc7501f2119f25070c8ad6ff869b478cc33c6f6d09ee2208ff52c499c837d8ba26ffdb759c68bd519cbaf9cbf086620589f4ee13c40d981b4a9e,4b9b6eb393ca4ceb4a636e576f5ac5ec2ccecf3447416d753c6f3c05f079a32f,a2befc44c47840197db2b91450833bc2505e9954d04b87b1129cfdbd8ce86a8f540d75328811ffd1eacf5c328971fbec42d0356152339c461dc2777d6180e5f601,13836a132e8e9292a132ef692bca36fa633b161e2f20c88afce32b2a41059de8602e136eaab5df11842d33a6b400d66c6f0d96c49f3098ebeb448c098594ed5a01,6fd27a6c3ae26c83733d9f22a6faff608f5df337bab13dac5bbd8fb287f1f76973400479e2cc4787408ec18d1b227a4e88e7b49f9f535956de284e253b05fa3f00,b14d2d39e32b97cb899fd07981e812ccd4f42330728e3040401739f0d5cd9fd91a289760c0cef1f0c5742ae89fec7762c74857b520da151dc10f5f287a6f27a600,ac9e718c5eedd6cdde3b641a5ff5c45934cb59cfe50cbfc1b08fd6cc582f5bdc347e28bd5187723bd9511dcdc17c49c1416a2bdc62aff3bfedffb2b14f3652d900 +73599680ca962f7764ce4500de4454ef4ac97c0abe65b5b40f08c39152e385263e5c09a2c29b0dbb9c395c9a245f35b7eca87062712be8cee236b79bc48407939ed14c5dcdd8f9756c610237e7c46a0e785c80be5328c856c09a2ce55f9de1beee6dfc13c44e914889b3631b695612deaaa728bf821ccfed4c3dcf4dab16115d7612a55f7f706a8a9c6f7f6c47cfc0234ab541093534159b8b5b4aa78ac2921f965ac59906881118436ac809cdf73e5850,57320b3b3ac662499e4f2972735fa134799e55a4af0a46f25822842338021a6f,7dfab9672acee80cbbf1857f5af45549dfc0e4bd4c0f65269c96d50e9dc4b1111b1ad2d9d41f46d218d6c3757c6824b13a2b5bf33e67c75c4c93398a2229bfeb00,bfba39539fd072470bd4eea7497f32a8584d21e4a791f34e48d75ee4ed19f45a275ed4768465eeb3449723c0b3007ce06d282c0d8dd7380d3d18d6cec66f487e00,8d9c27b38cbea2a14e963deb9b3143f9788aa2bcf28bd6fef2634e78133614f406498b65630d65cab6829042e6443f521fb33cb64c4135b2c32586485809741c00,fb208d7431ef5ce344d13a1a7c7118798094ae9eb377b0e3b526717ef1b6eba804e4ee6c31ec592d4de1582128c744423b037fa7fb24f7f6aec07e709b3e979501,867ba460b7e1f2b0c65edf44677bb1ea92a911da85da8387e1ad8acec93675f839a55b6a316126f5bb2ea2a3a0998f732ab6d076543e27c6e5cf51cb8a50fa2901 +64ba4d4e5884ad2b127e744e9741dd971693ea57f921fad0f214aabf1bfec7e038bdca224d54608c34e5df235b0ecbdb32a6bb1e824ffa80bfef1ee182ab558306a334d815a7da050450f18da72c42f50fa53120281e124362f39157d4a62817f17167f8e2e8a720aeb46f93522c86b151f4d56507ee5c5562d7eee9c0b24b94b83d28a7496f6f777ca02519b284af4c66f25b3c6314eedbc87acdb6a8e7c4401808d811261a218d0a232fad0adcc36c59,1d8fa56f16b47c29b2e6be679ffeb961c030eb45e9865f9c642ba4ed307c0de9,31ebe921fcb5ced2bf2c27f6ced167eb2a035c39f23b553a9762a80d13a1365665e48ca6554a5a5be58cb19e4b43c8865d4bab98a23abeb57944227e5e893cc700,1c3d182a199decac638ea47b5fb8ec60a380a334d474512fe6aa16f816f339b31f04697470450add34d3445d93ec89fc31a0e65d0f93bc76a3f49732a0895a9401,cc627202f3ab59e0c0ad02a385685326b2502c79bd9a53fbc5062ca4947382951db5178b8901e953c5dd710034f30706624388617236be8a1457dad72cbfba8900,8444c03ce700b8b2ae89e460db6f5c3a3ab063d316dfaba185b9231f14c93c4f12378c884b7c0410ace7417c11cb532641efcba94eda6f7d17053aca245b706801,cf5dce30b5efdb5f8521a280dc635abaf08426f6bd510dfc83f43fbc49eba5aa59a997826cffb118ee379d366afb7e5b8ec3beb0ec6ed10e756c20606032faf400 +c162981359d35342df0b2816af68d3e5a9987a92129b83ccf80e7b9cd5ba8e18c85f6573221a3394ac3229125e94f677e08d4637b0643abf308d9a848127b511299836f93f16aa3f9038e2fa78a6a3cc3c1c3922a4ba359ad6cb10c7cc1f0882d97a7c99fc3d53043e220a8a822a79ff0d89da07e1c7bb9b452e3b0cbef9c348a7e94900a3ec31b0301afe53f6517f5fa2033c9439e968eb3d47f246a4df5d1155d27923bbf41e441ec56dcae14069a75c,eeb4746640222b7f64b7611e6212ca46ae0ced1cc2997adfedf2b83800b9a1c1,8e47380d08b7368a16638bbb6dd0816f77fabbcd274ac2ac0ace2ec861c72a7b57a388247223e475fdfff6ca5d6ba07b20c32383f6e15454e7d23c99900805c700,f5a4d543785d88c185498066aec2ae99b25ed758ab518a13570efec69aade9076bcb6392e77556bdf02cfa2aa3dc8e318fd77badf0d97a65fb2525f7584a742d00,37c76bfce57a1ed65f41b8673f6773bdb9001dc2b6fa41c7798ef8e23790ea0158c74977c15cc5037a7acae1bcb9b553e405c2cbf0b3bd538f3da14b569b659b01,63e27b6596f8b0d8a2ef2196bbeb0584d74d4efeb0f1c4b00322363a94866a3e2278ece17395f487dde840933c2dd72339d60ba0dd4e374ed7f0ee3cb1da52ad01,bdf26cd5437706eb08570baab9effc197e4ef4b77346bc2b53559b133b66ce5a10014ef851fb6fc779cbba969eecbd5e97de12c9fa8d9de465114a0a45ad6b0200 +5ee59f21dffeb31e35ec203c5f31b6259ea080fb7ca3240cdfba899a3327c0edbc367ade64cc016532fc1e2eb7108d6adbdcb93cab38e0348bb62331b268e0a67426d0dccc17a732fd4f93dc4f1173b252d7743cd2ce45a904a8193f17546aa7f1e0b0632b4438d8028859ddb8e448b8e6263d80de0c5e47c9837106a9aa2759702f3fe849e9d1c9709e0a3947b3569b1500137a60adf02dbd3e627377287c28802145049611a36c733a0cbf089941a135,0b8ed7d1d9a234d2a0d925b92b352ec3adc0bea3bbff31952bf0783760d689c9,dba9bc5d2208c8aded6fd68d8aabdeecb4cd2742fa79df588cfff15f2e129dc131b6ff22a9a3e6cc23a64acea6f3f60fdf7734d7e5f7a1b18f207426ce8e38d901,bcd9900827468f8235851696885cfc9839b5740e4690d9b4f98abf9974e8bf1619afca114fdd21491b41fc650f7e0853a27c184bfe8b4cdc1246639265dfde3b01,b1cbe55b390ef091f328641178c39ae38cae9cd944741247be83232f8706859d24e0a5737783a329dc5d432b7d2231fb6f8d7014c6b9a6bbe0b3393710e9c16200,5f6719b2a2806d695667c66999292c4cbe808eec02d8721c66c78620695d323045dd83e94adb081ddad0a5a608de4761bda3a42a83f01edaad4203635db9d65700,959460537ebc6c72f7fd7a786019445628cb14b5b85ef08620d56cc5be17dac852ed47b14f9b40df7316bce29aca23e0b78c567000831e6288328be5a72d1e9a00 +90f6a548efda63b09ff455e32c2e0dda3427e570c93cebd4c2801834780f188b0a21ba1f0e1383dadafe89cf3a6f6637de31289f57bc5acf9edf228170191787e0fa0a2b01c53c39f4907040519b31930baf45163e84ed46f6b699b814c2287ced24ff00888d8bdd7b0e198327e4ac3154fc3d91c11875b550399ad47c0857c2d674c4b7cfd8b5782a06a6c2b46169d876bbb1c99776c955a9a7a0ef4c8c513eb2bd0cfea8b4fcd9c0b6059fbf74cd606894,27a6de339aa99ab93cfa0282d14efc99b09a3db38568d7be4bd26fa4a22f0d23,af6aaafb0700c1ac4501a460bce52ad01b566e268d46f5888a6c042e2b9a5c842eafca1a0d8e9c91aba0518159b41a1028fa461faf67cfc075e434836c81896701,50681cc24d04ec10b923f03690d449c74ba88e82df4f98a4fd3c91528fc09f543ac5a6c76b46c3acc0f6a4ebadd2e1c9f008c37513cd7c0f8410ccba935fefd501,e8822a728846f07b42d1b473ba2680bfe62c86422195397644cb9fccab3a663f1eb55623638b97980be0558e3df682d225a78278f985803cc919819dfb32c1c601,c081635de96d34682a05a80739219dc6cd1f3e93fd056ecd406d56a657c890e617f418b2a362588441953ebe25653b7ce6f59ecd336aaded18bf4f9ad83af79a01,9d7e99cd10a4ffe55a6491bd2ac7b1417e420ee4244d0fce196a2dd6919267761e7aafce964d2ac7b4a5c032627e29fbb10152ac2defdfc96d89c428aab86d0401 +b7dc5e4ea96a6eb6b48b00a7e2c7b2c1a145722deae09abc8fa39ae63226f1dc212743bc345fd627b8689b7d56b20b85f53955db1a35eef295e8e448527cbb427eedf74e16131abf84a6d9455863318f722afbce6639a1645ce2f5efd580aa32156edc1090559ca4a586a4da8715bf17a41148c7ae149cd7080588a885e4bda79bad41ac820c90de558fe5bd1f87daca2991594eb04e18a0ad432e8b5be3e60168c0fabfa9f6f134e6f94f2f8537e3b2f176,2e304fc1e39ecf209c9a351d06b7806844be2ad74a796414ed6c375ace9125ab,c256fb1a7f64655a6eefabaafa86eb135bba2b70ef7de7f837b40883a80578840049383fe346871476eafa4d264bccbcd6cfc767b5eb289ad824ff2eaa4390f801,e637eaec1fc3d01035135b237e4ba02a3f977dd0273fa42ce96b5170d419b9603f4982c663571ea16f87dea4be1cd66616c5828af3e1ba6d7e935d33cd9fd70900,45c9d60c51ff31c817612d9117ad17d0f09fc9cdf90be434248baa533485bbbe0b72d67b5648ba802af7a2fc26bdad387c5eb69a5c35ce5957f634f953cb6ba100,8b4143c5938e840cf464010795dc473dcc6c16db17a336187da8841bbd2846c10fb1306d46e9ddf48e5d3c71a6baa86f58d60bf189e9aedb24f76050dd5f26da00,275eb87108897a03d52d4bfc58c30ef4078d13a1ca5e4f0465d11b7c02282df32878aabe1b41a8a6f9a331f568e8366855462ba4e06721ae4c08cb6da7d4cdeb00 +ef8ad5105540632e9c8e7b4bc3cd2fe2a4cc60649094e23f3c41bab50d7ec7c05510622047f63428d9ccb1b493cbeddaa5efe1c16af83daaf54d0f04549d70417300e345d19bee944cf3877ffd1a85acb780610bece4d4276ef5c71122d4a1e309444668d9385c343afa87370bf42978b3c22c5716337f16f6bfac2b2e2b5f6ea775238dcb279229fa300bd538cfc99f6c0dde4590cd8e9621c131495178476db0bb61bd56a95e3ff4ab90221be0e68a4160,0c52e7b34bece196b8eb287e0916c462638701e42bfa88cc78cff82da2c24dd3,afa1cfd347b3e681f6f9c254b126dd32120ffe51743c6802ab4a8f530127a34d2a6e43eaa69dbbec7baff159005eb3ad38380f82963764fb21c1fb1fca04c3dd01,f2a8e0db4c95cfc1a58aa8f1a5c245e5474cd43eefd0b0dcd9285ccd767835d66e4a15be17f8c92b9fff73c3ef46b44e64cd1d73bf4665ece9202789acb7aa9400,7cd9d81a317e9693e4476f713f74040e2187b8c5fac1842e3612586c330b0e056ede3544076511492318b2829430f8a393bd39eb818893eca0604beae15252b001,735f2dca8f8880c19509ee94effa21b69432d810aa2c8e77cdd1c27fbf8ea17a5eb15200fdd798c6172daefc44eded442dec575aeabc627b3c82c27372844ece01,9f758063d09a385e0f0da7b2394556c43b12baed3952987255eb7ee674f20b9f601bf0ab0689eb8f4e5be8c40ff0c318d3d082a3a9e9a127a9ab8dfaf5886ea501 +3220f55e2362e429dad11d4faaa458a7e27776db306c31b84d8b626cf109036e453361f2ae9f92492b4526bd1550da4f196d0c5734dca8b0fd49de0475634f3b76e5863302dd7b90d919ea251f323018c3401b58519ffa4ade8dff5cbac4ae45ae7e27cf03f1dbaf2162080f8bb148c7980012916735363ff0ec38529bec765260bf850fbf5220702e93e194f6f03db10cdd0ea90f76fe1ebf9e1fb2ea3775d57cc6d8f875817ba2ef4a1ef7d9d76e1978a6,6a90f85de83dfc9f742497a11ffb6e2bd12e8c4f5e9fc4c3ff27c2b2a737b855,4f2fa35d391e22425aa0cef8ddd70df10fe4b4325458aff6b0305c13f9f03fd80828f33d38124db4f0a530a7db6f59bbf8c9d77012a08133d062d8a625d70c5601,9abdcde64eecd0f571c098508be3dff6e67c775fb30629c5315dc1aec3872faa7688689cab248277d68a52c1b9a350d70f501ff63ee97422974416e2d8ae0f5e00,abc44ee8bc12f1fd518b03741ac52209c9b76bb17f8baa9f9a2f339848476a772fd8a17b9f46899c2cf30a96c3b756d8ea2ed89b6c647f5d954295acf8b02fc401,e576a956dd29b57097e10ceda2f3fb6711dd2b905db8fec2b7f03fc4d72894a157d6f6ae1b2a80638579fcaea3aeecb7daa74354584ca02c6f1c2810b5f9db5500,a5a0c9c7041abd63e10eeded153c9223e2aa8430ff6682b570cf4302f4f48a9d78e175399e9235edbda1eca05b47546162a7f092937d5396db890daa3aaed5db00 +733a4db1cdd90598cf8f8ef38a4a6bca0476ff31e79ec0cd227e948c32160cd7f55d72d7d65f7705de2abec8ba1f23c73cc60276497afcb937434dc4f34d1ada8b778565cb6ced5e2592365893b4701a517503df8af1194d6d0d6f6273e045701a620efd323871c39e22d779a7e18c2788d9948183decec80a78e3854e44a620bc11fbb1a59f1b8ea64649bd91c94ec66fb8b8cc1a71dcb011fbc9f6e93283ccffdede6ece609ddf2166263de5a9e505b693,133a3086dc864bb174d6197d734750e74f007b4591cffc403de113ac44a4701b,3f58709ae2912f5080b449878109d392fc029e7eafcaf92ecdd52478245c9d306a59701dc102bc60c4c979f704b4e2cdfdbf03005146207b0b3184c1bbc06fec00,18b66d434c6409a792460dfd89ef0d440482b3f90728e9b44f13a49c02f5497239efdb4459a8e14f309868161ec0cc3293ee00f8f077b8204e42f9bd2f9a520f01,f26157df29d0d824530b868d9182d44094df43fe70f8d52f4ca990fb2ee27ace0745eff73241037fbd7d6a2dc807cdf19e9133f0b7b2b83f6a9465325613d72401,e19aea7e2afaa23960a77a12fe7bd1084bb4137c6ae1e5c65f8b2129372355887fb0c8d2e8f1aa77b52e08f93d451faddfb513672977993a1c9a1227aa184fcb01,994deddc0acba9d7de51d6b6c2ca13bd5ca896d009419be212339a97ef6d96913be9ac711ae2455a712b375fd7bfff4769e5107a4043e208bf85b4b4fd03933400 +173b989c5c41ed747665683c3aaf9a3ee103e1e443455bad149468c8c0bc1840b93b8c5eb292f998d284c74f93d4d1ef50ca32784c42902571ae145a8586d53ad2c089f799c752e193ec714bda5d6a9ff98e6766e6979209edc216d46d7449b3adf3529a2758d7a39939a48752be61674bd8ab064de60e4f6f6d9dbfe64f6e28f911bc9226eba5f26046b5268f5a249a0d8615ffc72bb2e44d26a675993972975b83468858e8fbaa4d37b938968a15f9ee79,d31a21c838484b1fd6f493d4896fb47d20a5cba315b487784222377f6bf7f048,dc14920fbb77426cce802a393b9274774995ab99cccc8fbcc52d6e49e7e963d268dcd660281d358d748493b93c584e533264c92d0e9f71a5ea20c1d58740886700,d0c4abda67fa552b4a3518be3790c2f73d0241c79adc1f71f9af2b7f67568de41f94550ac836a28ab5dee2f1bb9e7a3f55a0658c7107d187ec86cf171879aae900,30796ba68fa90eff1290530e5038e63ff361107ad318014f44d6537efc03abfe69a229b456efadef2d5db890b433c29b4b477183efee28ce6141e7ed50a3690001,e41aacd82bcb849f9f0b39d9f29f3512e483aab84b01d465addc57f89c7fca326c24be8f05685d8118421c46a4bf97f74aaf5d2f95b8a9ef66cf0c3976fb75f500,6b54cac012bbc8443d9f380ea7095e9bcc1cb6dc3f68ea2d3fd1d6e1752065bb7a74f226b00f63243eef8e00974496303b20170f591d863749bcd318a499f9ce00 +b375364b760ecaa37fcd276df0201593d252751fce5d9d95688f2fa2a44ff067ac5f3bafe207a2042ac1911a45cbc13cd145dbf3f0c95dedf90fd8af0fa9afdfa0d59c5323fb53394e9b7ca3e8356e3c07038ed690aaa9fcf5c96af09ea2a75633635b0de6a8f9fd1b6bd44701c3dbb261e1baeea9c451ae05db8e2cafab861291c072a2508a0fc0d519611a6fab3b63c1b5b7c37c0ddb6b18e538b5df678064b6c26ccf50b996da811c85c718bc8b2405c3,c2272c0c8f283ee3273790bd20b6fa915c10caedf455af2f56e2658512eff6e1,a30a364ed0e50846b3100e4ce96eca736e0347b2e8093c62e60ef0d764744fc540551be0d8fabb45bebe763b7d1db4ee57f6629545419437986a3089ae72242501,c350fc6a95b13109367bb273f88d281b8bb99effcc8e731f3cbb68b2c6f4226d28de38fb8671451561c491d76c10b3be56193b27adb63003fbf73796544721e101,4e19b4121150444b192692987f80d6db85c001ce8a9fbce6a64dd285fbe283c63e4a8323b93e1ea7c395e9642cb160ed46cb9fa033fde23dce52f13dbee0fab900,4b8ab1cd8ec07a60e9088286e832d1d55e8f8171db1d991dadaae1db3d235a925b8eb703d798627ca8b1be36ab4e992e0c763c855e762f6a746dd28cd226ecd800,492e817b2d6766b62538926dd9742684eaaf310c4ebd2c90d1dbfbc9f126cca45a6ed24066eaa33da6f743edd4529873f359b04e79dba520b9bebc8d7558226800 +61d4345583ec87bc265d88841635920f74cbf610755b252c303c76c5e993f0d2c420b5e939926a7c60efeafe65bcb66a57a82e4ba08dbd519ed650abc4a3da86a570278d38f6a11934a616f63478134ff4fc65087a6c909836f012f0f5cd191947ec3b84aa9d3e93e135093bb1cb57fa04361b7468c3eb3138b72eb3de60b02655d4ff6c81ddcb40cbef351723d3c85c1217c11b91619f959549b5ae04439df687bc3f91a2032a3bf4fdc543a6cb9968221c,dcd2315d745c31b17f887cb1db2735a35122dc7470fc9d7f0b919566d22dd3f8,1ce50b8ce531645faad3f80e9ca955b71de3a8b5cd721c002d9dbbbcc2126c2d269f09bf89c4dfdad0cf92f665e79d88aa636c93a63a0b4ee0a41cfd290d2d7e01,b1ac352d1913ffd0d2800f6092e330fed976a952585fcb9850dbdc56294e0c1511a6592dd5f0916dc76e74691c05ef52853c3c06d9f8e53363318b44b7085ca301,209d1eb4c24a8a43b65bcfd54f8821cb30da992e33c43a79a46415c89a83f2456cf4d08788bec7227646fb27368bed4d6c4081f7e1f52328184ed0d44431a16500,1725e41c054660ec7814aa1fc8ffd7b0ab2d86801616cfb7968dd76797da65ab2cc6feae43937968ba6d2b70cc804ce8bbd36d6a72a0c3c595a30878ebb2068101,92bc5d03e6831ca4d34f39a6fbe5fc43d3d52ff679132c3158a08990410ff9a7432e4fabde942c96e8d0527d292be49b7a0f7b714703838a0929afd9c9ea663c01 +931bb43dbb8bd289b5a290fbe8a73c83a0c23eecdf0c307303d7a70ec43910a1b4ce7e91d88f6feba2bbb1b64adfe3495e1150c02adbe2fbcfae654a70147de6cd201412cb098fe54320bbe3b33de49506948b2919150c984794819863abdf222429aeccac82dcb9c87d088c73b3df41715b75a7ebf979cc988906657425a30578409cc0af9db0b2cd94754145d528d357b2b0e64e413e0bdbf5bf19d0c32a005a56979793d4a0230a74c8befb650d269d43,59ad8dd9973e820fd5cae0fbadafa6f9c561ee73f12354ee87d5d8e990c37528,a23b559cee125520abbc7d98497580d4cf7f843f2ffb48bcb6f7b03a003556ac27383edff0fa3804316848040c96bf5a1ce20deb9313f3ab33aac087057b79c000,8de47342ad9704b6d9d3e20aa407084567d474dd84599b438f84c841c3e61a105e27165231eb3b4f653ea62e48162257df0ccc373b1d5aea97226353fd0e76bd01,189f68154c9ba0512376b805a28d70b15509e01ec1669a9b6bf2a514baa8cb5f5af48f83d33bb4b6b444c648ecbf2ced149fe4cac089ed93dd86efbb674dc17001,e7adc197d1a094103ef93bc1ee1a6620697d3aad20deac5200d4bdc7bab4216419ce8c0eed85e3d8d0a46aad783617acdc9fab9ac4cb7d03066641edc5b6ebd801,d6caccd7d90c8b40272a89172f600fd3d4830e97bfc0aa4ef08cc69fea2958226c68dbe7f1486ce457e52ef6e8d98296fe17c8ceba2237d1574cf38887a87d6601 +f089684de0cf07f6d85b7fe9287a53ab3601e059f66f939b040990b33b71657724366cf73984d5b7bfd57d89d32444b8b81567cf2083f59841f0d1be3e319db09e2cbdd75a2d89aacd8fe7b140d72e5f6d34e15140c62d50213583242ed4ae36963f2a25566ce6e35fdae6c7603e7d9029ccccf1ce793fc58cbd73e08cc551677f1f01bd50e9641041961c4c226d362a6fdabba09fc4facb898f0aa565a9a2b909e1c8e458d3bca1c56be1f02fa637e1aecb,4279f206fdefe848172e9ee1f285271130e6867450d3670b2ab175ad1e474e96,a7f89e92c58c392d5ae9263e6f45c053d613365f41ae6b95eef94c77f5cf253b117f6adebe742087840870f03c674cef8ce0fdbe347ca3c6b8bbdd4d6cdcac7300,191d13a4494ab9a4de754a258148cb0110b306bff3b00d40e03580794cbf6d290c48cf805d83727ee22965d0f70d490d8fc61345bd7d9310009117bfbccd90e300,b295b7979e8b9c6f9d4a2da80caa970f3954d0d04b4fa36d0227b4b2327e14b23a596970c3b4f0388940b7985701b768bf66cb4882ad1f92ed51b104e14353f601,0bfd0bbd016960b2c54952ce72d4b0cce19404fc90b247d506414166b3cd8781311cc423ed48488fbb399e106efb77bd8bac3edde16f858b2140e10ff99280fd01,44c2364e6ca26056177f63e0405c9435b4457fbd8acf50403c11f5fe5c91ab5f2478ce039552b1769eb760ecfd6f9959df7c5453f77e3f3427efb52178be625a01 +46d4ca673fa6a0466e93e50a6d53221df775ab5319f00b5739876b12fe65850be8ab85738789bcd678207681574626c92d127c28cadb63f4e10dd7e3127bb58500ddcae528b035ebd9aa862636ab2ce94b111b27554d68c0e68c77edfaedfbaa859ef6896f820114c02200a241bb10e5fc5d25310c53802dc8dc81432cdad63792dc6dec50ec932d1bdcf2fb5bb388a0d056ae0e3dd0d1b5c3fbc444ac030ba209d29aa40c2a4eaa628b198f186485cae1ec7e,1e7eef39315fee53ef5ee02204198dc17b91c2e67ec0f571297a7f04b647d9ff,04a8b42531f18cf0d3c776fc5544f17dfd75a343fc5c82eae3859fe5637a1b890d953c8aa5cd054af2139b7c981a1537f9fc2a0890d855c58ef73e6c10b9000d01,81819e7bcd00fecddac70fdfa69789bdac1375234bab15281553b4fdafc080bb4163f2ad909846ecc18ab06d8f9307afaf32b221c9040119416e0971431410eb00,6ed50d8b6fd92c09cc6ac5a1379ba64e4737b49be9b47ca58bfb846ceb5589f769432fdb2f7cd3c9817ca7b36367ae266629ba0e76e1ec5e900a56c2286e817f00,739a115b4f498e7bc809d94543865ee730f34d9c154a199f9a6c02aba8ee42604efba80cf7a5312b1ffe7a5ef9b99409d2cd01c48b7bf9e11b938f0e959f6c9d01,8f035685ea2701bc2aaada455a745d95ffbc2f25af6fa42d75c806b3c148342228dbd2c1362133904a6f67529a46fe9215f49e22ae196a20b00bb7a957cbf49501 +c1d762abea6f508b618df87447f3a727cd6ca6c9b8bc4b57cb530bf9d51554868a9555c0fdbff1fd5a855d905446d99cd2d65a477902b00b7f68d489d922af66abd5f856252344a240324bda451fe0827e98b4bae9100bee46815a7cc18454073081e05600286bb48d6d3bd612067e1ce327c402226a75e816b25b1d38ec20824c35853769ac34df1d9f3829e34cd772f6067e3b42816197e4b941424cdd88206786e0de01d588802731aa69854a44eb6df640,3e418f2dad3fc326188ce2f626f589b7b7f79385e9f93092ed6b8c023324b3c5,95908f5aa9733e78fceeaf5dae5b804592a5b2fac52c30ccf3266faf800482e71588dd74daa2952c1307a012a890b2d4647bbb321a3493bce1e52dc4df16d18300,d411f6753ed65866f4029db8b788395a401106339094cb27fc83250659e95f205d7c7d916c37c65ba0173a1656a81d9898364899e8a57b01ff1e7572ef24c17701,c33b32de02aa989b5229cd15cdb6fa43c3c08d19cf92877ea329afced26860f065edbf9eaea5b187c84099c78884805a8dcc75769e382b1967cb360537ec38cb01,632a272e3494163a25874dc5a9f72b51d65c5302555b39b01f9db77c682eaf7c0e27945cccc39eb96cac50ab2a7dc4094c9912ffcdb6c760c6c4cbaae979589101,254d1a606a7865da8949343c8ad00398174b11520a6959e4ba6a537f263c5704618ed0351e7b0bcf7608e4738c84c83bb2e754c2978af5524523fe0326df85c401 +fbbbb90b1954cf75e3f9662878403eea10c0bd240b57f4c451d1d2638a3621fba6735b437f7f16f769e125018e95502ae5cdbea2c171425317cfbc9b8580b88142c041a86ca5844b43e3345beaf12ef0dd34a26c452b76a8d4b4fae5e971f2e59c330cf40192546def46ed6fd5b379f1709f8a27418fc9f7ac7fa0befbee221b20fe88df3c1eb050c2c6cfdcc75641a9847df30efe1b5b0ab1c94d22228fead8c10b9e870e4c27497fbc57378ebbcbe4f83eb3,de05ff914f4750f32d71eafa4c5cc707722113658e1cd9f335f432de40341d50,5625730a696c9a54f8c0f851799cb4aadf7dbe1ecf85704d6faaf0168fd3bf397004a0cd825a6c28e52aa98d5d5485292610b570258e9ecf18893255e85e054201,510dca2c5380b5f38cf904c2d767c150fb60bad137515d4eade06c3d8493d35738e3570c9febd71fabc91fc24a3c3ae08f016f1a50ec981fff48fc66d47d0c9b00,87197b4dbd7f78d90912cc20d6198e28fa554779c2e5e6aaa5bc9f679c5e268e184fe01ab0959a6176d7b98963054895958f9f4d23b00e34a517f98ad858a1cf01,6d694126590a64ff036e35a3536246d96f0c83a3caba03409fff0fab8a5d6b203817b6a18ec42b237532e13241217bb7425bc58e1ca54118655903638e8ad32a01,f9a383f0d66590b50a85dfc80450a2d09ce8912b35b85c8de1b5482660d6bd89571d0bdf6adb3b303c9d89d4e2dac1dd8906b0219ca137abf26ac153d167480601 +60860f5bbf98b193c397e0668f2c275af267d0588550500e74cf3ad3b0e066c25759f07829241b00d414ee7e4d505f0ec3a1bed69554959eb58857f2300c41e5001b814467f578c5cbe5e05b345cf5a35853b6f3204f91202980bd09306390d477420dc7201ccbe0bcf425dfac668e40c31b12b7cf3617b735a65b6b359f034a8a36ab67b6d33b8c75c7622de6cf549482407f08413da9b0ec34dfa4234f77669744aecbcf797136ea7bb45e6fe75be8379578,277cc440096eaf8bd59c94c9d48cddd8b437d5ea92a097c45d61f673826d17dc,f6906c34a81e1adc493a43726adca2a1c9e0fba24931f569cf2ad1e535306a8f70df22e607a113243a06cff83c47b273c21a5c51c7a4722cf2a6595a22600ccd01,5e6a9bf1034168b63d8329e8234460768ffbb7382f0c54e675b483f0bdda0daf7bd29253252edccd79f72164d3c0b8195815080d0b546e00b109efac1bc7849e00,b9dc21b7bf3d87854f90510efc947e2b00c28cabc05775f6fd7cf1e05c5db2c4016dde286801ad3eb5b440ba1d8ac21d3916ab82d1b9b644d68694b2ca4309f001,feff73165e45bfe0c051971f7de67eb66a3ea360515c86b2580fe5e551f3017f2f69efe410978c6df19767bfa849f032951f030fb75a80cdeef779796827614001,4dd8ef7f69af01e5283bf9bdf3b5662701e397599820cd7683f57574efe786c956ddc32b98c8ade28f7f01c016a36d009012b25fd63dc1eb63fc6cbc3ad2961c00 +d81d26a589fc2193232cb250eca627b57736c7b9557a389e7fa5f3e001b05e768f7390a7be8e883bdee53615fd05eb60bd6c2256fdc520ca54b96b25b9ec309880b315276cb957b1a2e792f46155b1044c166b655280627ee78a04bb15fd9a78b8b681c2c1753678d0abd745fd4ab355a7dd9402f2b7c18246df8007d20b08a98e3c55ccca6b7de91a93bc47c9e79c1c601fbed2de539c309117b8f7117cc5ccaddef31c85b12ece554dc7df02028e2f9a82d9,c1e42d59a3a371f693be9cd0878e512334f20d01120b7a20775b23d96d975928,2a98d57b25722d5df89874e8c19d080cc193104d5d6b86bbfde7f3f0fb3bc66d613ef3caf72a07346ad4728b19e6df8a1e7837b4fa8576a3a5fe204df3a2033501,b2c0ec9d8667adb7a8b98c1f4770790cee4e829c86eb5d56e4c83735c5785ac0149232388929fd0446be507b23e0315136e8979b6b3cad8e742ed3d55bfbbd1301,b82d28a497c717b17dcf74a8f7bd11bebb05dc054c87c526ad4d15d3415fbc53606f117405dfa84b1564c660a8eb68edfe45a7ff2b99c86c5bfd424d8b797f8c00,95d72ca8e8631b452160f9aade16f41b07a819a976ac277d3d589004167f24af3cda274abd8dd1fc704947a29718654ee7bf2cf84bfd8215ace72251969d7adf00,186c4af9ce2f1c3c57d99393d436a2dfac6fdca9d8e7d46688961ba607fa69541127d88ccb091864bdb8b882bf61f3412a9d0e2998d4e361dd53fe7d23e543e400 +96b9ae341db78e85ec4b17d0323c6193535835038b6d34c09c6cd34d0ed0f7d280b2ecde861fea33d30474544b5e8e28442000c214e0996a7ba7927ef7a2dacc8c84221c4b6ef2ef5e5d7bca8c563e30dc15a603d086206b8558da9099c28e7bb8d50a47330d585784e94a99f35100986d899b1c6e0b1b532cffcd09ae44510ef176cff379716b3d39360d225a6ea4148cc2bc959f541f95a9f6cb3495d5999943016807f9c4809e1cfd87e1446c1684080273,b956a002bb71fb5f45984bac1f8f30ede325f61ecd31d6553ed6a60d7bfe0ab3,e3677476e3d46b009750fb3dbf228f07d23abbbdbf338170afdeedd19b9153df3807feec48e20aef3ff396fd27f746f5613961087a3d34cf502904e5272280ff00,b315959fc4de7f1002ce99545e28148e976ac4d4c1d7efb7dea80c0d99c29d70283e6441944c0ce13b976bb6d7d7aa7388ac438fa9294cee85a74e410961bb1201,a0fdd7695ce9f15ce4960835dbc6cc05f843e4be7e3a299df9729e5357b84782521c4747010ba0a9e3ea8480647586f52892159db4526e82e91e25637514e4b601,065970bd8e664e793c4c92870627e5c86e85f6d3777cd4b9ef8beafe9e584f1f37ecf06de164699b21d635c3a976a6135eca41a22e7805f676c6fdb19c799d3801,178d2d2fe3cf555586e0deb4bd187f3d356d4ae4f9360354e37e831af8cbb814370ff5488fd0eeb9d71d191ee09145b73c97c1807806d5faad8bedb476ab1ec501 +4ee89c4d02bdc5bf13173a911911754bf21118c2a4cb4cd368629570a51ae2a25ba139c30e77c93d0953a31b4a518e8e29f68ba6816c73df2f17e72cb8bead39740c2a3f279f7787e6cfa3cd9bf5a2a3a0d12dac9d6d2628664562f7a7784fab496326aae17d3f0ba49e68242387f1fe49b6cdebacc4f61d6385d35d7b8a0ea936a050487ffd7a90396efdd0a083323387d83a5a1700d920ca41a86589a0af1d757ea246210ffbd77746cea6941be40a249aa2,9eb66249ed17c247f41aafce1bdd1d7a22589b2079c50d38f60a98fe65a447c1,aa44251ab6b1b3ac50f84be302e4ec96b3755c77ad86385932b8ddc043a18e301ad7a0fd7c8546e34c6d83f9e59da949a9a9e7a7426ccf700a031afdb525c6c100,9170575d8d430573029f93958a718a8994f9b67b515a4c2983dec90868c53b9b0c5c7911cba85a5bd33058723c224bef1fe38c693ad1ca43ef77e5f6180385d001,355d3f4a659886978875ac654c4905ecdc801913a7b5ba7380e5aaf0a5f7b6a635487d045076642d72e7852caf5d8ad5a5458112e836ebeb08cf70cad4c4fc3901,fa116e7bafa30f326f4ed4161d162988fee5a552c815c9743a3f25744b65308c710df1951b15e26a9bbfcd620a865bfb37578adfe3d5d8fe416a7afe6909cd3201,356c8f3f428bcfc0f8b8e884ea0879359b6e579314e5ebf2253556d100f40aac027eb57b68ad09afc3003de877a676695f6bd295dda1d4de436bcb6a3f61afd301 +87bd41f2a49ec54f49d2c857d871e13f53e158feab193ee73e699da22255142f492c642b3a15d9f7048c351d133f313c5cebf152630aa7ec0b9369b746e0bfeff8fd5a989278a353fd7f087f229b4d9cf532fb7645df7a4d8aec8e8d4245c61a4e62d1687a57372d407eafb6a29fef2805d6e296e846a8104507e8b6b5f14ef561381844ee69c953679414f0f5c6c267bd461f4af61c10a7154a2b0547cf0faa6d3f1ff00d11667d2ba68b62d4099fe141d777,2748d95bce268196f9fabbee0c85e55baddca22d733572e32a23762e894b2311,d4d56de77f742fdfce8912b276fefc598ea8ab50aeb34f8744fb4f22b5a5526905dad00ca931c9eecfa84b06011794ede80e603f79ad1d6dac875dafa72d9c6c01,6ad8b2c65158db8ed1395be25c5946fff23b91127153903ffaef0f865e4c768e7cd34e1d8e70c9fb4c5145d79f6c170712ab9909b92238e0acc2427dfa28892b01,684dba15526c0bb162e25f80d4153d344d625563f9de4882e92a9658e634b2f054d4ff345c8d4438616e85346e3a6230c637efa6f12dc4491767317ca47c110401,a59c8deca9a4db6ef7c5688932dce52ea2b6340784bdb92ef791813a303d84d45244cd63f52dd044d53844503c968c64f029b00e4775f7c5f51ae569e4a5ad3a01,a8e403681c0393fc1078f4cd35165c89a32ef006457389e702ac3fe92753de663c5a35cb1dbc3eccae1fda953e6fcbca46cd4db9059ce2444876d5fc06a6ef3800 +233ce64719923ef8cd0a3f4948e476ebb219a551da44867740d95e6971cf214089b4a92f5e1d616f31432b4fa1514201011ed1224a1c41a3281877b4b27f6ef80f412a48708b763a19fb4375ee184d05bcd70e5ac014892e666c276226823b1e63f07947ed88cc2cdae665d3fe829be2910856fdc71f415bfb8af47d9a2d0cba063bcd4b8944ee7e1959841b295b3a261c4674af8ae44b606233ed02996baeb8a94455075f8254c5c36bb7401e78228325914c,42e258a97828035ddf3df14365341baf724c67caccf153471a8fbfc896fad7e4,b04622954ba2fee5dc06b4a45c9163d052622360598c95e619e6556d6117469a7fef734ca6ba010b9803b81ac161362f7f245e178c8ef410e0911f43219bf4bf01,bbccc25ad192ff5d06d321b7399a8124f7bc75f9a76ec539f064d485165b15cd5d732293a6e008d5d79b2ec3e7590e1ce881dadeccb7a9701bc2eb17b7b8f24e01,e0d5cfada1d574660599119dffe276bb42c29676df11fae00dafc792f996fc6371f9984695fb2fe36fd67632c898825bf4aacaad5651252cc3344460a80a733b00,c72ca4b27b088340a0382568ba99dbf10b5b09fdb30b73aab0f15b644426ace72c2ce7d81a2791fb0bbc296aed031cb96773743cbac7d9c2855fa90820db186300,7cad9eb0f1e083d97274a4d11ed3ea94d00b9641a1abfc3367987aa0c2f281bc6ebc628c4effe16f930cc838bf73942f502f9befc2e74cbd4dcb5ec1ce61992f01 +7474ef67e1482e8bac3c58162e4366f10e4a2a4bcd673f1545c07df781f75cb4aa688cfea43c997619490f75b3de902fc5074f6a2066b7ebfd1ce3ababbf5031c53f5d5dd73787461cee490f81edc65ee8bc881d722c44572ad292bea59ab67444fb0fa1c255ce7b343760fc3319bbb98d87c1f5bcf09ee98abad980f2b4d9d2a6084e85e69fb6486ca20bd5c802188c434bee01b659bccd4e2b5c314b3057d8f5885df2fd97862ec78cb5fa88d1c5cd366af1,efb72305c793a4313cfe11615bdaac211de9b24e2e71c8506bc49e43fef0ae90,035aae97cdd506fb5aa97a0ba6019ca37279b15701b3d02869a14c751bab00a8219909ff2af37933ab94e21ee15e84d53ab14435168df7acc8d8589946f273c100,028911d5c9330d5fa360a4fecfb13a994931fda1b23d874a988c5147eb9a5a7b6fd620431034c44a7e3d8a384591ff7a5385946ca67a19f5e040a738a34b517001,a7072a029b7cc5d4c13236c729f24fb758f66e712f528b5dc49a750581fcf434573e2527b80c3b788d521429bfe99cbfb51727fceb91bfe01b8684a305516cbb00,0cbb627863ba8c323a15cdeb9666ebbdcb5690cf451469b22ec814dc69a48a932d6352e5146047179041bc43a773e6555b5f559d19c6e5b5f013a1606b0e844900,0d18cb79e11b45b5d3be7832b824c930087c8321307d76dd76b632e834e0c9434b379627e0d347f4362019e37691595c4c8fcdd5f9d86dd1deb77f4918c1c77801 +bab77a67040f539b17891b1d0ea85f1dbdb31dcc1e183dfb87cfc4fffc01f08eca712eff671f132d408e037fa311f1f60dd2a0b868057e587fa53fa1b565a2a0c16f40351f78d3b6eae9382037517737f4d62c51d4c88165a6e3fb860faa42ecac7f5127dd505923cbd2916c9b1e061ccd2615f075bcf3caba1580635c7124e5a4e78cae42da7f73089b6a8950156ab05c2c288a3aa288a20d51b7c0fd7dcf38979dcb642a1f4f058a428a5d580975c3349afdfa,5f781b9d932ab043f815a3aa080ee8dfbd20be129e71f21f211f5e4f16bca101,f20a61e4191ea81bde5b5ea32ef4a2b9171c7b58a7e85fbd33f6b4280dfcf860427be9b7f54b2b3b501314e50132dad19a93b27552bb951d6b59972b0ac687bf00,7b8999812c41ad4db2960f1a4d7481643fe2e7abbea26af17ce6c0e0b37f0ef82049faa06b773d4d2ba0c41d3c22bc6f536d08a3802b157a144d357a664c57f100,7dcd69b96ea54f4976ce197be72de53f2109b6fbb5d96c1f4939fad6a045c2566ec2e9ad22d524a2e6a40b2cc475a7c059c95879ae72407b3f63ca61106a327f00,fe07964fd5b349b105fd681a78794e500bbc658fc4341136e6b83b59ef6ab4345c76c764e8b98a2fe4614b471c5b550bf66a9c2cc2c9b9e0df5d33679668c40801,9e8440ee7def62d973a6ae4b762a211655f300987154be2cb8ff1ee2e2b04f3d2711eda46cc2bf05b6de00353682e1745febcb918ab50d5d9966444b9182050d01 +8f4c9d3347b09fd29f79a65d75d6fbf5234179f3e4d7b9bc275657b114a01a929835835da52ecc57cd15ba2b3a5eff8617413a2d8656a1d68b9fd0ff54338707c00d3a5fe19e043c12ff610d38253efb475649eaf4e8a347fc991aeabf7cb82df44e29a1ea0fa3410e5ce8344f05e649b63972319841d1b0ffc2ac91712d86ee6354601ee39bd8dd5837dbc1b8469fd27ad8df74215babb1117e22a5e9919c66df74876743a543b39d6f3ca833b48d3447876a3d,3357bc7024e1259abff370d9306ec0916acc2fdc9acd76ee335e6c4fb4d1d84e,998ae5fd1422594a4dba22e45034e8929227d18b005a25327551720b48cf3975195574aeac162585b9f51226b2de335589ac7ee0eb3a19fd9393858a193c623901,542c32eb5e545cf29e00e8b1d306bad39e4680f9bec7c7731e54772f341300863da32e14619f1861947b04a4946042c13cdf3216aed36078e1a1d7196f7f3d7100,9fec5d79845a4252e6efff813bb193407cedb2132138a229aef39035ca9addb75830b069f3cec7e64db462875112ffce957f7bc5f211ceea5bc1fe13852b011401,27d9c2444185bdf83bb901bf7fdba8dd4973f309c4676ff6a52c12024ff208133faafffa7d88830e7dbe7fd2fc0719d292d6a574ab00eaa1b4df1da8aa8225b800,9ffc161b00fc74892b9f0b5ad8300180a8654651ae2c1238b4a26ce59976801a6768103817281231e94515face0a4fd608b8de8c86c2f812e90b7290b65a94b200 +a6d6aec1231ee45d7ba72fb8195a314421273fee3e6df63f73d402442746eb2ba34fe313ab1059a0c2425db8274488483d58abeb71fb7aa004495b788a10e8d20cbe5c99edd56b6c082387af1ff905bca26b5477efefb6a52e5d62203f868579864e219bcfef51a191208e8fa270ec45b4b58ad13edac4f8e95e04228ff28b586e81fec23a104b2e3e9ec4752273b31068af94d482142c090cf62fcd1ede57ca8b942703055e0cab2b6427318b6a56f6dea7f61e,54e217bccb0c35aa63eb264126b8f624256b34adc8fe3368b0a607735f70bbce,0ea68ef7b7e18070824f3c324ada005ba8f06dfd5e65917f500ef41086b0e3123324df9dfcde6857c4b0783794b0a7bb9f1e732359d12aa88269b4a005e5f53101,e078fb4ccb8c95825c9c82b00da110db1bd495c7bfd53615a153f95088240933423cbdba728eaa837a34f78b8178731547c037c6544a74e1efc1615883a8972300,6f1d0b281e96bc5ea1598e9c76e38e856e2e40d9e515714ba42555e9f985fa69431aeed358f4022fba860d01f7e05e8350bbcd0cc376f14cbd85d5252d70a65e00,e8bde708365c8a642baeb7aff60798f6611c67a9a1b340b573beed3e96858b7827619703a42397a67371f49bfcaeadcb23119c59c81b0962cb774ee6f910409300,da265e7ae09151f729b88f36fbf60a61649d07656870f84f48101eeee5df6816456adc59cdd37ba47265a6cbf0cb98264123f08cd137d6e60de26c781bb4a3e700 +b73cb5dd7a8c826654574ed9a1756136838bb5c0e466e961ede18828eb0007970dba4ca6e7c34035a604184a3d37f26056c7ff44ff7f0a80fc57c0bbc0f1d496b574286255a6739ce4a839809ebbd17170c5e77990bf4b4ec632828e77fc4de38606bad519ee4c482eeac4553255cff78c243abe273eabb7840ec51baff199a21abd8b4fe21db6ffcad30c70a9fb454d9a196f5621e524ff00c2580d12bd51aeecf064b32d075a20dce5327215a658045ce41edc,b752139651a89d04066259f68af488d9c588dda926cda3975b6dcc46a359f8f8,dc630702de04e5833808caee4e91529647089a606d281459d5cc5074dce44c1a518abb9cac5e07a1a34d6a2d7bc08ede700e02b6f1b60db7e9f0efbfb497a9f201,f2856c56ebdab71f7ff2e8ecf6a5b8859ca18488f95f5b27987849cb064e50a36141c2aa71387d6812777ccdd5e823932b13aa61e079c366373188f33616104a00,54fb78a55d7e2c67eeabdea4bdc25a0db76a7c7c82aabae41f204f710c9ebd4541bdb3dcd37e624f8ea55b61062af16e998bdd23af6690ea9bf756babe96bb9101,0ab1fdd6ce776aaa70c7b74a0d3c1eb7593be8e21847642e55966b69d1018df72313916401c381ef74a8550c587708c7e307850fe33bb11a2370b62de882bb0f01,5ddcf6d674041a69a6a358018636d8b95de0d78bc61a6b4f1d0f458125024e90343212c13eafce31488104417de68ec8316bf91d5e50f3d4bab8ea477c36020801 +1692969f66616ce64a9f5b0b44ae87533af36dd85c10db2da9bb84c047e6cbc491e73ef63b18c9c11bec4b9dbd136862896c102a9b505f0719c07b912e22f8631c8a6056290ff941e3c94a6ea65f9703eabe38fbc4918979c0401a029b24c8fb2dc7de11ea1cce8ab7a764c74ffe44c2a5b9d22f4b5b348cf55357472da4ede6459d90e01acc54411c09d1f9411f8a40e567c560408d7ac91f730ebfc610f8df4e18341aca1564fa44f1701f41ac50e01730984d,9759c2e6c11f7da048de4a1a3d175272edeb51a831b499e124180100ae012dc5,d996eaf2be9abcdf95d7993beefd1e879a10b04b7a42d5fda72c28356528d8dd1f64388468f8818a4da2c222a6dc64f8134e105948a02a518ea828eec1a3969500,c79bf2d4cadaf9821c3411302460e9855f2c473e9d4730683c947a07aa6dfcff34f1e443f0626644b9ccf081336aa99de9766ab00fcbb0a6a9df19e266e461fb01,f181e676c3acb75b3dbf1e9d88c54555ce096dee0d9bc5036df6ba31fcd77fcc79ed43a001cd6b2794d33147ff49718b2e5bd371480128235a6d1e0108d60a7300,308d182631645d435058986a03c72d9038bd32a12fbb526058a3d06a47727b7b198fbde8069232b004d0c7836a20defde4c4acd2cc7e8ad6c2b0c428e18c130900,8467847183508b357bb14da2eead980a9d9e85787a25dd592e3e04003146c2067c68f9c88294f3e4eaf099105b80b24e360bb42a7f4357f0045639616c5f62e200 +cdcc8179bc52acf738cca2d4f01bc4dfcb2fbd6ecc3894be0ce9e949e51113929a4ac2ae5200a088c904724b83033d6b6d3205ec0f84c24e439137b0b579b2941e6507e65d7edd9dcfc32b4c9c272b8f224f2d27ffb4cd6298738ca79b4974e65ca3b3de84653bfeb1afd9313efa501b9b678ad1d0a4dc31f30e299892176b54a9a70db820908c06eeade6bd8cbeaea8575937c1edf1b8eea7ffce60e69585f26d89af6e8f3168f011f811626ec4f18f2dbbe3ec,163ada0623bb0f7415c80cbbfa2049b6233246bc5b1d0a67d316432cdbb46d65,1dbe3ba4a11025fab46a4cfa0e0c88f2ef5c0a00797f97f40751de15502d1bf25d0ac235f290355cdf07d43c9f48a7f9aac96e7888a19318fe177a8b62173ec900,187d012ecda8916660d64ae138f4478f0743554bbd6bc123953f917ed53ea4c54446573617ed23dda5da45052c536d090867de72219dd99b5ea4c8ed133e39c201,01220c77783d780e8d1e4147b540dfaf3a2d9f029e18ccd077bc615f70423a3c32dac5407a53f8151bb2a1f1456b2a22788ec3c2a6a1e78afd036b2eb6febf9301,ea7c794f42de4380e4c4718288da712cd7f0fa67e3211190b08b99418460541a03a005c7d4e48889bc3723a5c358180acea8f802ec11d3e14cd5ee078d86967800,6687c92c5f7081b582c4907e1238f80ba60194369a89de46b3997723c8612526032fa86f50d47d8d16f85c37c22d2b9d7b69d426234bacd936e686a4efff11f400 +f4b4ef58188a3a85714cb54af7aac55f6501d41d9c756115fa5606970a68a45b2d4041f19b5d02fc5f84c17fc405f13779037b39433a5fe41b5469e6c08794d401b9da69ee0bbf07c4abeff335a6cf093cc3fdc7dae367c5f29d2214cdf33e66c5686fb2e57edfa2c3628b174fe19be34896bc9aaaecb7dfc9da14144c35c74f8a7ecf94ee1222973d273ff6bf7e92000d648489e33d93b00caab52521034d71131625ee436d32b1216b9591d4d0a8ea32ed4510,63076233292f48dffb4dd61ace72ddd9dad2274b2d930d3d4b41c51931af7890,7da5c23443eb14cf28e45380e610177db887a7c8aac4a0839db34b97c742633038d483f20f1977f1dd44fb78594ee02753cc1c6bf037659c32c09f8000abc85e01,36f352734cdd00316198ee29a5a1fe7f20b495d5761c0e5cbd71e47db9bd8bdc5a88a6dc49022cc6d6542b8c2312cc2639ec822b2a5e84e1ea6b801f07ecc7e700,44d803b29bdfba68007e4d6b3c6e8d6dd1e2a59377bd93cd3665cb8b54f682c90d2a938372d4e946c1668b7a620ebf6173b2cbac4b10f0ea631b109180d9d64c00,38296221fab4a5ff7aaf767350254c9ccfc8e52c8cfabddfd206e528a829399b04c5c3d73b22daa3aa381c80c707415956e4776b2074fa61df73a243a289406200,9d5dda168827fc768db7e39c38f1d2c05b5a4f0af464481e0804bf364dbb684b6ea49c4267274f644d942750a9aa1c2105e2a350822a508fd1a9fd0abe7e8c6201 +098ced615cf760682da75d37f7a6202c3de713802037977fb7b8ae5247315b07b54728c3b08fe5d2bd1c213cc6980164e5df7d251a7b1633adc275455be9b0d56eb8a04c003a2db893340c70b3b143725c732bdb352eea57ec3bed24ecd5a43d3fc1cbb1076961e6c9a804a6525200baf79b56c45ec939de9f06443da5f6ef724a81b047e8c750b1251b343be5061370bfadeb2512eb0eddf06f9af2fcb20c4b0c1106fa89d106fa8c9401208a3963b7cd366040,8ecdfee61a9c8fe8ea160035983b4f521359b579c4e27036d3ecfeec55d29e9e,b7ce833ae8bfccc247aae1130d9fa869546d5e02905d938ed5149187b3317ce36bcb46078583b67e9686f6e3f167dfc7629f2fef304d4af2ae2ef8430fd8e5a801,3eac3570e64ebc34e65f35c499f16aaeb7d7dcae9ca859929372f80c30b26178485971d0158ada4d7f4b8ef2c4100e21a0edfce69c787cb3fce0026d2bfd2b2400,dd8ebc02939104271aa5753d0292e442a6e439afbaed7a2080d799964b1a97a47d61715090909586b59c5067d3387d927527980ab2d8c5f7a5cab320347a0e0500,ceb11d8df0095bd4653c0ccd62b3285692f8d5a6db748d23365f16b7cd796897688723a603a07240328c2fecf3bc55d5eab640baa8469882877f070d4dbe1d0e00,72747d485ad152cc2e464dd3dd93089c0efb42133785a1ea48f2b65cd39a62a6636fe45e8e01d70b804368adbc2c1c1f5c1d33f134a1aa4f0493878509c7a05e00 +8d951cb2d186bf2bcda96fa696cef863b0bed1299eebbdf0b71cc225e0b9e46b53e8e464d755d94e13a2fd3d1a31c922a684a208d5d2ed5dffb2b4239adba7d2395465b9cbfa3103793dde8316cdb53d79fa7d99b11445ba3fc4a8ab1c8159b5654089e6f999038e1110d7ddd7c9c7d9ee58b374675e6586dee9b27aecd2d9b36182f1b9f686de5f123f42d577ce250ca1f3b3faac069b973e8e5cb9e78d3c147fe2b922b3cb45d987b0c3c711b65df985f6a7c9,7a847bb4b1d25a7a12e9e88ea4e10867aa2a8ffd831011c1dfc218ec09383e23,d5917e0aae0621804872627dbb3cacd49d9617dda2f767332506b7dde932988d7b16c6a012db37f57df92c2b66d3cfc8c965f94b858b860eac66d0cdcbce5bc100,40a4c6dd345370451b324cb3c163a9e31bf762f177715d94298e344fd28bd70f48685816d308509c0d68768515c40b12ec623dfb615651597d667d6e636f1cf200,d142d75303921503b13a9fee5b373c8f65862cd667da71b83e62baef0f06045621b932a38041758d0020ae713cf00951c3af8ef620cefbfab32c73bd0d9465e100,9a80eefad59d45aad2efbbe053a382f3631884234784511ea2116570a0d1d43e3194103c7c03b1d8253c9463dd14486752ba07332c224ba985642b5f0c03a23000,1b96d0f48967ea7aa85c337bb4ca0822b448d67ba04ed918cdbbc16c9391f6b2715aaf1e1d412b1c0d34f6b9fd7d4cb0fcc4fe5c5dea93fa5f96a880a8b03f8700 +d4bff37593cc79622259378b8c49ecd8ff88ee41a0bc96b4884859d8eb81447da86f2ba25c88eb932d1b0a9fbf1d6e16fe51e74c44da06de1d3384dccbefd9f18844d29b346e72d4af49a1e33f5295a3745595b72643f1a1da7af0646cef3fe9036bca1b73e5deef50a12846041f1b985066871d8a275c5a7c18016cfe8f62513813081eed74b25df8bfabae8b6b1c6287e5fa87f32de29c8e445369614d6253c6d829005bb5acaa7b676d049516ffeca240bf5f,cbc5d177895ceb26fe4a54310ce54d7edcb4550da96b6bc25a46e35df5ceeaf6,d6ae7c14b6b1935efe67893f4092c4bddef7af8fc0b84488b59e0418d55471c2512b1860da66019ca204347a1c9f86f59b02be5385c76634e844dd58ba444f2d00,a0e4fb749a1d587a7732a27bf550126ac84da916d2cf6851c0d65db488f9eace151f394852ac51de6a8430d9b69cdbb22ad9ed3bfdcad4b7b39ddeff3bbcf55700,c634cb41826a893dd302a9610d92107afa08e8226da54a636cf650f4429d657864a3af08f875f0e88fef7ee43548057c8070c235b2ce376e309350f1b28dd65901,948d557f17b31b3bba2f80f61161c3b2cfc3bebb6bb0b699dc081bb1d6ae163d134bcfbe268300c96c71449bb427e9f09ba6ebd99f044041dc293d82653e3c9d00,c6b5c340c15bcb994c29741200a7ec9aaa54892937b1f9d23076defa7e8a1d7e717d29dac73beeb6e018ff2ecca0d4d23e67affc8c8580778bc60ff406446c1e01 +5c0fea73831dbe6e58d4d6d3092c4b0eb8b61a35b52c2d517bbdafe074e541564ef6983dc1fecdbc5edb10e33863a33765741d495e72297d95b40eeb75c9597073e4ada91c949b190fda458a6eeba86171753c3c88ea84f628513e305dd064786a31b253e3c0862375184cdd879b8dc65accbfb93fbd7776640294e2f1d050f642b3497cf42b30dff2d3f1c9e77d64b880054e3281374425a1f49ea98a0c96506d361f7934318e186e5c48c38b9ed8e5dee75d6ad0,02c6d604e6e8238f4e747a05412d415f29a72dad9296ae00e3c886526f7e8e8c,e0a250c82343053af4aada609d9638a7a895371c4dc961333529a7935414d1ef5fccd1a3f98ae876d068980f21de0eb537942d53e78a6e0536ab5f263afa29e101,7988bfb5aadee6cebbcc7a6ad54fd96c21252edcc5e0bdee50225161c64bde751d9a67138a09c8d7607c456123ae1ddc6cb2eb2eb7e70a327d1144d570a3f7ce01,a07eb63a03b501d05ee392149614bc5a3723de2fe53d48860859f1cbefd0468b48cd7285c35eb54abe98c738408d0d9ce99d3568ae017212a6a01afafad6879b00,a2e0cd7e9906c8799c2896bcc1f832c5b3fceceba6113463aabc608604d3271b3eafe76804578d551468127b0cb987d348a9128838e9acc1b63a22e49d1c53f500,1866a8c537e80f368dc1b4b46fe436d564617905dc09a602e6b789740852d8dc3d1b7a7c317352d956140d2b78cca0a6ec8aee4a44a085d612cca87e19191eb800 +48b6e2210947d06c27f355f9f284eea73411727f4aa31b5ed6730d84d1414b28916f67be2fa9c9e8c6c8f5bc61dbad8d3595b50ab5c7c0b65cf3ae676b0db7710a790ea2952dcb3b0a9d1a20db9120512ea642477173ae10f10610605a431ad0b58b7da64543fadb4b1fdfa51315290173c60eb7922ba392ff12c42b65185e9c49dc816cf5a9de83a80a3087e0816af27e88370b5ab2a8c4532ee39ba91d6749e47c4872d9bbadcb84f3b55a55bbf8987589164b54,ac6a9bc0499590feca3d2179ff6fa21bdcbafd99c3f78131e42f82a1feb25eb1,2a93aeffe3c0781275ea6222ac262bc11e23201cf9682b492ff369734989505b38d470a483ff7eec6beb316097c0f2fc1320cf98fea8e75e38238234ea7bf25101,f3f0dd9cacffb812e4667018f4ed4e2baea4f1dff4f8ca7c66bc6144577009957f45a13cc28e44165438c7e81a6b20555917be50d7b7f9feb28b5b0a2051981200,1550011c5f715c311e9c15343ccd979333bef1cb1e0da35879ca7f3c091ed82a77e81123833e1c51f361dfd4210f6569af2ee1fd9c4ba15512c41871d8025f6e00,c100730e1c815ab52ca13490392e5a1f711e13ee5f70c5e547a2e4026aaf665060d862584e0112653cab4d1929f7b763f895f9eb79e92e7407e335c388c388bc01,65864a0457d767ae5ca3d1f017ad6b530760a6de078674d85a2ea2a049d9b95159dc6e6f80bd9e57434371ec224553dda99809eafafb2047dc5c476e279ef57c01 +318cb96ae02b1820e05bbe62f4aa3e567772ea2a29bef314cee1b6cfae026c43e403c23fe87102bea0bac0ee1121ee140b4f40991b918048016f6d65041803a5ed02553e90102fcbdd12cdf4a33d5fe7501f40b1c93160c07df67507bb97c938e2a987e0b48f8a30d32d2473397f520a91c914e091b7fb5630ae3db08e6899c730dcc9b687e4cddfc5466528795857de48b3f05fc7dd78e090dcc38d73e214fca829c114f25c2d8142e06c32eae8fcbacc6706a375,55fb658ba8d3f96bd6e3b23e4c27c1f53e1dfa9b2f01c06a7fa32c4f1938b014,8041db80d1271f889f546a45792fbeb2ea190a7b17bc23d8179c1ebd0e7fdcc8242d93c4796910e3625bfa3b5edc5b70d052e3a4c1eca0345795f0134085ff0501,17e918fdd287c3a112dd9d22052ee150cc53b4978a29c983f852ac22d416891f6b7cdcab510e148adf6bcf5a645ba49db361e5f0a827089202a32a7958c5b74d01,478536e731dd0859a2c715a337107264ed8dae051ed24f3e2b17e872a5dc01b1738f5c22c83300b6dcf5b7887322a110b824edfeeca0a08f24c1c09043a9158601,fc8d8c742d6ae3f0557692864e0d9be6750a6428abb2090d39add7487b18bb8b68c1c7c9a0c99e90640b0ebd6ea8c3ffa7a522e5edd80e1e9e9c00b339e7af5101,0e0aa214e9e40fd9150cf6b03c888c1fdd4f5d635a78f2b309042dead8b4da943b390eb9ba0b12006b74133061f4a9fb1d569c1c38cf59e706fad88666dd228a01 +ab62856bfa8f4cff606ef3bf6ad79ea89c45e7c049354cda2501215e81eae141e34e746f04bcb3fe6259114d7e1e875d1d9484b55e6197da3d7712ec97ea9bf874ce0f89b7c4a6b7ed9527494edc099612e296d2e7eeccdbf01803c4df3436819afd679f53c4cb52c69e1cc67ab0b3c8713efdbc520b0a0fe2def183de4beae57e13b683b56e6e5e182f9601fc4421a5f82af2f61ff450569094af1dc40d0169cbe3a012071b0903206e1d0ef3311afe2af4d0eaf0,008ad0012f9e230e428d477c8f177ca73423fd295b419de8525495633ed789e3,a82c07fef780980db6bc96af50cc6266644a7b9d423446c1c7e4e529a9df66965a3aa0f6c0ac1f00ffb5a2ed275a6be0a260efb8c5bec23aa92a0d8e158a6de800,8068596c9d783d01623b033af9b38a309510d8daa07e5706c65bacb2c495454c0be7ad71725f29322715b37c63183599a33c82c8d3efac77bb9d1a77f2184ce901,690f9bbec4f50dbdec6fbf1d8a5102d9275c7ba2f37cf2ccc639ab765df9486c5b86a2b58c59a3f4495e204c6522d25c3c3868ed43c34f91ec318a1b034853d401,629b6ee2ae442b3694495b6fe9a9ce0b7e857c622f7fc121f86c3977bdcca8061244ac7b3685694008c9d0009577c6bf5ce82d18c981d2fbb7c8d700c2c4decf00,06463d366580789204727507a73eff208fcfcc6d2783f0686b673fe3872575e43e3bf0752ec04e105758c865477a526d19ee2fee444ea44d09d5d4fa2c02cd9401 +cea40d9d04c1961e17c97db736b0378c431939c7755590d30bf5c2d3ee416a64708cf1ee3f367dfffcb59dd673621e4d5fab9f57ac2d74f7a11b8613d1c738861a34ba1d87c2391056bd02472ae1b5887ca48d50a5dc14beaa631b0ebd62df8e25704fea5de937fc667361134fa60a542d5dba669a1664a6e54f4b3218819d9286f8dc22c426cca54e5960987f023c0f89e662b0d438106814544ef1f0814a5305cf9dea52942106faf0eab7d94ed79a50a16c7bc2,fd353e6ee1ea767fd2a081b81961539b09268769b09c52e09ee4f95ffb497acb,efa3692e258d9a78ec7e54658d89f64a69d195204c2aa690586dc05653f0fa281a007374ff948bba25fcaa50ca003052fc77af041f32ab2910c3ec78122d629f00,b00070ea82fc06011ff805f00eb7c28034504e8ce7743b268d80e5872d797f7940a23746da254d386d7446be06a0541e277d2c1af2a703f39151d1a54897e9e100,5d8f9da1afa2cb9e596c9c5f25aead75e43d05ebc72f65d802cb5ce40b9bea7a5602bb60f379491459711cc1117628fe8c6f4e450af9e99ef54283659571ef7f01,94d0feb8cf86d3f2e6696603bb2c04b673c87c71902fea89b296a31f22ed83822619028785388a5bfc7db0e156685ee8aebf943100cc5724fdc560976e13ef3000,ef5a911fda545defd3656300ddb10fe8efcb84e3fe7be1b4346c06c112eb810723ff9b1996e0e6822e012084d4584e5cae54821acfa53b12e8dd0a19dfed4a9e00 +3d9fafb13416d0f4e117e173dfefefc01d2e60cd6045f2abe33426b4691ef118442fe327f4429e6cbe2aad049fa7ba2fb6e98ae90bf0e9cec8ee08daeb2c8e7d39c0fc962cacccbce8d28d472e82a18db4982dee58a14a0a8ea662795b7985a41de7e86d66cb41621d477b297adba9881e3120a1dce274f5fb41f155ec456c78c8c107a654d4b9b2a7e67e7266743c4650bf9caff3019790acc0d7c4504b44c6692b3abc822f0b0a19cdc667510570b01f7253cd51,50e61100264b572e4145a7692bebcffd4bb505364085d404d0d4ef27a2dafef5,41a6f41e6d05df53ddfb73f3cb5080ea345c28d144615c74de04d46140755db8795933bee19fb4f7faf1c4e1bd76dde99158f0a047796c6a7f2cf86f6cd1aea500,dc6adf793e31ae26f035625a6d52c3c4f6cc8065825b904188974b26dca75b4b07b4e4e55230f630f2e20698c668a3f9a11474bc5de3148fd65a579b3a2307d300,314e9a0b16826c945e10070db5a9c91ea45942ab42b1bdeabd1c0ec7dc0efcff50a9e97857dec235ee18ab00d088dc0032640e240b3825abbe4d81a9b6be739400,7384e89f6140b356b9c3a6f65032bfa284f5c7efff004f179a2d584bcaf1d9e94481722e8f6237ab348cbb656e4f04b45764183cf3cb36ea6424a0c66c53df1600,b31f6876cb7905f92a77e1e3d46186ae5a4a2135677cfc9d38c573fc02866d864bcd65d1157d10ea198e8c66cfe231f2f20e1392685e962921f36c16a2ee24bb00 +2cc7128906bea528b5818e0770ac86b17d302c92cd5ce901d97fbbee4cfebef3dda49035f1ff910a5c877d36d6806a13746b36c5d93db92d523cb210527dc75a14a0eba79a06b4486f1c8b6f192f3ca9db7126ddf72dc6f3de6f5ae0c08b176550ad94b4200cb76f041f9b505d760bc4f5bd48fff0db825577ffaa79ac874385e809687053b5de97a791ddf86b84156a3244fca846742968e99f736ba582950245fc61754466095df841dd1b1b7924d83fee1f4d1a,c07b73f6d143ea95f435ec2e98c0ad19bad1ed38b3bd279cb503ae948ad66483,30430f4f498a7ed73a2a58df75fd2faaebcd4f66aa0ad8dccdeb95c04b321c3327a5b37f47cb1ced8bd96412371b3199d8c2d86081ddb7cd8da9290587a81b5101,f674c0803e93e0a7ce96347caefc0b870ba11b4de0a2bf53386b7900b92ef7562d3a19905df8804e4c4d2d333228a754ec90de0927b6b48477d889e9230ec46501,526acfd56124862936191db67d7736934a137376695aa90c758fec82726af61c5af67703d035d52e88b71722cab91d052b31dbfeccb9c743b08b20b16ce02b7301,d39dc09e432d9510a39364230dce8938487327a74a449e5910e7bac2d8a28079739f9a620a4240a9bf10d5a595c76d92050c0faeaa88615d3f8f33bb358db2ed01,0306e0fd1b27a0f81cc3fe36713449f5c1e8c8ca54ce5fd0397ff7b769822ea16ebfdd143ced6d92a59210710a681746b29f2d99f91290d87b995dca4903371001 +e7c0f0318d7c040e1438ba772da17d20a9607bf3b5f3298e86cab42a44abe1e48b18a718c4f310a42c725380abc6d016a9207a7add811db4578497efb6666ad5c62caee8ff98022135e9b5fcc29716ba0dddaca99a18734fc457c30d339b9dde75e16a9467ccf82c79eb1a21b778fa090d4d046ec4084172a1578cf75d77304ee9cf7dbc0e2a678e05642547dc9588e003c80c967c888847e341f6db9296cd2438f73a1bab36830b43cdf2cfad57349143d2e465d8,c9544ce45b252131c0b204a5a8098ea7918da20c9830eaabeae2deac69b51beb,a1ad68b98fef3e425961a04fe71aa92aa4116ecaca0afb61acfb38f48e099ba41ce5d0c09ba17cef66dad9b3381c1b9879a92f39acb6df1e423339ed7d23b47e00,76a71b6462bbe4240282ab92f1c100d16a36a507965cfb9a0a65e492b32ecc561497653b1d244f2b96fd0f5630e0f1a80573c58cf04a9c6bedfed6208fbf877100,10fea246adb6efe68eea2d6c89e4980e5347192351d18df41eb2f85fa6b68a072aaec8100eedaed3b7f573ce45194172f0965f8a13f8eddfa9d11f09a9c46f4d00,703e7da2aab09e6d953a30097ff40aafc56c3bf8d4c98282c666e8d1072792bd12e4a0a24de9791f81cf1a8e4edd124649978bd600d10a0b6ee3b2efdb1dfa4c00,b14cad7bd0259cc445cd93ca88fdde8989969454f4882f318989f7ddaf34bfe80a1b416ae531e9fde2ba50587c023d98ddc8228c096cb2e76eca9eb5a076a68201 +a6df948fe2163f917ca4e835a17ed569aa6c57475265eb45b199da453c99f982bc25938094dfa326457ccfff9f49dfb4003fd0f0cc9e64c7b6ca101793ab5036f32430f79ef2ba999d2e7533c915153515db9651ee383c8a951cb05b558999bfa010db392fe940e5f9a7cee26ae20482742d2f7037d8abfd21f12139b49939196fd7d0f31be3c7734522b487329b6cbb025a9ef9655f27f809b04262b0a7ad3dda4fcfba913aa1bea2efd56f0d44f5afc576fd2c3f,97ab28046f31d60b3b90335a900ff0d1c90588626e446582661fae95e6c2ecd2,7a5f5e74fb99c11123b81f51ec55985eb8e3f187cde1ebc2574e4366a41f585454fd192ede6a8b76127c841aa53b53e677b29f13b66e402dc6efa25978189dc401,b7a5400cd86c79aec7e5609b68df0c51a0dc36f414c955b2ec1e4bd656e0033870df5e4c3a350f55f4fc7194fb431eaf3bded84961ed8dbd59dc991e0e93f86101,fa89f582a507114bc70534a5d645458f1dd6cbf0f30166dd8abbd188b78188b07001117db3b4eb0c6eee597d9176e43d402f35ac9d5455f10ac00d0bfc64246a01,9160c9d2239c87bf1bf119769cc213e00055fe98805503ca4f177303253cf67b3c8caba5cfc4dae1097e04dce59dd85f2ca5f10cf24a8b8e229eed69ea0aaa0c01,65856ae4f58f13cd66116d72c30fea23ab6a0ba0df2ebed0b873243713740e611cf1e96d1114d522c944e500d540a2362c90856f3045f707a5b229f83338aabc01 +43c2d8ecb32d61fedcec5fc1fd582f35ee37229321f66dff07f5d11c9bb1c2f5d558c96f0bf0910306f005ee5fad38acbe20cf18e68c6fb1fa682e544f6c4c4e1a9d6e848787f3aed9f9d5d02feb88fbd11cf2d99e27337b94de0bf2943211cfea17f0cef72297a4f4cd38c073ca045b4328904e8e3d97fd2951b7995fb3d4c4c42f3a24ec5ff8d999029009be97b9afbcdfbd785829ea0775f19c4de155133c3a9dae4b8fd7b34063d3a060d8c92ca9374479cf8a,de802b7356660b0e3efdfd10b1e35d2207ba01465d2a48fc21a221ac32a55ef4,a4fd91e3bc6a301f26a24dfff5497eb12568a89500c4d5afc68c7d45ae5d66f54e31abab8914c2423d0d2e309a645eb06e145ecf5f7fc55c7efbecc2c649796e00,a70729ed15eb4b0b9594aca4a209c251dc15b29ba8614551f27c46f7eeb376c9292ea36935567f86abb1bdcaa0b1fadf62bd114c3f961f0cfcddcefec4ec26f800,89562a11e50c596f639e15b88d2bfde1c6dbd6cc5f1b522222d41cfd761d8d4b5e0a06fcb439464c934054e682019d56424776d27f723cbd7dc00fe61aaa5ef301,6510e342191b745f9de5008bcba217db50bcf848fd2a7e1c3139d9f6eb1dd411780c69dbffe75301150d6efc24274acb9f6dc644f7ad8c669946f0bb3e57e40b00,16cd8edc54c9f8df7cc35eae8ef465a05bd03ba8fd8811e01c226a3e07534a7f3e9d94e3a4bac01efb8c90c9f20b2ae38c101a1728a17cff325bd0923461adcc00 +94d69667124adc59f4d020dc0bf0ee11b3b2f58c8f7ced129c7dbe6d8589678d1f7aed2cf75eeb601c39608357fac8642b5cfc43299bda1377a371d4b0895fe99acfa78a5681b46e36452ec5f4391c5dfcf5a3fcbebeb47664669cf8e7696f38dd287a3ba7df0027eb9fb20f7c1c5c1e013a08740a4c7eb2464901000707ffd9aabc148dfb57b46146a7a9e713171567ecceea42ddf3e86e80d80e8be3b876bbad394bfe59e7e50368085dab9882f3f0334f9fde5b88,eed265655d74b6610313745b7f846312c7f57173b9367b4616b4e8320468d66d,057fc65d3ca555223df71b4b0870f98fc004862cefba75a038b2b2b6cb0db1f251ae811c83251090d8adc29f1d471bb7fb5e50f8a5e3ecda5009a8d40cb1caab01,f3dffa1e10c5aafd3d9c8ff7d56acd0952640bd9d59054c042d95ff4ad401479701312f4e7290b57ef013c7ecfbf345e37c5b1d60f2007f1aaf0320adc8a138c00,cb1d3a907f15b852c388a3765750b352907b5f1c99145aa9a0f835b082579cdd520430c3ad0e2d10c74fd1362b56c18d49bc7c7cf494b221c8dbca4a843d905401,f08a2a1bb9be6d67232e42f0e9432817ad501bef2ca89520e0707f2d1cf92eb16b47956300caf83379ac4edcf6a3e18ba32461331d105d1128929f3409f55aa100,6e3abac61182372497b6e4b4e0436acada39aafc42845f175cd30e54e5016d47120972b5a33ec3c24448a5b0312e1991a9cc03832443d92eea19af8bc016788c00 +cb63c7c56195bd1d48c4fdfa0e6a50ae9335b14a1cbaca8dbd6979245122f6c0448be2fc8a12dfd8f4edd8e4b7040d960b3df065524228fb9ee2ce486a49af49daefa29d9dc00d73c565de3549a24ae934aaec1377b4dbde08dda4609dd9028c1650df60425563d724221cb9510a1c163f4938471313c978df37c8743a987b2955f89783a5f0583f73a9d60f97238e82776ff858056809ef99dab05a5ad484cef3ef931bd616889ee913e64112e3d6adbac7ba2cfbbb,9057dda3043b1eb5be8ac1cef1f521936c49c1afde112dccd49851e67ca55de9,6cdb8d4eb39899291ba210ebe95ce4291373587ecd795534844d607736b3db0f4c6896df7e371343e384b90ad14aa4ec702f88ec9594fa5cd06bf344de8117a500,939f7f4c9a048a7a6a47614b4e988f65283bf0414a444a2b2414af5aa606fd936d14946902d3f67e86ec53a3a134f6444afb44553380b35b878d600b75bbc83801,fa5e1c51d271017b029a7942b7ef33310212a36d89cb92ae067ec01ba09f3df43938eb71e4516fbb5c22536cbb083f7e792f16fa1108f34d91b256b750f8b3f701,c4e9af89c770434172b14241b9494a7dff7ab031ae6146147231ad29f79e10384812ad904e7bbb3637ea71cb41c13a080eb3b93c905e33a2c6efb072b482128f00,c059f25d0ae605730654cfd11fa72284d493a2b34e6552da385da04b9371f7026a6d86f084a4fa943629c38b5887e581af6d884c5cee3a648078715b5bd4b05401 +68c5f2e3cc1c37ce262c8c5279f0dceb698305859522ab386bb8290a0d5c4bf0ad30ba18012fafbe7e92406cb7396c5333ea74002e848d9f288846c2c773ea6f455721134623ba6f8105e6acca294254d6cb61ef5c91c031cc66544aacd48745a9d9e371495915d280b710aa049d74f466b68679641ccc6e8bf0c9045e8f1a35edff29fab0d6b4dcb188072477c631cb2ce4b8d212f80c9894fba5f31e8c6a96df2960b04ff8672cd60eff63bf6dfba679b6f427f221,55799cf96f7054c052ce4b1eb6d4b275e435fb0f152ff67fd1a8288b1e890ecd,faadef273d5f57f1c16bb04bdfe8b1e4f9c4151ff605b0ffc4e7d3cd39c95e80533df320ae6344d309601236d4c1971153e4b9b548e590becd19209e3866c81900,59f2013aa662ab66a13022a567ef69d7f79aacda9d48dd505f83b32766742ed32c47432e858912b24367880c00310ec568144c5c2a79fff93fc3291baf50b65c00,f8104571cdfe49d96e3543a3f72c6421a2d94743f75a053f66c70d94a1d640ef71c3f41f2699772db467721882bbea75539d02a3f3ce770033d400d1f69d6fc900,c2ce8644719d856b7e9594d02c9d0eb8e5ce39118caa5b17e4d7dd11582ab75a0b6558b135f6a89fc81aa299fce6342541f67d815d7b0b0d0550ac7321a72f7b01,01a40de7f5a2fac9007ed94775fdd7c0b3b57e971b1a2d6570fac42eed14b67f47cd05b005efc1fd8cfe003c123064ffe7246aa1225fdee7fbf3b43035eb91c000 +b2fd0aa11b2e022fcb598f0235049b92bbb54a7e736e96bd1af484452c1368eacf8ab722bebb77306eb76d6355d836c5a1cafca43452e32e1fe0c7fdb94ff3ac6b03cc4757b2c5de047ced35e6aaf505423bb63b63b4958fea6a05ade6682c8b92cbbd82264424dca018f92310303f4f34cd695633e412dc2baa37467c4a37a1c01e287a3a4bcf23613b86771c6967a05fb6311fe7bc2efaeef6db5e2eea3f3d47a74588336da243cc32c3303376bcadc4a264febb78,94b607cb1669eddc82cc651fda7e53f4a3cba881edd0a38cf6039ff6c3195429,1e56b1b4361f807966f17aba46539b8af4b10c507e65d472d7e5f0c007cc503c3e6b3a846e8d3e6d92b04e8ec72e2581eaea08d4d58a4ba941a88c54cac9dd4301,7285404b9a48612f4a2156c5981dfc01e6708737ad1cb78a2bcdbe6173b08def29a93670d3de65915249e4207b6c73a13f6b6dcdc170f8c434bafca60776754b00,48d284b6a7b797f4cee1095c077ede1484264fc0fe7537ce2dd7ac9d8a053bd536cd7839321c40b5a3b1e8bdf2a2be4c5670218cb0c3c86daeaaf92970506f3c01,a49f9a4a130f6e88e65b6e73a0d6b305905dd39a9ef0ec33a8f4d5a56aa9da2a2e915815eaafd39c2e2eef705344e93f0e2d5351e6bc76e39621e2cdeb58525d00,7af6523d3fdb4c6ecca4c819282255a2306afbc0ba25b1d644b9837504becf83757a0c7281fa35be12741e98d6fc2ceeaf017f5576bb2c843164d71d994b204b00 +9d8479452c6c908fd2f4ce7df489e70fbd5e0856233de77b1a6a8d12e6c0b3cf1678f03381e0ceba174285cdeb9035706770854a10e975e37c604584e02f1ed91a700ffcb1e6777c9f22b93f158d5bcb99d9e7ac61a47cf955254e0c65e36cb27941675c29e33b4ea4bc1e55379c9b84ea5c2a3a67a2d902da22c2df7fb1b96679d7e6cb11dfe0f19bc5d5f0c744ee9351d1a9db64df4d7d6ca64061c3e8fec4f31b9146820c120b17e31afa6f358cecce0061cc39b2,2bab2737ef384216661f91fde3d13a0ed4aa9e368b92f54fa47e9f48b69de9ef,a846a0157683b16c796cc73641f27975931d104e258f0e42a528e557e4e6aca209bedc415908d6ef725658562305951b22fdf561a1845a54108f4f34c0e7645901,93f3f32f59086e27cd73d0b80b5f8796372e2f6618b019a0009c65681ec43da56cb84f7f03a4495f2efc27927baf2e58b3f0fbfca5ad250ec7a81a46ecb5f03501,5b9c1f61e2dcee5dd9fd9d6be9f0df282219a034fbf46b6e1620c52939cc11fa1a74c92c5e646d0413f3faadaf92f7927f907a6b9a97326bcae0d8ed1fed145601,8c264c56919dfc784418d591bd39cd1e0306fa7bd739a6692a1ad278fc8d9bc72365cf1138e3cba45bce160427a723ba83a300d739b680d66f97b88bc9d7241100,5e0b8e8c715e165a09d618aa97a80a396233cd45cbf698be10d467e38412cc0f670eb846baf55372f335d53a22f8baf0d3ec110e5b5ddb1d01b08f8e1f04f39c00 +beb5732e04bead00bf20fcadb91cf8ac3744c403e17bbfeb7914ec9915928dfbb89e7bba4063d6112a31d09d280d926fe824bc58398d166983069e887cace186bd03f39b4a1726ad94a7adbea2c93e2e2ad47440f817c22a76a5bfd3f5a4ea9cd21270c4188d87ca63e4e198b7d5a8611dc79ca0e871a6af1050eecc67dd4a131614218f6f5c4e20888d3118bfbc6266610197fc8714f06e149dee20f16602ed2a7ef8b0a1d267c9ad8474497f2d4749055a1a72e500,4ffe2c48cb5f82851d316e10b01fb52bc498236603bb8fbf8553ef08b3ce09d5,896df4b4c82ada56e0a8c6c21d8e89970bc7e418dd52a2591d356e50dca9cbb253dfabc38b60d698083eb07c37760d888d8668886e9294eabebe48809c96729e01,80a078791b04f73fcff7aa106df75db09e6223f1aac547ee71366f48d07d8de640d1a399f3e74540badaeb2394edbf358e58d95c50a87470cbc95fa785a3404200,1a6bf52b8a4d3553a2042a6ee57395785d71d4aded296e6614eeec10a892b8625f3dd74414ad3496cfeef65bc6d704273a25b7e521b492531cb6e8f00752d1db01,aa68592e6c3dc210ba5840c6ccaf627c904c932fb500c237d572a1907e64ce216e92ff75325ab04cd05980dd80f9a7eec749351f38d471b7134645aac75a8ce500,77ea719789eab5583a8f5ae5b650f106f90487f51f1ec9c878668f1d7a049c2a46bba58e5f47ddbb32f7fae2b3b427493a41ca5c3119bdfe9865be0db595bc2c01 +2d5ab3bc91fa8f8a7b3524f54ddddda51bf01c283d54fa8ca642ae67e76b03bf9b703117c5d590632e3fc2e1e2bf915615c7831730f889263fecd8e2e337264d440312efae69fe2d91f975ac70c38f1191b12cf4d7f6a29f5ddb1508d50608ebadfc2491dfa2cf26f8028c78c5ee56daaa4ee25be636352fdcc3056a4214799fceebcdb335193b0a858b6fba9cedcdbf7c8fd569e1287634259ee4202e9b1fe029fcedddb1aad1f6534759e1ed4563120f039ef74327,17971b4f16ec0fca82a763c9df0e007bb930106ddec312bc4f0c5d874e44ab42,70357304eefde672fb2d450c0f13335d475770d04e6e089802beac230cf673597e2d33ce4447773968e5ea9793d9104c72d13ba5027fdc142b64594bfabd2f2f00,146c25fa57047b3400f78eb7f65129d8ef0e05f8b102e465b06b9f97c111ae1e5fef24fd22ae1a9c3ad9fc83ec5de7207eacd8e783b9733cd2aa0cd0a7de152e00,4843be66e18cc076b9c72160635be38577ff1fa264d373f4d6e8b8f3b9c7355929ec5b926b29c87906cbb3bb1c1ab8a2545c5126e6e2e43b46eb3032310ab18200,1bc26f98a10b75abb2d1866e431169cdb1635b64d6a0cf62fe9516aac0ff4fc405d9dd44dcd744f115f32a90f7cf6aa7d9a521c453c382968cc7a2c612f01dc901,3d0f311981ac7461eabe92f30edaa3fb5da68b9e0a4a022ae660a30bac36d7f6552296076f212aabd441997ad0466e28859295cc661b730d6e3d055a96de67e500 +3454f874a4b24b283385184c95b4719b7e10645eceb65bcae53fb0241609808e5586031487b9dfc976b9e8f9e0c1f32b0d49040ec727e8470383caa7f455ffd1540c9c441189f65e9583ca62240e64e72c99709ceacdf62b87d8690c83e8151b87db10d2310de3c2c3f1197ae1a37b0b1d585ef704f6d263c45f4ca4ce8886b35d0145aaa3db64f7727b762a1bfeb790ff602a80048f63ee2a111b764cd969e94b231a6f745086186cded5b1310530ae70cb2e8a0a86,047ec762cdae146137a068041eafe201212a38bd9e6c28b115fd948e6f56f94b,2419175f67f4d11699362c2e07e4502cb1f03b2cb3746d64eb6659f4e99300475e57ed0fffaccbb0b89cbf689ffb8467ae8f7370a0d75b8bcdb175a4588f705d01,dd8080deac7996d552edb27b68b874746267a477844dcc10e8c202236c0d69522ebaacb6a1b6c33cbe5d3f08f79f9907723109b6832d45bc0d003e7f3819b83300,a32546464a6909ca4f878a73924c466512c1ed53bfa837c66e83f1ddae54e29242a918d84d3da62c2b494faaf5c19d9b5a0c0ee35f4fba365a2b21da86a69c9101,d7f6c488b382a6d236bbd0c1b92425a02de77792e60ab5f720affc61f07d72731da5a3dbcc30dee83dd85bd58d6c0c26e4489a1297e347913dcc404d545d2b7801,0e74dca21d7a7e9b9ff54fc96c88b539eb6948323b86ed5c6950ffa0c174620206d4665f89f8bb806a001e3ac04cebad83abece58cb243bfe389778c15d2feeb00 +7a7a92e6174862bbb6b5fa38716664b54f87915e099608230b3713cb0e95e1b98254d352c0968f1c1ee64665f09ec6d545a7cb473444fdb068257a48f84c30d7a06d4ee3badbedee1dac389ee7ea793fe3f3cfa821be396724fc687ac6b716e9e2103334ee16a43113c3c15f72e77d12a0e640317c3c12bb59a894a6ca8b25c4fff3eec8eeb56c48c8b851488f1f8dfa370421f6cec6276e89247e1dfc840e21c930b3d1557bf276718ba63b38096f52c880e916bc76,6ae05c59621743440a8d151b93e178d255f08fdb9603dd80988ba7b0312685bd,842fd857838a0da18a25f509405f5e2f4f242fb42cb2bba7a69007595b4f3d5b01dd44d6ddef80cbfb80640f770e8c5c191bedac53a36e9a9404401f5ea32c6f00,6271f907763f214c68a74fdb3e2c329f5174bddc759b346cfaf70478f0666b23372f4a08a33b1c38ec37067455f9c7d32c8acdd3382d1a6b02393ba4975e089c01,57fc9011a53cbe195a04994d3ae56747901bbe31eb0afc3d57bf0db8fc282e5f094f611a929d2b3c92b3f51a43ec70df2501a6f6e323e5d454f5e17fbd01acb000,6aad28343812bcc68b169c4f1c9eb179e84b67016070c6ec8a0f31da9265d95308650e056cef72d9b86aad547c78c5bb47fdbd845e383dd42eb79f5a9f498b0f00,34a70df3fa6dd1cea9ef6c0e2d2a18f1fca2885e2191c539c124d2f9087ec57419e41b6bc3cb8a62f5363ea4cb594c0509f67e50ad2199596183ae16037f355b01 +2c6537cc12e13580f20c00fc238065a2c2d7ebaecc0a2b072f66b5d89b1effa0c477bf92472c486c4a306807ff1b3a60ed66e4e83b7c40739bf3feb742a17cb8ff1abd35b89923ceaa5ea7e3b1ed7a0f4c11acb9d90d2029dcb3ef3a60d01264eeebbb0992927d0f1e84966514b53a542bdcad3bb3b8752881af5d1b4fe12dbe20edca628c16407ca78a9422fc7e8d1af9f74504e1456fcc15046844c5cfb997d0ebd32ceddbb3e215dc4540d172ee3907286477c48d,5c24e90c9373f8670b8aba01b0f172cc3763b45925c8f83f771d1fd0e5862105,8838203b18c18b6e425f293ddd6feb78e013bb972e1f6ca9aa131568c0449a5c0a5c4bb0820da86fe979a03ef8da35df852b8b7a38616c4a23dc748b8a3c4e7101,8c45289449beb3ed9f18dcf9035d8881511d11dbf6ac4d05178fe6e0fe10211375dd1923cb26dbdf0bc2ebf45f549e94ddf78ac21b647bd69a5b7ea3686d142701,c7c11bddceca5ff275c4776cab596d26cade494043af75965599a285197cf5877fd3574c9b2479fd7dc9a0a33f19b48e5d7f7ca1288713cf8a89ac861f9cf5a600,b5c9f191160763d52986aa3f63742f64c870a4cfc0a3247bd107d4b239420b2b260b30183b53ddff128540de79d57063643cedd755c30bb55f5c367816ca066701,86f166059948a406a3e4ec26ea2a7e6bcc4d08e9b584f7832ae0142efee32cae4689f5e95ea457a6e8ec93d8f354719b3b2424441de33fce2b33df6ff13b752901 +4afd480d47159206e86bd73d713e02a7e15124ca2e7961b0a5d2ddb540f11caf2602db37ee510469a91eb5dd0000221ac82e1b77e28229b841a1917db254c8e00a231fb969051c846b7b72ed8a47af6a73ba09f0133d1a5df4f1052e2366b62a3cae82889602a0ee2fb379cc27d02a586bf4955ef9938ec7883764186755fa590004683f2f6a8a8644d1b35e13dae3ba7a9265b5627913702bb5101b7d0248c7429862d386c39afbebf5f12e388ec62b1a1bebb4aca372,33bc947e16d27e7dde693c16485471d3937bd78bd2c54395561dfc6dd51310b5,a282bc67ecd9d6d567dc60151e8e933357eddcc8c7cd041391d1ad978fcf9ed44499d32d60a71ece01cdb521e55055b71743cc8fb993c306ce7215bcf40ea2dc00,7a208bc785b1ae7148b691daaa0b07dee9e4bac052e1e0e87e82d7dce11194cc430ca57750306795b595b0815fd993217652f835a735e6208d6e895f1af2bb4400,0f108f3be8d671d671975c61bbf72619f7f69666d520fa506644f2b7d8b9a18e1442818f2d22fe8657168c924b6f2bd255f5e68f905ecce2fd9c4b7fc582b7ac00,fb888de8db56a261a9e6b2a9daa48ebda7424903dae6fc9ad366a4ecaab4c17d70868bfe5a584b7330ff0a9e6815502fb0e66e8dbb9589b8896221bc0e31ab2200,d85d9e083b68eeebf5b153ba0af8e3d86d3e2b00bb20ffd01d403a16665a75c9061c58bcd819f1aba2d4227b6dce4297e5a4d1611b1766ca257b70eacdc3381f01 +ea7d92412f77a1a608600d27ada5426256f68a2c33d2d3fc3aef1a7d0f7e9509a3cdb9900cab4191bcf7b0febd92bb137a2573db622507c77e2ff0e5a4eed701ade050fb5399d3e36d77fa8dc245a5c43c4e4cd4eb0068995ee23f968701f227f0993c471a33983e21db4f51fad57a3966a2b5b37f0025b6db76d547f5aa12116cbcc0ff13993b8d31878bd2a6c484a9f7fddf552166b3a89bafca59a91edeb0ed815e74a23034dbccd46723a3ba7d6fb0180b3a824c5a,87b83e137bcdeb6da47ed6782d5c375eea2ad620c2588c6b5d0c8cae872cfe9c,5c152617d13c4b46a225263dd04c8b9237a42ab148078ade5e343efb9f5edc9802e06e2ef101d4fac63b679ec911258cdf09334352395d052c7e19ac8b83ffb500,5de7b56b1f915ecd41718edd334b89e9fc23f0cd6de605447979b3b46cbe91ef5c7dbd24e5c003bd1b11885f368cc6f2f77c23357d323ed8c7d84132df478f0a00,30d3b1044215248fe734bd0b6cf51498dfd5b93de1951c3f6e5e5315eb0e46163a82d8c237b17eddfaf3c62120996481f204bbd823759b08828f6eea5fc83bb700,534135d2d3e92b287f7288c7ed842c51380a8f655042644429b1022c1f04929d24c336210e4bf88007539fa76d667087ddd29c0ac96fc8c446097c8677c855e501,09b4817661bea649225310a52dec47e1a837c7c32ce29955c6017ec45d5bdf730f6b642e82398bc65a6f742573a763444a5dcdb83365bb98e1fe906a3411e1fa00 +95ba9e21aea3dbf7dabcd6704ef83cf8827f7f0d3730eb431453291673b41a956a5b157c30411651df82e560e794222b210ac0a9b07a7a6eece3073c0f1fc87317c0e5e11cda6212d57d823181d289bb21457d885e0e99e34bf7a2dccf5b6531350b27ca8dabc4b9e3a987305ade369f7f59fe58a4e342378e35c686f14102c92f6b4aa773b9c6ad9144fa0b1b6d7ee2a4d469bff503f15b2e93c28598d325f9e5bf6727541c22ab0b00746cc7237b11f17bf1a4c2169d,03c807b12b9bf0f54f856c25dc3f53ee98279cf565a6a50df941acb9819ebb38,a5f4e47e179f8875f5ce631d70ab2f1ae513c21daff940e534fd924e47a1b1324e7fccb547560bd4053bbe1d317d689c53a3236860086fcf9510e511ddcb256301,a5e7c2806f5113ad73a12b349fb60667aa8d7e9abc881f61597ed50d8ca915807e4063171d24cb10d40f8c32694ddb159a5a6f8c95f365becd1dddf73d02cb1d01,a09c31dfe8d261d66b0f489121bf1bbeffdae563b0003bc455e2aa50dce7d8e82db7c78b2e03f2475ef2ccfe2688ea3433a261c984fab596587f9173a346756a01,765378c4ed5d0a67bdc1dcf108d9b6fcaaf7630d8a73fd09f8551df6509834d6262850dd0ec0d3fbe81fcb56a510938b08c03d92cea3e3b551e8298c0a8cdc3001,5e156a56b452d0e3e195bc49000eea00f76f4ae8e637ded820c4232648aeb5734bb0049ff73813b4de83a9d1d29e777e5ba33b8a837798a64b22510766ddd3af00 +f05c485c32e21be50f747a694aea4e42f1819fef94b93a753a04c84437b8335905e7e7f26e8435e455c5ada08c4d6d019465a98b9c37343c76bf2d887f007be10141b991e952e77bda6f93a220dcf355070ad946eddbd5fad85c26adc05674011194fa5b46b767d80350be13b3ddd0b401c7133e7b84fff2005a123d7e01b00cbbbfaa228cf3454a1095cb09405864b56eeea0e5cf241da42125b07dbbf525a80dfd0866b455b2a294bafe6a83c40d6317807c34df3d68,95248c5ad3ca133bca16f9e98f7c09f49f9857fe28439449edaf1676deed31e0,2e3bfd4639992e360d68c25af94a24d63933281e02a8bfacf70f2b70f2ca6a804c7996ea607e5dc3e41e0ac50db811b223a1f068dafa58d78c0a114d30ded18501,470966687b1b90b138eaef9056f36bf741ef1c618e116c9730ba772d0a395f880cb535f291cd42d82479b21c39849d4d7f8a3382e30e327becca8c93ad41743701,9abf96f61ae50fed833055369f49f8312d5691a269571e90aa1b61689f37647e0d96263ac199c635232c02e16037759b2495a052b5f8b8cf8b040521e1f111fc00,1ea50be53ce5720064fb930937850c9fe449e67b70a01f8f00f74e84669dce675743b68c3422c4317be77219b90d760c6608d24d8604b1d185479527a6dddbf800,5f48d94c0e3e922fd85ad717ecc228fb8fda35015a38850122071337b89ec77b0b4bb8a23bab7873bc3071eb8daffd8c26d59c46f39f22088167c1c9164144a301 +486ff3eb165484e35fc316cd6d94cef763639ebd87259ad60ba6ee35eedf0d22b73f07b94545ee869d83934e7814f80bc764ce9637dddef264b613b5c551fe2a9083f012414de9d8671e2b1580877bddda7074519a6c160069cc2877aa3822d731e2fb6037d26f80fc2446fe59dc5f3c969982811b129c18a83d61304b783acef3b3cf741f4e24576b557c81b66d5fec3c4e1c2fddc9408b1e30795f60bccdb2f3b785f0a0549591a4d9584d8cb8aab946b415de18042c,61fff7ce85b81c7874bdb901f46adc3a2377f9575bf55916c1c3a6512ae9305e,22b1e763e6c778e7ac35df515f236926ce7498c806514798851167b8a0027f15475df23ae4c454e6f895aefa70481e460062c12ce15779e5e2dbed5552b4d40501,d43c65ac17a61aa26153ec6f8752a1a17d1da63227e1f98e958a74f0347125527d2f4d464dad9af9e96f3d266482b6e4b0c2c44cfb8636e726338d361f141b4f01,7a082d4cd6e05c26556fae45fc75761c4895137af8e280f966aa36da3d6063ef26cc93dda29cbb03a1c71aa066a9f2286b8888dd83f5216cc758ef993f9e94e500,1560f76b6c582ab2d4b13dedd6e2cbd7df85ebd87cdda040d7fae51a48a7693c129fb74cbabef47ce32059f619f8e999b5df662b21761a47c406d16fbe577bce00,65b86c82a37f3d8c2ed5275e003b369b74da800ea389e945fa26b67c5faec69708c324025c47b7a134a65551aa006ccfe4fce19a3fd2617e8e539df3a772ea7e00 +9390328d599fe775a284a68a62c154ea87c3dd4377ad66f4af4ef0b115c535aa844f215b765865df1d964a248269c0b65a8b9f25aa68b535a4431299ee71eed0baa40d2372055fd09749f732870c53384c12bde15eb3cd3e5805b262254f91c996fba74761ef0cda98ef8e512f5eb5fff0275558f60767b10474dd12f4dea0fc20bf6875d728de84da8c84c8de6d4dbaefbeb68bf1a665fad087e723b4e5e8f2e029819a1cead494b91ae2aed4a2dd69ad5fdd5f47cc75,6cf370d5a50bff6c329bb55e785bfc34cb3af0ecb42b24649df5bc8c287337af,823f6f9b77e77220b46c77a5e04d0b998a93dd60fa943f8dd9d04ee02e18bae914760984dedf04ba4f6e7baba9b7def7b9f16d89da3daa4aedeedca0bc91caa100,e3dd107c7e1ac51504d0f560d3674a9e000b91aa4e984877ad3ac2d05b10af5d3ac2673db4d8cf9f1b3f9c08d8c9a7d518c0ee71b08b3520689d3929a33906c101,e12b1e30b6b4cbcb32fa98c2eddf8f27689d2d5c8234d9ec0b52c078c3f8bfe55423e8398bc516c61896bc34fe31221358f249e5994c5ba5c78b4b574a40553f00,f9d77c100ec8be29584ba55c23784874fb180b9b0f91db085af15404ce4f809a6e7d3648505bb4662142cf85c2d79072c7d3b6a70a4824b73b2447159927ae2201,e6d5f8a394dd3f23fd1a1e2b673bd8aebeb38061ceea04473d17a4363cfa9a2c57e4c15c6d72c0846609d17f5930b8393c26eaa9a94f094d385b8ed80de8f41001 +599cb012fb2d2b955c86b06217f25d9811c058670a3edee5a62163ec21167ddd0f0fa7cd943ec2659a2a968e0d9bbe29ff9a43e4e5929e20ff8e05a8a82b82fbbe203dd16296171657b7aee336c360328c4c56f863adf57cf52031886831cbb1b873b0846694cce29a4e1234e2bf3601ef91627f85d03756877fbf776a352c9c6bdbcc1f55fdd838870a4feda21761bf60914b9bf8abd227026bd0809a46b1ef37c7d9750379bc41efb073f4e37e92db97bb9f67aea2b1,cd503f0dfdbc3fff1a1c724ad31ae88e22a3d396971247914fd90fb48e161770,7feebfd47f7f2b4c91203792552bcf877b290c2263912e9a00c31d8d2642b0c55ef6d5c565c0dad67f12092f3c5fac3caefc138844023b21f12d0d74e90af02f01,ff62b19e81d939c36acf2a09d46f44d33767987dd658300c6947aef7a13c7b366693947b39b1dd986fab1b5415489294d80d293084645a4736f76865b548225501,aa6ad1c9c580df082bcac4de368aa2153b9a3a6b8d76746d078714869171d99d2ec1bf52db808e7889c460523bd4c5bba29ee1ac63f38902f9a30f51701f8eec00,30af0c72c26abe3dc5c74d9caf0634c6ea0a4e7dbd73856ea53734095a0ec384317e88ce1c2c2ea70b653df39d771fe5ca7fcc970b8a93c2d68767efa347d6a601,2fa4a6c7903cda49e4181568b09054db4625e8834686b6b4fd38d5022e19d4901abbec6f0cacbd77a1dc808f06940db19e7199b20dc2c581c8650d9b5deeacf300 +772c5628576a1a0f1931f3a8452c4a49ad0575857f9a1a373132f4bc5022d889866c80d1244b12b571d3a481f6c4d706a31bab7f1cf78f60fca3acaae31f22541da7db36ae2d4f827663af55526ab609543abd29c032199a590ab05c62a4186fe944e3e1b37d1c83309090daf10ca316e6838f089dfe100a4cd5e87630187f4cc16e12632fb3e31fb28d8e138ff9cbc17682ce2d561bc31bae9a2335ea71ea503e547300900a34149863bece13d14e9de555b8c5827674,2cfc53ee96ad6a6a0e5d368847e9d9e41199ae46795321c6a0c6272825c7732b,3583b5bbb8a2e8645616fb334f8e08f6bb3463d489c972cd574d9dc125980ec7553fc39b7b836316825addad4863320b1685d1fef49fd70cc16ddcc31fc01bbf01,7c1f80b5bb4889cdab9c7932da0fa914f6e772eca4ed3365ffcf22b07d9eaeef4e5794168f0173b2f098c205c05b5d0aabde08116f305b06bdf2feea356f48be01,e259d731d53d4b4710df56ef00ec0db124c7ace95230e67f718d9875916a60346aff6b628f21178d0c946eb5fd937c539f9ae2445325274942a2393748c03a2600,90c36fc13729dc0b6874bd0f3fd29115250319401df44a208d449e5fa284de3c385fddee68d5b8a4780363ac30ac288dd786df540f15f6236809227ed9953e0f00,9f46d797be729be89d03954f676fbe906eea916028b5a0540acbf51b28b9f8031675fa2cfe00d7c7fb4437c30893f45b393c3de008681387551df101e889c13700 +0de2efb7d2ad41c947fe2d1513b1bfc316cc04116a0f8349eb5ea154484d4f690e47f9fa0a78e4c39b70d402716344b55de201e31a8ada2e2f76f8f36c77738d73edacf0f390b8bb06dca37048d8eb730009907a4eb07bf137bcc69d9e70fad432e547c813aac19679ab47b071c6086917031e727b862395c52b04a029e66f56dbd03a66d3a2b7bbde6649a1bbf4e92cc1864930e03d66545192d6464af34e7759a30de7fbf521af0115b578a5436a876c5e44dedce08c,76a5259b2402885974abfa73d06f8fc99833792744d693b7517a7b91dba2e83c,014ac5f57d8a5ae256de7e83c53941a79fe0329c70505e29886d7829b09d0d85773067e1fca6765ceea34c872bd97e90359c79a3bc5ded5b06eafec7620c1b6a01,8d608ecfc437ea438c8a88a39391471b2b6e3735dc0c97c7ef63b37d993cb70743f2b5cda650d650b05aa65895e73380068257c49b58e40f6fb190f1dae66e8a00,8614e98c24a956f17119c7b1e020bad9af5a88f8d14d42c252617a0521e3885a52042e9e689ba335e56584ab5424321486a9fa1b3762cdbe51bad784d8f683b901,b097cea98fef4fe69ac8d765d22672fc5ba9eaf81a7dcea94aec2a2524c947c7319a0191be7fa935f5489471db520d21e9a6510bea4bcee09f635d7b7f350e6a01,8936f45cf36c0fa8e28aa7c58a15a6546bdc00233bbc0dcf1d8c34df651fb75340bde22ab538f6a46f3478b99e56e5d80432e028cdfb518e577c40fe8f0f0ff100 +4e947b3f9348eb977d4e57c689dea83a3d2340f7b3a69d8479ca38796c8f0812e51f2669d4722f48c1e5362d00ae6fa6cc65226e1897f59f685dcf823f0995db78182453859399a003821de07542f997927cbb7e6ab0d1cf7733fdd4a43ad2ef4863dcf6fe7f7496dcb59d370e965aa1b5112df85eb9f4d62f21453083fedff87c9d7ebd43923215795b2f449d5ef81d4f3e0f865b37e3a180c63367d13360076f1b2a2b2d2ad1e6296b6c4ab7e7f2dd5e47757b24ac57,1a0c378f725d50e3c1ac54e91ba19dc3abc079a7a9bc4682b3bf7afc9c722194,409675890a2c56ecbb4728fa74df9e1c00930d7b51730cb7f6e78c84924919de54a5ca1e2ad37f60cd980b62d2c00943d09e5272ad7a15fbf5754680c596cfff01,0efa87e522f869792e8cecf9fd06a0f8128b6936f4889e0cd9ab2434e146ff9b61ac5a46e5c8f422472574ee8a20590028d781e6a10e3703658fdba13a745df201,0b1b03e5b149fbafe5bd4a7de1dd764981360a9b0bdf94ee8a3b606f8d9cc30512b2176d134af9be254e07bc916032d7d5b34c325a3d3ea76081d431e79ebfc000,15eb25b2f41fd8af6acbb659568f395251a6a79a6386bf9a4302df297f86cf7f2f3f35a8992f91acb7e5b3907082a40e2d79d631621ef6edd840e5df9c0dd93000,50f90068bbedd1c210ae4666d2f3f1a7a4f61ef312a8980315adde73da13e8e538f1bcdbaea17793e2ed418a8fa2f50b1d25395743fef76b844beec40432e04500 +440712b2d13ceb153b1386bad05d359f87e258b3de554ca3b7927211bc050dd987ef980712d0315dd98376500ba3e45d8be43f2cb3d9944026e9d9bb462513c371e216815fddfe9f5fb8e5e56e0712a86add786899957273751a76362c1b5abd7cf4225c62e498f088939326183ec05e686a237aed6891b846dddc94e5e7b34ccbc42d0f3079153b27e2b55bc1e1db1ed107e48c0596f0bdecbbc3eb676d2c76ffecacc185f7893be07807023524d9f5d90a3c5a48350f5f,57fa145dc01bc57f92baa39d9f410c3df68ea60bf206bfa57042ed665f5f2137,5ec9dac29408fa4cc69f8c4d2e10e20794769682923771fcdbdd30902314e07b317b723a2ffed9caae5408ffca30ba803049e2c83c0df87fb4566aa538c1080c01,151c0249af1360259c22ef30e91f0e93a7729fb18aac5051b05ec4e55124b8916891dbac867b7ed972eec57355eecc1ef068130926b0e283d5d2d70bce1f188b01,47ff11daacad3ff32b5b985d1c919d371c975fd89e7bfd40facf8d2d971da2a02afd399932e623e15f7488068670063ab08712debbc2e3e61c431d9473f8d10d00,ef024f605eed6bf20b57b05a86c5c5cdeba0c4d13ccb3e211dea7037a4afb87d19b365ed7275522cc2c33a76971c4ad02c4fd0ad045cc946ee260f07259556e000,a38e831a8fd6d2fbda9865929497ca51979d4e51f64ba54df8a52aebb7bfc3ed55a4f7f534f69e9912f105bf70b862018b1b4fac2afbd1a9f0496a30cddd821200 +d2e5dcf3d78302b1d2b23aea9e332220d25af1f04310e099f47bcbca3d348a84b340d571624c90883ffd6b0edac8186d35c87e7b7638974cb32aca79e19cd4b3f1b1e2cd47bf01797a724f61096cd5768fdc11a39abec92a5a036129f062c55cd94206da2118df2ccb14dcabb5c91e3cb269818248675640dfafecfded87674472cb54407cb6c95b884fb7a906272bb557378ac3c39ad8beb615cb5fddc97c931f17611f7bc8ce4ceb50e6ce6c89b79a518073e80434699c,069527d8459b46bc6300c3782a8ad4f875ef44e78aed593feb547cc6e132aca9,6f03431735ce3ba239c5424bb5895e3e8fd8a59d298d322fae15a22588e579832252bb575bc42854b7f52a0300ba768acc0d8fcf19e00f476345fb2c5df9da4300,5990f25475be12ae25ddaa182b2b06a5a010d196e474f736faaa6adbc37517d20cec4e09ed825100aa631e3da268d5f423ca6054af7bd1ca9f0fd6b3c62a6de000,6e08ca812ff686101b34d5b38c5ecdbe6774a84206793d8d38e033db98acccb847048ca8d8d7453e54c63607fc0fc5665157b998f93dc74c812fb2e571b116e201,2bf433b5987cd829df19b4a82c2a4aff4d33be6314db5b61ce404ae17088047273726845efa013b82e1b505d06611098d00fdaffbf2cf4d05268cce6efb63c6d01,1d4576e02613862910497e182df986a6f2013076dc91fb98b3ec2cccb02f271455566b97b1dc023ffed392ae4d7ca391be3344fc0fef5bb4de7fd6d36bf3fb5501 +6200c5416d31ba28fbddee04f56fdb823d9e1383b44923ec121017bc5afd635b297f9b17bab7162b4c8a0bcc6e5920eb69ee0b58bd3a12bd95f1e32c4edd1e60e1d16fc31ff99d0ff29690a9aa166286b989c7b271a8b5c7515d7db93447ee2cbf375d5470eade9f8ecb06a57fc5435fba6b521741e24beeabcc66ba182ad63d1e60b24b4770cdb4fa0fdb5295e0f435428de0c5905aeb4b57d60ba9133464acd2319c4b468e82aaba7a344a604289609b4ec99e5a1d0e48,51b5fcf7addc96f1c92944edea886ae44432f04c95c021250216af954ef0e150,859070b2793b3a4130c06f8726d857af5ecd0240d4673f52021e2be24b9314295bc9992ae3cb49fc26ee162f550d0750e27903f9a9d66a173132b89113ab8aa701,427acde63de4ee40e9d68f574dd6f7ebaa7241e1e582610088f7bda886f3a79122606c1558e26fdf3c84846e04a8a229ea3ca5a6d4be1e7df121e43b8d12a88301,6f63e75897d136fb4a7c6c11a01a24f6d9390af121d520f54f301dcb8ba005bd6f94dcae82fa574d2caabf4cd8d3f8e42c22b3d7230206cf351c63e0fb17189800,a09b0f0d914c1d96b10c48bf956ce7843d77c5c65bbd9118fac3c183720a84f7543f8c9c5eb00824d3ff637031b2af4ad75568ff8b5c7f4b644690607478473801,3fe87806286cea7d829f3d6f08b4398d85a00bbe870b582156ad741454a8285f15a867770e663162fe787d3fe542031f94110b04ebce0b2e33409bbc2624098b01 +fe0eaa30bbcb77d4b165c9f07cdd48aff9856cde54bf32a9eb67f5242df3624ed744ed2de4949994c65bef76d6ae9726e86276359edbd296c728261e818f5ab9108d026c2ccd861aa9c452653324b0e7080e5e18b6b6672ab5d3d342bc1f9a5898bbb1832a730e486dce801439aa32c6271bfbda5b2fc0c1be611749b3cc0f8311076e7968dd0f2e219dff4dbb7ab1afdcf8352be1c51b3563bd7be3cf44cac3ffb82167c3edafc05a20aa18d6809591c1e6adb272524f5e,e9832f8ba67fcb823eb4a256b80644d04852908315a3c43d843c5d012c90251d,78237a8804f3f7e08aea76ed2518c4fb66abbda895f22cc86c30fd5ae83183f44f51ef1653db0289d744c120c325648f4b270c3f986cc2292090ceb2b9d2b1b100,cb8632275ac60820357b9a2d4581818b455d5b10f1bbe81303b0b93e5fdf8c3700ecc2bbb16f1dfbf285aa7762b966feba073bd12db32a89f971531088c4a7fb01,a199a2f246e643830a2bdf7da03b338abcc740c5babbae559ad24c3bb676aa7f09a1736fc349380db7be3c8821aac53a7bcc52bb706d6a528571b9e6e060deea00,f9524bd4c9f4b8e99df3d028b9332d3666294ad935381d104372c09998ef1f54450a0e73cac15546669e76235e71e35706ae46faf41d4032414607d4e943331900,36e1b83f7d125530aa73610aa4fa3319a872f73ce02c10c2cdeb48912266fef927eac1a66f9a6009e38f4450e240d93425b0af1d025c9c0896d6375fce676aca00 +51737b4607e7737c73ef09afb6c4bf86568f53790a6ee90f21f9dadee519724faccc35d464eeebd025e4268ac860da4dbdc921a9939c296c5ccfaf8eb1d9c81dc1293f63ad37918f4a6490a46360bf31cfc3eec1a14d6d20a73c923b5d76dd8d386b8616aa085fb54def68f3d2f7e74726ff30d43ed8303605c5b54c020ef859ac25a4b402ea15f9d9e422b882514101e85cf970a6b1cb4cf56b92be59eed06a243a2237b954cc4a6bad21dbf27f6825689c4fbc81d97b42,391a94974dcc0cacf55dffff7043a508d77bf9fdd584eeb0235595dc360cd080,15aa66f68a36733edbffad764ebfb256e185da5c00a7b81042fabd03b3894f09423c58a7305afae9b514921562db3832bff7dfeafe155d49176ddf3f992c149b00,96d7c395424f061cd4e76b35ed40e66a532fd2413874395cd2e513c6feee81432b6cac9b2fef41ff4a7054a93069a96aa08a75a456a9068821684e24af4a429b00,2da52a8815e4f83d56202dd1ec786cc086bca43eb9fdec1271fe64e48838f33c54864698a86e45ed4b9f667175c87f26e00da1935cd413aa111ae560c8bf5d6400,bb7e6ff70d017278650ae0111c7d013df1748f921e2be136dd4f530a72a5b7e3260a96e2295355506c915d144ec81b37612575c22829b309c74edc8ab6549d8e00,6747df2c5aadd51a11107c9bf93c653628dd8461bc56e621aabb052c689cdf334583c9ae59f96dbbb0e6385ed23ebe2122510e25abfa56a46efba7db5ed2f0c300 +3003f307de3ad3b0619f427c5d5647c41584237a93fe909dea2b8a0bb5f202168bbacfe001758442f42beded59e26790d1605d199a7fecc9665ae4484d144b94e80fd9e107dd3b4c3331be3b18407a9518717f2b646cfb74ebf92889b6437b681929429a23ffb0c2351e56d4eb99d90c0c3979fabbdc0eb2d3a7593dd03a6f5b830d4a6917485798e6a530cb53f96add5b96b5e771157697ca606018a2e743b03865885e5e30a210b62ea9562b87ace35d17575ad9a6288c,26740cb881a8ebbd1eb84a53b43def2e80db946204857246c73c826d5b74431f,2e0a846a1e3e0f41be32b1a1effb515ec1a34a20a949478973b5a9b18b679df52c73d12b95fe9105d2439d8b1329f04f9db460d246190d4123b8052842e1570d01,94c92862fd6358264dc9c35804fb47680f51c0eb6969d16123f407ff4325bd751897b1b20e2ca5e9ba452c7f5652cbddd39717d8533486eac51f3d8dd27a017001,9f37fc1309e81952a1ab1c9a13f6179f7dc04c5b7fec4802efc9ae010c4123663fa673c589ba90be7427bd28e783e3d5b0812fbf40b69841f08575848bb043ed00,4aa90d70785e1066f252513169237914e46772999d456aa42f32df80e4f9c413383066f3877c671d02ffe364680d01dc0dc72a384200d13fc73ec5172be557cd01,d2cf9f2283209ccd46c4a76dd361c0bd399fee53b70a5243d10e864f712d08ad2310d6704da9bdfdbd7dd39b2e530c48fe379dd79d89683c5b91b6b0cfca895c01 +49712ef5926433edb2971ffcf48e3cdb57c7e440febd4ed90f0073d8235b57df29fb230801ec90aaddff4a48b9c8d66e38d152a036ce1885e9abebb57d1397bacdf1479bb99e70b14ed48ba92f7c6ce7818c04a3cf0b411afcf771228cc6446d8c6ba1c40384c90e0e7fe8d9d4ed724cba821fd45e0a7ad36e3a0980442efe0870caa96c3879f0b8d6d8479b08d327d9742e5c567c38b3efc881553e0ae5ec2765d140143eedda13b066089b2391d6be7c24bead8af1721b,d408c66736e0e87f5680252d7e687222f25754d61c816eb77ada7138e2ad712e,4ddf27f4ae560912cbeabc92e37fda74da6f5d3cbbcdfe9e522b838ff2b6d7195c926911aeb8dc31cb5e34fb694917c8a0bac0f1b4e61bf3576e79b973badce601,c2f8a54dc5706feeae377565d5fcb07201dbd54d11d5426165737e660d1abe154f29fc2a19822986ca92b4ce3a2bfe0f5d723c03f4fa74e05b9e581514324d2301,eff436329d96676d8f3b42bc1b1d3a54f4f98a4bbaa51e75b6dfd3adff2811c01d7242c07bce95f632ec2293cc6c5e6acb16a9f0d0901f15deb4213db42db35e00,7d0cbab11d78d78a3f7a413259ffee0b310681836ec1e827e988197f9cfb91cf5debf869e23a4513881e6f58139bb6faef03bf04219220bc4984cf7b721beca501,09e878e6fcc0e4b3cd0e89b2820d3553a876dd2e228e690f7de457c6e3a86d40176e9b6d70c3872ebbfe2614ab74e2f9223a5b9a5b6a7eea6eec84277ebef92500 +2efb7a34c9f3e61fc973d34b2cd383f8c54e8109bdb610b96137789448738e6efe50fffe0999df1d19bfef97e714f4d535df95947b7f32334081b0df6ff73ab2cc04d0dc4912612a93e8a5d22533369b5f1ac07232f4b1a3773b831250b1c678e12bcd26d848462007ddd2ee795484276f426079f1db79b21e6d7e43a92409c0d356e4eaac71b73119ada737fbd9ce9e398a0cde4ab6fd6c3085bb245b8fd8e2ccd4f64d9dc6111d26b2e16efb1bbc4b075df9e3d7336915,2f2aaadc52c7d44d05b559947b6d3a9012f1a902ad85fe0f569b1ec6cde08d8c,9d11dd2a431220716514afd3f966aa97e8df2ea4adfe57c9ea94b7b89e956fc46951ae2c05baf0c36ed31c3ff42585d82c50cbbff7dbc903d19b3ef3c29fbfbd01,0dc1ee0b325a008b44436484b2d0fd2ae044b95d7d52d2f38258471e867dea885aa95786c295957d521c13102a2ab01899ae1c7b97563f5f948e5efa1cc9cae300,445d7f67e456443c1926418b5eb91f2036b9f5474f6798d295db412d7eb21619306c3ba180de53c15027aaf5cb1fc7af29de21a7940aed4f5b27e936e92b32c901,0ddb9107ee0858aff212df7a155e52dc8c25977611e992c732855deec4d48f3f51a7c45c6d2ccb3d10de7000ae02dda0fc36eaac162d512537b62a896a1c463d00,4db11817c68fdc913d62a37f2773b0fc47d28de5888ce7fcc9b39af54db70d0c0bf21cf863418ac9292658d84b612bde3d99f0c79fa7dfafa4e81c523b8f79fe01 +e25964ead14fcc773d8f63934ad773b06c98762350f356f30fac846d30240f2592393803abf29f8e8f7ddd4a00575ccfc2ecd6b4b869774bb8400d90e90ef9d145350e22dc226d037d3632e350f7dda3f438f2f040083697348a84d49e280f7115e9720ca987af290158dc5e05a54910c4bda99d8f3e192b2cf7eaa839e875325a15938a5f6845cd56e49e06313b3f151b70f486119085bcf0ef1881560f8bf486ea40f29a9d63cc04a6c498e6fc8b3df7dcbd2cf17b9b48,6364351a88e1d20cbdd7138b571a91b912303603617a6317f2898cfef3412c39,e1eba8bf1192a9d591c6a204bf486d2ed6da08cca9c66e5458404b51abd59fe86afb9edb845163fd9e25b2594e83f8061b9d51a4772a77330e589e8e40d51ea001,32e5d65e7210fd5b02912f0f5b812ac013d213935cdfd5f73bc172f609e62ba4647b2de326ab910c067293909937af314cccf9de0740081fe5cb71849eae804401,8394cb6f4ef039af5236241186d71bdd270942dedd785a9cf526376f55e99a7b0d6fc38ad7974ad82deb44f193f33b44d794a070787d9b0093c293ac45e6de2e01,204f57932323f9c04c9518bc8acbd2856b7c48a79d05ea113fc3d821016fdd615591e3efd8d6c28a9cf92707ac90a47678935c6bdc676859e8dd282205c90e6a01,fecb9e2b9819508911088393471eb63185ca2ecbf5575acadfd2703167a149b224e237493a8c1e57f9ba1bd048e8b60801412bd5c357374466f1d08fb75bdb9b00 +1f3b1df51b298b9ab3a5445da0e42b1bf9f55daf829c447d50a802ce8a18ccb8df323286696b514baaac596287be0c544ea55c0f9dfd9042b16b29a548d2d8646a0f5aa2d3aef483f556d42886a6d8c227c88153142d4f5bfeaa28f03ef8302528f08edd0a1bf5fef97ffa15eb12d655cb4fea2f62ea428bd0235f91c395d3e7add99cc05f8482186d35e2c1cfa05be16d8662f5f0a81eea110a2f7006a71be54523170b6dd26fe02581096319daee0ba631182649bd1416,87b7ce4a2a35b2e8b9b48987c249119f353eef90a03e320b2fa4e91eac3cb004,b5dddaa70387f9edfdff902ca91510874d7b837b4b3d4170840bf0a8c0d1d6ee43d1e902289648ce35ca65400fa46b5616f45ae160239284878ababa82fdc81d01,375b968227e0625b18decd06f4babf1f898cd899e7375802876db87a7055fed66c652c5154b03989d3eb5c95065153ed0ad36396b0e00aa1bd63fb015416a3b401,e8ba4d36ca7205f46095a2d6642e49f26bcd47ac6a235d2f99e0bebc9ff8b55e4ca751a56dd88cba64d02d2a9572e225d9d74374cd533ce6a555b9ca45fd4a4401,d17abdda78c31c53864b484fed68e05a10b03c2b0b6dae8c6669c693f012d7df18ee32467c77677375ada3c2d2bb95b2724b85a7346756e2f70930b9e1213fda01,e90104e8bd7338096f49492744cb39fedd29a02684bbfeeb8811f52e02c77c5802b0e1add2a93011ff70689b392fe82ade0df2f732a0e7ae124ec8ae0a4fe8a301 +0ec298352bb833901fb68def965f18cc56a065f1b00403ba2548a521989f26912b33598a115267ed5720593fd81b5f6a28ea78e202168984d410bc0624b9aef4af5bcf4f18996f8d11d050d30a6d07d387d8a8d798291de09684dab255e4903d9dfb0cd47b7605ec85ea69340dd2f3e922edbbf6b87c866ef931f71b199384ff05d70de2b0b9652f396b33e5fa7f2d44465a1d451cc5115535eae12fed0532a6b6ac0cb2a248a94ba789bfb794299333b62153df2e415dcbab,f35695f2892e477e04eaed262a26e68115cd3185ee4787c5d8d4f83c30dd0dcf,68399793b071618b21e7dacc2cc150cfabd7f78b6b7f224ace1d7b435d50896f7c54249d8522f0e95b418ede34329c685813a3a9b09a30263da6a78050f4256a00,a3cf6f69123514f02f235e4cd2a571c8016402eb61854628150cf5a351d68c8e330c12df21f404cb329bcf7fb3b7b19b726676dd169c345c0d5a7e48bc0914a201,79433e52b1d76fba495a700df9758e144d0cdf0360f3eb72d8f2fb923626f1a82168c5ca3b10d9dce48ed169aa62776bfe2126c85dfb26393809aa99a2f6a48801,08b29761187591ef9fc2fc54ffa9f4c968df685e2405867af92bc5b20b2acd1c34503d1f450b505c2854a206ca8ee4c998e0c929ab073c0cd02783f953e8318700,325b99fbfdd2e43559b614b79b77ab1d9589d546bd576343e1891c0fd336c51c7117673f77a7a4187ecbc6d589e586c5fbf12df31fb46315d95216187df9e53300 +6c81e5aec73f360e892cf2b20774e5ddc341207e03d4fece059f165cee2511dc6cfb15a1b800cb9dcbe53bf3286dc1835755eba6d17b5673dd0f5d345261a1c4ba1ca47b44650000ca04117e5a549695ded267b332609be5951ac432cac64f4281b194dbe126c3e8c9c2eb225fd2d13c52da69f16e6cc2e552c95772d97d432e99ab3b60f058a4b8db7689e3f2218f4890e8af35f92e1c691569a6d3928c7028b4b7f09176c566077492ccdeed827899e1b5ffaf3ff096a050,75c343936f58149e842c19223770bd9a79dedc039d7e85363e3093f64292f2c2,28f874f892fb017dd451219a14139815b0c32e32cfd04c308a92cfdfa3861bbf5e5e21c271c98c3be0faf90bbc6918bd5c02f8f58afd5d0dc6c9ebf53ed11f1901,83e6472bd21f03830ecb7e89196c886f0ce29bf49d96ade02d0c4dd2efcdcbfa510fa5736301a83c6b089abd7f23e2601b477617f65e97717df1403ab53d339000,8e73650f3eb47a5667107d8cb8048f985861ace068d96ecb057b97833a4b610e3d3fded4dbebbb56c710ee2f07f18475753ed062d800fbdee93765c461758aba01,6e9dae13327923b1280e4829e52de394100e904deaa5fb2c7929adad41576fe4041eca0951c895ed65a56789b919969ce2f9e99bbbc2ca51176eb815746753fb00,002cd02ff001180d79959194130f0cad194a2b151b35b89804af16003011046d434d2c29f6636d76cd8c58f5412f5640528bda073cdf99d6b13c3c698c13b3a201 +901f6e518f088352968053ea80ec65395a918bccb820595030fd56d3d9230014c8404fa0ef8e64b81534f1f39453d24ad05e76e537a6928d25a2a7ba5e5be879fd5e0acbd30cc77fff8a1a9991b35a195264727c270e2bb572a30d936f13f27b602abc17947c4ee49112b75a36e5d4de50f6065e2704afd5fc7c646aeb328937972b236813f773c8ccff21378572b16ea62a7b6004df0a108da152ddfd51bd3c1a18a883c18c54d98d372f80600df31f85472cf44931b8db94,d0c4f8cb48a015c21ce5676401e1e9b58193bf8b729a48500c20b0cd04910dc7,2d044c0baf3460b7177d79d967cee06e56ebba490c89b1005186e550329b582a2367ebaec0af75e37ce479d5c91322c8e6f3b2b4f27c4257d54198de07175db501,9c81559c0bf3978da87bbba9f149c09210747f5dd8f6ba5607eaf8a3884d86de684fea7f9fb2ea64141315dc2196ba3a172e76da041446b172cb18dc3b56c73601,0f0934c5a7d124e7490b2e78078d1bc7c51ffaeb4cb07d5d95910588e97f3a2644ce7de5f46f22c695a4719a5f4dbcad2b67c34e7807a4684727ba84e3da659200,3f47c7877c4906ba9bfe7c1c66794aefd7b4a24d7ec1303690c56f676900109902faa44741801a8b64c32b3ecc98bd6cd77eef4227e1a6c872a622e0affb4e9b01,3edcc9ebcaea693133d54e4b0714f1b6b8ec7bb0c4217df7ed201490748452ee3bd5466bd388e8b071a644f0d92c97152a817308045742357c5e75b1e623874401 +9e3a2fa1d76a28119aa65747f8739f5567f02a915b656d6ad8a4e9c7aa32f4f07f37a89669aea55d8b89e088bd5d4ceffe8dd8eb2249f60b66f4c1d1695d2306b4ec102e373de0390056024dba05e3aa48a8cc619796f8d2c002cd2ebd9fe5784e060f4e2b02d54eeb16f146e647b9fa08171124d2481160d2968ebebcc01fd8efe9ce7d048047b71e56aeb197f60f629b804363339559d6c58fca7bd7cbc6b4dd67e0a6de5d77404ad18a8fb43b53ef7ea994830d38d8b18d,0d09610bcdf9e17dfef42586ac970d4d011ac8c5150eebde3a8f260f428de172,61519aeb70064b88dab28ba5237c03f427a01c38f7e9f2e3eccfcf938a86c90f49e03c198b43c5aecbed948ec2ef002f91e499c395c86b41805c23b868ea87f701,32399968fc301eb87a2ad3354b449544a1d314afe75fd1d2c287796d77cbd46c3ee40f9da02739f7670b07446084858b48d24cd55ff7be00ec4a2f31c3364f2201,92570673edaddfa743cf98d29911405f651323578aa3b26b7118a56f7864ebef3e5ac0c1532e28f01bce09028944862a383884d3f57094b7e93d05a4e8b5701a01,ece9a477a89ce6d86369c6f1312a14aa7830498821c854545752514b14d10a9860f6040712a3d62a17963f05bb151c43617447d04cec63008fa7d7625ecf325f00,3d8930c0ea0fa6f93d7fcbb14c07aaa74c470428478aef0dd0e1d06f8c5b0c504501805eeb6412b3931b5b2ba88260bad253ff291a4173f82ad9db4d43f0bbe601 +bdc97a77a3752edb337b2b42e72e70636f2e0fef652f7c7d70d1d2e8921451b71c70b78ab9c9088c906a00076de832704426affa8a073abb9dabe6c007ec406c7f76e53b6196b1ec71ce93bf276293b0033879ffb9898fe52e58c84348622860a1a524c4de9398e001a603592df5032490245a0438e9d3b56f480efe9e3c895518b33e9e0f53534ece46f7966b0b16a4ab44e84799e1cfcf8e5a54693f17b87990b65d763b55c3241b4b7e3f5fe0fc70f5c7e098c06a8968c7,54f2701542b113b1765de051aad1a3b7d614a14eb8e3fcf38e230c5830fc642c,8a0e0b7d0fe3c5215845ebe07e9e8006f82bcfb6b050019078aa95e6ab28ffa83a3fd61277e7799580d509014481c401b520a8cfbf68b4ef1b9961668bed87bc00,4ef3a1ec76ba5cab256d05338da69a58735d0ff5692f2f58685f9a8105da56027f80100b4c330902b828caa339c5ae958214df78f6b9f9a93e5733726dae31c000,a94052c62a4dcc8273096f2bea71b46872ed226333e3f508a4069819a0ad825d08d7f74ea40137be31875314ba5c66f15713b1d8d5b61a8065dcde289a3eb88700,b5e0f671cdc078d49e7b9d9fa05c23052ce276c940c71bc047f0e9b1a44d3c750bf9e98286d2675692d0663b36b877be988e3a5f054403ad51cfdd8b856642f700,c36e55017885e19b58b86ccb9cffb7e23dc0e1093594812aab6e53b7771b4112762878f96247cada36e78cb5ce52083f24fd798424108f34eb5706ad89d34eb001 +bfd43c751e7a901b5b3ce3981bfffb0c8ce10b23058bd66a7309b44946b9b4794c11323cd89bafbd67fc95e1c888b6baa7960928e4b9da1b4bf397f4b4797176bf575c62d3a95bdef159d6e455296cace07bf982e436254b38164830eef502868bdd182ddb128908e58d94c918b78cf76a6151cf57cbfcc13eedf8e05facebc768d706240168d160f35ea7e9de2fc1263d42ccee4d633f86642c50b4205dd9742c5a95582a7bd7c45f6991a592e1e3e3f25ca53ebfab713d42,81358205b22ed980248aeef1ecba258802da9d8eeb33fbc59d8a86ea29f86a19,9742480e78ef41a28153edd0ca1129f67a93b2cd856cf4ed9dcc8303ebe980323dbd71cf851658984f3fb7cccda36aa53d6c0b4d471bd843bdd24547c5cebaa600,a67e5d6da5ad351db7cdd28b703041f887a1863b9ab04f87ce0786c0dc5c5427127d91332ea1a751c761d4a4b3fcf40a9531fc3b963085c391e21333c4a59d8600,6dce37282b8f4821708b5248175d6103421d783bca22db2f1544a1f3a0285a910ae8cb9b616a550fd1e17a990d51c10947877723482a6fa8047ce64b4648bbfc00,8c49858fa9353daff9fc932814cd8d48e7f9f7367d878671c4ec6528c2fc71a0242da6ecc04a0a4e2a99536c12dc5e65c8d4491400e27bd8c1f72f3f61898bd500,6f6cf481790ba2dd39fa84e19bd11d911b5db9e1b174d9587604d104c56addb9576d095b9035423eac53e4a734bc225ecfc8b06ff5b02eb61f92152009e1f77001 +708676e6a076321a16e5bb995bfd4848415310f3ecc7bcc373a48ee7c34a5d7ca11727ec1563e8fd6d0c56a620f390dd6e8fdfbc9a7393f011080d29b2eee579abd8ada4b0f613e3d4fd4872329b7b47f322a9009b3a8d5359e8b86f3679d8facf7052c74ca33bd8dfa2ff851df50a0df4e8b5c02d4751e5748ea583735c6a9910aeddc7b53b7f4f3e276e3f408605f652d31b326daee70da4db82abb8131bb7b7153697d7942cad0c1f29834d47e35bc3225c560d14cc6d4e,ead54c5a3da34380bcbb8731f0a744b54732770fbd64e60d89da479242f89145,9273c7cfb7556a17f61e2d7113c9305d444688eaa93f0897d49527fc18f5034d21d1d88864c710a81bf30cb8b2c1ce0a5fe05a35ff91aaec45fc9cf362254e3100,69b7b59eb1ea0d3e0ef99b093b02b540f4f8b3d3b9e4b1f6566756a35a80e1105c2fd5845faf28e5148aa038a621547e6407f6599929c15734222eb90963c90801,653068c96a18fafbfba9d038c24684f6576f66a05d1f0931543ec2dc3d7e0635351e0d10cd147ababddd1f1b32c3127e49330ef67c588d9329f9ade820e7141d00,b4f9158e3a3265f308532e07ee9263eca2600e4f495d86450b2ada06660649ab0a18c10c85e17f7102bebe8fbd1fc97e3bb4bbdf16679c68ce95b57b96935bd900,9195b473f617208dfed5839b42f01372cdbb8537f83acc4e00215eba0489852326f937401708751f44d799ea20ef0805ed618692f12522aed2c8496973f2b1d500 +1009a02ef4ce2272915dfbb9eec79acfdfd7e8de176d8e1c857d22d9efc0de1b5b5f9398d2598e75abae5ec004fd4386c8c6fbf369e85340ee014fa9566b84b72de9317a1cde9e530128bf17ccd59bf78d1d6d0356312b7f197ecfbfd8234fe3c19d4a147f9f2f9249c92077443e3f0abe0a55123c1f715e520fedc986d153b93edc73a16ff485924b2a510fb763583efe0cc60b37b48428bb57f6169e0a74636010b72cfece6d2162d41ab2262d7f1e760bf47631f629b891,e04bc9a88076652c9e4fe8a4616bde4640681f128d2cffbf3dcac0e2d3e675c2,e2e51ccb21251bbdd8e6475b49a9ec0095332b3e0af67c14f09f71730f1845b3253d1639cef4cd8e185e3973ad142b7804dcc9bcea093928581119fc52b377e001,46605a943462f7fce463c7c31a61010d3c755c9351555f9a6922b626717d2b3e4f74514bfc998220c76faf13cc72aabc3c9bb005e24cd750a7bb45fe894a947c01,a315011797135cfc79129a182945584566c4afdfe97e093093b3db0fd9516cad02707b3dcd9690a5f92731e6c691169ea314c2231f31b0606e0020a0351cd60d01,6aaac58c61f54244cd5d73dc60b3f8a8e76d7700150ecccfee18ba0ceafd77ad4dfe827627fffe040cda90ad4d09b81ea07213cfdbad345abc1606c734728d1901,271c4e4e43a2a13592d151138af1f20d4a09e31c1e95e6401fb07b9fea44f88062c187b3c813f81e7d9209680a0867b2b2d4b5b820f88ea2ecbe91e91c0e038601 +716c83db45591aded0dd9774142be7314d95102c5aa41921c4406a78b5db34e369d0c29a0cdd1ffc256b72f16b99d9d2196ba98f433d961a4287794474313f4e16823dd9bf458f2b1a7a73ceda9856150dee59b70ca046038284a4801f9fa2dae7289bca77c05f89266f9af76e2ec16b638d01a0224ff8d7993712a57f42917212fc293a92c6f2d4177f5214e14b7a836880dbc533e9260d1e026723f42c3eebef171d6ac54cfd1cee94740b913f8c9cc053c9ccf88200e4fb,dd8f53cadf1d44c2aecfe64d1c16063171a8658600073afe958c6ac2d98f7b0f,c6ac7aaea25baaee8a44e50f635c27be9b020de85207b34d4a3098a149b86c106661ac9d745b652c84492039a23066c07d6e108ca95be6822497d125c18d717c00,43d884a97272fba26a26e52f065ccc3a6ac07d010333c631899d8a30459b1b9c3fba135dc625af48153a95d77f544c7f57761960fdce13c5190d66617ca4f4c200,f70de73cd1a85b7575360ea51f753d8b983010739b97d4fa725031d4231d238b24473dcd4ac225d489cb9e6dfd2d6d04bbf545744898257f25b652d124b412a700,a1aabd7264d2b0a71018c867adc88841ae7b04d9eb1a4ab94fe1fb957dfdf699123571c171470fd509ee11dea7caad7739554dea07f193e3eec8546cba28281d01,cd54a17b5417d8d4d0ca5bd5b7ec71525833b7943f14c9c1568e4c4435a815c4666bdc861fd2d8e9c7df64bf88c5ed621315b592f6f7f65d3955411f3800c45b00 +751563b08c541896113dae6f02e90639a9292e9de030ff713ef2fcefdf34d6d6302033e88d3153d97f70b76c4f01331db354c769bf64c333c939a2295e235f90c0aecc68efbf6643c3a6834a8045e5d1da2a8411a75314361917db7c726e57d6e84ab3715498c1e2f6807ed7067221f05d9851b7273de7936bad911dafaf2d27684684ccbead94adb22719a73bd4214706ac2c51902fdee553996c027c7b0643eaf1a7a24421a1c69204202405003a2cd3ca1b94f0fe9edf60,1201ce182bd038a789d292441fb9ce9cbaf15bdca7a34eefc6a44f3b20bda5b7,a799429cf6093c53b8146087d1e2cc7da1c95f5fa1c1f186129b1fcbc28a94e83222d006dc8fbf8f1fec4956f2832620c0836b39ef42d2161a6a8d0aded2dc2501,2fe581ab4e0e751d50c959b19a3228d74f6a876f7757547ab4dbfd6c6374cb8a2f7175ba7cda058883f4c9cd5bf887bfb4ffb5f922c2bd1c6e58c408eeb864d701,99c5933cbc0bcdf3afe34c528b0a0a1459d494704db0d8ed79e6ab17b3931e4f1f0f1a08b5942c26813607af10bf77e73ec0f209c85d1adadc9dabfff7c8e81e01,f86b94133afaf0ecbade4c0bb859c8c1d02080cc33eb0270af5360b3799288156d418c5af35f962dd8e8465771b6731254fd1fe19cac013ca0207be17ca1319f00,914a4eed8d6d6ad0033b1b19cc8373c3ace7833632ced87c7a7f7ed44a9f2ab70dfe1aa4d4a9f235d72e6c1a7dc4968a185bfb31f0fab59435e8e2044750a8f800 +18a697b7e28119fe69546d3f01e125b49704f657019ebc72e11b21ddccb44052078ff8e0d919b1dd9131439eb9dbe31d809d0905e7aa0ad826b25333f10a8e3a42ac418b7df84bdda320779211393762ae347d73c4d417637397ec95bc094d63c37d8d0ab2ed4523baf4a61fc539e121766b3094b2ba962d2c1ea76d691668d8f60a411696bf8dc3900c53610876012c573cb78fc6d042df949d6aea740519ff8d59ce0f7f99a0b5df21cf516381848829b2692c51127cdba1b2,066f9f92b8eb0b1028513e4ccceb031a60ff97f2637c5ae861a7c7e473b0a515,c0feebacea60536146f7093ec551515ed60f7697ba761a5f9fa90f60577594392f07f0f8baf9d5d7721bdcc441d97083271605c536f00303af2938a647f8b37700,4cb63c1cd0d6ea78d8bb7430012e2d6c55512da7fb7ba2f750a9a5120934e1b01c140041687353ab0ffa156d2bb96cbf3ce3b13899a971b7e060c740cff4825101,26656117da1392c7d011c4d9c08a881147d59fe4276813dc21f8a8802aaaa2e661bc83f789f088e1eae2f1efe05098497534663d641ed2caa85e3c0db631b29601,a26d85566d0d937264f76d43433579d7dd6afdfc23ba8ec611d94625a3afe50b15c80ec1524db003d10cdb3800eb55f7020ea8e5a97cd8ddd1e4a36dd3eaa6b001,7714c1a7f57adc651365eb33cfa4ffd752759e28ea72f3c8a0b2b4c023313ad14fc2efd1d2e34f5054b938f17deecd8f2b0796224f2df083952a2710fe72365601 +bce3467c1509b7ef095d58043b2996cfc52fae3a00918c45300d6a894cdb77c7d6fd648d418cb4f4826492975237c330c6aeff093c2c31fbafca99535709b5d25343926082f3bb16c04e034e14b307cfd965745644bc03dde1c94c40386741ce71ffd906a9626a2c80cf750909127349a51aa5c04481c6b3b205cd03d41daeee2dc4e4f8d7dfbe64b3b5ed2e4e3d1bb083671b1b4c40777e3a3aa5588988e8f0d23df4b1dd683d96a2ceb66051abb257f7e0812634ccd1ef1cac,4277c135f141318771eeed5a538669811e17b7405ce4320323a39c77d8f30915,15908ee75beb91ae19347463f466250392c4f7fa67a8ed27bb65594dfede64c669cd262b661bb92e8026ad2747185c8b18900f15596ad0c27f6b6bb5e881812100,65cafeec2cdff43986fa42a453f15ad8362bb71e8745ecfa1ea52abe255ec2666daa2aa255f485b968b14d94de5435f0cc822be4c7cb350afec37ab5050239a200,fbf47a221e30281663c901bbdf0fa2e99e94c4c88b02f1059034d505d8a5dee63ad1ff5798566049fb53269bcae290ec0e998d9aa58de4c4ae92838ba1b8dd4300,5c104a8be4a36d10ae4c88011fcf4eb150f664857443b899541650d337481745045b5725c22e1f1d79f11b00664a081a2a99891ad57eee81bdb96814df6756a100,b1f66fd166d4c5aba2d1f9030d4a781049c00fe64f57c61f0615aca0c6ff04661e0161593cf42aa5ca51ff03a864d48f777b1903f878baa0a8ea6b40f1a2e0fa01 +6d06b805636e21dacf04b3d73c0a7a617df7383a56c3f5e63b171e50b167f47fa8591d01aac26e349d120e9b7ebd5261606a7c76361fde06ceba073a23edeecc7d552bb76c7b94d81d26c6115d26ebdb49390b41d7dc8ba61144d0cfd6de5f53b529f94ce15e42d8a79dfbfa4b9946d7002fce0468e6f8b108ac845b4639936e7b6f6742f6d16c414bb9224b6962017b9174c346bbd928dd034d003688b06c06688564d4ac7a22995b49b8f7f8484d0b7d8b6d72dbaab16812e6,a09ad079bffe580021a0fed2179ff04d50da365503ca8288f965699966ce2a00,9ff188e3aa7c807204ceb3a1561e53e919ce99a4cbe6181332c3e4ab5aae322460b71e928915a8cb65e1aefb475e66fb16f90d6aa3e6f25f3c9069fcdff91a9401,7239db0526536adee08d2d60b560fa0fc7fe561a344f2829fab46cadea5f4bb6454277fc56e80dc42d97049b76d2f7d3828bc0de648a91e51ce7d58fc4bb39e800,7b8550adabb59cffb5670b3edbd9cc8e75711e60bb1f602a04f90487d89fa422156f037e84c0e48466a6ab93c9c14f027c6e40c77ed055e84cf11b76c5077be701,317f1e484eee9f6e65f498367fd8c1d8aaeb3ccfe11472b960301e865cb428a2335c64f51ab3474f65d2e8a5e75fb9f61fa80eaedac08d13da1d36dbda5b17fe00,257345d3ecad00171a6ef66e5b03204d3889b425d09d42734dff01d044881c4a531c3961dc4b2a63d18f8469dd0676ec62c14009a55f469df67a3c5964e19e4901 +b92fb2f6be688c7eb8d5e00e81dd4b84aabe1186e35b83e06d58196ffc1bee53ac4b2638b9f7154a1f18e50bdde50d26af60a369e991b24e8db04206ad3c9f473ddba51bf7e32e590e76fd48682490e30dae038679caf48cca231b75924e3b78152dc2dd528c4a5e63eb075ee14d70ee46f5f06fc86c76bb1299aac7797ba4b1c429df6fee3ee2bac262681e6286bc5b5aa5a7df547384c182646aff761b4fa9e53e7774f0d5a47ebb6044dd19567a3900100d876ba8a0f7b64d,70c0d463c76a87a3e286820761f32556fb54f14b6fb7d96eec2c022a4cf545e8,0b890ee36e03056b793503ef057988465d366087083d3f04008d93f59346c6242fcd51be386fe7a1d636f9d6abf188b77dea8ae0cd50b1d1455ce75fb30c4a8601,3e9572904aebe56c20a66de202dbcc8b843e51dd105d88f81f05100cf9bf63217aa206fc1f7051d1a6ca2e1885a6dd24a2d3df0c4f8b5a324f3e4c8333a2d3e601,779cfaed7af596e3c4da00d81f0eea1f29313f47adaef3119a7fd14c48c32db92b09cc4a70b1000bd02c54c9a536722341b2e231380a36a7f945ed321adb981d01,3eed228d61a0be662f07d1299ec5e2edfe9ca92033e958ab8b4b441081dcd1a207fc837f4720431789f1c5de44531782d10547cacfbd9b841218a899610b82b201,8700072d2faf49c1d7046df7aae2c097adbe8ddb11e8f4008d354e46cba304852662f22445e74fa491e8c164cc342441a0e25e4117c1ba9a0d6a2b5949d5dc7f01 +dadce605be24c3cf0ba64bf6da9a62ea6cd8a7844ebd2c60e7724d46e8b2edd8233aa7f5f0259feaae9f0b848eaff6c6d39783ab17ffa09471648fdbe9fa96d9afae5d394618c6a3e0081f0c7b4d597143c686cda1a5c46bda838fb12aa5af3adffc36dd74a0d674e5a4c87491c8690424abe1d1151d488b6b535c8aa413946f5da8bc519087995a47e08a509cc1a0dae3b42fbd0d375823b5f7504706a75e26e1696533431534d067288938d81ddf12bcc37f4c920a60484434,4bfa5ebd94474d0da8abbfff19f7651829eba2bb03f22ad0afdf1d024b17f771,8a40f0bb0cecd21fa42420a540a1dfb6d030c0aed7c843ebea1c7361ead94fa10f594f778471b51ebbcd667787a8e8021078c2b175a7085058b5891cd256ac4c00,1691d52559f5195d7f63a08b2f9796208fd816d03ec9b80df762d513a8d5519669d80b4d971a64cad6a3f75ce3ae04e3b2ba60d4688ceb308c59a3f658a4ec5d01,82e5af6be1dcace6bb505fa761fe5fff6639a40136eee61c2d77e2b89e997d5342199ba50d1f2531d237105c65c8ea8847d57de53aa869c382e19d76a835a9fc00,470d1267b98720ec3bc7e579a410fe57ae5aad595f5bddbc187b65f92bd241ad107039ae03c9fdd3b12d320c7ebd3326b50f2ad9edc3d152f1e2bad9bedf0aaa00,e043a0975ad6e7b67277c2a508bf21fe90c8484f865612522196227e024017dd4d7a18b9c49b4d9c8bb98abbbd32ff8157ab1f11f6248cd59492fdcf3230112f00 +c222b2a686b954180cf4af09795b91fb2f7a97fc9926fdb3f03e747ec29724a1ca8d911137cd83ceeb22c1725a6f2edca0d209754fce67aeb069818c8cc371f7c9f4b417dfd0d8fb808292a8b70346eb07babc219bf4fc2becd9541c2d60a75d9a52e4077e40e9edbea5272111ec85ae6b848e7e7af5148bdf23625b50dfcdbb7c392f8bae199a6b72003f04ae8f96467f8b74889627512f61517ee380dc4894799127eab5dcd8dae389210c2909761b4d2bb8e3bcd8953ebabd,d3786d40462663c624cc1ebaad598afbe1b113757df22e29791cfb734236f16f,a21d27a4f81474c2ac79f1e99882de77290fa9acd81384c5b34a4411ec9b48cd3e3e92dd88071c78ce624d50bd81f71a5c77bb6726ceda5cc7b3af71f738162101,49c3728c964d69b5a688435f0782dc7c2825ed23a10252308bb017f964921a09104d67567f24484da09ddf8ff723cfc3629a5763fcd62adad217f1baec029c7701,8097aff3ead802ec87f5fbde7780b9eb26c9be1b86ca59f2587b8bee5b61a42d61a130e5d3292f6969998c6a369e94c3bd6353f0c3f183fa22d6b2683707f52801,00058f56fbfa8aa33d086e7172addd3354e386324f6faf92b45b89146532f53231766963497d3d2423ae0ed0c1823e5162d2448f26a6914f9c5fce64335a8f5701,6a0eb84be959ec5714a45ee3a08651f1830c40bfdfdb935adf0ad0b9d3c982c479ce6fdddef955710437858366a4c30ab4b4b4efc96a5396a771a5d899c1a8fd00 +13c128b1530a5115727cd11df5da9bba49ee413123e930456d1e4e38ae366729043a57c57e6d4fde6b699837af5281651092813ff5b3050ac6e65c5936c37339eaf48753aaa91c34b247ef726182b5aa0fac338cd09c94358ffeece8ca328cd78ef6338fcca58a20786860dca65741045aeb651d9659c97b3eaf1788bc3a628dfefbf411355be699e15f7957e76c87d074fdaf6694b6b90925118d032c724cdebc7e51c65c57f8c8e7041ce8e0ed41f75bac914fdbd09c096e51,624c4eb50be10fd6e9916beffcbf1c98a00edceb37e9065f54d33fb4300780f2,daed02f5debeeb5532561c7d467bbf3740a977889eb63ae78f52ea6de116e26e7f210441738de94e66a664e3c73a22836288fcfb57562ed5b37dd51af4aa8f4300,ea877ea74494e0eb6fce24af3ae385a4fae249ee32d647be104a64fc4c7ec1130207f3179254fccf093695fd1b0d0476689cf20d64937c40ab5628d896f8aadb01,c23ff6319a49d0673aee4340479b5ca7c16e1388fa1d385e1d34e13c1ae948f4542c6cd4b4f6db817188fc5c78855462f9d19db21f88ff1e99f43dd62e7cf83201,1afb9752f6f83a843ee5d5a3b595d774c4a215843f6c88db0a43b6bde155d0d14621d3ba4c458f37b327dfdb33ae709dee4a75982c05545e67925431900b2a7300,15e88e046303a04ccd2aeb1335ef5ba72d4946f5c08b52d92fc201b04833766e3be99fa0ea0b9018d297ab184e998f15e7828e0c83fcf3661068b1d0ce9e1f2f00 +34eb76dbb8f2c5579a68b85b613c221149d0e7ca2ac76315a1f7b8d08e3a5b0971cc9a796986670da9692ec51e2eab91defc94e1e99cfcfea19060be0bbb2c682f446d55a7dcd6af5133b702422597cbc8a4f9ae3345b47fe99c3ada55176bfc23a27ee2500253d8924c3b25e407ea3b51e35e95dd687daff8f1c1990414c97f7cb0083ed350f3e5faed13eb0c470b3867ba3489d0c45d46b159ab494817418a68509129d7575134939719793979be097eb5bace5fa44595dfcf,f2b7ea00572d60fc08a982d6c3d4293830e67efa672295fde0424c0395c13495,bc13bac59e1f654f6c2c98eb1f75fe949ace6b51cd5cae4f4e384e35b05585967dfe1734193b3dede2ee8a190ce0a4361d36e1ed4bacb99e13a28071b96c2e4700,d8afea7449bda4472d933bad85316bb001aed4f48b996cfdc35b8cd02193f5f441c8f87f002f3df23526687e5c016d8f1bf45c1418496e3048d8f5de7b83981e00,83aee0ddf743bd2c0d75814cded961ceea63c724b59a5e1cd397eee1c043e8484be0cf32d239d35460b34e39dce4f3fff6efacb717432ac59a7b619d612c6ef401,42ba91cdd452bbc833ddaee70d2c997ed8f5d110bf7e2fc2f734a50eb0ccb0f01326e1a692d2dcace461d0cb58a6ed4cb9c6b1c9a39c7ecfd4df31406109446400,22bf8892f0a02c5cf7e5bdc44089eb8dd272f38a0cb3e04667a2a3b421f3107e624614c3d935acdccb8f9de00301e6749ae77800d6f7e6797a18595ed0a66bde00 +cb4f05d12ac8df9deedc8165c5d6f95ca0a24f5f1e706ecb054eab63e7d0c7b1c5467fc1388d85f4d1f7aeaae7cbabde00cac8964fea20e6fddf8af435d8e6f6b4b44ac5325861bfc02e5d72d74b1d068689cd96490f9f3bfd036790f1e9e27e6b7c93dfa28b41156420a6b02bcef9415f69dcdfa3365cb7e84aab98468216d6a76b5658747870d8a708c079adec05cd4e502b6189c34ee8644920b65a447f0e175b6ffd672427b688a75e2aa8f0b85703e3260efec217f1b60e,58152c404b4c1aefb7bce91d9b5c163a06606678384dafc5ece3e0da0d17fe96,46a6caeec697481a0d1ec2594b2cbef174e9bd7b051721e44b7b2ac6d2cb9004540a3d3f9868eb60a2936766c61645a325c911049dbb80d04fe46c2b59d2e2d400,975ea89dea0dc57fb36a067d02919c9c5bbcb1999d14a1601f6859c154c3fede60324243a9ef1cf80ed9b6f93a620715f81be574f0f2359d954fd84d430a573501,5af8398771d74c79748e5c6a5df5e655f85a8a6102e58b5382cceae894624c202bfbd60b5c2239af93ff61813510c6470fce725fcd90c56a9c8f8cb30d44f69001,6ca129af377f97c6d91062faed10c5c65220954ae0c1471b1331adfdf44d652c47bfa9b5892b523613ab9baa0f81aaa34b78b66edf9e91d9456166d3e3bcdce301,df3dd69b4d8259575de158086ec4ab09498e3d58d9b92c287ee2e71e224e319760fddfdb71973ba4b05a50b003be6b43fe9efd5a5f849ce208ce8b75f9f4cf3b00 +f3dbec9bc848d37b5e02a6ef9ebde00562809414b67abb0a946498965a0d2cba3c8b1ba48120154b426c2931bfe1e01bcb36eeb8bee88e46f2585aad0077347aa93e38ee7a429f9ee63c97c9d6d503620ee5baef3e2b9c6fec325d45915176b2cacdef21b01f2dcea47a5ddceb608d8dd72294c646a273c3026997e35787062980b7735158b7ba03b92b5c09d3f2492af55f35982708a35afe368c38f0e403e4aa1ccaa7667fe534d34a8041cf3d1fb280faa115394b91a2db92,240665f104e8d5415f24146802bf5396c7ec58b7494feef3043aedd086244f6b,067c13f282b8f827941ea71850ff8d397459d671634157568483bae4b7c7ad480ae39b64f5375c343572e4c2510fa8e04f403d18ffb34ef43d56aca3595d57fa01,1158cbd019b37eeb8864974c2d0df93601ae5ca0e18bc0f0638a6bdf4fbabfbb7cdfc26757cc0d9838d6489a2b997459e8f878eec0c848fb98b6470c9609b7ef00,513dea43483c5917a413f9fba41a55e281e44efc5516b69a7731772cb5db9732106afa8c81723d6c0e83aa769b6e568a5fd394399ed0815aea3c3e4eee97c94500,430a5956c825bce9f3a6d541d49431e12e0c202d63eda212be136910667f195822d4ac0f63bf1092a44eabed637cbeb3f18487ce5f4015d72b6ce4422ecb516e01,362ee5edd19de32ed872dfc927e26fe6c5ccef12c54e13b5444e19acb509f77749df406d209ae53e6c582592d8b1b93d01b095a18ba644d93ad33f7945d5ad6d00 +510cbbac3814d00bfc55a9de38325da36c47f8039f464153bc9c08e4a8bd40b80cf5570f2955ea02ee234ec6236b1c07ff8543b0eed684fb8fe4520a238242fb83d4b8ac2274a8ddc05e9c7aeb9de0ca23964a4a7ba3defbb4129b7e513f8b4ca12e539e1d86968f1b8f3e6f36c98db9909624a9f2a6adfd3997ae19155b5b0444a6fe077be6b84ada0e7b5d71215166c1e5931ae366d29d6435b4946a4b5afa3bf390d4d568dd3af62260e7f7dc10cde8537130db06270ffac79f,0db1472ff4e75cfcea523ee8b0ffac9fd76037abef726854ccbcc10bedf81054,b87211cb96bdf31a8cf9d89ee482919d363c943e5362998ae87f455a4e9883f367994d76580e5da7bc5f86c33bc041b49b01394647b9f57c3f618ddff529378a01,4b67b459ba045e1a62904be914749f7a97ecb3a4939d4876b5e49403c0852c676522d3ce1e7f854c78bc302e0cc10f08bc0b0fbfb8b16b796044b2280a156b9d00,39fb29921c5fd5a35fdb58bb0baaf959378f14fb3854ef291de14cfa9089628b67bf3eb53aa39aba0cd579955e7f8fbb0e6f5a415e2d3f6bc00581ceee085dc100,50da7029f5ace07317bb316be8b3179c2363a09e09e74bff9f62c7233c6ca1721a7f1fd02bfd30b08737c0b47e5c5f1ebd0761da7da3c2095e482d265a5d4a9801,8fe80915e7730a0dce5eb004135821ea7ecb4c3990a48af9f49a50d4f816058b56d5d7e7908d392f5fdedee67b95fbb716d867b98f0416a26e68205f1360f2ec01 +68f72ce6810dab189f0b28fe6a5e9530c661f6fcaf2942537958fa9cb0a35224d80fc8683772e2d2e45d480ae925751bbd3eca857c3194d858200933890efa94018f94ddf98d8e24ba866a3e59796d3c7da6ec1e186c295ebec049f42f6ebbf246fc3b43551fe621f66ca90817bf9fa968b933b457644a6b6b403548d4cc22bef78e716f33e969d3b6a69788bf913df90d68b95bd33527ab5cdd8f12750f411cf6c101411e3110cef4ee69e7ba0e9b2961128a3201e0040a781119,a93b86c84b35dc45f23efd9762a7d9d67b502103ce35ab61835ad698d65c805f,0a8a4848c08855fa5748a5f3367e874fb1a6cfbc459a2de4e3037329596a362d045ea0b975e80a862866bb5e812fff05109927abc8271546d3cbffb058f7042600,5084da728aef5063d8af2a3dd45c26e5a2f1be8096ed0f27a165265adaebba2f62dae6cd288f2d2b0a6951885cba34528b397e6a5615023a99936cf691eebc4100,a1486877981ea194eca9257e08497969a1a40b484f89a25c1bc3e6bb845c3bbe51171c1a7a70dc6b9ab68e820c6cc3e620f6583e31f3e31b2d30c7eaa736ba2701,b180f8bceca3664f127f00bbddd70879c6bdf101c0422ca9e89da22bf55b10200f0a041211c1f61e19c3ee5afa0aaaa6c90612b65adcd53d7d6c5bce079a818600,828a373d42f53f8eb2ac43416b3d293cc08d452c3570dc8b5d14d8d3befc212d4c79f45dbe0b07b920823fd7a9104e7aa47b8aee6bfe170f01c05fe8846036ab01 +df159c116f55d0ee578bc86d3dedf46efdfb9bc9be6e6eca047adb35c3d1853a30c1ca18b9e52f4ecf5cde8ddab3f9ff528cca8c5fea0a5c62a88090829a0683f83089d8b45fd75eb1ca42238d6290b6567ac136d665dffdb0762b9b747ae56972597434ca9ad371f94067025b21849f754dd1cc0c91359ac02f8efc0253bdf847e4e6c0e7a49c83a09d0d9d036194d7ab45611749dde19c67751c7a39fcb317b7af8f03f520f0bcdf7364a58c9d4f7e4fcaeb12f3793f515d7526,297e206184759f629cb7791f303b2709624d30f74db6ec4857fa293987740f4a,f106a3c10c81d1c18a9d60c105e2fbc11052e9198c248d2f1c4e4841754217bc0ccc3ef45ac82dfde2d293578e1ad578114d7905cdeb489af555c291d0c8149d00,673576407587fdacd91247ad05ea5e8ca3e39d9c1ba31054b585533f1f9165223378db723a07ba6ef5608531cfaef01e14fa1bd6438098cec6e0227dcbf2e01600,e4bdfd6c7633f3e442e7c38db4bd5fac40ebb3450dd455bb1afabf1d56d6afca31a4a8e112d568917f956baff6a628d2fc3f5f4e77a6a33916a82c1bbbd48c3100,fd3089b06937895450cfc4effd9f3455942e117c38cd6837ca3df4c5208a67486bfde41a5aba740cf20a3a36ed6a3d7174541c7ab6b76807a742c82a52e8d7bd01,a512146a0ea6ab114ad5dc85561aec7e28e3318ad7a3eac2ef09327992c0033953398cf47e2ea119c685acbc75c3eb5a682b893cce911c5d6b6112ed418123eb01 +a0b55296a658fa6ac5ea39a10685ac19c40d32e6074c330645a15772c51356e6237215e6b4e17b15d40821a38f43ac2f6b80c5ae69b450ef5a531c746eef40771bef634fe1fcdac13d3e762ddcf15bf136a12eb6bc52ff1db5cf0f250d5d973c47591d339b44cbff7fc0a7971468ec87caf89b54ff85118a4daf059df4ca15e8b04780d9c15fc6cc956c6fbd716f0e7a7c3ce55946255698dde503fbd4529e3458414abbff1eedd3b9d130cbf673906c216968c738278dd7f26e64,7c411a28edcf3c9b721cc265990bcf1a7012b00931e804a34996db42570253a1,5c36e4999127aa082b2e293707115edd81d6d7e860dc716409863ccc21d7355a07ab1867e9d1ba97633dbd4ee06de7152e975f25aaf7d10fb2a219b396f4e38500,626420264ec31f71b18ed3689f8ba6a64dbee852e694d84de0e808985f057fbe50fcae8ff7938fa65bcbe3606b67445cf6775ec6bcaabda809f7142dca1e3fd200,524b9849ed58848c4e3ccbd26e8f8a7bbd6e3d0cd2716d38502404ce5ef2afd71b905258f1a3474c7a05804d458bdf684d111ac50282dac2e864f4bbf7eb2b6b00,6f4ba7d5cc26e6d2b4f9b2517622b88ca30e23eb04cb9e0dc72f803fec53e5713868d6c5ae5e7d102b346b0242f73d4aaf63e58069146a60b4fa1541f9a676cd01,bb042bc693123704e7e8014869f400359ffac7319c1d96955eb83414978d5fbc2b85240c936c40ea5f0d9df48edd1f43513e75b259f4807985fe1a13672acca201 +e64474f2e55226772bbc132deb2bdded44ecf1010c764e879ceb2a6615c400833c8ab1cbbd89284f76b19a7e7396c9ebabc9b9060a90a7406b10acea97c3df3679520682d9237ae47fe4cf5f8168d83eb41825893640f882fcc997992919026d801ad9e61065598561e676abb45dd1a9f76f96c5a59540abf34938bdf43c406448eab03f846fcad00f98a98bf00d7acc90f7a73fbea0b64754d73965f29b8b498a91c7a77d566af07d3e5441b0cd842ca7d3f9276d2e3ec6f91b46,fe95ab33432cbfd9f6bce4beb20d53f26c51090c0d4af849adb2f049b506e32b,4bb62ecb9e090f3e228578c1821fb912ae5d1880c0ed74aa2173970e50d42c6756ca740ec6d0f0ce8190bce0839a0544f8a0cee120fa8f8d269471a2186c608f00,f01a6dee21456e559698e65053eea0ba48f76d2327c2bafd91d5ee579a902d7b689d5b8fcb2e78efe0a4d764376acf202395ce7936031a8bcfdf8f177d6dfb3e01,191875927a91db9f301df7eca4040a1359d5a20ada24eae48942126a1329955a792e9ec47f2d37280c8fc539e94bbd150e35e59a4b085e41228f4b3d5c381f8601,93bcfe74a8a78ac779f46eab7e79e96d8ddfefcbd70d112de5a4797b4f4557266c7d02c907c8b81e79e5f83cda9b175dedb34b98e70f0ea5c0d020b0c9da86c701,a04fb2b0cb46d5562a8ec180bd68ae71b497acb8f8ae6d68a8a8e69734e556102d4e35b6c34d0019226486d94af1f832e3d89ed5ae078143479c69c0ebee494c01 +8b189e4153b2f8d673f78576c8964ea38a0b4673c9c3a6c1d6438c846ca88c54f6069318abf5b50f3f06dae0dec982c940937aef18e69f520324ad47430765e2eb5ab336a50ef61269ad1a2380fe9a3bedc0cfe5920843d2dc31e549b2ff5bcdc3133c9db5f6ff1b164c0056dcd93044dd6ec5fdb14d3c0b1bff77aa9f2559c9048952d1d8fbc26554baeb7020e1df3a5d527667c588358e8d1ffeeebb634e177b49b9a4c630495015e2038943377031590f02bea0b6ae54673c42,ef4917661fe0307506e69612a519b17c0df4f039c58ac1989d9b13856701fa74,740639ea17c470fe0f54b8280d4bd2179956a501b3c65ccb717cb3f8690d3ba9555b347ed807b671070bf8cd7980e1247b2bc07cdf48c2ce6bdd3422813b308b00,90e846eae0cce616cdc43fe068423ca404f178b042925066788d946f5bca4ec22695222c86f65410d37a463582282876ba0e0a7ac7dfea612bb33bcfc242f20f01,3fe705b66250ee13536534d57ce5588fa032f0c2e8c05930b8183742cddf8072671e0feddab37c43ee675b441e7ec1048d0a4533ec919d8bf34f56df30b0064100,bf909bfc55328f45d0bb7b7f7ed20c28cbd861881be9bab7a9d54761ebd00918765e854c8ab00ade9af1027b2a11bf5c76951742d8a3980e3768c69e1265d8e001,a2f509e83d1c0c89c7ef7b3f79e20f29c63784b8472fd12930b45cd55e64cc491dd52e8d916f276a39933022aa42ac58b1f1192c7d6318faf11f4a85be29c6b501 +01ce0a5c608d3f02b5e0ef84de98bf9e795a20134b79cbbefff68a2ee4ca27e9fcd09c2bcc8f8caf1f88e930fd27c06e8ddcc60f41071bf11608e751fce48b203841644c22dbbd85c13222d17dc2e0909e0a7320c565e034eb98657235313f749eb108230dccf40cf26664d56693c13e0182be8dac6e654ecea848ca7d6ce862807479a6b9d863cd4eb52ea7fdab0d1c05736b5e78d9e19e5b85ccd5a15d24b1839309ffc6975f5acfe35ac11133e7839cb52f31446cd71be79976,5b05f854751c5c59485eae6a03eab2a183062cb38f4d13c084ef53ae68008421,19cb638d362ac67966f57e14e8f9a9cfa33017425350e3b1de003c6e15a2b6d75c7c84765ef257776e538c51259b137ad7786c5d6ee92bbba8b4cc3afd2e4e1600,b7c2d154823b1eedd18edb90bc81aff7c3b9f8a3a1e0c6684d4968ca93ccd219442606787ab23fe2a1c15acccf5903bd1bf5698b32b632bb029d37f194a6331401,0d13aa46fe9c340b3eebe25b7570bb70c0b08e07c836160b1b4bfdf0085be499680b234a85e520bd12458c60690eac09d0d7c5e71188b3a246748d24784d03c400,0a0fabebf804b066562506694bc81b9cc117aaaa3b6191811769307b784c1c6162cf897e1ee4252c59a5cb27944a85758384f5946a06f5a191012aea5979f1f901,fca67bc6e12fbfc3efb390e9498585a8e5a466a7fdf86b8acad4f14fdd35cf845194a8fc0d56bb97faa62d8edba934660f5e02364791493a27d82fbcbd0cf7e700 +5ec3744ac592ede218f3aba2cfcaade2636fedc0b71c65bb4f63045984d701607fcc17723d4f12ac659bb60182c69b14515eef557bf7b9fdece71a81881fd8743377ad6ed4eacbc672855d780c42c436452cdb5433831253f554a36adc09c273f9ef186ee6557497149bb02dd4268f2d0fb8d3a60291fc87b0b4f453edaa5240d05b890b4faa5b6b5cf6348af50eceb3f4dfaf051a366098d116a9dd79a6a7c23099f97dfd5127307e267f19afdceb7a02d64b69f8ef6de446f5d3,fc1503db1a15e1239d263c167bfb2b2a73a3d2d0ecb57e18fdfe2865d6f5c43d,6026c15895a0fe5fced23e23e4c7e1ee26b04b44337c04ab14edb891e0b8911559cfe7cc142e034e9391a35437c0499ace734f579c2d67374613a55f1dbd59b100,dab58368b25fa6c473cd46b448079eb7f9891da3833909c85d8e13d20ffc4518703836ca4011e3a0d7b4534cad56efa85b30e9de8150b1c4dacd6426fe51700300,a700a5eb13f664ab0b00fcb2ea40774e11ed1749572504e4766775666202b9ee0a6b839ab5e1f2c744108cd09120999cbfe34e7e6e8566c46f3e0212483e2e6700,7870647679da6770fc996a9f04516620442a73a906897b98ef7a7c161c2ab80f321b918729358caab3c4d47243df96f1df6dbeadb2521ee5acbf4ba3a83fab5601,945d192889c5b5043049c654c42d04874125e7e23373629e46bd6b44469edf2f35bdc9b34365c8f41b90a21f4a651ac79c0cb26ffa67d8d4d4322799b206e88c00 +05bdeb441cbfd4df219dced5a8dce6245ac05eb928eebb89e7cccac917469db432100d21dea114dbf84f275cb07d169391a19b4d2237b722c454c30ef844ba3911938f6e228f49c7e2e96f55eddcac61d6c451adc3c90cad9b18b550e3c4a84c3a2f9a3ace47f2f26fea7c39d1100f34d0b58a04b7df124b311a708265925a5c90795f00285fe2e4a4a88019d7a52a12efd44eebeb0ebeb8324d79807871c93a17f249a3c6cba7423a094d996b4747f38bfda420a5c59a13d34c8d,448721b4624711b13d82a65f2f56333a71b8d3afce975ccaa07a380761aa49e8,77089cc968494468a15dd7f7b5ebfc81d252b8ce947505618f31ab7c78c1188d4d3c6b8991973b3e777fdc94f821d82936e516a95c9847e5c3a23dc89b8378c201,a73a4d5111cb9f1abb1c46944e1830ee1d7d7fbdadcb3c054d583edaa447fe2108bb2d0b58d5b0266f6510d16c590f1a3e9d499652789420e519d0409a9d473a01,7630abe3ab978efc25845cf1e5c6f7f5a84f4b81975b6e41857264ee5d7a454a5667b505bbc4e855fb0c244b5eabe15d85c2760bbcff357e43272c274a8ec05901,f649dc95f9c46ef58335c73e2d1d2a0b8edb802d8157bc4fd2c57ff17cd945001c18b44b2d119135dca0bfbff4780680494bcbfe66d88592467d38d5a18eaeca00,9670d118fa7b581e9ef8b184c36d79602e5ef6b63c577561433ec117b03768ab76d54d6645f17256669462f2690b875207cf6fa6616d6a5a3c75d2155c15a6af00 +50e92cbcf9501702033efabbdef7a4dca148c0dadc1910e061385290f256af3513ea8a8a2aa32e0721c68d5419a67fa857726df3c2046c410fb56e2ba8e6b2636f9ee0d43eb18356d06fd3a050aa33d078d88b503181a6f2fb220d665701049d6290cea71bc8354caa3408e22731b674e71241c7476deb57cd85cbf1627927e11544c61a7a9b60e96bb857ae68d56d60026bfdcc5c47a02d3babf8be137acf2315cc991124c11b2730f4f2be424d0765632e790f73671c4837ff86,f50f32dc5f47f73ab29fd1a1a6577a2ee137446fa8e32010148bd9d1c086a2eb,4ea086f574184356ccac5581c0511374432f599daa1f4a46b1b630b1dfb3df387c50c8ec4bec3893e2403a7d01a4ad84b426d1acd59213fdb177550024a68fe200,fd77c995a257efc833a7a2bf511ff77ff1b261534a680dc17f29f8e13033753d5b23e93a42713af3d8f8c7bc185fb1a0c5e21444653645b4ab7aaed2352bb05b00,121f522afcb025030c4be204bc8f785d0d7f7b524ec49e5252146dcdcbde676956af2c73af929f235ea7d5ac2ba4c69bcbe52ca1f51372688d1df0f93b880b1b01,0bd48bba77f928fdf5f717127b291a9deb6a9bb109897c9c5ca6fd850acb62625b34a92fd4f4ffac3db9e241754d476e837f9aa0a834dce024cdb462755d4add00,73c452ee5148c5065bd33271ada8ee937840adb953a8a4bfc86d7e14d21089120451b07a512bad25481a5d1a7207b0890d2cec72f956123386e0abd59854f1d601 +1d06bef7549142dd729386303b3bb018fa2c645ff2258c21f231b1c31fe6094fd0aea7193d9bc8c7b5c5fa305d9256adae7a1403da3fa555daa01adc852abdaebda433c6069b60d3e9f1436ed674d50cc23f0486f5073c5bf41097032a91a607205fdecfdb73df63eee075e22aa6524bc9e3ca91af45cab809424806a23dac6c45de509dc80519463f8e7137a6b382685ef6266727fd7e73b3974a34358e723740d91f3bbf606fbdb07a81d65a2b675922a03e3bbe8c6243e4d52140,9640e3f79b4f42ee752689cc3d80bc42f7cec1374339324a57ecd2877544c340,2bceccd492e7c187475759df39a153b9a97c12e37ea85616b13bf7fa5aac373c5e92fe3a9f9b427498ea745034d60919fc2af4630c4fcac963160c15736abcc100,3ed64e2d307a40405019d380f4d842ea3588b6210391332de6a92ce4df39c6696f761726b323c3ad5d07f16d61f0cdbdf8f2aac9ebc000b7e61e5c265f389a8300,818c659d5ceaf7fd266fa3a1f34efd278721d8783acdfe2926533d2eb43564ff2e671098a1258ffa13e7274f71e836588166f2b75b69ad8d3504adc7b7ee664600,527d06bb27bdc2ac5936cae095a0dec3810a3ecaaa0d6bc7619d2c5381722a9f5e74fa4e71ca934a50b510e8d60b1326207fff14fdb224b9723daeecf0ffcb0a00,146a1c668bf4c53d0bd96124ee65ffeaa393ef2036a7439482a2ae635945849d46b83367ab3fb0f9d8019c86062e6f9b95ddbf6ed5150bf5d9c4e5ace793ea7c00 +3562cecc107bc77a10d0fd0e3f4fd1247bcab8bb9da53dfa37310fa7f51431a72d2e2392c32999f744204473fdaa90c6a9ac4579d547fa536e554b6364ea6de518f7ec0362192725287b504df107dba4980148fec8ce3b668b71ea9b93267aec0b95bd2bb3bfcd528d733de566446579d22352493bf56341f5f1330e0f60d3060a2d41a36ee17d62e2b2f30848817aaac02ee471055a79325fb891a30033a8c61a81bc5bc5e8a08dd017685e0cd45b0ce6175616a94ecdbb77f498b7,6fc862a78e3266d21ce8d19bd876696186e3f115cb7d837cb561b4e232844408,74eb918e5b262455ab36493379cd1708d4753a66ff66041c92acc8472e2fcb0979e0ce0c4ff3acfbb7d9f7ce6a4ff17cc3e475c014234e6fa178d8e6a57a09a100,938d4f2d3f9a19b89413b1e1d134bccc7b4661ba2862312b2c73115793d248e46ad53023ac2e0c94cfb84830b8bb02215f17fac52473564b0f3198b8c6d90f6900,c56f385e7a72578ca85d4ca4c65070db18d985a2c7ad294cf05d19ee6c7ec64c5ac0f3f96c944f3f454ae9962008aee365241aa181756e696769c63931ce808200,9ae157df0d3cd922c1bb842959c2324a6c10ba07128d5df09b5a34229b403896003fed0edd1cae65e96165d11bccfa623a40aca094ea601dc064809f09c2a55b00,90a8b8b9cff62ab71d3570b37bc6a6cc382aaf982e571f55743f23b7ff33ec6639f9420086517dd63ca5a56ebcc66cf4000126847ed0d72066b0960d5adf08a601 +7398e2e53fee1fb30a94004d749fe77268c4ecb487e0b92b3a7ce26b9879a9103e2381bd78832742426d6361b7c555dba44a3ba17cca283adad12654600ba69aad879d48a23e814b2b8feb758ee314d4e2e85dde7377d9befa860b4f69be522a13f001edb3931f87073082efdd428a6a26e60cdab6a13fd63dfe67c6b4f90c35ed01a0eb60c0c282dee9caefc4810189fa17f46ddc9ce11be00d346632fcf6213da7497ee5ffc80fb54a50207124c366e294b7a0c4f7c2b936bf91ed,72c75bb81d6e20ed21663cbf5b216fae25da5d8f9bd7d34b16910064af872693,1780e90e6a1f5fe3b147800544ab39265962eb63dc733615da6327f5030d04ae4492f773a8f9bce5f34e2d8a8999699e2f9bc2b27d655fae2b1122b3ac57da2901,318a0ed6f7c0caf728d99ba5351c11df22612bd39d4935408e8ea82bee2f08681a472411f3de14b207d1a7c834a5376bde8646579487e36a9b66bd463308272601,9b6462a8751ad01a8894e82a1cf0563e654a27296ac065e8d9c221a53a4b384d02dc6b18e26ae9bafc1876e56fb91b03a89b93fc76fd237dca6ce1d5d7ac7be701,738ac547dbb27c4fde7e7e3585f7aa6aa83480457993658ee8d5e5fc8efb0977276ba4600ee97ef702267f584065e5898f61b1c8845ab65c91b6544b590ebbff01,460a1c6288360664f74e795b4f934391ca986642d4ed34f4f5add49e3be0f1da234623bd053df5d21ec8affebb8e5c4fe0a0be67fad5f1fa1c00ac5909dbaa9601 +9a3399e6a3d89dfbbad636a67824c822fe01a0711d27d7ea04b5d6690cf0fb2121e7f452a3150dcf8f921d1c2e558e25230787722b95fc3310b637e1f883c2d2ec936f8683113130aa2e225f7f301f63efb70936ce12a385f9988a3cbd98171f82429637cd7512c47c62b9724bef52558650df27d1f850da4d0ce9df2b0d9c9614f115286fbcbfb0727b4fd6ecd893365a5c153ce4c12aacc041dfaf5cfc460c9beabb5f18c946ba12c8ebcaba7858b7adb102e31ff09f170720d826,ab1c4ab49ff8acde3b2fce9108ef091d2119a9155c079c4c8ff326236160919a,68b5e800c7fc25990bbd9ad53d798b42209bceed88c050c8174d003d61d34c7e65d4dbde2915496b94f3e2ea3f3e237ecf5e98a442e8be1b043dd4ca2c55fee200,ca789dd0e9f435249eafcd2f13b3f6d959dbbb04cc347467b58d274bb8bfd4a12510e641fb5712f11a76e15c0130eb2295605f7f2eff8880f99a8d83e45de08700,ac05b2fce69360aaa495b68a01a5b065e60f27e7eaf239e78e20e2af8f69aaa77dd77752282a2ddb230ec176b37297e4254a3434e196fcedfc37decfb300376800,11d690b20c7f276ae699e9ff8d6c0dd738b063dac894456876313396839123ab65f14fef869068a8d4ca81aa781e86e08f38978373db68aa275d4d05c6f3ce0900,d78cabe2b92c6090dc7a9d0cdaae3fa1ffa575d8f73dc201602ecc0ecc16bcbf41e9d8de9e3761b92c52df15f9852651982ecfae3d7ff1e645f8b1e35146125e01 +b19a956ee7e9b68c6c788c5d40d89c9ff4d6a932f64b61c57103210b0c284d4e11ee3f2e85137d7db2c714d5d85095f6d09ec7f1f603e5c3d37e819fc2d23ce741f44374082e74d7ebad7125958e910b54d03627c08dbcf40e2b5312f4728d05031351081f7af316665443b8a58153179e7197cedebd35575bc77daf35d789b595fcbc0eb8510e9895656eecbbc00f332c702b8db27b0738f40b2c628c518a7ae122049910d31b9a0c072199221ee5a0e2341e00ca36ff353f64f6af,869c20c4aedf9c8c8404852ba248dc25691adbaa73f666aec321414daf866fa7,7d62c74db5f0a4714beefe0a975cf3325a4218675ed53537f45e5ce624635548083462d2c83fe728d6efaa078178b053f70b23e9ac897205dc9f2adb2c48691901,9446d655cb8c7a6e0db354cf9f2e14803b4642c5006c6c0c4a53c11109f512244c56497bb446dbe9a547871d723d01fc89faea368155a1e859e3d81f0c2b3b6100,4fc3acf3b053b42a3047b88e4762beee235aa0ab7023f80c01eb876ba999bc1b6840ae83a4a26159afecfad4b86e2e836072f9e04dfb7f51c74d144535af782300,d658b8c5d51aaabe029b0c4229a8cc16eff4204e55b3c11f55ec013fdd6f1ba36d54a8438227f4034ca6cdd5c4340b10802f22f86bd4c159aa40a5e8dbf0b61400,855c0f1bac38d422b7899ee93ad4475369777d5e1b2d700d852b6a0786fab7f11d359af32b4a36868738340af8eb1f72de54e3b4a9197594e644741a737e328c01 +0d3e9dda307ae1c8db630b6cb7746be1016c15542c5acde59bfad3cbaef3e22c9f389d2c2b0b6c18585eeea91cc6fea3f3792500c1e7635b60aeb136df7d7ad27b6a2f552b12441d0dfeaedb8120b10e28e22959208c91c8f26c7066c0ef5a3a635ec2084219c20f4495894d31b6f2818dabb43be004b503135eddda1d91b6a6cc5c5b7ac58382dfe22fc9615254cb4a825dca3cbc3a65296a1ebb8aff29eedc61a19f32b82022e20ea56e466ddb1e204ef11e92cfc93677ef7459a9,258d99803736ac42e414b4b641a422c0a574101b682a392882f232b828d8e9d9,5b2cc2f4966609577f0191ad87e835a5ab3427f5cdcca9ffdb5417f6ed78656712620fed3909c481f639f6a2eb112a78caf214f83860dbd1809e7d0078fe6ee400,30f2d30e4ac659d2666a8484cb29402b05baba2fc81e6e2b502adbc6cf3c1d2d08a7464f5ca1123dec72ab036b52887a43a3c9b63ac15de9790752f5d81046de01,2d751eee8a78f684ccfd7031fd2a84bf7daec38f4a1cafb45b9f5f9d3c7371c97252cd9e203b0a40fd75b12794ca4ea8c93bc70b9944c4f1a8efd03b16f6a7ff00,d45b4a3ea1df47ba751f8a7a027a9919f151c8fcc5cdaae6189a7c292638cf34672e896a260465b3cc1da1443c47d8f8a2e4b65d170e9e45315e34c735326eb801,fc08afa973500653fef52f5dc17069ec82ed744c9c4ec634fcc711737e9d0a594db3b7455aec2b99ab42fe59d2e292f1bb1b86d744c14531bc86edefc3b5304900 +26bcbb40b84e43f450cebe1bad45c7fef520d4302ba650bcfb2bb3e88a3317fdf6f71b98a74b4745b6041837734418bcf70d42fb4bf548ab0180769db3adb9c848a3cacfbb86eb5dc72554dbe0da06b5c4f135e5f303fee8f95b10ebda8a14234ba082288c2c9acddd473a54fe934d966f08163b2abd77cc05e460f4fe94bbced39644e7e75b91ee0f7bc20e8b753da11385ed0d6e08995f6ff0a8a406dcbe3db0ef20d59db6ba2a720119b6f21cd4e332ad2d65c61f5770261b6cd3,7e9fcc4c08fe3b8911bee41379760b038740e93753660624112b9492f2610ef8,94213640617b4259e1dd4fae5f699303477670d3cfeb1fa944ab51fcc2e244a4110e462e7ae888e84fe47c9c58f12686574884568ff5e4c30b3ec9e26992c5f600,2897cc21cad0d1b30f7150737c070f4844e388037465ef258dea89790e44543b07a54bfea457872d3aebcd795db2ea61913371ace72e4842fcf2d933697e8c9901,de20821df097f1df1ade03817f06c6440d26278a3e07e1425d3f78cf3ef856ae4de97d9f5fd94e3901d384e611c1509ebb1e67689f96bff292425cb84fe0baf701,8d2f08fb9a31064752e927822b5d1fce177ba8decaa012ec7e96187303c448c858626d018eef5ca886cb4e2189641455e3d4158b2953151373a317eaec8be76200,845bf9cc4de39a476fa1af945f63eb8cb293b24a8e79a0a670480d0c9fa9d038658f0c452f0744eb0c97e6fc3d17634901940c0e1d999f4509d27917febc0fdf00 +7fc1471fea61bf7d74067f82fd10ca4bd3458a2cace849a4ba60e6c409c4cf0d6ff1e772dc7b78ad57f43c49899836012a5919a4b0cd937268ac02e4b4a6a54cf80a2bc2b855f9477c8b18f8be7ef72753e74bc346c3f9efc57ac2d04d51a8ca95adc6f80fbf1aac4eb97a62727c86d68b88a6dfc6f7e282e25c0962712ad434149fefe42aa008a281c9b9ad674ce31ddfb79bc10ead6b35585f3746d9d06e87011a683b3939b226c769cb269ba2be81409157c6d2bb2faff32ff28d,f648e63d5c4e6dd2b82e8772157caff5d5273566771feeafd5ee5658f297afce,b86b46c0dae3d1f0d9b9eb0f0de9808873d9dff4b729efd5d1be62084cf9c9385501ee0a20e9de76ba5d72204e0de9f957968cf8c7de8144f1b01730c90cb87701,f838791e091f3643481b7937953436dac6cae968b99190c9083a8e89b082c9ea078e612a8a6a0c6d6fb499090ef74f823760ed09b1930c89675c0ec55ebddfa401,d091363d2b254c53894db828f9b66d1cd3eb58050c45c9e94e46517b711d4efc2aa7b07b00dbc5e3241639dffc1fc5c19fd64b6b8eda45100784f6477a20c47100,a9e0ba0a0ada33c32ca56b8c727d2b7d22e88701b6063f6dfa7f1f1cd87bdf2f63cb36d64a818e0d13c0cff47becb434ce8f6bcdc2b4afd4f1f708aab407efc000,9e2bc1165b4c4f56691e4fb59477cda368f56846924ad3e1629ccfe28e1b9e0d259c81bd2dd968774c26a51d968799e0aa10b79ed8d36f9bf24d56223addedd200 +6f8ae3d9fa929717710040d25a28087dcaf824ae95b3efd8c4adc1dec8073af05e834019c5429241d71bd3f066e83e5808d9d3b91688a8dbb71a2d26d820a10697b4ba5d77d1e754f616395299529aaaad60142b2fee580b9ffb1809ac534e6de69af9a556ef2906e7bca21f6ab067277ddac8fe93b0b2aa791d2e7601c77aad27f533d8831bb72aeb6c244ed3ba275cfcec6c002475a7189a8f5c5ddb0a16918ff8685e5241a25983248023f89232ac3a4ea920d880e8c11f0f36a9,d5cc0d3bfa088b982b6b19067fc4ae0ba57a6f305edf8b0606eeb1cfc8503f32,40af3c28c5b426d3925fbc9007e3a84d4588655f5a5fea3ccf03447d3e6e81a451d853c4f999e9cd0228b4b4e8081d4e910bf1e61c8e97dd305092db1205d66000,a86b840c07456275420a93c5af1894429868f179b37b6d3d8393fc7a4f96650610bc0008058c7d2cb8dcf9643369192807ebac4d9effbc80d9b52fd9af757b4b01,c705cc058a856b5bd82586cf24647133d58958889b0deb38a67057959a093aaf4fb673db1197000015869f3ea1ac8fa304b140666bc688152a403ad9250f2a8a01,4907781ee1caed60d8325f8cd57414c66e08b5a4aa4d6894f4e0684782bccfa8038e36098c343a9164919160c68a5a2b02af05b29d2d5f53e4562ceacfd7ac1b00,c700247cae45bebca98ad353e348aaf37ed07f57becfa993cbc4ddcf0acd854913ec19b9aab95d44845679035827453db698a8e09cd9f1e20c47a22eebda64a901 +2985f6f0b47f8965b40cc734345e3ba92ed3ca5c64f11afa234cd583bf926c56a32060fa33dd0d5a970eb41c5a1cbef94c1f8af2d45f32512bfad56664198c028ca0c9d7ceeab635c0d05bd58f96dc41bd6656e1a5bc5831cd90d220b77457ca64d04e9ebb20d10025e6a101a8dbbc4ac0efa1eaacb0a2b66ad4422befc4340d1982448404feb41f2bee4a606ee8a2ef53c143ce7f47edfa2a1dfdc46f6f814544d35f43661fd1bb1eae825136551a1022afbbf16de60ff991be04ee,f3d29da5a0262dce6cfd349f27a85a3dae9d648c786d7094e2f2fb064ed086e4,7aeb64ee42124d6fdcc05f510ea50b667ead771b6866fc898b96330150ae191307363385dd42a77a653a5b9b3578e642f6b4feee701e1493d91be76ed0dda24e01,d3e4100a158aae438257a535c321284221174fa62d1eec766c45d6e5c0aef7fe6cf03266a0a95e352aefc64d989a16372223f2a74cd0a6edf0bc1ea636eac31301,d9b5f3cf227f4113c746c1067a9d6b9c5879597ef6ad0f45ea5976690624eb6e0d469a787f2426d5763448b978fc1d64de800f61b0a99f3dcdb722dc3f705c5c01,0b98752a8047a6e521bd2bb7168cb19af0362c2ec738e7e0abd00a7a8f147e12436ca2382250d5257367385bf969db7bfd6de78b6d8d283c12462e5674a007c501,461687db15dfc89a7703ab1dd8a6d4b4f305eea4f59e712cc1ad1e403c2a7b6d28829f196b10ce2c82e98c1a599fa3ae230bc8fc0e3b76aef083cc9f152ddfb400 +bf0dbb462fd3e4b4d659c8c7296b8ea68091e640b75280cac5f88986c25ec569e6dca0eb5ee67735d29cff9d7a0d822a98cb1df08e87eb00f963c6a0a17938ba0a83ab23d1e18d012a513246b729762b6466b584387f6c45a0b8e9120230cf63fa8fb53052f3ebd547752fa24c44fa581dd499f33577410f5ea26edcd49eb508c1810e6e49d1805d1092790ed7d4d731682c3cb054522b80583e2815f8c4fd1debe4a81105f3e981def9bfaa93bed13364bab594f153ef28b06d2de6e1,665810f5f2114108a1d059355bcb70ec4247bd6683bb4f872b39410e04064cac,0709dece6aea493764eddae55616e20a625bd28b33d48b269ea8302bbf7177b47f297610b707db02e22cf3f1eac846d9589b3e8e8514d6392cd7ca1d2df1af9700,22b1f901dffcb15b667206eaf8ae4f50bc789a806cdc38b26ca34866d59cbd700a61aabcdedb7d57c243e6f0bd2de01b7abaee572e72cb3fe35b4747b6d6f92600,38863c8553c592abea7b73e705d10dd549c8d0af339aba507ac79e7cbbe6c93b17b2367dd6283c9bfd98df257cb8b3821cf6a015d8291d1c31532cb002067ca600,6004771e414a570103411cedbb56a0875298ef3a8cc8a0e902546a428fe16eb201d1aa619b0370b086b248f6299eb6905f5ab69dffbad21420b48dfe99cc5c0d01,c10d4af8a01a92de1aab770d17f900f85f2fda1e86555b53fc7724ac0cc5272951655b97b25b5826063ba3480ed9053ebb9c7f353550035a2952bf47a5b31c8000 +42ddb2a69d70e61494528672411a5157405b790deb6fe01a51e008d9c986450b1dffadbe21cf815d7502114da0274a1597d6e8a808816ecb9d23781b688a42b7e8264037f764d8391d8f87b92b8fd3acb2c7479b346dafb2e1e0ff4a155842f73f195eeddc0703490d24e4103fdcbd5b015920a2f7119b48260199423738a0cd8fd72e18d950715876cd6f334266c4f91b82563b227d8b8dbcec956e859e6d18ad58218528b946242c803a72088a84a010af10baf32ef90c2f66119f1e,a549d739a7e7830cfea8dc798b8da5c9f02d46c85feb928dbed2006d06e6b511,5e5b75b5c0da1015c626db298593a928a6c8f11c393c30bca5de7bbb9fa0cdb0339f1afd51c996d4f10d869604fa0c5d49427f36c1199b431505ebaf8002a9f801,b4e42df53cfc3ce86119ba105b2af3c29f7b7a8e0f4bc3d96e0595d0e6d58f124bc2bda807bfba90d36aa8730ea6db23c473692d428e2460f1d17edde61eeabf01,bc7db281d704d427572da6b89754dc3a49700f24ad1f4ecf62316f445ce2e2437bd66c9f9f98d685ce97be837c0ada4fc4d9a0d2ebb2c4f44aa4e9863a2cf2c800,1b40a4155df581316111e55c4ef2166c699fdf5782c51d6bf3c41915940adb4c5459b397d07757fe27fa7b0461eeeada53d48d647d5b87fb98ea4f5a48ea3b5800,16a5f9dcae57b9a803ea42013e0339ffc7da6bde0b3d6cc2965ed150e1e7dcaf32fe9df8a9b137800d0f2d7542f69070e8792f4248bb67208f26b60480ed87e601 +865b1106d129f25a4a22169ffb2b31ab61c8f17bf45b74c8a5f1fec9c24625512bae8668960e4d3af680991dc03589661fe9bcc9e04c03f56a35b3bfffa7f934aa566477dee967c7aace18587e69c870e0a2b794f92a91922d92ac080d430d3a7eefa4f088fa5dedfdacc188f9d20136faf0857e1ed7e39499359db2ffab8cfcd32b080e6414cd8af780830fec0f0fcc40e20043bac78676e3a2e95bc2f1766c3b40af679825d31dc0622c5293536228747154d50cd1570e83b2a59d14,8943b8e6a21fbd1b6a590f11e3d139e988f4b82e56d457137290e60928a00c3a,dd6b2ab63c789018f6e81f9686a4bd9a6be874458b3ae3014c50441f7f3e11ac5de6a9d641324957f46fee903c4663725df2b4d25ee6f925bcd283349a02e45401,a83d40543529443e38728f8ae1c8a2190951c472c55b0f99feb9233ea05e2e9665bcf55a22ea64ad33ee3c5952c33a024e4d69e4cffd186d1f7caeab33975c1100,b16177b9e13ad43b2339c8216ff36c4cdea500b1597a751cbc5f31045f7863ed5b660942bd4cb94321ed47f4c2e46a1d9e771543c1f8f3442e8c9a69afd80d3101,e9f4827104d3f25ff10185e9a196b821853dd82fc8541b2d8713c842014f2eae44902987b008fc20290c47b16aa4ed9b30c3fa44508e2b7b1a8dbe249acc50c101,cd0c0ffa5d0ff28e2cc16f24e92f65dcff0b18b3019cb79d2889b5e96e88634922c2fed433cad1171db456cb1526f86808c42e4d46f1e0b2d1db1c262ea6dd3100 +05292f4f5461160e30b8a36e09ec08220b968cc4b43f6febe6d0ddddd4863a48fa8c989881b4a847442054c5a6c6c1898025ed59f127e6db3ad10682cec059af3de063490daa589d7a167f726bcf6e8cd02499defc0e6278d48a0239ee935908132c37128f834454d52a17896ea967b598b8ce4d993ed663e981c0043c8947a6c79b3daad25c87b179eeaaca45f59d435eeda8fee10163970edce62c51fa5da735078c26870027f7379228e1c5bf79627a55fc22c80df513750e2ce130,4c02fcc210c1b04b91b94ba92ae80dcd30710f92934c505b10b6e0c9d4b8fff5,6d7e113a91c3c1bed4477a9d2df7be5282096ff2c71538cd91b2389d95f9cf4d1eafd855e35d7dd6e2c937323300f51081d5fdd12b6adb2f7499fe5317d85ee101,f4f155d146cf7b996b810b8fdd40c93986e4ab45b46adbceca4d4984f41ae888311732f14192c2e8e60236a44a5ecd810fe007aa7adaacce4ce8fecacd077df801,532dbb96c1c95c127c3e8381a66b61aba9dd0d63912c39b8a3e3f844a08397be1ba924a9aeca0188525c8d0048f6eebbfb60cb2a7bcfb8a5fe1d5dc6fd5f224c01,24fd416d9cf0f8efe9b62a61f1ca5da5fef1bec8d7600df5fb022a53fe2e668221d80471affce7c51db0261faf7bce0fbf3aeb0a2a44914f460fc2db7330c75b00,a3ce328b94c57c0fd4b3a5f0b2383cc3d39746725d7cd998180d1caf1ce9d8f7734f591833c38c18f54b1efb3c835390d1bf55945bf0453f29386cced87c566a01 +7c59aada6b1e8bf9e211e771b73a3feb4d8c3577ca2512e865d1f2f1bbb6aa2c9eb0420c11d7d3f4ff55517f4558babbc3f2dffb5d0088107a6238346f7d624f442e3287b7c78355c73f0d2df99ff8a0eff2e6e86389b081a2120c52fc28f4ec7a7bf851d8629cb33a00c79ccaeae83fca1da714a3b6eec85ac53979b72357338f3dc78ccbcc785414a62f5505248bbfd3c960566b530a4e45e704587abfe64452d4619b99ddc688244871296552dc244bc77d51ef36eecdfd498509bd,4f63ceb53f68cea70f37651156b78ef3777e76bb68cb79b3db0a6806a3fa4976,a02e86786d25096ddf8b2b753c2f13a1ffae709fd92db0da09c82a5f979eb0d208e7a11af64e38fc1021988af7d593498e75168657e12d36e7a7795ec2dc224901,a0735f8747bce9b27b71b4c59e2825bd9413c1ec70e64e1523b9ed01dc70ca0c084524f6c9c30a7c366324cf53c5e0c079417dc07284ea8b20220925da71c02e01,12a7bacd8fbbf7af1075a5d2cf1ba01f5aabda40629d178a590777cea8707f084a2c4fa7a47550d60a25cdf16dbe0dcd4f950157fb3c7a8badee9f134028a10c00,e791524a6828eb7c7560d659e37e0018395896d1ff94391ccdc94e763b6bc68812db468636532783c49de9ba25bc6b0f92e0f4edf7c7d7d3865058af6cc182e301,06c1d94756e5d14d4118570f86880133efabbcfb16e3f19dfb2c0ba6eee28e2476e5a01bd47a4c9edc067fe400eb4ffe2ea95bb794707926847f111e608b9a2b00 +d55130b8a1e44dc3c65bd88ba83b35c9b6e6f9402ba2401a67a84d04a666a9e6ad6fee0f60f913e7051b6075fdb61966e7b5609c5b8093bce364f327c7fc9d5f4baf0911733ae809097cd7903256dd5a3e5e1e68c507a1adbf6e170736483b9e3ed0e530359f5ad968764e9ead327b863ca719f465afc95aecaf55f642ccde43e61e6e04c6b9f3872ec497fad4fa92229f9cbebc3b1bff6987a8ae9d8dc1cfaed4f5780d22bc6b7cd576aa11ffe5b90279b75e5eee1f835e55bf588de5,d18d5233467d4baeff3abde4e63bd56e36be467f21a390fbadedf8b8d382bd19,65e731d73409efb9bb22817c7a6b4e07050aa5dec222c7bc057bf6a6be7654ff596e77cb296ec61142cd78d0a52a55864d484eb5334b817d90a8ad570f6b836101,bf66b59127627d38ff49ff22a407bac69d2830cb5c42af01dd47cd749c0103990f19f62a2642ed809e36b674861db776c91901b4582a0d9eed4a6ae4876e407b01,22f8dc387e19ccebc425ef0252e9d5bf4f51bfdcd2cd8463b8dd1e3115d5351a1666ab16607644a39487067e910469a2589bbe14111e83c6f366b6aea5517cf700,f5f2edd53bb03f8f7543726ddac06c6ace32b904a894af9934248444eca648850d6156620c24dc7f4e193c77bea2bd7d33f47dac77d274702247dd6c5c8ae58f00,e4af06ad5b3c5ac30c2cf050f0d309b01878394809d6f40b9a5bb1bad615c3566ec46b739c1c76ed75bd47a68fda2aa083473a595dd9ecb134a69a79ed4d6ab801 +10c7ef0f6f093bba1d4e9495715a5b8523458cb98a47bdb8e32fa9b32a2454eecbace322457cec2b513d9d5974329bae8cf477bb8836e08c6e18eede245c3c8d99dc90fe3f06d06a88b08c13e0bb1c71ffa9a2fc1820dd82890565500d672c7c1822eb5d0436d9ee71745079cde76c31c4b426c270f77b584c0b383b248c58c16a7144bf3e94ae46274a2073d73b1b71d92ca95278341f4b02e5ee10a663aedba2162a0cab4b42298e51281cda76fc04d4b06a1d6385cf9c52691fceaf,0c7c633199ce00db14a9cc979e341e3c7018d0be79961d98cab4bdecfb394635,7530e7065b0d8c0a528a51ecf302d976c54b74d5e846f8f6cd44009564d4057d27c1594326d2fc47d34cf330b960542d7cd27fe414a9fb1c3b32d6706c87d53a01,0517657d71ceb78d06c6e1e178828d17148d3718261436ce1f552bb683f98e1d26312f89c448ce8e0824ffea00bf4234e73d38894a11f99ae76cccffe044bf6900,900388b701abe6887969f10a7e16809db2a3e2a8d40ad99f3e1f30faa48824024854f19adffd869abd9ca9d680abf23f5f07132cedd0a7c5827eb698e721611201,9119bca8384f1ce5377c7b31be4594e4d35b41bdeefda88c579a6705658ccbb5029d4f1bd9b47bae4978cd2cc6144c5b25b1903e112e190f068a9bd7c862763801,aef5a13079adf80968f856de9e84452ff21137076ba49ad16018b11f723784a0204304ec0dacd18fc6a3e323863737f62669f7d3fa98611e1172f9d2c2ea1ebf00 +106c640c09b297cd5eab34f08b9130c711b393ac707c54308e531753a00db71aaa185de2d3a3510a45a8cdf556e5641bc0dc227269079b25457b1503130e6f60276d0bacaf700a53e6aa85d51dd9d9892659ef0233ed75ec8eb0c0cf670a15e5367eefff9a81f72594153c06489d942e3fe0be5dc8afb419ad9cb73d964636b00939a1a2cb4b5d4601001a79d467ffada75c656f32c46198be787d2668a79dc744abf8e48dda0e845c1250afe87a8e5df12da6cb2b1b3c6e3f59d2f324,c99d02f409874acdb206560a36eef0a5ce4de9322c6b558e3932a4fdae8cbf43,0e2458e641d61550c33e5e815365e592a115a2273cba0de94381faeaaefb26a85b0fd7ec614bee791974b419ed500c942687db51aadc6248fa2490e100ce9d1001,71c7bc73d55e7b899582c3ab1cd328401731b99fab639b3f1f0d516c5385a6d25b0a820dc7c3e7ec2800e21cf5986f84aef281b583fb3f2e10b28553e085624e01,05b7e9c9bc48e69482be312ce721bbc13f500fdea024a17718e65f3a5569325b1e22fbc40ec1603042e7d327f9aa9a5ef16ba1784500856c63ba4038a3cffbf000,05d9900221e6dcfd6895359820a3b0d8d479efbe444ef92b1c0746cb9921e67303693f25877be9ae561b58e187ea4e159bd157ab9ac10b46fc2f6e87d6e9e0cc01,9609b18039768f7de1f0d838fc211c09b57cf4cf7e28b6b8c1332ec9083360011c3a85b869305eff40bd24292bd3de8b321db0b7d736310780bf505117fcb6d701 +19c30c5ae0281714f6a06d98cb4ddf5410e665e5d71e17b94895c0c88436f1880a6f26ebdcf3307d4a15317171e454db689d1119b7b90ffb841f94c7751db5baf22c5d8b1e87e529692a1dd2d7858799ec2c20f41dca3e4897ed556068e0a11a112f812e345a10eccc5da24a601197f2fefd2a11f920d9f6e55a8d472ad4b1a0e316512f4a0a79bcc57b499f56134e2a502d790b6ece0373ecd13ff207adaddc296e063eba0a37636b17375aa29a135982cd83f7afdbd931c4ac75401e,0a1f15557edb4b96c3f434a1a4f0db4372587e1b4b5bc8a7fe63d494beed6fa2,f88dd14910f4dc50be86e2a0d41f080255457e378554977779472a91b849cdac214c8eae546c8271fba13fa6f7fff17dec2fd71b4e745a2cb58e39fb673d749e01,69e1b7afdba48c8d0c50161ab82ef4e0fced3bd83a06eb1f9d7ccda2c6034d174876375842c1af4d09c1022acaddd329afe12a62f6958bf7e069b1727667e4e701,7b8809397da1651600a9bb1e38f6f86bb79f5c63d6bb8c213cda15e3f51cfd03236a59c13c427a44c8b496e788752d5c1e3ee03480dca0c07af46d59247ada4a01,914f88cdf9ab021689e651e53b428094efd36cb60e2903e9fc563ec95bffc0b170df4d996fe09ea14b936629fc4ab2966f53c442051c868d78f01eeaccebdde301,db7ace5f2fe7b64b04458a7fe9b590433023a07f5d5c415168e4fe07a6e404636e1ad2c14fe5da7aff92c3846f365e4e5fcbc52e0734aa7618248a0f4c2eb0e400 +3108a2662fce554e4a25b83f4359a4800136071d6d635866cc13aade6dd807542ca03645b8795c2081eff634614821532ad4ecf1b4774e93042cf4c4189491f1b7bc42a5b2be5b9b143a484b60503fc5b314d086b911347189151400af2030a8c4e2924f43008203f28e680903feab96d302c4839d6dd948bbeca93e727ec5e72f2940c1fc58d04d0d382308fa259805c1ee5d7681d74aac25c1cbf8dee5a085be96ddbf122ee7d3fbabbc253ad302c8a052f6faae204b2e3f1c38fdf9,129b4046cd5312501458458e056332582f441ecc4b13f498fb81f52ff5b26a59,d0a3cc842cc05d1d85870f43fd957bbd9e942c10b5d726cb62151c5cf31d50106e351c28390695bb16d2c4488b7b7e6533475364a402a37a08c5f5016bf3740601,4913be6a98bfb3b1459ef295d6262ef884c3e63e8b84232d73dc87a44eeac09946912b787a6f3aedf3233865dd43baa3878c57ca179956fff7c36647aa2d38ee01,c816289ba63b4358ec994838311c375d219970f906490d0253c29c915c4c2d621a47388f74f890ee19be305e036f7f2fe4a85816a8ec3bfe51da5a6a00f2c11401,780909c042b311eca153e967abc0b124f0f6ea3cf3eb7a8ef29bb277b3a6a4af4989011334927122150fd1acfb85b3b6711c0d2546d62c88aa52a06c0b9cf9b300,d8dcccd0a962fce1f7b09434146f8121a255f34835dca8c8bf81178c8ba1c174020b150dfd056981f53fd29dc4dd3777b6cceba6e1fe0682534fe16afdfa6ebd00 +4523e91fa679c661858297be21a741f807037bbae60746d87c607f21422bb18914b418b256b2efd0cfa24f8cc013da2b4a3d40952dd9ac41e8bdfb983da743c9e6372255d425d1035cee97350063f029286a04bb49e8fcc05cca799f74d3feeb92828f9cb10902660a2e573f08e748488815264d170ead4627335111a48a0f6d77103998e65b3d85d09e8ff8686cf479a1048f1652f898e4b83c64baf26bf958b5df84f889eda9f51b2216b8c7f7a47a68fb35a029f2667cf002ac227783,70fe923d101620d71830666cec7330d4b48d3b14ad4adcd1e76a20605b4e8adb,2ae00b0c5b0e525055088b3ca615aaa2eaf9ae4f8d4f8ce99992c09aec1f46727293c2aff1d39ea3114130a116c6f25c631b30039e1f1a827dc0cef72a1ad8ce01,efeef78e08f47fb1656862d0120471d33f44575985da67290b9515475c122ed644f9fd815715c1f20b59b571c0e0d1608d115cca61a7cac32e6ee789284d264600,705de848f9e9cf146dbb145cd6068932f050942c76fad15e080505c9b354add7103d441f2424e9441f61ab53917e58aa2c906abb56ab317816c560bc6a188bd701,85841cc111efc8a99e7a7bfcbf6b49d4d7fb8dbb10885a134fff2e5db7678aa366bbc722b8d22fd3e461827cd7c5403185481da499b61fa3a41644b8eeb4230201,c8c819dd22ce048dc20ea9de99a46845681e98b4c93f7caba849bf498cc0cd1a1485439b8bbfb042c37dbdd63f332a7082f6f4d05b924b2fd1c9812e84a01a5a00 +5c67524cb3f6cbfd6597fc738ed9f9bc6bd965540745a1979356ac7f9ec58dee1c11c0532a00e88b28d82dc2cbaa5b5f98f2d554c7cc7903cdbaebf91dde1207212e34dc613da0d58aacbbb1d38ed9ef6bb3609034fac215b4e0fd9d2e014c1287603a3576709006def669d9321c0a315766a67c1d1a53181612d3756ebae54e518d07037b7302a4fdfa06243bec8cf2d4b6dad577085dcdf5c0d4d00083a1f97785c0cc9dd611c9b98c5d86fe056fd5a1cb9324c46853553db64e7e5090,f1250444d4b2d4d61c63565189fd7b83505c28456ab35ac8b1c2ba1150a9a457,c9b909817c4f5681902ee89f998b1bda67fdcc293c83468b9498b431f0b0c356408e64a6718760cbd1ed378ea3e6f99ac8da00663c8246c7ba01d5a1c747e41a00,3c5fdec410792c6887d9d86d76004809206d78db1dd279ad70bb8efc283d52e672ed4eb8db631b4b01d41a6fcad05b86ec0ec2ac758a24403d77f9ca84d1467100,556b7558f5c87d0a0b7a3937b6cb067e2d146e460e1e9dd5a5dfd578b26ded524a09109ddbb20539564b4ab47d494763dc819417ca896b2ba517b505a6324f6b01,4be11c354f16ba650b1f68238be960fc47e355bbe773e18c8d33e9e570ef77d40d459bdb63a02932fbe31406f569948a5c148e12d0c7fa9bc5bded97f284770d01,0896666aac737795041329e6f6c88486c627f308860137f958a997c4d2c5ba64092422290f006d6780752db88e6ae3af59bc9273f52d87c2ff6da05c93d1d7d900 +51e68efc0e9e018d833d467e02151b7e9c5b08fb437c8efe4186eb7e85b74b5d5a57dd2ec687aa373e889f70151cfd278e3ce717a615461cf9aa8dbc60ac387d9b4ebc9ef45fdac7f7c3798be61e546a1c78beec01def7ca0e4d3c355d0b7aae6d8d0a843f0db4947ddf5cad0f62b06bfb583eceb2fb15a11b863a96a14e87fe91044f7117041c59f273e11cf2f2a06025dcdc1e1afeb8a48b2d6320c92c24198504d114bdd8ec4d4cdf99f4e1e6c9fd0fe3e860889525068df3769629f0,2d2df201dc2973a221376742296c0818714e4a9ecde4c1ae9e4c8367abf96c45,ccb946a6684d79e2e0fb934c62963ee691d35b93522f08721cfed28b17f732be6b0beceef08412cdd8f10fb012bc2dcaff0c74e7486f88c86f20e9e68a8a597100,e46d7dad772aa751d9f0c41d511af10dd3252de69a4b2a21198ca332edf1c434095dfdb4c4f07589039ef0e0963b74fbfab0966343d2deac0aac7863805ad99801,84609a892f168f2bd820f72caf9fb775d4877335ac65b7f3c65079c10afff63a6ad75c6f4bcfe49f598d37b0be039141f1a556b8a7067e82f4f61eefb3b6a87d01,020b103b7ee7d44fdd5fac883ba77b2ce152909fde595b25dc3f9579273cc6654d63bef06b75c50c5cbb6832b5a218d563b3bebb2056b7e0ef744dc38fd0c8c001,db1c2324238ba2268faff92fd8f9e0eb77120a0557140bea09c43b1e5826eb8326282f17b247f59aa7a0aee0cd6bf015c6794af27d65f0c02bcc7a6d18f971dc01 +80b088e40d81f2571986eb8f23bef35c04e3bb93079efbb7d940bb6dd3e98bbbcc4ce6bbff4498f30fd5f654bc2451c6f0e4657b008f7dc3fb93cdb5b7c06fe6ef3e776328c90886d958c123d4e726d7debfd524a05dc7cd66035903afa10e1de07f88af8c1ef55dc7e1fa408ff225a0df5de4c113fbc24fcc3ec98f802bfb478b21a926159b4629bbc4a46dc4561d0b14fd8959e09c9434ffbb9ef1d675839dbe3cce1970dec1452e438a868fdb2d7e13d851b472d22dc6df1663e3767c,4a5cf308d899639c7c1b2b7afa4a5783f0ec63dad358c896bc9a91674be3c53f,ec44dc96bf40c38e6a2aa1abedbf071b2d8efc8570e4ac8c2632bded0150c13f1a09b88f80cfc9a03f3adfd399e88fb5b89d4d61d6f5eaffdb645db959c805ad00,bfbfdc2199e6f6ec948d2d55ff0d495c0776d877c4e8fecd924e91901f9a1d6173af2a63754c62014abb4b831ed443bcb449fec53b78ad82198f9f198886fe0901,ac965472500796f488c0ab044c3041fd8aeb1f7ba82c65b038a3ba6b4cc13b1752f73b2d38a138fadec57b443c8d35f8253b7bddcddce6f606e8146e887ff89200,dd6e38bb090a2886fe4403be6a74b8fcf167bc3410bba74e450858020684f7557e776272d1869e7d7c5709c2bbea9ce133c3f90962e9fb5c5de9a370bd2abb4300,25025d212dc766a4541c13c8904c27542559f7fd89cbdf9380672ad61c8b56e46a6f03a11c55c3c234145a8e33ff5260902829d6becb6bf021555c6488144cad01 +71cb38764097721db8bf1d9529cf1830b303064ba7047275295db7f649639c31e9e4d4ececca3a7934e8136c226d4ecbd931a1be139a4a7b1d73231c2065be260232a1b0fc48d107f8320a9195086dbfb99a9629b40b4c4a80a29c7a167a98581fea22bde99dc3454357452d7fae02d7333295e3b3602689e0ef96cf0f1d88599072f0da32e9676f4f6c62ae29bcc1350ad557add6023e4a79998f141c6736942db3d24b38970344ae2fe9670c2e3b1adb8731e848e31a4d68cdbddc813b,b4519d5162d4aad4d616034978881220736da0b77593fa4f52c0d3c2d327cec7,00ccf2f0b920dd1a98d9423a8457cd6a6ce3d89784c36ceb531f802a39ed99a93bd16861f78fca8964b71d0498593419fa5e87568c83e891b9b4330fa351d85600,aa02296020f9dbf737976df23f51ef8cef4249b57ab8191c20149f0c68add5522fd376e64ecac6bd09bf6b2602e27609bff49ddb33c60b080b575d951463502500,5bf92f1503828b829f3c23afcd4b0a9ddc9c93975eb3600ce033028543c7c8854b7fcdf069f14a19b9e9b10172515f5e93859c91dcc30a657da6704325a933e101,ca162e3cfb21edef4fe72eb74d51731d325342d52306311a5622364bcd32c25608e113b13c014e884362592db729b6f2643aace6ad848421b625d8bbb83a15a200,9f8311e655ac12db566de85ce01119487b067ce99d598792f1edc64a12e587663c959cbf3717c3f5c9218631f1fc29e1b4a963948faf5eea27f3e080f4543d5400 +62d2518910e4d6479fa524babfb579137050491120e29bdf40d57619df4b389c3157673e6aac7d390e61bf6ef562553db55ee02c17baa593bad9815c95c64b673685f5c3f93d6781e1fba0b7de44066387f3507293d52e5ec5f68d6051bfbf7076fbe9442816cf4d803e2056e744ccd2b5624f17a649a37f898ce3b158476bf458d1290bcb0b2de9deb7e0ee8ba7a5575a7b93182d851f9a09bae09a8aec079b48ed1ac56ffef96ee55a63bef908d7eda5e6e8ce231707c16777d5ac92ae,69e669d399ad49a07ae399ecc04fae7abe6131a5b09c39799ebf35406eb6777c,620fa26f4bd85cf54106786a26a7c5c2a302c1f7ca7505043adc7e3a1a9a4f5845d5f469e09e965160aad23d926b99f5a3d782547e672e7875c07a4ceb89175400,e7005720a535f894b44ee840e4881e81db7716cd14e00be79231f422efee740b1d5f059b0769ef5e3b481f3c95d27dd26a398941d2b65a8af5583a186f8e618101,a4fab478c439b84cb9fb4be8746ceb57bab4b0aac981857ab1f24f53150b8ed506e1d73768628a4fa1cf1d38f20113681360ef68b005db4e228171e08bf859b201,92923b4cd0d282d33d325ca67b75df400772a97596c81b5cfa7dd932a060f6115990137e5a3efbb85f933576d06120200a1cd49e88bc6fe53e3dc976af93d4d201,fbe0fdd41b51fff0d329b1091f92a34942978cceab41731828868c90edbc1983523b4b0b2f5a20435bf335f7ed09b8053cef356f843c58e176c8daf9661691a200 +26f02f406303129bf17bc1cca4a50338a421394f8784962bd3672981e4eb968b2262a32e57b02326de37fbe341724e73901595a56d2271aacc1610f2d2b9b8fae1afca2524b9b2e9cc4881b05d6e80a4d7dac9e0b33d604061c86027424c1dde9281bcc32c28132f5f84c2a1d17c3133c6531e6ac0d6321406a9066cd0376a03dc8c4be4e86dab07a7225c09079875613a22b7ee8f98fa1ee88769d6416985f22214d04d78ac4217e0121baade5631434960946b087867329082e2913ff0,241703ed6a503fbe180c06e4693e5e77a5c32655249dc39ba035b85a01057a25,93fe3d379d47c831af94f245a7343310a2ceb3a4360e2a0afdb254a0fcba6e0905089f3e990d7248d97f515a18891fb6f64120ced3ab7e0e7ec2810fded5f52500,25e0126a2b70bedaa1fedb1e719c51a85dbee94e8d4f90614ec8e617fec411366dc861348860922dedfb6636c0066986c72473805d6ee11ce99a97895e7cf6d600,4f638293bdedb971dcf0605a9c8df2de9ccee0b8e42f9823c8317b40cb4dabbd0cca628ca5907d3d5240797e2820d17881ad4d1876dfdb4c23d89ce7dc71723300,b6e6531075faa3dc81d5dd4b4f7cf75159c8811dd1884744ac02eddd5e6a0b3049e11977ed1325fb33a4e9c67836ebfc4562c56f5aa1aa1763f3fe3eb7fd40bd01,a106fb964a36be7d8fee619e5b28bc46dc83aa9b3195b2a3c39a50aa2e41b1437bb24339d1e24ea748e389d8a682db440d5126186e1eb175dd76581857346e5401 +d89a4c574360c3ba88a3702dd9e52311034e01f9b34824242541d6c09edd03607697734b799c6667974d1bc88e0f42722335b5840b8b18f66c67f43ce2cc2926ad7f68190d393381f176d1bd497c7c89d24145b1a51f5cc456fa2fd3f14181e78f544e298e09e892758a982431b097c600d54425e9958faacaa4a1d508988f2dfb4d0566e7127279ff712ad31ffdc908eb8f6501892877b73bbbbfa16d900d6485acaf541d88aa4b57a52c2321320bd2bef5a54a8081bf7c875c117c8980,58de0e44e5c7ffebd53687b049b48e03a1250c7f085b0411ab59b97c304a68be,4105be0ccdd546f68ab38edf9e9b36ddba43589aeeadc7ae27c466f162e6aaaf293e3b094354f867f0790fe4f0658db6519a12591ae6473cb7bde57cd3bae10f01,68ff245df01ebc3708cbaa8f0bbc505cb2c122c2c637c53cf1b4670dd0b7a6f6441d70e46bb39502ea6433ae74b2994264bd503474b0a02033bc084974ebb49300,8a38df6e49029760ba3f4c30f6855981608605747e355e13a7c57528ceb1c20f789a27f52af8651a2d89bf95abf7dce561b421055f7f95785d267207efcabab701,558da954f40dd7364727f5c0888216f22ed43c7c9f8183831f4eb507a1681b7255364e7ee048060032d80920c3322494f2b435a6d78371f7ca01030a7f7ab6fe01,a659cfdbb0d521596b8c9739be0161df781f7c3998cd3f7b229b1d635696ac5b2500371c88937095c09640ded1b1d0536aa93cc1369e71a2de21803e5836189401 +364330536496f0d8d0cbc4523f7dabf883f40c127884a90577f1444a07e08d2928ec23e11567eef818a56bdfa3adf3baeceba43cf2f4360248a80486d7aad031a698ad37733e2aa5c08118432ac8ece14940a1f67b9e24ff8ca7eb69c902a5d1c3bbcaad17906e0f145f2b848bc029a2ab1edd720b191f990adb9607b22fd1a761d9e48024591d1c898eaafdfcd6856c10d4d6bf2d5f836c468da5a0dc0a46ea1666c8add7e4d35811748b69faaa20d2f6fda86788663e23df99cebb3598,4185a1878cf37410eff02ac1a3fae3d2dc1fc0fb7c7707938028f2c8c0a204c6,ae8a85065bdb31a586ed92426c3e80c0618d959461b34562f5eb469aa0a7f5e42168c53fcc2f307a7a62563086335ad6cdcd2e41c43b39c141a875fe29503b2700,0a54e98a8e28d650158934524d4350026432481c0abea477624ff766735930d62a256b2e6bf38d0d87ce3ea86c745d1f90e24a6ae233e5efd4e069ed12c3323600,65c5aae4407160104e6945f2071b4979ec556feacc2174d1afacd934b37cab6b07490a49aa55fd20daa64be193b5936a74ccc5b76b2918f37c737f5c52841b5700,d3b3b7e881210d3c5fa1bf382c2dc47cffbdc31c9776b116e1205853af7466c646fd883d9e82529cdca9f04047a1eaa5c68b1188b311ae09385fc43e0eba9c4d01,cfa81442bda54bc1f24ce63e83215f3fbb893b1512830dd913d0fecc1fd8c997660a586eeeb67077d69d6b4441ed9a2e45ac82db358f8ed16c7f00e9fadab1a700 +c373b0c1cb1b61cc302b08f811c392bd7771e6e63c9c0ec22c2ee8c5a75cdb9bde3864a0ae565d6ded0427e74580aecd6d19bd24d5db6380e37180106de7e536838201327283fb2b9c53cf027e084de95020791f74097bd9c2cf3a1ee5d44727aeba94fb5ee556960e53ae5cb35681616ee6f8b2da2256d8166b481963deaae362e4c6af2935263eabd55d607cd3ce7752501afa286ebabcad72c8e7b0fe0b7d6ad5b45c9d1d4af6aa12fed630bfb905d8d4ae1b239e8c4f6b1bde06859d,e54fe70a888db9687c2dc3b06e120a4345e66ce46bd3670d9ffd13f892c02280,db2429e91448dae2ed3383d12c3e1660471c6cbff721879d2ea237e22db214ac2b829fca84bad27d879a615f5baf3e03e8ad79db4de0e545f650241cf3553c8e00,d9212036187b1a6ec71e2bec2c44a21c219a44f8f4fa94acd3fdfae25edf80e346d5af063c685434c373c7c8e8c87dc35337596666db98e07175600aa691b60800,8384e7c8fbd0713c6d1452b47aa4894cfdbe61a45859ad2f039d370e60c7f4581f7fafa2c3406c75198b2db9f8520676f7cac13d68f9ffb352515d7cb2ee8f4301,06a22ee9675b0b01633eeb6fdddfb387a20717b10927d84a7f7a846f63ca04e477424827e1118e0e7e9bf6d5d3e5006bf3d6a4f65f90a0d281a33f0f70a05a2d01,4803e71ebad4675284898e1cc82b14504f59f0d8f5b5a9773d9cb7dec14698bf0f1d89f0f4a70583df3e75fcaf243df8d343d098105d3eb68b0a822ab6846e3000 +6aefdd8e07728e8854f3ff8eeedacf5f8155b2e5255c24be6c8405e2c7f08948c80666817b4be2afe3aad84ca451e0d965040e36b38e49713b4241c19e30d979225345088354230ea6b943bec4589f2097dd69d499f3ff11d2ffce270a4dfc7949d44eb2d577ee549d8a02c553c53b333f5aace2aad9e4b5a1cb8b68e7a344418e09ad8d2568af8b4464104b0a84c9b6904f6a1ab546b80f4ebff676767ff89179744897613cfaf39a9353254ea8164312a919f7c40f48e706b3fe9b8c53b5,153537ad68e9533dbfbc42d37dc610f45ada59db79a59c7485028e11601871d9,3363f3d96706bc2926f34749dd28c413ffa39167e01f9675261a19d522bc69d67917f23875c73f983706c7089a56f0e318b2ae5975a406ff6fe1bc0794240d4f01,ef578c903b3033d3863dff29479168756b04f6677ff55f96797e537e0f67fe15744320237c7619a5294c2adcb38fb78cf9968299724d491042c6f0251884f5f201,2cebfa5d290630149fdbd3d20b3b2ff3d850de2558190c5e3d48007210b972a6115fcb32ea858f3026fc5cc240055a74d73e63002858144c0624862482f6de4601,d3bad2e82636e03679211b04911533d4819c86aaa1d3d7d1df1db7fb4b1c1443605de9ffeb6ef27931e67e8bc5a36d609592edcc73bfca067968ba99e64c48e900,5719c19afac807a64ee161b1dc6c306a5a33a81941f5ef31625eb3881c407e497ddbdd4dd20412f784f5844f2198d4a2af9e10cca13efd13785687eb7580956101 +81b3959d17b1581a0faccb64aa7374e46bfce2991304e5aa7d7eedcfe5c4e9fb1835007c273b94a1a689b3b7453b6d65b6b3ca3f76ea96c8f85a7cc8d1915bfbc472c6a68f6bfe1f294d311193ba508c97c2349714f6f293776c87c1bc730703b16d062fa3bc8787cc0db51431dc3a210342a7055203d21e4af0714223f5ad94b2cb47e250d2700019bc4b91360541ffcfcd436e2ad334cd4a3af240dbb83050cec360790e8d223f6adca9d80829dfaaf695fea44515ba066d97707b4fd22d,2610ee9a2413c731c39f17320f4a153b3dd33c9fb3de6e0908911812f72292e4,34e1514b730c0ec52a840526962626e63804db3b3e3d01598be34aeb6879f21011259ca96be82bf6a456a5da56ede638500bd4d27daf3b69b329799756485ca101,1912d9b114a58ddb29cb503ae776064b4f31cae99cacb02b276feea6b9a95e322c54a9d30f859082b7827af871abddfc0e83c8a6948272314da4f03b510dcc1901,72331b3fc29562e09822b951a88ed011e1df0f6d85c466bb83c1047d09c37c8d2144fe520a2c5b3732271896301a767a01157654ef6cf9561a9f6841024283b801,4261ba552fcd53f170afefe352d24adb3d6e830d73ed60264f941c4f6ac1f2497281f2f7ce9789f552cb6790a9909bdc4f6b0cccbb542f26b3424c80486e428e00,323d23e71148e272f623a062c9c23a6c77bf4b8e56f35d304d85ed50ac28998e2c56617d479943a8e1ab994ad19a3e7686dd02e2ca2ddedde9ca7db6e65261a400 +e8e0c145f008ba1ad599c496b757cd7aaeda49c615c4fb58055542d78927a48d0c12fdcf1fdd035218b59853dee99a84978c4c9ac9083c8b0b0de14df189f55612272fa96c755e3c823b42fea3dc1c39e1acb919d7bc473b5e2123dd54744b6d648f82f250357f6cd6359503f0315e646c758792fa669a391fbdddb44d65cb3a38672c3056856018acd6eaee11c24effb7d6b418d453048b2041b02f727e276be59c5511cd4d1e08dd9b6a5401bbf28b7bf0d9dda53c160baa1c42575a94cb,e2e2e4c24d8bcb556b72e6c1102094cfa01ae1312cc3eec7bf5e4e3d413e89f2,76744ecd3a3ca6a5a9f3d999f179bd54f60a6701e670f4684e70807c2a81cc4a623ab9a1019b3b7e3d2a1591ff49d0620c18a19fbdfea10423fd12b2c40034ea00,d1303153a3a6e7d9d1a4b979eaa69975f2a8a9539044e6b1d188877fa98e56c549309c466351c02b715c78872e77014e54ee032d3caf0a6652c20f56c352997200,496de6847bd6f444db329d8b13f9802bfe3b67dbd369c653b7ba2e82645695f3495010b89190ec23bd26a58dbe23efc3685e8fdc026445bfbc7c9d25dfcb054a00,b51a32e545d881eb8a47cb0d614b6ef36bd50f32d78daea3a784bc06ac4b76ab2f8c3e4e24e289637298952b83c351135fd4fc892bfc820c2a08237c23c1a01601,963421c97d46c1d84edd4900c1432718aee0577e97be47fb73caea27e2e9f8cc53931773bc1af47f91da60b78e5b66d59aa043670f92c6f15e619eb39e1ad84600 +31dbd681d3e9b357a183c11e1004066200861bec73497f8c5e602a3fb2974c3d31c5d83e28791bf9cb055a85debbf77aa9b162a1cacce744d94eecff6ac8b369eb91be809fe298cc9b05d4cfccd165350fdb064da7090f026b613ed4c083db183e93b57f930a2c5c55f7c490346a63bf45a881aed8a178b3710695ebd2d22fa84b636f79a596d973f6cfdc325f29ee502cc81841459f4c89fbcdd6818ebda857a4cdcf723534379c266365107416a12970283e393e50acc5b67c0d6aea1469,ada1dacc74bfcb4e11cb4259e4a8e507c9a0d20a83a013fc5a56f80925d4de35,511ec0ebd8a976486ef9597e2e5f77f3880ab4ea3dc242161e44c95c3c832c1d005163ea91603195661ae99f8661071fb590d06486a94e012d6346a2a30ef52c00,d646b1e7d598d50f8a7890d376bc1191dd8baa4587047c1d7ee79462cfdbe40106226eeeea8afa49f092ba2eabc9176c587c979c480dc18555a0fd18c60185d201,e6eb9e687c9686c97d08385641cb951cae89a72c09a12b4d0b00a6856076fd4c1a7bc616f8dbcda44b82204f97b328ef4386bbd438836997b7b88b146a400fe001,dc1b5c08bb2521c8e607d6ed30a5603bfa7842f6966fd17ecc5a313296035e601d5e30b3b96535510158f786f7fe3a0351147bdd81ea88d8c14f0098301fd57000,2af482f105fbd78c141126e81642eadd95dd97e03193e25d757528abf557b7187a3ce2d80f9f1dfd8debbe5331eceef603651b375b4bf30531ff0eb8405d08d101 +40717116c2791853f72f818b5576f993e9b35e0d0b3c088d93c441e9934a11d03ab9401eb4f3b45e526375404059069fba40100a32b0e2d5c1e5859de968de2cbe2c3607618419fe08fd0d89d28237191f4b79cc0af3a1f45b316d9e7810203e61a47dde534ba85cb8695ee3f9da47ab3479e587fc6ab4aa551cc236b3c903df21156feef542e62992963909cc14b439a7ae35f16163603a45b3ab0c891aa337919f20beb8caae0dc0641b00910c693ea1b71914058c27ef8a6ab3b5dfba14,13b5aafd39b42a421bb5aa31c5e1a8e5c109b5418ad018e70267f90ed1b0d128,c057a003cc5bb8ecd9fbaa8b0809a45741268930cf8229471bfd7572d22189911b44985b74be61590c4f6c380eb15322b87c456c7ae5d55e00d4069a6a043d5701,71b19f2e0782582323b33623ae64411b0854ad53273f367eaaa8662f9cb35a8a5db14fdb4691a37e9480a7ebaa64e5c7e3c8ac9169113033c78b28241c0e384700,c5de2e03258d32edc429d10b8af4d403d8ab572ac2fe21562bb910f19ee6492b709f9ceaefa5ab0917cc3281da0c2cf2920b9ea953e7b8d009263e9de1f9b21300,289bd74f0e6b30ba5d9e3ef25a40f615ae58c4a3c6c3ef0c31d1f70b2227fe404f2a3c3407cd81f9dc338b86a4e051f4c1eb9c400e1bdb0053bcc92cfd064f1e01,21abbcc67ffe8326dc8cbfa286229754cc890dec518dbe1395452996ba615f1025584bd204249cc5ccd63ac869c0df1523f3b2d0dcf18a59090a5a10506c4e2000 +5b1000f6a572bc8ca101e7652da8b033412cd879fe769c9ceb8aced3587452eed81ed075a173040771993b5b268bc5bdb438f9a3a9cfa83bdc8c245ead2d00ebebbb39c4a920de050e7bf2be4eb870735e059197f74024290db615be9ab2370d7db9dac4ae5a8778fc3aac5740b706731db34a02dfd72670b1c6d34d79dc01103962ae9b97921881256c02d1cdf07e0cd4a1044512f671e4a87d9bfd0c77e59de56c8c4273abdef29ffb17f9e56e39f0802b5cbd979711d90d5fb678000c08,5fdecb8b4112c2c291b4561077334ebbe677dd00ce43186fb0f58864d57f082d,3c5e82c24a71658f67fcc00982d134c6098c0eb835460eb9880141d216713c493a0f35be3abb55b89c33f0db92f75b48bf23736d1739f0b15567561bbbb34d5101,c890e6ea24ab759df6c03b764cd76ef740fb98d0270e9cfe74611bb60f0699a27f64feeec064c37a16f339f4c6a12f8178421c5c4d551c4534632692c0bf658b00,080a6f9be4e9562c4ed896dae947436966f42fc52009cb2a8c800d873bef2bdb5f09b14bc60fe6e96b6579290b0501744955358ad8258b541f33e8f4cf00198f01,912659b65e9b1b31e3b8c7c1f02d8a38ee6ad65274dc0a8b5ef9f956714a791252397c4e09bb8bfa10f082953e2593596de11d90b73ac1a9f1a926658f440fc100,a971f211e93e07fe3dd10650ff35b1e0199b8e5490936ff4678652eb054ba479658816db017e146747f785ee10c4d148391c4b0061550c5b34d5ca0389bc40f701 +27234531bcabc67ce4e96efe5f7f4ae28355861c84c607a98220f29b9f3fd3c1d34f5361d261325c823620f9fa5ef36d54bf6f6ccf6109c73e855ad3124271edd25d863714c579f27ec6cba94b66af31756f2f760a722715bd6e8d742316e66950cad62756cabb37e384282f5d8b95310f20c397b4d9f4815ab494cadf2a1368e4b24f97a0a5e74cb27fa31bcd731c2ac2d6ae3c116597df58bcedf4bf5693f168a8f25f76a1128d987c0f49e19c10fc95be23e22e2f2abdfefb71004311b8,13d06a49b99dca50f153f0250adf9145ef8f1dbf34acdd16c2f9d40825d0395e,df3d7db8d5046ca0c8e14a81c4871dc5fffc1e93077f5441bc2b7df3e0204d90407f4a41e0230ea4d9ff5cda9c130dc1f51028c89751f3f620f574774d69a78100,9cc92f4cbe9542f5e831894d51fed2e28342fc5fc2045fd1b02fbf5570c9b4c17e491ce08ad9bda22df6735420bca4787810ef52a825c2fb14cd1c247764ac7c01,21534ca2b23e25ce7c3716b5197865a0882b292a5724ecfe2422b47d7796dbeb63d0799a5b9916f797f07348e706c8d3cac6e0086281e2cb7538bc7dd1eb1b1301,0293bfa27719b4268838b7393ce1564b5ff782b7a509783f350ba1ae270914f571af9de6fb3661664adc32258a8d6825d6b1debc583b1fb404da93446bf39f4200,6c1729f75e4379835e968814ca473c075762bd1ff6b25eac99c20c2ef378247f202393c699f36d670d623ffb030873510cec479ce196594e4c70742df7acf41201 +767aa7f39ac944f4527159c33049b82c1f68a573641b71fed3e87dff556546bfc4a90a25828509d74308a1d1aec560de0bdf05ab8e8998ce7117916e4f6245f025ad82b60a9a7fbf020b4c51cfd64fbecdac4a5d284de57798a540b3e069fe066e0a702c63913e0158e3ad4f79626461dcd57fc446eb2425a01a41289367d4245d134b43ffc633bbd570b7632a43453d5d72cb3172705cdbf9efcea1d258832d1a7abce0166b5be9e02219cd907efaa42f2316ee6ea53d4ee2778aedcf5289,9880390786137cecd5514b276ba02f24fd0cc26922b295534f9011fcb37ffb28,6691fc278a8182be7c598d73e05a371567a132f190fbf6f0e84b99bad8e67a73647136b5ce839971a4ea3a9f7277d117b350621b83d37955a23875979a825d4e01,b9fb6827abbd86f90f468cef08dd2a20b88b1db320bb2924a18f5b55e84555062895064b65ded6aa6ec9aac77d87ef32a208d0d02ce115aece975c82d07b33b901,c0fc908de96e0cefbe0f147422de3ae26d4cef468bb806a82e0ff8f89f06d3d93e66f8278bdbba2cd7500397a5714fe9fb1f515810adf1419fabf462c60c924b01,a929f8f3bdfb1eccb9d2f6098f9aa870ee062f30e15c3bf12023852440306edc61ebebec7e1d2d6468e50faa762ea1cbafaba7e50f2bbc56f17cfecd18b2b7db01,7bb8266ed42119bbb7839507d550958f8941b8d891b26bd604581e7e29bbcef1238ca3adb1ec5761dca958769de4884e2e2e88d50fe993de03c6c1642ceb79d901 +ffbb72c6db6e63a553814e4a269e8f623d3edefb7898fc3e4630f94bba5953d0d99fcc6146ff00266e89ceb49d5a76cb7a8a8fdfbd696487806f2ff012ab0ec39ef695626b17df18e048650e84affe97f076440f809b4da02be1048e881257b1a7c12dd201f9249ef65f0a972a31bbfa8ae0aa04652f2ff20966dba8074e6f8c4ce8208dd47a45f3f4487727014a9846a69f92ce15a1b94f0cf7976acc4aa14d1be836b3999710b1507291bb4ecafe9c5a5f77a8d80d5d8bc3a6ede9c47f7b,70e6922674bbe00d49568ee7a9e60c66f27b2537a4b96c7af2f337c1c19492f1,90903b37ee150b92a125788b181a4ef92e6455a526037fd08f59efba5cfb1ab97b3fd705cb7fea461ab96fc5fe2caaaba8fd7def8f50833bf73ab30fd8e2bca901,55fc4f3dc3d60658546abe781ad7f0c99f14362a46b8151ed4ae46c8109a0f2c4dea3c1f71e3e29e3b11ed686a369b57d9e522e34561b69bea8b7fd8fad51d2e00,13728688fe5cb43712200a501dd3c0a5437fa65b30ead819acc982940c32615c28204d9be370e03099ed9ef1415b00bbf9e251434fc3f0c4b108336fbb61647801,470aea40085e9c5839d20be28361bc8050b6b65db759216fd3aadaff0cc2dcff18906f0b9691c76ce010e0f99e8a56aeafe3599ebcbc911091f79ce7217a19a901,0196866bc833f5daed668733f9ae9cf7d7a21cc6e9fa734c7f7262460c4edc7a7019e0421721545be7515034d29048d640f82833d4bc99f834d17c930c136f1200 +63c4a869600f224a7604dabb2d2f2a20634b648f5a0318eda2c6f1b6c4b4085153e548bc971855a07b207c8ff4626c40f4bcddfccdda676c59185f7cd1f73afa5b58a024628b2de8e591239fb630f92a18a5c04d70b81f658c746cfe9698b2d60ce6c5bbe6223641c630ec619d6209d172983cef2ad9459502040bc937fe167577b134f871f1cbea95d4768d1bbd4109267ac268a0b853b8d7a85ceda486cd1418f82f9055dc8d2e838b30cb69cb0524d8dddbfd945faa222ede1b7257ad77,beb7668f7463a9276de81fa1539e23f0676141405b079c478f6c45afe142d4ec,859434914276b61badf07cc08ca33f04d6fddc12c5d3caa8eb2d6e57f29a7314666e418fe633354a752c7c0671aef2e2656e36c6dde559da3b710793cc6e238601,170c2fbec3a061fafe1a0a1d3892c0c7994c56ea48b44ea5fc3ae5435b00c47b3aaf98e5fb9cfbe9d0de82e78bc97f838be3588809459e45e28ea9f894af111600,136d47d98e7224d6fce7d8b28569a8ca2b61f83e79c240eef2462cecb01bb125361e07ac3611cb435b8156e05be1e2447f75ebb9ba7c505cac8636af9185518b00,1edc8e1f3a779615d97a69623ffd03af0da06c25829c4e0e7064580c943470b2774bb887ff238d2a9a2f0a1a4dc850fcf2ebbcc0ad25b3ca8a7f106e1290535801,b230696b0cd2859144c46c596b0f1a138e7bb53685fefd7f1d2f7733f13bcfc4438b8a429b2f696fe91943229033c7686293ac0d4250de156e93c02dab027add01 +b5b3700a0325a1482ff1aa206e9dad605b82b8a32494fd561ef47efd7ffba0cfa788422aca4d9ec67980f5f78cf511827bc90713c091786a9ab58320f321c56eeef4cfe049c18e1674417dbf3d845ce740c4a0d07149a478109dc83c3233a6eee0c998667a778cb896af4d62e1e02b1137772cec2cd3853a13a0e7a57163b19b62de5ce942f5a9e136b5aab49163f9ccd4ba2e849a825ac612c9650240cade35d7b9558acb3479fa68f4793a917f77fb324cc2efb958b73e9e9d1f5c5db18a86,81939e877b856c4c585760fd8ec7ef11da30c1a59a2c49ebc9c4ca7852989110,a34d227ce9d7f623a0d78a2cf0f8f1a8c5fc5eb6f5b38c12e8732be89718de6d14f42e071036f8580d18ff3deeef58af5a53492795af41b7693e9630646279e600,2b607801d106b0abe899bf2d17d9b11c0aa5c84430be65fd275a9323d77c274a66a494e55e7fe32035e4516f470a54004698dd09f6ae79711ab10bef72424cdd01,7c964c57835d9eaa152b5c9d57097a3dedbd72419d52b59a650e9cdc9ffb37092572594b52d820c01c27e6dc681293153856766f70e558d969608e5fab4c5a2801,928405000e9eae74cea05b0ed272b3fa235d6c71304103ac5606994a23cfb40639ee7d3d537b8a675e09c144b13e0d463916ff662c943d8b37c504a59477352800,573f4bd477bbf25feba1f8613a01bba6a740c8ed419f6b3c094bb89036cb4f930a0c767d2c3575dfec0b5649c790d8d1593390d0e99f61980d4baf5d0e5b289200 +4153d51c443c7e39983dab8a3c0e0373e0c861ba325401f164e9d0655af36454ac46f051d53ca4667684fba1c22ad55ca058f25d0134c053a21618e4b7bdcc144f61f3d83d92660ffdae27ae1725eebce35520a4b1f0861288983507323850fe64f9516d74af942ad2ab7fee05ed49d75f054e1817a7aebb7ffa66ac595678c6a22cdc63c05efdd44b26a63bcd189cc74b78095407660ebdcb1ab7b4e7d3fa5c9958567351d1ad85a6b5141d8a0f021a2fa415f046d70791900d4d48dbdf4084,e02023dddeac0d6c2b9a4a4c4e89bc010bbde8be02bb9b38a85c5fa707d2dce8,e5c742eb96c469b594e438cf9e87abd35b372a3aac02c3c3f244383813be5d5e11ffdbe9cadecee61f5f98c3bd8e418d54563faed6f88bb2d94ee82dddcbcee300,a10fe74aee885bbd500cc98f9857802fc1e16897a9bbfc64bba806ddbd9ab11b74a93a570c250fbe10d932e7129d20f3cbbdb97be34dd06ff400924824db81c701,dd09a9229f3157d4bf0c6e0fff633af4a73de761df3f1e10a3635a2fdd68ff2050ce4b1703d707417ba6cfdf4cafd4b55ea8b0a6d64cb9d7ee3d9c23f6de15a100,983158d46efd8411e1acf8d6ee3f4891fa6006c9bf30a0216edf0493578cc68a1b57be91e8b451634d41f8a7fdb2878fbe4e22692ed7ae7cbc80833f4ab6047401,90446c13f6bc647cd035fe2ca23cea5255ab94db4048ef115d83e2e559636d0b1a3f78f8cce1432a37387e47fe0e65a39c2f0af6a061299de7bd467aeaaf6e7d00 +8031f4185eae2a10f853e16aebf05c6d3587a324a6e6ab02c48ebc472b45e29582924b8901d897856d6adb91adce908565c0a60d1fc7decbddf3a103212f7d27f0ea29684ce5cf48af524a88dab971fd451859e30e34afc2f9f86ea4478894cd33feb1f436f019a4b8c96c0b7d4454dd4a78f6034c0544e1f8721e232fac754a6c07e88f43432010cd62d33bff216be5eed87db84d5b6d9599e2ecc94ff06a7e7469c578e125ac1b4875ec5fe53f3d1ffb9ae577e5470cd918f029936aa5103a,1c4d04d78eb681ad0a28aece7379c089c4cafc02a7cd1f56ab23cbc55689b67b,61264da231589e888353e1885684d520cb3367b52cc2bf15d653ddb1d7309d90146a627a8eb8729dfe5b5734d28ba3deeff7d4969f7dfb189d6849aa4f33e20601,5082193d87618b4381a692b402310c0966815e052025053ded42e1e538f52795193541428b8bbb3d2592fad4ca8de7b655645c6cd6253c5e7baad0164491044201,db1d1b72748dc71be46ed5c77e841e9c710a8d6f88947ce3d8624f4beed956e90c96dfa70a7813c11501955896f78e0ae5ad8378aeff2399d96366e9643f71a600,ce57489e8482434ca8b9e89882472b38ee9ff05075d08bd4e14e5ae8304139f8174dd548e8fa2f55060bcf12c909b0a5ea89dc318544c523d9c4aaa4194311dd00,167e973a3c87565e1e2bcf650d2e0b71f9e65589f97921484811c99b11c855e8545ae08cfb6086b7a697216424e35c2f9070205e6bf8982d84613d3d588a3fa701 +1f78035531fe384bd2e904680f5f4e21730620d2edf2d48799e16d95d5ea747e84dc58ba10ff9981c68b5ffac84d21d94027ce5b2f22503c55bb267847faa751c6faf4f746b9a16eab20294c753e8fd483e892ccc2475c205b994a5361c88c8280527631066b5c49825dd7730974fcfe8bd5ec50eaf2e4d41037017142acfe413bfa46e6cbba08313eadcf7f8d1f6994a812412ba09c216df82a78170d121b3aeca2ea884ce12c37f72c243008cf981dea3d366b976f2d5464f6e185788d8d47,540c9a4fcb9c705e1b3221f45319f819e3648fae72f6cfd92619a8fef06b528c,34310cf3dcbf7f01023b899d29f21db2fcd00e14d95aadef7c7dbc678c94d0fd47cac46f90a9ba7e45173230350766450961f92cfe855214f48916b96460bfda00,64023b3169610c0ac834cfb6ffb78078173c8d39639258a5479729b20d1bad4c54f8241fa2f4639483153327a89401dee7d8858a867a51d81d301195000852ad00,73511e02ae92c1b9e376564687166ec8416437c6109ffaa18c74d0a6e25bffc92daea16a8e9706050c72883554b029de7d97b827a082fe9cc08c26e24cc70e3201,dd6c32c0f37b236c77fa67bb03b389a7989a1604357738bba6ae15af689187b71fb6721a232ceb5a555914259e263120f43fb5d47a3246d6a9ba212a9bb2bf6700,23b2fbd45550f59c1a292483db72b2ca1159147e843f75b1091d0d09a6f2ef0514bd2fce69b09a70177de2f117db589040a97b5574deb4fef0622e7d39f4daca01 +4e6cf63456ce32df1ff3284a3cd89a782a266642863dabfb54e0da7b89f72bb74ff0112458a980edbbb3a8ad4e876d1871af60b8f73af03a7bba6997299aaac9201b2dab5c6541e7e578f5545c6185768c91876ce8a0159403c0c358e23a518c3bb2d28137e55ae68ca3e9990aa1b2cac29fb2fa2a592418d3f81f18319018996885e5e137e3ee7339d4af4af68905a043277459c43e6d0771fb70e6e0e5d229e2d6e5b1f1baee05137d7faff94be5939a26adf40537ec08d034803de77349ec,823c1fe8ac5c414dc685bebb9c88147f7a37e5e3c9021b981f1ddd8a1acd8688,ad139b83d7889cd864b5607e3a48a09ab25ae3a65ab85be85edb4aedb10e40f76456e2b93fb197f9e1991abed2dd1e542ab0e477ead47d1067287e2f13cabf3a01,c26fc29c395f2939ab278217af16367b3c63987e6c80e960a8641dabce3674490beddf4f32b29edeadc9c3e0fc550fe76a86a39084c12715eebc8cb3e6abe0f601,e317abbcd50b39361c23548af856b8375978d7b17e869835c6a803a601f5852c21521df33b57552b308ef18091237da9f4f749369662f321ae0bf86d395f395600,9ddabc97d644ae086d29013c3a4ef410b4f52469c77274c86c516da7ad5ec74e0693d41fd11f981593e7cdb8fbb0c844ac068cd3e12ef2376daf663322eea72f01,7209f44e792f6b5a8cfe5a885cbf49c6df64540440b5af289ebd91f3d4eb03ac4b873d8976368bfba246ad16fd8df96be641637c8e786204ff7ae513b210f2a701 +18ffe5c9a61959823f092203478448b2cf61856e5e079fd48e799c4f04424c10575ea3a053fe0eaf77cd56d14450ad798a426ee957bb45b981343357406d2974c9d139241ab4d87d48ddbacb6fa79c3f7ff133c473adfee4518c3da804a4fb5175249631a8b4be165e4c6498a9841f7b9eecaccdcbd9cf598b6ade55160fd22fab129b8b21f12b71892b53786ddf54c8aed2b977fdfb406ec3296f16c5f96cbbbdb91efa4d7c26e84c49fb4cd82b8687594fdeedf0468198404df3055929b949,e2831fb0fc6df64944e9890ec9fc5902e864b739f77d7596d24f7c06d8aa8b5e,d345553407b492ba56e177d0c4adc8a44a2659566242b74dfea11cebfb04f840785c21276eca95bb260b605705c7d08383eba80c7a106223f97f8f4080bd6d1301,4c50b99e8a30a9a45ee7a79a3b4b17b8e9d6510b49ef0f894568cc3faaabbdce1329ced41344e3202e9791be6e5b1c536831f15e379bedbe8ab16f137a1220b201,4572e51a184c410e157fe9ae3a821519dfd7a62e41f3e35c4a1d5ca19b532a68476074ae2ddb5fd129486e1ed60907d105ad5fa21847c8aca5d3aee9aa06debb00,fb11274a31705d50809958f6ff0ee9fb343865562be4206a4b0b78d0d45528392f06079e16dae284ff4345ca749402ad21b72b670cc628be4147315f568757e601,41f060ddc60bb853d4a41748f7c69e8ec060d6d6c8210488cb6095788b908a6b314bffaa78a31d5a8165ee1c286747a2885e509ad2f726fc6173850f4c32efd201 +7a859004c004a6f0fa791c89d3e574b58722a79fd04b23e9fc70da641193afed09829ba7c18398fad5a16b2d9ac14c566102b3efce174a7064b45d3b1cb5fa0db7b2e83c136efd2e30a044fbf42a29f162cf3997aa72817fb4b38cd67e8344f594cbca9d5585a516b5ff084fffb77daa02dfad32248759b5142be72b522c94b44c2258ff11bad736cdeb80037441867eb580e3ee248aa906f408e8c04c20dcfdbebdc388c4c322c8c33935b63343e8f6ea8205f8d101fe1e011de5e9bfb80653,2c662bc165cc54b29c3ed91c9457b56a556e22a86ce6926ad1596b62a1b56337,9f5109e8fe724f4e4cd7973c9e44c28f53a52867ce0833f10174e17dfac5b1816d28bb910dae1d1491fb2046cc09a9ee1df0509931eed0cdfe77ba8e99d4c75b00,70e2fb4936ff40fd56c8e5d892eb1c2431a13769282e1bea6b1b91a1213f9ecc4efbe93d70048699870f565b6835d4facb96bfdce777b31ac7ef55ea473654c500,ecb7b624761c7dcf92bd3fa99262aa004a95c63f0a09fe36578c45778a0402457533dfcbc32306527511b7b5f7a35f9e66b4d2831fd308ed5227f268a2d0376d00,39c5be0a067b9ddbafbc5baa3fde3c415be93bf3ab76cc46d747f5fedda5bb783b26456e20ed893611407cf6325254038778999bb2daa2d03cb76515ea12011200,08334f7a1471e6786b0028dd3ab16d6549d669d2e253df1a76b36dd0821d1d52692def462cec279e59587a909ad71458a12439d5b9d6fbeadc57227d53badd5700 +36560a4112c9bb2f228f2fa74d97f7ee9b51bc0197d280c603a51ab03738860a76ed0ddfbb88a7c06962f6e48d784404557d786c09cf01574883bf1970d2b6af17cd47f1b5180c4bcc0c93bcfa74f9362aea222f00e17abaa4108025fec16045a4fe0f7d09271310beaf0df8fc1195c160c9e9372b94c357f874482dff7231364f22e505d8cc533cf0bb2a0eb99fae8ce03896a7dd372651e1c1cdca4daff73c53c027e4009c040c4d03eadd1b2794af096cf288506dcc1bb3f03b44e4d438d6,aca9dcf4e2d2c224f78606b31f04c9f6d7a0bee8bd0952868c6caf443a3b2d71,8a35a637355103b43cea2baff35eb633313d06e74d56126e8e1f86bade347c8b1556a1aafc4843f0f21513e61e297844b150f94be3bdd54451c70c7c12aba82801,8bc082df5f496cd878b159da93830f366d4b71858d1883a00266574cd3be138c3c1d50025f867ea16e117d2de7095244350f56ebfde7e630c06c435a4e9f8eec00,682682c26d43f4f765122bb5e768f4d4d336121dec99e6b29eba66e52582a3732fae2b043df18721c51c79eb5ea0b7d7215b2542037d0239104bbb21f2ee485400,b02febbbf98a7c1246cb653e8aff83a2db2c5138e5f8060d2593e94a5fbc124a2ee30a9fc7fc48e855ae39778333368a32c7b93e2514cddc99af244de202b4ea00,2b82ed6683c33c8cac1a838e57e7884dfb592f5cd806d199a1731af8101a85ef127c37c11a50d3ce4c060deb1929ca0977717357fcdf43cd6a70ce36d69e4b3301 +2c371c5c3ac4a5da54414c10b3630f35b4ad54dd3559b57548fbac6e03b2c4fedab2798136a4e133261b6e5584ae8aff1d9d62a453f886b29c1a56875e862685a346a845baef16b138bb57c88b89fb31aebcf88931978dd11aaac572ea414075f0417a6adafada8fe9484915e785554cf857db579ddd580c5777517f8e522c76c6839e76e8153722f72e06fa1688f4a45a91985aa9408843955a41cced17bd64c84f205a7549a9abf9c6b831949df4bf49b717246834b9d7dfd829d96abba8fa,67c858f439d958ed9f904ac56109a9abd806761c76a959f9450988bc56cfbaca,ef14815e91a10b7140afcd824ca3b18f9a9da44bd5beb30111e228b2bb0410987f6ccf469551e0258af558990637fe4aead6ca632c3203cf785db0a43b371e5b00,2240b9664ac2208b06ecc0ab01fe0875830be7335e601986eabfff8d7af06a9c5608da466d5cf44ce56013d3150c662c3e800aa30a6ef217ba24dc1a80e031d301,a31343a29c437c9f99db5ad49bd8c6207ee8e0e60af39c878722fb77d7910a125700071f40cfd7ea73cc129fcc02c3dcec2added053c42158f102ff5b2811cf101,b4aa34452ca315464530605dd79a4160fe7e2f2b9542edf1b95a20c7cfb0315e36d70a2f980780606370c7af480e16e7ba307a3c6e22d0d5a269c9c410b5992200,fd9fd7b70023d8a0816f5101b360ddef68a13275b4eae653bcc474081d3e73fb1b29e3029f14585e4eca0bac0c6f63d3344ef0228c629b2683849314b65e004b00 +750bd08f48ea54e2e1047bc4da4539a324c7465dacfdb2c39b8c891a99e867c570a29326dbc704df115bb5ccbb7ba87227901d6873e748c0424c01954f7420631286e8ee2fc10d8cf61a52d20b91bf40aad8139d1b1dea54db2da8d7b14cf692647978be2b680e98e4e1f02af894c1a8a1f8aeb721ac614ff73b8022d0f961a01835a221d9241fe5f923f2a843470baf3123fadb3519dba39ab6727cc5eb0633fe2ee5b2b7fb979bb63bcf833ceb8178ac62a50c379eb089611bfd8df0127f5c,740f0c100a6cb4b6de016269a9db6e9a73db5cbc66e378497273de9b03c16983,335962fdf003e0639039d018eec30e6e502fdb354e78413cd123d0668a3ef6c576a3782db07101f472d25ca129ad5132835c767ac27de4b213cf1bf0adcbf50c00,1a63f1acb11a2f85fa17f6c9ad87bbca453e02b6b863bf9c6523c10b89f9b7f8335bd207024d75b1445308bf1641bd46cbd9e09a0496140ab3d8541c09ac0c1601,f224ca612562d4032de763b5e4890aae785da7ca242a3a89fce6027de6dcc5495b67944c46f6ae8b4185d95a38532dadc2d4a8c5052b09894295fb6e97cdda6801,60fa359a7ea5e3660eb930f75c0e037301be25114c7ff576a11b2d46208e69ec36c3fe8efdd8961012de2d566a2514def3000d31b76806beab33cd17d110d9a700,95f0eaba7c004eb95b94f584efff1fef90c3c10728f1ccad8c07b521dadb87c05d3df9e5f1b8f7814ba361c74ccc727e8f498b28f087add1176dbe25a1dc563c00 +02fe96eb4ba89c2d3743be2326ae232d4fe1ff17dc578197217efe73fbab33f357ffa32b4a583d94bc369659fe1430b01b9c1c077453c68c733f0496ac1d4a979f13c4271cde01db7d0ef4b0cded605fbd1c50bbaf52e859b7add041f05ceb564808ecae624879b166963817e2f317a84d098e28713069e307ac8ba963e520f11f8467320d8ab0d20d5c742e4f4e4fdc196740ab732aad4fd0133c61e6bee60fd78f9227ee9f9b629ebd9ff191440f87f88b7e1c7f2f3f85257beb718ecbeca95c,ecd8bb38f2f045067c0bb908d45e07623496a2dc791029129547d32a38b44cdc,57f5a5ef76baf1812c018d8107b1bb91aac8ef2ed039c5e3a2f63faac7926bb20e017112f96ea8131458384f5c4c0f0a7561e8465107fe6df035fa0a7184f4d400,4b6e35578f049e82782b3fb3529b4ed49da4814d8e2554115dda3388a9ef04907245f1b9a9e3ccec991fe34f893406f5cbb214df20ec00b8d5d38f9e3607722d00,d837c47db528d3f7494312e7a92a42fdb5b415262ba594e50efbcd07d7b8d7596cf95e0c81536258f402ada039832dbc9801ed18455c926c1ced5a7022639fd900,308305760ecab1220d1c4cb2eb052280a9f960348028a70ed7258b893c1d472d7589fca61439148ccfa32051adfba20f2c934953b9f7c292f5c17a615dab420201,63e492ebe8f3eac1b3d3020fd06bcd6cac8ae312c8d399f2fc7e412152cf75f960b9f1e61512c1c2d481de628b15e4be002957dd91a58ff3edff19b2cba4a5b801 +c3ca1d5376394466a5c1539e66f15394573db09f8df8013a9f94b4b3f9f278d2ee7b4b53fa26f52c418cbf18fbc581a97616e35ed29e8b22ed3486ba0fd697202e1812663c8a9536359c222c5a751f7d9b19ac344831f12a051e37a93aac549f3bc174c27527bad81550e73113005cb3774d2502e88cf64c01aaf41da98d96f07f564e696a3131405f267d39aaaa8c4ebc297888f055ee2516101eb6f6b0b932a08b121d74a54deccf0d69f7a4af74f968b00617c38cbbb04e56f86c179f1d4c3c,0b0ba3cd3fb40f8a6d564450c58b995db427aa5f97ef0a8fd7713a2aac267d1c,2a4e11209597ec0f1d6219b45211e008d998474f830b9e23c8808bc3abc295076aabe17cf7f7cdf3bc1ec5b5ed1b7de534bdfce2255f685bb9e20148c59864ce01,18ff54925519529276e9cc2524a345b98db318f36609b742d2a6f4306853868c1de41989d16a1c6df768839130fd44cf02c333cd639da751ebc3ba2078185d6c01,8bc2f6198135951ac442634aebd9558e142ba69e03dcc12a630f9ab70e7d6bb135e32380adca43ec325a44ce82e763eba876de96d716ae080003c2cfada556a600,f4a2667458ae54ae479e77c4903b84006dc8a0c72b19f8a31c6feea587f174e63caf1c66cb11a425407485fafb4d13336f8b84005178626595ad64831797e7f600,7be5732848b00e79c53551f365966e85424328fed3037ef5cfde8536bf02997f66529bd01b92b77596919d0783bf24557363a7f599ac55c03249a0c9b6a0884c00 +eca340444d66bc6e19d2bbfab2747b7c739be175e651873d138c6155af9a729bd4e9feda02feb321b20d7e9e16c2c1a8c0f5d0d4ceebe38ef9087c1d71e5e4e08b64c7bb908b11e12dfeaf9a49550314265e333fd637da4fde54c12784c93778718b58d3193e092bc40d076a5d340fe6883f86792e3f1c2a22229fa1594d1b0d8a5900baa637ebab6f3030d04c92b5bb94f3aff3afdc2d84f990a902a326abd9dbca6b34c87d0bce04b209303d2c3f08b5cd7032ec7321349cf61277d1a57bb5ec,35bd2698ca1e9b0c9488da2c241cb3771634c3d0d38ac1f4d4bac7bec4fd0bde,a9eda7a89035725a787c372aaeae2bb5684035e6b6592fd54812873f8eb6781b2540b425e69d19282a3d02b85b0bfaba54a30fed04e602223ae6fda665138d6101,679fbb59db9bd3a9b1996b8ea297aa584444bacf8be3010177bd8adab92053c837c92f308dd1d1482b58a46a1362f4f35ac297c76a618470054acb55580ee65400,6cf0ab5da9c8914b687a77cf22f3c92ae803fd8a1e39a15988c88f6587c10bb07ea73217632f6f9c370d0c7cb0ce1b14b7dba5b88546e8691e5bc980a9b4d1a501,5c04383d0cea9562e0657571bd74a74447fec54ea8363d47dfd3af2d3749cb8f2b4e4b78be801d52cb712db3926ffc7b589e9bbfc93e72637f375c0bdfafcfaf01,61257668f7cfd47e458d193713f496889f347228d4bd1d333efcf68fde233c0665f44d1d78c197e121de1c68446962104a578358b8540293e314980b6f67aaa101 +c765b52d2f85b0b2b9c08f0eef8ab7c44833e369620454cb1509323dfbc4d9d9be25e757ae1ed6660c26628a898c5231e4223d7fd9caaf95728565cde72ae8f348c0cb8daa951232f644f73d0a583e9583f12a12ed3805651def93b1a8bf7b35516ef536d03b41e654a8b585d48f67002b04602c5d9f662bec22f174ab5aa367c5945a1502efccc843292e5a1e44bd2409fdc6b3e8b7e84c4c874720ad7cd71e7eb9104eb8058d4faff60df2aa771b72d2401207c13864417b786686a9fa234303,3700be053e3a1cc29a9f1eb4e11601634a692ff3e0939e17230ffcb31ece0c11,b4b107595bd162078f439ea6b097a906656bd1ff5834af9d32f66f334a1085b02134be18b1974e6f8e9f08cd76e457b9c8817d847366f2bbeb8a6fe70b5b570501,e3d9d86c5e4e13421ccb75292076626d79302b8a5d0f21e9c050beba4212daf405297256f99a6900c34515974fb7070543c64bececb60c2d3bb3292962c7c61001,40b442b72dd0814a6d1f76d0b9bdf5fd1114f71c5b614d0127299bc0854893ee0be21d4da5ec67c90281032368a68e0b738e6473f001194f0285bf6f1c35bcf201,3931909eb1801a7f5f2f5275d7e75e2c0fe12ef34f3fc30708d4618f32abdee17de9157f3078092e0a8b8365e51c2c3383e4c34e6cbb8020af788013663bebc400,b659d8865f04a2a45175a3cf326b65cacaf3832c6d694bd90be29610ef125fa634f55d5593ca26e96c55179fb5da2a2459f93ddd0e766f474e9d453f5b5a666000 +360032f3c4b44b5d5f4933ec77d279ec422537cd08d83e4f37b845a151018fc01c58008fed066e7d8d79c5f167a4fdd9b354c29526bfc57873f915bff75dc54596d58c91ab15b7d48ed6de61815e53c00d4888f07030a883fd78727c2298fbc7bb46a936d591c18206a1beccf4cde772033fa5f89755b8d5a411e6bf87c6d8757969357ab38abbed969baddcb7aa543627e2a1c269dbf488e5d3ce6078c298622517405d4cb9531420891789fd0db4d342d2057737bb15bb69130c55b209e2e900,5309e286952da5409368da311f7c724600344b3931696fa38a797d7ddf1ec122,d61a4854970fc7705dc6c2537e3691a72dac738dce36baec082e8aa2fbc8ab811af87e555183a781b2fee9c07f1095f26efcdae2cf4cae4e4214f6b8476fb8ff01,16ab98600ec273d8be7e54383170df2b72eaa3ef141c2b035b9ed53161c7a0db601be67f0d5c166803fa952575a5f6783e80d9350b43124cf3b3acdd96ad7a9c01,f2047cadeb9d914dec8cacfddc80b60b39b6242f63c817c953daaa16f212cd7f6c5a04bc03817e46d12044b6448f359898ad32b46041b688fbb73eb70e9b8ed900,2f72553c9e9579e9507d2d8a242d7f746ee490be0593ddae106f21f7639141d63f32d0e8b2be5eb0b3e238dfd2bf17579952abb4eba1b75a3c0a30f658b7609701,4c2828a578a8e55cb64f6c5d251bc9064567b2a2dd1c7a48bbf97b46d5afa3b5147674db85c63f369b7198c082cfaa9f679f53a05766493f328053ba6a73299401 +b35571f692075fcf0b92a69e8418ddca559a95e2a9f65bd17bfcc96c619ca91dc50bc4de8135b1077df3b7010f7c14ca930f02593c54770a9423c84a2746a213d61ad392343c9e24a40ddd82d8213af9a4eac5cd9bfad5993d72b3159744270f1e22c8381cab58f4bbc4a037c0572b32f676d3249f8b9a0602c484dc24a4a4a48dcdba3ef8862dafe05ef6b3501d61860616e0a761b85e004ee5ff708307e88aea1c4874bd3e9ca782066170c80e741e67dcfad31c7b60c2a6e983e169cf8327fd,847131591e7adfb5d3d7ea9304ca75a34e189d3bf4ba9a968b4d02e5a67808c5,7d5113f9dd5683b8785537f829896c7c503292ba7aaf4538cc471468bee28d507f7cdaef0cb8bd0eb8b0d26fb561d2139b9394093d1a201f439965e05932610e00,7d24b0f0d7efdbb811c900d4354ce448de0c17cf615dcf8ee035d9e4783eb4986b35227fd813e4420e659d7577873013f994048ac567d1775431bd16f09e400300,a949a7e7ee737c3f8c3fb0fc0e17337a1bcb39504a528e680a13bd96806c2bd26a90563ca79d0a66b25d04628ed5df99bb02f07f19af1e85837e5c8d1b20f1cc00,aeee2d8775df3838586233b0f2b11f4965a704b13d915416f38803f196c0e0523ee97db26334004cb85861d301bb74e5d8f432ea553ac41eca2ab8ce6c6c43f200,6c70e68817385536a6027c959590c21af46a63a315ef9f7c276299643f5e4c795f0f611818784d55744ff06b5fafcd9019054073b6e8db8fd363cc1640410bbb00 +0bc4c1ed7e84f814f28e16c44c49d41c1d2627db55c4f54b6c08c39dda1202b59380847420afdefa81da17bc8a3eaab56b23c17e8988138e5392d3ed5d9ab90c73cd4e85c345e606dccef1caeee9bf615a4c3f4581b38ef4138a0d32f2d3190ac046c1d2866438ba729c8ec2ec9a8b36e83b0895a605ac5fd1eb92034715b6d7e5108a2be22bb0093dead1a6d1ffd29df5d114bbb01fdc6c6e375e50b40679f8cc2abcc03056374194507a43668507941eef9f4f4a1eab5ea86c3b9570bd9241d3,4fde8395134be6837da9146d8cc0b19cc51f7e4d3aa9d26db54154570f928dea,893f7d5c7936b9c46900a025c99726932d927f936480d672ae92709771a0f02b5ab1a8d025817962d3e6ff208edb815b5648921db92031cf9870abb246cbc13800,da251e89d4faea95a285683ddec8b2ffd49665345e25c0bfe39fab471e8f67882aee58472ee61b7c6f65fbee49528221f7336b7239104f11602925a501ba516600,9286a5cd75f5627f41deccd5f5484bebbfe27d7785b484f371d4216bba6a21355cb4b9c9c036caa17a435de76bcce1e3c27737bc163d4dfae9228ca8d1b0338701,b2ca7ae24b1efc44600fa6b39097b37a75fa4509cb0ab1adb761f87961a975766e4527dc16ed0ea16da7a827089ea281f5d3bec1ab47404f157534d1a829860701,3127614b81ad6a22a2817d3b97483a751ed39af57fddc9860e93cfa4a68d5f8c6ef083bafb446fd6aa7c37858643cf6612baa5d9dbfcfb15b622809bf0b551c100 +30b809e2436a37703d3b571a95f83cbf4f5dd0ed25ec50d6c05ddcfdae4cda9c86e825d0a7ac76fc1135d1a2705417239cad76f2e0e65b814e369e18082a3c7840d296ca39010724ba30129ffde7535d9a3f5561fedd58806c55f04740337191f0869e05aafb32a6f8ed2fd70f3100f848fe47b640ac31b7a1e37cc95ea48394fac92132e69d9c10001b403ad409a8612e63f86dca0e0c2a083778b45f64f15b84eec8ee9ad0520fc7d6f3309fae03c78d5287b9473ad195ed2d5e3accce8a7546,3c57369b275fb7c3948194298814b7e9a751a243ca38db20a655de4097f9ce0d,7d6b6887f18d9b9c6017bf72b42912424391c8b3b58fffb43e3348cd2f4504dd1091d82bed76bcb140ed2d0f9ae645c76ed471979cd0b96d0ae08d743a9e882900,7993658584a200ff7aad1c4de963b2e314a9101ea7c1b30ba5690b50270f4bcd260c1f2705bea23194dff7de5720e57cd3031bc3a8b1062bd1030a9f6bdd3e9300,dde600bc09034fb91d851dd7fae36870a91909fe9df3120a56aab8462468c7971180935969d2dabe93b4ae4078e182affb39cee878193c10060582dc6945f8ba01,2d0c4c48b465096987b1cdd4f55c870e0b8c4707c880914aa86606ae87ef5c963b10c930ffa3dbb3f1d58b1c0805c2deb724fc731604b6e2a8a760343e62090a01,15e019f677afc3d40710235ff14a54dcf054c0741a0ac5136a041ca7eacf2b8d77ad5c84357a5434de301fa0069a1b5912937adabeb72f07864fb757e5aeab0200 +aa2438280f62955edd6f3dad2f3276fd638ccffaf68159a51961a35bcf6e404f4407233a6229b7b34322fbd398e79805aecc63ee3e086170dea760b170511cb8368c9ce9c02f8882915274fa0b3d94d9b95c2975b636eb36fe5141b3a129ee830cd7dea93f3a3ab159f2ab05b3308a7a2a6621cb0639f41eb78bc8bb682dccf3c77dc5b78107004b6cbff2946475d42ffa54d1be4ba655b45c3f2621a91621194220f7820604f30db06ce941de3010b4689ee283b17b911440d1d03015283250aa,7acedc974725a7868877f9a1ebeb660f254660d6828fe488f4d28e31a23916e4,603ed75a56f3fefaf9c7af3dd3300634d7a75900fde266f44787e9c22e7f258405d08b8b2d7fb632d44c6d14a2399414595de03ef7e33d5b8a3600ee87e2b7b901,d3bae33d868aa0cd21eed90031f2d93cc9507b0fc04cc5a9cef211cd5b8c77e50f7b295adc1865a24cd99aa6dfcc441661d9f0197e0347ce4c3e2fb05b34e4d101,05d98029e17eade482082a151fb349efc05a2d8f36884d8cdc01259e1499f77c66f869520e70610b61d52160d0a2d050dac8173bc12d1501d9cf5f72b1406b2900,f4fa6b01772ad7bb10fcd8e417c2a57215ea76fa2d73c35aa3e7434e86d6e2fe7f9d35d05afe9eb1cabdb3f7abcbd50689148855ac1f50fd1133d55bdca5750701,80ac42c0af37a47e6d0cb92a0856199a8cec7dbaf14447b0e3b195831177c01d58d668c0cc1afea68151e7e55a6e2aacbce6b201e0c3a8ce4073739653fd2e4101 +9e6d30b904fcc8508fd5fae4486249a4a9da06d2dd481d7c11e1c47045ab29aa490d342e97b4dd70de8865ca438696c11559b1b50796b59c12f793ca6002b0e547f892d27bf2fb2c9511623e7616dc9c1f664887d9600399bfd79626e2249167ea13ed130f4805a007e616e6a653a2d403d17ee7b11522977661d6e8f3dd79e9507854f345e436b3ede6a72ccd73feb14344129ea1718decea46d961fcc3d38f7862ffaf8348c60b38b72e360c0856b3667081f98561ee2ed8d296428e8b42c5d8,83ca385c65c6baa7098bbea06f13b728e879f40a4e43dc21b8b6fba350091f1c,ca16208f7b8d39e3a306bdea5bdc87a6bf43812e4c84437b114ad71336d74e5771bcb9b34bd755e4c44c725c4291845a4ca51d35e923577192990e386a59ebaf00,150f9405d7f2def591e3cc4bdce559aa85fbe4512965875970991a567e14963734a4412119f5204c5b654c7e6c1fe94fc7fb31ed17b1401d478664f3712a102701,408eb64f321661bac2da471248d25c8eb9d8755baeaeca80e844d35e6b43f6a50d2d53c7ba041f21616c22f2e0a803c9087657e712f2651a242740f57183b27e00,d4ed4f0a2579ba727b1c843b537703d58d20a962328585ed7754a5ece03762f90e6be31ed032d67a96f3dbcd682a6cba5ba8d5362461d4d74720e4e0f779593601,b2f25db411ddcd794f9b8104efa0e98d4b224694cb75a21f000643553413c1da5e1328b26db9aad4e8988a255f363c9e697eba307b0b06c8df4ebb87258ff48401 +b4b0a145dca5e4b82bc8fdc833c120bf0414c38bd1ba449d54890eb7b2b6286077fb138f274ee02bf2c7cc7b36775c768f55e5d6e3dcee3db71cd9f53216a29568df122d7c6e477ab022aaed7a113c2261b12a2adad4c85a0dd7f9521c028e37b2ed0965934435ce505b6f6288aa11fd64a604018b833168f61ec8c35ce6af80a9c00f1ad06b1fe47bdbe06e65af425ce27ef3b03d3ec9cbc31fcf280c3274ce50d99b41ceec2d5e0a8d1f1a35bd327259b9d222df7d18c8f9e7b07c3268e641c975,47584b40a04e328bf96800c622b6fe85d5773669129f495fe0c068bc4690700a,581239b50988804c45ff5316eb66346ba6b03c09334d1938657819df7d31991c3cca9e7a731014b68c89034628f6f2211b35627f7e0e52989dead59103eb59b600,bfb3b1e420c0c9fc87f4d884e3f030b6a9731453c66abc82dd07f2c9f00c0a2b30e0fda1b735f2394631757674205f54dd611b0f2d3e63942cb75a433dfc0eaf00,16be49eb6c7619614073baf351d25d87a7fa1ea36b2f732c2b87ec40253a074510844c5e6d97785cdf2582660f7132f4c75f76e083367d5c4a7441217d4b3ba301,8b484a806e589ff677183e1d6d4bcb8a54f9c381ac3c498c7ee999271a8b56e9127a178db13822df1654540630cbe4cb019e5c3e99d0c73f20d7f87d32904b1301,7f754115fb43ceffb275dc82c71ac5164c666b876836cd244854c803c46a49490f9974684c5fd1f5a74dc637ff33d7490fc913807b8562ac4c62524c859c5e1e00 +9073af47e7548ec18a43e77f8c87f87543e4aa9a83729cd50e1d9d86d901fcad507b7804ccbe449b92973d3bab6976d8891fa71f66c10dc55a13e4df875e8ec2b07c1cef56faac04925e80a092d57e169a5af57fd335ebfea442166bdc47275f65fd26ded3c435619dae764baba302a0c94a1e05327a81e9a4d7f57dc5a47627d09114bb30b97cf79f5f46c01d7c5cb3177e07af1a2ba995b252b4c82142ad84bfa53b511c30fb47ce850f27a849ec2f035f5d3dd78c446200e226c382c6c4871760,ee870a6c2bd34247347878efa6fcd2fbc634bab84a48b34a97e6a56020092072,8e2cad6ac814bb34de7b7250eb5b39a4a12f375be39eaa0fb000476b2dd276bb25472a4bebf9796b91da5ff63daf9bd78480cc05f35cf65aaf894bff237ed12a00,9d2d70449e7198180c2056f585dc32e9f070e518ad371b50bce152a98471cb605ad1a87ad7197da0b3327f6a3dcf626d1fb7564ed04f0d8c3d472a7cfa831a5e00,e548a02b6777e4df67ca7a63e4bd901da52a701f0b260a0cb8da563c574f604b6184b3f58fe7a6b8a10faa7547234ef5cc31b70bef7b0947530591bfce79667a00,d90951906fde811bbd1b5944f941571ca97ed10675ffa2d394e2a84e4c06119f07779026a5b4456e4da72e3a11c7a92ac6a1f89100c81a70fee5416ecedc74bd00,6e8e248224b6233ab4d3b7d01bebdbbe69b09969ffef05a7bbfe529bcb921ac31a691d3953f5825d71038b82b8055c875dae073cfdabb5a09ab74fce32d4b48101 +165314ce112d7b64dbb2a56f909bb922a7b04d78fc701e8a0db7a8b2ddae02f46a84aa6cb944db720855eb93365e8bbc60b63dd7bcc2140cb3eb5845c34459987d3660d045637f10d45a8b3e15ac81d411a1311267df14c9953233b5ffb9193fb76abc9b6ff42b86548eece618629a8ef2cc36bd9ccea144f9234380c368d1d270902eb4da77b261c06de95a2361f24ab8a02c89e9b8dd8d850a7a060e531f6a26202558cb730fca72ad8bc8261b83d26c1a077ca5c98c7801fa6d181fdbd0d11341,125a32c20f8fc8687eab731e1909c2941a3111fbfab6e4e9c4406c0616b434f7,6484519673bd71e5eb212521748db386a86f9cf3a55afd4091163d9b8a65de866430e3c5e4bd60ba83659bbbd3a91bd77dc8484d5f1c9a65a797de21ba08c17e01,dcf6439401aaefd0b7fb0aab248004e840735394570c3771227e6eb87c02252841cde3dcde14f5a05ce69c1e993e3cdd36b2aef6b078bb030a33cd1f60808aba01,93e25e2bf60d043ca090696de7f978b93717bbb27fb6eea996fc010a1d1894af5b49d0408d9a29d64c172ca76f6888d1031f959c400cec7557a35c9f180b1ea100,775e8f4af2212e4c271074897325d2ab299c5cef2a65e11ffd31e57df2737f306aafeec3125161d8e7b6597ccaacfd8f9ede44c104f5f7504dd439ad9009606b00,d33dab49d98841228842316d173d67c39cf686976202fa537f21e59eb19147ed7213b48a4aab19ba3e276290c479420f1ba5eda4e51cb2c5d0af8c29f438bbf401 +f3bb11400e66a82cdc85a4c851c15fa331ec4ad902e3310839d7bec16a839764b11c3d137d040d89f11593186c3483be1eab440b2494c1112708db10fa9f10c7061e8f2a6d9b5177c88343261a42190bfb0f459258798a5a09bc27a5fd7a8f38cd04f8687e354b83c357236d5eec578822f9ee16aa930935b13416c94dcfe4f1f9a52aa597a8d0d8a5890dfb8d8bfeaf9d63f06b2390c396f3a41596c5aa8bc7601d1cf65210aee39f26027e61c1ded075abfc8934bc025bcd273d57b8ef76bdc9a9,31e9e909dc645bbe1583b06fe8189ed22f200c010e3beb268e4c581028de76df,f75764d34cf13dad84694f2a3668f26f3cce01caaf8298753a4c08695590c5c72fe7e7e80eefcd34d8a6236dbaa3a00ec506b817c8c196f4e692705e692bfd5001,736cbb9b45ef080b5b833971c00d8c7c7506b056a8c760cdd1f9fca05f896dee76b984352e18e50cfe674daea99ef818f71655d2a7544ba6ce5af4ac75fc2fb001,3a5a352c5c862304d60bb6d26a21c421e271a3f6e8d855df6da16c2ff3d9f67e105fbdd1a34f5e1aabf540e35e28f7ee0190c558b229520d915e2439ddcd96ec00,781ca27e232119826f4a6f577f4697337949df73c059a34b20345eb4c346303812227a5de54d6e8a80d85e33120031758ba2701d9b8b68d9e9d032cfc4aa6ee000,1b610c13f6a7acc5718c0a3134c66072b507f51ab3c4cb5078182db2ab5e73ec53729d3f47cecb58b6b74e4cfbe0dff9d541e7e20fed8b58c2662bc1c9b548a100 +c3258b75f829720cf70f1b6c3f6859e373b499d4c9a48cd568e0dd62a08a9d3b8cce12354c848514547e31a4a8400ee718d41e49bcacd6e235840b8168d218c308366190246acdd50b083472b3372f1a0b47d6177d426ae431cf451a82f9d494de0472df43dda2352a1856d1d5cc306518049a520cdc8df47809ccb087bbceb2a43bd526679490b8ab3141bf69569e47fc13485b386e4dcb961f6bc90fe63f5b0add67355fec088b148b7cd74f1bad655b124c9a6cb98ec040982593e36334feecfd,9f9bdf7e922a999bd7a94344a0ea270adfd564df4bfd3f250da921f84936282e,85ca8bc1a95b8471fa0b0d0a3f7d68d4ca4cb3bcc867d331de2f26f438549f6a4396be1d9c8448c9062ff15b0d608308a3c7c58d8316ec20087744fc821c54b100,69b593f6871f6b0b2346e6d9dfd22609a5bc2aca3a676af5976a17d72ca5493d733486ce687a62155e2d98fcef234ddfef2aff5b12b96d3ec2da0a915b2fe58000,8c08fb778e44af44f6d5e62cee7b70179b5031ac9e9750465c3d46638154859f615c71fbb09adae51c364affa6f6b7649af7a9de84d8f43162e7a6e0d94b29b501,10bacbf722b411654cec0c23f64515d13ef0e9a0b4bbb535637fac7f1faa59253ba76c90c0935c369cc0f0562b42e8480f6c6b28e98be1ca7fca98524b31ae5b01,22e8789fb6689334e0ff221f0e03488d9d2d121efc86ca0d1aa43af2b1cc80b04f8c5d53d52c654d3a3d5a437d39bc80d4f7ffc58c71e27589440338e06be68801 +37f9cfdfd989353e5bc6625c4238740eaf419e938f8cf088210b2bc5a1af8e791641e4c1645354366b798992991509772dbacf4927ac4feeea8ebcb754508c955bac7f4c21625e336160538af71bf6f151e9cbf76345382cb9b8d7ce9562069fb68f07e746e9ec9de3cf6e5fc0f5507a428513c5fc267e02d257908ce8ee72d754df8ceb168c09059bebb2431c32d9f999009e46d8bc4d3c62024335d8290469e1974aa24dfcebb263909624eed83436b5568afacd22a6822435bf02f67b49d13cab,e099322081cbdae95146fb3dce3d11fb49075aa6f53f6994d85b97b69c19c0bc,672d4ec6b4be34f9bce45d96779f2b66c53c4bc92286b85f708409714daca6794881d9e83630599dd493b7cc9e9f96d386a1bf4d7370ac50c681b955977a68e900,5a7af92ddf05784b50484057b47706d616e7bbcf43496fd87ef4a867516230101d3f677294495683fe323922cd3a036a3fd1aa7972a565578330fb01f737977901,6e64c2c13657de4f0268fa5f9d8fdaad91a6716a2013c2491a81b18b7be8231261f3fdb46da0553cd53545f5121861f8dc372543aa7e3aeecbd7b4bf86890c6501,5196e7d5f20a8fb66f5f3399620340d7e05fb8da8b27acad9f5786c5b170d9bf482451d510e7418023392a1521dc5406cefe6e19629b279e82a0ec609740c55900,8484d7d748de78986aedd53c5ef9d2b88500b1b9bf75e8f488835ff7618fbaad4c13ea1ac7d0c88194727305416fc470a1585aa734d15e71272adb9b209a3ab300 +5ff83964d26bc33f59ce7a8d1aca22a950d75f3963e5bd0e732012bced5fa4eae31365cd7a3e36d41ec71b08b9a24cebe49edee8d94469f849abc8515c0d5e3a66db9665cca390412a95b5ae77606f408cc348f1b1494f7172ea44658efe06dddff826542e66db19c27a63bbbe7db82974fbf36849c4c285bfbf698060aa1d11b1863f780e7323510e94c3bc7e73256ee4670d3dc09915bb30118dc6aadfdfa5bf199122704afa276c1f98ffb203d3c21f6dabdd6e92666d3a48a6d49192f926ac81,f815191d36f66be1e72f51ed047d4c7c8eaea06e700019e3bba1da4f71f85c1c,701474df3ce053011677694a2d7aab38d180bd8d93f6373dff936579330fe4210aaac6042479b677e954361a5d32fe10be435c00d955520ade82f0bb0755152f00,a1561acc40f737529677b8c85ef4c7c6bac784fbbaed854a3926ef4cd5f568774ca63d75868b4d80f7ebfedaab3aef47469c0ef17d1eff4627f8be3e5131adf400,35e01ab3b4949d43a392ac6755e3d16b01f714e6501958b45c90b0ba34f432fa05ec644434a911794e0d40a4368fbc83bcea48e170f52c190ac8b831f2e45d0d01,e6e9863f6f7a7bd21b5c61d84c42e50203cb8faa3d45031ec0c8c7639335494d10b50c9fe35085b0cd86efd5002eb93b817afaea20bab073eeacb327cbccf7af01,aa75dab68a87ab0c99b6ef354e431111201a2baf02ccb30dac8de4820137d9c77fef1a4b2ce49bbc15ba85a4b32870af7a45061094a9c9830db74441ac5545b001 +67b367a796ae1321352babf228b79a38a4f98d9d52984ffc683da3d197a80f11d71d7bb183948384109cea79b90676a7be76ef61190e170428bab06e1bad524170c9c842a39979615153d1a180aa77b0b2ebf20da323887f5a8e4aa60686c46bf28a540fc976da13557adeb7a7a20d80cfe4b964d4659132c0c601517480c27975b7176a6077a14cfc435e1e5764ce3d484b8dea614b7e2af5bead0e3c6ca84b029e2e35ebd1a537f576253572d2cffde4f61c9088273d5051e9f7c3557f456848a9,a5ed3189fb590efcecb2cc109ae0ad1a590957a7756761e6e7d5a5aaaf063e68,642c3f6a458ff23e41d986fe45117874833b90718c5a026de4a7fa28be3bfaaa4a15f5659a85c75ce51f72ea79d5fae92c31622d7fe0615665f62cb8ff50748301,04b6841e18039c63bf707fac05a8fed0782f25a82e19366127d86e4267d96adc5c112ea826de5f1cf9823624b1238d3a7ef2b44389c365d016878e6bdc9e89ef01,36f6ea82847d3daa641c5b98179fcb487cc430942714e1029a1d9390f64e97693609164bf27fcc69562bca149e8add75a36d5a931f1775b4a669b7b8df150e0401,9dac31a0a6c72ebe4f4a485a82f17deaec79d41cd69d1ddd97af5aa9e6b0bc9475ffe699ee4984fb4fd00d2cc432f44684052d47f293f343533b851cbbec3bdc01,709a9137ae2d7ee4028904b94c2933ce89052fff141fc2a14ef012bdc119320c3c5d66187561369ba889ee0e43f570ff2a03a6b5d27ab40fd6ecb3ca37ca484600 +24741db0de9d7c0e62f1242dc78af7ab4422b1aa04ab315574e2717b6498eabffa23a5756ba715774746383d3cc4d2d44554ae346bdcd0fd1000fb8e399bbc9e45a360cd27aeb449f5fd2cbac94a124b4f0029b764207dc5a5a30845d9243bba9b04b0d2eb484e719cc538fb1dc4c85c21c0d2558d33365660346ed63eabc07cbf880cad9955f3c9d3493723fde51cab3cb122758482384006e967ea97440a68623d21f375f680ee534d02185cc822a25417851a66cec381c7c6fac4680a795900b9,f56e3651619875be621c03d1bc2d8bd72efc7a84d3da6d71d44c020607a6114a,16844b4c3281a722f0b9d23c0c483a478b052795fea9201b782c43d986a489530f9fbc1931310423524533b3c00aedd5b95d5e76b79cd0c0d3705781702ca44801,715b26a783789e016586fae528eed028ddf3331a8d2066d68aa667d9f637ac533ea8c3089c1cc2687eb0fc5153cd0ee6d2d84de2021fc0f016da7b4745df915e01,fa48bd45529ad6621257d7b1693518762060a5abeb58bfa063ff1c640592776c645f387c12ef583baf43c7c65f085e3f9a7c5de22fe7550bddbb0ccd0cce884500,929b83f3ba007f8d8d6275ccec0ab52b3a75afb0b503b153cf22491e0834ddc01499ec4cb511e474367415bf0b1c852bf2ce903d33a02a71d2668cd3bbe6522e01,a92730b67f769330874afc0f9ada387c007f408340946c430a8c2e57747d1e211573eef16bdfed1686973c80339c1e8ae5e7ce1544a068f0d244ba0febfca8dc01 +a20e7f5cc4b8a6f2b9321c373e829e0ecd9648a3c23e28799391f315ccdbd45fe71f030aac48f55c5be07f1688fa5bde9e134a289781a05d77a741cc33aec427a48d53091c9b63110ea21980f228254c9c1791027afc78eb48125294f81ae94ffaeaad00aab0bb32c164f1da30ab59defa216806df300361af23c139eccb9a1994f8f284b8b05877d058da15e1925399c9c2662051d39f676bfa8e6b2f1529064984f87fdd0319d983b597e21e666d90610a6cd2ca465d3ae783e13381bfe97bbc15,848a1d72a5217a6f6e882721e1ea2beda7a1e75e16f73935f385e9aaf41140db,af21fd4ebdf790b0ae12ba302fefc05bd4b7964dbcdfb83d097b62c549c53caa1c1ba79faeec320b0a9b52c7de29f43f3a7ffeb4ae6772a48ae9b5f428f63bbb00,e7cb8cdbffcfd25342e39f85f88686d3e617c60774869a2af5474874910b74de55b4791e9a2616fe1e61981da72311c85ad2ccc4c893e9ff12576ad71b96d94a01,067c049cd7f4717704dd0098aa1dec51c2fc073e195c046b293bfe2caab1e08b0b3074f60061563fe28c78fa010b7b310e96b1ce29d73234e262d49a2d7dd9a700,c5c1ef21714b00f71f201f04db2b7e28e6c0c3be2d1b0b5b8de58e9bf5a5cb405be11cd5524dffc4fb195d49c58a01d414f2fd4cfd403265b7af7b585d04a12901,658a13387eeedb3caff69ef0686949200b0da06392e253beb04460bba3c4285b36dbd6e65f30a602ef784e52870a7e3999f388721d88cc57385a282d9090c4cf00 +9ea7a0f7c300ac15fb51c7fe211003f652afa0ebde7091d176526a1e0547c921d410cc8dc223baa7f8d03fc5669eca8c2a644db31ca869c9b18887428e1eb6a925c83787470071dc6bcf3aac734d2083196dc68329c535e84c1d2b9a734f67b69a45508995c7dba07e1c54d3b3284af41d6c7956761d7c8788c402ba7d10130728f5fd295ad396b0e75fa78dab87e5707222585e7be51b01d27ce7c34784046019999cc4dc4ae10f0079a9c95ffc849540e6ea54f6d7ba069c6d95e705ab525202d73a,75c9691c4af8bc415e0280cdcb66e7fccaa02033d4cabaa17c631f44a1f3e15c,1a7feb8a3ee56879189158369b6ff55c8cd6133acf75ac178cd5c0c04f45d2535c998c3fa963b703ca17afd63dfc0f36f06986010c858c64f2c392f3eb2c8bf701,6e3e4647eee543521764578f18fd8b046868ec40f5ce8a8fcc1c51d4513da13f3eab15164165bd012d872710d32cfe94cfd4bffce1eeb584c7a9f5dc8bfe6d5b00,9c07dcb68eac4d27fb3b06c2844ecb95656d3363cfdffd166466a1921bdf4acf3d1c73cf68e349f720920a268973ea91f61b36c9519d53a775b5c6029b9083d701,b4db8d04484d37ac8a76dbd05de5b6c0b409d1248ed749ff995f91e11e3cd2a503b8d1ac893455d2efa3f6bc056aa177ab04305627ee7e9dbc6c6000a18dcb0101,eb82230dda6df633c870b00b3484c8515d9566ab44f563e6a2b0443a2573a0500648a79fb1cd724840edc194273c586c000a76370ae8fddda7cff2b6b79222ed01 +d0ff6822b8f695e2439ebc8224e420b1deebeec182f533987f1b92ea14790aff0b8520429f773c2b799ec2bd8aefe19a375c0b2b91ef6bf252be142555a39df28204c383915096cd3c9665bad0c876a7e23c3e34bf452169b4766d6831b9c4c2817efd750c4c3d859b3023152e954e8df96b09423dfb048614031bf74982ff5dfd2e2b1a392b20e522cf1c43b468360a27a598858111407da2aa801dd12ac0079a557f38837e167e4e48207b425f2730c75896d8fd6b0b5226cbd73882473d8728c67a,40716edda77d3a8872655d888c6c1c786451ea748f2232aeb9c2c8dc86dc152a,3f5f708f33ef2f9c1706016efb901682911237bdb2b12510b0955ff56291441512ce0543af4fc795ee2c0c00d25769371961eb1e4409308cb1d95b25610921a700,86fbab550f79268c94e3514bd5d9a3c83542eaf11e5c5c030c0341267977b9b630ded85b4935e786441314321c6ff11b67aee761333bfa9166c4c37fe3f71a2200,9e866807c08efdd4408149614b8fb6b2d64236656a7c4ce7e660e22291f94d6526853917daff84743d8aeb0882716cc71c4322d8a4bf71dbdfaeb1472065073a01,f4b61034e64a7a79199bd2a855ceca9d22fadbdc698858440626b36d68e8a67863f8825f9815b5ba66ceeeb54269a0c4b80e8bb94cd221440370d3222137db1900,93d68ba2b740dc7c6e8e2ea7692172be8351ed6cda1abf7f308192684ad79e4673300f1e38cab62ad72abfb47be6d81b6872fd8f4aee60a9cec26db014fbb3d400 +41534e80019984f9fafecfa7e64f8644e71030a5aa49f63661a73622504318d0719f097603985cf5bc997d5a2ac544f7ea0cf16f78908729bc6c062781ed762bd5fcfb5e961438d7419d5a87bee8a902aaf3832aaab8c48dadf6ddb0e71017fd6c6a688d41bfd56c3c2bf51621559a20bee1fb033cee23efe993d3cdac003a9e1306049437f060bf447e8101492f0362713e5cdc32a822601f9e8e4407ace23ef098aa15a0c5d601be94421f6591ffcfcc556a5a13b09ef77754116f256b819ca21af2,e9f99dd95ddc733ebfbbff0752ac62c382d92a68946222c7a2a4a6b8a7021fee,305e4605110f019238eabde2ffe468306168f9742428a741e0ec5e003dea354e2963e7c06b26b6c9679fe0fd1dab3878ef36815018287ec892fe0b430c9ff5fb01,ac5f65c260133b3fc252ded7826af3984abde9f10397725271b7f7cb4b71200d5c5a2d7358066bdce7653a605ad1ad04e4d383d1e422048b970ce159314b7c4800,b17e27bd8fdca03e3efbb430753d91329c1569d29cb47c67092db43117a2bdf52a823df6e16da47790c6eed8a22d23f78af2cb25520ec30dc70d434ad13f664200,49ab640f44879ea50e666f74dc9c010b2918c8a296367bc25d68266ababc48b33ae27f5135c7173f69c970707b03f5bbdc25b032671c221f4c04515c260dd7c401,4ce1897c5660b0dcc37b83ce5bd32c0b8f06af2e554a4aff53a235b6c9731c9c640fd620c212d82b3bbcd239a25541d289e29a1392832cdb3263ff3868abdf2300 +8186898f0291772fa36d91fe3d7c9cf433d0fd92b5ccc1af0e0fffea78aec1373c3d24c6a60bbc56667a66077a7b7d4e8f7bc7dc3d370cc2580f66c32b8059816301d352ddab8fb185d435dd52d2bc44af07645f4a9b8b055ac61e61c29474a35a0e53c6e7c1ae5b780cf19fc74771801819a341fa65cb1d2bbf9726d673c26ce0af128195c3fcc790da58adace64dbcae7cc8c80b4234f756c897b3cf06197a6e4a71b50af6520a6030d1290e08d7926d5153569edc3823af4a6f0cdecbed8f301110,5d5aa44a0d3ed73a4c3c33aeaf805348f7948ae04c13fbf404da8e8a58f3d6aa,76b534b4a34371f7cdbbeeaf09c6d2e786509c17fcbd8a3e83481fae3edd57fe6c2dd493dc1c1b24286f0813c4359736fd13a3fbfada74513117b3f7969ed6eb00,325a3a618507d1a6014a6140e05070694e22a50563648bb518e3369816f45162602a00d5bea7f3e5bff8582394cd002eb9a2ddb5795eab935921129a8be1242201,4603fedd2940c8083fda4edbe5f34c2451ab3f4953a60c5993e7e4f474acb27828f12c982dd97eab837f1b44d0bedc28dc3b37cfb51accb17d253e88727ff07d01,95ed8b6e20773e2d937723e60595a9ceab40b039319721e6191446cfbdd70c073153cc8ac2add660f08cebfe6240e31ea10bd0e3adfecb46b81c2295fd2d7a1800,b0bb3e2ac7c3032909a86efb9a6459cf7a18a9a1746509872963b330a765cbd141e741656f6f6a33b0871984697112d51eed5b71b125939603bc572aaf6b214001 +da40a8757d1c8f843d7cf8ec850ebb44074ab894ac0a73a4831b32ab4b1ad4aac132e397b2158b8ace0d407a5875734181c2ae1514b48d5a3dbbd259b8fe0cfa2a8b3e55d160be9770622eb99a789f080c23e789a2f5b9e546bead8b0b4ec5f79fa4f44216b0b8563fc9c9737fac9bf6e4d72380abbace12b71f686aaab46b0f4b0c32867750b352d7c7aa953830a3bdfbdf0e2987881869466ca84d04013c2877cb335580bbcc4e1657266a8132f0f326dfa6f657dd985014eed1909f776bdbff4492,67ae27e6ffdf35da0c994f1bf0aa428e59370f8ff057055863b28e1ac3a074bb,ffc8651499f7fe41963fc722cc66397e934c63fa6c9d37e4b8e4817d956704614fbc9de97fdbdaeba32218bf55e065c9cf6594dd4f7287ac1ee11fc79cd8ff6101,bd5c08dd66dde1549e9c6aa16ec1b6736c7a26f21ad0963ccd9a314dc3bf4b0d403c059362882dbde6433edae8266c1445fa2bd914765616efa9c495315cd3d300,dc0e5cbf4e3d6e75cddf81e9f9745974aadc3d4ecc8a7e53a87ddbbf3d2b12f514e61db6eae4d8361099e5733d979e6f5d75af81123ba6544eadd163d452916900,91d38119e69ed4833553c7a30113116a77619231494f52e1ccef41c4f5c28eaf332cb0699afd0da61a7e8acfa793c508ce5e6f68c1426bfd8989f5e4cf2e140900,30e399943ce5ebb075faed5cc955175424e0d32d9b581bc9f537354a4d29378c3eada88e374825a0d7ef08effa6635e0f7abbf17953c5900e83dfb14a870cd5300 +56ad8ed343ac4d7ac145c9fe80b23128cb15bff2f210a7e2b93e988bad00294242f17e31af50cf934e01bc476976d69ccb9a3afa88e124cbb8b239339d243dcf08b7f00593a7a8d0b20a16c0be76b101962a256ae79c38d442047c30c75d511abb3ab937e38d8ae10e26fc2334ad3d8f0b4d7ed465ee712a0e0843039377adbe54e7a1857aab164e3146f2ec88fdb168a45d51938f3f4859ada1a2b4528b758d10562e45c3dda9a3a2fee670615984bb0beffe243de8d4783e5ceb11193519a080b7ce,4b9a57d1a111383cbca602345ba9a7fc505bbe85790147453f5e3d2ad22ebf51,0b6a4e810302fded4d3007e472d635792538fd78e99ab98adfdf173f2a6ff3261696f06522f23a8a9e0ef0bac398206e1aff1fcd02515b27e9ac7816369afacd00,3a9dc2baa2fcf10bb84575d2b23391200f3d132ed043f8f0e0696dbcbe5c3ed53bd151e48aa354912e8d961dee1a16b099afa9c46258cfd1fea90e7bb5a0412101,fd47a82411ae0a015e5cf3860a9540ae93d72e64db1ad19ec2d661068b874f0f3e96c540e8a3339ab30bfd57e26ad7d105f34ae472b7b9bcedb04e43fb7a3c1600,5ad44bf24855378e2e3ec785e4e255da4886e0f9bd8a158735d2fa48cf1ce4460a9b3f67df90fe063bc8c29636474e3011cb40c618049ffc4950dbbf32eca40700,d0d9e388fc4da99a03e6c646b9847ae2cea9b2031c52bcb24e7e1a3a77dee7785e38a6b3cc3c5bcc6b1fcda368b8a0248a3dacca875858967b7ba6c5a2945caf00 +58f01b28e067d6d99780042075ad3a4b092b5f94e1cc3a27ec0f5508acb019963b05be7d9d0323f31bbe964a7cc20a21b189b86dbcbeed1941790962dc7b6fc405ae4a17a5000a46c2d1acc4cfea512cfad44a12ea9ecced1b678f426838b13eaeab1373fec0c4c8055d97b3962b259392addb09a60cd2d4216bf869c945be78356f827f9f0aa13a112711b299d9efe7017c89564d2e4739bc4a692ec409acd71b36979f50392a64b035dd00964312ca0d31c5b9d1b80239bb02afc52d345184e6673b,f6b1336924c2d2004ce50a98c7ed42be5b012be9ea5834a7e55885b2dcb550ec,862d9e76aa6af9bc7be46879c92e96698426f4a3ea9b2e0a13b98db138a7fa1247dcf36443f565fd518b3abb1b8071784cfd5845ada3ca2b703d4a4b1f1da00f00,3ae724426faa28560cea81fa38aee74811a005f784e4cc61f86e9b5adb1b55ae41a55b297d19e811b284fbf6b3909bf7898f4eec3d66d157b4c933d23148514200,f3e0c3c6e2f5e4180c6b7ab7a3b70ebbdf8c137d98f46399d7ec222d3026936a58d8ff0b0635c63fb53b44bcf4403781f90c300ae735eb4816e5c4f73851e62801,4abb95ddb287e8dd34dd21e7323de58c90ad5398e642a55da46a962013ca91c07b197dca5942da49edbe681e53f8e02cc1edcc898a7e79fe19e8e536e094354f01,7f240f19131426071138060f404f99ff60355e4a57ab83b254f942b2a87f3da00bdc63708377152a200019da1391965d733c435db49e233b5c7fe33d1f9af7eb01 +26e2df44da6bea536328131fec6ab3a260d782dd235f646a95c18a94f1379f4c73a5cda7356b0fbf7a72a01cbf26f62878949e1cb80ce004477e143b54d407312e2c944b4e0063e70fbeabc45807aff541bdd43ad4396bce5723a4af2315a95e512eb448980bd7f69f41d72d490b57717b75bd52c3ed96311d410e761028ac40407c581d4c506904103b4e5121143fc38114d12eb1bf35765c04ac3dcbbd0b20942da521b7340f01ea347a2488f84aa39c9c1926d73a4de2c37171b65b29dbe91c7f4f,8e041b6a291e15f78f99053f4fbc2e4a8c903636e2907791bbf83621764b7517,9e33dfffbaeeb7ce8628ea4a39ae426347e9fe0cd7627e05ab99ef4a067e90eb4679624ef206f41341d9c8a3dd0ab3ea8c0b01a9473983ecb38b8ad84a865b0c00,05b08d1f8a271086eb67a816f2648efbf6e0f3906b726443b524dce9737ecda7709f5a03c1b4b7416cf2ef77edfa94373af1aaca43168f3b67d850ca3111415100,14fde77278eb327ae50e9ffa48531528bd0bc3df99594d44ba7287eeda10b2a3517b364e9947f72a6fd85ae0396b49887ba5995b36546e1e6277a53e7ab9de2a01,41d4386ac1aa9336676900ac0d4e2fbec3e782f752685f6f773feefea1f38dbc0a819fd4fa5824e1f9e7c9ae3691a25dd632d1126048bc89cb3a2281b36a073801,e2bbe8f4b2031b8bc8190de2fb4bdffd8365c053669a702238e63c02ed814c70022476bcf14434f1ef69ffb3ab07d1df8709e5fd9504d25a28eae00b1eacc55101 +f8e412bbc63269f4ef80debfbc462629ac7a9d301f649263a6eac0b43c3f596a9450757ad449edb9746df2d237f313682375bc7a17ce48a3dd530adc67d5353063a9f6bf3342235536e729b035f45720073fa5ecc9348d87d7f1dd6b27ef2a6a91ab11e3ce901d86a5d660bfafecba96016458724e2b21b3785d28070976a9b2c267c022a04d37d7963ce635becd06ab3d96f325d80382552d2b906d5da4a8a4371b784e44f0ce72b7b6becf339f18fceb6b5b7c04b7a6200f28550b574aae230f0d83,51b54b22a622f516a594af05ab99fac6459c634c02bc4db7eced788f6bba8898,373dd8552aff9a7eb9b391dd01bb82e28de6890856de1c6f999960c4a6cc224839b7a30d2fb90b7a1dee6838bd88c3a8e083f034a2c8b281c3731f1c0af1f16100,a335f425a2fc585943b2dc78de0d89742a4ff09996bf57b9e36434b20c0e23cc50bd61f516c6fa46c5c6afbd3e58d89d82bf4fea127c17c4b1774bec2074515001,1986b6009d884358001c83996b5f748c967837bd670c282c01a31131b64efb672e1fb55639e08e5ab7284a0254a98022279083ff0535cc3a4d7405995661c2b300,7c2b47ab0098bfba2b3b7515ad46b0ff7dccf486bd92f69128f9e97b92570e91770ca7d9b8863c25dc65b1607747e220bff7efe557197599c6b5471844fc3c0c00,313a0d84816c650e9059c2781f0d51de4982b12b59332c56145618d1b8429f343127d673daaf1cd9554c6847d80ce3fa160b19e4dbbfa56b3cc09bcf7ac7590f00 +5e3c1902cd98fe3f44e5d45461ad539dc6881e9615d88d91d409f162cafce089146c2aa81ce06ddb7029f68a084ca9c56089e5f602d8fb1a17289a54c6e51957c40cd7bc8c9560549d924e84ac4b939201a6c8fcb20aeb5bd38d06600e395732d731a78f920f346a5e205d8e69d2037ccf8d590abddfa63d92f5970440a7d7931f79731fadae8931358675e7651bfbab3f16a2b135a27d519f3d5b388d87c6aef5354e6a6254f3f76b3fea81871f5d0d76d65d94acaa8a920f9dea3834f81a19a4ecdb,c4786c2842b454ba7b5a023dbaf3eae878b7a1b86aa1df04902d7cf2d19e4e62,e6736081f6da51b947b5c80682e65488553b9e4c9d4e54fe8631ce5804b0da621ff24ee2e08b99bc5a676c5d2407d7b4746ef17ac0e267b1b8fd71a0f5ae85a601,9991df0f0bdb70dd0ee52180d79f386cc1040fda23767220785f527911c0016b49ce28e937e5bbf5711dfbb7406b8518517b95a79ffb93361a53f4171dc453a801,0be9e3074679fb33ff8768fc39515597d237a74a6dfc7f0ae05f68778fb1c2f70cd3126e48c42ac1baf5ee996c648279a19543d58056bad0eae9ab2dae31b8bc00,93bff489e7f17a77b9ff2d2610371abbbd1350b278d755f70be3fd857e10b79d7a01777bea983946404da0f15be3cb4292054745568cd62626c0819ca6fa529200,6a969a814d6b86320ec62aca0da083f1fb8f55292e2c88482e1b3a399f1acafb1b5a26680e07296e7b5ec42d58f52527ab5af0ecfbf8a60580f8d9f7bcd9625b00 +ebd43abf849891261d3e34e0aa18853f3bb05ea5cbd085f80dd342d9f6a9c6510ecd78e5364a8f93d9dc27b667329c42fed38c6f158854c96fe7912fea336cf3f56a3c6d68a664a44cde248d07420eaef6167fc2b90a083c755b7758bd701b2a1127d26ad8ddec0bccfc5589c8c78493c7bac045aa530f93189dde47d93044d5ca1871a4066549bec9da4e88c66d77981edb1afeff4ec92e56214b44259148034ddd754fb4b239661c8e243f4a9b491522d3c8e31c5b0e6ae0437888afb94b2aa5acda88,e6c405f54dcbf86a529ab9066bfc9d35e95cc8219536dd5f3861fdf8217a44e2,91cd5774ea3b6d731eb43e1f1113501e22005eb6a5b6124243eced87d1f175a46c0d387c2950e25ffac6752081feafd2d188bd8fe9c7e916fb81f9dd96ddf9b901,e3e73cc77042bf2aad5cfc1d62a7503e6bc4d8a234ec97ea820ca2c2aae83f9b5f542436421e7c1aaf2b15f4f991be70966b9c2cedc01952c84e7629440dd49501,68f4531c1af82ff671926dca889b069ecdcb73eeaf61c4a333e72f7e8a2cc2e64fe743aafba68983a8599c90ade40900de363d218c6c946090ba98e5f7b6007801,19c8e88dd71ceb9c60724d9792816dc7438e2d0cddb80a1d03302b6b4b42951965ffac18f2e0a5c0185865efaf8c7382040b999a9e5c66a744ea609fbf92092a00,8e384b8954f59aaa5ce7ec993f0a207c7e97095ba33561e13ab7e2348bc0937a7b238aa679bfd3738df35a6f5bdb3e56821127e6aa08c9cae8bd51396b68eb4f01 +f312f8678e21a565289ed54551f27f7b11ee805c76ce6042f3c4d5297c9d0446a50159678dac308f6cfab8e74bc0d8c59fcb46e0952f1a5a42582fd9f159a7ea5de1f47c63043a1238645cee599e73dc05504c1337f16ca8b2015d85def64041e272040b06f7e894b9c533bc3420fc7c6afefbebe6242aa9f6fcee7512078842b4f8ea6f64feaa112826039062251c65997590983f91545119c76e4aa1b2a664f3886fe94c22452b973d38ed865083fb7429c9169f87ebc7f5c22a4409e28f6bdf33a7c2,ee3a824c3bfaae9d5ec2541575d8f3978f393efef7a133d173b02ebf91452f56,3880a8cc3e1cb100147782c8f17fdfc5af028cdae27982a64731cb7119093de019b4aca6876f6a3e4673037c3b8d4b14f36d17aabfd2d53aaeaf0e7c329d4ef501,91702b3a5f679424468d772796c89d92f3d9acae984b71d45fb334e18f7d41f2455df944d27c5437e511706940c106ff1ea6e91f6fc39dc0a3ada76c44a2f29c00,cb3fee764e9be1b8efad86bced30193fac258b398a0891fab5ea40aef08ddceb2e4ff02f22e0f1a9dc6d351a5429d00160815a634665c2f00b7f8c77c19f62a801,adf55e2115d2d5f015a476803c4aa8ba341b5b5c654a1e33bd02eb69eb4cd392461a46f3d978368352b9fbf0d1435e97ef7e3ec8145ed1d9f2042b95ee66bb4c00,90d3128d87261a9e9440a23329a020d53f5e4f43afd7cb0c7626cb713dddbb60198c6e00c548eee318e274d3cc547df9886c5756b94a54a1cbf7bbfcb73d6e8601 +7c3aba14df5dd258789a4fc8548c0ddc8d16fbe77e79cfe829d3a435a9421a278c8a4a7a1d7adc277370818946bb88bfd16f5519861c964a6422c9a32ba14769f8c5e5b45a0cf6ce0a3bce1f47e1b65777587d00700f47e1c72fecc5995f54e7ce523b00ef34823bcf05035d24ebcdb4c1056650913714b187f295c893b03a384f9f3ae0c7478198d39e71046309bac36d82a9125771b0a7ada4a9ece94057f83ae8878d6e22de4419cb75ac2aaadb16bc0e7488c4c46cbba4d7e91010ca260037a716f5,b1bdc7fb85413282d099971888a1fb1a95b5b6cf54deac326a72906f0533db78,3f59d68c06008d0be9719ebfffa6b787f56aaca6cf81da89c5a67332b00c8fee426b3de0ff8d3593f43cfa0e74879d13fbd3f0bf150d22fc227cd4b50f8043e201,2be4106560d49437bc4f3652ca3bf15eda3e811e6d1b3a52a9c4fb9f090ae16354f034e43810058eaec45227a050ccfac7e10c5ab110009eeb824a58e0a3033200,f1bb7028d0625a03e38858937f23cee02adb8ea56e0a366e9fe5c6a10411662b2f2888ad4462c8102172f739c1ea318d208a28aa22ac71f140b65e05a036f7f101,ab6611c65bbc1c24c5bdc0af5e69b689a70cc7e37007d39871e91442a74960e3250ffc491b7339db98e3b93e0961ac047d455c752a35963f79ec7b6ef75399de00,302411cb3367fd52611d967ed233b74343e3b2bdcf35eae639d69eee2f101ddf6f458077f886d871ccfe310098a819a06d198b9df9f80d92cb80ec386cab9f8b00 +95fabfd893b207f7275f5222b14a02ead7e1b42688fbe28264ea2c5119c4e0ed592bc1db566b55a9e696a6d0972604ddc96c5d3da7ba1e8af634f4bd6c037558f951dca549e9a9be82400a55f57f03c805e4930fa761891f93b7ce44712baab1897567e2a22dcb19959f41e9f6a1d3d9289bc1e41e106a9c442615a7a7b35dc0b829d255f203fa290c54cd7f6b13edfaf879bc79f2613a7b13440cd8c8b4ee9e1e5ab2cb4d65dd6dae6d9810c8cf8ad9d4e81dd26e0831b5f7fab191ba0c23d00e83f00f,d125a95cf1021b90ebb1776c870159c6f4948698e2e50ba6d57294ab45e16cd7,5803b2aa1157fa2f750845c1a4b302c6eac9ce0087870474ca14b043547bc77579cca459f5c0dca6728fe23fb005b9b21fbb3dd717f7875310ea1ce55da9206800,61b007f38dc3462e8ae4eee6f3d32c67139a469edc78567ee1c07d624c6b880c7e64c74ff586094d9dd9ba4d5632c123ab93ac6a438c15ca5443c3d577c39c3801,b7ca75c56486d56a283c9f34c774f806add6d11360268bf6dc71adb4bc9a14c70e5d6b84c71df57865dc3bbb539dc5aa252e2fd46e2ad1b23766a6b3be917d2b00,530b3c2465f11969dc80e0fbbc9ba57b305f9e0e013f7e583c1da3e9ff8b75962c42e824c70b5d39d4d76758629b19c5b826c9e72dcbf751c5044c20e89bbe0200,59bd23bcdd11abb23b33287aa303f4051054103e3f47b3f4865cc72b6ac4db792e016f9bc5443caab1d7dbefaa6a6ac5344162b36f8a4c070d14b6fb6a3f1a7801 +c287e23c928ee3ca9e20d2a4703f97d220ceebe6e9dcc5529e173d68d779600fa90adb1521da37f1b59295bc51a58260e7f89e3a2d251bb689d7aac9f1829c3ff1bd21c38f0dee1aeb615e274c6b5c29e9b2a424b31d8330c5c3ee3bbf8854dfa5b5b74eae2be97d2f1309667cf5daefc5bb03f6f6539cf4796ab2d7596f664430b622a2087ce584a599f6341f4525334404b29ff19cd3235dea1e82204eaf6150a6c13859bb07edc4d9a7bc8f6368ef37c40972fe759ef031f80246aef27e39bb743063,00c04cb82ced98058d43b267bd063589533f101e45c752546e642e045ee1ed0c,64b27d2acabbc648c3d6a42f76381d420afdcbb8776eeeb738cf64f9e597eda5480cf766cb179b4139165930187de0849f0d12c849c5d87de4ba0730b7ca422401,b9f27291bed038c1add1e876dbdc94a2b5689bdce2fc2a13ea2eb9f9a352b42056e335b59a6c36eba838606fc37f56c48b55576152f4a2fc7c678ed9cbb64e3301,daa62bcd154a6aeeafbc006ccac63fefb5af47afce3e95ec44b278799045eb9f3d07895efb712629adf800c832b667ee823a4ea664e508c33632a4cfeeb0cd9201,49c9a06202260c03191b9c9d0fc2772b6d560d3403710d3d4cbe5f2c49c7e5b36ce0c08b278a53700b04d54ef2405b9f964a3f739a972099bd99c468d97293ef01,a1c0575020f5f27b6d5ed7dbd91f6269fd4269b2129220765fba514ea717d40e435450dab2809fee35fe773e34ce9608ad95ea5b585119e9469074b6d95a68eb01 +5225566cff8b3d610aea56a2080d679bb52ebfefcf258006e393ddb42f17420769ed25ffdc5fe885fb7f00ee156570e91d1e5ea95253ff7a4b09f24d3f2d689ac873ffd98c7cdf8f7cbbbc340451ff02906ca94f802b13514715db3d230c69eee3f97ecd79632cef73be755438782c8dc0944b82fa2816cb03cc99aff58ea1260ee959abe2873e14fc5a2706d9951fc201e4839282d1da977c2d56dd9a84356c01b58e678e641cd51bf971098fc3f6d3404770ccd823f74aab89e492a67341af3945586f,2692b1b8021175e75ce0589307d209f6f4d139f42da57ae18ff537bff7a48efd,9a91e0b2960929a197f86616aeaeb15945ba1912b734975710df0830496300cc5749fab7dc63af772eb0cf37d13b9162634daa6471a108698328bc8735f5967801,5dfe3dbd32e78c1765f1c25583adacdb6401d5bc471fb5d6fbd90e9b73cc2a8f44a503c566a0262101da6688c4a0b69c82743ffcd99e1b3684a2b2a356a4d13101,9503823b084bcdda5957fe914ebf2e7a17d8a54b17bc796cca464f9b7b1a3a26157154200788b975b49444c865b245c2418302e5f2213df66d365e318eab501500,38ce5e0c07db10b8d239b22619f95ac296f37d50447c6293b4ab5393a9b5f6953e28a2daa8d1028b61a93ebd6c70b180d6e6da8c0173eeba02b5d16abb5bd0b800,13e5cba0bd3352cf839ee3a0e0fc032c51067d3d10aabeaaef65c46cd369bce82fcbf56da52de07db8d5aab54fe5a039f562e145a1b4fc9e07fa34fcd742931501 +2ba1d665095490c9ce82e9af64f348c4788bfd2c60923ee7f7c92538ab540d1ca2e38aac256cce81653155474b0612f4b4b25431b96a849bc7561192f1a327bd2a2b0a52b0e1c7f75d103e3540b3e200473dbcc14adc32781f1b86224eacb94e0290552b0539f9082af6a8dfbcd1a8d2cd5f6e9aee15012153e024220f32238b1e204e39a7b3bf623321b5d1c26833154a8fbc7d0a419fef4d005c4bdf84ee275aaafb02c69d8c5282c8a7574364bfe662d9c413491b2e1fb3fa5a05277e1dc916db80ef,ed57fe31544b1481d24130aa61919d430c00e4be634961d6c0cee30abf42597f,bdd9ed664cdbedfbae703a3a5fb260eaa12b119f9f393a758a303d919bcec1f70ff9facd7783f6381973484bac8b3fc1e485a1753e1acafac303cd1d18144ef001,e219f753ce8e20066ea3b2507aec90518d44e85466e891b64490fb10555cfd0a7de7cdb9713e7ea59b07f7c8ae4d9352857ea0a474f0121e0ebb9338c1312f3c01,8c992fdcff1ad1d0d43b116f8d9dc8a0480299cfa7cdc22317acca62c336635e330acc7765c41f99f8a8dd07222eac9cda28669c74175509782ec438b04527d101,895994656de3dcc55d7cb22d0d1682a5a73aec098e829bdb0d797d58e2af37f41055867f17d52d0e1aea045f2aa1486d8fc2d16e53707f5ac2eb1821c5b6f28d00,294f93ba7b6c99370265d9771eeac20184d732a64ca338887fb2e327473dbf1f69ab2dc0fe0e5cc37b93f1f2ffc2c7a05ab5b6b9ac9a78f9e21abb4f440bb84801 +a0d7e3e2cec37bdf543faf46a032d2e088945ad5d9bf0176052403e41afce6a0abea84d5355710f6015c4a90e4ec1049b2024433cd6cb9408b0fa23b25df70f66d11103c9c15582d8934bb893dadc2171d2c172a6111b89ade919106203dadbda47e8eea50b9a0fe9b9e3f494518b7160761c14d5f6127ff49ba7b117123b91d24880070bb34982bad0aed450435aaac4cd69cb48dc32ee5f643dec8c014c8e8dc366a6514df972472da350e6c861c40ee5b74a4768d5bc965dbc48a78f8bcb0b5274b77,7dead10bc6709f5b28f576e7424613f7e570c988cc4b0c40733408ca9ba4639a,379a1b00a4f4035833e47746dd400d5d837aeb2325909df8f9e8dae37b2493da57c7f4f09cfc34f1caeab5ba6b1d2c66f3fc822d2fdce7206f42898f890ea47300,e0bda5fe813e5d6db56f6a69f1684dd2e7702e14f192d27d74dd2a83e02a43e577467e018bb3605b367bb8ae5acb32cb9b5c08c82e10518b6a362ff1eaf323ce01,0d0c0fe9f14c66bd8e097119e81726231962184faec84bf1d877cb2400021b9e418804ca8ff49033f76b046e904b4a578db048f11ef94dd359d3ef2f018cd50a00,73bd7912257ac151379d17d3c795285c1b4bfcf3f0785d5bc4da81d081b852151976f5526166cbc2026dd8b67aaf8626772328386bc4e354ec20336c8e9fc7f300,5426023e98f71f463ed80f5925101353c163373b3f5a7151ee42f758ad3f6ad76835faa192adedcf11d57f372a3ab36a003e95001a6a807200ed9d7508ba77ff00 +720ac837fc6bb2673070973e5d019755d7258049b83c95d8926c2cd900a2a1561398e74fa0635d724702b896c53c15f9cf2f2b6ac50e8471af5ff555eef4f5f02e2674d1c3a4efe80edc745428e8596cb2f681d0eb37d76b79d1b55a0eade2bbafc1455cec4386dec05281ceedbaf623f825f4022b074f216add218bb0a7184c0c067ab174e14c82d3ebcbb93caca626561e18909b2d6dd96e56d142f04f57d70d761c8a00639d2a5aa763f3c2a48807f5e6b163652c96afa709b1ce47cd7e46bf682855,01de5d5368a6528dd078dc0e417d845be072f32ab7bb25f2d9d52f57a4c2c521,dd84fa6d175af74c1d9c914279330992f9d9d26d75e93a8bc5d601866e41ade47b6689f95128867a0bf1c89c6336bc768f94eae8568c7894a87e7d90ba49e80100,75e6795cf025b2c198d6078ac30148427f7e5448fd6a5fd6472b30b242b33bbd3e718259982a6ac349c9244eadf462bbc782f0a4feb54653548765ccdff6a2e501,8a4468d26f3d1ce99fdf398888093ca534d7886e7d3d3509c77fccaacb83be6b5116b476b6f1be4e637c7bff826fdc67a33104a4420427a5547b57da43eb864a01,a00c57d9ca6256f667aba3b21049ccecb55d3f7a0506db56ba8e45f9a85ac14d55d893cec86bfe6d9983a548d2fce9216e3ecd95f6c78a29eee062abf110babb01,b7e9b79c93258bd47ddf3c6f88ceebc4a9b6dc09e0f2aa18e8e0547339b1c9597a7ff36ba404e82dd5e9843c5dfe0fd72a314cc332e5942a99339ba48b7fa82b01 +34dfe4fb4845a5df057d03f8f1bc56462ccd1f4bdae4972b311a82e37895a75cd901ab22e33e4dc0c2be9eb5a9935763e4b71a1c3a6ed827efce7085766579fed208f6d4f40afbf03bf96785e9009f90da512d548391e3f58f1517bbad2a92f18eb06b00766f06c8c66067f756d4e53b3f74951eff8ea5f8fce7c7acab61a595d7fa2c6481d3c430b3fe8f2a19e96ec8f93b4529570499b9f055b36a35afa05f4fe8feac88102ad6d3ac5b750e87d9dee3f3c4fd0647e285deed49e1245eae0ff54fd458,e17f3af7954cd40d50b1bbc30d8dc451201c34fcbd626b9c0fdcc25dd30f8ed8,f245a3b6d29167e07fedcb591d37d505e84a4aa9b2f01c342a19a86361b4e68907bf7a1caebbfec037262cbb1dcc2d4c800abe723c61ad45a59fe79e3c0982e901,88851a48ad477605dd4eebbfd1f3a859816c1bd537792e44f94aeaad275025bb7be0af09ce11ee4c98cd9cbe3ffc01d43b5fd2da2d3b7f79d4abc94e3ad95da700,715177c33be5aa5aed44a4210810f73c1921093f66048d97c549817220c48c7432e239909409b530e23098445e852d27d313c9a34816cd872245ae392f235d1400,536567263c949d4b0a3465b3f80f8500083fe900d565a8839555315863b2aa685cd4607cb4f8b7638dd8364518769c5e669f35aeb10e523a65ac026476c1e9ef01,043c90b2992395b8ef152d860c98155940d46d1412a01e6fca005353f3d26081062d8d12d09be7009ee4442049f80c6993f0e08e05afdfdfa64b7ffedf152c5700 +f568acf54415e4414b5f1fa5866e28fb0e99cff10710d217262a9687e3267777e3158eb8446a62a5b24779fd47f63434bcdeeaee92b58f436493d83daefc8e39b68352c73adeab36e49c0522255c19447674d13becd29699878a5e50a01aaba8c7abc9b337ab8e99814aea4f3a377c5fa8eff7658553e444d6db3312582546e83c034eaa251391bfd746493329ea6c8121a7524092c550e7e4ac5f9e8566eddb5e60179a8d40c1d5a161fd7d9daae5c26e538492b8fbb14ca50245ca6e2c381cd422a1038a,3a3a83b9b55215c94f8368c6131b74a8e52fc4fff212172f2fdaf07460ee5141,7336bc39c2e7f642ba2ce8160e7d4d421e775a9bd466a251789bb569e430aa6f284e58df4f5994c00654f2aca281308b9935fdc3fe199504fb14e7d9b8acb0cf01,c435993ffa65531785c689b8f8c4570aa789960d2a33ed5ea3145be771e2e1b05ef4d4641f3d81c25de757171269d115ed9a957b424759299684e4396b71924201,4b1d2a08458a4dbde35162b52a6905ce9a4faa71c2f881b4dc42887d9bda92c57a54eaf682083be3bbabaf0d653631685b1dc41d9922f2487c14873161dfc21400,98e72b8da6d3d8715ac75be21117929741efc681e647c4c31c664728aaecf7c31069a030f208e6888ef20ef222d2712504766c7f6cfe8c67101af60feba2cfd200,70abe797da9de514a813d0b1a0bbbf50bc38fbd2568f1571d39ec27728f1ee6a5ae4da42f0147161595baf52c0f970a978e347b22388f00701d365560541b84601 +df0371537755a082bf9b1410ff466f11fdab2376096b2a886ef448c8a2dc762eb44a9282420e747fbecf5dde3d51f0ced13da05188287c045ff9c22ecc4d72fdef2211e72fa1daba884417556e7b4a2663c2c53cf9a5eb673c768303e975e1f72d1023b9e5f665af957ea323875caf14ed1ee3e109a02fe76ec277da64629de86b398b5411ec661cd0b34fe8dd51a610719a35f98f1fc502e4d4a7d678747b42ce8677f3bd7fc0f4db17dabdb7931ec277f52db1c0215a3a8b1bfe7894dc6b99ebc646b186,a9b8bb7e2b68bd6513209d4216b2986781071b872ef6784aab858e77b44b41dd,1ac7f6a8b0a8e47238eca2931fe489daecd0b288f13369b65f284d132d7d19801b1378eb1369dcd74a416771f870154b21c1c62fefe958c9aa961819ffb6bdfe01,9c7a9f15c4b4779efd154d75974dc3241b7ee5ea7a1cc02e1d95560f64b58d583031e67b88e5230fac60498ebf9694c40c195fd0386e46efbe7acab77b22e1a100,802ccf96838b276added433c86271869635d601472e756bf010acfb4cff26daf3e9e49150db4c3fc4552f5b70976c6a8382bfdc049e9239375680f424ca5a3fd01,6eea351d75fb1d91f7e52b05b44ed368237877753c2d5e63b306807603a6054d42b36d75afc569b0ce4a102940b7663b1c509095565a6110278ebf323593c7b701,4e5422e689efc2e6c4d8c4881fb20ca415b30a37af01425adce1a9c4d4a7ca071c4920d31f42c1dc9702dc81695c45213300941868494a0cfe1fe3e96e1614e301 +28c96c8af494c118bd20469df1cdba858b20bdf47da519d2e2a78567d7fe0ed8b56e47abd435183e962aec0908fec553c5fa45b30197f906fd5942dc1a4a3fb36df12f89b7b1bb73a0c314b064aa3285ede886098fd2f9d02cbc0b97c9e4c1ad8baaf6861c0350f49aa9f9222f26700ef8257904211ac07b65aa7adbf17097198b3e8beddd41ed14edae5a234046d74230a8edf9d02506c9ac572b5c8bad58cc6fa7793b2eb339a2725a05801ba8ada10c9eff25ea8bee08c0cb08cb08c1c85e2804104f82,a0834d4b921cb7b922a0ce6954b848e55beba39174e2a0b4643f3eddc47c3120,89e3ade3bd8baffb7e47153562a7d8b4fcfb32f6d631c0812c0bd5498f4d25ad1c7c373d8102d932acc3744e09e3e6667c071673f210bce739f076e801c02cee00,bb9c6e3c64736bcb15de180f2dbd2f2e788687ea94d1100447e29ab8cb47e62d60044249bb051eb6ee550f43e9ca4a2e3d966298c63969abf809258a40465c1700,e6444e1eb78048dc4071b8f12f38e9c852680b043ebce0b6acdc149ddc43ac3a26a7af7f4d3f192daac7eec648c4753313e0cec4c31d77f9b1ea9f48b808586a00,9ec40f67af3eac92e405f21ebdae3bcdc7ad9167d358d07261a1ff0e0b28fd4b4eb01aba7615af813071417cfd1a9a389e54a670b823318af88b8bb159f5e88e00,bec37f5ba1c5e03f395724f929dcec13a8566cce4167151b1efe2cc0b281fe7b1ecb5788dafc553f5e548bc61ccabc3f3dc002b53f88b24fa7e258d66939d60200 +9e7a39336af4ab7335a1ffdc44e2ee8b65669f7009155635377b5578eb8d83ff519ee94debd7bfda1118adf009008d8a146691953d361b8bbf84fa64bc4b87aa90a857a571e06687e95f4dc97cfcd7bb740ba8ee83131b66f277c44cca8fca2c5c72b023d2ed434d7327b33b0c7135493a1f37eed07116dcbddd35c8ebd2e51b9374b5c036a40f7aee33103a381dd919ed29c5e7705d6eada94408cc51a5059bff89a276e44cc9b2a6bad03368b8e253afb703a161d7179163da8c090fbeabfd909ee65f6a,3e514f04215cb6d2ee3c856bbf294868ee322506056b76c8c6c077d8a514d828,50e2d4bf4e669d5d3060feb9e5cec3f298738ab960767e149eda8aa8a651fb6275e2457f2c45cc6620b9b6af00225efe049b58ca5e08e8804a736540d8489ed101,202305fcb1beed1fec0421462b23b2ea063fb6c99218563836d466f406667f736d602b591e7b4edd4909fc01759bb85d1726c0154f806a259c95b3e0df37db3201,0e38e4d13a0111f178b9ac0117641730ceef97f718549a44829499f35fc75f217cfc1493253c74584db6a07e3e7a2871ffb177113814667284f81b89f420a4e500,c33fd44095c2c3c8c7e323fa5dd6a82eba5216a2037cdfb47375d08ed4e187ba59dfba55e9ef6ce0f4448a6490ef164794008614866c9106b9fa667cfa5bc07300,77545e9748c05539f6fc17f6bfd0a32c498fd23ba4902168efd025c85c780aed3b356ca1e16a2ef8adccafde086dfe2c8df563856b1c4a3690ee6f0ecdf3ec2b00 +b4f9af9b3138bfc012a663b75f890a8e24bc5e9e41b007723fc76a95edd8fa9aa14b8661cdfc92b53c39e3703fa17ce11e95963db83bac6c61929cea1d3251b05d2cee6603d7c43ec0ac8dcf1d9e16124bbed6485acb67e1a8412d3525d7757ae5be057df27a17596203f73f78565ca1cb19abcce8836ba39144667a28fe8f08c5b82e30c21d8a5ec497f60fe27734b8463f8dc0b58d75ada9305c97cd1b12a8769aab4386892503c7528dfe3ca9113f386c90f7b4857f359feb9ab68bf13bd1c932010874,8fd4337c6c61a117b946d799b0b97ecdcdcc2cc900a872dd29c3857de72cb31f,e2fe68d568774427fdf9899387da6df996ed38727cd3d40bc05da7cf7d712dc425df97d8310d31b47e1ae55ced42801d4299ed89387943e757567fd29d1c66b200,3d0a33de56b42f92e4cb7992d89c59446762204db8000359780aa084619d11924bfea096f86a7efaf964a199657f1152241556d58f3b79bc583347bf0cb8cc1600,77896d064597ec8eba1e91d7a853cf99596a13ab7dff1c8fb0ae4ae5cb73219617a8fc1891be146482dc57c398aded24348dc59edf00f27f59d38491a8e9271400,89be5a9f78300c4f3d036fc0740b4850414e4851bd4433fdf9757d24715d1b246cff7cb6f617e0f5a95bbd28f8302d2bb10f7d5d87866d3ff15ddd20fc7d415d01,77b7b043d22889f070b94564ea571b8ea08b68bddc21ac7a9001d55ac0956cd12cb4cabf2a86b9123e5024b0d49696e2aab721a0b6d1f901874014e35a31449301 +3928f5e8f4bf268d5e53f46eef13ce7b588f0e3fbc18d36693bd3cdb561fe7c85d99094c4c835a8cd1289d7b9b86632fad140e386b7d42439379403ffa486e88bd27fa40fd97db285e4fdad2582c40232881d412d437bcda9566c73820c1860b14560e0928951b10180a0cab231eee5b43f0b09974ac0b5cd048f6e8f6284f621b8e5b6387ca6515b2bbd206838093d5fbe37bbb8fc2ef4a63d3f6e0d2d9aad618e8060035fbe01452ee35a4187e1e6e5e980a10cad744582da4a88373e1fa90136b9d6cda,dc96666b74ba1832bb836905cbf648c070cdd3256a97ad389d5bc80bb3fee350,9b129d96aa770b6d87d77cdabc94a3010d1e2c9f4878329079b74e8b38e744e200a7b43f99c8a498cb9fea9e14dc7dd5105561b564d772e62a34656f5a2d6a5a01,2aab644342d767b8ff5487b327ae0477c956b759ef6e2758cacde9d4248dd7f16ee99e50f9166b69028ae3074524672dcca0886715e6eba05a734d0a60ee200301,bdb6a3a69fcbfe7ef19115fcd1a84b6be76a93586fb337d9d80ad0fd4a72100948d8e310859fde0082bb74f52960ef52fb1c061c57daf5b9565ffc328ecc36cc01,297494410a9d05712d63a1d21f8d62a553bca7bf090ac63be89613fbbea89ee91b7ea77db68163331ec4eb6e023d27eca845ab91738af18ef8231f766219a00300,2d020f81e27fe163525fbcdda045a93fba4a807a319e54052f445694e989c0220a54da1ed5ac22d2c4448c3f6da04443264b91c3724e7c3b16b8345b993b4b9101 +64f5a296d0883608577ad180a65bae9c297edd89b3503c4cca145c87736228650f182e21628d6235338f569b7663609494560810c3ce37c91ea8fbe1f9a24c9147daec7853b632a4e4562dd8e6a69ba0c4aefb348f9b03aca11d5b365c2559dec9d13aba9e0f68d56b85e3deaa058b659e310969f6ebb56dd7421bf736aa01d5e1e4d6bc562c6a75511ec81088531ee0a600a19fb5c4b610fb50bb54cbb95bb94480795c2c9f4c2d5c58aa94510fbb34d9579b0d5282c1c2adb1f910047f49c63d6d31830c,ea250c3d7ca36dce5fbef038cd9d6913df0b8aa342cd16529d49c2c8edbf9b87,0d19731ea3fa809208f1d88607fc047609b10b898789507e1f89494a85862aa12353ddbc509f5430de376d1107141bc8fdac1e83f65440676d8869aac842436c01,0c6732e6088a22313e56d2ef158fd79951130bac0298b94b0a86dd6045c690b33e150380fb42e1748aa092e93d743c203c43eedb271f16570d7050f75d64a4b100,087a630a0efab4ae4269d965839ea4180f26fffaeb6da09ee4108bcc5a99ff941dc7d412070a163b5712f98e5b1c084fa39f3af9b097e802ccf10fb74aeea43501,43ba123549c4f659677278cdbe63d8cb77fa773e5396b277cd94c18840d4d0833fd48946ce4d7b59d5a40c816afb2c87149a0faaa61433ef2e6d43d463edb06b01,a31e5bdbc80a0ed3ff9a774ad43343ca981cc7f35e1b6dfc9ac0072d4565e6b82e488a7de53404301cd7297ddfdd1524a3e2b0d68368b33349dcd9f22189490701 +fc1514323f71d9eb45d294ff6e9c06f0c6c40edff6306903487e5717f768c9c0f01c009ad6ae20c7096ce235437daf5fd2c3876b66d83258a6c87fe7edb00a8b4e54339674925b2bcfb27d7e6362d50a937995032320b3f348c4f4de52130060b1e6e874d48c93c8d5687a8bda9f541492834f8e5f6d4784db068d2a22750315d2976cbe6f6897869a08671bcc17baade4906fb641699e32864b6aef5099db3a89d7947962170f2f5b8464dbfc690bfcaee3016f640426df1c2c03cfa38ddfa5291c62646d,0e3078cfdbf7d2e599b057afb8703930119c9f19ce0e9944c9b946c20f19f7d1,25404776a5813bdf37d6e07c65939cac5531d9d33c7621cf52cae364369ffc051ee29250b772bdcf6c4b05dbe96a77e6265d2187c9430d2d9a891240ad0128cc01,521a4da1d13de3fd616e77aa53fff5b2b12b1d88bf90fc5977ff938edfb9bebd6d9621a3efdfc1d931f8c8c56fafd7c4ede2a82d2dda838ca73c5ebd5a3a1ee700,d6df482621075532080e222cf274ec2ec32c6cff8e08de01713d5c711a50e9a64012e374c00b4052f472b30c591481bf335d75a4df4941e65c1f1bfab5465fc701,4047aed78f14edc041eecdfba6d66a5784a18f5c61792864d5744edf001301b6370d99957b696bbe7c7e8c77113ed00253a10fcb7c9e5b2c5e14aa5d32ab55f901,1e323a1c428f9ef55f7f88591d35fc039463e2805c11ba32739502ab814de43a24c641ee5579613a620389712d7d2e90fae5305373964be2653803f8b29cb03300 +5368a60a8b5de1dd5393287abd5f76e450cf3a68c6f76df3b3bcc249ed914be55fd9d127af2170c977bc44b2e554fb1bd1b2f9b2a570ed7e605c27e1265f9ec2cf70c00fe1e643cff7f7e22ae79ed2565c9b2ce754739bfdf0bd5d1fd69907e4688934d8b2a07d1606a1b723d8ffe867c637ec680069ef86d42c52daf9527e736dff16320f63c9e1a2b617ce7f1fd5eed1b4ccfba29297e4831d346388ba1d62b68d4a2908261f9bde25014d1825f6631e5bb6a7c65c10faac0e3a0c64831ee219f53b70bb,d39e6e786216e88544c8861d480fb214e7d175bf8c01d15ffcda9a786784384b,ddd0a76b356612c602a9f32e6f654124b388f07eefd6b59b5df6fc32f08a368f7eb5f75b78cc3af3a371cc2dd20c6b972b596a70b90178155d0aceaca6c4da6300,ce52f62d3eecd395d26d42b8f7e8cd4ecfc5e3f56cef39a452698c3e9fc5e48260623db15350db80640f81ed19c1bf1a63966a5fcbcf08572e69b37f4a0ebcc201,7863eceacd60453b59266923dd094e47baef3c9f6a01eb64c747e10461df460f5e684c21024259ea8b0f504964223de54621115648202c96bdebff13872e16dd00,09c54bebe1d4a8375bef7d59c49e56c77aa6000368bae652a70b55a3c221ad8e5cd15407784095c13dfb934bbef2d00a810e48dd6a179d6c5252109b854d2e0701,f98014558d40e7ea87495016d156f6b48fc341a855eeb21213d1c8a7be9d1b7e4c39e3963184af1b73db777f2776dbaa9d39ca2e2f9b6c1cc92551d89f6f54bb01 +fe8fa599b5f04e70cf10d9aeff5bdeef66788a15a65b8144a7b05f7d421f074ef6919e1e746967763c7fd9354a581ed853ed68831dba03798060c7a5d92e7103dff2f8394aec08a2b8aec551cec67249a98fe74817dfa309701a660c9f6f77c74afef48b1ff8cf29b3a1965b39709118ca1d2c61ded164ac4f03c5a0e727a2484cd97963e1bcd6c4c397a6030a58a87866e9badf521cc686cc6f84574e78a17562cfd5659fd2e95d4299fdd7101a839c0fddd1400722ddee113089ab2f231b253d56ce61e3,755d1aee34f7019a6de8d2a44fb986b3066708ffe92d3c12808de2fdcfe26b81,2d4be47d352b31ccdf5e3f1d0cb8e715c7b083966b62f5bc16c12c1b30d76ce56c6a6a57ac10a57c39bf10530dfb1598ae3a067c768860d8d854b812878b962c01,37c2362cf99b4463874c383f251eb076d260fb4fbb4ffc4ca8644afac429a60c4e3b06ba75a4dd74fc6ef7ad7927a3c3b35ea169b2967d6332737eb403263f5400,e90b066bd3a00e45d62ead58bc0f30ac485a938d9ead48d0cafcb782b1ff159e244c1823cab8c792e574e9e96bd13edb79b83c4f5df4bae847a28a545a0e3bea01,1a7d12a1b435da3999f6f3babcd2ad2090df2253cfe68b398f13aa68f523a2b1467c7d3db795f80df9407b0bf0da6e650473c4672424794ecb0d3682d098093500,7095f09a96f743e555b0ecc1ddede31b328d8f8b9317586652a26231a921b94648decb8360b9b5b717cfa3506de39adf5a190911ddc5f4a6aaf3106003e3f23101 +2c5baf45cc4883dca0dc1df479a28ff95b6c381a477cd6388b5241798edcab46eb5cbbb72c38694057cde4efb267d688894c123cea6de86eb376483b352f91595f0d1455ab6f0ae29df4270d26c1f07feda20e7cae2a53fe7cff2d75b26313daf71e5abb2da932b14adc60459146d832c4593f45e67d2322b340f27f404f8d75deaffc4e782da8363a0657a222150b7cbc8aa79b3997927ddde670c697fb473736126495ed6026ba8a4d89026faea5c954d06e2d12c912f24efc2144ec7a39ac7bcfe25bd530,f7ab117e6e05a4001d0a72e7cf8a518772a548c5e0398cab029846ee76b744cf,64f5b1f9c14e283308ae2dc40d16d4cece6a62c0e8073190a951c77c0842b72d10d254ce909c2f9f40716466590a63cd38779490b37f9cd168932a6607fce2a501,10acc728a4c194eb43db42115c6e25d1fa303a2435f8ea9fa43fbb1f3e50e04f33bafaa30580f63c8adfee0189e79d8fb182962e043a743f3fc54ef6612e9cdd01,c2bc5f15c3d97a630e688d6bf5313ea3ace34cf247346858970ccf38b1644fd716e191add003756fed4eed7a717fe8477759cfdf25c34a1ec1eb2a021fc2484501,cdc44947493cb9e96d5691d78bb028b5050958dd681f17fc4f8bc4875c69ca58650e4b174e9198a45b8c21b1fb7eba9b4be6d012d22a139d1d71aff683993a3d00,2956254b2a6117c9e644c2d48abad01b5d8a72eb7393b02f9f1a22b7af7098732f9977443d6bfcd83a9ff746934257a9e0eecf5763b0e2751cd0ee5191dc88c800 +09001b42deb8b22f1e37993ae6e1850d97fd2ac62438b150ce080187a23f140bda73ac547b788f2e36ba6c95cb05fb781dca7b0b1d85f781e1a5faed133e5020b3a82b1e4c581738f4a3fd671a1fa605f131f0b95b58a043ee47504d83817b88faba3990e8a0b7f97762dfdae4a67d9b00c4ffe6fdd54c47c1ac36a3bb6647d602dc2c57f26faaeb2b3e8bae791863b2f511ca752baadda265dd95e4e2391f5387e3117a096b9500958ff32a97bd3bd4efa496b8e05eb866546717023a1c885f63ec46e65e71,25d6975cb9e6bea69530d6f7c3b532599e7cc1df508a4341b26303bd35180f83,c8b7b77bc14c173455aee41740bff01aacf11b69e6d52ea20218b52d3e0b144c4b1783bce719c9b92d899324e376371f16a5f307884ddc90e773ae864c5f742400,42f1bcf0ce1a21aaaabdbc5167b27324b9b884b27db0b8c06b3c9e3777374525784c4df6ce8e9d242e36e46203dd672c9723fea66f80fe2fa816c8de111f5b2c00,4983eff4c2516ab814ce87c07af5726b2c62f9411b4869d000f2d19deb680e2f12587fba09936cb52930e8837d01cbd7e91049d9bab1315a71214033571849b901,080873e92c7d24105cf3198e7023a33d51c69e155b6e86fdfba92d2c2d15b7375337fc7a20a37099b91e102e8dfa9b6259266b0b21f1519b76578341bc2965ca00,5264c2a1d64af4dfa0269bda51f38a6f023ff6913fe6e8739b955e46ca6f87f80ba9a2420f4035569769a1e245639e1970e25be11d14e91c0f324b2e0e0bde4700 +b7f992fe2622b38d157ccd54a160b9adc573bad7056513acb7d1c2a800daffb0d07bd85cd9fa56e95d6db0ae9a127fd141125a8c19d5fadcaebcf8ad3c3f2bec9e77e8698b65663a925277b001148b65525bfc4803f7e6e6d3ed745da3467cc8ab0faa5b9df77fa4dc0fe38cd9e4c66740cb2aca6e9c92040b5286efd4d694f11788a5d0f15869c84195ce6cf7ff68dc2dc67817e98287c9b0d10b24e6b045877dd1c4029812946f64d7df83c81f1bd011b2721e7fc04fa6f51377055a5f0ece6d61926fa328,6753a5418e61b0464ad7aa0bebec2cb734f01d307054545430eb27ed7aaa01de,beab05927b2f1ea0616df3c9804e65d59b5df97d22625daa0c27431555abeb467b36e187aff4407aa774c877514340d0772426249809182276f8efc9724a40fc01,51d72ef2f05cadec9cea02ed39c72375af853ae21034a9a864e2e1830dcdd9dd7dd36ab7d1511ae2e64c6edbfb8fa9893412c54f7324e691989c6881db5d3dd000,70782e2e3384e5b4c12cf98465bfb10f6f99238570cef163ea5516809fb6b6db025afb0a591db8c49ab72448cda601112c12d9dd9b53b0356e0bf7935c2c822e00,44e734b0721de57df936f9312f1d4d67f9e61fac0ffee7f2f1d7bf575efc5c68697a5d89b86456cb413554ea8fb28ecf2b33df049a174318ac7b2da00c67b7e801,5e2557152b93453ad1dd89a8a0b671a0bc24a5a5e3782979a23c42ad3abbb8512ec36fed1dcae567a8ac2b8fae1f0752076d9c2d4879bc6c11b24e56807083e000 +e3de7fc231df48565aab70feefa05a730d34fe854c51a1abbb045aeaec5b951204ae56611a3285fcee04654c26d0a9ff15e829817cc72ff4bf250ece7ccaa6750e64d4fe612d0a250d4723d51a20d96edf718f80427ae6c892f2ca3d926317f903081cc75a43b70b9fe76f8fba8f1c33c16383a56ab7d8c63cf0a64367c9f1c5f44004223a0a7086d92a2d2ade1b0df7b87188a460dffdf75a772d61c3efc08b42d480d6c9aca89a875f44566429dd8dc6eecd4cd5b91ec1da12d3f53d2d78465a83eea2a95c,d5d27a24f57c21832daddbcaa27d51f88f1e3e6cb12c8eb23d2979ae84c7757c,61c2ddae1fcf2fbf7d100c5ac2f7168235d750446b41226a35609c5e9bf6bb9b33f2491f382de76a3b5e848fcabd55b1b77cbff31887c09c460be84a47eb6b4400,6a94d9201afe31b34ca5808f02a61e05db4b59e73ba4d134e7191773dc1d7fe71c3d37767a4945646ca795e0267bce3ca61dd55cd93389ba40ee0df19002a7e201,0189b2e2ede368adad4bb7706b2a3d7bcc4381ddf1d3a0f0e5cecf08a7911d872d97ced3a01296d89b2cf27defdd3150c30686b51632a10836a1079c663adc9d00,0786ba833f8696b4df1b9093bd10db5128e8ae15c8482d849a2a75c35f9cfb3f0ce683481d9f997d7fd4b4c8bb185a59a69c65faffa8b220bc9f314c6d54a97a00,ab72d2297d492f8fe0beb2e9718724bc2ed41ca9296a60db5a7bad9a8466fb4f6671e405db7370237532c3bbf46cc4e71dfb29838bd7e502745b9bb73a7a741701 +04e7a009e6d6b33ea1fa6f310b52fbd65af6e4f6a636ef45bb0c8b4ef70867a4a933a5073229b82294bf4bb752790b63310d92c7016ca351f521f6e2733597cce5bf18e49f172bd981ff8f4cba7bd46f16ab0cd2e22f7ad157e755479a5da9784fcfd977d311a4f33b622b6551d1db54b17f4635a425bbbb2ca6c8507ca1f4afc0e5734fb7fb75fc41a61551de5a7c0e8fc00085b3614dc5b432823dac53953f6155e107bae477401938cdaa94e286677ba593484d23252fcfeb8b4dafd54b3441249d4c878b,9db8a0e8d1ec4c5e4cf6fab06546b5be8ea9e6039931d15dd343589976219833,248025c683c095d0cb14559c607be5971f08d8fc747a093171d87078b49e10456677410d616a84f705e0bb7a947784ad9ecb93a7280141eca073b163a263749100,8843f2b9bec80d9382339123ad244b2b2fffbf31a2962ce5ae627fae5ab3e501318561fbe04b7e2b2e740705106fc56a0581f9b952f82f84380b5f8d0744900600,f9b8edc26d9e136a16ca40e5792c2a91b72c3d295c860df49412f44da7504eee45be0e9e0f9af15d8745b1d5a6bcf5368e864501de1b0a9f87e0f2e0ba4254c401,0f5cfbf8da328eae604eb75739b146d9e7bbd6c9179829f34d5ec8f703c5397d04b90b11d0cd3a6685af2d08df1ae4da0faea9756ab1a8a36bdf3700e2511c5301,76a1cb96842eae348b9eea9efdb6596a1b5f68db2a0f941417d5abe0d24258937b8ce13d48c00eb2912e6750fe00dca9f0b0b6e7690288066fce5ed45b8bc7d001 +cd70d24bb6a2478613571136b9f4f003d82df2dac6839850830050e97b0b4de392e203f657001c4a853cc19d08a79e55b7c8462816e59d006163f9349a8aa724d4eac4931a27eabd13da12cb8a0249c8646b1fbba667f642253f86cab197f948b743dd22511e1e28236fec3fce4053dbe95138c686fb97579eef2d0c350b3d21c34956d02ed1b0d4e5b5d38fab0c0bb6e8065f8845132a813c6f54686bca4cb5b9aa1554c102dc7682435dea233d9eef6ba6cd18d5664b9409f9d146e05f75e60294dc7c11ac,415c2a27712aac78f506a670dd31981388a5a37934dde94d62fd87d3709b2e79,065bb030e8864c1c6d13a3556757b50a74f32f72d865bbb0095ee057f290222a502705f8a025e98634b45d1056a87295fa10dc85ed6b76a705618c437475680d01,3f634f8c20bae708ba8b3a947e906c0dcb0bf1fa8f65ea11593e494372fd70786991e5788e56ba61c963a809885a56f693698cd07a72f3f979bbe0d238bc943c01,a05cc6501fb88ea2908c8ea9f8eac3d4a74e6fec2a6a0cef80d3ddf7a91eaea24198e4e93d221afe58fda30528f1809f67075420e70b875c193cc6b9bb7e84e801,62f6d15bb27247a6b9b28b8ad32c2083fe1c3d4ca411517a94a4bf0c52ff336800efa5133ac6bd15eab823876b4abf39f9e0f6f44eef70ed23a9a73cea29c9fb00,13fe51170ce10e33928ec66949d68c7e6998aa0b865861859e2dd130448f936e2c78fa1ab45c6f762c77f40f0905ab282072640720f4ef910082faf26db6e0f800 +96fb1a746b4162182ed2650fbfefc2ea38dc9cbd1037872f471d473fcb7546b513739d9b86536a93fbefc75a5c56dc25840bccf99cdeae3d1956c0d053145aaea1faa707ff86a30fa0db803851f4fd35750365134f5fba652cb425a37d6c0403a8e6a6bdeba10842b2f0b7d622bec65bc04bf0acd051f3fa2d36b8a28dfae634d6312964e7999a110b3adf1499dea9873a9ce21b749f879cda6b51bc960d4951bc0f52b5748b08867c3926b84d130bc0191c2ddc192e43e7b4bcaec6130461a4da20b1aca1b4,64c0edeb90e56d7a04f7a19475111a8be004ab01f93d6d3ed418770778866074,4c3f18122f0dbe0a754d70f1925197b2a4e4a089d0dfd595b38ad3579143f5c15675cdec7708ecabe96fa76c708686e08d8a02d39064f384ced5d51ec8150e7801,ef9d6681340514c720c8920b252a722baae8283724146de3d3614657041da3b535dfe98d616330716aba4fd43c204bc3024049027e09226104341b71193662ab01,55783fb649d4b8e2ddd3ac9ce74b2d2f341c60be422bd424ede5759bd3a50bd534754c807c88909c0883be6ec9e90ab607ccbe86719e82fd12a51e594ce372da00,e7ddd16395383ffd296918db60241ec06bbc2f4b03739c9650087b31eb26a94f518eb1570941f044fec8d779c1d9ad0bb89975dc4b11ec193e98dae8f09ea6c000,610eb7b18bf008fda7e143e85f4c30d59d3087c44b57b1b9931d9cef44bdbb601f33263f553349028881060c6613e95d886ef44ebf49a2569f16739aaf86768300 +91cf0bd0605bec265168d24606aa1d864cb6a255064c5ba71db01cb3d6699d877ee7af2680245ce11fa0a64cdb6012f41b8eb6c971157f33d7381a31472d4df4ed10bbf8d94f86319287e82ba34e006d3f99856d48918beb2959d534e9267dfbf5482b24e302bbec92d07e04f10758b68e017f0d1d0d13d86cb3c70e1a082fd204f7e1549e631bb529909710c08b94ddeb2a191078ebc6c58560beea158ea9f3d279e6a34c97e7ecf97c9991c8aed004fb212780d65264712fb6ee91edef962345544ed3586b,ee24b7d9af4da858f519517000cdb73ad34dbb15a71f45dba3fa1f5377793099,6e6df67598ba137ca67ef4931e73cd1680cea26b993bd2fee0b54ec6509d6e433dc583c64729e31105675319e6729df919447234463a3c72796a81689fb3e9a000,10313a16d851c14c68a1d3c0c193ea2677293169b604fe2664d04da0b53146af786fa6d95d1967364bc9c76b1e578ebc0b05e5ac527bc107e5a74fb78e74f7b401,a631dbe83349891cd7aafe812cc7fd6154b4413d92503583b692837561401a0312205f573658a6c684a14a89ceb3da455261b44ea88f930e3251038ac5e53a1500,6ba7e56d9a6609272f6bb229a45f30b4f5580b9ea15ac1bff978502a48e805863682a6e6f15769cbdb1e520a2051ca0d0affcafe79570527d7427ef6066d470101,4c627f03f8686f312adb3aae058fc1d18f107c7ab8d7f3fc1f923976b50e9d87458e83c86f3e6a8e57cb37981b218bee59bb5b944a5aabc5fc728e3a313c10aa00 +52bd97a428f056102aa2d86383c97e46a9f1b00b577c95e883877cb0d42d5ca481b07f873fb4c8fbc1235388a44a6cab0a80e79927f6b31540a08afce398872268c5bfdc41c7b8465c64ef67b0d59e67db44ae0c2543bc709ab7f8ade3671315119f1cbf1f05cfc4d582751de55755c940df6dcc4eb7688a8c6c106f4571c689de598010e386a2cfb748d06c842e06e0139718a11d74faa813e7362575367d2f742bc3e3030639a332c0f2ab729814377df9f3b33bdb7d3ce149d49b8716ca1b79361c2eb4fc,1ebfccdee111dc4184e7a1af632a5b3cf7759ecbcd88ae3c92beed644c913151,1c54074f39f116bd4dc677fa284074f86a09569da3af2bec96a6579635635fe2083cf3dea0bbc74d76ca891f536bf9d7ea697bb1fe54520a95700fd7a12d31d500,97ad161e0e842bc6a66cca9183e094fd7c3ddac2f21d0af0df9d805e341dd8046a7ff8f4b2db0e547d774509be609395c0aeb48b3d14a39f67bb27668d3c3d5801,21a8684f2e45e706446a079430c89fc72baf10121402dbc4ef0bb5f1ef188f645c06d08c810dbb9e0e7d963c66ec1ac4ff3bfd74b29015a36e14864fc20d8c1600,54088f746be0a7ef7277c8fc8c3d8a48df1aa710a02b0a447d0e31efdf1f7b2809a7d7fda4664ec9e78b57436d546bc0a350a66689bb0ed08466b892a27fb49201,74c8afcac41d168d9735a4ef8086e9f9d360dc619038fde781b8a4c688ad92011d1a72dd77683ba0434393a1d501c042143615f184c53d136d5c40038179855500 +4412bc5057422f139cb7519d8c63f0cfc58d3aecabfb2c7689213b94cfdab60a6899991104ef0f9578ea7d4f7fbcc74cfa4a4029864016465c0cf952d00598a5c736068c0f97848c558f0ab610bb576762a6c88bece0c207a463f650211f9dd226a342ddc8db1e0b37f5790ded0cd80752fd09e5649f74850e10deaff2b2792d8c0abd0f4cdb36c7c4052362e5f8b3b3f56ffcf4423e62b8935a11c1c9fe1d8687df2e951dcb5c29b4b188693f6f0c2424ad8a253794b884e6c0a353460ddf1594cab5d985a8,c5b875210d1f6e50693aa1d7abed3f4a27775372ce2eed9ee419709fab7f54a8,070bb6d791c83864a90b527cfc472a42128a4da9682df74ef5e1339f1caf3fa8600266cf7ecdb89f80235e1bc936d595ed737ac91697724e0497841d08d2af4e01,36647d6353deef3a8155b6c8aa81e87dba1919ac92b35dba17d3c35070032f3b3d7ee094b44121c741e1dc607dfe2983b6a345654455ef3330b930d9049563dd00,52a1e7c9f686bc72fa83cebfaa3d1e9a9ffe30fbbf79d5c2a202aa7d90772e8e57536bd1079381878248ef79b7e9f09182de55824eab78ee40cbd4e67d0e4fa700,2aa9a4e360fe31ea86c06d688f0c5cd39d01e38af425ceebc0848f4ef0fa220b7c892a5589c3ef2050ee72327ceb8df7532014ece4495fb8f583f3e94a0f939001,4bbdcafc806863c46f883ed719fcd849b9acbb44dec96e9b6ad2e2187aca3aea2314f2bf62b103575c015cc27b3708fa7e6415fd94cec2885fef5804a279b4b100 +b0f24c0aa1b105a0de9236a11e77f43ad5c0c4a77ef7d7ce5a75242a5e00e52c5338cba1fb8f6648aed6f385b552d454f087f7acae84f5acf31c00843705182b1860b0bce6e19b61a23977b6bc6bdcfbd6c4f397307a8620fc5bd87f2b0fd6d349c4447c204b1f11e30daf696873986bfdc53d3b1f7a22100e47571738cab604299c4588e7de21772d85e75674852103d77a2261f82245eca3e90fdf1f1389577fea911aaa4ed0f0fb6cceae88035f3558942adfd65f81a11edc79fb15af9979162b0880ccf58c,ec86102379296467dbbb138ecffac0f9fce54e3314e8cc6b8d3e73a8dcd7fe8e,4a3d5af6dd04cc7cb2fdc90a949d6a6f635985c2e17734a2f2175cc663bed1c8790afebd5071897ed9c3967667b81cffe8c4697b100b895fe73d89888cf0512101,d4a748bd1476076831923f645d9e2c3af6ceda871cb7bee4a9513a5bb8ed2fc04be85a5be4e9e68e9b4497747e746889f2667506293a062240a45d7d805ad06800,0a4437b79033e04c9505a30474e79955af6233872ba50bb00b5540325446a3997a24f4f2b5f3e7ab566464d94df761272aa973786ed4701a67f56451a4d8768101,2b65dadd338d47c85eeb3e5702045871988812186eed76ae54cad248685fd5213c994a6d737bac573025d9f3a2d1a00be612cdcf4ed77dd2a93b53d8dd31a64300,0734fe022f0f777bac5d710b2092b4d0eb0f9c5793dac1a4263f1ea116afc1174352cb222626d3b90dd22bc0457ab70af0879c0b83fb922dfbc600618285caf301 +fc9cf7e1db9f5c75cc9f0980b6f6a336e216881eaa517ab0556f50965baed6398e60ac65809830c8d4c1f536c70aaa0e2fee38e3cd101b0381ca81ff09bc103dadbfd9d967b18baa10aed6f7baf526d7960a491f7feda1171f227a0d1954a4645f382a0458bbd55fe2bbca63a33afa3e2ad222d220b5ec3aa552cb9807620f6a2b0d4f9a6efa55998df34ca1c60efd0a2396a28f00d70d8b3c5fa46da60a852d90bdfefe6a5ce44660b533c9f0e8c9d55d78eab49178e1f3bbd7da4dd1ca302aca83084caaf493,614c79db6866af69f3b04d0d8e5de8b39908856e55324c78775cffecb4a5cd42,16c06ad49dac318b8d7ac13ac40431b09fef0b5a49511103e6811f1fed0ac582625566a425563c8487bb7a46029304473040f3f97cbed3e5c7f6ecb389e5cd6701,072b44769b60c2dafd54edf2be87439522f1aabf592e9211a65372ce19c0754b6ae166b636ca7094f1f2b95e4b11dd7e9a5579c15111d2aa9f6dda1aaf04cbf000,e76986009b91372d9dc3322fa1a9e836dd0b90d951b0e04615fda006e48e74ec30fc912d9d327adeb4c5b5491f3e3449239ccb9f7e261e8fb9d3c3b445a48cfa00,a75f94fcf52cfe7758469628cd7ccc63932a0a4ea7f377c31f52550dbce3f26270d7137cf1a8aaa53d0459b9ae89dd7afc4e51e09bc5da12581da9423ce5db7f01,064c6b2365985309df4cd9d8d830e5e7332f1fc68a743487cbfcc4fc7e51cbba0ee57f2181f8a80c8cdc39621fd8e57ab13ebe7d0ffb2f8818b372d15fca01b601 +e3a85c17a221bb9c93c6427e62657f119e054a7d2602b6cf0e3e2ea9d076e6a5588539f9ecb0d31862113cc5ec908a387418f20dd13687082c3edb9d55773bf606635c98c51d323d5c4f6eaa9bd8ab9299b1afd3bdc98dc9a82ba4d2fd9f29b124b78e5526bb67f1fa1b1cc6e84e42b8b74311afe78bccd0a4d8c80004d2258415df992d88e9e438d209d326bc555711e3646d9772a62fd51a43508f3a26e298ef5c2651b379f9bf39be39d56b9381acae8f01a83b56112299e1dde9890745cdfe6789f4e751f9,050bb17d2613bfd000d745532921d28d67b7a5afc3206731c8bb54daad2df77a,53b11d3a5eb4930a05cc996cd26397003b160d1fcd8b5f1382d14825723969376b729a504290faa6be71072a7bb912386527310738db529e653d43088920a20700,4d93ad187a61e29bcc679fc6c065137e393bffe7102de4a14737c65427d8864c3d0969f62e8fe48b57db0bcfab5d675b281ad86edecefaed7a4327f3a704c61400,520c541e9be8d5bbe21cf370c3449db61cc027836c9216199b377b5cc94b58e905718ce7c846541d0a6614409fd25ad4501d44a3a88fd2638d4e4985ae16d44100,d047876875523dfbddc2c8c208eef0c3ca02f7139364ba865b2030b40af4448043570cf5ae186204568fa3ecebdf3f2a25922adba2e4c3049841ae88d560dbeb00,cc20f0dce73d9362be351d07e7a1d6b4ff93aea71f8184f40918359f971c3ea972d07491e9c89e94bb4ce21d3da67efa7e686cb7fcb3cb98326b755c67a6389f00 +c1cae5210a4d2001c89041cefe34502c442305b0c55cffe7adc5c31d9082e1f7d3f3c55be60b1a05230404dae4429599a467105d79efaaa70d76a1da88ddbd1668fa70d726e3b0b7d7543cc697fa05c403701a76a86136e09918dd2f09316068df7ca52b8189f00a753052f00f4febe1f2b15262951c8959921a09d331ac6700427059bdc2c970f754c4abb97edb09c19f35a636723d08ba0f16383522abff9418370a7885d259105441561ad50d090e0f01bae882d39100c9b1d6e7da42e688996f9f00017ef3,26219fb3dfd68217971335d9f9bab0b6177bba6ba630acb395321b8edb6f9bcf,3f254fb7538f99cc995b3386f0335a1b3e854fbfd2d821b4a3aabe37fe6026ac60c26d60aa2deabd161359366b0087e8980a4bd7b258c7dc3d16be8e4b9f5eb001,d05513aa9d9ea6b872dcfa4b513b8c2162d5be46234e2d708062a451e8d08aec7f3120a2e04d62698fe68d2c95babb16b0cca2138138396419ddffbf7e7bfd0600,dbaeb6e4c6625333eed08ba6e56f0433a76496d7039a7d88a2e6f6f3ebb7160f4568716a822a15ed7239adfb0064595e4a4bd08ee9054ef8c24ce1b6bf05d7c600,4213608c5f5fb5394eb170e4c38b1c1f52177dcea486d6fcae1c3bd21368aa982bd8cab6421a156a4bbb2b7bde83e48bb9b617c3a1025a1b4623486b28fe5c1901,8874616162a73e6e6eb6904ca4804e40fbb415d505142f5ad38d2ebc55b7f0fa0606681df25436a26850bb3d6c836fff33cd97c7735b3ab2cf760a2a79e3082500 +227bbacf827ebef2a7332ad010418d7010006dbcc24edeb62c05978b123b32ab80b37ef8d8b6515b6cec54a7e92be54547aa0e533a13330761e8b047bb1e58ab9cf4196caba7bc8494815e429724ca3287f5414dd87ec4bd357a4dd03bb9800649872a17ed1e32e42d8df242557798407e24739444126485083456d25076007592dc1fc956902a71b0d73d5b767105407641d5acf624b1feecf2b94de5e381f6ddb1667bb355eac11f04fb1b21acdebafe2e6e9b43aa4cdd588fc03a8d373bfc999fb900cd48d7,b37eb0c00e7dcc35d1094269e150aa630cdf85382c538a402cc660b3a57978ee,1afe0aa57097d0bc1523a6c8cd8d3e6078b8dec8de62b6dcbd41f1ef1b657cd57bffc3f670441e1b3797c546ae7fa6ed1f57be557ba58b3c6f3596024c99652d01,084554af081262c1f3209dd67ace4e4c2b89d7891c9696b99f9aa9d986ada6915bd6feee88d4cb63ede9dd3c5088b8eb5031ec8c95180fad109af8c5e95bb93001,c521713f4691df1b22e2a1f43de0e5c57c0522bb0f650c97b110fc6d0cb2bed72b95a99684be3f34e9d3019de7d9de9ad88ae913cdccbf094c3ab2530773172501,7d70589c2242a10426c4212857c697074096e79dd4582b98d9e3716128fb80644b548908d65e30dfee29d58d1ecbc48fc5cf4be7b77eb10a30842010b90faf7900,8df80f6eb347dad9d2b3740673ae817cd2fe5f3f7cda2f5e5eb4c6dfc9c0e80d5880fe08b46bb79e355b871b7f7030e1eceae49da7493fcbb682341d6d1fbc2600 +cbd57ee3726641347f5d99b482ec05f55ffc2462d362b734ffe5e27b07630a11d2260c569252651706f7698c101f7d03f42170fda8b95ba08017a9db75a0cb11db08b8e2eff8b2fb3c76ff6cc38399b85f4eafcff8c2aeb22e2d89a2fc7907f6ff91fd7a573a98713df8a65fe74780dea74d6afb047a140c42044ddc048430ffc3bffb0bf14336feb23051b95935bcb4ea70bbbfea7ec656283c1b195044bda25993cde2ffd76a6db6bcfe08c5e7b1863b08af339523c2afde63cc1288687951c606462b75874a,063f4a22949d31223265c31f30bc3d7946872b23b0898be92e10c93f7448c955,9400f8a8abb06d32e7a287533ce955dd4bcc4da2e3adec3a34b7571dd129c5ea018c5ec0f1dd6837d1519db2d1804fad9500a39bec492e3de4de84a0657b0d9d00,40d9531c7f1aaaa275f49403cf7a9469b0d2477f8caba34565a666591d29c1d67874d4ecc1bec349bbc254fa5437b51d7a66411a270c6663d2380ade98a6d68d00,d0a705f56c7d1caf579a5cbdbb565908287477889d21d39fcce1bbe81890ca841d396725bdf8aa3cc4382c0a984016fe47266d677a0350ccb2192e5122b12d0d01,b7853c89b0f637de9cc6b1e0c08ae5de9363929b4d85864037ca4f09f4581b104e501497a271d0bf4af86e2a853943468608eb477e99a93c180b4f79503e721201,4e38d29623ae215d818e07c25c3b3c036ad1781f094de434da33b2c748de9c1c080689572da8e62a4452706a75a5ef71304b4655a72c62aa1409327d82b4521e01 +b274fd24b7a93fbd019550e4b54c3e4b114300107e28b503abe54f87bf6a6085019e363df6f343ea68beb8abd7d813b99cc0d550420f5ad582eb2fe33c6c3aa81a7b16ee355b3fe03b75b6da31c8feed484fc4843a4ed289efe4dd55006865bbafcf6d34fdb3d260df3a304031a9ad52651135365f33b43bf8729908e204e551a0b3cd8746d0d6a2cd047a2b32441a5f26e76820154e49a127f6dc92ff3f954348ffa652e81c25cc44738e4f41193b27eaccf8e4af9154c3454aee673257dd3488f94254b8d2d1,5c22c74ddbda7e3c0b28d566a1824c33b8aa5f9d9820eb83b7bd0d7769026bdc,e0276c923220c83ca8886be24e076c8417b67765850072efa6c2865df6ef802a42d621647e240772921ec9705840f97093465727e72ff40e1a45840a11a0ae4e00,b26ceca48c3f7a2092f4c836a26643218f6a7a7a2138a37283fd0fdb9f41651d13730ba17a5482bc51b43106cd89f6d5d810a690de2f9602aba37efb89ebdbcd01,abfb7e48d568d98c0023a5aeeaa93bd08fa33e5a5baff7373e136df97b9c4b107936404c3f9f00b89caabd8d8603ea59fdffdee449ee988b76fd63d01f70a64000,b781d7aa1a9ac67580a696694ff0e93e3b8a520452c12b1e0db13f20ec02e4d5739edfc524d8eae5fbb616bece632b028abb81fec5e4efbf774243792004f3bd01,cc2090b7987025221add1262459531c1f1a08c2c54e5872e88c3ca7be1506f9d602feaa7f83b7fbf871665091260a8aca355a7100a9f9d508731ad7419b9c34c00 +7fb230c4400116f799424dfeb17cd7a2aa49501f91650836a8578178266bfbe5239e0b9faea0ed3e6d635261f9229280190b5410bd43ed88b4c787465d37a97546c2d01623f8522bbded9280f9991439e2456037aae7d796721804a6b18db6d9565fba4e56fc5ecd3ccbe78c09561d839b51a05e78afa02a55dc38b662ed8bafb1828932eaba503967855cfbbbeb1b5307f856786bc45bc4de869643d7eb0d038cdf3eea7ef96fbc0630c801b64d7fc07408a184fb2992cf73c0c62e346e5497b21f30b449e6e7,a187a3cd6cdc7a4792146ad0ac21403027df99925bf2e7604fafbb19e495c906,0195d67c8bce945c7d5963ec8fdbef0c0b6cc9fab28162864a339966f74b67717096da3f085e01c40b52993938081dd233e4dc73fba6c57b938debbbb31364f600,5860ac86c09b7d4849e8ea39688ede2b250c1d050d89609ebfe44e3a744568a6328b7c1741e37621a3964b03ebb4b51daf1e0e5afb10cabf0d7544d242b51c7f01,bfa1150b66fd117f2d304d1c35707cae763f6e81bfe3f86a35cd75e2bbb5f4e05e2295ab24caa09d38c08976d4f5814b8fb56172e1a5588cf206dec2a6bd7cda01,726dec8e6bc61d72867f35dee9f61af0746385ec35f0fa381588c62f686ad28a481ed484510761a6c263d1a7efbcfd8504c36394b32e4a00e9ad60ece278596301,ade55074c9c4eb0e7a7b154bb510df471ef73e51c35b187f65e54846d11753bb31d285f9d7a0fa635ecba1364bb184d9ef8fe78c4da1124d66e414946d94897300 +589077780d61fd2155b4932629edfeb9e9b9fe19ce768ec11c91a8024fb93135fbed93841d1ef3d7d6fc5ea91ec17f4efedf214e64c0126b7382e41d7924ca6b9da46fa8b0e261c36381d2905d03b1b462226236ae12a6b3307554b61bcb6e33c7b212bb1fe7e07749b34b738988ebd43192223cf6077099fce337438fce1840cf7fc0f702e844af40f3638329c6ae328ec9b37ea2da35214f1857101de754d32231d9eae4d9956930df9f9835939ec4bf8ebef300e23c834af8e8bf2ecfa47bd0efcc35d752d9,dd36e674a66821eb8bcaa4818c6b83221fe9660337534942bc8acd37a692a99f,b88b843d877fa38b38d2f8a06e32c2030a82c7bca571cbf8d56da212509e7fdf0c47e6abd48d2a41e94ee7cb9e4873d500fff276de2a80e4fd92151f5b0d7e3e01,e5136ad7a8ccb8c1ffc48e76bc44dd1ed60c12abb29a53a452c1ded0c87e70de4e5c11abec7f87553fe85d578b81579c0244800f7ceacbf772a0547bec6d11ce01,24c68f39e83998f8c46d2bb5fbf537f27d96a5b57c6d5361fe6c989a48ea015431ab8cea1cc21bd5e5fe19fbd9152b113a7b00c22dd0a5fc513419723fd154ba00,998c4904ed0f4eebfba8a9a6edfad19cd27c15693cce2a5ed94aa068155719ee6d686675fbe523c6f15a62833d2eebed4a272f16851f6034decdedbff2b3a5a700,aab600ab1a14e1c7afdaa29928eefbaa46276e14425fe326ee4f3666b4221c35036fbfb7eaadfa7749f31aaec7ff99094ca139043cfd4af21525af850667282401 +4dd20ffc602f2c87b4050e4f25abdec6c5da0a3afb9433792be7c9312cd741192038121b949575b1f7adcc40e5079f5331120820b9aa09bb2231aa86e772d31e63f4c43ba1f227a92a238a23c81553763ed663e6fa54724bb0f430eeb5d210929c4ddd72675a2f348aa51e3a194cae78009a7ac64966b358ad2a4847404a51db7281b45d0228068bc6e231e18361d2a1088469022bc3619224a93e8e4f819ddf475e9b117873c4e4176fb7aa58dfd32d42e76f34f198b8847706e0ce57c548492ebf36db540e51,efe5b3ec4efec5ce93617c7bcb56c70a69918ce79673b8154c9ff29024147313,a4ad7b863b88d22e3732b9648de6e94da2ad14ed7d3a8f92d1b256985a8947830c047641dfe4635918e9fb3c4aa067897db832d09b9bf7a9242d868b179acf0900,b3744d7a84dd69ac963c3fc6ac72988f04f90629eebdb59d72d3d2760d38ff930e6ebf90622c106cf773a756f033d3e34c0384dfc7ee52bd6f03f6e079969c5801,38476ce247cb2058097c22eb0a086b7ed212c4e761be5f781b51dc548c5d74080423f95b927c288d408e7f02b7b25956be1451968e30752fea6ba3fecc1716ea01,36b58d43cc891048c6c24c171e4140f9f66159b3d1fe4a08663012183a5e587f52eecf8b8b1f3fc2bc40dd19d3085ab59af5093b92780cd33d3b57f846696e4900,d734794e147dd89aabbe1bfd700dcf6fbd7cc543a630a36edf147b224258a608792c2b08ffeda4bd42a46c3ef3e3d71e96575f2729d8892c73cb688587ecf90301 +4420a550a7531532fd59fb0a96c137c064bda75e3d8079c522f9998056538d7655af007b81104243c6191d44087d0837a9e22d5fb986560241a1e3459d0538d5aa149cf66f34993679ea57bc4ec59b1b9fb3b48b85ecace04fa43bd4f31abd6723e8a54a8e1fe774bfcd92463c56d7a8dffedb3f7c9f6d3c6c000b841a7fea7e35e1c42f5efada4b75a3dedc960ec3ff95e972574141c3b6d39a30fe71e6569033de8fc4dafdc49f40d91376805b0fa46a667b68420d11a68145cb60f3fa6a6c05737fa22d25f121,e41b8901285c6cdcbea6f764784b2d866a533dd6a3f528a6898500edfdaa7103,2972036c5f3802ff485b16fc88961d2da757c188fe9975ca695e87060302f57b5f04c2f6cae80418fea5c3260ae14056b881d1237d9c54a3a7650c1f0de9aa7000,bf7eae82b15fddf3886efb207e1c55c7c8fc519c0a0c0e61443ea6db14f6bebf032129e054990a5b51dbb79bd13416346e46febe5b66afd5dbba02053cfa8fe401,790c9e0cdaa0fc43331df1d4128476d42de665ad66b532c061cf7a2a0d114a7f1fd91f82931cd82308ad4ea5099e9863ce8cabcafb49ff5f21aac9edaa99f8fb00,6a3b38972554284461e6074b52805519fec9552b0650d96c1dab980978df224c77ff836828224e10d87bd668a146640d3dd101eebd502295448e6a5cff0e227901,6213045e2f25b6a589e4259806fbd00ce88fb12acb90ec29f3cf3c497685a4c10666883f5dcad86b322aa9699a83592773756caccf513048d0f3d1fc87a4bc6401 +acab216d88d175a5ab60ac26ee6610603fdea81086da44e78ebbc2ad9f672d5607ecd5b3cfbd0b8d1b3a307c61f61b13b0c9716303386cf28f9693989bd0cbcc3627a10cc140bb8c789bc163df7cfed9bef8606564e55a1ee4804b7d5536c31620bbb16ccf0d73631fecb932d63ce31532225b188789a6f1193a4e72a6669c9d1f5a89c5c2a7e78b29f00efc4560dc5d56b2a7b68fbad30c0c415e5f8d7ca13a702d08915c13541b9485303d22e3b92884a300258dbe1c9cbc0b402cd483d838ceb973e1f99502f0,21b451d7fd7afe20948d3b1287bc48504b3aa8488ab1d64759adc7c46d5f0ce8,97440f909f6993b0b02e2ec379d97cfa6ae5bd27feadb3c1fd9aedad55881f405959c8ef73fae5e47f7de779a5e6f43d56b233c52d5ac7d5d79b6ce433d4497101,fdcc1ef20efe68c97d9257f0a76f696fea25a87c8639503c953c66fc971006fa48094478842e0e7ed9fb5968d30ee8b0fe1066bcefb9261f292534013e0ba17e01,3744a3bbbdb4c3084d67c7dff8b9a1ac0413d104268ce7b522a964ec612adcdd1b09e56d8a0849df655704297d737c1ef54320697ec1e60c6a6c58215c671d2600,b101fe6cc34e73d893583c67f5530eee080a2790a79987f9be3b890a160cfdc44a4f2bf8846e891534435566962a71a0d2ef0012aeee0c74d2ad8d8971eb489600,cc39c7dcd43574dc252864a854eb689ff605e941ea6c9f54040fbed35ea4be9a1cd0742623f749e05cf9881310d476c6c5dd62b813a2002dbad9995dce611b4a01 +9e09c1bd8ae9985a7495613d1c1e82cf609043a019d6b55aff700e29218a63f5dd1a8cdd2b909cb478a87f402f16e83fe71afbc2bed8e92b21d254fea9acb2a54050bcd9474cb84c641b6077ddd40c229de5f2e3b66aaeaaa29e7b83723a33d7f201ca4ceb1690265d9fcb9e26554905e90fa268cb5018f42e62aaf8ff8edd51ad826e962a08b79603580cb96d20946238957cc0b687a165a4638aa878263753c43a673571fc8d38e8b3346a4edc0fb61b6438901817da1b19adab38a07b9847ef0a49a83a63fa51,847968949eae307ba46a96283aa023e5ef85e13f335e5ae8a917e94861ff77c7,bfc5c43916d401f9a7ec3e987e01a6174d17cff68b6e17f9b16318cb723955f2732762189ee9e34cb7e9c4956efb075477ea3d91716dc48ce0476bf08b2ab2fc01,bab4693233ce57ed503b234cc0282d93aead397db51971e9ce453890fcc10c1b7505b0026e4fe5c8c10731f66473ff1d5e3d990310aaf6e285e16964471757d501,c0ae53dd94e0712ae88d3feb92e2d60beaa335d894ee1ad614fd4e180caa324f64cc4205f38373aec6db09d8d828c16263239a142122c9de6111052448977bdd00,fbbfb18fe6a6d5e386621619f5a9e5a4e52834c9235d0eeceaef22227aee4e5120a58a6b0fc85403cab790b65963bcfd2556e4fe125c946217a1f259134d295200,c9b47fb6423351c1d5f417355d1a63839edc17597751b16cc28273f04e033c985b4e1c597081c4ce8fc4a1d6a4a2a8a3553874ff3a01833495b468a79070089b00 +c2815527795a37a3ad408b338bed0aad6c1f3ff1cf1283cb00ca65134484f89519e887cf0898c9f4ad8c8a79f07c310cf7c768f5d20d85833fc9130a7f4f1221b96bbaf451228ad06cd0d41a540f313fad94348650e8bf5f9f9a4660fc26dc41da5060b3d56ef45554323360f0127321cf7537bea2dc00eb5416126fce8743758adfdf70e8c5be60a96945f7bece3f87d4f17e25bbc1ed3be4d9907be17241cb9f77a2feafe21188854d2b5df094178b3eb3e72c711e68526686060eadb10b9a763f1d2768b1ef91,fa9d2b3b36a3793c481972351cd3c5037711bad3a7ae9a0f68aabaa08bac6a02,331bb288caca2b00f1862ed2d5ac5ec213585aaddf2c5fb5bdd466d27f0289d35e14781b48c07c8c26248f1c7bf9ab4a32e74982354f61be73890d49c6bc7aab01,f4c7712d153bd51334f28e24b3355fa33c60d45b1b129fc8c11067d476fee47235aabe234a6b8fbed66637ae7f81a4419cc7ead2bd91c49f7662ea06c5719baa00,cc182bac5ca0a71283cd083795c414779096197075ea832c5fbbd396824c299079f9b1eafb9fe561482142fa2a23433bccb4fca6d589516829f499a0216deb8901,f5115b1ad8fc6c015a71577a44922f7d1de98b17416cf41a3a9d52d16ed3596b0bd4f61918c56fb2327fc51a2195238ea172cb3700bae27b26ad2e560fc1e48d01,54d339541da27f83b1075174d9861bcdf9f03904bfd63ccf6e0539227020d40049184c235cc2f08e621c5b132ecf6a8d5a2b4d77ea20fa087f089ee1ba31363801 +1f92c213ef34f8f2e6f29dc5e9df6168e226806694d6c4c665bc4ef28e8438b5080c6acb18f73491a869d60279c68ed97147c5b8636068ba3a6f3783b69a3ab6c82f4568cc267479afa31e8f4f00f1ad1eed6841a7640e6cb4ea833af85ca55c0d46741e36d1a78cb62d3729b17893c84294fef10481b1f21c1bacb9c09176fe3533ae4b72a5ce447c9ea7f3fef1f47bcbb21a65b4a0cc3218917a51e0a922e9b441272fc58cdb04916c316b3087b9131b951e0202e0d0fe6bbe445dbb1a2ba266885575875605b3,0a00c07db7dcbf2d8f687ca4d3e21c34a8cd49cd2fcce8bd1a3833893dd6825a,1957d10de48d279ea905df508283e5fe1b0e0e43718adf293918b05466b37cde06af9d721a50506e535d56f18e5f33683098eb116fd2c2cc280b95ec9105e41800,4cab28f466b391ab9040fce568840adbb5870e6de6a4b76bc34caf26e09c24216347f42d04af2b9e1e945360bf876ecbb7581c84c75f8100e0ed3b1b6b8a2c4d01,ffe968ad87b4d7b8ee006041acba76df82a9ec9008d3862cc0c27502b4a8e8be64ce54d6b89b5e1ab26aba5cb1c0937c10cb712ae462211a413fc6f7d68006fe00,56e2131a0d8dabff67d3ed2d4d86c25ace34ebce6aef61764e2b9ffde0d5c0537bc09b2b59a7f17989aa54f9395ff1812bff1eb38a1061cad9d4050300e5006d01,ea6a2668825f85c107a15e8b8c9597496751159bf2c4065a36353a1f57c80a486b19ced99426fdbb66922b5df69b10e5f73a02c15297edb98e6ef58cfb3dcd2d01 +26255d5420b0bfef4c6c24a1130c09f00e0aec2e8f591b33d0f2680552492a781f3d1cf523493f5f495ab11b2fe551fa600e19a5140ee717159f943fd2973382291aabf15166a477b7664db31b9227e8cf7a299ce676b1fcb07d122edda2d25c92d65469670963d7e4840ae99874008b4c735ebdcddbc777c20c8e3cb4bc33e8c551e23995512596f6ee903bd92ec629c0497fb61ed9a106af806d0ed85f443f29c602d00ed12b0ed8e04afa2a90f93f65ef508574a21ed26c04c8eb9206879bd4036468691b829c,b4714fa9a17953bc7a484847aa8a237f44a2283cd16811a99908caa22ae48daf,39a3e7e7c2fe8490ea74c5ee578e7c0d9c2174e7176ef6557c3bea47aa48a6e11e5f4b5cacf57a8082bf8fa5332a676bf6ef0d97a88182e5af37abc7b40c974700,efc5a6b381fc0366539aa182f740849f94b6772651b8c54917bc04ed098967a92a9522d3983fe61f7b5272e558605503c0c559d684c80044d1d9cc832ee3c02a00,349c7e3c5bc404dc9bb9473238b710afa96188ac41afc243aed7471606cf27d04c8fb86864f81fbe4f53b18e44614b736a94994c15fcfa204590b8c003be72cb00,de23ba193c3c4c805a7ba8f9b1dd51d7ad7c7400c203acff4a81fc3e97d89e23318ad053a4fb48fa41315036a2e4e2d8fe6438f1f26b39c8e7f96b567f1c851201,ca2baa3541672601e980ae690e5f0980afb484010dc04c57a189d1f9b45b782e7a612a913200342e232f3c59f0c449fa2ea69b6014ef85a3a7bd1c15292a9bd101 +f65cc2aa8a83554fb065e239ef8663541eaa3e754009fa050680431c8af0ce60d486193b78d7fc371fa5540b05c6863a0cd2b367f78dca6ea0e1f64a78325d5cf8714704656f5240a59b1198f9963459612e933f82e68f3a1c652c0a3cc82456d2d1b0acc8d98d98bcee508ea92bd84ccea9d52a5eea8da3b7e2384b9ba1ad956f06f4dea4276e8cb268efefce149b8e20c4bc124796235ed891a66ab956fa9ce55c55bd65f368fe189359039b1b73961d76dc3c64d83f82ae053f09d29ca74262c8962180859f1a,ac9fc9a68bf88250f04ea2cb69465a1c014ea20c801ef3ca0bdba681aacf67de,5658b143758afef3ee8fd70eedfb048e78656073a61adc4330bfea116ecd5a8e5adffd9bd3f340be20a5e7806260fd040be1bbf57ec365ac853860c8faefb27000,be22bccaf5aa1fc0ea5680a02d3add18e5466d0685d12fcaa0a802a415ef48d3564b70544b923f9efad99932319c89a122ecaca1f3e564beb4db4435889ea1c501,1c794ecc79b181627a90cadef0702a70bf2bf2f5821d0700fa2129436fbcbe1271243c7e264ab6041753e45c9fd27a04e2ef668b62936205f860fbd5761cbdfa01,0c1a09566cad336849e49f34f5ffd532b8fe5ffae5554237c1a4c6290d6879da1978f0157589e8e3e66d119bf8cab80609feec5de4d1bbaa7ea952a1273b0d8101,fd1e0a90ba0f8030866660362efdd0c40a286c3b9ffc0528fc4829bf4cad3f4d03da36d365ac45559719c2c7bf1567b9eab5fc87f254c007804a5faac334132001 +2fa1cf302d4e1a76c983ec030d331658358936e400ede26a9ca40e4e51f07b82357d27e5d3518c94b1b67780a1a36672d3eaf63c6ca2e023ec08a1e52f41d11ce1803339d859b6109c909ba95f371782e4a8ce6234108b7e15d4c0fe568334c04168f55466bba45b06e6a3933ebb92610b55ece1422a9ef775bd62d6fa3d8c193b36c31e730be10704de8376b80d432a2c6265605d567147b34600a7b7892da78c3821173cd719913ed7e2018061e57be0510a02320dc2983143f8757b7eaef9731280979be925dc,bf2ba7b6b36d95c7c5698703d011157c20ecb60e8008b8516f4a1e50c8454977,c92efcffce1c6d811a82dd7742d4801c330b0a3520e20c80c2c57b0fa9f88d215ec889674c526f27a38235d8800f8c4366aad6ebf36b8910ccae09d8e5aef74700,68b8befb56bd289845e9737c0c54d9cbcc9a5b361df61f3c59009910c97af9092c5708161f94d87b9b34e2c53c7958563a51da168948a2f6e5e05cb922bf4ce200,2aa6c406faa4306ecd36bc49e92cd099e3b16d6cdf123c30bbea45ca636690db55e99b07c3f165a10b48abf05d4219b52c1b39097ed52452aa5fa43b96b1f7ef00,6e1b09144a794edf79063c088ae3207e61080f98134a1caeab7ce167265d98cf086b480aa349360cb3de11835c4dfc3cd1482de0f594689983b2e3730048281b01,bd7b0433c6184df4440a530135349b0602d66f2a8a7e183e028b03a099e8f75f69a6fc6f6cdf58ceb2ac3916df520514dcc271c21fa85599bac54ee2199b898901 +91bdd3be8301993670af176075d274c8ead68507173e0e0c19a195fa16533e55e7581dd29626fa9983dd69e98037bac99167f50d04bb60c3d285e1aadad9f7bfcfed413248f82c08a4154e39624605c335027d1153679d3f34f2c914e8e42ade68001626c402f9452701daf31fd57f7d081f29df44ed6624b3cbb4a074816f62b70546e775ce16c6a91f618dffb8c862f1039bd0ba33a87ca6240febe214dd20cf282ba6e4508b1fb9918e679f925c8ee60fefb264e62fc6d1410f5b206faeade7ef739131bf8acf,bbd29c9ae994fefc2ad187fae4ffa920a351d7a9829ee2ccffd3fde2ff7b7ec3,0f240dd33c7c33b52ad980b19a7105e412005876a68d7fb41aa6f5bf99a550957c3fdebcd85d545b4d9bf073e3066d7c5c10e3f54e6a672f0c407ede9e7dc00200,5ab7ae9146692eaa1e07e6e75f3441f49e4d36943fdb53cb0ec02f3a05cfbfb70615bc571c98dc38f29a805ff5b3c14a448512632237f6ef57eb28b92399cf0200,8ffbaaa72aaa0570425bf1e4cebfc10bedee577b96d1acab3aca0db3c797ee1079706b94f0ee5d7272192787664a4d0ffbe48d9ae6f3a960b5d48c32a88d957700,40785df85dfb6b5b9ff13e2fce684f6636a9c5d125b3ead31dda8e52b3111c2f3662be67860ba8753c984a8c1d5bb87274ad98fb4a2e82f090612e672db5dba600,e8ac36aaf95ccaf2870578b9a546fa34cb58506c7dfb68ea4c7d4b3d919c2b813eef3d86c4c6e467be018789ba58c8d9eac0f63b076788b3128101a483f7f43f00 +3dbf0ef2c91cda39813534ebddd212d7080837e6d9a5487b4b749f0b0b4234a9d2e03f529a4bba03d92b7c7ee7d2df87f65ad65da1f46756184f41e10ba89b6440ffa7267ade1c93c5400c1eaf003d2712ef904cc86cf0e01ffa2008a49bec6f2d5ccd2b93b6271c52f7efcfe6353d4ed36c8da0f235230625b13ffef1c508f8edc8f2d7858274f30e57e58e001b5a479dd824d024195cecc9cb0c936fa30605aef04ee55c33f2c2335d9a3338b37a48207d8da8a62b7d7700e6099af5d7f4325fda215213dc4e58,69cddffa25c74c19167195181ca6aea66b568d0c3e347a76889f04a5e1224096,78809f7cf683b5d110ad15e2786d337067679d11fe2d045b725c7706211a3a213d6206b9df8463fa1a1a85b7d11c44c2c1b388e20282c482cd4edbb482dd279e01,ad2eb2eb1e8ca995d3354891709fe2eb9a654af727fb8d5a0adc0a6f244decd543cd1ef89add98246f70018a5bf014c5a85dde9dd4061efca6f6371d87652ff801,25422ecd7cb80d888d870f3137f312a45d34e80390919124a2304d29d80943a656369bf91dffc45c8d10f31423b9f4dab1eb1e6c1b9ca239a62ae2133a6e41ab00,f861f00f4c10327052f778f455d849b5e6daf58f9f6e7aad25a77382e55561cc5424823e7e4631972060f21bf5ff984aede186ae9fd6c1dc9ce7c08e66e1118700,590c7990042f7f2f3fc4863568e97e83a8df22d375d0b0dfbfc042b84d7abe4e0fc323627d64aaa47e034644fb126723d99bb24453a5c4025395feadb406033500 +5bce08016781ec10e1ce99bca34d6c8eb8021c04dbf0c369f5c82270fd4ffb1e26deafe3a562dcbbab9f22c8511a50eebd3238643a510fa5c26389ee4707a64975c84516977ae91282d667ddf44b2608e0e4f5166e4a99b8454ce8a65de24fa2df5f48d25288ca82eaa5011b01f6428f29ef9d7736db5a85435d781e8f25570238fe502ea6bbfbaa7d8fc0a94c0a1218ac26798b602c0c18f4a3ef9347f1e59c65393a5307d28d1beabb94a729356da423bd4c8612b64039846b3b16349d576aa43f42190d06cc275f,19fe19427a2f0e11d2e28a321c35e5496bf7bd2e0bd82a4e0dda375f914e85f6,c97f55d696bc126b03353246e7dae2db9cd88177470b53702d78376f9e6159f63871f1c244eb8831c0eb1e9fa9f2ca14933c704f51ac63f90de2bc84b046b78c01,65632ebf152926baf3cc076ce92427cb8a22d3868c77d9b4da1866f0a0241e000a301f330f2889af15a2b741f823d714e68f37757e6cdd2d3a5d5234bb524c7a00,691d96af0271fa5f8c9ada6ce94b6e45da0e3e1966e5ffef2a92d62a0950a3425204c2b187c6b9721875ff1071236e274a5001b4a12d3326894bc26e2df4d8cc00,fe8acf4521a587bdcea3448817d254703afdf16f33a671818a7ba4e7b25a27e0365725bb55d8d9840b779a8cde884ed98355e0d577533e4a324332186af4b2b700,b722f150dcc5f3c546403a929d0e482e2caaec0bc5d4d1daf83e1fe237a71e897250d385de22d2dbd7cda77143ab68c359126814f77d2df6ac68a9c21dc1561b00 +dfa728e0f6445f9ea3253ea3184bd015a657fb9ead1962cafdb6844f311c5744d950ef83932953c9085c506e5a3e7e9090303da1274dbc59888e771fc9611c20d9b131ea8b6393e629ac1298057178f1ed49822be79bdb157e3626b5192f3804bf8b9c50413d7b7fde5cea7941facb2a315657e88a33f7e811a95a98d3e3a394838d56f2fb929f03544647342a33446be65f17685813436dd3c5809589f126c70e7d43d399dc91f55b0363004e339eb4c24941b96e9e5289d18f0d6de99ecbdb3d5d497baa12ca070b,a83af6960476521d9de25928b276a25b50bcdbec82f369b743ea8071318d0215,62e5382ded834a1cdd6445dcaad0a88503830c9427b61da7a3b5258c57cff6df6e6ffa04774175e0e6603d390f41e15ac6f87e2b053bd73e3e8446b111cc678200,ca5ff273c398712fd6c4fa4d0fc38959ee19a6951993fd57ae1281e18eba46e61270b33c5782d7b8db651ece0d385cb2102f44017738f37421027d73acf8964701,24a1e724ef2b5f5fd2f60651e2f74a9851de30e3384b655ecf39a54fb656e26c5ec7dbe3564f2bec42571fd19d43f8a539c851ccff11be196bc32c6b19e027dd01,1ed614b468183978f94a633db78a2e0bdecc7fe3df9044be86605e0a28cc6a423ad3263d5e174d473476ef9024b9547013d1aa399e2d54a10be2d6d7a8b6e44301,bc44c132f62b876ad6b8b02fccc16361029405ca51931c514c16502ddce9e5c21d9f4f57265048b120cef7bec8e27247e81349c6190585f5d810c2c46dce1b6500 +9e530a2a07ecba9f91200f3bc62d2dd53a88ddf8c05422876c5b13ca178a0c91b632f224a97dc4ad47692939f823da3a54b446131cf03dfd4e4b2d43bfe1b47f682ea98c156320bf821b23bd70e852979e7f9317b309f932955e1046ed2840014d7201d42a032779e35ac6c5f8e3927824941ef162be3f81eb97cec680710b35b9f441f26123132d7c4f1ea4f760167b1f61e789451092962eba81da07a65b57ab6bab670bc98448248b807175ee569bfd0f7221ee9578f527c134b93d38867a5d57ee4900623705dc,c142231acd143b2c439a9613f9f5a9e9fabc2caad742d2fe8398ee5781e05d0b,b6e7a8f3368779b7ce77c67310b135eedd311ac8b22b2437b0ce674b27b2417138502c4f977dc3715021f1cba21cec62de02f6510ffb98d194ad4c227a2ae14c00,cd1df12893d671541d204b7d390818eee165c74714a0997d1c1d3abfabf1a1f90bfd7dd29e64c4a4f42fe0f0746a0066722e59e2ec18516d6c4c82f20e682d5c00,9e72d50e377ed2adb444ef5c2861b61c43a56153427dde901e8854dbc6e7e6862a0d2c3b95b62802f69669afbbf1e00b0696b938389e9310a2cd9d2c3ab739ce00,2da9a25277295d786fb9e3eef1e8beb633078603187e077356d6ffe1c17e245974af2d1d883af5a929a79fec265db6c5a78eb52b7f26e5c7f236a12cbca104d900,e14b53417ab7a2ea1550a46ccf0c79d29b1e659b025855f4340cc26f4483f5346e7515a32548520b7f2371c38f731a29fd133da13eb754b01161d13f2438410901 +e3bce0e21ca8b304dc01b5bd73653ec20ea632dcddc6114082c62a25731e751c736b974128d44afb659600d556051024edc96fbfa6b92a4fa04ef71d538e88b1ef7dbc65de12d012ad906028479d305eca69f84a8316cee310990b82f9fdc33280a9ccf56521fc21877a8a921af6117466a7fec396d4ad350c29aace2314790d9a67141ee197090ca87dbc1a87e2299cde588afb7ad9babd12e84b1a377951cc8c19c0ba8140b0a390c947f195b361606c41f6293866073c0ff716d9b5c526c9b272808c598f55137c,c6577d4556088fb436aa99716a9da7a345aeca7813378e767890ea654e89239a,58c84acaf079dc6d61645cf53c8cc99f96e4ad8d1f2678fdda50f8f9cea2b1b408c603e4390a13636ebc7457e8ba14066c4d0358b98089f40e2cab574f2b2b3900,da9f27d42d7ed4c69a6ebab12563557e227b4a4e0eaaaef3f58a79b24a1c5db85b2fae4c03b41d86294e7f38a5a3c83bd331963800c87dfa1c3b59043f4aa06000,fa3f9af618f81bd0f0d630c08899d080ab1e8ba4c34aed21476170b815b6e8ad5bbe60bfca512c69744782a097e4ad85733dbc884c39df163e0c31640358ac2300,c501fbd0291b6f7afbd37978235c185b39124804ca9076db11b87ee952b350886c0274ebc88ef8dc07458a3ff71355d09452736c0ca780a4a309764ad4c4842800,11ec583e0ba7144f1f33330261414a97787177a4870ba378e3f6be40a358ce4b4b3fbdb32f2b5369319b1ec48a6b0c8d253c1d779f009506b9011d63ca22639001 +64010bd65616ddeb4bf71310d171e367d989f9bead968a16735ec9811d3754ed218d2f0ad279e7ea1ed1dca197b521d53c88dbee2feb0d5706cec09bb5938f81c74deb148938c9774a2529b68dd4675279a7fe78c34385abbf07d7e618022386b9257875e066df33a23b47d312fb211a51305c7e20046d3a6b69a445d957b54b8a894cdb1c76a35d49bd8efae40813b2bfdd38fdc857bb59df60398b8013799ab28acb8656aca4b5f6fff5bf822d9bb2410cff85cddae62c10a9816deaeccfd7c6e5d0c1feb4827195,6a6744b91b26f47f106a6d8f92eb6c0e3f74ff9519da3b26c905fa18c8006309,ccbbd8b6ae91f52a07fc869fba4d83a2783f745f51fd5f9e7071c4d3993e14a5189662c9a4c3ad1f35391208561c2922920dcfd68d499f3dcc1f2a4d6044a90001,538f36f22952d6919290d5045463fdf7edaf66badee25380cdef0c64916ad07b5978c111da32111b21de0dd8877c79af87388765489a1450a81258377c3310dd01,aaf16a25833b3db2fe33decb63a2a6ed2637a9328ded1db447185c157bcd57705597144e9bda383274af819e95fb3000dadf6204987c82632d48edd0baad72ce00,71ef57405250af3527eee0e266e9aa4a14a2908d9d6759f03e2681e7dbc5a22b50553cad7b347fa0823ea7d5690720bb314a99b89b12098fdfb0765d44d372ac00,3ed2649cf809cd816d239108f2a048f3b4260d40017e8b8164b35091d36f1f645077e7ef30694712bdeec35ced143efe2785b0849e562426ad29662cf2c8c11f00 +553e31f6d50f15325832ddd4c974b9ebff0d55383911b2371632f795c6f2688f517548fdf63e0352c634f120df0ea36a5aaa1f07968d811b7050a8120ad7696c8e2ab1add57fa0c0c7bd917a3c49601d7ec3f8dc62863d351a45505a684c7bdaba7428af30690ee823f5aa46e24b883d08c1b49418fa0a66371f69d2afd25be98f56238fd5534069417070795badcb7b642ede6cb80118cec0e4e0edec2ef9f377a1d7ac6178758ea353b479a77324388bffb963ba869e19ea03b617725c824236320e6218768f07fc,285518c9c082a57583818c735e42fcefd6332c3eef1aac06b69e10ff4fa5d299,aa60738e61cd9ab5a8976dc3d2f95a451f9f374d941c03ca807e765bd1aa56165f548f2554e7b1b4a4764b6091795c40a1281d888277521fd22bac071db0f86001,37d35bc08b8ac92e36554ab52bdfed87f9037f2a32719e77a586a5ee3065bc1f2a949878fa2d64f0e90c0461f7597d37f55a8dd9281f9044a00b391796bca16a00,c829eb072bc5a3de9a6415be26054fcf75d38e13e1b4464ccc6111e4520b005a390a1f7d266b8e16453997c7838627e7e7135a424bc802c25805c145438a7b1d01,695bcd084c3e6730aec3791026acce922208ce3b37c9162002a61a005d2ec0792b974202ea70b810ecd3345d1a6aa76e1c4a155f174e2b765e1b0960820a35de00,cbb61cd49975186aed2e373475dc12edd27eadb52005794a304ca05bba8432c93d16e645ef2d70ab053aaea82e591531925e9d7dd3a665a8866425b3ae2d088a01 +19e6986ee0712a5f3fa03e82dde02c68a731a735fe6e30ff452cd03bdf3663bbb367904d6cc3cb4f01e2c92939869e32f9c706a41da8a7adf499f4ccb91fcfc02a4392897c8021bf519eb8ff1c321ed9c2aa00bafe8031f2992da7d448430b9a037267e4181a7902da1174c00e18507e641ca7dd8ec986fab180c8ff26800172f1f75b9bc504464f2949f3218f02168c214e422e5a56aa152a86cc26396fb00d7b67fe701ec028a31b2cf2833334482bcbeaf9f148f76b93a5af781a9e2efc864f4f5dfd415449166e,7dd9b3cb9bae43950a1b6f2ef66f6d28cd6258e66af0711e3b5de1a7cb841710,56f5b1272ebd241edc6c805d06dff54d3c6efa8aab9a25394cda0ffdca763e7e1f217553a97fa501d04d9b98560b06ecda9b74d47fa6460bcb1822df358de1b801,e58a2171155568b34f1865c4e5d6e7baf3ce74c5fb53c151cc5190e2bd890c35345d4634a5edaf036099233221b7898f7e34f1a1cb80b77f6eaffb8e554e3d3101,6693dbe2766fdffc6426986d4db8f3e3cb30ccfff98b04dc67f22bcd436bfd184ad858494ac796ed85d0100ec6501837aafb06b7f196a55b199334fde47f0c8000,22632653eb444228cfcfd7538623f7b93d55c999d0318eae7976767f434dfd2246df6cb2bf3dca3006fc9dff01b4685b00ca4eb48aec23d3e54a8ac57131570300,0050c09efa545eca6eea609e8ad3309f9fc38a0f4179281076d0c8214d1a331144da9afeff9a0ff7bc3d46250a7edfe91280f5a61d58e5798885a7cd6ae2127001 +dd80847cdfce424887b44ed861973e80eae566c3293fa10846cde1489ea239fa405304148d9f2d44f9e1569acb710f702932b94c37fbe820d6773c525975eeeac3068c05097360524245ce0abd53a16a894d81a6eaa34ddb1323e5604af4101390ab187427600035a85e7cfa17511c951dc73ff130d0a0998c102ff08cc570657b4e53d0a3393086df99ca173ddb6d6f4b96268ee78b707c9dcda0035b09a3180859a895d70270ffc60372ea896304db8c0d658d5df09f307066b3e2124a14740b586a10fc918a8982,5c043a811303c9c694dee902a4267724130de8dba2f753a3fbcb5afe49776ad0,3a245148dcab800cd7e4d818304c0cc25a1091c30ff29be776725d752e7b5f246f2dfae05ba105f4139bafa8d2d757edd36b802ce24399801d6a5244e4acda3201,bc3985db0e5f2c312b1b1d6f9c247dfd6692dac43d86bbc01e4c9489fdeb4c182c40abb6dcf450b608c3f4bc152e286832abc4aa025bd4b536edce95c544fd7201,28a42d2cb3a799ec4810337a26d1538238a37ce0f49d90f3ced81165e449d04b7c42c5ed97a68e69482c694a2f7aabf1fea832632668e65d733151cb452c9ea101,eececbce6c64212233476e62d4dfc6694a11f4d13c8d5668564724568d08c8da49aa224f2c2f2aaf50f905154bae8cb37e5cc1d1402ba9d9230f684fdd292cc900,fc4cbb7796054e95554627eb2df1ebd21a3e0ee58cfdced4bbb85865a19e511b0d5b82914b4376ec0c7149fe59c78b661d2494214b3e0ef904fb65ba3590d68f00 +65b1542d6ef63d1b66294355958c5f1f4f2218128526c82c44937942110e2cf1e4345c1be8e7510c42c56a8a48eb7fd0bf63e03c82d49d796ccdc14a6f0b5d48365d90f362579dfb0d0689fbb9e84a21f33199ed4c1907f1455b163a58aa2442f8699fcde99f6e316a2565d430fbfbf38323d871c335318a307d88740755aa6460b1b98185a22c2bb59460c6550fa7df74797cc1d8be46bc9aa22599f8be9481c93e75375ae54311be6129d8d35451ec04fef964045ad5d54de2ac08dc6d1c88f19019d5f2a32129ca,07e0117245506ae29960fab4a5b0ce10d21745745aaf01887d90e3683289bfbc,06e00075bca97572c486e24487a96b2d1715c9ea1db0d9dacf339fefb4bbc04b2db5b5b2aeb8c73b78ea01bfec4f3a9baeb59bc98b073daa8eea1116178d62f600,6cd7b202028d5cd726ba10b70af7f1e50e3a545e7f0ba8732a0f2a21022a046750a137cba693cc1790be788be4f377d2ebe64195552420e6da5816fbcd881f6601,a827d4c93a28f86a993cba5f1cc23478f42acfef0e438045537ef0e20731cc5f0088cebed9ed1fd04bd22c39c0b7e2791c5c1d2deb425e8d0e96089dcacb3b4200,b2e1635f217d90a0d76e05cac68c73b3c02ce9f55b6e83b7d9adb2cad338c41637dcdbb481ff4c3dbf56eb84fd7660bf6e1bde1cebb7952ba56209e9395093da01,94573a33bd1913186475f6e6d6782aec1e6135b4a8497be6c5ed5e61c7a445d57a9ed77639f0fc03bc9da63084daa75b10073ac61f94f84eae7a814a9d3400a900 +8348f7ff1bcdcf4663042dc86669e0011ae64577bf496f2408c1b5e3c47f1d18f2a38f689fe9ce2932dcc4fccb3f7cae1da09f3dd6ed4c4838711f59f974393dced524de1afbb317ac2b5363242f01f1998123f670e444c235419b50eae3de463cd9ae7abfe913eac796b56a7c990e788dbffad9d635971021163a6e12884c4c3779b984387485751506c490031865f912465e0cc84774b3dd775320af78da35e5f83a6c131e075fcd9d0014b2dd78cd477ffa2c974822e47bfe4ec1ba0bf894935fb90671819c6875,fc2cd4c35d5926ac10529c8fe16d6cc5c0b119204deaa032c8cd3aa6063f454d,bbe59c6a4589eab026b38e7686976ee5dbb5cdbfd8170758dd5b7ec29cd145921ecbffa3e5217419317d18765fd7f274394dc91a41f07d339f8adde53fbfc0af01,f811f1b2d0dd15365401fd9a17ffe0da69ff783fe59b80bd58cb6052e8fa85d072c24009945c5680370a24aecee108c823f6f56bc7be3d8da88907cbe02d069401,cd33c7f6f4c31152dc7ec9593cfd18514fe76f8dfacb70e110e98ec0d5668e024abf4fe9300586f330261c87fd75d6ea6bae00019ff52f2b19e528b10317724301,91320c2ba0cd82a1ba5fdfb30a91976d06de98947a50b904fc8f1c8a3f64e50346a7324ecb43c902ed658efc6c4d1f89a69af5674ba73ed56e189d117a4d8d2e00,74a5171a740f435766f030a71d51149ecf06dd249b4dd17126fe8b14759ed3b52513e315630acf668db3560ecd91674a7e0de9c740c39e3d84544c160dc1528601 +e108115ac57840f12d70ea7d3d9ea35099d16ccf985aa67f389037a93b3743e93a2bf5d9b665b5979c648c978612b459f737a19dc9147d1db23caba50187b6ac331ebcf0bf7e8bd75df707634b114b7b3486fbf748134164b37e585c3ef0f2b0e464d4ecf383dac32d5a4f7dbce7ae5d2c55158e5e8f422599225ebdc0af9e7e02be710b17a78aea7030ec486f99838c3dee7e0afb532d501cb9bc39b7e6430232e141b7270906a089e8f79a8ef472ce72d91559c1da36547f42d3413a4fa959ee248eff93487732aca9,2378d5a5b496f4dcde626fc39d9987e553ec04df0feae542e1eec56b50b1b2ad,0f993f80ef59da6374fdee176058d403c0ece72382f163ac2522fb340c4b2666223fdbac58e1408fbb0953ddacc30b2ca3f9c75f0bf229b07b777bc89012c19d01,a4f06977e008001058116e93e0dd38a5cdb0b85fc281b52c4112509efeb0b4fe4d44a4c9363624ec67e4117746e52c746929c6fe7acc410ebef5859e219971b801,a93c759bfbaf3f05960eebe260356b3aaef67ad404f03fb1539f2118d42fc92c35ee6a2d1f373e7275b62d51ea281781268c2f070bb383494a1cc72184d76e8600,5c2d990d5db6347a15973a1bb7e5cf98ffa73b994954e08ea8b8a57be351e87c13857f6296da8347ce5ce70553d2fc8298ab6e016627301629573913e976f64700,662d3a1efba30259ff5636cfb64309b16e2f4bd92ae95d649e72c6af49584e632bf7b040da992eff7f8bf71b185c9f568dd5352afeb09b90b8bf9f284b8f2c8201 +aff83994452dd70d6023cca0806537f9d843416d7047ed1a6ebbaaef4e130eb5480563262aee1819db84f63417bae7535ac51a1933efda305f9dd66f7cac86a23e5d5251ba79552417fbaa1c63e2f2f5bf383901d7aafc32592a8f137d679213c6bfc6735833bb129a70a3a71caac5e6e2ad12ff22df8a71ee8a3d3ca0791639ce6e33c587c80a9ad3d085ef2b211db23076756ce1b1d76e783268338d6d61d431fb620ca5676a3d7fd7ab92404a908a86eee58dee1658e38ce6456ece09f19e9b4504a20116c2883297,c655c3cac99f1c4c9c011aafa04bb1ad33e2ee9bddc6df80520f80bfb40bcf59,8609fefc40e7087610d039989b8f3500b1dea4b8d2db52d7fa2557988fcf13426bf38de83fb6f53c3611f14974680d4f9b4dfc5d9d0662c90cb5aaa6fcec92df00,08cb223fd7b6e16e9d46f1d35ab54a650e505e260c29b5d98dcb942787a94d5e5fa41e9b45525fe8ea30f35d8a2c2ca03ec14aba06f938f3c4ea3ce166d89b4801,654f304991bdb1695aa0feb306c4d2a069c6b1e3ee6253e3e91e4ec3c0a3142e56581a2adab49bf6b6ce5027b68ac03ed6b01051c6e611d07115817f22a516ca01,73c61c266f414a95c43b80fd1a96046e282524992cf8d16b00bc783ec85d2f2515396283b32810a3e54f8fe352621237d7bccb0bd147bc0901b3d39024542c5301,c79e7955806204dd62ab46d21d8f08c903f120aefb331e97126757beb1964814276cdc4efef9cac356f52588fe11654cc98471ab1a85946a6be082644eede58200 +c1d2d335a741005aa4d492c50f05ef111eec6c4a73f70680fd4808d53f19df9677d3329e11d85f0e71a7348b6a665542bb19cf9dde1e7c723c4f9a56a884ecabe554f9c382ad93437a025a80c9feba84f887fe268cedd81a541298e6fa7c11402916c8abce259ca46d58dcc26feb82d282beee140a7a1908c62836f8880aa311bebc719ee30191380ac9f3022d95a75912ffffbfba2154e3990e21094a70e6fc687e75adcd3d1cb1646e95ae42bade6cb4c74486a176d3709dd1d7a4b8831a7c28c7002afaf3423e083b,5e26a8bc4567441e7822ce9b517d429a6d1ebadf38d7b7ab25dc48e17ef40ebc,6e3c1992a0ed0cb75c11efd2bc5d4dde7bca6e4d54d563acab65c776004f08577500b9078026b667887888cbe34917662938324e888f17be7b6aa73b7dfa5fa801,ee86d152e7d5ec6fb51bfbc1830e12231fc663a413b61f1e943b4b9fbf1706a931497e26933b54a63874584af22d4639f2a9df51fe9bdba24024e2815b86a09d00,3f93f185742aef4e3316cf6cf4bb3f000aeade378971b74b2d7556afbe28eb1c1c079977138fe7d19c18a47e5277959d156e479e49bca3cbdcb5c672354ecb5d01,3cd9b9fda23a1c22a55e96f0f393f935062fb6ad6f4f7fbdb59ef9a0213a3c2d3977a10378a950b7a214ef1753adf125da538bad1943713db38193e0e4d7177700,e0bd22549a630805d110d97d51c8ca4b13ca0b55558d2d7ae46609f6fd300add53d5d362c13d39a7076720cae344ed044357f289983bbc70530c6205a21b7b8101 +0687f53ec5c0b7e4b79f2efdaa86b48045567f35441ab52339e5470cefca6cc9317ab1e2c52a2ff5242ca7c8fd2a9786976c1161ee53ea282e6c08bd5491f7d1d01addddde699475d0fbd96363ec32c878f934916093b7d855baae659e7a7f8da4a55a39eb257b1c8708fc8e8c11412c00b5a6b0886684568d614d16f2c36115df64e02f8482d78fe771ad9562e5ded5e37c82bf528953f2e8bc4f3e9e4ea8ae2c6bba4c39c966875182bad016c764cbc6611043d73d1d1957edf1c203c9e9ebb7ee9ae9ec22a5fedb50,f56fcbd2d066a89f7a00c75c564b178036cd70c87d5f3e2711b87ba8d45dd1d7,97a8825be2c511ae141fd37092fc94090ada662ef19f5ccc09458c486b336a5046c5e76567e6afd0c08f653c2765bb66168f239049550524eeebd77cac40efe500,ddd2d4af8693493e9420d8ca80057abb71b57a2e9c08fc48d0729c4e0ed68c706463c1b35537826b5865c18f2657bd0257a6e2ef975f0bcfc5fa9300d119b5e901,ab402747396b030f83b2d76c271b9d71c80c6044a9b544bf735d5abd1f99181f3e203f3e0113733a363a6836811bfedcb927e4c0809b80981006e301f71a1ac101,ff8cb0feba4657050aebdc0c0c9548bd3f45b2ad6ca06658088e2b7412d41592748662eb5e25835da92d2aba848daf7c464494adc756180acf94c9df1d19462801,465e04f46cfd6af41f51b767943bd86b725c2392d910039c15ef63db3a5954bb2167c8b5f16a4eb5ea35854ed5e722c3d0093ad4ab8b32fd930a638be5f9d8d801 +d43ca8f9a719e4dbfd81845e68a95eccba547df6cb85f13d5a4f0514f9399ca3e853024d5ffcccf4bfe20314be78e1a71ccdff31f72ccd60733a58103d0fd2ade85e7c6bbf56f295bf28d0f946ec0e9edff79d28f6f23cbefe81097c057681b3dbc2a99e5eef37c0f2b68db605a474aaa8afc6c35d05bbe30b6750ee3a7089d982020ffec35403e0f550ae031662bacaa5caa563e8f5c98bd1b87def79c9ca5ac1780d3a5fdd4706856b0f5131b02a0bb8084d2dcb3a7ccb60ebfd14ed0a4290d73a95eef8836a5493d9,f0829053ddfdda06dbd530f90503f5945b9465afade44f78b36c1bd13eadcccd,ccc8c2b665cd587aea2cab821b867566d05b73402ccddf58188ae3ad29cca25031547d801f6d35470a868112f010a799aee2d936261de178d909bc781b71e0ca01,7981a77d92cd9eefea30f678c4084d3820d7f1a11e4e49d550546cc08980242526922a56309410901364af446b076c98adc47f94c865c3083eaea1f1c740b29801,938b1b65e517a0a718cedb326225d3354f453fde24b41c9214ebf7954e1036ee74c30bb6dc08a2c39b394cca49f3b9f2dff8c2dd001c169b9ca2d703e0417d8700,3dd8d565730041a8a6e023236d20ba32f1dd5f6eecb83a7a5f1b86b9c2bc047d13604a6e0af853b3b729295681552dfa6fc8177ec6de0d5680ec31adbb876ce201,199be574a9e307dad1e46f83ae311dbf57dcff6aad86bdb790f5f2f9f8838680562f11885710381ac8a84812ed9e4df1ae5155f684fedded850286475c5b6c1e00 +fe484121f6ca8d7ccc4ee1335d8fd52486be321cad0fa3bce09d455e38120ecfb86be33dec004f07bc2376d5a9d8598e4f0b3228ec502b4f8ccf09d9bd9cf5b39554325acb0b70e743d814d70160688070aeeaebaf99f9b578c13872c68317fc16ba0b4d9fa998c38a47562d5b820d6d6936e902132f1d0a431a87ab790f1842cc3fb16e61db4ff9097e2ce4a5d5b4cacb0cb272bdd3c7a7abebdbcf107877644f30324868558a472ab4c3a9f7e1c211f042887d1fd1ede554adaa919c5b22132e66109c9ed123e7319c,aa531d81bcd571c2a239e4c3a2ad6f9cd959e4fd3ee88624246e4563448109b1,06dde27db6b433dd35f21e1e5403307c299a3f0c2127110f2fdeb7c627bd0c6a231bb4116c261b6c3ca002669eb5e60f471a15ea36f44534474a7fc8a1a281b101,9ff088cc76087e394c7a3ad70a4d161c9624648275d67ff9872ffcf26dbb02d677429ab77de769eea93e7912e51ea3401f9659cc1578b9a7b15dcf6b265e351b01,4ca0098ce794864a0c3e07d56dcb860dae9c01963e943ed29e2807a69a07b2b037e4041728c86aa1ab13e15a1aa2a74830f9b41bd73392a43eff9bf81ad0c01401,434ea87bb0d0ed89a205e613fc269adfa7d5d10d67a29e8e1f02946b4106038033f598b59b973af1f7aa20ec4b23ac12af561943ad90a2bb3ad91df0b92bd9e800,682a34a5be0861d9f470e6ab90b0c9ff2132cbe36124d344d44c6482bad980ae7811672f12973b05bab1ebaa001446a470bbb8635bee74212ab371592725b60200 +67da149dbcb195ff6eaf8a1bff30256ba57fda4b1dc0652a78e185a8d6a5fd6b6bd59616e112946d010f490daec61c3e608fdc790a724df6d17461dbf271dac02ada951af4b2dc3693831df4d88618cd006a142c60a8dd7a0999d08b7ef4440f80f3f94ebe84172ae680817eb43e518ff21cf2bcf15bc0c365ed7282be6c388f1b271d8a995a3c3184c2f7f5b14f9146ec8ee0da1d338736e92dc9d14850adde0177cc20f3b1b7f98009704eaf9c95b1fc5504e793f09945a348c0b92f173b76267de344a19971c6782e,bf8a3a4ba06724400b2f8758234b6922ac57fcdab243db29829d9153cb6773b7,ed0e883241b4f346cdfc2d5be049793749e4331bcf0bf4d3f2ff4caeedf4860e6a7124f6817f5b18016bbb0a6275aa1d64cf2fe3f20942b639d61c37146748d801,f0b834fa8de9e8c01d8421c259f588a1dde2d8c4d31f0358ff8b5b618ec79ddb2031785ee4add056d5555f4e371da7a465b8f0c3e2806519b4effa55a24dd40c00,c4eea9c6c2deb3786c67eca119d78593c4a7d093e6d78cb182a066e1a5d0e6ae2f8b788b3508af878bab486b299eaa6cf88741f0687e991122f7f70f4a8b1b4500,61842f25cb69030c68334411736173928bc5cc31735fc0004c6b60eb04bf86d0773603e4acf378da9427158b0c3f3dddc0de7831ebef7bb9a2c510131f0ad68a01,1d1d1d920ea79077e0404a5882823cf1d38dbb64740f6ea1003e656daaa121373bc238700d7c2efd7b03f8296bfdb3adc8f7bf4eedda9703c1df61c2525377e100 +de643eb6b1b88f806233395f7831aa4a83e17b00717a3eda62d8fd48320ffb03892676b88fd536f41a58c93aff35c6b8155987e92eb6ced88e3b72fd64c9e13ef763c7ec7f888429dddd8521ee012f705a918c55a46bdf2ea28ecc3890872d78f9ddb7af4790b90b9eb502edf9c76341ae543043f13645511dd260b320f2474c7f290e35dbddce1a535ef84c5430b7c1edd2570a7e5a271f1727b0363f4c4a5aad9f43e7d4b576ddc25a31e4334468104f48a9c754f2ed97726a0405a87ded3dea8a11fa9592c5e26367,d20c16360ea37393956ea83c85543c380d2b62413ea431cde8d7b3c1f6fdda83,e3274c2f5ceb26cecf66a04c8b822d36c35a590acd3b62352f20007d7a0b35d3369faa15ca9cdf6585c41bc2e186e74e8339cf01a8b77316425da37f80819de100,144acd3a2ac595c0394d62729b133d07f54d8567f9b29af9208a4e8bfc66109263603a0ed3bc24a4929b42eca77a3f6804416eeef2f388a7025197939ee0c6f400,8bb3ff15f8327fa8de1ef9f49bc659f02bcef9b26f832a88c0e0fdcb849f55ca43cea3e359704df3f0ac5badb608a757f09aa3ade7ce280e6d516a4dae36077300,908917c3ecf06fddc768e47920f5fdf65463ca32c93eebc5088ad6b490da9d8029046a974520c0e99b634f55ff677daef4a11bbd642bc239e008d016ba02562e01,e3283a9b7eac176f0eedd2df419a7793984a34fe4626334560285f91cdbb44326686dd6b5e7ec47f52d36f89225fc090b81ffaeaffc5503c217e9f7c1dbc553900 +d2b5c80a5005f72b9623ddc0a54ad3f509ef625fa055950f73b8374a3115767f4f983bf4336b3f5a1a6b5f3fb1f86265d9d012b4ed9d4036d154c7e73c3dcb77f986c8339f406a54f8178a097f368ea46ea0a4d291767b5d07da19154d76bc9266569dd6da81aaeea532506622776fe8b5c67525529cb6d345757af51d5b29065b9fbdf081d85e414341f1b005551db85c053c02fa4d85134162d966f0c675339d7163fd4308f953237062c48ff8dbd8859335405723e59e8b3d3cea2a0c755f461bdc03fc4f2899781b,76fdba1e792ddfa8c106f178a3a605648153a23845a59f42246d0f54db4089bc,ad0397460b6959f8ce2e9911f56a7db5f3b4023782e978fe886c248188ad906c06dfd7cbc7972c9878832e36f4d53f3abb917ed4abd33003ba384a348ad1f7f400,2b427bdce685f3bc5b7579084a1ed3c8d3922cb569f3fdc240ad150c157958740ed5b034c505d3a9c6f6c61b51578d4abd09cd93cabd0f693d42a7f2d7e8b9bd01,381db2686b88c942c25d53faa5dd0f7ce1693848c905d8c5fa0981ed9970cbcb3ad1a1f09d07acbe78c9b2707521791fdf592d19341639d61cf8821b832d61b301,10dc84833b28b56dbf1fa60e1c1091639ddc20b92bddb29820abcbdfd7a734de62b1d8a374959e4ed3281c060f74377964c829dfe85e7cf60969c4e9578c519c00,838b5b921de2a68defdd2d7a799a93e112709a9a426ae28c589f691a5ebd38db23a2936980d183f81ce20379349010b62bf99c12190f6945a0c46f5f87a4371600 +22973a8e8ad4f0f5b77b0ccda0f34968f5a0cb82bd35e6a37759d5633f40d6172df3563aed291c0a8b5dcaed66fa9a2d77c12759a1f1be84bf0fd3334976dfcc6da29d36da6c1eeac6159cf1e2a51562baa4ee95e6f74df7cb730b74d1ba6962ffbafbb48657c9edc6baeccf74410c9136cf30f85e607c209e9c11b04ccc9b2cddeb84bd08712b610700d59807d15ef4426fe6cde15a37682fb131421ceaed87bd9dcb884c76a66fd5c4a5f26adeb87b3d28f6976a52c36369b7298b2fcb2a863436740d99a7a360902d,b6abb1b9465e612a8d6a4c0642b6cd6643ef2412b18434a5fb8b6e2f05efa27a,0ca73fa6e4e5cb82590c718c136324cfa630c45686e7250edcd81c77fe9150755087e8676c7fea2392738d7994fabe7e5ca85ee743a98c6cebb817c9f9d37f3800,b8dd2ac460d9fa58bf7fae2b16a18f932b00e55d74f04a6ca9361dc13d2051880ad823515b6305f2875e2dc232004a8600615d705f8ecf04b0d396818e1b8b5901,5bf0ac789e417d19f783702ba69aa408bf33ecbab798994ff1b917be1728046f43c00aa9e8174681b539394c2d99405d7f3356752f273bbcf12b4ce14054ac5500,4b3f1f3c355d854386907df389e1e8f366d0145be8c922808bd227c8ed1a0f7564b274fe6e6fc9b63985a8f663cbd85387b762a2c1e2091510d1e8e90a99f65300,a4c7670b69d4ad6d8ce318fde579bfe6cbd1f1049b80154317cd16528f0a5e0138f1cc7750018de0e7cb772f642d2c7045b7a09f8dac0cc1dd31c2d200ba3ae900 +cded1b84aac29b8e09e6b779cb9e3c03ea7ba784c157165f5e2190388d4dd761040d4bf3cded19f203949418787afcc2a7bc72249422dd6d296b3fa3e5ecdd90db40a52f5eb90800b6f6cb3d3fcd92a5af366722b36bc57abb6fa736035189cb5ce7a3e7047ec20e9872753a0540c60eb9bc3a5067c7fa1c2e66fe77921363c038d259d94814a970f7bf6423f6ffa4af5be5d5a00e963e4eebf6309d39285322a0f4f574fa6190cb5b6776741cb3bad0e575b1bbe9bcf529e4105181e6b66ba61c266b52ab65b64493ee0c,247da4a42127d2922d95978a15e11a79a4cffcad7642f71e919fd15036a330a3,083641e7db8018a3d3001f7a23abe5b0c9533f355e63e00441615e5204f40f770d121bb1f8813d6963297241895961a30e2e3dfd43c263032eb93a883e5168e000,365b52d5ae6ab7b556816ee7913f53134a6957c033ee17a72b1f4d7210b25e4748f94dce56016017bc42de2e48c46695f80bc9976634e3b8756dd2779922ef8300,a5080c2ded63110211666f014428abff482569e47bce913248badc3ac3b6a0cb44f2661c7df646520176ea7bc2867f5653a2eb1242b6fd1be883bf64475a37f900,2aa3a2226d651fde3dbb47dc2f3193ca8353ee56890fd2d0eeb6225c598feb1468d1357c47de66d2e79412377a3e3030e5129c2eb35b18be71bc3a4e625958e001,1aa42891dba8d33740eec8065411410406584a51078cc3c9f9935f8c6e36713b2537c6cac7b0351a47b35ee7c8197e0ab747f2e75fefd53ed8f81fd6f6c605bd01 +b9da34c968636aa32298d85db8d2fdd666f453c637187e8fe93a3ec8327ebdd55b91422e1731a0bb70c7ec6e3b5135ed7b9091c707eacacf1d7306ff3bc817f368ed59c185b504eadc7f1f572e0cecb684a12f0d39d0001284445f9db36e1beda10761928b85f4a4bd8e58ebf927e45afd1ca9be19e8fee9fc7b5b5a442f6a584782467855c4e964286a09365044d1951d424136e361698441df7fd6bf69a07a3fcc1f0e4959dc314804a4281fc89e8ffada6cf4fd6de075ce7b6bece5523de2dad2e6a8f197cc9cdaef9b,222994ad53214fece445d3589c1d29710f997d32c1c83ba519ba14ab8d8aa16f,138ca622a17a45e97bb89fb3d6e88de27d6dfb2f45066783b540b65884c784a12318441f853a7ab0a0fa163d6d934e41d9331341504568754ed414fbd2bf8da400,c01b9d68bd68f7ceaf6aafde4dd6d2874dcca1ab5eed7c733fd8ec295d1bd5ae30c96d278d469cfe79a690920ca1d02a65ccb334eb1ddb0793ec66a92427db1f01,95ca1bcce326098d070d65f3d280cccc860cd5c063131ed1cec5519d57f903e879a138a483df1551c024491bd40d8bc3cde35529a3cfdba5938b1b97568bd07801,6619259d4de44e31a07f85e2e06a854f2ef7759accd80999af83460a7b3700ca2bdbaa1ee6d7312afd6628fe5b3df9a94c4f7ba4c1bb7bc744d0548e7346bc2b01,09f9eda7e0dc257d695406352586ce12d943af3764f2c950fb5e933c59e7abc864f454aa9612fa81f01169957d8e8fb3d9a2127fab18f6d15541f340912bd07b00 +149c51391302aca5ab1b424469145c28280f51e17e76d33ad9008f99cc40bd6e1d17d364177cc33cdc16554246e221888195ce0674ca46ce190af8a8816a1304f0f4362ed06b6bfcc84b42e2a9d3a53d335e38e2a3b1af0df3962ea21b742225b234109f8515d349a61d46ff904f8cacf5a5b0204b1167d18c6fec15425758e06570d0530fd278cf54afca866b0c3bf094c2a50285acd78adcdd43e459bfd89c0fa2aba7413983939cc302f2b2f2e1609a115f4aab50522d2fb8d952866d09d46d20efbfd211db08fe0f50,44e55757d0314c42dfe61d5325231e99985ea3a76d76e0054cb57b44957bf6f7,bbe4a242254bd4fa2638ec84d40c28d362c3b4b7253d8f07a728328013e189eb68a101ffbefb3dfd814ed749e75147a262ff6d733cac51851218d2151ff1ed3401,945ebe8cf4100f8fdb1005d7f8e7992362aa32d2765c511e49f49402f0f9d4976b924461c2a4dff73666de6183d30a9660308fecfa408639bd66dcf14ad7077f01,f412e130df014eed9acc2c44ebdb20eeb18bccc8c84bb858c04d3ddf7aade0fe0f95eff21cc5aa8feb101a3dca0d30627259c487cd448e4f920fafdec6e6405201,d90955865c73e7bb6934b4e6c01deff4174b869584b1f241b26052dcea0a46933d8658fa72aa8980ccaaefab3df2a99eb4bbe4c5fdaa8e01d6c3af04490f51a201,f5c7ec41816b33444a19769d90c05e0596730f836ddfb1f74ddb710c24ae7965589f3b73a8317373763ce150697096269d3fa5c85150c5cf2615c8068fc7c21801 +bdc5cf667c3878bfa02116aaf36f5ff62fb4135087c4e2bffd3b8199326fe935b64009d70e5f027b8cb180062945fbc90e59a29f78c57c0509b6fae27be4f8d9288cf9107993c84526cddd204477caa47667e2af144a66b238f458ef63f3892bf911bd9b4df57ff319933df8acf0ba7c71134f34caa1bae502af2cd61814ab3731669c9b760c74646e2a61e9361389beb02945516a4b6ed1c6885c039f0a3276dcc517f50b374e11008ca405fcb63caa9259125d9615f47c30c342ed29be44cdd8e7fc2f16b4f972bba5c1,1f6239fd47c3d8f42a10f2df147269436f8487117c17a2d7e80968d44168bab4,3d5c82b18d4ad572fdce2f35fccabcd5fed2456e3ece6bcdc1c47ce0dc363fcf2163f0a3f8d3384317f7d6f10dcb1ac427b8c9c46124a1c6003cee80933b672b01,73c3f58f364913db52f7dbdf8d634b938e229b02fb4e3f41c8691c6afb3e61a00d5eeba6cc2264f89b5da36bad196280a10f902759a3940d0cb57ea936fa00ba01,b9f1620ee82f27024170e53bec8eccc96d3f371d77d87bec3125e058c624a5164a950e2ce0b60adde3f19b63761658de261af7b85904b2d1089f9d109b07d06801,a92965cbc237f5d1df58cfa08e70325194bf98cda4a253375a00c1f13484fd88194f759ed427bff441cc624407d3b69dd8a6baaeb56ef08ff6bde8f83486db4a00,8a8ac3ced8d6f052f598e2227967833595f50d39305bfbb3e188158937f6dd2800a252e87e3ebf1e467a93bfcd4657e7cc6c475d4d1a7f55f0e8a973628a474c00 +a3246ca01de5cd9877e112ae55d7fc2f81916ecc223520d16690ab584c7c3f5a51125dddeb2cf62abcc0cd47b75bb934f66273c713e5917fcffdb79f4da1802a47d6e87ad54e37fb9e83ad8c715798d531b0b4a4a2a7745dec128a856c0e5349932fb2bd6c33c4335be4124b3c2e495adb88b449a4f35afe284717e454b32c8e869ab7512f8e37fb6a15bf16089888e1f8101223d04f5aae5f22f9290c83e54abad660e2e2f162697a14552767cb467e6f8dc52435f72b9ef8cdac8ceb15cb6396e88c8f763bd1e7b8780a,05ab2500558aa5ef91e7f4cadaa96b4410c75110df28365bc595e839324f9099,a1d094eb810eaa203726788337f859c600857065ff4551111ff5a20fe3881a4e2fffa7b0733791b156069d57ecfd9cdc0a27951b4c5b13afeb018833195e383c01,e09e9e68a389a0a05eede6ea03e9eb2f6f457c3fa5e5fc3195ccd6988229749244db91b1402b64d5a77ffc114f2e5287212c1ceb21ee70965ebe7bf7809a9a7101,6b2050aced220baea2cbc795238b68b21c9a59549c13726aa0a907a121fef312176df14eca8ffd0ab1cdc36982402416946e6e5fbe5c667972991f22728aa2d201,e89f5c79aedf0d619f41a6619e9ad670e423d0a0dfdbd50658c57524b6aa3f8e7377ea8532a8ad5c958e83b889d8e938e852c6f5bb79121225904f73ce2c6d0501,497c14d753f0d3cdd43e8c99a70012d41d8aaf699e1f130d53592ebc9fda019152922e97a9804ce003c7f5729629d8ddd556d524ee560be69060a3fa4206961500 +3139bd352169b34d521300299c47a7a564dd3b5c37132c728fc7f6ec740c66f21345511e9faf07bb317deeef49f3f750ec3aeaeee0828d772d3a93250b3b4115823f20f15f87d73f7ccc02b40968995bf4055b04a133ec88711668b8d15a41d0fe2d45eb81c14a4b034650a227f1c2f4f0444ae32d46319c35c7fc1229de6db5c7f6d0361b89ab893f4a2a5b17613af5c839bebfe062df0b0387cb59bd41ffcb5871aa498ff3276fab9be8ce8bcb2bd6e01ae86c5d6f12cb454afd427879e6f47865885b70eb5c09689ca8,941c43e5d415d77b0f762eb7091fd785cf1dbbea73276ae2cecb2e1c3cf84b11,ff4cecf66e8c2fc9f353d66ecd00f7b9ae9a21c1ec3c6e88b637b26e9d32ac725741b90bba956c7d83b41512934624d3948dcfd974cbdb70c5c26757c8dd5e9501,cddd90f618f1ffe324f98e8c44c9b1008e465704ee79a4247c1096b6747341061218c3c24a39833b94f721c878531fcc832a16880d337127504e4b073c656b8801,bf63bc4238300d335f8588ef07f769b603eae602b48e431537fb7254cfe69814150ff3a180e67d91684929a1fdc90ef8be3ef20a9c9e23c69c0c3b1cbd7fd3ef01,c5b94162bea0a198443bce73795798f9d175718dbb36460302e50ffd874bce6f301feef7f07693a4866e45bec9434957b94abdfeb5aa8939294b774464587ff601,7f8db6133646041d28df1f4a3e26acf831cc7c22c35b1a670c3f24a35171603764dbb372eacf7812bfbbc5fcf6751884c4bcf9dfd9e329b900938ef55a5c308100 +a42dd631b2180a14f14ddfba8b43a94a8bc06e0694572093fe58527d53102f27811185bd64409bc6aa9387d2fd54efb947b36de9b842c46b72febbaf52344f7a0f06cb6e807763c3823bd47a3cdcaa607f7785159f0b38301cb13a719b19bfbca84f58d485d1b5177c8c768d4236d3b2a2b30334aa78a03a80944631600ce722d9c21a52b9edeec242fa5e309ae37eb3acfb19bb807944e0da8a5bd5e3b0eb6f3eed193c4cb5634e3fe6a8716343c0f610796d3173f466c40daadbd1d5555d6a2a21cbca77d95323991a57,34b92b5518a062407b29f0c56971ce9617b734f94367ef31d9de3d4229544323,3e891314fbd637aa37eccd118997f992f0839949504e8f70d2e426efba32c4f020046890fda6b16c7034454587cdb8a44d2bd85fe5a6cc32b6d70d3aa378aa1800,8123442c411d5d1c89c749a1970af8e6c5f08f1cda8d2a57de458bd28e5006c9786f668589a8c5cba40c7d416e54c26e465aed08d150cf1e13e666632f86a82701,7cfb1b77e5eb048f6b29b00cacca1f49ab2be85507bbdab9edb2881c1c7bd95f788c5ddf897bda882a13533840b4009dc1ef2040812f1c0819a5566288d70d7c00,5f10cae1cddb48af32e079cb48944e8a43188f5291bbcae1f74226ae45ff543f37a2c38f1372be3d053177e02550b3d95a714f22ade99c024864a222a197437f00,e2aa33f6b68c9a5639d67bfda8b0385f917509033f4df3ce3a8c962e2f8a04b1498200b8f849b16df00416095da41a135f4a44c59a9ef9d299bcf139371babc000 +3c158fc903a5c0fb48ee15cfd38899c57be125a913e5c14f06a3a6742be95af9142268e6a289dd520fb218f6d67bc0dacac8932b5efd678908e5caf497c20e8cf9b70d5d19e6ae7f7a32b535ecc405c09fa64e188427263070aac2260802158d54c12223d0963ea30bac2a97c7be16b0e9470e5491207e090a29dc506885859c390ba5aa4ea5b31280e7ef070c31dbcc1e962332ac1c0df88e0beec90b9ee7d5992d47cf4b1e85f727819bdf197de9916b8f20a60f46e5275747e824223170f733f991b7cee489fa8972bf,ee1572fd2e73bfd6f7a8f1ed88886f5d81a38b9dfa7f6980084ef3db608b7536,89c77748d5d02a671b0c59615fcca51bf638adccb45bf2dc9fd7af4a0e15f8bb0de52644c991fd3b7ac340c6bf4e226310fe0357e412962d961729422398304100,a7fcce9a5a4448eac0e20d811aba95bc85f5839d894e5511100eddf58274f60370a41ae413bb7a4ae4df0e9f9c50d66ce1ea010d3a711e05990eda4dc3eddc8501,56f9b6d8382fabb31f5e24a396232db78a777939e8747d621f420f6839c2e0663efbfac390348bd82b1262aa1955da50d60d0f40871907441497a0dec340895201,2aa7e22046e3bc5a7d0c3e61394b2bfad6bce93b1e1a6741f8cbd5e6db01e7381422d4ac8ab4e7d151476c63f79989314cdccc19aac8a20bf4aa6b61ae38191901,e9fceab160a04b0113e8a3eb932d2fefb012f3cf479d73327c769d2b9924148717f9cc844aceb8d04e95a4e8f45295ef751b16c70b2a6062e13fa638627f0a4e01 +20efc21fdd2c522a6801fb29018d19ff03368c16b1f07d25fa45d1ea0ac18b6a50e8635f4ea09a3500afe187308aeca0002984205cb893e73ab5c295abca8e18591efbb585625504aabfee2585ceed9e869269f4f36af6257440478bb14aa6ebad6441342000f03ba8029513ce6200608bf5c76adf787917b816c20fde9c172073a5ba50a83d88c1111826e1e544b3b54fe50112b6375d6579a81d0b695632cbf42cddf3eb34afd157623412e2baeebafbc62bb48cd8b1b530f0566d0ad49b2679da11ad098707b48b80f3,2757fc5c546f5ce1d2e44559012f6b15b01399e3ce0c6598b054b23534bafcb2,fc5a96a8d5b2096e1ce2d2ce725159c936e4ec01f890d257da582a4c3d6ac55332279a59b2b734ae5d27d14d75654010e2ca672a0e39fcd309757502c254c5aa00,d9562724c7c1bec87b718b3f0d5692f125b2cc29b444c85e10cb30f4be3d9d770d8bb2171dace033e5016c3a95c45106aecf7625127b19cf0c4e15c22da1a1e300,31b446e50f8f5be696383eac77cd652ab3e42e82a6ec3794ffba3b6573d0b03270d87dfa87632ec174c84c1726d8d19b3e8eb621da51e7316dab236e21a39dcd00,b4a6c0bbe1c9733e29245938a717a8176493f89ca8fcce2d4f3dec7a36ecf46220cac5cb6432fb68ada0c8ee8f0fb024661b8789261bdfeb6a95c635f8ba02b201,165ec0c1e047fdc2fd09754bb1e8fb6d2864edcebe588cd284aeb808f40b7b910e97a4524835bf24cadd4790432ea2dcde2dad1fe4cc056547178f01f238949601 +148475cbcdee67633cfce663ecaec902b5e67295a1936181f7b78074aee171e6f0bae1425c9c6bc8b5bb69461488c6c12174676545291f8a8c1947d6416d201d631e06a9d5433d4f9f9d36a2ade265dbb85afb806e4d4ea23bd8fe36059079e12c4a9a376d4540423dbd4f3725afd0b94a0c6994578fdbdab27984ef64e75ee86b6aa3998b70fb71de7884b61caceac3eaae1d2b347cd72dae39614005a57246e77aa047ad036b76c74c535591cbbcb7c2c888950c26e9261e08d0a6b806fb0ab118bf9002dafd913cf111,99ecf4e63be8b16a65684f2957a8d1cc0bd53cefa211a1a1b599c7d4a56ff699,32c1fcbccc0222ec79a3373c36bedff7ec40c22085f9dca9e5c78e2844e7014826d9fc498db3534e7e26497df4d76ba386e3d75d66ac06099fbd668b95c0340b00,651050b4a1a63b181259c57977e52d158c033075096bb3847349d2af3b945d044c1dee39a65b7d3d02251bae2dd19b34a49aae212a608fe2b74b12a0c75e08da01,66b3d267ab9e03357e98d3bb22445e6b1c112da77800834996652a1052f32f022a01e9e4979028f827d5628e39db782d27e9c6b3e436d45ac919cd47d7e4bdd001,fc9fe6dd1735f5c1f2aa395490c12b985ebfb7aec60a1453a4597499f07bcd056442dd2f12cc5280fca97646c28733be16862472e1037998d47abd5781763df200,a5654077cbd0d216ee78f0a3ee00c66a66d4dfefcfab13ed2eb0d4e79755e1fb48132ee2e86878cf9b6637bb968c2885e5675198e8907a4d13af46de31e863d601 +fd7934df86db52678af95c7a1f804ea11fa4cee816fdea77892da4d679dda0a04620234a889c8513097f4967fc9fae3aac155f373bec06366e3146a4301254b857f6a540d1dd65ef35006c8d7058f917b68d240aaf7e4111e9963b78d7881060b76556ac89d9bf3d639d3f791f0f472114f65340ffc35b88ff6dd838a70217c2360e27741971ba8627d5afa3556d5a9e6f487e9eed62ae6394ec3a4fc2c989b6eefcfc75f4ae13f56b4420aef0be57e8726d238f2e5ad731859ba1a35ab939bf9059a7227493036727ecafda,a7171354902f8ec92fbb1ac7a817e07037cc99ddb4e693f5c0f578b9445d5384,8011c60d94605059a3ddbb38037fde025fdc1ffaa024615cebf37a8584c86dea49171b5449c7fd1fc6357dad4cdf19da913ee2b5db3f8a90e82b2b945cd17dc800,0f6e8ea92a26a3f1461236720610d0679a07595459e0f49797f7df0b39ed1e54171aeab43dfe6c830e8ca14515427d9682403ebf964cf7aeac3f406a768ff2f300,efce575c9fe6c4576aa60693b9537b32f7d5c89dba891ee88047d066880157304329b175a2910ef1143ec368c73e8fc7d2e76c1beacc5880538824dda3dff47801,624bcb250d0993ebd186c733cb2f128bbbef25687f420f81e1d0fac4109c7c794a653d2412d03f18ea396b9dd658451f18e1579e1238a661717ac6831e5fb9db01,97e363ad8265ce61a6e282224a9f3728ef781cb26e3bf109e10b392d2d035dc76d5da8a6232a48e9622fa3a185a4a6d295aa5b6f95a8255f75dbb97c0cef0db801 +9cabec127ec746540e266aa4703fcbe2ac2d62a0e2c3b9733b7d6f917e0c62c8aa3413511592bbb485f447481ad33c02a86cf78f3152524a0e2786a867895006864c2f82390eab2071e180022decb5e11a5d8cc77d8e00369fdd01a47bc0ce4356d808ddc1395e0ec9557644f0958f4d5c787e50e5c225a7295a57c1d108604c061ff2d13b4d798f35856618530cc40f0e4a9e78cc6c7377a762b5e10ace1b9462d8680e5d65d35930649db49e47d7f40bc6a0d212b01c91960f5e8dc9ec7be6bb7054d6709a917f93a9d662,0e4125308a19bd4304500885cf6f62c230a412e9698f02890cd26a8f4e0402e1,54d5cb0a75bbe3b6dc5e45fc6e320c89c50a2df7885a919d9e316c9eb70f60cd239c0bd302a52e86873aa78ae863d327947ce7b7fd7bc9c85ec932ce20bffbfb01,6625e2b6af8d908a246d455de32a9339b6c220fac08af465ecb93f9fc25c5c850e9ef66311adf8b3ca62bf6a0c7b80a8f7e75a0459349f6a3883f6704079d8b101,5e4a88f7891d0c0940bd40fae4c740512da6741a7da63648d48e44da601b19274fb1c8ffa68cb197393da9546ed3af9fc54365b7ddd5fa065d7486107b3fdb0500,383b48ea148f98451455e94adc8488bc4443d44ed054fa1943d5fbe593fa44fe6f0433181d87ba1be1da049e8a0faf5c8f91df3028a819ecccaa0c6a8edeedd601,4d63b2315c7e93e43b78d0a3937f59af86a84817e6be19196f768e6c9b49181f3b945b2d7d0510d3528475ba45b5794d5e2b1eea23419b44572a25e73d835e1f00 +ec680d41f2870343641c82394d71db00d08e541d9f25a297d8d8706e10a3e677a596c252fa52aca45cf1204af172f99bdd8cf8b23ecbdd3cccdd44d8654d134e47caa884e748fcdb15c40d2870c5f9fb44e4bb72409b229ecd771a9e093a011df3ffd4e5cdee90819b05f06b5e678c9d0b0df0f0c9f35b21b6dd0b4a83c92fa391284ebb331364cf24901d406f0f1cbd67398a7b97f84ee9efb900b991704213b8813c54a9fe9ea871f918a8ccd6038dede48916574cc8425bc194c039487b588cf800927ba72468b1feb37c,ced296b48ce4cefacaaf441618e92b40dd8a0f6262831a13d80e4e6865b0cfea,91f4ef6ccb3025dece857cb40511b3e08a4b70854c2659d73a51a048ba7f7f1b59e108216c7addbf7ba2626ea09898dfa86167735edfadedecd216d86ed108f100,4614a16bc0a74c8e8d902d86b2e27bdf1a4cb386908d32b1fc99ce89e3d39d9b0eacec4bdd119826b16a06dfcf02f16797980147a835334eef052f50133f76c401,c91c352bcbe65ed8a1782c2fbda0482761f6122237dac08bbd37ea2588dc0c934d7f86ef42db87942e77e10d37700a213d1e1f540f641705a9fd285e1cc6accd00,0f3389413d63374a48779b4072ea1c7af463b7391a569d2e53322fe14e96ad6008c700fb6f1a0919c08b81c2e8324088306b6b3eef71088c5fe6a0858b7abc8201,d267721af75916a139e5068e700e67603833d9bbe171a7e527db3b9bbc06f8237e02047b81452a3a957cbe0cfb4d3385b669f45e99c8042c12c2fbe5df732a0a00 +4150086e06643d3c5045166dcbc217fb741d5518dbb5c7d61b8d09923596c9b386bbed429e842953ef5dd4f2d784a1aa2093f5185a4ffbdd9f03255f1355cd8ac926f86ab702d8ec62cb47805807310d5de20837a36dff681f9747fdbdebfd1e88caf88ecbf1d2101ca8fd19b2f9763ae4e26d781fe7cb46301cdbb7685fc968abac123f2945eb7a9737c1d85e0e79fb08a5e2e4404979931791bbb871adede4ae7a824641dfda2b6f336988de4981a82eecdd786be6a996630426d5127f335f71cf651f880ebaa91ca6e80f,1ad8eca30f11144d75b8ce6bcfd14f606096c3ea7d92bc157ddbcf91eedddd0a,656859d1bcc5adbe602581e7fb252a8eefa744229711b85c5bcafef45a0f13377eb848f4b764aa8046256400de21995b21ee4b3d42e3c545972f872ba5e6958901,feca0c1455a82e168345c619e512d877a5fa6095e0e5b0c4bb931c6a1770d473104331a49517a831bf90fc0162d20b03af17194fe5a5d25b19b50e54ac921bc001,ca565fe39641297f252b6ab59ee888bdc1fe2ec032693d136734a1434044af42587e5f13e5c51a346ea1053a1389fd724a8184a85c8ff402265dd3a04ae00a0d01,270fcee12eea9f100f73cfc27e64f456bd6fb51e209121a0b985e04160276f2801809c9ed98873021452b4af476b09b15a3a44b5462e489c631f357483fc34ea00,c81778eb6976d7502f8be65946e2ae4b2fbdbdfb56442333adf6c338733b9e3322bfb73a0dec91469b4d2f051704b4f6c8aacc4c8cb6a863fb87be64dc42c67f01 +133681cd3e4f66eb3824938a2da9697efd250e03f8d0360c9933795319be627438ef1f2b95c695f84c9fd9b0c497daaa4157e847748c96210fdd2011bd812e42c84d5a7c6d950d3480ad68df980a4003f40fcd2372877d8543d1dfa21e1ca8a5fce3c249caf9fb9e1c4d18b80073182146d9a3fd31afe7286a5b7ab15ee92f3853cd5c418e5a76431236be79e0e311542357c2e9b45adc6aaa77816bbb4f72c2f06d3abb26642f96da4ac3a4859e139f9e2ff73ab0cbaa565d48392f7ca6b71adf53681d02cc496164c53773,120ae7b8372ebb078631353404d32ab15fa7b4abdc64d4287971867f7e41b306,6fe33bffcae79f93393ab38457482e7b44a8ead306c3f5de31b3127e0f9ac7c541c9ca64eadc2ed458f00da61606efcec2df80ae61d1f2e7835b71f7161eb21e00,ac8d45c8016d1ab59b2a5ebd47fd79341f7d3299c0729c29f4c694eaa0c9282d1ac37f28ea60a61c66fef71d760e991296e2312cb7fe2c1047aa47d3c24c9c3d01,5107f7977cecabd643cec1951212bcde14225f7239e160a77e83a192e703d9411f7e7cbb2ed997370dca91f009be0b8b1337642da92cc17c4e64f5958a4676ab00,3598b88fdbb877e07e3a572872fd3357b3f270e46914f4219aeaa7bb0bb10cf20f46f459a28cfe89e55c19d332446a3dc476350f4b045eb914e5643def24376c01,853470d992092e54c298ec611e804d4ec6ce56fb6ac9a4c72ffd873fce3307651f588d771fa7f3797567aab76cdcf0845b8c9da6ced211a29ca895021e1f160001 +a28d8b2c1cd2275cb80edbcffd44ec05c739f4daf6ae60bc7c49c0085ded928ca0f9b04946da450bbd4b72964f26419fefab81e6e70f1b83b4edd4dff79235094c01d40803366c020dfcfd16f9184d29904d357f62a039045c4e8c8ef909212bce54f9f116f11fa5447c52c71dba53da4b2368bb1989aa9ca77a4449975659b034c3e8ec10f5fb4b9a8413585a0132df3531f2265d456236ad3ca63ff56b166122a66e04795262b43edf027b13221440f0c1c7476ab4ce9a7b8857a707e49b8f2efe1a9514bcae82722f8510,83802864a0943796923ed5acf2980760f91b837d714ab0ac27fab000d77d061d,ec2d90f09f1e2eb97743d3ee8926e78e594364f03e360338c0a143b1e8b74f663b3d968e89fc6d278bd0baeab76d877f20b3f13455e33586935f6a6bcec3fd7301,4ebce5fa36bd300167f3dec708cad6a92160330d9e2639325050a462d16a7dc6538c2d7c1b0f9b4344ef086f5ff0708ee7bc470803456ec16ca1bd38c6244a8400,ecfc07a41c79ace565669472a959b0ea0557a1f584d9b8ee225cf7af666475f21e87af2c46865ebe8b4c4c19c712f703ff58986cebdafb372fa7d31f866190ca00,6b72f510786e3add73b0942e4c256f577687ef465a9aa18ed9c03e5bdf44ce1811786811b4a8d9996d1e6b666c6f16107933b2ac6fda6b5489336dd2cdc1c97801,fc41aa2c70bfe46476722c0d4f1f0539ced89538c8cd42e62b03cebb9615b0174cffc96934481cb764c82e8ff0575197a81a7e1f3c7fa484948de0be476bc49000 +e52e0f8b5bc12e75f37e4714833344e24c15ca49540fc58d78b840123cb47ba8c76356e3dac8ccc1a62c819c3dacabddbf3994dcfe151b6f321806218476ad898db430a6bb982661bb522237ec04280e8cbc8d5fd9a1fd2dfccefdfc2de6b4172ec05ec6eabd065f9e14f17bb18f5ed48dd741d7a4cc48d67c1e3c06871db4f5e488ec9815351b815bbced0ec93de39c3ff098b7d385911f21175d6a79bf468254ef4cc68f64fa338953038dde5ff74c858503933630d65db75bbf579b60dc030cb2ec92e71503427cdc9063,48b44a02d3b9e7a41a27038d1b6ed9b3c91d256e1a998e7602adf7aa2f910ded,270540831fe283902c3e5bcedd34d0c62f4d7fcf52f6b7b70171f20c4bcd50c96beea0ee82f3d2b7143cebdee88bbc3cfd6d1b631a1b2613548884ae6fc45e7600,155e0c21a870beb4c5e4618935e60e9d6cd6c247ef5a617a9687cd4c4c20521362c43746fbb01f01496e4a3b96233750257eb11ff08fc7d1f1c07bb061d868df01,cd29e2258f2520aeed2f0d89e813ee265bb6b53830ac55f1e149a0ead00489a80f64e32ce316823fdb7455f82814872ffacf9cd79bcbd71daa02f0a3a79ac90700,a7b7eec6debb1d2324eae57666437687cd9063c6efb8293085592f99a50f84b7220da49fe7aafb7cb79611c1d91f3af33a1c3216ddd58993ee47bbe31545c54801,bd801ee0cb9e97dd4b13a000339b3931cc6246a02252239ca6891405bcdb32d923a0265f4039eb260975f16d483f1fcecc9d1cd80c3f09945107c0b811ed612600 +843329b11ca0f448f0d7f1a3ebeb47310e91b4dac56af484be7467260fe101238b14dcb0e58cf42143e5d204ad89214d8492bd4fed200a1e45b23dc5951f2cf34d76ebf88c78884c0f661da7c87a9e73ea7b9e6b056843146ececfa49cb42ce22cd949364d04a55a0ba8576b46cac1619083b3aa401f9140f5c7ffdbe6bd421d36860ecc1d153f6833a79e86ebaa9b4fae4ff2d9199b791482dbeddc85dd9df0d3486849ae64e550d58667d1e4b26a137221968899b3e138598ac683fe5b5c90d3e4074516ae03ddaaf62f28,302f5f1e0033d776f0583c3db00c75a14b366f10e20fe9f403a3c4cce8286e2b,e4875d7c6ccdea4f533ea01c0efd7baa62a90ed07ef96b67fb88c286331c926c281cea29235ffa91f1225dcd92bb99cbb221062175841e56a62c3320e7bcea2b01,9d2bf6744c927778f64aab7d6ca22b21b239b5c8106ec4c3bc890e4b358daaad301431404cd75922ab0856d031af6d27bf6351a02cd8460930d42bc2de55d6d001,8833644097072836ca3fd7fc1220b2ffb72d1ff47ee8f63b96a523611baf544e7433b180b524e8a14e98bcd9106774a9302b450597e1710b4c65a07952720a0501,00c429a28c6729b29b68474783e3ffffa9256305a8e15233cd4258cce46a5caa48c289d00946e1966c2d66a5fbae1d41edf02956bbf2245de8913da8b027eaf000,48c229e79c7e4a1e09e63fdfce1483e2b299952c4ead2fd0bfb0733b8e0a4399548f81327ddacc33d1e4627d521d94bcb88aee3642b91899f7b35c8cbb2966c801 +1aa51ed45559c9cbe608475aeda552edf1843c51a748239607fa4eff039247798c009faf674fee0ab44015eb32572630fd5753ef5c37d4e5287421ba7db766a13a22bca570150afdf47106e576f941b7af87a261d71422ac74be6f910eeaef90e4dbda5a8d8c36ed03c57ef9bc5cd972bc08b62b1597cf1574e2fcfc8e1ffe03774904ca48db62f19f991af2f6ddabb2c0f3267ef4955ae7940d0a8635ee9420ac68c140c24ca9f10958e35d1df559f92d364a3f7b7204b5efaad6ec4521ab3ff20f8c8ecbade47359a5e6eb,57b0392d2c383d8f4f599dce41fe64b3652d59e3ff93f3d2275f97744b36a13b,7fe032d19a97e45e2ec4f76646add101fa87c73d9f4495366baa3e85351fb90f161c55efb3a3a5cc1f00dd8ed6f186fb812bcb1a4b238e35197687ec1b2d881500,d1e25cfbc428e3b6b05c21005dbd880398a3d453403a437d8ba551b6a9a786c62cbd1c3ad86593e4aab197f0bfa807d5dc1ad29f222731e1739af9d48bea72a301,b3d36a872283acad7383b4ac0c8d780b035b3c41ad93b6455a24a7fab6462d86649be687e217faad84a1b2d8f8c65a9908767bb7e760ef60b76b8061624098d101,1375d89cd72066d049d99bdc1fc720f6a51e45659bda44800e71a973aa31c73854ce2458038f96ec7205bffb58b4c61c11e61cdf561d3044e8ba470f0253140d01,41f0a227412a37779fecd55196fce6bc3377520dba385e11ef0634c6bae5b7a52a3888f558e97f6ef1756141c3af24e364fbe0bc2215e8f47b41b1ef85afecda01 +b630e0bc81716aa83cf0cb5ea04196b7de55124a4c0f63918f3645fa2551036f7f38d850fc1b049a4aa47ea33ad4338d6292bd83b336f4fd6c0056e089f4aaca5c88b0e4fc473258bb0c3bdb8289c2638a5572ae04b730eaad030e36682ff2466c1aeb440d8c16e9c2d2e7bd7bc2ad9a923b32b489fa0518656c6f27bf9afd000185f66a34fe8ec90298d2896fd97485328fcc6f73ca1c3e3dcb3e61f7b4fcd033775698bff5f9fce0384f4afe0ad544bc3580618f52a43f86818881dbc7bd12bb54148d5a47c068d17f3cae,222878c21628f7bfe03124c229e032bf7d2a6e7d996abd8b9964f6bc1ed22723,5de3a168058a78ee3e5f5161214fdefba2468bfd660601d423d38caaa55dbee81df61a52baa6b7e0987d986344ee5922eb8c1b2d861325c3fc232c13665001a000,f0e86c1ee867f7f22aec6fb283a58062e270fe2005d811ebbea93aa8e555d96906953bccceb92eff3b5cb7e0739dbf7b350810d7a7ae78ee1537696001e390a401,2f9de0e5eb4934c2ed3775f0807a04240b5220a2b8b8a4a4a3bfa1b6cd6f722c103ecafa53c5b8a83c3885d2d44cfe9a80626e65bca0f3e5edb8881ffb50a31b00,52cdae9c57b35c38ae01e245e0c35056c0cd5ddfb8729ea649eef8b8365563fa55acdc5466557866a6f4e339de593bcf4407158a93309353c2a21a9bc5a35f7601,71adc4c4cbc25f02c52ec802850f3b93dd8b79f5188c20e0beb3732694783f2110e657b6074a1abdd5463177e69f3971f88f9af4c4580b7672ed9c671dad80fc01 +6ded7f9a25a7ee8ed01ad287e3db1ae17930415611c0c106711793f1b6df750ca41e39dda4888f679f1ef5e32acbd7e9bc42e3faa4f48882cdc3cea1e771107b08dc2c2232bcc403df3e355060e350f9d4dc3909e1614bd06959a62bfeef61cfc8b607c865ce57c43dde9840cd8aaa5a203d0822d6fcaf7df26e3ccc50b209eb09c4207f15a01e9d46f40d9405daed5ca079ccf6f3fc3e6ab1a6fcc1daa54271c3bb5e04ad9159ae323c1892dda0ce0b4122defd7aee8745880a8855c0e57d944015bc69a66a37793fbc8421c7,f5629c1518cf62a84591bb96695aa92210cbcb108612f962da92dda828022aa3,7fb4158caaf2710d0724cb92d1298e82908078b515ce0c232c296c24a64539f864642782bbdf21f994f4e6cbb606567e95e359b1905529fbe966b68c2e23b43301,fbc80bb3f91664e7c82646fe5e861b5b8a82760a8a459b712a9b587f08d70c333cbdc9082bb6ab8bdd9c4ecac4e785be95858aba36391e8bd0985819b24c421c00,0a09b6a372501de5f2c676c81445942e0bdea56b7e1273d936023b6e8ce07f0863a40394991e63e4636acc3aefcc02ce1ad7aa1f00d11ccf097c9a92f3a1398200,30883e25fdb263712869a1751c3fd6b6a53ceb24438464d65d3be17cc7634d811bf672fe60f81792732b32163658bf2aa9c99e8be9cdd6f8eef8c44282316b2f01,99a43418967255af9bfd9663a3eef0477cef5ff9c4f155f7810e7c0ba4b492995e7fbe384c806c8899a340ecd46eecfd46b4c6b5167953ce45da9185346f5fbd01 +3f27540b3861941a48e015d746ac5b962e8d1bc4a3b5e6381ee8d1c8c3497c287a91be56f54814e4f1378e7c04427af256cdd29799e6d96118e34a24cf11ddde59c093567fd95fea7359c54e988f20c1a06528564fd280486912d4ebe0f521c241201f34da82118a75bd0d57401cec62de71c0e3d84db818b0fb0632dddbd590200600eaef9f681455f46f2dcbe19db25b103ec1189fa07410aa016b73bc1d8f8e9fbfd19046cf92680936e5749e4b5b22218f1f406e4fd19bc4f84eff2e0921eac6a201dc0b7259f64b35e00d,d644a272dcf3b85f272b131ce0d0d2531e867577c03685cb8fd6eaf3b4715a02,c2606828044aea7ee9e8945f01b2dca0fc3586e728b0d0d75944f8de8f2329a77ff09276b2281d87a02ef4e173a03711aff7499398b4382c5254a530dcdab66100,dcf88edb627f11d7e111cf34a7b612d1960c5d7185b167732484364ee24f1cba1d69b1d6232c2b2e216a0ddd8268c2e106d0af2b2f5201b1a4d742bae63fa49d01,bcbf042fb16291b34f92b2f9d8eb2a0efebb683eafed198d8de32820138f597b4d732587a39391130fa3977c343e452aafbd63af1bf75b4f75b88f8b6c76fe7200,9cad0cafa1e12b25b6c45b8b81bf1b33dff5c52817293aa9657656d6be5716f709050ac40704f070fbf6434065393734ae837e775a2072a02ac320d4af0de9f101,385c6e4b1b3197cbf0c9a020751bde647d6385760db423911f5a0040ff2fc151182118af58d5bd08b7a0d6fdd79d92828d4daec0d3f6d447f7c6f44d787cb6e300 +6d521ac7fefececcc046094faa06df41e17c672c774e41de9c46913f2adc611d1713043d09b69c2e9f30c78a6a38cae22e010a35c58ff1ee2bff93567c2ada1fee5ffe94023e990779d651723c68f2496c8a4b9f5489e9706835e53104e4c289a6112d30d29668d3a0ca7d44e590117726f761b0d548d8efffb8f782fdfd95fb0d2bf782cb279bbaa6b864e9eb3c25faa17baec00eda99bd463fe79cd1d97973f60ddc8854fa5dedcb71495b96dc0aee654fa5c49b83e6af9c85e825d8faa2286ed1f631b1da46bd03c47c7db6,a62a9dfb62e05a86de851f5a87ec85e3204294636375d305d3c94275a2320f82,e806770ddc0622c2a8aaa6cf5da998bcef12b26fde0d54159b5135bdddb90f1a0fba93bf5607e5df80e30c98d246b4f5c9a183eb507ffb0ecea2d6ac8893e2c300,66ff4959d7f195f2896226de5c449f918ed798ed982229ee9e00bf24f3b0d9372b609fb3d04ef1cc6297a20ba1effd7df10c7505bc18f4af131070ee288f4e0201,79b50521b70dab0f70a54385e1b1d350b4994afb5c397970ecd0b4b433a65a014c83520bd0da5933fb9f21bdc3a21a9791a255ce3b0764adb5aff67029e8c5b001,ed5f040161431599be63a5d4aee8f82b41d94704a1587793f856e4d3c979c15a3a2337a682664251e10bd1c0f5034b8f895c9575ecac97b23828081cd7f71ea400,8de08610a2e23f8dc6a72817df55ac14cdc8ce456d42fd4404c11d927837c6d47fcf4c3cc98d0cf90009376a6ff3651531b43d68ab114b5bcc341c6e6b74d12f00 +e8025d4107bcd06f624d1e87ec590469f7850bc58f7642fcfe3bc91d5a5e28f3277d4ec2263100d3bf2d8ce9d6af7b185389c08dfe2af946881b2e027a3c763a04b7ee414131b9d549b51a765c6b360f5688e5c43d8f359015494a517fcb60fb0c5939a302cdc95efd8f0685859f2f35e6bd7d3dc5256655e7d63f9b027fe5bf17ad734d0f30eb19b7f532d7c4fd0a98f68b8f6e384a175c788a7c077fdc44546a30f7a9b1128657a08a07e825d240fce0850518935b488af5b0ded200d84074827ab22d63920958968d4b7d62,e43afd8641a3c40aa23397f2616448b6ddb4439f93cca78612b9fe2112de0ae7,d1a448f9941712ce67409ba1adcd9371cc73bd135ab16f77b13f671ff1e302a4366c631e49d20be6c4557753d53ff4a89f04aa7bfce2f4c4791625cadd736ef800,e89d0ecc8e550462ac8a756138f3e079d64ed55526c2034e32896831e323830c00943b3446bd95436b8fa238a854de947a629323ba6106e3dfce078c1b54c60800,2f4511b53b13a741f1f146ced26495708304b0c94b93274dc010b00e2603c6e116b18e81bc4943b2ff8aad657f3b04f2f2cd1745e174920ad4f2ef0707d184fa00,16f7845c45feae7cc52a42fd60031c6fd045ae71793ebba69110e5010e3070026bb39592613c046b289c65ffa636cc13cb37b2135eca4819e085d7ea4200bef201,7273b6675b4dc0b616dd1e89ca51b51c8158ec7bf1d6d149223ebe9954470880346d04f25b19f2c6fb2fb340eca9f131329ab31a4c01b580a669c0bf5d8e6f0f00 +692d5eb3eb2fb57db35121893e70feae6118f532569aa2a43b67d109aa3ae55650477b375d4746ef99a21e84e7bf0c83d57eccc513abb51d5b13a87b08634a826fc4f2f261e37eef75473d415cc75f5332969f75964f7295e4a30c20ca6c1ae974964b8f2115d1c854086b129e67c0a85723ba6df236f3e6ca89c684cf96548a097b0571605cb9553f7738ebba89c4c582449a17c82212f0891d4a93e353579951d34b5434291cf91652d78a7d657ad65ebf923c358ca21136f178d58c4cbfbd7eb15238a6039962e457eca436,40d4e8c39fdd4cc91267884837d135adef859ea6c8f0bf9528ffc7e07a7c4bb0,1390010a0285d3d763c3510cbfde01d2a9e0d31bc24138463004951120f7e9d51560b14631cf0e2420a1d15bbad6320d78c33bc1293ca853da1a5124204bda2000,9050d7bf28c00f29679881cc61a0176c7a1ddee66eba14909e3bf6f4ddf86a7955a6143ae43a3a44c50decaae4e89664baa6a35646ea258e8397eaca59e9e40e01,f8d27551a6ebd68daf99b2e6006b044a4aee715544080ddec05143d3b352822e22fbdd756b9145eaef8167d361b2e3f5661729e97f57e354a0aca450bfe700b801,abf18bdd1139298d6d245b82a6f4748379debb85ee34609b4fe61c1b453432c8564d6a9f8fbd276fd3fc71ef4d6691066606505a4a07829f6698f987d81a7fdf00,2eb1342353f9e6086e159edc8f2294d81dbb2880fb25c0834f4a68b34a4d28a25cacd31c96911652c1e291ce9baa01c4fb998e531211829dd48fa3b002b52ac901 +b7f506e037918108f62d61337807d2b17106fe11e1b302f23fd6494f5a656d2187a9292f743231517e1a2d600af7eea2eac8bb0cd02a75a0ab782b1a771509eec90dc945be9a3663bb9ecaef4e6bcc33fccc54574e4f91fac2378feb5e4f7ae3daf1da9748cf1144ec8dfa3c8f1d85175f08efa79acf23eb9b991b26906d1a3adc0925636579ec1a9ec695989d29100fe9b097f972acaf7a81a965b989df9dce7bb2fd878760deb99b9b5295a99788db48af73cffe9d6a4223e325b44000e985bd9cf017b4ba4a1dab392b3ec5,2030afab15a324702a91ddc32ec7ea5e1e0d28cc087120e6dcd3726f26fa86d0,1e4af65dbff8402a332187804c5e528d4f7e1ddca7da21292700c2152a9908ca7a94e48797f6ba0255b3f4c125358c9c93f21a8adc4f262dcf512dded560e1bd00,702b5bcf530ee6d87996d4d39011e8b52d61e5f40da0daa7bb8f4960fa44134b63a0f7e8c8a60c27145ae6957088950fa4c5faef8914846be353e68c15f5bc2800,a06c6d078561b899fc6d3eba24729e6d4ffb9b3183393b332cd666779456aa051af3c85480ea0366b57adad0a24e85e8fb93773ad977acd76e30fdceffb888b100,c46c7c4fbd543ddd5e05570665735c015855e3133df4884ec6e796123ffbc4f2080f3472c1571689b2cde848f64982eafde500e9b7868706f5caef7f3134a5c200,6763998d91f4316321ce4d0489845bdbd1d449fddd32707bacc8350b50881b4601b84adbc636b91d1630999c586f60ca162d9e48625b81661a1745ea6020435901 +9bce2a6762bcec48d070410aa60c718298dea966dcceb21f5d6dd42dec809d988a85581ccbfb48a39243aa556fb43261c879b6b5978d0a9b9caa7ba3ca693941ecfefd2c36e1375db2bb52be80132630b6dabfd60fab56ae4d8ce136e6766c6d945b688e1bacb4ab8785a43001cae6c82bf39fd96e674616ba50dd08111982949d16ab2bfb2701d73523848741494289e249fc5176094328d9e19cc6405fa519e1ddde6660c814a3d64984ea3e8c08c016b37d24ce32c4d2dfbe72820c3e06c4932fe863490ed48711ecb199d3,69b57014a1210b65e5044f06a499023215f5a3157fe8a5ba3b54a5f264d0f382,13b318fc83f8c4d31a6ed2f4da63a5d036d949f87f76692bca5ee37ba3b035dc05960b0ea27cd925f1336e5421aee5759aa61bfa699cf6e8a2049cb4378a439f00,e74ba8ae2b6339ea1627f275449f55cf2042e1748178bcda49955d4461c1f4005789c79f8628c39dbc90c7dd444a3df40685f57824143e7fbd2aed1a630e04b100,5fab0cb9ff3a019dcf548fd6702caeda4f629633fff604570e65396b314e8bd2104f7e46865fdd5190ccdb0786786c2c1ab8123f791c819b76bbdaba9150c0a200,ced8be5aab7b01d512a86ed44acce9bb8b8f7f84f690a5c826f79f9b19bcacad755899f7d5ab14f2c783e0172f3b05945f328e56ef0a1c992f361c259c7a7aa700,4054408bce2431a9b0901c1ed17786e66f39a1ba1e9f5e3953982e112092bcca77312d64611aa50ac8c8e134c3b572d8746bdac6ae17714803848b8ecac5d19701 +b4b4b7b08a7fb4214382911e346ead5032a33a1d944d1f276258304ab542444ee09b7e35ff2ab545591b2ab681a6b2a670bb6c11a9640aeffd1468bf8ad7a4e80b5f316407a8b62637bdcb5e7dc7e9245ee57ec538a10e838de9ef573b64ddbcef54d36f38e05beecd4fdf9e79314cb117e2355e66445908560f9a2e9397201c269b54b03cca9e9a8e251b1af29a54b6b3a6bc1fe825784040149f4fe9cb32a33bf9cf06cd8553205cc441e6b78e9084ce96f642abcd7f5f7956b94a4e90c178e14c3a6b9c32537646f027b529,a9d662a030bb5dbbb2559a8a98215750e32bdd04779b4ce4be8ffd9f05183e0b,bd6fcf5843825ba9f5ff577df6dff383f6a05ff9f68180a479505b157acdc7fe47db334e9c6f0b10f96e5944505780587a0acfc57d9dea31e2eed631a03be94d00,4ee08a54b876e6dea7d82e1358f536aa913fe73cf6baf479137d3f3b9f121d5d68733c7db91ee58dc8ad02ee4832943f25cb84a9d296704fca5c77caa67bb30801,d119cbe39b6d91f0a21777420b5a236835ad8b4fb053f04df57b4f69ef1e652827466a67a4cfe525899b8e7f9fb0967a1b1aa2208e77c878b48a21f83df910f601,1ee50fd70c1f8ed4068349b3aaf82aef7134b51f6837e98fc12f61d17e43886705d38deeec7e13af88b546a2106f8b9e9eec49b759256b684507ce7e6f53a86a00,b76b6b8fb9088fbd0cbde05df4f310ef64f9dad17464e5cf13ed5a579608c6da681ddabd0b0594660e153efcec5e95c2455c8a8b6eed4a53def0d709895c60d501 +bfcd6e615740d35ac6e871efdefa4dd3b584eec3f4fc9ef0800dd526c20dbf4cd3e0dc5c8397133f68796d411ae0c26a726459bf3735f865e7a2f0e8d1dac44b943b3c93bd130a2cbd864ffa51adaef154def5fc7deb6c52e984b396edf2d2158c8275e2a0b50af8f688d53aedad5581b6f8951fbe3f783385b068a31407324d4f277e35835803e18f6e5dce6776cd379e3b0a8e421b77db508aaf3dc44b03ab0a28ab4e381f4e33ff365d8e0e6cc6e3567715aa774fff55905c7d889f33a0d128251291af13cbb0b444c09d56,ca24dc4441731a78f9b124945fe9730afe4b43d6f6fc3a403ea8e4c633b66c1c,6294b8ed307b1ba85d66e2afd3e3509b09e5e1336b5e940100cc443bf9b58b2c35396b61d2021ce211e5053deff857c4acfb538151410a3f5be8501bf7b8cc5f01,21a272988de0a2e3abe9b72018ce4d3a0c78e2930741fccb27c30b157188afc930cf820f065d1fa116b4543a8ae621ce8dc9a05dc6d28f40b010ca08b430b47800,0a5b89294f69ebf0a1439fa6fb1f5a81483c4b3d1b42113cf7f955a2327d8cfa13961772cc3a801f90af8d5f8331d10e99d9fcf4a6508ee5efdbe60317bd807f00,0cb12b22863bc440e3761719c4d594bfa9a1c5b489ee1cb53f1cc2207cadc4d910efc96c545cf7fc94a847e0fddbddd0e5f45322edab7af73d57cca10683c0ea00,cbd3b7696a8582dbaf7dccc18d62b098a87780dbc7e2d335a64768e6b73c535645023dff5b28f49e1760f9aa125835b08df488194468488e684cce85004cc5c601 +d7ce03f72de3e80c90cc663771874a256f0770cb88db0941c6508131f8754763fce9738f9b8ce77336de4bdc2f1577dcc7cfd69217e0c7dbae6b527447fc9e882b9534c772d261e2e6db4cd785b4061940903d3b7c47a33890c867ce45b914b8a055ddb9e77ed964b0918ac1b722a7f976488343c14e5f6a00d69f3046e7d16efc40d92f7cc78694cfb629d0db50cde0685d03ede6f1466c2b81379da973c9d349861249d81b51c490e377d5a63dc9e9f704a5aeba112c487d46fa80be3d6d1589cba1eceec5aad31c327d3419,a1cf9f6c64cc5bc06662e2605e7a8e8062326fec11183b0237dcc5b5d9ce1315,2a9eff43253a5cef64260b343a413a3248012a6b0da2ddc33feda2c35770a00c7f55fee20ca173d6aef8883f679afb23243553d7b9ff9697a561585558e4d44600,9f5c8a48c8e3a01fe217e1e104daec094d9941e231c86e56b9883932d97cae514591cd1b587d6bde933bfc0ff92368298852f9db56435609829bccda8916244c01,ae9f8b2cb7e7d697fc3ac26646a19c13c709c60b5e1e37f78b147f04dec53a8560a6db0517a4e61d1459886a431d48f4eda5ae12472b06ef05af8fe44cdfd2e301,8fffbae8a2ae4af06f3cc931346856a5322919bf91184ed769f2812ccf49dad619be23fa6dee049f613ec994bd5157f37dce0ca32126047df8431a383e8b912e00,98764b1c955bd913432a924fb149ef3156671dcfbe554382ffcbab9842009ae66e4dce9ca68caa50f086947661a6cd6e13696f2d6eaa64fe798c9ccf8d0f7a1e00 +ed9a63a6756e316513b8cac53fa916e5a3417b15296574e013d965789f321648bc4c2be4bc6d67165c0c2957b46d98430d5e39b97dec5eb2d23df628fd446a48da14511715dde7c356f5542f2314be89653eb0cd93ba258275d9ff8b096f5b2de9876f66383318b0022b073b46971a7ca70827c6ea99c24006f260d3bec4f241f84b3c83be55da0d8226ade1cbde4799206e37c78b323bc4839f4a6096a64b4c6cda60e558a0c5c4bbf174c21649a27b50ab52775ec938922cf2793e13ee83ddb24e30f10d76ba8a51cc40293590,74f76d484f92a3734e427cd3e0c54b5a3384588e88d5a3266758957809105fd6,44ba514afdf4fd97db819d669e40af780c1e6cfb23761bb753ab20665ba4d5da021b12b84ebbbc65800177ec05e9657112a2cb012f3e79e85af2e5a7efaee27501,e88b29835c90cb5ed87c0f47bc66695cbebd6d0e1fa72bcef7d712ec4684a08f54573bc5d47d9c81f17d9dfd59e484193afb7d35d11e835463ceeee58d377a5801,0eefe4bc862509cf5e6c0fbaf4e59374fe975345df23308926c4e4ae98a4f7fd73e923e583a8d06192f67e4e96671f3c4843497df85b23ed6db3d086c5bfd55101,fcfaa5b1c019744ea460842bf8e4b861dc6127bd410c3ad66c6dc6cdabe3bc7b09f2b7eebf290477375c3e067263f6653939297b70371d44e2db4a557d1fab5401,0718addd7ece240639fe6b0c9973807390caa7ac8acaf6bc2b097b58676ee67639105a532426d79888e53845e544e47afb30454b3b208cdb2992bada42f71efd01 +056bff4f3bc2224d128b56af1f7b4777f895feba23b9c934dcc948906ed3df67e65a3283e593d31c0c4120e434795931e349bb3c3b0d6ac989e7f5e28f210ab8dee36c93839fdb4da313dcd7cc0a297213677b656841f15fd5aefdef4e0250197cb93fb474ead45396d05fb848d310bc8781ae01999664b4c809a93649f83afb85f46f34e93d228c5123d5c41642887bae913e40e94bd38550ba0edaac7c34b6c763e4a761c07d9fc9f6fc3b1194ad941e833bf66397bf0c27e1046f5111edfd9caa0b71dc706e582aafa301bf7f,169605e73ad33aec65b4034d8705faf9d306ba5f3686b00ae2f674976a68ffbb,62c660b474a9da8765e7271e788fec4508b9ea5034e438f1ba503499d2f3b1545f542a5e287586279af96f69966edc4aa93819b872ea8444d911abd4975bb13600,1a42318830d2a97bd96e08c07ef54841564ad4fe254015ea9be04f7140b354cb45218bf532c3fd95843bcfc9d396b270304f95b78edbb6c2270057581a3f061100,8f215509fa31198ddcfe0c8d02f2cb0ead051858896bf32b2c26b5d97ba0e9623ee6bc23306a24ec279308cab56f4cfe7c83f5715c86450d24648c8ed9cb2cab00,0c2e6be1ce717c672c5fad8aa90d791333c51aaf799c0eab46292beac4adbd24389b021e96b7d65539c3cbbf33e864f27fc751784f8204c023f2fae434dd6e5401,bc920f1fcaeccd6311105c61ec838d9e0ff28be4e8d53f9a0da149e4c47f2f9054a7aa7643d89508299231568971836460cbb8706a1d37b5215b62e12bf2505d00 +4dc70f9612b4a142791793f8c2030e80159d5bbe611019ca1041beac41e4e14db7f701a711301adfaac8abcecf3a210dfce0630aadac25520ebdf33da35fc9f35b7af9e55321e1ad40c463045aa93c4f35bda2681d3a373010b212dc73152483c4a64100aa08679f9fb4fe0d240bf6e19269d601b3cd3becf7e4d6f0d89e243468690c331afdf927cddf79ec011de88c964bef31197094066422104c635079c1d79e7a4d2aacad90ff957516a2061695544170e0a2c6d69ad97c03382a7becc529ed6454ea9a4d319b09dfe03886,0f5b386c60e8aafcc400bd279b6785c78f88dc90879936174acd2de1191eb8ad,1e687410d314ecac4f4c67ef31e7e41ee83eace240111485449a68ea8e149f0a514119c13ccb45c70b37b8bb84ac76e2848780e0aaad01969ea0d87f2770860000,b940a111b54f70e313c118deab976748a12e501205baf510ad514b60ca5695865886588e7496a5f0efd164d32a8eaa0e281638893467fbb95a66dd9daabad3be01,a05cbd1c9cc777b1605dbe504bfabdd8b923dc564486b574d68f6f9c9c0075f20123b1c84d8bd4c7e1c783466b2ec687d5cda4cc82cf5e08c612808684bdad5300,e4b14875c7bccb142f0fcb728cdb01b1de48d098789e588bd9cbda6bb2bf06147316651cc293b61116501b13a0e8371179ef5472e4c5c968aaf4b96ae24e51f400,819287065b3243729397f9ba77a60ac0b607e9f6a13c1d262a9a1cb2c8eaa8ed0d8c863a241a77cbebf77fe810b3ea4dcc8a998c5f2cfa916972681a2f2147b300 +2e2518538866d7a2276b39ba818546055a8ad33cc9c0a3d1023fc571602233ac75ecf9ea7e6e24b06eb6a91960ad80fbbc4a0f5c45ff527b070f8cb1a59ebbfc42a7bae2cc539d1ec1d301eabc4888a44cf292893753b956474540ad3ba4954aae9969b017c6e15f1ae9a1623abbd9c3c455743ae62eef4802ba902faf23d537574a459affbce77dd9e172e061777cc481da0121c1380dbc723e6c1f135ce21a401097f5cb8d4bd206e8dfc21ff5662a31c3261e88865022118e03ece26478523de2ec6493f03c41965ef7e1832b,88cffc1d4edbd02008d208506f5ba043fb49eeb700f2ae9d090c6cc1faa13ae8,b93258e3deb82aa9ea85d35c7c927007d856b0cc4f50d211d75303126b10fa4b7fcd56c23cd28dfe9f3aeb8b12ea5782bcfa7e4c5c6e1744d4fee6b754f642c801,96e40c5956ce51b7a269ce62931891434b61adf2d393be8b425e07d000e15bd639dc7c28b143b9004d0ff5b9ab4de6c9f86438278ff5cd839d975510ff60fc5401,5858248cb81b1f7fc0f3d042cb7c9985ec25796a8096cf2392cb881be48e43bf01edf76b69da7ab40a2aebbbdb536369c9d604d8d2dda56595868cbcfd85f27a01,f097d0e2dad3e76ac6c8507f444e714aa8ec8f05cd26019aa3645002fd1d02b11a51c922a835dc1f9da2f31373433c68c98066e6511ea5609627c463e335bdd400,307321815c97d4166c3780eaaf73c3bd2e7880b5799d3be5fdb41e25ee74434d699d55cb785dd70b270bdf41d6d6c1a69645eca0f337338cf84aa89c582c14f100 +10741ab57285445f8a8829224246cdca54721bf2f7e69f6303b871079a403d4485420658165b222c3209dc1498c6363aa40308e4c078afc9ac9d3adbe1812814e45cae9e862e79a6498d085a243fccc61f843879fce8b7c456b780063c8a4f5d90b535719f4fb4c9704726bc5ebce01fbb4886f7259c0abdda56bd195e467bbab897e14746553946984d7892e69aa60761c6ec8bf801de94b0107c87b45321d570184632c9e77516935f09eeaa983f0d3ea0f93c693132659249aa47b8e7584f40fe7ed18d041a391e67e88455ac,263d3d73a2708924aa234ba2d2638d93c104040bbfa00fee2c1b7c758d8eaf70,7f83d5cd887f7b7d9862cc462179b1a06b866d9133358fe434ab99d31c1e7ad0494f49a546bde564f6514a6b7456941c4bcfc87b445c8b0ae5a2c4f21c5ca16900,3a8f86e8292c3787cf7091906b56bb3ca172062f51f12d5676107eb9173cf3c207106defd5d1e7465988b52b7be030b3b41cb24c83cb8e2f0ca51b468d625cee00,0fef19022ae2f8839cce5f889bbd4b07016a9ecbc813e1ae16c66d39744e935424da96f5354b12d68b67c7aa07f0a2e46c9b4e3fb5df4fa5db09acf98e70db9001,25a66b349f7017160137f624e24a97ac1a05d91225f8fa347c616f83c291cbcf16bbd329136b3d1e6c6f6ece147e452c2d37ae595e7bef0e1a25b77134c9cfb300,78e798f6f7ad098051eff91d23e7234ad9549756001bd01480019bc028d48e257297fff4e137fc935e92d473cfb58719bf879ec0c7193f39a6e018e1d57cfb2300 +06f4e3134f869b9cf054fe2b63a6899060c97cd4f3ddba4ee946a5371d0247a35aab9afa6fe63d7666d91b64c2d8423fdc6a6979b472a6faab92ceeb1b78fe0fe5dd1e396d85c29f8a5763ba5ae70b26e52d8803d683a43c5425a2c570e11715b4957c1e3faa1fb5a7c5bb9ee3e62e09ce9477ddafd3cf2b3fc910b650eaefd5bfe451b69a583b039ec97813f2b6855f02358db9d011a5edc79aa3d5fe8caf8ac8801b3d418578035350f053a75db9dbf7d1927a330bc94f455f580335db176c18d7c31abe0d2492fee4166e5b90,36ba208cf641db1a000abe998692fc6a54e1660683d1f51cb1e501e4187056e7,1d7ffa18bbea56f7727899627f6404a1af1164d8ade2b0a093b37a7276b05b9d50dee7835f39847627a43b642c5e96a1c29da5c31149f4d76defaa86d695b82200,0988dcb86aef8962ee529b9ddd2829e74362b7525c91a4c43dec0ac811519990138b4f007859155b269a8cf4ae55071826b52d70a8cedf49caed190ebd576b8601,2381d2f5cdb2d1bd6fe4c3c5a96a442cce900dfc628931debc8879f079c5b3de1edcf8a7032071f5a3c287f6f575093c346124d581ff50deed2e7670a209795b00,050aacafc422bdb20e441d6efa2ab9d2546287ea1eb94bab01a68e6dbd73a9681d6f35b27b18dd684b886e0b1513a0dce8e20e183d743d54b54d899d7b27127b01,0cdee4e65d734f0a4d9064de12949c2b82e5e3f5d8466b814337d1e39ae444136320834dbdbcd9c902e6f8f80601a1f9e2c2e6a1bc9f85698c8bb8601f62a75100 +b6ba7d115005337d6272909bc6c28843de12f2c3a540dbb0828a50aa1d966c2f66f015ec65ab602e22467b977cbc6f1815f7fa505bf32254384c3dec628e1c9bb78d5a8c11e13a6538d09a0fba3bfe85acbb9a0e1ff06497684acb4b817ceb9960810c644e9d3bcbec7c2083682427ebb5f3209427d9af47086aa69568ce5f937aa15d0e13a543c9dd061e9268c12387ad15080d908e3cbfef047adc5f1435eba451ac0bfac19e21633191cdbc50f895058b9c458354ac3ef20dd4ab4aee0a6bc90d6a2b3ce6ac47e04ded67cc5d,f04c1a26f967730a5739e7fe6f0b9df8d2d25c1eaaac3c16a4e81c7f4ac4d1e4,8398c4c12441dd1b4f7ca36b912571f135f305ba8544e1f84aee4a0eb08bd2d5735f6851755a706107a23aa061e0ad360c1199e2461a4147cb20df4017037e6a00,ee2531d39137a3132f8bb2d12a5362d1dfd5e12f3a43f1680dafb93f3877bca13ca70f6b2c25da91b62f68ca443f0f224513985038e20a95abd5fad95b779aa801,981d5f9a37ee52ec5c077c5269feb704c1f5b854a6272bdde39d6021dfd8ff001af6ad96de0113db52d132b8d76904e57e15fdb236b1d9e95e2fad471ba5fbf200,1f96525bfd7b664b476737085cbbb16c77735600ac3a4982962fa7781925298c6553c1109d0c98935a2383c0592c56643823be8862e32dbdfffb358cc0b03cce01,81a20b67a2cf342523479563afa136480cd83b545292afa7e6b0078688cdc6226007a097c57f56e3da9ad8bbad19eb0981d3774930a5840ebe584561ec5b30e901 +f918c7c6d62b22651ffa187b66fa7f0ade78e0720239a6c38622f41098a3662eeb4cd7922cebe3984d669d50144e18046e59b97a0eed7bb4567eb4dfeb6a3c5b93ecbe82c2b55ad03aba669653994e06adaf3e4f570f1935a3e00c9bb151ecc35a86efa8898f577e2cfeb3fb139187f1f429113017af347fd28281e0c9b365fecc7f7143e03b1148ff7e25b420d5a2e0d92fcf2971c06885282f13ce92913d602e9333457a75d0a0884347a0f2500429605db456001f97cf3ed3403659a777d49405d26f402f2e66e69519e021d3,8631617f1d9bb6e4e4ac399afeda21623cba27d2a7b2d7ff86fe9218b577eace,737ffebce214da99578b416173653a95dedad2ebb8cbb13ead775f9b19afb785211c4241d0f57865ad51ec54f1107c745286cb0f2ceac67b90f69ba6b8823c7900,1558705e4b05529bf086395b3133112ad1b9ed7e9e440b0eba3dc7deca2c04d84af5a0a63fc0f7fcf0af86e6bc309ee1c4aa105a26ed973d6f5a3a1378b3ec8d01,65fc38baccde1247037b9582078365fc9511b7deff5f52c0b64a8225c3a114345719f658cb2847fca93e8a40aef7bf99ea68d5f4a3b16116496f7d71dc52fe5a01,8bbca707d31e440bd00d3b641ea8ed7b29a945a9efe9b6103b49ec788cb863f211a98dc7dbca5092277030b6deacced21ceb197b7c40e06a056f5cdf6148249e00,7d24fbbedfebbe1fa84c4abac71ff314c8ff4ffeeb10f98bbaf91a98cd693c4269bc4446741615df38e7c93903fbd6de67e2c4284acfd9223203e93f190ee10a00 +901eed1389f419c3cc254459268d5987021de53c5262d8618ed2e92af58789b3cce42ffd5752b167bf02fad25bd770a1985263dc2b0117fd86c746bc67fade1e9f3acda4e6259a0093298ad5ccd8c2dbac0920b814aaad138dbda8ed2f8b629bcaf867bb2e785d807b5688c7e14995bbf762058ee68eca5ea1ef14947458a59410522f1764fab080c9d8a8caa5e7677d5c3fff94bcdf6f3dcc3a0b9ad366207699d1afb2c7546d8dba700b444427c4e099f4e0e5f0b3be12720979be132b669c0b1dc33b1433e676dbd845cb95fb,c966a966fef88e81d6b3fc30a159e435ec267da8049c8acff63d48f26f4a5095,6db9dda4461b8dd49da66557d012ce25df05a6472b99d3f9b703403e498e51aa5c9b42cf7839dc5c3a87e01b4995be45b3343cb5295a48c7898153af783b5fe300,df8daaba25ade531c76fdbb91a295fc2cc942e1470b5039fc9d7ad58aa5b699a2d099f12513ab0c3e52f83b7e1ec8c915014a8dacc6df76c1e784b4df7df019400,a1e8e85627d359a9e44102c2cb56a334e69e29adc46fd3fa628e5a118a23562f726016c75496239a3f69b40c39bd5d19d69d2903625c1da01f962c1faf7035de01,368bb71b4b081872498cbaac69f2fd33ad2fafd871538d0fd4a4835c36307e0d1b1557697fb42df08d62c5ac5fbb9289168092f479eb1029c0b64207dcef7de900,9299b70fe4486c51800cbb0b3fbdc149fab0b5c2c7b791e2da3784d1d5afda772afcc945a523facb91245067a9f57b563b3c6f05a108d3dc938732379d244fd300 +f4e3a8eb7d965f1240349100f494503a2976714b5d393f7d862df555e175ff0cc6df25187e59fbc62fc2ac51ef89a9b31db612f6194d462172bdab2d9be58ac1f067b64ddf3eaccf98b8249b4087344c5f16efd75f7b17fe4c0b212418aa2af1e1de4e74ea3bc1be235120a0e74f6c90ff69c8e84d402892373d9a9905de215797a4f92f24fd7599a5921f3e89dd7fa658c250d02ad68cb7cfff2639abdd275ffdb2f3090112bad0d36788c88a8533c77d04291065f558a09f197a1963f26894590c12650e6d30de222e8d44aed9,3f4b6e1752d3729120934e29ed10a82bd9053008d425c5f70f65355d781e4f3a,77fe4947c988e197c9397ecba60730a14e57bb0d268ca73cea9e059ad28228fc2f798897b7992f4c7053ee1bc8236e6860f2dfd27fb1913c86e7c1e21ee9923000,d2b46e9d15c40ac762fb8307aef2362262578a3e91eba96ea3274480c3cd046577b3a2386e10c80e17073d7f497195bd6f3c5ee5e0f3ac1dd2a6bf911293cde601,3b7616f9ea0f38cc4867a10219f4d9f7b4378e1cbc0fcbd6bbb14a6e5bfb4150317e55969d4a20cdca1a779715c627ee7c09f01db847a15b67fff6f47cd105cc01,7eb024525cbd8ee3bc9d0190ecec771dd72ea97bc280f963e2278908d60027a80bea0727f577490c3ef699a4203c511957a3407260710de9bc12a106f248c28700,f31c6c9498e7e497adb03056d911013f8aaa956f8c3ee6cbe766ac0ec48e789663844451906f818ad821858cddb2dde587ca8956242475285804d953b0767d5d00 +ebdce06a3daa29f2173ab6ebf6a2d5fed20224f0158dceaa1e503ad9f279ea3e78c5a504a1c797697d9ce07df3f4a7c5ab18ac549b589538bfa9ea5ba7d8c84c4ade0171fe83066c705a71984c76aea60ce07a09ca5168d087e6552dfe971e95b7a79dd79a1fd686c2bde535184f9212adccc71a056bd3115447872ebb160888c15108b6fad3903732391976711c4f52426c09b13edbade4cadca872593e3178343087c4e13b9def7e23a3d00d290b1486999412d7e6d4a6711ea4db8000783bd3523efe875855746135813f78b9d0,f307bec9fd8b9fd85aed8e8ee9738599402d05050f240159fef9e3e0ca41ae48,40c198ce8b3cca39448d71b9de90aca3294a3c4ad9e781007247a86962c8ad7c60c05368cc53e6da385789c3e4e261f728670461b76d936041c81cb4d94bef6901,243baa57459169acdc4b6e388d8073de5dbe934b1635b42b32ce5fb9aba0cfac34b5a31694490dea82d3b2ed1359a8d4e7417f2cd1efd53ff2fe93b0f5ecc49801,dc0af156267bf1352f4c41953f63b7e737ef369a6461855917bc5cf4319d63071798591d41d0eee0dce15e26164cdf8762c7d62e1561e05d96d873d79fa68f5a00,1133ff8c022e9969c86f10937649bb13d1f286b1b4f566c5c179730d60717f2626a5664d779a4d31258356288630bcb1e34e3b9d41fc12487a34168606f2dbf701,c62ae4fe1c2fc2bf125abf19e6f3a0fc8b9cab484d4976fe418ae836a86bb7db6e3f93d70316324edd1884bd5589836a648813acdfcece641385288d4ce604b100 +ab6f698eec1b8b0d0d97d539eee80acb45358e29302700eb40cb70089226bcd4d2b8d560f21f4b3f2b94938f53d7b76439523f1a54f08ccc7bbada7a440c15b2d6cae5f2eb00250568f1f813aaba95afcab0f843014c414f4997e761808635fd0c367c02356eb50ac160cb18f1e07c349116671f9c156bee9db717c61e0701f5b53a6538628fadaeea5191c6c4696b2cf49b956ba9ecd1bdbd30f908fabe31d229e399a99d8c452b0cef50a26184c8ee437d3acb1f59b61135d0c813cafb7324bf7740e1ccbee5273c406d83f0072f,9d03b617306176f7aac0099cfc720b9c3c887dacd25a540e415b0baac0699289,83887e400e0d6e8d567d33380d3a7d9f4c7a675b745f8f73d3df2ffbd97a82e31749d9aa9cdde9fd1f9e8f5a43979509d5a417320f6352841a8c91c6484afe8901,f98e2bada2945c8bcdcc3cf5863f8d9b99dc85ee2a244c49ae3edfc61ce0049e15cbd3fc2f52d10a4d9aa7a8b58f4e541413f4ddba038096afa0070461832e3800,2f053e9bea29524287c8b60a086a9b7de57687a19179f93c2e6c6bdf98fed56c07f3230de777b4bc95c201143ac868226e7be1dbe7c926ea5448f533a1ab8d3b01,ae26e57efce5b0eda5774315182c8b5fef56016d8f78d6339bd5d07e5deac76436c6e39dd5d25a07e94edbc4109beb219400a352054c94cccec493cac416ceee00,35d7c8fb4a0c8c499debee3d1bb22d274eff8393f1ab24bf29c74bac551c1223157a3dabe901803cde711a8dbcdcdb2fb723a408fcc786d8c0376593e1beae3401 +75c6e1ddb96b616591554f2e1845caf8cb35e0c0816e3ad5208e2e7ebc9aeaa04860522813a5800c5d3aab795fb0ecec7858b120ec34a59cd56cdfb95b9de9a6118de73c3a5fb0c4f25b0c25f624cc251212da3cb6ce040c30b6d1e67a41c56fb8fdf01e62251dcf90290b6c107b1af71e5b2e498ede326112c194b944f03151a20f3117092adacb99f6161fc9abc33136c940dbbca4a73ca7ce6b92923c216bc0128b2fb0888f0f2963f676cf298503a59e431cd1fa4d4a7693ee813caa6fadd834b793cbd09ea2510aaabe7d3a7a,a7a81255e7990ebee39972490d0bdb9f0a05a982519b8907411369c951b52a47,91e829caabf798ee246409214049c4bfdad834acaebe7928c977e172feda1ad310a1b762603da36a4c365850c507285d1713f88c2a158fd566bfc49019e525e900,cefb2d92d15a2342bca8bc9a566da4c929a525e607367ee256ca36a394f6800309bbd42d7b0e2ebd5e2e743b4bef179b4adfd2a2de839290e36da25be45e13bd00,b6b96fca1bb1d906368e04fdb03ab58615c66318586bc93b20438997317ea2d81cce6239a7202a7004a7e3cefcbec111cbd216a6d75af90c05029faa4c6a004200,c06e6a636a005ec4cab68b07c63028b673cccf2049f31b273dc083230057a230709e6667d1b2f1ae9d03cf4181dd33b0b485201f2798af4cd252c406121d095300,b442887dcfbfc3da349896fe0df35afa379928fdcf975e5d0c664b4a18e44e0a40e684516a480ec1f64d6f61637135a825b5678c601cb7c83ff5f0ef90bb1cee01 +cda73adedfa140571de003a0e585e7b42d304a5de2777d19bda5ce360bb7bf7f532fa8b5574d130397d1d4a01949de27b13cb5ca0d1ec44f2b7acfcbf4baefec2e8f25057c7a8845cb92f55bacb88c71b6ca73a88b711576838e2f49ae7df7c23a87ada9c0043cb654221421a25db5ca5d958b10b13f4a33eabe48e13031aabeb3e966a09160649489915e62c9c002502950c89d971ead627435555a4143dbb48c9aeeb2e7ae5132af5f6e82d9f265c625e32fc01901cea71b4d698ed677f38156c43b1721c5fa9ec38cbdf5ef9b4b,cbfaa3b9352104a626471e0edf97bcf91793adfd70b44cd83f63658027b09c75,207aa3c80d40885d0842ae18dec94eb96a1e2db4d55850aebf6665cd7c8c5af97aa9b2e2dba7121e0d84a0a9a18e0c6f9625e24ee07b301bf61b47cc8b26580c01,b77ba636b69d0dfd67f2510598073ae29f21f402fb687141cecbb6e1e3cb66825891a9472e89c403616bfe9ea34e5c286eb4d18c92dc0ad1e79ea46fad535ab101,2d756ec52df67390e0d338eda2c1398d323458984968bf157a8d75320c5563c8660a28c92eb989a49d71f7f2c5fe7553a57dadb9f626a6a4a55a81e61ecd508101,408ae1d1c3e9dadd8c786dcee4035cc51b7e82f308b951ce6bf601f8dc792a802297a784ae375823f0efd6fc901d6b8cb39cd011ff488a6eb0668d40dce1afbb01,10b1ef6c690d64d2084f201bcc5fc8dbfe7bb9202d181b674d57b51f42ed1e18491758b52e3974962f118a9bd3d1f57982750dfebd7906e039f59241b2a2518e00 +42a6c36ac938d11288b94e528be62d3819013a1642b704e9d6f139ce6420bc0df3607dabf721952e773a07221b9f9d7322cf320d9407778d6e1d7e87412fa224b58600f6567fc527efe406faf2bfa3de9af5da772b5ec8bde869a76732e3d7070bf23f2f221b1c188a44897f2dbd61013a3cd59261051923f659681e9c442e902dfbb1155f9de3099b60e8a17a7ffbb5c6a16e50632e33fd5f64430a4063a6b129a2a517ee084c69d32a260ee9e20ee7f5a0a17c834b77d98385d2e157715a0ed5f0b524b4a704293429f0241f4df2,e17ccc398b0ef65ecca8632d8f62b03740b5583e5e7df5ff9bd0f6b132321285,17ad0124aba035413db3e00b569b164cabf476a85d5e9d54c2d0a85bfba5fa9741fdff16f1611f8dca34ff9fab2be7a72015c4a178162b63c993ac78c32e740300,6c6f27c368822179e25c84f7756ca08903176f77db5eb1bd89634f94a115b24a4b75de58ac442105b0102f5f81e38c58520dbdcd6fddbf4887aa94c2f234bfb201,dd647725d7bd28f39339285de4dfff722bae1e3da08dd2ab9fc020c5178bb20e4e0286b2dd4b2e30f2c80de25d4372f2684407c95b2f374eb91b94f888fc05b500,35460a1d7557c3f509c51967fdb02c1ae4cf37892d0572a91c479bd5198024875c179000d8f381d42315b119aed25dbed0c9d6ece76e3d3ca4b019a0d399166701,8ed85e2825408ef171fcd9b71bd898f255ed246053fc293969a2903c4be9a88659318e281ac1003452b5ff8f05e01437a2eb7c0af684f906b48ca5c9f4fc963200 +847b137d53028e810f1c55998abb2d59ab84299153ac1527f84c3d80bd6a541c21424b2a8a06a42f01e356fb5d852f4ccb761f2736dff33cf7a3750d68063dc859313f5909a22a6168a0583e673982d65ce08c17432c22dbb18c7c57e15c5c8647298d4436e58698390ada784cd18e7ab7070f03c4a806f561ed9812443247f1a222e95b9719c15de445e028a6ef3397c308cf7a64cb3dd0f200d9e88d26f0211fccbdc4dc18df4942c22a216d31aa75f84d230367570467df09d3b057cbb3efe30abacdea5862e6582dfd092e62da,54b7a13ada40fe001f6d29c3ee88bcb18cbfae8b728b7222b5be78906edc4106,8ae2eda456cb3bb7e8fd5747439853ff137478b9162168a1960d72d1d7b5ad464abefe967ebdb0a5be615cbf1f438ad7fc77324c5db81523d02e9b2d0c5dd17101,1dbad86f2c1d3314edc675cbeeee513fed2771962ee9673671a326a0112a2b7957a54a762bcc6f7883ea558acf38eaa2d732fd0349719072e18c075006dd932300,37fb9c4c7b669fd6f01aa0b3780eb12926dc5b631d414befdc60db4abde08ff25e38978e0ac737b4a10b1adf0b4f6ed52fd4c49749f9cbe8b16e35d0501cc67900,c834736cc62b2740fe4ce58c324830618be3de3aa1285368b1619bd9257ca03f5798e83eaf2ee01ccb67b703a611dad36caf33afbbb21aba42c6b7536340519b00,fa158483f711ba7d8bb8fc386e4526949d320629084ba66bdeb38c6ca026e5885e9aba7e3483c7676d740c8e1ab7ff02c084fac538b0f5e0cc9d6641596ca2c000 +e29aeb47b20128fee665b2965ebac7846a662588b056bd15b23a74f9ded346d69004dd238d5632bc5956c0614d415e745a7ce219fa7a0bc38044b4b8dab452a82151f544dcf5fb5283b794927d7249ada79bca7fc2a1f4387a4ac175476484b0e222087dbd4d3325a928f9c07a1d7b7026f1910a7a310e24d4b56674459778dedd23db47041128114beb17486aa70abcf184df87b822608486c88df00b02810dc98c060d404bf99a68092bd30bcbe2ab0876eb7b0ef0f60182da47383341f9e413624789d2f2f498e40f6b34fed10f,6a18368bb8947dd28b2c1105676733ed7cbefe9016b3e3730c81adb86a87d16f,1a5ce41fc1300e81be60039c3951163f72a3ccc6d178fe3f6327320742d8d70969d60e22da3070612e92914b2f499ef30180877e80fa8503362124bc84f3987f00,5d36b3d71c5e6026e56711349654b9123aaf2773c4cbf04eb5831b34b44f8cad5c3890b8893cc37dcd90cfaff90a2c3f16e9f58a9aaf4671ab9ab1ec4759804f00,2c42eac4fdba933fb223a907b69b506be40667354208203c3ae7ef42fe631d8001062de06ce96e76d156a9426e7f2cd87f0a6e75917b2c2546ed016130249dc001,339e4c9dbbc4afcb3377c3b9d40f4d9ac5b662f88fe92deabb39521d902e6c4f6a32718d5d4fa49aa50b32f081895401ca5f1ebe2de7c6e451e923547a56447f01,d64b77240a88b6f7bea31614e428b6994219feb36538a4bb65286b68d8f353dc6eb39b72db471373631e1226d7e7a640c7cbe4edb4ecb046301aa61efd6c12ee01 +806b21e057482f5ffd2c9b6a33fa7fee00e50af2be05e9e1080ef17d704beef86495a0fc7690216a2ffcf2341d691aa60ff0bc44fa4b882a5d55ef99c943289de50e9db2424e74234e83e46a67aa8798a8225e58138260a5f66e3f0dce6c12b158c7dbed908c727d959f37eb09b6b81ffb46745209294c6e88c2c22f574fe99a47f7f3d0415e829fa7e0aaae03343b1d4998baa3eea5bc678d5a027b9429b355379cb30246845ec6b098fc28f9127bd259d0edcb954f853962bed8898f34728d74581f9b56c71c1f612f94ef280bb3,643e8cf2a3ea20408bd70a33eb6805f35f0118dee66daae7f35d941e57777d38,d5471591ab77f6e41528ebd01d21d75f033fe67a70b41f452146aaa99f2462735ae1a3fe3714d80873c51113ea328c97cbb811f44aface86e3fadebfa1e1068001,e97ba47e32db4e790126530fb66dbeade54eed405f3e3d60030f4dede48263e369c9b07ee64f58977d249f6d4b40f526012089cd2c738d685f28b7ff4208abc800,2e3a154039ef25b529f2bf7fe1d8f9d046eb6fb7ff4f9f6f8065ca620d3343790b50ce68ac05c8fea936e718d5de8cc8f0391e9415b6cf75e197974b5bf6f7e200,3c5625cd3328724507d2ca572d7196730886b23e365b9ee10e2ec44f09a429d83d058c139a25a6e95465db98da560452c79870279672c7887b369d0fd2a114e000,c36b996fded654a5cd4d1ea5a0cad7a83a1eb3ba57c29ad404535a86956c4e8b6a83c782ff04027ca015b668932ca7d2bb722fae01baf3d0f25bac5912db381c00 +27645df73b95847d72ef43d0b50d128377bc258a6307a44a94a1affd12e0d98d77ac13e1b48ae433324dcd645b319ee7e200f39a15b4860b08feef46d41d15321475f73786e02ec403931ac79a8d2850617b6f4a77d5f7b88766875a709e3f38e5ef38729d13e306e2555a25a23b49c3d5afee475493927d6fdd6f37e6ffd07589a8cf4857cd76cf52e2145390ac4604efb11865c1ecd484f12b3db80f5a48650aa22d3fffe18ea8261f55987b37baf5e78fc2b03ff2c467321170c0ee058dfaf8df4c236c6655f852b067b2f8a67f,3fa59212d9b746c4841dcf81550fdef6ccb960ab7c34efcc6815aaf3191aea80,84b906416f15c04774d70691737509940d77443bbac107504d420f2dd755182c648be3d603c50fbf000052aae252263c17f7b896506b018a78ae822bbb9b447301,164bcd24393997f496a7f1f71f8abc590ba2f9b528fdf5ba1eba06eff9b638d577619a710ac576f194c2effb4666520d01885c0963b19095b1d6e3832d27e36900,8e9caf1a31d4735ecde18091fb8ad1085b3962ea8d42f28a753dbae167e6ef9f124ccbe0ed11fa7a5225acf068324dc40916a6f714f0f960ee49021b02e325ca01,cf6679226414b1fea64e79665745be609eb875ef98548a1fb161307aa1787f2660ac6a6bb928fbd0edffda979b30ecdef7e2195146367f504ab979297e43bc9a01,1d2d086abde328fefb299f064ce43e732317981cfc50fb59f2f82d1cba4121886b389e7e8d2cb9ed0b513e65b9543d276e025b6aadb15e5a327ead2944961b1501 +43fc82ecf00a9454ef94a359f777644d709a18456af14ce0fa97690712caa61847e09d17b379da1504578a2d525f32cd9bca497343007fff2ba307e1c9a25a269936505ac44765cbcd9e68cc853016108b2dcac6ec71c521f823579d32f60f423b25e87cab53d76e97beb3dc9a77874b08e85007f12afdfd56c3e960b5b80261c4aa1b63841bfbe3b95e54d6ab2a0a9f29461149a4e9783160c50d8cf75aced84436b254f27224dcad86ab8c1d524102b5852ec6e2212e5a04ae57b6d41ec6200816f2fa0bc3e978b2edae328c2670,a9489a99c6edfa81b5b50411d21ff5b0cfd8ac6195ba685466197af27a38f79f,2808ffd0f21990d11346b30b30520154591652334ed5d0f521650ece95dff975426d6bda73cdbb9e169931c8f67f8b6a70f71dda1d41c7c98642dfa90ca68de001,f685810d68e8532a120e070e1bb7a699ec61584ae977c45b54547674588b37cc27a04aaf418dbde88fbe316813c985f46b74e49aa0f93e512ea23873b5627cf001,5b457dd574fcb44bed16a23c40c4054ac6e00a0dcd613459ec0394141ef51db24378b73a40e36d40d11cf58fa31c2c6744442eedfc1865697e3d510df1a5cf8b00,7709c6bece66a4385f3f7d9d79527ef01c71bed5ebf88e8918f0299622913d737ed63b075b1884c0ad76240cf28d99a758e20d01d313edfcd09acdea5051f0c001,229170169916658eb0e574a955fb914675c58e4d0c4fe5b327c577b8c4f71d504ad1a7f35d21542420998eed3e365788189fb482ab4798fb8ae253cb4bf7476f00 +dc4360fe4bae0847d375fe8f533f6e271bab62af55f318d5d54e1645e320a06255c84fef82b9fa21776195c6081806e9292134f33145daa7007ab1d09456eef45da361a4f89bebdabb01d30297fbb0393b576511689e34228c787cd156da1e7da97dbb913003a028b62eedd2032a754a035579e028cbae4ca120e13fd3c3944c3cf85f6c7c55cc16c37f981be84b78d2ad910eb8bce463bc47178cabccb0da8eae88c6f26416e5fcf6b0ee65cb256e49a56d5b18adc0248a06c09575ff3bfbccc2cde7f96da47d96a2e88190d29b34f2,ccb123b9ac161314d752c0157542a17751ece314c4441fa80d5a1bde02ee8847,f413391334e168f569f108f669eadf01df7ef92b842739e73345a2ae1ccb38b620043f62ddf6fbae1f768b658b607eeaf0b8dd2fdf2946ea86fb886c5d17555c01,02d3ad2c78a8b71ee60e2a2f037216d00ca2ac14107849691ddae5b8b064bd5937603ff611798a0a2ad3157a51c0267a9f3f4c757b7fe7d1009fcbb2989e737401,58bbeecde18b97d3993451ac91da73ce92bad8d0a48e58716fa2394363faad480a554db9fb82ef8e63df432221e48bfb74568f4e9875c52f4d17f7df21024c5d00,42bb11996a920fe707b3e3ce59eb9f5726dc7be1b9f2d75a013285a88c660107159c5dc494a13ed27ae78d2ad245fdd587404e609a552967360c5fc385041dbf00,dc26655ce733df118d566cbc39fc81b8b91b8f8d60ae469374352f513f0f5b3d7603c260aed1ebf90456432300a034d779c9c5e2af3fdf4ae99a727925143b2a00 +e5f46fb7c4462c9f2a9a51d3e958eaaf357fc0a8c10d9b83d820b572abc472c71559d3761e20a6fc76ab7701dd3d1ea178672df51bb0518e1dc1533b2e94c474b4d3ab855aaaf5670e1731d4d47abc913b5464414b72dfd0ff624737d52e2fce425249e0f6b1c85be49f28d3d354a2ae318478f727e9178cdb0b2da3a3f3a16f61779522651bea615bafa020a0abe180dacca44eaba86b2265a8f671457531cbc9744ef2327694dec4adb86d8d4f7f31567b2881fc53dbc76967816e1213d0a29240eaf4535cd733e885681171cfef1f,e4967734eee7adb7471e4cef2bf990ce58c4e2df39d60afc7332650a1d0e3013,2029aa3b136217653de00fe7043d9ce84a0a7eeb50e454e276ad8728d512761640528dc2d853445be792afbb020178d916d1339aefdc0fca0f873dce8e8f35ab01,5f27879f1e5c448c93438d09240e24b2318865c8917c19273ade72b2c59c4c0d79ef19cc622874169ba76f5e10d0c417592c9aebbb31f94e5dc4f0a63dddf71a01,8a70daabde56183e7edcf8843537b959bfe90e336a7e47bd557c76f881b8b3da61e3dfc6387c212cadff9a68eafeefb4a39bbed42c4f56b7e2e1a4767a90f8ac00,ed15a6ad8fe241236cfddc80e4a0428072bd4736898f1273464df76414421d677f94ab95b63622a41de76b26d1930e153aadee93ef40da8bf2b7a00fe2600eb001,94bd95f260da59dd942463de2f2ba74886d681f5ad291f539adbda431c670b1e28ffe77c634f4a5e9476d0015646ef0d09cca750533fc004c5b3d07f262d921c00 +cfbd05a0564cf92fe17e008b9f8cb07a9fb4b62dd29a4213cda21010c90d82134e40cb6a4d633e97c81ac881d52d276af873bcd63af440dc62d6d7c0b56cb331cf3419553f18b7d4cb93546aa4b9400b60215927f19fff4b157b2202614cc32c41bb9b909828689990ba16469495a5ad1c76cab3da90c4d193ecae30c79f2bb6b7e6ee4c657e1f9c696ce1f540b280f97e04e4a9ab76b9b125fa06ac4cfb81d4c35aeb2378481c4f1a5c881f6c4fdbf4d136d989a53ddaa01a103dc5d5109330f5a4a751b0a64a02169407f53e560025,1fd48669f44f217705d1aaa17c418b98824de0a9a4be7c226aae62ae7c3cd8b7,c56e79fdacf7184cfb2460c06276a08ae6e5cdeca6b6aae1e30f27279a25c35553d4e5e25a46d75a4d0b4ea479476a6a6db8d77cb3ef9c3562f88bcacd2efed901,e8b28cc4f11d2a5c5ac3d38825f37d0c3484940886497cc1304113dccb4992456bb8b7e9eb59ffcaf4de1b7b39fc37d293023f7e98e6c88f9e80c0dc0b388aad00,1e9b7f7f41cf543c88ddcc949086364249cf72ff15f5c1936ed7b52aa07f4b746db79eb9a2ab0f1b914f4f0397b2e9bd420fad935a9ee15c1f53f56f007232c401,523404ca7015f5ef6983d2198fae4aae3a051aef64df35840bc79fb5a24165c92c5dde66f229cacf70307dd160a6ab471b4c614807dc194cf7832237e8962e2a00,dbde8c546e530bc76d3525cc30fda81e6f6f7dac402b0f798b5bedb487a57a46440defb232f36397a2e814c5b85691a760f1c5249910a7a0a27408a42be9226001 +3252dfc75586079fc2f5afb30b2dc547ea96f78f3806ec222c67ce5a48be75790f2a6a98f684dc7865ae34bf5977a6d51a68c2fcefe09e79d2233d50010ecff7dcf8fd527a47a7774a80befd5ff72e18ff03b143ab395f9ad2f44490914146f091a2aa3c58ed4cf420b62a6dec0916528cbf13bd0b6c903597f646d6c40544f575290c7181c6a8ad19eed7969799dc6f5af158be29902d6c15796db8cdb3509e4754407814b5f971635b5e2f0e19dc326812e7e76ed6932a32bb63186195bff07105c28a46e63685e3fbda78cf0a1d36,5840e1cef2ee3c6f490ed36afc9013506b004b4ce4d40f31223b6032511e8e07,2837fe9ec21c4108de0bd90f1bb81965cc337f607a5315ce0edc01c14f3841427a75d9e494b565e1c5773c4f30b960920931d8ccf332546a0fdee8af7f90587f01,f17c072884da338c3dbbc09375164e7790dc2bc3a2f3b7d5308687af03b7a0ff610a5e54b36c47d4f1bbf33574d9846fd3b3cb46fc6a366b1e3aa24c09a75d7000,82b6364c74019438e8b2e086b8086643395fed923792f9d4409cf3a87260b75a549619af484f9c5ff94bdb88880c391ff2b0dc5b5de8b17005f8f2eafff0f84500,5323aab7aff8b776c210c40b0b3024046211795ce3669650d2751770300a00373a8dc7dddc18cbc420fd0fec80fb0dee8c9cf9f2ce1b19f5bd82a15092df1a4401,384f0eb6acac937471b42dcd44b9dd5e64704c1817b736183fd86a5e01b341e465535bc77ec59f86be377e67d368697689628e3afa4ccf7a9a302755cd79c22e01 +6fc1d679e4fe5373c0c819cf343f22e07ecfb2a226707b9b1f8aa5cbf5f4f8b3035a32b089f7bab62806827e8f1c1b53876db2d24b7328c5c4f0c3710316621f90d26aef6dbafe012aba161c5b7fc239dd3cf3673355b741c0d50d2899bfeb2feff3339a5d29d9c9bcbf8aff91123ae69a9fdfb6f7891aefd4d21d34f4c9a57e6b143bf2ecd9cfa04176df46da32abd09f5377c6cd4b99fbe21118ec93dd655d06fcd7661147ed2aa6a6e343bc643bdc9af5eb8a26155fa34d8369f85031a4cc9b06db20a107e14a0a173dcd8a775ed3,8989288544b57fa7299ed1e164bc87f89339bb6ee3cade5cdb23c2879c52344f,8793e4c88f6a64c9794ef4343fc8e8c8502c2327b004cf469211be0c4149cc0b57ad365974e8490b5e3ef74b3f8b7ce2f383be80dc7c7e9aa558243277c3ca6900,764ce6f7bed09c3d8b9bd5b9482626edda7a2122be3dcdbc98ed589fc6e858f8549b259d0e6431900891e3cf8964b817b5afd2d086f2048fc498a3b9429caf7200,f869c30f562a85ae7d2bbac81f3490351a3051423b2def40dc38e30afe4baa2658a452544cf6d960801f4313caa13de44473be7afc7532d6d6af19f46b75572800,ff76bb39274820ac1870325b4f8966c61b14f6cffbd6d1c0897ad102212a8f162ef0d4250247f5f3fd205c7a83622011c8be6475ccabf64c89a2bea93934884c00,16622caec2236841a3851725d2e4dbd9327e7fc3d6bea9ea3a3ae54f5353bf3559eaed04602d73eecd89f9359d24db4e2da11436d8378b25120040d5a1d2dc2801 +388b96460facb50a733e225b540ec150317c9a32570c98b51f931126f227502f2e8a8734629668afc2e7464092d7791d43d413f54b0623701c359c1a685552006386dee1055169e8747fee43ed525d9d45d94856aa781c04a1c5dd683d885525c63bb2d40cbab7e4f58b1e96fa60ea4ac2cabc98765277b216ed957136581e01647229c62dd2214082db94f6d851c49cf9709d87731133a59d12dea2c8573315fa64097017c606f4045259278c822362203bd08271a9adfa434391f2c04746e765c3c2ee1d350b6215df22d70705d510,25f4cc66e18fc91dd75299a128e19295ed9a90af82b44c818def3107f86c3eb1,029a9f64a447e13e322fd692f34630d46396fed6d87c0d610c0f7763e82c404f3a786daec77603fe36b6ecc88172ee248890f8298fd8cdc590f04a3de084753700,8e3f82adcce062865588814397c8041fde89c0ed8f29426faf9df4d1d8f2fca21d7daa7c2c8bbd5e9b3e155785f79c240cf1a181242c949c3ad80756869fbbc801,f365ebad9e1a409d6874daf7ac0711f1bfda4fe2e2d51cd49b657899be14bc2747474c3854281474310d808aa73e195a3a14f4fd8d473c950a164bd70e02b82c00,8051c9e67c0f9eaa07f51ffba6eda6910bf135bd0281f420d4580d910dc6836d58431c01fc0a2919a50913a5ccf607db625a6a15c7eaf851bc399ec44e0e60a900,cb7247735ba82c6e3fe3e777351d1e7b68156aefdebff20f9dd9d509a44912525ec026ccb2ff201d6249a9ff89dd842b311f11577e5a59945e1292d3513247c900 +258affb47ae362257f13c3184d6b65f92193bc5b3227e2d6fd907555c519dff369222f3296e422968865ced130f67e95bcbf921af973a42c5380b6ba8c39bff9da1afe0dd3292451da6277620a8d282717383e26a279a5a8e4085d8981ae3ab92687e7ef772b0aece27a09bd5d20626be0aa215111364b4bfbfe3c469cae1b3242d2477e24831878c9d002e9ddf326cff633a0a54024b8f8bb6f42132795e50dd9061fa66d3a4e09aef939600a5375f4e90d79b7c004b1745114ba48cb04b5252556924b92893292167431e499878051,3ae293117f790e2fed7b642eed6f5246e999b37c3be0729cc74e01ebbb6be8ee,e53ee5241d2f1621a53a6270d892844c37f849a0ededede4957d8f3bc1a57e69226e2c69b7dafc29784324e3f6c1b2c15ce924c2cdab4d2aacef0aefec3ac29700,2408e1bcd48e8e3e212944d5e0be43b1fdbc148cf6a9ecfb3c51919b527d87114cf145a7e742e220e7ea8eea055ece353f9f58fbf8c4c38ca2b4f86679544e0400,6764108729f52d049eeb14ab81a759097edacfa4d805aeb7601f36cc3c02166c740db4adf98b0d22471ff3be515f8530c23602d5051faaee5b05d9268039e16b00,53f32a66dff08600a711c69916e761984b3054e6c46517f3b1737b37f6a535961fb9a2aca9d87b9700305b065682f0c2fce770b63bf1647e652da37551fc21a600,09839c02c9b1c5bc42dcafbf85ea7784011bb2f17f9634b55ea94667f09ba09b289dad4af425687778a3ba64c741d7d8c5e023d17c12411491f91c90b705af7001 +38d4e672504f658b9789acec708dc8e8e032590df5f5fb24fec1a592fa79f2cc3e76bbab4d44cd3f1a0b0e65570f11db72489416d1246bee1a5921ed9ceb464831abec2053198eb3fb9087d2403bd70b1421d4434d867d488a7eec7fc584816818b1bc77319824c2b1bda346b33a65619d4eb61f6a6fa3c01aed3f4013064c62b31bd97c216401211f6ce7d4c466672d983e903c33b68c92b5b6f89d1d97ea2d2d10f11c471677d470c3493a5fe083230dd8ccab93be9cce4a466dc8fb1f427d7f633de8217ce0fc9e7bceeec3164823,c00abe063358dafc8a0ac1916589c3e6c5ff00c67fb0c9214067d3c15633fd2d,73039cdb663df2330da462a2d9dc13dc67f25a6f3d45a262abd0fe1ed8bee3c500a8371b4cff8ffa1fd46a8f9edae4463dcedcfde0ed0f9fabdc4c15b2b7978201,f832021ed793b68abdf125689d61d0efef5e75a3e0d5f1f80886dc2aeec70f79152a23b405cbd5cefe35b6fb4bf49f1bd10b22412f986c44bc3e75fe858618a300,0ebf5c58b42bda02e4bc1534b3d9a4d5f5ccf6939fe98ece3b71c9866184c04335d5783d95d004eb355055d262b911e55273548e2fc5810ae05ac04db1912ce601,232cf1d5967baf78bcabd02fd1f4ab34796c57ae1bacf1d1ab8eeb87f84bcf9d16150c8c2f4fa3a366a29839fbfa761bdc8e2c6611bc4a0ca6980258ab6ef7f200,2a8eb92ebbc095e1f431c7a03c3a90ef225c94e03f33e6f0ca2ec56b2858414a0720378453241943d3a0fcef95e32b01ac76f65f299889e85876bb8743e47f3801 +a54963fa682df5290b216f7a43248fb4647e01ac84bf0d5b4fd49dc0c625a3edeaebfab9d19a74c99c5cc89a1559180d24ac6059275836cbd2bbbd810d7fe807727ffe79b253180d147a50e7f2f2269f272bd2774e9a8d7f88a71d7272f4ed2507c69c42c9e77cf20a6383df8dd8a0155f17d848f9ff77deeed4b09421f7ac2ae1793915d4a23f7cbcc9622ad6c822d54f306738b1fae65d6bdb501383c77740958be8670b26ca6b696994e486302a5f779b9c577670f9196145fed132c2ff1c1842147f6b15b03931c2c07247efbe79,a7fd39f8179f5bdc21b151c03612f95231731b318b271cf0574fa42a7c59afaf,0e336b32145230dd0de4b6a6f289ce97ffdd4ff9a0592dd2b0afdf8f87f469f713bf0987fd4bbd387b165637aa0b9d18257418990276f90bc8d674c6ecb9c9c201,ba6b88deb488149bfb3e9569eb31ef7c94e461843d32572a1133e3719f03a76235957c4c2c8bf6cbde1d1c24e6d7ad235e9d34becb307f0ee0b8e06944221ed301,2b3794cfe29a6aab862cc6e9e1eb8df99e77bd2e44c6c908b2e3b574b9ff8f3f3c132d72fc48a1d644b4f7d1802095cbe527a7a175abfe80b041c14eb4503a6c01,efa7ef6c3c7a316da4792a86a7ec78b609cd065ae622fbc249e7ad608f0bcfa16f058470695de6a69be22e8f545560dae3304f2be1317277928bf0f759780ab501,69f1df2b3a54d2a82b4d6676d7442f819b5b12cd7657143d091b4bfe818105da244931e96104c2bb0bb50a74a22cbda2087f5366fce6359708f445078872762201 +f70159ede45a6e582d686a0891119a686b33d82117d29132f1e286e48407a9e4d621d5116c12fb6c86a30e07994444b2d26d056d7098d815cf33b3c2e4e90d48b8e29f8fb4313d999a154c427c5db0bd4dcec6ec77135a322415b06fe56374828a728e39a06a97859ccb4f4a92494cee8061afc4e7d0744b28d87c1d1975cafbbcdde1c08fdaaac7983ac71c7ebd0871af05a5e8c306336947579dc5f7cc106df045827fa7c8ecd2b8aed3176a5c85edac66ef24b07e39edc4703756f04680a654ceb6bcd64cc9a3d0962e29cdcb2517,07f76d590c5ecaa2a348a7a16e86d70a75f208dd4ff3920c0d0eb98bd3367829,01f0156c317792bcfe17614558c72f3b672652009f2350417ed3f0fe0085a937388e63f26224ce009a8f918565ad06cb63945ee15cac9166c1597fcca2faa6c101,742e1783b5e34fcfefe8aee95f814e68653442cf762e504b24180250367cf8ab6b2ce6e8d36482a47aa09a9cd9a346ad9ee8f1a008f5e4a852834a97ae4ca37f01,b8fe9984dd17cdaac560cfd6d67a24d76ae7d7c90ca0a16f74b13849d75f899c0d854dd44c916e8365964c901f522c4ce4312ee9740399575101bf3e624aae9f00,0d3f4387845c62034e836e056ac11af285e871186ddef6ffd27fe8008b20191e3e23ac0de2b6627ceb734fccc532d8ec84aa186aaa8223bdb84b48b76f8c056600,1883c1433b7e46d29b1d737005026b739581ef3d5b08fb192891239ba4926c6713847711ec9a13be16fda87c9466c284374665ae7758640804909da80691185e00 +bbd6ba67e8ffddaa591ae0cb853172635e672e5bb3a15320c35f252c560d804fed974a970e144df7ac4395b68f5d26cf6dace2fcabe6c9eb2306c5406450d4269d74884fb9091d1169d9122f084d68e70fb5a7722fd95d67e593da4045cd7985bc7bff18e8c9b63e0019d418d885bd80657c15469dfaeabb24aac1defffaf0b36e194fb6b3b6b3a85c63a04a5653a057e149cb3963edaca40b823219e05c957cc76c58010c37d1d6323d55a0d6e6be80b79a59e307f81be3a8861da15f4e6c433cc23dc22d59c2246df78edd79cabdd7a2,3a151c2bd1934b382911a9175961f54ccadda16aa1e30158773cab37dc20a97b,9697d51aaf063a8d66058ce642c57d83a3d7ca1ad92a7bd0d5eabccce08008f721503f7c4820a9c1f0b26813ca881e7eae3b3b522c87ebb83b2dc6eb093e95ac01,d74a22cd72e57bc1c94fb6a0befd367c8f4d33c600897765b990a1bd72a3cdd357994877788617b830fe3d3c19312e8feadf9b9fc8756858f08979ae2be21b8401,108271b8953be2fa4bfc8137c6c452ee87fd0f0c2f9ff9ca7add1ca683704a5871c16582599a45d8603dc64797c9ae71c6e08a99ccceda1cbcbb6b4633042d8101,6a1fdd94ebca6c45b0b1b64906e5d402280273659f3643f2941c1db5a029a2e8302837e25ceb4dbee3ed22226595c90a88b97333a7bd096e5358bb921d2e96fe01,fd3967ea0ce97add680a49a0c18247c5cd3263d5a309c5735ef1727fc2351f67228634dd249704af69fe4bb10a3d031d5a87b796b50316cf70e0145c783634d201 +2f5ff1bcbbd8c1ba8af817229ed28a9021d15465f5817605c910e38cfef5ea311878c4e5bc07835a5947fd1b7875925204c0f2d412e8636fb8b7fb0cf66648724ebcbf5c1e48e160ffc347d0bf9cbd627302a4c01b3e8b0f31b80336d54c784a42ae28e3ae482cc0972462733febeffcad4308e455540c8ab43a9dda11557d7e05e68b64a2fa3a77fb65d392df31d27ed9c6aa2f6d89528051e4b328f054db051cffedfb8d2d44b4a8310da3f4388bdaa2eabaf86ef716c8225f03ccf45c1e3a16c419122ec9353a29319838b4e157fc3d,7da232b184695f0c77157ca2e830cc48ec25b30e68090a6ceaabe6a1762a3026,1e817d57d48d5145951a81b3d3998d44c17885a7dac5a1726c1ac4b2f82749402772822ef7857603b0d5f1d031b21bf4da760a6d3d82940cc374d69b477dea6301,c1892ffe8fd49e796253592f461c6900251037c029137252bccfee372e7cd44756f2d37abba507e8409bde4a425efff4eb82378b7c541af4739444d9c27fed0301,840f2d462e8d89bf293e5d9bffb7ee29b35053fe457507423ab7e968eda72bc276f1b8c31963f3fcb21301ea4240575a6c98f8b2667d6bb5304a22524536da6d00,af8d009856b0870dcd42fcbebcd14c4d3233b6e4793a7d0b8059d0b14024547f7be7f0f81c43adba0e6f0b8b9b7641e4c1bfcf6cf661da31f7112098fe17fdce00,7f266facac256b4addc90298be7d42c29671a5d2b8203f8077073ef19ee8abcf69947d33588c13c2afe8eaf56b2a10b53b0d851aa5111110dfc90dce5c4d943f00 +ec50ffc97f4f627e279774cba3147ee0b2ad5ae9960db4f22107458c6ae5944b6212f697fc91989a8c9145b1fbae606728717d1f691aca5f3b5b8ca07c56a971a99b0a5ffd774a566785478bfe35feeca4877761e31a2a3cd7ca7b70d6f5952e4e295ac0ecfe667e83fb445c25be06db7b7577ce42d4fe985138caa685352421793caa172de8c520946dabf8581b314bf40a401852816f835255faa1edb8ec88221a5e7606ce913042a5efa500df48fd4a651f0802238debb14225de0e4cd3ae3bebee98a927bc03fd8275269e84aacd24,2c93954baa24a61069b15a9d4cc5343ac9bbc272471ffd12cdedc4390bc1dbe1,8007643311e2caffb261ae50ff7962789d59ed2a65f4b51f57503908f92b0ed265beb298e2b2848a38563b3d6728fb51cfdb08ee64c69da89d890f583bacb54c00,d2e28ef8c58c27e8ac7aafa3f18bdac9f7bde9b277aa5a7ea2c885673e1735706afa882522a70e142df1bcf5339b8b06c70b7e57227107998c04b63ed78669db00,45bf5dc188e607305bd70904654a264cff3175682288bf7f3622f347e747d5d30bf44d6de96f032b8c7a42c4ba9d0ff2d75cec6f3500c9bf67275e3cd27f4c8701,75e10829c6c84d8108c00b62ef54051fd2539826306f16f72e5f170449b44ce469e4921b7759bc4af99fa88fc57a55cfb90c10e01cf048f15f2feb83c149f2ed01,7d15e86c77da329822c0ea46031b981dfab0ae80914e8e591e6f735874ede6c73efde700a0a0b81ed8fca601162f81332cd74728e1543e6a3205050f57a094e601 +71cf518bdc9279eae3c3587f4bfb5887dabb449f7210d5f0609bb93947eff092cd1726777e28abe629f7d35cd2cb9100779884d5146c0e81a2b447af6a039c9f233a62bef53f28142aabd53a15c2db6fefce560da6a39bfbd25579a81ddb838ecba77304eb449184f197afae783160550b4a0800d53a3963dd5c7244a7f52d60fba6f4c29e11756bad122b96d973df63581d6c4e9599e920bc2923f1686028cc2371e0f19d7aab12ffc5721ef596a314c883b2376ee2640a4b4eb72cd17e8e8e13688eb59bff54fe2d3dd00054623ad035,bae7b16e222df7bf3cf47309378c431953c508ad919344bae2bfc34a805fcb68,b6b4429669a6fa7bafcc7bc3a34b2fbc15aeca965f76c0ec44c13e0caa91fd6f1b48c70c430ca8426879c9e1ba12cf744a8f45f78803dfc9e33a2da5c725188f00,4e09b490509692acdf564e9b72799bde6b61d2f8ce2d164a06a21887baea3873180fdd1aac75d871a3ad22bfeaf4128d95e77060ebeab7f28c5336ae98b7c12001,531278fa40422a5cc59132184bc91a36b8d133f2fe2dc52869134c4cd48987c43905cf77ea59a410f8a2c05fe18328c410595e5b88490076b8d12ca5c1dac97700,b2e88a35eaf1c0573f785c74859cbd1b12bb5ec039eb7fc58b8b80d2aea6a9bc3b1b004caa50ce8dd76d3f5759081021866d12d13adb68ec7355186cdf73c76f01,06e3e3de4685b6df2c5567beda6e5508ad3f6fbb95cbe84d6811a3e85163378f3c7e97b6f1fa8e656f329aaed0ed38877a08d223366d70f453952fabbd8f81e101 +a93b231d69091d976913e72242fbe6d4c91775674c027b977ce7d92d8b928e018187580954fdc55edb53b2da887dd2d5b76187d5fe36bac8013b1c4a678bd1efeaf958dc9cf0d23dc1fef08ba476f53aef8763e07d664f3e1cc75bb51ec778d590f8dd121f74408a9b250eb6a711e8ed61c695678013b37c0474048b4485c8ddef5c8309e33164d5bcdcb1ce400769362a6823a92fad0c80f8904000c8348295256fb5203a1009b6a748998d858810e7cf188948b75e67ee8afc936678b06c6ecf4e0e221c603efc01b74fa3f4cc70e41e,00fda1ac56412ca2a550a525627c6df98358a57063231603e299f79bbc91a20e,b509f53bf433b9eeee0b600c1921557bb5482b4b9d613e1bb62c9cb03de798bd1ec591d3f57f4e409bf39007eec52931bc57b9ba1dddc415091c8b4af1edb97b01,c1fd274c88614f3f0931ddb61874fc21e7cc071cf701219f2f6edb5e8eb3d6303cfbd48d7dc864d48bc831295f050353a39c267b53d6f159960c814ddc44daf501,a3be5701303553d02593f549513e1aca5b5f8b00cdb75060fad24ed7785eae845c561f913a5832e0e9bbef68f039214a3f4756929848bbbfa8b8952a599b484501,8d53539d6e6e4da5b07ff9e73546479c8c8f21adbe1a7ddf9e22153fec527cac70493bd51d275054be43c4b14a9c7e6882c0320292dd77f3321bbaa1ef67f6d101,884f25838d016c799ac15116e6721ac71c8117dfba91f694d8929cbd70f77e5a287ef4c4f5a70e82785b2f5fd81120a9c9092f6d3fd41733f49cb3384804448b00 +e9a7bb4497f4380a90e0b3ba65060b7ef64dd2d1440c752a51a532c3140e89a9a3b16fab9640640545bee839e7f31cf52cfe319a7a7241561031ab4e22461d145f84386eb06ed0a5275043a156834abdf91027b6ab3ef2bcdd7b55d478dc174570f86c0217e52026294f0e71eda22d01ebcd2b70ad4511f27ca0257463328b1d405763aa3b10093916a4ab72f20a7d21ca30c6e9c0a64fecce58c86c78d177c2ef0c8951db0b474b045c7104ec4dedce3aa640091d776d93d06185eaedd3a68668c2c9ba21e6b19d0184527953428c5dec,3ad4aba5d482a8c49b85955894d9087aa6657e4d518a2f55818f9a2837a564e8,b87a2ebdae21e26907a4e31ae2c48704df324d094eb4dfc2ba55aaa2a9d2ebe64b9ede10c8ac53b0ec880df98d35147e4e99d7b905c1b654a083f3f130cad0d800,9cb0fcf89e41646d9914a646ee61db5b7a8ddadac5af7fa171cf9212012199085f878f788763fe9885241ed79a5d92ae0d6a9d3478a8e0f652679dada3eaef5e01,1a49ac94bb7a5e57c3ae3c47d4d008e632f87bed090b7d5b26c2f7376c8a01bc16c0452e87ed332e672e53a7180a80dfd6a4bb4297c16018e54ee80481ebd0e000,25303be7add44de9b4cb1013da61332084305c4547d180be6a9beba4c3b51e874b684de357004fb324eed96a4a1a35f0377c8417cd0602bf6f142ba8a9e56dd001,072207fcc2e79e339e72fde7d82c36daa2936d04f8ad85b395fdc4272c3eb8b12f3b256d3516da1b30191ef2e8934da3e88110520c5312fdea8c2bf9d64f767701 +b1eb424ba8379057adee66fb389de1a5db570e601574825b5e0af5ddb20e0920a5419e1ac763178a79f629d7ba8278c8746aefe4907a3941cc2a37ec13bc3c0603bcf8fc3db2565c2783c5c62b9bb422596d6ee58ba6ba1ba5bbc8b8b43a2492f9fc61731c7ce1b20eb75788c421106292991d40c5109571921ed3a88c4c7919a0d5ff2d99f9774143287ada6cbcfd1dcf263a0c232943f154a18da5d6d52c3c8542266c27c086b3255e5b6be03d6a21ca4121c70ab77678a91d64f96092cecbac89f5f4981375b4acacd77c394a609203,539d6aacc01c8bfd02cc735c1735712aa021784a7e57c0d5a5ecd83d2bb1bc52,a6c8ac7b9cfb751ba6f0d7bb3e641ff1ff02ea8f28ea65cd6018fb22c4bea40c2aa3dc1d543875d5250ee51490148c05cdfa5bdd156d1039b986594b35b4cde700,6a4196c4fc3d8129f7cdbbf19629d0c886b49ae17b5e4b65f9064044e82b9d6752d1de8908fb94bdcf543949237bc993a29f56a73b6d761ee742acd8957cd2c301,a457412706140dbda2f9ae012ddae86554d833294912257f96e1e2c51f9cb9585578b1a128bca1dfb387b794260d70ef8c522890c5844dc5d32dad6c933d329b00,2f888f3b98d0c238bcb8c16aeca96ff44497cd1b8bd4b746b08abbd6eccddf481a847f4ba186849e27e56d81d0f67bdd936e8fe5788a28ec452e8239c19e709900,c04fe83ad4b5d362fa89de02cc20d68b8e466d130215e803edd50912426d5011437a8958b3fa42dcfd3941d38a41d90771017af23b3b9079447f55af06fe027d01 +5a008c7502208d5efdc36ad586dd3cae80360f5a4cf3230b39c9488b8b18a48002b34936506a3a6ed9a267b4c4aa761ac165ee6cce0d7cf3fa8961ff22d94b9aa61e23bbeece3384464aa5d974650edb7fa27228f9773fa2bd344145b7f7f66caf9ddb449908415c80b7aacff422b31ad524bd5c812d4fcbbb01685c83f602ffc742be758e5e75d3c244a6fd229c660827b084ae126c844037cd8dcceb972d8b068dcf707b3676943c6fe2d3d637269449aa298fe8d22e88acb4318af5814f7e44e4d0e121dc161d3fd1cfd13a639ab0cc,08e42599b8975291e37c29d37bba701f924a97d4e6fc0dcf99702f78a3541ebd,fe0a473ce7c281ab8683b7e0e097130d37122cb50f125910d544066b5e833cd010fb1cac85f98e3d5ad753d223ec1d0a70a158b48724cd76d40d3e5eceac71ef00,ef85927e671aade9f343f0222dbae7db776fbe2ffaea360d728fe7e615ce0a8659dd81caa6b87e44d9d155e0967b10875ebe04e9765dfea58dcc2558e03b5d5500,94ffb0e6db25a060c3de942bf7f4ed4656f408b1ff385d136cd6a3f2c3a47a3c1f007a8053f5355899db5dfba935e2f590af541065efe36c435e0c7d18c8783201,e40126fc5b4ffff334703abdf706c0ade3ddcf725c0e37764e09a0d0af91de1d6178e0a91ba392712e56dbfa8ee8b7286e16d7db7b53b731227f2dbc6b92c1a500,ae9539c1bac2b42e3575684f952cabf8d57dbb257fcc1616148119eac9bfb86f5b9bb4a94891bb53cb1b87dda5d29d88263a4ef18b127cef2c3494784a04808e01 +7d3df6347bc845913042f47b563d2103cf9090b8d935b5fdfadd24e8c72737b148a8358f85c314031efdcdee81814d2d1fcc6f52749600bac6524f66437de5d7ecde3d453ab7128b08f2193c5e12cd66e9b05d0eef2c7f843452ace41357635aaf0568d2b348ba08c6e0ddf7e6533d1ac03f7a0eb23c99b1e91f80830c9e8c68ad4705e3634f8cd5d2b2e0f2a198c8425c6766725e6f5937c6a5b63f650737f36038402c92a105c6e7279cfa1da3e3eee3031db2aaa9bc713385dd268a1bc0a461e55992a523a94ab71acb7985ea52e3cc,37196d6c8245a2627cd7d6c563b82dd0a4b43753b7731b7767116ca862950030,cf42990715109a4d5215c07ad33d1b54e0fe83bb398fac4bd3c6ef0269cdc88d65d98447f40f10b6ca696c3c2f3a86f4b29e7b9b8aaeedfa08a18200437da5fc01,0d8dc472bf19574b8f4e15f076892083f0e3cc63a4e3c9577d18b34d72b6880927fb19df42028be96bbc8d51552fd8274eef5b312ac6ef26e32f029f4846f1bf00,662ac4d1187e50d632d3817fb486a45a0ab438bd3062266adf77a53e1a356860625d69cc7961f79bf6018b67cf57a8055c3261687c56c1e56887f56d1e2c2b3701,ab30bcc4ded4ce6ba29e52277c28f8c8c2dd2cc2a6ea3327743298bfa893760e0f8b2dd4bb9e9293324cfb6982b8ec0542a232208d6d6f573981477c352a6e2400,1f9ac797695723b925deea7d79a0678be8fc0d264ce31ac6e82f2ed290f11f993ca97b6e802e35bd745d71c843ee90b67ca093bc343194e2574d9778c455109200 +30395fffabdebb3ccaa0b70d9628c404c3e2dee00ab2062ea3176237f6f8f400e3c62701b3d5459c094a64483c78549784bbf5bce5f7d59571c343df34845d6189fd28be21c4fe86f1138f042e7cd59fbece13351d7d8bde81310b255858c232ace64d6c53f3e803475b73fa0c2fbe718853378f04868c68f4c462f921f5d6d3de3e237e7b5b4284bdafac429b4333dcd7557abfa4eb91ee442193afa5ffbe1643fbf2a81b407fa3d63380a07254ec446cca334c271e3d40f6417b8b908f13ac6ac22cb318ea73b650c0a2c81ee5efea39,685757254c04ac91c17d3082dcf494213a6fefd3fd8835a42312d1edb31da3a7,e511b0ae5dc4098604ac864319a9f05a786b4ad81aa0be95e7742b6a0a4df96d25165d094eec447b9afcfa4851fc8c2f2de9d0e0977d1fad96bc6dd2cf7ee11b01,cf13e8ef5e9b38539ec76b53344db2f50bc7cb74a105f857c38992d6a89d64de57583003a6d857e4388ae20a08ad64755ed5930ee6146c74494ae763329bd4c100,ddd2162e5d2cc1c3f67650891a37224bd21f0de464ec69943b362da1152c8565336a63c9a25610030c455c99d517f554d87e6b565642b92936d6e5ddd6e4ccd701,3d580ee53897bce0bfae296824c5c9e8654a52a461f71925bdabcc4fe5b55e523821b6866f3e65c8fa4e5a2254357e994b5fb9bdaede5513058ec615447ac25101,454063c05b5964f5b16de0afc6e151251265ea3a287a9b028fa84d4042d2e0dc7afab97d64626dede722f2eafa6683ca249822eac32c0f6af10cb92698126b6a01 +67c2dd0f218d4fdac28818f91860d16afada4da673324d79b97e5d48d7327f801590105ffef09b79d311682f62c15d7ab783582208863d69f4c629db537f112d2af3fa457f6bec2e41a1f7f7e40d86d65fd355bed7c26252a5cd548bde5b22c767e0928179fec675eb87fdcd0a6c959c5d3e5231a613a3d7d0735bf97b1d05dba50ad555e876e8fc08b926ab47ccb302f3779732d5818977014e5f5c4e7f7beca96cca0d973f30e32d73a3c36abe699f490cb760fa6901ed6ce364b45d8ac63f90ea46b54dc0a72a7bfb01a0653b126843f2,08985689a7465569d2801989e6203e45f038508c3cede1ed69abb1746dc16aee,bf650b29ec87864dedb393baad8811c33e460355fb825441c015b7f7754b11635bff45a827b704cc8d05f333ee6ce39bebd336ebc5f5e45070eff1539744631000,f67a5745acf14bdb9368c44026f61ec822afa48a4b908983de3f887b07e57ba716e17d4dace5e324bff4832047e0e46371f9d3c92082b998d954e573550df75601,0c4659a256c6faa29a2f1a233d476f5c7c977086a8290e82974076ed693934cd758f5f6b4f347250536146fd0107b12d5cb55244a8ac1295acc795590c8544c300,129ac97ff84939bf82a4ffe0922b70486afdf6fc717d0672bc17f5e2ee6664c60bbca99de55a88102a85a9e5eea8afc796a9846500269133d562cd43dfad6f9701,42369aa29ac77714a9098b00796d6ef38584e15ced0c39ce064138e7d5b82c8f32183a2a3936308fe1a62f459a36094ea08b4c0a9f84b677d4c22fcc850417ca00 +68f3a72cf34bfb06cac2cbc0cc6e9ca4f195c14fec54c7b0f5e4ab3505528b2f6ee776706be252a63cbd6179f44b7cb3a07255caf62ba7cd14876c8e302e09d6210a692cdbf8d2c87dc20e57f35608305c69a1c84924f463c4610063004e27c126d9af44c2c8213f1c90092bae0bc9533dd4abe0bc9fb4beec4dc36418b42456e6fcedc139038733d7cabb0ba0c45499c7944c15a5c3c9ee68be461506ccf830c81bf796b40ba3c84ad959032d111902f144c2aeab0533e32d1bcdf6de80216a8141345349e49ccfdd273ddabf3dd6837a94,59093daf2fd69fff61e58e84287d08f2a296e0ae1ef004e4028998064ce5b42a,0b172752e8212241340d9a42fcc2b86d2f1ef0479377ce8547f7d75b4c41fbc54052fdb4f8452257fa856a37bf8a48c59ab471235a5097c0888c591e06dd33a900,cdee33b159b01468f29723fa210632e270e141a0db476b6a9b7712309291b706067bd5e9937f542193773966f3914ab2a2ff7a05a748ee0aa6806a6100529fc300,5cee905748eafe1cd4c68024e0d21445f0048408c845223da427d0ef90b1b37100b503dbddc95553f604b3146e228f83eabdd03c3b4d191bbf9f9e75908dcd0b01,5a7748976a1e31c2c378eb49cc1b3344c2fdaeba0c59dd8873a8ced05a1e2c380cff770f61968c8e23ac3ec6346cadcfec7360028684aeaf584e74c9e7643d5600,a6eb673ba98b05270f42f9f375f668ec32f76b9ddc4948b7c9e620cb6b2b8e181f3f2f80fedc50d9720c0089f3b8c7f1718d325f494c107d6f5948a22c0a882401 +810483ccc00fd53789ccd15b4a9aeac47a61cddcd187c7981715bbbf2498dc50c771b7a70a35843628812f0e2a12af342a70b5383c2aaff678560d3d118d5afef6bd99c667e3caae5cb2e1a097103b5c2d0e10a1d76b9bbb7aa0028d30410e9dc7d9f872afde3458eff9f31ed0f283b4c9801956e39cfaa13f936d2861fbf1caa8f87ff7f6177b13164dec5a6773607caa2a3004744aeda5f6f2c95fd2c1e37071f5f655feeb8b6e4c93bd33c5b1391b63a0702e202bd172dbc6a809fd13c4715c99bdc816ec1e07b141a010f69228006e34,bae529d34053a6b2c7d343af8c7987b0e1c825c6d8600640a115dcc76683bfab,2dc504922d3a2598c887a5575d30a1bb9bac084f8a2416801ed71e9290b3ed3e7b5e40b7fa3829d07c6f306e9e71234428e1507c05c0425be15a34192f92a26001,be8054ce163c944f452ad799322e3613fa84b1ea8fb0ccec788c09eece8b7f435c19dde16e11c4f226e849e38e9681bffd2bc67327a07380ac32dee9e30472bc00,865ae522811cfe101c5f6b6becbc2183cc91642af8b48b3f08799bee406b15c322f0c6fc86e144eda3a73c5c97492e12be7be1e147a5dfe49e3a7a6cf4d41e6f01,46c76cc28bf844575cc6e0375dbb664db724f4f0a8d9ef44b9b8991927d368aa0cd807e2a194e6dc9fe835c3b7800dddbc384d0fe7280f9297fbf8445b586cbf00,0f63c05e6126fc1e5a741b79d83a52bd0196a0a94b8ac80c5f8d04fb27b7c07510e5480208a15882e5811f9e54e5823f71372af6627f36989958512d1eff285301 +7924833d792a6cdb127c00c957e9d8ea531a1adaa24a22a73e949c42bdb932534656080e76ec7587e3c3724bb4e7d6adcf6b9095fd4351b9c21c5596be882b4c77c1f953272f0cdceced3c98c7f28b12a08d74f3fa56ce8666f82f4b190efa6a846abc83a50c7cd7ee901b982793ca17b25cfba4d8f9a462c42a4c0fe771da70197cb33f43ed1918dcf8ddcc8ea63ee8fd6127fd8b37cc806195c67de6b41e2f8b462d8421d3059b642aaf99c7df2a6a67e0bb7fb7206386a0c61dc13ed0b4646bc6c735592d4d46adea6a82bcffa47ea1e4,14c4106b727dfd399878b19446020ecbf6d6f962e06db25971e2f9a1d82167b0,bb568d8cff89c95e59617ae96b41a82272a0e74b9d299a8e3bf0c88ddee269d728f440cec033ad18c25f4b4fafe1b4b0ce022fe38e803b04762135bfc6fad44801,a09fe70fae6f29cf3a6b2125abaea0b8abade148e15cba97083e376e0757a2dc28e2e6884116f873da66e3ffec3049668b06a1180a1e9d8baa00af4f07ca739600,6f10da889d0ae7da228e2dbf0c79a9d8a1ab210f3bc0f39ef15d01158595e9ef48369031a32cad0d66135dab012b4ff936dec9d711735eeef83bba174db53c5000,83718aea456d799c9b20118fe15030dce65ad5fdee9efed3ec3e51a279b2cd6769e4166332fb4b9e72c57b8de3631d06740f35e6d9039a1eeb6f7106d5c38c4801,9ae1bfaa2fc0cd83e5b14692318941fbac3429ff909c2722e8a5ef8a723250974cc210a115800f16c252653e3beb112cc5eb89c0fbd84346c11fb913778b989901 +7f5bd54c8e216422fd04c0f1d19c939d5dff2b319608b12c7d0fec50b219090df6717d0c827c6b709bf86914f8a618ceaa522b98cdb720afc3f7cc480dd80d5d72b706b855d71fc6b6c434b25a00b72be163b861d029f540c7193d4594ff3cc9239785ec2fb3fcdd80ed4e6b5a72fc08539c5e29458f9ed5b6685ad28b6be1320b5f54b62b1cd174398b0ff6021ee23eec51230845c0ce159950672959a4ed9f6bdf685e40cdb69401b712003a44b5751499b92c761c4e201636e0e1c66227ff96296cbd66f21e8c2d71748d8151d84cabff,a49e50c439c645422303c40e14efee0cdc5b6c62f7375f1c34109e018ee8a794,261854eb4c0bb070b2b3ccd19bc174129c8b3d8b280bd5c442c24235351e10c81a756bff8054ed70a9b99449a862fb27b6e1652414981b0cb8a06f052d107bed01,2abfddb751fdbc91375f5d86a571898e11986cc973c79200a01d13ae539c681a19ed6c453bf32c96ebe96fa93c32cc77c83c36f1f256217c3f61a437f9e6b79701,8e524ddd80276ff9c46ba6bb56c124cc34d6f5125c40511cd26296622b605aad2a6674dbe343dee54ec26a48e54ff626a0179f4f5336cc4cc270897b376f80bf00,67c3ebd419c7efdee60c663527885a953953666ce72f1738fff808c48b5174b41bee82e52d50e96cbf269c65745ea08174e6d988b2f861ca0674435d14ddbc1501,027bce93e6c3ddb807ea3b2a1d2363ae2d015cbe5ec261cc3da4846645ae90863597a98ea0fde37d3e3f97cbc8e5d3db1d19df8d2239ecb877db757cf6a501c100 +b20f577a7981964103ac4be541d83dbcc694ab7c1a043a0ea1ed11145ee48df9f57223859d00f18f2de66e1f45c7704f4fce75ac03bfd041cce8f0c73561587cdc4e6e462544f1e33c5ab5d2ac6a467f25bee744fc7c388a8150a9205a88716705833543b8b113cf7fe1bbb3151eb732a8bde97984220fe2be3eb079d37e34d4e253126e742b6c2d200493fadccef37d54f72aea1c0c9403cf50064d3bf9d4d81285828bb47a2e98e5b0521c5754d6e3055399794df5e32df521a2ee6896b8044b1bfba6c21242445c143eb245832e14a001,ea4cf5a6cd8af8fc5510dd4201dfc009fedacd496bad04f70666b964d9e9e601,bc0c1b76e7b0c982a955cdf392d88c21f65cd4a9da0da278902f49617433adce238bc1c228ea614c4470491537f72305c06487db30d341943e514d4dc6974e2a00,3d301a1011754cfa3e65d63a052cd24157a4cd880404f9853d22dcbee4eaf354057ed789c08141f710fedd362fc9be1bdc96c68749758c6f70131bd34dcb118e01,81a67ae40252cd51561b6f72d2419ada39fc3ecc877a15988f739412af70fe203b393c7eabdfa2197da16e28d6ec30e5e7b6302e72b6cc7e933c0ed48a3e7aed01,594a0892c916b2421d85b85632e6566c161d6fa80a833ccad2c280daf6d6d11b1af0a32a3c30e07ef876b32cc8a95c58dbfe319d2055e6b781f149f9cbae279700,ac50bac4a685745df41dca0522ee33402470dbb1e45027cf07ed789e2119a1361ea49f9be3b04d41fc8e413398c0f992e46148f058bb278c526c7f941a6ffbc400 +765879f65ea8f8707afdeaffdcb18ef189f92a0d9346ac4882daf34eda934e49c69907a2d48b07b0a2fe691530d1088c8636b306f8a05f5a4f83127f29ffbda16000b4f4343ab3819c10f4fa3112d26aff295a3404f62d96779d1217fa12215d86532b280ce9fe6c84047e635fcbf38596f383757790e9c30bd7e5baefea6367e55a7b3295d9555cfc200070abe8b97daa0a92ff1c6dee13833bf00e3222720451c6bcbb2ec222bb0d3495e239701a728033d443729965837459280f66cdbab6ce082dc508eb3a6a37637693bdbe61c05fe0,137c78f117126ced38821b3fbb37481d1bde455462721069f313c47d4c491786,f080e44046c2fd7129a0c7b4dd6c2427d9f6836acd264968606850ca27109920697f64269f67d22439ec42f4a8a705585ca5c9dda449145f39318ab687938aa400,3f632974c15e6b65d9aac6046e2e3f4d5b25ad33e5c4c005288aaa1886e239970d5859645c2c497f8ef1c2c301803e7b7b99d748406d59ac9f77ce5fab2a9feb01,95c0d857a6c07ad5848720e2383cc1377e7fbf2771364cd9a6602bd087c095bb4ee270505e9be1fce1810af19f92141647175eca15112c27af4ae3bdf2e6475d00,1c6bb31f8bcd5cf2aa49d2d8e41b7432e408f9cb65d19a100d8d20cd4b29006c25512621589f8b43e4387785d28d1012923437d66e25fdde2ae3aaae9883993c00,874d33ac29d5af8f28fda47a52efcb1a6f77737e6cc1cfc428b9ec23fdd5f2d60da8c7ec9bc4d06701993eaec5f8e5d00acf22aefd7b155f97b38e61204d846100 +3dab9b45da43a2aab2a3f345d710e9ed6dff6bcbf3c5bf31c6df2d5aa4136cd6af2f01b9643984184dceee50a7d02dd6bec5e457ecced888975b650c14a48134d6390a6ee11c2f8bd3b87bd91d5cfe58f7448860f7b495bd850f9fa408abdb4a9bafdb62801e9b25fd8b3ae61390b3d0ccdf16c6366d883b8b9a825d3943a913c96ba77ca559be0f6480d0cc91de7fec832be15894d8925b307dbcb34e3757719c5ea813b9f50794a5d3c10d939b851d2673c7d9a6dc45ee410580046c793d0342383b6801046defef3a8d406f281104ed40,43f8a4ea2171d2dda50856e1ac57a1850a86d7dac2dc48023f3875a836b1acfc,fc7c4617e6ed930a244413df849c0e7143a914a1836db4913356c66e345c32020b746a8d7cb76541ee0c4e5d3c161c142dfc6489be5f5a7c89f775c0b578956200,fcbd3718578282f66457ea55d84f454474e0d5246c9680627a57913655218451657b8d1defc2dc553a60c8ae12bc6c861e22d3429e946b70a6f6dfda0042a5f001,73520eebd922bedecbd19fdcfb7cf40a65dc45af6096c0a2a70393b64c2089986f53bcee31d8e277179b8e542083ed09c726ddf127c8d6d4a2c4e2671fb775bf00,46eef251659e57b41a05c3e549b84e92700d18227c6495aefeace7c85668f51572cf7d2f86f98fcacf2929c4260aab8533e86066b640ccd14efe853f1ab1034d00,c8d38296f841c0a5da39248c1af8d3b11a19343e64ba978518dcf0777e9a74ea67ef129825978afa5dbdc7b9492a50f3f9c4c964fd754d22fe35ab9f4324e52f00 +6bb1ac211b9a70a2cef066e4c1d6e81a7fcffec90d89062f20131c6961b5d0fe97183b4a51e61681fdd33b1b3858cfc6e9dc4d962e93844c0904c84cd7e564f7f748d6bbe969547af5b775969523e1966b9f55e3f6b52c03cd0c41846c47ba4e08705e3c799d3c2f9fd792dfdcec2cbd10c9ed76a888e565255001553567153bd1c074b8d4f26e7d7d0b422eb2e7fd2e1679ef0df1cc58c928459bb76fc99b259ed0a9c07dd60b32e26c448b71d5cdf2607a963efb9cfe9c0e9b94ad7d697e4e69e3945ac481765c0108633f5392e3062e48,7f3ecca30fa73f451ef4fe8ac270e04f060154ccd39e61a2c542e26e88ad79be,79c3db0398015b298dbc4ceb9010b7db8ab2a543d20f3a9523725a16b3b3f5ec0ef19bef684def2068431d39f4e96dae39defa0467ab607f0a4daca37d10f13001,97358d9fd6f5196a5fa3c3fe562bfd001e3f669253d2d9a53337e5b91ee9e65d734489ff832d669e72c99ec726fd17665aac8feffc19419e46224f28ddf196e801,65f978abd7717d2b689289ab006b8f9f6e34f953f08f699c13fc70b2e875892066840bb5cbad0692f1e99dfbe040d1810b5234ad10a14c090d4f47d1689b4e0c00,de45a6ea972ec0d013814ce7ffe10d980d441ad8dee3a01355bd6947b791b06445b37fe5291a225f94e33306d78e3a578f27dd9d3afe568dbed7ec4bace6797501,2b1529f72e2bb7bfed6b919506ea6f28f0eedb3f4acbcc7a4ff560cba0e6fbc70c55a17ceae45b083b3ece215a32b001cd133970a413a522a4408154dfd6156601 +db87974f197f3a6a65fe4cc5255e64706ae41d1cc9e17497be7b669b70f70b7d39559e1e6a1a6b06ab5eea55463d3730670819cb633efafe263b89e20ce302d1873c37b516308d9761ac3f1dbda9bf7fb83b704991a630a79014b18fd16759a873df2712c15cad659d6f324cb974e0d6a65a62544745308b142a73fc3d3c26be0e2d954d37fccc8fe9b386ffdd1b298cfaa522a46ed975b1500478eeafb24180507c439b81eef45bbb14b40a36bc12a9d18443108f46871002056b3fccb3c3e51747ea927db62ba4b1403d0f6ae0b4eb07de,408bdd328626b054177212058a4cf2967084dbf4562e0a29257bee0861939a50,acae54e2b88dc68d17c0cf8cc58730358055cf473bd91e4d62a04b8444dba66d63054bf69d84cd1147115c6bd23fff0de841389a949f28de56c1bef9d371c2aa00,96ec6856847e6c3ce8cabdbd9eb2c706612a61b347828ca80012fe80b3438ce1035535047905b33ad4230e1455ccf901213a0d05ec1a7795f013132c093bd39701,d5b2ad4a56da235b98d991b0ad9f22544a98757d905e4da79ca15fcdaba319784e660bf2c8fb4a1a45c8e6f980fe4f88bc0f83abaf48f5796cbd990d44e9696b01,b5aaa35c43918443f76150e3bf519cf8031eaf402a68a0eaa1a120a4844c9ad86b79eac5ca5d6100c5e243d2383ed8fc419c5dbc8beaad595bdc956a9de806bb00,18bed956995b6421f9f505912229202adb39bd583faa7d4a7286591c56eabefa624d4a1a78feb244c56eaff0f227f27e9f54a143004c3260fb0f515afd0dd0fa00 +3d96597bf6879e3359daab57a52c977281b337ba3811e37ea8508ba8b73c7c8a648c6cf387b6c6455e3aecb9caa7d5e367441465d1c86ee83cf47cdfd51ec1a2a4f138f716065038787db6aac66bf433a5245d04750aa91353bb3a5d9b041f22434b1bea3da2930b5af88b3210ea931cbd2da51ef270eece8eed2508a2d8ece48705a29ddf4e00cc6462e0049f30c613177d733d54d14bcac2e37a3d034f247b1391268392f51070ee3ee433d3cf8ec94415b57bd6caed305f534a918f0bee657a9bbcdc19488ffd50a656cc0fd4f6abf0970c,141f6d1d19471c104dd39738d622586a62476519cde347e1d5537d06ff9b2389,2c27fade314c14e1683fd381d431ac24b8d849d73a6c456e904499fb8fb557e3160a039ca1abbab79db6abaa6bce3fcf0e0e8fc97666af093b8e0e8a1fe222fa01,66170744b729090fdc0f38bd7ff3f323131d1ea648ac513564b73a60639ae06f2aa7a5a7f53c2fd755cbc40e522621eada39d93aa3768893d62893aae990a04d00,dd52cd4d7c9eec5f789ca8e194a803e6e7e241fe21cbe0351490ebd5c0b1683b530f38b0d663d7e4835a080db513deed559e1fcd4c69f0c873e1f7317521b2ec00,3c9548d41fd853c5927e59a8d3107ede8670f42ee83a43b6496946c6c776b2b30e240234bacfba3d477c1b84e6a79ecab3e5e31e848bce07dfa33cc33c6f280400,946eefb099f6c4c559dd974ee408bd50d4e8daba33dcd500a7d4ad3481397b1f1d658f01bbd1eb7db8800d2ac27550a56df38c86e3696b7a06508b9b32945bc701 +2bd43c45baad4ee77ae55b2d37b7b85e2662e90663ff031a422d6af27fde483c6c1054d98211b1f5aa04a8add3f836cc9994bf5e0c58a7fbab80905ffe9d731442cb517e28cb697c03ae1e29c196d7d38233ebc94a90c3424fe18bd50d6760cb50c23ffd468e9eda2d629cd8d0b3ea9fdd167958a13e6e42707960e682fefdc1d7b51f0753d9d2c347eab6a8a60852eaf3252947f3cb17d679bb7686d0881dbe0ddb5e87f6275f4040061829916941d1e9e2f06e1b1e19443c267308c1d239a398e64080afbc13783fc0d58121f22ce8a41950,fa272da94f88d3ebd20573838400401a26fe949f6cd8c95223da480c9b3e4c38,af1d051c4b51b70428128be3276974cc58430fbb8f4978d4afc8751a2a6e62b92c318e40422a8dd0d72e5e8bcc9a5a4c3a258c796569716031e70f18d38ed89c00,36cd846403c3f0652adccea69e1606ed2b992541d06b6f830470c4761e5b9f7403424dd655082f1415962632cd3ade124b8f9651d922dfa0affea286d5f9cc2e01,19ce0af66b8b4a65a5df7d3b4e0a059b111a933a252e8a3b5490f6b856d4a91358a8559b0c2f8468aff160ac9d345127873dc628c79b8b0e94e98cf2ee7d099801,8e9d3fd132cbc6be7aefc62e12cf2e93c4e69ec96ed7b45bfa0a23f7c50e7c466dabd27a4b430b067391c99cda9fd7816f0a9dd28a69e86e7ea8ac18267620a700,b3b717165f4055bb593a497565b3f3fb0d7cf74f6bd594158acf114ab616fb98568777db8e2a0054c6ac4a2676144d3d1445eee4b7531f167f2d1018875f8cbf00 +caa44996597a3beb6dbd6766d2b73205042c9799a7376b639876c811fc8b216c55e41292f45f77327afbb922be1db066dd4c6864162d5e1a38c4b293031875e3e0abeb7a2ebc6115e10ad0f32eaca5eac42f94ba900c4538172aab17cd23c6c610ed30f64c20e1755d27d6e53d9f6a5437ea8f7810b3b8684b54aea15ff74ff9a940c028be4cabb04ca7cf84e1f34789233643ae473c7a95dd070ba331c835fedfa5a19c9dc6f0243f3b414e430d10be7afa07e26f54609a90460036e42cafdafbf25b55aa21ca46eb49c2c898f178364529e3,c80a37595198d3a8039b3c123b6d7d78b5dc589a566c9eea7a8a7f1a538bec82,0d20d8493413d242abb7f146e4d67a857f456d2ab4998af7ba5155c4896cda3a733539908dc326ce18dad43701ce3c35c480b1961a5e5f3530398154bdaa256201,878f1a71ef51aaf9de635b163a8aab6fcf6eb31561b0ad358d07b7b6dccfb94a47ed5e03eab64d440359385beecaca32f8e434a09c621c1d96425f58d0a59ebd01,d850dec1b3d52d5e29db420608c62e61543823d825da510baf536852eb214c2e4b7e90be98b2bc6e573c5d268a07a2e1d1143e3a0af6d72cc570e60cf7e0bb7d00,d3fc40a1394528311a5de76fbbca02b6f05279ef549edae09921e3005239843129325acedd31ed80a9287d4c1cdade81b9dbe53cd736a2a576d977556657f8ac01,b68b1e7ef2e3244084e1cafe06d60900fea6dc0cc55570e93b9508696b7aeb9a4cdd1a7a2fa18fe25b8f9b1daeadf86d2aeb0aff314034abe0904a275d6a9cc001 +64d1f948618be78dece29f3ecdcae046c91144af1592ea032be0b9b4fbed3b9d4ff51a9e868b0fb20db05742f4496d27be97005a8db5e90ef7c8d900771a1193980163b42ed6896d9996b59b2e048bc5116f544fb5f7ed7570ae0f0dad1bb2a72e81519c323501af97aa35f3195e64568564e2ca655dfe70a95c53c758733d567a2d054bd1fb1f2daa20092b0ff37d87971332779e038d67195401d4ff54fb1380b888f8cc10378cf87ccfcf4331ed87f1b2c3764de5867b1c9f8968ab94736916347f42b5ca7c4de203aa0c6a872466cd05b3,3bd3c063f0cf9a82a9a6e5fe3461a75193c34e854593e7f6ec44aa91e4b75d3f,6a655d7fc1b0d1d9f0ea0a5a74499e32e130f95b205a118285bfea55dab425b72b7581eede90ed1973d51a7e2209826aff69e76d1c6d86e7f16f05491028e2dd01,9ee5ab96cb3992e35b31b9da341c178662f75490630a373b0c874d0bd7495afa1a8625d4bb2f69b7e4b5adfc913d6df0e50309d783a5495c27b073b012ddea2701,d89d2587a3abc95496da85244d859fef9eb8bba58f607926dc39abda3af509400ab2a64784fc49ff81c51eda5a74b5bb36141bf56ba8c862ccc2e964f2facbe401,66ba3a1c8c658031d828649867463bcf79f425f43b9f200c245c3f556e0950eb5cd80b6c7694ff26106251ded9d88819bb509c443b7fa629bac079e69abb8f2801,eca94a20c7b5dbe720ffd1f68145008d623c4c32ccb90661bc9ddf436757af456f323fae7099552e09473aec0ed6bb475cedc21d21288baf07ea8bf63c7e966800 +7a4e82501f08fc516bf1c1007781ac269688c8350cc7d43ebe1ce4408f63aac2e0377929206d6d791423434d713a2484aab72e8a567f0fe5cbca4ee5bc5e3573fdbd0b057d653178432319213b1e7118c0dd5970156212647c43ac5b8bd36ccc6a28811bb6e372f68767319ebc38d72bed565fb712b502fca8025b21bbd14fdf79c25515bcc4e7ef5dc13ec5d32cc16cdc085d0a009e3c7968a6c0adc55cecf5d135ab89a44660970871e9ccd2a0f323a9ed88266ebe28cdbc4eb896063a050bec670396f8a9c4fa44cb2a3d0ca76a4e91d193,20c6020ed7d0668f029b9a27c8101ea1cd0be76044bd46c77e2abe282cae8007,1ecdd22b972aef2c8a708a2510c5f379a5aa9711a98d5e9472d0d4adf36d23a739679e6b6cd176cf70343fe9ea9c036a1d9bf50a8989a21c8bdc5a6ea743a58501,62ba988cf7bad9a937fa59c922f8a71f9d35084d26e2ec30b2ccc0d1009269386be89d3466b5f181656bb42d6a351f24ef42fc25d9e178ee74470dc10c88056301,1f3bfc52de69a5544e45feccb2c1b526b14cb4e872dc6ab9cf483954162530c01c60e0efb135d4b357836b83cf24d68344f0a0a1a44365defd2e6860234fdd5d01,822e5b2348f8addc02570d70ead4323d851e9e95c17aa4dd0399f47340093d597f2888664a72c17eda3563e5facdb9b8fe2b51576598272a3d0351a2a84bb7ea01,f3cdf9d20c251eb37fb48aba3ad20377ac6f8d1505371d8bb327910fb01fc268015ddc7a23d02cbd975b098a36991482ee19aef3117c4189c9a501d0823546f801 +9dee15adc02c717300e0964ddbc3393a591fc6a3356803671046dd8fc45cd33c92c76d866f7a51689cc97e829bc7e783391f99c09569b410f3e0ee6a778538ee60ccb45a60a1010652f71a0671a43092db56cdf60b65aadeafc44b817bd6b396cba23e276c3155c7432d5d729ee42ee9783cb3b205edeefd6f10c661b67af28ec3af2a22393392c8f7eb1aedd38ad0fb9772d802875552beca59df0b0550832d17ee4195b997351956fda1cdf03a647c330a2df23f4272a5892606fd4ba9c6c2401308f385d2695cfb991f75ab73bbdd376317,afd44742a672d2cac686ad52e938557a0409aebf675c3ac2a933359ab49be30d,3fd5c630196ff94ee22473e38e93efc53c003d101acb03a5a4f6bd967f037e0615d136223acc5e9f810c3207c257be344ec2e210124df16a088025795f336d4d00,1e315b27e14ad86d84cfac18f61f4449f735208ac93902bbf0d430f5c1a021b86ee364b820118449c83ba0a821ba262e009cdbc5835aa2fada9e9fc9cf4d574100,b2646db9f246b2b251937946d1823e1677482796a72fbdf0e86f83067a6f00186481149f1840b0812e663a2886275d643c1c6967723fa02b57853565df61f57200,ce97091fb02b39f99fa2c8b42bc3854d0d05b6e59c81d24b44c7cb4c6502970f4586d501163a9dc6895e784b5f141fd9290c38ee4df3b5dcdb2c17162f3d1f6001,0fa0713f8b6d06ddb80e8b48ab5029433d95dc46b96b307d0519b1c7e87171af6c79e9e9f97b58caf1977dbbfec9eba530dce55ab171f36272556f4ece285db401 +5dee9bd8e039630c9822e9e472a8108fdbac96689674c54f5b00a61d4769c3835e9697ce156e49071f89815f4a426123ccd078b9e2c7e930625228c8dab03976bb72577302624068bfc91fe28f4389fc96a0cef82c1d7636854d1de082a89e0befe552a34fed0bbe4e2091c37dcd02e492a56acb4cf0e68c7889f50d5914cc54f17790cc376263491c3b35c6ca6bc917961e87f40fbafc620d70999c51c8a4267690b458c40c1e7f01fa5a09baecd3c40a6e689c3c8b150a44264d7e188e72ad05eaa3e6d42b69bc537a168968533c7b62a168,b1f3d94b4dfac801a13815e088368c0e0cca0439b8c491a9908324a6ebc83cb7,bd0978043099408ab138f5147eac3ffe9cba15abf9d40f076570f3360b303bc90d8b6b04406b0633e4e4db1b8613b28704f87dd61eb36d44ed00d65273eed43800,ffaad7de3a9a1c5aca6b7f3a1cc92e90b9989eb18362ef5eee03248f94f6c332292675f73fe28b0f38ef12725972cc11ce8e7c1ef4eedd7833a8f077fc75164800,234f7782228d2ec83ebe8ec29d38cd405884fcd11af3a4f26cb8dd084c57f5af5b677a8c68b3a3c9acacd00fcab3e965a56821db6d8d9c63732c67947a8b605500,2425fddcaff617eaaab750454cec5a2ac8297c39f70eb723ad57f997efabd6590a3237f173efafea9eb501f3aac83f7731a148639e76162efab507d57bce1d9400,c2383f766264090b45996cce161bdebcb9605500cf28dd7c43051110a538797411b46607d1aeda51dffee45319ca5f352ba794785ad069f492a7e537d08262e100 +7f3a2f4c3d92b03bf9badf85d1655a970c3db36ec056c892cf4420189eb63db749bee9432d6a05e8dcfb984055e848dfd2776b793c24f3fadb00d6119a3cee36c72b51da2b9e7900c78d8557239706a4e0f74444ae10dcf3017063fc0900aa338b0b2ad6d1cf144a45f78ade7dd5ed53c085ebec9eba7536502be0b8444b618e06bc56642f9157c287b35c941ecf9a9a2788357ee56c0aed2df92e6b59966111fd20ca946e52859b697cdce287b0e3b67610573d76a923a8a81d164354219d18d193fd87ea9a9dce8df41b89cead65a524f264,ca0706cc0144a56c655e8d9965970c73a7ef65e98ea218850b5e218239c30094,7594df2a3f9c70a0d255cb98bc607dfdeb98cc70eca944bbd034123b43b2cb0049526aefaeeb760d736b64686c9386f5cec7c10ff33ab6fa6c0f5019d576b3de01,b98e34eee82522833ef5e341629ce2cf02fc3cefc117e25612b1f13140768fd448035f021fb39b7be961f8eb9654ad17a9eaf8ad906588529579e465b48158ed01,d7950f297620920a783daf02c48cc6e8e3aea00bb5af6525c1ff28a29043c62967e2d3eeb8f905630d76618a8708af651977a95d5462555e8885c020733a38e301,064f13e9ab6fe1096dcb7ccd372d3c034ff2a96d4e320e50040e5b97acc0844947c3269cb58bf6bf997e01c657c027acd02cbe859343d1ed6304245995d170b401,02535e84f52bca417a4f8ac03bd7f7e92e41c9dbf73968b4f7e9e321734e9d695f86acffa7013080295334bf1f4681ef68934f898caec6178f62a0f06d9d10db01 +71b2e4bca541e74bda03249f1749077dcf666bc7ee5d77295ead20a8569fd77f49f15949a5d57357106e7a92399b65ed435d72ad7eb952d9b8f53d6a2fd0cec1e580c2567069c52d165db5d165927af3613666d5ea4593f38f1666c06628e91c5d174a10950dd2685393e48081377051232b7b5b33b0609b703346be31f164049144fac02b0728471b6182f7248d759b22b3d84fbfd8e9d2c4dc3999a739cab1df69335c2ccb822a7b0790cf6ff992f4ed9eaebac1eb1b4dabc76c079a7a58deb42f6552719b46fa33d37822d577b9fa0d13ea,bff42c4b26b125b5772e984afbd079bcc6b26ba1ebfe102555829a02b1b83234,000b82b3432ac559f01933d6c43bc83fa27a22ca67ee4dcbb2cbecfdd4bbc9775b2b9a6af23b859252c7a81417c5056f5d17b7587f66358e1a4c8dcee4b309e101,e19c527b0843ac365623291578bd851eb34ac027e0b55fe8887ab3233b001fd6703d1b50cc19b81b3144d2dd1cd932ea265952476d7d3ac7a7e2f578107c32a801,cd601696c9d1b7c689a4654bff15b4cce0879df47cff44c6fad67df987d866697923f665385754b50979175ee2172b0f302e3625af05cc414198a8de1970145001,5d11b6885061f1341e810ea438f05d13a3244d1049cbc6a26755e35ec8ea92656a26e0fe372ad71d4e93aa6083b9d8cf158bd3a83aab0ed379d7fbee319f96ba00,b21155aecde8de15a8f1b2d6087128b3a49ebc3ec4855575d39e2570ce0f561b65d4075c04b7ad9717c1f858a405d1a0e2097c76af5ebad180508137e042329c01 +6f6c7cf21b673810afe420404c10f42388bf5ef47f3ab89a344b28aa3d74a9953d9d6c2eadaab3ef93936c0351f7c4beceaeeb25695426409c843cac8a22833637ab44ce7a64ca075314a12b9d5759a92684e8a35a1b37d3fb33328f055add8471dfd63a6f8d60e7155349db43f435f7b94b9b35c0ca112d6960166fc732fdd98945e15e41d9587d4c2bbffa8f3a422cda65da58af1884fb671f9e9b199d08b1bba2c5c3b003c189a1c4002f52561714e3420a1cca319c1051605eae782673395c3ec6007e064d3ad066c347d5f0a38b1dcb1e,c19cbf640f32007c624a6027f7ef2a382562a74069a3347b6413ed2c4f222697,f43c9f985e98a47a5790b7b4f6dc1466a5a75835e6e8aafd6b05d825f88ef72f0e06a745ec326b00538a59eedaa4de865af0a9768588f7b7505303b462285f1901,3e7e7058778db4573e4297bdbf4ea2b52a7f4a27505f2a6f5701186c8ba652aa72cb978b199be0a0b74563aae58c1432e2228abbe1748d33a1348cb07e78391b00,c64441630cddbb81065193b9f2f84e548b32e8ab43c4040cbd1acb55cd4f0cf936e1fde023479e837bdbebfecb29dea175aa9e3005b2bf2307c21cafc7f5d2f800,bf13b8a33e5019c4613867a5dc3e8d95c1230883f6995ce6e75c676c6e042fe53528809c7c03a31b56ed9de3c1d10935a308ce2a8241c16855d2a9f51e67ec0c01,546b7aa0e2296fd01637bee375e49bb9b5e32546a24d46c4cd7d2fed7e6034380e0606864cf8dff88e15669189cc14c0dc767ce762e4739201b392fa08b0b6f101 +d33d669861918c9a22d2745a31f3dc21034c42a8b65513c4e1e5adfb86893e8ec37e109787951bff5397e5d4cff443c9649348fd59a22dae41bed845bc7f45ca5c73f3f9a46338231e67f4f722527af51c5a2e25f0a5cb7973ffbfb1cc49b62f1b80a0610359ade473a2ffc75c2ecd6c7c9bf9fcfbffcb4efc85f734bb7d0ae004bbeb0700f8ea8c5def5b6bba618d2f82a245cce93f7387f54b08b8322fff01224041ababcb7713123372af0ee4a94456666f3dfc5838ebd5c7f9cc9c0ca8d6a8aa5635b3805d390ed24438f1cb6e02925e8cf8,58ba333ff49121b03a546ed5d3e4437289c13631844910c9e58e7e3509f3e7ed,e83e565cd74c439f278cba18d9a69ae4fd6269b7653f1a910e3748493a7af15c39606a7bd996caa52db6695c913ab894274452e753ad4a4963948c0fe639b41600,13d0d6ef0b0607b8534b8475a14c05d75e2cbe6b1e93ed25befa1bb6ae28b549024075118bfaeafc709b4ce8e3de81c19e609e0bd72e7808efcfb7484913efc501,b01bb5ef093947879defb740b8f2db84dec7a3d0aad0a8a4dfc2b83d322751ef6ea55303fc2274d4b73d051194e21eeb9e64fdc99497e538363ec8f1f294944200,7654e68f7a2f059f6244d2a40e820059ac91e5f794953a4f2244dab84e7aa85f1b9b41bb4ac09a5a8e20213150c8f10233af2438c449e4a42fb86cbe60fb59c001,7a81bfee8bba5c8cc34bdf8ab3abaaa305f632f9da7730d76dd24f7b019a3bab67ef5d27d3112f2af9f707b9b9c9f6485a5140a1a02f40f378a12f6afce762fe00 +fca6a2b4dc4762fcbe1200f32c58ebf5634c645061ff59b785fa55fa13830043e9fe1d428c099e2b5989b9c4eae07b38df81d71a05c700a30abe40bcf9003ccde9c29a0bb08aa2e6f1a0b16269c29e37bb1791ab5a3447f6fd4a9329cfe826eb48c3a5284b85d8f001c34980f645565914c85be17c3be1f5b97383bf9cef1abb6f68bc4a83871ffcfe199bab46622ed47a014225943c8b5f891a1c26206471684b9b6742f227ef141b5fbfd18a753d3caf2a8749d8e34a915b544a94391a6b742b94799ee151065fcd42d516f3c046bbf7d21bd1,5c9dee61c0ee3a32f927686c28f2f6aa94af1c2c57d56b47f4241bd2417f2699,5ac7ea048fd66c2340ced021424bf7c19400a2992690da2cba23ed4e68383c45286e7e2fac3df7e45af181f61ec0602c551ff9415f6fa46c66f2f157b3cd237901,813e70553dfae77e30acac63e4b75a202114067ad3a84ca597676e8f13d750166c5059dd8c6c485730531fb50e236fe9dfe385538428a2b0d4ed8080f2944a1000,dcf354ecf13e571bf0bb4425eced9705a4689181daf339b0c3b8afcf572faf1814a3dab9ae016f8791efcf61cecefae3e7a1a9407fc5a33eb2b27e2b3719818901,6a4f44781d2719edc39a2290e48a37f341d247d35bbc1b578ebf10b4aa4b2f8e671cfacaa05a5c830e135439844d10f4bb598d00d2a21f4c446027ce9bb6ec6400,bb8d5bd22482ef9651fd851b47989e4bf689e577da5699764f34d89a9fdbe170531aca3434a1372cb8fb4c2489682660544cee141ca9003471ea9bf8e7a069a300 +57fa2cd184f9c31d0bb0a8a2c37a17b2a37f394a407c3dda8ef485005abfc0d389bcc09c013169a2277ccaf10838f181f26473d78bf1ade3eaaab815d17f2b957c6cf18391e578d7519ab8345ded17e932898488c017a8c2ff428a36ad3c63fdfa25a5efaa905260f0788c218e2e2afc63f28d48cae09fa0abd4d2fdf9b9b90778521066ba21c8b3bfa1c413ca8d4ef8e90e98f3568b99246c9fa30ad8dd57e2f4b6118f2edd7a4ce3ee81f454be93395c257efcb11366dcbc4befcad4e89e536fcad14fd4110e7669e7db9e3aaf491234cf6971,1bafea9074da5b1c7e313a50f4e0f12515cb683b5055bc3ff9a05d08f4b689f2,6e62aad59d2f0711672cacacc35b538016951666f4b58bc94c1cc93dfa9fbe7e31a5cc36a61e1b8dc0041af6ad55f7d9cf904cd48ef1c1c7d7234b6fa19c1dc800,634bb2c406e36ec530387664763855b534e682789d5246d9c036101160fd8e001cdb09274332c58848e77696b6f1a1e492e328c07d1bb4ab7348ebbba072aa8000,b150592be6f64c2a4ca7c3788e1eee8ddb484056757e3ac2fc3bb95cbb0c60764e25c83dcd42b36efff2391e7f63c52ad82da32bafa61eaaacf720d91c6cadde00,93ea70e92642269394bd0284943d696d034046147787962b5cfee09c8f53a7114de2e0dfc1b3bfa2de4e50a6ff549f63e06d6c3e0ea39994c2327055582e56fb00,21903d32924ad854eb0f8e6cebd5cfd8b296da73cfe9c7209c41450f4456374a0624823041ed2dcadae039fa6e8d17ac779c7379a8073b3fae07cf87abfe489a01 +eb7a89dcfec3ed8930d452ea4a8638db7f033427b49e1b41d2062b7b230d1d2f9bdfe5861de916e90c9816c2bb60ff5fbcce36fc32628941e7e043556341c0d94327e1d86675a7a86b9548061980a33bee8ef620b1a27d1aabb212ddec7b65386d5364c1a74bb575deb1e678635fdc0e80cee1fed2bab71c3393f3f26f5e592dd68d77ddab0e45d2f5069be029e1eda1fa898e52b762bdeffdc20cc456c64c760ef43f4745ea0313af5d467498a9513216cd9a07665d1a13878186476c407923568b999e5a9c5e16349cbd4323bbe44558fe1f07,2fb48326c090acf6785b580ce3a82a0499cc795490cdb04bfa3ca026f81e1237,bff5a6695ebd3b64aa4482a6e18f4ccf837282bcf2d16e4a298b7934f102b9eb5e8623fcb3e7726dce3deac18eb9f52f22c13cbd689492b8bf699f18594f409501,50449537460283fdb976b128e3bb045a448903cd06495c0b5ff811465b89bd45391ad3f07720eb0a355b3b6482f88b01e2018480cca8451605f9e8bebcd9d7ac00,b1ba46a1897d51431d28cdc4ccacafa5cbf6c576bdcfbb8e983a6a4b621c8bbb60c77185694d933a9e19f83eb8750b8798b5ab0fe7a2d07903e188ae492570f800,a7200bf72d958c1b15288f8087b050c9eaae1f511ca63f6b6a60c82dbbd01045011f1393ab02b2d8c4efaefec52199a731bc67c4c2e980c4d6d5c2c5f9c8ca1100,e3a0f1e0a2ad8613d7839e5d9be54cedc7214561c63159cef0a964b0cfd7d8a404489b2286910ccf7db606aae444755fe19d7d82c84246699aeb4d3b094123ce00 +e748072aa8530b55e3c26ef02586dc52893ba6e99186188f2038395e2e6577d2c2d447545de5bb30354cc30f376920765a0b8a8f39aae1d9b163fe7d63df586ec28f854bb01654406bf7b2afeefae160ad634b94182e06de4e010bd2efd66ceeaff9ed474012c8f86e76c1ca554134d52665f9666bbf1e568789e07ec1fefee0d81a78763ac4bd4dd8a24b4ed738bc1884d3c2104d17f651c94bdb946f6b18b5e842a33d44e79e847519e18bd99ca0ec68cada15ad15042cc8e0012db0737d115e95abbe3db82c6d637aa64c32b378b00cdee32d,6167705667d2d3e8022372924822c1d7c52a7642d82807a94ee59d9f35763401,4156c230f5b3345ce37d1166f57568d0fc12250f8c5fff8bab73aa4b0899efa2593bdca07304ec85e6d33fcebf62acd322a079ca22262c92e94fda8ee9e9fb4900,2f0ce6c7fef87e8818c2af67fe8b3a4b7c8181a755a781a21c9306c22824481b0c3441a356adfa72cbbf713bc0638c48dfd4a01c463eecae8d5247f4afec783600,077653cebf77fbac2d1bef8c25375f21348f71f831e32aaed4ddd1c9ead57fb13a936b4f7071ffdc239641a2d16ea94106d985438cd4c30f264a9a276d01d0be00,529e9f9eac60c435e37502157c89bb91487b3870c39a388c8cbf5942bd44e6e30530d39926001b5665f81f20403ae1d4db1ee9ca219aab677f6b88cb73a86fff01,7a7d23fe3e70f9167b9c96241b3d662522a31ef8e3d008be5d860e8264ada3ef39d115616e43408d66c906278eb89705dcbe38167bfc9c66e92e24e93efda75f00 +4cd6135f922404d65fc533129ecf724958080e5b6d44fbbde44baf18e41f6247166dad107ecfa464d2daddab8546753779582d2249fd14a74ac9e7d818ed16bc3e88cb14bb489441a2b6e3f7a61fb0e18811fcbac3edb2f1b8a74495a17940c1a007824d09c6dc75b4ae3d494bea4e00880bd98a5615c383a6f5ced8a55ed1a09a98eca12dc9491efdeda7954a7f2e9f57af8143112dc8cab810d038dea19e5592348d143e92fd57dafe6bc333cceb85d5ab08fc72f5f12817a878279a6efc414894801f2e27d8259b7b8b84f5a5ab6bfc9afcee,7e0aac75dc664857fe94dc346d1d3e54331f45a1aa2c556426aaa3cbaa25d866,14acc0bef2fb4c1e3d2ab0f726104a0469c3f84a1604be3c68df010cb7c359016fddae06adc0fccc27da84df4a9570725051f85c13e8d0193749543ccb46ab5800,94ec18c616a6cd9f5b69d97bcc4ce2bb1dda9b7564276ee00855cc217b7a306f13258b2e97076a770ca192fce7ff39edd5313cd3b4a389308adb37f51ac34c3401,8cf5dbcde36256abc45ea8f4761606408934eab6c7d1103b465fc08deb481cb72c86718431a164a4c3f2fc9eae0099242c37ddcd5ef2b6fe45b155508b8c9c9401,4c39afc9031fea07f4c48faa6a4cb031fe2a8fc5519f57ebdcc364083d41823a5b6d06658a9ff45d65bc357f239669ea7417de8e139a402001dd434f007aaa7d01,dd6f3a45dc4fa986aed70c334b486f0ec9755a74b4d5422f3d6e4559b6afaa5f1b3a889e1a0c9b7ffd2adbd20da798cf21c867b9c6188a649c3e6b5f13f8ef7801 +0026195b49ecce06e5bbd3b8d3dbae7e1f554687c1fc574c31cef260503b561bbac9a4ab54f752c295e703fdb321e69446054091505cb68ec28e300a784ed793f6c6847acdf169ea284f97a381d8e47bf462bcebcec41480a29614f14157bd78597bccf3e034f53c6a17e674921163c7f46db2c42c5c4609ae7cfc6eebfc18671f367706766820dca6aeb072c6e0c007ada739ce1ea0b37bbab90729a413640897cd0aa6570935d64a7256f1baa0174eafa9a7ac6ea608074eb82ba8cd1e115670da2cd2cc692a05d90c70dfb52698138bfb0127,0909aca407a7d0dc4295d87847f53acebb88bd6bf54f5184663ba2e8642690b7,886579719ca95f2ba9c507ac55b1f4397391613547dc5db18b4280e6e520365b36a0052829101a0602abf999dd18e5c03ccc1245052338ff5a1374631479f20301,586bf63eaa85924c61303374942f71b01e0b593ad423528d645fa2feb0a2233147919d89d4f6e2e95eeed560c95046e12b85e03eda92d24aa86322893a81f0bf00,5339f930a637137c1d1c47475ee95ef420420b2ace381d5ea43f67709f1b95c05bceae8a4ba2c917a1037fa274c6c0be94a4c3ad1f7763840ad5ee71a3a928a601,77e55a9fad78d019df696ae72ad5aaa87f89b52920aa78764c6709a65bf999b44503b6caf8129e52399b6b932ae4feab4a5d0be9a16e3d9fffb48a141402752800,8d9cb60416ea0ca00ae757b94b5422518d0d30505f9fb8ea9805b231131b1b0b0dc6d0efded7966e7ca17f1d3f6e61a7c1e724fa9244c20a5cd1912b5193de2400 +025d83303029183f4352481a76af6c73fece0e6289f579cdf706518ed40014449fe2311a4040b8a80ae4561c062bcce2ca7e4f4c59e9847955e6073e281cf0bbbcefa373beb485354aa3341d992df64391ce842d36b7956526bb282d3e9cd7db0eda480981c8c97ed74c8d9c335460a67ee7aa65bbf69db1a6d863a627396d927b09466a003a2e29a3b73750899f630235ee5a364efedbbb0ce4b7184729e45c8d9ceff595523f37d78923478af8794ca548e9e5003be9336247f20d52abb1c2853a3e1106ab6309828ec9f6182e23ac8f3f8f90,af2238afddc61700922e9a66cfc5991e1614622820dbe2cad371fee085ee0f01,3d9df0b60a5351880f500e7de16876366694896bf7838076e14d13c2684ff3b97e772cd458f12a1ab53b55b2d8b5b22d682d77fb9e7a7f7dd7d2966094a7dfbd00,fc81033efaa2b36307f19d2c5fb95f897952364c5127327accf74837bcb5a9e12ba575ae97f5ab94b46a53f32627fa4778487dfad12a37b68323669a016635ee00,0520981dda4685914f84c95413f5b45d8f0e049033083f9eb72aba3fb38484f87ec2765fb42fd87101c9c1ed0c73807331fbbecc9a3d809c39ab8a3e2e686c6601,eecb66471cefc23a0e0852f2063bda745ab04f776e563e96195568c7f84972260db2baf5670ff088f828eda1c342702c4480ecd2a4a3b65f65e4067c4330992001,021372f2efd32fa20999411d89a6e88103d0222c236b6c4271325101c3c2b5b3722f8396039618c256d5c87c60bf03a173a51f6761c78e7563ed5d70a49a03d500 +bb863989bee20e8c8d1b231eed38cb985baf1b7edc36e20f805342915df2d306e472c3337a7bee4d02238816a803365685ca13e3d668628443f26bf4cf30e8cbef023f8a30ca0fb43065f3fda961c6da0c7fbf6625a526839ec2a97dec598da0c011836ba31ecc43f4a899664e4470844092d5c23bf7b5c97556d492b4a255b4693c72d24a82e95a4c8cb3ccbb911532334922c2b69e88c6685b8bd0937e4e3f67b833d687bef6778f0fd1f7761e499f6ff6d566dc2437f3f2273cdf4ebefd31f29ad5828336a1a2c3b02402b8c2ffd50134a070,d826765bce8b60c9ff8573957bd0d80cd5e59874ea13c2a0bb0b5702d97184e7,31c9d227a27076e3254d9f453cff7b91442fc41a5916fe79d0e97682efd62dc4357dab55f94d6d2c7f688d7610b0a55ee1ac1710a1a9dcc15eb0f8ecb513e7ab00,c6c88b28e66bd9c5a435a931609453edd8c5d80b16b0125cc630696b8d65865755d65b47c3e13bf291da6e0a0a906c0d701a86f034df54f4748eecfd2fd4912401,0cac6742a543aa4e5f65780cbdb5276a47679c436a81cecbe1371aa35f5edf8c374e94fa5c99fc89103798b8a322ce1196e2f91319bdf8ffab8041566b9d951b01,380049cf9754001bee53f1ca4c5ae3f439c6a8d314aea7d6afc786a9d5413ae65ec8030ece8b8eedded632f0ad0c98be3f6b8569452e6dc96232a7a8d984737601,cceaf0d2a3379d25c1f62fa5be66f6aaca034aedb5d6f8fc69a49c51d8e244630a12e3853fc846365e742e9685d47291bbced1926d4623fd151c3db5a4458dfa00 +0738c4f2b8e4d479ed6ab386aeff691d6e3ac61aa70776ba73f6ffa0ba3a8ada10a73ba207202d1d31bb935fbf1e1c64e57a269cd1e329ffcf5d560b54ed2d800c3c231976a5e9fa005bf36d580927ba358ea4a2a0fe59406b991caefe71af629df10b99c783c92cbfea20e4074be9b1ecb5ab7175feb718c448e3220ff09dfbce806c41c8535137eae2425ec23effc0e62193829af172c599b592aa55935a1333834725d5948414143ffa517f3c9f54060bc9f11cbceeae39498b6b69053e7f7e422d88cf873e40b73a971d7252e992c868d189,bd12765a51806687ff1da2f6cb3cd0d340bcc282d2fac27cf25913112da4f32b,af4f8a38f02c89bfe47929c6a8cd5ca9e7185abfc94f236a93d9fb791280fbec4372f32f967dc210fd79dbbc85ab7936e6133dc87163530426472935aa93d89a01,5f5b431ae4d01d41649cd50965aaf839914e28dca8b498348e94e10a03042d471d1db15094cd22982a23f8c5d885cc48cb456d5836521a053f19a43eae62680900,2dd9285e00e991b36b10fc7030ca259ea9c8347799e90bc1b6adbbf88216551242397a30c80f32b78bc2f308a1368dd50a9a1a93ab890080e9bb8c2ef292a79901,63eacbb3d9b1c57c4a452f31b27c24baebfacca8e5bda194184dfab28f5d072338df3dd53951b04f3ee9b74e0db4060b4b6eeab343366300ba539659752cbefe00,c1e4cda08f1626dac1bd57cbf73506dee4e65b0996d0414eb904afe67de93b427903cb2cf19f1f07a251edb2132ab3aaab163982f23ed8287c8a9fbb6a7017bf01 +eb44dd8701c3fe74ca19e394a23f6e64eee462db963c7fbde214b2e62085f1614acb5ec793cb5dd5a0c0739eceab3c2af703ddfc50a903a8a9d6d28c297553421bd6c4390c14930250fa790ff8ef4b910d7f81b62ca2343c7147976cb78b86b88c05f01aabec63ea6d02d1eac982fdd3989c19affb00333167d02afaec8a9c1bbb6436c5274ffc0637445572a02e07646ed759810c252f2095ac19dbfc7a321b59c0dd6ec2ed7306decabf473b4ff5f0fb742dafe44ece2ab9e216e62eb7cdcb24910ce20106054cbaf4386cf85c87bbe1aebcd530,66aee8092d674602412c25c6c7b6c08fb11deb2d85d0faa6215953d8107cfcb6,d3333c21dfd8f392e3a94b2bd89351f2b9c6b0dcf29a70d392b2234a3fa4da696cd329904a4642949ffb3023800372fd55b0dcbe94e34189b46c89f4a637f62801,4823bd5e873c3b68fcbd125ff4b57a653fcdcbe048a9010b70ae68fc335e2283372dc3b2bf7c486b44fa1b54fcd87a1d22e377fb4ad13957e6a4cb60029b438600,88b57abab479039ef5d487c6af1bb1f3f4d37236f08dd9bcfe72bda9b890ff6701ac0aea84d72362dcba296da9f81b1f4be460d8476ffd082fcf682aca7de31c00,7722eba0fb9959a9fca68b43c8e94c11b2ab93f52fac94bcd27d84d0a6b3327e337a12af583e5b3f7242f89db5e8491c24c1398e4f77b3629679ad86a3e8119900,a6754edf87013e49b7b47f8ce348024cbe4044164de23b58fcca4c17164aac7c55b667e80480a7598d806128a93a75c65f2fa6e1672c0f61285075591dd159b600 +d5fc6c84b6bcb0c042f90e7480ad162fbfcd277ace16b3a34d6ed0e9612d0857744ada88fc9b8767f94df1968e0b3577296272152f3a58e1b6bcf55c5ee1c27d6651540e8f9cfa085cc1ea65e7bf597ed05ee734591defb062f1a78396c11075300edc914c8a6de862a4f3912168db21083b5bdd7644479b875219559e85393af00b73bffbecac6b4d4662e591545c667e602245c590f05f65534a1a2c1d05512482ee2dfed97d98c2277e5646dfa1faa25aeb74f91a5296510ec42ecbdce2ff2891824aa66cf00af3c836cad0438fdba6b54aeb97,17d7845f83f37fa42d77bf7d9cfcf4a279f449bccf6735195a6d215e5570ff6b,14eb024cdc2a49347adf835cea14530fa9c4cbaecd20e9890f3a571572c8bec456301e546cbd329f831caeba3fe5d96bc27aa9543c1d673d9c12ca557c0927c501,a9d0a945dcd7bdcbb8f06cbf83a05da3e8014ff483a72265d92d7857faeafa587a58f760a0443e8de057a58e3b9f8a9e5460867b6e0949c8ac55f38f48b672b501,6c667446a3112005955abaecbd7966383e8b434f32eb896e514e6fd67d1b2686628eb727b98881741f169256c80b1a44aaf59d777b14a1d61dc989762ad877b100,e17df335735fa1f85e4a11eec3d93a1c16d4f41ec66b28ad1b03992ea016f63e51b2f5cb2d1ed1adf7630f0435f6a8af7758fc17f97bce5ba9dda5c529b59f0201,ca376384bc11f4db7d0b2176f901923d453394081b184d0b930b7bcbcf7b818c54edda0263c605c406a286995afa3d4a8a5ac2f94e6e8113a0ce82a7d535b4f200 +a3f61d5565300ee6f2bd566c208e0f3563e781c45c455446f6808ddf154659ff54cfbd8f0585891895eebbe1019e077621ee0284fb623fe03ad2abffa4800650d641472a30969ab905cf00559608656a9740a3992681d0ca775e60525a669548ef11e8bd51ac05bab5285acb82dafb625eb1a2ee6eb5dcd973b8a3fbc2dc12edda06cc8f49caf744e959f064796eb1691f6dcfc1352e8d153770dca7a1c562f3635bc26b0b7f9c1a4f9efa2fe3353d43f84e4265dd5d38ecf4ad86f36ac31e1b26fd846c3b306ee2c857cbff6931fb8c5e94840252,1531b115de2a8cc2979a4c6032f246c5a42fc7dab4a16136bce1e1fd89c58b9d,034b5f2993c3503ed2a48fb4e92728640c1b14e7e7d3d8a1d882a8c460bfc4ed283de4706182017b8028f7314f81f94b7a34837a36a48ffb5f0ea36fddd2748601,76800584bfef546dc3d298af7081e4d2ddca84c33891d4fbd2575b276cfa4b2802123fd76b476c5d529ebc07a702bd77c01ebc743f9bf36b780f406190d1a72900,dbd31529cf4ce18a5893c96dea4b00c15e0c854db6126a1158a398a1c3cf1fb3564f634405342d80020ccae1f01bbe5dd367a545889e9c06849f7198e197cb5f00,ff9d699f377a5d26e20de1f0b309138744d0be7a3cdc14010aac126980b98e513d7cecedf3770aceb3b74d0579ecbd5200695cffbc07894397506d0c672009b101,c1ac3232608e16388d3be7172d3bd0d65dee32c5e3aaa76e4117328c845b6e8a2219c5d3b2b12a11046433ce561fa4e17f7a1f71a6e16e41d0d38a8b59dffd0900 +7e693f939f8297a8d336906be7a126c6e1b7814c9884bbeaa07e59448bc5309a69551bbeaeda5c7115e9998266e5dd31a59e8ce3c0aa0c149be254c56fae9341962517ed09b491fc1b11ecb2f79bddb32cd9e605e90b54a13d480116c3abdeead7dde6b922b59e9effa66801058462105ca84ec6f0b4a3a23456ae3b980fa39c2084325543acae4471cc3960c2ca68cc3d4b62b1d4e55c0938b375ab523c1ee3a5b1071982ba8daff5740ca32e7877ef25a77351ec1933a4180086e131bed26c7e8a84788665cf1c4a8bac5eb7d33da09050f6409c,2096c1e626fe6e9d227130b1f3a369f813ca7d75aaf165f703d3515ccc57c458,87b17c9bf273c881b7b7c68fbf26a37843f57757e5921c8941c280880823177a79cee5524bdf8e09fbdcf4d0876c3152c5671ca8eadd57b2fa615f172b0dd16200,fcee3102ecbf623d054038db182e52d33f66456c1f6f6401156770eaac88c2412ec883592748d211fa715796f0636b1de1c19ab77dd58df43a4cb650e061f70d00,4e011295c5a81e3b6c44f0afe14b47a849d8198221bca5acc1b8d18e3ad2a1926fa3d7e824aa8fba45a197b4cea3e4472f71fdd54ba1a57704ff89fd86b9331901,76310402bf96a8179cabdd254c78abed4599382f219fd6108d748f51a18530032eec677a8e3cffc66dc8c45561ea46ec0e709a538a46b2e4eeb4de7b80a982b200,c8badb229f31691545a6c6980afbe745446c8733f5cd09b46a3a76baae0fb3a143e434a99d1386540465c049ee46f11326aa0401e40c7851b9b9f322e153ca8c00 +a55c340f01039917d3fa5bc292eab7a84856c2e0871c6e38086f1eb00bc18cd8a1bbb2f49e31d9acab1fa1e9315a7245e825a5ff513abb1d87d64aecbac5894d6f7411efb69160f9d341a33525fa83d4539756fba25bd5eb45380c5394f14b642413060a4205bfb97d8cc3449cd957a65e275e982f2a9a118fe0d9a8e1bdd7ebb038cfc3f2d382412dfcee6c7c8f317be7daadb8aa86f684420f9aabd3441849058290153e3e0debd449b2b9cd07aecb58cc6fb81ecec2fd739d6da40d70d19e82fbc522edc847a43251daf38200229da792993085,b05d063f018cf115d6f4e36c6b054242b89b089472cb688851cf0d1f99b406da,df62b364bc47586d695a94806a61950d23fc271f56479e8cf6d8f53bb175f4ce5cacb9b208ea7c19fed6cc4588929df614d27b2b4972620e7e5c7278dcfcd9a001,c697dcda816a93a07aa23cba9033204ef5bc9451766274b5130385826a189b9930e0a8eb3dc3601a52c5260eb64065b29d68fb08766e38616897f8f068545b0500,f383aa0daa7053dc18836873f07f367a9709032bc631c446edc925bd4fb8929e77a15852ca3ed9c44a1f3d31f286ff044f27eac0555e138a3d2c52e2546217be00,85f4180903bfd1f3958a79ecf276397baafaa13bb5d46fbbf05802c7a83d01dc7bd69851aba9efec7446c7e91fbe6f05eb19d259c6e3dfd98737e5e2f42c700901,ad4bd34b6afc7cd339f747a9bd00846a0cd5bf99c6007338904efdc4421c00eb5e5be13fcda24e4869aa3d0dac98c8f2dc98d85c2ba022218426c5d31f09836b00 +bc68aee8798b98863b09767c64b15a582b759c5d3c259b8992397068c2207dbdac6f9cd1c86b00ef5da915bdf5b8a64a9245005983e5837a630c3d42bb4d054d8c93df87ec3547bc63b418ca46a4b2aca0d1579861d89a06463b62416d135b9fbb519bf9e92813843e42af82e95812fa907f10bcba0d0c62d0f3034643aac1709d677f389760ddff677bb2b20f0c4b50b2e9525671dbe1e13d22176c48985941a1c1ad261346d14ab9777547127c990138f2af2569c71d01f7f599a84615ee9ed4278808fdd16730571c02f596eb1512566cb5dc11,7776a3165d38eab7f8afa84970526da86313c638746f860fabd8f8342b5634da,9cc5d824b96cec729a05caff4856846e03b309f3de4b6c1352c089b864d74e3558431e197ffb2bf57eb609eb8af41bece18af08a4be1d0e78dcd14114637de1100,2b8c2ba90b92dfe38a4352b264ac42191aa41020d17dd1778be7bbbb17a7747b3c37cb94c809f5a0f37c381e446018b9903f4f095b9c09e70487b94e21c60aee00,d580d5d85f90205e31c9ef26c291134f651360daf66b9d3ab239efed2443de4b4e9f5ec77670f67d72663e7ac036fd7970e3b37c1226712d73bc5b7945399df200,e97779c45261829a26afb864b4c4719d653d18e7303879847b480790ba2f9e6e5b3d0961e485f1876438a566d78a68ca21310a14495fbfd3826e1dd360e6c52c00,86d4c1e29374f684ebd53059381ca7055401d7c9e7d200a27a63ba2ed68f7a275d376f155535d887532ea54c93ebce9c7ccb002f27c12c199cbbb7be034c604c00 +1476d27ebb8247744c57cca1e575ba69fd96f1993cd1189cc4076ee518218c01a5bb54cdb3946a0a98ca7e388899f103d0c9d14a5ae6331a6af92182f2f0a1d7437fe541b7b5eb8a5e2f1731b447a1c4750e3ebd536283e8ec89fbdf40744fd075f1186b8693a786896e0af3eb795c9d195d0dd7e4704661cb977077e6e555f4317d820e0096ef441aa0365ff3073595c65952390bd315c6abdaa65413048dcb5a26a8cce34f4fd0c43abda0db54b69104e1bb5397cc928c999de487ec4d30e1cc36aabbda13f289f3d016ceeaa32ff88e9cfbcbef,08656095e6ea11cfc6a18c7e78e69595787e2e31bafed6d89deaaeae16ccea43,124eabb95b46c93b214ff90faa2461bdfa12a0c4b45e47659a74edc5bb31e91107b83bb0f97bfacc89b47c45e7646d5fbb30241e136163e91292491f5928bfc400,4147ff65e9c50caf4ef19ce2b0da5cdc42199fb8303d9dd9d8a60643b1dcc6791d2efae1efc40f078ba200c238205447ccc752b9e7008151060389438d88e11400,a1dc3d2df358b797e7f084406a81a508bc133aa2301c2051e76e5655e6aecd2a3ca77fb44894c498d5d42565547dba61f689f8ce69efe04b258a88c4c7ecb98a00,114dd398bfc9fe2006b498e4205c70294735c0a0afd4fa261e91b969a550b7501d12362fb10a7e3fbf6ae281384e41af2306fa3bb375ec4e43527839af0b859e00,5065e722d6b2bdf7b10610490f550649c1a13ad1b0f45e38b4bd43047972efd83a5fe0b8b8c5e091e967c52c4ff66c642f453b9f1d13d9c9b44e3d3e02f3896401 +f0e74809002a8b676b6da2c0a648d14735d5f5ccfeaff4b74cd56d06f0c12cd3210c40e555bb586715a0e40941bc9d689a51a0f46dd3074adb8df941021693fc8c170a5225f50e5e16792bfebcb1567d75f2644e235697221e2375c3f61576ada1757d5a95c1fe6785356c02dd808be704aa98786a44db857b62dbdbf17a684df1f85c0b7f448c25ce90f1fa8dcd16732295c820bc52eafaa8fec94ebe641d69f5a3075981ff1c41c15fa19490d4633e76f5e7eedd8aca13ff6c3936937dd17a06a7cfd4e33e627301334b9e9c6a079ad1caf03a04,6adc479806542769480bb299f4a1a478eec65d735f23b8880efe465ff4d86f72,793b59eb7561019db3353cbc2a589fda3aae4ef36e40339d2f6daba01c28104f1e54cd4dbac04412029d5a621212bd6459a7a81087de0eafebd3a23815e3140500,bef36352621ca2c6183c5a90acfe33d1b4a32057f8c8a38284008cb689c88a9e28512accc79682a6563e95e68196cff770581f26804a3fc89d189ec19db027fc01,c64b6c36d0b4662d72ffd380e70bd65ca0e543c32ab405ca6dca0ebb0eb4d22d6ded108d28fb88e70f011a25dfdfe1d1027ed0b35a43535dbf24bb2b5c74e75b00,8d4fc1a79c2e6308dc8b2cdd5863472876c3b06abc36bd6e452c01759929eeb059c5facb1177d6db33760ac047e26be8acee540921ff1d4a63938c52b35ab26d00,4ebf7780f93eab83883989d2c0722b9a45b56a3184a19b776d0a7a114cd63a0c20bc970e7b4aa5d5d9226f70155f7e34edda02dc8f212dda567d886ab1f5626f01 +2da9eb6934bd0792bd2525c2e97a0545f3727421bbd528179cc633c7690b51a9f01d61d703d306e794223913cc25df20c72bf324c6c214328cec552fdef84f91ebf7b53410c683e8a2195d85a9bd8b8c7eff061183a471ef68592342bc1fb297f1adb47fdaa11c678a1db662448dda54a1c4adcf57763bfed0abb3a851d8302b4e8d956ed5a17fc199b5820505b9e229b8cb55eb330ad651eb9daf91c2759d7b82fb1340c45b7798168be534e2a51817b6ca594afad25362f3648ea785edc77c873200421184bd09909503e3bf805c0050d4d0028f,956a6a4c27a1445967bf0e46742902dba4c7521d8a689c45dcbd06a415ccbe28,be6e73556777c79629df0a4c09e0bbffe4a8e92e1d5048801ccd686aef6626ec23d6553d2d488df8ae31eb0fcffb37c65b20f11da3ff539e29b2ea3ddd6cf6c400,feb51d4ed10801cd6cd4efa9b161fe00c1c9b6f7966cc786eede7b032cff0b80786ea9bcdda7d529185367d776452810f01618d84966d319264da632c408852901,ec1816f956b4767cc36cf0dd3689ccae86d346e135c758f9576150ae63e7f4c35a394704924e56a84215d63a21095f48f16f64969734c1f97e928a663a45e47e01,ce3e2a31dea905dcd14f8b49cc1f77834b59024698aa51dac90809f67b5025ee0771b51632d8b7f6034ffab16adde97792439da1cfddfdd9b4015cba76fe5da501,46904cb8cc41e63c3c846af7d46e318ae1fcb441d8b0b44a65cdf9ea93eaa552166f563ba1755ba708501ef52a0073437b5bd36bb2f476887f2bcae6ed89158500 +7c67bc38d8548c9e7c4acd5de9ef7ecc6f9bc502b49523e07d49bb8246b66e4481340307d2de6174b420c10a713cb222663cc6d8f1356a7e01b956a427ef322377be158b4d0f3b25845db208b1c6325d35ac50dde317830bf6d6e2d79efcb78eafdad5045a20f06dc4ae350b49792e1843f17346c6030c63760d1645b0b2c2fa3ff3130be17a321c3dd8fa7e95f682d90cfc08cb3debcb00a505fd4f4b1555ba00879c2944c64edd19aa9cbf09944d1e23fd790c7dfb37a2d8a99a9b74ea5b58f40e99abb0182f9cdec88bd928d2bf17d20adcddac,15213d27c4e2127fc39f802c0e7836df578c14ebc8a5d640f636623704137e59,045ecad0921a8b4bfd56b280e92a46b2db322b535112d2ccbab9bb7b57dade9563d2d152bd45a32a3cf879e573d0555c9215fc9e8a22430bd190b9127cd7a23201,56ce10a4f24189e6410f48d79dbbcfc652bfaddcd43a1c035f6e78c53912a127291b27a8bff9e1a47aa7b324029416a6f2fedfd03c4577e4b983d72d52d46bf501,ca45b846f9db3c60df04d8c0212ef27f56349cc796099cb95ddc7d44cc0576e373c7cd8f3ab58bbc3a6374ef8df9925c826f454df76e1452f97a470871126c7401,c70114f57132f75172b2942958edabad15cac673a5f5547ca4254b97db0a179b01ca3437941d63cdaf656e935e7ee22add23d73977afca4944219aa6cab1465701,fdff179063eaea73b53316eff971041fcf8bcb48db426715285c11e2ea7fc8a40751ac224edfac018537b70003abdf55afbfbc1185208c0168d6f1cdb7f8ebb700 +8cb14d02028eb74d32545531d273efcfad351e6cc4b2427d1140949824461b35d0fe0e3a7ae4e063eed98e1ef505ad7a8b8e26934d4bf7cdaa40a1acbe392729ba1bec5be2570237dff27022f98141a2984db19e92b16bfc3d6907f2ee0419034ab402d23e16712f4a4b78670bfb6bb56385ac82f440fcb138da94bd67e3ccfe85ae41902c7c2f48a7336e4a4fc675d079ba351bc0bbd254d26566d8ebb42afa7844e5eea9c07624476dcba9cb3e15c86bf35e170ca888eb7461fdeabd4dfc04f948d1e42a9f984ab3584805aee8ed24ae8a0885b948,0bfd2cc4d36bf7d2ec0e69a09ad4a2e47d54bcde39b7aadce46de801068aad61,0282a104d32b3b26c2e49989202130f81af5c606c9fb70fe3a605f929309e50d754b2de97be3ed12735a70252eb0da0df4f58d6e609c895cb63536ab4cf08c5e00,f693bebc85ded5dc66cb97ddd0ddae9cdeefd58ec3872e03d5c416dc3f8327b209c167e9bba4dbb358bfc623a1e362576f8be209f20bdd630b3c493ddf13330501,7cfb756ae052b53339a8b68673842074bec18b88a40c9353b60a35996561ceb07cd613181593ae9d640a962ab30dbf7a503c43b0493789c55b7b2cec0c1cba0f01,57b5daaffe66d004846bcf66593dcfbef9e8541f2bfc9157d8db9f3bab5532485ab022140b15a208d2c6a87bb7ee15d00fc9861bd995b0ad561e4fe54174bbf200,bba0b9a25d7d6f5bc35d53b9e5fd3faffbaa0147ea6c3282a1342b3f8e0ccde57f22a5821002093a7f79227cccb816ba716283dfde94201739e4808458ea816100 +04864c30d2dd3999001b91a77dc29e593581960735073d114f11dbceb7ec7c0f6de9b1f1230c38eb2fe5b506503b8d06a08427ed7f44a618e11339ad4da37753e3e9ca4f83ad5e2ef07733ea3d849810d5da3f7ed3f0871df55d31f2e60579d8e66880cc85b8a38abab287e83a183743870c19f94f95c2f93172192c71a7cbb098c7cd895d706cb2d34375b108f82cf91cca07142dd2b38be7e17dc036d6571d121043c03a43f06bf092f49f71ea72b43ef8b1b6eafcda8dfd207e9a423f5296cfbf49faa40575cdd19881181d1447d1958fbbdeab0f,b288c24c4881a94df73d14e628c11055f3afb687bd4b78eb73d4172a63aa0694,880c44246e3724fc462551670d7bdce86804ce84d0afcc2171f9c876fb05d8986e628371ee2ee120a47304f7fbd0c77c3c7ae8c73c1f5c4ad217efced85c737401,b34d0c304ed6bdab97b917a26aaa4cdec54116f1d0a0704c8894ee169f8afc3b4d9de3285f436d7b0907cc73fb24991fea7d828a7a88ac9efc3e412122b916b500,779a7fff8fa0698aec924cef1fe1cecf08ce86e77a8405a1259cdee2ef7a01a8332b2e53cb4f8b36258af378501e72df6d6466a8a26702393712285b31987ffd01,113f5a34dd11c5f5d9d3507cdc75a269fcc30551d4027b08ef55e3348b7d1e9602db7a449bd5b62b41c378d794da1653b98d9d2ec00b52417b65a137b17a541d01,ea77d4fb04a6eb32428bfd9dd6b148f1e7670fae174c7ef777b0d799e3f539a83644a0903c6aca4c059cd602e2f3d66c255f583c81d6035161f02f9a2046dd5f00 +fe6199a38501113ea3c642b4ceee5ac510399410d166891a0e5ae751ef86569a7423f3e95bc9b9ed534284f6770554af261819fa54a4b5653f6cfbd6b9981c3f51c5fdd777d9fcc77ea8df76597f98d70691496db3145d443267ed52eb6540e537fa1de5be95e146c3fd35ff674d722608c9e664a6ea3921312ac08c1fde7ed4707686fc12e799720a7796f6bbead5d1d24b54fa985126209c9f4cbb884bd5f877373abe0c1b67e2b19f3a4921ee95f1699d55bdbecd2346d0f16e24db78a01a28411846a9ad1ed8406cb0ad428eae75b2d8ff16687e,640bbbd2f43e220bed72d4395241094b3118c112b6f866ff2fe3048556159b2c,4a282a13402952500f12bbe9e05cc754c6e42ad40b79d662850c9e8d1bccb4157b3d8a692814e1cc7856e1884518f125cd481848e20559c0d674e58b282105f501,7cfd22242b276c24b5f58584796fbd6a4e6641b59713df89ca9bc3959c7b0530797816485384a8263d8b2238bec686331700097d30cd7accb8eaafcaa401bebe01,2d341edffc08ed0d52e518a3ba9803da49c139fbf2039c3e2f910958a76b5aa7180d85629e24688993a29e6859c7d5fb4b9b93fb44974c7e0574e2eec806f0a600,779dfcd3b8c72a6dfb8836a935d06441f7669ed51867154d02ea0c63152a3b352e4948f5d9ac8f06dceff169a12f2e2d4cc824bc63e65491247cd1fb355ccd1701,52ab7c76bb4be1a30ae9f5571301904b8254e5fcef8f76c4de6fe6360047954843c6f6aeec1948db1f48e7340f4616a793d247ecd051e86cd5615be08a1df22b00 +c59e838b0c94696f579625c3b35ae591da533e637485fc9548dd476ae2a77d6db4567a03f0cd54dacae330c464040f4b0f6be48ac549364f8396fdc50b8dff85427f9e39f3cf4097b66cb79d4ab047ce87e9a6f5227620181a75b8a82bd2033f2d449738a9fe214d5c6f7d303c39c9142164a1ea43dd1aabe30595b3abf9cde76988c4489a9eb1cf365c705da5c4cd9fc5ac9e1e689a16f13ca8c03e59b177fadf04e3f5c71a42319c8a49959df3a77a086608caa73f0269de9c47b488b04171c0a1aab363d3e823bb08111d46943489a34ca9190603,2bab10204dc1d16a1d75695c045139d9c4c4fe6c733c992f43e7de085315cde5,0dea824290c35a740937cff5e052ae36badb3a3bd3db5b6d4a857112b6ad6f10429ff3fb67b64d5b89996999bf1f8fcce5097f67ff2efbbbc62828196b11864701,eb24c22c2effb4a3053ec3ec1ca33b3c775f6a0c887d011aa2fe59f3f785846a101c1321b45e9fd17361119f519330d0ab6f87d2e68cee2ea3c2578514d43c5500,41fd418589c0015704891efbe264cd29aaa3d34a8d3d5a04d33a42828f39135d27b21d3b19b8070378c6fd6e8ef031454d7e33d88387da7dfac65ddf5e7b4c0800,c9b7cbf0b25c9c82a1aff8f327b37e01ab123628e382c3bee07bca060fdc3da14f2e231bc7fd976d44348596402a620830738338d5e25d891d8788f1db5e225001,28472876a1bff6e95f4aceab4081562a624516a4c6f41cac070ab16b459d7659173dac9e18632e626cf4081bf3d2d48fe66c4d2e8be81225050e82c80e2a2ddc01 +63d94e63ecc769db36ac2bb409ad2f691f2e71207dad65cbd514e7319b0353b6c182ca949e14da0a639b854e55a9528c8d04e29e749f9c79b40219aba6edda6fcfea0b53438ac83f926a997fa29e508f84218599f66ca08d78004856680729148ae388009d0df2300e014812352ac2e8227ed12fa6248b362f75149dc17ecfbc5a7b1f564cc80db2ef8ab83a96c6414ba0f569b96517f328e0e4abd24ae76e36ca214717494a5ff0f26ae4d48ff3c71787b170bec07bc55e51576a483cfe4b0272be15e07e2dfe4a4ba6d48b0ffc8333efa33064f634,c6bbcf4068b3f6a36acc92413947b0d1e6be58023f4ae4407da04ff943950005,145d5806d72f9ac14fa748a33d71a7327fec9584aee298b52c03160319874cb323c9797830452f80bc27e17a6e75bc5497ed703033543b066871f8ce239e47de01,bd743a208667f1d102785bbc1f3120b5ac6f224c65e575948361782285d251a731d51a4350c0006cd47363e1359c838b550de4c17a45ee1e5c86365bf79566bd00,b908d1e34f9b606a799b2e7bba44d6794810331e3525d26d1509ade38f2a902b6bc6dc47581d4b4582acfe30e9078e65a6e2a86e511fd4fd9b958d0a57a4895500,0c67cb41ea067fd8e7091a30aee83d7c76334ddeb5e912a8b598f4de76cb07314ce885592994f27e51871318704a10b88e6dcfbae76d9ebde2897f9460cc866801,77711b337be03d05b15899a3ed779d8e73f7665824c9d2902c37c5fa917611be0f6c2a149df454e0075c0a4ebbe93b48234fa0d8a717d5e5603f95b86c9b033101 +17e9757b82d027e95a1b31b5f2fea6cfafba51a399988627aca7adf8954f201a273d207879e75db0e7fe0c0549d3fea7a1332d6ab4d3c194ec19244d228e98173de7db07efd0428dc0b87a400b45593f584e764652d740b53920bab312dfe936ad8643736479feb6cd34f6f89928f6449cff46a2aac0a75b9530864d0762915c74a3924dc6902f3e296d82973ed1b1d6498e498d8429189ef0f13603bf896475e7dc2b30c0af776ac5fc11c034f429bc625b30d5a69cb6cd1be9eee40c8b9e12fbcb473518be7a736aa7fdedc17c242045ca7b099548,968222f8aa0521ac885d4e45641234e05f03d59ac879bf86b66b38ec1467d220,dd01f9115dc34a211661bae8d2735a853d4298ec7b21f02789e052799a5d40665add908c7ad97d200339c151cd3335132fa917ed389205b4e847f1133e292f3b00,9169763ebfb33a6cc9038fc8196f3e7c03dee5de0c2dbc72c2bbaff2e0f6e16b1e04eecf0343c04fa3f84d10a7870d835cc8430c13f2ece295246074c0c63b9201,b8a4c1996529989caecbd59cdd516d8d92c18e3ab1d53f1ad8e18409e023e7ad54264a822906093c6fb55fd6d760548eb8cde9c1ec7783d344252b8b76619f0600,9beddda115ab82470fec9ccf064d85f9e2e394a36cc3b753206a4246ce2caf517d50a2dd5903c5d32eae37be188fb375cf3dd3ae5d0b8dc7c165a9b020abac4b01,cb44f350f9412d752670a073946bafd0d68409443587fd51b3e4034773a573b6701120d93f971f79d235b2ec7416e10a11055450ea17a4d2825a24bb9017dc2401 +ba4ff6cd3b7dacac21e8ecb58da5da343ad6031a0010a9029f3b9c5a45a421e1aa9a503fa1fe1f66ffa5947b1ccbc1f063639ac13bccdf37fb10238040b12472458e035b257ce467f448ce17ff4f63ea7b10d4afebcd4bc0eba6402a4761d1a966a1938faf936666e61e170c9b227a7795a444007daaccbb5f421e5c052dc748089b035247980ee47c622232521eb5b07100a4d351816e931aada89d2563a27e2fa624e2b385d48cf0253d9d366c3da66fe52ba081d37bf3a418d3d6292e11fd76b1c5160f1e1f0f4e89bd4a29521a9fe2c9887ced3c,adc15c8b4e6d747071228a63fbbc3223fd957bab6743c2ae783fb8354b1c9b7e,00a7b8c7ad144ab79f2fb08f52c0f71ee46db69f6150f1327102b74c462c625403e9ce5adb4df832faf6eb01891c10d94b3eda76cf59e802e904d71ef785588601,efb7841fed11df672059421efebb80e8a3894fa1313d41b05084e605b73de017640ed3889ba6694e9f1489d386c48478f32abf4f0c7b1b8be1cc2f8c93d1d10900,1fdcd0c7968051961d4c7bb309315bf79008af2eb12b65ad85462af3b37192bd11a39671a4ca1945fc7bcd5d337e4a776190df6e047b08fe5a4347ce9dc7a98101,78407cb74aa0a72f63d30fc2bbe4f5bb60cf148dc5c0980bed0205acddb7bbb039423f9b157b8bfec5421dfbe4d96205fd92afb56734e1fdaba6a6c78d4225af01,a19147d28deca3c02b02461ffd3b5425acdbea03e06af9ab86074f86da9929ec5ebb5b8939f7f01a12dce4d544bf2f6bd3180be8ff04a212d4fb02ff77787b5500 +bf9e065fc1923de1f0c834c29369ec44b09f411e0a952df9b2bacdb3471a9f5025cf20936849f032380e92526b545fa7e21b98752c0d7334bf7477d8797f97ea053cbf7b5975fcc152877a59460dd1d9a197bb21e09dc3eec57fb5052198416a03a90a8c5bc4574f5ae67f83e933812edf905646dedcced55d2397e4a2ac0bcf7df2da5baf1713e492316cda293afe26c1cf2d09d423bede5b5824d2bd9b1902b9a6d2f334a272e99f5db92939e292b6c854f2411eda1556182573f1440c4818036bdb820894cb189f5f6c0bbed73a0d68086ed6db86,93786b2c4762ed059eafb687daee97d6c0465834de9a8db32fba3371244799a0,cb10a693f12bbf10bfe2ffa104b9987183738d297f2ff29447c469a28664e15377052e40841dc795b69d490a9a52ea81917dfb45f1c056927cb4979532b7bc7c01,85eda493e65cca97734aa8f502c9bab230fa4f91ec0e40a42a90f42d9a41a52a4f2b140dd82b7db4f68510adc3b096f95e07929eb364f7d1e69b289ba959211500,d020246d4e61126f4beffbc4e4e2e1ccb2cb66ca02f806c5364b788fc8cbf1395ea74cb43d5ee68e63e061127263c2bc730d188ed1be4e3bd43f7619afac445500,9ad8809e90ef26dbf979f1a264aba1bd3cafa486d05713871aab5252be20857c33c6bb31e92ec867c9949d9458ee4ea60fe1a5624d1c7848f26d416a0cca1f1301,a88f76d6e1be6e8ad94036b1d15b90b7015cf12c24520b3c4a2b6d920aeb098b2ad8089f3003fe4da19a6b01cd8c79095a5b5fa552b801683421a9f195e57a9401 +788d665458c411da9c9bc30e7439eb7eb11e79e8f28d160b47d22badef6bb7c296a0b6bb4f7bd985fb247cd67792ff1f53b88c1c3ea5b79b3d25ba3677875a52bccdb0eda5298b80108f381a21888837a1cd0fd84dea6f71f584a4700ce351bf8508bef2e7a3087656cac0cc46f0e5e6ce4a1935cfe993425f852d27d598de8b122181afd1ae1700d8e86c6d719060a12f91bca445cd1756c0a81f215be408d8e87f713f3a28e44f32a17daea43fced22aa4ecef1029348e2a7556a3759be8531e33502e577823921a5047023e33689725bf9b017c23,80bfcc9b84a406f6da24b660cadd718f1f01e3972ad3b9e0e24c25ea475e5982,8d632ead68a28c2aae3132efff50f76604e0716f6e05fde3caa6c604ab7243fc3c665bb7211b22285c7e424b0db1a956c238eda16a81d2413d2b35b8af5f791401,d0fc6b55b2a42ee89148b24640857900198682ebb187a347707cc5b2809eefb94593df1d9f71666deddd0ef2f7d79c166f1bd6a589a2406b5b7e69bf4a8a60f901,d16c95158306ebdac0deae538f88b8165aef653fb30b896e1e7e5d67b4e189cf211110ff226e9539b3afd1f4025c7b4bb8bb45ae1da747209b949872ac8e923701,7dce2da86bf307626f800f725b0f9e2f7a635bf6cc25bc1e1c8277306499f20f2531286406f02cf680f802cfdee97c7750d784aecef03b447bdfc25d55aa5a2500,48e88b8edc32e780fd05d64594aee05b0f3e66f22b36f29206040db0ac37739d2ab9e0773dc141e76804a332e05a8d9a2dabf6191c0ff658c73d8b72b4bec02200 +b777b455d3b83e8a7aca427d94d1faba7f5019bca3dc1c3d2a415dd213cc2bd80e794d989ad9162af9a6d326b3e5d9b5e4274e0cd762a2efe86e8a8a4b3d0594bbcaf2717154a164d0d0dd816066b62a40922378278c88d6fc6cd66c2e19be1493c78fd4d8f8315140cacc18890ca145d2b6bf6a0b7b07f5b6cee64bdbf316591479aec99a7663d431a8d6f896bcfffe7e3086649daafedc3f0c29db39d57367ec1df68bce4b00cbd7d769bffc1bdcec8f88d05a12a96101b04ba484eecf6ddafbcd332c19277734674ec85819d63faa08af31008ce6,cc92300e0e94ffa2e8584322aabe1150b381d64fe2b5f193334438f41858bf5b,b0901b4bdf23dfb43930c8b8b66c1e2d97a6d45bd0eb9a342d97e3397b44b81133c9672f5a986116a51eda3e2d27fc1a98496e4aebcef5e839c26ea38ef2165b00,1283328aa19f71d212f659d766469385b1ac8af7432a6ee32d3db67bd64b7c334261f0a6e0cb85961bf9957bbcc861a19752e5b236e1253965e78d16d80d853c01,908c9b0ebff5dd6ddf1454b4fcfd55c2676a0b1898fcd2c67c84e421703f87e4235ccb34d7671dcde386e628809b01256a2e08af95c7e35a26b36cf5993aa00b00,c32dcc2a7e7d7955ba821d8c1fea55efeb606a03227b37b808c5a95f50b7d8587ae8b4e201ab7aedfc88c8ee8fb3adacf55f47947d068fb6c6a8cc1d05763a7e01,85b9fc2b930867879b7c2ec603c4473ab9d1f56e7ca9c40f93db3ea239453e33745bbd11cb80dfcb378388704511e04fc703a426b880a8a904db6c35eaeb84f000 +9de46e9d04bf72dc38a51145edf1232f4cd1635ac615359c614868a328b0552dc8ed5825a0b87e1d6e83e9e4eaeb75bc09b42c0799abcfb460613ba911e1777fb9a34b3864e9590a1f97f3d955c775c47980907c829faef50b1fe5ff1f360c39d056d87f380607f58dfafb27a4fc4ef0274861f4e49144c326620ecc30700344b1fe97f093ddd513c3f9aec548ea178fd6fc585e27e96d04b7794985a1c596534ff230c6a53b48856815900e2d202e4ed3d15b53c69adb6f1d2ea0b0ded4902ebab08a2fef7f74864baec5c65badca1ff5e2890be5c553,8c6788c86c7600b651b5bc0d01970f16fc539256bb762dbb90ce23f87edc4043,918ae9ebdceee17c0298df264646f0e8e72d6444432890667f49a8dd8e4f1cc1134f54c382f6ed82c211ee7ab9df18aea7001003d1857438b6ec30cf03bafe4900,98ecca51123fb4134575dbb0f2602b11f88d4c9655438896b75a332e00c428b53b4a45e31fe8712ea2bb5d07d7fa29a06960c7551246745e2d2cff40c14b23d700,85d69e42e4c7f2ca689a3c2ba30cbc9d0629a294b08bd8348bd14a1a254fe48c5a46b4fe9a00109b5761d1462807eb0f5f6dd73e86743582923f3984460ccb2300,0c3dfe6a0b3e576d60027ee99c4a751d11cca834f48dbc245ed820e46950d27e227ef084d320199e603770a62cfced86617dbee44a577206428fc98864af33e601,1c045884c35e7af1f9c8c808f14848ccbcd62e48e1038253defa48a79b6c062805b4fcff4fa0db3a892fdd17c28fa57ec666207a8c120ef292d3992b807ec04700 +fab33b9bb172b1986fe3b66f03e06fa71883bce4a2cffb53a36a3ba95b86489d3dabe47e6016141309d90f4d4d93f7713fca3ce9d407969520ad71233e8201d41643778293b292785c369aa6b817d304578b2b185004e386cee5b293765f66cf49bf036da5acd91ee396fbc3c02514a4739d0064291735405bd851e89241d771a43170a69da844f486274fc53cfa16a409ad0dcadad83960c9a1ba7741c541f0253dd0d29325178a3cb39202d85bbf061feef88f1c23d56cffd2dcf298e78d15acc883acb6e9fc7b52d7c13938f630d43e45528937560f,592438ff636cc05f0b55997b3904df017511727c8eb309e42065f3272061ebf4,d473ff474c31fa7737c9f03aa90efa6f78b74abf96e38fd08414d3cf2cb13d3230ad00c432e3e11eb196fc512758c9237dad07e937ee3c36bcde38793a17f00901,d266ac99da0bef86765c8988710ddd3f926c6c5e33d1ad74335fff6f5586c3fd1a95b658aa814f3b470a2be4087c6a908e7d022cfe8fb3ed1c41207a13fa574601,77277a9a5558fadb1395d416723a797e9ef13f810d0eb9e698a3051b8f85d37b1a1fbfefc3f45cf7bdba046096705e6db9193a0e076c448efae97082775d211a00,334c542c05348f95ad3bf6590e10b05c65bdc4b220f9ad9b009c909caf49ebd541699d19788684f769e24cb79ac3eae550cce9c1d19840be3a53d2698e5d6a4500,f1854659ae0d725dfe4d2c3d96d4335d6f51214af4724f061afa527a5cf4fe7c31f31147723cb9619bac09f69e858d2262945f19aaaf78715ee9f4dd2602a49200 +21659c4e2a25a07d384a0877bc3315eb0ca0d04dcbfb6065215ecb5052779761a276d9571006327ce7a3be77f306a218e5f67864197406ebc2de5968c14fa18cd580a0614309c7f99312381f7cc70bb7e91bf1874d5c8e9ba193a762a6bce4caca567d089bfe9f66b034d70fc62a20ab23c9ff2f596cf0e9e1819e4fa84edfedf6360c315058bc1a18b77f982fb38593f249a6360baeb9bd69afd72941134fd0ac51cf742dea3674d028c71879bfa3d9e44b25702c3804e8d9a3abe0a6c73e02592c2d45de60569b76873c0dc77d288b3e6821c72ba0e9,dd69f0a443427fef7766ebfcadf8bbd56c69dfe00090278a2b5271bd2d069636,bc93bd81646a34c3ab430ab7aa7e8e626c415fd6131a58c9ff90591f00e5be0226787231275145ab8ace4488e4e12125cb71d9a4afb08e693e8d83cd04de8c6001,3bdbafa6315c8ecbbcbcf9de66a9fbf59f894c582050e81ca53ce49472a2eb1368d1e84b141e84dae7b9c0fbafc206fcdca7bfe8f264b57a888a95ec17b9124a00,713a4b1787e45096926bf9d721a92fe797220acd92bda5eb5f8a5a0745331a9f6c3319b2fc917d974249e67f4e9cc729b332cda1d2a2cad7b96fe060acf4ac3700,4d7e00361453459b5d6453c315c48dbc2400d1b02799f7c566b1287eb203f3ea742802baa737dd0003ea671f2b655248343dbe48706c2c0854ea97de76f6d6b101,8b17fe718968ee65d750b22e4a84635e805cc73263ef50303f2a301452b5bc9f7e2ba40d79772d254fc9f6127f3706c3f088adf34cb13fc63c9a61323a7fc58a00 +e97e3a3c66c04d5ee63bed2785855c1ba676943fc7ef582edf71acb1a9a2e47334f9fa43a5fc861d6d54159d1aa79d7f595890c97f4c2ce45855fc83223576cd76f45b7ce9bdc2bb4faaf879c4d91257e4ca82c6bb9f8eb34d8345e61de87f83c7b4d7eac29a55c3f1cef5ededefce46997ec504b313be70aa13ee572b1fc745181dfda3d239c84d50d11faee62a1156cefb22754716ab53d9a26a2c466eda96e55097d47b6689a5d0c51ea20916c4d44e970849f677de779b5475325d4148d65379bc287b7a74cf4a1729e5eed896bd2af490ae686a7f,e699321be3d52723a537de81d73561af34e9feac4863e11091c1007382ec723b,0c76d1988e17390162eddeeecb1351725ee63a140539dfb1352b8556c20547a062ee404c03feb7281436e6be9fdc0238166f4e598b7eb0c88eba440c815c15be01,55a5af0b2fa0cf4a82aa05a83b24467235ee80ea7e69536dc15172444a116bf022196db52ec54d12f20f4277f9780ec389af220ac79dffcd19c085b0ac99bc3800,2b10487a7dacba0d7b305d3255ea088abaccd2ce3f7cf5b8ea6840a42b1cc91a3353033db376a9c9cd565cc672b5f56568fcbeb671432af1ad7189c0b433913b01,d60f2d5276d98423f64d9fa28ccf2274fde2fb0cb91c9bfff28857f4d3db49ea73d5c8ab06fa6295b8402247e6355970c005994f18c60dec5c9231eaa1eca9f301,10165d8870d0a5aa612e66b995c29f677ec972f3ebe499e4288d940da4c5dcc07a114c2e64ec44987c6065c779f8e9f3aab688b690166b59fb67ad552436985a00 +a8544f4ba56404ab9f8d464fb6c51a29f72086d4daf1620653907d07c5688f4b5af7ecd8b78384b63cf3c7d2845e1cbe5e7c1c7a65688a167074d6fed6be2353d086cb3aa31d408331fe0a67808abf0161fb0d4ec924931857098f4055c83269751e62841acf30db6c32262a461f3a6794c893fd5edf8958dff737c09f94873bc84afb95d616358afb4023f43f153ac1db37c81d0007d942096e1b50f3fa6ffa807f835369c343c29e82a93a689f54caed4a476774ac7546e35912e2afc1dfdfc68b954046217c8f5b24616c8ee5fefc560ef72e4ca345,4b6c57c96ab8ce7c2551aa4f6ed139d5d51ab84a73593b5d95d92a6c514b5a9f,cd63c19ed4d1f11b10c47f3fde40f0ee470d359edabb18a1fff9b4518ce819ed5e25f5b33f7f90653cab00c5d6962478def816b9e4fe6222fb08d1cd2042bd0b01,467cd34a0753ec588506348e97c18456a77cc99bc04fe7b79c5bb1516100ad4a778fb56deca216d1200d498b356266e77211803307daf4ebfd976952e8d437c001,9aadc8cd7202c0709b1e3ce243961aa9f990dbf1797edf7890aabbfeb0564fcc409476a470bf5f6f7effd288964601d4c8198869ee4b5b5f6f3930787bb3cff000,c8a5e64d59c667941aacdb7340c3e7d4c894af913ecda553e245447b5b3355da06ae4cdcab6201bd8552ce667cf5a9885709d77adae6bc71cd85a18aeecf5ed800,993399895107f431d907305c5e51aa34319610d57a264e4daa73bb651f3a1c5c64f4ecea05ec5578604bc67ea511010a13cc800028d7b5700cb215ee8d226bc901 +aa703499921aeee5db235ae0f79bbc1111cc8c26c6f0e7870c8b0c57d3c39dde0372b713a747106cf978b392b013800213a59572b559c4342275e66e927cddd9933f5b61ff10b3c91c3ef81cd08b0586fc9f2ab2885ccec9d90d5375dcbe433d022d22eb2e035b46744c71c8e94635efe3535d9d13a647cffacb5357fed8c159a31a753f174d41f1d9665558d243adb1d84a83a0fb186123fb38b5685f98d1dddc8768f37411cff80c9b658dc7199a52cd10a0a19634a4112eb1823ed99409feee6f591414a0ee92b37487290a7fc83332a885655259d9,f7e0fbac60e012b1d6194b6291f932a12497c362f3c89fc750010f4487a7b66a,7300aba88c2999cc6cca86f58ef757a711ba689e8e808c3940895df04039e3bc45aa7a547bb0a2a4736d2f16e2ba937c39dedcf7d9283c1c3255ddc417b9f41b00,8dd05bae859fe8c7098241c394f3e5e16a10808e40bbba2f1549eddd742a03ca3b22e36e7ea45281ac8d8e1290ba40a40578279f530ebca2c68d4ab9a13ebd3c00,ab3735a59fc4ad0456b637806a3fd3bd9c51e8edbaa2713075b557aacd7d99f8441d43d34adb9cd31d7bc2f8d375867d978bff52ffef68219b3e590d42fab40a00,801c7aa2d1541895c515fffebd408c7c1973a50d673ca24a74a0fdf05d7c4cb85b6531f4237f9089222e97d4294e06fcc245b43220d65613454469cb7559fd3700,90e3e43ef06aa2297869916b264cc26000551fc588f16049aabc6ebc3af80aec47f50342765b0136741cf61d05246ad2633ec50fce7f5881f4ae011583805ec701 +a81ae2626536b58d09ed0f4b56261e66b6a2c6322371f62cd956135b4b8883f1275df68d8c379b0d5b8d6b58444eb6f26f8878d6d566487b84ae9b53ae62296014ec5807a4eb8bc10f538b42350ec4501a3d1c8954824f205001b8da73d484cf27b9c8c17729b5fa8d13068c27b2d2645799636b48e07a7a402f0e31cb26889d3cafbec05fbc8e33aff077854c8fe8c2e6f636e10d2089b1465da4b44b1a452c94e0ba9b17039a30b487f2f08e407ef4ffa7148435ab1e023a1fe40a5f583c166089772c338599682ea3cac11c872822f805504f051a85,552b1a121f8871d15474c3a849372614f5671ccf13f1f8eef2c683d04f9b0c48,6a9df6847d54cc307761a4280c6734350d5d14f66464b0dc3588de2939db5f9f019016dea1949e06492276e950b9d19d02bde050f832dbdd32065726db404e3400,01c1e0e933b6d45843e90b46bca90d8d959ffbd448eb2d96630dda60868c4f4c170274938728df269cd4a99224fd91e6fac836b2eb25cfb1ca18aa7627dee0ee00,a18b85261bfb0b83ab43ebb37d752d55e78a3d26741d34632a96b7a5fbdad35c6a58fc4c70d3b3fc43147a5a5842257b6f03ef75b7d8ca3836bbbb200408e18b00,12b8d774426bca0a67c8c03d5f3afe72c06c45bb39b576a9b4990775053a28873a1a27962b4ad861bf825a4474c9f67366772c3e3676bda362dbadb46474d71d00,3b1863e9a49ebb6e721131c2c27eacd6294df1b30ad377cc91c32d8eac8da2bc7175246e4d574bfb85bfeac2ccb7df312c87b9ea67aeb38002001d6723ce9eef00 +eb709a290ffa36b5643e5ea2a2846626f6806a85340ad39d08be895cb2e7c0f89475fd50d0c27ff1612243b59951c53892c4c268b18fc79c95edd2f261d73fa0ff595cdcdc88b3c1e7e210b9df1da16c0fdff931f81973d7816cbf6bb5af65d71a80425dd56968765d8ac0d3e912f8ca3f4da44c97a16d6ffd8a84a4234986edfd58b9e020ae94fa399ad98c9db45c1b63addf3c4d820f2bc7604db4113c016bf46edb141912764d0e3716c1e20d0cdf18a119d40d528b8d4726ed9e7674f8ef3a5c322784b6560ee1a81c82a8a1add329bb5609058ebf,ca72a2f35a6c14e97ae95dccbe7d0c61fde17066572e2c3b4ab9e576c0cd28ae,21b8e690429fc4d77b92567911220e51e39641d690cd24551895f7721ab3344c5ad14d88d05ebae39072bb4d4fcca69c9726fbf9cab25e0ef8454df39aa7542f00,4ae3c5b7972fb4b6d17ed61d0fa5c534ad0a622df6319fdc0cd26306bb5b72da0a7eb7721a810d4e72afb520c21e5fdaffdb4bafabf50ffc0db6484fb2a75d4e00,9065c5351fbdd6637f005defe433ddc5184e863b39c9143ccfad7382b3ae3223521ceff297a173f793e86d10d7ee7b65dd6121701e69e429f5b4fbfb93f3a39201,6580d3dd6446beb6555364a3ef5d146de47566e0553787ccef3a235e425ed70a5c3e25701180d7f0dad0ed01a1bc8bc3287c3cf321b0b969cc88f887c2ad025001,aa86cc6ce2e2f43dc967904c07b536df2488b9fb4ea7ff0b97c2f7590b7f0aa7455c44b78f344dd2752a208799404ba1d07a2a315fc2ac270cfb07a5fe9904f100 +1e8ad0aa090d639f7e257163744ded4b2a843627d19f1c66c76ef55a0771fea7b9a4c878b86f5fcee7fdf3711fea62981c0f7556f5ffb7aae8754fe4140f0fab31d9c3a66557e0abbaa2274aed090ddbe4c18adfa74755f50fb9441b07a4d22b6f35889cd01c3fe6956ccf2550cfe1b7b7e9071185d9fcf6352b3279333b65e555a0a71682ac555104f1ab28fb7bc7158691deeb76929e755dcfc74196ad4edaa1106265a21a1e55fe5260794abc7900244378486088ee5ba71a73f2f6442bbb5aad7c1db2f001d8858f2e311d8930074d6afb34a8a656,f5a91acffb87960bb14236814ba1f75daedc887b60e767f4bee25603125f71e0,14e5eeadc83ecae2fb52e8faaf1f646006da2731e5053120eec1576835207ab22f631b23bc4817b50d86d0fd42ef2f468c816885b92138b1ac886f0cd7a0b55601,925286ad6770b2ff51fe4b7ba771bfb652d61baf2a67c649bdf1346fb28a35af12e03689599315a52c0a594a4454abf786557a00cb6fc6f5ea9108bebfd857fb01,90c411ec32355c8391d5269d2f726db347dbcdc35d55f17ee8d6b245b4f55bff59b980ad4279c1778c35e9e5f115e2ba3525e88af60d631d93c9c9e7fee87fc300,793915310a8d88583f805cbc304352dca4bc76a379e6bba5f86bb8c9ccc9867e6abf220cb4d382bd4acc742c201e6bae04436610b68d9a02171852e3dd2aebe500,f7fe8c7bfebaa67b630f730a5a281e6bd7bf71babd58507d721fd7bf9a157e977613cda9795f64ae5a7aaacd421230bb43b6157b292fe17eecd553d21c6a62f000 +49845cb652e7252b7d6a91d86f742b6fb447344f6cc263da48b4039dd41060e58d1cb41cfb0a1811585a41e2d6969fcd6722cfd86ba1ced2ac9a45af20f81a54f853dfd96751ae0fe3c21896fc3bff1703f62c2ae9a34f192de94b3c8fa604f499fd899cbe394e440cfd075b0efb98ab909f460de4cfeeb23f9cfa811fb331b1a5fc45f5e0f08cd9dd4817cbf9917465d5b8ce9fb838101b230e118f0c53dbfefb4fcd44ba372caf43e5567964d7e2f30d07ca987b1e293ca0ffe5b0ff83bc3ec6ae8c9441c6f53f89da2cab5df2a33c7825c35f20b545,346870f1e948845662aacb28ed9120e4f3eaef5d9222855ae1dfc9d91f20c9bc,d8cf535709f2084a7d9b8ea4339d6b69e92dd9ffba405ef9d5e5aaf296ae84567d1450176c4e67340aa144a26590ecc0db50e803ffba32541f9dcaf5fbd91a9a01,95235c21907a4ed75c87085c91fd5ed6d8d665f1bc17b2b664794b488f94c7966cf3c8fdb2128e8fb2dc0cb5b1a1d0b2c4742854b12eaccc5c9b9e03f7714a4c01,58623a81639f71dfaafc6559ab874ff6bf9a170851f772f24bee2bb8669a1116620a8e204cc3e986ec29df6c5516db95fd53bc2739f63299d302fb73e4d22e2a01,948d9bc9003b33d3e86440bbeb84b8f88bad3b1461818c07e0ae3d5a41f4a0fc7d3f231f7053a86c40fcd1c3b72070e29d0494b4ab4d604a679c1731a9c3848b00,80dcbf44fcf5da42c77263045c7c70f7c04a4ff50049d87d9efc7a85330187e27143ba3e77f53f1e870a55294f77777b2bbb8086c01c4840bc7de0e13f549b8700 +2a939b12bc8823415c76c8ba67a47fd5f1fd63c6286ab1c783a9df3e2bc2a52356cf4bfd23f20462f8fc9f0f6a0b7257b08f1c1ae5e7fecc159f40d308be5553f04cdeb49c4db592df5a7eccc03d3ca9974d8ad91bfff044d4ace7c22cd6475e1a733633bcd466de1440bc3c31c30c25d81aef2ddbba1d9a1d0cb39180cf7bfde235cc5ae61842982ba40f006d828168c9d943320bdd81f2255702ee0b5f7e0159f8e31cd2e83517c4aad7115cab16ea4baf9373ca2d4e0104ecae3e8d80811c720aff46b4e1719dd0cf2a3aa8d14d3313dde9950cb596f0,804186f000789a27468043ca60bffb88f31c4e4c240d80501e4e9a43018823d3,f45538051c44aefe6d73ef3c4a9798f7cb2e4f2e41bfa6119a76725e0c9ea9812c8724840504d2e8dd1750ceed4e6f4790e3adbabdc57885e9509517125f477000,9aefa1ef607db4747e0e2321f6d40418c47029f5366c02308c485f3784076086265ba34b754058eab2e2d9a1291ea9c50ea3688057807d377631afa902d8c47601,18a3f8bb696ac3f1927356be906d84346bc38b98d86e98d3052437687630a0f915e4646db0a512de02505bdebb1d399fcc3388c4fafd84260da5eb16a527712f00,3fa9b12eb3f24a0504d7f602692b157f343248167d9e09a7f7e14938776aa68316c7f0a8841aad813101718a2810e4a699ac261b34014c8440d3e56222e9814700,cb4fbd322f385820515bea79a224ff87b1729ffde0450d95e066cc8748391ab54dd5832abd5e670672ead196f35f6b36e8e5fcddb71c0bc73720ee76df5380b200 +cfb040591cbbbace0dfa35710e474c25c315fa34688a54b820be4234b78f5d77200043e3fa187cc99c2e1ad7ae463e7570cb1704436928a57415e59415c259741a81c8195ece2b6b46610f4314e67479da14faebe824655729b789ca73eb9b2a99dc97147ef8cb9c0d6fc772a946acb102b6f3f7ce6892ff442d42de4e4f5b15e0308b81013188c294f323ee6db09a5438f61bb4babcebef1b7e07a62d6087f7ff37076d86e4ae7d311c880f7261465df13dc0cdd05fdb1ac04bdf2ff18eb69f00c83edc9d44be8f4920d4c4432d317b8b640235a3b661c7,8084e0512f13ffeebad6e4f9b93f0b1166b9e2e01616da75874d61ab6dda95bf,f3bf1c6be428963eb83aa13fea4eaa8d4f750d713b20eeb1456e7dd4ecd13e8f7728e165ada0d3922f080a5caef7d1094627fd8828192e74359e73cc8c8cb7b000,e93ba9c0597bf29446241825eba15f6bc289f87dcf53d29a7dd8d9e2dfa916c8425707ad78a790549f891c208c47da6f6b1d13c43581075835ba584b49740d9a01,636f29542bed48c5b1e343f71477b26001b26ce2c52eaea10bedc3118664bc7c258442ff702b0a0ad8ada0ec2572f7be06d6a414dc26c3f915b5566b3a40feee01,9b65748b3a4a3f9b5f2269dac60e405ff6b17692782c52915f8949d5bfbb2d00329e1270e93502ddbdeba22077292aabd30a79a822bfb8b381d8020044ce7f5201,b5898e15f30e149fd43ea69faa1578fdb1807d051d04516f0c6ca289e71b7c0468115241dc20f78a6d0560ad81b585a0a03dce6e643ad3f31248eba95fe1f8c201 +93b3d6de8e1653430598cf72959506247bb763b99f87a771b2e25eb8ee5f8fbba3f5d78ccc5c799bd5a5e0238507e716825c8344b1aa07941e64c1a8dea589e1b18233eec5398c0f23181b1d82f28aa95c06b0506f8d24c3bd4ce90c3b76f98f6a7cc7d8dc18c6fbd9daf56f9bb1285d68fafbbd3b48bb45a11b61db63fb2246bae9ddea54d37ead949ca595be956aaa286f1d9929dd5f3f04d2456de2718ae6d414a0b5ddde339e6a4ac5bc590fdd55e45df1228408bdf3a532fd3a77c190b05152dab30f6173c2e4b542cbf25aee30115e725a181c1b5e,9144e514dc0a61d4f5dcd6cd909da54a4811c4bea66ec553a75a34df9a4b1d46,5ee934862eb3f1dab38cb34ad27fa4fe042aca7d937887c75c27f115df821a73335c36276647501ffe526b402a265ba1b550d8138837cffd8f47e4e2d743227a01,b8cc665b2aafc2ac66820c13b075dac904edb4741afe0411e9c3a3deacf2c3585876a502c409de99af1871aa44cfc6939a31e06ae9ca1c960ee1d8a111e1754001,65c33b52ac94c0df89101ca0b25b12151a29ab77be3ddedc6c5c17c4b676cdad306062b9caae5431933f22a32424934450dbeef0072d84e09e3d3513788ba84e00,4e7321870b48a6339ef29753e3d12c88ab2213977e9c13eca1c388489b679347193048236796ad117a41d31547799a2c8a194a198705ba5fec1329a3be60266000,5ae68d6a379308ad9e576ae3201400fd5f2687e143192e8c87fe0c127a1504bc1cb5919e4055fb2d5d0a37954b70b6a54a9e1575ec29cc9d60c55e48482a0c9301 +adcca8d22abad717392490e8c955a59ccdea47e2580c5352605c75c8e8ed9d5968f61a3893600c836e2a536736e078e842170aee22c17e6faae210c9a0fa37a95760f0303bd24e2f7f0c4d04af7e55aadae0551983da2f6503a893bff228026d0c7195cca1dca5ef7fd3bb1900f4619659b7f30b0ceba11b0daa70f94f65904242f5ca3c82ca2fa78b1f1d5beed118646be7049b69db3f1b9812d6d60edb01c8c4394985902d7d41d068767413334653ed3111abf956fd904e05a8032d2b2b204dea9b7cfe13801e45384e8871e1af71856e3834ce602958,f6b5192d66765c94f9d92664c4ec4fe63d3252e39745b73af9c92f1e5ed40faa,ef13d8998d06e9c9e01835fa6ff4f30b36559f2c97a91373880e67c49f1ec5c70ff912238c75c0d3168d8a36815fdcd478a81000d950c22a2ffc476ef7e678ec00,b11add38868baf452ceb2796a0bdbe8539989644d7fc99d9bf1a3e36fbaacc2f137286eac037a9205f50e9f90bf6fdd10509fac5c9c5e6fac75412eb744bc9b701,ffc9d20715820de1cc19a37f20aa8c143ff441c0d8c183336c15b2b0912bfc4b7ed38ff6acc027181fec01f3ff10d596fe7a88689e77a217a740724e2a545d5501,6769b231e61d92e7462b5c408356c2aa0c06c6c41925c261f8022385b35a4bbe586e120dcc3813d2017dcbf24659720b5c325801ee34556d60dc99bce9f878f801,36bf560a3ddc0aa4db440a9c89afdec80d46570ffd2d6b55321e632005fdd1cf1c1c06947ea843bd302aa803a8461c2142233478a979a629fb0d8d4570ed305000 +255ab3272abd808d78f0b3a1ac03c64fd5af34e787e3fbead013b170b2567ed82d75d17fd84129a209a265bd49a7e6b5ecd18348c96a4db2a70ba8bd32e2ab9b7b0589faa2be8e39378e7c078d6255bbbf7fd1ed549eeecca5c3798770ff75579587ab54f9d84d1add9c62608a07a2e3bcf5d7181c5da55c0eadb44429b47927164890aec6b5a1fb6e73cbf444c1e50269ebede3e384f96e5f17f90ae89746525cde627d8e28ab2341f7dc8bcb0321d46db0f58ea51647e6199e3a0734e52eac121aabcc731f1e1bd58c3445a2c1af3f34335ea1deb53907,7aa34dbb3105108b7f6d39840eadca2a2737fcd4274bde654b1710794523b66e,ae3a8fb9703a279d2f4cffafd95f53d1a3c4deeb532872e8602d5de91a3e79b90a895730ebb4b4b9629f3198594c58162ab37e1fcbdc8908d0b5fc7af42fbcda00,1fd81df803a92dc8eab238be81c554c6c9aeaef4a235e9c06a383a58b95275145abb9ca51673b559d0d4f27553e9afaf2858e0cf18e22f6479dcd30b8db04f9701,6e550b7c2fe6e548eba59ccc9768182617b02e9d928e463b1aff774bfd8c78b04ef822bcd280b1400ffdf1e4fd0308de472a953d44f91d89d70c20fca3c94dc301,7dca98e43f5c7bf5aa54f2bd6729995ead62643538dfc5a65a0bdd2fc337c4f34d92a43e328b0656170cbfa0cb4b2c9be0025756fb007eba9b3392ec0c0e948901,978f0c2020bae54414b0452b48572353ac4be4d593df8260e6f8046afc2558c77c7f967289d86960101355ce220ccbe4558dd94337edb4b5d49edad990c8d6c801 +8d8d1bec20ddf7a64b62ab2aa56448bc742c9d1e140023ede57ca3600290dac307f372beb5ff5a292dff511ec945995202bd813550f9c960412098e3639a034988c32bf3e8cdbec0b03eb2a41a24fa92c0bc6ffe0fcd6d6de6fe3dbbbe8f6a1dfa2c765728e251f8d1b8ccecebcdd46bd43249b8f291091d4bc6c883f49de225e38ff5e5c218ffc170da71e18c901cb0553de2211897c3bf8b5d08d27fa9ec30436392a0ace91fce3468d07525fc730d0666bcb79f2dab1ed5a1f2b859726bcb022b02f40ac0dc3337e89f77615d6731348c174e08028491,09455e4ba69813de3206fddaf6f2f58b82bd56d770a99184b31a0a24a403c2b2,72c7d34b83a7b13237406d56a39335073cc03ce0a52a887bb13bb5d23da48be93e50f932af0d4b57f99db22d0b91135c81870d7c34c4200bc235142685655ea701,7940d811960915b5274e5b9921a2b66d2beb20ee4a158431894bd8309ef2c38f28c1e073a3846519510dbde84039b56f90bae7554f6c8f5aa02f7470eb8e217a01,7bdfba3b236547a93524820a667448dfcdba9b8655d7b62d159e357df5e497741b69ceeec8c9f012b1afb9f3d7f870537d50d74188ef5662e3761538c49f6ce900,772e57415b23b2e7ba6d5a6d59705df3d498f367063b91dd5468ed19e72920a150c36e0723549ea5cf004b1743437150dc647db41a15d3046e9468757b8a73e100,606ae57e2815d14dec9814c995c045d4921e8cf96464fc770513b2539e3aa5ee102ca40c96106d8400400a392841d6cbe6898d41fdffdc81866e75c7f8e386c901 +f4555c70a14ea473a67efbcaadc6885d5fe4c2c48a72fe3098b805f4ad9466cc521f317a58994a8e11227ab0a5ade49ed437951f7362594519bf84267e40696154c91b737c937900cf787eb3ca50d5f73d4883ad3f850ceedd03cf857fb7b7562fb5f1fcdad8b5c13901f86c53413e9d5014a47183df6b3249087ecf404060b17443e0b40998166f14eb5f1a33b30c294c071b24e4e9cb8e351ba88044685339fddca674f34e561c4de2c39e794d49cce430f2116b4d008e90e5c413c20efe79e21a9f7e1e2e17f093d4613d79df990f76e236a55b01f597,bf376e9778a68a7133bedbe0743584e228581cc182ae4d1347b942cd41d2ca34,ec15d1d14dc855a86521bbd6961bcb37367402b774f936831ab9798619c6723512d89872efdec129931304d62979b7936c3016b4f343443a1eb2c31856ab45e900,4d8ea54a2a6b23d3c978cd2e05712f1deeceb57ae2e39315aae9bd4efb2ed1a32a5510078ebaac148d9b89cb1795af1e909feebb76230f4bc19cdcf933dc1ebc01,38c60a567ae448b35609b02d0b5ce488519add6907d40d6b1007fbd1ffdeb3ff2f534ed084ce0be44e4adc6e487aa6c27f1a1e8ef1e84f015a2fb20d52c9dadd01,724bae00c77226b07c34b240432e7d7ef6fe7ed36bdba7d1ea2eef8cf5911de025451592f0eacd24b677e8fcb4af43c89927afd34070f4471fb9c9f6831a735c01,c7c01281c5cec9e81e12a6dfa3b2ce8be6f9a8ea2bd766f800a2190dafb722f076f685471a85da564d2707f1c0cf741aa72de96b99feda0f06a71d6189a6665800 +03b5559209b13635eb06c96ba747a291322e33f99125453d65802727e6356d0744aec2eb6456d894cdc144720b0bceb5a19965c328798e0e76ab494ce7b4ea6a3a04dda929a0a5a47a994325ac1255176673fd2bab900850c0ac304fd66a88c9ac26ec2b491e897ac59f379646527504b022f9e99e39821c384e056c1571758bfcc8ce5891c8139ea4c32594e551b7606f94b53567a3aacd54785b45b698c39fa395bad9c1e912f771f3392633b62af5a0c1c891178329dce7f72bc18b0c684ad4553f01093d6319808dd05f94bd6fa86626d6ef809a1c75,392b10a031bf7dc19e88207c2ee3df3109d9f7b9c529f3827e95ccf55bdbad4c,453a91df35b1c9a38145254c522b3d4548de4b2384d93ed89b4939c4e0ea09f2143d03879d8618942c4e223b5cd23ff49c9c07aa03bd2ced2c64e6942569874c00,9192384c09171e5ad9c68b94653ab51a87c4b0dc93ba0b9161c468c57e902f306d8fdd711a996480946f37e0254f301ebfb2d628f3e71511cb846ce9f71500c701,9f1dfe6ab4cc2374853ca6863cd6ea610150fd1343de9cc21074067d84448cf74944cd542e2e30d2c90898784b0fe544ad93afd58046172f2bd2deac2cd781a201,33ab406aa1f74c1b497f452b28a3f0cda7bbf4e07463986391d078cccb9dfdd80bb367ff184ac3764936063520ebdbe5abae902b5a108ebcbcc7042a2ed65eb101,e8324d59b6b8845adbec6fd92a1ccb89a62f83098cd91c72dc3c13e481961f4d4598ece75b237d556e701c779f7d43002b5c30c9f4503983e311fc2ab428fe2e00 +a24ca055dc79c80c4f00ef2193b672cdd059c1325128195964754e7c707af4f127cc0294d8149543469d43689aefd7fe4d48b6742668630c1e45d9289172e2eef6ade5d45c6610b0ce661907d6b17584ac7b1e871aede7618a8e07268aaa2a92820daabd5e3ac318c7a5108dcbff78aa7bf538e6a2194174ce865b3de923a7e4500deadedfd5c9d321c4c0e89f8a22fbd3361f4864589a6529b35b8bc74479ae9076feef2998881b1de44bac1fb6d906f0c586dc94f923cdfe199c8eb76b116036bc44d820333a3ef74bc9e05766169d12cb5fd347303293,6f5971f54ec905f77da7f216e0c9b3bb1cf450979c9e1f2d8fb4df972accce91,db842ad20bc2c7adf4380744f5bbe3512359e9fa2ff98e6104232cbf97c36df24ae9aea818f19640d15a31781455b57e38884aeafb3a2a05003506019a8b5d6700,4e6c3fd80d5c77990383bcdf1e10753fee68fb7f40c3d2e06f1d6d1636e847b4063302ea244c2416a88517c97fdb5c7ab5b347c75fa2528aa1cc1d3cf7c1f20b01,68022955067a9089f5ba7f9e249fafedfd023692c52eecd8f7022a4364684c782e4c5396c77e2b9a919d3d7acd7891642bce7598055206e4b6445f7cc8c8cf3f00,3a53ac83e6bb5bce950a165c1ba81d18a61754ae3f34379b3aee853a610e8d2f7b10e80eb2aa07d2e67a369339fff36760e804c146f36534bc835c763838732700,58cee6a04ebf01d816f3abcbfbf30d3d5d35fb22521c5e53a4de0ff5faf8d3752517050a647f6893732a62f1c0a6968f7daed18ac01bcee1e743d115f2b0818700 +aa6216cee8731ffa78c30db9ce8faf20d8848cfc4a85f2280708b7240ba5bd18d0e167c1f1516d440070cde8f29d27d0520df1fde7659560be67247d650c37e3cb62b8174172b8a2de1a5c51c2db4bbd65c2b1c41cd6927c1798991761a89598e8fad43b257a2d5bbe54b774e8f86d4cf219f74ab01a933ced84b25bc0018d79aa062f93ca474e37cbe48ddb998118c40d07fbfc44bb94f399eaf2bf35054c1c63f1ccd335a6c8f23ebe3c60603a5b3538df8530a82a423e3abe32b337f1fd90114cb36ec2091af46383d7eb97675ead1b32e4b9644fdd33,64b42c0866fbd51dfc200342f9df006f822d733e3fe555567acaac3cc69dd7d2,52ac94584f6d4ebf951d7dcc5f90ad974fff4fabf4704cd3146ce15fa1c2658c117089e249d82409c2112600850e55e2796ff90306f154716bf1705bcd21bad900,603929aa8c5e0cde6b646afbd85c436f0d9407de798f4061fc9fc5f417a3c7170d65d09c253ce57505ce24aa19ec69b95a343cedf4c800e8cc8d419fdb532df000,1acb875a682843399eb9255e44a86d2b2c0fc5b9d39a2c60d73c8fbc598b3540527976f5cbe0ad3417ce089d121dbf98aa91896e1a84b02a86ea238d4648701101,8cc1af30e853f0bd1d90b2cfdafe14582eec47a4b9543b60270a164bb58f33eb5149f64af133c4718ef4d7428e2793b2852a6cb00eaf3a1e83fa09892092a17701,6af3238afe66a52b4d045e1814838b9e927296d047c575ec7cd056984dd9c1755b4665d73b381a31f4259697666cd934db1cd629406fb57bb79413ec51d1b17301 +7cb6c794a80dc5c5f66753ae717a9e15dff6a25896e6b9a9e14ccf1793b19fa9a309a503ef98b28ea40846e02f854eec87c012b92a9577d85dbbec67a452027b9aa8065c84e3079a5f728748f067c98795e6928a5b746fd5de37c4f50a35e3915ab013847130ac176b45e939f438de998417999c0b5b2f12cb6eb551889ba1b17f0798b9a2dc205508a564e63855340baea8be700e3a7c62cce74a22989b09d0253456dbcb4bd4778ca8452ec34a23fa91e24a69d4e3dc32a79f7b469237f1fc01e2036ca9ccfd44d00325b50b33f6a3a23b8d0589fdedc0b4,cf45ff644d09bf4c9d4e35cd1280db28f6b64da5cbdcd2ab40b4c29989801923,0f9a0581e3b3a05df11a629c0b77661521e447ab3e38503a7991498c12919e237c3cbe0e0609654e45c828259724c746de7e67845c8fc871e95fe179fdc3985e01,08aa5fa91d9994ae8e617a5827bcfe4f3cac854c123ea691c57bef79597740f7693db8d037f5d2ca644f663a00e7756db2aa04d8baeb45bb2d4bb8a0e487d12e01,ad9332f461325440760e5e23b6402c1d2df5f19c3ba0153d0c225a3236e5516f542e48bf5ff46aa49c444553499b61cbfc6f06f1086ab1f66fa15f1e7685c5f200,dd2caf9618b7bba67efc76e3cdc083c10fae04c734dafa58cb4b3ea0519fb4cc698a9175c0485d5ce2a9ab7f5ae896efd7c20f88bf3c58356e8b1f2f2e1a926201,560493453b11a8af9c69cd661aea2f91189ae0b04becde6d17d273410cb65dd67fb215efd7c40eaa069a2a9527e4f7ed9aec5fcc1a18f5b66c0bd5825d2e8b4901 +53b282f4a6722d464eafb8a3c06ca0efd48b19a4e194ca75abb985ee4115e0ccdec2d4e69f6de2de01a2cf7f5cba520a0a2def02088b09d5c48b0abfa58c5ed764abf34d34899e3a0980edc6f51d01d8065d0908cb1967c34c5b86ee47d9c2a0193f10882e23b31b84a766ca18ae2fb9a08aecfb81dcb870da13d65e12519709f562a9fff894cc2a5f8001781a53109de62fc221667daf879e6e1a5939201bc21e1b883b6f5b9181733adb7adb90886a04e799c1a14c6925f30157ddf8d314943b3cb06bfcc1e1230cc37a98b65f695628703c628542b9d82a,3c54a5624498a89f91cd6d8fdac78b9d800ffba8f064f743fc2cf7509a3acce1,24239387fb1693ee8b243d581dff50f9c3ccca0339257d83353f261bb8e57c5b1f388b34a00ed169b7c8cee09d36fa2a751e62d31a1d3023bbeb6993290cb84201,9d0fc8ea83a61910318afba2986ae3712b5f922c6046885b75968758e788b7445b654fa55212e6d26e977ff597c969fe9bd514efcf1015e31934a8044afcba9001,732aeee01a0dfa3c6b6fbf19e7171696b3408a16bb3ff7c0980d1c1c6df524a72b16a67988fe4bc888d46f583fae6388d6653b4a2910b20f44b97eefcc17a80801,bf506a5c62ce8fab387cbbb148f2af5eb735909afd26076cb881aa0e7c2d61197086c9d8da2ee8a69897272619d370108f7a8b9319e0f873b28b04890e41c4bf01,a4f48bf3502f077e97975d43b47b4e436e5d3ad1e3ea00a4371e01a8054a2f60752dd62948b1aeaa9c3848efe13637adfc802ca2125a4d8f297fb9b3afbd270900 +3f50288840fa27558e9fd6a7c2e4fe20c58e7b73f0769816da4537b76da74f405a24886a7becdbf045328064aff84c9b4a2c3fcda042010e6339d7be1c941a4ae86279bd06c60872210d27dc809792ced1e3dcc8517aef1ec3866bcef5175d6c2dc48b3e228b8fb774c864d73740df1bdffbc355082691886570520b5a1db20ab31b036ae4a5a942a4d719a6958c05994015edef7adf43266afc91e82c5a1763808bea01c16c65c84e05123ede48176cb08d53794ea1c6bfe0616a2d741f0c30933815d46c3fbd9904eaeca6c02f8813605946612a3700e177,e5ea0e3593e89b1d84d8510fab028086679d1938a125bb96d76907369f440711,42885d9fd14cc228c4086789fd0eee87a6df4ea43c32384bb80e32fa760069444f828f4c8a0f58af41ad5efaf13b5149e49a7aa82c22451273946bdc5023da1d00,1dbcad24f38b33cc3eb2a27b9e161985aea0504d2d1fbe5f161d491b13c9488a2c8b94db44547f33efed9480782c48862f04fd813f951c153e053cce7db14dc400,9e0b164af8e114f98db0adec0f8e337fe06c3aed74fb9c30b3a399b6bde5a3c01a3b7cad5976d6c4fcdff4de139b1030269c06386f87e8d6ca3b22860d4048f400,caba3e6cffca25afb8b09da111c9d64bdb351355bedb9bbfba09dc20d69a634d3c2ffcf63078b57ff4ee05dfce495afd3322babb4f08c3bea1c1a47590b6891500,86d28719fe9d64539999a6f22fb999443aa10d13e77fff5e7d66cf7a2a84c36f2488c280eaa95ea39688058838d11c8182128be917e6e8911392c5a80f23ad2b00 +42282a195e9cfa439f61073b4e2133807dd226834feedc5fdebbd85f811361b9317ca4cedc334a6cd87d548c87a558d33c68d5b65be5405d883bcfc726cd633c2bf428a02ba6b5786937df27d040807a63412b0719a045b8314724f3ebab06d52b4432cdff80c64e34d6d4a8c29416fffd22c916b17080439899cac4f0ccc9949d523997b4cc339663333a5c229a038d8e25bea990661678e504b2efc4b47a623fb392358e4ed6716d2926a0966aab5c34fd3baec06432b2304bfb47860cc630bc5ac8b97984906d0a3c5c5efa5f1be14f67a0f04f3eb13a5b,7775e69da4a3f05c273c0dbb2477bb931e00bb7f2d9a721ae0cee871981ead87,17f87234879051bb8a29edbaba04d6a52aaea7f342040d2fae22b361eb3a9ee873b3427531afc9dd56f4a4f705ff1f680c86fc129929503bd74c05e4ad8f8fdd00,e885a81196732886653204672354f85c2e4d4e1b2bd1e8e877db9786cbdaa9bf3fe2c62cc43a7707151561a852f02cb298213cabec64cf6b297c767c27e7037600,260437a9fb71da297bb1af101430a9d9701ceb944b2906429a74b67c94a082304be7a794f2e49df981e00402f81c15e96f61cc02b39c70a9f0a8819ef5d8175b01,4d678a2a18f98a3fe689f98f5f742b44d3eba5d84374ba07fcc20fce9a8349415b007dfacdc39a1f69a5b1704ce5cf87a269256b7f1863863171a3fb6e863f2e01,f88acf90b73286e33f058e38ca8dae9fd8a1f89c4267c1aa80b98fc53109a1a1265a6058677e9ad66e9e1da251e031dd93fc6579d2bff85aea6e7b5db9b1271800 +db2fe08d0ac8f7049b699bfa128d0767a900783f98f693a5a8f83b34025b1bbf4e57bba34e2b930ea9b739bff857959f617f8ebf7777a40c2027345cda9834c669b86fe9f8740006326674496d8a74c4cf84013ebcc8eb1167349a779689e6f5228cd8277c2693c85254b416a7df59dcc1093c5e3020647f8305d483173f7fab41d5f55f0fc29846d2610d8502e159631d46f4eff15cf4ab824a9a885fc02f104e0f1889ef407d3bbb661b50c6345adff0b4e552e10834e72c3d252543e3c778c64828e23a8dcbb2c9f4fd1b03a1cc0a169e63f603412494a1,5fc7b162f82e53fff510923323a817a7101d8f7b3e01a5b56fc7693696455e75,67d90c5b9a39460870fd29961d6fb82f7d4f4f463b116985c92352245f3fecf12b116aa7a4701f97c3a1adf74f4a48c12d59c032629dc37342514090d25362f600,8b01d115bab6d01d97e41a969a89cd56586a87003d7a0017b73010a3fe052f28150b2a5ac2bc3c5f3d5d047b52e7f19aec02a9b0ebc9e97dfef50441a37fad6f01,f3badd64c4b6221b78f798311f7c1d6647550b2bbd289d850049d952de1f2efd641e03def5028d61a65e884c21ac831a3e5d6b3ee12556147d5a814020353bea00,1306a02b89b4284dfa52f17b60f4e64b25c4645b9a6a703c3b801b5f82f825552f6b2e97e3dce36e427a9e059628257f4984af48234724401144421780119f0201,5feb82baafb8b50ff7b03191e1510ef005c9c6b09098b5d7169235c7c4fb53a33a6c7eabaee6f1d36886646ed46c535154405003df6ec22804ada491784bd5e901 +6f511c7eb1b15bf3f3c952a283cbb8193d76e5be7be0346568601f1f9f126892671684a488b96848e92068fd3c1bc445a1dfc3d1df88df59b20fe4392505a851faee4057fe27d3944a51f97ea396ea29ce5105ba33cae63e082dc1524d3cd047a39054fe73f86abe77ebcb094be72a1bed92d935081c97f8c5aa563078f9428e3dac58137f8e19ede3dd2d88460428e0c825076f3fe567038deb680762d0a512e3bfe6de085137cf66448a6b30545037d94351a2fbbf548528e7206645128a6811ac4ffb38d2da5583a447cd2b81e18455eebde5068b3e0c60,6459906619f5b33b9e3ae7180a88e5ede5355c1c7cc5480e1740d6f56af79cdc,76196f9a55d68fe69eab7d2055497a7b41fb1750291ae03099acd4007d23303820dafbac44e38d760716b416d24d19651e5d571d50573d6514cfcb21da95af8401,a2cc665d850f3f59fc5cc7daf645babe653319ef777bad1f113c169942778b1e3bdcec9fee72995361b3ced0097a7177daae62fb7e1828ab10853e99c8f4a66800,370c1efb51f2fe1111d2190a92f61e74e7cc593bf696bd72e81bc1f1b4d034e72d15a7cdb0650f3272c13561f447794ff63ba5f96d64e5f17d12d0a7943d0be800,db866dec2b6c99614d9ea2656910f2aadfa36cb611c3bd86862634f029e3f6435287d02daab5e89e29271a0ce08d9cdb897516347a7a767277223ed5359fd6b700,1741937efa0aba36922961ecaf739633fc53a348bcfb1ce327f124d6ee55134400049c2ac7b39ae858972b541a0a51e92e242721c9f117634f42dec4555e398001 +dae883c25b9ce744d9349ff8e5770bf6f372cbe15c1e1e2f81549a387aa86545bee5d4bd9b52298b890061aa41c1f1bf6daa1e5f1b5bdc9ad7868c4958f09194e77047646bc0c7fdf9747cda1bc4c75cecb6732c400f6430b94a209bdc868b137c40ad0a89073959eab7126d5201c64fc6de22be6fe01bb47c5d9b5f945e8b3683836e05b82d6e05adbf3e2460ce3156247abadfce93c07eab507ac4ecf2fb5ef966575c5b567d656243cc90c76b7acb18614f94f59c04222f6b7319455337b8ed5b3766387dedeeb00fa562915016cbe41e434d4971d40452,caa28cf0c06f8888a29ff0b6ffb2d9eefd0c53d74faa6174632a47843b67c87f,c4766d8bcfde2d53fa79356594f243f8ddadca67859eda374070012046a2b124461b9d467bb68b434412c6f3f4094b57bf6dbb039e55eb49d82873e926ecee5701,0f4f0690cdd4641eafb145e7ccb9f875bf94d70f03f3cf7a85dd5b883348e6ad6dbf507b5d1bcaf67f95aa37c989e16d362444e162a9b5a6514def5f8ec8c14600,9b51f94b62a07435953b2efebf486789e8662a0dc9e306c0623497ff6d5a0a592342b7adffbec9eadfecc1c87c1bc39df2f56f7dfda3359ead6c0c7b081d4cf900,71d7d794311d5994ddaf4ffec22a6c0a0521499eb827d83b5600632f135689c249f03ee99d860636b044d5a35ba133159faa5322654b41e7723e697e878341fc01,186a30d84a7121e53d255b778f23e2cb9d6acd02d864b1bc61c20b3f4e7f24422069878581c409c13185c750c29b685f76823311ae239a9f39d1554de5cd8b6f01 +20a61bf464a2047bf5b7f8d3413ce16f6f531ade416bd6b6618a5a0facb711aa5539102cb4893b480e4d3a092f9625d315c194b8cbb938f17d32748fe655d1bc15a4a33e0f7a579b5c4a5ed92442cd6ab0f91b6011dde921ec4a169ce047b4960183b197567af6d6cd31702bf312340b7fc21812eb8824af2b5517a1917a25056aa091cce73a966e0044cd0929f6f19fe1856d44ec7e5a5e62242c19045ed60290131dfe96bb7c9c864efa0c778d64416e41660295d85a6da3688d4103c438f29606da843cc04ae5f32cf16cf0b00ea15e1097b27708d7f2c5,92ba5beae0db6cff7a471bc8cd0186b8e535159557c449c640f655f3c1f2017a,f31d1204d73a73eded4392b2d753f8863e99e62c2360fe9b1dc4ad6ded4fc1a4700c44fe86047bd56127c03151ced0f9bdca95d49f34e25aaffcc5b17a52318800,7c08c4215ed8a63b48c3f8fc192b454a0b252f4115e4d5f9a5a9c435d5f193eb3c09c99e84ad273651e0fc1782789b00416c8a9bd12aa2b68640a3ba64d3b7dd00,e4e8f2f5ca825b4db6233cd9d7c26fcb400743db3c0aaea2bc1f4c1c1c774d9b03fc79076f52d1cc8bccf6b0d4ea7a5ca20ea8bce7853dc8e37d98a26b5d8d3001,b30fc3ce6b19fd8967d7371c0d0c037a453af0b4193441c09829f71767f052ba63fca33095551b1cec71807f5dc25049237071884ab5f42ad9d966a0a9d4b6fb01,027e17739624595d80112d4250429ba6d81e084b5d8118576afb7e19140d9fe07edccc7e7ea1a00a820737eeb1f15a5d695ed6f3659a0b382df7bd2f202f93a300 +c7c8b4b93a228df4cc35cf63ebd0c25411b6db3a4b3672db7761fd26d85c98b2f98ecd5b585a3a0377b18c6b227f75b45f85fa9fcf3e214e499113f3fbe55eb39311f1202aec5091130c13748aa136efce3133579cc3213343956cc2c5173e98312a282f9dcf33159cb3aa85eb87b4bc46b85f89a68643519795ce6edd5776607e4b62362062013b1d4677a1bc4e5c06f7a9b9563cc0fb6d036d7beffe9d2e50779a5e82a32f63dde7e8af1bcca016ed65eefa4e8b54787ee33d64876548024d3e6cb0ef61091d718aa8b7af078c124ee355851368920a7943,38874fb211929973e985290c1b83208e466ffbb70b1778c2c8c232e387b0418a,54112e0381c31f087f2947b8f34127679523b0292bc8529ee83e3baca761ea2609ddb676508b8960b94de85b8503250afd4c806e10da0504a1a61147593d29e900,a24731e907b8d69000a3998faa16b1d85d09847f766b0b13f95eb6b780a13b893f97e85ba936173d8c3517f61ba9c210ad27189a3584dfa62b3af4ba7a6d737501,23c758cd745a71ec2d34c4e510cb1777d502a8ccb40a5748975d8b75815c619e180265fbc40d1e10d52ac0b34732687254ef014eb41a3d106ecb87fa513ea34500,27595e908749d58a8635d8278b8d9c6fb9b018901e293a9518d0774f55d6f1017c38d9970b758a57081fa01748747e749e6d2f44ec6b7afa1b27a1a1c7a1279000,e70c4d26b95f9203f68d4cdbafa57353660a3af17de76f61d78724983f26659332b8132c97c0ac5b83dcc7c6c6e8dfd03bc929ce669355f3feee671fb2e2f08b00 +b3dac20f7dff4bf3e9f6c44f2841ce40ea112a474019bb748974cc90084c6198744261b955f5b922de02d62b300c8ff7230a4c271f16e2cb24c47d52658baf31be1bc13b7d243f882df362424920190c85f9594da1ce97d94bad8d89dfea71fbb2851786fe0f11a3eb8d807dd231839f9ca552706b51619cfba26ed161c15cbe4afa9d350979d6d695ffe7a5c5eca8189aada2f6ba840887093d215c497bef0bbf055442a1bb2af5e0fddc6e365fe2e64a90d83ca69e8b9c861a80c794aaccbde1d133daaaea1211679e19e57cb6bda6169304942d10de4ed5,8b96eff8a7e492a68f0a17b6d75ae9ab996315c8ce8e0c78296b9a78064ea341,c60ca90436b212fe6ea2952f54d9bcd0063534b42a81e31fd0f29abb96025c593742f5fbcdce197a5b746234a1c6bdd37b3a0a1b49da5ff284c040558833e21601,0d06b016dd892f7cebecef6d3437e3257bb312cb8f977c3c0a21aff299ec5d3d1aa2856e4f6072bb0fc7a69846e2f1557a514bb147b689a6726d9f2a84ef3cc000,9929a4d78ef98ae9e082e84f9c55bf4b1bb80ba5b6110d17ea24f5dbd11d224779a97f478f477014087d55d7a5bc3a5d9e6e3ddd335531d88e0b912e9950471501,eff773eaf8f2cb4347f8c2fa748fd1ba2981ccfefa7039e6f3850ef506f3809c15279c1c580d3f17f1b48fe606eb75b1d4487f697077d1201aa7691be3e8055401,b8eb4ece9b8bb60b72da360e693035228fe8f9dd18cf99b27d636cdb1bdd07d64eb4cd4bb3c63bf7ac52c0f34c20958ab389fcbcad4af5f5867398ca359a1afc01 +48b336b65600a4e03dc8cf73de3793301443d1315bf89439752d2dc501f80344e7770760fbf0eb0b81e1ce0cc2698acd4d5d9631b276c39ec5b9f92b02c5310aa54088f669f24b167dbfa0c3cb733842e6c1a49bff983901c6d0984a177df6c1b8abe6263ceb6458129c336e03cf9ffd755027afddefe9963745f90245428d3606dedbb05c44dd024c9e6e6d6988b79c80ff5fa39eb3f6d38aba3a1dcb28e317ea8f6edacb18acb1b433db4c7d45e572446d1b2ac341ee81620356f3d9da8382a99ce6dcf6620a1dba4f4f56e2ccecf749612cdc1a0b68f09905,9016d4d0b4ec1b64fc075124500fe07e7b15fa4d16d5387ba885253c8478a463,269aefdcc0c5bff2807657fd539d831e83565cc47c579f5e1187e4f98c1c995535e308d17108bfb92c0bc214b5a3f5edc15c1a0589350740d5640877226554bd00,d6ad1859b4cc4090611aefe11ea90fad8e507b8198667774d4aeb34f8e7f94d46e4d801d0237a3a93cee23501357307c8b1c708ecd197782da9f6f2600a0efdd00,d3bef6a406685846014c8658eac01d96235a5c57d3ec53bb500e48c5ba4bdacf294d541e3695bf546ca201e230c28ce25e07386d766f1bb6b4b89cadcf39bfab00,df2cd5b525dac06c0717f51d17ca818676a8c76544a29d1b06c88511924ac3db57cc966ed9f44bf8b34be4bc56687ba9f2d78b21ffcdfad9c278d46cab08505f01,be888bce530993d910ecfaea30f3c2d4a67defafe2866e0bda55785316918a7a7dee0f1898015d2bf92cac0863a2cb9cfb232132a2512cd55f761153db24dd8a01 +62d4fe4356909432cd66480471aa93ee3f4fcac708a382ecb5ee94fa4b8917ae9a2c8c203c99273fb04d47dee67f86f774b5856b1aa2bcde1df47ae8533c722d68a47416d01ed840f3c106b4f7b6e679b22746ea118b971fca0fe8b6a6dff7042685b9d80603d9c6263db8dac24e8abad8363885f3de645d8441f016a28c0d4dbb97b8847af78aaf72dd1ae00eab9b8631068e56c1dd08cdc5f4eae3d75ebc4551f3ce012bbbd8a8ba7e45c0fded5a1ba27d39c8f163f09556bf6446f9ba552ceced6e1a408ae0b1ea621e90872646e808620a8a84cc293f15cc,6975a317588ca2f6b8ca064231884cb541309700dbfad23ef0e392fb309f8268,ad4caaa4db0877e8545d4958b4bbe9211c14e0a41df5afe360171b77ead92d3d341d03e8149229b39d71342c09fa7b301a9be1d8171db7ae3645425d0cf82ddc00,a2cce309ba064d9ea5fff4d0aa56ffaa5a73f9de5d2654489ba4b8e93583b44f15bd154581f9db8579dcc6401a34333f0681db16c233fbbebea86b5f4136d97a00,56040864f74c030e05057455cf4d8bb8d242c27d51eb7fc7426cbd411faba39c5ceb335327c5f468a8236b7358b50a45d606557b61180f9ae25d9498a918697301,76a3e68bc82cc55ed3a70ebf83708b132371c78a84b4d538befa13aea06f880c436819dec3c92c84c08763006e877e73f4f077a816fe742a510b4ed5262b98fa01,d07ca1c9a9b6020aacb77559c057ea18b0046de2a89a8f469d376cf9a427e50f18fbde926f6e804b2c9f2c372a04cb39604cc89e6087dfc0b3afe68af2ada7c600 +dc9bc5a20d06ad9bf6e5dd4f630c2a5d7b07e33bdc1df77f4a5ef873ff3654f287501c23287e96aa7d4e6cc337205552746160d534d6a4e107524fdac09ff27092aacdea00501e7cdbaaec4b6e5cca693790b0e5a1a66d903d593aa42dbc33fa735a98dfc1743b3ccf5052b7e21f30f56fb60feb04e0c4b3a79b8e25ca028e3aa344f81db8ab90a286516a6b2ce1e57f517c4751513692700c46490c13a3e9928d0e1c51158e2a11b3f0b2917a6e7ae76c771ea1a0cb5c2c0a558a5c4da0e827817bbd2451fe43fa9006d71c311e3938f135bb3b00e0f543abbb,7f266f235f498289ada273b26ba412cba209349d86b9f928acc8dafbfa984386,46afbf253eb749898a142d1182c3952721a162f318b692fcf8b5b27184e83313351014bb30f63c46e58d47c948a4811b8cfebe422c255e1879f382f0e9d972d301,33ca6ccebc6f7db7a343ab45712e05a16421b5d4805f060c11e7ac10671ace4b2f6dd5e5bbe52de95e229954552c14ed4afd1e4fb9c6bcaa97f2295cb6d457e701,1dc9ae347b36743773bb26fa5c71d5266665199a770a7b7116f27641785a50b245e3a6b022f1ad223cddaac4de0352245f6340cbfdf19f8d304fbb581a14a55700,dd586525981449c9e5b8039bfe3bf6285e6a0537febbff0b7883f75134681c5b5e09e2974690c07fd20e871de1d8dcea424c5a175630c503ae541ecea3cfc25d00,868732a28f794832ff2bd124fabaac64298571b40b370d0d4e9ecba97cf02cd17c589fba0c1521e205f4d2bd698227ca64ec159091f9365411bc5e198cbaaa6500 +23e81aee7664c6a72a45c25c50259373ffe5782cff35957b1963a8656d7d4e0169f6c88f224bec35951062711f41fd0e02159c62f0c7fde61875fdad7cdfd8688d74ce00ef00f6299181235afa7fb12eb45c9f63b15fb9f267d8d59c468e600f9344da4f9567d998e414116ace75ab1610045db23d1c838860cb06d105e97dec333c15bc6e5bc0ee057f374666dc69db659c512e58b91bc8df201c5363d6df41bde09e2eff8f2b6d18bdfe9d4ae586a85bfc0df804e45a0a10c31858d13434b62a5edac24c6c495ff83bf1a29194d6e529c505f3adafa6b65e84,356559bfcff473d321ad21ff22f07b32106428e896cd81564daef9a8f4637b20,476f1a3b612979b718a30e72d8bbab2bc161277a12ecf749b7be0410ff2892c5507939f55d1db174eead2fa64f5ca342188114cda2e86223c01a6a895b6e139901,7c69731862302d49f9fc48bdf738eaf6cba261b6733bdd0391ddacfd2d6a2c745f5f8527c6336f7e2b819b3e0b05cafe00aa7af287aba656f17adf1e9005309601,47bf92e9cbc7221ddea449ff1780e2de57ca8f65de9ae80a3e8d549c6b7f57ad23512e09bb2562f54b92bf8b6fb80b83e169ab612173c71f49776618e208cf5e01,918d78dc8b14c4a9595c84ad13f2cbdb79b83e816acb4ae5b7c11ee4cf73af86793ee4e6092b9240a79e2e34c455aab580984d693b61ae2802a40986d6b489ee01,aa34266a14f9f0f694389ef37edc41e0b3f643850b64180afa9d4b7b85d067f268ab709e33944d7b7733fd12d47a35541f9b7ae5506f8e646748af26fede152e01 +3b7ec2874dbe12d562954ea423c27d44d770a00fcf7c5b8cbf379baab7fbe6dd2c9dcaf47623d25f9c55e5c0586345375f26cc2badae2c586ca2fde06885d525fa608db8ae29a21a15e1f63f5625e37192889f59a8ced40155d21539db2c46f5db44ac706c76f468b3c48cf5b2fc37f8640c524faded18e37c0fb7f72bd9f866726d52174acfcf7a85461a5da2672fac58a138132f8cafb75a7d0cddd6ab2fb5a0d53494c8104258890020f73f86743f96e0744b7ac31c0812c9e41c1899fd62f08b204251694e9d6abb305ec6b052d6326f1bf6095e99f0ba41,7cbb33228b75d8387f5d6799ad4fd4252fa99b887f611f67c32d93ed5354d81b,a0a1fcf273dda7f0fba1ad454c57d4a50e6f0348cfc9b35926cb44ca8ab7e3ba6501586d0c69116ec7977d4e368075eb77bddcf98b1acabcec3b9f346c52c50701,651a29bfac7940ccc8c3856c7e89cb3136c8ca3626ea698f055884324edfd4e9160b44ddc5d5a7bd40815678269eb0a4e51be437c3d5445e2120a84ace9470dc01,a2372365afb358d2fc26579aa0e20eeb1caa9ca546cd54c1498fc6c9e90b876930cbf53cc79cd0741350cab7c69c7c251af78ecf83b1d51a7c01d060d19eb01601,293e3666dd2da9eebe6a5edd11e3f5757f061cd72260f64b24d67cb0e7a21e696afe732434820427fae91b4a4b02904a74bdd1c70f4b21742f625aed70c7e20800,b454155f79991839cca1703aa2d37703b9ec1f075cb8f963065ddf0e2583682755c9b5650b8a742c7c38ff1211f3a9f9dca212974f789523bdb6e2179fda48a400 +e700e4c1360df9c7c44ecca3e201966c8b4df3f2b222346ccf3a3113b120a8e2a8c063b6462fdfbf114a6b89faf00d4f17e9a1f0c2d7724ae4f104d65c109031eff90df11871805a26da162c5db4229a96c87848900582cdf0d3f0ddfed0e981e947db3cdb4f68ed0c5f9092865872733e1c7a19e196afba6114563658f11ed5d71170b9199da7180b4a9ec565590c145850bbdd98dc85470bb549ad86a4d3e12a351b77cb258a8ea9e27e0c4991985524d9b0906278ad537497d09ab588c323a982ef4ad930aec56c5e9b1977eaf4584e55a3ae223963c371c7,5881ed62d8f6774319200ae91a1a75d5496ab66e4d1987f349c9b563c64a58d7,57227debd11f039519a88a8fa8ee198bcd1bcdf99b0a7589c0ee58e1231c263039b6ddd682643494d0c97f429621153c5bcf3dbcdd2174cdca2d8924628a5d8a01,38556b1361a8f9c596426829315cde6d7d2ea0d625286b63b6a99eb11a4f6e9f64b44dbba42086ff16acfb8d62720219ca2bccfa3e7f1219ed7f1689e0b3444000,f93b74d0c996d8c453a979554994949f4e1162dc7152dab79e697a4ee2c3e05b60a1aeaf634619b7baaaac1011d2265f6b870bd452454de335ea345c653d587701,9851a479e13ebacd8320e516e8a2a9fb3c5be7a5a5a43019014c0b56294c460141ba06d5500dc5ef44ba2a386516d70db98896700f3a9b5ad030d9dfa73c438001,fcaea8be692b45a4ee4d287a55806ad53b5075930d8d2f22e740d564f227aa705e986940909157cb7e602970e5aac1065dd6d34487815a866d740331c70d40f201 +5c52a89ed28cfda03ca6914d5f608a2889c19fa5f90c2e17a548ec6a3175453601e200e00633ecdcb5a162c32a970a17a766d9db78e6601ba2f89d6e0a44922b26ce15ed898b16cd29cc1316810f1679e679c75c8ee3d5bc4f2737894182c58bd4214dd725a291e56e76fd8127ce43feff327793c81971fcd7b24ce51a1131ed28b4559cd3988e2bf074ea728deb205a5f9b009614d857c17c729fb9736031c62f4235e8bf5d5923811455fb79ae68b412b58bc3842c968341f0a85f629e277f61c346b62bd93dea40a379775736bfe33d680266206ed6ab6085,d0b35414a5615fa6add18683a3017db82a542c5051171604285bdfa2e6d13795,b8fdb0662906c7dd3dff2eaa7432d5e802ebd4323abb3fc6e02b3a8354b399056a950f8d3dc7be1b885d286ff1b1d468f120907bbee46ca79cf3de9d3f2e5d6e01,d09d5f6e720c65db340a798e4beef852c7e6a2259adbbbf2595a56bdcc0a557d53082bf71b0688f862fd7359e18ddf331ba6581d261f4cb22e953adcbd11b25901,350801a1dc6c6389a9dd078c554aa3c18c2b65136a152ccd1eb892da6e4777144c1936d9b29c83b645289b63e80a8b54c9cc331342d4b7a36c475bb790d972c700,e716c1bd8040fed23f6b19c39b1c7a0534046289b81ac728b0af8ff0cd77da6c657c9271c742489ab56eddf1f51d9b7bd7dd4b097e451ac1c46d691f053bcab900,b7f97ca4882483feb8c51be857a28d8f326d075055b58e2157d710bbcecc0ca04cc04d36250ac3f1cad73c8d209b9a48d16216373b1a6efc57ba0e23a8552b6901 +07db2af9a8c8217760544544ec54cdf1a3cac8aa81fe672fdd4cd638a7083378d3cd1a4d572aba9368a684ac865869ad8a6eeab7b3ad036bde5331c846fc3955b942b7c490118ae4f5083de6aecf2f39182e5265a641cf6153138d52cbc07a0a655a7e65fd3842c0cf54eb5caaf5cf78e4169295f4415854a16e6809fe9eb759c7d52a7191af417b411bb0e940b5a51af95fa2acf45fc9760d1ada12c90f2f7dbaae582ac4364660ddb2daff9868d8f5317a320bfff83edd4d2fe7492717f48f59100d7aabd92e80dd03c60fbcbe84fe5f91cabee1b265e90c6f,91f42ea375fe99acf9f9a23141bc131fbfbb97524b0b39cd098ebd7ae6886d40,353a3a4971477632a0a5b5820f88ea2b1bd5a674a7e491fde39ad5f58821f6de1a8b4cd0b8e5e076ec48d45f4e301115b58843e267177c095ba8845147267f4001,b4730843c13eb11121ff00b26c9936630c964bec18c10f539cfa93eb379d00825c0443ac043e5ae0c1fb221e8dbd10156ada583a6d02a44a741fb38e43bcf5eb01,c8903fe918cbc97082d2d4f26e861e849302d9631a19cd14bdf290d30e5a4f7c34257c719dc5fab682994943101b95bd091841b4927e55f08acfe949673d2e7600,16fc542ea896f4005788e11bc8fb60f0529e0ee35382b8c751c2c17efe0a04f1168fe8a4e2598c31662e6820bdb80adb75c962818fa80d6450cded1d0d69ee5a01,df7c474a9228e574572599427a9ac33559c487cd9af30faa17326e471ad90d2871ad50b272ed0eb68eda982afe889d45df0256c609569075f149dd6e0779707601 +7c881f0b189542368b9b9c34903db9ae94a8d13d2f41946e59601d256492a91a45b37378308de4d8a368696547a21e71982f931f689bdb68d062979702b2a2f525911388c1ea6a224df820b0884fe7a9286e00e36387d74dff1831525742c17c8aa13a841b7f255fc4b089c07b882c449d195d6fd656daf482dd3e092ac16ac5f50d2e3117f0bea4306e47d12f9d0c65c929843ec621cfe5f068bbd2a3e07a95986a0ebf3b37c4f70d0d2395723235ea4c420530a7f139c6935da3b810aed4b67feac38082f600e1c3396a2eaa76498021d858327c1dd824877d,84a2267856510ab407cc12db7742925660db34e2d9b93c692bde41cb78de5ce1,3b501762e2f45dcfad9d612ec802150f049e84ef95331014b76fa1def03b32633eadf95d6b336fc0b3267fbdc597dc1b75e3174f6ae39ad3793fb1f2add9512501,7684823830c08435f1cbe2d15325707fa8cbc0d496e645af019af3b6d8a4bca674b94d623a2d64bc1312a7b943a1958899f791a8f85ccd6a4b7f81ddc6ef607200,9bd5e82e8a3822c08fa801cc95c98760a8423c7b5f4a354d3c0c3648fa5b61c97c913846241ee880ad505d2a549751cc373bbbc2856e9704ca9fc181b16ab0b800,8aa964d6d3a57676ae4b3d38c0534699411216c271e958a8fb8e5d38602228ba10ee5eb63af1367eb83c9644b5056ae99c699242d3149a274fe8f21c4609131801,dcc7aa878f6fb09ff1643eeff7c0c5fbc785a1e57024333035a67922914e2b263da8828fd242a198f07eccc7f385fe7541ff462078eb1817e539df746189886801 +88d93c68494a87e174823ce859ad7e98472557acf8b0a1295f3e2df00a8449627762dfb2786b71f5dff73d22f16fb8686e44851bb36ca381f707f92c50e273727842a1660efc76062121ba535e331fe47aa66501c5d3e11b114f0afe3f24dbea33ce0a7470a76c019dbaeb227bedea7b8bf7a8f4d75497d453525b14f924ac219a3d33274012a499cf7c3862088a0d94c435683fadfe0686e0d411105f67d384181036795624439452aad0b60c448240de2c0ac406146ab4a0e93be38f7f9a1cf1079f61bba49f63df50e5459c63113c9c21e443bb2201672a3a,9f48da2dcc4f6f7ad1c8614380b64163949dbdc2b97987230fa6b42c5161f554,eddc99c6c70ca86d0e56d83327eb4e72fd1f1751970fe89ea3a0d663e054706f1cf9dc86a0e1c73aae21250f17667d63b2a3eaca93493f139ddb19390c0ddd6400,abf8dfd0ac6e959f11ac3cbdc63df27230e63206e3809153c6a6074c2ea249c7007aea2402d6c4daa4974a76aca89b06cf0c6b41722abab062c694d75db4650e01,4fe3b23f7eff3963cf4f97016661402e62e47ea4e3bb1c8f0a7a6a5bfbb71cd8261896dc1655acef5df9ed475b3300beba5dda14c8432e024ba9f9384273113100,5585cebd21ea1ccc1a49c3544114762e098e79207d5044596c272e2f498ea4ae7ba3e374d8a9a2222a32109a215135be80cbac8b498a9d044566c07b81d9e30700,d0868b2c1c43c141289777bbde6622c5c6832bd8a58364fabbf9aadd3249dc0469cbba41c0cbff097bde7b4bcf179947c1dc84268c26ac90e34a7fa6f72ef59000 +be4011e0708f6194f2ed71b9547a043f24a77508f51c5f1f59969c0f86e7cf1c00d1eeb2f9c319d6f6cb578e47c27b8530486e33f08b271d7097b30cc05442d8192e0a1253fa3cde6f1a6073e797e30735319222ad2a7cd1d4fcdd4c99becb0648330148a2ab9e5eaf964697a91374990e5a5880671118d13ea310bbb617f2ee06613e66914b3f203b827ca85b94e25c3b5f867004a3940a939df02a11b2bf29e238b0a372b48d3f6bd67f3c6b1f5d9498c9b8de0c274280e0f291263dbf8a73b53d040ec6319b405a2367c27c3ce5dc69ebdbb22603bb19ec8b2a,291f70e98ac076150278030ac27616ffab69d4cb37b75cd46e64663eeb1354d8,22998960301ef3e4235ed6a7cdee002d97517585316904db0df8a32614e4d588765a104ed6292b04909ab07dbe5fa1b259ff96156f7d3cd3158dc880edf5ea0700,bb21f8686d8ba6da4e5dd7175960c971e07ef99474300aaae41a4c97605705e940132d5f64709b00469f717507cafb2d024370b4456b87f88571b4ed56c5602300,7bde359e6ecbaf36ac565f981ef113e026144af0e3c0450603a3902f7381313e5ed01b0d205f5135684619eb1ab35d59cdb66f64eeb8c7cc798058300f72261301,752047b9f5f909d58e6e7a01a74329f1cf89da0c15486580c60230e243f7630234ee8391b7c6607e5eb2854522c548f221d4f31ea6c3a12955c2ccf69cf07eda01,2398828c99a3586a5fa50f7558516fb614c479480ccf07a0547cb4514441bf9b0773226bd7a18ee8b6639e1d12c4b662a2dcdebdbb806a1decc2dda748423f2500 +280541a5b47e083e3d63c0fd414f2adebec1384928a4d68682995f6c3c3ca502936933a77d4e3dff940e89f8f39ec192781dbf250472abd62fa439a3d1bd800a3989bef257117254ce406c3062d9e05593757c92477892b957087051c331207766ea44475380c530c64b5a8c977cbbc520fbdefa2fc14d138f8d48ec0ef4d88900b96af85c911844fb61e88ae82a6b9aa042c5f229e5548149542672dc26fafff1d506918476f15375861bce2429108587038b72b5d9d9b7a031eb33b8cfd2a1cd20c679d1565b141e0aacc071f98d397ad55f7345ff18080f46a7,94bd7cc3366a522c88c7d2c8afa3887a93a58863a77972bb7ef0334c41e232b6,0e16cb41405a35c2bf68ad0ff30e08a2df5f9e96336f3e03846f3f641cc7461a503992d691c627c7c91038c7ecc2afcf21cc087ce3973092ee5963e58055833400,4ed3798a8f97ae7e872555e599641fc0beeefd8f672336405926c1fd2e50a7dc2cd7b7857bb93eb1cd8b72336945fb398d4dbf7195acc8b347bd9db6095950e400,f5f2aa49c54f933882c4e54ef59d775fcdac8c0e15c16687dc76ed28651143835a277e43587220f1372a5f1f6fd32b38b3e12bf57fe931cef19683893fb8f07400,c724f35c2f4effe0395037e58b8829546d5fdb4ced768dfff57d90a796f8115044998e466c700f1fbe8590ee251d131a91cfa0a8b9a20aa04a200c43ddad214c01,632e50cad90f64364e79096dbfedb557db6700f38561aa35a0fbe18fce1d9452501c30deac5b98987ac88f524061d3299c04b8457e75b4565d9bb593cb064e8f01 +86ee484e18604cb5bdb8d4584a9024c83f9f30b4c496f5bcd33e9ccce2cd99a1af6e5e5ce1b20f2a6526c6d788cd5eee0c8b69b06c63b9c5924b335d10cfd6f84bc82f6f154dd942f50ea407cf279ac7fb4a15b7b6dcabef01f16e1f620c4e92697f95b778b41b8bdf8d89618520d6c63c51d7b55c312222d021f0d4d76f593337ed4a749aaca042e7802b24b55d966009757a218657259d667651cbb55ec674f23c6409bb22c18abf5eda818ffee3c24a9d545fc2eb92991bcdb24eb73acaba114c9e37eef4bbe0c4edf3b5301cc941a19ec1df5a706b07a720fa,993e00604939595c0f4746a12c1b5e1d105b34b45b0558c9e08331b7318c6513,d4b1b0f7a1deba8ca2c6723f135f027b8ec84631419a2a5b8a12ef777abb11a229719e85e460341a4d200420996f0ba00e93ad993b787188e5007d467ad385ed00,21959562eade2780de8e728eeb4cc5901677322452775a60b04a6f9c6645d0a711cc2cbb9791a79f4e3bf7ef24dafcce8a0beb0f6c34d142a165932e8a58c77c01,1f13801ba0ce54faf1c4eb5216029e4560d113fcc0544ed9b855bcd48a37390f00cf76aab138cfae8c932eabb547f8765b4434e1003f0917fc6253526afbb32b00,36cf1402905018f8004a802789f810ddc37d26eccd0896828d000ddcba3554d340bdeb62aa703c37d12f32b9f22da49492b21987bb849c146e10db2e88161cc900,f5cbab98c78512c445a433d71af28374d13506deee24e8eeca0fb7c2533db7b94482d45e4dbe8a40e57677745c36eb356b1ad75d91f30c338ec5895943b83cba01 +cab8e80a310c6e73c85128ab2b67e3d7bdb82bdd51912e7ca755c0956937b88786493da9ce3471c854e3bf664c968e1d88ef6aa6f2b121fe0e75f5b9e33e140b6d6a17e8aa27154162bc2ff3c9f3dc6112b3245a543755fd38ec6bf1abb7d8f96090fffe00321767ce65220ec034e71ada389c8895a6d43c6765fd6cf5ed74d0e06f8ca4fa031f345e0c71f27cb1230c880d933aec4abcd91696e67842ff9c6e22f6a7309278fd52aba2dc605fe8638411a19bd8ac2c9fe27046eee6dd74b4e50019856254558713d4fd26498118315d9f7c052448fcce76c08ab5,397f9cfc06b5a0dc57b0ff95de28829c69145782e1d37581104603d274bc49c0,70fec5f9ba1f8424a69b09c215e56043fd91f2c46cce108a9f08abfdc49ac0f26cc53db1f879fc50ecfe69376a68791a60ef562abe6999bf605855041901b89201,e20042a00187ef6b801fa504661a7792e830e7963bf1164995b2ca613bcfea4a27d2295acceeda91ec20dda639a8b39041148279a646a2dd63a33e2e7390024600,1c919bb0143f03065b271ed3db880f1c6188dd2eb13db2a3d0e9c926faf507477e3ae44c1108211239ebf82a96aa6d75ccc2e596184656146e9fe624a897ec1500,7426d4aeb3c178eafcd0076642234cabfad3d4190685544fd239192a6b4f97721f0e9cede72c011f2e2c517f2fffcec37ca0a8082d20167ff22e03665a80f18200,9013ed032c33247b73beae7c59c1942fa7e684e1e60f335b9eb20c4daf70ca7b20f04f1902b1e007b5e4d743a9473159cefee194d7027a4f98def9f00bbdfe3d00 +e37e3a922c558bb0e421884aabe648b53d43cc7790e026bbb3f768ed34fc38e59fa863b093928ba6e47145017e9695e7428381ff09c5bae035a4561be246efd97a2b8851efd9d0dec004ca24ad533e9e9b1bf525456946e04df92738447bbf25e37ea79ddcf26f364a1fe9bdddd259e414bf92d2745705fb589282e84bf881fa04547eca3d4141e687ec94e94fb35c4e339169eb872cade080610f6ca6775cf875b700581305e50e048f2cd8d8ff18472c8f7792a0863b8c4837c22ba360349c4a70dc3861ab5cffaa060917f1f5df19896163548c6342aaff06a6,ab79784e4434a14155be65b1fc803561fe5ed2a7a68c48b419b5420cd324aa6d,e766c5cc3abe31b5e21bf72d1be9ee1c60c1bcb0b71b704fba17f5117104d4ca1537d0470b61e31f3e45b5ae0e72c0ebb132fd64e5e6e7cb3ea3b998ccc0562001,9096b0859a16f3f89247754935259880c88336b2413925f4903de3fc34cbdd7d2e0cbbfea7bce9b40040f50a07257aed149b16b006115e429c049ac1272b666e00,0cddb6d483eac23b7d5a5b925a18f25f2a89203f1a28a91596bc6a684b7ef8a7572ee3aa12149661589679d73985bbf83c94cc25bb669783e664871647e8fdb101,18e18aeabb519ecf81ed25154cc53c3cefb5f06ec9a37fd185bbeef7f33fedf662584bbfa0a0e1f57e83347e5b79d3584acc7433766044ae83b29d2b5ffbea9801,3313222a8bbef72623e91370ac36d37fdea4fc71478a198de6a5d1e8471cda0667aaf8d61e650606601968e575c60dfcfebb85cb8ab8b845f0edd53f1da6229800 +26ab1ccc8fe56aa90a54c8c0741a57f65e650631b96e913e4d63d2d4fc5f7f91e7d05c20935dcbeac89a7eb5bfce7a483ee51f9a4c3636670f9c9e4a7653c42a637206eb19c5feb48f56636960d4bde3420a0663e9e65685b626b6a5e9b74bbc08384059626f972afd7513ab7b8efb71422b686b6e35f19c423d2eb5548a63855caaf8f432f25d660e1d30ac0f5db74934f3ba2e28fe86ed0b571962fcbe8f04692bd63156ba02667363b9a84df177d4b6642a65a67b4ebceac7013165c2a18d421ff0c5c0ec6da4131479bd4aeacd076e5c92fcecf048ede4d8b5,6a969e4c9c19bab30a699f3492a5495a94e3db460f6b34201ee1717f18888624,d1fe6464b12af3a9f6d60fec2df5d2486f8db7fffcf0f29a75fc08eefaaf49306af4cdaf54bd7fbad42e48882f890edef239f216140a59fd200e1226aa83015800,c324ce980f10726d6384bf67c42ebb1d9dc1d9e4ae0d042d74995068c57968d4393400ed16cd9c788241e3dda5edc73dc84efc132e4336d3c217548c356d7b1f01,75a0e29f826b113587dbed72a167fd5f887c07a0264e7b3bb2dbf2f56dfcb40841fee367481aa09c9868f74d1f7a96b036934d264d207902ea1c43618329a58400,a769542f815827c7d2f78c191b0fd8f630496e1dfe4f6491ab599c56fe580f5533826c6b8ac00e04ff35d9d6cf4a3cd4b19f55d546d8265ed8ed995e57f24ce401,8482ed4cf93227e2a367d569da9732f9883b433e48f09049a4dea6f06241589872cbe06a539266c1cef8a78e765f468236ac27af29ce76e5f943312e16fa0d0100 +82d8231f2e0fbc790167012da9966f6345103eb49792d17f5488fe330891d41055760aec2190edafee975fbd7504e766e07fce2343a2f4adb1e1699b14b5f6e0415e8d557381c194e4b58520c8ab5ba9d9acee577aed3226afddd9001cf522930572fb244c72bc57534311909e68e534551df3709fb0043cc8e6fac778049a6b62a66981096309ebe67c2745f569d1f91ae24ead66c0861010fb6e070c314cae5da226a5b2ae902fc5994798ce2262e66d83d6e41bbcac039fbdaffc01f5637548235b9be1bb779ed2e959ba0c3284708ca32e11d9c73c4aace075,15c8676711e7bfe9ca6df09198bc26631e61c307f9fcd155c5c0c2d671dd2c24,a609247dbc7059cd1c4074d337cec9cad42ad0b735b3d09c3fe20c86934444a369b5156b04690b61d4c1e878e704059fcce6b433de1a8a8c34242b80c531d22200,396c0d9768279c81e7ff18a384a3c2ce24d7252a2dd7645383838cd0aba0c0f20bbbe54d65b0664d2ac225e26ca062b040b385eea13790be2f3be3ff39b1d29801,4b1bb09c1b8a79a79533f240ff07219d91354ed5a01687eeb3d2d35defc72f7621786db1cb44752bd2e8549dd7a55423b6dd351c0bb8c0b6d45ceb06985d5f2100,efb72a0256e442a5270fc3f8b6f3f9eda49fb64b7689e0e67517dfbb08842fc07a82e959b19d4a98031ef4a7b98a9e377a0271b855b8795f42f3c838936f4ece01,d7f13d9772f8b63684fe2553c0a52ca13c2c9d40819500e515324a12306f382515dd041996e497fee6cdb4520798992c4d0c07ff2b85ecdd6a47eb311efc997101 +d53846b816d12a03036410dc192ba48ab5401e1aeba39f3c3899386e2628102881beff397e533ee311f4bfdc78c8000aaf5742a24e91363ff8674c11fa56af6909c8f0a6c0b8ccb51c49debf82f991466d8530a3fd3a64ccf6cbd9b1062493cf44b09f06d602f68d9eaa82a7da4b851cfad7c49ebb21c0f41f087fa920d19f7ba1efad4495403885eb000ef6f71d3c402c93fb536ae18fbbfa1f7642f8602af2a90efc795ca4263790c2c308e80be5351add7cf09f1d20e08f6fe96af0d4cba8b06f30acb7b8a2178c09334de2b695017a2e46b2ecd5e179679448,5a91bb2b98420b36d873df144bb3e240e0d13b39d7a2599edfc955a9a38e103d,8ae562e73089d2e64489a26cdb416d102ca4b5ec99d531818ecdf956ba0f564154ab3208e2dbfe2d3ff57b1d8f33d0002be9d1a13aad0cce735d238a93eac38600,3cb98c7ad3c65df0b2b3bd4c8bfd32801dbaff37df43357f68107928f332b12c11cc77cbe7054888d8ee21dd693e7a6ed48b2fc22cd6702ffe857e7538f4740d01,7e435f387e837f39729f8be8e30723abe548b5147192726945ca661306a9f1422c72c372d08f9cd83031bd004dde906a8e90045f003c1d61b6b4640955a5ed5300,98fa2e23e3aa1f41eab4641060df39628ae29f1823a65e1302dc0ab008b227076aad5541ad537552124fd2a8f0c4dc1d1a3900cdd346dc61e5f3d534d9b0b3a201,46b6095552e457b1a3443ebc830921e576d4608b7aa66cb6fa72505f2e03e9a730113ea6acc2a26255bc3dc851714a9d22f75052ee2f463f9fbd77cae40576a400 +025b9f729bdb339c8e018a6eeaa5082a218dd58dc26ba83c3165c28ff5b25a0d99be763b1c323ec8f91cc2fc2413457dcae73bfc8447b98b3457d52d936586364567b11054dfcbd7cc4c3c896cb081fc3db0ba7b89311a7a41509334b2673f548cdec74c6ba6eec88c6dc03a3e7ea016775bd6397d9e99b78509f5c956594005f694d40f8f0f648e07af838d0db30bc779651777d283794242c21ffed545c8abf3accc96ae8fd3757cf537efa76bd9c6cf4b1148996421200ee8cff509f7d910fc0e844f9d96a9016462e9c67a9066569e73085dea1828f0b3f4f3,2b696e16fb547922f1dfc1960a893374607dec84299bc2d565240fe3f7fdd784,72459813ea5b550bfa3c2fe52a9b66731795c3edd50f2e503d997222ef45de09657f79335f17649fe8ba17d308092f46d15061cbdc27fe36069c0291a24dde8e00,0ac244fd30f48acad151727b73e2290be06651c3652525f1443d4e427b3290573d4d0ba774c284fbc1ee94ce996c82fb0301cbf8a5252939701b6a48ca8b8b8900,d5b3afde3677ebb9297de7e1aa1fbdd336c27c3d4f5485747f0c16220a74a90e70e54992d55b9e803f6bbb23021325a93804cb19c33e26b527f80c2f8d8dfc4300,b1dfb0702beb968b95bb339fc9b088f4f8b945c539e4a355f99eb47980559ad83d1acf867bb3dce8d477e42a61500d7801f556ba0ee7b0210d94e7cb4dcd47ae00,1a07fc2bf45ad1e5da8cd2cb44a1edc3d891a530c94ae035538e8023dab9f12b37c7fb28eca84a2cce30af53cc6dce20e13bacf7f7545d8452ccdaa4ee8d7a8400 +9da307438a6adc0faa3c670e5f826215903d06b85d0a1d0a8bdfad87f13975ec8864923b0a8c966bf880e3cbe573cbb58430da4933503f280119ef672798444b61656e2e83fb13245430fc2a70db43595ce6de5e4970dd95a53cf289353be8b55a5495fc43d08860defa640f6ab7e4f50b78b94135b72d10e5703f48582d7778cef5a83bb85329132a00d71559a2f2f63813f7060050e3c3d181d66babb87abbc761a9712db0cccebacab65746b667578077d175a272af699c3def280e4e3c1a8d4f2de7b89320f1f143794838ea96243008eb838449eaba1540c8,7afacb210b7f9768c16d52c78df9c6aeaeb0e8fa562a237ba0e5a5c09638db33,97967b4ddf823694f8ffce98b1018ff2331e96b6a8a31fdea446e34a5ec83ad515a7e756515514e9040471896a7e003ae2a04687c5813ebb2c3727e43e1e782300,4fe48ecf5a8c79a9369766a8d766a43f11f00ff1c20eafa1b5a49b62c57f8abe358548cc85a5b845a992f83cf4f19ffdc67dabbb9b289eceb47ebf1d7b52c4c600,03a07783c4d47e6e62fcfef85b9a5aa3f5d6f4c0dda0301418b9154cfa3d377014abfaeb376a5543aa72dc1efc7a88e3255ccb3100a69ec2cd9d133b30faaefe00,56f1aa182c9f67f96c824b51e26593e368e5c49cb8c68a5583bbdc76543f9dd2092f5f7c2ead9bd28dd7099184450be2da47c97283076481f55c21f888a9bf5000,119fb41c30fe8d79a1e696f7ba031d96ee31fa5669caf1db88cfa5f50b22ae782ab4aa8a17299cb29a4ce307dd82d92766c77c1ad78040f27b29f829f6b8270d00 +9de3acbae52e267d47bc10b2e482b0d75fbc8e7688a3071b96c9707a5102e0e1224d3d5f75aa684e163070f0f9970a30c676566863d51d58631eccf29efb34eeb1b2b858b0a847ca836544ebad1bfa5623424702c82e9dcdfbb48be863071d494d14abb8c9ed2fc02b793e016a125f155fe50fbf14f6a959ce1c999c66f5ce7a0063de5194b32a6950671f9934dcbf7a48ed64da4858932debf5bf31e3427c67213438342ff5c2bf59906c16de93f0b49141d635d9f80ea24621d9d83bb6c03a23656a4ae1aeb81e8deb10142ed351d910dd9579d396ebe538e5a8e1,c06adfe2497d107221d9d9b5013e7fdd0b5a153d16cf010a0a4d37b5837f14a8,8ca5c24b6d635d1c893019cb251a17451ef754e1232f20a30b250c905fd0e55427a0d8508c2ea4eb9a917421ec4cd80ff05f73c46d948dc4e0f7946871a0a0a901,676915a4cd5ba0930d8203afba64ab6b61c0e4ffeedb595111a6f83886ade57d29b1554f86fd96eae99704e3cdadd4175fedcc48e4c1f8de29d5179e7634da9a01,3acb2cce3f2e344c85f13360c026bca3f626ef368ff235f94a83b340d37230d1545e747da930a194d972cfba32e3cd7f07dc2f5547bff1a9c838ac700c34b79700,d5a27d499c959811376c95a2841f66b36d31a32a6097749722d9bfd6f20732f34d45ed2d887ed0cf6a31bd6aae1007e90830ae51ceb1948e906fd1afcac1835a00,e865773b0fae90b502b64ef4f02e41bad851cfab03c4183ea53c7c39409e4cbd3a5a1013bb3d463baa500353488e7618b32e41731de3f2eb85694a282cc1646b01 +380905f52a60c1c69297d67748484b71637ac215deff5926123c7fc97c9e089a640582e74045030343dd420513b37b871674b4828304f4f3812ca8c5fe66cd6aa0f4b709525886f9c6b14f7302040737b2abd96353cb8c61cb252f93970077662bbc0fda16d202591779cc87c313ec326c58b0f32ffb17119be65c5d81038df1e809e714596ab7392e387621c0356e0de2f5b4398b319c2fcf0fa5cbbee49e27c78dc61b9d1ca7800cc195fef6fdf48cb578fc65458ecf539bdae18ef4c3e2f840092d1946a6e222a3e9809aedf615c17c4c237caf9e0aea21a9b37d,3583d1760193613b067503016fd3084f748569fc73332812c3042cf10a4ab558,3b9790c9d100d8640686c42fbe9473d37ba371958889d7d2057adf315c98b1751efb3f783e640b7f8108eac0d587f9c359935e2fd2e199477ad344228e9b316000,575fd7084d7dde8f411838a063115eb016852456bbe7ddca5be183a15401b3234015b80edbd8d56c3eef0eb06eb5271d3578a2a1929fe2300bd911ca89e92fd300,01ef13583c3e03e349a438042bdc910ce871dc43c720bdabe1115e5557920a32421ad853a833b2546f0c9e7a19b8b32ba98420353b09ebc0e81180d216bbd8b300,1cd5a090624a7d8562c90258e69f43423eac617e8f025eba39b80c8bf9a4bdde7125bc2a761b0f22da548c11de37068b779e3567e5f989c5085122623b653d8d01,8a9c86538e6b391c1d2b6503483cfa8fdf057bb0afaa5e9415ac99053d8566c503a13203dd9bf21fafb2e325ae85368d248ec7521eee0fdf5bccce6b0b2dd78901 +c1998d3e0fe923871b5f5e88d6bc08d2813082721b05ed5e4c9956ebf51b3353ddd4ea0ac2fff017779d760f35503cba49dabe131cc33eb81fb43f28f14866fafef1f15a6db28f8fd33f876bc64c633b94a4b5b0047c0da637229293f3db32602fd803c769077d52a91e883fc1fd197c8f45ffb0ad1419c55dd4bc854dcdd4ae37775529d638a8760b29d82874d2667bf908bd817cd5c7dab096bd1fb3c1cd9fa7b4a640a5ee353f46914c989ae88217530a180b72f7808a7f6677dd97ed08882bfe33851ab8aee72a1e1f7096f916e6a924c471f1efb780ad707452,a97db99c0065d7144ea64c742430e3abdcdd6b86c5cd0924bc8f43a7742a1668,9af0ab0fede5a62952a28ecea42eea6042eaf541e9a3b3badb0238c019b8356f66f326038c8102a820b36ab2a656b5c8abbb5afb1d3c4012afb24d327e82a25f01,7ee708afdf5a4a87c5bf6ad8e30c74f1f1902cebc458575d4b2a48208c87baf313693f16fcb2578cc4affe09953a55b193408eece9051ef1e5ce79173c76269801,bee0c8b8a9641f42663102a7904844d0497f9b07996eed2dc8cddecb5f1f333f0b0742bf8d69943060d307002d5d1eaf5bc3a043043ae34d88bf0a9e7a9caafb01,f1dbd42cfa465dc21ba2bef214c7c6258673693800dfeccde50edab0f4def12e40d0bcad13185487e251a6cfe9c1ba5eff7f1ac08cd3b038780271a9ddaabe0d01,07641e5bfe11fad0ce781723742185a9dd90a85cda281b8cd863fc5fd1b5bdbb7f14e045439bb4d7d710ff2c42c3bca0cb7f412baf2e600e432d680d1ac9a28300 +f00e6e71a6d7a66f65484171f7f0281e73c9d2f421e42b792631629fabec04ef6484bdc604cbf61b02006c283928a55e8602c3f7cec36a80ea44c14fc6943dfb3d9adb82bb6a34582db4e5ab741f1164a79dae83fb685b6335c69c3508ba669683827930e2cb7186da915f6dc4b06a54177a8fd13a2b9ed23b2800b34e452c87e821af6d9eacfb5da2c8c7820c7fd56d6865af1eb159ab601ef3a006e4cb2a65e6c30f614181dfb18a4cddae1bc98e60d782da3d1ced669bf85e370b16593d689cf03a9dc4e6f90fae66da80fe3d697252bbd60455dddcbd07e8f40d,cd42393a21b16f0831ecaa7013367c25b03c1d67b3c3ce201022aea2126ae6d1,646c87609fd28eb0c76c47f4ded046ff70b67499c1d40182b9907820959dbaa916b8da9f4ecdb7b6b6acdfc758586e51da13325d1c7f49cb62993c35d469d49501,7e951922fb585292d691173aa2bb283da293cfa29c00ad9b8d7ee4383f18d3c134f6f794993911e102ba3b2d4ab9b4885643b0dd9cee7f9c0c7fbf0a946ec85600,130848677f14ee8f4200d0f5e1877c4052db1ea4c2160c40f1963779af1c362279d867dac53866228d178411a6aaa5b9c83f0821fdd6542cf281a3a9911c482901,09a85415998600790a37b965379bdf146bec9e3558c11f6775a8097483b393d36bf4a4611706085d2ea9bf4d040132f481f3eac9e71341dfc8bbe8755b51f22600,dca5fc31dd883b501bbc100a5760ae0cfa32cb8f248d2e34ce1e453a042997a36a97a36c00b83fa54b0803bb60cb626cb351cf0b437762c37e0b67e6ca501feb01 +e3b0ae1bb49373e41f292f53a6234d3420fa68ee4ac011fc0cfec826341bffa25e305b7e3ea5b12d0f01b30180f1ae1730c1b29d44473de30dbb69fc461e04c3b1d92c2fced33be6713e7d80097d2a4ece2e8ffdc82842fc30e2c0b2e3e68f450c0dfb805c183995d12af5c8b1825e9396bbf2b7c5b19ac93b1f799739d313904abad55a701c3f54e2ff518bf807aa1f24eae66cc8d9dab5b2c4093780253fb686052fbbd1b822023ff96a1cfa89b5065a57c539027fd41e6f3edfdf1e9d4f8c9aee5f6ff1290eb5552a04a4e944f14a8672f69c7d3791b699f69088,049d18d7c6eedd1a593c16565e84acfd693d7e8fdd070edfd2fc443b60ec5062,3894960a5d57b9afdf85c12f44876f581b5c027d041bfee837c2ad21d7edaef368d7f0d5720c4576e7938ba2871fba30f7d6c0d08d00c85635e6517de3323a3100,3afa5e42cd5b3c95424476b4ae096c1b2897978ddd7e8c1aaebee2e1828f51e76398d686054e3cbe690e1cfb3d164e80bd2ba1b6b85d3f73a1bf89cbd86249e400,a200a7545f48df32a4e012c780dc492bf6489238ce2920473ca21aecd0e3dfd465a42e3598749c955453e7ab9d5e680dcb36f9ed9d06c812bf641ed4373e483901,ea7c66e7b25b31a0e67680b829589c75b551abda731367f2fcc41b4728449fa35749063a3107ac41b5a30625e294e70c0ccaf001d0c67bef6fc67f8df5ed5d3701,e2a025e48da9875a9d97ea65d745b4483d417ad82d5a72c1bc5f72446a4239b47056c0853f69e102e4ad80d51ef8353bd16c0ac0fb4f6f836ebd8413675dec1d01 +750095cda781256796944448631195d9ea25725674bdd293b9fe9dd1610faaa6cb34562b39a772ef770773dc9326a4421d781c8d005a6e5d4cd1043570680fb67c156e0bedcf96b246f5cc6dce6fdc4675330fc56451f3ded8839b750de2adbaca716983e910350d11915c3bd97d62d3e2f94da4d63cbcaa62f763c6f630a1686cffbe927e67f3cbcf9d8bf661b4ee52f1098af594fa3338a7cb1baf5ee1d615b92499c29ca575571b182efc9f768b1f40ee3b0921fd3a7e420d951322d75eb4dcff8631602873a0335a25726d0647bf66deea5c4b468f540a0c11eb,7a477544e528c007301642290dd3852207c77e5d5b4a106ac69b50e46b4a1a4c,26097837aba4b1ca07df7e6e6caba9b2e5716975661bfc830a004ab49e45072d243883ff804d1322608e4d696e04e9e4fb5f061d7ff6c4f8141e1bef7a3c513001,d4d3dcbb231753b1e5eb57e0326dbf820821ca10f43e54e377f55e71b16a4f01107f792a015f1b12b0c19292b9ec617273a1f20158eb03d87d0e094f8cbfdae901,351b9a925e0533e7522825b6479ff6ea18c29c5589ecd226f5a85c6ca69a62211a6104fcef8c2e9af95ec64ad5e2f8b9d72f85b4927717c898f48de101ac97d101,b10ae0e16bcbbb981e359883712d0188a84396c22281e72388b651fc63eaf0741f1f1f0f54e3e8637c0cc69246bfe05434f5c4a3f422531df43971ce7b05889401,868083f631c5566f8b1ead135fd4c221a10786004fbe868e3e1bb3ff950f50cc5d801860f263352605d013a0b339c459ea12ba04c856d014f2994ee1ed9210cd01 +d75bdfd9997bb2d60d3351856312bcf1690f0eec423bbcda93a2432004251d7c10904023e7d94007540098a6939f637b173c824829828c9be5466635087d86f8c3c73c9f9e050c238d8cc6d2b98b592be44095597956175560d1e88529b744458bef3e841eb6048b230fd465799d3ef037eeb43cb817937e39aefe8798026ba11f42d9ba29e83b2e2bab039601b4b08a9c19b295a9479940034fa2336db669797da3b818fb201e56f52b64466fcdb8c3c0dc36e01512fd9f9b8deee57d82b64d7a8bbde80291e02d10785988709e119082cae83529ea1d63bf083b7f,98063d25665a108b0569cf12f5d386be79a85b8c6a9e24c073ca7bc5650cd41e,78d97ace1368545e3404b6a744caa0e39778de9c15c1b0956a3aad2b51f1e916317e33ffe1c44812f07c70e2a7902265d8e4f745e534a97206b2a5ca6f16702c00,52e330663f4b3782e0096262da9981c65350ab5f8bcc849bc75619200846d92274ad62056261ae3f8bc168cc5f845ebfbc864fcf74e6810e0c74440ddb16ce3901,a286d9257de4abf50cae1a656bd871deefe976a38a89b8ed9d4f56bfa86a30357bcf93c34ab43c87c81e72b7dd1e38f4e4afd5650f5a2dc93f7bce3e8576716100,c6001dba05020390f587ffca94028afd7bc37c1c86b94489a0980557e1db98832f38d35f5b87dedf84fa1630248444d523d61d9114e8fc0587a2e9484d240f3000,a07c4b52ab5fbab66d8e9d4c083236ed12b834df552836ab9f6fab22f21db48369d797c6669ba3992ad0eeb6d0e9637919d21a988616f56fac3f710abaf0d4d401 +500993a35d222753b608b9ccfbdea6a42c8b03169eb2f998fd95099737cb50779d06ccd466eb8c834f9e9a5db101ea7b4e1883a8c8b58a9fc24489c84271a70fc71878d6ae7b935ca73af176be9b89ec2e26a247596812477528162e1d25812b33a44fbab256c7903b7ef90520e02abf79543f3b68bd72d566eebbc993f42e6d454fe247970a7b81ed7d65fdcd8ecfad146b94c5dddd11822f6f60771f2802be31798b9366c81129671510714c695e5d97ab8980e986db5e825353441c3f7a6fec8641432e17d5dac38386bc4cf9b04bcdfd6ec371c813edaa1dd59f,d3c7ee7ca7a648bb741d696592399d888b8ab6f4e9866a62a4d80286b71f8975,85ca7e8f05e4b5421495a365c486753953a12df9719dc0099bb6490881b0963a2e6a483ba2efc18ffb1d4adab3d36be3eb3a382ac32469ddb7e1d08cf70df3f001,45194aa79b3ee469bdfa56857b3a7a4b89e8bf3aad21c1137c771fe0579a975d48c4a871c0d40588467f761d92f16e93e02407de31421d0dbd0b9e5f2380962d01,2a43dd24a63c14c586ddcabbc8eae72fef0cbc79dc69ef1467e435bc393f21b61fc7b0922d847eb8a870d2898a6e37558695fbbb88a7d3d67a28d98d5008792101,f21415cd961b162dc499022f45c228e11eac6d07f4f7d0ee2b34d8baa4f43b854cb94ee9ecb5655ce3f099098ab543c9e1968f204f422665716cbea03491f56c01,54f0d4c5e9929bead69d74dafc70ef2c98b7399a0c1ba3f49a6efd342254d5923a651dc396bfd31708a83d4977df8ee15a1548924327bed43f29c8f44094516800 +88de6f7a972edc6824726b0bb8615f7506ef454d5e39597c0b019be5f4e6a8a55568648dcf6e4f4a312578d29b6bb1c75962a85ead48d66827bf89efc78aaa017ee8254b123c3eb7e0d5b365eb016e4ac86b1cda54f469a986ef6bbd49c72b5f751f9eafe4c9fa4c42cd2a3adc15c661a1fe5f87d19630a79e56af78f6efefeaf3702df448fb92302cdad13149f3a5068f0d69494a199298ab18fec3e77e981a46ab41b405666094764c740760626c867d34feb2c0522667533b26270468104a6a0570a720788b9f1dc62b12fa5a6259aa95a07a59cea2dddc29b004,8e6d400b45a8a3dff4e15eb3ae976611148a2a3d4951f8fc421961b25c9d5c07,67453c85000fbe6e5cc8884b121c50430778cf85d6e974ef3f6360ea86afcdc920ad0f414cdf17fd23fd7629d9c51730c2b5fb1381e0b54fa95a3c8ab070e55101,46319fd62aa8c187afefb27353f39f15bd4abbeeda1a9dc6e928ea07099b610558bcb1c79bf729ef61f465d3bb828b38d3fb87d6ae1791654b29e3e75d19301100,dc602c963423ddb6b5b904589d92a2c00da007658b686719fcf2cee2ed7cc7d64d1317dd2fab1c4a57a1e73dc0b9c0bede658baebaff5c8e1cd673c9df5ceed600,08e15885a0242ae28556dba92cb406714d3b0d5bc4ff3682e037f0cb8c48587c3cf3a1c3cd89dbd590db6553cc521b6a0300ad61b3ad50c59bfc08f886b3861601,cbaf0bec5b133abdcf366fab33aa0646534b216db4f844acf22566907808940f4e676224556690cce199a20597a93c579aa5fb5120c525b6be1e60a15d568f8c01 +a542031c4f9c4fa7be149612b9f798b89986398066be810dfe3418b8c7ce0dd3031669e3ac408137924829256b602a74a33e9ffe0d67176433eba00d2697086c2d17414a648959e01b968c3b8ab1882c31a4370ef2f442f0b466830d95f517d01ff935cec14f942e54f01c6ffd2d1a6bf5fee1a55d1492d9b7972bd37a79beefd7f0134890f0c3e7ff2e0106eed32f95c67ff87ecce6c7f4eab53eb8fcffd6e1e6d409cd80944bc81c74259d079c12d2de95a8dff7537bc448ce40827bac3d256fff2ccfebef37dc48e2375f6d6fc5fb279e59e636bea2d1ac0ff115,da329c6e81dbb92e3bcc31f2177640353ced93219c73fecd13db9176f3943e1a,93fb178f4d9e5be846f29d95f4c0daae2596e19dcf7c7facdf41e57996447876357f32c0581ea0ac3d2be066abfe90ae7fbd8e2555fbdc34ad53daf1f32a1fe401,25be0d8fad6b380a8067d9b9764f53f4bc2085b39db1f17514d742f316725db83fc1cb5a7f130471f23425b18655a5b7fa02935c013c0795a310f76ba387e7cb01,a46195cc981c66d0359bef6f257af6afa01ee7bdb29fc642e2bf23f509363ae33e77c5b6b00157eeb0b8deee1bb7d3d42f13dfcbfa89d7f2d7c9d612f580b13f00,a0fb829be63fbea878a1a0a718d99765e952a8a34cc8e80af6a448f4435a721b1c30c81aa909fb6e3ea1bb9fe0f6087885593643eb8be1caf5ee3acf9e92c1a701,f2ee3b4aabf180f6f74bcb4148d5a07a8cda17c853c596f5498d9be9d1defb1b631a280be916bf177681d5d56e61fb817b290c0b47e3c0d5b2cb10a334d5a83101 +aa8192a165e265dd07090d74ab378bc80e3cc83367bf629703a2455118ed2762f1e96b1111a4ce8d359ba18366a1e220424fbd6b875b0655138983e099a1ec1dca5a437224f5c7c1aa8a36100c8b345c69340602298d5fdd478c2b846621e31fa2796f06d60ecf19a3d686e39a535f4b633a62d38bb45a23aa2a173840fc1fe2c120b030fd9adc13ba5068a7f73557efc61b173f2ec4f15d2f82ff7aadcb421786c0b9ade8da2e899fa3faa698a3b935e1f1bee058681c5553620f426bd116245320624a82be056d7f94411283cf399553f7058ab02e3b8cd629763b42,49be4a738a4d342fab850be0345f58c893a9938390ab1d285c2e32a3cfe91f04,2707a37999bbcfc2f77c2b11f688ba8cfae4f1ac9b4b31239dc94c82fd1bcd6a71ffc89ea258933f2ea76eecb57eb509e760b33514df655e2e46f7204224a77001,56a151c7d6359cbb1abfed02f22b2d5287931319577b078a0faf06cdba292e3f12547acdb9bd6ebefd3f927da4731282cc04bd04c801729ec66e30ef71e87d2701,62fb0d2dfd644da608ea17113ef60959603416cf2fb00316fcd556a5c6a9a134509434143148ed7189f8d81707215162b21c935f57560ca9ff3aedc85af5bee401,52fcc7b8b2744f4fe9465e2896cc3386c5ce92adf2faf5d01a33ff71e9710c232095cc3c2dd75f7f31a94cc3cdf61f1215d6b39528e847e715983e1d39c15ab301,8e2d53ec9945997e6b25ff21bc7122cf2474ed166e1a87ce039f2f5d7432d7ef66d11bca3561b6e26632a6e10cf3c71f0afb624b76a2c33b795424a46b37aeff01 +035a42e68dfa573597082692739e8ac78cb482d05dfcd0dd0768fb327efd9e7de99528f8e759649dff98a3dec325b3a35f0a8964d9e2edf87f08548eef97b199962a15daed6bd16dd431622eba054f3383a1e88e98797a8509011b398b8ecae7b2a3bfb0b9d1e38f77205eea574033f82294a26170fedf84092cf9b9c6012c41cdce1ab46b5be56b06acc891407c56eff0260706c7a4451155d97ba71f0a3b9ba9e104fa7a76e70e44ed23a73428bebe2c14532f0a968f602df932a495d9364d69e751ac21b907ca3b119770228cd29c0a18fcd4a2f31a67f4c52fd7d0,e20dc563ca913c30c6445943c82b9dfdbe0cc1b0b6530ba240e1d65403d622f5,cd0aedbb047a10dc929c4d48a841ee2731cb76b7904d0afc3366f1dbe3d21ead1b475f2aed2172bae16b480e6e2e2a4ac82c1e0a4f836058ed486e31e73fe89d01,83d5f5b391a859502aaa1d4e70427d1c49208dc860252195a45a01965387b12009beedd1ab06400730c7c079eb4b8687d65ac8f81ee79b19ee3fa50d0ca6687201,3a5081f883c73f120f52e594c99de6b0a6e28f877697b53fa2122a3ff802b1fe492f9a7dda75f6875114b9603b5e800277dbc49dfe7ead97c38537a9b7815e2600,05e88654e4351c629bd25dce3eba44bdd78d0aa75be13c805d3b23bf125e69723653d2267537e8f2fcc0762efa72fc5a4ec7d05e988ecc24ae861ab9f44cb84701,43ce6d749d462843e7e9a81907fe864b2564cf0567dc6bf159662d60a923e0301b95c1a8823c4ee2a23f6398a508f108e92069017cc0f23be8bb88dcdb7b30a200 +de09a9286da17e6675af595325010106367c46b04970c64e7c8fb399f47c5bf030dc5269365c4626c7b032665127e58b1be22b174dccfd25a6c9e3699ea37c5428a1641218b2c135c220111d1534da543a978911e4dbb9162d942841fa9b500748ec0afb8bef5a154ff77d3c3d9e122e2b8422795eb924c1483973b2113f90666766b34f5b8be49e1714d1297de975029416848394152f236bb10d6645c92d36b4d103c04b32152264947ba0e8f7faf60f661c04b3f6949b2b740bbcf05903423a37d3847ac24afd4c853a2adbc3fe3678e9327dff980b6078d7fb7b65,02acab13d37e95ee124cb4dc1ee0a02045fc5d5d42109742b068e15a27364655,2fbf80d0abc64125bc563666974fbdd88940598ba5bfff5812df8f9d2916fa9b30a8b8a50b78ad00a4e43e46a7958340ec21710785229e12e0490c315a4fe13101,7cd8fa638218c66dc3967fc9720c7ffb627e6e1f294982a76f0139669c7f63bc2c0b1aac82dde3eb88879971305d24f0e2c63a2335050f45412f1a00687d171b01,049984a964e44fe94fff38c56d747944faf845273ceb1d2737f1657779390e3222a47809d5aaf73a8fa8da4e84df57dab2c341e5b932fadaa5c2bfa8db829b8300,d87bf732936146c4e4cf0b455455c70aa380ceda3cc01ad03fb6685edf131816142829203fc09748f4923193b86ef3959f93de74ffcc88a47a58844156fe1d4d00,8debc231ae18ac87e4c2f808c78eb0afaeb2414c7923e81c741064f48e32451007f51317dbfc9e203cd3d1ce8699c40dd6a45d1280c75df4320224a0d23bfc9200 +9143911ac563954b64da5da7a975c632cf51a12d410590e9e8fb355e4487b9d9a2524aab5afe91e16586e08873aa233d8e9c15fdff2c19f00366346cda42dcad1b110bb85d5918af8485496da0ec355083ee83a2fc042443a387f74727126e2a354472c7bb5fb4d4092cff05f6db71ee08d281aa738a8ffa4a765937e6af9b43522110e73e4127868f5fb37438d5d48829d6c45fdc263f30bd03c6dbe08bf7f39c773a406aea070521fcedfa3bbf2452bd5c19d0ea676376f03ebf634fef5e5295debb7edb46d10b34ba2fc6312ba7355cb9c67f1737607e717558ec13,9ac5ec96c4dbea5f5a09ac6fe7a05fb3298af1bd9c956b6b6f77a6165ee8a499,20204bf323a59ced07f0d239ba7f262e74f60ae1ff3709666c1387d742fcd778726606cef87b33d198602eabe144af81e9496c8371bf8ef6f033abbd2810870001,f7f3299dbced048e37b5cffb8cf6992469addeb3db383e4a628dcfa17cbf727515655596309a811b874baeda6a643e49250c38d05878d6f339e3aa1fbbf69a8a01,6560a03eba0847114309204e3677ee7a39e503432e8acd363c71a924535e2450511aab201279f52b67c6394c3e29d3729a3c1f516a3d324006f5eb5928d4a05d01,d05a78f6499d1c209724826733faa893a962f501c718daa43055f1de5ba593717bbc5c54ead258800a2a4672db9d59eb8186bcff8656003c8e0d3554863aa98101,ba492fd9d2dd18ab7773219a3be9d9e1b77bf896ab90ca4bb310e1dba4936e076019069fd24be133628b9d435707e1a778681dddd7f74fb7f84f671fe7ca753b00 +2675a160b8011e5d6cf9807c77d492ca70cda0b11375b7d72c3ceaa125f7add0b3a355a7c5e69c9e937f78c62a2c7295e83e01514366cd2a66c9615699616c5d35efaf7f46b79b41b16ce959f17a4834f7f77488c4a489058685405cd6c7f9e34c30eb5d161e840d1c091dca78803ebace72417514e08c783563fae5b06c8737a35dd457f65f70e242330f50b1643b057ff050cff764ee93cac2fc1de7912e1067643ad6f460c9e2b913c99b37a6a8fca58dc93e79099fab094906c529bc1e504165df89972e84510d272955db144d38655a52a7746c04c08970c31670,50568675f79817f5c096f708ca13b447131c29c2c66e8ef906fad9450fbf578c,cbf03df1004ff57c8f9b1cc1f41da8678fc765adbebe8d37127d122bc11ac5610c52728efa6662ce9f17f701b64d2ca235c671def219d062d8fbc6767d0618cc00,b4113c3e2143c0ca74edd4d404a54b344f3ed3c86284d9c1d0c57574ab7d413c626053abbd70cdb0a21d41ffb0106590b7ee3648a590c0c47f86794a73274cd001,e067c6bba0700dc905612bc8d3662f8e8be5b3efad055eebfb3e38ac2908ca6b6640c898704a851cfe65b346d0449e04fc5c1559f11e5b13b7064d361834d19f00,c9560cdb89614ea3eb491a6bd56b1c505b67acb388b83a18dff3905bec6eb60c6037643917bf3161651334fcf0230551edc06699b5fab43cb504b4bb9b718f7100,d049006281b2cc9c20ed1637016b84440621219b658d6814b444f05b2b32e0075ebdc004d227a152de6ac61ae9b51616ca5233729899552e8cb558895d0ed4de00 +0ddf43757d5688184bc984031ff271bd85582854584105d9c459f632b3533a6ffedd50775e2dbd752999d2c4c9ed157c0df0b632a63cd0d202332de2211673c1236bc91bd981e59ce8dca6dee5c97bbdf0d20a838ef67cbc976a3e4c8a1f6104cc23b62e11b51af11903521d48b448ed88c6c85d85f7cb074f4d587549f24d5bae10cb58fccb771a0516f871af78eb93cfd84d714669a5bbb8490e1b075fc63fc4322a3ba86ced2a74b2c5f6df62adbcd16c051f4b69ab952872731b9ead98a87c18741fed06d544445e1a7621b29993a68a6f2dd49930617559f6a839,38b762de3acc4d55b7250211c51b0679f50a74b1f47873d6a31a200e24f001a5,9c530d947c5385c3238cd76478b9ada39822f5dfca266419fb803efdba1b5b3c10928bc881082076eb1b34b224f2080399859019e20cf59ec31f853a98654ab300,ae0f21ae20d50f1f44e3fcf8b119b6c020d81f32364397585b739c9e00dba5b43e1050278e10d4246f7a521584e72873d4607361ffd998cb2486f68474e1422101,1fded825d1aef2551c01061688f562be05e64de4445114db20986cfc95b7c1051476ca50aef97fc77020f4ef96181a67b1f9a8cbaa54e3e3fd479c5e9ca65f5700,2296b4c6e70d67b18b426e975791d1062bc8c58d7e352eb892a38c36b8b06ab32dd8a560b88834eaf0ed8bbda20c67b503d7da8db790e9a4f69a85e9211fd3e501,a2d405e15612b635ecf56b9cced841333916b310896e6d3eefafec9f02c076be74e68a770ac85b25545d4d18b8d38117d2bfe243e87a56beca32f228632f4b8d00 +ebc2e3561247def5377841687a0f649c0059862c98a07755196d646960f490b25b72d5a17fb57816db23c4780b9e4a6dacd11a2d4da97c5d5bd32a334913e0bece69a287c3c968082e1508c2d0b69e42c4dc067f52b51e9befbc85f2af951a708b230bcf4bc78d7cdf57128806ae76c9d410a5a76b82ec02d8ecdef085029e272a0a3b2805187b672c5048ba4991b08c795519215a613c33d7f0558734834af8a18f32e2f87d6fc726a344945654679b788e512b80f1afa758046b8b1b219f25b27e72007bceeb94646ffc96569ecc1d99cf1e0df8323e72f1af27eeb0,943cf86eb454e82d00c67a6cfbf689a2364d48e8c0afd3615bf8e5921f79ff2e,5a0595e201dc0d3e606b8b3017bbcf2c4956db6554229b99b2ace9fe45483fbf0d92169bc96d4632227300c3a29d15af2e84a1ddb5bbee8b5e5c1e740f8be7b901,3b6f2c1e393b674891047c35837485c8d1dea3e41c38e0745bc914900d682d9e49081046811ee9a15038187da849be3854fd9526dc58e4703c471e2a388b508301,d766b6558923d72920387cfa8daf3cb102d741fe6a5acc55102a54a16fbc27f0076515b8d1fb53d37ed83f01c3e5a2e993af72b520767a2084bd6cac0ad2168d01,821c91f50e59f664c76133729931df50dc0218806f587fb1ca4c08d77a867f852f7d2cc2a635e075cdf1d89af863f8fb4de220c290278ec175f96a6d38df8a9d00,bf4d977580ef42ef11f063fcf6d457e199d77fb6c799a8881eaa2e28ca5ce15b03d26549aa5dff2d04c9fb5206b7d05c0653cae7ab3329b0bb44958384181e1f01 +485bd3631f5d12f6c06004d6f47b90a5202181dc293d90be11d37a68e6a0caf9df4e9d5c988c3baba363a2ff4e2ed032fe04d6c23cbe7c0c8804956be94fd66c7024d63115c01ae77eb3ceb7dd2fa49224ddccea14959617b949e8e08c6d4920733efed476cf45eea57c78c6b20574c6556f299f1191703c80d5d40fca0521b5bcb00fc3b21d680eaaa6e9780d25e5a7e0ba9e9a485d766adc94ebe002307563ec79086e3aa1c822861a282317a4778a81b02a27ab35b695380c1a739df04af9d0f559e70ce5afa80f50cb3e345b745c875afdd47257a15b7f215b356f,0a139b80eaa99cf555e2cba7c514ed3d17f944ce49ed50c1a84c689a713d3f3e,c46b28c60dc73e588cc1bf0a7a6da35bf18893d707266280716bdf10f20bc51c5105710af9646a18a02568bef2a8e094f34336a5899e451ce20ce72268078ac100,0ae8fdb413515d484ff1e7452c32299fc26c7add8aeb1ae800bcac8ab20e32450bc5de9848e6482667d51171d24023ec8070a2dd1e81f73df3e1e3b87d85cf9a01,2a1d3a9c9cccf7d3f7ec334200a1abecd4ca23eae9625933c742521eb7cb932b772e6a834c6aed75f4c9197f3cbcc6d5dc2d0b0219247e1dca42f9318e7048a501,0fc22e12ae7c87c9f3920b89c411fc1c70304f40f68c472a95bed3978581cfb70fabec81aa1dcaa344664d62fe8b882cdd643e5217c17f51c45facb0f80aaf3000,54695e88ce4131b8c0326ad641a01b3c7cbba1ad1cbb12983ea1600d113cc870146a18ebd41b633415d5c518d65f46e55e7789e34bb4c4c498df8c5b70b6c41200 +3a7411369aa33ff679372c9ecaf619b7dee16d1c8c86a8f1c5d372f0f4374c4ea4cd4180f9a5e903fdcdbadd96984c773218ffdda07c41b9bd1b1065b1a97113ba0f52516492f70b3f2b3a8f08ad21ecd4514664b591e55d8845061230c966a6ab5ed94a22133ae9aec64c36b876205db29c3a21fa370090296428104aa31f7d7174d691db124067c26a96c072b798942716265edd2952a34af17033f4b1036ef57f3ea17e42230b9c09e20991c5b9da2dbe3f1703e3d2b0a09db706a5536c3f94efe39a03542348a368ed3509a7be934794fc2367d5f42f9f8c436a4b,2b607c80e058f15158830eca6518c0058f34d49072e94985628221dc365c8018,09b27637427a663c9e82c2c7d19bb94e3dabf824a2fde78ffb750a43db1c268268b5e6a6f1dc45b5c7d030a651317349dd5891ec1ff3eb0e2fb017b9118af79500,e71c04c4f426f9346db5c3d3db388716c5ee1261f9a1c7aca286717c8620a6e6538715660435da184860741fd8abd217ee1606b50e8d0bd3bb9f728300391a2001,dbab3763d9971d6ba97889562809c8075be7af85625971a66a217ef68cd38dbd504ebf5cc6764d6b19f7b246b8cee15246f60b434ce13dc3c931ea72e4cf3bd100,302aee68163f63cdc80ac6c38c71068f3ee762e302ad35d75dd84c15fa3536271fc533fc241be7cd74a1c8b96c91075b8df74f9b814966b2de1b0e03f12e65db01,4d2a33efaebf9c8ce1793bc11494f93d40cbc40d0e2d4236759a5e328a53f8b67e0fa97f099390e61304308b5474ef20b325ff3833b509d6d6aa1450010d4c5201 +587a938e0a2902538723ced61c4ad77929c55fc610001a71ff0dcaf5e64739d439fef10ed12d46e1297a401333f67c636969506d16d26b751f35dfbb1cff53b33cb4e01ee39d9def20f84eec855cbce2fc581af989e155c91c0740fed54d2eed0082967dd503401ebe703e964032be5285eae0d4a3542b6be85463db1ef6398cc2d97b1c5fb3f0d1383d5b83225eb8cf7e801d231467557463676be7ee69deaad740a8e9efafbe5960662b744a5f7bb58d566d1b43b891033040ac23fb7ba6d1950d0899c213baac894345423fe0b51fda517d43136e935152be565650,b0fe740e20c756d6fccd30912eaf5839f193e6b7db2cfdb7265b9cfb80ee218f,c8f655e2f5a38d39e1e78125cd06e099806c776e5ba3acca47809cce407369ba23acb4399a4c38e92e2476be9e0ac2aef6c821509bbff65aecaed1ee1e188a8c00,0d38f01e7d7079e5d1b5c97dd390533b1423d0740853982e64c7ee6fd3a93cd8356b6c84ee0a602c5bcac73dc4b5cff3fb913ac2c6d8927834f8526f740b54c100,4a73d4e58f4f725446078f6464b597b681d7f749cf9b3a237eee5410a17f96112a175791d7191c0b4709ded5e1227d2c6a955874d9e78f7288bbcc066e8d848900,37674d342032ec24c04aadeedd03302df3d3d30c669f5c01405070a8a62f15291d16a3e059b9817d20e7c85f3887ac3f2d34f831715edf2df252b554d1e1adc701,384b2ea87253f2f1c3cc490471ac82668fabc47c5060c1fa227f0554611aee445fc3eb8130e65bcfbb3c952ac2853d81e90a5538e20a40e26c14657c4fac1fae00 +1c385174ec5766e7e17e7dd9a14da20547642750c99425d43d60fcfc47733f46945c73aeedf036744b58b7557389cc0e187da084b096ceb0a99c3d4ba95fabccf34a185db9eff4c1ac17bf9c15fc8cd3b71e24b534502b0793d6eb992bb82b5bab7a6ec2acce110dedfec2b052ee1ff324c02dfba28338839c96bffd8e0ffbc93749c23655e4be26a11fa0ab5d19adcfd4e4afa91c97f9f0b8a5526a9ce06d4cca3987828569ca75807e96b279a253353f171378a53e4f59d2231acb860636098b58725f23cc00a84c1293b2cb4fe6b644d40e405900593cdccd6e49784d,2d0b228c00e5ba9b146b260c44d4cbc60d4d3be575cd19744ce51707acca6964,8bd31435056707fe8294f00edfe05e2a63a3ab9b4129d3e20decc9ac8e67f4ef7c32481708e24172b38fba109f76afb40dcb52be31663c6ce19d2a47a8cc283401,ec51a68b94997b88b8e37df96bb4ae1023fdac6ee2758c6c39c6bc815559c11e2952efac68bc2bdc2b8194bf9aee7b315fab40969b9c0c72018718089a6be06500,0adcecf1b52b4fe6a310104cef60565b4d2e066282e0892729c98a9ae44aaf6468c7f0c73d946dd33282d43893b3ae14a38caeef23ed9ba8e9f98b7ed8be094000,77a23f170d028134a890de77036dce619403fa62b503837492bdf7888ab45d48161f0c757413ab11f66bffedafb227788c1f6aa1141afc93e185194f673233c600,9d70984b91c0b9f833243b799ddbbb43c50914d3dd7a2e9695f407b6cbacbda14a88141ea44cbe03f2885a5cdbcfe795ab3c0a741dc083777fd4784d8b43328401 +a40eb4429d17c2a7d2eb993d6575119977762f7425a46b256036d720a6f1a233094379d63349b6834e561673f8d2ac48f816721a39ddac1aea4d4096e6f0bf45266dcdfa9ad2ce3f0a85bba551a0b0eaf67c6137cef28917f0901bce2b051caa7b633c9cf460813c804a284b8a90def1b0972fd8cec444f97d96e552f140fca7ef630bbae506006c1afbe59545f991a64b33160d3d3fdab6e8e5386acb7b5a8a4f63abcb54ac0cdb15d9b0ae6b40ce3bdb751605b6a2c1a1a5977d53b01375f7d5c42de7701fcd2867dba7157464fabf2de88947ab514769b00963bd2c8b,d93e573dada750683fbcc840f39428c8e778f0d6223e7f57b45facf5698b5ae5,f77a138b564fcdb776d589a3153cda07dc71873b8b1c937aeb352c931b81ebac10882af0c260989efde3d427a8e40b8fbdd1740d8ac025754a373eb74a5deb8e00,1df96a060d39308a02c6912814dd5927e57332fe226d4c6997556ccd86ed16be40eca2f5408aba9039be43bdc8c35a38a9400bf064accca4a45751e4b6013e4901,f1eb1e63a16716b27a02f8dbb37d90f9ba20909e16e12499202ed696d0da9e024a4a9e0b9687d1c4a57bbdfa39dd279df075c07b1b7e1220e668b45d19ba3abf00,a94a5dca640152d2db7da248139ec024c73142fb1918f806f559c32d6969eee755fd79430b9d1c21ad2fc1a94af396adaf9953445bb230d6d229e2e2d1dd030701,422c3dd416c633b07d39cdc92b52a021a56fba52fa7befe4e88b53b2d066e98374991f12bcbbb84d396e101f0e12a4806435295d81352ba870aa9847da1b74fc01 +0173f6fb093f6897d3a732dd6d7cb6cb65e3046cdd6ec2933e32710731198ba4e409d8dc0403df16e7f0b57fc0d63b69c7c5da4f84ec50417627764189367d752892a1f8fd85ab5414b33bc3363289d4182c2b1746b740fde755651d2fd47b98735c2154745331f81d47b6ea7462883929f7d9a1202e9296dc7e149e43cfc1c4be5745743085b5162a01abfeb4e3de93682a9d16a105f2b53acd3f7f82e01219218e06fbd25d203a141a3d99afa6e18d8d64d89b8e0a65582c01421c13d7228a5876af6aa6df8e9c105036584774f163bbaf0422a932525c841caf5c29c9,de06708b6a1d365bf3dcf17e7cd054262a405607dfe1e512eefaa8f9491bb8c9,6676f0da60f9db0be73c5e3e11c1c639da5836dc651192e599d420aa288661d3336d568abb3a88e4cd0bccb5864b6501a8ff2ab84f9416c3319d20b2d818ec2100,c5f1af6ff93eb7dda8d9e608bd80f9eae5720d80accc81bb534e991eb2d1996c524ffa0eef2ba7a53c18777a3cae9494dc42cb6db483925c8065f8a3f17127b701,0bb4909872f99ba3ed99142e62f9b4374168709d82f486ff14760b0c486f7e9f3299616da2558790039cd7e6c0b1afbddd58319d1fc72f9ec8e1058b8dbe204300,794bd9bd557d70594452e5ef4fedd72bd183ce9e99762d8877e84c5140739980174a445dbbdb67296254f8791134572a0928dac898ffdf2d6067e66fe118a3fc00,fbdcff914af7498abd6e5265302d697b909769a8e8cb237c6cd68ec20818c38d78102a852486f5de68fd96c976f33ad21091475fc0bf1c51bb8768b4adaa96cb00 +1116d96ea0a0c444471602ca15a9fca1ad0ac7dc3a79d9fc935ae606414cc0333459bebbf898a9d4c568c9098e4929c4252e09dc1922fc2f163910f094fee780556f5d60c0920b9475024ad8add4b8e1d0dc63f37ec2a56cc9ff8bfaf24367f10a622a75d7cf878c00e192a83c04000ae4de961e8107a24350cfb4cd9b540530606d092bd314cb8f1a14a85a2c932b8c2882ae12f0c99fe255182290ffb1da00c21b549dff038a0b55270f6b1548e3931fbb7d0a2073a940c72094d8cd69ed17bfe2e8f3d635c322770952fc1b5eba481d0d9a431ea49c46a7678937aa4a,94fb44be5757f2c8df08ca2bbfabb5b616f678593299ecaf704e6afef4482735,5dacfb420a885bca00a81a7c0cdf9840ce650bb935ff91a678f2f3b36ec1760024aa5fec9e3e8717c524eb254127fc8376688a24769917b271f961b74a43a9b001,8ad3f103749a959ed73fa6cc544ed77f56813b5b5aee335c88376a82e70b8dbe0180f973c563426a0c7011c412709c0b204a2b6102abc20707b6e73478b1ec3401,fee30af9ba27636b38dd131d93c4ffe429f1ac106c226dd4680b380a8ad8ec2c0c7c6f35deaaf749572ff1aa31cd7c72b8f651af3b864081df2216aa7946665400,75295c392b33953df64b9d56389054d1ccd7890117f0b9d034f633a6a9d91f172a4482f1be7ed406e27481288c6008a68b43340dd00d8cebd6e4c4dc65a8b69300,1049d9d53e7fa31bbac6ce9257a6a778c739565c20d98e2763e880cefd083439752dfe855d0b8ca3726ba3b2e89395bf79cd7940a66f46afa35c189aa3adff2a00 +87b523b42f34e768171e86027715b256970c404e2330edd0eb0df5ab5606192ae9e2dee85ef77bba28c4375e5c2e0a723f0c7981eaca8370c4b56aa9fd16d5326e8c78013744e3c057bf55ffa43dd1c99bcde415aebdc77c8693d24eacf031112174b5c38c13c73b1421b322d4c37fda53bc924d093467ba04ce509db5d935ec1b3d08e677cea106506c0bc80b3625177a371ac8d29ca0d99fce0e83d45f93e049db78160eaf7fd5ded1e71c1418895217505c6595ea604783a2d688ddd64b857943a69241585894a21e40069cc25e7f6620ca013de8be9293afa9220896,023b252a22ae155d31cdeaf8b6ac987a41adf1106a601ab57d678aa1c38ccd5d,4f7679bb82172e3a294446f828f4dc6db825eb00a765e79229ca13bd045746e615d87ea0bc95dbf26779031a111a289f0f0cd77ece417c11e0139142b7cd3efc01,04b77e7a9ef2a5c7b39c328e8b01a9da8a687ed5030eefdcf8d25a45e7a6e98010e6e289b9022184b32f7cc4060e42dc9c0f8bd998844d4d7cd49417cff8350e01,670ddaa6fd2be0e72b4b06b2fa9bc12e1dea7f06336fd9e8a318b711109198c9211cbf572f6386d1ee8c85a24be96070860c790fe72f1d42d3c12f4ff136a25300,74291123d422893012f72276ceca19c01c88bd201c82df63009fb23096a5e2833d2ad828c1bdc34e2658fb3a4f0643e5a3a2070de315e78975d46d03a41de1df01,1a841ed237ec9dc195708e2a9064d31945d1c950bffc497ebdf22e7c997934365934b7fae92a095c7f001562e568e5f70db14b953d6d971c1726d373c84f445001 +5c88c2885508fd758e9fbcff3557b3dd69a03a5656f98589b76fd9686767268c291da0fb33a90d243e64562adb2009db46d88b15b644dc41ab3fb374b80d6f5712e0b09f82cd1c29cd7e3b1b0cd528ab024b033a1f66b4ab2755d6eb988ff3c5a421c6c9bd30c3077b88bea17b194ae12ecf1ab5b1f1d2022983cb1d956dbc7f98390a191e697b18afa5b9cfac26efe7797f059e101268701de19db2ae1485677b599d2b40e645b629dbb4bddce3c83c72edf943701d2af13fe6b6ce833bd4395319d72bc53154733d2b03855028fbce1aeec54bfc3dbf3b1ead99377cbf,810b3ae6b3402631703e1bdf2772872965b967692cc6699d74eef6fbb7e35157,5bcf80fdf58fea6d627b09dc3028dfc0644e86e544cb0c95e07cc7f4d76cf5993dd3b7b749b5527b36d7140857917d3f83a157475f1a492109f11d692374719f01,8b9067f92254130c0e85c5e39cb32fdf85de8d694752bb9b2138e99492ec04353c4d2b5410991298cb0525de1282c9a8077322d349a813791f499f7ea0027c8301,6d94d868891b265a1f511ffde9f99ff453ad6c634aaa5868962a1b405a8bed5e0c42c467450ad31fa3c6e649fb1031ea54a2a6fc4721e6136ad8d0df996d3e5401,89ebebaa392fd195d07d0f027500899bf332947a1ad456ee6d3094778ea0205a23e9fb4d58426cc12c3150b1c84b4c30d96d46b784a62a5c4c2332d38927e97e00,38f1ae80c15fe8b7ec839ed34723fb03134198e79dc92dc58d57f20107451b570aa39764b34a77915dc66445ee4187e28298b892534ddaa73f62dd728f69973700 +be12269fb0a8dd9b49f9fd4251c7749d156a85a6a58a233e2722940ea04024268be42e0285b36a3c4be12334083adf9a2fc0d2556c8ca031bbfdda522df2984e99c8228940d3d1a7d26fd1de291b471d38c55f52a948ddad33312b822a57d3cb30986fab6688a2d2284e34ea54a311d43b8c3e8aeed5ea920945904b9570c3d3a646535a1c87b59182ab188dbc708272e38d3d890cb380d107cfc9212eb9ba20a617f03d2e42c55b04235e767d64915861af7e34de89626a55a20de7d32ba9998af65150a9f9bebebe1837c970394d874acc5478d4da75d702a118c87d5f,e219ea600be642d4d61926445a6b189fbcb226b3b94f4482b2bd09ba2d92f40b,672aac31420e4adecd0246ef00c8dbef2d97178e6e6f0626b578a4327b02b74e2db5aa1fde4d53115e2893948bd9f8a52db703950e702e9c2db59c876a3ef7eb01,916b7e26a9259d431f1611bf6228b13662f3688e921bc700041ec20e2a17848b68d40633193c40d4d11b648fb3fac9da195e8e7306a731460dc58bf23a9325c401,39aaa5055d7dca0ab1b0b35a34d593eef563626d9bce177433e8faf7e772d75e52f52c034df2db57d7c0ffed5a9e4fba6447e4c04f06a7f0835d9d0b4036ab8401,f4fdb5d6fb3027299a41c32ef356fded4cb085f71ac7575fc40c23b3efaea8c949b57b04894d31cdf8bf0cbf52276e7498bf92dee97b00571a321055c892a24701,0e76b4befc6112548433d8439629aa40b08939f7917516b77736d3d029d24365623f0043256d508d4ff0ef561d3587112963e3dc66ebaca30627dab7afcf6cda00 +220c5c97142accdc3775b80609d24a16b94d1c9cc7b36200fcca9df75383d398fa0fe549653c8833a236d1053bccb670f87e2dfffe02dd71457d80f3addaed6e8fd374b13b344be19c31348d6b9a80362dea5f5cbfe688aac41abf53c50de283b756472a8b7cc787708545332d8f1189b5ef0ec47c994df5d5022faf98b29f660e678c9553333ef764e41377544ee3e4e5cf3418a20bd897c8661e56f95de7fd84df97f2f6c4cd2a5e8ede7a729697c4f6247df3a98ff830c18f25865354bbd55f7fa2585b5bb6db2142cd87c39d3cad943b4029d441dfb84b71c4bc197d,9f36c5c75247521494b10d7a8cfa3294ff50a9fdd223b82f50eb3c22678e5768,2112ec7fdff22dbca3e805889236eb2f6d6c785b708817044731b2f52d127a1514a0e44315e95b0f58f6d31a304d289df435bcf7f15b509844236dac7b6b004701,8ce823e02f8834727a31b727e1ad6539dc6d7bb6f90cb89cc111713a36b4a4ab5eebd86adf5f8ecc4d2a907876ea1e3d1b90fe496247fe402f65f0f26ad4497700,24fa76f2740fe2ffd78ddc1700778f7ce56e5e84150c26592c01a83be4ca90b16e62aa3f6c2f88270d1fbd5ae0ce08ef31c96fc6885e8a81d3bb7f320f0c7f0500,70a6a1af511c4f2e4710e4fee764b285ec76479e81b965451aebe09ef29eec7f0e98ee9a32307da62e10a9506bf88d8de18ff26ae3a2d355b3226a437a62579301,415429bcb259d42ae1dcd0673c0e87e6cc5cd329594c77b5f071c39ad8afee1b4957dac741d760d7e8fff7a5300ff5ef7f26454c683514e120bd8bf1ca57c33d01 +c9ec8f5505a5e773f0b61aadd2748b569ae3b34c7d94d8e79e0c311974f238e7e42bc2971f6f8ebdb81727c3c63a05c6881614dea44d7a1e324734d7540edcb410c6cc7ecefbd0b88ee95d21661c6709235606b990dcddbc683a56c48cbc47a8b04329d0e5a389f8e92629cd048247fa8cf60883fae4d7be7f593a36ce701819d944342768f92dbac3a2050e2400db75798e321f942d793639d5a523e4bc674a527e49748c3ac159223e704f8403ad6a4d4064ea96cb922424d93f42acfce041584c1d90a30ee8e6fe7abb1ea0c7b9dd063c04536967c61a547f4c638387,426464fab34e38a41153fe26b0674f3d47b5984cb1fa39d8135f317ccc65b9ce,fed6a7e2330f09cc8d573b609c335f85f0160049a428f6529e53598014aa8a395e1e53e10fe3fd9a6cc26c1bb6db4df40e174e0031bb607d7ba23c077138e5c300,66e702eb170ac9ab8e9515f394cd115cee788fe5b6ede43421efff32f507aa6a38cff63017659a0f9b8401fa69a7ad3ff92c9e6a10fa46b25e805c08770ec79900,2acbbb15b167613d1f5ba7f1f57266aefb5a038ce2bcfe8b99943c6d50f7d6c53e938f1ea7d1a42f7192a333b4bfd9f87bc17fa49430ab0175eb8850abc402c100,a7543b7efd83c6dd80a9386ffe5fdddc6241842c332aa9a602dc958422e71374730d273d0031da76b62e1d78998cfe65daece18a642e329fd8a09977cd6ac51f01,52f062217590440d28607814af3528f6f9d84391472ea9248e32c247375887df45436df4cb2fe3a2a56a5a99af1b309b8300e5848c143b512380aa2cac0b050000 +4bcf0014800124b11fb20885ff640a74a14365fe187c503b22d6e2f035ff54f4728e9714b341214a95399c96b7cfe25ba2b98ca68305161d7cdb6a2772eae00016bd0610cc316e1c3a4fd95a4e68eb2aba3009f4753548f38506a3efed3ff97de95286726a7c2a4cd36d8f2960419ca3c1418ec02e6262dd8f761799a108067434bfcec6c6831a98c9f7fc7373090131cd3e80e9fe4a7bebc898fe0fabbcb14e6b846737ec7aa8bbb88993498abf1d73e6bc9c55acb2be63cc4e42254d075098f6452e0cb1008b54e577c775321e6b56290508ab57f7ce26c710b1227f6f,0bf7a5587b2a0798f569602a1089836df0cef4ca54781d810f484b9890539953,a5559de3d5ae8689c50b2ac081ecca4aab4ff05cb44413cdaad11e28e5d44ddb388cbe2c24a054ca2edd2aa1563b2f66660a3881fdf297429dcde33d316e0c5401,95cd04c29b0f28cac78a1b39a545ffcaea1449013df462619a7f2eb8edb168367cc50e030eab1c0dfece3a4e81075bd61b31d1bca5cc798251e2d486ecb404d801,6a846636b35f18f0c825d132395499f4d61ebb151e2c7809e7dcaf21c5c304b83a87ac85f74505c2d842a969e078cc2ef6bc77b3ca9e6e95fb7cd7b84b8f1b0501,bf573b5941a9400eb9290390cf7ab9dcff225584378cc4a1345a4a58ce3dced204a917bf92863686b346772d8a5cf90594af8b8106beccf573321580fe54f05500,e07a0ed25c780732ddbb2d34ccc71e1a78cf735a1183629bf2a59cf3aa7aa46c4c96dce33f040f2ec90487ec7912dba5fbbc54ffba9bf263ddf38a7cba73673c01 +747dbf2f015c6db6d4ee67a50381101d742c8a974db8002ef4386a16739959482884062a2e0fcf3e887f963e9da2d2ccd93af4f27042d10cd27190a7a61ec446df5a9d66abe82b2ee09903a876baae8c21abfdcec3231337d738cfc0d60f0e17718fb9baaa4eb9aabffe07f8e0d91eb7f22d27b481a1b9b71660182136c58fdc5c017e5e0ae3dc4da98fd07d9bc9cbcbec8a31dc727fc0d5e3f6e0fb0444324482088cf195285263b7b932394fb307698a4db94068990c244dfe6794f5399fd0595449e6417c3473a4aab66da3cef859ed290746fd1c4ccc08df1165609638,88b910b0c7078182fec83ea48084ea6c7691487e3a00da6ad05f19d870685ba0,f88091f2de6dc2d9ba6ff07074e3444ef6387dd2692053ec591a35eab180f2df42be450482661fddac98f0a476a62a4f9f563cd27f1bb5152afe1a7599dadde801,9515ac4e2b84a38b25d936cb14c181b226721789588767844103ebaee6f1861c336daec30a66d74a11702ec31e0c3301aef4d4e8bfde652550f0df4193d82aa300,751a0ffacedd2425c562dd335ab07ade2a96ff15d737326d0b1d628eb0226aa04d48d168ae677735272ee50a087efb5d52c20304b92d8f5dbbbaf8fe25bce2a400,b533856130fa883cdface6fc64430d78b27eb63b7af27f57aaa388cd6af975f52827447fe58c64627d0b8ae693cf444039667ced4377a0d6ed21b8430757d04501,3fc457993bac1ba97fb9d0efe34bcb4bc9507c87d2c7a3a6cfe4f98cfd4d6f4570e700e3170108b5ab9adc291f03cbcc272620eb86b82b74ed550e57f60708fe00 +a9411fb80859a60f1944ef767299b4d612e795fbdb2895fd4e52bb8dc23cb71de34a9272007977909211eb2f7939a937834b0a7455abdf39fbc3a3e4bf53e50c3ac96bb404db9d045fe0052da2917325c2f3eab3315fbd90cb86db9df32abf10d8542ff4e7ab60ca1143da9a2ac586f18bb59e162d2476324667adc76ab95b47a4f44e31e4039f286ca9ff74664caf8b8e454f5182b10c18952b465160bdcedf979ac569194791b6b5ff90274ebf1fafa65e5fa23ba09c236c42ce3b21430a54f119c8cb4b8b51fbcc8741425c48f66071f2fcfa9b6225a11f8a2d96230239,cbb03797cd6009b9c07a23c50bd67103d00006904b56a1adc87b68e53bdffb79,00411eae39a5d68f43aee5a3499b808793439a50daaa82190889cbdb54264583385f7c726c572225a75fcf209e690c8f742159b3f98295c5cafa9cacfaacc80301,af6708f26cc4b7b58b0eeefb396776c145496df94ba6c28e8e44c21acb2f547f557658ba997c1f7061ed4c6c0c8bc8ce8c0e6a346932803e30585cfb88cc680201,48a127ba568dfd1a2bcf5ba66ffbac5f8b31d9cf1372feec98eb3f0927920c4613e6e9ca2ad4b4b890cad954f55b30e624aeedd0a58d3f7da29c442f0f3d4dda01,cbd07b12350a9cac7f4b215996965d66590ed9f2ad4be92e2bbadc58a7fe439b1e9c8ff9799be4cc2a26254ee8bedf8c74a8559050dbf9038bbf0ab5472fea5c01,a1ecd363fc640243bf62b9017419dc7ae3904b21554a7c5735c6193f986105145d76838cd24c2e1ab8207e78b1d5b8b82901679a7e125d527fe920f594489b3e01 +fe84c30ff8488212043b655af784cae0cfb6ce665f450c5fff2eb7f78ebf70720697a9608f40bb1c6a916c28532e276113e606b512b2b32eacc3c6545f375dba1e4d9bbeac8b931783790db1d27ba331f7990aaa783923e648bac111b2b5fa132cbe7e4c27f9dda4073399258b1e2538515dfc6935deb1ffd02036320a9bd4546123f3cce5d95347fe96c0199b1465a6e2895c1e07cfbc83decc4b2071c52b1d89a29dcc9976c96ddc472148a6727424e7b07212f3712c6a7458a732bc580c948b046f4be9ff7c45725b83eb86afd797e7fa4769365f6ff9688b8df0852205,3ddb307181276b7bc1bb593105bf961973ebbc9b56a77ee8d62cd2737846e7f9,d9e82d6dc9322810ca90046bf823e6c9f0dd50947b104991968956ef865ff75e4d780083e413c19a15e72a0f0ef1b966426b16a00c579a7df9a9abe1466828e801,df2109df3f1f91ff49ba9de1280df22da6405738cf81ba6d64e783b0a8ce624a5b9db0f2b2d76f35dd60e9ea711265396925a454fc2dc6e18b959bff3531ab3600,8c32cb3932936080d946746d784d817f9f0bfe33d89e7d91cff0cc5417e57c68581233cb3bb77317a47e994eab8791c6fac78f6a0148c7c1ff6af0fe3fe965fd00,d043da8d316a32608321fbcf37445a5796866b0237ad8a6e6ae2fdeaddc1d1e46b702edfd1525a33fa486693af5192a703b98be09500ba93111d6c2a1351b39801,68f6c26dc86fca8fafc2310ceb4ad3982e3d150ab1316a69d60126f6c923a8035d287933c1632ba00225c0dd5ca701b1c27415efada3c8cd3c38e9bd6b73996f01 +1fbae6be6cdf06e5d34f4949f1cd4c649b4d84baf6478397ef331aa043dfe8e72a72123a8cf1ff94c7e18403808ee7987450179a71c87cd45eb69b3bff490af92585fba11d2d1ed30ae0e528d2390c2c6229920ba046849296173659672d98430833bedb96cda904213435967c04f3e26596d81927844650a13c568e7de7316a236ae5994679f0d13373d7d8ecd0ad5f43721a00aaf2c458c87ae64e85cdf4aacba314d16cda653e686b451e4b1ca784cf4479dacdda13088dbc0f2e335559b01dad024e445687e20a99a86d3e87246c210c9efd329c37f3b7369146e0a038,dc8364da04842d59bb6a95ce9de8d0390e57b743ed601e80ab39362bbc6de0ee,134d0500ed2bfa5a5e8211c305f8b3d5fdefe38170e037517bf854737fa0caa8508840e6d96bc594ae651aaa47a2d24f9379621c96b87d157c66b21ff2f93a5500,87bd9268ba9568940145be65870313f655f12065c3d45384f69e880798e36e231e04347ca223a32289956b6c38c6f51a3bba305037f8257c6f7a5f65f27075fe00,721ad1047e60276d6029300c699d8d31b15f68fee9568b27f2a14b68d5e410ef39b742d5b7d5b83da4fe195b7788b3a678d22b1329558b0e49cdffed97d235ec01,38ad5e8f5f1fea0645bcb8f0c9e6b4da00fa1a0041843ea89d1bb3c9f78e936d4561b966c24f54ce1e5753a34f99f79d803789b52416492cb61c11e4b6731a1800,56744faa55d4849c3b99968a83b8395c3e751e89e400b7da5ce50322008b053408fd63e50c54372a1c97b9a014ee51be2c48116378b4fd2bf0b4f3a488b1867101 +78a1064426431d2dd22751d3f097d1393620e330eed6b554db06d6b5894f6e8ebfb1466a48255b9504995166006fcabdf29dbebccb38936875986c7cc38f12c580527920b2bae76138a061719f7f43ab425d1a7f28ac31d9aec3a3e7a17995ec8fe48261a099aafa9f5543442917d799bf13723cf2c31ca05b17a60e79ddd26a5140f6123d54510153e88c7afe40b2f3cb8658a75e2225a58d498210dca7646ca33446350186a4c8c48331f0a082a1099aaf2adc93b0a06daf134b24b1f407d740bb43b35a49a2b4ab1e72968b7c6480a0823e2fe533b43db4873c5859f9be,2e807e3af4466d7742fb079e34bf857593bec3539e2e3dee9f2c8511852b66a6,cb763376d8731d085bb7d24c2c0d6b4417e40db7b5a0c37083321ef17274c00e64007734693007840822292286bada5cc37fd446559dd90501fd9d58c1b3db8201,e7129100d36d7da6ccafbdde9e4817dcc5b3188e1b16191394b62a39eca335b376acef826f229a5aee2401032d9ce01c38f705c80c247a7ca5c62a7da09114a100,fcf80230983f3e63ff100a47bb02a1753ff7905e8c9d0c2d21511f6a23566a923afa79524d8ce17a9662e5ddcdbba2aa67f79342d4d805be8c28b1d78de381a101,19fa20e85592813fec3d7124248e678bfb246f7c4c3e0e7cc64a5b2e45e6728f40304675b557d3752829ec7caeb1900b62136059d0b122dadc8822024064c43000,ee75bd12334e928164e5b81d08902f30f0b31fa9f89a23c87139f08275b1f52c0734e0d3df9775ce86a9ab0d56fbc303c649ce06c429cd81c5e553c28bce398c01 +7b1420be2a92ebbc3473c282f0aaf93583478f81e162303f1fd450ce0744cca1f917f74e628bb326a01ce8de3dfd750a1dc656e7fc858619e003585f43531fc9838d530d1ec695ac736aa98e77cf6ebda3cfdd1af22115c3a92011e181bb96723345a47aeb565c723bd7211cd1984f7885a5cf7f1371a77094df66451b01c6aeff2186cf6638700333cc465e7a6ba62c6f5a5acacce2b6edd389ff2d5181b252c8bf62ac89afda6d451fdaab149081735c3aa638905b7c921b2f5b02ffa45c5f296a2be475d4beb9b476f492f8726c1b2bd7f4dfd958301183c157031bd2c5,f5a206c6bf83b451e0a44181c515e75979be03352b4d7e003ee103dc1417d929,c28948eb34e34d268fa2f4cdf490737ad3de9f8f51b26bd6156061a819c92c5702aa99e3b613f0cdb2764ec1d12598947b8c054b991fad4213aea01c0cd98ea400,16405c153e2139cfa33d0d30a750ff9fddca30c601667c9f1af67d3f0a2b14941bacc7fb9a590743c63fe6fe229bea5578e0df6fc527bfe6c73cb4d438c199af00,dbf2314b0056907f39635d95af3ca576ec99142b75f769d73835af41ad61da5e47dee4b4fc51b1f07682dda992a13a063df97627a31bd9358a69a16a2825a2f901,4c8b1e4f4d9a6a861fcfeab097b3ff223bc17211227d140d5c9293d232e1fe882132f9553d8e3047d1922c3b3b06f9e4d5049dac40e30a2dfdce3176cfc2034e01,647b83e21f4ce732ab7938972c6ad0e247eff26ce3532eac6b67aec13be53f1556a632240792661469756da6c259465a58051e91c264b5fd62078800ac553b1e01 +482117b64a0e72739b8c50ca39996f47a684e0edd4ad8711fdb6b9b04a2a7e3927434c42f03cb945a68e2f3a68e26408ce0e059b7210610266725c94680e9fe59d857a55e389a58360b87945cf8b1d5c40d67ec3ca9e96902e9c1fa8cddc48728ad915d75e5d1b112e1886f66820ea3b7f19acef14e36ed10852c0ded2cd261bbbe144aa2c9be43466761bf3a758512603aaafb17dbf26c433df8b113c688608d2dc3485ad1a9af69aacf0abc4651614775e3dee84638f7db959d844b6b12d69e329596cafff369448928c2f164876e6833a59a2e05622b74b5e98c25e125a,4053ce0cae465257ca2beff6b350c8991ed114abd0cdeb3b58bee466a9b8d8cb,74bc701672e8847adc72d6129a90674e4bceef7949e43324e13607ded333a9053933cf77311257ea511d2543d8d4cc8f97d2bf4e57de5a894f330c818921fa2900,a4517c8def46bd8b034a5ee7bbd9b53e6eba3ed1846f0e16362f62fac1247edd04588b54e1ce1ede3582ffe9c042ff150e571d0900ddfc226662c668a2ebc54201,6dceac70d310652ed4413730e8f2b9ba66d5a387216fd3986746c5e1e23e8d312917b407085b7260392e1cccaff312ece071262d4a22adae5405161adb7ba1d001,1b049365c08776ab9af5a147617cb0a5185bdc936735870d3595878dd920b6ce74e27d8f6c11796a9a0b4bf0a14d1db4235440818f5815be445f161782ffac0701,478866aad1ad2ed3a5bf8e42177ca36bb39c254efcda93240f81dcbcaa079c183dee468c068ee1976d7bfa77d8e0ebcf31ecf311633807bf9dbf8bf22d155f4b01 +4d075d328c57e6e52237f5566d6a3d016e346bef097e2d155d460d65a58cd4e43dd97d667490f312cb04f33851a3198922909f6391a2aabe5b291c0b2675b43e7857c3bdd597040aeb6fdd587c2f53952a0fe4ee183ac05ff80bf943b68549f756a4823c1b82d40448af130b11a0102b8b9488c9a7522a3413e784b00b98c656e7dedde1afa43e533681bfd69f53cd809f8f203bc742dbf3dac899aa90ce797ebf0603999abea8c6f4999bdf6827ffe936f749a118c3b43957c143416069e16b7d303eac2a77b8bb0570440a9efe5c99529bae3e24689f0d20f9950edb9801,75666e484fe22ca126870f1d2055b069b958eb4a65048b72c70ae1150f933a92,18b38644c78bff49004979d23cdc2b47f34f45e2158f8bb3d9f9f39753b643ee5533a49ffb68bda9b21f45452a0a64c8d5ce83f32f478fc9571ae5f6b784a06601,7a2e5eb27f9ac784946d76519d51887c119e4ad962e430b3734e120733c651d52ee9f61f0449f07e98c05290fc7238f8dc671d10a1beb29f66e975b46c007efe00,ce6e6d4bd53f285efe30465ac2f900c04c8746756c6fb44ded9d12462c5d6874270b036a701442b502ba75fa3357b27ae1cea9bcb8a472ead0e369423dbf55b801,0947e881e13091e08021bbbea0c615746086f5afae4273bc256f61ef25524ccc4517f2229671025242ca8548a491e3734be5f6041d4c58a55eb45cf623e40f7d00,ece688b5eb50a0532d2b91407823683d75a015f96ea31c4a51da8d1a34b2dd6f6b606f2fb883abdb8d583287be17fbc13f535ecd1658851e462cd10119d9111c00 +f6c1aafa0f066bf1057f5a2e7539ed8748c0e5e41521f016d52eb0693e2fd690411658f9ce97dc98f745eecba049d631de5139acc559972ab90c65d5053c33dd2656b1c046b726e832a357b822f1b1cdb0cef8ee93899c6289e333f971de5a6dd6c7972f373e8b985d77d20f418c80b3e8987124e611af679da4a75760c1f9fbceb9746d9c3f6ac4ae7ee1dd36a119640cdeeaa6289e473bc8cc7ba25092024e09d761ba046efb72fecf1205e67427bd2f10b3914c7265db34771cbc9d3ce78f4005d372887299a978d5959163180afce0a1d51fed1ca419f0feee15625f1e,84c4504d1cc939886f8e3da1894efc011e5a2beeef5778344821eb369c7080d3,717325c86a7100d4a923bb7b86d2a52a23a8dcd3f90e7bd98a99699e30d65c847c82d4d375932d8405b33d655fff3a156fbf7fbe18b3ec2aec4957fe63f1bdfc00,42018547d9037cbe2d324ef31394e94f315619f0c4c771bbfbb9d34abac49202657f6cdeb89562b3bebc6e8faa90cb14362d7c27a943beb7f68d00626323956301,e50025ab67b1201af95ccc036a0ddbd9d8e0a458bb0b2e8537cee19f72de479b338f760d73baeaf7e5c24bfa551b31f0cfc756f61bf557b8eac3a692945cf36101,e416c6b43ca21ee0878d9374b2523343d8ab73e0e4d71a216c4c78a7c70d01fd3b6020034c7385a46f20aef1de3fe1da3961d37f15c4c838d3d366778b73fe3800,be502c5093ecea42666c410824687d2daee4dfa533c29ac7620530d48b49dba7255624a47ef55e2b2b3eccc1e47830f12e4e7590d1464418bb5f6782a083581b00 +bddc77b6b5b39e297e74e1f50138d2fc609f3dc9a21a950c1a696da0440a38b91c8765f6315fb9cdd51c031a746c6e8b1bcbb0ccbbe341254fc7bfab6002afd7ae1b5e76b6aafa7533272052bc8ac3fbd89d600bac8c973ca14a539c49a34bcd81ecb58e670f4674b7fdd9272d6af5d0de366ea47c70ac4109aba19692a9d6135347b9eda85146630af9d91a633ef6570d7a91c1729344eb99a1ef9b6fb7cd84f6bc1346c1a07711850937bd94adcf8d62a87f1aa93e477f8063809c72ee2ebb93a3f65d70273b827da5a8d4f9f77e76eb2aad90bd2827721014023c93a906,ee3bd38ffad6d18c364980921177c540782ffb242e09e51d0fc18520e10f22ec,91bbef28101f7819eee94c447241e10f77bd0db532155103cc1ab55007e2eabf75d6d033b267a8d07ed2ceac6008c5c19ebd5f926ed4ca0ef5419e1e735621c800,d7712c7a4fe38f4c5e47dfd134e696eabf64012c3300181da7b31381ead440505670fa9cd5c6d7a5789abfc12c2779d51fe29cf516e1e6ee746db2613e59d53d00,1d470da034d81d11df6ba555eb82604ce715179114268a2d713b61252627a4b64b5df70225172340c9c783c5209f9137b648842288dd93b34c826c7d8110441b00,59a44e106e621ac7d1dcde2a4511d2049e08c2c6d0bca02b8ee89548577806e95e71f4d835b25f6462cec7a03f506e83d1d63bb3dac0aeb01ee22514e66e151d00,5ae2fa04f638449990bba6dc0ba94e0ce81ce1cec3aef8ace6b80d8cc59f287314fc3823bd5ec2be5a3a1cb4089d62b18daa6eaef1e37ffed7b60e4043aad1d001 +0d3c20dc444c3318cae47cd8a971feb8f7c9ddb9259e29efbe23f8f39cda93335cbe42b108599e311a201b5106ddb04e803791043b188a3b246661636eeeafccc08c739db616a7461d883e89a214c9d798cb94147de1cdb42b537c3d0438c0f38d50b8af7ec2c91adf847d3ceb9b54cf7ef2ec2239585e5251f1d71a63b3709e8c9570cc45ce4b52c0600fb45d2648e016d3a0a866071d9df6a557789df4a6921d77474a1d8ce982271cff8e09e31a2b14d25c0731accd7b222d26b990cf576bd527fcae63bf7fb4c2f2b4cdc4261f9786c72938681372bcd964a9e6a908f006,06c30c1116d7cfe16f78eea9219671c44c317f1fcaa85efbb1997cd0124f25ca,a8277114fa7d74c8f8990de49573db09d399f420b3eb297fc81df010b947fc0153a8023922e4cf6f771a7a7cbb9b8c968faa3f83eb35ecf8c3ade3bc0bdfd28401,23fc2f0a4e46d1a9c150f3d3e79afc73181724c0b20904cabf4ce983af7bfbb06ecf7bc88ff5fb40c30d772ac6fe86e76bb8410a1d127b14b99835b9dae17d2600,059d1997354383e1534c355e2d790179f89b73293cddc9563a821280c4df23430f94fd3ae57d5ba638248f870f7977544b10882820b9690bd8119df14730725f01,28b5b3af8bf0918d091106143b3c97e3d658fa0c46ab34de748585ab18a547fc5883305b1777b9440aa67cbf6188b09ea975c3e901a2eb7215da01285bcb84e601,adf9a3c96780497aac24f27ba72ca8eaef54e7a4059bb4be53d38cc0cfebcd4d0ca55c008a189b9addba1c725ffc7fb9b8cacf202d7cc07848cec99cffc41afe00 +8971319029bc491385f7c69af8b7257e1ca4f3d86d2637c448693f85fe7f9f4337c44f3b40a11f6b2557a212e000fb60697f51f3cfbf596f04fead34599c74c45df534fa133029b29397e7cc40787c1d40e0ccf66b4e1033f05d3c0e6ef6d677c618c291078dd9ce4209fbb6cb917ec38c8f469689a2434016f46a38d98f481381187a26cb72f1155c934056e98dd61d13a77e36b79154a058d912555aa8e0bb1742df5aee106c2dfa4ae0356d13a2392f3181e0c602da33eedea4e6921c1df2d329ad1f96a1d0bbb48a536ef14c4fa9fe0e66add83d1bd6925bb53db427e502,1c36f99a6ae6ccbdeec1c82046ce89af1df883d49c51a471cb47466eeb6cd6d5,f39e8f434da2d79701d68ef2bee314c294b3959c68c62b75f6f456646231ac0574f0ffdf7688a7387a167e1f2b2fca2d6c866ecaaa8b891b16341feb3fc03ffa01,74b6a953ab04fd4eac87db528575080da052dad920ad420db6736abecb6227a47376561d3d9c1bf038604ba98e3ef9bad6c226790d10a23f337ffb856005cb7d00,55d3b00630615b8373b678888d1a46fb3e1524bf7cf5392686a989593e032c24394eb89470d012e89ffdccbf297b40c9d5f9529e0c7b7e198239df2540cd102701,ba3f3347da0eef626efe450cb9d2bffcb3b8907796b9d125169853473baad77a33f396823e0877e458368c88566dab5c5a56a76231346124413d67a614ea925800,89948af18f99ada7e918d7db04b7b3c052ef19e0ef27ca67a709c5673c14495b4a5759ff1aa5c9c635dfe7f8314bfcd8bc03f576efc0dc8cc4f536d49387397700 +89a16d0c747a1c0a40e94f2025dd066f3524469e606782b12aec38f5e8850f1229be2fa86e71549d406fc3cc2758d4b9167aa433434e04a79c102c4b034792899d0356f6defb822f18b6d3f6645fe85ec12dadc7de2950bea94a67ada9ea4dcf62962fa895a148826123aa1f7fb1370c4b80b5584f7dcf169a36774b197a9e78d295418778d203ff7f4be98eaa7ac55757757860fda0a7e59c6205ffb86c0f8b6b42cdf44ec56653e391a559255487a2ab57e86d9810a9be63bd3ffcfe1bd7df3dd5f4666c013f98704445b35eaa3dc84208c8e4fd2cf99ed26097325422fa83,19174136f784a46df8399ccbc856dc07b738a9144f18315f4b730cb53336eb00,ab9958d46e682843b1c921841c5eb702cd8d066e5bd38cfdcce289f33f2fd7753ec40ad0ad1e0108bbac690355f03a35712667630ea5c225eca9d09069d0db0700,a7b6a69ef7a7c60a62a1dc4eadfcad1cb1230335607bc78ed9c2653a510f48930508eda604e224ef280ca1f0958bb89c9fe64a214b4c29e4fd11a777410839cc00,583e8ae622d6b48c3cadf2548139099e606c106ac63559a6375738dc8fa5b9541ee62f461c9f4e327ce5b2f8abee0ac4b6f113887349f0484380adbfe8a52e5200,6a0b5681561b8fb5e6d3ba8f41825b01da859c9a05fc2c792841444882fb260f4e07ca12044efd5b9687745a5bd96907da93fb016b5217a0fbdb37a5669f16cf01,315d11d2ebdc6191eae29d4254228b8d44916fc1805eb027da999baae62b9eea523f9090bd2a14f47eccf496e137210f93cef8e6abcc52c0d8195e60377d517501 +0a850e002fc6859bf740e29cd91172f27990e55ed82f73b007e7e4e0ae3e4357d8836f28fa9e0d63e0063bde804518c652185ff14f393fa5ac0d6e54b6d1632c153069640a05c11d63619594e5c206a815bf85843cefc779ab25a7680f9c444d29dc0807636a75cf3cee20ca6d15d5c6d02d79e148fbb28bd742b957b1bbe8e555aa4331c51f8e625e129f9e09c3a17a083df2c2b0532e808dc8fdd22f11a76fbc8729e67bf8bf0dca774469dae19c6abf5d60d2116d82cb535d020ec92ca695e841217956932c5d18eeb372fbeced2c59e5de2ff567ce6113294c2a0daac087,af8a60a29bb12d0daf908a63c231de21361aad44df5e628478b730c5bb001d2f,d5c1c8a6bffee5c9a59513b4321c8eb1402e68b580d2b42461c7d0c467fc1f846a7cf2ce9739de9d85be8fa1e08d75b38ee31a02eb2222e76b89fc0ef3c67b3501,0505bdd7bc8ff545a6efb632ebcf846b0893fb028c4925b885980dafe152715a5739c99803b6c81dbe3176476ee66c3d66dc2ac8dda124b7689ab9611f7d83b101,19caffadcccafa0e368a818f5f4b59c85ab0cdfcf5f7d87386b1b8c15630471134846f612ffd6ad50f925b79c667131c614289dfa40526bc2259a1020f61286b01,57711e411dfb0e0581e39ad624b33037ba8431195d9330c9e53b24a7d8c9d50f6901a9c4f004a4a95865343af06b1c9172a39a50bdd386af844d33ee86d1a72b00,2af53ca0b547402b9f6e7c226286933619d868a95d991b37aa3321a4f90eee3302afeb9f49484c18f620bc8b23c2535b554a977787c4d1b6b8a9e2a2dba9257a00 +051fc7a92e361aa692d787012f56a4bcc4dd69321d67b0e24e3bad2d93bfc8be881ecd1647ba66d1e3722a6ddb2e3677349376bc8063b725a42e2b46dec00e32bb305e473c2047db7cfd1835b1a938fc185a9ce01acd179af7c78f87dfb453a9f1fdd2eb355d6e3bda6e64633b727401d610783231e400d68cc014d690b3a79ad16429fbadce085b9c4f3691f023e4820ed3885a8ccf78daf6918c520c2ee6fc84bebf410f4b52f7eaddc9708855a20531639aa9f6129a84b98951a0b6da5c12ed4d0ae95ce9ef06bb31bb18fb91469e546017e5531c30ed01edf752fda35785,d15983ad1300f0dfb9959154716f35d4821cb31c6a7c7b85aa133c44923b9e8b,b38b6bb2199afa308fbf7e4797855580473cfba0de6763bac8d98b9f4c07f3902299a4ea08d7e0a185a324a0a8b0b7a8757c3b334ff350e9e4e0fef66b330adb00,a1f7f01e6e2b73fd1099809ef2528fa0f2e5aad42f68863c1f5ef358a96f19e87f2fc5ab7ac3f33dff7b37e429596c79f4c6c13d890968e9e6e675f69bc20f2700,17cd31b4da66a001a8314274008467cecb71c5ad74ee69f38ad1dcbf74fad23f252bd6d8db143afa8820a4490da1b84d159e20b661093857189068791263245000,071a6d6dbb73a44f9eb89cd3071b3bbab272ab49721930094d21c19f347c32f572cdba3df068547d38e7416cd65424f8d2c6a91fb0cea82afc8dd9566021225501,a260caf285a5473ab7b2fce0fee02a52ba77560b0035b82d8098d64bec964e93221fc87263e260c9870d9deac601fe74f3244c346fd6ec65db59e398bdf9878001 +88fca37eaf0d6bb0129607065fa2f9fed056c590fbf9a848d54cfc0f5e458bd8a7094ad06d73b178176fef99e004041484e785a75d7129c2e9333889da7d5a93a58efef2fc1585342ef414afb7a678c7bfd91bde490acd0ca76927b2439645b921173bf0d20892d45fdf4f5a44d8f25037d8e4042a02f98b5a31928bb58152812bb9f46f5c80d5f015cc10692af8b583476baf250dbb0969dcede2f57a50f3fa7b2d492bc20ed2f73db983f0693127f6c9c9a3a28134d022ea95e4262d93e1d83953fc9430260440373bd088f763d181a8e64bc4a1c78fa1eec3bb8acfb19f0b,694cbf18988e248e75a3fae4b4f28b82dd1d520ddcfad304dd949b6e6ffe3566,0b91c1dc6cff74355d8b07552ad4f4a4174a1ee0253f4426e2e7557c17bb7bde320b92a8e9de7ae61333a969cebd8e60851541168b18cd9238389a5187b6067100,99780c383a063f88b0d9984fed400f6d3386def1618c77497316021aaa1375054cad83309636d8637f69d3837c17e591848f0fc640dfd87f1d528f1cd488956700,95f6e278625ef7bf2f20f2e6a5d56a592795222c7b20fa4f49f5f08173a3bc9805f4bbba55a8cb6ffc34148c487df7578e812d61d581be801372f0d34e29d6a501,8f0d5aaf417b288b0bb3b2035533f3b3b420e3b1a668893743eecb3e6618ea8e208bde04d1c145430c5291d892f6b3dde8d1cd03660bfc31afceccb05209f2c800,0737dea6312b7a8ffdb45219eebb7ace9a084b1662e8c178343cd08e43603e720361131113382a4ffaf85a598f28eb8f558e7ead2559fb80323a715872f97c4000 +11953edaa0b3ba0d5b123857bf89261e949b58b9fc373814a5ec21ea78bf2f7d2d0465862821ee5ed831329bc9086ba89195f6ec924e6e9c8b7e232f7b2b09a3b4c4a49ddccccc1a4aeb3ba900012ad56e3700eeb6879c661c7fe532b364f7815e992569d6dcdcc47e223d2e33bc0565920d5dc4d92e029d348303f576e74ca692e5d7e7be782501cc6e05e691a91803424960bdb8b4cdca08918ad1ca012e983167f66d5eba4a775de5c5d7c3f5721a48c8db7525c91d511a4dacc20819a0f2a4df6c704586f6ba84ef6162b4ed15f9b1dcc9c1b9811a28135a8803a1132100,07ca2eab92abbedb1814011483814cb6169cb026699d5a7f9dce143390a4fd87,1c32f0c9e8033644bb53c776e5caa9853696edb4ba73a9fb9a509bbd0c5729dd3070d058c5be9bebcb14a3ae21f886cba4b5b5db4b0e6e55947e7d1c6b8868ce01,f58023478cf17a1014d89c172442d99f34c972f2b4de583a89e3406a1a80a08d1098ea3bff88b2d931f6c97d69cc472c7047e2060fbf15aade1ab67b998bf41c01,2f985ec45c35e5b1add178b1f414de4342c9f893de4e3297647c766f18d0962f33bc2ad4533b2fc477e29e85e341f9c82c107eb68c04e993d3be30520519a47900,fd08214fd9d1749069afbb41ae07cf1f0ec5714f1884a36cdd9d6d83a4c1591907187f7ef1472553f832f63fc1a263d9d8f344f6a07757f46b9876ef15bb0a3101,f879c692280bafd9848e153858f38e31b6c87757376b115b5c07b2329e496fe750651a85322f5ff481bdde0fb599db5a38fec7953a8a623a54a5e0f24c08903400 +13ac4f4ced2716cb9564756b9bfc939a442a0a5fd52f74c1fa7b2d5cbe78a4f5d1a6fe65afdd2df9057b6eee6794dc664459afa59cf1edffc99e04a0119c9b2de6ce2c16ca587b983f688d45499507524f5e5c77224857418dcf777b7d7731afc57f7597d06ad104083ef234720c676f0359fe1e6830f8ebf7e46d0426543ee1915ce9a631c8925c92ef5e96b4de33893f72d380aaf0e89ba7c4b28b14e5a6902bd5b1188d8ee7f60da1afafbdc2dfbff537fd24109688441dceddcc80f9c95f89c0068c3e75922d71700b121ce39d5866d7629754e82fda91c322260bbc565e,c80248047cfd5ee6fb1292c02ac6897af6583d9579d702ff01ef77d2165cd286,efdf9aa2ea1582f0a1523f3401d0fd17be45554c4296c06ba91e758fc3ca0f1b634dbddf85a3c657dbe35d4e7c80563974576c62279ad079ae80e09811d3acd101,796d0c61ae5d7ab88ee5e108eacf1ad537f8cc15f65c1ebf1da50ab27a7720317e289843b83d616b044ba3523a931d87e744c0c18c6cae7c47a7487afc2e18fa01,033a9039b13964c9f0852fc4469f24b95b6106c9ab465e20a95b71050a652034626b8adb4ae7a5ba17e7178604000803e51df31dde64c355562b5cf8d342b83300,91aa55f631e28236452ed062ed13534695c0d6429dbc3df6e26ba20ea11fde4b3b3ad42042134bcee2bca9c183f39f51966062f16d490a1bb7c68e188f25edd100,4b69595efe00d3b041bbd633472d7fd8625312ff4b141b5ca043938a866540526a3129f91a1f42e2ea220157272b1885a1ee3d437535494d8959fe9658260d0200 +868cd87452945ce16bb921104355b29b1d99c0b1f51f6673024ed60332d880f766881500c565aee8aa06f4525ee8f8fc167ee2d382c91ee32b72365cf29803420067e538b6d4280262adb56fd603587a04259bcfbaef625f467e331bdfd069ba5f36a0c4b3f7acd1bc7f165076a2607171e1f6f2e925574a17e1269714c00a3f23006e95ebc40d51d298d9ff48d84407a45f713667668db61d28693e4720639c166520b7fe0f422bb3413ed045ce5e3fea4113f03a51202af1e3a3266ded543775e28d8e114d7186db6fea67d70da9efbd97c7b40419ce325c06081cfe180006,fdcd057b4fb42de3f9700f756c1cf75559d6f1564399c10267415a9cfded344d,6c99df03198851ab7d92641450a62e7faff336e846ad2d38f3740e12dfa5c38841342ee8f27235035dc30e2f09728f62abd9b1f056857d690cbd552e2359c44600,7b7fdfb86804b13b59d9cbc9655ac992d5b57a7a0e3a9f0170f700c77a75d0a87f45c9c86c609fa9265175d2a8d41a234b3d0e0d756c0060c730f03c0609986e01,979709cfe7925a2ec61f55d8d55d06f2320f1277026f0b5859cd7a3b7af5da9d700370452c1ad55559df6354913b9d4b24333f29504d6a9a12dcb445f03ba99c01,8edcb39bdcf3d5debfbc78193d8eb557f7ca1ac10aa9bf326205fd156458d1dd4174b0da1ab5510811a62442f00aef043c0cc4b6f065906fc94967d5bbeb32b901,a8be43db3b0c9101f1b0e111de46314a918d4bcedfa150c9a6ed38dcc33b574d4b0ae1e83dac049fcf67855228f4f40c1e4729672ff895c3c44eaae948c7a40d00 +66ddcff577f8f4eabb3d7cd86a412d98f23385d5f3220ac87f1b22284881b2b4d1ea6bdcf2e80b6f8e0b97aa10b5cabb7bdabe828cb5a3d6868bf3c2bd7f4285b0fb552b924b2661aa56426b8ee8be40440a22898506112c098a6f485d2aeb19c9d1a8421ce6436ab17014adabea68030731078d2c09c3ad230d7a292d7c99ba2fffbdab6b66c4e40aa707541143fcd08ab95173a0fab2a5a175881525726e609248d3d88e8702cdc65b42ee745b8d269289cb1988f535e49575e179d3dea94adb8f08831c079000a30a82d8b0ed320aa44e9576e9d87c563244aaa07adffe85,4bb4cb9ff7c223dd2eeec96e68465e23aeefde08a8e6dd5477f4a88f7cb68717,d94a83d08922c5ad402aae9488baa5c37a94a7f523deeed262bab6b0512ffc1f210befb5d021c0ab0f6d6fd3f24de9c6b2b29ab62f3891bf564ec40ad067410601,24886ea51cda31679007369be48cdaa5673434c23b77d912545e3f623e2f86990abd3d5032652bd4e6a5bed5f5e77eee2eb250933cca9b616bae89e3ac3d467600,0c89fd1350e514b14687cbdf02d8788f0945f438f30de1324a52879471fae35f3a03ed99913fee83bb59198ab6bfe88d9300ca4101329c16b96ebebf8a924c3101,1b7c88ac9796e14fa3a1bd370416b32203a3b11a3de1363a80bfbedca908b05b01ab44e67b46c862d7664ef6d38c7b4620cd11b382792bd4740a04c39221dd0d01,d2fb2d2ded42be0af942071ae38a8097f46eb50d9ff13ca6e6c7087fedc3532d48cc50f58ec6b89c56e0558e20c48b468dad1ce718eea57a3f86e194c2bdaae200 +0a23faa0ae64b319d25a423dd245e3157e8a5f664280354c3641be50c471efce0d4ba6fb01758481e70d6ca1938a8f891a65ec503f5ce72215eb0ef1b38d72f18268604acd6c0ad384dd919ebb55c4c95f2b2b5031d71936047b1b2f8e31a44dae44b88ff9061e52b39331ce6f6914c1b746b0001b61d5358a5a34d00d5c152641b3938ebb18b68c8f253763df110791fbade1976464deb6029f977f993ed724765cc6efbf448c5aad0b9ef19296bbbad2db304e5e23fca3ff7a816bbc8f32ea9b8268111a8a8b3f55a9eee42e80101671194d9cfbbdf0e9b3d91431e9ade95d66,9903a5c44e5227e77e4866ef2c68c431bd1d71b9963d8318df9377079f019990,79bb6c68691a4b61ea2e1c7934d34c8bdb9beb4a90c5b5eb7e9864c97ddcf02b77117b773ced5ee833ec9da23cf573575e7af0c872b15b4fa154c2cbd896024901,1b3d34a5cef9854fbe0942bab421ecfde2449b679ce4adc233484cc46360ab6829f67a770313e457a9988e01eb0f935a4f89afd42472a6dc2b9b99ffe923ea6800,e7633c13b20e46fd1b01673dcea764a0b39161ab4767ea0387e4ee484124c38e3788801129b763622c63f6e1105a45ef112cc026f8279b62a149c92aec16641b00,ceb3826c479d9ebfcd9870c1f90c4f7399502741baf47fdc32ec54020f200886717bbebad0ba912affe46b9e06e6b2ac2c5293e5d8c7b9224dbe0514823e15b100,4a008399716a023da10a577a08c2faf9270eeb230c7c6c35f931d60961e857a4129607d42e929971bf7ef5d6c05e2be3b225d44999037720c46de3e6af27124b01 +9c71cdea761938248b30aa47150a62e8a00215aa648b498041891cde20bdb17728d59cd1fa602e971212643ef4523e46fa4ec71e99d178b504732e759506f16ef6efeb1273bb1583e63797d5532e797296846b17296799bf99bb340baf01626f9f18bd04ad90d83fc0f593f8a5da53fca381284bdabd5b91e5402ff368f627d5a27544f5bf7277ae5cc221734c4223c0cbee95f54e4fb63f7f62ab3ea841f6beffe212176db5fb04823809eea82c9adbe1134bed5293334ae05ca380c13cc5eb3524a00765e87787fa13515040a0cf32edb1f1e3e00bda7e893e3d40395ba09260,5332cca8c76f1dee3e7eddc2c513ccf25d7422fb643be23cfcc24237f0eb7e39,91058dd45e24b8d4b4392a8d896b05447e44ea91fed6e539d05038a8d7e5e53d24cd492862af0207b46f1820dbb7aea4f7123521620d8f22b3fa1af648fbfe1f01,aec7bcb0e4ab5a00898f368ba18952d0a106779a99e7c080ecfbb133193a92a9269ab8afbb045070a0e2b8512dd2c6b5a5b458fe6651315d1443d32a3bc5a25700,4856ab07df0da762d54b136957706da187998c693e8e2c87fb04ff176e2f443212511737392ccc989c754547f2089bf0f927ede191a0fbc8ad78cfc952cb622400,beb1dc18eb52eb4d029eb097013d61c1d29fdaba61126bcce820bb2ce49f366f2b39335985c43b2250647589bf186a4aa50c74f73c2b22fe31470b7cb0cc9a1101,fc56312e29b79db9e7d2afe4a5aff6c1acda95c21eccd172e2e9d59a6608ea3d6797228d1e261b4a9821c774de7a6679bf5d4ca4477be7b215e9bf333042c31201 +99c1170f0abddf01d95aaf097445b6d419369bc1041be8efb196834d450b2cfc5322a7e84a3c912ba4080d29886b24933cf41fea1dd2488220b0d1386efe5b98f3519fe2d33008fb475ae15085165a0b9a6e7505935595a4f15fcce04fb1d891bd0ba6f20e7db7042a3a9b51bb97c0832447b053fc59209250d96916df4e4c0845cad94d14807a30a883c0259cf78f49e3ec01daeec8058e72f528a9599ab6a63722f098115849a1dcd55536c93177a49693b93a962d65c63b9e5754ac601af30efb7654659f7fbbe469f69e29aa32e59a1761598d80249cd76403a8eed693e5db,acfd313dcf16811c2f4d2c5b3947176470732613b6aaeaec2a0048686ae964ce,be2600c55aeaec06995ff5159c3d4a8b8d13a212966490059e066ba67a2b1f746cf490ca0f01901a7d40265d916c21eb905205aba39ab858e0fe23e187bab7a001,e5532d753e3dd628bd5e38bd9f1473a8f45860cebca44f6d6747cb24626168ff6957fc921fd4619506f19fec5ac969897c007db4812346f9610b1f623206366200,f152167fb6ea76c7a54d47b2af9aea5feb15609cf056ca4bdbe1f06dc787b448502d5eb8e17de28ffb894f593002fffeeec48fa8cdc621c226616136de8c495c01,367788dfebc3746a98130482ee94d65431dfa3101cb348357a1d556c2dc7cbcc1a2f3b3e08214b3bdc291c5ac6fc40e01c43480f861f66e794de2ebcca5d422901,296777e23b1cbe85388135e4fe2f4900ff204070f52bf5d0c71c0d262efa933502a875496cbf5d10481d34fec16ce1aa29dedf16a9b3d47fb162f18a4186ca9e01 +a750fa7377887134b1e9d9e842261d6de313d3897b83cd941eaf0c7c10e3ca0de76b48e3ed226356230188c025cef6ef8603ce9bee5dfd1c8a9291728d0274f0e22cacc1b9504277069afb81b16833829e2833bbe37ec4b2527ffea3e9dc3b257363c7fb22d75d615942234ee66281ce65857f47c8ff8fb1442ad4cbe14fda531e734b59ffba6dc4e7b451fe0dff162fe4794ae68f78ea1c095618d4ef581eb8d1f95c9984f9895d2bce5b43abc828a8f4f4c4c03a0bc1bd62f1165be7dc0d6c2ed3c5bf88e5612c440cf6b300e08366cab9e0a09358453ce2964f982affdc548b,f9f9534669d03883882e57aa252ee870ca1187351427046d0a5b48ca390d8e6b,e62802f4cc0b28f3c8b87f5bf21990c2c6c883186e1fff9277457fc57a799b656a6ddaed74b70691bd886e0f5a75bfd66fc722950f4ea6362ef0bbb2c4b9892a01,e822d9c2ca940b614087736b8251d563c9f05a512387c7d1f557556a43713ed70a50d611f54071a6c160ca7509661d2096f1f591f9ef4f844fdb675cfe6e064300,2c865cb8bfcb0b58919b0a5558f57cdcd05a9223659bd6b5c57144e3c0a61528295cc916c91c6bcc3a959218670c1296c9ceed345b4b4c766fff05338fc93b8c01,df1d705768552792c7d49bf461733c5dce037ef5853687d6a76e5ed0c89f9dab1e678dafc31b98f307ac9da0e8b21d71cd8c6b1d888a04ce70496a0e3870c1b200,f973349dffc5295dff2a44f56560923ac1a96e10d2bc4de3d728eb3cfce1d2f010e59959a2174c1c92f4a760c9d9c100083feb7ba018df3a2f8af464284929ca00 +279b1384c40fcb9f983ba83383be9a5c05f9b594ad2670fcde658fc63c5a9cdebd69cbc977c0d7f654d2e36a3635d8c7cdff9ae722020bc0cc70d8cba13bd39502270d438d94a87fdf856889afbfe9fb4dcbd86fd553bd4add18dcd729696d0ac0e3a62061879b8048df9ccf5908a12a141a7b2d3bc53b119eaa3b55c38ed53a52578cc744c1cd3a3683df990adbc431e3ef56819cd622545ca07500f9fad5f3e4e15ca8f6f259ccf2b3a800fabcc09b3b77564f16407b975118071371bfb8c85b63784d216d5b64795d959fbbbb921be090213861f01fc1ca0505c93c4100d799,f5ed3725415c4d0799f2067f06077b13d7720571bc74b8e1f86c9a5e3aa47174,5e9324598d313ad063ab2890a5671e962d0fa25dbcf6ebdee45b7a5a3d836e7c5513f5c5ece4dea365db90f984d5c6081a8728b0bec479969357d0de39c85a8101,db03135d60bf4076a2bec31d1e3ed72c3ccd6e3901c7fabd3fc0ce0613c268d0787ef12021e3c51c3d0287b57480e04b20e2d640c1c79c656d1670f6fd6c966a00,3490cdc717a9214aee1856194bdea1f13b78b4f025d3d9e0fb1c49d15b7ec5d041098569b97d0d79c4b4136f62dafaa36fe43a1cc77dc15216519dddce48d3e001,6df96b7cc442c472d6c1942276334ccd71dd94076d2a0802442d6c78f9279644050f65cf2c46ca7d1838fec194c1d538b7994c20c321cdd1baed3e2eb6e032b201,fec1e83aa2a2fcf042b91ec5ece847af9e96cb14b17ff2cada481bd795ce5be9541f869150db5b577b73069279284a274d44cc0e7a8065ee9dbce721db8c63a301 +bc7daeb87e5fb416c1320187428e3a4d74db136fd3d7184d365a60606f4bd977d71b6ea3a0368e155c57f641631935019ea7b755a6e005ae096b1858e69788e3cdd71b2133cb471b9f3d56cfae120f8913197b9bb6eaffe036e134cc3415e2cad54b35f07a420653a3928e1e61f0768d22b504dfbf2f17c85d6107ca924e4d9d57e41e892a900746050d14501d0e85c1917abcc6c240e3bab442655a574eeb84c376e13026bafbc78f727e97420394a60681d8ab388667d28391846ede6a4a94d7d39153e48fc7b624eb3c76f768c560a65a73106020436333489036ebe400ece4,b6f0b83e9d83793aae4acbfbd6ece7bd0491dafe4f981a08f62157a6472bff6c,ce23f2dbacd12ecde4f8818a83733479a428d01f4ad810bba71d7e6288a6a79476fa192ee67b83be103d2803a6509f31a42d4bacb1fbcf355e0c2771f41a514101,0364393012dc07d2aeecfb93c30a48e5dc1aa7be7449435ab658a99501ce96b54907ae527a4cc7cbaf4b71d214dfae155215a99660247a1e7cb722794f54964701,0e7662b948ead644b0502d87c8373204d2f4f905c8769dfb65f860d28e5781145e6d8971edecb9b7aebef7c1ca23e7d7421e6115142c70f73fe1c8f957517e5000,07943f08d239b2a766c86b4ee82af4f9a0a38c36b6df7bc8ea3ef28185d146fc093a53998bedd63347236d6b59ea0796cc2d2c552a7cb3ed50d0c71765e9c97901,ae89a0f822f01f05f77834d9694dc5f375d04699c00eb364a8614911535a820a6ef23627c09d5e8f81dc1e5d051f4d1b41cad97674412b280c00e8be1b1bba0101 +cffe901d30f923b3cbc0d1c12d2eb6b9f77343609e6ac21291b0e5a80d85198f6ef8998234efad15b384df97a7f81a9b3dda611a9cd86540e8801ff85fa3cf8a6655adaa81deca911d0d50cdfa0a3ca9af4912c825cc3b1ffc13ca0da850061e520caed14c86d7795e1562f98179595a52f0a86602b0af501b9ff252f6ec9f2fa66ad5110b73c7e47c463e926490471100bf68879afc9c0b12ac9cfba5cb2beffcd6f355b4645cb33be7526d7050befc1e0302e8d625290cf42877a8ae0eefd84be1682c8d95fa296258975575d732d3e63bd9d1c3d5233f06a383fa0c8ba62732,e76a6a57fe9a8a16e5f845314249ef4f404cb5aa4572b395029b403ddfff0925,d8afbf4b56f08bb897b398c104c1bdf1c22d8d7e7f4057624ba90f50ba91488313c7d7f39a5b0404537013ad0924d5727e62ebcd4bb92fb8b2b1bf5d846f993e01,cda9734fa8d7479ee00c634baeefa016e9fc405078b34ac35761695c5468a5695788c89b7503c854f241527f26c7f6709d2c121f196d3868480117faf8fa75c501,79118cf6e67d11c048ddbaa9e42cb11d7ca979d0af26a782d3b7b9ded8b2625d4126e1ae360ed9ab5ba173a9ae24fc50be9497904b40ae8c785fc78d16908ca201,3ca0ae93b22a1d599fdeb5dacc55fed7cd23600ae2ab3bc127b589023afbea8e4d294168b83d9db53037fec7dff895bbbdcff6379ea60f88b0cf3fb66ae1806a01,077b16130f7d02aaa50108d919bed82fd9a3784346fcb5676bd4aeb3773ec16d465a056eec5ec1fc7ae4b3386a4010e7254ac41fcd30ebb2ecc47fd596c88d9e01 +3bc1e32ed7c6c044c4acc1a7a26db783f69c7cf43af7e962d041f6879a8c607e5e9838e219b2fc2e3b4ff0ff129c9d529fa23ded9133d7c7536b6b0cd664c04062dd6d7e33c63d5e41ffaea6ebfaa76ba264b23fbac703b6ecdd7a03c3b675e5a828c28991bdf9497e1fe87803414876f95d95b26d92b567b6cdf1d4fc1b742e50eaa6e8509d2a1d61a4410463ac46cc95b37f0981ce8ef2a3f1cabe5b047182f63c49cd6ca93f0e3a1d4978fa530e5291394aa950c751357e8a585be0d78de478c9202ef9f3aa837ed80556ee7dde7e8da902e0a609f2ac59fa21537ae428f519,286900aef1a50bb186fa8ea46876ff8ebbc68bf1c511329a049d71ae38d4969a,106474ed83f1e19cdb5774988a7fc5f24f5b34dd31498b5145bc39d5ff25b5261ff4cf24fa3c16f8300292d3887e754e0190f7d488d219739c0886d57869f44401,69ed2a9355a9205f3ea9af3fd905fb3bbb2dc9dfbefb13354b724bff9bcfc48b0af9eadd7ac1b5d49521c3f25da10917a4ef3dc6d508127279204629ddb12b7e01,647c5e9b39f19145e3c7993d8f06a0b7d34e37e512eeedfbaee6fe8bfe729326517d8b6bca917fabc114ebc831c0181c66a3a36d0be88dd6666ce8c5517b6c7a01,217573eec4c504f4c7c9fb5306fbe3d460cf58ae177296ba725ade301a277f5059d15dccad29a73e95ffe0b2f013caa78e5cb0acb44cb26d0c85b6174f8edb2200,ffbbfff88f48786a14fff49eb456992aade0bd90944488aecd014b166685a181041d4fd039dafee846e4fd9e941097c3b8b0402641e0bf10788247cd298507e301 +c5eebce1d3c4782c0768760eaf4c6278bb08fa3d314ae67227bc92b111faac16d6d525d763aab0980e221f878eca73aaa5ee7d5be1c8c5583d5feebe77492baf4c3352bf7f71eb54d8789f72efb7171af676219ad82fa28587195567a43bc6dc81d24d19bb02782957447a9ad4622fa5baaad6341dc18c1ba24c8c4d6226cce9c6073b2cfece08240c8f075b84eedbb44cf52424f507e2cab0fcdbd909698e67dfd0d01e542b29c80ffc3429f1942cbfe32f25c860fe6abfcb051345956d758b99736506618bad10b2f01ea08b6234ea13fef05460741f9d67cbc441ec513d1848,5b2fbac0752d36fd4e6af914ae50bffe619b3d5a520029d8a08f50e1cfc9dfa7,7f79ee5c0eac86fbbd762e160a06d7e30bdfd132872f56e2971ab4fad8e29cb50b9ebe2fc383f3eb20be52613c5789db34ef4c2e7310c1d2b0a689286f73280500,aec09b9ebf89bf3a5eda0c4eecc4e7a0ff5910b60648d9b8902b888ca40c0b4920f749500a5cd2a97aa94b7b7ecf096f012bbf5b76e6dab3bd66964f04c7dfb701,5e8641684a4a73a8f4059ad703cf3df7680ab42caccdd1cb701ad9b483d2025e6b32d2cb2d94887961338978fd489c75cc4918920a112ac73a2c830a2af128c800,9ed3eccdf2a78be18514d3c7749af13e55abd2b1eda61961629df6e5607bc44e7c5497f544cce90963eaccecf786691498b6a00cd846e6f7e71f19be5f21cc9900,b7264618dd806b12b8554c77533cab13fb55c5fd6f6e8d922e94a6cb38ad3c67374387b70cbae91ebc22f3c83ea95524b7f00f06a4a2102749f1c3e88d98d62001 +6574f9cc586908f1394861ba263f64003232f472a3c81506afb2da73394f37f9079c454a5b521ffeba84bff141178ee8b093904cfc04aaf8384c0332139afbc687fd417e982cb21fed91b3f3e9475fc529b459e16aa0dcaa68008704d733b350b1d561a33964bddb97fe723d4c6b0a04c42d4ce9357d90862fec1371e6b2f943da08ef9414475f92782c57a4dfdf4064938edc05ec8f1a775b0704b3265230fc387c90716e1c03beeb75df3be445df85e0db4d2920507fea5ab2c15694a8efd4eb31e2027b3d1e114859fdc8e808c3abbf4d4172b09ab3eac98d69d3ab5aea1aa8,0a1f33c4a5a0f99c8df3b13bccf5b377441bba0794dd8aa3717d14bea3882d91,c582669167c17167a19740f39fbae7985bf762a2e89cd65425a0a1b4e3bde30b5ee38025f01a3ccce2cab58f67f97177e840f12f844d61550c2e023805eb060201,17a1d63699832c6a72fcde94b8e6648b1c29fcc1539fc3e71df3d467b1988e7b31a6568d148bbf33878b8ff58d514450e1fc46aa169ec4da5c286283834ea27f00,86acf68a597ea8404552eef06989d1fbd9d04cb00034dc541054bf8ab2f748102c2dede09433a4eb14346b11d98530aead6b8ed9597025e46fe8ecdd6074f2b201,e4aa0ecea8f89241f639c0d9ae9707dba00332e7631c6f3e423d04f98d48eb4b521b440d1a739028ce92f11502464347acee13cec55ae09c763ce5801d8626b600,62898923da83d00f3dcd8561e66569cb3dd8ae2e7df301e6ae6640ce88420fbf74c510e6f836059ea822befcfdd85f1b78ca9a956ccfd7616ae378572d51e7f101 +bcfd4dcbddcf9a35c4edc79edc4f5d74e50ba87536cdd68276cfd90ca69e3d1fb96d8853bf183f60fa15a1071339adcf79f8fc3064958e5ad7ded6923e42cb086336ef24576a3b811f230bf6ae1fc036f86ed8bb2124349c641c1db3888e20f2666f6e8c7e8303b42d7d1641770a8838ccde97b6cfec282321880b69c63cf111605cc052dcca06f37208152eda661922b23f527130c7d54d941e0c97dda096cfddd900920f0c8b9643922c9d49d82d568d43a04f4df722285ca856ea68f63b5a9174dd1a8e50e44637ddc7587f957b1c1dc0c57729e0e11f1ce569a876b4c5555cd5,621990cbefb2482b3c8df6e2fb20dcc1e0989da6bdc1dcea81dec14a455f4e92,0dccc08b1d660379204a53406aa581858edeafa2e478699fd65fe22030b6969d13783b0227397880c339e849ad6ed5cf87340b2e917ffa08db34fef83903b88901,da9497e2f8e2359b6339bcfc66f165c395113c9532c37ef40e352d819f4906b27cfb942ea8f529e8bddc134e3c242e1646d4774f8631e5393e451501499a2d5001,0252688be48ba772c18bf316bde3f094eba433676cf0195d15eb7f70c33140392694900e9685f9307cdd646c2759c8c519638d8e909542762843411d970d219600,fe3cd1e544d6b685eef6971f5e2e02d79ea8baf682ba35b36dcc2b1dbc8c4c42416b83d30c4e2e24340ec4e3f7e669317b4e5c7df364e0f86640e9864391663a00,f1b13f9d63e8acbab586e7140c997563131d4cb410b039e17c10808622ca76cc271c84f4828c25da0048f8597189ec9e688f03cda906ba34820b0c00de1ca41301 +86281dd71baec4606c276b6faa961f3f191dbb1ac532e00fc4aba2a424d730a394abbd191bd9d98fca7ce37825761736ed7b0a8745b201829e36cb5ffc6f7a805143dfeea151eda7fc506673fc6db52d64d4a4dd3a804f9c855e139c85419d579ad534b821b91e45271f92e2bcff6c2675c432b2c6a9de31aeea09783927aa9c4940829ac5a498940851d8f265106ede57669a7aadd335fedf82e23a07147a4c5253c2759583dd9b90b25a6948c8d2f8e528c2f2588ab0addeb404b7e62150d4242da570f14fcc9d8d9eae111029c9cf8f31276ff2c790cb114c040244ac8ba1fc60,8e18060eee3a13f003e0941a970d6052dce34974fa95e0d9ac6ade1bb764a0a8,9b0d6b814a57bf6ff98cd6e9b2b665285779e56909f85da9ca9776a932129ed318b279425e864f7d95092dbda90574081f5c4f847d83470e1829cb9adcee8f0500,013a43416cbea15fd8dd3979b9c6fb5a2ff3a01a06e903cb981c93ec4892d5de5ce49ff93b14492b213d151d3ca03409510e228b6d0769bbccb6b9eed5ad881f01,076770db4e1d9f710f37f13abd23394b4a463ae3e02befec4c095184512dbfdb3bc0ad6b6a7139f277a5f7f9c2b3e6cb3f80c3338c66e5410ee66ca6f14b014c00,31e966b4045565c90effbd7fd0afeb7982c658a028dbd83c72238b15c4307ca370871774dfc038e46560c8e5fb01a8d00b576d64a868803b3d0c62b158422dcf00,636941bd9d9324ef67ff9e288831bea621b6a9f1a4619e336690cb4fe910e3f7286751b0bb88730f0096fdfc9281f74c361da48803e2d07e54a14c9d7e2a6b1500 +f1f7f84b87cebeb43f2bec2fd3367a3f03fafd92e40466ed0a0916a3bcbe3dacb380e57f51317bca3dd6a33e10039e4e210527fdb04153ff7e661aa7ae62dee0b831e9ee922cbf852fee11928e37cfdb993d206997d8925725757e22d57560ac65dff629deae7cdef5df76f9ada30024671048e7fa20f020f4cce33a9bd9f10b21c121a6e28646a40f19846ede667b2aad632d3bbafdf39b82f94d981b4b59184a2bfb0ebb0b6919a3ccbebdce8c2eedcaaef00b8fd73b2e33f28a61747d49c6c7e34453c6e2da77dfa11b467df00276782962a785dde3630678e728919928a30b05,cad5a8784165c84b820312a8908c77237e48e6f9ff87003009fc3a1275deac8e,55ac669971287732c30469b7648e9e06d17629640d2b9c0715603f2df75905030072c623c702d462517ab81388d554697efdb198f092e18a83e9f7d6cd97fb1701,66afecb84f21deb8aa579b61792c897acbc1aff79c5c1e15200d1cbbf4fb11975185dc1532cb82bdedae5b51e789f0cab2b0d5521d53bb1800ad97aaf4c207e501,1e9ca42188f1dad0f68ab4ca0b2bc1a0204b2e546395bd2dfc4235f91b7dbcef63cbd111c5b72107205d8a50dcdd3d9f92bc6ed94ab9fbcdd6096a88b4c0c7b201,6caadcc60dd536062b81243caf260a3ce21fe7e8e9a9466466b3bf7a96047c2950fe92204fc74d4f7746163e05a8cd6e431c9087152f291209a8a77c3ef4f01401,7dc0dc629c842ef307f87f7bcfa81848b365f6eee5306de695f7cc45cbb3e6a76a5f94ad5f826a81eca4706f2635bffafa84e47c99b3250b0cd24e0b0b67f7dd01 +5c4340d677925efceca608e74d01f2e7b0c6e62c718f961b27472dddbd51313eb9cf51f4d471d5d301fdf5af068a8e957c080b7a71ae46123873decb01258a633adc0170c980a6f9e78c74c459532f146331e231413aed940bd08dd73f7e88e5ef44bdca9a8ff2533e8ee430bf6e45762bc03320f405f32cca1c042116faf846fae5106496246ffcfa5c8a174731ffeda147b08dfefea9b3be53bb32c06b862d9d3621be1844828acf80f17a01668c8899bb8709e480ae0f1b6380aaf43ca981848cab21b7e4acfb150fd2abb8f3120fc2e6af38a4fbe24a942970cdd95dab6d203f,bc05414fc6cc35b743956fb7e88ae2f27b5af3e4d39ea0c236903be5732340bf,d10a6f3d3499d2eaa09e2dbd93dadd1d285e0db6579d9c6d6e5c54d7a19757e229f1b3c9f29120aa1998977f36b4d5c2af54e63749627b79af5ab7aad35e32ae01,74a855161459116b155fdb4e5c7afe134df9d9052b39262d8c532fc847b4c64b646502698aaf0d2c076f846de94570157c2a60358b6e10830af65fbcaaa5e4a400,d0b55a3ed219bd679cdc063af0ab5f15b790551ebb97dab9be2dd020d3b09204296687af2179f4ddca407d9f82623e720a2c7be3624a20c197c7191554b7314600,ebbca243477dbb7e3d06c66ec9a00197a617622a2d7b11fee73045633d17f1b7480a1e6072ffcc12641b6fd831333ff80bfa5fccbf43467e544cc35e261a06bf00,4a9546243737dab85c2804a1ff5f532733b7d9dbb1269287cd1f5a7dba9f0bd8328ab182b24d8fb0c4e96c518b6802126bd9e76467bcbe73ec18d15ffd6b08f001 +f82e3a346f87c9bd8e23288f28a4ff1c46ce47873dfdef2bceea2087a35f0dfd64d74c198b06871add17495fd9a08329c1766ed53a53811ac35e56c3d671b28c43819a5c8163932ecacf3d364cef1d3b966599d126f4f3d29b0770ef69bdcaf430be1a35a9ba404d8ffa463c9105915e82fae43d17505780da3d015ddaf6a9838f2b412c1e53fcfcefebf7df3b4a48a6992406a2408094a36ee7de92daae7e7fe67f3b9fb9a420970c4e914aa38d0a9ae77da3d3a80f3d07883200d2601295405127f8fee1e1c1ec476e925c32dd1a893d3279fc57e629c5f21b3a516f7c1d7c5d31,9e517388e4770593d1d15f86f0849ea95e86de6146109dbfff2208ecd5679c7d,8a860b2b1f687ed4f8af314961183b14147dbcc170e679be4cc722a056b1c35a655361cf2ea38b2785d6836a49db5a2040f57e861741f6b648705fbcfe3be3cf01,d2a9db6078f01461511d2e763240b4a992bf94686b2be622dcc71fb0f8f0bedb1c66a89f393366ee5b80ade089284d55ad91266506f69fa3f0acb0c9723815d900,441aa90b3d4740e041985aaea8d1cc59930b78c59c21c9dc372fc7d867ec142245879f6fd5274a4f247297ac8e08aa29d18a37e2ac9e92b11e1a11940ddbf81801,c9f36463f16f3f12505b27b7c1bec8e3268a6183c5cb4d0c14de7156f7bd79281782282855f5e64e5419c9916b1412990b2039b30eb4b4e8c39459f0abf4bc7400,7d720a93f54005280df850ea1ae735b5f9a290b9682180027a111aa8e89aae3d74fd10b20b7ea76331eb1472168a9f0e6935d4d67abd4703755a57b0531e8ba300 +2e8a3c5f3b2b5c4f0ca68c4548ba1b6a7a89054429272753bbe9c26c9488aecd2e3fd4d97a3c90d55a779635a491ae7cbe5f2607424f906832e4f4187ab823a2e6215e1f27dc23132656f7b21f54a925c766ef036338d5332fca362532384fd6eb8cb5fca75c11f67996fe448de3c2869a5bc8c5fca0c444c616622e0af9d6dd7c714ce0fc11a918bfb4ea2ff33c1102af1cbd3223748f268b19df656c3cc0f47607076846f9b49cfa6f817e24abab041c4ff87f200c21bc994c3448212a26855dc2f296f6ec94be856297cfd421957a5fd1163fd8ad0d8da2e17a2e1ab5d4260afd,4080d20469baf80b13bba029e72dc6f4be102dc9105e8d0af0a1aa1e40cf9b12,17231fc1e8fda2f3951ccc7f11925440a7d827850d0f30522f93d904161b92834d3018f7d11bac0215c0e326fc952299e0b9a871cb2a2056292da1bc7cbbca4800,b1df1c7995e830a56472961346db64d6b8daa7ffe8cc17aa85926d34535271f4590f3b89bf4610f84e4f0b78aa431303241402c91f0e2e2361efb638cc5db9ff00,ae21a3dc6145e427f173cbd7c33cce9e074218ec283a7fd99555b7a0d3348a5a1d0b1acf450acde2b319d4cdd9b3bc3ac9ffc924a3e19537ba860de24921a0ed00,5d389ea9842b0c42272fdae2f39e648ab2878e49539ea0bba58b86b5a54b47f30ff27e68b1d9cb09d008718d933c92eaae867340d1672d3d0c6f26baa8b6e59d00,49235d1edc831b8e6aaa860f320904f1a30b191e6683af4635fa7da02154d618771c4ad5ac09d7baaa75b5186a6764c7202ac325c9673b50f748f4eefc3a2f4301 +ad5d3d45d49ecbd5e076bd6290c7bb8fcd2f434ed77bc10bd57343a50befe1d0e246a3fd11ca689d3982667c014185359732842f74fb56f6f0178d334601322a5b19c042d3f981f1d02da9c1bdf79427a60492f0ad01efaf1cb3e443478ed55b3e78f9404cd31d921bc18528c2db0d958f9551d97345b6be09c1a550957961d4b689fa34ca7367aee1796d046a704117161fe9d75b7ff21e5f181ebc448f4f7e8f6844bafb36854d42fb4fe52ce2c25b05d3acff456a94d12a7f91e4abcb418ea5e2469525a0396d05829b947323902aaea8a7193ee4e96e3815e40d9c4c5e3b1ad1,819360099e35dc4c9e2758f792275eec449720edee79168be10931c0cbf8d3b9,3ab26630f0accff43e2b081929b6660ffed1239755314607822297e2683d2f0d11bb164f6a2a437e066a4bcb1d6973245aed1d39a2f20c676e2004eb427a0aef00,e742b7dfe6690e75dd0d85bb3749d940a2243b12e5ec8e8183defa7da7b3e2343fa478f13e4304d9d21b4b46a0c903d6809e99523bd6b67669cafdd4e38a367a00,69103b307303ca5056007e37304ffaca999f55ab8cc552c9a51ec2e19a2e67d412ceda47cb6515d818c729463dcf4d7f621d269b4991f764a45669c3abca4cfb00,89ef3391f40f771061fbb8bfa6c57f8bc593f8546c4e03c15b19a53ff911887a31ebb4e0dad9aaf9939c015270c187a062814375015a6680d779bdc5919edf9e01,9afbada9a3488f4521e579381c3b63d744b2ae31f3420af448df62ed97df9bd2053a1f6c1d8cfa5559ad66dda0dd8b17350643d441e324b69fdf47fb8d3b03dc00 +7fb55fca7e10c68935c843ea412947f6c8aa215236e857a7221a43bc1c89fb3f87bbc3428b466ba5fef39ac48a64926e1fb95f4c782a053ddce52b45e5bd4fa124d76bb583bf761a7b4ab9a60e6587b64507344710b887d92768eaf4dbf03dbbf185aa8406f4abd7ad93695f51bdf9de5c3323272fff71163d3e4f35fa1584883b3dc9bae97b5a2028a6a8584cee94932e8bbd17fcaaeb89aa6208f1974d2ba2ed8c5a0ee6897a6b6d1e237e84e48b209de0942016d14c17d87134f0e0a4c89ba8608e5ccfa4132d0c0cbcbba8504294934c02d522c0ed2d41abd9931d693067058b,f557bbdb8f9b431dfe99dfd4747d4565541a695ba8363de3faebe89caf8542b1,20348d868a78645aa2bd89b0e4eb19b84218e055a3af8b4a27c2f57b2eaffacb41babb6a21e0f8a6e0894d03d1335cab7482d1b2e40e0a7773f8d0c9c5d20e0700,81706e57f485f9d8a01b7759ac3a3aca19dd931a937d8df2e8e9f69159b640f33708c8c7966c18ab05bc65b2bea8694d64ed8c00a36ffa7a3128e0005391b04e00,a2888e31ad909a862b81efc65088266805251f722cd29eb83d9631a393f54c726be563b0b02d7a2ceb11384cab57de329a509b5dafc75fa62814c7be21e8697200,330da13b12248fe1e547e0ca253ad242f383f3e2570ff26f4d19c5fbeeb373053b56ec734fa69a06892f1d85f3ee906728f5bdb26648c75030bb60dcc2aded4000,b23bb5334cbeb191b8a887c0fbb688e133a54bf219eb0be9ae66bd6f38710ceb5a29fc774b6982000266c845d2a2b785c3d1ac20579dc4b5dfb020bee8b5716a01 +019657a3e462ce9e0b2a10a6dbd101015fbfbac66f34239158df6c9f5c7c820ae6de69d67dc92fa9fe7e9be153eaafe5fe597d4329a291c99e5b12371b41d713ed4a75511cbcd34914a28d59410f849d041e5e6035fc9c7dcfe5b77eadfb339e80172eb4810913954268edcbd7b3cf0555c18abbdb00fd644bf7a24e8a890873a17453320c7f59b8e84fa8b7e2b6014cbbde09839e6a5835f3926e4932dc04732692a641ae864ed1b518343615bfd23d96deffd250ba6210305b25f673b23ca17e8a5c2de5d6f34a8bc94499a45dbecd0acf7578e467e9c479a2409dae1d841c016f,c3ac087a8224069f3485625d805062f4f9b69d2920810a953053b13dfaf8272b,c51da5367cf09cc755e0a795680bc3d4d89d1ae18c96584a6742de18f0291d2c28ebdc8d9a66e463e07ad19c465716538676d2708ab0d1d63bcf914a128fd60501,61e4c2c27f59a7a825ae4f9633fe9cb3531d10cc25e08400abc73d98f5ae30f20fb17156a6cc456ea00e198293a30074249db1fc60d16d3661bd6446fe1129eb01,8e548d2f3116af69b6e2a8b29d4c7ead23d89b822e652b0c6dd1b87a7be5a9596a72a15c250920caf9b2e5619a6ecdd5be2482e0968ff5fa1f8832efa84be6bc00,649c6888808b71f3b9a7d4180e522081ea82fb8484e8afc9db61afc031b9b209340290aaf81262c11a42fcb6460f5cead41e03cb43669c73e7b4732b2fe7858b00,7407e8152351333012b87aef19a5550b7119c6c67a4e2f5f84c5e4fa3a0d96a87afa5b3512e6c0ae691ef5c23c23059812e20aed8e50480130ef9573fb75bd0701 +69e4441a06d92ff62f882724e3da9f15009e85fe095acdcd62e99148dcf110437cc535c5d9dcba78ba724932f4ff969c08a0f20a0c328c59c9c59eafc317661406c34e2454675fdd39cdcc90124ab93dcb89a9d1f1a1665946cf819cdf1297d3088686e356538fe7f26b1fd80d21be100dfd38ea52f576bee8e08e00a660a0f9cb6fab3fa66aabe9eec05a9de568186f8511602abb3a8edc1f71b1e4776147b185bf03eb1ac8d1c620a6c6a438cf05b92c85d6f666dbf6b6357275e7e47329c2ec033986b11fe76f362e26da996564e43d842a596a40416379185838f3dab0a672d0,5812cbaca3aa8ff284ee4e02bf4b4d466f91d8267f8c056d3e7b4f246da20a81,f66896ee2faee8335bd652a686cd651768463f4dfcfd6d4857e6b44080d9fc8b5cb4d34f0906d4772b7d304d6b8e6294363828da6e68ce60a9609932d486c4cb00,8b0e9f41a219e348d6bb7e7b9aff70bb30665d9b0772174a8ec64bc2ef0899127e80a42e94b9686f447bc602b716f30f1b185d9b3bdfbe2dcb8942ca49ad936101,531655a705ae7081a2962f8369377dcd8728b0cbcad1e530e493e894aef3b4cf48bced1c07b0adca6b2dcc7110180a31bbd89b0b8b0fda661fcfe182f664ec6101,b1a764bd14c55a5dc49c29eb282e3d2c6b8f5007d79db1b73f8b8e5e88d52cf626626ed2ec99c8d83d566ab42ab58f2964f1d14ebfc09992cc5378097156253900,f01b5ab79d73819d6adc920065311d61d5a47eb1148b1aa796df1ab06c6b856b68e81da8707e05169db1abd5161075843f8920bb056efa7fce934cb18b72539601 +779845bec92aab252ba416fcf84a25e5ed5d14ff664db3e180576ae4384e7dada199ffe3f0503bc1ac72cffca8fe2ef8992c33423b3396ff907b4ab0f8c7927aa43863df83ebc57ad76ce758234e942047a2b856aadffcfbf5133a89320a13814f4390c47876c7052ed2b808c86f4331d8291ebb86fbd4cbc78904b13006a3967a4699fc2f1b0f8061c646d51162e87ffd7ec8266d5924df9f70f2a7d6fd61e1d91086ec3ef477b52e53b728b320d24ba7b3526ff3fe2177f7d53c45b652743bbf122a591591ae95a3f7b5d5acdb3b6eece12d4e44d20b5c578724a8b3acc92e49dfcf,b1dab5a688b2b06cace733efa63785fef0effcbf22f81e4507d5ace51c6aa012,5f7535f12d672c3997a7177563958e7a883ebf7e1ce4f8955fbf6504ab03f8d04c9eb7ea27d1b10aed66804ce0172bf0208b3f39c9635c41370a76e4e5569a3901,c29ed56997728bb766e95dc411c90f5f2c4007f78a3d9001a9345e93173fb2713a6ff7c5677f83dfbedd9da2bd885fb12c921600d4bc6fee17f2172fdb8cd04901,f1e05095b731d8d6ae8dbc5fcdf1a5405b5d23c2018a69123db79f4632963bca1ba6f7faf4cf6c44f562de513d7ca486c1ac9c31b886dc0ee99f0f4d50ba1de000,99d2281bc29b026315ded450fd17cf895dee34ba9223c2656a419f31e9968c203da9ce57774e594e5d6c7ce2b9510d58b12467f1e3f70222e65761a13cfe1c8400,d6eef3c42cab393b803995caa7c988979994aa23f95c13ebc2a74b02b1d1d7df2ecf0580da6995db13f1856b83e1615822a1838031354881745e26898efe987901 +26204235550073acea9cad523dc84d3057484cc2ef6b48cb4b84d0990ca9213bb87fe040d801a233921016dbab5d0468bda28d874bfd8eeca3eb627f91b5a08593599873125d517b005081c35514e84645e8cf917e0638cc4ba373c26571cc0a5ba02422b5be345e2ae3b4189879737dc9e049e384c61e3f8a61b7a90c1ea316ab18fada645d3fac3fbfe93ab7d7de5ab378777be92264dedbc3849dc91ede35a27716d8485b97d8f4d3d4083032ce2e8585e28f9a9b8f8ccb8a141ec702cdf44dce0bf0414f2b3fcc31e84b0ac9f4434d50004ba73654777afc4d71b9c92876f2d593,749b16f61c78e420803f4b595b3e73c05ed66bd5a3394887684111904ea71c72,5bca88d1157afae2972a57c88afc0ff097bd6310e2c7fc125ed4f02b810b2dd2029c51aa2c1ed09c2970cf806a8b55ba4194d57c888d20db24d922a11b2197b400,113da45829665666cb218f5c009d92fcf13e3c0edfdae3fb3fa2c79a69e0528b57315d56f52d3eb2626549c82b5faa8bf5ecd7baa2404d0f70b4616a7694574d01,882fc9ea8d1ba99228efe5e01d4d0b854d32454d49bb16ba5028dd8f6e526dc60812935b118a947ef43d9ac426f657ae650578c68e550ca1bb43b1959697829a01,97e39325a3bac9e0d392e88ced3bdc51d29b2d2ac34823ecaf510c990974622534e6d0a178a132690b33127041f80b21e6e04ac55ff32c1f5d4340e35db19fdc00,13729e2964c79cde724ce6a3257ab142766e642a4ab59e38e1c8b4dc2854df1070c8c27b0db4130b03e21a1ed8c56a1d266290129b92b95c50a00693a815c8d501 +a9347e2fdf08891ce6dde0ed812e4110f5b2ddf24828a1bd950a5e74b4b7bb75c687eaf51e488f609a041434540ea232f4f843def6529d92738e7249c7951c31341ca5e8db15cec347709165619fc5276b74816d6a31f7a143f95657af8f8556307db85e5eccddc3333295dfecbaec75ba3de66b61c6b651745c258124b9fc12bcdfe5280fa973fbc0177a9400fdb4d5dd5c554f80056e7190c73f55e3972859ef28ed644241b8584f8e0b5efe7cf265cc88863b062812c421eb913e5eec4d7c8fb2e4a3e94f4553c94190fff014127bf5d0c3ca0d5cdd21e0bbb64446da9cc04e7994,ad7b70ca482c9738ef26785f7b67f0ae70c932f5071cd7761f9a969f242da0a0,ed2c8c405fdb6657d905ad40ab670a00ad6c10bc684dc9c6011d750842c128ea22701367180b351cefae876f9a0807567a6f11e4091760b84046263f8bfdff0101,47d3e949e1fcf94672ab6f2e2c1cb2941fb959844c25b5c498c6eaa591ea719a0100fc0ea8c0abe357f4600c9d3e42fecbc9dbee7cfc4d0cf1fa697bad13c8ec01,01d9c19d288ecf390eb9fdd2bcb1988349019c4ee6579f98b83fc036860f290f1b0b3c9028542f023c885795acc6d1b318e2ef12c5f87625bfe0b3b50f1e35f100,63a6d6e7769a39485c38ae2876558d27bdbf8923bb90e0979321ad141eb16d8664bcb48c597012e3d472337ebe8c8b03148a6a6703aef76291556e5e490ebb4d00,9b4e4778c6cf47eaecbc5975bc64c6f3edfa30dde7f22bbfccf0d61aa97014946762805974cb98438961fa5c9b0b7326103a0dff6343580f3d951311e6143c8300 +62280c241c2fb611b29d887c9d7098e00416e0abba7d09dcce2c2ab79f75b490b1efbc075eed71ef799ad833cab4cd26285dd4097dba32d8b66dec2fbb062bd094904fd25d3a57715119571f536337dd18d0b74d2e152f4adbb5fbf0b6650801c8dfa1d45fe4eee587d9a14abc392bdf9a6f26dbe27cffc2aef0f069701e489e214a088d1e362a10f7e88b581a24fedbb7f6b34291943383412e48f63f29752d00613c4828fe9c4c4f4596a5f20fbcccb771a2cfe2d29a1cff9e874bbd14f4e5d74271b9e2ad83a5d236c62bec5680e570ba229f023c6136a22d792b69f86758de0264,24ae77b9d168f2681d183baa5328a2ff4cb1a04ad739ae38e7a9a5c44706ccb4,310ff579001631ea2b8cf23370ab51c2fe21ccdccbfcbaa024d1933dd9b7e4ce2e0d0b4bfc9108b95c58bc0f561955aae71a525146a3b52b3f8898fe5d7e705700,5cffab3bad9824a0d7f8e606d0f2bbf84f57fa7b54ee8493a5df301e2f6de37573f55f7d71afafeb7860ac2d764c9d6734cede1217ea9083b83847513335a31900,7494e01c4140e3b741099a67c339dcdb8b8a0c5c89dee9a5b936e9da03780be458fc2681503e0d381aa8a1ccaa0d8811fac1a331dcf83459088057adc755c72f01,16382eb84f10124e708f6832f54ffa51f68b16337016e96698f0c912ffc4055f2f252230c1bd312ad84f6608197c4a697c890c7c901cbd1bad920f8419d52b1f00,2acc297cd36c1a0a11d0758712e47b1619cfe090ad0fb7be683054cbccf9a64048a3b386d5fcdae2e0af58b89cdc4cd5c4e6328c9f05aeff6a98bcb7d6aa514900 +f997c1c1691bf5ece395af18e45ecb2a36e682354c8e591735e6ac06c068cf3d88f8672fa9a980f39c3e631b01574bff9876554258889a774e3180042bcb830b242a5f8e37eb3bc24da67467c9fa4eb877179b971493c57029438c5d3b6bf4c8fd05b2d2ba750e94d704bcd801313e26c7a9a3c932e7b640439e65a65de7a459bdf12fc0d7018ec0d1d06a4fbc195ce8dd6da90340209e39327d56467a1400bf8e3f16426837e656c4f267574c062b8c808f63e91702ba350ebceecf6d02071524df39503fcafc60f7fbc11933883dcbf0ea03b9f30907b5c0a798f562d4e824904b70,d591b99a0217f5307e01ec9314f786cf5cfc5a902ea087410b0b685e6dd03626,1833ef5fcacd3b2218110b4678f138887b64bd502870d9505075390cd25b74033141d25e777d149dcbc0266c4c18127a4b1b384140dfbb284f1d043974110bbf01,faf7971997807692dd8731ae79c97e28ae159fa6aa5494265ac15bb3e999afe47fcfdae1ee38c39e3886b3d59ba3e3ec34aaec1f4dd754e1d698c6ba7b72af1a00,c58a6322f4f5e2d95bce24a43203111629b713c93f981f4ea37960eab7c8bfe0618758bea68b2b8ff6f0df07bd16a3c10d9ce3992bc0b64af8ea13245c451ac900,347758a6d4b7e246cc4514d3ca191127902d459211d1ad5b8e1adacc3a45639c4dba28e051c7341597e9070cd8ae4f087fd7c939dc96ecd2158177f1ee177d7d00,25918522c72053ce4dca71deae4941973ea827abf6905d7dc5026eb61dcc24ab220606a99d4012719ae457a668165d8a6279d2a901007af62bb8d5264ed4213d00 +9f79a534c0d80b7670447ce9826192544dd128c51554aef18a79e7bb47b89e452e7f916ae6ec3c0af72f433ae564a7e1d4a888fadc3daf882969d57d07d5e589ae00df479c350c7686cc78cba4353106f52fe1e96912a51e62d7a322b27630afc874419f87af74ffb1f9bc5157ee48b37dd49998f7f04dea6edaa58fae04cbc0a52b90622ed53278771fd7bb449f55f2441d86038e052da9cbe9760a0216fd0b95252f46e73ac87ca66a417211d429c445f37091562474c4b8ccb1aa55a36d5b7e9bf1644f54be6d820e5eb7ac91c8f49fbb938dc57cff33ea72c3978d71a0dfb18c3e,2fdade3279ba5ef2571015e321069cfa1ba445bc0abb172baa05725ff4c6a599,3ab56187719dd94a83b9f7b01719dae4c29a91b83250ab0ea328a264c60f9df178257929e145f93bda7636932fff7a3241224e9a3bed57767878f01533f037ee00,a4ad4727c64f3b99c28e6effe1879c9b029970993dcc89c715da6a3d9565a06e0d95558e0134948bfc9f43d7cd028b9b1f871e56a501221d1da0e72e16cdc18101,d3282801ebc6ff4b5e80c5131c8e2158801f9e6adc2f070b9dbc9329b8457d6d4b93c1582f8219d4b8a4a353661d10de395c7c2884b3f2647e8bdd2a7d83232700,3888186a31b4fb8a1b02cba612aac2ddd7533ee4945fffdb425d9bc64df36854728f993076ed3f1cfe0207d24dfc44fda7e04d919118a800fe14f1c6d5205f9900,b5aca710b3b22f2691555925b4fdcaa2e4ddb3c034cc25979d3478d56bcf3b7238bc43fb106d80fdb86663f2475da6a4f34ceaf3e02b713c6daea92c5217f08701 +0f2a18573a8ba34dc0b30d4631755bc5f77de6594663699ed9556fc4d87f59af41b06d743d1fb7e7710af2ff73d7da67fa5c893da4a0fd5a90ba5724be8e3a42303fbf3a30c27f1a72001d855719dffc24909091b15dbb93158e30e6e713ecc3dce3b3009e32f225cf3bd59ebde55c0c88202109c5e17e4643df9fed294dea6a4f6b8aed38a31f7a6026b4fdf122b1a2b1248909d63ea4f73ac028a4dd661d591e6cf9e2c6354110621f82975a1ad8916a05782d45e9f6b3bf71f49afd6321c69afa42fef182002e6a1c91cc3d212795dc32f743df25b3e6b17393c3e451fe5b14e786,d2e2af6aca4624165f89bba98d30ac416f77d323e97fd80940bf26199242fb3e,ceee2b625d17db33b28606e96f523b569bb32382861f2ae05839903bf526aea4465c58afcabf9f2376a51d99ddec666d9ad01987cb67846ef3ef9f16bed1626c00,852f4659b9491c83778873cbcb40f393eee6abab3d9143ae60da6f33899f867f76e248942ac31f32bccced005489e1184e12a851d5f5151e4a9e187e0587fd9d00,c961b8375f4a1ac90f3371331398751d66a3b138fbac4fa3fa9bffa8885a79a441bbd7787a59f4176f60481ea1ca296e42c1b8a9fa2207ff47cca95db8382ac301,290b78bc1293d6b861c61741c9c242d10aa84902828477d3fbf82587f71c552544be2dd1a3581d96b8e99966f9913c55daf8613cc6afcffa790533c70106765201,bf6d241be6586aa41ced5129e94b3f9eb60af4749fadae45ea68d46db375f5e11df8d5e4cd22976055bf419fe566b4445d1b4e65663ee76444da2d656c0fc5ab00 +b3b8c0da9cbd1f6fcde06ce208a30fbbe224618968e52fde9b220f5a76fcd2d359514ea609ea85791974eb63b7c809d241e207e842e9b0709d9587fc67dc75b23e8f8767f157d6c54ea2ebe4bc722d228aef4eb0185ba5052755e4530a25bd8db1885d99333ff6615d02d63092756663db29a83159bec001e6dc7925d384d6006ba988b3e29eb7fe24b535b4b25a3cb1d97e81de2e28ff0ce97b4d9b9d3ed9446fca834465ed902f9effb5562fab644af0b52b588e34a9b92174f70eb2529a2fe2b7f1f79237050d47b98e9634b6e9fe768dab612a28f9577e27805e52ff2cd409fb98,e09e8bf6521ef42c34f04382daab80eb440392fafe46aa92953020f6151d679c,18c725950b64427e78b9a179734444df9f180126432117810291735457fe1bba56a4f3124d409047e1d22bd8c2d8dfdbc080799b8cb92bdd59084aaf1ee7eb9e01,7e66231a818e7473fa478283faceaf00844bd52aa55eda4358f0849cd4565e036a357de04c081930082fcedf89ebaf80d7b53f887a99eb20279a26638b54ee0d00,3b02a533ff3433f3d71f367f54fb1bcdc6a4a5c1b148f229e92983faaa50003a4ee6a0bc46f9aa7e73aca9e6a1b56c7b164032759aa696fd1765d711975261f301,d4980ffcfb6c92d1c56b2203fef35efb6a95a52794b3f6261200341ac5f731a6141cc9fc10593f52565ebf75e25eade4cb58f485a7d1aecbf0999f2926a8c5af00,58745f74a893ffe94e74a1a8384ad5e3a5705526e6d3c03fcee402fd2e17e48d0cfcb6ca512522b86b4fa7856d9549dbdcd1ff3fc73b0134764a47a279fbaf3d01 +0e4e75254c3750c7d9635b79a4c08fa2a4a7f7ac0ae9e51e672949fef61ee13c850b50a4d13b47cdce905e4009cef369554b24a883e7e4c6331c20bbc8e42956596ca033c393eea05a28cb01316f43e972c615e1bc0156685587fb9fdf6acedbf6ea3b914d46cc3a4b7fbc0b9c044c52699cd035eb238f7ff9d035722003701ff4e7a7d4a74a0fcf61f41af152f8829e21c64f09edb45bb5b0b2419f3b62fc939260116c110c8a7606884058e801647ca489a26c6d2ed65514bbb50a22bcd5d05e4f0748d595663fb84ac53bd0c6b9572cb7a8d563501dc2a28449e9b680f469c3a9b0,75eefe18f6da01e991ccb6ca4db73e68b37b3f69420f896bbf54c01b7842e8f0,bc312e7efbdad6b459a668860851a819e3925637d8a0c2942ee0ddc8703480834d85cd16f89994a62df59d25a10ad374de75e385a54ec4d0e0e78a9008b3df2101,e4717ef52da678e7eccbd9820d6f82486f42e370c97225e9898a4be13de8a9594b37741f481fa34725c894ec89ddf630b5b178136efaa4e5ea66b45e70fb804e00,1cefdd30a492d80c00b74afbab9b187eaf14318e985b1ca08d5d5affe53fec1d52e72d990a6380eb782248ea563535dd2a8f346c129088f03be0906d2c25225e01,a9c743b1a34e6e9549bac573ad4d0eb2100234436211fb4072a92fae41491db81bb70129a4629f1fdc689e44e22989de9fcf02fca1075b213520ea0f6c31947600,a585b3658102214a6d5b213d8ef859766fb2d4cb4203af3d90a6d1f093ffa0fc3cf32a5c964efb857eae6422c68fcb007af80c039fd66d9f6998d4c0488fe5fb01 +72f531587b0a76ce1d17808a486fcae4f7831b7146467748864fd9296fa9000f3f611947a77997fe7f4dbfcbcb323c4207b8abc72da8ac298a01f6c86ad841c2adc641cd80c13067e8dd1db4b7bc7c8c9e2cfea8b1d632ec8f2f66dfbbdbe9af786cf9356c74122e573dd14068a6fd4fc83ff5ecbdc1cf683e8ad4a169ff9babd7a85708305721749da30be603159844a9cb4a868138108e439a0d02e29f1012df50cd318eefbe0238478c226668adf05b5ca12208f946e47e3e66c41d7f70a224839d77c9fa69b9b4d36279ec8840ad0fd3575b0d8497d684fb987561743e26a10b7e,99b0e7a95b91eaf7270d2569615367b942bbca5fc0aed796bfc18877b169b0e1,3fe7dd065649fa2e243e7b94b060a645c088a62f4e3b77fca7e7cf9a4aca23ee3ebebfd66d17768791745388cb158e25572c8cd46aaf469c886156055416cac501,16a4cad250ea4dcbc3a272e6904e7ef81b746f4f4072db1eb268525a3aab429256486ffe822f2d92f44f98dc9b0ae453f9e34ad55b2d53d6ebf4a8747adefcfe00,e040e731107497e5dfe31d11fd23e620184b3e3aec3a21a77fb09e5bbe67560a1377338424d1273ab09b1062b74472d499923c7f3595caaddcc607a6425d85e800,1cbf5a5e301e486e6c1a356210cc67311676e9437fd4e19e914bfff8b2f49fed4dd5417b1ad1c8d665855c24cac494b07e8aa804766befb57aa3d6f9367d7ecc01,f5e628739d6144a2303a6ff0962dc3e8557cf9860a1be3d1a10698d3dd8cda5d24132798cc231248781ed60af98ad95393e5a4b1fcd1dcd23783069d8b5a7c5e00 +c1b1207cf02f5e7c186447f305352e1d926ae2442df48bd7b4b593a23ffac78b0ecd250b49d8ea9bb935ec03f69efaa73c88adc72c987eeb4e841893bd7596d29fdd36fa3f0dcf81b214215d2c77ca6d55321159ca86c6424cf7c2948613f5196b10849e008894a364e1a197af93fba60865777b0c10205fa8b0e5f16c1f69a49f6f93d7f00cc266b17ceeb1b3403b41db1bae5e0ef2c66445398a73f001b8626b2b42290c78a1c1159f018c6b81b040c09b8255f47839e1700035b5843c8998a75db4fcdddc906b8f3e514e28115891e0406ce7d1e27423edb9048f014f5c0f7dfeccee,1cd6881b0f2b07865cdb0960bfb7ff671c2808992a73a8533cbf4da9f2efa08d,8971eb53a0215e33d154f35847146e4e8a80c65f0e394efc589b1abbcd75c0486a920c09905b83cf930d72542870acb9755e293335d977872a746a52a65e736c01,f19a1f57a1e380fa0ef7c9b2f082374c7a95f03f76350a764f39b028c08ccbb754feba817ec17c19cdbdf3cf8098522db9b09fcffab6e4c72a544ff12977913f01,b45d94563e5ef6f66013ee784a8df9af091d6a1becd55addf86f2acffab2e01b5eb77c51438a0ea6ee735fa81f130094db3d17a062dfce0e10ec3009c28852be00,da80b629c8328545a8029b68686bde83633a8191530f95f5626b3832e920c717393b494bb52fa703dc2fb4f6485be1a27be9dc3037174627acd97059b69ada9d01,1ac2d5f830f386f099096187cb11d3254be565c30f7a87bf113c1dad30af55ee0044b64a4c71cb0bbaf0b87231cbdf7637e24ef2bf8fcadb58f8c3756b32812a01 +60b5457332ac7cf80f8b3388576866d901fb7d7cb2d6fdc69c4128496074bc0a27298b75a79732e5395bcad26e5c68a880314df43384204e4378e8c7439e1df322689d09b37a6509ccf568174b4f10e6bfe0cd3d2ccc628a81125a087c522bddb124ddc7f7ed066d78807131a36177e952680680c2021e7d9605a8b306396732a21adf65bdce464ac38559ef63debb5bba2fe73d21fec4f8fea05f4d362dde39f9e176f3ec0752017b306171aef1719ff70bc3afe4024df4d078c037f614ece19dbb1aba6b8558bb35d1bdb121b94643680e32f972a571b5be39c5dba70691280f4481cd,b36dd94a45f2ac3551b59d5d98e3ea422ce98e8649d9f94121be37a391efd01e,d27de525b31fae512a1c58773f422fe91d72aae431fb7bc9403352ddf797e54343b755dcb62a145cc7cf0183f75a07b5c2b6ab33f1e62048f5e77d6736d72ad000,aa7ff80ccb0e733a0942df21d20f166b7b367a709ce73cc84ecea98551a6e60c279e830dd951428651504094c038241645956ca90dff1a9707131063ad442df100,1dc66a8b2e05b27f56e6d28a4550355a759a3800b0e0ebc23ce41de5c75fe7ab31bcd6269b74e6f4b1c6558fce07b8d3855369d2df0268a518695a598ddf3dec01,3bb2ddf914987a03ddd70ba42b38a26219f4fb03b602df73cf3ce5ec9a3c26f340e349d5cd9bc9a7360e6b8e4d1d84c0031f9da356509b5cf68a20340349571b00,7863555f5ef01fcfac270e19637d1dc90983560d098cc0c68d3e8e96ca8e710818a658bdbe590a6faa43fd3303363f330ef7ae6b839e211fb9e48665adf65afe00 +cc009fe8692b92a6c3b635729fc9d57582f7a2682e6c28c1369a3f8dc98af2abe3d2a2c149d3dc515add9398f161a2b752c4e1f1e31a76c8db3649320178de7c03ee3933000e3cdeb4b0d9e31a173b77a9be4375dd5e7afa00bd2a353e92b0ca2bab55f652a4e8b9a647d25bb3273060306c5c1f2709b85805242fb80e078b8d6821508a68eaf1472ef2e912b6ee09e5b4abbc88cdbac224798fff03f13c0a8557a9f3f633ae9566896227e2e78e3a8e62ebe852086dc95e00557e11da71026aa17532d9ed05f2bdc7c36fb35dd7b853805473290c6579857387d7dbfc0ef16472e4ed03,a760ad288005e5732713a0cb432750477dcec9ef14b6c4156ea1ca0a51ea6269,622d74e7ad452e4e47db0c7aad386c5b4d919641ef8e6c4ce006420e04019b3270bcb3a3e4172598d1936273fb12f648c2aff398f46e21ef6507bfb4ae90b70e01,5d4e0a4ec5d95b049839e2f33167b741b9472f70af06f4a2e3d6420a7b56a3444898c1da91542ff627bfce92d48ff2b5cb7215b7bd4d93a5c804ee323c1a8f0d00,b516121ac37c08d000779c2949310cfc236f9c51d5445fd1dc5805c4c38b97ef3f219d6b18bd3178d019e1689d7225b3fdf24a6ad0384d1838d72077110015bb01,70419c1583cc48f5784c331fe039218e6a633fbf29214c0acf3b5be2cb7907293617f20d6a0a76d11f8739aa9cfa79cc93e57bfc178770d26f8068eb7a997d8501,55382d56e43a7297cd8703780d20518524ea7712ab88c55478b74db8da02be5f491fab4ceec732183ea022b1cf34f78c049d72d199626d7680207ed91215731801 +866deb2876b9ff1ec50b90ef6fb480b38cf935300b101a320d3b9e0d8bff3b5c0ee686695636c9ed32026d569c026e76a377192ecbff96627739eb4424c222d3d9edfa91c50b01d01a79c0a375a3b82278b5598681b1ff9ab3da28cc852033373967b750b0472324880d96ad2dc1d417c07fcd5bb38ca18460fc033706e560b08ea1c8c21d50ae8aff07bc136341612854527d7f28ac7c6f83f40d25a4d78b15f3f7d5631548d06e8bdf498c889ce64bd4d27b28ba265f886fc523f1152720fc96c16616ac419d756216155f19b4f6e456908193b1521c27adc0c933d8471565b7bfdf16,29ffaf214d5b2e7b44e8681ce287da16246436a4e04c34f506be841fd551a2b8,9399157f694e6a333a4ed5c25927297baa92606be203aa50c0b792a289dda935730a230f2259e654f8b47b9dc70257cd001a95869d4d5aad99acdbb662d5d01600,84d587ee20e333a2e59fc555d5492cc87ebb078202d1bff4aa2034408c43dc45061631d009363733e82f56cec8f43cd09af886cb6c5f8ce82c2839e3e961db6e01,13171f7b4869cc21b0ab8d1178557aa4288eb574a1d18c7bc9fa67f962a337ab34af56b880dfe8e752f539b881c7d4e0af6ded803b3f33292745c98e3c426c9400,0fc19494d439119cf4a71b779a8cc7ccc2246ab22c45d8ef878aba9df1018ac53499e8722f5a69970212c91507333bd6df3e7d7c5e5b9af53322978b2732f03500,4e1ac1909a7cc45dc4296f2a7d13cffd2609daca402701e0bf6a9f0006e512ac6db14be923ec6fdf907f263c8277180423f3d90e92d5cfa7400f3b6545ee246700 +244e42b75834ff5d380306a21792dd5aca982da07678bc87961d985d328716a1edfaf32682624ef83860b892afcf8142fd8e409d29f1b1d0c70f43f693768dba9be5941067e46d63a8b23033d78bb8b0e3ab6378e5a461ceb467cae79285765acfff7d3ebca5da410a2507d7c82708f5ab570f2e22ce5d7d43fcd6d120d9fc14d7b00a7ddbe012a077e917800f5bc779986490be76afaeb0d9493c96c367cf10f3b943fca81d6894b2ec737c1812a5a85e6181ee07eb9edb537ce6820e948698f826b7b96b101fec9f2ae0abb5f299e7f0acf5c9c439af98dbaee409aab3980af2765fcb,cfcef1433119718296c2866440fcf81682a89d3be98d14839ac96f8b184f9028,0f70eddb6d8f63900f539cb7afd9487e82e726b272ec61349240eba6e4891bbe64cd3558f91e9c46e572e890c958b868ce3149c6d80d7533685cd272265d89ad01,aab188cf6e40afe5569be880dea7c0ac5eee8b82c98b634965c6ea9e20e2e02300a3787d01b4d28f5641348f77d0a0000f4d00d39c383635ba35bfba9e293e3e00,61a49ea3f516dfd96168fc59e330285b91761e28260e9dead044baa20b27778d4dcbb76577d3cc4e121df6fb4e516d653ad0652b612bdf69e2d20d24461952b001,c236788a9b5e4abad6a63fbc2c2772ba1369ec4d6113a07ef9fd2602aee3e73121a6019db08084d9275db5ec15feedd10ae22c30d16a1fac65ae999140ef049601,1d8829ac765009731c6a331fb80bf80ae86a72fdae3d8564d6d4ec9894048134721bbd0083ea9b11ecd56e1fd62994c2e7ce68b94ba3afbefcf56346aa0fda4801 +abc726609343f68a2b63e6a475a1c0af0d5de1fad73dd485fc7da96ae7c414dac4dbb9546845d27d1fa6a9b4eb2bb68c17dc9aa35a6b7bcd9ef8834385725a5427704fc960d227b1d14db5dc36e80b52d27984c89ea3ec326ffe50b77214379ebef37868adb5653b2999e201671712cf3a47f8d2f93349e3704e421e3020f235eab43488452fd4bf94aa414d3c3ca3f4bdb3033d62ed699cbbe3959907c0fbb8eb64286662869e32e3f7621d081573a7d5227ec6514ba96b136db909aa7cae32e5aabf414d9c1ee2651174549324dbb31fbfaa89903941deec6218092b5e11949c9442b2,adb0542f9ceb6019babfd1b0911f94e62b32ae8af9fca936a3f30be94ca00428,4313a5771e3f3c6e02ee28a50becb6e67ef54db52866fd6c82f60b1b36ea1a5a518c1e7528598b453a0ac3ecd9d85fa3b435592ccbdac21472537efb0a1b849001,b3d95ba8e4485a73773716f268096e4dd929630c17d040b4694ab3d7ff9c484174a0f0ae81209794a9a82471f166b99253fcf68379a0651899a508ad35f4aa6e00,d95e01896c4296dc0ef74d4eb4ec7dca49f73c143cad2b634f0db81bd025c20e289c39be2b6dc487634c88d47ce44bb93058a24c71e59a532b61261fe38f98fd00,8020e1fd733ca6b4e8eb68fa698be5c4ae05737391a04fc086f0c26a3e72407a32702b4523b8e4b2b84fb9ea87940cd9dbd80a68ab2c585ee066cdc9e7709ced00,533b66b6b324de7489302738844dd8f09353ff7de8a98c91a81b5c062f7613df6fd889b737f593f5e6eec1e5aefa0957f9487e937203e984241b6f78223c618400 +194df91e56296d60823de91d443cc382ba45ade20ef2a5a03ad37956d183d582b5583a555a732f298bca735f058f1c5b3ccf3b3828f97b4fb3896a9ba34b393ca0c187a2f9e7988692277864488e4686d03be37951af642ea03d7dfb34916cc00949366e09dc1a4dcfa7b33376645cb89c8152e9e7fc5a81813a4404adfeb9471642caa19a5adeb545d66652fe735568be4fa645f6936fb50bab2b39b0c1db7dc9713d7859506287e9e7925fb479f42aee4e548dc15cc06ad9d2628f78ab351efd2a48441e434a0fa2be28f1489b699f59466045210eb660a70b252383f05d763003f6c4,96b19820e20c1fe6b5dbf1b6c8850a1292b087e0bf9a59e2c63b47335d3b22c2,6d53c5d179ece5e1bb62b85a9335349ce04a1dc05ca489ae93378c2c4211b40e16e80cdb5daf8b6a45344321013cc5777ae5f2a8d35c819ab0243f4dbdd7f64700,6f5118239459e242eb890cb8d4eff48b5cf732e0db4f5f165e3ceea773dfa5340f98ba747dba8636d63058a860132cf60375f2c146956217c690f85d17ee51e001,0dba84b7c3ca51e9d03672e2ddb776b02ed1c9a12202761e6f504df2254f0e2f46aa5ad0acb8e67af4b49c31777505ec895bf675359e708f84ec2089f57c488301,4c79e3710b20746d08de153747d382a8dd52eabd6fe0e44b0cd0c8e09614beca08de6b64665c8c2d7667f6d6692e6116d5ef2c6af8a8cc581720983c357841a101,6927839b426b22e7272893a643f45eb60985891096798538e78bda2af81a9ace4168bd841d1cbe5c4ff8850549e89b4fe6af70879ae061488fc8a7e1277a5c4201 +10eeb1db9a6670418a5a40e1cfb13361f49f99660e4cce43ed8721e0776bfc8fa12cb518a7ece9d31e31f8c10f14682ec37581d2bca5d4d97f01f4cd23137cca1eace4b57447bcd3260eea8c17ce86b52f519e64f1845c10af9e7b8100b9ad17af78b58cb0df561eb2817ce4bc3ec2bcd229a3749b3de4e826ed4d18d92ecb8cab9fe7c0eee30dc6e7631b04ddc7a2a95548d6300c50c58b1f99a79d4bfc6a91f57d1547c166786ae2b631c4f6504353c148152ede79d8fafa00ebe86bebec0961740d1a498d6b7b7a49c210ab23f3f12f6d9730f402088f97c8ae19196122bb73ad6d5d,1852684426252ab6b9c1c4b284531209f1dfe33a05e2f91af2f4280e1328910b,aab64fafc41779ec963f510038ebc16dd36e0509b71cc2726df30be6f56220051dfe0fc63ae00c00291e2dbfb36109fef5e99b23e15147372de3d8d426a398f900,25ec5bd97ef681fa171761ca75a86bf4dd2c1054ba3bc6d230a32f4cad4b91d760112c7803604ef3b0d9b961fd68f3fe024ba40c07705d887f3178661a73ef6700,b079f7c6d4bf7ee18edd82575eea4f37c1e8bebdff0aa6cd3366743519f8b4761908cbad1b596df8dfb3fd8a6e8f086d5dd03509e860b162119b126b50c61b1100,71a038ad2b745ad30a0f0206bffd2edfcdf384cb575d5bdec8fe585a92a9457c564b9ac5ef2117b445777e2c3ed3fd1c9cc36222891a57ec5ed09c8bb9430ac700,d3d83f45dab7fa9d689ed50e6bc978850818bb172a9553ccb4e18787e8e20d7958539a1094b3ca99c134d2624e555912a1918f91a8ed7bc6820af6a9db951c8000 +9aa7e137d877a32c12db96f745f41a5f81468b44b1562aa4d276c660d66014eb9d74732de51762b8cdb7b99639892e14931751ec267bd8b3c5464b2765981cc0e7bf11dabfce637a7001a11be59c5e8e202afff6bd21a4067febab3e08e9e753cf1052f12c8e44c66a73b0a7e290ca0466fe4f44e846a1ae91f41457e68b608cc2b2b17cfa07242a67a3e3515bc9e17ad50af532f1990ae17541574ba0e0f51a252a625c8afa9b79cedd327d55d140dfb8ac2566be717e77564f89d360f91bb7a82f44482fab7771b32b4fd53c847bc12f9b02f20e6297a70a296c3393b9c97111deef18,7c53a8c8555b3c307a36f397e63f8fdb122d56ecaf96a3a8a9b1ab54d9d0268e,59cc7745425493e5734748f865ba871ffa817c11fb238be0c54db80a3be4cb5c0936a700e564b2172b6c56114cc2de276cdf627e3689a9ed3030c4f23dfb6b4300,ec5edefefd582eb5f9ff7e216e1820cc2dc5792585ef38ac96c959ad986e41e25ab61e57d76876a2d6ebba3f07442a6a8934efa4731456294c9384197889379701,1718054d575d3d549bcaba896d6ae7dce14d945cff2f2cabbfc0e981c2a5bf7144bfcb5dc54ce8672a8b289f1dde1bd8f9cd0362f8571ea5a283c91417b545e901,dd3eb24cb538575a2b55e2e4a8fdb9d3b03bbbfb3ddc209eb59a6630727055bc58d72d6fa911a0e3d2044e99ca2084eaf036c03dbac414cb9a266a566e9debc201,b322cf91c05cdeff2a2b10c4e6deb9e431308eb8924c05e2952960a8f878112f3a5c4310b43bf1d0ddec0dd3b992634010142a27c2b08f169d54655c34506ec000 +9a78f86729de6a11cb2ee0e12ce23c32a0498f4f4292cc7ff0163d75ea9028f9bdfb69c405c9e3dd128b234016bfa41ba8c3943d0b447fa78f4df573486603c791f2353a9bcee8a63a44a3a0e7a659cab7a758149b2467a6626d5b9eb2325f2b0dc4194a8e5196b4a8c34c4f1f84fe490ea04f433dc84b5513203181358ad3bc03ba11c46f267d69ddb8982f023673c766ddf145a82fbfab75e9d0f2f0f00790dc730bc2d668f7fafd83f232ac8559b36494282a4ffb0039dcf8e8451278b9e2203b71fe8ffe525574951c8633f7ceff16fc38e6b24a8980a60c312cf1ea145e16607aa9,16ad8acbdaa26870cded2f29dc81f4c8d868891034719ff5fd6ba478a79e90d2,c49f650667c5351f02596d4021411a171a00c5c5c4e89f47bf4684a6c90ae0d27fec95469fb2d464a1bafc4403c94271d5cd586155b82d2643c5c9e87bb2a23001,c35cdf7db06ba928eddfd19f716864f269b14f80b1fa4fe5d96374a52cb9c3c40481fd320baf74f1aa6d01c04a653f6de5a4dc5116f36af93af62afd15823ce701,1d9256cd6d09d60c717eeec70c01c96252643871856e2b692dcb54467802297853bfa57e865ec6026584fa01b1ca9fd025f884bf5997971526404af932f7b17c00,f35c62fd244ac15d464f9a203fd780a2adc9cc0fb876c6a62194cd224cb3420c2cffa51ba90d62f9b46de2cb4ea89bc5f917509c864d970c535c7ce8454665b300,ca2769f81fd8ae1c80172c4c4a96ab729b55637f711d738fc81324dc78b1a6901226bad8d445f0e8110913893c98cf287634cd494a93f437f1b672b8b240553001 +abdcb695e78a0fc1baec2ded910c0e7de5e3ecdc87eacd0fdd7fed93a8e94d6bb77f1880f4833c32d8668e9eddad1099e9fd9ad1d56317ddc28217580cbef78cf206d29805ad9258feca28762b566431f5584f614521e65422bfe5cb86aa340eb1f14e550fd906c7e7180989e49111d4aee82aee86dd8562636ae96086e0e102f8e9e2274158a848d8f318ddf09ffa96a17b650b31d3e8f29c29e9dae5f5697a6f8dfc4ed069b53d67b99a8fc154e58f92402f42cdae8afe980e05ece12a0cab08b9808a46cd08ef0c06f807dcdc2659b09d05b396cd137670e1f66effe9141ab49be60b00,b1a58a16a12b434bc005a308d061c0e9a2c79dc8eeaee0afeee762b5ade7e136,ee8baba772b165a968bca4e37ec7cc10db7b066fd920e33f360b37b39fa2be4e585f5ae0e657ad7cb0a8f3c56de45ec3f2c7df882857dd495de37ed2ef77681001,318db45b06a681269fd9139505e08bdb9ca9c0fd1b2f5c3dcd6d7d64b18970a90ec36bb4ed5ff8f5aea2b5fef2075c613b9aa77b2da17b1766a2dd06439aa34b01,413b3145aa160302dc5106fff96fe5e0b89719f7a6d1751f5369c1e68dc516bc16cb064fd7736eaef30e5e8ceba67ad1a9f43d8aba548a490276d3ba54dcca9800,6f96db60db061a26985cec6aafc5727fd791aa96bfe6b8ca7c9ce240803c58f409588e94ce3526dede415862cbb67efd8f2838d52f0fbed65c5cfd847935e85b01,9de1bef4d1ab6547a99586135db41641340cead7e0ce523e362eea9a5f61e79550595e1c6b6db00c88800f024ba18d2f6070885f85aa1249966a6b67b09d503e00 +c7d5a45c3f5972908eebeee64f3c8cf890e81aa1e96c3515dbf364dbb8dbb188d5cf1cfd081998695bb6e1bf6f9dfa68fd3bd4140ed244954a6d7d0a789c73be4ac654c95079ee36062e223fa28eb1776771639a1c2d0b339fe2b5a3353d120920ba092a0066aa5877e55942be82e1cf6f5e920dd5b78a97ce5a385b460bc68ce809acadd7cd97893304d7f79d9a7ce434ba0a0f59b64c42a71cc7b6479b5d480e7251636885b1fa3fa521242a5b5fffdde6f6f9a5b6754301e82e79b9bf74bec91a9be17fb0dc0a968a970b4c8134c742f3614bd80ee18924bbc94e81769894c1654a1338,d575ce00ec39f30fc6c50fbc5a69b999148a1d7e473844ae1066fd1a45ebdea3,3eaa75f6c6cd5c652356f4d5719e8e2eb0470f9a08121bae12672e3fc8fdb1ec7b0b8ec22d97f1ffdc419c5bec47abc1cf00fd4593e86f926214ee48460e46b100,015730f3ba859ffeeb6565c136e437bce56f47b2de1afd4c06f2fb8d4b78ccd750618fd7144751764e694bcdba79f79e6ddf954603d1d29f523a2d700753322501,92ebf63457bea3cccf5a9abb1abffab8ef4561f22a4e3f6da3ba86e7399f4532703b483ca4769efde8946e4064ac7b00c0d802bd4d51518685db953aa437a66b00,6d2d4a6821caba5c7be20ee0bd3e91a6a5f03844d1266fa74e179da6b0ecf05d5b95e96ff3b60dd1c66c67bb048434379f7a91eca182850094143934c70cc79500,91d37505459a40e554e774966e832920a3fc36443f0b7e4ae73ebcdd84ff5cc204173925802c1bee5f9a5740e1dcbfacc117c0e835225d0ab40d1e286ef5307c01 +0e0c9b92f4f7d119713dbd397f9f266058d3c9b9b6b8ac54f15ca940040e83a1a416da2328724ab09cf2003c4515166db70e4ae197f59cea89ad4ed1e8fbbf73e2fbbcdc4d170ab86abb6b7ed6bd93517bf90d6b9ad0b09125ee591f0f99db12bcc35c224365b6a813a2f3891b3065b01d50b4f209d0db9d42a5d3f4b3109a0837391fcbb4792ee56ed9a4de4f7bab14e1775d221e42105bb7afc31b9b3519c13ab571aff5b98040203673d0fbe093bccb4b8f1f80a96ad1d574f1e7aa7ba32c83b783e791ceec3f5aeda8ce8292976f54845a7d611feeba8bda6ab1db429a369f39ac6706,1960646922aa2881bbd0874aa7eacfad1eac5d751dc83514c7ea513550590f4c,dda23119ac48ec450d6c10b8aaa82f441dba34138d4c11ae2a63b01ca2b797556730e78c5e000b370348aceee0d1593f08f5eb7dd7214b5073c446ce54c7876900,26eee4b56c6ef36d9d0dcd2825a95667b0255da11bea1501ad2d50ede4365dc26db2a465532a54da23c8744c0cc23060d2d1f4c780779720da5260a960b7116501,8ff034616dd265eb51ee6dd8d2592ce2e6089f85fcc36ccab5a54efa84019f4a16c5df28b3fa3a20fb4a2d261a04946c7cf9f24371fddef478cbe7c10a28c51101,b9f35a01d066bb4312c4b666ce9699db60d49f2d36a836540ec0e656ca2dcbb07e1a5e5fe7e73c9626d819becad1ade00b7aa18d6e8a66d8dd20460b63862e0d01,75298ca70cd78f7928aa91a9bd1813dc5ab1f89fd5beecca228f97627ca775752eaa35e1aa2f0594461f25d767bb2ce729c0402ef34b4ad9eb965a406916464b01 +9ea5c2a4069fc860099616fe6c39b6f592027aef2c6e54c8991eff6c42fb2785bf6c732cb14629062feee1c321f2c6a5ad38bc4acf191ae9f15e52947312452c0438602474a3e8d5facd29a30f48406ddac7887f26cd3d55d834d38b316ba12e8e301ce887f606afd05dc634ed0adb9c478c9fcd54061afcfa85e13ef33ee2b95118aa4147f1408a52fad5ae5fe7c595fd64d30ed9557049314d99684bf9c21222d41e51124b444ab1b20f747e5fea53c56debfc8a07d06417f127f6d6e472b2136ac5e28e57a68a7c2ed911960b92c6b0c7b497af50a8798d1e1572c07da56b19c88e0ee1,9e091fc3dc8b00bc9549adf8b51b9d48d2657faebd17330e21550eeaf8a01675,11f3c882e641291669d9bc34e0b28d5bd9539a4fa444ce2aa27720b4c7c286c86ff2699bf025f384f6335b53b0fa5d8eb70c5c82c5b5673085510d7d4c2fd15901,a3eec47e73379ed514bdecc21d9474942cf0961511f5c69683ffc2ac734193657c1b3727d8ad853783f09d15093cd73a5d0b71852d4c0b0eb309eb571e1971e200,7ce01fa0fb21806494127b819ed242b5623cff00283a2b267489a015114097922082e67a880ff856165bafe93ec904c9be32fe49f0ffed585ecef5f53bb5126600,0cc55be075f1a6e028841f3872472d784c33b2b53d727d4644beb8a3ab05b15160cbbb661885fdad1051fbac2da3bb27507558c2c595dd7ec37dde43a125798800,83cd0c6701cda48b9bada436c5fdc8dc1c0a22d25edbf344fb2cddcb5975a71a345bbbbb182105a0dccafefaba29717dfd6ef83cd7424d242358f6915db84ecf00 +cc994d0c9d8e10dd0faf3b7471b5f73385af106379437fcce0a8ff658df5254e6d5a4bdc9eaf3d631b6064ad85fc9b64e86dfb2aec1124eedd775a760b0e6e0474158440b70840b6518edfd96efe9ab4699e2fca810aea327e9e85964859087c8d11ce68361cf3c65ecb00e21fa9be86f41f902faeb734827d554af052a58f76b858f7567de8f36aa94114704ef33ff4add18b5a02787f4c879f11df21b6820ff9b3036d58ca36e6976d303ca39baaa75e871a347b587ed28cb3bc08b6e75edeac1bc075a3c50000ba3434a5e09d72ebb6a8d17ed4335f04d4155f33c74416ef29f2f7bbde,7b53bf615213b7508e8a79a1bb2597afc0109f2099e19d26919a1bee0d3a9d70,76dd11ebf645ad630b7a410fbc31fafefe146b197e878ce430d47067625f59e5386ad114829d882d49e7dd75665292c3f595f66801645d8fe7148ee453dab5b800,e8c81e45072d74b2ec9902e5860caf219f6c1a9e44b8b28d9fa28420d66495e457d8556d32e453251e944190a4463e82d5b38187cf1ffedd9a8ca927f5178d5c01,de9540251d61023b5b471a60a848e3431c8fb44f3c58e4e6df635149c2a6945b3550057f4fb56fd7738bdc668bb2b7a7bf22c91692726d1f27f405456f6e0cb901,cc37ab8ef2eb59b6ec6ca7e9c4e67adc2a88e0ff0ece21662b35c6c01981ecd051cde49437cc308e01e50853784c7618a490ae0393261cd5a2e68a4f4f15eb5500,1cd49c95ef440f26c5dce75a66df2093dfc40c775d962257d71ec8e14e6aa7ea2a90da3e2243685839dd3e50827aec824e702570b4a4a642f90ad3e647df30bf00 +d2f0ec5ac99eae8be00fa97d2c78efdc061d1c4056b36dfe937abf5e590c592bc91e25cc42befd56d39a0556dc3f7529ff5d968456574762a2d6a596661cb7261d1632701555b852834e8316113878cc82afa04179ae4ce5014c36dcedabcd126cebb8f2df07a40f8f05f518087742d02e05f87e35378e8a441c3a0dfa45a3da6ebd6494dcfeaf1d849d040fcd550443bde23966fc76290ac6d811c6db0e51387b16b09f9cf02c47f8448dc274fc0b122acce60c9d89b16e60cf17cff908b226ba341eaa4ba9c46c99fcda0f1403099975fd338e5dfad78ad8e6f4f9859c388dfecc01d3bd,5a26867630043537364566a8fa850cab5f01cedcb3a252d4d78edd87d6efc1d0,9215a2dd292764ae520077f7c9bd2252152c8eba386879570677d36b94d763b3007d1f0d2d36733c14426e22566a197b6f7e749d921006b873c5258ac579f78f00,01dbd1c8a3810a4ec7916d87cd81975e9d893bfb270412f503cdb9bc6a585b1c3a702e1532b924dcbf892c61b8839c06e65e5a1a279336528551f6c8343cb61c00,569109357724e8bea0c63adfb1d45c31b8a874510d767690e10455287eed8cbe04fb263320334e96bdf17f44a09ea1afb567347935cf6a1e47b0f76b37c6e25801,2ffd421130f5afda40d9c306d1393d8d1034eb5a5f70d7e605ca7e9aa83d569a089e7d86eec195a755857c1fee467c9e5ec751e0d65952c4cb28240fc13c72b400,8152ba1821688882dd9d0f28cda993f445b2b8ae384b0e5f83d86b84c76889a158302835f1869d2290da72ff8e36aea2257b916257ac7f3992b441ee1eb2d9a200 +d21baf98438d95f24d888f99fd0760f0f2e80c4d6bd9d3dd005fc5a7a9c8db7323c74d4bc664dccb765fb9245713697d8d449cd0b1494b782db83a1c3b72dbc983c226f5bacf45ceedc22ce51e59975af231327a90374c7782ef994864b79d1c86e62f2f37ebc173498b2c42d0f9fe6576af02d2faa041cbb8e0e142a67f72c4d3e92322684d8536e0078396cda67edacf578c6cd2c686bb4d203e361e701f5e925efca1bfc8fe28a90ced21a2b5bd9c13fe28045942f04e34119a17202c666bba10c4549dab8f3a20881345ad783fdb4f5a9b3906fc79ef346aa65dc6d649c39fe34b106d,87af25ac20717a1d4498dc85ad25f933f1515509c8e471eae96e3a1ba42c6d81,db7d704bcebf9e7cf814b4ade3125b742bf13b23c143d1f959bc8460beae8dbd6fde20d86eb7b203617c8175442682bb80de98d071c261f931d745faa52d429801,8cfd8165ab02e6b9feab9863e6e06c05cfd839ecb53e0eaa2cd95e0a97b5bcee52c52384d58fe4ad0f18447e38b0df26a8a705cf2d0b36802dac289aa368572601,b4d288397c938adc8258f7654f5283c19a1cf194a989e056e2e8f05db60fe3d93ce165607f645609ca2a1e1c9edec922283e20d829babfc5bf2b8036e550d3c301,be700e9b0de69855b54fd7727541e28a00fbafc11d0123183456ac97dfc825557d1635c0578868816dbca08cd1c60e170b45cbf3a0620e13b859d4277944923900,32980c3e4e0c9c8d81a6e171d5aa59dcff7c3e3d69019de2e43c2d5601315be854cd5ee461e4ec6030835cdd089569d33962707513eba1fe3055180207179b8200 +36370811693aeb79e2e672d90fbcddaa1cb28cf56cd740e099a0086d51528f938fa0d79d57e3fe45b39ce659ee0c303a843697d1c8adeb217cf67b8e4f9aacd442636fea6faa35ca222d81bdbd0bcf9ca62bfea12536d56034b79a70cbad5e772ba1fe5d3f53cb7c7bfb28978806f8968f4d95911d7e756c4f2a8fc5d43eb9488ca106767c5ff26a021531cb3c4ab5ae6b7e6bd22b8c84f655aec605f8b3a3c18e103250629b6738f776ab4e493f9dd1aa1568ddbd73112e6b057789cca4f467d4a32826c9282f95786aa880cf02a5097c4ab75b0c1b2cb7c842685ca7d5f0e4632f10ae1a,05ce63ff3016b4f12f05ff983daa599ebd7017cc059fc566a099fc6c51819796,1ad7c45aa5e3efa118efeb4f84bad9668d725c2daea969bfd09152a07c177c5e0cfac61e5edd50e18e950f24ab9037d2e800f48f9adf00c74c7a4befb895484101,a5f9050bdb1e5d09ee54eb6740cf5765b815f658fc1164ef318446de7a4213ab1d5b7273b8203e3f8d09d120c1cc341480d808b829223c2f355e9079307c9ced01,631ac17999e2810cdb6c777114cd97c5e74422f732931306478b7d9bd50863736658f62674daef574b8a7aec8b668e8e7b887b72c0a702d5356b7ed46248751e00,f410e07b6adcac79f000a48853cb06035f0c6a9e4f93e1b665e6b948a82dfc095047efd72820199874f1a9c9ee047e1d39ff7c961706939870b121d782b4d87001,d649dd4f55103a9a8831c51ff799762ba9f550a8b47e52144e3b2e24d6c2234e3ec1b913158827bebc1dd9116be486598b5adca68201411c3d979e86f0dda05e00 +2cc1b6cbcd441cdbd879089f7b0e05d1619746c1cad236399dd5b51e764cbb3582db720b102a4d394a0a5ad52468b10da309d1e9124b1f9d3e2b1ac60d7ba38c776c31a71db568962932b897c0e540eb7ee5393a4b48a6e25885e48a1bcfb243f9418befc38959c7015afc3772b0d021886d214ccd2e2214507ea4bdf848bc285495d366a6810029a6cd2d3207624a198418e73352760c8fb4dceb01f66f3c4d73ddf077e542a1950ffd1a39baad1bccd9e98da32cf79e6dc61f6c8f00ec2cb5b038d950f6b1e7fd42c1cdac4bf984fa463d24c0339a9ca8477747833219d91c2fa849fab1,d0244d68eaa9cc7ed2f19935c2e816a62f6defcc24a33eb1c371b16cbd37895c,ffe2bb0546902db1bdee78f5f4701caadd0b4b6d5cba1d98c52ea223dcf02b4e56ace34c23d6299ee26d6dad32fcf1b08faa38c01588c4fcfeea7c768314ee1b01,7ac712c81b6e20099d3f00a70f34f083b34928fd98c3b6e420b7bf5efeae268f06968556af73ae7b338ba00dab47a802f599b49e811f7a8f734f8cdd20d12cd701,f8f582a764b93d59c95ebc52eef2d4e7d1d04ec2a575822bf1cc081372c453683ae852cc419d8ef661bf45453cc438c7b903bc3cfd181825c521f8505f05d67801,eea0898109e037f83f0da113379bbbf9520a2fa24c00f4d0e9ead4f1079d85d462fbde944976ce61f1137483587bf365164f248e24b6af848c12cca5f8d3dfc200,8dcad06c9553f6304b8faa01bedf1eb766ad0e132bd1ba744f6017def57d4ec5681399156439467d7879ef1eea4b2135c2cc925cd7fee9221d99fae62e91c38900 +a51d57a89d3e506a289d4905c1dcd07a03dba1c8012efd561915ccf4674b187f38c2ab2e1992df3622c54bf958ddce64b709e18fe1ae449a3d3dbcb8bd3eb36dccd1c074a28f1cc6d753ae9cb9a885fffb2f61e48f92dcca3898db212efce87c516b47d574b2732607d26eab1512d90bab3c4ce1bc240bf853307ef20b86221383d5e5318831711e822b0ff1c1e5628951b81ccd795fd9766a324e72f93c09ca7cbafb13c18535d28be8e51bbfefeec38ce12a1bdd723e3465983fb24d7e0146bbafed0ce0d9933e0362e0ec0bfda96a05d137a8b67d0d0def9d5ddd4afd2528db751098b4,d88e6f37bba9ac9a040352b667f8b2f7d2f4710ef2285feaf608380d63ba18e8,96e6de7eb12dbc6705369758f10b387da43dfedbda4750f80f914d18f4d96e694fa3eaa699226a261550511a55218f407b57ea68a059e5e611d99880595942aa01,8d3b615abc90d6184fcdf583fa02def55a3bbf66864c3b12863049802cfeba0524b0347d93873e29b15b96a75dba1a6b942e8c039aebff11b2a3d791cb86279501,c81146ae6af6d50b9942f838df7e2863a8d2047919f4af2fc6a5059746a9964e3f8a446ec29bf0ad1fe204e7fd60bba9f6ae3d9635136c21ced1ae7f644d9d8601,43c110c3c979eb55af97eaf1027f674fa6b9f6115d4d74a23e5184ddb48b16411ab0d9d8e84b7ebe7a8a7df884d9f491390ab8246256a02fb4bba9ba519d36f001,2fcd2838baeca5b507275897018350e04ab87878ccd4b2395703d234115795366bb4e0132aa36b772d28e511b40232fbfd02f73450723b444de679d666d6f87600 +914246ac30e8a20d43ae63498bd6c509afa568e089ddea520fed54fcef224f82145754fa6259cb90a0227b9e26c40ce719aca5731699fd54c110082ea4a8d5ff013d89c91a40a6fb6e70b3c60fb025319b6496f4864e36e7cb7e4f04497543fa8f9e6afa113783efee9b6d84708c2eb0e38910d20553449dfc035d49faf35340f32516839778168f1cbb74b5a74a448cff5a3e46df2eb9b7c5ea8e2f7c54ee0bf3ae4d359f1a9498562cbf9c1c2ea33e8fff6d53cb648604e8356f52be86abd853b39ad8444e78e841d6eae9ee81aa358100473acc5d67d495492268bdf156d4c95652ebd30e,55fe30df8fc0e57c25772d0426dc5da0bbbe708d3e7546e8ff1b4ff9fd79c4cd,94383338bbf589f3c90d00c062f1d35430972f2c6ba842b40274e534f287fbce50bd7f5121e12177fbac82b3cd1e7a03979dbfc162b7ed3f507c862e55d128ad01,8689c0ba5b5051df77c0905909462b00bed90d5707b00a499ed3d9c33ae3da835151dae8b0fedea02139f69e30c49ae49e316a70e076ce71929da2c1e03ebf6301,802c42fb326125a28d44e6f74849e0a720dee5ff5627cc43bd4c707b01f12bc25ebe7ba88abc8abc65954138b1986e4e9349685b84f036f2fd75bc88a91a1a8201,788c4da1f9f352c9e64f2bb05096d740807f4675d2a05af443a6a914ac80de7673e03475b7ed46dd10b9108581ba8becccf471c8c0ba0a0be0f3f6c707f7cd9101,7de4969e327f727e03c149718b03d9d1bc17d75644bc5d4b624746a2b06bf9947ef5638f17d9506c2150238098d7f19f0d4e8d2a75e39dad7a904fd81715ad7d01 +ae1a28c16190f03610f2097c6b723686d02e8f024533c8ca00aa88d73e41ba70c431e41a2f90cc78faf94d61b0f59ba8841d6f2c67f63442f71c2a76cad718ad91701105037297a70924465e7412d88b0d51621c641506978670908f5bb10d00ceb11cd2d4c7930454854076c19f3255f5b00597cfb25eefa8a7bf8b672e760c0da187b8c4c7b64195dc37375c82f979bacee550cc9c05ca9e309c3c4df0f117a1a791c76b3cc40df24540a87f493c697794206699fe0bb3d1e4bdf00d2d982fe9185398c4727b7bcad0f35f2ae10c91f5884f4844f83a935ee3f70affcd0cb3d66e184a1add,d658e5d2fb078ed3b15b61d9e64d24781b8f99165283c2506a4f3735d64e6b34,c8a1c3cc9b3535bb0a73edcd8704834f47c9cd03cce610a721aeae2092c4b8862d217afc6ecdb871207815973e739d60513ac407f205bc358243977e6efce05301,61588d0d0d1b38eb79aa283d2150b78136b8289b2e7da13c74123d32adc5f8c6474a564d4c3f28376e420be92f9c22c0bb1eccb90abc739a6d0616b15f14ad3001,08fb5d5fc076f17f013382ed18f6016a43e94977f985e679ab99703bd8fb8b5b22b5488acaaa25c186ecc72d088bf25087dcdf62189ee546d0c6022f244ba5e301,17570f1988a79c82aa36d646f6bc901702628bf5ea0bb1398b41e2a55c9f8f2f6e5c90cdba082292f2e8318dfa2feef4a003808ac4958fa76776739f96e6c07500,14e7ef78d08a9b86cd00ef47dfdab6843a148145abd4bbfb8615d87221b5df845c414023f45998a1cf0553c06a9a5b2c689a4bdc7b260607c77ae1c0b2bc5be601 +9475f2198c2fab6aa8b25034e9b14bfa87dda6cf82ab349ccdf90cd34d1d528c933affbb9fbc8128c5fbffadcdb3c5c0e05a6dede7500900696fd083f00e76a67ab8400ac0610d43c587994500861d2d8356204b5b2989ab6df9f15b720e0167cb7cad98598ad0c69614035d2e5d7b7aff853efdbbdcd9315aaff178b5522a5ddff69f0819350011cd817c067a6405c4f2726ba16fcd0fad429b7648d16ebd7004cf108e477b853993bc36981a67000b5eca8180e6a7add59b20df812807a759824ae7bc639f84591ef662543438c7744442d696640ffc534540e02bf9026dfe7bee747363fb,3d011dd184684f7efeeee3f1b5d7a867b42b75c48464222d75e022a2a4fd32d1,1d786760d64158651bf9cd9363dda4dbd416eebe820ceabcf34c49e52fd0fb3d196640dfcba1abc2f524d8e0afa82512d142fb611e114816729d1e0b2ed0b50801,dd01f1a02d7f1ca6c470df48d74fd54092a2c18d94331ccf6d1b92709d7c5030142f69b0c2b1da0fdd66dc48f85f0437e66ef2861e83b91ca385fb4358a3a4ba00,31e01fc365f456ff1c4945b678faf413444db755e078f306a3d426f7df4c2665350dc08a4e921fd6214eb66da0596182d532cfdb39b17b537237084e6642dbe700,2320eac5949a9946f845c2816e9219dd847f1ac5d726d778d5b789b65e6047342d0d455344ff9e435708be384d8caa14b916098f18a3f930911e6565c0fe9e4601,22a3d7b9b47bcbfd2bc550d0c921493732b5b50023b280484fec896959fbdd395432e28a7a85ec6bf96475b4d5e6bf5ccf856d09cd2652201d8aa2da82fb2ae800 +427d7aab167d8504a7bea2f05688c1c426470f2cad2ab0b474c5bee6d77fbc4a4ecd6ed9ee4026b97e180fb486a780b1615f635c6a164b9a04027c9bfb32429aa5e710e08d18a3351989a850677a7d6f81701af4974dd2965e2e369671af1a9915244477ad57086ceebc2492c5899321573df7a049c612151f5c51325fb809ece592f84b58dce7d04c65cfc19aeca0bb31ba2567cff85ee23fab68058cfafe1e4beeb360c1f14791c3b8c2456da6d689233fa7b7cd28c75368897e20310e77395fba2222608a009d1753af612dedc19df32ae1738b1b74f21e5b7bf1d3f65639bebe185e3750,1e7d6f8af493e3e514aa8e8bcff0236a9c202a71f02ac2676a207e7ea268bc26,fd1fcbf6bc9254d872686f91cdefe9a003515cc915ba3f54cdf68629da6708687afb98a62c4ad9721b635ca9c034c0b2a13d93faede5794d538a71f6634dd97600,16a725cc7cd8ab244c96878d2d849eb076cc76ae22679aa6827309b28d7ad35476f53fa3b4a411803dbd0d2cc1d0a020a6b57da3c4e812c78f2db3c0f47eea3401,d59ed3119a3b6610536efe916d013f54b23ebcc52b1f2fc8cd43c71aa9a3786427090797a2b5d0a7dd0d05d831b64c546199ed2ec9c0793e292684dcaab5622a00,eb71b9b894870e19a4791ff35cbdbe5c664251196e361e525b30001235bffa7a464eebb23f5c1fd852d3c642e2c0345af9f82fcfe43fd5d5cf78fad033d7726700,3f6b79799fdcc2e3bfd7953b828c51c2a128a8186e4430a091faea66f101926e703ed77fd9cb15ecca88068d1de6b276d4eea282cb62337a369502d821cc774b00 +03136b6aa7834960219da4bf2721c1653c8d88dec6f89f21c0dec05ba1ff9fa1df4e5119c11742417bc53f9e52ecd8c6d940f3cefea48acc21e62536ec4b2a76a0046742525546e6fb8b210a922e1812c7fefb648b622fef2db598dc245b46bd0a19a92f27cb33101bb78da6aadf23355a5695ca180043f2f119bdd719efd7f4408a900e12acfc6511b724d31c2a1a39bce473c84d875a0eed778d7f67883605f15724a935ed05cdf4815930a9cd3570a0afca35e0daed616189a406d0c72825e1e8b034d05892d80359212713caffbffe1cc0cd70f0bb77ad36e0bf43e0852a10bbd039d57a,f5ba0f830e0926602b67a78cefdaeb1e23f583ab0930c2b74e3500ab2c1d93a9,b0d698d79a8c7697ec986612d2e0761fa6c6b71f51143d6a3e01638e2c6087a06698c1374a1bfbb56bcca307d4e52e2d04a0cf964ebd9d7a725e920560b20dda01,f50fc2f50bf1f8f62fef59e080c7a07f4faf5a447567ccd1cd78493c8798dea40088609a2aedbe7d2b52749af0b7b1bc660d0c868482768643675fe8796e4b5000,1a81179f7ac9073439134b286689353324d5706ffeb66a3229afe53d48f8479b7b4cb0940e45bf2300aeb80deb0a9853ff637a3a12018f552454384af5c3b51001,08cc86468723cae4ab2d1249524283629fd5bf2fdb3638236dbed44c59afa04634a0071edb74e2c548ea87c3154db0fcce900a2f683841e8e78af5aafbb19da601,5ceb5a90fc228fa254e2179f59839e49eafc8ec72d7019d53f4020fec0da27a204a59d5b91c72f71c90b345e42480c30ecf2208ff27643a62c5616420c5979ea01 +5dfc78a256eb25632e2e2dc51d49965df65ba25360c64913135292f387f5be72a0e062f2ea820dd3ecd73e0380957f90deea5dab3dd186b40732e18743e812afe830bec28ab4167e2c6b5e6897ce1ba007da6fae23f50c35c1bb060deffe264b491ea66a2ace3a738686f4629258787fecf94b053b30a14477be42d4b00ba26cd89cf354e18bed25140b797b665138dde3ffc071d2688fe4cf6ca682123221828b31d04ce766fa433f04c844384d3334abeee9cb4b54e0fde4327fe686926fd34f4b5cc8f82d2458475179f6d6db43d9fa7a4b2e8e17d5c0c9fc736cb9ec20503d09095577aa,f33e2d1d44bd39402144249be57d3a88475f1a081af7fb89a65aaa9e2b663944,2fa9fd54020c18e677000fa91feb416fd6a01d6037d13175a5c579fcf649850d15e01ed662b2fbfb8bd0a50757bc7275c78ce3d99f53dc56cdd0bb825d33b76f00,bd468178d78d4ffb9626f47c0e0a723a8bf35e7e9ddb68df359cf62a84b8259a6c57c028dc1cd1dacc7257064703d9afa4e58bdb2f1f7b3fde1750b5eb6d3e8b00,f61044d4c090abbf4e99972b7ef0e8a1af26e7f2a4a0f817486e255694a7e4247e0b5ca930fc9809c176d38a0e666d9867f3e23d92b03486b5b1209257b6b37300,fcf0d81ee8849d7cac5d4c633792b9be0ad01f065565b9b0a2075f60380d30020ef62150898c42ec762d5c08858acbfa4f6636437a446e55ca479cbec3e6444600,8aa0ba1446560ee7330b4e84be8fdb46d14e0ab123dc4c415c522cefcb881a5f2cc3c6996b1b1d1b9850fbfd5e42b49ee2fc151796b9031263c3d50ad47a6d9100 +7d9d402b10454d54b114585b756f856fd0967219b45dbe146050879041dae0e7d2f8583e5447b2bf9bfe61159bc8673f113cdc94ea9f550c586833e852203da28879392b01393ee4cec7aa7cbebd92d8249131063022d22421d18878562e415bbc97a8ed7d14e347afbcbd2d3f817139e1021a091d0db689d604afc6b084adf79bd0a7e4443b3b6e11987e6e6ac7ae47a7273fe57ea5350423358df0afeec40fa00619863cb944495241dc15ac9b726d3defe539d3992a77652b0c57bd2d7ea711167ff4073a4f5cb622477a05a964504507ff6ad8133713d371f28d21b9fd073d31cd73aa6e,7cd4693cd0c0a21e6c157c16c9b1f946780705d7beac79e29d3dfdf44d1af706,80a5343cb4b119e1a6d0beb526e7d9d454a7ef6491c9b7574bd0aa6b053cfed85d57f6e25787d09fa628cd3c7581209daf456b3af5211c284c5b088c9a3d285700,37e686f21c3b8fcfff8525a198ed968171dfc9fddf9054e70c60610f1472183e7c05e091f7b3f4d7fd681b3eb2b5c82c4cdbf8f90a653cfa94506572b5acac1400,9f16b28752be3a78ffa92bbc528b2f77598c7e2d424b1e63eb15481a90fd6407548a6aec6779573629b901fb514f47fa110f585de0f634e979dddbff1d66b04401,eb985d81fcafe6cc5e966c83ecb391285fb0da166020c3b56171653abfb38c8a4cf3c61aed2fa34fb9bd32356932c80e24fa347197bc543d7b68ac99eee4df0301,127c90a5c53b7a3caee525ebc7bbf62a491f2e76e09380fda3ad1d27cb46d16d1054316319280f62ffdf64858e4d7c1109a2658a563019d9595e7e59ac74accc00 +2a75a064746f04ee5779f7e3831b4f3da9313c044bcd73c3bec6ade6dcbcea22f11ea32fc9c7e8e8aef77d06f0913e7c46afb6261d6953dd9b9b0a9cd44f12b906bb226848dce111f7d74f93c5cdf9dfc441fbb3603c3e7f9dc342d80ba3789402b93a9e1c4048d57f107d1363bf0462e3401fe5ca1c526c584b1a2671a355a3ce183787b40281122e20d39be617685cb1d129fda8f93e2f9ac6b7f06ef0be179ea3c4e5930f1ed2b68c0f6752a7125c00d4b73e42a5a39398f51144692104936370ebe09b61a10fb5a0e467e1deafd9d7195628dd112496a9b2d3b6f932a61752e2f44e36b8,32c9801ff4c1f5dba3fca372a6c0ca72d0b2af0704d58cb2d5ed5633c20b5113,fa6f22c2f5cbeaea702ac070328f54dc6ce7cbe7ebfc16acda5f55cb1ebde6e055c66301e197d1b5be8e8fc1c48d372dadefa0208331f816b6c4fe871db7bcde01,75da0f656109d54c83be232a7a7d9dc231eb6331d086aa336b0deba6f1f0652431c42a07f5989aaf05ab2f384cda3bc5ced7ef8a5e5163858a54610188ced1cf01,ee49815125dd6cc086880b7d7fb4fad62942cd4d0995370f26070c7ecd0874db1eaf2aadc333faeb3dad379aaa2aecdedb63b1a97bd1c45d2e0a15f1fbb6671f01,cf3d16ad77ec1393f8a455ee5f5e68a9d4d92efb56613935ea73382bede5b3453d6961fbd08cbac4a2c63b4475f0e851cab15bfa67c4d715a0b925aaf41a2aff01,ac9c324530d9c53bfb3131e248b3b9c751881dbf63eeda22f58165099cff9a3c367ec55e8ed88a38bb0ae42ac02f9883f239889915cbaddeeb3eae9cab83ff1b00 +a5947d69780f62a41987b15d3a3ab6f987c90a19295b7907e42b1d538f8e6a44d2f55c5837ee2e2f0a698e8ea5f40b78223997c27c878ebb3bc9bdf4570cd5a11b9e4cfa214087094de38328356fb7d09b82871d8afedac43176ebde8896d15bd8495246f1342a594ff1e1a76d7e54c047acc8051492380ed6bca27ee4a29d45dfb587eecd71b4a9268f3e1fd38b8f251ac8d632efce7c2f2a3530975045bd9e5b4307488c646e9037c2b02517672a89f53f724ecf5fb97a56bfc7f2ca482d561c22ea3629850c42675be10172e42486d2c05b52a8b5de36bed60450c16d806e37485ce64874,d03cdccb28b069101f606c9c2674cb31015f20e2d0213a5e15f35a5ce16fe8ce,110973f8bab428e979e293837618b19f4413818fd14cfc4c7b3e9c6c7d26c29b268d4e4a8f56e43a812fbedf53c2c85484feb7abea56fb3a97435a5c178089a100,0279fe367e72c35d55fb74b42f25f93bca319557d857698d9a3eefed165f3a502eca9680ef4becba48ff0c55bdae92fc5fab8d633765328ec0055da62d86061000,5197db00323c95f2f7975db0424973962d4ce38a17ea6537a3a10f6ba5679b324d7b8fc6df6c4d0c9eaad6463f24f735eb92e4ba92877f92016a26a03674098800,09a9ec17b8334c9681fd36e4a3a2a5e9223f24a1f8dcd3ed05b1ce587b76e52063af48b9ecd5f286a51a8a855f8cdcee155e25d2f0c52ba02c25677ae7590b2001,8dfe4763c2a1ec43d6e3fac55f81fb8243d28951a769579f694ecc04a320fae45f89b8d7b1086f7df01d981bc43d03edddb9081bd06a57283bd3dc90e70118f301 +7de08c4a1a8d2cd5934e570fe4bce234cf0c50125ebedaf954f9f64619b77531c8aa6beee2b46309bed985b239a16a00d6c89ecb84f0c413f6ca7206e2200262542ea6c83274fd6af90e241b73c97465c45d06736ede9c4e8428383121d778c8ef3248da278a8a1edaf3a514794a4adc7e7f168e5791c27ae6420d37141666d66b2c2e3f67ee4e2db9b03080e4443c54717386bc3418a4a16f2494a23757c5bf9f437789a0e58c493c19a31617514effc6637d96d45645600683c88084d9a07de7f0ab159934e606deb7507b142ad07b14f75f4d2fe94ed771b37d1725348a41f9a8892106db,7ee592a278f7b7b878c634a8bfe648b5f137a3fbddf0f3d3864291fbeae00d2b,1ac36d3f0e2cceba112750f4052eae0a6ff4a905fbeb5edbee527a06cbe6402e2bb26d2d6e40b534779901df960991a209154d14d5d410e06b3d2a7ef3292a4500,8657c189461155fa6e9470a3a589f15c44710f1b51269ab7e01c0b4df6bcbe6b0cf57881c64536359435a730ef8fbc580ec09c4f5c2b8f84bb39c0ff34c9b82c00,2732f928e64eaea56b195ceead781a192ce96a9a69f7468e4c1c9e52fc5b6d365c0ca7bc33ea54db6b6cd7280957ed49381a01b4360c78158dcaf9fe229a309801,3e4df2330b472912736b3daa17269f510b6c13c1d151932e6361d437c96a44b350260df82e2c9e738682c771faf3a63c7ec6025cc47b90249a4c827022b1fcca00,7d54691a9e60e4a1be2a35d91f6d2abddd9f9c5101bf0bdd0ae5e82872f067c45a054888613cd20d2a16f314d189a95bb4e11649eb805746f8bdddedc02cd95401 +10656a744c3b7cfd242584e0269a45bb6f74485a27073cde2e4a072dae1acba4a2a05baef1c98b69a6996441f8ab0e4d188198348f5d17333ead043c7689339275f5c13f23466af1e39d10506245c5591f0b39d7cfb115d72625f7109ef639f4bbc80cf68d77746831efd7a0632528bf4c357dd6945064146cea1c13db812f1dcc4c5abd56cc21ee789ed80e350909d56095f20e79a6c2762974dec6b0a5c49d5300f5bb0533b59edf4fb2690ab14773b41554d65ee3df8e71b69043db90473803d4862ee14d70b75f55fe81c66bf3459450cb30958e1db4a049dc2690835fabaf9d7ba34329c4,1b11d3f981177a6d3c3ce0f9ce3202db6fad84d208d256cb273d52d57dc3eb3d,172f19d797440d186d95555d18170f8c82ee500d0619dc03b451fdd4aca6ea286a0590e0e7c070c8ea556a82469066c81967e072fe88a1fb017c0ac85ced415800,ed37d3d5f3a749acd1e114375d9ad6e1455e6d7c5b48721d6673914c87314056168b14ead75a10e7fc646326c6569d8497685e3a8048605de791991bcfce678200,e27befc4c764ebb8a324064fa9be917a2f5772bcf4a1e4621ec5e3763629222f0bd4e23d22a33afa308802b13893ead033b4a46ba276dc8de16118a0e4243cf701,bc8f27db04640de11f51f3b9e116313cea2fd3d21d3f35b1a8aac61b7d1decbc45ba20b683c6f81b53f76fa3a53f861378512daeda8e8aee16af57fa03937b9200,45acc33e2f1bc3e9d87daa9760b62f8f1113b98e01a2c7b2ad9720dc17c886410f8e89ffc101524db9a0d444f6db1e8f4e6a06bfa2ceee2bc7ff2f4b66a22a2f01 +5101a57ec576ad891c9c53268083bc2808687f81cb99fede5d694c0b3ac855f69487a2add9f8f310d2acdd1c9b1d57f3d1d5eaf138b69966a89d1d879d550f04910ada1337a315da526d0ea91a8973b31c08dde7d7e052accf825411056d7914075fe2f0f6b6990121cf3943468d5669f5f48b9c9fdb47efd3894dfd63ba193fde0187e21e3f28fa04c0af027cd2af18a4781285949067d3eab7cfc1470f354fe75b00672e53cfaad2ff6205b48b71231e286263516a09a75a03f40cc8057f645e0e7b126d74d192f8eeb972444b4dcc6067e243864813cc32b57904f837b93cd474f68081c561,be692a90c3511ec04af54d00d5faf3fb1c9f6963c30148ca1e30c8c5c439d8c3,523a52e94dea8bd953a6fbcaa071a4a2b88e31b6314a4f05d7d3198b08973d0154c5d5a804cb88ced94f35630553f53731f22225854306b455e7810904f166dc01,939dbd5993ae535a5cb8493a285d729f4cea721e64e16b09502463304347902c281c5fa52fff8c8d5726f69c5c9586ce37b3d82456dd7138aaf64ab5df874bb400,4709d1850389596ce24174b8f71e00eb3d6a82ce4a15ab2a4c2e08a58c14aaf619665425541ae4b4e19f4579c848cdc42546c6d4aa7ae2729061e5df063a43a100,b1a0b419efcf85f48e8a15bbcd46204d29cd8b101ecaa68839c7d5a6dfc24e657d6fe5d9eccb832edee76f8402690aaf30d27adf6485492466bd2a60453136f501,0106b44551f366b8f054317edbee5d5dfc5394bc1dcb52ba5a368e9f50d394d44eb7633352dd0601c21a0040b235e5c22c1485f7cf0c1a1746100ab734d8a98700 +504eac9d6d6022a5552925862de6fc3647f72092922911b930ba49809a314e31d96bc59c9b6838a744221191ac8838c69bee4382097500d78cc72d6a39e8de695e843bbe39248ce9606025c6cfbe9825a36a6d655cfeff71dfec48ba637ef218007d59452183986ef4926b390d5b6ac9ebd9b24e87dc89b9cef6c0918065c77f751b89287d04a7e983fe88c84e2a4d8caf41a3db49a1760088bf161279ef31d38146caee929750faf25e70bfd6f22f4cfecb00de6ce04239790859b1e2e8e80797f61afe9fccac344ddabd91f2813746d0136b8a366d29b234ad1d9ab660a8200ef18c4d166f69,5b7fe9286af1a29d6c50f6e84e4c5815719e618acc5109e807de3a051ba6371a,44be191162fc2a80362030f67cc28ff595edaefece91cc8285ea7b81fa415d761ca465e900c375ceeb04255d880912ee77690d8b0bfcf2743de895ca02196b9900,614839f76b3b7f5860288acb6cf5ffc1a3ed13dd62ea0d350f318ba48186df830bb19720b9b0fc89c810f53127b2f90862acd2264edaf81c89e0548ec516d98301,0e1da42d879205785eeec2c628e5853503784d2d8034a64e9b810162e682933f215999db57683b74d538f727b694077f66fb7ad6c1d1795afb92750a7f447ef301,3fc84ab5d71f6c895736d9578998a8de65b7c5ff50dce87972d2d4766e1790d21ec86042da2e5935354cffb781798003dbe9461c5916d6a651ac5d1862045b0701,b5eb4433e22c6eaae929a83b856dad8315a5c3d9f0c7ccb649fe9018a87f43e250778ba67f00976a876c1d47abb6ae6ceeeb5cbc37b5a0e61e2c435aa590bbee01 +276b6109cf39c08d6d0cadda92501efd996ccea03bfebb8132d8c87e42dac9c037b53ae375e465bce237f347918a077f492c23f67fa7e4bb5b091825bb248608d067bd9e90cb49731965dead310b47735bd35852219be3ea0fd769f1378abc562d674b352471b59f471f0e7accac1264e4c15741d45baf5637c8e59b3f272de193fe199ee56d1cfe323d5cbe01327973105f8b17e182813325f1080c6198f8411392d813b37a7bff1197a714afe77319365568036f309625a3fa311eb2ac860abe2fa629b65d7b791bc3a60a85ad875b3935c66fb57016c517aafc5d899d7030b242cad9b16d24,18a4603e2c6344121c4e898faaabab8f8499c09aebc161b16b5d68bef1b4edca,8ecb6e2a4d4f08b85680a65b2ed5187c940c0b4e9a928fb5bb99c482eb6795430cc462bcaffaa16868eaa11b9c2c9523bf79d75e469d00e0f774292091bee01c01,81cf7927cee71ccd61bd327ea2c0ce3ee5026367b08905806c3c44c6c06a44484e86aa8abc4748aa29e3392c227158688713f5b2f8eabf9ff88f70d95e511d4e00,0055e737f29e67f67073fa76268b57fef88c680fd49a28c3dd945a1f882015f8285169540195d7a0f4254f00611ea0ed1d36df58adfb5fa59619e4fc107120e000,e0ec7e668975d471b7de9cb4a0fa29f505c7f1ff96ec9788731e72db41c91a093cbdeba30925dc83445ee1584b44419853e26bb9cc27174da28963b80d1093a401,c44454b9ce759c3ea0e2793bc75461eca57f6c0c05e89154a248b9e0bf09365d5ac2ada33dda9fa0edc522de042402b7a5cb53c320f572ecf3eb08839a48f5a401 +aea7a9c33a0e38ee70b32ba612de26675719b80a59827fb974e208be9ab3a214476b8d57c9b113ffa429ab1e00b305e0068aa3ea15aac2487f3e8a239526094d01c8cbe06f9923cead2fdbde255b11996e92955852913f17e54babea987e493de1d01e71134bda386b9e75155a729ad67ddf4962b05fa808d292eb0a4c1f059dc15520b5873da96a67fdb0a91af99ab8435a2ce8ebbedc5421b36d487edd0b45c66b604e4cab7905851f5625770a0f4bd324ea0b8ec7942794f2ccbf04db9dd3ab533e9ee20cf9c6513a406934c1e1c290f003069c39df117774bc92a8266814c7c09b789b6623,50001418c40dc34bf4ea09573be2ae141a66d4077580007cf79a5b9503071879,d9d55744ec857ac5f356e4bb69cef6ff4f809ff4723ba407f766df7b586072f77319fa28d82235bd6c1c936cbcccf5f48d7a9f4cdb2e6e5054a5cc28ed3bf83401,6f18a2d4b1d9ab47de3b7204d9c5e717fafe9d47d9f506fe78d92b1f646c59f915a2f121eeef37a6da2b77d4e7abe53ce2c0ca648381b9cb90c4e7329d5e65e301,400bb7bf0c4306851ef3834e5244088c2755136a7138efe679064a788283be5f5b3c171043261990ce5ef7653b2dd20fdbe2e2a074b5aefb8b4abadc3985caff00,beb88d60580bf1206398d6aa0b5dccf01202da883c993d7710da03fc3bc8daa7582947db474b25acbf9feb43b61bdff07ce81d9859e84cd7f9f35fe17d748c2c01,389f9ccf2e498078890b407b4fc29e94e541a8638d99bfa1c02b5d119232916941d35a681a9c8ab7de3def59c01c656a549debe4417a4f070cd227b6836c09ae00 +b378b01225f239116560366c3171948f6ba19e9533d5898db16671378c5a94532e6dc77bbebdbe70c429af2649558cf834fb7b69bea97111d8bc0f5bf980bc061530632a57175977e943ad8be98d8eadd8a6be82f497732300e35df002c601212325c870cb1a831924560a200d4d5c169b348deae52aea2110c13d8a58a1efc790e60535a710d943882936ed0649373b7cc9c742509adf86a357de0ab7131270b036f789dd5edb4b16060d8f94546e546daa3ca137460235d97bdc3050517324012eb6e2e5db8a4563496de0cfee63c8ba43ccf030508696e9b431304b06d6ff1b77e5a1e1570b,44b0778cb9900d1ddc7f86ff06b9c2a6c94b41e668531cc3b285d78ec3c722d9,d28bf53f20249b4817def82847798df1c60773f1a5c6846a56e6a6c026e4ce525918ace7c10db02ee6be1948c86b63b9da46918d1d32394e5de80dea5c4ae18900,b80e38b82cbc0f75353fd7be1ac4ffd0fb23e6cb0f66ae4229e757e6dd9b35610640d4ed68bf25087bcd94997b2a5846bc6517f0127d69970ad397673520258401,d64763fe7f838a464fa85ed6ab7e3f9ef5f139f102946f0bff6f7a3ef4e03dfd018eed005856514d7bbdbd595e7d18767f6ba516d2fd7eaf9b3e0d32cfdea86701,21809167b197ce1ccaf02c8ad851201539f0b7b0dc2a09b594c9aad57f7179026ec5da63553c796c66f283fe3bde6cd64ece05885fc69fd84b86751cd445e55500,1c220f36b52c470aa15339e680f98397e7747ebb930394d90793b18d5bc080787329f2a92ca7d4182578389e563ec4b86ba6d1e1fecd3857c59c3fb68461fc3900 +abb6b83eca809a6f132987bef3e9f07e0a20cd937fef12e7018ae9106fa4865be3e462b0718cdb00b4f9a9ca2d2b7844ddfbaffa2d24639c90ba315c85b1df4e45f7df2ec4947814b06f6274df4920b1d28f0a9a7a01a8f72f192ef015bed28862f6366f927837f76c2731af14ad30a69e6ea3858e10cb7af5aee39838509ca32b3ea3f6790b6a3af7a5c9e8ff55b5e38778437c3824e2ff72348857ba52a30a7ff526f2193816302153531c934b47e7de0973796d88b5da5cdab4da31bd3988225c5d33572cc5dd1662bdac7f1dc35d6f423fdfd82d2fc130c1cad0161b0a5a683a9605bfdaa6,d3604066ea778a3b97ccb318fd36f2b456815051ae563f29874076c354795701,c46c814a4a938adddc8467261b3e2955218a8e0d646a419166f6cb798a7a4e5e5e4bef549ee520a5d7536b206c94526803176391e79522438e03c6b47694849b01,b2610addb190b8a5a859ff50c5557af9433a957118cba3163af71870ff62fefe3eb0441e6b3ce616985bcf1a55feb6429bd9100972eef42ab3a861165bca4a0200,308711136a5813c5b994c12541d817e165b5ada3e2de8b2ec62ac9a45bb78a003297a52de6b9f06e93de10a54b52ba5316107c9132e929bab716ef5d8a02687c01,6488afc31bc3ca3a98ce42f8c66ee9106bd9a138572182e57ee7f7d7c7da53ee2a244fb47bc616476499fd3ee4d4dfd3cbcf4f879d1488accdf81e958530bfbd01,49e3dee1a040e37c42e061dcd0b002f2b2ea1c8ac339ff30441e48b0be41892e547b496475bcd2bc7e037c6f1250104c2d3e007a378552da46e716935efe6e0a01 +f43e49845417822adfb9021a84a50f1fd13642ef46ac428d3ed3e115658bd922a2bb9d76f5e621d257a721414c61086e4701311d4fb273e2256fb70eafd029e0370ab8f63ba24b01894949691f13bfa543d71c962115bd78fa92a7898cc0df5bfbf8ea565b75c59031cd92dcd6e0ea8edcac1250f303f8dfbac9420808be573f3e5df4c752a5abdfec5b18d6c66bee60dba0da6ba86ec8c46a27072a60ffc79afe4287123d42fa09ee5a733627d4451d271728e6ef4ad287364413e3b4f0effdf77a0586076566fe2514d990bf615757a05e2aa48b2e8f8b46d58528fb5648874dd45cfe24beb3,bd0d65ef26d9eb2ab33d558a1362f4a640c237c15d80b47f19bc39acf9460bd3,a3216ac2d4f8cb93f44523fafa576118bc9657a4779e06553fa67fe6edac79ef6a313bff792b42745e153bd54fdecf4255718447120e1820ad859cbd9a8ad1ff00,b19be2fddd9c5a1cab6f080b610d643466d3374573e8d0d5f6d594768ca5996d0897c56e1b1b94ba3a168128382fb4e0ccc6d220530be105a6237471ef731c8401,6914f164c357ec0ada2e74be974c10a6ad4fae0bcaf3aaacf1c990b148ef2bde54fd7a4c8fe75b4c458d54e47e22fb7cb7e78164cbfeda8bc49d155fb7a7fa7c00,3c2736d0bd10641318f81e7947c542096c87e89364563ad754132fe8780a081f1c6f24d002ba3a5b4d614fc0b8239bb0c68d91acc2e11ecf451f57388a8cf3be00,6f96e22fe5b84d6b6970f1198b0914c016a3fb56448e61a9f6770ba480ce03310e52dc6fe4bc1b3e6eb1e4641f73528c86faaee48e37720fd415838036b51e2800 +85994a6c6e5c7185e7015066d0cab12d38c6b72b4ab0daa85a07d47117235dda1217a17f2a97b7f6f4398bcce2016cd641366ef84fd035bc345fefaa56dc6295211a27c6903e38f0f0caefb03ca48692ceb5c20cbb12e2f5c47b330f9c06ab8fb9f6ad5e54dcce6a3fea3e2d5c8a86b51dbfafd9dfab201cb47e02ae95d140a4cce67437af027fcfe44feeaa35c94848713ae862e73606074933e9ef6ebaa4c1335e63750e5daa4dab93903838185c6a6546f542ab039a8e7dba07fa81eb8d81608065f28a5141c54fbf4ec688593adf8bcd829556aaf2ddd77b244c4e9ea27ff99520c1a25eba,00024ab8e4e753d419e0ed19e0f5fcddeda16381629cbe2ef7149f8077395bd9,731f72545e96c308d46aed6d5aa16836aa1da841e5b171d217920beb346929605284d236ad6fd38783f12b205e2c7abedca73e46c451fcdba3b01262889f26bd00,22733ca047c1bd47cea9ac0022f839370182bebc3066a2f069e437249b56693e2f21eafd4d28c4f2f58b5c4267385e7c0303c98837277006286dc2196ca5218200,1684fd6db153d76d3e896e63d5b7c73d62173c12c0eaed3f83f63e40ee6a2db42f41536df7ab65047a194305069fa1f3571a8a5586cb6827f08cef482cfeda2900,5ae3ae53ea11156039d1bf89d9e08794d24e46efaeb763a0a7c17d42648923355f1ccb23f8882db54f376c6a9c3c2691782a75fc3b885ae3dccd463d59c3f15801,f2ab16c9e766973fc0e7325fac2258a1196c9c209a19b4188a2aff7671744be858fde476940272741f89484036337ad733277f6595f1ca571031430716310ee400 +c1ec2004b531bc295917fc84fa2908b47c4c20b0270e21148585ffdf7922e9f41cdaa936f8ff9bf067ba1a8089c67dcecb3f55a8427c3891c1a6f5ef703f1fd49231860715d8a40302544425febca53c61886caa9c7b03b811ceb7d18eefa6c7c967b403a3a1298ae3a9aa60cf27e8190c7b124ad8623759e5bf78ada987c4e228055a4093fc1d75f93b3ca0c689caada7adaa28633958e3f81436afbb7f37d6eecf612c9d20b281b4e0fa77708a4dbbcd68b7321ca3fc874b24c517cea8f7b717f56248bbbddf2cbe633318add0e7c7c75e399eb666d3d333bbc33a93de24daad1ac8c80b1e33,20b2095f9eeab82b14f9d198a48edf7a676fb157bc6c2ca1a2f85bfec560217f,75dc738bfafec1033ac3ca4b34078dd4310a679d078c95b4aa7605e3fe5e490f2afc75a2eda8c35eedf26a0cb5180221c943f5c2bb710ebbc842c775c07d336201,9cb92e1074c453fcfd3b2984a73bbbd9c2c2b1c3f65f9384c323efe613d9f9007655fe294455568f208b9aa08fa49253fdd53d13af1af073389505d4d1879ab701,5322d6b23c41218a73b3d1b2ac1a112fcf50bfd3ae0c6d5e16b2b8295f4a11b94ccc2d0114b3e7fdc215417dfc50d37f43e01f1c4d2ddf0e2a148fda25d64f1501,7fa8206b88b64b4c8f32c19f3f47ae7f5f7019a2b5d55f92531ccbcec04a1bf020ac10bda6dd02f7bba36ccea938dcafdc76d1699759a910e4878fe917bfe46500,a9e75b94cfc5a5ecef2d2b6a0b72048d2285de72b7be52d5a4343be4c989d0d54d221cbdfdb9a91b4b5359622b24cf6e2154cc1e2016d74793825c9d25d8b75000 +bf535c7db6bbfbfa33e5225151d06a8e1f888e7c0f08f2d7d71e928240384ada0d45937e77a84a3cc91f6e01bb38b94d6e6a4e5eb79d79358b02e0cc9f9c26f4181b740bf99861a6a6193615c4bf41f09bc7ca5db8e50ac9bb873ea7347b48d20234dc2d5b1f45c62728984133cfeab1f1d91b7e8ed84465d99c27077ac4272edbee795da96f2389bde38ef3ccef2a15b03437f2aaf7662a61f55a5d9138f674aae4a561ad30d8061656c5f557e6aa750030480f9bfe0c439d65e59e68d171474341acb3b9cf3930cf5454f18faecf3c8c55bbf5767a44b4c56cbe4d4220c336895361f9eced8aed,3780bd51ee092bdd3c8c2d4987654170e69158ffff606c7a4927ce7cbf7e09e4,5c8f11ca6bc6578a2dcb6d47d6582d3103c3d84dea7393c7bec0e08360446d136e1258fca423a5d9afd2731eaaa2417c68521684fdb82abfe139fea73dcdedf000,f0a5b20a5ce703aab8f1c5b72e5d469a9c38185bbcb9d0d641753f1c8c76367c705c60e10291142e183a3085e4a36008427b43ee2f8f7211b9c4cc760b808c0001,308889f1c1b94843d2e4f87a750fb177d2adf955c18fd56ee9dd0c9ef171d2f5029b66a43e8704d2381bc7c32e07ffde84730f99dfc42de66c6e1268befe142301,4bf7291c3e71d89ea680c98b8a24408aa0b2307368b3fd4e6457d0049f32f5196998ca2d8a75ee83d7f45e7117be36a96c0580842fc7a04a775c9b020eede24d01,b532e965a95eb93d02b66a910121f500583a5fde2a9d9b64fa73f4669b72d6e16e7dcdf8449eeaab6a6202e1393dbf3d6397aab9d09464bc97b9dc93af2f469300 +f19660a479a09262e2881e61475b582ed2d329811a72c57c9c196cb636059a09de81c3d1dc773720b02a611ab207b9028cbbee5e545a2984cd07f9462bab43fbe924bbfecfd6d10d19e9445a13142e6db925cbae9ece4cd8be5a3d6a6224a8498f8a813677138afd8ebf216ac67b33e2cb3a4910b23481d914fe7d61e6ee1036d23e0bd02d139efd91e5f7b0df6eb45e341eee151f4c075e592d49d6e84195fe72710d6e36aeef57b05a21d6c3fbe3d091bb6e9b231daba60a2666f28007c6c9ab8896d1cf79e601544b2891a461dd5678279fac56ed8d447878d4ee1df2f33c6cb4076811e6b9e7,54fd1e163f1a968380e7a5505cc3333e2ea96fcd3a77ff26c482e9c8fd059c05,e6f24cbc1038b4f66babdea2e2ee510894efbd457a1afe0831219b1f03fe5dd860fa6cd9ecbeb8bc4ad3f84a5e04359f62c451db9a2bc79d57f5b82d0796366500,30cb0bd0cc8e9c62d78724f284e07df9cfecbbc0e1a2bb1c4b6e4bd85cababa11fb03ef04041b1e3946f99e443de145d640605e038b31b4bf57854628777cf9d00,51f55708f222d16256743dc7197bc856661cebd78d68083fc34d39758bddd979755ed1d18799e15d052c769c3a1f1c02f662d259686ab28223e85c61415f934200,996b7e6314bcb0efc3c5cd8894c6cf27e26f55e1ae5db509862f8cda7e010ac571ca69e80350b105f6e8c293d0aebf534b37bcb648bed977fcede01631ddd1ed01,c435a2aec6c91ea24d98ff7ae6c292a23f2196544342050c5a9b1bc28af462b97e54b6c7e99fd1053eff2ac88b7e928b565bad25d02a46b2fcac6615b729bb3d00 +c2e9de17ff11f6f15f386fc38b9faaa0421abe52697c23ac8618a333506823126a96a583fe93211f0913b4f27b30152756240862c0562f66fb7ab583a99895138e08345f4ff7ad5b1f211b2d7d1df2047d008aa9f56a3fe47ead41d3fb64605b397ec1617407e3e861f7232b05f68db6478cd80b05f2e6fdfb3d0ca101d650e708ba868ecff4060d6ddce57dfdec13c0baf9ebeae0b773bfa5d493f80fd56e6eca06d85f1bd227842031e056b934408dcf60f049d1102f4d70b2b23a413e6375e3597f0456248deeef1c247c65221fcc00788c7c69c46ae549971bba815e82da79595ebd50e2c1d2,55771a9b129892e77cd36adf29a4187924e1f0436924c55d61cb6dc6a52f8f97,54ed32da94655d8d26fa2fe8a50d9bd84c1c100419fc690192873317e57372ae7fd41ff03281c3e0b74d110470dc715f62e51fc2855d47e1819c8e7d93f2972a00,3a3625c6662d148e0b91836ceb39ed0ff7a4468b3e1ea31187f127353d03095d087493f24eb0c9e26ea0e9b0755aff56de9aa4166068ebb557d0cba85beb6df001,0b0693cfcb8a60e4ed17ca4f152a8f181f54b56a6c62000f978149acc4cfe764215a6179388a028247bb99767ae520b6878ca36f411d407703b1e1801ab4ec7001,40d8abf8da47184a66aaee86067a12f6795c066d8e3ea4f536b3f9cf8b4cce835c7d35d3c1f01b303a4c28101b2bf0294a2dcd69cfcd5e35b63316acf8cc850601,2b378529758e6a9f1b7b1a92ae6b041f7fddb845642375b44a383b7d16efedb91d152dc2bae67f6b1068edc68bd4e8085cc9b06934d3eeee1a88b233221cb7c101 +d0c7ec0373d6504e1b3351dfb63759bbeb1734446eb66c1eed320790ab32abca6978fdcf7a54090b0a170f4aef69598f24e8504bf624507afb9d695ea6eec256d79f7c6f205052b163e02416731b9421fc92596e91e6ca1b1ac8485b9cfe5c8c80b80424d06aba013ad36116568a1be2c5d51244bfe4faab65eef52dbe588d34bcea5778dd67f69b5335fa7c0c4e0321644ca73ca97325878d69c13a479ce5605d0031883984aac9119c5134fc6b0339f0ca0202f4d39ff9dea9bb964b5c47120d776138d72c9236b5f89dc2b24c9de49a871682962705b41155ff52541f4a1c1625417ddc661606,eadbd579cd717fd4630af25a5b94113567e19865dc59305e23667e39c1186dd3,b287e2c6dedfe901b379674186a3e094b7719d70ac180529d4a0673abb20546469399768e9d93266688a234225da734646f430335b524c25c1eed6aecf5aa95a01,0cbc8c14e2ed74ea20b15762630ac8a44e00659786ee515ac2ec86d2d1828fe8102d9342f4f16256b71782724444cdd10b4d3dd8b5615c85183af77119f9367501,dd6a9b7744c20673ef075054c1c03f6fe290f59db5b425940b29a26ef7ccb72e192255341fa334b762c4086ba5ac65215c4afcfb8f746eedba4d8439cb42823701,e5196fcba25098ddd29e00c64a36495cb6b00a57812f36d9d4032b745c5c131d57b420b0d41740b6c46b8f217944b4e9d4b8c3a13ac6df4cab6f2932e598751801,59e775394190096e19bb11d6318d80b2874c60937676e5daae9e415e090f077973f1581db7f23adc5eedacb3fce16b2ffbd953672a2b6620312e8c963250806b01 +76b7fc1dc373b3bb57ba99d682d54fd5226b1bc2773c4c0e46ec1f63c7a1ffcded90a2f854c9b1ca9a09976cfaa9b30be3ebfa6dcf0f8be39949c887c096522502251725ffcea09c25ba95c434a623c9f4dab6fff938bc2142ec11563ed4ce9105041cb6cf5cc77a0c78820df20152f55a02a6de6164138b48c8a2f70805b47bf67c9b1a10f6b7792fa6d6e4cec75d5de3c7d25bee02ab615ab65bbf3f1e4f379de4f116f931066a2c438883d84d6e8dce89da3680c541a11a4ba07a830774cdd979128d6a9398c739f11a8fb89e82fbe5186c692b9bd20f5a619e024cc22d08bc8d977e15e08078,d38e140572b30e4b507bbd397275bbb8902aeeb4245dc5826afcac576b814b7b,1810870c5f33dcd2cc43500be4f37c17b4a0dbdbc829705141cd43e19a422d010ca91d39e82d14e9a13db9a5a72a137adcb5521108ce0d314f19b1bf2225344b00,2f442c304958b90e381e73b3e8ad80cbb097f495825af4020a9edc7d79495f122ec1cad3a68814a3447efb3d860b2e43cadf31dc546cf7ab6874922a2d5881bb00,8fece0a9564d6c129f95185133d25018c75130e8e6c64195cb36e14a405daf9e2b0f2d42f2aaf725e7ac9df87744f622811b6627ffdb36db4e15823e663f67df01,2b8c8064033293fcc2bd4b4fbf3210450517e95f9fb98cf1688039738205afa160e6b1fe72615f4971b238139cfa0d9404b0298647b9d6b104d74c869e904edc00,99bab533ec64cbf2374bf178bb6b497326c4359361f8fd4dc815072f47de038640a33107c82fa0507e783bbf261573fbf611a69b50a88faa22370733cdf9f2e301 +db2df6af1374cb3a5af644b69cb852d1de09b8c15c09deab4b78b8c92ecd3eebfbc18f0dbd93647d2caf0daf2644e54f995016998057f3b943f57da21f00fafc51fa45b00eeacafe11eaeeac3b7a854d8d2e3b2326a0593616b9674967f889d5df364448ebeaeff303b72c77e6f793c4f9e6606b46e2a03e765b47f4fa6973a3b965b95da79f801948f092065b7a6591ff26bf8f8db13b814527b5f1b5f0c3214267b78ec9468e4efc8b3a1bbc2d7412b25bd73da11d44e4a08797af818428f75e939133085a8d077c70874b11ff0484d0be07412ed30132e6cd94f7c10aa6de17510b7c6c9c960a,634227f6dee383dd1696ba34cc964b47a72589341fa9bac2520b443afaa0a302,3ee00de9d682e4c48f5e95b601b4d064102864481867cc5dcc248182ec57adc157d2ec0d72618b1c4c13b3a2eeb556ad391dfa398062269f6d5040549734029901,e2596d6a4452e1462a206617e818ebf5f2fe65a638b963b3f40b046485503edb2bdc626d87d180f725fdee5ded7b67ab3f02068e39d0e71d19094522bc939f4e01,c364f3a47c30149b67e1e40206cf272805f740a9ce629b0713712b9d7dc5635c3139cbeaa399359d7b3739b82c09590556835a74316cdf284fe90a3b383c029b00,1c232aecb72de6b17e4a18f89076940a78dfc804a23dfac5e54a87f829c4d5fc166d5e6ac5f3b6f6d86baf30a6ed7135366790788a8f3b9f0305fad864d1112700,bc5dbde440211a17440a463569b554b953f1d8d6fbe80720a2b40b3dbbb9c32518e19ac44c6a8517c322e97af8120597272d323c44b1f41ec93c34bab3ecfa0701 +dbcc1ece7e841617c765f659714386eceb4a1a2006d7ce9b1c4a1b1814e869343f7f274b7b3bd237caea189f35b240b49044cb606489cf43734eada7b6dcbaf9fc70affd3fa6acc430c64fa695a10562982068a5b58e1685f4aedf5a652d85f41f63e62a180fc7953d1ed28309a7457c0105f14ee2bc72c0bd6beee286fd371c73a7b5d4cae2e7e976da276d02cb052270dc1d177caf3195135ec716c5ca0b5778f87f772a7e9d4d6b37bbf41b977dedbd727ee05968003c6fc36a52944ace7d9d7848e9089ceeb03a5907109ce7286581e2e76bf5fdefebefab9717d379f6af747110536795488e,4c277fe51003c61beedc5e0f8fcebc939d1d7a20262641963c14800727f8b946,7413c09adc704e0dc305b28dff3775e5c9cf32f16e1ae9ce60ef0882d63d3d14228587af839d1d542f3c00500722f63985a397fe05f395b2c04163a28e51ce9f01,6fce6c57a51661873c7d6a769c5d2d7c382e856f0c4261ebd4a48284bdd29ba02b1052f8a9ec6e9bb99a2e54bb62f907c7915a9d6a262c915c9cf17af73b039300,feee01e17e8d0605ad3562a5c6fafc113fe40a75642e9bac6c187f5b03f92bc7016b6b2317ecac6d9f17c1b9c14e39fd7a23ec456c427d5d2ca780f00891f53e00,eae91aee2448f7888f77cadc70958a6c0d0d5345017ebf46484b0208e1e6dc6824732a14e0ec1f2ac4b401a10799ed7dae9243ba8d148b46fefdbd6f2c14aea500,63944de9fd1e0fbe1e614e560c5d73796c34bb699e58c7669b5cdcc5872884e045074f38db82966b11ed17ff41ec29e07121a9d147d7e1a4c955550a189d4b5501 +4627d92a00ebfbac5903683db58f83017041f55bbf33dfab3df9148da6f6fa6aba0aabb0e1af92a5eb3b3b4116e3b973fb4da4fdcc17764c7f6b102c462820f01ec2c1beffa873ecec3cbc0d3a75e3f1e66ff52202caab8fe7354749a2f270d8fb0959bb1aefa12a6432a3e9afaa4a2e4699888d39971ccd1aee39bc8ecde71dd80997b5cdb40c0b8b99e942e8b3a4d4d81582b2b406aa6389d3596890b5527ab0b88a3bb50ff0ddb5365a820f5fdeac7b8bae1ba907affa5b11a35228b9d63317347a231c64395b02cf99d22b93905ddeb17d4820b2a800f63fcac503a138192321e136c2e1efae,a2c1e7093aac8eb2eb1cbdf5f0e9a725872a30e05891c4fd066cac0ba13353f8,275b91e83ed2661da796fc7e95152e4ed4cba3a256f1a958ca864ddbebd81dcb25e05cbb80859b8a836e2033651c1a8201c357f10ca7607447aa26bf7eb3830a00,c4f6d43aa9b72f2ef868826af9155a4b1f2378fca2464b40dba02dc13ea03f5a427115312be211ac7897851dc58716e94b8ae1671cdf5d5825325e27df2572e501,0fa2ef81010f876d70670040ae248b1661f277da9ad1113979c4a99fbc843cd8159a45d17e0ca37e819947eba7c0fcca8aa3c2bf7d7ccc42e6745bcc0b17032901,d5c125d9ca64d2d7df69786d2186a165fd582f03ef38252cf89b06a8236e0fb37252e1b6335cd555627c0a67b93037e13dbec055f325cf18a899baa1e982688401,9a69bdbb1833236febccfa07da0ce941b7603f051510ff190b203c0f76523ee44b163435cc78d91cb5a1af5bcebacebb63a41672fc3ce013b094eaf3f4c4a73201 +272a487b1c67d17c4d8f467a82e2cd247dc466ae76cc37a0c9b4250d437260ec4126fd42f72929bde0dcc4c3cfe7af725c2b3fd73ccf850720631fe485b26465c84e56ec7f014fae18061f17e3ddf52e93a560de8d77e1bd130470fbd3d4051747fdfe3bebfd655aef310ef5b8802aff9bdb602192b2b86050f805f74baa35c61c0ad993291c501d8e8424989bb7cee3bcb0b4b51e0e0cbeeeb0fb6b8736bffe943f939196f0e966c3356d5a23c7b3016da997e681b8f161319c748c790e0bd1911701d55f9f234259ac9d1169ee0cbe25752ee5b55a2f99af87aa8cb05149955d760ed07b7e92fc,7df07681c9416731c0221cb741e7c2c20955044259733519574786df5f6724cd,51ab60cb6e14d68880e651fc4ae15f283d69512025e902586ba093c4f740dd9e3e0fb7566a94d90d4070b441549dd641a5e4d31b24c4bb9cb08498ecbca6367301,5929b3fd063a1fcb96f2346412e8b6b9f79b131c671ffe40eb4f9e219a67e8b52d35cd9b7ae41c9c55fcdc4bb921d4d8efab40ef8ed4037e146ac0bab86a635401,67bb0da5ab264cb75c31a6291d8391748b3faec6f67574d006c3eb1e59c8d6d55f7052c03761158e7b6e387149e36f21640fb39e87e75adc3dd8c022c2db59cf01,ecd996b93cb84e826df70fc25fc02ce0746ca00de22bd1e3be46c5b54a0fb955462bc4ccd1f8393181b25571ddb77b7e515b8d6f2eafb7130a338eedab61ed3701,975fd3871f15c71cd9b8caac910ea1397c9a09d725690f7c30e46c2ab2404b5948400bb27944f4a1ebee71362c08a48b8c0257aaa0eb0de47a5a646775fc966601 +a47d8db0a73664f91a7af0a9431dcb8f37805e7b3a87f2b31d1ffb409a526300e5f494fcd8b3f5d50387df81dc197b3068c7a64ae1d9247c2de81064753522fe0605cde0903b8e6743a4253209fe5e1ca899e8ceca9db54e7e0f847c2d911df27be59534df5ab49626c76f157dbe6f7fc421a29a70ea220c349d1d9b4dd41a88d6d71ff9b4d1f70531a51cb07dc278fe657925ae37565a97b554d2ec2a9347d5bf8d84afa5741acf81a394480be1dd8049ca30dfc4080ff4e302522eb605c482af84ab864afd86bb3ae9f03b234da3ceca15d192b5d61a983c272ba39c55999277a18d8f834e0732,61e57563065d5054062df4501d479c84d81cfe43a91f5f932368e319f56e8769,e7eaf087ded56de8bd776416e9ec44a4044001b7c8227e681905cc8db14884880c2b2f73c7ab2f149fe42474ed7e6a0ab979b01437f0196a95807e59b98b8e7301,f75e3e6b6fe719edc7800927593817affdc65c525ec4a43ae2ab3f8f67066e7d2b54cf6f386bbcedd0954265bac693bb832e644b41bd0272c3a5f299b4e0b74101,b4bf72c99e6a42225468f3a4cc97ac3a8b4d601ace187cc16d27aa106b0b429565c6018f0f065d1ebc2724879e6425927e1cf071dd45de9d6ffb308c749cd0d900,41c80b8f3b09af681ae871f6eaff5d3889b5da5c24362a43a847e88a293c80934d9e415c58366035042bec80e2bba7ac2ca5f4106a1f10f7e42603a6340131b601,bd8eab003638f0f054259729957873b0a17683a529bf7f4f7e8aee79f78bd33c5b72f60a4dbb31b786eae4a712d6733c653a0a94914bc0930f7fec98a61c315b01 +3b6ad1e52611d810c2a0ee7f463dfc09194bf437d45b0d47b9c014abec726553a7e417b7af0558332a89376fcd480d26d26504b9f0c1d4c337a672f4a7c04994ed08b14befa19c743cc43124cdafb595cde2b04cd3f63e7cab394ef142cdbc52fe9157084cf9d3accfdabb252b9916260f66dd3532022176828d863b82f3908733bfed73359f13840014f7179cb2df455ab7e7b37c107b3215200c98e1995b21022763803e5ff96c4d329c65ed0fa7dd99c79f6a5daf078d65590788bc42c13cf69541999d1108fb0edcddf1c5a4b0b75cbfcbb36a3b4a847585f691f5cb93625cdf511fa131515f63,7c7c8adb2c63321b9c5712cd62dd2afb4692fb264bce5666ff6b7ab111ce373c,ce54603bfcc38c5fdd26571ab9b2fd8abb0b6bc13d9d25af581b0c1e2b911f956ae7567944bc13a291353875cf225a99725e7588cca8120ebb14ed00f65150d600,0798998c4ada1f88619a72b69b7390f4e68c139fdfa533c61e7aa75de03a69a16b354e39b5bdf7ca5990531dc6a3679c1bf2530f9afe4ec1af32d268f6b0a7e601,b9cbd6b359068f38bee6a3ff1dbf18a4bacf89176cb76a967c814a9ed3893851323af812dbc40fcafe8037422b4ca53d2e6041fefd4b409014cd8dd98979298200,29e8c7ac95cc4fe4bb63c8d211c29cd5ede4ef4d77f08d715cc4a0013925c104434c74d6f9597d0843e2a9937038a8e1af9b16ca48dc4689aab0395aa2562d4600,b5d04fb0826c2583dcf821805fba10dbfbe4c66f27bb8600810f84a6bb580cc107821d080b824cefb348eb53ea04bef16bee7cbddbba3ccf7739151d7e61fa3001 +9dd415aed59477d9ce853506f7367fcef6f64866bd160909a460343c1968cfb5964f203b68c26fb1ae8bbe0d1e0c8c1a5c26fe743ae1b3d4a58466f68bd9aba9b262711f9be5dcec57ebd0c1660af26fcb5bdf2c47607f9b189e236b205557a6e0783ba0f90cd752c63c8991e27cf693f127ac8d554469b8ffc8b3b387db042dfe6abe1a970564595666de984decaee744c6911fa634d02444bfc8c664a599e81188663e6a6aa9a8d337bf0eb9e80eaa8458b52cfc656d19da03b066ec6599e27008ac1ea14c45611532c4b2959cb74e3ccbd3947a1fb06513fcc928d291fd30540222db13ef232cb3,6579985b8f1c7d3b205eb7cce3758189c5223707539c162320a1b60ede1f4c90,e49041a9219498435aaf300e51c63252b624ede725d43324d8d3ad589c304a9b6b4525718a226f145eabe7f403f9194956a56007522fe068c11c614f7f4e2af101,40c433db9aecbf7ccb2c7a53cb33f7ea6a6ec5b321de106686b02d34160aa7600310f043ec66728961b0cbaa5e2bf17a289e612cd9b45081cfdc8033ae35c1eb00,4f8f8e679f27466fbea8464d95cf412d45e0155fc4f15c04576b39b96787d54b68e650cdfe81f7fcf8f57f11b367eb6899909facdd55ac88d42b0ce4a7efd0f800,3a61551830311c050c2fe1cb5bf677ae1b71c021f79939813cdbf2c32ec1826165fcfc5317ccc2dd0930efee7ed9d51b7c3def6f7d0f5f356ac862fcb609866b01,75e3f3e1d023efe857a27e0de77fa3b0a830f3614927577f62c4f5dcfd152def4dc21ff915b2574af0beefb56802cf33d5422b5ad7b13f83aad02f5f6e3bc1b901 +32d3d3223b90d2ced2a7823dce6b0370fd0816712e343f2dfb9be035dd501491bdf68bcb849c5f97ede18028854620f2ba31a4ea5cc336934bc3f8c58b901394c2f84b7b951660def0e63beebd4c928598fef96094e0d23f946ef235d89da944921e994bc4550143ded915ae67895ed9a5fbca11475a1b9fb177ce83628346c8eeaaf79cf646a187c34d261f8378147205d3e0b4d1326cb272ff925747c4e7d308eb52b85dd94f359d948205c8528e4bc80c32a533eafd382a4a590548412d7ebb4a2f3249f1c6c1262aa54149c9cff17ab9a258e9ed443eab4b0298d32e0b568c0c71b6fd9228d4fb,2eb0d9272f20f0dd19635fb567933db4b932aba20b906e0b40a50d1a7e5871fc,16fa336f86744e44e8aceb864d34c042b7589e001da15b05bfce6704f3dab0522d989f94c8fa03631006a50a45c9d177bb6f8feee2e64270f38b6f9ccdabc04401,de9e6c99752049a84e68088d83479bcdec9edbfc0bfe20504ccb4894cfc88e8314ea50ad1e5da3150cdd5101a12922ee96cd2f843cbbe14748cac2d520bfa9da00,374bb19a1f7f332ada1a44d57498a8aad8df3810c8fc2c1f957c56bcfb2268247942e87cd4154d72db4e5f4d0a1b91d6d71ed99f1d38570e5e7e0f054824360700,cf84b6a7fd744cafef2feb44acb925d524d018edda8475b3ff14d7b0498e37406132a2ed74c667220ee18559e161ca7abe8877e34611acb7ab9615f152d6321400,3d993bcdef25a658e8c3f5bab56accab5cf9b5c6bbb3bab2c70e88863d264f191571e73c351e90593f3f6227bd6b94cb48294607de040acf75f0b849bd2ceee801 +793b02002cb147ecf9289e3f9663f3d36652a9fa31d9598a1d18f3e64fddf296578df30554c6c8d591e96decbbc96cae05b127de93cacc6deeb911117a68317b3fb5ccb10f5e4c99c678ccb4131f70f93ee2bf93660c17bc570853259873180fd524cf0935ba70ea8fb748b9ae85c9d245e9fe0a1b5eae0c66237dddad9d5d94106febd4950e7ab3ada91b4f1a917c5904ef43a594b2bf8a2e09563a0c010f2e4f0ae151690ecc735fe618d8d0518ff00be395efcbf547d650dcc6fb7c04bd64bdc2c05dd9320df3d0d1cc4c818c93c8c6134570148fb95e69decb52faa9f67fae1d1315cce7732f42,512bbbb9d9634afda08f95bec56be7b90bcb9f4d9fabb093ecefb018a574ff5b,60f7ecc4e2ef3b2de3d316b6213700bb88efd9879cb5b4ed0fbd27317747533e5fd9105e18384365a23ba7a4ca9cf798bb69eef749431afc13d94d96d8311dc200,ac7fae21b79c5ddea2598844a92da2171962243fa34c1a40603798bf1c209cc414fa91340162871628def49753b8eb49e358807de601e208ef523ad3bf776cb201,851645ea850e40226c4e888ef9a9e61b80ef0470993cf161daab965b6fd2ee8235ffa8864c787d62ecbf89f11e41dfcc8d80011f4e4a80bf9ce5d32a1c000d1c00,ce57018cec08e5acb8ac3a0b37c78afb9b2fb3da4b0df0bd9f5765a05c8d0002793d3444bc16b6f8afa8e3a6505fe323df28ebf4fd5caf8bf982d7f08429e7cb01,6f88496230a4cf0ae293c9a3ae8fc66cc314c61c9e5bc4e366dd22bbf0cdf5e466d7709b79aa51afce355bd8ee5d5aacb40bcedbfa40509439c6092bf101afbd00 +887d057933df47fd3dadd70d729537b162463a150f9de52f14e6eb713d780cd5c88f98f1fdcac2d74e99e816d74e219ae62dfc544b78ddf6bc603f53626de310675e2c047dcea4962bb0e77a9fb9d49b0c078a1a1ff5661afb87c0a0b60a920c1741e0cd42f2d89a33d1cabe1803c3926a57933e924cf2fc3af38717eb1fc13c3c3e27630d0a8a348e7944a528ca770a0ec126ff7ca5325b9e58b70cbfb215051e012cb27aff756d0ea408ea74d3fc4fe2364ea61116763fe79078e14f7488cf2917e0c7bce1cff7ccd53980ff232a30fb3770c2f23fd16c1f49c27df913c788e64d719564c7723c58,d29172c53fd08410d8812bbaac4e0b6246bd911fd2beb75ebc612636d75a5d28,6d685cca43d0935501c804a08beaa83622ab6c190effcb533efad5dce6eb15ff7a01438ccbf60cfee387bc84c6d40e5f848f35b6ba5b6b2081ec9139308ba8ca00,7bba3115f6cc381ba4b0950220330d9a5d5333bb3e9877cc4029b4763dfee10e6f450411498c14cfa7d0122d077b66ba7d27a6042b381fd0bbdb867dbdc19e7e00,cf6569ea48aaeb7a90103ec036dd06c96fbb33ebf91e1961a3ee2dd460dcac5a56948c01ad89d11288002c1b0f122612263571b00fa74d956167d804c62aa06601,111d955d59ce8de122698a66b30b2082d2af66799c3dc0bc485dc2323060982b24c21f7d9a3c5c97ba9d6eb550ed3f94f48f1493be0edbfacbc1ca2298252f7b00,fb44553cdf64d9cdac1f9f2a7e36a57a486827fd495c8cd4239c68ccda0b6876068e56946fe2090f0898cb0c599aaa7e0a8809a315b97d67ee1c404526e4bda500 +9e8dc48cca2e0d05cade4e1ea05a14581968408d13a69ff812f29b776e99153c9f632d206de011996a8658d9e3386f02e0136cc7ae69d183f95f3703e7920a3500b721c63eefa3b87ad8c453f596d4f6600749d28b57f5d0c70894cd235bab985298ce2d00b3c03dbc83cf557e19aa77710efa296e73524d51564b6e39490f7b2b606adcb02fed2aa23b91cd7443ed9a6aa9a747aa4b1e7c99c33cd1c2f35f728e83e9579e6f6dd762cb2581c63bb3b88df6c549737e222654f7453c2156db51b11240c039ef32ba36e272be8cfc35b160cfafbcf1c7763d650b7da9683812f0c201fd95913310aeac,908fdd8f6eb4710af90500689abf5b4c2913d66964f247179fedf1f041f61769,3a06dcfc7b4b59efaa0c48c276fe54eca3f51c959d68ef18f86f0346c94848bf62b1cca76cd5c0b55745250746dea8c10aa7e70d8767c8aa5849a9cf9bb087be01,1a79ee597811438c8b84357f6e5efe31a31452d40c39dd8f657eea8ac2bd4a4b4b8bffef23ac5e9347522f35b4aa4fec07052752f7935eca28c809cb00c99a3c00,080f3df2ab6d22ea3bb0eb336c5e6dd5f2a10a752a9a16d13b4148cd5eb0627d1a764786994d731a885f895c3474b07f4dd0510de8d9e8cd1ba30706dd64d42c01,0e69737af2aec5c2356579de7d8671c0b6b5731dc8273463eb99692c0d20137433389c867002795a4d8c4e012d2847e92c575f9d3ef8bb2b547f4b4457ee5a3a01,e9dcfa3af87cfaa34aaed1367b1fa33ed8bd98f5d271da5cbaf0b16093d7f4e339710d812a95944353753871a4434ab5adc5e70e1edc74875f1b7b8406e3ed0600 +42063ec28d76b5608b245884e06a9725d7a025570468eda2604ece7ff9a0244e7012fd5752156cb7ea820d35d8eeb9fff43f76da768b017884511614f7e9a3650ecb411384fe8d7b8311775de34ca4d8ec45340d5ba57bc8f8ca2b8f7df499db59053677c89f7d772d1636fe502392d5a90e151e73f3e7132c1973ad5031332386e620a4ed7ab6ea2a7a87379e9840df90fcab25f7372031700f3a3d6535b7b5765b56fb17fd51a989e878503286efb01852a74cf4aef35367463d666d459c1b295953f8b5d4388b00099b530be2f908572350485a03efd6fd3336fcc235a4b4f652bfb6a6bf6275e3,425975a36d2ce2e9609932d184f49e4036b2141a9099224286860bc1f1c4777f,5c9b278519a03cdcfa7a739f080e1fbe43ecddcbb5ee4608fc825e071753b0d366b6d26eacb5ecbbd1f2ff331be6f80c762e33de889a334649c361f6846c986400,f2dcf4cbb7bfb98d371692ce8530500475db782eb6fd8d1ee084d18a1edd4ceb0cf0b80e115f3191c832a6d4eba4eced8164d4ce9ce0ab9f3b964b112d5849b201,19df579b77433c10d2627816b366760b99f8921604c559019f36c7292eedc9a81023802fda52daa457c305e2ed0f7072eb01fd740cd64e2fdd0f7a9b8947bbd401,5613ea3aeba1943d4d177c55129a35f816349d22c0c2a30e70ec7e4000cc0838528046a1aa1a35a29945d9331e121a2b1b50aa17f1dae65d8e1484dcdeb816e701,2b6ceb6380299d243d38e986c88cd06bf916d6acf725adbd48e00961b222cedf33102fee6adf4ca4df205b5e30e3098fb1e24bc3e98e8ef23ddbe42ef966af7300 +23bee102786b4f35dacdad0f02390c88ecdb66d4805340d014a960da180bc6387edc6ed0a95d2c0349d575e410338d2691c8626f3a1409abac8bdd6c4ebcfc119cd8ddec39a48671de4c5e5ca21425e6df24d0520327c93ccb20c53894e01632faffd3c737bf152cc6a348674fd4de64c249d922361ab6a15898f49b05fe4d7e2b6b32172d21a6d77cdd6916cb6a9340180f9f1d1f0d7003940f0a15322f725b3b1c342da4124b099bfb90077f13af571330bc879823e14dc9af4811a8b9f995fe912f30c384838989c1114d6cedf780eaa4f387a6ace0c1d80cd5909e1810187baf34db97a95043c6,2d252e7e9c932266be85d6253c96dd3eb4c47a615c86f2e10fcf413d817e2eaa,de1088b4b87b87a71c4ca8be7363759c7a208908b7fca9674b5157795c0606cf07e40e29dc3da70d348a13ab14e2d6a3b279efc5336c8d1ab7c5da6df40bac1700,4910ead21b40a76b2ece9d23651c904c83a1010dfccc961c838ebde2db556acf0061a9ad979b150dac9c9f66af1fdd732e33ff77348add0972eacc91dd0c84bf01,2d81ddf9fa832704c699e128856349d5493b692dea7d678a52a558cd1433e2be6c39762c2b878e3746255153c1452ceaf6be590a5bdd296bc27d74158a3e3b7001,48a74d89f7cde6a04133be652f6f0477ce8ad93aec4e2573682bf67e60ed2fe10bdc714c7abbdbf61fd29c99bc4a0817173bad8950ea264913e771cbe1713db400,89a6a35f7a4bc259ecfc5a24da89b732f260e7635cbb99f8d6b1dc10bf50456e1a05acfe657a1081deba69e8c8f26f8361f26db22a5a327f17fd5f076ac6364f00 +a8bda5ecfaec6f485bfcb6fc106f51a57194fa4cf1ac68151a895090b7b89a9c76b0a8de13a4ab1e1ec6de50c820c077ba5042b9afddf1959c664748c87d7af73bedd28882fe97e1bb799e78e18f9430589fd2f0f8d0ff4bf0c69fad14545fb1f1f8a7c2c6c62eac0828648820a6f53c5213c8f422ab96438df68de5fadee25935ecc4f6545c16ed442153c7447c5d92c51c43b10f51531e4821c8bd245708e739d9adc2542b3e711a4b3fba25ea8285240744a958b519658ca8de6c87cfd47d4bbbab21e1f6836cadb74c52a73fbf0ec3552ae939797310d673e20747e920ce5a170776d2c88a47a1,12bed604f85b513252d161dc541094df3a0f8bd40aefde9abf6ddde5faacdcb2,430602d1dd5b3c39f1ddc7895e3d4ae10f4a479633b0b6129912ff7c934a11c10f3bcc398879172de898c7d1975afca2c92e73d13daff69674b782e36703ef2c01,62df0af36458c3008c6c02cd98f0ab79de00b91e978a198a604e512f5b72fff201ff2dd37888e82833a51f06dfafc37a3a3cdfd04c2fbe83a3d22f8d5362608e01,249f4f956669b769772ec187cfecae2be1f588007ba56f68b3c7c1881e7b36de33b225ce90fb827cfbf472c5727f1a3614441a89e82d6c0ac627b1070b547a4001,0ad349f06fe702d1db741d130b327bd530ae1d44e16c60ba60a6d41e7d7a992635582b3384396e8fb4293afb96f351b6a1162c40aab92f16e8063dcf931b6a6200,dbe921ea14d0cf66a29b3263445ce4135d54381206108132dfbe6a22ca1d0941476c5d0386f2935bf978e5ffc66ee4e2604d2169befb1b0c977db36dc81cc93000 +303f22c3ec0b7c22ca7a3a5b555eea5b581a1e6c7611c97dac868b887d197b0b77bd35e6f7b02694e4c22cbc41183e9492bfc386582aa90ac3da683f43d4c18544332864159000f6912844790de570bf329240cda9c500170a493bb1f898cbe5f55183393b38ad50f08d7215e810b81c459f695e28776c7bc77727f64920994d0af2633399cf3decd4a22221ee40b4573bc894f7bba8b463f727feb8aeefb5c34df0db01d35865c6d5a2060889b829c331a438f331d3392f16f06977da4a24a28183937cd4689151b60f48f386a4ab58429787e7666a9ee4f992b45e86b8505cb4a50e10a06ee38335,70ec3b435ad46869cb03ed121bef2cd3c03ed1b4bb01112121b634ab630eea30,53c83b2b43985b21029fa4e03a3d1d6586579a5df6889bc31de53b3231e4df78065fc7415322273cbb2f2a5d15d8af9697904d6bb5e4545ef42cb5457dcd31d501,562c116a25222be0233bdb87fb084251d110d63e03a6d57fdadd74b2aae5804e58eec76ec9a1708a302a20d5a88301f5e9b5a9f3dc2cfdabe74704831cf3e8a900,b070b6a0cad3823a972aab1c95fa9643c6d02214ada3f4f67b4295d365a9c76b4694d26dc07cd071638f0818368a96a68f3960ac85219654040b73116aace04d01,d6862ae4def48b49ebca56066eb35b2ef874683b3684ed13d5444d2435a65af953cda68f98844be3470128b2d90a2cfff4896046b67153d06fe985aefd35d8bb01,94bdb725e6357160d16fa11e64f250380c56b843ed47032e40efcdbb68b48b7c3bb0cc7c0a9186583063711186de4bdcd1c11d9d5aed48d920c26adb9b6924e300 +ffb9e597b43f9471b4cd39e8e4e95cc372801584093db69e48d0eb2be553e799bfdf93e555a463fd852c278acdb79516fd6c619616cd4f026a054b1656b803d596d330c5893a10519dcde63d26d0b269caeb726195c5d136b13b0f70da3b4612ae5d3c39a2f3db55fa156eb4dee096b7e37b40a078aa9b4828504e8a19fe5a9bfa685de34f7ada04b763845ace7ac72decef29c96c07acda7872eb5167bb749bd8f1c7a132d0f033e0c41ee0eefa5e8872d888c4d06455671c1ed668a03ccec4e80679e64271245417379251a2739b115a2c7de0fab1721d424a1e53c65ee2863a24dfd6c7ee0c0be72d,4e73afe41edd128abf109f2e583bdb3c9b1ef38ed65f09308cc9e549e2de3dab,0ea152c95dd6009eef72114ecd927d721f9eeb44bad90328bbe63dfded7f64583877818b575ce4710c6d81fa2964e0a38d6df086b9e2cd71385c38122f33867201,acae5f752974af6ba895cd53a16f33d69a874a018b3748e36d90cd7783d7c0e1508fc9187bafc2e0d6989128502992ad5286fba4aad04c15c897d8088c4305ad01,52744ccb1c6ae44c180af8c2b5d8a3c235af9c75880e1577ac23989c5588e4eb74c1a51bded32ecf7708e70912cb20347af009c5536e03376af25af47c4c917000,4deb3dc8f0853f88f9747514db07fef000a4932c05f469981be8008429c8d34b4006a7f83ddc32a72ee1111f142dc8100e05dbf4958b64f08c4e9b8fb1c434aa01,0cbd7933d88a2f61d40354dd9980d03a6f0560572da6e0a94619b5d0b71e33b412a9e2f31b42d0b8cc021e4a4bec2eda536f06d8fa47eba27a921ee7a42a971800 +ff2a698c4f13a98101856b5995ab361131ec2c66d20f2d87030fa9ee20635b57fc04af8f57453e32023f39ed45344d3bc6d2aa639521fa4ea505636ab6f6699614fb8391243f13b0e36d959d3b2eaa5d919e0b1a814507b09d94faa55c144c6edce6aacd949943017e53051237fcbaa33a889f314574569668489b7b22d66c8e5b5da768c045784d69528b12b6372c5ffd590f57670b2f5b675a56854eb87e7a94982c56ab2ab33644685e366b2f623e67df8d2ad7148449a8e2fc3735b0b9c047b3247961ca600913dda938718dee016d55138d412b39034f1b84f0c59797578242330ccdac6a5c7281,9b616fe87edcfa87f52b9ea0a053183e7443409724e49df7b8f15ba59735e399,017829c3844d975d3da4184de8d5740d8f7692bcd879ce535758e5bcfd220ec8003780a0d0dfdeaf26434e77acd222c37df9b3e3a0be5e85338dce36d84c53fc00,353aec578edf264f6b79e02afb6fedbcba64c88cc97165efa685ebe664809c3a49bcd11f3d3c987ef9622457ecdad931a11242361af342d4087c5999cdbd8b1601,c0ad580c3a6dd95a6ae51d5673c10d0985f2351d060c6ede03b10b0a73700bfd400e450ba5ecf1b9e04a9b73a1b461d711ea23f182614b693b85c0eb5abe011f01,386f9853e78c50723883096b9bb344e0dd3644325d061b8b2bd65e867e764783656e9884bc838fdb852d6f901690dfe8dd3453a43c90ffa920d5e6abd918488f00,31d3d64d80295ac784028a8f7e24b7d479f63383af6848cc773c6152e3817de728c9b53b93308aac3711cd9b624795e7467db11317baf41650fd8e4e80a0b08700 +ca50fc71e77b5fc1e0edff0fe1c32793c532fcaaf79a81ea8bc98cea74c5ae390457918aa26aaeac672023157dbd98dca0ba85249cc439ad2ee56dc4d96efbf421d7032e64b347071564893f2ae99b7f75f5606db6c6a844540916267f73e4ab18083356db7e3c48b6827adc0312062c509a08afa4c9d501a053264a89a0600606ddc6c860273b824f00bd660502b12a77b4545f052d9cf635bef943d6f40f5f2b9fdfb08dcda38f6b42313bb9827648782c421a74dc0c5964127fb0d604483190b89746229bc8067f252ae47688615dbb3f2ed9b94c8b2ee979285021cbaa904b7da57f39ef7fe2bb9b,1a911cd31ddd1b4a381e032a1ab79069ef82407382b4154d1109c1169013c761,7e183ded1dcd131bd61105eed319544bf9e2f5217b15f065ac54989aedd4893611c43c2934a0b13c2f7beb9224fb42204359db4b585ab826b5e1ec082b58dd3400,d95adaa4c640953f84ce8ad857bca960b5252169ed29c5551b8f2fb45e738bcb26c6edd0f060888812e6fe42f496200cbbf414cf0f7059bcd2d561687bfc125300,f9557710957d1446a1a5873e478ed19caa61b9801e8f2526d5b25da0cef4a90978f97c7407dc1b9b125c21a2ab15c6ec43bcae5dbda21c1a49253ba70223406f01,fa410390c8763dfe0bb5cb9475b4c113f6b4392254d2226884276016e78a3fe72606452dd5b8215d4d32b990576f625bfaaaaabda047033a33a4c070b835ca7001,2e1e23e60e6898276ec12a38a2fb6822c3c7e3c421e4664078aa231a45c70e7347f39e3e9677111c511de4706842bdf0270d0a7c6716df40c462ead73cd49c3d01 +e1cce1d5af9de58e5ce3a04e47a4cc354fffae8a12c0c107bf72ad6ad81d736ae5c7ead47de987b160758c32bf7bc30c6a6b0ddc0ed0f6aec733d59d5203d96954703fc4e1f5b06270e1d2bcc3a3f5d46b8f447bbad4bcc5c98fbd886f86c69dbbbd57438eb71e4bde92b32cbe699ac7453807120499809acf8547ed3a950417086d51011411934b6bf4ba78b0a385bc038b3e50f45882a1b9860f68d1393e0464ac5aa4ae8e70146cbb3f72a45e1f127ca7a6b87f67ab7e3363c5b6037ddb29ffbef66f1267390d80f3127f763db7447adeb29f52b1aefe33ceae0781cc849c97f347577f5d5afc1089,2d4cbac8875f333658cab37278e13fdd0fe04e7254f570c6dba4614b795add4e,2ca387aaf3c3dc001a5b07a36d99a1aec511836a264bf8006303e2655ce6383a528f36895a4aed86a0784c887ba4e304f80d37e8738204ee31a8a0a4d74e411801,200192696322087364bdbda62dcf76ad001518e02eede0a1dee300e29e490d4a165d0cd47a4dd8717f88707434d392e2bfb7f0f6381667d77ce529ab63b4f98201,93c354b2f53071caa7dbad2b3eacf75f8b162c0208cfc72850ebd18938a399ca6c2db9296d052c53b2a1a8a23df2c9c00b7e3bb18cfc2f2b1be7a5915789be3500,10e7217d2b79df8d74103df264df454d84786cf9f96960a01a658c3df8609be31414f28421cfeb03149a9d0fbbc5b93875c6a29a35e99051288b9e94bd882a8301,fa8b0c9d852c1921c1f7bc736c9b59e2d801df0515a50a4d1ec0cc0df790d1d8557d6ee1966ccd1069bcdbb853bc3c17ab931d3dfbdd00b07715727b7601d5e500 +542fcce7af26e25589b6be15033e1631643b5f3af36c745053a13a70d438efc14fce77d44831d3dc834fe6810345539163c4497dc7c421e61242302dac9f0bcad05c065b41a43c90de1ffbabef35b0744ba88aadb6f407439b3ae7514ad787276d50c5c899ed18d478b000570b323a921b1fecf413c05a1ee6d20acaa3719e4dfc9b839449fcc9889bc72393f88ddb85c71a3e78daed07354d8166a5dd077fb3f14e2cd174f56f3a4aa3c950ff5e16b418da88a9e6081c1ad29e6b750304289706f93483ca64a181d0aa3a8798e1717eba371146603c9e5030d9c027064c501baff7812f818764489599,96363114649e599850a5066d652af4c91a76c321c6678b76d8d94268ff8c3ab6,4d57227cab23186e2e5f57b8e75d370731357188ee0e1d1cd63554084ca44c987a13b26122c5c80cce70f9240d4b6b02a613704cc26d59021152304561f6deed01,cbd9d85ae20e1c7e16e8cebec8bbb99499f37e6289436a8fe104edec3de4da6a1cfab12f1b32fe67734bdc3a3fba037c0b48373d6be30f56afc48be4dcf1f29701,66d46b995a5a5812aa944c7f5521e2f97f653f086a878275a93aa667c5f815f45251a7ea6b46f5285897c1bfdaa7f28416f14c5d27c9dd32cc1264880f59e3b801,26a81685c1bec11ea26098cf71cdff4f2470ee7bfda4a786cfe2001e317809082f6a692126ec0dcfb656bfab96b54ae853a70099dbde9d100a536a7f58705d9501,8afb7f9403eb397ac31d9f54cf1438cec6d3864664d155e59c776376ee173c285c361607cdde32655cbe6fe102c753ef7a3a17aa0f5116918db3424b5378537b00 +b0be1fc19d3d2ad9cf59eb36996bee2ac89851c6925c36f824092bee1728a6227ea5a3b87247e2d5264e7820b81b004a93dcf946b2222c8ee7487daaddbffbefa132aed5ea57d7f32988306453a6011133565c8ed86e43ef1f729bde7fd73dd1a959f6aa686cb10afd154be73541caa0dded428c17557ca781fc11268707fac41bc8df007d1900238be78e05339826a059b05cd6c36299b2d999b847cc6dc652b50bf371772f0ab37f2f4edfa304a0430945993d7f96cbe31f6bdf22108ada945e380b5574115e6335252746336dbaad2d83227621ec4c4b5d442fa82361aa4f2f4464fcf0c70d40b055,a2ed6df8e4d94f6a311866977e08c5aa5bfdf44603061a4c8938b4665925c455,016115bc72f96e18e33c735ad4f0e3805f8370808839623d02880bddd4c866371baee9f913c580a096680b1d7c3d17ec24e4fada28995f178995b8fe09a0521a00,f8530bf750369cf29760a2aee4d085ae9130cfa206e1c002e714dd45e4bcf5080275021a9493b6ae753b29cc83678f9f8d4cd59b40b021b056da8770d5b5ee7601,3dbddaea4e56f5ad149e36c0cbed2f050f7e7d40f0996e5b1774f865810f336a67ba20b10303a6f85cafd67d8b452c28225b686229b504ded989917577a409c100,d359b4102ade236d7361894450ab3d5ec62601227ca8752dd35981fdfd7abedf4a195fef9af23eadc3c1c74e1b03ebc115f0cb9dac8de625c2ca68f4a252642c00,3b11e3a9f893ff3fe8f286492654267be67ae45fdbfd9fade3da523a8d65cac276648717ee12a342f0e210999a421dbc4f50959fa5aee2903356a4ce8667562000 +2ac50108412f275d532263e9ed0336049ef769856ce5619d1235db70e6e2b482b809adbff3fce6a6b6e9827091a952e1412ad57c9c7ae55e76ffc80359df2b297a32da52c66fa813a4268d9308c2ba7004d61783972f68535ecdd1b13da6ef1247289b81d93d6e63b0b0111d77ffe891374beb5bb6f8aa9598a6fd82520a29c6ffff9c782e26bda6d53a81e1bdab072339962256a65e7a38e0e4d74fe009bca9b01640ece0e0f0425d2c83c411dea6c74e51dec9f0771d28c1ceae7691834769f1f6b3c01d9d43092af66c19f50ab653e7b406a677ae1c230c86bda35149f2c714cf050837ce73644aa5,1737de9bd35ab7d19ad0ca2de2cc62637d805e692e2c994dcfea770aee991954,c394c4bd0a6250f7b01d4b3c9edc9235625dea0600e9ec1730a0360025f3481b27618ff8f8d6d2a36ad9ada24cc6df30de4c4f60287668ea5f91037b967bde9a00,75a14de36ebe786084f9aba0fa45edb071da5631d513f625442eed699123f8b127ac451f478d8db9189e487aa9753b945036722c3f1b876e61d9120517f467e401,9d6c3aa3b9e954a1e1156af4824fb3d7fa1fd6af1a373c3365cf1b8d3634d4c86155ba3f48c4c40bc42348f7c3c5d9e77765194f0be1360fc4001fc77381161500,b8b74ad23209218521afba6b0262790815ee9e48cc324d5d34592af382c71cda6eb4d98a57e7a37d1990a2139bc79df34874ae4bfafee0425e11feb4a94e147400,90f21bc80ab68861bd5a5d05e7f8cecb85434300d6bd2ac6d8fbd57f63502de1150e2e5cd8e25a73bccdb483328b48ef0b02414d77354e0079d6881817ed9d2000 +c750575155e4d1ea4bf8a7244575b5e66a76492b3d337b0673312c691e7936912b79c890caf37bf89fb578f6221c98626f6b9bc0a235296b38aa1ab88030d4e0f47a5dcbfc7011a321c8e918021f419c643e753e495e24b39766d884de4fbf143d604c0621563a2c78477a434dc6a154b90efdac581d427a6a8f6eb84ab74e9178d725a9764d1705e85b0499ed6463d8d89c5dd15dd96be13bab19241fa46f335e3fa821276c17a5dc25be9ea3857ece75e473593cbf29cd59666513bb969aeab79a3f3165be6bbd808c57cf5bae1542b2d52ed10c1dd96bee3ff9a02bb0b9b4fb51b400d713e1419317,fd89e9ac8457c8f214d8606f0cc36dcd003508b19a661ee562c7f4aeb027171b,4accd5dcdc72a3059b7a0cd178a9503eb30d9b3f533658dabaeee2a511f7b7035a18b11a9642d5229dbfebeaf6e6d3af28e855b8630aa2ac5fc0636b16513cb701,01f1675d9b83d8619a809e90e17a9a807c6c24be2552fdd027f2b01f484c2429000c1ffc3c5b5ab199f06bc7ffbf1831dd99f568f902e8bc3375dd28f163290900,6bc01c63a95e23afb4c5e9d8dec1b3ee52156a5f18c7ac4d3d483854ba794c461765c4b103596297ee9cf87d8db0e67be49e62df6a18f95aecf97648a1e6697400,7c1dd2799728ffabad6ee991e9c69541228b208d4cb5526d147c4d332d9f25bd5344640207f673fc006fc0301a4ae8d2d191d3789be37303c8fbef551f20885601,aad0d3c9af004129cba10d45919f4e3ae1648b52aa7400cbd51c83fb67eea8897cab643f2a13167fc0041e80d5cbab3d72f750f30839d5bc7c9f89783009122900 +a8e42a5532bdc73890aa487b84b43d977ec24a8fb91a7e56b0873813b82ba456e3826be30312fc0bdff300da446e28b247fe4f9cf97209c39f1091cd4c27e81fe9b4d233b90091ce286aa0b4ca8021f161cb478640c513b9d19bde6c94eace28d36921b0a220bd2f6c71a8d1da283021b19def1e290e199db57fbc31cf07708ba9b79f177dca5015b41dd736ff70925921c731ecf223a49ec51776225e90989fe29e0e2a7c426e8a23d892f273c90db789b2e002249bf7ef26c533d566aecdd4133dec3b8977a4b012631c05b08a80dd39b13b183483d4ef89a8739be26bc22c9c4862e7cb718318f03b,b3c118ef7579ff6b95c29fa0b821a1b72ea2a8d334dd0b1cb2959749a9037072,4e351b2a4d20df44d95fb0f3134eb6b76394ede82610645590f985498082e9eb30ae36c19e36e54babfa8ff1a5657224c2b6c3afb6f8f967d1f0f94438bebe3a00,c15a090d4526c010f7ee8a8034cf599eb68d67e01d9a41b65a1be4e80c438cbc180340531d83c6a7856bbf347b278c5b33b49f4b404e83ab5ecd2d87e957934601,52c83e09306e5453e3e9e0e887965c24fccd165326e1f037df8260486d48002e23834bbcd387ff25989dfc395235904a04ea1c7401bdf618a40c2facfd81930400,cd2fff743739427d058cafbf61b31834fc69195568246ddcdc23408f168668c37f04039cf03adf8ddac4f873c7936b522112146bdb5061029372dbc2c792921800,bcd4dd9b9b2a3eabe1e71030b40ceec3d602ad7a947bcf81aec5e7450fde87af2363987b3261023b3fd7b108b6ad97501e04378e260d57cb39bf26d38146ef5f00 +4e52540d8d2f6baa9e0e64d34341d2f98dac54c243d3ddfc6939ad7d53799446f54f18af52cced4baa57c6a91caf3813398c8af6059828b84962c614c63f1d82db505a9b34ef20c73b0698172cc3079e1f2bb0e15104f0799e3ad2d4f3348c13caec8ddc62a18497a3218767058a7990097224d4b528c5c78ca6b2a8a15e0134e54bc9b78000cb08a7e02496001ac0767f2e4b04f7659f4da2b7fdd7a2e23e6ca9456b3d92a97b35dab7e05e6cde4868548ab265ad5ab80ba8bdd27dacd288e1d6938ed26950b0f4f308f0052c3c5a927ee3b24d6dfa7682c911222d19817fa07ffbc335ec7980d04bdf,8d42c3ec054b767ab2804eacfb76b4a12c1de681e5ecc1cae4a44dd01b2e37ae,42cbb263794e366b417cf8b022ffa3ae811e908cba8316106bc1754086214cc24f76cb6a238e25d696aff671913a5f48381f2c7c7603a014cf49abe44df9657900,d0a587c902d638d7083570d7954753a9b988e0e757de6865b0b9218ed93998c214b0b191e70bb5fe6b10be994ef1bdc85fcd4efa350e59299dfae9ccc17712c300,22187d8d92dcbdbff426f4bd4ba2640ed77c579566fb8cb09e8c1ccacb3567bb0604a55321b22d4736d82b3a1b11a1881386a8d4683e1420f893cd02b7940ef800,5e44686851ddc0adb8cba69c41a16bc138211493782a0a472a8eac4f3e5509824c26f4f319df4305096932b0cdba9b6cbe5a8738c8ba73b883e88651586b1d7701,1ed744d1b432a6861328bf0b44f509f8bcd5f7367a408446e1ab2b5fd1ded14b0bb5064f4ce5f0217ebe816ca1abad799f7f2f0e34a5aa9da5584de528bbf55f00 +7f68f3ee22d5cd52d4d7d49962d9b5c8b479efeb91047f188ce4a63ddc3c83d3065bfedcc3a8e4024bb4295bb9f8ab32365f3d4261717735c358606d4bc84013ad910d45b13e25e4570be3db52216c7b5782f04cde3278d2cbda702073757dd5cd7d6469633b5fb6a1c9af34d55bd7b524e77c331eec77c01105ff34ab5efaa700a207f93754059369d88e33aa550f0fac3fba2838f6d912b239720dac782cee586d6b4102758026f0d44a5405a7f4d0e2c22a74edcc5d4f7fe86a7b3f39bcf5b48ca50833488b16abf3705d79c87aaaa599253acdd423f21eeff5526e23f0490a8220adc0cc798f331ec9,e260b088fb4f4965371fe45021b82f5a44ab7443651d918c187fad787bd0c63e,7c0f3f7d80e9b078463dc4992029a0172449420d20fd805cff2efc8bca8ffe9507f182052438f9c8e61ee5f8a04e33b1a15661e16d336a1c49f340397b86718900,76b9413a0935027f4d6fe87d803e55e91cc20f0a27f368230d9594d0ad786115711349479d6a811c3dfed4a78590f8dd3f6f28ab4b5d4143e3aeb9c62b7965b400,314da38459b86ee04a95193389d9d53c46d1e53f04ba54c57174dc6e7104c1e51c3a3c997ec36d854ea3cb2fcdcdd4b8642f9defd1336075f72003bc7e95a94700,cc61cd7c724f33a4ccd0ca85b740fc224e0eaec20724977647ed57421f07daa95b17a5fcebf9e3539d6331327a6a269304c8a53318d7e9b20fbed05444a6ba9301,6e7329f9ba6a05d04c7ef34fd3a29b4fafba85145e6850448f4241b33b772b354cbf4c7b9af901797e638bcff91e2a79fc9b6f5e85b143ee48f7dd5322e0672701 +624db1e0807349c7289a67ed527f9176638baa446f6b0e9b6f4fcc1cab6bf999348c356c8062ca13f8abfa82111ebc2adea24285041d1eaa4e5f306d9825d8bbcb826d439796911846a9893989422faf642645bb294f556982a653035c7539263f00025065a9eb1dad83db076275030d407f01eb6ec7cf7beaca7227e2851fec26971b8f957c2b63751d66617d1e23a9fbc08beb2c7ce9a2cc0b8cba6b0d943b2b6529ba88dae4dee64adbbbeaf3471421fe3b98b17ba2706c6cd57861c2ba352be2db79cdc202fe807412cf0a96c4177f42de05425886867bab8d2dda25546e273731992270e3945fa26c,4dc8ca2ea86112517786dd18452ef28adc710469da9bf5ae0be2fb9c5e145c2c,8ebaf242a7b80ff8ee976c8573ddab6dbecd46dee179deab1fbf6734313e3200165b0ea24eddc6ea06b19a40df48e6f8116ff583af62d3604dc63fe457c98c9301,ce935d1809e9c15b04320b4ffdd5e6bc9b01347c00bbce64d73eb2f619fe8c61688f8cd8066362021b8b254f25f1ee9cde64668e64ef81a49ffa46337379dede01,2b5acfb0d2c1b1e7686cd30012840c90d80038b2f6da426f218d40685ba6b5c66fa45976c6bc8e5d5106ab39d89d99bcad332ab9d9667aaaa1bdd5a75a83e15200,c2f67e8abd967416a2cc8003405005e089f1d1fa403cfba6a51d52fcd793c7055cdc929734bfd4d543b762939da5aadc79701471da4b365c93c7fd93c387a0a401,9d092d866fa940e5a290e0dfb120feb0d78805ff3c8aa4507470c41941eda5265bdddf446be0f973d3dac71fa5035ea7fec84637c096d8b34bd7c294edf3853001 +e2684abe08bf2909187a76bd70114f0c9e38c333517f9bb49e25bab4e65052f3925f74c2c08334e5bff3c84871797091be52ab544b015c5e0e4e40a65e33dbe955f5fbb914bfd5055a1212e11e2388a75758b0c9a1921d1fc0f44431df4e083e157ad48b80a098ac28cab01e7de3224db9bee5404c47e84046b55fb72fe8a5844aef2df59e6b6cc0bacc6e15e5fae58e0d2918750eb6c06262351d12cd9446b38e86da28829a9126333b01cd852493188e43ec45073563e870f88c8d6c445e4b54bc2bf51dc650e74e40f592aee76167b3b2edb2a1afced054862dabae0ac7e68ae612ad08bcf6956264a2,8c26943f0f82b4c6564ba3f428dfdd7c6b3c9caa66b7c0a4ed1b3b1cf3fed671,19a6e908f23b603394295e87f157153f272a23f1a7ffabc7daf705822fde40ae43b648cbf4223ca0d689f11dd27f17b285921f2e9f3b91b32e2fd39e222d6d0a01,988146ffc1d13a3da8702d7a3f01019e51d33090df265fe083491a43ceacf6f2394aa8e222bb8f70612709b5dfb7d3494d201517051cbcdd19a8fbb273f5281101,8f90681b95cea20363a03332dfb44907b8532c0c0dc899e370aedcb9332b695845cbcfcc85f37ec57d62473b748d8d52992091e9c5a3bcccd664fc1090f2210501,ef0b201b3496cd6b85cf5116c4a89c877bf18c561b87ddf337cb666533599dc65e3e300bfb7d985f11e423f22f31d370a608720345ad3935ecfc9942d8d6471900,15f322d60a721d6cbf92281142269fa5ee23ed3d24edf3568fdacbb4b456d2bc0338364c4bfb055547990e876804edd401d355eeaa5f21a13bed7975f180648801 +fe065c5e05e78a1db2ae52b7d680b5435ca237acbe0bfee5e33a9b57577169d7bd9a0cdf864ccfc990f34e8706d0a0552d58dd0e8907293b347c3c2e21c427f845d4918268f84a3d83fab224b1b91dcf29137407605bec635f03794f200dfa927acf44bda41be9e2c0d4c86044ba8da583376dba5e18a8202c46710ec7855ddd01c377bdbbad590fafd888ac42de1370dcc6ab72e556208558b555726449957a3c303a52b134bc8d3e1858ff458add4b772aab57d1dcdfaa6ce9248882d2caec15d3c62ff48f63d0089b40aad29357c75934ee1f7a2d994f02f72df35207368d91efdc8f73c32ce5ed5767,b1172be4bf8e8a121d543db7aeeb36fbf955e2eb414da511fe5fa4fc7a7844f2,68cb4a0b0a659387e8d3a45069647f52c898d1fa4cdaf4e0d65cf2f70bca1d0d4069d8f6a464780e3ecec6d2e239adc355422b31ec58baeee88c82a6f3965a3800,aa53a09a6b4acc610eb1c37526531812607d6109a1ac7fe90889a0db502295c32e0c5fa3f45f8729f08a9673976399ceb86eb33948dd33bcf758caa0d4ecf58a01,e5a6d64ea6af084e77e02221506c1fb0d4f0535dfa1dbde9c70922461ea4e77e38d6132725c12d31749c22c49fa0ed2100a2e3df432f2b9d5852ac5da173206300,cd57d2914c5b7e2192c231db902cf9508d3046a69d3e9bff7e2b76b1102cceb479ece71c0db1ed8e301d55768c32bcfe50f10ee392e9a40e19caa7d37c9aec3700,3e8a75a0cba30c6eaea872b835051bead1b6e9d0872a4adc79a673bd04f3d0c104b39da74400b8aed78300b4117a33d79dfef6f670d2c1fd6845961a29524f5a00 +a905e4f1f7d4c03d3e7ae194b7d14768d492025e253685cb96cb606d81954951f0b38b19b468284e54f9191542e00801a36facd077ac377b378e7b7021ed56848f00f376d1ede0091cb420cc352e54ca6b6607473cd39db05dcf067efd2a159cb2a8d4b3755ae17c6b0da4002194ed87cc6c50ed79677842164b78e912061dd29b3734d96f3c0d493b98bfc16f43427721c6177d0d6b5929e1533774ae1b9cf409e9185ad0571a085968df607a9331660778199fd7d1e206909ca20661453c15675dbea7b43f63c8b0146933350e6d8d5cc9e27cd99721900fe57aa4a564bcd786417e0e9b5e761ff852b4,bed84621c60a7e96a0d772e856c109e073309c6267e117661b618d566e595850,4f5aa576b7bc49029c6e65394919ae930e13ce5d0adca86043b294f2fd2197e44910588044511c823398d11422c717b2165df284d6569a3a402dd54eabccef7a01,81602d77decd5e4ea92e309d0df3ed05098a3154ecc3a152023a7f3eff75bcae590f3b8a8f28d4c41f9175ce7b84809f8151072a508686855be2216060fd78bf01,f708c53ae71b940c075c62de3e96cb4b4a0415decd735ae0bfa405806b3227113db42f7b5dba930bfe4626036739f89e83e3ca45657df9a00ab9521f0c7a509d00,d1e1aefa12480077da4840cb357eac6e01da982213975e9ad88d93a17679c6890097e98439a9657d25d5c02bceff74f5b82058917a1618e4726df449493e91f501,ad68f3dbf90fa16d18c7e3941589ab236042fafe8d72c1d979a4eacda99495ef4fb5962a8a20749459be57e1175e22e77a0a069cd7ac2113750fe9bcb37d09b800 +39d709c29437ba85e0a99be2b3f0a303d7bb723233d7e3e98d89a608297ad9fad9539c260ed81f899c0b8ee525f0971cf2e5804c6135dd7fc9bc73436f83e5cb603da341993de650a9de9056cef509c573fe91bdf4e0cbc11c51f1aa1f6c100eefcc6817f8866e6b7e706ac00522a6d75df0ae91bf601ffd2d50f5210b67334636f2ab1c3c8d1b053f8066dfcf0b1128ce942251378b10c7dfaf6f6d9a5d3ab32051e1fb58cbe15b217fd6d398c43443429a5e523ce11f993b088e0f4e4cba005e8ba9dda5abcd65302e6743f379debf7624151d543e72d1f95011ba2650417694b46b7a3443621c80660f,68c36a33589333cb92a06e607d3e46713ea88531d29b2a56ae31279c82417809,c1de83720e6f2d0c5da0859dd42c7ef92dca763ded32289dc4b008cf294d10b84ad83200fb5bf63116d684d98920f5dece2a7c2f4357c3adbde9bfadf1554a8500,0dd4f8ba0b09b8087baf10608169c63bc2d2171ed3f9835859ace33b60fb3e7628a892d3eccc092e9c5264f97fa5e788a97ebfdbbced094ddbc5be60b27775a101,7ea605c04481041b69c3d76e2aa2b45320c6016944dc5efbce474b03ef6de4977849ba6049d0bb40880f6c2e55b4a0de8f7102af27710ea15172793cff32b87701,c197254a515559f743ad2d791555f9bc07a0c8ed24ca6345da2f3f868ef11df8693621a7525053e64d2224ef09d4af949d8e301b1242ac5fb7ab69f0b9cc68d101,a9518d4b49320ad815906bd0b6c7311a0d769024dae8450ddd3373336bc561bc41d508d274ca1d0e31549c435f6545102cd23564a0230c0960554389e3772b1400 +17a1ed73cd8a01228e20ce14139cf70f0253f20ae875fc13e98543a6b9d89f885f07ecade9849caa61559d4769279834c73574a2687e108c54b69ea8399e3fb97cc51c838399c332b589642701818808a90ba5696cbca670b1b4ec1815c5b0c3152fce5edbf0c5c9923ceaea3aeaef7e49b106ac43170c07d4e1b14d0d0701753d8a28d7609202451c4dbf1608cd119932ab3c67c966059c49d42c0784418c9a87d9c0ade4d8ffa85233abfc7adc6795804702a055e4d5006a2b96f6751cce338c43660ab2f92f099666c04222ca49bfb468537f6c66bf68d886d96009ba20335b7fdc53dec34a553e999c,c588fd8fa70b723d9331d39a0250aadaa5d8fc7605097f0bb31354691cbffd95,cf27720b5158a8fc803e35d3db4e163c354d2b177a1e0d45bc19c864fc9ff7874e53bb40270dbbbb8bfe706eb25f287457be9ee761697fda49d85192106ec62f00,f43c530dd228799a4f1ca7332540d8c5b37b628d0dd05bcc6ae555a704a66b1108e2175c8fab2c51d9e22825d0829a0a66d25d75065027dd1aff277efc4c256901,3c73c016eab32dec76bc250def28549c78a61d4d80f04558678138e1d9209554031441a895507d4899a8a852f2575212d9f1896fb3a1ada8f8c894861f43d1d600,5a47e40bd8a7821e17cca49b547b11f24d704b23347d83b4fa21de86943656560ca2cd3f92b517cdf0f29c20f7adf2800265345eb53ece2466cfffab60a9dd4f01,bad5b882999929e6644b11196e74738bb405213d39e5de40bd55d632568e65ab4c0a35e7d39f35f3ac83f2b0048ab3a31dcb4a6eb6019d7cf24024f613bdf3cb00 +fd8fbdceb300de4d738c5d8d8fc0ebcc75ecb24db162ff474268a038702b8b63bf9f6c8a6e8782416f31eb5f7c3e642b005220f25e319d54b268736b4aabab3ff711cf861c07dc0d457dbd3b13640c03f105362ad0538bb373026153ad5214433b6fb127a52f75171125214262324c8f3a1590e3c15e8b5deba8a0ff5192c2eccb0dd00e55b98787e118908da82ba20a0086d082b59f7d130dbfa0a7873c3d450d53abcc1051b9cce8e6064e85e8964b08d4a6a76e519ef03255933007f22b684927c7cd68c2bbdaad4174ec04e1e602ef39f47a8b99206ef5d47dae3a7d273061e43e648eaacaffd2136c,d9e294a96e34f11393d17ee8771684565bea75514d04ef5cb6621431038e86f0,dd9fc540d161b3fa7bed76794dd22c27e96f5eef6dc1f9e4dd78be122eac733205daaa52a52cc6a9aa57b041cdfef9878822f4efedb7c42dfbe8cb6cfaf8512800,d958d769bcda45a0ff13f0c368c0a4de3506f8aabfac7dd795e87531eb45dd9f5dc75c2ca5954f9863723959d1c01fce93936cb892ed84238b5b14a1f0e3e24400,ffc414e61652094ba12ef8a8821902476d229d5329ef93945ea63faccaa3c3fb6eeb40b182a0fc40b17f4513509e89a5c6289ee989181b7370712223810ba86200,96a8f10dd62fa72f767be9a6274d187f2c5d930fc6e1d3d62ec3150dc697dee85039ec622197ab3ab131819513532f884ff6215395ddbdcc88612bffbfaad89201,bd06ecd4d8ae8fab428aea5afa029659778acd10281e208433fbf4680de90ae53197140621f3428b8993fa5521d770c51899b85d5cde518f13698a854750cc0401 +9f6bb8123003ad4a2bf89ba16d73f4599f1f64c682fc32e27942ef7792b11a96ee02d50e887561dd39aef952f21c7e2372d5e86e15c7732fd8a80714d7c9af5fe325331b35c664231f7e4422817f9dc197890f70c9b9518df6219363db98dde51b58fdba580c7597351f0a5e4607cdcbfdbeef57f9f87a418b99bf786aa8e651f7c9eae465c8e025d63d81432255c57c739bf136cdb798c0a60d263cda16f8fea7ea6a0dc3e370a697ffe4629027754750477187cdf7a970ce4fdb59531f2dbd5c501d246572d85926d7cafea691a0f33420309a64d92d1b252bd794ebc09fa7e4c8a2ddcf15a34b01be17,bdc0bba81d496880fc155dd0fa0b2cafb66216a0d91b341d5b5587db32bb3e5f,15984b8a9420821cbd8d4f3790c60649fae730295c5fa66c80f7d66e9cf5802b21f5d3c765e819405a17b686938724e182f0a143ba231881c26088b744dff15a00,6052444d0a40839ee4d166be7e904c5c63413a10b241e8b92e25e1b72000c43c65bf7bc178a69204a8b35f51cd1e480026e9090562475563b6520caa98984a7000,82c52e60d36a7074e33c5dfc90300ee8810ce3f240ee5453a33f41b9a10620793be18e429f52769ff533c1c39ffa72602d411419a98490feecbb212c2226006400,287bda2827f76aebfcae7a0161d00607a86e0572014dcd2d8ffa3407bb2145d873694719789adbcad0dc4b1e4a9d21e9746cde06136c1111077264bdeec729ac00,c6aa2b0153dd6210a40d8f95b9498011a16facbe6a7ca09c7ffc0de70ee5db76069db51d898621e5729291f4af5ca86bda24b4a928f6dee2d63ea1d8d74e2ca900 +9881a5dfd24d6b40d7dc463b0f79cd3073c8ed1bcef09a9e851af4f5b920e79f682518ede039aca85d8b52dc6d18364e15386ef116a36a1f5d82286efbe7b921c1943628ae32049f25a2ed07721c16c1057e27730e30f982f74b075262842c1b4a4d786d404f5597249f8a3fb65a160e8cfa8fcafa35e875b5c9cd8813a9ffd6d69356c66b148a32cf1ac06e13675d2ea24545771afdc6b99d5bc63b06b12e649b23dae895652e47c6673a0ecbcc6e8d554dc1e95d256c1908dd6230dbf64612c39dd4eec72f31321eb7778b71164eede8c365eac495196de95fd8977c587da084b640f5c92ba8acf33895,c1cc67a7ee5b67404433407072b149e28991ec4b391f5799fa359c50f2d48cd8,963b09b17c177e61de03805eca1a5b3ccb9e76c649a47a5819d9fcedfdf096a05ed0eeb76ff7d8fd02f01c36da1f4e5fe4594c612b2db06cdba9e84e749db02f01,a8de26b02f800831120a692b86455d332e0e1406fe8533acab1aa10afea005f01930d58936485995bd81f886c238873993599f6ab950b4f32a3f3fec76c4380d00,9baeb8157d420f7adc7fe464173ff3e07a561a132049cf7e6c2d68e8630240b618c9fe8535fbbf8851bcd51ed673b0d07e14e8747af529d3a5963725b06f5d0e01,43361d610d1425bf9efd841bd330b6815d61003b1a2c56baa84abbab3a7c8de52a14a3b416a3dba561d43deba9b167a36535e518c87af86df6cee0bc35b7c9bb01,09b56c1fbc406fb9563e358c2e619e0661a217b096d3ba595de3f50f5bc122f41c416824996a2286b8cafc13e79ea7a0e1fa3f839e6d7451e87fadafa673d8c901 +e08ff82b85ec5c547fded287a44088bebf48d2260d65ad420980e290b2e02e8235e74304b65e84deb80233e45d21759fc35bf8d6ee7694942f44479b9bdffac08c76ba0a622f90ccf98ae6d59fae37c84df4995a22b780157768265555500eb78a3092d69feda72874a77df6b7fc326a4f8cc34b1df4a8add9593c3a3ebae23869e9265affbb14c2d15c2bfa79d553ddbb83c1dad8359accf3911ef19bf78689f6ea367c936254cabb08393cf08b71cd49a2f2c08e310d3a25602a9694abb902e3e1ae69370f72899f2b0a04dc1348fb25837f92f852f0dd4ee830ca2eb2c6d1e3d8ce58a9bd7b92676900d3,e94dd3138c5606f21029858292f242102a4f8a2ff424a54c79bea675f00c003f,b4ac0a7f8e8f920b0376e481d133b83a42f281be76d5e914b8c541f1a0d8e2e00469a7ce8f829836db3cfec809626a6f010384bfb923e2a5a002e365a043598101,d2968fe59bd4f4d126f30fbfb49a627d81e71f73e3eb504358de36338d1df05a03c8950c31ca54b492c51bc6f7aabb6928e96414e0ce0c948b8685949832086701,a6e92f5bf76a19cbd614e12b02ce8262b472f047151b1311d1ffd762129949b36c2bdd40d41906db93eb5b083fbca8cebdeccce9ff4c96c8fb244eb3d5daddc100,078e53fedee1f999410c09dfbeeca1b336ce2b89d1789584a591d97f3a32a89454417ef7ed8ea5da86c8b5bea88c1baf9368952b86fc1a815fd3b274d720327d01,cde687b258737beb440160c23be9c4c0fa7d518b86a37b35cb8bfe5ef18739d950241c23d99709ebc8097c5c30c5c6fd21b635001c6a1769b2a340e670e91c6000 +c4c11812e1ab8d6ca29c260f5a654e2f97f5f61af82aa66d4be2196071afff853d866542bab137e071fc5d2f9fddaac4f3ca94a514469e4e12ac14d8ff7ba3efcd8845391bb7a771b53e461edd2e092199ef014fae7fbd3ba0aa3d33d7975fa14f429add8cd797e6c020bb23eb42281c8847608f8fb591dba2e69f1d3411d070f16431cfdb17c7f92a4e01dfad0da7521e2ac737dff65365afde9058b001ab9ffb86e2d75dcd5ca0ed6785b0dbf22fe079a31b20f39d1bcc71d3af45dffc597f148f460df33e572d2ba4fc7bd01ed3497b8fcad3164836334936bc6956dd8b6f870cffe5ec8649547562fe27,9ec7f4f606c2a9dacd6c5bc95b1f31f633e22fb00f220cfce03ad9c60a7a50f6,db19364c076737999b059129ff338a459bf4ea6376f464d9dad68e23f3bcd94e0996a1fb81bf7ba7065787a476101cde9258b87af7645eca83dee56bc1c23a2001,94b8db74d20148eeb0ddb30a58e56c1b137f3ac3cb1fd19ec58316858404fe5a7ec7022622c8b60e27c57789f080b04ee7d62e742ec5b0e7b0465bab0520829301,c1bef29aa9aedf0735b856426b1daa49647cf6f8f3976ecb6efaf7ef4ef0d9e57e205add4fad88561bfccbd3dcc41bcb5c0617040e2973ed8d5b97d280aea2fa01,6211a4eaada89fdc7af540cef3514afb3454df38252241e7716b9a5fad7c48e522d4788e649c375fc229a397c910a347cd699f4921bc08918dcde8094fd3c4cd00,aaa347508082e1f9de8a1f8043032b61db4b048784d41aea72920d489716b9163c98892f92b294c41e7f1f5a2acf40510164230ac7b1a4548c2b8860c3ee7fa500 +895f5bf0883cbfc225b81a13b389e532a803daa74570eb614bc06799ff7f57b5279118e2b01f81bad8ff722173a8bcc107771ecc68e1568169547d4586072d46ee6a4329a24e9d976c483edff8a9cb0ab623e60653bbd2efd3a7c11046eade8caa0550c18931364973ba5871f33a17ef3480b1e75e8c2ef9c8f5076bea19ee20944aa041cbf6e97685a187316e22bc0d9a7a399bbf4a80bb3cb34124b9d6090cd5ed4d86d344d56ce1cb31c741ab1a062c035738da3b9735aa98d8ded7df88c34f510e55e2a5481878dce83616563f2bf041f6db25ddba18c1ce7b6b4a6bd27062ff8dd3d275e6cd02f37094,6b5d78ef4719e11ae640888046ee5d79fa73679a5103d6aaf29c6b88650031e2,2bd060defa5d1b18b41b1b63fe50c2107730573ce09bb4b06fa1f736eac60cff59df4b61a334b5a5ef59ea4137f8c7704a1f9b73c126348da115641dbc84383101,a8ee05eead03ef9b159632d0fba10c955e107c11b0db8fe8f64e5a44f05f1ef538270561584eeaf6d487e27a9f74bb6523c21de88303bf2b6d89e5822a75f8e401,c76dc742d49c9065a0a885c0da0ef45ec423737f5930cad488e112ddf585398a042684924307a387f2bdf17fa4601625a9f4dba023837771e5305dceb7fa4ee300,e45460d857d0b9f695f729ff71c507333037b651bbbb31d7819c4f82b4fd150505e64b7d7aa66096d9a092197bd76c5fd57f7202d8f4b14f2185868a95ea40ec01,78a3d295245ef84692c4028650f26cccfc4cbd608531789c9115ba383f1a489a6bfd6a6387e55d89c6e18f04d1815cc5e151f29e334e9e2c2c088e2a5fa0a07200 +c304d6a15f5f419a29e00df6593290b5c832d7356ebdcc38c4ff5ad2641b3fbb05486c7f6511d24e6b6d316e23b4c00aed97c645b35c0d30d878436e6e2f546287b56e9c5f6c35ca9a6ac6f7dd6679a502764de9f4e9843856853a8eecd741a0827801f30afb444be8f69bcaecae767554cde76280ec3786f6ff5dfe5e3b09a79bfe30ff9cec015e98ebad1d055848072e3d9ea5e9793ff48c28eba6ba2dda7c06e4a652f4455d0e3604cef5d8018742f57968664791c6bbd78fd8a3cfedfc34dc3d5fa609d1454e0d26afc1d3a4e9ccd7beced05dfb83c15953e238638197db3e10f803e49a85ca0925d540,d343a3045a6cbf06042c839e55dc78f73755343a64e3cf1e2c10b609276c5a5a,cd1e172020769e7d9c8ba3f5cdc9813dab589f48a126d118c7e1edd9d664b31a3c2662db87fcff5040f56be0079afe546c62039cf70411213bc2ef202c9527a001,101f0aab7667f18e72ac928ed56a7e67eee5c429872a42b0cf1cbe61840c8c1141256468fedc3db52afe3fd0f3728b0706db4933a9f3e37823a8ada0c23b426301,eef811d81fe680d4294f8890a903ffa64d80047c11a6aa92a5a7b06d5a0fa05d5453649bcd4d8b5be9e9e732f101e5fb38aabb3327cbfc4ff732c36734ad089800,b0080f3546549bb52a31f47bf319a055ffa9e0e50b8cdfcfa982a6b145f64f9a47771c01b981dc8b2c0bbb0e72182de55edd38fc307fe3ff28e913b7f9c121aa01,8c76d49842430304d53f982d715789e3d91c69ac53c7bc4e05afb2529f5c4f1037a7a75097e9a61ad44c53d9747de279f0ee7f05247b29cc7b48bee75b6f138e00 +c7fc46a3f0fd29cbdd365a1b6b8fcdf9d55a85e5145c40517c07ae407551f2a865b3fc15462746b46195455b0a115be181ae60fa42aacf3fcd9214c3bbf01413960678cc9f20562160eb67618d440641e538d453bf13383888496a49355c67498c515c7fb2a6d79e99ec8445940b78f5ed4853ae4f9d33fd6826299612cbe220aa9cdcc801c5957f61def5491aaf77a366a959b48e37148f5576178057e0c7d8b8fabeadbc795471d2fc288ff9ddbc203c01f870e562e2c2091c7c40e50c6cc99ae3bc3e9571b60259e2f686a34fd44ece1f7e7aebbf352a708705107195a2fd02c70df57269da1a3543bc76,9b4b4c4ea978203a26725ff6891dc1ef7a43d1199b9c92e6f994f98a15128506,33104670cdf26dbb7830ba3d6714f08b5b4ada231a46990dc0b756a91ec7f1505481aeb02e27bce6a43218d5cfc8945dc47d4b78e782c149e591f30cbb113f6101,7bca1924becc212d778baf525d5b8669673376dee3f46fd02e83368ac659e792128596e8a8f0cfda18959bfd7d897fe8e21beedfacc48f976fea13e0c9bf221000,87bd30202537091d591b535d15d4571abaae987d6687e5f21c757fe33edf2c24588e8b10df7dfa14a89ade84727d8bd2a14dd903cb463e7979818e565be5ee4f01,5dcda52ac4a0c209834ecab07d57aeed545b4fcd7c78e822ab611bf27848812c57f0336bc4090d065dd465a3730658e57cae7374875f4a983908caa39c51a05b01,76a880c6f75f794e2997aec2780560f41230cc3b2ff3ecb04030442d560ac4644cce893fc6e88201d640bf08387e935acb4810fdcc69340fa8ee0097cbadfd7b01 +7df14a736f7dc391f3c19751d1a4abd0f3982593db42ebb1fac43781bac272bc828223ac841550bccc067857828b562900de0a9fe7e06daffbdb31aa4d18884c3b60f14dae10490570848aa359d0e8f8a5f5d20ff566a9116a0157238e1831a0f441c51fe4620650f56980f3f3a65e583f5e85aff98d668ce0581ab80d84ac947cb8c438660bb0e07961584f3fc550bf7ac2a302b8f79db9e8f7585590c6939bfc8f50b27c5c31faa1aa301c990e1dfe181310ae73c75283e2d733b4174d682a12d551b763b9226235892604a0ae1168f029147eb95f287dafb7ea5b8b15d3fbeae7f14ee4a672888accf3a0,3b5a7dfc8049dd9153f474a74c0a1f43ed6e1615cc30942bdf4008ffd8961bd9,7e73b06e36e04f7e9230001b93a3e107c86ea6cd932d8136e61f60ff363338e720e730bb19e9c792b4133e5cfdcb177639df08d2d70d5016ac9276539a8b974400,d6bf378ce8ffd8b149765a99f50281a28b7671d05a3ae9a1e5ca97bf0b9cf7055888f3c66b2e0afaa1d166cd4fa24c787dcf3afd0aad4d013d8a6321c0d7906d00,a346982863484a1f7ba13b0a8bb025547a7fa63f64e34a0bca10d730a75c7c39401874c29231e97c810aa588952ee80f709a3e2ce241d95d9b19d5f89d67879300,b9e467e90b33b650621076883e11d369968e0596ac74592054c0370f502b8f216d57d4912f06e46e91c4e0611612aaaf5bc9f883054319117bc28289295ab04c00,bf7c6bce63e70a923960d81d21e9ec8619f35a89c095439731a6c7b9e366d9f37c476a3d8b049b8caba02c3693b6edbb75df2725ac317c87c5b1f2ceebfb3e1c00 +03c5be534041e8307dd9d8319afd959887d8c61c430adc9fdb073b86ffa6c4e8b71f0823d071bf9b30725653b8af2f32253b622f9e585ec64310857432b343791b7de9cc3448ab256e6fea7d5ef48e87241c89b6e9264a056c42def2cfedda559e43b5f5a825d4543891cd490affbd60fde2db0b378a6a1d326f230af7c56942d348f1cebe15c638bde771c5641f347fcaa25140bd902c6856283ebcc05ffa4598e0b2d1eab2f0698dfb906d62486edf5add487fbe534bc02a4a77bc9699ab520a4d8aeb00299c5e292347437afcdc9e3810c1855e453e65831681e9a28bcc2a5ae2a2d4afa56a18883a3039,69a8679d1a3e8ae54f7e449a9bb3419f59237713706e40723e79bb2bb778b098,fe48cd09a763ebbda0f33ad3af91ddaebfd024e54a89c5b31d3d3844e3ab2f2c34a5a6906e764823acb684f510c8a08766dcec5278c999b3e84c512776f9951400,01ccfc1e40dba35f8ab0b2c071a3ca7b85a7e148248772d31524bc36b79f1614065829fe99fe0cf55db084a49147dbfb049f1dd9dc8a608115cebde7eec5bc4300,cc080d10b0a6643fd18776d6e6f54b483b7b56960a2bf47f2114b865ccc0c0587088a3308fa8133f5dd00f5459d664876d70f8422fdbbd20b7082feb14a7d6e900,899e932bd39bb0cca3e5516503e269dca216df97fcde8ab0932292f04e85918026ccba7ed869f4e04cf63ce8cc25e4101f169ec93515dc4d494891175c5f1c2b01,956bace47914078292cef116dcd360d143fa9f93389f8a1083e9849b02f7844f405526fb108b2e07d37a16086d692dff91bceab76499dee6047fb0cf57fd9a6e01 +53fba124eee9d6f3dcdfd25a76ddad8980717b660f6f2d5cd4facfe92c8ff818065d95ada555a21218657025463db9eec8b19a84ccbd2c3534943611524413f92c33313136bc133bb94f9dd2dedfafc6d368f0020549a743b75a36dec8afaa5e6e227641940a1c21fa2179edebff0f32b1acb1855b59c38e252b621e8c13e5d30a6b0f9c85205eefafbb19d12e3d4a53065495f0a7d6ca900a8cea19900248e7cca2d289814a8b7e554c6896b4a06806c7957dee0b35fce9528b966c026b407f844bf4e1c524a139adf72859d6640a9c8f8e5db017f5208fc31474692e8db4946bd537a1eef6c280bf59e4b8,72613b12fa36ba54ecb32d566fd8e3a205892b7aed30eaa4803c0c002956e15c,2c85d94a198d639d3b729555b73655871fd686c1263fdd4cc30908fdf9fc6df90216907a5f19e4945e225f8f54df4b31c5278c1fd953dd626e75193abe15b86a01,613c9643872336be774edd0d37e3242eb9c8705699a4bedac203e9d983aa120321efc118471aad9dc275a16368014a385f86cc9f202e3cc289df9c3fbe996f3701,f9072332f2aa5c5ef3a8cb531d17fb019e4fab62c6fdfdd1ff1f1f2169163a4712e618340b02c2385c3bebbca42490e1cbc2ce2c74f3acf2b39f2f2a1b01c56800,cc6e7bcf8ea5861c8a44ad86377391205728748f4eafeaacf41c8ea18f89e5735240270827f5e1b4a6b762961b49a5703a447097283ce4cfbe1fb95911886ced01,16897727bf9c03195bbaeebe7c4668ee7984b9e73b28d44d3203ad66ad87786e3d8efa4ac07698796e5d12fe74891a0ef5b0bb398f8e730154fb6fd23096c05e01 +e04214848c8880300e15481c06dbf6e83d2c7a415d4570d4acd007a79d2dfa5d00f6ef52a5ff5e4d5ee5886c6f96aed535fc21734557a06b7135c78d8585578e89f65bbf3e6598662dc5fbabb08659af3c7f78a91ba4dbd2620e3f1c43dcd08737853b4c08ff3ad4d269e7727996c3cd554b95a9ac253c5c2de4c3cc85847460c7bce48371ae2b82ee7737b53a67a9c19106bb6a453639bb2428a76faacb8bda4b03a512004ecaf0e230bfeb8a7daaa2a39a08038c9b1605a434ad71611f3a7415a25be73a3fdb42f648593b43b6757dcf0f5bde02c46c08f5e462e75a1cdddd79f362c56b1e839375ddb179,c9b5efea339549b90c46edbc91d97d1e87e1b88fc5fd93b87e671c14f4e009e0,b8452a4bf58df1bd3d5175e2b902c1b42e41e9a0cead955f9aeb61cb1ecf02837eccae4ae3468f007e2da360462867704063c6570df666eca6ae6e0e3050366201,89432615aaee494e40b9d6a2918aa62fea6e318e1e45bbdae83eb29ead008ffa5b5aaa0e7d309f3b38216544e37581562ccda8b98657c9736de2dd3b9e62df2400,b179d96295563e4c14c68292ab1daea128b00e6c36b4d5352c4f1ad8e15b5fe310b8edb760231352dc809c2c2ff56484cc80fd3dbbc160efdb41055099f0327800,a11360377f4c2598d6cc10cb7af38c21d53e04ccc77d6b3e8fd925d9d4c0376c695d0cfd0bcc10402fad00dbc90bd412f347c3db8e73ad9e446dd4539d7c622201,58235b6ea4cb7ae17b5dac648704a55c08e800edeb9b039505f2e789ac9ac3c1709d3fe940813b95a750137d64d38fa5accdfd449c20fdafc767196e4878961601 +5821ee6ddf36a2a8bc407ac1d46de1340ae0c11a85b054a3de471a326d73bb67fdccd0d944f1bcb8e3dfaf2208494f70acca1f8f63946f46f7b7147cc3c800f72d017221c521cbe2acebfcb4b7a0deac0eea31d88359409e6cc9ceca8e71f88798d50602e5b7cd4e4fd1c03007354199ba509ca387b48765731d0dd25a4003faaed51665fcfe92a351cc1080ae9e167d7dccd1698df53bafeb64b92cd4858c23eeddd8875181463f23590822894b4110bb69318e8289fb3af17d3d313a71b4ba669424c7d2a9e6b72c1d6115aae1baa9325730856d33dc49270ad2696ea1389019a59a2b2e5db828f1cb5967,10079d91dcec0f30a689fd0c0abafb708dbe6c15ee6f8bcf66094cc74f7a13e9,320a070d656794642f8bf470c3885a08258530cf85cfc1cfff5dedffc30ff37d186393e3cf680bf977fa772100e85eb4ad45074f5299f9b8f88d780d65643cdd00,a518796ccffac52dabaf756d9780fcd0015a5bd29186d3500931d675a6aefa393788d1bad5431788d26be050edf24855d604a7b6ef626ea28054a9679e5a5c1b01,f54341305ad1f69a2e0ccb0c497abc7075c187d69ab38e92482c4fade58c552f002818617ea9c2aebc8c5eb3c20e2defa5bb5cce4aee7cfce2aa9149dbd14f1a01,a6104a8c7a32aed1d16891f4e78f9c806e05d110bc7303379697868b7b38c1d86211d0249864ae67eedf56cdcc0ef2142abec82135ec5ac0be021ba55e1974aa00,30533d97220f16a3a74e588486fc0982d6855f6e815f1ac783dcb41b650125952a4aaa0e9d1ed902a8ba6ccb6e5cc94b69c2bec136f285ed6b4e953c0c89749701 +d3987361d3d13d77386966a539d21a81513871f27419c20ac85c7a2220da911bd3cdf7566dff9c8ae7941760174892dfff056e4ad3f12b01a249b3df0927421b39f7ce5f484a6555c58bf74e6f9e6e48ae3179bd0c5262418896476a6a0fdfa7fcfbd9ef562140ad72e54b2bb4efea233aa1cb3f16dc0dd2515ad496e64d1679ba3f5935a2566d16b28a843e3e5c049450805e78721f2954f1541dd693eb13eb7527b9232ea4bd6a523b4fe520a57e55216fd0771bed3718c063e38ba9715c80e376bc2094f1f1a234503eda2b414082ad68d6fd510f8ea776376f36483f574ea7c458263750d720613fe36d02,7c26f6cf669591954cfffd146ca86fd504b4897f86f93c145170bc2ae367ed74,84cf23345df041e81e882cc6826856bbb938eb08489bd514636623b95f2b2ac235ca1993a2578755562e495a3c93693e96c4a8a7c78bf46020bd4f80199a90b601,82fa471d40ab2017e279d695159ef5c9e108b6fcdb81a1cc6e1bd281f4f7ea9456f9cdb4b1dc38992ce48d9ed4a57d701a0338fda1af36c7e9a2e25a5b2a286001,d2ab0898455df3478ec8bf52fcf544b2f432dd2c29461d7bd68fe56067e0ed2b471fc34c2d9d532effbdac044b87ec0c3769cf9e87b4233e2fd84d38c512617100,eb264c5850296acb1b6de91406b306fedd69a3e1c4b84cd109cbcfa61a6a07945bf380b76548ae30c1ba58386017c0de5323197f7da54bd682f47f27062301c401,0cd18df304c85da77ec298e4f91560fb41d5c3fd9a33cc2418148791c6fcd103560d342309e0518a0c30a5fc0ea0c093ac766f9362036084bc2af6a40de0c63200 +7317e8c1e6b1ddc8b313bb088864b3db2634eecae3ea9a5518169ba9fe9a591103fd384465e6c224d8c9bc328597f9462eadc09ac6e0649e5701b1734083e3151cfb24a84e0bca7bcad04a53ff094f334af1930101606b84ef68143b0c671bc5453cc470217752574ee8262348053a14ca30fe99e38ba1515d9acb4652a5cc7ef599636a7dbd8f0fade69b2572e0679915ac85c366ea3217cfc039697835bdb3e1e5f00def863fb4683bda36ca8dba9766f20259bf082593490ee320c9f63cf7d28ec5b3335360e081955ec2d04a1cb331dd48f08bd8e407bcb34516d27c441ab0e13feaf95b201ae69ffc134e,2bef3135bc71d3cb54e8402921907b44d45cde27d69c0136cc527d82a38c7dbd,c42b5718099a32ea6c0c1d1d53af07e7c1fa7bd78f5a06246ef920ca5446b7d65aff02283b0e61deb71fa9fb0a7b7530a2c5117c99eb1c31d893e77e21024e8801,8ef66b897906a7b9fbed23c081a5caca61608d402578f4a0acc2eb082ef382ff17f3146fa312007e982d6f7805ac85083c1dae4c9025ed9bbc256df2ff1e4b9501,fa73f00c34b0021de8c54678c9803e5c47f605eef315422d116dd1c2a1eed3800ac1316300bd19f15246ee1b339497cc6c4462a5cd8d1c99c4ab43973763d9d701,4bc903c154f3491277472530cd205f615365b2a342ddea23187f72913237999a2c7fe3737af5b004cc2cfcd620e7d6a492100e194e493957fdf781759113e72001,c0e579998de92d36583eff4497ec08cf3207698bd5606a762326e49edd7adf9e4ef80c654f3b084be761a5e152dc69c98a644471dff6e4aea269a9c26d7d711f00 +559defdccc54643eea9c86b645ce70a30f38f7f989b045d3427879b8572a2d59be0e4218a22bf5f23c90c22d1e60d35dbbe6a56b2a8bda43291f447730442ad76b95d08be084f203d5efcbbbb97e0826a2d90b4866d6e774813b2568375e39ca9345b784cb68237f1440fa3e1eca7d78e93ab61817dcfd93d11eff02150343f4821bdc40aa7b3fb89e69dfb065aad14392b291eaf050eebda89f6ac8fefb0930dd8dd534d7982149149f20251e22baebec300209a653628833852b6524fce62127f0cbc057d648543fe1799346f7835f8caa5a639a1c9e0695be0cb3c2c50af05940b736cc4731fb26392bbbb4,5e6e85ab85df332fe1b99a255a8a662408b60b5d7e24df1742ec001d7604d88e,7dd0ff2c20140c283acc64dd76753f529bdfe63dd408ddbb44da3153167d79a86a01d9dca2c7737623bd1bb3544b0a7744c0ef4056daae57b33fb7e1ca6a512000,395dd34894bbd791b476b8f7200b7be1d878a5c1e94617aa09c64e39b1366d5b36224f5626c8bf90798229c067647cf9565d8db24c261e6f5ce1c1eeda47448f01,0dc062283313c403aeee887a2472918fc85dfa1d6e9a4f544a75a8ebe27a62cd0ce3643b893f487d2b37cf84c086818e2b3c6fce943dea40bb29582d3b59e91b00,244707875d8ee4329627ffc3724ab421447605e66b8eeb22c84974d28528c698484081dc3f666faa49e57fed5c61c48c83b495f69db632d787a6d68f9ec4fea300,36e2f281be0f8edef24ff044bc2eb0d3f54262dfdfa3528d4b7ee73d3dcb60cd5dbabbaa27593d07fe51455a16e6b77aba6b0e0091fa96618ab28f98c2f14ded00 +680b7df55db46795c15475ec596676370f59de2a406b9cecdf629ba6f544f5a9ef638263c28a8869993f859b8c5cb4143b65054ccae0d360fbe8ca857fc332e1eee363c3de5099507d8316dfff543b6cec13ebe8cf8f5b14cde59b7a0c92faab72c14087cccf03cbecc4d85d3e906c5e3f42871f0c44fb2daab1406c0d197c4023017794a2629ae2402c5ef1f21c57adffd7d9f3e8e0c25718594b31fac214a0cf05156c7354655d233d18901997e959126f47049643807d81ba023a838c188d9aa2a0ab5000313bdc29884e906f1195a2190f75d2b66f42d5cc8fb771a9143dea5ef5e46eea6850c51f223579,60ceb8efa0ad86772a5e660ba6e68f58dc0a7babbf47bcd5631bd67e39477cab,34a48a485030d7acc00c15a9ac8985582dfffa6e202b2ff69f77e7f4d138957c1eeeba9204d77a8a22e09df7936806896fd49f62171044c0d4e3fb1aeda08d8801,0458d7efab2475faa60029103ab4d190258d5baa824711309c20fbd2e838e0b908b1e798e8efb31dcf424eae431e4a9b95a4fa5d076593437afc21dca33d553d01,7881ea4a69d589cd824bef43d9b43a26a609ab2c11325c8f77a2e2ad8069ae5402c61cdfd408228e6b73b4dfd9845caefb12b501524e59c23a806b1b4d8ead9001,e0f8484bc62455b5522ff6ac4b70c2b155869d2d39967a5afea45ac964692ffd594cac8905f8dcd37fc07c200b8a38e3c59061cef832ee787280b0ae33a371bf00,0f35c4010b60d9671398c8c48da2c304f0c5dbf96aff58c3f90baa00420271b52f5373a9a0a0a22f68bf754586502d534c65c212d6a5c0a09d427a991936a1f301 +e55d0f3e5f200e435969991f500b167d1ca0713aa9bb73aa314ec4ba9c229ea77e063cf70b269df4ee83ae980080a70f433619e349be9621a16b3463a0413b946663545f17e02cd0ffe6654e8a5fd3e37ade163f3c9fef2b402a83df9a3afc3cd276d1e3757436442af5b0b76d6d007a19ae7d01965d8414f28b5a0859e9711d769f1e1392e1c3d2ad8ac386c33706a6596ab9b39fc877ef50ec75a4efacd76aa61659c28b8ac8fc4f02ad0b1931061721e18d2206098d7a13aebc792e1f52847a645618c39df1284c52850a02c9cfa719973a1f5c0a5bdd9927eb26ea8d4edbb2b88e0971d9849cd621ea9940,0551f1902e13063f15081c687b12b6f213de39573266a80f3629014ed0e04410,88de7d2278715de16e3d4520d840d2a9d67d955a153911925f4627cf882ae91a04a376a5c72e046b10561f6e0fd1a15d6093596bc247e139d0f0f9e581d675e800,63de4d837b5dd4aa55d926a4b3c2a199ffd2f6ddb0bf54fdd5b84e9739f9ab323098f78b42b150bc3a6382e1e8938514dc57b4bafec16dec228e37091800c88a00,de679ffe03da2a750ab779277e3e864361d5aee684e62cecc54e7425a00cc5a7499b3c7e4eb188a2e6cf6fa9e156bf832941b11248b756bb04c305a48ddb7a1800,5cec630e4cad744ecc3bc3144d935b11133ea0d69986c8514d0e28381274c8f161970488fe022c870f9d7bec6038b663abd7c0a66013f56f5f2efd5d4956a19d00,f1ccc97265f6a18cd1c50512d8e41485cbb5618e75d0443dc93aad976caa2779549e0037f43f84af3069133a90d2c8f7f03bf6ff98a7cde484c843ef79724bf901 +9bf5b459d2e1ed9af1f312b6a47fd3af9eaf9a4dd857eb6be8e08d06f4310f708525fac9ebfbd028f5f180904062d05f4cbab847d7f9c12cc967491f798e11aa413a4754bf9dcf77e5d434baa2377d531e2f278e5d4207ed075b5293fceeb0befba8163cade2c5327a58ddaef320784d5703b14f69872ae863ce603f5b8e1ff2c71c3419ae492f23cc154ed987d8b9a44e078874a0e8dd805d9a9e5289a9fc8057e45db6431342ced017e8ef8043d1c7527f4720358d53ac434dd920a634289a2497abb2d9aa131ce30c8476380c70174f2f36718e8a899f74b177861cdbc2ecf547ca8beb6236814419677219,bb9c390301a263199215583f967e11a03cd9682f149baa823d4a5e1227503749,2481720a40acdfd12bf839b00f05355ff0813b94c3ae5ddcbc820a58daee3f4a791c52f5d93718e5ea3ce0517d304477349c9462a3ee48b425e0485a68554e3001,afc6984779ca570ec177637f40fa7a5646f350561a033f2b18dbaa72b38aeeb57ca82df85ae472d32478ab2a375ede03378dc58a309eb2b7a315b41436e5059300,e02ee63ecc970047e0aa66e9a087ef1f59d0db5a2a9e03e8f9a92d0ea3403044159626fc4c1437e9c69567bf613d20b86eadeebb12b5c47cd199bd6b4cffd72701,b741ff7bac10ea663f98be440bbf4c807531bc712991c80a43378e1a4249275734c6bac1c55b835c205d371a216767fe355d1d23ff075263780c092d3e701a7b00,14bc42728d44794131af1ef0f22bcd9c0ff7a9e869605b3877754dfb917dfac2281b44d5b8e8b9ab5de159acf3067685e83a5ec986466cc9ff16db1d806bae6100 +52bdf6613deef54caf6f756261d7688617ee82bad37e8c92883aec3f56c3a2f8ac6156d17bf4e99fc517f9a473f884b96377202435b4f8d0fc6c9f974bfc63dd25cb388a931bb2fecd6e43cd84e2e5050e66fbd8f87c29fbace6021ae84094657608698aca5527d4a13868bb5fac23c517891b3061559b5d1434fc9cc2369f5e72e710ddb5d01824ac1ff3fd7483706526a8e72bd4f216f0508713a93767b29080dff0eaabbbe38c705006490afb5175d7cc290c7332e87c6984dae05a7ac159f4d59efa1e89b1f385cb0b4261503859f790edbb9b6baad53b60074e820c272e39cd66c89237f26570c0d8b63e,ea5793b14de220fc89670d35059bb390dddb7c9efb7edef48be5a88155e8f660,45bbc819e741c7660bac1e2fbe48f6ecc27f102750ead957b286ead332f507163763ec570eef9041acc593732e0f4f93c256f6b0f1954eaa9c9acc6019b606c400,9502eedb3a2bad3d56b698dd3bfbc975330a5829e7c29db10f185adaa05311936a342eee63995db0e5fb356c135d77d79b498f52b22d87a66d4518092c17782f01,f1e8c877e9f90536bdaf3b4ec864b6acb9274f171f17dcbb90eba5b876b1ba8155bca77ad790319b670b4dab0d17dd2cfe4d8aaee7ac826ec91e96b60c100c6b00,85d4723cc5c31d108fed0d50a08ad0ac0bb4314ea694590e0daed639d59436cb33703e1e2a7321b6d8511376b66eef345ef8cf4f4867767ca4174ad772c018b901,51e6f248cff4f8909b9548652280f47acff286c304cc5b8a7326f08ad297ecc31d245cd2e331345b622b15406d144910f1750756d9f3aa53463f8e4d348ae11c00 +cfe8d30b4ec75ce788f146ba8f45946929a0f9195d3943f2d87a910ae406fc89efbaa228cd85bcddb4468058012fc48e94998de75b94c521dd79e86a08e28f01faa9940f1d1abd8957e2c86361241d8f3365c370ac5965ece9bf18d1e525be225140f0adc9dbfbac566cb122fe19c8a9cf6581bf5594c6d09eaaf162a2828cb44c3d1ac4c54a2ea08b87b8f15419a3fb353eb942ccd61b8e087e9a701362493094994e46bec6860872e2c517b5812af190693332674d0135f1bd74bb47854a4b66a69396a0169c0a1f4778a5a6589b1ced0fd6cdcda990fe4a4f1b4b2b26b02a482d63a6f185026d0a8764846f,7926877d7c2f429183c63509f3bc0da114508743f923dde0c260239317ec9758,d014c3ba7f5849ad78b912a3ecbfcb9cc487db6669a86c4d3c3523bf13100aef32aea0e4c1802723fc52b83a593d359cde1219f2add78dbf43027dfbec05ed0901,7e8e79ad08431986ac1f379b6f46d6a34098898c70fc8ca22204a5f1b601f95b1267aa4109bd1c0e415201b9cff32b67065e3eb8ca413010de4ae1d9b2cde91501,b45d70ab4d65fbc29673d2529578f3f6fe71748db36e88fd8a07469838a12c28163e9bcefb76bad2ee87d050dc69750dc63373c93a1a82f5400f3d3fa9f06b1501,fdc7011db101b9c2aca440061a4553af610da6fb6f721590bdc91fa98631c9673b0545cb8562f9d54fdb64e8771f95cd0b9d4f509472edf7687fb616c9221cd901,dac09d87a1ad1650eb6dcd068317581840dae94faa88bd49052e587f626b2f2f2622dfed4cbcf8ea7acd2691ea81a5c725ced5d3b471cdfbaaf053f2e8ca54e401 +6a021f045bc8aaffb11f3f86b15bdbb304cf3e96517444c3a001acc1e0eda4f412878fb72091e735ff01138c52fa6abd4510872a2de9d857d7b33685a2f52d3637671b73572371f3df469fd4cc35a23d68bd6f8b62d9933c7a7bf3d117ed2f0d2763cf36e9fbd60b3d5329959eb14a0088d9c43928f29313ee05bdc39f78610fc08ca43af243be54b630b9fc4854d81020434ad8a9fe234736a3c8d9a97b2e00e0ae28b95a00ab8253d9b41bf800ca546baf0dfafedd6930c09780f4a8ed5df50ec77d1619d7fab75487b3da24c5b9e1fa9d2cb50eb30f564c23174133b8ace99a09044b5e20b583f109ce35c9,93d028244286410c093893bc242d8f3decf622bcf399e38ead67b059e6edc698,978496cbeff9d7a08e21b398fd688f79fb15dc763d9565d9fc49f6629859d6b73c18fb64d328cb289a4221c9bc5d9666455db4278cf9d282322698694f22e23a01,09c2dd14d1bf3a483f9857d3f694e545ef1e925c02c2444878bb7741424999f44aeeaba906c526902aa8a559d9f4beb658be3197efabba5f4952c70c27592f7f01,ba0dd79a74c9cdc94272d1332ce0a1b9ab9f3c145e525458a87c4f5e0d1eda1f31159ba063714d3a2c8e9209a85e7cbb4b9a98ba9a7ac09d0556050f98517b8201,d984ebf07c7afa14549a3eccbc6436325bc1314ce838228f6176977b339136f0001087b6da11f24b44c3416643a3925142ddf9959f611764ca457f57ce48583300,d02e93bdcfda093538648b9b4390b87cb8202e175dc03f3f9f521f831dc122af528081a1473326f94ea75d67517ea094d30dbd9ca70fbb9da0491bfe32253de001 +cd3d711813e1cd3b11b8c4b8b140db195c9d91f2735736ebeea429f692ad1d9ea57e3df301f07afec73a08b6c49d5b66ac0c86a39ef7375d93bd9f785e580291f8de2e538d876f4af866524c6d8ca64d636e4dd1bfcb634a3d8225eccf82b24bdb585ec95ead2a689c8e73ce3a2ebeedb05f6eb03aaab168a3323e505337e8f9837abded9f2ee1d1539a047b232f54d18e241e92d3ab24d14064a943cc9a75b4aeb8c5bb53aabfbfb9f080a356c209261bf147bd63dafe2302df6a0352af74752c8f81221d7002c6c277eb0be752f3a32915492dd71aca1d42cf417bffaa9d91ec4d3d9c92073000924b48d497,6a9795f62dc946d3475fe121cdef14747b3ab595cc5b0443f90c2a4cb7c0275b,118ccbce54732c41758e54487ed43d9dd5b1d283b8e206d918ec955700e059285c1032c6fb7a6a7b2e09ab559fe3130c06fa142831e861db83c3e1222a2d840f00,848a96358154bd858aa59d0d7ed26673335cb48f91a1ded10cfe1e8094a6383b200b13a08787dcd390ba2f25d6fcc1e830efde275b629ccfea7a33ebbbc04bb500,8aaf3f175dbd418c43894462a2eeb4271fc08683e4e8f3fd122010c82541e82825bcf92b311681bcb46fe0649a0909850803717977825511b9f92e8c047d3c8c01,9177bff1b0b01b429693b6e3151fb2b213c42f9d419eb8a3a9720ea0adfb4e8b6a1f44f4b01960eac9c701f74a9069316192090fe7e3ba14af90445b22264c8f00,28f9d27e516b772103bbcc9664f50ec2a887e2580b8b32b657b6a1a2d5601d9f2b2ec7f99822496ac9cff39e04d1a78faf305d089fd7a8887ebf45251a6e1dfd01 +27363f11913b5ad0bf837726e4aed2af7b845c51f3f9c059abec683f0c9d3853c5d70df01a82a1b76ad682b605dde2835edee814acdd6d6e0c98243b51fb80f954240c677893d4dba0030a71aac7345263d43bc572dd09cf7b45bac4e7c64c3d497ace6a2b46b15d2b61b82457e4dbef81d1bea2c2f3ec2354c91438dacf5c6faff81d36f3043b999b2c034d23ad52dda798daa33820842358875014b4c673d71a6a18b8afce1253bf4316abc55e662396a7e4b3426ad48956edaaee81eebd1c152e967bb285512acbaaed7643726a2df573c7337421ab20c9da3808602a9e045e9b79a278a3eb8da1553c346d1a,52313ce4ea9e89b6d53ff803e75d2c7f10985d4d5e77b04e793b60e3e465dbfd,7c8575427db4ddb62337139073e6265f1f571522c6cf5aa14b39c555e9028c1657693e03f28d3fac54c6de02cdb42a9a0079387dbbf3453f45017df93ecf9bf700,60efccd3af8b7bc565ea6e6f00797ad249f57918bf24ff8f272df7015ce131cc0f8354c3897c18f42a108a124616fffabb5359f739dd781070cb551488a3fc2701,3c1ef705cdbe76cce9673a9722288c4e6bf60768ebcf08fe3ceb76ec2a4a64d77f4234d73737289a0c77c5fff0c2ab364ac862eb91a27994f2650d34f182091e01,6a1931733c471ea4908cbb561091fb66a23c81e7e695427d5939a148d7b76ef9510a3eca659b30a2dd6071c6e7fe0bbdae3d015aff9646f4944878a183901eff00,a71cabcb0f45d211a404ad45ebf546bf6dec268c6fba2a157e5a3792a1e3af4221c616190627988c3ad2840a19ed675c9e582052487016e63822acd6a5cfec6001 +6d1da2aab52c8b9f488a6fff0ef047de67b1725c225fa00659a3b410ac434d0180e70cf5a40bef3bf980298deb4ef7a5438fb2ab287227b6455349e587ababbb9944a17de7e5384ede33a75bf707b15e90f7e47528e49338613116a14a4079d9945bbe5868d8eded9a49c8fe472c602e1e3c649ffed5135078febb5b59b56a448bcd4089e04e20a415d93df99c9e3f413b7d083eabbe39053b26643e23dde52a7ca0c72e3c7e3bc3a872f74276f26134493f5fd8acc9a2a48562f9bd61e106a284be1ece21a563bc302b897132d1fa1d9479d1681292bf89f5790f7d0697489e6593d74812405776fe7c66f3dfda,3c469ec755814339cd05e936b1e784bc8482a7eba3e47a46748463bb1c54a59c,68d168d5a18e089291b466dd412d41b8c047ad61d2f491d554cc8d3177323ac44dc4915a44a24b48f06872e0dc1309412f2eba67c4c06314f2f4d093a809799a00,1f8a9601dfb6242f469d2e45e51e05c70f6d7d5ec66a6b8059b72ae7651608385c746e00f6fd8f3890d651cb10900c85863e18a4e09b280487579457fd2c089a01,43859e9970bb6e0269b079ffdf9c8cd21ea7e24f116b143f153afa5a72455343681f0279a9bcdfe16249755a44e9ae6396e21b0d8ce048597f42c08772af43eb01,7b3f3c99b02631ab26b621fbc78a42071f4043e4e576a0b519f41da286990835703edb102e213884bb52272de072eaa7765fce1c8e20db9362fe0729094e23f301,d71c145f8330a873cb3f67f9c38476761dbc526a2d590345d0d8e49f0fba16c26028fca5da35090b4c9e407bc30457c73ef35f321e76a6a17ff0674398783de801 +f3b8c5b3586a81df090e3ee6f87dd98a57f72941058c7afa397bc11f8e38c12b97b33313dd7f3056945d5c95327ffb7cb5b31355af0d69481177c0dd5d8199fdb09adaca398c1834187320da872850073fe0fe3aa4dfe9e52ec299332e7b382324ec18542486840d2772b1e18eca1ee7f8cd43a057cb9c0c311c380dfe857b6478f7698db4ccdabf28ac98c9ce78364701ada5e78c16cbca42ef1b0aacdd06fb9b1c853a3848145e0c0703f6297416d614c7e635bd0960ed6865071ed9b7414e6b9c9cf9688acea1aca6b64efe61a9f4f255c4b9e1c18ebfb1591578e86c37ec09005c72eedc5e75898fc938309f,27a1377d531bc1aac965e5894145b8276a20a33bd805c49b84b18c17baf70c1d,8c31bf151e185bae4de860cf0e3918f088ec5211cab6c0cf52e6679e12b1145b5023c0c2e82f199520b0f06523cdd2bf58f245c11ed5d9454c66442ec5ee4bbd01,cc0e6b1cdc60f3eaa38954b305b1b909c1969ed56138118c55a68f3ca619e432025603076fe287d464c9d09864ebefcb21b1cfbadfea1505f86ba14896b367a600,cb1109bc7f141847eca48b4befbb852ec6854705644aad1a821c3a13926bb19b6a7290150cac2ccf3d521c9c50ecd75171560f4fdea656cb993f7ca57c04871101,2ebe776a76f9730ff9020fd9c9f23f48593d67b4bc37ba520a6b0c4a3b61396e7f15759b48344aacd155ea67d28444a95ea98c8aa5facbe9df35b55fbbfa7aab00,5144cc4d4bc532bfec49a0c80302e8569d770a566507ca9542b9e35a74d7dd1f0afbe6d92bf7fd6c9ae0cc3ee07845ae4461ac6f2602f48d105e029e9958430501 +06e7659500f392df740d64bca7683517b5acfa813ccf08034b0e89ad5dd33068c00479f3c35935dcf4926790bd9ce85e357caf82a9978805d3ea1ed53f5fe3cda96905c53fb984a8acdb9432fd4b5afecfe30ead1027545f728bb2fa2705989cef52f84d3c405e5e3c64a426a4ee381087c7d0f48b99fd816cc57833710d5a7cd8db159d0760fa96d8dc42649e01ee5c7fae5d1bcb364d7719d9c8f85b9fafe4cdbff21515e4a09ac3695654df4d05944a02785a5fbf96b337a7f892944c6a172e8a48a9c1ed7e51f25624767dd104aada27c0c435f1ea118c74e0647de6df85e8bff666c4bd18a56fca5a586a21,be820e5d59fe5d67c087d6153dfbf957f5415d5ed7dedb12e56c6752939843b8,277f43b3d327c67c0530976edf79dceeac32c6a9f913b8f186da20745dad9d7320d4f3a6494fa35e90f6252e74ec48501031ec0049a1f3663461986eecbf16f800,4b582af34412351d1027b9fafdbd19d6e4a5e9064e88289e5f86cf7b71170d665ee3688ef1099b39b6c03221af59dff2e821a25d997c3be8f72f1f3a0bbd698c01,ec813bf9f46180c443bad33f900a558552e4a60518f47836f2172a1672021b150d11051cc171b419d9bdee36f1464aca88e691311c5017d19c08a00a70a8fdfa01,18d11a5da9d3bc4e5346c8a95e0dab90f7a129082ac96fe5c963b9385bf0b8ff3e232a3ab9e340f1ccfd463f01fdbe1959ab60e563c66496bc79795333541c5500,197af60067db85ee6ca98514a3fc826ccea9143e4a2abc1737032de906971a6a641733969b798ba6c659cd2f193a16742edb9d36648a6b40ecf183fe85a34e1800 +9021a5631df4bb3a8c9b5c2e55fa7340943597452c3e71071e505d61c1ebb774ca08517cf091b288a98548a39d3cedd8d4b8c57f99cda8736c31e9ba5d6c8915cb965cdcf2cbcde0d710006de8b05236fb1f5e76ba59e9b4eb356d953751c4a11a9503467a1cc2346ac892bba35365f2ad3c027934fccb78e14da17392c3ab10a0600bf51d9c02554afb37100f57976a60bb2cd32f75ea65deb237dd5992262ea7ab4dfc08edd754b94d7c35a7ef447932ea13ab0145f29c1ad3f0893f79b253282bea4828619497ac1b0888e5c535d79c8dcdf41b36ed5cc2c6d716698bd12e24659d29eb5ea09b69a7bbd9e7d3,327d2bb83918f4cc29b622671ca536b724cbcdf2ba810c19eeaa5a36bdaf1f6e,30a00cc20f62fa657c52942f3399c0fbc0d7fbf05d7a808c6811c9d8077f893406b2bf7c9c54ccbe7ac01bb5bbe7ac5f4212f582cbe93a7cd6ab46176d8b525e00,5e5c42a35b87c42e526c7c84f188a38491c2ec16840d98b8ec7dc3c8338d7d3b0ce1083a428c7402ce7c6d523cbcddcb8d0d6b7aabdb761f6dc9f0f61c61cc8a01,f9742430881bd4999cf11ac8487b9265b4b5de44c22dcbc60bff786f5ccc21441c5071e3f594178ade4944bb5d3c08d7ab34f990e7cb9b707c81dfef393cd87300,23163060f658977eec7a898deb5f7f51dbd64b04941115d73f508588dec6d1f9799839b50364d54b5166638f34169b12ca5d90cbf694936ad047cc74578d463900,b137a8c1fa377edd7c4f9bbb377f1779b52928cfa5d328d4be2d853ab72e8b35152a4202d413a84931f96e6f0055fb78d7e38cf2ec432ab143e1e13b04b4e91c01 +89c937b3e8518e138febf530278e3aae09caf0d0210ff212cf43bde19b324b6e4701ee89b719d0577fde00a30d43f818b4ce8c735c73db2e51fef05baf3844de5570256519bd5bf5b9042cebe276b0357ab00fa37c3e5e6253f99f6d7a1a0bb99ae9f3a4a87ce1bc591b1498570ec1201173ce7af5b1b1eb407c2174428d110c1c8344aa476fad43eefdfb4905386f0b0779f62d1ba46b24f5d2bf4725556fe3b799f114843a7dd2d51485f8911410444f2b8b787e614f88cce3eb467586b52743af48335a3def863ad106942f6fa5e7ec52e5480ca3dbebb6b49ddc470dd066997f44e72d18caaffe2d7f16ef02,d0fbbbc7197b42cbafd0e82bad3d8d0d378f3d69b8178a0e05ca265a518de6e8,0d4114a94ffe7bd94c386e42b1e99ac6b0c61193cd35ca93f26a63a71140e9804a99394ba4c3372d360ce4199316e77323c362304d07f1621ca5b8804662eb8900,f79260fbc7779fd09d9f794c6d527a99a03accf3c18b424605baff64b13f18716cbb394f1cd1497ee4eee0549f09064c0567b5759b55d430b6f5d90e3976976600,da01f60fd781c26f49d97a58a11935e4275df3cb4c7dff03d1ebe2451396b66e27e38caafea6570afd8678a02ab9319eb4eea31fc14c531675538b6f4467687700,9dee38851c45e74b6165c3fa30061f28ba1361c5ea84abad800f15144117cfe76d0ca255e2e3dba6b4f3afb2e0f94caaafd2f9ec6da707dbc7a8df4b10ea16b300,e1a1b1e29a4d5bba759548ae0ac74b2e66010ea32a492ffe16a9b30ce2126c973dacb877a9b66f4000ad58590d4803205469421d4f29ffa102449148850988ca01 +767c8e4771001d358f7221b97e0e3fee749e8216263f25b37248f6ba9b9f3dee5889bd26d53bd12367a675360c2d622beaedb40bf52385943d4e5d9523d759e56c2da7e0650d027b928ccf27e314d0f94977adbaecb9d092ff75178c93dc74833564da58dada9a855f5ffe96c86a8bb33a7696aa969b182442412ef112b2a106b475d7088fef86177ba965c3200746ca8cc232df571f392176d9f16ba92a905ec91fca71f188cbda443a6eca0443e654688ac55a8caa476c6e8b537b9a9eb710a7a4c5d93ac3f063e08dbc6ed871a25cc97041020e435ff65d3eb79cbcd80164ea348ed52db774da0e2cdee2d301,1f62e3adccaba307e3af8b0bbe9408e13de4b74a8509852d8bed4ac5ea8bc4af,7202155b4971890e57b27a12ac75c13c187d4fe8e4d02f8026f8ebd4575aee6b1c7cb60e8aede660088fb1ea67776b572ab3dd481fcd6a285a21ecf17741d17000,b2919c4705be80163ead2c80626ff6eed043695efd5985a130c8420881e5feec14a9efcd1032eadf1223f2091bfd997b4b5596fd958faca0eb594b9ca9e73bda01,46d02c7244c9b7eaac9f7639ec6221a0d519241aa881ba7b8f9efb5c59afe2f02464e82ce298547856c26d661d074d329979dcafa204551f108b54ddcffb4d2800,bc1b3f7aaa106d14e6e857464e4df5a685ce868047c6d6088039ac75ab926f39203ed44fe297cb0e2b33068af84549dcd073034cf36f13495d517845e72a899a01,b97a5a82ceddd86692afc990ba6ce247b8733861320e3d4d83af13a55d5f906c35f1b2f29367c32cb8dcbb4eda60aaff9ad3ceb1ab1d3adc24a950a724a5c5c800 +76f3f4014465f19b0915dcab8fa396a4391afeb9d7faa8b0713a73339326a62bb77e17c0d5b5ff9b30587f5a89d99b86d2882bd0c725e86e48ba2015a4c846b078cfa358ce7e447c62e3fbf0c7cdbfa36f8ed4637aa7d6ae200bf33ddbbffa2a3c173986d2974c7bc535fde0d1f6d213bdde6a71325e5cf0fa34114b608456026d214670fbbe35dfa6820b603e3f9d0a11afdb81264206f6031ae851e8fbae02ff78eb16ea0b2dcbbace3d525596d311c9fc46a9df5956137a05d98fb1bff7a8564e3aa88af44b255303c3c811e129dae6884ff338ec24df57afcf8ef76fa6c68cfa7c014c5118d8c65c80f515a2,c642a7c219775034664d870038dbe7b39bf21735be4a3bba70d9e4cfc3b11feb,dd940958f0479c296b61b702aa2caaae08967e49c0b52549260258de2bb86e9c31c4376d6e8ad74f978dcb72755e0bbf45e403dd55cf2ee871e94264e008d73a00,268d4426ab2032a64164bad02fdca7b951de38ee0a900ac1f0b239e5b4968daf6852c8ad54ee43955609f44d0f59aa5ca6453de0480d7950a7d977706a29477500,50474ad0d53d411caeba6c0dc9bfa59d34851b4582c310b2756eecec5bc618f0371e1d77c299fe0ea11974cd2d5b50e5a9e960eb81819810bba6d623ed9f8b6100,e79caeb069081a142aa7e47832151d3fb44823c7870a87d31d67f01e523565f127c9b447465cd398c08e13366cf3fe46590b6134ba03b2380d05d59b71c81f0101,20286374b9735d3a1954c920c4456f3157eea01d334697fd464e6c75df902e0d71eccee98c9bea24001f558e0c2804d78c5ae331c34bb739c95cdfb97d66b91101 +5227c6e934195540c2bb8c05dd19d8fc44989b84941ec0c7145fd7cfb7874ba5b5ae01b2bdacd6e6532ce04148afba30bb202de06247f2e51ede52f9c65488b780f253ef0164e0e1147be0d480d21281acee1ead474ce382b11cd383436caa71dcdf13ec913e5d6b4fc1f674f00c23b013db92934155f39185e0a4d4b54f6bc264e1425914ddaa4a3e5f65da626b77ed3088fd35cddc12e05bb147c71dc197edabc0a0e15a7feec2e06e781a65cc15b803347fb2bde16bdb2ccc4f9a72221c5f1340f710c621874bbf280e0e483ea745dbc63b53578a4c18d191ba7e2951ad0e324bf80f7a472799246eda9557a5,990aaefe9d39057371081de5af81363fa4a640dbab7de327ed99e73aab019b7d,09ba2e4e781325a68103bab61451288199b2a7785173568a5d4e437a9cadbc437c8a2e4ba4970ec5181b281182f409735fb854dd3a3760dd852fbdadeb74be8c00,c5fc78ec084defc2445cc7d5d29871c16c3db7ff0257e0d9c5cfaf32ea0359b763d7a997739d9ae7660407b777b1320a3e27c07c004fe1cbcc821aea15f7f6a800,9ba5c6439067f2150acef2fc10af7979bdf044479d478fc0e50d70eec01b2ac24ffbbc65867083b2acb71ff084fed6d8aa1e489cc4fcc13994ecf9c34804238300,b15f74fa81672635e892ca9b0dd48d4c0a8c2a03bfe59da1d5f76181c5a5f6b5057a5788992f238aadadbddc7a50dc6ded4307de3dabc546303c6b31f1ffd3ec01,2a22f1bcdd201be8e2afb189ef73b501a7fe71a723dff63c3ee3c7b563ff9736449cdf385390a84b88469495a494c163731ad1f400c2df5366a5f0380dd23c2100 +cbb4345cd1036c77372e53511dec0a462a3b2f990d3dc2871f314f7c8c0553f383f53aa70783aad3dedba751575ddce196ca46d0bfbda77f605c77c7ea63ca4641abf5c61a89427d3b177f0fde292f5033d825f1c7151e62aed419b31010437dc8f4b9f44347ec3d9dc5c35912906e2a61dac7285b40db4b75fc68828359a8a4e7def090f34e171b0eebbe55b39e4093e58402071942786cb327b8f42acedb8a79f3632939cc15efdf9e5e0021d3322a91e62ab62c45260021fbcbc1352af94483e9a6817c5dbefce18c9096c0c9bf2e033f3e454769c94f3d0ff777730e047bce325745118cb3325466d94b026f,d38544f658bf5709a3846d1cc1943b94a23ac08a9c7b939cde3c4b5b6d5cc28f,6c372e6ba4939df879239d475c99c4c81415e88987ee53daafdbfbb9c323142140abba69ba599d27b17db20c820b783c3c9b833c2b4598b7261c846a7dc9902400,aab12674f7c57aa5b9f3000647483c8b49bb98316a8bbdb2643bbf3827c2cc2244691f3be26bafb2bea7647334793b3aaf81e4f8bb9f30b21b9837f0875b2fd601,21fbbe08cba090f1fbb480b221d669dbe6a9b3fa287cee6ee1fdbc03e3df5f354b0a949ea8f0ccc421e5598278e4436d135e3ff35ad56cdacc720cf8437cff6a01,8cf6c9d919768e06a7a2e17f573e86dfb06540518e37cddd83e4c95cd54714b7341271a97d516932d42e77c04e8c62546d9d51a7913db511ee69f247dca37a1000,5b07894ec381abc84c38c0c8d0215712b7657614d596b5517bbeb8a7e4302a0077875cd89a2a4691f2c4d9ccdb18229537a275697a968052509eaafd3447ab0c01 +13031d66daba7480dd08031fab72ba4c40c3792cd5642f2ebc98e3a70da3847d557173dd7e28c21cbd4143242b544d0107d5c5e8d393e109e75186b846cbea08828bb09e8f620c5e886fce9edc8ffec2ae5b29b29918437a56753b2a95df4e8bd87f31225a9fe425a523d07548ae980d6b9ace7e19e42d71951b11f3a3664c21ddbee04ff2c8379157f675a615b557fc4a207b27c40a2adb950718a12307b583341ed2135895cba3a38dc99900eec1377b8110ade8cc8ef5cf8cc2ba097db32ee1e9d12636609e679510876c09e4d36f5dece548a411f55922ee6dc5057b2e962a3c5e70753b9ac33ff554f907acdf,a0fc69d5f1a93d7503cc8e90a06deb7fc44f1194c03919452f2d8d130e28bf65,17574448899afe2120e2f233d64c323317823db22eb957695e6838fdc04f58a1126d774f73ae2d4d821470d4f8d97cf939d52cdc7be22268305397baf027e16000,193ffd8a0ac18c58a04e22cbfc7355ff848ff0ecfbd1eddd798b7108cbb9f67030c3b47334b3e819429d3f219a46ae19d25fbffecdfa7a84af7dbd4f856d2edf00,da9d3e499dbb5cebe003d315c95a0f61d887fa089d13220c7450c65561b67a9d358a33f9691a3bd1d3480f17d0493f932a0914649024938ae9d8ee70d047e96600,37f82edbb7df46aa003de22e29db2da15e40cd443b84990ef41f9aa38118f8e933207d5272f1c2557889cebd91ad350fd71c54bdd56f9c9b9332aea98ea1113e00,50bae9d8fccef888029766bb285bcf49520749a3e334fe7b546f75c75022dfae582e15793ece63a387beb1faa58cc636f9da56c0de18bec3561cc1e099c9016e01 +8128dabcc9b7331e3264e583fd7906034a6b81d8bbcceb938f7fb23cb1bd6ad572bb0c75463cf9455837e83f6dc70fdc3ebb04457f0baa14b15e0aa87946f67f12db3512c22627f34e649b3d206a5552bc682533ae3908c297bbe75e7819eeaecac690b313e62bb18658cbc8c6a6e0163212a07b845b8a908f48194e9981be77866b6c7f00b26ee97507b09293f2ea8e6a4e95cac64c002de810c9678650e72c2d652c035b33cfd7385b225f7d144cec03a2c5eccab894cfe31a0ab96caed2d7286b085d157cbfe888fcb831198e0a5f6f5d5cd5eb3976c7f7ed9567abb2cdf13609e2b420505d9a89b24538f1356d,fad84b7fb5a147374ca5fa36e7e1eb87e515a3bae47c41f367c7cd6023d98199,e85034212732b8b5d94e8306476f8241acb6287b832f0725b0bdc1a0be8e630150c4afb241f116ac28f55c87e4c4b2953f0fdf22b291bfb5f3f2706a5528877a01,6b74e14d55dc119e0ab3c0c5f3a3d59ff66c53d0af3b5c54ed0e79d88fb989d775349244339c68faa46bc5994e073ff5d191629fad9b3831f8f67a5b2ed479d301,49800490137175707474211a82a719f41ce2d4ad2c5ce610606ae090a25c040042964e331661b76144d0c7e1349f07a3306baf9d051018ea75bea25f3647025601,e99bec001d0f5f8f54ecb863342384b85f5693a1a679c19c4d4a513b24ff6a621de98dfbae6dff7afb7ad50923364c7c8dd385890d84192a2958430c2be434f200,3f79d994bb2b47f8582b2ee13a25184ddf09c682ff1b6407b6bb4169944ab2487484ca01e0c4d890ead10146e2edc05c63bf65bc113cd21f4c4294f9d4786b0e01 +67c6019f61fe0d3f4a8c93658b643d0390f7ec8b735c1e5a716979eb0948022502bab89b2efd47cceab0ac74b0c0555e1f33459d08bbefa690609e343603686a641b17f129fd35127be3746854986c6b795ee9d29f1e2eea6b59551261f571796c7de58c153599a70a95e33a61052d312669a80bfc1e8aa35729844b75427ee3a8984a8e657d7c12f45bb3eb9cfdaf661c0adc6b9def6a1985273dc080dd4b41c29caa460b0b7499bbf640a1151fd78ee2b4e27dc3dc5f5b13d0f257407e9af0794de0772d8714b66a9f931bd7c56760429796399397cfa62e35f5878ceddd768e9fb69f46c1b63734f22212d8337c,abcba35fbf4edaf3600cc2c5f06a5cb512f5ddf3ccf9b4974a25b3a356d0f726,d9b3944a645d3cfc0c011581596b256f5331149d80f25bf70f8c05c8d164daec6ec5747e3a0c1d60aeea13f93ee70d438291d4d2e39fc2ee9945c715bbd63bc200,77d78a44a11696973a0ff3af52082def7d12190869d62e7db96d889eff30158a3a7935aa27a4fcd56922b2e4af8728a962668ba302d08a99f06e14c1cc06531e00,d154c6f67a369ce91187111155531963539d25125ed2742de5828237045a69e47e1e9a523e52c35e9c6ea7711a57314c7bb4cbe06c43a0cd454fcdb8da85ec3500,e7a84fa9c16b119f7a53f1a30fa0bc41f406218a9661c0cb3cbed38f072391c9717faea7183324b4d6cb36543cdde65bb3d612eaab7737737edd4c52a13761f801,30683d5e684230e1f5c0f7f862721fcdc34b504af3622913560f5b3cff792d5f661b9ef9c2d45dfb9ec3be17aabe9ce33db9ec9cfbace8529dd8a140e6b4d14000 +97abbed63ae56bd2d0ea839d91650c9fa7f829d6d450c9d44973d5b6ead2a73f9be1b2351c649e417424f11f79e9ed5ba9d459ccc89b82f6b74991fe77bf396db2f7f2e64f3c8b2db0c4c089e86500ff9bb0e08532666c8416c32211973f5927b3657620153169a89da3bd6fcd2fecd691e42b95ddadbe73eabfcd5dc246d62c873d3b47aefde0cd132f15716d479581fc3c29aec70c3794292ef2d5b56fdb23f77966d15b273656663076dd051732d4851d4e9170e5fcbda3e2897d2cd4fcb692a27293a1ba9999c18531bf05876f967544ba79ba765b18383c808ebfb110bd1f9f5877acbe04475e41ca8a556460,2b79d3169436539c43a4f82e125a2589a3ed5240d59e9d954af22e9c25c371d0,f4f603636ea37766fbce850c9eab364a946d9a87cdfb44bc9c15ae5631258dea28878e4b9b3ac93c8bc4613493c8e4980fc9271a134772e068483dee968ba1d001,1ba97ae59f425a923bac8fbfa052733d492db814d386e5fbf9a42b02f14fb461104c9f797c30bc2990abf7ab20b46d769dc19c9f717f4b3d60583af3629b75fd01,b8e6a544114e725ddacc174d0676c379821fae7ad19d4999aa4083589c0d1c5f6bfca8270a5f88f4c5619f1177434c9ef9dd6b239b0c947b4883e3b15a09a0db01,f6f08ec93d4d5b6e9e89e543172686114fde984a787cbf3b756cd006958f3b11244e0536ff6fba163c3261b15ed80cb5b3ed958cad1c0fca4d9033a6d49da40c00,b8fe9c627d84d3aa257c253ec3cf0b2ebca125a3d0b6727439600bf08c378d5e254936287814b4bf3e5022a66ddc022940051399d25820c8fdb62c3f4cc2ac3f00 +765ec7db24654c209c095d3af5941a7ac34c72f4c3211d25791168a8f8b9971f94d6a0ad519e5d993e5b33f7294011c99c1bc9e472c2e0c5498602238836edb0921c1f4e3c57bad773cdb9bc1642a806928e5708299b51d7bcab41b68aa2fd4ff6040b7f7a0bbec1c7398a19220ccb0a427be6fdb1d136f42d675ea2bd63774ce9e91236bcee36edfeeecbc23189ababb3e9046a0fd189038cafe9dc8e0da4b31466532113824b0c62881e0e045d0487152b101ba74f2ad86ec71cf13aac499e09c6bb34c09ae511e1d0da70f96207fd29f81587eb512bcf8dac34f089b434e8aa4bcdb9ca2fd6973f856a79dcca33,a27ba9635c46d1147560512500b5589c4514315ea4ecc2bc70b439f9209fdd1a,c335e76321a1e79219bb6299ce806937f4e772b937b2256ac532c1b6d17a6fc633f943f3a0743452022fe1aa896816c63f341780468e9ae5229a20e451a1bf4501,7ab3de9c2f0e89f3f7d60d1425522f58bb5cadc9f68b89bc6d228dfbe0ecd5ca7ac1584b61794f06f4b26a1551068f2bcddaa84894996f48c4e0d89ce6f788a700,af0e4d88beb17ebd9a59eb33f59c938543b54f8cf0ed37166275767bb2e100ee7206b690f72c1b241db689a92a11b2f4d1d6874bb9446379cb2d9360fe32a35100,70067ca47082a76cd18843c7458175b9d8e5caef68016f2278de52fe12fa89ea559bea27b0f730ac3b4106d4d0ca278588754c1acca47e0727b185ad8f6e06df00,f86aa2bebabb2005623ee3ef180e538d007db86eb7b42605b44a8c45a4c5aab46dc24bbd475de9d115b93d82f75f8b7ed3f548e495090b6dc187c524a356e65b01 +17e946ff121ff312464f12dca25cccc843b4c36f67273d693ab87da708f33c0b82ce1019ad73265c05960a6ee28727b389c80857184e3c1bfc1546429cd8c32164653639a673dad55c6b38529f2c88801d36c58ec524add399bcaf57d6b1d92becd4d974f3197a0d2d822709ad989b5b845c092bfd6b6af41820b199e42a6a47134a8533831863c8157f745fef811a79e4f675af566c4629e76b5d6781140aa6a5f675da66f94cbe3aeb3fcbb866533a9616b9e91c6a9338cd746ab818774c92b29d8f9afbe6bac056ea9e84f35a05f2182a67bd67ae8cc72c02c71e0a131189ef2f93d6c6e720baac8d705d17d136,f3deb806a7473934ed97fa9b9fcb00945f27280a3dcd0f734ebe839a7767fe70,bca353c690b931c5955b4d7bacef94a40cad0b561cc42aedca2540f727a6f48e2b29ce67fcbc9a0b01a096578a6c3f66cdbb584ef027a3556924d8448f78a0a700,ca748d0a6fefbdde2cc99375e9758f5a82d597ea2145caf4c7428a1d579a1bfb5f4945b4825d22d37868792f0b38dea72e5c8607de650e2011c677f159ce3a7c01,733772c90ee4c70cd92faa4149f664f43f77e3e9ef75a7afae45bbd5d8c06d9e1cc7ddbab5b71047165d23f61e3061358cdd72934e90192b78078f5885c5cc4200,224de5c611149a4818ce4ee310e39825846e4f4c8a71b769e2fa720bd9bcb172358a2bcdaa15f9ed155d161c18600ae72fb2b4f8f71ac01c832caf44bbb1f8be01,50eed515a5b7e81e984b5338009214e42b9c8824bcc12968942d3fbb9c479e5152d43b1ebc2ff8611933cf7e1881c9a85a870693c0c7998f7f6782c06137e67401 +a1d3e2b13ce9d3d1b20b7756009bf56b0bfa1c808c60f0f189e2a319a3e53affc2667db4bf9485fa041ac1b02cc31727503a01e49709f0334afb51b9b3ab3653dbfeff4afe2e1604c02db04a985fb1aff20c5e7063b0c5a2913df169f3cadeac410fe342f36d88d8064468c22538f81f317d88799702138521eba07b22e7c9f620cd254f8d2210af637d04e32c6991b1d01d80f970cc3a0e6976e1ab9163986001e6d52a0e1374c77e72aaa5aebaa4c05be120e1e8ac789072ecee6a3f9041743cbfdaabb0b1b927d18405895ad1ab945865f66c21eccd73c655b9d7dbd70956182865794618e1375fe66af9dd2492,363e2a6b39b847f50baf7805572533e8b9ae3b7f801618f2b05eefc21610fa03,77cb89d39ee3fea8c4a226bc50d48c57ca648b0a8b70b3684c5238eb9b97d19439bbf2797f6a1926688b5e3cc3803a931e71fb4dc364c86665d31075852f78e201,481d3ef9633ff71bbccb2d6f85a02181fa81feb38fda90f9d0e6a97baf9d60341adc88391efa58fa3b5c35d81efeaa498e0582dd01598216263894fab18acc3a00,d97b84bfd359154c019170df0a6720525023306c24e084a45b4e4e4076688aeb3e63f1e91743b4a977ec06c1b068b3fa4a3eb6c8a248092871e173e12c1abef101,4c6bebdb64839ba24e5fb60de1942e1daf3c7af6047cf9aaa9545cf42d27041c239628878f43e4e2dbf44d8a80847745b36e819bb7e5e32bcf51d3dd2d85169f00,276ea42545e462849ffe3c95532abee0dddc79fa425e0df54aec9aa084daac3669139c581f590f254efdb387d70ba80195715393df1e7e0c1f648d46d0f8a3f301 +6b00663c4934eeef19f4d1226fb1f7ebcb009102c752ba7aae31770cb315244e96605e30822155729fd6fa3930a9d5a86d81abf225205da70211ed02b0855535a9f1144edd391d4369b659ff6941be41c6b92ca013c148312bccbecc798988e95ece6f5a6dfb0f372a508bedba345e8a910557f952fef1d76a902b12d1ca3164def90fd4f2fd44b526caf9d0f241174dbc4671783ff78d42586b339e5f341ff75397b248427fa303f73780128104d2242d60c64ae949c94407885471b7e2715f3486931061da7a083fa31e2584c98650def76a0cb9131f10752b431dc51d7e01959cee704922e90356a4bb7f7e1883,b7de0de026cbc1650566b6558d76b53e6d3ba79d40d75328b9710eabe77188be,cc33c4c6eb42e96cfcc6c95e623d4bbd1766920f8b90fe2f7d6a3fb1fb1edfe10f2893de6c8e5fe001961a6bb7a6b2e0d372d98a404f8bec353eb87e45270d2b01,40d140b0e9c51a2fa78a52ef06de5b08cda471e7da9380e851051a3b14d3526718c2afab8fe2fb1d434fb1347d65d9bdd5566ef97676aacadc302749a693ca9600,49b48e674286de615aaaeb525fa49fdb52a0f4b5ee457b40cf5e079634711a0a3059456c9cd1b95e1f5bb367539c0756cea88efa9442271469b932c610f29f8e00,4eb8b88749fe7ba4e073f44688f59698ed2b4a45f7879a686e28f245e8d61f052836995122c4b42b3da007725a3e40e99d509ea033b4e81fbfda718979040edd01,7294582c65ce392f564a01ee9798af83480b04e51cac087bfe49e617b30f865d5bfee9497a9b58c00c4bc8373b2688c11deef20728268d5b65ec21433bd8b12300 +0f4c4a41831a4cb85493aa966748dab16897189da9f5f4077a5d32bf41c59d442229a76c818f547ab003efe52c14fbf748bf4f9199522e27dc2927f968cca7787f0374f9151c3b4f9b62a7bd6357b7538a2d3d3d01d843752db3e18184cbab1aba1f6a2e57c907ffb3e980ff22f3ac60361938782f192c412799481aef0ec98b1b1fdf42357146d71cecdd5e32cc6e93f288fa9b757189d1b198b883ffcb2c430155b8103eca61c4ebdccc27cf98960aecd794bf9fa4459bcc3909d4d7c52b57b0f91216947544481485195f8aa57fa70efacf16cf2319d0620a90a62eb0a3240fc8c88b691d076edfd7f3f95b8783,8829e4984f9993aae515160a2a6e10691922789dfb690686b70251ffb679f224,fe3e64c571b1aa9597c4dd1c34e1d9c6ddeff891a9dc052c0b37ec6cbaf1758c47be6d278637e7c7708360af96f695275e401f0c340eac433f3592ffa994b7b900,028bc4e371e8f056b40d70b31180b6687a612c79f9d1e8f7aa6b0eb18b8294fc1f21202569f0b5562f61a42ec0f0c6a56830deafc9bac804f0bd879b38900fc701,efc5621abb2a64bc833537332f37c835189b6dd18c0b6a9e646182ac3dfd9ec20c9ea8c70a6bbb71b2d32414188941dfc2018c365f142dcf16a9e671deb61d8600,d0737cff3253fac32c078d9f7f71eea10fb376b2d5442f45fbc3d9dfa31f1a256874b802bc653026fffe022e99598265e3f2f6f71cf648b9f0951ca3a6d145d401,b7b78d42f5971f48c3c904bb54ac88f88a86596d4186858dbdb02c357e4d36e040a0e6571875561b589de7bb4f6661a799d4f40e361e257a6a7bd8c4fbddc9ff00 +33de52e5e10decfa1ead5db92d281a51ba8f4193b8760085df951c90bc78d694b96178f07cd56f9eeb714b6e8a0ca157b88a14c0d93ea982cb2b35126424c380db6f949157a6b6a6e6d8d9ca5fa38b356a52ed456ce17ab3e42da45720f815f8cfd61d0808e15217a6c30bc5d6b8ae6b2006f396f47344f0b179d0c5b5c9ee1970a6af002da609c7272c3d2340d67723788fe8b122b8a7f09b13009079d4441b40ffb3442a1a893594f51c259b5afbd1f6ce50d2b6138b69ec5c5772b1e55d928a657e783a38fb57640ef4951937ac8cff57a17eee997ebc1b27e4ae548545913ff3096bb783d3211272bb628c3f74,5199a8e9161b328f4b10677535040abe55e4b4805a911f4ceb70c40abb6f902b,999f88ec81d3c8296b2cf337545eb5a7c1e1535621fc72c81ae0cca929df6d82700adda98823cd4d9f126985f2f57cb05e8d38bde10f31b28358a4920deb918901,b03baad99a6b2cbe08523fdbba480ebb0488b2e6108fea782c896beb7835a4120d2e2253ed55cca95a1eef3dc23cd5f4ad9292250ebdf7ab602aa0f11888791a01,e47751a34627e1698af0b635ccce3bbb244bc07b99625713612ff12c9808fc7141aecd0da7cc42f5ef1988e797bd261c920f57c078e0120383fa85413ee8dce100,78272b7bbf71a495ef45680c8f80677a1d154e1ac00fd41a6a9d8575d72afe7b18ecba62224bfcd3d76d21e0c2225bafde4adff2ec4c363de2af4254ca72bda900,74a3d06b86db32c4cda6267015525a7e0d4a80247389b5ceb7bdf60daba13b3f1e6c2bd085b379e4faf662f931176c0cff2544c24864e5b32215870c8440494c01 +d3040bf84aa3f41dd33e7c334ce1044f93b6e22906f5410028673a50c42d64a3010d577e92e5e934eeee0402fb2308eb352a8e17896b18f81049fe710789afc6a8137c1e6ba6300eba654a6e038ce9d95d0b677cddce20e0963cb4c1b2a58adfd167c4999bf49cc1276a67cb270fc710b683c585de97225c964cc2bc064bb3f8fbc3f463420a3caf9727cf167fe9503f3c1de7febfcd4877b2c85851020a01fd97a119c6b8bd02075113025b3a8122b8bbf0139512c9c1ea509e8ca342e80462f7a4cd9838d7ba808a2d8a984bd0b426e3f55209bc6c2c0987efed70db4b942e8ca4fd478bf0cca95c5899aaf1d39308,b4f80c15e287898307972adf0f1b36cfb4ed08d1673e980818535ab60f3a21ad,2ecbcafa4afd13dcf7b87a95a6783f38c4e5318e7ac896e6f4939c5c5edfdd4355a8d353328c60f2d37f4b1f6b6f7ba0f21817bb58b3a8c8c809ecc7d74a499e01,e1092708d34e8c3709b32c514119e570ecf692027224e6bb4d5bcbec102f7a66212ec937a861718c22a6d2a6d7b91842a4cdf124fbc9a54de69e963c52fedf0a00,cb52064a3c26c30847affe13b3b523857b4810c0c91708175cf682d18748fd8604e247cc2d602078bb8533e215ea5012be489a8c149ffd292223cec6d3a47c2201,687800d30dfe1c53c455c279114ce4812da7a150abc826fc57f452bb8ebf64e533dbe06fd6e828143ffd2a165ce4952366d859083836f7cfb3493fc94fc21df701,732b514ab4807c864ca339b7517814d6066bd91dd56bbc0f614b0b9d77d755605113d8e4e1b6d4167ae6e0b951226db927c33dc0a17c76e82af4a6e214ba527401 +3f10f8c643cabb8ee19a0bcc3a16cbf06d0911715b3100978053c74a39ba3252750004828f37e179fafb643832fe8aedf288e74d3cfc9bbf626813193ad35a70565804dd0fd0daade31d0b69cb839ee153b648c9ee72f2801ee9773a9de8de9415a6fca9a3960185d1a6a927bac725e60b9debb81a2ac2592ced73985a3deff0a627302625b0d8a7aa5bbe23b9bfb36714a3ee81aefcc1e20bfce0b9d28b2bcbf60f96e00853dc43d8b1030b688dbbe793c7f6c5690087b0f05edec6e354ab737866ac2c29fc56d5443f7550c7702d77267c8dae96bccf17fb2772c61f1f0c08264f7ac6601010adbc6b2410c3c58932,12a2b5f66743008a74b2f54f864af70f3defd89a5c86f58dd2b14c5045a0b878,7cd9985c8fd8609f4bf204729a7b9daacc3fdbc0a5d7948550ba153fd9b84e687c613074a6709576bafa2e1ffa9218a13ec9f51627de9ca3b32d47c5be629f5300,ab37e6daa1b988fe8bb9b85b13c9676b83534af6417baae83f95e54be1f8034b4696d3e5bc42769cbb8c68e2781092f3f2bedb8836b04de2f2c775e9da33252701,204674ecf3ba1e4cb7155bc93e0911812a60dedfac90984e53c4829eebf74d3447de6ef135a4ee84d54d3b2ad6c9b821a36707ffa7fe9160a99e312b92df362100,95948a92d68d497ad5a8c254d00e0151d28aeda2d22390a63c14845a1c0c600b229f67b7051a9af8f4b2e02f7a9f3f4d26368d22cba765baeb4388be0496f89c01,95c011b5276806ad562c1fe678e17c9508c6c203ce33f77b9d39133691d5b6ed7203f92d9057958c783f7225da3c5758d93509a8edd7e996e514b49b697e6d9301 +3423b41815445a5dcb1e09b74d334b7c2ea9776c99dd2f856bcd59137f56237410cc0b005b1805ce036a7d61ef7bf2f1c88608fa9bd6c9d8828ca3cf2efe80e5282b20456a605856f9c59b1a493381533060254209890a06f533eb875e94a189fa55b51e984e95ed24ab6e2142e282a8ea4e3263114041c7ae64831ed9bc976b9f87db9973749c3c264ebb04fe6fa4bbffcfa44db13ed7273006db4a0a4089ccc3e24ddecf73e3935b873d018a6c1b08f4ae54c00e21bb3bfa0ae97d4cb52bc0747abd56d743f6d1b56878e328c948492eb875b8e4532c9353247ae88cb9966d7769874cc2187cc636793ee49dd4b33f,694a6e4eeae0cfd0186824a90e17d958595e5cdf2d5142d505be63785651a5eb,4ac001245168403289e1d25fdfafd4cb58baeca3b159df24200f45653d7889bb27216f847a4dabd8db2cffee31dacf14cc7ff1fb922f516ea073f2a992a201d800,8b646e420e0d4a5fdd598e8223226a85f444958788285d16652c485d29cc5ea66262a0f9e122d2199c0c9dd17a0b1220423d1968b61535ed6cb04daeb35010da01,5347b113fd65a64cabf8617b1afebfcb345e98658218594d97ac3fa0690671157de9ca777818a4ef76ded5e4e418e9c3c5e1ca96bcf198b276317beefd6312d301,77743ef8e3ba49c30ea93e4d2e5adeb6bc8db70eafa83a65ec5bd16b5537f0ce53105ed8dce5db892526f9e06ef5d0b3dcb1683c7e3cac1a2e60d57858f53f8501,d49d0349ebc5e9708d4f4a033c7c6c2e9abc5e01840e34210f4483bfd823c6005e6411b184f643ac69fc858ae561c035dcc6692a605b933edfafb6300893497e00 +aac9ce0bc56b139e48dd7349ef8b0eb299c17ed5909a2ffcd01246766e5eae54b43df568ce4132b89e5290a22398c560413a0f9a400bfadce6e9d9ae19d36a530d0a0d29fe5330e755dbd76234e929f4ff78e8fcc8e12371871fefd8c4b91d3f31aebe907f404ac26ed90581d9cf19bfb0351b6f3969dfcd723d6dbf855e32180202defb2fcf7d1db7d37fe26f85736a256de6134b8095fed10986969e4f5458041a1e7f4fac8927b97da0b4f2c05547cf7c6f7d36cf5ec16cae3f248fd27652a752a8f27ce3b2da11079e1d1418e3055c299e84929cf7829a747f582add01b5749d38062f3ce01560746461bfda7f81,a50fc1dddc7b23dfeb8a7d9725dd696836f4f03d571a8f00b2761d7c8c7618a0,e56150d6374fc1cc2724d6bedfeb2d099d3e81fa0cacd09e32d9fa0c25b2e6cc22bccfa9b97e65c9301350d2121c6918bd4734b469813c29da753e7d72b405a200,00a557523a2db7a399f2bafb610aefdffb9deade90b7689e8fbfe947f93d64aa68cedc410369d909a9baabfa557474495266b5a1f56b7b7d1b0331d42b4ddd1501,97a2501505d63e070bea4b2a56ebdc692ff1e2cb7f409f06c562e0189856379175b9b3a9a7774bfc506ff3349172fa46d3c050370ffe9056405eea93ff641bf400,8946b10dfdaa88480e0e22f849419256b8de90ce82625645800e49fa8ebb1ccc07d135027b2d246aa34d4ccd3bf773df731f162744864276bc2c3895e447ddbe00,f05fb4725376cd2579485318b7eddbb1b029c99563380b192774872f355bb95b62d47543418595d45aea3399a70c1c1f58dd4503efda86a834c53680966caae400 +06e52e7b5bf9dd3dabc7eb6691802b3598a2444d95a219fc2dfa9a6623ee01f770e5b2c888a09465da456c65b315f830ae0c1aa32e8c58c0b73bddecf4356192b5c1d06813cdbcfa188009aeb69f8238b0112f3d04fc875a281df91a1363e9838299f3c2900fc9247e32adf526eac952a58df92bbb5c28588fa120d45f41551b750f4c9ac686edec5fd09c92595dc4f7a4bfc52ec4dc63a98615b5f5f871b9f535cc5406141a9d301e9ce51c5c80e1a51b43e03026b9d43a6fbf4058b2ad6e6cda916fbbba41b1ff4ce99005207ae4fa0dccb7be7ccd45909b584bbfec67e1fb10e375e5da8728017e86be138ced19dc,e1b93a9bfbfd7209db80eef7ee633b048004f8a52a500cbac60add15bbb3ee4d,c5a9da2005ddd84a7500f72020f402d5276209c53e8a199550a46db2d25a9d2b4c1cef805de17079c20acf8706c6f52b18d5b794d6519f933892f8f9269d753801,d98dc7431dfeaebbd14a407fc118ea4b92a3fd073814eef4e37ea2847b62374454397f13751750b8cdddd860cf4345c35d2f00dec01959fb8cccf2f72ad7701800,f8a95651a92782e128b6db62ecb25fb55027b106479f1c543abc37e86675b2114d7abcdb5c6e2abda0392b146a785d80df19b4b9933ceff786449318087012d001,d84ff60c414ef64ec0d6d91097603bedc746d96d6c9dcaf8645f8457f57d0cd7412cf2812f8b177b84aec5b01c08688df8261ed1077ae9f35c49053ab1db60be00,9c5d48129e9891d56dd4e663db32d0d413de0b24d6fe23a1d511894290ffd92e0bba64db19faf4537ea5472a6e8a73b2c48957ff5c5fc4ddb17d9b8c0bee757701 +bcd9c056b6dfe01cb311f9d1ea1224c367f413bbe83a5c563894b26c8d85c1e77f159c4d4e7d93ef70814c777953c43ec1e6ad7cdd2cfed300f787d8f9016aa31e3d396ef04b2a1ba46d4e3396146da93261408c25ba5e5aecda20a6696a870e74bd0b83d2391e6bdce1ef4095b589dcae214291595d6248e4ccb745823b8065a0fda9baa29758e744f603040af9fbd17cd5900859cbfcd057d5e19ad259ff92f35207f5ecd6a8adb5708821d9046eb31863ec95b33e16830692eb8861ade25e35ae63f015ce0fb4493bd79833d4b206300d8421995dd528bfefbd2ea98fa51429b0daa8e280c9427dabc145d5217e8a,569c4c9742e83385e29ba80205caf38d0e95cbdcbb9ba4ed9e8028af45156958,67898f12c155b35f1229f88733341293c93f71774536d66e180c6c6c8c3d14bd0237517dbfa8bcc49a20d607f76e8d1fcad1774feb8fd399493af8959704b4fe00,fd2a5b36ac7a9aef6d013316be3ca5032aa71c579366bcf3d3c83a5502dbb791324ed0e1d887906f89bc871c267af93025b1a955a7957d3293b65f50625283b500,dc7e5ee8b1625cbbf93fab80792e11846e2801d4d1f7d91dead87d48f6bce1e97b4af3895d5332433258b1a9f722215a5c245168258afcdfca13aa1e64ab185d00,07b3b26e69498413273889030fb2839e05c9a6ceef3aadcbde0577b7822440b3698af3ce801fa3900eeb62d9dd24c33d250f90f96e20525f0bbb651d1b5c60af01,fc147cf3f9e17758b466d507465ee5b0a69645f04d1bce226d954b11ebd35dfc050494272c26524eaaa1ff7f6889c4ffc5046bdfe41a2754510d95c9a3422d1700 +c5b07b019e0fc925d7b7ea4dff4a8497ec014c6cf687807715144bf1a2a4006c5294df74c84c7390d668943f4c5c081eb1139b5731a72400cc3cef77f54ff5e5363b5332f7d78cc3265aad8ff85832ee8327e2807bf7d42e0edc323e69c1f6a49fb3c99888034de9b7f7762339aeb927bf4353d633eabb838091d27535098a663d6fea2b8bceb2f34646645e9faa59b85d9f92e5d98a28d6edb1d53b8ddc96d8d0a568ede89031590cbaac1466b490df93f524fbec5bb431ae7260c342afff639a24d6079368ae25e2af0144e465022ec9dcd1ad75261b63a8c8263f463715ad3eb4a1422b1192a71e16cf9cb0ba241e,2ea4a983df2142d084d253d197101094b481dffc37d5332506b17d784f8e88e6,b3ec78f4a1a0c09ca81611e6d2ab467e813f6ca111c15bef8db7455a717d4f8841662078ab04d6e1caacf516d839f3669314a9bc21878fa0676981710a43fbcb00,0863b158cc2a03d676145da26c678b5bec89f676f61dd81f10d3efba35ff4209334908b161247f82f9e33ba11e422e9782fce68b1315daea6caed357bd12e21001,55927b4f979d29403a5f20c4a1509f742764eebcca490963307e0c8465e9f92e1f7975823b4c81bdcce62136e226fc353ccad5ce955233a8e4d92109194b98b401,47f6e2b4df0e81a5df81f256fd556a63bdf161ae189abe0807874291c9d9beee2a61d49258a67ef435af62608eb9e1327feb65054934dbe28b129c768d5e144d00,287c24c9cac3ce8a9cabb8e0d65b1ef50bb15ae075cfaebc7cc8a8f33385fa2018469c7ff702507171340292d019743943a508e22961fa92bd4a3811e1538bc000 +edb447392063a3e4229209d911a9ef926f6fa3b9559655ca87ff8382f72c09fc94f20559cd7026b2a1cb124804fb8b78e32255dac35418e8492146e2ae891a9ce3b278c1c2e02d26c67be956463ac69b2bab39e6ae4b19b6ec9370700f775d5974748cbf85f407270f4b2bf3fada84e88a1c59fe5aff45c29922d76119668943d226e688c96ed3b9a54e03e4f086e97565deee470a0eab51f0f8a49fcfefef6cb7ebd9ab99a2dc606ec4dc3b9fb3bafdc32668cb1d8f720242a84bec6ac6c88d64cc69af1a90e78862fe1dbd1788da21f4fb9a4b29abd6099ecb358a7de9478e3b16e014b5d5c06e314df15ec07543f4,8bfb1c10376cf88771a752222e8f8bfdc8d00da64de01301b2020bf0cc986ccd,3fe986c33c02beb74946a9b8620dc5e72520fd409f18bfdc22d70f145f8fea034f011d1f8410afdfc9c9e5c026ddf018fce218aa844eb53546940b26d5aef29f00,5f68d4122aa073e6172f09cd1bb5345fc94150c35eda274eed6b09fac9f5f5a83872b6ae05a24f13404cc43c4518cbdcdc0612a77bdf6e1dd28991b61584f59c01,0c7cdd3d7c236204447ad607da599be46cbad8c5902823ed582407547c189c034c78dd7d0f87533eab8b401309d4f293bf14c5c092993aa7630f5c5fcb3ecb5901,a55f59ead60e3e1a6ea4df6db3ca129e02a29eb3e4f4eb58994c12cff7a5cb9030160b1693a8ff02ae85f94a0bacd575347b6bba3348c1ac787c2f986d08b53301,fac755eaaae897b2ab9431d3f9d18810a098bade074b3670ffb5306616e1b87c156af9df4a2821d867bf17f65da0f364a34391bea301d0a7a1ad83ac4743f6dc00 +d70561f329013e4cebf36f9fb0f1f04c32de00f4191778e595bb833f54779ba3d6cfb6020dcf79041b42908a8d3a92640e26e62281d3b30cf5672b894729501d397f234477995e76c1159e6cbda5fc8d4847faf1eb2cab076d883bea3761039226e061ca709e8c7636e45da89400927759ca43e99151bc5a54188744199bff52edcd40bf64605da8018edbbe76e40cd6942445c8726b228e3dfa948face236a65c9570c0ef72f32d636c678983b42a3c288742dd13570bb02b11d70c52bfa41884bcb44372721dfee5ec14849c4bf6cccf42509211d8f262648c5473d81a90b8215c07dcb0ed7e32dbe0eaab7a921735,882a5c724024e5e0ef93f37032dd5bead8d83676ac9eeb91f93308249aad6cc2,cd792f01f2a06443d7c881f0540df73e716ab2c4166dd9db016a160a2ae6d2ff224edff90dbe7546f2886ee38d8f4a5940142f9d1488951b5541ab351f3b44d100,4fe4e79fb831232993de921cb0e17680c5fb5551d10feaffcfda9c249a0b424f22af9d64f989e949c9b26a8d0cd0c87acba1128b39b9cfdfcd433a6b626a652300,ea5b63d6433283139e7b1ecca7acd471420e32cecf6567264070c4fdc786d8bd043c44ed798c042f32fea6d81d06fa8aa29631f7040e6f6c0ac9540f3db363b601,fa42c572d4b06b3338e5a2796341394ab3aa5deff1cd64335dff3b3d213b8e590a5beea2ef17f1de2afffadcca8d521f7074e081832e93f4f69f7ccd21c920e301,e85b86247eff6ae234e749aac69c3a4bd522bc6e51a2a42603e7431fd6b8ff1d16bbe8af1d3e10fd941d57f85cad98d2b33bd8b3df909a1c65c29c1f6bab328b01 +e6f3914742ee107a25f0e1e0de2f5d13b4b4a1d141df33023a8ceda49144ecbc4d412a978294456e5fa46f21a29d6569ec39dafa983ac0c45ec6eb50a90204704b092eb073c4050a4902c7fe513b7ab23b9f2e94723e032626af29db66cb4b4730e7f5533f87e3d737af6fa16d7cc140086eb06a3350a93811a0d443d8601d71752ef02f89a8ee5744ea9d581aa2ab840a9cc9aa99cfdea8e72cd9e1b9d40e59913fc21a34818a1e2ad516b96559fdb3a34669479e88f8eda00bc212da7a0133fb2877c49d5ad40aefef05da275223c7db29bd1114645b40b19429857cbbdc2084ce5cd7ef0b9843f3dfc6dd9707fbb2,8506d0a6b9ac36668fdcda821d1b42857e71e08f19ded1cbf33ead087a10e6e7,fd4af37652d72a36a59ca5814f2681592751b4293a3016af183738243cd419c129ae9d7ff56f9f7699b232d4445108eeb1b5745fa1169a48b9959e99b7deac5900,ce9d28b41741b82f3447ad7eaa83016079dbc255ea1401b62da41967f5210a1f44b9a1221181c41f1029122624c0111ca33f258c8b5d8eb61ab16174bb07838a01,bd5e12fd3baac2b3c76346fc17d16575a4de36720f41cbffbc321d2d2d80a6c5605b6f95da67b545bc22e56d4aa12d8b9e8f3dbff0a1613c514ccd1e24e8486a00,e0c2965a6d53d60a4cc9f1a8888370c3d7ce2291b05bcf1cf330fae05a373af2404a8f94e175cbe61e8e5cfba0160b6857ded939e7192e5fae11a201aa2fe05901,2a2497dd7b1bec170386fc46ee38919492e54d361da02814f290a097f8b33916753355bffa41ffad9a357578760cdb64e75394f71e61e80f529b73329a26061d01 +d9f676f023d76612913ca63a625cd362d596015cb3deffca38b984ecc9dee695805d386d4b7ae83aca0e23340aed78c4a269a1ab9664f0785abd8cdb88cb09d5e489ccef785df90b1715ffc520f8819bba6d29dfff96ff87ca618633f4b0aa778af87c771128517212948313915b0863c62d1e5414ea6d160c0051d53195535e418800b77be599a275e0f8ff997ffb3ec96c8ec6bbc7cf37c4be0f9cc283e1601b64b78b687e0cee4353e8646c613d5d8cf974d7c8243715f817a5ba26f983d5a36594261aed65668a1eceb813f26390b4634331945ea21b0a5d9a1bbc23ba9959b73eca6faa468c454db23401c39bb5ec,1fe8554f7fa35ad83da7c54153891ae624b2eea7274b02e51b60e917a5a66356,56b3f7c5243d14cff17dcbbd8f37ee1a2d80a00e21ffe7cfe1cef86ef47321997237a14a3d79232bab6385c34a6789db553529e959c05f69fece6b817a6f681e01,046751c634a8556cd2a7953bd25e1d46a4e12d66417c00c87eea710ff5dabf1e52281c9c95ffbcfd48ecb38226d67d5bfc06b29730e292935177cc0088b38abe00,faf21686038af5229efd5d5737497d33548d776237f2bd7fc950c54f6f341b364ad99a809214b6a2614613da774117d9b6b1cba35c91469e41a654ef87665d1b00,363a5311d92da638f99c09b33875ee69371664a5f8c0a1682c54c7cd89fc2b9b00f669779dd0533a10cb62e42debc5fa59b01ac6d1b642684a2762ed565f01da00,555b02ce69d5d78a72f9190b78956eeecf0c3f3b3cb9c31bfb87d08dcf5b2d2f391bbc4d38e1a3021e8075b13ddf2ad50e463bf011593d897247c8770d1f8be600 +a91f32e1b014c367f21c46cdbeec6fd5953279360bcccae79efd4a449105b6d04fc48a977c043479879197ce13167b90aac202bd2d0f3ce7c9d2850cd2eb5e4915d8cf5cb03dba8a4e87efea758018340152d30900881485461dd3a433c96dbcfb9f1b2e6a666d1cc560995f383aff1ae563a8285bc06241ec95cb83e0854aed4eec43e9835fa7c8104a1a591fb06bb98e8a18af9f9dbef4efb33a32c87282a7d161c1239dbec40d41637bf943030623a71f479a80827d599dc1f52e451c86116d8b4b0f21ff3f3d50de3b25e8258605d16b5e1d3da9eef60a6c4aea7b551262f36b9fe89011b09ce7119d6fd2502c05a0,d7338635bc7faa75f9f7a368b4b4bd87621967df9f1852d652f80fc44f073e13,16e5898d807a83fc64a65cc679e7c4f93c5258f24c8bff00a4ff803edc05f4ef74da48a41bb9bcd59f1e62ac8f306c287208ce9326ed55e03b1f2446e3e2995c01,f5e979369a051afcdd4ccd71357124ed21e65aed1fda99e2125910878b35cdf02251befb8e72c1489275ac5b0078cd8315789f46e47a4fd2067baa59bea1fca601,3af2582c75b5761d70d6138393b564c42348f0381eeba9cd7a500f51c2163c967c5e9c331aec89e98e9c8bc7cff0fcbd1114cff62bdaeb7ca65710701574882801,1002e5747d42798037c3b8c37ec72360d056308ff7dbd19ad7f830af86c66f362a9089a473eaa44ab59bd697df2e211f82c397d5102ecfb639ad7f27a21e2ddb00,f11c11ae3a45aba232befc361e3d9c8ceecfc30e7ebc70aeab5a5de69173c509795c2ebab7ff80590a72b110138b8269d0deb61dc0becd33a66a6c190195d71800 +77a75e59d67f434b5a576e366a57807f0c4814f8ad05aa6b36dc3af9b2779798249a73f87ee72fe40c7812f2bafc65716be4989122b304e572b85c950ed2e90d7083a9e990aa5e978fdbfcb03d70b99236b6a66c80976892188e499212dad90a8768bde90822c8a6a5161d55d5a372c281c5b12c09996a72c0025ef7a90e688097a2cf5516ad990c3e52fde5c021d71eb42142a1779dfc6e2e12b47e33464a826f09b6882deb197a1205dd34e63993205313eb7ecafbf2f6514454dfdaff2eef49ec990403a57fe642de82809bc5bd260ff47ebadad057fdc035f37a6f94242a68a7772b015546a1fa839ac3af1012997c,55e4d095218ae3f0c70a03ffcbd0aa52995a221e82d333584655eaa92f52d06e,addb784048dd3074fe9267a9fdd0db41eda14e97dc2fd7459e567b7e1cef85253a07c580fbdf48010e4ebdf2f1b34b3445eed815799cf64fd161858d9dd9230b01,b58dfba38b20fd8f5a3c66bfc01198f5b09fcc3380817ae41e5d5ec2bdc74e697a2bb68b6a782e07e25cd5edc1c6642f54fcb121193d62c938e33909419dde4700,2e92598417bbbc53597992dcd136fadaae7ebb38c42fb0150d47fe2f28c9da9172077e9318f47d1e3d65ba130a8ccc368a0946ee1084295aff048d82f2d2b1d701,48abb0f667d816e68439f9211764ae7106e288f9bd3c729f863d2e3c582096422be3f356d76f9190445852d16eb92fa45fe9c29dfe71443ab60d987af5acf91b00,bb14b4937728b070d7a456068795622680c84533f537699dd44597f9537b121d0749d480bdf4917319e2e5a24ead9fe6179963b3e3a2aaf47f14a241af50a9db01 +9fbb0d79766885a36f13ec40fe8871e45fdce9e678192fe93b02a0356f90c7d6ca9c88f9bafc964a577fc59748913611deecca53f12f5777f709c3e65879b03f2d275cb42cbada08b42c36fe70ed8b2a1ca3367ef48fb59ccc0da7c9700857fb26401d7908ed17beba7266c68d641f5385ede9df66bb2430255fbde6b889fb3e30333536df7891675ab4115793b58e30e484b2fac8f49b93d26d639e795261e76eec0e981a11068d26d82cb34e723fcafc180b21f8c4a78fafe0bc7045301ce3ae1953987a35ed3ffbc5e1960d65ab35993825d357edecbce2628c09ad0de5f03269dbba56dd6bf2c2e2024a54be6f5ccc,f0fab1d063f0008758fb20ff04eb346d4329a5393511172dabaace63cbfa4e8a,028802215b5b4355f3c2f5f459d5bc57d2018cc9d1f4a86f91db1275f23dc12a39a86a3035ffd5261cf8ae47d96ab1cd590a484ad4d9def2cb21152b062ee82d00,40ab67abcca27e7712d244e53e4ac26b8dbfda08751b9ffaca8c07a03a83d8365299ce8cedfea27ade74fcb2ba69ee2841b9ee6d8764f10fc3790cea3d5a016001,8e096956d212b0745a4a77256b6875e2e8f35a268bace68d5216e01fea073ccb4f01f5e0e1a49bf5757486bab3d26f937110c1d80c37da6e20357d867731b7ff00,2ae8e1607fe9b914f4608264070f2416ab5527d287c16f665c59f83b63a15e5e365cf97ec8b3b24efb894e177e0b8d0c768c57fb7ca4cdcddcae69805e76130001,309c357cd08422be3f21094d424e2509ac41ac7356e142c1431723dd3cfac99f4586b03cfc34e424c81dbc52b83e40e40b0bf98012fef94fba60fe4db2454ebd01 +0f84ea50e90e781f6cba184b4e5b04d832bee706a9c71a8e8bc2222e125c34ca3c0a79f5a6c21f88b06a2be1f5c243502cc9875dd4cd3220907a591cec3f89f1a21c67490db8bb3b5687dee08a044f8a85fcedb93148245f65c51fda94a29a07762f84e99c38bd05d7ed547c24924d77fc07003694506c0ab5f50eee0a8846d9ace00b6c3a0e044e39ce57f0b3896ad9d0016ee72a0e682d7a7b406b2350f5eaf5be03436600c90274f113a223ce8826bdebff005776a89d78d26c0eb25091c1dc641771285a53ad728f03e6cdd542898268e5969e53c43fe145e4208c9ceef2c3708de654bd8faf6009a33e4898ff89f4,2d09bb84e66141abb2620a1535149b4b0e2ff509e72f581165352d7930905ce2,0c7d8deb42a74b69063b484171ec84e645b17806a0324066b0b162864adaf21407ea2da30f57f830192796a9159b6107a3fdc0bc39aad1182587e0cea356608900,53d0666f75924eea2c9ef4e37b238dcf1c35fa1bbf720d7bdf45efbdce54f91771692da2738b2d36eb4e4a8c980892c64c4ee2aa8a7157af3c9814d12da6b7ba00,db39c78780ee9a52c8cf958f9385bd8bd6caf32150962687960b1003dda982372ba138392da472494b99e7d1ecd1aa606740e8dceafa7bd9dfd1b075c7d82da601,2b71ca0f0586a699e623f50308660db80560eacbbad4f380ea71b0541372200f52616b79067a559f63294421f1d14e0b1398084d1a7b8f482b92a0a5df944c3301,55c7aa9fd0d1ae48403ed2d023c7409f907f607b32a1f664be2e18197a0adf70100a50f63c721f2349e2fd85b6f6f5e9445b984606b5eed18b1aeb5b216de71001 +aa023377283d8e0a4286840c20f0b341fc69a431e8088b27b7e318e11927f1a6e369ddf83140d75c9b679e6a984231bf6aa627d1ef4feff00a72266c459ce57be49c243bdeccca69176e72098be2c7c5c9b66156facf9bd4640061dc3ce136453c874fd30b1926cb968feb494fe6e219ccc170bd218874d02c4cf916a47f862a80136132e6cc109a8ac348e3ca8327d0fab7483a7818d139fe9b6a4e945330b690e2654237ff49d3ce7a19995321c98f088391944708c53593670c31535576b08a45e83d0ca183e0d944362c68ef8b86a5d4e66fb05b8a85577a7af0abfb82ce6f065eeaa3214eae992005e30c2d60ad70,d4efa94c019815b147eb860aede5e0a36dc99250688a1a1195fd089633d10b59,5258f4083b231c808434ed62e5a45094957c2802979b2349ab6a5a4be36e4d6e4baf98c20bc600586d753523f0775fa1cffb575b3904de33e368fc2bfe78775800,d522deb590e77da75f99033c64f62db9cab47c900349f14f41bda0af917886a05b91d4516051f8dd3176d5f0e1a90b822905069b89adbe6686a8d0d9c03fb2b800,4e292187fb62259cd0dd5940af3fbcdd30d1c35d13481f21efbd6b4a81a46ce1569aefe43a667c59b4b2e523427d2933da7c1cddd6f9a674d992bd185e85d78b00,3e38c3512824c57d45bcbfbd3044156d743621e0548e3b02221f825b55a18be47c6034d27578dc1b272c7d8c644c7012b57d83c30695d13b0ac7c0be6e66b2b700,d5874bdb8236812864863d2945a2cc3dfb9cef551034fee11ef9f67e63e7f8cb1cf5f513c85c691843bcc63981c7831df3c81dc727faad9137a96eed709b590200 +8b7b7690a03d771e91c680777e7df84ea169bda17ace0cad4576b382e6875671bd793ed3e47d6be7bc58acf6d257eb65667d2c6c3129ad1032d768adf7c239318e85e24bc36c8c219d5b0fd9ce13f46d5c5c350c52ca64336b6ca33cb28ae41d5f26230cbcb732425283bbb3dc64eba4efd727f83175e6f9477d24c23ecb3842a3830f9ce2499229a289ab22d5d46cf7f9dd3185975f6b852b4aad7a95014e29b835d9c37823d4fe9f4fed786c0126773bd0c148f19b0ddb6ada90de4c150292a1be9ee9d4fb3c0e6fc19bfdd87ca188e30321f1903d27bd97b413fc1232dd26221c75ee44ff4d7c7b2f8fc4f3de8dd123,68e000e37b0357a6c37eb347086312b1542457333be41f7a31eeea880c245c6d,db77852c846f36d9bb07aefe9c7ee6d58e47aa8c9c11a33d03d4f3079bf7f2e809579621adff657b17141dd26eb7eea8b4bc2720b41ca8e9124e6c807473aa2d01,cb7642f0211f4b3970425ffcf592f997d45973a12d0b642fe2d65650411a6e2843e0dd87cfdb016cf44c0b124ad74c76a5f649b5e2c4bd47ac08a8ef6bc7ae0701,f9db2e88ac886ebb868c269de8b62d71fd961ba05a0d2f7e93208787b922466f79af3bd89843337098f25f05214987d50950430ac4ba2632b924ebe08844f5a600,01d464b46a3435a22de47bed36bf7b4a3da47fa352faffc5154722bce1e1060821b86adae725ea8c57fad72005477ee920bee89de4dc5449db1fba44164d28f101,1b619d79d9ffdc2ee50cd153117db92866fe9e908bb6b6a779cd3453ab8cec50337ca6c92dccc7a9809a3f99ade07137e8f7629070b11272abdf1fb9a0ac6cca00 +97ffa72471fc92fef6e69df777fddeb206fa30bdff45d0b7f03c2784889bcd90ed39cd2672db0423da83c0b32e3ae56754dd3f0f25f5ea7d751cbbf52bba0d0b4aa7f524f6acd5678de87d60aeda99b10dc4050cb3f870c28a6d41e2b8f6e1285638e9bdf9690940daae6cf741c43c5862313bd0c06cd9b4f16b0bbab20d690a120de85bdeb52d88455d7a8315e85cea96e73e9fccb52329052e1d2615d98e204d08d6f0c4cc8df31ddd21e9bdfb135cf7327e9c206230c7ce7c51ef45e7133c7d0dd82ff957c17f1e05f371b92a4bafc5c239950062d2e0a6ee8eba02632f944edf4b15b5de5369271baf9dfb53e0fa59,ae172ab5734771fba7bad8314bf950db57a85229b05936ae78f0dfd05a089d50,65164612a748719e3984825ae8b06ca055045ce1244dc0b3845e0002520da04b127434579b124c57700b83a73e5af3eaf3095910ec3d91b94cf44af2e3a7955201,ec74b9d82531e211ef3e5d559c26051e3679e9c2aa8254af183f89800eded6ed51f225e4532ef8b1cb075c9c24c97a67ab5ddeeed2a470a93c76cb4b01ec72dc00,c94b1c85500fbcba05b61a375f1c62ef25e5e50f075018d3e9b59535ad0557e133d6f68e7190aa07044bf4491139e7032d6fc10dac35ec71f4e89be8c34db61700,2d5c261f48ad7589bd78816dfb74270e5550ddff10146eac342b35914fe3a81317fac4c33b59960d4574ae718eea81392efe5e53621792245d26530e479c511501,b6493b76f97a7a473f185e821fcc8d399ca38f049810a60b14c32d5d7782e85f6abdf901113d951dd92f36aa808ab429c915597f1beeb148def037d51c6a589700 +572010d1caa7f3198fc93bb646bf366b37cb9ba4204780f39342dccde4cedab3ba9be2363e31b004a5ed10f9fef7acfa163d9877fe3d4e24aa9f04e28740fa685863fed16c2f02b419e347862e653c866002e0d6287dc09ff2af0997b534268b8e4224d45e30e27a1ad56439c1e6e975d72bc82b71cb5c8ad8e3f4e8a07a0d8e417010e9560f9ffdf9438c70b8e548952cb17d4d3fa8037750760b359c24343a9b448936d3e99c1bbb66957c586b5d80ac9e84e4d251237af626ee7941e6a519669fe2ef020befb625ce9d47600c6844ff7ebb4b3f7e9592b3e62abcdc5f61c3642078d94c7383de8dd663e52f0512c529,40a6384303c964591f04d0bca0dd39f0ec4f8f84d4517de6ced5710c22d8ca14,9b902ddf80c0b3f2b8d37fe3328093e6a38dc282b0766e468a51019ae6ab31a253ce0a331032de0bf3baa3cfe4589915d2d575c71b020cac6c797b0b9683e07a00,e29e9ecc47032815f70031327e579007b35ec096a775796d8b155c5aef44353b1de64a6220d22afe088a4d6c4faf19a9a0805761d6017e46078843924a30bd4701,e75642364d7de75303bb9952c77f633b4c59e695ca9cb8522d72c68f9939432a4c3089f69016f52eaca170de9612e0d6375899b085bbd38073b480468126082a01,a08859d87225965171848ee871e79e5e79fe93efa0184c92358319eb6f2825c13a27cd81bd05d44b47c5d117a591502e9b81c09494988cfc278d238a431298ee00,77cdabeddf1bc908360fb2a6b5acaf3053ca7774024930d3449f91bdc1434f6f2ce1eb6eb8911073bb3fd477eefb7e1164b63e55711d6cd8c249e73877b734c900 +d81f7b83c4f47ea231f42abaac39986d1b8aa960f691d542a081845b3e38af55a8203f804adf66ead6a9fc63555797b0a187f6fb0c99e8d79cce6a9e013f954984337fdec9aff2df75202f0e3d1950c23a3451cd3fd0e159b1d01cd83e20099a686f17300b2cc452e3e83e3075287d20a7b4041b73e57193687c26c496f733af1d30e48000a4a682836471325285f52be0c7bc57c66dfccfd65964feb808ab798ca312c4830e93f03b0bd2dbddc875570136f2542d5ef91056b6f8fc9c772cf6bcb930fa2096bb2556c671a22b434d436e30525e5dc95cd5bcb57c9e5f14d364cc2b6c058464e32dfae61f0f44e5d609af,27992521fa14111997929566423b8bf023d374ca77ab71948e5bd2e37b7fb26f,0341ef303ef3aaf498b386902e0f513015793303c971b70895c94ff72edbacdb36b9d0be87b6e25e0d0161ee9315faf74cc48af75e811cafd427c131f5c205d200,0b9a69e820a9d8e42a3bbc320312e29fbed2494237409f406629f8305c7e0f913a959573382f2a0d632e08aa59aedfae6dc0c2653bce2d26974575221820e66b01,0638f37a5e717b0b7a1b0403c3920f9e797371c963ca61349502c35fab3dda840687f304c6f12ad550552910da3bb070313d1b1bcfe9dcb1173b5cefad9741db01,ada7fce6c1782a38753b2d3710d9887c738850e3d7d5f4f6e04df63a1d02e9df657a62ed9e11b8e7e08c3b127b05cddec9bf8d4d178448ddc09c141904403cc900,b35166779d9de775411c868a7efe417d0a1073e6b0aaf4a4d145b783ae0344633c08f23e4f6c4c17af81ad38cd658ca94f7b6d7566c0cabcd8adbb3f7051ea9600 +36d5967d67fc7a372c55d7fa0e8f17c5903dad9b46e54d326ae3257686eab683cb0e3c8cce20d5f8be027534efe24a5e7ead25ade1e7fab8e1d673f3e4db530c6e400ab4df979ae5cee69c032f507d020acb4337505213a1ff946591eae84dc15689c753fd5ffc1672ac98b36a57eff186b34065b5c316a788a80479054b308d925d2167a83fc8f757d3723d850260b05a47c138085eb9ecb3a58b8250031003a43d6b7e9bc57f8939fbb3a8b94f896c4202ba69cce661ab76789baed482088a68a03fa7a50b0a0d7804e2b5d1cdf88b5df39b3e215f77734bb30025d43832c9515ce0062134d20ff9c3f48733fd6af3e434,8117ade0541e09601997dad111ef4167e4960186644732cb022421c4eb97a121,5e120a819bf9a9e4e3cb4d2f9e1cec28760e406d3ee2d2f0622c75a09b29e31026e28ba323db10623c8d63f867ddea0e0365b84799d9fa4c8ef9012c7ce2435001,d82674420d4c0c4a0e2a38ac3c5168ff8ff73da4b9baf6d3d794259fbac66afc251469a006b592ebe588bf746960e9c40dd2eaed8b6a0ad17617d0e64ea663c400,0e1473b17182e01294eceddbba2f7d0ce07f623eb138984491f65d0cb191372a146642b4524e2a2397ef6c765885cbda8d6f97409fbb13f84a0d24e571580fe500,aee56386d35e84fba95f53c1d3a3fe885c4054117ab2e06b210ea32779908253574d651d3a481815a40be2025d1da31c051ec39bcb49bf2ee2ae9e82754cb1e800,040d487a9a8fe5af49424d1fa6e1dcba9b6b00dda152cee952fd7105cccd2f841360550e779c9713c92b10e149631ca95c11ff719599240ffc92c45787ea7e3900 +e265d107794e1375a7ab90b34849a3d073729d3733905a6fa12a82be4b40e2ee9d33fdf7f72297474b787cbb32b5c1f9b0bd7d16f222c00764514f70cd6afa4c38cd9a190bd11a415f69c4efd08ee2785e126b946357a902f855f43898c29b0e34a9e2f73503298846aa697e7ed25793c697eec322262abb5f791f3e3380f54fb35582eebc4419dcf9129ed24b3c95c82de0a196611fe4a1321e7eeb1b2bbd1b83c2f3c340fb2542841de3c494196f978b8f925a85fe6247cb76bce8c72e02f400cb002cf67228e7bf4ccf7e8d1d3e4900612434fdded9927e5a610b213bbb3f8d799d363072cfe5f6a10ce3607c03f93568,0faa05a7dcf2c347131998f9e6bb073093c71dd0baeaff4f14c612b736b1545d,7580ae42277269fde2046bda4dd9f77b33b37237740bc8be1021f3bd7cf824b83e616e002a1bfdf0d65ebc8fefb09bc484b447b810b712b031569779591fd95801,25845ba8f086c3f8f5241ea7479453b5b63c2a0ffdc814ed1b5596e48c747eaa5b7dca2007d0c3a16763cc5705b9c7cdda1f24c2e0e9acd54418ebd843931ec400,8a83af4e87709d62fe820713b78924cd3469f11a844c96f5f215af326a1c3f15380af626fab7b162103f8dfe25f9794bc8eefc6c8fdd96f7dd129d437c1a26a400,6aae4c38dc627fc9edf692cb9f93a3f5f3bf6f21b3647adbb9a203b4147a330e437db128f349c56665a33ad24287572d19d08db6e504d7b8bc218ce35e49868901,1309bf1079f03d619e4fa560a3bf244d5bbcd7a0ba873d97eaeadb7dd078badf5d43aeb4efb2ff38451766ec49b61f10507b04eb3e84c818112d9e3c2ac5624201 +e46c730bad095691c941065a3716f93280f6e9381c9d58e5d3c281a093771e9e58a5dfb995c0976c6978ff1d8bae8dc4a7beff7ffcb3393432b67f0d914b26ab84e4103322d3bd44f803f8074bc40ea1e16eec3e1e4c461e7eeabb764470edcb6f0304691ab70523caabfe64802ebad91f1d69814cea75327e2e46e2c9e76a081e6cb15874e684bc6bed51b984ddeb407e60dda5220e8c294cdebac7ff84a49edb3baa49dc113cce3b58df2867318f804e3bb00a35eae02ebc0cb2b6c68cc3a5ca4ff0b5bb3de8d353f7aa604ef70cb1ea14364850488eead13b35bbe10086b737fbac75026b815bfe5e9b5b4db85bd0983d,ebe1ea5ffbcb1381b019b7578a9bff4cd12304148fde0eb11a4e3e13cbe6a61d,c2b5339b93665e84834ce58e6074c94e5bff473908742efacb082d656852112e0352a9aa4654fb33a89f1f03f9a927a4b1734fc72540d8e12d92b62215a5a13700,48f22d4162bf2bb8142b6ebc25a4953c044e6eabeb6b009c7fba0b7e71e62f2e5bfe8188f0047b5d7bdd4b6c0a1cbf7749bffff6067a544f9051badbed10927201,9fe9873e7453ed2629f7996054b798d6531f1f046be36d0734f3e05131ba417f2019a3a5c2d9f2fd424f681d12155164fd6d6a94b8f2b0a3b82ed467f4ec23c001,221b616ce8a53949a5fd84312fb4ce7aefdc2116ed9c08e5768a93293793fc583232dc865ad15058e7867d94a25ece9b2a8ddefe36386927046a017b50bd658901,da71fd8fc6b8128c594f3e9356113724e234c196fbbcaf981947e3ffdbd4d64b4475213a172a0ff66f52bed359ef8851e3f969c76a11331a867b279a6a2be0a401 +4ed6bc0d6e7c271aa891a90330f8c8aa302fcb6038e23df54b6138c428709ed326e22b43c2f1392f7c5c42b7b3dc24cb470719d0b60c8c305a17cc8017850b5a999cef2c010dfbf292784206d3a8d7b102361cf81870eb48c066cf0014a0664dc561c5dd7c3bb6605ba53949eec259ca8445df5b29bd0ccac00d16fc98e381b5e4a6e0629b5464bb0df8ec050711a22299d29faca5ee7dc22dc694bf6493cff3e6a2f4e116565509f1211e5e59868b63b8d39743e51c2f52f036d75ce53c467161ebfe652dd951b7a192a5712950202b189679851c8c49b1770fdf4ea911fbb1c48618e099384008c520e3b249bcf8a23f8f,5194dfc808d44b7a41123087304fa1ae6a76ca2e33cabca7dd6c189d1f9e5496,e2f93f6bbc2c55b329451775434a070a314f6c83b1b58bc292522c2e00e3f5682265f8408a3118fd317185fe2028f09b90fe0a122ecc3ac0dac5a8e2f2edffb700,4baac322a9d28bbe92cb15d3d73636041080a21717e8b6bc6789639e20b8c85921b135ca4516dc3550bd86eea4a7ec84825f370ca5ba5895bef8f1e0abaf7cb300,21f881f858511fcb22f445aa935ac4889f594f3a8c79b9195728182339c399d0537f453284dbde05cafa9931b1824289c9e0b29ef5dfc6a0b3612bb7d058c7ce00,964ad842ceb2a2ba16d93633fec0540b3256a95adfcb36a408ff24e699d44cd978ec812f369f16f9d5b4100b434cf5e18b3f07646de521fac737f2257a06280c00,7c3f9ac5b50edeecc6a5c8f7c706bb24478a167fa489adcb89f2268dd73110764b3bb98db7c5f9297f2f9d7b85d6567b4588649e768d9adcf3f568467dc7370200 +4f3af6dbaf2b1b4362e86311d85c41b1f6ef2740ac660321183f5e993a3783634ba13423025692307d43011c16f61bc826e5853c4b9fe75919a4f9bd072ddb35625b45f0a9c22034080996b46295064982322b6167a6d32e1762f86cf848e9a8382df8a3adec6bfcbe21ff1374a87131149e6e36daa8b7c8ddca561ef7f6df0d2947e4e43180c1972784b036d9a8094081e01b07b238ebe61f7b3dbdee19b33ab7cf5b9bb90a5b4c47231a58428e52dfae3301959283bfa6b180f829d201f8b136dd940806a1673dfb5eeefde67cd2d588d08a6791e93da95150c16fa259efd2c50554d7ccd610bdad196fc6ff6c5a40cb63,1b6487c4ddca4bd907badf45cbc55a38fa7530236dbb3b2d471a100cef1a87fa,cef17dbe93e3d57779843eb28df691cb13709a092b7725ef3b7df83f57b9f237582617238a47cd98bd934afaeb6e0c7ffe2345ff01c79d2af0946e36b76fdaf700,0a3302285020ac87ecebbcd18899236d789ba4cb4d4a5a29362ce71c8c9db61777352583eca23aacb9de5b19b2a729985d82a48c3953bb02328ce8b51442901900,2e48e4add7949e502d1978b9b26738d3ba637686cc33aa35c770fd07968e1cba14981d02a67fabaa4701d2b2e1a0a4eab517f57ffe9be6ba39704186b6e85d3400,f2473ab3a07ccb7a93cfe20cac19ffab1e86d9ce7d64fb572e3ab79861c42fdc32ee3b1c1c7cd74d0c8867da5154e910744bd50a582bada56ad8a4084e6f22e200,792ad4cce69cf2dfdeb2d9ec0843aa1ade0225f25e49605376c8ae15c436a2b60196cbe06cf886ecce4c0a0de1d92457e359bb131e85ab686b54f60c90b07c3d01 +991e54bd36f107cc406fed8a66e32b81ac14d0757aac57d598aab127719eaa9bf57c500b637681349cf9575dab061d6746beded522cc8657d075b052f4b18ae58538f0ed2376fb88173a9a33f88d9e61253c958ae4056a379fb5284b5d2dca51cd23af6c2963e8e8b346e6a8709a4cb46f8e369a4c5418ea4b2ea570c7973f482f7732f6d0b10da8e8e45d27ffd9c93d4c3e421eae65d74ac097ca57c48fc9437c19ad27332ddc1669ef4ca87354fef6d7185117a929361cca384e1223227a53571c1219ccaa23292f123ba42f9b80c8040f0062f65712c727f969122c2eda37fb0daa338fe7e77495cf8281c7bff8cdd1b4,e4b781e4586ae849bd96a04ff477bddfffa907c10def70bf7b51042d518d7c20,48d188aab89f55d65cd7621e4530b272499a9fa7f90ac4c48ce59c5d1d2438a422f16da68091fa22e2f952e428cf1a050004c72baa84b3f14fdf73a59d476c7601,bbcdea49a26c787fbb79e89105794c7a46758908315804b903b2f1a58fb486be568a52c18e726595ff46ebe089cd6bdbedd52ecfb3d417ff937173b7af1fba2000,ed7a16348f9bc5f11c3c3b2eae6e3d6ba5c5fe7b4c5db1399e40d0f15b40e05519382d2279340f89f11bb7a0c317deb2f627ef63d126acb5ae345dd81abb295801,d74580e3c9ad904dfb6419a8117cae821b82668f7612f5449065b16ae740223d2f28591ff104af507dfab73a2ebb335f83fb6d51d5580299a25abdba11848fa301,d7b4f98ddfa16ae12922c17f8165af1aea9ebf45e85044ea3315fa1ddb851e2a593d1d331b38bc2a864b6e4a187a7a3d3328e11543ca04b3000a5b942c81111601 +818e1ba2db421a16ac34f3ae4ebf0c809f3c1c499e91cb6e4b7429aa18feacdfcf8a723d3516a35f6d5d6d9a544b9414df0f210b921a65b3e4e276ffa1604699c7ef471f282e9c9978509eebe8a1ab63aa44bbba494290d423528468b2ba550b15c0d545d65fe7b6d699bab49536e6d1cee57e53a1208cace04bb4c1f68ddd06e4a130241858ad4a55ca7a437d8a50c17ee6d64035e7c875619fe59c209cc942b667c8a595bc11e9daf68cb452cdee55d70192496621671b7eecec0a7da0f1d5127f867637ed95227acd3b7c2e9c4e225f2cf0874cab6696c55ec9b20f7d3128b901397e8c34c522314d22c7cacc9c5a63c9,f79d0eab933657d0423ec4ba386cbe65591ba900506dfc2053fe331284e14f49,1bcda74397b091c725def7b3f8daad33798ba54a8af0ed54ae3db8d79ff0859c68b5ca59de1c0a48ec26483773bef12d87f0a021d8502cd389f464375688d21601,b809840fcf1f432d040c0ae4a2b7981398241138a7ee6020ab55a11b56d65ff638f83b9d712353c4b952d73d8fe7d5044e2edce239ec1fa361ebb0d20cb5cc1601,0f8d2d0113c7dbad143f73dd666a832b4b4fd1a9b0febb8f8d8360faea6b3b9d5d11d5efb87d7fe285844942880753017d256d25acf1d137c57bea9358967fd501,05981873303a677b56e98afe3604a8955262520d53e8e249ec2f322e372c0f9d672ca0ede52472182b599385bd49461c8acb8d1cf9fc82fce5c5cbe04d14b69900,018977a49b6253cd6128ccca541875a0a3c81309028d169b308f70cbac0688f45094fe4ad1f6222bb2864a57dcc8b0c7823a7114ebc4e06f8286a5bcaee67e8f00 +9902097663a4b5f9ccb063021dd0e88b66c47883061fe843bb863f1a59ba55c8bc2191595ed9f11ca4b184b71d5a703658e7a1807438b1e1cf30cde240ee57bee6b987ffc1ff240b434327103671aa35c815ffe9e6800f6dd185a063c1dfc1c1560f3ab258d03ea5fa940ff9a5a0419a9faad8d89db1a9a0d3f2477ba3cda5a1e65ce4bd0f2cb50b2394a8672adea0910c23cd6f6f8f7001d429fe04f1cf28b2ba556b5f9ab475f543d89ce51f6ad5cce26532ed1cf0db01fdff8f4e4385a8d9dd8a9ee30e8952e48d476a3c4d23041238b41a44dbde907c5873e06aa568907700a045b4a22420600bdcb7b09cbcd2b4903d,54430818a35bc428a109c56ab33025f3d08fff2f57bb3acdf7ab6312be29e00b,b179cdf475f0c877cb9cfac14227bcaea5b437391d41a8a35f19e53e72e0ac5851f69552231f2990c60c439e5cd9a2c1f1a8ef6e4e22d67e427d7021a9f7a37100,518bca93fd0841256711c7e9b4dcb4a8038ba3615f7bc8fb6ce9f49f987da6931f445dd982adc212740242ef8740739ca9b57ace0fdc925e62c3c28d5a73669401,1f64a3713c4481bd469070232e6bd07e8570acd13f2861773dd17b08257335a64a3e62df784a15d8a5525d02d2a2d131f08da11656de8b9c3ceb3c5aed87a9ec01,a3475cba8058414b5bea95318623f3911d9086123e8b7fdacd5b70f110a846d63242ed4427944edd5b7f359f198392d5e6006215040da96427b0bcf66e58547100,a8dbc67917794519a3c5ca9df2b270ccb0fecd681729f3612097e2b9403279fc4bee1110ee58f6997da2058e52a602eceec7e767146ef2ad898fbc4594bcebe401 +e8c41bace50639c2e33ac59bb4436f3f1861366ec29d005ba3fdf6f7c8b6d818ad0aeffaac77b390417a5842db61509a6f6562013614941648f6622622e8875a722c5fb0ddd01b9b5cd01b6711b2a6da17c306d93f1b073f8d4aa2445aac75435175a1e2c024b782806552ce22a31ef2a1fceee2423c842b90125d4af68d9317b27972695441c5e32f0d35f930153b2388c888f243b4cde3a5c6eca57f0ff6cb20e6e0f68918f69f873cae98afb1cbfcd8cfc7d1f6b042d35bb1324a20946dca9190decde81e23c3e8b676a2cd96d94c28a63f123c6d388d87acee879ebed2629a96b9461b787766b8bc57b6f2d380520dfc,10df4c092fb4580842f49ec54804ea4fec992c7b949aa66515e4e63ef1537e48,e3f8aebb5fa514053f95b1140a1c776c8e14076dadc32767196c409d4a83b1fc5dc77c5b17609e07dccc967e0e1590de1a2daeb5beb75299caa8221591f227dc01,83dc2393c9b7133b39f93934efac1def0e1015a2aa563e6fce9b257551fb633e6f4dc88c46ddc93403b0319bbcce573becb24e114d9845abe897ffc0c3d01e8c00,fc741c021f60fc1b42e82c05069c6fd5e638f3fb564828d12c4923acb26cd47f210bcca31239f8b475baaa11f8728a64f5ac02c6dac0783bb0a7abc9252f007700,0e6cbf1bd50a0286160b609681cffd5d8d19e140dad41575987eed3356c1563368de01848a6e5eeac53827f28c1054d376eabf2992a60eb34817ac95faa486aa01,726d14d449f6dbbbf8654ae86821bc601524f56214fff045f795621a4a1976ce50d2dc2aede854af65ee155882676dad562df132bb280488809438600b97783201 +09d28abe311eef657884f93bc7d5f1ced0c81ef401a5a104567bd85237608159f9172f030bcca0b3ef9de985ec758a65a455348caed0062ccab97502c49b374bf14cba1b6900b6a5b9a62a313d76abf5a57c83e345f655bc69b2044e773fde02849b6bf01c80bdcaa6667bc5fadde5fe0b5839f26862d2d48f5926b05dc8dbd29ac400389ba2c1f4ceffbe99d5bd306583f98cc2379d57e824ef575a52460f841a2cb0d3b431f979e68c3f8708c0d9d61d031a1d1e97468fe4aa6cda3ffda77e2f4f8fa23b74ae1dbafe7288e9c9bc2607df6f599576432d3fed99c6eebbc57ad3c184dfa1ca816ee49d577215e764d003fd,25593fa4113904bab96db2e36d3de3f17dc2e96fcbcde6d92f61df6961e4f757,bcf91ef582918c080895737faf52d789e0f49941995df77391528aee2193c852441f59fccf88dc404e6e0482f4eeff13727a820242318ef10cee5f076bb2f84300,2520e24f3c324e2b6d2b5b3d54a9284a375b00328e9874e580275fb361012ef86ed25b80a2b72b72020dffc52f4f6400e039152924e2c8bac591e5c346015e2600,a3a04c86cf8a29f84ce0478f1bcc9ba677a4a195d61f7e1f50e412d0407ad9df5b7e86fe9a4f2365f305aee3391428978a6b82f1c60f9e4bee8f8f8a18fec91d00,95221d38dbc47d6d74dd8dd09700ad1280cb51217090d3c2593207dfc59aa0280f07dd420fcddb471bbca376feb3cd0e7a4e9a0291d6bd7c60f514b178af9f1501,f6a02903451f494a327ecae847687d4ba36173145e0072edefd883619368ba702c5bfe517168d85499011f6e1f39ecc9f7bb2552d04e72cf8aba76f293a98eb401 +e0dd28e5d6dd5d985b22febc8dc73d9c982c87b6d9e874f52bb50426c282af603947ddea12e353962ca432453269a2ee37eba580b5c3949cef0fcf625dbcb905354a0e361fce6cda4f699c887d1d44ac1d67b36dbbb0c9065c2b3084c1986930660ee412a5363e4ff3366d2baaa9a21f399d7ccca87c946de636297c979ef57d70aed9485f840fdcd0db3e6e5404330f382d27b6bf55320d6984161850d2ce371837f4cf7861401064429e3fd6dfe0aae0f343ed8e61d4c49031e0250f1676c8f4b4a112974de223189d368a51ba1e70ea24c311404bef717db100721e23c2bb64ae1be6aedecdb570499fdca10facbe87f2db,c62cecca88a576a6674b4ed1841728957d3233a6dab043ff4530da5e7a8b54b6,04a0a4db7a78ec0f125965972579804d2e63c9f76e76845d2c600587ffa5fb577e75da115e0cd023e8a1465872e91cba11b6e9789c8754b71959b611617e987700,b4bc26ba75427a9346fe66e182c3b7cbbd1bf7205fcda31e366751c7183e0a916a22197ba757e07b10b5deb9ffad42d2cbd1dd846f08a9d54b2305cf95d38bce01,e0ae85b719a3986d36e11b9e79520e8dd234df9ce6ffe0176e0d1f579410c1e52c251a4a3a09d189eaf513f6c6e4a74d230e366014ff2a9eeb6801b7c64d16bc00,bf58e8cb0ab3123b3e91a8b9d2a5383dc96833d223f80f950a4df132f22265ef57b7d8fde84d3fb7dcc6ab6a8359cc28164eed512f792c094a845147a903764301,7aecd5bcf64c25c381068b106877ab7b840dc1327e17dd1e0e7f4e4ea0e519941464ebf23b2ef887c2b606657c78163eda045cb3be60c801a62f2ed71eaad87101 +04df3beca87d33c1b640a717cf25e51f2567d1df98f5a9dc69dff8f3253b45ffe13245529f5fea3bc6ead42235f3ad343a18b57ad9aedb701b6d19c20a64f01d52e3ca9340e5dbaaf8221648306f295239ef6cc4f3fe649f85bd2e7a25d117ace21e9a233d495c53f6e0cfcb1a737885094f732752b76c57dbb5933b63437e21aa823c13361d39a2547dfe210e6408fe9cd1844caa18d2b44548a7e0b7ccd6aa106eab368c8cea6b7b4d713c5553cb708ea751d4035c8de4e6ed965739b26d98f5c3cb0d0caacce214653ff434143875b836b3abab9b1b33486667c61b8f972fc5b82c7ea74c7c101f102eabb12a5c1a6a8e3c,ef414c4ca4c0298fbfb55cc5ac8513aedfbad2a8326f2482e5919e7d9991fa8b,dc05fd7ebb73f4aa347826ed2a5262c87e091c31a1c0a2a9f3a17d5883cb74113431067e1fc4e26053730f9406e8a0b942154c958db52050d6c34e9d9d275da500,8cccf276cf02de6de2894ed8fdc50a2bffc1a7100ce2e58f89f9738463eda3f8389dc022037e46f969a9f131df97a784d637bfbec7007399f9538193fb4864ed00,10bd66d4cb3b1fc1295421c21a6774aaf375ab5a2229d08e8598e7273b7c24c339f1326db506c05f5d32a3668b9cd69499cdd1cfc8d92707ca823b4f0a31697801,b0938d6523b36a899f8ff47b77a509941415efecf21385c94f9190c37b164d357de7a8cbcb3e0dedbdbabe1f12403b595f18a70c7cdb1a31027fec50d508bcf201,bf70ad94393aba0182a4e725e897e3478b799c7f7c9f26e90404273abb5a545b750a2b89726215923aca0541e6f374e74c954365dd8f5c397fb9195a02c3946500 +c38080e7b1270f8195b47cbf8db5f1191b243ec250ce2f350c01261f7d09e041f3f7654229e33ca00c667045024999dd1c0fad50ae1469f754d2e7c628ba1192893107432c8f13c8c9c9c705052437813b7d9c3ad7a156d411f33dfd8b4b9102b28c010cb57ad2000739dd66267faf7a746838ae0f96a1a324a676b85158b82c13bf68ed71874a1b3ae0b6c7bbc7e6b0d5595bb894f7724e18462d64d65a3b6d7382befa53af8d8e23bc59ec2b52e94e0b9b424afe3e2cd18ddd634c3a39d99f56a382eead8f2842d9b4bedc5e4ef7cb54f8fe095a78cfb5fbc450b165b5841c41b739e572eccb920562047e65479123659eff,007b15c5485c2c9c01fb8cdd6f8c9a3eadd2bd8eb050f00093da84e3d078db09,5b3d751d8141f42e607e54213f7d96c91c47e53e7f62491da9ee43ab949c827c0f3948c8853e7973fb44c9836141127c3c5ad4fd1e6c8c93f1f468b7e483633201,1cee0760f687f72f6f6e7b6455aca9508f7b72d294a8a6953aa1c10a445ff3ce5f327501d4a99554b5a9a83202bfc653833e474cdf329cc4fbe97b0e3facdb3f01,275ce13b93e6a23f00ce8d52845c3e105d37b452cf374fdf5e6c8e5f432d87fc7bc4f85602e37d844b0b819f90dfe168bd70a7dc6f1dde51757bce7c711c476a01,93cc8a93a196b46fc4b3f9f5477ad4f5a69afd918931b320108b37f5614806fc5a5dbe67e07af611ab3c166d68c0b27ad62c24a352f4502f728fc56bd6e56ad600,b1c45e81dd346fa271896e74ae8e324c65d3d437f873418a7bd92865adc62dcf5b83a56da622206a0856dc1cf6f0d61fa6e336e935e703c80174e70a93b1c63a00 +60070ea20f4e315a3b2bd7bf011ee931308077b8fb5b27f481428550a8c3a6af980764c01261f84cd434348a95f80e1aab9da716020a362a0062bf300a75aed4e8ede66e30277c912f345bc582426abea587ea5f257d454e58a8693deb3db1b94870221f9bf057d870414bb4bf8df6dcaf5d9f75a7cfbfbf63453c2d3e028b3bf6158e019693d02d6a8095e4405c134a04a7e79610c51375eec1f55dbc6fd69f035b1cba261cb1e1b93da3c59bac729627c8bc03393b2ee2b3771af9f4a6669ebfcdaae21d563aeff8beabd0276d32266168de4cac9ba4313de1776fe0e8c0b968520a34ac3a83a1dbf51ef8139849cc7e6ad9,5774d9c5e92f37b430a10ec882efe47f5d16ea8df3c26fd6af2c78b4a735c21d,6f64c81ee73e15300289fa3d8f7fb09d34cad50d478a63a2c3a072374e845ecd7d134fccccbb437d27f26f8fb197e74ef5212ef2869493ad014ff3f32f1795ba00,7fd7e8ce28573620b48b9286373de77a817ab2e1bce48a1ee86d786ac7c085ce382beb984f69abe218dd995b67306f5315c90b358e542f49f9e6f38f4ba5a97501,c6b3c7add4de0e519c1e8f5610de9462e6646f604f42e549f2ec69c9089fc43952d2ed973d722c54af8f30593a043e06f8b58f2ee48c1fb05e3acc6878f155b301,1b3a9d05f315c3e231192879d7e54f05fc76b113109637308c5dd33be36b42e91b77ddd40cc8f084083c22ab29658fbf62a9496fa62a6ad05eb42fe1d186400401,a2819c048a682282e451b0a820fdd5a9cccabdf37a794e59bc42a3a20565337d3c0f0738c26ac5bbd971314c8c6b6821abbe5e690cbb68a28aeb7577aaeff49100 +6f0596651194cb2f88ce9415a546c67381bcd67b99beb3e9ffdca3b1b4a893209e1958361e2b5e39a1105ae933aca8114335a52cee2501088284feff938c3e1fef078fa10a3c58501132e770727bed4366e9e251ce980b5b4ffa575f338e4c69eedd94c34053f189d3b0c1c111a5e204b08a97c410bf054d71cf1cba1bc823979f4b2a5904cecdc9010f5fda8f5a6a2bc5677f2d5adc9d077febfd1f1168779088dd11a3c7491622717da12c69d50c464d1417d29b0d3669d6481b321b2f3e778852543d4f7e30fab6e370ea4cf4d8dcba942472afa30cc74353345272fff675312caa5feea579a1888d6063bee6d6ea81caee,50a2b5efda0017baff5685ab07fab6f65d46b3b22bfd4759d881b6fb4fb1d67a,45dc0e3be96065c607c185c486afcf412eca0abbbdd147060889893573fcac2f184022ee78d014d4bbe1c9ae257ed8f73af8c6b5c300cfc72eb3f4aad28a29cb01,ab9b36bdc6b7829d3443f5cf4ee48040b627d03f4eb5c6cae3bf2e13d14e11fa4a8becc37381903d2fb4444a1bb11156a733930ebe5f49691557de1fa1f1c0f300,e8c09c23f31d6490e3500d52108e7acc8c6e9daeeffeaaf1343212228bd8a7412716de4963d1844c6c67e730881813fcfec8fdec2f3e9760ab84caf96ff37ce401,d3cd71da2ba4b55f0440332247ae6022904003e6eb30a577805576c6855dc6e01864dea76c60574e448803a83924872226154076db3cadb40196143260d7b02801,1b0460e6637af24cf9d8e8b2d9feebe72dc11d6c3144b6e2af0cae23f49f07651f4c2bf0daa2fb491af19ef6a1960ec9f45667c77f69fa1b0a448b48f8447b4e00 +8c99fbb021abdb18ea17330a4cf3fd2cb48ef1ae19bee336ae2223a8b8a331c220a88a845c9d4c649ccaa0273d04c5637ec0d29f33f24364bd6b92965aa0ade77f2e0a611447258c00327214ed45f10bef243d90e288398052436cbc207ab25baabf7aa7180d0681fd9fb013e64d943dcf904b9c18ee3b7ab3837f6bf3392b24077431d908041dfca6beb6f567b81541e0b48ee35b4d17cdbcff3b3b73bdc07861f663a22dc6c5532b6710bc3e2b140983496f0f8b5df3649760738d809a26955524c44f4b96d3b8badbfb958071c697c992672dc9d1803b585ad219834da603160d3c9ec25e84ba56bd2dad3211e57e4bef5c,90a4f3c0a8d8967a35ef10bd6a461fb90d2a1157f932d8ef5d245c58d82befb6,c08ddc95c656027ab3c5513454d7e4bd0e09516f77fb80de72dadb85fd26bf402bfa6f16517321e3c82b92e94a8e3ce345ec0d0e818d29e33fb1de65c3d80c7700,f09c764a18a996378a65227c753a27cfcf6aed46552b711ebbcdb3176e73c0e67c33c6616e54f946f6ccaa607f33b3a43a7d110a1a879654a0626f3aeade4b6800,453d92326e450e021a544d8c8e65578cc4c80da8d382a4576a33d7ff68899d4b2109a2708d2b15bd4c25ac42932ec121d0ffff95b8710c2cac0a42018fc7533600,73089c11360ff5fc5b91e21e7b8fb79a45f68752c6b224dc64e3795e28a4c0571c8c1393d74fbaef6238680b6b5d4b3a25c3ce7b4d6d5f4dff81c284bd84db7601,7010690638b6e4d455ea64b3cb6d0a44c5628dc0b21a64f5af3ab42c2ec9d890225aa7e4e2932c408a4c154f275a1fbf36cfa4a3f17f9947bdcb0a94bc89508d01 +63d8e76ec057d3df8994c6d8ec9e3c2cf501ff9f9710f3bbfc06f334a285910733b5f160d2f36d29c04d1af8c5660bdf8c06e5afccf227ec84e03aa2dec652c86d73f390beeb402f0670d251adac67ff7ae3a27feb47fcd20eebd70a5613b3a5fb2dab0969500728edbd2e02642f1a9e17e39c7c3a9ae67c6635d9808e83f2cd29179be904852c273ebd5dc24e9bf9c80963f57050d60ac4801f989e691293ae22b4cb83824e605d3da034eb84ce0e1883c95b06807c6db496cfeabfd3389830d587643598e6e26d914eb16ca0ec78d70ee19662f455363eafa9bd828bdc3a22447aee432f16b3871e943d616d4eeb97efc032,4c25b9d22ff247a7ce664d89c81ace9c9184fb89919e610a34b078e59388231d,6956e0bf34636b6b5486af7ce5bbc9c754043f5d6fdf5b1b75310d8f3a84c57d0a4ce6fa929aeb57a615fd012c6b2cc40223e9d6f68a93d6ac8b2aabbead32de01,6f822a8b0a363c3a51e4a912491e5063edec6baa7c01b144c661dcb358fb86524e25f259916b2470608f9d3ca9f97d46a30c827ca2742008900b357201da68f000,f7754e8d8cfd6cb4015f7e210a8a51e8bfc9ec70af4c4ff8488d3bd6a354f2bc65c83a82dd7da58f9de2109c88d70dd655e9cd09c21df72ad9892035582868d301,011eae74a46c2fd8b7c00ff79f137f7f10810d2a95a4bae5a8e9cf2411b385de60ae032de72baf13bbd1728da5787784b5e2e29e74cc1be43000f1f15e09858300,3cdee721f502a3d81cb2b0ee1fba487c1b94207053f67136243b0ce971b10cb063127e913dcf153d33a3fccdeea380785da96c59ec3a42380fecef161147218d01 +a1ba1d8d6759010033bcaa4207cfd07ca3bf62aba46a2d1f28c122cafed730f29ba451daf018efaed0d82842715f6cd9821342b267ee0aebef3518dc490e7c0c879adcecca5d0fa25ab6c79033ffe231f7174faadf8b4cc25f1990c3d8005dbcebfa9fb2c3c58e6fab28a8ae8a16fbc5eff1c49a1e2edf258ec8a161860e3166238fe77c51dc786d479587351056f3b66333826e9cc43acf7df1dc0a72f224db7a7d2ae1aa3fe7c2c27c7215caf856d0f0f91af0fa85b2225a600da87e9c85e9bf83f682f3dbd7edb3eb45e8acadd14a9f52ac5fa500c7549aeee23956879cc6f073122f9fcb945ede1c614e569e38c002066b,d1f827c5f83a481662ff71550d099f182a307ea32935853d44f30f4df3e30e3e,9dce5d8ec8635753737efadcf0f1c3da44130e688abb8fd4b88e5ececf9b32ad47bde4c0e7a922a0bbfcf0274dba1c25568503e532f6759725d35b032d90174701,7ccc8c065a327a6cc11502a57365a516a487fbd2ff76bc9c6cdfc62b853be9ea05886cdc944ca27bc2a2cd816d90b4f477bc9ef0bcda2da3d30a4f756cff20fd01,9b84fb91e37df48a7e95e25a4b07b0c20ba7b738c84a1955ded4b014485bce3466a463f95876f302eaba22db3b60ffddd9df5720361bfe23f69f4ff0bdaa41e101,ad56aeafd9837ad0e63d23fe414a09bcbcf4068c948d29cbb01054f2dc46af122728dbafca5ce4d0dbfa5eea81d763e652228b4873a111292191ac83dbece09101,314a21a445c00140f781eadb1035ea136e36ff37b4c79736442dbea6f8bf6f9962b2d72276c4feb3a84a924e53c08fe927a774b59646449f519c6506b840e5c200 +fb74e6a226554475515bc025c66176381278eee87e94fe4d2728ebf68e20cbf4a267e46c6ce9a78d1ec1b6debe4115bf4a436cdd403828bf92ade70390f03dd3a6a6bcee3e34f7344bc3d8502b35d6a8536d3b26c5de64d5038538bc69474ffa0c0c8e905b6e1a9f2178ce7cea913f2d84cdb4634184dd13c043c43d825c6d765f85974aadab945ffb75eef99ee2cb2a1ca792269bb11921ee32fb741db3567c97b5dbd52e910e90f9d9e8456726c79bd7b5d5873fab3ab371d7a4604ef5119e5340c7648055a710c5cf2e22c5f9b0ca3a0a1f300ac5798a4b53b6c796d5539a75354c8d43d184ea83e6d2b11dd98133bb290a,cddcf7066bda43f99746eb46d642b90200ff8ba34131cef8e68613420439126a,cd79c3401e839dcc7ad5edfe44cf872eb0e8b34f5acd071c6edc79fb187301e868590f9c865162364aa9f76ba3b59ce9552c14a7d353e1e4878859f4a3416ed000,d5dc5c637d90ace62bf0207031aef18771359a60841dbddc89a0e18b206b712f05f629670d096035b940532a1ba9344878f3fb9f274d5e5c75d6889b165e160e00,29a9f96f9f2ec4d47f3b0594dbd3aec8bab9822bcddbd7bbe00818c2c39c4d9644d3ad0346c5dc0311c011d2855ff72393310c47568768e7e72f98d5aaab845500,dff58b586b0898389d7ee33eb2fd897ff99de733a1afe0da073d054e9dd5b10f5735a63ed6a2c7c8356adf00f1748798ad1c2489ba2e3166b51520f97b84271000,e29a71f854fa97cc49dc16b169981ff141a101aeb7a4607b84c137d96d0ebac26ea7d6382cf8fcaa69fd3b0d6c638ee1d6878196ce840d4034ed1f3603ebe9de00 +fd9adbf22f332230500edba5c3abebb672e8367ec6994c8cafc8c48ed65a02686c317697d711bf025aa677012f6832bc18c93579980daa50b7ac51e76d2f565c7d9a344e80b6d79c0ae3d36c67c6a5c5db861698f8db9494043269b5a9eb644583ff1bffb6da05418b28d047f9f170643c801098ff9cfe824defc0fcc34013a5b24a1f17f263823291433e0cd57b52b4986f7b46e3f8695cbbb2fc5aa35bf23f71bfd89b9e38648a39b381fce207c082881d7fe4e1b6a57b312f6a9df393ee39cf176b84d7dd40f53596062be747615efffd0e58a1687138b87c3033b5110a38094d31668538eb30983d492d1492a999b1f364,c222432ec6da0cc1b57bcef67746a295971acbcd01ac3bd671188b9ec2e8103f,c479937b94787563ce4a1fbf4a4061a4d1b16482adea35c183bced6490af62af5e70ca90c1ce4672512dae5c5e3d81ea7826f23ae014f46040fee77c114de9db01,4e9f15806da28946b25107caad6da3c875b696860fe54422b896a429df7cd7f145ca1661af4821d368b88a1649a03c6cc8281ac75ec2e903657ce0da3c8c68b400,4e5495b99797b3b352441b99097b3795ce433d0a261618eac59a08993faadc14465fbd3765204cfe396fc0542db84dd3ed254fb4f125c82b88bfeb6192af6bc501,87c90be4986fec149f6504e0714f65d7c8da4a50512ff55ee032c190e0b05f9d69c396c900d98b14b2cedd318624efa158bf9808b70b360b74fb3c3788e0095401,0de7ad755ec7f24aa3b840cd4a8dd36272e0862dcb7b0e5363bed65a4445db2001049d3d14af02c1813e632c440be6ae9e08d6e75c14f401fe7de97e7210dc0300 +9642dbbc5a88c85350ce1181f5ced6c6d1a094a2ae2b68e3de015a1df6ae4f6bc9cb717937bb256defd0be81c158567627a5e196d0caa0a28d6a79501f85e9861b0c97a4c05675287d4c7abe9f3748750017922e7c64d60efeb0f0566c5006679d70f58142e6af4bebfd8752dcc35d17604167a9bde9268f17707ba776b18ead44ffd611c5b37de76ff1dcb1bed950bd899789c4772437cc9c59a36548e4744bd27b355465b56e2e7f014f3a9fc6ec64378e1a8b353b44eecb4abb3cbd5e94728d9f60d3a41107f30cac23987a9d495776c6c9161283cae5a57a8cb4c757362f14fa42325bd0c351a1ef167fe5b9c09b3cec8424,3444c62ee5cda4c87f9cc3ed9cf83adc7d29309e9d750bd8fe6498c2f5709cd1,15be4a023fc98b0276b202e39ee56e97f5e8e8347dd62e0654bfa22b09ecd0d07e8e44ab4b4427bfcb90477fb922fe58813777ca82dafbba9167d6aad21e679401,d3627702bc736628ff17b607a4b51b77f1f82470085a921d6b4ef532e2aa94a351fc7c7efbc54650677357b30d891bfbe143d66e41956bb2488e7cf8522a130f01,e99daf76a7a9ada757e6c877c4886c3f52769fb9f74e5223b65f1e203c7ec36e7e489311595bcea39b9d0753c0189006f006264551460490fbdb5c727ddd4c4e01,dccba72c2287e1e9edc3c58cc4aea68b20661b44acf3ff8974952d77590d4524104219c1a1ba058e6e826728269b4aeb4ddc2f14ac0144ebd85501215741c12f00,41c1c15c84d6b6cf29dc2b39834eab9d40972b60a7a05079270948af64af730d06d5128be4335ce7c2716672eb317e31a3adef63e0f70c13e6016b75069f226901 +5740f17037ef06b17416b6e3a274f22c4c42763d0c7fb33fe6cf4b1d1bd536d1d18e200a099707e31db56fcd746c9a596a06cfff3fd430f7c3ece9a362b4fdc27da2f689c733ce19760d6cbe7c181c6fdb2bcee0bf6dfc243259bca8f383fb13ffdef4ffd62b0837fc5b3457be7dfc8841a38bcc21067854ffe1450e631471ef345ef2a1f62cfe161db295b61f9c6d621cc6678d3b7ea2c79b762c2fe4ba67a243c2d3b394d41dc3cb94499ddad6f5d6abc06a79ab80062b7913618e0281e26e0081d265bcd440cbd3e2ed2d79dfd8235471bfa5ab0efbf7cb138705cf78ef1e414e794cec6b63e73e84148a41293c29774cd6a4,82acbc28dce19d7f934be2348c17625eb7d16e1242dfe7ec3e5200453924082e,4b22fc4718dd2896ce183a70b39e3a2718f8c534b50c90b71036cf93d5b73b533f95785acf10c57431aa2a32bcf53162a42d722c40013b1aa3aa7b5430550ccf00,0ea2d0269dd517fcc602b8c88c62d453426cf7bb14781f971892eb4c8fbcfb8e0db75753887c4cd61c2055d0276c67df45e05c5c781d229421e1d70fa5d7151001,4e1e11712901b4e683a0648bf6d69980dc8f5c14bef6c1929fff11578da6a6b2435f73af913936bfae3a373f081305317ced2b8a72bd701705201e032838b4c701,90353a84ed6ecdc055c4a68b6c1e01ee7dbeaf2b213f86894700cc0c9db7f4b936d2552a14cd62352b24f7ee3515b8a64a9c234d6522c8feb104de37731727d201,abf76766dcca76b722fc1be220fc58b4c4a1079e2c37f47772be1bbf1962c8b53b3a9377a5b8dc0b369bc7eb1df6ed045afd62bed814bc4dfac369ab0e8ac83b00 +2bb7d50490bb7d23d62d3fe329d72aee2c62ec162c45b8260736145bee1bf306ad1ccb7a7fef7c928d5aa7e51320c008572c96f3cda05b7667cc7e56b960f6d108f25f7d342a6b485c06a4bb6762da161083d3c985b8c12baea4a3b21c08d0617dccdb0c12eecc5d8431e9a2d7c1f9182390c948d3330d93a0a0e5496ca2f9de9a4342b7a41405d902925a9b26024f370559f6fc91c2af1a288f5bee2f44d0b3613e1b87409612f1eb1463c47ecd490b70ae7ad498070e6fbd6ac1fff38df29d6451b63333d0050ffc4995124c237bf4bd49deecaba1cbbff9ef34a480a4046c83dacb006124c17d76c0ddf16c4cd7835255b098,751879f0f84fac744ff18f7e1bd5c1e5c7098d011230513bae3a479ffcf4ab0a,446574b19aa9dd7486d97412be9e43948ad9e44f2b5693252fe0b622e2c5da4672707da2fd947d7aadcc39bac52d3e86df86bdbe945212eb6ecb1534a30dc1ae00,42f31e25b61f9847bb5a8df9dad5607cbf456756c30627d5487430a9ba11534a1d9388ce43d830f812c0ac7cdc220ba3947e3e4bcc0899c44ab1dba9b63f434600,96b06fa41db206dd802f957515703dfc229d8fdb5a5503f80bf143f33a08c3d60254b0400405cc5ac793c8108630b781d89ac66a9b209eaec5184e9ec0738d2f01,c69cfaeed6e8f2752c6daa15cd41a2e02c8d14fd5997503a5d4b4e714abeff2a1480f33b22b05a0f80ffae9a619d0de91853cc5e001d08687415726092942d5e01,467c2ce87641cc65538aad57964ab5626e81fe769f2bdb816a39cde6bf3f8c130399be77451b5b5d6eefba393ae39125a52e1153e4a7fedbcb3d94db1d9e299201 +dff3f82c7eb2b42fc00824abf370f03b41f2719cbe03449d7020db9a6f973258dad4f1e8af3356a8252f40f929c097eef3089085e7f385d61eda7a5342320f126cdd9b69b9ba9811810dbcfaa93edad694578b10fa02f826cae7186257f7d6ae5dc7b49643eb99e0bb7a611efa025c4ce5976cb80bf55349b28d7ffc57babded576b816b7b31097c158efeb6a81894968fb630733a44b8da72f7046b5ecde720ee4c8a867c121d37667e0f46183e21fc985c6466897728387271bdab4e95633ea8eaaa1ea90d2c595c3b100935ab7302fac608c5a4722299c1330e1c6e7ab8e508a650dfa9e78b5fa597536f981eb792a12ddaaa,9dd2dd12315b440421e171ad5fcaa0626ce94162bbd21108a563218159f6e18f,76c76a5c6281989663029e1e95105bd3619e2750c77b441b48f09bd051d675a82416da7ad489414cf273a64dff1b9681c9c41ec9101ea8461b9308ec984e894400,3bd16439cafadf0add449ed6312984b9008b5b3ebebfc843aedd8a7d51f507997b1983677b5659be1673e5ef7e156f65c5a1330057f5245860acee1c2e382d0501,b23cc99170969a982d2a5e47dd0436a52eec37892661fbd40850b9dcf58cc93b2f2573cdc65f1065b5445c2f1a55ffbb76bfa3a0074a0219947ede0b7799ac4000,e2aac3b43783214b31e13e0ae6d32062b0c1bc1b7e0abe915757460fef05ce343afd7218c4fb9465c3b57ea9b72040fd881a5301d5ef8fb8a553f81a25a09a0a00,5df97372083f372dd30ba74c06c9e68b6cb5630b17075a28c3b8b42e59b1577a2507cb50dbb9fc48cddb5e94e39743af706f87f7c9017d5d2390a81fb187c3fa00 +177ff36bd82198a1c8a3c9a757e62eb0c2b2f7325e02e5bc1eaedf22c7e8976beec00ddafe5fa7cd712fc31a1fa4d7c768b44e790f55ba067ce6b26c3ed76b01ebfa026320532c43a24ad7255be6d17eb44ec102698e26a1aca83912cc7807ad79493e12dc0403ac54f2528b676d08c3b7bbdc3b1306ecc1d84b51ffedbc454ac1dc522ca7c3644f80f2e1306df4ed209a311ff4996c384a4d37d22aa7dbb4e7155f52e803a8bb5ec6bfbedc741e86538252794ed0e5e3fad8cc1791572c9cf9ed793c04faec5f75a5a0d509fed6725652df48166276626de831935c482e4cba12b154259f0235df6d6f344fbb8a6b3f8473e619,b8eadf2eb3389bbceee03346ffd1fa9823e7ac5a1cd8e57462abad809b0078a3,b672f938bd46ea672ad907b22641fe590d182495f83d6d22fdf9debde01c014f57690ab5c35c5b335cd562da2535ddff66951971a2525ad160a26c43a0e4d4dc00,d0daab0359ee3d035d5c37f46079b93fde71754ec2a1b7bf49761d84de50e5d0026b51e03334220d7a0c552a488defbe5ba6b499553098e9b0064219c0c591ae00,7e22ef78de206d0f507952470cf0f32fb864fc063dd54c4ce5dc005794bd830e02285bbca5eccb00f76ede8e5700fece11de444b25f9f4f5b99bc2604baa20f000,ed0f69248fdb3334f08d0dbd8489e55b1ece6b4c57e98a3c108e13d559e5b02519fe7a2f4e8f0bd97650713ada9f22484e37c3e3c4f48ec0ffd970de116b517201,b0701f147e30cd6143cb8f318916ff68df39834199c90e815fce415ed6cd2be46b47d41fd65d9688774f3025167c5018cd2d11203aeba0585250eea57c11d79501 +4798e6f8e4311a8100331929afa8e21a6007a9932cc213263e68165feeb46dd973841d0540e40c73994f86e7b5f3da9718a7fa5ec4dfcf5afcee1f9d3b089c99df03092dd4ec31c1e3735a23871db2e3bcc9584e7af21d24c091dca5d5e58ae2671a921058a04f73a15936ed4327708f1f555f500c084dca263feebb76d1b6ad06a55b53589b73ff5e3327ee4fa915f12c35f3f694bc92b132ebed402d1f661081c442c4a5cf02ec3537bad69224f77f57e5133199f28fd8273ba51dfaf32b1e698d12936f1cd0e7b5ad9dc092adbe6c4d5521ca77dbf5bf884af959c0e006639218eb1ad700666331ae3117cb9cdc1be673d968,80cf044cc4e9e3d98387a067fefdd4ab57b72be97401db18e6fede43847f69dd,cb9eb78ec5d2afa85bb0fae90e87eaedd2ac27e16255c91f9e8e2ea108ac86f252c7f65011c919dce3132d753b42bd61fe5ca6d99fa23b21df256990b55f977800,6794144bb4d0b2e98c371b69bcd4558929196754c539a34e1b15e24c4254e0d4766ed6e7cca31d280e8b6b0a7bb3932cefb586ede9ba0e8725b0cc9d7f4e1ee100,550d708308d3f8f464b4eab4e238819801095f25e0f41efdc5edeaf54a2e5f5355960db76d8379900424a192f60d42213cdb795265613f42ab4dcaf9f0fcaec301,217d8830a2d61d1b81a06a0c1655b1bd09097402d1b04862b438d17e83f41482348a94f6a7b76358f70735d4762e84af308fbf00d8cbc8a8034e585b95c0e4ca01,902fa5fa7b2e16aee2f88e402b872010bdc15e6e60823351bc567efe0ea23cff0772df00e3fa1a62bd098255fa618c2f67be5db57e592fa9d742532ad8b4760101 +1d161c50865b14be41dbca010336192c4021a14ef0298d76d023868f65222b4233452c22a4d29455bc288d10de711a6ef2e4564eb0f3ef196b284f7f3e12fa5033f766ada2890df0a36fd5f421939a3e7df004998dd07bf22025a4551cbe0c14ca597a3ccff937de2b8fd739fc52aec8a7226f6a01e0e9b24a3672f8ee3bd3bc308ef6745cbc518b070f1edd6631dd22af250e555953377b1e3c40ee91cdafa545b0ededcd5aae6d496f36f6b4b09c6601f2d86b2880027ff330b54374edc9a30c09ead0158c1c04666ae98722d10260b1f1ecb55b16e8521773382e484129bde200b9762cf0c1bc91ccbd13a614584774641831,8dc7e873d969dafaec4cdb41d0852eb302493a8a567b24c5cc17488e8035fb60,542cd43f9e036ba636469259c77a78fd839967a92f395d4a521e26f18f70763c715117d55c9f5ea4c09fcd8fe45ed2bd85af414471e87fafc9dd02e95260319a01,88ae99b3e1b714a0e90ae47e20c5088e3aa6efea621be17655bac9f367446e56674f0646036e1a481f8986e53717d13bbb730a3bf0b8fa221344d3509321946901,714b9eb43e22249fcb3c86acfa0101653553fa19ab49f8d8799b2c58515d18c60850680515a391fd6cb1c695ff77cb0344536db5f5e0232c290da268f0a3be7500,71d6daa34014de575d407ce5e8b5b22fc13158879a549f5e21c08e56f575adf76b0a38bdf5601bf458c3eb9062487e9000e6eb0ccbb6ea911a227e7ff2f429f201,120ec4c933c06464448987c191206ac9325f29497a9dd22daf055c2536cd64116677986bef3ff3925c8254bdb4580654c34b351acc59ee6e776d03a5a101c11901 +3c240f9a458a1a11ca57acef18f51799684abfff369bf8b52cfabad5163f1b7ff2f482240777ec1d518cb5b1e12f0812a1b5eeca01836e70985ea843f106f4a2f637587518e85672dacc5c85ee04d6dcf02370a6babc6b4d5bf0096090e271ac6c6575f9fdad42f86153eb2c1f83742d1c1827bba0e14914999f919b6a7b13e95f3cc933d74101ec5e4b3334cb2a14da38802d8f7d5d1c55581e4ca972c7a9ad4905028e713cb59537a74f5ca0704a33d46d3451e700aae6503e74e90430924f7e579a8ff5540a892d264cc796d2063134c1f8d862fbb6a39fd9e7e9823137cbe010d03ed633edaa922be14efe2bf94ef0eb4c0d,98f28930a6fd8186f2f66e4e9f7c40136f24d56865b340fb6f7f4c1c11be88c5,9e88ba3374b5cfda6f131cbf65922e9be4fe3d4d1ab5555c653c10d18ca2b97b66ee5b1a391a6c4329ee312d353eddb2a637b6f07980ffd6757e49a31c5312cd00,9b559096f95ccbd7fc0654836c5552f0ce8ccabfee7c439b54d002ebcbbdaa7848b929c6f8077c3d310778bcc8e103cff52481bb9b4796ed814c552700d06e3101,5bb9d80f09435e1611391f04cecf589a24bad6efc6612da80657cd2b5249dd213c86f43c6c8d11f2d12732041254247707b1b17fe56d1920461f30bc1baffcb900,23a8f1f6413c01460431cdef5621a1bc6ac2b28cfca17609b01992a4fa1324c6636cace9cb321792ae2c41fad4e5e6ed7c5e1ea20a9623aee899008cede5270300,9c8c2fe64ae35796bed6226b65ef886ba5ccd23ccb571d68c1ec409df6d772fb579091e9bdabfa19f222646f8ef1435c567174fe54752a6bfb4e46e027c4f5ff00 +bb4fea9ed56f39ee911cb9b6ebb6a0cb9d7be21fdc96adaa64e3cf2b0d7183c3a0e049467732e8bd3f241bd15e2420d4f70b7849b62131c00186afe3b6bba4e816f9ad65d923d47fa4804976ecb70c778aadfe6a481c52d003ba4cfe88efd3d1c7e296608e406bd3e6d0fcf324ca96515a36048902f23db94a39cfc1a5ae47f56fd2902e6004a2449ba4e6bc73e17e25d9f0f2fe859042356bb9a07bf6969dafd5eb27d3fb58195e979340fd17f3eac6168860431d8cb32c99fe66c253dc76b3dc0748802440b807c6864d593b9fe15919ace59175aa47f0b3c7e66b8ea166c16c94e5bf92d91f84814ff4de14197dac769f0da0,58a2602b02807bdb6317749932be4cbc614a62868325f6059e518881e08151b2,10abf1e7dce369841e444fcab59b8198c863b3c9666b8063d4743f011e9af5e26bf3e4e633f9ed7dec18295902dd2bfdfa7523f2595e090bcf9a3a333688c8e401,f1cffab998a630be8bab1fc299ea82c8df5b09e9ed2ed810c4374fe11cc65c185dbdd2980186730c008ad84e335fff067b432b75f6526e8a1a1e72d1ce725bfc00,7005561c0a7cf4d3ac236811540838b7ab4d87e4e32774a876fdf0e0f85acb4604bf7a79967d5936dcfeb8787db043a0930c52f4b1e9209aafa1b8a8ef706ca600,1a765e5ebaf20c43047a0ad80ef15e3dd65c2f5680d60c67bcf940b9cc2d4e4842630b751c7432ef119c2c00ecb496f5e6d00837cebacd7cad54d3bc6a4a56f700,6dcd3435d3110e250894d059db3187e49620c55e20467d55b46ef8c0b35d0ee07e83ed36dc37a408cb9045de27a2b109c0457e79d0b955903bfedacadf80893d01 +eb300102dc914ef7dd8c57541b1675b7f4d8a0be2a8c4544faf9a7a68ab57d1daeab11693c0ede054a99d2399d7e3d9d96fbcd550424b2ccc2e3ea1e5608bff11f72eee300dfc65282bf09061b4c83f407b96623c0bcba0239c9fa5b40a2d6fda5b76f5d15e1e21543cdc7f9b839c57add3a4bebc75c89316fb6ec9a7c21cd087d7f08da0adc11ad731d56cc7af70de574001fc371f6c22eddb320ca434d02fcb240fe9aa0e83c621153cb1ba7f52e8f56fc63fe8bc5546c0580c41c044e6a6e2e52eba020f2bdfe9c40150e1051d6c9967a92beb9075a71f19d68172421b12c789b240e69cd2fbed6991974e55dc88c37b23a82,5974a5b6e3509a5c08311fca853def6595d16a29ec37672723e17f2fa6431070,9d78091ccb4c1275e464f94e693b92c7a68345c9e33cc4c7e66a69c01c4cf7826ba467ba07fd75742a42d695223cabc56b8e8e2650b2bc9a0b9fcef65630de7a00,621bb696e4561bda53c295eac39fdc9aa2a7d09980a46d4a60e34187a578a3cc5e8a1571fce4063c70b8c763e7a835d7956c8b9771a26e18e840c54b4a10100600,1a7bb2c6a0e1d97a856280023741ed892c67667c92ec4f3a935196d70cfe439917dc69c62da196d0d44dc480c8334cbd3834c1dd7bf8a3b7b443f28afb2d2ce500,e8710be125fec39125680dd5a4613b84cd3bf196709fb2e0c09e4c66dc4aea4a6bba6e4996c7e64b29f61dfe0e271fad66ff001252d3e874b9fa6ebfa0834d6b01,ffbb94d60d6ef984820efc8db88a645fa1175d34e83f1b5b977548b31d21a9ed563aaa2aa18e2a57d22a624650f325c7f42e40e1fc6ca156114d4abbfeacf6de01 +68b521c0c6d318909789cf323feacf72aaa8a5cf9e1cbb0d7fd486de635ff18de9c48bbb017bae42be6869059db47637f9d8b03315c46a077af9ed0c4f0df61e85ee9c82002494817daf1f5abee4dad6ef85b95b5ca44afbe52fed6fcbd82917e911f855deb5163ecd02755f1228e5b04f77426da937bb25c241fa66e86334f6c0281316a8a0c77b36fca0d6c3a7c349802433f74761d9bd820434929ac8feeab6e60db22d8aa27e01153a499f0cb1f00f19380442c449ae03ea8605185c3c220cf2c022adf62dcd92043b9828e0c73e15886028c4ad3a6c94c16d419455e77e28e902e9344d910fb44bd203b0774fb816d13afa42,45c6a1c600b472f03ee0ac450de242d0ba36aaff21293accd222300c7a5dda2b,0234eccb458162162ae0c3c546eb795f007631c7d0ab0146091317f6e3ed79864f80cffe88fa2b94e667c55a16ee30b32d046e30257e7b551b1f8d2eef58bf3300,ff1cb1f0e6fa53de1724c3aca981b8a919dcecf7eca08bcb97d305db94aaf4ec0720f8fe5d186734df4f7f06b316a69a488407814c9f652f67d7f22f8d9332a001,44c6c664bf467cdba0e4eb1256834aed56eb82d0063ec363faf9ddbdb1faaf9976f4a26676bb80431a8c2aa5a53d915058fbf1f1a43ce67e8b3bbb2a54d8804101,4a5b2ff39027a0cd0fe06355a78e03192b0d4bb578e12e04c250ed627723a19a07939bbedd8c48a7258ac96524f8d932dc5b30eb232ce96d678819c33d3ffb2d00,ae8da2bd58800556fddcde5a06eedc14f5149072c910de5499b5a1bc100473b83cf0606ebd6af9f36340380f990a728d52abb99ec31bc96f42dfcb1a8159073101 +18485cc4db69b09e5db1cab77df6fddabc1af0133aa7e87c0ac9d2f9293da31071835743a170785699dfdff586480b8697caf5bde137129b884cbd4bf9ec5ea39862212ab49920f8f56da9c410a02ac50a1ba08e4d84aafcf356863e96d5498434d3cffef04fc84ff6a1d0c501bd3fc7b405673d915f72e397e0c92de51643c7a0c5560a0db64d38ad4fb470cb386a54a99460188f00c394abe9b09f7a2f7c19c9427297a39102c0f75b57c56055d4dc1a906c6e4ac5996bd560a5c08eed9b2ea74e14dde56c2a960cf8d67b84117601ffbb405e235469bdb295b470dfd481d85700c7ba77ff4a14123865cb8b11cf33e629b21576,a11c96109d50816a2558ef829d861f5c1454516b83c0097ee19acdf2f1814f39,a5e607cc3b201c187f61a3888b6e30455067c86e6cd77b535a1afffbf424e25b42a04db77a30d15481959dfb1efc091bcad68127b644374603679d8e09c701bc01,5de98d127cc150e355168cb56d9760b5b29e966efee2a2e984ec52a47d23a6d5777adffcc2919710c6d7d44e48fc5c1ba62011925af4db47afc899c0c569870e00,9b9b602c404faf6d5e736c82d2e63126b29b4a50ce84b32639b9522c8cdda12f1326dfb29889bffc25f6845ecb315dee08aee49f27a42656e5918af20ffdac2e01,83e261cd5ebbde390353f450a83dc4608d74bf751250ac7f46fdf29e60f25ae702b016283d5a8c025fe2cb07b73aaa847731eb138ab6d54f5aa517f6ead6203900,c6c0ba658871a6a076edf38f4a2d5311bab51c490e63336fcee695cc86b4a60170bb6d3ace0857af4a99f90ff9dc9dcde068452d1653f19fe70dbef30ebbd54200 +38fb57ff2dfb8f04d0fe26705fab5273a046456ee18ca0cab7092a9ee2e7598ddeb4ae3fc15434ec6af2ea9e94c6a89d1c99c0a0027d97a3782af41063e5cf0ba332d342ddb8168b8dc30265e679530199a1496298f8bf44cab222148aef6f4e2d2b955e5675c4dd72133574ef671af80683640cdbf01e694d0e1f533e79be43affdeba2c65b58f149861c0fe2fb469a4233ab46d3fccd0bdaaa000824c6f87a19a5f48eb5dcc2a3aab5f2ebf162e39e3ae10f968ccbe6982a31b9006692ea50b70df3f1d25def9757e6e663cdd8bd79e9096a58ec69910dd03de393b53e0bf4f204e107f5fa56d6d1269cc87eb3edb97a45209359,2709470559ec5ce9f6146a9984801a21bdbcbddec4da9ccc62299d2fe4233d21,7831efad77dfcd1d36a7a9ba16529f747013297195115b00ebb296a8fa921f1209bc0a8154b53d68311421c81cae3e960bd85eeb5b46065576a356522e098a8c01,0547de49147be054f95e7d1147bb88e486b32845b9c332b08fe8b7dfdfcab8f322b312618b5bb774b0c78c873b303fcf7026729671a3731b133908dcc578e3a201,6402bf909fc1c6d98645f21537d27ee0ed89b5a5929a3f5f39f20c426150c75b6728baef69b88052913fb5ff0019e9d7639d52365ad7fbf17bf3aaa73a3ced4401,37abaf4dbdf75a532074f9c63e318d6907d87479119c77b6f6da979b6fd5b9f32f8e21b06602690ab6a07d31d4aeb488eab9eeaa61a2af6f399fc2ed1ae1a5fd01,686cbeb5f00a1aca75ee60cb30a08ae49bf49a340c7d3e32ccf698902e6c253201344304a9538532641b883a491d116d885b66c96c50c199a62e24d14ddc201001 +09b8be7610cf4368523fbaff513352167a5191d936490f784bb6641593a14fb0e93b12ced0144ca35e9c3925b72b764442a32acbadafbc6600d6f9504e001f32552bb95174f747def17ceda02fa6e61c6660955731a6d4b7447ed0259ef552c3c64f4741af1e7a9ffe0384a90dbbf3841817c313a8d35600260052e370ae36b6fefc56da0657ff410ee51b94ff17054a6a77e6d61e3bfb8e3c6f000bd519cd36418d14e6cec32950d83f94966ce634f8e65fef3dd121261898c059043dbf23725e76fb5f248afb8a9a0199b62fa40e4482360b1967757ba4105dcf83021a57a80d89f924fcaab3ec64cd9abcc2467256cf3f9ba61c,fb8bcae062c794c644c35a7754d84cda215b4913f843ca77f1c354db62171829,a54e2a23716b26033df900b83e51178cdca4e9dcbe3465d837c5c47460a0f01d0b8fe2f00dec19a757d624d257e6834035ac00c65e2a460b979f1289ff8c178700,fa49603acddc6de1c96a725c2779cb9f7c5ecc0290a16e6b96e71e3d26eadc91207fb1c15847d79110c5c90906f98e9bf5f2ae66619a211dc4a551a4a8cdd47b01,6eb9d472e0617dd00ca42f2358ada457a45d1eeae88e51e651e40dbd351707c964782ad2df08078a31feb18cbcc026ea1e591948d788b53996f2ee24120a65bd01,b9c538e868cd26a03dffdfc395d8ebcc4b0253a50902d9ccc1734481364fe86d34266f8f39e0ae2e2f867a626ef3ba00c50972dea9256ed6278f8d91ee9499b500,c89c6296d1fa71c30ffcd1789da0ead4ef831b1de32f475e569ca1a28e5a0dba6a757351006cdb814ff0f6e9a8d91f3db6617788e8d4e708e78cb940d66ee96d01 +d2b12680f4df5ee31fbe155be1ad945b27a8ec3a98c3b86ecf8ef6cc548c54a697b724817e082b9e8342c13df55b24e764e5ac5ccbdd17c295cdf5bb08702563b113a02d482f7c248ddd9c6204847093e06677e9cda087cadfe5003c6153911378c48722a22687607a1c734702c2282d71f3a17ac6ce1eecdfcec257abc056122f23fdfd1f97cd23372dd36cc314c978b938ce8421fee5879987514be5d14a1b407f095e4d3ec810ed5b604338d9d5dbf5bcb3f10d7086e5dd61f7a15523d5a8741e1ed85957fd8840130096b0ecd49b5f8f2f5b2886686399fcd0d2ce346685e9443f609108b448c623966e2bdf12d0700e6b22f6,2c63deefe0fb7ea3911ad97c32b258a417293a9b092edb1e49dbaaa7c258ce85,9f6e565add6ea2c1469c175c74e02f0e6289fae57ca6c7aa61f78e5b0974c2c66ea5c1d7ed10d9a6181049ee977b635b69887aaa2d5d4bfb8968cfa4ef08b84300,c82796ca577553fdb8419e925edacd175824aec2aaecd58dd0bf00ca7c6f896b48e6ae6529280e6023f2b1f0b53977b1ce714fbe873876d5c3f814100efe48fb00,643cb0aa31ba84bac17c0e2c7451010a43af094328317bb045c5b3c157921e206f28f0705201f81e2dc1d825f47ed698ea6af6d73d7f47422252df0ec96e12c000,5ec2d8cfcd82692977f5ef6026d878c9d9c92e2ebe8d595ca17f65744183dc3e4d5e91e44bc88a3733935586a8108d2a93882ffb48aa1792610a2d95e9f373cb00,0f2f9b5dcddeacf71c907fba46b63c17d7bbed3e29151c295bc7504ed3adbc99472527a41bb479f39541375399bf3342888e1a9a64f868ae2bda539c53f83c3e01 +ea2f6891d125155555b10240a25361b79af8160cf30c012305e8b46e48773aa6c751e2ffc03a5da1bfd6a1472105b40fd9924e55046cd9eb3aacebbff1d0b11d0c4f3d7e00caefdb5200d9675e406f7fa53c6cd71dd239e38f9f3066bceae86144cb22a68329e3e4f307b5bde4713ff3ef7b0c7c86cd56dfd4e8ec5f7cb6d17280d86d2a75dc20a632b79f882c1bf537c217bcdc01536f8fa7761deb7c39ae8ac41040ab591a97f5020b32ac4b7e6415606480ecbaa49e0fa028ad61893cb8748cb6ee83498454332fc786531db0a68a65155fd6ab400a9cd6d50fc3d4cf1d35692d689f49159af5905c895620ab2db66df76d8a7d,adcea09b2a99ff1baa8aaca01eb9d9c08281a61c6a988915364e3db8078abfec,07c646bc997d02e93dac23018c3aae3c83e789eafe14c8304952c625d1da31cc196e49ca30546e249a097c522bbd66c659c018ad6aaca0373c17e341ed4e560b01,a03a6057b2c232a0dd7792c25202103c92105573f7b7aff318d25d84fc9fa37f7dd2b6696c1df41ef00ba6d0e68e83cb19e39885c5977d3e0cf2d181cfae970701,ea1f7315341003f538191fdf8058d93c3ce0a690fd3d75ea0fcc0b90866100c060a5941ee41fc51bc2a3308db5509cf7d9772fa0e4f8d0b496102fda454e7b2a00,4c0f518eb6c96ecf0f6f469aaba49ce8810ad0bbb8ecf201ce2be247f0dbd4153860b2eeae0feb19b770ed33f9c858e1cb6666b35f74f8cd2211c94749892b0901,ed16a8e954edb4ad7f158d0431848740c09be14bae40ba9297025559c75c582d0875c03a60b8ff8fe870723eb27f4a28d883e6855e43198c4030c05f71c21c9001 +6fdbf37f1d9a8c6da7f0abb59bc7ca41184fcf931c50bf372feb133f64474def4756460683f13c56caa267fcaf466867643efbe53bafbe2df8eb8397178bd978b1f3f491c1b4058c920b60144ef57563ac2cf24e2570bab89f27c86e66ab6eecdc95b338f4b0e5d686ddd1b5601d8b77b9628b8f8d0cab769484bba24111442368c18889bc7fd14f0504e88c35763a930b5a0246567a6fcf5294ed157654ce14ac1796d1d064fb089edf1e819f431ea8828ec95201f27f69354a99aa19f67e2cdc50bf10df3814bdb2ffc7cf3b0e4c7f04d8372e941487573528de4fc4cee7ea82dbb0859301dcd6bd313cc88d5208dce957237761,d36da99fe1f3a3fcd97d4e850469291b876dbc1e7b410ba4dd889bbfa06becd3,ff0c78de8b24105a157dcdbff5b4d35bc145a590ef80db016eaf7ab2be496b32446a376c8be52784e1afd9393793c398cad8730096005c5b43ce0bafab4b09c500,13f85b30b393d4e25f526a712ff75eb71bf6ec7f3148904f628b179e8210a35f5123241b8ac89eb98b6f2c5a07f074aea52f20f4a0d286f3442402dfbefb17ad00,21bc74e50f1d35a772fd86e0c855c45fed649f7c1829465bb9d35e522009329e2aedfd2d3686528940655914fa637f9feb9c256b60a187d2c9686dfde6eeff3900,028a51debbb8e639b143d1107c38dfa63f7000ddc7cf3bebe1bf796c3d9ed7960872cc36fa493fdb74d8957fa88e0bfc9a9dd572f7ab1c413c4b09140e97c70000,f8e642571cbcdd986771914555f3d1666c8cb714d76802b2221b400be4ac32355b53b86322e778d20dbc2f97deaed580f88ecc1488891e2e4a06dc414eca966500 +93aa6cdf83576a7a578aaf6ed03d58711f42e87f6e262021bbe4760be79c1c180b0e13e43aec481b561463232e5adf793ae8f7c2cbd42fd64b83943dee4ff27fa4f756220a5a5355b45f06fe5407f5947f90d28d6a4129775e3a224488b19dd985384a86699db8e5cc89e000ea0a0182cc8317b459bd81599f76678e4873f92a775420f13b79cf6816919aeef8cd5ca073cedc52ec8488458c5a5eb2068459fc120464d157d7f5019aadf2e98bf1d998982da11b5f5edc206f819a19a6c3455046c0820b12e19eba15facfbaa0cc2f5d1f54ac7ef99c80f4b526f906444abc81fc5a4c2b01d2a8efba70825aae9415d07b4de88f3f,55d1f93503b46e538e5d9c4b070eeeca773bd106c7f6b7cf8ef19338269f09ad,c72d16ea89dd6c69c3e62ccf028f41081405380562dfe6ba67ab9769a40008917bc0616ebc7b0d1fef6654419937033cf92eefe15b96e9dfc6f38595bd2e340f01,60d38feaaeb286cd899d838bb106dec9619d6715e277e18d883d80eaea6c98ef5636b9fd8b5abac074ddae35a99cc3c28fdfd88a4df77bcd1ac0a747f239277401,afa5e55d87a458d864aa3439dc6ac69a0f33c7f3c741cc08315c395bf698e6c4013207af38bbd9b22279a276c3087fefabb921bac568f943d1edfabb3980946001,4ac82b12f5043ff0c4264c7e2c149c7884b96d8e2fabe29c13b2f7b6a4670bed1d7fecbeecc4b6dcc9d4246c3a1dba367a897c67b9d4e9e3b79c814d11aa6c5b00,5112664536993b0b2915849d48418887bb5c36606919bb2ed91585becf0f951560f40b53817f9dae46663bd7c6a3b9dd68f518dce27dde5d36aee7f0afd0720f01 +646a2199d6940191f95f1c49afd76e0b2ad0a66c65a36b964ca9fe3dff70f04e1f14283367e69fa944a8ddabaf37119461e562e78556c695d5d995e062b116de5aa6cfc44f8f5295fa5c86ec96710fa00719cf5d3f5278b42206458ce12475060fe13157891bf7ee79db2c3ab855b60e3d03bae4fa5e96eec5bdc1e3ef6dc0fc72ad8d18d0d659331cb975004a6b98823303fd6e5e0c3af7c5c61306f69757f1bb836f56fea2c2d85d8a4f3481d02f724c9791ce0be5c7a36bd403f4d2c28bea1af1bbcb415ed53a972769115957683fd983c675664d9ab48be0573e661064103b9094c2ce8fc66cfedc7f85fa5d21d371bbdd3828,ad11129b4c5917c1f104ec6ae611bdd870162324c894a35cbd24b418328d6919,3d9e1627e474ffadccc40c438868dc52618ed40a82084953b7245534b04bb54a49d27dea19b5de63e35e84d50710c032f8218182dca3f791df963bc505c3080500,1a969f6864c6ccde99859c4141110f78669cdd64f59f354124f277c2f262b809685cb9a35bb62272cf48b4198d39e88dcb83be846801475de8fe3ff12c2b9aaf01,9277310853a9b1a039cfbcfabb26535d637a17cf52d90787d2afabf3da5286d142dfb3cbd38cf72edb788794532a45d9814b2cf7ab04b5253d8864a66c931fca01,e9fb314d169cd32b35e1397da89c605f5c9955f0e139d4467f43df4d153d251a04ff8c08a6c3c3dc7173d7460df1c06e7f74db6bcf58b9cffa87058645b10a2601,557cbba172105faa0392c58e601208a6e87ee30c3bdf59e3fe8052a8f66643315622fee77784ef53ce67ebfd5ac39093710d63f3a59eecbea92a858ae2c3864201 +0f6afdce533afb4c403c7447142cffc964913535f05da1bb4fe946ee84a97893ff82558500f8359f70b5cd2c6f722bc0740cea3f5297f401154bb5b551a558f49e01b1dde344b34039aa790e584e80b90e3659547fe2eb2ca7bed256756ef3579c670ae336633e22ca2ecc0627e3b5d8712cb4b93e7485523c7a867a660b368e903c5cee04255f3793a64317d471261d182fb7fd77d0c0581e08f76d3e06207b664d3755f1ff2efafa1aac07a2bf51d4192adef2536d864dbf359aa62402a1db7c5d8d67d014fdd1da19ab3eb5526045aac392e99cf54725664937d963a6a015c025ffc6eab685d74f02250b73ebccf3d84a4e94ef,87bc214308e823a78af234060bd5de145348d4dbd3b3d7b804266d56dc65cf50,cc6a2da4a00861693faade7a775647395877f94c0c49257af0676302f59fe8412f19c1f43771f175ac00da47625e440b31d850481d2523fb7f5eafa7673d5ded01,74b5c717ef44bcf47737076ef815ce8a5bae00d7dd79e99b36a7177586327dbc5dafe6988d99086245c220ddac40aa069189f1dbb0ee37546a171643d01c69c700,5f40adf9dcc2798fee092db00a6f9d1e94a3a6300049e28cee979d91b4d1ae2367e0e0286ffd2968046c9db12585a769a10a8d638ad9c14de26bb822e085d81901,e57717ae0013805ba05272aca4d86476f4d65aa6f85328ceaac9f0f021b4a38717c421e6933e89348f799979b6ca43570752e41dc9a524628522cdd3a4debb2500,48421b16a1a80bfd4f0dc75a8e8353550328260834e9f3c342c1cbb50558c83f5670831f456c2e7c6cd08f89e74fb937f29fc363966a71ec44eedf9ec34738d401 +1ca8571608fdea4a18479c869a6e7ecd636a7f44a1979731897ee89ee78bcf79d104693d805ffa86d89a7d452c6a6e52def9656e3ab1075e82e0d73f844d9e7cc11f74009028b2ca41386238bdb8deac1c017b9973fa4d148d4e5558d2712cdb4dee975abff3de3f321f05928c2e221a8123e6b2f776d644cdc74dd9ec9003d071284deec538f9eb0c86536dc06f3f21d0628fd335a86400835414219576fe4f2e8f5f5be1b6aa986ba7a754ffa4fd03dfdd564213bb18351716e1c6766e3bf93a909ce224324b14895fc634dce585d3b4ff246c8c40ad9f026d020c4298d9e988994a93cdce17a35118604ab64b3835f11010b3a747,6955dc713e42e9bca293cf4b7ff3dfaaccba8ab29f48176a556fc86a53221674,efc3b27dbed762207a114fe42c55a2125dafdbdebdad7634e77e1a0f386737ad640bbb0193cbe7f06f73b28ac53f4c9c00f9cbaaa0a7e78df79700c1519de72301,6088cd0176c16c134e9574cbfdc516c6dd514a3b3f02f506ede3cf0f5d30d5517e7088532aca0e009893f8cc9fd421b531fb21c8a09464dc71a59c629c2f12a301,7419ecf20d17f8fedcc5a19052dcf0731620e9eeb8520ace4d29b072b75d484a5f7bfaa6f715711fccb61e22c9cd42c78eda37bfd39e1a66eccfdf04c2ecd1cc01,ec5a8d82392ded0a0daf93879be24330d7d6be800de156801e2834300eebaaa94ccd6aa95d31343e09d297e0840688f30721ff3a87d2a5b83cde062d33b4569601,dc8de48a1ae9936e16d4333f8ebde9147e5773657a8aadec0365872980365dac7824984c99180a8f91998924ea51ee587262adc2a04802222eb3863ab3f0c93101 +e5464d3795815593211096b4b58b1e72818cf7c63a023e6fed22b1609e4ddccfaf254e26a58d26dc22eb0ba423e0cd0098c242cb939ca78c53319ec7a20eb6bbe0aa9f70ee501b109dd0cf18b3d18c34622d00f0e3efd17093b64b527f45bc877e5305664b21064a9cd09d812c591c549073d9c7fe4ac0ae5b4e0eea567b30c4f8f361bdd48fec0dadba1cc238b42486eff63912c68a9a14081963afdaf8ed118d2bc575ce163dd48c10f2c34fd2d55ac8f1513135175c7b3c3f5292ef56a25ef2339ba598c1a92245cb6514483b40622c17b03cbed507048f54c45be7c2c427a3911850f15e84f29a1ebbcd70dad73578e138610778,da56e36edae6c1b8b6d22a191ca9a35344e9f151dbd52a3c6a87410d0a6639f9,90e47ec267c07bb4c9e90bfd5626c87a5d07e10ce7a04ad5c896bff330afc0d94b41464039db4b97d01824051f92c2fa8bc82cec30ba185d77190434867372bb00,e7a44161bc3b55a7de62a36065eeb034a47d5045455a93d1f9acc631a178e4fd777b9abf572a2b11b8da5761729dc695eef7cf7100011406bbdfd1241ca25a5101,d1dd3826b0ceb2bd4efc7888d14bdffff46e8c55366c4411f9f32050cef0b3734f9ed8aed1bf8332380c5f9fca84aba6568635ec8783d82da5f08c4baab632ca01,a43ab64a2a96f76ed59be9fca9dbd6356861c46bbd5e1ebaf5827767e757a61a1d8ff84ce7c86812b0c0e61e057585b46783c024f0041e7da005893e9553b13700,5783a29dd9a278e79e48df67404d1f7d8feafa6b354642fce6291d73744805331fd391a49cb52a1f4cc1d57eb9f02c8890566ac5024a5cbdbdb2761cfef0253701 +804a9e2fae55d717a3e2162dffa92863fe5d09a586a00c7a0327fd801767380fb67c6d94574369eb0f8a63ac138f1049ef5dc7e8b8d7be0a6d12b27f7b731d9bb528ba51a8a7d47d7c62ead1553ea8e496c480aa75097eb430612fb7a0991613aa96046682a3ebc3d3c3928f1da8015b6b04cd3cebb311f9c294f7caa36dc4a23e5fe77fe781692653d90d6b8fbcf1ee0b77bb41215a9f9eadc7be5af2f2130d84bec4c5fec05003f3dbc6ba807e24d3e2bdcd7ca0e065bb55fd3cd4449815b9630ae2614015604a7868446a0373be71ec4251785d202a6c18aed739f9c3d98afe05e92d00914fbc391c72c62026450ebb1d5d7027a4,e685a7a10ab0724d08083e58d104ca76e2d06a5ca275a6f4604decec3bd7c374,b0632cb9158a9b7ba8a3f0dbf36c3a262b454d50321177c0c427e0ca735e5fb44657a8164758971d310430efd17b33fbb0a945d898d253a34298b8afcc5f91b801,ef013e817a9ee847b449ed683828b50868c6af37d681611268dd86a039b3aa9368aa533237c09391d86029e8952b79cd5d38aec5a757452055e4b98bf245b54b01,b35039a28392c25926f07d6cab3854e4a040a1c6f5c16f775e50beb051ab73cf29d321532134597ce267ae99e2f61e07141db8e08e5dde8c59d08e6c736e6d5e00,69d4c2b19f36970c41e2b39f9f2312c97234a13fde8452865999df7d983e5ec30730929f500fadd8be1b7a1b61bc17126cf89277453c4bedec505780dab050e901,19b7f1d0ee9f73c97e5805ca2e5bd070576e464e2d1244d3e2a35775d6de47e72c14e14c2a2314be0916add758122b3b74b39d78d9628040e560a60ff0e6c12801 +6918508b9b3308968131dd7fd2f8a40b3b419fb7c2209878ef0cf74c62bc9abc809313fc587ed3231bdc1194e1ce7d075b50d1086dfd5122569b53b68f840ba725d1722e36fa4cea1849cb5f9e9ab2ed7f95fc3d77091076723076f9f0fb702e183ee93baed92717c5b9ee8a596e7a8cea1f71525a1a7c6159e2e60f1cd9ae999e3aa0e1ff8b339512a0590a6e246843fc9dbd99cd88532613bf0246864d383e0e935711a995fa7100336a51162a08360515d013f6bb5bc87dbdbf127a140fb76940e4adc6b131caf9dbbcbb960424c52add6b08e81d23fe53da785d3bf67d59c89016801f05d0f57a1a16d340971c811443bceab81a,928b9122cb874a9820aa629fb92556d9553402f6995f322475f6766ddcd34957,7d8a06041e4e39d32a5db05f98d98698baefa007d3df89f854f267fd61c16a93759afc347b3318797d80288ddf6c9ea69efaebd7c696ce32fba9d807bca91d7d00,8279597657bcac2075946044ddba7b0fecded75371667f505557ea74cbe0288278c96cb400a8fe6f9f415b4b57801a5c1ab57d4c4cd39f2df6f9b680d516209800,a4dd953567c8afe27f926cd0c77b4a474499c4b36e95b6e26c81d11fcff7ecda3a32149cecf716021c0d596499ea1d9a450805652d26eac25ebd2ab250c04bb700,e3d508bd7eaeb2a94c3d50ae677be1e0edb6997996ab866c8d67708c3402ea335f581baa9e7171fbafbe75fd7d610c777a1c217e6fc38eb039b70288367ad2a600,04ad227ffa1377564fa0ae3e9c2dcdf7b5dabecb233237b22cf1d115a1c9743833005c611ad1b631e86feb428fb51573e939a1f300e2ae3d3d11be50d4ea758101 +09d2ae383163d9e5a8f7ce24b1d3b8620bd5ef0d5a8f1e52877afb02f5c22edc1db645080c0b4c6e4ba7ded097ce38df9308e0758494041ecb07fb21926e11ae1732440c61365fef5d313058706fbf0463ed42d81a4d61161371702625301920be05a07ba6eb47e6a6637d98203da8a564a30e117daa59571226067d7860f68faf1503877b8442bdb67bb15796965f7ee26988648bd27790e4a59aaedb0775de5b259e4358512e06392fe344c3867898e7567c707ffbde25c5ff9d6cb2a082790f00af8e225ab93557dbae9221975eb7f377307d6cc467e96e9e388f4d48a93e5674643ef4c9b5db7deae6127994cd4656a42a685fdb,ddf7f48486615a4bf82187d107727fb26da26ebd48d341bad0b8c682969d4274,7ba539519fbced6eb56ad605c034eeed374fa6728fcb9b88b4db60cf9d26cdb17a2c10884f3035b0423423cb4314aae7da1d236cfff27272d303ffeb32adb02100,c04d6c155ccc42a302c68d8548fef5afca976b6f0874310b1f0ad301601f5c3e3cd8e674a5a6516cc57159f00e34deb9ecfb7cdc95106566ecc1536eada09b3000,8f59c640538a838bcca9ff5405732c74e43aa139570586e8f9debdc7419ec9be01b916fdd8f3c29b5a9b70ad77fb246ca2c2be14dd235e39242632585c1116bc00,75a16f4a67a0b35700f35a7a3bb11334eacb9d0f8e173cdfafce70b381474ca464b6bc3474eb9a8f05d606f0406944f8bce82dd959de0fbfa0aa79b1b3ffb01500,8c6e022652e10a0330fa5b8d49ca10b5259b41dbb2eb6a779cfd71cd613731df69aa225577c40e196a02d3488876cfcebf9fb3e825136af10995c280d07c3a9201 +d621c3a5c91a6ab879ec152923056db3df2e0d8824d31e273b35dbe89aa75c4b94de7c6c586ae271a73abc4ab9f585392daa4baa5cb45495176b769a8883cbfa1a2ba05a9c8783c1ead555178982feca0edfcdc164fd4ef5e29f78b34a93ca6ef5c64e693c7a4b3800ea043328b878a34f8d2d8866fc8f2d1794bca17ea52a20cc7f716dac47bd31cfbaed22050071eb04308659b08684ce7bf3716be1e3de5d4e91614c6a9bac1540acea5a8ac7c5d72c66372b02e57744151837a8601cfc3e406b51a0965e915acb5997adc1e7bb25ffb37d456912b4fb74b281372600f430b56e0a05448526f47a6c0f7a2e6e341b40023efa4716,085e4e41a24f93aea2b1d2d0e34394b0eb918226befc94be57068d18a66dab9a,67dfa8c17aa1616d9eaff10c9633a9a3c8bf9de5dcc6a97f142e0f5403fb782b18f6081a1ed966580dca9a2f5c0cd2eaab90fe62ceabdbd208d12a2006f7cb2000,27f1c3e1e358671e9d24644a26350d2b9e8ec8aed2c08b2582b254a11376aea616b698d6938372286c45f6da8b470b2d0dc31191ab68a7b784929db50bfedc8a01,93b06e29f02de61934ada264523645cfa1ae35d137ba847d51e46ae247ab2a8651d2f5907145865f41ec3a0797d5b9c6e99960f9633c4860af3079059829910301,92aa78be9865ea3dfe3f4752af17ca6c0020d2158278368dc3b189b9e0a51a0a146e6437ddbdbee668b244ac20bfdc3de3926084b8ca289d3d61049331cadab300,653e99bee89a756e8b380f0a14ca253e629e7bc47477008c7d665dfe0ec44f670dedc55a3bff2fa83822705b0a2ead04348e0231d7e04a2b604a7fa048cae4f400 +46e255e0cdeff911c4cf82c6ce3817270e12e73f32ddb8ecf2f5229f265d1a32411f0dbe4be32edb04ae921b0c88a5db80f79e9303f566425a7fb36ea31d9dfc22bd3b20ce86e4a5ce242ee99ce3a56714087f8792d563641b18df4cd4b77c26ee4962b6876186df9b4b6caf704fb488eee93a3a8cf0f784c8a6a7e6777c5de222c4b043a8a85d05e93ab14b14c7175185c9d3f9235cdd07ffaa2e9d30c77560a08f00d00ec8e47b00f5f55c864ad3f3a026179bafe7cc1ad77a01ba00fd46ad1ccdd2b46310d8a8b52f5037f15019365c99b7b4ab1b53cee8716c762647fb72d11848f4e55a9d734da37f01393413a037fdd6c1c1c8,55cd0f5f7a498936ba1f25ca5835e82fb29082c4b6df7c9250ecf7809ef9f36b,94b49a7652edd1d68db10f023ea5f08fcdc35e4bc1d895d9e59ad3725284cbd704a557da751d1c2d502873dafe09a3f9c30ea676c3741f47231e3cd55123aaf900,62224a9b50bd5b0848f468b059f04c7eba96a1b74e24b5adbf3d4650f1d7535e48cb6e322a360a4f10883bd4fc85acfe6ba1b8d976dcea0e3cc37ca2c3dde5aa00,917a30593c9afd139f4bd674a635cec792c03ff5baa21d6abf97868bfa2e990726343888f2dacd4dfa7f8d63890fb9bbde35751437da59b1350e7bb38cfd173400,85a706481f41f7b2445fe0309a3be1953652df337952c5e98d01d5c6a39d7ce84c247d71a875078a81254defb2f7e0ac73142514b32f9b53ba585b04de856dde01,fcb2c93bb0d7ba67d8f631b65392bf16105ddddb751def88325bfe3320da09b90ece4d199f63d4de4fccd845c6ce73278e2dd7250b2bff1534e6fa98a026694701 +37cc6728337d712a7af48fcd4cb0dd3664e99e70aead086907d94d738499e664e1a952437e31947397fb158c43595cfe1fa4547113d40e872662721107800a342f28db043572f6404a3d14f920ff2b4bce5688c00fac13b6040c9b24d45ff2984fd4da5ad9c2ee0b061a19918e3b6e16bbc31070dc3c33e1f956cd2756f013427ebe6d1b2846188268548a03ae5ef4ad292111653cbb171462e2f1630b84df3ab28884ffa1e7fe9e4d65131514101b398db58911eed86e300c768e8a14b6bd56ce12dbc13b49634682c211d1eb4ebd8a4432ea0bc5a8eb11d69c9fc76c58c84b62f2b47d7c5447441a35057dd752d3693fb3d48b49bd,97e6cd256626a01051ada6b855856f2744f17e9b45e33a6ee553d0521674528b,bbb11cf70c72b5550e7305412f5cd5e5d941f43e6092bc465611baca3256ea7646694bd6ec97f01edc807c99431d7b979eb8d2a645a930fc97146fd53edc3a3c01,58127275274cef2ab37aba12d5b81923c30234b3d70ca7081de7c083b182c8260d10c953c8149e98a49f3c27f7a286e65076bf958f95e3514f40aa87ec17af5900,c0149d0d5f0e84648995a17bec32cfb193243661b1d5ed3738d5dbcb65e97fc56cdad2a954806ce099794224257d3b4188824163ba75b94384141d36f61aa6ed00,8741e4975128bc41ca81ad1c4e301df381f487a3025e7715a46c05cabc45594422feb0758559d234856c8c28af6ae888a40efdf6c5a6072f6e753e2986bffd5c00,7a9ce1e04b10b9a07f29c3160ec615fefc4541cfc67f3140e5fbb4a9aff7783e4e992fdace87f096a228886fa7b890e045cc6988c498a73b114137774ffb2c3401 +0137d940e5844fda644b2571f30ee7f78670740ee054fe26f8fc7ce9a1ba112aca2b27d54520de12320831440d34f1377767efc57a77214ce7a171f103312b96be542084abca7d2b3da450297c580921df2b300dd445affd3294bbef2b76deb0706147d1801a128446f45a29af23106e93a0d799923c331e1f9b6a8e2b846b443b0a80d6c1a2a8283653c0376ce16ccce9780fabbf6541e63cd8f5c2e6a9f9a6dc19b7d6b017a5605f7b06da8c5f259596426030ad2a6828985aa9342c85b2c8a7b7d1a8e389355ec97a48c7de58fa19fda51f365a25d7707d8a851238cf9b476a856a0d3ae9e4224c0b15553113692a9e602378e35f,1fd51dbb98191b4c101d2d4e2a09ef1dbbde9ac20effa20c1e3975f1a8861afb,deb3960199efd3471827c23c9439a9ba8ee6d5dc6ad6dcd960d72717f7e4a84042bca29ef9fc7f81a11a7a8ed33be80944ad00040dfa525bcc01c4a697ea904201,5687783ae8d9142d375b040ab79c74c309dddcbd8421af255842014cdc41c574360b1d100f5932aeee1a2505cbaa2d1dad4920134d24b6da833b1597981e78d300,af0b9c600373fe481ebeaa6a94856f493a8d256f01e80a154166099c987fa0f439d4b33efc1be86238b66d6299478acce94a47fa9c44f912bf0ecc8818a923b200,94fde2eeb98e609db4ae4b30d29b49905271899bfacceeab5f7a4bf4957c76e76129b455f402a7621dd907730e557d162c5f58de348f4242789567a82c7ad44001,00539d7c47b3c1a9012c07433c7f7a13fb51409fe0e731a494acbf2c9488bde45513a8173bf81be9548cc431b41cbc61ef95fa22f80a40d1856ce7a5c4ccab4301 +36637ec02b51619f01dafbcb8b49844536e5b7e02527d9f03ee889308bf4b463ee2b49012bdcd00c8710d4331b9bba5b202d6a58a9c7a7713201cbc998ff28372eb484a7b51fb498caa33d0b83492a72ae0e096f01544c450c03580786a6467473c7a9e6ee3146caae33714c8a0ae134b8b4179a0db4651527dbb451c01e3338cfb52f10727ce117e6560533afdb9464051d9cdc85a02f6dc22e95a35b8258ccf64b99aa983c75ed991f1ea0e919f58f8282f25e44bd7a09c643a98193db9d994372d5e55c79c59de844e6aa84ce22621b99e26d13c6ed5cd2a9ef9c2ac598e4dcd985e6b17c8d3f63b94dca6bc8dadce479ea0e1a02,33a84dde1d6ed104c6e87444b38231dc372ef0165cbcffa3cea00dec27067e43,a3f52a59ad69bf155fcdcd04860834af40662949476160ed92c4f0a9f7a075d53896f53f232359acb80ba56d052201606aa084e14df025e87439a5755ee609cb01,a656cd3b8504aef6e6280d667ed305d6241bfc50f79cd00fdffdad05f4a171692faa93c798fe773a2264ead383ab09383afd45edd3429e76f5cca603a4bffa5601,20d3fa9b1b66c65dc051d2cf3755c392d2791d77785e9f5cafe95887aa2425097941a88faff59f1ab7784deff55ce4fbf2573b45030a32951c36a1cec74aefee00,528a7a14a08e1a0352d28cb8ee03c7aba42982de9596a031d6217efe2639e2204ac25bf0a1dda5f9a67638cab3403ca7bfe9ef5031ff95a41bdaf2a2ee2a4d9701,0dd2c8bec4b00cc2d31900928139639492eb077d3ff79942ee5a10c97ad0af541d570b8e5d9f5382b0fe7db612afd08dca0396c0a2bc55bf22fecb83627965ac01 +c347940fd1e23b65aaf1879a35e4cdeac4e99b42e14440ba60c01d2a4254eef1695835ebcf610184bebb46490bf4218e37c57cd83703119c1f35456ff59414fe1304910c72e29f9142f95d11ef90debb37acc6d45818f64773909fffcf0febdb496ab762cc26fc759b91da1016cebaa0b5ad94bc7b3b332e83bb2ed59e37f95963282981bfbeac5aabd9b376619275afec8b019ca64180abd8922ca0bea853ee2117c85da54119d5e6573ba69aa83111ab8c1b1894446bfdf5e0759b0318725bd0f870e3662c1f02e590794766a0816771470b61373005f5a4a19067730094e6bdc2cce73e134174b59083be90f0b22208c0c9644c9351,4a86400b749bad1136622ee5b8a21c0555d3711c1f09a1b867166dbc7d957024,b68ee2079fe645af56a8a34a93374d7a59a47c7edc2ea2b76f4c9e3e1fb6742a5b7489d3d76ac4c3241740b49f913639a4d8c50f78e1db2e1e221a43f830ed6001,9a09c6fe3feeda444d10fad696b6ed290593dce5df25d816c92775c1e432cb4f7bab6ab0e88c8f8b643b838ac031cf3f71f7da2777bfa3faccfef317f69684ca00,8cafc5414cc81435249f8fe91045927cf7c1634528e22e32793261bbf96fbd245952223cee2a0092727d158a0d68bbabeadf1023b17031d26a40ef2d820060d101,45351b168c0b9e92cafa014a01dbcbc171b0a71b9be57dd29bd9abbfb2bf444e2ba5a1ad832192181a14cf6902398647c2d1c8e7318c03e8b6fcdb3455d7613300,b5880648e55ba4d2e67bb4150a33a8d7ed05f8fa17fbff8bf2328773c7925fb869939e4b1a251bd940451b34d3ed3a551b614d3037e362b128b4b77aa51f702201 +d3b830604a38d2db2b220f2bf4507e52842de7483638a4c3c9ac529dc87026c04af5b52e484d0267522b56555fad0e8596066fae1f1605961eeb8b491e99a7c4181f49d977cac223d06bf3d0fcd6fba5146988646fa64bd8430f913b203d161a184deecba4ead26254a5d0574424a6b633119a494de09230da10817331b2ae59b6cd64072b2a4bae6a2a58772486b4432bdde97a3c142fe9ba072dbbfe6f82dadf2f5308c2d2de0c6f8199570eea26a8ddf9e6a69369c274b98512b1a81de0428ca484db68c5ed005431b9c9c32cb0ebef8a1c0572014521031e491b91ad1b5bdd4b458e6efc39c3044b816a76e235495b5ef5f2d95fb8,9f9742ce77d35dc1f9e9e5870f0d13a9a0b40e683731d30532c1e55d0f7b3e89,e9a4180d0ec1884ebff8cf3866c225c4970f608d2210ef907a6da533334e156a5c7660a244181d485658d1d7b95b1ed6247fc081f8bbf080d068cf7942d7333201,bff5030f4590924acc62448454fcdd29571f5c009f9f0b1f4fee5f443f5ceac24f6d6a68cbfb20846f696712f2926775c2765a859c87616a12427f5e2acf554600,a74ffca8d2df4902b2897075c342542c83b83c738cc38c8bd19f3cfa7cec998e6b86d15ef6a7c87101d4b9ee48f401e0ea3d03c090b32766bdf8d95f8a78a6da00,0570fb4004c48de521c98b4c92b14173aba2f6ca615d7c550fc296757b022a1c50107dbc5cb7619da9b31ffe8ac440cd8dc3b65bd65dce3c88a9c33c483f929e01,604ead394227779f10d9cf28d74e366e3f976fe1d03da72874f0e98b919b74001d34a79f0da517e91863eae50b2c1da421ac6860cc14a4b36a048821a860eae801 +fc610a6870ddfcb5229407a0f3de55d8864d587205bedb8050dacec6afd13c5c11f4b2a256fb5b4d9ce8728444b29001994625dfffcf12d33d6a6c93f98329bdf2fa363b923673714950be68f514a1dab3e9ffa3be5793b6ebe27173659e19c3c1387feb07ddaff475c2b9c9247da28ef939f584fa60f9f8a47d04e4a39c3d83bff558444e7019f33ac41a4ada3d53fa043e7933b797b4178bafa22a6834b80e5f9642db34486d0a3a9d83a4e0b2a9cba736c818d6a5088189cf728e4be9e9eea80da584c61090694bba114d124dba307ca1606bb9ba67fbb382a1adae3cd0f62dda1a790d296f7ce1736234a8249fce2c43bbe3514df8,24d8da356330e9260ca33dc05f138937ce071271256f346474b708f2363f1e73,6d8659c68bcc58fb88807bb619f995c16a835dc30f5c51a6cf2c5b803924ff1710c1600d1344ed762a6d8235cfc25b9f6cdf91615bcfd27607aa6cb207db9d1901,19d6e4f0b85097341605b19336d233bb9d672adccd800657c5a0a6dd0599dced3450852863903ce993a1635fde3c4764575ae62bfdabd9d408b0d9cfea155c4d01,3e5fe17c09a505e77534fd8f527667d1f7f9a6bbfd4ad96ed6c5abd4245afda35445a4a1a431fa6a9f6c63f10b4c4a3d1656f4341a962dda8ad9754e4948b97e00,cd8555116525833ebfdd71a806e19e5ea174e4e8d9dd91271f4321acc3824f034425cfbd381f97d1b8eaa988fd56e51766185d4054e7efbd41b9befa84eec2f200,0fbd07079f69b70dbf74fe5d0a98806ef992d1f0c711abc2833fa094c79c8cb524b314a339c64e64c5f67b21817e65bc76f060ee8184dc4f55a6f0ef1309387500 +6c6a13b8060ae49bc41404c4977530310c3b9330d2b81fa7f52b852b2c11b496c5313b185f425406791b7072172966a188a3903069a82c4a1589492bb82aad146abdb8a03749c613630c57dbd195b3f2db7589de5335951b1193c2b25fa57c5bdb9aaa32d0146f7b74d24658cb576962cfdaae9150b7a9469f5a0f67e13c8712aca1514739528a62e9cc7bead7e5bec91847139b94cc30bdcfd57f8f224702e52433a0cf454586d93726ea19a4e221d0b774ba6beed65efb639bb54c01bef17bf7760bd3140a315a53573792f17205f1d34643925a96d14eaffef7ec091c57ea96b730ed6402699aa8cfe27178961c12ea2c8640ee21b9,7deb3f139f6d079f4dfa564fecb4f2892aee6e693791f8a7f058cea96f82a1c4,903a673a83c5cc4fbd2e1e1be7ae6781ba23a5207dfc073ef862b806be780aa773f284879e50266557d6ce5c15bdd5a35cc2497c8654ca7e7bd9e547619b8c7d01,34e2021c36d755998e9bef22a0eb7f025a804e84f108c4d18acaa6100d0f076e4a77a395b27b63378419798d9e68f000be0599809ed0533bfe5055fb800523c801,40adaf50abb3154688fbeeae6491fde0fd006e9c0a5f360f62c2ad3c3f249c8d3f6291c47aea6c986fcf7df00ff6434e85d712a655ba7da641000be518a5239700,40732ea342c3b1d790964a51da12709f48d71832920985ad7b04e88eb79eeba33840ba0dd77ace673b47a9b5aabd9882ae4414c09c410d238b5819c7ac0dfa2a01,229d8b137719d04808329840a465a96d9306d1b42dbbffe00ac1e3bfe19644970c4d43881e0b61c038f1a1dd477aee5a6b7033ca6ecefc3377c95065012fd6d800 +b13b054d7e20909158b81fc4bf34ed8f40aca9b98064a6bbff2292c5aa85280c2a8e1736ed67e3021ce0192b6d0f23b324ed67e3e435a0024bbd0de17dccd953a16e153d527eedb215d17c97ed7e9a579cfbc416ae7b863e762a7de8d22e007c6bae2b8ba075fe841ad27b77dcacf6de8b2f1b2bae850cc3dfb7d5ff714455b5cfd40d0efd9a4d2e99ab3ec9ffb8bb817ad0e78b9cb770b6913b167d24413f1d2bba93c2390a7e7258b3e974d5752c69463bb03f056f2ad2cf24c86cac3dfabc6829eb719e316c10e13887e7f62f919238b877fdd88cfbf56d45d1e807e1554afe7d8f535390cecede381e3fb74705d019c5f2ca13083c,60955865002eea986638408f41210b7de2cd7ab2a600d8f7175d42c635bc3c3e,3a26f2c2594d038310b1612c8518f2f343315da406914d35fe7fe1467ecabbf8674949f9fe0b8f443988fdc4ada9674210f4f5e38332f9f3e9557de603c5739500,a842a54665e4509b9812935cda11602c22fcb3210f66bff144f4f775c3bea18d0229c3c5f050681856946b5fb6fb78ea528d780663134098730f16a0dd3b3e1601,d4f290c7a817b5a513d40ded6d64e97052c12b02496ceea05858809ff917a9eb2db5f9c9b336f203e5834ad23790dfe386f13ce4caea50923ff93e7eb31101e401,0437540aa1be3105cc6d7bdfa04f9c04285e229caa0da7bceadec441dd53353c282f282844d5254d4df27fdad97a251fe23b46824f2eda01393073af45c94f2e01,b5a23d513402bb4b001c9302294d1627fb7d5248bb191a374429611cbeb266c94463cbea3a391c3a761645cd9c36312b23e5c971eec44f984252ab06970d735e01 +7aaa846422bc6c088ff85094d912642de632ebc22e0b0ff8ada68538dc1444bc45e4cdc0ccf8c386dc9b079a39a0fbe2874dce0812e0fc9bc749c3143646f5d3d8fb3f952e146f1a24a23564854a6294ee6f645cce645927e41dc6f9fcda8a820401bfa9b4abac6242d14f2e66b75eecf7487bde352357f5a47fb00bc90f2c568b010565f8ac78dddc777fe0c5eb74c92c2f4eabd58965193a3200bff67e29a208914f32a06f1c93d6992b3295d74979a4e4bdfff2a3b29dc5cd18b5fe8d82920fa00864871366ff989bcd04cd1a5e2eeef9edc462ce1c30f5fce9bedeae69a4b3c3aeb0c9525c8bb72b4f2ed7eaba5c681b2b7f2036e0,12030e0094f00a6cdc7f64a5df8ba8b5328a6f18074ed529262b6d67f1a267c5,ba42dc0d8920ed74e9ea43037924895aa8f1bb50a3f9527ba733860a7d888865552e96ca3e2ca271c7f46583cd3976b444475b82f3f9c46faa9fe4b149a795af01,9f436d157e7ca614aec762082d2042334512ee19ec536b2a68248d72eded73d20da69f41fa4ca2a55160e00ff067ab3dedf49c3c44308d006374e266bf428c7601,2e71620fef18041f03e26f74e62085141b1b0ffb27e95ebadaa2db1c7324487f0bceb221d895bb28be1ca15cc79df50631fc2b4f1104a7ad7184beec7938a26201,373a0274020b13e45c5b79c53c000252277454068c396a1fa9206a14e826260a25468e71a0da7f443717bfcd715734d1eab7e714ed7ff81e2b865e4ec71f1ea901,eeb4eb9ef1057605cfc843bbe4795f14686fdddb3a7a46dad7c1a7ef47ce961b7fbb2b420b5e5cb4ad321ac4527a4189b73ffba7fcac6b25c4d8514db1f97e2500 +be2e51845c50b09e9aa1ab8fa6a6d1dd364e517e8c5dd9de3d4c31b4891f37558160024ef577426a5c08f5049c1cfadf7269cc453a576faca3e7a3dab6e70724c6ee8f8f7fddd22669a8d8dd915319a5a4c80161aebf45495bc0a89e5c157ea694d6b55c901c650d68df64e819565da38d28f665d78d16ecbcf833ebc0ebf350dcb386d15be3a5e26f037c381ce8469128972f49f653a8fd61983c8d733afb5e975ddef48c8613ce457a2de39d0ac7b18f907b0322e73a35be5ee9c8cad53a3dc932b32235763e71dae565e924db8cae0fcec4e8fbae2e4ce169ae25f82db29ad2ef942badcf3c991b701977c2eac7cc3fd4574dd82af2,7c266ae22f8cbf739b35568a4b12c2fa62f549e20494e4fbf69be24d022d9542,a8c9c0f4b4faabf353f28923551f8d50cee79eee82c658f6fb33fcbb3fa347724c6ba6a493055301012cbc88d6df847fd45424aff684a427328108dbb8e5e15f00,0726ad1f7f28ce52a024917ae2e69170d8a9be6ce481d8b9fa36d60bc58e6b76736b7fc9a104bf650c9dbcd00abbac233e7b146988a2cd18ecd9a32cbbc831b600,8047f4e2725a2fb618cc62ae17dac899b9b8c1e5bf04d36ad3e17fba34cf91d879f9a278db2b55eb3ab2dc197d14cf48b866602f20ab0f15a7f898bd33f0a37d00,6d5975255c995e8120a3f5bd164961bffa7805b07ea6792e403fa7a168ecf8802627716569517b9b34b1e387ce6683ec8d25f162f626057ecb4453d83a3928d801,230d41110c3ad73fb2098e8aab3f29daa6a4477ea7043b2cb4dab521a9d005e100a99e1be14a3e4edf054c185d8f2b62da587e888648e526770b5a2a256e99f000 +81e842ef625c524617bddc8684de980f481478836596de394bec57af0bd083fae97be1bf25843fa57baf3296cb24987a377ecae1e16e6dcb0c238738b17f3b3c9ba68b7db61aeacbfa86f0053c021af5114c10ec657b4935a0659990d2e7baa5e69e6f5ae58d6e10f51e768b5d73b752283018d55ca78a0a34d67919952b77faacdb2dde54dd5bb6e5be852025917cc134dc26f5b39ce2b02399aabcd2572572f70be0f67a5843eca5fcedf45e5158ccb28006dedf2654290878943d85fb07f70d76f6ae44c386ba91145f5e03626a04d81535d86037fee460a34499a745379824765d9f41a229496e3d60390a0b3f73e13cd8a5d8fbf7,8cc0f69725304e1248cdc5fa2b69c805469e39884701d5c9b3e4ede2b5be562d,7c1bc24751b39cdfacb7eeed35314865c800308a89f71c040691c9ea31f4fc4a615636315a72d5276625a2028087cf767305bba3d5f346d4056f3afcdf29227200,59712308d6de4fe5750afc65c6a60a5bac9b7a334202c09b1d2483b125a8bf4a2a1900321efa5c12849d9dd484168b4aaca8c4dbacd984a51fec80a08d2d79f601,55c889c3fb5560a37c85ac9d29762b60685df153ba995dd0a7f0781b8d4e3d1b44daeee52e8d6ab4e530c20ab7993eaed975be93274b35a72eb49a8d7e8a477001,5ebc0ba9e98021b2785c45cb76b68c3c34a865ac8d9d4ccf9a4f47e11af7ec1d24ae1010d96a3b2c7d80200e83ef9d81e979da6c524d4b6e8e69b5ec07b38bd901,8c83b1e4cd32667cc796e83f9317cf3a80211e08bfe4567382eb05741173810c34c64ceb41acc19b9ef9cf1e361d0102b82ba06732c358f71b0883909a00220901 +8e8f9741c818c79d24ac5ce0cf7d1e2292e7b2d69465cd9da4c75651b7452b43a9b5844791202ef1298e7674ffd775ab963aaca573e35a02bb87aca7a083cbc63c788f4c37d9376b90e5c9f9b03c084a4452adf3292edd6322e0392206ae1a2a73ea033551b6f102d47acd2e3ec86b98a7553c478b765f8a38691aa6773197b59cf62128169987247a60e0e2d014ee9e9515605f246a8e03e6127446451420bacca63a3e13f3c650c2d0bdd2e7b396ac8f07441e5db1ce6ce523c0296fbb761ba7a13acd20c30edb6328521c790f503edf7db31dd6038132009308c99c1a57779e7ccc84365de1273dce944d599c5a51926f8949e1ed4f,7e3db1e460641a996d335eb1944be69d3be25bf1c6c4207c7db073702e068efb,b2fc2227ac5d5422c118dd9fae29853c4ba837e1e047b8b6b70ee29b6cfa3e3e4f274e5b6f873280d27290cf5fc2e9bade324575d3abfc47daaf2e6813fd4a1d01,1ddcdfe386291356a25c0f68d767bde6622030fefe1b917375e7a0a9bf02240433f2cfc89dd466c481a27b471492ffd0bf647db9d9e466e58ca0b34268e0023400,f669cd65e05b3676041ef77b9259025fdbec5786feb311d756bf3523fdff39ee087fdf65b0304bc6349fa3a7bc8d662171923110255acda6350108f24fb8814d00,a8f3ea77914c1bfd319fc037e1515d5cafd01bc1b9f803ee40d4cab8f3410d8f6479fe2b50874e013d7b9888c9321e985087018413802851049c2414dbfba0c001,85ace7308750a7dbae5a7f408138a1d02db62c412441fac3cc20917426b02d202d6e26e0e470416bbb7246cf6d1c91199f8b8f2a43eddc2956afbc0d236be29601 +4181792be0be2a40e53cb706325e3007f0dda980f8bb49ae52fdd392ad02639e9a80ab0a0fe0f9348a083be7e23cee2393a9080459b1fa38cf23fbb80a9d87f158d178d4f3e675abfdebaad637f0fd5d640284666ba9bab4b25ce558a0b4c73c280c8de23444c1bd6b4a1e0d9b0f78e345fb3dc20dc8018eb827690dd9a1732fa9cb66dccb7985e8a66439261b5dc1ae81f3e52198a2dafc85c6ccd63337d1fc6be1c6425b54ec943ec256ea5d6673d11bdc346479fa7826006561e3a16c288dbde887ca4482851ecc8734cfe831b09993d8410c93a3cdce2b0f007aa68054e1c81f460badc9792d75dd90c034dca929b95b8d43afa5e8,bce153fb74ccd5eaa36960d1b2afc7cf78abfc4be2554452a8eb7449c37bbaf3,af85890d0c2f3558fe8d5e617ebc17fb69a7a804510630595df8ab1a63e7ed9e055c938d9498e7a0d1984ba6aaad142e3b27ee1b7b735e880e6266e8c9d6191e00,284b2664b39913eeb86dd07740d97eb5b9d967441b5c07f7427fb5179eb3f6c564a865c6f92a6a54c795c13732ac47559eac9e09e0a654ceeef5affa1b43a59400,cf67253b3c5a842c7eb5903bd9eea5fb83237b8e26bcc01a0d8a92da9e6fe1cc7790711b2ba29d93337600ae39e258a2e1337c93b8ea5ab9c8bb4b881a52bb9800,84238b42f31e5a1f643a3ea661520cff1efe4657dae100feed16ddda7c5c5adc169f136828b0891032a35f68cecff3be53e1ffe79a7719d4cf4428e4770c17de01,ca595ed9ef2e522e713be9c3f7b3a9a5756429e0f04fbf8f69a30c73b3aec9167b37d69e961c89e6c991f688b8db4f84257d29a7c1a8a82f39bad8ca798af58a01 +7993fdfa4c95a25ddb88332943b74d8e4795a9770ec829c9ce0bc4253e568fa39b2c606b9235556b41673df9b1e7dae0a265979ba959ab8120f024c80d957ec086b166794074cd62327c4489988341d7ba3e9e60cf377ab467b47b2b5738f87a36db0b66fc16554d579d12750aa15eb53164a215ea966e3992c9c55ffc840a6edbb7ba4ece15d4463841647d4b69215e7184534a77c341de6dc605271eb985ef6709f0ad2c1a3c67b2d78b7d202f7bcc0a134f8744403e5734d1ab571c1f12afb6019db749f2df348f8cbabb94737612112920c94c7a9e8952fa32b122c1148f49bfefcf06acde3948ea763904887c386df3dac3e523fe80,f94f1f0a78ecdd95df9644f057aa68f72bc66e9f86ebcb229a20fbcf14c4fc11,e713f4cc13cadf09c5e69eb2d6a7bbf6a34e62dbccac9b14fa4babf50593710d2d3097e6bf25e0c562b116d055031e810427e1e1aa3e107b6107f20ee932f93b00,22564dd56af0a2f0fed47c42410042ba53ad35dfd2a00886164ca4afe911929857c9fa2bcba8789535970798d882dcf9db87804045b68d0d15ed11c5eace606c00,14de719a559f094a8612cde9713d312b6e866883c346e436877823b72cd8642372b0af2bab95172c9351b175835038a6f7ea7a41a8dc5bcc1d1f2e71dd684c9301,9743330c1d2a94710d9bcfea3423f7f10cacefdb1c70185221d3754e6390ac044cbbd6162e2abaf5be9daf84941637c9376f956ef1c86f2836002017931d900d01,cbd0cc0df58b8b9ab66b16600b928f0a1c114139d13891680c86466aa72ee2ae7c8bbf3d07f7c0b35891ae6143aa6cee9de67ae04ce87d10fde5b1a1545fbd7f00 +58642ef403d7ce2dd3dd9aa209517c158fb29fd30f1afc864f1eb1f8941c32699db85eb040c862d455b738a1d0d8ad07dadd9bf120b252096dbe531a70d56b716dbd580fbee354e4741d3e9ebfacbd75661945940a9c575c0bea5498cc56a17b0eb5ffe9d550bd18e5f5ed2c37a83ea523074bc1830cca794d5a6885a92183a90febca05306ec954dddfa4c6775e18c6e7d1416b195c8516d966f9263b5c48b74c86d0a8d18e047f3b10334be5abc48c94e9939077a1bf0707a632129dfbc01ed076dfe09d1da23bc9d9658359a4b2ab4b2ab4ab95c8aff8995ad3f31f8ec2372859cb7947f9fdc918e21a10d783be2f81cb3170d1732d4f,202c5ecea8beccb3919ce37c37c8c3ae925aa1773a487f90d45de617b15cc08b,12db83a7ade7e393ed1ba330bb398006f639c5c115688f59adb3b10d2ddae724539978e9ef1b4c16ef9983e770260ec013554440fb2d09c475ffeafaef84defe00,05405ab4caf7e377813de8556322e290aecac27a3aba74de33dcbe455133c8762353fedf9a10a5fa35aea28082f274efc1308117f6d5d62871b9453fb3f1080a00,9c24029112a8a81fef67f35cae93f94c2d3b2734b02565431e034206299a9d7c60a692980892fe37e7778329754e10243bcd785dc9e4f3a38dc3f0670f6cbc6801,8911df911ae12a1f38c5c9602b13d8ba24dadb46a804e03c3414536354c1eede0133ee1d286da2e4471bc3b79ed059c640297b76ca6bf2e07d8ded1cab3efe2900,149b70087d5b4b53d94a18eb41f7f2041d04ecab0cb7a4e75efd16120b86a02424fc95026163426505fc2c2d9ef0d72631772d17baa26c40aeebd379d9c0f74d00 +1de74c8d7f4f4001054da682fed63f81c1d3c43ff8ab112b00498e191e9e340d40d21ba8615c9512528d246056b39de6f7b90c6823e880d73a427fdad80bcf895940c3233b353ed259c5557cd4ec550688dc879b0691f33a4e168a2edf69ee26d09fd2fc1cca7192b5212ace65f06d89202849e8b4f254df6d4293606af1b0dc138674a4ee610d7be82c23f274cf8ecf8925e50be3f6327dc065ec3a10cd5c46d053cae916e483dc6ec0be481dd730ec566db01d5a822b239d84dae1e916e9e4d51dfb6c2084aea3177f66c28e624ac48db75bbc63c149819d739b517423e2f2e7e118878a9101279972745e59d4be5928c0937ea39077f6,b0aa349137c7de4ab21921853f1b57777d4be1682f587244a152319295594831,b9155f1ac0a9aa21f56c86c541c3dceb66295085bc3306900eee24e6f32f0e2d28190f8813fde30b8c72a14a4bc233da343240843c97f31a2f281499f88b73e501,cd871e0dd7d33f74daee6854192cfbee8d4d4af479803c7fc5c40e56dd4d0ecf2715d725916596b76359793fc46263c7788382727970d3fac7d83b744176be9500,ac728527df20e2d5891d03b5bf167857720294ede437dea0548f14410b93712a01f7aab89cade08f6a972ef11ad24a8301d3ac77888a77a1cb1953cda04abc4e01,ef2da74615c1000fb72d29addba542f431b43a5e5ade5ca128513916c539e430755a1862cdb67aedc841610016bd2481d2d009597dc7f1d5f4d716edcbd468ae00,2b1dd78aac9df91220562364d7e0ba0ecf58585643c1802387ba201d9d32396036ada2d0fb61af71d8219c6eb33f41a493d184c7d4e3f64035d425841b37993101 +d61a92bedd9bb48698434bc9916bd710f9bf0c35dee11ef4da3b267fa5b3cc0943954cc75d0c073fd412c4d98640238d7c5cc82036d51c15b7cd495a92e48c2570549f61cb9fd21585cfd863f22d946df2df824727847c88d948bce8cf39a21522e223bdd3207f768482ce983aaf6b9d7ef180182bde6facc4d67827780873e3d1eaeac9961700088eff4db32d7f4981d00ef96049177ea6c621e9f18ba159e4e51b53f39822966df73a5f5346a447a31fd969de07e038f9aa2b393fa30311d2850ad162280c029cf01908fdef6ddf27e0203d327a95f3344a1a1e5a3e05ca3d03911cc0ed739aee0111196f8bc1cbd302a49abeeb8c1ffc,b126a2ff1daac70226de713dd9d1b0f0e97b1e132c45df2cc8b34d21522b67ef,41d19f3c3f8124b2b840f4923ccadca61f00749ede5dfd96f04bbf09f5451cc43dc1c3b86b222fe36366ccaec68c1c39de361817e2b38f7d4eb0e52596ef14f401,e9a7af2aafc79eec99aea481a0816fcc197efbe4cc43c0bf6def4ff28b9187b619c6ee14dc2db0752be2c9e5d3f7d5d2f1aa7a3e5eac3e5740b33548cf23ed1f00,d02a25846d6fce93954e0efec90c0e262f947e45c97e178f1139b2404326c7f33c358c10820a26e9c95aa16245db9cee3d182d1b7f7515ec19c5dd8a3fd9e90c00,82931dafe8b6e9136fedc27d65454644891696fa800220760a286e36fd6534491df6bb09b88e3e7eedb2a2ae7805288419177dc82cae6a2fe091cdf329bf541200,44e98054e609711cd35b7dd610eaff2a7c412dd3a4df7cc66b53b952c1d37f5057d63c9364c9f26045832b1e1ef37fe1f77d12b0bea4630cf89a2d9bdd171ce101 +0596f145850e1804bc62e527d13aafd92d20b8290bb076beafab0ec09aa33b4df625bd3ce105562a8446298889e8c227140c01294212e320d0c3029bf42bfdfb00cca5e4fc8f3d2cc93970f2407d55616ea0f6ccb79a683d60ff573f9ffb6bee4837f28ec2608d6e4d29b1532afac1c48aed34e33f72474cd33ef725f03960b1f2d1c9917afb3d1b919993b2d9b01f1b9356855a4097738927f1760047796664d5af912751357140bd3a8caf3435bd699e25f8e3b56a67be33e5d6a83d23a86945775b046ef1fe837b0e7eb65e2d82c3602751162ab63818ffb0a13518c85f7fc9084600a31d695f6795bd150f922369e1711d1fbcf22304,b732d1bad9dd541bc8434c19dcdd214a043ad65f7884ee81492633858886a35a,d365c215399b2100a1464dbe0826244fbb1e885660d0679de877313cdd70f8e3351da4d54e4399880936acef0dbef6d125849ec90302acaf9fdece5ab9c773a600,dadb7a7dabe0759cc0b96dbfbc39eb20cfaa6eb9528b3df0016ba038f179a97c483b28ab43e0d7ec8fda1e77d0f5dfbee503f7db29816054b79567fbb960a6a201,ada6161d1ecf721003b43e16d3a6a6bda060c84b153281b5cf803d52e5274eed17d822911315f5edd2c4d415343a6d4d481b4eec25ba949d9464bb8457b3333700,8ddc3d88dc598a0468a0c66d1b7e955605175639f7350f0db9b82626e47a59ee2aa1007a9bd19bc8c736f4a087230c11d6e9fd7da542dd3082086910e8016c1d01,e899f567a94e6dacf84fc934eb126d811e037eb47135c19a4e24f744ca27fc953b98cda5ff0025d715547c12a25a3ca94612dd45015d6793514c485b315a14f900 +e585f639dc5e78c65a13b7e04477f795821e08bec3e1f67597494e0e5ac660d4684d8ffb0a047f3eb04e8c7765a5f4c60c397e44776b0bfc64614bdd67859fad6b3bb28d59c8f49645e3f571f6a22afddca29a830e1e7dbc469e0748ed749579edd57b9fa3e4329cfcc777ce79346785ab65a57c12f4f4124c5d0b123e9ece6471169be5d2f47f92c19e7331fad564bb5521a68ef64bc5dbd94bdbc5143714a332621f8b6347b280084eaddbe0a45d141b14f6e1ee1d3a4e331608d0c8745c1ae79df901a7318edaedf24bea709a93647c24763913dc0d978839d9a5f6bce627b2244e74b99790f69789295d31e6c12ba4d103e9a2f21514,796a654ffa78f621b244776d0eb6c0bce9915f6d36567a624f06d49245f9c2e8,bd27566163221f3d4ca5b1b7508d54262aa5b9d84fbcee55033272a0ac06813126b9d3ca3ef5ad9fb8a35d0d4301501fb62ad0ec9956fbb2cedb2590d01e064200,5458d9abed1f1868daafa02b1a7afe54e17841066be8a7df940b6841cbd572d72b21087638f113924ecdb8a838f653da03abc6494c9485d7edbc6d4f0fcbaf3a00,6db51cb34b2ac4e96095023e5155ebe23f4a33748cac367c22a68fb4cff31d94630794604c3cc1bb01590d5f4a573d92eeeebf6a77f7cbd60b383dc2843901e900,61f1e403896bac936d45be2022ae753f4c58f57e71e3b3feb28f4128c14b2e8f22e01324203133a04a76c7a5c77225a70768320b17919d41870424d394c15e8500,0c42a5ecdfc82edaebe037e27c4a17d652403cda7daef189e354a30ec91013507df59ecfbd3b708c1467df4b56777dcb1ed33dd62205b4343f6c68d9e718e8d500 +f3cbd76d2b3e022e9075e2832491aabb0d53f2225ebb6650ee1cbc12b3cb383f0ecbbb8fd098bfbe3e9f2e48fd597f231adf4ae7db9563c1cc291f34a070a5dd2478f1395480c6468af9ec7cab3dca256c204f17a069568b7e55ebe85035b85fc5514cf3ba18ce3c31ba43dd422ad96f001afa38a48d65151c59dcfb91d92632d9e7f9436d6747a692830b0a702ecc4f997b7fd9ed4eb19b00b450afc452cc82e915c6326b7ca1060e9c9b9bba29fdc184b63d6cf34c3d5ae57faa7d2d4d5cffcbb7334b0825c1fe3136a5dca670227b1c331c07d4740481a9202577eb4edb6eeebfbd2c726b1d845df5f3289fd2a1edfa6d2d3467dbe2ef,ceebaecb77d79a92d8907385dc9216658906dc75a07e85e1db53ab7cee09c7b5,79c71e0ee0f5b0aaf3ebfc9d2ecb0d62bb32ce8aa18a7c07fda649c8168d8c195fdb7a33d29e0dafef44957472019398d8e513ba27acecd531e96e30c9d8f28800,60fe171e6b6b5259a350fdf35cac95e912f81553a5e9f8c5b8aa292d8ffdbd740b507973be07c9045d7baaa1eaa7ad411b3a972b8d79216cec43e1f123fc833201,60c42bb4af330fd4e3efcdf22fd433e244870db783313f4f5e0f0c66975270b071e1cb775491049a067f3f8a87364a57485f7594206c5e0ebd85cdae4f9739e301,b1cdfac77b403ecb89bf00f5c66dd29deac412dfc95bad2ac2604f038a7f658e7c2bc15490702ca96abe77143c425a3524a83a6614546848de4a6cf9fc0b412801,7cea0893dd23c245b9b26ba2d42d5eaac8bd0af72ab407a0084ca4b1ec8930b0783e9c1300985ccf1f6cd1b58de8a1f106c485d092929accd5aa7d116c2f841a01 +8ab9a8a20f331e89fd69970d9d7578af6bd9269f5b7eedec71c01b98ebbc84648013840c712ff655909f5b2e7a882547b6c39df319c7ab4079e8b676acc83be669086919e145d5a759f9c15e0f08b86ac196d466c6bde15658196bad2d79096e7276839b723272df0a68733bedce9ee953a94c0446b559ccf83cda1e751aeaafd526076fd84ed9b8237dcb281de77538556a3b2048b208430899d0c528df0e2b0822ed5120b0827e9c1ca3f8cff777a906c5dbd1c20ca3040b40afa47bf54188126a537808c3f595f3b5c4dcecfba41c875c4fd9af3b34f8c2816e849cf0ff389bc77c475edfa40b4a04508e78569bd1aeecba8e5a4e250f,389250946fba850d4f65485b0ea3138678d9e909d848106400de1e6bb9fd61bc,0b8058e76566521146441780ac1e17562c0e1526490388ab78907f7babb691716fef848d184b60f8ba3da36fa39124d0abf01eb7173a0a760575db7a3721ce6901,fc7d9f401534f2a92f0becd249c01bc0018266d30149107b0df1ff04c02cbde6591e2885456d049cd3b3b73c68244b40de74efdc94b19ad3239facf211980aeb00,e24f802bcaeda86a829fe81abdc4a806d8f864503b2d5b219a21a5df09a9d4493ec09fb96d5699cf9b4c82ddf540ba647d772aa0a114d91d63d9335c82c5639b01,1fb3edb6978bbfedf69c5f900e35e98e85100caf3c3bf6f84fd2cdb1ed3679f9792f2947bb7b538dc957f024ad596b6a3fa7f1822387c5a8c76778b493c92a8c00,41ae7e15c2dcaadd76ab9c43d0e0e64bca31d805e3e8b6118c754f02529897ee08bbd80432b1b2d286d78dd5ea74be5e6af8a04a5e34aa3050a5389507101bfa01 +f6b8764a495cf62b770f1b01b0d6d05d5928492236335272e4b8349efd5a99f60b20a17b36533fa93dce3be55962d073c97237050ba7f55963eaeb0b6d791500480a56fc03a654ff6f3106d086c41a4e8711bdb02169c1c161f37436f5e713d5dde8b81895cc3f04bef3137ed1257b271d543868947a2be26d68accc2b70de693240d8f071d87e08265ea0b1409bdefd75bffa33dd895d1d65e74fbedbd3e3d0bb7cea1c29d73be85f59d1900163a3f00066cd73fa9424aa560e1563d1f6defbbcbd26002251e98d90b0466cc4cd88bc2432dabe248585b3f909773605cd9b3e6287bb50aee3b8c229328837583186d34a889ab5550cda67,bd2ce5fbb2be42eb7a6f934512bc5eb49920dd44ea57fc42edc3d1d5f84adcdc,457415bf5b6f95a7ccc611537c6d3e593668ab87a0d8a056d081197d72cb84851497df9039831d35907d0ba5f6dee956485a9af69e6883b893acba76b9d5103e00,de13b2d058aad2f08501f2ab41ff0148eebbb484b9170222e1b3ca439f2c7cb640b4fdb8699331ee3a34d34ea8a43bd7b5c96b7d074b9ab522b4820b8857e1ba00,559250c511613c42efa4f22241524b6d8c554de05008003213ad001c81aabf721cb0b02a465dc51fce757cfb9ec5e746b0fd511485396da9626cc72ee2ad879601,38fccbd56583a1299cedb04df65298d7ab34c87ec41894ee808a161b2dd4ce200f9b83bcb3b23deb1f0c975d7f70b224cbd0e6323bd413415660107c240a909c00,d2bc922c88545e859e6b87511dad4d50b1fcf9cd63f17e082a7e22a0165ecf48591dc8a6222a08e0850ad9ce7c614f2926949d7abf7ff9a91bd36ee8269f358900 +e19f1ebe1ae6edb1bc4fafd8830eb56fb07cda095139f2777e36369487bffff99c3125a35b1e2918255e163aaaa841ac57525714a221d18e6f9096d737d447c01128afb9a3667c308445371e837349d36350215e017143cb3313292cecad4a4ff3d3c83f04351779e9cca9e05c53be7cfdf725b411267a938625a42f21cec676a8e3f19db8816e7dbf5a840c80a07bd8dd27c7ca6d903f8b6d40c7c31fd3d12ca3454cc7eb2ad28eeb96cd6963fe6dff6ace383f28aea40db26dcc9518bb3a59b23b3b79fecb0a45660e7f10250eff7f8774478633e3147fcae2f3bc06e291f6a2bebe6d686f5ddfdbd3266b612b211f08d5b84408942d7a,98ad9b566697abd5988954f8f6f78ce5eb56cfdc13eaddea1616568814ff0091,118b471fa41e8d87b7cdb35f862e9bdb715681ce9710b7d1eed569ffabe310835cd72cacf581e7ce7b29eac211f40a05fd9fb185f9e4bb490efbbc84c23294eb01,87c597c1cf299d9eb15023de5e3f06fb0e75631caee6332398aaab96b63b5709030529e5ed7181ec51931539415c599cab40a3c2343b40d1c868669bd0426d0700,463feee9db94573b35e12eebacb0529a43f75b47aef50010476bf39eb218282029352dc9d2bd7a5b8e3426500d0f4d3e44e37d96dbd021c73e29a412fe30d2b301,7f060916d94cc414a78969a1624f87106ef1157c0c05b242c86e52aaf2a4789f5451fa5a0b2c63a2db399e6513dab3803f27a73142bbd47966fbfe42e0304c8801,6e8258be877f213d19563c6b9348d7504f99756c1beba155c7456d1a256a395428bcae5c49600980256751bef1c9ec6af732afcfd262a7a131f043a226ff701100 +e946846450ea0d05252cd3cef0c47d21338dcbef88c1c2dcb573794117ac283c9c1495c143b2e61e0bdfebe6fcb9c999e4df726b9434a70a766b0c856e23c1727b883bfd746012744e886b218d96d3beaf21d96504a585e006be79c4fa876882fefae91516264d007c7b58f088fb11b489b17baf98a8bb723c47dd27f1f387c8381b3d6438e0e554703f287bf6215745050e70491ba50d25c91f02492ecd848a3c180f19435bf7b888c254dfc0f206673d6a0df3f060a1b10c352eefbb91c7cd2b282a0911d83c6347be89133549129699eea2cd7f51ff5cfa7dc8037fff81a0a63eb0cf219da2676845f109e450a7023b4c770b54d06bbcdb,8d5904e43c0d6317218d0e7e9d9891888744633de652db6278595d5af37e7798,922c3654bab06b850b303b9ed2226636a6c47932efedf67aa825e2a58add13ca75e82c2d7dde371de008e68c4e91816f4287a4f71d29242cacfa1a8b2b0a933400,9dc96afbb76829820cd521a944f8d529985d08df9dc4c2adade511e99debbca3286ea9fc46180cfcb3f3aac534e130839af56e116bb5929507895b0f4a3f457800,34716f4c41ee4e0fa5e3407149cf5a2e7442ccef01a39185029c3f8400d3f24224763f98093d1c6239c2c4dc62e3f1ff29b5a9902546eb80ed7a848ab860451d00,d6ad1f2d35b75fafa2f53d23d79a27742f3c8cbd26a648dd63a9269f9814ed0877abef188bc92b095d43021165eddfaff56d0dcaea38221ad9e5980ccc25ad2700,f8d566daf2033131a2b2d637635926512aee9b45d3af3dd939ce83040a3674833edc2d3fa652bca507db9bb03a391a1aec2ff46e8120e41f6d28b8da9d2e321e01 +89ce3248f63100f1dc27114bfd4b557a2960038dc5d7e20da557c0ed81b277fb5e31bff48b29da17fdbe173bdd9b127ebcbc0cce75a8af23fb7a8087f757165573545f7e87dd984aec74f716b28922d123d770ac86d4734e1c6a874190b5d7c264bd657b3875ab328acf3b4382b88a355047f703104f0da3a25b7fda38bd69889d5f08e60c9a5559043a4da93deb67a952ac6fd256883c8292280391363cdcc3399685eaade97ef087bd213ba3ca429690d963975ce45375ac2ce4b8ba6ef702c32aa2695df9ca7451249bdf8bd16834f4786d613793c97a0d5d0d10ffbf0836c2587b43f14c11c6d833b7123b9cf812a8684802ae82fd978c,9d9c6ab1f83d761e42488469aec749467d45d4fe90722367c96804cf93c9586c,80b366944eaebaa9eb1b34f2e3d68cd79d40f2c9384289a4d6471e469851e3be24aa55de212d724217fd6b0ddb676f24d468f0faadddd31cf588538c47f5593f00,f8409372496e397f9f63c551aa679f809aa6ea924f524533d0997f6f23bcc9775f37ce8fcb0d2ca758a0697839bd0bfc19545a20a5551d012de1b9031cd2efe900,4ffc7e00ac2b9294608e236e5ca706b0e44f918a5c9d99d8f34d8b38a59460ee6f45f5439a84b04df49bb76a4f191e8be15a09d724f5c39f74656c81c30d254901,630b52465f48ab4e53169fe2c0dcda9ac4277a78812ebfa970b5631392fceada2acbb08cc9de9aa27a920d57c5b6bd348cf9c04f27f47e60fa44504993a895cd01,d8ef7f531c7ff3009d615beeb2d5549c4045176c24e1552ddb8837abeba08b6433aa1615bca98ec3b7240fa10088640310b5470853044401046815002bdc1de700 +7930a80d916415e04765298378213d437a82fd22883ce258afe2595a02ce36ec3b3bfaff901f2cfea0f71736ae7a7397e3f4546ad50fde761d220a70cb38971585c6709e7838582263eadc8def15c5d17d5eec48ca43e9b2a9922121d3053a402adf9988be723d870cdf0120645bcf949d84c5236e5b3d0c2d106812fabe75b08e6a03b6a960742c6a9675e2aa6f87ceed2843f8ec3fb7223a035b3db8577f74dbd6bba4b6989ea1b2704548283158188fa16fe779eef8191695f4dce4e7d90a90f049130d264418192234ff9fa54d41ea4f3e1bf73c2a278638b747e329c0279967d9671153030ae6a38116be7c754afed38f62e0c90b86a3,6c3a50bdfc6a09b269f80a4938b25fe1bf2eb278e4a27338551e67202c490cc8,7f439034b89d18b5b0bf8926a748d027ff56e3c79104ce77119adbbfd4a5fa65797dc1b69e76b60b9e221eeef789a0689fdff4c0f7d584fa1f5097fec0c7cfc101,fc85e84860c4e13054fb2780ba1fa8e1717260d715cfb48e4701fdc75048837c7fa3f9e45e154ab3bff0d241646d4596dfc834e4b4aad1e48f7031c37ea3feb600,fe51d01b09c087ac043f66b2a99feb94de5d06246c33da746b5e86a43761d34a6b4512f66b742709f5e7b4730c05d5c040e2dc897492143b447a54819aae7d8001,f0d4a74305ff8658ac2b3b0fc4d1ddc4e15788678bfb76184cf72b3fd95b47b72561878e3731e8ad775f22f0baca1d7a60ffe37d2fbb68e162296a6b57b88ad801,e6ca6d55ae9bb71fb80512d2203b67f44d50bcdf70d410f255a98e3365122d387024a8d42daea97a3991a031bc52cfd4845fc2be177507aa75fd498f31bae61301 +085a6f9759366c1f4fe3ccc0113364ec8b6fdead0fad11fe599a6b713ade3a5292249ddc747a5ac9abd0321d6bdbf8aa0bb593eff12de696c3b6bef2e593abab6117eb06bdd3e73eb58730fde8ddcbb9501edd681d0168469ddd024c8153f7660eb3b424085c08efb96a3420890c3f178debc4f5738d55f0af7ffb8305ae92f9bf11edbb5556f10879c2a54333a77b1ab197cbc1890e5708b0e7990ecdfbaf64158817113b5c89b0a5809eaa67f15289de3e389d568fc29bfaeabe68a211b9e5f59a530b2003667d3d5155e1b1603c83cc36315530d5f75fcad57f34547a7f3fc225a8d6a6f6b811ab07d6b1d3ffcb4466562e7eef75e3c45c,704a0fdfbff911f7e80b4d5bac7f20727a222dad2ec7f4064b4bd8649fcfcc14,f5b94ecfac64959f6a5fe77d6c16c5884e0a6773fa959db6c767ef1428844ce25d3e23c1a259c4d27151491ac692f1cb8e979f58a7944b782914d25187c2dcfd01,96cb6e622bddd5bea2bb79b0c1ab20e2787eca99715266fd2f25e8bccd79264851fc7bbdb6152b074a1ce144ac28989201cf20e5787a2508591b96b09ced22bf01,76c3a8bfc73902491ec8ee684799e715c459e6b4a9482a2113728ebf0123dd85326f10fe4d0b778d6123a7c73ea00451ce2a19b42abfefd6009f336fe9db631600,747e6388900d87228e025d6c8993c32f40567aaada81ebe6efff286dc834481657ce0dc819160b77e94f11ff1586ba06c4c7aaf955d1679b3889c8e674f21aba01,a667c92e6a3cfd62f69a3be5e68f9d58917e1f863f96fc00039734c05d4796d6426c1c4493e2b16db6aeb7d53c4ed3b3d22d8eee67235e23b69dc39f71d8ac2401 +590dc45743e1abe9538d017c8feb419f83971d80adf4b886f4c08d23198494958bbb917d4a7789871a2dbe04ca816586ec809375420486d26507b9abc34c8157c9d8628e91837c6344631032e8b5a5af4b3308d21f7d091f7ca1fb102f1a42433c0c7d976b948690e09df8f6d3756e81c0a558e21e5d0a45eec3bc4dfd4fb13003e88bdb08741a10d439da8d7f78a87c7fa13ca10b360c2b03e1b950df502e069effccdfed1592253270d51fadc6879b32bf6434eabfe48156c266b46108404e36be2351c2ba716086d62ea09e87d5bbe050ba7b2a73fb7450dd8833f1593f3b3fad6d086f57a2c9a06f8f4e34efcc5a2593b27922fca01630,b8dd4b72fa6eb8e19a76636c9bd1c6e9eb111eec0cb9a9b6694e43001f7f489c,ae6683aca8af5475ce82a7e6cce52013a12350e01f4e084ec8a48c553d73104e24ba6b6ce4eeb93d8ebeef1338f089f788fc3c43ca72af94330f7ce0420c3f2501,8e9e0ab07d003ae4162c637c4fc300425e92b9e7a3eb678037c7397387e1af874f2544e2b4c712c74ec3d609537de85697e52184278b8ba35d581ad7280d524600,9656b7461d5f8c7601f3f161a2b10a01afa5df8ece3068e1f093feec671b05b772b16e43313315d7388bacd68e13b61edd54651beba3ac4ea8da8f9af6b7fe7d00,83b57fa92cadc48eb123035b9df5434a98fa72e2936b94a3dfdf86927db184fd48e0954f814e568896ac8223f722de287c98cbdddb1b6d826c9f2680b451080500,61a784288a4d16339d2b94528fc9b7ae0db044c040816a514d422a138864f22539e890e2f8bc7d8035aef68759bcb4549dff97f97d5b8913fa96fa5fbc98d6f401 +cea479aa99cba8cd34556f3ba20281b25161948a517760369f1af4f0d538ba3d6c631f52bfa9b54586520f76b16e8e63a963a81aa87d5adc7fed76def77bfb3e1ecbff10327faf644071dff6c19335cfe6c681027ab33f737c220db6c06166b657636935d46846a4a5efb427eacf0bd205d590d7834fc69db379f499a02c4342deec2d6667b70e6ee0dfd64980537d6682e3b87ae41b1075a1ce3b3b7867d16458ebd1c1ec6936ddfdd30c6c052871c81423980b07ee1cd7c7ce0707f09e45cc625890a5f7db05583bd1f545792c98e12eb20c29a92608af6e96016d65ae65cdfbf9413153e0001e539e7fdacfc450173e86e11b6e6fd92fc5,2550b9861448d5caacd09fb321f02de90c75489b2d61696e1f6d8c997fa68262,84b0e48b9b3e72e18cb11bd8421c7be20182ec71bf1ad3f6ff2320122561c3ca6448e100b2ce773971a5be8e3ea557c6a5cbc7f221caff11b05f1a8816b2fc4000,d0683654dfd8dd05b334acebedc9723395e404972f8ef9497bb589522342b56108730df826f53bbdfa50fbd6a6aca4b4e1d9e18469d9c5f9e5a50db51b5d070e00,c4da85701d03ad249e062d86ff6f2bbd46c362f27ad54b6dfde04f08dd1cd8b130d731ff9b1fabb40be625c64b79b05b6e56659c7407bf6f18efb38f60cbcca801,356ee61708f2b1d2757d1569e985b75c3dbf71f105fdbabd428f74988f0c56770bd62ce9d4607095381f82f377bce9b5599ccf6848b1a8843b90322de7f80d9600,da25adc5e5e79d07c0f1d56bbfffc15d8bc4881315755934bb6d988fefa254152a2c42499014cd37f1b2a15fd1f74597d52c5dca18fc3a026fe70de63798d04a00 +3e9d39745d92ba9745d114cd869e41287f084359efd585a76361b1e6092e11e8bec42d2ad804364f2cedf10119339e0978f2b3143875d7bac483f5b745aeb209681056bcffba8c8da6d529824ff2efe46cc0213ad7252714a7ac1b4447c380bd426de5f05295d1a9471632227ddbb9677c4f0f8bb6511377b3fbae2103edad0c31fb11092b934ddc28b0f58b937507f6a0dd09d4b33e71ea260591286cccb22d2b2669c6953d4d29143559f0913e066ca4f1582c7070d50796caf67c49f52da7a33466163c3d853c6c93ecda58867db67d3ca81d50b5a945b05fee241de9b6bdb8e16c241e5299715830949ee10b939984993ed8c9d89b9257,67edc34ee93cd2cbfd3e36241c68e59302441e1ad1db0bf2e5359d34870d76b2,c5db3c1577b1d72bded0d7efafa16c5f8d73e9fea65df0ba672bf8d16e25abf44f0e237b162e931c6ba77a4b7b28d1a195cbb81fe71f553f0cbfa1be9b59d80b00,59d9ab6a82f522062925f391ef8ac8da88d77ba91e10187bafc394be6f87b599460953195f595d16c48fbe71d38e7e0621023aae3288cd5f545c3503fd76acf400,98dc0411f6970c1c1740c9349dd51de4b4e0c11058a87575ca3289bf01c7561e1fd8a1777133592270099f98b240158c19a50bbce1decca96ddabd12ce71954e00,bfd14833230d5b4c2baeb2802afa2e4d1ebd26526a1a72f1b452dd58eb6489c86351878a0768e57e7035c0b66981ae12b1dd26c7353dc721df0b8aa6e717b90301,32aa32306062fdf07a357c89fcfe4db035f850488b614e00d02d8245bdae345935f8fa3180b9cd5b3b6852d6396a9ce3924ed374c4793955b948853269184efc01 +097a565706238aecc78589f7ea2b05b5f01394d2e13cb5da17fd04cac7200f84a72f44d850bdf94fc752d53c39473f3c54fa4c10aab2eb738f845d52c8f48754da232fef6c1c350daab1f91362d990335242a0c8b9a562cceeb9f8ecebdb28e9ef5746e50c5b25c592f7bb30d10c12c96d0074a2feb46b20aacb557ef816f7530d0d1e681f110fca6bdb1eee88d5b9495ed297207063e923d53f1ddb224a3c5a4e706f5dc71dc84eaac6ff7b28e69a368116be298958b2c1501be06a5199fa106f2fe2b9078a69c4c58e6943a612fad4d0658b8571e0e3829790b7e43ad72270e5dc8a2e80ab8d3a6c39e39e0e749127f7bf835bf938ddc6e2,0d5eacd1843f991300544f1c630d254385c0f1bda3ef8edd2177c6be63cd6313,b52a275a48730d1a0c1da11fe45c3513647ef0cf19093091f6f24998bfc27cb92663319bd51937ec31335de884a2a2bb51bf59b19493abebc754ed0e5b43e3e201,d99dfdde53545ec450590dc01dbad3886a3a84503a0a82f485820a82ac9b7de1569b3a1ae5941e8d7b4ec8d94909e087b83375041a9fe8eeb6b5dd6b979710e200,11fe509d428de3167b2ca0fba0badb84946d05e6f1b6b8e2135efb96250429763d85fe9c7165f31f331d54236c68f45afcf32480f9765b1877cdf7bbedd2c33b01,0cdc06b1b4684f7d8704ae02f7ccb1aa029c904fa16cd726cb22f7c24ebcfc06745de740d5c9d217c3f1f6260835c17c931d423b149e9689a9238e4d711db7ea01,d55144757ca177ab5c4c50a69268e6a02a90aec8691532d51071cbe4e2d9af86187af515f180875a98c3d69926a988c3c5b971c32720b916a79fd2e3d00dbb8501 +57abd5cf5fe1afdb453d75a4e9244198e62df3203413cbcb76ac7bd96dca5ea30379c3efa7d91c32cd08ae4e27ce8c994b3e8b02a5eec2e2c6b4a93846e0075689a38fe61bac511c2e9a23594a372ebf63faed66863a3f15ab9e11c2ec83fb4a65ab510745fae4ce451508f4e4f401770099ac58392a917e3ba8f7218f222757138613b5c7499db02b1bb33c3e3cde61d4cd65d72d703deeb33f8bc2b2248b5a5a3df2c46c7040baa84b2d2fa0cf25216766da3a9f2e182bc0ccbbd792b17b24e33dc5a90f037d6eb2d44c529edaa8e6edfa7f2de7a79afa835d74ed521cb3875c357a69386172e6e6b932e9e88a1b020e42c9c9201cf571e6,0863f6ffb4910a736457454d9a52e62b48d0c48ecede0323070745f277c762c2,66d86d2c1990ede30682631d6bb9bcab045e1d482bd8b99244402fa725e7adb57159adb9ed43782e22197ce50a19278c41acd78393965e06f039f41dbbfb0b2400,fae9dbac4a8e6cb7321e991daf6e2f2e3424621602eb560d660a4474f1612f59429e7a727931fed0d059e4f655a4e81d50af372aa56ff8f206cb30839ad9982700,6d6be2771c310705d8a59e8fd2c0c52738680cd49935ef22a119e7689fce12aa7fbb2df073f998bf642ffc6af98c649bfcaed17e6aa313f904706d908e38705101,1b94ec2b98693aa97504e92274c6653407dc0525f38e582aaa0c4ed4de3bfba52b832faf9e0422d433a58c510042a54ccb5b79294c84d060c69902baafe87db801,d6d6fad92783c032967df17f5eaaddcc3592c67870a4c813bd683f015bf06c8e71253ece2fa2678342ef3549f61476d1d24c6b61c0c3b7892dcfd7027badab0801 +4c4f357307e20b8fcbcf3542c5934d2c89a1b8e172ab1dc63d76ae51ba2950d6c78e96ef977ddd2066bfa18ff321fb21a63fe02d4d1e8665e327d7f381bff7509c94d8313f92fdf6da82f470a39f2f3591ef961b53c48dc5a41c60d2f7fd10f18af2178b389c947bfd2911aa92893d4b9bda0b0d24f1a627f1955f3e714777db97867875a177176503bde617ec4f92a940de3d32df7ead69f3e73d0cd4674c15edb7f4a22dd815d3a49c9c8676c0a4cb7fdba01775af25f0572cfb056f70668a343ec22e01517634e07e7cb8a1a9452d528f435f56ebd7d13abbdbde0f3aa7ee9e0386c7bcef7879122c9ae88b4ba54912ff8577eee9a6e9bc,b7c2daedd1ce1f6390a9f786f277b3504d89a71c3baef484c60e9a60ee7b5f5b,9d5cdadb9755efd3b517e4469b175628b3a9f971d9991df7b6c3bc90201c2e7743751a8a7aacdcf1f40ed76d30e67cd0e8a2bc5b3fb6cf89eef2755cb303887300,8b15a9666f4d0576522ba469084d6943188f17b3aaf75ca7831a50dc6e6121ec5941e5c08d0d9a616d824206ff38bff693423f543ec1795e583435e03581249f00,ce75558fd097f94e4c4c0fc3a33b71fc552217ee65269db258583234b1847d4e044ddcb5f3142b8d6e5687a64ef35af4dec530fc29008604e87c7021e3b09bfd00,a58a1ebcd5275b1f4751334575844c0eb8a85aed1e9a7aab0de8aecb04ed8fc16bf89db82243088193db580ed3efafbb026adcd0fa3cd572af450e4d447007f801,68bcbad7e85cc292ee2853750fbca72f36bb2583fdd15e638995124b2505bb8c476c1fce76eb3e5fb8f41d79c25e8e0695cdbbefbdd796d6c427b004cf9d5f4001 +134818b85e8a307d56796cf4ba84941c97ed01119c058a1204df4371e2cfd2685e03c27da61c295361f4e1688537e69ced94a3b721848cc4e8b011366d594dcdf346d446b6b8ec1ed8e43a9f960c60ce46031a64389e8062658aef8531693b4e942cb92642e6f98efad31be12c0aa4f1682e15c765b34e430dc0a910f52d8e6c5f58b26b521cb36641cddac546c42e92ad3609e8f28a3c92a1f8d8f04cdab12978d01f68de3e2a18cf597ae4ce087482f57fdbf69e46afe3c2f2cb5f489ffa96c76367d37d783ba59cee2f1ca8ba1fd98b07ccb6095541cde5d7396158499c360713dc96f2b68ea258cb9a084a47373117bfa28cf5931c22c97e,27777facaa1a65f164338254febd927a8755e76ff43d06af6450e11fe878746c,8ebcf5e6d8b4b447b3b84da5e964472f122e57f12082d412bf05d3cbd1d6720766b1464a6c255ea75a2e6a11753536c81ba50b2871947d7199500095ff1b87a900,832e80e5ebca70e8c46c226bcae05929f94ea79119d9a4eea4a019bb3d9dd2677ae0b4caba4ad0b63d64de13e8d44f47b766952a311b4b568092cb49560d8c0b01,3f0126ffe4150f21d35ad8c920173ab1e77c544359d8bca5a88a5491d1ff5c643541c21e3b37b645ef724f8363e7e5682213000c9689fad2682db7e96357f1cf01,727b08bc9e0b2ae80f18d176df24f23b6d3cacb7596d0142b379ba3db830a5337c18c01e0766460ca483bd369e45764a82e1575fb8a4ea923ffbe9492ae6031601,697cec702b971fe32dc7ef94c881033162398b1912b45ffd612ba7c3b366a1f76c55e00aab3a598ea56f92962dfccce41a12f026341c50a325fb5dcf1dd6d5fd00 +3ae560929bd797e5213cebf26ab3f22748ee32f824c6fa3bbe9601278788a21c487ebf70a204922c3710f7bf7284bc05a6f0f28a31b9eb73ba7b6b21a46d489a935beb8fcddd3b9625c49f1a6b52eab35bb997d22099cadb501bc56e65fa3609fc13f7fbb32c7263fee36deeb7fb199a5a1a75cda1de8c8342ef80fc0f8c9128854b1096b39801a09dfd47213bab1b9e58353bd0ffcf0a64df3bcbb5da38cb1725c62ef05dff5db313d0fd055efa39d77428795227fee12e0c217a9ed701d6a2a1cd9649fffb9f8cdacad3470c2dd8be3ad41f475c8661f4d39361d93d9782f26bbb663e40f91e45052be728aa59fcf27e69a3a2bf69eac52b25,e0ce6f875d3f4baba08d0aa39a0e8ad9477af7a36e7ce21f94f1d743ed02de5e,29b755d5570a13aec601716295fdf7b9cdbfa169284564b7f258a61d2df0f8db29e841f29da14955f9e2ac9810663d0667364382760b96172bdb8a020df6960201,29ec1cf83c55eb155f55438f631b7a270c38d2f65abd8366dedbbce1d5853c05064fccaa093bab85e496a333a41c1a0662297e43afc4e3d8b7b43b65a6fb060101,6bef08e4c44efd1baf222dc9bf3570fdf68eba3ec9c4a7ddfeed23487ac5cadf49e2d43b8ebfa7e804ced36e8d8d58b6a6acdc3bf831d196048e61c37491f86f01,f5f500f663f3be2105e012c5f993a79044a227ee3a03041900af76600646c2b522eb25c2c2c5a5c4c891c6558a26bc379c00684cee8a3fddc521545e9242835900,488238464454439330fe451c90506e451ccfb755fa0650a1aa6852bd1bc445c15b47af4e4c906070979d9fde38b73daba8c516665dd7438bd4c7767e0abed54c00 +ec02edc4500f352779e3faee2ac97f78b3303dfa85aaee8945a19f742376b6a48704aa5e8870cb691d409d9ede87e8e1255e53d3df744da42007e783e82cfdd9f6d3ec37fac2324cbacea42a7862c622ee8ed055d0c5b86036049d185e7db76ef2b7a55f85fea613e39846cc7a8b131c30cbec992a52529d2a7554e780639dbfe2616083e92eabf1fc4c38251213630a0e3afa6b7135e5696912bb41ffb1e309fa894d73d75bd3a73a3d36820a00ac05e2b91894a196e7dd41c3621ea7d2f3ee190028bb8437c9b532d7bcfec03a40a91e06bfe7b3e63e54b9bfb5e3366a500f0bacac4e4fbc65b0efba9c4ab58ffed81391656ee31bd098ecf4,5ec1dd457c629f8729e3b14d2f97d14904f3b6f133fe4f37a3a9760adb7bdf17,2c185cad0ecba0f30562b65302e4c101c73f103cd2db12c3c464319c4a500d2714b7d2d838f6d595da01771237ef6cf9169e58166a1c7ad6b1cc33b0bbe0b6c600,f4cc8f10e2cf17f78011480b2811fe575f05fc6e746ea1c49980fc37ae7a77a102a49f511f02411d3d25538ba5837ba5104c59008737ee61df7253ffaa4ba70d00,c39559050523efaf2f9e867bddcbb2aa77668b6a70ddc06dc642856f3907eb6c251cdf2d6a75235bd36fb7a889950193a696b01da25d72f55d4f2e6e757b25d201,51f61d804839d4d719cd623425c95dc039aa42e3e0bb35c0b194ded85f1e29fa3643c744096c32046d4d98b2c5349fcd9f288f78459a9d4fc1dfc163d9d079bb00,58d67ef72395e047fc1de85af69d80052b050e071a2cda264db06e7e8fe260714c7cb0ab4d232fb19ba2a2b5fbc08dcf507cee973d0648930581eccdc27407d400 +2af28da28a9e64be98dcee55ae85d7d0da69f773ed53a1bc3cfa162a60539340c865da9dab6fc3be82949af487345535e672a071305a8b56d023c03ba838257740fb3aead2486ac86bd63d4e075c5cd2c857de1ac0721fa9fc1b0fde1707c20d68074b02b3f3929a47e57230bb587c88925655e046310abcd52d41a152166999e522108c3c291cac63f101880a1b8ee2667aa1aefa7c7934b6dbe3662573b874a2bb3c5ae885925a3e7d110e833b9789dc6955580b555fb067e5942a3dd3f45837a79d70a14703be41c1c12bcd6e9ea669e345d209e119bc9c322040ce2a13d41e433eec4f8f86a1b937db35260d8b5c61b32ab74e155ab75dfb,b121ca25bd6c0db093d63a9ed21b7941a864a88707970b44d281cff9ad748b91,1d7f4b369399db8b4c4c8916f03383b95c34d1414ae738ed8b5049e21fc63f6c37c2222347e2516aacb9f19160bcd08c94c1d70dfd85b963d51ef4ee5300609200,f024e1c8c36420265a743bba569da32b1131eb303737b873406a77863ff4d6d3123b04f249d2c644983cd424bbf1a8cfceabc903d9436f9e16ac8a172c29712101,0eadc3321521a5ba8a95997ced32ea190ec0b0a94ff443867bf89fadae23e8653989671887b1e7e0a0b49c60b599759a341382a3c47bbb5bde407b64afbaf86900,2aa2765000d17d58eebfd9cc8e3e4eb8936e6685f094feafcb6be25d4d9b11ac690e2cf20f0163652329d6b0acd1a82781886574eaf4ddc733eae532b9ea050601,21922594868e85bb294715beef2f155560d1e1f0978a97f0e60a5831451d5d50251e74a6a41dfbd2dff6d800c1ee75ca665db49b65464aa8a2dc1c8769b66f1f00 +0c8b7e6e04c0bc7df74bebc556f9bedc7dcef0d23917bbe4ae1a61b5efe83cac249ce8af9054363a1a136cd211b914f9217a5fb2d1bc835d8b115e47f4de62d9801513ea2665532934050c7f3f3e5f0f838f12bc77d239f6509b00343e81da9ee106df725f87b4e4bd1fc7b2621a7a25a7f945ff2ab580d909ad44a8e35fa24d259f154a1ec55b1bea1b95bef808b9b7c604cdcc86ef5f61a3965ca3cea7edf048633b4d23705ab97eb0979b8a39d2aea68b0461a82da95e0b515159e44d412fda493ed2738c4567cd44f2e028d1a5bd21fbd5fcfa23fd1b40306fb3ddf0d6f7b313468b37b3dd21dfbf3d212f74b3a4e3a54bbc0c8e52adfbef,74a5ed04864927afc0b1a696484a55c5e59383a2e919f83d8fb7136c94eed3d0,0c10d925935935506b2129f35b6bee12d2c6b0b47721a16ec0f1bbeb2f4eb8fd290d56751a9ddd3ee96532aa37f33d0f75b195ffe68f425ec8b934bd96921d1800,aacb64f504cc9fca220c316b0d63c995177583de82e9a61b265bb7f552ab31791f0e64849d8cbe88f15f7487dc21e6435a2d2aa2345aa71ec046a46ef335eac300,6b4abd6e873ae3af2e495e9436ebbe7106668a36e434389f42fcb02f13f1a20f358e9f5f385b79c2106a1ea83347ffc7219409952640bc30b75e11889d3651f301,078465308a1e5a7b41d6923ef4eeca077b64fb8e16370f1854fa3a2b6425ebb85c090b3fb59b37cac055d7d163ac133b8b75d3daaf31c46cb57604309b04f53a01,238d99bf1dcd58b5abd630e055904a70200204f9e07d17e822ca89c513b9e88e1d8d702073da623f463741bd9b6c88c42ffcbbe74923e375ea550a9a2ec8029400 +d2003df1b6b5271d8e13e48e4d2262d7e5fbf3fe2bc1bb0cefdd991467b45692addb265003ada5cda01d7654d599ff1153ae777d7ab7f5c6297771a907be12721ff650cd097929f2bae0aa1ed916ef5b71a4e3a6205a2c133f7d20cc924ffb939da89ac3978d2c14218ee73a348dccaf528e6844fba3b2ddbfe3a1fcb1f131f99e0db9a37e922ca7d2a8861327f11874f1da1d87e2c7878e4b32d840b1378f06cda7817db54246876d3c89a6295ea9ed87da0dd02f638d4cf5f6ce6e8922352087d57d0274a0999e349ffd4ac295b60d46312a7003918e5b9a46dde7fcf80a2c9bd9276f1c1026b3f15f7e1bccc4097540ecc105c4c1bdd86f3f,b5eeac5e91f5ea70d1a9253ae3ac16bc4c70187df7f43fd25f36389bf74e5403,62be50befbf8776d6b4535105ffd617a369de9e3b5d912d973c81d3c7ef8cff82b1adf4b7b5513c115f251a197f1c7948691b1e6d4c22738e84a398d6901fff101,47346cf7ed4c226b38d2d2bf9128a3fbf01f620593e3defb9d1593cf4908bc614b8c89613899eaaef11ecde793ebf092fc5bd12a53519261ed18653cc6998b1f01,9c10b79129a1895e144d851b695c1843cadfad268c36198e8f450c7b30c5c8ab3cd6e2109f517b3708edde82678e4088c912e3539761045fea66767ca6027c4f01,88dde405c2e4133092f5041b08d172f346a070f97e43692cb657e95845bcfcf8717b366ff4255ff568e33c5c0628bb866edce3fd3a72b3b1627f2e6dcc59a36d00,7a5d36f70f14bbaceee6f7f5e455f21e80b6ca73f02c9b7f7db51dda06d41a9158ad876fb78b1540fc7fbdac63f1d06bbde305a27d2ba026d3e186016bbefbff00 +c6bc41b5dee12b140ae22dd467d1611779197c9fd1bbf7a3487387bd5fc267db84ea996ab0503519841753609ad36d9523daf29496a1a04b4933cfd2d054ac01b10e8ab3be26774d021f3374ad5dc3d6d4aee19563136479291f384feae9b8c3856c1b6bb153aebfa87dc21fefe3cdd4cc2074df3eb6a2ff59cbc3f3f9e4e77dac55a3e8c7666191be9c40422db1d4df0c0c337a888c0f80e7da9cdbeeae414cc48b1919f5835754c4d3aa0b5b4ee9ecdbdc3f542303a5a53e19e0aff5297730318443f85d66ba8d44906b4e95201312b34d71cc679b0284cf7b47e1fa75480fed55924cfc93fa1cf3d21beb8c572811bcc4d4ea2e07aa8df0a8,ef9628c2e461debdc811b60d5826f8572017741917502cc34747bbccd1b4f20b,ce1951f7b4d3e52c62265380f436d11fe469db7dd6707313dfdaaecc4b68675a18e25c177d6dd5f54e9746a926c77ab0ef0d4d26f34cf62bf78be13ff797b64000,faa9f5fe171fe63efd0fa9a56a3bb69918e1158ead462d264c2bbbe01d675c8960f32483c9f424ef5520db9e7b051e19a059f3b70b355871de08bb05211f337e00,5a0e746f0025a21486f18f9453b7f0984ba20aa654ae393cf6a4e592b98e67c3790e5462745f0fdde40efebb002d7f0de3f352080dd1b79bb46f655f4b36fd8e01,0a33f9703d3dbe60a793eebee8916a7e579185001e3aa97f7a3e426d2b2484a3760674a631e467a3cd22bb784cf289709dd8d63ab2bf2d906e067345e16c6eb800,aa8b91e3897ecd3e50a76294993f5d754f6a0a64de63524f09439d07c24b1fe3625a60475171233ea8edf740b5884b01bdfaa595b08831221530b68dcb76719a00 +da3fc4c8006cf8cfc75956d4d1b8c810c4ecf8e7dc9e42596d797739379c051de368a1ff11bc32980d0e37a7e00f72bd3b1cf8f0019c129f604d75a153540860b3dcf4d6fd6a183f4d25e42a3298272f676bb457b9bc353f833243006de0b82d1e547c6fc11a2ee012ac872a3b0d844d5e063fafece0dd960e8a70267c420b76e62ac104966e37846dfb9c8250d9e1425fb397aae2801887062ecef20545f0e54c19002a300fc19633892807a345edc4e0ab02c1f76c435e18c674d45fba5abf8e6507671ee5b5d3e5ffd8fff16692c41612a82e0d51548e0321edd503ee05098285b41c89e27573c297e6911f6ddf3fea81cff86fd9036d423c,a423cbc30dbaa02c8e3a7148d9939326d2c8bbb27e486cb06aeb278ea3cf6f2e,fb99e55c7b6c3ae432a65f47ce809eac24b3fd1e7889780041ecbe30d93e5733595eb5240ea22707775ec5660960ad4ae2b84022e352ae4f5622a7549bade07501,98ee79c06f01fcf10e0a9332bf085ad80513634f5e1476df5605919b3c685b83077fbff1733d6d2959261d4c05cf673462abc6af5eb0fc42ffe0d36dc8281cd900,f65293d1fe24e146fe5a65e4d2396f1e5af1a3ef737e0cabcf77c906d4fa65a930d0991e61bb25c971a1eb9f586e1fdbb5e43ee4140240a0676f475445c8824001,535e697b8bcf602c1138f2f14793da0bf6c1ea8c470b02e3416862e7ac3ca1751f51a91c6b2cf06440e4eb77bd88fdd112a3d90587c33166eaceb960696a428f01,429dde785939008928e0f5a9a4399cb339278a694264248ea9b224f7190ab7b13d26a6c4cae697581072b39c64b1136c64f4bdf2a2eb6981ca46f9ff77418f8d00 +b4c1c3bbb63837985ca84a9a0c6cb80abfaa4d307bea16c7cc560e64716c526a3c48e2f2aa8f79c3be3b2a403adad684e408619504ffb7965b3fd3fbb7fea4a77f50ffe599cc6cb25487b3e5609cddd697bedbad71cacae7ec47acde07ff84974966dfe692c18aea744da19ae97c175d088a8c059e8e7fcee7da9a7fa0a9ce4bf3c5c6edb998d47cd644df627e232fa851cdf4e6a4517ac7ae81b0496858b53cd15f9402a1758f81b4941c1838141619f83b0b526f61f5de42eecff8904dc7cd7d0dd62c49645e1c5e48603794a127507bf21b24d0bd98cabe76cde7725d82d45248906782ed5bf72cdb26210ffd863eae3ccb30f187e7b33940,66671809369a58a78518dd49861e9b808e616a92c279737ac451ce2636a2faf9,475e98e6b86cf073ba461703bcac4a09b81aba3c174fe82c91a8f3c7f76327495ca5d8e6abc3c7a57dc5808632e049eafee7a672ab26583df07d9a23ffefb36100,b3ef48661e4b319ee10513d8ea34236b0157bca121c7c0585c0f21586edfee1a2300aba47dc2a34bbd33a7e6839a8021a275fdef2a00969a4dc162c0c4b72a1901,0dc86430d6a50e4ce12ab3cce194e6fb056df04fb5d5611f061d396cf48ba38667a5b1fbee8142f4a67a309d4bcbbc82441bba21d52ea676d72f8dffa6f480fb00,641d4e0073e294f923e7afa3e60128512e1ac78e0a6aac23dc5a6a31f12c12d03c6982dfed967c4117ceafb3e3eb342355caf690f09fafb250c383b05a06f6b300,10ce1b5b7af46e9e33735281f027488394e154fa868daad429eae6a2aa1ae3463da3ee4ed31f8e50e1953ed0a33cbc80890709b2fe8b7b2511dcbe58dea229bc00 +ce3f8c8ee824d1d54eb9caa95a631ee9f54974e5cd570ad3943ce2916d322976dc8a2d37292e944b0da67e0a47ef8c1ee4eda860c7a3af840461e3c10e160dee7c8b510400e89f1400c28986a56a3cb2e7ba33111e26e11b94d9954ac4c8ee24becef3f604bc946d2bbe3400d33690227ae6f62166990b5cd95c9892a16905946427ec6dbdb265b8a6cfb36b552a42a093c963bc2f50597b1fdb8f1d372dc8f190b8dcc4238c0ce1f30fd135777c5b61f74cfffead31a659845fe4a304679459f7f5c2d4db793b4a1f4d72ac225b8fc144dcc6fef945fdd0edcb9309db00e1845ac773bcf8375856ca01a190c812c7841959c9ba6abae1766aac,0a56f5c33800ae30d3b91791bdc6a51f01e56474048c4f50ea3f6ebdfc6b10ca,4122179c21d745da1a9eefc0eb53c0089050a5895b98b077b6b1bcbb446ed75869a2f0cf6f4b1c01f46d04720e78b69f8a0659c186965327eff2565d2aa4acd901,e720f2de10d82582517763fbcaa9f1775af2a0d60844146f88dd78daf35b366170491cf987ee31a7992956002e051193db433a109a13c0cdb27f6157e883aa0401,d2f06077c9256e63d18cfcc312e72c1d572d74061cc7762aee752639f1710fe91e5a8794c2e9346f68f035b1d7658c36518a943d1b2f7f17b266c7cc74426c1701,c4ccbd56bb33d9becd9c26fa01e26dee26faca5e5214a568eeedc659a6e173e95e8f93b4f51f063bd39ff147696569e1b1b715e8b808b01b60c6711d490d131b01,f1483f0e12867850a9cd068e5be1cf783c4eeafe69bc9196e0553ee6f173c514717976d6c5c358b5eb73ee2ddf6c3450717ece3073dbc0275c22fc4fdec085e100 +8f5227189957c4200bd2259a3eda9b29fe32e6ae0953bfa744f79ed78e3bfdd8c11532dfd263e73c47f35399994f14e9d5a087271b3a003b191e7e2f1c361029641895e551b47fe5fffdb6baeaacb9546970410f5c28b45901ad0c032f13f9cb6c17203669eebc1bddcd7b983e7d5663b3022d8d005a715f0d2d906237414167a63461740ad1db27a34ad6e390e05ab23340b488660048d7798f437d5f637878d8911ae46978d09708470a76866b58878bb9bc39b1728d23704976343fdbdb4799b4e6e693410151f3d6eb73cd6d24a546453e6d0c010eaacf972028f8d81477941f42ddca2dd85a7a44a17ee33bf231ea82383ccf92b1dc85c26b,a4552b3a03e1c9bfad4105fdbd98de9d0474f5b21d56d5d6e3d1659b88d5984f,359bfcd0a144f301e7592bc34ff08019fee0cdbf4dabea866e6bb2b52a2525004cf4d82ca9ed99801eb5a4397a19f084258f3041216b4a5ab3a5c2656b33c86601,b731057826ab5496ec8a34de2b2a3635690da89a3e3a448539f8561671d2ed9330c81bb02ff5917de8273eae8b6fffb0a6c3b7ca782474e70f947ede2172e24d00,d7848264e1a24391182fac772a9a71fb79c40bbc4de2bb1e1f16e3844ef1a2ea3cf13665a3c75ab83382370ca8fc1c3ad8357847274dcfa64caa422fdd57484c00,b2db549c814af81a3698100ff8d213f6b4873ffdd879dc87909a50bb4327ddf832b286b49e652863ab0c4a7e094e60bd13a6ada2c18db55868e9afa47018575501,addb79081c9bd297684c2cd96b7abc063c656df969de433861de8f134b3d84a414e07b216ca7b759a8fc9b4ceb61cfa93ee00d1550aac8d49152e31646a1873d00 +c3161098dacd30e1cacf14f1dafe978b714f89dfea4030c79b9486c88bc2aefb25b6acc1d57670b48ddedead87a3621ad665191462ad9b5d3576e306309227f8272f676f0cd7ba9f7b142adea8bfa9d2b6f37c9e884ff286c769c0ef4134688ce470710c18545ce9e972df0ae9a067bc671571d883bcf99cb94576cb540dea3a8b0477b8bd9f187daf385373794dd3679475aa2771b07fc37d0b2fbfe14b269fa45e8bac9c52958a8d0b2cc81b3f9743b4df273f15bf90a964eb6da5995a34af90cb4f3e61d3ed350c8ed0203dafb01632e0ff2f51443277f60fb25a4112a721c44231989da51b0daa9a31841d6ac67e5ed5041b86768ea8c193b8,b365ad87f07e375635804128267d72012e8f702a494f4c9f49a8bf920e678976,7fe4e4161e9860f8ba37b44838a27f54ac4a44318a07cd37876443078738141d51f31be172b3ee993cc09b4cbd7f38c876af0c076b154e553fd877b815632cf600,aa4d8ff9a472df04822f5a7d06569d0fa31ec70dc1ba6c167b5675ac9f04d4437e366babd11a299b5f58a388f3ba392dc9db13f894c2005d89e7d5a36152abbe00,d866b8399b39b7d1098f7dc08d7d196bf2e6c8b8e2a0d2e4c5e9420eb12c1d2900d8e202b756bb3b34f94943e028cfe28a76c37bb4ff16cd9285c96dd390ac0900,2ff79e446502c018b0e39b4ee10743deecf24707e710c76b09f6bb8d9bf998290e2f46482f445d9e1123711a15faa24a0c407b1ee0551e9c5f37b16b0116f37a01,f8a63e554a11a99915badc94b089df805902c97cb4bb22463adc833cf2c8af7d4e7cae420253d12c9b7d00e76547f112525bc673cb9466944d6faadbd1b1997501 +1f9a2822dc3cbb58190437d76f46d5a0f07c0167198dc0c02c262a68e190c4abff6dc4d779a401f440ace36ad35d904bf357fcf8e479cf8d14ed625cd76546acc0c1a72839cd1a9b4eaf453a3beb4bf8daa3e23b7e6b782f2fe11f2bcf0b08fb271be323565251b59da68021e920a25d52688a6e3ced3067aaeb1373a1773bd23ceb7cb9a756f9a29e0615cbe8ff2570152498c58dabec0dcb0ec3781f17721edadbddd5a5a7518a8496725c50f3083fdeec59c56b9a72db7bd471dbc106b0538eaa40496291e9b59a0ec62e2c5ac8c1bf92c0458efeee6775a785acaef249d5669c7c085bbae5f18b702b217ace77736b6e2d2772130e6e79c49f,d74d0e42efffaa28ed45cb54b1cbb36bbd46d1d75a04ff3039972d98f88ca91a,496bda9f5e7f0defbdea429895327f9c41c2f1b0169065222010e8bee749cf5e7b1fed2afcec2e46b63b48b2055186f53ad2ce793518061eabd8eef1f01dd74800,ad2f8ec26e10036f6d8d45559bb3b98b3d89a8dd1e435ddcd4bb72bc33f9652d482cfba3db7d17cc53fac8569f9e21fa1a669c06bd9dca1132f6a54d0feafbe101,b2eac3cbad6fccc011adb32fafb2f61ca7d85f1ad491323b1e4fd6b446bc669a40fb8e06ad7e9a0a96fdd33be2b2e13cc97e1919525aa00c08d41294c199e71600,f6f1dd33d2c3360f0c6d5f0afd2bbda3e93fd4786aab12ba7b3549ee51d3866419550e5a9ad18e7cb25594a29820167b265807ef17659a127318d695553d9cef01,4204033b60a0a23a527db0057ca5dd032659edb4590f2a2b3076db727de5d2371ead955ebf4b796c721ef0241e0828642723b162305ef2ecfee63a4518b8105001 +9cc06e7ccdbd4b264fb26d54b8a3fc6c15c537744ad86723986907c678770e09ad4ebd476981b35ba835d3fbcd40d4d2e36de60b1346d2e7bc291cf5e750042e45442af2e8901da60b546e120de491767be8815ea8d6e3d53da308bc4a1d30e0f47a4b4cf8cebe6bcbe4a5f678e244684f625dba93755c292cedc81930fc5dad37087780c32a5d156d6c4c0d06426467cd26488a0a18f312d7d4c893a7063339b85277dc469c659b35bc8342f278b4a3e17204afc54f43de8067ce1cd41390d325dbb1166d1c237acdc8c31c321349118d38495f054f7bf97707a50f644e09c520acc2032cead0da6155ecc8bc2e1ee630f16b40f799e796a623c1,e8c083aeeb3f00d406ebe7be30cc914025430a79c41356c3724ad74af557d74a,a13f57554b10302e8ed4bc60eec101b52923e2b0590ef2d8e9b351ccf1b251bc00ae10c0a33bf6a6d1a6431a75ad4ae66a5fc7a26c08d8bfc8c065737596015e01,6f151f032f692d7ac329fbd7c03fb60b85e0ce2009e6124b6ba2238d4f5de9067d95a01e96eb3c448b3c37197b24b54ef53bb98ea1a4f97ffd7b380802e4d5e101,ea90c20a6b0580aa7803998976a253d3156b64468b37f40f728f2bf37ee8774c36f8a020b3890eede30542ce0384ce08049a6499e03606a46845789a2b919c8000,c7bacd840c4ad610ff4b6ad3b56a3482d57543f98527204adf376429c3fbc39622995d2cd514c76c6c00d71bbbf56372f85bbd005891e1a58023da0a82bd4b4600,e0026d6fc61159ab9e0c7ba72ba5bccd74ca19c2ec2628c4cb915f07e894228a76a8d24564b6b6b16b6351d4bda7e5ebf54970972c85cdeff7288c0776ea6cf901 +6da54d3fcb7f316633761d19831eaf98499a133e64675defb60f98aec3452ec9429dc53ee51014807671f6fe386a1a849b074b0273f012c594daf6c6d3ba1d126d17ff32b2407c16a5a96196afd2e4ff29465f195b4fc910e84c29b23a4e19eaebc86138a473b1fde8df9d8f2e3a2b4bef1a1407879915d9d0f32f36c81b4a448846d9a1589a68d2ac68ad7d4ff1b44da638ee23c463885adad21e6ea34bad43915fe84bf6f97a25db4ac7ba2173626a392491af612e8be9424e3362ccc1bdfa3c2b41bdce059552c42e54bdf26295c445aa1a881540e5b9cc8470b20421d65e4d4d6a5a8ccb5b080ef9ceb1a3c1dd9b551a4c969982ba1d4fd2b8,b3d544fa6c7682f636b245e2a92a746eb7f4776cb789c247499a451e8e2cd063,b766c6c99f20d01daf92e25665240698649482a2e884e4d04e723c9af924810a52652bcae3daca49c1980e1aab67fba5e5d508df1755e1d9aa19a52f6451afba01,67129b746f247c3cbd7546cd4377fd30a18ebcdf8c10650bde8b06fc4448c1eb2db721e2477e5209c81421893cb61787eb7cf80b9fdc2b59d2daca6bf59a79bf00,b40e13cc8c28cd1796081c5edf72350e7d04bb303735ad052d6416bced1bd5087c57477aaf0b4fda5a2ab67df34ae40282b278d5c4b28c0f5f8f4040a93f8f1700,e294ac784504a055f8aa28745c9b696bfa7c8e5075f6caa76462fefbec8f91db031273d1526fc99926f845a4a51bc511da4ade98176decb8b4f8b41fe884654100,242465cc53365775a83bfcf154a999f31c4dfeeb59a4a3954114165003547b422bf20280d73c1a7d34d75a476c55b935decc2879f4bfa14c1a6b6d380b3969ae00 +974bde5ab3841e5f9b77e65b79bb2103a0ed807cccbcc69a06c1d00b5d835a5e04a1b25f7d320b6ee4d318793da3981e8606aa03312c887ee4078e05701219f1d3ecce886aa16bcd0eec1aaba64e2569e4ce5962c83cea878f15bea512e67167390f400c7ddc328779ff27d60eb45bcbffa5d7aeed48df564d64a89caaecffd6152d7c0d1ecf942f19e2988ed8ba86e86b12f78cd25473fab18c6cc7529fdbc224f1885054c0224a933d3704e22fbf693b171741477744d5a69dc2ac2bade00b0954791c6bc77b694f034f355c02ded6525ee481a99c0f67624cef90b0c9a1eade07a3ea8477032d12bd8266d089dd359d8a875e6e4d5d74538179,208dd3dfc8d6a840c0133109c17737e1987647fc0018fadb56b720ac49016fad,0da9956c4d6cf44b6bb91b5a3fc2e68d82c69fe317eb4278137ce34bc7152b243d1d890af3df1d8aa068386fd2f3cced42ec7bbec81e33678bace8778d2bc3d801,b44c1ab69fb502f89cbf0c3a3f8d4a20a4a52f9e1e35b683607289ef54e83b1132efffb369930b5736cbaf0d4af65344a4c179ba7c87a08a44becb8e1098a16100,8a2af0e1914dda998fb070ebadef73dd7344c064c8f2ecdb8af14f75a538d82d784fa4e8cc7d59d85f9d5a8c019af17462d98106c0b15f08012315f3f8cb244c01,1e83b19ec4363d499e16331b2be84795edbb2ab5ba287bc1425140a95b596f824903e09e1e717cb9abdbfd28196bc103fee8e7c937d6efd877ad122f5542af9500,8cce0b57ee73e464aea872b2f50ac0d63931d3ce30bf44eb43489dc22436d0231c7ae3e1a4aacd53125040a7df329c1d7236a2ba89a7d366a6f733940156a90301 +f49ecf77bb44d3fd62bd9aa91d0a21bed510bb3faf2a0caa5e9e153dd390cd57794f446c48e4563c4f7c84c56ddc2b77bb80d82e639822fe93e6c055af7e3989a40b47f3f3851b20b2ee7d420fb91bb039123c0830c4af0579fdcfd98462676134f231d58a5d0e305b253b394d940e075cdf0496b379134420f1693084a77c7363f33c80031e2aed7b51a96a3693d6f6e9d4e72da4595123fc81570994bd2d1fa663285fa509cf6c363fb6416c692104fbfb6aa5265fd4c4c142df60a5a50f11f3a3d463c1af559c949f09f2cd9bf9cc300bc6f16d4dcdcbec1d763b11bddebddfc3d5c4983bc75b7e00900fca96a967293b7c6ee4e8f563f2885e,450aa5b4b9e059dab9c8300ad7d75e1a3b527d07a527915c212039c43bd9dd00,6284dfeb4fcd41a9faeb6317471de086b8288350c609064a4da0d5b786eb9a5a1fb86ad26068c3cc0873df3c7d28f2dd648b1c1b4ea70a0d543e27d5fdb2e19d01,62c40df0c516a36016cdf51d3bc42f696db3425183713229e0c7a0298315722d0b23c57e50ad912a6cef8d795f57d1e997c14cdb2e017bed517945d0b0cf0e8e01,a648777b56644de0d4d347b05611e15a2fc61e2294c1729df6836cccd8f5ee75543e836302395b3fbcb4d7ed4949e6b7320ed7eca33c5af65cd10a7cdd166fb101,c212dd0c1be4abf1887d534d2173230a8e1ebbeff9cd94570f1d5e79d36112750ce500bc2b05823c13dd4c05f5c2d88d821ea5340321baad6ae0fbc518bb17a000,17f5e8ebcfd37d9d7639489f9bc4bbf313e60d5d45083eb7c9e5f87435852ba00155d28cb98604eebf8bcb43127297234a8b4dd6c482e88edd42f06532f4f01b00 +7c39cc6bcb270a2f1578b2763bcf91bbd4ac53c61945202b95df72648adceee0dd84816719d5aedc46f7be9796d1d65dac7633d58c9c14a9c0e94c78f8cc5ac0b2b8b802c14960485888782fca33db91c1d1ea5e2d28e67b8efadb72f8316cf90e766d07d95787a8f437ed8744a1ea28753aafc72a78d2c794dccc5f3a1783420a666f94e7aafcd318891f1f6e6ee86b5139a1d32815ea409b7cbc07037f93dccc1d573eeb4f492eb95395fae59d99590ed30151676ffeeb02b9f452faf4ac0309af106755c82367facc9bb0a177d6c635011c47d1f72946d34e0d873035f47928e78fd594d894b75de96fec3cb2bac7a4af8307416d365227b030,8c7aca0b7528ca75aadb7ab1289cb7dfb05f7f4264a670738a79cf8854693bed,9555eff9b7b4819cefd5878396204bfd7e4d397b72c276945a7e8a03234c2a536a1d528898068e953ae466300c40b01b988803b3cbc4c21c13964512a83d41e501,d89011957973f122d38ff1f92ac04eef4dd98983a8403f61516819d4a71aa1864f0176598006f392133b222b7af5f4fa731a668755abca2cbd47212f9379883000,dd9c58c0619772b244461fe01d259d8d644a4b0684687df1ae9f345a4b72bd851859a8fa174c15d426ceffbf5046542c1403da267651a97a88665a2caba1f00401,2c0e8f28ff9039735feb0d3fa352b467fe734a3803361d1a0f6f44309d74b0921d67ca812a2062baeb9ae71764d5bfa0c5ee904da3bc09bed429fa9227eacc7501,09bdbb5dc8c80d272bddbea632c146a9498bb664fbcc9eff3662f56ef04d914941db7e7ab587127804bff5f0154c0d0b33cb415d85b68e646838bdd5e300dbbf01 +ffa8e8a48654452cecb5fc1342d6f6d42aca53c3b5046237e44e597ab62f8ea8ca2f7be57bba350a9fff7ee763b90e57e39918a6c6859e0eb407b4d8b78abf59b0ee6d5d530660fc64d02bd52155aed179567efd4dce1dd83012f47e62aaeb0b429ba75c2532a063bff3ccaf14eb9cad6696ffd972581ce2120c2f4258fdfb8a2836d4d7f254b83b5f39a2d7d60499c56b7115de6d474c36b7e89feacdff3aad1bd1bd30b7fec4a8bf5b929467d630be8e009e13b119e04d62142031254c1d3251b7b7e51f0b4b59d10889c35c1033b0157a38740ff57b8d0c9606fd88d26521ef388e122077e6236904707562fcecc93d4462107d7bca057b8c3b,4b6833f33a5427ae7dc056aadc49517989d9a293b064e65586e72f89386f7a5e,9e476ffb2b687b8d0684a964190584b7c8893a79e74f43031e14f193ab43faea5cbbd06b08e5e2de8693cecc18e675134b1297efdcf80120e41841c378eb847101,9bc799e0a21b228161f802d2f9567a5bf61687efe1464691740287168001fe9a2584a7c4e78174ff1c5921d2bf82fb7d506484538dd0ceb7ff24072441e0dd7e01,75373eae43695b39180ecb64dd689097bede76d1dfc4876e052dfcf32081a2bd47bab207c1d6d5be35f5ea1e4d2802c013979074f21d2543bdd119d7cbfdb41c01,c0306d3587ff9629b05cc602ec6ab4a5042e9eb1e75383b1d385a1f3bee11a632f0c2d2f7e18918dac66f636d561fcd6e672b3b89c65c2b2adc8eb3806f1a35e00,465d4d09a243e38d59f35e4599bc015ac826e509456e222bae38f77472584b5457b879d1acfec88ae55ab59b201ffb969a86f278472c95d30cbd7550e523a10b01 +c4041b3dbaa5ae88d3b1b01b33e0caf17e34b0299c567efc5e1a6cf9a7ddf24add510a2b4da63e57e0faa4f905882091ec667366fd29a5be76feba50471380a71549c5b4e34e679f6553723bcd1c8a2dbdb875c9b75b518a4cfeff4d2d720441ddac5d262dc2d786d75eb4ef96e5d0eefb0470c9082a167902000378597a34ce1545654d96356d48d1ccfb1a17d825ad96f31fff3fc98490ca483a1302e00b49bd304f5e5d6c577d85e1ade1932280814d9ac6d7eeeed768e4501b8c56aed444c3c3ac729de6f03ad159132a43016ea861b19f16158bcd297f8a43f96bb2e48d32c74a6d898e9586eaa8815df4de0cb97a5972ce0a07ec3353cfd0,6eca6ddc319740987d03fdf2abb88df31dd632a49503669384310bbe552265d6,f0b0fe61e9cf3f48d46665da8eca70134759984a9ae52e828558db2b10aaea2a44df6505b86a9d2a2bef68e4f46cf6e6844a09c0713903f64317033a7caf3cbf00,9b4dcc66c6a13941c0764320f8f6febe7672dd62bed05feea71c396f42ad0aa03aeb3a9f01c0c0a5476cde945a36daede500d5fc8058789778b5928fbdb05e2000,88232a27de07427e1a9d7d6bd4522dfaa569d3de9731816b825902528f7d23830f5c03db6ed504b59ceac1282f9eba9a76aeb3273f5665c54c270458656a8c8701,70d9254797cf3ce4d410044d4961dce8d28610799c4c3c5c61587d66d23d9eef58019a6302884aab13a2591f20341c9be52ecb99a954104c3057a5291e24bd4200,ee4a698364f554750ef31a3e51c501e104b258e46aed9062856b0724b99a81d57773d4988a690af574e64604c95a1913d2c1ed2a61044c728212d69126a81f3901 +d17836e9223e516b767f9799040c961e0a86f4507e59a63e9924451d23c337e161c235cd228831770d29b96f3625ac908b1e9129492aabf583e13d8e518a6da0402a6c9c726acc62bb982dcb2daa1aa16b68b445fcb274ffff6055f945c3582f35178edb8a0cf22191ae64018fd608775baaa4732a57f803e368bfe61662e74464660b3786d57b85d2e001cc9e3d306f5ac545a6677b399795e699a5ce38a5f718c7bfaf84377ff2d112784127256ce2a4dca4ab7f89d1edae57539163d687d74d7263c55f7fd282742b932c9a4801ccc03fa4c7b72b64f33daa4f5117773f1bf990bb27bde5630bda77eae5149683248706188228430cd2b279f3f5,d9dc925108fea46f57b6e50cf784b068f414b87d3279507af7d4c46b52140361,735af685ceed975e53115487ba09285be565b3e56344d5fe0e4c640b20758a0a08c902efd6b1dc3311c3ab7b5b10cbdb7191d61d1e12bceecc21daa77c74aadd01,90ff7a48d648789f88881501d7ed1fce2c5eb559d6293fa907979ac08b61a146567a7a696c63e3796cde4c818327bc1081f4dea07dad46c02c03e48d03410c9801,fdfb30da1ca9ce2d69ce5c57dbbc5f11a5c423654ca5dd9bfc823326e0b5aad57c559580a269f7a419bf976ac38fa55608b4c55c56daa8d055c71be019341daa00,758179c393a9e707b86328c7b2162d9b26a1a2e0093f3f021b2cb7afbb95196a780ccfc9d3b628ed9ab973c9ba2764706c54c8d4f73b3fd815bcfe0a19e3ae3601,c2cf08c600aeedeec7e635b15cab5ac0bede5b75a2b5492196f2eb9bb6c4058664d8b6fb226e17e3b11ff2e11c3caf3bc6d0c49b5979a74deb8e8f3ba44fa1de01 +e4166dd90415f8892e0f6c8904babdfe1f9801ae33580dc5282ae844a0d8f9198280495f29ca6adb21f3464629e7b6241fc1088d716e6221557d3efac7b2959ecb6eed4771132b6958d05090092fdf3c14bd38a0204596c21fec2ced960f7255c4fda2ecd19cd6d773e667f64751b718c6e6478ec5a0768293a11f26ad6aa1baa9cbd05e2b11675bc338695f1514cd4aff15a98d0128c4dd9b5757d8caa942f7122698f95c27e553ed577f3a6258c24eb4b39b44f3d35a5e6523aef13c9d147b672827f3a4232a0ed052078caad7ce362802507201fb0757d5aa3e09766cfc512c31351fb2cfa2bfc5029de180a6e9a4b413a1bea0b77e7c89ebf3d7,9b40d00492d023711c7d9eaa9be41f20f996fd95adbf0ee726453964a32213a8,fcaa8b7e44ac698add7a4e8b8794c31cd15f13d897be09cf683a39fa4da54bf171c9034e04c10bb95bbca4158b1c3449c1c06e39299f3e0f6e508a57da144bab00,0b097176f54d2520bcc65ec5760de6bdd4ea55feaeadd64709e2f056d8a6eb420a61bc223c2432537a0fb1f2abed5b84ac730f1f220c39518b87863f1977a9a401,2bf6578adf496723d09d061576af7d34c3546103cd12ae0c322d6ffe8c0d006b60c572c1158396922eae7adc643279cf2aef0a0fd3ce55291ab816db916b197900,5976bd41fc3f75ef93b89e5afc20dd7133dd00b0a1e5b1ec6f145c5cd6adafc2137656f70ceb710e82ee1cc85220c38c5af667b2d2a5128178020c2186a1bf9001,235674f0aeda67952b88ef98553b084c7c3071bc56dac5251d1a17b880a1081576064acd8b48d5722b002e61cadbe7c325b7b8d571d70e043053ac7c93faa73c01 +2da2ea4aa1a88b42cc89cc88953765834e2086a9cf47c59f0cf011bd1b6cb8efd04be066492f50acebdaaec869afa18a17731204f5c2f56fa6b15dec30f6e85fb49973c9878e705146adc5681845c5aee81e349047d09983be00586ede1d3442a02a4ec3b94ba709aae651814162f79b2cdad9e1bffc878d10fbb233bace0af3dadd32d53c49eeb8d826ad2fe4ccc37c92a14e0de47a1646e9d342e380aab740abb0888e0f9097bac3f8044c0e026b9d6853214e78dc9f32e9dd4d7d373ecc10627851c57b37a1a526f002de1ddda9898938e6b7ccea532797262c34129af879a36b87cd624bff7b0098ab5fce8a02a81fa77a0730d0802dcb3dfaab,a6067f79d0cd80a5fba49fe0f2fb65539b6583e72e0797b560e34e28fc945bdf,372f762c6d84690dba063511e59ba952f78ea9bc3b8729c636d89e2a33229fe92ac80b2a1c786e232846383c92c374a32dcb301d053997774f7ccf4d09d9cbf700,3394d7cc472bbfcee62581ee40be4f41e2ae40e799d50e2af18fa2150447bf5841221ead4b40fdbc87ab320e59cc2f08eb569f4b6422aba344611f3a3ae1399901,c2ca4f272c6952ed4799fce9ad8ae66ac0e35d84e0180051882a86df29689bb113313c988df32fc85f3a62267ab9510ab4f15eff2165e754fb6488c0f5f898ca00,c4b3b1e9c4250b4ad81228f3e4604efb54f37a05f2714461a0370df333d2d52c6be1479ae7af877398aeed167fa8bb7164be3a176e2e3f044bdc80a94465075100,940fbff62a30b193df187c902d9300c703a57b08791ed10c1f2592d5a9dc76cd69f2ca2a719823391400f9b63258cbb36f1dc6fad8cf6786883be63c7b7a1e9d00 +946f1668b45fe78052a8c64bd89d33a2f06032e2b1ce869e7610e6d6033050d4d40fe521da131e0f7933813b6414419d15fae95176703a6570f519d193a5ba8d2f7fc4578aae6fee6957c6e7a3371409c33c411e863db10fdebe896bb326a34c8029d6320277cdf1ae09bfee09111e05123235ba22742695258db3d82512c0840ce2a9748fdb17178be662ec96067b4db2988f4536bd5462804566426f2281b0bbbe1dab4da6ec50639773137ba5f889e5aa48ec9250b78f8b684fd78ff8b4cdb979ce54b2ee6dc2c976798a787ab57aa88d834ab965a63b22419a58ae428e22c3482e56bf142a7468659eba8aa3a8b03011ad70074edb60798a6182,9c037107ef36deea2152343d1c0169eda9c31e8156b56dc43b59d6fd96c317e9,ae673eeeb4f18923a78b3ef4349b1953214ac0af917e19c5e9d9bc9788c6037c00d020819d1e25bad3b76c6e9d283b0725947e08627f1087adff2f09222f22f500,12de11d1253ee76aa6d46594d7ac5ecf4c73696fb8a370c8927610c443e1ebc73cee5c269aa5e445ce2449864f0c9ab63bbc05bd1685f837ba8f33b58334ca0000,a058e7ecd857bc4fe04d99e4b687027437ddfb0a2b2bcbd62539d058967f1f9125295f2587c535ed7a20fd361968ac206303b80f07835f1deff2643ab3b4045901,23a61257273dbb3c2c090d6d2bec74fb4a10a58363b871c0338568b56095f8f757e368b5b7e158d691ef732f3856d7a82981d0b38d4e6ff5f289e431dcaa01a800,bd89bdabd615b99c673534cf9b35a07d1269d17df3e14560cdb7a0a65a431eea50a65c2367af2b2abfc3c08b49da316aff8febd1fcde598fce5aaf440a80eae500 +d22ac833b17e691b54b1f0799531fc10d200148e20f5fbf74b0282dba6fd7829d279077f9a9a30a6192624505886ab2ef268f60dd8c3bd7df9458865d7b63bdf3950d4f362c4cd2166e2be820e29772179ddaa81f6e90d0495a4597f08d0a19f372e2a2a8a1a5c2b45fa718d6c3e5c8cd05f9eba79991e0b9eef37b0ea1d00b678437611df27f454bbf675fc9dc6571855451ab308bcb00a00072e829610c5676089b2649cc3d845b2e2e13e86a3d41c9a25ca4a81daaecae2eed65604f715ce4cc3578b49fd38bb4c3ef7d142c61153b7b611d8369b345ecbda249e521766aba29ebd0dc4cdda8678921639447e60f785f5150957f13b16803ea260,c7c74b7308c47276e623502f74775f004e237bd032d226721ecbc5ff216aae61,83d143e24af953aab77feb99ff913da13e65bce79271ab310a5bdad905eb34f86b4c415a749d86a4f958f3f8f843bf82d151ddea6fd35fc504879ec649fb7eca00,7b1d2f66393578a04514cb0dd72a450005c7851aa35b514fa1a86699452e69cf757dfe0184f3bc336e82899d15f613faeca286a5a7ccd818d621ba5bfcba1fa500,7a7a0ca85a93be8b52b185b28a04e509a2029963ac883553074f6fdaba3fa40c57eba5e3984b3bd6539f39012b129f9144270375d34dd42bc365fc1785bbd38e01,42955744b98e11e26e0492571223b59adcfa46f1b7f6f74c21be6b408b61a64914dcf3bb86244b2077b30c5bf4e199a2b320da3558cfa868f97ef1537b2065a501,a16c808f30fb044fdb644769b1a3b707eab517a21ad09d77672231c4a428e1e326bc723a37842cbef3b12b2e14d629d55b88710fbb5a24afeb03ab9759eab66000 +ff8ba4ea541b8913d6dba6d97a5f8bbdcdd8f5b69c221352f980e032513c7947424f2388c77cd4984a2160923bc4e150316c8c64b44fca035cf563ab6f16b4aaa7bb734cef2c3a084bfbcd7b1dd83e4550d28afd797943f3e7de0a80fcf063cf0b81d9189b60c378e8d1204910167762b53e1cb5f46ae987c6f7667cd6a274a8100110c460fd6927fe38f189bbf118ad3f9d213211fece0941c0ca8ca54c3e747586d7a83506d41a9bf3e06db7914c30b26f07d5ac2735954efc462684d6ccc4baea175fdf39d1e4107c03292d1febabac4810ff08f05a9fff70c7a324934d227ef99011e68e079db89334c0867dfea69d6d63ab049b57fe499d304e,4b82a9319289d8ebee983ccbf597fd0514dc516e00d39806dcb5d24e3b947979,8ce1234cea244bf6d707c8ae6a9049e5007b9e1a7a7ccfb658c2e2fad3f7964b7263812a1d0b9b9f00f523132165e1611a9c4c51ea1e3df58783c179df28e5c101,747da15b3b77fb03517a03c55b9b48ce5041031d2c2007bdf5c327e454bdddf131f56ae3e8964b4f35eca4d7b275d2c086209f1abfff4ebd35b398c1250b8fa000,fc649151a22ab1a2c67b1c46873c03a668f766697cccdeb9b75b504b143ab69b32c9a3417a0a04597762f4c5b2630a2a3cb6b5711d1b1a81c3bbaec2bc793acd01,b5f379b9582c841c39980695d2bb5c56e9d6f3584c9687c72e4cc0204acbeec169c21b020934a214b6cf89f3e52df0ee6c71a8c46e437a28609ed3994489c0a200,e6067471d44041a91488d03823e20fe7cb0b79efc08911726f6e361934358cd62fad681d9470c1c36d5915be611bfb4112715f3fdd550561aeddcb8df9e6a28600 +110185afe2b83a56f051530065950944640c3fbc86fef15ce2cef0584f01f9075c65c0cc03de87c8e2094c21794beaf2475032bd2c48f03d0ebc634e084aa9222a71ca7a6ed4a71ed8312263e6db3955d07dcc85da27eddad18aa35d468f0d6634e2c117be29480c27b6bf1b1fd069efd8385b8efdc8d1e009a6fa140114f9bc1daf401c02a03695947ceb2319a424c4c90428ed62bc6f4be9d7176d5228c97b61e931f41a76168a59f515ce3968fe5873f4b883622861cfe9dd14d5b214735b880fadb1603fa65ada36ab12543607537fb82614561e50919eb13685641463b40fa6f1a554d3dea613bdc245ac00bc35495902c38fbeb31a3f40ec2c,5894ea5e1a84ecc36d00106c795900773a0713e63effdd334470005b2d2424be,e24cfe84c10cd5e8ba138e8141f7e046d922a6a00bcdb79912728631eaca0fe32e4a593709bd86744aea513971844193b236b3357d14e3f7bf5eb24310e472d200,a999e7d0528147cb45712bf11721ede6655b7a8c29ded9b24f85711a100ebd865d303a7fba2a62365298e10d26aeaee35de60852980452c77ec41e231b9d43c000,138e378acadb85df73d1b67ab90d10e5066aca4294d403ae95bee867a682530a3c4dce8aa30f0574298b3d971cbe995da386d3a166547379271c6bba5b77ccc800,c91ff4cf8f692a8cf32813ae4c564b07b6413f3cffe764f123de4c3924f884b8265482abcc2a9fd052838d9ea4a6a4806fd3df45ed24a6b6aabd1b16ed19529c00,22d4ac118b740dad0e9964d064844d7fe66903a7d5dd8a5ee858198c8511e5a635ea40f784a7c96f31884794d33b96576b546a3c0b702a7cfed3e2739adf74f401 +ab015c562f6fc9043ad7bec7d76dd68c968c65824bb6f8a8f63f6ad7493b24eda2927fe1454b9582aabc2cecf03ff9a2fc0c437cc21172d6ed122eb7a3766afa55917283c5cf9d85f4f1395c2b1d4529cefd2bcfc9573cb48904a807f7befab5b29280ca9edf278417ce7ea2175efd5fd6249a8c4a4744d77438606abbfd1231b3c9ef627fc3ce971e395428037fd611f183191f30a3fac267ff74489020c9942933abb35bc31eb457c4f1ad9a91279d3031ab660ed79bb56163f6adbe552a130b10b0ce161c7a811ac1ff3e3ab647a9324c86d66d50f7cb57d68be027705c1742e268befa64714e5dd409327199c95d5ea29815fe79833b5b42fcda,9b9a2854509f78aec49b46394b140b0febadc23b59afc2cd6a725d9c07086241,277abd8728e4aa599852664e3f2aaaab45db698d34a2feae1b13a2e283dc402051e3134eafacbc1dfeaa21b4ac11a880843da1cf2dc8aba6d0b7f6231d4aa61a01,89373aafe82518604edf291bb18e91c9ef63ea9bde3e7b9550a1f53ce3190c6b13a745eb80325dfe2e093921ef08a2b91fbdaeda9aa6370d8832362994d74d2500,3f6b7e7a1ab23b7668028ced6bb11ad22a018fbce0160ac934d8d0dcddea50782030aa47ad1ff67dfd5ea22fbefd18d003afdf60dd0adae6a28dc79b372d7f8f01,a690d913d3b4fc53e95eb6c033cadc38507de589d40f84e6ce2f33046b3e1abb6a1149ffbf57890beffe68af1df5b68aceda5999d04ab8648fdb8f398c108fd000,c38c495d8b6ffa960d6066858aab12cab387dcab9edf4fbbab3fddd9df20c14c0266ad705a35a7c6baf935c88063364554764d76385501707fc186fb9fd9eaa600 +bae885be826691106c5fa88cbe4b5d5d6acf8a263e254627a38d7c762497bc77ef4858791ec03ce7e6886ec71e9d85da633e24e51b0843d7ddf3829bd4c46b78672b47ca0293927b1eb6efb5a5fec6349608b723bc203abc3ad1c64c363835d1bc0fdc879b4ce9a0766f4dac1cf4937972f403bdbe1c666164d4be9cfdc37ee0d79504c062d423a242c5bd93f99c6439ce8a8b70332e4278bdcc4620c3244dee8029852bbfef1fdcc01bb31ad8c52c5d972cf0ed69605debcde154e6518a02c44e93e738f1077ef07f0166bc24d65674c8be58c51a424a8356bbdf253f9e3598df8fdd645e202fdba3a23959dba26d8f6f0a7d166949ae5878040d9c,f9bcc0a09780af9ff568f8664a57926cf932bb259c0ce7c4382321c02a77b796,a891a1fffbc82ca3b0a6a06bd73f3da048bcbe132adaf3f1c0cd0444bd59cc0e1e6ce7a384e595ecbb10d8e51fc8126d36dee08dae7d17244d4d70780319c44200,a62a00dbca761a7884d2cb406c437dc5a0fda13b92139d3bdcc01b34e71c411756a9d13d151c93dd15b2ae4f6cf6ef9ab1d0b8f46f8413d2cb192e8c48ef297f01,e41edc13c441b9ec4793d06bb29e64bf860a929c867131921951cee9ecd444fd15c3441a6d61fb49bd0595a20db3aca0d1117583efc89920f838ad804b762c0000,f530f301fa42ad0b3565f6f83aa5993f15e7462613c8aea4ff5d6a1694366a933f483c57a84ebf2ccb2cdaf821f578dc8caf4769fa69744ee11991d926866ee201,90adc7ae78fec5b79287517c4a8c7bcfc724392d653b5affba78b8a007d7aed242c5afdaecf61f65095b0c2f34e94823b27e8ac0b8b7c37ff13377742f28f14e01 +510183b89ab2726743d64d93195a66d26f83444804517990a21c7ab63b5d05437fa18a5b1f1f019412ec9ed96e5b99161be05691a7c5be9272e0f10820929c77e01caf90c2bb7e2d04342cd52f645ef4c9f9aca494825a5e412326c208e7bbbc6e68dd33fba01e626cdaa479ac633bb560b98e77d2bf1f5bc329e282db5a34042406dbe635b78ff5311ada22c70b747cfd0ed17a2d54b2dcde094bd0a93bd30104dee91056c47d525566e9fc9462639c14a5912100b014a7977664e58c6ba7674e4688c0596dd43a3f02d1c489e5f1cd78a5f6a29158c128dfacbb3eed97c3925c93ea3089e0fc2adcc72a5da7db1386e53bc8ddffc328ecd1912996,34b7140bff43c6bd7eb9d86d96f4e5a698c59a7fe841dc557a09f0342ab2851e,340c5e4a0b991cbdd8fa8ea22e658c8d6bf1973fcb0a7ade5f4432d548b8d8891d7d757707726bee0f7674d9d3ced9b69ba13e66903d64b73b43a93e6105252801,01cb4a282a0f1158be051854a7ca2d548a8a8f7c01f0c589e1019baaecb51a8820051ab07a6c4febd38e93eeb2daaae44a26b9cc444e69955fcbdf8b5ea1ace701,5dda771790dc1e8718954e7e87d0bff93d93e1b6a186eb05a13631a6c02a93bd3a07d2aee139be371e7ea8acfaefba6b8e8bd8703271e95a1ba24f6a1ca94be100,0d4840ff38f9ffd5c44a907876b6adc628e1d84d1cd31937c7a3c19cb7ae0bf9517d923d6edd5aeb6dc5d106f0911fd9029667d1940e9b20422cc23cd491fb1101,5e1635b34bc1d38e2dacf2228cc11f72fc7ac644c3346d32a29146e41129426f569e6e56c172911c557b89f47d89c9ff3c6d10b843faa9d10bfb72d6a272a7af00 +2620e4b7a10e9c5a26213b10949643630a4e9195ef4ba197753b0d652441799bc8c9e985bdc3d7f483bfd83258ee6ce0de56c58b9eb4eeb5ca30c655c1f757b51fe20250d971dd2b7baebdbc30558fb5143083c922882c6be9b1ec169cbec72709330ad8c604be11d2a7d5d21855d19efb82f43c55a4a76aa412774c96d681141cc4a69cc83611b1c1fa00e2c89f39a704966a377c84d926f4710832c7ab292ebe9250cd9de3ab47103d8d7b34eb109da4e3e1fdc8fa1a1486bbf26c9de3b98576353e08e63e43dd9d2bcbc799e518f8e49b071313fe2f4efacc2f6b42e122c0adfe9e726bc8fe398f39f8004aadedda7e15a807c15075b67edfc82467,00ce86144813cbc28b7c8379b899e151e77566fdfe8e8f3da5c86bb2dff4898e,5cc983f4ff1544417c166b9156f42ee30273ca54b769c7fb27b21ffee1a688353f79d13dfc52391040429397f4fdad8279e0fea07216af3a01ade1cf1dc5433500,9e2213f11d37e5f86896d9c4c1a7b2d29ec03ef72b9bd1231feb33b423927bcf56e17ee8f9722be4db1b2070158757bf3a8643bc20d2cf15f1ed50262cdf062e01,b761f9b5e42c47db2ba069a1c415032cf7bd4d344ab28d34c14737cda88e844c508273ef3578f2da875f02fabefa78e5f460c2818dd27ee6ef7bf1431a6f6cad01,74d02ff284876065caae9c5c3390b51303b7269b3f2f0209a31b84b6465ecadf7e0de72aacd3dc185d7c79458212f3aefa9b0ca635287b9f6a9c573bec35806e00,e86e73c9c53e8fd3831edcbba156257c186311b56674b277c7c613feb64d0df1012d15a902445549f944b3a400b64f5da1b65e71b0bbc6432605cfa31deca85a00 +2d77db274c118c03fb2f49979a4d36c8e0c4403783dd9bb7d940e5b175024426981d813c386cd37048395355b30c43f2b326a973d82b4d01a8968b32b7d896cadc0c6bcae5b2ce6bb082009098bdca437fc9abc0473406dd8cb2600ac1d50bce7f8d6e011595325d1295cf29afbf73a5210eeedec3c717b386ac01b571eafae9f00276334fe18a903d95b6e4b2b586133f9762a3501c5a1dcbe78da3b0d3894784228d1a067e13b1f92cdf94940990568c3fae7488f3ac80923490d14b6b0a9c32b9a8159c88d62ec493b4badfab887d2efa23ab448c127d559527f806f3938942eefd65c842d26a8b6ab6c2d1cc1c856d02a6eed1026c113f7a78c36c,b4453a2805c1aed31d6eec2a56e461bcd124caff0fde3d465fdcea1452013bf1,2dce2f841f71fa54d93de33d0ee2ba1cfda3cbbfba502fcf4a966d701ee6a8a049354a17e8a6d6c7edff472d2a3824a7b2484530f63f2e789eaa9dcf3cdfdda101,75d0a931714f45910ad38ddd4b1a4995358bbd3b6d7209548732eb47bea67ac5513d7a4e765cecb0de2acbaa41f96ae440ac5e14317a0745e3219dd4cd3cb06301,af107559177983e57a2d66b8d5e409947a015e158fb38a365cd3eddfcd97043346382eb71cc13f7096d4e312c6bf2a705cc39079011905c0420c4936d5b3341e00,559ed13b0ac351b0a7af2689befdc342a8f72fac38caf22ab702158c171c0b0e7af66863360304c5e98f2ad79ad10aeb3f5ad7c0909adda3630a7d8b09114e7700,6b598cbce45380195c47a31c61e1d01398a9eda8d7c56481921b709f302f5737717585347aa2fb9b151495e988790a80cfa3126e2bc121701794bf389b2b697201 +917a06b1c6072132ee4515cb034e7e8625fc931e44118871b8be05888440ca2cbc71924c325c9f5f486455e1bac26b59886d2ab53cf489a3f5e5509ac5b5a8131177532b6368c68c941f8912f4ff38d70b82a3ba2eec2d89b664f70bb9a5541a66d9777f1ffd02b2d4c1751bec3588b703bfe07b00a4e6e7e1d58b40dc5b4e379bde5c05f9633e14ecf1c52100994c6350e0dffebe052cd1f3e6462d23eb474309e7f2705de587079e83bb1210822192e9536e79973233d72a6d92fcc712e0caab43843f8b8114b82036ccaf3b1638424ec32051f0480598cb45bc0f2b7f0b27fe5802f5bb01215f44d69756199574eebe0195a4f4600942635db83d7e,478454c0a7910c72dc13f0164e94922adf3880769ddbee3ba0ebba59d976528a,3011b561f486fcf91a40f981fad2db8b7dd8a91acaa5e39d58b61383f733a2276f3720604419fc70c3b41e24103c732f9dd53c2a8510c5a06631ad535d6ac78b00,8c042735cdb5238ba16efd38a3c6cc48f829084839b32958e99c17ec767491a60dc7fa51148e20211427764c34841d6eb98504883e119a1ea73438fbd1f70a3f00,88e7407255d334fd1d694abb3fb95cb6cdb8003ccceb57e6cca212ef820d45501291178b73996115971e11904c13b9372a5f6d00452390a8c32d0110ff44ecd801,087820686ee3ea636e4a01039126a68cd706c4553eec83d31b5a5bf2f3f77abf3a9d7098c240618578ddefea09db6ec7b4fab62e163e7159c4dae9db9c497f4d01,6358fe4ba93076844faff54ad95ccc51eaa0c89d40e01d4de2b1a6adefa5d90b02530ab45be7799e867285f7705f2364ed4c1c004c483d7195a34dc633463ff501 +9f1376fdd3afc952fd20150932b1426d924ba632ee7ab8fc29eb4462a5b69460f8d25abbe6a8098d806c0714892ffb1bf67c1fc70625e6807e32fc9282b8fdf3f3ae853f0d3b55b51d6574f50659aae26f398ebc4afeab5342c001b309b7422eb0f6d65607fa21c8077d6a5c827b18bc73955bcd6cea8e60f5082f7e44c74c36bc3d870ba3ef142d392e13eceb7600503488d330268d26a06b0dcc156bdbe9af1a3e80419b493b229e52fe332c2d0436f7b8b0dd4757a797c52bb3a483705e5d1934e5ac0e4e5c819cae17f1f6b710cf908da67a2ce136dff2798c0efb9a9cb45876505addb1f94c1f9ed093dfb74775bc49317ca5c9fa1ee9b775d2a4,36bf7121b9a9e25f9ef3275e2c47b5cd310dd0e5554e084c1bdd244df7ab42d9,46f7cfb281375a7a686c8139b7f0f32aaa0931e07153b73c9041bf6de51bfdbf28d9d6c2976ce45038a7ce76bc41c5078907fceb1acfce138f79a03af28709a001,12e0cdfbc953991e2b6716efe636263b5aa22ade2f344ce495d7e9a851b2918d57ffbec03c8d17323888aa1b72fb17c9f2a70b513b4182257d02d0faf41cf76901,d64bfe9b4aff3c096e01e84aa793336cdf74da7912937e898cda14abafede6311a8243301050adcffbca1560c41a0af3f0238a964e3b48665a60e2382936293a01,fc3a553801e9a3608e283ef126cd6e97d7b9d1dc1d2489c06e0311d7066a6d5776132fc59f1abc6c37c4164d05e66e82384be8d106151e8e06e4f03d0a4dd3d700,5ef9d97e3778adbf3c13bb25f4114a778b25c678e36f9be71d9604c882b5b846014430a9c85176ecbb3b25a4f6289460feb2f90fcde814ec3241ddc697fe701a00 +29f59c8a233a406568e27a903b8bff965d6db98b6fc950ae2039b8d40625ab0a18003bc80c4d996adecda22843503ea1955c571aafe7acb1d7417d948230b7ea86757d728581b0c625304d1c08f5c45a0343485b399a80ef46a62e53676f170ac41273d9149a4a991f47d71dca0f90c590d430d0a833ee26042b5b4b0180187980f906fdae115a3f0e3a458e5d6cdb140f204cc108694a9a63365054becfac25f74bc978af7b9dff91c20a497738ab1197298095752754f579b31242c43aaba7ef8c21e1764bcc2c0f48c301a302f4c1c309802cd3d1e4b3bc018120592b8dd2cac6556850e466bf99b392e51ec83e04cb08711a9e0149e5479eeff482,4514fa7ddad0bf8b171dad9f69274d22e98e61328248c3a090a1db678e51e6f0,7f8acc29917732c35dfe1ca03cea9fb5f9e44c7061e6f95b4e71aa10732068123cdc01b76b90425797351247806f405a54626e1debc0cda3597cdc1c73556d0101,47276934d9985ae801f305074836c9411ac5f9484c062f47db003879d4d4de6313bec7b70c972c7ea3fd13313efaf068f360674772914b9bf75621755544733801,d2903ae428fc82be101f9188e5489038854104d0641703bc2ab4c6faec165d9737386ed0032f88d1b87051eaf709a2d1c4945caf5ec63af8e5e0999595e4589101,8d0bc348ab2608d312e710fcd535319d69bf54c41e434c9e4a25c2a2842293ff7038a8f4c93cb0ae7d7dfce515e4d613785d56cccde83d4191e3c13ca37a3f0200,6767aa0adb3862eb7f46c59e60e126ad23ca8930d3a687df04e6508c825cd197463f97c7f02df56f7818a0f4b3d45590f90f133446e349788c6c38ca6bb483ae00 +5244f02ee7b28f1f35eb23926812bef5dad8056890b29f1149b46a36310ca01f3faa633010afa40024d7c0f257e5bb218cd730d4bf2d8200f302b77211a97d0a615555231a1091d01a441510cfbea6b4905e7968a8f3827a1c9a71a07679e3141510dd09ac79084b8efb1a768f5a33199dd2bc8f62231f8c2a7c7664b5a384bb5da81e817b17ef46d94824c556cd6b0ebcda914d55164a0c168cd391f70cbc665005f686346edf5e5e57d058d6b3b63cd605c20189d37dcd49cddf3c6f9eb2a85ec309eb73cc6abc60605fb945c52511c19e88d93a4735ad377f6dccc58a9f4ac2e8ce7c1025079f9d5daee349e794d0fdf237d827b1d85b19dad0d0c3,668db4b20f7e6b5f8cef7d1bffe9204bd34c5c559161bd06ebd8726c5ae1e397,f853898ef03f2fe55ce3e73ea6a3fc20705c62448b49da64f188027aba9c8593566be85c4d79c31199c47ce2915d14aac56b89b2755a4957271ac0991c95358f01,e4a2798066d82991e243562acdd4089c2aa7d2cbca0216bb464a47a397aabe0c4d6f01b46c815784cbc6b9a617eb45fb4c16dfb1ef53db53237fe53327db410501,bb2381ab21f3135f6180c3d743300eb5e354c1ea0e71d68d924447244b3b08db1e7a7c53dd1e8ea547df5fddb1cc0a592a844c217682d22e67761cddf54345f301,b830165bd46c2eebe75b1b255341d307ea829596db8f966686a25ede3f0333a211704a76b8bbde111fd35bab99f5ffa15bb98b61a0369f1ac66ba7dffe8d8da401,77c059134d8a4116980a8b2fa5ea026af2cfa4cad6cf87ae44c012276a0581a915c1ed8550d0ff8f501fbef8903a01cf6d4c6d9724f31322cd30e1a8b75693de00 +734ac67e279734e2500370d79d3145b3d14a5ddf5ec107d2d6891b512379aa65ffa6600e89530015460bf2f9df2402ae7b4ea71b7f65cf5f79894bb91694ecaec051ef83d7d2018278ccde7c83518a61baa1266e45755da490e3bf4ff22806f6f981d6095915eba7d31c3bd3abd578dce499911415629235f358f7f5901e6b7ab9bb05a66dea1cdced1b0a161ad6a84d03c5f5335833dc05bbd1e6e16a724f9ff6e685078e7a7d44bfd1fb9069af330f8d9688d2f32cc27d7185a436c5d6f7744727616b706c7c5cf04baea9c1a1f77e8f20f9dc01cfee040e9d07d67c74e7930ce05eed8b4913a5f47c60674f0e145ca7c3e442d98fc668d1fe578949,9a60e84869faf2b8472eb80777580e936c02e90546cef400c82649bebe961015,a25c03f776a3b3d52c01e1d4a35a70e0da510a57f5ac1f7f0a16246ce23f12976e50673108b16d323b660ffcb7a30e59ed22b803e7a876e3837ab57a44e1ee5901,8279cfd34d58bd3d9ab0a84fb64ca63ac4ac4f3bdea4de2220caa144f678e85c584c60fe583a3221051b939eda86d8dc6cd04e38917033b4bbd635ffee4b391701,794e9e34f5d91be92dad6e0dbe315a72c6dab8e4028b4a1375f8e570f89dc0a476e0f12fa4e938262dff152efdfd1b0c12dcac5fd1c16d064dde6dc0811967d800,277cecb8fd455d0374a7350e52b76295e415d46b6345d388312fc9d0fb4f0166346fedca32e9515b32c16720ce2a84c0e17f18e75503bf6018fc953b60323f7401,97a7798886ac0d19357b7eadd62c63dfa91d32951901f7387b0cab67b20336da2d28d5371b380999c895800f1280a78d063bb38deb964a3c5cef5b30f1a9066f00 +d6935521698e1a65cd8732639b6a7c9e9eb89b93d3af520da5f9b74cdc0562082fe06d7235d3a6bfeff5640f829701e82cda9d074683e83f800ca12ee3a83040310776ed88545253fb68c102360d87a7667a6a272f676b8b58b364608cdf0259a99209a9944d4f44297d1003fc25a6ec2f7958e79fb166b4f9b0ee8b4d31971be13073ed51b55a28f1e4278719e31f4c8424014df47ad93171b7ab8c98419f298a7f1b0dbabf4578fef984b442b2b9d1b1f3e8df1776e00dd2aa8344905bb0748d6915930247892ca9432d32dba3c96342f2594f3629cd34755054e211bacc4a9169d12ed2e2d50ec64af499f913b86d5adf2c9e37239f719cd557d044,d314319d03e7671c20a79564f7cf1c75edcf56ca90942272519defc137e913de,b9ffcf5a483ada99e8c332e5e6c8e04bb6e2ec16b0799b65ce30d86ea109722e58afca2c3e0f885fbb7c36eded8d71820243ed66f62e21e26fdb5def637de6c500,11a16855f00d91323df270986c167d61c1935c3a51e1865024cbdd8372c87c24679a5a24a5dd2500d00fe270443335bf84e61b6174b7d9632f22efdce87a84d300,10f39c89c58da6b0fd4bd9817f2a8bd8bf765286e1272737d0d7e576bf7806fc7ba3d8764baf132ce045b8eff7cded6bfef7fce6f29fc1953859d2fbd0958ef201,4483768f75aa7d9c31cae3222d42b4f4cacfe510a0d87e9139d876d99422f9092e58b230a2fecea968801a1f0d05e4352a3367f8e65f2751d8c3231090b878e201,9f6f5c74e2878c1161fb3fdc0e5dbd28de1ec80f8c041ea87bd27692a51448ff43fec5d7a3f6091001fcd65a19c7e9fa8fe6a32299156ef0bcc0434a430baf9200 +582c09da83622a5d89d176b11131645dfef653c67e31fdc1fb8a1d5927ebb1ff3a01f6b9cc5d1a8ff309e35b44cfd037f8685778b39a9236db2058a5c2e9551326426cefa12035effe7345fe4aad7178eb3fa65fa66744f85b523f82d0d10bc9f89cc055821b47d30292594256661a40952ab4ce8b02f70e8e3a79b12fdaa385faed5d73d409cba4b596918e895d025e2ff3f663fd2cf2f1ccf5e6921b7c8f9c637314e7679c898ae9758b4ad37b2a227d2d93a12dd71a6d651fad7fc065f1b07008aec1308696e138797cbbbe23926f30c9b204e213d7077d8589a6366641181835d05694a65264e8ff97f5ef7612723bf97a2c53369ae2963f286c52,aee580a399e57c3374d1f5112e58e3a36d3a77f0e93f48801c72af5e04972a47,2df718b2bb667769241248e2adc3cac35c463f286193113892b015a62317fa96375ba5df0f9c9e9ffc1a25232ba3dd24defaa7514622627652caf3efbf631b2701,b3f3ba66979a99582222491eea6746821e41718af3f613d81b49cffd70a391c7625ae3e565c05db7751d2051e402200f0b63030e6b8c90d3d87e970842e76ed001,16cd206b2e5a197bfe277e94d48b298c737414822bedc77fd39f00b86f0c926b51287b1b2efaaf1b12346709be4ea09ff2774815fed8ed4245ece7648cf392e900,4f952b81efc7cb30ba5bc723e4ccd0281b6739a75f37822ece5096e81e576f8e6f64eddd8a9e4aebad0a7101ed34503d01041cf8400c49e7477528388bf2f22401,50306000e46fa1832d60c52959caff595a6fa8d96c66478d4bab53bc1f85d73f650ed1ba2c9de6a6fd1fb8b056a1206f23a6068deb42facad1876a941f876ab401 +f87ea6556cf9d79f28f0e7f32a24c65bfeb622a228e84216c14c00caa2699f8fd4d4e87e5c02a8d6498c7ad522326dec4ffa77006b5f3fc38641622d54ce6cf469e7f9ae7fa5898140cb039e3425e51c7857cb41da639996d8273d13e8ff7c9d14e57b6ee2a24aa6f4abf643786b544bf6eceeef5ee007f45df0487ef616e44b2ab6226ca66091b23aa60a627b253889c5323445f5963c458ed1e386bd1c69b0756821a2c1305e5fd3523b7b0672d9cc877e4f61bc1a33c6dd0c1ee369b2d8e433008dd697401075dc95c82a088f8bb748f2081aaeb47e339aa7bbd7b83902976a20bdcadadc3bb350a5609ca6df996de7799ef19a347025b26cca582b,e5ca9be78e97867173ce54f5b568eb4abcbe8608ec70ea9f32f40bbcbfea3332,dd31e5e9dedb61f991594d1bd6ed42dcb75a05bb5abd4224383c66871132b57515afb4167559a8ef04cd4e260ce91a3097206e74286595db1c53c96cf3d7eee501,599ee083254f1c621ff85038e515cb72fb51f1b373ea3ce2fff84f75a84dfd3b0cf68c40051f251610d160e8b19467f0483de0604ff653e28dbb63f22163d76401,a3fa159c4a8dc2eb13072f85083ffe5cbe571beb1aaace153c729b71b785fd1975df8e97c043e946cc66639630721955c3ba1921de6e0523aaf989e56374506e00,f28b998f5d699d71b4dd74c463fcca41650faed6fbcf44854b50d9493ec545604d2990cd7b71002b7c06417356cf5848e5564105ae27f93685c34d2247f12b2201,d1dd420139e5b9646511bf154e95c7a907f0122aa81e81f9ec8b2b956665b277749e2934a7ef457703f85226a5457347b919d9228f1e125ed0a828f1d908415800 +d9c373689205929c913caccd25ea0ffd2a78e8b1329731de421d1e6c38b0b321e530038491902adf5e4b18214d01ab9964e269017f24ec315f3c81669dba55080cf690342adc0f4a6315894a83d765a6720137ec1cf03f3272e962e66338449a7e271b88549ff546f35e9d3402616a925cce119753271824abf67acdab2f97f233b575dee9ec937354c0e9b7c6185b6e539ef2d04e21dd6743a2721dbf4bfed90c6a3d404d2d9d2896d668a6a6be6ab001f65d6a2ab406a774a91a0d677f2953da1241d1cd3c710978031e4ffa7429d7c531832ab3a7c9944c5f86237c3c2b2acda1d0c0084791d2c7e3e24b4558e83b4369b7e295c702fe110eac13881b,a1cc754db28e45b3cc5deccba5f86b8efcff30958ecb7a7846585c1eae755e89,a149ab7e3f943c0d92a685bec4da603323525006d23a2e7c4d35158235889e1e505b8f1e7240c9f190cabd59738bc7b1fba30abfb6076ce363c39afc200a375d01,292a3b409738447e540bdd864cee297f7c396b779c322faca43b589f26db5e86635ea3e23247576c2166a6651aa6c44da5ae17f67eda4e8c469abe507fe5d47900,bd1a4cc745ddd0d75af0fab82c6f9a99b178032eaa5859ba7531a2fa7efe40e07f56512ba4bdfd6c7c6d059f7398e2007326a4ac889d180b65a2af5444a65b5e00,d5daf813438797a687ca9204af5681c9fb5786f6f02db6ee59591ab08ed31ef6246388748a05f67a9f0aa184bee2aea164a9941b7da74b010c48ad93cadf3f8b01,e614562eefa2d85a6d6911557ffcb66a8ca1f87e1bd0b846f11ba69cf1ba872914d721510eb36c1c826c5e69ce184bd750b8fd8ec32518bd8b082e63ee9682e100 +08363e8c95432a5d6811a64d1d76a4a607df2b6a6fd6b252e791218caf7e96783b463dfb5414d178b437a2da09da732ed67f5c5d808a8ccc42b40171b1df49af7631bf1f790e09af799eb5236aca02d426d145cd451e8d973725258a984ec8df16de022d0e7d62ad40a9c5292ba961c19ce8cc2ae2c22cccbff51dcabc035ffabecc2dcee78ca076217fc86cc3c21dc3d40e04fd875900ff52d3c392f4646f501eeb3dc6eb9b593e63b5de2a117bb76d0ecdcfa80d6db311144c12847eea2954c6ce88825cbbc709232503e2e4710f137d2e2bd3ee127ed5c90e28493a07359adea0e7ed20684acd5a239171812e02735d89acc066e60f8b445e42430a6d,80bcd739bdc199f1271f52e47b42794644d052b6c58a94b4a667ab013f7b462f,69615122601596d8544d3d485210f94be71a332d6a277c66019305a351b335c71243acb15547b4f5fd00d0de47497aa4747a0b1d32f8fa3186163725b78d20ca01,d8853d1dfda65bf2b181c8179529ed437cfec5919d6e2e19ec0f361a46991c1823ceac201dd9da936960c6e8cb27cb972cc1a60474329d279b2e172d38f5fa3500,a2ad1027a8a0af19cc8c3c36133ac40529007de33357af137a7ad41c309011d648e2fd3e16af05d10eb9f59acb3d094d5eab47342c21f620bbd73019bcdeeda401,fa6762dc1d24c7e22a9103430406497ce95019cd74134891adafd0b7e253d2074a8aa2a654c111881cb88b294990c82cdb1a489e7e249dc5c2f18e1c46ddbe0f00,c7de96a5c546c99c6f59c3699fce2132f2e0b23854caab6d25f084a8bcf1ea752b8f1155e7b5c764a4403507b1fc5138ed3c864f6ac59eabff3564c3ddf38b8c00 +7bab9d3adf7a5c51eb4f4964a53c264c9b128c61c94d6c6578c2017da5cb811d80d5de820183092b8e5ec413bf23ea6e98f592cd9a689fff15968143724f43e2af260a4b2cb1f06496cb0a199c27812c37bf386b24276f6b32ffe7f90ed4a1c86d8d80d98d4ae22491986a96b892de780c0bf91f816ab832b8e238c685339d27ab422cdb807f7464516d19123a77d4a5f8269783631c430e0e4d7536a55022ea01ff25294e3c23a41ab9bf954f7a10b398474f05fd46be229124117c6f84dfb56aed00c435d9ddca268e298727d5b1e787a91d9a1e636bb05d978345960919c43903f55b15c673d7e70f200e3686eef5ee9c78c149d5952943405c721106,ca793cc8fb4439b41816413fb1107f4e019d9619960795576ec1a32f34c8e400,4102f862aaad7ed49e07e51a9e565680137698fbc8dee0ac7aaed5545684347c4d1b86d403a37158ba5c9406299cba8d61aa40954370422f9dd6da33c8fa769a01,99a4f3542cb7dbc97cce16c8f9d91d1c89db235ad1ac8a8b6bcc05952a201a533b8edbf0a43273bf22563452d969369754a743961e4a4c02db51691cc7500ce900,bddb3d81f875c381096c2c36088f68c6b36d062bbb4ee84ac8729a26090e274531c65ab77ebe1834d597ac5ee6d29c52695e8abc854c28abe438c26a77aaea6801,35d2cf10a93bdbe80810b558ac0357c5f26ab9d2f7ef10bbd8639b4db2923ea315481b945b9097f0fcae6bf56ec7bf03ca6c5c637c9797e49c6cf30b4fbeac0601,96bf619597d7d2bc1e65e6b5ea718c7a9abd1e1a378bec2ab8d828c4175de5f72b41c264f54e13795135a0a2fdee4b4d53eb3f6699652d1d871f836482df283e00 +8c57d8fa2bea6d74f1faf0235ef7882e7a2a4797dbb274128c043969cbcc70afb1d357b3a56715d273a15af0845241cb9c0802f2cbcb201c5f6f706e145ee0c553b1e5831e237bcf5fef95d7cbd3097b9b94594c34ff8ff80a90599c9d343a777b96387a8168d87bd530aaa83ae84dabfcd0c95a64f238be8f24f740b49ac66765cefa9ff0bb9a58047154404210bd05b41e7ecd5333c14225a0109c0a2c098ff68bf5e941b2c67e144bf00eb161ff2496b48e2f14d84f05a073d5edf1f6493c403ceec33a951104febd39f74d61367365d1d1ee7d29818c4e6b4cc2ffc36921e590e32ddae3ab3d37efb1e356996fa14d00879a2a2b666b2d84dd092761,ef7e62bb34d14df35ea6d794730c9b855627b24e6d79709f514d706e6a3b8366,8d1980c26d8332a5ebe497bfbf106fdc6b73bb0dbf6121dab263f44295e3f40641a2b0ad87568629843151784af37393a2d353e396f961f749d9d11534b6e69901,10c1982c60fc836174aa783f0fea35285dff0850fa7158208e8b5dc2b6c9987b1746e713863b83d3cdf092c6a33ac789bc6352e2adccb3e1728ae244f498851101,46e00a21c1637055b6ae462eda6f3ccddb4e97ed6295398118592e3f47a096cb2f4f4b1c22f6d5ee4cf4bac473487a8c18446840a9695fc5b7d039b6aa7241da00,696364e7058777993943260093ce22d6dc6c72765d30aaccfc392c6dc332761d2673c1b45638322a780a0ed9d7b1cea20c939d8c2acbad735779004b9eb0854e00,541f98e18a3c72349956cb799810f797e465f3c33bdccb0625535e8cffc2dbff1b1b2b400da4b96627b1d22fb251468f322b9afd99f1b1da8c4531b70c7c84c800 +7bb2254b355d37620357c567fcc4eb15e5bf710141ddba4f253bfa8900b954a66bee5105dcdb6339da58bafe33c9932f601f6736b2a08adde34badb3089784ef26bc43f720f4857639a4c4025190964136d4c856171809498e2a39c2e529ccb3a22fbb6534a22afacc65bfb0b7ead51ac724a32fc84d30585f25000b9b873543fb81e3dd88a3ac172ed911e251b0279e5f9d985353b132801b9fc9f39734c1a23bd09e74a0ac8b66d24da502fd300508f6da99833d52b8681c58d7142d0fd0291d33e0ab17c8f7dccc97cb430e61cfe0996990c36fe250a14771ce04462140c2429ed4df163dbe32ee88679c897c061fc9523d46539bcf5240e13360e447,1e2c2e3807a27d8392266373cb108154a4ce4bd315f448efd9399ba7776fe564,03611e667ede7356e831b1290636ee0f223c72dc043c952424e108d4271854a52bd38e5356f5d75e1ee9b323bdb3686c1bd759f7f8b0d0b8cc3dedc21ec464e200,815dfb6c36cec15e8642ea99264dbc59b2c608ef63ad8d473496e7e528008ca65e5693b3df56d324166bd1ce6fab856177a22ecc4b1a45fd89ff3134bfa2b42c01,158ade84221d211e564456d9487ac56a95aa50fd9f87d379eff545779cfddceb01e8d855cbc1458c09294ab2ee1b48b38fa5f39aa0b967295ea937cf2818575101,197e04d5473c1775fdfe2ab4bbb5336d0acb2010a1625c148b279f9922fa9c8c127416997c71782424d2dc5c4fb941cf8641284ddfe0d41f861fe9ac844fdfd500,4e9fdc4d3290d4663871f1b6baafa2d125e6f3874c9b901d158c6034291c66e80a76b198335df7a0f3cdcb40996f7d92015b3247a9f2b828a285a9a47e48a90100 +2b63834ad6058fdbb770dfdebba63d41c4d6020f7e7ba3fa3312d923552b6c5b852a27db41b2b30fc360c6899bc32c8ee897201081c7d74dcb94c35c045232bde79ad71deaee13087019ab4f4d1c94f9b8fa7b51b291595eec32345550ca3733fc7dce9e76430d93950e7b7e041aa717905d3eafd227c266550d0c5861c3d2e7bda7ec53ad3a054d1996b48624dbf30ba420989dd2ad01e35243cf107ac1c2ba2c13ca158b1e779c50e98da956b530444e58abcfacfcea6f6d95aff91efc03935a940a2275b6fd0fef53a78b450f92213d75a9793d25f30270eedda879eb612a18b101f7421bbaff08139e44894459832ae8785824a5430b3cc694666b29,0a68e3573c034284f53ff118dadade57a4874aac94f4ad8cd9601d686f48c060,dc0b9a01ae09431c1be82fdc5025aced4e4dcc732487716254258f625f0f688f5af749587f83bd00828e57fc6d6acefa4a3caa1d7fe70879586153fa819dd6be01,38ac429096d814954f0a359c173aac79b4e6fefcc7fcf68fb2af32de15a53af575772a0708bb84f721d1d239216e0b5116ca434e93edfb09d196ad44c58bc42801,5da04459ade766da30eb3e1d0aad1fe77958611daa5ef769ea7df43b63efc63a3ad0a9f154b894b916534a0f914408a93d0f8153a315be0e2ec41233d901ff4c00,30f98b6c7e311d269d996d2a12da0c3e1d2d95f824b479a9e5b0dbb08e049f1e281a69e2b9d64e1c8d61da5ffdf3a71f950e858e93d95234aa07d5b9b099fa4b00,90fa379f051fabf45e8e5f490de870bbda8a2e632cf969a15d0b9a75a191cd846aa2a67a9a4d4dbc3ec792b0308c7e84b6ee5c5ab79c96b6f489c28b9e2a202a01 +87f746a1edbf0e87ef23fc00afe140399dd116907456b086b1651006628ab9442bb520ab4b6212c8f5f9c3aa79f3b64c0d88e56063a0fe516423747f8fc249aec975b1174b1ef1150859bb2124b0db402b368df13e03d6c38e612d47016c6bb17c98e436812be9812f9fa72bec0e3edd8347b406842da7f359b9d323c42743e069de04b8b5ed7b4c30ec5cb813a8c8cd75b806ba938c8aaa9fc0e3997db524b107bd5ee1732d6f15b59077dbc398ab46423f8513146631883e061d124a8d813af41abc663999a6a5bec9b45c3964e2ae4f510e5b0aff2ce859f5bb513ff0522bcac432c4f9e68fb235dbdebfbed7fe225efc33d8f86d5bbae6035d4c15e7,f7871290339603551b11d0812f92a86795d72e97bbf279741bed9712aacc3cbf,b83b88cebbe324ac53e9bb321b91832b5d79217357954a15b175881f503085f560997194fd5b472fa200fb3549ab8198e045d6fbc48403ed179197a06db8967401,b57e86411171672a08cc01ebf849eeddfdb9da5644dfbafb988de47f4f033d01037f18799d8d374135a6ea48c452fda5a640e9df778953e59c4bfdbcb5120c8401,25fe90b805c24464d77ab1236192dd6488bccf2db18855df7b72e2cf8ae12fa916ff681f4d1610e04d60567ad8c37da7495aedaf3492d77279501a7ba3903c6800,72937d95e0d67b0db4d347ecaaf996d896dcbfff3b4a3ee5130b24d2e485e1c34b5e6a8c304a4c3f634a9a5cb87a01cde216025fdc1f47b07d28ecdb3d91984100,b41d34e8670e21158775c85591baba27f6635454d32ab01ee515fbf4e98060b130042ae05288b26b356a91b753ce38f19a6a9957d86c9d9e8b841eba037b8bc000 +36108b7265bea40cc02ddd940cbc2ff3448d281e9071e7df0cdd307f5f4e72f3b10d882acba84bb21204819cf5cddde984d7b893f113c35b68d00090d63ecdd90e57a86f5d8dcc4c7002a917a7a9a1ecc41d2f11224bbf53f73776ccb4eae4f858a5f3f86ab14cf820034fe7be93480f42a41c2e53ba113305f8080d7c0bfdcb96f3e5a2a07a7ab52e9567f6896375672310f5fbf4ae04043c985687aca28062e60e0f8dd798e3bb05d00fb68a306cdb721a945f8801ee8f8320c803b50d10d7594a88dc0a480f7d60e429ff0f69c34dd12941b7f35dce00d167ede2f8cdc9e148b0746013bebfb678df040b530ce55f96884c9fb01bf63903fef0796434,99dc3640b9288488ee8087cde20608f52886935f20fd100753904af9eeef9b25,6c4547410897b0f8a7c6aa8cc68f45dbd59c3f4e927c3f1310e24e1e92528e250b755190f8b4a4a76791e7ebdd4dda680d39a422271c63fff6fad4ced7ee5d2201,1c49f6151a5fb49325a2fa203b16c3698c04280def409f9c394e7b2ee1ac1ba30425bacba301f6c07b51b125766e3fcc03dc910de98d6ffc5e0aab247bd5b15500,e205c385deb589ee616d412c01111ff1e918abedc95995bc0342a4c895a0270953e2a2b0792d4c52691cae947122384ee32c00140be0483d5da6d8f1bd1ece3f00,413318543c3099c96a498984c78ddaa20c8a07bfddcfadd3f5ec47aff5aaddb82b92035282689b79b99320af65d0e16e3c45eed81106b72cf73bdf37e889548b00,dad2311477ac9232781d4cac2cc4f471ad6578e1904d6f2e3ea364d36b07fdaf359ae75e4eac8f264428d5a1ccf5e4a65c08a8f0d5fd4ea29ab7f4299b9c98bb01 +767dc0f1d2a0c74f51dcdf11f7c7e01a2d7e3f09f6444f826eaac83b2ba0c4a34d7a08d05019dcb48e2d0887ca81d97d324c5b8c1a19fcb265a937eae47f16990b4d9976515dfc797a37056757842763016dca57562f77c30f18fc1379f7c3e45c0578bd19373a29443ff5d3bfc559fb9388b297ef8f777beee2d749a2d590ef8b1ba37f243ad8951cc5741a17e4616c755fb2c09d00e3965755fe786f081f5d81778483db4560cfe3246716437679f13476457704faa9dced15a32076a3f986ceb2084f21b00cbf097ca52752eb66b5349db9725c0e963f5b0b3e42ef8c445670f7bcb933020bd3c06333dd4c031c591ee46cee8c1e797d6a92c3c97918,05aa2ecf17dfffbf6140b8003da4f6458469d55d85eaba19cf8d4d5e7b8cff00,3f54ac750d47c26e952ef8c0e7ba5df2c42ab6f16f0d11ebaef8397f0f7075c87ff9f32e6c7904ee3ab3f4fcd3c6b6ab8545b056a12d6513f42bc23c3ed21a1801,b905afa55eb94cfff84bfeb3769926f9885511d0ba5c3e01205eaaf2e5e00d0d3a29cf999fa72897fb6da2adbd028dbc6370b6c62f45da079a2c4aa80d52679301,2fc31af55318c007cb3cbfb52d63e96d11ab0bfcf31346f4c6aa8ea3a2c43e696b1ae188a82a48be7d4ba1a84e8c53e691da7332320b8a761c3d44cacce7775901,5bd1e070209df3240bc78f520db773cc2d6c25364f940eeb9a54ce4d94fbee0b4fddac6bf55b80e74c6175a65d5db6c9711a853eea9af2a8c2ad954d8b0eb34801,15368a2a18d6d9acd5a0c14e1fcdc1285abee2c09c1ea3e153658389e268893055bb83298636769d36273b14a34e292ed9ffe9a4230a0af654ef3e6a5c64e68500 +7d4c4ce758ba31ec0759e4d31783a1c18c1365f2f842b81a5b75383d3ae0ea91c48b42ea877c029d6da81c8b54035fb82bf59da34bf6a24ee141876f87966fca010fc7754ff1372bc92e2945efcb8a58b8cd5f6325bc9d5a981378d61007a50fc7e9508cb6fe4f4c85317aac8d2c41c462a9c8147e7474c5f93b056f9456dea68e1ec37663365f06cde90f1d4192a2d1e71f300a3b5f9e3b75f9591ba11db1655070424ae4e61fc8adf30fe94322ea5633c4a2c4d5b1374c6f08e8c2e76723a2854a5996912fbb379196baf0a2ee2f04f3dfa9adfbb5d73001ec1c34620871e36000fcce4f305a7adcf4d401b7ef200000f283ded1d5f59d96fc3ff6dce3,5003dc7023ef13307b39dd35e7709280b6de32b8f213a54d49cb064c69ef4659,9fdf166b68013ec5bc7be6e63e93c09c6aa922e0c1920e182b175dd3f320448f3dd2175fcd53035c7381c2575eab1eef753ba3e4f246c1303c2b3b443c28e93f00,ffec2afe80a9136dd8da64fc6c0e4b60af82a407c57a3b772e87813f5815688d1755144f736fe10cc6b780932d4d7c4d56601ccb2b7d49fe9d234defb072b14800,4ce573a77eb84164a3301793d7f86dc70198d3c89d473b255f7c2017cf4e83a74d48891d01242324e830c590a84e024f1d1f89775f829e6e1b774a4a2cdb3fc600,bbc55a6701b8300f33cf49e458d6f731eb4efab547b5dec51349cdea155e679242c01e3df2ccfcfb2de30f6c8057b5645414a4ff6ec4933c16ef84d17293ed2801,aae22ff3f59e33ba494df406ebc1b1acdb2bfe42baed6feef6268c5557d70c651568bb9d1dff2ba75df36f1184d1f7b70f55b86d37843d9a9a874800025e5ecc00 +069b857f95cc1e1b420a7258f6dec7081257d007fbae721eb37a66d8b643cacc0a8f2edc755ee68895c3c29d8801e0f1a8f47a38f3b72b2ddb9449201c73c359fd5b9394c1692e7a4610d91c48d9740076eab9fe1f32e7bb26f46362b05a308778987c17b9a3c0676c57fb3aac9e4da43deccb64d4780153a939af25c138b069f07133236df86994b0f63bfc860013e0945d6511c5c577252c8ad1bf735df36ccea5d329b05e9bb0475792581d547c372a3ee73dbf5d398a964f2e2390faf33ef7e9e10cffc209da2f6d0fdca010cda6f623d9b3b7ae50ba2b58c1c0c70f8d626570b9abc9af36302a907f59a4cba8f6a187a34d7cbd3dca37e14516106e65,54152204c250568c6df0b332f6843db4e07cb407173ceea640e3c0d39f09383c,f061d13784601a3581b68c262afc39a7cab65a6f1eafffb61ef44d5bbe292ffd543db7a57dffb43668970917fcb660f09f05ae17f16e2a744b7d6f9d309e2bc000,658f01254c830ee613f1e1d103555dfca163a6541195f8e1ebd5dc644881ce1d257c478ee6ff62560f05cbea68f48e706a4f2e8c345c87cc5d91ba81044b27ed01,73a8a72cb3c0d413487d92443be81f333a92afd8dab5f65ea76d506c75e258885c69091ce59bf300d958407b1c060668649fb806232ab2afdbc5e5e625fa746d00,7b9b3ea43686d70022ba3d7de4e6fc8ed496c41c0e6c8a18e50670cdfb9554dd733ce0aaaadb33d2c05904fb3599d518ecbc51da64530be0e6b6210615dc430701,3add051b4cad329bd92e43c26671c07276a5382e8626a4c66c0df0244a2998eb764439377e03da772187083b7c7892d0bc08fa2683dec1da596a7120b97d65fe01 +24ad131b717ce0385e05b17bb8734e1778cd29ed9bb8a64b54a17df1473212a96121312f030c43ef10a08843ffbde4e7f1e1389971058376e628f51965a64645a5a9281f4fcd7e7ce490a640ffc2daf3ac53791e57797ffe5a98dd2187143303c93288e69e7bf80f79a68dcbf84ee7015a2aebfc319a47b4d3a70d5bd8765749a82da58735dd984ff8fea77d1cebd3e0692055c0790ff2fa995f1e788f643bb0e7483c380590d513e7c062ddfed81e9d72b1cffcbc36673fd29f3c7924a03b226dbfcdd20ff7556c66b04b80c9f0083cabf2782fc154b27501a9c9336b71ceef462f5d658b0572d463cead92423423720ad27c3517554ee7385075c91cc870,5faf9c8a59d33f95e3397bb501dded005799d269ef08a2746c7f2f9b980e34ee,2c7b0c6164a79b570d2062f812400758a0415f840556f341eee3c5631c139ff874d43dae819d1daeac89a51fcdde2c8ea9c57ef0c6a7e169fe3a5b761d74276501,73e3148fdf3ff955b3835a0d5596a6fd1e8a1462d0972a321adc97d7767f90031ea40581df020a9213fb4507e8c90b11da62607dd18bb63ab8b587f7d3bd117000,611fe62d7eefcb0d31546b4e533b2261d330b100f513c33cdc6df73fa404c5a2349dceee0434f1b2dca988b8d3fc9bf63e7784cadca39f35026678f785ef5e0501,9fd6805cdc9613f445cdd9da597c3d987dab699d1fd6222997e0df24e7b0541655423472ecdab00c11738640b412d134df9405de8ce8b4dd706e054c599c911d00,6ddbb7747031be1b1f3cf68f8bfed572b44d6244ef7f1d0554f70be419c5c56a04846cdc075812de9378b3db5a7cf4c14becff79dc58e795e038a0c899f03de200 +2fbab2aa323213b32a154b99b130675c92798dc34773ade6f476c07f0de94c3643bc1a3533692f344cad31d03254d82a9eb7d937bbea32c2c9034e66ab3b1e39a20aca5da2388eae07413ff9a50e507f37c71c458f45457fee74a1580c178f6e07e9775b1e4a7ab136642a61f58de1c3c43b15919380ad8bf141ae3bb68b68b3b8c3867fbc6af1c59a813044f2a3b616687ff538844af3c706a4a23f55b2563a92054bb4709e381a04dea310fcedf3e9b3a97df03748fb75148c769318e1437d55f5300327ca96bac9a2db2f9bd3091c9fae63bb67732191dcd65163b9f2cdbd55c47af3657b4770f10d37176a0e4f0838eaf34b6d3a6ad875a88c46e4ecbd,890f885cf1e10bd33f85212143929b6b0bce5d01ec2c27b43bf816506ea6a820,911b65a8532f134fe780377a705aa4be666f0b624bcaa13b95cbbfe1e2b8116c25a34334830ab758e237350c291b647fd3ec5bce71b1490529f45198504a969700,728c1ac1e566be74d669d48dc0e655d007bfeac6b96d42a6ecbf6cc93da3808078cddb56b0e9da8d07d53bdc0cd721501c14962b12671284ab67e76c6f9a1b8001,c4426c390ea3e281737581b4de944e5ee64eae276536ed9ce5e73946d4dee539200c26fd5a6c93d01386bd7956b3b6cbfc3e96318e83690043bfc5b5b9bc693801,40926efdca7a32b2d8cd80a9ef3eafd801bf093b8b72a2692de8104487b99a9013544be4635701b120ed1de671cd655e918a26b2ce7ea61cf1debcd13019c2fa01,5131e0fca4c95f5b663d491b4ba34ac2ef5782c5b7e9a28f0f6b34c500ce79ee7fb986d076f0116411fe99e5ea9b46e7f9f310fec58dde0dc7d63a1f3927475a01 +0f82ceac9620a71fa06eb500dd7caced29353887d1a6e547002ae03f10032fa4902f30f49f4c9c398fc9c62c643a13665fb9d94d0f28175efb5b9915c676d58112514aacc5233d42ceeebabf649eb859ebbe740eb7c9e43c1f1e16ad9d6b482194c85cd0870b7ed65d1a064c6ab9adfef2807035ed4a4e0e2229205b78d31db5b6eb9934018f3f15aff6a2bf14a29a593e42fab92587b66dbb95e17fa48c0758a1c612de1c1cfb7615a9817ceec9c967ab97679dde2f497374e94389d3b731191bb2d862e0a7b046656a55a422d3ee0af9b98b88a9f44f2d2298574ca3ebb930425f7ac927b1d0efadd21f745d1df406875e70a5a24bbb27e49450c2a0731d,75182fd6d5a64a9bb22774065ebbbce4062ac9cd330f3caba4a9b65831f66eee,2913000488aa10d1d08cfc2416645c552b334e8cd05d0a09b093d85a61e326d159fa5038708f01631f5988207057c995c658142ce5b6be71ae89ca13a1197f9000,aedc65c98ea77e126458e1903c2e99808582563914b9462ff5581695deec557e3f93d30db4021f62e9aeef984f986e5d9ad27170e924a3b22385017fc113a7f400,734c8d39ba736e393f77c1e0a3f5ae6adb058237fbc72985ce2218052d9460f460172e93edf2e322f7593fb57e79f8000ff18955204329d9efab0199ea77636901,31dfe37393936aadf4dfc4930e38444e4fd2ace91a31f7fb126e1378481419af25ac86454be8562309dfeb29f474b95b3023952869dbd6dcca850583b20ec39a00,27a7166ca53bb77941b293fefe0a1dcda1cbabd56a05b1aae9f78fae8cd045eb1cfa3be223fa2c106db82d915be045c39bbcb721063e0adfaeaaed9e0b1008d400 +3e6ef2b894d069b71453f00d40e1ff51fd2a585857b41d24f8d86bfb316bf43978d939b5bfc672f606438fb508c84557f410ab9c2b687cda9f1135bfb38cc9b28543f7acfbf4caa374ab9eac489cb792fe46c634d22e6c87b5251af643f8dbe5e4d4ee29f0a65b2db49601e44827b8a347360ebdad07b5d02ea1908c54b2d328f42ae7ffc4e3537ef7bf1dd2ba6cfc3c757695e5edd3c50ed757bb55b7ec8de33295d3eaedba16009b933f510c49f2f18086e02ef087a728db5e021b33ef2598f573e5a67890214d0b10a85fc06623a467aad08edf9dc8924f343b06492a41ae247decd8f4b44915bac4472bb45da714a906fde3674589207e85674cf5c259,4c76240ec1abd5d9cd1146d8e728a67342afba42f1d51df3c457142c407836a8,0aa7b3d646a5254277cfbece08b6ab4526ca7ba9059e992928f0c4dfb7b89ec55ca6f8b209b6c5db4ff94e1cf64a56a7a75a92e285f3270deaf7e761559a57b700,5a469523a09464c72bab2241983b3f1bb88e07c832df9585625e1ca01c77d03301e12fcbd281bfecdd97a3f9ec8fd932cf36d215a757deb7d11cb4dab581371200,77139d7c01985f261eda3969cf0b3b63dae8ddd60399623f78c9aeb71f053fb1248d683ee2577560ee6ce78624828abaf29ab4525ea8ac5aa15f575813ee9eeb01,bcae4665bea6d81428eb2dc413e76f22e2642fcf2225f46e16f45480c1251952225d5386a5437c91b368f9c11bfc8a42294ccff089025191fee713c6f303268300,99d71921205b956e62961035b86ae78585e2738dfa83451f72dfc8f22fe241f0796f70ab3f5c7c01de62d5a1475da78315139095e392da59161a6a903a3ca4d800 +7b2316a944556df43132f7087144e9d2deecabb4a69d354d7dcc1edf6ab1f7ca92e67966e1e3e2097b8419f6c1c5d81e689c304446c0a47f3a962dec50c03994a8f030fdfd96e9e023031d27e967e4ff95641ebc9a1d5a8a300493b51a208297ad6667e11aa4c426ca8f3afb3c17ee5d8209640c4c327d14ca3311efbaf92c2be37d064909abef111d9faeda1fd8eb8a9edb63944faf598662c62fb49e1ab67a3fa9275f096c98b97afbb56cefbda2e303792762ae0b3a8936aff2e4db8423ad92abedb07ea4e69d23bed0b841fd278198da5bcd42761750dd587b3fd372313ded34268e8a851ba69a64b82db74f28d6691b8c2085d46d0459fa0f672e41c6,afa5a4d26ae612979ad941f0adef086ecba929ebea42b0b9f079237025c6982e,56ecaed1cc656a0d70272edd94fa4a62659f9e2cab4dabefeef1fd2dc23bf2df3d3c54cc1eb391cf5d2a55a7a411ffd94c35a50c1633bab1ecbfda8cea130a2b01,5c62ba89f7cf07aa8d5e0bfee216c6848953e26974b8a27994dae72e3329d0ce1527fa873596036acd2b05c03803ae73b8b506c13e2de5343d4866fcd84dd25700,799dc725b321693346211fed39be04aa92a52a2abc7a34a1640761b935ee3e00148e3f1cb6433d29fe00541328885dd48105b4eb0f566e56e0356cb5cc84244700,9692f686f9190a09f97c77dfce0d34fa03897eb2317253cb1b098b19ec65272002c4229684871cee6e112bb0fa882722fae2c4361c16b819cc52f55eb767352701,a692eb62c493f5e77a50ec7f7c706ce5ae3d579f274915a1973152d55d8ec852716b3ecb8667ce39d5b08c891ffb01872f708ace25855fb57eadad3ffe6013a500 +e768ee1f8753df68007596786bfc9fca81d3838a8527b34dd97711349cd11deba9488205762426d8aa02f06a1d709e15799e4a8ff7f165afe703d728f81c6fdb83f00902db5335a152b26867a852598fb4141a0fdff6a245fb10352abd6a65d50807dfba61f8087e579644cf2c59716f272f37628790f30b3f7505ceb10c037bb406b42cb59d9b1c42daadd50752a4c8937f4ccb2c1ee171d28bb5e3f695f4cc14d6d22b93f8eb528b79d0ae8a1987cabd4ef7a61399097fa7949a70583faa32ad20e9598e89ccbdbc6cce27da4dd7753232a0d81aff4f7a94644556e4b4d802d15954940c017a1bff622f356405a333668594392fd7275d0e9c9106da7c90,3f49d5425b85b492235cb6524b08a90ddee3ec43bbc9e3f7468fdb9d86794386,f0825399a92cc453539aba15c7c0af436f17414bbe779f10d362b61c36d96d553caac2f8cfc70a25256573b67e9ba0efe8d706d27e19b1487816a4ab750bfbfa01,1c3ea871c0e4cc826ddc0d1da72f9670525c0199332ffb3879758a476821af574e3592cfcecb081e564940aa7b3b5b76f2feaf9db5b29f1431fd4f0144726c0600,f0b338846a28eddc0a22691335db8d60872f1f3c5d845e0710c7a06645f4678070fa1930e3ac5caebd5a8d348c92f0bacbc8cc4e658b7eb4ac085853d741f4d800,14faeb3191e68f4104bdfb59a8b6cce2c1ccb6ff24f429e029739bda1d35d4437544340d0cc60119a4ea2c838b93e1033fdf7d1a9c4384520136c575c1ab340b00,036c4484b403a5f69ccb3ae7d71a4014d22c2fd349c6efef70989fb9b88553456d9d4ff13334516f3ae59f4852933e0f0795c677ccfbe524c75e288f4a441c5400 +6767906aecbfa7b959114f95f153f6201c7840a6815b610b211f601a0cde6ab042fa043e5508f20afe6368f04ff2c321b98cab4452198a21a10a4fece67b10d42286b2d9c971bdc52cf69ab0d7f8e316b373654f10bf58e92b558ca74bfe9518572296728c25ed8cadcf7a856645c47d956a349a0ac36b69446f44efbc8d8172e80c28dd8787a392ef2e45a787e6b79f0c26de4393e4ae1f62899ce46e62c99f43b14e7209811afcfef01bad87a5a9f408bd4d6afd44770176fae78aab3f307b5be52eecef3825f807087d0b45b6a47a9da7dd34b129267785a84dd87b05b5a62082722cdc8cca7a6f89a2d6b922ff774fd07344898c6e5bc439402c728d6b,abc026bbcd0eb0b1a417bddb112d9662ad3da682d1ffbc6db5ac411264a18187,1084a1758019872e53490c2edf2911600c34066b9ffcab2acac7c24a9efa94a551adaf1e90dff4f759b6f2ae2001a0fdba6018718262f5c859a2fccaa00e5e7300,de59e42e3725b11ce661bfea54ea810f7a287b0894f8575ae78c106b76e5d93a1ebd3af8fe7e059cea1101510f214b21f7ac6faba225d5243986c54ff8c8f55801,5c679761ef18a0904c348a06aede00825961b17ce7e7e841c6b11930260ad71f722f6f853520307a11148db99224737a5445542f430d9e133545b5800b42353e01,399c703e626633eff1f769257775b38f1aa11ef01275c426c487445abb37f9e8305b7bfa2ff077b76ffa89c8a41672f35ee8133dcf0e2088fd4463c64df9f83300,883d323bb9b717b579bdca487a64a427c93d3a7ce8d114ba14b50475d9a7aef72169e8ca780d370ead865641f6e3806be7f143d3b16a8766b9b108a8f3dbeb3200 +9bb531558dffcd124a2ed2814579daa357445640aefa7b6163ac83eb5e437d410f29f19f662b9b7b91d98ad7fe94e5bf858623f9e9807175320e15a3ee915567a23b619e1931e741ea823bb0d02cc2ec791248a2c914648e4b40e27e744168453c98c7933594e72ce79c8eb1ff20a0145c1c24fdd6a1e68aa89e501e62a0c811db0c9fb137f288eb74008361b2d1b1ed4331fa8af04111955967caabeeecc2162fd6ed522f6ecb56213a87769154eaaf8e5f675c798d77a074d214f65e28a7145f3574f426031d0f0cb699a8cfb108e537044da2f445db47ac2a4472f8694ff88580c012195fc17f9ba0bf83d35b9c2c32544b7d4eb4b924a2904a7fbb1a66,4288908f439c7ebc755aa9cd609afddf6fb3686258cfd9fa41a460e83b97e21e,f2b1fe2fe7039092afabe0e84df5ffb06f3c3530b20c244f9db146c498a25ed75ce6127e4d1b182bda44eb4c72c4da47c0e9acb7224c140d26bd9d33ca4486c701,a677593a6dac5d9aabde3cb5d70f64c6d4b35e18118943f9ee2ff37247491f7b4866eed0c30238a89e347744c12811299acc0e20b933d1162db6af65d57e252e01,27654f4cc2513db497bd01f430b12df461afb18de4367fae21a574dd01e9a8641758e5f5c8e50d4fe08a84796833ce93ea158ad54170997f2d4ec1d9f2662aa400,2586b9d5214850ccd22ebad40b701bc795601cd8e489b271ebe70d868ecb12ed6f20b915a841b66ccda9dd5c2868934d7ca67efc1b5d44690777d50e1312d39c00,a0a5444606cbc4e194545eb7d3fd9531daf8c35efbea5b753f543c2274d77c787ff436b1a471c0476950af180dabfb2493ef90ff79aeee298a394c5deb36c12f01 +f3e9aab4469cc7507264509f921fce5055ac0b32eb89078ad519bcb9b9e9c32950ea03bc7d10e6926a25389208a0eb2102c923392b1b50aaa032b86cf2c0aa4a8c0ee82f1e07ead2c00ac2d939c8d4aba99b0000a428d8c42c11435b4809d26fd19e96b98a0d2f1f66addc5c2bd41ca94995ffb38d249512841eb0012b96c5ea145a7391588cea4d577c4104326dc7645903a07ce59317b137b3a313c31733a32b9d04514f3aa0bd4aecf356b6ee19b2312cea12b52e7513649c26cdb78c7c50533ff7cfde0e9344062a13e1fee314ba0e3717196557986308bd6a142c1101a4b50d57526b3a26c5905a98bb12cc52271e96f5b2aa5db6dac81f8e31312938,7113ff0a81e3a9f5467fcb60959fbc7058121dd30a945799ca7e09b168077494,915fdcd2dd898f31158714c1035c55324af933afbcdb7e7ac3856c60b2e0da086616d328f3cd05ca7cc7a070ac6df1fb34e63208e5d3bd2f2547707143be889300,2ae7cc6ce62260c619aeaffaee53502b968dafb4a0118becac34878f87f10ae920af5faf6a485ee8690d4004052e642d2d74a98e1df14f7a395aa304264ec02d00,8ed19e8efc79128dae010f1536ed5112f10cd8b63cbb73f2a971ee4a383031d5587c47b1def07164240062f05c002e4324a70ffc024446186b56e10ea3eef59f01,c16946c1e1a5d4ffb02268ddab670c03505b1052402000fa1d62620203169999058f5ba96e713b0dd359f9abcc556455d91cf03d649dfcbd045747da7a1d125501,d85db72088963c648d1b01a1480408acc71db7bd1e5845712d0bfe69c20c8d36720fb6420a6113f71a930b3cc40f325e61d2ed8bb82e74986bbd6c62c40b8cb101 +5229f761ed3626050e22a11ecbb17211bd4495af5a0d4b3ffd585069eb6b5c12a4d4284126b21b94f27e7493022ee2295f0a9ef5d3d97b1abdb36e853dd92d00ce0902f3543044f49eae1c3c94471e769cfd8fd67ae5d72e996b78a6eaa6e0552ddea1ad9401f7e94110bf52a19345d74c0140590fcec9d822741211f3d0178634dd603e747e3e28874bfe889f1872870e2ff0e8f04fde40ae31b246b22fd166f6e6a80f7901c19e4330a0ad8f88d3e74c47a63c25b0712384274ad768d0cc88f51f82074dc8f2d48ff393200022176fe7d2aa536b8db7770bdd28705536dc59d5f0242ceb5f780e54fcb6fa2a85c38ed99bfd37f63a5e832b99bd9e10f7a892,ecceeb629c3d8de4ebbd7beaad59abd942741405e0bcde11573ccea30e00eaad,ad8febba76c5b4888336ac4845d06f1bae3958610943fcfd27f9d6c7bc5bc2de0d62d5e625077a2334ae6d5768756426d32937aa259d93c96a40203cded33e6301,b69ca7be438e0b0aa0fe72e48dc2fb662f6c7bf3500c9425def56ff7fa47c7816e498ff686bd90b6f374812daed9c79f1ad2cbcbb59c09f4bbfeef07057e7c4101,f73d446729c5d4d7bbdb2cbda8f62127fe4a63ee577c6303211f173eba6c926f1919dcaa014b6dbd41763d5d555295ce321088a05233bf9ed2ef81deaa5aefdd00,2c2fe05bb7accba85e99533ba5591dd5d738403c5033bbbe7ef339e18cc274b818929305e64d243ce911dfe00cac7dcfd29e1ed60bdef00cdf1e210e7fccd35201,31541c979a6e05e1cf6f5d85a9863e52ccc0f51d4c1969e92481b7a21ed816b0645f21a91d0fae806a13e482d521bb39626c9f412088581b5155905c5e7f342501 +b791d55da868dfe42e52abb07b3d88fbd7490ab96d9fc0c1590c0edb4e941c984d70b07369da3bbb6b0e2b9b84e0e71e0995d952be8372d4bb2e1213abf0cecbb15ff4341e32041fe626b3e1cdfd3c870305e5b5532eed5ae2c5bc9b3a85d7270113c704b6dd4c12e8fca80e4cd9f75b8074593c6da3820d84ffd152d03a6f56e32de8feb19c10666cfb883a061f801e6991d587f858c6ae0308b99c89d86954e8d099a2e7b745cc450d6e5e16aba0c5945cd87dced7bccea788202052bc1bb0f2cb2a8d0d5aa0400505379795c5495b3c48376b31c52f0deb1806d93e6aefebc2d7bc22c8ba72a0e21fd6e593ebf58fa4ea9b83e7447b0625881723a7229802,9d46ff5c21c8ff0a97cc21785d1b9457d12727c6bb9a593c97a401d975d5cf0f,897694740d0915bcfa054f70efdb2b478fcc7d834d86125c86b75941a7ca26cd3e046c4d62a3ffd9cc43d7db71371b156df38c98a2db49bde36bd8f7d4ae073901,8867b687b30cf723ca05d2a5a72597fd2de263dd26c5f51450ffb0123692612e5dbd907617e49c11c25422c055208ae40d4777e6c172d73f06d20a09b3a69f3d00,0cfb44ba9aedf4a84fa1b0da5689ea980404f84a7143611d9b92c8b6d0dc088e57567fb998e84c7e7eb4831c0378ff302f3c9d0edb419874990b9c1a3724893d01,839b882d3d1187f8cd1197a9fb2f2a2cf566cd9b77b296ed8ce3e095d7f90f1e6e08068de4391c75057de880b46cbb0c3a7846bd6fd845556222e0bb2b1bcc6701,a7b42dfa6d1e3d02e2f22e33d91cba68e416d1b85f37bd6a947253142457b3512e3c7b1f4c9a8f81abb8efa7a2a5f6bccb8cd67d2345b8bb09994cd9499f96ad00 +f303dd7e935681b535a4433a70b3229f0b16cb5fef3121d4d459d5c2db164d1ee123528edfcd5f83a6e9cd962926ae932efe7fb211626becfd44505a14822b2079db35561e4d2eab3f3af39dccab23665af1fc271aa20a5e2cabf03789e01b1388bd159c769d1438a5f18e73d14cddd82ee97ca0d0a3b8e88ccddd58fe88fc4447329c419e03dc1d0f5911c0b22fb9c23a1d801403967873a89fe244e3719de53c94bc14c15eeac8de1f110e55eea6e4d14ec4f86145d3dd1b62bf770dd3bcb828636fd09aa578f697970af2a2aed3f3c7f9dcf1285ffd4232b1bcbc003783748d8fbf395747b5b6144c648c8a36d6cc71264936fd084176625b363a8ff91f5f,2f63c17ef5430ccbc21b5b810a5cf8600bd346cfe1eb03895cd090a11af8b129,70bf2a94b7dde2a5a7b4498b8ec4d1426cf58ffc430b710b790e33f38b738b0c318fda95fede4851238d90864aef1bc0156ceb413217328af465758a6d5b240901,41e548721e8d721fc705ec16f1491835f0762a4e9c716bbe77568083de300b8967f7e01010f85c149f9ab2c39bdf61602879ab9a1cf274fa03148a6e0750b3cb00,c6b4824b9b7a910898957f2da16fdfa1295000272c6a3550a9d29a9a8bed79b710a26d1b1582215a371085d1a7c54818d92fd07a492c3ac721481f19d4aee53801,844ec1f7d66af91e7e3bbe9d26f553c8eb44472620f5d49c0f4891d1ed388c147e02367660119b760c67955f18b69bb3e588bd690b7efee8c9efc567bba2a62301,87e25abf43b13293160586ed3f87cbb72ad6da3d3e2fc2c22ec99264de12a1f44432df337a9295fb9342083eaceabca15635086e21f3287758b80fafc366392c01 +85c9753e9dbdc7f2ed07854c080cebc2298c4e7bdcb7eee6a45dcbf26d26f167edc4f1ed21cb0e106fa58476c9a9ff39928ae5aa708e5a2e214bbbf9f8c246aab793fa522622b89135ff9e416e23e79471159e783753e701316b0fb2d7ea09437d0957bc840717afb72e6fcd2bdd206eacc1d97873f729deee96c18f9c76843ec147c1f98a587b9a0b9d1c499322bb0773acdb886472984227b768c5eb47f4f809f8207b8975a6c71c2722ff9be8019a04209cded84203114b5b2a7db62e7f2313703f34043c909e4b325db3497d80a78807417e77d0f174b2df0ccd44286627368a45993518fc17829553f6e56de6c3937976823990f46e3f7fe9a7176b2fd1,550ba4c2045f77634c4b6d48ff76cfa19a9a403c41a54ebabb5faa4da9128fcd,4a69f6d373a21a1a4525282403319cf02baeddc5937930ff53cf1213ecc266cf405a6a9a50f270bc6dbeb235f7b612659f9a5633046ea8a2b42aa73504357f1101,a9f0194584673e42dc182004e555c6189afbb44117ded2ebc0fb2565f42f4f2666189ebed893462dacaf3b4a06f5a72b38b5a59c8aa9d7abd1e51b45b298e6e500,a3d374cb75eecce7ce2575c0f79cc24eb1d7fa69ee39d0b197c87e64951b30d569c294c035939edf20aa26ef32cca39d4020bb59f17e239272ccd315e97c7abb00,442322c227934dafca1cf457b08f0378ec17a4071431948da8f97feeb939c7b00d93d52b4a3780bec43dbd280ecdfa83ed76bc8794854e701ce537655559fc5c01,e83481e7089c08793783677fcee3527417bd9e959e77a4d0948a612307a56717386e67678a9a852ada7e19c6b18423cc97762722895e94d3d6dad5c2e3ef6fef01 +5c10a8f7d15c5b7a946dde29c46aa37f6a00448932e832bd1796d69b9996e9dff3f75c4a48f5b44c6676eac19b47fd81e4845071083448e7766d40057cc8125d9ecd47db21e3fa928f976d87d4295a9a2b0eb68702d31b09598c24564491135ec2806e11b8ffef3ff42132657f2e8d377c42cd151d52d7e18794eccf4e90ea9e2a73ad74012f6fc02aeae1f9fa25cfb45358e5a9fbb5a6f66440647f89a5d657a09b55f4c2b6a6d876265b045a23c9b73da7892625512cacd47831c54ffef67854ba85b33d05c2a4ea9b15b62f212f7fa9df393bd2db82dee70ecf6c24c60ed0de17659267c9b1e8236b7ede6509e45a52ab94238ab6baadbc3ba0e192df8966,243ee03d89518aa29ac7e20b949c18b2c8af0c3c1c2c5ffbfef793b4b42bd8bd,2b2e9d04f6ca8aea7b1e95f2b5e49799bb1ef8a8acfbc1b825d4a6fce34bb3681fa530f0d953c0359bd23f60f6310b92e141da5d298297e878d10a8f116cc23200,3319e965a299386cdcd0aba1880ce2252081373f5f20f5ac9709aa89d2efb3927f00081b672b291d8b73939cfdd45eaed17fb1d724894bfe8ec930d33834651401,719040850372d90a9db0b957f1a3768287b5e580d29fd5d9b68ef9f33cb849da4cf36318ccbfd510de59d6e59b698ad44a0e4e62d0f7fc634dd54ace79600d1300,c9c77d40f1f0d6b299ab0e6206c12fc38a295d6c3df3e30d7d793a6c0d67b6b82668b959f0447c4986d78aaf89e2e09e62e2deb899e940d6c0888545b1db60f800,2a3afa88d045fc4faf002ef15a076d0130406438ebf5fdf564131882ec56f4a757c42d4698ac97b58ce3af5a4a52ec2ecd1b729b2a64523f83f535fcc68f1bcf01 +36c0ff345caa710b425f68dbdca11368b01934cfd1840dc02fa20925f4b0287ea185631342c57dc1a6a1cae74219328668e501605e2bf60e4ced189ac6eb23e4753a6597cc07ce0c0bcbba5b9c22639e24ed28b4441f63b6ccaf507d7893455f61748729cea6d59f57e4f3a966cded386af487069bbb1c9f6c9b9c2f9c7f21bc82bd213787432274c6d86a15b1a2d4b24db4cfb7a74182142d21a068e1bf458f6c44bc0e089c35fd5c8f35658dae39bf5f2305a42e13e240984fc8a7c8885ca577b700351d4ca065e23cf103d2255c6142e51e94ddd5646e8e8d801b12a9d6fb3507f729bfc0e63a65235929c4079d9ede2098e80f4c3645e206bcf2917e0ae8,3dbfe4b2d32c75ec52a50e7ccf2f6a7bac450ebbb182129b72e9127d3cb9c404,aaea42d9a05d456d741ed57165a5386d1426d0b87df3536bb47186a7666d843a3ce00390e4cb017ceb2bf2bd67369a0580c9537644019985114918980b00f7db00,4c1a5ad5f25335d6358ff1138de623232c6ea93aef3df41498454c07e24426d02cd35af31f856859ab260924134a81b461629dc46b5cb87718bc76028296895a00,3287b135609cb2ba063b4f67fe5ebd1757a6bcaf55d5d82c68e0074798ced47e5807f3405ff727ea09a2144ea93b488674cf1ae6e999a5d7f08a085ee3e4302701,db92fc464c2f2f497671bc77eccbcff5130ea5ae0f1f9d0c6e126cbbd696a3277f6527448e66b0c0b63ff723339dd0bc60d92f15d307f3162a8108f3ef49945500,537c898de58f654f7e6d464dde727457020f3b14c49a16829e5168ce07454a7e09280ade4b6e742da91d4eebb99c56f27a5d5ca802f4474fa63055edab92640d00 +1b209ec28cc626988695375f4b3b6ad225cea82aeed505a76306973292f9487fa910391fd351d910441f12e45eb19fa8f943bfec87076a225e9573f786287a2a841ff27656bfa22759496190aa4e3c0684286cb8a7442914e683f9744246b956171f5d0878b88e4549bc2016d9be7599c2e7a0356d7f884c7987da0f3152e17b8e55b1aa93fe3aa7bb078618f9b5d0b8579296f1cd67935e086dc8e36e45c452f36347b2917a24bc94ce5ca00d5d89dc023361f638b4039c8c6119c0cda5ecc6e9781cef10072184bbb0ead6171b34ef3dd2c48da328ec229ec62270a1ecf03adf7f58535b5fc873c489c55775134d08f9a65a580bdfd17d5e1507ed0f145264,c934e4f12a308c8337fe4d58bc652a30c2937528072235739589d8b164747e2b,02eaa12ff0c9b6b3df34bb23b192c98e32878297fb053dd25a046b045cd0e8bc428a2778f10d80cb469c4aca55a472fb61bcd6396c7a53b7180410cf18234c8001,a292b46ecab3ccc586a03a8cdcb81783bc41f94a8840c546bc618080f92fe54e711bfd386a537d70807a803a0f7f0790eac51f07141461d64e4e719170745c4001,cc3a79ea2068b4b7dfbd73e079ff74c73c3d58b95baad6581926d20e5b882b706307fdd6bcfba862ca3c4b3bcd717db1eadded86db349b21f04ab7576398c4d601,4abefd9f13d1dcc4e3ea3c3384fd34d2eb5e9ba20e591da497d03783e699035b271f4a34dd43f190cde83cc159996a4342a2e37fec1e90d6ce77ae3e674485da01,332abd6ef80a6c1b0ae3a93665075f7b86cbd745eaaa514968f1255b372d7999024af02b0f8b395ac567f3d8a22fd07679292e17d37b7cbf5f6cb4772a99758101 +02c8f4955ab84239c0a15e186174518697a19921615e94be1e01ee17ae0eac1981e428f44bdb9ae95674bae8958c471ee7fcfd96ece633397b1ff4b5a1450e4e2539e228f90b9fb831b48a869d983f1f56386cd5aa27155e561e708ae15c26374dbf0319db38a615ce8e851c59a1ae895f1e7b9898bd9da1c6b1d7e28879beda1d8466aa6008881e6d1ac5565a6bae015091ff3c417bcc44e3cc5dba52faefdb527506d8b26b662b9d53ef76bb9c74063d6edb697acd17416c8c1f0fcc94e759e2a96cd34763ecc7f20bddefb1f8996a3c2263087590aed38d5b056a19d4b660f49a51f44fe3ca9d8385de5fc7369d720372c1f735e6a5a8034b2794968d1f01,170288b0ef94fdef9debde8dfb628c89155fef074fe860e7764391b621d7c48c,0dc49eb28f2eccc77d56ad2063d2a0c10f2d2f564e4e8e179d685e95367175e14b5b190ab8e6e7c2c3055210eba6d8ef9afbab8dd140b99da862b9f9cac00ee801,80174fc921bebf3e40c258db587c6015aaa79c3c3c4a70ca91da9224ecb3d8de5793006faae98f1f9f58154e1aede1f2c5059452a6da409a4fdc3ba883bca43f01,f7cf847020ec060e23bcc4850ae4feecbd2877f40b6364194440de7aac0e9055158f4ed0337896abbf43d9cd20fc3f249fd1dc97db81bb8942da106202148fd700,2413a943a595359558cbca5b0d428def111147e69a1246a70faf560f64930844546113647743a0a46d3f97ae58d24aaec4071716fbdacc95459fa82cd7278a0201,27550b7c292945474aa635555199aeb1a6a65af3e858f1c3fd67e8a609a9a1d75767594e41f5826aab2c5d814827ec70145c47d92e4fb4f528ebc03ac544594201 +cfb72f728c379cc89aeae9cfe3900d60a4ccf4b8aa6fd942798320cabfd6926257f1f32a6cc5a610d4b76cc6d3d78078a5c976aa09be8e3291307418a18aa64e3d4cbc7310012fb214f459daa1c5428a02023751b9511f3cfc56dc455198dd669c6a2a84f3c5db2e409365813aef8b5ae56ce019ddb69e6c8bdba8e96d60d042a322425b819c8f322f9afbbd241b7295dec72266fcacd2c3c6ea1e3e1977fd5f80774ba532e8be67b121aa23f47aef9d118fb25babd66752332a866420479e5e450e542fb8accaf5e0d97ae16a49dcc578fff9d9275428505efcaeb78dc072c1e45f7912fd7e6ca117870bb0223d0daa78373d6092aadb58441990169be2f3e5,f802e716039f2e1293219bfc5395e1bb69ae63899c52a67a4296fe6f0ad60b45,e45c9b96227b8389c843b8087d8e15883132b40126d367f45d66fe8c9add5bca479eed05a1dbc54569b12c48408688cfefbdf9dd224949768b9874c021c82ecd00,46154ea8fd46f4d595fda27ea5c52365309803eaffbfdbb2bc9f3e931dca131c7830b76b88c547c13f6d2d05f6134d38283754e861e104ab3ad5f84f0c67a0a401,7ac41634e6c47c4db480099dbdc6fce3617cb87bebd07706e3a1a071962190e56578ac1b35f9a054b748dd8c5944807b88ad016f4a5f9bc4b4198a34bfdcd93600,f2d53151f65a0d395cb1faec4a572d252862be0d07e0beb4165717f8a713c97877418e4e2f2c8922854a1f6d0e116df90abd975d78f60026776f784fa7e19c8d00,3f86629c248693a07e3443d446128262534c2abda6295178e12cb2ac72299ff377da3768f6b8da6ceb4277a9b833b1f416bdb971f4ccebbbe1f17ae0309da68b01 +a55471b200c9598b029cc0ed5960a481626348ea0dd8060c8c470eb46d145f693c6a583af79003a4e510bb2142b11a35e0ec5497299c5be95e1f758418ecbcd27c618ef20bd3201655c99d0a6519a0263dc75a7c8fb240fc367ba490e9a8ffbee9bef631c9bb45c604308f32b84c845a2033f84be38335e71984f21491acc9e81093a705ade5ba161683a8b3f2994417eba2a29d8f0e30df71a5da8f329555b92c5149ff82a73f9288a4fd71c5505ff7e5e98479b5d82a44ddd381f37b95583a8a97afc6bf8c7c8b8e45c7c806c8bbbde5dffe3049bf58d41b302d740b16893f9d7c331c3d3af14025df898545bd1361851c4fffc32b4a1373ad620be61974b0,187851c8a499a1f79638becc7f4011ec087256e57f216314e144937e8ceb712d,59f9f6a6729160604c758e8104280f113924125297e4e7279cff77ccece598766605510afe15fd83b6e65a41985c85ae0a98940b46dbe95c569f0623cc6083b801,5dd94879fbdef20973eed68aa94f2c4803fb12e751f97b9caab09b70018e007a0b1cf3bbd72142bb2ac52c4b2574902239553c7135c271998706748e37780d4500,f447e4c07fbd2a5b8bf7676f23f58527ca068c529f9384098e14b639d6fe6c5b48a540613f48fe1c1ff5745c0ac5b9140fafb0112a83fbd6571e1967336ee80300,4f32dcf3e87f911b4931edcb996adebd9219309f3b7e62571da991f49ddd24f321adbdad8fc7045fa419189fd4345fc9c6126c681ee21587f24de611f1ac671400,196ff3d8ca7d3087b67c9247c2628c9a9a5f9c7833ef7175daa08246525b21ec61cb10d75bb3f0a8741a322796477fe9ea585634382bda0a5712c57d115d56f901 +ea5c6836873be23ded0c6dc7d182c8be99195b6d6419fa09b969c3f21f8a15d9e51e4fe9ea014cadeb147730b316c34c93db76c9d76b21ec80fb0fe95975970ca273beda7a8b57d34d0a24279a6efecbe411d9e1effa0aff1a343e1cff656834505c6fac55844b26cf22e80040fd68e3f525c6a8893ab573228a84967748244d92fd94c60ced13a791eb848df9e3210aa94f69602ff0b6bb9859c6d8c8f442cfd9679026c00412fcdb400cfdc84db083dfcb55bc6e3d77ff9d42e6cf51479bab5bd0c5b2d75796656c9c62bc066861f8aae0ccc892f636a30f6a6bde827c3cc0033c55a0d313977ae59d5b8483b0053258be697bd77382e44987142d2b05c31f65,b2d3ac4501fa5be15120f2a6249fc9cd9fd01873b2c068a7ea6501428cba393e,6383a140222388bb082181bba54638222b09a6fb5ec87344328a0b2ae49aa90a6cf8f96a6cad70bb0b9f6bbeafa45c04821593de239fd2bbd4486270177462a301,e6bf196d2a97d79eba7cc2a640a7f1deba8ab0b264399ecc6e046d3f9a0786d923dfb09b6bdab47b41ca44a2eedc875108500501c63951cde16454bab2f0297000,cddcdec0e0aedd79bf4a6fab0d7eaddae254160a40fbfd178af2f981ebfb428779bc3e80e5e1f2a2bbc2adc717a251c9e8ec3c1c5df376991ca7d4eae2be338c01,7c629eddcdb4acdafbab986c32028882ee373379244de64400d38f9bfb180a042be3fdd7c4d572a01c5296878d8a1d807faaad0893b3425b540ffd97bb646e6401,45b7d5e6ffa57de261f268c14f2c8a01d0ec3425d1a7fe4f9ebb0b37b26f59d81fe7fab16dac5955fec275931def63a592b7e52937525c4be59551e0a4e902de01 +5720c63bf9bedad4b325046a75c97590434bfb42f89823f3d6e2cabc37fe1eaaf2b070f0acdd8474a1a0927f7ca93c3c02d9bbd8eaf1cfcb951c929dbd78109d2b48c98082f90875827d41b9315eafe684e8a5db5ec1db0d754043d210824f31492c8bd6123449c4c49f3000eb2bbee93c1ce3d377abda79605bf88b133bb1dd4850f0c9c84e06791795e847a9f13f9093b8a7dc6addb272b540e5cf04b83ee619523aa1074ae82b187eb870affbb977d4b2b256ec3869eece8f7665d613370942eec612a50d5f3a824d14f553c8af046315399fde23f839a7981cac0b16feb712bd28e5f37d30192310fbdd3b48aec80720f3247ad6e30d0ab2979be41ef0d763,5b91307e05c5b76f437541dbbb8066bd8b3c7b6733224b65b2bf6e50cd4d4b94,2f81137599b9bd4a21b1b58ed79f2e02a9264838b2ab866e04e20b9bead46ff128f861395cf4619f7fc30dbb36b17897a4d5461e940c77ad42ab4ab8a5088ca600,63577092ec4b8b294345fd04d54da32ae9c0e2cd009f36d187fca880be45a6dc31bbc760003496a165ad316909d9f08ae6009352e15a3befd408b772864d471701,635199c96ea709c0361209585a69f016e83f27478b258048c81d875af2164e5d426b333279954ca752863172717115eae8668e6c9e161ec3a7c3ad38ac03402400,89fad1735f1e51a128ec493595f3c470d9a3b2b10ff0d697e733fa156692bf6f2712db9ebe6f5f403ae4984c4b8b65c31df9bd7527f25446766c49f33f70752501,1015d27eac0b22bfc67c9a21caf76d8b086f67302695cdd9d50f225e57bc7825735ec6ec4af8caee8b6976a79823620a4dd35bae2fd1d5964fb07c6eb1cefbca00 +e96d52d61e77120acba1d31fd098adc9e2cdaa12e93f08a3055c1f8e538b848667068211dfc1e5934813e6188dd789c256672ce5f11922f9959bd744f686dbf45652a90c71a0089da69bdf272cc5cddb0632161540b0ae4a68852c90878ee2ee43443c359593cea680dffb3339d05672b8eba2a9bc15f27c4498f264fd39f256881f93e61a038f18002056dd6048046e30d86088d955d24e998c02b152632cfefac8fcaf91b2f196865b08cbb808b9e36bea38cc4d961ff3d957eda23660131c7560bc23fcfa49bc9b6efe865275e881328e3ef2c41438c37050bbf3350bb75f0792cb180e9d11149ca6c20737d11f88681a8ce958ce169f8faf8c53806539e9db,05e1d3e6139361f0edc528c35aa898c9be558fb58da0d3385665893486c49bee,8b603874f09792cb6adc668e02caa149602749def40fce6f2417ba6148cf0ba406a29a49ef81f4bd209589bf7516b1a667ed522932d7f21ab1ced498fc0540ba01,3772caddb46edeb6399444f4db34f47186cc5f6ef5c86e28a7e4b5e437a806c36a40d32f91560af86e49bb26ca4afa7929fe26eeb7e4b81bc94e6cb304b2574e00,c94f2374b566a8b5f75da00cd3e93c0a526afd5631dda460aaed8f2f6f7882c2796d60fd896c879c2c2195c5563c71ca9f5c2905f49ccb4d852ba8217fa213c600,17aed72b8795ec52b0cb261edca78398f247f724464fc120e6e7796419e553b933dc6afa2bc94e341ceea0baabd32d2f18775271ea320c6e6b320546e4846f4c01,0877fd1eb1280ee18bee8d0be118aa29652b3a8c48074280a6596ff5a141ae1f50f989922e3a8e39d0fa5a74922e2b9f5415c34395b40830b6b2e442470c937700 +394b287971d4ed9f80ebdac5ba5e1c4066aed98cc81a6edc654245f519ff72952de90d3b7809c598a665a56ac1e8103aec3e0f86ef391497f6e64b6bab79c1d23b98e23f53bf1fb2c65da9f787031c124990ea6481dab5131b5460b690e2f472175fbfabfc46d9122f6be587241fae35b4e9f7d0e36fb2a470fb9a0538bbc6375578ae159136f8c1c49af629027d8548cf342692d3dda700bd13bdcbf7c7b252e376c5795d6ba7c189f4a01eaaa17803a88425bf11d043ead1060a455fb650af41ca132f28216a30b7f2440a8e7345cde575e4349f7ac6027525df7303d9d1707d8d27baa4c467be8768dad8ced71130c8a335081d8297751252584460b00d38be,989e61ed32e67d2a6495e306bf16265e0072951b32ab9ca178624564e83ed9b7,964b547f845b28265a962ae1590b403fa2aaa0bc13aca087276912dc8bd676572e6084566b17dfb8be0a8c04b566123e45799d2f5efbd836a749ce10a1150f8101,4d8bf2b151b20bc5c43173931a356fa9a978d77d96a870b7cfd6a099b953e92a3a06b407e1771f1b5703cae4a143ec710dd2d5c764f32fa0278e17cf5dd8d48501,d0218124b08777ee404e8bb126ca855e5c851b6ec4d2fc2fe77ed09807fb8be27fcd35a06676a90588d8741853a215b15fca7d6a72c69a151b9983b59853511000,c0a3ee2db5093bc024cce55c89de3a609f786a0d4d0ebad0dc795c9dd96f8a7c5beabbc4e0b92c27f8e71bf84a52a055a5bf268e8f716601f10be6268c5b29df01,fb700c3cc4893a7eddc11e4b1acc9cd7ef563363b7374b74ed80a8ddc7beb42b0789a22e865a6128f9628c30be2b749939eca9f32a4ae43855e244280359e65d01 +129262dfe1d0d0c149ef6179ece34589f9ee16e25d0244e4d3bc7284e1391242be04d67df3a180adf4fc198b0f9fd330a3b4ac0947b455a3eac976403b504d3064ff6dcaf270753544745ff4bb4f22402d44e58c0b1e367b055965789e7ef7b02e38575e9679a50e146e95027914af9ac71d7375d04115fa00ad736b30eb3b2cb6fb4607f3ba57891d9e04da4649ff91aee74995454be5a00e21c8f6e19697049ea4b303f6f570c54f9244172ad5963aca1044fb0a1d364593806f3bb810f79baf1e74764f62ab40aada03302d710afa1af0968710dc86ee5c24f0be5c17fdad7d7137292a55f796123990b34875f088ddf24abaff0049772883efa4438956f3c6,4ce262681cc9f0628646e3fb553771085ecc0d8c8f43169be0ab3a313189f5d8,f00f75df841a01e765ec51a24929f39b7d8f4af2a9dec670465d7dfdb567452234dce6ccd900b68358def817583b3107d5ca3c482414a510273464ebcc110d1a01,572a765b96ad590b6ab2ff7f83ab8a6f11cf878011094d71a410d5916ebdfddf0d1c00364454c72c2927b2dcdeae57f9038532336b90811348153f4f992acaf200,1948289a74027371e6be5da9614c9b98d7998c6a36065c0814c1ddd3b9f3c81944c3e814f58eb0b960b1a72a22bab9878f12059528ec2b6dcec47b32c289409400,ac18d986292540f4838b406209fb329a0b0d64cd6de8ddf4e6c5094d665d074c50f23cd71ab39e9ba919d6c46ff451e7ec5f4a80ca7358b5b68cd27e964807e201,2a17ee0d3623c416fab88d180c7a95a435b8970b405ef60ecd67c5462e80b86018837e631cafeacf78c1598a6f598a842abfe982f77765aa9cc82a188d6b565c00 +e738a0bbf87c57d3f1a67cdc6ab18644363767a0dcfc6aed39c713444ecb7d223f29fef1f7ab1bbbb74a6e7f9001a9dc3f9c7f5769a149632fbf17517cb0e9fdd127a6975adf7de5d7e092634d6002247044923af9ea6d410344a0b945bc5c79df69336b7827773b4148723b31f4760522975eda7aeff722fd2fcedb6efc75528a2f8a5aea0a8cec87ae915678490ec09f8821fa599805cb9dfb04bad7c77861645196d31e0c1be150b2dfd035f347476bcdb8176e87c027224418ab13c9ad1ddc67455566600f8bd69647257c41d9ad6217136f404d679be3895533c03483811215653545de96f793e3286d69f84ec5f90d5b09e85a15cd78680c96286cf8d968,9b0d01d5f782b44006dd0e4ff9b155773d746efdad4eb3ffc4d9fcda366ab8a6,aced8f81d4a73965902eaeed1061c4f531b3cda9dc1851c3bd671df89c30cb2c133bc01699fb2b469bb3d38439d54ab313643f030c44e9d276c8c901914b57cf01,14ef3d9115e04b0c2b804dc1715833005667474cf6c2f15c5ee4d9cd3cfa50d00fafbcd2a8a752cab506e5b8f271d5ca3aaaf2cccdb12251a59232ee7bd6031a01,46cf56cc06f65dc80243ed9544f84641f95803461bb7c559b4430b24bee950296fdb3a3262841756ed41502160e406e0719ba9b52d45596224110a895660dbb400,cd503e2a874a01e4c45c1aba872fb9ba32b3d5cf99de904a584f8f1dd022a1d97058a09644a7b912944114694644eed779fa43e310ec5ec130a76ae1ae2d174d00,49368875f5052c593bf35693b76f824e941b66ecae6dea77b1316cd0cc85cee051d578412560967372e3d0429c2928941140bd47cf324b83e34d0356cb758be900 +6aea98c995168ce5cd8a51ba7a224e8f8e2ee1c581a343356e84ade76c70772187f49ab70946501d6ff4702011f168951ab3b07fd0074a1dfd4d3000435218e084cb2e7c77f210004805ffc7f371bc3deac1a2e33e0193dfc1bf9d6ddbce39cbd68d8d0d0f4e9f993e06edb60b57eefd415df937f62aef9615670bb7410a492be293ac3883601d629ea77ea3f23f0d3139f575934b824faeb5509f8a2222b7a70e10ec643ebad441a3c55300d23c6c6ecb8c5e4ca038e1fe77316588b1b93549a8d0a8e270a7c7c28d310a7a461bcac7bb269be0822be766dc6b3e32c9742c79bfff6f7e83fe11467baf9d6831eafeb598396f7063a1c72c993a82a0b2b8e64477,41ff7908c49d438537cb48b483e11ad6ba74203f87b3bbe9f3e01e5f432ebaab,03af615d46af67dfefe594fdf328c24311f39c06106c10d99e68e687e69613c14599f137981679b9a475316c28ea6fcac5cb6aed644d8c1fc1fea133712ab31200,76e456127b67124b2027c9178236407660ab2abb8ac2a43760849c1271965910448ba7e29af46b04a9f79819ecff30c412b73c495597c8f7cb1ccfe2097042e600,3e5d171e6e136fde1b802ed501d007679b06774d15b6e5a43b43f1a884fe2635260b1832e199cf8b0bf3af219ff4d9b6a269b14c4b326a13f8bcbf1d15e8f8e900,8d96bae4407dc71046046508f4e915548e0a3618efd605d5a77690a8d6cec7f168ea481cc38c9245e5be09e74511038c4e166cd30764eceefebc6eb6bdd226d001,b005c0f19f1e949855396e59049b2730154178ea955f9b97a14668c38779f6ef2a2decf0d92dd6f648a92f38e7c140d7fecd434c65fff215fe3bab75ded3504000 +bdc62a155a88d4a58c416baae59eb7f83737fea17ba6c2668b6fc03fcf5612ee3458df98a8f87f52fc8c75153f7b8d5f4aa44e1475067404607cfbf24b2ad104b2a10402f814f394244495c23a9f099b22e21d70916f988b61d344c00ac4f197fcff8fa9a78d8b7b411496bbd29e90490d87b55296828c6c6619f827ec25ce82cc999bf5ac1e00dc0d1d338a26109fd5256c1a7614830468f42acea4a54a92c2694a1607d8965aa5d3fa4a0dee7d2882241f64ab6a9af3cb013af03ee66005bbf22d4e9449d39c78a9f0f508d0f9a4d7fe3e89d45e0ce13205bd4fde805cd36def5f43b7ace74fb5ef2901e79f89b285307c840d9faf8c2af29bbb48f5b1b01af3,4e2e3ea0de4c7810ca90275a10c4a7631749b9cf186020084a5c3bfb9dbd3028,58d471ce7ce872c8a1b966397d921934c9837458a35a866059f5517b396319003b17b9f24ac7a409d842efac22cc2830808e097632099c512e4b29133dec6ee501,14604b3b683616482bb7d584aaa28b1285ab845cf97880d9ac982d9c077f601e63d60feb75e2be7e7a7ffaa37f3d72c3204a194f6609ec57c396260d4b6ad91801,e4a51c77f682f395573240ec40d140e69c1ea96f02e0ebc99c0640144e0feef1124a7d6618e6302da761f62965f4100195c293caf6f952aa723d970aae1ed9db00,5b5ec73ea42d9bca12c83ff5035fd8ed69354015544a6d9208572c6329cbe00c7019ed367132ead5602c2dae762631a611b1cfd3df1ceea584f99cbaca00d22c01,ee651ae104abf2843a4ba780b6e10a6a24c8accfdbc75020c9e76a0636f3e9e42c961c4d3f46b6aa1a5cf07183b0d64a7f12076bf471307e146d5220b98ec13f01 +a413576885fb2d604bd8a0f1fbbb9ee379f63f64e0ed8dde10a009f5cfec7ce5f773ad3de96163a6c6ee80db06cc7b6c2d2bb5e189902f8c54f62dbe2bf39cc49ec55d9d45cbbd2c02474d7e4007a33142730b1dea2168b7695e3cc88a34569d4c23f9f55146cf960ef8816584de665125b8c677ae573bed842490367fd54ca9f4d030d5b8a64155936ff0224fcdbe1524209f16ffa07f5b380caab504591188062412b9ffe9217a1e9881dfae26eae87fe97d1b30274f228a6623a97d1e58576be19dca77ff83fa97e8f9da34eb0d4f419a7aabc589bc249a2e6745bee7ae6e5f4120115efcca6b7d2a56542dbf55c1cc7a44d2b46bed0813dd0ed1058fbbbcec,06a819c6d4567f510d75324dde783fab02e604e0398be184e66963b81be771eb,7ee7080082f4501966b766ee1117cb56ee578902b2e48acfafb3fada16f87cd5101c881c00813d9c57e29aff51c5d0afb94d2751975841e3cad6a8ed40e6612a00,0da1e6d715b280840858604cd7f86c702e218ab018a3307b5dc6b7e633addd044f9da640522295bfbddcecd8aad19a0bf208be8e731f693097a2f903b52f2e4601,5660593f812926b37ecc24e3b7a7ba6f2602c97da0334cc9746fc30ec5041fa8517f533a1260252caf81c568050a37a810b7b5c9b9cf8b09c36fd2ebe98e61c501,102ad4dda3874bef2c86f27554f9f9c185bf74325cd9f3243297763275ad913657b7ac7756035b737940ddef2ae0f6674fc57e53c4b448f1802f3c75b04b24a700,72f4343d69149acaa7a8d1e7f7995ba3c393830e4a459f2d5c49b5e460589b03507b6d8dccb7f43b11b48f13e9f25ba2ef5b4627e92cec243ffa35962f4af29e01 +a106b9258d30e2f8f149f8a02034649dd0f96522f0a741af3c368ef32e9b0b48964d3c2f2ff5c93f1729cd9658531559e85353b0490ff0d33ed97be0c918ff8c2964950df299dd2ca085c429d378c0dd397e8620dc3db1e14f0ed92e13ced7cde5299c94116bf5e50b3862d45fa92bb3212005cf61790437a6f8e354f7dbe59253a233559b4a98604edc091c28da60a525d5ae944ff2be441faac897a040def290e4316f485377a339968bda1d11e15311aec9ace72c80f66251cf01ad0ebccf147eeb1dc14def4d505c73f13bcd4acb9c6e229bde5adfecded7e55f4387628fc3d564b4f3b84de46e4621f232351afcca51ddeab31c284d25c518b916d7304ad1,52d092746791883d8bb7f22232cbabc4b2b4bee7ac3e792d839a3a82193acef0,548bf07d68920517a2db88e25f401321e78bea107850dc8ba2d723dad471fc2b729dfb093507a7c9ec2d9ea701962b0359d98949cc005ff37cb7b036d685f3ad01,02378bec89cabd75cb134cebd32cc34b4ee7bf5747844a4702a0c8354707977a772ad70e5c0fc78cfc8e3b3d3c91346b7798e27ff826b0967b538b07c3df92e601,074f4ba5df8e01e6bfb2627f58b9c040af34a31c936882929095ac2c6ca6f6c6470ff6f1964644fbd6eef1071d43138160ffce64ac0b3e259a691ebd174cdecc01,06b9b96e8cde969dfc4d2efb0accffbd7fce647d1aa54ee9636ea41fa3d4cd4f1ff2aa467937aadd9cafae71dafe14dc60caf39b8119fafddc64c2b1fe55326401,8e64fb0ac1c9f17616564632e2911ffb6d6493ab453a0b5a68295d40782ebd361138b265f315bd65543504b11c9eda70cf57a8e4dffd49d07bd1b82aa1e08b6e01 +45206710573dc9ba18399e477e47cb51ffbd6486c157ef24e95b1ea0afbc1c7c99888f7f881aefe713c878980cecccdcd8234c203c0d2715224ec8070e8d04c29061275a15ef474f949d0163e8deb68a67c8f59e0f46bb853aee3385403f3fc1c06dabbc08983268771d77bf9a59de616337d56aa8a5d07a16e3247bfd7823d0752ed08a406c0b0f9dda52e28b8883c38da8ba4da96dbbbbfd55db857b473586fbb93a81d69518d9122bf9ef18ebfaaf4e6ba2dcf5069746302f0d83078eb14cb67208a1964c4db20f6399b5e067151a09d68f7dc718d3b9cffac0f0bb90051485b8a5de3f611a5ea3002714e2d43c2068ff3262dcf9a6c8e548184b990a20b52769,734360213028b842bca3014709eecf6d10fac5de7b230b2c52e4b09fdd5499af,2dc2d1db15cda40d5274b0bf2d66a8cab091d0bd3e7e96322981a1c7696b1184655fd1a393e62b69ad808995bcedd54fd67530f49271f96aeae0142760d479f600,59ce169682c94aeedde8c3290d8f219339ef461911106b021e4b9dda9a06ea2b7ab5202f8cfc9b3a1550dc10df86534448997ef2185c4982200291a71043198e01,da94a91662993aa87cf0c334cd6cf64fc4f4a948045767793dc309281d50226313b8a8994308a2128da43a5fb99fb305e4f782b3647f2ca8a2124339d3e9a71d00,bed28b63a8a2549fbe94afa978663007f418b9398fc283a3b6f44a41c744beca222ff382acff34cd93b3c22c7f1bbdd552c8cfbbecac6dad8a93c6cffeeb7b6600,79d8dc182e72ec3de1e8a409ac7c4cb933453aaf01281cea8670d03b3314f9a875af9eaf84e80dbb8bd6e4664bb2613e9800adad0a5257fa52aca3e66b6a75e000 +48311a6bd76427d1f864766c4d566dac3ad22031846e4d7596194a39fe14a430c468da8453761390d4c935943591557f5fc08b77420ef422ef91e509cae0b4f9f4013a3919ac5875113df18e3bf1d88aee30109db1b358a971c8e5a0e53ce8577315399b524926da4c84fb2e12c2fa8a89bb1c207361048fdb07d4da62af6c8272f82b798f8f43a5dccfb01e0b5e982160d891fb458bf2cf71170cac73baa958ac72ce8c2444201c2d199c5a883644b0b63c7e99bd998f0530b61e3f9d5d5fbe328419466a1d25d8b1cb030a9bfd7b8d8ffb43146ec112cd3f004ed20c89c39c495ff9841c9c2592a13b9af0d69010a5404c89072bc202f3fc5db82257b3dc2919a4,da63d7a7c29b64265eecde7e516306d2a87fbf5d66346ce02d9ff7f85aaca53d,a1bc04b4f1e1a66c0d7af0325e247393e9e898876ab091ae67c7ae381abef7280ca563ac446ac9b8aee372306863ffce3327450a1e73768a2ee1f47f2452584801,adb927b1d48c2fc7e6474cb1f4bd2a896e9a9f1e044c03fb727c5b4788bae77345b4895e94c89ca92178c560eafd03a52d88e277affd238eb848ea867dd8cf3701,b75d975a3b0055b5ceea5194759079137dc66eb5d2bbb60587bd25613c6ce37413c1ec5968a0d4a4cbb2bc727268488410934e204ba8cd3157276bfac50ce38d01,b935fa7cd0b76b6c74c4c257eb8aad5ebbbc286b6d85db96c61a775918641a066c7ab8fdf0ca79c553a1a5682f54803ff60582ded953d4f65e8582527713c93b01,0a6416ab25c7cb565e032cce52d86d236bcb836dc2021eb109b3c5ac661672280627c4b3c613bf57748955d64b2a86aa956ee6a009fad3fb6c17c74058a0f8a801 +8f4e005c7d0067736b0b0f61f47a1f47591c83cb4e5af98cd3cf5272a3dfa9ab37dfdb81151175545386dec146dd2e4ccff11f89301c0a30edbad7459ba2814e06cea5121350822cfebfa222e4b626bff5153bef3bc7d1534857b89cbfb5bfe686855ea5883b644a2a52aeabd1f0451d5f7567a33df02f4c4db711735d8f9765e35aebd4735cd59279404687247122b3baf4037a988d29eb6eae3e2698cad5cb343225e2d23f7e124b89f3907cda43983c324dafb260b6e9fd24889c778c932766f9b7220e85d81b997fa688fc2fbee420002b3ab9e5f244a7c0608be0dbc6b3c8e84a8e2f3443259ed95c6a0d4bc3be3da8aa56754954fb2527611887ac7ae43ad2,37f38f43892c1b7335f776ed5c83b0f55f1d0f44e214c042cce3c76ba9b97101,285dad074d0e089b0900d63326e871c5f9446deaabad431b8978e31bb2f01ebb548e4d39e77b468c6a2f2f8e634345738f65e6b2a07fa089a96a7a8c7ecf252001,77c0d58ddf89d21f02ae672429539d4e9bb365022fb5b1c93edbb562b6e5e33270c15ec32294a374b088edb94e7e59d6cff69ac2dedbdc088f3d0063bc61046401,fc80d23ac45c20ae846d3f0835de169f51001d2e82d6956e722ebc7e01a2ed9d43b84620033f78e5e276ac063225583fde57ea957349bce455fbfd7d54e8f90d00,99a3949a8baf14f1530b8933b561919b45f72463e641f63d2f1725493fc12b5b7a8e6e8d30b1e28597bb3183a505e5ae7c7bc2ff82f9fe8acf15220c70aeabe700,fbbae951c9d77c0898f775558dfa685d5812a859771cea4eb6fec78abdd7f1ec1cb646ec318cfe2de2a16afaaceba1f883d5f1d88a872110a15b761e74ac2eaa01 +56d8ca40ad27cda3a9d8e2b3b1402ea897f72117d179c91216ca14e84c7c829c8bcbf4d7dcf6da72050cb4f81289608ca04b8438ed242dec7f70f52e7bc52be7f5d6d56d814e7a34e49b619d46af3f79d51d4303f5bf89b383d1e48f70a05ae717406953c96721790e35c319f2990b7b504c7941f3ab2d0b54133ba8d7b475a177a23f8610a80b7a09d1634509610fc1c947364ec16f27c2da41b2b3a378db1231ec6b4d9a17c64db6e8296524a007d4f4c979d88a3d5005d763441f17117439e792c3472fd81dcd06420c9bc0c43da70047327bf265ca3d75dcd0bbf73a7b52532b6c0efd1b891b86c80df2fcd21ac35530e9c0aeeb7d881633ee93dead6685f442,780ed563cc8aeca921dd88c3f4c2e6be0807a2da5ef2ffd0b1765167a13d6463,3ab21150d45096d4f24c5ad0ab308b580fa0d75f199763589a68a7ce4c173381794f2e836f16f750cce1d65792b60e4fd6d62c3a212e814015180f44df688e9301,f966dfdf6d143afc6f00a76ccfda96bf32c88d805a692dd5a9ef4986d6c23bbb787b820c7ae430349ed3502c9b80f2765388322ccdbf927f02cb3cab1c5e580a01,f8e26a5013c93591edfd3ceb8ba685cb2a128c9c98a453e20c76655c64d1932b117f656ad395205a25184abde39359ee4eca1f8e9a922f0531f8af4869b1dc8a00,907200ab84635b67e81076a381df90aea1e84e21ab7a4f04612dd04b17044c99395a4910ecd4c6b01b67cc0567ecceb84d28077e3f54ad6dbc4d63b4dbea34d800,58a7c212f202369a9343c1781745f133daba185b5b55deaa57c0940683ad0f1552c851592363cfac16b9f4a072ebf6b3a663945e98fcb03643b36653f92a8c7800 +1c55a0cb4a001d84ce4cdf772a91c442e2b772bb2af34515ef35feddcf8783ea7c802d27d56afd9366511094d0757b6594bd533ec996fd0f4bff30a5f3a491efa9c67bdb1b98cd54298ffad8582edced0b3e797e8497794da8c3a98db141c8443b76d87821996ca39a286b7b97bf4054615563355c50b22316a27567c086485a02779d6e8e1bbf7af6807135ed2e861a8cbce7bc9e3e84267f9c050501c719aa6c112a25255dc3490dfa63adf1902c27594e7616f190bc7b8e003b95580f62a41dd8031b663055e6fb145a1b0fe8dcc573d737b10dbfa6da7e3d099475f8ce9a1ab97b10312c0c0d276efd2990728c3c67d096f32146572c1878947680e82b400142,b091384ae3cce92dce8ca6a1b4f429e444e0d8f435e882abfec84c2321a36280,076d27fe3ab95c8f77a2f16625a2b19cde7d8179f5e91fd2b13d1246467369285f79db3742aa3000391f6306422855fa960973e406e715a95eaae2a269ae3b8f00,a6fec6677028266d97ee874e90063457eacb84a455ed0a04c312197843f4c0a7553fa979610648d904fe3dcbcfa98412fff943be4b5105c3ea77c00a913fa96701,ef92465780a1180171341a17d7df697b736db21c8ceada04a69857fc55d47b4d3f6b01ccd4d1b72f52e5fe7b69b88d3e175db7a9b9b73b927d9c032cbc1b99da00,91f4ded998b0d28797e855fd7d6f6547f6061bd0e905178e4fa03eabb88f000458af867432d5e9116c9af8231c08db0fc2dc9ae2ee6344c9478fcc006e14aeb600,86a07de4b20a8f0eeb002ddd67ad47f96c2c3cf28104338f6ca5617ba8cadebb1728ae7208b59b674eaab21ff6cc539e3fe1fb12cb7bc8baf1f0095852e0305601 +6af18e2b76269d537e5721cdc9182ced4e635a7c634497ed6b5ec3417766766d5af382e598ed48aac674f28e420ba3f8469564aa1354379d19feca802e7f669207557f15912161c9dea3deac10911f17d5b9307d7c93507dba70c46dd3b5618eca9d47bb7c7cf6866023fcb7631dc0e9f9aacc1040b72b84befc26fc4d0f752fc519f6cb21a811eb78ebcf4076a39eff0ef48e23e1a34850e0028d6cfe5f8d07c56bb059697015951d54d82dda86be3c36083aa250d4a03e83bd1b09438a1c6ecf5ca2dd00adcf8bc5d68e8081351e246f0814b68b90c7f73efce0ef8700848f28dfe77cedb78c63ce70a17d47c099835846e587bd4c1cea6ee14c85ab11d9b4a29d,5a46ccc4ca19b19d83b0eddd30927a425d03698866c16843efac91d061dfd521,12c43694c8fda66ce32be6d813beab8c0d87957be15625c492b48c64642c5f4c4740d4199a7402a73d5268fdee51dc09f915987d6c924e6ce1678434140b85c701,335066c3acf35f56cdb80af7e912ce7a7b1302a0e2594cef6fd61f30b13bcb7b1c48a2307a878ee04893cb0ef46ecdaa98c56eace7dfc19c45776f4c896b4b1400,6c9a79edce8907f9f08a91acb2917eb341e7b3c7484aa18fcd4624706145deb970060e9c4aeb9b038d92013054386db72ff42e787260634820b4bfe8ee4f233000,1ddea6bd3873ba923bff1a4b4404a6640db36a20d106799c99317aa611ef7fd61433f68093a543b4e0119141298679e986f7aa6479f76ab81a789d7355f56c0800,94ba7ce09de4db39bf967e627a60247f25bc2f061e1d6219a808162c42a261730b92f81960007dccb62cf6b40c1b09c8bf6652a54a85a1ec1f978628a18c9e8801 +8c7e4c35b30a5776b7672cafa14a5fd06eb606c9ef582adfdf77b66c0922f7c728f74ff6f8b121ec15ccac8e3f222d09bbdd2ff7b8dbae4b88280fdcf52dbaf3f6145774874bb07d480d1d9d44867ce915ee69cbad90cc1f7aac49469cc44d5f46bf568c7b2b6ce8c736d4331eaa636c899aeb6bb903f777ab464ab10773f4b03bc44408577807a60989b51ef398921ea9da36274c39227a37671c5a14dffc300cb93fb589782a38d07c7815eb8ed78792582507b0ad64bc655eec14111f6521695116888c6901f3dc5e54c295dcb8b9764bc962d44efb5217f60ad41b5d7ede81138d4104146c61ee18d941a06bc92c93bec3fe757a1409e2bb3dc7607151c624d0,7a2064dfcba3e62d5c50db4862549189f843ed773b4b6edbfcde4917d0ce377b,126275df6234ca721626fc9f01d5f20bb8652f4509af2255e8133fdd2359443e424832357ea25cc41f0e477d9e64898d432d318dea6e1a4cc0ec116f4e4b273801,58e596541b86321fd3ebfb8d395705a5631c0c6c9d8f52d544d0a527e1a962cf612aabc0d8bdc9ff1f4476fc4eaf17820123c33d3afaa3974b1948d16f43e66801,ef80eb93444dc2b5f7fa9e5ce8b7bcadb523694776d4963bc5fb3eb0e71ecb9724d828d5c08ce6564cc3a068ed7d1e1a9d5d1777dded864030198fd68d039d2b01,37fb2824457b2f06d34466d73deffc07244f18dd9d363f2c6cbf042a3b40bd5a1c9f26bdbb5bacb77acad8010ca5497fedbd8140abedc87a3274b48723ec992100,00f26114606571942db42fb663892bc3abd853630f480cada91fec34d79246f3555c678f984a01eaac6b37a36679e58afb2eb79a9cc9ac8a9a4bbe586cc7828701 +51f343da10928f5ab38f7c5e2cf68e88693068deb56764b8b82232d4a0f9e8025897d29f5f6fcb6ed0e959e91ed419dadb1c9b516e3e86e7f9e8f80c293e4136c932b55048b5fbbab0af3c2f97e79aa4f1e0bfdcc928c38c9c095619b6810aa1a0b0218cd0b0297daf6b3f33d7cf27030ecf89deefeabcd3e477400500e13c9e48ab424433ad65c0d399ff8f20515deaa5aa6e5986984ed85d3ba78f6c0b59007029dc658300ed862c65ee472e70acd01c57c27c8f829d8acdce8abbdcaa847225ac78d2811edb107cad008a815a1927e2478d2f9ba4a3628986708a9fedd603f5a219913ca1f8a513185c0a9c7077ef74ee5af01a7f979bddcb548c9038ef33fd17,b0dc43d179a40be216d7e940cd7e04de1d2cf0b2970954df28f3a4031f2dcf27,dfd0d199a2cb6967c78d9058c48e545c9e2e96cac1d2aa6a490927794272947105a691591e183edd6c022da08145bdbb9bd479a602e923d6953bdb365e6d567c00,e750e882270f60efc7925d0ee1991c839bd43ae2d31a1965fe7bd4133a5d2b8d030402bb5aa4aa2ae2073948a809b114dd8da9c4ab05c01dc9f06900527af2ae01,bde0c22ac883c295728333cc9325bbc289d5d3b040df818bf0bc33b09550789d1252af3930df5b73e033add6e49a076179d60895df6d9549df719e5a610ad79801,20696e88c18ae2d8e6bd5a92bc16611ca02734aaa04875864d4396b8f3f5fa104de22e9487fdf5ae2607b56d15c91176b601548266f6e26769d088d8a089375500,30867a8ff203156906a863c69d9d042a6092ab8e05cd39f10a277934a277365c40e46ced97e942b5bb3fafadce9f7f0b67c69f31babd03a324d6f3919d58974501 +9bf8354d36bed44479595655c3c491a04d3a451a7254259753fb48032e75dbb0a23aa17f8e71f85475a07429cf800566af8c3e1fac674f23252744a520942e5cb02def97ef35c729bf580ecce556a54adfc443240f51dbc5605c2e2a94929dd1bdfc4070c867fef67902dfab889879b3da46853f2c6e6b1ae5ef3b947e8959c07105f918e0d2420674f8df4d17ce4be64606afeef83a832a817c2a1a1e0db5e99b1606e2d31b9069c12da0de55ef2bbfed878b1c38402de1087c6b6031ee7d2345ebc9d8b9a22e2ed2cfbd7d11ec8894629c585fd43f1ecd3b7b651577be7a1eb18b35b60d72d338caab9513b86a16b61e6af59e22593cbd9c19756b64ef02d4c2db,c21e2cba9b01781a3f50a710f8f75e42e65bb614ddcb1bb63f8ff1cb0832bf02,65ff48b09bacd1ec246f4d33b7e691f33f09291c881271e7341cfefd1d3f40085fb1a831fa08965ce13bb2d66129e8f42fc8f466e858eae5280b86177417fcab00,3d08de4957260c9e7ab0be3545eccd9339ceec41cc8ea3577e08510c4e9120d2676469c125f82fcaaceccac251deb686f0e93fe419a789830199d2e4b46316b601,db59f9dbe4d19ff56a21f21846eee27624d29a75b27ba09dbedbc43760f8ac6e1c6c5784ad5dcad9045e07cc88365875b15f34455c2ed789356520100a02531301,478d51b0cfff197ed68073a0ea9c460fd6ad318923a7c59fe1b78bdd87fac3f94908bb8c4228fc4081eb2c8dbbfeb33c9d0d143bdd12e2b77b3c879dd5002f6a01,a1da8f2054d1dd2805bd1f7e51c5eb5939d4e90564b643dac5508f53bd29d6ac27eea14cdf23ac90ea6e1df3084e265b46fd52c0403596e2586ddadb3eff282900 +d68f12875cf87346383e2d4e74035e224cf1ca3923529f98a93c81a73192128d44f425f13a40f8ab58dfca99c8b0dd7135cfa61a8551913f3f1e5bf5dd68f03d7957771a01611541d5e3e8f066bbd27f427ab01d9a835e8d5f2d01b2174625e76f24f42ca2fbfe68f02857a3d240eefe81e31c56b15a601fc809a6f52ef4783e593f11df24601853d566bfec17909dc7fa3bbfaac89943bfe0775bb6caa8167f312a563ee440d6ae47963c5d29d45c044d7cd26bdf27528db092956b5848a410b55ffc04871c2000d06ac97a2ab32729e87f8158a423556cf6fc6a50e2c266e63b77b74bdcff72025b4b70a63201e3a213525327eb443e360d7316d31f82459caccb,9f6e3b0ca423b190f3e568379e0e3d8f30e07c4bd1ce2b3ca874c3f547b8ebe1,893f1c418d0ed7f4c6ec1fe710666908fd97a7411988386c4f8978d3f1dea1553fe88485192ae5950f0d08df2254115cef3793109e469bf380296768bf8f6b7201,3f7d2a67420265decfe9ee79f698c92fc590932bfebbaadbf818a3fbe95c395600e978a1937a874b06e1165afcbd2575676e5d647551f03efd5bc5c355c694d501,d90ae2c8d60d10c31039bfda681e07e1c4ee4d5b4561e7ace2a0a4bf10e3b9e57c3fd059839d882acd21d34d2f63df3927e7fae3e91081c5d6388b00b768b03f00,4df2d6f46c3083a838c4b6e23531d56abd438c7b521eb969ef50c80ee48a417178a7af295a9571ff64c79f85bf894388a937c67dd9ceecd2e41a477e1bf0086100,f05902cacbf1d83d1c5eafb3fcc404b40ea0e7b31826264cf9484196d0d0b6c20c44b5a272119b5d682b3a57ebc92faec5cf82d5ed75b78c84aa27eb3bc9c6a301 +91562353a3c48fd5664e8efe7ba82322b975a8a9406b290e7f1147aefae00299ecb44c3785040c1317f2c581052616f66d81817112ca262fc9f443503ca12c8907db9b26811b567656e32a508e3284037f1ff06f6c8429dc5d043507a01aa05c031eab7398b624aeebab23bfc2be5b911af1679795523055ccbcf3d51841e9ca95f211b5178b6719c42a63397a4118f7c60f1f4b38bb551ea5b7f6004b39c9008889af43e35b4e5de25627fdbe0662d325fdf47d4e43810de99f7703aae8d8ad97f6225b4d54376ae6365466aa9ce509a66b3acd327b3e4a320aaadcbaebc10c8debf6843e5a6eabf9feb814fd8fc9efcc5a92c971302184f37e8bf225caa94729ddf6,6ab0766653a4f8ff94aee99ea0da5df2b107eb75b11fb1bf21026ea1c35d27d8,cbe67ffe3642192e7426b2bac090a7ea3300949a649d626cb9acf2f62feb4f492bb45f94c3f3713f80f97a3600e6950f4f51c9e27d6ede3406f7c485a4ca45b500,71cdff502e534a5febb527affaa47317a8fa467081c5ed6b064b980920b49fa563281cb62dbe6b468e0b8c1e6d7117051fdbe5ace66834622863fc55b342a34101,f53add47d775eac21f356f22d8b94a36b6524decd8224a10f8e1845404876229022bb52b95401d6b19db1da03f7bf4dc5969034e264baf6ec06d4ffc1573026000,92d75859ba27e8a143eef0986974499508a1b8820f9ed1744afac2d383067e826b4b7a8115d8bc2ea3ffe4329ddd05d10821e9eaa19c6fef64487d565a1afbd301,1fc020d58d76c0d9ec4e26a7b38a0cb1052e1f1785bb8a1519d8996fbc1dbc8b503cf64ea8f839f45efa501552abb1087220086e94061358d0f428632b2b873600 +497c6fe167283c1fdae85f92acf3179b28e1a6a2edf939c4cdb561a12bc62bf3c900522cdcf0023551bc1efe9ec854dc527f766563302ae5e8cf09ef6b1d6f6268ed077299798beca6533802f46f054eebb94250f253d387e48bd5d0bd5bb515b8b88e87904aca51c177c9c1dc8a52b004ae2afe494127b38ca5ca55792ef6fdf4e671c4ad3c74db2c006820a5505df04eac4aacb51b93776371cafb74cb2299e95a23cc4c702a31eaa5a225ea373d9073a2a7ab23b67c5baa7c9c59217a066dafafa776ba70be2007476195fb005e833889128b19c64e9637b53a8bdd13d470b8b240f1967dd493a4ac0d406d5845b6e27196727a39f6cf5ea460ca1a1b6d31ae6aea,19bf3ed8d767ee548a8468b59e54964164b4467af747111f4dddd277a3f0c2a2,273b3aa9f53afbbd1d5b164d71a563cded8efced4172774703ab1852fe91e8990d259270fb36209315d2b7d8f344ba62078e7fa957a3ad80c43245dda4d01c8e01,5d6799cb89891ee25c5a0a804c2c511694260170767c2cd842c4a5729c9d3f0a753f7aa10c6abf7de6190e4890bbcdfe8b9dd74a29b2ebb3b41ac42add21c44900,31a673966498319030d2881cf9117796fce32a7fa42f6915ae8d5faf0979c636511a77f57c5f0185bce0a51103113516228ddd5462734eb63cf50f32e8f0533600,ca74aaa3b8e34249dae09dd1fd5b415fab8c93bd6c74faf82e0592979702777628f54d52e9277cc2e2edaec546c3346e2edb1ec753d68c2230edb96affd4a0c001,d13d00397fcf5240adbc22c82ea23edc0722eeadb23843931d86d93412e84f005fd9ff9b83073e8f2f8ca59e8c3ef5125ce08144816753d2d4a65a9d4cef5e9b00 +98f17e8a7d5fef8263bae78669ee3fcffd602f3f7d3e4611ce62b273e5916b9e6c83fbc44349783b781c6659da55ea83be35138156cde84423cdd5352bd5ad0df4794247317325d9c4ca8a4de2a680265a2793674ec2a5a7277e40deb60f40a6edea34db96119d112927169df236406f0e254ecaacb35bb3693d19be90b3ea1a30f2dbd449f0ca332af9f4e7d87a2afe50cbdecf8f2471efc77d62bf20d445b3665a51d626e3bbc37965f447f0f6fe00b551a01d86e2fd7ad27ccedf5f92b70dd1f6f1c32b8f9d9ce3585555589c7f1a9550745d30e6edb2bd69a8b892bf3bd0cb87b3081b146c761a74ae287d34f42689712b92973a1165a43b3dacde5b1ae3e2b785,d01d039e70135355848eb16c5aa8f9982fdff86849e8590e7c80fac44d9435d7,2fe59980dca2ae1b613c3ce5cf21fd6a172ce374980122792125af09a581ca96668881398d8fb6c546c817b8ec24d333778242688be6898b64e03b759179c65701,56df134f24e62eb8066e23fee1fe335d933526e8028eed40d149098339390efb5616339778cc3aab741b5c5d2cf2d32c76e7a0d0b8cc74e0179714ee8b712ec901,75d5149bac562c41b2832964b85baa76eea2f701402d94745fdf87958223a52d500400838f2950663053aa11091c4b7a06464aad2005e6ebfa569529f1ec5df201,c48ed23bb5bd3dea867b806a6ed31ce66e49582e2539023ef92f56374fb6b88f067d6decfb6e7c9030e6234eb7f1fa347f9866fefae8f497cd92568197b712ea01,0178ed1fc25f7f6d1de860c71ce0976cd3236af202c6ea5fbde08b044ee34cbe39286b5de830872848ed88f65f2f64188b6dccc21b4bfd11e2d66c92e7fa3b7501 +01c6b0cc279736e07f5945208324dc3d2c2e02f8c2c3f4a15f5f01a5476d15bd3d6b543b6d248e8cd85f74e8e3fab6c7b470bf6df84e6785b33ff674f00e533591ff1fd8495d1a2e7dcdfac3f54d1b123a9e15895e83cc6237fe7fdda5cfd3a2276b904a3302e140936da05cc88407662917c23c004fc0afca14696006f0e3f54e8085fbd716b879faf5a1fb35e97b823d5265d1f139bdd83ce6c5c39068d39e3654f266f7956fd4f1a69fe060e5f3359f41537d21e53a504d17e356cf607157b296bf79534a9dffca379254a8c946f9373b5becfc4f208d0037ef927285c19b81a251e1a916fc1205e4c61c49d69d4d4caa861787fe60baf1e9b7f51d29ab90bdeed6,889391b2844c033a5666b6e314147b0e19938fbe943e67f7cbd553a5914cba5a,d4eabaad7f8b4b51c84d7dce389354cf105eb1bf37d35d8f0a8a1286a08309cd165c0023eeef1f75ebff3d751a9ec2013f30d5064c0da700607d203ce9318d3401,7e88578dd1364786a7c64881f2c05bec2f3821bb5a52ee39f6a8e269109706333b72e55203dc3eddca0592ef2d6bb9a102afa37070e795264da7453fd1d6ffd301,466fa08272dd6b9c09f9c80d0d80d57dcf70caf8d5b9044444631bbcc3783f1248fee55bb34f26a9fd62e8251ea3b8007e596129145a2466e540797cefe4c87c01,f75323b968689339d6c154c412af0f0e7553db8796f11c5898acd7913e9bda5d1db8e95eddb0212a195458d0755f0b63d2ca5a9cabfeb05a64b4bb38db37152001,eda2d75d791540a1b10fbf5761746b7472b065850b787755006a9e3bae7ae0d560d6868aabd58dee9c098dfdd3d7590643e32f47b4bb6088026a3b9556db829f01 +98ad0d341a5e7011959658b0fc08ab4cf952b9e85b792af823328ad912a6c5384402beba473e587b01ce8a33ffdb64cceda70edf96bc7fe0c24454683ff4b2ebe789752c295bc90f555a8c25eec7937c76d7c52f0beb19a6b2c1c353209011404326e0db879987cd27613b733c1cc96b656fa38abdc121dbe913cd4c822781704548ffddee0a3bf15d6679b511eec526ee03567bc2253b2a7477c395a0375d62c7cbea5b7fbd51433585c7bb1a30cba4a817cb6ecf44343a1767cf52bc8890c3529cd336c354cf206328b5047e3a294033500c254e90c0b1830c5dfbe331a18c4bb4419eb62ca8f9549139fa6c94bbdde6faa391c237e7b427b1ee5e1185ac9e01bb95,3a80c3eb8df6319dbc2f2ce9716a7894bca10480401cc1bfd39de03ac4e2b788,bded967b3965543a241ca71147f3e0942d7fece5ebc46236c6e817c3c3297f09120b8309ef4e554239bd029c9c38c52c93686e96d1d40aa60f8d631e61e28fd600,f0e5113bfae3cfa9840bbb16e1e99ec9778b5732b718f9c36d633d364788eb005c612443e962956875c5e3c9fed6a90dd517be56fc83675bba328dbcb3ee9aa300,5119e99059d9ed648b2034c4161f8690215573c3343883b44a1652f6ef96d4030a195b403617a818e83ffb7eec087addc3da4c63ecde1841d5794ca1d2c46b2701,40c1d68a29d26d992d3dbe80611b5447871d041e8cf50fdbd07a48e06fad1c9d154420c2f3dae4e09065142e66da45f45568a0c617988c35827f83f2645fadf300,5cd3d0819f30a428e6a4ce559be7f53acd6c130f351c7a001db66fcfd837a40d13e2f41fe84464449c046145591c787ebf9617e84049bbd82c77a6d0e23710c301 +67f6e8012ed71f0debf1ba52c3c8f35130c3e54cca9c617d8bf296333d7e5f2498e9582e1e32a95aa1bc54a8d1c8cd6854270cb5ddb7d683a05dfc86eab4155d7319d8de80aaebe6db6eb5a4e6da2f8795b58f7bfbb85916e48eff099aff1ae1ac3c7832ca42616f37a97208f63bee9d2f527696fbf3681a29c4ae80cb097c1ccc84f54cc9e77f0ae4be2a57d9cce2ea9cc1de0ccad5732082a5abca61fc49afd236db6a375f1f46c107a00cd8cba1730e83066bc8c62eb530a39395f74b66b1837d3229ebb6ea21771aea16e8c0be939e4cb9f3e61446b5f59388d440ad9ff3f507bdc3a9c22fd92de79de8272056e22a722b2271d86d0733583c63aee607652ca5cc,b8e971cb094778ed91706336e51884ba61fa47e50ad9ce0f6903eb2043541019,c832739e148c72aac9111b530fdfbec5c4e93f84068a160bbad9264fab597dd267de8aa82fa5baf88e4fac17f9226707d0814e08505a025ca5e0695ef3e414f900,f7e8cd863b452a45416b228297245cce8b62f407b3eaf2e674d2a80d3680f10c21b1c59058ac1672838955c4aaf9e99dff3beb23a3d4a005b23462ce58f9282d00,0fdbefe3da58b67bb83f492991084f0cd3584a0d7bc6a7b07791f766b8cf46a7721601945cebd6b589d1292d8783c745a0631c75d95bff7b0c3f2e171ae3032801,f34767447e9c8a4097b06cafb7c0de04e4b9c6e38b9ad8aa2eea4427239af8f62d968d5dd9b96baa0eaab7b736ed0391c72672dba32af80bade0d28e96e854bf00,7bd8b4f2c0459a4e77604c8532e26d7635c867484407517f6f60f0c98664acf70c172711906a79253dc28a699995d67c866d1fc9cbed1743a49265aa477dd65d00 +d4be7abce20074a5206dd821c8d355d0e8d292cdac38de1db798daae93077cdf4544ab050ad1da9eab56a928af503e55409039ed00f541c7abbc5b05350bd6d0b760e720c026c487c16e3751fe8d8a49af4ef42ceba94934dd23651daceb9e1b31a06c34fda091aa34457b628001ac5bfe19ed6bae382412c777576eaedabd93c4ffc8a8176dd84f47ece0c0974756c7c0271133125fd9a589d572e4bd6ae16a42a1b5dfa7472ef2d24e10e7a45a21db56e4d1cc8c738730f8660945ae9f64764b6a434bf10a9457bc4f69e5e7399c549b021beebeb6b95e30d4c79e85c71889add22760ac757f94adf8bf5ab71811173fe31b5db686342f4eb332dd3b7623d7ec6bdd,08ede6d725c6d7649965e42a8de2e751d53ee7acecfad188886b859f9d0d582d,cd5d1de551e4b2107d520b51f5dbe0219dc0eb651ea3f90a5de732564e299146323fde4bf4f8ae29b0afef2fc92de6f041dd3fc673e657aa9272d6773e08e35d01,64396c770fa76fafb0c4b58987105bcfaf65b64981a141582c5ed09750e1f0102fe4c5af8431a8987b2036e08c7688cff51ce1d7794856185f6a3acbea8baf4000,5303c5b32448a045052efb826a8a01f2c053713f6bf692fbef0b6caa964f54876c58cb328ecaac5f9c28f6cf79d54e876f31021524d22e5068479329406a271001,06d59620cee22d666e491beef3be3a9164401b06111a90d83b3819e212407e7b022a1f3ba0de8a8d9c9b45081d2090a027a7bcd871d6d32a74fc73f748dd37c701,9ad9590315a4573b6207548e99cb183ee24bd99bbbcea833545437682d8d68b278892226c9f93bbe62bd6bf915a36d6b3811251cc294859d3de261071524274c01 +04766408993e9ee41fd4ed2226b39da0dfe3f2aa42d019d5dd8f1fb7a670c472ed38f7a8bbe134e7104618f3c6f202bf7329505f612bdb3a3322b971b3f51ce438c90e87379cd1ba91c7ad51a6395d37560048e42a3c87f64b10073dda025623bfb0793674cae0f878ee03c1dcae798d8215bf17a971ee9dd907e216c9793f4d7b46e93b05f9cf2393e78e1d65519da8109f3b2af674dfe00093b1c87154d2fad219d58f171f4bce914420447cc635e39b2c7aca85c006253a2b3055b07880cd09ad2029cc0c2353f654d1392bfcbc996d5a5ce53c8f600ca9969859ab96f22c3a936cfad0fbe38632826a5dc52e6af0ef9369ea487c895c77a2e445772ca135d87e94,613aacbf3e7230c6029cf1ee98ccec01d7dfa8ab89a439098854e399f5c9a708,e8445fee7c97e7ff0dc4858a960ae46863b01fbf3b0f4ea5554f057fa1206de84bacf89c1f2b03976592cded19f963d74bdb7fd8794113bf757d69c4f1f9ea2b01,c452416f940b11619ff01df9c7253b73eb7387fb02c632e9480b226149c8bd4d390ebbdcfb8433f8d9f804c4df18eaa59420f4d232b6774fe0f5901ef78ed4b101,2c3c5d31e2361fb635adc7a88920b780a4403b2f16fc2a21e81377192b6eb0e105de37880346f9303ce0098afe3831877b25245f3250593ed9a3836a5591e90001,94a40e743f0f710e270450ec29753ad26b647291110991d46d90ee5ed408a4f857a8fccf422b38f912a878153d5a34724cbfbeb5e434e63106b3d1b6543d384700,6c4bf4488f8d89060cb1a240cc6fd19360bdfdfc2369b1b5e2498e185b2e601f4af47a32ec7c94a7682a7472c2502b3ce17952c9ea10eb3a216fde98ea87c67c00 +e966103f45787eb19478cd56a0dac24ef5ce680036cd8126c6f37774041c99c15cba088cc4a014de4dae69c2dbf487581bf7416b276be24c7fb06fc9001526324269335c1068646269fa99b5793ae3f64bda738ec85ec047294a7c2e92e8dc1f1bce44bd818e863d6bf7355484f48ec543169f84710a655219958e3302cb986bc7b571709c75a26aeb362e9742d2da23fd2f74a0095520a85fc15e157f43d6fbfd48be18ebb88577f64380f9035a0e57796a0ce3b3d22ca25287a89ed360a5d7d02ccaed10faf9bd228fd23a61bee7efd86f51f32fb1c123414ae42b33adcab6dddc23cdbb9807d1b29ad413dadfa648200f1bdc441befdedd6c70e92c69c84e2306bb,da13109adb9716ad9b93f5c221c4277d68f80b2ef4a85b42e5fefac2ea94744c,52956b658236e9b50c668b6aac1e30c0b0d0c69cc8061de8e43ba6bcf338fb12664a216c806241b66ca20f653fe11746dc19477472b883f982291805e356df7700,9868d633a1b417a124ab74e4e85c48560f8341cbfcefcd2276be24c059cbe866081894484ae458ac132eb3f28d11d96ea4a4e44484f383d0a2a40b71f964840a01,d7c49d20562ec402c63e77d758748b0ee29141060f2f8e4a2e2882cb8e9895f24fa8b0da7931d99f6cdaf29d49e11faadcda9ad7f093a33bf4e088c6bd117bb901,39122ad81ffba9ef612cf85ba907b85eadc2baca8384e46fc236ad855fda8f990f1be5f927d0a5b95f84f1df43b4de78ff022028f5000377b900e59c356975b500,f1ebd774237a67f9c7d1e5a2b07f38196032bb034d90c62f2221737826843d5d1d9c3ae5299c943f1debe507cde23e798f4601a577affd115ec77244b250f91f01 +ebb09cbb5ee30f8279948978630cef3d33a803c1b014d145a852c94aae591d8860fcdae45128445eeef4fdb09e0db441f51246ffb55120fea90ef3983b1b1e0f002988115489ee7bc7a8f01b36b9ce236a0b82f879f628262a52a4fc5c4c6c424cb4fc75e145adbdd2dbe5e6f77b07701a91f914481dd886aed781b8a48217f54b59cf114e5a378b00d6613843f5f67a091e8d7d9f655230440d6feb4cc0e265bf8eafc5ecf03aa58a79d487ffd40fbfdce8d27d7d885dbb348d8ad2f1e5f5b3d26f47af521fa9b1452ee7d89be55a257a868f599deafca92e95c653e62296471559d26224a3d8e8466184b0b33fd63045e6dcc38cd42d09b6fec45b2362ffbeb5bd9c,1d5c45c1e168620bb586cf7889416ad046ccb2a32cc47d5d4d132a7d834e2bfb,97f476bec1fe5f7251b2227956b0ea5c114ad52a2d24c33fa574c8c76f8c2aa415fff6340a14a08f487f757f8ab4d6cb0ced4cdf2c12a999d17e9c11948d49b900,136614cddbff0f883d00794dbb2c4f649db5ca77d08eafed926b2b26b66b40dc1521746a419d641cbbb6fe1cf53733af17b954e9c71f9ccc37dbbe25e13947ff01,79401648416432d9e06f8c5288d35783e2eec2a7f81663fcebfb1bf0c348575b057637b777547b10ca89a07f6cbc8ca1a339caeb70583b121fa5efddd5102f8e00,080f4facf82cc027bcb7a931147c81621d8edb633962ea79edfcb5ef53e7db983b6cfa941b306748456e220bce6681a31f877e505324073af01e3d54ba6aeb3601,f1562fda7d17604dbc7e6fcc6f019b35914157f34d9a62c0e6fedf88270e079b41edf63da70c49c84a912678c5b852436296476692dd0942eaccaa9c60d6da6600 +cac33688c234f1b8010b455e68814e1c446fa0d2d335264e7e576604b9f473b04c9bcf79f76b23ff1a990239285f510e6c30619fef0985a5c33008af03b2efa07f471df1186307fb81aeb2d30bb34bd699e3c1f8f7f584a15b26bb6dc83dd70e2f96640c4142b1678aed2a863c2964565381ed20ff09febe1d436d6b841e0119f3027d16589ecd6556ebcd2e31ba37ffc683c2493c4a25d2f0648e97d46fdc79050a4ecb5f10fb05776093c553af3c2fe895bb52b4386b2ad2b169c52de0d0b2d6d9f84ece02cdb180ac55e84f55a27546674c70ad73954164b0fdc708851173477a3b0d105ca2f70aa7915c94c25dab631f40b2ec52260626f3c0de111db902644b219e,7ef595638d4dbb44f63948537f008af7cdb82d488c0509d2b3eafa504297618d,83b9751fd3039511a5c5afbff271f6e2bc93594452128454eea8c9e728d747105243da4973a8ce558e8bc0641cf6c5b622f200937b6a46fa8915d9e098077dce01,ef9e18eab6ddcc692edc0ae3cf224242fe9478c702cb273c35d9316d0bb259d50a622d0f662e2ec8b5dd98dbd57e786084f7b9d7628b10a7fc9d6932d7dedc7101,d1d6b6c933a9acf7b62d6806f03de4685dd2ed5d72df71f5b112fdfc5c09646f10f27b1d30a64d1b6f6747311ab4b1df545371c48669ea4ff777dd686c45f63f00,4653e5b63f20be7a0b979ba0ec9420402eef4f1e3b62fa2356c5b09f5a56a6bf200651ba13d436e40a010cfd2e83b456f70050c039b426b331da62d7ffbbddb401,abaa44e794a01d1b49ea8eb582065daea1159d2b68aa17544dc3a089f4dac22651550d568fb9864156a7af794e0a03a86d203256e0b425455aae9fc70a980e7501 +bea83de3169059a52c730b826e81ee229bc613a51b95d6916db68ea9c8db5f3a1356d6ce750128ebd3f00fd73636a6a470b755fb19ace40ba4f56c507071513348f3791da1a6a741b2a61324d99b39b944e5ca434ebd4c4e4bbaa261e1c6251730c49834b5efc25bc06718efe43ff72979522ab1fce569ae781a048c6d1753de41ef09f7986d0326ee5e340910fe6aff16b63941fd25b7273f9f58026100bb5b07dba68cdf35857fe285e3509eab0db9eff98c63fbd021c00c0dbd24cc10e7c9892a32eff44d4b1eaab74aeb867188da00214c147a99b096e163be8ae77b8047af5d63adbf825af43ad164dadf91194f22cee2808b986d3da4f6c10d4772823d00277fdd,73fb09a470ba92585f9580598beda5cbeffa1e46ff836e5ba38a80a3fe86ece2,56367ffc1e9319859051e1cd0c5d673f84087276f5f4124fccbe8a1fb0aa926852d73e0acfcc8ae2df1180519046b4e6ecd86a696a35f442fc28ace75cffdc1101,fb645ec0d2fafc43d917205b2f083d440d56df01dbd4599caa7d8ba68e9096a4544fea6987e078e301c722faac734dee0a0bf2b6c949d9c91544b82c8fe95ff101,772b2abf18563ef52891e1e0cb00bc750b09fedc8b2f954c7b2b9a3925f9296d4a70f0d415b3036351addd1e2fb875ca7a72c78d3ec695959426dd04584fc72a00,c21bef930f20cc2c1ba060a82ea7ad102c0c8ead412e6d70bffeeee31149d6175341517e7c3a3a48f7d0d2c05a03f014978d2c19cb916f011f61bf15db1c0eea01,04b3e3002cc9a547ec37ea1cced0d6e93177d98e45d53356ae907e8d5d5a26724bac076051f3d950a04d3576d77712a46aad343a0155ae866030a2bad60cf2df00 +6949df756bce94a12fe133536bbb035cbdae222bde006ed92cfd6a14ae6f40dd6cb2763d7dd4b3c7404b51685c159e2ace5514ee80e7bee5279a36f0cb0f860ce3bca469c851d4ae26fd4923f3ef6eca412884f6d0df7d53d5cec4224e6a8588bf9b8602ce634fa3e21a795d9a3d4283111f83618b70b1011aa8c2ee1a8663f5c3f2aa16967c4068f0eb1619eda8c0aa302339ee5bab1fbc5e4a8d92dfc3b705a4ddf8df5cc6b6df2da36d73c35ccc5d1e09164e75d4c5a01a06090a2bc093912d7249973164bbd8a08e4d68e136a2895d912d258fd42458210682f8d0a7e6fe5e6bedb83c1d0e54e6fcada3214f94db32a8a85f0846bcbd1cac9cc80121aab17e92c604,c2131dae20786d9f1982d80628a4b616b3f43aaaf15dd3ca0032a373b1fa7a1f,d535429a92744b9c69d3bd4465ca5f939ab00df60b177af1a3b31dca0108d6703c65119ec9824da1f95fcc25dedb36536ab189aee87a9196c25f10bb9f107fce01,3a606c90aa1b9d9a796fe5e3558a19a4f08568f574aba4846e2910ffef41072b35913eeab6c27d3b6e6bf159b5a86092521c380aa0dd9d1c31dc268c7d93047200,e2c6af2d46cc8ba681de73e27e6aebb3c11f78e32740f647e8e850c906d85da6294aa7d175e3275c4940f4a34f3fec1edf35d5ff2e11005029a97054dc9f585a00,0e6f667c1ad39b69fd38b36a1d33c5c2e61be84b5f8609cd9c4f58d3708666531f4acbe6060d50168582dadda39029e163dad79f572562e82e9b4b9d4f38a7d001,c6a141a72e283c09b4884ac9561339151e7eabe576141f7866673391d8369ec5138e05fddb4aacb7302d90dc21da06a7cb84c104f3039023fa64fc7c2cb85aea01 +3e7bfcd23f76fca0629eeee29fbfd340273313f802cf87eff61f365fadd3f3aa499ff7766fc253348ad632e2372e7b3043ec612ad0dcbf50bc84b6f6f3e6cb90cb8978850e742446d93d5a222676940a5110b7e7eb3e5d201990ccaf2450f824a87dded40c9cb03ca91d52d392e3cffdb155ff46aa76e7e276a40977e04bb0f1f3b46e491cbeaaefc1f407ce210ab310eab6e9f836dc59a51a8be44a520407902eb2942b4a4876c38f5f56dda747a7af5124bb769929b14d5881148e8bf1692b9680015f046433cf0d2d35d5fd89822e0a6d0826f24128a9e45002e3f790e78a2d2cf6fd27fa9d0a390efe72c88f6ea96b89477edac91ab389f3e2184447616baffaae0c,ad15d5d55b8839e72de4e0dadcc32d34e17c88fb35190b86d794f22a9974417e,6a8d52dc20b919205f4f570651431b14a323ecab0d72d59135d00c6df479c71f072569ba6bb16a0929d1acceb8c768a95102a3f7c67024863f128cb33196ac8301,fe5a5c9e78596f82281c632c4b803ee95263dd1f55e521008fb3ec2208a0f72b7eb47886d7d1fdabb73cc25adddf9838a79d6b7e2295feba74255e022396e1fb01,11bca2bfcc94e3f7293a97f7472046b96ae1f999b03cbbdb6401ff9ad99281c53467a90ec0f9f2e33c1fe8ead4bfb8f123fe09e5b6c211113ceb1cb902fc34bf01,8bf544ce3bcb61d00995a71c43921d6d6e9978369b326fed25ebfdb9265dcbdd2665b6703c14450a49ec463be6bfad0c13b7c110faf6211ce327f301cf4c572d00,8d71334cf6da9ea2067d2fdc495e437821580178ea8ddcd4483394d60ac7e1c9743aee2b0c59a79775ca6fc9025c94d4a369cf268da0cf74e7bbc9aca2f2f90701 +ec8d801501183e0a59fcbf6537d03fd9dcc30b41a584f111798317eb38a0ea1b4b08a09ac6c51aa8d81e78aa32cc773fba36cf45e20cb6b3f09122de4d97234efcca0436c9ff356bebfb1a4937332dbb6961fe3a9ec763c34ce42b214fc0487ac7cfac63b52c279fba2979a8903de3b13ef6374c6ad6c85113ff3ff03046b7bd7721899b6f4e5c48c5e60e76fa4bbb5bb9d8b9dff52693b6c6211097637c0c360a2946383e37b39e43cbfc89ab75890b8af4cf8951eb174208f440b55dbc11d8835a6b740835b50101cdfc31e2190ad3a211f7708b60cd6a457914cd73fc75c5282e42bc348fa5e2f375fea2670901e972c1ff3443a8642eefad002b2c460029e461ebe6,00ebe1f12734d53b8fce1bec35ea0344a52c961609a3f9d3f55578e228dc0f80,47e0ced5b4262563c8713eba48f0e2fe877a7b41a338b4fa47e47d6a54b07d505a1a35f4c62b270ee405381fff5a332155a3d027942337fb1d0d52379d8f67ce01,9fcee3f3ca917ad322bdb77b527039125c5113f0f26e8455b41cf7984e4229cc3f53273329777b280f4579375ff5485e04a6b7c5adbe2d71d6de1edb3dce743300,81aecf424741f978bd6181ba0b65e8e3aa90793b987262ef242b787c9ad42d222d5c1309287f0e3360b286349f402dd805e78b90502d3f95caf7981251cac27e01,59d9a219136fec8a8fc6b9109fdf059c4070a5af9bc7ce2a93564d3d8d1ce8fc13261c03b73ca96b2a9eaf028109f2f40dc9306dd1fb61c3f20553345f59315f00,def73cf784664af49b806c816a8d3b92d20f9a0e9fee9074c5f854d9c1ab4eb45ff6ac334c5d58668b868f41f33113381d365663a7e6a9cb179e7d414f09304301 +c2626baf6df69bb2d4751dfa7101c565cd664ba5c074d204272333a732b3c53d357f4fed9ad367847718d0f5a172d9d0d9c694026b82acb82868ebb1087ecc0211bece9bcaf0ce539f608a5c343a331453b208db55dc8265ac67680f9ae2142e7d14682bc419d7b0167c0666044dd2feaa33c77226967cd29fbd61b2c65cf0d354857c4da4a4b92c43c80f7f1451522071ebd651bf8ab0e9948517fa28ae93bb12740f388612723ba33859625f88d5a9a22dc4a9cef2ec06e24f035789479a5f808c3954f0a18d47c9a55ef05ee1700d1dd1f94d0a9031c013fa2d3c5ffdc352be56966024466a1ca6a73748617dd4e678e52dbca66dc0cdddeda742cec2109f0d263a54,41a3461fdec2a7181d7226241da7ef9bc553e3089919b96ca8269436b67e5021,a00e6f73624fb76de7f26a308e306c4abf7598abdce86fbc1752b8134f6d16773f63d994e72e0c9d9f9e4accafe2b732c70bc3aec6dcc8bce933c12323996e7800,3dab2063f5c059b2503f09765f6bfcaa89154f08d381b9647ed429560ae42604072736b25c33f1d2bac224e84839a23bb887a0f786764b72e828805817bd62c700,71b5a0267353432aad438e9a92bf75586cd46dc4fa32e9d018852e22b0b99b6745625498d8ef02b72ffd184dafb1b2ce9b9375a8ba062bfcf99ce9eafb7b7e4d00,ddc2f9be49917fbc148b7e491b9a0c221496375aa72586eaab9a9012a4488f90589535be033be21d62080f1dbfb2811b9dd75c8cba23beaf50139c0c601c7cdc00,3e9ffda160d8c99fdd76504efe516c16f216c141a6bbf9c4abbbcb3ad46eb3e800ff53ee3e1f09d2a16b1faf15abbbb857fddc12f95d2331b1c1c6801546d1c501 +322813820521cebaa892c987f9eaa32419cd53a68aa92af80ed48af0e880a01a83163e9268324be9f6acfc47c16e4e1379924f932d3172d3598427615c5f4c651d5c51da9085434c1c3c8a7999fa24886c7d00d74606ed1a75f2f166e530d9a24289cda30d90bd2fda02f0b0a814af133d88fbf685201a64fceb532bd1a23175fb4245951e98239b0e680c6c9375f390b94bfbbdd86e58dc11e1d2db0e73d06be76aa43ca896e063931e8f508c94d5718349baf58e885212b0ad625ad58db2f5a9e0e09584fcf6bc398b325315e4877618776a6af5662207c6b264f8ff8f2b02c50df5df845627e57ab3d9ec81efddb150a771f973ffb7d5005bfd393dcc0f0aeab7caf0,de527198d91a600d4523f2773ba9ddd9f8372489f584d003afed51ccea30b34d,be3277dc45327e22a2e23e97d6b3a577fc3df624755cf716854fe774ba228b08419077d78e9c141ed86142f428d36f9574ed98f4c4d869dfd4310ba953fff11a01,f10c45cc54a2239a02d38cab3e3a8d2853aac22e442f5d25f5f899a9237901ff5bbd9f048e192dd3b61e0602ca862cdbf38cef2ffd0a8829712604f5374e829401,7294cf568dc09e0d0475c8f1c26d5a8d934c0c2982fc8beb1ac03a83213c374e2828f90a4d872b1f9289bd55781a0dcd8137044aa13d7e044faf321b0c46d3bd01,65bc9aea84fd47b7861ba2d5e32ed882a29a6202bfeeb1c2b58bfae66681ae6873dd9ed96142970c53d8c22587b3b25e40b49691dfb3acb3e994b548ce3bd14c00,883b829f4bb7429cb2727ea0fd9b508b476defeb2e39831661d9a9f56043fb8604a54bb4ac9e8b837c8b789999b3789393346f7a2dba6c0e84b2f018e6424cae00 +1b07db7c3db85734abf373eb02c76b10dcaba57926e1bf10f53339aab82f687ba3477ea7d05932bd16b88f29faec59421d4fc785e9471459ae44b952b2c58fde69edd0e1b58281708dfa5432ed2edda6c90e923c5354a89340dbf985d1f5405fdeaeca7bd8815738fc9f2549059cc694190b412d8e7c7944751d7fbf0fca39ab6df6c6b7361e65e14d2cea519493d9884620f72ea26992ac428e0a8d444727453eb8b042a12e1dcdbbaee15ba397633e8adfd1f76654ec901c26512b1c9816903560d90426df3f87c1b5dc8bb8e55bb5233241317ad35fdce6788847d4f83118fbec5c8b3ec66bc1a9ff2b4436b11194534575b8a842ce31a2eb4c077c67ac6989d679e8,540933cfdcef6047536bce4aebfaa18f58c7869178cb530f31d90a882220f47e,fb2516646b931fabc48e9662d7a5dea7de35e3cdd2829561014ec6a2617391f502b3b4fe507da9320e273430d49e6dc16062e1912f347489dfcfa5d1a5999cc601,c0c490c298396e56820f95bd08559472b32a40acad487987f397c1027c0d767624036a4aa69e8cc9088ac0ed0604c083acf865d164e424bed20e74f36e2c9f2200,82df7b35efdecd0f27717eedba4bf39fc6f03d5ac62dbb2fbb0c41be26dc9ccf383bc9e55817cc73f101e57a7738667745deceda8e6a0d94bf7d710fd267eb9401,bb36c6776ef78aaabba9b301187cf817dc39310ca0e0d18b9cdeb1d8a9f9ddce2fa694f8e3d3ff02827f2b3174a99cd2f6af244cd005d0af307aca4540cbdf4d00,5e3d126bb367021b8618e7bd77fa7857f33af99d467a942273a2c3c7c78eabd03b277274e55dd85fcc146edcf5d03f61690855adecf0789d6ad1bc2be47ce96301 +dcf9749fd70316af635ff6cc445b5e1912fc91054beaecdee232345957257c43fcb1af367cb50d0a1b5fb9a54eb35ad0fc3b418583402fe99e3ee9df9986ac4d274f9232ac3ade0d9a1293ca560f73b57aaf66caa320cbfb0a5dfc2827ff884b5b745cdd91ab54c52dfdd0bb332038d37147f31b73526c72d82ca36ccc534d02a765911f451b960bad1314dccd9ce218d00d0c684eed2da982b05e18009ea11973803114361d6807953f95b523f86790003a0edcddc6b57aabe2eea3d588efb87a93b9e758566a3a6e4542765e74e68adc46c4efd9a237c3ba233007e8a2a906cae4e4db58abd94581bec6d493c3b84690c58d5f24279d52eba27ab6adfd2d295243eb52,931b7b03304bd13959e17d6cc156b1f9b752a728a9948d916c1b85b1d72f9106,272d0d423f5d53e973e946e77ced0ab48e77409e4d81536b84fc96eefee2839107bd11a2a9b1fe5abb02af87762672370098cdbc943b0c33cf0caade155f36c201,f8ad74b3a8583629bb30c2b5a3c7cd3aa747a32a135045b917590215fff2251f4028933b429850ae333135699687ff678f3dc17d8d9f2a008c9c4cab155dc0e800,c6b6e361c82fbc21288f8782874217f5f50c18e71feae12753f918279df354966f81347e276f212d48f3f25d41c70e0cc572bc84927393e2e7911a205999035100,6299cbdf4439c387392d621dedb4acfd2fc0ec0955a2f6e138d0cfea3bd737ed188a42d0a871b3249dcfd3b6e0e7afaf914d3edc00ef4692b6ef8e52cb10c83b01,ad42fdabb11c83d6a291ff2dcd03e439cf8d34a8a593b529c91ac319fb9ddaf01848a4610dc914af94d7858afe49ddeaf74eb6008e4b14a08f3182edbdd2926800 +62f8327e3d45834fd507e42f9c625606d93c5cccc09467bff102ba3436dfb17953ccc5d593071fed5116d1532588ecc3a281292a35d15403eefbe90e057ca2324cccad5f0e1b58e786a355d9ae47041dd59e61ab2f6809e37aafdc4339a0d83eb488aa68694ea6c1e1b121573bf49379f855c4d83d83bad93812bfcd408356a33959bc57ccfb195064fb733e26ef7cb99910475779ecbbfa70e84182d862c1a5cec2baf2e52ea3d1ff9a1a2572d25782ba1c813a45ac0e04ee5f3b036c40f1cd66474aeaf1ece624acb8b45289ef50d202a546a4089a27db5d1041a468923b0c1a1ed305c61b824b6288813c145ae3315bffe9b4d10584a648bbe15b651c9f421ff06dfb,f1c6d790aa28926c320be3085e9ce8fbc8a33916cc4003e5441a84a49a97c6e7,7c6f6425be5075ef443648f52f921b525362c3f7aef52af9487e49aa01c5b1b71b02627e2c15cad066af89cdb138487ac50817f4b171ad73b0b11bb183ce42e101,5140256fc4aee3faf94d5972fbce78972cd104b391368fe7b6fca76aa7f6d1660b8933f379c98239dbab45c0889a1a0bdd7d1cf691f77c5597c63613d1e1a2f200,8839cf65fb84019da8aaf8c8f7d9d9d237a30f0f458fa24c7884e46b29d7b35d03f341ede57e38412a75469484e59f7862ab6f69305a7e9ef098426b116fce5001,d4e0259e7bed2ebbf35f4d4dc9665d31a7dfeb72cbf922c1efcfb7224ef98e0654a05ed3f7dc019182bfa64072b2445a42071fdb8cbcd957313554a4d307ed4c00,cf71253dd520a861345c6c000dd9dbd237191253fa0f3a074c607659afb223c454d2abd05580e726958e85f739dad2ac64ff4e89417ca254e9345863e73360f801 +88a0c53ef376a8aeb11aea509d4067a9babe5e829ed26f0be253767a27a0705276d9497841ec7762b1da247286c0e626ec82bfd9a28b56763fb70b3e6e76488228f1be344a06252a087e58f571b77c03c27e1e3c50addd94788c584a9ab18fdc520235732197971776d7bb5f6f53b2c1719b42ab923d3089b8accd697ccc63949fe338d909b7e44740b566eb9296147e11d2e71246624cbbdf99bfd0c550435df0893dda220a5b191dd1ff4cd7655c01950415ba979b95d3d8cf7240703346c42988982a0bccd8781f241fdfb670ef1734e9a10e534f76090b0caf590162fd1bcb469c7632a1f1dce2bfa60760d00bb713b8159f83bf52c8a44a61cee030c16b7c979d5a2b,b7450fab4c37a6d53c04af7c88761a7a01ea6679fd008b482178c6ee2baaef53,34ca0c1013c4a1ef5ae1d9e67709976be825018bce3d9dfbd7169619a826e8a840b60c19e8b2cdf833b03c84f306e3c36d0f5d5c4be2bc716429047a5d67024d00,f796c01a442ceb2dcedaeaca8ec015f48dd2926a4c4aff561b0984fe0957f12541c499aa67bbddc584ccaab6f16a738e64e5ef3aca75d3513f54b29d86f92ecc01,53cad78c1028d4e3fbd6c862557714c6eca7f2146b2ddfeabcd291fbbbe994544dc4e714cfe8128b105b4fcaa4c36b4e56ccf47c37d01cd3204ba10fb9dc862901,b42a5e27aa9e3153ac842bb026f844c38ce3247bc0d36ea9dcf5f37a584a2af750ad29a809793bdcc18be76cf47d96300b3d3ea053c3003f7e0bb5fcb2eaf9d901,f29cf6b5b69e2318e7751fd2038d241cb173618255921b4e447d7271e621f8a07dad50f3e34cb53fdfaad48bb943379ef315494c57b43eb93893c2e61816795500 +b1bf10c97796d954696e844f3a8b20d4a455e0973626f593ab0de9bbe014641d74a7f22944dd8e6b0261c4978f92f51a1c160face520222d4fe64de04320586f4a218d100ea9a0af05cceffe031c23022a963a166a83807159ec7e0a641cbd5c40ec05f125d2e4cd5c1749bbdcc00602419f8b25121d2140330bbb736920b8571a2c46cb490524112b59bd9804e9a4e5c11c17cd455687d16f69699caebd0acaa182475dda255ccb654b7a78fcbc32aa8c0c61f677cd92a156b9052dbf1cdf27d0eb80690110bb4804f18a87598956f53b07f2cff292b7d5af1c550ab3bf78ef1bcf5d12b811921ab563b40ac3a9d97702efdea25d4f543a3c331004072aa84edbba7f7304,1dfe69f1538c072f5ce4424fb23892ef5987ff1a3651c198704ec3c2c69a14ae,3362f32c015e926713d4d11ae3bc8b5fe46068c4324ef61df999a96172a58dc037845b7cb72eac9fd13bf7b38ef1f62bd3b8f916db33b461abc1af6b96f5688000,1c50c8e53da0355b95f8092bdb3ad409dcc10483c2bb42486dee6dca1ad5ff9f0dfab489388cab04dd65552a525b1c597e6cbe02157b74902ed4ce6d9bc43d6000,2babff6b6f01e0862034b6aa20c02882ee60797cfce6291fb38f57f8bc5fe5c2258b1f6a648f564845ad07a917158752b4dacd03346cd4b0f0ba4a1a0cfc4bbd01,dcc4b1c9273dca4b158b6847329d04d568b8bc03ff6324651115a028d2ff184755360809dbcd3540573d9a076ee07335d54a6b1510198d3999e2a3400716e4a600,796d33afbb6b4611524bdba977760569e6e66a92539f8e45a95c73a148a5c63f2edea0a13f1c99895d7028da32cfbb30f2cd023d722636971a0df486ea8ea5cf01 +572c9c450731376fcd19cc5dca69594b1543c9ac1ae39511acad75027a0592401b8d7aae0b636f2451aec151aa7d7dea934ef024c648095926a1446ae8b510c337335e8b3e6301ddf62983a5ae0d95582815f0c9f4176ddd41cdbb560e6a46f39051acb18c37cec0f0496229ff2f0f2628037c6a0bce5134bdbb1620d7b7aeeff574d83eb0001a7bc56b94f5326ea6a197ff0047595b75eb58f5ff9a990004e1576c914eb2b9c1a52783208c6506a32883237918fb970eb41e96be4bd928ca84e81fb4d17d101311b7031d7e0f151ac32aff074ae473d29364863ff80d5c65b07cb7eeeac6fe4f1946aa9880b64aedf1b01bb0dfc622ba82ca3c11e7b593431a2989ce9661,a06eb8eb5a90a35904cf7e3335560d2df72e11febc4e41ed1db9b2d1e677af8f,1680a1c0a5b93034357cb1415b1f3e6111a309e79b80bb893ef13d2d5f9cf88b09c9f39ef2fcdf625b706cfdb77a5d0f7b785b1ffa925f75a9141e849fc607d901,3629d6f7a4ff46466c9f5f463974fab4b6ae126d56ab623a8d05044775967469222179490309ece76bcc7fed72e03c3b4ecf1d5cc37de9b719472471fc429b9801,4106dbdb6134399d0a33c5e97332c1d83a3af0142c7f4968dff67dac4371be732efde7bd3a8c0a485ffabe1d6a3396781ffa63444aa4ad35ff7095b4356ff05101,f67cc3a903178f09dc88f6465a8221926d034acc6e1850998378ab5c0dda3bf42effb89cafd1312461fba1b79f85efbf8373e54a358ab40ee4b283715ba746f501,cf4215d1f19e2ae585d3b0116b6f5d9d108cd5339d0f1fd9c637a583cfcaa4a32b25fca57cc650291488bd63eeed403e1c086cce5464f8a06320a8db4c11b5a900 +2b0dcf16eb71118ec8904340b045b278b02e18988ec49db15a9b0d10848380cfeffba5a5fe0290e1e4452a2a0753f0721ed0c5c4f250dca8792ebb3f6eb5ea7d2d796479091a03576979e6b7972f4da29d00aa132908ed4a71a4548741b087725765c3e430def991e122fb921ebffdcbbb775ca2f97cf6859f1b9f4a26c159ef936c5a14353530bcd181649cb1c327731ad0a6f64ff03cd43d8568cbda0e0049e6b337f4b812e566a3984147de30b5d896544929b88c203511aad792c979f37a37e7bf183d686556f3ccbf16cfd71cc9da8765f174c7982937262efc61245fccbab5fe576643c61967b4d08f9d9a2d923ae5a44adc190672f67ff85b74ad797dff60ee8111,665e81c675a7428862266a5506c1a3634969a9d86bea366feb273bc483cdf375,869a7d05a46df57f4cba04173f6019403af59ae6e3aca6128052bde19554c3b63e22db9ae76814275bf30e9a5d0ce9e537ee291a7194ba05f6e4294d18cddf6000,840df8506c4267b9696ee221b9554238246860570ac30181b81337fabb211fde19d52c04b8e0a2b8c4739171a97b062f957d0e68c0c85539c8a45442610f5bb400,85fa00b028d4080caeef651daf76d8439c6310f6ea52ecec166e8190d40fce2071fb53978d04e9f754098d4e82b2cd0b83da8c834e02b284606e3238eeaef71d01,7d2e111e2d011d308c08ee4b211428463d7080be09eac4cfd4efb5f8bd4132c55a037f0b4901e4a7893360798a0ebd0cbaee33e56681094340cb5ce883e34d6b01,8a86bcb61b44611a3799c21c5c3e58ad50a79ae439cf2bcbb47409aad03e17cb24d796c6f04cd5ad2911a1a5071c42672fbef8d8a2163ff9c4eff52a256a81b400 +1017df606d6925f298ec302ef26d70d4c68b05fab961831badeaffe43e95bad496e7fa827e77fcb7771dd2273b82f95f067db2a6ffbfc28f860318427ae673f9b23bf25efb0424f83eb3b6b99a5cdc99f388bdc9392906c4b90e1cc86421657686a9e63375edb386c248d5c778a15cc49c78a13e1b8b04ec632e9e55f148e00dc16be45a9f4e3c075d1eccc626283c3a345af0f88053706742f3ed09521ce7aecbac79ebe0bc305f739b66b0c6b36a34564a02b44b192f3227d6836b793f1a77acf055f69be5805bc4c86cfbe8030e2da130a391758a527bea5d2b056a4d30884302af63a667b628638727e7a81c1148592bb37b1bedcc9a849f69de308b01d9fd5bba3317,5b663b57e1175b9ed0018269685733452ff95ac1b3ea967f5b15162a65f859ab,f064a43bbb4ed395d88cfc8612b9f9325f7c2d5936928461b86aabf740cf72941f82ae496a2b53ce7b99b6d80aa5952c09e95b3019bfae40735f891c7cf3774b01,0ef88cb2342fa46e71af96c34b53bb1e01f732ec677c1d8e2f9a66ed5f79862b089da985a8b7876f03221e90a34cf7667b5d17d4fd2b1a06a80e79674a7af37c01,30dc12147b629194c6a8ebffb6ea63a0fba883df21caea9882bbaa3a28a8068e51250b5cdc7d9216bfad5f50f38b0589c78875defb6e4f5ed559a11e19e0455201,69d89f48929a7b02331ea5681f2289a14a50a2219b96d251955c940cfc5956fc0f0f12e99133d21a2082adddaac22b2f669b7a67b7494104b77c577744cde9d200,21e7d7261f516fbf9904017f0e93330e8923b023fbe11f5a59aaed845d6e65757c88bab331db09f0b1e1d2a4ba84d224bdfdaf5b0e4025d199337efce7e4041200 +f27b6e64d64dce27384a1676276589fb36869b6219c28772b336a5a1f49c7c48135a99e775059c43e09516564cfa7b647460a3ec8fc8b0a59cda3bf044edd4101c37bd471344f5bcf71be429216952efd528a75edc9926b1c2a50bc7a86622b720d09823d04bd932fc2f7f399b26e30c1973f150f1634b747a4ee2c495d43ed59759a5ef0abcf45432d4876b8012e0c325e50a173f3f29f970c92ef54dff6daba206faa29670c8fb86838c6ad84966c998e47fe3242e934f187e5c20a27465ca183f780ba7a82a212f26822e54458f1a2e7b6f2ac1f948a275438970b11661d3649c836ef7b7cbe1e168ea0b4fe373d8be6848bea14aa621c023ecd556441215451106f4d6,2dbeb17cfd055d45220e183449ac70aba489dbbacc3d3ff5014ba0a612814ae3,6d043e917bdd17ddfc5330454ea2d129b55472846fdd4ef2f3f8d79968952bf86ce68ec020bf18495ca2011646bc908e28533796bc695c547f39554dbdcd68ec01,4c9987924c8e4e353b6025c741354807f24cd6712d1d1d0fd6af93cf3e3b41fc1d7807f3be9319395e3933e7e96f178f3307b7ecdd8b145cab63ee5b20845fd201,1a0baba099f7088f8fab3316f90a88f6f18956eeb49d1d24374f4a9e1b9dc37a083a096f28f1223b8ec514dcd8b4a8816c1e03bc51075329b59bc9bdbb7d4f4b01,8ae38831c15d275f8badbc5efcd9ca825c0279d4a7a66d7aaea352d07065744928c6aa294000dc7b897e93cbbffb4ccbb414ab3c5081a15085222ddef204fab400,1e0b87037d1af9064b70625a3e5266e56ae5a368e69db09ae69aa98e95af7c8f6410d47922effadfdf0ee64e52ffd200df57e84ab46fc9ac83e8658d322038fb01 +15ffe40dca0e2d1d0214c5c8e4857d6fa6a1b3d2e6616ac9d365e149694360668faf84696727e6ffbb26c0658a45a2385b7471cbdbacb19577a35f4fdb59b58d44b41ca821ec149da2995ff9818ebc31a176720091944deb542900829432664337f74c918bc2f0255e9fe1df494559d38fddf0c15bcc9fc79ee7edfdcb3a47deae12785d5779639914b5cd43594dd44356d55ec7ecc81db06d2ce71f1a267ce04b06b40b35acaafc4e22d4d8515d3a025d8f47c9731b337c7b97c3d46daa876f30b9238df0a603912483c5901eb76ad2b3d6c49afe5e97629de68145256e7b02fa19e2695ab32c90d5b4d31d76f0990413120f566eca19b1880dcb6053cfa95e7e13ab2914,147219e039ff21e9915464b2b2f4692909b48944fada7185e9f6d3a04688b106,e10b3ab954bf1b560b2b1c187eccb664bdda78f801fcdcab4f65aa8adf862842130615b0052448d0a39200fbc9d0b742c651a000f6ae81a536ef26a8a94f8fe201,b4904f265adca859d651d15f89dd5d2d6e0b3adcac333406a7bd5c2df46b15ed225ec670868a3d7ca050a3a91dc170c3a6101dac668f1bcfe83cb1707dffb62d01,cf794145efe848a46570c74f65fb8836c1232a9aae7008b4e8e343b9b594fc57415e07a7266b0f52aab84572129ddf5317556451ff2642ddd3b68061bc0eb8cf01,fb8c6f0fcfc1427e4ff18f0d3cd9fc47fd900f966d6855528e37ba9001e422707b9e457f8c8503ad402206a9e7c0ba68d4c563da171c5e5ec7a56ffb17eaf51001,1bedc0009ad361beff6fb96972004f5bb57b67f74943d5fce92ef83148f2e5e802b2b40cbaa5d1f218d6115c9da175ce8a101d77815507cabf8763519f39a0d801 +bd301b5bb1579559b9184a87126a571633de085d5da8b963dbdb4d9a319e7714a7dcd908037a4c903e3f1b377ae927a3df47807f128478502bfff35ab5cfa999b6a389d7406b94b1a8e55149985bc0e96966005ad326ae0cba2a71f3b2b633aaea1aa6286def21c2a71909e5caa1892595ae5e58f812459e9d42e287c5a52fa3d8205771d7f4e7064896fa9d43b1b8c5b7f1e33c73cd39c9f176e9d7bce6d0acca382c1abf600ae2202d0ace017d13e5bf3933723afdb0a1e6f908911c51f6ca1da050cdf3fa1a6947f4f77bc3a8dcce9535cea4e17059b3f68b378c7dd11dd71c9878e4092672b40780da908e47aafa1a9ba771a35f4170ed45609f38841984f04e6a2854,16db2eab5dd6867f0c9e52627c3ed746cab61c44c2d993145aea5f9e80c56478,84c4c17e28d242875e98f420824d6cf52fe41a707b558ab3f7bb99129a4f04345f5fb5145456643b655f728f6a286f4d60a86c44d14d778901ce22d6fc85a9dd01,a5212b544fcd3ec2b7a5efbb00707daa7fad6aa41cf0e822430dc8485885c3c051b16bc36c54258e727fcade9d3768df77a054cc4a53c67f7149a4950f873c1c01,96688bf18837676a0ff4a5864669c41575413a986527ae922bdac5d40182346025963d4a9f07d7ac100800a375da421a94ae4c13cc7b7f761b0b4a370504950201,ef5e3cef2ed7ce261483644478fa45db9039aea6bee052d9ba137fc360b212c718fe6207143b4200edcb2056781cd2f2a181b6343d4fc5b809460df34b54fc4201,8eac8c56d9491f527a517fa03bdfe6b670cd97081bc7e99964387e315d94eb471871c4b16621e15af1a01718e6254064f82a2518e431fde55fab88ba2ecb154801 +070cf497a13c0f93f593a33298074961f2edc41f5527007aafe27c4e51118bc787e8c0b37d025ed441f7835d27b82cf5e93603fd6356917cabca0cce1bde2472755be86efa21472d0094238ee6f5f4187066e30c50b09576f53cdb87063cd6909cd26e263cbf3f6b9f3c315969561f9370a29da079478401b5a854c1caedcbcc2facf7929d4f4da9cb890b02bf7d5f92496acf1481d137a5b322129d95cb6e0246b1b5336686e92bd884006deeef7a35d72743e3328c3ac2c06ed182ac50c096ce7d40c9bfb9e10c9e849d5064d023382266ac73fb0c9fdaab0c145fa90e71e3b5cbfe0429f96f3e9d77659293ea30ae4caf1887ec5162bfef4fd196f9a91300a0814fdf0c,a80b691f45d19a7d269625938f437d8ef832f82b7631a4e6314075d093bb194a,a420ff40e4df828a2737a5fdc6ab173b871ede92a4ebed97150f540d9659c41944ca9dcf2b327f61a2401724a8ecfe0268534344fda8e0aafe18a909f1712bc800,61608cd33e67a249e45d9791cf23d5d7a5f84788b12d7fccd0a4ded2ef91f90e5dacc9a905991701e0393cf2354315220dc668f9f922fa801a95b649e0d7fedb01,e3d4267b12f10e8aad2a3b68f2096f0011d4552e034579ccc8d967763c199e1235413910ef88b23fe6702e3603a93df700445974ec272437205bab837b69d7a601,8036edea76f9ef2a5804b4c3e57b563192abd60912509f960041045ebbc27b4b7c75a2170a64812e6b17948571dbd687d26701f0e9678e01d6089187a4399f2900,bfd399c38aa1336ccccdd41497d3da5bc7c37deef66ed9ac1c61ae895922c7f9620fa680e005ecf1da54837088cc44808148aa0c6cc104e0cef476ff94e6312301 +e67ed82ac25d4b25095f2ed68b6606bb5b94ced60a69c04583450e89e33cce28fee2a80c5257d475d7c7a304620cfad47dc2d864233839e79149645f62dd19be635937df0e3f76420af98918997afd66b8cab880d571cce1f375bffd658bb3c2d185339f0b84de8bdb999712bc7653cab7d229e742575434d403c6c5089252f1038d33a7286eb1a4c3d22554546917adb92acedcac38c2313cb21b5fed23f92321d6b2dfe6c6698a573dd59cd1f7a4dfe47fbce586d518e762a0a5cc97482ca7abed3b6c9073905bb61107eb01420d653bdfab6cc4db850d2ab11b19334b2b0bdf911be001b988cc84a666ba84956689f91c6de27f1dff930d83913997b4b8f7fb2aa8e392,f5d883a1394c348f5cd542421fc31d18a219603531188d44872967e0956b2ecb,d76108577c82f7848c1ec71fe8a18135a822c8f8581ab7a2253c7893b8fffd6a23a1a814c2bc00d120c97aedf88ddb6e729bf2078bf70b7895cdd7a290cae0de00,c560aa27e6be387a8b0737519492c8e1bea5befbfac13d9f9065ebaee42369b937a1a5ce59067e4ae908b7b3a2ff2b825aae5608d958501df1b2a7c4f9ea8a9001,88003d12296a8128777f2cf8a79b5e47a9e8002eab961653dd570883915fd6455f7e8e6d47a01f61401b98f7a1200673b58e690d459009ce6da1ded5b4987a1700,bd956b33744f95d8f2dc9eb788c53342409658020a3ac55f00f2ba2424124ab53331bf0b7a31085d444fcd1a72b6f368d92726fc0276f0d5ada44c86c83b74df00,04b85519441a256c912fb2f975021111637753ef27609ca7045952e413ca8dd82628d9c80d365ed1b4e17d89f006e02d14d5a0d35ff05d04382e9ce964daa68c01 +c0633dde3e0f6e8a9eca3086e7e80e6c81c7eda1dbfb7525f9ef1d5f28c62698f3ecccaccc4374b5e00636f4e86263e5b3823506d5b67c45269ab9cf822406dc6b44888836f7316bf9965880e7712ea312247783f9f4db0e8fce7ead06050375ffe8b3c04a4253fe718631d26e50dca1f465292f476c508931c3ea1f5db62bd83dd114768f92f167d55883ad52475ede0d9ba47e143e2eca2f29ae7c36adbe09d638273374719488bc7dbcb8934fad21e81ab7235e68ad1b816c0ad8ff1a1482db749789a1fb39d04fcb66437779babcdb3ee8e64dde8b474d8d2444e8aca3b7fd29888283f12e60a6f8ab330027759b9162803e4ae35ac58995920ebe0384ae6dc70c8c6886,0ad67837e94d32ee66bdd086ae8e57f0a03eabcf393b227fa0223e63682246a0,073dd34b1f4a719f1ae471f40c38f005de199a0e33a7e73f22718a1fb787540804565dd0e9b4e83fa8b4446497dd49562fc49eeb17dc734883356c50be8f306301,5a47386f825dc7e72161e1d2acfc4440449e725679456245fc467a8d927cdb733dd7ccff477948ece55095850a9af92a47761da81d39f966cf25efa5c9c132ce01,3f62677ae895fe4df09cc40e37848497f6e1552a6f3c9027a3256d6b9e33d1585d0a8e1162f710e05724f30a1b469d1453e3919a8fd15f371d89d15d166ba8aa01,2054b7daf259f5dc4dc6ebcca6ba63a0dd7ffcf282b27556432a58e47ad5f527723d7eed7f566c0226faae190a0946e506202929bdb98ae96270c0b388c483e400,fa63810ae5fdf095e8d9f7ed1a6c8787d3a44a1ee0e3899a45c28ac56a30f056692c204865562fb11c140c03ffe80ea2619e90239927b3ef0ffce71305e9e68d01 +9301b3a912a9e5aa9fe0352c8ce3e190a479a5137ee718a4724d8e76d8a267c5fa06c2e1739294c9fac24bacb608360a059afd2d9a6917493dbe59cf73dc37d44556ccc5c6aa735f18fabce0d4a637f815b239a6df8068e11f39527fa1981067341b11813e8c2d45abf1d89070178c36a99da3abfd1cf65ff5c160397f5c3a265ab47db351f0e0dc804fba165c0178f6c1335ff56fc0e210dfcf5f9ad31bd33bd8fddb4dd6a1b30e08153c9a6ec1a424c64ded0202ff70bf3eb088d032a6058111631ff1b12414f5cbac5ea365597e30d04c9d985e65c83bbb5142420badfcad2c287c189b2d7a5a67616848b19099071a2015a754ece88214d7d9421637db6c33c21078f5ec,0cf11f5b674ad8a360c3180bd1f1e61db7b2a1755a07e9736d4f0009e6eda5af,ea87465109b52cdc55ad06a1dd49809acb95e764c678bf31917667584c986531169a92b5998ae4c41bddf6e8a9e5f6a8febb53a6ce05bbc134d7fe0f62f0ca9501,3ad101dc8e353c9a6daeccdbecb9970c87f93a66b0ec08e355a46f208878a93a3c3151b729dc2aacd0a284c14675b46aecf62a46a53394005e7fb3cdc2775f9c01,360095329c268d5f2927e88e4bd4f8d0c52ce643c2c6dbef0938408f8c1b2f2b2d5f6041fbe449396a1d60386f7f77d4922a3c2859b6b6d1f7a347bc9329604501,9c37a93d44084897c373adee5d9709dad11c468f4de4875636c545be82f6740442e861c76492f6c821ab58caa18d68802f016b1c3783b55305cfd28302d063fd00,360d05394ef022df1211d4cff14cc5557b98265177c70a1945681351d44843501b53eae05838f1ca4fef6d37c8148769413c1b8eed8349c002df57ad279d955100 +282ffd60b0d775aa686ede1aaf235c2e61c35ae77be5d26305d834af604c10bd2f44833ee7768a916f98f3d6b52ce4da2d080e6ce50d74f5deb13c18164327bfee800a6e40aab9f2219df539678f9eb5a5a3979481d0d82cea4508cc9d971a7141247976b26e208ccf94b41dcb176fd98dad6dd2f07aa6eaf48618b998d74d37071acd2559ff6f7f7b673310f1a97971df281f29cbb3a7be63df988a72451efcc765cd747e9697068d37f349b7b442f7cae5277cfd4982984ea414a289726ddc9b8cc2cbae99f7c9dc3df60edf49e6c8232e898c347dfc3f2f11feabfa523d1df76ce546c2d6d3acf689e24e8f941645839d61715f26056ae72301d133ca351f09b6586f1313,69b080fa2c7177ec0d2aa665da4037342d7983f5daf03c11ab89abb26d9fef9b,c2ccde80546933c749006989069ff44091895249c850c0f8d1d7ed065b63048236d0f236e4f9dea77f1119cc50fa9027077fb001067d030338d16360040a5f4a00,4128be06b89496b170b2d818009d2264465eb34fb088ab3ac57e72ce7756bbce6ef9ec0c897377f8cf05be71960c7b53b6dda0555d80720aa8b53c5a874c186900,f9c2b40ccbff94cc16bee17e65a0a1949e355b23612d6537dd3df2316e9cfd2769f4e153140dacadb80de9a71a3ecd597c8eb5b810cc341a7fccd71e6875728200,a9c2c53a57873647a247d4a82df43d66bc425440695028fc904f2006bfdad19909dc728e9720b825db6b577525e6132565802cfa4881096952d4094a27e4830301,3df80a940dde5b063fb59c0431f55130c63169e442e8c1f0507c835c827b150610530c24adec5cfb38c66d3a6f5d195ae75ec895f5aba6ec6f4a471a3dad3ef601 +23efc33837fe2b1ffd881431ebd4b485532a253eca3c37689bcc60af38a659149e71e75510f269da0921e7d7b615b578723d6e5f83ffb5ef0d4deba6e2aa4a986afca9b8211017aed57183f62ac363723ebf7d16fdb35142d71b991b016fb148ab531b9601c808c4ffb2969e6a0a3682cc96f1a3af45c84002fda94f50e41c899cc2b58c210721b05bf12bdc6f30e0fc8273deee72ed6b2c85499c1d17eadfb58afa8b4c820efa4ae09a88b42ebfa02dce708d10bdad1d6c4951a7d55db27cebc71c566647ca647c6e7c51eac22a690ef6c1b1113a4bf37450ab4080e66eaf28eeeb58f332265e9f2802020e00872632bc1db4f56806445c1938970ad99256bc43c5eb6ac7a5,353975dc82964d4d450378644cbbaea61ec65e86bbf3699181d81abcf120816f,14aefb1b92b18af9753eb222bae4a9d70a490a122336f4ac7567f97ff349751a3a8c383c098df4d5d753b49861b232e87ed611f293e6841c4b09f897002bdd7d00,cc145b550fe485e0dc66160836ab4101fa4b457e1cdf49540269dfec63af2d60679c2affdd058a15d5218fe6dd247ace867faf92e02c756e055253e94ad2b10a00,7728e5b5211944f57a70bf981bbdc25b02bb77b927cdaa6538e7f95d3538432955fb20b931f232c3dc9f4ac4024cfcdb0b651120f1d1a1fe229c85961246651301,e10bce8fde9979d2c352ae44e348764ac3aa13d458aa29c690584446a94673551e6f7af59d49dff10594f8ab24b7cb8d1bd6df3145deaa2d6ab703fdc4a4f2d400,0217c7429552a1ff376cd12ae97c5e87327d416562de538c0080b04465417c6e6c4b9522892bc657497d13fdfb46a899159b324394000c26e1492dfec92c700401 +27bbc439fe52e3920411be7cc4d291f78fdca050b985c040825961e87fe49f9b0ee3c070ceb3997dfbfc31cac57d3d3153ef7bd4d181fb58463e016cb29671e922d60b53c4c0e92fc59c6924e2ca4b2523c72cfd22504b2937b5e580af1c3a06152de0271fc2e2e0d61b49e4de41809627107751a799b774c76200167257c7612c007e34871ad57827e7db6355c9727335c964eed4e31e7d68e311902136f0079ecd70e1c5f95e9fe1d8ef5796a40d88b012463538422af17a9ec72f8d36eb2f1eade9e7d13431418eb5b11c38438cfd54b9630fdaf2a8bd55a4286cdc20dc4ebe14b9957fd3d1dacbb46ae129429487e847e3f70ff9eab76ac86f6c448e01acf9a794a062e4,24c8fe7eacf727b612461d019bdc7a343dcc2d7c249588a867bcc8829235740d,b75e450927720ab27f35020e5ff6c6047a8f3941f6d0f1b2142e85aefcdc8aa87c7576bdca221b3d1ec74309fcbf328c2d1aed9794bc16fd960474c04a3b978301,291521b6ab23a479b22e3552faaa9e89d10a0d9b294e071815608adbc97a94e045fe4c1de5cb1f404d4651fed9767d649fe807a5e3af95b0be230a1f2eb440dd01,ebcf5220b8fba35f5b163395819e311358bd94b1a4bae4aa3dd22da563eb51cd18fbb5034d3eaefca1e862caf2fc6c6babaae9f99e35f233bf69d88bdf5dd04401,8c60acbf1288ca4658fab356aaedc9ebbc522d5a9d6ff1eb73155543a6f6f522181ddf95cb97fbdc7963614cfbaf3d10369d22ce702815e28c647af93d95e80e01,edcad582e62ada22a8ae8833c14da7a5e4cdbb8bb3cf46c79c4832079d3a0e58246bdeaa0a1b88adc696a5ffafaa1281624190c9178744273cb689146d68d3bd01 +b411c3e9526001be657ad898c8088d0879a04f3ec32a938bbfbefd4fe8a170044319f73eb22f44daf5fdfda967a511c4dea3e6209aed2b80cc926ed2a299c325c52ad18b0398c5d9953bcd61497584485ba45c1ac0ca89e840770b84754602698608db2766a4367aaa43094dc503759e83ff7f34563f7f8a75daaef1406f46d11db7c3880418f3c98879d0a6f935bc8d10d5891ec13d3cea95015fff1a3854e390ebcbc7cc7fab4ee87521f6cb867bf00918f032c0aeef3f55b1c2a4ad8b26a39e97de49415ad2cea5e20b38315337cbe6a6a367e4c0d35e3942b773125675806994e317790030883952506c2b1b6f206d228a96852f0d6910ef5b7689e7136a67b0a51a57e8,dc0a0c76cae0f6e84f1c316c4d045706dc6dc5b64253a1c9d176b4c25fe54e00,8f4f6d4d310dea5a1a7c273ad3782e59b868c47b3dabe7ca81508f422675af9c31dc9ba8886c5bffc6523812524384486508e34e1af64f372d1cb839a55f856d01,bbaa9f23aa5944322fea4e34ddfa58f532bf98cbec0a0a53440b56a940316bed672cc293d56a39b4d993b46f7b74bb140c8ac56af2b47d23c4fc6558b495482600,e72542b00a607514dee3d12e479e21ac5e977aa9497addb0f1c8e5fae103b1a4706076b8e9b0c10524b5ff13ca187db0070c6fd21758aaee5ae06ad5af89de3b01,4655d87957b195039b5f00f408a5e019f371d6d18de409ccd6dbb973964e89f14a8c8a5f34689275068520352cd7f128bc85bd9d1ae5641caaa3159c6e760c4401,ab29a6cc50fe7ab4ccc97e561b6a03fd464c8d8a3e43706cc95b7aa64b17f02834434d3956e8eac809620b57050059e65a85d7911b8e85a6530ae03f2608ad3200 +8e3939a6221bee276a4f982e03fe0832ea7d883fb089a0ef7c6630f6499886e0020cf3ab004dca8e6877b3528ba519d6756c95641d51ea893a1b0dec456361a31cd363ab286bd81de727996e6915a8c5e2550c764cf82dba8a39bc667db695d4e3c7da387da1d4aa8bc2b53422d01f759895822a4badbc696f29159b92cf890b298a68b49776abe801a786b81057b044fddfbc5ef669ad43db0d1bcf9f46d5898997cb3fb40521aab487850a81fcd74b012a6ae80891a5ab77b440e2da85e72c1f23aeb009860a0b5f9e4412375e87400011223e2a5a2bfd423ed04dc96b9d7e8a3cc997859b6709cf0a87f96c94f5a601b76da6425cf6b80c2cff543b14ed4557f5f98e2a97,09425dc23420049990a65082c0240b4ff70c45e071c1d68078ab09291865bad6,145c7f763083c5ec42d861fbddd636a729b452bf90ccffa6d2e81020a8c704052aa0158c859041bfbef15bb9b40bd27f46f457ffd425736311023511d16ba29e01,1643d1156e0190cfbe50a2900dce9fcf339af52638c796c253d2afc76bb545b96f7f8603a22f063834d7fd7381bbed477e454524003407dddbeeae5f96e6ab1f00,773caf66500c2b022aaf46a33c256377c46a6af7e84808260c0f7cb3f64328dc2c08649306ba89f610716d1da872eb9b6cac93b7dacd8bddc3f7af46ef52cfe600,ed9c1d2621e5b472d76be193af9c77cc18f8b20aeeff888c938adc38ac1b84d30b5ae66b7575632220838debfa884a0a42d0c2a53aa68fc156721f7b8771239901,2c6be4094f98d037bd96130dc948ae6b401eb9a20d409ca963b81fb8ac5db3c15705d91f149bda82a5c5af00fd623aefe8819d8cda489b0577353c8a4f04b96401 +8cace4379a99ef0fe8d2dcc669652e175c76e54e63c3f6fd0ab6ace02744e882ec1ddff60c20c007a093980bfdf1a42fc2689b9b7d734e7ea9a7cd7a760e9686e609f6eb7584ff1c4026ac6eb3dea79326999cd8783f4ab68178bf5ef1639540e01c424635267931ea328538edf5729c6201b83a32e7b71bdb09c7e5674ddd8b58c3dbe9c20cef48654855f86dab5ee8d312fe927f24fffb5aecc3d709b56008a0b5a783dfdb518009b0b136ce954a1b7d8db4e0c8b11a4757040e71a8f9709401b38da2842090747fe2152c36ebaaf8100ca733e96afb773258706a51a2772f8cf3c6e6b4f1adc0e5212ac345014474606f9fc14cd2dbd4396c30ec3f022041c6b5f54ac5cb,2999bf3902ac72c4dba472660cd6815378c0c629bbfe7f8420231f8d53783dc7,0673a681ae511ae8053834f85a65c5c2c70f1f99c433a8643ac651116daf46bd41807a76c27a7a606a0000c44d624db24f62a01ff7808635fd064d604f3d2bcd00,3ba80ec0f71b181577729c393dbe1568d350e5fcc10575b5ad5ae08c5ad808613cdd531101d87d6ab012f62c5265f620fda52c15b4c7708560b5f9e798ede55801,493895044f1e7b6b403157bf57500f7540634219c65b824c9d220d88450a4cc510348fbd79b5f040786412466bd70146e82d7ea7fadf2a1269644e19f179e4eb00,f7e43b9491acd88e7e90d6585850c4cca74d10d16774e6c2fd5b691aa40113c36975bd96487b225fc9b034def561ee20010ac60ccb8942c2dec590b84e7072da01,455aa2ac978331ef00bfe5e164af24946074dae42765aae148a3cc68ca450bcf2efa0167b7149efaebd31951f8bcf1cf046ee055ea59e0944946518cd0b5310401 +325db580869a112475408e920f9081c8de4980da70bf17bd691d0994b4e2f63cd9774d3e238273415f9dfb29f3a8cf3e00d96a0b29090054ad6f312a61274eea89bdced723bd4f0a02258ca00f1aa2b05578d1d1b2024b6a006fcf14113d83c5f833e7da7219a1339bd76570c00defc423656dac0d838e765b461b4af5f8ea7e179240d9946e2d8db83ad6981249f47c3f72021395d0d1052467ffdb4c93c40138ae6438e016f1fe507a9c85b023d9e7707690213055718a9fe1167fec01600c67654f9ad38d489d39c906fef71e2d78ef27ec50d8c47fa6df058b6eec730cfb44ecb66236d1653d64daa0d937bf4b1275929a8cd6bed9662e2291103b8c4e78c4a39500834d,f88860112107f27f39ad32846acee932d99ae6bf4edfdf58367cec5ca5c8a8bc,d335d7e9dc2de86fe6758a4638d9dd81fa6d3949d3775172a22af2a5401598e157367fc0714ca12ce9dd47a10a3b968143f8d0f5d0d5486ce9e0ed86630e06ce00,674da5d1dc4869276422bf4514a1600ecbb297980a432a62d406c602ace3aad35e219a6dc21a363cc1b25428799a66c093b5663f914b52e2ae826ec080c895b401,9bef1642b3971c059dbfe89b1df705b6508234afa2c32fe641e076d380da3e60744f4b5eb471eb776af872b09069390e3dde4e26c536fe148c076b736025d48901,214b4a00fdc844b0f828020422f16c71ce03e5ec98d52e12190d2d0865008dee2b070c4e3bee7d8f138393734ab8d528e74bb53d2b5ed364f666096d9763cd2c01,f443334047eaed53e1d188652b6272618940142c5bda1bd256f25272feb91ce602543bbda7ab06a873feda11913b9380f02980eb8e06fec4546ad52cc9b5d42700 +dc37e64e347c24b33b9ac0813f3bfcd78f7ffc6b718412fea6bdc1f4b941cb3a3348a008c57fd51c912effed7cb7d91adcd706e5fb4eb1f4067a1ddc769d4c9561a532acb8ae1342711bade44ed1885ee593a5fedc87f9f20fc6e5c2dc91a70415e3717071d6e18d232a7763059fa504e7288401f2d5cec886d9819908b007c5dd4bd5eaa2d361682a653266b9fbd5122283a1b844875f5bc70e82f77b8e070c3e153c3e8aa8025bc288bb08665852fb541e34fd93e07e1d5c3d57f6b2be90102c9c065d31f28033ddddfe105d03eb916f40419ae0f63613689edf24536571ccea89b409d5a37fcdef651b9a5a2f64d41bb244a89c2d3bd2e8399c82dab37c1d581cae9196b1,47a6ceadf561b1f1e555bd6b1ff6d75f069eeae5545d3600ec46b88b616c0c04,76121708d601774b818efff62c095bd592416365bafabc48442f831e46466b04221982cd3e452db7c5b0e28ee4e5bc5ecddea313819dced6755a941f170bfb2700,77260163492f8137f65a47390ea670cfc6aa38ff7c17a2d5796cdae61663348957e8169a6aff9ceeb24ee491328d98052abf9d112fbca2e9d5bf91d7a612205600,4fae1df8a4e3f6e3516eab0424df87d7027b5a26c9a39628292a45e41b754a6a2daf3613724002c9b4433db859f100a0c1eb63563ef60c5b526e96d129754d4201,a0fee25ee0a5d3678799a1b59d33e083a6258e3cc82850e648f0c4e20ef8a660354a7a51c572086a1a55513ae77b46e290f0669e02c2e60165d764f57c3072d201,fb7d207f6146825194c62ff969a71ca96566105ba56e2f8cf9006bb412e03109402ed6aa8acd544c2ce1a3c8e377af5de217a3b30c2c86710c59f4fec97121f900 +28b73ceea96dae3218a0b904b3a517d2ba319676f68d9ccd1b92dc6e3003803e76bc4b88dbfb2de928df6bb08754941a7201f4411efc2c0d250c2192f3c965b55ea91b35144fc977e40bc7e5f4ffb91334f74cd31cb46b81ea0c1b9ee25073607b92d6a23cadf76198c759ac0fc4e647ea6383893c9068b18fb772307e91c7a228723e0799abe6de7ea9cb5d7650de50c0c8aa378db566893bffb225874997e302927f902f7868ed7260b0e2ec3a16bb699cdee6ad292b803a11467cfac76d11fa8fbf78ad7f087bd3f44de4275dcbd121d8de87f9aa1e5b0a275c2be5383bf36768339edd4414dfad144185fa040f15ef3b30c8ec74c7947b2ceddb64c634e0e9eb9927cd4759,51b7383895d3c35e00c3647ded4d990e410c8581264a53892c4d3a328cb3c016,3ba38cc5d240a314e291632d7758b44e8631327242984c5af5ff0f3e28b1bb5421b6018b0ba70a9e259041164a590dbfbdb1502a1d33d5fceb21d3aeafedd79401,d693f290f9a8ba2380592f366a54c026460f3bdb07cb0ea4dd2a5ec9240825030f649756114016c8f2e9293bcc0d6e70bae4ff10eace2000100fd5567629bb6000,7726ed887ee4f3ac56277dd7c8292f28f3232d42c44283bac8668a4b0fc6e0c53d0d253118b1b901773d3ad8352e495bda0a2eb6172be5861773467e896ee20501,c338ab79766a74a32ba233ec4a9c9e842045956e62928f5b4db2648200ad8fb42f673885875cf7d5fc4d7419e19765a78d0f68db499d82ef36b902f2a39a94a701,09bef87036524e6974dd0a0861f97fba3fcb89b23cd8b1f3bb76613eba7618d44bde94e89e340431ecc8181a26133a1e86619b9f008ece8c80bd8a0b05a6940200 +0ad61453fc05d338109e1abdc514cc0765fd04e3d33b1cdbfbdf1088330da5bcb1f88182d5e66d75f06086184b5a0820e16d572de0ef50cef61ba3489f4628d558bf69a8ec20ef3b593f792525d110e47bbf95962c44df6185a5f48ac16376c9463b392171193e1acf9856054f6cc8e47f9ee1cb479e5f699401d972ae796e42a7a04d01fa4c556e8e153236960ab2ea535cefd2cc49619225dca1c621bb1aa00acd90507205d987d126ed5c576c483de0f20c36694ef01ca0d668cff5cbd7e1b29e81a3a0af707c014f5aa8fa76483d86d96757e683f2d9b33f01fffe61d1a29432a7eddfb14f798a06811e88cc59f9ec94a98eb97fca8e46fcab8d4a5fbd3e258208935df92a,30619ea80728bdebd21cd27a2e197ec3d970f7e913afd720bf5332d124ecead0,084ef106bd4273f01e258b10eca1fbe50fae18c7509ad69ddf13f6e1d5f1fce726fa997ca51af025ff04181a497856078638e42dbd7624ec393e86c35fbc23cb00,d5b11e7f40a2e4c115181055876aed60148fb39654b921ed6ce2ca89a903b227759df9ccf29d977791564dc3fd3755d1a385043c53aab72d5ad9d10a9e7c404c01,974ed6d4981eac5f24b0762be067d03fceebb4b165f9d4836f6a481aefb2091d7735d64c04ec9f395fd3d13458fabe85641c3c6f5b5a119048ce845ebca9d4f700,882e1ec9ce44b45205229f19322abc0f6e0d038795a0e51a47dcc2fbc49a0cbf486ca26fbc81d6cf68b43726360bd5b3f59fd0258a42fd08fd1b91b83ace634b01,547f37750c21d4af44bc3ea636378b7cc350b1df3e45fb5f7c27f352f381dd5b1dba1b786b2f5ec8ceeba19fcd93a94df3265b8a0aee7d320ef79f80624d3c8101 +cb808323e54fb18fd411a36d92f14238a8454645758c212672a169a6ce4674f182da6f29805dc5e59dbf19aab7d282ecb413d12313349c744f6b432043f13e20eb78f9ed90a3db23cd26e8710d1e8e86612112160abd46838bf18e90031f26e0804dc44c6edec811e237954aaf785fe98fa17651182ac077a531102e9e389a372d8794ad34ea21c7a3d6389b32ef5fcd2a07df9bb3decb4c2afecff80d8d815b231e4db141b228e9b1798d3fafdb3c1a2d37793159ac3772eeac58b81dcb1e05f08209a1280930ce93f8f3a7270bf773098b7761949a3f6da52500d6c628caaccd837d5624d08446b21848f69957e7c4f279205079caf9a172a2df9188c82cab45b399f3c8e67d,09323a455c21a346d1c3326215890349f3649b52311fa7a5c5e635ec3e6661ef,6835288917a602f2b759faf502b36b74ef9a3ea9a51f89d04a2309325d526c5a4276d1a90b98ed7a14cee2ed709a40f31bc1ada03d95baae450dca1bde92c21b01,3bac7ee726a2cb8869e17dae9925c8209f449805b85d61ac4b4cbc38b1b441f3335241f7492eeeabc2ff7fa53c9e2c721dde65fa09ab742990b034b7b706361001,b72d5015b29e4e373a9e769c07346e6febe72643521772a8d3927b52cee12cbd383e75873ef42c99cff78706bdf1aac7145873ab63b31af582dc4316f5ea977100,c8091f73342bd736fde1d211dd1dfbdfa5a480dfef18c78669beabde85be1ba369e1d8986f5696f836f5ea773c09521b5876750efd473cc0df3daee7a1ce671700,e425c92bda5a3977e0306d2ec49fba0b9cbba619983e58802730a9355c19da4b5be4a2e897625e5981153d0c07e4f41195de706e56fdda0bb9fef33a376076f901 +26fdfd2d13b88bcde1217ff6da81b1019268fdac72a080ebc909be6ce7d149ac449465dfccdc05074666c7b9ed4c6df1cfd16c24f541d54112e023393d9e9d17b13cf71db8188ba5467aff6144f518cf6fcb62e74156d72e7357a4f49e4b5139fc0d0d10ec6ec9a611916388bd971512c58e4e4c4b2905fc0368172646acfe64c98a4ce09c2574c44fd7cc2c7faa0c8015aec84a27d2f640b94e3a25871400d0c0281177c589101fcec032c19bce7b7aac9eeaa2ee6306e2b6fd0886defb41e307e7daf4a3c866eefb0d576e2980e630b2f6ed9791d35f467fc94eefba07f89579b764e60bf46d11bda73a7645c8572d951f391bb2d8eaaac62765cc9234e70e9d1b66813c4c9c,125aebece96f65f9b33a8c472c8d6b07b1c300408b2e34a38acb8388c8d1f70c,d3ce438b6ad1ab45afcb6c94dde3bf108656e9d6dbe037de551dd9409015079c755a41d9c8628831ba5c967c9f814f88db2c7f885d124f84bbd5f03d6eafbf8901,52e569d5a4e0627e579a4a6f1a647ee8e6becace59b52531ac55b37894ab261826cb8d1bc568aa4b6ae7e3c019d5a73bd2e6b0a3093c7aa53ca38522f7c5300301,9655c57bbd07372362665be8013d77e568b036681f2f1562101a83036e005fc65ec9ffef233861a2ee747b7ccdfc1611d390bb878565563a8c73ea22c923074100,4dc80b819796552e1390ba868b23315201ec88c15568119f11fee1c360f9c84e612904433647838d9551f9ed4d151fd0250b100666a6efabbeb0a54053ece7df00,dbb0b3b5b51cbb4b1fc6d2e0142447a2363814e7c9ad3ab02220dfef8b84511231988291580168b61480e79d83eb8cc97b9a38377f57f6ee08c45067b978240700 +95837045ce6b560cb3bc87a1e57c3c285a9586a89ff067c4bd3212fef3fb1ed354177ac5e6b2b9448a087a2a3f7eb1e771b019e932da64145f523a25b4b9361a5a9e044d58b669fb447a12c50a8532b7d72ff4d290401082f819ba521a2883752d27551643de2b108d1ca80c452fbf5eb585cfaa8d98cb316a2d552e633af0f7616ed5fd391e4fadabb17ce6a7d0f6fd3cc39e9bd1a93f3575375439cc86c908bbbcb0c6f93384dcb6a0cdf9269a6fce373fd235b350aec1238dc3906c45aa169e0e836d5cfebce474c4bd713daf805a200cf87ae76d2fd362124b0687f736f7c4cfd1346ad6c0ed9a9f0d7f79e3ffa87eab336463c0311ea3e56c5c3b9634e1792a401f4fa7c0,d1178849f0114251ee62be485cd2819792de3e5ed603eb701a98bd2c9cc8262f,5ab270a229c9a4bb95682b3aaf64ad047c874bb937a546e5af7f04bedcb661216ae1f1d1dce86e0407bc2e0a83052396d752762e65fb0870a1d2e5768cde87f600,442b51beeb9c9538c9f1cc711f43bf4f432d2b58497c2a29137cc7db73ab150d69786be4775586b7a75014b1b108d8995dbb45bcfa4f9f9a7508758467a1197e01,f81a4009a3cc3e06148667a31c6fe82d816f42faa3bbdc4eea9541a774597224469476ffd3588fa2350933a03273bdb977f5956971e3870074d7a8c0c2ddbfe500,d862183253f8cdcae5f796a325af5d255961510854055cd78bd1d344cfeecd1d6a2a3631fb75fa98370cf45343541c1af563f85f8bc81b2bc9a1928d3cf4b55601,5a6e5ffdbf5c9434cabfabe68c2917f45fc2dcbbc5380836df72adf9a55927ca080b996df3f3f46bbabb19fe2a2d59f1024940589b49a44edc094e79caf160da00 +462ec188503cc12f161cdceabc7e180afd812a786f6c92d7aff925c1bff63aa5f70228847190218472e8f1dc9f01e2fee307cc77886cd0bfe1be159f144bd42cacea18c84055375e3d33f7c40097b9602320e97d8ced36be223b99170226826756132f81480eb52093fa3a03fea8b06b0ef184471a27805bec8122e1f2351d5c61a0f9c8b8d76959b244cf1c95cb449abe3f5251846693cb9cf8b10f055edef4e3edb53274d51ca4fb113b33d61914a348da5fc62ff4a2561c40a6c2ba3d3341699dd04bc1f31b04137666e7d1ae1185ad474847bcf433ef2f1a564b794781e15eeaaf3c27597dcaf6d30499c5c886c8a7b495cc356d99b99e392ee9c1a7fd1df9f3a58569a116,1ae2bef3c8d079994b57dce3de356267f0c29312ccca2f54f35388608c533367,bbfd4f659c98d4ce8c519b55834f2cac7151a25fa7f2aadb78c79fa074340e31062fbe49ec7aa4351e658d9ded3cb203751b738fe2c5447206797aa3d2f88cdc01,f379bef8c5950ada575d2131378324161b2abe60cc782a4dde0090b49d4e06d7273e38e898464be0196274b271831b3e71bb37888172f65e30290d1ad4ab21c900,a6646da6636c3680fdf3181a87f0e4a4194941baa59dafe7565b1e3163bad7d733f0fe2ca3566bf17b9c40cadffd478e2728afea75ca10057e63ed5daaa1e65500,e9274923a2ae50e72025876c1b2886b062344ec5827179ef10c1953b0457cc9e1dea22e25f4cf3ca5e3c7f0074ea39ab885dc1fae4735d2fb842963c87cc7d4701,97e99200b23695409d11acfa4df4c3f6304b8086fc064aadfa31eb48f0d53ca16ea51d49e1eddc7763b16c52ee91777ea1e0dfb044e799692c667f1eaf0995d701 +d939bcfa7b7ebc2286b9ded95531295911e6946a677babee228cfdc90d35d2e36f277a5aa92ef32dd07deace50d071d1b1d70dd472bbe09a8e688375445449c8577515be69a1881a19817facaf39795fcbaf14c5a4b1debf24b76e8045fb5b45a79ae3bc35bb0be61d2ed4cbb439169edfd046ba510e1502f6c30e08d78afd3720577e223b8f1477f56b937b28a85ad157fa3e05d8a749f76c42d2e66130e6abe35c8b5b939c5c456d150efb43e53dca48b0e933d1cbb3a673ee2cc036c14c2888cf46a11145b6cf18aa67aefb1fe22c1f34c2b110dd9fbca287d55263b61a33d4d1c781d853a84dfd4bb06d63f17d39791ee91e3e3318a5d4a426a145fa537a6bec9407a1de30,4e80f714bd8c97395fb6aa10fddd5a0c2b98928889e3a63a03f207309208b9e5,e8cbfa5166317cca23623e9634e1be054688e53a988c0e264ca9541d30e8458521f52c6298ec3df3e62a576119bfb65b847382ee34a20026163e5c1c635f195c01,32510e1ebd48c191d647d0ec1c89859767e8a590414b74767bd8585885c553890fc45576e60e21cfa9dcb296de447fe973dd4e79526803c99a6c52da3061aa4901,bc97896d469f4e564cb8fd0eb7982995ed7616790d8562298214de5900b3e90f3a542f504785f0d0098002dbb5eda152704bf891855424a4bce38a449c06bb3100,21aacab5c473c253e3ae3cd76016c3fc3602588b129e0b0341f8957ba1c224f03b2351a9407f7f779f65801703a173170b91471601f8684c617adb30d5a3181b01,f8f0b4a2bc2567d9a0f281376839b0e727670fcc67c2cd4d431035ab606bcdb0524260a01d3e01c605a0de7ae75bbdef1e93a087ee99ab1bd6f6030573dea5fb01 +bab6fde0429eaa4009647adae945bd68eaeba79c800fad60e2bcf3fca989d1a17c519b9a5d08387038490bb2109a494ea345e368e0a5149e4b0c23fff8c79825a2ae2b18102733a7cf6f8b5043c0a653dc174f1681b8bf4c05c762d563ea895506391d1c58f279b1e5afcb6b68534a37d91dfea62825e91f14f0a9bc976f82ce0e82c24858f6a863ae24a8aac16327dfcec39848cae2056676e2310481ac6945629fd8d7d1629250281055ace34ff4003e8fbf7ba13b4e70e324682c8921af585560138716f6e2cc7decc5fc0dfbd88a15494c42bd9c527b530e5aaa9bd49a9389302a715ad579f878940a2c7b758d09dbb33d91184b89e84efa04084122f9239b1ca7a71b59ac,50f7be63f7c0b7dd2c251cbef034638dc4afda795f8a9a2955990862c7302954,9795c3b8549d77f47866df1b66f37acfd283642ee78b25906f4e8bf600b0d0c176b7aa6f319a5acd7fd71122c5c7d6692326d84b4633ed9b080f73874e9577b101,e05134d319b7c6b943a01839aec680d3e752f12cad114f96d82a3bed66cbd40d5921b68e42f40b741fb300ea8e090cbb5f0a260fb73eac734c2e49516affeaa800,80ba535b5bc2cb1ef2a96abac4e6f5a54e541f8fb0ced10bc59754529701ebed28426cee7608415f51745ab61d0ad2886f2c8cacb956088e640aa602d2d3479801,23d3dd3f814463b4368282c1aedb289b5dfdb924cc6ad6bc5b585a815d1b50892ce9003115ebf0d7f9c4b92f3d6af850f2316a48dae0b7315af882476b49155d00,b3d636b95da21d1f60ec67090060da823919c918baceb95aeee05f78c28ad75e6d36a38bb2df5b2ef9ad0b2f23c9db91cac594823dbde629ab6c01d1d0780e7200 +02313c2ebf56d698fa3f41337e5a5ba30bac880430c54c928baf83dc4ea327f3b815e9bf2d741158e450b1938fc63b816c114ff6bd32e8b73153c07f4cb83b692515cae16ea59d6155e3dfe43626b11c91cc87bd8a543ea71f0463a99bc6cb920f3e8d9e605f920d5e3e3499b2e9f640b72473ac2bc846df3c2f532e0c7a40797c8f96354b39827e4cbe96b1e9f66f8f11ac97acc4f6680100feea28deb7e63f2b87ef475c2ab53b34d1afb83f640fe39a581315ff7c4ba84cb045943447d25eb935a7fa3fb33646991bd2a76eb0ee45c8bc37855fe419f802aca086e1d82ed383a20dcd31f077666a71f1eff2d9d793e4ea0b5fde358c0206aee215b69b8157f01b57287d2e16,1402d8870f50bd30f59e08a0390b170ab92137d5687978c27df052248274b46f,ba20b1487a03405187c7864c36b1b000f3bd79af1984f43841f69a55baac54df23634b5963518a99b539f18ac9a5fb79715f7cfaab944fecd86a7212b0b012e701,a90247240f6f43d5fd75d5859c1b52562d4bac85e6821def4a078808b135000675aeb69f7e9666b064b104dc067bd2e3ea2c769c047f7e5aa787feb673a85a0500,004255c9a5c90ba784869f5d68bd9536b64f518bb87953b1ea5a3eaccd32eb3f6dde496d53999a6969943c3a3463baf8c3c7a3e04e5f6c176840c385544a6b9501,6522361867a432f6b2536725bbf2ac88a74948de486d71313b12c2d99b0a9d6a0118c4b06762742961286d8ba28d0110465bcedc7a529ee948ba83c9f6347e9601,e7928370bebf138b4fc484ae8a58f99610b0372ccb9787430d612720bc470aba5c0966db0d907d8c020ca64abe6ba4c9027602953fc1409def1bc85f09a8f41301 +ea179d269f840e8bbad75fed8e21ad7786151c87681b86ace28ed551fa3b636df04d0c14358a48932687f31e60c0e58089c491faa4d3d689d0d2cba9eb3cf75315a35e42a27c1101e9237f276866804b09571c458c23f691fd1a1f994f334ae6e2d75c0ac1ed1ded1a902570796c1b4a54d7df2a67a9653f3083bf985f584733ef45e3ac99075b61031d9b7dff7a40f09c31315fef8652ec7091760f84bc8a1d941f8ba4ef3d585b4ce58a38905739994475a671067cf986e6ca2f9d77b64a68b2f1235dd5ceda886e9d2c7c8f7478dcb66917c8d45f491913e94c2500b58cdb6c42955902bd237c81745c6b40a6e861c9d903c6cd0c1a87ef5aed7edb22c3d8eab852c8da774d,724b8ac82c07c86a46b49c3014d6098e8c633462f0787c4252958778ded260d3,a037cd07470d9c64ce88286668e8bb8bfab6d1bbd3c60967b0183203d7d85c8a02cadb493540149cb550c701af884cb66f79b2dfa0901b036684ec0df3d5dff200,c6ca42ff16de2a530fbdca7479b7c0f5e79a98ea95b47ffe329949b917134b5e21526cd4702eeae762e6045c7be9d4a4512e75eda21c2f27f127b3eabfdb1c2400,1df44e54efc72e886ab83bcb883676a471c76f62abdd746e8a78aeed08c71dda0603d7eb9b3fda34023719739646f55ae615ea34cfa52fe0e77f0c326c6331f200,f68c1bc4d3830529c46937c3900f73f43ed0e5be42b26ad394741045513bf298652e89b16be64220581938b1656aea23a167d7d59f7641f91a76b171209b964301,21d23ff6ac459a26ebc1d44242cb4009a1690c85e350b2c8de32b4db6de6c5110fc7e9db4f4f334d88d1c273b485e565842c0e8a2ac0e409d9c882b68304f54100 +793a40f79150312f67a3e20ee6b5fd814edb73388790b97cadf18ece566ce83e3856f7d976f8ad0704f56e913142f1823b49f741a23deb139d9cbafcecf3218e67a3ae25bb9b7760558da8eb91891d726c682eba7706e73879a1e9c322d9cb985f5a2f90675a816a92c2a3a0b5d031397243d8cf7f640ca68c90548b13ee615f768ccdec90b08525d27aa52840164dc19b74b6eeaa0819bdb6077a2f2362becc910c6d989b8cc236890402b3ba939a7101107ba40908e52f866a0b3aefcfa4ac7f17cd9f2fae58351fd80baa1806206928eb9cc59262958f55a96249e15995b54a2ec28ef38b7d8110c83b2dd04904e3c2ec0431a13337992a927f4004c503981c99721cc3f5e10f,38e635e1cfe36297fcaf02724f6412c83f2c75669fc7b4e1f5aeb461872f22bf,0356257e0f281540184f9b7e39e4d1fd9112738e5586c114bd370bdf469b60f57760639ed8b2a4a88dd05254392f80aafd40ea6d43c3352350ba24e24bf56a0f00,7cc16c6cce452944607ffa04c7e43b9de378e1e08c431bcfd54d3ab2d4cc9c795906a2ca629e0ddef38b376385700e394cb3c2d946ab5c1e8ac52597cd6cedd600,45de6daa37715526d445e726ce41d9258f8a3320adfe70f17554b2e31173b7fb15d4ea9d6167f459c544ef55876129ffba6367fa04b95a8930260ec438ea6c2200,03afeebe5936908336bb9195a9139848f4b4273e22ef660e6c770c4ef799a6082b79df73c0ab2b6c8579b7cf6bd8a5b2b2ccc9e0280678315244b750e15ca27500,cff6f8f03151b9ea4722d088bba354c773c6026e11819586c367c1d1bb4430ab39bdf2a0a20d41bac56eb25846cb2bf18490f9be5a997f4e6e8c067cbe52b5fc00 +782e3230dff91ee343a8667bd9fb322c4af354fb7485a7807e8b90966e75738d853a35dc1ac83938f61f28798c994f88212778435894c124f3375ebff1234fd1217a854a161a3cdc5f583bfa3a4cae51f958e78a415962485242ca92304eb7ba82a5c1dcd05ebd2e075ab2b5a573557bb0216915f42b5818b59c10bc17e38a76e1544830d6603a2deec01aa6c873ef57f1c646af5cd3bfe4b643f6fb96cb341a0a944ff5f0633506de311c2b8fdde431733f04708d42be3e5c9f360c050a730db4af74df368255c77fa3230323803ef60176c13dc2391912b7ec58026f6e9d6ea0a1a0b58d0a55c848e7088c29509fd5c34438f08886217048ed6de36c1b1e3e03a6bb6d92b6c558,e2aa82fc0df9d5e222eb65a636922e17fbde5c04634044ef25122a7ee7a8cbbf,1bace7173efeb90e44dfab96debc3c215cb548c6cd127e8fae840937474fbf442af597904a4d47d58f926b373a686d5466471d7947ece136d9828f04a54926b201,c88757ac8f7b83b89da0ff67e875c3f93bc370487e010600abfe925ec9c7a9586f218c7501b45972d8a921da65851fcff41b4227b590206b11c943fed9e4eb7300,ef2a1bd83e673a13b497d8cfc6161408d5411d8f7f41da5fc90085e63f9bba907be5395df23b8c8afef8ad0bfc49ec01da867bf598561560eaeb6b23379f3a3201,5b8a3e33d35b6f014b1bdce836fb9ce1fabcff57366684acc7358c8580f94059009e8c909c99c5c54dbc2fb9e0c0829ee576fb0526b768763f2f95fd217120fa00,c3cbee9be502d8e26586ee2b64bcb76397b57efab87a7c50a051ccd8b359a9fe003e3df3f7f365ca9984537af19b8901eddd3fc32318e4aa8720154ca208c76600 +fe5393c4d27d0434e80cb266626d498471c0a54ef1a81768cc91e52fcb79e742631666bdff3bb0359408277e0769809361c1a0ff673c944fde3971a85c5df0f3ba87c635d291018dc6c24b304dddb2db07affbff25ddb08b7aa672e1c8001a933b600327dbd1e6d0522b748b19442d04b4a84043f50d2194d9bd9d32bd14872a5031c4811f3215eb0d4ad4f0cef05e26115b338fa0de0dc3ecc1c48ca037d879410b769ea0ca6a8a49b8eed8b4908a6fe72d785fcb78f10666955db92f5d5d8039dcfb4fa8cd168e5f6f7b6ba8d85ad42462fc81a4fd40280c517856aa6b68e7f1dcefe2c55dfb3c8a86cafbea8cdb8350db282aaa83dda6f56e26066d43db18b0688b44b07c0e74,36656566aac0f73149291d862afcef488252d8647fa008e02e37af793f8f3c23,a2d4f43e538e3c001c221e44bbb61687a9035bda98c4eee9867986e4ec60694d57d44269f7a5dea06b33e912f7baf46286e6aa290d5a5995abdb87efdb64aeac01,497e8b192320d26d05edc1f8b41a8adc3fff7a03cca2d87dfd3fb95a5c9eb0c151b489bd96e261ffe2e1be810002e065def7e79d1b7a3b7068201d9dae5c903700,7a204062c0ef9a529058e2a5c849b4a2298e14b9aeac83ed83ae27e85c8b0e8c02e0b610f3c2280fefea9b50ffb0200c64eb62e13c7a9b8aca73407a98d74d8d01,57287d999c6df8efbd381d361250fdf04d5d7abd72565bcc319b05f2985f2f2056dfb827264404304303828e43af32e2a4702828bd82f975fcd20d1632dcf14f00,f5d925cdf020c8e269e0eec3f62800e1f18088de9d7d1e3222fcd1dc6c12a1f604fdb9432322b56f7ed6ba9197160511b91fde009f5271cf58aa204294ed83ce00 +4db797f46474d7a44532f6212f177e95913d9ce3a93790fa7efd32be4ed07143cf8e44fd106941dcbb7e932330c6c3244c6d8635b5d805c4105a068eefc22a578bd300a0bf8a594ef16dbc6e8c12f49618db221b4c10bc7bf820636718ec919e4132cb3a38bc22a6cecb1030212d8f6f50d2eb9276666bf323373c4085144999f6dbfe4a0730d99d327aeb29162ad78dd46403ba4520142005b8d3b5c7648a062476ba1f76fb53334dee26f4749f486e2be927f0de04abb17ae81882c08cf73a39deefa0acb3a70a9b3cd8880165b5ccebf0aff259413192c2a88388ce6c6e34c20903655b88e0a80bfecf1d60c660c47266c614a151b7ba87487e656c53407bb0b76761009f5b9d,e5fc3f7003c1053002a0462bc673dce6d6416dfb2486819d968ad7e7ca7d5bf6,4d974942e434df3cbeced7b39b0b4da8ede94e13eb3821a6f81c3dcef28bc5337a7172f325e367083ad9ebdf7a6b64fa7011078a44d3f3b2e53a5bcfc478acac00,c1ac2fcd923309c3031b2ffb8a0c2fa646d31e03797fc227078c5545e5122dc77cef2598ff304d8ddce45486dc69e5c6bc1178e45c5e569f3cafd7b3102f11a201,823cd0a62d7d2a32485d8e1c7c7c1fa7362aeadf606026f073c5397497201c976d7a51e716c55169320a1f5fbc78c09f46893bf3c6a3292d0d9a5bd7d1c0355e00,c9e90c812fb580f34d95cfc53f5dac50614428b12fb4f103625d77a71361c2b00f289d1f43b99419bf68c1b54a2a8bf0242c708d3cd070581f6aeb07994389cd00,a8bb72ebf9675bc4dc4188576b48ded89e7ff7e78b07328ef6583138064052b34912f25215a2ff6636f7da6b894012bf59e801205727ea45fa636806ff700b8001 +6fa11bc4820f468c1ec801f4800711e33c853c9d340c39b09f691a7cd1de10d116de43d20410e172c2e472c9c1088fab755747ddcd7d75e4c22cffc5e1b7e83ab01003618a286ed8b462e4f6d002bd024c4926d63526eb9f4d913e4983d5d57865c64b2de0094694f68ab8596f08496312caaf59e64ad2158f0a23c18f69fe0381470f58da1f5aa19097511bac71a9b40cf0ccf0c0cdbc7b196aaabef2f61c8b86b8551756739001e5f6e8c3f5d8b616af7170eabfaea7ca0d46fb09bfc08da54ba8ebc4d566fd7aa3ef888e66195276d2526a9258caa5c04a6cfdd247eb231b1d9f0d8ac9a36ed01e836f2e069a1e98603318f08147b16a848b63a46803a6382aa162ce4618bad9,b14d8057b7b8126f8d8be50326a9a4aadb69381bba8d2d4a5d3929557912341e,3331151439eaa9a265d3ec0da2a7b411695ddbd0c7149fa72926e73ea8b95d7f6f88e1d0484c408464363fd25c7d3a8b6ee1a6ef24ceef7d70431330e1f262ec01,8982395a8e8b70e6e459589f886e0d7552bb1a264bc384aef9e65d28963c520240f40ba9a7b7b8595b4ccf21b113147a0c61ac136151f8a5e88ecdf6d082462c00,ed22e7a2c5c79608b8280af74117a625e31f1d46791555bc78ebf5780c5b92bc105cb4de548738e6bfd9ad4719970ab25971676dd8affeadcca2929afff140f401,87fea6784834f8ca9ea4c23430a5575f0602aa5f31535075816a3e4736a272c361be27ff3c6486f86b9ff63b43912c9d6f0ec0d68e48e29483c2f38ef57c92ee00,ea0de874bdf5494902723badff40ca7752fd918fd365c9d99201628f40ee5ebe09a60f1acc02493624ad4a4a7d584f3f66a85e49d13666d6936830bb61d2cce301 +58cac9c1e60a6c24947cb9ed24bf852ac692403d7cf457d3c5e8a7714578c3dbf3e397a7f0c8a0ddef7748453c966ba66c2d89b26421c1e546430a809d39b555174be21be60f3113229310508167f5d60d909ebf777d5a7b650194e5fcfbee11b2cafae67c3df29bc0edc267342039f60f24a8bbd21dce34890723f5039808123f79bf2c4701007f18068aab17fd29a0f9c9452fd211b50c021a0ddaf3b6f8ed3795c4b1d730a0ad668f9a420793c5f62510a27c60727a6005c7544516d5cf203bc3169bcd57723397d937815ab5e98c2a42e32dc502025b72bcabe29e439a7955c6b61c607354ab5328c1174773a215bd07c8fbb15d657703c94d9815c2dbd90d9c77fd06dcd869,a23b14562ace15f2500c7281b631216b567303b2bf526c66c857e6245a604a02,d0e25a92e8ccd41c825257df0c0ddfba7bfb9ee07378003d8faefae2772136b200dacdd810b336c5ef635995e51312f5e496fe990332a4a2fefc3ad6f388c5bc01,969dec7f5784deb83efa7f9bc10b0c61a5dd6bf171fb496e2055c321a02e4e6110d54011df791852e5e627079165c8f4ed8e9d4b9ba0361709d414473a77e7b900,d2e109ead40b5f60cdfe36ebb5c7812ab9d0ff97a898db35cb5fbaa934efae8a60aa24358d7ddbe1190710e39ef6c4cb5de42a6d3b7ab7dd8a7c2d2881d8a71d01,74c636ce8c9b133494b37fba362eb19866da785e40227271fdfcc1a892a262ac24657bcf4eb59aa683e6781c271674088a24d557c63e0fc6f18ccfc91ff5661a01,b31397851c06eba8485ad52d611e1ea19815acc7c547f9081e2179e20cc531e3553f98bfb37d88e7c6e57af54a995a41bdc6bd9f64cc5274f61aebb9a9c71ab201 +9ce73ffb8263f7a6ddc88864ff769de8769ecf61c3eadf9823b477e46d8f3cb0ebee081b00caab8acb8d5471cddc0e86f1278a8d65f606f8f88f539cbc84a118b032d852758742a54c7240e9f04edd8159d5fc56bf2e27bd8048ee7d1e0c42d4f14ae1ff60a0f7d2ed4e29c9f6c2c9e45637da18bb138e97cb20cab45b57593d71179e53c520fb499d2b67123485fc1145604c013c1f82990c417acf2d2c505d5893069e436874cd662fba648cd80a77011748c85c3508bdb01b93769ef667e08c0931a6398651ff1b5766d111bc927e232ddc32b78d87c7685016be3144d690bc26bd57cbffe623d8d7f3e1512b618576af3efd3f5b46d90752b9b93fe6224a8326a6aadb6c3e23,1b8e85f95b3866e5ef46d89ec97fb3bda41aacaee7af0ac9e6351b24d19f06d6,2595c136d73539df9ccf977f6206b3a73d97e55c4bb9b9f09e050476a68eae71462155b8020c165ab1aca0a464d4c66fb157ef7f57fd4667a7299723587cc70300,ec73238e89cd65663cdad241ed8ec8275d46f0b1d0d81bdc7056b3fed29237c66e1ee12fd7ba1ca29bd67208ce73e972a865bae158121b316312084c5e8df87b00,44fce55c9e31a57eb12000659408add4d9a887c8de1c3d54587425a1382951d45f553f02695654aaadbf3c2d4703ed7c5b93c6d85892ee0931a5522eda9b58d701,061cb3ff4a05dd550ad60ab602ff7e907eadb99fcfb3e0ec6728ff6e29eaed5d5606c22ae16aef09fae88aa356a2c1a8e97b052e810e7acec7da1304894c71e501,ca6b5b2282b8dcdfa0bf28bd3d00c7d11fdd61120cb0d1cb09300ed5fb584f1d79e430d4fb21de3f43d068f6c6ab5a070208efd230b6042612af7f9670edccbc01 +317a923aa3a683f203fed57ce55ad2525fc0b39d6fd5112647a8758aa12f737d8c721e8a113046399f2da9f131b61bce3c191b94468415bb4695f7f2c5c8c6544c3e13386f0ed5b086cf1a8a0f2b08f83489f94ec7da1a1bd6bb967737b0e47016b043c5ad5b7011fdd8a2a187704f389d6059a55c105e00d0a38844938031c36e97073b05429f250ea6ca96e303a41d3709361ac03a05f4e49431f7a643cdb5f3aac6e7f2068b47a5bd7f0dedbe4a4be0e5fe78d2b55bbde47532bda60b35b334cea671181973d3040b7cc8edb184b4190a8219ca5472adf965eae4a9125e36f7c8fadbc89d77f797eb2b80018db71659778e2d106946f65aae217560a24d132dc20625e8a8d3e5,b713444be2d8c0c6509ada22db60d6059c64a10c8cf5548785c92e1ae7d41d3e,848013c67e0ac9f1f714c49352952b7581bf4f8c29b5bedbe1793622d23938f0499a4a378c38515abd7f064630ddcb52baf8639a2bd52a6ecbabad87a444b9a101,69b60b6089a1deb16121f5d44956e3df072216d947f0ed12a1c120fd5b5405456a31094ee57d09de0ace00eb3ac778ed625510bca9d8557a150aa1d5359e8ab400,bcda8eae0eb5060dcccddaa7576596111d51c7b2285a181fa261bf8790c428545416045f3a4f5746ca50c3dfc6e7d53f36609690c9d00b2a0f5ff13c5eaf179701,940d0f8e9afd1350a33be7727ed7fa05601ad63847ee153b0b11b0b02d9a211f67466ee25ae9b7c7676490fef25ab0ac19941ff3ac448b13fe14a4a8f4a7689f00,22528e37e2a031004b3391656512e1388b1bdb4c426757a043cf5017b891424c1f648b006e44ecc025654a7694edb100fa38a985da59992c449dabe9fce8660001 +526cc3ee33f3af9a13348af5edfff6e8cdfd64b9b90c6a4d6aa0fb35d49e5d715412671aa490376fa1e2f7440c5dd691e0eedfbe67b4ccb9abfbf006277472613bd8583213c57ae5bf856d6e66834abbe9624b439d8bcfa9cf3c9874e83abee1486b9cd29784dce55ac16d2a2220cde7e51c6b5aa9a6dd85639aa50c2dfde19896af572bd37dfdadec2409e03edac04070919a31c0ac9f10db54ea217881815b9ebf249f7dcda5a0ec79d73dd545cf0fd96d95a1c114da80896cbc5d7d113b175d4af5e122eabe2c3e85c87fd4e40794b3fd8dd7dfb418381dd30b842625feb63e641bdf9d32cef1f4313bf0096b4be186946b098f1c4586681b66f567610e6ca47008af8b2a69f0,7bc73c05d3bdeb3b87fe55e25031b696c50e3adb2d196d3ec9151daa2a937486,905419bcbb59d5912369e0ce62eb4ff337882228321b00ba0840a22c30b87b67660da80c5161250465eb54c0dff11ad651a8b479eebc35bd4b7b8d8fc8b9850900,4fe2aeec402a690e42bffe04ce1cd6fc22a4ee84c2f7e11740e87171f95cbfdd14fc135ad98621bc5767a3b67effd040a626ab88692bf5d6b50336a5f956eda401,7c403e85b4345eefbc2a14650a2462edd774dae0933494414bc01c0c065d8fcd536b9e0321bfd690158658f130fc94d082d345e3b80a91ea277709dbb948b22401,2cf6ce73a086d16b63776181d5ca28448fd0247ef935ad2fdbb58f13d1dcf2c208b14a7561cf86a5788ac5577a9db1ee3a47b403e84769c7a0b9c04707547d7901,9e2bac64cfba97d47d82a54aecdc9c7669f477d523465bd0e4d3bdb6961ee0b748c96bbfd01eb457b25995b78270847f2c684c753b21335ff32c3f052d7843f801 +6d44cd090213d65b0cfb1909a637f1deb8983d2c30ceb37cb61b68bc7772f4f02a5ff306ceecc632dcd7e6c0dae94e869998a8ca4d6b1e76bba555719dfe3c4677dda7d2f5b66b1551c347df2dac27328ba0dedc34528c55d36ba3748d90d4795add7b3f5438d0c033f1384c9ac81738083339f79b2d5853e956d87cfece0cfe375076cecde3ee50269d03f355466e8b64ba96a02a7c68c099f506fc55084e5aa2cce2c3780ad2bf6eabe53234acacc4a540523d834e2113c0bf7d0fe50c6ed71103e172860a6f3e347bb3105d883523bea9c1fed7709448934460d63c1b3b7c99a61cecda4a0e2c1da54c8cf04cd89f615709af675436bda4bdd350bd6fa009c211fce73b4436e4,0d4450d2582f018667364d4bf1d2364382265231ef42aec24a2117123824b66b,274fc10350a0642b6b0781cdc0f58213eb5a02d1ce7b4596a0102899b2ba114a05f12755181723e917771c3d0479649e4b45ef67f0fc24de758e8c3ec117b20101,bfedbb3799fccaac718f3a86c15d71cfce13cba5031cb61e3cc8eb08c03b6010215f633fc19e26f529889db22356a30a1e80f1f6113d66dbf6a200dd46ba29a901,3464e5404607d155ed5143e427ab836ec98b2e4f40eddd103de90a6b7aa6ab505ead0db9a83f46c95f497d6bd5c0e17787bb9af81e0e5d851d1e13fab364598b00,3464bc3a6818019883ac77d1987c2c2dc211916a51df02d8fbfcad964130127505602e7235acc1bafc80071ce0ede1d56d7b14aa11c3cbaba09e1197ae8fe2f301,a302da35ddfb6d46d6d65cbe65a2816d2bce1617ecc028c77430eecc8da0ed0b0f6999f7be2e498ab99e752899850826a00c0e5799479a1add69421546bd1b7901 +8b6fafddec505ef444eab2f19c087c0452de6dd3f689884ab023d43eb1c1a38c559fb6c698328c7a4fcbb76c9e3f6f874b235548ec79e2dc87cbce8421f7cfbe4c21f9262dee06d3fac9c6616334347bc81750a3c12470dfbc42783e0b17f453e7a293bae10beac76129590556daf1b08c9d98550ad6e78e52976133e8a8f5f7fa577290b184fd8a918cb64176b02c9ce94cb17cf71493f1b376a86b992618ee3ec794a5fc139601f64ecc3b524b779efac967a1cc2c565bb9330647f14e960a21a5f242541584cbdc751df90a05e5fc1a0937b70fb9f9a0783143d18198568123c22197ac817aa3076490b90542e856a2c53eccc858d528bb0459beb411d0ddf7b1ad8e4a9ff5ff16,a7812b55dd1d9bf9a143cd840a5c288fb2a9efcbbddbe86cb78e005ca890bbb2,da4b8e8ccf7ff9a7ea41be7666d68d5185a0647ff0960651c0460784edcd10c96d8631c6b4fa25eecbb725a741129060649c6b60171008d95068368a794ad44d01,213bc95e197fd1c4c2aede133c1881c06c42c32de47a1239d927713f41375c5e3923a5858f6e0b0bfa429a973b9d43b5d2db5c49a31fd33c4ee179c5f6d7f9dd01,e6dd245f3c6350f1151c88f280f0e66fe5009a3a1231218dd1946e9af2b3a92617f68e14f721e48a23cb16343c6f181b2e170405aa0afa914bb1e219f860ca3900,6d0cf0d0ff4a52dc590b1b25bcc1b0ca579051f91af176d10f95d84e144682ec12615941591183fe902a70080e992924a8fad3bcd08de24f81878fd12450568501,c0f683224603a2fe436901e005c239eb571ed399316ad23f0fcc5d5baa0eb1343d92440f6660a86c239f795e857ba39b00c17775a6753607dfa8c21c57f6f83c00 +c52e8bf7df203c233889c211caf7c8b2738180121c7ac0c3e46b3ff0df65b8886b9b8ccd812d389509d291546b57f1d9af039ca0e0c78cf858380d825157d12fb202e1cea981af473c2f718b040afa773fb18e774ca7cd461f7a8248faf5a2f7ca02cbbd8a5948aaaa9c461dc05a32316432d7db0306ba4cf6e8037d2513cccad6c068481fa85f590a793774d60addeea08ec4d29c1434121ba9aaf5884dc37b92753f9c3d7a809d25353e99f6df1fd731eabfa22bd844585c3d3ba697d29dd58caa4d9ecabca0ccc9c02ea061ddaa182609d6c4e4ca616b022b1f969f84a2358c0463f7f9b1c7e6d6600771c28b131e265b169986ef7e0120cf19932c4ce78759367648bdc3f870f7,de2f5c314f4e5851f83ba47305fed376a88b0ca2fa858e13151285dd68451092,534cb47ce9f3741f916cf82444d1a68ff605b41435aecdea48d970d69334ad7a535694bb12711348514c6a43a76a210f24c86c86584a5e39c2d240652c9dff7e01,fa2eb3b8ff76934065ef56c060b1d57e0559c169e2c9d1793a1016f42c5a9c9c7822be205323c3b696834ee75c4efc0d1663496e25a0e879a946bb534307ca3d01,67a0460d79ccecac84822adb64377bfd88def58b7efcb58428b33ee66c06f8700a1d883341eeea752cf435257e0e07a91b5950fc73c2b0d3960c6f7ad792a01801,56cf404139081d026bb55261a7899cf66aca3416f80583e34c9265f553b12eeb337837bdf41b36179ee2b3b8887d92bb52d6df93f6f234296682917af3a488de00,2425e357136a63292f809b2c7270ff621a09e39fa47402b401072a814f3256ef3da79b96b99ae2a4ea0a9e01b7eafbfbd723ccc3828a7e4fe5f3b2c9ada2c86b01 +21044b1ec7009d36255f0a37c3dac8f2e68e5e82269eb37488d596d16d959097cb58e7e64273bd6041cfea883addbc2bdfcf4f332db6f2edab2b52dc4216c6368ee7b34b1cd4f70ca6d505e693f40611cdf95aafa9a306342637371afc4d32443ce7131c1fb866ba947bf00dd246b6a223da7331ae3ade7b94975863550fea2acca5c6a75ac59a20642a4fa4459dcf1fefcbe8c9964ed724e603d67d03c5b74710fc742838cd60cf40e4a41a22a1ed4afeddd9960e89ceac4dc8cd21de48466282a6b40a206f887a11f2d2af4c5afb1c023fa87ae0c4625e371105bb1268d948065308ec633dc90eeaf590b137f9ac66b6776cfdfe33ff55668420f5e36f625910e598181a63c80b5b,6a3ad10193190df46c28d06d2fa594b313df9cedd6aad9765b69d19a21fa01d9,f7628dea1f25c23730f732e2911b78b3a130af5d4c8a26acb47eb0a175a95eed1c880a16b024216a13ef4765d0718756d457c4f36aa83e9d5a6119f2c74fff7901,d0109d0142cbd948cdcb627c07f8720554b930d4083fb106ff5c0219dd2c850d3e15e215904933c06dde648a10130e7f24abd1e5dff6b42255d89ffcb5fb36e701,2bfb81877c64a3ae7455c3f8d11c35992891eda36aaa2d84a967b1c0b138433622f9d02b6efc798c92a63fdbfea1156f63b6ae329638ca03afe6c9e6c2b20d7f01,bb21eebe2b81f38f723c93c012429ac0cd6a46e789db66c1845abc618a9dfc5c0ec54757d9ba93ca98ff3ea38a8dfef5e5a9cfc2332a990db7355dd2aa08997a00,823f78e21a2cfa9046eb8a28354a387f596a8ea5d2636a2ad66418d62b53fec075712a2502ebc16c3c256e8cf063a41c268441c31e6202b6d8ebbfbbb662d56c01 +bbd85dc250dcab32d607928297f206367f06ab809e282e67a2c1ac09c5ec0dbf1461b894941ebd585f1c86a991324e4d0c3b966720170193f50242eab007ad34121de64c09e8dc92ba69e949ac077d17b2b57aeeff1e70f9480675dfb3061ed70160454cac3e4ba617a76c40c178e1142173c2eac56a7d46222d75f6dbe166b7ee4b0eddf71f54452ddbdffa896f2be32776beb519af67c1fda848357ab9cc7a83fde06e626a545c7c852be0849b043f8f254d4bd19c5ad989b422952aba18f8a1fbc003f28d6a5fffc912d4472e4a8e77cb8b648b2ba6a5671b1d778a19d5022adfff4661de8b8bf232f42cf750ef69f8653ae82e82734cf241efdf41dee972e86b93be1df9860474,0df1ab81785a733bcd63812ebc4655090f646a5ec57d0ea76f0dafec19dd7049,18fb69109d769676b0de8018f5fe0a3af5dbddc984335b2d9177fb900ecd4d323e4aaed6c6fb126d00c0a229b6692b0f9cb68d65117968ddd798d4c0771ea25200,470d4a7e5805a0e1ff0199e2bacc5a38197e3ec23a911ea1aec1b340c1a60f5426c860862841fb89cefb7993f20a7f3b91eecf583dbd1cb95e7999b4f7ee64cc01,b53f47d553b3f5b3fc7b1692396771ce646a8f6376516345f9b933fe5e1eae1a61cae25db2a29732157c7ae747fa6163d5e086159c5f43de8fccdab059e2212600,c3b7fb35a92ddf705165bcda2173ffe10f5afdea8cde2120229e6c3cbdcf2aa8625c1eebba553259fd7211af02366630550a8b1de33cb77792752b32644ae1c901,9936dc0dbf3087e89cc0af669c41c6600664b08541bf23b0baea1846d5b6d988724ff00c70c19113fc61b14de3817b77dbb294e5244a33254995050fcd4292f000 +188939223649cadd0f103b59d460ac57ed027ee0ee2c11889a426b3bfd61a6fc63a87c713ce7ae34e0807b53f6a216ddb7a302ad267f3aceea8807451e9d8ee26cb0c7e494ae3c759b87490443122f63ca6cd8e1e9604cf6709d203bb6212f2ed1b2e0da450b72666707c00428482411db8917f1df7bf446ac8f7b21b865b0971632463fd745725ac31307d699bb84b68225dc67abd8add540801ce2dedca0e8f0956caab35180ac5539e2f1c5a5b3c7f128de5d75ba031c94a32befa239729b99de49b49ddc1939cc87274c5ec5d5a53f07f912c209add0db71b0c2c39b1ff37c8862293f3f0e01b6810bcf7163fe75a954bbcd24ae853562c91bbd3fdecc0ca9821160e3e3f5b096,a859bad719ca90efea5c8560555d448b4a8af48ec1a7220a149a3dc0444a825c,9e37376fb18cfe5cffe34ec6618f4558a80ab5ef13ff79a54bf5ba32c1ff4a2a72a54ae802723461cfcc4f70669b0b40de685341b6b0519917fd8484d176993e00,47270f72acbdcf96ed84536e792d5c8005301a1b96e909c7ae21d0380b6ef5281d20b72391cfdab3d4696d74dbc40459f81694dc5a5e4fccc2269196c9d5082901,59404df048b4760026222b9371be64964a11d53949a7a0f08f7b12c7cbb9877204dfb7aea3c47e9d3c1b3297dd591c3080ae4274dd40e7822f963ea86f63a89701,79828bd725b95432ac130660e285ed4c15f9764ba5ab75a1d36db87633a2d93d57a0cf76bcd34724a1c1b6549e4a255b6e60ff4dd6476d559d66dab9dc2a34c000,a17f0d8690cfb30c2a12240517dfc3cbf59976ba034540f9150dfac210e6a2b74518326f868be5f9d04af0b298cd1f5e0f6faa992bdd91c6ea92a0dbeb4f44d201 +51e841d46324623a674424dc6133a4474d0b1e88046e9085f858a8adc1d85f0a92f98ce9c7387429c589794b14f9bfe2531ac424b9980de8927b6c85d50f79ef06606dd6fc30538c7c0715873a0998d0516176e6bc9689051d1b6c401e8803ee90250f340e36f69945420a13d9cc983efddb861e989c7128fd8c4d7330f12493719e233447268b7db9c009e77ba5b753508e3552a23213422cbca3ada513980c76561f947946b69796bd06c01a089fce25053f70ea40ca0de9246c0c0c9524b48b003b3f89cd856257056e42f2f38e5f73bf2e108d46f2b728fc81567a7fd88aa41cc4a2c9d43c3a9bdbd5ab7a3e1d5b95f61626179722322e271e7f8415311b99434ca887ab2a2012,b2f1a4ed5b52929f11c401e60e3fe1dceea12ed84dee5f8870fd80c2e6187aea,e7d1c54bb8c23184bb2f93245030974f415235fb03d79c47cdbda7923c58713a1c8ad36ae4818101fbc937a3e2aac7a298bb0abc014569b6d168d857fd5c7fb800,db722af4a11166b35404872c665f6ec9b4af80412802bee2f56477ff88e1169f7fc1fd4a2a76d9dab945fe61a87343c8531c411b3a8096bc3ba4c68f359a3bfc01,aa273a8f28eca11346d2344b68823b8d186da6ed3b35d785e905fe44feac38f07ca82ecd94467db0543a3995b75a002c919488d39d70a2251d29d82873166da900,ee84abef471a578159091548eb8bd62d37c1275706e9cb9c4455d5fbf54e07873f62858eb220f1ff6f0abd5bc7f60386adece24ba59553f430244be2fa52996101,498bbb4444be5f28449f321cf5667690510b5502ca892723bfb6c401f04c58b04285971e989e91617d1fc6fdb84008dbbc4b08452da78021aabf3397a26d83c101 +65fc3531e714b9bb22b9af63d428c30ff133a7de83aaf2cfb44b965ad8952c05accf0b84b31c7a43ee896502fb5a8054ffab392351c17c79de71aeef53bb840d2cb29b17c764d78c90468dd43bccc0544556b8636d6d214a2c612830a573a2984d8ed1b11c30805b5cd11cbf0e44d07eeda36b5253baea9de9036e3869b85ec00951924e609e08e693d92be94c80a9eec63aa71c5055a273d1da81fe07228e7cf48f7eeba3736d949698c887279255538c24ba487808ffa91817e841931303cc1baa495c5d5f032c78a3220c1c0d0318cd478d57d3218f576f6b740b29d17ec9b700df0d3b39fdf413acd6d8c5143b36a2f928665bf604e118c3acbbc32224dd06360da9c4ad6b1985,ed8ccffdc38bffade1b2f89eda916090a68c220b2b2023c7a998108b7147019e,add98cee7cedb2090a61e1a5d1adf4a4418c7309c1ad24765731c4f1414c15b806407680db2eed57975b7455fc3d6a0c810a5f81ed378d76b538dda4385895ac00,b61a5390fd15c23693670440119027b6ebcb5f44467dc02acc5726a1ae33d1c92463fa947b84594855d74e91c0d2ec61168b2c354fe8fdfe0c54d9e7c65e74c301,538e24a9bee9a47fcba0e9f22d3f54469bc4886ff2cca865a7a2a2d71a4bc3ec474f0f37338a367ef47735febe8e6a3dc5e14c1b4c482326f6c17bfbfd37788d00,f641fb342829b377437d3f2e7c6acfa6851145d9cf1e3630e4d989f065c0f6a77a8d2a365f40f5271294557854744da4c102a01bab608ada1dcd28593700fe1f00,53c7db36496745d1963ede648b34aacf80773aa75ae46d75548048a4b64da05a3c432c6ea2e124fe0028a92d715196087d89fcaf2902655c887637dcef8098f900 +421f73e75f4cce23bef81f7d93922606cf5245b40e6229c1afea2b9e0ba6cfc804c7c169b62de08791fb01ec14d5b45e719f748d900c840ec12ae3de7588d2afa9c79194e6a9a81bbe6e7dddc0eab7475dfed0793d59a91ee30dfa81afdab17f235a11bfbad20bc46794e2cf05e8bebe09f0b116f6746b0026dc9c86cfaa1f60c38351eac4eab031cb76e2a6f61ea42c1b662673a70669b721dbbdfe7846566a815c72fa5a1f8c539d382663cf898189fd4897392b6187998f90f8025fe06d83bc876d5e427abcc9614940ba7bbea5e4420ac609ba3448bcbe99028c1bfc96262bf127e4543b74d151899df469e3ed104fa1de90034cb8e45e7ce920a6d4fa9669165f424672e8ba58,3bb317703e1a850f801563932c7f813de788ab2a6e3ca1be7f241f526e9aadb3,23eabc0e61c01400ca8fb268585d30e3f58a3f4e52e4b7ad2b9d396d66ca58310ad1b7cd717b33fb2d912d9137514a5483bac2d888250f1f988d14a3c5be105d00,4ed26e7bab6349d756fb84f76bac5358300bfa7a716e722783b00aa7e55e86f87d84ace37289e2e8949b183a11bf741f26fe1339457c70915c8cb0171d6b2e0e01,31df10751136fb96e50b39155a6b2829cb4d4dde11363fb106114f3fba4989ef15a40245c0f23a3692d83952b3640f18fef194038589303706402322d7a7d57001,0b5283c33af8b790ba137433e6c35d56518b61ec38d7d3906ff014f2baa172ac0a2dc78fd9f051e20cc41186d98f6aa99e5e8f06c8bba7faf4cf8f522a4526f700,11073a4ec9fb34aed52d04412112be962b68f4a2b737065f2d3a655361415ff3175b83e33cb87d69e5fe57ebfdcb140bc522d40a125ddcd4a9d13c158ba4332701 +f392cb24f5d3c9d3d121c5d9ad4b1287bc4fbc95c813204767d6cb303b5b4b8ff22d4db44ffaa6c82e077fac58cfdfe1c7eb9b18d4eb3e606d91b215c54822f27851b0d4f22f14761125fda6cfd6c85f86e679b1e4ed9f78608cb55afacdd6698158b9e920e2a13c1f1c11e33587818ab52b925cfc99a2d1b202b5a7bf64c65553e41442fca141b93d0f028ac411c35749be193fd751ff63ef89dadac0621b90e723a75a3ff330ca90d765fa5f008d0e2a3f4455c625dc1dd77ca7d353503615a1acba19c663899d86e7a0e76a98a3dfc143078d28878b1049646f6577611fd402a2178309973e2d1657070b18e12f58f3a1c9d8eda04d38c91ef2a8ba1460c78e573bc8c6fb8571fc,2eb292a16eeeb117d88ed4a851845ace00a2bc1ad7fd8d93348a7388f7cc48ed,8b751b5642294b8ae0bcfb37e9db1def2932a5944553647394614ab499d3da014375eae01271084fda1bb40a72f5e006ba21dbc2375f89521aad1e6971af43cb01,086601db0222dec89bf0a131fb088d22296d36552ff557ea53625475bb38711527d5b5dbf2a839380305404300e4b0715c2cb5b169be75da982bd3197f27d1be01,4734bc8c5eeb6a9d76efac6998c1b9fb7ace24029f6423de4e2d88765b69ccf06773d4a7ea8f55e9bee20c1dc11e60ca8b19d8b779977770b3fb1b08fc8ccdf501,ae8149ab721b9d60ec141ef4f278086092fbfcad72c953baa38bb13b8b520f95707d423c83831998d0ce819756b543784f8ad0ac933a0201993b89f60ac5cd5d01,b56eaa44f4820e6698813aaae612bc1ae4d08bc8e81615a5ee67a812c07e9b4d2fb0cd5b1dc36b07685745e7bf55fcf6c48b0f66a91b907b5641534fcbfa0d8101 +be6ce29c1527f587977ceec587caf771d14d05024a2dac4a1b0e55daddefe6859075faee10bb0231393aa9b354bc45ff6fad9ee3c14e4993f96e7b1159e61f7280f1b8e37209e7032af9d4bc6bcf6bc0ebdb024ef5b9ff9824b8f80dc902999df9c8723ee1247d218899af5af38b725bf68fdf02a2e0434c48a10a6f96f13c9ede98580e95bba5a2a98409c0876cb6d6f28cf5f24b3e46a120b678bd67cd5f1a3a86128d3b4b88f23faecbb8fcfdcac331a3aedef0f9fec44be252ac25c011ba1d15de9ef5c168f67495c9ffab60f2584aef11b351b3f534ebf9355f71d566b35d7505756c1c5bec19314401e3a6763640df773295eb651a1f6549df379abf83517012a933ca5094e1,b9fcc076c533c79cf3aab5886c9544aaf6c9892c018b21595808faeec159a583,ad062ea204ac2c6dd9568c2419e743e367e238d96bb399db109bb17418502f564073cf232144b4f84b1a48ef13c124999ab40095d4ca9cc798345b19b773948201,82c461f1681e1a36524cfc507cd0a462921400ea9d9044add9cff97805ea0723507cfa0ce65d74ac37930f5d8e2b335227cf2dade649ca5139252a2bafbadb9f01,e11a1d9bb2a267c30e285479503e9954c7be0e241ac1b162855ae9243aa15d557fbd46f9ea29558b57beac22b5978364b781fb41adb11654982b3f27e54b034a00,bd5b426d31dff84742e13a6dca4a09ba8a9357d189c3a1e78b7f5198fa80b11547da12a267527f4c087ca5c6c9be824894aed15f38a11f40a72a4139e6dc36e301,cb0781eb95cce936d291c5aa62675d9c81097372176c51d93a022805f02285315e9d8e1f901d68a8662f00f004670d821a75d596ef68e4f613a7054de745de5401 +59f8ab7d1a31797e1ddea46f95ec4d9b468ba297a72150c73802a82c390d9220bfa1136cc44dd56c06ff2e03127f43133a6812b3ef4091dbe9bfb7b1731c18459865da7a6846bdc5002ae8b34235d7d0a3e4af5c796817ffed3b78f8c2946674a4a87600ac5b32989d7dcd477f5aa6069136dc0a342d4b6519e44d27e5a49b706d3477320e59d19f5946adeab986ccee161eed751f414cf314e472b019c3c73429321804c61b89df82a2227f8a372d10152c5fefcd3e1b48a8d211f74d5a4c496f1ed98efc9496bc7f2514565690dc8a136159669dc248a3aae416e8c67f196b64b39afae3bed5faea35731607dc0f085a0a9309c72e8a40fb646b3026947732a56b0f8a6b37fa373c8d,4695c8fa20f9a30320cf49f18dc52415aeae76d0ec171d0b6e2a8721c5cbe3d9,1f6c0ff4e27d3374f7e75c90aa3a745591420250edc84932d9a9d1752a3e56370bc83a03e47152ef675b9887ec273a3dd85dc6b9c673b7e0c993c20573121ffd01,785ade5b5fe168f8717c90e7b51bad5f45fa6a1faec6040e1ab645734ea01bc663cae0e7b04e0be64d93a17fa11538dee3a2ee6bfaf5eef2be2a5b76d235d41a00,f8d6d211af56b5d8e802e679facfce22cade64d3bf8c516bc0d26ac1d18036602563d9b02c737c9e706e081053e8882fecbe664cb646ca3feee39543078dab9300,e45c265e5c9f23d745951700d4775f9084bb5c4ccd53a16b1714a9c481aad8e939d29dbe784df9a1679bce151a81e7690931ea437bc2a397ff4dd5d4358fad9801,a364ae1c5da78c769e499401bcdc07810e9b327993ab0c9d68f9e858ffc6198704976615e5c26a7d046fec8f42e4338a2dc24f086b79bad582bffabe4bffad7901 +d51096cf71739f6fae40055313a73792af9e116b330673c2e29fffffb9fceb054f8d803b062583f90055fab35d6540f2d8aa7cb5e18b97fc705c113054987481e15ffe5b295d85524c0d7c8b2b2774007cfd65ca2e9354fb1d741a80b2e1517f5557560214e11c118c8913aaf395e9cce7ab428db0bb49e62689948a76f8cece678aeb3bc697f6d10706d2507155ea547ed8d9a79f7f32cd789359a2117f2319739f2e47ed0cbad6565fc20106f06f49df16b1911fa8cc55d1efc507fac688d54b0527728437a5fe0214cf90c102f9a77a8c6b78e623efe3f08fcce72bac9a9e18f2e61c9c196ddeef9f204a4681bb732e61dcf4b8140f590176be58dc2c1adb2b2b6a0f1605fde58485,89bc4c39ee0b2568fe77697282fd7b9bb46f9df47e8fc4a1ef5911e711fff6eb,9474ba1059b3fee13213779669c47225de7e69d5c45a3c992ecfaf6e23cc196325e03fcef1f0cdc2f2f5b0156abf4ff5dc79b9576e51b723f5637c8ee0fe74fe00,bda453fa460669cf34cf8df3ae703b9e0b5b05b168789580b7b763b24e87b6dc09ed76a8804d75c2828a934bd39c12a79af5b88d7d03e7a729feac6d6cad30db01,6cab3f3a38e6fa7e99e74452286dfcafff7d7f06cb7d1704a975877d2d2d082d64a89afd181279b3f2ea3ae42b0858302ebfab27a8860771fc4b1dccffedd98b00,38cb8b5d9769163793921b3ed9b25f74c7e952ee7f7185a327f6e4ee4634409f7e8c9d9c9cd67809d1176a7802102d3887c6cb687770d78e608329bdf2943f5500,0aef00381cb31c078cdac8bd70e1bb7cf6ae939b4e633fcfcadfa272290856c075bacf5b04283c95382971ae7dfd344a406ca7bd722d0ee60572868b93c3060200 +8b7a20bc1bac3c13f287f5146be5228c031df1ef172271f866f1df7ffe1202e8a786ca9387e1c9b52d66cbc365c5b51b9be9520fd8240cf6fb292f3936e208fb59b58419fe9d2a74dc2a45ff833ca4f2c4f20ac9cd9b3ee2e51404eac25f45b3318ffa1aeebf33ff99b574b662a7ca847056abbf0ba1ed44e9b402996c72a4f221421fd051046fbebeb524f3101144704cbf99080ed762029363f21509ac0b20ed3f8ad7bb8a1e9e9dc1032d783058214df0e6e91223dea1e42172bf421835c4910b1a92458339648ef36c7249e4aa9417533c71ad16b10c339110f4526eb8dfd820828a6460b06751b8f635efa35b75dda7dfd872449019cde7bd767fa770f93bae22999d7bd9335e08,b183fdac3d7eaa91638c7fb200d2dac84995a43c13d75d52f0d963d012c8ddaa,55fcbd8736915e64e388c37e97d3790ca7503082fb60a88177aa0bf74606b9226d3170f071f5234c4a9249b94639a4806bbeb06351f289e981ebfd3eda9ccd7e01,2ab0cd4f5d21dd74433afd99701369be6e63777b05d922503f94fa12a224ddbb6d83b992e5465bbecb3845c9d65b3e8a082cb1a5665cf26b65e99df59a30738501,98ef48f5d479ab0cfe443c18a306a95b55fb464532dc79b777eb190aec17da457f0165fea9297cfd5e76614dc643842cb7bc6f3bcc11efdd981be1ad16e92c3300,c6494bce32fb51b9826413742cd52d658bc43ea10c07888e98dffbb3c53f73d74a7d8ee9af8740aa3c9ea73e2b31344d54fd283adf84685b952d2f901eb1bd6501,2e5d817cc7ec2e2806a6b12b370dae588dffcef614b97c6361a925e76844aa3a28078b9201df0ef4959175adb039335f559cb21deffb7a92a81588856a2246bb00 +d2044eb66e6f2b273602878a2f3daea0d1e346ae6ac682ed2f48bcab324265ef77c89494c241d01b755ee39f1c38e3f22fbe703c8439d4dbd70a23970ad5baa10650b884239f609520924c99fd622a628f2211f3ae8ad44df3dd3a013c7d1f8e9223fab275db22f99afbe7f11a6d8891b3f5d8061cfb688505bd257d78763b3f8ac0876a6ce6a739701bdbb754d8215bcd3d2cfa2019c720876ceb03f9f141224f82e02cde689c107e67b4927c6a16aaab48b639664b086c268a6b59ed384b9416835b65026d2106ba76de550e33e9057cc430589d4eea6843817ee6740dec2b73a46cf6f73ca8fd42e2899665d5c30d59a24e02a0b3ec4775a782cb048697588daa8e9a29e674c6d281,a0c6466b7d64c05bd0aafaef57ee97b88fc9a33b2fe63d88d0d366a4f92eb8ae,ca5b98aa29828a906dcd631d234aa2fbdd54743510733e2b934617841da788142b882ea39ea3f39d07a453f3453f3735c1e09dd906306fbb04fc7a75c65d598a00,b0ced2d61d56a72058f1470d709e010580f7a7b57b531ee9a9834cf7496c53d836534c6c5de17fbdc4749899e538535468cd09a386597e6f0da2e1b39a9f548701,9b917ccbf4fcfa865d8891d0fb71571ee87bbf5d2320f1869d0f8078734626a738c274ce8a321ecc031cd1271c38f799ffd6de7d3a681a87a4d92099b3fe548000,03da711ea7690b115e0629a7596bdc7c645bb62221879178c3a1a851e0d5208a2541e754245696f96e88628665f6ea9d974b387d7fa54133f8d7ac8e5d64816100,27639241961f64c60dbf98ed69994a4943e69a87291336c3b21678d0f79343891147105bb3193300e9f2d47f139d6682b75ced8abc0ac0b7186d6d4188db7a1f00 +d8f70c058f953224c25b71cb9662adc136826409bf4621fc5d579faf089c0cad54fa0985d3134dc37ea25ce29b7959231b78a7316752b6e2e2078ad4f2c496f30fe3da872470343e48744de4836541694dbb09f5642d075e9305245a411302bf1507f76439a4c007781864fcb7345c233bf13f8e0ca09ebd07b2f609c6fb8a96e115ba07a41913c16193e56473f5f2c04cb06b97bf15c26fa8d48b2e12f7181577e9b4d91b215f1115ab046edcabef3573a588f2eb73c352e8950505b10778d98a4db50b074247f4c43fbcc554d2e062cc8f902288bc36f5597d281e2433e166d0efab3d70b1a5f941b320ac1d386338f1ce1e22179a4e57f3d7f228c26412efdeddd49f9d9b3aff1e7d,8037d3d7472a486fc0d0d7c3534b53fede600e145360f143d6b8f78037f5687d,0258cf960db2af8bffd19411a590bad04081882e4bf43f7b8a8121b64f69c22b251661fd9366cc244cf2bb708c351106649a55390ddf3a01b5631c27578e6a5d01,d5699c2ad20167076d3dd414ff05a32fa62bb1022e71a2c17d42222a0a9866b1595dc7bdd4b5ea8e723a98c029f16500fbc710a20bc3b7209c2be7b8272dca0b00,86f4d181e8e3921e2315d24e0c05ef782288c45883b58fd0a4bf26b98df1ef57182df61b04a0abeb188c7eb63058a6a939205e0fa5a27010b2137923804a54d101,77771bbdda32d36a4d54438b784d96289115249c66e6082e4649f3699b3a8ebb09d526b0a860d811f483c5ee4e86f38c8e16809f2d191fdfc0a7623e29b1530500,c100044200ed01132a08fc579458c079777783d0a14037d2339e7c0f300e02cc460d27fb648f76dd3ce63389b823fb55b3ce45fbdb73f44811df153d919f2da601 +d173777120a6b55a1a27494d0228c17421e82f55ccfa8364267db3e5b1d2e155f7732cc5aec448c3c5f74c517a0408796261d788565fa3b3b6ce20b075f8e9103c368c8e3b6a2c8c154e2ee4e797d92b544b5cb59c83c6bc01ddbe2df1041ea2a939ee2f1bf215850ad035bfeaf8829e77cefd4f573cd54d3ac2283933be6d495a1bf30ed2432ee0753cfeb86501d05db4c431cdbae8a9bff11e10b287a48607484fa9c3ec85bbad603ac069ec8658cf70852bc9699de8f8209540bad2411088c4f43aee9acb35b598e23397a4740489a2dddc74451427416b18693bb71ce77ef405c9b9a006c1d6833d21246a59a0b6041e33659895b22d284283b7a0d34e0342de24b7e649efa05198,00992ca290ab509f84199b6677752737e21f6f58e2fe1567040cfa6827d122c2,6874d26d91752436f3fd8e3cb9a40d866640f620260a0ba4b096fa6c47d927492b4e5043303acc4cde4c7e97e73d74ec0db2b30f6eccd312ed588801ce11001a00,66dbb9c940cb825fae768a5ff0d2811081bd2c2bc5e35a8ae3f942d78a1cf1722fb8262e7399ea79e26b46b4eef3d26cbfb218102f5f3481d6d73b874bb8bad301,741c97ee315572d14c732e015154fbbf8db260ee7bf1cbd9df4a7667f385ebc4545677905302cfebe8a5d286d2c928ad2810a962b337cc211059c7896d6aabaa01,efb3ce61fc2bae3aa7fd0b4229121215f3b6ab8cf8483df6da9243ff13a8b2d04aaaceac2f262d35b72e7b92ac3fa4d19a31e16c0f429cc4d1f2aa2536b9bd8d00,21a0bb43dc443d68ce3d2f265c8cda14a9244aa3198151bc1da28bf022cdc474567165da3c1bfd9c69c45b46355f4584c74d7b1c7ceb7e7ea82ee5d2866d08ad01 +3fa2c6dc5f06e061502ea130f44e781a2346eef51dffcf41a6f7eeaffc1ec91dfc22a337da86dec3e4485b6f1ca53d591c0ef9f4643cf044818711a4387656d7636e70e7fdcb16c44a42c48665ff869ee9bccc6643af8ca7fdc429caf4de661d3e30bac7c5a04db20cad7c01960a1844cb11e487b38f9e047c03b91c185e8322d02b50973ad6cf346d9e08797267154277d8c00fdbaea38f1204f7741076973245b674a40126425b2035cd8c2cb6ac974c676560a0196c9acd57821abfa297c495de41b64db9a66a956aa509311c90557933067176c081ec447a1673857020d849f267e15675fc64229cc3b8958b8fcbbf8edc1159b54a6a270dec5cfe2c737af95490f678d07c0f1b84,e294acc4c8aa44b964cae9a00dc62d6051da6007d0bc4adc2803a233bed178db,2e20683d703f5a75d9178b4feaa840b3374793ca7ffc679a918e26a213802812431d39b30176f99a235aa6ff4521f54fd101c5cd2f3fd1f3015936bbb4cfaa6000,e9a492e1051e0bfc9608323bc358fab634776cdd4085f649654ca3207ba51e605a03c715993497539ebab19627e0a5032a367173b024e721d6d1f80e2e7751eb00,6f2badd165fb75f886c01ecaba7e712dc29327ab36ddfd594175e876cb5664b904410c6cc6ad283d45db32481b716ac4f505edaed895bb514b2927314d59f34d01,9a49117779b4196e0f22714e6ecb40e30d92efc51fa8923cc6e3c81e2b7e907c59b9dd0264b253602351440205d59a387b70e5281cd48123878373423b2bb3c401,429f4a79057f8483798a6b3e30361addb1eb5bf46d124289700ac10b6c246b8e2a464927ff3338a406c21776c3102fc964ecb1c0081166ee8ed38d2b4df265e201 +4bab9f87d28f90a3366cf72e9bc88b167802e984fc51673800b8f61a9ee73929958cc89ce09ae5cae061681e6e14e8756811f47c3e488415461d63c4692199c18b5462874f888c3a550eabeb547f8a3d5a0a9b53ccc0f516ab9ac68faefb4adb337d2351f9ec9deb3abb1a940fb18d391e80f64a7f2795b61bc54b9a86880ec491c878d07d1a10ffc9646f5e5fa9cf7a9979b589bb29c15bb7b910a52839004bfceee95c4d7a9337f9f1fbd3ba005439baa3f3b58a96959dc812f4e0fcfcc2496182bc94991d7f8aacb153d52b71254debf0b1f8936953260b9a820204b2868bb1e9f3287368c4ad4d0fc7fc25a340463246209dec53db626b9610cb75ef8b7b6a1993df4c2e8720953c,f4be51d46d5391cee0336cbdfff822f09852030d089120f88b33d250e8802e7a,a198830c465c8c51aaa78a3fa6f15d82b4d9040fbe8caeced31fbc0d3c4b37ae38ed09cb8acf571fa5e52ec572924e2bb9e13017de00295b675838d2d890857e01,bd6df5a096321b711a256a3b499c2c508b6ce8ad1346341ea77939b54dedd3c956ea8e3a6fb07429e0fe8c1a232e3f4781181acd1ac56c4a8a3e7aed6e825fdc01,399af4380ae7e42069a3626255522f410dd8cc180449e228fc377f37bf6f996871ef77d11fa4bc9f9b696d803602a8ca888099d18f92d972aecc74ed5fda730e01,7abe5a7cfe992f64e9e9c04177867bd90616e7759d6e5dcb43b6dad925709cc94d1a8e38e857f0a7d6612b41fe935ae2c013ef8cc2a18583f13dd0e0825febac00,99a3afda1e360445d53f530f43fc64f2d3aa391b089591259bbeecc07235d62403c8cf348e6860935e7e18a4eb93a9f56abb3a688455b1d9d3a39da5c5bd9f7e00 +c4c49614d170be15fe84ec7df1ce2baacda3791849a73fa6c63124483b5c52c3f3de9eeb3fa4409c4dd2904c8f0eeae669ce9027fe78880f2c88d2a418f007c38228bbf69f286f57f8aabb6848ed32e65b73d4d1be4d856ca1e9c4156970795d750bee5f69bf4b68e246372dd86417ae2e5fcb96f72c2c0f95307166afd8d0f8fd851aa28bd46393caf1e34afffcbdfc73a60441663a5a9530e3147d940b055c088f07671206c5eb8524a0295b68bf0cc0334251e64a9320a160230972f45732c564812e2160e7e24bffd211780d83ab070b2cebfa1e6cd84a2ba51ecf8981c606ed8235ef173d50052e2bcf98c9b71fd27c2c308b774fdda71da525b8b78cc92a9bf9eb4efe184b3d9d,bb375f67e7181f9a99837547b43f3b2ba58abbb3d066a405fcfd006aac29a143,a4c61d0de766565170561751e2ce4ae82ac74cf2af56e395cbcb30345fb9cfc262197b02febb00742566f93cc6fbd68de23fa63942b56f2d155b50ee414a06ae01,f0f911246d784a220f7d46d64179750d5719a14d63be302278e1648f92340888021f37a041b9395b9d5efb4a1fe2fbf40067ad202b7c6e18e03217a91691106301,99d19ad0784b0d07c3e6639039e5b4ac2bda0a1dc1e681dc86aa5c97688dfc211a384ba9d3ea79cf04d5d1d56bb8c7607648582d8b2c1e5ecad0ce07ab053d9a00,9ef0e4bd3d03849ec6234beb4d8e96133d5af801a1be76948816b8828b3fc7e072a5027c75638055db98b5e3ad4e6df5975036c4d82e9e339de8c98944ece4a600,cebac434324df4dffa13c4538d5f0f83a78e1f6d0d6a690813c9f924566da2ef58a4883610111a25946557947c5695834699a7b9eff5da3ec426be8507dee8e101 +5493549b6625d47cb1fc6ef4b169f6664bc712c928c47698e5c13acd3dddaa896cf4a4363ed2aef65053d533d592f7c7efd58b0a690c937e440f9aee284dc2a392e07270916142a3097e871a458a9a2d3041f8ce3beb27cd7536159bcecd3090d631c03b6aaf1b46e2bba73285487f8afa7c35e1eaa4781f87c245a10d0de805bbbcf1eb0770e29dafd0c6891c44b197e9ebba31f74d4483e3b2094967694a228ad9af1f835acec994a63fde03258acfdb955e6db05876e35258aaea23397567e58a1568e8425821d2e1d668e949d2cb4119b8b03bd11f6fa3b483247cccf961de4b7478e4449e387165bc255bcb77d76935695a9ded149e5e4be1be79c8f9e4cb6d8b5ffce1bd51c0fe,fcb072527edb066414339ed2c8dbf297d788cb186046bea353f0fe6492ac4e82,46fe45ae32f3debed7d715eefe1f6ce4dbf0fc10809334b0fa4ca1beb7d5f812332b153a0a12ebab5f61883311c04f0db7de22d2067bdb60c95ca2372d757f8100,fd53a013df543e7c2f9e72264ef09408a3469b667d1494ce2e2eb880f4fc654e4ef087101d49e91a505bcb28d0d5c9f852d7914591db841d03eba8f85299456d01,c0d77b73a936a97133e8cb3d1b8fcf778a2a20486ba3d6201da3073e0f15e95b4a24e6a7412af4f7eb89156ad61c25594d6f4a17a14fb499d71a65c95d79517601,b22f630bd1f06763be742f655ea571a343df50e2c6dd3e51ece1a815dfa4fdac530a2d38ab4f773c642bef38b1a763e5794cce27fcd6bd4bfd0cf0a1d63f150d00,46962873ef14db797b8290fd5616705773cefc4a2116e9b7d8b7c075a37ad7131eb9c958ad4470671a02bc9f5a28b33466a5d532997685bba9b5ffdd0a0788dd00 +518f0578d8bcc269539b094a5ee6b970bd1e7df593dce24ff63d4f109b205a98328a56ce22b87012bff8c9216ce45d4c419e9426394b30ccb7a8495609708f8e8daf2e9d138837e61d62d5e4859e23f928d9d01760d6d9c19be7897f42cb1cb6909cdf4d69fbaf19e4f127342035070535fcc082c11dbe091d8fccab4e9a53943b356e87e1fe00e08fae081ea971e44d40778855b5c0d381ff44f590978cd2ae6f12ddcb29ca3178174c673c9585e9aa06bbc8a5ff2bf3cc7cb2406199f0240626f0c8d91606591ac793ff1ee39fff9dbb26a1d9420937c0cbf7d9e78d12522e4976c3a1711ca47bbdd94f05eae399b70d493311cae25de5899deefbb2e34b3c6982f7d1a18bb2295440c7,7ce2986741825ff421eb3e8133bf2b1dc26e2424bd88af2a2404bdd302f729dd,dbc8efb694c62b810d35a71e20a3fc8615be656aa722efc113d981995a918a4309a8a62030a66c263338d5690a53380068bef6734803dbcf06f67c5e5adfefc701,7d661d863b3123858955e02708201292f5c837d3e6c9d53116ae34fb6824583662cb0e6ad2dfeba722a2221af114ff820e468d8d28ec944103fea9e1486c83d900,971807d53b0998f3f98f00db5f87a57e5b69ba485fa25c807e6937819c3e73457d1bee99e029cb1dbe7ecaa30896131aaaef52fc739f0a4bf5dac58b7dddb1f601,07ba4eca5f218849ab912622ecaec360f30e9adda275aa6d33618d1db3b2351337d0d2e2fbfc9759dfc7e810468d343a3baaf076d552d3fa499407a6c2f2d2a800,9b0a547b5a15a980b0a955794e4d0d6e6b6fe8566b2dd46d7dc633239ce2bc5d5a9931f22ea0ce42f61903b589970e2d2eaa19eea2c74954cfcdc37093b58a2f00 +fca2eb6da63b8feb798c59fa4488fc6d754cb70c76a56bf6991ed0073cb5a8d6d90d410f1397de3c6bf96c609842068294335f775f58500da483825ed81c056e7143c7ad45e8e5ac1fc2a6afc0fb9e2029171061c3d28434529b566a06819b663f669f76147ffd6a11a3d1ac4372fbf7545a840b2362bd2882821a84a85f7dc64b790d45f5dabcb80c7cbf359a838320cfd8467895c88dcc56038b74f51204a33697b74c6d4177c70462ea9bb737ced826d16d100b909255f2b887d9cd005dd7be81d051321278a3313efc713fc164227d96c07730db5b1c0026a03ef0c73f78f3281ab4a07d8d5c2e13cc939ba20bba7d2bcc613658c8f0a23891feed9774ceb02a9b841be9ee14ffd79d,684d08f79ad35610d8c6ca2a84c87709acced340ca6f440353a0e61ca2cfc612,6650924fc1ac3f0f61329afcffc740453483c3659d856948c9e20460724927e07c07221f60c13061b6a9e8e011f1a74dab973dad2f1429abd17f772f463ec38401,deb9a485e5dfc54ae44a49b48dc02ed61a901138c20804def72c3d6c9c66bafc3f0208b773c949a0c16a13f5c101c14d525c5d397a4c079354da584f471d2e9000,7a4f79585e7bc94d0d95c60fd0320f3bf4cefa2d088199dfcfb33b6f8e205a48407e697b7e86e8b555602c56e0cdd7bdf1f3346383acb375cf7aea7209ff869401,ee198dd36834844bfa6a8f01992e665576c98c2db3e0724691a99e54c5f7c8456dba4014a936ce9540d8865d0b6f1a14f280ed8eed4f4a535d48bf53bb37231f01,869f2392a96ff080fed49178038a56d0e978b6ccbff0b4d2fa4aa9c7b03341263e67749e31f25f99206de379e68c4b9216de70f35227924dc28f2c6d3580e3cc00 +9bc192408fa8915113628efe3240de4cd8e8970c6d57a425b39ad4741b4a13ee9bd445b0eeb3f12828b9539688b06905ab3062ec33512183c54d07847593fa749d036c14efd2b7537183250df28b24b8d733914b5b37cbcc2da70a383feda8bd318aa8a052d60102ac2b87a26f44adc7d9e02d2779f1163b4798edccafc0eb94c82d2da5436e7923573aa3828a1196159609f6054cd3a3bd70fe92c53e128e5fa96bc7f82ae807f1247da699a45b43f1b1919a645e8a7990aca05217ec4b65e40f25ffdb6367ff9a9c7c2bff61bb72953263eba68b44d2c3ddb7e1ccc0982d7d1f981bc9aa1cb412b55370b41e19706c1844eb7050c60be80fbfa5efa5fca1cdf16d8453d40102c5311569,300e5967a8e3846586672ef1d85eef3b775369b5bf3b8a239fe80ad2fa4ed1c4,ee5c5e2d93a7494064d3c26bb8dd6d6b73bc31ebd60ae824ae1fa80cae3923660da42816f0bbd91d6d9174322d1ae7da5fc83e357ad213e1d9437078ec49fefa01,830882538a60d78a174dae92a8b543cd90d6af999af819babf0b06dc5309afcc085d2e3d931080117aee0f14f69fbcfaef9b6629feb9b02402768655f36173cd01,2f600df4df66fea5236c697fba1cff0a10f7a47002bfba59ce50b4105a98ae19119a70558d604ef756fc1bbe09d2c6c4886b6a5a22b1598253d1059426168a4c01,23c8805fedee0123860eb6dc0824b424ec1a1a6f384c3cbc96b934ea5168b2870c231d121daf1f3eae4b26291028fd429127aa7b2684ba50c4c627d3ae91f81a00,dc6e6ff4d9cd5f40d75aa0525088f2dfe1319280bbb338c5f4fa24802de99bb904a1a12b3de45ddf8dc0dd6ef3b36ec435eba99585f52eb844df9b56f537317d01 +6fa5abcaa87b00a623b4185e45c144029f7490ed32ccd847fb67e5ea8ce7f54f6e66da9ea8ab051d6332e9def44c398eec47c83838f0fe4179f7f4939708e7eca5b3f8435d1a1b602af71f7bfac10eec35167bd2ec2ef19efc25a192877d2a1e8b1c3f99e0dfdb74bbea2e4848cf0913e5544a05c781cad7ac9b8abebed25dbecff9f0c5c277d2b3a8a15bf0657c63df587c844f745b8a98f02ab41ba93b9260071df861c02b2adfea095edc8dad243e0ea94f1d1937f6f54ab2160dfae4e2f8cf736cbadfe016ac62e0e8f711820261d0618594d21ec36ff40965ff41312047cb4d28451c238d3197aad166c0774471d5b435242777022ddd7fc6bb10d961b8a542e88833e544a7a20e45,2dbb9e5f2f2e53d595661026e8c9cafb496f3f27a68496cc0956e37c346d6732,b09d3b201e2787e4a9de49688ba5dcd6810c0cae2994720b0a899a6f70a02c5574ee6353e4fac6814317c690a369c98c4c81698162807ef5dd5a12623bdf386801,1ad878537654ef67f93e1067044e41e0a8d5c8a95a6c07d58fdaf0aae3dcd6c45ac1b108bf0dda868d46f0129a094232ebeb1048ed268c05156c9af0556da12c00,1798d1764291bca96a2782786a9ce19add10890cd778bba5d6aa0e516e0ec95464a213845dde3c378a2f19b2d5ec31d68343985b0e45db038bb216d2c8b9989301,01d7360d5ca6c63e844668e03d4d0b27989c6de51d37b1f1a662deff7c788f296cfae6e1972a4ed6f4e3b767a3f879d774609f87ea67819e748fc2f535944c5c00,36849eeeb458e2f166576a60916d6e38b84d93760f35ee41f5efc9cfeb483eea5618d913902f6a4cc0c1ebb9edd2dc2eecaf0897dceb17abfe043b8e0a580c6201 +de95572cd0481a52957d8641a39b597c06b44f2dc70c4af8b5ed26ced636d857f327b55b72f6152c3bba0e78f176314a3aec248a80005eb345eca46db4811bad966ff20205821654aab63ffb4c18af13582109eb0819065bd094099f0ff56093262cb04337037ef7fd48b2b6773bc6ef7f874d0dfcc664f36b8be01ba5006527dd82b616a3e3c964cf66e4c28236d226357d5b11b0abe0920155fe08f01f474c4176a2d91174e858fd0d61dc785377f59e2ed5463e313ba91880aa05d8333e0c926a1e7dc5c2e2b9c1335dfbc2f6a39a87f253c19c099a020302f877fffd9217f89776e12567ec9c200483ab4d1ab3160826dbbf8bfde12fcea8295dece251f313576c7129c79d0377f8e1,abfb314fd4198ed47bf51cddcd6b21766b538d0639b84428802a8ec939cf4971,325b12fc07e5c17924e94c3c310d3c5c99a6409c37d205eda43c20afea2addfa104475650cab040e5aa4dba3947d8ca8167aa6ef348d2775187f0cb28b54ffc301,6dd14282347dafdd72b49c0965e6c6d7773b5c710a2b154413cead840cb02c7e6b757abf425117ed7e552a6e8e81da5a5e2fb38683c1acea5cb5c8caee218d2601,8c530cbfb8d022c0c808758df655a369a5db64a9f0e754333933740b27af55210cdcd02e291132c9e5ad9ba28014e48f0c8ea19503e945ef52d53d3bf3380d2e01,d8e19f4ea8c596aff7e23b3fc1b8170af8fbf9a9b1f8f5929d1e70ee16c4b7b6062148c1f48ed0f3b86c505c97fac7bdb2cc2c1b9a6248a33328cb95166c579c01,052706cc50f2585a881d03a1d9717cffc17fef0cb4328bbdd728fecd8c232a5b6ffbb5f4d3f23201b590812851d7a2825eb67c43fe04dbe252aa3add11513cb601 +d6b235dae21e40bc56a9def4d090b55dc969a0e3fcb178d48f776bb031e191381bed2f0688ef34dfbf1374011caa695690bb466e12faaf00fc237dbab67c445fdc2e363e3a9f5b19222cac049a20d6c8e1905b6eb9dbd6f0856a1f8e36ec4650324135dae1b331e1e6a211fc1d274d7ff26383158a3f3aa9aff8af305922d39204553d486977f7dc7ff23be72ba48f04952a269b75f1e46e7e457a526f89037924e15ecd05649f7bb9f10c172eb30a85a89a9300f00d5f04e6be5a449a5778def3df94d819a4c83efc4a999c9212964cb8b239a28fa6636b4f12bdc7be1b03b78ce649a8511767be6098975f6a05932c2c55302a36f75b315155d55185fbec1a205d99984c4b88510dea12,4187fe0346117e8b301eaa3f9a594deab795973dcc9d5c724176c7e17d64b8a2,8962ca18c168792df5e5a8607ff589c4ef366d89ca0dc9703dc87eb8a4d8af1a5502658a0c929116cc390d6eca22919fcb36f411b359d0846624b2ec4a9c328301,1ce4e02abe1b4bde7cbe2bc42962e5d2e9b0dc6a204fc2afba774dd991621b0304f3a722a22699ecca758ecd6190c0d5c0e799a8fc75849e11af5bd2df4d75f301,9703557bc08480a083d81850cca5738a743f5b3effd07bb4b0997cc61a1a77500d58bec043183462fbb0cc95f2da52759991ab44066d16f5d2ea873a61a9d16700,de1f36a3e46ca99591701d0928010b5885490a7d716d5d1f5ca0a9b2e3ae5bf73edbc0cbc5e3f2f3d06c4dcdd6277ceb4c0c12ff2aa900ba6245045949e5c6a901,4e997f22a2401033e511e49a82f6f96d441e9e047ff4dc13627f013b133adb536b113038ac644dbd2e178587954dee2958968d8d932c688cf248fe4592b88c5f00 +4832f47953f15f33289e1e1028df0f271ca722b6915849ceb13cb279e575293278db8ea26ed804482cbaf46fc67532017910e4f3481ddda1769df0077828269a29efc77581de2373235ba00aecacb1d6c09b23e71107f69df8cc38589ae839b0237e63716e62975f89b0171583a54c7fcd605e8984fc44102e6e856e3f6b24e1d4a1569b8c11e02bb7a7c27a8dcd1a12a562a1fd13606ff15ec3b8f76ae0e880b9b26cc69408557bfe784bcba70639c096b9129f67ee376c804641f2d0d4d8a9210d811302787e715dc2baba07d0b458815a859d036e64d3de5625ae73a568c10e56789bdae785b85fd4f561d2fca7bd1b2260284be541d2e2094bdfebf5577f49b809a2dc960ba37e4292,787795ff9da020cdd53dd3f217430b6cbb49e0913b53fef1f388e15ae9d0c901,6c8f705aad7437931c8ddb5451d351306c13469913563ca005de0d75849ab0c878ecb5506ef13adf56e7712fba7f5a527745c452f7a478c3c4be0888c6bc256600,32e37d7d53b767a02a69fad6a5d92cff9ab42b42d5dd2f70669b4e800689cb7c78d1fcd2ff6a8413f12a2e8642ba2d2aa213f291829a0127b881680771be6a3301,396a8e49f6b0ab47dadb807341bcdfebb457f3b2e6ace1d9eb116f46d2cc7a8f1eafd6e428d3e886a88aafbfca268adf4fbc8ec6bc7134e58a5d3df2c4a2db6800,488853703cead490f3af547812c2f72d9bb3f97791d077de2c5926d088e35033196f2cc8e3ff0217629101740cd7664f92bb2b446b147bd47e7fc0009f1f470801,91adb2ffa591548991e27a764c01a1f4898ffa9e0b53502a12a0282d4d57ae8b53d2dde6395b265c017ba9ce38e166f92a6061168875f4555fdf63631404506d01 +c0979e8f06a812f754219b38df226e9654d03ae317ae5a8f2ef1a379dec3a1fd745bf97209790ebbe84cb4611c1c61964c2dbf4346f0b85d9c744553bacdfcdb120d4d3e916e0b59bff3c0aaa824994bfdef00e1380ffe6c4b8c7bbe05ad1d23b862fcba1754a17861e38be4d8036259863a768ceaf8f32b0a270009e623e134279a8e53baf2ee33b6a2555cb21fff014efed03401850fefd30c23b756e86ab3ea204b23b4a6c5f54d67d2f086feb94299ce78c7d215eee67e66661789c2f95f1d0517884e1c04afdfbeceac849205fa17691d0810adfe5cc69936cf8edbb8dd2dde8ebbf8f26b92c54396945ba5a84feea802ed63b25f24a72c24114013a8049b92e23471735e07bc399e,1729ba8dd15fc019a4b7178a25986e361e35f435f1c119d2bea31c6744da7860,055d037bea7e3d23c7771d683b9250fcdd82b7e8e2374bcb02e5be64c10545e57abd853298a015b94f5214e0534dcd8e930cda734f79d7e7547209b57006fbf301,25e83c60c7f00aa4f8343efd60b63bc901fe43d82d9a5c39e84190dc70f886105823f2f2d8ceb736bf9bcc6050ad9235ceb7a22ce001f24414c4781f5a75d41c00,308b6c0ab552b1d905006f610b50ae2d45bcf9b473be47b0670db37adc4d504c13d16dc38b23d6402692fea8e1a7a09c0f2d0f7649466b64a9db809ed4cfbe5d00,ce9316a2580ef651cde1f54090d67aa533caa85f38807f94a498ea4244b0deac240c39847e65b1ce1a73d52b71597a1cba0fc84ecac59d82f0b6957a1ef3453201,6193f10dd0bf644a0187e948903337e51d913fb886fb5e5e3ba4e36cefa95cbb28f39e1eebbaa1e79d1fe84f2575e7849f2c6132fc4023a3f5ff85f38b90622b00 +da60d63c300b9fbfff1983c8001b0f74e136e3457bcfe9e80be3aad11b51014112aaab340e885837a4f5477af47ab22d9bac1da2bd69a17b04c28f8b8db4c0c527c730efadad37ebc0c3404d8d1547b969fb1b32179fbd3f79c142f27523f61961cf73b72eeec5814189e593d02eb96f391ba8d8ef94dc74bc9203402eb4228327e27e46c78981400d786b188e6ac06996328199bb5b631301aa67fe65d725254ee888d61da9a8f995b62c635257e829a7da1b28a26c3db8070ecd2cd6bcb86faa27ff3bd73a63d8d8ad1c86342d7d4b6606f1f0001e73d652541672ac93a161c0b7a160608cb1a7cea62e3f11aca27d43234937fe2e4798fc0eacdb1f8060f5fe28ea37fc53381b6a1c2a,e91bc80d4de6a01886eb8692bfa388f7e07e06c0c0816e02bc56f2c3e75c505f,d9927d0fdda35be5695a93408149b4904f572cc3b447b803e8d8e564d4cefdfe38b6d46fabf38186913d17a3120adb8e5e97ceb2e7788f5e4675f5f604859a0d00,bd74c20aba0c4f7b105c32d71d15da16d360fe1dd37b9e1b225786fdd327936228027bbfefa8f2f9b5941ea7ae91879633872b5fe15a947b0146f4e6803ba42a01,213d74a2e3753d1d0573420dc65b5547d750b3b30907ed25515f2c6ed4ca104379ff299a07a1b7ce66210c6b0fa791251c86ed0c083f6d7c980bb375ece8c34200,cbc47570da6a8f16e8cdc44cdcbc4ce705e4d7c9eca758655d106938405d81d13c211e1b7de385f99a9fb278a2b21f8c00b44abe8284052ca12b9f6873807d5c01,66d6369e5452a2e1340c84a26e563815b29bb0f07e6d96c4fd899f20f2bc33e91dd093074d597a6e5f68e3054654800d2687f0d16414176debdf8db39f313e2500 +cbb75ca3a626e855b1ee44c17fcc619a9d19e7f7c47a2c0b7bf00aa4c11f488cb41a7ac649fc9d42da7ab844d513cf26762c7b235874453c02ee76b1db7377733ddeab72d3359b483b9c3219d2eb897c17d76f171ea15d8bbc4a1b836ab2b2e9ba21c4462d16a25385e9b623c97c342ab2b8ce5c7e7ed7814485e9cb5907781d5a2487f278655b8353c0f01c8d4e6e135cb43c60111ea12548fa9957e1f1110592a3a5a386e823ddae020e0d4b24b33c6570741ece73f9735be184a4ed6423774fe59a0b3952a3b3aeeee29bcff3a5a7da6c11a7bf4f3e2c47b6e9936f701485b734bc35ebe317a14f72f733ee1c0c405d3d443831516c8eb5b3f9ca6661745a4f9b25c392e7a50ea0055f,120e7c1990339738511529ca89a3aaf001aea0e6d574ee35da2fe86f4d4fd864,80b31636523806d61b00205ab66002012b74c85342a44f66f5a59cdaa011c2157d7191f5473ea0fcac72dc2ad32d855806ae048d1492be369390af26012c035c00,46c7773ddd45b4c94f806e9233317ca2bfcf5039bf4094f02604f6c0031748617f554914b9eaf71ea268e5cdb2b2bface4b690ee3d406de9792f72aff96bc03b01,e2971d58c67f292593eb5f5f0de9fc8652a26096fc12c58b731f6d2d941a10950d4b4d12813c6b8ccc58e1e6ef4d105318d027773f0a053cf9a69b5dca05785c00,d8ae5088e7ce1bceefcfb23821dfd39fe03de4ef8330bc8f394d8b591f7e37e9235fae068ffa3e58eee5ffb83c7ab75ad44f9f5d62b1f055d4c29ce48c4669e101,59a0ed2598e326867de38a2221978e57c76eafad270237bbe1f9784db8a5e1df1f81c1ecd6541c3c9fc015d14e458c912d20bcdf4e965949a5b465b3e685fe5201 +548fc704a89426d01f3225f301503391076a3860f232635f34579095ad5359106e4d6655a1e340ebec37057164f8218aad838a8b8b4ca20a3436797a9090b0baca215a52673908d5b5a821a7ee9d70fe009c41888f116b475bbc6169422d7de589271a68db09982eabf4e841f1148636eb8e715ee1427cd4ef0970c533bad25a91b967ae791027f588955ca73c75c5a65503f0a32a2bd7e4782b6d35e88bc25bf06a0878dd4b7f2265c0748a3d7944a8b6a4edb6f6dcb04e87cd96371b7ad17a4dac724765460387f28bd48f62765c57d2daa406e2e5c31289026059389b95582b15d0cf22f86737d065c5f0d317cbc4cf89afe7b56a3f54364f7d286c0e195f9b369b8e494bf82d280214a4,0dd175d7c8173dbe4ae4793c668e6c65734fcb5b8f208e2fb0b124457aaf9ebb,a59f1b7d5e9cb6ba24ad88bf1593b5aacfd42628cd624df7ff15a48beda7a4961ba262e77e8664951134955f6c28dc794d391cd4f8cf16b003aa5f7abee6acd300,9b88fd94e2f728168fc970bd0f3d14eb3326e3db6b02ea52055f94fc999f8b6e24692b55b82e9619fa720d5a5ec61412e7f84b4a18f988e1b21d8e1db84f2f5500,6c7df95660396669b905ae39d31e8878713915f5ac7c8f48b263cde6638f289a633fde6f101a430440c70884cc2c1c2e92e6b028cedc04cc3e5a54e4540c936b01,8482a377336da039888873abe1829255cf551a04b710fc3cfb9da20d43db8b1e4ae8243a68d2782ccd69b91c070655c2799cc80819403b070051ec01f4f43a8601,6bffd1dd46761e91f57f289a0ac3dcb557a7b2271e84d2fd5b6261b65be1511d504c78a86c8c2b891f2bf90f6dfea9908b2a5d26297a742ee2dbfd628cb8f7f101 +627acc8b88df0c522cd6a7d3d47fb4f6ff394e171e5d41aecb74cbb818fa1f09976215bdd0a417ad3b993f895667758751dfd621c2f527f02a3a67cc5729b358d3ec9494d2b7ed6472ece6555c54b51be695324e35457a0a64daf5c8659bf507c6b217b8896d175bd2e636b113a68721161bf70a7c80250e85b4225e961639bfee2ff1339eab837c637afc3bff6d8bad7aaa957b2dd81edb2d5c97770960ce8a8c4a9631df42aeb233c4f3ce7237a015254ac829b2d9f8876e707a69b01107a7b2973e38ad2ae44c5648b7e93b2cd7e0a8b9489b683f8c8ff470793dfca2173eb1fdc7c41096677c65a651a80a2ddfa661b21697f78c4ff620e8a703809ce93a62f397f9c9050822ae316138,092f4c93168e1905b37dcd2d5f07a7d180f5ea6054a4b20bad7136478d04457e,fc9c71b703903f08ecd3489c5a0c446f2a5899aa396d8d6fd8f41460eb7905c0066317e04a16260651259bb8a3868de008cdeeb764a871c519d2a60687b2896301,c350c1cbc0b992028e5487c1bf02cf29339c290f72793b6a4a203b70088c261a0519da231bef990f9c7b45a8b15e4b0a5808d42677603c17218d24cc0e1b73aa00,2eb1e9ca7216d5c1577cf2005c2549d28948230164c3761ee37cd66d8ae1570d592a825ff65fa072f19cab3946998d4b68900e485fd4838a6501f70fdea2df9301,e047916d377234efffd7157e8a324a8b8264d0891a3893bfe9d010c52df2a88b3fb456e3f885bf7712f452ffc92479738bb075cf040ba90d26aa56382ad58aa900,1e480e0059663eeafa15cf93b788594514b22454f02e1f349185a9083238e6bc21cd930efc240e7612a7bccc7d0296d72f38fce8ae6c79d295545b336b5a8bfe01 +2351b1797b30a1a3c02a7453b66e2d672832abc70bf6b9f78a26aeb221a2b7bc3c5278497fbc4a77bf843d4b9036c26c87acdf9ecac4bf488ec8e63133ff9e9eb2124d3988de2e496abc34db0ac803a73d06293ba5747549ba302b3e71b0f8268a8625386fb2e9e401716cfe697cab19b5ea6261cac6a90637ad237f121d3c65a8525cea226fc0f1d830ecf197fe078e735b188fa27b875cfadbd83b4254c5e51857191259dd2de568ef15e841d347f3acad87cfc2ed368591dc2a7ad3cd9ced033b0bc5c812650230cd1e15052ef9ae5d8e514868bec4ed8558288c8ed39f7aadeecfcc9467d6fb5012694cc05e70584e9e2067c46d07125bbfe532fc28535c64c7f5534d25739937ce3673,ba5a0ad0a76d3f2aca068b90ec5e323a24d66222d2b1910519ed794c4df32fe5,f66641bf76395d9a06c9bdcf56c7d3cf989765b4980ff3b6e342ea052aea169f21b8713652d8a9c802958959ca12b9f2feaa7988ecde9b0336fd79123ca89fb401,22921820a69192b42f4ad528ceb382ec5b8571db62b8db89588beb2537ea1d9e07c7be5b68ad22dba554abdd1d3b6b62b68dd8a96ddff87a75f56d18e761afcd00,9ec19192700378d4cb3a559f86198eab11fc8e045e743d9f21a486987ca8a49037e697c398e172230ec294b7c9d9c1d02a7ef83486970ed936b72e3d624e770e01,3b28fd11ecad232e3256b4ca590e3c8aded5c8f690a26de62afc6a58e89ac89e3e041acd3fbd1b51b5fa956d2e9fa65d01fe0eebbb00a23b9d5fdc3c2af758dd01,2cf84126d2bff98dd1bb13ddc6d8d9757e51e9ce68713ae9f55a73f09abffbbc6517d668f2b61ec1d6211131c7bd50a6dbb6bace2f097a74f9b3f9eef7ad0ac701 +d55870999de2a64bbddd15a752e208b41ae39b65d617780103902d2e047f5ba087c47a68586c2f5e0fe995bb99e1e0368e4ef1de3839d4186a9c1fae58483e34fc7345b9360a6574893f93eed2860de5241db6cb4bc957f4b4d0be75eb1c1ead751908a0bb07c75ce18a98e65d009c222b2b895adef20c34c0802afa651244368868513e8efd30c5f862e4536a9b9ae3941bb7a193c4acb91a0d183e803cf4d7b02233dbc8a3d82ffce91c182df65e6644c738923a3652c08c66a79880a8b9f6806dd3b346437493055fa23828927329c72a2f725d09f83d1a461c39232fe1e96129002bb648f9ddc442bd3472ba35c33c08927d3536ad14944ec505205da892b2a02122def5865dd7c55ea3,17e1450ab007dda30d7b069c2a09d416a654681bdbba176a10cecace8420405a,9f035f00f2d349db1f45c9462f7808f4ad0d4dc6cdea3e508c77cf828bfa8a9636a9987c6d638cf0717d3f642ae44a717b908ee5760cdcbda1ba950a25dfa07400,c12153262cfa8584057a0eea3b65c0ee9d34f9e1ab08cf199ccb333c78b6a5c81d05823fb75c78de5f1033ffaaa8c3233b847ff80636d4fd95548e8d45f51f8f00,848d6d64fe617a404fd75792fc101935f59525521432895eb5fed8baf2a021d917ca309de93789f934ec228eb6fd280733f144c01a17fca2d89195a580038f3600,c24a7412a013ad04e3f3cf3c7646ebcb179254c438ddfada9319c579fbee0b80039f49842729f8acdda67b1b4ca91779142b9c8b962de16f743c133f17b5a3e200,81b32486f89d5162447d564b2a40cf010b7dade0a6fa4d4beb50d4a7403cedfd7d3ddb03724e7dc3e2b9d75f4f68dea2bb62ce937f33d450b237dc250cba3d7f00 +be5f61c9d490e98b8e010468cba9288704fa961ac29b5412462f4f98c4d181d08790c46083cc69904f759e213bc7bfdf294d5e6c8926815f9b409b39866e3c1e0adcd341e231ce79cfaa1955d8cf9703c1ff7ad3b08769213ebf219dc3111e3488385221be1a9de963534d6c598615ca22302d4d42dcb106d06cadda8d9016d4b2838a7ffaf2d80a27db71eb9d579d400a3293912859b7cb925bcbeaed4a45f090fe6da2d5e4eb188a4db33361c8e229f2bc1397e969329419df68f751bc739d296b9fe2fabb2c072dcdee3c36c12ffe27dd3bb9133635936999f2f1bc6ce93a8cb1f9bfe5388e5c9f2a75adb05eba56857619ca6d2977aa7ade809001c6387cd5f9f545d564649d129d22dc,5af6222b6f7145919ea89585cd1f0da182fceb3ff79e88b0ddd25eecec0e1d8d,39a15ff24c39ea8a5a50db4370d84dd953d08421a1354788cd9df03a836b01312d01a5f4f2aa74ca2f3c1973749a809c780cb4616ea4357855c421130b637f9800,7c7343d2d2ee3014e096bd93d0103d143e5e75ee5e4d3bd3f232292eb89446ec0ec342a24c3849e559eb4b1c1edc4ed679231d2402b681638eb92286ff733bf000,727acdc1822f4298c606154f7792d48b388bbbdd6dd7739c4db2b73ea278f4656ad8f5fbefe7a336542bc74e90d42d2ddb8ebf1e3b5f87e348750709e50db0bf00,d05a348ef9fdd4b742995287bdf09d1ba93ed02f2fc652685c7a6796b344185045716be56d5d4dfda323d5f35f4f221b83e91ad74c2b7df688f84c2776e80c2101,8117769b994fe081ec9dbf94c7c0c31c8a7bb554ead6f34f6635b466d1a26dc33325b5b6584a74d11c2b81db3990f86de034e7cedc61ee19c4c59133cff822ca00 +53c846283901eb2f87e0f71f8dfc6da1d3256b66a70567e21b8f4aaefcbe2136ae9fd3b5e2f4c523ec0434c80fa3bbab205822480445d43d0cfdcf60d309e3e240671838f735b108b3fc04a6b3d5dc83a39d7a2494e28a74304a889a6c265c8073f97e784aff63f9b92b12a2f5bc03878742810619bf1822945f03bdaf1a662274f1091a4b17b408c43c73fcde6d1b47f634f8926fb3ce3b2ad28709e788bb9078ce4212ebaec908399459d81ed935c3730dfa5c3c980d005ccb6500c61adb24c5854dd98c93e61eb5b78d634d1cf410d8d26d6a123338db06aed87e165a4bddbaba73fe931a96596309015fc26bc6a8e836718c71f6716183fea6e4dbb3c5e45299d506a9ba3ce9bac8c8d8,4bc7cef9b19610872f49fcadda0fda0f0003b25ad6b647543ed5d2aea0b289f1,664828142aa8ea9fc274d27fc4ad195b92d4acd4e201303d3b26aff97cf0dc3d19f88aa68b14e94276654a68b6e544c163b093b3991d420e7ecab159686a765d00,81c99cf4ec2eee5659b3f7c88d373f71a0a0b25456aa515089d11b3197ba0a191201bae4936ac1a78e2c41c88c993800b865628024a7d9de45d04d93dbf6432801,03eeecee9ccdcb104494d1f9f357e319cf8859ee45447d21944f0b1c3a20d81139a0eb1b7a908baab2114aee1b9058954432338e31f5e28426de7d139bb96e8301,05250b4810a76708ff5cbd254d1d57d5b830964578fda1c546eb0a30ec094b956ae4d7694b435183c26151860d22ce39ac1974646f94a965328150cf5080b14a01,37581204234ffb9b084b67050268f52ef95f6148b946dadcd1e038f614f471542986dd40ef620b42707ce0fa2ed4c6be6a8e20991d650a52ff84c82a630e947b01 +75e34a8c621b9dd7d22b5044c778dffb0e829a66b7b0f22095d7573db2650fe005b6f7cead9277a647f7a7b3404b60cf6a2bc6ebd4a795f5c3323639cc9bd42ef4083845a7aa76571aa4afc535a4020bdfd14269c6b99b2ef04f42d610296c1c657deecd639edda76904a249535ead0a328e68a4cc6c860e416baedf5f7726daf37171c2909d88573cfd1583f0763f390efcab01a3388c2d153629abb8e4a7f800c33dad1c6f3649ed573956e9dc15747b1608a4ee424fadc58e4144628404d548774f6b30acab57fc73dbc9f59d705444c82cb2a1d51733c5cedd55704221fbb64acf13d740dfb46b30c86ec80d729627eabca0245287aa110951552d28971ed18458d561aff611ddee7a01,89c2e5407d63d88e4e9c181ee98c8a0c35ecb9d997efdcfca98c4d3e3f8261d8,b17596372e4e69ce5d520e8e1789305ed5092449d62910c51dcce5d3486e846348af0fadd6ff335ddef5b05ea3bc128d1e055dcf9f4bc8f44a6483be0e46d3f801,897143b2ec5cdbd50f35125758828fd7f3a1f72f299c85b2b2cd28742cb3bb1c45554f5e02ca1b1ac1cea7b7c18f5c9d7547ee5819a1720c7abdb9762f2ea29901,e8a5c0f7fea08eec1e9dedb5e4cd04e585db343cf04f51834544e0dc2b68c1fb1ee179b61096c6c46bdc34aa325518c48f37b1d4ec2713ad0c960f839460ef7601,09517401a82252348ab5011565583a542646873eb69b690eb4deb465b9236dd566b5433b577c849fa7e1cb95d17037fbeeaca726dc03c21e0bd7ea1d3e31ae2000,5725eb6ea1b2b43697de9459cf6942e448c7cc73430addea60ac85a01792d1e522ff87b04e0b538327fe930e6216df9a6c16fedd3515c57cfa5addc0efe67a7901 +eb60be54ebb42f800033a1c733bbd9d4e5ad2d3aab22c38bdfadeef441b77921ef7bd2f87bd9f731431c836c84146ef288b8147959380f78fea937b01f0b8c403f8fb3872fdf345e1a9cc8c90180fde3a2dcbce70c19b75c1cef60fe7950e46f5aebd1b6ce5bedb5e0732b60d483a35a32f6bce72397046a7b9ea828c862a64152656bbb3200cbeb4bfbea6ee20ddbdb4bab97b55fa9f96ca784dd9794f49cb61cfb433ec1d07212de25bdb40e484308448b3e180401bebd25e178fcc1235d4840312a4f72af7024e535433e7c0eefd1ea0aa27707874c04d08239debb1be6d87b120ade39af8d7f358957b53f556fef558b704b43f362eac3cdee7fb0a925c20d010acfaefe56b42e7fe2f5,5fc787bb550d37b3ae62b5e5ab4aad21d541dd351a66c4376fc020ffea168fee,aeb4b1b8b48e19cabeebc2ee6c0783205f33eb336b8e165b12f263ac816a9fef63985f2f2a6d500567279a447e3674fdb4ae68ea485f40c101a4d3222059799f01,5bc7ba76e82ecc3e2942a4f4d7e6440b788c7022b2a956dc5112e9dfd4859b7055bb3667266a5378b4bdb31c5cf938c1a37c1faa6aa8c1abdcb45fce2000304c01,c5bea17216eb02ade31bda2cb9eee2303e27d41aedf99e377104dad8734c9c6e5100fd84613c059525e7e176ae6883727edc607fdc905cefffb4e7158bbfb6cc00,a2d0add2b6e2c4c35740b03c74cd234b0e83b73c440628698610a5763b4c5cb11279c39f5c2941031354f107061a0f5449efdd9f40a758064c134bf86828682201,8435e41f097adb161fb966e5f61606d09e138134de31e0ab79777ba562572b542770671d8319c828ba4fa07763889c67944cdd4747bc6c6d0c442fae3dc7f07a00 +901578dc9ea77500cc88c4a5b38c639d9498eff7817684305a0583fc8670547b30d1532c30ad4b2abbf0484c7890825ea3bb4886aa1ce56e9dfff59c6e0a469cfb558b58462c2e57c80116d4507b5cbbe38068e2c854454f126ee99d9d028195fcb458a5f067e0a3540ed0e9616478695b37c9196b630c705f7eb1ee4a00dba9be2cd703fc43e7d400e94267609ae6b7bf0c7597bbbbcf7e28184551e922e732df7ace1e0e02e693a2c546baf049ad0ceb8d86759691b4820293a27c8a7383704d34a1588cc95b6ca5e905165d08b851a01e9e269b168a81b467352abd20bedb51e0c03a31189c79fcc80eb6301025a63cdaa7ed757173387979b7a63ba1c77ff22ab93842d74e99a2967c59,8ac0ee534485be0d766b99d53cfbe96bbdcbbc0b6e2b8719eb039e3e613c21a9,dfc5802b7a5d49810696571ec8cb12579a37ec6a2ab890f7d7a2232d9278b0377e96bff50695988e3aac992092804f1fb8934f989c282b15f76d6b10eedcfb7e01,dfec3f2f0409e19de9c89558a4e6cfafc0182b6e009a41bef9bba189c0a7e54a4c1212067a778f722b9f7f1e40da6771dc063aa78784f270e09b606f23f46a8e01,f52e9895b138ca563ff6c821bc3d130014aa5bb8eb8e69fe7c4e46e82b85d2267514b257de94032452b106262cc74587170e5040fbcc4d6e158ee0de991ef1f301,74e962f8bec6157f6c1be752b807730c3423c5ff57f45358d27ea3e8ef9c82074a4da4af6f27bc94e16057304bcb7a009f1c81917320c8f73761e0e7da341f3400,1e9858751b71689323a59f8176f767e9ba463e3de359cb6d492a664b0570cf991bd9122344413661b965885fcfc5e43b26173e700abcfefcc8732c570b508cb901 +ebe0c15142b89b7947f11b0a70f5361277baca11497541b1db6450cec804b2e5c704f75b920f9a104c1d55c45cc23a27c8ad8ae96ddf31bf6a9e2471013de52ca85101a7fec04f4ac01d41453ba38fb2f6468330246a1d1224c1450b17cd285f6f9d1e65e56ce1a8f4d7e1f30b14f71230e9dd88fc3fa3f8145e50bd267ba4c6f6294ab073b56ad7ce280e523501c3a60c2964d684bf7a956abb4940a0927d68c17c9519ba5fd39e0c9d3a55fcbbd1eea6d67342054e0ea83cf00a1748b9975922be7b076b940bd514e7b3c9f64562925f8e93b75c5b15331deb44a05149c3b486d914b10ab1aba9b54d88f7911d0ac59fbe0a4a7dd4fdea9a145df96cec1f1fb2662a8d56eddf09a9061df3,515517b701e0585e648114e87400fd466af7165bcc2112ebf3b8907e3a9e8baa,90b094285d76120284eb9fe2b5444ec5848774fb7a63ef6142bb09f4500ca223570879102df0d081a95286bc32a30144bc425d0137a903dc5ec4847db1aa3a8900,5a4736ac3d50a457c902290833ff4de7524cf2990d47b1cbbc150cfcca46db771587435861fe144d3ae25a7984dec374ca08a94703736be4c8cd01d37b08ad3900,d9395049b93739cacef13e56cc189c10d2df61a3e27ba0086734fc6e6e626af353faa7488d3b24a7077b3a075a5dd4f76d37e1e89527cd76fa8feea875d7310300,caaed2351b1a92a1321d07129c960436916942cc48f4130dd5f7a237827facaf54f41b79d3c58cf79df2a43488f54686eb80e7fe5d0804797db0577a2fb1c8a901,7e87e4bd25925fa7893846e09c0d1b184153f6963c13b4d705d517e4669e838c2f1d8ac5af7f77a13c0e1ddee28dbce48c120c58ce51426acaa39c622ad5096301 +b816870b1b00f61d2c6e99f260cdbe0ba9d7b8be1fdfd10b95b4d403eef6e115bc5f2428df4240439be598d6b5852221899704d56016c02e5cd8f8a10add176b13a992d2b24961f6a435d578090a6da53d97a6884f39746f15424093c3274a911cbff167fe19d3f43a2a23fdcf428f5c333d6c918468fb07e13eff588dab4fae0455e6352f7c4206d408752e1117955a2c1416a2be5d97b62a106ff1819a62e69d59269f4a9f30fa272c3cc4bba0819695882bc31e920cd6cb5c043607422f8fbc66dbbe0460338e6ef8819a80c79b6ad1d55eef5125cc26e9a8c85b80c678c4a4d251814baf77b5ffd146ecebedf059f4d0850cc8c04b97db5a79e903c0e9099d7994b2ea9a96d6d42c996293,59d85344795de009d196e4577a28d23490954c7f0bb61697ece3638d44e623d4,4f8defcbdc24751aebb4c89732752a937785d9848e28701585808f10a24b99d51274eb1e439a0241c769d224653cb6e285a1e3845da2f5c05356b0e50c37ec0b01,b2751b7fb2a2241768ed7b3924f8aceffa7246a782acec5850050d6d84dddb5c4973194ff6146a860afd8b2701068f4c0e294832513410fc1ca44766d4efb80300,4890dbdafdec3d9dd7c99d2e3ecd5ea4cea02b4eb7918376d46949a911e5021d655f3c5cacebb7697665b2c3082d37a0dd41272f71347aebdf3043134f7652be01,4269586e5bed6b7634f1b43429f5bd375573ad320841162aad35c0a41db3a5e9772492412af056d75d8a06df6b99c7dd59112466a7cb9ff0bbe4ab1d498eae7100,55ab9be83a61588ba3898f52a6f91bff9359b2e5a6f581ad6f4fbc891c7737407cc62be24028271821ad1b4124d8aed6a050152fe3d105c62c18ea731eeec83700 +73bf726a594a99549796dcc81aa58e3339714a1d58e366da9516fa5a1d115e6fc0891057a3e33de89db951890667dd929f8e913a0ff68a116049faaba91a2c2645350ed79420bdd2abd8477b1c1e4bb3905f159703607d9c6678a5c5d0da517cfa2c19c99d537558b6d10d9e71bf54fa648932c713dd8e59bf41c4cafdc18cb8c325e9b30dcce4eb2a045551a27f41b9fa5841444c3a5e155a4c4d2378667e4a9fcfcb380f8381f7da84737f02138260236f9238bb35d6cacf70feb130e752640bbbf66d42d13d34bdc7c98311bc2617abeec9547a00765074e70e3c6961e95d7da6221037caeeb494ab7c86f68a917153eb483aa70ea42d4f8909c392d9c3842fb9413cd97c5c7b1e25872d33,bea7776d90c6c14d2cbd480c780d336221d1ae3e4baa224ef4664bce30695119,c881bacebd44054ae3ae167d295bfb93143ff3101cf5b103335d0bff8338853b2a647712e90601f6f8bcd5c9d168efa4a7b19aa41f96696eb6730c3e2214f69f00,1a1346bdbf0093aa90e2154ac00449e16096c25f35e425cbc4bfbb6aad1341750f986d37222a4310ca34c5f630db4f79479ec7f1fa9b4469352bde82f7c33deb01,3cc58c99da417bf9396d65ec77ca5dfa763a2f7ce2d10afdad60736719093f7e6b077d11391394df9bce1af75a09f96165d6f16321db9744fc7b55836467e9ba01,b22840680ca3e0c2e1b605e97585d181587bad0641617fd670c30b4a427f029f348044ff8a43cfbe93d50d25cc83424c6979a2c8641863540bf04a8948cce92101,7000f1f45336968e789c2d8172f2ebb5b74b77f5db2136be432e9d12943f8b344a0dbd9ab15fa079634cdfbbba2d419cb2158c4d0a5964676f70946a652bed5c01 +fc637292a67dde9c81ca37a2732d57d15277beb0c68b72112bd619e60ff5a02bc1a72a7ac466cf2380583c8d0286901871d2cf72de243f39d0cddab1d5d5b532e8fcb3bd9c872739d3890284f55d2fe886f8a0d6ec7c76d389327e13b027e89f010351c81040418076cd5d522b0b88a4a8ab46e4177f1a7f569da53c15c8505ff33f1b7e0be55243020bc4433b5c14ff44ad2f1be9ca4678b6096d1aaa2c2984eb8a1ce86b6e9c0a75045ce2a9c9a0cda0d591d258c8b2b53d45a05cc3cc1be112c73969189cf95ccc8237e8af4f55ef32b1edd63ba5eccde46eae4a7285c9e5604478402a1ff098e5dc8febc6f657069aa22eafad0de5b51b88fff3efb7af2c9b3254f5de2df229b102410baf,9b461103d59a596548a22e56659c86d0bbdf515ff3e54d8b8f128ca42c87feda,4b4893749a8a843139d5184f31c8ea081731b498950b079fb85125b4db6df9574545ebb225f8c5c7bd84dbeb0e41a72df8d38ccd444572e0087abdfa6201951f00,9af3e065296bd458fed056c53423a595e9565caf598e545bd2f4c34095a5af3b766fe9aff9bb79c62ab1c3864b144e6ee0143e555cb01cfeb004ca573ba8638401,b9a709dc84eceaa183cb64e0f8091236fdd4e50d615714bfbaa07b76b8e99058512d22e4685a9d014407f40a650d06a13c2d65671dc8f973516d8b23c889ee6300,5d6c18d8bad71552f7f842b41dba4a6fd4bb4a63a190ccb6dedf3700efa356431484ff3ecea21fce6bf9286a53a236a3520ca37f3cd094b224b750270b9d95e601,8062cb970f90ccf5a13ee288782ae7429f19e89a8ba89a1e22906a9db230bf7309475330717b914d55ab8371b449e24c750648546359744410cad256d38c1f1900 +468d9f102a5b9e1fb6aeb0433136bbcd1bb4d2bb7caf5c2761a443b6cdf8e362a7cc1c0ff22829c13e3f08d44f26450b91cb7e9ce76eb06df93da16b59242199d12cb9b10360b8a9115fdf061af8726ce0f9fbbbbf396bdfb630085da04123a3b09bfd6b0c8b68dd686ccf9513c30df501a89d24b86014c58b99de0ba99e1b6068f5e68e0cc6fb99059378b9c93f7fc10c09685652df3e71a3375333ebff0a2832d38b67aba8801c7f32f0a4a653fd1cc9940e7d572502fb8b2d1554afb408d08512c88b547d36fed91cdef6a762d64e969bde9576ddba6ed659336e7c69e499f97ec186f64d1ee340fa869f33bb305de52c5192e50c71cb5dc590f7c6811e79cf463ea7b1eaa8e6b98874d180,04a969459a9f7f8117202b3da04b11696dc5ab844b4e9f28332f444c8a6e9c10,4bfecbc7ed5563a8520ec0bb3436f2bcd6c2b2d9a2d6b3e3f870ad66834e786f1f06a0ea6677ab403e08c355d39e1365c1d8b35fd5ad32681660ec9203c035a301,de8f4fb6f78652c6a28f14f787e90affb0bd21372f62edaeb8ce53bf7b8e7ad910e1163c6949adf1b115b086eced6c5d8416ae139dda51ae4cce2ebbe1ea253000,df93b758f01b46f86bc657df8ad82419ef4fa0d084a31e03c196496add48db1c0968ee8e0feba3f8258abbaa5b33272cb2473797b2fc043fc6ccd791513bbe2d01,c50091a2170d929ece199df7d192b5889f8d1826d689c67db0710f2d20f2ba8e544e73ed92a9b01e2fd2234e115b5b4806fc41b421b783a2a8632f7e74db445300,d8c2fdea96fa0848c8370834fe21ad42ab5d5f243c1d3c758ea8168dc11c064d3c077974b735ec7203380792c4375842e610c32a8af91046a0161daa2fb009ba00 +562635cf47450bcf646e78d68f16d1b2d68fc5d52a6ff220eb62f75b8b977a8b5349aeb6afb246d4ad8f759ad8d2515c55a16eee53a8dbb1951bc65a9fe85b46b338592987b7db08c83ef661fd8a11667f58184f36c4083f7850b3ab639d7661419306dfeccf166b9f22bf1b3a1a4b0f97b9914bb4eb4ed1e309a8c8270e388169f1a27649ae6b5c40eed0bb44c992584348e1717993c6b04a6232cd42689e18eb735d19f5331371ae7dc4b5eb7b7f0ebc68a61186b3f4af65e293aab03b02f450b699cb5cdc091044a199c1b415441b861a5835ad9dba44bc28ea946c95f0fe3a000ef892dc6ba2ff347a9ae6959126727ff72ecdb0a4140e01bd48b885e5fe80c2962e2eaed5754af98bb438,338d7471d7783f845da7ea7af1a6b6ef0b4b1f47d014876b4b850130156e0836,c1050fdd17a14e2bf0f240f0e86ed0cb0c2fd649b775dd550373d8200061b2652b85bfd1c5cd9f79f447c1734035f8ce656c6ef671cf71f9867f00c1b81ad38b00,630221340c268d2f6f2270bf8a99a46ef6e10ec3925d3d8010966467459fbb0c0554e43d8ef589398362dc9615b66621230bcf09b25850654771122231bac0e801,9183e0e5b0bbef42734705d7a8289a2ae7087e286fca0ae6d93cac5186cd02026bef49df820db02eddb0a3443d37acb0e2b592fa5ef0c08b7e59bb4c531a67f401,4d0c9b234149b8de7809bb1d219503e8f8ed9b4c4b48122f5cb09ee84bf9696c1bd7e0fb39b77a42fe3bee4615b0a628e1cd75e8471c2c3398fa2167b45743c501,0a5f872202b5199f32ccb36e30c05111691d7fc95763d36dc281ad04baf1abee7f5472b2b1d9d1ca1d820fe0a90289dabb416f8c30d6154de40d5d44131d90e000 +3720674b26ba6b2b6b7cf6f9065bec59615bb8972d7b55d5c18e1b3770aee5c2c5142b71b1569f2d1e675409df1156a0e0b4d0fade7cffd605d47d1a72e7275d6ab153ad4f857a4b34e64126f41d7cc394cc13d802bf23c33edb5a12afb06960861f6cbfd1a215b6256e106c2744d465e0cab829f03d79f1ec89e6393ea914d80331c14abdb0e514287771a9c3e8343964bbde1e713b9bcad8de6c6b0a4d92d10aaf2734d7ca9244550ff502782450e479a73c8f3f00ca83a0583cbe8f40b2239da280d07bd078c62253f9b3a8c64e0b2dfe651edc59629488c2105c196f0f5ca5b05a42cb1254a6c6a4f7bf6eb0976a4045247437a1fb342989ce4c76514cad3272e5456281796c3784441293,75ec5225ffe8fa621e6e707a5379ee06aebdd0d89266b338b0388e02f38a5e71,da7788c54ba37b83e7b82c5efe17b1c8740b2261b452cddfc87b357bc2369fc90dc9099b9cb1478636e673a5a8ae6ef1623f017f47529ddec1a8a9d8f273a0ce00,3097ec2ed256891ab4f4d44fb8ba4923c17f92c4365695b53c06d7c894972f555a091fc1a0005c656637f4e3da96eb5504f0c401e42f65963c55903f9499e2f700,8a4e11882c31e4c58ba1a494c285fadd3157474688e64da3d079e6209d8ff1970692efda9a590609815337f5bd64124dc9bd5326ea9f64d1866fe3b90a72a68e01,5fae70c46ad5862ebc871d0745f9b26c5f5a56bc8ac29766e3b54958fba2f59a634e01de79e55a4d39dbcbdebe09be943ae818c722330801a10041e6a1f8bb6c01,4ecac4be513b058740ecc186d21b996b898514dd3bfca6e8d2575cd0e946f65f76056cf1786d4afe7d3459b0c83a0e6e747dc5612382aee8414ade07c2334dc901 +6b0896774742be37953c97895f9a41d6513bad4ab40884b5bbabce4b53c3f8d6dad866fc9774bfe7f66a0e6a016b71853f5b0e7dc63749069ec355e742c29d35bf35d11e769faa4e95a6f120aa9bfbee38f41bb8006fc69543d8cb67c3776a0c7ac171221040735ec068c6e91ecf70dc2463ba164bb698e11d621ddf29c0a2edbc7ba5b6dc360f2623aedb27a400b92a7f3fe6fdda93f20b2465e5a8bb441511cfa94202181802e5e17fa19ef83d2347996c988969e71827eb28ac51b5c53755a5bbb267bf4c27620481ad75335d9be69641b95491db937573c2164f4eb6df2a48d689d555362bc6b692a010be98e6b1f97de20eb1f94d6e9f222cc8db47a01d3f221bcc60e79ce58929fb6893,bbc769b1aa93c498d06553acf06e75672994daaac9c348337ef8e6c25a54dc4f,583ef8ffbaf78411d6d5741d6ca20bb86aa183958e10095329b275dd92617e1e763eaeb9ae5461795a7787ea099be7e83761840c8e646b842da0c6594d58aa7300,68a47d884af24b3648a21f0d5b700cf882ecb168da816f931f5d5596bd0da0b9312f451dc79ddd15633c65bff17ccbd6877a3b292e47f28bbfa0000c67b1f30401,ae7b8ac155a4852658f53c53a7c11b050b99b1d4e2c431c6379c886326708f8d08290076069ad03b45944ace7ffcfb9c7ff80f34ca7161877af54cbaef4f3c1401,8b7025d1775437776a127dbee0e580c829e845768d692d081f2afc17dced5db72a798ec79fe76199e281146d74bbcd879695a5bcc962b493e9a6c451107f4cdd00,5d2e654ad53c3c37a2b33c3c00a683f28fa27708443dd95dbb1dfdebdd6178ab1b5ee629766c16c573b92cf7a9baeed6536f28a65186e025226d2b7ce4813a2c00 +efd8eb4fa9f5d34c08129db30235aed6d0ee44154ffe1f9d14d6e0303648ff63046254fb9cb842862c7f93f8ee8749cb29190de5e91e7627bb9cf83f925b870641b8af92dce714eb031018c0e2755a7af7dc70991dbae5c6ecde985a2b517054287cffc4eaead7c9425709fdb76de215aaed31624ad0ad9eb58ce98526838a51cc4485f939b23206aec887e57609c40345a869b8ef4ca268b04438214436608c99240dc94d8161bb9ee68cf9e07ea50a377891767d82fcb5f8d988315d4cc124ec605b73d3829db7d6e80f49155dd7799593fe09ab682b7bbd7468c1c2c69dd49f10c13fbe67d2735f1511cd4ee8ed5d7c9e02b6be0330e049855d5e61a81d33bd1d1808d501d69561c78dc5fc,258d71b58ad64b6b517fce4e2f27f77af8fafdea2eaaaa1dc443037aa609dd0b,7847fb0601b475f6816142c6f5ec66c9efe7f88646b647a5dace3c5876ca18885f9617652a9085ce064f9f3aa5de851dcab481866d22273cc892b7b73014139e00,47ca9c3b4feed199811cb2569a26d204edd6ce48f66c46d9d3b1f81138fa569b7bfc2c5e097ea600697c27457eb26c5942f5a7405bc048717ae0693ee146de9a00,4c0f22ec233f06cebcf093ef327fae58834f49023addd63b1fb09b100c2495304cbc506384ebcf10981d3505dcbcf4d4d0aa483e17aa5a85f840fad45721902001,12760c45e6f999c71f3e504be4806edb86de6cc1baebe6300d89839d8a7f28eb241c795a5135d85d434e88f11657b4ec20592241eec86e9a6fb3f7a7047448ae01,27481897f6cd84418e512ec76872d225264aa6d2c5d544458579ad1d863f9866647591cdcf65e453a0d9ef61a4c6871ee3d584c02d693220b75a552dd782604a01 +4d6a856743e6ae4b3398885ac56b5b9724dbd46bb324d8f68c2cd789a205336bb386935cb397d7ac830da19c34ab17258405b48ede8e2e2a00608118b49fe7794ccb740ec022fe59ea0d0271d52c74fc20cc775006afd8bc182fd9904c01852b1aece5e02c6325c2b921c0a51e20af7a38d727027b2f62c0fa60623c7b0ba891655715c489e7d759764bb921128cda8e2c6e01804ed819a9cd9abe58908f3d4683dbbfb411ad9dc70016e66df85e867d0bc4bb72fdced9d1bf8b4b54d1b0348d55a473d6c813b51f86ca3bfcfe26f185d7cb91e853df7f2882c97e8d03b8eb6aba11ae16ab3c7c23ee4405e49c3918c6323e8535c52a6ad58e1363d3eaeb3018fd0ad1728edb817b2471d28e74,de7dc301fb176f818af09b43b44c8656c121bfdf8d4aa6e7a06bb7e7b863602f,1de8ebb7d67c1afb53db098b400783b4b596a3205fb8bc8b02846b93370bf04b4eb3df551bb13fc8ccca8d742b9aa2d96e41d333b7ca562c446e63014e9de0ab01,57f3018c7e8749bef57aaacf17b60a23dc48dce9380ae14d1a338d86296b71587354714c20cd688b648fea977c40d7b3af54437125f3fd84469bbfaa956b213601,793e6c9bd05eeb79252f103baeea770305a549fd1eba51ca300dc09ce2c389246556b26fe62764dda1ded3c852e5110efd967fce244ab3f4708987d9c1cfc7ae01,fede0337f1bb5bd06eab5380cb0b794ee2c00a1bde69322f4972ed4a4b2764a5127e1260e85eca33fade654684d9dabb04ad8256780afaa50e27240f755b6b5a01,f05b76c14085184f1d7bdd95dc6b6b3eac8f43391289666ac97f7b1110cb6877486c476f0205aa11297428473feb2757058135f0e1f83cf655884db6a523c7bb01 +adec8e011f06c6eb49e0c650e3496eda3331d43a2ff07c6a57e7d3dcfc7b02d4d950c39923efc74ea7cd47ee12d77ec49eda83c7e65be5da6f4cbbd287ed45f59c5be5cc4230f6837e069eb90fd3ab86c43b17fa3d1a282e16f26ea3fbacd90d757953365bd4ef87ac22f738913646bd7399ec27e0ceaec382c2f2a9281c6ca89cf637746965cc0a8b6638bd5efdb4fa75124436859a071abd8eb74d5ab965b97bef0844b7a0aad0bb08b1c3a7beb589402b56a342a94015938fee7a580a30644d527a3c7466dde0745416fc9ecfcd24f7318d1deb91c7873d282f46de2060a0feb1922c222e622b78e1cc2670d22d2c659318fd1a9034b11f17915fd5caa1b584f1eb5395864de73f55819e82,611ed73dece47584a30dee1ace767648921ba6b93d1e476b2f057940c14a0a9a,c0608c1f12f7926f5248ad2464228fb64c39dc3685fef15313a30e8635c885f2131b0d82a3dc35563d5874efbf7cf29f69b3c9b5b1eebb7474c2d6c6feaf772400,1c0008aff1aa5ea48a04f5133f25cae1c08ed9ab43c2f9286d6afe66883a28043592e408b6b93c62b04920d21622229fb3d5b4af4ad1a6a37d6f130d6d82f33501,e8010964929946a8f66f0bfc324722f6d96568fbdf027883b88d0ac93e96d0e9451bf5728aae9732fb63cbdfd6f020c57613179d03bf9150b5c4d134ed74a58001,f47078b528674d1d4aa4e36ab03b2f2fe9dddd61488cd3d4cf4ede4762ad3cdd5c5ce683adb521454da128919909b08ade349a2e86a21ed1158d8af8a6b6e45e00,60b274bd82e0bd82f457ac34ffc0aed012fd7fb6d4839761372fbf2d58f2b5453e67767b60239e0459ced7ad1eec2158d33a4f2f663806fa75163d0c3d9ddf4d01 +70bc63588b72dd75d47af3912195c354d460157c31bc3a3435c8b139b864e1bc17b60f195e2a8b2a218c2f459c9d7c7a32871f90c3994f05afdbf9b7e0c006ba7e6f9d07334b34227b14dcb820a43606db53395c637f9927540fd8c78ea5aeffd615241bdf6baea16f1de036b768e07662dc2d92260d421146ee81860204a88eaf3fed277101b76cdb6c20dd1b47968a2f85fbfb3a4b52b8e9a80fc5498b5621e9e5f38d57b1bf575779414a21877b4cecad9e741e99eb62b6fb1653c7d80f7dcbb3e8a0a88529b5ea9545c85c95a801f961b2d3ccb961ef2e15254804b6cc353e13a2719dae3465e8c7ee8db24adb1a62163535ec0f49a88e24d98f9a70f0f714bfa9bbe540f886b07f83e360c9,146bbf53806a0a48e553ff5efbb1be67231767c6b7c4c6eb5ced8d844af6c21b,372eacb9c3c965fca8dd34184ed89d5c16d668f8399ae1ae39c6dd74bef595bf72b1c970f82434e6fe9b9377731ea004b5076f7b84627978fc109fe0ef390a2901,fed204315bcec3f4f1001850acf0974871396c14e42ce8bb17492f31041e0d9c062a718eb26d362fbfbb65b7f40d8f5a4b5ac947fec6c9acde931e359c9be26400,fb0351dfa452eb30379b4e6d0eb8e35c0a56e8816f366d520fdc1feeaa0ac10c5b99c88e81e2ffb7b2fe1279777e64437a6c6e2b396659ab4722be162597640e01,065fdadfe1143de756cd7df710eaeea56befcf013df5e4491b4fa4d6d35815340f111fca153520c93dfbe18f5c724126b6df9f5e7c97f8f9eb9d25b1ccc4569100,d63d8e503f26a27380133e4340f039d6b17518722a435997a492812e3b1916744cf7b68b6e60d035da3ff0447185847cc0212ca948c227e12025a558bea4513401 +142746922fdb7e820846e890eb8249da5aad8137439bcb76b939933f886086bcce2af57e10df1009e9fca72b7680306c0e95125cea74b0cc9a2b98866965439e1e6cc44d4bad2969ee56a9e15523347149786c4ba3a34e75e53d1bd5284def19f2f75c36230ec10f239023e48028e00ae4a130f908893cddf57b5d535f8fc4397d02561c052748a296bd42fa81ec87d617b33ef205ad28ec08eb08345c07cda92ebdb252c30ff8c1fc3926c75924c0edf75a2d6a1ad69b6a20b356a679f9b1ce2f55d242084b415b5ea0aac012dda3e72cc188242743a044829beb34eee253aa286e7ca9f7d55a658eebd00b82e454428c8977baa99868d345554debf8622f7e0c1359371781793ffbbfc7853791,1f2c102b4fcfd22587e54887d72dd2820e592559c220d10c41832d6bfcf81d8f,92c1cc7550a6fb80e4976be5cd744d5de24d594436668bb6e15ba89715775d90712c3dd3807ca875e9226137f0ca37af0c88d27b7764a68231d7770527d005a400,430f53d29cd2bb8f5c0d78c5f08743dbbb3f64fc8d7e188aa36c2379c8b3efc32c6d16ad2fb2bd472f2f431de92afed7fd4d4cce085a68a22c95a7be8cdbc47e01,c4d18db8c8856387fb756b7c3302806d93fb963c002a02c40d86f8ee69524d5672bfde94bd15b175801e29000b10ab98bb98633d6896427ac34e3b25562cfe8701,e6f2d00fe87b669bbabf676116e934c2306467c0ec430f34567ef1780cd788eb41a62edd95afe0948803c2cea4513992579f45143afd1abb62fa4ad94045dba701,e705afb9bc9dd4279971b5926633eb0ec59cba8c1e36ea975352e6ea346049c57d4d1f84185828dd299a8a5da18c516956ccf6ae36616762b56b3538eedd5b9000 +fe49769a4714c363ca67cbddae585f960a536ac126113bcbee2004a657391702d9db410fad4befed8a17a653a957173b4b09f8bb8d1f442b012ee576cc35e0bc50a0e694f50f3f6e711a7f926d7dbfba815b6ebfa7654a25ee1dfe76736cc28fafee812467c44aabc6bf9b9cfe365f994c7255c9c5c28c451d39ad89ce78e69d0793f6a8bb4f107fb76bed630ec72bf27feff8b0dce8f745849f771b17c3f82a7ea87707804673e25302c4951b0caaf95cbc5e5051574b5585edb3748bfea7dc0efde3b14942a7041913b46c0998bf202fdee9b85e09e476dc28f391fcad9da9c51e00673208570529716246ae6684419fb55548318f6234b72cfe43c736ae50d7aeb85dc9052be594f1c8e2d23b,22c9fc9b5bd7e0b4635ef169f384075aa0befd81028986d9efa54572c8e4f029,5363deba2508e9f0bdf72b7f1a2e888ee961b7585de4ba652df91938639cfcb36e37539900e8a9b3974dd4fa07ffbc53852f247258194491dc9af56f8a207ed901,4962abd066fed0a77afbcb2e522c66e86404923a345cee20837170e88dfc1cdf3c82391016bcc86a3bac754f7dfe4e5c4c73353ba1416997b7016233e8402dbf00,96d670d25b824136d3fc435ae292a6d3e365369baa9d4c605080ef08b4082f683d39138810e7f5088ac24df17098c0de182739f634cbd6bbfdcc5838b2a97c2400,409c60052da6e8cc30867fd49b3e6c6d4722ffa01351fc96a22356338b8e81bd5413a51ad3ad9612f0844a8ec413875700d72065dec7119c8e0145e7572ed32d01,73c9ea65e25103ec7a9c41f3b2072c082fcec22a23440df5869f85c44d7532eb0a0c428787abbe4f40f819d0ab3e52b6dbb5665b281febcd83253d9b6061f92800 +b6fc95cec9b1ad0dc1319d1b3194c35422f5bd808739a4d7a993bbdc3d5bb57255ec79424ae37ad28a5f8602f5c8ecc9f22f72d086e9773cdaf626b8237efc2c6ae175e15e5a8e4e47e605a40124f7bc0603ebdffd82ec22833867beeccd30beb440b4d91cb6673365e24d9b70088b2120edeb460b8ed006825961448ba7339f3cd76def62308dc91666010e0685fa55ba9d0962b7f9036703d5f822b3cfd870ee8a45668cc3a6883ade956051104e5101ef9d54c9dfcb312b2ed09acd6f072bfe88116ee0cc2ea326d33579803947c122a0af479b7d74a9b39d0fe0555166c31be26c7b142c6009fa579face4794f7bc064d1701fb3571566e4e9257fdfc85222b5db1282e85bed02262f5dde95,70eb1c67c2ab54aa21dbaa29ecefc9f4e536c8a7039ba8f709cc27579a646610,640ae998e24dee61d5552449219ad93d5bcf9f2b55b5dfdd13890615d2fe3b8e5b4fbcc269dc41f9890eddd36913dbbfa8927ce26b1a0c2a541949fd012bb7fb01,922817b8db3943a037bd05d49d98e2b8e0f9297172ea2a12ec64b67edb241d0b25ae9877c31d99ec99b26003e45a1779c6b36ff996c3746fb09de113d2eee31e01,3ea1e2910b82ff55a39aa2c15d9f955321ddb93e9ffe818baa1e4fcd4521a91f61d9f9a8e90f966a62703f16e7361247022b862be330b6601938de83a473736801,f1cc1c5523b04bea10c3ce379368697ca9b388d8a0e031a8ea9ddb60c8e44467504a65f3e1d018d6c962be4d2b58ab35fec058dc1d82848e4a37dea966c4696500,e0b507aaa5086f8a8cdc4bd35e1331266f63f71e03e2eeea86dd06549d4056b37ff35b5d1c8e52804087db4ec089fca3c603e8778d1922a9ae99855a1e12d31b00 +831a6b55ee5c43c56fafbc404b35b6e582bc00161d90bb45b8037648c280361e0dfbe733f5c4545e0c89dc5cb6c474035dd51ab56c4cfcf1ef6c2f16835e0cc6c8e5940c308e907a3c2a323e2841e5c4cb3d8bcefa95fab15fe44ee27e96fa2ab6f53356ae744b86d0e3721b44a61c552be43f447445dec4bbbc2294acd9ae471100769877e255946db35dcec12287c55ce7340bf5569fda53128ccff1d28f24adeb1b1f64377df98d466c9506ae13a44928e6bb853247a5ae8a8dca2b57f1a688b56fe4ba23f4948b07bd9e3a6415b2ab3dfc1d8dc22089ee842851238bf551e055a00de3c8d0782dd2196f5a6b88c3e32e35e2e2d3d94d4b0d2c2e3b0391fcf12ddc4acff1199225c8964b4003,4d6adecf88a5e6e96be90317d54569a263225a69eda4ed2b3ed032d72c21fac4,b82e8febed56aee4f3813d660fdbafb3c29974dafb54e4f9b8c5ff574f10518c02b988592c5505009b77a98a74bf2a629390d5e221f62d49e608affc359e8e2b00,604a8b75a9887e3e016f2b4ed1db5e55dc1ec3242f0145cc587c83b0ef3280d71bdb2231dce86de667d2e9b1b545da24833f78791588f72b4132cfb32604894600,7ed12abe7daf993e9ff3f45d8871717cd4ce9fb30d36c749e88a5702b4b30e5a1e65cee9243701dd9e1d350b3a7b0c6200bcae607ebde3c4862cc31d58f31c9a01,302c065851a1e1e19adb67d8ee31908300711631200ca0f9567d61872040dfa43cc6255eb241058f4dbc710826e6a8b49d40aa2ab42b9238552df399f73fafd600,4dfb774fec5d6e01127f2deab50826e8c91697baa4f0c68e7975e491ee20bb372c730fe5e7221d64ab7eff4f91488c3114c82a03eb82b965a353c8b4b005d05501 +8ef2db6f7c3cf7e75962a338b6a170895c7795381a83ff3e6e3913dd3a0eb0e64350b95cb65f5410f2bdfa861fdff63e62844651c046af47bdf3cc6481c49928eeaa7a0c751c1013249a737b70aa677744faa65306e54830749b691ced11387ed560f631974c2a7eaf348972c2e1a2d5ae9740eea049aeeb01b4090df92ab8e948794007e6bc008da16b5dfed4fecd5056f302d6b720909338a24230a28ad5e963b8cfba99fe161ad598e3739952f139d21c78de0d161f0fc6afec833381ef4dc29e3a48633381fee43d3d9033a12baadfb27e5bc7f93b4544121ddffaf132f890b17aaf9701ae240d0f5c1815b40b5516579ea19dd16160ed329643e3f94b412fcec5763258a29106ff3d697053,2757a33de0e2677e5b02a4f38561a6d431660c4cb461ce0731adebd30f2b0ff0,5fc2591845a424f39e0a845d292accea7e4cbf470c6cf17e3bd1f6340874d51b173fdd53c340e1090448c7eba678d0f50ddc11b0ee5e66fd7769d12249a2da4600,1cff112dab249b4419d68450b91dc86ca5ca0450d50189231cae4620abbcd80c62e2e7f707504eaf9de7eb555e02654174bed2ed0c8efa48ea36d80d2e99448300,ecea6d35d7865cc2bbccb16c637442994f5260f1e97299761c7990c7f9f30c3b7aedd4c96ec68d21ec1371dccc5e3eda924827199cc2bc0ae0ea0b4164801dc701,604c736bf56201557d0f6e4ca8b050f01edfd51669f73d2f5bc49bfb6ff001df24a10311a06d17c13961842de96e4163b9429ab9349353d9923db4a5753ee76300,1aa626f696452166f2789847ede6e5097e9b48252bb464f6afb15a11f4d426eb66f3035d9edac1014c16ae6856a7135a87cffd1c6463a845338dadadc006507200 +f6c729a373bc86c9745acfd240b2a3b0de6b34cdc8ff8a7006781c31103b76193fbd997659f0f72b0234f0497368560f49e8ffada9c9f325a24871580b1ca9c5bc10cdb8a12c362bdce0ecd6e6cf4fec2ffbf3dbbfa283c88ce73450c96d4b725473e7d2a4a23b48655224e487862143e982540178aa41b1179aacf54b2c12f7f29f585a757863746e03f115191159275c618c9333d849354fe735363d039de209f1a38da8fb0e43bd205e4c2a5e52812002a68985246a7e0e5a1e961b5fc85182340efbd573afd28d9a0b9bb3fee1a2f23e2331e42b664329e17ea8f69ea268ebbc2af703588b53faf0afee2636b908a7613303e8bf30c5b1d4908115d544339fd083751442b3fc7279b05c7956,e814694fe23a81cb5ddfed45910a37c125119c8c9146079c54b036a330a50fa2,79ad5d810b52121e2b9d245aa2ea2788386e5270d515573a53459d0a2b9c9de005d14ce5cb1db5b849a50955b2de15741c1e5c98b92ead14ad592b4a6171155200,f33e71db68e601d33e21d05bf8808957e0d1b4535ef83ea94ec4ba72f4e661400977c3281f9ba0c2749ccc0c80463f61bc53ca8f09e0a974a86695a799e5ed8401,37a470399a0ed1e496e7aa55596dde58cee07b49a3ec764332b1b69f57a0dcfe44504a91cfd9805787b470e05a5fe61a865b1e4b2df2fa618adcd7d217a3b2a401,2560d5a2f521ffa08369d97cb9138ce30fc4ed3024b0297294c3ad9c4f1416d211dc4d372461bd85b1cb9e220874579df100443f212d4de4ce55b0dd795b999100,e95b32b99ee47566f5b55279d155ddc4f651d9f9dd0d89893bb7105c03fc08e3116c61da11d6f3aa83a1e33a4421656c0aab88e3741178f6832a617aa7415fc901 +d31bcdbce0efd384ae4f47f6958ff12477826f359b5742f2678dad90987e97029fc7681a5282fe7e66a3eb92052e47253a9dc49778786342509a3440754b55b807e6bf0e39487427feedadaf0c12de59bef51176def2f1765b5e48007916a75930d713a59039c184c6c5076996b7073b04acd17b460fa614dfaac5a9d903d97ab1f5a46dee28a8f525145a33f20f3ed8f9a240022439ccc11ff056162ee520ee267f988fce5f759c28eb4a98c271fef3a88e4ae2c919db74d67bbad4d13b492c36ced00ad3c1709cb339c423feb9f4a6970e30ac0b8136189725d1ba491322ce825dfe5bb8cbb1ec015b70a56c7eb4ba10b8280a88dbf5f8a526a34c20c9c012b6df63a7aedd861a4e3a1d916f69,c0c918ed492955c5431dc68109507e1c80623e448691c6220097ecd5aae0e446,fafbc2f2a5483c228044b2e2ef0f5ceb2ef75039b7428ccba1a1c4a22aca8da42c2d8c4b53368cdb1127fffcd6393ed4293954413abf8971b5a28b470d0e7d4300,00e7e6dd776b6baa4b1f139e0886146c0708d1e72af64d16000583a0fb76f4d26d65df251f53afd7be595303168d64417e8efb2211aeea3527d542fe9b8fb9c701,4bfe544790f6f113772caa3e14e9ce4172d9e288f752e5c872cc53dc2bf6315025321de642f7445b955b1ba69a7a0fe1be9791757db1b74cb36cc776b417acd901,9ed09d47e1da769d238957080ae1531d9d37bd4c189ffbdba61b5335640beb362b78c3023787e3ae97184977ef607fbb62115291cab7cfe3cd5e6fc9d380207801,62be754233eac1404e98f11db34f14c03df77de502af600e913f518369f5417123619918395e15e413658c175ee45f8988e28090290d614728fdcde932a00da201 +8b05d0d67a2d476cdca09edf2e058552b45ce79ecfc6d9fb0717d4f5d2db459499b99aff421417db75395d30a44206f8f00f6ee763cd95b6d24b8bd87e17b40472ece27bcf2a31ec661226116e76d8d63ef585b189b17b5d38e188b59037701efbfc0ad95648428e2d021f1e2fd736d2506458eac8858f4f0bd425a7bb9f28e98fd741b6f04af3a4efcf6aad258ae1abdcc4cbfdd1257f73a112876dc7c353c940e9c420ee562aba8ea1de83d0cef95a9f5e99948ffb76a50090e7627e132f9f9a7ea75a9f36506bcd672d4f07b7083a36106cb0c2f12495cca0663f23825bef81f862efbfea87ae731a5108a65bf399327c864c3a23e0c3adeff49fff944561df273c76f9fc9bc99a6bd3924ae3,cd01feb69b962dbeb0cb8256d57b5cd70847a9b5c413d88c462db3e7e1274457,4e27f98ff56e66ad52d59d689c04b692f4a3378a133ee833d90cf50d2f39ef574fa3c8f077f5f6f5d6cf1d3434fcfc6e8441100fd7ce09c577964d347078810901,b3151f030dcea32761509b4eb260ff3e31ecd634c2d0edbe350abbd16b46229f1ee524a786d8e6d6a9cff8efee37c17c1b6d854a75ce1579d347ba190bb8e35e00,d4c27faa58bf47c9cdd6db287d0bcf444cc3cfa3c045385c8f3daecbee00a8b9690a2d87192088e8206cbc136ee7773216171e9eb77ea001d6d079db4d1161d400,9be8119f810acc9ecae5d846f5090460eb8183f2f4aa5822052fc30941aff1c32382d0b9eab00955e58618e27d8497d840b4dd27b67fdc0a7e3caabb6ce9286a00,9a54dd13b7e79cb853deb3a845171b21d7a6e81467ba17adc0f15cb83e31e329501de0b929dc62129a03c3d5a40d37e1a032a11cba8507060487af7b288a19d201 +82977d779d22b217a6f69ea678dbbbf5382dcb514ff128a49ecf636b5638d09159e5fda06ef918c2fd896a6ac1ee3285677d17644a7c29746eac5f1962210819c6a5709bf7cf0d77d7c5689c743d87607db0710c831dc55f9b5a1ed6dfd4ef9bbfce304c4d2b304145384cbefb8f63b8b0f587b46a32ae05501cff0a76646c95b6bf25ba7009ea82924c519dcbe1c556faaf4924bd0576b6d5e8e17a2ad48e2e386872c0027f83a211ede203029e81a6ee6f1018feedefdf0d2230266db4653c1ced2fe60c8c36b3c2cdd5408a368e00b6958ea006d445d26ef86ade0a30f8504b2146b3c56688cd71402b83f5006939b7bed77fa8c9aa39210d451c822306094447bbdbf5a9bbea19b60aa0110e,1e366012f6fec5466c7cea3b9210021ccabf472dcface6adfd9a8df929820353,571c30f6e3d68f63159d07913bae35b5df9fa25091b32a05506b7ac310afc4e0619b77ee2406a53b2afbade14b443080c9d8eb5b8d2ddcc5395a2e7a5deb877701,efa749c4211c449be4c5f0e6c11b6c77cabca8234d6ab15f5629e00bd54b7d750248695a604924346f868eb243e1e3bd44f0865b76293b5adf1eee3e1cd5742801,dfdcb52801ac897ff9b1c9f37777b08d627e4af85d92aa65d43b0bfb259e8c955744d12bd73a9c4669a6c23ae78aab253d9ab6f7f30756c79e0abd56709f4fec00,6cb4c195d5dba6207fbb3a78b6f7e1487ed619f15aaddade35abc939a5c05c0116a40e38b5ec3c71c486ac10db74269825890a3489154821eb0110fcaf90b7cc00,a49dfb95da41e0f32fe054acd3f25eb69d0ec535b6b487cafb545a78a3fc0ab91b1c25c563e5d20525505a2e3e239ca943d8303244939ea649547f4641f6659101 +1dbb92d2dd802f98cb821b1f63a6087d82a4ce068d655a10a90caccf97bde84df0c23f4f8ed10739503a0e13e944adfda8746cb3101a86a60cf50b5b8e83c74c15591cba47df5f23a0866ebf856916927422f22170b12123d29440dc3b0bcb8488a1b9bb47c3ab444934ef6440efcff9b1515d27f2a2786b179feaf3eed28629e5b1acc55d5e278ad00ffd96ea8eb275de706ce3db1ea4e43778912d51b36cb5fe04b21db1951346f950e4e700f762c2c9ada49da67248f8d180d11f6c0c000a46b07f5dc2e7a65aa322cd953e2f5424c9d8b695674a7f31c8c05ba418b0173c8dd47c7a975c9770bc13b2eaceb2542272b49bf959267506bf53b42b530b8d4a3c8b0ec9ee3527a6c433d7f758144c,d8c58fabf37c26cd8ed02638d59a907bf93a5663a45e06eea10fdd67a67f07cb,f4f5e48fbdb32263a33c6895b2d7ef6a0508c574ac9df0ef68f21065b170facd1f6195f1eae019f6650b4ba9bbbe523a01f1a289c8b5c6b31962cc5f9b5fbe9201,8c0b9270181815f8c5d3e2c4070303e4b2dde316c65d03d23f18c96c0c68689c7b317dac50f7165ddc3b0466902d61009784fd2bd3db78d4dbefa36a07a733dd00,dbc6409bc8fe60f7c48e5d5e9c3d9f4203decb1157bc72656825f43505a953d57ab4454bf4dfbd50fd9152bc3e973f00f2d442fc2be1e2f8c703930a9e58398f01,c1bce68da90d33607e7e6bf84e63020f49532652cb90cf301a9053e6bfc457e708c8997544c18d79f55009d28d1191c4d057eb3db986a289729a9d4dbca3257100,05f80f41fed84b4bc2c5c25fcbf15a8211c9318fdd5626c13c48bbfe6a9a52e0298b55348e07be04c6a4fbb7f16f74ea34aea471a3069219a5cdc42795497dc300 +50d34ad13cb1101ecc0fe8c93dbc10682701eded8a55ff72d2c521104802c5f10666587f0a2db0048be4edd74ac500d94d9ad9d4ad122d7662668ec31f18632dd78e66c44702f3b10accd860a4abf04ebdb170be8eafb066d2cfac65c4f42eebaa082d44b9eba67785c350062f6715b49c9cd8c4e678956d4795d66b9ae24e0332f2e906744deea5e1d373e2515d24ae9f72474b1f2f4c5f88f4bbf088f6d40bf72266f91f816d024b694e7dd1c1e6c682f1a19e0916f6ba1ce80b74c0a47a828a192e931d37eff234098a088b7731ff4ef86271731d34de150f962b83971c71d49f0477f3166efab9028e22a0db781bf1eb5ce2175e42ef58249426417a69c9041df1685fcdcd004b13662f7ef662,c367f17329285b28bc0eba70e1d086d29334a959e318f398c50b24c00bee5f63,5b3c6a82956a469ac45f19d7ba0e19de9cb464b30db22968a51105d8a9ddaff51d14d5623d52408afb4a1375080688554659b397782ac5ad0f1f1ffdf568c79c01,177f12d051494cbba74a059db990d8db56dc9a18922c0b73d3a67e010cd97dcb7ed70184820d5649490493139a0961172f3fc06f2ac19e8bb9ef22907085319301,311845cf5a3e825a0a32b7ff84691964b24b7555bdebacee12231b93de102b24098f3463131a1657cd139beff3310237415c60f495956e85be935bf170f9290900,61986f4e8831339377ca5af3884a69988f111e108b2a9ae4af6e2b4933fcf4620079ce9f2e94fdfe5f373dde19b5f2d0d91b3c5ae4e9c956c46d26d8e41349e100,7acdc513265042cc551f54b8bc71057cd0f7dd79de37c7c8966e94306438a1103cc1b7bbd7bfbc6835b3963033437fa2819236deec8a8875e3c2b8158956411900 +db2e1db5e195c91e052fc149315dc501d94d4e3ea19ee7c2435bf6459ed77f16eb7875d42897afa976ffab89eb980422da88ed81bbee45d2661c0045cfb2b684eeffb6d4c1d536321a2d55519d9a0d3a91f1c9ba3a9b9ff3335c57e5b36c1ff327b3422b2bd356b647c084225381f695bbaef564940d4df0e62b391b80f3ee74fee87f87734fb77b55aaa866e50be9ea60a0967797427b70e3c6b42fc4eeaec94206ad91497caf009a6c62a1f105f0c87f16bc8dee45650bcfeae65b0f8ec574e04c4420bf2af36f3ab31e0bd7afcb66172cd8b91a9a4bba0a240705d77e4b952aa0a17568b9914d1f2fa44cc28543ec7c7abccd5144db8b2d3cabd987f29b6853a1a72706028afd32a25db6766b5b,3c2090fcd8e1ecb65eae6394be80672cfa1961d7b18a074572be54d844933168,3c91da76b39b7c9de49ef15db577b8487afaf6f4cacbf789059232463348839c286c0fc59f335ad783fc3f12be2685ef0418b7bd1d52c0c4db0545ddf2e24bea00,87505f87ab3dc879b4d36853f8571abd65fae53ffe8b31179f166935b47fbd620c2534246f1129180db927411bc7dfca38cfe5b5586a7f4d5276c05f013489c301,dbff6875ed706aa911692b0f2518b37685a323bb1d5a0c96364c92194533ddfd73c5bc0bc483bf9a872b5b09a5c0034287017b1604341b08399764cff10a03af00,459a41ee486a8a7dc574c19e3ab989ee0987e9a2ecc4a3999356543e1029627c117b482ae8aa9e5cab465d4bb7ee65220593793786941383ea5b7b6d55f1f8bf01,dcac606e5ed3fe7eef852b78deb986881c271aa5a441ce710812e102cfc5134c5e07b68399b3ce78b25e56046bc58243a4a79b3d7472973516e1f5ac38183d2b00 +5ab06bc999a6e798487513b62f232fe818245f9f683f78a6fa40fc6328770fe2d9adc26e184052b24979e54d91594be0a1a5f87adc701278a833b06eb248f9f0182abc891dc1cbe976442138f44b608b01ba5e2bc66ea54dde56022674fff61e63ba19fca1ddaedc8a32a7c3ddb06a464e23d76eb4dc6e37b1d37108b654ecbb7a651c9ed6a729de27bba74f0ea91a85d57428ea08399971ed38356c86992aaddc0a54908d47f3ad1d095950e2d19752e6b3ae650f7dea78922cf7f8375b3f5ac25a8448d1d97ba8cdf9eb15e11f3c66aff7dd39d574d6b84020cf310d21ec31f14a13473e424b6bba25e616ea4a2356c63fd771cc44d081f7d67c1b7a47e045d8928b83a424786a661c59728706d9,c8e6265d62ce1b3581e75090dd34f3e247713e9f42f9cf68cb59a35381a6ede2,6a416b9b25a3d9e5784c13412c4dcac7e96151fb3408b0d371cc710ff1c72eab7d4db0b56d2a3f48eac4e860e04d1a29f5830b650d41fd97f74dd6dc178cc26301,e71056e121c36132aa627dfa2eefdf703de806cf6edcb16e53b0ccb1edc846cd0486bafe95e732977828db53f383ddb751295f7964a5d1533404fca9d89451cb01,1e01430d8c5ebba564f5ac1ae59c293ef27cb25303385d89073ed653f5ff28fa323674a3d5951fba415afc45b19ed7cd8815376399a075f67b37f9b0279b891501,61d311df793c304d650fa02b3938109f32701337aa03e7896121cb9e3c1e7adf1d4edf8b5dcd5b92d11b4fb2caa9d9460904c6859ea344ca70ea463439aa76d501,5d53b02fecb9904a927704c3b309215eb7b4632142eca1ced76d6147e805b16c07a61eacc9fc8f278f010d881fe417a09e6967ebedb8aa92caf9dc0e2c0d828000 +7001911d859681a8c2888ad34775a2a19919ae914abffc88d1d4572153c802c2734d4f3bbabc7d9e0b3aa1c0825804dd68748d016ec3305855112ab78a18dc25d5bdbcfaaba75cdac883087791169df706e0a25822c63c3bd4c9a39be6e3611232d41cfb850ef7c55aefdfc5adb62d5ad6f287375d70bd5925973758d3e7901fe58a0c196dd58f15143d74fb43e1cba2236ff0742548d2a78c0d7932c07ee3ef026290a2522c4d5f3666d67f5475162d94e7a739d1fdaca46273d583b464a19233e4c7da8e721b25c28223471e78bb9ceaa326ad702d059381f52d7f613c9f5f674e84f11fb52da5f7114b55b2cf26da99a14d39a5c15cedf184293b0f7858189e17464b3704a3ff7e5fd647f92aad,de83484ec9be7a9fbe27eb8cbf74974839367d1bd50a2760c5463b20bb65032e,5f2a7e1d5d274c4bfa6db60bac6aa27343eb235dbb92fc9f4918147963f63cd10590061e3db850d7abfe0c38e3bbf7af7a9e6d3d62d78d34b77f2ad1ce201bdd00,487fec7289a304bda701d15d947a38e18bdeeadd9be57ddc289661548b4fa8b222c0b8d3d97a8ba6a5915cfb4d52bcc072825272b725b3fd1d2d8c9d721d5f2601,09cf92d1d5e89a879d1d7ac51a1e997d8eee6537c3e274ee1dd7afb53712fbeb4a045ed76131331a61e5417a334b9726578172216d75f34a8b60fe2a89037a6c00,565fd87eb4d955ef49dd178340d3b0bc31800b20393da6bce3b95e79e1a67ff65116892d4cb0a6e7901974568cc0f7f3add42d2668cc070319eeda509e21c38200,881dfaeedb3b4702d049b2e1a1104866359b6818b47f46e9f518a505f1bda59b5d77699e3b6f411f543433dfd0f17b0bb03d4dbf39be68c2fe0b2488458c771101 +24db1d227e3bad8826615691c9848a3d22dc0e63f13f7507cc910a483fa805f6cb2f28f163e871df53ca1361427182d0c26397073395457605dbc38ea2284fcb52b4cf1c6162d35993376bd3260967d4e43f8d930d7b4779ff7c44483f7f812fa71ea1499937778e3b975fe15634874b8001277ea67e1a56f5e22f6790398bd22fe9a1972610b95a5e7abbca4c03fdc4e06c00cea245866cc26fac1572b63e8f8ea3e2ffa3acb291d3416afffd2fe1bd7c1aa42a8e0344c9c675871433305945587927860e2d0f9caf92300174a968dd094bf860540be48bc7c800e1d3804e93b491bc54227f38da359b8958146c78912c0d4ef208a655d5b58c3721630f0a210fd85d2cc65a1daf3fefe529b376a6,a4e0a3a1409f66834f8fe888cc22bcf87fadebd1983b0ed8fff833c6323e3d8d,156f72c0586e8703bcfb1f294198abcc670ac151974c0f1d94f6e8a0b448bde34bbe8088ab4c20f329d5da1b092fea1e870f9007ffda7fefe9d1bfdde503087e01,10cfd94dcd71b67da69b3d02a5c58f7d17b34a64c802d87c907dad5f42bfb9587af7844b6fb71652fd4c03d6e0c218c18884311db3f00a36699640756c1e062f00,454cc0222ef55612b038b44162db92331458908a19fb4684cd69efd0cdb90dab01a68c3c5a46a81d229d0ad1ffe2dd8c49d1e34ee4ab9ddfd426dafb5efa327200,00e7e5e754947934f0dfe35a3e913f9644ab0201f89084ee61804e04cc2e75366f526de122f16f21be7c9ad5512d01019f1ec4d9409144147f1e74cefcf5e41100,b9adb99dd9f8f2914eacc58a9e20335c1c1abdff7c3028871d25b2b8c5bb7d4757494ed1ecd1da5cedb1b28e7692d290028c3a559c4eb9757dea5d6f678dcb9901 +e6d21db7dd8a054ba5269c2052d3aaecfda324af5d962c3d4c2552c02c5bd28a2b9715bbb3628a6e92b5e15b2124c305bf2e34f0390202b6b9e75f2051fecd1deee6d98f6c8791558aecbeb9c54628d7519bc86c0ea5d4cd9c40b41286c33e65fa5a4e5400b02dfdafc24e75ab8f1cea7e90495e67e01c2bf37281f4e8a83245fd21e3a80c8816d0be0a1ba1943e831214d0026fcb4e8e382c496ad59263e8cfed421542b1a2bb9dbc6d637153799866bbcf64ed76e4d28bff6d2c5b26bb229bdb4da71b189f8399d7eddef3d9c50867afa36af3fa7a9f26894b6fc181c80dc4f5fa9acf66966e39f8cdbeb84f06fd41709a520b0ad03af7a9aa89cbda1fd1cd8e337a2cd924cf78654658b3e94264,e5b596cfb4e5a7fb665609242c101d4974eac27ee8f61b708327c87db6edb0f6,029a0102d743d05785c5efcb705cfbe60c7ad1b925bbc5e6b8696d222880e5f81d6adf0dbd179b3210e65a20cd37f7c1a2397180001ffca055abf928966586ac01,3625ccae0af770d584a357c7e187efe4d72301d57dffcd3e3fe4c1d2928182c54ad3f193456f3ddf105701992a38989bc1318c5c016c4dc32f6bacca135979ec00,b1a8bb8e97e4e6a318800b2d9765b9c215b2f881c173c720e3af9df9028413ce62f1943314ed58677bf81a8a7c2e1bef9f393dc783e004e9d3614737d7617b9f00,7d4b9a48f0426967c42e274ba8632d97d0962c21bffc1d73f622b061b6d5f60a47ef06f887ef4889a16818e3b9faf4fc60df597f2ee6c7a7e5f477504822e35f00,8d059260d153bdcb3a96e76b51bd38d9cb098852690f89e66fa19604780890df74fa1e30c4c51442a5a7e43b104cf7887742e7459a2723a8d5cc07be1e79cee900 +118f2721b138d5b701798d9c20ac69783413830182b4af637bf7d51e2d6c9343904d675599654a302c41709bc5d83595f9d84619327abbd2bcaee2385fcbd46a1d620106afca2fba40d5a71cae974f6e7a793e6bef5188634858b7053b9bc7215a002bd7d8e3540331cb3a1c2b2180923738e1f69f9f3514a1f0ea9d33d13e5d98fec32e17f85b308c74df48797594040cec1ca4482eeb33c2b4c312ade53e13d0658d07b0c258a522d25224f13c6c7054f912803d027ea9fc669f263c16f4d4602bcf515419a9ece53c419125dfc945556a705495b8ab3e3a2762328587d283ac766878e4ce8aa1455b90f4fb4ed4ee2a53095d19d646d93c66063ed67127e3796a9ac659897e534a595ec85af816,c4e837eca2e8cc05f3e95d6a8ace43f12deb9e81ab0ec9ed09e0b2711f4acc94,aaadc722897c62658e1623968e73d82cc6dea87aa3208af9bd4dbae881aa20ef336481a836426f51271e52eeb359b2c404f1a2742655bdc592bb87b3c094b70801,aa2c73af802578be73e6a38c987bb14e4779ac86209c9fe64cfb5f857c1be18f5f5f57d7049c7517001614b1ad4db15caafd28c43ce277c1ba3023c0da591ddc00,44b7e4217b357ec59a1ae5ac997f2b6aee80dc46b8bcd458e8845cc87e12bca272697a6d01b24507ecc8b65bbfd4a16229bf793dceda5df8144300a638618d0100,823edb22a93a706491f685d5d9295b60450eb76b4ead840f18d75c93f8692a6267504cbeb46a566d1dd15ad352f764e95601a5b46849371066bbec0540ccc90401,f16c80182c6e0c41d84b1878483544713d8da0b2100c7c129039461f32593721376dcbfae74a64e2423f4298cf0701e11eb5b67b072d51c0d9f4fb347b67d11b01 +26d8d703c2e2e0b895b809695a58e6c0f0bf046949c880bf9ce3e47052d03ef9778f095e3901bf03f30d0ac3a1188026169b1d1a4f9fc0028094eef8af2cf76a5ef1a97f0f83eb4eda3b25d0eb6d1e3b0c26dd730799d878a4aaee41717f631d24a19ba1c9b6a0a4f424053146b591013e48260f89d582be2a3fd7f681ad381006951876db327d0eeb0bcc87c0a99f051ddd687f85f706734df302ca54fbabb1a83cad38534a478ed83c3f1ba1ec2880f53c8e50628b1597453d547326c7b757ca5845fd2d6e602d8d224f9b14556067e1a482700006e52232a4a942eb4ba654a3039b643bef23abc8ba9d7d73d1d22fc8073f5dd8dd3e3254828aa410ce92de801176f765e844f73b8a3f381f549c,ba86507a437c3dfe0b869796f64563ae5898b410d56611328506a3b92a7dce74,d1d2def3be150e540001739c120b2b3ed284e1b82d8d71af7a879b1b14d9913403f37bffddbe8c3446716aa248416c8e7c44fb28b176af7971fa7564e928645f01,cea18c61b24b69772b3a66a4a2ec82f32d963335abc51d71f7a1cdde3681b4be1c09550d167b9d8fbdb10a818a3ebf09d45a42e58d53433d9bca93d939a86e4501,07e0bca5b755f875aa2c8f9a8003380b9d1010de77dda3cc21026f0ee135689e306f6d321fee89b232a1bf4abbb07c657cd670ff659864cdd8693c8d051f7b7b01,61b6c18080ad92fea7b5ae4058c87791003dfbb0dda89513f2a82de4cde68f3e1954a03a21bf8221b13a48152cf430c4bbde4f75cc6f5551e806bccad240647d01,d3467bf6469cec1b4498d1f17a07eb1912a7d56f0756441ce20b1ec00c5de0f71b350bd6dfd33a79fb5a2e95ca578b85d608de665bbc691ecee095147b27321a01 +c83663f1705735327b813a89dce1a116409dafd269e3a347c0a93697c9af18d42c05bf968cded723ed08f0fd5a47d14d08c520b2584af1af9511f32d7f199b3bb2c2e3349c4e157353575c84f82215ecdf0c5b08c3674fb688512750e4af3434d5b6cafddab180e1ce5f0320a3248d49febcb2b128ea85a3a9b2fed341057621f0ed9906b0b2c9e058054663d0183b7a5756da9c1d9d939bc47c9d11367285b13626f0e2c2d6cbe57ee3ca076f39dc6b29cf70c47e3cb26a254d32730176f91bd5b004440011667902afd9e88b32e7993f85ec50c342b54edbb87c7dd606176fd080566092e7eb1fefe780e3681547f8ccac0d30bb658d1cc733aac51e4e8114a9f4a54f38eafdcedc05055dab1090,88d64c2c2f90eff3d2307289edc746976046ee48d84a3f69bcf153c4d5946559,7585dbad716b4a0756f354602140549c59b5a0e9f28e256562554c82bbbfb5097736009559e782c0d58bf8d28dc93e215425d1c7b0364562572102a92704742801,437122cfe6445624f331ed405ac43ca35274a1390f48f9525c61c0b29f22d24a14878b0d5f1429a558640cf5eb1b98487959adafc4d9a1e33f3300368797c17c00,ab2cfe81dd1b2b5bbb68be869d47610ea59edac57e706bc8aba798cadf8341c47762e7ddfc92600d33e1295e862c590396872c472f48b4deba20876210668f9301,d1c1dc52cca37b77a38489c7f16597a3fc20d71431c360ea62194c98dd7faba80671f7291cfc06676de60d2398f5887ed12f8f1c529932aba707e33905ef10f401,c4684a759e7ff8f6be6793e7f59687845b0e2b49b915d880f87bff7410250c88631172161c320e43fe95d1a6e4a46cf230c41cb2d47c499190a0ed4ab41c709900 +3f09f36ea7d4e92d9eba556e10a32870ab79ea55c6c40c507f373a6735b6cc578c7e9f13148b3cfffb77268156be66d27966186acff7775d6daccd7bc5ab8da64e63e403a429776386915486c60d922e0aeecf225be09650df626c5ab925c3194c206432ca490e996271e6d9df0c8efa7ffb6a782547ab0d0268798a0d4659513caa3d34bf7056671d104d7db57e78c0b815bff28b94bc524a7f2748c3f3d7dbf6c1b75b4e0309588ceec58d515a2416a4a37c9e3fb581bea5bb551bc7b0245b6510133ca549b6df3bbbd2ee3fdf7667af72e00a5d5d81aa7ebf44435773cf146ef118eeaf8cf677ba8af753b78d0aa8c71743517888fa638bff2c86e4be1d60e97616e00a275033607a0f8a3c6bc4a9,c2caef2570659455fa45024cc37424d4f6adb41ed9b12b4c12d94dc1e85c6149,268ce54bf0dd668c04e1d80912b00cf7f67e7acbc063e7c51016cb3dff4583a669e07a8ea6a8a6c067f2b58b49954e8610d80827b429bc8463e98577e9817ab201,79bf257a4cc2bb68d8f2a501ebae014b8f350fd980c653792521d6634f81364776505599ad97d954cc1e48fddeaadaedc08982dc0ac10a34304d5b53469e78b301,f952f2b352f6fdda696c04646d4c4cedafdfe9bdd75eddec73660a0ba038f23355d16c9abad4c2fc1fdd26df3cd4b806672a53a1d9192e9abbd2fba6d67754c200,03d0897ee7072b038fd44c87b2e918b29703533a38a0456401a8bb5e5930bf832c8a1d83221cdb942db821a548213173f7b845c7573e9a794054bcb9520622f601,990eb4e804e9000d94048c2cedc3555751cadb290703cc71b999b95b92d9ab2d2cafd6098d5bb4089ac3f378d1feca0fd063110361b498e235d11606d60404cc01 +9bfcb7fd4239f0104e7a4d09d9ea5f7a069446502df3a1b9ccb6c4757e3a4b1812a9c6142eeed8366bb691c4cba047cd82114783f8d452ac9ea4d654ad394c4e5b6dd0b198fc17402b7e824b0fcf00419c35f81c8a6a7baebb5a36b982a650faead4dfc2ac60f4591c239f0abb7d47c445a9f842c6e2f4ccac7fa081622f4a4c47079d345342398201bd23782f2c594c1d6e45ecdd2750b44e8725a4fed8fc0dbd00172b389b888db94e44c15dbcd5157ab4929d10f98c148fa0da7e85ccf6579a7355966cb98afc8a515eb800f168e4ba3ff425422d99d509d30f83237ef781a74533af1ea1b3def9a06f5e0faf115f50339d5e2f3fa9daae9b96e1ddcff06e3ab76e232afb50f36f8eecca6757aa25,284e403f496d13f73e18adc18c2e6fd4dc0d249d5e6cf2c33062a192f92cdd20,f97e594245b19e9b2d4638211ca5fdec8ec12e5e7a908572f2f4291e13d70d7c4039acf158c03ecd20180fa1eec143b89158bdffd01ff006d21bfbc7173f99b601,1f8f2055f537e78f112c71a03b8a3c84107675e8d2e0201f7c2094adaed443ae3c6be3ee45c19ecac6a3b21ff9a91673e5ebb6330df12b5014edcb284aa929ee01,b7a053a1b7cf235b09551fcbfcd8f7b0b9ddfd4f4b06d225ef27f7ce0f1ff3f40e4642033e7c91dc34a4bd9220289201ed9cbd0c30558adaa38c0ab9f5882f0601,b4e0b42db540d59edc62765a73eb5cf965819c46bee5294aac71785d6ec40788312a2d41f1de8e885a490dcdf9f38b35f5ed5228375cbfd5f512e21d9bd464c300,7462e64da46083d3063d3f2aeb94a820589af8f37b9f35422a0017c8a6f721972c522001ee522e56d75f32205dd2bad9e3d6aca083c366b89ec34cc83890d1e601 +ea2d3778ad0eb51eda4d92d779c7ccab9a4ba421df88cfcb6bc6264d4984b5adfd231cf7d72db549df409f8b66f0dd0fbac54f1912fce4d35ca8677536e1d65419ad887c4a4d358f2e0cdee293e8a56a1679399db44a0a0574c90e374b0c3bc386796307e6743165caed4bc11b2078242646de20da1ed0676048881d2f3edf407fa1ddc6dfb0f1d4c65544705fa72bd552a3a9aef8d032a01a1d285e6b648166eb3a055da7b2fedb59f236ad10ef99a0bd3c4bf8798f978995115487f8ed0e8c141c6d0165a0be5b08a2cde8a5c407e560beab2475d02d8db453a5145ccf86baa2a15c3cf695e4d1e0155bf519dea49578764558139d13c55707780addb56523600fe36fb34b84665edf2676d36b6ff2,4647f8d95479a121242d9ec3e6d5389828402372dd587cc2ae712827c4348f69,a0ae55e5a429e88b9795e56c5e05507bee0ba66221306b17baa3422a4044688d4ff021774649babec0f9749fa463a93238266172a2d3faed5919536c8b7c7e5d00,85784868c3ce7cadca3f9f8ada0d3fc091fb2c1b74336dc0c7183db2640baa062786ae1e8bd876c4255a05f481dcf908fe8ad0159909cfd09005e7807921dd2c01,463b7fb3838b84eb39dab65ede48aeb4a4f5e47f0afcd9eb78a2d5d27e1dc86506bd8102ba7b19af4f7ad37219660d9bbb3ae0eb0b63c94f3d9ffb5177d387fd00,87bc944af2455a0252ca096a206c6c77865d5d3d60b86d9d4f2549b01372ac5318352aef1f0d09c439d6749a9a2c7dddc24e4989b34a68d01abfff7a2bd1a5ad00,f0becaf9630f5aaaa1df9781d5891ba41e24cbae5bf626c83b45879c9c67d867726b5fb34b79872d5b64a51291f8656f9cc994f76ffa2d49cee13e968bb4482000 +957fb4073ecd4e7439bdae1f3efc5c4ffb7595e4dd7da698d875a62f48a3b5f00a96e98b76e11e00ca9b5362d5df786ea76f1737645ec4a4c60c83dad8b454a39c50a0e107e47e28aa9940658dc1b2436543276b2318d24b0c89d97b8255cac28846cf11865589edc05e0ecd701eda87228a7bae5dc3e4534c187448a964871bbc4c5f5a464c91d251d33bc344a056e18793fcebc236906e0b6dd2fa16b86af79f565f80e03207540cac21d20a6ec08629e9d257f94731c8c12bde12501dec51f1da5d1b2dba933f0cfa3b762cd4ce470311c6de9ab20d05242650399d678df492988d8641117910a0421c29c7a02bfbb5a371f4f6c97528c78d85dafbf432bb301d62e19f3f328a1a0f61bedd01d196,724421630566ec221d03d82c9a84a594c8d357f8442f0b5e89f737a2e9c35c68,2c466f102a13f0858d22724e1235c11c2d9ffd5ff0b8935456fe41832cb59af065d5360f3efc16cfa0865c31c92f79a49de0ffa14f3da667fb76393afdab4a8801,9b946b2f56db1d2f667d9fe7bc0c0a6a18f527fc3f28acbaf5946c54ee3f848308a9248206760633edf7ee1547f5007a7e096de57c921f893b86bacbc6f7c0e001,10735c6a9f1a0e2ba7775b7cc8e956797b44686e14591472e06cfdb87b0fd37a1497e6bec115ddaaae26d95cec763a57e2d09ccc91de6ae1cc1c65081fd1b09e00,d56c33275b950f884692510ad05b1e8b3748ac9e81122c2b98acf2f646420eda35a095b97943c5a346d86ab08f3c97f9f68f7a4b1b3253acdee223008c5d257701,4e950f57591d0ff244ef31e67bbe409515851e627e0d85771f08bc9b018c8bf2614e6d99ae964237fdb5a79d2a905b00737f1ba3a6ab3cdaa93aff3e0b57067801 +ccc32581e77ea019abf1d7f9050282292e49128371defe1b03b764f05140d3af429ddae3a51517587dfd30ba381c11e50c66864b6e38dca921a1686947209812ff86a9f8f6890d9b24ede386002823ed85f1edd762bccdb9d254924f0474e676501657c8a6d5ebe6f66238b453e84924ef134ffd11e76b48d0ad5e66bffb3c63cb02457101f77d84e62d2a7c626d96b1a78581b2147b8889ebd662160029bea9d9b08ecf4f5f15d075a687cc1172cb8384adee756a256bc4d69d87ca73c9acceb3b5ea4eb5204b4b8a2a288e8637fc4e5978a20576cae1edf8ed0c31f61e4da10c5a32fbe0ccc37c60e47da33b3b49844f82b648e16bcd34542d08329dbabe04d76a7149d144fd877543199daa681c71,a4962995b4db65efd893594bd5d25d25294e0031094912cd39d9d785ef61308a,6e04a529960d947653f8d30f260fce10eafa0730bf0e5df2f0a6178c3c84b64f355161aad823e8bf06e91343f2283129ab14841cc22f747198b268b6954dc7d300,212fc595e7ba3f5bc3baa0432d37240fcce83c7b9014c0c7e26b874698ceb6dc5ac774f1be165bd9b6a5d93dd12c5071a15cd8859a214ed9e0c187ca85672e8700,f45b015a6d748c8f18cb6a77a6ba6ae6717006ee86272cf367d9a111e7d0777e71f7d47798d9f7cf5522ff9e803b1edd602d864055502e6d2b093ff697a23c5700,e9aa84487c55706fc9e5ad8fa277fb16dfd7df41ccd2c09eff2a2ff81ac00d374a95f4224e611d46768b4d2f8e6adf7db9c4e006c92eab4daaf39fb1f8c78ce100,e5a5b674ea072b820d6aad6a87231c6eb90dfae41a4c95f7a7deb290432cdc9d58c0ed714d0706c2f44d041f4cd584da23de2acdc9207bd5b2dfbbfaede3ed2000 +312a4fd631e0681a04d10ac5ab18afca0557f533cd98b39ac91a5bfacec8ddb9b97e344833e5f30a7da2f847edaf79318d52edcbc262d4893072f9ab4b45326a9add68eaad0b9d435819d2d0847770c35348ceb2935727f5393869c0793fad821784b6ec9adb6a463f82f8be3274475cbaf178e2fd81dbaa4fd1dd13dcd236bdc8370e74f825ff1791eefef694f384dd76fb70be2d9581bc449f3ac21e3401b6aacd76d8d13a5ec88121f32db46958cb7e3ad4edf7d276b9655bcb33b9a587ace762d3c86d736c5a914a7621d99b6f429b2c3b87dbc6a12f70d55ff131dd54021844f2d7b5b80403af3aeb61bbb2abf51bc3c289bafa63faf77f94357a84ac6691aeead0f6e7fd0b3572acd68ffaf524,c19f4fd81481110a1341f4d74aa5c9f96f6c9ae89e82dcc9aa2b49007e85ea7b,7057fd00b6c7a1b02b9a417216659c3193891ff3605154b759a9cfd741243ccd4fa91283f4dd2de932b4f395c4291120d9fdfe0a4f9329b59ff3799bf2704b0900,add1021ce413a8949da7f78cb6fbead479dc8d527c5446418d88fe58671647612bacfad97cc9d34231ae0edd8c6d007a80a7024d0d3c597c9401e9d97ba7aa3900,ad06a04dd96c7042c8a57a57d4b456f3f11cb6afd07f277609274e1b070ae5306d9f979584551ce20221898e027703eb94da68bad946765c4a017f40b982482201,cbde937857958417177c1ba520d9ef0b164177b7d200a0e4c17cfab069711d8a0a2785cf7f52b300a68bd7372c083757c82952d1ac0eb51e1f50520ad05e9f5400,38f6ab4a3fbc0797a045aa8956ffd7d3cf1e56e2b8998c0060457ebab5d2c1be736f0aed981230795351587ab4450e4753ee80d4bc41035a439a92d617770b6b01 +aee9206df6f4e02ed989cd4a52a2586746dcbe85adec8743c178b49fd44779b62d3266e581dbc4f1254de94a4368b9745842cc200b58fe28333570ab0103a69b2ea724bc9ca49f260de36ceb2b842c216222404d1f0ff94dd71e4a47a9c281cc5ca45252b80a3f24d72a65ff997c4326f56e94014609d0b3b8aca69df21662247d163e628329364d7f522ac57bc1ffe3389c73baa76fc703887568951471a9cfe912e9bc3259684fbd29663c705cca1f0cf6b5a375d1a0cf158ff125c37d41f9f97184a46c0bc92a6cdc9199bacbe762dfc2951497973f8a6bdcc8a1195e36300602890d01daa9a7e4037143b15d5bb7db1ad02731cbb0cfc74bbb0911bed2235598a890c6da17d98d37d27e4bb4b6a3,66663bb019dd473b5ac208dc1255f6f90da01ab4f54cb189f64d373a6d94bdef,de8349950272366f574c7c4c76b48594b0513f4516283c2cfeb05379d940fae555d693e46fdea7c83551ddc0e717ec62e764f5aba71b8eee098c89517aa294bc00,1883ebba2e844afde340e8fad1a0e458588f1a828e7b9e8eb88ea0efcc5f59f243df3cd7f1fbebaf66d27b1bc272ca36e019540857b496324082cf3675524ebd00,0a71372725c28d9f8288c3b6831c9aa9c3228a8b4426827337d5d4b38fa687c53ffe3a1437c4a45bffe3ef309be33cec2075edcc4676d5c028d2684665ee2c8900,31c9a75ca8b60cc27669f02cbadee4273e4c2b6db076137935dce8b99fa2118f1741fcd701fe86456409c6eaaefc192d8c41778d0d5e03ad9d410c86318c81d600,1e1da46ca52510733a91dea60bf91552befaff23eda568124b222a8c2bc3cc8b3610298be542bcb0057f40ada9b2c72481af01e40716559058e4786dcd4cd5ff00 +247cb443d444968091e1fdcfee89752dc999f1ede1be9642c1b1f7df84cd90b42a29d031ddc442a3d92edeb2caf94e9d4120b6eda8ffe35cf5997a0562dc337ec50d6b363a9ee1117ad3eee9751cc87f8f51847fd5156590cdf11285a67c58db2079ad5d7328e09e6c8667d402fefc81803e5c6f273cb0b8cf2f61e2816f37dc19094cc8fd7a00a319e82c8d8a05ec3063543f8ca1f0428e8fceb203d42e556d1c96a9c3ce910b90599b5c465c81b7c265df83fecaf34848ae0a6a0537e87c018c1c600fb02fee5c787f190334482ec14283f47556653ff084a84c0bd84bb52ebe8ee6b6c811897f5173b772fc171e4d9b0234367910dcc63243c1a5a996db34963ed8ac8d13524b1d0918b803e40563,8776011135ad4095b254b1fa09efc7482a74bbbe8adac40b8aae0c43fb78513b,198e99cb5edca0e54b676c3a3ec054e80ebedc2deb4609b83fc286de703f586928f173fa58da9bf409b6c779c8c12015918a06d1bdf0787a48f5e269eb1c2a9b00,46e4ec6330a8b9a7149f4ea9241b419ab3992680d910a8cfc7c54b6ab92bd57d6771e05eafbd314b8352f41ba739a12dcf3d89dd33602adb3eab07658209166101,a335dc523cc51c05b41d5d7eb32829f41f9f8f442f01531203ec1c60094713882f7ac1eda66a864bd9116821ad70ad535b06a32ddcd741f7a7ab163299caa11800,1cf04ea281d9b86da4fa944757f621ed365ad405331ece820de1b3a14486b72d14587996305ff7034654f74d9c3418426aa7e90baeff33a212890222ba78ab4401,786306f83f3334f11d6a0929cb06927c40946de029704ab4e7ecbc3179ae32da547cbbd8ed0e485935558ea6a910928aecc46d19268ddb4c66e97aa4329e9d2201 +e34bd4278fb660e2e96260e6e325da37674aad06610e238385a097f0296be660adf953720f742ee9eac947ccec77b97b7a59d7ea503290bdda3cef3fee3a13dc7522e2b4be655ff7e1281f077ae3d7514fe9cfae335f7793dccc345bb6f02dbe9e14bcec8f43c26712f9d3ba2cf12a612b378a12bd2b950e8d157894cd0cc8a397033b6803d850b0b7a72c883a1fdeb8af000b76f9a44e5dbc80381326094804d94d46882ef18a082c9a78041c2e333bb8c8b02f1c4b839bf21cd5690ee838f5451c3bca679d1b54bf22442dd9d0fcb4ddfd276a87e016bfac1db7600757d3775112e326be0f475ae63de3529285209e97fedab90867d384cd1b9d33187e7650ba014e0521cd7504bd4f500056ab1bda,038c3c8bc9cb94f1c7b3f9c803527913bc5a73684ae3ac5459707f4dd585c308,8f0c81b5de714812ea3824c4930aebe67a2a44e2dfb2ae42eec66cb7fa683ea550279525e4ce55af28ecb04b8f1d9b421aac0e8a51c282dce9bef4d084aa6d5e00,88bf13ee1333a8d8644b92a697a02a9cd6f33960a2bfdac2abc33404f6b3b88a078116b2c66fa793a07fa6db3826a453c4e134917d1789f0465f00e511be7d1201,5fee93f452d9192072557dc8a45df64748c0436f16e045ca838d368531ce1bd45fb42f1cdace0b18bf352837076f2c020e6b7ac94569bc0e0385f8617355f3be01,ed3444e236b9c9cd341bdf8c4de74d8364c2ee6633541f5d22bacc7ec1506f7603e697eedf1e31f86a48e329f5055e60f593c91683ad8f0cabbffeb1ff7a4a9801,418214ff1affdefd18640cd411197b799e29914d6a77672ca3293f429c67066f1ed14a366fb942aff39285446cbfa6878d4671bacf68621412133f9cdc4e4fee00 +7b3e1fe5a03e9cfdb6d2b9f951fd8e7cbce643d62f94136c1a47d55da15f7b0d5bea7a2a0aa10ab065b717b8c7f2f32f84d81967adb48f2655916be4624fdd8cd54d4e908fa8239f78b428487df35a5843a3dba72fdd3c70eecc99fe62a08cf3d3593b1a9e9427d4f3473ee1da5e0f6e4bdfcde2d7c7ccf13c6cc28d5f1e077b1a6222c2eead6176eed0777b84ded615fb06991af50452fa340cf1c99856abe4ca249cffea82f3e6500f4e6fd0fadc2cc11e1a5abf2dc94b26540e502134b57861f93af2d0b36d9b236c1bffcffc7178b019ca2ac990b035bcb0ac6fe685cb02724e3bdde188a085f063a850c7d7d7d0a123ae5f891ccc12dfde20bd4fee2e43b9b28fed27517968cdcb113940016354,8cb0251ed7fa5729e841aa09e12d528cbf2b71395adfb0769c7c00cc3d49c11b,49a59f16fc153d16385c2c98a6215c20da92182aafcf62ed00a1ca1d00f1e2294a4604d4da0b813547f7cf5d4d72a7b9e7f8d14b369403c66dcb849a75daf20800,52a0be578e55da27690b6c1fb6650a8e1ab3d94cdbb57888e04b7dea5f47cd4d2e688b83ee545d93f5e24069afcc31a794a1fc733a68bfd35d84b3f041d0a37e01,a96e8792dd5272dd3c0777066d21d03a7fd10041fdc87ed77dd2d02ec4f44a3b68637bdfee67edc1cf4073048b53b0516479d9ea11760a144a481c94e9c8b6ff00,8e1938b3e35167aad2f66dab8a5acaf071b2cfa3b6f7c265b8d55a6742c65cb04521e9f9eca400a0ac38093adfcc8328081d5ebcb042eecf3b364e1efe7f97d101,35545a35a0734de805c4640bd4574485f05ade2f66e1942bfc7fa8fe03adfa60736f97c97ed8fe8f78ba13de8e2f65da76d30f42ea86db1cb9c70b7592e94ad101 +36f22f8bcd82cfa99b1909c058802657b2628de837cfb6abfc2d90057b1ee6e43da6ce48692721f8985c9958dd722333964f60dc89b923a2897085096129286baec5968355285a178367b9967d23fd96eaebf8e936a12281f6c1d8a5abb050f214db2ce30180cc904f7b0e595258fe540d67aed4432961ab8d2131bc90d2b316879fa3d1e83fa5e43dc32f5d51845fee9f0417dfb4631ea13c217a0731431d120cd60f96c4fa5ca081009949325e2c773f0facfa25e0d1cf631e88217a492e78b512ecd4ac0ec957b51d6c545d942cf547a80153a6326db173c856e73df7f3c9d29fdb28f0645977c769d6741a93fb9d32a3f3e5afb075950d3dda747fa0634f9529de6a8027bca5a0a017391f6bd66f18,99c33d685cd4ea66ae327912e1fd3ac577d8a588194c595b8aa41198406faa8e,d84e8625762ac15197da7a2873983895d7450c7a9b352d975b18bede5fada44038b1c9fd7d15257f9a5166774f4a7e1cac30c2b02b6a2fe9d922dae0e7cbe3e900,dcf1ac06834d0fcb21327140ab4bb986d71e691f14cdd2607aca2507317e1fbb03b811e520f0bd9e77850715638e7c17566b7e1d76e0abe5bbfd2d370e520cd701,73af2e19d348e1d9c7f9b376c7ab7fc8580f3040a561b12f5c984c97490abb4741626c67e57a156e74da8675fc682ee85faf7c5e7b35d166c2330ea51d21760701,5904db8833f7932c0423d3937d7d3362e8eca6f0ae95b7b026f8e8c77f8c81b917e9df92d26292cf28958c3d785d9ef420d9f1aab712d10be573d08d6499f05f00,e96f572dfe4645472c33c1837062fdc9a5198b2ceac37ae0a96bd73529d48b5d049921dda6045689bd723677290d7a5c5b46b3f0d507a4312d0be426fceb301401 +05293cd285f8272f7b86a5cd59eef1fc18e844c353d0e3ecb69fdb8a9231365fb7b0008ddde6c01e592f6764d8b56ed3ce9145cc57bc7e2ad9c4d28566ac12283a92452a5cbd1aba73dc930ac61677474cf85b3076fe8c83f3efa0463a74989b908e8cd98bd2d38715c88830e919a904bd89c4c66387573ef339c18fa58570d33fb82e9969688773271fde70b454274c573aa503a6c274872c99734a0ee988687962833f99f9f592c6a8ef8524d4c14c28504056d6f2436ea774a5eff9c5878a64b0b5be3d11810318c46826191fa139a5d056e47b8795b4a1d774dfed4dbf1ad6bffab2e372643b6f0fc59800c37fb62cf3b810c624aea9a2d464c8daf0e2703540e04b77b7686713fbb17520024ab200,7fc943e4895f09b20eeb21b1b4bf50131e06c6772ad6c4e2e8ded77cf46eb74e,59962dcb4a406f3da83ee2b370561ccf62f0132424fc3e8e049fb102c32bbd3571cda7b9c3fb235bd4d280026f40671c29eb3b858184029b6107547e0a24055c01,aef6e817c06686b0ed3c2170b6b60a4cfba24e6ac23bf07fa00e967532116dd547b05951314dab981f8e42bc63c95b80756ef0b97a6248996dec8390e590233600,98ffe88eb1a1ebe3c5f56560e362e1ca8c725935836d9be950226aae2827195d72ef50b57e606b5812ca1938e9890d6dd010f2951d665ef7bc340c66ba520f9a00,8b6641b32fd6354716fd29ce70a264733ee5e0b8726e71a04d39acfa467f06794cb98ddfe9192e5660eff5b16edf88ecab64276c8ad67d3f110ac44f6dabdab201,ba8938dce660d7a2b6c036d5ea926d8bbf4df6c5287a611a3d41c63b8ad282a551be758fd79911c26795f01fdb0a6556206eb387bac8c9a9f199f95d1cd2cb3401 +b876794f4287e16b716e9732c5dc723909cbd6240a79c8af187004999b1865a1c9d84b3cd845f073325f09a3051bff741b4361e333994aa83614bd524747eb46b9cc667d99f21b437989296c8f780fa391fedf3ba19675ab15f46b8458fc5be5a544940f2707c7556df91487342d61cfee686c21a29815cf85f7c69d50bbebe5a2b531b1f2b05ae03f3f5b2edcef6fd1abeb1c749eaf7e52dde3fdadd8a527a3837ea6aa831609298e407183e18a0010de59d0a77530e5fceb711cc61fb930089d89d58c94a834700c59e3d66ae95a1127539a37432e95bd4bb7708f1a6471d9bc8249df013bb2517945542d74ab28affc21e99e95bb11faf1543161c87baae91fbbb2beef10bb0e567a9f314f2b65a05c,db4a6090d3055e8483ac75720cde83cec16450b265dbc9c1c23f571e7d580398,ec3e63c4d769489ab1a5c68439906cd11560e3ce4cc70c1ca500b282b744b03c1c4236fa782f9876e18a0ab15b2563be4ca58fe7be427c08291c9438373a37b800,d3f001637ab54f19d72ece72fff05fb9303364931600eb34614f05550aae67540077aa1a6eb017d4ec351328028a6fbb80959004669af56a554774a8c8e1b00701,6104036f19019e24c48ce94b240309e1adc0bfd6ec630718d2fc6ab39a66c02e57ee4e07aabd7b93f22fcf9f5a1a5e807438a431f2a4c1fe97f8ce48045f3c2800,8e433546fb234386d8cac929ce51386b18e7dd97d80b181c877ba44b86727cfe371e5a94f5bad09b582004f775023f6e5f2a3c8eefe309fd613a6afb5de2b85301,0834f549e3aac058b62d5cdb3fc40152869ddd431fe93981e390451bc9b9289a4f25bb1e36213168a3ce2bcf858cdac3936e0469bc8973a5d66071797a9b2d1e00 +33af89cffd74ec65a0a7423c9d5c2735e3d98c3038e7179318db34cf02a8276edf5259e2b1afaf5ef6563ca24dc2f12608c7963962f9078bfce130b46fa85328becd517007571ae0879924e8a629c1904e56bf44fcac9a1ba2e726164e49ed54c0df504e98d84cbcdc3f90ba09e1c6b2e831f2378522f69e28dc7f63a2dd18b43ae87cfdb4a85240c376f0735130521ef988f084709ad716a782a7c8843568737affddfd155bc301fea7fd067b5ae39c053554995b432310ebc22f5137bedb3a3e8c27ed1a7cee95dd1cd5983789320ca3d0e137088cd71947e0c65bb7a87fdbd794ef05839bd784d00ed6d9d9b5332b78c77f67c1bfd5d708644c083b89f2478aef3e6610d1f48cf756da99f93a5c035c,98a8f0350b172efa0b68655a6df3a04562d67bab742ac1de11ce7590870b3446,f1d8573d8d0b8f508a3068247e95873d2ae62fc75b6ac80d7b70b6e8e4f42dc7220f110bd3339579d724bf645385846f024b2e677695164e98d9a6eb9bc0b48301,48589da5b44ac92ddaa3d7616fc76c1b1d1b465852167c9fbdcba6446cfb6fe2519df40e468e374a985d42bf01230ba4ac7ffbdfc8a0b127dddf20ba1573eee901,c7ab9ccfbb64a0f18d5d15cb4340d19939b6abcc045a6bf26a04ee2e81316059500ebb2617fca05807cead25ef401b8d4edbd1746c6c4bb7a5c8a83619144db101,ff4eaef44103a7f42232b0ed27fc7a7c3b67ec835702b096703c9d2cd58c71e269310ba8d3645cc192a7d7b5bf0f7cdf5aea15f18000a3599a6c57e9f80fddb701,90c6db51e848650f0c31a6887d7a70805a3a12e6496da0a2590786c1595e796450d94dd7070ff256e5c5fb92ed10e0962cfee7176866bd6188edea510f9a3d7601 +fb62481abc84fe07c3bde29d29453a56ca7910f13137d6141a703eef8e446025bb7d8b1052206037ead64ddaba36f4c8a4d461e14a854e1e61780e62c7161d331ab481dbc44f0b50409fbbf61dd49ad9af7378e5f3dd29fee3315711a7d501a832cd4f895eb62599e1ea27255761fe4b89975080a1402ff11191955b5d8b6839dda524bcf6e98eb95e3de357561f86132b1a53b156efa22fdc018c716a82352df7db62e50671c4a9f6a646022e71c1c577a06545d80ac63a88bce9a00fdc887dfbc0fa0ab0b9b81f606c0fb95f700ccbb964de1d870ee5846f3712e10dcd9ac54abcc6927fb79792146e65786a4cfb0f7199baff1c5f76568cd02cb548e3c8acbc94008a32de84c9cc669457583561ae07,d8234e2cd823fd6112f26dab20f0fa24e25234e87a67399bb8c0471a564f23f5,955d7b98af2ef6b696b39db98e9f18072d629ade14d9b69b6337494151caaa4772eccffa3341a46f7ff74162390744f16e53091d7efa6c340c908a969a2ac60001,18a8612f0328051e6d2d1daab3a4a80616b6769ea5a628134117f4cb37ecd800618bab2424141e9672cf17372df592d7844f9fd1ff13d4ec2f65591a2b5033cf00,0bcb752f4bdb671652a66bfb4d2783f7034c048a750c2fe359b69b689e28b76e379e1509821819b2e47dfb4c4aa00eb8a47feaaba0460884287b636dfb45a75e00,eae995acefdb74cd53eee4aee3579312897175c67b31530119976acdacd0db11625ed527508e3083dd69b3b6608cbf7da33b678d476264725feb9b193734959901,9eeedad8e22c1eff4c4705f334b4d7bfc801e66bce3f067871b0200d5f3c42ca12abe2e748d654618c3f80451ec54e25a334c4a7f07cb322b85484e048ab627600 +ce0eb80290b158c1c164c3ad22397a984d0681130d54efb317a22989a146fc53c0e128bc0e654833caa10290ba2fa685201da45793cded36eff1a1ecd2cf1bb518fd6002b7f40083a8d4390abc1905bc4e9ca27b5e90fb926f9f6f71afac21dfa6f4ff6eb1a237ebb3acb56a2dfbfc01594117ba83c20411cbc8f490fd01e585bbf5dc116b43c59c25c18efa476611aa92879d78e456d59d221e4df14a646c0bca7e7a21028e29901b40c840ba82a25921cf56bc2c84bb93f0990352a7e99745d876fae15ad193163582c16963aa7dff655ee4f2d960eb2e0982f74f7da7ef33d0a7aeeac532f6efa39b09546264daf79921e758804bb57298e9a0a61c24df7be42292fa875db98d7b24008b0b8cd1ac93,198aa908680e838360b1e327dc81ffbce894c4575be71be8f491be90866df0d1,80998afb0c1a4885ab8d2c8f59584cd82d53b9e35234e5d77a02636842591fe45908cef9a673b8692780f1c64a7a2bebde873613d5151f965dc27458ec4076ae00,e7c1af711b5740d4dd26be83a637b592090505ff6dc98e72f78649aa9527ac2623d4c113731393e016668e43b0a4339a3a2c949993f283cf6e43d00f49348a0c00,a9d688f9d01e52b9a2abccc39851c52766db04aafc74d15f239d3d002c8ee4fa164b394278181e0910460d2ded1c6e0bebfe32b963a22398c872d5cec1c5c2ac00,57c3577aa364f521accc49894f00b9de7d32f05dd138b6e4afc14a0cb41f592252d8e13c34930c05de9949ac3d40996026a0d7e329e16feedebf9ca73b310f6500,b1c1ec315508cbdcb50638587ce5910a58d2f10a3e817bc5785e4ecfc5988b5f33c0c9864fa3a549f991d4bb9f3eb77d026b9ffa998d6d543a77fe8a7692d42b00 +5e5b067c796d3144a83d19d55899166d083ad39d0588c5b405a340558baf1e10876e61b46b33c7e0a7667a0b5d077cc10f96e44fa8369251f0f827127d02e8a03f93c65243d03a9c3d733276110e00bdb851f19e6184307d3764887e16780ae18eab3a4a2205d2e93bf8607616526275a9be3d2aaedd062b64a467d245cd1c288d5394d4d5931677dec85cb1aba637be0b0f42ccdebf784fb5a62020f1c613b55f3612a8e39cbd196f7f110761b75994813a93a033e7cc1f785817ad1e91c09de9d4c8d5258487efd785c7f4a75473052a19a6ab87ad2d3cfea1a1c4cf55a76cf916e2fb52e9406a9077cbb4ce53a912f9e6d10fc952241a9f8f76b9e8e12fd3fe40a8bfffafe18fd9819dbbac1180290c,be05f045d4d5efca8ea33bc9d41dcdaa68ea6c9721e38f5cf91f38df1a7d7b21,5fd376ab8f0d47d7421e3b069ccfd81e845986e105fd0ed23592824ec24bcb2d05d2caa00b3a2738669ad4339b98d8679cf6590123529f68a15997dc8f7ba1bd00,22ae8432b8b8f80a68a25d67deaf670da682be8d970a7413da956ddc1cb0afcd32a0dbe82bdf9963940e047a588b4aaac80b88a29cbb4038f558e1b0972f0e5900,c0a7d1a40b9db923f15593301d47d56b2723359491a3e83c45d64aed099aaa1e6784bed1772ab2f267d612d60688c82809865fe32ac9850d73325d6227a7877301,a26d3f127d3b444274d5426fdbf5470ac141a1d9024e5f062b848580afd9c12825ce167c1f6a54010cd74942371d4323060ad7a4510394e604d92ac18a82451601,f0d1399fea8073a0726829c3a774e349f368fa40aea5d55f5c4fec139b852cd4363443c52b3ef8a8479d9d20b863679b11a61c952d64db76c66cb9d43e09234101 +53c306d9bce35c5aae4068233e159454498d4b96edaa9c1d803bd9d84a86b40d8dff4feb31843d44c63bd0c86aa211fc47932326cf09db5b83f2cec96b6d2c2dd9f42face06f7ddf858f530ded5cecd1cdf7af43f77c78160bac1eed6e6bdaebe425a340df9a2218ebde7046f027338ad6a77837988350351312e29dfc62be96c9a79c77a9a980473791d0146824ab7ec2adc04f7c674474d67eb453be87bd3534cbd208df0220e6d6f9527f8505a551c3f2eaf6d791945c99b370ce46424cae31c26d6d0c79fd6fff590f8280380aabd5f8f4f8fd6eae76428d84e0c73a6c36aa7490660776e81273c44426b58d17390bf439ca5fc4aaaa27cc95c37e1e8ed26230984c1c93d06cf331d564c835e1fc41,ed1467d021b5dd3dd5ad1c090fd77b1aa3ba37d4035371a670bbf0b0ced91924,f963b18b15881f2e60ee8807453a03bd9597d3f4e47d2d88642a1b39b78ee9b05e5f02582dc7709aa7b2ac9093f592fa76bd40fe87a5dc82c8c48cf61c48c39401,181b9c4c3e1465742650843f1109cdde29c424e2459aaeabae7a48e2254b0c385f75af2a5e6ecb4ad68eef8bc775c182bad24417d6cdc2b229f1123be0c0b99f00,1ca527d4a13d1870f4c758960c31c525d020397997c8e4754577cff5ba8dc6bf606cee85c7c1e37c73c688482a62289e89b03db1040889d4fac202b60829792001,1cb038b1515015bdfb1353f71149757086a05103b4f862c6530a4c170a0973420e93ff652c01c0dc56b736669dbded43e9bd09feefa9d03872f19f15e6363c2a01,c170e3cf6175337bb8815709a1718407e33f37f794320e21d055c8e6f5645edc34a8167bab7a19e1b2dd1dcf61cf7173cf85056023b39278c44c3743300af7e701 +b9d0b115e57d3d853ff5947ba8449d397c91b2a2d3a88356477905a8d900744dde546252e969841d5b7a540470492fb075132abd308e7bda3fdbba383d8b6b34cb5eb1eed4514def1a31e411bda2bb078b88b34311e490924daab70eec4d58f66ed412a71277fdbc21fffc6da12b99e52f891bc172e8cc6f8d8624188e7a02d4a65ce0d165bfa8655008b0b7fdb91075a74160150d0fc395c024fef44ef42960682c3a8a51b2ed8163e8018524e3e11e5f6fca881fdf0179cbeead4efbd0f642e656ade741f65107834359ffd0d09faec96bbae0418b68f90cc12f59b3490619043365d3a0d6bcd54f53aabec8dc52e99e4cb755552ec162c4a71d9ca5acd7eab510d3ed5455e439695f633d230f2dd647,eafff6740499cd5b4dce46e1954b3289f30fd954df057e529cc0bbe6402b3bf1,d88c4e67b7ce7102d0797a0e59e479be0a66fa8b62fe6c1c451cda842ff3941153430c8450039f018585df56510cb48c3af76dc4310e90fa68d767b1410a770f01,9916c13e0628ebf631b239392c5d68a0bfc1d8e7a55f0ad08344bcb746ab07d7337a418140f5ac0c8508e31f6ee4a0308b994b8596ea43668b64b17bcd47be8800,533518183c5c027ce182a76ba29052f7a894d9517a8b7b8f5a2ee17b38ce391a318052cd007988923fea88c638309d498f750dd7d13f314a3ef12ad14771fd2300,237455853a821d090672950f84ac17fa79a502edaafd40b16b0dd0da446b7aaa7e6f7d685b598eb1633b3afa3589584784660513e3829e13086a579db134108400,3b74619a3730a8bab2def266d3ff3f8b58cecea4847cb709792f582f284ff525061c65f0014f8ae275297ad8d1599fe7eb4fea3a1e810c2debfd2b89e7088b3701 +b632e5126b654a2c8d75c40f23028cbb74801be329a45f67b0298bcecf61bfd25b7e01e02287e6f3060eeca49498c18cbc7cae32e35f999bcce7b2909181b5a0058408454644d5338d231ffd7ccb1564a7acfe9ba0c0ab6474f59c0c3748bd1bda6657d18d544174714f08e6300c932d849b3141180974392f45c6f3eacbca02e5abc932a2c303a41911a65f6b20a8ab5965f9b1be7069e39f2809b43019a919794b3032c3d365456fe9832365653e9e4574ccfefc4780a350fdb4dc87ab51f4025ca9d3012161c9df3e54aff651b8c8479e64e0037f2ab646dfb48c7ff84f96b04f28a593d8b6234d5f19b79f0322b0f06522d559afb9daedf36f043ba6ad4bbc9657fddb0cb3defc97bac8ad7c710191,c97b06f6906770ad72a2592899d77b59f33bc4c2faef22214956ce824fbeffea,42696ed9db4c8bf0be2d0e3cfc35d949c7b713ff83e5f2eeca39121a3309711c7b851555ba008916a85465cedc102c0e7c64b2e76b3cdf7223d8165a8b488ab301,0ab04b34561ca6555535b2b46b654eda90bb326d36b6ad0ef76272477a3b31a952258f14d63415e8eca83f5df35eefb20262e071e64384244adf84076b08143401,57ecf118dd5a3641fb6f06203f367ae1013865149aec58cb36d6a38e301d2e596172286cbfb671b24994a67fc17cf446d51f169d430d6bad9cf9673851451d8901,ab4732a8ec7e01760d4cf5750b2ed3d98715d9a2540a533a4740bb38c54cd6915d927f67c89bef4e2240019a512cea9741bbafc31d8e6264cdf52875afa97e8c00,e74c8fcf23a31abd8210d8b7a08efbf23d807500559f3719c0dff6ba10739de32d23e6de136d8d13e8bcff6b41e33cc5b610adb05960f81632107b32252466d901 +7834affd99e5e6e3bc4f3edb3ebe075773998415d7e8a2fee804cd1d1725b524656af26a05aaee44824b4e91dc4b3d2d4daeb365a0f75ebb3ef4c7faccb42625e09ed3555370d50d2c2e027c4961ef6ed18ba140da69e1088e8baa0a3651542e7be118cbadc6793a8f31202743a1f21b5cba1a6c8f55fc97f8fb852deec67e5ca6e52a99904b3978c2931c0ee850639912584078c8e1a572186c3851987eaf0b29725bebda1e1a458fd199c27a2b2746640a657e648fdbe326c8691a56b92809e9e319ec44eba1e042acfc7cb172a7b19d0146e8b4edf6da48a56cd28ce2bf048c1437c958b8e882419faa6c4f6489361b5f9d4e5d21fd7af74ddd8322914746e000ae3cfd9fdaab9668504779eea14df00d,e8a7d8d6e5b6fea58de20d32c84ef7776e79f2ba0707f7957182f19edda9c403,f04a903dd4bea95ea829dea1165aaa5c53f55e68f19d9ea506024081bc2aa6dd32077eeb4c176074005c216206170ea2c28b552eaa1a091e4f872be805aad4e200,51b3e0936e19292f215f2ae5a8f4e0ad7e3b1950607909624d078e84a7500e7939aa9f2790ee317c50d261a12123c5fa4b6e5c22cf1cc5426f61bdc02a2e2ca400,68b641dbaa48ce185c8a2f8c1c0556aa8e237b8fbf1e3fdac5b11d9181b6ca4a0454072bf128986366f70f290533c12df2279fabc4deb21014e86b4db56c016701,a8b64ae64f14c24695ea9d6cb3aae9b335b6c0dbcf0b1e2ac68650ea2ae801dd1c3a8e543001be6efda40458b678719f7b9a2b381a1e2edd2b5d77f3521c9a8a01,f733c650887d9270bf63e2ad120238519a02421c39853f2bc15fb69066a4cfc352dd890b627acbf02b9500210c881641a2be9294f1b08e41069d606bc7bd3b8000 +651ff4c30548494943e7ed0acb284bb58bf0f80f1ad88e2a55d045c94df4007ea4451076c13d01b0060f4cccaecd247c6c1143d8abd4b13683a7b815e7c74fb8fa7add9cb63761d22a503d23c4c839033de377dc822f25932148073b6bd0ec0ed768e8c305b32ba816e4c74c2e77cdb6046ae207df882e4d3817ee761e23b5c161fe45a82a50816b22f04304c8f946182fbd76f7366e251214580297cf17350f1925112d893ef05adc074a96d43ce9b57af0fd356c0cfaf2cf8cbede19daedac3a4208ffea8262c7d39907332247464fbce70c88dc04692984ad4012cd9d817049537aef0df40cf51d18488ea6749d4e9a3914065dbb7771bd0587d381b60a911f0edb4bfafeb0d3bc017127239225aa0397,d3f7c910fbc83ec26fadc240d9eacab31573a58a82490f992e9ed8af557d813d,ab4c4249602287764aa69a3f0ebd5543e2c3678bb51189d3cc171f403817e1700f6d5e538089d5ba560572038470b58c9d7797799db48a246ffcff833789783401,2fe997395971378cffe38b501e9a5d37d8db87266d81516eb8770c3e0c37b248058805c3622a2989cbbf33486f51e3b0baeb9807a6e6db2b4a9dfa6b9bb3e43001,ae00df4dc9d3deae2953a7236c87a30ac05f9aa47679f11bfb7ee04d0e6d8fca0af6c4ddf7cf6ab1cd85028818bf7035efd2ccdaa7dd513f274b5f6e063f28b701,dca86ff62e993956df0233b9184d314f7892f24c7b94cfffa97793f866c1c2aa2be9bf8fecf2890e30864a4fb90d590ab7d899ecb3aa94187550ae211561366400,a721612ac8ed8e42367c2078ce0eae2cc34559a4fa579dbde3f191a5a83ef8fc748c79cd03374e29ead2ed23a714c68876410ca2662f3c874aa8f55b25db5edb01 +83833ed90b69e398196aabcc14a944d5e001094ba155695e33b8fec9ff27c78b2cfea470928e2d36c7238c626741b4e8928371dc48c8bfd135c9f56fab14b8edfcaee3a1d7ce63fe35140d7ce0eb654bf8fd291b76ef91275a0392ac6927a75f53061f16b811ae03838162e174c957eaf3a9a83c8d498758a78c7dd062e1f60355827c1cd5383ce5686444a0db803a9e572d73c3390a2a95ed38ecc55c96430884607f121137a577d2e14fa3024807ce645fc3d78edb918e4882dbec999969994ab1eaa297a32a36a7faad26947c7feba40030cb6fa0dd7c1222149c1f48e6277d33aed183cd0464a421ace534171fd3a13f1fcacc0ca34ddc0807867d1e8d9694bcc88a0df21fea480df21dec471b9cfc90,d7b158164c1b0f6818b463061d669ae6831a02f3ae784a9bcb8da7b49616d2ad,a2fdf70bec22c00254c4f44f3628020f515c39826a46c788b74397157002a18771a841a40ca132eff621ae2856328f3e1d8fd41e9253dea80fa3fc08546ec3f300,7ef98c64ca9bdc7be262dc928c560133de0ac55ff68f3fbcc12304cc2f8ef98a33e6c082ada6a25e266481e66e0883f1cf8f87be1e25521fcbb8d1bd6710d48601,8c79338284c613200f8edf84b0f0119bdd3bf8a5032298f40ae4c81d41eadb1937484f7caa0fab4d0d4c2f565490e3a4e101e8609cbbc59b2af1fa96538ec58b00,56c35a90c4c8311a01b898f32cb0ad979e211b70c1f8f879eb22dfe69a5ff5db6d9f2d23a2851a8d85702fc64eeeda4ac8535dc0a1ea53e0a6d7f724b752906700,506218e6b884f94a440219c8678f2a55f942f0f37b1956eea492a51181fc06577db917b3538727543449edabc023a9bf69ca93ea6a95c4fe77d21a498dfa575a00 +5c9093a5803bc23e0f8db63c375c287f7a4b4cc6d2dcffdd83d289a849cd1cc216ae64f4bf0a6e7e79f5f5d23d40133da47b3257b3b64376ff23741c984454e5062bdb3a47650ce837eed26c034a7e7dbbb04e9fadc9d459b594cf407516cfdef61dd433f07b41112be9632aacb90b9ae9e1880318c1f0e56e6898118adaecef5688709c81448e2a3a6456c0f52c59e46d501d15f48ca91393ba13da836709adaf318c74acce41a8676eddabffb57f2874caf1111415c342c64fcb3ee8190a37f37ebbb6bd1ae4759932c03d4ae07468240d716ed11aac4aa1bf40025f2d7f417b88d213d00cfbd22f844cff7eb88521dce8ae8c07d17a2e616b21c717ceaa79973c04e0a62e38eddbce28336f07e4bfef33,151924cb2c2d7f47b489959b15795e4df0da51ee5a3a83454de435c7668a2191,9fde10ee278a539a1acd86b580c8d28b754a647beaa8c25a86b48d8faa58dd582a2a6a9d1fe78f2a85cc84417d41f04064e490832cc06e8453c0d357e603107701,70e75d11b108487a58708d96254b90d353837bf12850449266d513df7d089a7551cebaa64f9e516ec05cbceb81a1eae818cf171abc594150328c7fa2523006be01,fcbae2ec24907b86a992e91e935f9b3a6ef51eea977258344c25dd5d6688f1901f15a6da6b21d42715264860e3f859866e9501842a18d4520648f5e1c9aa1dae00,add05867a964f7c86136d4fc49d5f654712288d03a9d7cf0b00e0d5861f7bfbe352b03ca59f60491ec6df5917add41212557f4d0df232c200991b698a7e8d3c400,2aa18154e1da636642afe32025f294f5dc6a63dc8cb406c4d466e0432a475eb4198c58ffdf80f3e6375d56093214052aefd71203d9cc13c34a4c21703a83d16400 +4d62198c746c3f0eaf9bedb34a0546ee0123a1c8cb057145a5d065f8cff384baa653610f84db5f5006c80db30c046deb26a812f7a53b2d230bfd33fd014f0ff002e0e0ef90add984ee43385b37fbc9a6c9bbe3dcc306f8830fb187b51b2f2979db6f8f0eae00713c9d6703e29a931c40cb20fb57bc4021e3d1aed01bfd492f1ba3b634d2278a040601fcf384140f681203a1812cc537fae074e34139f8c8d05ffa9c02f8bc6c42747c979d0af445beed0b55dd848834df9811a6f9298bd2d374c3a92d2f53cd09faa9799daa7060b143aa9842febaaabf74486a1864f605f0b1d52e11867729924b29338880d2cc2c5070aecaff1bbc910117475542fb2c8da56a10a31356e36c17af15a6692ea06e91bde3,e590420b2120c1922534427effc3079ef082334c68db43aed72ba7ac7415bc23,4380522569d104713f11a00578019b9f33167190003f99eeae11bd897691c07e1fb239563e767e627a47e12bb88f9dc4707e3ef0a71de1659b1be09f74b2a27601,841998771870a2d2b611e92af9515dac0ebdfc5ea74221de418d1065f2aa042b6809b085594464c2e2eb3424f4a9ded3d48c6dac6990392c7925e1e126fc01f700,85e50d143baf8e43b22a3d28b4fcba739e115068e53be47c5d1c56b848d913422d82ca7fd986e2b170092503cc75d6440f0beded7d0ea117bce892ae4af52c9d00,7d543947104ef4d185d429f690c960022ad55d47768557808f8d1bfa766ec09c0b97c9ae3bc8a4232375bec3d8f549ad634e8027f51629f841f8f689ea1d274e01,62fb82e9196d565345c3e448e67bc8a59da3515a95943dd0a822b210e682268e3e30bd4468726a4552b5672bbf180925b24018dd50aff43825a2b7ba9ad67c0100 +e8a34477fbc93da85ed621da6532898043c89818828539e3ff75807d5ffe4d7257b04ec1f78b82d257862c902fe481b0a2d96f1bad722dc142365a76b8f49cf161f2cfae579c04078b480d01da13cf6250c3b9a653008a773020fdf7d40cd05fe566d80bf43c26e8e1bec62c793ab19683bb09c03b97c061dde0912ed138df9c3e6b2a3b4a35025278aac6772a1ab911cbcdcae199f907fbf5c729b2f3ca859d11042cc1047e54e9007415ff8a7c6375513cda593192ff281ef1e966d08319d743848159d2507c78249117b987505595ea21aadd70e6baaff9ca8b4f2db56e8472b580c290631dca1fc27c9c2747930905702243f7d69d6c0cbdec1db209195db8648b01d2731c8bcb5574c828581af4bd95,48cc0090eaf86257b9c821a7e077a023487779ac32b24f13713d92cfa080913e,80a4d59867d4cf468abc44635c1d060470fd992cb368fedc9155d7fb8f274c441818007934f823db48e5d049d27d1dbb88fbe6cc9fa8c1facd8979362efd1c4d00,04c99bec149cf2dea5ad5364e662290675d0c0ebcd1a4d67d8ffe3eaf393cba027fd9ad271ff5dcf69d92b5cd976cb1972910be8f4a0f292f23a11d2ebb475e101,9e964ea9f7e57ae01d60101947821697831fc8eeb78b405176de5415ee71682a5aae2e6e426d5c3b0324634d682b5b4d91e94a3c0d066f156b39aaf1c1e06fb801,15e077f4f33aedea378f879fc518d514b2f841bb97a8022ce77064d2cb66a86a179fe0c0a43f7f230ecef673ff3d1f3fadb31554aca69d8a459d0359015df9ae01,378d2593229043fb506bf5ff3c760ea99690ba75da5d448a4360e9868e8788b405770ddd7b3fd7f091343d84188686fd1871ef04d19ef26dd020d797e984f13500 +d98df941bcd2dfc568bb1e8b2a81783390ef8fadcc9ca8e19be613435ad5ce8ed808de9ef7925fee9c81572ac0b36b624a6bdf56df09ce8e0eb8d8ba080cffc1b07e6ed8d1e2cd51a01c8d2f4d83142c1020f74be86cd3ce9f5c187fda94dc1b0072ebc2433c3fd61556abdfcaf8f602ca1ba4941e559029884b5d92539cb05d77f1e8905928b08857f405eb06630e11e664a4804247535b91c8c313a32cb73b0200fd49b3fd5cff4b4ca4222c382457fd3dc1d9d0895728742bf732f678594bae21155494636f1935fe3c1e8ed7f72799c706798c1d54ca066639f1aad3ef3f29f14205af278fe4a65937548e4bab370c4926ff9e3d6466248b5f8b6adfe0940a3885ae6588895f423d327e4be15184d5d0,b43d0e045d9343e3b542e8327151726e6e905dadda1723def8592cfe8556ec7f,81bdbc205baa35b8638e2b2f79e329f64d9583dda7db447782532a48d1acffa7761ada5fa030053e44e19508485ade2b3eb7ef495f0a448a0adcd387dbfb591701,129b2fdf6f9cd6ab4bc652d24692194bc334b52fabfadb342830213a51b86bc345a69c10a0eb4bfd77a33521e4e07c0aa4d85a9d92e885fec63085221bc2173d00,b472d7f02ccce8175d113065951b49cfd7c2bc3ad8998b9aa2ba0fdbd1deb64f775007d2c40f6a0a24dc9c4ba437722a52bbdcf70445cc448efa16b2e265841201,18c9cfbfa547e63f67479cd9544e0e27487f0891aa28814c0ea8f48da2204d48623691fd7f4a16c08fc41a37ae8d1aab7d5de8d4884a1de723c303bbf1f3871f01,be1c88a07250ab0f39893d855c4f0a5b39d0887435d9f4e3d87e0c61b7e87cb4428ceb886bfa2757747bcca673e7dd0aaa7613be7cb86564e498414cd3fab65401 +18c3e62084c2a5133cdb6248422c551101b10b2dccedc4395dcb2f87579578d7c002a59d70f43a493effb72f811dc39fa7ae027651edcbf16b4fb8655fcec29f8487df85de79768bb636241b3f820b322746209fa1bfc4cb6bd0c814fb18f1fe27456447aee7e40ac21a3c6206473825f99732027772aeaef2537f566d076d65f9e76e9fc4f68a7d6cc0317c433d5d6c4fdd9102701ae26aa38b6ae4ff411f0c2bd82949400fa920b8621b0621721bccbe110bb64cdc83275d380def56779912b23533e014d89a76d92ba43bb99efa6d9404c804f53b7a927f6d41ad686dc3e8a809d7bc88e8250efded4ad5b5be47fcdd41d494365d02ae25ded0c887cd7891b398c1cb190dd1603e51e4a4a9d47b1a524c,33cc63e2adfb2b3392bb4641f7eb26082c57de5a6cc999ce205b7b634ce586ea,333fd60f3f5caa5bd5feaefe0f9c89ab450a103722303e9d589d87b570a7e0887b3820aee0024606a084c60d58330438a24456721a153b93e0ed8222a3e5635d00,461b7c9e263b06967d3a8e7279248d79843cd3b7a0aef5ca3ed555a6655e858c01923002fd3ba2ba9262550ab7bf16b1c3bdae97ca094a648e18f145490d994001,c520c67ebba07d2471b699d43e6d80e9733a369a7ca4a3b660e2f4cbd8994cb34f1831218418a93b723bab467287c0e3bb056c642105ea89992a6689d1f811f501,a5287c6c10014a9c129ca9308226ee6f39326bc12fad7c2e633aba3cdb8bbcf051699e34a623c429e9e6c1f8dd533a6c75c49e6e9906276297058315a9954dd701,b24c4163ce3c27c87a3cf6046021a009c270a30b1f041c1bec4788cc611a16d2795cec2cddb702f63d114bcb1738c9ed9552b168a71d638b7468019e8c9ae3ca01 +e971a950facca62f74763de0704ac6b6d24505289d64468dbfbddad4a5aab27367f8d049117682e3f8f9a64e21c15ac9c85f68da21eab3a3ba689170a8dd7c66a4644500e5464c3a98ad0cee6e2b611c286556e0b7a19655030a8106979d1bfbcfe3006a773d75922607dcba5aaa7c0861624b419630065a9cd93aeda9ee05d331fa489698a0fbf302eb31dd2470ab2f974839042116fd68a13a42aa222b09b03e9cbbbaed613de3b710d944075e4f7965017a2e762018c05ba653e0c0fc11861c5e5cb158a400972e6e08ac182e609a867f96150be932a0292b143d4ce93f6cd5ae0f697a83193576b2df41c1e7e2891458bc171be6b3bedaca5e485b35eb2bed78b668fcaafb038599c0fe374f3608ce7e,3aed3c395bbf1aef74dc641438825eab9dbb4d6425299db37df68aeb7e2f95c9,ec398e3ab4740fb036b7e75fff61d5cfec53f2b9fef51e2b829a2917f07c8a0d4d5afefd4fe2bb46f48740c3c405ad1ebf287207211421a45019cc0e5bc3ff4e00,820746f81927f976b00b299f98c0fcc178e2b6e623459b794d87b6784a6e72d72bc3b154dc061c2b7826ffc35f70ec77b2e081e513512fae3bb545091241720200,b82454bc4a263e001fe86d2452ca89016d50c715539bdb0eecd3aafc47f56ba80a6badd52aeee2b928f9655568be7b2f8c67f28870578c53b06946dfe6b06e8901,ec66767ae5229585651906ff517d9c2815e82636b27443e3f5d83df037fe3b9650b28bd831fccbb17c66297cb68b44e98cd209fcfcf5f36146feacdb64805c6600,6622cbd9cbb58dab25661039ea18b91bbc9f97bab4cdf8d6aa025076dbb78ccf6adff123bc8272bc4bd2cfa807c081343355b2051cbd5e556d3acec4255f957301 +d3c0952b1592fa4c203a6c923bb456a7b83903defdc8283eb1f61c1f808a4e3b89cbe4a770bfae82233f047157a85a6342229321252c2283e247c67e70486f2ee9cf9bc12cc17769153edf37f1aef367cdaa4d4fe24ab6c135b7a895dd3a5aaea4af97a89b701fefbfa6f8b44bbcd74940adf47d63d86fec5b7d190548cfb1364c2cefa40359e583ae3f0b768035f428cf3ed51fbd88acbb7857fc3885ebdf88961e18fd33f61ca525124e3693ded1fdf2a40bed05552738342762d4e983edbb7f8bb7bf11af690ba2a603c71e332af9c88aa844f55450c3bc4f0cb528d2a1de4f38494d313cbfe7419d963d7325c378fc8e69761011f9c274659660bb38ed434d042ceadaa21cfe6f4a5dc33db99ec7d701,f8f94012d51f4f5901d89dc1508cba38dd283d72fafe6749679d2a6fdf2c9261,dc8eac899ee28c5fe45c03d59c818271091deea113598d5f4d10f40ebbebb57444acc9afebd89cada5ea2cba84e3f3ab5e30db83c97a784f35194ea8a4295ae001,190136a7f22c5fb57db877bcb322b820d83d62dd3f85d5ee59a455e1606a5cd06521b4ac613a1fd6e2d6abfadae3b8d57715ab758bb9c9ac7759b3e48276ee2b01,fbba5982ce0437ad318315f71fa9b77bec1edec2a7ff33eeeeaf53dc787885b36028e40538ee718c5cc717b3063d8dc02ee3f84e69b0b5f94cdd4f1dbe5bda8301,8a1a54151c7c473d622fccf205e81bfdcf5f8938c2deb88ff9903c39ee773fc97e6d9abb9db0c74252b7644f1f652f46928854b8a176664dbb656ddc8115d89401,a959e5a7cd5b4208c268599a92dde282e38834d23c006be71b486e874a6a8c5d1626688c124d1d8289d0e4b6073ea103db6ed7687793fbab28f838a0163de6de01 +4d2047b4a54e49b700e1211be1147f4bf6915078b507178193cc33111c2f1b75a669cf289ef3bd4cf0406e34104295d9691063b2b00d109f2f0b144f57826f6df236d01d1bce0a49c586b6c3b12b83304c7fe038acb0041a23905df0fb28ec70b2af462640723dc216257feeef2c5ad6f1a3e7fc1cf5d5291cca3a522f8b549b48446df61efadf51e93f168a7f29b71b8181faa2f56a9ba893f2e91bfb363c2a0cf8851234aaf26eb3035122da9cfddbd7407abb59dfe35ab4e4b3c06c6f06c9f7404829fd02ae9702529eafb13e7ff04d859837e67e1546b99e0fd2d3abc5537067ec0dd6366371bded1a5af3c6be571b949ee527dc0b6f7f8cbe7dab64b4441b813e54dadd569eefeb1bc234f6a49363719c,6a7bcf6653de824c8a11636b72339c523bfa8077aeb7097a9591ba9246e041e0,00d765f86ac6621e37ef417a94d8b31787c8af6b0e6a99b09a08fe6a9644f51b565be786bbece1b4062e8ffdc51472e7ecac2f66a7279a10d1f35f9cb2421c0000,6d94a435e2f2e2a98815b56253718413f3d2aac0e2e6f58a737723728bfec8c01f01fc97cd995ea69447fd0f486f025931ffafefbe9a50ce4d916f92c42651f300,a356157a44288194ce1ac19f35f03ae186f691c779d394d0952e73d1aa6752692a7f2810e369b0251d474849c6ab7f36787627f25346964464e66f087719264f00,3e7f5d8817b53fcba0fa8f0e4ed7c312042f6d7e6df525c54a0325f3e5bd5dc23618b6a691288b58d20217ec369a3e46dccf09fbaf68352a99987e9f6e59183a00,ebcc8e60d58753964b298a061c490d661ae74326074e58938bca8f0eb2bd94af4eaa122c3525ddc6e1a6f9f3ba505495dd5796a03d5d849da7b5e4179c34ecb701 +6fd05ff5a01e4c748a878b9dd74d77a31ae00e5de3900b3eddd8e2490c64f4c007b98ee03d8a4b01134cdf2df75c11f847262c69f811347f77c4b31e3db8457943b7c85de097e2d81215ffbe7f7588b450b9cb264a0e128a5fa668e6cf2bf3fcaf7ffa85d306e15787310541e00498e63d6a16748fd99747aaff6db32b3f7578a6c9af1ebaf14ab99a9ceb43091bc89f26ca9d2bf350dac9209b20f77bdd2ecb331431df691c56d56497b61565538a803d8bf556d515d2fb6ddf6fc00e47a23f451a3dac28c7177bddea1b0f346b05838bef4fd5797ff3f62f6bea1e5f1aa4e9a07b8ab8b7b30c562bf869357056fa1c5185cb4d59e79741a946eb687d4b1e5d1e33ffab1ff36a50518e43dab9df5388fafd6c,faa919d6e8395d3ab6fc561f98b4d526fe56ef2830449575ba39db98641a8450,6be9aaf703f28892475bc8b6eb5523fc7abfd2e47f6442ea099c73c379f8b71d29522187365f352332851692d0a82f648886dafa9fae80a5df7cabc698b0a75e00,16d2a0b58a3a0374f6818eef5940b3a6a349f1349d2154a2173d8f58f90f3782666f891459e9e5c109aa26f21a2364b4bbd819a01d955c343e735fabea422a2e00,cc57ec6979dc4be607b2f1380e294934c7a423ecf05f5c59687758e2ae2c3568463513b4ed6bd739e03d027b1fa49812ef999317b94fa2d0f218720da3c343c501,aacb46ffa523f96af9f546b11c3bae839405b7e7e094c5e98527c481f604b6d4323f8874b935ca14c664c59695fc907055ae5b426c75344c82e6e7bce68dff0600,a440d3a3f25955e616aec5f2f31f382db8ea0e9c1adc6915e04b96885cd4e9584e9914ca992cf5d3fd84af5b164cf8bde81192e72283965b718d5c234d3202c801 +a1e9da89a1c78ef6c782169c66895f0a6ad5886551bb833df6f84f56c6866fc01fbba6773d3e3db2210cca586569781844b4d178c7cb6dcfa41fb48337967096dab8d5c644e2df60f58faf9dc0a536363f3c5aa650970a88d5600f1de7e287b48a04f721c3036f8d8dea231f3d2e22b3e252a1a2d37bc56f7585a293f1a626f205f4bd102ab7600fa59a723bff4a7815fa6a33f4d717331b6ef7c9fc8b40789aa6a6c36457c31792e5c813b86e1429df0f548a407c698cb10f203585f7165627f79e51b9bca04a4ab1d960358f27f96da7619d404b254280bded9ba41c2c9e5a1fb3ffa28371c60231a510363b6dff807da39d2cd8f1bddf6e6927a85a6dc30acba6c900e5db7ee8290c856545082289f01f01,bd762b49caffcc5d335f9d073397b2f28dc2b7207039ed11949a90845d1678b3,cf3dcdf0b2ec9f1a7c8ae16841ca6df7cc25073b2c3933b278b8444b9811c6a339ac22b4e1388c556cbb8e8a4fb1e3836f2131b997bfabb26c3be91ba09065e900,d4fc7f2b9527e1fef18851e8f295a490d6644df8288040942d23b84c96551cb60aa15d98a8e7396096f6edac3b217f620695fed1aa619beaefac8cd004e81b3b00,5cbb5b4ed4cc4d3852f9b1be5eade44be065db6ff3a8b956616fafc78ee75f7d480522d2ccf93db89fc7e847f2bc1bc0d7237aa7a706caa325abf461933f902101,d366c0cbd5f95779b61ae9a7dd000f5374111b41d5c41d872922b8c61396b932394c699e9b44afca39f6c6fb24a08fd6c73b5cd8878ec614a07647c098cf269e01,50f1cfde5e4b51bdc8e9e49d43f60bb76bad200abfee98678a7de0e61d5fcabd76f3c5acf57b815557dec54701a524b2459a4371eabc534678d1dc4be5df09e000 +f1a2ac80b43a79d2c820490abd0c9542c3c7b265f1d2e9afbdf305d2360f1282a69c1fca8623144b3808a9f80672d38528857fef64aacda8a35883ce3f02b59e7356fd68a44782d1bbfb7bbf158255c94d5a554f80a98f0d7a0d2f0db8ee3c7d09501ff8a0613bca96f404d66320b2cceec59b19a3f9170111edbc54944d31218f4922fd7502e149d466c3c8e3613d93ba03f5e37a0977cfb23344cf3b64984d34840b972639986201114a4d1b0e87ebde3858da66b53df2bc5d8c4467e42bff2afac1b4fb16840b915822ea44a38141897f356db69fdd7db730fd33bceea3714bd044a4e8e3e859a9215b34ea3ff8ba16ae874faa676b785b3a3a3df654994a32667e81874874749a139a538ea6b3b73f5014,857df3f481227d83906cb2a4c34bbd19b009bfaa2da16fb29d6325306769d978,687992b74b1e17bed6877d758eaa992623ea013e43f882125e2f05d098c5351c7d9d5682ed4ef7c8e420371d599a318d5f88dbfeece39d8c4a6b9e110af705f401,2b314f9f8ceb7d023f5618a0fa86284e90ca7f2d3127b131dc574aabe21d2bd91272a2a825b1b88f4b355b7976066b827b19bbfa7369f26041ff1c6f3dee0cde00,e55b9ffd9652935248d6cbed28b6d47887a64fda02a7cfc6b3e5cc63362c20990e927d239f21a2cfae23b15e7f095b72ce50c7ef85a83d8984f9e999ae11559f01,82676bbe1aa367be8261b152766d3749db46d4998550ae306867af1dae0095a56d10fa0e4c248328d69b08b5c523abeaabec41090fa15be6ce458623d3800d3901,c7261cc07988cc65ad20089358b6fa5e6763fc82597150b48388b96ad0215e412f84871d37f50ccc84d6bb51808945380e42c01c3ff79ec922cf7ed0292afbb401 +c1767f89f190a69dc1c9ba539b07127094245800d13cf02a041efa4f959345eee98a6c00227fce977f3a166b98bbb0959889f1d726d342f3bc0e1ae8390e184d8b2ad96a5099db26a25d574cd583334b4096c90cf614105e3b0ae119bff5b7b0fa7c999579bb63adaa521fe4ae07d5d53ed01494b1a43f07f259f2618b95063fd5b4ea5a6c36bf7cb619186c4b8bcfb77424a6d8c04e0d9057a39373a95ffbd38783e331b9dd9849a83790b307bfa00673c52ec729500cc4583d8fa54b8aaf82a5bbef9c90710d84aaaf46179e163958b13d40109586b362ac27618e0d806e06c2ce2cce8ad1ee13075e3e732e33d3086de828765e138bbba97fcc373c578314b170245bb984a7694be388d949e38203cc046d,a0962d587268fb33e43e9a978ac58f0a8aa1cb0448ba1c502827362ffd165cd7,3af17dfb1a533491fa5b644660d5ddcc07dfa2255a40955c8df906f85c9f6d0c5547d103b8e36b39d3e0181adc80e03183a9eacfeeeeafd83b345688caa306a801,be41498fcbaa6352508c685fbbcc88adc5905259b9bc95d8d281bcfa3dd6a3c3342c42b14403d4b7b05027e29ac3701fe631934f606089190f127dbd6435e50201,4ead5704e94cbfe3362e30346ab009467b4521a0a7cc8c3e1b3cde99c72930f44ae6ff6901d54941531361e517d5de330e37625650e0cfafc363c3d0fa7a2eb400,b701489e551bf1afb218ca844506c327e4b218422b38969e9a01cb50c58f01da63d4a60041e5d974ddafda7b4b0cc88a7c8d7c6bdf2a99cf85c0d8e3bbf2cc9300,5c699d7902b92a9bb164c8b52352e569e3e1ca701c8161b85069a8f83974098d5432e5b94f49605ff0a0415e4c1115e25e711bc97bd75ba90434ac3071810f6701 +bc7f1e52f31efd8f1e4545af8b97f90ecfd773937aaa1db9bc45fe678326d8ed4c1500c04d9a734327c5791aabd76a3a3cb73b4d01747d389fc6c991c07cd5d51f94e9b7d25b2635defb9daacc61921a26541ea60bfd3ef7295aea2775f228041c645b8012826d8bccea0f4def6b5d88bdac500986df19452c9f72a02d1d4b897cd53e7edc8f270d214bc2b33b6e4bd0a1a0767d9344bce556ac0af044166f3e34ecf084a3ba324141f1da99718f22c10e9c8a7721a23523c0548e35fd2023159acd7fee78a7f6aee72e18f2fec56ca6e7f9a8e4820ba92af057d13c952a688d92bd97fe24a11bf37b94f9eb9e83b846e7a5a6cb7e408e709caac262b337d744aa0775518a401cdece91bb5f92217ebd664d1e,2a2d33564178c6b52286319c982d4ed2eede8884d1af91fd817b402541e3df07,c4dfd510631f9a068098e77caf001810449aedfa2fb85114655282437e6113503054e91671855cbc0f5295954ce95d1967a5376d6dbb005df57e062509d4f07401,4e1dbad3a8d8212b9c9fea6218981e73dea64e6acc4608ab62d82ef72b8662f15635e729a8233abfe3ab364e6c2ad1e3490e0407c72ed8eb0e8664050796eb7901,71d4a92409040ca7e6687dcba7d0b20d5baabf92451c4370df171f9d432c09c170fc2ead4dee211e1674f79f53bda31e949b7d2692696872a9eec64d1862f8b101,3107f29d51481f32bcf32e34d21910a217bfe66c1c809a9cd62e9eda200ef17e1683820a36db52f5940a3a14f71372acb4048f11bfb2f10597a3f66d8e185f5c00,20d69d49cb3a70c40b5cce707ee15a1923a3f2507f440999d7d36f9b854a02c522e40e78a3b4a015b05aa85e0ad6d459fccddfa9b9feefff0b55331ce3354d9b00 +bb369b3b84393a3576aa512a4f1b50718572bb1472845d9a29ae4dd573e4cc0a0cd42021edf1f2e464880d079ccaad51cf0042c5e8f0c56b0208c18fdae1e7f122b0794e25de0886a746af4ea31215aa9805110c3c046d050d64385d411b000e766b0a1faa6b88e6c78a8267f9629a940f110719ee22dad989662ce01b315e08e71cf6f7147348c3493d9c494ea36894acf818fdd26a0d3d46daa51c6b70167a426ae06dc4a9422d1f179097df23703d286308d7ad658a7e8fd2f9c4870ba70727520c21e84310750caa76a1bd470cdfd065e08fd0600a77d61bc00ee089c2ecf6dced414c2bd52955c9e29a395975a38dbc70d1a5cbf90f93edb0f9f68eb959115730fef1b1cece0a911ec7d7beb5e012558f,b6b7636f01be813ef393fbdb5c24cb5ffd0d62037aea0d4fac32e5d597293429,351279993ad0ea58587a8a8620bb13cea664333b2d2609254cbc707558af2427190073d63007e2baf255854862580e54268c523c5407f9b948da84d68c98664600,005cd7109b0ad3349ed03eb6b2693b00b9d64f1e1b1ec4a1e5c9f928fb3d884a421641855e4bbbe58ca0b0407d45b8f90c86a1730a88b7edd9f0c1d468b5f16200,ac190301ae8dc66b76fd0c8811d27ec5d844006f8b3bbbf0800f06e552804ebd2f6f4ac8ba8ed5b0bab0ad0189a87526a530cb77b2b333fbd0c119cd3986290600,234ae58ea8f66d99085f3062fbbef7334eb3ed854fa53537259ff9ec221155e76343749fab212d45b2e253da39e0793dce0be6269dff3fdaf23d5fa95e3a011301,dd9a87388fd1f1e7560118e0dd6a428f96cf1145352b9996d81896235aa2fbd37165553c0abfacf84fd422ab4ba01bed5521bbb862ccba041c9bcf30d57875fc00 +7043e61361da1f16b0555c91a84773788dccb4b844a69b6bae71ba343969995f439d5b65580c5d6fbbc69a9ed7ca155df85566220dcbcf647018c9bca55f1c811e6802542940e898fddfc5d5c8fe2c91a2f7bd3ae8407215ba8e0e08a2c67bac85d709a26dadc61b16203cc4df007d2927bf133fadd1e94b889ea8c140ad18d49867ad6f1f767ab2f76b83ee9022fec1ed7a3a64d0cf7f2113dab23a93e9323c1517a74a363091910de592c85aa23e14919575a9254f8556f7495cef50a6575962c6b7d429725d891bce05b3f9979eccd48740a4e4f27050295a8c12b73c47cc6c6f7893a7da65089994f77a2bdfe14d589302a22131d4c188c9f83673c24787192cb879d16022a1eb565689379a5d9578dfec,b34a2b27b7930ef6d43edfe768fe4786457f505656894721b3f3b2232b8bcf63,1ed74d9c2c713d86bc097924d9d16461606a2b8830c712a3266f6096fa268bc548014699725297136dd8145c2f27d84ef1dc894b3d568b5d0c03934cee34e6c300,c68f3cbab039d7f5fbc8e36daf596145ba636c9469fc78f8a9aaf5ba0ad220571cc0447b3d7fb139643a8016e09d8a5990010aaa2d1c6cd513abcc3171e5e51001,4af4c4d310ddd602a229bad64aa09b4e7eff22ecb7acd0eedbc187e60f56e74037a4c4c0b7b0f9dc59b0b6f3ea129632b078209a506a7f3325d6236d1b698f9e00,646e1510bbe3acff974da48d0daf310907abe720104ac548c29b7adb905e87e001d0b523759e766cc49bae8c86d11088a120e0cbda2108b81401c8a5c56856d200,faf1d259f0480475e825a194a13e4cdd8030c4171d1be127ecf17469829f1c7637711c9246aa1d600fb54862f0fc056ae10b04e2d8c61a743af81c91bd770aca00 +d1c4ccd3218b7556d7856d401459180b10d02da13bacd4072396b777575712810dac7a66d9959661eec9ac838204e6c8f199e10615ed11fd3971b3ab7590d34c5b1f15d30edc0f27f97e003dd7d7ea881290694a84009c3322ae75f13daa64c22d09899a837302a6a73292b73989ff514f7cf4d01bf6df52cbcc9f475ada2d7185b35e165bfb9263534901b66a110d0c01c10994267dc3ee773ddd0172de4c4b45e886cc38090027829ab6b4f94790f1fc693abc6bd04f29ecb9f1fa43201d90d5d9eae623fb860d457ba32bb8f6b957680f420c1a87ce721c1a5165e3b1f1573aa9e2c175dc1cdd1b95a46ccca91408c9f37e7c9bfb846f07aecdbbd5b3642fe722d12bbbdb0e3d7f2e847d9e7aa7f29a857c,2b2ba3d8bab5d080ac4e3dd6d30d5a4047bb017e1ecf2ff0775612c650f1af94,5b1dec268abe4dfdffb5c510d56bbed56efa6ff3cf27c2339f6984c37c321c6e3c42beebe8730792795c7257d017afd7a90ff9a97cb85a117fd0876cf500366a00,8941efd7e92fbac18ab0e039ca1493162830e505d3f3e1edd3278475f7bde1407a1365a017fecca834b6bb53f0e3ca769157a81cd5c3cc3de6e94defc376fa0600,bd493a5da5885d54c6c4d530f6d453f2e5800062b96ce5fa91cf388d88b5052e7d012a97b882b47323d585699b6299f8f80cc05ea5823bcd329df321bb91b03f00,bd58664ea967ee4dbec2881f7a359368c41fe84609f106696f998d779396121248edc3d3396903a6c99b1bd7226fb5b5c085f96d9c9183b8c3748b472a29b0ec01,04a16a12ea1ba0fd173db75dae465e3fa1ef6ba12f707d2da3eb899eb03342817f13eb09235e33c294e7246dc01e756ff11e299e30c6e2e4064e51f4a94d83b701 +65f450b97f45abeb44dea6d4048279bf41ec51d8f4835806ca95a2f3dbfe224026e80d3be4f5c2d04c4a891c76d0289ec35dffa866815816cda1ed7492315ca608e8d11566f63f9da791207a5ada8c71afb8117b61ffaaec7774ed78e3d15458361a20b5b2441d47a9dc1c5e01179072aa99a7c7f8c8f90b2ec732ac5d645ead30f858149cd133e0c9fd90494a0669ae2f7e284e8f6fd041e01a70dfe9eda91ec19410c5f0d6c6bf68892b7f945170de7199e75db453ecaaf745bbf6408d081274d25c6930429c3c89099b118d47d6e79ed5fa79837da0d1700192dbc1eef84c6bba0242ae111226613411b9bd6be42b5adb61afa6435a53c6cffdf89ba566cc1400d837bf1e01b0e2ad1913b561623226d645,c42af112a1ff6158d101493af45fff1ab083d7428f41e43e271d460c7f0bd7f2,63012511605cf960748228b6f356a19feeb68730e6ec8d5f280c00d842f7bc7f3e820fc2a633e3f9a3dfdfa7ed247b71fd46badf357111659d1d1a7865b2ab3501,faf2edc95d268c11c0d38bec91b52b651aa50a8b585baffe1a1701c136561c0344457a6696a4c452b09bf67f7a926ef2575b61bd9e2d8de0b9cad913c0f1218201,d17fbee21fc8044342aae1647346b2cf96c1209a5330443a7d064774bb24e1602bb0aa300304c14beacc55afbb411790e6fc195f58b09dbbd0236670242b97f901,834707359d5617f7bced105ebee3af0fea05977c04b17a1bff412adb25a39cd2467f8309a175215da89b801ec2921078f58233da759f5f04fd4fbf6b5d01265f01,2761d555a994970c8f5095a23c33e73c13075cb7b1da383567efd90d8818935257350e4744e4c5cde3e99506c852e563d9807837bb710e6785ea5e8c46efb85601 +0f2767034f432e327bfa905fd4eede4a0be7cf6e865a55a7d2b2144a3f56de2a2dce597d171fca1b6c90f25c1f2e73e6379937e8daab26fd9d4043d5e812dae139486f8ae21deb8371d760952a949f0f74846046408a178afc30d5bf2c6d061ea7e40eb301d9894c9f2e848565d48b6efa3fead4f20be944ff924f9604b9cf0c0dc46ad98e15d8a5de0d21b28a9a59d9e0516b9a1a506c4be6d0068bdb2db23dd92ee239cfc545e221c127662fb4a4145955d344d96acd76ca86497745ee76e264183f9bbcdf0d4001ef1db219a625b79ae0a214537a49c0c12bd45376d7e8db19acb8a4b43a952a769c377886abe6c6dec2f206dec54649f31e8536e5f8a26ec7bf9b33bd3f393c7e5abfa9354876e2f4c36642,2c70f0128b6985767075ca152717a24aa2a4935861a7ab7493a73143ae42e0c5,0ddff18889a68ab6aaa2b5a268d1b6f51c1a04bb689ec8ba28bed7a7c82c65a04340b84e4b8e2320811b222b8a24b12126a16644f4b76f54ee0f17bf222d469300,7a30f61666ce13b3184a1e26f312cdba74c80aec859f51c1932e3223f03ef3a03d05ebffbc756c0cdbe3158f031e224c2f925a6c05a880d020dec0a59fda1c1c00,b1faacb5e07029890eb098925e42d9a47a1cbbbe974a566ca6abdd31a5462ab17dacfb0e9365539f7fa73d22a3d53da58b6b6decd54e39c1fcdbea17d04794e801,f1473ffcf404daf6799d137927be07d4f93138739dd6f8a993da1015cc248ab271a9de8f95aaf79c98bfe3f409a989fdd5ac56d28e2c6118c90f02ee153b1bf101,eec9a3b9fe19bc0f4d85401de0020f5146724655c5beef6dddb9cf01203d95a415d854d3d66406ae9a3435c4af79c4f68363f99c9939094284a1a5026802eaa101 +faf82d6d73576be3654ee0de1b61e14aada752f4cfe0cae516e0d010b15cd765c161477302c0aa50f0b442344c63ea52b7e96aa4ec8e073a81ca394e8b21d96c94f1a946ec931b025ae813b2d861e7dfcdeb8adb091dc0c73a35ad4ff61197413b4de379b4b413d6bc7eee317aad8c1abf4cc0ecb78409010e2c94c6c2565277e0dcda3c5fcd2fe74781a7a107ccce484ef59ab06d9e74f5694141dc3e53482431ab4bce88c5731755b69c497ad181d5c109956f14d94111f509014baf624cf74daa7f390d23996d15b344c032399469070f0c23b06cc908c48f36801b9e3a5b329daab42fe976e7196b4812c96b25124f72742865253a8d4921d34c1bf79a5efe1be5f19cb054103569463c25e896d46d47e745,95d49df7938e4659c2155efad5b9b65d9c4a25723cb98a2b897b54ee6b3ca2f9,ed769fea7e90d6f7f6d7026b0035d0cbb9ad0d6a1d13c90f5905273add14694742615271a1059d814da40419de42d1a2f0ace309a92fcf67651ae1ae5234ea4900,9e3fa331092dc8fe5bf2d81a3b01fcdae97ff3fcebe2ba76ccc17a668cfe3a317d3c1e097c6de6473ea80969ac33f280cc1c94337d40250140720eb5e6868fb700,921ffa8474e86137dc88f6c00a9547260ba234f4dbf3c81ec1ae9650ad2d74c93db36aaa7be19e50501a4f12e651db8198a4df6b3f5415b6bcccafe77e5e9a5e01,b1953cc755632d4c7ac2c5cb369c70ef786eb517c9d474578cb6a33f36e08d495828b9a927177f63ca3a51d7c1110d7d5ea5bd9b14c0d8b82502d265a4dc698a01,0c39d85cc5d2464548c59e4ca1226b39660e165a96bab626620f75fbfee294c6368a5c7e1de0c99ddfae01fbcd76be09963eb09d2da4cebab25ecbf0ce27e5ef01 +b6f5996d139f9cbc023245946fefe56aee498f65f4f3e133ab219b92e7b9cf87ff34f38b158a3debba43be882979d4447de312be560458d7a31a6def56466e8e6de38fc2167881e4ba396964cb1abad4600948f1c73e3e7c52677222612450e460bea5e780af606e01743e89a3b6ad007a0652f3b704f8de1cf6c41d4c4ae75a17b6357a2ca2a9354d23589d20295951535d8e0fa2fd082a1b4154c470196cb38a0d80c738b5b34aa08a0a6142dc9fb0d7f7bbf048afa2a7c3fe8443f6d7bc19e445e6105ca5dab65151f483e91d68412379d09cc227105ad951ef656834543f4fd2f87b07028af27b123843d395a25458e2799cf4a713a19da0285af3ff5a9708a5960f0e8eb06bca123e6be7dd28f12471f473,3799f5ca5b83515a2035aaee63e8d9add129ce85198853720872b8c917daeee7,4112e4792ffeb6cc1afcbdad0d2b4eb2a7bf35bdfd1e9f37ba3fe10f51c5c1776b9eabf0a445d17e5b167d0355c1f44cd810b47daafe3ce0fba86307c9c1268901,4d7fdcccea40326ca7ed0807962cb2511df08f8f5f15aca892dc19bf9102347e1a8dfe33da5cc6a4884f1dd61ba4f4433bab19598ad9e83f65eea2672131ec6d00,8a6fb9fcfe4d5ace9d44128c3603e36135286f522e74aa315841b98272d85d3a64330319487600982c5818a1739b0c179c4b6babfa2ec90c9e68116c8da24ad300,efbe2a09cf6aaef5f80c9fde22baa84d0362ca58f873bc84c4f5ed2dece2f1714582717187c0b77365b0e10731b32c5273572c3eca09c4914a41128e0e4ff77301,5a85698bf252e2b720bbd3a2d5263deec4e85dca3ded8f5e082d8ec31b0c7aab6025a09248731808d919b47d08dc61c32e9f0f426065693f7f85895ac8cbd25501 +3505028b3fb65a26e831f257f32afe8ef842e3835c0d1c29a972a6b42973466fe8efc757305b05745da09e9735e10563c5b4efb1e26e2a45491f14156340580f67b0b9b8765c078b788569f50232c6a9badaf346a9f1dff092ebbef71e8a59090bc436b9c858974ad0f07c33dde70f7ba6bc33afe02df4f25dc42c1069ba51ef8e64a5bd88aef1b577367b83796f5039098436444053b6b7c43feaec11be74d49167331bd3e96779d7c86f00e2fa0a2df617f3cc21cb7b96ce355acbc3d650ac2babf51d2adc7787f3c3772ffe3069bea67252d6aaf0bb32f1bf0c6f9eacc5262fb98fa89ddff92d0e1f234acc6f8954a2db2b4c89cfdcbcd80915a72a38f55cf4274920b51784f59e650f85f792c2c769973c4e,9f4530825e218e92994caf8e7218c8721be1c18f707bd32ddcd2f6cb08d156f2,8502b20b99e8538d6c0af451f230565a9c4051b72494a7f7c28d2b3457924d152b386f55e48e82b4660ee87df27f0ff86cd18044af92fca3c51ce9fb0243901700,23b58e513e00d987e0663abae6e63bbcbf9ea97c10b178ba8f810e2f3d8208c46dc5b061745c41277f012184cdd3947ca1d8baf76d83ed02ef18b679ce86089f01,e8326e3dd2d5ebaff450135bf6ebcadde3b631da9d71b89112e37ce331b711ee50f0908323b47da8206e0a3a638d5615a5062f26f9da3dbb235dce64e518351c00,6f04636641ca62397cbb24b1c7dc671094a60e70a91a95926e39120443590da2420b03342236d772814c8708603f99897294010c7ce4862e6190b91b22680db000,0ec7078280869557a90787c710fb92a320fb3800e68f8671f3d419045a994a7916f5549672f4e161536e3a24d56d152de6473d9ea02ab3aee92dc64e8e96a64c01 +8651e16c674e2479da88fc7d9f844fafeb05061b53ec7264c82733a44e8e9e857a5cbf3a347737d2e8178112f50d4956a2d6edec60f99b980638f81d697488cdbfd25221753c01f05a2832dc7cec6010302bab126d407f35da97ef3b6b4eeb865733a6edbe93219947530868935d90bd8be486a112bba569f16a647087668b2c80b6ffceca5c7a84e635fc29ee40b68e08aeb881cc10facf023da9e57220f96aca8ca5100ad532fdcf685fb78c0e31d08b493ebfbcc18d38700046ad945ca6aa5a8375f95ae065e56aa78425e304b135b6623007d43017615db92439904dfb3285b1445fc07728d919615d09498fb62a9c8b344f4cc9f3ee5f5964d801078eacd8f03c9c003616d7089b10b5a9aac0231976b34d,acee73883ebbec1bc045c385d802303343d189307a165f64c512dfacb3df3b35,01c69964f8cd0e8e1811c345a583aa601fe857be157cf2789a4b416bb37167421f303ae96f88d78abdd28b046ac71612cf7a0ce2b59c2bc661ea4c2b16101f1401,95e999e091027fb7de8c0b8414bac5830d5033a4de009846b2c0cd9e02cbedbb101b3ed6746d0d8b3754fdeb9c46f5eb674f63cf30f5c277aac2e51f71aba31d00,8f06f3d0dcd811feb03b375df9540a9d7eac656035bf1a0df50b025e205d6b5518f57151ee4b74e24d03be43265891b0415b95c473377c697ee3f03fcd73dfa500,82bec0b325b7e9abd52f0b3fdf7a08646bde220571b0600f98a5cdacf5600c3404e84cc3b1a61403439142d5401489bb60b5916bfeef4e160ea897ddf754a1ad00,fbdcda4018db9a2371dc595da392ada7d6c619c9e4a1675eae1995513dc2b9721d4434bfc13aecd7602e51a855e42a27a70ffbc858e6e3a0daad3db3b18960dc00 +22510b683ab99bdbbc3598f2be17c62a22f680c87f403e64b28909f7cbce2ccfef3ddc19469e888f92ebc71bf1aefeb8272e285fa9e59faed6068c0e35904a420f5786f40b86fd43ae13467f5d829970fdcd02eec01fdc0a6cdc33df5cce81c54e3043c4250f3c2d0971029dd992b8b51d9ed38f4f3ee1a363302cd9449f0c616f9677052eb185622415c19810c89ca4009188db553ee2b97a6239f4b8819773835d30e35ce9fec99a1a8eaf33e45153d001d2e3995aad10099a7f56b34e30d38b92978534f73b0b42e9c9602431924903c6a5c310e83c4dc11dc5a13aff66ba737590bc5a9d4972f1722251313a108947dd1e6b3387b788c1045de1df689b867c2b0c8e5644976889429b1a2e7b96f11188c0f5,96723c414a2a8ecd0c11f96c28831ba7bead7289e4e4e90e931913c7edabc58b,3428c8fe748769b8d4cf6abfb92654f71cab439d1dccf341a221066296b7c74563c93287716a5ed4020f974342752979aa751a2d55f7117f9bcf9a3a83efed2600,b9873f89da2a9215e0f4824019fa5bf719206c4bde128f2323ee3d3816c17963529a9e293f143bc99605bbbf5b72946dfd6a53cf307f0176295af8999f2ad14101,f9db1fefba03fc175b216e819dfc92209bb5aa845068350f90f892e71807772b1c0b722c2a500942b8a719b3d3bf984bec2e854506ef403faa6fd821e32f0c3400,8a8706b95ad692502829632322044a168ab11b24ae121ca2d53b7b861ff6135b58af49180ba151a59a03cdb3f0250968b23d7ad99b8960247a445366f5626cf900,660c0a4a00d61f7a8ad7577deb441e0f5a2aec96625cda8ec650241f0404f79a5b40bae4bcef641940da31bc3782d6dd15bee798633454bab6d6d9a891f3ae1901 +11a8f59d927a40df43139bd4d25bda32724a25d59fb787a3a3fb459f2eb72a06970be0a6eab6db7f062eb384b1b4f34b24829e922ba4cc2684a4c2ecf3fa1f017d4263b990187b7ea11b1bc17ff264ac20de5b17c7a797afba147bed5badad5585800efd3c698245967a78c14622f8175eaea528dc30ca8bf78a095fdb169617414fa4e126078890afa5ed4ac7afc5d4f3ab39ab449f49349ba73bdf7423ac3de4c7867a40e08a104be8a2359d9dec9860a916ddd08afd20d3c9eb6f75a69c34de4e9f687aae32adf5fc3f753ab8f755664a3018baff76fd9af53156525afec8aa1059e3100a2f80584c2ccd6f8532504b5b9d656b8d0219f57180ab510399a6fab1c74715294f2c2b2b2dd5c8779704d04b58e8,8c7163f084bfe839e005ce79fb174c7fbf4cfcf8f302e9461759c5b67f34a440,57f26ac8b928ceefc13ca5dfbf6bf20b44391dc221be3640aa014c771005b3fb3ce6a61c98479579b34615abd9c34e45656496e1e1906eb408da85574fdce7f601,f4732f4b582cc0ef3b48095388b3e0bcd66a727dc9902010e9902933cf797c22231e1eb7ce72c0b042ad48f8e69e350a596a693f2ea1a086248b2c02ac4c77b901,5e6832c632e6b882b04b815a092319263310071bf3e67bb9aea12a019d22b9c31e5b73bb32b4e9f4cefa931d1a6509d2c0a759928ac2f5626dc325e1e531684901,978f0a5fc6cf7b09e9d07fc9f4a0f214c49bd25a32e96b1ed267888a9ebf1f6832c9bbfd03f3eacb82136cc6c36641b37b3defdc8576cf94022551336a94b59b01,27ee48d0fbdc668456391cfcb05957397536504a7b742c7f7966b737fcede30a28a27df29f7b77422ab44a07c9ad21220ac8ad042739812b18c23206097c2aa801 +a73df63c43c27e903ec8d1ba0ba1739ef8f53470b314693dabfc3420cb50122feef32e831328c954da4eef1cc4a91b4097a15c98471f9859d3152b5a777e55cd62d2d55ab3d4ae5bb8c2e49f62d2ecd80c8ec4da9e79bfcd954dd2f23c752c23bc47bf6b48837653c39c59ee5b64d62d154f0e7d08c9897a82f26752a785b418edd2a55e7d6c353d39b843d2b49e20c48e0a04c7c71c523013c7aa3c7c327543c28a2feb007e27a2cf0775737bd444585f038abe9ddbddf367e8aa3915c9014203bcbfe495b8e7099e0e2bb530adbbd9fb59620f7e59f5dde47e7367977670732c021aa798d1f3207e61cdf3fd2401c036694f10818169cbcbe99667b8a0a519485b492aba12c4b784e9b6d5c3bd44b51a361c50,81b4652910a91337368b8e25ecfed774523da88d76251c8ec7fa47dca7a09ab7,02fec007a11fddf035f2ba0cc9118859a5d9bd811b88d1ec1b782264d988081b5bbf9f11de6df5245399fe38ffefb262347d86dfda251d5855f278eacf54ae6400,666e971a416bacc629e40671c2579c6dd17ece96f4e8322fa8b454aa74f2984912cc3df7975addfcb0bc528f4b580e216edeb9222b4c746ef213bf57ae3f40df00,76d72ed6446730bacc19090013cb5300cea0d9d90cecf8b2b6e71e378d980c86230efd9800fd3fdc54b335dca7f97ffd3091e92b33c511f09e165de72db83adb01,1d4e6539c701f5b17dce5b95ccc588b0d95606ef887aec9570cf71747916988a6f577dd18a86d048d88a91594af4785e409467bbdda236bbd31cc11e583a52a701,bc529822a95a0cc87082aca298fbe8c9085b2243b63b635f2096cb581fcc9ad135570b547f160066ab1ef7893569814ae5b7d7f0d77b7b7821d90f2bb223795801 +1d5f38f6866938cab3d5e175f476ab59066d45789fcfc57cd407b9114f4ea1f1c4ccf98d586a8e8d0ebd13141858289731c2a6adf4318597a87ca8bf0c5e8ecad5893a37d99d1202f45df9198da5482caf2731e0a180e671111d063ca81247a743625bf2220e4c9ab7df6ca01b23493702c3f8660cbadb24996c75f7387052926d5747b6425b09640a8529a40bcde2feb87f3b8989afe2c52a551e7b166127220ddd664122a4d2913d2ed5037f340f10874829aa7803b4439fed06435e4c7b40c1e1ef9358a379707c46711e62adde139b2a3b331a0ef62b3403cab978785a214cfbe1fe921334e8dfbc6434bade0237b2ac6d9f1d41d33b520ad2e6e045dceaa14dd400fce4ca81506bcfec4ab38854b90df631,ec137225e44ef0730d0ad0a84da99d18454ef934b42ab0aad452162de0741968,a307b2c83cba7002dcf6c4da712a8e8f4560ca198eb40829633eb6ab5ceba52437fcb15f94c12c215ba9241db3dfd79a469ac5057d2ff68ed9e207974891270f01,b6d91268dc79dc8568f299e1935adf48a59a23fd85d9966b442d90c6287887fc0a8b8d8f74a59514a20d3eee5c37d2d1943cf79918977c91bed3a81d2afca99200,df5d8be7d7921efaf0f5eaf8dd4e193b4d83bf4f0fa2f24b5419254bfb2fc50c417be0990c4794461496072b66cd41d31e57062717d3c5d293cb4f55903123ca00,d917d20ba1933ca6ee4c89a4061d472b60d069dce1ed2529822c85bb30be20213b9fc6ffbf2fef17e9d81343a5e038dd64ed86fb1213e44e2144909e35aaa73c00,5827963930fc5b6cabf393e4fc630b96ffa50b8104c97de5d963e5c2eff6de6c4b1b512cd1708bd8d41c9a97c7feae6ec263140b362f2e6f54b8f8481a648ccb00 +6f1d04bbc27201ce244eccb442ef54e24889954b5a168140f56fe0653cfbaf799ffe32a058fd07c8ba76b599b0dc5dc6f207de122c273fc51364173106cccb535beb8f05056a5dc6141f6e7cc59ccaed0f4fbb169c8c9761f2acd45d84846499ac9fd1b11982922f502bab4fc40cd56bf4cb260db950b77115d5c63a345c5ffc46e0eec4ac47dc1dab89df653182fe65f9e9f8abed0c6a7c253d240ae8251ee9fbc8a920f289aeb43db57c7eca4f4c4bdb8d8a655d978a99b0e930cca378a4743f914319deb12b3bcef576f97658364c73ebb99740887d62467f09ed036caa6c4b5129e23a5a7a0ce18b372681ffe6b3e89dab3b9dee11218d3b84b828fa146c67ae376abcb35ded6ae39d4fe567c38e53acc91d,1b1fe3f2d5fe4fb7a674331943fa6cdf222421cd16b8c21f18d683e7f031a54b,272470879635c266e2b1c063a2ed6a126d9db9ef07ffc80e9112d26d66fd8a9f7c4ffb65eb82d840ee2bb66bd4cacc5bf1834f0998657aa020b2010a83c0d4e201,a30f8c238ca4748025d14858821e16e79591c09d75446a8db94ea819a12cde1c408121426ba8ae1c89ec166e7995098d28a0afaff54b3d6a0c2625c8578ce07f00,f051af13bacc4357cf366e1d170df346426694fcfa6a16c24abba3e83658e7c6274206430e08d32409bd4c819514fcc7993f4976c4a785dcbc0df995b0f8396b01,e1919f942dbf91d42b3791503a3cc542fb8be083089a207c5402b5eb18ef709b14f1b0641ed0c11498a7e29b6849498d3e28417ed0bc483a69c279fd3a6c6ccf01,7cc72bed703ad54f3e4f27371af4821284031318ef0c82d340c3f3f522e6df5d7be5a9acbc3278fdba7c97e88be5c45c3321eae22bf44fba1e9e0af2d965d97900 +132432d40f8a6b45999f257c69d36c285574bc80feee93869e91f74d31a365d8d594d187a9770dc1766d82f1bf927850712d9cf86405b2ea181055e18b1374722abb6dd71c1ea424a4d9ba05054e6dfd818dc3e2cf4c76b9127f1814fb1631db1b853c506c672da0b08abb017e46101801ddf462be90359b7387d06c0688fbd68bde8888bf96edbec34f88810e7d3bb30df5e2ed3b928ff3632bdcaabbb15370936ee64adbb4da4317b4362d385d73f36a656beefeac4bca84f2bfdca239b49bdf2e4cdbf224aadbce90074d9da1bf5e98ac26b4db524986b979fdfd609a44807f74f0b18b43094bbc32a56dbee1af2c35aaf19b7232720ec86cc8933d55d327e7ee8d519d4d73de0416828e3629cd0e44835e93ef,9e0f69d936da6974f80007fece58a1eb9afcb5c84480a6180bfaa12f2c1a4acf,53ab79db6c13f08ebf2e3a9260585a95a42d32234286f7a50ffaeca2de4a3e6a16dd01f5d448537dd1f0d88d81367dad8f17fe9de4eea556ba7bdc6230ca156600,85ce20cf71c7c730ec1fd5ce8dcc23bed098e538eba0a4a49742ebe512ae6ca91a723c8a8cab1d165d13d1950c661a3715082ea4857887fad1b3149744c3909200,9d4218d7ce5668e104a246d3f21baf3de33ae5dc7bcec21e2ca02d2d606ad4787a0f3f50ed99d9861ca8298ffa22d785922d232430e6b760072d353f4c9f469101,8ffc4f9855758e3f7f0f855202d5356fc28bb206784d6c191941b327216f022061a388ffc884de4a7c3a68d183b705c3ee148e6accffdde75d18f5f81911b4c800,233c8636a105e9a50f3de8646da08c77f10556bf80c3d3302c181b1d6a986bf84b98ef27572900337dc1ab539405abace05351587dd4a26903f688a2ac722fe701 +fc6b9a6eda8b29bcba9d72c20846fbd9d3730ea653ef3a625a218d5e04a2bcd6ddf64f563a2d014d14d5779a5f19bc4e6cd345787d62a544d6131d8f836a6b3fa049e8deebbd5cceb2a0842eef44b14c333fce26d7613f55fed7d76157a861f8ccdf3273b80d4c3188e2ed96fce52d6f7064ad4dbe4bcdab7016bdef1bdccb47c7cf9bc7d700715e168c693017cd6e4199b017d2bcb7736bcc1d6b5bcf212d73ff7f51e6ad9d424dc802b641e387fc8fc5565e1fa6cce7cdc113327014933d6550806a2129aabdd97c3ac0e969760a77338f785b117e680120b7494a72fabde02df3b4723c240d3efe10e39710b8871d105a2cf843aa7c804262454a0d5d353a6f4d094b0b43888b962d7fac837f108a16212c71fe,47688c892ec1adb1870c6297cce22cf3fc052e48c9d518b9cce257c91f2180e7,a9631a24723fb540c69bf08c70f0cff086c71ee7cfff6c94a031f71979fe272d02d40b66e135d5585d0217f17e5a23299e56ec93504bafe51335c5b063fb3cef01,3213655b9644b99ab2fe93e86206f1834bd842c38e5172917d0754ba20c7ea60287121491db8964f25de2d599c853b14ad5f3ae33c8c4db5791690c651c67b7c01,0ebb449fafd776434fbb10673413dabbb95bdabcb3ce34bbe8e009434afc90dc082d535d3c37656b923431e8fea09b67319b6f60d2b78c231940e84f7512df7600,de0560dc57cd14d10e9414411fc405e5df75c835739c443017808d21e957b0a50b4c625753ec4d6eda0d4065dd6423faf85783397ec51573101668a6b85e066201,abb3750524e619ca63835923b877fc6c193775535272e792fb0aba48b471c79e2b26816559beb4865b5e7bbaaf69e0c28a6b613ec6a66ef3b3d992507041eea001 +50be8b35a7b8d8cc87c7e0e89f2df45111689932c26975917510f8e33dde4f1b6627b6c63bf53cfa53afd6feb7f40dec5eb233b6f5d991101ca88ab4ba54767da838923adaab198229118da6d57e461aa56fea7031f101e06f8d02b35aa539522b30f150f52b793a339d6e674db10005547473981c3a612641e5de1a68fda49799169de2c487afd6233e5ca26b52ee4e2369fa9c3c2dfcd84ac913cd9b5928f4ca7a613930b2028171ef7ae23c393bce6a00a72a330a4a65a57f107890d7bddb740904dde56546f1d65652ca1dbb58626c89a8b7056294df6f501b2eb00ae061b7ff13c15b0c18a500e5828670ef88131743f365725a16a08ed55051bac3eb134e0a6a35279e4a2dca5c5ca6b68f4266ac2f25e36b,49442922fb2270d889367a110e537bbc8b951ab0c0c89d56d64dd82a90c23447,3410d23031c930b4397c0deb501278629932214a619731c7717ec71a76f8956d42ec308f0c374e2179541035ece41f02e8c242115f32a8c78bd7558c3d6b57d301,650fd763bd4c0719c09ac28b5c36f408d4e36ccce0f9874ad1945560be4840ba3c856385daafbd524348def7d56336996d6cff3c6d597c470eb28edf6c5e62af01,5c8c486e0dc9b66ead7e7a38ff81622142dd5fcaa97934be5ae20c2ba82541a9430aced13df5561d06bd373b7f3ad7772a76a3b75f812d8dedcc86bbd5eca43601,c727bb55a9f9179ef6150b87ada297d2ab0d61f1b550879e092010a4a8edbfac32dc6192afd2eb9f1918b75dd82924c90631645105ce253053c6ded2cbb8ab7900,e546df27e60a024e22f000decd0dbf4ceec4988385d026e008d7ab8a6d459e86667aa43fd435393560c320cdf654d19aad430cea23b0b6cc6f4a1c786584c1aa01 +c5ed6da64da0650e17d4715da8ca083b2e6124e763e312b56e4cbf525bccc4d9fc6ef11af77a22684d712df1e3d82494c3a2c198c407e250685bb38a70fbb3da2551b7482db4c4913986205cc60f5d3fd8f6ef5c9694df46d8c6ce640472edd7a5ec86d093d748f772b7c92c1677705f8a7d350da24f0ae1d39cd38e5aa3802ec1e745ae74b8770dc4392850e113ce2fc93728656e51bc5ef4a70f7167f52c33c959caa39874605aa6db061664ffcbe2db9acb712d48267b070040caac33cb3aa5f75162b6dfb47c950241e2c82db35d9047c4caae310a36e2a8012c222bdb7609bba99362bb137e99ef86f0bb420db9987963463d52b7b21641d6ae1f820f15007b9112062649104b9217772668c150791145ce93,40ec401c970056d095ab04c6c69bb6d991e68668f1b40fd81ca99b48ae859be7,a3c7bce61c69b7cd218bdb18c8d85c10d09ae1d9882b42844b429c2a98f2edbe508aef1966c47891a94f4f7446f8bd1864288c1bf36eb2286636a5e38d55a34f00,0b7e51b86001676ddc6771b2c8dca2dde64f2d8a83eb89178dfed1e39d5f7381314d5c227347c54715b5814f9a3cf908b41b21868531f62f71465c2eae001e2f00,0067e90f765776b855f666664d6e874e3611c3eeaa286ea70b6e2884c87e5a4100498f5a46434f0f98c3e41bbb37f619b6ca37732444665723817fa3709e198800,88c4a3823b17503859e55aa086b3a23d77154379753c33245b9ae8ed2f5cc85b1188ffd4313d4997cd0dc3c9df5f55a347d581412a5315ae591c19d3518eec1501,534216688acea6f294b51ab99adb403324cbb9039f99fd198cbf06efe049888311dcf1fa7c953f39917374f49e633752abdc31c4bb9574750224dec855a697e901 +6b5842bf8fb52470553f6fe5689de541e7534812ea4950386fd1a53d367844f1fcc78ce229ac2fb34ab526f1592e82eeaaf5e29674871b7ec9a7b1bf74567b8012c9a4f74f8fb9091244cb1f4b40afbce61894ecfe38f264178f6a4b7dc78dd878093ba2188317d72608e0399dfad464d72f3eb0d40a860424349962cc131ccbdd762b28544c49fcfd68ac2aeea09b7695569d523de31c2e086243a26b69f95cd894fac9e2c01259235acccfdc79608193bf4d6af594f8c6e53235fb4d92e52009b07069a8064d7cf2db48a9628cabe32207550de3fad97690c6d30062500e209ba9b5aba602e8c997dbb681e3dff032905b5655070862f7d65defc6b98b64d9e42fbe3c396ff252aa3e6a0216d9e25c9bcf297c71,82fd28255f3a953590ba7225f9af2d1855a191aad4131bf1533e55d9a7637e95,426502b4e8185c6d26c29cdd1d91de4abfb4e6288534e44f96b7d5a8e54278ff2bbd02d3e641317ad3534c12c718898f60cb0aa4a69fb66ba5740a9e2558e27600,a3f798f15179586e915075436e9a9c0066f9a869def25f8dfffbd5fc1fb15da126867379425e950f1ecc7ff99456f96243d394e18d61466bec9fedfbecdaa77900,3c2080e1873609e7172db84846fa7408e7224c5ee1b9903fa79c91c8229ffb6509c83c2361d60fea788848e3748e7a2488f015dca688ac4b8dc7dfaa88488eb700,14fc2183bc1dd5ad1a5e2f28067ab68bfd53cdc0dee1da9e4014c26ba773328c3f19ebc9ee6feb722577611fb1a82dd04d06ce889b535f8441c831d1249ed1c701,9c6ac99d958503596007948d4aa38ed8158ee36348cc5f7f4cdf5dfa05097d912806ec0911d218fa963fa5b45e4a959c624c2180a4afbd400bd1bcbdc377158500 +dba6b22dcea937c61c16968e0c85ad8cabe6f1901226a17dad18672f0e7d2bb6cb7d110cd3f44101b27fedaf606688ae4ad92d13a3e6e0d1f164a9c642111ef0ca4748964cddf1630bde07e09241878756e0e05d5e95b05f28c883ac0e89e48219f664e89196d0bf89bb34c1a155cc0d7a5a47e9265c07377e123c2bffce45b489e64257cf0a9be28e013a2349d7fc243582881262da133c5c0cf8985f7378930fe99d2cb547cb209c31fb12fda7a82db11f341238e425e59e84a3c7d92c310b722522154c0be1d8b45747cfa58b3e4111683c094138fd201458434c64a37753ffd7d770109473b0f648eb64756c845f4bd67a803d9f66d49552579dceff914e7361d1ddb0a92a6fc641296520ebd546f40650cd31,474371cdcaf515ffb8ab38e79ab8e9163e73487faa3ca633540543cd7ade6ee6,8b0b71ea0b94d7beb4ff668a8a0900fff5564fa5e8d4bb39126724c95b98cd743fdd121e21f1da0b3ae26a7fe493ec4bf833733de75e47e5c65bd6f749b663c300,767dd4ca27018148b448cb58f1ef7ee25fbf9c6ace114aaf943493d1e3e1ffaa3b90521427939c6628462f83514eef9e1f489b3c1ce95a1f6f52c46a1f3a039501,72d2a515ec4c3aafd0a11035d90c02b3a9fcfb30df160338eb5b112735dd65920a05a8b2334ba6f643c6800bbf2ab827b43b5ca7b3c1053e67d716a2cac01b8a00,2fc1b4313da30de216667293e7899e45e39023217aacd8d7ef39a57059b89a3b1578f9c422e8160d16075e2989870fd14864044980c5c712c6f494274388fb6b00,212dd6eb85653dfdf40af68f3132b1233020f7c5b07711c1510215c0448c21d737f06278d974181b5544c614fd5476243c20c2829f32088e9d3c939b462b6d7201 +bd64b8b25d26a1533ca047016185c3d954fae0322b3072eee824c9c9012a737a575acf0f830f4da01be6ca72344b4cc14f98ddd5265b31f3e983d8cbd711ef137888289fe940d2f0c728a384c825b98da0f527ce0a83cbedbde8e08594faa389677225386f1228129734a62237b9ade818c67ad0a4a19edc6ae0959bb0ef8a61d1fe18fc1bb15f6d3a825dfee47bcee476c3055f802d9afbaf014c00faca02de3ebeb1ad41201755aaab349bdf5a59c95254a1931c0dec3ea197cb0410d144232af545f8b1ea34f661abc7c2509e2c879ce42920db0310e9498a7aabee29f209fdc2dff0fcd06e6e960e0f748fd75968a091c8d87b58681ef43a858a90c49b2e5264e526dc6fa34d236a05e532f72efffeb5a35603,10a110fe30d0b6c75ce6c184fc768f624678066f82cdf5c80af303ebf4d91be1,16622a7c99c9e36c534e05e9e248a748c40febddee33055842bc545a388a852c1adc3bf7c7c000e612799e67fefeab12f35846acc0b086252488d6cac8c3561701,49d24d140ad51bdfef20e9c4334cc19fd4515eedce507a6d43f4df1fec4ca8f334ac5d195b706fc08b6395e745e8808174e4b9dfd03a8b311b44ee79bebcb7d801,c5f8dc654411c1416ec9744ecb7ad0f6395585f8382d7dbc574952bc6b90cad10026dcbeecc0ac0e1206a1525d56572c54489e901a20799e4347565f7783a62f00,12b3ff829df0200928906984e1edba010e0669493bcfc82e7febaa5bd4da63d25019a052384587cfc0b2faa521f3335e7c20c13fc79f4757817c78b0bdf8af3001,fbdaa278a69a7b5bdfb6ad306a079991aa4b519a04677580cd760662964dbca54394c956a9e2b24acc1d5df668137b32931d740b42590680c337145e49ddc68c01 +30d54ba624b018df109cbc25bb68d467b95fac4ba2c1f7bb6870dee3a410f626d568f6208ee927869ae9c1027dfd01e63b20d10ac76dba588797dd4507b33a66f3d7d9c41e45109cf461e397d515fbdcf694c898e0ff2d8d121b75c1947ee1e451ccf3fd0624c4930e024e0e9a5101f305c4fb687b65be22a7d1fe4ee7d0c598917c8876e64d97d6cd8210c96f73c8f96d0818f1e9a33f17fbf2ce8f6ae6e7936d5821dab40f8370dc1685f9a513d74267fd47c440756c779618051fc4570047dc7b305cbd5592460509723a20fdc046b1bd32dfe035ac4624c25e2f056eb7cdb2bf8ae82a35d7cfe128e9059d6e1a0c406eb9fcf77f5792963704b154473cd842f77bb2dded2e5e3944a1a53c5c40e83528c83a2f,9bea5dbb072431384eb7cce6d2ef89eb98cbc0b1af72449cfc37e704175e6870,3c49c822f1f004327e3f2aaf5d0d67fc9c980ff15158c7e8aec2ae611a6caba74b0b7e989ab7b155a4f2fb0971e532387c3655dffb0848e1d07e61d8bcaeae6f00,bd7bbaaaf19770babc58411f258752a6ea64a59cc7a4a8b765f036d6cf3b527b0ef61104d25e0a713922c018bbe3c029f257887f280495028e6b9339b773b97a01,fa44c6cdb7e78a08c43bb58e9c9606a47cee30b77d39dcde180827c2c16ef5ad372f12574e99d2361b83acd35c213165e2a8e81466a542938035e8cbf87d12ee01,9c41f04548dd34cd492f6849c255b00fedff332e79981901aaa8466d298f6c59428d9c266ffbd4d63b8bd28e69efff5fb2d1dea15603fc720f1e6f0154ff87e900,93f4c80bc4f0322a1bfd26691f46a476b01df59681d558db884a1c5b2cf689dc54d9ad02e57350cea31bcd2fb88ea43c954e84bd8a37cfe197d6b782c7812f3900 +f7b092414d9434280fd3a8cf494913606cea4b857bc5f1caf60ea90ec81f9c983ee43b785f9420a356c64be09f8f4d6e33e13ebc7a4e35a57509516c8416c7b2b26fc3c6db9f93be5cc87457fd82c13ba43358a367bbdf51ac2933981b22193c9918143566b3161aba40a2076bcc3cb383be4a7de77ef8c2009d602887c450f450b6e80fa21373c429fcff3af77f7abfae0ceb1014ed57dfaed67044a4a1ea5210e2c7fbd9c94c028ece8f17e4eb358727670af65ec99431abe20789e688e4c9c6a73e0fd632b7bf1caeeb1f75a67341f77782f0bc37e6f64ae11a5283da568996d9c3436ad9a0b25610dabb38011fd4b9940acdcc082d27122086dceb7440d9808cbceb73ad62794773ceee04fa534decdec3be25,b7f714a77e642fcf0ede2ae5fec397c8e6ea9fd7b1879cfb30837de35bdec5a8,f14c28280493a2a1b78bb47c18de3243d59363b1bddb58807e8548c5d47476d54f4646f8a1a6425f3e764dcb79b33fbf30df47df02bfa44088ef805f038b32c901,d61f76106f86e036be4caadd8f01159917aaaced47366210541d017d7e4a56003d4048e08073840bba0ddeb4ae4d7197257617fd4ea810daf4386dd3af0d6cfe01,fa65845912fe44f6ea2fccdf63bed01477c65f0e19a10802486826dcc8362e2a10e9c52d8662ebb08f80b19009e03a629574b7146c0fd533d4f45baf3d8e86db01,6c5f812f387c19c4c776c55273992cfc44126615e0fc90888b19aa35c97165cd2829ab7f25bd5eec369225bd6cc032e895c320e3bac457ee6ebb7534833f359a00,9081826cba48fdff8b807b7a78668c10ddd43fc88c49de7530d401a3145b8f7204a983ac18a9e20b667f0411c6323a21e67d9ed3d03af55ace95bc145ee10ebc01 +b100fd91e5770cbf612c37a0c3902867162dfe25bb4e17f4031d43138dc19fbd5eaa013921d0025ecb2e0b6536ab1eb2c5518c324c4dc7104762872f6dd62552ee9495438e9cffcdbc9479656b28b20a716b30c5a7954614bff30ffd06c23fe04f23dccce9ff9ec5448b4cd1c82b2936a6d3408969cf90b578937725b0554e876d33de36de7c748211af3c97472684f2d7e5c0ec8bb7a5fd5dd66b043d5ed4c8bcedfdb6e56e15a562d9c6ded03da1b9bd8f6c25ea66f9f9bd816d33c8f7b71e9af712202b815a729bf47c7df8fe77617c24791d85772006c4b2d4e7e76f91997a66bf67df1dd492da7b3e81f1ba5927e238f24a3171933fc337de402aa1f0f0707afd76927ecb0494872de9dd466f35a31bde3196,60c0bbb2a8994d97a4acbc78d5a1fc6fe02461cb0eb55f33ebbfa7368db1d72e,c9e67e74b56b1b9e4a8348d264877f8c4bbd844a05e2930c9b4fbbaa2d43661d43c599a7980201aafd175ec34be3389516bba23eb08c1c48d531db67135e522200,7fa5c863ebbd3e94d4506c480a6ddf0ea86a79b8965bd3321138367e56f44af436f2c455c9bedbd174de5d4d63337c88d4c521b1467cc30f03ef40f6704cf30401,bdce2f568c05a5e3826656e3f61cec766b4ba4b7003ec2e84c20cda11d5d5f6a224a0012550eeac01ebae6fff73ab8a8e86382756499f4b3c5c561bf691227b001,a841d6672f464acaa54cc2b52d059fc31651322b4ae1d1b84eebfe0427538eaa4244c049c05147ec160f6c8c6c59f393a997d5c8fea82c46a492f3110ab7dd7400,5f470db04e2eb0504e1f7cbab72752dea249540c6513a9e669edf8d20d3147a772b78976ef9f8b86774e56fa10445a123e90b5577c471d71f3d40690c9fe530101 +f615bcedf4eac31dc2391f1758722be57f7b2b7c41a0bb2a1c1cc205dc58fdeca6e05a6ebed5ec78bc41355eb4b120bebbd8655f3ca23661bacbd29df12549b8f6f7f151160ad99846decd3eecc3d7a0b663fa2e32422d9253d4f05b93f22f658c8df4b79e7a6fe4f70f7f3fcfb670d543ad17abe497a63861056bb6fde28e0bebf73852275a61f64594b060db7ba7a4454b384678a1924b76a09afff0cd8494bce17b814fd3ef5148b661fe94b3e6477577ccaab3180307d48dc0dad1b65c670d61209fbd810ed2a725a6eb06e6606f38ec00dd6b40e52975910db9f71592c67f90b7211030c5e290055df34d9798c826025b8c699a0c8a06cd16f4004ea307e9b3708e3d8db506641585bb22f9ad6468bfcb0b1b51,4539b5ecc235f60e7f35f66121976493c48c56f75acc5031bb63715f93a75fde,1ed23c83436950d6a50ca9ed39e291b55692a0a2215f05dc291f028e2eea9b545ba428013faccf07db648a9ee34b0c2c24563f64246da6b5759459e06868a4fe01,bf0b62aa05abb070dd43ad1a87e7ac0f603eccf60d5510678ace0043ece582551f18e44b88bd5d7ada830a03a2f895ef22c17960a5a32d50a7284211fb4ecf0301,80ef47af9a08b21e394a405add33571e7d1e02d0d4b95e2bcce225e25c25ab24463ae569e7d9a9cca84ef93f676286ea5b307d40a282fcaa7de149dba1f2dc6400,2f93ce018018a548382b989a9bc0eb18519200439d5e17cda58c446f6d79450e59efbce01f2e44192e86f474322f2fd6fa4c1fb9bfbbd9b053b7a8fc4c617c0800,fc644d4084e7996dd7c2de39b57b65d7eb50c758f2ee44d32ce10920b3c398e7215904f1f8cd54066cf5d1d29d799361693dede972269b6f9110ab5fd25f419201 +07e3c257866aa93b71110d966e48708712ad98c55f9e9dca29f08520a3e11b8e510d4d7c66c93429127db03351fd17867257d740389c7303894b71eed68d81f3a71261a9a183d1bff9441de80e7a4f5fa42d4542fd0fa58aab518a55ff67a2654be4c27deddae56f6aec97e38a6de2239c9e386519690c07f9751e6e808fd40d7aa0b173c36c865a40aeec10df4fbaa64779061ae4eda1abe2b0af5d281ec47bdbe24444c0eb25330cc0259ba167667b8f2e5b79143c00d40036a619fd04928843e4c91237691de68b3941e439ac833d8fe1769f8f71290d3c8a0fdcaa45cdf23ffa6e4ca5745179f95361ed79fe1c4777f4b06ae224e7d5a22067be069edb981e39062b5567a4215ff29422fcaca626ff1f8b563a39,105afc66fed189a10826ee38b0c2403d6fe8d2b02cdaf60aaa80f72fd8858af8,6a7318b6d82ad1501ecc0760a40efaec656a7625cf3698ad7f419da47ab7f09a3ff20c5d81394e9f48400bc9c57d54dab3f05430e10f2c525192e8c357e908eb00,a4e21d72f6844ad30b989eb160e26ebb76059fb9cc84733d9c634937c859c82a5ff7544715e37de8f060ae5a413de1be35a56d35f767cabb743912d531e4168e01,cc42f143c224258a275fdd33bd999665d1c0d765d8e3b6f6da228036dcfe4be37c18690e6421803dc86885c6625b89e503108dc8acff09603565e85df6578d8601,1283d5ec74e6c09be6776eeb2bbd3a3f778256ee546f49c96b6b7279d735376243941147eb078f9b59cc9dbd00a9cfffbad20bfd4de0ec6fd5e6db70c55e5c2d01,a443f75cb69c1b498a986ae4685f7e25e69da6de84c5771deca58c9f077ab2921e9fec04525cd48e2c041171dbc79d0e450cd1cee3e318bfb7f0e229e66db38a00 +56091987ac4f534a712aa2f1c9607bdbf1922a73a818b54ca019571dd10953d74cb309b68a5132703a5e3e87e7f7c668373a3518120cee21b71fa6d9e046eb90c3aef6bf917f6d425aa2350f62dbcac1236a4fc53621cec94707c2444327f950968d99262c253e5224f438ff844a585b44316580b102b07b54e315dd37597e77ae790d44109aa107d7219ba16d05583191d2558101458499fd3ca96bc3f5c2f3b4449e27e070be3bde85f15d737252f2c9cde4881b9a81adf4b5cfa51641a39228d146c378b4e47082cdfea9d4cfe0c0d69ddb398c38f2fb0ddd8f85b0fbfaa6b140b66e30cb9160f566a8a007fea2cd6fe51466dc95602bbc3eac904b51fba09d8694444032dea57261a414db3ef7b6d4f08485414a,14ef989b857b3805075dc2b02ae54cfa19e14f5b41a5343ba35465bce3fa72be,2c092390dece754218f9875d3f623e9dd7a36373d0b91d43b91e02fbabcd7ac016488475506789eaf2f916898d70186278cc1d75c14b5801eddc02cfe0e1b0e601,5358404b2e95374ccccd47e9e84f7c995c82660cf147f378768a40923b4a7a5c5576bbd5b88152d07f54938f439dacb9a2beb6a9ee2c7df011a59a76de5fb4b401,2cf8251c5e590be2dc1dbf012bd366478073368ef38a086314bfc3d5b8296b314e5d98d21409c74b8eeef6bdc30f7a109239f4de868182f319388c45d082b1e300,d271d1d65c9f58d1afbf050745411a43a4cc719f48f64af6e2038a0a0699078229b3c18ee807d6aebbaac02a9bbdc4ef01de330de7ced381e83cc1f441b1800100,165ba281f5f8106454f6408147eb0d262cbdb6ac2e352f10bcbc88e419d0a1826ac06dd92df66bee51b50dc8ca8ab56f537c34e13501c44ee32bca0218c3164900 +4a4ab0eb4226b7a30157751818306b197eb3f5b84e8a1bfb3df09e2f4da871fe364b68e300e49309be84c9bcb95dba0810100368e9d25a87c617900e7968c6ead0c415735d90e3c10ae1366b8de63c54d510782d6ca736bd70c12f07f493c7364ff9a16095837f07db26ee98378358739b3ee64dc321b6473e8b23053bab78ebe1988f32dfbad7f96c862185972c3c1dde7a72ed40fc428e47f8ee6263d8164c3ba6c6b0132d06a80b2ed21e2fbdcf1d71839347a24af8d848e203d347199d972467987e41634df20ca27f47e29fc99313875f3cabc9d17e09cba44be859736aced5f99e059cdc535ba8c0524d22948e1e6cde069c575e01449dec47503b0b04826b34ed501e1d66d406445f7a58130c8c2537c032d8,02ab668c7d0c9b08fa3dbc81e690f57443f2f9c8ad63c2666d0764e7770a5c81,1b3a2bcbe9943bfb73757e02027fc9488b9de469397e91b0b24fe97835545f970e2843c345b8ccacc21d1fd49fe6137876373f667290e6f383012777b734dd6c01,5d86ff641d2c905f600204f50628ff15231841cf2a8e27e76b1f62a43b06894b2b20072b262224c99499505955d699c712a3032e9c5373fe9fd580029c8909fa01,186b155db506b98b36d4ae2190b52eda5b77ca3028613e806a8ac85947149956080f437dd447dc24fac62d421fb2ac8b56c25f6159802708cc47d5b873abe23500,115059dff2f6813e6ae969de4cb256e60573064ae35c7f83c02ff6a1a729c13d61d3507d940cdfbbf7cabdfe4ae8e6ad45f5513c0623f7771bb0d8ef5c231c8b01,ad733e21f785fe2b3a9fc08d469f236950de4a65c1067e41e5f561eda31f235b4cdf43ddba3798e88f4617a2c0dbb892cc861c03616e01f0ab52db72d342fc5001 +47a943e5948ca66cbf0fe1848471ef0e077a1e6d652202f73d32d84e74335a73aaba8f4e4d2984fbfe178563c26adc9763aa5a2ffa95ea4193a2f5a9edda5ac910706ffc93e52e220c73d74f2ef683296cbce792c36f668bb42745da2f129f20b17577875c4306732f99eda1b48432748a40a64d020caafd56b2cf8489ed1aeeda83429c9c247b8c7173bf78a62967e4abd2a78f4a48e6c7da1875582fecabc5e998bc69285355f57722038dd37c781b82cc811b1e2a5dbf5af0cbf94a14c26419bf18f28dcaf872f70eb4d20d06dab50863f28b55d6f4d6e3e484bed821308da57369aa716a003684d4543db1e2d283ef8c5477a16f07a4c56cb09cd4048760a05abff540d5166c70daa47f2824b8d78d5fb8be3008,58ef7c5498082cfc69fe26f9f1adad371a44f2c63fee9c19da33d3b2b110e07f,14bce2ae06bbd59ac92180d0e5d0e7cb11e9888dd90a5b4835c15b003338e45034071a0ce7fab36153c0d5aebf1d30564235abfd6c73677960a55a2172f3f9aa00,e545ed714a3bd66414fb8fe56c814bdf1326337375e081172fd0c96b9195ec063cf3d688249f01a7ce16f3a4a2c27cb53e954de1ab4b8f6cfb9f5cf6ea676d5200,00ffd84b185a48eb5cefbdd0ad87def3bab7fefee1ef7f816a4c5627eb80587a6bbac9d9f088f76badbdef07e4a3cfdc1acb42f1541a792185669ddf6e46b8d701,f16ad70e5e4fcc95309145709c4707912fb0e9c19ac3d6a18e593e13c7f5ea82763f90c9d917141fe2c68065e1352a721bda5f5f5bc10ea2c16725c3a52c3e7f01,d15531f1d91815b32985dc256b58e56397beede11ace3d36a3ccec590af69e0d022c8b16c71eedf0b29a159cae91132dd93977086d014d104340372b5af7fcc500 +a012aa15a8e6ffe99b73c3c79d9ea91238586ebee7b263dbf237fcd2388bd04e9bd4fc7729ec3494051e8bde6d214c5e6f93ca409171756c068733d2816a60b086837ce7733a528f6ae3b545d381746230e6171ae451e6bd16b060221ef7adc8a36f1caef9a289fe1038775ebcc3d4b960c00e40ffa3762aba3dee36255cd62e9a412987b7df78bb1a211c6734e7167f7bd551fcb7a0f7f7b9d899d9db59f42b16e7afd9fefea311582236abc6d27bd18d0dd6b4f89fdf26bd49410f3c9c93d1021d0ed377fca418866ecec6b676500eb92f8ed689ec5e43c040c042de2435e17b2168044aa2402a8b11cbcf5cf1fcb048da32750e5fda46bea88a251e07a2cab452eb1ea403ece03711eb60abe8576ab16035706a0c,98ceb2dd8b7c082789d272e89d73f26b4e9de9757c29d7d3411613125e88c095,2c4e171c699e3419b0e0e8edd1ae282bc196d47bb07e3d25254191d6141e32564b8f21e94c895700f6a99b1d69a4445388f209727412ed9f46dca63dfa2e005101,2524d7369d22ed2433344b17fa9fd520892acef1492837180f0ed603b33db5446380dfaa95aa0f48c143aa206e71933935c3bcf0f518d166a580ae30753ed56501,85682cc31d65dc39767438a6308de97b727d951faf2bd20ddabc7c087e2a39445bb46526a726b17a6b96042e82c1b022101280944ff56b6edc1ff312223132f400,c0954e220cc3cc53356b6f55ad9de3356d78475e081a728292b60cf52129437426279431ed0197f085c9fcf5a01b009afc63d9055c1d307c21ac001d7f58bf1100,bc833dae3fd39418a03696b8d75169b718d60c138fd9e1d2330e59037e45613572302692de60315adee92b726eadb171c6014a538c72e4744140c74520c58eb600 +0839f7b80e4557124b59f02eb75e2a255dfd0059336095b7e4f0256a7866598934b468461bc95da7fcc996683ad83efabb528b3c6c5234289dbef367dfb9114271e648293f8d66de0ee52faf329b6b9644b8274027b3207499622ebc2194a744cb6d3564ad6721ae4d374fea99fd421b89e52e7ea7817a4df77529765a37a513c698597e8d0420c27d26d29fadddc10839f154e6b0c7b35644a9cbfac8a80b8d4b75f7277112ccff93051cfd56c7deeb682f6e9ca718e506dbe11fc835afa09f312ccf1737f62a5d69ea0a58a1781d4b0e33f7bf37987b5c141aa79cbf869119c6df3072636742c9466bfa1e9e2c994df04607a61e115742e7fb8c516a17b45cfa0b87dfb64952c88fda4b15f6d5a0e7c90c444b4900,3c4d18a3aa3890e650d62aeeaa2fff369d015983454b6e4249c890f76c694212,97288fe926dc5e54f78fcea568557c8f103c91f26acae59958b8cfb66e6292f45eb41c4a20f07189c2d3573e214e041e60e256a25d8b9b4a4e9f37ce0c69f7f600,19d7748ef500bd6b222f3e7cc6d0330974a528992337d8eb336cdf2bc4df9dd51ed50149ffc6f27e4840a52df4ac1008626904ffeeb4040e7977f5ae29e570e800,5151d6e8a178d2833b656847ceebd3dc6f93a8f049cb45f06605be23443118565aefb2fb16c854318e23c4fb87aad0b17ca0869dfdb3c9f16efe5c8c696a653501,a490d4f70f2528b1a7bd3d718133ab7e39ba4f8225227ec322909b5fa455a81434d67e1880d7208cab935a7c80ed7d39adf100a522602fbcc991fd0c75cc8f2301,e26b3915f32eb71af138ce7a5579662553704dbeb70373f73a6db64b45e513112732fb234066a7b14dc39bbd9d0624a6eed8a92e2a39e714574fbda3bf0bfc9c00 +2c53f468165095d3bf02c3ff83607052d4a000aa32bb9b679f49b3eef48825e050f0b01b7ca124dc930877c0f1103e1cd1f414d7abf111734e556a501cb23dc8ff381128d1c12c18c3e5769a334364a882e676dba479a0b6f96bb51994bd08d432299631d7bbf9e47576295b9ee24e3e1c9c18b2b7005287e7b27afbd2f41ec3069938b26c127d7dd7d289d70d621991644a5c6bfd3a848494e7d0a38f4b70a0a079bbee0f09cb762554fd7bcfe22212b1158b88106589b2e5020ef9845c033e3021da2372179aa85515475e4c5010d64c9415fbeaf4f470ebc944fce96403dbf1708ab4bf4e38754b39346c14f42a300bfbe682cea25100c17b77ee68e77242e800d965d6ac5d3cb1fe733d3610900aa70940202515,12430b480682bf871c74ede96620dc67d474459f510710bb09d2b984603eef9f,c7575c60d2e43ac3cdc6d9c9126c9447eae7d8763ecea1405a274dc2002024341d2048cf28b16c5843eb0f1899d3b4ff144653bc7fb8be0b577fe2165ccb8fd400,bdbe11c841b39094509fe8dde5424fec2389cf90d3ad63adf67adb867e668b3e53b35bbd3082d186cdf0e78371b2763581dd950dc8d6116fad939ccffb93d16c00,96f79d98c33a4279bdc60932532e7b3355dff277d538d0e3e3957cfa353ac4da709894112b38be8e02c679f0a33b5b48fcd52f25b91ea40a787d1653e14288b301,3ee7292c0d395e4a6312748c8ab099af5c9f8d1a4f0c6c20e51158513e180bd323eed7c72583969d360c6376ad2aa3355ffc5b00412b90cb55d9a4a07a749d2101,780a6c6b1680813105cfb1c961090ba84e8a52178aea66ae958bbdfe82cfb9b8371227c1677e60669b5f4df52cd5f784fb9cf88ef77537085fb832219a775d7b01 +91bc416d857afd2c51eba74da760e38c61bf0a77370ef5e39d8f9bc4c19143ed7b792f6c0187b66ca25b04b55531330e8512526138b84684ef42eaac82585b6df5ca37b8c9c19f7a03a9a0d9652e5065385392d6a501c8432b4aa8ea94331f7b888e321371ed1c232e5462631bd8caa7ea66ea95e75d4f11f529df7dae60d74688480f438b51c927e2d9e1f183fad5aa8f696d425a0f0b0fc5bfc475e3481a38e0125cc060d33ac12c22a688dca0dd3b2286e9452e7d78f7a4255ed81e80b81e98b4e2d5d6fded9d9dcb9a00be2a0bd9cf02cb3e3f726be6850ed9e4dfa897e2efc4d57f5462950a5f0411d9a704287e503618c6231e06856a7e61338bf55a52a8d8c8beb5ec6b28b6b390f94cff850b090694ceaea0,7217b6fd1b97fb51a9e0fcf6886642492070d246bbd0b0b9b829b2fc836f64b7,9fa98350faf8d1c1f3ded77431bf149894c25378bd585af36accdca9d4de76a05bf1627aa9e8c58b3646b3a260dc6a57641f536be44468b9fc980c52550b0c6501,d4ab1f0b7e8e139af49e064ded2d076d9f0d8d3696004ed943c8479c828d7d912e4bb49a1f4921d84b9922433e302a61f89f0be532eaf287ca34c8d4835f555801,0596b1fc9c0be9e40cd1b23a329ac203b25c414a7ac5d7e44d504826c26004da590f30d794ad49192b55294b7dbe929bb9118326cb06b708db8746559b5535eb00,6a42f42fd9b635c2ef5f45757b26be9bfefffd446ff786f74bf0329f0db5ed8c0d6cde619973a5547c1be0bbc9d36b1208d0b9d1d723b02ab69882a6c47a226701,1d954019b26ed0a704f936a6652bde9424eb6d284b63b56c857c32a4d3f130ab31cee96a2a191ebddf7b80e0e0187fccf1d4680f6e4fb5c3c15b4f85b153977a01 +58c11d22efa036d807697f7489ee31631c6d9c8700aff0cb380146d791080619ff6c20c048c9091a50648fed70c9d68be4462290a4cf8cebffe24d3029eda7f2bce1490ac714c4acb2251f0ff17022296587938e20a92873124f398830ac6bbcfb07771f3e2e5960317eef2ad1b87f38876c8fec97242b390c7ce1677bc22022c26ac7b98f0ce8661eaf3c82be6ca7e0da46de3c6e1acd76705303c8c83ac4c55f63fa33ea9dda8bc9b9c4eb925f8a00eb9b271e97646cc77c6d3a8dbf8f57c95e7942a184627aac5ceabe48e80d661072b795d4d0b40cf808eeea8afed1ef47563ba384dba375d65a0d885f556a178fc5c64a616e659e96821c3443e0d19b11aef8cb0d99885c1cc793cde978dfb4a4f32aa2064774,759ff78d3f80e16ee924c16842f2afe139a49ebfdf3e56e51d89dad789c0d629,1ba46fbf09840fb5206991223d28ac39b12b922cf66003a346238af0b82605c059f0da1419c80e8e2317b36a441c1fbe25e28d0e321093e013ee5f9134da6d4201,84e7bc66453da22c2d040858598e61705bd7c3c755b3eb67e574f386ed5f8a552a363a371425b18746daf39327b5e30cf37c3c400bfd260af310e131c1597cbf00,bb92118f00d8d770d336f6e9122eb7f1d2062d13c509e1187477de49e627681d25c42555777ef22baf57d64012ad250ddd1ba83be1421e5e47636eccd420472000,26f6737e3670115eeb6bbdba8dd7faae00e0d5875af6636116f76588e0b70c924bd3d96eaec72b04206adcc6d7b76c5eaa6376be803f046578bfc53ca08b695701,e85c2fb4b7df5e67ee1b118f08cae45eacb757e2fe77f6d62c4e8fce14426f2c2ff4f26516274c1b70b9361b9b16c2abd5937741abaac1dfaafa58667743624900 +6b9b029448b53282cf88b7e5695d73646f69cd3b541c58b0020f35993213cb5ec07b28578e68d3b08e474dd030dc288e0110938f90273f5398b8a7cbf942720ac02e81bbe87a30214f6a1b04cc6e4099eb89a158efaf475b6a908014222219a35ae967c44b007f6ca838049a166492c35e67d1afdbd62cc3909aa27f28e139fb7e637934c346f62b573bde68304bf6586ff78e0cc1a8fc9ad482306b6e4f7b0e1e8e3239431b18f0c07230d7d97b40068a3c3ebe2a0485dbb8c512936b70f864d97b1425b44d4e3c77e4472174531e9734b69fabea81b31c71e8f8e8659d01ee1ba25f045576195f89b3ad2ba14ea326dbf489ecb589061c76e6afac84841168a4511fc73391fdc4cb12e260735bd6387875ef2927bebd,65ee58ff06f2b0c7e14f780272c18367fa3a2fd68996b9fcc084f07d30763078,7382d23a75a25b34cf797e0112d7c16c5ef225d5fa08788b55be0e50e83cac3d6f4dbed17e0db4f3f442eb226aa321dddb608fe52e62ffbb49f0951b94ae105101,e48c58de0b5c0069fd4b92bfc0c77dc4ffa616dfe4edf7582045a2cce9d39d283df63c60011e0228a90633d8938d8a4b5c8a2626144586ecbb9a3635875f502d00,7b79ad8375ac6883b587615086f790f5f1716c45518e6eeaf37c1e9ccbf006ed3bc2129dc631db48e4a34c049e4f23ee2b8e2cf74103fb3e1a299464b546174901,e4fc12a688391403a02c08b8683db3ed4deac31187f3d27afcbea93a0e60b3701f90bbd8a700350386f1d0f913937227c1e5d18e238b613be45226a04b1762fb00,22df9750f06fc668cb24e0ff1473226856a3e17d88b96b8df5a6780d2879858b52ff9258a389affd69e0a99c6e73e31b8b27699ca8fdd55752051e60618e215801 +b92e129e71975f668e6a4afbce0412a0e89d5eda176d3f7a9cbc9ecacc573ade41459d554dd0870a546d627fa91acc5edd3dbd003695d219b66de4fc95b1052c47de15c5e69c1cec6c71efd83771c26f7237fbbb065a9402758b6cfa75f64c5020e8fd8ba960ce7bf24308c7fd4f5b40b4fad2667d5caca2b4119a52a01aa93e8fac4b0b5d07cf843b712da885b0fdd9d25c062a27f569b8c8ff2404dc69d305f1e9acf71d19364788dc68fc0c65edd75884ededfeff9c06c6bd1b2c96b73cee185f51ddb06037cbb3ad1bed88fd0e08be9bcef7c13063a8327255b450f10dd3a8f6a8f7a7f59a45083186930d4b05dbcefaabd902e2736294ed1bcbba3373a414ccb58c8ba67b25bc68515377e1904bf2f48b17648848,d877c7a7afd561471397981702bf697b429adc7e3c32f8d6034d34d0ef6c2622,2cfd57733fa3b493b11aef1b853f932078804de560eaefffcfc73b744d1d00e70ea460ceaea27fe322ac23346ae45e7d2ab918707e1452d6fe374582c3bd0e8c00,c4bf630545c2d49044caee77b342b7254ff7e2e984fd446fa6d06781870f0b3132520a302094e054784491bdde63387bfbdd2ddf43f2a8ada51f5ca33a03b31c00,39e6a06fd8cd31707e787eab06e20c89e9d37056eb2d0ce5d7ea25bdc54579a8470cd83115abd7f6227e957feca3ec804a95306376b87e7dcb555515b34098f201,12014d32f4acc77fdc7ab06e6af8f0566194d7bc62a55eb69167d274d74822426839dd7222998d4f34a24f308b88e93b0d93c772dd4de599048ac34995f6718301,8ac8e8509d92b75d8cc682540b08e57fd9411969e6833ce86ef360d161a22bbe2aead0244edfb7f25ff9742cc284b4988253c84b3543d3431cea47069fa7694c01 +383e81801e53b2484207d2c61d709683a71fcb436fc842950b9c98c57e7eae182c58fef22f04c68d6e4b4f9853ff8849d3ccd5605edf2dab90545cfdc8aca16fd73a5dc6a3a5df83f5512019cd65e3a6ec9b4d92d49b7659941d9e797c8216a6e1321716f23e25863e04ad47e9828be243c782f9095cd6181809fc7a89cdb9216eec07bcc301cf5a9ce89e577b3ae891513c6eeb2c06cee769fbb04e1f3e584ec9bb337f1451dd5f0447ac87e20b680bf4c8377c23b3320ad1689c1ee7a2c24641657dc3eb646ba843676b2328e249bf02e5d923125e3533e59249d91e087f02d0ea58b96a18886cc1670bab40fe23b4696aa019fff5b86c3ab40a3969b507ceaa86d24faadfa60a90f1ac7b7cce4d4a8e764f7578cda8,cf74ab5d169c87e9aeca4ca420d4ab2fd67592c332c81483d36a5b8581ca83eb,4081f5dab99c2c08b74eacd65a6dd04863a47cbd838c1dda8fd778d7e438858e67f1ceba522b8c4e0ed7cac8221fa5f31bdfc6bb513bb6fe77fc7770d826f0d701,ef2e8fd3b45308d77606207a1d88e133d2ea49e8bbf019aa109ba5220a6704b344ff1c6fc0ffe01be7f0c351ab338bd2b7384ee994d74095c30c3abc03134f9100,aedada847c5e5d6f2ca15c2a48cb49278ed64457538ab5f61f58f47c92d900f73202fa569fb70f27cb216163687ce7c2b5481737d09b069ac179e710472bfa8000,f67f0dd531b074b0517b5c6905b0e503b43fa577ed1d0a9e889e2b7cf48b9d4376e5c4c34a47b2bd87ca43e3fa7624f80bfae056067a9c18250df09a55180d8401,32923f1b0b8ceed10ec431ad3fffeeb93cd1355c0efa5e3f27be2276659695510c5f2bb710eb25b8032ef28e2fba4236ef5c3594f403926b40d26062814ac2c800 +8266a3079f66bcb01400755a96ec868f38366f25ef7e54cff3c3a3f2dc1a703a721c5c729fe6cce20369285f6fe36f7d904b319cbb1fc9e2c06a876a4687c75977a8b4ebc0c84f06b1a0abe064214af75250e66d04ff441ced5d04e401b9e2a0091ce01b5a12247d24a7166184a8f4fb804ba28931d8c87e41645101f2417c56bc1bc05cd2330cef638dcd32ed5542a4bc39138918dea134d20835f1d6933b27dab4a9e695fa3ea8a5cfb3a74d44edcfd6f59b74b6ca653c8a77f878ca108b9f42df4dbe2021c46862eb2c837eac5a56e15b799a43324f04a6ffeb0ae192fb3f2d6c6aa0c1a18af9b6f5124d38b5666cfc05b83cf567ae191df3d2f4a0a66556db2ccfb342dabb30f3c30b1448828cba707b165038c12a,a5cc36c6bec76d5a93062c22490c3f72f956c7438bfacf2fa382549477886c05,5d76d69c202e467009ba944d740c97efcdca08e602ec8fb812238eccedee046b5733d06a3258312f00309e970fc92580effe18fbede23932d1a87d653a0937c901,101bb5c0b26d06b7106821317decb327d7879173529f415a9d49372036e690594dc2b46d869d7f15443283c1cd95f13f91436cd1bf5641681ad932ddf60ff6b000,ba23951217e86af98aa037e542f3953681f077230947cc761b5aebcd12134838502d7833f34bd4031bc268844f807a26652be18b712452b8c6b975463044fd5701,47fbf857674810f2ef513809e579c5402c46b8e5cad7ac43527e7e4ce4b828c3584492380c8269f5af6ddcad6af21c0e1b84336f5d8cd40d4a5f5b2960c8d09c00,ea458bf332679c2e85750dd14d3b67582176e79c661d4faa858494d97a6ea92b542733ed31586195a1313b7076d6e5d68f786e0cbc668ca535eb938c01a2de0c01 +47ac23b14e236918868aeead3bb717d6e61f0d39c87f2eae6296766c7f141ea994d229bc39f76e75fcc176d8e42726704a6c2f68e43425d67ec734305323e60af0cf68c6c1fc9b7ef2b7e9ed4774e06bfcf6842658908a40075fc62a01a7c29ad2b3d01346735d35e831bbb3c44359c1e41bd0496e79df877c01ba07b88cadc75a2304552cdf7d8f5133475368b8891c6e35b007659c631a9ae61a786099d705fee5f4278ffda9a56fdc05bc1505c76d563974115fbb6e7b7bac724fa0294b3bd2337c9e098d6cc5ba2c64becd061260e93631d69780921dcdf36cce51c900bae387436feed2382b9c35f2a8c9fddbb34ca282beb2fe7701758782d1025510554af8333760e16a1be9de6e7408b61fbe1d22e26b6c47dc,1dba171f464c6ba6d7507cade4733f37fdac04b6327cb28fe112dcacfc0ba996,dd12ae112c639aaf1807fea10adceb10dbb84ed38d6c95042f4e945297c37eb22fc90257d062b213d66646e690312c8ecf5a414a0a24c22a41312b1b7f47b77401,23d29025c8568b191c0135661a51d8f6343a79765514279c6445219f507abe295dc39abfb3a135055240f081d200c23b8117b172a8dc9e3529d88b16284cdfb201,752f99e4770d315252c8fddfbcec2216c1ee1555fdad0904ba350a4e6a4baeb65333be8a804b3b0abf5f49bd2d375378ad39bb543b676a3cf7a7ae00f88aea8b00,e29223b3684d3a90cfdf307bd9e8d9009bd219ca135b44c0a4cc51ad626c5a70507b176c3a3c044439c017f3d0a3bc1e3bdd0d188b43889317c6e5b3deabae1700,0affbde2b820a308ceee6db74dd7dca5067f83e77e719f695db15d52f9e09aed335806f61116999ef8bb0fe7b2c47af5d8f1a2ff880bb904ab09f61dde896a8701 +59748d3ab0c0e94a1394ec9c5330f493db31d1601ec8000e6db50c8e724aa7f46202765406756ee318cf3ef4f5a7b66cfdbd561e76bda74cfdef0667fd345527bcf6de5c365da83a591716434130c0215087f1c194ddd610c6fe82ccc7028837fad43abec991212fe44b433ab3bc7666b1df10258a30452189ffafebc745b288927256d957edd4031d24b7214713b0f321480236c0cc5d3044509aa9ef294bfd90f5f3a3c194bb8d421f668d256fdef8e01709d622e679ed46183987e5bb1db325944a194e8b4f21db932eb48b4da5da68a49689e0197d039c0c6a1ae9facba797bf62c0770e5444ff03eaa10910b9d7ff627ea6ae6c55876b55211cd0f62857fb6d0c03b79a5262ad322ca269b22cd3c8c0e34e87140a,21565fa4b009197cb781bbf31d5af971c19e531b58265d44ef42ed29bc3da8d5,556e601f6f541fec0353ff09767cb41139d7a7c8d7c1abdc8649d46967a778ee45e0983bb26861e3e682d9229d9dd9a3d3cd7d18470217da16bc23cf4eeaa6d101,6d0be86f14806f086a0cf72f90a4630617cbbff309f17b29439320925ccb5f9d07b2803c0360d4d644ea8ce187307212956972dcdc4368376f3e26a5673d6c2701,5db8004d7ffc305bd6f2de530523567ba74b63deca1a7e578816d972f601706d00e986cd6ce094d15bc2ecb59da06934d4ea71fd0904231e4ab8e07da5eb45cc00,1c3273d9ec49fc41cd1ba543bbced1f9ee162d7d2cfe5c9537cf12c8719d8af757421cdce799df000c21d7318ebf0c95f12bfa4c260015b225a028b144ef0a6200,00f331bb93f2fcedddf3b5fc41453d8272d65b76971225c5bbdf3c1be6b3ae0b1dc4de46dc4e8a651e04f69a225209d7447c1e60956246a7f814f869ee93c97201 +a2699250aa3ae401bd78368794d5a438e664541aec6a0ffd94256807f3829338d7f5ee3b025b320ad00669cbd9086de8d5653318b565c00135b7fd2dd7685d7635f187ac0a719a99f33829166270cc601a6674d0940fbd6f1217f1910d6e25eeeaddac38c57a61511ebc18ab762157762acdee333e560a50c52cf280cd61a36aa4f32777b3b12540862c4bcf180aed0a7104cd5baa8a600befeee4ebeec8485678ad7766694053c051512e235bbdb314bc09728d6748eeeba8ab312816592afa513fa83b487a5a31de837ad8154fb46e89dc8f1b06726df6e314eca49ae75dc357e0c89abc8ba9e9aea456f6f9b54caca4b2360e7349793b7a419ea5a35670d37ecd820fb1873ec5dbfcc8d6a8ee6acef24a647c2d4806,4817465de4871a4b6609442f94a7707e131cb0d3c873016860bc6a87e5fc7719,27bed3a0759cbdc1f1f8e5263d444f06525c43e63bd9e67a300827ae816b026e29ba3397444a349def5fc6a82a0415507d0c6610ec4ab1dc0bea80504b453b1301,f91b96712d2417525dece9cb936eecbeea06ca3278842e71b2932a87e6b10e383160214454408d1123a595432d4403b8bdf9095ea9bd992dc8321d6e5d59069901,5d57aefef22d23d058cb10fd3f3b20df66a429b0d5d66ba0679937c053ee4d93447649d67cefd714312da6ad8e3edbc0975777dc8344f858e53a50ad95e3bcc000,95a17ccc8a81f9d664a76b1b850fed5c2c35b7346846c486090b122bf5abb1d0302971f34dc8408003d56a9af24139b8210b0ab072f4e254849a8cc441561b1a00,ab16f7523224c971cef4966c4c814902435bbb7061e5ca2f73533cced639e97801d4ff2282e3e5154d7674800852aebe32a6621a8843bf6281a8593cffb3a98b01 +ce5935787f79d140edbda26c5c5ac7dbee84f18b08e7de014508f939b00ab383318a8b1c400ce49e516eed5b7505326e3251184ec1963d4591a6e6d832dda619d85c1e93c7d635ebb978d8208fa49c41814989dfa2e64a5a676c886f58603781811fdc5b95baf96f52e447c272bcb712079ae575efab602e508fd933df61b1dda37fa95182baf1b99a1df468c531f4c125d5aa585385afca6528aea4b30c848c7172c891ca917c42c2349b3d9dfd8c8d6d9b1149a74aef02966db7eb897e8a11be6e6b851ad9fd1b501552520b6927984e2b4bf4abc42ac7102aa9b51d9528c8c4e18d2f7fd63cce7e3a908d4b97f5e8f1ec91a0b49dc6adc969a9657c497e086d1a820d101db3607b6e4f7435593f5e94fdc9fb7e14ca,67f86ae5db2dda2b0f97488c0437dc8d2942f9da9229e8a6d27ae4cbe146e458,166187bcfd89e73ed12fab9f24ddaaf78f7eba8ec69b89889481dd4b0044875e0cc64317e81dd1bda37c233071f309e3890abac1aaf69b195c4dd57c8a8d4a4b00,f63a3ce9672232e08eeb6196fdffc4afd67b1ac03befc6ed60ea009a666172944cffde175ff9459e9f35214e70ce7f3b9a73eebc4f57cc488a29de8056e24a2d00,08c3e26cff839e9aecdd71e095b8417183b20116b1865b17cfcec56eecc2b64522fb9728859b43ab25af1c85196d40257f21f2667ac1f2b13f55b57c4f76933200,982bce739906a96539c23a9220baa813471658919a2ee16a4ae00deb8f45c96a637d1281861298552de97a7c1bcd087f2cdda9f09ca1539fb3663c9707053fe500,f15bfcc1003d8b70d5b897a53036404ec3a43fe07476ae17f3077f8d90feb35b4a6bb809d12535a3c782468672b02ee65a55be9b96281ffc7bf2e11816646a6a01 +eae7e5f3c2b6f48fc851c5dbffa797f1f5462a47cc27e453aac3283ae14f034ba4b3449c88e2663d646ac0378be5491362472021df67a1e75e4d1c92f827dea0167c8f1c53623628b75b5e1f2ab2543fe8a011e611b1682c3a006319388dc0103152f6d524359362757f3e67901e437c1afe2ad57107ad0c68df5b1b9bebfbe2af2b8ec47e56d02bd1db385d2489d065d2ff880cc092444c48d45e0c013bdcc4906018e0cbba14da0f954c5750849826bafc61e5498e616c3301491c9a166a00020a5c59699e8f5930db35ae5e950efed53b083defb4508920a3e72bca37b1f12e5f13c6d0844e17fd5ec39ae39a1acd246463c0c74da8bc160887f0b08919e2cc8e1133724c84d9ba26d7138091d318e486f33f628cfc,4f496a81bb487cd4903b053241d6a36eb5abe8072ecb8a7e99219e2df8499849,9deccb5611e1a5375708aeffba4c29d30e6d987415b65df6a0acd790a32315040171443e492068754f6cf9b2896752d49b636d3f27f6cd07e98d05758344874d01,a4673596d68cd6080489fcab9b0edb09b677a33891027a025fac04f3dea9547430928d71d17d97d04ca174c93c9726c56f00d1eeb315120c5e416cf462fdae1600,0b9e3c69fe578659df35f43276e0be8a6e64d0480ffc042896e4c213c7892a263201be7933f7fe282c85c7c114bcda5683d80214b1678bd3b5f83a55279cdb9300,199df9d38ae4154a8beceba27ac8a20adceb034b645121856a7ee5f0552c86997fd8a92b6c825361e186c02820b117293c8c8baddaec9758191ff27a9513e01701,d2384ef63360c1fdf800e7d64da8a4c311fe546afbd6e22f915d5952d9e375f1449e35135f1dffd107a07c9fb033fc82763c5fb207062ec5950de785566e8b8e00 +f29b077d9d83d9ca482a4f71431371aec6afd54a29816ff51374baea41e49779c130afb963e6925604344eb957bb4af4e54cb594d87e81682ba4004e67288fd2ae4327337d19c3999623bbbfad64897ab8aa0d753676c76564b37435c8f9162bb2c2ef0ab5cd0948dddb47487870247420a11ef47ae856a2ae838c1eb3b7fe2808059fdcebbb7035dc9867705746de8fc4a5709c50406d4623103c5350b96754a36d73d74909e822eabeeaf3689c4481eed71b52f36a4008266a7fdd5d41e4448b92dd3ab9028febe7fe96981289a59786b8dd3f32970b304f0a126c39ae9961771694f94a523bd916225273bf512ffff29d6d7914d537de20bb9703f4edec28a765d8c03fca50eb4d8666d78f2a31571bd499170e66a9,d13e72b81f9bb1666da95c31a43f83850afeb7c93366a54a80ce0e5bc8099b0c,906cc254ddc9cdb8a3c07bc70595dc86ee50a044dc4cabc034553e948ba8836d4bd9818a035b460f0aa7f0be149a2ebb4099ef0bfd004413de0794d6a84c7a0d01,528e350324bdeb827b59fb93a8e99962ea43ac618ed9f3afe2fccda3dff51dc70a9bcdb97b65ff9bade7430328872f2385a39f9953703a4d4f24771a37fe259400,0812ae437345d9d34320f499c64f97821cdb1715e70e140f39142d25d6426ce90c921d8b3194268054ad521846b8b6e31d6378c02b6e63b1806245f0406de35201,640af4b19ca0b73c00dc63a274406137a2751a5bd9b1371b73fbf3287b0ba118136e4193a60eeb19012eb28ab1e25a02d7adf206805eaf5de0cb228d2ddf008d00,67e918e3703fc9c5fa8f6834bc8e3c827cb7b02a30ff791ee9a8124f8ebdde6a2c8b80c28315803cb4626649019ad3dcf6581a10f37b88bbab24bca11649ca8300 +cb402bbd31c065f1d3bee134023474dd165cfa506bd32b819e96c42e64e9e13326231d315a4ec480873f314cf7ea6c33fcc85168f14c20561504454e0a35d72ca3c9a0082655e1e29290486947e7bf374a7d528e7310b1673501b73e3877e2092f723ca0d1e8d3d7e1670cd8cd2a5bbbb356d69748274880204d521a5997c6dc9fda628ebf17585167e9efd4b5814ae590d20c4f2d4b295c017fa5993d9faf73c97d83e71b78370ae961926cea5bd18d761fcaf1ad63dceab97b1eda8eb43a8d942fdb7e4bb2712304983e73dafbf0268ed3f2d841abd3f61f19bee4805a7867adeb01d27c2ce6156db5d8a7e804177fa80bc1e4061124cc0fd938129b266a531e324d7403be1816091f1af56ec4f15b09bab1f9552f413f,4b2c8a57df24ec5bc197237dc7092b76dd881bf01654eb735b5774b0dc5e883b,b0726d002ce7acec5932dc7c48ca55eb6f0c735f679890ca556c001cae39a843119eebf5b1777555ad3c3a4dc8e91d898c0186e0bbbd4a4cdadef8649cce612200,01b2b80cfa75f29db9efe46188fefe254e8166a443357f107aa23e738bbb5ca8409dd95a35987b48024cdcdc6e9b18df0d501d711dc3b1538e08c822490e5bae01,dab01585c0fae4f49e77efe614af35f092512b2dd5f6a520dbe01ea40bc0372c7f75317b9ac1c3d8f2983bb5921b7290eb8b9d45809719c8294a354fe5a7e9c201,bf230a05e457fbbcc6cfea1d0291509d962e2ec29cc34e0259cafd6a153abe8a39dedcebac31be398a4486e1d1c06b3d4bdf1b16ffaccee5ab9a62745479e04e01,2e92b009b08490dbeac908ae218bdc5f8404c5a8f42f3911643178c902fb8bfa1b54123436c98e3ecace91a5e18b6d891910854d81a5d72b542fcddd72a3ef0c00 +9f940351da9243965bdc337f5d45a63c0eec3662210fc33f17411e37f38c9f6dfdfee85c7801f80ef294c9f850d47d1260d82d895c50bc24447a7431128e1d261dfde33e925c81134f2e9a986c4043e98944938d9faa05932ce611a4a308f3c4e80db14b025d95c44a62c5bcc3cd594d6b7cc9177ae15c39d417febff34fff24ec3deb72d7f0c983386400f8e507d577c526885d7c145fb3c107a205d5db0b3f34e15dda5b17b2640f18959cd333506fa26e092e2069e80abc50260e15d7d57fab2b358c8ef40c1e4bcbe9ab77fdab638ee366039cfad2f68498f7e2b59454412e5a8eea2097d758ea1ccdd09d24decb4849d47fbe0d030b0adaf1e924f3df75b20e300d823d6ca5665b5663605d307af421d5a845344c4a,17b8c4a7749ef330892bae82482fa92d9ecdee941db370c6f7f94f2a834ddf43,04c221132c562685682947e194aecfe2880edd5e11d96303fc9ed6cd9ec4aebb06c74838ec14335df272c373ef32222e02db43ce366857130e1698c21401a46b00,1ddf717554942c720a3a5e301c2aa5558afd7706a8ffb824ed8e9deee78966627719136cc54a07eb9bfdc57986073b7c134906deaf380106c3984ba8e7f72bc101,cf18e09d433a7dad498abe6b195bfdb9e82166a271819061fbb00af3e3d992ce561a00eea2f6f1b004abff8073443b0cbc88e4c422fc60010efab05f2ba83ab501,d41623106d211801b82d4fe53dda688ccdcf8b604d8c4d15863b571af04987a4499c0831a8afccd5c1d8cc46a0a392b0e71ab16181c644e9cd9f1f85cc9e986b00,2807aaaa50467f3d776f74d95d975b9195ec7249016576650fe99b7810c020ca5f7c6c629197cdf11e1cfdd4decc17ecb3aa48da24c0158c4ae0ad2c957edb1e01 +61519e15fe2f1955f12468814ed563448847a395d3b690dc212aeca6eac27329dc9adfe3760b282564b74537466c0cf4262ec766f50a6a3e73e39dd7a0075a13942a19dbada14a772c7f47dbec859af8da624b35d0dd8d831b4ed0f01b4d60eb12f2b60da334c5096adfa2f793af184c4c94825c427a02bec29fafc455bf354ef48b8c09e20003d42fcc2b98d52293d7b2e7e2deccb28586f380431bb8c2b01e92bebba3f7b7ecc141c437d8a3f8dc9c46b075ab17b3bcd60e6e95c96813de9c60553ea44869e2630b1e919a3262b35ddb56f746c108e4bbb185e2b9e8de3dfce1c6c48c889b97b8111b8fc50da5afecdfd5f1009ab44c229076e271c3d36fbd9ad9543c6a42e012cba6f11f79871218b7e394a2d62ff7e5,f4c5993cf5c38b380cb766b00b0f3c0e12d4bac97bb350a3c927c8a2de6c6daf,d54f99c123e0192e03699b5de7ce488d0ea15cc451ec807f231900b3e0e22ce3355eac5d6e93b94dd170781f91526a8892b4af0d06432ce251b340d4817ca02a00,7c9c1b34cc7b1403b6f233f7bc4e4f9d178a1aa7e6a8b13e2e0e2033409efce40215378e58683b99195799bb0a7abdfc1dec3d3506e55c6ac1ad18ee85c9663f01,74a8d778fc0268d8d132fa425284486c368e3b72aee8062f2f9c7067e128b74807714aba0ccc14fdeea997e7c594dd43731f4afbe6a547a3c00e2b8707d3c82701,37ab9a5738b2bbe44b3051391d1588dd9033d3d2311a81695b2840d6d480e635420f610cd460e726a0b3a34bd9aa04a685b7171abab3f680a5a9ad5bb6d8c0f900,992b231653fb5a6d26985b70deb2e1b025bc4c6b1a5d65dcd0e6fee0277d1179080bfbf5efceb86eff54877d201cf0fba1e50431c44884fa8cf58058a074e34000 +2c68adaf79318d52b3da8f283a1593c8172d519803b471b5610a21da73dcfb429106f9fbb19b8f498b2a169ec6fe9c413c64b1aa3c64808078527235d7d3e9c9671167e4f6d9e62665e7b0bd9c90834d31249deb5e39aa3ba38b0f399fe03792ea74f54fcf4ed5efc999213e49554aa9bef846b5cfd1c174355539e8eea459fa9fb65d8e67d7b6af33d347221f5daaf9d8d8b469a1f93ec9cc546848c881896110df97b188c0b3870cacb10ea711fb435027489c3e7673535d4cda2268fb97d3400898ceb221d67d962bb1e971ec2b1eaaadc582856c1081ef77297d45d845fb3d411c4af15442de5c44f5fedd1e2f7c49af14c0a6ed29d69194d77ffa9efc8bdf340a6939432d060953cabb348a7b194edb9d41e6df1972,4bfd53a0d4424a8b5d73eb7a51f9465aecf1c5197ce8a22c395d70b060eb3fe8,bfc62b651adc94e7f2a5f50ad317839d3a333dbb8d4e7863324be09700783dad41d985c6d4d6f6a89fe0a2d3be52d2fc67a441c02a359bdb1f7998d7fb9e5f2c00,f4d3a20bd24be513b822ff90bf975abe487bd04379bdba6aece091573dee54d60275f118791b0392f889a9764ea552a6a68ac498033021a796803f39af1d79c901,374b0098170cf999ece88ab45bd341b82f4230ca23c71d1b95b45207d14a4977623b198ebdc2a4c34776d050092c3b53bbdb53b6ab0724303178ca5dec24bd8900,6c9ecf7b7fa3d409cab490914ed6a2d9d0814443662a47d48ef4e22b673076e21a6bb05d53aeca61f5a61e68ce8ca37629595c9f61f598b42039221aa0a7427400,1057a05587a69278fecebef04bb218f41eb59adb8db439d8304b6b1003f6e6d5745f230057bf34c57977e5e6e947392ee7a35b31a00b90110513ab6de26ed4c401 +a9eb3ddf6ca9e8e93b6f8959867cb305f283e3f04988644363be5ec159aff4ab13c385c28ea1103b7313b72da7da4156e994490ac33dd3240b9d531d16030dadc5289a5fbbc4b0f1c05853e5af0b62016b1ec3cd73a3e4f7f93945d9f89291db04d41b529130da3e39f958e42c39e67f3872f3e620ebbd4f719254fe91023563d8b9782edf1418fb2461eb9e715e60795c184f391bc73c8cf166b16d036215d57a704a8c99d1cb2ee35e6f269c002d640f58391de6036fd8d188c64d03708cf2db4fa7a67d51251f901a1868c0ed42a6ac85587c7b572a9140da2d9718dddd93b5a50b0b4a2e1e87ae6c04fcc7db4d0444822226c923bdd734e2d7e26e8fb01144dc92bd47a8a6eef35f1a6c2ac309d9b8c0bf78fa606156,8b0d752147ad2938015e96e4a01f0e9638d810803b959704a1a05014cec3b106,a3a267562b2f1f9d28ad7bdea639bd615104b4b9cc2e6a18dbeeadde52d697e25f1f43721122c721a7766dc386bc639578f4b35280babcb5e86e74a5a42e9d7001,3aa83c93e38fb17ef5d32ac0e189f4b37c30156fa75c6a133ed6f1f4bb4e7d440379514a4955cff65833faafeab5357af117e98aa95b8ba8e3bc0535017344e600,3b80f9050c8c6999b2941bcf61f2258395d752b0f0966ce6b9346827bf0b178f6d768c659ec6beadbeef3cfb4ec2a0eed104f0217a30a75648bda3c528c460e301,5193b9b768ba3ffec585c9161c53f3f9cca2c853f875142534c8a01e57187fbc0e041c843d2f0e57a21f17ae49a6d52e27125bed8f91d9068651c2cef33d6be700,2e95097888ffe5e3601c17b8dc4937662f9ba077f448b207ab29677ea443715e2706c858311d05455e55266c7e3402dd82d6f11bd5509805264839628a5d4bd701 +49177abeef240e95691d2d2f79f3ea9ad7dd03857f8e6b91aa002a85e39668e598cf895c7582b0712a9fec28b658f5dfcb66725a5c0d8b697ab81dcfb06ebc3a2c46ae86490a72d562e5aeda4b2d0aa53809f88a230d739f3752980dfd75e2d0105c83b2af130ab2b5cb8e2a672fd04e493d5f7183fa4c80fafae05bc53ec6c29d2a28276bdc211c42cf3e15b0bcf0f184c389509b89074234ea65326088ee4bfc701446baec358be9373e715f50fc16c1af81bd35af6ba1b822c3033811afa5425d335818cdc42de4185800140fcf2900adaa21604b64e651d39b68e8d04d07265d0bbe760e1f945caed1a925516113fcbed1eacd72846e82271b4ea0ea05b4abb9bf105aeda6cafa3e6912df370ece6123deca7fc7f7b6,721b62536f9d59bcccdf3fcfedc4dd3a4845a42aa50a7beb2d817c5effac5194,1e98fd5929086a7ba2e7f92b91f60811e701b80377c77ec002969070aefaf6a006a86c4ecca72a327043b792b706fdfd11d7bf6bda6582a09ccf08233aad575a00,2723f2d98a5fd8006c6f5972fd7bb75c7c0f5a4c9ae9fee7e5c80f936b633ae7253a14a81c52471a8e7c435faa196ea4f36f994e671d7327e74f2b4aec3bc29201,8e08136c68e22501327fa78d8776ee6970de45427b070e5fa141b4c28823d68f1983a2d5f21970f107b21171d0175f44f8a376abaf497866836db86a5037fc0101,941065c4e0ec73453d5ea54a957a9ce820f74360b48dcf678bd2c7634307b0f6461650823089b5f5137a159ed5f397a3f4ae77c0c512663283ce1b715bbd3b5200,887847eae9283ae4164bc4898cb07492a5a0ea0f20dd9a1d823a88c63cd207c025c0a0a4b8a72ed683344d98a6be06143922a340a316262059bac66ff8101b2001 +ce3c803e88f97d711bb9fa1ee53c96bae465c0257fa0fbbbff045fdc9384c7840c4c4b12026df5b06ed8893aa9d7d65927d326efd95d0caebab6e2fb9c7ab5686e614f68ce50ce962befb12d37900291ab66d06136b7d2d019f611a2becef308fa1fd2285d8e3441f62e72a55261badecfa941a2329e53f42ba29d8a585dcff3410a1a6b9ba2c0b8ac937e0598beb4ed001918f78746a0679464fd0059e972f801aac38ca95b2fe75a4c69738b0681c8caeae0b8ad3e1c9bb79f623d61b4ae4759db0a7ec1bd2c59f596ab95c485b87c3f5eded488bc7e70b53f08db6d4f26e2b65a8a2685275d08a9d0495701572787e9b3a34ffd18dedcd92f065dc98a2443ff27e69ce517738aa74fb003639113a7877e29f1d94b379d,cc0397ac9394e5876f8658c5475c15471b2b514948eccf3817e1ec9260955ea9,96e074c1e432f854c7057b62e095d06421abdb7c21165f0e4dff6a079e841a96022f2a8dc8420db494bc377d2e3ba720c8afdf089da09592cbfc67c8cfc137ef00,444d0d434ba104e9ee7e7a87a12835c4c9595607732c93736e17a4a9b18b8dcc2e3f14ac1bf485a71c433b166aeb0de1a9f9bec446d62fd90e47ae1f548f2bd500,2dff2ca7fae3644e1c0d27b4cd0deb83ad6593f09864c9c49ee041bc4338c394108c61d22e49d148f040f984c23e1038a5eb511cfd7b3c7e986e99d1bb1f045900,96fb94167f873b1e6493bb984b059640f76da9078a3913783586cb8e13a765b9299b413d01b1f3f785502c88c5690a4a49bd19e53df24a50b217711ab29c9fc900,c0e2c5c9b65b2f0d546365263e486df23ef49640746680081cd41abd28dfb2fc15140d5a545e189d258ae7c3cd15a20832d50eaa3734983c8aa113a15e3e15a500 +53bcc705bd12965ee1a334a0703b1eb254e9c88770e84ea7f33121553620497be474e52be9c300cf7bfd3ebaffda38d86fc204839de25b3db9f68cc1339a10cd2b1081570a481b61a7cf832fdf81a958c6742c5c523b1a991ba39d27e28894537d601753e26c821e7b6ebea6ca41ad1c7ff36a56bb79ff27fac98ff4058482c39427f6307a1ba4c98a6d028bb35b0542d57fdeed5fa5e0b389af9e118c3e646437cf741b294c3509c060b3212faa17056833c57c5dfc1cb8d449250f6c62cd302e7244bd7340e7fc367a5af428b411913a3e25a9c9b3c078179ae21dd3f681a80ef6b68bf594ed0ce0b5d3fda93b432dadfa91b1e0e50f3e3b6e327773fa97c35cd36fbaaab96b3c2cfa2b525b14cbc3cd64fac5466e2e75,f85db858c68e6d1418d4def1a0ed02c1dffbb217d6704a5c1db67c4c4da24dd9,823fcf738f483dd7a799680df3a4df7cce72a8690fb4f6ae1c67a472c17384b16b663a5ba2076c570e8976cb126ae3fd9528c620be636896358ade364cafad3a01,055d6eebbd35a3f854b63b3f5fa6dacadb2980e975da94a9bbe5487a6cbf59ee60908adb31ed6c43bf34527df12c7d3b80940de845cd852338e9b484b8048d2c01,82cea5ba2ba869fa84e344451f1d703424ffc108d545da2eaf773a82f71f4d2f03011a5e87d3d24d43e956b0a26cfc3c61bfec690cebdaf01f43bfd36aec366700,dcc6c6e1f39a4bcd3f66c6acf501d458f2b8ac0f05e84592b08199e3f60fdf4b73f9fb70493072c1d5253bec0075fa2e2f450ee3a95df1b46f85a962b0cbe1db00,fbec8509f0571c5f9cc2ea46575ea092bd7e009ecee9641d99efb4a57ae9c6d145292de55b7262cb68859ca5b6882b1d9c0ee842b33df08ce9519fc3af16a32b00 +b095457c0df54027c33cc5c042048a19522625a9b1dc823d884f3dc598e127815b46fc460bdf648ddd06e4af4273fdbee537e53bc08619810a8a6ad83dca7747efd9539fd31cd76cc4b54f2b1fef2032bb0f2e7d1ad5b7014398df7ddef0e2d93a70005a3c801a1937865e000ffbffee8598f99d2f9e5db87b3fd5371c0d8112db39d144224a738fd2efb5f3683fc35bd587408536684e68f1def4157099e3a53d1298c4cba753579007f995c5175c509e773f477ee77d1e10ea1bb9a2d5d8ac7743fabbb95d911417bb75c104424ec0f1ea0e200044f6bd97073c34d2585755a2dd1ae262f5b8b42c389c599d97c962d702f643b1c78485a864a2d265ef34f67f9fef2e6ed4aeaac394f7548cfed09c97e570cd215ea451,c26b6b593ff0882cf2aa80f8023bc41ec5e33a4e0ae6ec03d669b8f3ddf03164,cf034efab190d79242d9c4456f80130430648b35e5be5076790de5e3defa3142323955a21cb5f3c24b36f515d52856712261e3a4ba58d399acb2202bdfcd576100,672d67fd2cdb1c759db1c19ec24373c97145b3e7fab69861a9b97d82e453353c6e4803740bd4114f8627667c22a2a9f86593e81588a96cbb628885668cb8da8201,d8a3c679dfb7e3979bb41c8315cddaa10d6f278bb6ba753e291a78341286f0a73dbeb6948cd63d05438f1475ff9a64d70bf79d588d05658e01ce4d689af2225e01,7f84ef90e3321657b3d827908d043e2c4522804d7152a7859b68138727cde56113af6a7e59fa378a98bce8bd36bd2155f9c1175df776ab579d5ee56c7b8a320100,df05b227508bb9225eef5cd78183d5610428a64ff7773e25bf904e1976cf46fa7f954a7191dca6bdaf6780263eb8f10a7230c1a71fb48992eafce0b9aa7e192301 +0b86e7edab95c028c30684eb608f332727ec5605fc7544c525ce210d41c68c9c95713805bb11089de64efef9513542fbd654248c60a6333ec28993754e4a4c780992993460ebf04cf31c8175e51a529a161586d588adba5d3d6c753f320fc2215034f4755ba0eaf34a460e4d97d6f4a9857f5f157689f7c3352e933572e9e748a3579515fac5bc3a3ac76df39db626772ce2d8fde00c2e1b7f3270d2c7f28676bd776996a7e7c50dfd917876eac49d1039b35c732828cbf0408652199d0a8a01ac431004a53f591602069d77afc1f06613378e9aa8b9885fc7355d04b15a559aaaf600b8ad4560d4e35bedf62022df00b019574f1409d3f197fe480d6219ea3afbf1e656f46547f0d0ec0757a7c088b5cd2b1f65abb9a947,34e51888a7e4782d7cd16be8f26b5b5e8b67f10fd3c41a1108538ed2eec44bcd,42926531b0bd7f3120f603b040393832113aa1a019e956ba22551aab42b925e14c00d2005ee915c05cf20012c23aaefbbc6d459088c1bcdea151e26a4ca7bc6800,134cb6242a48eb5ae47c0c47d75d88851931f34a422af51e9b7dd09c776e4c3f5cdf33fdeed28b03557cba47defb621d888df19923e9ba59e7930bd449403f5d00,e377adfaa8b32108a6e9dea0457e62aa979c3ba4a7cc1887a5e87f01a43bf4905bcaf8cc8555029172dd4c17d1aa9dd14497c86a5e260de77e8e8a54a3c6ef4501,cc3ff20a9dfcf30eee5ab99f1a4ef66c3a0446bebddb1f5d63a19d76bf4efea50e2e7da59fc749b928ad3c8cd3e63f5ad3509911b57e9e946a8a2a0be12e120801,75ccfc142b2153e341aee2e61d8a2917814e8b09475ce6ab0f9c1f79cd8c041730e641bd9315a755ea42b200fdbfb68e48204346dfc00c92d59b06352364fd4b01 +56f31ae40b6bfac768b7f2a22928fb3e078771319c2398bb4eb3839c399eaf23d8d10bf77eb873661235de93c05756f676ddce6029ed54eb7fc391af642ff3f644ee68307a4d516ef6b411accfc3909786286ec1f9a0589c4a3465042d2b3df9ece14cc5dae2930481c9202d91446fc5d7bfb65c530295a5c5155df9d3c8b6d74e4ff84862be319b447a246dfa1ada2fe603f812ce863867384c72ce5bf40aa91ca1f83b01ee4ba03f36c4aa92d5cbccb8e3609e45f4e1b5998098bed8ae2e92ddcf3270e0536900f686f9ad6f34d1ef2efed741619fe31c72b7805cff91d4b72abecda38f1c64f2953f0ec1a353bdd19e49b3aec8fb5ee68d223a9661465779566ddf5bd8a2877d4ee7f199f87a4108fa28f2968543c25bc3,f90e30c9beb65acfdfd4012c3b7e32f3c4bbf296536352346252cf90048f55ba,0f98ec04b89f29bb2c57b7acce3d794b07b487306496cdac6f5442aa566678f6467e19d63c02267fe0e863dd62d8026c27298fb9f735a50a8b1fba0cb5e6836801,6beb73fca04788113638fca1f4b2e14f414f4d7c80e721a34e1d7fe4f92300e079e7ea02cdf793bd30bd49d69867bb83c460f02aba1548dcd0c11df4a4d6f85901,1fd64b647cc5c2506a6f90da9230022f173904f6a6de65f3624c3c093569ca3d559c8c134d1ec3bbd517061039876b724e6bf5ab36cac159b8e26a1ef84a291101,40b453cabf719d8c4eafd1841234218b0e3e494ae8ed09cdbb39e4c7654271716e31fb9a302b875382b386e39ddf69af39edb75a0d0d1c867cb95b6f2bcf093101,84b20902a0771478df94545226c3cc31340302c0c813ab11c1f8e6e53c1b093d40951faf0982a49f7f52aa7de1fb6dbfba06acec0d36b6eea0b78e50244d6fa800 +2f127d7a4217fd93d72db1851a1517ccd59e92bbb2ee0109f500e569e5bc61193d3b0192ebea97c8cf7af9092611457c22a5e2dd4b9e7bb40dc493201eb01df0efe3451b9c4252d2a1f79c816d9b4bfa8b8d58fd42c26030f90e4abd48aa45af2e47cc15ad177ebefccb36ede3c059db2c6a1abd1881ac36c43ff9248e20d3121a5900e7e3dbcfa43848f27533b0cb64a5011de7aabe6c806f69272203e81619f3257f711ec6a87c2c37aca9066d0d224bd7646cadf0ed1ab51340642bfcc73c959a847fbb6c99c1fe496322a9098cdca7bcaa3e8281d69167671620d74087555a6b427a36570c3dd88c596a3f17b9f55c53f357697854e94ecb5762a202d8c38024c4a347d976c1b4a8d3a282e4f180cd8c09d4b322f9bd57,8dcf40744fa8dcb79030a0893a52d2002fec3e39b73e76c71e39b42451bdb1a2,2cd505b70a354103e255f0578ba461eac8301a51b568b7c84bbca91acad257c34b32c09783f7d9bb0b19095c01ba9c9ce9fe0975b8783f85509fdd3e7817f95601,be0d93859c284b1e3bc333bb205ac4315bf2320d10da28fb1437bd8d61c0931d2db165a20024ff6dbb24ab6ec5c55bf5643e547429442e0e3da8d434eabf908c00,dbabb1a621d07513e15db42e0d00965b87a2f47ec2b2589eddd28d0dd43988e062be16078190ca0c8d25a228458e89c1f165766b32768db6f14771c4e5f87a2a01,6fbaa77dcb14b9e41c2baaad79747108f8cc0762860939561503412243a4783a4ffc8e136edc427d616c4e75ce52951d4dc04fc5956536290e2ff40954128eee00,73915d1e7ad01d3a83da4a7b5728713393daadbb1ea03c934f3a6c316a986a3959c641885328db2a8d40cac7249f045e88736db404791012d2c5a2d29ad3e78500 +fbc5348c3b7e71cea1698891bc413adfefd4db99a3cc19c9329301edf92c7cc65d6f27a08c663016c30c237627c9d26820e2af825127b790093d27a3932d592f1364b60692635826abc5ecbc4c3798d4f1a66d26d4f8761869eedb375f62da743a8dbfb755caec11ecb5a926c07c8ddb04a4f1ca85f12931c69f5c3917cfd8402c909f00a535eb074489a78dd280a23e70ddf3adc303e3a1065884beec84140898df887c823075def003820cbd14c120fc829a616f2edadad3c1f7c28b3e3d3e40a722d89ea6b9d4c3e6561a174fcde2a5c776874cff98ce0f3e1aac02a92d2190ec2c50571884b46ee54821e2b13f2f7d1101562533160a4446e8a352720f66fe94b95f79a638de808fa38f1871fb5b9529f3163c2ddf66e2,7cd20193f2c643a27c93801f7e960be02fd3154723892bdf9d67b585984cdce1,af0a378bfa7daa37611dbb870851451a53564da251a32b1f49fdd1fb54eabba34ea1e2321be2db13043fd4ab2544714dc961380acdd4b8ff543827fb1d418be700,39c9ace73fa0a28ef50e26d26db54825f1235e098f8ee81603f66ab0eed17f262a5fcee9c8bdfe84f824dd0e5337cc203f1df0b10fd2559b64108318e4d0d12201,26d78b422a9369aff39aa58a18fce306f60762774bbc250e6a5ba352e7f02d7e5a95932a39d2cc167d97a79187ae3c28709528b033d3f5bb65a1a24d83f1458a01,f0e67be606d5b142b443a55fec58c665cc6fca73fd5b9a2825b1de4e85b6de8a0c717813e4619bc2f4d8b88480b94cc4e4aa0bf32812b8b05557349db2dd579601,9aa9b3c6813fa896c64e416f492e081339f56ec827581147f5f74b714f1249ea45785e7a04a8b005d59dc4770c773a4e7be4dfa9dfa82a00ea87767157e5b93200 +fac6d105263dc8013d824131e00e7a5c334521a54519044901b9eb45293c686fd3c0afc5d663e87b12ed7e2dd748c418cc900777d458f629e7b38b30a9e6787dede372f295376b1c451bf2b14f1fd0d564f762915ed7654ccb3698b9d3028db9b6d371d1ee721872c1178344f466751c78822b752ec20fc366bd04f7ef8375d94f6b800a88bfebde5c5fe4eeb436366aa8784ce3a9a11eac07006419b939503929fe6c5fe913664c580fce7474fd797f1dd82c3a88c860f3e9251e3645c0035e01610c2904f81048a33634649092d46db550363a0040d5a2f4fd6a18d9171ea064f204d844367e64f2e47ae2853e6ae0e19e63a0412f1175bff4473dc8db8ab160ca32a20cd7f845c2ab066cdc262dc837d4c150a16fe9767d,6f3ca0633380ae1abce41f569618204175332174b045397aed54c2008d8a081b,69673d8c82b84a16e5ae99bac97a126bdb75137ff4f98fe5900d44e328a0298d504fbad893d6bd7f052d56acbe4764a4dfd048231f1dc40a6cfb309487dfa27100,8919f1ecd83a3d87aa5b27ccdc220e88ce15a54c9740a002cfb588204179af1c49a422998283ce53047366e347dca698f48036bfa9774e3f42d6e3bd0e3a9fe200,981159d7b5c3f5c87ce10af2c2ae2a5f9f8231ec67d4b89098e4f5424fb5a29e74d905fd85b441cc692e8a4033b16bd7ffc774fcdd22ebf8e74cb4921a9f541d01,ecc7b22109140f2e11be4e437bb184b8c53f82c6d16b376dabe9e2677c236dfa508dcdc1795a5eb2eacd2544de9055b0a614936e8b2dfd7530edecdc8e2026d901,f1c533e91f01ca3bfe2af5e5572bb426a1464a0d7a334a2432a78800d3b09bc06d69afaf24cf0043ab3ea8170ef28358abd0359b27b07773fabedfd29284686501 +a1689046cbb3e197f771ab9cfa26f08532b7f9a264c65bc3839dae4b060169d75e55da1b97dd034479f5d805e294e5126b01f72bdf1badb723df52041ef0ddf096235254e847b6cf93b24e44de1a92bd58cd9184854afe28def45425a1919bcb10d7176f87ed04e44f3f3f64d1e8db2e60a28fe246ab94a37dafe470c8114df09ccda60ddb5ba0f7db0886f8c52312ff84edea9886cbdea27942b98310bf39afef95e2b1b5fdd9488b274dd9949a09080658c9f761b0180d89bcb168b1a883b535886f6263047339493d1bd818e7654f4ec358eb902dee9e50cb967e61e465f6b8201089d42bae0426e37f87b3fe61035bd6a89021d6ecc67854fb5d48aaa887debdaa727e7d584a10306f40956689c9ea9584b71c84d32299,2b7ab8220dab592d34c266365fae2785cc807415df909579020c36e2d47c7256,9a41014556a2b26d7f6bc237d4e7af4456a32959ba3c70d5d79d8c4bc87083e741c899f0b3d384d3ad703f80d554372c0669b3a4a13064c5573f99a9c931be3100,94da816004e9d4f5c6fb0a2cb69955edb89ce36755e13aa1c18b64f564ceb5593000436d9222579b347b46bbc5b05ce9bbb566c08f581c042945b3787204fb3701,3010d891c3d614a760bde19405c34745f8792ef49d62a6f8d74ff4f075699f004eb0b0d6f58c7d182c3633ee5865f6600677233cae00648e1f17548553ae6a0201,e63c73a90cdb941935ad214f7d93ca715eaae4fcb265a1b0d8a82eb45fa4e32c100d43c934bfa083007ae66d415f40ad6df7beec95bf65643b31342f315e447701,04e904620d4dd1613fb3257a2a9c9ec461d9069a48d704db10e27b7ac52c8ab436c4db7b264b2febfb72d582dec683942597c5bcc20e5ea3c01251139779073901 +e2267aa560d7dac836b4372d7e4b8034a8bb888d03c60dc549b3b160a870a3328470381c8fdc52f5ee1d8d11e8391ea87c1ecbb4f0a1a01a95d8631b97136461a9589c80bb6992601699c3bf9db8ac6125b45144f354ee1b9f4b71e4912a6738b15d3f3160d1335cc76f748a6c6837eed9259e14556c9838aa85f0f6f64c95b06f374bd6cd135b549b776f523f90a9ad2825322f761f5127a77bdf3b24e73f9d1fce1b923ff6360c186829b9951025d748b24fc13ccaf070e8edd570262769528e573372b6acdbd3169a186306d77c7420480d6e7034378ac1457c9201afa3cec44cd57a7676e8297557d13783c732db8af5d2fb16adcf046bcafa3281fc5d91f1a100470872a1c2ff1ce9e5053202e361a77109d43fe8cc91,87787ed454cde5faec1df83460437b2248dad669fc51d30017f4d63e0cc55761,a64046520a3e4f3f83920ff1e3320bc0dfacf72e1399bb0b248a4b12fd28c71c78845213f362185d40b7788675e2d9cf4340d1e2d43058aef81f301ba375e05501,fce778fe52ad8bebaf15ea62123a495253d345afdf4d8eda85694de633bbef853b6b4b27c48d31563619d220eb202f695a109b7e275822bdc09a7f8cf3d9e72701,cf6a14115fe13d80b81ad272c910e36a471aac3e95cd5549ff4447fca2f6a1904be0c7c62494398487a14d21385a46f377a8a937376827a63606d7d295a5820500,40f9c31763d8176b0ee11135222f3df60236fc53ce943393e179882189e082fa2ed1703c5031d3b9ec0924d69deccd0e4b6e61f26e923c290a3eed0315d5fe2f01,06c9c4ecd2b78195c5553df9291718740cedd553437f32bbde38b5e273f7e09e172e5fd2cff7186e2b3b6cc8c1f47fbf642cd727adf76279096a1fdfd3123f9100 +117eb0d14f4cdaacb41042446a1607e1955e5769e308014ec05ba98138fd1d3ceb6601b18b1ae949c4da4fa19652b5e4985fe52bcb8899b7adc3e48d40533da9090eed07317afc10641ae12f1372d85ce04fd52df882cb1693e37603ec809d013912b2edece485854e91d178d3485f7016eed934658c62841078004bcc0820aca6f84b75c743e8088e9de8778a19ab3d1f0a20e3a7a375f78305fb26c7ee544acdd689270ac8f743fa5c4fd5d059988b34dcb5ff7e88dab63f36aefc8b6a82b9c00bcaf4a645ddc18328e707e53ad9c20d5ba0f62ee882a85ceba520a34f39a368c1173123624709b1c37ed4cfb901624633e8cfa65efa586a75050b5235b0773c02d81b96524926ebb4061c8d0df9b6511191ec9a890a289d,15bdaefcaa4fea2c1e786435f34d3b4b3e44e8ecab3b6c61d8d0a4a76912fff7,cd75c58e9a4f3eb02b2a362f537a9b41ad4ba97342bd80a7940d9a01bad4e2d4432287f4f4f8108b235099f0b63e00836c150726ea620c7ec59a357d0e1b7e3d01,00b37b3d19f811162642b7b8b78920b03f4c865a33ceffd8395ae9ed37aae0162287262f3c015a2ebf01fc8114cf7044235fc8ec32bc421c9d75f95d1582505a00,d7101102f4824bfc15642f33e9c66b890aa1fd8a2f1d97c1101bd934b236926433c006bfc3bb62926a01e6f6ce0ff34a5de678736fee47ce1df05f1fc4ff687a01,eca8b3318e5ecbbef18e5d6e04ed03864a4e307e6cf76bbe8e5c2b1721916f5f38356d1cc1a84f7694e6c21b26e48d42e14b6c2854fb9c877d2c5a545e03faec00,f60810bca5db7cf4527490e47d472c5e44cce0e6aaf4eae046cb3efbb70438b85418d8faaecb35cc77474479cffade3a38c7596239a3e7be8ecb7e6d98e84bd701 +3208cabf3fb8c6653b79460e2b6c1948ae861480b7231860d9a132089252a8c45fa609cd926a180150ac6e361ea9f600891951a6364526c1a5bec4e6622ce8ba97e2f8287f9b8c29826b9fe59240fcc10c57918752f03b618aa705f9830ee26de0bc501069968ca64af2574c92770fe921e31ba711f7c60303f556aae1df54b4d5dd3a96c88dbe343341eb78a9833e07011775f0bc074a42c7a2cd4dc121b6b17156e6494a6cf6f5f13653edcfef3161a74b5d361e8b7350777faed67d9f1002bfc6b58adaa37cb27252c016342fac4364057edd83d06bb803f36366f9b2ad7ae3b7d73ef7cd0d6d5ebe559c14200a0a0f975effbedc1aa1bdf1fcc3440460d41fb4e738e3126f1c409676a1d305703c97c1a02b1daa7d9c6e,4c2c7ee26b5d6a69e878032ccbfc9d3b67ba4f314371204dc8a0ccb615911445,11f27107413035af0eecbe2cc1598e33bd8b4c601e27316a6a03c4a9a97ebbe82964fc4549167ad13c8f9d933f4b9a91e4c400ba361fbdc684ee3f9b86c5dc4f01,5d87be65fca7c1c23b8ae4c0df5448380d2ec561d539f202dd26967fe47b5bd435b8c875a56bf5b359f482ec49a4f4c6b43a7d259266bc065bfacfb2b5032d8501,20c299d8171a73b79491f320e7a9a46b5afb02ae9bd1401b33554a8c2afa0bb104bb7cacc9aad66cf89c5523008e3225e4d6c70bca02d0f5435804f24590173001,616daf785b5528b6c6f7986c1a84e8b268800929834a4d3ea5efdf183d5b49a722c4291b7511ed7e2cfbbea6afd2783eb6a4a09e4f314766b82c5a8293b9ce1701,4a058a6f7862b92dcabd1907b38a9a9bcbc2c04c26933e09c088b6da7767e0bf4239299f52ee12aa2d49c4f9d63cd78cd474a34f878a05e9a778d8ab0edff33500 +07a55bf74194c9f8da050e7a0f3efce7ff3516dab0ec8c9c32a54dcfd955da349ec96dfb7119bf4dbdf9191198a15a26bca8dc1adda45f85cd68950e75112a0847d68a79d05722e954dd7c05f01d48a302531fc52d41521b8edca6bc880692120a3f22a61930031a8817cbfda981f659795486830fc1bcc3e8c4f661d8ff7558a4b0a90125faafd525902c4108fe341416483d6b701aa6b85a8869d644ac0738f1ac8a9f4b16e64efbfba3ea91a4d79d54152a389e9406e2a961ffb65d77622999baa64d9e2a2f9f9a50b6d9bb8243be85c8c3bfeb5ed014b4f1bc5604e519fe58b9b2197f00f84bfa38472a149cea89737f1dbe840eae35a2e369195ade4fe05405868421bc46d2abe3b1e05c66845cfbbbf1454159770900,d58a1c6689247d7e0eaa39b2dafc4f1afe1fca134ca91987dd6aa2271e245fc4,2a6ef762403bdc8248a8af9b42b8f4313f8ec74a6d1150b196c26c104dd050444eb3bf2a9cd4c8326b792aaf9320d656e5feae13a5ac883f571342080472522501,b7c6ae5aa2b7ab191fcbef84c0a8ae0c5d96991e833847ec1568cc91541072c366bd823db03678a450759f611c95311763f833a6e2a5e2432cd4afb56dfc47d501,ae550c274a17bae3663ac8ffe7816d249b8302dd4bf25b72a67ed6f768cd6b365a78521a3df28213931e1da6a643e7d72b821cd463d4d02341936467df26653401,6aee1cebb74d8b2920fc704eda798057b099346fede7b5aaffe229ea23d6354f0b8d1a07089e51f5cf6dd48c878b0a336de3daf8101863ff307a6b9217ed318200,3a1b6fa2620812a9b336b26096f76a0d82ec157acf64d851dad193a401196885049f75b47680378fa195d9e56bf3b61094c22fb8d6a1d0b3514801ef6d7832af01 +a4dd5bf83fbdddb157be62f14d943039fe50abe3264523f3c98b6caf8ef6bed85c8380848dac8747f522f665ebfa6f8986364ba102d6c8dac347bf3b20cfbf2e594b0060372fdd4e6121c3c71af598bf24145a0e5ec398cfa80aafce6bdacdecc634f639bd910f5b13f5ade7d2050aad60c7d6dc8cf186213c0ac1be38d237dadeab1a3a9bee9bdceaf350df97c2f8bf4fe63ef5ff04ec001d0cd60ee56efc150c09935fbb7cfcac380ca2671fe576ff1551e8f6b079f5d2bc4e847f19d7068fdfa7a9f634896e20b7d0d434bc2431b08b639e4081031e37c2e2c5258db9e0d956ba576cd6f01ef12400f6e5123c28aeea022bb43b607c3462751e90984eab4b509075172c58e642312de6d85258fae67ff58dbc0a948c4207,c34d502d7e359c687dae329c07c70b3fb4866d3be16c906c9368f0359b89ebfd,cb735bbf24dca771ab1fb6d6dd7c69a0d516c15de5fd8a27bab222749610267c3a6ea90acfa06022d071fb0515f470d2b1b5f42e55a1d3f5c2bf15a9d7563f4601,70f16f5c5b469085c60c51184fd87c41a9e9ea9fdc2dd716aab913d28b7a17551fb06b4181e596231ac66817019896366bdebb4d310c615b5bf4db332b4b390600,d3e4d4848358a7d5179c30cfbfcd825432d1bc39f5a5db3b37cc8c47b0af5acf3a48a5dd5dbcc7929dc8f7d9f86f68a90a43e55b4b9c0276a442e5618655d81d00,a557152288e641527fe3e0e98f05e6c27f4a7e995a0a06eb6a05511b0ea2833e10dd831b868db8bc25ad98384f1dd67a1afb151fbaa632fd4662000b4886fa3500,20726eab3e235389ad29622b0fa9f89608b458c7d2132c20b27531c048bb4a3913572607b648df17381f0920522d9b1059b02c67c40495b0bcb02232f26b50ef01 +02e6f154547395851fc7849d246971661b50b6ec6b49deaccfee70a15cff029a603d42d6368e6f310548c539f0537f2c2e33e943141b59ea2ce586feb1c0470fd78776bcfcdb85fc42fc284cf1d3fac29057d817c96ee5276feeb42ef0ded10ce5a7e05d793c02cc13a8b373264fee42961107170afae113b10811ef0c15c38196a74c8a3bc4e8b152f77abdefb66e84e3a833498d9faeb947dcb9d94f340103802aeca8a9332143d7e771ad1e4bb8335e552513c228efc4c8b6bed55496dd741cb05a897f2abd9f3b2b8bf41ce892bd69933da523ac03fdd6467f2af632a01db277287dfad59bbd902bf1caf9639627672971950b6eee93cccd31f7775ba212088be96ccd9fc572fc8cfa0fc4e14d093a9e1bcc6b59c7ed6cf8,c831b1d907b8ad7ba358b8c2d0b5442736ff26f8c831a8c06641b9d8ad1f9af5,60292177f6b3d6d577f7e06800d2ec23145a9ee02b99df3b0108e7f31c3ee72151df7befbad5d2d9538a6112a0189a70413c91a2ca4226939fa6656cde716c4b01,d472b02672cbf8de8949e1f1d96920d975c662f0392fb4353ac068f286608b8e62304bf37282ae5c54ed567168a79f8413bc04cca16cb0ac91aeae5dfc03731000,2b5612fd35fc4f2b0afb0cb6224ed613a3cf30d89ad7fd30a177f1365353c3fe5e2a514fda32372cda194d2e83e2f6210714eab9b875b8b62e4294e3e81ae71201,05ff5022871b68ad40b7e80de3ac86bae62e2705a6e9c06d634b10f41bb5cc6a0ca62accc86e96f3b6aca36fb839b64208eb98097ac93139a43be43463c3222601,0adf790bf365c1d4220abd9b39ee2e384efbabe480455f38d67e4b9114b294816c518f954239d30c4e524ea4f2d36c47cf7c799b85e9d18386618c8e52c49c0000 +2ef78bc46cd5d727ae1baee4659d95080a1b7a22ff6ace74199649e2ef6ed098d16e7b675d3b54291270952f2fd39b71e334cce1f293352985d12457a97fe157191c815392f4f6183c413430ee8bc3f6562daa7c3723663c1244cd246fa433f530d897d66105b68f02aa15a452db5d74f323503878135755242f2b6ff1ce250b8b021e6a56772281736f69b675ce5658be4991fdf2bc8de18628f01e17d37dc513023af03e7e989a645cfbac50958d906e1a7f759aea9d98812b22cb0d2e0cd4afaa350eb2561c4d809a454f76bd574764ee014ffd57ff665216ec770545c481dd059556f6c7b3cdaef86a2612815cb6c87201dc701d2bff932a07458cf733075edbbed6cda5cda62bc923cda60de2080b3c1803d8ac986ea3a7,adb40a8b6572f958c7badf2ba4fb306948c3425dbf6696c15591ab0c9db040db,36b1ad21cee476552f029ac5e578c32780886f65b221b0bf967adaa7be5540f91dd50d2a09bf1ec22e5656a386c23c6c698fc893d5351360847da148c5be3e7d00,c79112aa58d8f301d1c477eaa66f3cc3ac47538fb806e7985ac2c0dac78030be0f78ffcf1e2b2c214dc06060dd9343fc51c9b5500b37b7947ac15f8afa284a7801,743e92ebfaf694b67246884d81b16b0d8c6e479dfd49ec66fb56f78caa1279ae676f9b97f318feb741ab0dbb348b25dd5fd32bdb7a1195748940535cf51b393c01,a140d67fd8c194924c6825abce8a64b295d9d2ce0489163050c05b933a1cf0103423f17d170668aea51f47bc40b6ef6b7c98d100b0aeb89ac633ffe16ab234c000,3bcdb353f554b0a2b384120ca2685317654fccb6208d8808391525fe93fc5fb764d85f9f483780ae9d32e3b6ebcc07f9b1ff6b9ed360b7cceb79464d7796bf5d00 +7bb2819bb9f52b7d2a6fc768fd00deb908fbe0cb84e002c30fb1efd4a731fb362053e74118de09e23dfbcd002d8619525857c09022add354e8ce0aff943cd51cc1f3abb94db5a92f71296cb202fd331ae036a9119c2aad8987902db42a4a209bb04ff2586ee6cded05a3f9c2e842e37771a8d710caecf854e2782aa36da358fc409f3934ca51619e1f8c43cf1c282eed146a542f50772e46a33da23a831ea2836bf26822b90098982292ef7e64117357b839035b06c21b28285f36fcaa7e5538f6254b1877d3315c13a4536506cc0f37cef12b32af67fe0d9781a7f7f6cbed7ac67efce2cadfbcdb0a4fc01581ac572bcdbd0b26a37ceb7e00b635c72ac5252e2849f1768f3e7f1ebd3ee967c8a667a2031a3a5fcf939c8c8140,6744e3ea4ed5e5b806d6a413adb46b34a2b4a4cd2d3b3f284899f31e592d81e7,ecf499e64f83657d3d81f167aef4ae716b836c3702c009cb46cbf7c2fa2410a2773563e48d2961ee3b4b20c1c9b878d9774861dcbada68f7681c65838e87b63401,63bce975e57703262562a15bf262c2885882ae0ef185e125ac0cbade244cff725875c35f16c2dd51fd7c9eb11a646f066158cc7e628f46f2ad8fb7bff7985a8b01,3c2a217f63b15c3dad8ec3e3ea37d5681f1d05d4d9c8310a41361769b2857ab84bc98a857b1046ec91455f89b5e8c217974a58272f5c72d1bc8dd7af39543ea800,470ec682a88c9f1c06043f361da1d2fb46c7ff9ea9c0c5af9a8c1d443cf0473e42b3254ef3444b33367489efb1ebac3a99ca2bb3c3be2eeb79f34bf1b0d719a501,5bd19433bac024a3c05c82a090fa0951bc1d530a61a1661ee95e2d679a827f9257bfc817861ac73a3dacd5c63329ae99cb178c67d2c07f8b0c0dbb63036f60fe01 +968ce898aa457fa616be1f48bf3efe9a3d65531fff2e6396f1a984a6b44fa621e58cbb727fffd6bad915f693224aa6e67a27e8bf056ccd4f74d3c5a829c9bff64e2207642289798788dfaa142aebee83c0eb026340b286bc25f2256b43c31d51f6d77c29fb4dc672cc51354693411c2b5551a7d8ddc37c2d5f784b835e1405367a16850c8fd197b937c81a33917663a373fc59c013e1474406b8f78591612b4d2a150590a388a250dd53e785af60b3efbae6eadebb021e93c38bbf768e80a2e4ad8004d6609d9c71cda5777ab2cedb39442d551826b32c2cb8728bf2164d95da006e4b63bd1517acb6349d11883e54644f3a7be3386bd11d4e17c3967e82180f9acb7e13f6206418cc10e22e1fea813a5a50695752ff1304596d,249ee56b61d8c65ba79701bb7d18b2f02437103b14b4d39e27ebc3df232d1459,f96e63ba544c1fe91a8e1e0bea78a2dc358df3f7f363d4e366a230edf407f3555c271ba3dc9ffea2dddb0ee8698255d5960f2d0276f703f4d718dee18226f5f801,b37a0444ca4f1742e10507bc63e37dcf2ea6d6d1c4ce3d3322a0bf5b60b1ba4a6fe3f2bf951a8a13feaceb355e35b29991448bc439a17d6ff3de2ce3c835f50001,a37fce9f201cf5098931640f0b58e9ec8a5dd54598a6b6a4e5f058d611022ca05568fd052a8b0144f61bd0307df9e036e4cb6e33552f3aba57f6a1f0f75567b600,6c5aaf77a6e67f392aeceedf1226b3f80dc776ccbe4f975a7248512e8cb3431777296fcea5bfafc399973d5b5da2823c54cc6d6176be8f8a50f5ab190f33cd3a01,83dee0328ab953cdf6a6cb0931ab2534e94cfeeffb71b8597c039a369e0ce30d477604e663222cbbad2e08f6ab0c3ae1d1ce79abbb972e2e661b37eb0b54765200 +cefd340e25d830ef846c7157881187f7990e8aec020d58ceef44a17202563f990fb97deeede7f4cef6bda10c077fbb5f44d808bf1f21104dda9f28a3d2442d5da8e75150441b3fcc8909739a313ecc8181b1f67e4b7f4850920747a3f719f99d094b4e38cd67910352320ebce6913b26b5e26e47b3ec962ca296d0de52959642b9ddafbfcf1b1c5aadab855fe5556c6311f5786f7606f62597b7f0023b1876b14a0ec0969383e703a0a797bcf45b280e23885127576f2fcabae0256acde822165f77db622e8d1d90ecf96bf17aaf1ef7e738ac6ff215aa57f288d6f7c987a49d6a217e2f5e82803e10e2c057ecf4ba86650783cc92ab2f9c246ea5605fc4ab3b2b4bef689542a104a3bd3af1f26846bf5f102a1789d8860096ca,7997dc3c2908088d6638f4e95a1c09d3cd20cdaaa8cc9f81f5cdde8c8025e93e,e39bf64a268578d8c4d96bffecfdfd9a0a62153c7a39e6e713e2809aac408d4e2b6982e4960565a02663dbf06102150a22da1e41939ba836e390bcd74d08ae4900,2fbb361e2e462304e0b2143f12b8d91729af7220bbff2d41f83b040f186553bf1d7e6698546a21f3f826dfd3a7131212cbd133b212cd2c42ff61b7e272a5e6f000,f720ffbba9e1d6b720e890ab6eb10ad92ac225d3e074c02efec96f91a23784766a4ddff4fafd919403ec53cd2a7f4193e12e45557fcf736e1e629531cf0d44d300,24acbbc3b0763abf3851a723148b53cf0877505bb07c0783fa937478e1f8de12594c42a37d566f51db30994fe397a88d161794944fa33fe63c6e5224ba6d06b800,a1a28692507164ada8c6fa85bb4d106424786703c89486e4e155cdfac053fd3c0affb9459f35ff83a9b2e839a55ea29c16621b63d32bcec344545d172f3ea69001 +ae92bb3fa5482ac5e977cf1d882e130a2e1ab851e0960cdefbab4ed0bac21f23658f88cd9b24a52abc6f66e72b79725bdf5af2d552abbd014032e1bae4150f6404ee4cf16d45936a342f1c8a2827670d1afdcf2351e287dbbb4f8afc9758dd495fc2351f6aac66504a3dccc0c315a00d4ca7286bcea9d7b8e8bd2c81a5651a729a6a87cf1d233540e81286684e6b14477411a9b328b5af0420f0cffbbf75a5d8ad1f460700daca57f07f2017d3d731ee57bc272d6fe7eadf2dbd1463ec80191d202e929ec3e17a1c7b8952a2f121afd3cd0b15185a72bc0358b5557fc5b0d9a68eb8426789483e66afff6afdb1a3742a7bec3530e88a0c8a627fdffaab3a40e92eea42e2907077e03568b5c74a1f38f578e40ca1d50652989c6d,3a422966b2843d5572171b2ef800da9a594e25fd2287b56faee5dc6fc0d9cb95,3acd115e5351f0925c94f164387f3b054629681858c259fba100542d7263d9de183c1d795b45508710e8f0293fa0a8c9f0138d8b7796e238ea43801a1185639301,9e92fcc0128000115119d0f78e9c44d990274d4f2b73e59d9e456c744d1faaa5398abaddf94b9513032b5fdc2848ddc96bcb6037ad6ffd63de7e31047af8210a01,cdbb9fa011222778668dc16768603f9206e0aa1b1b6e8a6295dff6d462d96a1c77546c2254bc331fb98d1a85754cec5ae68ef04a915a18d100dae83485dc8e8500,3ca9e06fc6409af0c3a30d74b3e1d864ac07033ae0460aac6fcdb715b9467fdd6315ef5249a4a4428ea9302c0246683e4829d46ef554975ee4e0835bc410a22100,76db7dc49e13e61bcfaa88fcfd3bec15a42355e7ac7752cbe13017d8fa8e4d593b906f0c0705c8eb27b2d730200f2d15358b5bc8d1a8935f078bcf65178fe5a601 +87607ca74e1d111a8435304164a21f8a72a19ee6799959a7003d847b3464fa84244fe82e1afc51d739383f2afac2f0ca24bdc6ee5652c9d3bc68b49b6436637fa3665feaba5bee5c61e0ea532852eba5e2e6a1331b6869b399792ce16e800da73f5efb432e2f0ab8b25f8b34dc6702ae082523181ec0916e5efb89fd6e7647d59391f73ae63c09492ef6e04109522ab5bf735581f6306eab37ecd10a7a86b8d2768641aa772dd9d0b8ea3bdd7d8970c9881a91bf447a3115564409e0b50d8ad4982b76501d167bd5b965e113a1ec95a12947c139c560425f74c4e136b46d9f812650beda483a6eec0f334834f7a887b9d66a3ec7799f1b8653ff419e1f63ce4557a106668b168c8465d6ee5eeabf9219499532df78ff86f33ef6,103c409ddd2da2d55b480d72ac60b879475d335fab896d4109ed02cf5edce5da,a96a5f47914aca709373cda1a93e13244610a69e3c2d739b6a444868fba2d48c558a6d59016895742cc4d7b1bbb52865fb79ecb255d4dd9313f42f9f6667752700,6ad710315d3a295009a13ec24741604990be2064ced853d1f351473c60d5410668ea5fd7e9f6d662de5b8281d288b96fbb9b566a231da783d5995a1cb2e515b100,283fbd0923868656b1b2c4c0c98b586963c6aef1705ce83902f1ca84ba7019275d9027dcf4e62cbc03f652089eb302d799e23a284cb52e986f2e83f6bed3a5cd00,d945dabd8240e12035c3b5abd73a31597408f7d99bef0ad6243947a89987ed83638e7b9d82dcd36d3a18354ba9c634fb160673657d732354e2ad4d253fb6fcfb00,571b68e0b08cc0ee1090dd1457139eed3bef14ac6765f9934074cdb9683b9df43fc9642a23dcb4d1e3b9626d8fdb4929787521cc1b2c037ca04aca26c8744f2c00 +a579962812ecda6ea07989dc9a4bb30770034fc50bda4110603061e82e7bfc6c286d376d02df0968fd363e4eceb5b735c8947165c7763e56c90a999acf399b27506ead7ae61eb106356b08fd5ff78bee7061acddea4bd1371622bacb2575a4f4c88657f4ac9fb4094e6786606bd781c854fed1494976d0a6270be3b87eab8e770c26754fd108b6057eac416d535c541a90568ed0654d5d57c451d24b711e0431dd7286df82df3d033d0f88ce3fb19cc588a65abab5ec59268b6addd3bba9c536e3e19cd7c137832063f5494cc9e83df9b8372d9362cc6a09c5336634bcaf7452174baf2795524700bea2e18737c101f55e4a599691d7576b3ac9a82fea24c938db9d9843b42a7d7960d339a87fe58af3f9e45f13e350342efbeb,0cc6cc02364cec0903b69d3d64e16b30c3a20b44d2de272993d9b447503d0ac8,36f06a4b4d60a28d6373bbfa36ac45e6795a43854f7e4f9637d55428b9b6e0145bf0d52250efb95ba7b908cf94a8153725c7f9e0cca2a3cf1bbf2f48f573346f00,9c77581d51fcd31e732b37c9f33d4cb4dba38c4ffc65ba301169c8fa14802c491842c9dfcc7f15a1f3ecf8d553376ce862c5e1abab919f4dd1bb2e1eab19bd9900,4ea5860d7b1eda14e00e6ac6104c0a1540c16bd72f90ae0d99c5f5e7d30e64b763994e27ca063be36915dff960747c091f589c71c88ee3e46c5aa5e6bcefd2b300,23ee49d38f2b8d80f001fefd6e43313d36b580946b9e14f01f54202bad90d213287c859de4b81d2c3a2db7ebc9f9810923e7b8fa1e62d4ca68b1fac1b9c8e21e01,ef5a22e924a4531b009bb61ed6bce8d71a61f8e7df0c01094bbea4f76e5596ac4faf0f242a9d8280b658fb5bd29a1acb25af26bf09e5c5742a2ef2f719fe744f01 +7654eda863642021f5c220b9568db0c77af6261ea3455c7457cffdaa129868d347d9b2d235b5b26d380f74a72579bce96b9687e1a7c2201ae8a2c97eb4eef9f0d6350ee54efaa8ac8e58a8f644be5a06f93372db0ebf897cbad6611e00413bde8448b0911b28b54da12b101391d8f19281d78fde7684f0a95f192b2fe0e9c39660828a5fb32727dd62dd18aa1651d3c8fc1b96b753d26f10ec03c86c9acb0974eecf9fe5e2384a209289cea832585b6b45a07c5a4e3bce5a54eb5f4cde547b713e4f128e876288f4d7e23bc3c23632368c05123f8f34d2dc00011f7a2cbe112e6b2499686ed813c5a1ff18671cf86059f2b8d25b0dd8cbb834f973015fb61c10444b4f365c3a5335111369d5aa959b0e697f82eb64cc0c9c22a2,7b75799c62f8d95b6041ecebbcbbc86889c09249cac2a489f18ead6c3a15a52f,8e0e209656c86d9bf1efe91e38952b9400fe8d41982d816e0ce2d5d2b640b10e6b04bb6e1e31d258d826b8d0eeac7f162ffdbf4770e94a5fead1bcba6a13f4f200,80d7901d7818a9fa8bbf6c07eced25bf612b4cb0b7ad558450dd177e8584408a24626dc896e5d0f2b6399647f8226f7d93e365984b64c28e2383c4bef3e994a501,9ce14a036a925899f884256d37379022edfd80b291833187fa54c1bf4158a8c56ca185095bf62020194ee15672deb87fb8e2af6073b71e1a0d688621a82245f200,21a913b7efd01fe637d658c9031908bd9515df82e3f2731ad9cf13d80372d488716005ca62e038ff73c9440be01508945143dc596b1a898eaf96ebf036e7517c00,fac039f73f3773ea8504e93026ff3ae24278c5c8ae082802cf9c2dfc073422a5132f197c66ae98980740da984514997379fa32c2482ec843fa4342ca7ac028e000 +cd4494168b706d80a5a183e07e8733baf94718af3976c0d6969a6150a08bd3b311588961099a577b2ddef8817bae5b27a82dcd07b813d9f584662cbceda30928fa754ef93f1730bb755649a04266962e4797fc99637ce552086e3bd56f4ca13b724e8b9a7fdfac96fb464db1ffe2c63d035d6d97b4cb9bccf5e54fe359eb4fd5f6b554aeb5e24ec20820b55ec65ecda1d62687788473f9d478b88d304e5d6e9b2c57de825207b4dc092bdd0302382458b61c369e30db9bfa3d1516e15aa22cd703835ed26100f01fdb0e1c7d4d90a48f8d43fb0770c6c2a876272c087f9be3634e18e1957553b65fcc1833d9a00cb831427ad463c49274db6564829159a33cdcb34e289f563efef520dc1b1de2b8aabbb88eca4278f086fb5adc,08f67c9ba51b81d6f4130763513bafe20468ec41bcf69c738ae7587fbdd33453,a8059d4f7dc09ee89b5968f67bdb250e70f6d4277ec3a784d248a70f4c78e4761a6f6155f1e11021cd6f518b27e10113f0dc88fb6282981f86159f4f4fb5573e00,59694e529c5192a36e8e7c00d6f098b90a44ecd0d85d4019e406c6216095c6703927dd9ae88dcb41389fbb4dd0b7e66b2c1baac56483fb0c2c6ac96db8f28a7701,dfcd1f34903cd5f0a407a85182e198800842df60d20e1ec9271cfdbf231ec5cc2ec73f7726dc3b378bab64ad82ba01fd9295618df5bb081709430f341c6641b401,ca71b3b769c8329bd5c6f6da8bfa44d34c6fd18a2224ef0ec0f5866097bf741f40ce22cb9dcbcd2d9bb30b9856a898012e47052d2823b5a5530f5f1e5d43c2c400,081877b6870352315bac25b56cbc025ea8d0d843ae08b52300638fe834a33d5e03eaeaf85cdd7b1fff80d8659caa60ed5bf4baa7749ca71a295475c2d72363ef01 +bb160797925367b97bebc359b6768ba0d563d201b07e88e151121bcc6683a2c8d615aadd5e651b49e33ba59890176c174f6d0fb66d128d5155efaac2184d89e419b45d480657ec7146f84baeffd6e37aa939b3dc318fe92422bb50a81c0a0523575c6842e4ea2029258102e453f7d99dd4f94aed0b8855b209a3fda35ca345b251f7397058b9e97cc4bb238ddcf3313dfcc3d96811d8f24f4ff0e0737acb78bf99b4724800e9172f3724216536a7ebfbf39dfa086f01d6f4bbcf78a48aa22c49b388596c69a786434ad58e3d4e701d25fa20023d7ae2abad472ee6599dd45ccc92a934e7295d097ab7a3e825ea3b847124c2e42a854faf5fd3a17ee1a8c2b25c7640a1d9b25cc44d355ef712efc30dc3952e5c062588863ab8ed00,f7dbfcb1f2ff4087b0af5c429a056ec8c021d74f2aa11e95d4ef0608d7e96ddb,714d3a921e7ee047a27986264506d509019a74efb92e62bcff439f0bdb0e56014689a26cfc6aeb3797099f75b30a7fa2971e22abbe7fef5b0076e8a8fd1daa4000,1b4b175b148b907ad732a7d187f0012be8e92fc221af87b285afeaa693306cdc0e5a01f404f3bfbe72dd859f8fd59bc5316f69fc93cba10c16240303516ecef901,de59eee9c347da4d3da0ed6392772a02032fb30579578b8c33226c3128f35729043d01a2fc0f4f04c50b5bebfa2b029cdeb345ac02a220f8889071e94550ac8100,216fc995a8df1f337f1b52acfb9948eec822ad8b907c51aa38894be75acc594c5debe62193883e15ae32631bd8e1bd1132af7fb52ef53bf9b21c5d466cbf507f01,5dace387d69eb84de4e4dad28de7021a209ccb264872377c0f0492bb42f2ae7628831da0f57d37797716b09092cecf4c07b492436662dfbd97563b220355f45b00 +e9e03b3b8502c5794a4ae3c6f6fd2e11383aa8abf1b569e1792eb74ea9fe7319a80185c3976596e8c2788c4e54f31cbc87b7c62d0a12f5b3ac43d9c2fd3aa5f882988fedfb00a6e8f03f23d6f25af18e5ca1978c8de175efbaeb41128232c0a410eaa92bcb46aede9e41afea8f26184334cdd0a0b13cb2c7d67f127264927b5f59c67c8fc62c7aeea35a40a2d6d4da8af2adaaa78eae41b113b7b1b041e6eac56a1245563f2aa4610c3cc59c7d9ddb3c86c31e7629a8346f9fa16fa5b888a4c26f26069384d280a5e00fb1c4209c4e9f1cd46a2ac1ac3439dd5190f91e708f0e0238142b7c0c32984d5e6e0ddeceed7a5829944ab756d3fbb5c24c4090ecf9eae2e9fb467034a60090f6d27243bed6b815a97a6cdad036e5fe9b36,a2331011892b8d049aa8ebefc6a7b87336cc1e9d540f50029153ef8457663e34,f2bd928301dcfd54d2a8210c2aa11b407f47f1805930f3e563b0735d6ca4584339cd85db2ab1bf6e096e4fc517ffa5ecd029dbb94d82cdd1cab861b330bbd56a00,354653ddccf364ee4c6823dcc5b5e125e9649911154b8db90c958a0ad31dc1e901cc346779502c3109a1f4da117646c9e16301fee2f384353e37aa4c2cde1ea901,94e61c76cb79784f0113ed5ce8cd954a7424c766a75849225e5a17a814e50e4855c507ff7c682819b42a839c7ecf55707a1065ac53aa74407857e9f8bde4416401,7457b8824acba95d4b87a1d76254ddfc0cf3792d753a23448093a5131385a27c56ef5cc82d69bd3f00045aca06dc4f22254a0614263c451f18d99801216cb7be01,80adb9d05a9ba519181e699987651e64cc011d5faa81c3cb8209aefc6c6a43df5bd8a09692c125787793dc58ed40259745fa434d316496bafeb00138b8db825900 +e49516419429018a170d5e7178fe927b3ec99d317b4c54793c9dd8d906c65b1770d5ad6f7e46e6cb04ab8130c6a4d623d61d1f0c5a9ebcbe1b679900aeb415ac7e905643b29273b4d8dc9cc7b7fc32fb3c37d466b24b1cc84a6d5b508485f75b9b50e9f86d0daac2bb0774745bb9b344419c0e043336872d76e1e5b105d03f6517c12f0ba9382ba07a988cf176098b5ccff0612250d185875defd096ed88262dfaa36ad7ca59e01f3f4a38bb2512fd0f310cbe8eb94f4ca4074d60b77a8c7b088fac16c83188bc3e6659a088bb61e0794702ae69732757ba6171151d909e7f7d9b5a20bc23622ee810f6aabbdfecc56c135a69ae5973dce1c798678c991034e7a7cd27ff074a6a463feef5d928f028481bf52fed9ab2d855f133af,0e4c25ee5adf373724d1303f89111685872c324f0a5fb451c4f8041c2a57910e,6efaa92cef5cc8f0ace0594939a8feac9ff1d3f3912020461f6a5c1ecb71665d3b85e29262676af8e366db53aa252cd23ecd80c77735c3a50f3f1300e0ae891f00,d56f28d7a35c18faf15bb5da295836adf836072d59818f27a326faf2a1a0d83f24582f90d1e727cf6f1a9c8cb32a3ec5fb0c1d383d2bb8bdc0f28233e91bd4fa00,5ea4f7f16febef63c64e356ac6616e2091a673307681495b709a3c3a7a1fc3ee497bbb93bddb9e42251bc26587ad0db5f8b58ef7f51b84d62e8b05fd38d7ad4d01,e1bb152c5895d6cb7f7dc37f5447498267b82dfecc9ff578ba884933e1ca0f7e7ed203442645689e5274da47188049300ef93be059cbbf4d7c700ca6e4ed58e701,43254194dbd2143b9937b1b3995905ecd0de7348cb6f7fd9b963ce5db1e1b0c15c4febe195c4b80069d0cd1c79d3b2426372f63d08952b55873cf414d399b19c00 +098d50a4d7900d4d7a661119e934cfcc0d9b490f4a6cc2877ad96dcdf808ce889a1f96ffff74ddf8e6403cf3c4d2fe1a291f5be7488e82da18d787799e510e3ba5a33e64101a65908ad02808e46d7e1c24cde417f8167578d89aaf171d2f6e42e2f1eb3c15d2319878d9828b9d5d13a47cca6334083fc52badbed2b9176d380f490069769cf90ec92d173dd280f4a3c69803211aa79cf55fb3a4aa84f1afd0053c052930400f236b7a9ef26a2dda21e31ce1f8ccc8947626d172f0b69f591f776b62c5b156a85ddc6d3d719ad7fc466dd1b01d40037ca387d4cba2c1da96e574fb0d6caca85760696e625c921fa2ce84596c09dafb152af68e5cbae653c432879cfae40be36674a56479d6401a041cd0ebaae16e0ac77ddf81652d,0f4bbddcab1c6ed18ab71ac4abb7ebfacef9bfecd09736cf39689244119e4954,6a722d4348b559fd5e0d226ca7264a98971a760b0ec4d68a9d2641b339eb0a3717ce2842e2e53bfc89fc799e6b4e426e91fe9fe1c044cdd6f3ff8b2b113b6b8e01,fa1313bb9bd370be04feaf5063315a6821180311727677f5ccb2320cc052889411b84d7e63a036a59c2f6cac05197f10769fd19d5ccf79e592c702cc24513a1b00,bf20988afc54de3e501b896856086d8c73fdba40af699c23416938151c9f1732061005e4b4278645ee7cc9dfe3dce8eed6c8f758bf13a6febe799450c50ecabf00,44676df0f69c7da42a8eec04ffd058afbf92149a4a84d828133976d7f3eaa83820cfa5f20605b47a5fa411e5ecbe99bb6070cd392fef60290c68db209bf88ff301,ec4b71bf9adc0de884b6d132e65dcac8c5b3c0fe0d5333f39b7780ca1e91cb65271f9b45118c82b1fd337a28686fc1a2cf9c47186938743f0bae2898cf4f008301 +740d13cc437c61ae791baef8226302c7ae24138ce895fa15f46be766ae79761d5c7a1953ab03027b757c4c27888afad3bccb4e23f2f4095ac4b60dc2f52bfad7c86dacf580d5ace26fa33f9a3fdcd9b45f1392db2428dd3f029c718f4f279a3f032f6f5f145a4b24fa656cc264b6eb14c61ca333ec00bcc464cd20392b140683acc402ac4ae0f2421793f02bd34fdf0454def721eab4738202fed7d158bac8caeb1b9ad9ca1a71cdcd0696a88a4e1642571bfef56c48c3b996bbb53612d852ac009630f3b85c4ad203962b07d41f098693b7b76d3c783d6bcd940d0d3d59aa5bf69607daca0a765b3446501ec25a5914e67382ff2eb3ff3dd6f2420e199a76d77c165045e7d094398e3b7e03881c03f071d2fce1b93c646ccd9a23,c6a3c4f108f314ac51c6bd6a3473d7f6f646f457c271188dea2c39cefa66d589,a0fe71b03fb9be39902408db2b0b35c17a04698a12def3c62771379ec336796e2a4f28342d82264ad06c1be1e9e170ef2eb1c2f0c48e5651e8f71de13a36299701,3b05a8f65ffe433b87a15b2636452c8c988731a25067c211251bc33fef7d04b85e852dc01c203fe4830385b62e9a9127b40ace84ec218b1279e7a4f25e35a19300,195a96a662b366f0b3dd94790e0f0f02fa7fecbabdfd42dba68dbf9417ec8f3f02ae4be28fde479e38658963f75718ca9460597e59cc29b783573e8de00e431001,0f17cb6d769b8a368c821789d9416817947f5c99eb32b1061d1f30f40a3de7ee7af1a45f081809e65c953e5bfbab76d36a667a5515a9918db1a57730ece4a31800,778a17b2dffbca5941b1145c085e8c1cf42ae580744c7a65d89a68e56e35c97860dacfa260f957e21ac926afacf50fa5cdb8d8e78b2aa04102bbf9cdf15b614a00 +cecc8285d1f5ab7a7358b2f8b517ac02f0650ab00954221582508af25d103ca872a969741b89d86f868b1da885c658bd23d16c567c4a84d1653f2b88984112732711b2b0b8f5164033af123487e0bd965e29d66f0af152cb7faf344959ae0d4a9d5908057ed3a0e96a759468a13cc3e09135d06d38e2a9049b9fe594844b7bfbfa14acb51c6a61b3427f91a1876cf21416d97a8de658a64edacedc66a000d9f2bc923622148e2cac00a39cce3d76beb3fc9c9c7f072e9ec7a141129b9cd9ba22e1e645838a110c085eeccc874cdef5d6992c514d8acd9c7790cb98ee7def2ef6ec3b024a21dcb76d431cfcef66e8ef5932845a4967d607c758aa3f4f96b0630f477f5f4189d2b2bf33656be619d61d4eb35c535f6e142aaa673547,a3464ce54eb3d5ab7721364bfe9ded1bb9e1d6856bb627d7cd8d7471133e3ea0,b794d57e0a6924b900b54ef8135d98f2ec7db3fc886d9c44bbb7417389ac53484f7acbe3592f71075ede8da6af24016d6eb0b67ad2c29af3c7a7be1b4205789f01,44d5928d11a0b6eb6562e8f0a933ffa3f2877e1f9a0fbeeb004f4b1bdab64d694c4522147506c48879d520adc77b412ea49342cf2379e9f18a42f6ee2d8797da01,4a7409704a7c3be7f9ef54550b59a678992fbf8acd01bd28f0ad435bc3bdc75749bedc2557479afa9b89eed27079a27f0e87d6a117e2eee072588a85c1787b1101,182356fe2af22c9044cd5010b2b94120846bbb7a19ce726ae925943806de0c48010817dd5d0947eab4000a9b7e0bf9a59a0657e8917e40906e5ed85459591ed700,cc8e20c9473467adfb493787b3f1fc32b07bb6e87b38e6b015a89dae9b8236c60ff7ee3b39387652ec89bdefe4eb60e9021c897a48cecec520508bc05fff48cb01 +62c90159a000cec34729da2895b27575a266b852dacc62399668fecedf73089f09b7f73f6897d14f6fb1b61331abab8ff91b80667f2d35d1b1aa62ab33aef5814197ce3acbbfbdedb01f0518d0b8e95d0ac82f6f805c03cf57d9879954a259f6e92f143c4ade6e13f3bed89edf9adacd713a4339cbb2fa2b815ea20898d7d65daac23aa4e75a80d395c90a554309becc13bcf34076c32756286f6af241b440366604933662fc200b500d22eadd345a90e065c129c4b45178a0fe65d0ad3ad2bd892ca1da18001ec7374924d21ffdcd31c9a909697aa4e39066ee683e3a2367b71d8f4974a41e32ce6cfcc4f4fb54655cff54f331093345a0bac8733a73e2fc9761de7bce4000e8ded9e8565aa5710938644e7ab312303528cc2b81,4281d42111f41b354b0703c40e852706cc60276ee25815e02b2ced82e3bf08e7,971012fa805144bf8d54fc365ae438308fde5c7b5478888ed1a8ce3a30286e5a5ed6212e39948171cd4f843f5157762cbdba3c1c4f04d601295dabe512ec419400,e8276d5c4091d50f0f35870b2ac2fd2f8a758aba071d6169b2e5f46b1a74403506dc96afa05d9e13ccdc4942efd46b69cc7ce4483cba01b61eeee00e1433f95c00,4e3812b34d22aeba2d7647f2c1db80887d44756922c87850b0f41096f6b054f45c417a47a99632db7bfdb9ee4a1fec09e8e6fc3a66d93b71b6bc95c03417a3fe00,a191efeab8af8046cd3eeae29ba87354689fb8e55274eddf7bb460658b120bd766caf07ce3394adfd0cd16fcbd9f55e1701f441f457edb2877ea5fb71f855d0700,4ed41c37bf8dcf0117d0b15cd13f1bf02c2c839483f79fad98f75a3b6a8fabad73cfbe0e32ac8df7afdc8d1973f2cc5dcae96362958b78861797d04c8af2483301 +8f7203bb5defc4d29e792657b7bffdcaa44692908b4f92dfc240c66fa14ee9f0a3a7063da5d5e9943e11cbf3f0d0bbf5acd5a701c87c0e068bc965a826eb4723113c597573b9ff40cd4362f4daa2ba5eafaa4eb8aaf16fcc6404488bd802ce0cb4f2ad73bc1beea37371a05ca0c68893296dc574b8c708502ff946492aa5cde260dcb3f104c5631b9fa21d99695a0e1be3cb8f0c2be55fc34d126565582d6ace488ac940ecc2c9db7f7674abe29884273cc60a52a33e0b8be71f0f7bc129cd7eb058e6048aaabb91d9c8bb8ed118d9732176955f4a548abcbd4761b39172de1341793e01b5b2e932bfe50b0a6abdcf4350835ef2a4f9165c3583f881f75c87b3de74fe1881e776a5341a960934468ca474bde51e6e98c0414a1554,c3aef543768173278e5b22dc13fe32f7cd29f1fd76e338eb3869d3c010b7b3da,d9ad10f98b2b9d44acce2454367a4f4ada4fc140fa63118f1e9e263bb4808fd03e16d4ac9c5227a5441c67bddf5eaa5347e0ad9038f07e15db0671a6f6af723400,644092d6e3b48b25385713e9fb0e76cb4ceb8546f5eacff43fd5be6fee922bfa21ec5fd6b914fcf8cd6530bd3db2e5ca22c38b8a9fa6c042c14804a5141d19fd01,3851d88c43753cc66ec475a999e50d137d18e829b9abc05566dde80f12d4eb7d4d794ab13c20f4e63f0e4b6ea1459482013e88eb3f25da4ea345f368c3de315900,a1a907e306b33e6fedc9530cf5e60883025370e3a71367879270e5c03854e55606c5b80c8f8dbf0a1527b2a55908ab0eb6c4d722f812b1763f37000cb4c09a1400,0dd72d57c30baba6f1c3c9846dbf40fc574821658ea89e34a38edc244783948279f74ba2fe229335fdcd1059e310c812c482ce323ee3f1f763be89e3df441cf200 +f3452afa2559465dc0574b274ccdee76adc3e52aa08e2c44fa3501cd9f7a021346156fe2c850a40b657a56eb28fee08cd1fdcd44abbd6b5b70b49de62f64ebd4f7ae3ccc4d73f8c821a046db917407db257486a0ea5066b7bdcdac81a9bec3e99e59fd977f53dc98c6c9be6e4c244960d56885d72e9c62916a3fd3af98a0ba07415af3b82936941708bb8f53d6fb134be497372d803f74492ff9af9b706dff405d55acdc86a379c83942d892138ed8e6823d7496681f4584dde738008e1c3d2338b423673fdb3282bda2512f982cdf7a87f236c87f609a83460ce3c852c871c6040240cf708a4b96abc3b194b5f54a105f70d94f3e224e1698c2c5a1945ea2f2d1e8d6d5765c4a78e89441b74477234c725f18f7883e40476fc350,f7ae0b7ec53c138891f215e32b841bf633efb96835213bd71dedac6fa4df1d76,9a6e4595ebccb533becaaaf836b3ca32ab307df3a3ae91f81837d38c7af78e904362d44d7ca3f37fb8beed58c132facde693f9755e149301b5cb427aa1ccac6700,96ef49e3a19df212e5eee310141c7a58faaac8e636b1e77f5168cabe42b0ef306bbd4372d009c54917d8efc4c1c92bc447ff7d4a2b3689049afc602a8843cd3c01,09ccb568b9336b51aac80abc875a39497af3fc031857af63818f856a6ff1ccf77764a73458f9928a31908a765c95982ab6b8c45fca9f3a4710e510392d41c61f01,adf1c21784b2929e8d9e29c7fa6ad38060e4e1abbcd73cb634d1ae48e4c826512a262b7212097dd3d236abecae4326bb9f28fcc2c7ba7fa15e8294044a1be84b01,bf1a0dcfc97abb7c7460b1fef426276d10ca6ec1c5161179b482c7e2ac568e3763a5fba45e0aa4a9dbfad920ce2d6c99311169f6502bf8a8b6a89a7aed15a98600 +ce8e98bda356658ab39718dfb09192ef57f375339ad0aa64771138c85bcf3cccb53c562ddab1ec0e349c65bb973825d0f044702d7f7539ea9a56ba0fc3900e2e0f48a4ef11ee0ec478da762d93922d7caccf90bcc83a76cc3418fae9453164c28ee364802c275ede3596ea81e7dcf67ccd599b7f8c4c137d74975eabd62a2456f31c48d9fff92cd9f48be238903c54fb68c90a38f2412a9c72b450abef3c674e0186f64b22eb1c01dec6302bc54deecb03ffcf503c73e6d2efd5f2ea240013a8cf139aa7f2402e42b29454b4640a510bd183b1f890d5ac40314f8f0fd6cc9a82a923495f1a53a44594031dfaab1079cf2839750df465fb697884951e01e2b1526fb3d581ba129e8d3c2c7748725991f2e9c99258527f864743e33b,ea57ff18c9ba821038349cb7b885abbd7bf3e88e0bad3f70ca1868f9d4132ab2,88f62b707f787372d2999a1a98a20b1b25d4e6a587d4d8150e348338e68d2f4c56221fc9431734dd83cc727ec06b9c83852406cffaae8ca16abfcb6da491651301,e3b03c5fff82f818dad9c05afcc046cc012d6074783460d67e6aae3fa5498aa7555baa990dd57e06d87284ba8064c5a68d39d822acb6db61b9ef2406e676b9d201,fdc09b5b487aef1d289749021e1c90a9f82cc8f8fa916c34004214bde5709e197f4b4d12e9904f5c992343ac70abbd1a27e8469e729fc4922add3606311a39d300,95d474b68237896c59718fc6efd3700a74e12eb951920cc9e82e64a9d7cd4fd160189fde150a39783ee59ff31c9efc40a426eb81f412cabba27b99628c26edc600,ae3eb2be18fec8d2129819d58d647644b9a93d9df4634eb88ccaf6b1e405210c12434ff98c319960d87c5022425c415c6ec6171b8152ce9e87f65207ecf3221101 +4b5478e5c105e9caa19b981ff9f50b350bff60afffb5ed324ea4caa7f7112eb7cac40462936752740fbc67cafe33555995d2d7825e91f53052157f46a60f9390b321bc3b291921d834aaee9bd53c6716466083287a0a4d30baafaedb88fc1ea7a8b4a959456645d2ab0a97941dac790293f1e2fe5881d31e569fc8430e9eaae62da499770b90bf983f4fc7015932bb7fc64cd833792ad939e7437f2b7e4bc84676afdb9fa0e82efd9795f65637baaf725a39f869c342a56f0ce2e2a615c50f3ad51d8dd75b4e860eb6895bc48affb96e17ecf8763bb7f392f9a40909084ebf3b0dcb5b495d291dc05c8d4656ec7bfc718eeccc8b0e105c84cf3e46ec57c1cde15cf2b967b91ce88bb6fe0aa5514b4291c79886b33838de907796bd46,87727cd0f96876e5eb0827650412fb6cf1741c0eda2a9cd51c913447a3874f6f,a645c19c98da97bad669d4bcb95ce02a295184fbc35411619b843369cbb295284254ff4a441838adfac57f05da038f4730fa480a848398a2e8a221b57aba8e5701,cda2ab34f08b3c70230c2757519fd4e0d9dcabca88a11e35d897e247be6a7530524bfed451ec3210e5cf550be9d19a19359ccdcf47644a52311e03e39726811d00,8a04828365d6a0edfdf4b34f8daea43de1655736a288021a437d4c1469bb16366ca05a5dd17b5f591d9e5a9dc37410445e5f04856732c7be8b1ac7d7fa67523301,5853b9ed26c91dc6efe57f025e9c27465e5047468bc1f7fc002c7fa52b9bafe1635aea975f7717e846f38d7f22ba1d4623d295009e605b4f3de4ad768c69ff6f00,22469455531ca7230286a4efc27f79e4d0b32ad56c05c484b812dcc1ff934a871100fbf219f763a966b72c01ac233ccd52ad9fc93e774daa6a1d0be33c9ac0fe00 +bbaf6eec1a33ab56b4da8bb1995f16eecc9c324861ceed19dd39853c105ecef8dc44ebeab4c799c49d37ced7c0d488443a8fbfbca24dc458c2d3929e48728f36f68a82b885762fc5eff5deae608d99f8369349ee7893d05e44a9b03c61a47da7279076f97688fda9635485793af5454237734da43bf7ea82e67a14ad6146fa272dd7ca053110c98d6a6396f6c108775a3e3e8277e39a4d7ebd2144b794178ed0886300c5b6c5b0b04bfa5ef7b9302ec96a8129bf41152a434b741d2640f7a087be93d7b24987fb6051e9824cdde96a900c2b1794de3aa36f0a54c1d475f2e0e2540285489bfbe4022e29f17fdbf73b284c27d4eeb813a15c6dc13d36a1bc8a13b6a79b285be372a9bec519859106739748e32667f1a2b37726baa6c2,83853dadffcc0b838c8a8c7dde15bd1e68adaa989972dffa97f6005e423a2402,b2ee793d17b1d401732c5a043c0f060f2c053812ed8403e05c951d920d9d938d61bd73c021887c4d0d4ce9ee6aface654ece69a045a154fe3942095ebf12ec0f00,14064f9c8aeb4f99ecae040785cb80d1200717adfdbe18a5773bf1f67563e36d4d6e767032c63a651c559f0717aa0e0ed321432fcd133c0d661ede756a1536ef01,e4209a7c9b135ee6887ede722b9f118feaa2e1d2537e82dca985c0922c18fdbc1332d6ccfea2c56a6d03245056f46a6a93c60eb0cf9c3de26ec156ecd16bcb3c00,f77703870ac7bcba92c2403b553b949d2649cec127400f4a145c79eaf02a370e1fdd25579d6946d903422a6f10f5288acedaba8c4207be1addbf0d0a5747a5a301,e9bf44626cfd3df54a3b87f9493ac9f0b05340d8166332126c2e34a06f7f830b4a4dba796d02ebbdc6eef3c4676e4846236bd92f87751a76676d110b1ceae07801 +e1b688fa27e1fb7e472e9c62af05f158b9057b48ed319494094efbe55f497d8f02c4b515a1f49ae52ca3e6f9e08287de1513f1a975c956be1b58c4266943080010b05121142311cbe222355944aa4c153a41bfd067c4f08f8d92fba0fb4999ac6688a0566864698907bc945950112a22ca60afbad4b7d324042b98706d4bbd124fa628b8d7e075de45997ee0ae2ea49eb23f46f2f3da0a69171dbe48fa62d41f782bdbdeed2dd97576221f457a9a623e2a11f40de84dfeda67178ddfb7038c7b8044b37d1c266c3627bb991305585b603a998ef9e1c465956854ebf1dd792f727767b00abf82081aea329e87a6ca5c0e8df89b3ca9accb6e65719d8f7082bfc605d3865ab55b8e111cb1b6600ae4476841800f8e5583cdd27d9388cc,e402119ba369bd005cb71c93806eb5a69748abf8261f7fbf6116439e6ce8d22f,76036f923f28be626218b7945bdab1a63fc68db07976e9da8c52374a6bdc8f1f6e6224c351c52c8ea623d20f824c959b61cb081407c52c9f43656b03c17de2de01,e17dfa8cdacaa9af7024ae73a708e01f50246eb2ba02086334bff9283156690c5ae0b1732595a26a61f2d8462846e5d478a2215dde78420a00bb4b08cde6fb9101,63530327b98a9078cb5f2f2bb1f144527347ad393cd0b34f43e93067a6591eaa541c3e83e92acfa871887deac9f972ddcfe2dd2ce45c0be3009d6677654bfec901,0b37a23fb5b9686c94c74df9e3f7b83788960bcee9fc7fef8389d371127c81bd04595a3d442284c482a218a918b0428a286516abfc5b384e0cb101a03cc40ccc00,28c9333b61e3df790989351c4270a759a98725a3a21402f48fd18012bc67e220476acc2743256a8b34e465de3a3183eb8fe2e5cb3da2e7d55c8ec7c2989757e400 +232452adefe027a840863235699fd3834f0d04435efdcabf368d6865a160f41d9f3a447d75b626b3840f3a37e2b8a71c3792936ad27748135e3577458105945f45d1dd096d5b1ca826afa9de4c9511b0d8dabaccb32ac072ed062fd119422268d567fced88c95a9dcd0a3ae99e0f68ae7630a9c83315aaf88ecc9fa6e05c9e7c124642a608c946f44e84b931e6804ef83895ecd9018133e2244d5af8a286a4ca835ba85fb2cbed5ce3993ef800bf9687d4503246b8ca09b935289c321278c1f1841b45f51d40fb5da2a65093aaeb368ec824de000be92371dab6d7d8f8de309d8ada48e14efab1c42fee902587fb1b6e2a0b2907fddeb6f2e00375a2c9aa47ece3f2e5c63d41721f922c75a2757203e2f2aef7869c0c4c10bb303b56,cd71fe26d331544304f9866c1ef160f8ad6d4dea7f6fe2279a31e170fa193de0,e7da0f977a899a617eb19219434fd39accb2cad4591c76f98d6dfa92dd22a34219d5e724a7f0d96e1ba496671e760905ce0bd385f4ec14effd96cee144cfd2f601,c342ad0918448c9b24ee06af5f68f19d8762d98390b65af7311dd51c7d18dd5d63d5e92dd8a63489a22d2e472427238ee0f793741b05c57cb014f1f953d5a38700,b1d38307313c0c9582f2427bcb412a669af1b95aa5420807383f3ac32ea5f56d577f9ffd121222be0b6b4f5cd42d39a26f0addd64be3a2d011e28bf32f8e8be301,64bcbb07ef18f90d1c5ed1f191837d376322d41878bfb7a3e7fc82c6ed1dd18b180ecf1593bf4186a66f1d27e2153468b8977e36983015923110581d1788fcc001,aace9bdf4d81bf600999f9bb9ad0117e55d1fce495a97278f41683ba3b17cc7744fc42d54ae2bc17a7d08e70819290c7884497d63b7546b4fb67d4667662c11400 +ec3a8997079de630044169cd3296d34512c39230f1e4ae981dca3d7c62b1af5d21d46fa3b66081373bbf7cb2915fc01ea679f676151edff399d9eb2797f86f98c8b08c2b87e7e50dad32ff3c86802dd9d1a5a49f7fc7352816778fdb29bda6babab7aa5823e56533cf47d54ab0b9fe3967b68295ac2d9a94847fb264229d40c66e59a390599c8dcb66241d4e38046a09a4f1334d85d40f1081a9b15e4ce1d0de1d9531753566584bc249c66c1b419370640051d6268ca93cb60a21126d3488dd4fac0a3f071f69ce97ef67ee3aafe2f3182987d89f48fd06c8fc0681ece8992c05d9680f13a559d86e532c50a81a621e061829a31ce0aca28368cbe52b41c676cd0361d7e4db41530644d95b5a472d358e0da1981e7c685f79ac722a,3ce6fb8ad1e1418bc7d5d22e1513ef323731fa4ff42d1ef8b4b7eca487d41e3c,761c1136091f2df6d04b197912b2370ffb4ee275c50c3d6d0a462655811f1651652ef129345ee0b1477c38af2ab50f6de250a394f7dd28a84c25a8f77dfd9aae01,d32b485a9861c8c1a3d776a2b371a9caf69f2f09971409a667bfcb953d193c4a6fbd3d3561e5d76bf61be8ba5fa805e921e7f63a1851612ffa09fcf939578bcb01,0fda301cb511efdbcb3f1ce3194b684eaff9b823df0fb45b8bfe58819f5b39ef2d6c8d960767c706268b8f8c963686b9302dc30508ea3bc6de0320b22bdac43200,f0e77a98af9329d78c00def26fa96a77d1e6a6677b1d075bf9ed7b43eec0e68e7e0420e9401647dbbf91438deb56002b1b8e0bcac3ae00e1dea29e31184b36d400,d8acf959b3bcb4dfd3ca2bc6313d3eeaa744d0e54ddc7ab531b72304525f21c8755d806a0f862a8b734b4551fa4383b3bb8abd10205abe58d337410d8c51fb4800 +f8dd9133ae96601654c670a36b2f19eab970bb71c3eb897aa974bf9f5b23d20899c3f65a8a090da2e4505fd837c407c7eb686e88346c5c537e8941598b2f8e4f0324040307c480fe68f9ccdf1b3522b36a9453428318d810e21a2d571652339040a2ee5c5286b26696a3af66a49f2e1af2b96286ae49179596d750de83ebf2ca8b2b99eb56c0230d29d1508cb78edceb6457ac940c5e19d70cae58049105e1e77e6762be70083f383c0e3e4d0b4b1779240c1c179d714ae70699744467a1c2202e2aa200dad2a4b4af83af4d3a5dce7d0231f99ba88a19ae999db6d12f4a288b297b4557584d9dc1c24f5c6caae27ef83cb3e499984df57b0f56ff9caff4c01a359c40c66f0a2719a7b26b15be101407fc9c8d9a9a61ef8b120f5b0b,116130ce51499d85351eec467378ca7c88eb93206532856a09f7be1c4311438b,2039169892c5da59dd6cce0fcd0c01d3eac34355eca86c3d055a7abaf03cded307c53860c4031dd3cf88e864448e0c27c73d11cb1d95b0b6fea107ba1effbf2600,6bd75370be4e1284f1f9106ccbf923f0c90f3eb100b2411393c2b15c99bb83545382138efe67a12087d36c2fabbda0acff85184341a7ae0bde3283c080a6d96501,33b1489aa9913a924c1bb8a1fc96071999d63f770d09e7b9df65727a3ebecbe14347be14bc2580bb3343ef5dc28301b82e8f0cd03caff56f039176d30294eed200,22b98cef74dea9a444f841f3971b8a94bec7787605aa3f96a9f5bbff5bfdcd01679c26b0a5cb366abba62bf13dd0e053da2f9c25a1fba0fcae18070d8226ff1401,a43763d9ed3966bbf12b91e5f333748b013ead20523cae08a799b238b6571ba7297eeb39336291409b89d2cca17a723d814aedc1ae18970e732fa327bc76405601 +2d259bc38a7d100a25d838e9658c2feab7676bf9691810a5e999df06f2f64d14c79c0f690125fe9b4ec3b9d0b0512945c57ba0fe85dda6109b6efcbb72dbec630dde9a44f8f9a5d66f472e8ac1f117464e4c880f760191a01ec94c4ab5434e43e10e0921724d4a02fe80f8692a38b22bbad47f66227236285db457942bbad7571d6e8db4f2d1088f44c1203a4c02fdd5bc7fe0c4c896ddf0fc153301b3223df87e30b84f8eaeeda4e82da1dc83fdcab0b3a11fec0c7d8564c89ac2fffb03e524dbb7e9f17695381a3de83ab49ccbddc7b9c7fa86926f3d98422ec1e3cb82a001059e17970c989f00fdfa2d88d9996ecb225c8e2743419a6c8888da620fe4b0a1792ce889456bed23040345145ec0dc5fc95352a7def9d89c15905f6a,7062fe0ce1b51ec8ebd139d0471fbadf25fc050cafcc7ff5875591cd71af4bf2,f1d0f54eed2d1fccee62ec166ec0bd4e6872629992281bc27ad9510749b36d890db07aa75880d81644f8283989f4459d34c9367a02ceb89446085753772dde4600,5a8c17f652240fd11aff1fc411f55de3a044abaaf44996d7be88d0bc8a2b465043983c35d0c1a05e0d2762ae3f2152be5a190119ae13dc9ce9b500c4f46d949300,4fe1541063efd966818ed4a9a6f05e317a985cb99fb8ec8a845f09894fe227d579081ee848a7113e9be7d25a6752997044aa77b7d59b1d40540e4997ac5db3e200,4aeb11d446898da73c60b993268bc816c59084504ec860010ee40c2509cf2f000b90e80902450edaf96bbabe2df728c54e1f19ded4a31c17152e239f4b5cc8c200,47ab730500882cbd25279b4531f87a2f68754dc5987ba11ddbae418c704997e05e8c51c928e0bf14fcccfaa753184cc674c5f35c5cac2223d3dac5569158cba401 +4fa25c0a68268c21ba1e242f0b61ddb680f8f8e06624bb803a5e9d65d8d4cf8ffe7f0316b938f4ba573222225efe22e3b766746707fe784e817c4eb6a46cfa01ddc3941ae06a12c47c2aa8369094f741fc4e96f7f36d9142881e0f505f80bb11c13057967cf84445fb2c44cb7b71638b76f401b6d623ee9ba084da580ef8a9e854469a636938a6760e5953dbf36fd99a21a248fc87298f27694ffbb655aac9ea1a70c60f695ed4a2001631f26ac9988271fb544932fc968a9a31180622b697ba6e8eaded8404d9b3f98507b9f79164f55a95a69057a12fb3ea41a877620b49cc6836721705ddcb9e8bd6c2337068e7b402e5af9d780352c86f2ffebddf87e25c5e31d4d344823804eacf6662b2226b97862af43d9e1220124eface1d,5892de566de09b7521b09da7f0da272aca3cbd078323894ad9280db3b8509e62,a1271b2cfda7830ec610c5b24464aa985ea10dca39aa1b673a12a4d47f8f5e412a75e5a3b4957e078073b6b19400107a4d118ccc60bcfcf0a9bff5c5e6cc56ac01,da36843a750ab2f1fbf293f5b23050851141c48c2f5937b484063db68dfdba1f6a4200e66373cf65da2a593c1b4e9da994432164a2de89fea8f84d38cadb469401,64781ae7906e0409a7d85f351074829b8af8a29907a552823f9a0241a803a2890c5c3ddea2c75de4a175fc5ecf4a4dcf42dcaaf356027813f281efbbc3da283f01,0b787d4d5a872bf7ff14d3271a15894e88d7e8911aeebba14ffaad00c95eeffa4bd5bb3cf98eff0ed152765e4c6c0ee8a497f96f9b1327a68055514c9036a80300,24b7aabeccea98839eca350194f04a8b425aa492d82fdd41ce87d50be7fe26421947cef2e762ad045aa8f178725b94866562bc07dd433f5c1eb73a0e915982bb00 +ca6096e33efe2d88c8067747f7ea48706aa13ad7162a7c6522bbffd90cd6b1753d7acd3cfdef38f834dcb490145f18dc16df33251bd0e4117b5366f7050607fe1d12ea09894f9d431e55d088ee4505a1253251bfc58d3f3694c5d4996424d15fe0fc1dcf4872b7014abe59c223e7aa97466551d99e04623cf27c86eb6968a951230428c271e6ced39aa21a5f83561a59154923762d5b3e5d00272164ba19866165945652d3e1ddd207b393f456351c2cf265fe288e400b4e61dcb112c511ab3d850156d89da9b1a5accab7727dc0378374a2e2b4c5c0225e1502f3634fb71224dbf76bbf77041495797843cb982bfdab44f01ae3742dbaf921073a61c8e533bcebd364ff939867ffc430de7bcef2a62595744b8082988a1d5a92f542,323a99d47683b73482d6e192bd7d194d69fc5edc594a527a710e5a73c75040b9,2433e5c4f8946953279011586b71fc6264bf5461988925b86632af04416b437c5e6ce8d80c52711b672f2c27b833663a0eef5a180c36339c1886c088c3b6246800,d912d1187c1260a5d331a572ef8adfb5416fbc48690bd3d88276b52c9326b5e04cde28a04f153bfede97825127fd59419454e659e3b565680f5fb502deb9fcd700,974054f826a4a9a5afad86cb5f99cd0a54bfa23ae0c2750bb7521707991cdafe7217a13e6ee9a2620b10828e594cd6b7de0584f51c4a4cd300b495af6d7871fc01,e24aa1d88983d0b26e626bef51af5a49ea300ce703ce1114e1ec905dfdc474307e10226e64dfac93e8ddc3acc096577abce1f8dbcf412274ee62b3bc2e7b5b8d01,e0c62c4e565c273ef3ce1f8810c249f37e45c5b3de35af4142eb85f02d19ec95565c1d54a6d03142bc08e22a7554f13de0d965c5dd8ca8f69dc86a94df84ec3401 +573f1748edd1ab57088814ac2123468833d07759101d8fd04283ac08f544ffd6c8a8a40f9282ab9978e876dc33f5c347aa48f71af9dd7a51dc28a225cef934b363852a38d9b5888a3362c198ebe0d0ae6f03e1b4e147d7fee49607dd82aff1b9109560a74f5800e16130736a47a6f2db5139cb02dc5c806eaaaeaef609e88c584775ed90d1c492ea568926219c6253c4934cb0f3109c1b5ce3cfba84fb6cc796b513e7e4a21b173b6ae2544641e15884438c0c6bbc380e625875dd4a7207efa8ee3e10f27fbbfc4ca20766c3926c0ecbbe4d3b9cce7c64ee297316a30459006fb9a28c5b50eb1420ba7bbc6e7e252eb6a546d5a33fe6c1d7d0843682b5d966c96f5af86cb1fdafb994109df002fa0404a2963aca4f8aff7c45e0cbb0,297f13eda95a6cbb4a8885809932efeb79bb9588d7d4f6f039aac6e4a5fd6d56,88a7113f1125f4f11fe187bfcc525741cdbfdd746d9b13bb2802a1717bc147f2221f6de77e3a5c6f0f24cdb44d996007b3365a1f8bd8d9e615610a623ed2813201,e49e5fe241100ea4e15b664355e17b46eeaf798f9b7268c9122275c7bc774f294efc44a0ad8cece0efc6f21f1044650f3233c015c0c2f91e30d09926e85bf98501,8d25b6b34d0a17879e6a95758739caff293c86e52553afd69863c6576de3d0a029aadec77f6f2c8b9b1dcdd11eef4f2eb8af3ada20d45227054a5a65da087f2601,b0d8f3d9684d2c85b16703422d1ee7166ec5a5aee7d44746d24f444575319a940426fc521945d2b1571ce86e7cb8f541e288bb2ac490e4da7962962034720adc01,85b46d07e4e30f44da8dcc06df38326f1efe645f15befaf49717b24cce91c1a75cc315a68bac37b94197fe1f347a1cd9d51b42f6d71a1171221d35838989d3d201 +b5dd1b7a140014d4200c507d23c1e73e292d97b7af2616a972b0cd92d2bfd749f853899e9b5d692825cd9410a3b25ed8dfcdcb22201ce26587d7e31a48cf7d158be9f5bdfce54c3ef0c927d420c033ea619a0c42972ac55aedb2bd4937299e76529e25bea2bfafcb0c7dde542a4a01528370e091f208987a7b47c833a71c932f8887d9d10f8b492b34d9ee32f3b6982701d8402a1feffe56ba94e6d8f402443019f205de45f5b1b104adba77381694f281a15393e3258a32b844a85257dcb614750618dfaecc7ba74f21a295eb0b0e163616d80fb754539c0c78aa08a2b7f6ec516a93b851f0dbe41b3dcb8ed50d84b5a68af39be94c811f6d81545800012089b2b80969a6f7b2f904688d18ff9112592ba50e3a35024041f9a3c6e11a,c8f5c66042d0e1483f785da8269bdd525637379e0d72e51b86dfd741a575ab82,5153722eedc0f62a31f9426c89fe42d42f05db8dc086442ecc3cea4014f6e256128f0c8eb391de7ceb1b2d531b15b5fb763fc4342e15ba683d5d27026674722800,329f2bf4114849633cd5f453272fa4b12247b2b107c63e3c2b05087379e3d22601e8a3997927fe2e5e388cf06f390708fb04e972581513680e357d34006f327901,ae62247cc191928457297847955de378498779d057e46a9b81260301d64b654650ccdec1a602758eb7c789823cacb43aef5a2f5a9a09d92612e23e9c57cc48ad01,b568ba20bbc87e1105148f11e2739385ef948d6d490ba931889e3b96ffc7fe3307a803b0f2a9c81b9c1b08ce458d6df217c731bd9b0a8757d34be370fa23cb8300,254997ca200983806d7702b651a092f4e1040ff66acd7750e7bc4b22856efa8a568498a56f99c089d25c2129eb2844ea7f53e294dae7f12708e3f12b9955f16200 +792b44704af84a4d15acb39bd1e9590b958e5b22e5c7062e2a3ae2c21d1f07828235c611340e498631fb2d59cba72f92825deaa799ccb8046c9689379f9ea4fee408f056d3be5d805f23a734d11b09a41e11a5bba7e9d94539dbc48234b7794a8eca20ee63e869ba2ed83aafbc192b06018e53cc1b32126a0504e03f0eb8824814887368ac18e8154ec81c08ff688b230c204bdb92c55cf393362abf4660bc686d610c3f631285952a2ccc683e559f976a76fa5fe7ee78eaf71a9a2b35d88711a85164216488a68d1c1969e1279610c9ccafb6d4f101c237aaa016e8c53fcaafda45c705af2617071378bd50e2fb7c609974ed9c4102a0b6780fbb2b4dc17706ef3e2a232875fae27683c3ec21726644190f2acb6e2063b50645784288,62a8d8068ce16e3cbeafa886e9de1fd63c027b51426d4dfa1875181c8e628d4d,5ea6676ade02837a8029edeec847dff6c5e3493703cb9de031ca6a84f7340abf1637b8ab88cf287b49d0737ca4d6a664c938c7af80d532c59e8e32d866eac5bd00,8515a607d11e3837426de98f789e7234e3d34ed99e1e89a31543c14b8a70bca0388ae88da302778d34785342435f5e432c1731f8d24af14524a2d40e2ae4c16300,47d8334659d222dd8f4a84ca926b8ec3333e7e01cdfaefde4f90f92367e3d2ae195c060ac6deffecb994f6644dd46482d3416f27665d233044d189a10b8a487101,e2264b1389cee3f37ab885b58a2a3bdb9df561648afe22c92ae3ffa9b285bd7c5fd31d67bcf12eed401dd7caa78684b8bc096602c3f2e9aed8a0c89efb90b5a801,3a53e5a75705de9a6ce75dd9425a485a7f8204fb232b28a19d52378e4b0c95e52769bb2cf0bd54869b90cb827a14222b69ddd0743fa6d853d1467d259c9e302701 +7335b3aa635ffa713c3f0716776d399731579fe94a36a757224d74734fb67ae5d6d364c2186acd2bde2ef42550eba8a03e62d1aa691ed5d512611455f6e8ccddf6780f44204267db58c54a14d0816a2b41a218bdb06af477d25ad4db9f327bcb1931009e742a7cb28a5f7038e3cea31cde11a8b55255035f596f73ae254029a654547d95c6a59a068b8be7dbd031e2a0646fc497cb06834e466427f731666ec4d8765639335740b9a8c4193a1d414e2a7a43c8716e3301995b6dc1fc62745562ea4af4970cbe55e5efca29fea6376dfe639fb69b401d9915e2ceeaadd5a6309d072667963c3b9fd7d8fb28c0e19108b0b0cf63cc17673d72ec66c48fe135a678dd02725ea979f3bea4d3658a3c3f3fd4b9f37c47e2b8688c26f58d6b96,6a74f6fe3636edd13f82c4fdb7fb17ff5855681de1ba97b063c6779291250ff1,cbbb3665f7c2a48326f6a74627e9b8e9889832c4eacf0883c49438e1665fc1b267bb96035735c274e6eacee0b9973ef7f87512c341c6abb15c332c76b8b8a1e601,3c6782d89609caba12d19ba508a4f5153b2386f4767da75e1dd61814a6ffb10d14c65f46421e94ba3715f5231bbfa86b407cf02ff99f3a409da60d729b93e91100,4fd3c487cb406bef1b586755aff898b81da23a4403454c8c5ba64e3ff316371b0880ef3c29bb8214a0911280523203fa5dd6b113b798c0b7c3a7a1f562171eba01,349f86a8456ea3bafe6c76901365ff5650546e7c084f53d7fe8ba69ddcd626d90549f110cff8b5d6cd9a6ac8f38ff656c59114953d941efdfcbd98c6a05b001e01,55781ef76780997d6f9474c50568740c6552b9e67c944776430654bfbbe78aa13fe5d99ecde17a9135d023064028ed5d00f89661811f1ae2049c9d877189d73d01 +d6290ce5f8bdc65ba82c535620953f826828fd65ff0a539bddfd8967f8418dbca4b11e6ef9d7b3cf911d86f642eeed03f3a5353afa5151dd5c3501caa039c7b2de4df11b9e4476139f7a9bd912c231cc2ff186157c365bf6679abab1c6be34626467b8743a757950d3b1c140fda70bf3bf11163f0c2644afd70984d056fc5321a0bbd43c2a364759a9122c228ab5df8536d6cf17f8c128ae310395e31f952aab8c4dc8175e0af181a4063873ff8ae2e632fb79ed2365431ee67e9f1517797c2404158a84e3bfc7bbbc2677f85b0204341ab74855d8276658957526e954f54c32f6f9c2a71644424d1dd9793e49429215f892b3726a095e616d895834b9c2737af29903ceb134eea40205fb135e5639f092c94b102696784351f1bb758a,a5414e690a440735166b6a901e3981dfd8fb7330cbbc27d6e93b7dd4168033ef,9646882fe91a949b78a21a427a28b03f769628df6520dd2b5f9a8973ddb6094b7a1f8434910cc5bd744165d46e58f4cd868ba6ad256d1b70aba80a6f73634f4d01,9a1e6651e115426e6a4c2bc0ef045a61ed73d888590c50759f46699ea092933023d61356e794cfee62ca2586fc311c91f0a8a558b59aefb85ce520646d869fc301,0e231d3aae27b0c279bae81252bc744774f4ab63c926fc89fcced3a260fe09470f7914e57db029d4fb0e4582cb5fe9301bb2bc5add3e64de7846b7ffc63733ca01,e600fe10da71297af927d4f82cb91a1c5e1d3aed6b26b34cf5627d0134166f7a0cb0606e8efd72de9a0f51e576ed73aa1eed2668efd430e0e85df13b871c112e01,591207733c6811dd81fe9d72db4ca112d3d8db02538c7017379cbad1c700e51b1d0ec940210b78fb471ec6faecbe22efe46c95eeed3e882d29ce36a202a74c0501 +3b96248b9e1f17d1481661cd67293781a87639e4d0e8c09c24f2a0846d77c752496c24d6ce8eb0c95404438b2aee74892e12074955143cea5343aa91aaf70c858c137ce72f605975c4c0da6415e779a9ab7680b76dbbc50f655d6b3274fe890483b30f7b07f44beebbbf88b2479e2ee0990a5e0784ccf36bfdd94129c79729b877f8edb363dce8a3dc9bdf521e7f32f1cab4c0c10db3999e1a9ee83062cfea56211c706dffd7e395f6d36c50d2c55c342c4113a74c1bbee7ca9b7c829fe809117a61f6ea050475b4a76255888c4ad2c3a2d809d1dfd4fdd6f3963c1b9495994aa6326f6b6597ae506c97daccfed1bdc9916191c8c1b8b419a39441c41fca819b37bb1919124a09a7620ceb1ef2a6ac77219a415945a3112ccde3bde367,fc386498d37e5f156c7db192abf88f95fcb6303a1a425dc380b1c9b6ae726cab,f0b91fb82a464c38ba4aa0752fcfdd7d6b9c7bc1141b2fa3a30de1a0d0fe989004af8062bce8f22f83ce28449055fb97246fdac8c44452274e337cd2c58c5fb000,6aa9ad65f01548f6a2882fb4aedd67dad6b336e514c3138d215a7655344dc0176c5ec3bd2695f1a5849725b571115a4b5ce0f265eb654a4e647bc274a241699f01,4a683c1693cca959d641e3186bf689ba4e649b9ecb9f291901e8ec35b919543f6f8504ead3c5c2bcf0d9997ee4a37dcf92b84232c93d51baf5744593c7529a5700,139f5d4ab531356f4a3529490d37ec521e376b81b044d942d6dcfed8c1c2bf271a4c24a63d7188b7ef49ddd6ceef786710a236dbabb390a01ac2e0acd4d4d68e00,e924f3f7da1dc2a2dad99c2536f32aa25a87dea401f4e56d333ffd0a44d3e51f7850af3a0a8ca2ccd650475abf5b2ee29b32d45d622e5da52f1a9ea15879433301 +28e5f41e197a6cde1d9fe51e50fe7f10ef5e5035c97abf30342510fa094c5671e3bbd8a40ed3e3353c7ba871daa37e5b7d5d8859db234216600231e4c060c5da8bd02d3f9d11fb7ab3b67a39df6351cd3b53b77245d3fd1a4613f86d435fe44406447976db20d66050789a5815f8eb4078aad94e1ebbfade1b617a5ac99fba53581cee4b95cc9468d64fab71bd56a8a0d2564cb20dc515d8bebb45cfaa8da8040e6ee34d14a51eb93d752a24a2e1d37984ccf68eedb01a513c3695ca3b2ee2fec710f8086c50862bb21e29ea0c4b618dc98de51cf861d4d0042851a830be77b488c72a452de7ca8155cc89e0a848a17f6aa45520b2adc9d9e9c0808268527560a566019e2b0cc5d716c0e35e4a2baed198d4f7f5ff132e40abe23e61f5,283139d870e05d067c0e2b6374c81e8d686d37f376f27274b27bc94c663a327c,2f48bda4bba84f70cabbff0cb4d9a5391d3c42ecff85d5b9298bac6b96b2ccf67377d39bd5586096f17f9b59c2ea4a87ea42497383e850c35df7c050d537010401,9774aab8f8db938c29643ac89a951894646297a218be68a49fe527cdaecfae0349e84749721abbfd2262a58752f615ed1ad4e357da8665b90638468f4b49dd8800,753fb321acf1277d5877cb3190c726226d0200fea7b7e3d5d3f922762ac3e79b6546af46d039f0144ae23a1394adced732f1f452c4f73cb05515ce4c0bfea4ad00,1ac963f1f071442c47acbb426b0fd19d4568f224c7b1d63e042f1b8674081d882d9f5cf7c3798cde83fd0520867af9a3b2ecd68b179d1e8d53ff2bdf57f46a5200,fce6bf092665f7d87e5dceab2bdd621d356927af99457a7374fb6b66e0e0d6075cc98f1b28ad785f96f9a83697853a1318c676df88759ca4ad651625390825cb01 +2d65410e2cf78f0b6319539e72eba3a999aa6e64314c6bcc1c3dc9293dfc4a1fc5d4aa1a0f1dffe7c60d333eafaf41cdfbf4da8a46c025bae80553ecf823c4b5e51fe4abc57534f711f779415c0d9f984cdf6930a67a8a7bd3ebeaa9d981a679d17eeb9aa69e60c9ae75d781279154c5246f01a711452e85781fb88beac8a87f183d4adeaadd216da91226229c31f1a7d489bffbf5b7575191a1ce37baf8a8d49f782bbf808176504a193806b17e12aaf598108f9f9d8aafb053ebe745bdcd5b96e7e125fb76d058d18a2d1e5cd0cd276f4a233ffa46d23cda0369c6997468476bd518c581f650aad833153dc52ffeb7cdc206a06d09d416777a72cdd594c54c6b939dd4d6ea815d977abe4d818c05d3c2595435be42cd5e4973a3392b,971a998b1b890889633c6fd7dde9afd603b70e978a3c9893673fcaac5361b5f5,4a92c3dcddd9b39ee1e1d41ac5b7052095270d8a7b4e2c1e2d9c5408ab6f1b06524ca2498e6fcaddb254e32fd2d486cc199aa6a5ad00bbd62765b04ee915243700,ad09569d669beb39319113ce8459c237e9efc474a68d03ef147ba5f437f3d72069c17363b09da73af778aec1593ef247214a5fc8d1c8310a9cbd2a1648dd0acd00,432615c307d00fb961e4d06dd61c6fc7923a831405d377a6f7436643354b54c26389f4fe0d689bbc2ab204a1b336ad60dce69d87cd5180681ac70c7ec31f89e001,c0bc78434b6378b2e4e6fcf8f603f081418fe820a113356e26360ad5c4d42a442927dde48013662171575d063f9b8684c489f28ebfee7c482283baf26e39602401,2ce9d6f146253f72f95f9f5c26422e04cd810c18cef124bafe0ae702cdfedb3d4ab032dbfac18b7ca8118d8751d95dc1f31006107381a939c09f81547f5f966400 +5e2bd76c47487cb8c88548e9a19da71969ce8db9aaa4900b336687952eefd5eeee65468678180ae2da4b3ea8bb37dea2d4d48f47a19ca24467573599de2971a10bdd1b5c28d7812c7ee1f410cc9b7eaefd7f5b56d10aa0ea03c7992c5c21c78b920db323a27945176280f5ebfbcbc23104d053550118a93131c0f61eed17a0ab597b5d2539f5eea10ad7d1c4d5cb0ce5f9b05893c22bcd216619aa2b815a7d351a639d3bb153628f9af7a3d802ea277bc0f12dc06efb535c61e15e0ef409b3a54e3e3310693ea2f51001837c8c53fcdd8411a1750c587a3eb7ca246581f223bdada4a9451259753dae0ad918dcd189efbb41e503bdea1f14648b3c6a55f26c577a0b4813450efe27d2c612dc94024b68c0dc925a554c5903a383552cb6,070a8d82d04f44ddbf80d824105a3bbd33de063f296c5fa63995672f5d0fddda,4641e1b2ae602f9c459942fcafd549fe4894968a502f4d7e7858d06c510ddad82e29f783a57aa88df3c31cc87a6d3a74c7ad88324ef1b4bedb6b5939d13f4aae00,506c8f49dcca01c56471b9336613b9ec4ca6a6d1b8847e8294aba29df035cde400fef16b753dc586eb74ef5bb03a602c50dfaf7857e26946050a7ea60db207e200,76979651837ec6a3157666a1220dba44e080f77d16cfbda59233ab1f5431ff3402c099887086fdbf9a46fda2301c7296d89ab694dced673e2bb674599b2e760700,8a476d271d408796c7bb521602f6ffe897a4cc5c70bd16499f555c7e1347d029660b892c21435ce505438665f2bdea54efcdb5e24ee471441cf8b7677140a15200,9ac4f8b614b982fbdc8a8aedcc72d0cf2ddc1ef70ba1e7782c2292b71bb4436462dafd66201b85713b5bfe661a14b6382eb437ae542009e7c26901ddc198bcef01 +0ccde5b40c226f1c3598dabb6e3ff6373f28a093c5f40107e84e254f4115da500dc54b87e0eabc71dda5599733e0490d62a23cc91dd4a3b0bdcc753bf310b1437d5e0454ffdd7dc24dbacf1763d68fefe8dd715bf05916fc77569206b6ffc6d7da2c04eb5be6fc43ffe232db8db8603ff2de51be436206b079fa7d82da07449893b20e0cb5e7a406a10ff23e404fac3334116d028e4319e0dce79ed12e2056abf2bf818e4120d4ea2c035a3278c88be1a71f2ea2ca7f98dc902018734cc86fa07dc85d33e0c481ee97fedb879f662a3844559b77608327fd055652f103ded6f29772f64e6b0f9fd119315c0590a61edfe0b8872189e19df9c1a401e7a8d58ccfdb1a39f408cab8d8483b362aae9d371775cb1831b6db28e54b995b9316,3a527c1e381a01fddf88d007bcaa7d7556fe887bf7bf57bef43b8a52ab4c70df,1af70e4cd9de4e695bcc0437d3b14f6e6ffd8100872e739ef3e7f822347d5ff44a95cf981db39f4c63a46162029dfafcdb708076be03b871da74775a5adbe31d01,56c286ca9e1037e68df84736692fab184187c36bab1e2f5b9cfc3aac50e143ad6be708638e1d84efe93942bd40fb9e001bdbae744d86d2a23a82e35225ba29d101,30ca4a061c059363c79ba9ce1f38f497bdc416eb5fe91c07bd3123c796024f662b9cc0c885da9b1a6f2477c7498ba86de9abcdde4a770b8a39f29fd48a1442f401,8d6d3e2ae32a49a247ceefe80ad69a7b8cad75332376c355948035d6efdfe1af580f65b503ba8d94ca1a55ad431b5c1a2961bf33b5e338951c9a377e60df061d00,ba26f24101948e18ab3cfd6a7fa4a39ad783ebdcd1a16d7dc8d8476e29226480494b143f0d778e974e0873ae168928b3447c76bd52306dc60b898379be5c568d01 +398800bc1999efa378ff9f63e53578393b3144fe971576be3298f563723787eac740603175bb790547835d5f3af7ffbfbf34766362dac9d47b08e7477c95b67173a453b1572ab293fd4f08490d6092b6a6664bee7f545ae5680b1f9636857b06911959c14ca5194294e0d87b0ddc2f743bc9ef4b88e45b43d813fda83442e085d9994f63ec4acdfe0aa13ad386a3255d244c60ca65f3b5f7c336bb436a8c03a2623f9985ea8d783fef80d69ee6392b86557de3faff94b8dda1f1a4bb9415ca4518c3d914ddcba9c76b8e672f05e796e9936efc592386cb0963642e9f3d2240d1f932ed47324068841852fa88a30f7c5e0c22ab9ab7c9dbb7552d34ad459a1f44854c32094914d73e07f022192d03ac05a4126712eac6e411ddbae09d9e,ad089a13be0f5b594b3a379074e384534f02011a07b6a528931ea4a1ccb7d269,1cd2ec0961f71fa51285bfc81bd0619c22dcf1deb48ef2868b0f4b9d5725d160151f18eeae582586d8cfcd607290466afdb3a30daf5a96a408a61bd8bcfa58d900,15b682a181af0b024686d5f6eaf02e622b58942488594ea982cb70978ad8943710a462cdae2db5940464921680b25d29e4bcfc7a9adf5f89ffefbfd2b3a26cc800,444ab8c72611375c5e5bda2d0cafd4a4b4d924a2e80c30cb18bb1de08e4eb40050c46db3602b99ff9a1bd42d6166b7385494aed68e6812c19c14695aac1324c401,4367d93988f6560b560506a8ddf3715df1761ef4595749f30bdcc8447009026b17826f22ef20d444fab3225c5fb350f6a801bd38905a56fc9181fa571c37c6b300,4d7ac004d21ca7ff8f6b4d73c1cc1964982ad33b5b507329bd01eb8ae8d5ca3e591c7d86ced64982e40c1ac3f0751d770c052f6eb986c7d513d6630331829c5901 +ee07d05033695b4858b42b3c796aaa48a9d9a8e7b21f767caa8396365ef0980e78b1ce8548e275ae136bcddd309d49b01dd6efdbaff931e51cb914642fa07866e8611bc6f489fa368e7d08c791158f3da5a227c633b69180dd7ab091227723634b9ea9a4d73d01d8dbee086330e26dd60e7d7ae23feb5acd1dfe2b0e1d52e3026021b1fa56df194f1fe915f46e1d1e7b63bd108684dc996b5b05ad0561b03bbf654e6e073872fb9bf805ef6f2088ba7580177e40b8a915bfb95277b9eccea84ac9c77577eab3b9d429bdb601b96f5c428bd390fabb1a68868cca313cc614021f9e6ffb2e7e73de0b14d61486c128a240d57b6d70f5440f720a4ade8dd4b259c143f0274f0445850a4f0b3ebc1df91744807c45d3533e3b038491e3ad9716,0538e1219ae090f5011e957e8d1dba41cb1426349ecfb42d1ad12202ae8e2b96,1a22b1c000d849da36495bf08d98f6f02945638482a30d439487c32bc7f9f6825cf48e5ab61a0df03942a28f11a8e3fa68a383b85f4e01bbee9593460a11e34401,2c751010d68d01065e8763917dcf793ed4786b8e0877f74099cabfcdb366cd813356c184a27a8a4034a4688b26896551eb3e87b785f22a73ecc6eeb9d6c5df8600,b616541058d0ab6707a19579b3df82bec8a1981626493f6d30532e06eea1725802b790e35eaff483ea7160fba110f0a5112a99eee11a4cd7d2336376848530f801,90c408e4a420f3add4841299a4ba4dad6632299e8abb7d9b23ac7b1e485b2a9905af31fdc28ed5ab5a9f344634a9fc5625dbccf1408fd031bc8d2a6ff36e0cc300,37fba6ad11a03f7e1a4ee934e8e421c7d5d877420021cf99a6d2036788f70984193b15633d0ac8ce94a13b66c837baa1552ac68144fbf28841c4fb94c13c8b2101 +13b003097efc847ce833e306b6813d357b0602defb6aa8f5354a94a05df06db0afb98f3679ea614c3432d8b9b50d7550a45431577c482e5d1363aac106b6b4f1e56d1fcde042c14792f9bb1f8750f2343319201ecdfd5a4a151199847e679b22a7b23dc773fe3b21005ea2254148b5771f932195fd6d5233f2b96f41cb5248645c464f91c06f6b8643ccbd37f675a37fa8af5b3424ef9fcea29c84d01e9b61fd76f0f8e1f8da7a0e4f8e58a7c645172b1422db77f89f6f60ebba8787e2d1c855163cedbd9071f252cd6dfe7b74859ae01d2d0e7acf2e2b742a1abeb2276a039f37c973f67642379db6d8a179b919da42944b516edd809b56794b56c9fb810ceafbfef1289c822b52966cadbd632219b326d3c5b190beb5dd619f37f16f46,0e2ba15a71efcd9884a50e0ba445d3aa391b28504d77dd4374712ba511d761c7,ac1911b0cedad4d6ea227b8a0e67119d4e773c881aff1451d088e942a0d7ae3d4cdeb54622066d3dcff1c6ec5dbac35bab610fd7bd9b444ca87848280f220ac301,7d3d4f8529dccff2fca15374496255586e0b5b207740201d70ed5ef1dac67f3c160d4318081a062b510b86e71a3d031a6c035693cc28017c9db8ea13b1cb8dc001,50da6634feda108b16723ba58e428d6ba916026b74e683b4e24ccad8b5b4c2cb0c2a9da3d1d6ad4718eb44582ce711cb547553887a1fc9a8f0d5381a4f615c5701,7ba4546b5edb61540ff0e8e173c2d853166b90fe6ddcda5d3703f6fdde74602844d061703c8c0afe39757c2c65189489984844913c7d17c280f35af61a26be3e00,dfa1e4ed8d4990cd8146ac8aafaaa34173722f9e22e8a020b17e714425e666a71489b588e5de90d6283ef2557a88e7ba42583c7d3e4934b805d6e4f2fc28a42500 +fa11acd84b8f639c475655eabc790be1bc51f8cf03740c40bc7ad6914b69b37ca37fde99605c614741f1a58ef0df1d636d2fed868db6c9bdb14b3a37f8f1beb0059471a522c9592a8e0dd0616b2d8e28bb0894d3ff963e5d836e9267fa68a343642868300f51d6cfc14aa239f9a5ad6165b6f7794efb8972893caa399a8064da2fc87b7481bed0e8df45de36ac411751eae7b87dcd48ab1b047626aa7af4b0f4da7c10406853179cbc8e403d2a57decef0829b23d72d375f9dd45822e2081f64c91b106837da6bd2601aa5d2c34bd453d4907cdb51f322164f659d3380dbe30b7b6ce6a0431d53df28b6c1ad401a8142546de836e945b57d18619d65a194da9cc779d3ac8523972c6475ff2d949cd1dc7d7699b37143d03fe025cf911f37,9d52a8fee0af94f7eef0d5420e41e44a3350b0d9ad43d539fd2fb208f58a3222,60c6b534323db7bf4797599ee47d184c0784d5d816c2f27d48290ce49b36aa586fa51f0d9765906a572297b2e6220d3e36def97c64a21a012fb326b5fc67492900,b705374c5401329e0397c06fbe169c467d215b49f08dedf07dbc9d183d045ca5070f38bb5ca3c4324bc057a50491e89edbcebec15b329636b32fec4f37ffc74801,f64cf2ccad6685972782c81dd82003d3571307b0a58d5bcc92008b44d18d057c5ce9f0ec533155017e0efac9192b6d5ad7d02b4e1f6c71370ef2571706b55d4201,abd1b713ae96c70c9ed3580ebd6beea0d815f1ecbb7d8a04ba2a725781a1dba31212d6fae3e6170db0660ad695a0f446e2302117cdbea0ff1597d2b80a08b1a700,37afcd7a13dde74a6aee861726ec495fc79682c08e161ad6444e9a41bdc10a0a7da3db3b85363d07b8879b56de6f193e056b5ece225f6bb810c1b1336423d35f01 +66d1164136e119463cdc5fd6011dd6a7d13dffc954beeeb7b04603787ba6af2feae6e4dbb12e0e54ae500d0538fd0bffa02ac13a6ebae51badb0c91a5c85e5a86b037feacae3dbc9d628bd8693af90f7a306a523c20135aad2868b9d2a463884df17ccff3f97a6441a8bd57a63812b1c0e499181f45244313e505fb7e518604d00242dbff6359f8e7548ca42eb02a2d4cac028d44a7dc37f8051e8bd25593c45ee2bd05c8bb88f406db19004cbbae0f61c45b0f2ca6c554966aa785b2ca65595a8ddc27ad2f99da82fffe9e22c85a3ec7c98a76d5a4c9d7a500659031c92a9c0bd710b1ced9603cee94b38059e441f0b03252ecf4394991327da6a1a304c9fae024a510b0da81d20dc0795eb09d21a67608ec73f6c70fd582a06ca13e669,5b98f4cd1e7f879ef5b57f682ee40797a13e48c12c6a0447f61e7553bac16780,ecab9ee42a7a54ff4c48a2fc1e67d47bd7e8fd2530ca9a3e320b833ad52cf5467d8de039f9e32188ce79afbaab906fa1c11d8ceebcd3f11882393faeb5c357da00,ae42175ccd3977d82de6add3496c24a0736a7304cd1fe57cda75c8d09979057e1e865b29a8c173081c96ac81c8ac186332de4ec03536df30b8a88d896474f02401,554edc81d2e693fe3e53e7b2ef153a6ae82c3eed01f32af7c039aaad33f4ce8c79d22b2c4a9cfd7f133aeceba0c01abba4848100c7b6442dd122d3a51d30f99500,ebcff73a64b23cba910af60d19497d475665eef66f95aaf95764a24130b5fa970bb964cb755ecdb8d0fda0a52a8bc4ed4a82e825d1765c52fd8ae88245cead1900,a0c0e034a7e918767ca18d71471bca3a2800cd652fee02e44730c76c92e94fd65b7f3ee310bcc26e11771ac36dbf80c6a6dfe56edd445fb62f6298c1248b350500 +777cabe392f73835018656b56b54964a88e6aef084b0ff8fe2d2a4def00639e883acdee4ade2709fb9cad8f97bd61c04352eb0928889e1c00f1cceb94a52fe9582f37065685e76a7bcc35a8f1fd43d157522b1f852b28a67ce6d4148dc44363d1f61bc5a6a6d53fda1f8174f724806071ab1246b470af6a0fc5ea76e48ad5e061a58fda3b4a002bb1808bfe5d14030989f0602e5b1e15883c02ea58e2704fc4dd0c8ee954eba7d0f071d85cccab6c596c4bca67485a058ac7c47a59f298343d0603af033fbed3ccd6ec0390925fc3303366f70319e6540240fd5b4c465255c837d53684fa4028ff1e57ce7f90ac50f167f14bbc3c23997ebc3f7391d3641553bcbed89e74d79d9e899f2a8c81604f657b4a21cb48a2f051f411149dd0e5d,f472e8c7d254c424aead0e4437c8a347f27f03a59e17d6d1113c068b622339de,c3a41866b9d6f8dd1d1e912b8b6e6948e2f19a0f5e5a18b3226defb79f4cf3d2381bdcc4cca633644002ac91414f710756846ff0588cd4ea91076bcb2fa302f401,35b580681ffc7e391e8296466a5ff882714d8f8f633245c02bd7cb111492a4c1361048d77ef0af6e36bcd6cffc21d0a3a9eb83f8c9c99b0f08cdcf3bc05ef1e300,eb27730b1b537281d86bd2f7075556f6ad23f3b883d9ea49c23b719614b8784c4bfe54d452d2daa07e1374153495df12a3c54d3ec1a4705b6c743f7cdc59652801,feffb0fdc7826a1f74b060ab9ee2a095a8c6d67c60ea3b85afdc69c95076ab616a1ffbfc01e38a26ba22bc30e178e9d387845dbbf946e14c1b59a2cbc6401ca300,81aaa4957add1e32fcb464a6fae2937b1568871eaa075150c8afc95fcbdde9553da927a994006b6ecf5ac3b588dc0fe0874b35450631da20aeecaa2f445f75be01 +98eb9162f59f517bf7e9e355ae6af6e006308dc22292e4e0c04164993902f9b506c89637996b8ee29022771602b70b5aee86cf834e08414e2de0496da4126659a85f4bffe7f9fca41f3fbb6b05195389828e53604adf0e8a2e14ee925947d50b4ad766944a2d4add535d71ebff266fb3c34b9c8482a612b267c2eb5bf8d7fa4b2ba89f5981fdb02850c4376d859afeaa9bf7e6e28bf2741ebc991c1c87652168a5ee06109232d66328f0aa563fac7961089b50ff1421b1aacda835a2416194a757b01f75e02313bc764484c297721504aa8d258623ca19cd72ad3c6542fdc310a3843626a12c101d3537c0189f9b0bbe0f5beb95f648fe501c6ef466422395ea87ceada8cb67a7bcdf28956393b5ef9cd86f2f353b9fe443ab03334e8313,8eb486a554f231cdc484001d4187f9ccd7398330c2e1e269fd8c2b37650215cc,d8c58933b1842515fef7f0b2b530742003256275818ba6ccdb7d6c58178a1370258055222d6c290a93b44322b775eb554983b7ccefc0e5f00857aee81abf98ce01,791989ce97f6cad99029f807b0d0ea9b42456f48d96b919036681bc203219cd404fe725d194d0ffcf13099d8e7baf597bd3575d49d615351c7f65888321d50e301,452cd95d542cd445f53b63370234b04700d74d910a8cfcc1b03ad729961a5a8d6c76578a9904edb38923b90b85d5e2da8348229e794da333c529d353fff6d57901,b57b28b646cfc9e3c5199bb355b129cd9fc75fb7c09e3d5859d2f43989a4c791739b20942d8739c89f0d3fb766ceb2835391bc76103bd93db5a4aeb67f13a5fb00,fdbf3de89013baaeed120ba08f7bc5198499b57b42d09ed53a6f04044c3eadde216790a5fac6fbbe5f61379343cb06be28f2aaba97482064924c806afa01949801 +7e7945c9e3c4abb0752c6dcbc1d95dc0ad920a08578ad05701579054f61618768ce4cfa146b3072a640b27e7d568cf27d001513f9bbb22006ee53353a35266df19c5f377c03935c29fb42a826af977aa84eefd5d7f1e96cf1ec6228d2e2fa01c4af1186e51df72f0be065035a5ce3c003083b83d1bebc8fcfbc8fe110d228d69130b94417a45688409bd2b3d5e75dcc4acfba06edadcfc2d41beae0940686206166799838c6a74cd67f590bf024dfbbfcbca69866a9dd1a15f66e1c59c204ea51e2c71591e61d012044f0e0c3616fe1186de287ebb805440d0282b38c29221001cd450b8cebf848a69a4ca4984edc3368a304b138c274371ed6840fcc5111beb59fe52402b87bc8b775e231651f8517f19177ef386bbdc99f78f356c595a,26609af16dec8f0a01ed0d38abeeb0884ef08fea0dce7864cc07484faec4bbed,4104f0e4616ba5a98e2395e6f8f071565ff7233ade318c914be3b36d711002e64797271ec0b11b8c7065618494dc0950246c9c8cca93dab691214a793be7814a01,cb7d8b392524c4a5e08514f07b3d1a59c2eba573ce8dc1d6eb53f0a84fe642b47800592386fbc0647a8d264bc10ffcbc7676c6897aea2d39363f1493142cd52300,bc45134a32eb7f590c2c71497187249a3b93b21fc39c5267a3c125fdd5084a612c962e78d2e8e6baa9db2119201b7b062bca19fd8f0df75aeeec6d184f6dfc8501,9dec300d070398896c867fd80902fffc7dd681b24ec1db5c463306220b072f0712addf67a86e840742fcd36936f63eb7bfe0aeaf35042ea0e05bb19be9ead33701,2b1bad9dd6d9a285e3fb099d74eaec7abdc4a5718e3b79ecced9416899901b7a40ce7532385c7f0fbee71083dd9429ac3dd2455641bd489527e84c1c329deb6601 +b801a26a4d4ad51fefcd86051a6df9d2ed1fe3481fc80dbcd9a13f158c671d989b476703d33533487761edaae108134312d6f8a87b436911d9217586888db3a6eca4c641fa797a4a7a89fe2d666bdc5f7f5a287280c1a3c141930a274c8c035dd69c4e7e329f2ebd08ba59707dcbc6f70d347d52213b7f9647379f5dcff307cd988e19ec0c0c390956152f6389b0e1921b6e70a3138b9246deba4cb49cb30a0a9ee430255b43c6fe9dc05b09673853d7c1046ef0e03f354259637d4989efe1ad9f1ed053abbedb84d1da8154c6cf8fcb16a3e38f270c1f6ecce0ebf281672518afba986c863166ce6f437a6bcffc688bb05fdc80bd1cef3e8ca99f04bf790657212193cd48a7e16738a7d860969aa61c2213072ec207b55b59a528c8ebdc,5333dc7063239d645881b86a1454f4b0b2de1529a8b4569b640336957a6f3732,18c52136af2ed9c5029410264fb1373b73d185577a00df6767666f38fef46e4b3e4ccbf987a24e74aaae83b5e6e6cd6290aeb76f2adf9220900359806fd520ff00,90d50798ef59677edbeb92efb6e499ddce78bd81a674ab4d1eb8166ace180e5e7a4961eb29dc2c80382d285c2f5dd1b856ca00565b8772397f5b4d8620d31baf01,6201c43901c78335b6c1c643dabd24e06abc5abd1e0a2349dbb3015f31609f882caa31741a73aee4432180aae122028ebffbcaa1aa6c35831d71e373ce34c25a01,261b96ac724e712e3e4dc480f95bce7549ac8250003d4fd95223f9f8f4530a405836d3b9d1b1b3760a2a3d068fbab79e193d5c88060b3cc44e791c143deb007b00,4ca31e811c518cc56d5d0751bdd34dc2efc223584ba3bc7db4324baa8abd7fbc0606456456e40da6a2f2a2b9e7e199905a61bbfb986d3a6ee0d280850bdd566000 +661d98edd38fb7c017103da2f27b671f0729bdb8dd4ec4996998c54a574136b99745e467d4fb9dc3fc9aaed7b27671a1b51649a7f02d52b694b14978e5e55b56c38cfb14981f4e9dd75e8dd7f5bf71b400bd197267a7b72743afc10b3bf4eb2e07be55358e66dc49cc923e2c8efe4f06d20b86a1cd1dafc0bc77a8f2477db1c3115f2d7fe953bc698be865cfe44fd214fc7276aa44c36020de957c18b231918358a19b871f23bb20bc22bc3bd329c526fce4ab503295d170396885971f0f3f7be425d0208c173f562bf87db64b024992735e2a88cf46ed743f277b0e161526cb4f67ecc2c18794db3c39bf3fed114348797a752770b9c4983d33c259c949464bdba06e9580800a55b5398f25047f04453c705834d7b1e2d764243c5f8867,bfa53e1798125ea134b6bfbb9206681ce566a4b3a9eb595e6f92e2907407eafe,6882f07313ede79888791bb39580da8aedc0dcf23586d952c5a41bf8b27d9ebf203d759263d97f87c24834185f2629d5c288173b1fc52a8628d44570552ae2d001,e7421c6cc695af4d56c68f9bb1f0d15573fc2939239ff3874a3dd62d2c15c6ea616cb0dc0a1b3f20283ecb245a0c801276a28dae389a482ccce10e78d42623e400,90f4f1de871aff5d48e3b76bee895526c1db987b5d13d278ae43d3bd16ea662936d218b715f2ec898c13cc883aea2637f1ca3bbeccb7862800d142a7f808ea0500,9e23ac321becd475f549139035275376bd06f68cf3e3ea827f1c4fc05cd988c14d34b2a5743262a57d9def6baf0f74e67e3996fdbf851bd01b035f25c0a050a100,3d2794251ec60b8680716539fae390bfda03c6e6783e0d90a7b7de77dc65d2e623ca7debc69dea27ec07c1e2569dea19778b50bbb9f58c6232d528ed87480d0f00 +8e84741a7220b9770ebc4f640f4edaed5c51c29f0e833555515309cf0c1bace873001e96a29c0bbe485e222443ae00bd8dd946a17ba829000ae8892aca29b05bedf87e973818f0d68a9355ac9d78f15f0b3a2d7ad1b840f5c94c6338571ef5e2d91dcc598f9e173c73dc69b1053c413e9b78e908e54d63781c91cbf501db2bdf01d0def5c336466134a43416212f5299b305d8086d885302380ec26141806a6e7033fecd5a42d6499b0b6051654c853d1dae06ae815154eae4c1df3aaeb8f993978b32ac9f2c79c43ed8605a993ffb103418bb0b1faeafeb7bc788e51ac2a38f9de7f91016202e9804cbeaf3f26ac5c2c732a07c0af49b3dbac1653ebbd9a7775161c01805277328f63b4acaca54cdcd827f704b31b256e57d0d21dc27cf,ebb445013dfd434b26dfe004695d4abca92bc0d36662a024a013ea04db92c204,02e2d3e97454f4c8c312e1259ee8dcbb9a796a3ddd542eb93a5deee2bd81c91e3e4c5477ae8bee95a8f0854637f677c2bf4cd93b50f7a01852e6d2552196bd7801,afbf214bead4f79cd658810f7b8b87fe95cab57b22103d1cbf8b401f133c1b6e6daa5248e6d2fc437c0cb49258c2c2bcdb8bedb833833e811f0119e6c8dd34fe01,d1be2533600c2271755bdf92eacf69b412bc9b522dbc69fb73a20e48d6b899971db20cd27780f443897338f1ede9a1dd1aec789edb2e99fcd997fb74a00cb51001,33f6876a25013cee1274c077e9a7fa21a89000b9512f9be78dfc5d825234d119503ea3cf1da99ae887ca208cbfbe26814ba8908d66f5e99c64a8b2fb41af87c301,e9f25e5e52bad4537faa0779e5378ba44046e137cec05b0408b8add1dfdbf10b5ce0f4bb5f6681f1aa986cfdf29ee16fd43da83546ab916fafcf2181b66f279201 +63d05cbd97b1765abac5cac432875eccb07c624298932df7183678be8b022c91d5c2a5600c38e88afeba8611cb898af1cffc6fa92194238147d13224fec4e3d5758a7a2f980901e0fff74e6b08639868940acafb07d3196183aad003979785adfdacda28f23daa5e437d2376b5a951279d7ae52e3d2b1a7f5d3e3f100f6b41d43669a798a59df2af0b7e2ef010eedfbc45b209081b39a015e2ee20fd0a8be083930a591388e6fe294782ef24eac9f1b8cfed783490da75659b51a444871e6cf1594bf28f75ad7b6136a4deeb8a5ad02a385af79e96d43dbba61146e5442ff9b34cba03c88108b0d98b69d93de2a53df15f351f9d8c1627c582a91d12c9d58a6f7f9b697c082288ca707a805dfd1b83edc544c177cf6840ed4c718e9ff2e1c0,be2034fe9079a67fea3d6d742805349083486fedc8691ce6d3e4ebdde903053d,f2ffaf12d945c2e88c7a6a034bec299eac630b96928cde5bf79cf1e68fb47a2d427a41a018cba8a32ed7b7d5863f164c6db2d227d0b07ca98b97c38537356c0b01,712b55d86e879c0c5289b8945e6f2ba26659a16c32efb5bea9e986f038c1b2764ec9bef16391ab63724afc615c7750aae48eaf0108813bcbc5b50d5e7b6b072601,0d7c1571c85b5e7c71ec09fd87c8a5f1c0e4672d2f2b15e666a414508f68a8d444617c157993a21c1d852580ec7689fd4f16026f6fb181e12674b6636beb24ff01,7d4354421fa7154c2c45995ebe58bbb51e41faaa17b8da4edcad616221b54eba3a923a4ce446bb87e13c8fd17e804089f7cd531c970cfe79628a1e6f5844e5d001,d08825b015568683723467a2fd3b31172791e72b702693d780aeef14cfb6314058df226bc27cc783da662abc0489a6c33931b3665532e624d49b8ae94c86b6e100 +29678fcab5378ee539526385f7b7595017c336b35e26c38c7b0e0d2970544a6144f8be21af8ac258e4c14e2b7c51ff5bbe02a821f5f8353e215eeaee8613d854eb32f3eda31a9759d9c3196bb304903b06447a9b624256d559882a93b2c96c685f87c51ac95987b5f777474a592f4db5928b729e9e50a051707290a842b5d4ea8d1e127949a9467ef772067271c057db1064a8955256c18c4590f5ca74fe2b0a6097348cde6a6e608be1dae44287ffa076c18b21810b613855f59e6a56917a86111b55541779c209bc4f4bcc91c5f9199a0c651b74ce532b596fd641e961859cefffc1cdcf751db5ad6ebe3efbf21ed5b6b52668d5dea91ede6e70a4bf6a35f0750c619012bdbd920e30ad52dcc9b972eb9ead1b58410d2d30bf2c1d1b7e97,6a415c62db26680ac98b07d71d2f3a79580ba5230106f12c326b53d2a2d01da1,e5d5c5da9bb05aad5caa03d61962bc7536218541ce41481599fe885815ab64550af4f2512c1b083ef082cffeaf8170c1a0e75ce91efe0b43431657a5fc01d59c01,84a6ef958f00190a1b3a3d11e20c326f234999ace2cc08a3fb61cb1ad134d7315d2ef2c153545fbb102734d2179111152dd74a958fe19987c941ccdd29c328ba01,29e767f75031236461c63e7a3fc456e9cd5133a125ff1e2f7ee089a67a1a5619300a9d371fac9b619802cd6ab9d07f9361747116deec9632de2ecb117680e0fe00,a28eb197f5205712761ce36997c15d11d29dc3bccfa9f3b37e35392b1d9218986c99996089fbbb9fc57a4eda5f4b5aad26815156201b664412de789ae493f92e01,3d49b1d60e123d52d96304333d8ccb674d93af2c50c5e716644a58cb676122e170d2e170f1cd771187aa692f77f63752451d28f9382d0b2bb7a8e413597c064400 +f145f0bc731e00daeef8992f816d28951fc8348e77d27be558cca0a7b2f9fab2305242c07d36abaa3e0a1ec19479cfed9d52a1e8e2d7857eed23eaa343196f2015a1850935e465108c4b58d27b97514f2a0839a35cc976ebaa47fff63fa938d2402eeedc61eac0a3f9273b21af508a9c8b8ef522b492d8430950a2074992667c6ff09dac98a4c64a578be0d2164fc1cc16c94abc122442dbb72605e60de8bf78a41603d206afe55db82d26ee1519b480db1fbca94b8b29576ec79503829e4e074a7b6b160c883c896af70fee2b3f661a5cedd584363f116a3691c4f7668a662ed36a08a96b05bc120b3fe6530626f5cc2406e4fb54a7abbdcc5c687942486a657e2a3f6b84f661fa62e750bceb09b5032d5283a79257602165e73a38635ded,5f1608ee849f918785139abbf2b4bcdeb90a0434c84b520cc1ba18a00c21e591,b9f2fc0ad2be510fe9845fde72f1c024c7a350be5170261f0862d99bb81ab3b64de7479290e83836506cd401585dcf41e90f67f61ca7e112442a26b475be071001,4ab0b0bf40891990350d1af183f869b368676a1b68a2c57b3f35736639e8b9356a63a81b1ecd7bb1d4de13f9aa4544c0a261421b92687159051e46883e1dcf4d01,c0bbef654c7a638363351a66de13e8aeb2f0e009445fe8b89c1c52f52eeed97f247336012311bafc5b45983bec36661685eb105d14b5a192233681e3ad9cd39f00,efa9b1b0f7c106782a1a4ccd6ccafa0a54a15eece6396fc0a7efbe679f1a7f9979c1e0327f2ad0c4ea88a0b46edf52186fb1aacff274fb5647985b9d7d4874fd01,68ebd9458ac1f06f995021084a9eb467ba526b342b1435a01d3f91091b792cec5dc465e80cbc50ddb55338ea1f2e05efba6d6db250ffe46e80407048bfcf369a00 +39ac884fa41748f6bc4cecab2bbcfb18afdb48a07cdc8755bca8d7befd4d2ad4a33e5964bd0874a513ee7e526b6a721eaf0c473f005a6c21f97b894083e45c5d5531ad1aa1d460249825ac79fc4eddea00adecc20fa986b6d5c889b4186948f8a16a044b74aff7ccfad7f17d732d22a1620d17718c515db5611e1bf757d0f2b980bb58f36b8ed47596e0398a97198d3ae639ddbb0ccb8e0aea53508f49052acb4de65b52150c372f1285d90be81ffe4d0e4b29aa19844b2b28bff6f0377ac8e1b2c4373b8f0aebdf9bce0c4f45eb635964a4075a753d41066602477b92312c27aeb6875ca220db7218c6eadd72886e9f7ea8d7713dd1e8724f9010545c8783cf8bc2fd97f048e2919d7f92b8a89570a9f6efc9811c9f60012b07c5134293c8,cf08e159e76219148d4bacc96013e0858f53d0df7252094852b13a65b002c364,d4184da4a20f69d6d2690b91ba9dcedf7e19865bc04e65f09cec09d3d245f61278a5b24616457aab651d619769b1cbbc2ebb4c477c7337741330791f75ad26e301,39256888958ef8d4bf30fb27d1978b1ec7662d27413da918cf20f9c4173ca1a71244223f7b4c0841c9dba2c1b4cfc1d8196cf40f7a3bf6f77363ee81c0eb41e801,72052fa19c8e5cf7ed47e730489f15688f046366d123ac1a739172b11eaa58241eaef4df89d5b90d23c7a9fbf0f4feafb9d63c887a72b265c673553e9eaa861600,ac8a3a6adecbd0999f4bfde05b591264dd6813d9518c5a1ef7d5a486399a4f526584e8c39ef0c06d926a03b383960fa33374cdcd68394492839b50ca4fe219ec00,8ea0628d7f8e4735eef6b708d220c4637d46cee943bf9512fe0b6924206a1a5a6b7a2b9ca1b45dd64d6abea004e2d4d2de3c9211b5676dd7aded2654788c9b0800 +ce51aa5d88882ba0d4b2ed5c5c3c3ee380715f7b6e7eb5e8f2c870b72aa351167b7e0c32ff978dc07b91d011f1424370d97923920d0e7d1b5823cbdc90e0671ea2be57fc53e04320d2bf6ca7dd5ba527126e30fd31a118c36d86194e646ea2d38a5d633b3e7bd2fe93d3fa9f614d6a9d446cadb58abe6fb86dbb2f4c83ec49aa5e0d63065eaa4246cb5093bb77155b4af0f74579f78edcb4ab386dc6e9010573c684ead1a20d814de2adc24d66e128a9b5a2938f689c2a9de24ea3b53a093df9bebba12373da314ed97f2efb28e49ac46ecfa532bdcc394749d1245d7c0c7d5fb88c928dd48ac4ec0eab95246af390ef15c06c84462b4bb73b9b38301cb334f2c4f2a6cac240b308c5d477cf3c284519f703d73ce2e312b4b8883dc7e6d1fa,afb71f824cc4659a93382182a75821588173c94e7c61933cd4ec9bbe99e49586,e6c5f5645f5f8ecfb4fd56c6bd215fc984e372cf3913dfa66d4b633f37ba9422193e7012f6e7bef1cf5714436dbca22ad2355db673845e42217079899072a1ad01,34ae1e36ac2c934e71e538493994e993c4a9d30a204441d4819d5bb62587ab4208a7df1a00ec66ef527e850cbd9efeea6cd6bbd804d305a289354ea1fa58bab401,358cdb0315fb8a84d410a7f97d4a111c9520adb495cee9f34df7482bf4ade8133a1cdaf36a9ec862b77d976e630d38df74a0b8a2999f375726ef26bfb20f1d1b00,5a3165be1f40eae448d3e7af6cf8d659e4188e10dcf7b6f6f6f7aae5a63bf9db59812451a9752d2674681339879dfd60fa72118d812bd7581319c470654eb22600,0e1990a321fc4c0e05d67b0e67e3b186fb893f9e73b50b043da7c114f0da332f2619d03717888404e7c6c78be08708a828676434d0a1f5e38cfb4ab73d90019501 +0d80860f1b60e3dea2bd08641edb1bbf3085154a7ec4c15fe3aba753b3108cf1a82198bfaa81cf248e38309d6bdc08307b42376485d08935983f1c8323f8aaa5c6c606a5de420c5283ead144ee04c0b8e79198e1db95fd6efb57d4a91b9652ee4ae52de026e86ac23475260891898df9a9c366b739573eff858f1e3fd31c686c91aa516eaa58f0e65a031801d5c1edd49d066ae88fac8c559f28f0289256e9e939f81edd33a853315675903c44d85ddf16c217783983a0d5d7f2b234827cceb09b70f2f3e37380cc08142d1f447cac92600e5013b1fb9c97e16288858405b5d02f1b583f76152dca08675cc91418cbc9f5b4b52542c82876e1174b65dd98e23af39a730143d8dcb5225c97d3f756165f90691d9d89a1e6c570bd360f32fcd5,c2e045fa4a93dac75167e300c8f8278a69b8e0eb8109a3865aca28d9c4bcdf22,db28b5555e942883551c08a129527565897bdef0209cfb87380efafa4cb932326482a58da15116e0be5684a7d171f57938e9d1fc6c30ea642b4a36ea47a9be3a00,9920af270ddb895af38e92bd14d74412189d07667b980d6a26bdb5ee1a633c30765d9ebd9ee0caad609e36740de2a93b4ce9a4de1f2177b2dd99fdb19b796a7c00,bc6079af4e8ce23ae5bcb0796105ee4424b4b83e9a1f42d1bfeb52206252e2481af18dbcf25967ea682c2f77c871528d76db7c5c92b1be2fd9d7990b29523a0a00,c68bf8962766ccf04f7c185a2f9073882055fc986a7a07522f9ac2be168de1b3403bf74420aa4098b8967cf7b46392db0adb3add92d5c21b20aa0a091635480a01,fcb8d40ce3ccd19a790a1493de700802a607fdefc76ff944e6f98c9f8e4706ec5357c40cd36196dbecd7d66c429f67b41a1591c7e4d84b7a553e68c3651f849901 +862308356d22ab7e40fd797df40e0719e5d3fa8cf0353019b649a875fb5b9ed8c1030548d25feadaf4d92688f031066a2597607183c3b654c0507520829e2dcfa93d54a66ab7b4bc4b43981146a260a703b80fc32740c41acedd24286fc74be175e1df34189f1810873234b313e58402dce49e616440cea65781a461348219933e86f8f98cfead4ae6099928f3d22541077d7cbf44d096edfcac694f9dc9b0145eb173c0329150c6fb7718232e1ad2bd789acde2dc18ace7337672389d8edd35ee8e35eafc8084461639d5e18d31c5edc96c7318d16ca3a1e387ebfb3b47105ee5ac1e6ae51fc21665877e106898faecad16e6355434d02620e58234ff18108fce0d39abbd31de027c0bcee5d1635b425213de4b93d2dcb7ced851b71adba8,7c681a88d0a934873e7f66f416a92d63bed6aea2a2d54a106dbd571167083f0a,62797bc9f319f57901522f7f8d4796bd6ce06d39d33556b13b2a37e9e9575aac1b208a17ecdff80036f4d7d258cb9c3856af5e1bdd3e3daf6e9a1bed092d54b601,45d956aeef50c36f0796221637f61e0b793a81bb8874afe06c44c7b77cc3eafe32d8fb4ec2ebf965e6d173e5f7f98b1af4612de67de611de35f2972374dccaa300,151c1a958dd2201641ef06409e9d2dd5cae35e9504e011a66e667bedce0f5afb2e2469eddba0cb9e3b1d6a05386a733bfc1441fa5bb881ea93b5c779da0caec701,4cb85746390e1152e91650a86842207025c4cef74b0b89b3094f9d997a88377c29b7f5424c128c480de78404d0c12660e4683b976815839b1cfbbbe2bbadbdd500,fe99e7fc6165c320e0a92e0cad676d9c1c95bf181b0ecb04b94bd4ba7a3a54ff0ba32c45167a346979db47f7df7ad498436e2104faaa079ac27c48997f3cd9ea01 +f1a719c85826436c3cbd2cc539cac942728284d2cdc3714f3eac58d01424e3a036c4b2219300519b95d8b950a37fea8bccab9dc9b627b1e0bb4f2247022eb285bb81c6b477c0eaab18151bac98d89e29427aeaa26ec8b2d596fca98d91298ca40ff074f6dd56ee470f8773e92effe9c0084d99dbb4acfa88471043218662be790251dce5f9f28321a74ca6c76dc956e6ad485ad5499d5a99244c87a1784c4dad865bc458ec83d01372bf018abe4fed3d11af29e8a2ab8f07e3c3ee1e1c35b316f43a8e58dd7ae5328f42e34275f1a9d69637d03688d2d8e0eb96bb36021b2c5404b4ffddc3140ec228eef8e9a3153cb10cc59086b61880e160b8905e078912635b1e281482afe06b044ca05c0bb15bb2d117788d862f26a0a042ccc2838075,af033484d14d0843188b899b55f5aa6c29afddb203aedcdafbf5fcb1c5db92e3,0a82805615de56aa18ef21b60778cc9effc8a3dfa63659c38884c30b0cae6c343630e67bb2b84b5a0cc3a5c238106fdc65e5a46897bbedc04e2abbf137db0dd900,05bab6a8cb1d33adf4b7df73dcdb75157f036d96ba58186080f985ccaaf8fad25188b6cab4ae98e5c97e56cbe02b36c76cd7110d35c0bedc88e46995dd0bd96500,e527cd3e7d8286d5d9f80a1147a325b191e7bae40fa2a32e5cff242eda87ed441f6fec693ee1abe9453b33e393de10b260d17784b99274235e1f30543936974900,ceeb49c7c4331aa6f0c859663a9b15af54a3a2185a0e2b7626e9179f63aef30e5cfcb17a5d310176077b23693c50477004c2b082a2d93221ce4a2e838862f3ad01,1341fb88b1476ad79eba9556e154c71201b2230cd434f4028f53811c21b22ace7acd4d5939c3ac42b36624ba1dfeac04be4215fd5504815f6eb2256594c8771b00 +f8a45b385e30c1ba484fdf5a5fdf23ddf81111ecbc5738b845ad543710c4024ea5badddbe1c32b2ad7263fdc60a4bf8787f7922c7ab7c3eb9623367791e8b9593a73d7c69dd7da4c4c6c9ff0950efa7ae50a1910530d24c77e426b233407ae3d51a3ad5acf779d7241db34ff652d91173d5ae4688469fc76e459d395643b09d1bac3baa1674810d3c2ac29a6bc1af3155c249e5a9dfa2c3bb62e35a3eb9d1899b07a3e0c9a9243680fd60fd79fd38a4ca08a1f726ec8c113403ae381c7841d858f6103bd373691b3705775f616d94b16d631e17facbdf16a923f67a3ccfbdb85b7fcbfaebb871a2291c74a0361f8377bf589367f974e8d95e1ca08a5e4e54ebac615f85843405d17e78cd06c7bc04d99b1dbbbb54a7f7f9fcff6a8e8489698,94ff2bf8c25fad61580826ee02ea97a645ee51b105f472d3c3e617f05df36843,0cab6998c771d7889cca0b841f0afb4570a2c82102204cd5bfede84899f76899769440d0762dd3c1a5eb590a097ac1c47cdce57b01385fec8c7041fff1b687c001,9ba89b8dbaafa7517937743d24fd8fb7faeef99f841904c632fe11052c9dd5f158f4d3b405693f21ed40b37c33b83ed346a4d29012331da856b1fbe7184cdab400,852f48fb4bac7cb51c9424c8ea47763e31e55309ea80c4a8374d66b96344c42709ecab02e8ced1fbaf04002a3d6ba8248b2f9f0faffd0d6a8c412af40a68b7df01,c7619ffa777d36fdca9267cb698b6ead74c8e475f18f84ba8f2edd4ce44527cb6a5922d9b1e6cbaf64f7ba9cc648cadf2afca08026fb70fb89c9e1f7ccbbe5e600,91cab18efbe864df92f9fb3c89edf73142f62dd42e8b2e8e0257d3daf223b1b95d4887946a49d707c449ad12312598b640ad7c5aee31984937217845875c68d401 +e469297b2fe5ddde203a0a434e9bb899215d41ce93af1f5d073bfcbb85c1d1020350da77b29816dee63665788a629c4cc6cf94b8e6af266eec57ce0e1c48c009cab47fb088b63340cb34904a78e6130adaa530b1a938d8277efa9bb82e93ddada91fe0fec2d608ec53264446bef8347887281acf0dbb1107ed24a100c07725ac4f3384dba7fc738b7f049cd6fe1e166faea27b47c430a8687b62f1791a8fc2caf1524854aace5ca254ec0953d4fac4e22c50372fb5950ce8c08dc44b22fe57c3e32c70106b93220dbf50db76907f46c0ecedad94aaae4a1f2f60c5d46dc7666ef7476a0faa085d16613dfb43f6d9ced1ee5500ac6f6e7fc312164bf1bb8e47127cf5f7f203f38a7228f09284273b588744bf9629e590e6d3f20ad1d040356c,b24472014b699e3301df87424ab572c0afc652bcfc52555e14fc93faed74fbec,8c394a8465fc6c0f3def6e99aca57295a61baf49453f79c1cc3276435e6638b746aa694643985e1548b29ab337b567f294cf076c6a575c159ff64412ab734ee800,13c74368e71cb2abbd4c9df3c9956e70bb605ed6833fbc6539746044bd8570c4604533f665b30700e5c9063fcfc2d55b44c60da3350f434f814c12c6d47878b500,1811018851fad68527264b9355520d0bd6bcc99d59db17596c94dcb5f8d144817366e3a12d11dddeb4fcf224320194bca28ce5857b630991f68ce6b5bec92ab801,7a3c90b30619de5eef747b1da4e5cf39d53d96fa13e6ff2e3d0ea2234b9c68ad71fc51215d3e9f09b14793996571dd9f91cc1e50c7de5006c1380a925931dd8200,6cbcfc1c6e7289437b274fa977fd7dd8083769a101f1cba1196e6263107a783072e2f2d3e4710cfc32dc86772c9604e06c0de1d05cd45d3dc8e5b1d024f7339a00 +6152d83cb7349ff778605dd051e7990b1eb8fd4f8b9ed29da895e1fd02acb094e60c7c01281bcc927618027884729eda3789e95d96a87ca57f3b5b5214a92aaa69ff8267064ff50d462194b7bddd70de8a264233c9df97dec9461de4adbb608a2acb0cc1ad0431c2a02fb5857c839030d1b78fa01fa68e3a9b2ef8fa6ad71ba7f4db8ced1ec7776b59e8eb06c5bfbd08c3e904af160bedb07f4f875ff1ee5faa0f3ea377ba48440447e720e0af0a5b72a1f5e0cdebf8d3b696b32a15a31fc5eb229932445deb9feb38a6c6760cbadcc26ad39fda90807a6bed92736a2ee2aeebed2df4a2d09a6b3cb7ee96e15082f86b936997a3c911e0e87552dd5a78d52950031a0b28548f9b73a420792b0a3d9bc44d7d9386e6339763eb1d50059e799ca6,cd484c83fa1f04c9a6ad29f2d7413ad3ae1b6036530ea58297d10c0fc0a93687,65b2ed602f74821debb69a4c02f59f6d07c61dfadce2e190de94b3b6d6a666b54955722face716c88505103ec090a286a424d97b98526a007398f31c35ead43700,5de4f7ddef6cabb38a0f0089d112ca679e6548fce312361ab3fb38ce21c3111b7ae208be1a9cba641f5d6d87a9f1748dd0b14c39256ab10db598c820638086ad01,571ff0f969c38ad7e18912bc30b361d249106a9ddc64809db9d14dc4d2a220e718c43b0f2be16a52ce0e9313f21118a7b69cc6f9088ebb29bbe99b52391678b200,84bdf1666fb58da60390916651e38348634ed31dbe6fb5806c1aad12857d84a206cf4511cbfd4763d22ada7bc0ed63d3f145bb328d4956dfb77341c6740d5c1200,f5ee3cfd1b70f3b31110b9ae796ea9c802b6a184b5b1ff56b8196cfa3d144ca70002408286818f462823c4b4369ce19df89a18cd04506f0543b96821ed3cc02300 +3a71698ccbb7d4cda8fd8d2d5651441f8799d2e7feb7ebf33ec229f1d6aca93f6c2f773dd94cb4a3e2f12bd2b0746a8e14e68d760a75dca9e6809a628846a9b8577758f1277ecd84c7a2634de42c4eca37d5adcf3ea20cf61cb5e96c8d8a47514c8bb91a53b5f82e0160041d832991f4b6b042be970bf3cfa90afabcc454c5531a813593c9e3d1ba0b0c1ce480d6b242177e2d3647cdbe5b044f66b4e125668c9e966a408b20f7809c7d6a1ba4c34da68618838ffcdc78669b0a67c908a38fb55d1fcedb835f7e3026815040dddc05aad62cf26d136ca612f5aa691273fff9985bb261be4783683facf2b367ca11fbf43b30dc4fbae8ab8910af3e20743bc0a2759819e2dd554dcfe808ebce1a5cd1f3732c47562a8a13ce0d4218e5f7251944,21b0befda04a17caa1c91eeeed481f6b03363fb9d53c26b6d07e5b9d746372e0,018cd07916da9e2892cd85e8924d310aaa7573d1d93e85f5f5bd293d10395e3a744d7e8896bd00ff842db8eecc731b4766381c87716ea424a660d834e880287900,ef5f4a65966385d965cb7d54873236032e6c0ec7a35ab368afbf0a99da41fd31400ff8e441783f786621a4bbaf2edb552f71340e2c1a7710438cafb29d2dcc2e01,25658ab809a18d617a974a56fb6f81c24b9e4fa6dffa7d5c9524a2c02d010bfd54e85bb7cf9cde9bc31a39e69847b6f18b526627e2575ff84391779518bc368001,1802b9f3219e37b8d24bdcf9e314a99cbc02f69db1c3d28e98f29d3ea4351e1829d510bb727e16485921d25549a2430d8a07ff0370bf43fda3df62044817db7a00,cfaac8c2b4d504213c3f4a36b79c38aaca4a3b83a0e79cec49e3a662fbf838232e28a3d7070905a263fe9194799a6fa37c4ba31e8ba978e47161c58ad654a6b300 +fc01adaf0ebf0dbe09e2bcb54370d2c18b93a379d36d7a255eca1f0f080bf0781f178270e4f2796f1152a10212c7529bcd5401323281ad6b3b7216e91b2a75a81699b36fd5a1f3f29ca44a8f53267be5e1bfb1cf0f4b94ede4b2b22416184bed0e26718cb179df450d77963e5558c53420ebb93e81d33c389ab3740b8b08cbaef7908c60a1db7e7e7885be56d1aca68f640915394e17142667ddbd934336b28c0e19cc646e81439e4e5367b5817788b49476ec417f674e2abc2cc8ed2c28b3275f0706f86b37519a2179875bf0f93d0d3daa0c56163218d34b4ea4aad45b61b730cd0b54093b7b0b146b3788ef44c4809ef2e3081077b79a6778f6bc01c5b5d29405581cc4d5e157b0f06cb979d4199237757900157c14118c51016edf5a2fcf,7daef8cff743d96568674cc952906abf0fc4f6b5de79137e8c147f4cc22e80f7,1815dba125cb3315841e3d1c143dd97ed6662265c668997e6cc1a6008f04e40e1add7c7a0c17d37e4cbd98a9058cb723f48d6eaf391253efbe0771e383d4445400,f81e971c04fd7fe7922b54ca05ca0cc3426e761e34aebdea98e30aa070cce95051dbf824f9d79290623e9a2716a6fbc20172409cf986f577392ec44ab5042cb501,125c7df9156f39ec1452a841685654f44dba21426ca262a5882f2717c276d4403a96e27c62feb17dca1ae06dc4186aeec8be3faf78de4707958aea266b03c14c01,cee09f7e0a5e9ba7cc4f0c543396c660c5f7ab508e40746b03c024fcd62db9dd3164766bd35413e77be6995d1ebb8e81e5544a3546253efef2772ec4b6d5f41b00,749e7b5ab7a9cd346ca529ab4bf4d85e10b54822bea61905a44f8b2b155f47262bd3eb44cadefbf84d117147577c02abd923cda2527a9bd8093c9b1e577855c901 +7086f898d48ef4d86a935f1b08cad12a0d07b13749039aa02a9e0c4dab3ec55d9312ba368d84081f091168ecc753d934d0097500c37330485cdd57d1c87a487d853379a3107a0947a27556da318fe0ec866e10b5295a8a570668e6b5cd40d7dc0928689fa582767b322a49780e9d0c16ce5ff70e9667b21381e829b8c1d13d92ba976c84abdf562d54c0cfb8a340d43a90647c38ac8dd8437e6ef4e4b9695f9cb148313df5c008edef9331596545b784100f1fa187328a5fceae78cdceadbc3c84955b36f413fa83a6ee7a0d2ce278e763f8423d9f552144b2b5659645407be66554b946b334ce624f4bf376739725c929bb57d9fd059748cc924087eff51cd401e13fdc317de2d59c6fc126f6d3c21ed7d28a636378eb80a840df6b87c492be,db79787501e8bd78f80d4cc3eced447820a0d07d917c00efccbc4479943ea31a,603cc3a761cbd57bc6961287744a45e9e9c2439b7a7fd3b80a4845e28b30a1d6530245c886f2314fd8c68449244d92efb91bb65a7e3ea26a7cb29c2570890d1d01,7e5d904d58108dbbcaf15ebe7ed8e117ce5a13124bf01797a36a40c775a827a13761d415958fa484f7970901dbd794cb902f31207fc6fb573425739415e8cab300,4e6b9031adec036f4f4a5fda8e1a7359144384ace6f5b269aa4982b284136f1153b39e08a899e37f0a38adefc0b59085541a6d6293b364f3f5986bf9589dc93f01,4b155376055eed7faef3f892c47f63bb0d8f187dd93d14e56473d507194be2cc38e2e6e8f902a8efe7cefb07a533191dd0c2f15b7d21d0fd2478f46fb1341d7d01,c5cb2d288709338039e4663d0b4c14647ef6256e37c6f4e8f0745ffaaacf7f5261ca806f1fb5db612b9c0f1b1a05aa1d1a6973c15d067936d8e9da9d7e89662000 +2879c9381ae1f60dac29ab82d19dfa4a78de64bae164327336d325b2c335aeef4b15cb580a77aeec915f429107af9fdf705a7cf1af0b219bdb42fb8c8173708aa91be8051c3d7f2fccd6a23a6c81092d360383509a0e60b3d33bceaff3630f99d672394b18b210ffe24d2c882dd59c6ab529d2f7201bb127d46b788e765a7ef42d3918d807900fa9a2cc7f6e555d1c5dd7acb34b47a77a7db55380801e2b64fa7bfaaf0513642f68995e2f93d46f700bbe5fef1e310708a6c3c2a8ba5908a7a2e1fdee561d66cc45fffe6600934439653895ea21833a59ba2282c379789b1ae954baab06e9168f68d3c28c3d5dc4b5cfd61458ff83e4b595e7a8559f28be1474d7375e39b444132654d568ea089494b8d4ac5b13aabbcd5ea3346e5f7a531899,8bf27060b9210f56bd1696973724e6d235a840c60bc63decb59be8b7c80a9ace,264693104765c54b08ef29a97572e53f9114d74d60498bb4601717b9fa0b35580f462459b24035f66ad71145bba38eeef8cdc0f14368ff64d6f64887f7467e0f00,130918f20ba56760dbb9e53672a232ff8e4a24c60bd3d8c38f4e8115ba71d760582e42f3bc1dab1d3261c7cf77109418b3f6991f206336b4c285ae023bc6987f01,9bcf6c5c755774de52f3ba64de3d2fdaea1541bd5f1dbb2ccca70358eae80a8a347511d1f95f5cb43b4ff13097665421e6d70be780846f93ac44639533e7193a01,b8bb33ef07eb3af7934361a29233f92ccde2a43dc8cebf6d7e4126659ded173640b8e53ada00838d70236d40a5ea82c1d36ec1ceeb5803893ca9828d53fc88cd01,3e32cf1a5707748f86c61f16361fbc017bec2c5adeffe12586cf3b45eff9a7844587d7a805cc38a5ca65dd670a963e5730674661aab1925ad2f40993f385e59c00 +fffb0b61ba5e0478d7977cc08bd253b8a97629976589da61d14d4d524f76dd6019ae9b9f712340665398323aa65849be5a0ad49d5b07d9ec45d8bafad00e4a53debacf980d429c0750b49aab5de45855603be15cb6810e8b38cfb62808eadaf1bfec930dd53fd73bc1f7b2ba2deaf0e4da43ff39273b918bf813fb8925cbd15a7318d8db57785da6b0ed0d4fb6725fb08ff76e1640930ba3609bb36b12bbff6412a17cc14b406d969b1fa376a22bc17a1271874e2d0c549fdb953099e8d077d65e450526b1363bd428a0d4db05fe36ff470e0715da26769f6c0ce81aa34923d14a0eb86a9b21f2657f8a38bdbeb535e938b309b8bd89d15fce97a24b3244fab37ac3e3a6aae48f53b2a5cce7297a87f1884c3d63b05242abcc245b099e922bd1,8087c92c7fc6a512a5c50764b45e5d49b140bbd963ab5fee108b5e480d750767,04d9a0f78cebbfd868441f3d6b1812989d754fd0835d2f6cf2d7cee3b5b54544018eedb5ec7a1d0fc44c944e7798182880036133e12a2cea7cf27cd470bd3dce01,7e3cfe951b084ebd07e357d4f4709a81728cbe6c3852cf2b6a322fe0364b17140307fd80956db78160fa399c04bdfe8c1a0bdfd3d787d61b25ad586425adf1af01,f1c41dd3c3261c1aa425fae2f04775f96fb3d509703ffa8ea89f5cdbedfb102d1ba70d4f507677d4f414c8b61419496954d2c41df1aa72beaf3511855fbe3c7f01,d551e1ff38d387f14149618e21743850b3b8ecb083cbbc259010b558928aab69232e456ff1c339fc97047f63b9b98118f2e492a9bbd24565bc7e0d7d1bd3bc1e01,7ee59dcd9fc367f8adf0fad4fe807a600b5e418b0359b71dc8a9d0e16dec023618d5ecdc5a00a33bc3cc746f5a7974983e85b9f888e98b7190ba42ddb99142c401 +8f67abe2ac5995ec479a1ba85d3e9e9dd3046f7b4ef03b41c651d2afc4bbdaa5b6516af3e67f386056b88f31b3d9df66468db71f30f90b17cc1cac1c3827197d389d6ec05d6bd5c8c1fb7c830683d9b9824c89178e15bd29ef8a99bb71f5fe2380190c49862602a6f7e2492f764b0c260d42bffb6bcf5c5c7846a00928bea94d8105f3f110ec7ee3866a8fb51028ff2dfe281d3fc9f883a6bec8a85f52320401bef1ac8acde075f770600113209a2d272a411fec086ef0708d2de88070ce75b05fe321d306dad22079a1001a469a0f1681c6e2fb2b063b9c598fc2654decbe6e0efb74eaf44f6457b13be0640cf5d75b16326c84892f673421df311d9f9ba6d2243bd6f1a8abe1a4f7cd54799904befe9a8ad970bf162fb8185ecd75f00def88,5fac3c257110e8a3a55e0b42c1b907bc721835901abda549758949fcb197a037,4f4b777ee53efefa1a41d5071e017e305c0d897b7f5e350166b722258ab029281a8e5055c7f348bf6504e5a3a90926728c4ef956edffbdbe5c278d3b5f98afce00,d6fb3c65075609836578350d6b7fded383dcc202148ab2c439f8ddf3e6e792bc4fb21a1eaa853941b819ca1b4035646cdfcd324b59c06491d629162d21d4311d00,c19d51cc9b23d9feebf41270d8cd01291fcf8ebdfe55d7b9fd9e1b62a48943c91a3978f92c9d1e24d98a5113bc6aaafdb2ed968677bf3c9492ce016e67ee07cb01,06e1791602973a4c042b92d01f09957f1204bf89d3bb01be0d9a25e500fa35df3ab28173cfe05a8a71a824440a493492ec3a467133665dd283bbf1c0a5c1616e00,910c8dbe275539a8b9a61a286ec2f0b21391e194bc7b660fe6a4ee064d763b4244a6d2ad79db4eea84ad60cd12f789538c4c163ed06e22c58daecd0083142f4601 +ce3ffc329c5cf6f8a2695960aad30274e9bc96436c8963d2e91df44d3e54ffe08004cd8ef6021af53abb7a36a7099251ec2971fcb4d06955923c0cbf05ea50c0e45f614f1ee9fcab6d699e385fc59573820e9a80821806c612ab44826ac9b23275ee80c573b0d3d7bfc5c8575274e90e9b99b4004fd9ba49c71c5abd808851eb9fef1c162139a8a7a4ddacb6fedf4b2b45153bc8a7b557cc74ff1721a76a840433bcf6208e8c05f8e9165562e9e0a8b74772a2c60d58bf583a7c44475cfdc606d381079deb3c65a43009eba6846e68149613706c1b84241031e1b9f4e9fa569ea3610c3967c55122698d1eb26fbf5527a079680e9366f6a716456a6fb5db74015c847e1f3fee505d06891da2e393fe247f800c256bcd4064315d81327dae9b12,6ef251286d703b2c979e0d5b6c8d1d37a930706cb2e3a6cc9b9cdad1a1daf7ef,8c838d8159c0c62f02bb0cefdfc01b32c83ff5d56b04a24765dbbbf1b5efbe73117ddb5813f1af776fb427a345cba9ce3b4e63c31b14ba8760fd8441ff9cbaaa00,9aacf4562d82fdfe07cea1ee234171ab1bcc8bb834967fcd67b5811628328e992e938e4679d7626aa1b050b8313de4358592e762e3bb8a741ebd86cc6206099d01,5f9bdced118c71d2d637a0bf3430b95e79ac9ccdec5f10e3ce8a82918682e27a4b67761e3303d0350182624cd5e821cb7122e19cbf65d085987ab4ea70a497be01,f652e072149e89dab073c9547e431cd8fc5adfb6de73ab05cc8d43de4f8971fd0915885c8e2ffee3eb859bc6c14de0ff13c0e78acc496a84e842c4491ad7f93d01,3054efafe94a84c1cca06a725004f72c4c6cb3a6bb27d1b5f547d1e75934a479104402d742e5454acd18016ae3fcc33fdf76182d03fc5963bf2c30b12157258801 +ef02c8511da0090ee0b339a525fd3b12c682a62fdfdc7fc13f260f3c6610b68c07523448c21b8f03ebcc642eb21e49bd3abcffcbd9b7feaa660e13f3e87ac901fa77726a9ee05e1926d6d606153849c47d33da2aaf30605ba1727570e395b80e3aacc8b0d7fc1997a5afff4182e21c5c8294dcca37d0b50595d64c8df34d2c18900c9f6802882f022f5a74e504d0beda3c6442c362e1398ef2067a48c7ff747769e469f537351ecfb0c1de6f2f05bdd01247a91302c14f2e1a526c7216196f73c8380b45f2533af9d4bf48a5e62e08ab67c215287e4c750512f5d00f5caee5502a2f0c5acef6c6e35a497fdf38bbb6c91bfc24cd2c67085acefb49a90ae0a6a599f390e1180794458e201c313177f6118c3b98dac7d88a511a21386058798ceb,ad821c180336045b28d4d3b3846773da7028b0a16628ae677a1e5db2ff6cafe8,83dbe52d1d8bea57ea2008a489c26e16ce732b93b33eb16de5feebbee0df5ece5a954f52501a95ef7a791ba9499ae54af49b5412375642ab688bf7ca4681f71001,5349c34d692d9aad453925b7138c53a5444a4727295da1eb49be861456f29aff41e5f70e1946474142069f01dd5d55530da156478e58e56f81a648050da044db00,69f2ae07bc4d5c5086e46c8d1ff458afc5c6ec74d57e147ea4475dcc3db868f949208899bab3f1abb429f49a4f9eaba6a817ec1208beb9406ac12ac88797ee8d00,a4c48d47cc9332a20fa2038038cdbe00e614802fce1afb35af734beb4514adc86076d0bcd166c7034244cc33090a75f9a6f5157acd184da9851acab42f1a3a3e00,47109bc7cd389e57c0572a461f1e00f80354691b5b085f64cb86e004e3d46e804a5eec80d328571b8a954cbc94bc04223db1769d57d30955c2acd24edbe146eb00 +b8281f10236b9ee5eb0a91c77e90d09f58334c6e44ac7194b3e24a362ff2dff3805a269d850bde495e0bf21a691c30ad93131c85e397734dd1fc8807b49f2192dbc2f6026e26274b6fefd1f614f19478cbccc2b3d69e5ccc1297a3ec17686ac0eb6a588ca5c3e599a907755843ebc4e00c68ffe534c29c8b28877e4d873f60f3bcf55d69ec22bc52bec8807d67edcd6d6b6be633a4e8a90d7eebd6b50813c21da8940e2e803e3b32b7ff81bad8e5761b7668f8be46b8b73ac80e2815d54b5b5550a5fbbdf7bb89856f7836b7576a8952db5618e4bbf7e214576e3d3fa797d983c0bc19cc37b13d5045d0bf21d9e5de220cb6da6f6fe88a26ace6e64c7d123c51c575833fbdd7fde7025328e47674fec66bc7d406ad37411050742c9ac1e37a2a,ae301c6c67104b855593fedf51b88f8a7514f280781f53188986fb1fc329f69e,a8dc9f6369d0ffcb9b579dbe083c6b230e226984a853cb206b4b14311d5a1fdf50c66b3fd00888e7a6478b3987c769d6ecc89e626ef370826824594ff18fa7b200,a70766e246ca5e2afab84beef16646d2acb03a48c511cd5df12ab328d815f6290d5c4fc4d678ec0680b666b5eb0cf185c570039a77758b4eb398411ca4a61dc400,289eddaba7fec41cdadd69c839f75d6e987becad6a9230c33498071bc5236d917faea5b75294de1e8e0f5b1d8fe4c8f8a846463cffacd607020f639dc06b432a00,f60a30eea9f29630fa52d4e1ca8ea97bbc45c25ea46143726d22a164aa89001644e5e603d5c26cc5dae322971a1a5038ccb8f5b563b54499e381d9e1c4b5a2ed01,b3e7546cf903e44f9c3ad8366eb6d151e3976e80c9c2752373d0a51c0783735d328c747bc99c1711aa4570705dba152cef86e7388ab24a6806663ff45354e84100 +855d2dfdbc4adcc21a98350062569154531651dbb1071d889c43c9df98d20127fd15dced4b43b9df2465f159ab5bc046c838f600ae24f5c0938fa427f9cb9bc88b37f5575389cc207122f1d49e030739993672894738df2b7b4e1ca00cadf3c30812ec4dde14c804ab70b2194e2a4ac06acf6c77a9f7a50a9f2962c0b998ddfe197084ffeee8e955105d64b0b0a20c1af7702258aad106e24f724d8d3be68f5faaa1065a10085ff1a6c707bc5fe947afe9b52d8dc826a86b0250465c0313a168107bf7300d331bbcabda0363ac178cf0dd9cfaac97b92beb54bda6dd1acc27f09ac6dd2ea869b77e04f73391b9d025a9cbbb4c7c60f0c318a5313002192ed3e2f789471184997eb525e7ac6d47d538609e87a4573e415eeda2dbdbf97289c5a522,9d8fa9d6fe6567827dac75dcb59858e8cfa304e56e155d2833da14325637ca02,8734597aea3ab6d4584dde985d763779e1858b3009a41981fd07c20d6d3549e4175938a75b0f570c3e516f426fcf1ba26f76a37f44ef76940471a37648b744aa01,f195e4c2ee84ec03b47be670da14418435e9665aaaf846d2c038697f49ce5a6107d91b07f7fcd698b7009214dbf1b6ead6947e82fc6be55b50749ea95e41e51300,57355d8ffdec6fd99ed4f9bcafd1ed80d81e8f389167612bbffbf134fae0e1d128f6e9a17ccf05bda980b475f142740d3c5b775cb7dca07ce97885fec807d4a801,1bf3ea3d37886e5788797076f0ca0c4ee1ef535c968afa91f0156f5f83ca7fc87af94e1907793917ba8810739b4bc5fcabe16782b5e144bafa63c85f3c081f6101,48e08aa1d85cb47803f8a80e7c7bd3b1b2c847a3323299512b560e713117d2ac7330fed3d01cfdb5067ab7448ef2a1056957e0d6ac7e2cb12a0b9bcb9939791401 +4c455b332047da617617567846aa3d8564bc1272fceec8a82b74fb74c4345ac070f54903a9bdb3e7c2a709ca30d1ebaf2413c0ecb27fef88772e4d568c49a4dee5e2beb1bbb822dab294ee575912aa9718e216a2c543789636f153602120acfd28114d73215536451256817e84df7ecc8c070d52fa6a7205c7114d568948f9f9cc24bfe8eea40adec7405b3517b9066c51f6fc1b1a0f1ec6d72f70a424c98ee34a60f516632a7e4ae8c3f04604c2635af5300f530321231a0d347f017e1ca213f98f2cbb7f65c473e2245c0bf8374e6c6f2acfdd5a3bbe8b57c5695ebc94a7354c68da4d20706ec51b1ac981a3da47d2a0df1eeda354370e4895ed04ca890f2fe4e55e60b57d5de7b69c232710ba6d964f9c5fe568de417027803d60beb05226bc,fc7d0a6d4a325fcacaa86ed34fb9c52b2744cbda4602321282dc43d957e29a08,4fb24b845333e5ef034dbc224a6af443a9d07f80259215fb47080f775e70a70a76a1cc7eb677707e216b4866e79f883b253cec661daddff77dd1e413c5a2785500,31fdc150a3b1b8614b2b889102eb4c551136e15afb8fa93e0d8372c06695db600736dc82e2065f1311e1051ca90e58d977f7b2637690546f3f5a27f04b4b3fd701,af2e0bfe480ff7cea2a613cf6114a6f61eb764a2852f744fe5548a6257adfaf42d0bb2dc86fece1ff32a1bc5bbde02da8b372cbf86a1d21a2f184e4cc714e1e300,39e155ee4bd56095d132abc41f4274a33d895ea5fbde533842124d6502a62f8f2d36843a4f186ebc1d985b5dd0129020616fc5c92d24a2fc432787058c0ad64100,250da8890d10ef7e15a9abb2fda8f24ad9b37348f163c9baab64bbb5d5d56b7922f8f9e92b6571cc6f3debde5c3ab5e631294b3e07a7b7b0b01b7760fb3fd29101 +2a5c2eb5432494f97119fd3eae6b6584eaa5c19e26c4a80f130df5bdbf3ab5bb18b5b2850de636eb39b4a2fd99756d8fe85ecdc147d21875cc1eba346e2d20ae565d558be0daac697a996b8565d48629f912c7c1e4bea99e8d416a0babc5c16b2394d74764edd846771e3f445015027563ac736a12052b8fb4400ddf6f3833f67c2668cdf91d0b2663fad7773c996a10a1c14bebc7db2eea27e66c035e19eb220af4cc22941ad7fe267c6d3382495d867be74fff1beceb9aaf8c90c8a1f879388b8d25a2c1a12cb0dec0404de866156acb811b62bcf232319276b76d89c2621e3d73f02eb896728501de2b7eb7fec9e1261c4eaf47d53d223f6a9bc92ecf5fd5c3cbb2f25659f7255fd773e804aee32888a60182d716d50076de1f86b289222c2b,9a77236ae4e6a5a554ee5fff482132682039d724365d3130ae4d8716b1ed63e6,a6b7764779675b7b6482a7f8383b65dbb2816adedc0a3a3d671a00cfbf46bb2b507a9723a161fd3543fd7f5198fe42f1ba7b7e3e48294c12135a317385a3a3af01,f264a6604363b9be6c7ec682bda223c24236ff0fdbc87f59c36c166f72a2af7b24a252186b0a77bcd547b1d024d399004a2b512f5e374de3554c7feba5e3f88a00,b10a600081e9f660433ae687c07820c4b7b6927af0f30c6ecfde541af943b1673a981773cebf718372837895511406e0b9503ffbd809cb2f1d8cb761b53be14d00,e25976fe7aa155a33c070556c2740dc07f2b653b80ae2d11c8b97e3934cb1b363798a30bcb4a6011d9c20d0f2631d840103091f5ca078418e20d31b46973f48201,82b10647505aafc473f0b16f0974f042d088797acc8802b5bcb7742e376deb7a49cd2f888b097c63a0cf9f28cc79c96ca2d2321deafacc5fd26ebbae1932991501 +b2ced3677fd43e7e755360e76a960db0cba39de76742ee9c653198f24a8dd01893844a5c88db9ceec80e73b156f32fdaa6974e705496436d3e146685b51234180171800c0f900337948514aaf53c8ffdc78f5753ec94dc8abb24d162e51732631bc99aaac49192b2a6ea7a0ff9b2e87c050e135761a0d6127ed075be696387cdd4858bd9d667959b98aaa1aa547f78e29a5c3054df6f4fa0b8b4ee80133aa26263ded4ecc1a6d3202d2e53013c02988d8321f69fad79186f72712b8008e31c4a46fc97146d61a128ae366472b9170d56194e517325c0c3d38b47a7ffd6d8b334021e332dac62243e01f439193a7fe50d9a7f68e24104297a4090402471b7d57f3e1093bccad24521359446cbaef0fc9636058f17841e18b99e90331ec6cc7f5914,7321968c9f105da0b757e689fc07865423278370f8122251b64c6d674c88b157,0c01770f07190efb132e3944a7d861784a5037b981acacb9e7cad007f24474823487f1f38acd2afba8cad635a2124dbc4cfaa30ce318da3ca3eb8ce38f326eff00,c8591b91d7358ac0b46fb94797cae9d7f30ed7a0596110c16932a4b32dc7e036122ad09af69b28e68b631d66b1feff7b30699a5bb4424c4d15bf1a416a05b10301,acf3ed8a4ba0581d788ce9192724745998949223493271ff136b18c8227d474e10739439fcd4be39fa449c0c8db8be3d79658eb1402d2ffd752f724c370c4b0600,8927ee01051612910a568840e28a6e7293228c4330926391846d982d3e50e169460950c7f6bb58f65d12c6d3bfd812c54816c6cabf9d91a6045176270182d54800,620f67622d67b71dd6bdd8f46be7b6023d03ec1791610582f1625f94c6ee35ac05d560defb040eb9b028eb39cd6c207556f13ad5cebf558d038a69dc1d1117f900 +57a78784ea37a1b83bd84bd75894152a4a30c4b82cb2eea8e59a74bf881876127bfd2cb23bb3d681c66e48b9f27ecb1830bdd1f04863c981416888cc855a77ed81282384f697596cc928225d0d28ae5776636644e654a13ef8443c158e99bae828c5e0d41bb8b4397c8c61477d7859fac667d12e650e68ec2f882f225c3c57b68e53433e8b93d013a46d4a0928b66f7e135f156457398e484a9255df39a134993917c0a4fdaba3f0c1f209582e2bb940cb427e348cc84f97fa05445e54cc42d73ace921a72d2ebdff55f512f910eb7f82368fcbf84aa7c5455c42f1ac93900ab4a3b731b29b523a682ba9415d0dac356f8768270c31383c8aca03c21388dc207142c21a99da70fc3b6e1da57b432174ea6f9070022eb2729f94209c41811b15e46,99fba062bd67b8700db21e51d96caa8ec62d83c2add7f2ef36b1885f4b185127,42e9fd052022c5e486711dfd99b26447cbf9af8bfae9b1eaa93a1b16ee8722ff31e65de475418fa5cbb49a6bb233fa4341beec2709ab11e82ebd89182422a54801,81b2144a909232f956f473fd80843a2726709427c68073223b62253908b2610816cf86ad1c74143e15393d52738747ad7f564ef920301bba0fb40db179d8f26900,3f4c7280de240c40252ff84cee73bf952aafcb1e89e1ad9f1cfdd9cbbe89a272641172ac368d7349a9fb448537d7e0fdfa47d87362e834a03c26a50c15c3d00800,c71154039829f8515de7673acae104ada5331f7e752c8266ed38ab2b01e82fe432207271eabcbf8a898b5b734a706178743ed4c453006f02bc2cffde93d633a801,0f1c25b8063964144c429df86674bf4c1c3d3a23834ceb751cb112ad464085fd1acb2f1e82aefb416e854c61650cdaee2a5ee9633bdc84abcfbb811ee71ecf2501 +53e7e6a142e46beaf62750b8e87e2aff627cde1b91d2e4a8e8227e7a3e226daadf2536e7d7336a8319f93157b3b04f7970a5538a0c61c19f938403a685bdaeede78b18169166fce741c26dd2292eece788bddfa3fd5573817573b5a4d0cde55000ccadc63a5a72b3c0f442647a17c1b2c936f063e247867b9595551db97cee14667f11929d070a967973bcd7fe13f5fcc605a85b922cec6e087c9222965c9a47db2d786cd96a7d4f8787e7880d8bc919454a6d0e9f24ebbca9cd32a4bf2e8b143d1be237969e1d0b977a5d3401dcfccacf2c96b652aaec93134e1881b3f46958b33cf50f28b8be39548b69388809691176cee9a1ce80074f89d3a73bdcbd3aae4e06a341c53d5657444d01c041902a8ff8d0d1566f708395234dca7cce2ea2b390,899d6a06264535c7ff3714d85277b65865594d2d119eefcfb97d2da8e28f659a,504cfdc9699812c2b9a5cd102e82878dc40c7f12598b764c5751c12452bbf58e04f7b0d09a321aea2c83551ab2b5735939794de422dc325b89cdf301dc0c1a0f00,c0742d0b4b15556ec973fffe58c0f38bd3bf045fc78873c28a01156ba8e2212f013cfb33fb2c3b782eb08bbfbd6cad850926a447d101a8173242463f7a683e1801,8250ee5a70b2e88663f6ac803fc2776792e94bef4f74bd51b80121918b57a0647d6aa31bdf29a4e312106ee78344a0c8b6c98d24ff321d21aa7aed61da1e617a00,66eb820ae9643a99007db75a81b2f0f9371f39f3ac65dcf3b4a8f204251c14d0508a4dc9e6d5bae62da0f7b6875ab1c71b5bffffe1ef0176abb5c03d4a360c5600,d8e6e83efd78827df58165934d7a378bea61664ad33416f36550e06cb7162c6d6426233ac8b54e06dd5dd0e0c6187633d002bb8f8834d54b360be134935a61a201 +4f89360d29f62c9136c682bd8a8bece4a9b74f960ce0820786c5daabbf5a6bd3d0baa0a08535c454cc029c284a912c293a8d3be02d57d5b8f6a3e588b9b7f960ace9830ad1edd6bea06f34fd3eca0e85c62a93dc30ec91334b63dc61317f42a22e015e2015cdf89722335f895b0e31f3ee2462d8a355d7c1ba4ce325605f38191dd75c7dbd84d873614b54cd2c88f6f72b5405a60894d7f20146a9df32468f96a823756b58891d5326b2dd9a52c26b98c86e8ebf2d8903d5387aaf9cabc77bd4821eb67ec6131fd602b87290b197eedf6226cd7a1bdaeb5e3232b4ad0cbf7eea40ebadb2ca36c660e3f94a5688a2b1ef9a1927ccaa775e4d9eeab525b593ea09674571ebd8a86665825a14934384ed057beba16a465e0c9ccea9bb0f48c27641a0,1f1c610f19073a632a30ce309fce9a8f926705505e23c3aa0a75ef9885426075,41d21c439ad80861df058d295e49a81862e6cbc44c16664d02ee9e1322eb11da2633c5df2b074863f815ced4ab7d5bd43515efb38512cc41e83fa486ef44639000,86df402f17f0c311aea191c51e3788f6acbbc12582b527c4b4c37ae479bf53e859ebda026e2c59db299e459834645d89c49fe26dd56923e25a320bdd9d1020de00,8a8f2b5b24328a73382cfbc678287703cb52b8fe8d72a21e9aef1887151a17c47d327aaa2de27ddb2b1e8d42afb9eb22a226064a3ed183778eca3e505e8fcf5d01,97c1fdada7fdb4d64ce9991d64ebac47884266e1a1a3294d9b0c613beea3413d2ddd9805fac0896fd770ddea65765ff88d6480d361f8ec1cf01b9fa2b8e081bd01,b133e236c1b38ec9f5e6e8a31cc8db38b10be66c6abcdcd817afc908b72783d84eef1974838c4bd9706c3bad71f29ed4bcde18d18a8340ca20f27c804e321bb700 +d24a24d215ae90cbe7963f4852c0451abca4d889a96db363997d5eb76ad82889cd19b39c4fe58fcb3f070e06469c58c056d84e3d7e7c4412530752d34576cbc3152537834fee12577506d6825ae07db82a1a7c158fed73312888d318a154e9ae9b856d9257c7a779d84c4b7c95ace440b82f328e109477f67283a50399e19d37c109824ff7790dd6b7c257f74eceff1b7d98a5c08ac9f225afb31b4a0a65e1398d773a8430e4e1be4c2c09acef75187f0d7da345fdf00b6064bed8d7f0c9fdc6396637d694ca22c8b18cc564029fbed082a26f9e2a9176135741c8ab95dfddabf343ddd434468c0fb05777d4ea24a4e7de054d00d248697fa6cd4bf09cc0b50d92d908c7610b6bd7a9ba62dd51d2a9b3788a9b17ff56a5ee80a85c65d1a691b8fd,32988b059731b4b0fba72a180da6d292bf97a52164b5826b15830fb8ca947022,888f2c38bb9af6543ab5d4b5d41eeb5eab4e33f7fea752cd5916e390e98013b707eac88fa1879b3d06933620739ed26c90cea138e275642be2271744707114c601,a2e11da845060daa1e0bc898ed0eab692b6ff681a92444eb43c95db435a7eda228f8e63a494aea283246bce0eb3d3575a6141e6a175e57c15f0814d6c421c6db00,24b9b26f4a31368ce4a30144c018ffa43ba5787fb9ed14f992bd55a9a9ffba576a88ab8f371373d766ad86eedbdc435f55ef417613d57c80ffc82446a1778f4200,30ff88d87a2d3f25c98dd67c8deac39a89908fa2d864a0c8ec280a0d7da8f60c65f06f442a267bc6d2098adaafc428b5de1a8ed0bbfd23d8a22aef07e401aa0700,23520e4c1a96080f7e2e086e3ac6829f144017158b11dfb17a78cfdc5abc22a257980840a99ac027cb9fca22d4661bd1ee66a7d5cd752552a40842c8dbc4818200 +7870f48f0f70b66e0afb20082dbe99290a5827f11e0aaccbcbefb474bbae5ef4fdb179038b93aaaf8f10cd1e6931deddc397e2f4c6c526684746f364f7517b5ac3e2deb1cc35c561fa59adb6781db8acf84d70d68593a885e71df2221cfa602e2d4ead7287814230aad9d23867ed89a06e1d67553f0d6b111675bab14c0eb3518ce5470feff670f5b1940c8e2d6e09439e462c76b7849150e1505832b96223351e2889b8be0892886ad30e3e7d618d2ebbe6541d4d96ed5e4d3d6cb2cd041a0e287bef3d4662fc41b1bd9da6e4f052105898184deb19e7142a2e9fa18c3477fcb906b960132bb7d9417bb5d0a5f7c06adcf6b94fcc724715a458e5c6bb84a1ac348fcb648566e1c09f31a5485b8d3e388c6f5e77da63137bf8232b2e39129992dc,b4ec34d6d4e925906cf09fc9801504c1fface0b9dbd01ad26781d93a12ad3737,89a68149e1e36ac924402fcaed288d19cda5dc07f27b299cd17ae707cfd1802f3ad96e12231d33c900864dd5d5289e5a461ccae09d0434d6a0ec40f255dc5f7100,d8852bedc9a75ab31b53c5216d1c229b59f1385c7e6f8d37e5f34a33433e02fd3cf2675c74fdc3705ad13eff5d3d4993f5430d8ea4fd47d40ba53559550542b101,c48e2c6e0e6b6717e312c8ef787ecf2676ab60f5ad17d0f7aef73f83988b672d557ccebe30aefe950333c7233361d93d54c00f07fff05fcb76ea0bac10eeff7c00,5437c548b5298240da9c5d8fa68ea7a5438bb0d7b313d05b66b4bfac9499a44a17a3cc54234cbb7888be5e9d6562e3c9c0775d6f9b4e563ff9ef85f74b4d6d9d01,167b63f6b6143ebed19ba60e40c594cc8a9a70a6797398fb0093bc28afeb49ab513f6482400412170b7f9dfb42376723eba28886d5ccb1d3a1e5d57d9070637801 +0f6180adb8b1410571b5eed4e18ef643b477ce41650f7f0257f3dc97ca6403f256de4358380769329846a74f723078d4637344f065d91ae06139e68f4485681aa21dff181b0a79c888cff995e8d355615d45bfe0e7f73d27e9e687e4b7a3c00b6bbb0b0b19053c4a2ef8eddba098ac5ab61830a65671dc7df8d752d0f793bae77a74b46973eacc8b5318f396064f64f4c4da26fb8b4c499741b6e69aa75014994acf330e92c72883788614ecd8203e796cfdf20853bb6ad6ca2f44abc6046db8f31785c0144f851bb4c4b39101f9a3552a93bdd7221663fdbece1fe948c11042c3ca8b2f9f680374ae034be4844c73ef96814439e05c6b008770fb334483f86ad32d59b5447739cc440242f43d820c4ef5d4f3fb898af0dd1e599d2e597441856b,613b016fd7f9cea1129d59537a8223ea31d3a3185da93a7cdffd7da7492d6829,828adef8e0570fed5831d5f544919744488c9952a9ddba6b0ce3ea8bf1e2d4cb5384a31d97d254930f695e3afa7409111fa42bb624c52c1586c8d18073af247b01,05d0d1fff4e249b65d6bf62f06f3802dcaed9e9cf9fb762df301bf202323ea8921b27cf36b4ec48598a1140792d9ae937870bb39f4e17a650d44b3e31b16c36701,a7d25c98e9ec208d792e4942880f8a1cc501b7a1f18ad4ea0ccde7a8135e986365841d496ede3ccef99532ec5ed7431b6b1c22128d5e1bea21d2a8608620139f01,a322c16fa67ed5fafa91db91471d434ace1835d7b1e3b0629363df27136f4fa22a3699e4ab8f456cdb001969769e471b6992eaddd13aa77fc3332a1e645af77d00,a35e43bb2a5b702e71736475d12225e22a7b9f0ff405c5cef93f0ac3f78ce5b57d8797d030028fa7a9bbee6dcbf07efc4f21eb409c60b9f3149645ae660b3ed900 +9f2e91af550c22adb28be5fc2c6e40a63c127993f1b7d2ba33b44bd1cbbadf7f84f74e2ea39978a31d73f4e14f410bf4bfa6063ef170412382f9eb0e78229978e74baf55897ab0bda5b647fee4ed9f960e40ca8b0a8e9ae7f8badb05faa5e45cceeb28b11e180950cfd03628f4accd45689a3b8b3fca7d829295464bc920c498e5e2c041ecad909b27644b342083b89a6b3063e442fcb3842bd957b70339d37849e0b0a4a0a69a87478cb8453bbe2fb8825911112aa3b18caf2dd1575287cd85ed76ce1c84c6417fd9d9fb40e69d1b0da3314ccf61763fec2894c4e7185dda458303393557b0259cbeea9c03fb4e053cab95a8d526fb4849dce0c205151b3374b11bba6714c00c2df79ab9ebfe587bb4cc7451cdc0aaa11a55459f07f04a80b40877,d6ab030b56c72eeeb472260652479befc9c1b2003cc21d37eff4a1ecfbd039f9,4540d6b0a588b840af9d976409d270fd29ed15b85923cab2cf19ca08f970986e326b19f876da5c8b2606d4db125997d1a4396de9688f347bcf07a5bcd630bffd00,c94f23d5a5540c7eac5683944b32cfa0a9d0d438087ce5c25e3bdf7f1ba15cb542535f43e58b917ac9d892c58d3bc13bbac118e7d05d6787bfba0e6566f6a80300,0d97feb630b2e9b6d3b6d59e8d4b9cdac8eb2e9347aec7618914f519924a7baf145d68954bf2f0307a0c3f892274aea80adfa2796377193ccc1ebd3e05f42b2200,5441aeb9330def19ba4c082b6f45e43280fc820ce703b5ead37739e760f0590901aa8d22913c2fcffe5e55c7a7cf125ba386254dd36c930b846e4da288b762e800,ee4275879118b410d9e1dca654e41316b9c3849b1f87c8aa9ac1ab2a95bfdd3e7e8515c80c8b0de4dd2035708d0216f9a7fe125d8c641b822cae6bbb0cb6025401 +7c8df7a2d9a73a25183e22ea99c4425d07d09c79dfbfa9d3f3c698115c7293259184abf0ecc67673e43007146597a3516af371808a505d8bf8aa03732aa76a8ea046e5362c5d670f998f5d674836baf78e0f1a3d6ea6fe168a0fd64fff05a433dc09063972c90e544a3b52a62979fd14bfc6637ec59cf0319bf6958b04149679f97cdbb4c9dc516699c6dc1008ddd7edc9193217f6b2a7879d7b2a8c01fb4ea109078d804168dc2b168197518964d53798043b915ced488396c1d1c590ad9064089797b3066c4f3c6553e7d261654e925ba7d350e8a03034a2f5f43bb8f0114d5a21dadf2aa1312a0003c329e01c831a8b62dff477a9b949d7b8578b1e81efbccc764fa6df55faf2c3275e33805ef5f0d68dac57bf683b5a53d2d12e86f487ddea93,1700a1d2bc6684f6a602037e8a524ff63c9e042d9b5117abdf6e6e760d903dac,65bee91c86c90347b7065f3f7ac8d48e43712c777b00e1422ceb67b1aa6062047659b053a6ead672e1855ea008df5bd0ec02e8c11ce3dc7b0a097fa250adb1c601,93821a90e3a5462ac2227d82a4e10e630c708b8416c4769c371c509440d74e210cb5e378ec9817aa5cb3a85e99d1a273a2aed966027e64c5bc28ff0848eb398200,0173db66c638e345951209db55b134185a947a66a236cbee0aa446af2478927321244cc1ab20fe40b02e74bb254ff713cb6531a291e82b8db8c82696c7b9095801,1e4b192071eacc9e4bd39c966ce09f08a126d41cd1f262cc57d464c1c098e4e2563fb93afe9de883a646a4349ebdb72dc90eaa3a751fc487ccf086f2029951e301,48c4141f28604d6dc3dfbf974fa8d13cc7aaa39c34ae5b57b81dd509154a97ff548f7a3743905022b1327d32080f6827b68a958cf2d86cbffbf57705b1312d7800 +0abc14d7c09f1d944268c80c4c216f52137a043f3916a4d80c97433dc61a1e073841e0d67c4b40922b955d9387dc1bdc2f237dddf84df787f0e28812156613554ce944efe2d907002969a1398c4856b66b168b49fcfd2964ce57d76fe75f5632b5628a6af06c56ee4fdc041b6a8c6a0f7306a770b7824b1bcb43806e62e23d0f6c8ba12509cea85e397bb6494c838604c7b9ae2d19a6773a66dfdfd71d348e042e3c71b57908ee3dc343125924d612b920a830f387d84b8459de8e7a6c7ea6691b1e6fe1d47cee96d98f0b396077f1694b394fc43075911dbe9e4450b1e96d94e9bd41d72fbd5db4f0dcb7f75e41b78b53b793c6b927c69a4eaa5f834c5ac746e8c0dbb170c5ecae49b4b20f33589816cd00bda63f967654d95055f6d3fd5a504410,f18f57eff17f5ae3f705f734659a52fd9449dda88fe65b2901cc6c7902c34e28,037fe60b2f891883c6cf46e2963b5be12a36019d5052f414082be5bde1ddeb77535bb66bdf6e469a38f202798350ea028d8e00cee5e3682cb476b7768029c4d000,97fd28181668e736cde90c808ee87b61869e8bf55887a9480ab12cd46797b55038e92fd9569b903bf257707b0cb46cc5463a2047bee1c8d7c940dacee099c9b801,2cf92d33e6523f1bc62285a74e2ba67807e687f409560daae0ac23d892697e093dba949dadcbaeca1e9a9d0808334f99d5c37c5d7d1462d445eb4411bd2006e301,614bc3b1a3784e65c4c543678b9e6766f4186b8f5fad6f4ed79e1e29b03328d14e88a06df0497c8515484913514b37111299e0fbf848cf329694c9a6818403dd00,f66870ca2c58e54146667835620dd48404d34eef28ebc4f84d50f0a8a592986f01c4ee5ae50b2cd9615d8829984d58a08a6326aff7250e6a9d0056144319a10100 +990776577ec07dc15068c520e3865ac224a17314e5addb5e84140bcee327bc648d6830a73b30aa22cbc037361666858077f250a8203162fb20dc5bfb9cfc2f9d6f525a23e5699fe97854dc7a85c224435135b13794939e8b1ed8272d9ca19a71c69851f6930aa0e70a86e3fb0859d3b34d54903ec3db1779fa6daaab3d953c93b5af62604d7eb839c242e2b8d1255d0319b85ec3f6bfbebe46d99b565c26fb47438b415436e4e073ec38eff6a9601ad72346786a695f7459a1d053a950a9307f7be424efdabfb64fdd18330f6bed8b376994b87ca1be25ada3bba92f767fb5851e9a9c17d2164cacead81cc213ce9556416b421f908c0feae6584e7061a5510b5dd7e951dbfcf99ed0789c14a60e08c797e2550024ac5f3969580d60c382cf8bfa09,6ca02f31c29535cbf20b50ed6712532962efebefd677d0f115aedd16366925d1,d86bd00358334328d4bba7d76d60124768a055c861fc1d6aa893e889c1d0bdd60391c140d179bc2449479a0af22ab3ceef1da973e9ba797cb67787066c93c8a101,773d8479708b4596d6dde9b3671266a21ddb31ff7612706e02ac35d42eab7834243faad8614e261c4f57f8d72bb029fd09ecdc2f1881a3977d9634a1a77b26ac01,3f56d044215a0a1b0f0ad28ae4998ee2e887b5df702bb5f0a1aa37595bfd65a407adcf709d6e3cba2e58a66564dc931fbad3886b5adb178e1702d1f1ad8efdd401,2690ef6545525f6cc2da0ea6a6e305fc5c258e7a7d643a10f5c97612b37f7bdb4f3af2323783654c560a2370d82e3129cc09c8a41a4e746c91d841ea709eb96601,b628c225a0cf49c710c4e3910799d02062bfbe1452a961ee7ea7cb2552ab79844487737e41b8d3fd5476780fcc20b0805562628530a9cef11bdf788515aac4fa01 +c9246dc33801689939b904de7c0c9e1861c7383150304b7adeb3a83b1091c018fff640e99a925ee92c962e7ad91a3078c8076ff1865510e1672f4d33110413fb679b5771ee5b78c6d7f187394008e90730651ca0d93e728176663fe2c574f60fec7729b913af3d86dde1a246454554ee15d3f2553fc0e2ff59581f9b4d26ee31f0a2503d426ea40d8a3114ef5db5a9a10bd77f3ca5678699f2fff1bc1ed75b6bb85e43f60fff527f2a2343f36e4c41653ffa870c8f469ff241f4826308dfa70314d17692e00adfe3f70d04d65298243f7a5623ff0fa140706549d725a1b557d3ff5836d0ae1477963b12327067eaee606b92672d740c0d3ad3cdbf19b3f08cfdda3d2cf8b0de5413c07ffc7a158ebc0b9e2fe5453206a1617a7cf8693587b7cbcc95,5695c29cb8552fe112993561d3ff532b9b10c22c13dcff27cd94f3055c8ceaa2,e457c546200bdc8e639711c005ea0aa1c31eacfb545914abcf6cfa5c4835460352666e10d4bc93aa3a1cdd3ede302a8d248e67588aa211cb4f0df92e6d8dffa001,24347b5b0ceb15c7384d486371f90deac39c45e409f9e7f0e9c46ce1dd4fa4cb735b21aca5202938b71693586cd6a8a96f00cf013b5ec74563bde3a4d51b48a000,59f99badc3337955de5ae03a1c28634ee5ae9f7f692a837ce0eebb139e15552a51065cf0f32f227b6fa8eaa2330c70fc2af62d45458e0e95da1abc97b2507d7c01,90e85f8b1da16f7c6a1376dddade61bcedbcef6c1b595babb676b7d43c96994f5c65c89bd452e2737dd0dbaeb948c11bb9838ddabbd3a1dd2c1e8cb0b7aa473f00,40a55e3b8e3b8f1a4120ea03c5a7c759c8c509908de52266145414bb93e248d00dff7926331dfbcff2230ca3070ac88185e010e3013a97834a41cd42a1018a2301 +e6bcd5369c0843c94d37e7f5b95d53bb1e9842fabb8ad29e5570a35b6b33883a1c91b63563b1d930248ee6e838ca38cae355d7691b7595396e7d175e4652890d6a06d6376431172adbde1e6e7efce212a59ca4e28753de447e3e058f88ab83208f8179fb3bcfbe896531fb3bd6c4f70a3f45ebe57df233cfb431698da2621b6069f9c646bfcfe0331f3ab676983cdaf8b8a4b646cd95310298deef9b93ac718ae2e5a03165d4116ebfc71db87191599beb40fe86fa13297f489ddd171fc4929d9b782adc21ac58422db696444d21a3304709044d49e73f8786e6a080544d083e889666127f9593764f3c2a87e74f170f01cf2a108d478fe419db4b0bd1dcd05639f365b77019f185eeaf033b2bc248257098b81980b8e27743fe459fdbf7ca64f343,db8c9b863f9a80afcba95e2ba379a53a4ffcddee4c5e202366efaa6c97327e47,d668a668bc45d3af786a58585b331fa99893ff278e136980bf543635ff6cc71c36a48ed7dd681c7304e2a5ae037b8729bdb42f5bc6831703d22d194e5b3ca1df01,10ab383f6b47a7e315fb0784ffae5a8d82f5f71f61a1e55fd42e8bf96a7bda15375ffc6b9c8f11e3ec0ab4ac4450cb28d77449758524a1ddf1d119fce903419b01,484950e54d00ed358a3730a24921a7a6496c12d5758aa308f2ef9a9e965bd21f4723f1e48a7b814b2e1ed2f79910ae6993dcafe74d6e100c891f3afc8442793d01,9e6d6c5096668280c5cb941ac1d58a028f319a76c631221eb8c4e21627a2e1050b69ca4dc0d61d93adffe478442548e64c2a3397085fa1cd618749664f2c905a00,afd52aa5dec5ad8b2dc5f73f252054fd811ecf07e78a822e633d07c288b5e390504db1912f0e24312f8702ece298dbe82c839377a76a180e1c46f23a1678968601 +feac3bd70db3f40d5850360f1a177e6ce8e4a3f0a4b2ed15c960df7ec668a81ee114ab36c159c3b944049ff42e4f9ad07dd277701465b5806321299f92c139eb5e230d1a2c50b7bf993c47591ddbff000aefa638e0f9081ccdaad612bba8281d706cf6a6e9c218fae31a0209fc1a09ad6a6070605eab9d291d23ce787cf4c5fc49dde368e61249511a720a6cd5793fccabe11a4539d7b698dd2a586f907fabd33a1496ab8efbb4a454ebdd922e4c8f2eb7942e245fd991c1f2f1cbbdba877aa8af723ce5cae35f56c9ebab47f58874b9ccc1d433aa9995533c6e1a3e31e56d86672e9d0cdd5e936f843dc30e3deab562be743924dcb7834943b01b2dad6bd2937eebe711dc0f9a0e4599a60c7e7d9e16ba7ecfaacb22e827f042ce94ca50f476dffc,de1d606e1eeb9ac6def7f2303434ee67c4e50ffffd4dfd23f8c7807bb90fb49b,3c74697167db12c446912983c12594851199c0816a4010add456442298bead46053f47a85ed4df617a88245461f560c2c0c7080fc58dd54236d40651cbe94d9201,1fff3a087cc2701869b75c03535424ca8de6bdddf5b6105145caee7b214cb8b74961f405a03dd35090ad11a2f143d4eca7f413f7970db52bdd184295f2b1b24700,49a5d0f7040e99525370950715eb380e6980dbd20bffbf1e882c54de82c4906875c992f72b3afcaad9932c14ce2ce51781833156e4b404b238842805d3ce318a01,4684d2bbe61dbdc6d4811b93de34322d801e70afb68967167237c0e8820aa3fc208e9606bbcf5c1d3d943a7550748d25b525f18a423300ecd216f74626ff2d1c00,deaa9c7b064a24e0f0e3dfb7c433f8ac5cbd40b14a66ce96a9bebc2fd83d327516d0509bab645a39e7b3ce9fdf233ba61aecb6670e3519c3d58c966478053fac01 +3ba162a4cf122ec4fba95302c1b019057f3360fad603887f85df1bf170e224d0f5c33e9b56b5dd153f674b479e06bee63e14052371e00677539669fb0410d1e9b66e852c2ac8098b6523a6a47e6a2dba1c1d12c4abfea6bcb94fb29af0fff7c8d54eabf42ca60a3c5e5a9e64dc681b316d3fad6b0e81ab0fc9ec6c968867dda328ed92116ae31752f5fb864ba65a22a23ba8fb08140063eabed808f1fd53206b1d56b186cd31d868f77b377c47ac3ae69c10b0832e025226ef3586d4d59fd58ec406fcc23211283722f7a945d9c3f31a61340b5115a6332d159f209778c46d3d360a57fb693b332e314c2d4ae9767a0b0ee886f33fee20a2a332d72fa6aee79bb4006e70663b89cf531ebe07a8b4634322f31b00153b7266550555569ea32d350a17,2558cd77d15dbf5b18e9ec76eb532ab57d369f184678857758cf6be4d0d704e1,7e33cc8d4b5164622f4456d4d3cc42ff141f2f9ea4de94785cdd7e7e5481fe423eb551b2a1f4b127ef446e69778c6c13b452e178994b89005510efef4895258a00,0d6405ed1c6d1d1bfe7147c59382f63d24406f4685ca964491c06da261e065ad63704610ab8de18f2847a61e0de87753b99af52916a0841c3b04c5dc1e5236a900,fecfc452061fae793d775dd62422a123b2df33c88d80e66e9a75e1271086f5c10545151bfc34cde9ad0127ca9d876e15167ca5de3bfc16fa101a9584be15a8c401,8581c2ba4c819264606a263db573aff92f044a49f84ac7cbfae07e8d65c5ec806610518ddf963ec1e880f3daec578b22a54efe64a141742fa8c7a4bf65efb19a00,a9303d5ae7e9968e2d03945cdf5607449c13ae813a5a10a642834e018da7342249d1707e14880d83020423d70621b6f39ee7ba26aefe9361487b257c374bd9a400 +aa6515ea808c295d84a2714330bf8284ffb4e2a73f3f436ba964c655477f3b12624593603e57e7d2f03041955f14a60fae505d56e3550dd6f23e285055de42a57b5d098862f8d49123c591e7d5748be3ab00b3ef4d9f59097a2cc2df905caba1c79da9b30141675acd2f2811cbf82cf1bde89679648794ec71d38edc4f4bbb4f2b3f1055b4b894497babb293e9be3f992a97d03fd8b04cf88e5a335570bd68652b9180ffc35dd5bd8852ad2acef8894cd0dedf0367275ccd0e499efbd936afc29fbecb15abf3a94db3caf137bd83056f7054d4b96c4c035910e0f0480107cfade87e98c687f4eb4ddd48d5c5c008f7513cfa7b66e5744476cc2f67c0e9f5d46b1e165d55055b4a5d1efa07cdb5a3085bb59d40eb9870eccf4959131bbdaf4fc1059a,4c769ea28904b3c1e4daa9679fe0af5f731890b34861629fec74480346ef2df5,23e1e573993e19436325aa3eed9386962b200fb6e5b0722898bce50eac70a0a32a903eee526d4bde041791cf36e25955abc99199dad86b5c9857d0674938bb9401,6dc01356dda80c2bf0fb585403a0144b8795a73e8e069025bd48a2c09d905dcf541f6ad65e2bd842f37ed767c7e3e55aa6b83bd1a6b7043de9071686203c46e200,68b40bd96a81c9a2b132e38b5a87c58e7ecb5e879ec437837d91d6a2e2c07991120f2eb9e9c04afd3c882e246237bb4f98a0e68232055fff68199d6c9468935f00,1e1f18cddadda26976a199b1d03cacfdb42e1a5c86129ec8632e638348129df43f443de0cdc907d94edf8a3f3a87450739009f4c1c71aa68ae6de14b6743867f00,438ce121f9ac58364054b2cde726475761ae88d8d6f982178fd6343cd95392ae19cefd2b45d1c1bf8bb06b82bc9a57255b420deff72b26354978ad74566a459800 +3c7840640204c4102caf81a69ff68ea8d0dc1c07074de6d398db5aa6351ef513c9cdf07306db36a4388f8cd01583da5e8c89491151906c48af507a6c8d2f87aa7bbf395e85e5d3bc97924ceca73e067e54f16ace08198102bf72a7cef85edd312bf28e22fbfb2aab42f37ab99339fbf97442f87c7fe3753fd1dae34830c88b85dcf0fa270b0fa3772495ddcbf7da9c6044ae6b3084d6be9a907445365ca578a53aef22111927794328a69713311f4a91edea4e2827ed5597765bbbe75324eb7dd0ffeaab651960627e3688f5f4bb6e2d68a99da8e0f4228ed604455029e7aa3cd26fb7f2a337c7f3c37da6b6150b4f157664a2994072ccd52f1ee866cb562682a735f727643499b034636b57b3082a88d2ab363219a12d58e0d149cdb514b93228ed,cbee4e0e8aeafcad958913e58fc924e9457c3e3dc4981f6e49837c546377cac3,c80377510aab5e606807ecb3eaab0d9984b52d17c2b87df95f805cc9f9a687596007978c15a9947c8a5873429ad0a980dd46a73d0fca0b8a75e09a52327915e001,f6a4a84815fa21c7a74b8d6095e9738fcd65729af8de71b91060240b6f67163164d640147e153f76001bab87a9494e6dea4c2ffb0d83f52bf84e4f5ff0cd53d600,2fdb527172a918f526657c24f88291013f843bf957e5f1a583d94284314630000f2344bd767ade1aa99e9c1ffc844becb10f53426ab71a40eb54be9d2de9dd2801,c1503edb70d5c08c0ecd42b9fc734f23cc4bfeb34ddc98d3af5b65cdbf5340737095b67c6d5730ed38bf6099ae89689af9fd12c0a159ff70e27e97d2016597f000,dbf10af95ce4d4c7db5e099cda38968a1b238f108970daebad803076d583f9dc7fc43a486f75065cc0443d3fb535f02be4a7443e57dca63be51819ecc410d7cf00 +bd543157180761d60fafeddee2d3d1662c6814b7dc116bea5faefc4863ece1f0bf61f8c70808b5ac52bb4a8c2ec69869dbfe5a0635fec1e19ae5e9e85cbb3ef419b46ee989acf13c201a9b4248f7ba9016d47c6bf8d3c7f4e8cf73f093551e415e2d5c6e2ac45a78ef38da3fc8589741d929b8946527b8c764ee1865dc0b3df395424ed0b9564dff2758e0c3746afbf5cb0a415764ad8efa3e66a2a9ffd7c65e3674e8d60e7819f67508d310089a6527c6bff17a61f783a87a836fb01b5818d23880a505785b5f0c4c7360224bb03f6a9496d7c6a34b01677b060e091c423ea9bd00a5d4c264742e6fbcfb83556b7cd527eaa9682a1abdf2a684797cf4085b8eed7635e135c4cefbafdf342f6b2a169479a3c90583ca03c274faf51af3f2c5e1167ca6,c1aeacce6547f286859f91490fd06027b9592004586c1776c2889d04e9113c7d,c6f1a7ed3d1817360d817a63a742031f6638b624c973de2f61cbefb2af2867e837ad7090d7200e6dae8b794ce011ed0aaa678c65e075bfd8de9b5c4102d4cf3600,f1d9b67286d0b7529770da3569d1a432649dfcc058dc1c7cd8faa26714984d5e466179a039198f4e0d129b33cfcd9c7facc95c700939d2e4c2ab6c5e1f8ed3f500,73b285b601d416204ce110d5dd33fb1d3a84a2760dd733677038a28cb778256e224a58fe1d2aaa64127ba554b2e8537b7fc8e74e881ec6214f529021baf44f8501,2967be79166da93318823a4b448bfd7d9e7f6672580e338e5435eebd341c6e780fc12044e2ff1c129f12e8b5780a7e9428ea1a2ec3e1311f4eca107461ccb5dc01,6a3f2d23c98f48cc7b67574faca79f2ced5363c1c7c3290a2240f0ae26a3ada258f2f41233ee1bd29cc195dc51a247f9846d27d5e94911b372229e775b4921cf00 +3bd5d162616a9669548d6c10f910b371c55af693c371635038ed64dc1bd3481cdb43ae25baf7cd7537641dcc09a02db2f03de5d01c9ca4177fec62960e02a195e0d6d7c36ee3a7a9e4f8ff2d4832afbabbe1c2eb77df9e3202a4e12384b80fb20555c7f4c6dfe4cf7f57160b4b62532cae94859d5c004d98a86982f931679614b9d5340f8fe9707ef2baa9aca343e54d82693ebcce6cad6956989a162d3d2299aef98e350248a47c6cd45ef7fa45b1580d48452dce32bc6e07b482a9924cd8b39fa2875a37f15a17c5707d608b86f810009572b5f825fee569355aa2daedd2a98e90f034da40c9b5562ba84128a53562dee6822223914c52000a0662577293c62b4068ff1cda3e2f792188f195461331a674a589cd976e048c683fb193adb49c05513e,4317e0f92002d90f47238954067f334cf209373478130b340c2b833feb703397,8b561977de8643f2f619717baeadb163928122edc7efdaacf8940dace0c931c12198431a09b7e7590839f2d6e038c2b0253d5c655d229b6172b2cacbcf915fdc00,734a2191a6152004e7f0e1dc30e47717f86669d41313b80e336f8399d1ce027415d83f9ce66205f99b53c5eba92b15774b45e8d23eafcbd65f25ca2f9a0024e600,fe121df973f972a98c58409b7f53bd7f7547f3839b4c37e593fadcbef91823c46680b34c3915d9464dff84c8324f38fce96aba3ec2cc5e8a7cf05602927b8edd00,d26fb5131d8a2c360ace263aa0f83f16a42147b9409ff2d49ecee53e5bcf56b17f7743b71535a29c5e589bf7ebace391f6d10045bd4abeef101ae68c5b5615b500,16906eff431fc245e779395471567b9ae678740462e2accf04e82c467b8e299b3961bd9751ae50e632cab9df8a28708e555006ad3e82a655ec447d0d2ef14d2101 +3c29e17b3060217576405808f0fcbbd57b43181992a74940b8856901c7a713159a0ad4df2016874330e3900a2b9074a78b58f91fd0dc320a189d700a67d086074a79d6517f9f9f57f0d2d8bccab80b09203684bcaa5dbedc6f15e6c823e20ded26acf716c1736fb5128a8bc162099b2183b3b05128d1afd95f1d09f4f139ddd508c08597aa28fa9eec60936226ac470b630a6e0818939992c0db29ce61ab7be89e86c2591974ec33dcc1f8cf8966431ebcef01165f0eda61f5816a837ec5e51de1d3d57ddb5f2bf518e51f77b0f24139cf8541af4d7edba51fc641e1ecb71861946367aa23a7b2b7f616133a9f88ac45e30b2f0a6cb712fc0f0f1161a977823f52df06ab9e278525dd8e80d10862eaa534df948d1a18c3ca0d5f618f944e2895db7c49,264c44651f6c1472d443c8fb8060a3f5647d18f65bf26aa8186b1833559ac424,b84460f7271ea34c5629a191591e2ef93f0ba4ccf0b7cb8ef0f5802db39e85c078f36efbade6c9826baa88506f448b66e84c2ca5c9856a58d8895d4d1ef33e7c00,8e21792002518d9aa64751ea253796475fb78979eab64dff353a8a15a5731dee306f7a83efa6a87942cc9bb75faadb85e0ee442d68b9c1595ac3c385061e365f01,6cf6a1eea6ad2a5277ce68263716e1952a74cd006f0308eacc2de7b74645afb938360e81b98b23634d9726099d87fc55b11e2f24fa9ceb29cc67747a7913ee9101,bc35b62bf2d306e1dfd78589d0accd0dc0aaedb4a5c237a13c4b96ed8e9b70443c41d876a0620d06b235b3b4315deb6dac9d1e560aefa27694940884510e18f901,688464643916d5d1793d24f08c7555ef02ec441dccbc8b8fa36f21ddb3fd17727b6e65a6de7b0b80512d92129d12cd040fb4092f329b630768f4be1f4f6083e201 +23b3721729c7e458d463127252f37eb7534015661493270d7db8e093a602fa8a0276f39eaa0cfa8ff77f6c9532f80536529e817950663c25fcc731b5cbce01e4993840cc131c596c235474687e3af0f73db00ef21c2d4126054b63302b831e69507b82e554c8027d24b76a8ec6e3d3442f066dc2b2224947141ad05770152b22a7cfbb1ef00d46f1c4de5291fb39f56a7f629e31fea2ed8f071954187a789f787088d1dbf2985de784304ba6f60ef524f7c327ef805020f9315469548850284b837928dc30a4960367e1c6fd64359cee2e84147f51edd23b5e16c5a4b65cdf50b688b5aa2fd4767edf9d13317fa88b55bd38546474f0abed8474d6e93b4dc7ff319b02703003aa6b6931808888957e3a24f2ff18513b29e2252179005eb3c0a1bd659f,67540021d6a4d2382675bea29356dea93f0b58950fc01f52e8056e7e6f3f6645,3ff6835f34bbb953144fdff829ebdc99365ad65838b4d2412396f8a366b968c1696b8681f244a8e3756bd2acb2075d37398daa48e02f38aa47ff376f69f08d5a00,095587d6f024e8478b6bf64c789a913e55687533c041c79a1d8cce4e42dd218830a6d979340c0efa4a38b593d1f572ea64bf304874900f2c8368a677e6005c8d00,87d7f73fae750c39ab1ece2f56108133ec0cf69864f5dcd2e959ee27d464a7f57aa1ebafc251e535d56cc8b873e9ccc25b7c93b9ef6ad114302941ca8ae5dc8001,0b788fcf52183a504bb59f86d0454724a23a9cb84d01361f792d16a470ce653a265b32edf771b511a8d5517413842b01cb63ccb7f728ef9871606f1bf6bfb41d01,a145beffa8f98dcd6c118eae0603d41321a155e686577cc30625ccfd6e9dc3877007e417659e8c2965f2f3cac3eec0fff67e60a5e640af3af49d8c7572324a7e00 +cbb2b75a1464c0ab523f8337c939b01a75816051d7494d0cfc6b28ef0bf0ca7e86a5a27fa003e49b430d6729a8163e5aa9bf1408f26819f6075c015bb58a7eb12603b700728e7989137a6002e2de615c0c3c650556649b1def3cbfc977f704d07f17eca7feb025f8173b0f00b0d583dd359d5a69a668245e0016ca36a183804899f88910ff7d3d96c5cfcab61fcd332152a30748746344be8fecccb00684207e8ca60c82dcbe31583cbb94f57fc9fbb944610843dedb03ce19fd55894348ed84171ffffb38e6a021519eea3ad9d2f776654146ef787f18c882d9325b1b331b600ea00e892aece99e562931ba02209505db21813229433ab175e820f5f91c69973d54197bb14217250ac00eb92772e0799677ae6b39de873659c72e40be605ab8d1a676,da5788076975686b1db5433c12f58ed68b81fbcbf4ea3d7164d57f39349c430a,a1d9b8a9be363c7d77f5db06cac7ede7647466a82bcc593e8c8e3b13ceaf62d3245622bcfaca5d6003747642a4133c24d6e29d1f706aecbfa0e4dd182ca97df200,a40114b1642755088be8e21f7d0756edde10cc7a3f6b26f3c51da5aef89f16315742db004c663ca46f7d39e9c80260e189ee3ac89a06e7ad313db98168f2805600,38361cd9d30f5d8f99d2806cce6d0d1fd149243d65903399ca1f3cd05acf7fa50e28ef6a78c600d1c8130c17481f1d459073224e42ef6b3fa732bb6557348dcc01,6e4209ec717af0b6b5e2af150a3404e371ff68b1cf88a1ea7270003fa4bd980c5c4af85c1c63e41ab1f4e183c928afd71624259407506655be7a5b168bac9b1301,e532508965a0ece1d92e5a1489e8ce521e47be47fe1508c7cc7a59d374be2c355e0de496c6b4c70656d04a10cc15d00c90c7ed45bb11d600e3d81ef023e9a8ac00 +5bdd914660fe5d531371a8170a893ff3eac85ee9d49eea22ca2c85a764ca161df3e8c5b59d6c5efad5d8bc49ed7a04d3cd62633d3f998d7bbe7121cac6a69b25ce91034fe6a5bc9ff0fe269d13fc52e77f63329d91f76c20a1e5770354889d068127288118242b1a5d5a9bc67a06e1bfff04fc3c706de8d93dbfe6cc499b748120924fffee53d0cc66a209424fe3b5f6d99fa076f8fd61c4769cb22e9cff99a8b406326b650cd78968213f6e5bc9799dd608fef17c74bbeebf4c595d6cb20d9c84db090a187d0df7236c523a3952934790e6393c882f6e752d07bf82808b1387a1c8869fb16269b59817e47ddde39c95e17c83e4bb4cec0a5a1ed8e465af8b27e758ef54bacd3fd3575743d97cff32d75b650f5724ec54b2053026ed26573175af26b2,ffe8f7d841b13ec45faa92bad62b2e995865582c825d5c44378cdbc141ccec5f,86ed4eadd2c5186f50a87793dd2919ccaf81d55d2a3f018c9786a78eef20ed2f1b4d3f3b39d08885ecf26f77c82b1f1b1e19e46205f139afa1c0b0057514e91f01,b7bd4bd26300aae9a72886e82c1bfc6f908ff0777fd3bad8dab891f458444bf43e4b82e9add066316b092da0eec5f8541ed0075dd6ff17fdcb95f0bb41bc7e5601,da82bef85dbf189ab74c118a1e07e74f6b37dfc5db634477622b967b27e1896a66d6fec2a957ecfbcac39ebdb94fde8908532c35893334bc389dc2c8d14f0fff00,e87f49997afc9b41cdcc389a5a27738999b6be6aad196ed677daf6d8cb52631546ec831d19e15e3c7dad6135e8ac983303629b91e8b46a43e3ae8b7f6d8ded9c00,29ac49fc9ce94f4fa161b1574402fc5fcb2e0f18df7227c858c69eb6bb0d0e595415ce8a0fd6fb74e95af179facef4a302fc058768039799e72eec8853cc6d7801 +23202b94ad44973d44f5f7399855997bbf1dc4e1119435ebcd70fc2281ccbf2b5aa17899b55b44bd2e723aff4b1cd8a6dcbf5527c9a5c63cb043fd1b8687cefe283a3d1f0a00dfb53b1fcf6dbda9e4b92477d367d62f6d95e7a62583d648cbc28ec649e37edda571946f7da29329dda14ae3663ba5626c7276b1104be1b73d85afff43899aa082d5b828118daaaf731494c5486eeae0baba770b7cb81b6684bff54a5183815bf1ca1c0a084740ee054eba1dd8a897c9b0cb6b4f7fa8acb585edd90da6d426292677d0fffe8f6ef328d43834652c9afd9e5c6f030225e23995d1f2ed42bf294053b760ad37db187b001e3d7ad2e162d6b2fbf44cf39bda5f53ace3e7885a75b6506c4e3027eca2db960ab9c3597b80d2ef69055d316b01263881484416,c566704aa4991cbca5409ba14493e338152d7a18312db6ea35d13cdb9b76981c,7299655917282cb16e08e5afc94bde5cd189bf9e0a60026b444447c65383ed133389cc72b98e0a04ea65e3752c9b298140a52396cd8e7d8b4e5c5a3acfeb37c901,d966662674da5f8bd93b60e62d344a1e71f473ab82f6155432c1ce03aaf29823637bdd3eca939c48998d4199a87e411d11c6a622fa4849b699b8a0ade76df73d01,750372ff848504a21cc7d95fe95569f9ad357bbef1b9ba0da5fa8ed5b2bf4ea6714a85c68305dd4ccb3c097030bf32dfec11443fe1f5a3f1511637b4ed6c553000,c001479de0d92914138a9f80fbbb235e6efa222099697dd0884e0c3feab07fbb1dd930295afec55965ca37168f6968e116133ac2f5e3fbe59aa661ae65ad11cf00,ad17fbe20675f6b7bbe04ae9c25f64c881ac78f1fa987de342a348d7be443c2f5b2700962b193dc30882187d4b89c1d82b37df04a5f02b8ad09eaf1e9bdf3db501 +ad5c80fadf8ceedeab0ce1c4003a308a93bc58bf3213f1b5925f5a235250a3224df29d6dbff4a9e124e3c9a4e4f7d03637b88ddb0440404cb0e4987e18bbe9a61fb41601eaf58d1ac64330de56023c2f5157218ee7b9f2fff76c18ddd6e6bea3d2bba348292f1c91ffdff3b5878f85737d6a7a72530bb27724b75827c5f25407457b26db205aae8f6c5472db676488dbe0f933e26d82768773c55981dcd013f9639a5b790da93128337a2f1eee3505aa5892edd01e0e8917b540642317f2b0574f5c9d5912d9de910a14ced42c09ecb86fc751caced2e927c8bc7ebbb66a7992ca3ffe862e91fa209d85eb4d9fee8b3aa5e71d0618f104ec1a210a734975afc5bcfb1f2d551b8a216aaeed625c4d239e9b6f0fa30fa26611bbcdc2c27eacddae1dde40,60330f72f571d71b6002f11ffd9c0e7753af5380805484199954c4e978dc5fb1,e1aca47ea30286dc0204ef384ae75ef4485186cf465a346518b148f6054a5b9b4cd2f6079554ac2629b94bcb86b77e6553f5b8009c937ae0d696fb75a7a2aa5700,332c67bdb4ccdc9b4a57ff20dddaf98b3d94bc1ac965c57ccbbf6b8a70859b1f5e9c07e9b78fe906a4874c48710395b97e4b9b196fd24227066bce5d2a968b7000,3c861315f0cf976f9e7aee1ec3e06f3fb720efba2615f369cfc1db4a3af5819023bab9d80a2c41d9d56991ebf6f27da9bf7513c8f0b363e7d1ff2461c5a20bea00,d81374b51d24716db8633bee850dbd62537b104ecc290bf06fadf8fe667efa166b2a18c8e58e77282ccf61b084c89473edfcfd474539dd89d5f0fbd5236aadef01,e03c19e01aba84512ca0216e306f11c3a1dce87b0d8c8b26d183f477f247a37b1ee93bf52237b0adcbda7461529c0ea85f7f3bf7fe2ce255eef447e46133154e01 +0f6993f27caf80e34cfecc2b4e274db2793e1552bd7900145095a60fb15003d47dc263bc107dc07896566a11d53ccfa3cdb2aacdca69331e4b514d9fe9c575b0d5e19142ff4cd748654092d50c8e5729f08f11e7e4b8001a3e0d3bdccc5ab3f60b9ffd1bf23dc195919ec67f056d2c8e1c741ffbeef823ac673ec536b98da10e9a8ed9e84157f442d472d9d95d6088e5bd471404893b6d992003c187958b948cfd076bebf31c236e6699f3044f67b90413cb9cbadb01a4e2c701ce32371f3cdd488ed1ee4664511a7f8b2047fe51e8a1d7ae1f42b5ee101ba30cb5eb8bd11204e22440aae324c61017b2fc90fc225732cb200fd556bb0c887e34a769f04b4e6b5c2fc742a5ab181fa4e9ceafd57f946862e66b912166d037eee30b4dee5528e3911715,b2e0d2331e9ec9bd1480dae48628458948b2c79134a2e0b67d54e5239bce4111,56f32b2903026f7cfbe755e4613a16597185afa53323ab01671d05f633396f5d741442b41584c4e2003c48edabb34ee46bc81171e43e272999bf019362f8bbc901,8c19b75bab9bf54e526f530699438135b5cd3e37bb7aea3422c22c47acb1e1891897d0b652dd7ab0adc295884fa14156498b659dd472f598b64bf54a7b1b1c1501,a0ae5dcc274e45081fd2ab61c7a31c7196f74053b0d16ca02c8b62d1e6729ca96dc2cc915f994b8024bd02f39234c57aabcbfd8e4aacfcc3ae83680b8854186b01,289f602a8d949ca306b430e61502026acb0434c0bb64234b31feda225a9316673259ffe3c333dab52a35e02e925c0c903544ea2ff2ea4cd21c484300bd45d43e01,5c2be0785b6398b9bdb68ed6761314378a9487572a2a58e4bb0326e8d15639b6011dbd5a47c67761a9ac0b16fa8b0eb214cd88eee4edb97c4c4eb5fdfc9fe8e400 +d0f4bb8ccedb8ef7b670e5400fe8016997cb77f63b34c62444a826ba66bb6c4716d83081cfaa0ea24cb10617b63a6fb8ffa5f16530af1ceebab9df8d03e28f86c0f836e1c434b7fcada690173eacb387ee4b04c65cc48ec1ec71b6b802fb087064f1ab486c7ea9ca63fad8a851ae30a4d1bca447ec45fb72603083e0f69491f47e7e8eb6ffe51de67b5fcdd89cecb1c46b98a13f7f44a33e9816ed3ede789ecf8eac5eae5c8cedc4c5d6a5e662d0bcb85063bc18d39e760c8ccb40612d686f2668c7a8a3a5769abc12aaa815bf0bd3160439b7ae595dc33758902c5a1837580ec30a5bb5351baa2841192216c6b2f69883d2853a78d7ce4e1a258b5b3ff3087bf13fc3aaf2e6c9c87b8f48399052aebb4977aefe485b11105b5426c8d04145c1248e6d,f9d58a3ee02730af3f47ec7337896be2a8e6082a2e07e4c6937a473fbafefcd2,2d68f8888e68395bd54bb48035cb51c75789ca8aed591070fac402dd67c307da482345cf75d75561183b53a80e12d90dfbf169f94c0be015a440ab68e7a9af5800,74bad00c67c6d9607bf42f4fa9500c262c8a0be314eaa9daa450a6f959c9113f04cc663fa96c7bf04465f4dbe064c89c4aa56eef9014cf05b5a4247c0c468c2c00,dce6aa25e550c0bdbe7f0615a068850e276f30b93f32d6bad61f3214fa99f63c2687a0aec6d1fee6079b2e88b677a0c900469d4dc8104f12cf867e7abc1ae8de01,675f7c9fb1d5b9ae047a2631f28116922daed62d1b4b43b736762a137ab6eca357fb7b367d2d5b8f179d748c784a2b013405b8d5a863034ba1c33cd9e3d3e2eb00,7a7c1517f9f643bcb37f652b2d81c75e7cf9db6862323e3911426d8c8257cbfe185122b4178a5ed2e432b50e14a30e08f48c809ca6984c790de1f13c6daff05700 +6f725921309f3a002d4862784d355e0a561de9d26195dde01d0030a5ca571d254231ac9b55c7cf8ecfa59ee279205d98f973ec2172355a1f4dab1ca1343bdbfff5d2390287298dc348f8577316bce7bdf7a6475b3507c121acc3f8b54ebda7e4bbbda521b5fc1e242d10f3395a441ae3089c7dba3e14d7ff2b0e001edeb7aad76bf7b9aad47164c890493f89217f11fb773b73211b89f91007c0d62eccee9ca3950947aedb80409c5620a59a2c486fb379420486397c124f8a28f437bcc940c6a43efd6894fe79d740e25d46b446738ed29b0051f567ac462f75967dadb9550c679eb65b0b37a086ac737fda9edd1bc0404aad7543e8653418de65118591c1ddb04183e7f7ab255961907ea49b1129ae700e270a6756819bde3fe711396b8e7e572e7fba,c69b5ec33e338025f1b78175266c90310b07c1e566693226a7a8cc10c2f5114c,926ca112c71866acaece24feaa2880b273886d2a307b0bb6cb99c9c9752013913cdcbcc1e1aa1729edbe205b7d839b78b63d10c75b2fb0a6dc212eb399336cec01,d03169d1a46cb43c9cb7f48af75132a3ab6c8d7a5b77d31f260eb62a1a849c221b56cfd397838f782e69561eee5c9875d51946e9ae6f44e02009c00b6a47834000,d8fb0296cf9bdf845a0a5c0e0b446792a48eb057b5607593ae0623831d0158077d5484ad3ee7005c26dea955855c2a26548f0d67ab0f9dea5d8362a114de177500,c9e8fbce72a557672c947a83fd22ab74c1ce31f3016a52dc54abdc505b086eca0ec7f15939fda9455c4c5e6a7d5ac00fdf0ce71db71df544f3222d8cef7a460a01,a27bb6a5e981e25e77e22821aff2f6226993971ce0dbbecfaee212f4a2855c7010347a29b61f70667588c99c3400fcfc9b192c337c47b304069dd9f70440f15601 +642d3a27a5a9439955ab018e035bea1c3239efe54bd42a5bcc645e04cb2e664756777bdba68dcd3a2e8fb567571022fe57f0cf2f683dc1c5e5ce2be3a932284568125732f050f3ed3610e8ca5194b9760b8d5037d7de6f38743778eec10fe5ef7d1bfffb9625b484ef6b4967216335d3960286c48fa69de14314c1f6db4d7af960fdfac03ac868ef3910da85478476045c9f56f4ef81d5004777081d562742b95add9a4c64e5017fb29a3842a2e09323f97f166df1f6d19bb26b6fc46752bfece642d039186bb943953b60dbf06aae41bbfd0405ce1b38e769fb512de2528fa1b5b4053838e0d6f13ea68b730a60b3d1eec213245ee65e4f963058cc1620c3621dcb775023fca3df0a9920e7ded69f060bd275fd902a5ab4844726b487bd88d5798b55a5,ac4c3cc9369ca00ea053eef4368f02269a833d233543d150fabcf60275fd92f7,833da4bdfce22326dc46b7eae568c394e0b8b7b516c92db675c90dba9b43998d2119ca7e5de55a488fba45c5bae8a5baad5fbf54d6abd33fdace41cab1ca515201,cc13f91a25fc2e69312be33623335ef3fc1df00d718f279b9203490f7fb51ac920245d5d5d192ac6b047542a597eef6fdf4bc9da514b9a3edb34d3f38b241e0401,182669aa39f970e968eb919be5474f1b430540ae1ff9097f9ec0e3c849caedb73ec24d83774726822e2b724c3ea6587b0b29bbe4abe1e7fd40ac89e0055e301301,f02d204b39c4dc9e6259109a1758b554d0c309bb2fa6fdd4d93a32a521efc4b6717be1ea4f65c6d63e143e4c858979efc480f8421e547193bc8ec78a55ebcc4b01,7cd1c7841c4839258f6304caa080f252d53c36fc0d259e2e7d6dc92c2d5af1fd71f0707be16b45316f625dc8f0e2e0993536a759eca5b7be01536cf0dd83724200 +f5541b6b4509bcf67ffb703ecac13ed624f902f2318f279e237e180fa0c6f9b3386f7e4cff202445e703a821aa066cd748b00da7f4468f32c91607a3702f776c9ddddafbbae56b26857877879ee9faf091b092129fac3d1ef405080f5c818277ac0e44daaecf978d674410b15c93b5bb441e87904ec1abd08ba7710bb0da5ead965901e1084c83ca1c76d83993b728659e5a4ab98aaebff69f2e040807713ac2592e13a9721c1339a18102c626a619898fb053062d97fe584e2ee303d49b257bcfc027685330b41b2d2413fe7575993696aa67f1762f68e9d2d482ea55efee25ec5dd8afe1b9d6dcf0756f3d50a4161bd9e896f930b2df1720d07af0a8028e72b8b6f4fcfc03cb5726918c3647dd891d05204db642846547943770af16c4b03b70d05790,cb79a94245e9130d94ba15382982779075149abc68b3dbf054b34a603fe93ddc,04f50e86922a0d6e938c343f0d091bfb5c75e3ec329f7bd44a9c2ae147ead4e4505973b1041b788d7131970a75dfecec17b8559e4a38c697b17b1d3b0dcb718801,ae274948f57f235dc87419acc531480d8e078df30f17a06f7ca50f3f84295b4e14e3d59ee826e3f3f686b9e40b4820c5696c9db5af50643f2450c9b2bf2e49f901,ceded202d9e25d26a1c2371dba466395f16e5732557ff27fdf7a3a5f7e02856a63fadc6a348a9cf7b979e45a5e15f55222750231cf8c504c820df249280362f001,d5b5c721b515ae063a0fde91e8052d64f2df3c9db8fe242ed646e469413e4bdd05ff1b39ffaa1f2d0bb4dddc93def97d0d0e0406a41d4f6dbd8b6ee2c2effa6800,f1aab652a60719921aea578f282eb6ec2ae7f70c0c779cbcf5644577fe0178521e42b959d93577a0d24288ed9320b86092d04e90f5d69294e491f77b6ceae82801 +488e5eff6532ce971d85d7c84502eaa560886cc3e40434eab313e6b108fe829640067a5e26f127dce5665bd8caddf06b427704ca7eab46482fce50301f93b91e6b84e0558543dcf06fac412d3ead61e90eb8d49dd1250a579d86efcd89aa46d1607c241dac882c7a061d6b5aa8d3545272b7c11342ace6f8f14020fdcd2b4a42b29884682afd8fd6e129c99dbcab58bfed6de10d2acd4df018aa31d7bfc1b5102c9c7c5742a95872ab3b9665a759d816301a1f705b733b8e6f4db5375a905c92fb73929cdbc3b53c3d43f60d3d359f2e07c15e40be0a9975eaa67e8f7afc23a8850e3a102aff299e82a74bab6e87e6a43624bc8988d8115c523bf1fe16346ecc4f03bcc42f171edc52c74a316a94d61be545107803f4c1813cf05aa1a7d32bea7b194019,d444e53c947c00d048724bef0f24cdea2b9157c1ea2ef09e8846106e1eaa5ae0,323d63ca4756b651f6a3dfd4f2b4b692f6059fef7ef25087df9b1620d9ad1b3a44031559048ad90bafcdd325586088596be4da6831085f12f9dc130d2b6fad2201,34728a75505195984e8e3f8e6dc8ec9057eb2784df7ab38bf535de4984cffac11d3b1849eadff2f76488fd13408162f8771d5dd31c0624ffb499feff8d9af8a100,7f5a4cf1cfdd4355325f868fae66239b7e2e57a06f1a3b944e7ef880e8ac5c1234a27dc9e0ae545d4b890e00293b8d1c79de7c76fb6c065f584e22af85fb4bf100,b17984f391fc409860c19079876b090f70d7b86ce4d1a6a82fe298ffca36ffb453ca381a4eed8370546c8326a7241a60202eb550ef3863e3fe14489c5bb5b27a01,dc097d86b3140a4f12c2735006c6006f80c101491b74895b9160f8b868e39dfe19ebb944e4ce0eacc87a67c58670b2e41145ee7d856fe08a15d2c6dec15809fe01 +725126587a6006696ea8252fbc46a076e0175d0b9d6de32798dba611e0ad3f3fe232fa7055cdd2a26f4d43528be5e8edf310b9b930b1b78ce8f19eeb5b861024caf411f78456a8e7b3eec695cd62351ccedd3f7dcbf3bef89b0af0f208da17f21f9c85d4816cd77c6e05e0b48770955170acffd016970a468d9a58f7fd5211ac409dcac2f8d480cbc50836a4c8a6c79dba7545b43909b5a442e2a6b171e72cff9073127025a89dc918bba67e7e4695307889102ce3205b72a8398f6d4d7fb111f1c427a2a4a43bf302252653c70c9010e5a7d73814f90deaf417f5a25540fd7b51e069287f99dbc20562697458cbe9ba1697813ee81be3fad933b33a223f820d9c6d707470e7dfa0e9d793eb5275fce627edbefef3027d963093ec15b86d6e6bdd31d467,37db3d4552e42fbb0eb2b8a8f34b209e9d27598c727aaeb0c521b6982531889f,0beb09c4108a3e6d35c343f8734a84c3101814184b11e2e8601bd35a48c21f1453ef7156c2ce8b17136ff1fbb64d955ba680397e3f65f5a79b67579b57c641db01,ea6968d8d53b956ba8fbca5d3a59285f248bd65d15aaed21833634f8da31ba547155183d34be3594ad46d82bb11540234ed626533903f3f157722fcb15a87ac101,814b52875ac6aa6a034c36c650a417111b7ce549a3ec78e48d89f5dc059892b879a2a62368173d44aa66344e8ad39f49015e729dd6a06ad15ef77601add4b75c00,0444bbb179c0beec4654f2e5fa7cf1281e57437dbc6d3c3b0d56d8c0398dfb1b2732f8ecada3197966cbe81230277ee94ef881f79ab5c13b11ef7254c6a2a63d00,ee4141903a3c858e79ecfab1fbfe3024bf4d0655fef0fe8c3fd4c977342da69a26c41b5ea1d0c5d89a435cd31bb58b169138dd859930670937fe0c2665f34a6f00 +bbebd0dc22f0abd271db2fa526ff6c0bb00211203d6ff889cb2d6bcef9bcf459652d40cd641006edefc58b1455e4f5b3f23adce649153fc11516a445fedb9447d0cf6bddb52552e70c21dcf56a8c4085c8e748d83f7c28993ed10ea273c3840a84d5dc5b439c8e3b01b4d07ab281771b1d6fdc62866b27689e3172ec492d303409e9ca20a5fca9596b5546b576c182ca6be5cbc37929c4fd7d73720cf5571b3e33142b1e50386042b81e4e6c97dbf372c5150fc71efca165874169950a08d76e6836a121f66b98833d979115842d049af9db40a552aa2b4154f960675da70b701d3a440dd6e49cc1b51c2980a7753787dac5fc054ad41e3a05df5c978694739ffad12384c41fe9bbb82d58792f545fa30719e2882edf4c8504afc0c0e55e517f8bca1a4c,d2c6b2d9f6d6c4e17962b21fd5a9a0e8cb227208c89c89220e99e48ebc04bea2,e50cfd8556269587019df65c0eb5d63edbf757ce2ec269e5a93491d5bf368abf679258ecfaa7b66541401b0173ee2d643645dfe5d6176ed258b6e1366636fb6100,1c0aa1021ec3db7f0eca8681e61fad53ade5a74dfb002a6a93bc6e691997363350a193aefa311713af83906c96b4dc7415f3540067d3ee14d71439e9dedb4c2a00,7834fab9fbe5679717c7872c65b5f268232cb1474e0e84774b124ef75a625afa5ade6d1bae0f3a366ee423974e7868d569d8c3d13276866a793fcfc36e3e7be300,0e06aa499b61c856a2efb5eeb16a4b408f8948cddb02d75de89679ccca9e9e3552ed4780028605d3f95ad8ca2bd472a9a18d7f91be136ea26431e850a00e614b01,87be66477fff14b799320d633f8d39e313bcaf2ad1690657a4efaaa9687d9f0d513799196e661e49276f4bc872313fc0c6943d49d64487622c25f5eaa3406a5e01 +723488821ecb3a8aac7d58cbbd99f435a9c01474f23ab6905b8bb396150d60acc04010230251d0fa8069a477ce55bc3852647015b51c9d5ebc43ec63e62abc01309e45a4b42727fe0e127f01836d04c541bd5d35498736182a605d89b24eab827a017f9a4e539de9205f8052905d57666810eedb22325d3d4643a020b776464cd9fdf40ed3872a93048eb244714d9f4f597e5bca74d92e534bcdd26a19ae48a2fb55119e2ab02c3de374506ac60fafb9e8c45c738b4988cc0e9058f38f74a37c74b85b7481acc870be0256216ed813fe19891dd9ab4c440a7fc4df694fc24126440dce49e867a2838de1486bc02ebda6e9cc893e12010a65b916305e18483a0624383f91dc4c3808962b3c46576bdb5ea0d8844385fc586f9e12dc6f3ee32d588e372c50,9a5e87f0d091d3b1d3ec2bb571a4595379c7d768d410386560937d810372c2a6,7b1d5c39ab320ccf3b65bf72c7d4180523d747abc1c73754157ee2845e1ac93c7074aa827b9b8ebf098248b2efa5c8560a880457b8cfb1d329bff0973bbee52600,d69cef80edbe7022d0a96cf4ff3842a59e93f5fbafcecafd49bc56c63344758e08422437eb0af9e48255a33f1182bbbde10395a146520cb795c7437176673a1c01,3bd8f75303075228e1985be79bfdc6809d2c127c8de9ee3282309bd0f6df1e2e37560ce65d76be96dba561ea837a771bec3e50cb08d6772d489625046060fa4601,61afea4a6aff6d1caf0c6d90bc81dea3b42e458fb8ccc0bdafb77a3d35c0196364325e2a8ac7e8b524fbc97451544d57ee94d29af4d18041e1e6feaa7055d1d200,63a288f0ca9c3a7abcaa2464aaeea9d7793933906e8c189ea2a723d1b0f090ed01d90dc925d9eb80018c38727734a109855c7269c0c5668c542e56862c88fc7800 +86d48d69684675a751085623f43c3791de6cc8ef6c9fc2ed770644a37ef72621ecdfaa0008edc6b5900da556f914bde87390413be46136c9d41a181e862154f11bd4defbe2290e83ebefa2dd6dbdac9596f775dd5e04afaffd777d072a54f50fc9ea2dfc4e4dc6825551663fc46a2188886a777720c094b9a946e0a3cf09fbd4ba6779e0c744b26a55493fd6adaf7335fdf7852fced3480d989b72b9aa65917df4e484c6e426d87fd462112dcbbbb2461e0aab7856ae624cd118ea7f7e4059cf65d6098f13413bbdd81b6fca7b55dd372139aee6f4d7aa15ec8bba8bb39d27347110cbc4fd6d0b2a611f4fd632fb2eddc63e5d266a0c911c257f5cf649ca6d36d04f3894b33e20c137aa19e4b1ea22d26b78a30aec4263d5df0a38580903c84bb182d939,f7d9bc0e91df1648f1ea928a174b8793fbc4ede65f754a52cd02edcf01ceb954,7427d25d5c8b3ed60734444a762cc42330ceb23115063a73d0d69d34e5ef54a2786436f8ed4a494c97ae5944fcc62957ad2be7f6adfeec53b053b38ac1424fe700,042a574c0caa60aac57062d22baece4bc1d42ed51dc026e098979502b97a03a61798f281684aae29b7f34dfb8237c6148218446bbf0f01910a34b45c4957cdcd01,a383478b2460361dff6f976b6899771c1c9116cae3eef1582589b6c1c2b012fe2b812c6ead68beda6365f54a7b7e0f3b272db6e90f9a0966145143064498472601,5067c74ae810cf852732df73b0bea19333c50772277345cacc97f4b57e457a0554e1f8d5a0d08cd2ebb650c2b3f322518b009417443504491a875027015cebef01,c8e667b46ed752b3f0ca9b5a41db733f5d38d8b0be51df09b5184e9c68e2163f48d6a364234fc71ea8a5b59c8998511ac3926c00a04a2be5ebf77acf2f1ecbb201 +6340a91acdeb26f4cedf493979ae054eceef0d756b029f22804e2c51ec14d2ef65a4f266a7d5198ab717a946170af04d7349982fa9ba3278eb3ed078ee1f30c06b49fe508b584443ee2347bccc24f2b2206f7fcdb09d3340a886e249da42fe7a4af9dd3c3c2765947751dd2efa759e4c21686e321c8b467c7347fa04c39592d436f177a3fe6df028fbe01899bd83038a53f66f671c88f22d39638ab7814202b65af2d439aedc5caeed50d1c534106576d1f08c7c87ac73e124f777543fc44e3f92614ad993737d9919b55055d52aba2e28f2dfc015d0c47c615ec1df555cd282d3297fdfffd5136be4ec2abf1f3f996e76097220f87e1561b312af6dc16a29850d56664982c5fdb20a400aa498aa01b0c4bd0eaf2629499bf2552c076ed521ea90184da4,bb9138108cc1f4dd15276f1720fb20bcc644efe54c7a424b52b6371f9eb175e8,fbe9099c117d7ac4cbbf36b66ca8feda24db4a0bc443d0d23981cdbc87537b8c3b5b33a126653c2a22b2c7dcb4306a7f1b858b2e9901ea2850836108e3d01ffa00,84c2d8cb7b46a300879999d77b5b30bcef2c46deb3a5c78f19720ef5efdef5355788e7302333bdbe007a707cee02897dc1ff36b59c5509ead4e88a32cc085f5200,ddb785dcd6a1f3339351893108a180a2f60a66e65d3239b578116ec21f5b38ba6be3265193e464dd3610a61598ef1f626915a207c7e4775013de5323e175273601,64f71907bd1e08fe8af6d16edcc5b5210dca437bed6cc8d473a8e17845f4cc726bfd50a9e4c0b11a22fb6a03d0beb3ef2c758ae8af0a766bfcd3f6506ef8a69f00,abd264c8fde28e0d7dd218216d566352b465da3b372b903eac70a385d554579e13860ead0167703159d8d1a969d6247664275e0139360d0dfd54c42d8c2e05fb00 +3c14bd21275d378e3300a83776131fd9d72f5173b68bec3e54ee63530994a45b366d308b5ce211e9b683790202b6c014e2b33e11ba83b4296918b72ada22b2ccb5fcbdc60e73f7c922e5a9ac11d9a35f12ac8dadbdb49c0ca331a1c73988f5eda6efb35927a716cbd207a22c2ad2d4fd0d2b12fec522bc5e8f2ac52b1ab4f03e2e784585476502063f5297ec7fc05eb3d8464031991daf640c1066b9fb18d2bafaf2e6e2768942a9f4fe511c1c2e47a6bf4297d67806ea8350e75d75de13c64120745fbc9a0fb18a21c3af03e29bcebcd2f6e743550af33738f55fd455ccfa43963ffcb3dd486c3b57c0083f21468f3b43e902f7fd4780e6fdccf30b6deedcaea4db2ff83ff07b9ea75eaa09c77cb102a146439239dc1e924ef8df555936c1a2d62ab665,6df123829fd1af2138a7b6b0c6d6c5749fa75874027d370f45b47d10cbbb356a,e2b88daf8425eafc7a8ece9869c0a3e356ad36b2c74a6390cca1699d3dd9d000197d72896c9d0d435677bdf29a1464162cd9504892d6d777d4c7682e01b4a43b01,6097f868cc136468ed2548476acef8ad9ec1c104904632269dfe0b4823781b6e7378bd26e824cdcadfa19906d572340065d72026b85469820a6e0d9c2a69395001,e9b1d46a7165ad6181e48f8985d5244192c435044cc183b4fca8dcace505179851571fd497b8baf84f2d86e5cd06c18c3d1d613b15371614da33742ed121128b00,a4a116a63332e7c41205efbbd3c399123e3a2b5b1441d47466f4f9fdf1f465647bfcc2e19255c182033dd8d836f5c51f0bfc37cd53b702d14d127e93b84e9f5e00,b876ab21af47bb771e81f68ed9a22c1d7d6d511d6357e89edeebc06c96a3ebf908c031f29a7e9dc61851c054187d37636bdb2065c442ee9ff3e3504ec39b338c01 +0b9bc44a009387fd9a61ea72ea2e03110022a16278470b2ec03c033720406a02cc4483d5c43a1ea793dc3e7e5da454f43bec56d07401f1d18c9b197a38af7082af5ea18e03638953f3040b7bfe7bf10663f83e301c5142f3deab2a6c179e0b2ab89d46e4536474f7394e02906da8472995dd7b3148d37c20babf6c15a664169d0f07ac457c0b88ab08411d67031bf71c3813b7673260b2e37832796ad7de46f75300cdff40ea523d37ecf225956634eba43317f731df027f205c0a79620150a21adda481732967c65f22eb1378ecc53801af0d370c072c0b05892b32ca2a79c6b6d2f6ffb3e99a27ca7f2c28d8ffb8d0adb2bb9a7bca724d9c189e1790b32c7ffb097c1b29eedeae77630be51270eb070f264fd63c010f4b5c1c22b89cf39995fbd7eafd5e,354bde10f74e6cd9fe846f259e05fe18ba38a509a799933971e1c1012748296e,fa0bf6148047f361e6beb2e60e3a6e713882963e51b0cf31a908527f3b2ce1e86f7d5700668b588e5556668b6dd64f2e20d6b373be4eb492c81e058452518f3d01,8e5dc833bec129138323bc19a0c7f858bee58b5c955d28306d312b2e8d134bc972ca70e8b62a44c4c5483eda4539aefa96987fad3d5ddcac0c935a81ca074f6200,d518dff8c08b7dd679682fe0b8645d0359cc25ae0dcc24e081f8697b3ccd6d231a293b4ce761889830c35092fc023073364f3a4265e1c9e5423049686158b95200,d51edbd990ba8b21ca73f4df6c0a5366c98057a9310015574bdac56d6c73ead24050baedbd0203fb6d16e5656035524193665ba57bbfdf459df2735c07b8dc8101,63e2d7b0c35abdec531a3af4d5f1d00efe7ebecf44d9633f5427ee30efcfd01b2617a637b13292ced0db1f4ab60568939d99a83669f9e97c2801a45acdb6693400 +cd994e6ecc2ce2554350e6c2daa11b29ae91d1294b7e1827a87046d9c2ff217aaeab82e14cf58cd5f89e3158c4363bf8669f83817c8705771740378a19c47590705d3574eefcd0e486e8399e69044f959684350933cd4f2bc2fa7c5acb13b009b3539bb2baf56d6a238c7e68f8b7963d5a3822d4d51648b58bec901f22f82a15267f253c771f074c6a23793417a5fe81e82c4f802c4ec7117d536ec3aedb4a1fef54e64edf2b3f95d110dd7fb2be7738c91d337f9a4efaef156a580b8b4f1241ed85a1147591baa9d7cb81bff1e619c08eeac63e7c2d04ea6248d95699ce14255e54d82d994c7d8f282b18c1569153fb674f842aef2cb35f4e9daf42f45913a786623722c3f019c470dee609dd27210a79195a469aadee251a39d376364ce80d716f1c8d2c,aafa4acfec6558188a25e499517cc31569fb508bf97497a1b5b1011cf7ac1263,9e7993c0fc9f2508aa277a6fe51527bcf82f07495eef2e28d692bc393160d3e32605b2e7994d2ace9c82b763335e45ee30a4e37b6b337b054e14046704a03a8f00,32ddb4da90223dafc7a52af1e477e22f30d6dfd9bb36e056ba7101cf047e4b731a5d50bbdf07cc0249323f925b0ca363675b4c66e8f1b2b8c95343ffbb9e049c01,507019a66bc3102ff0f8eefe7192f89b6ccb76ff4235fccb8fb297e328bbb3b6085584a5fabbc23398b3a62aaa3fd41730fec6326db04994fa10a561478d27df00,7a1f5cc710a6c8c086fd4b6632806139f02fa6068e6ea9945f360223e13d132653914512df9711955808a231f1336797abfdd855cf086695f350e4b2622e84b501,5057d8897937f7d7835ccf4f428f1e0e6227a64c13ef1e7536eafff5cd5e96aa6a56ee1f2c6587f958d1783bd5b026563fdb706e10ed25443f96f840e952ea3601 +347492e0956ff73086810dd2d2285c3037148fe53e214d99840c99d1fa4c5aa3f50c0d7aafc418d4a73f7a7fa846cacca5005162c9119532c6fe142be3707fd8913cf002bc19f6000391d3414c6405edc7b8f2d13be859bb27ce775f45057a15595b4f93a54ec2f2ec9830ea340f38baabee53a7b578a95171b7589185737d098f536c1af827097f6f320c2a8d553efa826b9ca91d3a9593dd00fb391cd8cc505a0c2fb3032ab57aea8a89782d035697d7ca01e9a6b390f0efaa6568af439d6035875746ac40840dd98ff23ca49b8a670c01bf893d740a606524e24caa6f64f641b32566dfd184a6bb916ed2a8f6063b1c015e87fca17a3f6db6870a629081cf00d3aaff8884dc7918cc1969c57a396cbfec69bff2ab42f118ddcad8000f544af2d9378ab1,ea9bc9950868faa0eef536605ad340f3efeaeec79ffc0c5cc8d851d6246a2830,02a300b7428eec4fd8038a26f46efec3f77a1e184876aeeb05d9cf1073f4563e4bbd909c48e0ee701a05afbc5bad5670e96c2ed314f7b952a4f6794d34fa140400,90e14458e55eead23a7fedde8ce957edd4f310de85660222c041d04371cea2f265ab7d4f32f512e7aa9669af435d88ac0b31fb450d994348130223812611777301,be8a4ee6cde6fe07e55098424ed2d8996dd5d65b559d97aca304b8fb5fba3819684496ba6b7e5657fea6d008cb4142e12b6ddf85f19ad8b1d4c683a78815e2b401,43036e650ae9530ec317ca7e92b2064502ee471f835080f2b7cc99f8a39501045ab308359ab6ba9a959af83929f5a9af003eb4fbb37d0943fce936f7283bb09500,30cdeb204b9792ec147d20ea1746515aa8123e9b42ae3b30b8d143b432c1c86c24e5e5004fbd24aed79e9052cc7dc3c7e25f9741f35a1eedfab9a92b5e3d0a0601 +e3d6d3ac4d771e53e6634c6663d9df1a8052300823329df0840d516441b90a8b5ada9512260a0abb15f09c26db502e2215f2b1bf6c908deb9ea6c806312174ef431d666e220104ecaf659f092b4300cac6a2fdd162bc5b9103aa7ef3adcfc5ffef1017bb38815b64d693fb7bbdc19ea3f3bdae3fd023f081d3227facd279330bdd6b658dd7089c16b4e079951c8dc6711fa529c234d2f0f99145cf091c41ab736a00e6634f9709c6255da4a5e2fb4314c655e1157b38117a942565c477194d8a6083c21166ae8718d8da860df06b703dd8422188187b23bd26c88d40abfcdf2069fa17b353d33073b4ff494592cfa95718fd3288a8d35d98ed45172a085110d4f85004bcadd8aeded45bfb2486d8537b567e550473302aaa631bd77d9c6ba832903825f149,75b5588b7e16ce89c896fb4149174ea004ba55fcb3441b1bcfc3df859487425b,ea1a787f1e7bae2ba175948e3a0c47bebd673214da47e0cf9a9f53ed412281fe17d4ecc213e89900651d29d14cd15d9c31635bf0b3237a1e317736ec9add743701,0293a0d6117a64daa670536b2522a2b8af80f2c02f211a6d43919b238ecbf099021223418e5a783ded9a7ed531098340544238b52134cf2047c85b4e7e33fb5e01,225649c78a6fa2ae12db6c2758fea1e47bd9b383e971710508ca9ed9836b5e473c83caeef4528653a11c217e4db5cdd3565020ddc98535acddfbfb704f2c3bbe00,0867cb60c0b73352be95222e7b9ca99d24a677a934b0ae01583a067d273d52a55e7d03284e4b96fa7a16396a4949bf93987629470276d7297186307626061d7d01,9171a262d0c3a7f7bc44e9c47cf6d2a495c4adeb811b4b80aee2dc27252a0c3855c64812be0a823e9514e8740daf55a207ba3cee990727dbce14c21559b7cd4001 +705b86d43d36df1fa597673e7553a33a70fcca58b5369854e30262b5faa464ad3a6816e8ea49fba1a0d4ea18b25f322874635913293c9918535ea155d8dab41fb041578a4400eff9070a2a61dc01480a9f4f993f7311ebfeff70e9d5fc91a0fc2adf1e48d6f5ed4ed6d8e670c50c2c46dca06ab355edff0e23ce7faa38e5b55401eae51e7529f82a366b5fce2f8713e7ff551b16c42b91ceeeb4f23acbb5b3b63d8d521515acdb45d77c135edf42d70bf4f8bac8bbd731f78599294f6b9bece5e7009fb9fc593786cd13a0b778ba470fbdfddf8ae3b788d69e37df91f88822c285a0c585b34d2a824fdebc01a32f6d3c934838b7876100977c4791139df00ece830ac9b6b314d676ed760928a6a318379813b0cff7892a9fa6950bc93967582f7d824fade3,a740b74bb10bea98956eb043b443b755c0a55311cd69f4d45326c2bb1dcd2a85,18e3c2e72bfb62db230d3b733744057997469418388040c45ce2ab776b1b56dd54e3d2458ed93f6e3c225fa704e31f0ec74aeb9f3c935f62b5832cf1d2d4a72701,c5ddf7b8209528be59a23b458c37bfec13b2aee684016303440071ae0dde1bf509c0983739ad8af895055e7b714fe330f05fff2cde54b48f696064df655016c601,acff2a97b28b1a4c80252e034dd97c8a358e89a368618355e4f8b6425e6fc805575d047919c32fdaf0b7cb5fc4ff0b38eee361a1e8ceab45e9887575ff5634a701,6fabd00094eebc87c5b46f1eaa51c4cb5efaa775e62d9e758065b434d837a5ce06a4154fa63191d173236cd8eb39ea6eb190d6bacc0d49e052db034c722f445f01,2f5eb4a3389fd17eb5147f84cb630f1fd6d1a32a49a18f05ca42d7914e046188011dfdb49322304f2f7441edaa64cc3a4804bf1ad604a250e32360b92e87b22c00 +812e9396975a64c6eb337356fc9bfbcb43c9255e264af4d93c7a4f04fab9d659863281589b61cada36a18a703295888e2e06b570d851ce4bc0556b185343778834c6f4b746c18496012fe01c925202e04941c717ed1da77ed70e97417aa638fffbe36c6c9707ef0d948f75dd30b1e381301d21fdfc42a542f1892991f67211222b13d3eec53edf07e1473450beccf72abbd3bdbef23f6cc9cf776664149f13b1d54dc9ffa3e16d3d12ec5941cf3317983807eb243ff769d22624b3d349a3ffc6fba1d4af8371b3777f4ac993ae7724014273af1810c65c6de90ce10dc7538f63e79aea5757f46a10a62dfaccb78eaca4a61d7a0ee9a679984b807e7ce346b761d4090a6bd8118845dcd0d9c6926900d5e9b6525fd2077790bd2655a9e72c029a64dd9690ca,d2c9c9d7dcedb35865c28dd4a11712b0448ef2f5c6512405750e6f14a40fefaf,ff05c0447c80b90d61932020a06cf20a92e225bb694af70bb945ac9ae2cc9d133d46dc31ad79469413b370c132d05697975187529bf395da071018ccac4eb77f00,87b951233ba39bacf872c9b45eddc50645c8b440a1abe143f7c8a896f6d22aa00b4498711b27e3100b398287ff3b4c1f5b5733db219e0ba40783f4347cec6af600,4fa83933f05b9d30d40cd104f8e3f2e1fd1681df8eb1e4c26b232fb908ffee161db95900c4cb0130a0e86a5c6b507153e2e225235bd0c0f273869e02ebabb6bc00,32fab9308a32451233798c568d446cea6e13892ac42015b6a5315e40d42da74330f61e372c028c3887ac9ab055a101f2ce1313e890504c6557441f9349666a4600,9f3692bad1ce5c6887f37f6eadda788de4e456a91e9dfa3b63e03ded77ef051a6d36f1abed8fa4255e01a899b8c6c855bdd81647c77f6f06493133e2bc7c401d00 +1b87a419eb27e1869ea8e59a6f3a75f3b83fc7077e5787454e55abe1240be6fcc9dedc00ad8764a4afa54c24f4286a476ef37fcc1a92c841b970df2f23066d73ba49061d3e9b07646129341789dcc7669e958c5a6a2ccd4608bfbcfaf7e155c5b2e5c29e13e80767452c03696e36e2cb85efaf7fbe24bf9f8855423702aad5eba7fcbde92c21851a81d9c0bc2b855784739973748be76e19b3c95a8d52bfbd233cc19cdca647589c8430777395722be5ec5042f98bc440352468b99fa1285576cfa610ed63e26be01bd2191c3f92afb8d8d4cdb1f72a30b38ff40d4ce8caabcd76a5f8631cfca6c8d71305d6891255d37a7e45fbe8b74b18f19455c4fc8936cb9f07f5e05deac9009bbbb9d397933517897cf61aed9db0ba57ec1488e4b34eaebe3f3e3322,5197928045ed24784a3179aba9b3d75f8240d37c501259ea4baf772cb2745c64,b48ca21ff2d37b98bcf127fbe722e4e7c08b21e1cc137e607a38cb03fec4c32649b36a2b0ba1bc52e3512249b7b43b1fa17052c6988c2692e2f2913042ecc24d00,92dde8366930ce76ae8872d5020dfb6c45a696c19ac3de1fc116e8d3c700cec2535f82faac0c42d373cb475dffb2bdab86b210ba973861636405d06eb089bc6001,aa3ec587442399cabe5a18e384d815341be4d3f3da12b436325748efa381ed1f0a73703b74f1ee94d174459a711c2267aaf5e5a32f3031e45b093957e2e8652f01,e9e5890f160825d0c4bc3342c7fefc3d40b5fd3cb103c32847b273c7633bae4b1855d5d2fd6b73c9a281c7ff251592c205f2211ad1e0604164e2476c3c4fb72101,2f961d7556a342e9d0ccdd400fc47679003780239e408bd12af5895d660eb37358929cac8b8d7a13446bab857b63f7db17e4b80fcaf29470440b51fba1e3450200 +a38ca253b38ec24679dcbe497b13f3830cddac38719f5286243c5979b7ab1abbaf9e119b351eebae67a66b3ad78905a135a8a863d075560e1991a3b3a7d074ea54e7026deedb29e17b2c7bea79034639005d543f114e2cd878b440637656e8e1df48bcd6b25690e3e1572f78dee6fbf1cfa1e5b83eb69cff2983b9e1ea115031a6dd1b988c35e84cf035d3c6033726ee7b58fe97d7d98578265f438c8c1277b1af692d8b6df4e297080a9242dc6d45a770194853248d4c89507ffc9d627dd2c34350c4988ac8dfaee99299f4994926c80b6bb39a1d486aed14b3897f29357527867118266e901e3386f74b8b75567986f6d6ab0a76192ffa1452fb63065e41459aec0b306c231f9c4254ccdc5996d704c991081624d451c32d909ee3a7f0c06e564d7f02b8,075ee3467a13bfee9d68b40c813c93c154730c7866b423ab34809cd98bbcaeda,88ea8b77e5c455837b5dc446cb8913b7944ef48c7ee79fb9e5234eccf611542578762011459e44aa7f00b9c392b2da1e44951d629f9d4e45d18ccd38be1404d501,9ea7a0affe49dd2f8e69a79ffcc0c89dd1125f58e8d176e41818f88e607f274a3f2339580dd4765ce73ec39bf04271cbad072d488acef61b8fea3f22eb093efd00,0548e74802d8a9ff0d037b5cf752c30b4b6d7c58759da13372a10448ab0237f41a4f4ee5b1e1fd714b1b4a67b20f4083d138c2070bf7f5e1ef110d80bf99b11500,e63a426d9dd1182eb0bea9dfa54242571fd95f0006d40ca17288355352a1629b651ec9bbfb99c9b5ea7ce890130947cd9b01d7eca6deb37f02532916f8251cc000,838036d67eed08a163377a24dd95201b0ef7d92f7ac5f0f919c84cf08d25bd00522f66900b2fda808bcc80fc23d1b34cfb7bf3370d6714b4273683f6ffcd609000 +850378e20868dac252f82e7db53e3e0bc3192b35488b47e5bef55fa5214bc451195bbfb07c6ffb5aeb8a6e36a9c61636fb396b7623b96c82e62261ac0a5bf281f9123874342e9cc12411c88b6eb9f6535e508fd5dfd4fa514488536c7e938221014d96a7c795120b0861b33a19c4ad4850af36b593abee3b290eb0b455a01e4d1cfeb7f15beeafc63a6c657532d0f9ca794e580ae8969152c2b038c0f948405500dc2408ab64e2b0f14e46c56c6439e4c24353fdb5fe374ab3742ff7aeb777d0c45ba0c668253a0c0a9fba8e92c8cd9d2fe2a1c336e14c84ed5d760d037520a8b6381df490557a213bdae61bf9c79d1528aea779058c3f88fe9cdff5a92a67c95285d4a22e8ce4536eef47da2165821728e7b38706d03a0e596bd44e2c5ab4520df70fc8f4,96774a7627ed86ab6b9987969e92e59c6ae7d4f608e4e7aac41ed72f8c0925b7,600accdc5dcdab857303ad16e1f87a52a2f4dac8b788ca7636c993624257ef29313a1daa55177f624a4c59e5fac5a2572a25bab93cefb83c1d8d18eb40667d4901,eb4ad254440f366bd8ce218dc95c097908b103a76590ba4872f1f232326c236e339395df7f499cc88eb34f86e94006caf5f96d21b7dab76a5dfb3446de9835e901,924083788508a26f2290d96b6146d4e438934d0ecb501749a6250d2baa1ec78b6df07d4b51f9dabf07812aed287185eb188af81b2ba034eadd3a86204edcda6300,6b7bebafa0c1bd6b3a1a9c35271386be7d2e0c3f622ce7ea3cb841f65dbe9f9f7bdd1dc881bbaa13a59dfff78068fae11e642e1d1cc3e33cb3a85adbf9be143101,ea635f1cdb7f365f06c6e0ae3ee2abb0d06721c859f3f9fe1649f37adca4b40f27974705ae989cd18a8d27d06c154aea28162be8f6fa2e627c00e8453309fe3f01 +16e5ff88ead462e8a3fade3a809b93546f0e9b07ee5e7f11cb1e8d94e45226946f5d6fe7da64c6cff2809f380a2f81f329b9c58855648f0417cbc2910c411ff9bb849214fb6fc93f4d3fd2338e4af219a856bfe3743c05ac3bd8d252cea1ea8f517176ebcb46dc3848c465a635eb5fa3e696aa25e33dd155c91ec5fbe1cc6c1fb34494a4dac25c9ce1af51048d51a7b6b1b4f9dcfb88f6977232df368c4359635c1610ef70b89c78c6edf7cbf2d286d7c41fda651b4cf398d38c665c8c6d4c9dde2c277db79ff2838e938cbaae7f56e6bb98952747f184af1ea0e912a395b73179f23f6e17f5308e40cae4c2e9eb80edb2c7d9951feb2c54eaf9cc1ea0f824a593d7ece849362e3d102bc410ffae741d6302d9ff2a573767a3bf5f8a56710d87a43338381e,c34b167df7e6a0629d97fcfe84b0de2cbaa5afe0da87fec37a423a09e2d22769,4795a5b1e70fa3c31c6e388e97c17eae0558bef9170c67bcb47d48ec6e934cf40af2c66da669edbbd1a9b9e00389f5620103db9632385e4b910883f4fe5163a501,d14ee63711873a52a628d17509efc15caae5e04fc6df756ceea1a3080fc5df354cb94e39f5f5582769b4f74ceeb2315e831578f9050e71c394fc2863ad4850bf00,63a8f1c25fbee9439547812bb52960f2ea1e372188456bdbe8df5d658bf383e748c1008fc202292e7ee55b4909f43b1c027a70e508200827d59da554fa84eb1f00,8400e221c726a72393bf6ef1d93813127e3982942474217c236b84e420af9af55987fef6a4e7542e3d83fbff1e44ad98dbef9ccfd0bbe9ea53aeb56129b1d6b901,037fda8aedaa6c5eb05f27d03df00173a8731a90913bc6891ecd312d695f5ef72826ae76162de5ce6009f7e2a30eeaa281c5c81bea19acdcb48351b4959075da00 +e6e338050b88d9ec9ee53b07e8d450868365e728167e989fb5d54b2ef2e3edadd641dbcca83116445657c259f119c428b437fffc335dc15eb02918621e99bbec4c985b40f98c3eea467499484477be90a051621cedcf160594fe0260f87c07ab0e905aad6ca847e29204ce5d581fc66f475f98062ba12fbae948b8ac60ddbc7e0f094fc822f405f800fd81e3ab3a55039b65ddd2cd6bf98e8a1d476e97c7da30268af64fb387505438f86b8d47590c60fa763d43d7265af1b61996229e545857057835cf25467e17279b72e86385ea9fc9717f1af72832e65ce41e3d870297d01e5344dc6786947ec82a44edf880791e31bfa67e9eb0fd7cb73a102f67d77901e8eba285f4f1ea9cf6005571deea58b340a5b51e617d8d25265cf7a7dae3fd9a9083287a8f0a,c6768ad749c61ac98823aa0fd7d71f42e466c0cd7bbd565943ddea4dbf6e2331,5fa94aafde8bf8d33535216ee47907d1896bb60bf5232faa9a973c9c574b71c818c3d8fe7ee1e630d1c2923de683d83271adb2a2a8e771a961c92db0133f8d2b01,0800ac7c1ce5dd7250893b47466811ab9f92ef9106eb9ea192224adb84c07b0922089127469acd9013bcbb185d7491657197caec9fce70bac8571a8aee7fccc801,8242f0e18c302d663778b1b93dce54e22dbc9b014f8f986d8c0d7919f9ba902363e2e48a3248e629902fde2122a1bc8be33bc526516cbce12702c4ae527408a301,9f3a4e2f91175c846c10d6ffb05b3c7e2595a83984318e6a2f0053b7a7fd694e4942be69b60b267f85cb5f785ebbdcee7f19ce2e3a16a87b4fe36cfb564ce3be01,70cf1db374b1621cf4b456da0f7bd925c989b62f705b082b628ba2705ad174497a99d7cf42e19e363f83492dbe036a4c71928740935fec6cb57daba3832654a301 +0737f6183487ae299b502645a734fc9fc45e980995dad246cc662d7d8a2b048727ec07ff58d0b9e28f280bc1c2ff2b26d3499882565d649f16ef02b99d3bc33136c82df1ce75ade9e3b949ced0e18f9c19fb7f0a65c39f7c83a89097e70e42d385ae628efb2b7052c149cd8cf66a4fea73cb2faab42a55c8871eabdcbb347ab0aa940c77f6ecf6d29c3604005fa0c57ce9a71806137e5ff33bfd8b15c7a9c9995b8c517f37cff6b7efc807cede1ae82dfe7a3001f6ed21cf76d63b558aea99f2fcdbf988ff920dd26329fe4a2d3dcc730f3b8eedbc2dfbdd2bde0966201ad47cefc521e7a3ca22a83464af252ba15cda423de4044a121e56361415054271b495722ca6e8b5e277a90fd34a9f7ed0ee6b98cb33c7136c3f1ed1c0ebd8cf3b1e4fb80e91567cfd,7cd38805583f88903971d76a0abfecb24b4951feda4c191707a1b94e8bd08a76,4aadccd35b882ae798264e8c0cd46d849b302bfb37e7938ae1de8cfe1bba82d2436d1104e124f0ba6c5f7a5afe9687fbcac8472ac08187752cf21353977eb9f700,4df3d206d5eacfac5c92e556e8e0f7dcb4167d4e7f656b2ed6341044d19953f40fa739e21a8b7de5195006b0e6304e14f761e8fb69364f3f3428be5a07cbb3d701,306d356fc2fa0e390c0898312f6b177edbdb41119e2aba3c4d94e2fba83a9f756068d7002144faab67283301eb8f9fc1b9bada5dd4dbe915b80071122a21384300,d4e54aab2127b4149c866989e74256c756da7884d186b1186f9fd29276ce5da932595938e0830125282ffceffc012c2254fd08f85ad29ffc4127adee5c2ccc3000,8cbd0a92df070e8fe3cd8da29254ba8b19d3cb6687d6850bd330fe32b040f4b239e3e59edb9e8f4d0fb3592db6991c117d00dd98092f5c830a3f11260e83865901 +f8a05659c5130904b7c6b75aa36dec328924ea1759dc9bda5916c40410734b9ce1a8a0267cd9f92be3d761a3d625712c4c83c1bf33feb9ddb93b37442cb56f2eaa2cfe410eaccc414fad2adfaca2d9659876cc0e364ba83b4c669ca99b614bbf9d8ede0f03fc822bad38d9452b873790bf56e397078c1378036788c03c29b746b51374acad689047320683a6be79b6da24a71d32dae1b41512a0744a6e94642616fa7dfb7f26428e1ab14406fb6df717c92187ff8bf65e0693ef861e6eda994f8b36fb6ea7d4f2f19e9abd2487a73b355400bd1cdd917072e5f557d5f339d2abc94b9b07b9c62d0715343fe1ca0cc690591c0d01bbedecb66d8db564584745217a716fec01ac375645dafb53e104b5e965b9451c7f0167cfd7c5bbb5a6ac1ea9e985060dbd5a,4d50048babc1f6228cf9c664aa8614b635b82d7f6ac217034ccd4c586af789b9,d72d7230645f7cb8ea5c6702ba2b0621d3e71cbbc03c52285335d507b02e4eac07818c3a3b9b18bd5909922ef8524a541c99cb335b752a4e51bfd49ed57b6b2f00,1a9c9f851f5d2439f595992f52b14d5497a2ee9b9bc82045120d9ad19542f606215a4ca3b423184fa40dd1889953fd9f40373248e3ecb6e4b6a43493c5f4728501,5d7d17df9c6949ca02a918590986d5fff338bd0dbacd46c6f0bd045fd86f054624a3b749d492144576b829a0b0468ab304277db542ae67a3318502d589d7ebb101,c74d717c3f42d0daf29983e4cf789b5f8e75245f579bf47115650290bbbcfedd6a430084bd7a8586154d4af966c65f702e2bbd926d841a3ed79a07c9ce3d252000,ac5e0cf38affbf50b689db4208d2b4868f3b33cc5f66569e0869b248ef17b2487e9b65c1edd5e3338ee1bba910963fec237254bcf3d8aa96770cf8bfbb74a6d301 +8a0b67343b13e7cf95922a60b417ace74068901da0eab05b88109e630a833685f946720cb26fe5a2423a7cfa08cb6a412ee873546a0af55a77ead3877243a4dec8124233d7d9e2cb1da0f4d6657d3a9f7e70678bf04daf263f190b2df07047a172b690e450e663bc29d104b4c05824943ce49ee69de93701d3a3e36e1e139b8b0ec347d01322618c2a201326e2f0bfdd8902f667b885ff170a22d44b6c9128be5fffb6798e0c74a649f5ad9bcda926f7bad3d1c54e97d63f0f210b85eb7a49a05da1da6dc667c6f81529ff47d45788dec4f5a9480efccd8cd48a597c6d9069b4461974a7bc9313bee5b765246e900fe0845c748f1672b592f7cff3c9b2bca493defce9d28901898d39d423240d2ff06ac3d34152374483260f338a35a0735cded5cb96cd3ebd,325c33fa0a8f60e8206db52a83a7b444c383df071a6b9f534eb4ea5d6e171d42,a3c661c4f1c1655c37181376fbb45c6e6b9c98f62c2befa39a9cb57b90ab841f2b27432aa272b36b9c230d576e179d9fa8f0232fd378f6a7af22a9efe0197d6c00,a38ff40dbdb5634a52ef7e49f3f9d9002dd02600e9fabfe4094e3a1e54642b995d272afd181f1acff3ce01ab0e4b2bc8c0d6ab7c1f5e0232a90b958678b2c03701,9bd2d7f3876a5e4a376fc20eec19b532affb74f6c1f43ac4fdc63ecf6df7ed025c67e8ca7ee2955e2343d46413abab0a46ea465c1f428bb83b9e1c69df45794700,1afc9750f502cf86651b17776a0a0dae2896014aee475f984f23e25f946244f34cb51465c6bcb6f896db3c45275f2d9e14174feb725a121c7ecae9257f41dad901,c7316cf0659bd2f83c75036a5408a1a6fe4f30bc4b01a0f149df1bf6e0e93a90273bc2c7e06006302f358139f867460fa212ad50c5f6418269954e82c7373fd501 +e0a1d7f1733fb025bc76e08176fa560d855e5f4c8b60f16f11104cda4afb61e6be7faf520e0b86b7b7f9d807c3d7c09e480514dec637d71ce1b2a11742bddf59b8dded75cb4d77e99f35669b580cfd94bd636b36c73b6698694aab8412959a6d8e3065baf190f6de70d71a0d68898898a4327557463b4838761445e201ac97781363eeee34ff9512c6b9e2052bc618311f1e2f7c83e195822cece9f7d8780d87b266625332852904fa9239575250b716a52d9a4329c785a75c193972ed7f1a1b3fccd0158d3ca252398c59c1e642e844606763c6e02f7b5e99aa507648e1b5a8756d0d38458299a95ba0e9e218b691488079b8b659a0dc1d40aa9feb4e7920b9cf6a7a44373a81f1a6f3639b465d27bfd6bfa6db46c6e719ed6c85202ee4191adeaf9566f61c,bb980128a3430b7669124d072a3489c95024db9220889f2b9cfca57857b00424,f8bbff3e96fc1e149ac414e5b3ee1b0e9ef7c637d4d6dd57dda293dd977126cc2a2a1d55453c4fd8c41cbc47d20b0e2b8abf30e82d9fcbd20737ca6938a4dd0400,11809f94f85a5c99a945434e16f964f45edeaf145d74d9e21d6b666dbe069dbb33e5de330db43977638455d4c49f5327c9ca1f6d8e93f4200a12f5ce3fa8d2f400,803084ed46cf172dcddf4a25c8b7b78acdcacafa4bb0e4daf3cd016f97bda7d503c210b0aa17d8cdd079346bbaf346be5edbd08db2716d8320fa1f43cddd60f301,49033c9a8ce264b9f40bba5f5691b56fdb994fc829628f02c1922c5edc4847c4095e02fd565456e762669a1aeeb0265165ccd1ec5f8aabbaf79ec80e6be4886e00,6f62aa2f59fe100362f205fe3a0f70e4a645223639977590e02996e9856daa5263315f37afb40258a32c58435fbb1eaa033a81bd923e902dac2650756c9f754300 +34c80fdd9a022045c24753051fd65e87a80acdd63442179a22262e1c3c13c38addfdddbe2e6937b3e8bc485799b3dacdd707065e1b247ebeabb1e3c145335e555cc43bfe952625f23f98d8eab07b1f4fc1448221a27c39b2399414e31ccca8102f2e61a6611619ebc593e0c2ab4a3f6578cde40d9f11b243da0e61b8f65d2f9ce30a85d62f26846132a0917da1bf9db696db6798ab6367d65ce94b5838566ad4299ee8041a82db72d27d007662799966be568e597eba12127c8176dff6954dbe945f1e0f91726e2cdd74905c9e00e5a50bc288f8d46ca5a34410acf5c6b9d976d2bc6d061cfe6e601ebc3bf4aa52adfab95eedb958a87a6632116662af8f3ef609479a7a7aee4a6df70961bc45ba8cba9a147a36280a0d2597ac2d838f8f92d2690603ce6a04,3826f43c8b168aff412cdb4a193882bc7dbcffe516bf7b7615e0e348091f0e5e,c7d25d1e81f1952acd8c65d1aca3d85b8f9a83c67bfd28c1149487d5cb88c05a144cd3d7a931adfd582a89584ce024f155ab6c869970301c308853aa438bda6c00,ecb58fe9439df422da2973abac130355aba29ad0b9c26eb774f405d2111f45ca074dfaed181f63a132d40ea1ab8f0dd65eb975946e0264819571c91a3045469501,2d0213f6146cf9315f834af252bee03b1124d5e2d5b587206509c771d7110338040d0f9847c7bc1f1669ca6c1ae3282648c28b43379a7ab051ebdf68ff98067800,3ab754b9caf21747f1c536720d0f3398db5a1d056ed03e7e6d5b8a453e4ffda729293d4051917bdcda254b6031c2697a6ee237dc4f1199bf441b00b61536ecbe01,4be7ed621ad42e57b011af1574c6f4f8dbd74c7af52f267a043b745232f22111719df5fa2eefd11c381ff778202c59699517722daf74c59edf9afc80cda152ab00 +a5f003b159b1f597c533c6669ac7a58758d51989992508b850aba44ed0d489dfc7979ccf46a8ca1e5c9b7e9cd97c4ce4a0ae417acc99303e425a19be5a0f36237f6296e0e3746f8e1f4fe135d2f71bb4d24587aa3fbbcb07f3e92837b9f8322ad447307f2c6212d2599d206c2da6f6c7cfb297515ace6335dba610109af592f2f1faf7521b497bc4bc1baf7f5c0c0c536c1dfa8a9b666f639397c6436fac42a54ec32d85356bd64136e3ccb84273919a0de72b837a77f8b56dbb0b2ee40c23f63ca32350b75bf0597d2917beac67a9752e0d7ba64389fe69a833d4fe8793c3c268f779b69245d37d0655732cb077ffb26c705df0d1310bf22b1fbbfd58c9f0294665cb657df51446818c2a4a18690386401d511b5a7a00c607009d3a7528cc61adaedabe3204,02fad3ea2a8f7ada7b0341ebeb2a9b547c411b0f932ea9d8ec04fa733dd5ca87,6fbe516b8987fdc1e3ae79673a0f9600e1213df207e99a0c3f8f6ba8c7c3bc6e0fdd6f5197da0d1b6f773ae7811e8d89cf60d70c1b83943c91333eaf01d61d4701,e7ea832cb64498297a25f8ea7018a701f72ffea9246f7292e2ef3594091fc291388d13e39be8d4b6a629e07152a51e3458ac799d9a0b9a856fe7b7cbb1522ea401,fe5115c37a4415901d802ae09b54697e9738913a23dde7fe9a1cd342837c3ba03ccbf2d3dbca443b03e10c2eeb1a335ffafc9fd9ef3b0dbadfbc6f10dd8b53ef01,0f7edeaa1268ee64fc1648d428a2ff81b3d3418ccac3c6e0f89b6d8a8c096fc90feb9a3bbb63fa3c381dbce22c22bf539b2d2605dd8f0f2f9c3f92617c211bb100,18a5551f05c436fd354e2c7d932e198e5c0b1b079f75905899c480d502dd42f50970e7a19cb68922045ce5891ae4ea3dfc675e4f8e5e6d9e9c3ae7dad0747e7c01 +fb6293b0165b1d647c23eb18767ea74e46b3429c3e49a6b0684a2ef7e1b776236e23c5c87bb74cb3eaffa37307c19a05cb7dea4a0adf7fd6bdf14ad90a1c3f3067165d02d531bb9328fb72e43730e38e23bdda9bd30de40f0435b301822cb3faf112e99e44b906f82a5aede982ddfc39bdca3e49111f222b51e7c076c581a326186be86d3447189223544a960bdfdd50ab8602c680a47496d3721cc5cccba4d85a84c6e9c515816b20e34a0cecc1b2214205e64bdbf251bda2a69a03a539bb4cd66df36553dba9ef7fcd9f81ad4caa55222109888197068f23f41bb09b4ba8e5a6c053dfa3bd826a3d7e362004350059ff0e265f87c3927c8ab304c7dc194e28d9a585eb4887cb442a269e520339c047bacc6a991cae0016e46e2de5f9c3befa17bda502d4d2,8fc150652819b4b3a09b72aa5e0342c9f22a79e2f0acb5d1a57bb720a53d567e,27752d5e4514349f9b441f143894f102d881c35007388863313a46bc9609446b32c803e750dbb1e574486c14fcc2d36c1ee79fa64e8134d173044913aaa5dc6901,24c9ab4c991a5fe1845995e164d1878c77b2c88c505b4d427b594c9ce7b8389249d73c50fd527df600c184d06e246870214df1911c237b9725e8e142a0566a0801,c8ec24509b7eb4337d5185bdaae983eb5a7fad007773c32d144f13de965f2163153811ac2ef01241f27b00c69f11984c03ffa62f576695ed6a1df8680805ff4700,1de686f452c492b0769e6859237d4e69411f56dedcd151b1bbbf840990715f1d417b0d315d2458e4af6e23fa0071fb61c3360e38ec3def0e6ccf1a6983a9ea4700,7a243a273326f01bb62c99740ec00097b0f217648c361ed560cf8efda417d6e87d4cd908fc66bb408663f7b159ef587f535cfd8a6f2a9501de221a2e97bfa8b300 +7e1abc93bac97b6ce1e743c26458ad08f37253913d97586b56e8e5f17ccd89e0f9c8afa3cd3680fcbedf8582c56492b563532148665be29e050c44f68743eaef121d935232f656236e93a28b03a70b3a4e58113d3dd437a53dbbd80e39537b0fb618153520f3be682f74649ae98fb021ec3c532f428ce48c81dd76b90b2e47dc20db3e1010c2cff5106988241f34087f4c02bd568e191bc029a1d4e6b10c0a3f5861d7744ae58981c62e785f93e5d767feacb36ebf4147cb7e52d93693195482212c6c1f080ce99026490c17e282729d5223005d6e1bd572c185f77b713e012e084c3f135e8745fe7f9c060b3ab3d7e349882a2497d95a0eaae8f00896b8c0cc9aebda24e9bb5036b4a4f4dbc359f211863cd2a4d440b85724034768a9918252ea1a965e4342,572ec33cd536c27792e02ffc762308fe7da02ab7ff6e3841ea988bd9ae8321d1,7443f3bdec08ee91f4fcf79fbd8736ac409bf0d9dfcb2f8b07b90d99b288780b68444781d24d4422ababe83ef0340ee53fd62309deb065b9c5e1122409751da401,1945b5c9394f2abc28fafd89024373d9d8846c33b57766c8377333658803749131fc1ed1733532a8ff71324f67e24181e91b317e883dd2b83e96afe106bc44ec00,98a5d75301f324e1a9ceeb563a4db79021d9aed822c0d37e281f0260f6b23bd22afd88780eb5346a1f500c5b9ca565bfdbcf4022e4dc63c8e92e73681b634b1701,4f9b8a4d9edfb443f5f1a16d4938c845046ce421d89e4fc5713c3e5de71ad4f1772adbdbed3bace0984240b65f9441c839bb81bf6c5d80f5996c8da6f6e3963901,ae226b33e977f4f9ba4afb12280ec115fe9187c99dfd9c4e1b568314bd68ee170c44422894f8ba91782266ccf9cd00ebafd627a3c9fbe105edb2036a95d7256201 +cc08ef553b42bd373902a50c5c925b34bb792911b5997cbc7cd9438a8a27ea91befde7c31aa109f13dcb4b0fbdebd15610e6a14060e7aa8f5d47a365ba7a7364fea76170d2498f395d7fcca1f2d6f0f8c692507818fa3d30df6347ce1d50346266a0b2736f99b74d5acc51207f894e6127d39aec56d350130ee7098650911d197ebab0158ea7f03e4a87955ffe3d30d41ea9d39cfa4f4d0cdea895d40da34a65e8669976c3113e3e846fb54499f91acd9479ecaaba199f9d510d2d793da3950524091143d1e8084a3dc747d2233ee1d21f92db44e4a555699720f54e19c71abc538e54416012818b1202685bb8e142e01a60f6393a23507399df3cc95c25a188be4c1b0403914d0329d1be8e9ac4b421baceb28e783fd1fe9f976b505920c358d5dbeda81d2a,ce8c65c08191991f6860481e79d444484cf70803b7c47ab03a6d6d7fd647fd61,bcf0ad1a457ba4298764f42e25374694510fd8cf0a12808ee9e8abc612c0a478324dcbd91a261b4f45de0ba4e22fc8ba9b1043fce8434749ae864faee48ea39c00,4eb88163a86a6471270ca4edbf89c351f73ab06679ea1138008992aa74cd09f31a7c17e66e0e448ed8180cba0e22c7e4424f0c2c5a5c42db7ac62dbad410da6601,84c29f422c10fdfe5590613fa732fd335c45f5127db2655add6d25502da4dcda62bc889c2a63619d7f2512facd4f1f657b64a239d272361c8af06266256d4dad00,8a5acf3c832da3acaadf59fcf7f1f293354a12ec92ea8d3cfc91a9a2ca2960ba1235377b6fd0a79f1c21474c806d9fed0422ca288e92f15ec9c24f1949cba1ea00,98fd1d3fd595f4a71fff0c5d11f97d7c5a1700817326583d862f3324495c14366a1da917b3f1ca8bccb6ae588782fec4f427f9b16ca1deed01838b9346b7047000 +629029901bb12aaad56fba8b2b13102210b29df8dea78136a93593d66dba3b0af30089d10c4db6a2300addd9b9e1382d62ed2634314be2e41fc976a1719dff50e18102f03f0ac8e7c4b8b77f76d5bb825bbcb1f9113e2854f1347f68be6dc8b6f17f79ca463560296e18c4f2b445dd51d7c37df5fa99ca5f3e019d7c83753fc78bbcc55552f9ce9241cd7655f4d4e301d26d531706a3138a5e0874797b554ce829c482dd98949d3ec0fa73b958674f5af028fdb91909335eb7468ddeaec7e44d46266b5e3fe72a2ed3dcbce5f3e9788ea23fc782f756906ce28b5a8700651e52e7b599d59c9e1b09dcef1877cca9f9361a683f09396c57716c162c2439f6ed09bcae6432829b396d8ddce5bcd86335146385bd4f7547b1b2d8e44c90b1633b13dd22088f459b58,76d77143fe865e7e2741f73f85b6ef63c6942a61fd8cc2b176b201cc05728bce,260c6be888124be42143aba64463ab835341336676ee95e316327a897c88b48b17780e966800b669a31da41a4668ea18813cd475390c412fcdc1085e3fe9ea1400,a86d1a6abea3d9ece99eefb26c054f84fb75b7076c514dac6df1d0f391d15aab411b636f8038af0f850547a0cf224381ee6e82a56fff7455d5da4aa8ab1ecd5f01,64b55d31dbf3b0d96c880b4a98e6b8b1f295b7d13852b782eebcc9b96f4ccdeb5fcc1c33910e4ec3ef62a9f384eb895f0082a5a57798123ffe39329ac89300c800,89878fab98b24c9746ac95e97911fa82f530bd3f0997176796a332ab4f690c6657571ee4dd9f8534f453ff040bd24069ac24c55a1965de0eb5c1a7853f60c27c01,28e34129dac44e94d588e89b6ec2d617fdd120a7e8ff771a9ca7c59c8ec4da7c69c1637720f9acfb4e178607b35c5c1733273a9f7ff98ec14b672522ef9c382800 +d54690ea6ba0a1eaef29d1301b9a8873acefd2140707125932e11780a33b03d974a8755856ed1d11e8afad8ede4607ec3929fecd70cec4f551c349bcc1f85df4c48a9ca470c394e276c949f13d678cfb7eebdf1d3fe410765b553009524719bc6d7ea648708a1bb67fc7159ffb9528b82d37e46ffaa472789e654dc9ad90f080ba77456483603a72d69cd1d27df0c268358e7a2a88a9bbf2594ba536ba4648f5c6c895337ba1c2bf1541544af03f5a0f6595b1492a2fcf5718ca44d828d9f9dcd0c12ff965fc3b66c6190502015f82441e8fe0e24ec6e17236c72043be668dd1ce97817056cca7b210f5aa7229063d3546e55d1bc7c811ef493559c3466256175b37d13e0c852841563d782afb35370b4b6ce21974a7230a9c93c82ecd1fab9a34ca1635953aa9,cb11450982cffb6398b05e05a82c027c9f6675ed1c677c038cc16f2cc9bbf1a8,e3310009ed599170784982212fc635eae99b1f5325ac3fd6308ee3f494f2630d4644136d9a5f039791e923892f8a621208ba6ac9e6285f4003dfcfd2fdf1719601,e604d4c943f27dc392b35e2a2d92644d7211c834fad11ddfcf2ec8bf7cb7d4e61a9eaa9ee63fb48a5854a543f20c1d41105b52cab6139d6113eb13dbf74ec04000,01c466d0ad7ff72cc4b89e48a75fba4a1baa4a016c855288955e6e12a67626b048fa9c1cf32290845e8e55ac04a396a37a3226cf7e0bbce30f2b1d59557fe47701,02874dc1ee8981b85fdfb0b8e74648cc049b2776c722c1703ed9f4e17cebf91a3df5a89db92d20e1adb98cb0c37c9b89e23edc24b9b204edca879a6b3bf09c8501,5a3bfa822c79444264ba16e236f5ff2f65ad5e6e20c20eda53c539587f6601af31595d8bbe0a55a334b65e69d8f9449206d2d3135538bb154657cb43c4f1704101 +4c8856a5c7f1a850485ee7bb43315ce94e0c77ae9090c3ba9feabee0996a68a0163a726468edf708afc14b4bc2ed27077b15d7367631477b075f29cf569b85aa155c842b6d78a8bd315c354068177d1e7a2eed19d648e122a06172081e8facf2d4ebe60b381e0a08e1a57750cd0d32f2e9b878fe5edb0f09a1ae59820114649cde7933b4d8689de424de18de44f6d50501a4425f985b21bd06ea39eb926de4281c34bd39b6eae6b71db4394fb6bb85e734b90cbf53da473c1f193014782752dfe68f9f41cd879b019e7952465cb4daf1da1b1885a7eb858dc8d1d0af4c6f2e3d96d956f68b727f197c37badbc83acdad7e15eecf75e76f644b6c3abf31b0ecc2d648da8660a8cd1d847af4f0d5aa37b32af0b618bfd3c384ff548dc80c76a2acc554bd26f37ab7,ce5b6db78afa15b9e5d877f974ea9b6ad9ddcef1d1c94b21e39c6fea99310d65,4be733038c021e75ac1df72da385c4701852879097052626d3c482792b71c3683f9099964fafd4e6a6e31469ead32a93c0a9dfcdde2e496bdcade03dac498a7101,d299421097645667034237ca427ccfc5e6b6666a2cbbd80a012e1353362569e41fa19b1628bc33dc8491866093018d0458c5abde8ab3f70b86a26dbaf075ace701,6a21e2bce36448fd40ccbc381eafd45693e1c80099d9f9293bba6c12ef8698d13a4d3276058f3a9790957df861c5f26229a03f0cd456c3285708b6ba672b7d2000,c7b1fe3b456092dc4c9c133e55395a12be85de20c384dd20700412cd01bce7667df0415e7a57071684d35731d32305ae724f29a2d80b9eacf4cd5b5580d310da01,e3491a8ca56a4f22071c05d2cd5c878822637310a240ed983a662929ef93a0be7163333611e96aa6da0e95ed95b558a507e35604565bf6b7f18283b1398e3d8900 +66417c3ef17c2c7601b9a8b136273175bbc787f6dbb7f4b4be424697a4b92d7d01ced68df97a0eba62a7a9a64d22e715779992e281bf05bdf6c744341588a030ee9e004e10cd92f331f6ccd9ad4244c30999820c9f3898d6ab998dd42ae0c1ab3826931cd251602a5e4824ae47a9f90fd11536a835f0fd487281587a187c136292877a3c584435554fa3da6391a75f2d0cea2aff26bac075e23c58b1ae09d87de8d32f615157877a5804bc6971998d75689dadc8a45f20082df54302ee83a29b70f4ed10ad9bf6d52ba100474bc789e6477e657263be7542e29bdd63a25effba31f747be167113ad9065db81ae504a511ef1ff41f444244a1e8ac8cb36732b330f5d345b2d379bd590abe39dee3d40c1034643710e6ac4cf12df19d871648df7236398c709460b,d9d5c639c01d6dbd5ab8b3e7f57c64cbd86df1d8a16ea689e879f558efa16c3f,6aacc0e464858d3cd193463d22db4314223b93e76180a695d5da6278c153cb9a24cbbbc8db0b62001dd119cd7409e2dc3ebcbee03c70d4d0535f642a946c547401,e4b531346ded95f35865170426aa7bbc0c302c04be50300d70e16ddce0839f4005f344ce303084e45c6928887a3b0a86431da82b9d88bdd15a77e9b970b5be0201,c66eea1f9cdc10c1cb468419a300faae35a9394ecffb0a5177babb84530c0db51d2ee0554d91d086428ae6af6870a1676b4786ff74ffbe5911f57fb274bbfc7001,ace85c150c3bacbe47e7c35aaf520185e716048131a68beae4bcdecc3ed1007f349648aae2729699c8386428159d43d7127ad7006fdc3405c195f6987c2eff9000,bae13a9bf671e42479ac99529bf66dde0841c9ceedd2e15b3d7206bfd272284a721d4cc8bf753871f24bc0364fe01b2ce013c7b4e6238bc6f055c4c518e7571601 +c79960756118a89f2ec1999058b032ad9035629aca4857b45a16bb42e8acae446dd5347b76a6d50a6bbb7d01397cd4d6cf3da972e3fba0c6a45a1e739729b371004ef8a9d1e0c7452775b5eb3bc5dbc91442a1cc3e1f4f43f70899fb144e18c205d76d152097c458c95aeb23eb9c2481047924ef4c11260025873bac8cec26e3cfd9f34b0a2de56b9143e8bcb883dbc786c41ff44f399dfbfce1f89c7735f9fa3604772dc91f2448eede02ab4867b2af86f41f369e932da9392ed619ef3a92e3df28e5a625c88c59c8a75a7dac46bf782ae1681a3ff1be07c09fda28f4f66abafd8968af84c7bfc005ad6b4948e373c47bf6ea068c2a0fcc75bee88b56f170eb3ea9d078dcda50c30748f590b83584950b6f859e01247037f5416c87d55fba8a1294f4b950a290,dda698b9c83589fea5a86e672589800e19cdb08bf205e583747c3584c34a09db,b99efec894de256c48d9bfa8874958e099743602ecd798e663e70831b8dff886031ca6fbd03736c375f8cdf614ceb4df2ca284fb5ba696b168b26da09bff481200,be0cb6dd56900e545b57d3ac37f57debb1192d36c5dce6dbb6ce8c6e164bb93a1a36b2c0f461c91fe3a4d09027b0188e5fcb9f09b6bc382a0fe04b43c57ddb2201,21be25119e379f2c1a707390c536b406e0ceaa5b155314f3302f5cfef571b5de2639fecbb37b2e5a6200e55b2e22f9fccc4285ac71337f6f0e2810c16c95687a00,c42efd5dcc87d338835a9f5f5410890c65b1acbaf394c19345edcf8e06271a4f726201d919a42f0d54dfc558f5169226c6e2c0b161c968f3647b0ca29346c22f00,90605a54353820fb5c014a2123d0532c5b8688419dd1ec56863634899accd55205f33ca3ee4b93878984cd3035d5ace446c966a569b8694cec3f7eb8a002ef1801 +e7fffa18d3a3305598693e39551f4fe1981e1ff96d5c61833313c4eb7dab6e3182a67cb880147a77aae04f6e8442fde2ba711f7f75171353de59ce388f9a2eaddea133d01fead2c7643a40893085356838fee17f9c00f0afb568f787381a2463819c44ba06a9496790a2de3d44226c677f2ef0c9343780d4cd1c9160fc7b91634872d6ca202863bd55184440f6d6e1e29b3cafd55c176b4904e408cf195a12c93c23d3316c652334ac20c3c900877da27c02e1a2bc7d8286928ac7f75a3a5a5e2547d9ebd5dfb145e7f574bdfc6f01ce64cf15125ff51a9e918ad3fb385e19683fc579f144a4c22610c1ad7a709357f7a34c93abfe3dabfcb618d273dd71b3b39e49c9e9fc507ac42c39a0c6c164c1b594217e394ce3caad5a366a599eeed3aefb6b467f529140,cabd7c6b9aa4b72df2d0eefecf24621278d41f403101ed1512bd0fc7126dbf20,ef14007f0635345b17f199cc7aab9a6ed4b9ffe02e4ed14377d6b1c3553169824551969795bf1c63882ff9f9d34b180b4a44fb54e42e88a08d3ef8d266197d9d00,a82830ee5b2610d503b8ab74221933f0a9609df6362b50672a77fdcbe63c06f45c3565788a9de4c96dde123cf70f3e51ce956c3684a0f0ee4196ad0995e3023001,bec27eb29130aafe042056aaba0241ebd86691e1a61dafdcf8e19b92982eaeb96561b23ef7627975d9dfee455305f63b7f7b395c941a15387cd7e83e9eefa17501,af99ab501ffc10511924a02f0429aafe7113fb9f537306cd9c2acea347f8947a1b7a57eaf20a6321ef88a26ada005f6051de232cadf6cc1291fb9ad0b35c3b4000,11d7796270cf616fbf9a15727d38f65e7c2254219d765df6b0b0bc91b13fa60767998e6aa034c30bbd77ea53d488c61e1c48218ea55916adf44d475318fcbf5901 +d65c2d8c3844cd7f9cebdc9e678565b512c4ed37766571721ab7ab4aeb68d999c5644f3823bd9ca350c5b99b56a274d2cc3c884393847c50eb5eaaf1a27269d937992377f4ac1b3251dbfec893508b67c70674f3e335bc3c2bd602371c350b0b06c0aaba7a969b66fc11024bbeb0a5bc3d3ef91f0f5a88601fd74a5942225acf0228705461da72e7c266f6c62dae6a3aac9c64b7a0b500380263f0805f099b167a3062f02aa07d52d83c0f1544f3de2225371e9c63dacb11f916fe7e4d6f7bddbb52b50c94ac5bc9d1a02a6b2a3702193b271c4202d7b7fda073e24fc2d8f6bd213233f1dfa9c308dfeec78052444a24989ff962defaade3a365d6f58ec1b3c3a586eabd5e12d047fca679c25d73c479798c4466de8c673e1b9aa739182baa71b41e879222d622,0710d8762e823a04093c0bd56051008d763a63cde5ddad1cbaddefc228fa6eb1,a15c658236485a10415933088d7a5f4029cc8c872c36896fbc44be6a96f7d62c2514a3d372fbd70aeaf24e60276feb4ed420ccd4542a36dbaaa85363bbbd532800,43dd46c1fb0234b87a44b365a757e8d7310bd2020cd67fb8f9767b0698ebd6c75102544f2c9f5d74b3588ec3dd803eeeb6aec760d39cbaba20c601ca9bb2082301,8459770f017ffe084fcdde69e2c34626e1ef33425b0812c32f58eb7b0e56373238840554c588200ea72bc331adf3a363a8e8dc9aa216b538d0d382d5e03bf83901,8a84eb54b9ce9a07dac5625fff0a3993a8f61e886e1710792f8ed4a14d64df0962adce92caa06e5b73f8444537ba7cfdd875e36cd817a07591b8b22d5a06751901,f45eb0ffe35d9b2dfabb905c817aac03d21a59720597ab977cd20362bfdea1176c7ea0ccdbe41f259b64d26d889fc951f11d088c5a8471db1d63c0da0bea529a01 +5e22726f7ad708dac8faeb17964b551a3a9de2c2a35d4a55e3fc9ed39ee5ae143995a11d07ce66c959004b9b87374e98f6a68ed084c6caafaf01d1a28513025746d5e46af5750b53477993dbf51c6864728f167809e4985facdd19e8c50c0cb9e11bc3592a4188c7f78e5e307d728c7c88b44e87d8924a393a863b4c1776ce0db3a1ef22e7952a5dff32b3e1bf6d9c05b598673c00f1628cc8e014e2a1e4e4d8cf3d6c686e29e1b4004d6f081b678fed1731d68fe6ea4fbaabf00f4b0fe46f8eb21038b9833a58a998c3b97ca7fc2d9aff0afad0fe5811bdeaa4387762a5f24665858ae7a7eb325c1494843a4911731a262f8d12a4879f371d399459ea26d584750e0192d8d5670b49fff80e5e720706b18c8c10a13235fc94a0307a4d918a34d36094d4430023,9494ed3666fc94d1a85e3aff54e2200149a07772f8c5ac28e87fe55b0a3ac6a7,212f6fdb46731c6881c6a507fe838f045d808604dab9095eb2493f6f7627bf4530be4e7b3302189b7798143e962778640a64b81cfdaa43ff390063031b5e4a1b01,622725595bf2dfd766238d0d79705980b66e35818081de0898ee257db041dc2d5666b7bf2bf99557b9b4c0b37f735d0f9af8e528768fc00710406af7be52969100,f45555b72f0155ce9917f050ba3d44e2ed8a3f35b8316ac129ddf815f1c5e2e335416665830a76c0d23aef00b454a75a4319dbea1240953f5a4a1b0d3e9a2a8901,32f5adcd1377625f3ede302cebdc449ba3c2f1d71045dc8ebbb51593e583b75b4a4149d7cfff70e672bd127b81af229333a9d6def4dae47349941eded30814ce01,3d9c49f6f158da3b835b77cdef1b099d62a08c863fe9d5c88efe846710b9d0aa59fd2f48c63e3f04777826b4c675823d09e6a790f2b26464c8cc3265ddd96c7e01 +6c1eada50348b9cd51bcb64f91cb9993bba1c2b0fe549d93fc8b9db6063345fd44362510b63a031c1b7ee998aa8f74b7aecfea47e399bf617dc27de827f3fd8682883bd254ca3f6db7546863ffd0af956de5a0d29b1fe5acc296b8a728f622cf88e42035579048c3ee9f8350ab824cb7018427dfcc3f1556bbf9130327bbcfa5807476175f0a8aa65d28175e20c3726840c13c309071bbc8ebacdef880d6893757f6ef1ff30910719dc5bbbd52adf3963336ec0995d692b7f6c6840eb5da0b4db3324357780c71bf34d333349af8c8bc96c648853ae4d41dd33d1c8a7a1a7a25438b9dffdf9e70f441122e1581e764a2f46c4495427ce54adce47558d50aab3e60251c9399d57fe429a093fabbd466cf36de1858fb3fd7c5978db6e5231bcc5aff603eae600c4b,a836c510ea0edc22fcda2d84e8f5abe58f3eeaeff1a5d92edb5f0bc4647a2b2c,7bc7d97069aa67781bedae7b4a4f4691356b2b63934222be741b17981fb2f4cc4550108485824f41aebd9856175a787d5c9de130cdfa5bb1ee61cbf75459e35f00,a43bbb96fa3dcb2e6a8459f180313a482fd128a2b5630b87f26efdba3140ab640a254f6be7714d670349be14cafeaaaaee1fabadaa42ee19a9c13d73513223a200,064a2f936ffcc41f68664b3ea8b700c0ebd1add2289674902d5d4a9acd2d957b5533ee849fa5c9320b44ab592e7026c3210f89fad5a8ea791f931ce81f92f80401,ed41183931c4835c73ec3d7469c53588b282136d05cb02e5967050c09ffe2d25390fa045989bd5da9da6c13ac7497d6bc8a0eb6b3da115a984e64fa304794ec701,0f1df361ed8df6694bec432d2b9f945344986f61b080f0916f9ab1a80887ebc5445f05d411f246565bd8b1eea5dd8882aa6b86a0954c569ad399a515f380285d00 +2d9dd401661627a40a6502226fab6440e41faaa63e5ea4c3e5a22b37fa507a3fd7dcd5e764c1d942452a920d3b53a6c5e5a6c99320d1ce7c1a8c11942e77744c2a8fd9e3becd01e9ab9dcd9079842cc0582c2bcc0e9c0f76b334820fd5fe754305a60fe96b812e9258c683b29b88428a6a00df65b85b439a893d03fd419a7395e755452e1475070a60855208897bfe1bebce9fdf48e735c1814de4cd970a3072db8453c69e78adc2d3552384da5a93464a2ee14f5ae327424e1bcd547627847d37b3c3a99ba848e4a575d026e7de40ab581691aa8f1a75253ec149efcb441556b6dcf14c2653d7c9a6ef70fd9bd286656ba99a35ea416e5e1eb856760bc15a00837c10397c6dbac975e86f59414cd356bf8f05fc07e48f5a5685a6bfc6a62b76c43d466f248d02,bdf64d4f76d48e3303872fd9243565fdc54e61f77d674bcadeecb8e46ac6ea0a,608d8f35b0dfefd7130b22fe1b12806ecbddce0d1e3153d684e263d9249b53723dd8019d23a58487d502e9c112bf5a2a1a9dec318242e3f581a2101856d35f4101,923d4355e7b13bb775c1e34be4c0217646f8b275fb34ef11ac23d7521ec49e974c7edab0eb88cf08b099de245537cd3d5fff1070c52726f59bfd9d88b62b50f701,5fb4c0798f5ea20dc552b45e4d5fb62f5fac0c58b32bddebb530b50bfe254b5d2393a946bb69c5c1994f27068907ad9cd9149192287c8458de499efe5138cfb301,afef20722ba8a72fb24e792d9a63677bcb28f9b7cf1f17f25c00d7a63b856e6d5e1f9a469c383fc4a3d734dcaa9775696b477f461d55f3c0a90c8c889fb3fa1201,f0213983c6ff9bf74832f67c9fc5438017acefe9cb9c097f305494c4736bf7c50be93d618b724672c639ee4fa30f8be8a04fcb7b311477b338b203dff694349600 +7c94b2d437de9d45678f8c9d1b27d639b1421f7cc15ed39fbd63f96f130a4e08f2ed7ae852e13e25b711a6e4782ede55be590bdb8528eb2baddebc69331ae207a49081a93a6c34d52e512fdb21b9d8b22bd03d528726bb63f549bd9a903df0fcbb1782d136e3f37fd9a428db4d796ec77ded198ddb407e2b269b5a19a5dac345a303a9e41dd2ac20078f7677f49d29ba17553ee50be5705e8b65de8116ea255a68addfa4467eccd8dbfa9787829df4dc3910fe6298f317903230857569e65aae36ea26737929d636b2ff747053e126e72b4f8c93e6a1d345554743cb209d87ed711cd81ac03d120f84e52a2ca7382ca3fe6dba2bfbb57d9e6617adf94deafca2e4fbd24393736273f0b9d750554320119c03b58a9f85aa91b58461d9d9d7867b2791717ca07c28da,3a3ac589ecf8b818d9963bb34d7079f1a84bc8e1bd5851da16dca1afa14219e7,0350e5b95c7e8a7768798ebc18128a758d1c696a3e204870aadd48cefdacb5a92459eaea7f9ca9e1ad9c5dfbf7d769de00443f6cb5ff9461482e953b0058709b01,476b2ca19367e0d8b21f4f400dd6c45385edc6407ea7b443188663c7a07630591ff908ad5c4cb6a408c94eac15613dd196f4c755181883370594a59b1cf4d88001,5db290172f4ccdef3360526635e59b908f40f58a3053bb2ac073bd0df03099dc67f191ea46597c76bc2f897ea77930e18bdad10ee2d58519d3a544d0fdf307e900,7bab4b0bfe3052c30b210a05ce704f6e577bf46b59ac9d4bfe572bec00e76c5e47cdee5d838de7b0ae0e569a3443df507afb5afc8952c112e4161aece6f61f3000,9ef9a7db2e6930ee3835b3383189208a31db035a17c5056eef42255fa24f6af219e899b8180719f8ba3b873f4c6e36ba33161a07c21c70ba3fb470a5ad55555601 +654f7ccfabe480b9bc9b2148efbd82ba9d3eee2a36fcb65c9ac353e59a9ce1c65587844dbd7cd9c2aaf207f3ddfa420c651e7bca8f8aaeeaa8589d2a4e02a9f15482f53ee486569c972cef2e4e3f4510bd932d1ec7007eb4424e97ab533168bdf2a037d11da38de9a2127a35cf76c77a970fa2026f69d9f27c30630ce21fc829fce10b1d175ce1eeff2a9f1603ffbcb6cca61014c53b934988cf1c29712822c6444021383cff8bf13c12fd8909403a800f48008f7e2f55e1581c74a5fcdce40278ecf2d249bebc1505d7b5dbd85357367cb5488c2bccfbdb39882871e8731365070a63f75cc91069d8b5de37554dde482876cd2603c474bb364ce8bcf148f19f86851676bf27da32437c7eee811ad516df12d90864b6c494cf472d53e10aee7aaa6b77a2a12eb3f0,30825f4852acb6e9865b8ceccda2820b5fa861dbe863ddd6a0ae1d4975786fbd,bb7892640d5120cb98b9e1dda562750a9f6ddb371ef6d722bb822d0dcb6d638b4bb5b0d6d5251ab466a62b4252e8aff1be60d801fa3955388b21fd28a414b10201,b36fbc8d9c9aa9094a90d8d8cf05778c9f9bb72a986e2941f0daf3853c05297059818defac741b1f8fc70d2c2cacf6e48b3d2bb388385b1e80000522d83fbb4700,106edf5c0e1453f65b18e52470d24c04d2ebfee18d449b426f3721162d478ecc443a19672fc936c7c29b8a05dbdbf428c90add91ab6afb47cc0e520509a5e5c000,11a3f57a054849a8f192db4f179195b5cd7aafc7399bad5276ed822ebc64a26e18df53de16b290f0c091f1bacba2d2b1c626a5685bb50ef821aa0ff65068434c01,671e5b96bedd603edef49915dd4cfca7771f57e8396b2928ffe517d667359c7f13b7ca9ecde3d61a43c7e46c3752f1d6c93dd064ad5f607e1fe56d0086f7400001 +897dd2c02ae899973ffb1ff3b9cfb0c7625923c527bea29059f091d1151d1c4a3aa328729acaca07ddc820ae294bcfea4ec55fc61aa0912d6cfa565ed19c9d2c424c1a0cb15ffb91bd3319e4cf356f691f67e5be6849917a4a44b4f99934a4283a6501b0bd4f3191533c949f8aded37444160952ce29b13070346a42438858847e7e05c0a3c72ea696bc19a55c4348906a8ad8ad524c694eae456bc23c08aeddbf27111ef5902f76e7adeb5a681083a21a647fff82b970d016eb998c7b24a32152c832cf1cd2cb3e0397acbd7d08147f823fdb16c9471fcec4ec65605134eeda772ab6ae8a228f64acd21e26e83895aad9a517349c8405874117f9165bcdbd4ecfd01df5df53d393a246be1b61f2a097bfb5989fd8effda19cf7216209e7271e658377e825602752,7792b2ac8bc71bb694a83bdc92ceed3f9de24ae420968da17acb2bbd1e526cc2,6443e7c6721c914544cd43363f70d76ec4fe24bda2a27e46294b60a1d55ee1bf7253140efc1bbd077a7e994d9e2cd68c69f1f0709705cec4b999e2b9adca861f01,c26dd65bab293767cc73dda3608a20392371ac89a25cfba590da0ebed499814408a542e4297cd0c4a55ac7e6d5b7f6be8f9646614444ba58866131e8f3e8edf201,e748578383df26a0e0a69d7630599df45d29b618a925d62f0598abf0ba059a6b017927658ab043b472c32a04b8067adb184bb438abe41e4ea839e7620aa8fb7101,ec5850d24ea93e74bdee6b2a290d1e5b67ded4e214a73aa7bd548e089c1ed00b486e9e1f3ad7bdaa05cfe34d5aec308930d7034731ccacc530b5f7e623648e0a00,504162f9c119f033a00d74cfa51a9d532ea673cc2912ad74d99ba43e609a906b1cdad4ff4baf356c214044c85d809f3349f75a7febd65f989d88e62c5f8413a300 +e6c7afff27472d7e00c232bb53dfab17d967daa942904ee02a8279efbf9b11252db28c35559ea1827a492e6ca45e951ff848a31016b88795bc3fe93d98139ffc0a81b69f83fd7c7f032ec25b585a2107ee4f5779a103e6de8ee8a2882c54b750941d1398e3606de5fa03ff7a464c28886ffacf68bb3b5940befcf2506c4675f2bcdae30df88ab6f530525e09bb911759da7c23afbb1d1f76da75ee9068231b50f163f93b92de98dfeeca97f017f28d0077edd75f543b7d00062c9dee030ab5f6ccc0a2c8e97da16a512e3f91ef11042af683eb368095eabf4114a4bd2abbb8e37493e6cee179f2db395dc7f2e5ea9f9d18440cc656e9720f79a987548d850958a4f284bb0744430d479a4d30066defeee3aaf8b27c8b66d3c14cb1b16c0b71be9a057075e450a638,0bf800f299100587008eb770040403df9725d2ff6ac5faf3f31065ef2eb2a04d,7e8e078f2e9887068657b3f0062e02e22d0af56927f7d2961826a4b22463b3e01347bc1cdcc62fc162cdd2efdf39b00ed3e199f63572cad8493c2dcf64d29cb500,ba4de6aacd01ec53c9555256206ec65450750f598a45e155102513a1c23bd5147b03350e1f50fe27373258ebebf3268c406e2ace6f39d137e01a16fe98b340d900,0a4abdbeabf8281d4d4f8624fc61dd4b73571b68870addcaed98c86b0409042f126a3bc0e43eaa8679ec3908e9630cd773f571e940b48fe523c3f34dc7ac757100,1c752728f90fd2d677a2ee54a4f90a6349a1796e11978e37b69342360b9aa89503a21439c27509fac9f4c93c875c9d0df655a71c498f22ee233768abce98a58d01,19a54cdd83af3c58c46e499ad5e88ba96ff1689bccaf5858203b7b1700588e3f59a4b116771bd405788cae91b43949baa51027a21ae07c65f11daaccddbc433d01 +ed65d1fef11fe0a8dfa98899427fc9fca3df0fa6553f30bb1bfe66b22cdb2d39621b4ec3aaf5835f11e8323565bde6b5add3f3f959565e885c7cf5b65a62b97078b16cf01e04e1dd5a815375e5de9972be41e7b6826a729e952d924cdad63d10715b0d84e4cd63c7d5d2407847f5f8e7fe6f6e78b524ac1ea0e5e8e819a273da909a8c7842c7b32d0beb022db67b972079cfccc7203be410c2c3b22c6a2dabef1dd0bdfef53089c66be6612410c8dd51c2f8d7bde8c13d45debaa19885736c23711cef0eb8023c959e686ba6676e39d8923dbaeaa7781145a078d93b9b6972791aadcdc97fec376b39e6ad8081d3e5e44e61266ef3822677719a13f50c4351801b6577661e8af1d0c39161d71f35aefc56f4c3b2ca500cc4e913653c7c2c5d0683bafbfefb883570,1effa75e380ce358ec0ddbee9bd42816529217507d7e88ba3e0d6eaf24835dfe,0567f5f8696635baf0830df7c86e45b24d8f7ce5098fd28120dc78d7b2b3aa083586f703f36e739ed3de9bc8349bf872f717075b2e8c55ae928252c92aefd45401,09e830ad95b451ce3cc41cd6bb9e12df1fa53ac4e9417f1144915b2fd42deb0c33acfc016f89052e1f2a2d5edde07d916caed93e85bdb57eb0eee9238ba0134401,58aefee03c269acf8fe9a529b8efc135bacdaf8e6808ac9e76776b0bd8a926b006ecfbe2a27eefaa48999d1569be4b25c8c3cf6f495bce4165a55177d67e633001,bc96e1e4da493999b83759761c964cf5735268046918cb922d1ddfd8207b11a162c631ddfcd84c66572ecc8ae841a1f9beb401142d347644d0b04a30d5001da600,974ac749856d81bc7e877ef49c1c8b50db5ec9ff935bcf8931e828bf78f7d65a6494833c052631e2e89fc28f8e47c5fefb65c5422c41584c1a2be142987d3abf00 +caf98ff3bd790b49aeb39dbf05c53e7c1160672a9ea780c5e9b81f47bcff1d8af9df9675b9f9011774a3d6e45a1578b567f0e4294f1962449868d017c8ab97417eaa8858c57c1b5f3a6c0ac9f1bb6fdd2b4515914d866211d26c6b9ff41e9a16feacbb07960c3c75a8d03016ceafa5eb4b32c37ec2b84697298093730c8a8a9676bb9145afa5dbbd616549b87fdb0f77f577b7eb62013c9af26d5fb185c51f540fd96fbc715c27fb3f43acc8cbcd979e609482dcf1b854b1ff7cb3db9374e5ab00b5802a833bdfbe71be2602d7fb16f6707ae787d35ecdd40046e279752796c2161659b42c8173db2f86197a431c9fb5f035d85f2c562ae1ac12a541c6768ca92d86b17165476725dceaf16d7e8fc736a0d80781043d8cc83590f6706c6fdc16f276c86e6cf0aea9,d07e93446a0675c8e40d9d6ba14d790fb4eb7d7550654f2912f2e24da439d639,c6ea71f1224e5e4e9e32cda2acc0e2cd019c909d17c96ede1dc069c95382d24e1c1b1880935b7da0ba928223fd406c1df962607857b3b246fded290d4a0d32e800,897136687c952b45b963f9e207fd3df1804f5237496fb7d75efb1b33c512a4c0558b036b05465745ad7b88c2be2fa861bb0bad321d4c6af8501a915128c3259000,ffbe46d32cebeb03f9c1bfeb1b46530e0030d3f0e895c6c4e2d48f8fd656efe96f3cbe711e8d489c89744e02cd1a3e60da9ddc7b956de77be5458ae78b18d83a01,a0bb8ce8add1685463a8801a63a1bbfc9ba0e97f74fd3966cd7f2f642f06751558c3ca0b4b900039566cfb8d354616be501a4e4280fa04d6788249f5a386119701,87b653385cf7f8a949270e0ca528670c7a5bc037c8574490400377eb6e4a880d1930b2165ffa268eb06e2224984cf66da55494834f186d1f40db7f813dd07d4f00 +98c7d697b5a9403ff0deff2b9c0cab5230bf1f1dbb89dec8140a75dec7c7a82adfac19a2c52313a2011ac4d0dad62c0501a94bb044164a32a61985267af20203b9ba0ebb0994d86cf3e679f029f439d1f76361b6c0e9e61b7bdbe49da3e9d4ad0c4c1054ceaf172caa9b8210c097c8c2e950f5f5ad9b031d80e91e5fce8c5b135c78e1d370e6ad2049530b4b201185117b1363312abe01a58bd1f1e339f4cc2dd785494dd8fc008c90c7fed302f9776ed615647e30d2dbe3ab1ecf7ca90041aed915571ccefde11af398751b3bb724a459c8a63422b25128b3d3045f3c24f0a9681ca2874419ee57681009c50735f8dc14b8fce60c0032d61b5ecdf6965df5cd113342b8adcc2a38436020f00ac957850ae4b88d4aaf484212603b452835973c7143c957cc6b4631,ba86fb765c829db7cf8916382474ee855ed22839554dddd724ebe14dd6b71bbe,0fc359555191ad68bde3d7d2d90cfa48878df42b90325b9752ea9b8cbbd9dac03f078a11f06f14c15a184e15ee9e73cbfea06c9270aa671390c5a083794b411301,30f9f78c6ee84fd3bbbb08028fd95629cfebb35861cb7233dc71596bc922b8b668acd05658dba2f1376510239390f430d593204036d789b172485ebffd36f63c01,2bc72e75c369a94356192d556f3b3e695df54bfa4aed953301f9612c45237937525c9979846321165bc894534041c847eca57d39e6e337f467e61b9b2b50421100,ca1fbdd7f7405efa80658ad50313c95aab800f8e53c7d0305d54f568b0d00334538faa07b3834df70beabdfe8176c00a59008ad3ee5c6cdfd386414b467b613000,d022867037670a9cda518d3bf69d759bc49eaeeab87634a0ad37eb427d89afeb0876557d7d973d6a713bb9610cb59d73f31321af1c7776062b6cf3a9ebeba4ca00 +87bc60f6673124ed5fc4aaf3554b6c46323fc4ef807509aa1dd5b09e9fe059f4c79e5fa67ccced5b3b3ce84110e2189be6293239206fcd6b18ae35177cabd65ed767b55594c2dd06db0254716023a8dfe82a087457e8ad57db5c5629378df36002a238c59abe2443ce1c97fb2e926340809ccb71505c2552a4b04b414b91dbdeeba42d343b6bc278585d23a0c9180b41fa8009fd604328d1aa60cbbe6fd537e61db8bb9dcc557cd063fabe914300a702ba47f41e4bde4c7b3e0f18bd012e2c771fbf4fe0e99b7333fb9f3a912ea4a273f69c54ce9868923b1cbe1af4f924167f9ac7d34850dd63f5c0e00ae4f001a40b30e145c5525fb12163e5f41118ebca879bf22bff3839c2933b955939dd2f68da6bb32b4bd676101c9b95f1fcfa59a2aebb2f12bc6feadaab,9e3afc30b8bb46f3bb7c91a310c00c113fd6e30d01d11b8a6e9ca5f8406f2342,9c7dd4d6389f9982db7724ca7533a8a3ec94906ef807364b0493e6c830ff9c6e30b45d98a615ee7552b185c1e5f7bbfc3a8c35e9df24b66492ce2dbf92815aed00,7f6f173eb7cbd96fcfa9dd7030b14698bb4f2d3637ef2ff8dfeef28a751f30a670933a6a11f93e1172c2f4cd4779101d84dbdd99f83def46ff6f652b4918ac4a01,b6f81ed007fd703efbf44e9ddc4c375b95253cc83744830347039147917fd7d1200a777e567c8b573620e2b5772892de0dc4d63bfd572e25533ed4e1e288e4dd01,44561b5373804081e8b2391cb0f80eb7e519b5dd64867a0062dd7f8095f6951b1c2e8cd67661d0c2f82464461811c5aa46975c51bbcbf119634767ae1271643101,dba7d83bfd6b3ff4a53ff4717c6a418b288e19814a7643a4bcb9193f13abaa4f1f791031584312f72379876c27303299cecc62cec5f0176910b1e5670dd432d900 +ea594091858fb3b255949c7794eb0448104da23a525638bc2c94026b2716e53e154b173a32b7ffc043126d17a16d631a1ba8dd2806afeb4d257fae676de3eee8728ce24ebea2071e1c4d6d245ec4ea83eb8142c57199ecd4abd8c33c335416b0509ec4bf1010f572f485219058199fbb5a74b771b9d9417c7505167a9e2e4e988fd95cd907f8032827eafa6e3bd3b09babdf78ac336b6bd7e2f8b6ef8bd57e06edf0d838f4118789ce9c37da3df82cbe769d0694a43884861f1eff6ccb7242a36950b5a815292e3dc264144aeeffc4ab512534649fb02ad7764f5adf77c7cc9e71e4d9cde99c0e3907d22e21dd96885eb5b0ac9e5d9a86b7fd287090a64aea9a9c1ed8becfc65111752b9929d99e3d5157471488b9815d9477b18e78f92d1086b40887c94264c1f1,71f9be732301b43f8a60f8c934e51a8fe845655393be794ea3d61fa5c23b67c7,d02089f0e12235813161c756057d0167153fa508eba1553edb02904440d8fc32631fc4ea784e533db1304e57491b720112c98170387f8f6242933642a76f4b8e01,a33c046b8c2b18af1e5a63138289d9457226a723ab870edbb2fd972552cf592662d769742530ee58309793dafa0e2d8a301e727e7412b5c8e8c8edce6906316301,bf4d39a8ca3b59a6b0775b473f2a62c03aaee63909c40fe49edd7179707cddac4493abd8e6ecdcd18cf8fa8b78ed995630cf9736096e13e113b71eddccfd89ba01,55ee106d79a5002e0554b5bca9e1b1f17cb6db27b04ea46372c4b8faa241af017066413257168bc5e8351a44c9151d97c45e72128aa606fd2c5912890b0b624901,5f565e123fff056beb140e6d2c8260d717d3c1391e2decbfbf4a1f775155857d309134473bcb9adb957979b8d321d87f86410c0cf21132d1fca1df83f4b2daa400 +cafb9f56c663b21271176330197e021439a72d490dc433c25f9a6b25dc004ffde22811b71b487cabe37252c9ed0f6e052a1fb2cf27f6897a8866df0531b86dc5c7ea1d10812b73311e066e9c9d46316dfe841315e39f20e01927f8f2e1ebf177e06fbd4cadbda8acc754d48a3a006bc9ae279ad9120c80d12abe27e7a86a33ffe9e5c8595d48e720761e4e6a41866a0eaab034bfb894d74418ce8b981c28cd22b28bc6a28aa5de0d57ebfb8ba10adb9f19c68ad92c01b57c6e6c5dc378303b2ba1bbd6778287aeb229a2d90df311fa88ed48e6d642b8673d0d88105f62c20057797ae695061a705997ff9ee17cc7c595948c3585938681ec7fcd13cf31af9d8934aa87a7553fd26dc5e11d421cbffc617553736a3427be24b206c55e092d6b05faea2c3ecb5b5f94,04d0f97c59aeefe19146c15aceaf1e7ffe1b2f1837b058765cd5228f6f64efb0,f9b73d83859dc272a232740b65cbbf5b0fee3d06d0b02367234f97179a16fc0b639ad17c6a3373a668965c916eacf2eebe1e6dc47d3e5d65ab105e98bebfbc5b01,f12651b37f37d6def60a8dea0b8579ae79237ed4dd3ba07c97193cb8c83cd9947469e8ef62dfbdcc6b81bb65543aa842960d61f6916b798925e01bfcdc4626d001,e0f70c466f0b19acd765bdbbcf7e436f489db9279bb7356c6412e61728870c672048725f5a737bee85caf1db3367430b981f2cc831d88350fed14b81330edc0501,59e23d8563cd3e984ace42c925d5161276d2405816d2a85790491296fa17f4d42abdbd2eb1e0a798a53308ef0403d9e0f604cd8f414e352b7e6993bdf239748b01,7826539c7b48df18ecdbf50dbae7221a364519f0612c2bbdb067e4a2512992fc34c70f9cddb8bf43e2ba81c1eb11e3deb2f244ee7cc189bfb56600522115a34500 +29505a9dea54ad58329e4490c7cfbe0850db914e96ff33ba28aa160c90da9ce65d21391da3742cef00138af3b220caed5011196a49ab907371b7c0c18d92a9f38e041427a734a0b6172d2348724d334504a2a049519b8b47778e96b683b45f418d9ad436786b65a07e4f9c4288725cd7bca025970923a5447baabf37e0210dd400f9ceabe06d0d18d62a6aa32034eb4a3eee5264dc4b87bed26132a4e2a5110fe593db41a4f4623183b21082b490c0c295b34e9b5f25d219b33cb992f010eb6cd199b0ccd5605821215ee0b42cdb25f59ea5d63021a076c06887b5c50b152be34df2af4d5a532f0da75d5aee8e5dd0445c63a0def521df8be8c74655b721dc85ae02af8bd7401053fa35255c23a96986dc87c8193b01185530049a56ba7d055d11fb866b06002dc4eb,d5af94980f45e2e0de52da9515af6a1f6dfbcb3983a475416ee03c9f2390c6a0,23f190e060b91dc7fda2f95eb7291c4f19bd122aeea6c96dc5007a4195d4ff892bd2d706b1cfc7c0c2ba121e007a79ba07fed343c427ad0cdde667c7c1b99e1b00,09af7ba7c6fdb63431a46d1feed2f1bbe9c6604a2c69839cd002be47d8dbf9572c5f55ae63ceaf15c4009604505cf0a8f882e11f77f32a63f9df1183b005464801,1669bb8b869303a5fa3f4a8139314a75069abedee0f86d330e6f9935f56182ee7fda2241d1551e089bc7b869842cba5cb66a09f77d33b03bf7992f4c9c9ed56c01,8a7808243f05f3c9902a120856c615f0ab9c9dea0df9d71b1bc43aad5602300257deb32a8580beeca6a61e372c607075217adf8f405afd1377dd0c9d10a7568300,154f0d33668a3c87c9a821eadcc30bc4aa753cedba81d236d53972d4c75e09067be2aa7b996e3fb5080274b4c87f9ccaf28262ce5fdaacc05eabcda50472803701 +849c5f61f7e299a5e7f22430a246775b5b678e852a2e5fde5f49c9ba3744812541fb2f0a6c0c88f5c227fc8915c59480dfc36408f0188c3e80ad2d7ea0912de3146277ca1afa48fb038c4530059968b32a697eb1dbfe95aae070a92b6239b36d8998992bfa16a898d3e7becc22219cc5b4f07960d39e352e482b076c557dd85f2c0660d3a0a98fe288da73c4e897f7d38817ead0804a35feba4ac0946cca0c07e9030b44b606603fa7264a8e1d6eba48df2732d26c050623741596c7b25b969dfc07cd848f139a89eeb9aef46ed1afb31ee8e020ff0e1640ea8dd1cee4de6ddffd10e85dc280204a05f6cffbd866610785119a0cbe56463f5068c26b74b0f2565b3fc64d154c4abb93505525736a40e7b3f04a56eeafd708f9e46a4f739e07f50fcbbd4b68dde883d9,57e9de8bdc74f6e03410ef050cda074db2c69d108caeecbfe54a0a160b35b56c,a6c56273bca289322fbb367a07539e2cb1306f745b4e9e87f69b4d1d43c6d1546209a6ff702326b98ddc96abf339c994f8ee7bf03184625c97181d01b59ca40d00,7cdd389d804b6800f0c855e45d96ff281e90d185665d05c70cd084279c1071140b567fdbd10163fcfd86382403508ab40411793b0c62b4029f8b64055678069701,a43e9a7f703755f7279d6c6fa581579244d87f9041e9c5c8642b67ab9daee06043db36c1bfa75bd4efd669f0231fc613dd89d2baa6e6b4a56f512f223fec701000,5b4665a772f947fcca0a86815166a3cb148142db6c06fc01ef3877c407ca4799661da265b1dd88576918a7ff69b514914a3d92f562b01cf31e6ce387f8a704e301,71bf33fe3489bc07baa4997ed58b2f9f01ff952db5f69bd9e927c31ed16d946050d3795307ff1369dd2a2a8b1507dad02898d8b2a25a0277a7e0059bca7a6bb201 +44a77b30a1de814be56cdf6104b397a3f4413959947868655480e94c5d64a2ed32a935eaa9fb404aeb91754950ba32ae42e8e6baeec277d42c1b2974f09c2f11e2bc06fcd83f8ad378c3e7abeb202182a7d2b0a507a8604fcf4e455b7cdd476e65c96c15a1a505ce937ddeaf85ffe9f8c3f313db65813b5351de6966f7280306f8eb1bdf57c7ebcd22b05dfa2e685ffeda76cc77a9ff34a131dddb9ee09be01d84b162b10d790468d9fff5a75a356e4deebb3177324819ccdf92c780603126a1395fed94337d84053ef50a4ef99116a7c866684bc691be72393dfbbe01856321d2ffedcea92206c18ce200ed8a7768f349ded536c3c96f79e24cf2059631b36e24521db12f9cf3e2b75a905705f680ab282a6372bf26c65a86dad6c7ccb67e68aa5ac78eb71c9e50c7,fc4052f686b01958aec03bcfff1f4d0175d96d99bc626c1fa46385298cd0d0e1,f0769aaec2063c415eb10959e7e091000efddbfd6e5ef5fa04f0f684f689a88c059548e01c610781ee6924ccde380a6a62fd8fb35b1b4997293770b088b575a501,a2bafe8969eb50ae69fe7ae7c348a8ccf56f6e96ffefe358f07c9b70efeb9c14145739481763bf488b5b07882caccb0b118f9032b138dc367f43cfdc32ff733a00,8a411a54a0f9da45d4e5edc813dcc97f3350a9640c6a94a9b885e31cb904b0db63f3481f74bfd142cdc5b201f842a3bea297a93b4929227f62ac418a79c7590500,dd78de9ad1a344eaea865932564c64f3959d713fbd7ea7e49ee2ad33f989cb70600666e2e26595de18aac7e0dfcbc8d7f9ca364a4429ce5cf6e72e286f1f332401,a2340464288634a7b8c0db8cbba3c274e75d392a85369e9d3b0ab27ba54329de0da792cd515776582944d9d82c2f8287d70c10bcb19f78a62c58e8aef579b72801 +2bf0e1cbbffb3af32052658e0671cfd60f982f0f4b4cf9239cb2a605631a9836d5bdd04c871b02efa00c54eb0e843b145d1f5cb5a5d6020c2b70d8a836e97ba88aa1a2b62efed32aa4183f9367a63a81c6f71124da947a36425149d0ee764acc04e1a1339428b9902e19ad02523828a4114a93c63d5eb4c5162d4128c29b5f1e5c7e152373c499072ada404154b9470c177b255887a7cd389275c4f841a533722d5837cd69627155152a07be9babbf9f3af583c384ebc25fd15d1bb102e12b358c288db1198f083045b8f0525831abf2b3d4f8a65bc8542b7880369a1a35086e1a6c6818ba5f6872a09fb69c9ebce1732be157773655bd49810ef50eac9a16f67ae1affa806b0caa9b9459d4ac821bacc395f56996b2ce44f5ae2b05ac97d2a5cf35ad981d170ebe37,c616579bede2f381297759a2f9c857fb3e8852f88e21ca560f6526574d299efd,73a4b3f4be3c3d54b6f3d0b4aedd08ce4e895bc4f70bfefa1b318dafd75275f3041fc6e3575adbb145bc17cf4194bf0863d399e941b97edc75e5d988ac47a24101,ab4846d7f1fa7d769731ea5396e5c54f815f1da00a753ccee1bc073f97fdbbe8668afae221bd4e18f43064484687625d04e392ee74fa78d77f136039cb58f1a700,d3ecec4181263bc000ca36c70d0991c67995c8013ba0cd4797452f8892e0eab12b447b942926d3760db6c9deeadbbe904a5b6419209a42f5cf946937dd9d203a00,1003223771439d6c6272d3c01a2eabd92cc8dcf2cd9a9a73577c9f669c5b36ed266140b9cf596f0136b1b7685ef80665473151639c946f3acb6d967d2a0b186800,098bd01866d51cad22ed95021ad80393b2397dca7cfe5e8e927598509d40fc0b33e767ddefc0e5e501b6ddc86fc83473b575592b54e7cf1c06dab3eeaa82790700 +a374fe5d41ff76fd5deda8e008ec135dfdf862f5351c70a0e80b56317c70ccb8dc8d1ddb2a63fc4d6aef6cb28caf4e6e30f457348d3edd262c1e9b0d226b4e696bbb65bf1517d7d00db3c2e1b9eed2a9ba833da3aa042dc8758fb5538f16fa354e5341d1398f35bb39e8c61f302b2292d681ea8045a8ad37f85ac574fc93f5d37c66810526711e6d77dd11abedf24ce9dd232f83b8b0c386cc1c13ef0cac25784310d5217ad3acd7a9f4965aaaa471be2780ae6b3c1185d5027866dda1b1b42a8e6c323c203ed51da7ddf6e81c23be28f4cb6a2c7ea881654584c5a0db657a0102086b3d98bfd06c2ba0f15f2887dcaa6a5529d511cac92ac572c38bef3f337abf06208b1ebceac817f52393ad0704c963c8aec598f3b5f3d137a53f2a3b1aa445a56c55232abf0471,4bff75f50acd9ba8b76d5bf6e2b88351ebd46d32dd855d3141a0a23721e73b7f,fbad1111aa88a36a41ae9f878de93878a5d237b1cc5f52a9e5f4a421136e7acb2dd23f6af8dd40ef0ad9da33815805f871a902c37f19a45e5b3b9ebcc167a9a001,e371cd96e3cb57615945266eb787d81f48ca5cc43ccf95257724cda5796b63583a92592637e86ba658040aedbdba096ec24e6d808b89f74615cc66551c39b74a01,119e585246a2fef58abc386732ce4b8ffc0be1e262a2813d2179be895e1d4bae0e62a96c96c7908cd78f3d7a6b54cd69cf97e09820fccbe781de9ff5130d00f501,86d97e7e99f8802c151edb1745f496b6ac13ae984bb24a08babdb95cdd5f34cb503740440a7fa9f377eeed63256d21148a58ffce61a2172fe105486bff604e7c00,bae8f61049572311ae4f1b9a46d24500792bac455e899cf11c9248fefb75940b2a7234e8798fff3ce913748cc55a8eb1e7a0c1e586fef152317dcaa335c1117a01 +b8bb19c1b51aa049a572956b5153c162dab51a6cdaf12d0ca9c79efa8721fd1d2251d7196602121b7cce390cff1782581d352f1700511665fda500dd7d746316a0cff6190016e8884c2393b8fe10d5768009a0c204613b86c32d6ad02f4d44f3507e5fa1349fb01647673896e8c207ef794af0e3dd7f2a6dfe4cf1ffe68b7b373b455b53702e728827ba7556c8cd4931e59c5e1de9c2fdf18018b10ce987584590057ba548278eea0b1a37c65aa3f76d9745dc363c1aac2abb40dee2efc4d2789741f41ffb9392f2acd6c3a95063fc6693a64ae58efb86d5733fc374de0cdc27ec62c627b5b449c5021bf5d32f90ad71cd5522f0fde4e5166211b972c1a32bd5f6b82f689b0432be7b896e915ab2bb14588ec931f3499e2534b24420d06e10ff6c5277648240d26c76,52dff7ba04f71d3cd4e6e7f546349d7ea237e8ea1d9318c257c87a7efd13f6f0,953cf92062d944d319a7d9e84feade316f1b8db6cc38af38834d3b5e467dd32d691e0fe731eff8f7615cf43bbaea038e68c86126dbf28e17b1d608b7729f1caf01,3a2051862265647af5caedc6fe221b4505400a0a09d2903e9dba68e575f9067c222f032cec009e317f0f686d89cfef748d4ca0a6f70c2e5d3977108b6216695500,897e6e7a59032361ccd14220eebfdcdcb622d2f77cb1867c34ecab44239516db5247aebf954f640a517acc2aa23df2df93e3bf226e4b86d3992ae025d980786d00,d8c1055b416b22b344cec0ebf1fb8f05f91d98fda33b1a851646e3bf68a4f9ca4817a46e8c07172c11a421a16fe273f9aeda3c0ae492c3886e434a03189fe6ca00,51ed977224f5ad6b7dfede69856e727e9240447273b9983fca08df49d3364fa5016506a22c9133b5f19fe92a520c9117c551fa7610e4012bbe55e20ce4f11b3101 +55915151ec07e7c645edb077960393fe942960c0867e1b3766f85a03ebbb562f46161a9107e9b5dc707ebb339423741b272eae40c7902c13d5af9e122dd6b042c0b1b411c73e180e284bad3057b5a130d8463bde839a68bfe743021d5853e326fd4f93f66845b3f7210f78d7170a80236b310564134acdc30d3ad2438cd6bb82a10355ba6732b8ef8a043dc9d4f813560110e66e39847e1cbb3249cefd75f7b1433c45d9e085edf54316137f5659d5fbd05687c88da18a6a9235a38b49aba45e2038830ff6205edcf82f0694fe0956a8b4b7d16b000131b70e7c8506d7e59b238bf24587a9b4dd4f74ba5038de1b46b9c8fcdb6f39594e0cc32c8e95ea47792da9aaab4febe4dfea47b17a162c065403573e0fb6aba1ee7a32daea2f36a7c7bf84b00e32f31a11f4a7,2576e5b8f9741af5d8683d528ceaa903f83d19351eb5e96c82c68a93c93a3cd1,da3140fa9120df2d6704d4d89bc8074f98ddddeed6588e44389b042a0b9173ff5d43ebc1ff101e95c18446e50a4accc9edacd5e32216c5c872083104e0cdf0ca00,28d817df3d38cfb50c18ca4d10e240444cd1edb6b3572d93c1ae872d7df858190db86bbe91e85cc4f30b0020e45cf2434a04fa160a7ac825b6ace48b5836f74901,bb087f4cf03baadeb3332e570e97c0d744775dce61fe4a3225ce93e9b649e82672c0c95188eeebe9b08fc01327432e634bdfec85808fa3b94869bf344395a6e700,c023f2a24d44a5af678f5e1c2994b5c99f2bdff45607a41cc3ef04b106b29084365933169c868800a6fdb421745f6490b7e99aa5af9255fce7fa493c527fe6b701,853d83a795985e901ffc1b967a03b5d6f955bb6ccdc276f719d91d767ee189a9296d6a83b7df360b0a5f30be41b42c984a3ba17edcff5425f072c8aec1eee54000 +6e324ac68c2dc2e192b1661b0da49b375f4116d6d5631d7f37135431ee3de4351194ea41c3376a65c45d6e40e7d3448296f8f08b811d3d2e06a07b35a61752663ec227c6467c5d92fc3631395e4b100bc3b0e5167845311ccbe0c4269cbec0f04465d03b1293f7f7db7931acf980600d8acfb71e6cbd71bd4d473424ead1328a19d200aaaef4dbf357820282b321af1fa589e4437fe9eab44f6eebb940ff3e48b20d7b9a700e575560588561d456e181c3e469306428447a36d98cbc613c833076140c73509c45bf871be6ad2343a816c6bbf67f62b0f11318100000498d267884dc080734a4655b46361e0c664027680e921f7be82a9feb0537f10a5cb696dd9190a1913220f066a960ab90fe66d9e409afffd72fead10f7a9b718e0051c047679f18952da5f868e1,229c8b5b249150671d4312552e4989b5fe1109caae74eac5ec2824b0eee4955e,c475b604134b064d6a69318b01b1a1af5bea85c47472237d509f47d94fb2fb372f2e5acf5754fac1e796f90ad2198b1b24116d7cc466100a813cfd7047c74ee200,208722119a093bbaf77fb7c906bac360206aa9c712a3ddd6b3c98e28f110490254efd1ec09adac7fc16adc2f7940f1ae4d8553df39019856f3785dc626f5f75a01,788111c7d178defdf97e2ec243139d96e3a135d88bb989b1f55056c198a644c3177690552aaed87cd63d11cbb878336fd71751b632737099914fd966194f7b1901,ef3df760b17c0b352ae15b5c549fea3c15dcffc9bac0a1e420f16a0427a943e26ad1078b1d3ba43c3acb827c1211b73b37ccf03a4e9d014f61e948413c537b6d00,8cb58dfdb991c65cfde3287bb229191a5ca7af695d027cbea50247f8d9c4bd9051f91769a5ff45a36aa556f61ccbe45e30b9ff7c8e92c090af1dfeb2b7c569b801 +6f7cb16fdb4e5414839d1017307e1651b88a7998dfa186044f6b22b1674a8b05f5b6d8dfac0a8d5fcf47116924d419dcea868243a94b6a442d938832673054ed664763cbb736b35721dd63f2ad5eb6ddf7e62d23aa7f4b19178358ab2cf98862adf925948f7433f6f4f255349600334ed15fa5f261fc4e63604b83bcc0ade37962561f3bea9a76d2765625a301069b65b1d54bb244db7643e1dde4f984ea387d3f10f7728f10baa12e9ae35fe782683682421e3641a61b40f60541497b6e5d45d479212da2b66364c07874d6cf1ae8896ae3829bf6951cdfe0b8f551986a32b12f95360462409842327f27bc5082bbd4c301ed809bdd7bf1dc5543be249b1b1437bbe6420f0c2f2410c0316273eecf1c5f2de0dd104070ccced7a0b5ced0c07ec00c736a85de02b394,dbd82ce048dde4547e991bcd92f46311efa11bd425e694b4f67413e6da79d667,181a8d983c6aad3c4646db0cc0e10339f554838077eef1d6460c093a68dbc9095285cd6596b364e4fd99779f8acbe3fac7e4f79c67df028b609432a202754ae001,f4b66d22300c1c9eb611a37cfa8a59a0be70d12f7b58eabd75a03f2685dbec3155e6b751e06e6104025d5f7f289cd5e441f7a806f39c03f29dd57df78caf57fb00,aa3fd063a50cadd51f538ba01b9fc5ac6a8f98685f27cdf4a7911e54755699d90faae91ecb48d639201d10b07e99c27357eeb90dbc3a10a1c8d20e354f9fad1f01,2e14360289d41658c346e88c48cbe655aac9a8b18460c7b08f681f16879e872306b9bbef60c5cc34a4ef90c320646611d118e3bad2518d91067e41cf154f853400,a4388bdd5311e0118a65d05ec0a3b552a0680eada97f12af0ef669b56a68577318b42a8e488895bf15a1bfc2ff6f1e8b3dbf10c98f31cb47e6c4fff79c18135400 +c3b6d7e29c24472e98e827ec8c6a76c726b8afebbf446172ed6a4fc7fa2fea469589a76386657f368465bda27e02c7bded27f90c88cb180e7cd8c909ebf9e26ed176af1444487624e2c1e54cdee39f4c5fbe291e89288b46dc309acf6975f5b62b2eb1ee00540f9a706a53256a2dc7a8879103709f6e8046956f152f7bf4fad4dd63d21594a2d7656158e2ddd24986be5b9af6969f76780604d51699b2712dbc029e28e5dcdad4ae74163495592f91217b605cf501c447b4a2a29a9f5bd873648ba0dec49a9aaa37f881e0e17a93822d1731ce1aa7bb5de3784d922b6606b2057c25bd674a5c0418764b215ab25dfab839ac26ffa28d61da4b4e3ab05696cc2664d9bd2d842f6efefc32d03d4fc68475abda7511fc4cdc75a312dc50678197df408dd80ce997e7095f,f2f48e13f40ef5c93f415d6eec020ddeaed28bc82df8976be20af760760ac0d9,5a82a9c79c9c08042dabb4d863fd067c3b84af289b8b40741f796400e853db0f70bd8b9c95208d732249c4aa51f9e1e6844ca7454b62fed91beb5156ee4f8d6800,d4639827a296d6ef11655c025797db72ba587ddbae512fd61e5af3e86d0e0ae93e98d9d5f73fce9f73b6e811a134005196a395c31e5a0e32f044c7ec0fb7432e01,94e3b77c4234b093211cd382f0a1e733ee752632ad2ef52bc51461ba5f84fc44013a7e30bb72a07a1cd70f539b43f10cdd82302674089383ae3673b01a9b5be801,19a42aad58dedf48ec77f20b579108f0f92a4ca816f186e76c0bb3540fa6c2a811d152edf59d8e9611bded92df21303230938b4463a4c8f5af6ade91282556e201,af1b701e4ca286a921a5388b6c0188326b141407efefc3fef564652b872ffc5e5d4bbd81ce6bb96c48d93fd1f42dff4171497a00b59d6d9c0afef5f3b7051e7c01 +3a95720993c0afb0afcedc896ac29614ac524fb3ee144455d0e777c6a18b9e5597a4e16c841705417bf0df5a519b99166612a846567a00f31c1b1bbe9a187a335b6b906fbb226637f1931b78faf477472664ea0a4191f4e4900349625ff84b42447520e77f00b34ca87dc6bf12837432dd50331bdc25926f24598572a25c43d062c2284086db707a8bc2571dce0e5b415269035ad2f10e694ab9b93e7ed624d32b428adfee8f0febfadf43ed0c3ec47a51bd8451c051e788446d5d653f8547ad59ad764fc906c60731846f1494c8d486735f4a782022a293aa5a1e708d840fd503ce124ffac8be835b6087820b4e8284c526da8b093c69738da26b51c30b4e41f1905ed86cddecc84d4a406f5f4231a810f9f77944a785db14c6b51a407fbc0af5d1240b7b600d018427,40ccadb7b97827fe32ccfa1cff81d93661e8f61d7376291e08427709a2c9f7bd,e3cd8ade5abab377b392f5c180019ad76f7477deb07e833157b8eb62501792d9356e39b2af79dd6f2ca059b563f39309ff2b8d0af61f244b27fac40ac5145d3901,c532721a1712512449e30038d64f65d822aa1e49950b874d423254fbbe8c119f732ad7e0edbbeafa9cf4b7828cc5a26706a00d8acda9d34e7463a13b663aee3001,615c31fd99ff8f0f2ea571a5d6e53f370e8fa2564d190e78a332e66e8f2711c64e2d337d06d3089307cd79056789de7c61f00b2136cfca76145bfff32d70dc8200,ca357855fc1afdf9dcaaefd642afdb5c12a67e41a0e5937f9e3c98f9152c0b333aa4e90d9647d7ec711c2f9ca72649e1ad8e01f3c1f86ffc782374f98d76722200,8d9ffd8e38cdb8838fce48f6cb27c53d884793e090438e247489e2058b3e3c33660bcb3c8e229da1f84f472d8a51ed3b5e47550b0b89f94f16b20ce5fd339db501 +83f4aa8061069d64583dd73b879d7536e4b1b163a20d26da8e06c3da34f9d477bce913daa4f21a9a722c477e8afd5bb28d34213a7e84b41822c508b67ea2e2d2d5ce99a910d9dcc74824432adc7e88cb5a81e5d0b65652ad1b53674f5f9e98784fff7ce0e3fa8f65fd2b44de23c89f2b9581c761d91fda395b5f31ce0382df381494fd733654c3f6cd2ac9ebf3d42b69c959835d46b15c8e79f81b5d5159290197798e5f2926e521574a0ef660fa44697e4a41b4026535bd7be4e7bb192a539ddba2863fc7b18a38010aa95c76929e1d9101f6ae850419f3fe00b92d9d99db5533a0cfb3650cb9b431ea4edd43e38cbd16d49cee0332a9150e160f704bb7dc27e96ad0ca3874fa9c52f1ec06afe0b77de4d51aebe1350750862379c09c45b80cc14e675cb4013ab89a29,fdf6182410e42f991d016eca778c63ea401a61c8e50ff5153ab1f4f2fcaa253a,7d57d5dff1d0839e16007aa9ea6e45f020f31aecb398c950a90d2fdc4c5d2a01568f436cba71be84773e64035c5750c25c8df329c37fa565802d77f13f7d684a00,97d1a109d18e622880f8e52f23e30a6e38dd88b2ed12d0555e118bd686947f8e30ae46c7912d6ee031b93082a939ee1d5ae3bc98c172b1b434b459855a11051301,ed23755f19c809bbf8659da812f718e078888cc33b82033d8b1132438a3415825be55d3c1b530f4f539e95c78ed43441135aa199bb4fe3c2c0f09448bad55be501,938b91e4f4f07e6e7901d0f4027d78b8d814525a4edca48cd2a1e842e6c9f52c413672503ed109c82ff1a58b833bf5fbd8654b85dd3f306efe99d8adff59992f00,de69494d8bc6a93f6ba126236fdcb464025f9c58b802131a3b0bd1003e1e957a719a2f00995619033c8be7aa024ce9453c0049201ee01ee4b3cfcec830714f7c00 +715d97f6e78fefd1d691f0a905727d734c81131a13dc6b49a84994478e19b10c4ca8cd6eeba1aff426dc6c801d5e077755b067e7d5edaf99f92fd25dd7b3db51f7d53c5b0cb5513bdd1ee3ce258d4821c728335b191dfca64b028fc67fc3d02a7520e47617ca6e9ac8b127a34aa9b64625c66aa3b18f793e6bf2c261dd48c1245d98724ddf14237fb952866c7d54550e1885b1f4b6e495f6896ea2f356955ea76ee836a20b25d927763bdd54db013965be1f7b4fe38f51d4db9a779b1c33f427c6c3802f3b20cc2d8c26753f0309ed53ba3f76196d67c1a3ee5d3b8f62b0426bf436efa3d084531bb674439e0a6908f45b2bdc646888230094f16192d420b25ee404ce0dda72121cbfb8ff637e6551b0f8421e8e02edc66c5b48728bee57f8a8d3c41bb575e16684bf73,7dc1ea4f3c75b0752608d00ebfeeb454f25f155d3cd8f0708614a43c3a62c67d,acdde99b3464f8b5cc5ef40ea5c32a2d28ed528f5cf503c2e50e07621924580840340729f09649e0993cdc56d3c27d754e0abbaf7bae27ea5736bab66a44021100,a725338cb5fca0d4a83e92b62dd71e422108dfe38bbf076f6af391dbd88564964b566acbaa655427b187d8d2d031e715d0ae771f6b2fb640e255694abbc559c001,781ccc1a04f6e4e89be7b0b811e8919799cb476518b66e2b0e17839dcd5776085dfb8fd457e4401196567268271fc086884f7e4ca8ce97a6d209d3dbfc38255501,81fe8682fc4113992b768b289c0c92a51dc0aef3e7a277d6f1220c79a81161eb4db5f7d765a058718ac7dcd00424f9466a5149aa7d96b97be93223f0a6ebe78e00,c0bb2bf3608fd3b27a23ca07c509e50d9de8b093ec2589acc5986d25a9164d292ea53e1c3a733e954f97d053c56ecbd3933fbac764332749d9edeaa1a3a8cbba01 +8d5fd67121c27ba75a949a44335a94d17b88f0dbd89082af36c32a730935276013c66df1db7442017c1dbc725df36bfbe00be4979e72453ddc8a43cc7cae721b5da78c9c1faad03510f19199ea3aa0ecfddcf55d8bdcbb991043e1de4305319556b6876c5e6fd36be83287ad8abef9990bb4c2e93f1fd4031cd718bca409d4ab647d415cd8f9453de41542a336e38d6a172ffd192484310748917135dfdd07ddb8b03dc47a6f3dddfad1fd96e384c3e504cb2c08d46fd521c4bb48cb16a74411a63a3b63e484061d9142a2d82103a157ad5cb905311a637f1a59560916db20147859cd8ccb0c21bab7d4252a02a74df5d055cd61c30dc005effe6fe80062b6eba7cb71878385c3100b0475e544b9bbcef2359f434cbef002f33616c8181f69988def15ba4a701d0cc485,ce0b1a2b9fe0cba5ee0f615422c963bd0211159cc8de4b8db811eb7fb791c877,c37701e9e2d86c5982a14812278e1014f9b523e74d19676d1772e36b9f787888639f73e203285fcae386b46732b01b7f47b84e91a772d9c338023da99768723000,7c3f8d1208835c6b3f9c6521a3ee91596c1127e38d3af9b15a400c8d416f91561b8af67cd11cebc7c8c00a9011afd9ef6abeebf0d11307d9c00d0c67b842db5801,52a15e33fbf6a7f48f26218077936e620225d8c701b75d2edfd751fc92db9beb1091af68bf2bded5d5031b32b242b3a2a6e411a8a4c87f4c815e3a4c796b895b01,a1a3f9b7704f25063bfe374fb9f75e88a25dd60c600ee53f7d571108ea4d2d8839ae444fe0a4c256ba67163f2944fbb8ee85152596037efdeb8ecd989c8a971000,2ebf1b6d32e6571ea27599de3d2b2b3b011045eacdc125125b671b83fca5bcef5840d7503736d1039e94b68bd630fc03690c30e247be119fccfc247ca12f2d2d00 +af647c5272dec21d7d286ab837acb7f0c86a3e5b486e8e394fb47f49d84eb406435d7de7e2fb599c4a1491dc686e17768db40752e8f6d81568f992203f5cd6bc9139255a936ae2948a9b9036a197488a8dbdeb8630ab72695ea5304182a71f801cceca829e544ab30958bcf4fe91f721f175ff36e0abf40f515cbc2242a35112a53cdc8090f66e0076e4386e25a9ae0640cfb3920096dceb8e119ceadfe2b60d81c21920d0fde758ace4625666c871a242f47ef8a3b9fd6a2b4b71487823e6741eacba96091beba2813c1f1f54ed5f7ee1e4b5efba77d87056f1b0d26454ef18ae8ac4352cb60a5e76a3656ce09369bba47ab89c95670d2a2c2f6bb6f3dd2700a4a7901a4bf0a2e8f29a8252c227d290ea74d9bfc6fc6ad6580868b87254c432710797b1ed0075372316,bc7bf99ee80d8681582491d365b7e0a16f22b4872fb6f77eaccddf4b31fd0641,12f283fe9c5528248f00a65c46a66175fbf5051bef4f2ab73f025c8745f5b0ae5b19282a9ad69e8c9b9ad7781225aa7ab6b95cdbd042e192d6cf21db7c6aa34400,aac8a8bc39b8232ca68277b27745081ed85e52993d9395331b44b72a3f4f96064d7c9dc75c9e0321ed32b24d39c9626f8412f162531bb861a00930beeddf637701,fccea7c81ea33e493a44b7fa42478f34f455afbe0bbcadb2d9ff2acc88cd990c28c4ea2db6355e47197bda28f44561c7b57587b7f167a7f1230ef0ca5588159100,438f66dd436181170c09c3e6f03c8f2baf053fb48333b99365130e415890ac3a6759b49f5c820f4b5c48f4873d7f93bdccb1ab78f0f58e6d4e8e64975be72f5e00,77cbc3d72082da6c3cf869781d57cb7ae536413f611896e5ac9581f97ea678f8513c435f71fe181ff0ed7bb6f52cf9df79d15a5ab9dca5dd329c5f9e71f3f23d01 +74cef97ce0d75f1ce1b073b35a279db30bbb27dcf2b8493d3b5265431d6296c3de84a04c5e6cf6451bdd1d7b0f5aa07f6437a069cd9d2feeabc42679daa68e9839483a4b0978a9b9d2ebd92cfa364ae3369156382ee353531d85d7cf9532a70f69578882707eef2ca4bb05750cafebfbc352014e504f5e9c883b9dc30b069a0c42d0f091c1d34e0b7f7e90da3d077a26b3b81aec1fa44abfabe2b9edd5cc190d4ff59d4066328995960a9dd8e8c170980c1658bd1de5f3bfd92f66d8c08548f2db273d6fa8875403328ca8c58d167099491c3c1956c515ddbbe2f896d2504493d10afaf88507ec5642b87bd95fc6bcef1bccb52eb6fc050bba7e99ed9180c193ef136ce5beeabc6ab4606a2f0ff237792f40297d0571f11c593f3a3c8c8b4e8f77e7efe35020a2b1a388,b79d1802624856682d0a31ba09d16ea24b926d20b4eb6797b476eb97e053f9ad,1860badb03294e8f571226b1f14d1a1bc172cc7d344df9b058d24eff0a7585dd0790be94ef7cc2ec9151a4fd4d256098ff1a0c5ef7ea335ab7d66179ba92ba0801,dc4198ef29d150a10d016caaf07d0abdbc01c606ad6339dae7ae86c0c1d25a2d3d2c7e4cfa2f49d668363d3ae7c96b225d439835f01287a07319674294305c9e00,9bcdc438d0f1dd99b53c9e1515d1338cd30022fca2175296f817212391cda0db5865d0c271912cd95b3aa7f30c9ac889e2a19efcf68f091fe3e5163e0c8ab01200,a79509a250e39e65932dc42962460fa63db7e1d83e4b82a2ff6f8e0d7b3718ca3eb27e3070b481de4e3278594b2e59e6b029b09806562236979ddb034f7ca01800,301e68dc7d5f4467479f0052cd3c48a62bb84d3b2156c48bb5652733e89a5262358be8ddfc9481151efa937bf50fd1ca80c2b6119703d3a86481e93a1f18b7ce00 +8ab98807431e45e62f72789c9078b519dec8084363919a6110154e6ba748498f06023248816f702802b551055445da9302e10babcfc0acdcd99864d9fb8724fbfc3e931705f50f25ebb5feb22e93aba92992d1201a25c9b82bbf3c1376c0a34ee20e52ed6eb74d19a19f9a9b049121680ae7a5876cd57c6d22bf021f1a53ccbd08ddf2d587821112665ede375c649cab43b4bd895772122878027c731230191ae3393d33ff2cfef92fb1768dc234a7b941c0759fbe34fe621592716c379bbc01fa5b9ae195e1288208e4d95e51d1a0b3d8f0517b66493917b68be8848567beba32b1e02e9c91e2d530f7c22a186229b786c866a109375508430377015ed3408bf2d0434115a0880f6b03bd161046db3a330f038f2cf688716afec60daf7b7f7322be8e3039952d194bda,5b49d0abd677043a7a0b718ed0ba03ad184ca28b6fe2813c7a1b3ce960ed23ab,0d190b7ee4e0c93ba151601fcc43939b5fcd81f335f49203641d40c6ad5020af7c6b6e5df7086b94edb442a2f628b8ce6650ac19de79eb70201a4deab2db40f600,1c63f3ba926343fe90b20f6193c814cec379a495f03dde9260d0990a33a5983a066210856e9e375319890c0f0094ff3c4701f74227c6f0b7ea23a15230af958301,e3a11cc5f80de3e8fbee7d381e80b67d59d53f91e07ac5f31deda91acc2ea8846bd9e48b4bc0b01d53b6e315fe9b48c2add790b4dbbe7447e98cdc904d19d1b000,3d5861af2792510dad521ac13cc2c4950d960559be2591c1a467389a11c063e754ebe32e34cccea49a8b968c897d9ac770225086379c097097d52835235cb57e01,ff84ae6762246171da59af27255cc269abd87af62090978a82660dfa352726547016a7efdc313fe8b94412486dd2ce5f4c7992a43f6ce165807aa79e8d9a4b9e00 +4960ff5dfd5248bd8ec8cbd6c9c76f01bf9642fbe6db759a3176c2611c37e30e6d6557ea200f3be469e0c400b3c6156184f2ca968a993bb3383d1f5d14f3b711cdf1c9ff2308045b3ce5ef7582dd5c0685a1540e0ef7de793a98e1ad949e7b4a071ff9dd7e1f462be31eb93224260c2af4e9cb3d31a38befce82162eaa1dc944bdf885767de39bf231d311dd1bdcf1d51f7d4a4109d223321da8173553b70bc63bfbfa94e8e64875b5e78405a06bf4b1ebd273c6e6a4426c30a58628b879ffd22d1cc8f885a57131d58f030db269aa92d9f3a3d1065d3db0d2880c53f2ee1e0088a1d8b0960ddb2b7a264ce57b56bcbf2a756071466a808d32cdb040a94c993aa5edd1b5f351086d27450eef359dceef21e0c2eaa185964ea08c68f556cfbf44d8dd79ccdf71dff4c9c1,ab5c3b1e0713d01e735f8162f103b2be6144dca426a818672bd5991d396b5d3a,46fc99204b9b719f39a1b6cfc3c9bcb3310e1d0cbeab50f5c986dadcd8c233ea01b940b73b9ec7eaf5c5ca16c36609486ed20a64dbc53e3fe1ba90d83eaec72f00,7c48f5895fdbf845b3bcf953f7d4ff8f207d53e67ce34d2ea816a1e6d8420d530fe0f6a0fe8339db21dce7b45f3c77572017ac788b3f0c1ed87084776060760701,5eb447b4274322bd1a2a4eae18872629ef82d358f1d20fb15a473847b1464df9522995f16de09f0fcd33741a7fe32425025c1919d5fc45ad57b7f7bc29ac625a01,4b485d2c81ce79195d7365ba10925d6b761df398f0578f4d6de9c66856fd384e1ed7e38ad0c5368cdca74101925cf44b34578db171038034458211ea13b01f1700,307f4674bef77b3822fd76035dd6cdb65cfceb79aaad7eaf508e3584a01c0319197dc4169ea6dbeea3e0a96a8ca8e26e62830b4cedb9566f6ef2b85cacdc404c01 +8a7869f5f1d3add6e7588b550a9670cb2abd5e93ad3503f26ed99bceb45422f27d513b4215f95ee8dfe4c6595944b5a4eac645630c6a178d071bf93b429e87b23aa328312172a7f039ccc0e4bb66852c060ae56ec287e2500947a5fc6562059da92d1fa1bfd9c842751c236f9e296201b708f846473677639843332756ce5eff747e08e2e7197b41a8f459e403fe32f1f01fc6a144bfe8d0f4d55191c1d609c54606de0ead959758efe757b84c3b91b905ae10543f175cab0e8c75b745522abf0a27f1130337cfcceb62bd37f96b244af7f159e6ccc878ce8f462a07d4e308d68841e775d93b85bccc5f4a34838f8edbf5b1be1b3b06e198cca67855ef58788292cdd8598acf6c6d1354b4e7e9d04a0a23a68bd3a5f08979dea658ac917a90dd3ef8e2b8841e46a41c7e,958dbf7ae5ee9d776ae7809b15e385a994e41aad0a888de56c30388c84206029,cd598b47f26570ef5f9fd63790a3d67848b7336889b5a426ca706010bd3d83bd16da9f29e29d0283ef35e61010023ed718a6ed8386604eb54b0360bfe741ebd900,68cc1ba0dfa2891dabfdc399d09e142b1aeed057b544ec11655c2c61f58aa3d2763c660c5457a37c3a1826c1e7d70676d4aa1880df45253838cd780273b48ea401,0e41aefd1bc54ce87dd92b533656001f8e5f321d4f7d8b8bf1f0556830a094e7643a23b8b503c2227494d4c9fc4ec71164285ae6ba348055af6f7642908b1d6c00,38105de31841a21a5a97c54cf5bdf94fce6430e58583551daf4b409fa45f09314cfb2b6199a4f80b1735aa885e6f00e0f94b9ca9205fcbc6bc7295de75c7bcc700,4ee3f115fcf95c6fd19691bf78bbc17221514f3e98da8e9b737c29b8d670b4227b1a7ee5f1fa87133c0e09a7a1245635f9203ae1dbfec736cc0962b10333210600 +72698db9a1c61ac61485cdd0b7ccedefa9a8fb1dfc04ff08079cddbc5675c6865e9ab1c139b65619e8fdd677647bec1fb876f5fbe8a8da0658b833f5d16be70f47f8965523be327fcf8d5c926c5c585e4970ce54e79a631f2899beab31bd825e4386bae26ab0838166dcd24cac727c2ed2f38c8a117a59566bbaf79d1d98807e8562144531a009cd135ce96742b32d8b5eaa592b263c8a6e4ac6d9c62db104ce948ab9b119890ef43f21c76dffec68492528584a5151bfb5a5764a88492efc36ca8eb90bf4d4c900668a800971755ab3b73f0101fef054d006e18de3e7303d98282f17d05ac8e666a5b5bdf55fc93bd1b42b95bcc37dcc937e63b271a5794ce1c0ccf9f386259557364995fd13977c99468825a3f55220cbf7208ec953f9338bf2f6dfccc89146b69d47,e4d90aa662b245b607c78a690489a34e7d64bb1240c4db9ce983cbaf32570938,e399772daf069ea68500d63022304640041a97e9f1c1219b2be6fd4d55ac72155c47dabcbf277f73027f71443c2458c2bbbcb0e1e87229678cab63e19839d46800,6fac800e1f6aebc114936377c626b7d692cf7dca7d52930d88b09ea55c5c63192695d82cb208387467aa214aea84bf650d1051476aa2ebac120eb91fd3b5f90d00,b45a063d26fdcc85ea3142d34698e180e33c2a101620daac9e80f4e0901c9ccb4e4d4e125edbee19e4cd70ede4e7b1914baa5335035f0b7b9866fd42976b8aaf01,8d4037ee8d8d8e72ba4650a60a2f71b435f8e7a48566e683859f76b99d23008232583998c1bf49408aa9d660f982c5811142b970d5c836713bf677720bf0963000,79620d53b6af41b9f90cd5505eca06560841ab5f8fb8fa4cfa5392ad320c5cca7428d335a2efc872841f705ed9846d3c97a3dfc7fc6493c28311d67c073fc30f01 +550df0e02acbe284f0d704d3575935449a412bdf1fb15ba373cee92eb11aef993b2b0505f89d9436a86da2304871392dffda511af7bf18f1c8099e986dad8506186d70984d30438722a85cff0c4dcf4b3c5780e7adbeecccef9182e0f15cbedc3b0b4f7066c69e71741df9b48ea2adc6147ea09ddc9766004824e157b41e92f20d3b9f1549ce3655ca822b96b518e1f93567cef26673f89422636fb0f77864ce6b0c591a8de4c6074928c190cfe71d41a6833a0899ea900f5d54285db5049a8992392742290af37c28f6d86aa899bc58a9854253dacfe103176fbc3a087cb8980c3503f04bb7e62b407782fb672f4865c769bd1a2fa94dc15f7843410603a44ffb3018338ddc5346a165893aa9c65f6ec0419cf7283c12029f8c39f6d892cfa6bdfa31f9c8d84686fb8713,b6eb7f949dbab6a9dabf9913752d7385808f0c85b542e36dd9a158cff2e80d58,1fe1623e16fcddb044791ff500df8e0157c52295903b35a27f29a7a6c6eda1632d9cfe3f9e6b533272b01d8545d00899e801148a04b5406f28a30ecd9ec89c5b00,ac423c641f65a1777bb3dca34ff96819873dbd6fa1ac0eb65994384b191c71f653c4c8d3d23496d1117bb512186aa84c09d43379550833952b9a933a78d029dc00,c03c53ec11650c53619f93f9bf957861d049a9d0203b0ede754877961cabdab365090949df76470ae0e4a6764281d6a4b6f7ccebe198247e50dfd5d372e8362e00,665f3e5886b8f3e0c4a2c4089279c11b3613b9ec3e274a0d05a449e2f2dcd0ed557a59768be0bc888b5dc1ceb39c81ec0ffbaa553daaeeeacbe33da87be1057300,7a5ae858db9c33d29d89319a20e601281eb7999521431edea49df4f905bfbc7443043f4812ae8a83af28840845ae08f458c29fa9a3ecdb5066a9ed872507563400 +9aeae712a627c266d0035ff1f2b494838d44e029f45d4bda522b874ca35f5390282c298622bb3a36f27bdf667af5654c585bfafe118af2fc7d26414b5a76d21d64741e426f99f292ebbb8eb1a3347277e69d1937ad702f6cd28d22537f6e65fad25f20f0f4be6206659e26d62fb4d95dc3d197657a559d21205cda76f26d61dae85f6cad13221d3dfe3ae6fa8050708acbf735371930854d38858793235e6e18a469ff65adeb661825543658a40d693084a4613d12703d64e8d35a80ced5766fe13a5e20b454122d43691c1b92ede406a1d948aefa9ba035b35f66896ff50baae29d24f7997fb2a07c8077b9eea7cd917b91818522680faa3b29d008435f71e702534735c08904241b07c067eea0303f14a2901b7f529c17fca10967eac8ffa898e7536aa85c1f149b5e28,b1ccfbe15f64972e3a0642719cb685f12afe8f4045de2aff2960db423f639150,2ecfc77bbf17af92b8ff0c72fe74714cc65c1c2b5674bfdf498dc25d85a448097eb7b3f181de7918066a16cfde17112292eab327785caa08b38a8d840de7170a01,c11be50962248438b6d8fa5636b93a87b3bda6f0ae1b2d653543f603f9209f1c132b936d92c67aaa7e138cdec053dbb99bc09e55ed65d6bd93fd99aa60bff1c601,3ee62826bde4b2f02d3f4c9b8ebe61c12f027d123c77bf11fd16575dd56f9cb45ff88a332f907e4145ebd0ae22bfea110cada9f23929226a660b16458e39cdc601,6f3c012832c8518dc0e7ab1b9404ce03d5fa77c3a48b9cdc5eb19693ae7aad6308f8eb873a3536c525ff66e37890aad2b5b5c00e474931ec6cd97f62fa99c1ba01,c6b76bdca9c06d763b8746fb74eb6fcd1c814dd096e6e2cbd59dc3c2912248027d38a58688a8b949ed6c091fe793aa2336c8f21582b3ef2ecbcc76468e012dfe01 +91caec8b6677439561f50a73e7ec87ce7211e2907e82305835cf03debbce2594280ccd06dbf1bc939ceb072d63bece1491e4a6c598a4472a9da916ca111b030a4df480f6c1b66e5d86d0701a46c2091c0d7eef768c23e1a013aed850269674183f471062f4eb064f10bc87fa8163ae1eb6b540af3c455e180745605364796f518eddb25518b1bfedd4ebd1e5be27512f57341f1f044d9ca8180ee7613e4b265144e0771e2cae85d532a60b13ed02ca12cec237a90db16506e5baaa66bbb2158a5e022d1b3e6fec5d9abd774d2ad0717c60822ece1c69092fdc6c43a15af2343ebec87f5c17002603553cb33ac57c9fe0dc57c7158e23a4266c46c0c391343709b937d0721d4b8848cc9721799ca3e739cbbf73e186632bed3af7281cc7950fd421a01de70d1145feca22dd,88b592c2de229f28e0fb85ef3e79bc0af502d3f265042123f1d188265f63e3e8,ef248c9e00fe985c38786c8e8752cd2fe02baeaf536ab758786c4962c955ddf65a4baa569285d585e82947604ab772146013780c1ee485dd8882a74eecf198e701,79c55ed16359ca7382b98555cc917e46014bf710f52debe4f04143f35c951e72281a09ffa86172ce2b25d6e46b37c23dff2d80a846d9cb4b3e33b10f4f26e66600,7123a7c74773649be552a752e0c9c7c84d1ab19fd08a050a8bdd0990ed5707d3511a7dd659d82a43eae500edd83ea969e578c2c0aaa0c2013c75a48a18928ec101,5a5571d7f30389babdaf22a24a946cb582a5324c881b318c9231adca462955c47edb1a840b3e2aa3a8456d855afedad8ecaa6c2e838de1977cb2bcc2805e9b5200,5a7269b24f90e6d6a2b103890fe4da1cb511217bfee6e6b43df71aa5fdcf270f0173099da3ebe5bd03181ce9bde6d5b34c1f2f8437a9a83f76c49aa36dc6946b00 +ad31c8567e6d060e278273fc3fc0fcc4668609132fc8ec97e2f3c9fde645d1b356daddbd96b4ad562f96a84429c5903190bb1b7f0731ad66119ee6966d800d18157aeffe58150831c9e2501897a6a45a86fd5238dc4d15a6d791bf714ee1e8c165fae339cc021f3d3b2fbd647f127f1939614c512fc64f455dfd43f9b7834e894be85ebe51bd032b6ef27f31625b426e787ae779ffd012dee7f79552cc231858d95b9f0ba9c79ec8187506b6bf2cb8388f2da38b04b23db8e923798f3a186f45fef6c4f2aef17d2a6d6e652decc0fe641dc3b8ff17ad9a5aa9f8c88cdb317510939c24f1b2e863476e1279b1d2e0891a7554d90781a33beb31468d2fdaddfc4eb5155c9a2b2a29ec35257930c763de2a0143b1872c95558a8e1692268c55a411468b7c87f08f23d0f9d6f2,57f25d96e87aa19b546ee637e037f80ea33a241188cad62e22e32c2699d7b6bb,9793bcfe3029356ae4d2d3718751f00c0716ab918a4155fecfa45806a0359edf7239b194504cee9f410dd4da56a6bef0af08bfd7219490b3b88ee248a027828101,9d58fec736e0caf8d596541265f0b0affbdb3e2ee519bbb8faf3d21f957110b42cc8a264dcdc4d270b6a3926225237d03dee387932670dd6699334e3bc7e2aae00,c7bd2bbc8aa416903cc31904e1ea5ce9a85f99c562018032d48e3d257da9cc0661ffc9ea15e2e922157d591a12e5e50aabd2b1429d88fa4659b6fd582332641c01,4b6d270d2785d558895ef8a99bb43e27b8a820011debbc65f9d1cae27698cc6e48ba88f766e66435235e5cf03942a249ee43d84a5bfa42fc03c93f34e151324c01,8af9c8a772121cfdcee5a37422749813d3a7ba65202b25612a3b07fe13ad3fcf36f2c5007e9e75056ede3715ca70cfe2c312244712746dd1e0957ab26e88dbf101 +2cdfc6641e3cf1766ef9e84d395090a03c83954d6e83585877d93b8396948cf6f61b73d00bb666a71aad1b1422d44e45ad7aecd482e231da851850807069cec55c26336cd16aaba8d270257d66cb1c39b720a5dac274ac681e17df4ee9df82e7e5fbed19c66ad9c371e5c2703be28898aac019b17da8e2fb647c55c7fe2bf8bb866fd9cce3243b19bf6d78c851d4837dc44395083cf872a158a3e17bc626ee71cddb45e643a94ee9f43c6e6a412235fa7c047679a75b60ef414d78400242399af21aeebe41922c833ca0280010a6ecb66d025ff918554092169729a11d6443af8a2527e3a7978aafb4796eb0f693e5ffb5b8fadba9faaf40416430181ccecb21df66c4eb0b89f1ca902db16e4898c166f8cbc6b2c5cf7d0bde8d147d5caceb95b874746ec3ab709da9c09e,2f3b8d48a6d53f85e4fc0aba2984b60520922f8e482653fd0c3f2708d78ca8b7,9ea515dec0bb5ce462a0b6478581bb4b549f8c748bb73ef039fcea1ea6f93c927a0d85e8f737a29af394b4a2aebde89971de631014667f58433025a6d4ff83de00,30faadd464341c27c19585117908b1feac0a41b2f407f4b1264c612b30af528c3f0e15f51c8b945cf3a505d5943081b010f04092d167f1850b6b1de4834700a000,31e3bc521f9077f183948d66d2d0682c8273ce72ef70d814522bc9daf1c0cd23774bec48944d45c7e0de88a5407f1ba608efbca7867e00724efe760a101f452501,e32178408c672516e165935d4e360cdc7e5b991849209d8c994a41109dddc0436ff55f0205f1011ec3ce1aef6ee3cbad6d7f18656464945ed65be939f922dacd00,348a3e35d7367ce80daf2cdddc3a17d8eef63c8e6d2c7c53ab522a891e44d50c0bf4d15b819a6decfc0d3d2a3c027e21b4ccb724a08485eae090dc18a3451bfa01 +68ae52f446ce7b2f44bcb2c9cfdd550908facf61fdfc2fa01241d78b6d8449a23c7117b05f3cf5486d868eb4a6814d8b5fca91df1090d549e1bddf74edaf82ec41235e3ac8179ecb1827a80323a4df912c856b82c641256d92d2cd9dffd6aec7b7775e656cc3dbecec0e217238fead11e424644845323fe07712e478583833a62ab1c55bb983f6bd04d41cee538850786d354ff5b5bbd8a7e415a6c2239f87c0abe103939c0f7aa14a6dc79b9aadb01b0c8bd90f39b57c8c5ae498e2a977717da14691bbe3e96bc356110e0107abc8e8f477d6f0e96348be79a260ad15d68fa059acc0b2c6c5082dcfadea072e64d74a3d6d16078940aba2c41c452aaecff9659457d76b71516a58cb3a194806312316664814085d654d8ee4dbd4aa283ed7ded22ca18663ed8e12aec784,164eae9a71ae82b585cbd2ec85bc2fc7eba91b8fb7af05c50cc7dc76eb43fc5f,5b4aa5a74a3ab9975ae62c82747ca0127031fa34ae0c644f7a58aa4a4a7b099471fb5a0d2bdac4944a805a7d54f4f1b1291d3fa3048b096a14097bd1f162a12b01,28c089baa5018eec59da1aa04137e2e3f5210cd82e7697105b8e807ea6c5db5969774305f46411df8553a225a70e97793694734673609006476ee164f43e3b0c00,506d2a0443ff8ba83c53cdf4b48afdd51d73f9913884925e5fddf3ec36ce233158088a83f9595820def2d0fe763e346ca6bc603e67b8e7a98b8576f4d817beaf00,a4496369c5e9ce704e95642f950f6dc04c6e5385191f4ae1557e1cb91930c43747310dbab55673f6b7bb1f60504e7f4196581be1a69b021dcfc76396cffc8da401,5447bde64b65cc374eb73168b74e142d5d63abfc43c6c7a5948cbfbd62243c5711e75b484afcc396ef15ccb0448f726918a627b3cbb27b13bc76143b12ba027001 +63bdcc013fd74bb287180485ce0ff5b967456d1c308352997ecb437a96484797bf7148a73338c8627e041f5cff7ec1c811b9099c303883e1581d113bc75c810a72e76500787de376aa636af05cd7cea2d43bf32c9350b7c265da9b45e6931656e8fca435325a009c437c613b2fbe403e11a623765c41725d21e519d757b2bce1c153cf5b0acd113f5a01ecff3dda25660ac24626d2307ddaf9c376e072955076865a7678cebe84e61c627eb8b615a27bb044f6d6497709777d27f161c273c8e05382939d560c41a2b66988f38b95f865b68bad25006962dc09cc354a019482c47367973724bdebb7421e27cef33726cc0187581eae6cf6de39a19c720f0f2c4c5f347e195157a77e4ffe4cf308a72377db70c731a73c87f60df68d966d3a68c2599e80d4dd98c074260a70,31b95f0e95ff13e2a91e9391faa60c5bcc145f9abc96058e378b6a9bec582ce1,671768a9532b8eca40335b245b23c296a0f0b4ca2a65d8b8be540c82ce8db28d1b93d5abb187b3f057d6e1753562632d3bc9b655913c5555f3b26cc34b530d7601,c72124ca5c98efedee485b52f9a56b1769448ee2a9e8f83ebf963111db10dd6971f1730764d0c4d1b0fa673cc3f40ee498560527f957d1d62e7525d930b97c5901,ca76c1878c97be5fafd8509035002a9158cf12688c581ffc690a3c39b29f567a7ad05ffc9dbe2b2e481a016216f52e75f961735ecb6e987d2fac16091460ae9101,5ce91df380c75bb0824583434d054a706a60388e9365494e4bfe25d2a62f48844b5b1844d4ba8e4bf77248a2630881c9cc896aa2c08cc99d05908e2836101d3601,8b9fb71e1de4beb4c3c115bbdaf6023e2c1c71821f58d69dfb4091e5c6fae126051287bb0715246e513e8a904370a868c51775a5dc58cb2e289796c51014deaf00 +30846b126fd09302f42dd1a9dbd1a6704189132197a2a04f8143e7b712430f8ccc8afc9011f8cb392e1e1335904b838c7b4c328f44139bd2d15594ee95aeb8a164b51c53f76bd49cde0e573cd76a61fc92b96cb0049a25ba28000720c1b3d1a48542a8fab4cd39b4bbcbcb499a277835ab00f5459a1516cb66ea7215f9ad9b4992d7af59f7e8168f5c0e00f7a4225029517360f5ebf2d2aebba6fc850ad4e0a43216aaf18187808efcd4dd0464e3e7f455067002aaba6c0a6cc6f081bc675fed4686243172e09aba148bcb7ee1443346eb2a4426f45a845e4d02b4a3a3539f87e1a3741ab7035cf703441347bebb082339dbfeaef9a95172067032e8e5a35a7b8423f710e83c4294219db911e07b8f0ae5d3f48f254337713184a44be0762b07fe8adeb694fe13e6da0a5a,af2e47df4aeefaf9f039d11c137179bb87d2ee05912dc25affb70f17b8e0f787,24bd8f5769e5e9e560d97648844e5e2359aaabb296a41b4b014f37c697fb2b8b7c9d7527c64daac61b78a8241ddfb64a6b930a49c574bf5382fd00538ff0e46300,6a993554e6040ef0f18c9c47cb610d753f94d809d190bb67dea1a22b0e6856c81d2343e0d3c50d093268f8b6fcba51c7422e3a2d4bec620d0834faba79c73caf01,f59829b7135a6ea45a4f5bdccc733280f2d554205aabe139584a85c37db9344a78907109a405344252e79a7b7762dc1183bc522449466db90cf26f577c2d22bc01,54eacb7ca43a6309cedcb5d1643a6272aedbb0e1708a8905b1b472b40d60fbd632e20db0e3c3b0b28677291aab01304c38a66e78c5f77a1a71c8f8d170ff32fe01,617eacc36691f3b292f94e4b241cd6a426ff6a0a56b30e6c427911cdacc26d8b628f9e39dbe3b8e41faad50f19fcf421fe31ddb50468346ecfccc36b0f6d7aa101 +a2e3f92b0eb7c2077029a613d16b75527e094a8d6735bbfab6bf51a9d1a4853fb57977ff875aaccfc44d7a29e382260c8eb4bb567d8b672c011c726c590dabb20f01055a086abf20358aa47244839d6e8f055f0550c133af40a7398045e34128abd7bd1ae1c00b80f294b4de0a5224f24a02f3a22b997f3e5c892f6cb60c05fcc9bb413ce22ab580278b27ab21220852a78a9d5a2e5153afdba5253dc59cf4e5d3c87cf12943c63288c9cad3562dcd70ca94ac5f25a73dca591af13fabc15818f6119b214454964dabbde23232829fdcf26a8cb2a12194c6b3f9edb1d695c7274e5caf706b066828971bfbb5ce1c29700bb98fcfc417879f91166a85e676bfe05462609531e4360eff5e93b8d3ea4ca991fb6ba91a79e9db324ed0c3115d179506d55fc4464a462007bd7d,6a1a5055d1f51ed6a9fe37096827e350c9f8a8692229a428596714dcafc05e09,d55c2956e8252de194da59fb83aa578b8939ead1e9f359973cbcbbe260df72107efc9c8c9a46da80e2abb6a2094752882f8fd9397b16df73a7b18087605c67f601,be4cd1b21f373813a503a825860d2326bb87c8b62903414c86719b54b9ea7f137b6e511e74f737cc180fe32ca2fd47ef776a65831ba44fd010810705f8b1e99200,8fde484bd75883f56dc75b12d8352e3a06dc5649afb613570bcb6a6af122c40c3b48272a7e4e033141eea59bde9c41e6482a845a2c3ae5b59e27c39b1fe8a9fe00,75fe956b70ee544a5117a140a264bdce8dcd18d92eebfe3cc1bd4facbd6fdc77488b49e9b1c0ede15abbd4cccb3dd33a1b18a9609ea1fe0b5b889dd483eb1dd501,740fd220b284e0b4cd9b453807044e3ef273b74dfc98fa02b660c8bd17edbe5b6f376fe76308393c38da23992fdadeb16e161d86a990effbca0b29c99d5cf00101 +f63c5639845f1ac1e2113b08d87f21b0bfaf052aac6f8da035661e3a013265c90eeb63421ddd389a3ff7946ce96257891daed0e3c0bdee03ca5af49edffcc4a2efe348012167ecf7184060fa3edfb51c64238456e21ecab492368605945d90f9c27654be535e010b8a9f721223f8fbda57e2ec8129c8a0f6035a136af7dc8fffdfc8a40f80b3333ee69be07bf25af734e09a32fe28a469c88dba04a30881ccb3bbb587f66e270c86f5ddb05b3a2f8151b2199df32572f22058cc6fc8bd822e32885da721be0a33799a2575c29ac907da9375afd43668eeeb9a6dfbd5b0c3ca515eda97d4bf57d69944669dbd4a92111669d9aedda72da6b30e3eb6957671b335ee0764ecfb43fabea886ad3dab29d2c39cacf850149eea848bbdcc4e625a17f502e6d228e994296aeb6730,de68c48888ed9c8c4e514d0af98d9863d0e345a1a1b7a5bc888b0f53bae3b74c,7b7ec36bd617604619fdc2c883b2671d8395617f77215b94f4503716b0f50c181f9afccced4a0bbc7fa8ced22e9ceb5a93c0c226f262626eefab52c1f8323c8501,0f749e2d9146f166665fd9c9f5f2e2f0ac5bf47f15b63a9c474ef6e8b66b3f8a091374c81e5dbcfb66e76f9e92a596eeef81e84bf5bad51e717c08bfaa7bcf9d00,14cfb32a461d15af3dde78e6182bf6f49c4ebbe2cd004b0b1e71bdb9130ec7e07b6919f0a4a72554f5d8eaa519172d1965a91c29d3d3ac4fbf655904954336bf00,47c3b33c9df302a427365719249b29ffa870cf9256037ccf38118c0b8aab87b954901a0aa9b0df0b84bc1882c646c40a57254c199acbafd7cb2e7502f46faf5c01,1dd66b68251fe883b9f0f4bd563508d4cae7fa8e1c2d46c84f18df9a3942f53241e953eac0e992bfb3c58011bbbe4ca5555e2cc8d2c2a7c96fb231ae0d110bf001 +ddb3aa37c0c19aa9cf2c8387cc1bc835675b9615e93b793a52dc4c087e61fd5b8b25f8a89b35d9e4beadf1e0ad41d2cb1913083722c19f840b9e756509e443c617367066479dccc805bc027c91bd2735e8b14d1d97cacff165b0de3ce64db05b4a0fc9ed898a500d3692914d0ac18e413ec02b4e8bc231621cdfc7bb58fd7aaa12c1b9301e9d826c7d391573c27d1dc98ec83e03c41ec0a612aa63f9e9dbb5c515806445c2e3a4917d9aac6071736dfbf0a5a737991efbae6083be09a37df7c67c97244621be58e21f25e0a00451042ea09f26891806a762cce172bb1b594ab069e60bd45a192c76900180869df2fb8a207dad619c1e2c1c0a402a9a39e9f256def3a06f4f3bac8becf758991f8974c738b57ed768f19c4dd95bad1deb9066126dfaca5ab86b1aa4ac990f2f,fdcd37ca289ebfc59dbf26bf5f1e3df6ec80e0c958d42f9b390b8114a3eaa87f,5ecb4850b156ee0241990e46f1368cba1c4885c70d8013f7f4125de5ec5dab5e2a0fef9f4cf8747d3fa329d18f57b93c7190cd6ecae1ea23baf4901729e19d2a00,cccfa49c295a019098c7ef68a0ba1ff6abb444ebd9af64e1ead6854d226bcc6d38531208ce878b3e88ac2029d9f294dde47aff9290c04a3f114ff13e28e8d82e01,b835eacc3d11e8b4d7cc88bd07c35be7bab7378d7f385de0d72070682c4c9b2a239e0d72ee2882688646f43ea7d0e9e815507cfe1f05d0839a4e14e7a7e2d00f00,8494b50eac4408ab5830c34e059790d822d524e840f927fa76129079f097579b7499e5365ef2772df51a8980d7c1d8dea6fac96fa02c137469c4202cc8b1a91d01,4389c11dceb8bf2322effea60b67b843234842951a54e07bce687a3d0adca29c24ba2abcd512fb26b65a65d191a251f5ca3c61df44312c7d76d0d966997ae66101 +1c087d890b6d851f9cafa4662b13ae5222f25da71d4d3351de8f6892ee3779094a51229f34907d42346fb7a4ecebdde83b02ae177996eeb4831595da7580eb2c16a9e1e0cf42acb8e460cfc9d57a1142655af26cf3c4f98c8c36a4978ccbe3e201fbd742df1705a05e1b21aaf174f5369b5f7b134b233f2ebd0799854925ff83af3dd43ccd6b2574e8e3417177f9c06d8c8519d85b8661a1566f6ba612933d5fb2fcfe6b51a3f084e0431753d53e325fce0ce1af0d9ccfd4ac8babe28b83bf31e57e3284f3505941dd2960853d7dc31d5ca8edf6f68e397ac4a1b27e478574ecc273b4118707147cc0b836e5516adc74b353cd85aba25665e9235d2069731f76790024fa05d80ff81320d86b6e74990e5b40dac8ead42eb059cc829da11e21832584128fc96714ea7eaaae21,63197b7ee326fcde3acf6135adf24bd7705899b1894cf866aa0f3c84b611f8e6,98d0941c14356adfcaeefa02e5c5c1c1cee4cce016f2bd487977ee6dff05bc75137058a2524e93ce111fe32f8e200e15d0c51280e798ae68599343469247833501,82478828a2e44e8bc197e98e4889b6a48ad6bc65e464661b0054ed06a1c82a6e0a74cb56a1eca4b815d296a67701ce065ae10eb92337298b77baaa4756bcdfab01,0dc57beaba08ed0d671c7e864be6d2a25efc27edaf71978bac1708b2bbed66d16b1d01c7c78f31d0d62f12bca6b2fe4ff1cba4b90f6c17af4ed3606e6611383b01,6e9b2f0d983636de9d31b2b899ad69f077ea3ece042d7442390d0e31a6ceb6724b6287d68a55320d8f121ce56ece8179c360fde53582986f7742e2325fc8730001,ddcaa8fb32846421d032d8dbc9950a81c130e6db1099ce971448c376be0641ca4ed8b9cfe6632ad01eb2c878312f0e3f847558c08cb8281af17a71b8b6a1eef200 +d9bd1e9ee2a6078656f89bda4b84fa9e0f2a22959b9f7fd828721c5be12407fc637f1a5db61bd042e6da0baa69541e642f4b4b80dec6b73fa23c3eb2612c93d347c31cdf97f0af0c644f2172d23a36e724b0facabfe6d4e8a62d9f6c4daf4af782fa40b18ada6f19ef3876f66db04bdc40d4d1d9f2f1e9f4afd5c8974b6eb1ec526a1a7e3ccdda46a5afc6857d2e148f7939749394ebaa220c9197bbad600b5f8105857d75d35dd5c5dc7c36c9ed8086793458246734b3d8399eaaacb3ee831f9a9fbacb73e3118035c0f9d174b03528bdd75a7013931ea399010bc1833d09f4e16cc6fb0021a5072b4a8d40ce80d8b18afba31eeaf409ec93d611fac9c67a11e2c82fc169f9dedda09280a4400f32d0b94b87e35b6c9d6bdbe6f66e9371535048c58196925a11b4cb3956af,7048ecd2c2180648d97e4f1b0f5db5eec58f4a0cbab159b4ae8abb2f7ecfc3b9,e51e40647f4f515fd0c07c32cb06bf428043d29e0615b7224c5d65ef1211145310971180b197b52233cda2195284ec9ed98177700e4714e4aca6db24156e3c1600,10b60e323302d69ac635af60d5ab43746d0ca2f6454da20fff110f1410f99ab66028f966bf7b45f6a1074d767b9cdbabb29b6a215e74c338f2c6597e83f4975f00,333aa1022345a919f867336395e1919261a9b440a96c1c141a7eab61b91c71cb2222bbce30237f12b9312c9da423c896b71f13981c422a996130230d1a6461f901,800b5c668b03e1034e32d0bef4c0cc75375c24d867e93f3d984274c17a98fc2f5bdeeb42b25109fc186c15de881c128074219a10ed8575d70994fbe467b7442100,1d92c133126fd6d9c5324522640959da0fa6c629eb9b0f112a696927ba0a218c1a87297d7853cdb52294ce4e97b08a207426d0c4352fbbee92610d45a6924a3d00 +5e19e37c373b4c70502453a8922cd70cdeed941be47f9f4eccdc7ea88b96647cd2a672fa6d79a3ff9f7d954876b6c0830876b8fcc5dd805e3cac807b6a1815f4d50fa72024cded95f50a891264b1f00dd853ba02ddc3676419cc1a21cefa231c74d105ac02e4e3eee797d1db046573e3b744c097dc445b9baf057b93a12166dad6b1db49e72bb376fd596b2580d981c2e95e0bba6ad3ca5835f2f728acda720fb8c6a4cc97dc337af26f72bbefe9961e9ee459523caba7632331d97a065502bc3df1dc7a42f720908756e54de5f2e1b4c7a38aac4bb0bce0b75225845073fd44b69927a933252fbf939ee1d70fc70ae82f3d42b68aeee84d42c95ee34d629d99931e81681b88bc57af19767b08f0eaef187851f87e34469a6c3e8821c7936f0dca4e62ed42c205c7dfde07e5,a9a4ac7ad4fd97b53a6ef5e0ab09d37e1b4db1c7ab718276c4b73c3791615a8b,aa5e8a6dee22a0fe062e2be8345299ed0ca0b25b95cb777a372add6a1eb611961291164b95ac9b47e02fc75cbcc103c9a1920235b95db0a9a86214e62c7d7e3700,ab71480dbd5d316125580919322aef739a0c6c957f21df3b602054c3def15ee15f56eef589333df432e33f39c35dfa4ecce9d8ef6af493df0a27e75ad0cd86d601,56354a1b32f2980af2a2950dc52104b04dfae5e785adc3be6e3ef7fcac6d031262ea48102610e19bc9b9c8bc09423a372679d529657aaa706dba1f434e00b5a400,785b55bdb704c77b52eec55b40dd345da6cad12e09af28e7b4494d571afb83fc147f174fee57aeddd90c8b0fc1696621e86b2674f303bd31f549b6a0a9e1c93101,0b4dc3f45595c8b467faaca550b95ed1e954079fc17920dd772f6791d8b2b9505e734bbebdb7f82a1ca4eb13b186dbf2ec588945055dae31a6e7b67ab0c0ff0500 +fea5257764d5144bc9688c083c31fd188fa7a534eba381ca18c0ebca881815ce6bd937584fef67fd59cb1f45207445873f4ecf3882a815f91ee02fc480aaa9ea18e2a898363732c94622524b9159f78ccd39818738c4659884867b0be6d07681d9dc6a01b0ea0a2fd9711db28d6ffd3f9064a2100acec4af98421aa1e03de6bf966077faafd015d3ca28534f17f5d273ee1b472e11197349eff6195f7d2d3ad8607be8e32f02f08486616ae2a29d6a25843b49cdd8de52ff0b3902edb9413b2272c272af704b92234759ce665e46a80c15ef1d40c4bc9d55727280aa0feeafbd4f98b89b371498853fe6bda521a47e0f593090d6114599621142e71b5c5156a80e90a3ad20d8d4164e349a5dbbdd6c52e396408e339776af00c8a9a3ce9b44a22ce50542b6854b15b66add80,956a0b827a92849f21799bcc64ee7c71b9f56aaa537be44536a6c84ef4da8b96,c8a4cb2ab6d1643e57cd47bc83cb408c3f4d591c034e5d4a4e12ccc9ffa8c2207fb11240ebea128eb85c90e674d57b4d75365a6edf3518d2a9f88b4b06249ac001,383ac0e8bf58ab6cf1b71fdf179c3d4cc84ab168e569720b9d2da4976fc3ef036a6449da87c39e588a2189dfc9ab787024f25c9d8901a79e22e587a227156cd601,704e31c79931ba90586aa91a924e983b67ecc7e4d297665be3267b906dd7bdf76aa3f25878666c73f260b6219e14459ead29f3f173c2f93a0c94e74b77807e3e01,71a2e52bf64684a9693faaea387dd7610de3fd917bd2ab6d2d3f87343556cbab01028b4d776801043077cd0c899498de74e1675a2732ad93c8627bcc31285d1501,6956ee9f0a7c419d130edcfa999b71c579340128ce0669893a96055d0dff330c609bbff08ad412e01be83cd2729dd7a03888f009a1b77fb0a4e886c1dd696fce01 +2e355a9f4f909ffbc0b67d5d82dc94cd01725c595ed27b083e4ca692fda7430f558c6e0188bff406631f8b5377bfb84ff8b8e3749ca434fce0465bb3c5faaafc8bc51bbadde63f17d5990da8c12f2897046e0c537843f5852a87ac593ce582e43f8fc26bdc96f3baccc40477322a4575ca8b3bfb30cd0cd0bdba2969652a6e09c86ae18fb61e07af88c82bda77c7a5b8892cf63c661bac068bc35840ada918078be58075006d5722049e836fd9b5d9a56d7292795d751ae6891a1d66076db86a288d06d0cf36bb96a88936e28ac0c552ceda3e2e088d5d1d49c1e41f112f2557c0ea31a6a756ce6d2294b9a1f60f711ebbacd7d1a124951d261a43ceb0e4a60dac7313c2f164098426d3ecbae32777fcdec3068600a587c59cc022bf4f0b6d1196fe99fb6e0ba5f563e2380e,bc186cdd3bc8f0b851514576d211cd3618ea0e3d3a9f22c946f174dd8fb23b4c,6f0a14a54b3009a31848dbc9d6c595de34bd11aa0e1c3c9373274bdc55e19afb4e0134c2b36de962eb7cc51a98a15018c594cae13cb16fd47b4afac302eb289101,8cd8fc811c40e4ca760eb40f615a59bd774c327f8696d3389a362ec0525179742e902b49de7736d7a72f3ec2c2e9e915c24e6e053095d8ade2d93a57dff8dfb801,1f528bb74802bb61b6219c185f4cf3c3a7d0d24838000d76790791caa2e863001f7bdb73588f43f86cb626a72cd2a968bb81846ed45c92b0080834f03bb70d0e00,21731bdfae4dbaf4bdc67a7fc6472583cb8dcda4e978320dd0e10ed9b6b861127d08014d597e335f17aa2f73f3031f1fb6c7dafbb95467eb55ef5e07a1ed817300,23027fd64867eb0b3346748cd5c9f66d6bcc097c62e99bad5167997761ddbf44116c071af159311715c932c7b36b482cfc36956e367da62978afc9c8bd0eecf101 +92b600d84556787b08a28f4fb91d12e979029401e9081b495ce5b99b14f2fc4059ccc678f57539f7d37160bee325a5cb2032a5fd964416a7059aa36c90c3fedf28e8f3a00d55c0c10fbbed5349441cd7fe505026882cdb8a4f6b9e96e5aade4d0011f2b79678687f900a6fa91c462343bb26889c96ea3cbd04838f53fd36c1c33c619a921d8f9ccf0bea8c6f23ca94e801ab02b6fa94ca06cd1d165ad353d5dec4127d32bf9b1081055b04d77ae7ecb4d2fbc8e3b3a783dda1b4c479b20a07926b9e35bb1d565ba6a79fc3f4c548770773fe2e9b3db8a3732ca0134cc81c4f67034d962864d99de5ef2bd35ed1145d3f7876603721a9dffd63f478c7eef28def8073a846eb7f77eb7006662a5ee10c24fde80d2229ec93361092b1734b7cb4abc48328f6dc36e5c8cdd59ade,4c867581e21a9bb6e5451d705ff67396aabb0a7a733ada20c4ab8901aacd7e07,6080c251020006837d5637c9c74dde7af39ed4ea6747b5faecd4f5e9b7ccfe4809ed3ce2d6402252800f2ed8667cc89ea21c8e1a268df4d0290f4ef1ab487d4b00,0a6b662f6462a129745cc4ffbe4c0703a592fc7e5243cd6ce0d801eb3101c6385c849dc75ca58478de4c7c660ad08ba474d0df7c52dc3b514307df52dcb9373e01,849b99daddbec8f3187e3c61dccc01910d692a453fbfc29be837dd0c0eb61c510b1f7ed2cd8a47cb5b74e1e98541c0c2a334af867eda0344accecfeae4a3c09601,6f75e563ea68107e4af3a291365e7a8b5e481811297c06fb66e7c90c2fabdae257f6c1c9707cf627d79826ebae19d3841829610cf13907369d69f5b1ee905a8d01,f942286c2d9128c3abcc949774b7fbccaa044b8f85cf33040abe666130554a8144274342d4cbe1a8a23ddea7f899dadf5af2e81e8b750402c112705e91281f8601 +427515eee1aac52184dab269c2b03f3dc4e5c7f3accbe3422c8e95a52153c58a080cb098eef774d21a30e9ac4b31f3e53ca2e854b8f728b62569de40686e411fe26a3abb28e12a46abea57582d6a96fe80f316a1d3bae3e1e898cef2e459b4d5f2c81bd0944022ee6658c4e804b35b1efcc41420b54478c67bfb1cf06fc1932d0bdb8b5a9c21972808dd69c360c5d003e47fa6ad5faafe0bf8d280cf6bad114007ce89a16ed3fe7db85478657f2ebb86c78614d91fbd98392f6635747c18964aa84c6ed933c022dc2ab568ca07e089316e8c483b5e3dcab66bf8757435a8010b8531fe8fcf1d39b402e5cb3efa2539f265f19586ffd0cd37e3db707bdc0d68239c7c6aa41c1a167fc3b67bbfda3d2153f22684b0778863308dff64ab33c50ed2a0bbd1780031751b24c04e6e,15298ac79ff8e09132d3d055fd96b568dfdca0f599b897a722aac0e7a15e2725,f2f453fd6707b5c61e4f9fde36e8ff7f7cce38b3ea21019e058384f3a859d9ca7e6b5506b7f83a4098e3122b46e0b4f8f1b4b253749c65467d00587942c9c60400,b5a82311c897772cee3fcffd5cd220d150f0c49eefcceceaf2223f6f4180cace2f3291e47ecae3ffb9f11e14f8d360e27bdcd3903df0f5748c4919d503a5126c01,ebbc82f184d4efb24d20deb2296fa12e27dbfd13e296ce579c3e5c35a9d75fe124fd8f0450d168f0c387fb724bc93ee8aa423391c29eff3c530cc443f0267fb100,520de094bc5f799ed14d5eec721e3172f28ee4f09cb9dd9c0e0c30c844b02ad474071f9ec9092ccc751152daab6e12a26bc85b114d22c6cdbeaf7456353a3a4601,67488934f2563bda3426c1c5b659e356586ae7e6fedfceeae7b4c8f3f27ef2c909d26329dce20f9d4308dcd136c2c1c531e5bf1c699f6bcca62fa922606299b300 +dd4073f1b85fcf49e8b3223e3e93a118de282aee08eebfdf213f3a975f5a097241243eb28b9a2f77505bede3ef099e0d35015c62b22e900622e67d9e9733892a9da3f2cc7ce6e95fda9f2ec31ffbc865319253de503650f525544976d0c051072fa87332624d184b909b7fece9a80b5b713d65f3e43925283acd92c62e18023b096f7fda785b6367e7be5e2de8968d8b2676fa5774cbd69980eca798730215c27aa14b4fee762e6c22cc349c0754c039fde7b7977fddd923f3d8c2504ef47138ff1850051e1dbc41dc3da01549213c2366a1a826979dc52f9d7bf0c40f7dcea04ef7568ddcb50414e4ededc3958530513155a247b52b3110622f4319dfd0232f74709af949264290d71737f1ef351555786ec313f05dac17e49d8c32c646713354fbef46c2101479996cb700,039ac157ae29ddcf4de165d721cd0cfc997aa68ecc13b1b1ea5c0457125f3c62,892309d8bc8e02857d77608678fe5804456cc69f7ef06e140c28d504952e11f76960b7b0df8cb5d308dda3199619594072e3b1470280022ae70130c628a94f6301,4271dda6fe196c9766a4cc62116c97868b4adebbe8049e87586a24a8b9c1a15065b8becf3c3258028066bfc77245c8b26e6445065032cd48becc2835d558d11101,274876ca519756c537eed778345138d0fcec723d8ebd451157d6957027ec5ef265f21b7bf4b04a5638ededba9eb1c45193cd94ab70e767e0f7291adf3b554f7101,d7dd46f0df3b401cde78c8544240ed4108a454f6ec9e0693c1959403f602f9ec7e1c255a5f94182775896a730df2973f1dbe246263ae7aae2a5fb71132a44e4e01,15a3672c1b9640de42677ad1c81c64c4d6706ecaa3333768154ae3c2f03ccf000cccea39ad6de8a2b111dcb949e3d90ef384597f98683700b2de0ae099d93dfc00 +cefe3f57e447a27dc98690dc033a82b86dcf72901fa1684321d9ca092e7d3c002797ed1da8eb08178ad1262889ade2b9868395e1bcafbcd768393fae64870fec5b2e399d6d0a58a3798552eadb91e93f170de931365914d988491963b5ae9a62856bda79db815c8a26e27a8fdc1860ff8f3c393b29daa12b4ae4e9899e44c48ffcd813be4bbf0f31bd3a02e6ad6c3d3758147d04f8ede98e77485f369b60c5fc4723892b242d686702177c4b9c227140cb0fa3acfe73aca6ecb65826b8a1f174f5f3d45ede860b77473f1a19be0df19a47b2f9fa9258f41fa6fbb1bfe6312958214e4206898d2c2d14725e402d67f500f2e8c3b255a2da91163700dac8034747f43b57570026471eaf010d840a831d3e5c625c51e4105bee4be21d8e8fbb087683484f41aba378e8e3833baa,0f481d6c75f06a2c22a25dc829f7b2e011c7d9a574f3fbfdccebf9f3cbf32862,55e31f9be86e25758ab27b62f4a7c2916bf57a2946c65e1f708a0a621435ea07667688f26e2d01c133c35315432e380ca6d0d9b8d51c089acda9a7f697a33eec00,98b64f975e7f024ec7c5bf8a9aef1c565fda749ac9cc3b83abc3a3d82895742c7cda8ff8ff70d70b1007f305d8178f928eae5b3ce0d0efe676ca0dc293da23f100,e4003193bd0f4b7042ae894313edb73efc4ba808a90a6b80adf76098e0e148247b2c4e38ef15841f34bfac0bb52f05a606800b1b0209b92cee4aecefcb425fc601,e21f74905a1459cd303942b7380065470d9db85820c85e7bb81e5d040e4fd0217d8645c34981bb4d322604e807c7fdc6b29a50800881a905a0455f7b4803191801,df3781c01308a11cfed9fac17e03d30fcb220646a90592e84e22a3cca2e055101c7086b106ab56c6bfdd1041e3d5fb77845feeacd22597effc957f7b0f7e120401 \ No newline at end of file diff --git a/core/tsconfig.base.json b/core/tsconfig.base.json new file mode 100644 index 000000000..670c29513 --- /dev/null +++ b/core/tsconfig.base.json @@ -0,0 +1,100 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + "incremental": false /* Save .tsbuildinfo files to allow for incremental compilation of projects. */, + "composite": false /* Enable constraints that allow a TypeScript project to be used with project references. */, + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "esnext" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "esnext" /* Specify what module code is generated. */, + "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */, + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + "resolveJsonModule": true /* Enable importing .json files. */, + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + "allowJs": false /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */, + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + "declaration": true /* Generate .d.ts files from TypeScript and JavaScript files in your project. */, + "declarationMap": true /* Create sourcemaps for d.ts files. */, + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + "sourceMap": true /* Create source map files for emitted JavaScript files. */, + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + "isolatedModules": true /* Ensure that each file can be safely transpiled without relying on other imports. */, + "allowSyntheticDefaultImports": true /* Allow 'import x from y' when a module doesn't have a default export. */, + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + "noImplicitAny": true /* Enable error reporting for expressions and declarations with an implied 'any' type. */, + "strictNullChecks": true /* When type checking, take into account 'null' and 'undefined'. */, + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + "alwaysStrict": true /* Ensure 'use strict' is always emitted. */, + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + "noImplicitReturns": true /* Enable error reporting for codepaths that do not explicitly return in a function. */, + "noFallthroughCasesInSwitch": true /* Enable error reporting for fallthrough cases in switch statements. */, + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/core/web3/.eslintrc.json b/core/web3/.eslintrc.json new file mode 100644 index 000000000..528e38b41 --- /dev/null +++ b/core/web3/.eslintrc.json @@ -0,0 +1,68 @@ +{ + "root": true, + "extends": [ + "eslint:recommended", + "plugin:import/recommended", + "plugin:import/typescript", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + "plugin:prettier/recommended", + "plugin:jest/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { "project": ["./tsconfig.eslint.json"] }, + "plugins": ["@typescript-eslint", "import"], + "ignorePatterns": ["dist/**", ".turbo/**", "node_modules/**", "jest.config.ts"], + "rules": { + "no-console": "error", + "import/no-extraneous-dependencies": [ + "error", + { + "packageDir": "." + } + ], + "@typescript-eslint/require-await": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unsafe-assignment": "off", + "@typescript-eslint/no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_", + "destructuredArrayIgnorePattern": "^_" + } + ], + "@typescript-eslint/restrict-template-expressions": [ + "error", + { + "allowNever": true, + "allowBoolean": true, + "allowNumber": true, + "allowAny": true, + "allowNullish": true + } + ], + "@typescript-eslint/no-empty-function": [ + "error", + { + "allow": ["arrowFunctions"] + } + ], + + "@typescript-eslint/ban-ts-comment": "off" + }, + "overrides": [ + { + "files": ["**/*.test.*"], + "rules": { + "jest/no-standalone-expect": "off", + "jest/expect-expect": "off", + "jest/no-conditional-expect": "off", + "jest/no-disabled-tests": "off", + "@typescript-eslint/no-unsafe-call": "off", + "@typescript-eslint/no-floating-promises": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-unsafe-argument": "off" + } + } + ] +} diff --git a/core/web3/.gitignore b/core/web3/.gitignore new file mode 100644 index 000000000..43be2578d --- /dev/null +++ b/core/web3/.gitignore @@ -0,0 +1,4 @@ +test-config.json +.env +.env.* +!.env.test-sample \ No newline at end of file diff --git a/core/web3/README.md b/core/web3/README.md new file mode 100644 index 000000000..921720950 --- /dev/null +++ b/core/web3/README.md @@ -0,0 +1,3 @@ +# web3 + +smart contracts diff --git a/core/web3/jest-setup.ts b/core/web3/jest-setup.ts new file mode 100644 index 000000000..21ea3639d --- /dev/null +++ b/core/web3/jest-setup.ts @@ -0,0 +1,3 @@ +process.env.NODE_ENV = 'test' + +export {} diff --git a/core/web3/jest.config.ts b/core/web3/jest.config.ts new file mode 100644 index 000000000..29f241f65 --- /dev/null +++ b/core/web3/jest.config.ts @@ -0,0 +1,35 @@ +import type { JestConfigWithTsJest } from 'ts-jest' + +const config: JestConfigWithTsJest = { + preset: 'ts-jest/presets/default-esm', + testEnvironment: './../jest.env.ts', + testEnvironmentOptions: { + browsers: ['chrome', 'firefox', 'safari'], + url: 'https://localhost:5158', + }, + verbose: true, + testTimeout: 60000, + modulePathIgnorePatterns: ['/dist/'], + testPathIgnorePatterns: ['/dist/', '/node_modules/'], + setupFilesAfterEnv: ['jest-extended/all', '/jest-setup.ts'], + extensionsToTreatAsEsm: ['.ts'], + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + useESM: true, + }, + ], + }, + moduleNameMapper: { + 'bn.js': 'bn.js', + // match "hash.js" but not whateverHash.js - viem has many of these which should not be + '\\bhash\\.js\\b': 'hash.js', + '(.+)\\.js': '$1', + }, + collectCoverage: true, + coverageProvider: 'v8', + coverageReporters: ['json', 'html'], +} + +export default config diff --git a/core/web3/package.json b/core/web3/package.json new file mode 100644 index 000000000..70d2e8a3c --- /dev/null +++ b/core/web3/package.json @@ -0,0 +1,52 @@ +{ + "name": "@river-build/web3", + "packageManager": "yarn@3.8.0", + "type": "module", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc", + "cb": "yarn clean && yarn build", + "clean": "rm -rf dist", + "lint": "yarn eslint --format unix ./src", + "lint:fix": "yarn lint --fix", + "my-jest": "yarn node --trace-warnings -r ../../scripts/node-no-warn.js --experimental-vm-modules --experimental-wasm-modules $(yarn bin jest)", + "test": "yarn my-jest", + "test:ci": "yarn test", + "test:debug": "DEBUG=test yarn my-jest", + "watch": "tsc --watch" + }, + "dependencies": { + "@river-build/dlog": "workspace:^", + "@river-build/generated": "workspace:^", + "abitype": "^0.9.10", + "debug": "^4.3.4", + "ethers": "^5.7.2", + "lodash": "^4.17.21", + "nanoid": "^4.0.0", + "viem": "^1.18.2", + "zod": "^3.21.4" + }, + "devDependencies": { + "@types/jest": "^29.5.3", + "@types/lodash": "^4.14.186", + "@types/node": "^20.5.0", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", + "debug": "^4.3.4", + "eslint": "^8.53.0", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jest": "^27.2.3", + "jest": "^29.6.2", + "jest-extended": "^4.0.1", + "ts-jest": "^29.1.1", + "ts-node": "^10.9.1", + "typed-emitter": "^2.1.0", + "typescript": "^5.1.6" + }, + "files": [ + "/dist", + "/v4" + ] +} diff --git a/core/web3/src/ContractHelpers.ts b/core/web3/src/ContractHelpers.ts new file mode 100644 index 000000000..bcfe1e1c8 --- /dev/null +++ b/core/web3/src/ContractHelpers.ts @@ -0,0 +1,127 @@ +import { BigNumber, BigNumberish, ethers } from 'ethers' + +import { BasicRoleInfo, Permission, Address } from './ContractTypes' +import { BaseChainConfig } from './IStaticContractsInfo' +import { ISpaceDapp } from './ISpaceDapp' +import { + IArchitectBase as ISpaceArchitectBaseV3, + MockERC721AShim as MockERC721AShimV3, + IMembershipBase as IMembershipBaseV3, +} from './v3' + +import { getTestGatingNFTContractAddress } from './TestGatingNFT' + +export function mintMockNFT( + provider: ethers.providers.Provider, + config: BaseChainConfig, + fromWallet: ethers.Wallet, + toAddress: string, +): Promise { + if (!config.addresses.mockNFT) { + throw new Error('No mock ERC721 address provided') + } + const mockNFTAddress = config.addresses.mockNFT + const mockNFT = new MockERC721AShimV3(mockNFTAddress, config.contractVersion, provider) + return mockNFT.write(fromWallet).mintTo(toAddress) +} + +export function balanceOfMockNFT( + config: BaseChainConfig, + provider: ethers.providers.Provider, + address: Address, +) { + if (!config.addresses.mockNFT) { + throw new Error('No mock ERC721 address provided') + } + const mockNFTAddress = config.addresses.mockNFT + const mockNFT = new MockERC721AShimV3(mockNFTAddress, config.contractVersion, provider) + return mockNFT.read.balanceOf(address) +} + +export async function getTestGatingNftAddress(_chainId: number): Promise<`0x${string}`> { + return await getTestGatingNFTContractAddress() +} + +export async function getFilteredRolesFromSpace( + spaceDapp: ISpaceDapp, + spaceNetworkId: string, +): Promise { + const spaceRoles = await spaceDapp.getRoles(spaceNetworkId) + const filteredRoles: BasicRoleInfo[] = [] + // Filter out space roles which won't work when creating a channel + for (const r of spaceRoles) { + // Filter out roles which have no permissions & the Owner role + if (r.name !== 'Owner') { + filteredRoles.push(r) + } + } + return filteredRoles +} + +export function isRoleIdInArray( + roleIds: BigNumber[] | readonly bigint[], + roleId: BigNumberish | bigint, +): boolean { + for (const r of roleIds as BigNumber[]) { + if (r.eq(roleId)) { + return true + } + } + return false +} + +/** + * TODO: these are only used in tests, should move them to different file? + */ + +function isMembershipStructV3( + returnValue: ISpaceArchitectBaseV3.MembershipStruct, +): returnValue is ISpaceArchitectBaseV3.MembershipStruct { + return typeof returnValue.settings.price === 'number' +} + +type CreateMembershipStructArgs = { + name: string + permissions: Permission[] + requirements: ISpaceArchitectBaseV3.MembershipRequirementsStruct +} & Omit< + IMembershipBaseV3.MembershipStruct, + | 'symbol' + | 'price' + | 'maxSupply' + | 'duration' + | 'currency' + | 'feeRecipient' + | 'freeAllocation' + | 'pricingModule' +> +function _createMembershipStruct({ + name, + permissions, + requirements, +}: CreateMembershipStructArgs): ISpaceArchitectBaseV3.MembershipStruct { + return { + settings: { + name, + symbol: 'MEMBER', + price: 0, + maxSupply: 1000, + duration: 0, + currency: ethers.constants.AddressZero, + feeRecipient: ethers.constants.AddressZero, + freeAllocation: 0, + pricingModule: ethers.constants.AddressZero, + }, + permissions, + requirements, + } +} + +export function createMembershipStruct(args: CreateMembershipStructArgs) { + const result = _createMembershipStruct(args) + if (isMembershipStructV3(result)) { + return result + } else { + throw new Error("createMembershipStruct: version is not 'v3'") + } +} diff --git a/core/web3/src/ContractTypes.ts b/core/web3/src/ContractTypes.ts new file mode 100644 index 000000000..7a1460bd7 --- /dev/null +++ b/core/web3/src/ContractTypes.ts @@ -0,0 +1,139 @@ +import { UserEntitlementShim as UserEntitlementShimV3 } from './v3/UserEntitlementShim' +import { + IMembershipBase as IMembershipBaseV3, + IArchitectBase as ISpaceArchitectBaseV3, +} from './v3/ISpaceArchitectShim' +import { IRolesBase as IRolesBaseV3 } from './v3/IRolesShim' +import { RuleEntitlementShim } from './v3/RuleEntitlementShim' +import { IRuleEntitlement } from './v3' +import { IPricingModulesBase } from './v3/IPricingShim' + +export const Permission = { + Undefined: 'Undefined', // No permission required + Read: 'Read', + Write: 'Write', + Invite: 'Invite', + JoinSpace: 'JoinSpace', + Redact: 'Redact', + Ban: 'Ban', + PinMessage: 'PinMessage', + AddRemoveChannels: 'AddRemoveChannels', + ModifySpaceSettings: 'ModifySpaceSettings', +} as const + +export type Permission = (typeof Permission)[keyof typeof Permission] + +export type EntitlementShim = UserEntitlementShimV3 | RuleEntitlementShim + +export type EntitlementStruct = IRolesBaseV3.CreateEntitlementStruct + +type UserEntitlementShim = UserEntitlementShimV3 + +type MembershipInfoStruct = IMembershipBaseV3.MembershipStruct + +type TotalSupplyOutputStruct = { totalSupply: number } + +export type MembershipStruct = ISpaceArchitectBaseV3.MembershipStruct + +export type SpaceInfoStruct = ISpaceArchitectBaseV3.SpaceInfoStruct + +export type PricingModuleStruct = IPricingModulesBase.PricingModuleStruct + +/** + * Supported entitlement modules + */ +export enum EntitlementModuleType { + UserEntitlement = 'UserEntitlement', + RuleEntitlement = 'RuleEntitlement', +} + +/** + * Role details from multiple contract sources + */ +export interface RoleDetails { + id: number + name: string + permissions: Permission[] + users: string[] + ruleData: IRuleEntitlement.RuleDataStruct + channels: ChannelMetadata[] +} + +/** + * Basic channel metadata from the space contract. + */ +export interface ChannelMetadata { + name: string + description?: string + channelNetworkId: string + disabled: boolean +} + +/** + * Channel details from multiple contract sources + */ +export interface ChannelDetails { + spaceNetworkId: string + channelNetworkId: string + name: string + disabled: boolean + roles: RoleEntitlements[] + description?: string +} + +/** + * Role details for a channel from multiple contract sources + */ +export interface RoleEntitlements { + roleId: number + name: string + permissions: Permission[] + users: string[] + ruleData: IRuleEntitlement.RuleDataStruct +} + +/* + Decoded Token and User entitlenment details +*/ +export interface EntitlementDetails { + users: string[] + ruleData: IRuleEntitlement.RuleDataStruct +} + +export interface BasicRoleInfo { + roleId: number + name: string +} + +export interface EntitlementModule { + moduleType: EntitlementModuleType +} + +export function isUserEntitlement( + entitlement: EntitlementModule, +): entitlement is UserEntitlementShim { + return entitlement.moduleType === EntitlementModuleType.UserEntitlement +} + +export function isRuleEntitlement( + entitlement: EntitlementModule, +): entitlement is RuleEntitlementShim { + return entitlement.moduleType === EntitlementModuleType.RuleEntitlement +} + +export function isStringArray( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + args: any, +): args is string[] { + return Array.isArray(args) && args.length > 0 && args.every((arg) => typeof arg === 'string') +} + +export type MembershipInfo = Pick< + MembershipInfoStruct, + 'maxSupply' | 'currency' | 'feeRecipient' | 'price' | 'duration' | 'pricingModule' +> & + TotalSupplyInfo + +export type TotalSupplyInfo = Pick + +export type Address = `0x${string}` diff --git a/core/web3/src/ConvertersEntitlements.ts b/core/web3/src/ConvertersEntitlements.ts new file mode 100644 index 000000000..9126617b6 --- /dev/null +++ b/core/web3/src/ConvertersEntitlements.ts @@ -0,0 +1,60 @@ +import { ethers } from 'ethers' + +import { Address, EntitlementStruct } from './ContractTypes' +import { Hex, decodeAbiParameters, parseAbiParameters } from 'viem' +import { encodeEntitlementData } from './entitlement' +import { IRuleEntitlement } from './v3' + +const UserAddressesEncoding = 'address[]' + +export function decodeRuleData(encodedData: string): string[] { + const decodedData = decodeAbiParameters( + parseAbiParameters([UserAddressesEncoding]), + encodedData as Hex, + ) + let u: Hex[] = [] + if (decodedData.length) { + // decoded value is in element 0 of the array + u = decodedData[0].slice() + } + return u +} + +export function encodeUsers(users: string[] | Address[]) { + const abiCoder = ethers.utils.defaultAbiCoder + const encodedData = abiCoder.encode([UserAddressesEncoding], [users]) + return encodedData +} + +export function decodeUsers(encodedData: string): string[] { + const abiCoder = ethers.utils.defaultAbiCoder + const decodedData = abiCoder.decode([UserAddressesEncoding], encodedData) as string[][] + let u: string[] = [] + if (decodedData.length) { + // decoded value is in element 0 of the array + u = decodedData[0] + } + return u +} + +export function createUserEntitlementStruct( + moduleAddress: string, + users: string[], +): EntitlementStruct { + const data = encodeUsers(users) + return { + module: moduleAddress, + data, + } +} + +export function createRuleEntitlementStruct( + moduleAddress: `0x${string}`, + ruleData: IRuleEntitlement.RuleDataStruct, +): EntitlementStruct { + const encoded = encodeEntitlementData(ruleData) + return { + module: moduleAddress, + data: encoded, + } +} diff --git a/core/web3/src/ConvertersRoles.ts b/core/web3/src/ConvertersRoles.ts new file mode 100644 index 000000000..8b204b1af --- /dev/null +++ b/core/web3/src/ConvertersRoles.ts @@ -0,0 +1,61 @@ +import { EntitlementModuleType, Permission, EntitlementStruct } from './ContractTypes' +import { createRuleEntitlementStruct, createUserEntitlementStruct } from './ConvertersEntitlements' + +import { Space as SpaceV3 } from './v3/Space' +import { IRuleEntitlement } from './v3' + +export async function createEntitlementStruct( + spaceIn: Space, + users: string[], + ruleData: IRuleEntitlement.RuleDataStruct, +): Promise { + const space = spaceIn as SpaceV3 + // figure out the addresses for each entitlement module + const entitlementModules = await space.Entitlements.read.getEntitlements() + let userEntitlementAddress + let ruleEntitlementAddress + for (const module of entitlementModules) { + switch (module.moduleType) { + case EntitlementModuleType.UserEntitlement: + userEntitlementAddress = module.moduleAddress + break + case EntitlementModuleType.RuleEntitlement: + ruleEntitlementAddress = module.moduleAddress + break + } + } + if (!userEntitlementAddress) { + throw new Error('User entitlement moodule address not found.') + } + if (!ruleEntitlementAddress) { + throw new Error('Rule entitlement moodule address not found.') + } + + // create the entitlements array + const entitlements: EntitlementStruct[] = [] + // create the user entitlement + if (users.length) { + const userEntitlement: EntitlementStruct = createUserEntitlementStruct( + userEntitlementAddress, + users, + ) + entitlements.push(userEntitlement) + } + + if (ruleData) { + const ruleEntitlement: EntitlementStruct = createRuleEntitlementStruct( + ruleEntitlementAddress as `0x{string}`, + ruleData, + ) + entitlements.push(ruleEntitlement) + } + // return the converted entitlements + return entitlements +} + +export function toPermissions(permissions: readonly string[]): Permission[] { + return permissions.map((p) => { + const perm = p as Permission + return perm + }) +} diff --git a/core/web3/src/ISpaceDapp.ts b/core/web3/src/ISpaceDapp.ts new file mode 100644 index 000000000..4af6976b9 --- /dev/null +++ b/core/web3/src/ISpaceDapp.ts @@ -0,0 +1,216 @@ +import { + BasicRoleInfo, + ChannelDetails, + ChannelMetadata, + MembershipInfo, + MembershipStruct, + Permission, + PricingModuleStruct, + RoleDetails, + TotalSupplyInfo, +} from './ContractTypes' + +import { WalletLink as WalletLinkV3 } from './v3/WalletLink' +import { BigNumber, BytesLike, ContractReceipt, ContractTransaction, ethers } from 'ethers' +import { SpaceInfo } from './types' +import { IRolesBase, Space, SpaceRegistrar, IRuleEntitlement } from './v3' +import { PricingModules } from './v3/PricingModules' +import { IPrepayShim } from './v3/IPrepayShim' +import { BaseChainConfig } from './IStaticContractsInfo' + +export type SignerType = ethers.Signer + +export interface CreateSpaceParams { + spaceName: string + spaceMetadata: string + channelName: string + membership: MembershipStruct +} + +export interface UpdateChannelParams { + spaceId: string + channelId: string + channelName: string + channelDescription: string + roleIds: number[] + disabled?: boolean +} + +export interface UpdateRoleParams { + spaceNetworkId: string + roleId: number + roleName: string + permissions: Permission[] + users: string[] + ruleData: IRuleEntitlement.RuleDataStruct +} + +export interface TransactionOpts { + retryCount?: number +} + +type TransactionType = ContractTransaction + +export type ContractEventListener = { + wait: () => Promise<{ + success: boolean + error?: Error | undefined + [x: string]: unknown + }> +} + +export interface ISpaceDapp { + readonly provider: ethers.providers.Provider + readonly config: BaseChainConfig + readonly spaceRegistrar: SpaceRegistrar + readonly walletLink: WalletLinkV3 + readonly pricingModules: PricingModules + readonly prepay: IPrepayShim + addRoleToChannel: ( + spaceId: string, + channelNetworkId: string, + roleId: number, + signer: SignerType, + ) => Promise + banWalletAddress: ( + spaceId: string, + walletAddress: string, + signer: SignerType, + ) => Promise + unbanWalletAddress: ( + spaceId: string, + walletAddress: string, + signer: SignerType, + ) => Promise + walletAddressIsBanned: (spaceId: string, walletAddress: string) => Promise + bannedWalletAddresses: (spaceId: string) => Promise + createSpace: ( + params: CreateSpaceParams, + signer: SignerType, + txnOpts?: TransactionOpts, + ) => Promise + createChannel: ( + spaceId: string, + channelName: string, + channelNetworkId: string, + roleIds: number[], + signer: SignerType, + txnOpts?: TransactionOpts, + ) => Promise + createRole( + spaceId: string, + roleName: string, + permissions: Permission[], + users: string[], + ruleData: IRuleEntitlement.RuleDataStruct, + signer: SignerType, + txnOpts?: TransactionOpts, + ): Promise + createUpdatedEntitlements( + space: Space, + params: UpdateRoleParams, + ): Promise + deleteRole( + spaceId: string, + roleId: number, + signer: SignerType, + txnOpts?: TransactionOpts, + ): Promise + encodedUpdateChannelData(space: Space, params: UpdateChannelParams): Promise + getChannels: (spaceId: string) => Promise + getChannelDetails: (spaceId: string, channelId: string) => Promise + getPermissionsByRoleId: (spaceId: string, roleId: number) => Promise + getRole: (spaceId: string, roleId: number) => Promise + getRoles: (spaceId: string) => Promise + getSpaceInfo: (spaceId: string) => Promise + isEntitledToSpace: (spaceId: string, user: string, permission: Permission) => Promise + isEntitledToChannel: ( + spaceId: string, + channelId: string, + user: string, + permission: Permission, + ) => Promise + getEntitledWalletForJoiningSpace: ( + spaceId: string, + wallet: string, + supportedXChainRpcUrls: string[], + ) => Promise + parseSpaceFactoryError: (error: unknown) => Error + parseSpaceError: (spaceId: string, error: unknown) => Promise + parsePrepayError: (error: unknown) => Error + parseSpaceLogs: ( + spaceId: string, + logs: ethers.providers.Log[], + ) => Promise<(ethers.utils.LogDescription | undefined)[]> + updateChannel: ( + params: UpdateChannelParams, + signer: SignerType, + txnOpts?: TransactionOpts, + ) => Promise + updateRole: ( + params: UpdateRoleParams, + signer: SignerType, + txnOpts?: TransactionOpts, + ) => Promise + updateSpaceName: ( + spaceId: string, + name: string, + signer: SignerType, + txnOpts?: TransactionOpts, + ) => Promise + setSpaceAccess: ( + spaceId: string, + disabled: boolean, + signer: SignerType, + ) => Promise + setChannelAccess: ( + spaceId: string, + channelId: string, + disabled: boolean, + signer: SignerType, + ) => Promise + getSpace(spaceId: string): Space | undefined + getSpaceMembershipTokenAddress: (spaceId: string) => Promise + joinSpace: ( + spaceId: string, + recipient: string, + signer: SignerType, + ) => Promise<{ issued: true; tokenId: string } | { issued: false; tokenId: undefined }> + hasSpaceMembership: (spaceId: string, wallet: string) => Promise + getMembershipSupply: (spaceId: string) => Promise + getMembershipInfo: (spaceId: string) => Promise + getWalletLink: () => WalletLinkV3 + getSpaceAddress: (receipt: ContractReceipt) => string | undefined + listPricingModules: () => Promise + setMembershipPrice: ( + spaceId: string, + price: string, + signer: SignerType, + ) => Promise + setMembershipPricingModule: ( + spaceId: string, + moduleId: string, + signer: SignerType, + ) => Promise + setMembershipLimit: ( + spaceId: string, + limit: number, + signer: SignerType, + ) => Promise + prepayMembership: ( + spaceId: string, + supply: number, + signer: SignerType, + ) => Promise + getPrepaidMembershipSupply: (spaceId: string) => Promise + setMembershipFreeAllocation: ( + spaceId: string, + freeAllocation: number, + signer: SignerType, + ) => Promise + listenForMembershipEvent: ( + spaceId: string, + receiver: string, + abortController?: AbortController, + ) => Promise<{ issued: true; tokenId: string } | { issued: false; tokenId: undefined }> +} diff --git a/core/web3/src/IStaticContractsInfo.ts b/core/web3/src/IStaticContractsInfo.ts new file mode 100644 index 000000000..11ca59799 --- /dev/null +++ b/core/web3/src/IStaticContractsInfo.ts @@ -0,0 +1,48 @@ +import DeploymentsJson from '@river-build/generated/config/deployments.json' assert { type: 'json' } + +import { Address } from './ContractTypes' + +export enum ContractVersion { + v3 = 'v3', + dev = 'dev', +} + +export interface BaseChainConfig { + chainId: number + contractVersion: ContractVersion + addresses: { + spaceFactory: Address + spaceOwner: Address + mockNFT?: Address // mockErc721aAddress + member?: Address // testGatingTokenAddress - For tesing token gating scenarios + } +} + +export interface RiverChainConfig { + chainId: number + contractVersion: ContractVersion + addresses: { + riverRegistry: Address + } +} + +export interface Web3Deployment { + base: BaseChainConfig + river: RiverChainConfig +} + +export function getWeb3Deployment(riverEnv: string): Web3Deployment { + const deployments = DeploymentsJson as Record + if (!deployments[riverEnv]) { + throw new Error( + `Deployment ${riverEnv} not found, available environments: ${Object.keys( + DeploymentsJson, + ).join(', ')}`, + ) + } + return deployments[riverEnv] +} + +export function getWeb3Deployments() { + return Object.keys(DeploymentsJson) +} diff --git a/core/web3/src/LocalhostWeb3Provider.ts b/core/web3/src/LocalhostWeb3Provider.ts new file mode 100644 index 000000000..fbea1b36b --- /dev/null +++ b/core/web3/src/LocalhostWeb3Provider.ts @@ -0,0 +1,65 @@ +import { ethers } from 'ethers' +import { dlogger } from '@river-build/dlog' +import { BaseChainConfig } from './IStaticContractsInfo' +import { mintMockNFT } from './ContractHelpers' + +const logger = dlogger('csb:LocalhostWeb3Provider') + +// Behaves like a metamask provider +export class LocalhostWeb3Provider extends ethers.providers.JsonRpcProvider { + // note to self, the wallet contains a reference to a provider, which is a circular ref back this class + public wallet: ethers.Wallet + + public get isMetaMask() { + return true + } + + constructor(rpcUrl: string, wallet?: ethers.Wallet) { + super(rpcUrl) + this.wallet = (wallet ?? ethers.Wallet.createRandom()).connect(this) + logger.log('initializing web3 provider with wallet', this.wallet.address) + } + + public async fundWallet(walletToFund: ethers.Wallet | string = this.wallet) { + const amountInWei = ethers.BigNumber.from(100).pow(18).toHexString() + const address = typeof walletToFund === 'string' ? walletToFund : walletToFund.address + const result = this.send('anvil_setBalance', [address, amountInWei]) + logger.log('fundWallet tx', result, amountInWei, address) + const receipt = await result + logger.log('fundWallet receipt', receipt) + const balance = await this.getBalance(address) + logger.log('fundWallet balance', balance.toString()) + return true + } + + public async mintMockNFT(config: BaseChainConfig) { + return mintMockNFT(this, config, this.wallet, this.wallet.address) + } + + public async request({ + method, + params = [] as unknown[], + }: { + method: string + params?: unknown[] + }) { + if (method === 'eth_requestAccounts') { + return [this.wallet.address] + } else if (method === 'eth_accounts') { + return [this.wallet.address] + } else if (method === 'personal_sign') { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [message, address] = params as [string, string] + if (ethers.utils.isHexString(message)) { + // the json rpc provider will hexify the message, so we need to unhexify it + const m1 = ethers.utils.arrayify(message) + const m2 = ethers.utils.toUtf8String(m1) + return this.wallet.signMessage(m2) + } else { + return this.wallet.signMessage(message) + } + } else { + return this.send(method, params) + } + } +} diff --git a/core/web3/src/MockERC721A.ts b/core/web3/src/MockERC721A.ts new file mode 100644 index 000000000..7fb184132 --- /dev/null +++ b/core/web3/src/MockERC721A.ts @@ -0,0 +1,1931 @@ +const MockERC721A = { + abi: [ + { + inputs: [], + name: 'ApprovalCallerNotOwnerNorApproved', + type: 'error', + }, + { + inputs: [], + name: 'ApprovalQueryForNonexistentToken', + type: 'error', + }, + { + inputs: [], + name: 'BalanceQueryForZeroAddress', + type: 'error', + }, + { + inputs: [], + name: 'Initializable_InInitializingState', + type: 'error', + }, + { + inputs: [], + name: 'Initializable_NotInInitializingState', + type: 'error', + }, + { + inputs: [], + name: 'Introspection_AlreadySupported', + type: 'error', + }, + { + inputs: [], + name: 'Introspection_NotSupported', + type: 'error', + }, + { + inputs: [], + name: 'MintERC2309QuantityExceedsLimit', + type: 'error', + }, + { + inputs: [], + name: 'MintToZeroAddress', + type: 'error', + }, + { + inputs: [], + name: 'MintZeroQuantity', + type: 'error', + }, + { + inputs: [], + name: 'OwnerQueryForNonexistentToken', + type: 'error', + }, + { + inputs: [], + name: 'OwnershipNotInitializedForExtraData', + type: 'error', + }, + { + inputs: [], + name: 'TransferCallerNotOwnerNorApproved', + type: 'error', + }, + { + inputs: [], + name: 'TransferFromIncorrectOwner', + type: 'error', + }, + { + inputs: [], + name: 'TransferToNonERC721ReceiverImplementer', + type: 'error', + }, + { + inputs: [], + name: 'TransferToZeroAddress', + type: 'error', + }, + { + inputs: [], + name: 'URIQueryForNonexistentToken', + type: 'error', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'approved', + type: 'address', + }, + { + indexed: true, + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + name: 'Approval', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'operator', + type: 'address', + }, + { + indexed: false, + internalType: 'bool', + name: 'approved', + type: 'bool', + }, + ], + name: 'ApprovalForAll', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'uint256', + name: 'fromTokenId', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'toTokenId', + type: 'uint256', + }, + { + indexed: true, + internalType: 'address', + name: 'from', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'to', + type: 'address', + }, + ], + name: 'ConsecutiveTransfer', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint32', + name: 'version', + type: 'uint32', + }, + ], + name: 'Initialized', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes4', + name: 'interfaceId', + type: 'bytes4', + }, + ], + name: 'InterfaceAdded', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes4', + name: 'interfaceId', + type: 'bytes4', + }, + ], + name: 'InterfaceRemoved', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'from', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'to', + type: 'address', + }, + { + indexed: true, + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + name: 'Transfer', + type: 'event', + }, + { + inputs: [ + { + internalType: 'string', + name: 'name_', + type: 'string', + }, + { + internalType: 'string', + name: 'symbol_', + type: 'string', + }, + ], + name: '__ERC721A_init', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'to', + type: 'address', + }, + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + name: 'approve', + outputs: [], + stateMutability: 'payable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'owner', + type: 'address', + }, + ], + name: 'balanceOf', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'token', + type: 'uint256', + }, + ], + name: 'burn', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + name: 'getApproved', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + internalType: 'address', + name: 'operator', + type: 'address', + }, + ], + name: 'isApprovedForAll', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'to', + type: 'address', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + name: 'mint', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'to', + type: 'address', + }, + ], + name: 'mintTo', + outputs: [ + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'name', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + name: 'ownerOf', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'from', + type: 'address', + }, + { + internalType: 'address', + name: 'to', + type: 'address', + }, + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + name: 'safeTransferFrom', + outputs: [], + stateMutability: 'payable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'from', + type: 'address', + }, + { + internalType: 'address', + name: 'to', + type: 'address', + }, + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + { + internalType: 'bytes', + name: '_data', + type: 'bytes', + }, + ], + name: 'safeTransferFrom', + outputs: [], + stateMutability: 'payable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'operator', + type: 'address', + }, + { + internalType: 'bool', + name: 'approved', + type: 'bool', + }, + ], + name: 'setApprovalForAll', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'symbol', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + name: 'tokenURI', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'totalSupply', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'from', + type: 'address', + }, + { + internalType: 'address', + name: 'to', + type: 'address', + }, + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + name: 'transferFrom', + outputs: [], + stateMutability: 'payable', + type: 'function', + }, + ], + bytecode: { + object: '0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f2d0d21306acfe8e9bb163a4573e95aff6cef95dc1102c6a16d5f19eac08cc4de8054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b611551806100d36000396000f3fe6080604052600436106100fe5760003560e01c80636352211e11610095578063a22cb46511610064578063a22cb46514610279578063b88d4fde14610299578063c87b56dd146102ac578063d2f01f19146102cc578063e985e9c5146102ec57600080fd5b80636352211e1461020457806370a0823114610224578063755edd171461024457806395d89b411461026457600080fd5b806323b872dd116100d157806323b872dd1461019e57806340c10f19146101b157806342842e0e146101d157806342966c68146101e457600080fd5b806306fdde0314610103578063081812fc1461012e578063095ea7b31461016657806318160ddd1461017b575b600080fd5b34801561010f57600080fd5b5061011861031c565b604051610125919061109b565b60405180910390f35b34801561013a57600080fd5b5061014e6101493660046110ae565b6103b7565b6040516001600160a01b039091168152602001610125565b6101796101743660046110de565b6103c8565b005b34801561018757600080fd5b506101906103d8565b604051908152602001610125565b6101796101ac366004611108565b6103e7565b3480156101bd57600080fd5b506101796101cc3660046110de565b6105cc565b6101796101df366004611108565b6105d6565b3480156101f057600080fd5b506101796101ff3660046110ae565b6105f6565b34801561021057600080fd5b5061014e61021f3660046110ae565b610602565b34801561023057600080fd5b5061019061023f366004611144565b61060d565b34801561025057600080fd5b5061019061025f366004611144565b610618565b34801561027057600080fd5b50610118610634565b34801561028557600080fd5b5061017961029436600461115f565b61064c565b6101796102a7366004611227565b6106c9565b3480156102b857600080fd5b506101186102c73660046110ae565b610713565b3480156102d857600080fd5b506101796102e73660046112c3565b6107a4565b3480156102f857600080fd5b5061030c610307366004611327565b6107f8565b6040519015158152602001610125565b6060610326610804565b60020180546103349061135a565b80601f01602080910402602001604051908101604052809291908181526020018280546103609061135a565b80156103ad5780601f10610382576101008083540402835291602001916103ad565b820191906000526020600020905b81548152906001019060200180831161039057829003601f168201915b5050505050905090565b60006103c282610828565b92915050565b6103d482826001610875565b5050565b60006103e261092a565b905090565b60006103f282610949565b9050836001600160a01b0316816001600160a01b0316146104255760405162a1148160e81b815260040160405180910390fd5b600080610431846109ed565b9150915061045681876104413390565b6001600160a01b039081169116811491141790565b6104815761046486336107f8565b61048157604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166104a857604051633a954ecd60e21b815260040160405180910390fd5b80156104b357600082555b6104bb610804565b6001600160a01b03871660009081526005919091016020526040902080546000190190556104e7610804565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b1761051e610804565b60008681526004919091016020526040812091909155600160e11b84169003610594576001840161054d610804565b6000828152600491909101602052604081205490036105925761056e610804565b548114610592578361057e610804565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b031660008051602061153183398151915260405160405180910390a45b505050505050565b6103d48282610a15565b6105f1838383604051806020016040528060008152506106c9565b505050565b6105ff81610b2c565b50565b60006103c282610949565b60006103c282610b37565b6000610622610ba0565b905061062f826001610a15565b919050565b606061063e610804565b60030180546103349061135a565b80610655610804565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6106d48484846103e7565b6001600160a01b0383163b1561070d576106f084848484610bb0565b61070d576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061071e82610c9b565b61073b57604051630a14c4b560e41b815260040160405180910390fd5b600061075260408051602081019091526000815290565b90508051600003610772576040518060200160405280600081525061079d565b8061077c84610cd7565b60405160200161078d929190611394565b6040516020818303038152906040525b9392505050565b7f2d0d21306acfe8e9bb163a4573e95aff6cef95dc1102c6a16d5f19eac08cc4de54640100000000900460ff166107ee57604051630ef4733760e31b815260040160405180910390fd5b6103d48282610d1b565b600061079d8383610d8f565b7f234d8962d7c9a6a6604d7f98797e6ad6d7a886804f7409feb26422e27bf8125490565b600061083382610c9b565b610850576040516333d1c03960e21b815260040160405180910390fd5b610858610804565b60009283526006016020525060409020546001600160a01b031690565b600061088083610602565b905081156108bf57336001600160a01b038216146108bf576108a28133610d8f565b6108bf576040516367d9dca160e11b815260040160405180910390fd5b836108c8610804565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b600080610935610804565b60010154610941610804565b540303919050565b6000610953610804565b600083815260049190910160205260408120549150600160e01b821690036109d4578060000361062f57610985610804565b5482106109a557604051636f96cda160e11b815260040160405180910390fd5b6109ad610804565b6000199092016000818152600493909301602052604090922054905080156109a557919050565b604051636f96cda160e11b815260040160405180910390fd5b60008060006109fa610804565b60009485526006016020525050604090912080549092909150565b6000610a1f610804565b5490506000829003610a445760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202610a58610804565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717610a93610804565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083906000805160206115318339815191528180a4600183015b818114610af95780836000600080516020611531833981519152600080a4600101610ad3565b5081600003610b1a57604051622e076360e81b815260040160405180910390fd5b80610b23610804565b55506105f19050565b6105ff816000610dcc565b60006001600160a01b038216610b60576040516323d3ad8160e21b815260040160405180910390fd5b67ffffffffffffffff610b71610804565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6000610baa610804565b54919050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290610be59033908990889088906004016113c3565b6020604051808303816000875af1925050508015610c20575060408051601f3d908101601f19168201909252610c1d91810190611400565b60015b610c7e573d808015610c4e576040519150601f19603f3d011682016040523d82523d6000602084013e610c53565b606091505b508051600003610c76576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000610ca5610804565b54821080156103c25750600160e01b610cbc610804565b60008481526004919091016020526040902054161592915050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480610cf15750819003601f19909101908152919050565b7f2d0d21306acfe8e9bb163a4573e95aff6cef95dc1102c6a16d5f19eac08cc4de54640100000000900460ff16610d6557604051630ef4733760e31b815260040160405180910390fd5b610d756380ac58cd60e01b610f3b565b610d85635b5e139f60e01b610f3b565b6103d48282611019565b6000610d99610804565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b6000610dd783610949565b905080600080610de6866109ed565b915091508415610e2657610dfb818433610441565b610e2657610e098333610d8f565b610e2657604051632ce44b5f60e11b815260040160405180910390fd5b8015610e3157600082555b6fffffffffffffffffffffffffffffffff610e4a610804565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b17600360e01b17610e83610804565b60008881526004919091016020526040812091909155600160e11b85169003610ef95760018601610eb2610804565b600082815260049190910160205260408120549003610ef757610ed3610804565b548114610ef75784610ee3610804565b600083815260049190910160205260409020555b505b60405186906000906001600160a01b03861690600080516020611531833981519152908390a4610f27610804565b600190810180549091019055505050505050565b6001600160e01b0319811660009081527fbc7de460bcfb6afd0c415c8c610d408bd914b18d7d0feec0da9e25348087a5c4602052604090205460ff161515600114610fc8576001600160e01b0319811660009081527fbc7de460bcfb6afd0c415c8c610d408bd914b18d7d0feec0da9e25348087a5c460205260409020805460ff19166001179055610fe1565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6000611023610804565b9050600281016110338482611470565b50600381016110428382611470565b50600090555050565b60005b8381101561106657818101518382015260200161104e565b50506000910152565b6000815180845261108781602086016020860161104b565b601f01601f19169290920160200192915050565b60208152600061079d602083018461106f565b6000602082840312156110c057600080fd5b5035919050565b80356001600160a01b038116811461062f57600080fd5b600080604083850312156110f157600080fd5b6110fa836110c7565b946020939093013593505050565b60008060006060848603121561111d57600080fd5b611126846110c7565b9250611134602085016110c7565b9150604084013590509250925092565b60006020828403121561115657600080fd5b61079d826110c7565b6000806040838503121561117257600080fd5b61117b836110c7565b91506020830135801515811461119057600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156111cc576111cc61119b565b604051601f8501601f19908116603f011681019082821181831017156111f4576111f461119b565b8160405280935085815286868601111561120d57600080fd5b858560208301376000602087830101525050509392505050565b6000806000806080858703121561123d57600080fd5b611246856110c7565b9350611254602086016110c7565b925060408501359150606085013567ffffffffffffffff81111561127757600080fd5b8501601f8101871361128857600080fd5b611297878235602084016111b1565b91505092959194509250565b600082601f8301126112b457600080fd5b61079d838335602085016111b1565b600080604083850312156112d657600080fd5b823567ffffffffffffffff808211156112ee57600080fd5b6112fa868387016112a3565b9350602085013591508082111561131057600080fd5b5061131d858286016112a3565b9150509250929050565b6000806040838503121561133a57600080fd5b611343836110c7565b9150611351602084016110c7565b90509250929050565b600181811c9082168061136e57607f821691505b60208210810361138e57634e487b7160e01b600052602260045260246000fd5b50919050565b600083516113a681846020880161104b565b8351908301906113ba81836020880161104b565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906113f69083018461106f565b9695505050505050565b60006020828403121561141257600080fd5b81516001600160e01b03198116811461079d57600080fd5b601f8211156105f157600081815260208120601f850160051c810160208610156114515750805b601f850160051c820191505b818110156105c45782815560010161145d565b815167ffffffffffffffff81111561148a5761148a61119b565b61149e81611498845461135a565b8461142a565b602080601f8311600181146114d357600084156114bb5750858301515b600019600386901b1c1916600185901b1785556105c4565b600085815260208120601f198616915b82811015611502578886015182559484019460019091019084016114e3565b50858210156115205787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', + sourceMap: + '188:302:261:-:0;;;;;;;;;;;;-1:-1:-1;385:22:43;:20;:22::i;:::-;188:302:261;;1653:314:54;186:68:55;1779:14:54;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:54;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:54;1898:16;1886:28;;;;;1927:29;;158:42:420;;;1927:29:54;;146:2:420;131:18;1927:29:54;;;;;;;1844:119;1694:273;1653:314::o;14:192:420:-;188:302:261;;;;;;', + linkReferences: {}, + }, + deployedBytecode: { + object: '0x6080604052600436106100fe5760003560e01c80636352211e11610095578063a22cb46511610064578063a22cb46514610279578063b88d4fde14610299578063c87b56dd146102ac578063d2f01f19146102cc578063e985e9c5146102ec57600080fd5b80636352211e1461020457806370a0823114610224578063755edd171461024457806395d89b411461026457600080fd5b806323b872dd116100d157806323b872dd1461019e57806340c10f19146101b157806342842e0e146101d157806342966c68146101e457600080fd5b806306fdde0314610103578063081812fc1461012e578063095ea7b31461016657806318160ddd1461017b575b600080fd5b34801561010f57600080fd5b5061011861031c565b604051610125919061109b565b60405180910390f35b34801561013a57600080fd5b5061014e6101493660046110ae565b6103b7565b6040516001600160a01b039091168152602001610125565b6101796101743660046110de565b6103c8565b005b34801561018757600080fd5b506101906103d8565b604051908152602001610125565b6101796101ac366004611108565b6103e7565b3480156101bd57600080fd5b506101796101cc3660046110de565b6105cc565b6101796101df366004611108565b6105d6565b3480156101f057600080fd5b506101796101ff3660046110ae565b6105f6565b34801561021057600080fd5b5061014e61021f3660046110ae565b610602565b34801561023057600080fd5b5061019061023f366004611144565b61060d565b34801561025057600080fd5b5061019061025f366004611144565b610618565b34801561027057600080fd5b50610118610634565b34801561028557600080fd5b5061017961029436600461115f565b61064c565b6101796102a7366004611227565b6106c9565b3480156102b857600080fd5b506101186102c73660046110ae565b610713565b3480156102d857600080fd5b506101796102e73660046112c3565b6107a4565b3480156102f857600080fd5b5061030c610307366004611327565b6107f8565b6040519015158152602001610125565b6060610326610804565b60020180546103349061135a565b80601f01602080910402602001604051908101604052809291908181526020018280546103609061135a565b80156103ad5780601f10610382576101008083540402835291602001916103ad565b820191906000526020600020905b81548152906001019060200180831161039057829003601f168201915b5050505050905090565b60006103c282610828565b92915050565b6103d482826001610875565b5050565b60006103e261092a565b905090565b60006103f282610949565b9050836001600160a01b0316816001600160a01b0316146104255760405162a1148160e81b815260040160405180910390fd5b600080610431846109ed565b9150915061045681876104413390565b6001600160a01b039081169116811491141790565b6104815761046486336107f8565b61048157604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166104a857604051633a954ecd60e21b815260040160405180910390fd5b80156104b357600082555b6104bb610804565b6001600160a01b03871660009081526005919091016020526040902080546000190190556104e7610804565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b1761051e610804565b60008681526004919091016020526040812091909155600160e11b84169003610594576001840161054d610804565b6000828152600491909101602052604081205490036105925761056e610804565b548114610592578361057e610804565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b031660008051602061153183398151915260405160405180910390a45b505050505050565b6103d48282610a15565b6105f1838383604051806020016040528060008152506106c9565b505050565b6105ff81610b2c565b50565b60006103c282610949565b60006103c282610b37565b6000610622610ba0565b905061062f826001610a15565b919050565b606061063e610804565b60030180546103349061135a565b80610655610804565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6106d48484846103e7565b6001600160a01b0383163b1561070d576106f084848484610bb0565b61070d576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061071e82610c9b565b61073b57604051630a14c4b560e41b815260040160405180910390fd5b600061075260408051602081019091526000815290565b90508051600003610772576040518060200160405280600081525061079d565b8061077c84610cd7565b60405160200161078d929190611394565b6040516020818303038152906040525b9392505050565b7f2d0d21306acfe8e9bb163a4573e95aff6cef95dc1102c6a16d5f19eac08cc4de54640100000000900460ff166107ee57604051630ef4733760e31b815260040160405180910390fd5b6103d48282610d1b565b600061079d8383610d8f565b7f234d8962d7c9a6a6604d7f98797e6ad6d7a886804f7409feb26422e27bf8125490565b600061083382610c9b565b610850576040516333d1c03960e21b815260040160405180910390fd5b610858610804565b60009283526006016020525060409020546001600160a01b031690565b600061088083610602565b905081156108bf57336001600160a01b038216146108bf576108a28133610d8f565b6108bf576040516367d9dca160e11b815260040160405180910390fd5b836108c8610804565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b600080610935610804565b60010154610941610804565b540303919050565b6000610953610804565b600083815260049190910160205260408120549150600160e01b821690036109d4578060000361062f57610985610804565b5482106109a557604051636f96cda160e11b815260040160405180910390fd5b6109ad610804565b6000199092016000818152600493909301602052604090922054905080156109a557919050565b604051636f96cda160e11b815260040160405180910390fd5b60008060006109fa610804565b60009485526006016020525050604090912080549092909150565b6000610a1f610804565b5490506000829003610a445760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202610a58610804565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717610a93610804565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083906000805160206115318339815191528180a4600183015b818114610af95780836000600080516020611531833981519152600080a4600101610ad3565b5081600003610b1a57604051622e076360e81b815260040160405180910390fd5b80610b23610804565b55506105f19050565b6105ff816000610dcc565b60006001600160a01b038216610b60576040516323d3ad8160e21b815260040160405180910390fd5b67ffffffffffffffff610b71610804565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6000610baa610804565b54919050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290610be59033908990889088906004016113c3565b6020604051808303816000875af1925050508015610c20575060408051601f3d908101601f19168201909252610c1d91810190611400565b60015b610c7e573d808015610c4e576040519150601f19603f3d011682016040523d82523d6000602084013e610c53565b606091505b508051600003610c76576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000610ca5610804565b54821080156103c25750600160e01b610cbc610804565b60008481526004919091016020526040902054161592915050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480610cf15750819003601f19909101908152919050565b7f2d0d21306acfe8e9bb163a4573e95aff6cef95dc1102c6a16d5f19eac08cc4de54640100000000900460ff16610d6557604051630ef4733760e31b815260040160405180910390fd5b610d756380ac58cd60e01b610f3b565b610d85635b5e139f60e01b610f3b565b6103d48282611019565b6000610d99610804565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b6000610dd783610949565b905080600080610de6866109ed565b915091508415610e2657610dfb818433610441565b610e2657610e098333610d8f565b610e2657604051632ce44b5f60e11b815260040160405180910390fd5b8015610e3157600082555b6fffffffffffffffffffffffffffffffff610e4a610804565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b17600360e01b17610e83610804565b60008881526004919091016020526040812091909155600160e11b85169003610ef95760018601610eb2610804565b600082815260049190910160205260408120549003610ef757610ed3610804565b548114610ef75784610ee3610804565b600083815260049190910160205260409020555b505b60405186906000906001600160a01b03861690600080516020611531833981519152908390a4610f27610804565b600190810180549091019055505050505050565b6001600160e01b0319811660009081527fbc7de460bcfb6afd0c415c8c610d408bd914b18d7d0feec0da9e25348087a5c4602052604090205460ff161515600114610fc8576001600160e01b0319811660009081527fbc7de460bcfb6afd0c415c8c610d408bd914b18d7d0feec0da9e25348087a5c460205260409020805460ff19166001179055610fe1565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6000611023610804565b9050600281016110338482611470565b50600381016110428382611470565b50600090555050565b60005b8381101561106657818101518382015260200161104e565b50506000910152565b6000815180845261108781602086016020860161104b565b601f01601f19169290920160200192915050565b60208152600061079d602083018461106f565b6000602082840312156110c057600080fd5b5035919050565b80356001600160a01b038116811461062f57600080fd5b600080604083850312156110f157600080fd5b6110fa836110c7565b946020939093013593505050565b60008060006060848603121561111d57600080fd5b611126846110c7565b9250611134602085016110c7565b9150604084013590509250925092565b60006020828403121561115657600080fd5b61079d826110c7565b6000806040838503121561117257600080fd5b61117b836110c7565b91506020830135801515811461119057600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156111cc576111cc61119b565b604051601f8501601f19908116603f011681019082821181831017156111f4576111f461119b565b8160405280935085815286868601111561120d57600080fd5b858560208301376000602087830101525050509392505050565b6000806000806080858703121561123d57600080fd5b611246856110c7565b9350611254602086016110c7565b925060408501359150606085013567ffffffffffffffff81111561127757600080fd5b8501601f8101871361128857600080fd5b611297878235602084016111b1565b91505092959194509250565b600082601f8301126112b457600080fd5b61079d838335602085016111b1565b600080604083850312156112d657600080fd5b823567ffffffffffffffff808211156112ee57600080fd5b6112fa868387016112a3565b9350602085013591508082111561131057600080fd5b5061131d858286016112a3565b9150509250929050565b6000806040838503121561133a57600080fd5b611343836110c7565b9150611351602084016110c7565b90509250929050565b600181811c9082168061136e57607f821691505b60208210810361138e57634e487b7160e01b600052602260045260246000fd5b50919050565b600083516113a681846020880161104b565b8351908301906113ba81836020880161104b565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906113f69083018461106f565b9695505050505050565b60006020828403121561141257600080fd5b81516001600160e01b03198116811461079d57600080fd5b601f8211156105f157600081815260208120601f850160051c810160208610156114515750805b601f850160051c820191505b818110156105c45782815560010161145d565b815167ffffffffffffffff81111561148a5761148a61119b565b61149e81611498845461135a565b8461142a565b602080601f8311600181146114d357600084156114bb5750858301515b600019600386901b1c1916600185901b1785556105c4565b600085815260208120601f198616915b82811015611502578886015182559484019460019091019084016114e3565b50858210156115205787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', + sourceMap: + '188:302:261:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2044:116:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3522:132;;;;;;;;;;-1:-1:-1;3522:132:90;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1119:32:420;;;1101:51;;1089:2;1074:18;3522:132:90;955:203:420;3260:128:90;;;;;;:::i;:::-;;:::i;:::-;;1527:93;;;;;;;;;;;;;:::i;:::-;;;1746:25:420;;;1734:2;1719:18;1527:93:90;1600:177:420;4917:2680:90;;;;;;:::i;:::-;;:::i;344:79:261:-;;;;;;;;;;-1:-1:-1;344:79:261;;;;;:::i;:::-;;:::i;7680:167:90:-;;;;;;:::i;:::-;;:::i;427:61:261:-;;;;;;;;;;-1:-1:-1;427:61:261;;;;;:::i;:::-;;:::i;2891:152:90:-;;;;;;;;;;-1:-1:-1;2891:152:90;;;;;:::i;:::-;;:::i;1697:107::-;;;;;;;;;;-1:-1:-1;1697:107:90;;;;;:::i;:::-;;:::i;224:116:261:-;;;;;;;;;;-1:-1:-1;224:116:261;;;;;:::i;:::-;;:::i;2223:120:90:-;;;;;;;;;;;;;:::i;3957:269::-;;;;;;;;;;-1:-1:-1;3957:269:90;;;;;:::i;:::-;;:::i;8396:348::-;;;;;;:::i;:::-;;:::i;2436:329::-;;;;;;;;;;-1:-1:-1;2436:329:90;;;;;:::i;:::-;;:::i;876:157::-;;;;;;;;;;-1:-1:-1;876:157:90;;;;;:::i;:::-;;:::i;4364:167::-;;;;;;;;;;-1:-1:-1;4364:167:90;;;;;:::i;:::-;;:::i;:::-;;;5301:14:420;;5294:22;5276:41;;5264:2;5249:18;4364:167:90;5136:187:420;2044:116:90;2098:13;2126:23;:21;:23::i;:::-;:29;;2119:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2044:116;:::o;3522:132::-;3606:7;3628:21;3641:7;3628:12;:21::i;:::-;3621:28;3522:132;-1:-1:-1;;3522:132:90:o;3260:128::-;3356:27;3365:2;3369:7;3378:4;3356:8;:27::i;:::-;3260:128;;:::o;1527:93::-;1579:7;1601:14;:12;:14::i;:::-;1594:21;;1527:93;:::o;4917:2680::-;5036:27;5066;5085:7;5066:18;:27::i;:::-;5036:57;;5145:4;-1:-1:-1;;;;;5104:45:90;5120:19;-1:-1:-1;;;;;5104:45:90;;5100:92;;5164:28;;-1:-1:-1;;;5164:28:90;;;;;;;;;;;5100:92;5207:27;5242:23;5274:35;5301:7;5274:26;:35::i;:::-;5199:110;;;;5398:68;5423:15;5440:4;5446:19;29472:10:91;;29390:97;5446:19:90;-1:-1:-1;;;;;11873:32:91;;;11731:28;;11988:20;;12010:30;;11985:56;;11464:587;5398:68:90;5393:181;;5479:43;5496:4;29472:10:91;4364:167:90;:::i;5479:43::-;5474:100;;5539:35;;-1:-1:-1;;;5539:35:90;;;;;;;;;;;5474:100;-1:-1:-1;;;;;5585:16:90;;5581:52;;5610:23;;-1:-1:-1;;;5610:23:90;;;;;;;;;;;5581:52;5758:15;5755:135;;;5880:1;5859:19;5852:30;5755:135;6230:23;:21;:23::i;:::-;-1:-1:-1;;;;;6230:48:90;;;;;;:42;;;;;:48;;;;;6228:50;;-1:-1:-1;;6228:50:90;;;6316:23;:21;:23::i;:::-;-1:-1:-1;;;;;6316:46:90;;;;;;:42;;;;;:46;;;;;;6314:48;;;;;;10232:11:91;10207:23;10203:41;10190:63;-1:-1:-1;;;10190:63:91;6590:23:90;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;:184;;;;-1:-1:-1;;;6879:47:90;;:52;;6875:625;;6975:1;6965:11;;7080:23;:21;:23::i;:::-;:54;;;;:41;;;;;:54;;;;;;:59;;7076:416;;7220:23;:21;:23::i;:::-;:37;7205:52;;7201:281;;7450:19;7365:23;:21;:23::i;:::-;:82;;;;:41;;;;;:82;;;;;:104;7201:281;6933:567;6875:625;7536:7;7532:2;-1:-1:-1;;;;;7517:27:90;7526:4;-1:-1:-1;;;;;7517:27:90;-1:-1:-1;;;;;;;;;;;7517:27:90;;;;;;;;;7550:42;5030:2567;;;4917:2680;;;:::o;344:79:261:-;401:17;407:2;411:6;401:5;:17::i;7680:167:90:-;7803:39;7820:4;7826:2;7830:7;7803:39;;;;;;;;;;;;:16;:39::i;:::-;7680:167;;;:::o;427:61:261:-;471:12;477:5;471;:12::i;:::-;427:61;:::o;2891:152:90:-;2971:7;3009:27;3028:7;3009:18;:27::i;1697:107::-;1760:7;1782:17;1793:5;1782:10;:17::i;224:116:261:-;270:15;303:14;:12;:14::i;:::-;293:24;;323:12;329:2;333:1;323:5;:12::i;:::-;224:116;;;:::o;2223:120:90:-;2279:13;2307:23;:21;:23::i;:::-;:31;;2300:38;;;;;:::i;3957:269::-;4147:8;4059:23;:21;:23::i;:::-;29472:10:91;4059:63:90;;;;:42;;;;;:63;;;;;;;;-1:-1:-1;;;;;4059:85:90;;;;;;;;;;;;:96;;-1:-1:-1;;4059:96:90;;;;;;;;;;;4166:55;;5301:14:420;;5294:22;5276:41;;4059:85:90;;29472:10:91;;4166:55:90;;5249:18:420;4166:55:90;;;;;;;3957:269;;:::o;8396:348::-;8543:31;8556:4;8562:2;8566:7;8543:12;:31::i;:::-;-1:-1:-1;;;;;8584:14:90;;;:19;8580:160;;8616:56;8647:4;8653:2;8657:7;8666:5;8616:30;:56::i;:::-;8611:129;;8691:40;;-1:-1:-1;;;8691:40:90;;;;;;;;;;;8611:129;8396:348;;;;:::o;2436:329::-;2517:13;2543:16;2551:7;2543;:16::i;:::-;2538:59;;2568:29;;-1:-1:-1;;;2568:29:90;;;;;;;;;;;2538:59;2604:21;2628:10;6624:9:91;;;;;;;;;-1:-1:-1;6624:9:91;;;6552:86;2628:10:90;2604:34;;2663:7;2657:21;2682:1;2657:26;:103;;;;;;;;;;;;;;;;;2718:7;2727:18;2737:7;2727:9;:18::i;:::-;2701:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2657:103;2644:116;2436:329;-1:-1:-1;;;2436:329:90:o;876:157::-;186:68:55;1263:42:54;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:54;;;;;;;;;;;1258:100;988:40:90::1;1013:5;1020:7;988:24;:40::i;4364:167::-:0;4473:4;4492:34;4510:5;4517:8;4492:17;:34::i;1557:139:92:-;183:44;;1557:139::o;22507:230:91:-;22585:7;22605:16;22613:7;22605;:16::i;:::-;22600:64;;22630:34;;-1:-1:-1;;;22630:34:91;;;;;;;;;;;22600:64;22678:23;:21;:23::i;:::-;:48;;;;:39;;:48;;-1:-1:-1;22678:48:91;;;:54;-1:-1:-1;;;;;22678:54:91;;22507:230::o;23287:439::-;23393:13;23409:17;23418:7;23409:8;:17::i;:::-;23393:33;;23437:13;23433:184;;;29472:10;-1:-1:-1;;;;;23462:28:91;;;23458:159;;23505:45;23523:5;29472:10;23505:17;:45::i;:::-;23500:117;;23571:35;;-1:-1:-1;;;23571:35:91;;;;;;;;;;;23500:117;23680:2;23623:23;:21;:23::i;:::-;:48;;;;:39;;;;;:48;;;;;;:59;;-1:-1:-1;;;;;;23623:59:91;-1:-1:-1;;;;;23623:59:91;;;;;;23693:28;23623:48;;23693:28;;;;;;;;;;23623:48;23693:28;23387:339;23287:439;;;:::o;2985:351::-;3032:7;;3263:23;:21;:23::i;:::-;:36;;;3215:23;:21;:23::i;:::-;:37;:84;:110;;2985:351;-1:-1:-1;2985:351:91:o;7836:1497::-;7912:14;7983:23;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;;;-1:-1:-1;;;;8069:24:91;;:29;;8065:1214;;8190:6;8200:1;8190:11;8186:833;;8230:23;:21;:23::i;:::-;:37;8219:48;;8215:104;;8288:31;;-1:-1:-1;;;8288:31:91;;;;;;;;;;;8215:104;8864:23;:21;:23::i;:::-;-1:-1:-1;;8906:9:91;;;8864:52;;;;:41;;;;;:52;;;;;;;;-1:-1:-1;8944:25:91;;8806:203;8944:25;7836:1497;;;:::o;8065:1214::-;9297:31;;-1:-1:-1;;;9297:31:91;;;;;;;;;;;12151:478;12247:27;12276:23;12309:38;12350:30;:28;:30::i;:::-;:62;;;;:53;;:62;;-1:-1:-1;;12350:62:91;;;;12593:26;;12350:62;;12593:26;;-1:-1:-1;12151:478:91:o;15802:2642::-;15870:20;15893:23;:21;:23::i;:::-;:37;;-1:-1:-1;15893:37:91;15940:13;;;15936:44;;15962:18;;-1:-1:-1;;;15962:18:91;;;;;;;;;;;15936:44;16477:32;16457:53;;16399:23;:21;:23::i;:::-;-1:-1:-1;;;;;16399:46:91;;;;;;:42;;;;;:46;;;;;;:111;;;;;;;;;10232:11;10207:23;10203:41;-1:-1:-1;10627:15:91;;10601:24;10597:46;10200:52;10190:63;16710:23;:21;:23::i;:::-;:71;;;;:41;;;;;:71;;;;;:188;;;;-1:-1:-1;;;;;17419:25:91;;;16945:23;;;;16761:12;;17419:25;;-1:-1:-1;;;;;;;;;;;16710:71:91;;17491:260;18029:1;18015:12;18011:20;17980:275;18061:3;18052:7;18049:16;17980:275;;18237:7;18227:8;18224:1;-1:-1:-1;;;;;;;;;;;18194:1:91;18191;18186:59;18103:1;18090:15;17980:275;;;17984:57;18274:8;18286:1;18274:13;18270:45;;18296:19;;-1:-1:-1;;;18296:19:91;;;;;;;;;;;18270:45;18364:3;18324:23;:21;:23::i;:::-;:43;-1:-1:-1;18379:60:91;;-1:-1:-1;8396:348:90;23970:81:91;24025:21;24031:7;24040:5;24025;:21::i;3340:242::-;3398:7;-1:-1:-1;;;;;3417:19:91;;3413:60;;3445:28;;-1:-1:-1;;;3445:28:91;;;;;;;;;;;3413:60;571:13;3492:23;:21;:23::i;:::-;:42;;:49;3535:5;-1:-1:-1;;;;;3492:49:91;-1:-1:-1;;;;;3492:49:91;;;;;;;;;;;;;:85;3479:98;;3340:242;;;:::o;4042:119::-;4097:7;4119:23;:21;:23::i;:::-;:37;;4042:119;-1:-1:-1;4042:119:91:o;14710:674::-;14873:139;;-1:-1:-1;;;14873:139:91;;14851:4;;-1:-1:-1;;;;;14873:56:91;;;;;:139;;29472:10;;14968:4;;14982:7;;14999:5;;14873:139;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14873:139:91;;;;;;;;-1:-1:-1;;14873:139:91;;;;;;;;;;;;:::i;:::-;;;14863:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15195:6;:13;15212:1;15195:18;15191:183;;15232:40;;-1:-1:-1;;;15232:40:91;;;;;;;;;;;15191:183;15348:6;15342:13;15333:6;15329:2;15325:15;15318:38;14863:517;-1:-1:-1;;;;;;15064:83:91;-1:-1:-1;;;15064:83:91;;-1:-1:-1;14710:674:91;;;;;;:::o;11067:301::-;11132:4;11203:23;:21;:23::i;:::-;:37;11193:47;;11157:187;;;;;-1:-1:-1;;;11271:23:91;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;;:68;:73;11144:200;11067:301;-1:-1:-1;;11067:301:91:o;29576:1574::-;29649:17;30043:4;30036;30030:11;30026:22;30121:1;30115:4;30108:15;30182:4;30179:1;30175:12;30168:19;;;30250:1;30245:3;30238:14;30339:3;30549:5;30531:419;30596:1;30591:3;30587:11;30580:18;;30764:2;30758:4;30754:13;30750:2;30746:22;30741:3;30733:36;30856:2;30846:13;;30911:25;30531:419;30911:25;-1:-1:-1;30972:13:91;;;-1:-1:-1;;31073:14:91;;;31121:19;;;31073:14;29576:1574;-1:-1:-1;29576:1574:91:o;1037:299:90:-;186:68:55;1263:42:54;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:54;;;;;;;;;;;1258:100;1159:25:90::1;-1:-1:-1::0;;;1159:13:90::1;:25::i;:::-;1224;-1:-1:-1::0;;;1224:13:90::1;:25::i;:::-;1297:34;1316:5;1323:7;1297:18;:34::i;22317:186:91:-:0;22420:4;22439:23;:21;:23::i;:::-;-1:-1:-1;;;;;22439:49:91;;;;;;;:42;;;;;:49;;;;;;;;:59;;;;;;;;;;-1:-1:-1;22439:59:91;;;;;22317:186::o;24246:2906::-;24321:27;24351;24370:7;24351:18;:27::i;:::-;24321:57;-1:-1:-1;24321:57:91;24385:12;;24519:35;24546:7;24519:26;:35::i;:::-;24444:110;;;;24565:13;24561:299;;;24672:68;24697:15;24714:4;29472:10;24720:19;29390:97;24672:68;24667:186;;24755:44;24773:4;29472:10;23505:17;:45::i;24755:44::-;24750:103;;24818:35;;-1:-1:-1;;;24818:35:91;;;;;;;;;;;24750:103;24992:15;24989:135;;;25114:1;25093:19;25086:30;24989:135;25711:40;25651:23;:21;:23::i;:::-;-1:-1:-1;;;;;25651:48:91;;;;;;:42;;;;;:48;;;;;;:100;;;;;;;;;10232:11;10207:23;10203:41;10190:63;-1:-1:-1;;;10190:63:91;25946:23;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;:214;;;;-1:-1:-1;;;26265:47:91;;:52;;26261:625;;26361:1;26351:11;;26466:23;:21;:23::i;:::-;:54;;;;:41;;;;;:54;;;;;;:59;;26462:416;;26606:23;:21;:23::i;:::-;:37;26591:52;;26587:281;;26836:19;26751:23;:21;:23::i;:::-;:82;;;;:41;;;;;:82;;;;;:104;26587:281;26319:567;26261:625;26903:35;;26930:7;;26926:1;;-1:-1:-1;;;;;26903:35:91;;;-1:-1:-1;;;;;;;;;;;26903:35:91;26926:1;;26903:35;27103:23;:21;:23::i;:::-;:36;;;;:38;;;;;;;-1:-1:-1;;;;;;24246:2906:91:o;461:282:57:-;-1:-1:-1;;;;;;1130:62:57;;1105:4;1130:62;;;186:68:59;1130:62:57;;;;;;;;:70;;:62;:70;519:182;;-1:-1:-1;;;;;;565:62:57;;:49;:62;;;186:68:59;565:62:57;;;;;:69;;-1:-1:-1;;565:69:57;630:4;565:69;;;519:182;;;662:32;;-1:-1:-1;;;662:32:57;;;;;;;;;;;519:182;711:27;;-1:-1:-1;;;;;;711:27:57;;;;;;;;461:282;:::o;2560:247:91:-;2657:32;2692:23;:21;:23::i;:::-;2657:58;-1:-1:-1;2722:8:91;;;:15;2733:4;2722:8;:15;:::i;:::-;-1:-1:-1;2743:10:91;;;:19;2756:6;2743:10;:19;:::i;:::-;-1:-1:-1;3948:7:91;2768:34;;-1:-1:-1;;2560:247:91:o;14:250:420:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:420;238:16;;231:27;14:250::o;269:271::-;311:3;349:5;343:12;376:6;371:3;364:19;392:76;461:6;454:4;449:3;445:14;438:4;431:5;427:16;392:76;:::i;:::-;522:2;501:15;-1:-1:-1;;497:29:420;488:39;;;;529:4;484:50;;269:271;-1:-1:-1;;269:271:420:o;545:220::-;694:2;683:9;676:21;657:4;714:45;755:2;744:9;740:18;732:6;714:45;:::i;770:180::-;829:6;882:2;870:9;861:7;857:23;853:32;850:52;;;898:1;895;888:12;850:52;-1:-1:-1;921:23:420;;770:180;-1:-1:-1;770:180:420:o;1163:173::-;1231:20;;-1:-1:-1;;;;;1280:31:420;;1270:42;;1260:70;;1326:1;1323;1316:12;1341:254;1409:6;1417;1470:2;1458:9;1449:7;1445:23;1441:32;1438:52;;;1486:1;1483;1476:12;1438:52;1509:29;1528:9;1509:29;:::i;:::-;1499:39;1585:2;1570:18;;;;1557:32;;-1:-1:-1;;;1341:254:420:o;1782:328::-;1859:6;1867;1875;1928:2;1916:9;1907:7;1903:23;1899:32;1896:52;;;1944:1;1941;1934:12;1896:52;1967:29;1986:9;1967:29;:::i;:::-;1957:39;;2015:38;2049:2;2038:9;2034:18;2015:38;:::i;:::-;2005:48;;2100:2;2089:9;2085:18;2072:32;2062:42;;1782:328;;;;;:::o;2115:186::-;2174:6;2227:2;2215:9;2206:7;2202:23;2198:32;2195:52;;;2243:1;2240;2233:12;2195:52;2266:29;2285:9;2266:29;:::i;2306:347::-;2371:6;2379;2432:2;2420:9;2411:7;2407:23;2403:32;2400:52;;;2448:1;2445;2438:12;2400:52;2471:29;2490:9;2471:29;:::i;:::-;2461:39;;2550:2;2539:9;2535:18;2522:32;2597:5;2590:13;2583:21;2576:5;2573:32;2563:60;;2619:1;2616;2609:12;2563:60;2642:5;2632:15;;;2306:347;;;;;:::o;2658:127::-;2719:10;2714:3;2710:20;2707:1;2700:31;2750:4;2747:1;2740:15;2774:4;2771:1;2764:15;2790:631;2854:5;2884:18;2925:2;2917:6;2914:14;2911:40;;;2931:18;;:::i;:::-;3006:2;3000:9;2974:2;3060:15;;-1:-1:-1;;3056:24:420;;;3082:2;3052:33;3048:42;3036:55;;;3106:18;;;3126:22;;;3103:46;3100:72;;;3152:18;;:::i;:::-;3192:10;3188:2;3181:22;3221:6;3212:15;;3251:6;3243;3236:22;3291:3;3282:6;3277:3;3273:16;3270:25;3267:45;;;3308:1;3305;3298:12;3267:45;3358:6;3353:3;3346:4;3338:6;3334:17;3321:44;3413:1;3406:4;3397:6;3389;3385:19;3381:30;3374:41;;;;2790:631;;;;;:::o;3426:666::-;3521:6;3529;3537;3545;3598:3;3586:9;3577:7;3573:23;3569:33;3566:53;;;3615:1;3612;3605:12;3566:53;3638:29;3657:9;3638:29;:::i;:::-;3628:39;;3686:38;3720:2;3709:9;3705:18;3686:38;:::i;:::-;3676:48;;3771:2;3760:9;3756:18;3743:32;3733:42;;3826:2;3815:9;3811:18;3798:32;3853:18;3845:6;3842:30;3839:50;;;3885:1;3882;3875:12;3839:50;3908:22;;3961:4;3953:13;;3949:27;-1:-1:-1;3939:55:420;;3990:1;3987;3980:12;3939:55;4013:73;4078:7;4073:2;4060:16;4055:2;4051;4047:11;4013:73;:::i;:::-;4003:83;;;3426:666;;;;;;;:::o;4097:221::-;4140:5;4193:3;4186:4;4178:6;4174:17;4170:27;4160:55;;4211:1;4208;4201:12;4160:55;4233:79;4308:3;4299:6;4286:20;4279:4;4271:6;4267:17;4233:79;:::i;4323:543::-;4411:6;4419;4472:2;4460:9;4451:7;4447:23;4443:32;4440:52;;;4488:1;4485;4478:12;4440:52;4528:9;4515:23;4557:18;4598:2;4590:6;4587:14;4584:34;;;4614:1;4611;4604:12;4584:34;4637:50;4679:7;4670:6;4659:9;4655:22;4637:50;:::i;:::-;4627:60;;4740:2;4729:9;4725:18;4712:32;4696:48;;4769:2;4759:8;4756:16;4753:36;;;4785:1;4782;4775:12;4753:36;;4808:52;4852:7;4841:8;4830:9;4826:24;4808:52;:::i;:::-;4798:62;;;4323:543;;;;;:::o;4871:260::-;4939:6;4947;5000:2;4988:9;4979:7;4975:23;4971:32;4968:52;;;5016:1;5013;5006:12;4968:52;5039:29;5058:9;5039:29;:::i;:::-;5029:39;;5087:38;5121:2;5110:9;5106:18;5087:38;:::i;:::-;5077:48;;4871:260;;;;;:::o;5328:380::-;5407:1;5403:12;;;;5450;;;5471:61;;5525:4;5517:6;5513:17;5503:27;;5471:61;5578:2;5570:6;5567:14;5547:18;5544:38;5541:161;;5624:10;5619:3;5615:20;5612:1;5605:31;5659:4;5656:1;5649:15;5687:4;5684:1;5677:15;5541:161;;5328:380;;;:::o;5713:496::-;5892:3;5930:6;5924:13;5946:66;6005:6;6000:3;5993:4;5985:6;5981:17;5946:66;:::i;:::-;6075:13;;6034:16;;;;6097:70;6075:13;6034:16;6144:4;6132:17;;6097:70;:::i;:::-;6183:20;;5713:496;-1:-1:-1;;;;5713:496:420:o;6214:489::-;-1:-1:-1;;;;;6483:15:420;;;6465:34;;6535:15;;6530:2;6515:18;;6508:43;6582:2;6567:18;;6560:34;;;6630:3;6625:2;6610:18;;6603:31;;;6408:4;;6651:46;;6677:19;;6669:6;6651:46;:::i;:::-;6643:54;6214:489;-1:-1:-1;;;;;;6214:489:420:o;6708:290::-;6777:6;6830:2;6818:9;6809:7;6805:23;6801:32;6798:52;;;6846:1;6843;6836:12;6798:52;6872:16;;-1:-1:-1;;;;;;6917:32:420;;6907:43;;6897:71;;6964:1;6961;6954:12;7129:545;7231:2;7226:3;7223:11;7220:448;;;7267:1;7292:5;7288:2;7281:17;7337:4;7333:2;7323:19;7407:2;7395:10;7391:19;7388:1;7384:27;7378:4;7374:38;7443:4;7431:10;7428:20;7425:47;;;-1:-1:-1;7466:4:420;7425:47;7521:2;7516:3;7512:12;7509:1;7505:20;7499:4;7495:31;7485:41;;7576:82;7594:2;7587:5;7584:13;7576:82;;;7639:17;;;7620:1;7609:13;7576:82;;7850:1352;7976:3;7970:10;8003:18;7995:6;7992:30;7989:56;;;8025:18;;:::i;:::-;8054:97;8144:6;8104:38;8136:4;8130:11;8104:38;:::i;:::-;8098:4;8054:97;:::i;:::-;8206:4;;8270:2;8259:14;;8287:1;8282:663;;;;8989:1;9006:6;9003:89;;;-1:-1:-1;9058:19:420;;;9052:26;9003:89;-1:-1:-1;;7807:1:420;7803:11;;;7799:24;7795:29;7785:40;7831:1;7827:11;;;7782:57;9105:81;;8252:944;;8282:663;7076:1;7069:14;;;7113:4;7100:18;;-1:-1:-1;;8318:20:420;;;8436:236;8450:7;8447:1;8444:14;8436:236;;;8539:19;;;8533:26;8518:42;;8631:27;;;;8599:1;8587:14;;;;8466:19;;8436:236;;;8440:3;8700:6;8691:7;8688:19;8685:201;;;8761:19;;;8755:26;-1:-1:-1;;8844:1:420;8840:14;;;8856:3;8836:24;8832:37;8828:42;8813:58;8798:74;;8685:201;-1:-1:-1;;;;;8932:1:420;8916:14;;;8912:22;8899:36;;-1:-1:-1;7850:1352:420:o', + linkReferences: {}, + }, + methodIdentifiers: { + '__ERC721A_init(string,string)': 'd2f01f19', + 'approve(address,uint256)': '095ea7b3', + 'balanceOf(address)': '70a08231', + 'burn(uint256)': '42966c68', + 'getApproved(uint256)': '081812fc', + 'isApprovedForAll(address,address)': 'e985e9c5', + 'mint(address,uint256)': '40c10f19', + 'mintTo(address)': '755edd17', + 'name()': '06fdde03', + 'ownerOf(uint256)': '6352211e', + 'safeTransferFrom(address,address,uint256)': '42842e0e', + 'safeTransferFrom(address,address,uint256,bytes)': 'b88d4fde', + 'setApprovalForAll(address,bool)': 'a22cb465', + 'symbol()': '95d89b41', + 'tokenURI(uint256)': 'c87b56dd', + 'totalSupply()': '18160ddd', + 'transferFrom(address,address,uint256)': '23b872dd', + }, + rawMetadata: + '{"compiler":{"version":"0.8.20+commit.a1b79de6"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"Initializable_InInitializingState","type":"error"},{"inputs":[],"name":"Initializable_NotInInitializingState","type":"error"},{"inputs":[],"name":"Introspection_AlreadySupported","type":"error"},{"inputs":[],"name":"Introspection_NotSupported","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"version","type":"uint32"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"InterfaceAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"InterfaceRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"name":"__ERC721A_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mintTo","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"}],"devdoc":{"events":{"Approval(address,address,uint256)":{"details":"Emitted when `owner` enables `approved` to manage the `tokenId` token."},"ApprovalForAll(address,address,bool)":{"details":"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets."},"ConsecutiveTransfer(uint256,uint256,address,address)":{"details":"Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, as defined in the [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. See {_mintERC2309} for more details."},"Transfer(address,address,uint256)":{"details":"Emitted when `tokenId` token is transferred from `from` to `to`."}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator."},"balanceOf(address)":{"details":"Returns the number of tokens in `owner`\'s account."},"getApproved(uint256)":{"details":"Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist."},"isApprovedForAll(address,address)":{"details":"Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}."},"name()":{"details":"Returns the token collection name."},"ownerOf(uint256)":{"details":"Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist."},"safeTransferFrom(address,address,uint256)":{"details":"Equivalent to `safeTransferFrom(from, to, tokenId, \'\')`."},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event."},"setApprovalForAll(address,bool)":{"details":"Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event."},"symbol()":{"details":"Returns the token collection symbol."},"tokenURI(uint256)":{"details":"Returns the Uniform Resource Identifier (URI) for `tokenId` token."},"totalSupply()":{"details":"Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}."},"transferFrom(address,address,uint256)":{"details":"Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event."}},"version":1},"userdoc":{"errors":{"ApprovalCallerNotOwnerNorApproved()":[{"notice":"The caller must own the token or be an approved operator."}],"ApprovalQueryForNonexistentToken()":[{"notice":"The token does not exist."}],"BalanceQueryForZeroAddress()":[{"notice":"Cannot query the balance for the zero address."}],"MintERC2309QuantityExceedsLimit()":[{"notice":"The `quantity` minted with ERC2309 exceeds the safety limit."}],"MintToZeroAddress()":[{"notice":"Cannot mint to the zero address."}],"MintZeroQuantity()":[{"notice":"The quantity of tokens minted must be more than zero."}],"OwnerQueryForNonexistentToken()":[{"notice":"The token does not exist."}],"OwnershipNotInitializedForExtraData()":[{"notice":"The `extraData` cannot be set on an unintialized ownership slot."}],"TransferCallerNotOwnerNorApproved()":[{"notice":"The caller must own the token or be an approved operator."}],"TransferFromIncorrectOwner()":[{"notice":"The token must be owned by `from`."}],"TransferToNonERC721ReceiverImplementer()":[{"notice":"Cannot safely transfer to a contract that does not implement the ERC721Receiver interface."}],"TransferToZeroAddress()":[{"notice":"Cannot transfer to the zero address."}],"URIQueryForNonexistentToken()":[{"notice":"The token does not exist."}]},"events":{"InterfaceAdded(bytes4)":{"notice":"Emitted when an interface is added to the contract via `_addInterface`."},"InterfaceRemoved(bytes4)":{"notice":"Emitted when an interface is removed from the contract via `_removeInterface`."}},"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/test/mocks/MockERC721A.sol":"MockERC721A"},"evmVersion":"paris","libraries":{},"metadata":{"appendCBOR":false,"bytecodeHash":"none"},"optimizer":{"enabled":true,"runs":200},"remappings":[":@openzeppelin/=lib/openzeppelin-contracts/",":@prb/math/=lib/prb-math/src/",":@prb/test/=lib/prb-test/src/",":ERC721A/=lib/ERC721A/contracts/",":base64-sol/=lib/base64/",":base64/=lib/base64/",":council/=lib/council/contracts/",":ds-test/=lib/ds-test/src/",":erc4626-tests/=lib/operator-filter-registry/lib/openzeppelin-contracts/lib/erc4626-tests/",":forge-std/=lib/forge-std/src/",":@openzeppelin/contracts-upgradeable/=lib/@openzeppelin/contracts-upgradeable/contracts/",":openzeppelin-contracts/=lib/openzeppelin-contracts/",":operator-filter-registry/=lib/operator-filter-registry/",":prb-math/=lib/prb-math/src/",":prb-test/=lib/prb-test/src/"]},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0x8213b85d1271bc3c2aa9842979c8ad825066c4c9addc55296d53b6747e5198ba","license":"Apache-2.0","urls":["bzz-raw://b4e88e869c99e65f0caeb9d03938e78c578a869783b9f20c05f4ba52e7ca493d","dweb:/ipfs/QmRqPmg8BYD1V6Cd8kfihCQ7nn2DAsgRjGW2MJvc7Evnjt"]},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0x2a4f3a99b3b3ac6c2c18431cea80b40774c1d8265ddefac21b26da561e069096","license":"MIT","urls":["bzz-raw://36dbba730942b1fd345f242051ea7f33e979f70392fbd929d8522c0c9c6dd367","dweb:/ipfs/QmYMvYnvg9zQJpDQX9yMHZ1AET9Vx7UXtDenXAs1JhfPpd"]},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x99dfe047dbb8df48a7490f63939420dd990fb5fd3b3a03c42d0cb9c6f4f9eefa","license":"Apache-2.0","urls":["bzz-raw://5e8f6d4bff257324e4544cacadd9fee42bada459f457fb707fef90bcfe0e895a","dweb:/ipfs/QmYWEam5VcMt5ViNMKRkaxoD84MK2MewS5iWwSES589Vma"]},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0xa1dfa0449031fced106dd105c184823595398c876be53b4bb8d855937a435816","license":"Apache-2.0","urls":["bzz-raw://e98a9007bca24776e4580c9326cfbb72ffe56334229626c336545be8c2c6e6d2","dweb:/ipfs/QmdqoQTUoDKqirUR3hscy4zBh4Kn2E1fRta1y9DfA43urV"]},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0xbdc803a2179838316625692285c4b720cdbae1c78e5f9a68560719c909253d00","license":"Apache-2.0","urls":["bzz-raw://776a4490b22b01b554770d71afde7bed4c32ea639a08c84a194076eddf5517be","dweb:/ipfs/QmcPVR9T7vXccCg7RXQ4wXtHaBG6ugrEXk8qnhRpsYMVd6"]},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0xd2ec3bbe4d15f9232006b41e0a80a5127006243ee596754af77bd3926045782a","license":"Apache-2.0","urls":["bzz-raw://8c47e18bfd34a687ce9ec75dc1f1fa5bca088e97e59aad2ac3fdb0989d06d7e6","dweb:/ipfs/QmdktQXV7PKABzh43SZqemdTG25RxMaMsgpXTTUvZUxmfU"]},"contracts/src/diamond/facets/token/ERC721A/ERC721A.sol":{"keccak256":"0x321ea4cd6a2617d12cdf6bcd84095072de32ecfddfa95df83e58711c4684e325","license":"Apache-2.0","urls":["bzz-raw://95b09721ac18cc7d34859486008989238dfc9ff9bbafb300ce7a3b2ecfb201a1","dweb:/ipfs/Qmcdzd3hLsafxVkDTYs2japBR5UpmeJ7VYWrNFbSf1kboX"]},"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol":{"keccak256":"0x1e0f21db21117ca705182e671aca5f24d157ca9003268450582d3f49eb2b8ece","license":"Apache-2.0","urls":["bzz-raw://4348c9408175707af61dd9d5d0eda909066c14eb35e1fc88604b9d58eed0d667","dweb:/ipfs/QmUk514VMTYx1skNfooNs5q53x7SoxonHuEYpsDSwvoyEG"]},"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol":{"keccak256":"0xd6940108c888555331b972b7ea5d4842ddeb7c222feab4565c166c12f85900ba","license":"Apache-2.0","urls":["bzz-raw://ecbc54202867c7b11e57ca2cbcbe33aa5701ea1593a70bfa82a0ccc358682767","dweb:/ipfs/QmScG3JBtGEoDgxipmP8EbAgZxZF9F8aWaZ9gYBqqBweNH"]},"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0x1473085ffec67f1e059e56baa36be6d3379f7b876147cd62b9854cea8f52cce9","license":"Apache-2.0","urls":["bzz-raw://6b3bd85f29ed8e16ad5622e40966c92b58baf988880da4a676142957462ded06","dweb:/ipfs/QmSkGb7ByX4DTvNPh6egoSAs71b7w1NHoYfPUPT9LdtJY9"]},"contracts/test/mocks/MockERC721A.sol":{"keccak256":"0x187cb0c2de1fe600b579a26a4abc6bd43dfa4bfd1e60e2294ebdd6583c2c57ce","license":"Apache-2.0","urls":["bzz-raw://0558aa9bc5372b89a348a6946a6df919d6eeacfe518831314a0cca2a0ab9d85c","dweb:/ipfs/QmWZYXqMcES3otNBZdsB6kDJwucNSsQBFgJKDoDNJGqaxh"]},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1","license":"MIT","urls":["bzz-raw://ec772b45a624be516f1c81970caa8a2e144301e9d0921cbc1a2789fef39a1269","dweb:/ipfs/QmNyjwxCrGhQMyzLD93oUobJXVe9ceJvRvfXwbEtuxPiEj"]},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1","license":"MIT","urls":["bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f","dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy"]}},"version":1}', + metadata: { + compiler: { + version: '0.8.20+commit.a1b79de6', + }, + language: 'Solidity', + output: { + abi: [ + { + inputs: [], + type: 'error', + name: 'ApprovalCallerNotOwnerNorApproved', + }, + { + inputs: [], + type: 'error', + name: 'ApprovalQueryForNonexistentToken', + }, + { + inputs: [], + type: 'error', + name: 'BalanceQueryForZeroAddress', + }, + { + inputs: [], + type: 'error', + name: 'Initializable_InInitializingState', + }, + { + inputs: [], + type: 'error', + name: 'Initializable_NotInInitializingState', + }, + { + inputs: [], + type: 'error', + name: 'Introspection_AlreadySupported', + }, + { + inputs: [], + type: 'error', + name: 'Introspection_NotSupported', + }, + { + inputs: [], + type: 'error', + name: 'MintERC2309QuantityExceedsLimit', + }, + { + inputs: [], + type: 'error', + name: 'MintToZeroAddress', + }, + { + inputs: [], + type: 'error', + name: 'MintZeroQuantity', + }, + { + inputs: [], + type: 'error', + name: 'OwnerQueryForNonexistentToken', + }, + { + inputs: [], + type: 'error', + name: 'OwnershipNotInitializedForExtraData', + }, + { + inputs: [], + type: 'error', + name: 'TransferCallerNotOwnerNorApproved', + }, + { + inputs: [], + type: 'error', + name: 'TransferFromIncorrectOwner', + }, + { + inputs: [], + type: 'error', + name: 'TransferToNonERC721ReceiverImplementer', + }, + { + inputs: [], + type: 'error', + name: 'TransferToZeroAddress', + }, + { + inputs: [], + type: 'error', + name: 'URIQueryForNonexistentToken', + }, + { + inputs: [ + { + internalType: 'address', + name: 'owner', + type: 'address', + indexed: true, + }, + { + internalType: 'address', + name: 'approved', + type: 'address', + indexed: true, + }, + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + indexed: true, + }, + ], + type: 'event', + name: 'Approval', + anonymous: false, + }, + { + inputs: [ + { + internalType: 'address', + name: 'owner', + type: 'address', + indexed: true, + }, + { + internalType: 'address', + name: 'operator', + type: 'address', + indexed: true, + }, + { + internalType: 'bool', + name: 'approved', + type: 'bool', + indexed: false, + }, + ], + type: 'event', + name: 'ApprovalForAll', + anonymous: false, + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'fromTokenId', + type: 'uint256', + indexed: true, + }, + { + internalType: 'uint256', + name: 'toTokenId', + type: 'uint256', + indexed: false, + }, + { + internalType: 'address', + name: 'from', + type: 'address', + indexed: true, + }, + { + internalType: 'address', + name: 'to', + type: 'address', + indexed: true, + }, + ], + type: 'event', + name: 'ConsecutiveTransfer', + anonymous: false, + }, + { + inputs: [ + { + internalType: 'uint32', + name: 'version', + type: 'uint32', + indexed: false, + }, + ], + type: 'event', + name: 'Initialized', + anonymous: false, + }, + { + inputs: [ + { + internalType: 'bytes4', + name: 'interfaceId', + type: 'bytes4', + indexed: true, + }, + ], + type: 'event', + name: 'InterfaceAdded', + anonymous: false, + }, + { + inputs: [ + { + internalType: 'bytes4', + name: 'interfaceId', + type: 'bytes4', + indexed: true, + }, + ], + type: 'event', + name: 'InterfaceRemoved', + anonymous: false, + }, + { + inputs: [ + { + internalType: 'address', + name: 'from', + type: 'address', + indexed: true, + }, + { + internalType: 'address', + name: 'to', + type: 'address', + indexed: true, + }, + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + indexed: true, + }, + ], + type: 'event', + name: 'Transfer', + anonymous: false, + }, + { + inputs: [ + { + internalType: 'string', + name: 'name_', + type: 'string', + }, + { + internalType: 'string', + name: 'symbol_', + type: 'string', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + name: '__ERC721A_init', + }, + { + inputs: [ + { + internalType: 'address', + name: 'to', + type: 'address', + }, + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + stateMutability: 'payable', + type: 'function', + name: 'approve', + }, + { + inputs: [ + { + internalType: 'address', + name: 'owner', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + name: 'balanceOf', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'token', + type: 'uint256', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + name: 'burn', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + name: 'getApproved', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + }, + { + inputs: [ + { + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + internalType: 'address', + name: 'operator', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + name: 'isApprovedForAll', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + }, + { + inputs: [ + { + internalType: 'address', + name: 'to', + type: 'address', + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + name: 'mint', + }, + { + inputs: [ + { + internalType: 'address', + name: 'to', + type: 'address', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + name: 'mintTo', + outputs: [ + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + }, + { + inputs: [], + stateMutability: 'view', + type: 'function', + name: 'name', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + name: 'ownerOf', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + }, + { + inputs: [ + { + internalType: 'address', + name: 'from', + type: 'address', + }, + { + internalType: 'address', + name: 'to', + type: 'address', + }, + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + stateMutability: 'payable', + type: 'function', + name: 'safeTransferFrom', + }, + { + inputs: [ + { + internalType: 'address', + name: 'from', + type: 'address', + }, + { + internalType: 'address', + name: 'to', + type: 'address', + }, + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + { + internalType: 'bytes', + name: '_data', + type: 'bytes', + }, + ], + stateMutability: 'payable', + type: 'function', + name: 'safeTransferFrom', + }, + { + inputs: [ + { + internalType: 'address', + name: 'operator', + type: 'address', + }, + { + internalType: 'bool', + name: 'approved', + type: 'bool', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + name: 'setApprovalForAll', + }, + { + inputs: [], + stateMutability: 'view', + type: 'function', + name: 'symbol', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + name: 'tokenURI', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + }, + { + inputs: [], + stateMutability: 'view', + type: 'function', + name: 'totalSupply', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + }, + { + inputs: [ + { + internalType: 'address', + name: 'from', + type: 'address', + }, + { + internalType: 'address', + name: 'to', + type: 'address', + }, + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + stateMutability: 'payable', + type: 'function', + name: 'transferFrom', + }, + ], + devdoc: { + kind: 'dev', + methods: { + 'approve(address,uint256)': { + details: + 'Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator.', + }, + 'balanceOf(address)': { + details: "Returns the number of tokens in `owner`'s account.", + }, + 'getApproved(uint256)': { + details: + 'Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist.', + }, + 'isApprovedForAll(address,address)': { + details: + 'Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}.', + }, + 'name()': { + details: 'Returns the token collection name.', + }, + 'ownerOf(uint256)': { + details: + 'Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist.', + }, + 'safeTransferFrom(address,address,uint256)': { + details: "Equivalent to `safeTransferFrom(from, to, tokenId, '')`.", + }, + 'safeTransferFrom(address,address,uint256,bytes)': { + details: + 'Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event.', + }, + 'setApprovalForAll(address,bool)': { + details: + 'Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event.', + }, + 'symbol()': { + details: 'Returns the token collection symbol.', + }, + 'tokenURI(uint256)': { + details: + 'Returns the Uniform Resource Identifier (URI) for `tokenId` token.', + }, + 'totalSupply()': { + details: + 'Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}.', + }, + 'transferFrom(address,address,uint256)': { + details: + 'Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event.', + }, + }, + version: 1, + }, + userdoc: { + kind: 'user', + methods: {}, + version: 1, + }, + }, + settings: { + remappings: [ + ':@openzeppelin/=lib/openzeppelin-contracts/', + ':@prb/math/=lib/prb-math/src/', + ':@prb/test/=lib/prb-test/src/', + ':ERC721A/=lib/ERC721A/contracts/', + ':base64-sol/=lib/base64/', + ':base64/=lib/base64/', + ':council/=lib/council/contracts/', + ':ds-test/=lib/ds-test/src/', + ':erc4626-tests/=lib/operator-filter-registry/lib/openzeppelin-contracts/lib/erc4626-tests/', + ':forge-std/=lib/forge-std/src/', + ':@openzeppelin/contracts-upgradeable/=lib/@openzeppelin/contracts-upgradeable/contracts/', + ':openzeppelin-contracts/=lib/openzeppelin-contracts/', + ':operator-filter-registry/=lib/operator-filter-registry/', + ':prb-math/=lib/prb-math/src/', + ':prb-test/=lib/prb-test/src/', + ], + optimizer: { + enabled: true, + runs: 200, + }, + metadata: { + bytecodeHash: 'none', + appendCBOR: false, + }, + compilationTarget: { + 'contracts/test/mocks/MockERC721A.sol': 'MockERC721A', + }, + libraries: {}, + }, + sources: { + 'contracts/src/diamond/facets/Facet.sol': { + keccak256: '0x8213b85d1271bc3c2aa9842979c8ad825066c4c9addc55296d53b6747e5198ba', + urls: [ + 'bzz-raw://b4e88e869c99e65f0caeb9d03938e78c578a869783b9f20c05f4ba52e7ca493d', + 'dweb:/ipfs/QmRqPmg8BYD1V6Cd8kfihCQ7nn2DAsgRjGW2MJvc7Evnjt', + ], + license: 'Apache-2.0', + }, + 'contracts/src/diamond/facets/initializable/Initializable.sol': { + keccak256: '0x2a4f3a99b3b3ac6c2c18431cea80b40774c1d8265ddefac21b26da561e069096', + urls: [ + 'bzz-raw://36dbba730942b1fd345f242051ea7f33e979f70392fbd929d8522c0c9c6dd367', + 'dweb:/ipfs/QmYMvYnvg9zQJpDQX9yMHZ1AET9Vx7UXtDenXAs1JhfPpd', + ], + license: 'MIT', + }, + 'contracts/src/diamond/facets/initializable/InitializableStorage.sol': { + keccak256: '0x99dfe047dbb8df48a7490f63939420dd990fb5fd3b3a03c42d0cb9c6f4f9eefa', + urls: [ + 'bzz-raw://5e8f6d4bff257324e4544cacadd9fee42bada459f457fb707fef90bcfe0e895a', + 'dweb:/ipfs/QmYWEam5VcMt5ViNMKRkaxoD84MK2MewS5iWwSES589Vma', + ], + license: 'Apache-2.0', + }, + 'contracts/src/diamond/facets/introspection/IERC165.sol': { + keccak256: '0xa1dfa0449031fced106dd105c184823595398c876be53b4bb8d855937a435816', + urls: [ + 'bzz-raw://e98a9007bca24776e4580c9326cfbb72ffe56334229626c336545be8c2c6e6d2', + 'dweb:/ipfs/QmdqoQTUoDKqirUR3hscy4zBh4Kn2E1fRta1y9DfA43urV', + ], + license: 'Apache-2.0', + }, + 'contracts/src/diamond/facets/introspection/IntrospectionBase.sol': { + keccak256: '0xbdc803a2179838316625692285c4b720cdbae1c78e5f9a68560719c909253d00', + urls: [ + 'bzz-raw://776a4490b22b01b554770d71afde7bed4c32ea639a08c84a194076eddf5517be', + 'dweb:/ipfs/QmcPVR9T7vXccCg7RXQ4wXtHaBG6ugrEXk8qnhRpsYMVd6', + ], + license: 'Apache-2.0', + }, + 'contracts/src/diamond/facets/introspection/IntrospectionStorage.sol': { + keccak256: '0xd2ec3bbe4d15f9232006b41e0a80a5127006243ee596754af77bd3926045782a', + urls: [ + 'bzz-raw://8c47e18bfd34a687ce9ec75dc1f1fa5bca088e97e59aad2ac3fdb0989d06d7e6', + 'dweb:/ipfs/QmdktQXV7PKABzh43SZqemdTG25RxMaMsgpXTTUvZUxmfU', + ], + license: 'Apache-2.0', + }, + 'contracts/src/diamond/facets/token/ERC721A/ERC721A.sol': { + keccak256: '0x321ea4cd6a2617d12cdf6bcd84095072de32ecfddfa95df83e58711c4684e325', + urls: [ + 'bzz-raw://95b09721ac18cc7d34859486008989238dfc9ff9bbafb300ce7a3b2ecfb201a1', + 'dweb:/ipfs/Qmcdzd3hLsafxVkDTYs2japBR5UpmeJ7VYWrNFbSf1kboX', + ], + license: 'Apache-2.0', + }, + 'contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol': { + keccak256: '0x1e0f21db21117ca705182e671aca5f24d157ca9003268450582d3f49eb2b8ece', + urls: [ + 'bzz-raw://4348c9408175707af61dd9d5d0eda909066c14eb35e1fc88604b9d58eed0d667', + 'dweb:/ipfs/QmUk514VMTYx1skNfooNs5q53x7SoxonHuEYpsDSwvoyEG', + ], + license: 'Apache-2.0', + }, + 'contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol': { + keccak256: '0xd6940108c888555331b972b7ea5d4842ddeb7c222feab4565c166c12f85900ba', + urls: [ + 'bzz-raw://ecbc54202867c7b11e57ca2cbcbe33aa5701ea1593a70bfa82a0ccc358682767', + 'dweb:/ipfs/QmScG3JBtGEoDgxipmP8EbAgZxZF9F8aWaZ9gYBqqBweNH', + ], + license: 'Apache-2.0', + }, + 'contracts/src/diamond/facets/token/ERC721A/IERC721A.sol': { + keccak256: '0x1473085ffec67f1e059e56baa36be6d3379f7b876147cd62b9854cea8f52cce9', + urls: [ + 'bzz-raw://6b3bd85f29ed8e16ad5622e40966c92b58baf988880da4a676142957462ded06', + 'dweb:/ipfs/QmSkGb7ByX4DTvNPh6egoSAs71b7w1NHoYfPUPT9LdtJY9', + ], + license: 'Apache-2.0', + }, + 'contracts/test/mocks/MockERC721A.sol': { + keccak256: '0x187cb0c2de1fe600b579a26a4abc6bd43dfa4bfd1e60e2294ebdd6583c2c57ce', + urls: [ + 'bzz-raw://0558aa9bc5372b89a348a6946a6df919d6eeacfe518831314a0cca2a0ab9d85c', + 'dweb:/ipfs/QmWZYXqMcES3otNBZdsB6kDJwucNSsQBFgJKDoDNJGqaxh', + ], + license: 'Apache-2.0', + }, + 'lib/@openzeppelin/contracts/utils/Address.sol': { + keccak256: '0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1', + urls: [ + 'bzz-raw://ec772b45a624be516f1c81970caa8a2e144301e9d0921cbc1a2789fef39a1269', + 'dweb:/ipfs/QmNyjwxCrGhQMyzLD93oUobJXVe9ceJvRvfXwbEtuxPiEj', + ], + license: 'MIT', + }, + 'lib/@openzeppelin/contracts/utils/introspection/IERC165.sol': { + keccak256: '0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1', + urls: [ + 'bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f', + 'dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy', + ], + license: 'MIT', + }, + }, + version: 1, + }, + ast: { + absolutePath: 'contracts/test/mocks/MockERC721A.sol', + id: 44954, + exportedSymbols: { + ERC721A: [13245], + MockERC721A: [44953], + }, + nodeType: 'SourceUnit', + src: '39:452:261', + nodes: [ + { + id: 44907, + nodeType: 'PragmaDirective', + src: '39:24:261', + nodes: [], + literals: ['solidity', '^', '0.8', '.20'], + }, + { + id: 44909, + nodeType: 'ImportDirective', + src: '107:79:261', + nodes: [], + absolutePath: 'contracts/src/diamond/facets/token/ERC721A/ERC721A.sol', + file: 'contracts/src/diamond/facets/token/ERC721A/ERC721A.sol', + nameLocation: '-1:-1:-1', + scope: 44954, + sourceUnit: 13246, + symbolAliases: [ + { + foreign: { + id: 44908, + name: 'ERC721A', + nodeType: 'Identifier', + overloadedDeclarations: [], + referencedDeclaration: 13245, + src: '115:7:261', + typeDescriptions: {}, + }, + nameLocation: '-1:-1:-1', + }, + ], + unitAlias: '', + }, + { + id: 44953, + nodeType: 'ContractDefinition', + src: '188:302:261', + nodes: [ + { + id: 44929, + nodeType: 'FunctionDefinition', + src: '224:116:261', + nodes: [], + body: { + id: 44928, + nodeType: 'Block', + src: '287:53:261', + nodes: [], + statements: [ + { + expression: { + id: 44921, + isConstant: false, + isLValue: false, + isPure: false, + lValueRequested: false, + leftHandSide: { + id: 44918, + name: 'tokenId', + nodeType: 'Identifier', + overloadedDeclarations: [], + referencedDeclaration: 44916, + src: '293:7:261', + typeDescriptions: { + typeIdentifier: 't_uint256', + typeString: 'uint256', + }, + }, + nodeType: 'Assignment', + operator: '=', + rightHandSide: { + arguments: [], + expression: { + argumentTypes: [], + id: 44919, + name: '_nextTokenId', + nodeType: 'Identifier', + overloadedDeclarations: [], + referencedDeclaration: 13424, + src: '303:12:261', + typeDescriptions: { + typeIdentifier: + 't_function_internal_view$__$returns$_t_uint256_$', + typeString: + 'function () view returns (uint256)', + }, + }, + id: 44920, + isConstant: false, + isLValue: false, + isPure: false, + kind: 'functionCall', + lValueRequested: false, + nameLocations: [], + names: [], + nodeType: 'FunctionCall', + src: '303:14:261', + tryCall: false, + typeDescriptions: { + typeIdentifier: 't_uint256', + typeString: 'uint256', + }, + }, + src: '293:24:261', + typeDescriptions: { + typeIdentifier: 't_uint256', + typeString: 'uint256', + }, + }, + id: 44922, + nodeType: 'ExpressionStatement', + src: '293:24:261', + }, + { + expression: { + arguments: [ + { + id: 44924, + name: 'to', + nodeType: 'Identifier', + overloadedDeclarations: [], + referencedDeclaration: 44913, + src: '329:2:261', + typeDescriptions: { + typeIdentifier: 't_address', + typeString: 'address', + }, + }, + { + hexValue: '31', + id: 44925, + isConstant: false, + isLValue: false, + isPure: true, + kind: 'number', + lValueRequested: false, + nodeType: 'Literal', + src: '333:1:261', + typeDescriptions: { + typeIdentifier: 't_rational_1_by_1', + typeString: 'int_const 1', + }, + value: '1', + }, + ], + expression: { + argumentTypes: [ + { + typeIdentifier: 't_address', + typeString: 'address', + }, + { + typeIdentifier: 't_rational_1_by_1', + typeString: 'int_const 1', + }, + ], + id: 44923, + name: '_mint', + nodeType: 'Identifier', + overloadedDeclarations: [], + referencedDeclaration: 14039, + src: '323:5:261', + typeDescriptions: { + typeIdentifier: + 't_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$', + typeString: 'function (address,uint256)', + }, + }, + id: 44926, + isConstant: false, + isLValue: false, + isPure: false, + kind: 'functionCall', + lValueRequested: false, + nameLocations: [], + names: [], + nodeType: 'FunctionCall', + src: '323:12:261', + tryCall: false, + typeDescriptions: { + typeIdentifier: 't_tuple$__$', + typeString: 'tuple()', + }, + }, + id: 44927, + nodeType: 'ExpressionStatement', + src: '323:12:261', + }, + ], + }, + functionSelector: '755edd17', + implemented: true, + kind: 'function', + modifiers: [], + name: 'mintTo', + nameLocation: '233:6:261', + parameters: { + id: 44914, + nodeType: 'ParameterList', + parameters: [ + { + constant: false, + id: 44913, + mutability: 'mutable', + name: 'to', + nameLocation: '248:2:261', + nodeType: 'VariableDeclaration', + scope: 44929, + src: '240:10:261', + stateVariable: false, + storageLocation: 'default', + typeDescriptions: { + typeIdentifier: 't_address', + typeString: 'address', + }, + typeName: { + id: 44912, + name: 'address', + nodeType: 'ElementaryTypeName', + src: '240:7:261', + stateMutability: 'nonpayable', + typeDescriptions: { + typeIdentifier: 't_address', + typeString: 'address', + }, + }, + visibility: 'internal', + }, + ], + src: '239:12:261', + }, + returnParameters: { + id: 44917, + nodeType: 'ParameterList', + parameters: [ + { + constant: false, + id: 44916, + mutability: 'mutable', + name: 'tokenId', + nameLocation: '278:7:261', + nodeType: 'VariableDeclaration', + scope: 44929, + src: '270:15:261', + stateVariable: false, + storageLocation: 'default', + typeDescriptions: { + typeIdentifier: 't_uint256', + typeString: 'uint256', + }, + typeName: { + id: 44915, + name: 'uint256', + nodeType: 'ElementaryTypeName', + src: '270:7:261', + typeDescriptions: { + typeIdentifier: 't_uint256', + typeString: 'uint256', + }, + }, + visibility: 'internal', + }, + ], + src: '269:17:261', + }, + scope: 44953, + stateMutability: 'nonpayable', + virtual: false, + visibility: 'external', + }, + { + id: 44942, + nodeType: 'FunctionDefinition', + src: '344:79:261', + nodes: [], + body: { + id: 44941, + nodeType: 'Block', + src: '395:28:261', + nodes: [], + statements: [ + { + expression: { + arguments: [ + { + id: 44937, + name: 'to', + nodeType: 'Identifier', + overloadedDeclarations: [], + referencedDeclaration: 44931, + src: '407:2:261', + typeDescriptions: { + typeIdentifier: 't_address', + typeString: 'address', + }, + }, + { + id: 44938, + name: 'amount', + nodeType: 'Identifier', + overloadedDeclarations: [], + referencedDeclaration: 44933, + src: '411:6:261', + typeDescriptions: { + typeIdentifier: 't_uint256', + typeString: 'uint256', + }, + }, + ], + expression: { + argumentTypes: [ + { + typeIdentifier: 't_address', + typeString: 'address', + }, + { + typeIdentifier: 't_uint256', + typeString: 'uint256', + }, + ], + id: 44936, + name: '_mint', + nodeType: 'Identifier', + overloadedDeclarations: [], + referencedDeclaration: 14039, + src: '401:5:261', + typeDescriptions: { + typeIdentifier: + 't_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$', + typeString: 'function (address,uint256)', + }, + }, + id: 44939, + isConstant: false, + isLValue: false, + isPure: false, + kind: 'functionCall', + lValueRequested: false, + nameLocations: [], + names: [], + nodeType: 'FunctionCall', + src: '401:17:261', + tryCall: false, + typeDescriptions: { + typeIdentifier: 't_tuple$__$', + typeString: 'tuple()', + }, + }, + id: 44940, + nodeType: 'ExpressionStatement', + src: '401:17:261', + }, + ], + }, + functionSelector: '40c10f19', + implemented: true, + kind: 'function', + modifiers: [], + name: 'mint', + nameLocation: '353:4:261', + parameters: { + id: 44934, + nodeType: 'ParameterList', + parameters: [ + { + constant: false, + id: 44931, + mutability: 'mutable', + name: 'to', + nameLocation: '366:2:261', + nodeType: 'VariableDeclaration', + scope: 44942, + src: '358:10:261', + stateVariable: false, + storageLocation: 'default', + typeDescriptions: { + typeIdentifier: 't_address', + typeString: 'address', + }, + typeName: { + id: 44930, + name: 'address', + nodeType: 'ElementaryTypeName', + src: '358:7:261', + stateMutability: 'nonpayable', + typeDescriptions: { + typeIdentifier: 't_address', + typeString: 'address', + }, + }, + visibility: 'internal', + }, + { + constant: false, + id: 44933, + mutability: 'mutable', + name: 'amount', + nameLocation: '378:6:261', + nodeType: 'VariableDeclaration', + scope: 44942, + src: '370:14:261', + stateVariable: false, + storageLocation: 'default', + typeDescriptions: { + typeIdentifier: 't_uint256', + typeString: 'uint256', + }, + typeName: { + id: 44932, + name: 'uint256', + nodeType: 'ElementaryTypeName', + src: '370:7:261', + typeDescriptions: { + typeIdentifier: 't_uint256', + typeString: 'uint256', + }, + }, + visibility: 'internal', + }, + ], + src: '357:28:261', + }, + returnParameters: { + id: 44935, + nodeType: 'ParameterList', + parameters: [], + src: '395:0:261', + }, + scope: 44953, + stateMutability: 'nonpayable', + virtual: false, + visibility: 'external', + }, + { + id: 44952, + nodeType: 'FunctionDefinition', + src: '427:61:261', + nodes: [], + body: { + id: 44951, + nodeType: 'Block', + src: '465:23:261', + nodes: [], + statements: [ + { + expression: { + arguments: [ + { + id: 44948, + name: 'token', + nodeType: 'Identifier', + overloadedDeclarations: [], + referencedDeclaration: 44944, + src: '477:5:261', + typeDescriptions: { + typeIdentifier: 't_uint256', + typeString: 'uint256', + }, + }, + ], + expression: { + argumentTypes: [ + { + typeIdentifier: 't_uint256', + typeString: 'uint256', + }, + ], + id: 44947, + name: '_burn', + nodeType: 'Identifier', + overloadedDeclarations: [14390, 14564], + referencedDeclaration: 14390, + src: '471:5:261', + typeDescriptions: { + typeIdentifier: + 't_function_internal_nonpayable$_t_uint256_$returns$__$', + typeString: 'function (uint256)', + }, + }, + id: 44949, + isConstant: false, + isLValue: false, + isPure: false, + kind: 'functionCall', + lValueRequested: false, + nameLocations: [], + names: [], + nodeType: 'FunctionCall', + src: '471:12:261', + tryCall: false, + typeDescriptions: { + typeIdentifier: 't_tuple$__$', + typeString: 'tuple()', + }, + }, + id: 44950, + nodeType: 'ExpressionStatement', + src: '471:12:261', + }, + ], + }, + functionSelector: '42966c68', + implemented: true, + kind: 'function', + modifiers: [], + name: 'burn', + nameLocation: '436:4:261', + parameters: { + id: 44945, + nodeType: 'ParameterList', + parameters: [ + { + constant: false, + id: 44944, + mutability: 'mutable', + name: 'token', + nameLocation: '449:5:261', + nodeType: 'VariableDeclaration', + scope: 44952, + src: '441:13:261', + stateVariable: false, + storageLocation: 'default', + typeDescriptions: { + typeIdentifier: 't_uint256', + typeString: 'uint256', + }, + typeName: { + id: 44943, + name: 'uint256', + nodeType: 'ElementaryTypeName', + src: '441:7:261', + typeDescriptions: { + typeIdentifier: 't_uint256', + typeString: 'uint256', + }, + }, + visibility: 'internal', + }, + ], + src: '440:15:261', + }, + returnParameters: { + id: 44946, + nodeType: 'ParameterList', + parameters: [], + src: '465:0:261', + }, + scope: 44953, + stateMutability: 'nonpayable', + virtual: false, + visibility: 'external', + }, + ], + abstract: false, + baseContracts: [ + { + baseName: { + id: 44910, + name: 'ERC721A', + nameLocations: ['212:7:261'], + nodeType: 'IdentifierPath', + referencedDeclaration: 13245, + src: '212:7:261', + }, + id: 44911, + nodeType: 'InheritanceSpecifier', + src: '212:7:261', + }, + ], + canonicalName: 'MockERC721A', + contractDependencies: [], + contractKind: 'contract', + fullyImplemented: true, + linearizedBaseContracts: [ + 44953, 13245, 7509, 10861, 10751, 10709, 14682, 14951, 14839, + ], + name: 'MockERC721A', + nameLocation: '197:11:261', + scope: 44954, + usedErrors: [ + 10489, 10491, 10738, 10740, 14764, 14767, 14770, 14773, 14776, 14779, 14782, + 14785, 14788, 14791, 14794, 14797, 14800, + ], + usedEvents: [10495, 10745, 10750, 14809, 14818, 14827, 14838], + }, + ], + license: 'Apache-2.0', + }, + id: 261, +} as const + +export default MockERC721A diff --git a/core/web3/src/RiverRegistryFactory.ts b/core/web3/src/RiverRegistryFactory.ts new file mode 100644 index 000000000..ffb4901bd --- /dev/null +++ b/core/web3/src/RiverRegistryFactory.ts @@ -0,0 +1,10 @@ +import { RiverRegistry } from './v3/RiverRegistry' +import { ethers } from 'ethers' +import { RiverChainConfig } from './IStaticContractsInfo' + +export function createRiverRegistry( + provider: ethers.providers.Provider, + config: RiverChainConfig, +): RiverRegistry { + return new RiverRegistry(config, provider) +} diff --git a/core/web3/src/SpaceDappFactory.ts b/core/web3/src/SpaceDappFactory.ts new file mode 100644 index 000000000..3c8265f77 --- /dev/null +++ b/core/web3/src/SpaceDappFactory.ts @@ -0,0 +1,25 @@ +import { SpaceDapp } from './v3' +import { ISpaceDapp } from './ISpaceDapp' +import { ethers } from 'ethers' +import { BaseChainConfig } from './IStaticContractsInfo' + +import { dlogger } from '@river-build/dlog' + +const log = dlogger('csb:SpaceDappFactory') +export function createSpaceDapp( + provider: ethers.providers.Provider, + config: BaseChainConfig, +): ISpaceDapp { + if (provider === undefined) { + throw new Error('createSpaceDapp() Provider is undefined') + } + // For RPC providers that pool for events, we need to set the polling interval to a lower value + // so that we don't miss events that may be emitted in between polling intervals. The Ethers + // default is 4000ms, which is based on the assumption of 12s mainnet blocktimes. + if ('pollingInterval' in provider && typeof provider.pollingInterval === 'number') { + const oldValue = provider.pollingInterval + provider.pollingInterval = 250 + log.info('pollingInterval was: ', oldValue, 'now: ', provider.pollingInterval) + } + return new SpaceDapp(config, provider) +} diff --git a/core/web3/src/TestGatingNFT.ts b/core/web3/src/TestGatingNFT.ts new file mode 100644 index 000000000..6af447e4d --- /dev/null +++ b/core/web3/src/TestGatingNFT.ts @@ -0,0 +1,192 @@ +import { createTestClient, http, publicActions, walletActions } from 'viem' +import { foundry } from 'viem/chains' + +import MockERC721a from './MockERC721A' + +import { keccak256 } from 'viem/utils' +import { dlogger } from '@river-build/dlog' + +const logger = dlogger('csb:TestGatingNFT') + +export function toEIP55Address(address: `0x${string}`): `0x${string}` { + const addressHash = keccak256(address.substring(2).toLowerCase() as `0x${string}`) + let checksumAddress = '0x' + + for (let i = 2; i < address.length; i++) { + if (parseInt(addressHash[i], 16) >= 8) { + checksumAddress += address[i].toUpperCase() + } else { + checksumAddress += address[i].toLowerCase() + } + } + + return checksumAddress as `0x${string}` +} + +export function isEIP55Address(address: `0x${string}`): boolean { + return address === toEIP55Address(address) +} +/* + */ +export function isHexString(value: unknown): value is `0x${string}` { + // Check if the value is undefined first + if (value === undefined) { + return false + } + return typeof value === 'string' && /^0x[0-9a-fA-F]+$/.test(value) +} +export class TestGatingNFT { + public async publicMint(toAddress: string) { + if (!isHexString(toAddress)) { + throw new Error('Invalid address') + } + + return await publicMint('TestGatingNFT', toAddress) + } +} + +class Mutex { + queue: ((value: void | PromiseLike) => void)[] + locked: boolean + constructor() { + this.queue = [] + this.locked = false + } + + lock() { + if (!this.locked) { + this.locked = true + return Promise.resolve() + } + + let unlockNext: (value: void | PromiseLike) => void + + const promise = new Promise((resolve) => { + unlockNext = resolve + }) + + this.queue.push(unlockNext!) + + return promise + } + + unlock() { + if (this.queue.length > 0) { + const unlockNext = this.queue.shift() + unlockNext?.() + } else { + this.locked = false + } + } +} + +const nftContracts = new Map() +const nftContractsMutex = new Mutex() + +export async function getContractAddress(nftName: string): Promise<`0x${string}`> { + let retryCount = 0 + let lastError: unknown + try { + // If mulitple callers are in a Promise.all() and they all try to deploy the same contract at the same time, + // we want to make sure that only one of them actually deploys the contract. + await nftContractsMutex.lock() + + if (!nftContracts.has(nftName)) { + while (retryCount++ < 5) { + try { + const client = createTestClient({ + chain: foundry, + mode: 'anvil', + transport: http(), + }) + .extend(publicActions) + .extend(walletActions) + + const account = (await client.getAddresses())[0] + + const hash = await client.deployContract({ + abi: MockERC721a.abi, + account, + bytecode: MockERC721a.bytecode.object, + }) + + const receipt = await client.waitForTransactionReceipt({ hash }) + + if (receipt.contractAddress) { + logger.info( + 'deployed', + nftName, + receipt.contractAddress, + isEIP55Address(receipt.contractAddress), + nftContracts, + ) + // For some reason the address isn't in EIP-55, so we need to checksum it + nftContracts.set(nftName, toEIP55Address(receipt.contractAddress)) + } else { + throw new Error('Failed to deploy contract') + } + break + } catch (e) { + lastError = e + if ( + typeof e === 'object' && + e !== null && + 'message' in e && + typeof e.message === 'string' && + (e.message.includes('nonce too low') || + e.message.includes('NonceTooLowError') || + e.message.includes( + 'Nonce provided for the transaction is lower than the current nonce', + )) + ) { + logger.log('retrying because nonce too low', e, retryCount) + } else { + throw e + } + } + } + } + } finally { + nftContractsMutex.unlock() + } + + const contractAddress = nftContracts.get(nftName) + if (!contractAddress) { + throw new Error( + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + `Failed to get contract address: ${nftName} retryCount: ${retryCount} lastError: ${lastError} `, + ) + } + + return contractAddress +} + +export async function getTestGatingNFTContractAddress(): Promise<`0x${string}`> { + return await getContractAddress('TestGatingNFT') +} + +export async function publicMint(nftName: string, toAddress: `0x${string}`) { + const client = createTestClient({ + chain: foundry, + mode: 'anvil', + transport: http(), + }) + .extend(publicActions) + .extend(walletActions) + + const contractAddress = await getContractAddress(nftName) + + logger.log('minting', contractAddress, toAddress) + + const account = (await client.getAddresses())[0] + + const nftReceipt = await client.writeContract({ + address: contractAddress, + abi: MockERC721a.abi, + functionName: 'mint', + args: [toAddress, 1n], + account, + }) + + await client.waitForTransactionReceipt({ hash: nftReceipt }) +} diff --git a/core/web3/src/Utils.ts b/core/web3/src/Utils.ts new file mode 100644 index 000000000..75e6a64f2 --- /dev/null +++ b/core/web3/src/Utils.ts @@ -0,0 +1,81 @@ +import { ethers } from 'ethers' +import { PublicClient } from 'viem' +import { PricingModuleStruct } from './ContractTypes' +import { ISpaceDapp } from './ISpaceDapp' + +export const ETH_ADDRESS = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE' +export const EVERYONE_ADDRESS = '0x0000000000000000000000000000000000000001' +export const MOCK_ADDRESS = '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef' + +export function isEthersProvider( + provider: ethers.providers.Provider | PublicClient, +): provider is ethers.providers.Provider { + return ( + typeof provider === 'object' && + provider !== null && + 'getNetwork' in provider && + typeof provider.getNetwork === 'function' + ) +} + +export function isPublicClient( + provider: ethers.providers.Provider | PublicClient, +): provider is PublicClient { + return ( + typeof provider === 'object' && + provider !== null && + 'getNetwork' in provider && + typeof provider.getNetwork !== 'function' + ) +} + +// River space stream ids are 64 characters long, and start with '10' +// incidentally this should also work if you just pass the space contract address with 0x prefix +export function SpaceAddressFromSpaceId(spaceId: string): string { + return ethers.utils.getAddress(spaceId.slice(2, 42)) +} + +/** + * Use this function in the default case of a exhaustive switch statement to ensure that all cases are handled. + * Always throws JSON RPC error. + * @param value Switch value + * @param message Error message + * @param code JSON RPC error code + * @param data Optional data to include in the error + */ +export function checkNever(value: never, message?: string): never { + throw new Error(message ?? `Unhandled switch value ${value}`) +} + +export const TIERED_PRICING_ORACLE = 'TieredLogPricingOracle' +export const FIXED_PRICING = 'FixedPricing' + +export const getDynamicPricingModule = async (spaceDapp: ISpaceDapp | undefined) => { + if (!spaceDapp) { + throw new Error('getDynamicPricingModule: No spaceDapp') + } + const pricingModules = await spaceDapp.listPricingModules() + const dynamicPricingModule = findDynamicPricingModule(pricingModules) + if (!dynamicPricingModule) { + throw new Error('getDynamicPricingModule: no dynamicPricingModule') + } + return dynamicPricingModule +} + +export const getFixedPricingModule = async (spaceDapp: ISpaceDapp | undefined) => { + if (!spaceDapp) { + throw new Error('getFixedPricingModule: No spaceDapp') + } + const pricingModules = await spaceDapp.listPricingModules() + const fixedPricingModule = findFixedPricingModule(pricingModules) + if (!fixedPricingModule) { + throw new Error('getFixedPricingModule: no fixedPricingModule') + } + return fixedPricingModule +} + +export const findDynamicPricingModule = (pricingModules: PricingModuleStruct[]) => + pricingModules.find((module) => module.name === TIERED_PRICING_ORACLE) + +export const findFixedPricingModule = (pricingModules: PricingModuleStruct[]) => + pricingModules.find((module) => module.name === FIXED_PRICING) diff --git a/core/web3/src/Web3Constants.ts b/core/web3/src/Web3Constants.ts new file mode 100644 index 000000000..9a28f6da8 --- /dev/null +++ b/core/web3/src/Web3Constants.ts @@ -0,0 +1,6 @@ +// Chain IDs +export const LOCALHOST_CHAIN_ID = 31337 +export const LOCALHOST_RIVER_CHAIN_ID = 31338 +export const BASE_MAINNET = 8453 +export const BASE_SEPOLIA = 84532 +export const RIVER_CHAIN_ID = 6524490 diff --git a/core/web3/src/entitlement.ts b/core/web3/src/entitlement.ts new file mode 100644 index 000000000..fe66276d2 --- /dev/null +++ b/core/web3/src/entitlement.ts @@ -0,0 +1,704 @@ +import type { AbiParameter, AbiFunction } from 'abitype' +import { IRuleEntitlement, IRuleEntitlementAbi } from './v3/IRuleEntitlementShim' + +import { + createPublicClient, + http, + decodeAbiParameters, + encodeAbiParameters, + PublicClient, +} from 'viem' + +import { mainnet } from 'viem/chains' +import { ethers } from 'ethers' +import { Address } from './ContractTypes' +import { MOCK_ADDRESS } from './Utils' + +const zeroAddress = ethers.constants.AddressZero + +type ReadContractFunction = typeof publicClient.readContract< + typeof IRuleEntitlementAbi, + 'getRuleData' +> +type ReadContractReturnType = ReturnType +export type RuleData = Awaited + +export enum OperationType { + NONE = 0, + CHECK, + LOGICAL, +} + +export enum CheckOperationType { + NONE = 0, + MOCK, + ERC20, + ERC721, + ERC1155, + ISENTITLED, +} + +// Enum for Operation oneof operation_clause +export enum LogicalOperationType { + NONE = 0, + AND, + OR, +} + +export type ContractOperation = { + opType: OperationType + index: number +} + +export type ContractLogicalOperation = { + logOpType: LogicalOperationType + leftOperationIndex: number + rightOperationIndex: number +} + +export function isContractLogicalOperation(operation: ContractOperation) { + return operation.opType === OperationType.LOGICAL +} + +export type CheckOperation = { + opType: OperationType.CHECK + checkType: CheckOperationType + chainId: bigint + contractAddress: Address + threshold: bigint +} +export type OrOperation = { + opType: OperationType.LOGICAL + logicalType: LogicalOperationType.OR + leftOperation: Operation + rightOperation: Operation +} +export type AndOperation = { + opType: OperationType.LOGICAL + logicalType: LogicalOperationType.AND + leftOperation: Operation + rightOperation: Operation +} + +export type NoOperation = { + opType: OperationType.NONE + index: number +} + +export const NoopOperation: NoOperation = { + opType: OperationType.NONE, + index: 0, +} + +export const NoopRuleData = { + operations: [NoopOperation], + checkOperations: [], + logicalOperations: [], +} + +type EntitledWalletOrZeroAddress = string + +export type LogicalOperation = OrOperation | AndOperation +export type Operation = CheckOperation | OrOperation | AndOperation | NoOperation + +function isCheckOperation(operation: Operation): operation is CheckOperation { + return operation.opType === OperationType.CHECK +} + +function isLogicalOperation(operation: Operation): operation is LogicalOperation { + return operation.opType === OperationType.LOGICAL +} + +function isAndOperation(operation: LogicalOperation): operation is AndOperation { + return operation.logicalType === LogicalOperationType.AND +} + +const publicClient: PublicClient = createPublicClient({ + chain: mainnet, + transport: http(), +}) + +function isOrOperation(operation: LogicalOperation): operation is OrOperation { + return operation.logicalType === LogicalOperationType.OR +} + +export function postOrderArrayToTree(operations: Operation[]): Operation { + const stack: Operation[] = [] + + operations.forEach((op) => { + if (isLogicalOperation(op)) { + if (stack.length < 2) { + throw new Error('Invalid post-order array, missing operations') + } + + // Pop the two most recent operations from the stack + const right = stack.pop() + const left = stack.pop() + + // Ensure the operations exist + if (!left || !right) { + throw new Error('Invalid post-order array, missing operations') + } + + // Update the current logical operation's children + if (isLogicalOperation(op)) { + op.leftOperation = left + op.rightOperation = right + } + } + + // Push the current operation back into the stack + stack.push(op) + }) + + // The last item in the stack is the root of the tree + const root = stack.pop() + if (!root) { + throw new Error('Invalid post-order array') + } + + return root +} + +export const getOperationTree = async (address: Address, roleId: bigint): Promise => { + const entitlementData = await publicClient.readContract({ + address: address, + abi: IRuleEntitlementAbi, + functionName: 'getEntitlementDataByRoleId', + args: [roleId], + }) + + const data = decodeEntitlementData(entitlementData) + + const operations = ruleDataToOperations(data) + + return postOrderArrayToTree(operations) +} + +const encodeRuleDataInputs: readonly AbiParameter[] | undefined = ( + Object.values(IRuleEntitlementAbi).find((abi) => abi.name === 'encodeRuleData') as + | AbiFunction + | undefined +)?.inputs + +export function encodeEntitlementData(ruleData: IRuleEntitlement.RuleDataStruct): Address { + if (!encodeRuleDataInputs) { + throw new Error('setRuleDataInputs not found') + } + return encodeAbiParameters(encodeRuleDataInputs, [ruleData]) +} + +const getRuleDataOutputs: readonly AbiParameter[] | undefined = ( + Object.values(IRuleEntitlementAbi).find((abi) => abi.name === 'getRuleData') as + | AbiFunction + | undefined +)?.outputs + +export function decodeEntitlementData(entitlementData: Address): IRuleEntitlement.RuleDataStruct[] { + if (!getRuleDataOutputs) { + throw new Error('getRuleDataOutputs not found') + } + return decodeAbiParameters( + getRuleDataOutputs, + entitlementData, + ) as IRuleEntitlement.RuleDataStruct[] +} +export function ruleDataToOperations(data: IRuleEntitlement.RuleDataStruct[]): Operation[] { + if (data.length === 0) { + return [] + } + const decodedOperations: Operation[] = [] + + const firstData: RuleData = data[0] as RuleData + + if (firstData.operations === undefined) { + return [] + } + + firstData.operations.forEach((operation) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + if (operation.opType === OperationType.CHECK) { + const checkOperation = firstData.checkOperations[operation.index] + decodedOperations.push({ + opType: OperationType.CHECK, + checkType: checkOperation.opType, + chainId: checkOperation.chainId, + contractAddress: checkOperation.contractAddress, + threshold: checkOperation.threshold, + }) + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + else if (operation.opType === OperationType.LOGICAL) { + const logicalOperation = firstData.logicalOperations[operation.index] + decodedOperations.push({ + opType: OperationType.LOGICAL, + logicalType: logicalOperation.logOpType as + | LogicalOperationType.AND + | LogicalOperationType.OR, + + leftOperation: decodedOperations[logicalOperation.leftOperationIndex], + rightOperation: decodedOperations[logicalOperation.rightOperationIndex], + }) + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + } else if (operation.opType === OperationType.NONE) { + decodedOperations.push(NoopOperation) + } else { + throw new Error(`Unknown logical operation type ${operation.opType}`) + } + }) + return decodedOperations +} + +type DeepWriteable = { -readonly [P in keyof T]: DeepWriteable } + +export function postOrderTraversal(operation: Operation, data: DeepWriteable) { + if (isLogicalOperation(operation)) { + postOrderTraversal(operation.leftOperation, data) + postOrderTraversal(operation.rightOperation, data) + } + + if (isCheckOperation(operation)) { + data.checkOperations.push({ + opType: operation.checkType, + chainId: operation.chainId, + contractAddress: operation.contractAddress, + threshold: operation.threshold, + }) + data.operations.push({ + opType: OperationType.CHECK, + index: data.checkOperations.length - 1, + }) + } else if (isLogicalOperation(operation)) { + data.logicalOperations.push({ + logOpType: operation.logicalType, + leftOperationIndex: data.logicalOperations.length, // Index of left child + rightOperationIndex: data.logicalOperations.length + 1, // Index of right child + }) + data.operations.push({ + opType: OperationType.LOGICAL, + index: data.logicalOperations.length - 1, + }) + } +} + +export function treeToRuleData(root: Operation): IRuleEntitlement.RuleDataStruct { + const data = { + operations: [], + checkOperations: [], + logicalOperations: [], + } + postOrderTraversal(root, data) + + return data +} + +/** + * Evaluates an AndOperation + * If either of the operations are false, the entire operation is false, and the + * other operation is aborted. Once both operations succeed, the entire operation + * succeeds. + * @param operation + * @param controller + * @returns true once both succeed, false if either fail + */ +async function evaluateAndOperation( + controller: AbortController, + linkedWallets: string[], + providers: ethers.providers.StaticJsonRpcProvider[], + operation?: AndOperation, +): Promise { + if (!operation?.leftOperation || !operation?.rightOperation) { + controller.abort() + return zeroAddress + } + const newController = new AbortController() + controller.signal.addEventListener('abort', () => { + newController.abort() + }) + const interuptFlag = {} as const + let tempInterupt: ( + value: typeof interuptFlag | PromiseLike, + ) => void | undefined + const interupted = new Promise((resolve) => { + tempInterupt = resolve + }) + + const interupt = () => { + if (tempInterupt) { + tempInterupt(interuptFlag) + } + } + + async function racer(operationEntry: Operation): Promise { + const result = await Promise.race([ + evaluateTree(newController, linkedWallets, providers, operationEntry), + interupted, + ]) + if (result === interuptFlag) { + return zeroAddress // interupted + } else if (isValidAddress(result)) { + return result + } else { + controller.abort() + interupt() + return zeroAddress + } + } + + const checks = await Promise.all([ + racer(operation.leftOperation), + racer(operation.rightOperation), + ]) + const result = checks.every((res) => isValidAddress(res)) + + if (!result) { + return zeroAddress + } + + return checks[0] +} + +/** + * Evaluates an OrOperation + * If either of the operations are true, the entire operation is true + * and the other operation is aborted. Once both operationd fail, the + * entire operation fails. + * @param operation + * @param signal + * @returns true once one succeeds, false if both fail + */ +async function evaluateOrOperation( + controller: AbortController, + linkedWallets: string[], + providers: ethers.providers.StaticJsonRpcProvider[], + operation?: OrOperation, +): Promise { + if (!operation?.leftOperation || !operation?.rightOperation) { + controller.abort() + return zeroAddress + } + const newController = new AbortController() + controller.signal.addEventListener('abort', () => { + newController.abort() + }) + + const interuptFlag = {} as const + let tempInterupt: ( + value: typeof interuptFlag | PromiseLike, + ) => void | undefined + const interupted = new Promise((resolve) => { + tempInterupt = resolve + }) + + const interupt = () => { + if (tempInterupt) { + tempInterupt(interuptFlag) + } + } + + async function racer(operation: Operation): Promise { + const result = await Promise.race([ + evaluateTree(newController, linkedWallets, providers, operation), + interupted, + ]) + if (result === interuptFlag) { + return zeroAddress // interupted, the other must have returned true + } else if (isValidAddress(result)) { + // cancel the other operation + newController.abort() + interupt() + return result + } else { + return zeroAddress + } + } + + const checks = await Promise.all([ + racer(operation.leftOperation), + racer(operation.rightOperation), + ]) + const result = checks.find((res) => isValidAddress(res)) + return result ?? ethers.constants.AddressZero +} + +/** + * Evaluates a CheckOperation + * Mekes the smart contract call. Will be aborted if another branch invalidates + * the need to make the check. + * @param operation + * @param signal + * @returns + */ +async function evaluateCheckOperation( + controller: AbortController, + linkedWallets: string[], + providers: ethers.providers.StaticJsonRpcProvider[], + operation?: CheckOperation, +): Promise { + if (!operation) { + controller.abort() + return zeroAddress + } + + switch (operation.checkType) { + case CheckOperationType.MOCK: { + return evaluateMockOperation(operation, controller) + } + case CheckOperationType.ISENTITLED: + throw new Error(`CheckOperationType.ISENTITLED not implemented`) + case CheckOperationType.ERC20: + throw new Error('CheckOperationType.ERC20 not implemented') + case CheckOperationType.ERC721: { + await Promise.all(providers.map((p) => p.ready)) + const provider = findProviderFromChainId(providers, operation.chainId) + + if (!provider) { + controller.abort() + return zeroAddress + } + return evaluateERC721Operation(operation, controller, provider, linkedWallets) + } + case CheckOperationType.ERC1155: + throw new Error('CheckOperationType.ERC1155 not implemented') + case CheckOperationType.NONE: + default: + throw new Error('Unknown check operation type') + } +} + +/** + * + * @param operations + * @param linkedWallets + * @param providers + * @returns An entitled wallet or the zero address, indicating no entitlement + */ +export async function evaluateOperationsForEntitledWallet( + operations: Operation[], + linkedWallets: string[], + providers: ethers.providers.StaticJsonRpcProvider[], +) { + const controller = new AbortController() + const result = evaluateTree( + controller, + linkedWallets, + providers, + operations[operations.length - 1], + ) + controller.abort() + return result +} + +export async function evaluateTree( + controller: AbortController, + linkedWallets: string[], + providers: ethers.providers.StaticJsonRpcProvider[], + entry?: Operation, +): Promise { + if (!entry) { + controller.abort() + return zeroAddress + } + const newController = new AbortController() + controller.signal.addEventListener('abort', () => { + newController.abort() + }) + + if (isLogicalOperation(entry)) { + if (isAndOperation(entry)) { + return evaluateAndOperation(newController, linkedWallets, providers, entry) + } else if (isOrOperation(entry)) { + return evaluateOrOperation(newController, linkedWallets, providers, entry) + } else { + throw new Error('Unknown operation type') + } + } else if (isCheckOperation(entry)) { + return evaluateCheckOperation(newController, linkedWallets, providers, entry) + } else { + throw new Error('Unknown operation type') + } +} + +// These two methods are used to create a rule data struct for an external token or NFT +// checks for testing. +export function createExternalTokenStruct(addresses: Address[]) { + if (addresses.length === 0) { + return NoopRuleData + } + const defaultChain = addresses.map((address) => ({ + chainId: 1n, + address: address, + type: CheckOperationType.ERC20 as const, + })) + return createOperationsTree(defaultChain) +} + +export function createExternalNFTStruct(addresses: Address[]) { + if (addresses.length === 0) { + return NoopRuleData + } + const defaultChain = addresses.map((address) => ({ + // Anvil chain id + chainId: 31337n, + address: address, + type: CheckOperationType.ERC721 as const, + })) + return createOperationsTree(defaultChain) +} + +export type ContractCheckOperation = { + type: CheckOperationType + chainId: bigint + address: Address + threshold: bigint +} + +export function createOperationsTree( + checkOp: (Omit & { + threshold?: bigint + })[], +): IRuleEntitlement.RuleDataStruct { + if (checkOp.length === 0) { + return { + operations: [NoopOperation], + checkOperations: [], + logicalOperations: [], + } + } + + let operations: Operation[] = checkOp.map((op) => ({ + opType: OperationType.CHECK, + checkType: op.type, + chainId: op.chainId, + contractAddress: op.address, + threshold: op.threshold ?? BigInt(1), // Example threshold, adjust as needed + })) + + while (operations.length > 1) { + const newOperations: Operation[] = [] + for (let i = 0; i < operations.length; i += 2) { + if (i + 1 < operations.length) { + newOperations.push({ + opType: OperationType.LOGICAL, + logicalType: LogicalOperationType.AND, + leftOperation: operations[i], + rightOperation: operations[i + 1], + }) + } else { + newOperations.push(operations[i]) // Odd one out, just push it to the next level + } + } + operations = newOperations + } + + return treeToRuleData(operations[0]) +} + +export function createContractCheckOperationFromTree( + entitlementData: IRuleEntitlement.RuleDataStruct, +): ContractCheckOperation[] { + const operations = ruleDataToOperations([entitlementData]) + const checkOpSubsets: ContractCheckOperation[] = [] + operations.forEach((operation) => { + if (isCheckOperation(operation)) { + checkOpSubsets.push({ + address: operation.contractAddress, + chainId: operation.chainId, + type: operation.checkType, + threshold: operation.threshold, + }) + } + }) + return checkOpSubsets +} + +async function evaluateMockOperation( + operation: CheckOperation, + controller: AbortController, +): Promise { + const result = operation.chainId === 1n + const delay = Number.parseInt(operation.threshold.valueOf().toString()) + + return await new Promise((resolve) => { + controller.signal.onabort = () => { + if (timeout) { + clearTimeout(timeout) + resolve(zeroAddress) + } + } + + const timeout = setTimeout(() => { + if (result) { + resolve(MOCK_ADDRESS) + } else { + resolve(zeroAddress) + } + }, delay) + }) +} + +async function evaluateERC721Operation( + operation: CheckOperation, + controller: AbortController, + provider: ethers.providers.StaticJsonRpcProvider, + linkedWallets: string[], +): Promise { + const contract = new ethers.Contract( + operation.contractAddress, + ['function balanceOf(address) view returns (uint)'], + provider, + ) + + const walletBalances = await Promise.all( + linkedWallets.map(async (wallet) => { + try { + const result: ethers.BigNumberish = await contract.callStatic.balanceOf(wallet) + const resultAsBigNumber = ethers.BigNumber.from(result) + if (!ethers.BigNumber.isBigNumber(resultAsBigNumber)) { + return { + wallet, + balance: ethers.BigNumber.from(0), + } + } + return { + wallet, + balance: resultAsBigNumber, + } + } catch (error) { + return { + wallet, + balance: ethers.BigNumber.from(0), + } + } + }), + ) + + const walletsWithAsset = walletBalances.filter((balance) => balance.balance.gt(0)) + + const accumulatedBalance = walletsWithAsset.reduce( + (acc, el) => acc.add(el.balance), + ethers.BigNumber.from(0), + ) + + if (walletsWithAsset.length > 0 && accumulatedBalance.gte(operation.threshold)) { + return walletsWithAsset[0].wallet + } else { + controller.abort() + return zeroAddress + } +} + +function findProviderFromChainId( + providers: ethers.providers.StaticJsonRpcProvider[], + chainId: bigint, +) { + return providers.find((p) => p.network.chainId === Number(chainId)) +} + +function isValidAddress(value: unknown): value is Address { + return ( + typeof value === 'string' && + ethers.utils.isAddress(value) && + value !== ethers.constants.AddressZero + ) +} diff --git a/core/web3/src/error-types.ts b/core/web3/src/error-types.ts new file mode 100644 index 000000000..858309d5d --- /dev/null +++ b/core/web3/src/error-types.ts @@ -0,0 +1,13 @@ +export class WalletAlreadyLinkedError extends Error { + constructor(message?: string) { + super(message ?? 'Wallet is already linked') + this.name = 'SpaceDappWalletLinkLinkAlreadyExists' + } +} + +export class WalletNotLinkedError extends Error { + constructor(message?: string) { + super(message ?? 'Wallet is not linked') + this.name = 'SpaceDappWalletLinkLinkDoesNotExist' + } +} diff --git a/core/web3/src/index.ts b/core/web3/src/index.ts new file mode 100644 index 000000000..2038973a6 --- /dev/null +++ b/core/web3/src/index.ts @@ -0,0 +1,16 @@ +export * from './ContractHelpers' +export * from './ISpaceDapp' +export * from './ContractTypes' +export * from './LocalhostWeb3Provider' +export * from './TestGatingNFT' +export * from './SpaceDappFactory' +export * from './Utils' +export * from './Web3Constants' +export * from './IStaticContractsInfo' +export * from './error-types' +export * from './v3' +export * from './v3/RiverRegistry' +export * from './entitlement' +export * from './types' +export * from './RiverRegistryFactory' +export { createEntitlementStruct } from './ConvertersRoles' diff --git a/core/web3/src/types.ts b/core/web3/src/types.ts new file mode 100644 index 000000000..dfd5a7b84 --- /dev/null +++ b/core/web3/src/types.ts @@ -0,0 +1,7 @@ +export interface SpaceInfo { + address: string + networkId: string + name: string + owner: string + disabled: boolean +} diff --git a/core/web3/src/v3/BaseContractShim.ts b/core/web3/src/v3/BaseContractShim.ts new file mode 100644 index 000000000..19fd3cf01 --- /dev/null +++ b/core/web3/src/v3/BaseContractShim.ts @@ -0,0 +1,257 @@ +import { BytesLike, ethers } from 'ethers' +import { dlogger } from '@river-build/dlog' +import { ContractVersion } from '../IStaticContractsInfo' + +export type PromiseOrValue = T | Promise + +export const UNKNOWN_ERROR = 'UNKNOWN_ERROR' + +const logger = dlogger('csb:BaseContractShim') + +// V2 smart contract shim +// todo: replace BaseContractShim with this when refactoring is done +export class BaseContractShim< + T_DEV_CONTRACT extends ethers.Contract, + T_DEV_INTERFACE extends ethers.utils.Interface, + T_VERSIONED_CONTRACT extends ethers.Contract, + T_VERSIONED_INTERFACE extends ethers.utils.Interface, +> { + public readonly address: string + public readonly version: ContractVersion + public readonly contractInterface: ethers.utils.Interface + public readonly provider: ethers.providers.Provider | undefined + public readonly signer: ethers.Signer | undefined + private readonly abi: ethers.ContractInterface + private readContract?: ethers.Contract + private writeContract?: ethers.Contract + + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + abis: Record, + ) { + if (!abis[version]) { + throw new Error(`No ABI for version ${version}`) + } + this.address = address + this.version = version + this.provider = provider + this.abi = abis[version] + this.contractInterface = new ethers.utils.Interface(this.abi as string) + } + + public get interface(): T_DEV_INTERFACE | T_VERSIONED_INTERFACE { + switch (this.version) { + case ContractVersion.dev: + return this.contractInterface as unknown as T_DEV_INTERFACE + case ContractVersion.v3: + return this.contractInterface as unknown as T_VERSIONED_INTERFACE + default: + throw new Error(`Unsupported version ${this.version}`) + } + } + + public get read(): T_DEV_CONTRACT | T_VERSIONED_CONTRACT { + // lazy create an instance if it is not already cached + if (!this.readContract) { + this.readContract = this.createReadContractInstance() + } + switch (this.version) { + case ContractVersion.dev: + return this.readContract as unknown as T_DEV_CONTRACT + case ContractVersion.v3: + return this.readContract as unknown as T_VERSIONED_CONTRACT + default: + throw new Error(`Unsupported version ${this.version}`) + } + } + + public write(signer: ethers.Signer): T_DEV_CONTRACT | T_VERSIONED_CONTRACT { + // lazy create an instance if it is not already cached + if (!this.writeContract) { + this.writeContract = this.createWriteContractInstance(signer) + } else { + // update the signer if it has changed + if (this.writeContract.signer !== signer) { + this.writeContract = this.createWriteContractInstance(signer) + } + } + switch (this.version) { + case ContractVersion.dev: + return this.writeContract as unknown as T_DEV_CONTRACT + case ContractVersion.v3: + return this.writeContract as unknown as T_VERSIONED_CONTRACT + default: + throw new Error(`Unsupported version ${this.version}`) + } + } + + public decodeFunctionResult< + FnName extends keyof T_DEV_CONTRACT['functions'] | keyof T_VERSIONED_CONTRACT['functions'], + >(functionName: FnName, data: BytesLike) { + if (typeof functionName !== 'string') { + throw new Error('functionName must be a string') + } + if (!this.interface.getFunction(functionName)) { + throw new Error(`Function ${functionName} not found in contract interface`) + } + return this.interface.decodeFunctionResult(functionName, data) + } + + public decodeFunctionData< + FnName extends keyof T_DEV_CONTRACT['functions'] | keyof T_VERSIONED_CONTRACT['functions'], + >(functionName: FnName, data: BytesLike) { + if (typeof functionName !== 'string') { + throw new Error('functionName must be a string') + } + if (!this.interface.getFunction(functionName)) { + throw new Error(`Function ${functionName} not found in contract interface`) + } + return this.interface.decodeFunctionData(functionName, data) + } + + public encodeFunctionData< + FnName extends keyof T_DEV_CONTRACT['functions'] | keyof T_VERSIONED_CONTRACT['functions'], + FnParams extends + | Parameters + | Parameters, + >(functionName: FnName, args: FnParams): string { + if (typeof functionName !== 'string') { + throw new Error('functionName must be a string') + } + if (!this.interface.getFunction(functionName)) { + throw new Error(`Function ${functionName} not found in contract interface`) + } + return this.interface.encodeFunctionData(functionName, args) + } + + public parseError(error: unknown): Error & { + code?: string + data?: unknown + } { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any + const anyError = error as any + const { errorData, errorMessage, errorName } = this.getErrorData(anyError) + /** + * Return early if we have trouble extracting the error data. + * Don't know how to decode it. + */ + if (!errorData) { + logger.log( + `parseError ${errorName}: no error data, or don't know how to extract error data`, + ) + return { + name: errorName ?? UNKNOWN_ERROR, + message: errorMessage ?? anyError, + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + code: anyError?.code, + } + } + /** + * Try to decode the error data. If it fails, return the original error message. + */ + try { + const errDescription = this.interface.parseError(errorData) + const decodedError = { + name: errDescription?.errorFragment.name ?? UNKNOWN_ERROR, + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + message: errorMessage, + } + logger.log('decodedError', decodedError) + return decodedError + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (e: any) { + // Cannot decode error + logger.error('cannot decode error', e) + return { + name: UNKNOWN_ERROR, + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + message: e.message, + } + } + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private getErrorData(anyError: any): { + errorData: BytesLike + errorMessage: string + errorName: string + } { + /** + * Error data is nested in different places depending on whether the app is + * running in jest/node, or which blockchain (goerli, or anvil). + */ + // Case: jest/node error + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + let errorData: BytesLike = anyError.error?.error?.error?.data + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + let errorMessage: string = anyError.error?.error?.error?.message + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + let errorName: string = anyError.error?.error?.error?.name + + if (!errorData) { + // Case: Browser (anvil || base goerli) + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + errorData = anyError.error?.error?.data + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + errorMessage = anyError.error?.error?.message + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + errorName = anyError.error?.error?.name + } + + if (!errorData) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + errorData = anyError.data + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + errorData = anyError?.data + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + errorMessage = anyError?.message + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + errorName = anyError?.name + } + + if (!errorData) { + // sometimes it's a stringified object under anyError.reason or anyError.message + try { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + const reason = anyError?.reason || anyError?.message + if (typeof reason === 'string') { + const errorMatch = reason?.match(/error\\":\{([^}]+)\}/)?.[1] + if (errorMatch) { + const parsedData = JSON.parse(`{${errorMatch?.replace(/\\/g, '')}}`) + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + errorData = parsedData?.data + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + errorMessage = parsedData?.message + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + errorName = parsedData?.name + } + } + } catch (error) { + logger.error('error parsing reason', error) + } + } + + return { + errorData, + errorMessage, + errorName, + } + } + + public parseLog(log: ethers.providers.Log) { + return this.contractInterface.parseLog(log) + } + + private createReadContractInstance(): ethers.Contract { + if (!this.provider) { + throw new Error('No provider') + } + return new ethers.Contract(this.address, this.abi, this.provider) + } + + private createWriteContractInstance(signer: ethers.Signer): ethers.Contract { + return new ethers.Contract(this.address, this.abi, signer) + } +} diff --git a/core/web3/src/v3/IBanningShim.ts b/core/web3/src/v3/IBanningShim.ts new file mode 100644 index 000000000..762699196 --- /dev/null +++ b/core/web3/src/v3/IBanningShim.ts @@ -0,0 +1,34 @@ +import { + IBanning as LocalhostContract, + IBanningInterface as LocalhostInterface, +} from '@river-build/generated/dev/typings/IBanning' + +import { + IBanning as BaseSepoliaContract, + IBanningInterface as BaseSepoliaInterface, +} from '@river-build/generated/v3/typings/IBanning' + +import { ethers } from 'ethers' +import { BaseContractShim } from './BaseContractShim' +import { ContractVersion } from '../IStaticContractsInfo' + +import LocalhostAbi from '@river-build/generated/dev/abis/IBanning.abi.json' assert { type: 'json' } +import BaseSepoliaAbi from '@river-build/generated/v3/abis/IBanning.abi.json' assert { type: 'json' } + +export class IBanningShim extends BaseContractShim< + LocalhostContract, + LocalhostInterface, + BaseSepoliaContract, + BaseSepoliaInterface +> { + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + ) { + super(address, version, provider, { + [ContractVersion.dev]: LocalhostAbi, + [ContractVersion.v3]: BaseSepoliaAbi, + }) + } +} diff --git a/core/web3/src/v3/IChannelShim.ts b/core/web3/src/v3/IChannelShim.ts new file mode 100644 index 000000000..fa01657cb --- /dev/null +++ b/core/web3/src/v3/IChannelShim.ts @@ -0,0 +1,36 @@ +import { + IChannel as LocalhostContract, + IChannelBase as LocalhostIChannelBase, + IChannelInterface as LocalhostInterface, +} from '@river-build/generated/dev/typings/IChannel' +import { + IChannel as BaseSepoliaContract, + IChannelInterface as BaseSepoliaInterface, +} from '@river-build/generated/v3/typings/IChannel' + +import LocalhostAbi from '@river-build/generated/dev/abis/Channels.abi.json' assert { type: 'json' } +import BaseSepoliaAbi from '@river-build/generated/v3/abis/Channels.abi.json' assert { type: 'json' } + +import { ethers } from 'ethers' +import { BaseContractShim } from './BaseContractShim' +import { ContractVersion } from '../IStaticContractsInfo' + +export type { LocalhostIChannelBase as IChannelBase } + +export class IChannelShim extends BaseContractShim< + LocalhostContract, + LocalhostInterface, + BaseSepoliaContract, + BaseSepoliaInterface +> { + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + ) { + super(address, version, provider, { + [ContractVersion.dev]: LocalhostAbi, + [ContractVersion.v3]: BaseSepoliaAbi, + }) + } +} diff --git a/core/web3/src/v3/IERC721AQueryableShim.ts b/core/web3/src/v3/IERC721AQueryableShim.ts new file mode 100644 index 000000000..c73a2f1b1 --- /dev/null +++ b/core/web3/src/v3/IERC721AQueryableShim.ts @@ -0,0 +1,34 @@ +import { + IERC721AQueryable as LocalhostContract, + IERC721AQueryableInterface as LocalhostInterface, +} from '@river-build/generated/dev/typings/IERC721AQueryable' + +import { + IERC721AQueryable as BaseSepoliaContract, + IERC721AQueryableInterface as BaseSepoliaInterface, +} from '@river-build/generated/v3/typings/IERC721AQueryable' + +import { ethers } from 'ethers' +import { BaseContractShim } from './BaseContractShim' +import { ContractVersion } from '../IStaticContractsInfo' + +import LocalhostAbi from '@river-build/generated/dev/abis/IERC721AQueryable.abi.json' assert { type: 'json' } +import BaseSepoliaAbi from '@river-build/generated/v3/abis/IERC721AQueryable.abi.json' assert { type: 'json' } + +export class IERC721AQueryableShim extends BaseContractShim< + LocalhostContract, + LocalhostInterface, + BaseSepoliaContract, + BaseSepoliaInterface +> { + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + ) { + super(address, version, provider, { + [ContractVersion.dev]: LocalhostAbi, + [ContractVersion.v3]: BaseSepoliaAbi, + }) + } +} diff --git a/core/web3/src/v3/IEntitlementsShim.ts b/core/web3/src/v3/IEntitlementsShim.ts new file mode 100644 index 000000000..61bf357ee --- /dev/null +++ b/core/web3/src/v3/IEntitlementsShim.ts @@ -0,0 +1,36 @@ +import { + IEntitlementsManager as LocalhostContract, + IEntitlementsManagerBase as LocalhostIEntitlementsBase, + IEntitlementsManagerInterface as LocalhostInterface, +} from '@river-build/generated/dev/typings/IEntitlementsManager' +import { + IEntitlementsManager as BaseSepoliaContract, + IEntitlementsManagerInterface as BaseSepoliaInterface, +} from '@river-build/generated/v3/typings/IEntitlementsManager' + +import LocalhostAbi from '@river-build/generated/dev/abis/EntitlementsManager.abi.json' assert { type: 'json' } +import BaseSepoliaAbi from '@river-build/generated/v3/abis/EntitlementsManager.abi.json' assert { type: 'json' } + +import { ethers } from 'ethers' +import { BaseContractShim } from './BaseContractShim' +import { ContractVersion } from '../IStaticContractsInfo' + +export type { LocalhostIEntitlementsBase as IEntitlementsBase } + +export class IEntitlementsShim extends BaseContractShim< + LocalhostContract, + LocalhostInterface, + BaseSepoliaContract, + BaseSepoliaInterface +> { + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + ) { + super(address, version, provider, { + [ContractVersion.dev]: LocalhostAbi, + [ContractVersion.v3]: BaseSepoliaAbi, + }) + } +} diff --git a/core/web3/src/v3/IMembershipShim.ts b/core/web3/src/v3/IMembershipShim.ts new file mode 100644 index 000000000..e4a339a30 --- /dev/null +++ b/core/web3/src/v3/IMembershipShim.ts @@ -0,0 +1,92 @@ +import { + MembershipFacet as LocalhostContract, + MembershipFacetInterface as LocalhostInterface, +} from '@river-build/generated/dev/typings/MembershipFacet' +import { + MembershipFacet as BaseSepoliaContract, + MembershipFacetInterface as BaseSepoliaInterface, +} from '@river-build/generated/v3/typings/MembershipFacet' + +import { BigNumber, BigNumberish, ethers } from 'ethers' +import { BaseContractShim } from './BaseContractShim' +import { ContractVersion } from '../IStaticContractsInfo' + +import LocalhostAbi from '@river-build/generated/dev/abis/MembershipFacet.abi.json' assert { type: 'json' } +import BaseSepoliaAbi from '@river-build/generated/v3/abis/MembershipFacet.abi.json' assert { type: 'json' } +import { dlogger } from '@river-build/dlog' + +const log = dlogger('csb:IMembershipShim') + +export class IMembershipShim extends BaseContractShim< + LocalhostContract, + LocalhostInterface, + BaseSepoliaContract, + BaseSepoliaInterface +> { + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + ) { + super(address, version, provider, { + [ContractVersion.dev]: LocalhostAbi, + [ContractVersion.v3]: BaseSepoliaAbi, + }) + } + + async hasMembership(wallet: string) { + const balance = (await this.read.balanceOf(wallet)).toNumber() + return balance > 0 + } + + async listenForMembershipToken( + receiver: string, + abortController?: AbortController, + ): Promise<{ issued: true; tokenId: string } | { issued: false; tokenId: undefined }> { + // TODO: this isn't picking up correct typed fucntion signature, treating as string + const issuedFilter = this.read.filters['MembershipTokenIssued(address,uint256)']( + receiver, + ) as string + const rejectedFilter = this.read.filters['MembershipTokenRejected(address)']( + receiver, + ) as string + + return new Promise< + { issued: true; tokenId: string } | { issued: false; tokenId: undefined } + >((resolve, _reject) => { + const cleanup = () => { + this.read.off(issuedFilter, issuedListener) + this.read.off(rejectedFilter, rejectedListener) + abortController?.signal.removeEventListener('abort', onAbort) + } + const onAbort = () => { + cleanup() + resolve({ issued: false, tokenId: undefined }) + } + const issuedListener = (recipient: string, tokenId: BigNumberish) => { + if (receiver === recipient) { + log.log('MembershipTokenIssued', { receiver, recipient, tokenId }) + cleanup() + resolve({ issued: true, tokenId: BigNumber.from(tokenId).toString() }) + } else { + // This techincally should never happen, but we should log it + log.log('MembershipTokenIssued mismatch', { receiver, recipient, tokenId }) + } + } + + const rejectedListener = (recipient: string) => { + if (receiver === recipient) { + cleanup() + resolve({ issued: false, tokenId: undefined }) + } else { + // This techincally should never happen, but we should log it + log.log('MembershipTokenIssued mismatch', { receiver, recipient }) + } + } + + this.read.on(issuedFilter, issuedListener) + this.read.on(rejectedFilter, rejectedListener) + abortController?.signal.addEventListener('abort', onAbort) + }) + } +} diff --git a/core/web3/src/v3/IMulticallShim.ts b/core/web3/src/v3/IMulticallShim.ts new file mode 100644 index 000000000..c7321030c --- /dev/null +++ b/core/web3/src/v3/IMulticallShim.ts @@ -0,0 +1,33 @@ +import { + IMulticall as LocalhostContract, + IMulticallInterface as LocalhostInterface, +} from '@river-build/generated/dev/typings/IMulticall' +import { + IMulticall as BaseSepoliaContract, + IMulticallInterface as BaseSepoliaInterface, +} from '@river-build/generated/v3/typings/IMulticall' + +import LocalhostAbi from '@river-build/generated/dev/abis/IMulticall.abi.json' assert { type: 'json' } +import BaseSepoliaAbi from '@river-build/generated/v3/abis/IMulticall.abi.json' assert { type: 'json' } + +import { ethers } from 'ethers' +import { BaseContractShim } from './BaseContractShim' +import { ContractVersion } from '../IStaticContractsInfo' + +export class IMulticallShim extends BaseContractShim< + LocalhostContract, + LocalhostInterface, + BaseSepoliaContract, + BaseSepoliaInterface +> { + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + ) { + super(address, version, provider, { + [ContractVersion.dev]: LocalhostAbi, + [ContractVersion.v3]: BaseSepoliaAbi, + }) + } +} diff --git a/core/web3/src/v3/IPrepayShim.ts b/core/web3/src/v3/IPrepayShim.ts new file mode 100644 index 000000000..44e0d6a3f --- /dev/null +++ b/core/web3/src/v3/IPrepayShim.ts @@ -0,0 +1,33 @@ +import { + PrepayFacet as LocalhostContract, + PrepayFacetInterface as LocalhostInterface, +} from '@river-build/generated/dev/typings/PrepayFacet' +import { + PrepayFacet as BaseSepoliaContract, + PrepayFacetInterface as BaseSepoliaInterface, +} from '@river-build/generated/v3/typings/PrepayFacet' + +import { ethers } from 'ethers' +import { BaseContractShim } from './BaseContractShim' +import { ContractVersion } from '../IStaticContractsInfo' + +import LocalhostAbi from '@river-build/generated/dev/abis/PrepayFacet.abi.json' assert { type: 'json' } +import BaseSepoliaAbi from '@river-build/generated/v3/abis/PrepayFacet.abi.json' assert { type: 'json' } + +export class IPrepayShim extends BaseContractShim< + LocalhostContract, + LocalhostInterface, + BaseSepoliaContract, + BaseSepoliaInterface +> { + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + ) { + super(address, version, provider, { + [ContractVersion.dev]: LocalhostAbi, + [ContractVersion.v3]: BaseSepoliaAbi, + }) + } +} diff --git a/core/web3/src/v3/IPricingShim.ts b/core/web3/src/v3/IPricingShim.ts new file mode 100644 index 000000000..00c7d1e2e --- /dev/null +++ b/core/web3/src/v3/IPricingShim.ts @@ -0,0 +1,35 @@ +import { + IPricingModules as LocalhostContract, + IPricingModulesInterface as LocalhostInterface, +} from '@river-build/generated/dev/typings/IPricingModules' +export type { IPricingModulesBase } from '@river-build/generated/dev/typings/IPricingModules' + +import { + IPricingModules as BaseSepoliaContract, + IPricingModulesInterface as BaseSepoliaInterface, +} from '@river-build/generated/v3/typings/IPricingModules' + +import { ethers } from 'ethers' +import { BaseContractShim } from './BaseContractShim' +import { ContractVersion } from '../IStaticContractsInfo' + +import LocalhostAbi from '@river-build/generated/dev/abis/IPricingModules.abi.json' assert { type: 'json' } +import BaseSepoliaAbi from '@river-build/generated/v3/abis/IPricingModules.abi.json' assert { type: 'json' } + +export class IPricingShim extends BaseContractShim< + LocalhostContract, + LocalhostInterface, + BaseSepoliaContract, + BaseSepoliaInterface +> { + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + ) { + super(address, version, provider, { + [ContractVersion.dev]: LocalhostAbi, + [ContractVersion.v3]: BaseSepoliaAbi, + }) + } +} diff --git a/core/web3/src/v3/IRiverRegistryShim.ts b/core/web3/src/v3/IRiverRegistryShim.ts new file mode 100644 index 000000000..e13e93dc9 --- /dev/null +++ b/core/web3/src/v3/IRiverRegistryShim.ts @@ -0,0 +1,33 @@ +import { + INodeRegistry as DevContract, + INodeRegistryInterface as DevInterface, +} from '@river-build/generated/dev/typings/INodeRegistry' +import { + INodeRegistry as V3Contract, + INodeRegistryInterface as V3Interface, +} from '@river-build/generated/v3/typings/INodeRegistry' + +import DevAbi from '@river-build/generated/dev/abis/NodeRegistry.abi.json' assert { type: 'json' } +import V3Abi from '@river-build/generated/v3/abis/NodeRegistry.abi.json' assert { type: 'json' } + +import { ethers } from 'ethers' +import { BaseContractShim } from './BaseContractShim' +import { ContractVersion } from '../IStaticContractsInfo' + +export class IRiverRegistryShim extends BaseContractShim< + DevContract, + DevInterface, + V3Contract, + V3Interface +> { + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + ) { + super(address, version, provider, { + [ContractVersion.dev]: DevAbi, + [ContractVersion.v3]: V3Abi, + }) + } +} diff --git a/core/web3/src/v3/IRolesShim.ts b/core/web3/src/v3/IRolesShim.ts new file mode 100644 index 000000000..3dfdebd03 --- /dev/null +++ b/core/web3/src/v3/IRolesShim.ts @@ -0,0 +1,36 @@ +import { + IRoles as LocalhostContract, + IRolesBase as LocalhostIRolesBase, + IRolesInterface as LocalhostInterface, +} from '@river-build/generated/dev/typings/IRoles' +import { + IRoles as BaseSepoliaContract, + IRolesInterface as BaseSepoliaInterface, +} from '@river-build/generated/v3/typings/IRoles' + +import LocalhostAbi from '@river-build/generated/dev/abis/Roles.abi.json' assert { type: 'json' } +import BaseSepoliaAbi from '@river-build/generated/v3/abis/Roles.abi.json' assert { type: 'json' } + +import { ethers } from 'ethers' +import { BaseContractShim } from './BaseContractShim' +import { ContractVersion } from '../IStaticContractsInfo' + +export type { LocalhostIRolesBase as IRolesBase } + +export class IRolesShim extends BaseContractShim< + LocalhostContract, + LocalhostInterface, + BaseSepoliaContract, + BaseSepoliaInterface +> { + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + ) { + super(address, version, provider, { + [ContractVersion.dev]: LocalhostAbi, + [ContractVersion.v3]: BaseSepoliaAbi, + }) + } +} diff --git a/core/web3/src/v3/IRuleEntitlementShim.ts b/core/web3/src/v3/IRuleEntitlementShim.ts new file mode 100644 index 000000000..efac6f878 --- /dev/null +++ b/core/web3/src/v3/IRuleEntitlementShim.ts @@ -0,0 +1,7 @@ +import { IRuleEntitlement as LocalhostIRuleEntitlement } from '@river-build/generated/dev/typings/IRuleEntitlement' + +import LocalhostEntitlementAbi from '@river-build/generated/dev/abis/IRuleEntitlement.abi' + +export type { LocalhostIRuleEntitlement as IRuleEntitlement } + +export { LocalhostEntitlementAbi as IRuleEntitlementAbi } diff --git a/core/web3/src/v3/ISpaceArchitectShim.ts b/core/web3/src/v3/ISpaceArchitectShim.ts new file mode 100644 index 000000000..43d37c728 --- /dev/null +++ b/core/web3/src/v3/ISpaceArchitectShim.ts @@ -0,0 +1,38 @@ +import { + IMembershipBase as LocalhostIMembershipBase, + IArchitect as LocalhostContract, + IArchitectBase as LocalhostISpaceArchitectBase, + IArchitectInterface as LocalhostInterface, +} from '@river-build/generated/dev/typings/IArchitect' +import { + IArchitect as BaseSepoliaContract, + IArchitectInterface as BaseSepoliaInterface, +} from '@river-build/generated/v3/typings/IArchitect' + +import LocalhostAbi from '@river-build/generated/dev/abis/Architect.abi.json' assert { type: 'json' } +import BaseSepoliaAbi from '@river-build/generated/v3/abis/Architect.abi.json' assert { type: 'json' } + +import { ethers } from 'ethers' +import { BaseContractShim } from './BaseContractShim' +import { ContractVersion } from '../IStaticContractsInfo' + +export type { LocalhostIMembershipBase as IMembershipBase } +export type { LocalhostISpaceArchitectBase as IArchitectBase } + +export class ISpaceArchitectShim extends BaseContractShim< + LocalhostContract, + LocalhostInterface, + BaseSepoliaContract, + BaseSepoliaInterface +> { + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + ) { + super(address, version, provider, { + [ContractVersion.dev]: LocalhostAbi, + [ContractVersion.v3]: BaseSepoliaAbi, + }) + } +} diff --git a/core/web3/src/v3/ISpaceOwnerShim.ts b/core/web3/src/v3/ISpaceOwnerShim.ts new file mode 100644 index 000000000..1b6fa4ba1 --- /dev/null +++ b/core/web3/src/v3/ISpaceOwnerShim.ts @@ -0,0 +1,36 @@ +import { + ISpaceOwner as LocalhostContract, + ISpaceOwnerBase as LocalhostISpaceOwnerBase, + ISpaceOwnerInterface as LocalhostInterface, +} from '@river-build/generated/dev/typings/ISpaceOwner' +import { + ISpaceOwner as BaseSepoliaContract, + ISpaceOwnerInterface as BaseSepoliaInterface, +} from '@river-build/generated/v3/typings/ISpaceOwner' + +import LocalhostAbi from '@river-build/generated/dev/abis/SpaceOwner.abi.json' assert { type: 'json' } +import BaseSepoliaAbi from '@river-build/generated/v3/abis/SpaceOwner.abi.json' assert { type: 'json' } + +import { ethers } from 'ethers' +import { BaseContractShim } from './BaseContractShim' +import { ContractVersion } from '../IStaticContractsInfo' + +export type { LocalhostISpaceOwnerBase as ISpaceOwnerBase } + +export class ISpaceOwnerShim extends BaseContractShim< + LocalhostContract, + LocalhostInterface, + BaseSepoliaContract, + BaseSepoliaInterface +> { + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + ) { + super(address, version, provider, { + [ContractVersion.dev]: LocalhostAbi, + [ContractVersion.v3]: BaseSepoliaAbi, + }) + } +} diff --git a/core/web3/src/v3/MockERC721AShim.ts b/core/web3/src/v3/MockERC721AShim.ts new file mode 100644 index 000000000..71d4e7919 --- /dev/null +++ b/core/web3/src/v3/MockERC721AShim.ts @@ -0,0 +1,33 @@ +import { + MockERC721A as LocalhostContract, + MockERC721AInterface as LocalhostInterface, +} from '@river-build/generated/dev/typings/MockERC721A' +import { + MockERC721A as BaseSepoliaContract, + MockERC721AInterface as BaseSepoliaInterface, +} from '@river-build/generated/v3/typings/MockERC721A' + +import LocalhostAbi from '@river-build/generated/dev/abis/MockERC721A.abi.json' assert { type: 'json' } +import BaseSepoliaAbi from '@river-build/generated/v3/abis/MockERC721A.abi.json' assert { type: 'json' } + +import { ethers } from 'ethers' +import { BaseContractShim } from './BaseContractShim' +import { ContractVersion } from '../IStaticContractsInfo' + +export class MockERC721AShim extends BaseContractShim< + LocalhostContract, + LocalhostInterface, + BaseSepoliaContract, + BaseSepoliaInterface +> { + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + ) { + super(address, version, provider, { + [ContractVersion.dev]: LocalhostAbi, + [ContractVersion.v3]: BaseSepoliaAbi, + }) + } +} diff --git a/core/web3/src/v3/OwnableFacetShim.ts b/core/web3/src/v3/OwnableFacetShim.ts new file mode 100644 index 000000000..38d1546ee --- /dev/null +++ b/core/web3/src/v3/OwnableFacetShim.ts @@ -0,0 +1,33 @@ +import { + OwnableFacet as LocalhostContract, + OwnableFacetInterface as LocalhostInterface, +} from '@river-build/generated/dev/typings/OwnableFacet' +import { + OwnableFacet as BaseSepoliaContract, + OwnableFacetInterface as BaseSepoliaInterface, +} from '@river-build/generated/v3/typings/OwnableFacet' + +import LocalhostAbi from '@river-build/generated/dev/abis/OwnableFacet.abi.json' assert { type: 'json' } +import BaseSepoliaAbi from '@river-build/generated/v3/abis/OwnableFacet.abi.json' assert { type: 'json' } + +import { ethers } from 'ethers' +import { BaseContractShim } from './BaseContractShim' +import { ContractVersion } from '../IStaticContractsInfo' + +export class OwnableFacetShim extends BaseContractShim< + LocalhostContract, + LocalhostInterface, + BaseSepoliaContract, + BaseSepoliaInterface +> { + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + ) { + super(address, version, provider, { + [ContractVersion.dev]: LocalhostAbi, + [ContractVersion.v3]: BaseSepoliaAbi, + }) + } +} diff --git a/core/web3/src/v3/PricingModules.ts b/core/web3/src/v3/PricingModules.ts new file mode 100644 index 000000000..f3988b484 --- /dev/null +++ b/core/web3/src/v3/PricingModules.ts @@ -0,0 +1,32 @@ +import { ethers } from 'ethers' +import { BaseChainConfig } from '../IStaticContractsInfo' +import { PricingModuleStruct } from '../ContractTypes' +import { IPricingShim } from './IPricingShim' + +export class PricingModules { + private readonly pricingShim: IPricingShim + + constructor(config: BaseChainConfig, provider: ethers.providers.Provider | undefined) { + this.pricingShim = new IPricingShim( + config.addresses.spaceFactory, + config.contractVersion, + provider, + ) + } + + public async listPricingModules(): Promise { + return this.pricingShim.read.listPricingModules() + } + + public async addPricingModule(moduleAddress: string, signer: ethers.Signer): Promise { + await this.pricingShim.write(signer).addPricingModule(moduleAddress) + } + + public async removePricingModule(moduleAddress: string, signer: ethers.Signer): Promise { + await this.pricingShim.write(signer).removePricingModule(moduleAddress) + } + + public async isPricingModule(moduleAddress: string): Promise { + return this.pricingShim.read.isPricingModule(moduleAddress) + } +} diff --git a/core/web3/src/v3/RiverRegistry.ts b/core/web3/src/v3/RiverRegistry.ts new file mode 100644 index 000000000..d8bee0acc --- /dev/null +++ b/core/web3/src/v3/RiverRegistry.ts @@ -0,0 +1,79 @@ +import { NodeStructOutput } from '@river-build/generated/dev/typings/INodeRegistry' +import { RiverChainConfig } from '../IStaticContractsInfo' +import { IRiverRegistryShim } from './IRiverRegistryShim' +import { ethers } from 'ethers' + +interface IRiverRegistry { + [nodeAddress: string]: NodeStructOutput +} + +interface NodeUrls { + url: string +} + +export class RiverRegistry { + public readonly config: RiverChainConfig + public readonly provider: ethers.providers.Provider + public readonly riverRegistry: IRiverRegistryShim + public readonly registry: IRiverRegistry = {} + + constructor(config: RiverChainConfig, provider: ethers.providers.Provider) { + this.config = config + this.provider = provider + this.riverRegistry = new IRiverRegistryShim( + this.config.addresses.riverRegistry, + this.config.contractVersion, + provider, + ) + } + + public async getAllNodes(nodeStatus?: number): Promise { + const allNodes = await this.riverRegistry.read.getAllNodes() + if (allNodes.length == 0) { + return undefined + } + const registry: IRiverRegistry = {} + for (const node of allNodes) { + if (nodeStatus && node.status != nodeStatus) { + continue + } + if (nodeStatus !== undefined) { + registry[node.nodeAddress] = node + } + // update in-memory registry + this.registry[node.nodeAddress] = node + } + if (nodeStatus !== undefined) { + return registry + } + // if we've updated the entire registry return that + return this.registry + } + + public async getAllNodeUrls(nodeStatus?: number): Promise { + const allNodes = await this.riverRegistry.read.getAllNodes() + if (allNodes.length == 0) { + return undefined + } + const nodeUrls: NodeUrls[] = [] + for (const node of allNodes) { + // get all nodes with optional status + if (nodeStatus && node.status != nodeStatus) { + continue + } + nodeUrls.push({ url: node.url }) + // update registry + this.registry[node.nodeAddress] = node + } + return nodeUrls + } + + public async getOperationalNodeUrls(): Promise { + const NODE_OPERATIONAL = 2 + const nodeUrls = await this.getAllNodeUrls(NODE_OPERATIONAL) + if (!nodeUrls || nodeUrls.length === 0) { + throw new Error('No operational nodes found in registry') + } + return nodeUrls.map((x) => x.url).join(',') + } +} diff --git a/core/web3/src/v3/RuleEntitlementShim.ts b/core/web3/src/v3/RuleEntitlementShim.ts new file mode 100644 index 000000000..1fcef7039 --- /dev/null +++ b/core/web3/src/v3/RuleEntitlementShim.ts @@ -0,0 +1,74 @@ +import { + IRuleEntitlement as LocalhostContract, + IRuleEntitlementInterface as LocalhostInterface, +} from '@river-build/generated/dev/typings/IRuleEntitlement' + +type BaseSepoliaContract = LocalhostContract +type BaseSepoliaInterface = LocalhostInterface +import LocalhostAbi from '@river-build/generated/dev/abis/IRuleEntitlement.abi.json' assert { type: 'json' } +import BaseSepoliaAbi from '@river-build/generated/v3/abis/IRuleEntitlement.abi.json' assert { type: 'json' } + +import { BaseContractShim } from './BaseContractShim' +import { BigNumberish, ethers } from 'ethers' +import { EntitlementModuleType, EntitlementModule } from '../ContractTypes' +import { ContractVersion } from '../IStaticContractsInfo' +import { dlogger } from '@river-build/dlog' +const logger = dlogger('csb:SpaceDapp:debug') + +export class RuleEntitlementShim + extends BaseContractShim< + LocalhostContract, + LocalhostInterface, + BaseSepoliaContract, + BaseSepoliaInterface + > + implements EntitlementModule +{ + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + ) { + super(address, version, provider, { + [ContractVersion.dev]: LocalhostAbi, + [ContractVersion.v3]: BaseSepoliaAbi, + }) + } + + public get moduleType(): EntitlementModuleType { + return EntitlementModuleType.RuleEntitlement + } + + public async getRoleEntitlement( + roleId: BigNumberish, + ): Promise { + if (roleId === 0) { + return { + operations: [], + checkOperations: [], + logicalOperations: [], + } + } + return this.read.getRuleData(roleId) + } + + public decodeGetRuleData( + entitlmentData: string, + ): LocalhostContract.RuleDataStruct[] | undefined { + try { + const decoded = this.decodeFunctionResult( + 'getRuleData', + entitlmentData, + ) as unknown as LocalhostContract.RuleDataStruct[] + + if (decoded.length === 0) { + logger.error('RuleEntitlementShim No rule data', decoded) + return undefined + } + return decoded + } catch (error) { + logger.error('RuleEntitlementShim Error decoding RuleDataStruct', error) + } + return + } +} diff --git a/core/web3/src/v3/Space.ts b/core/web3/src/v3/Space.ts new file mode 100644 index 000000000..7dffe4175 --- /dev/null +++ b/core/web3/src/v3/Space.ts @@ -0,0 +1,438 @@ +import { BigNumber, BigNumberish, ethers } from 'ethers' +import { + ChannelDetails, + ChannelMetadata, + EntitlementDetails, + EntitlementModuleType, + EntitlementShim, + Permission, + RoleDetails, + RoleEntitlements, + isRuleEntitlement, + isStringArray, + isUserEntitlement, +} from '../ContractTypes' +import { IChannelBase, IChannelShim } from './IChannelShim' +import { IRolesBase, IRolesShim } from './IRolesShim' +import { ISpaceOwnerBase, ISpaceOwnerShim } from './ISpaceOwnerShim' + +import { IEntitlementsShim } from './IEntitlementsShim' +import { IMulticallShim } from './IMulticallShim' +import { OwnableFacetShim } from './OwnableFacetShim' +import { TokenPausableFacetShim } from './TokenPausableFacetShim' +import { UNKNOWN_ERROR } from './BaseContractShim' +import { UserEntitlementShim } from './UserEntitlementShim' +import { isRoleIdInArray } from '../ContractHelpers' +import { toPermissions } from '../ConvertersRoles' +import { IMembershipShim } from './IMembershipShim' +import { NoopRuleData } from '../entitlement' +import { RuleEntitlementShim } from './RuleEntitlementShim' +import { IRuleEntitlement } from '.' +import { IBanningShim } from './IBanningShim' +import { IERC721AQueryableShim } from './IERC721AQueryableShim' +import { ContractVersion } from '../IStaticContractsInfo' + +interface AddressToEntitlement { + [address: string]: EntitlementShim +} + +interface SpaceConstructorArgs { + address: string + spaceId: string + version: ContractVersion + provider: ethers.providers.Provider | undefined + spaceOwnerAddress: string +} + +export class Space { + private readonly address: string + private readonly addressToEntitlement: AddressToEntitlement = {} + private readonly spaceId: string + private readonly version: ContractVersion + public readonly provider: ethers.providers.Provider | undefined + private readonly channel: IChannelShim + private readonly entitlements: IEntitlementsShim + private readonly multicall: IMulticallShim + private readonly ownable: OwnableFacetShim + private readonly pausable: TokenPausableFacetShim + private readonly roles: IRolesShim + private readonly spaceOwner: ISpaceOwnerShim + private readonly membership: IMembershipShim + private readonly banning: IBanningShim + private readonly erc721AQueryable: IERC721AQueryableShim + + constructor({ address, version, spaceId, provider, spaceOwnerAddress }: SpaceConstructorArgs) { + this.address = address + this.spaceId = spaceId + this.version = version + this.provider = provider + this.channel = new IChannelShim(address, version, provider) + this.entitlements = new IEntitlementsShim(address, version, provider) + this.multicall = new IMulticallShim(address, version, provider) + this.ownable = new OwnableFacetShim(address, version, provider) + this.pausable = new TokenPausableFacetShim(address, version, provider) + this.roles = new IRolesShim(address, version, provider) + this.spaceOwner = new ISpaceOwnerShim(spaceOwnerAddress, version, provider) + this.membership = new IMembershipShim(address, version, provider) + this.banning = new IBanningShim(address, version, provider) + this.erc721AQueryable = new IERC721AQueryableShim(address, version, provider) + } + + public get Address(): string { + return this.address + } + + public get SpaceId(): string { + return this.spaceId + } + + public get Channels(): IChannelShim { + return this.channel + } + + public get Multicall(): IMulticallShim { + return this.multicall + } + + public get Ownable(): OwnableFacetShim { + return this.ownable + } + + public get Pausable(): TokenPausableFacetShim { + return this.pausable + } + + public get Roles(): IRolesShim { + return this.roles + } + + public get Entitlements(): IEntitlementsShim { + return this.entitlements + } + + public get SpaceOwner(): ISpaceOwnerShim { + return this.spaceOwner + } + + public get Membership(): IMembershipShim { + return this.membership + } + + public get Banning(): IBanningShim { + return this.banning + } + + public get ERC721AQueryable(): IERC721AQueryableShim { + return this.erc721AQueryable + } + + public getSpaceInfo(): Promise { + return this.spaceOwner.read.getSpaceInfo(this.address) + } + + public async getRole(roleId: BigNumberish): Promise { + // get all the entitlements for the space + const entitlementShims = await this.getEntitlementShims() + // get the various pieces of details + const [roleEntitlements, channels] = await Promise.all([ + this.getRoleEntitlements(entitlementShims, roleId), + this.getChannelsWithRole(roleId), + ]) + // assemble the result + if (roleEntitlements === null) { + return null + } + return { + id: roleEntitlements.roleId, + name: roleEntitlements.name, + permissions: roleEntitlements.permissions, + channels, + users: roleEntitlements.users, + ruleData: roleEntitlements.ruleData, + } + } + + private parseChannelMetadataJSON(metadataStr: string): { name: string; description: string } { + try { + return JSON.parse(metadataStr) as { + name: string + description: string + } + } catch (error) { + return { + name: metadataStr, + description: '', + } + } + } + + public async getChannel(channelNetworkId: string): Promise { + // get most of the channel details except the roles which + // require a separate call to get each role's details + const channelId = channelNetworkId.startsWith('0x') + ? channelNetworkId + : `0x${channelNetworkId}` + const channelInfo = await this.Channels.read.getChannel(channelId) + const roles = await this.getChannelRoleEntitlements(channelInfo) + const metadata = this.parseChannelMetadataJSON(channelInfo.metadata) + return { + spaceNetworkId: this.spaceId, + channelNetworkId: channelNetworkId.replace('0x', ''), + name: metadata.name, + description: metadata.description, + disabled: channelInfo.disabled, + roles, + } + } + + public async getChannelMetadata(channelNetworkId: string): Promise { + const channelId = channelNetworkId.startsWith('0x') + ? channelNetworkId + : `0x${channelNetworkId}` + const channelInfo = await this.Channels.read.getChannel(channelId) + const metadata = this.parseChannelMetadataJSON(channelInfo.metadata) + return { + name: metadata.name, + channelNetworkId: channelInfo.id.replace('0x', ''), + description: metadata.description, + disabled: channelInfo.disabled, + } + } + + public async getChannels(): Promise { + const channels: ChannelMetadata[] = [] + const getOutput = await this.Channels.read.getChannels() + for (const o of getOutput) { + const metadata = this.parseChannelMetadataJSON(o.metadata) + channels.push({ + name: metadata.name, + description: metadata.description, + channelNetworkId: o.id.replace('0x', ''), + disabled: o.disabled, + }) + } + return channels + } + + public async getChannelRoles(channelNetworkId: string): Promise { + const channelId = channelNetworkId.startsWith('0x') + ? channelNetworkId + : `0x${channelNetworkId}` + // get all the roleIds for the channel + const channelInfo = await this.Channels.read.getChannel(channelId) + // return the role info + return this.getRolesInfo(channelInfo.roleIds) + } + + public async getPermissionsByRoleId(roleId: number): Promise { + const permissions = await this.Roles.read.getPermissionsByRoleId(roleId) + return toPermissions(permissions) + } + + private async getChannelRoleEntitlements( + channelInfo: IChannelBase.ChannelStructOutput, + ): Promise { + // get all the entitlements for the space + const entitlementShims = await this.getEntitlementShims() + const getRoleEntitlementsAsync: Promise[] = [] + for (const roleId of channelInfo.roleIds) { + getRoleEntitlementsAsync.push(this.getRoleEntitlements(entitlementShims, roleId)) + } + // get all the role info + const allRoleEntitlements = await Promise.all(getRoleEntitlementsAsync) + return allRoleEntitlements.filter((r) => r !== null) as RoleEntitlements[] + } + + public async findEntitlementByType( + entitlementType: EntitlementModuleType, + ): Promise { + const entitlements = await this.getEntitlementShims() + for (const entitlement of entitlements) { + if (entitlement.moduleType === entitlementType) { + return entitlement + } + } + return null + } + + public parseError(error: unknown): Error { + // try each of the contracts to see who can give the best error message + let err = this.channel.parseError(error) + for (const contract of [ + this.entitlements, + this.multicall, + this.ownable, + this.pausable, + this.roles, + this.spaceOwner, + this.membership, + this.banning, + this.channel, + ]) { + err = contract.parseError(error) + if (err?.name !== UNKNOWN_ERROR) { + return err + } + } + return err + } + + public parseLog(log: ethers.providers.Log): ethers.utils.LogDescription { + const operations = [ + () => this.channel.parseLog(log), + () => this.pausable.parseLog(log), + () => this.entitlements.parseLog(log), + () => this.roles.parseLog(log), + () => this.membership.parseLog(log), + ] + + for (const operation of operations) { + try { + return operation() + } catch (error) { + // ignore, throw error if none match + } + } + throw new Error('Failed to parse log: ' + JSON.stringify(log)) + } + + private async getEntitlementByAddress(address: string): Promise { + if (!this.addressToEntitlement[address]) { + const entitlement = await this.entitlements.read.getEntitlement(address) + switch (entitlement.moduleType) { + case EntitlementModuleType.UserEntitlement: + this.addressToEntitlement[address] = new UserEntitlementShim( + address, + this.version, + this.provider, + ) + break + case EntitlementModuleType.RuleEntitlement: + this.addressToEntitlement[address] = new RuleEntitlementShim( + address, + this.version, + this.provider, + ) + break + default: + throw new Error( + `Unsupported entitlement module type: ${entitlement.moduleType}`, + ) + } + } + return this.addressToEntitlement[address] + } + + private async getRoleInfo(roleId: BigNumberish): Promise { + try { + return await this.roles.read.getRoleById(roleId) + } catch (e) { + // any error means the role doesn't exist + //console.error(e) + return null + } + } + + public async getEntitlementShims(): Promise { + // get all the entitlement addresses supported in the space + const entitlementInfo = await this.entitlements.read.getEntitlements() + const getEntitlementShims: Promise[] = [] + // with the addresses, get the entitlement shims + for (const info of entitlementInfo) { + getEntitlementShims.push(this.getEntitlementByAddress(info.moduleAddress)) + } + return Promise.all(getEntitlementShims) + } + + public async getEntitlementDetails( + entitlementShims: EntitlementShim[], + roleId: BigNumberish, + ): Promise { + let users: string[] = [] + let ruleData + // with the shims, get the role details for each entitlement + const entitlements = await Promise.all( + entitlementShims.map(async (entitlement) => { + if (isUserEntitlement(entitlement)) { + return await entitlement.getRoleEntitlement(roleId) + } else if (isRuleEntitlement(entitlement)) { + return await entitlement.getRoleEntitlement(roleId) + } + return undefined + }), + ) + + function isRuleDataStruct( + ruleData: IRuleEntitlement.RuleDataStruct | undefined, + ): ruleData is IRuleEntitlement.RuleDataStruct { + return ruleData !== undefined + } + + for (const entitlment of entitlements) { + if (entitlment) { + if (isStringArray(entitlment)) { + users = users.concat(entitlment) + } else if (isRuleDataStruct(entitlment)) { + ruleData = entitlment + } + } + } + + return { users, ruleData: ruleData ?? NoopRuleData } + } + + private async getChannelsWithRole(roleId: BigNumberish): Promise { + const channelMetadatas = new Map() + // get all the channels from the space + const allChannels = await this.channel.read.getChannels() + // for each channel, check with each entitlement if the role is in the channel + // add the channel to the list if it is not already added + for (const c of allChannels) { + if (!channelMetadatas.has(c.id) && isRoleIdInArray(c.roleIds, roleId)) { + const metadata = this.parseChannelMetadataJSON(c.metadata) + channelMetadatas.set(c.id, { + channelNetworkId: c.id.replace('0x', ''), + name: metadata.name, + description: metadata.description, + disabled: c.disabled, + }) + } + } + return Array.from(channelMetadatas.values()) + } + + private async getRolesInfo(roleIds: BigNumber[]): Promise { + // use a Set to ensure that we only get roles once + const roles = new Set() + const getRoleStructsAsync: Promise[] = [] + for (const roleId of roleIds) { + // get the role info if we don't already have it + if (!roles.has(roleId.toString())) { + getRoleStructsAsync.push(this.roles.read.getRoleById(roleId)) + } + } + // get all the role info + return Promise.all(getRoleStructsAsync) + } + + public async getRoleEntitlements( + entitlementShims: EntitlementShim[], + roleId: BigNumberish, + ): Promise { + const [roleInfo, entitlementDetails] = await Promise.all([ + this.getRoleInfo(roleId), + this.getEntitlementDetails(entitlementShims, roleId), + ]) + // assemble the result + if (roleInfo === null) { + return null + } + return { + roleId: roleInfo.id.toNumber(), + name: roleInfo.name, + permissions: toPermissions(roleInfo.permissions), + users: entitlementDetails.users, + ruleData: entitlementDetails.ruleData, + } + } +} diff --git a/core/web3/src/v3/SpaceDapp.ts b/core/web3/src/v3/SpaceDapp.ts new file mode 100644 index 000000000..b56345f9d --- /dev/null +++ b/core/web3/src/v3/SpaceDapp.ts @@ -0,0 +1,1045 @@ +import { + BasicRoleInfo, + ChannelDetails, + ChannelMetadata, + EntitlementModuleType, + Permission, + PricingModuleStruct, + RoleDetails, +} from '../ContractTypes' +import { BytesLike, ContractReceipt, ContractTransaction, ethers } from 'ethers' +import { + CreateSpaceParams, + ISpaceDapp, + TransactionOpts, + UpdateChannelParams, + UpdateRoleParams, +} from '../ISpaceDapp' +import { createRuleEntitlementStruct, createUserEntitlementStruct } from '../ConvertersEntitlements' + +import { IRolesBase } from './IRolesShim' +import { Space } from './Space' +import { SpaceRegistrar } from './SpaceRegistrar' +import { createEntitlementStruct } from '../ConvertersRoles' +import { BaseChainConfig } from '../IStaticContractsInfo' +import { WalletLink } from './WalletLink' +import { SpaceInfo } from '../types' +import { IRuleEntitlement, UserEntitlementShim } from './index' +import { PricingModules } from './PricingModules' +import { IPrepayShim } from './IPrepayShim' +import { dlogger, isJest } from '@river-build/dlog' +import { EVERYONE_ADDRESS } from '../Utils' +import { evaluateOperationsForEntitledWallet, ruleDataToOperations } from '../entitlement' +import { RuleEntitlementShim } from './RuleEntitlementShim' + +const logger = dlogger('csb:SpaceDapp:debug') + +export class SpaceDapp implements ISpaceDapp { + public readonly config: BaseChainConfig + public readonly provider: ethers.providers.Provider + public readonly spaceRegistrar: SpaceRegistrar + public readonly pricingModules: PricingModules + public readonly walletLink: WalletLink + public readonly prepay: IPrepayShim + + constructor(config: BaseChainConfig, provider: ethers.providers.Provider) { + this.config = config + this.provider = provider + this.spaceRegistrar = new SpaceRegistrar(config, provider) + this.walletLink = new WalletLink(config, provider) + this.pricingModules = new PricingModules(config, provider) + this.prepay = new IPrepayShim( + config.addresses.spaceFactory, + config.contractVersion, + provider, + ) + } + + public async addRoleToChannel( + spaceId: string, + channelNetworkId: string, + roleId: number, + signer: ethers.Signer, + txnOpts?: TransactionOpts, + ): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + return wrapTransaction( + () => space.Channels.write(signer).addRoleToChannel(channelNetworkId, roleId), + txnOpts, + ) + } + + public async banWalletAddress( + spaceId: string, + walletAddress: string, + signer: ethers.Signer, + txnOpts?: TransactionOpts, + ) { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + const token = await space.ERC721AQueryable.read + .tokensOfOwner(walletAddress) + .then((tokens) => tokens[0]) + return wrapTransaction(() => space.Banning.write(signer).ban(token), txnOpts) + } + + public async unbanWalletAddress( + spaceId: string, + walletAddress: string, + signer: ethers.Signer, + txnOpts?: TransactionOpts, + ): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + const token = await space.ERC721AQueryable.read + .tokensOfOwner(walletAddress) + .then((tokens) => tokens[0]) + return wrapTransaction(() => space.Banning.write(signer).unban(token), txnOpts) + } + + public async walletAddressIsBanned(spaceId: string, walletAddress: string): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + + const token = await space.ERC721AQueryable.read + .tokensOfOwner(walletAddress) + .then((tokens) => tokens[0]) + return await space.Banning.read.isBanned(token) + } + + public async bannedWalletAddresses(spaceId: string): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + const bannedTokenIds = await space.Banning.read.banned() + const bannedWalletAddresses = await Promise.all( + bannedTokenIds.map(async (tokenId) => await space.Membership.read.ownerOf(tokenId)), + ) + return bannedWalletAddresses + } + + public async createSpace( + params: CreateSpaceParams, + signer: ethers.Signer, + txnOpts?: TransactionOpts, + ): Promise { + const spaceInfo = { + name: params.spaceName, + uri: params.spaceMetadata, + membership: params.membership as any, + channel: { + metadata: params.channelName || '', + }, + } + return wrapTransaction( + () => this.spaceRegistrar.SpaceArchitect.write(signer).createSpace(spaceInfo), + txnOpts, + ) + } + + public async createChannel( + spaceId: string, + channelName: string, + channelNetworkId: string, + roleIds: number[], + signer: ethers.Signer, + txnOpts?: TransactionOpts, + ): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + const channelId = channelNetworkId.startsWith('0x') + ? channelNetworkId + : `0x${channelNetworkId}` + return wrapTransaction( + () => space.Channels.write(signer).createChannel(channelId, channelName, roleIds), + txnOpts, + ) + } + + public async createRole( + spaceId: string, + roleName: string, + permissions: Permission[], + users: string[], + ruleData: IRuleEntitlement.RuleDataStruct, + signer: ethers.Signer, + txnOpts?: TransactionOpts, + ): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + const entitlements = await createEntitlementStruct(space, users, ruleData) + return wrapTransaction( + () => space.Roles.write(signer).createRole(roleName, permissions, entitlements), + txnOpts, + ) + } + + public async deleteRole( + spaceId: string, + roleId: number, + signer: ethers.Signer, + txnOpts?: TransactionOpts, + ): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + return wrapTransaction(() => space.Roles.write(signer).removeRole(roleId), txnOpts) + } + + public async getChannels(spaceId: string): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + return space.getChannels() + } + + public async getChannelDetails( + spaceId: string, + channelNetworkId: string, + ): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + const channelId = channelNetworkId.startsWith('0x') + ? channelNetworkId + : `0x${channelNetworkId}` + return space.getChannel(channelId) + } + + public async getPermissionsByRoleId(spaceId: string, roleId: number): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + return space.getPermissionsByRoleId(roleId) + } + + public async getRole(spaceId: string, roleId: number): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + return space.getRole(roleId) + } + + public async getRoles(spaceId: string): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + const roles: IRolesBase.RoleStructOutput[] = await space.Roles.read.getRoles() + return roles.map((role) => ({ + roleId: role.id.toNumber(), + name: role.name, + })) + } + + public async getSpaceInfo(spaceId: string): Promise { + const space = this.getSpace(spaceId) + if (!space) { + return undefined + } + const [owner, disabled, spaceInfo] = await Promise.all([ + space.Ownable.read.owner(), + space.Pausable.read.paused(), + space.getSpaceInfo(), + ]) + return { + address: space.Address, + networkId: space.SpaceId, + name: (spaceInfo.name as string) ?? '', + owner, + disabled, + } + } + + public async updateSpaceName( + spaceId: string, + name: string, + signer: ethers.Signer, + txnOpts?: TransactionOpts, + ): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + const spaceInfo = await space.getSpaceInfo() + // update the space name + return wrapTransaction( + () => + space.SpaceOwner.write(signer).updateSpaceInfo(space.Address, name, spaceInfo.uri), + txnOpts, + ) + } + + private async getEntitlementsForPermission(spaceId: string, permission: Permission) { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + + const entitlementData = await space.Entitlements.read.getEntitlementDataByPermission( + permission, + ) + + type EntitlementData = { + entitlementType: EntitlementModuleType + ruleEntitlement: IRuleEntitlement.RuleDataStruct[] | undefined + userEntitlement: string[] | undefined + } + + const entitlements: EntitlementData[] = entitlementData.map((x) => ({ + entitlementType: x.entitlementType as EntitlementModuleType, + ruleEntitlement: undefined, + userEntitlement: undefined, + })) + + const [userEntitlementShim, ruleEntitlementShim] = (await Promise.all([ + space.findEntitlementByType(EntitlementModuleType.UserEntitlement), + space.findEntitlementByType(EntitlementModuleType.RuleEntitlement), + ])) as [UserEntitlementShim | null, RuleEntitlementShim | null] + + for (let i = 0; i < entitlementData.length; i++) { + const entitlement = entitlementData[i] + if ( + (entitlement.entitlementType as EntitlementModuleType) === + EntitlementModuleType.RuleEntitlement + ) { + entitlements[i].entitlementType = EntitlementModuleType.RuleEntitlement + const decodedData = ruleEntitlementShim?.decodeGetRuleData( + entitlement.entitlementData, + ) + if (decodedData) { + entitlements[i].ruleEntitlement = decodedData + } + } else if ( + (entitlement.entitlementType as EntitlementModuleType) === + EntitlementModuleType.UserEntitlement + ) { + entitlements[i].entitlementType = EntitlementModuleType.UserEntitlement + const decodedData = userEntitlementShim?.decodeGetAddresses( + entitlement.entitlementData, + ) + if (decodedData) { + entitlements[i].userEntitlement = decodedData + } + } else { + throw new Error('Unknown entitlement type') + } + } + + return entitlements + } + + /** + * Checks if user has a wallet entitled to join a space based on the minter role rule entitlements + */ + public async getEntitledWalletForJoiningSpace( + spaceId: string, + rootKey: string, + supportedXChainRpcUrls: string[], + ): Promise { + const linkedWallets = await this.walletLink.getLinkedWallets(rootKey) + const allWallets = [rootKey, ...linkedWallets] + + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + + const entitlements = await this.getEntitlementsForPermission(spaceId, Permission.JoinSpace) + + const isEveryOneSpace = entitlements.some((e) => + e.userEntitlement?.includes(EVERYONE_ADDRESS), + ) + + // todo: more user checks + if (isEveryOneSpace) { + return rootKey + } + + const providers = supportedXChainRpcUrls.map( + (url) => new ethers.providers.StaticJsonRpcProvider(url), + ) + await Promise.all(providers.map((p) => p.ready)) + + const ruleEntitlements = entitlements + .filter((x) => x.entitlementType === EntitlementModuleType.RuleEntitlement) + .map((x) => x.ruleEntitlement) + + const entitledWalletsForAllRuleEntitlements = await Promise.all( + ruleEntitlements.map(async (ruleData) => { + if (!ruleData) { + throw new Error('Rule data not found') + } + const operations = ruleDataToOperations(ruleData) + + return evaluateOperationsForEntitledWallet(operations, allWallets, providers) + }), + ) + + // if every check has an entitled wallet, return the first one + if ( + entitledWalletsForAllRuleEntitlements.every((w) => w !== ethers.constants.AddressZero) + ) { + return entitledWalletsForAllRuleEntitlements[0] + } + return + } + + public async isEntitledToSpace( + spaceId: string, + user: string, + permission: Permission, + ): Promise { + const space = this.getSpace(spaceId) + if (!space) { + return false + } + if (permission === Permission.JoinSpace) { + throw new Error('use getEntitledWalletForJoiningSpace instead of isEntitledToSpace') + } + + return space.Entitlements.read.isEntitledToSpace(user, permission) + } + + public async isEntitledToChannel( + spaceId: string, + channelNetworkId: string, + user: string, + permission: Permission, + ): Promise { + const space = this.getSpace(spaceId) + if (!space) { + return false + } + const channelId = channelNetworkId.startsWith('0x') + ? channelNetworkId + : `0x${channelNetworkId}` + + return space.Entitlements.read.isEntitledToChannel(channelId, user, permission) + } + + public parseSpaceFactoryError(error: unknown): Error { + if (!this.spaceRegistrar.SpaceArchitect) { + throw new Error('SpaceArchitect is not deployed properly.') + } + const decodedErr = this.spaceRegistrar.SpaceArchitect.parseError(error) + logger.error(decodedErr) + return decodedErr + } + + public async parseSpaceError(spaceId: string, error: unknown): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + const decodedErr = space.parseError(error) + logger.error(decodedErr) + return decodedErr + } + + public parsePrepayError(error: unknown): Error { + if (!this.prepay) { + throw new Error('Prepay is not deployed properly.') + } + const decodedErr = this.prepay.parseError(error) + logger.error(decodedErr) + return decodedErr + } + + public async parseSpaceLogs( + spaceId: string, + logs: ethers.providers.Log[], + ): Promise<(ethers.utils.LogDescription | undefined)[]> { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + return logs.map((spaceLog) => { + try { + return space.parseLog(spaceLog) + } catch (err) { + logger.error(err) + return + } + }) + } + + public async updateChannel( + params: UpdateChannelParams, + signer: ethers.Signer, + txnOpts?: TransactionOpts, + ): Promise { + const space = this.getSpace(params.spaceId) + if (!space) { + throw new Error(`Space with spaceId "${params.spaceId}" is not found.`) + } + const encodedCallData = await this.encodedUpdateChannelData(space, params) + return wrapTransaction( + () => space.Multicall.write(signer).multicall(encodedCallData), + txnOpts, + ) + } + + public async encodedUpdateChannelData(space: Space, params: UpdateChannelParams) { + // data for the multicall + const encodedCallData: BytesLike[] = [] + // update the channel metadata + encodedCallData.push( + space.Channels.interface.encodeFunctionData('updateChannel', [ + params.channelId.startsWith('0x') ? params.channelId : `0x${params.channelId}`, + params.channelName, + params.disabled ?? false, // default to false + ]), + ) + // update any channel role changes + const encodedUpdateChannelRoles = await this.encodeUpdateChannelRoles( + space, + params.channelId, + params.roleIds, + ) + for (const callData of encodedUpdateChannelRoles) { + encodedCallData.push(callData) + } + return encodedCallData + } + + public async updateRole( + params: UpdateRoleParams, + signer: ethers.Signer, + txnOpts?: TransactionOpts, + ): Promise { + const space = this.getSpace(params.spaceNetworkId) + if (!space) { + throw new Error(`Space with spaceId "${params.spaceNetworkId}" is not found.`) + } + const updatedEntitlemets = await this.createUpdatedEntitlements(space, params) + return wrapTransaction( + () => + space.Roles.write(signer).updateRole( + params.roleId, + params.roleName, + params.permissions, + updatedEntitlemets, + ), + txnOpts, + ) + } + + public async setSpaceAccess( + spaceId: string, + disabled: boolean, + signer: ethers.Signer, + txnOpts?: TransactionOpts, + ): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + + if (disabled) { + return wrapTransaction(() => space.Pausable.write(signer).pause(), txnOpts) + } else { + return wrapTransaction(() => space.Pausable.write(signer).unpause(), txnOpts) + } + } + + /** + * + * @param spaceId + * @param priceInWei + * @param signer + */ + public async setMembershipPrice( + spaceId: string, + priceInWei: ethers.BigNumberish, + signer: ethers.Signer, + txnOpts?: TransactionOpts, + ): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + return wrapTransaction( + () => space.Membership.write(signer).setMembershipPrice(priceInWei), + txnOpts, + ) + } + + public async setMembershipPricingModule( + spaceId: string, + pricingModule: string, + signer: ethers.Signer, + txnOpts?: TransactionOpts, + ): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + return wrapTransaction( + () => space.Membership.write(signer).setMembershipPricingModule(pricingModule), + txnOpts, + ) + } + + public async setMembershipLimit( + spaceId: string, + limit: number, + signer: ethers.Signer, + txnOpts?: TransactionOpts, + ): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + return wrapTransaction( + () => space.Membership.write(signer).setMembershipLimit(limit), + txnOpts, + ) + } + + public async setMembershipFreeAllocation( + spaceId: string, + freeAllocation: number, + signer: ethers.Signer, + txnOpts?: TransactionOpts, + ) { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + return wrapTransaction( + () => space.Membership.write(signer).setMembershipFreeAllocation(freeAllocation), + txnOpts, + ) + } + + public async prepayMembership( + spaceId: string, + supply: number, + signer: ethers.Signer, + txnOpts?: TransactionOpts, + ): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + const membershipAddress = space.Membership.address + return wrapTransaction( + () => this.prepay.write(signer).prepayMembership(membershipAddress, supply), + txnOpts, + ) + } + + public async getPrepaidMembershipSupply(spaceId: string) { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + const membershipAddress = space.Membership.address + return this.prepay.read.prepaidMembershipSupply(membershipAddress) + } + + public async setChannelAccess( + spaceId: string, + channelNetworkId: string, + disabled: boolean, + signer: ethers.Signer, + txnOpts?: TransactionOpts, + ): Promise { + const channelId = channelNetworkId.startsWith('0x') + ? channelNetworkId + : `0x${channelNetworkId}` + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + return wrapTransaction( + () => space.Channels.write(signer).updateChannel(channelId, '', disabled), + txnOpts, + ) + } + + public async getSpaceMembershipTokenAddress(spaceId: string): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + return space.Membership.address + } + + public async joinSpace( + spaceId: string, + recipient: string, + signer: ethers.Signer, + txnOpts?: TransactionOpts, + ): Promise<{ issued: true; tokenId: string } | { issued: false; tokenId: undefined }> { + const joinSpaceStart = Date.now() + + logger.log('joinSpace result before wrap', spaceId) + + const getSpaceStart = Date.now() + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + + const issuedListener = space.Membership.listenForMembershipToken(recipient) + + const blockNumber = await space.provider?.getBlockNumber() + + logger.log('joinSpace before blockNumber', Date.now() - getSpaceStart, blockNumber) + const getPriceStart = Date.now() + const price = await space.Membership.read.getMembershipPrice() + logger.log('joinSpace getMembershipPrice', Date.now() - getPriceStart) + const wrapStart = Date.now() + const result = await wrapTransaction(async () => { + // Set gas limit instead of using estimateGas + // As the estimateGas is not reliable for this contract + return await space.Membership.write(signer).joinSpace(recipient, { + gasLimit: 1_500_000, + value: price, + }) + }, txnOpts) + + const blockNumberAfterTx = await space.provider?.getBlockNumber() + + logger.log('joinSpace wrap', Date.now() - wrapStart, blockNumberAfterTx) + + const issued = await issuedListener + const blockNumberAfter = await space.provider?.getBlockNumber() + + logger.log( + 'joinSpace after blockNumber', + Date.now() - joinSpaceStart, + blockNumberAfter, + result, + issued, + ) + return issued + } + + public async hasSpaceMembership(spaceId: string, address: string): Promise { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + return space.Membership.hasMembership(address) + } + + public async getMembershipSupply(spaceId: string) { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + const totalSupply = await space.Membership.read.totalSupply() + + return { totalSupply: totalSupply.toNumber() } + } + + public async getMembershipInfo(spaceId: string) { + const space = this.getSpace(spaceId) + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + const [price, limit, currency, feeRecipient, duration, totalSupply, pricingModule] = + await Promise.all([ + space.Membership.read.getMembershipPrice(), + space.Membership.read.getMembershipLimit(), + space.Membership.read.getMembershipCurrency(), + space.Ownable.read.owner(), + space.Membership.read.getMembershipDuration(), + space.Membership.read.totalSupply(), + space.Membership.read.getMembershipPricingModule(), + ]) + + return { + price: price, // keep as BigNumber (wei) + maxSupply: limit.toNumber(), + currency: currency, + feeRecipient: feeRecipient, + duration: duration.toNumber(), + totalSupply: totalSupply.toNumber(), + pricingModule: pricingModule, + } + } + + public getWalletLink(): WalletLink { + return this.walletLink + } + + public getSpace(spaceId: string): Space | undefined { + return this.spaceRegistrar.getSpace(spaceId) + } + + public listPricingModules(): Promise { + return this.pricingModules.listPricingModules() + } + + private async encodeUpdateChannelRoles( + space: Space, + channelNetworkId: string, + _updatedRoleIds: number[], + ): Promise { + const channelId = channelNetworkId.startsWith('0x') + ? channelNetworkId + : `0x${channelNetworkId}` + const encodedCallData: BytesLike[] = [] + const [channelInfo] = await Promise.all([ + space.Channels.read.getChannel(channelId), + space.getEntitlementShims(), + ]) + const currentRoleIds = new Set(channelInfo.roleIds.map((r) => r.toNumber())) + const updatedRoleIds = new Set(_updatedRoleIds) + const rolesToRemove: number[] = [] + const rolesToAdd: number[] = [] + for (const r of updatedRoleIds) { + // if the current role IDs does not have the updated role ID, then that role should be added. + if (!currentRoleIds.has(r)) { + rolesToAdd.push(r) + } + } + for (const r of currentRoleIds) { + // if the updated role IDs no longer have the current role ID, then that role should be removed. + if (!updatedRoleIds.has(r)) { + rolesToRemove.push(r) + } + } + // encode the call data for each role to remove + const encodedRemoveRoles = this.encodeRemoveRolesFromChannel( + space, + channelId, + rolesToRemove, + ) + for (const callData of encodedRemoveRoles) { + encodedCallData.push(callData) + } + // encode the call data for each role to add + const encodedAddRoles = this.encodeAddRolesToChannel(space, channelId, rolesToAdd) + for (const callData of encodedAddRoles) { + encodedCallData.push(callData) + } + return encodedCallData + } + + private encodeAddRolesToChannel( + space: Space, + channelNetworkId: string, + roleIds: number[], + ): BytesLike[] { + const channelId = channelNetworkId.startsWith('0x') + ? channelNetworkId + : `0x${channelNetworkId}` + const encodedCallData: BytesLike[] = [] + for (const roleId of roleIds) { + const encodedBytes = space.Channels.interface.encodeFunctionData('addRoleToChannel', [ + channelId, + roleId, + ]) + encodedCallData.push(encodedBytes) + } + return encodedCallData + } + + private encodeRemoveRolesFromChannel( + space: Space, + channelNetworkId: string, + roleIds: number[], + ): BytesLike[] { + const channelId = channelNetworkId.startsWith('0x') + ? channelNetworkId + : `0x${channelNetworkId}` + const encodedCallData: BytesLike[] = [] + for (const roleId of roleIds) { + const encodedBytes = space.Channels.interface.encodeFunctionData( + 'removeRoleFromChannel', + [channelId, roleId], + ) + encodedCallData.push(encodedBytes) + } + return encodedCallData + } + + public async createUpdatedEntitlements( + space: Space, + params: UpdateRoleParams, + ): Promise { + const updatedEntitlements: IRolesBase.CreateEntitlementStruct[] = [] + const [userEntitlement, ruleEntitlement] = await Promise.all([ + space.findEntitlementByType(EntitlementModuleType.UserEntitlement), + space.findEntitlementByType(EntitlementModuleType.RuleEntitlement), + ]) + if (params.users.length > 0 && userEntitlement?.address) { + const entitlementData = createUserEntitlementStruct( + userEntitlement.address, + params.users, + ) + updatedEntitlements.push(entitlementData) + } + if (params.ruleData && ruleEntitlement?.address) { + const entitlementData = createRuleEntitlementStruct( + ruleEntitlement.address as `0x${string}`, + params.ruleData, + ) + updatedEntitlements.push(entitlementData) + } + return updatedEntitlements + } + + public getSpaceAddress(receipt: ContractReceipt): string | undefined { + const eventName = 'SpaceCreated' + if (receipt.status !== 1) { + return undefined + } + for (const receiptLog of receipt.logs) { + try { + // Parse the log with the contract interface + const parsedLog = this.spaceRegistrar.SpaceArchitect.interface.parseLog(receiptLog) + if (parsedLog.name === eventName) { + // If the log matches the event we're looking for, do something with it + // parsedLog.args contains the event arguments as an object + logger.log(`Event ${eventName} found: `, parsedLog.args) + return parsedLog.args.space as string + } + } catch (error) { + // This log wasn't from the contract we're interested in + } + } + return undefined + } + + public listenForMembershipEvent( + spaceId: string, + receiver: string, + abortController?: AbortController, + ): Promise< + | { issued: true; tokenId: string; error?: Error | undefined } + | { issued: false; tokenId: undefined; error?: Error | undefined } + > { + const space = this.getSpace(spaceId) + + if (!space) { + throw new Error(`Space with spaceId "${spaceId}" is not found.`) + } + + return space.Membership.listenForMembershipToken(receiver, abortController) + } +} + +// Retry submitting the transaction N times (3 by default in jest, 0 by default elsewhere) +// and then wait until the first confirmation of the transaction has been mined +// works around gas estimation issues and other transient issues that are more common in running CI tests +// so by default we only retry when running under jest +// this wrapper unifies all of the wrapped contract calls in behvior, they don't return until +// the transaction is confirmed +async function wrapTransaction( + txFn: () => Promise, + txnOpts?: TransactionOpts, +): Promise { + const retryLimit = txnOpts?.retryCount ?? isJest() ? 3 : 0 + + const runTx = async () => { + let retryCount = 0 + // eslint-disable-next-line no-constant-condition + while (true) { + try { + const txStart = Date.now() + const tx = await txFn() + logger.log('Transaction submitted in', Date.now() - txStart) + const startConfirm = Date.now() + await confirmTransaction(tx) + logger.log('Transaction confirmed in', Date.now() - startConfirm) + // return the transaction, as it was successful + // the caller can wait() on it again if they want to wait for more confirmations + return tx + } catch (error) { + retryCount++ + if (retryCount >= retryLimit) { + throw new Error('Transaction failed after retries: ' + (error as Error).message) + } + logger.error('Transaction submission failed, retrying...', { error, retryCount }) + await new Promise((resolve) => setTimeout(resolve, 1000)) + } + } + } + + // Wait until the first confirmation of the transaction + const confirmTransaction = async (tx: ContractTransaction) => { + let waitRetryCount = 0 + let errorCount = 0 + const start = Date.now() + // eslint-disable-next-line no-constant-condition + while (true) { + let receipt: ContractReceipt | null = null + try { + receipt = await tx.wait(0) + } catch (error) { + if ( + typeof error === 'object' && + error !== null && + 'code' in error && + (error as { code: unknown }).code === 'CALL_EXCEPTION' + ) { + logger.error('Transaction failed', { tx, errorCount, error }) + throw new Error('Transaction confirmed but failed') + } + + // If the transaction receipt is not available yet, the error may be thrown + // We can ignore it and retry after a short delay + errorCount++ + receipt = null + } + if (!receipt) { + // Transaction not minded yet, try again in 100ms + waitRetryCount++ + await new Promise((resolve) => setTimeout(resolve, 100)) + } else if (receipt.status === 1) { + return + } else { + logger.error('Transaction failed in an unexpected way', { + tx, + receipt, + errorCount, + }) + // Transaction failed, throw an error and the outer loop will retry + throw new Error('Transaction confirmed but failed') + } + const waitRetryTime = Date.now() - start + // If we've been waiting for more than 20 seconds, log an error + // and outer loop will resubmit the transaction + if (waitRetryTime > 20_000) { + logger.error('Transaction confirmation timed out', { + waitRetryTime, + waitRetryCount, + tx, + errorCount, + }) + throw new Error( + 'Transaction confirmation timed out after: ' + + waitRetryTime + + ' waitRetryCount: ' + + waitRetryCount, + ) + } + } + } + return await runTx() +} diff --git a/core/web3/src/v3/SpaceRegistrar.ts b/core/web3/src/v3/SpaceRegistrar.ts new file mode 100644 index 000000000..21e8a2b9e --- /dev/null +++ b/core/web3/src/v3/SpaceRegistrar.ts @@ -0,0 +1,54 @@ +import { SpaceAddressFromSpaceId } from '../Utils' +import { BaseChainConfig } from '../IStaticContractsInfo' +import { ISpaceArchitectShim } from './ISpaceArchitectShim' +import { Space } from './Space' +import { ethers } from 'ethers' + +interface SpaceMap { + [spaceId: string]: Space +} + +/** + * A class to manage the creation of space stubs + * converts a space network id to space address and + * creates a space object with relevant addresses and data + */ +export class SpaceRegistrar { + public readonly config: BaseChainConfig + private readonly provider: ethers.providers.Provider | undefined + private readonly spaceArchitect: ISpaceArchitectShim + private readonly spaceOwnerAddress: string + private readonly spaces: SpaceMap = {} + + constructor(config: BaseChainConfig, provider: ethers.providers.Provider | undefined) { + this.config = config + this.provider = provider + this.spaceOwnerAddress = this.config.addresses.spaceOwner + this.spaceArchitect = new ISpaceArchitectShim( + config.addresses.spaceFactory, + config.contractVersion, + provider, + ) + } + + public get SpaceArchitect(): ISpaceArchitectShim { + return this.spaceArchitect + } + + public getSpace(spaceId: string): Space | undefined { + if (this.spaces[spaceId] === undefined) { + const spaceAddress = SpaceAddressFromSpaceId(spaceId) + if (!spaceAddress || spaceAddress === ethers.constants.AddressZero) { + return undefined // space is not found + } + this.spaces[spaceId] = new Space({ + address: spaceAddress, + spaceId: spaceId, + spaceOwnerAddress: this.spaceOwnerAddress, + version: this.config.contractVersion, + provider: this.provider, + }) + } + return this.spaces[spaceId] + } +} diff --git a/core/web3/src/v3/TokenPausableFacetShim.ts b/core/web3/src/v3/TokenPausableFacetShim.ts new file mode 100644 index 000000000..7f3e89071 --- /dev/null +++ b/core/web3/src/v3/TokenPausableFacetShim.ts @@ -0,0 +1,33 @@ +import { + TokenPausableFacet as LocalhostContract, + TokenPausableFacetInterface as LocalhostInterface, +} from '@river-build/generated/dev/typings/TokenPausableFacet' +import { + TokenPausableFacet as BaseSepoliaContract, + TokenPausableFacetInterface as BaseSepoliaInterface, +} from '@river-build/generated/v3/typings/TokenPausableFacet' + +import LocalhostAbi from '@river-build/generated/dev/abis/TokenPausableFacet.abi.json' assert { type: 'json' } +import BaseSepoliaAbi from '@river-build/generated/v3/abis/TokenPausableFacet.abi.json' assert { type: 'json' } + +import { ethers } from 'ethers' +import { BaseContractShim } from './BaseContractShim' +import { ContractVersion } from '../IStaticContractsInfo' + +export class TokenPausableFacetShim extends BaseContractShim< + LocalhostContract, + LocalhostInterface, + BaseSepoliaContract, + BaseSepoliaInterface +> { + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + ) { + super(address, version, provider, { + [ContractVersion.dev]: LocalhostAbi, + [ContractVersion.v3]: BaseSepoliaAbi, + }) + } +} diff --git a/core/web3/src/v3/UserEntitlementShim.ts b/core/web3/src/v3/UserEntitlementShim.ts new file mode 100644 index 000000000..4363c9524 --- /dev/null +++ b/core/web3/src/v3/UserEntitlementShim.ts @@ -0,0 +1,75 @@ +import { + UserEntitlement as LocalhostContract, + UserEntitlementInterface as LocalhostInterface, +} from '@river-build/generated/dev/typings/UserEntitlement' +import { + UserEntitlement as BaseSepoliaContract, + UserEntitlementInterface as BaseSepoliaInterface, +} from '@river-build/generated/v3/typings/UserEntitlement' + +import LocalhostAbi from '@river-build/generated/dev/abis/UserEntitlement.abi.json' assert { type: 'json' } +import BaseSepoliaAbi from '@river-build/generated/v3/abis/UserEntitlement.abi.json' assert { type: 'json' } + +import { BaseContractShim } from './BaseContractShim' +import { BigNumberish, ethers } from 'ethers' +import { decodeUsers } from '../ConvertersEntitlements' +import { EntitlementModuleType, EntitlementModule } from '../ContractTypes' +import { dlogger } from '@river-build/dlog' +import { ContractVersion } from '../IStaticContractsInfo' + +const logger = dlogger('csb:UserEntitlementShim:debug') + +export class UserEntitlementShim + extends BaseContractShim< + LocalhostContract, + LocalhostInterface, + BaseSepoliaContract, + BaseSepoliaInterface + > + implements EntitlementModule +{ + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + ) { + super(address, version, provider, { + [ContractVersion.dev]: LocalhostAbi, + [ContractVersion.v3]: BaseSepoliaAbi, + }) + } + + public get moduleType(): EntitlementModuleType { + return EntitlementModuleType.UserEntitlement + } + + public async getRoleEntitlement(roleId: BigNumberish): Promise { + try { + const users = await this.read.getEntitlementDataByRoleId(roleId) + if (typeof users === 'string') { + return decodeUsers(users) + } else { + return [] + } + } catch (e) { + logger.error('Error getting role entitlement:', e) + throw e + } + } + + public decodeGetAddresses(entitlementData: string): string[] | undefined { + // where does this come from? + const abiDef = `[{"name":"getAddresses","outputs":[{"type":"address[]","name":"out"}],"constant":true,"payable":false,"type":"function"}]` + const abi = new ethers.utils.Interface(abiDef) + try { + const decoded = abi.decodeFunctionResult( + 'getAddresses', + entitlementData, + ) as unknown as { out: string[] } + return decoded.out + } catch (error) { + logger.error('RuleEntitlementShim Error decoding RuleDataStruct', error) + } + return + } +} diff --git a/core/web3/src/v3/WalletLink.ts b/core/web3/src/v3/WalletLink.ts new file mode 100644 index 000000000..84c4e3554 --- /dev/null +++ b/core/web3/src/v3/WalletLink.ts @@ -0,0 +1,254 @@ +import { BigNumber, ContractTransaction, ethers } from 'ethers' +import { IWalletLinkShim } from './WalletLinkShim' +import { BaseChainConfig } from '../IStaticContractsInfo' +import { arrayify } from 'ethers/lib/utils' +import { WalletAlreadyLinkedError, WalletNotLinkedError } from '../error-types' +import { Address } from '../ContractTypes' + +export class WalletLink { + private readonly walletLinkShim: IWalletLinkShim + public address: Address + + constructor(config: BaseChainConfig, provider: ethers.providers.Provider | undefined) { + this.walletLinkShim = new IWalletLinkShim( + config.addresses.spaceFactory, + config.contractVersion, + provider, + ) + this.address = config.addresses.spaceFactory + } + + private async assertNotAlreadyLinked(rootKey: ethers.Signer, wallet: ethers.Signer | Address) { + const rootKeyAddress = await rootKey.getAddress() + const walletAddress = typeof wallet === 'string' ? wallet : await wallet.getAddress() + const isLinkedAlready = await this.walletLinkShim.read.checkIfLinked( + rootKeyAddress, + walletAddress, + ) + + if (isLinkedAlready) { + throw new WalletAlreadyLinkedError() + } + + return { rootKeyAddress, walletAddress } + } + + private async assertAlreadyLinked(rootKey: ethers.Signer, walletAddress: string) { + const rootKeyAddress = await rootKey.getAddress() + const isLinkedAlready = await this.walletLinkShim.read.checkIfLinked( + rootKeyAddress, + walletAddress, + ) + if (!isLinkedAlready) { + throw new WalletNotLinkedError() + } + return { rootKeyAddress, walletAddress } + } + + private generateRootKeySignatureForWallet({ + rootKey, + walletAddress, + rootKeyNonce, + }: { + rootKey: ethers.Signer + walletAddress: string + rootKeyNonce: BigNumber + }) { + return rootKey.signMessage(packAddressWithNonce(walletAddress, rootKeyNonce)) + } + + private generateWalletSignatureForRootKey({ + wallet, + rootKeyAddress, + rootKeyNonce, + }: { + wallet: ethers.Signer + rootKeyAddress: string + rootKeyNonce: BigNumber + }) { + return wallet.signMessage(packAddressWithNonce(rootKeyAddress, rootKeyNonce)) + } + + private async generateLinkCallerData(rootKey: ethers.Signer, wallet: ethers.Signer | Address) { + const { rootKeyAddress, walletAddress } = await this.assertNotAlreadyLinked(rootKey, wallet) + + const nonce = await this.walletLinkShim.read.getLatestNonceForRootKey(rootKeyAddress) + const rootKeySignature = await rootKey.signMessage( + packAddressWithNonce(walletAddress, nonce), + ) + + const rootKeyData = { + addr: rootKeyAddress, + signature: rootKeySignature, + } + + return { rootKeyData, nonce } + } + + private async generateLinkWalletData(rootKey: ethers.Signer, wallet: ethers.Signer) { + const { rootKeyAddress, walletAddress } = await this.assertNotAlreadyLinked(rootKey, wallet) + + const nonce = await this.walletLinkShim.read.getLatestNonceForRootKey(rootKeyAddress) + + // sign root key with new wallet address + const rootKeySignature = await this.generateRootKeySignatureForWallet({ + rootKey, + walletAddress, + rootKeyNonce: nonce, + }) + + // sign new wallet with root key address + const walletSignature = await this.generateWalletSignatureForRootKey({ + wallet, + rootKeyAddress, + rootKeyNonce: nonce, + }) + + const rootKeyData = { + addr: rootKeyAddress, + signature: rootKeySignature, + } + + const walletData = { + addr: walletAddress, + signature: walletSignature, + } + + return { rootKeyData, walletData, nonce } + } + + /** + * Link a wallet to the root key with the wallet as the caller + * @param rootKey + * @param wallet + */ + public async linkCallerToRootKey( + rootKey: ethers.Signer, + wallet: ethers.Signer, + ): Promise { + const { rootKeyData, nonce } = await this.generateLinkCallerData(rootKey, wallet) + + // msg.sender = new wallet + return this.walletLinkShim.write(wallet).linkCallerToRootKey(rootKeyData, nonce) + } + + /** + * Link a wallet to the root key with the root key as the caller + * + * @param wallet + * @param rootKey + * @returns + */ + public async linkWalletToRootKey(rootKey: ethers.Signer, wallet: ethers.Signer) { + const { walletData, rootKeyData, nonce } = await this.generateLinkWalletData( + rootKey, + wallet, + ) + + // msg.sender = root key + return this.walletLinkShim + .write(rootKey) + .linkWalletToRootKey(walletData, rootKeyData, nonce) + } + + public async encodeLinkCallerToRootKey( + rootKey: ethers.Signer, + wallet: Address, + ): Promise { + const { rootKeyData, nonce } = await this.generateLinkCallerData(rootKey, wallet) + + return this.walletLinkShim.interface.encodeFunctionData('linkCallerToRootKey', [ + rootKeyData, + nonce, + ]) + } + + public async encodeLinkWalletToRootKey( + rootKey: ethers.Signer, + wallet: ethers.Signer, + ): Promise { + const { walletData, rootKeyData, nonce } = await this.generateLinkWalletData( + rootKey, + wallet, + ) + + return this.walletLinkShim.interface.encodeFunctionData('linkWalletToRootKey', [ + walletData, + rootKeyData, + nonce, + ]) + } + + public parseError(error: any): Error { + return this.walletLinkShim.parseError(error) + } + + public async getLinkedWallets(rootKey: string): Promise { + return this.walletLinkShim.read.getWalletsByRootKey(rootKey) + } + + public getRootKeyForWallet(wallet: string): Promise { + return this.walletLinkShim.read.getRootKeyForWallet(wallet) + } + + public async checkIfLinked(rootKey: ethers.Signer, wallet: string): Promise { + const rootKeyAddress = await rootKey.getAddress() + return this.walletLinkShim.read.checkIfLinked(rootKeyAddress, wallet) + } + + private async generateRemoveLinkData(rootKey: ethers.Signer, walletAddress: string) { + const { rootKeyAddress } = await this.assertAlreadyLinked(rootKey, walletAddress) + const nonce = await this.walletLinkShim.read.getLatestNonceForRootKey(rootKeyAddress) + const rootKeySignature = await rootKey.signMessage( + packAddressWithNonce(walletAddress, nonce), + ) + + return { rootKeyAddress, rootKeySignature, nonce } + } + + public async removeLink( + rootKey: ethers.Signer, + walletAddress: string, + ): Promise { + const { rootKeyAddress, rootKeySignature, nonce } = await this.generateRemoveLinkData( + rootKey, + walletAddress, + ) + + return await this.walletLinkShim.write(rootKey).removeLink( + walletAddress, + { + addr: rootKeyAddress, + signature: rootKeySignature, + }, + nonce, + ) + } + + public async encodeRemoveLink(rootKey: ethers.Signer, walletAddress: string) { + const { rootKeyAddress, rootKeySignature, nonce } = await this.generateRemoveLinkData( + rootKey, + walletAddress, + ) + + return this.walletLinkShim.interface.encodeFunctionData('removeLink', [ + walletAddress, + { + addr: rootKeyAddress, + signature: rootKeySignature, + }, + nonce, + ]) + } + + public getInterface() { + return this.walletLinkShim.interface + } +} + +function packAddressWithNonce(address: string, nonce: BigNumber): Uint8Array { + const abi = ethers.utils.defaultAbiCoder + const packed = abi.encode(['address', 'uint256'], [address, nonce.toNumber()]) + const hash = ethers.utils.keccak256(packed) + return arrayify(hash) +} diff --git a/core/web3/src/v3/WalletLinkShim.ts b/core/web3/src/v3/WalletLinkShim.ts new file mode 100644 index 000000000..2bc70e2f4 --- /dev/null +++ b/core/web3/src/v3/WalletLinkShim.ts @@ -0,0 +1,33 @@ +import { + IWalletLink as LocalhostContract, + IWalletLinkInterface as LocalhostInterface, +} from '@river-build/generated/dev/typings/IWalletLink' +import { + IWalletLink as BaseSepoliaContract, + IWalletLinkInterface as BaseSepoliaInterface, +} from '@river-build/generated/v3/typings/IWalletLink' + +import LocalhostAbi from '@river-build/generated/dev/abis/WalletLink.abi.json' assert { type: 'json' } +import BaseSepoliaAbi from '@river-build/generated/v3/abis/WalletLink.abi.json' assert { type: 'json' } + +import { ethers } from 'ethers' +import { BaseContractShim } from './BaseContractShim' +import { ContractVersion } from '../IStaticContractsInfo' + +export class IWalletLinkShim extends BaseContractShim< + LocalhostContract, + LocalhostInterface, + BaseSepoliaContract, + BaseSepoliaInterface +> { + constructor( + address: string, + version: ContractVersion, + provider: ethers.providers.Provider | undefined, + ) { + super(address, version, provider, { + [ContractVersion.dev]: LocalhostAbi, + [ContractVersion.v3]: BaseSepoliaAbi, + }) + } +} diff --git a/core/web3/src/v3/index.ts b/core/web3/src/v3/index.ts new file mode 100644 index 000000000..5a3068f86 --- /dev/null +++ b/core/web3/src/v3/index.ts @@ -0,0 +1,16 @@ +export * from './BaseContractShim' +export * from './IChannelShim' +export * from './IEntitlementsShim' +export * from './IMulticallShim' +export * from './IRuleEntitlementShim' +export * from './IRolesShim' +export * from './ISpaceArchitectShim' +export * from './ISpaceOwnerShim' +export * from './MockERC721AShim' +export * from './OwnableFacetShim' +export * from './SpaceDapp' +export * from './TokenPausableFacetShim' +export * from './Space' +export * from './SpaceRegistrar' +export * from './UserEntitlementShim' +export * from './WalletLink' diff --git a/core/web3/tests/TestSpaceDapp.ts b/core/web3/tests/TestSpaceDapp.ts new file mode 100644 index 000000000..776cd6f43 --- /dev/null +++ b/core/web3/tests/TestSpaceDapp.ts @@ -0,0 +1,15 @@ +import { ethers } from 'ethers' +import { SpaceDapp, MockERC721AShim, BaseChainConfig } from '../src' + +export class TestSpaceDapp extends SpaceDapp { + mockNFT: MockERC721AShim | undefined + + constructor(config: BaseChainConfig, provider: ethers.providers.Provider) { + super(config, provider) + + const mockNFTAddress = config.addresses.mockNFT + this.mockNFT = mockNFTAddress + ? new MockERC721AShim(mockNFTAddress, config.contractVersion, provider) + : undefined + } +} diff --git a/core/web3/tests/Web3Constants.test.ts b/core/web3/tests/Web3Constants.test.ts new file mode 100644 index 000000000..08ff31f5a --- /dev/null +++ b/core/web3/tests/Web3Constants.test.ts @@ -0,0 +1,17 @@ +import debug from 'debug' +import { BASE_SEPOLIA } from '../src/Web3Constants' +import { LocalhostWeb3Provider } from '../src/LocalhostWeb3Provider' +const log = debug('web3:test') + +describe('Web3Constants', () => { + ;`` + test('BASE_SEPOLIA', () => { + expect(BASE_SEPOLIA).toBe(84532) + }) + + test('instantiate provider', () => { + log('testing provider instanciation') + const p = new LocalhostWeb3Provider('http://localhost:8545') + expect(p).toBeDefined() + }) +}) diff --git a/core/web3/tests/entitlement.test.ts b/core/web3/tests/entitlement.test.ts new file mode 100644 index 000000000..2a7ca0a92 --- /dev/null +++ b/core/web3/tests/entitlement.test.ts @@ -0,0 +1,435 @@ +import { ethers } from 'ethers' +import { + CheckOperation, + CheckOperationType, + LogicalOperationType, + OperationType, + decodeEntitlementData, + encodeEntitlementData, + evaluateTree, + postOrderArrayToTree, + Operation, + AndOperation, + OrOperation, + treeToRuleData, + ruleDataToOperations, +} from '../src/entitlement' +import { MOCK_ADDRESS } from '../src/Utils' +import { zeroAddress } from 'viem' + +function makeRandomOperation(depth: number): Operation { + const rand = Math.random() + + if ((depth > 5 && depth < 10 && rand < 1 / 3) || (depth < 10 && rand < 1 / 2)) { + return { + opType: OperationType.LOGICAL, + logicalType: LogicalOperationType.AND, + leftOperation: makeRandomOperation(depth + 1), + rightOperation: makeRandomOperation(depth + 1), + } + } else if ((depth > 5 && depth < 10 && rand < 2 / 3) || (depth < 10 && rand > 1 / 2)) { + return { + opType: OperationType.LOGICAL, + logicalType: LogicalOperationType.OR, + leftOperation: makeRandomOperation(depth + 1), + rightOperation: makeRandomOperation(depth + 1), + } + } else { + return { + opType: OperationType.CHECK, + checkType: CheckOperationType.MOCK, + chainId: rand > 0.5 ? 1n : 0n, + contractAddress: generateRandomEthAddress(), + threshold: rand > 0.5 ? 500n : 10n, + } + } +} + +test('random', async () => { + const operation = makeRandomOperation(0) + // it takes a Uint8Array and returns a Uint8Array + const controller = new AbortController() + const result = await evaluateTree(controller, [], [], operation) + expect(result).toBeDefined() +}) + +function generateRandomEthAddress(): `0x${string}` { + let address: `0x${string}` = '0x' + const characters = '0123456789abcdef' + for (let i = 0; i < 40; i++) { + address += characters.charAt(Math.floor(Math.random() * characters.length)) + } + return address +} +/** + * An operation that always returns true + */ +const falseCheck: CheckOperation = { + opType: OperationType.CHECK, + checkType: CheckOperationType.MOCK, + chainId: 0n, + contractAddress: `0x0`, + threshold: 10n, +} as const + +const slowFalseCheck: CheckOperation = { + opType: OperationType.CHECK, + checkType: CheckOperationType.MOCK, + chainId: 0n, + contractAddress: '0x1', + threshold: 500n, +} as const + +const trueCheck: CheckOperation = { + opType: OperationType.CHECK, + checkType: CheckOperationType.MOCK, + chainId: 1n, + contractAddress: '0x0', + threshold: 10n, +} as const + +const slowTrueCheck: CheckOperation = { + opType: OperationType.CHECK, + checkType: CheckOperationType.MOCK, + chainId: 1n, + contractAddress: '0x1', + threshold: 500n, +} as const + +// We have a custom NFT contract deployed to both ethereum sepolia and base sepolia where we +// can mint NFTs for testing. These are included in our unit tests because the local chain +// stack does not always behave the same as remote chains, so our xchain tests use them. We +// reproduce the same unit tests here to ensure parity between evaluation in xchain and the +// client. +// Contract addresses for the test NFT contracts. +const SepoliaTestNftContract: `0x${string}` = '0xb088b3f2b35511A611bF2aaC13fE605d491D6C19' +const SepoliaTestNftWallet_1Token: `0x${string}` = '0x1FDBA84c2153568bc22686B88B617CF64cdb0637' +const SepoliaTestNftWallet_3Tokens: `0x${string}` = '0xB79Af997239A334355F60DBeD75bEDf30AcD37bD' +const SepoliaTestNftWallet_2Tokens: `0x${string}` = '0x8cECcB1e5537040Fc63A06C88b4c1dE61880dA4d' + +const nftCheckEthereumSepolia: CheckOperation = { + opType: OperationType.CHECK, + checkType: CheckOperationType.ERC721, + chainId: 11155111n, + contractAddress: SepoliaTestNftContract, + threshold: 1n, +} as const + +const nftMultiCheckEthereumSepolia: CheckOperation = { + opType: OperationType.CHECK, + checkType: CheckOperationType.ERC721, + chainId: 11155111n, + contractAddress: SepoliaTestNftContract, + threshold: 6n, +} as const + +const nftMultiCheckHighThresholdEthereumSepolia: CheckOperation = { + opType: OperationType.CHECK, + checkType: CheckOperationType.ERC721, + chainId: 11155111n, + contractAddress: SepoliaTestNftContract, + threshold: 100n, +} as const + +const nftCheckBaseSepolia: CheckOperation = { + opType: OperationType.CHECK, + checkType: CheckOperationType.ERC721, + chainId: 84532n, + contractAddress: SepoliaTestNftContract, + threshold: 1n, +} as const + +const nftMultiCheckBaseSepolia: CheckOperation = { + opType: OperationType.CHECK, + checkType: CheckOperationType.ERC721, + chainId: 84532n, + contractAddress: SepoliaTestNftContract, + threshold: 6n, +} as const + +const nftMultiCheckHighThresholdBaseSepolia: CheckOperation = { + opType: OperationType.CHECK, + checkType: CheckOperationType.ERC721, + chainId: 84532n, + contractAddress: SepoliaTestNftContract, + threshold: 100n, +} as const + +const ethSepoliaProvider = new ethers.providers.JsonRpcProvider( + 'https://ethereum-sepolia-rpc.publicnode.com', +) +const baseSepoliaProvider = new ethers.providers.JsonRpcProvider('https://sepolia.base.org') + +const nftCases = [ + { + desc: 'base sepolia', + check: nftCheckBaseSepolia, + wallets: [SepoliaTestNftWallet_1Token], + provider: baseSepoliaProvider, + expectedResult: true, + }, + { + desc: 'base sepolia (no tokens)', + check: nftCheckBaseSepolia, + wallets: [ethers.constants.AddressZero], + provider: baseSepoliaProvider, + expectedResult: false, + }, + { + desc: 'base sepolia (insufficient balance)', + check: nftMultiCheckBaseSepolia, + wallets: [SepoliaTestNftWallet_1Token], + provider: baseSepoliaProvider, + expectedResult: false, + }, + { + desc: 'base sepolia multi-wallet', + check: nftMultiCheckBaseSepolia, + wallets: [ + SepoliaTestNftWallet_1Token, + SepoliaTestNftWallet_2Tokens, + SepoliaTestNftWallet_3Tokens, + ], + provider: baseSepoliaProvider, + expectedResult: true, + }, + { + desc: 'base sepolia multi-wallet (insufficient balance)', + check: nftMultiCheckHighThresholdBaseSepolia, + wallets: [ + SepoliaTestNftWallet_1Token, + SepoliaTestNftWallet_2Tokens, + SepoliaTestNftWallet_3Tokens, + ], + provider: baseSepoliaProvider, + expectedResult: false, + }, + + { + desc: 'eth sepolia', + check: nftCheckEthereumSepolia, + wallets: [SepoliaTestNftWallet_1Token], + provider: ethSepoliaProvider, + expectedResult: true, + }, + { + desc: 'eth sepolia (no tokens)', + check: nftCheckEthereumSepolia, + wallets: [ethers.constants.AddressZero], + provider: ethSepoliaProvider, + expectedResult: false, + }, + { + desc: 'eth sepolia (insufficient balance)', + check: nftMultiCheckEthereumSepolia, + wallets: [SepoliaTestNftWallet_1Token], + provider: baseSepoliaProvider, + expectedResult: false, + }, + { + desc: 'eth sepolia multi-wallet', + check: nftMultiCheckEthereumSepolia, + wallets: [ + SepoliaTestNftWallet_1Token, + SepoliaTestNftWallet_2Tokens, + SepoliaTestNftWallet_3Tokens, + ], + provider: baseSepoliaProvider, + expectedResult: true, + }, + { + desc: 'eth sepolia multi-wallet (insufficient balance)', + check: nftMultiCheckHighThresholdEthereumSepolia, + wallets: [ + SepoliaTestNftWallet_1Token, + SepoliaTestNftWallet_2Tokens, + SepoliaTestNftWallet_3Tokens, + ], + provider: baseSepoliaProvider, + expectedResult: false, + }, +] + +test.each(nftCases)('erc721Check - $desc', async (props) => { + const { check, wallets, provider, expectedResult } = props + const controller = new AbortController() + const result = await evaluateTree(controller, wallets, [provider], check) + if (expectedResult) { + expect(result).toBeTruthy() + } else { + expect(result).toEqual(zeroAddress) + } +}) + +/* +["andOperation", trueCheck, trueCheck, true], +["andOperation", falseCheck, falseCheck, false], +["andOperation", falseCheck, falseCheck, false], +["andOperation", falseCheck, falseCheck, false], +]; +*/ + +const orCases = [ + { leftCheck: trueCheck, rightCheck: trueCheck, expectedResult: MOCK_ADDRESS }, + { leftCheck: trueCheck, rightCheck: falseCheck, expectedResult: MOCK_ADDRESS }, + { leftCheck: falseCheck, rightCheck: trueCheck, expectedResult: MOCK_ADDRESS }, + { leftCheck: falseCheck, rightCheck: falseCheck, expectedResult: ethers.constants.AddressZero }, +] + +test.each(orCases)('orOperation', async (props) => { + const { leftCheck, rightCheck, expectedResult } = props + const orOperation: OrOperation = { + opType: OperationType.LOGICAL, + logicalType: LogicalOperationType.OR, + leftOperation: leftCheck, + rightOperation: rightCheck, + } as const + + const controller = new AbortController() + const result = await evaluateTree(controller, [], [], orOperation) + expect(result).toBe(expectedResult) +}) + +const slowOrCases = [ + { + leftCheck: trueCheck, + rightCheck: slowTrueCheck, + expectedResult: MOCK_ADDRESS, + expectedTime: 10, + }, + { + leftCheck: trueCheck, + rightCheck: slowFalseCheck, + expectedResult: MOCK_ADDRESS, + expectedTime: 10, + }, + { + leftCheck: slowFalseCheck, + rightCheck: trueCheck, + expectedResult: MOCK_ADDRESS, + expectedTime: 10, + }, + { + leftCheck: falseCheck, + rightCheck: slowFalseCheck, + expectedResult: ethers.constants.AddressZero, + expectedTime: 500, + }, +] + +test.each(slowOrCases)('slowOrOperation', async (props) => { + const { leftCheck, rightCheck, expectedResult, expectedTime } = props + const operation: OrOperation = { + opType: OperationType.LOGICAL, + logicalType: LogicalOperationType.OR, + leftOperation: leftCheck, + rightOperation: rightCheck, + } as const + + const controller = new AbortController() + const start = performance.now() + const result = await evaluateTree(controller, [], [], operation) + const timeTaken = performance.now() - start + expect(timeTaken).toBeCloseTo(expectedTime, -2) + expect(result).toBe(expectedResult) +}) + +const andCases = [ + { leftCheck: trueCheck, rightCheck: trueCheck, expectedResult: MOCK_ADDRESS }, + { leftCheck: trueCheck, rightCheck: falseCheck, expectedResult: ethers.constants.AddressZero }, + { leftCheck: falseCheck, rightCheck: trueCheck, expectedResult: ethers.constants.AddressZero }, + { leftCheck: falseCheck, rightCheck: falseCheck, expectedResult: ethers.constants.AddressZero }, +] + +test.each(andCases)('andOperation', async (props) => { + const { leftCheck, rightCheck, expectedResult } = props + const operation: AndOperation = { + opType: OperationType.LOGICAL, + logicalType: LogicalOperationType.AND, + leftOperation: leftCheck, + rightOperation: rightCheck, + } as const + + const controller = new AbortController() + const result = await evaluateTree(controller, [], [], operation) + expect(result).toBe(expectedResult) +}) + +const slowAndCases = [ + { + leftCheck: trueCheck, + rightCheck: slowTrueCheck, + expectedResult: MOCK_ADDRESS, + expectedTime: 500, + }, + { + leftCheck: slowTrueCheck, + rightCheck: falseCheck, + expectedResult: ethers.constants.AddressZero, + expectedTime: 10, + }, + { + leftCheck: falseCheck, + rightCheck: slowTrueCheck, + expectedResult: ethers.constants.AddressZero, + expectedTime: 10, + }, + { + leftCheck: falseCheck, + rightCheck: slowFalseCheck, + expectedResult: ethers.constants.AddressZero, + expectedTime: 10, + }, +] + +test.each(slowAndCases)('slowAndOperation', async (props) => { + const { leftCheck, rightCheck, expectedResult, expectedTime } = props + const operation: AndOperation = { + opType: OperationType.LOGICAL, + logicalType: LogicalOperationType.AND, + leftOperation: leftCheck, + rightOperation: rightCheck, + } as const + + const controller = new AbortController() + const start = performance.now() + const result = await evaluateTree(controller, [], [], operation) + const timeTaken = performance.now() - start + + expect(result).toBe(expectedResult) + expect(timeTaken).toBeCloseTo(expectedTime, -2) +}) + +test('empty', async () => { + const controller = new AbortController() + const result = await evaluateTree(controller, [], [], undefined) + expect(result).toBe(ethers.constants.AddressZero) +}) + +test('true', async () => { + const operation = trueCheck + + const controller = new AbortController() + const result = await evaluateTree(controller, [], [], operation) + expect(result).toBe(MOCK_ADDRESS) +}) + +test('false', async () => { + const operation = falseCheck + + const controller = new AbortController() + const result = await evaluateTree(controller, [], [], operation) + expect(result).toBe(ethers.constants.AddressZero) +}) + +test('encode', async () => { + const randomTree = makeRandomOperation(5) + + const data = treeToRuleData(randomTree) + const encoded = encodeEntitlementData(data) + + const decodedDag = decodeEntitlementData(encoded) + const operations = ruleDataToOperations(decodedDag) + const newTree = postOrderArrayToTree(operations) + expect(randomTree.opType === newTree.opType).toBeTruthy() +}) diff --git a/core/web3/tsconfig.eslint.json b/core/web3/tsconfig.eslint.json new file mode 100644 index 000000000..b65f24ed5 --- /dev/null +++ b/core/web3/tsconfig.eslint.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/**/*", "jest.config.ts", "jest-setup.ts", "tests/**/*"] +} diff --git a/core/web3/tsconfig.json b/core/web3/tsconfig.json new file mode 100644 index 000000000..cd190ce8e --- /dev/null +++ b/core/web3/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "./../tsconfig.base.json", + "compilerOptions": { + "baseUrl": "./src" /* Specify the root folder within your source files. */, + "outDir": "./dist" /* Specify an output folder for all emitted files. */ + }, + "include": ["src/**/*"] +} diff --git a/core/xchain/Makefile b/core/xchain/Makefile new file mode 100644 index 000000000..8e2b68671 --- /dev/null +++ b/core/xchain/Makefile @@ -0,0 +1,40 @@ +# Makefile + +# Configurations +OUTPUT_DIR=./bin + +# Source files +SRC := $(shell find . -type f -name '*.go') + +# Default target executed when no arguments are given to make. +default: build + +# The `clean` target ensures all the compiled files are deleted. +clean: + rm -rf $(OUTPUT_DIR) + +# The `build` target compiles the code and puts the resulting binary in OUTPUT_DIR. +.PHONY: build +build: $(OUTPUT_DIR)/node + +# Compiles the node binary +$(OUTPUT_DIR)/node: $(SRC) + go build -o $(OUTPUT_DIR)/xchain_node ./node + +# The `test` target runs the tests. +test: + go test -v ./... + +integration_tests: + go test -timeout 10m core/xchain/server -v -tags integration + +# The `vet` target runs go vet to examine Go source code and reports suspicious constructs. +vet: + go vet ./... + +lint: + golangci-lint run --enable exhaustive --path-prefix=. + +fmt: + ./fmt.sh + diff --git a/core/xchain/README.md b/core/xchain/README.md new file mode 100644 index 000000000..c18e2b2c1 --- /dev/null +++ b/core/xchain/README.md @@ -0,0 +1,155 @@ +# README.md for XChain Ethereum Node Application in Monorepo + +--- + +## Table of Contents + +1. [Introduction](#introduction) +2. [Prerequisites](#prerequisites) +3. [Monorepo Structure](#monorepo-structure) +4. [Installation and Deployment](#installation-and-deployment) +5. [Building and Running Using Makefile](#building-and-running-using-makefile) +6. [Multi-Instance Configuration and Launch](#multi-instance-configuration-and-launch) +7. [API Specification](#api-specification) +8. [Troubleshooting](#troubleshooting) +9. [Contributing](#contributing) + +--- + +## Introduction + +This XChain Node resides in a monorepo and interfaces with the `EntitlementChecker` smart contract. The node reads, executes requests, and posts results back to contracts conforming to `IEntitlementGated`. + +--- + +## Prerequisites + +- Go 1.22.2 or higher +- Foundry +- Make utility + +--- + +## Monorepo Structure + +- Root + - `/core/xchain`: This Node + - `/contracts`: Smart Contracts + - `/scripts`: Smart Contract Deployment scripts + +--- + +## Installation and Deployment + +1. **Clone the Monorepo:** + + ```bash + git clone https://github.com/HereNotThere/harmony.git + ``` + +2. **Navigate to Monorepo:** + ```bash + cd harmony + ``` +3. **Deploy Contracts:** + ```bash + ./scripts/deploy-entitlement-checker.sh + ``` + +--- + +## Building and Running Using Makefile + +1. **Navigate to `./core/xchain`:** + + ```bash + cd ./core/xchain + ``` + +2. **Build:** + + ```bash + make build + ``` + +3. **Run Tests:** + + ```bash + make test + ``` + +4. **Run Integration Tests** + Note: this step requires that a local base chai nbe running. + + ```bash + ../../scripts/start-local-basechain.sh + make integration_tests + ``` + +5. **Run Go Vet:** + + ```bash + make vet + ``` + +6. **Run Linter:** + ```bash + make lint + ``` + +--- + +## Multi-Instance Configuration and Launch + +1. ** Start the Dev environment ** + + From the root of the repo, run the following command to start the dev environment: + + ```bash + ./scripts/start_dev.sh + ``` + +1. **Create Multi-Instance Configs:** + + ```bash + export RIVER_ENV="local_single" + ./create_multi.sh + ``` + + This will create five instance configurations in `./core/xchain/instance_1-5` using the template in `./core/xchain/config-template.yaml`. + +1. **Launch Multiple Instances:** + ```bash + ./launch-multi.sh + ``` + +--- + +## API Specification for talking to the EntitlementChecker contract + +### IEntitlementGated Interface Methods + +- `requestEntitlementCheck()`: Clients call this to request an entitlement check. +- `postEntitlementCheckResult(transactionId, result)`: XChain Node calls to post the result of an entitlement check. +- `deleteTransaction(transactionId)`: Clients call to delete a transaction. + +### IEntitlementChecker Interface Methods + +- `registerNode()`: Registers a node. TODO integrate with Node Registery contract. +- `unregisterNode()`: Unregisters a node. TODO integrate with Node Registery contract. +- `nodeCount()`: Returns the count of registered nodes. Util to help with debugging +- `getRandomNodes(requestedNodeCount, requestingContract)`: Returns a set of random nodes. +- `emitEntitlementCheckRequested(transactionId, selectedNodes)`: Emits an event indicating an entitlement check request. + +--- + +## Troubleshooting + +- **Issue:** Node doesn't start + + - **Solution:** Validate that `common/localhost_entitlementChecker.json` and `common/localhost_entitlementGatedExample.json` contains the correct contract addresses. + +- **Issue:** Failed transaction posting + - **Solution:** Confirm Ethereum node connectivity and available funds for transactions. + +--- diff --git a/core/xchain/bindings/erc1155/erc1155.go b/core/xchain/bindings/erc1155/erc1155.go new file mode 100644 index 000000000..ad6a41a34 --- /dev/null +++ b/core/xchain/bindings/erc1155/erc1155.go @@ -0,0 +1,1026 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package erc1155 + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// Erc1155MetaData contains all meta data concerning the Erc1155 contract. +var Erc1155MetaData = &bind.MetaData{ + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"TransferBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"TransferSingle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"URI\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"balanceOfBatch\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", +} + +// Erc1155ABI is the input ABI used to generate the binding from. +// Deprecated: Use Erc1155MetaData.ABI instead. +var Erc1155ABI = Erc1155MetaData.ABI + +// Erc1155 is an auto generated Go binding around an Ethereum contract. +type Erc1155 struct { + Erc1155Caller // Read-only binding to the contract + Erc1155Transactor // Write-only binding to the contract + Erc1155Filterer // Log filterer for contract events +} + +// Erc1155Caller is an auto generated read-only Go binding around an Ethereum contract. +type Erc1155Caller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Erc1155Transactor is an auto generated write-only Go binding around an Ethereum contract. +type Erc1155Transactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Erc1155Filterer is an auto generated log filtering Go binding around an Ethereum contract events. +type Erc1155Filterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Erc1155Session is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type Erc1155Session struct { + Contract *Erc1155 // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// Erc1155CallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type Erc1155CallerSession struct { + Contract *Erc1155Caller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// Erc1155TransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type Erc1155TransactorSession struct { + Contract *Erc1155Transactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// Erc1155Raw is an auto generated low-level Go binding around an Ethereum contract. +type Erc1155Raw struct { + Contract *Erc1155 // Generic contract binding to access the raw methods on +} + +// Erc1155CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type Erc1155CallerRaw struct { + Contract *Erc1155Caller // Generic read-only contract binding to access the raw methods on +} + +// Erc1155TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type Erc1155TransactorRaw struct { + Contract *Erc1155Transactor // Generic write-only contract binding to access the raw methods on +} + +// NewErc1155 creates a new instance of Erc1155, bound to a specific deployed contract. +func NewErc1155(address common.Address, backend bind.ContractBackend) (*Erc1155, error) { + contract, err := bindErc1155(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Erc1155{Erc1155Caller: Erc1155Caller{contract: contract}, Erc1155Transactor: Erc1155Transactor{contract: contract}, Erc1155Filterer: Erc1155Filterer{contract: contract}}, nil +} + +// NewErc1155Caller creates a new read-only instance of Erc1155, bound to a specific deployed contract. +func NewErc1155Caller(address common.Address, caller bind.ContractCaller) (*Erc1155Caller, error) { + contract, err := bindErc1155(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &Erc1155Caller{contract: contract}, nil +} + +// NewErc1155Transactor creates a new write-only instance of Erc1155, bound to a specific deployed contract. +func NewErc1155Transactor(address common.Address, transactor bind.ContractTransactor) (*Erc1155Transactor, error) { + contract, err := bindErc1155(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &Erc1155Transactor{contract: contract}, nil +} + +// NewErc1155Filterer creates a new log filterer instance of Erc1155, bound to a specific deployed contract. +func NewErc1155Filterer(address common.Address, filterer bind.ContractFilterer) (*Erc1155Filterer, error) { + contract, err := bindErc1155(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &Erc1155Filterer{contract: contract}, nil +} + +// bindErc1155 binds a generic wrapper to an already deployed contract. +func bindErc1155(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := Erc1155MetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Erc1155 *Erc1155Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Erc1155.Contract.Erc1155Caller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Erc1155 *Erc1155Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Erc1155.Contract.Erc1155Transactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Erc1155 *Erc1155Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Erc1155.Contract.Erc1155Transactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Erc1155 *Erc1155CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Erc1155.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Erc1155 *Erc1155TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Erc1155.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Erc1155 *Erc1155TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Erc1155.Contract.contract.Transact(opts, method, params...) +} + +// BalanceOf is a free data retrieval call binding the contract method 0x00fdd58e. +// +// Solidity: function balanceOf(address account, uint256 id) view returns(uint256) +func (_Erc1155 *Erc1155Caller) BalanceOf(opts *bind.CallOpts, account common.Address, id *big.Int) (*big.Int, error) { + var out []interface{} + err := _Erc1155.contract.Call(opts, &out, "balanceOf", account, id) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BalanceOf is a free data retrieval call binding the contract method 0x00fdd58e. +// +// Solidity: function balanceOf(address account, uint256 id) view returns(uint256) +func (_Erc1155 *Erc1155Session) BalanceOf(account common.Address, id *big.Int) (*big.Int, error) { + return _Erc1155.Contract.BalanceOf(&_Erc1155.CallOpts, account, id) +} + +// BalanceOf is a free data retrieval call binding the contract method 0x00fdd58e. +// +// Solidity: function balanceOf(address account, uint256 id) view returns(uint256) +func (_Erc1155 *Erc1155CallerSession) BalanceOf(account common.Address, id *big.Int) (*big.Int, error) { + return _Erc1155.Contract.BalanceOf(&_Erc1155.CallOpts, account, id) +} + +// BalanceOfBatch is a free data retrieval call binding the contract method 0x4e1273f4. +// +// Solidity: function balanceOfBatch(address[] accounts, uint256[] ids) view returns(uint256[]) +func (_Erc1155 *Erc1155Caller) BalanceOfBatch(opts *bind.CallOpts, accounts []common.Address, ids []*big.Int) ([]*big.Int, error) { + var out []interface{} + err := _Erc1155.contract.Call(opts, &out, "balanceOfBatch", accounts, ids) + + if err != nil { + return *new([]*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new([]*big.Int)).(*[]*big.Int) + + return out0, err + +} + +// BalanceOfBatch is a free data retrieval call binding the contract method 0x4e1273f4. +// +// Solidity: function balanceOfBatch(address[] accounts, uint256[] ids) view returns(uint256[]) +func (_Erc1155 *Erc1155Session) BalanceOfBatch(accounts []common.Address, ids []*big.Int) ([]*big.Int, error) { + return _Erc1155.Contract.BalanceOfBatch(&_Erc1155.CallOpts, accounts, ids) +} + +// BalanceOfBatch is a free data retrieval call binding the contract method 0x4e1273f4. +// +// Solidity: function balanceOfBatch(address[] accounts, uint256[] ids) view returns(uint256[]) +func (_Erc1155 *Erc1155CallerSession) BalanceOfBatch(accounts []common.Address, ids []*big.Int) ([]*big.Int, error) { + return _Erc1155.Contract.BalanceOfBatch(&_Erc1155.CallOpts, accounts, ids) +} + +// IsApprovedForAll is a free data retrieval call binding the contract method 0xe985e9c5. +// +// Solidity: function isApprovedForAll(address account, address operator) view returns(bool) +func (_Erc1155 *Erc1155Caller) IsApprovedForAll(opts *bind.CallOpts, account common.Address, operator common.Address) (bool, error) { + var out []interface{} + err := _Erc1155.contract.Call(opts, &out, "isApprovedForAll", account, operator) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsApprovedForAll is a free data retrieval call binding the contract method 0xe985e9c5. +// +// Solidity: function isApprovedForAll(address account, address operator) view returns(bool) +func (_Erc1155 *Erc1155Session) IsApprovedForAll(account common.Address, operator common.Address) (bool, error) { + return _Erc1155.Contract.IsApprovedForAll(&_Erc1155.CallOpts, account, operator) +} + +// IsApprovedForAll is a free data retrieval call binding the contract method 0xe985e9c5. +// +// Solidity: function isApprovedForAll(address account, address operator) view returns(bool) +func (_Erc1155 *Erc1155CallerSession) IsApprovedForAll(account common.Address, operator common.Address) (bool, error) { + return _Erc1155.Contract.IsApprovedForAll(&_Erc1155.CallOpts, account, operator) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_Erc1155 *Erc1155Caller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _Erc1155.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_Erc1155 *Erc1155Session) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _Erc1155.Contract.SupportsInterface(&_Erc1155.CallOpts, interfaceId) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_Erc1155 *Erc1155CallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _Erc1155.Contract.SupportsInterface(&_Erc1155.CallOpts, interfaceId) +} + +// Uri is a free data retrieval call binding the contract method 0x0e89341c. +// +// Solidity: function uri(uint256 ) view returns(string) +func (_Erc1155 *Erc1155Caller) Uri(opts *bind.CallOpts, arg0 *big.Int) (string, error) { + var out []interface{} + err := _Erc1155.contract.Call(opts, &out, "uri", arg0) + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Uri is a free data retrieval call binding the contract method 0x0e89341c. +// +// Solidity: function uri(uint256 ) view returns(string) +func (_Erc1155 *Erc1155Session) Uri(arg0 *big.Int) (string, error) { + return _Erc1155.Contract.Uri(&_Erc1155.CallOpts, arg0) +} + +// Uri is a free data retrieval call binding the contract method 0x0e89341c. +// +// Solidity: function uri(uint256 ) view returns(string) +func (_Erc1155 *Erc1155CallerSession) Uri(arg0 *big.Int) (string, error) { + return _Erc1155.Contract.Uri(&_Erc1155.CallOpts, arg0) +} + +// SafeBatchTransferFrom is a paid mutator transaction binding the contract method 0x2eb2c2d6. +// +// Solidity: function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) returns() +func (_Erc1155 *Erc1155Transactor) SafeBatchTransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, ids []*big.Int, amounts []*big.Int, data []byte) (*types.Transaction, error) { + return _Erc1155.contract.Transact(opts, "safeBatchTransferFrom", from, to, ids, amounts, data) +} + +// SafeBatchTransferFrom is a paid mutator transaction binding the contract method 0x2eb2c2d6. +// +// Solidity: function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) returns() +func (_Erc1155 *Erc1155Session) SafeBatchTransferFrom(from common.Address, to common.Address, ids []*big.Int, amounts []*big.Int, data []byte) (*types.Transaction, error) { + return _Erc1155.Contract.SafeBatchTransferFrom(&_Erc1155.TransactOpts, from, to, ids, amounts, data) +} + +// SafeBatchTransferFrom is a paid mutator transaction binding the contract method 0x2eb2c2d6. +// +// Solidity: function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) returns() +func (_Erc1155 *Erc1155TransactorSession) SafeBatchTransferFrom(from common.Address, to common.Address, ids []*big.Int, amounts []*big.Int, data []byte) (*types.Transaction, error) { + return _Erc1155.Contract.SafeBatchTransferFrom(&_Erc1155.TransactOpts, from, to, ids, amounts, data) +} + +// SafeTransferFrom is a paid mutator transaction binding the contract method 0xf242432a. +// +// Solidity: function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) returns() +func (_Erc1155 *Erc1155Transactor) SafeTransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, id *big.Int, amount *big.Int, data []byte) (*types.Transaction, error) { + return _Erc1155.contract.Transact(opts, "safeTransferFrom", from, to, id, amount, data) +} + +// SafeTransferFrom is a paid mutator transaction binding the contract method 0xf242432a. +// +// Solidity: function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) returns() +func (_Erc1155 *Erc1155Session) SafeTransferFrom(from common.Address, to common.Address, id *big.Int, amount *big.Int, data []byte) (*types.Transaction, error) { + return _Erc1155.Contract.SafeTransferFrom(&_Erc1155.TransactOpts, from, to, id, amount, data) +} + +// SafeTransferFrom is a paid mutator transaction binding the contract method 0xf242432a. +// +// Solidity: function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) returns() +func (_Erc1155 *Erc1155TransactorSession) SafeTransferFrom(from common.Address, to common.Address, id *big.Int, amount *big.Int, data []byte) (*types.Transaction, error) { + return _Erc1155.Contract.SafeTransferFrom(&_Erc1155.TransactOpts, from, to, id, amount, data) +} + +// SetApprovalForAll is a paid mutator transaction binding the contract method 0xa22cb465. +// +// Solidity: function setApprovalForAll(address operator, bool approved) returns() +func (_Erc1155 *Erc1155Transactor) SetApprovalForAll(opts *bind.TransactOpts, operator common.Address, approved bool) (*types.Transaction, error) { + return _Erc1155.contract.Transact(opts, "setApprovalForAll", operator, approved) +} + +// SetApprovalForAll is a paid mutator transaction binding the contract method 0xa22cb465. +// +// Solidity: function setApprovalForAll(address operator, bool approved) returns() +func (_Erc1155 *Erc1155Session) SetApprovalForAll(operator common.Address, approved bool) (*types.Transaction, error) { + return _Erc1155.Contract.SetApprovalForAll(&_Erc1155.TransactOpts, operator, approved) +} + +// SetApprovalForAll is a paid mutator transaction binding the contract method 0xa22cb465. +// +// Solidity: function setApprovalForAll(address operator, bool approved) returns() +func (_Erc1155 *Erc1155TransactorSession) SetApprovalForAll(operator common.Address, approved bool) (*types.Transaction, error) { + return _Erc1155.Contract.SetApprovalForAll(&_Erc1155.TransactOpts, operator, approved) +} + +// Erc1155ApprovalForAllIterator is returned from FilterApprovalForAll and is used to iterate over the raw logs and unpacked data for ApprovalForAll events raised by the Erc1155 contract. +type Erc1155ApprovalForAllIterator struct { + Event *Erc1155ApprovalForAll // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc1155ApprovalForAllIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc1155ApprovalForAll) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc1155ApprovalForAll) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc1155ApprovalForAllIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc1155ApprovalForAllIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc1155ApprovalForAll represents a ApprovalForAll event raised by the Erc1155 contract. +type Erc1155ApprovalForAll struct { + Account common.Address + Operator common.Address + Approved bool + Raw types.Log // Blockchain specific contextual infos +} + +// FilterApprovalForAll is a free log retrieval operation binding the contract event 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31. +// +// Solidity: event ApprovalForAll(address indexed account, address indexed operator, bool approved) +func (_Erc1155 *Erc1155Filterer) FilterApprovalForAll(opts *bind.FilterOpts, account []common.Address, operator []common.Address) (*Erc1155ApprovalForAllIterator, error) { + + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _Erc1155.contract.FilterLogs(opts, "ApprovalForAll", accountRule, operatorRule) + if err != nil { + return nil, err + } + return &Erc1155ApprovalForAllIterator{contract: _Erc1155.contract, event: "ApprovalForAll", logs: logs, sub: sub}, nil +} + +// WatchApprovalForAll is a free log subscription operation binding the contract event 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31. +// +// Solidity: event ApprovalForAll(address indexed account, address indexed operator, bool approved) +func (_Erc1155 *Erc1155Filterer) WatchApprovalForAll(opts *bind.WatchOpts, sink chan<- *Erc1155ApprovalForAll, account []common.Address, operator []common.Address) (event.Subscription, error) { + + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _Erc1155.contract.WatchLogs(opts, "ApprovalForAll", accountRule, operatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc1155ApprovalForAll) + if err := _Erc1155.contract.UnpackLog(event, "ApprovalForAll", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseApprovalForAll is a log parse operation binding the contract event 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31. +// +// Solidity: event ApprovalForAll(address indexed account, address indexed operator, bool approved) +func (_Erc1155 *Erc1155Filterer) ParseApprovalForAll(log types.Log) (*Erc1155ApprovalForAll, error) { + event := new(Erc1155ApprovalForAll) + if err := _Erc1155.contract.UnpackLog(event, "ApprovalForAll", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Erc1155TransferBatchIterator is returned from FilterTransferBatch and is used to iterate over the raw logs and unpacked data for TransferBatch events raised by the Erc1155 contract. +type Erc1155TransferBatchIterator struct { + Event *Erc1155TransferBatch // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc1155TransferBatchIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc1155TransferBatch) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc1155TransferBatch) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc1155TransferBatchIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc1155TransferBatchIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc1155TransferBatch represents a TransferBatch event raised by the Erc1155 contract. +type Erc1155TransferBatch struct { + Operator common.Address + From common.Address + To common.Address + Ids []*big.Int + Values []*big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTransferBatch is a free log retrieval operation binding the contract event 0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb. +// +// Solidity: event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +func (_Erc1155 *Erc1155Filterer) FilterTransferBatch(opts *bind.FilterOpts, operator []common.Address, from []common.Address, to []common.Address) (*Erc1155TransferBatchIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _Erc1155.contract.FilterLogs(opts, "TransferBatch", operatorRule, fromRule, toRule) + if err != nil { + return nil, err + } + return &Erc1155TransferBatchIterator{contract: _Erc1155.contract, event: "TransferBatch", logs: logs, sub: sub}, nil +} + +// WatchTransferBatch is a free log subscription operation binding the contract event 0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb. +// +// Solidity: event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +func (_Erc1155 *Erc1155Filterer) WatchTransferBatch(opts *bind.WatchOpts, sink chan<- *Erc1155TransferBatch, operator []common.Address, from []common.Address, to []common.Address) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _Erc1155.contract.WatchLogs(opts, "TransferBatch", operatorRule, fromRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc1155TransferBatch) + if err := _Erc1155.contract.UnpackLog(event, "TransferBatch", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseTransferBatch is a log parse operation binding the contract event 0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb. +// +// Solidity: event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) +func (_Erc1155 *Erc1155Filterer) ParseTransferBatch(log types.Log) (*Erc1155TransferBatch, error) { + event := new(Erc1155TransferBatch) + if err := _Erc1155.contract.UnpackLog(event, "TransferBatch", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Erc1155TransferSingleIterator is returned from FilterTransferSingle and is used to iterate over the raw logs and unpacked data for TransferSingle events raised by the Erc1155 contract. +type Erc1155TransferSingleIterator struct { + Event *Erc1155TransferSingle // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc1155TransferSingleIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc1155TransferSingle) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc1155TransferSingle) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc1155TransferSingleIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc1155TransferSingleIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc1155TransferSingle represents a TransferSingle event raised by the Erc1155 contract. +type Erc1155TransferSingle struct { + Operator common.Address + From common.Address + To common.Address + Id *big.Int + Value *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTransferSingle is a free log retrieval operation binding the contract event 0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62. +// +// Solidity: event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +func (_Erc1155 *Erc1155Filterer) FilterTransferSingle(opts *bind.FilterOpts, operator []common.Address, from []common.Address, to []common.Address) (*Erc1155TransferSingleIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _Erc1155.contract.FilterLogs(opts, "TransferSingle", operatorRule, fromRule, toRule) + if err != nil { + return nil, err + } + return &Erc1155TransferSingleIterator{contract: _Erc1155.contract, event: "TransferSingle", logs: logs, sub: sub}, nil +} + +// WatchTransferSingle is a free log subscription operation binding the contract event 0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62. +// +// Solidity: event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +func (_Erc1155 *Erc1155Filterer) WatchTransferSingle(opts *bind.WatchOpts, sink chan<- *Erc1155TransferSingle, operator []common.Address, from []common.Address, to []common.Address) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _Erc1155.contract.WatchLogs(opts, "TransferSingle", operatorRule, fromRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc1155TransferSingle) + if err := _Erc1155.contract.UnpackLog(event, "TransferSingle", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseTransferSingle is a log parse operation binding the contract event 0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62. +// +// Solidity: event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) +func (_Erc1155 *Erc1155Filterer) ParseTransferSingle(log types.Log) (*Erc1155TransferSingle, error) { + event := new(Erc1155TransferSingle) + if err := _Erc1155.contract.UnpackLog(event, "TransferSingle", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Erc1155URIIterator is returned from FilterURI and is used to iterate over the raw logs and unpacked data for URI events raised by the Erc1155 contract. +type Erc1155URIIterator struct { + Event *Erc1155URI // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc1155URIIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc1155URI) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc1155URI) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc1155URIIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc1155URIIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc1155URI represents a URI event raised by the Erc1155 contract. +type Erc1155URI struct { + Value string + Id *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterURI is a free log retrieval operation binding the contract event 0x6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b. +// +// Solidity: event URI(string value, uint256 indexed id) +func (_Erc1155 *Erc1155Filterer) FilterURI(opts *bind.FilterOpts, id []*big.Int) (*Erc1155URIIterator, error) { + + var idRule []interface{} + for _, idItem := range id { + idRule = append(idRule, idItem) + } + + logs, sub, err := _Erc1155.contract.FilterLogs(opts, "URI", idRule) + if err != nil { + return nil, err + } + return &Erc1155URIIterator{contract: _Erc1155.contract, event: "URI", logs: logs, sub: sub}, nil +} + +// WatchURI is a free log subscription operation binding the contract event 0x6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b. +// +// Solidity: event URI(string value, uint256 indexed id) +func (_Erc1155 *Erc1155Filterer) WatchURI(opts *bind.WatchOpts, sink chan<- *Erc1155URI, id []*big.Int) (event.Subscription, error) { + + var idRule []interface{} + for _, idItem := range id { + idRule = append(idRule, idItem) + } + + logs, sub, err := _Erc1155.contract.WatchLogs(opts, "URI", idRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc1155URI) + if err := _Erc1155.contract.UnpackLog(event, "URI", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseURI is a log parse operation binding the contract event 0x6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b. +// +// Solidity: event URI(string value, uint256 indexed id) +func (_Erc1155 *Erc1155Filterer) ParseURI(log types.Log) (*Erc1155URI, error) { + event := new(Erc1155URI) + if err := _Erc1155.contract.UnpackLog(event, "URI", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/xchain/bindings/erc165/erc165.go b/core/xchain/bindings/erc165/erc165.go new file mode 100644 index 000000000..fa25c7626 --- /dev/null +++ b/core/xchain/bindings/erc165/erc165.go @@ -0,0 +1,234 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package erc165 + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// Erc165MetaData contains all meta data concerning the Erc165 contract. +var Erc165MetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x608060405234801561001057600080fd5b506101b7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c806301ffc9a714610030575b600080fd5b61004a600480360381019061004591906100df565b610060565b6040516100579190610117565b60405180910390f35b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000813590506100d98161016a565b92915050565b6000602082840312156100f157600080fd5b60006100ff848285016100ca565b91505092915050565b61011181610132565b82525050565b600060208201905061012c6000830184610108565b92915050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6101738161013e565b811461017e57600080fd5b5056fea26469706673582212206301fac24ced774e086182432be8e21829d3db0195a3239cda932117c86325c564736f6c63430008040033", +} + +// Erc165ABI is the input ABI used to generate the binding from. +// Deprecated: Use Erc165MetaData.ABI instead. +var Erc165ABI = Erc165MetaData.ABI + +// Erc165Bin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use Erc165MetaData.Bin instead. +var Erc165Bin = Erc165MetaData.Bin + +// DeployErc165 deploys a new Ethereum contract, binding an instance of Erc165 to it. +func DeployErc165(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Erc165, error) { + parsed, err := Erc165MetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(Erc165Bin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Erc165{Erc165Caller: Erc165Caller{contract: contract}, Erc165Transactor: Erc165Transactor{contract: contract}, Erc165Filterer: Erc165Filterer{contract: contract}}, nil +} + +// Erc165 is an auto generated Go binding around an Ethereum contract. +type Erc165 struct { + Erc165Caller // Read-only binding to the contract + Erc165Transactor // Write-only binding to the contract + Erc165Filterer // Log filterer for contract events +} + +// Erc165Caller is an auto generated read-only Go binding around an Ethereum contract. +type Erc165Caller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Erc165Transactor is an auto generated write-only Go binding around an Ethereum contract. +type Erc165Transactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Erc165Filterer is an auto generated log filtering Go binding around an Ethereum contract events. +type Erc165Filterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Erc165Session is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type Erc165Session struct { + Contract *Erc165 // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// Erc165CallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type Erc165CallerSession struct { + Contract *Erc165Caller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// Erc165TransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type Erc165TransactorSession struct { + Contract *Erc165Transactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// Erc165Raw is an auto generated low-level Go binding around an Ethereum contract. +type Erc165Raw struct { + Contract *Erc165 // Generic contract binding to access the raw methods on +} + +// Erc165CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type Erc165CallerRaw struct { + Contract *Erc165Caller // Generic read-only contract binding to access the raw methods on +} + +// Erc165TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type Erc165TransactorRaw struct { + Contract *Erc165Transactor // Generic write-only contract binding to access the raw methods on +} + +// NewErc165 creates a new instance of Erc165, bound to a specific deployed contract. +func NewErc165(address common.Address, backend bind.ContractBackend) (*Erc165, error) { + contract, err := bindErc165(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Erc165{Erc165Caller: Erc165Caller{contract: contract}, Erc165Transactor: Erc165Transactor{contract: contract}, Erc165Filterer: Erc165Filterer{contract: contract}}, nil +} + +// NewErc165Caller creates a new read-only instance of Erc165, bound to a specific deployed contract. +func NewErc165Caller(address common.Address, caller bind.ContractCaller) (*Erc165Caller, error) { + contract, err := bindErc165(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &Erc165Caller{contract: contract}, nil +} + +// NewErc165Transactor creates a new write-only instance of Erc165, bound to a specific deployed contract. +func NewErc165Transactor(address common.Address, transactor bind.ContractTransactor) (*Erc165Transactor, error) { + contract, err := bindErc165(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &Erc165Transactor{contract: contract}, nil +} + +// NewErc165Filterer creates a new log filterer instance of Erc165, bound to a specific deployed contract. +func NewErc165Filterer(address common.Address, filterer bind.ContractFilterer) (*Erc165Filterer, error) { + contract, err := bindErc165(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &Erc165Filterer{contract: contract}, nil +} + +// bindErc165 binds a generic wrapper to an already deployed contract. +func bindErc165(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := Erc165MetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Erc165 *Erc165Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Erc165.Contract.Erc165Caller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Erc165 *Erc165Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Erc165.Contract.Erc165Transactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Erc165 *Erc165Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Erc165.Contract.Erc165Transactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Erc165 *Erc165CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Erc165.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Erc165 *Erc165TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Erc165.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Erc165 *Erc165TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Erc165.Contract.contract.Transact(opts, method, params...) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_Erc165 *Erc165Caller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _Erc165.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_Erc165 *Erc165Session) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _Erc165.Contract.SupportsInterface(&_Erc165.CallOpts, interfaceId) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_Erc165 *Erc165CallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _Erc165.Contract.SupportsInterface(&_Erc165.CallOpts, interfaceId) +} diff --git a/core/xchain/bindings/erc20/erc20.go b/core/xchain/bindings/erc20/erc20.go new file mode 100644 index 000000000..cbf52b98c --- /dev/null +++ b/core/xchain/bindings/erc20/erc20.go @@ -0,0 +1,802 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package erc20 + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// Erc20MetaData contains all meta data concerning the Erc20 contract. +var Erc20MetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60806040523480156200001157600080fd5b506040518060400160405280600781526020017f4d79546f6b656e000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4142430000000000000000000000000000000000000000000000000000000000815250816003908051906020019062000096929190620000b8565b508060049080519060200190620000af929190620000b8565b505050620001cd565b828054620000c69062000168565b90600052602060002090601f016020900481019282620000ea576000855562000136565b82601f106200010557805160ff191683800117855562000136565b8280016001018555821562000136579182015b828111156200013557825182559160200191906001019062000118565b5b50905062000145919062000149565b5090565b5b80821115620001645760008160009055506001016200014a565b5090565b600060028204905060018216806200018157607f821691505b602082108114156200019857620001976200019e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61124a80620001dd6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610d10565b60405180910390f35b6100e660048036038101906100e19190610b5e565b610308565b6040516100f39190610cf5565b60405180910390f35b61010461032b565b6040516101119190610e12565b60405180910390f35b610134600480360381019061012f9190610b0f565b610335565b6040516101419190610cf5565b60405180910390f35b610152610364565b60405161015f9190610e2d565b60405180910390f35b610182600480360381019061017d9190610b5e565b61036d565b60405161018f9190610cf5565b60405180910390f35b6101b260048036038101906101ad9190610aaa565b6103a4565b6040516101bf9190610e12565b60405180910390f35b6101d06103ec565b6040516101dd9190610d10565b60405180910390f35b61020060048036038101906101fb9190610b5e565b61047e565b60405161020d9190610cf5565b60405180910390f35b610230600480360381019061022b9190610b5e565b6104f5565b60405161023d9190610cf5565b60405180910390f35b610260600480360381019061025b9190610ad3565b610518565b60405161026d9190610e12565b60405180910390f35b60606003805461028590610f42565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610f42565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610772565b6103588585856107fe565b60019150509392505050565b60006012905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610e64565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610f42565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610f42565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610df2565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fe565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060e90610dd2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067e90610d52565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107659190610e12565b60405180910390a3505050565b600061077e8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f857818110156107ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e190610d72565b60405180910390fd5b6107f784848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561086e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086590610db2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d590610d32565b60405180910390fd5b6108e9838383610a76565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096690610d92565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a5d9190610e12565b60405180910390a3610a70848484610a7b565b50505050565b505050565b505050565b600081359050610a8f816111e6565b92915050565b600081359050610aa4816111fd565b92915050565b600060208284031215610abc57600080fd5b6000610aca84828501610a80565b91505092915050565b60008060408385031215610ae657600080fd5b6000610af485828601610a80565b9250506020610b0585828601610a80565b9150509250929050565b600080600060608486031215610b2457600080fd5b6000610b3286828701610a80565b9350506020610b4386828701610a80565b9250506040610b5486828701610a95565b9150509250925092565b60008060408385031215610b7157600080fd5b6000610b7f85828601610a80565b9250506020610b9085828601610a95565b9150509250929050565b610ba381610ecc565b82525050565b6000610bb482610e48565b610bbe8185610e53565b9350610bce818560208601610f0f565b610bd781610fd2565b840191505092915050565b6000610bef602383610e53565b9150610bfa82610fe3565b604082019050919050565b6000610c12602283610e53565b9150610c1d82611032565b604082019050919050565b6000610c35601d83610e53565b9150610c4082611081565b602082019050919050565b6000610c58602683610e53565b9150610c63826110aa565b604082019050919050565b6000610c7b602583610e53565b9150610c86826110f9565b604082019050919050565b6000610c9e602483610e53565b9150610ca982611148565b604082019050919050565b6000610cc1602583610e53565b9150610ccc82611197565b604082019050919050565b610ce081610ef8565b82525050565b610cef81610f02565b82525050565b6000602082019050610d0a6000830184610b9a565b92915050565b60006020820190508181036000830152610d2a8184610ba9565b905092915050565b60006020820190508181036000830152610d4b81610be2565b9050919050565b60006020820190508181036000830152610d6b81610c05565b9050919050565b60006020820190508181036000830152610d8b81610c28565b9050919050565b60006020820190508181036000830152610dab81610c4b565b9050919050565b60006020820190508181036000830152610dcb81610c6e565b9050919050565b60006020820190508181036000830152610deb81610c91565b9050919050565b60006020820190508181036000830152610e0b81610cb4565b9050919050565b6000602082019050610e276000830184610cd7565b92915050565b6000602082019050610e426000830184610ce6565b92915050565b600081519050919050565b600082825260208201905092915050565b6000610e6f82610ef8565b9150610e7a83610ef8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610eaf57610eae610f74565b5b828201905092915050565b6000610ec582610ed8565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015610f2d578082015181840152602081019050610f12565b83811115610f3c576000848401525b50505050565b60006002820490506001821680610f5a57607f821691505b60208210811415610f6e57610f6d610fa3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6111ef81610eba565b81146111fa57600080fd5b50565b61120681610ef8565b811461121157600080fd5b5056fea264697066735822122055c2808980b8f54b8c27969aca549fbd1834808c6e18edd5b55bb1ff3078e91564736f6c63430008040033", +} + +// Erc20ABI is the input ABI used to generate the binding from. +// Deprecated: Use Erc20MetaData.ABI instead. +var Erc20ABI = Erc20MetaData.ABI + +// Erc20Bin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use Erc20MetaData.Bin instead. +var Erc20Bin = Erc20MetaData.Bin + +// DeployErc20 deploys a new Ethereum contract, binding an instance of Erc20 to it. +func DeployErc20(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Erc20, error) { + parsed, err := Erc20MetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(Erc20Bin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Erc20{Erc20Caller: Erc20Caller{contract: contract}, Erc20Transactor: Erc20Transactor{contract: contract}, Erc20Filterer: Erc20Filterer{contract: contract}}, nil +} + +// Erc20 is an auto generated Go binding around an Ethereum contract. +type Erc20 struct { + Erc20Caller // Read-only binding to the contract + Erc20Transactor // Write-only binding to the contract + Erc20Filterer // Log filterer for contract events +} + +// Erc20Caller is an auto generated read-only Go binding around an Ethereum contract. +type Erc20Caller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Erc20Transactor is an auto generated write-only Go binding around an Ethereum contract. +type Erc20Transactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Erc20Filterer is an auto generated log filtering Go binding around an Ethereum contract events. +type Erc20Filterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Erc20Session is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type Erc20Session struct { + Contract *Erc20 // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// Erc20CallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type Erc20CallerSession struct { + Contract *Erc20Caller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// Erc20TransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type Erc20TransactorSession struct { + Contract *Erc20Transactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// Erc20Raw is an auto generated low-level Go binding around an Ethereum contract. +type Erc20Raw struct { + Contract *Erc20 // Generic contract binding to access the raw methods on +} + +// Erc20CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type Erc20CallerRaw struct { + Contract *Erc20Caller // Generic read-only contract binding to access the raw methods on +} + +// Erc20TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type Erc20TransactorRaw struct { + Contract *Erc20Transactor // Generic write-only contract binding to access the raw methods on +} + +// NewErc20 creates a new instance of Erc20, bound to a specific deployed contract. +func NewErc20(address common.Address, backend bind.ContractBackend) (*Erc20, error) { + contract, err := bindErc20(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Erc20{Erc20Caller: Erc20Caller{contract: contract}, Erc20Transactor: Erc20Transactor{contract: contract}, Erc20Filterer: Erc20Filterer{contract: contract}}, nil +} + +// NewErc20Caller creates a new read-only instance of Erc20, bound to a specific deployed contract. +func NewErc20Caller(address common.Address, caller bind.ContractCaller) (*Erc20Caller, error) { + contract, err := bindErc20(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &Erc20Caller{contract: contract}, nil +} + +// NewErc20Transactor creates a new write-only instance of Erc20, bound to a specific deployed contract. +func NewErc20Transactor(address common.Address, transactor bind.ContractTransactor) (*Erc20Transactor, error) { + contract, err := bindErc20(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &Erc20Transactor{contract: contract}, nil +} + +// NewErc20Filterer creates a new log filterer instance of Erc20, bound to a specific deployed contract. +func NewErc20Filterer(address common.Address, filterer bind.ContractFilterer) (*Erc20Filterer, error) { + contract, err := bindErc20(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &Erc20Filterer{contract: contract}, nil +} + +// bindErc20 binds a generic wrapper to an already deployed contract. +func bindErc20(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := Erc20MetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Erc20 *Erc20Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Erc20.Contract.Erc20Caller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Erc20 *Erc20Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Erc20.Contract.Erc20Transactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Erc20 *Erc20Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Erc20.Contract.Erc20Transactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Erc20 *Erc20CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Erc20.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Erc20 *Erc20TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Erc20.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Erc20 *Erc20TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Erc20.Contract.contract.Transact(opts, method, params...) +} + +// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. +// +// Solidity: function allowance(address owner, address spender) view returns(uint256) +func (_Erc20 *Erc20Caller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error) { + var out []interface{} + err := _Erc20.contract.Call(opts, &out, "allowance", owner, spender) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. +// +// Solidity: function allowance(address owner, address spender) view returns(uint256) +func (_Erc20 *Erc20Session) Allowance(owner common.Address, spender common.Address) (*big.Int, error) { + return _Erc20.Contract.Allowance(&_Erc20.CallOpts, owner, spender) +} + +// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. +// +// Solidity: function allowance(address owner, address spender) view returns(uint256) +func (_Erc20 *Erc20CallerSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) { + return _Erc20.Contract.Allowance(&_Erc20.CallOpts, owner, spender) +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address account) view returns(uint256) +func (_Erc20 *Erc20Caller) BalanceOf(opts *bind.CallOpts, account common.Address) (*big.Int, error) { + var out []interface{} + err := _Erc20.contract.Call(opts, &out, "balanceOf", account) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address account) view returns(uint256) +func (_Erc20 *Erc20Session) BalanceOf(account common.Address) (*big.Int, error) { + return _Erc20.Contract.BalanceOf(&_Erc20.CallOpts, account) +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address account) view returns(uint256) +func (_Erc20 *Erc20CallerSession) BalanceOf(account common.Address) (*big.Int, error) { + return _Erc20.Contract.BalanceOf(&_Erc20.CallOpts, account) +} + +// Decimals is a free data retrieval call binding the contract method 0x313ce567. +// +// Solidity: function decimals() view returns(uint8) +func (_Erc20 *Erc20Caller) Decimals(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _Erc20.contract.Call(opts, &out, "decimals") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// Decimals is a free data retrieval call binding the contract method 0x313ce567. +// +// Solidity: function decimals() view returns(uint8) +func (_Erc20 *Erc20Session) Decimals() (uint8, error) { + return _Erc20.Contract.Decimals(&_Erc20.CallOpts) +} + +// Decimals is a free data retrieval call binding the contract method 0x313ce567. +// +// Solidity: function decimals() view returns(uint8) +func (_Erc20 *Erc20CallerSession) Decimals() (uint8, error) { + return _Erc20.Contract.Decimals(&_Erc20.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_Erc20 *Erc20Caller) Name(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _Erc20.contract.Call(opts, &out, "name") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_Erc20 *Erc20Session) Name() (string, error) { + return _Erc20.Contract.Name(&_Erc20.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_Erc20 *Erc20CallerSession) Name() (string, error) { + return _Erc20.Contract.Name(&_Erc20.CallOpts) +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_Erc20 *Erc20Caller) Symbol(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _Erc20.contract.Call(opts, &out, "symbol") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_Erc20 *Erc20Session) Symbol() (string, error) { + return _Erc20.Contract.Symbol(&_Erc20.CallOpts) +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_Erc20 *Erc20CallerSession) Symbol() (string, error) { + return _Erc20.Contract.Symbol(&_Erc20.CallOpts) +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_Erc20 *Erc20Caller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Erc20.contract.Call(opts, &out, "totalSupply") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_Erc20 *Erc20Session) TotalSupply() (*big.Int, error) { + return _Erc20.Contract.TotalSupply(&_Erc20.CallOpts) +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_Erc20 *Erc20CallerSession) TotalSupply() (*big.Int, error) { + return _Erc20.Contract.TotalSupply(&_Erc20.CallOpts) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address spender, uint256 amount) returns(bool) +func (_Erc20 *Erc20Transactor) Approve(opts *bind.TransactOpts, spender common.Address, amount *big.Int) (*types.Transaction, error) { + return _Erc20.contract.Transact(opts, "approve", spender, amount) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address spender, uint256 amount) returns(bool) +func (_Erc20 *Erc20Session) Approve(spender common.Address, amount *big.Int) (*types.Transaction, error) { + return _Erc20.Contract.Approve(&_Erc20.TransactOpts, spender, amount) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address spender, uint256 amount) returns(bool) +func (_Erc20 *Erc20TransactorSession) Approve(spender common.Address, amount *big.Int) (*types.Transaction, error) { + return _Erc20.Contract.Approve(&_Erc20.TransactOpts, spender, amount) +} + +// DecreaseAllowance is a paid mutator transaction binding the contract method 0xa457c2d7. +// +// Solidity: function decreaseAllowance(address spender, uint256 subtractedValue) returns(bool) +func (_Erc20 *Erc20Transactor) DecreaseAllowance(opts *bind.TransactOpts, spender common.Address, subtractedValue *big.Int) (*types.Transaction, error) { + return _Erc20.contract.Transact(opts, "decreaseAllowance", spender, subtractedValue) +} + +// DecreaseAllowance is a paid mutator transaction binding the contract method 0xa457c2d7. +// +// Solidity: function decreaseAllowance(address spender, uint256 subtractedValue) returns(bool) +func (_Erc20 *Erc20Session) DecreaseAllowance(spender common.Address, subtractedValue *big.Int) (*types.Transaction, error) { + return _Erc20.Contract.DecreaseAllowance(&_Erc20.TransactOpts, spender, subtractedValue) +} + +// DecreaseAllowance is a paid mutator transaction binding the contract method 0xa457c2d7. +// +// Solidity: function decreaseAllowance(address spender, uint256 subtractedValue) returns(bool) +func (_Erc20 *Erc20TransactorSession) DecreaseAllowance(spender common.Address, subtractedValue *big.Int) (*types.Transaction, error) { + return _Erc20.Contract.DecreaseAllowance(&_Erc20.TransactOpts, spender, subtractedValue) +} + +// IncreaseAllowance is a paid mutator transaction binding the contract method 0x39509351. +// +// Solidity: function increaseAllowance(address spender, uint256 addedValue) returns(bool) +func (_Erc20 *Erc20Transactor) IncreaseAllowance(opts *bind.TransactOpts, spender common.Address, addedValue *big.Int) (*types.Transaction, error) { + return _Erc20.contract.Transact(opts, "increaseAllowance", spender, addedValue) +} + +// IncreaseAllowance is a paid mutator transaction binding the contract method 0x39509351. +// +// Solidity: function increaseAllowance(address spender, uint256 addedValue) returns(bool) +func (_Erc20 *Erc20Session) IncreaseAllowance(spender common.Address, addedValue *big.Int) (*types.Transaction, error) { + return _Erc20.Contract.IncreaseAllowance(&_Erc20.TransactOpts, spender, addedValue) +} + +// IncreaseAllowance is a paid mutator transaction binding the contract method 0x39509351. +// +// Solidity: function increaseAllowance(address spender, uint256 addedValue) returns(bool) +func (_Erc20 *Erc20TransactorSession) IncreaseAllowance(spender common.Address, addedValue *big.Int) (*types.Transaction, error) { + return _Erc20.Contract.IncreaseAllowance(&_Erc20.TransactOpts, spender, addedValue) +} + +// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. +// +// Solidity: function transfer(address to, uint256 amount) returns(bool) +func (_Erc20 *Erc20Transactor) Transfer(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _Erc20.contract.Transact(opts, "transfer", to, amount) +} + +// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. +// +// Solidity: function transfer(address to, uint256 amount) returns(bool) +func (_Erc20 *Erc20Session) Transfer(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _Erc20.Contract.Transfer(&_Erc20.TransactOpts, to, amount) +} + +// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. +// +// Solidity: function transfer(address to, uint256 amount) returns(bool) +func (_Erc20 *Erc20TransactorSession) Transfer(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _Erc20.Contract.Transfer(&_Erc20.TransactOpts, to, amount) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool) +func (_Erc20 *Erc20Transactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _Erc20.contract.Transact(opts, "transferFrom", from, to, amount) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool) +func (_Erc20 *Erc20Session) TransferFrom(from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _Erc20.Contract.TransferFrom(&_Erc20.TransactOpts, from, to, amount) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool) +func (_Erc20 *Erc20TransactorSession) TransferFrom(from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _Erc20.Contract.TransferFrom(&_Erc20.TransactOpts, from, to, amount) +} + +// Erc20ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the Erc20 contract. +type Erc20ApprovalIterator struct { + Event *Erc20Approval // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc20ApprovalIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc20Approval) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc20Approval) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc20ApprovalIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc20ApprovalIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc20Approval represents a Approval event raised by the Erc20 contract. +type Erc20Approval struct { + Owner common.Address + Spender common.Address + Value *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value) +func (_Erc20 *Erc20Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*Erc20ApprovalIterator, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var spenderRule []interface{} + for _, spenderItem := range spender { + spenderRule = append(spenderRule, spenderItem) + } + + logs, sub, err := _Erc20.contract.FilterLogs(opts, "Approval", ownerRule, spenderRule) + if err != nil { + return nil, err + } + return &Erc20ApprovalIterator{contract: _Erc20.contract, event: "Approval", logs: logs, sub: sub}, nil +} + +// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value) +func (_Erc20 *Erc20Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *Erc20Approval, owner []common.Address, spender []common.Address) (event.Subscription, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var spenderRule []interface{} + for _, spenderItem := range spender { + spenderRule = append(spenderRule, spenderItem) + } + + logs, sub, err := _Erc20.contract.WatchLogs(opts, "Approval", ownerRule, spenderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc20Approval) + if err := _Erc20.contract.UnpackLog(event, "Approval", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value) +func (_Erc20 *Erc20Filterer) ParseApproval(log types.Log) (*Erc20Approval, error) { + event := new(Erc20Approval) + if err := _Erc20.contract.UnpackLog(event, "Approval", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Erc20TransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the Erc20 contract. +type Erc20TransferIterator struct { + Event *Erc20Transfer // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc20TransferIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc20Transfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc20Transfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc20TransferIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc20TransferIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc20Transfer represents a Transfer event raised by the Erc20 contract. +type Erc20Transfer struct { + From common.Address + To common.Address + Value *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 value) +func (_Erc20 *Erc20Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*Erc20TransferIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _Erc20.contract.FilterLogs(opts, "Transfer", fromRule, toRule) + if err != nil { + return nil, err + } + return &Erc20TransferIterator{contract: _Erc20.contract, event: "Transfer", logs: logs, sub: sub}, nil +} + +// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 value) +func (_Erc20 *Erc20Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *Erc20Transfer, from []common.Address, to []common.Address) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _Erc20.contract.WatchLogs(opts, "Transfer", fromRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc20Transfer) + if err := _Erc20.contract.UnpackLog(event, "Transfer", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 value) +func (_Erc20 *Erc20Filterer) ParseTransfer(log types.Log) (*Erc20Transfer, error) { + event := new(Erc20Transfer) + if err := _Erc20.contract.UnpackLog(event, "Transfer", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/xchain/bindings/erc721/erc721.go b/core/xchain/bindings/erc721/erc721.go new file mode 100644 index 000000000..c0a513772 --- /dev/null +++ b/core/xchain/bindings/erc721/erc721.go @@ -0,0 +1,1034 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package erc721 + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// Erc721MetaData contains all meta data concerning the Erc721 contract. +var Erc721MetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60806040523480156200001157600080fd5b506040518060400160405280600581526020017f4d794e46540000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d4e465400000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620000b8565b508060019080519060200190620000af929190620000b8565b505050620001cd565b828054620000c69062000168565b90600052602060002090601f016020900481019282620000ea576000855562000136565b82601f106200010557805160ff191683800117855562000136565b8280016001018555821562000136579182015b828111156200013557825182559160200191906001019062000118565b5b50905062000145919062000149565b5090565b5b80821115620001645760008160009055506001016200014a565b5090565b600060028204905060018216806200018157607f821691505b602082108114156200019857620001976200019e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61220680620001dd6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80636352211e1161008c578063a22cb46511610066578063a22cb46514610224578063b88d4fde14610240578063c87b56dd1461025c578063e985e9c51461028c576100cf565b80636352211e146101a657806370a08231146101d657806395d89b4114610206576100cf565b806301ffc9a7146100d457806306fdde0314610104578063081812fc14610122578063095ea7b31461015257806323b872dd1461016e57806342842e0e1461018a575b600080fd5b6100ee60048036038101906100e9919061184f565b6102bc565b6040516100fb9190611b60565b60405180910390f35b61010c61039e565b6040516101199190611b7b565b60405180910390f35b61013c600480360381019061013791906118a1565b610430565b6040516101499190611af9565b60405180910390f35b61016c60048036038101906101679190611813565b610476565b005b6101886004803603810190610183919061170d565b61058e565b005b6101a4600480360381019061019f919061170d565b6105ee565b005b6101c060048036038101906101bb91906118a1565b61060e565b6040516101cd9190611af9565b60405180910390f35b6101f060048036038101906101eb91906116a8565b610695565b6040516101fd9190611cbd565b60405180910390f35b61020e61074d565b60405161021b9190611b7b565b60405180910390f35b61023e600480360381019061023991906117d7565b6107df565b005b61025a6004803603810190610255919061175c565b6107f5565b005b610276600480360381019061027191906118a1565b610857565b6040516102839190611b7b565b60405180910390f35b6102a660048036038101906102a191906116d1565b6108bf565b6040516102b39190611b60565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061038757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610397575061039682610953565b5b9050919050565b6060600080546103ad90611e27565b80601f01602080910402602001604051908101604052809291908181526020018280546103d990611e27565b80156104265780601f106103fb57610100808354040283529160200191610426565b820191906000526020600020905b81548152906001019060200180831161040957829003601f168201915b5050505050905090565b600061043b826109bd565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104818261060e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156104f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e990611c7d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610511610a08565b73ffffffffffffffffffffffffffffffffffffffff161480610540575061053f8161053a610a08565b6108bf565b5b61057f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057690611c9d565b60405180910390fd5b6105898383610a10565b505050565b61059f610599610a08565b82610ac9565b6105de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d590611b9d565b60405180910390fd5b6105e9838383610b5e565b505050565b610609838383604051806020016040528060008152506107f5565b505050565b60008061061a83610e58565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561068c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068390611c5d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fd90611c3d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461075c90611e27565b80601f016020809104026020016040519081016040528092919081815260200182805461078890611e27565b80156107d55780601f106107aa576101008083540402835291602001916107d5565b820191906000526020600020905b8154815290600101906020018083116107b857829003601f168201915b5050505050905090565b6107f16107ea610a08565b8383610e95565b5050565b610806610800610a08565b83610ac9565b610845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083c90611b9d565b60405180910390fd5b61085184848484611002565b50505050565b6060610862826109bd565b600061086c61105e565b9050600081511161088c57604051806020016040528060008152506108b7565b8061089684611075565b6040516020016108a7929190611ad5565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6109c681611199565b610a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fc90611c5d565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610a838361060e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610ad58361060e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b175750610b1681856108bf565b5b80610b5557508373ffffffffffffffffffffffffffffffffffffffff16610b3d84610430565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610b7e8261060e565b73ffffffffffffffffffffffffffffffffffffffff1614610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb90611bdd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3b90611bfd565b60405180910390fd5b610c5183838360016111da565b8273ffffffffffffffffffffffffffffffffffffffff16610c718261060e565b73ffffffffffffffffffffffffffffffffffffffff1614610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90611bdd565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e5383838360016111e0565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb90611c1d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610ff59190611b60565b60405180910390a3505050565b61100d848484610b5e565b611019848484846111e6565b611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f90611bbd565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b6060600060016110848461137d565b01905060008167ffffffffffffffff8111156110c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156110fb5781602001600182028036833780820191505090505b509050600082602001820190505b60011561118e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611178577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b04945060008514156111895761118e565b611109565b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166111bb83610e58565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b60006112078473ffffffffffffffffffffffffffffffffffffffff166115b4565b15611370578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611230610a08565b8786866040518563ffffffff1660e01b81526004016112529493929190611b14565b602060405180830381600087803b15801561126c57600080fd5b505af192505050801561129d57506040513d601f19601f8201168201806040525081019061129a9190611878565b60015b611320573d80600081146112cd576040519150601f19603f3d011682016040523d82523d6000602084013e6112d2565b606091505b50600081511415611318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130f90611bbd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611375565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611401577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816113f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611464576d04ee2d6d415b85acef8100000000838161145a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506020810190505b662386f26fc1000083106114b957662386f26fc1000083816114af577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506010810190505b6305f5e1008310611508576305f5e10083816114fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506008810190505b6127108310611553576127108381611549577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506004810190505b6064831061159c5760648381611592577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506002810190505b600a83106115ab576001810190505b80915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006115ea6115e584611cfd565b611cd8565b90508281526020810184848401111561160257600080fd5b61160d848285611de5565b509392505050565b60008135905061162481612174565b92915050565b6000813590506116398161218b565b92915050565b60008135905061164e816121a2565b92915050565b600081519050611663816121a2565b92915050565b600082601f83011261167a57600080fd5b813561168a8482602086016115d7565b91505092915050565b6000813590506116a2816121b9565b92915050565b6000602082840312156116ba57600080fd5b60006116c884828501611615565b91505092915050565b600080604083850312156116e457600080fd5b60006116f285828601611615565b925050602061170385828601611615565b9150509250929050565b60008060006060848603121561172257600080fd5b600061173086828701611615565b935050602061174186828701611615565b925050604061175286828701611693565b9150509250925092565b6000806000806080858703121561177257600080fd5b600061178087828801611615565b945050602061179187828801611615565b93505060406117a287828801611693565b925050606085013567ffffffffffffffff8111156117bf57600080fd5b6117cb87828801611669565b91505092959194509250565b600080604083850312156117ea57600080fd5b60006117f885828601611615565b92505060206118098582860161162a565b9150509250929050565b6000806040838503121561182657600080fd5b600061183485828601611615565b925050602061184585828601611693565b9150509250929050565b60006020828403121561186157600080fd5b600061186f8482850161163f565b91505092915050565b60006020828403121561188a57600080fd5b600061189884828501611654565b91505092915050565b6000602082840312156118b357600080fd5b60006118c184828501611693565b91505092915050565b6118d381611d71565b82525050565b6118e281611d83565b82525050565b60006118f382611d2e565b6118fd8185611d44565b935061190d818560208601611df4565b61191681611ee8565b840191505092915050565b600061192c82611d39565b6119368185611d55565b9350611946818560208601611df4565b61194f81611ee8565b840191505092915050565b600061196582611d39565b61196f8185611d66565b935061197f818560208601611df4565b80840191505092915050565b6000611998602d83611d55565b91506119a382611ef9565b604082019050919050565b60006119bb603283611d55565b91506119c682611f48565b604082019050919050565b60006119de602583611d55565b91506119e982611f97565b604082019050919050565b6000611a01602483611d55565b9150611a0c82611fe6565b604082019050919050565b6000611a24601983611d55565b9150611a2f82612035565b602082019050919050565b6000611a47602983611d55565b9150611a528261205e565b604082019050919050565b6000611a6a601883611d55565b9150611a75826120ad565b602082019050919050565b6000611a8d602183611d55565b9150611a98826120d6565b604082019050919050565b6000611ab0603d83611d55565b9150611abb82612125565b604082019050919050565b611acf81611ddb565b82525050565b6000611ae1828561195a565b9150611aed828461195a565b91508190509392505050565b6000602082019050611b0e60008301846118ca565b92915050565b6000608082019050611b2960008301876118ca565b611b3660208301866118ca565b611b436040830185611ac6565b8181036060830152611b5581846118e8565b905095945050505050565b6000602082019050611b7560008301846118d9565b92915050565b60006020820190508181036000830152611b958184611921565b905092915050565b60006020820190508181036000830152611bb68161198b565b9050919050565b60006020820190508181036000830152611bd6816119ae565b9050919050565b60006020820190508181036000830152611bf6816119d1565b9050919050565b60006020820190508181036000830152611c16816119f4565b9050919050565b60006020820190508181036000830152611c3681611a17565b9050919050565b60006020820190508181036000830152611c5681611a3a565b9050919050565b60006020820190508181036000830152611c7681611a5d565b9050919050565b60006020820190508181036000830152611c9681611a80565b9050919050565b60006020820190508181036000830152611cb681611aa3565b9050919050565b6000602082019050611cd26000830184611ac6565b92915050565b6000611ce2611cf3565b9050611cee8282611e59565b919050565b6000604051905090565b600067ffffffffffffffff821115611d1857611d17611eb9565b5b611d2182611ee8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000611d7c82611dbb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015611e12578082015181840152602081019050611df7565b83811115611e21576000848401525b50505050565b60006002820490506001821680611e3f57607f821691505b60208210811415611e5357611e52611e8a565b5b50919050565b611e6282611ee8565b810181811067ffffffffffffffff82111715611e8157611e80611eb9565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b61217d81611d71565b811461218857600080fd5b50565b61219481611d83565b811461219f57600080fd5b50565b6121ab81611d8f565b81146121b657600080fd5b50565b6121c281611ddb565b81146121cd57600080fd5b5056fea26469706673582212202e5d7556fc02bbc3bddfeb6b0dbbc8508f28d0b6d07176bb836a46de5dc2028864736f6c63430008040033", +} + +// Erc721ABI is the input ABI used to generate the binding from. +// Deprecated: Use Erc721MetaData.ABI instead. +var Erc721ABI = Erc721MetaData.ABI + +// Erc721Bin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use Erc721MetaData.Bin instead. +var Erc721Bin = Erc721MetaData.Bin + +// DeployErc721 deploys a new Ethereum contract, binding an instance of Erc721 to it. +func DeployErc721(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Erc721, error) { + parsed, err := Erc721MetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(Erc721Bin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Erc721{Erc721Caller: Erc721Caller{contract: contract}, Erc721Transactor: Erc721Transactor{contract: contract}, Erc721Filterer: Erc721Filterer{contract: contract}}, nil +} + +// Erc721 is an auto generated Go binding around an Ethereum contract. +type Erc721 struct { + Erc721Caller // Read-only binding to the contract + Erc721Transactor // Write-only binding to the contract + Erc721Filterer // Log filterer for contract events +} + +// Erc721Caller is an auto generated read-only Go binding around an Ethereum contract. +type Erc721Caller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Erc721Transactor is an auto generated write-only Go binding around an Ethereum contract. +type Erc721Transactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Erc721Filterer is an auto generated log filtering Go binding around an Ethereum contract events. +type Erc721Filterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Erc721Session is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type Erc721Session struct { + Contract *Erc721 // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// Erc721CallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type Erc721CallerSession struct { + Contract *Erc721Caller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// Erc721TransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type Erc721TransactorSession struct { + Contract *Erc721Transactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// Erc721Raw is an auto generated low-level Go binding around an Ethereum contract. +type Erc721Raw struct { + Contract *Erc721 // Generic contract binding to access the raw methods on +} + +// Erc721CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type Erc721CallerRaw struct { + Contract *Erc721Caller // Generic read-only contract binding to access the raw methods on +} + +// Erc721TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type Erc721TransactorRaw struct { + Contract *Erc721Transactor // Generic write-only contract binding to access the raw methods on +} + +// NewErc721 creates a new instance of Erc721, bound to a specific deployed contract. +func NewErc721(address common.Address, backend bind.ContractBackend) (*Erc721, error) { + contract, err := bindErc721(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Erc721{Erc721Caller: Erc721Caller{contract: contract}, Erc721Transactor: Erc721Transactor{contract: contract}, Erc721Filterer: Erc721Filterer{contract: contract}}, nil +} + +// NewErc721Caller creates a new read-only instance of Erc721, bound to a specific deployed contract. +func NewErc721Caller(address common.Address, caller bind.ContractCaller) (*Erc721Caller, error) { + contract, err := bindErc721(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &Erc721Caller{contract: contract}, nil +} + +// NewErc721Transactor creates a new write-only instance of Erc721, bound to a specific deployed contract. +func NewErc721Transactor(address common.Address, transactor bind.ContractTransactor) (*Erc721Transactor, error) { + contract, err := bindErc721(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &Erc721Transactor{contract: contract}, nil +} + +// NewErc721Filterer creates a new log filterer instance of Erc721, bound to a specific deployed contract. +func NewErc721Filterer(address common.Address, filterer bind.ContractFilterer) (*Erc721Filterer, error) { + contract, err := bindErc721(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &Erc721Filterer{contract: contract}, nil +} + +// bindErc721 binds a generic wrapper to an already deployed contract. +func bindErc721(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := Erc721MetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Erc721 *Erc721Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Erc721.Contract.Erc721Caller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Erc721 *Erc721Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Erc721.Contract.Erc721Transactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Erc721 *Erc721Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Erc721.Contract.Erc721Transactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Erc721 *Erc721CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Erc721.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Erc721 *Erc721TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Erc721.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Erc721 *Erc721TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Erc721.Contract.contract.Transact(opts, method, params...) +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address owner) view returns(uint256) +func (_Erc721 *Erc721Caller) BalanceOf(opts *bind.CallOpts, owner common.Address) (*big.Int, error) { + var out []interface{} + err := _Erc721.contract.Call(opts, &out, "balanceOf", owner) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address owner) view returns(uint256) +func (_Erc721 *Erc721Session) BalanceOf(owner common.Address) (*big.Int, error) { + return _Erc721.Contract.BalanceOf(&_Erc721.CallOpts, owner) +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address owner) view returns(uint256) +func (_Erc721 *Erc721CallerSession) BalanceOf(owner common.Address) (*big.Int, error) { + return _Erc721.Contract.BalanceOf(&_Erc721.CallOpts, owner) +} + +// GetApproved is a free data retrieval call binding the contract method 0x081812fc. +// +// Solidity: function getApproved(uint256 tokenId) view returns(address) +func (_Erc721 *Erc721Caller) GetApproved(opts *bind.CallOpts, tokenId *big.Int) (common.Address, error) { + var out []interface{} + err := _Erc721.contract.Call(opts, &out, "getApproved", tokenId) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetApproved is a free data retrieval call binding the contract method 0x081812fc. +// +// Solidity: function getApproved(uint256 tokenId) view returns(address) +func (_Erc721 *Erc721Session) GetApproved(tokenId *big.Int) (common.Address, error) { + return _Erc721.Contract.GetApproved(&_Erc721.CallOpts, tokenId) +} + +// GetApproved is a free data retrieval call binding the contract method 0x081812fc. +// +// Solidity: function getApproved(uint256 tokenId) view returns(address) +func (_Erc721 *Erc721CallerSession) GetApproved(tokenId *big.Int) (common.Address, error) { + return _Erc721.Contract.GetApproved(&_Erc721.CallOpts, tokenId) +} + +// IsApprovedForAll is a free data retrieval call binding the contract method 0xe985e9c5. +// +// Solidity: function isApprovedForAll(address owner, address operator) view returns(bool) +func (_Erc721 *Erc721Caller) IsApprovedForAll(opts *bind.CallOpts, owner common.Address, operator common.Address) (bool, error) { + var out []interface{} + err := _Erc721.contract.Call(opts, &out, "isApprovedForAll", owner, operator) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsApprovedForAll is a free data retrieval call binding the contract method 0xe985e9c5. +// +// Solidity: function isApprovedForAll(address owner, address operator) view returns(bool) +func (_Erc721 *Erc721Session) IsApprovedForAll(owner common.Address, operator common.Address) (bool, error) { + return _Erc721.Contract.IsApprovedForAll(&_Erc721.CallOpts, owner, operator) +} + +// IsApprovedForAll is a free data retrieval call binding the contract method 0xe985e9c5. +// +// Solidity: function isApprovedForAll(address owner, address operator) view returns(bool) +func (_Erc721 *Erc721CallerSession) IsApprovedForAll(owner common.Address, operator common.Address) (bool, error) { + return _Erc721.Contract.IsApprovedForAll(&_Erc721.CallOpts, owner, operator) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_Erc721 *Erc721Caller) Name(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _Erc721.contract.Call(opts, &out, "name") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_Erc721 *Erc721Session) Name() (string, error) { + return _Erc721.Contract.Name(&_Erc721.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_Erc721 *Erc721CallerSession) Name() (string, error) { + return _Erc721.Contract.Name(&_Erc721.CallOpts) +} + +// OwnerOf is a free data retrieval call binding the contract method 0x6352211e. +// +// Solidity: function ownerOf(uint256 tokenId) view returns(address) +func (_Erc721 *Erc721Caller) OwnerOf(opts *bind.CallOpts, tokenId *big.Int) (common.Address, error) { + var out []interface{} + err := _Erc721.contract.Call(opts, &out, "ownerOf", tokenId) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// OwnerOf is a free data retrieval call binding the contract method 0x6352211e. +// +// Solidity: function ownerOf(uint256 tokenId) view returns(address) +func (_Erc721 *Erc721Session) OwnerOf(tokenId *big.Int) (common.Address, error) { + return _Erc721.Contract.OwnerOf(&_Erc721.CallOpts, tokenId) +} + +// OwnerOf is a free data retrieval call binding the contract method 0x6352211e. +// +// Solidity: function ownerOf(uint256 tokenId) view returns(address) +func (_Erc721 *Erc721CallerSession) OwnerOf(tokenId *big.Int) (common.Address, error) { + return _Erc721.Contract.OwnerOf(&_Erc721.CallOpts, tokenId) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_Erc721 *Erc721Caller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _Erc721.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_Erc721 *Erc721Session) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _Erc721.Contract.SupportsInterface(&_Erc721.CallOpts, interfaceId) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_Erc721 *Erc721CallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _Erc721.Contract.SupportsInterface(&_Erc721.CallOpts, interfaceId) +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_Erc721 *Erc721Caller) Symbol(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _Erc721.contract.Call(opts, &out, "symbol") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_Erc721 *Erc721Session) Symbol() (string, error) { + return _Erc721.Contract.Symbol(&_Erc721.CallOpts) +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_Erc721 *Erc721CallerSession) Symbol() (string, error) { + return _Erc721.Contract.Symbol(&_Erc721.CallOpts) +} + +// TokenURI is a free data retrieval call binding the contract method 0xc87b56dd. +// +// Solidity: function tokenURI(uint256 tokenId) view returns(string) +func (_Erc721 *Erc721Caller) TokenURI(opts *bind.CallOpts, tokenId *big.Int) (string, error) { + var out []interface{} + err := _Erc721.contract.Call(opts, &out, "tokenURI", tokenId) + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// TokenURI is a free data retrieval call binding the contract method 0xc87b56dd. +// +// Solidity: function tokenURI(uint256 tokenId) view returns(string) +func (_Erc721 *Erc721Session) TokenURI(tokenId *big.Int) (string, error) { + return _Erc721.Contract.TokenURI(&_Erc721.CallOpts, tokenId) +} + +// TokenURI is a free data retrieval call binding the contract method 0xc87b56dd. +// +// Solidity: function tokenURI(uint256 tokenId) view returns(string) +func (_Erc721 *Erc721CallerSession) TokenURI(tokenId *big.Int) (string, error) { + return _Erc721.Contract.TokenURI(&_Erc721.CallOpts, tokenId) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address to, uint256 tokenId) returns() +func (_Erc721 *Erc721Transactor) Approve(opts *bind.TransactOpts, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _Erc721.contract.Transact(opts, "approve", to, tokenId) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address to, uint256 tokenId) returns() +func (_Erc721 *Erc721Session) Approve(to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _Erc721.Contract.Approve(&_Erc721.TransactOpts, to, tokenId) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address to, uint256 tokenId) returns() +func (_Erc721 *Erc721TransactorSession) Approve(to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _Erc721.Contract.Approve(&_Erc721.TransactOpts, to, tokenId) +} + +// SafeTransferFrom is a paid mutator transaction binding the contract method 0x42842e0e. +// +// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId) returns() +func (_Erc721 *Erc721Transactor) SafeTransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _Erc721.contract.Transact(opts, "safeTransferFrom", from, to, tokenId) +} + +// SafeTransferFrom is a paid mutator transaction binding the contract method 0x42842e0e. +// +// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId) returns() +func (_Erc721 *Erc721Session) SafeTransferFrom(from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _Erc721.Contract.SafeTransferFrom(&_Erc721.TransactOpts, from, to, tokenId) +} + +// SafeTransferFrom is a paid mutator transaction binding the contract method 0x42842e0e. +// +// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId) returns() +func (_Erc721 *Erc721TransactorSession) SafeTransferFrom(from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _Erc721.Contract.SafeTransferFrom(&_Erc721.TransactOpts, from, to, tokenId) +} + +// SafeTransferFrom0 is a paid mutator transaction binding the contract method 0xb88d4fde. +// +// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId, bytes data) returns() +func (_Erc721 *Erc721Transactor) SafeTransferFrom0(opts *bind.TransactOpts, from common.Address, to common.Address, tokenId *big.Int, data []byte) (*types.Transaction, error) { + return _Erc721.contract.Transact(opts, "safeTransferFrom0", from, to, tokenId, data) +} + +// SafeTransferFrom0 is a paid mutator transaction binding the contract method 0xb88d4fde. +// +// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId, bytes data) returns() +func (_Erc721 *Erc721Session) SafeTransferFrom0(from common.Address, to common.Address, tokenId *big.Int, data []byte) (*types.Transaction, error) { + return _Erc721.Contract.SafeTransferFrom0(&_Erc721.TransactOpts, from, to, tokenId, data) +} + +// SafeTransferFrom0 is a paid mutator transaction binding the contract method 0xb88d4fde. +// +// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId, bytes data) returns() +func (_Erc721 *Erc721TransactorSession) SafeTransferFrom0(from common.Address, to common.Address, tokenId *big.Int, data []byte) (*types.Transaction, error) { + return _Erc721.Contract.SafeTransferFrom0(&_Erc721.TransactOpts, from, to, tokenId, data) +} + +// SetApprovalForAll is a paid mutator transaction binding the contract method 0xa22cb465. +// +// Solidity: function setApprovalForAll(address operator, bool approved) returns() +func (_Erc721 *Erc721Transactor) SetApprovalForAll(opts *bind.TransactOpts, operator common.Address, approved bool) (*types.Transaction, error) { + return _Erc721.contract.Transact(opts, "setApprovalForAll", operator, approved) +} + +// SetApprovalForAll is a paid mutator transaction binding the contract method 0xa22cb465. +// +// Solidity: function setApprovalForAll(address operator, bool approved) returns() +func (_Erc721 *Erc721Session) SetApprovalForAll(operator common.Address, approved bool) (*types.Transaction, error) { + return _Erc721.Contract.SetApprovalForAll(&_Erc721.TransactOpts, operator, approved) +} + +// SetApprovalForAll is a paid mutator transaction binding the contract method 0xa22cb465. +// +// Solidity: function setApprovalForAll(address operator, bool approved) returns() +func (_Erc721 *Erc721TransactorSession) SetApprovalForAll(operator common.Address, approved bool) (*types.Transaction, error) { + return _Erc721.Contract.SetApprovalForAll(&_Erc721.TransactOpts, operator, approved) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 tokenId) returns() +func (_Erc721 *Erc721Transactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _Erc721.contract.Transact(opts, "transferFrom", from, to, tokenId) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 tokenId) returns() +func (_Erc721 *Erc721Session) TransferFrom(from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _Erc721.Contract.TransferFrom(&_Erc721.TransactOpts, from, to, tokenId) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 tokenId) returns() +func (_Erc721 *Erc721TransactorSession) TransferFrom(from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _Erc721.Contract.TransferFrom(&_Erc721.TransactOpts, from, to, tokenId) +} + +// Erc721ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the Erc721 contract. +type Erc721ApprovalIterator struct { + Event *Erc721Approval // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc721ApprovalIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc721Approval) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc721Approval) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc721ApprovalIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc721ApprovalIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc721Approval represents a Approval event raised by the Erc721 contract. +type Erc721Approval struct { + Owner common.Address + Approved common.Address + TokenId *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId) +func (_Erc721 *Erc721Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, approved []common.Address, tokenId []*big.Int) (*Erc721ApprovalIterator, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var approvedRule []interface{} + for _, approvedItem := range approved { + approvedRule = append(approvedRule, approvedItem) + } + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + + logs, sub, err := _Erc721.contract.FilterLogs(opts, "Approval", ownerRule, approvedRule, tokenIdRule) + if err != nil { + return nil, err + } + return &Erc721ApprovalIterator{contract: _Erc721.contract, event: "Approval", logs: logs, sub: sub}, nil +} + +// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId) +func (_Erc721 *Erc721Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *Erc721Approval, owner []common.Address, approved []common.Address, tokenId []*big.Int) (event.Subscription, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var approvedRule []interface{} + for _, approvedItem := range approved { + approvedRule = append(approvedRule, approvedItem) + } + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + + logs, sub, err := _Erc721.contract.WatchLogs(opts, "Approval", ownerRule, approvedRule, tokenIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc721Approval) + if err := _Erc721.contract.UnpackLog(event, "Approval", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId) +func (_Erc721 *Erc721Filterer) ParseApproval(log types.Log) (*Erc721Approval, error) { + event := new(Erc721Approval) + if err := _Erc721.contract.UnpackLog(event, "Approval", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Erc721ApprovalForAllIterator is returned from FilterApprovalForAll and is used to iterate over the raw logs and unpacked data for ApprovalForAll events raised by the Erc721 contract. +type Erc721ApprovalForAllIterator struct { + Event *Erc721ApprovalForAll // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc721ApprovalForAllIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc721ApprovalForAll) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc721ApprovalForAll) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc721ApprovalForAllIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc721ApprovalForAllIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc721ApprovalForAll represents a ApprovalForAll event raised by the Erc721 contract. +type Erc721ApprovalForAll struct { + Owner common.Address + Operator common.Address + Approved bool + Raw types.Log // Blockchain specific contextual infos +} + +// FilterApprovalForAll is a free log retrieval operation binding the contract event 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31. +// +// Solidity: event ApprovalForAll(address indexed owner, address indexed operator, bool approved) +func (_Erc721 *Erc721Filterer) FilterApprovalForAll(opts *bind.FilterOpts, owner []common.Address, operator []common.Address) (*Erc721ApprovalForAllIterator, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _Erc721.contract.FilterLogs(opts, "ApprovalForAll", ownerRule, operatorRule) + if err != nil { + return nil, err + } + return &Erc721ApprovalForAllIterator{contract: _Erc721.contract, event: "ApprovalForAll", logs: logs, sub: sub}, nil +} + +// WatchApprovalForAll is a free log subscription operation binding the contract event 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31. +// +// Solidity: event ApprovalForAll(address indexed owner, address indexed operator, bool approved) +func (_Erc721 *Erc721Filterer) WatchApprovalForAll(opts *bind.WatchOpts, sink chan<- *Erc721ApprovalForAll, owner []common.Address, operator []common.Address) (event.Subscription, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _Erc721.contract.WatchLogs(opts, "ApprovalForAll", ownerRule, operatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc721ApprovalForAll) + if err := _Erc721.contract.UnpackLog(event, "ApprovalForAll", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseApprovalForAll is a log parse operation binding the contract event 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31. +// +// Solidity: event ApprovalForAll(address indexed owner, address indexed operator, bool approved) +func (_Erc721 *Erc721Filterer) ParseApprovalForAll(log types.Log) (*Erc721ApprovalForAll, error) { + event := new(Erc721ApprovalForAll) + if err := _Erc721.contract.UnpackLog(event, "ApprovalForAll", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Erc721TransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the Erc721 contract. +type Erc721TransferIterator struct { + Event *Erc721Transfer // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc721TransferIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc721Transfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc721Transfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc721TransferIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc721TransferIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc721Transfer represents a Transfer event raised by the Erc721 contract. +type Erc721Transfer struct { + From common.Address + To common.Address + TokenId *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 indexed tokenId) +func (_Erc721 *Erc721Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address, tokenId []*big.Int) (*Erc721TransferIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + + logs, sub, err := _Erc721.contract.FilterLogs(opts, "Transfer", fromRule, toRule, tokenIdRule) + if err != nil { + return nil, err + } + return &Erc721TransferIterator{contract: _Erc721.contract, event: "Transfer", logs: logs, sub: sub}, nil +} + +// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 indexed tokenId) +func (_Erc721 *Erc721Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *Erc721Transfer, from []common.Address, to []common.Address, tokenId []*big.Int) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + + logs, sub, err := _Erc721.contract.WatchLogs(opts, "Transfer", fromRule, toRule, tokenIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc721Transfer) + if err := _Erc721.contract.UnpackLog(event, "Transfer", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 indexed tokenId) +func (_Erc721 *Erc721Filterer) ParseTransfer(log types.Log) (*Erc721Transfer, error) { + event := new(Erc721Transfer) + if err := _Erc721.contract.UnpackLog(event, "Transfer", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/xchain/bindings/erc777/erc777.go b/core/xchain/bindings/erc777/erc777.go new file mode 100644 index 000000000..517a987d5 --- /dev/null +++ b/core/xchain/bindings/erc777/erc777.go @@ -0,0 +1,1740 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package erc777 + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// Erc777MetaData contains all meta data concerning the Erc777 contract. +var Erc777MetaData = &bind.MetaData{ + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"tokenHolder\",\"type\":\"address\"}],\"name\":\"AuthorizedOperator\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"operatorData\",\"type\":\"bytes\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"operatorData\",\"type\":\"bytes\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"tokenHolder\",\"type\":\"address\"}],\"name\":\"RevokedOperator\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"operatorData\",\"type\":\"bytes\"}],\"name\":\"Sent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"holder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"authorizeOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenHolder\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"defaultOperators\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"granularity\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenHolder\",\"type\":\"address\"}],\"name\":\"isOperatorFor\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"operatorData\",\"type\":\"bytes\"}],\"name\":\"operatorBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"operatorData\",\"type\":\"bytes\"}],\"name\":\"operatorSend\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"revokeOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"send\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"holder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", +} + +// Erc777ABI is the input ABI used to generate the binding from. +// Deprecated: Use Erc777MetaData.ABI instead. +var Erc777ABI = Erc777MetaData.ABI + +// Erc777 is an auto generated Go binding around an Ethereum contract. +type Erc777 struct { + Erc777Caller // Read-only binding to the contract + Erc777Transactor // Write-only binding to the contract + Erc777Filterer // Log filterer for contract events +} + +// Erc777Caller is an auto generated read-only Go binding around an Ethereum contract. +type Erc777Caller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Erc777Transactor is an auto generated write-only Go binding around an Ethereum contract. +type Erc777Transactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Erc777Filterer is an auto generated log filtering Go binding around an Ethereum contract events. +type Erc777Filterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Erc777Session is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type Erc777Session struct { + Contract *Erc777 // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// Erc777CallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type Erc777CallerSession struct { + Contract *Erc777Caller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// Erc777TransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type Erc777TransactorSession struct { + Contract *Erc777Transactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// Erc777Raw is an auto generated low-level Go binding around an Ethereum contract. +type Erc777Raw struct { + Contract *Erc777 // Generic contract binding to access the raw methods on +} + +// Erc777CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type Erc777CallerRaw struct { + Contract *Erc777Caller // Generic read-only contract binding to access the raw methods on +} + +// Erc777TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type Erc777TransactorRaw struct { + Contract *Erc777Transactor // Generic write-only contract binding to access the raw methods on +} + +// NewErc777 creates a new instance of Erc777, bound to a specific deployed contract. +func NewErc777(address common.Address, backend bind.ContractBackend) (*Erc777, error) { + contract, err := bindErc777(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Erc777{Erc777Caller: Erc777Caller{contract: contract}, Erc777Transactor: Erc777Transactor{contract: contract}, Erc777Filterer: Erc777Filterer{contract: contract}}, nil +} + +// NewErc777Caller creates a new read-only instance of Erc777, bound to a specific deployed contract. +func NewErc777Caller(address common.Address, caller bind.ContractCaller) (*Erc777Caller, error) { + contract, err := bindErc777(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &Erc777Caller{contract: contract}, nil +} + +// NewErc777Transactor creates a new write-only instance of Erc777, bound to a specific deployed contract. +func NewErc777Transactor(address common.Address, transactor bind.ContractTransactor) (*Erc777Transactor, error) { + contract, err := bindErc777(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &Erc777Transactor{contract: contract}, nil +} + +// NewErc777Filterer creates a new log filterer instance of Erc777, bound to a specific deployed contract. +func NewErc777Filterer(address common.Address, filterer bind.ContractFilterer) (*Erc777Filterer, error) { + contract, err := bindErc777(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &Erc777Filterer{contract: contract}, nil +} + +// bindErc777 binds a generic wrapper to an already deployed contract. +func bindErc777(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := Erc777MetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Erc777 *Erc777Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Erc777.Contract.Erc777Caller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Erc777 *Erc777Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Erc777.Contract.Erc777Transactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Erc777 *Erc777Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Erc777.Contract.Erc777Transactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Erc777 *Erc777CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Erc777.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Erc777 *Erc777TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Erc777.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Erc777 *Erc777TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Erc777.Contract.contract.Transact(opts, method, params...) +} + +// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. +// +// Solidity: function allowance(address holder, address spender) view returns(uint256) +func (_Erc777 *Erc777Caller) Allowance(opts *bind.CallOpts, holder common.Address, spender common.Address) (*big.Int, error) { + var out []interface{} + err := _Erc777.contract.Call(opts, &out, "allowance", holder, spender) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. +// +// Solidity: function allowance(address holder, address spender) view returns(uint256) +func (_Erc777 *Erc777Session) Allowance(holder common.Address, spender common.Address) (*big.Int, error) { + return _Erc777.Contract.Allowance(&_Erc777.CallOpts, holder, spender) +} + +// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. +// +// Solidity: function allowance(address holder, address spender) view returns(uint256) +func (_Erc777 *Erc777CallerSession) Allowance(holder common.Address, spender common.Address) (*big.Int, error) { + return _Erc777.Contract.Allowance(&_Erc777.CallOpts, holder, spender) +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address tokenHolder) view returns(uint256) +func (_Erc777 *Erc777Caller) BalanceOf(opts *bind.CallOpts, tokenHolder common.Address) (*big.Int, error) { + var out []interface{} + err := _Erc777.contract.Call(opts, &out, "balanceOf", tokenHolder) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address tokenHolder) view returns(uint256) +func (_Erc777 *Erc777Session) BalanceOf(tokenHolder common.Address) (*big.Int, error) { + return _Erc777.Contract.BalanceOf(&_Erc777.CallOpts, tokenHolder) +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address tokenHolder) view returns(uint256) +func (_Erc777 *Erc777CallerSession) BalanceOf(tokenHolder common.Address) (*big.Int, error) { + return _Erc777.Contract.BalanceOf(&_Erc777.CallOpts, tokenHolder) +} + +// Decimals is a free data retrieval call binding the contract method 0x313ce567. +// +// Solidity: function decimals() pure returns(uint8) +func (_Erc777 *Erc777Caller) Decimals(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _Erc777.contract.Call(opts, &out, "decimals") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// Decimals is a free data retrieval call binding the contract method 0x313ce567. +// +// Solidity: function decimals() pure returns(uint8) +func (_Erc777 *Erc777Session) Decimals() (uint8, error) { + return _Erc777.Contract.Decimals(&_Erc777.CallOpts) +} + +// Decimals is a free data retrieval call binding the contract method 0x313ce567. +// +// Solidity: function decimals() pure returns(uint8) +func (_Erc777 *Erc777CallerSession) Decimals() (uint8, error) { + return _Erc777.Contract.Decimals(&_Erc777.CallOpts) +} + +// DefaultOperators is a free data retrieval call binding the contract method 0x06e48538. +// +// Solidity: function defaultOperators() view returns(address[]) +func (_Erc777 *Erc777Caller) DefaultOperators(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _Erc777.contract.Call(opts, &out, "defaultOperators") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// DefaultOperators is a free data retrieval call binding the contract method 0x06e48538. +// +// Solidity: function defaultOperators() view returns(address[]) +func (_Erc777 *Erc777Session) DefaultOperators() ([]common.Address, error) { + return _Erc777.Contract.DefaultOperators(&_Erc777.CallOpts) +} + +// DefaultOperators is a free data retrieval call binding the contract method 0x06e48538. +// +// Solidity: function defaultOperators() view returns(address[]) +func (_Erc777 *Erc777CallerSession) DefaultOperators() ([]common.Address, error) { + return _Erc777.Contract.DefaultOperators(&_Erc777.CallOpts) +} + +// Granularity is a free data retrieval call binding the contract method 0x556f0dc7. +// +// Solidity: function granularity() view returns(uint256) +func (_Erc777 *Erc777Caller) Granularity(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Erc777.contract.Call(opts, &out, "granularity") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Granularity is a free data retrieval call binding the contract method 0x556f0dc7. +// +// Solidity: function granularity() view returns(uint256) +func (_Erc777 *Erc777Session) Granularity() (*big.Int, error) { + return _Erc777.Contract.Granularity(&_Erc777.CallOpts) +} + +// Granularity is a free data retrieval call binding the contract method 0x556f0dc7. +// +// Solidity: function granularity() view returns(uint256) +func (_Erc777 *Erc777CallerSession) Granularity() (*big.Int, error) { + return _Erc777.Contract.Granularity(&_Erc777.CallOpts) +} + +// IsOperatorFor is a free data retrieval call binding the contract method 0xd95b6371. +// +// Solidity: function isOperatorFor(address operator, address tokenHolder) view returns(bool) +func (_Erc777 *Erc777Caller) IsOperatorFor(opts *bind.CallOpts, operator common.Address, tokenHolder common.Address) (bool, error) { + var out []interface{} + err := _Erc777.contract.Call(opts, &out, "isOperatorFor", operator, tokenHolder) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsOperatorFor is a free data retrieval call binding the contract method 0xd95b6371. +// +// Solidity: function isOperatorFor(address operator, address tokenHolder) view returns(bool) +func (_Erc777 *Erc777Session) IsOperatorFor(operator common.Address, tokenHolder common.Address) (bool, error) { + return _Erc777.Contract.IsOperatorFor(&_Erc777.CallOpts, operator, tokenHolder) +} + +// IsOperatorFor is a free data retrieval call binding the contract method 0xd95b6371. +// +// Solidity: function isOperatorFor(address operator, address tokenHolder) view returns(bool) +func (_Erc777 *Erc777CallerSession) IsOperatorFor(operator common.Address, tokenHolder common.Address) (bool, error) { + return _Erc777.Contract.IsOperatorFor(&_Erc777.CallOpts, operator, tokenHolder) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_Erc777 *Erc777Caller) Name(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _Erc777.contract.Call(opts, &out, "name") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_Erc777 *Erc777Session) Name() (string, error) { + return _Erc777.Contract.Name(&_Erc777.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_Erc777 *Erc777CallerSession) Name() (string, error) { + return _Erc777.Contract.Name(&_Erc777.CallOpts) +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_Erc777 *Erc777Caller) Symbol(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _Erc777.contract.Call(opts, &out, "symbol") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_Erc777 *Erc777Session) Symbol() (string, error) { + return _Erc777.Contract.Symbol(&_Erc777.CallOpts) +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_Erc777 *Erc777CallerSession) Symbol() (string, error) { + return _Erc777.Contract.Symbol(&_Erc777.CallOpts) +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_Erc777 *Erc777Caller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Erc777.contract.Call(opts, &out, "totalSupply") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_Erc777 *Erc777Session) TotalSupply() (*big.Int, error) { + return _Erc777.Contract.TotalSupply(&_Erc777.CallOpts) +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_Erc777 *Erc777CallerSession) TotalSupply() (*big.Int, error) { + return _Erc777.Contract.TotalSupply(&_Erc777.CallOpts) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address spender, uint256 value) returns(bool) +func (_Erc777 *Erc777Transactor) Approve(opts *bind.TransactOpts, spender common.Address, value *big.Int) (*types.Transaction, error) { + return _Erc777.contract.Transact(opts, "approve", spender, value) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address spender, uint256 value) returns(bool) +func (_Erc777 *Erc777Session) Approve(spender common.Address, value *big.Int) (*types.Transaction, error) { + return _Erc777.Contract.Approve(&_Erc777.TransactOpts, spender, value) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address spender, uint256 value) returns(bool) +func (_Erc777 *Erc777TransactorSession) Approve(spender common.Address, value *big.Int) (*types.Transaction, error) { + return _Erc777.Contract.Approve(&_Erc777.TransactOpts, spender, value) +} + +// AuthorizeOperator is a paid mutator transaction binding the contract method 0x959b8c3f. +// +// Solidity: function authorizeOperator(address operator) returns() +func (_Erc777 *Erc777Transactor) AuthorizeOperator(opts *bind.TransactOpts, operator common.Address) (*types.Transaction, error) { + return _Erc777.contract.Transact(opts, "authorizeOperator", operator) +} + +// AuthorizeOperator is a paid mutator transaction binding the contract method 0x959b8c3f. +// +// Solidity: function authorizeOperator(address operator) returns() +func (_Erc777 *Erc777Session) AuthorizeOperator(operator common.Address) (*types.Transaction, error) { + return _Erc777.Contract.AuthorizeOperator(&_Erc777.TransactOpts, operator) +} + +// AuthorizeOperator is a paid mutator transaction binding the contract method 0x959b8c3f. +// +// Solidity: function authorizeOperator(address operator) returns() +func (_Erc777 *Erc777TransactorSession) AuthorizeOperator(operator common.Address) (*types.Transaction, error) { + return _Erc777.Contract.AuthorizeOperator(&_Erc777.TransactOpts, operator) +} + +// Burn is a paid mutator transaction binding the contract method 0xfe9d9303. +// +// Solidity: function burn(uint256 amount, bytes data) returns() +func (_Erc777 *Erc777Transactor) Burn(opts *bind.TransactOpts, amount *big.Int, data []byte) (*types.Transaction, error) { + return _Erc777.contract.Transact(opts, "burn", amount, data) +} + +// Burn is a paid mutator transaction binding the contract method 0xfe9d9303. +// +// Solidity: function burn(uint256 amount, bytes data) returns() +func (_Erc777 *Erc777Session) Burn(amount *big.Int, data []byte) (*types.Transaction, error) { + return _Erc777.Contract.Burn(&_Erc777.TransactOpts, amount, data) +} + +// Burn is a paid mutator transaction binding the contract method 0xfe9d9303. +// +// Solidity: function burn(uint256 amount, bytes data) returns() +func (_Erc777 *Erc777TransactorSession) Burn(amount *big.Int, data []byte) (*types.Transaction, error) { + return _Erc777.Contract.Burn(&_Erc777.TransactOpts, amount, data) +} + +// OperatorBurn is a paid mutator transaction binding the contract method 0xfc673c4f. +// +// Solidity: function operatorBurn(address account, uint256 amount, bytes data, bytes operatorData) returns() +func (_Erc777 *Erc777Transactor) OperatorBurn(opts *bind.TransactOpts, account common.Address, amount *big.Int, data []byte, operatorData []byte) (*types.Transaction, error) { + return _Erc777.contract.Transact(opts, "operatorBurn", account, amount, data, operatorData) +} + +// OperatorBurn is a paid mutator transaction binding the contract method 0xfc673c4f. +// +// Solidity: function operatorBurn(address account, uint256 amount, bytes data, bytes operatorData) returns() +func (_Erc777 *Erc777Session) OperatorBurn(account common.Address, amount *big.Int, data []byte, operatorData []byte) (*types.Transaction, error) { + return _Erc777.Contract.OperatorBurn(&_Erc777.TransactOpts, account, amount, data, operatorData) +} + +// OperatorBurn is a paid mutator transaction binding the contract method 0xfc673c4f. +// +// Solidity: function operatorBurn(address account, uint256 amount, bytes data, bytes operatorData) returns() +func (_Erc777 *Erc777TransactorSession) OperatorBurn(account common.Address, amount *big.Int, data []byte, operatorData []byte) (*types.Transaction, error) { + return _Erc777.Contract.OperatorBurn(&_Erc777.TransactOpts, account, amount, data, operatorData) +} + +// OperatorSend is a paid mutator transaction binding the contract method 0x62ad1b83. +// +// Solidity: function operatorSend(address sender, address recipient, uint256 amount, bytes data, bytes operatorData) returns() +func (_Erc777 *Erc777Transactor) OperatorSend(opts *bind.TransactOpts, sender common.Address, recipient common.Address, amount *big.Int, data []byte, operatorData []byte) (*types.Transaction, error) { + return _Erc777.contract.Transact(opts, "operatorSend", sender, recipient, amount, data, operatorData) +} + +// OperatorSend is a paid mutator transaction binding the contract method 0x62ad1b83. +// +// Solidity: function operatorSend(address sender, address recipient, uint256 amount, bytes data, bytes operatorData) returns() +func (_Erc777 *Erc777Session) OperatorSend(sender common.Address, recipient common.Address, amount *big.Int, data []byte, operatorData []byte) (*types.Transaction, error) { + return _Erc777.Contract.OperatorSend(&_Erc777.TransactOpts, sender, recipient, amount, data, operatorData) +} + +// OperatorSend is a paid mutator transaction binding the contract method 0x62ad1b83. +// +// Solidity: function operatorSend(address sender, address recipient, uint256 amount, bytes data, bytes operatorData) returns() +func (_Erc777 *Erc777TransactorSession) OperatorSend(sender common.Address, recipient common.Address, amount *big.Int, data []byte, operatorData []byte) (*types.Transaction, error) { + return _Erc777.Contract.OperatorSend(&_Erc777.TransactOpts, sender, recipient, amount, data, operatorData) +} + +// RevokeOperator is a paid mutator transaction binding the contract method 0xfad8b32a. +// +// Solidity: function revokeOperator(address operator) returns() +func (_Erc777 *Erc777Transactor) RevokeOperator(opts *bind.TransactOpts, operator common.Address) (*types.Transaction, error) { + return _Erc777.contract.Transact(opts, "revokeOperator", operator) +} + +// RevokeOperator is a paid mutator transaction binding the contract method 0xfad8b32a. +// +// Solidity: function revokeOperator(address operator) returns() +func (_Erc777 *Erc777Session) RevokeOperator(operator common.Address) (*types.Transaction, error) { + return _Erc777.Contract.RevokeOperator(&_Erc777.TransactOpts, operator) +} + +// RevokeOperator is a paid mutator transaction binding the contract method 0xfad8b32a. +// +// Solidity: function revokeOperator(address operator) returns() +func (_Erc777 *Erc777TransactorSession) RevokeOperator(operator common.Address) (*types.Transaction, error) { + return _Erc777.Contract.RevokeOperator(&_Erc777.TransactOpts, operator) +} + +// Send is a paid mutator transaction binding the contract method 0x9bd9bbc6. +// +// Solidity: function send(address recipient, uint256 amount, bytes data) returns() +func (_Erc777 *Erc777Transactor) Send(opts *bind.TransactOpts, recipient common.Address, amount *big.Int, data []byte) (*types.Transaction, error) { + return _Erc777.contract.Transact(opts, "send", recipient, amount, data) +} + +// Send is a paid mutator transaction binding the contract method 0x9bd9bbc6. +// +// Solidity: function send(address recipient, uint256 amount, bytes data) returns() +func (_Erc777 *Erc777Session) Send(recipient common.Address, amount *big.Int, data []byte) (*types.Transaction, error) { + return _Erc777.Contract.Send(&_Erc777.TransactOpts, recipient, amount, data) +} + +// Send is a paid mutator transaction binding the contract method 0x9bd9bbc6. +// +// Solidity: function send(address recipient, uint256 amount, bytes data) returns() +func (_Erc777 *Erc777TransactorSession) Send(recipient common.Address, amount *big.Int, data []byte) (*types.Transaction, error) { + return _Erc777.Contract.Send(&_Erc777.TransactOpts, recipient, amount, data) +} + +// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. +// +// Solidity: function transfer(address recipient, uint256 amount) returns(bool) +func (_Erc777 *Erc777Transactor) Transfer(opts *bind.TransactOpts, recipient common.Address, amount *big.Int) (*types.Transaction, error) { + return _Erc777.contract.Transact(opts, "transfer", recipient, amount) +} + +// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. +// +// Solidity: function transfer(address recipient, uint256 amount) returns(bool) +func (_Erc777 *Erc777Session) Transfer(recipient common.Address, amount *big.Int) (*types.Transaction, error) { + return _Erc777.Contract.Transfer(&_Erc777.TransactOpts, recipient, amount) +} + +// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. +// +// Solidity: function transfer(address recipient, uint256 amount) returns(bool) +func (_Erc777 *Erc777TransactorSession) Transfer(recipient common.Address, amount *big.Int) (*types.Transaction, error) { + return _Erc777.Contract.Transfer(&_Erc777.TransactOpts, recipient, amount) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address holder, address recipient, uint256 amount) returns(bool) +func (_Erc777 *Erc777Transactor) TransferFrom(opts *bind.TransactOpts, holder common.Address, recipient common.Address, amount *big.Int) (*types.Transaction, error) { + return _Erc777.contract.Transact(opts, "transferFrom", holder, recipient, amount) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address holder, address recipient, uint256 amount) returns(bool) +func (_Erc777 *Erc777Session) TransferFrom(holder common.Address, recipient common.Address, amount *big.Int) (*types.Transaction, error) { + return _Erc777.Contract.TransferFrom(&_Erc777.TransactOpts, holder, recipient, amount) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address holder, address recipient, uint256 amount) returns(bool) +func (_Erc777 *Erc777TransactorSession) TransferFrom(holder common.Address, recipient common.Address, amount *big.Int) (*types.Transaction, error) { + return _Erc777.Contract.TransferFrom(&_Erc777.TransactOpts, holder, recipient, amount) +} + +// Erc777ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the Erc777 contract. +type Erc777ApprovalIterator struct { + Event *Erc777Approval // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc777ApprovalIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc777Approval) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc777Approval) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc777ApprovalIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc777ApprovalIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc777Approval represents a Approval event raised by the Erc777 contract. +type Erc777Approval struct { + Owner common.Address + Spender common.Address + Value *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value) +func (_Erc777 *Erc777Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*Erc777ApprovalIterator, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var spenderRule []interface{} + for _, spenderItem := range spender { + spenderRule = append(spenderRule, spenderItem) + } + + logs, sub, err := _Erc777.contract.FilterLogs(opts, "Approval", ownerRule, spenderRule) + if err != nil { + return nil, err + } + return &Erc777ApprovalIterator{contract: _Erc777.contract, event: "Approval", logs: logs, sub: sub}, nil +} + +// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value) +func (_Erc777 *Erc777Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *Erc777Approval, owner []common.Address, spender []common.Address) (event.Subscription, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var spenderRule []interface{} + for _, spenderItem := range spender { + spenderRule = append(spenderRule, spenderItem) + } + + logs, sub, err := _Erc777.contract.WatchLogs(opts, "Approval", ownerRule, spenderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc777Approval) + if err := _Erc777.contract.UnpackLog(event, "Approval", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value) +func (_Erc777 *Erc777Filterer) ParseApproval(log types.Log) (*Erc777Approval, error) { + event := new(Erc777Approval) + if err := _Erc777.contract.UnpackLog(event, "Approval", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Erc777AuthorizedOperatorIterator is returned from FilterAuthorizedOperator and is used to iterate over the raw logs and unpacked data for AuthorizedOperator events raised by the Erc777 contract. +type Erc777AuthorizedOperatorIterator struct { + Event *Erc777AuthorizedOperator // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc777AuthorizedOperatorIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc777AuthorizedOperator) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc777AuthorizedOperator) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc777AuthorizedOperatorIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc777AuthorizedOperatorIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc777AuthorizedOperator represents a AuthorizedOperator event raised by the Erc777 contract. +type Erc777AuthorizedOperator struct { + Operator common.Address + TokenHolder common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAuthorizedOperator is a free log retrieval operation binding the contract event 0xf4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f9. +// +// Solidity: event AuthorizedOperator(address indexed operator, address indexed tokenHolder) +func (_Erc777 *Erc777Filterer) FilterAuthorizedOperator(opts *bind.FilterOpts, operator []common.Address, tokenHolder []common.Address) (*Erc777AuthorizedOperatorIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var tokenHolderRule []interface{} + for _, tokenHolderItem := range tokenHolder { + tokenHolderRule = append(tokenHolderRule, tokenHolderItem) + } + + logs, sub, err := _Erc777.contract.FilterLogs(opts, "AuthorizedOperator", operatorRule, tokenHolderRule) + if err != nil { + return nil, err + } + return &Erc777AuthorizedOperatorIterator{contract: _Erc777.contract, event: "AuthorizedOperator", logs: logs, sub: sub}, nil +} + +// WatchAuthorizedOperator is a free log subscription operation binding the contract event 0xf4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f9. +// +// Solidity: event AuthorizedOperator(address indexed operator, address indexed tokenHolder) +func (_Erc777 *Erc777Filterer) WatchAuthorizedOperator(opts *bind.WatchOpts, sink chan<- *Erc777AuthorizedOperator, operator []common.Address, tokenHolder []common.Address) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var tokenHolderRule []interface{} + for _, tokenHolderItem := range tokenHolder { + tokenHolderRule = append(tokenHolderRule, tokenHolderItem) + } + + logs, sub, err := _Erc777.contract.WatchLogs(opts, "AuthorizedOperator", operatorRule, tokenHolderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc777AuthorizedOperator) + if err := _Erc777.contract.UnpackLog(event, "AuthorizedOperator", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseAuthorizedOperator is a log parse operation binding the contract event 0xf4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f9. +// +// Solidity: event AuthorizedOperator(address indexed operator, address indexed tokenHolder) +func (_Erc777 *Erc777Filterer) ParseAuthorizedOperator(log types.Log) (*Erc777AuthorizedOperator, error) { + event := new(Erc777AuthorizedOperator) + if err := _Erc777.contract.UnpackLog(event, "AuthorizedOperator", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Erc777BurnedIterator is returned from FilterBurned and is used to iterate over the raw logs and unpacked data for Burned events raised by the Erc777 contract. +type Erc777BurnedIterator struct { + Event *Erc777Burned // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc777BurnedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc777Burned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc777Burned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc777BurnedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc777BurnedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc777Burned represents a Burned event raised by the Erc777 contract. +type Erc777Burned struct { + Operator common.Address + From common.Address + Amount *big.Int + Data []byte + OperatorData []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBurned is a free log retrieval operation binding the contract event 0xa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098. +// +// Solidity: event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData) +func (_Erc777 *Erc777Filterer) FilterBurned(opts *bind.FilterOpts, operator []common.Address, from []common.Address) (*Erc777BurnedIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + + logs, sub, err := _Erc777.contract.FilterLogs(opts, "Burned", operatorRule, fromRule) + if err != nil { + return nil, err + } + return &Erc777BurnedIterator{contract: _Erc777.contract, event: "Burned", logs: logs, sub: sub}, nil +} + +// WatchBurned is a free log subscription operation binding the contract event 0xa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098. +// +// Solidity: event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData) +func (_Erc777 *Erc777Filterer) WatchBurned(opts *bind.WatchOpts, sink chan<- *Erc777Burned, operator []common.Address, from []common.Address) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + + logs, sub, err := _Erc777.contract.WatchLogs(opts, "Burned", operatorRule, fromRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc777Burned) + if err := _Erc777.contract.UnpackLog(event, "Burned", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBurned is a log parse operation binding the contract event 0xa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098. +// +// Solidity: event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData) +func (_Erc777 *Erc777Filterer) ParseBurned(log types.Log) (*Erc777Burned, error) { + event := new(Erc777Burned) + if err := _Erc777.contract.UnpackLog(event, "Burned", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Erc777MintedIterator is returned from FilterMinted and is used to iterate over the raw logs and unpacked data for Minted events raised by the Erc777 contract. +type Erc777MintedIterator struct { + Event *Erc777Minted // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc777MintedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc777Minted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc777Minted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc777MintedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc777MintedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc777Minted represents a Minted event raised by the Erc777 contract. +type Erc777Minted struct { + Operator common.Address + To common.Address + Amount *big.Int + Data []byte + OperatorData []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterMinted is a free log retrieval operation binding the contract event 0x2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d. +// +// Solidity: event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData) +func (_Erc777 *Erc777Filterer) FilterMinted(opts *bind.FilterOpts, operator []common.Address, to []common.Address) (*Erc777MintedIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _Erc777.contract.FilterLogs(opts, "Minted", operatorRule, toRule) + if err != nil { + return nil, err + } + return &Erc777MintedIterator{contract: _Erc777.contract, event: "Minted", logs: logs, sub: sub}, nil +} + +// WatchMinted is a free log subscription operation binding the contract event 0x2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d. +// +// Solidity: event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData) +func (_Erc777 *Erc777Filterer) WatchMinted(opts *bind.WatchOpts, sink chan<- *Erc777Minted, operator []common.Address, to []common.Address) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _Erc777.contract.WatchLogs(opts, "Minted", operatorRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc777Minted) + if err := _Erc777.contract.UnpackLog(event, "Minted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseMinted is a log parse operation binding the contract event 0x2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d. +// +// Solidity: event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData) +func (_Erc777 *Erc777Filterer) ParseMinted(log types.Log) (*Erc777Minted, error) { + event := new(Erc777Minted) + if err := _Erc777.contract.UnpackLog(event, "Minted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Erc777RevokedOperatorIterator is returned from FilterRevokedOperator and is used to iterate over the raw logs and unpacked data for RevokedOperator events raised by the Erc777 contract. +type Erc777RevokedOperatorIterator struct { + Event *Erc777RevokedOperator // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc777RevokedOperatorIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc777RevokedOperator) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc777RevokedOperator) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc777RevokedOperatorIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc777RevokedOperatorIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc777RevokedOperator represents a RevokedOperator event raised by the Erc777 contract. +type Erc777RevokedOperator struct { + Operator common.Address + TokenHolder common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRevokedOperator is a free log retrieval operation binding the contract event 0x50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa1. +// +// Solidity: event RevokedOperator(address indexed operator, address indexed tokenHolder) +func (_Erc777 *Erc777Filterer) FilterRevokedOperator(opts *bind.FilterOpts, operator []common.Address, tokenHolder []common.Address) (*Erc777RevokedOperatorIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var tokenHolderRule []interface{} + for _, tokenHolderItem := range tokenHolder { + tokenHolderRule = append(tokenHolderRule, tokenHolderItem) + } + + logs, sub, err := _Erc777.contract.FilterLogs(opts, "RevokedOperator", operatorRule, tokenHolderRule) + if err != nil { + return nil, err + } + return &Erc777RevokedOperatorIterator{contract: _Erc777.contract, event: "RevokedOperator", logs: logs, sub: sub}, nil +} + +// WatchRevokedOperator is a free log subscription operation binding the contract event 0x50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa1. +// +// Solidity: event RevokedOperator(address indexed operator, address indexed tokenHolder) +func (_Erc777 *Erc777Filterer) WatchRevokedOperator(opts *bind.WatchOpts, sink chan<- *Erc777RevokedOperator, operator []common.Address, tokenHolder []common.Address) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var tokenHolderRule []interface{} + for _, tokenHolderItem := range tokenHolder { + tokenHolderRule = append(tokenHolderRule, tokenHolderItem) + } + + logs, sub, err := _Erc777.contract.WatchLogs(opts, "RevokedOperator", operatorRule, tokenHolderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc777RevokedOperator) + if err := _Erc777.contract.UnpackLog(event, "RevokedOperator", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRevokedOperator is a log parse operation binding the contract event 0x50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa1. +// +// Solidity: event RevokedOperator(address indexed operator, address indexed tokenHolder) +func (_Erc777 *Erc777Filterer) ParseRevokedOperator(log types.Log) (*Erc777RevokedOperator, error) { + event := new(Erc777RevokedOperator) + if err := _Erc777.contract.UnpackLog(event, "RevokedOperator", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Erc777SentIterator is returned from FilterSent and is used to iterate over the raw logs and unpacked data for Sent events raised by the Erc777 contract. +type Erc777SentIterator struct { + Event *Erc777Sent // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc777SentIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc777Sent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc777Sent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc777SentIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc777SentIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc777Sent represents a Sent event raised by the Erc777 contract. +type Erc777Sent struct { + Operator common.Address + From common.Address + To common.Address + Amount *big.Int + Data []byte + OperatorData []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSent is a free log retrieval operation binding the contract event 0x06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987. +// +// Solidity: event Sent(address indexed operator, address indexed from, address indexed to, uint256 amount, bytes data, bytes operatorData) +func (_Erc777 *Erc777Filterer) FilterSent(opts *bind.FilterOpts, operator []common.Address, from []common.Address, to []common.Address) (*Erc777SentIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _Erc777.contract.FilterLogs(opts, "Sent", operatorRule, fromRule, toRule) + if err != nil { + return nil, err + } + return &Erc777SentIterator{contract: _Erc777.contract, event: "Sent", logs: logs, sub: sub}, nil +} + +// WatchSent is a free log subscription operation binding the contract event 0x06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987. +// +// Solidity: event Sent(address indexed operator, address indexed from, address indexed to, uint256 amount, bytes data, bytes operatorData) +func (_Erc777 *Erc777Filterer) WatchSent(opts *bind.WatchOpts, sink chan<- *Erc777Sent, operator []common.Address, from []common.Address, to []common.Address) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _Erc777.contract.WatchLogs(opts, "Sent", operatorRule, fromRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc777Sent) + if err := _Erc777.contract.UnpackLog(event, "Sent", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseSent is a log parse operation binding the contract event 0x06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987. +// +// Solidity: event Sent(address indexed operator, address indexed from, address indexed to, uint256 amount, bytes data, bytes operatorData) +func (_Erc777 *Erc777Filterer) ParseSent(log types.Log) (*Erc777Sent, error) { + event := new(Erc777Sent) + if err := _Erc777.contract.UnpackLog(event, "Sent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Erc777TransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the Erc777 contract. +type Erc777TransferIterator struct { + Event *Erc777Transfer // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc777TransferIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc777Transfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc777Transfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc777TransferIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc777TransferIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc777Transfer represents a Transfer event raised by the Erc777 contract. +type Erc777Transfer struct { + From common.Address + To common.Address + Value *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 value) +func (_Erc777 *Erc777Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*Erc777TransferIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _Erc777.contract.FilterLogs(opts, "Transfer", fromRule, toRule) + if err != nil { + return nil, err + } + return &Erc777TransferIterator{contract: _Erc777.contract, event: "Transfer", logs: logs, sub: sub}, nil +} + +// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 value) +func (_Erc777 *Erc777Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *Erc777Transfer, from []common.Address, to []common.Address) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _Erc777.contract.WatchLogs(opts, "Transfer", fromRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc777Transfer) + if err := _Erc777.contract.UnpackLog(event, "Transfer", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 value) +func (_Erc777 *Erc777Filterer) ParseTransfer(log types.Log) (*Erc777Transfer, error) { + event := new(Erc777Transfer) + if err := _Erc777.contract.UnpackLog(event, "Transfer", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/xchain/bindings/ierc5313/ierc5313.go b/core/xchain/bindings/ierc5313/ierc5313.go new file mode 100644 index 000000000..0e6ace93e --- /dev/null +++ b/core/xchain/bindings/ierc5313/ierc5313.go @@ -0,0 +1,212 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package ierc5313 + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// Ierc5313MetaData contains all meta data concerning the Ierc5313 contract. +var Ierc5313MetaData = &bind.MetaData{ + ABI: "[{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]", +} + +// Ierc5313ABI is the input ABI used to generate the binding from. +// Deprecated: Use Ierc5313MetaData.ABI instead. +var Ierc5313ABI = Ierc5313MetaData.ABI + +// Ierc5313 is an auto generated Go binding around an Ethereum contract. +type Ierc5313 struct { + Ierc5313Caller // Read-only binding to the contract + Ierc5313Transactor // Write-only binding to the contract + Ierc5313Filterer // Log filterer for contract events +} + +// Ierc5313Caller is an auto generated read-only Go binding around an Ethereum contract. +type Ierc5313Caller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Ierc5313Transactor is an auto generated write-only Go binding around an Ethereum contract. +type Ierc5313Transactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Ierc5313Filterer is an auto generated log filtering Go binding around an Ethereum contract events. +type Ierc5313Filterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Ierc5313Session is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type Ierc5313Session struct { + Contract *Ierc5313 // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// Ierc5313CallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type Ierc5313CallerSession struct { + Contract *Ierc5313Caller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// Ierc5313TransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type Ierc5313TransactorSession struct { + Contract *Ierc5313Transactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// Ierc5313Raw is an auto generated low-level Go binding around an Ethereum contract. +type Ierc5313Raw struct { + Contract *Ierc5313 // Generic contract binding to access the raw methods on +} + +// Ierc5313CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type Ierc5313CallerRaw struct { + Contract *Ierc5313Caller // Generic read-only contract binding to access the raw methods on +} + +// Ierc5313TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type Ierc5313TransactorRaw struct { + Contract *Ierc5313Transactor // Generic write-only contract binding to access the raw methods on +} + +// NewIerc5313 creates a new instance of Ierc5313, bound to a specific deployed contract. +func NewIerc5313(address common.Address, backend bind.ContractBackend) (*Ierc5313, error) { + contract, err := bindIerc5313(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Ierc5313{Ierc5313Caller: Ierc5313Caller{contract: contract}, Ierc5313Transactor: Ierc5313Transactor{contract: contract}, Ierc5313Filterer: Ierc5313Filterer{contract: contract}}, nil +} + +// NewIerc5313Caller creates a new read-only instance of Ierc5313, bound to a specific deployed contract. +func NewIerc5313Caller(address common.Address, caller bind.ContractCaller) (*Ierc5313Caller, error) { + contract, err := bindIerc5313(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &Ierc5313Caller{contract: contract}, nil +} + +// NewIerc5313Transactor creates a new write-only instance of Ierc5313, bound to a specific deployed contract. +func NewIerc5313Transactor(address common.Address, transactor bind.ContractTransactor) (*Ierc5313Transactor, error) { + contract, err := bindIerc5313(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &Ierc5313Transactor{contract: contract}, nil +} + +// NewIerc5313Filterer creates a new log filterer instance of Ierc5313, bound to a specific deployed contract. +func NewIerc5313Filterer(address common.Address, filterer bind.ContractFilterer) (*Ierc5313Filterer, error) { + contract, err := bindIerc5313(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &Ierc5313Filterer{contract: contract}, nil +} + +// bindIerc5313 binds a generic wrapper to an already deployed contract. +func bindIerc5313(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := Ierc5313MetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Ierc5313 *Ierc5313Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Ierc5313.Contract.Ierc5313Caller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Ierc5313 *Ierc5313Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Ierc5313.Contract.Ierc5313Transactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Ierc5313 *Ierc5313Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Ierc5313.Contract.Ierc5313Transactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Ierc5313 *Ierc5313CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Ierc5313.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Ierc5313 *Ierc5313TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Ierc5313.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Ierc5313 *Ierc5313TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Ierc5313.Contract.contract.Transact(opts, method, params...) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_Ierc5313 *Ierc5313Caller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Ierc5313.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_Ierc5313 *Ierc5313Session) Owner() (common.Address, error) { + return _Ierc5313.Contract.Owner(&_Ierc5313.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_Ierc5313 *Ierc5313CallerSession) Owner() (common.Address, error) { + return _Ierc5313.Contract.Owner(&_Ierc5313.CallOpts) +} diff --git a/core/xchain/client_simulator/client_simulator.go b/core/xchain/client_simulator/client_simulator.go new file mode 100644 index 000000000..a8378a998 --- /dev/null +++ b/core/xchain/client_simulator/client_simulator.go @@ -0,0 +1,571 @@ +package client_simulator + +import ( + "context" + "core/xchain/config" + "core/xchain/contracts" + "core/xchain/entitlement" + "core/xchain/examples" + "crypto/ecdsa" + "fmt" + "math/big" + "time" + + node_contracts "github.com/river-build/river/core/node/contracts" + node_crypto "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/dlog" + + xc "core/xchain/common" + + e "core/xchain/contracts" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" +) + +var isEntitled = false + +func toggleCustomEntitlement( + ctx context.Context, + cfg *config.Config, + fromAddress common.Address, + client *ethclient.Client, + privateKey *ecdsa.PrivateKey, +) { + log := dlog.FromCtx(ctx).With("application", "clientSimulator") + + nonce, err := client.PendingNonceAt(context.Background(), fromAddress) + if err != nil { + log.Error("Failed getting PendingNonceAt", "err", err) + return + } + + gasPrice, err := client.SuggestGasPrice(context.Background()) + if err != nil { + log.Error("Failed SuggestGasPrice", "err", err) + return + } + + auth, err := bind.NewKeyedTransactorWithChainID( + privateKey, + big.NewInt(31337), + ) // replace 31337 with your actual chainID + if err != nil { + log.Error("NewKeyedTransactorWithChainID", "err", err) + return + } + auth.Nonce = big.NewInt(int64(nonce)) + auth.Value = big.NewInt(0) // in wei + auth.GasLimit = uint64(30000000) // in units + auth.GasPrice = gasPrice + + mockCustomContract, err := e.NewMockCustomEntitlement( + cfg.GetTestCustomEntitlementContractAddress(), + client, + cfg.GetContractVersion(), + ) + if err != nil { + log.Error("Failed to parse contract ABI", "err", err) + return + } + + isEntitled = !isEntitled + + txn, err := mockCustomContract.SetEntitled(auth, []common.Address{fromAddress}, isEntitled) + if err != nil { + log.Error("Failed to SetEntitled", "err", err) + return + } + + rawBlockNumber := xc.WaitForTransaction(client, txn) + + if rawBlockNumber == nil { + log.Error("Client MockCustomContract SetEntitled failed to mine") + return + } + + log.Info( + "Client SetEntitled mined in block", + "rawBlockNumber", + rawBlockNumber, + "id", + txn.Hash(), + "hex", + txn.Hash().Hex(), + ) +} + +func customEntitlementExample(cfg *config.Config) e.IRuleData { + return e.IRuleData{ + Operations: []e.IRuleEntitlementOperation{ + { + OpType: uint8(entitlement.CHECK), + Index: 0, + }, + }, + CheckOperations: []e.IRuleEntitlementCheckOperation{ + { + OpType: uint8(entitlement.ISENTITLED), + ChainId: big.NewInt(1), + // This contract is deployed on our local base dev chain. + ContractAddress: cfg.GetTestCustomEntitlementContractAddress(), + Threshold: big.NewInt(0), + }, + }, + } +} + +func erc721Example() e.IRuleData { + return e.IRuleData{ + Operations: []e.IRuleEntitlementOperation{ + { + OpType: uint8(entitlement.CHECK), + Index: 0, + }, + }, + CheckOperations: []e.IRuleEntitlementCheckOperation{ + { + OpType: uint8(entitlement.ERC721), + ChainId: examples.EthSepoliaChainId, + // Custom NFT contract example + ContractAddress: examples.EthSepoliaTestNftContract, + Threshold: big.NewInt(1), + }, + }, + } +} + +func erc20Example() e.IRuleData { + return e.IRuleData{ + Operations: []e.IRuleEntitlementOperation{ + { + OpType: uint8(entitlement.CHECK), + Index: 0, + }, + }, + CheckOperations: []e.IRuleEntitlementCheckOperation{ + { + OpType: uint8(entitlement.ERC20), + ChainId: examples.EthSepoliaChainId, + // Chainlink is a good ERC 20 token to use for testing because it's easy to get from faucets. + ContractAddress: examples.EthSepoliaChainlinkContract, + Threshold: big.NewInt(20), + }, + }, + } +} + +type SimulationType int + +// SimulationType Enum +const ( + ERC721 SimulationType = iota + ERC20 + ISENTITLED + TOGGLEISENTITLED +) + +type postResult struct { + transactionId [32]byte + result bool +} + +type ClientSimulator interface { + Start(ctx context.Context) + Stop() + EvaluateRuleData(ctx context.Context, ruleData e.IRuleData) (bool, error) + Wallet() *node_crypto.Wallet +} + +type clientSimulator struct { + cfg *config.Config + + wallet *node_crypto.Wallet + + decoder *node_contracts.EvmErrorDecoder + + entitlementGated *contracts.MockEntitlementGated + entitlementGatedABI *abi.ABI + entitlementGatedContract *bind.BoundContract + + checker *contracts.IEntitlementChecker + checkerABI *abi.ABI + checkerContract *bind.BoundContract + + baseChain *node_crypto.Blockchain + ownsChain bool + + checkRequests chan [32]byte + resultPosted chan postResult +} + +// Enforce interface +var _ ClientSimulator = &clientSimulator{} + +func New( + ctx context.Context, + cfg *config.Config, + baseChain *node_crypto.Blockchain, + wallet *node_crypto.Wallet, +) (ClientSimulator, error) { + entitlementGated, err := e.NewMockEntitlementGated( + cfg.GetMockEntitlementContractAddress(), + nil, + cfg.GetContractVersion(), + ) + if err != nil { + return nil, err + } + checker, err := e.NewIEntitlementChecker(cfg.GetEntitlementContractAddress(), nil, cfg.GetContractVersion()) + if err != nil { + return nil, err + } + + var ( + entitlementGatedABI = entitlementGated.GetAbi() + entitlementGatedContract = bind.NewBoundContract( + cfg.GetMockEntitlementContractAddress(), + *entitlementGated.GetAbi(), + nil, + nil, + nil, + ) + + checkerABI = checker.GetAbi() + checkerContract = bind.NewBoundContract(cfg.GetEntitlementContractAddress(), *checker.GetAbi(), nil, nil, nil) + ) + + var ownsChain bool + if baseChain == nil { + ownsChain = true + baseChain, err = node_crypto.NewBlockchain(ctx, &cfg.BaseChain, wallet) + if err != nil { + return nil, err + } + go baseChain.ChainMonitor.RunWithBlockPeriod( + ctx, + baseChain.Client, + baseChain.InitialBlockNum, + time.Duration(cfg.BaseChain.BlockTimeMs)*time.Millisecond, + ) + } + + decoder, err := node_contracts.NewEVMErrorDecoder(entitlementGated.GetMetadata(), checker.GetMetadata()) + if err != nil { + return nil, err + } + + return &clientSimulator{ + cfg, + wallet, + decoder, + entitlementGated, + entitlementGatedABI, + entitlementGatedContract, + checker, + checkerABI, + checkerContract, + baseChain, + ownsChain, + make(chan [32]byte, 256), + make(chan postResult, 256), + }, nil +} + +func (cs *clientSimulator) Stop() { + cs.baseChain.Close() +} + +func (cs *clientSimulator) Start(ctx context.Context) { + cs.baseChain.ChainMonitor.OnContractWithTopicsEvent( + cs.cfg.GetMockEntitlementContractAddress(), + [][]common.Hash{{cs.entitlementGatedABI.Events["EntitlementCheckResultPosted"].ID}}, + func(ctx context.Context, event types.Log) { + cs.onEntitlementCheckResultPosted(ctx, event, cs.resultPosted) + }, + ) + + dlog.FromCtx(ctx). + With("application", "clientSimulator"). + Info("check requested topics", "topics", cs.checkerABI.Events["EntitlementCheckRequested"].ID) + + cs.baseChain.ChainMonitor.OnContractWithTopicsEvent( + cs.cfg.GetEntitlementContractAddress(), + [][]common.Hash{{cs.checkerABI.Events["EntitlementCheckRequested"].ID}}, + func(ctx context.Context, event types.Log) { + cs.onEntitlementCheckRequested(ctx, event, cs.checkRequests) + }, + ) +} + +func (cs *clientSimulator) executeCheck(ctx context.Context, ruleData *e.IRuleData) error { + log := dlog.FromCtx(ctx).With("application", "clientSimulator") + + pendingTx, err := cs.baseChain.TxPool.Submit( + ctx, + "RequestEntitlementCheck", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + gated, err := contracts.NewMockEntitlementGated( + cs.cfg.GetMockEntitlementContractAddress(), + cs.baseChain.Client, + cs.cfg.GetContractVersion(), + ) + if err != nil { + return nil, err + } + return gated.RequestEntitlementCheck(opts, big.NewInt(0), *ruleData) + }, + ) + + log.Info("Submitted entitlement check...") + + customErr, stringErr, err := cs.decoder.DecodeEVMError(err) + switch { + case customErr != nil: + log.Error("Failed to submit entitlement check", "err", customErr) + return err + case stringErr != nil: + log.Error("Failed to submit entitlement check", "err", stringErr) + return err + case err != nil: + log.Error("Failed to submit entitlement check", "err", err) + return err + } + + receipt := <-pendingTx.Wait() + log.Info("Entitlement check mined", "receipt", receipt) + if receipt.Status == types.ReceiptStatusFailed { + log.Error("Failed to execute check - could not execute transaction") + return fmt.Errorf("failed to execute check - could not execute transaction") + } + return nil +} + +func (cs *clientSimulator) waitForNextRequest(ctx context.Context) ([32]byte, error) { + log := dlog.FromCtx(ctx).With("application", "clientSimulator") + + ctx, cancel := context.WithTimeout(ctx, time.Second*60) + defer cancel() + + for { + select { + case transactionId := <-cs.checkRequests: + log.Info("Detected entitlement check request", "TransactionId", transactionId) + return transactionId, nil + + case <-ctx.Done(): + log.Error("Timed out waiting for request") + return [32]byte{}, ctx.Err() + } + } +} + +func (cs *clientSimulator) waitForPostResult(ctx context.Context, txnId [32]byte) (bool, error) { + log := dlog.FromCtx(ctx).With("application", "clientSimulator") + + ctx, cancel := context.WithTimeout(ctx, time.Second*60) + defer cancel() + + for { + select { + case result := <-cs.resultPosted: + if result.transactionId != txnId { + log.Error( + "Received result for unexpected transaction", + "TransactionId", + result.transactionId, + "Expected", + txnId, + ) + return false, fmt.Errorf("received result for unexpected transaction") + } + log.Info( + "Detected entitlement check result", + "TransactionId", + result.transactionId, + "Result", + result.result, + ) + return result.result, nil + + case <-ctx.Done(): + log.Error("Timed out waiting for result") + return false, ctx.Err() + } + } +} + +func (cs *clientSimulator) onEntitlementCheckResultPosted( + ctx context.Context, + event types.Log, + postedResults chan postResult, +) { + entitlementCheckResultPosted := cs.entitlementGated.EntitlementCheckResultPosted(cs.cfg.GetContractVersion()) + log := dlog.FromCtx(ctx).With("application", "clientSimulator").With("function", "onEntitlementCheckResultPosted") + + log.Info( + "Unpacking EntitlementCheckResultPosted event", + "event", + event, + "entitlementCheckResultPosted", + entitlementCheckResultPosted, + ) + + if err := cs.entitlementGatedContract.UnpackLog(entitlementCheckResultPosted.Raw(), "EntitlementCheckResultPosted", event); err != nil { + log.Error("Failed to unpack EntitlementCheckResultPosted event", "err", err) + return + } + + log.Info("Received EntitlementCheckResultPosted event", + "TransactionId", entitlementCheckResultPosted.TransactionID(), + "Result", entitlementCheckResultPosted.Result(), + ) + + postedResults <- postResult{ + transactionId: entitlementCheckResultPosted.TransactionID(), + result: entitlementCheckResultPosted.Result() == contracts.NodeVoteStatus__PASSED, + } +} + +func (cs *clientSimulator) onEntitlementCheckRequested( + ctx context.Context, + event types.Log, + checkRequests chan [32]byte, +) { + entitlementCheckRequest := cs.checker.EntitlementCheckRequestEvent() + log := dlog.FromCtx(ctx).With("application", "clientSimulator").With("function", "onEntitlementCheckRequested") + + log.Info( + "Unpacking EntitlementCheckRequested event", + "event", + event, + "entitlementCheckRequest", + entitlementCheckRequest, + ) + + if err := cs.checkerContract.UnpackLog(entitlementCheckRequest.Raw(), "EntitlementCheckRequested", event); err != nil { + log.Error("Failed to unpack EntitlementCheckRequested event", "err", err) + return + } + + log.Info("Received EntitlementCheckRequested event", + "TransactionId", entitlementCheckRequest.TransactionID(), + "selectedNodes", entitlementCheckRequest.SelectedNodes(), + ) + + checkRequests <- entitlementCheckRequest.TransactionID() +} + +func (cs *clientSimulator) Wallet() *node_crypto.Wallet { + return cs.wallet +} + +func (cs *clientSimulator) EvaluateRuleData(ctx context.Context, ruleData e.IRuleData) (bool, error) { + log := dlog.FromCtx(ctx).With("application", "clientSimulator") + + err := cs.executeCheck(ctx, &ruleData) + if err != nil { + log.Error("Failed to execute entitlement check", "err", err) + return false, err + } + + log.Info("ClientSimulator waiting for request to publish") + txId, err := cs.waitForNextRequest(ctx) + if err != nil { + log.Error("Failed to wait for request", "err", err) + return false, err + } else { + log.Info("ClientSimulator logged entitlement check request", + "TransactionId", txId, + ) + } + + log.Info("ClientSimulator waiting for result") + result, err := cs.waitForPostResult(ctx, txId) + if err != nil { + log.Error("Failed to wait for result", "err", err) + return false, err + } + log.Info("ClientSimulator logged entitlement check result", "Result", result) + return result, nil +} + +func RunClientSimulator(ctx context.Context, cfg *config.Config, wallet *node_crypto.Wallet, simType SimulationType) { + if simType == TOGGLEISENTITLED { + ToggleEntitlement(ctx, cfg, wallet) + return + } + + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + log := dlog.FromCtx(ctx).With("application", "clientSimulator") + log.Info("--- ClientSimulator starting", "simType", simType) + + cs, err := New(ctx, cfg, nil, wallet) + if err != nil { + log.Error("--- Failed to create clientSimulator", "err", err) + return + } + cs.Start(ctx) + defer cs.Stop() + + var ruleData e.IRuleData + switch simType { + case ERC721: + ruleData = erc721Example() + case ERC20: + ruleData = erc20Example() + case ISENTITLED: + ruleData = customEntitlementExample(cfg) + default: + log.Error("--- ClientSimulator invalid SimulationType", "simType", simType) + return + } + + cs.EvaluateRuleData(ctx, ruleData) +} + +func ToggleEntitlement(ctx context.Context, cfg *config.Config, wallet *node_crypto.Wallet) { + log := dlog.FromCtx(ctx).With("application", "clientSimulator") + + privateKey := wallet.PrivateKeyStruct + publicKey := privateKey.Public() + publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey) + if !ok { + log.Error("error casting public key to ECDSA") + return + } + + fromAddress := crypto.PubkeyToAddress(*publicKeyECDSA) + + log.Info("ClientSimulator fromAddress", "fromAddress", fromAddress.Hex()) + + baseWebsocketURL, err := xc.ConvertHTTPToWebSocket(cfg.BaseChain.NetworkUrl) + if err != nil { + log.Error("Failed to convert BaseChain HTTP to WebSocket", "err", err) + return + } + + client, err := ethclient.Dial(baseWebsocketURL) + if err != nil { + log.Error("Failed to connect to the Ethereum client", "err", err) + return + } + log.Info("ClientSimulator connected to Ethereum client") + + bc := context.Background() + var result interface{} + err = client.Client().CallContext(bc, &result, "anvil_setBalance", fromAddress, 1_000_000_000_000_000_000) + if err != nil { + log.Info("Failed call anvil_setBalance %v", err) + return + } + log.Info("ClientSimulator add funds on anvil to wallet address", "result", result) + + toggleCustomEntitlement(ctx, cfg, fromAddress, client, privateKey) +} diff --git a/core/xchain/cmd/config_cmd.go b/core/xchain/cmd/config_cmd.go new file mode 100644 index 000000000..b7e445ce2 --- /dev/null +++ b/core/xchain/cmd/config_cmd.go @@ -0,0 +1,46 @@ +package cmd + +import ( + "fmt" + + "github.com/mitchellh/mapstructure" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "gopkg.in/yaml.v3" +) + +func init() { + cmd := &cobra.Command{ + Use: "config", + Short: "Print config", + Run: func(cmd *cobra.Command, args []string) { + fmt.Println("Viper settings:") + fmt.Println() + + for key, value := range viper.AllSettings() { + fmt.Printf("%s: %v\n", key, value) + } + + fmt.Println() + fmt.Println("Resulting config:") + fmt.Println() + + configMap := make(map[string]interface{}) + cfg := loadedCfg + if err := mapstructure.Decode(cfg, &configMap); err != nil { + fmt.Printf("Failed to decode config struct: %v\n", err) + return + } + + yamlData, err := yaml.Marshal(configMap) + if err != nil { + fmt.Printf("Failed to marshal config map to YAML: %v\n", err) + return + } + + fmt.Println(string(yamlData)) + }, + } + + rootCmd.AddCommand(cmd) +} diff --git a/core/xchain/cmd/genkey_cmd.go b/core/xchain/cmd/genkey_cmd.go new file mode 100644 index 000000000..50570bf35 --- /dev/null +++ b/core/xchain/cmd/genkey_cmd.go @@ -0,0 +1,55 @@ +package cmd + +import ( + "context" + "os" + + "github.com/river-build/river/core/node/crypto" + + "github.com/spf13/cobra" +) + +func genkey(overwrite bool) error { + ctx := context.Background() // lint:ignore context.Background() is fine here + + wallet, err := crypto.NewWallet(ctx) + if err != nil { + return err + } + + err = os.MkdirAll(crypto.WALLET_PATH, 0o755) + if err != nil { + return err + } + + err = wallet.SaveWallet( + ctx, + crypto.WALLET_PATH_PRIVATE_KEY, + crypto.WALLET_PATH_PUBLIC_KEY, + crypto.WALLET_PATH_NODE_ADDRESS, + overwrite, + ) + if err != nil { + return err + } + + return nil +} + +func init() { + cmd := &cobra.Command{ + Use: "genkey", + Short: "Generate a new node key pair", + RunE: func(cmd *cobra.Command, args []string) error { + overwrite, err := cmd.Flags().GetBool("overwrite") + if err != nil { + return err + } + return genkey(overwrite) + }, + } + + cmd.Flags().Bool("overwrite", false, "Overwrite existing key files") + + rootCmd.AddCommand(cmd) +} diff --git a/core/xchain/cmd/register_node_cmd.go b/core/xchain/cmd/register_node_cmd.go new file mode 100644 index 000000000..1dae74dc7 --- /dev/null +++ b/core/xchain/cmd/register_node_cmd.go @@ -0,0 +1,161 @@ +package cmd + +import ( + "bufio" + "context" + "core/xchain/contracts" + "core/xchain/util" + "fmt" + "os" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core/types" + node_contracts "github.com/river-build/river/core/node/contracts" + "github.com/river-build/river/core/node/crypto" + "github.com/spf13/cobra" +) + +var ( + registerCmd = &cobra.Command{ + Use: "register ", + Short: "Register xchain node", + Args: cobra.ExactArgs(1), + RunE: register, + } + + unregisterCmd = &cobra.Command{ + Use: "unregister ", + Short: "Unregister xchain node", + Args: cobra.ExactArgs(1), + RunE: unregister, + } +) + +func init() { + registerCmd.Flags().Bool("approve", false, "automatically approve registration transaction") + unregisterCmd.Flags().Bool("approve", false, "automatically approve unregistration transaction") + + rootCmd.AddCommand(registerCmd) + rootCmd.AddCommand(unregisterCmd) +} + +func register(cmd *cobra.Command, args []string) error { + var ( + operatorKeyfile = args[0] + userConfirmationMessage = "Register xchain node '%s' from operator '%s'?\n" + autoApproval, _ = cmd.Flags().GetBool("approve") + ) + return registerImpl(operatorKeyfile, userConfirmationMessage, true, autoApproval) +} + +func unregister(cmd *cobra.Command, args []string) error { + var ( + operatorKeyfile = args[0] + userConfirmationMessage = "Unregister xchain node '%s' from operator '%s'?\n" + autoApproval, _ = cmd.Flags().GetBool("approve") + ) + return registerImpl(operatorKeyfile, userConfirmationMessage, false, autoApproval) +} + +func registerImpl(operatorKeyfile string, userConfirmationMessage string, register bool, autoApprove bool) error { + var ( + ctx, cancel = context.WithTimeout(context.Background(), time.Minute) + xchainWallet, xWalletErr = util.LoadWallet(ctx) + operatorWallet, oWalletErr = crypto.LoadWallet(ctx, operatorKeyfile) + entitlementGatedMetaData = contracts.NewEntitlementGatedMetaData(loadedCfg.GetContractVersion()) + ) + defer cancel() + + if xWalletErr != nil { + return fmt.Errorf("unable to load xchain wallet: %s", xWalletErr) + } + if oWalletErr != nil { + return fmt.Errorf("unable to load operator wallet: %s", oWalletErr) + } + + fmt.Printf(userConfirmationMessage, xchainWallet.Address, operatorWallet.Address) + if !autoApprove && !askUserConfirmation() { + return nil + } + + baseChain, err := crypto.NewBlockchain(ctx, &loadedCfg.BaseChain, operatorWallet) + if err != nil { + return fmt.Errorf("unable to instantiate base chain client: %s", err) + } + go baseChain.ChainMonitor.RunWithBlockPeriod( + ctx, + baseChain.Client, + 0, + time.Duration(loadedCfg.BaseChain.BlockTimeMs)*time.Millisecond, + ) + + checker, err := contracts.NewIEntitlementChecker( + loadedCfg.GetEntitlementContractAddress(), baseChain.Client, loadedCfg.GetContractVersion()) + if err != nil { + return err + } + + decoder, err := node_contracts.NewEVMErrorDecoder(checker.GetMetadata(), entitlementGatedMetaData.GetMetadata()) + if err != nil { + return err + } + + pendingTx, err := baseChain.TxPool.Submit( + ctx, + "RegisterNode or maybe UnregisterNode", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + if err != nil { + return nil, err + } + if register { + return checker.RegisterNode(opts, xchainWallet.Address) + } + return checker.UnregisterNode(opts, xchainWallet.Address) + }, + ) + + ce, se, err := decoder.DecodeEVMError(err) + switch { + case ce != nil: + if register && ce.DecodedError.Sig == "EntitlementChecker_NodeAlreadyRegistered()" { + fmt.Println("node is already registered") + return nil + } + if !register && ce.DecodedError.Sig == "EntitlementChecker_NodeNotRegistered()" { + fmt.Println("node isn't registered") + return nil + } + return ce + case se != nil: + return se + case err != nil: + return err + } + + receipt := <-pendingTx.Wait() + if receipt == nil || receipt.Status != crypto.TransactionResultSuccess { + return fmt.Errorf("transaction failed") + } + + if register { + fmt.Printf("xchain node %s registered\n", xchainWallet.Address) + } else { + fmt.Printf("xchain node %s unregistered\n", xchainWallet.Address) + } + + baseChain.Close() + + return nil +} + +func askUserConfirmation() bool { + fmt.Println("Please confirm [y/N]") + reader := bufio.NewReader(os.Stdin) + + char, _, err := reader.ReadRune() + if err != nil { + panic(fmt.Sprintf("unable to ask user for confirmation")) + } + return char == 'y' || char == 'Y' +} diff --git a/core/xchain/cmd/root_cmd.go b/core/xchain/cmd/root_cmd.go new file mode 100644 index 000000000..1559d69cf --- /dev/null +++ b/core/xchain/cmd/root_cmd.go @@ -0,0 +1,116 @@ +package cmd + +import ( + "core/xchain/config" + "fmt" + "os" + "strings" + + sconfig "github.com/river-build/river/core/node/config" + "github.com/river-build/river/core/node/infra" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +var configFile string + +var ( + logLevel string + logFile string + logToConsole bool + logNoColor bool + + loadedCfg *config.Config +) + +var rootCmd = &cobra.Command{ + Use: "xchain_node", + Short: "Towns.com xchain node", +} + +func Execute() { + err := rootCmd.Execute() + if err != nil { + os.Exit(1) + } +} + +func initConfigAndLog() { + if configFile != "" { + viper.SetConfigFile(configFile) + + // This is needed to allow for nested config values to be set via environment variables + // For example: METRICS__ENABLED=true, METRICS__PORT=8080 + viper.SetEnvKeyReplacer(strings.NewReplacer(".", "__")) + viper.AutomaticEnv() + + if err := viper.ReadInConfig(); err != nil { + fmt.Printf("Failed to read config file, file=%v, error=%v\n", configFile, err) + } + + var configStruct config.Config + if err := viper.Unmarshal(&configStruct, viper.DecodeHook(sconfig.DecodeDurationHook())); err != nil { + fmt.Printf("Failed to unmarshal config, error=%v\n", err) + } + + configStruct.Init() + + if configStruct.Log.Format == "" { + configStruct.Log.Format = "text" + } + + if logLevel != "" { + configStruct.Log.Level = logLevel + } + if logFile != "default" { + if logFile != "none" { + configStruct.Log.File = logFile + } else { + configStruct.Log.File = "" + } + } + if logToConsole { + configStruct.Log.Console = true + } + if logNoColor { + configStruct.Log.NoColor = true + } + + loadedCfg = &configStruct + infra.InitLogFromConfig(&loadedCfg.Log) + } else { + fmt.Println("No config file specified") + } +} + +func init() { + cobra.OnInitialize(initConfigAndLog) + rootCmd.PersistentFlags(). + StringVarP(&configFile, "config", "c", "./config/config.yaml", "Path to the configuration file") + + rootCmd.PersistentFlags().StringVarP( + &logLevel, + "log_level", + "l", + "", + "Override log level (options: trace, debug, info, warn, error, panic, fatal)", + ) + rootCmd.PersistentFlags().StringVar( + &logFile, + "log_file", + "default", + "Override log file ('default' to use the one specified in the config file, 'none' to disable logging to file)", + ) + rootCmd.PersistentFlags().BoolVar( + &logToConsole, + "log_to_console", + false, + "Override log to console (true to log to console, false to use the one specified in the config file)", + ) + rootCmd.PersistentFlags().BoolVar( + &logNoColor, + "log_no_color", + false, + "Override log color (true to disable color, false to use the one specified in the config file)", + ) +} diff --git a/core/xchain/cmd/run_cmd.go b/core/xchain/cmd/run_cmd.go new file mode 100644 index 000000000..ed7f717aa --- /dev/null +++ b/core/xchain/cmd/run_cmd.go @@ -0,0 +1,64 @@ +package cmd + +import ( + "context" + "core/xchain/server" + "os" + "os/signal" + "sync" + "syscall" + + "github.com/spf13/cobra" +) + +func run() error { + // cfg := config.GetConfig() + // if cfg.Metrics.Enabled { + // // Since the xchain server runs alongside the stream node + // // we don't need to start the metrics service here + // go infra.StartMetricsService(ctx, cfg.Metrics) + // } + + var ( + ctx = context.Background() + tasks sync.WaitGroup + ) + + // create xchain instance + srv, err := server.New(ctx, loadedCfg, nil, 1) + if err != nil { + return err + } + + // run server in background + tasks.Add(1) + go func() { + srv.Run(ctx) + tasks.Done() + }() + + // wait for signal to shut down + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) + <-interrupt + + // order background task to stop + srv.Stop() + + // wait for background tasks to finish + tasks.Wait() + + return nil +} + +func init() { + cmd := &cobra.Command{ + Use: "run", + Short: "Runs the node", + RunE: func(cmd *cobra.Command, args []string) error { + return run() + }, + } + + rootCmd.AddCommand(cmd) +} diff --git a/core/xchain/cmd/run_cs.go b/core/xchain/cmd/run_cs.go new file mode 100644 index 000000000..1760abb2d --- /dev/null +++ b/core/xchain/cmd/run_cs.go @@ -0,0 +1,100 @@ +package cmd + +import ( + "bufio" + "context" + xc "core/xchain/client_simulator" + "core/xchain/util" + "log" + "os" + "os/signal" + "syscall" + + "github.com/river-build/river/core/node/dlog" + "github.com/spf13/cobra" +) + +func keyboardInput(input chan rune) { + // Create a new reader to read from standard input + reader := bufio.NewReader(os.Stdin) + + log.Println("Press:") + log.Println(" - 'q' to Exit") + log.Println(" - 'a' to simulate ERC20") + log.Println(" - 'b' to simulate ERC721") + log.Println(" - 'c' to simulate custom IsEntitled") + log.Println(" - 'd' to toggle custom IsEntitled") + + for { + // Read a single character + char, _, err := reader.ReadRune() + if err != nil { + log.Fatal(err) + } + input <- char + } +} + +func runClientSimulator() error { + bc := context.Background() + pid := os.Getpid() + + log := dlog.FromCtx(bc).With("pid", pid) + log.Info("Main started") + input := make(chan rune) + + go func() { + keyboardInput(input) + }() + + wallet, err := util.LoadWallet(bc) + if err != nil { + log.Error("error finding wallet") + return err + } + + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) + +out: + + for { + log.Info("Main Loop") + select { + case char := <-input: + log.Info("Input", "char", char) + switch char { + case 'a': + go xc.RunClientSimulator(bc, loadedCfg, wallet, xc.ERC20) + case 'b': + go xc.RunClientSimulator(bc, loadedCfg, wallet, xc.ERC721) + case 'c': + go xc.RunClientSimulator(bc, loadedCfg, wallet, xc.ISENTITLED) + case 'd': + go xc.RunClientSimulator(bc, loadedCfg, wallet, xc.TOGGLEISENTITLED) + case 'q': + log.Info("Quit Exit") + break out + } + + case <-interrupt: + log.Info("Main Interrupted") + break out + } + } + + log.Info("Shutdown") + return nil +} + +func init() { + cmd := &cobra.Command{ + Use: "run-cs", + Short: "Runs the client simulator", + RunE: func(cmd *cobra.Command, args []string) error { + return runClientSimulator() + }, + } + + rootCmd.AddCommand(cmd) +} diff --git a/core/xchain/common/common.go b/core/xchain/common/common.go new file mode 100644 index 000000000..c21f915bc --- /dev/null +++ b/core/xchain/common/common.go @@ -0,0 +1,185 @@ +package common + +import ( + "context" + "encoding/json" + "fmt" + "math/big" + "net/url" + "strings" + "sync" + "time" + + "github.com/river-build/river/core/node/dlog" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/rpc" +) + +var loadAddressesOnce sync.Once + +func ConvertHTTPToWebSocket(httpURL string) (string, error) { + // Parse the URL + parsedURL, err := url.Parse(httpURL) + if err != nil { + return "", err + } + + // Change the scheme based on the original + switch parsedURL.Scheme { + case "http": + parsedURL.Scheme = "ws" + case "https": + parsedURL.Scheme = "wss" + case "ws": + parsedURL.Scheme = "ws" + case "wss": + parsedURL.Scheme = "wss" + default: + return "", fmt.Errorf("unexpected scheme: %s", parsedURL.Scheme) + } + + // Return the modified URL + return parsedURL.String(), nil +} + +const requiredBalance = 10000000000000000 // 0.01 ETH in Wei + +func WaitUntilWalletFunded(ctx context.Context, wsEndpoint string, walletAddress common.Address) error { + log := dlog.FromCtx(ctx) + + // Connect to the client using WebSocket for live subscription + rpcClient, err := rpc.DialContext(ctx, wsEndpoint) + if err != nil { + log.Error("Failed to connect to the Ethereum WebSocket client", "err", err) + return err + } + defer rpcClient.Close() + + ethClient := ethclient.NewClient(rpcClient) + + // Subscribe to new block headers + headers := make(chan *types.Header) + subscription, err := ethClient.SubscribeNewHead(ctx, headers) + if err != nil { + log.Error("Failed to subscribe to new block headers", "err", err) + return err + } + defer subscription.Unsubscribe() + + log.Info("Subscription created. Waiting for the wallet to be funded...") + + for { + select { + case err := <-subscription.Err(): + log.Error("Subscription error", "err", err) + return err + + case <-headers: + // Check the balance on each new block + balance, err := ethClient.BalanceAt(ctx, walletAddress, nil) + if err != nil || balance == nil { + log.Warn("Failed to retrieve wallet balance", "err", err) + continue // Try again in the next block + } + + if balance.Cmp(big.NewInt(requiredBalance)) >= 0 { + log.Info("Wallet is funded. Current balance", "balance", balance) + return nil + } else { + log.Warn("Wallet is not funded yet. Current balance", "balance", balance, "requiredBalance", requiredBalance, "walletAddress", walletAddress.Hex()) + } + + case <-ctx.Done(): + // Handle context cancellation + log.Info("Context cancelled, stopping WaitUntilWalletFunded subscription") + return ctx.Err() + } + } +} + +func WaitForTransaction(client *ethclient.Client, tx *types.Transaction) *big.Int { + log := dlog.FromCtx(context.Background()) + for { + receipt, err := client.TransactionReceipt(context.Background(), tx.Hash()) + if err != nil { + if err == ethereum.NotFound { + + time.Sleep(500 * time.Millisecond) + continue + } else { + log.Error("Failed to get transaction receipt", "err", err) + return nil + } + } + + if receipt.Status != types.ReceiptStatusSuccessful { + + // The ABI for a `revert` reason is essentially a string, so we'll use that + parsed, err := abi.JSON( + strings.NewReader( + `[{"constant":true,"inputs":[],"name":"errorMessage","outputs":[{"name":"","type":"string"}],"type":"function"}]`, + ), + ) + if err != nil { + log.Error("Failed to parse ABI", "err", err) + return nil + } + + if receipt.Logs == nil || len(receipt.Logs) == 0 { + rcp, err := json.MarshalIndent(receipt, "", " ") + if err != nil { + log.Error("Failed to marshal receipt", "err", err) + return nil + } + rpcClient := client.Client() // Access the underlying rpc.Client + + var result map[string]interface{} // Replace with the actual type of the result + + err = rpcClient.Call(&result, "debug_traceTransaction", tx.Hash(), map[string]interface{}{}) + if err != nil { + log.Error("Failed to execute debug_traceTransaction: %v", err) + } + log.Error( + "Transaction failed with status but no logs were emitted.", + "status", + tx.Hash().Hex(), + "rcp", + rcp, + "result", + result, + ) + + return nil + } + + // Attempt to unpack the error message + var errorMsg string + err = parsed.UnpackIntoInterface(&errorMsg, "errorMessage", receipt.Logs[0].Data) + if err != nil { + log.Error("Failed to unpack error message", "err", err) + return nil + } + + log.Error("Revert Reason:", "errorMsg", errorMsg) + /* + var receiptResp interface{} + err = client.Client().CallContext(context.Background(), &receiptResp, "eth_getTransactionReceipt", tx.Hash().Hex()) + if err != nil { + log.Fatalf("Fetching transaction receipt failed %v %v!\n", receiptResp, err) + } + jsonResp, err := json.Marshal(receiptResp) + if err != nil { + log.Fatalf("Failed to marshal json %v!\n", err) + } + log.Fatalf("Transaction != types.ReceiptStatusSuccessful jsonResp: %v", string(jsonResp)) + return nil + */ + } + return receipt.BlockNumber + } +} diff --git a/core/xchain/config/config.go b/core/xchain/config/config.go new file mode 100644 index 000000000..33c0f9d8b --- /dev/null +++ b/core/xchain/config/config.go @@ -0,0 +1,88 @@ +package config + +import ( + "fmt" + "strconv" + "strings" + "time" + + "github.com/ethereum/go-ethereum/common" + node_config "github.com/river-build/river/core/node/config" + infra "github.com/river-build/river/core/node/infra/config" +) + +type ContractVersion string + +const ( + VersionDev ContractVersion = "dev" + VersionV3 ContractVersion = "v3" +) + +// Viper uses mapstructure module to marshal settings into config struct. +type Config struct { + Metrics infra.MetricsConfig `mapstructure:"metrics"` + Log infra.LogConfig `mapstructure:"log"` + ChainsString string `mapstructure:"chains"` + Chains map[uint64]string `mapstructure:"-"` // This is a derived field + EntitlementContract ContractConfig `mapstructure:"entitlement_contract"` + WalletLinkContract ContractConfig `mapstructure:"wallet_link_contract"` + TestingContract ContractConfig `mapstructure:"test_contract"` + contractVersion ContractVersion `mapstructure:"contract_version"` + TestCustomEntitlementContract ContractConfig `mapstructure:"test_custom_entitlement_contract"` + + // History indicates how far back xchain must look for entitlement check requests after start + History time.Duration + + // Blockchain configuration + BaseChain node_config.ChainConfig + RiverChain node_config.ChainConfig +} + +type ContractConfig struct { + Address string +} + +func (c *Config) GetContractVersion() ContractVersion { + if c.contractVersion == VersionV3 { + return VersionV3 + } else { + return VersionDev + } +} + +func (c *Config) GetEntitlementContractAddress() common.Address { + return common.HexToAddress(c.EntitlementContract.Address) +} + +func (c *Config) GetWalletLinkContractAddress() common.Address { + return common.HexToAddress(c.WalletLinkContract.Address) +} + +func (c *Config) GetMockEntitlementContractAddress() common.Address { + return common.HexToAddress(c.TestingContract.Address) +} + +func (c *Config) GetTestCustomEntitlementContractAddress() common.Address { + return common.HexToAddress(c.TestCustomEntitlementContract.Address) +} + +func (c *Config) Init() { + c.parseChains() +} + +func (c *Config) parseChains() { + chainUrls := make(map[uint64]string) + chainPairs := strings.Split(c.ChainsString, ",") + for _, pair := range chainPairs { + parts := strings.SplitN(pair, ":", 2) // Use SplitN to split into exactly two parts + if len(parts) == 2 { + chainID, err := strconv.Atoi(parts[0]) + if err != nil { + fmt.Printf("Error converting chainID to int: %v\n", err) + continue + } + chainUrls[uint64(chainID)] = parts[1] + } + } + c.Chains = chainUrls +} diff --git a/core/xchain/contracts/README.md b/core/xchain/contracts/README.md new file mode 100644 index 000000000..f3e9a0ec8 --- /dev/null +++ b/core/xchain/contracts/README.md @@ -0,0 +1 @@ +Contents of v3 and dev directories are generated by ./scripts/build-town-types.sh diff --git a/core/xchain/contracts/contracts.go b/core/xchain/contracts/contracts.go new file mode 100644 index 000000000..f6e9ae72c --- /dev/null +++ b/core/xchain/contracts/contracts.go @@ -0,0 +1,810 @@ +package contracts + +import ( + "context" + "core/xchain/config" + dev "core/xchain/contracts/dev" + v3 "core/xchain/contracts/v3" + "math/big" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/event" + "github.com/river-build/river/core/node/dlog" +) + +type IWalletLinkBaseLinkedWallet struct { + Addr common.Address + Signature []byte +} + +func (w IWalletLinkBaseLinkedWallet) v3() v3.IWalletLinkBaseLinkedWallet { + return v3.IWalletLinkBaseLinkedWallet{ + Addr: w.Addr, + Signature: w.Signature, + } +} + +func (w IWalletLinkBaseLinkedWallet) dev() dev.IWalletLinkBaseLinkedWallet { + return dev.IWalletLinkBaseLinkedWallet{ + Addr: w.Addr, + Signature: w.Signature, + } +} + +type WalletLink struct { + v3WalletLink *v3.WalletLink + devWalletLink *dev.WalletLink +} + +func DeployWalletLink(auth *bind.TransactOpts, backend bind.ContractBackend, version config.ContractVersion) ( + common.Address, + *types.Transaction, + *WalletLink, + error, +) { + if version == "v3" { + address, tx, contract, err := v3.DeployWalletLink(auth, backend) + return address, tx, &WalletLink{v3WalletLink: contract}, err + } else { + address, tx, contract, err := dev.DeployWalletLink(auth, backend) + return address, tx, &WalletLink{devWalletLink: contract}, err + } +} + +type IWalletLink struct { + v3IWalletLink *v3.IWalletLink + devIWalletLink *dev.IWalletLink +} + +func NewIWalletLink(address common.Address, backend bind.ContractBackend, version config.ContractVersion) (*IWalletLink, error) { + res := &IWalletLink{} + if version == "v3" { + contract, err := v3.NewIWalletLink(address, backend) + res.v3IWalletLink = contract + return res, err + } else { + contract, err := dev.NewIWalletLink(address, backend) + res.devIWalletLink = contract + return res, err + } +} + +func (w *IWalletLink) CheckIfLinked(opts *bind.CallOpts, rootKey common.Address, linkedWallet common.Address) (bool, error) { + if w.v3IWalletLink != nil { + return w.v3IWalletLink.CheckIfLinked(opts, rootKey, linkedWallet) + } + return w.devIWalletLink.CheckIfLinked(opts, rootKey, linkedWallet) +} + +func (w *IWalletLink) GetMetadata() *bind.MetaData { + if w.v3IWalletLink != nil { + return v3.IWalletLinkMetaData + } + return dev.IWalletLinkMetaData +} + +func (w *IWalletLink) GetAbi() *abi.ABI { + md := w.GetMetadata() + abi, err := md.GetAbi() + if err != nil { + panic("Failed to parse WalletLink ABI") + } + return abi +} + +func (w *IWalletLink) GetRootKeyForWallet(opts *bind.CallOpts, wallet common.Address) (common.Address, error) { + if w.v3IWalletLink != nil { + return w.v3IWalletLink.GetRootKeyForWallet(opts, wallet) + } + return w.devIWalletLink.GetRootKeyForWallet(opts, wallet) +} + +func (w *IWalletLink) GetWalletsByRootKey(opts *bind.CallOpts, rootKey common.Address) ([]common.Address, error) { + if w.v3IWalletLink != nil { + return w.v3IWalletLink.GetWalletsByRootKey(opts, rootKey) + } + return w.devIWalletLink.GetWalletsByRootKey(opts, rootKey) +} + +func (w *IWalletLink) GetLatestNonceForRootKey(opts *bind.CallOpts, rootKey common.Address) (*big.Int, error) { + if w.v3IWalletLink != nil { + return w.v3IWalletLink.GetLatestNonceForRootKey(opts, rootKey) + } + return w.devIWalletLink.GetLatestNonceForRootKey(opts, rootKey) +} + +func (w *IWalletLink) CheckIfLinkedWallet(opts *bind.CallOpts, rootKey common.Address, linkedWallet common.Address) (bool, error) { + if w.v3IWalletLink != nil { + return w.v3IWalletLink.CheckIfLinked(opts, rootKey, linkedWallet) + } + return w.devIWalletLink.CheckIfLinked(opts, rootKey, linkedWallet) +} + +func (w *IWalletLink) LinkWalletToRootKey(opts *bind.TransactOpts, wallet IWalletLinkBaseLinkedWallet, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + if w.v3IWalletLink != nil { + return w.v3IWalletLink.LinkWalletToRootKey(opts, wallet.v3(), rootWallet.v3(), nonce) + } + return w.devIWalletLink.LinkWalletToRootKey(opts, wallet.dev(), rootWallet.dev(), nonce) +} + +type EntitlementChecker struct { + v3EntitlementChecker *v3.EntitlementChecker + devEntitlementChecker *dev.EntitlementChecker +} + +func DeployEntitlementChecker(auth *bind.TransactOpts, backend bind.ContractBackend, version config.ContractVersion) (common.Address, *types.Transaction, *EntitlementChecker, error) { + if version == "v3" { + address, tx, v3Checker, err := v3.DeployEntitlementChecker(auth, backend) + return address, tx, &EntitlementChecker{v3EntitlementChecker: v3Checker}, err + } else { + address, tx, devChecker, err := dev.DeployEntitlementChecker(auth, backend) + return address, tx, &EntitlementChecker{devEntitlementChecker: devChecker}, err + } +} + +type IRuleData struct { + Operations []IRuleEntitlementOperation + CheckOperations []IRuleEntitlementCheckOperation + LogicalOperations []IRuleEntitlementLogicalOperation +} + +type IRuleEntitlementOperation struct { + OpType uint8 + Index uint8 +} + +type IRuleEntitlementCheckOperation struct { + OpType uint8 + ChainId *big.Int + ContractAddress common.Address + Threshold *big.Int +} + +// IRuleEntitlementLogicalOperation is an auto generated low-level Go binding around an user-defined struct. +type IRuleEntitlementLogicalOperation struct { + LogOpType uint8 + LeftOperationIndex uint8 + RightOperationIndex uint8 +} + +type IEntitlementGated struct { + v3IEntitlementGated *v3.IEntitlementGated + devIEntitlementGated *dev.IEntitlementGated +} + +type MockEntitlementGated struct { + v3MockEntitlementGated *v3.MockEntitlementGated + devMockEntitlementGated *dev.MockEntitlementGated +} + +type NodeVoteStatus uint8 + +const ( + NodeVoteStatus__NOT_VOTED NodeVoteStatus = iota + NodeVoteStatus__PASSED + NodeVoteStatus__FAILED +) + +type IEntitlementCheckResultPosted interface { + TransactionID() common.Hash + Result() NodeVoteStatus + Raw() interface{} +} + +type entitlementCheckResultPosted struct { + v3Inner *v3.IEntitlementGatedEntitlementCheckResultPosted + devInner *dev.IEntitlementGatedEntitlementCheckResultPosted +} + +func (e *entitlementCheckResultPosted) TransactionID() common.Hash { + if e.v3Inner != nil { + return e.v3Inner.TransactionId + } + return e.devInner.TransactionId +} + +func (e *entitlementCheckResultPosted) Result() NodeVoteStatus { + if e.v3Inner != nil { + return NodeVoteStatus(e.v3Inner.Result) + } + return NodeVoteStatus(e.devInner.Result) +} + +func (e *entitlementCheckResultPosted) Raw() interface{} { + if e.v3Inner != nil { + return e.v3Inner + } + return e.devInner +} + +func DeployMockEntitlementGated(auth *bind.TransactOpts, backend bind.ContractBackend, checker common.Address, version config.ContractVersion) (common.Address, *types.Transaction, *MockEntitlementGated, error) { + if version == "v3" { + address, tx, contract, err := v3.DeployMockEntitlementGated(auth, backend, checker) + return address, tx, &MockEntitlementGated{v3MockEntitlementGated: contract}, err + } else { + address, tx, contract, err := dev.DeployMockEntitlementGated(auth, backend, checker) + return address, tx, &MockEntitlementGated{devMockEntitlementGated: contract}, err + } +} + +func NewMockEntitlementGated(address common.Address, backend bind.ContractBackend, version config.ContractVersion) (*MockEntitlementGated, error) { + res := &MockEntitlementGated{} + if version == "v3" { + contract, err := v3.NewMockEntitlementGated(address, backend) + res.v3MockEntitlementGated = contract + return res, err + } else { + contract, err := dev.NewMockEntitlementGated(address, backend) + res.devMockEntitlementGated = contract + return res, err + } +} + +func (g *MockEntitlementGated) EntitlementCheckResultPosted(version config.ContractVersion) IEntitlementCheckResultPosted { + if g.v3MockEntitlementGated != nil { + return &entitlementCheckResultPosted{&v3.IEntitlementGatedEntitlementCheckResultPosted{}, nil} + } else { + return &entitlementCheckResultPosted{nil, &dev.IEntitlementGatedEntitlementCheckResultPosted{}} + } +} + +func (g *MockEntitlementGated) GetMetadata() *bind.MetaData { + if g.v3MockEntitlementGated != nil { + return v3.MockEntitlementGatedMetaData + } else { + return dev.MockEntitlementGatedMetaData + } +} + +func (g *MockEntitlementGated) GetAbi() *abi.ABI { + md := g.GetMetadata() + abi, err := md.GetAbi() + if err != nil { + panic("Failed to parse EntitlementGated ABI") + } + return abi +} + +func (g *MockEntitlementGated) RequestEntitlementCheck(opts *bind.TransactOpts, roleId *big.Int, ruledata IRuleData) (*types.Transaction, error) { + if g.v3MockEntitlementGated != nil { + return g.v3MockEntitlementGated.RequestEntitlementCheck(opts, roleId, convertRuleDataToV3(ruledata)) + } else { + return g.devMockEntitlementGated.RequestEntitlementCheck(opts, roleId, convertRuleDataToDev(ruledata)) + } +} + +type MockCustomEntitlement struct { + v3MockCustomEntitlement *v3.MockCustomEntitlement + devMockCustomEntitlement *dev.MockCustomEntitlement +} + +func DeployMockCustomEntitlement(auth *bind.TransactOpts, backend bind.ContractBackend, version config.ContractVersion) (common.Address, *types.Transaction, *MockCustomEntitlement, error) { + if version == "v3" { + address, tx, contract, err := v3.DeployMockCustomEntitlement(auth, backend) + return address, tx, &MockCustomEntitlement{v3MockCustomEntitlement: contract}, err + } else { + address, tx, contract, err := dev.DeployMockCustomEntitlement(auth, backend) + return address, tx, &MockCustomEntitlement{devMockCustomEntitlement: contract}, err + } +} + +func NewMockCustomEntitlement(address common.Address, backend bind.ContractBackend, version config.ContractVersion) (*MockCustomEntitlement, error) { + res := &MockCustomEntitlement{} + if version == "v3" { + contract, err := v3.NewMockCustomEntitlement(address, backend) + res.v3MockCustomEntitlement = contract + return res, err + } else { + contract, err := dev.NewMockCustomEntitlement(address, backend) + res.devMockCustomEntitlement = contract + return res, err + } +} + +func (m *MockCustomEntitlement) SetEntitled( + opts *bind.TransactOpts, + user []common.Address, + userIsEntitled bool, +) (*types.Transaction, error) { + if m.v3MockCustomEntitlement != nil { + return m.v3MockCustomEntitlement.SetEntitled(opts, user, userIsEntitled) + } else { + return m.devMockCustomEntitlement.SetEntitled(opts, user, userIsEntitled) + } +} + +func NewIEntitlementGated(address common.Address, backend bind.ContractBackend, version config.ContractVersion) (*IEntitlementGated, error) { + res := &IEntitlementGated{} + if version == "v3" { + contract, err := v3.NewIEntitlementGated(address, backend) + res.v3IEntitlementGated = contract + return res, err + } else { + contract, err := dev.NewIEntitlementGated(address, backend) + res.devIEntitlementGated = contract + return res, err + } +} + +func (g *IEntitlementGated) PostEntitlementCheckResult(opts *bind.TransactOpts, transactionId [32]byte, roleId *big.Int, result uint8) (*types.Transaction, error) { + if g.v3IEntitlementGated != nil { + return g.v3IEntitlementGated.PostEntitlementCheckResult(opts, transactionId, roleId, result) + } else { + return g.devIEntitlementGated.PostEntitlementCheckResult(opts, transactionId, roleId, result) + } +} + +func (g *IEntitlementGated) WatchEntitlementCheckResultPosted(opts *bind.WatchOpts, sink chan<- *IEntitlementGatedEntitlementCheckResultPosted, transactionId [][32]byte) (event.Subscription, error) { + if g.v3IEntitlementGated != nil { + v3Sink := make(chan *v3.IEntitlementGatedEntitlementCheckResultPosted) + sub, err := g.v3IEntitlementGated.WatchEntitlementCheckResultPosted(opts, v3Sink, transactionId) + go func() { + for v3Event := range v3Sink { + shimEvent := convertV3ToShimResultPosted(v3Event) + sink <- shimEvent + } + }() + return sub, err + } else { + devSink := make(chan *dev.IEntitlementGatedEntitlementCheckResultPosted) + sub, err := g.devIEntitlementGated.WatchEntitlementCheckResultPosted(opts, devSink, transactionId) + go func() { + for devEvent := range devSink { + shimEvent := converDevToShimResultPosted(devEvent) + sink <- shimEvent + } + }() + return sub, err + } +} + +func (g *IEntitlementGated) GetRuleData(opts *bind.CallOpts, transactionId [32]byte, roleId *big.Int) (*IRuleData, error) { + var ruleData IRuleData + if g.v3IEntitlementGated != nil { + v3RuleData, err := g.v3IEntitlementGated.GetRuleData(opts, transactionId, roleId) + if err != nil { + return nil, err + } + ruleData = IRuleData{ + Operations: make([]IRuleEntitlementOperation, len(v3RuleData.Operations)), + CheckOperations: make([]IRuleEntitlementCheckOperation, len(v3RuleData.CheckOperations)), + LogicalOperations: make([]IRuleEntitlementLogicalOperation, len(v3RuleData.LogicalOperations)), + } + for i, op := range v3RuleData.Operations { + ruleData.Operations[i] = IRuleEntitlementOperation{ + OpType: op.OpType, + Index: op.Index, + } + } + for i, op := range v3RuleData.CheckOperations { + ruleData.CheckOperations[i] = IRuleEntitlementCheckOperation{ + OpType: op.OpType, + ChainId: op.ChainId, + ContractAddress: op.ContractAddress, + Threshold: op.Threshold, + } + } + for i, op := range v3RuleData.LogicalOperations { + ruleData.LogicalOperations[i] = IRuleEntitlementLogicalOperation{ + LogOpType: op.LogOpType, + LeftOperationIndex: op.LeftOperationIndex, + RightOperationIndex: op.RightOperationIndex, + } + } + return &ruleData, nil + } else { + devRuleDtata, err := g.devIEntitlementGated.GetRuleData(opts, transactionId, roleId) + if err != nil { + return nil, err + } + ruleData = IRuleData{ + Operations: make([]IRuleEntitlementOperation, len(devRuleDtata.Operations)), + CheckOperations: make([]IRuleEntitlementCheckOperation, len(devRuleDtata.CheckOperations)), + LogicalOperations: make([]IRuleEntitlementLogicalOperation, len(devRuleDtata.LogicalOperations)), + } + for i, op := range devRuleDtata.Operations { + ruleData.Operations[i] = IRuleEntitlementOperation{ + OpType: op.OpType, + Index: op.Index, + } + } + for i, op := range devRuleDtata.CheckOperations { + ruleData.CheckOperations[i] = IRuleEntitlementCheckOperation{ + OpType: op.OpType, + ChainId: op.ChainId, + ContractAddress: op.ContractAddress, + Threshold: op.Threshold, + } + } + for i, op := range devRuleDtata.LogicalOperations { + ruleData.LogicalOperations[i] = IRuleEntitlementLogicalOperation{ + LogOpType: op.LogOpType, + LeftOperationIndex: op.LeftOperationIndex, + RightOperationIndex: op.RightOperationIndex, + } + } + return &ruleData, nil + } +} + +type ICustomEntitlement struct { + v3ICustomEntitlement *v3.ICustomEntitlement + devICustomEntitlement *dev.ICustomEntitlement +} + +func NewICustomEntitlement(address common.Address, backend bind.ContractBackend, version config.ContractVersion) (*ICustomEntitlement, error) { + res := &ICustomEntitlement{} + if version == "v3" { + contract, err := v3.NewICustomEntitlement(address, backend) + res.v3ICustomEntitlement = contract + return res, err + } else { + contract, err := dev.NewICustomEntitlement(address, backend) + res.devICustomEntitlement = contract + return res, err + } +} + +func (c *ICustomEntitlement) GetMetadata() *bind.MetaData { + if c.v3ICustomEntitlement != nil { + return v3.ICustomEntitlementMetaData + } else { + return dev.ICustomEntitlementMetaData + } +} + +func (c *ICustomEntitlement) GetAbi() *abi.ABI { + md := c.GetMetadata() + abi, err := md.GetAbi() + if err != nil { + panic("Failed to parse CustomEntitlement ABI") + } + return abi +} + +func (c *ICustomEntitlement) IsEntitled(opts *bind.CallOpts, user []common.Address) (bool, error) { + if c.v3ICustomEntitlement != nil { + return c.v3ICustomEntitlement.IsEntitled(opts, user) + } else { + return c.devICustomEntitlement.IsEntitled(opts, user) + } +} + +func (g *MockEntitlementGated) EntitlementGatedMetaData() *bind.MetaData { + if g.v3MockEntitlementGated != nil { + return v3.IEntitlementGatedMetaData + } else { + return dev.IEntitlementGatedMetaData + } +} + +type EntitlementGatedMetaData struct { + v3IEntitlementGatedMetaData *bind.MetaData + devIEntitlementGatedMetaData *bind.MetaData +} + +func NewEntitlementGatedMetaData(version config.ContractVersion) EntitlementGatedMetaData { + if version == "v3" { + return EntitlementGatedMetaData{ + v3IEntitlementGatedMetaData: v3.IEntitlementGatedMetaData, + } + } else { + return EntitlementGatedMetaData{ + devIEntitlementGatedMetaData: dev.IEntitlementGatedMetaData, + } + } +} + +func (e EntitlementGatedMetaData) GetMetadata() *bind.MetaData { + if e.v3IEntitlementGatedMetaData != nil { + return e.v3IEntitlementGatedMetaData + } + return e.devIEntitlementGatedMetaData +} + +type IEntitlementChecker struct { + v3IEntitlementChecker *v3.IEntitlementChecker + devIEntitlementChecker *dev.IEntitlementChecker +} + +func NewIEntitlementChecker(address common.Address, backend bind.ContractBackend, version config.ContractVersion) (*IEntitlementChecker, error) { + res := &IEntitlementChecker{} + if version == "v3" { + contract, err := v3.NewIEntitlementChecker(address, backend) + res.v3IEntitlementChecker = contract + return res, err + } else { + contract, err := dev.NewIEntitlementChecker(address, backend) + res.devIEntitlementChecker = contract + return res, err + } +} + +func (c *IEntitlementChecker) IsValidNode(opts *bind.CallOpts, node common.Address) (bool, error) { + if c.v3IEntitlementChecker != nil { + return c.v3IEntitlementChecker.IsValidNode(opts, node) + } + return c.devIEntitlementChecker.IsValidNode(opts, node) +} + +func (c *IEntitlementChecker) GetMetadata() *bind.MetaData { + if v3.IEntitlementCheckerMetaData != nil { + return v3.IEntitlementCheckerMetaData + } else { + return dev.IEntitlementCheckerMetaData + } +} + +func (c *IEntitlementChecker) GetAbi() *abi.ABI { + md := c.GetMetadata() + abi, err := md.GetAbi() + if err != nil { + panic("Failed to parse EntitlementChecker ABI") + } + return abi +} + +type IEntitlementCheckRequestEvent interface { + CallerAddress() common.Address + TransactionID() common.Hash + RoleId() *big.Int + SelectedNodes() []common.Address + ContractAddress() common.Address + Raw() interface{} +} + +type entitlementCheckRequestEvent struct { + v3Inner *v3.IEntitlementCheckerEntitlementCheckRequested + devInner *dev.IEntitlementCheckerEntitlementCheckRequested +} + +func (e *entitlementCheckRequestEvent) CallerAddress() common.Address { + if e.v3Inner != nil { + return e.v3Inner.CallerAddress + } + return e.devInner.CallerAddress +} + +func (e *entitlementCheckRequestEvent) TransactionID() common.Hash { + if e.v3Inner != nil { + return e.v3Inner.TransactionId + } + return e.devInner.TransactionId +} + +func (e *entitlementCheckRequestEvent) SelectedNodes() []common.Address { + if e.v3Inner != nil { + return e.v3Inner.SelectedNodes + } + return e.devInner.SelectedNodes +} + +func (e *entitlementCheckRequestEvent) ContractAddress() common.Address { + if e.v3Inner != nil { + return e.v3Inner.ContractAddress + } + return e.devInner.ContractAddress +} + +func (e *entitlementCheckRequestEvent) RoleId() *big.Int { + if e.v3Inner != nil { + return e.v3Inner.RoleId + } + return e.devInner.RoleId +} + +func (e *entitlementCheckRequestEvent) Raw() interface{} { + if e.v3Inner != nil { + return e.v3Inner + } + return e.devInner + +} + +func (c *IEntitlementChecker) EntitlementCheckRequestEvent() IEntitlementCheckRequestEvent { + if c.v3IEntitlementChecker != nil { + return &entitlementCheckRequestEvent{&v3.IEntitlementCheckerEntitlementCheckRequested{}, nil} + } else { + return &entitlementCheckRequestEvent{nil, &dev.IEntitlementCheckerEntitlementCheckRequested{}} + } +} + +func (c *IEntitlementChecker) EstimateGas(ctx context.Context, client *ethclient.Client, From common.Address, To *common.Address, name string, args ...interface{}) (*uint64, error) { + log := dlog.FromCtx(ctx) + // Generate the data for the contract method call + // You must replace `YourContractABI` with the actual ABI of your contract + // and `registerNodeMethodID` with the actual method ID you wish to call. + // The following line is a placeholder for the encoded data of your method call. + parsedABI := c.GetAbi() + + method, err := parsedABI.Pack(name, args...) + if err != nil { + return nil, err + } + + // Prepare the transaction call message + msg := ethereum.CallMsg{ + From: From, // Sender of the transaction (optional) + To: To, // Contract address + Data: method, // Encoded method call + } + + // Estimate the gas required for the transaction + estimatedGas, err := client.EstimateGas(ctx, msg) + if err != nil { + log.Error("Failed to estimate gas", "err", err) + return nil, err + } + + log.Debug("estimatedGas", "estimatedGas", estimatedGas) + return &estimatedGas, nil + +} + +func (c *IEntitlementChecker) NodeCount(opts *bind.CallOpts) (*big.Int, error) { + if c.v3IEntitlementChecker != nil { + return c.v3IEntitlementChecker.GetNodeCount(opts) + } else { + return c.devIEntitlementChecker.GetNodeCount(opts) + } +} + +func (c *IEntitlementChecker) RegisterNode(opts *bind.TransactOpts, node common.Address) (*types.Transaction, error) { + if c.v3IEntitlementChecker != nil { + return c.v3IEntitlementChecker.RegisterNode(opts, node) + } else { + return c.devIEntitlementChecker.RegisterNode(opts, node) + } +} + +func (c *IEntitlementChecker) UnregisterNode(opts *bind.TransactOpts, node common.Address) (*types.Transaction, error) { + if c.v3IEntitlementChecker != nil { + return c.v3IEntitlementChecker.UnregisterNode(opts, node) + } else { + return c.devIEntitlementChecker.UnregisterNode(opts, node) + } +} + +func (c *IEntitlementChecker) WatchEntitlementCheckRequested(opts *bind.WatchOpts, sink chan<- *IEntitlementCheckerEntitlementCheckRequested, nodeAddress []common.Address) (event.Subscription, error) { + if c.v3IEntitlementChecker != nil { + v3Sink := make(chan *v3.IEntitlementCheckerEntitlementCheckRequested) + sub, err := c.v3IEntitlementChecker.WatchEntitlementCheckRequested(opts, v3Sink) + go func() { + for v3Event := range v3Sink { + shimEvent := convertV3ToShimCheckRequested(v3Event) + sink <- shimEvent + } + }() + return sub, err + } else { + devSink := make(chan *dev.IEntitlementCheckerEntitlementCheckRequested) + sub, err := c.devIEntitlementChecker.WatchEntitlementCheckRequested(opts, devSink) + go func() { + for devEvent := range devSink { + shimEvent := convertDevToShimCheckRequested(devEvent) + sink <- shimEvent + } + }() + return sub, err + } +} + +type IEntitlementGatedEntitlementCheckResultPosted struct { + TransactionId [32]byte + Result uint8 + Raw types.Log // Blockchain specific contextual infos +} + +type IEntitlementCheckerEntitlementCheckRequested struct { + CallerAddress common.Address + TransactionId [32]byte + SelectedNodes []common.Address + ContractAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +func convertV3ToShimCheckRequested(v3Event *v3.IEntitlementCheckerEntitlementCheckRequested) *IEntitlementCheckerEntitlementCheckRequested { + return &IEntitlementCheckerEntitlementCheckRequested{ + CallerAddress: v3Event.CallerAddress, + TransactionId: v3Event.TransactionId, + SelectedNodes: v3Event.SelectedNodes, + ContractAddress: v3Event.ContractAddress, + Raw: v3Event.Raw, + } +} + +func convertDevToShimCheckRequested(devEvent *dev.IEntitlementCheckerEntitlementCheckRequested) *IEntitlementCheckerEntitlementCheckRequested { + return &IEntitlementCheckerEntitlementCheckRequested{ + CallerAddress: devEvent.CallerAddress, + TransactionId: devEvent.TransactionId, + SelectedNodes: devEvent.SelectedNodes, + ContractAddress: devEvent.ContractAddress, + Raw: devEvent.Raw, + } +} + +func convertV3ToShimResultPosted(v3Event *v3.IEntitlementGatedEntitlementCheckResultPosted) *IEntitlementGatedEntitlementCheckResultPosted { + return &IEntitlementGatedEntitlementCheckResultPosted{ + TransactionId: v3Event.TransactionId, + Result: v3Event.Result, + Raw: v3Event.Raw, + } +} + +func converDevToShimResultPosted(devEvent *dev.IEntitlementGatedEntitlementCheckResultPosted) *IEntitlementGatedEntitlementCheckResultPosted { + return &IEntitlementGatedEntitlementCheckResultPosted{ + TransactionId: devEvent.TransactionId, + Result: devEvent.Result, + Raw: devEvent.Raw, + } +} + +func convertRuleDataToV3(ruleData IRuleData) v3.IRuleEntitlementRuleData { + operations := make([]v3.IRuleEntitlementOperation, len(ruleData.Operations)) + for i, op := range ruleData.Operations { + operations[i] = v3.IRuleEntitlementOperation{ + OpType: op.OpType, + Index: op.Index, + } + } + checkOperations := make([]v3.IRuleEntitlementCheckOperation, len(ruleData.CheckOperations)) + for i, op := range ruleData.CheckOperations { + checkOperations[i] = v3.IRuleEntitlementCheckOperation{ + OpType: op.OpType, + ChainId: op.ChainId, + ContractAddress: op.ContractAddress, + Threshold: op.Threshold, + } + } + logicalOperations := make([]v3.IRuleEntitlementLogicalOperation, len(ruleData.LogicalOperations)) + for i, op := range ruleData.LogicalOperations { + logicalOperations[i] = v3.IRuleEntitlementLogicalOperation{ + LogOpType: op.LogOpType, + LeftOperationIndex: op.LeftOperationIndex, + RightOperationIndex: op.RightOperationIndex, + } + } + return v3.IRuleEntitlementRuleData{ + Operations: operations, + CheckOperations: checkOperations, + LogicalOperations: logicalOperations, + } +} + +func convertRuleDataToDev(ruleData IRuleData) dev.IRuleEntitlementRuleData { + operations := make([]dev.IRuleEntitlementOperation, len(ruleData.Operations)) + for i, op := range ruleData.Operations { + operations[i] = dev.IRuleEntitlementOperation{ + OpType: op.OpType, + Index: op.Index, + } + } + checkOperations := make([]dev.IRuleEntitlementCheckOperation, len(ruleData.CheckOperations)) + for i, op := range ruleData.CheckOperations { + checkOperations[i] = dev.IRuleEntitlementCheckOperation{ + OpType: op.OpType, + ChainId: op.ChainId, + ContractAddress: op.ContractAddress, + Threshold: op.Threshold, + } + } + logicalOperations := make([]dev.IRuleEntitlementLogicalOperation, len(ruleData.LogicalOperations)) + for i, op := range ruleData.LogicalOperations { + logicalOperations[i] = dev.IRuleEntitlementLogicalOperation{ + LogOpType: op.LogOpType, + LeftOperationIndex: op.LeftOperationIndex, + RightOperationIndex: op.RightOperationIndex, + } + } + return dev.IRuleEntitlementRuleData{ + Operations: operations, + CheckOperations: checkOperations, + LogicalOperations: logicalOperations, + } + +} diff --git a/core/xchain/contracts/dev/entitlement_checker.go b/core/xchain/contracts/dev/entitlement_checker.go new file mode 100644 index 000000000..6b678171c --- /dev/null +++ b/core/xchain/contracts/dev/entitlement_checker.go @@ -0,0 +1,1259 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package dev + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// EntitlementCheckerMetaData contains all meta data concerning the EntitlementChecker contract. +var EntitlementCheckerMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"__EntitlementChecker_init\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getNodeAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNodeCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRandomNodes\",\"inputs\":[{\"name\":\"count\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isValidNode\",\"inputs\":[{\"name\":\"node\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerNode\",\"inputs\":[{\"name\":\"node\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestEntitlementCheck\",\"inputs\":[{\"name\":\"callerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"transactionId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unregisterNode\",\"inputs\":[{\"name\":\"node\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"EntitlementCheckRequested\",\"inputs\":[{\"name\":\"callerAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contractAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"transactionId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"selectedNodes\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InterfaceAdded\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"indexed\":true,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InterfaceRemoved\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"indexed\":true,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NodeRegistered\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NodeUnregistered\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"EntitlementChecker_InsufficientNumberOfNodes\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementChecker_InvalidNodeOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementChecker_NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementChecker_NodeNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Initializable_InInitializingState\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Initializable_NotInInitializingState\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Introspection_AlreadySupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Introspection_NotSupported\",\"inputs\":[]}]", + Bin: "0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b610b5a806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063541da4e51161005b578063541da4e5146100fd578063672d7a0d146101105780639ebd11ef14610123578063c5e41cf61461014657600080fd5b806339bf397e1461008d57806339dc5b3e146100a85780633c59f126146100b25780634f845445146100dd575b600080fd5b610095610159565b6040519081526020015b60405180910390f35b6100b0610179565b005b6100c56100c03660046108bf565b6101d5565b6040516001600160a01b03909116815260200161009f565b6100f06100eb3660046108bf565b610248565b60405161009f919061091d565b6100b061010b366004610962565b610259565b6100b061011e366004610a4b565b61029e565b610136610131366004610a4b565b610334565b604051901515815260200161009f565b6100b0610154366004610a4b565b61034f565b6000600080516020610b3a833981519152610173816103e2565b91505090565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166101c357604051630ef4733760e31b815260040160405180910390fd5b6101d3630882d3fb60e21b6103ec565b565b6000600080516020610b3a8339815191526101ef816103e2565b83106102375760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b604482015260640160405180910390fd5b61024181846104ca565b9392505050565b6060610253826104d6565b92915050565b7f4675e3cc15801ffde520a3076d6ad75c0c6dbe8f23bdbea1dd45b676caffe4f38433858585604051610290959493929190610a66565b60405180910390a150505050565b600080516020610b3a8339815191526102b781836106ab565b156102d55760405163d1922fc160e01b815260040160405180910390fd5b6102df81836106cd565b506001600160a01b038216600081815260028301602052604080822080546001600160a01b03191633179055517f564728e6a7c8edd446557d94e0339d5e6ca2e05f42188914efdbdc87bcbbabf69190a25050565b6000600080516020610b3a83398151915261024181846106ab565b600080516020610b3a83398151915261036881836106ab565b610385576040516317e3e0b960e01b815260040160405180910390fd5b61038f81836106e2565b506001600160a01b038216600081815260028301602052604080822080546001600160a01b0319169055517fb1864577e4f285436a80ebc833984755393e2450d58622a65fb4fce87ea3573a9190a25050565b6000610253825490565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610479576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610492565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b600061024183836106f7565b6060600080516020610b3a83398151915260006104f2826103e2565b90508084111561051557604051631762997d60e01b815260040160405180910390fd5b60008467ffffffffffffffff8111156105305761053061094c565b604051908082528060200260200182016040528015610559578160200160208202803683370190505b50905060008267ffffffffffffffff8111156105775761057761094c565b6040519080825280602002602001820160405280156105a0578160200160208202803683370190505b50905060005b838110156105d457808282815181106105c1576105c1610aab565b60209081029190910101526001016105a6565b508260005b8781101561069f5760006105ed8284610721565b905061061e84828151811061060457610604610aab565b6020026020010151886000016104ca90919063ffffffff16565b85838151811061063057610630610aab565b6001600160a01b039092166020928302919091019091015283610654600185610ad7565b8151811061066457610664610aab565b602002602001015184828151811061067e5761067e610aab565b60209081029190910101528261069381610aea565b935050506001016105d9565b50919695505050505050565b6001600160a01b03811660009081526001830160205260408120541515610241565b6000610241836001600160a01b03841661077d565b6000610241836001600160a01b0384166107cc565b600082600001828154811061070e5761070e610aab565b9060005260206000200154905092915050565b604080514460208201524291810191909152606080820184905233901b6bffffffffffffffffffffffff1916608082015260009082906094016040516020818303038152906040528051906020012060001c6102419190610b01565b60008181526001830160205260408120546107c457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610253565b506000610253565b600081815260018301602052604081205480156108b55760006107f0600183610ad7565b855490915060009061080490600190610ad7565b905080821461086957600086600001828154811061082457610824610aab565b906000526020600020015490508087600001848154811061084757610847610aab565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061087a5761087a610b23565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610253565b6000915050610253565b6000602082840312156108d157600080fd5b5035919050565b60008151808452602080850194506020840160005b838110156109125781516001600160a01b0316875295820195908201906001016108ed565b509495945050505050565b60208152600061024160208301846108d8565b80356001600160a01b038116811461094757600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561097857600080fd5b61098185610930565b9350602080860135935060408601359250606086013567ffffffffffffffff808211156109ad57600080fd5b818801915088601f8301126109c157600080fd5b8135818111156109d3576109d361094c565b8060051b604051601f19603f830116810181811085821117156109f8576109f861094c565b60405291825284820192508381018501918b831115610a1657600080fd5b938501935b82851015610a3b57610a2c85610930565b84529385019392850192610a1b565b989b979a50959850505050505050565b600060208284031215610a5d57600080fd5b61024182610930565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090610aa0908301846108d8565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561025357610253610ac1565b600081610af957610af9610ac1565b506000190190565b600082610b1e57634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052603160045260246000fdfe180c1d0b9e5eeea9f2f078bc2712cd77acc6afea03b37705abe96dda6f602600", +} + +// EntitlementCheckerABI is the input ABI used to generate the binding from. +// Deprecated: Use EntitlementCheckerMetaData.ABI instead. +var EntitlementCheckerABI = EntitlementCheckerMetaData.ABI + +// EntitlementCheckerBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use EntitlementCheckerMetaData.Bin instead. +var EntitlementCheckerBin = EntitlementCheckerMetaData.Bin + +// DeployEntitlementChecker deploys a new Ethereum contract, binding an instance of EntitlementChecker to it. +func DeployEntitlementChecker(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *EntitlementChecker, error) { + parsed, err := EntitlementCheckerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(EntitlementCheckerBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &EntitlementChecker{EntitlementCheckerCaller: EntitlementCheckerCaller{contract: contract}, EntitlementCheckerTransactor: EntitlementCheckerTransactor{contract: contract}, EntitlementCheckerFilterer: EntitlementCheckerFilterer{contract: contract}}, nil +} + +// EntitlementChecker is an auto generated Go binding around an Ethereum contract. +type EntitlementChecker struct { + EntitlementCheckerCaller // Read-only binding to the contract + EntitlementCheckerTransactor // Write-only binding to the contract + EntitlementCheckerFilterer // Log filterer for contract events +} + +// EntitlementCheckerCaller is an auto generated read-only Go binding around an Ethereum contract. +type EntitlementCheckerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// EntitlementCheckerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type EntitlementCheckerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// EntitlementCheckerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type EntitlementCheckerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// EntitlementCheckerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type EntitlementCheckerSession struct { + Contract *EntitlementChecker // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// EntitlementCheckerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type EntitlementCheckerCallerSession struct { + Contract *EntitlementCheckerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// EntitlementCheckerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type EntitlementCheckerTransactorSession struct { + Contract *EntitlementCheckerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// EntitlementCheckerRaw is an auto generated low-level Go binding around an Ethereum contract. +type EntitlementCheckerRaw struct { + Contract *EntitlementChecker // Generic contract binding to access the raw methods on +} + +// EntitlementCheckerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type EntitlementCheckerCallerRaw struct { + Contract *EntitlementCheckerCaller // Generic read-only contract binding to access the raw methods on +} + +// EntitlementCheckerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type EntitlementCheckerTransactorRaw struct { + Contract *EntitlementCheckerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewEntitlementChecker creates a new instance of EntitlementChecker, bound to a specific deployed contract. +func NewEntitlementChecker(address common.Address, backend bind.ContractBackend) (*EntitlementChecker, error) { + contract, err := bindEntitlementChecker(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &EntitlementChecker{EntitlementCheckerCaller: EntitlementCheckerCaller{contract: contract}, EntitlementCheckerTransactor: EntitlementCheckerTransactor{contract: contract}, EntitlementCheckerFilterer: EntitlementCheckerFilterer{contract: contract}}, nil +} + +// NewEntitlementCheckerCaller creates a new read-only instance of EntitlementChecker, bound to a specific deployed contract. +func NewEntitlementCheckerCaller(address common.Address, caller bind.ContractCaller) (*EntitlementCheckerCaller, error) { + contract, err := bindEntitlementChecker(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &EntitlementCheckerCaller{contract: contract}, nil +} + +// NewEntitlementCheckerTransactor creates a new write-only instance of EntitlementChecker, bound to a specific deployed contract. +func NewEntitlementCheckerTransactor(address common.Address, transactor bind.ContractTransactor) (*EntitlementCheckerTransactor, error) { + contract, err := bindEntitlementChecker(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &EntitlementCheckerTransactor{contract: contract}, nil +} + +// NewEntitlementCheckerFilterer creates a new log filterer instance of EntitlementChecker, bound to a specific deployed contract. +func NewEntitlementCheckerFilterer(address common.Address, filterer bind.ContractFilterer) (*EntitlementCheckerFilterer, error) { + contract, err := bindEntitlementChecker(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &EntitlementCheckerFilterer{contract: contract}, nil +} + +// bindEntitlementChecker binds a generic wrapper to an already deployed contract. +func bindEntitlementChecker(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := EntitlementCheckerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_EntitlementChecker *EntitlementCheckerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _EntitlementChecker.Contract.EntitlementCheckerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_EntitlementChecker *EntitlementCheckerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _EntitlementChecker.Contract.EntitlementCheckerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_EntitlementChecker *EntitlementCheckerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _EntitlementChecker.Contract.EntitlementCheckerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_EntitlementChecker *EntitlementCheckerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _EntitlementChecker.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_EntitlementChecker *EntitlementCheckerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _EntitlementChecker.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_EntitlementChecker *EntitlementCheckerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _EntitlementChecker.Contract.contract.Transact(opts, method, params...) +} + +// GetNodeAtIndex is a free data retrieval call binding the contract method 0x3c59f126. +// +// Solidity: function getNodeAtIndex(uint256 index) view returns(address) +func (_EntitlementChecker *EntitlementCheckerCaller) GetNodeAtIndex(opts *bind.CallOpts, index *big.Int) (common.Address, error) { + var out []interface{} + err := _EntitlementChecker.contract.Call(opts, &out, "getNodeAtIndex", index) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetNodeAtIndex is a free data retrieval call binding the contract method 0x3c59f126. +// +// Solidity: function getNodeAtIndex(uint256 index) view returns(address) +func (_EntitlementChecker *EntitlementCheckerSession) GetNodeAtIndex(index *big.Int) (common.Address, error) { + return _EntitlementChecker.Contract.GetNodeAtIndex(&_EntitlementChecker.CallOpts, index) +} + +// GetNodeAtIndex is a free data retrieval call binding the contract method 0x3c59f126. +// +// Solidity: function getNodeAtIndex(uint256 index) view returns(address) +func (_EntitlementChecker *EntitlementCheckerCallerSession) GetNodeAtIndex(index *big.Int) (common.Address, error) { + return _EntitlementChecker.Contract.GetNodeAtIndex(&_EntitlementChecker.CallOpts, index) +} + +// GetNodeCount is a free data retrieval call binding the contract method 0x39bf397e. +// +// Solidity: function getNodeCount() view returns(uint256) +func (_EntitlementChecker *EntitlementCheckerCaller) GetNodeCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _EntitlementChecker.contract.Call(opts, &out, "getNodeCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetNodeCount is a free data retrieval call binding the contract method 0x39bf397e. +// +// Solidity: function getNodeCount() view returns(uint256) +func (_EntitlementChecker *EntitlementCheckerSession) GetNodeCount() (*big.Int, error) { + return _EntitlementChecker.Contract.GetNodeCount(&_EntitlementChecker.CallOpts) +} + +// GetNodeCount is a free data retrieval call binding the contract method 0x39bf397e. +// +// Solidity: function getNodeCount() view returns(uint256) +func (_EntitlementChecker *EntitlementCheckerCallerSession) GetNodeCount() (*big.Int, error) { + return _EntitlementChecker.Contract.GetNodeCount(&_EntitlementChecker.CallOpts) +} + +// GetRandomNodes is a free data retrieval call binding the contract method 0x4f845445. +// +// Solidity: function getRandomNodes(uint256 count) view returns(address[]) +func (_EntitlementChecker *EntitlementCheckerCaller) GetRandomNodes(opts *bind.CallOpts, count *big.Int) ([]common.Address, error) { + var out []interface{} + err := _EntitlementChecker.contract.Call(opts, &out, "getRandomNodes", count) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetRandomNodes is a free data retrieval call binding the contract method 0x4f845445. +// +// Solidity: function getRandomNodes(uint256 count) view returns(address[]) +func (_EntitlementChecker *EntitlementCheckerSession) GetRandomNodes(count *big.Int) ([]common.Address, error) { + return _EntitlementChecker.Contract.GetRandomNodes(&_EntitlementChecker.CallOpts, count) +} + +// GetRandomNodes is a free data retrieval call binding the contract method 0x4f845445. +// +// Solidity: function getRandomNodes(uint256 count) view returns(address[]) +func (_EntitlementChecker *EntitlementCheckerCallerSession) GetRandomNodes(count *big.Int) ([]common.Address, error) { + return _EntitlementChecker.Contract.GetRandomNodes(&_EntitlementChecker.CallOpts, count) +} + +// IsValidNode is a free data retrieval call binding the contract method 0x9ebd11ef. +// +// Solidity: function isValidNode(address node) view returns(bool) +func (_EntitlementChecker *EntitlementCheckerCaller) IsValidNode(opts *bind.CallOpts, node common.Address) (bool, error) { + var out []interface{} + err := _EntitlementChecker.contract.Call(opts, &out, "isValidNode", node) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsValidNode is a free data retrieval call binding the contract method 0x9ebd11ef. +// +// Solidity: function isValidNode(address node) view returns(bool) +func (_EntitlementChecker *EntitlementCheckerSession) IsValidNode(node common.Address) (bool, error) { + return _EntitlementChecker.Contract.IsValidNode(&_EntitlementChecker.CallOpts, node) +} + +// IsValidNode is a free data retrieval call binding the contract method 0x9ebd11ef. +// +// Solidity: function isValidNode(address node) view returns(bool) +func (_EntitlementChecker *EntitlementCheckerCallerSession) IsValidNode(node common.Address) (bool, error) { + return _EntitlementChecker.Contract.IsValidNode(&_EntitlementChecker.CallOpts, node) +} + +// EntitlementCheckerInit is a paid mutator transaction binding the contract method 0x39dc5b3e. +// +// Solidity: function __EntitlementChecker_init() returns() +func (_EntitlementChecker *EntitlementCheckerTransactor) EntitlementCheckerInit(opts *bind.TransactOpts) (*types.Transaction, error) { + return _EntitlementChecker.contract.Transact(opts, "__EntitlementChecker_init") +} + +// EntitlementCheckerInit is a paid mutator transaction binding the contract method 0x39dc5b3e. +// +// Solidity: function __EntitlementChecker_init() returns() +func (_EntitlementChecker *EntitlementCheckerSession) EntitlementCheckerInit() (*types.Transaction, error) { + return _EntitlementChecker.Contract.EntitlementCheckerInit(&_EntitlementChecker.TransactOpts) +} + +// EntitlementCheckerInit is a paid mutator transaction binding the contract method 0x39dc5b3e. +// +// Solidity: function __EntitlementChecker_init() returns() +func (_EntitlementChecker *EntitlementCheckerTransactorSession) EntitlementCheckerInit() (*types.Transaction, error) { + return _EntitlementChecker.Contract.EntitlementCheckerInit(&_EntitlementChecker.TransactOpts) +} + +// RegisterNode is a paid mutator transaction binding the contract method 0x672d7a0d. +// +// Solidity: function registerNode(address node) returns() +func (_EntitlementChecker *EntitlementCheckerTransactor) RegisterNode(opts *bind.TransactOpts, node common.Address) (*types.Transaction, error) { + return _EntitlementChecker.contract.Transact(opts, "registerNode", node) +} + +// RegisterNode is a paid mutator transaction binding the contract method 0x672d7a0d. +// +// Solidity: function registerNode(address node) returns() +func (_EntitlementChecker *EntitlementCheckerSession) RegisterNode(node common.Address) (*types.Transaction, error) { + return _EntitlementChecker.Contract.RegisterNode(&_EntitlementChecker.TransactOpts, node) +} + +// RegisterNode is a paid mutator transaction binding the contract method 0x672d7a0d. +// +// Solidity: function registerNode(address node) returns() +func (_EntitlementChecker *EntitlementCheckerTransactorSession) RegisterNode(node common.Address) (*types.Transaction, error) { + return _EntitlementChecker.Contract.RegisterNode(&_EntitlementChecker.TransactOpts, node) +} + +// RequestEntitlementCheck is a paid mutator transaction binding the contract method 0x541da4e5. +// +// Solidity: function requestEntitlementCheck(address callerAddress, bytes32 transactionId, uint256 roleId, address[] nodes) returns() +func (_EntitlementChecker *EntitlementCheckerTransactor) RequestEntitlementCheck(opts *bind.TransactOpts, callerAddress common.Address, transactionId [32]byte, roleId *big.Int, nodes []common.Address) (*types.Transaction, error) { + return _EntitlementChecker.contract.Transact(opts, "requestEntitlementCheck", callerAddress, transactionId, roleId, nodes) +} + +// RequestEntitlementCheck is a paid mutator transaction binding the contract method 0x541da4e5. +// +// Solidity: function requestEntitlementCheck(address callerAddress, bytes32 transactionId, uint256 roleId, address[] nodes) returns() +func (_EntitlementChecker *EntitlementCheckerSession) RequestEntitlementCheck(callerAddress common.Address, transactionId [32]byte, roleId *big.Int, nodes []common.Address) (*types.Transaction, error) { + return _EntitlementChecker.Contract.RequestEntitlementCheck(&_EntitlementChecker.TransactOpts, callerAddress, transactionId, roleId, nodes) +} + +// RequestEntitlementCheck is a paid mutator transaction binding the contract method 0x541da4e5. +// +// Solidity: function requestEntitlementCheck(address callerAddress, bytes32 transactionId, uint256 roleId, address[] nodes) returns() +func (_EntitlementChecker *EntitlementCheckerTransactorSession) RequestEntitlementCheck(callerAddress common.Address, transactionId [32]byte, roleId *big.Int, nodes []common.Address) (*types.Transaction, error) { + return _EntitlementChecker.Contract.RequestEntitlementCheck(&_EntitlementChecker.TransactOpts, callerAddress, transactionId, roleId, nodes) +} + +// UnregisterNode is a paid mutator transaction binding the contract method 0xc5e41cf6. +// +// Solidity: function unregisterNode(address node) returns() +func (_EntitlementChecker *EntitlementCheckerTransactor) UnregisterNode(opts *bind.TransactOpts, node common.Address) (*types.Transaction, error) { + return _EntitlementChecker.contract.Transact(opts, "unregisterNode", node) +} + +// UnregisterNode is a paid mutator transaction binding the contract method 0xc5e41cf6. +// +// Solidity: function unregisterNode(address node) returns() +func (_EntitlementChecker *EntitlementCheckerSession) UnregisterNode(node common.Address) (*types.Transaction, error) { + return _EntitlementChecker.Contract.UnregisterNode(&_EntitlementChecker.TransactOpts, node) +} + +// UnregisterNode is a paid mutator transaction binding the contract method 0xc5e41cf6. +// +// Solidity: function unregisterNode(address node) returns() +func (_EntitlementChecker *EntitlementCheckerTransactorSession) UnregisterNode(node common.Address) (*types.Transaction, error) { + return _EntitlementChecker.Contract.UnregisterNode(&_EntitlementChecker.TransactOpts, node) +} + +// EntitlementCheckerEntitlementCheckRequestedIterator is returned from FilterEntitlementCheckRequested and is used to iterate over the raw logs and unpacked data for EntitlementCheckRequested events raised by the EntitlementChecker contract. +type EntitlementCheckerEntitlementCheckRequestedIterator struct { + Event *EntitlementCheckerEntitlementCheckRequested // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EntitlementCheckerEntitlementCheckRequestedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerEntitlementCheckRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerEntitlementCheckRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EntitlementCheckerEntitlementCheckRequestedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EntitlementCheckerEntitlementCheckRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EntitlementCheckerEntitlementCheckRequested represents a EntitlementCheckRequested event raised by the EntitlementChecker contract. +type EntitlementCheckerEntitlementCheckRequested struct { + CallerAddress common.Address + ContractAddress common.Address + TransactionId [32]byte + RoleId *big.Int + SelectedNodes []common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEntitlementCheckRequested is a free log retrieval operation binding the contract event 0x4675e3cc15801ffde520a3076d6ad75c0c6dbe8f23bdbea1dd45b676caffe4f3. +// +// Solidity: event EntitlementCheckRequested(address callerAddress, address contractAddress, bytes32 transactionId, uint256 roleId, address[] selectedNodes) +func (_EntitlementChecker *EntitlementCheckerFilterer) FilterEntitlementCheckRequested(opts *bind.FilterOpts) (*EntitlementCheckerEntitlementCheckRequestedIterator, error) { + + logs, sub, err := _EntitlementChecker.contract.FilterLogs(opts, "EntitlementCheckRequested") + if err != nil { + return nil, err + } + return &EntitlementCheckerEntitlementCheckRequestedIterator{contract: _EntitlementChecker.contract, event: "EntitlementCheckRequested", logs: logs, sub: sub}, nil +} + +// WatchEntitlementCheckRequested is a free log subscription operation binding the contract event 0x4675e3cc15801ffde520a3076d6ad75c0c6dbe8f23bdbea1dd45b676caffe4f3. +// +// Solidity: event EntitlementCheckRequested(address callerAddress, address contractAddress, bytes32 transactionId, uint256 roleId, address[] selectedNodes) +func (_EntitlementChecker *EntitlementCheckerFilterer) WatchEntitlementCheckRequested(opts *bind.WatchOpts, sink chan<- *EntitlementCheckerEntitlementCheckRequested) (event.Subscription, error) { + + logs, sub, err := _EntitlementChecker.contract.WatchLogs(opts, "EntitlementCheckRequested") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EntitlementCheckerEntitlementCheckRequested) + if err := _EntitlementChecker.contract.UnpackLog(event, "EntitlementCheckRequested", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEntitlementCheckRequested is a log parse operation binding the contract event 0x4675e3cc15801ffde520a3076d6ad75c0c6dbe8f23bdbea1dd45b676caffe4f3. +// +// Solidity: event EntitlementCheckRequested(address callerAddress, address contractAddress, bytes32 transactionId, uint256 roleId, address[] selectedNodes) +func (_EntitlementChecker *EntitlementCheckerFilterer) ParseEntitlementCheckRequested(log types.Log) (*EntitlementCheckerEntitlementCheckRequested, error) { + event := new(EntitlementCheckerEntitlementCheckRequested) + if err := _EntitlementChecker.contract.UnpackLog(event, "EntitlementCheckRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EntitlementCheckerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the EntitlementChecker contract. +type EntitlementCheckerInitializedIterator struct { + Event *EntitlementCheckerInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EntitlementCheckerInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EntitlementCheckerInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EntitlementCheckerInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EntitlementCheckerInitialized represents a Initialized event raised by the EntitlementChecker contract. +type EntitlementCheckerInitialized struct { + Version uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_EntitlementChecker *EntitlementCheckerFilterer) FilterInitialized(opts *bind.FilterOpts) (*EntitlementCheckerInitializedIterator, error) { + + logs, sub, err := _EntitlementChecker.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &EntitlementCheckerInitializedIterator{contract: _EntitlementChecker.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_EntitlementChecker *EntitlementCheckerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *EntitlementCheckerInitialized) (event.Subscription, error) { + + logs, sub, err := _EntitlementChecker.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EntitlementCheckerInitialized) + if err := _EntitlementChecker.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_EntitlementChecker *EntitlementCheckerFilterer) ParseInitialized(log types.Log) (*EntitlementCheckerInitialized, error) { + event := new(EntitlementCheckerInitialized) + if err := _EntitlementChecker.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EntitlementCheckerInterfaceAddedIterator is returned from FilterInterfaceAdded and is used to iterate over the raw logs and unpacked data for InterfaceAdded events raised by the EntitlementChecker contract. +type EntitlementCheckerInterfaceAddedIterator struct { + Event *EntitlementCheckerInterfaceAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EntitlementCheckerInterfaceAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerInterfaceAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerInterfaceAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EntitlementCheckerInterfaceAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EntitlementCheckerInterfaceAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EntitlementCheckerInterfaceAdded represents a InterfaceAdded event raised by the EntitlementChecker contract. +type EntitlementCheckerInterfaceAdded struct { + InterfaceId [4]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInterfaceAdded is a free log retrieval operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_EntitlementChecker *EntitlementCheckerFilterer) FilterInterfaceAdded(opts *bind.FilterOpts, interfaceId [][4]byte) (*EntitlementCheckerInterfaceAddedIterator, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _EntitlementChecker.contract.FilterLogs(opts, "InterfaceAdded", interfaceIdRule) + if err != nil { + return nil, err + } + return &EntitlementCheckerInterfaceAddedIterator{contract: _EntitlementChecker.contract, event: "InterfaceAdded", logs: logs, sub: sub}, nil +} + +// WatchInterfaceAdded is a free log subscription operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_EntitlementChecker *EntitlementCheckerFilterer) WatchInterfaceAdded(opts *bind.WatchOpts, sink chan<- *EntitlementCheckerInterfaceAdded, interfaceId [][4]byte) (event.Subscription, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _EntitlementChecker.contract.WatchLogs(opts, "InterfaceAdded", interfaceIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EntitlementCheckerInterfaceAdded) + if err := _EntitlementChecker.contract.UnpackLog(event, "InterfaceAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInterfaceAdded is a log parse operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_EntitlementChecker *EntitlementCheckerFilterer) ParseInterfaceAdded(log types.Log) (*EntitlementCheckerInterfaceAdded, error) { + event := new(EntitlementCheckerInterfaceAdded) + if err := _EntitlementChecker.contract.UnpackLog(event, "InterfaceAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EntitlementCheckerInterfaceRemovedIterator is returned from FilterInterfaceRemoved and is used to iterate over the raw logs and unpacked data for InterfaceRemoved events raised by the EntitlementChecker contract. +type EntitlementCheckerInterfaceRemovedIterator struct { + Event *EntitlementCheckerInterfaceRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EntitlementCheckerInterfaceRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerInterfaceRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerInterfaceRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EntitlementCheckerInterfaceRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EntitlementCheckerInterfaceRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EntitlementCheckerInterfaceRemoved represents a InterfaceRemoved event raised by the EntitlementChecker contract. +type EntitlementCheckerInterfaceRemoved struct { + InterfaceId [4]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInterfaceRemoved is a free log retrieval operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_EntitlementChecker *EntitlementCheckerFilterer) FilterInterfaceRemoved(opts *bind.FilterOpts, interfaceId [][4]byte) (*EntitlementCheckerInterfaceRemovedIterator, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _EntitlementChecker.contract.FilterLogs(opts, "InterfaceRemoved", interfaceIdRule) + if err != nil { + return nil, err + } + return &EntitlementCheckerInterfaceRemovedIterator{contract: _EntitlementChecker.contract, event: "InterfaceRemoved", logs: logs, sub: sub}, nil +} + +// WatchInterfaceRemoved is a free log subscription operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_EntitlementChecker *EntitlementCheckerFilterer) WatchInterfaceRemoved(opts *bind.WatchOpts, sink chan<- *EntitlementCheckerInterfaceRemoved, interfaceId [][4]byte) (event.Subscription, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _EntitlementChecker.contract.WatchLogs(opts, "InterfaceRemoved", interfaceIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EntitlementCheckerInterfaceRemoved) + if err := _EntitlementChecker.contract.UnpackLog(event, "InterfaceRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInterfaceRemoved is a log parse operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_EntitlementChecker *EntitlementCheckerFilterer) ParseInterfaceRemoved(log types.Log) (*EntitlementCheckerInterfaceRemoved, error) { + event := new(EntitlementCheckerInterfaceRemoved) + if err := _EntitlementChecker.contract.UnpackLog(event, "InterfaceRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EntitlementCheckerNodeRegisteredIterator is returned from FilterNodeRegistered and is used to iterate over the raw logs and unpacked data for NodeRegistered events raised by the EntitlementChecker contract. +type EntitlementCheckerNodeRegisteredIterator struct { + Event *EntitlementCheckerNodeRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EntitlementCheckerNodeRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerNodeRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerNodeRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EntitlementCheckerNodeRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EntitlementCheckerNodeRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EntitlementCheckerNodeRegistered represents a NodeRegistered event raised by the EntitlementChecker contract. +type EntitlementCheckerNodeRegistered struct { + NodeAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeRegistered is a free log retrieval operation binding the contract event 0x564728e6a7c8edd446557d94e0339d5e6ca2e05f42188914efdbdc87bcbbabf6. +// +// Solidity: event NodeRegistered(address indexed nodeAddress) +func (_EntitlementChecker *EntitlementCheckerFilterer) FilterNodeRegistered(opts *bind.FilterOpts, nodeAddress []common.Address) (*EntitlementCheckerNodeRegisteredIterator, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _EntitlementChecker.contract.FilterLogs(opts, "NodeRegistered", nodeAddressRule) + if err != nil { + return nil, err + } + return &EntitlementCheckerNodeRegisteredIterator{contract: _EntitlementChecker.contract, event: "NodeRegistered", logs: logs, sub: sub}, nil +} + +// WatchNodeRegistered is a free log subscription operation binding the contract event 0x564728e6a7c8edd446557d94e0339d5e6ca2e05f42188914efdbdc87bcbbabf6. +// +// Solidity: event NodeRegistered(address indexed nodeAddress) +func (_EntitlementChecker *EntitlementCheckerFilterer) WatchNodeRegistered(opts *bind.WatchOpts, sink chan<- *EntitlementCheckerNodeRegistered, nodeAddress []common.Address) (event.Subscription, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _EntitlementChecker.contract.WatchLogs(opts, "NodeRegistered", nodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EntitlementCheckerNodeRegistered) + if err := _EntitlementChecker.contract.UnpackLog(event, "NodeRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeRegistered is a log parse operation binding the contract event 0x564728e6a7c8edd446557d94e0339d5e6ca2e05f42188914efdbdc87bcbbabf6. +// +// Solidity: event NodeRegistered(address indexed nodeAddress) +func (_EntitlementChecker *EntitlementCheckerFilterer) ParseNodeRegistered(log types.Log) (*EntitlementCheckerNodeRegistered, error) { + event := new(EntitlementCheckerNodeRegistered) + if err := _EntitlementChecker.contract.UnpackLog(event, "NodeRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EntitlementCheckerNodeUnregisteredIterator is returned from FilterNodeUnregistered and is used to iterate over the raw logs and unpacked data for NodeUnregistered events raised by the EntitlementChecker contract. +type EntitlementCheckerNodeUnregisteredIterator struct { + Event *EntitlementCheckerNodeUnregistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EntitlementCheckerNodeUnregisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerNodeUnregistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerNodeUnregistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EntitlementCheckerNodeUnregisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EntitlementCheckerNodeUnregisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EntitlementCheckerNodeUnregistered represents a NodeUnregistered event raised by the EntitlementChecker contract. +type EntitlementCheckerNodeUnregistered struct { + NodeAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeUnregistered is a free log retrieval operation binding the contract event 0xb1864577e4f285436a80ebc833984755393e2450d58622a65fb4fce87ea3573a. +// +// Solidity: event NodeUnregistered(address indexed nodeAddress) +func (_EntitlementChecker *EntitlementCheckerFilterer) FilterNodeUnregistered(opts *bind.FilterOpts, nodeAddress []common.Address) (*EntitlementCheckerNodeUnregisteredIterator, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _EntitlementChecker.contract.FilterLogs(opts, "NodeUnregistered", nodeAddressRule) + if err != nil { + return nil, err + } + return &EntitlementCheckerNodeUnregisteredIterator{contract: _EntitlementChecker.contract, event: "NodeUnregistered", logs: logs, sub: sub}, nil +} + +// WatchNodeUnregistered is a free log subscription operation binding the contract event 0xb1864577e4f285436a80ebc833984755393e2450d58622a65fb4fce87ea3573a. +// +// Solidity: event NodeUnregistered(address indexed nodeAddress) +func (_EntitlementChecker *EntitlementCheckerFilterer) WatchNodeUnregistered(opts *bind.WatchOpts, sink chan<- *EntitlementCheckerNodeUnregistered, nodeAddress []common.Address) (event.Subscription, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _EntitlementChecker.contract.WatchLogs(opts, "NodeUnregistered", nodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EntitlementCheckerNodeUnregistered) + if err := _EntitlementChecker.contract.UnpackLog(event, "NodeUnregistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeUnregistered is a log parse operation binding the contract event 0xb1864577e4f285436a80ebc833984755393e2450d58622a65fb4fce87ea3573a. +// +// Solidity: event NodeUnregistered(address indexed nodeAddress) +func (_EntitlementChecker *EntitlementCheckerFilterer) ParseNodeUnregistered(log types.Log) (*EntitlementCheckerNodeUnregistered, error) { + event := new(EntitlementCheckerNodeUnregistered) + if err := _EntitlementChecker.contract.UnpackLog(event, "NodeUnregistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/xchain/contracts/dev/i_custom_entitlement.go b/core/xchain/contracts/dev/i_custom_entitlement.go new file mode 100644 index 000000000..4cc6be39c --- /dev/null +++ b/core/xchain/contracts/dev/i_custom_entitlement.go @@ -0,0 +1,212 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package dev + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ICustomEntitlementMetaData contains all meta data concerning the ICustomEntitlement contract. +var ICustomEntitlementMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"isEntitled\",\"inputs\":[{\"name\":\"user\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"}]", +} + +// ICustomEntitlementABI is the input ABI used to generate the binding from. +// Deprecated: Use ICustomEntitlementMetaData.ABI instead. +var ICustomEntitlementABI = ICustomEntitlementMetaData.ABI + +// ICustomEntitlement is an auto generated Go binding around an Ethereum contract. +type ICustomEntitlement struct { + ICustomEntitlementCaller // Read-only binding to the contract + ICustomEntitlementTransactor // Write-only binding to the contract + ICustomEntitlementFilterer // Log filterer for contract events +} + +// ICustomEntitlementCaller is an auto generated read-only Go binding around an Ethereum contract. +type ICustomEntitlementCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ICustomEntitlementTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ICustomEntitlementTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ICustomEntitlementFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ICustomEntitlementFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ICustomEntitlementSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ICustomEntitlementSession struct { + Contract *ICustomEntitlement // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ICustomEntitlementCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ICustomEntitlementCallerSession struct { + Contract *ICustomEntitlementCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ICustomEntitlementTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ICustomEntitlementTransactorSession struct { + Contract *ICustomEntitlementTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ICustomEntitlementRaw is an auto generated low-level Go binding around an Ethereum contract. +type ICustomEntitlementRaw struct { + Contract *ICustomEntitlement // Generic contract binding to access the raw methods on +} + +// ICustomEntitlementCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ICustomEntitlementCallerRaw struct { + Contract *ICustomEntitlementCaller // Generic read-only contract binding to access the raw methods on +} + +// ICustomEntitlementTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ICustomEntitlementTransactorRaw struct { + Contract *ICustomEntitlementTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewICustomEntitlement creates a new instance of ICustomEntitlement, bound to a specific deployed contract. +func NewICustomEntitlement(address common.Address, backend bind.ContractBackend) (*ICustomEntitlement, error) { + contract, err := bindICustomEntitlement(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ICustomEntitlement{ICustomEntitlementCaller: ICustomEntitlementCaller{contract: contract}, ICustomEntitlementTransactor: ICustomEntitlementTransactor{contract: contract}, ICustomEntitlementFilterer: ICustomEntitlementFilterer{contract: contract}}, nil +} + +// NewICustomEntitlementCaller creates a new read-only instance of ICustomEntitlement, bound to a specific deployed contract. +func NewICustomEntitlementCaller(address common.Address, caller bind.ContractCaller) (*ICustomEntitlementCaller, error) { + contract, err := bindICustomEntitlement(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ICustomEntitlementCaller{contract: contract}, nil +} + +// NewICustomEntitlementTransactor creates a new write-only instance of ICustomEntitlement, bound to a specific deployed contract. +func NewICustomEntitlementTransactor(address common.Address, transactor bind.ContractTransactor) (*ICustomEntitlementTransactor, error) { + contract, err := bindICustomEntitlement(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ICustomEntitlementTransactor{contract: contract}, nil +} + +// NewICustomEntitlementFilterer creates a new log filterer instance of ICustomEntitlement, bound to a specific deployed contract. +func NewICustomEntitlementFilterer(address common.Address, filterer bind.ContractFilterer) (*ICustomEntitlementFilterer, error) { + contract, err := bindICustomEntitlement(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ICustomEntitlementFilterer{contract: contract}, nil +} + +// bindICustomEntitlement binds a generic wrapper to an already deployed contract. +func bindICustomEntitlement(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ICustomEntitlementMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ICustomEntitlement *ICustomEntitlementRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ICustomEntitlement.Contract.ICustomEntitlementCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ICustomEntitlement *ICustomEntitlementRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ICustomEntitlement.Contract.ICustomEntitlementTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ICustomEntitlement *ICustomEntitlementRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ICustomEntitlement.Contract.ICustomEntitlementTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ICustomEntitlement *ICustomEntitlementCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ICustomEntitlement.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ICustomEntitlement *ICustomEntitlementTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ICustomEntitlement.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ICustomEntitlement *ICustomEntitlementTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ICustomEntitlement.Contract.contract.Transact(opts, method, params...) +} + +// IsEntitled is a free data retrieval call binding the contract method 0xddc6e68e. +// +// Solidity: function isEntitled(address[] user) view returns(bool) +func (_ICustomEntitlement *ICustomEntitlementCaller) IsEntitled(opts *bind.CallOpts, user []common.Address) (bool, error) { + var out []interface{} + err := _ICustomEntitlement.contract.Call(opts, &out, "isEntitled", user) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsEntitled is a free data retrieval call binding the contract method 0xddc6e68e. +// +// Solidity: function isEntitled(address[] user) view returns(bool) +func (_ICustomEntitlement *ICustomEntitlementSession) IsEntitled(user []common.Address) (bool, error) { + return _ICustomEntitlement.Contract.IsEntitled(&_ICustomEntitlement.CallOpts, user) +} + +// IsEntitled is a free data retrieval call binding the contract method 0xddc6e68e. +// +// Solidity: function isEntitled(address[] user) view returns(bool) +func (_ICustomEntitlement *ICustomEntitlementCallerSession) IsEntitled(user []common.Address) (bool, error) { + return _ICustomEntitlement.Contract.IsEntitled(&_ICustomEntitlement.CallOpts, user) +} diff --git a/core/xchain/contracts/dev/i_entitlement.go b/core/xchain/contracts/dev/i_entitlement.go new file mode 100644 index 000000000..7830053db --- /dev/null +++ b/core/xchain/contracts/dev/i_entitlement.go @@ -0,0 +1,430 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package dev + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// IEntitlementMetaData contains all meta data concerning the IEntitlement contract. +var IEntitlementMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"description\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEntitlementDataByRoleId\",\"inputs\":[{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"space\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isCrosschain\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isEntitled\",\"inputs\":[{\"name\":\"channelId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"user\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"permission\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"moduleType\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeEntitlement\",\"inputs\":[{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setEntitlement\",\"inputs\":[{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"entitlementData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"error\",\"name\":\"Entitlement__InvalidValue\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Entitlement__NotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Entitlement__NotMember\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Entitlement__ValueAlreadyExists\",\"inputs\":[]}]", +} + +// IEntitlementABI is the input ABI used to generate the binding from. +// Deprecated: Use IEntitlementMetaData.ABI instead. +var IEntitlementABI = IEntitlementMetaData.ABI + +// IEntitlement is an auto generated Go binding around an Ethereum contract. +type IEntitlement struct { + IEntitlementCaller // Read-only binding to the contract + IEntitlementTransactor // Write-only binding to the contract + IEntitlementFilterer // Log filterer for contract events +} + +// IEntitlementCaller is an auto generated read-only Go binding around an Ethereum contract. +type IEntitlementCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IEntitlementTransactor is an auto generated write-only Go binding around an Ethereum contract. +type IEntitlementTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IEntitlementFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type IEntitlementFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IEntitlementSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type IEntitlementSession struct { + Contract *IEntitlement // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IEntitlementCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type IEntitlementCallerSession struct { + Contract *IEntitlementCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// IEntitlementTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type IEntitlementTransactorSession struct { + Contract *IEntitlementTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IEntitlementRaw is an auto generated low-level Go binding around an Ethereum contract. +type IEntitlementRaw struct { + Contract *IEntitlement // Generic contract binding to access the raw methods on +} + +// IEntitlementCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type IEntitlementCallerRaw struct { + Contract *IEntitlementCaller // Generic read-only contract binding to access the raw methods on +} + +// IEntitlementTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type IEntitlementTransactorRaw struct { + Contract *IEntitlementTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewIEntitlement creates a new instance of IEntitlement, bound to a specific deployed contract. +func NewIEntitlement(address common.Address, backend bind.ContractBackend) (*IEntitlement, error) { + contract, err := bindIEntitlement(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &IEntitlement{IEntitlementCaller: IEntitlementCaller{contract: contract}, IEntitlementTransactor: IEntitlementTransactor{contract: contract}, IEntitlementFilterer: IEntitlementFilterer{contract: contract}}, nil +} + +// NewIEntitlementCaller creates a new read-only instance of IEntitlement, bound to a specific deployed contract. +func NewIEntitlementCaller(address common.Address, caller bind.ContractCaller) (*IEntitlementCaller, error) { + contract, err := bindIEntitlement(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &IEntitlementCaller{contract: contract}, nil +} + +// NewIEntitlementTransactor creates a new write-only instance of IEntitlement, bound to a specific deployed contract. +func NewIEntitlementTransactor(address common.Address, transactor bind.ContractTransactor) (*IEntitlementTransactor, error) { + contract, err := bindIEntitlement(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &IEntitlementTransactor{contract: contract}, nil +} + +// NewIEntitlementFilterer creates a new log filterer instance of IEntitlement, bound to a specific deployed contract. +func NewIEntitlementFilterer(address common.Address, filterer bind.ContractFilterer) (*IEntitlementFilterer, error) { + contract, err := bindIEntitlement(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &IEntitlementFilterer{contract: contract}, nil +} + +// bindIEntitlement binds a generic wrapper to an already deployed contract. +func bindIEntitlement(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := IEntitlementMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IEntitlement *IEntitlementRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IEntitlement.Contract.IEntitlementCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IEntitlement *IEntitlementRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IEntitlement.Contract.IEntitlementTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IEntitlement *IEntitlementRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IEntitlement.Contract.IEntitlementTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IEntitlement *IEntitlementCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IEntitlement.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IEntitlement *IEntitlementTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IEntitlement.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IEntitlement *IEntitlementTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IEntitlement.Contract.contract.Transact(opts, method, params...) +} + +// Description is a free data retrieval call binding the contract method 0x7284e416. +// +// Solidity: function description() view returns(string) +func (_IEntitlement *IEntitlementCaller) Description(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _IEntitlement.contract.Call(opts, &out, "description") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Description is a free data retrieval call binding the contract method 0x7284e416. +// +// Solidity: function description() view returns(string) +func (_IEntitlement *IEntitlementSession) Description() (string, error) { + return _IEntitlement.Contract.Description(&_IEntitlement.CallOpts) +} + +// Description is a free data retrieval call binding the contract method 0x7284e416. +// +// Solidity: function description() view returns(string) +func (_IEntitlement *IEntitlementCallerSession) Description() (string, error) { + return _IEntitlement.Contract.Description(&_IEntitlement.CallOpts) +} + +// GetEntitlementDataByRoleId is a free data retrieval call binding the contract method 0x1eee07b2. +// +// Solidity: function getEntitlementDataByRoleId(uint256 roleId) view returns(bytes) +func (_IEntitlement *IEntitlementCaller) GetEntitlementDataByRoleId(opts *bind.CallOpts, roleId *big.Int) ([]byte, error) { + var out []interface{} + err := _IEntitlement.contract.Call(opts, &out, "getEntitlementDataByRoleId", roleId) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetEntitlementDataByRoleId is a free data retrieval call binding the contract method 0x1eee07b2. +// +// Solidity: function getEntitlementDataByRoleId(uint256 roleId) view returns(bytes) +func (_IEntitlement *IEntitlementSession) GetEntitlementDataByRoleId(roleId *big.Int) ([]byte, error) { + return _IEntitlement.Contract.GetEntitlementDataByRoleId(&_IEntitlement.CallOpts, roleId) +} + +// GetEntitlementDataByRoleId is a free data retrieval call binding the contract method 0x1eee07b2. +// +// Solidity: function getEntitlementDataByRoleId(uint256 roleId) view returns(bytes) +func (_IEntitlement *IEntitlementCallerSession) GetEntitlementDataByRoleId(roleId *big.Int) ([]byte, error) { + return _IEntitlement.Contract.GetEntitlementDataByRoleId(&_IEntitlement.CallOpts, roleId) +} + +// IsCrosschain is a free data retrieval call binding the contract method 0x2e1b61e4. +// +// Solidity: function isCrosschain() view returns(bool) +func (_IEntitlement *IEntitlementCaller) IsCrosschain(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _IEntitlement.contract.Call(opts, &out, "isCrosschain") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsCrosschain is a free data retrieval call binding the contract method 0x2e1b61e4. +// +// Solidity: function isCrosschain() view returns(bool) +func (_IEntitlement *IEntitlementSession) IsCrosschain() (bool, error) { + return _IEntitlement.Contract.IsCrosschain(&_IEntitlement.CallOpts) +} + +// IsCrosschain is a free data retrieval call binding the contract method 0x2e1b61e4. +// +// Solidity: function isCrosschain() view returns(bool) +func (_IEntitlement *IEntitlementCallerSession) IsCrosschain() (bool, error) { + return _IEntitlement.Contract.IsCrosschain(&_IEntitlement.CallOpts) +} + +// IsEntitled is a free data retrieval call binding the contract method 0x0cf0b533. +// +// Solidity: function isEntitled(bytes32 channelId, address[] user, bytes32 permission) view returns(bool) +func (_IEntitlement *IEntitlementCaller) IsEntitled(opts *bind.CallOpts, channelId [32]byte, user []common.Address, permission [32]byte) (bool, error) { + var out []interface{} + err := _IEntitlement.contract.Call(opts, &out, "isEntitled", channelId, user, permission) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsEntitled is a free data retrieval call binding the contract method 0x0cf0b533. +// +// Solidity: function isEntitled(bytes32 channelId, address[] user, bytes32 permission) view returns(bool) +func (_IEntitlement *IEntitlementSession) IsEntitled(channelId [32]byte, user []common.Address, permission [32]byte) (bool, error) { + return _IEntitlement.Contract.IsEntitled(&_IEntitlement.CallOpts, channelId, user, permission) +} + +// IsEntitled is a free data retrieval call binding the contract method 0x0cf0b533. +// +// Solidity: function isEntitled(bytes32 channelId, address[] user, bytes32 permission) view returns(bool) +func (_IEntitlement *IEntitlementCallerSession) IsEntitled(channelId [32]byte, user []common.Address, permission [32]byte) (bool, error) { + return _IEntitlement.Contract.IsEntitled(&_IEntitlement.CallOpts, channelId, user, permission) +} + +// ModuleType is a free data retrieval call binding the contract method 0x6465e69f. +// +// Solidity: function moduleType() view returns(string) +func (_IEntitlement *IEntitlementCaller) ModuleType(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _IEntitlement.contract.Call(opts, &out, "moduleType") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// ModuleType is a free data retrieval call binding the contract method 0x6465e69f. +// +// Solidity: function moduleType() view returns(string) +func (_IEntitlement *IEntitlementSession) ModuleType() (string, error) { + return _IEntitlement.Contract.ModuleType(&_IEntitlement.CallOpts) +} + +// ModuleType is a free data retrieval call binding the contract method 0x6465e69f. +// +// Solidity: function moduleType() view returns(string) +func (_IEntitlement *IEntitlementCallerSession) ModuleType() (string, error) { + return _IEntitlement.Contract.ModuleType(&_IEntitlement.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_IEntitlement *IEntitlementCaller) Name(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _IEntitlement.contract.Call(opts, &out, "name") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_IEntitlement *IEntitlementSession) Name() (string, error) { + return _IEntitlement.Contract.Name(&_IEntitlement.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_IEntitlement *IEntitlementCallerSession) Name() (string, error) { + return _IEntitlement.Contract.Name(&_IEntitlement.CallOpts) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address space) returns() +func (_IEntitlement *IEntitlementTransactor) Initialize(opts *bind.TransactOpts, space common.Address) (*types.Transaction, error) { + return _IEntitlement.contract.Transact(opts, "initialize", space) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address space) returns() +func (_IEntitlement *IEntitlementSession) Initialize(space common.Address) (*types.Transaction, error) { + return _IEntitlement.Contract.Initialize(&_IEntitlement.TransactOpts, space) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address space) returns() +func (_IEntitlement *IEntitlementTransactorSession) Initialize(space common.Address) (*types.Transaction, error) { + return _IEntitlement.Contract.Initialize(&_IEntitlement.TransactOpts, space) +} + +// RemoveEntitlement is a paid mutator transaction binding the contract method 0xf0c111f9. +// +// Solidity: function removeEntitlement(uint256 roleId) returns() +func (_IEntitlement *IEntitlementTransactor) RemoveEntitlement(opts *bind.TransactOpts, roleId *big.Int) (*types.Transaction, error) { + return _IEntitlement.contract.Transact(opts, "removeEntitlement", roleId) +} + +// RemoveEntitlement is a paid mutator transaction binding the contract method 0xf0c111f9. +// +// Solidity: function removeEntitlement(uint256 roleId) returns() +func (_IEntitlement *IEntitlementSession) RemoveEntitlement(roleId *big.Int) (*types.Transaction, error) { + return _IEntitlement.Contract.RemoveEntitlement(&_IEntitlement.TransactOpts, roleId) +} + +// RemoveEntitlement is a paid mutator transaction binding the contract method 0xf0c111f9. +// +// Solidity: function removeEntitlement(uint256 roleId) returns() +func (_IEntitlement *IEntitlementTransactorSession) RemoveEntitlement(roleId *big.Int) (*types.Transaction, error) { + return _IEntitlement.Contract.RemoveEntitlement(&_IEntitlement.TransactOpts, roleId) +} + +// SetEntitlement is a paid mutator transaction binding the contract method 0xef8be574. +// +// Solidity: function setEntitlement(uint256 roleId, bytes entitlementData) returns() +func (_IEntitlement *IEntitlementTransactor) SetEntitlement(opts *bind.TransactOpts, roleId *big.Int, entitlementData []byte) (*types.Transaction, error) { + return _IEntitlement.contract.Transact(opts, "setEntitlement", roleId, entitlementData) +} + +// SetEntitlement is a paid mutator transaction binding the contract method 0xef8be574. +// +// Solidity: function setEntitlement(uint256 roleId, bytes entitlementData) returns() +func (_IEntitlement *IEntitlementSession) SetEntitlement(roleId *big.Int, entitlementData []byte) (*types.Transaction, error) { + return _IEntitlement.Contract.SetEntitlement(&_IEntitlement.TransactOpts, roleId, entitlementData) +} + +// SetEntitlement is a paid mutator transaction binding the contract method 0xef8be574. +// +// Solidity: function setEntitlement(uint256 roleId, bytes entitlementData) returns() +func (_IEntitlement *IEntitlementTransactorSession) SetEntitlement(roleId *big.Int, entitlementData []byte) (*types.Transaction, error) { + return _IEntitlement.Contract.SetEntitlement(&_IEntitlement.TransactOpts, roleId, entitlementData) +} diff --git a/core/xchain/contracts/dev/i_entitlement_checker.go b/core/xchain/contracts/dev/i_entitlement_checker.go new file mode 100644 index 000000000..812fbb66e --- /dev/null +++ b/core/xchain/contracts/dev/i_entitlement_checker.go @@ -0,0 +1,794 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package dev + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// IEntitlementCheckerMetaData contains all meta data concerning the IEntitlementChecker contract. +var IEntitlementCheckerMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"getNodeAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNodeCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRandomNodes\",\"inputs\":[{\"name\":\"count\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isValidNode\",\"inputs\":[{\"name\":\"node\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerNode\",\"inputs\":[{\"name\":\"node\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestEntitlementCheck\",\"inputs\":[{\"name\":\"callerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"transactionId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unregisterNode\",\"inputs\":[{\"name\":\"node\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"EntitlementCheckRequested\",\"inputs\":[{\"name\":\"callerAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contractAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"transactionId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"selectedNodes\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NodeRegistered\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NodeUnregistered\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"EntitlementChecker_InsufficientNumberOfNodes\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementChecker_InvalidNodeOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementChecker_NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementChecker_NodeNotRegistered\",\"inputs\":[]}]", +} + +// IEntitlementCheckerABI is the input ABI used to generate the binding from. +// Deprecated: Use IEntitlementCheckerMetaData.ABI instead. +var IEntitlementCheckerABI = IEntitlementCheckerMetaData.ABI + +// IEntitlementChecker is an auto generated Go binding around an Ethereum contract. +type IEntitlementChecker struct { + IEntitlementCheckerCaller // Read-only binding to the contract + IEntitlementCheckerTransactor // Write-only binding to the contract + IEntitlementCheckerFilterer // Log filterer for contract events +} + +// IEntitlementCheckerCaller is an auto generated read-only Go binding around an Ethereum contract. +type IEntitlementCheckerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IEntitlementCheckerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type IEntitlementCheckerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IEntitlementCheckerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type IEntitlementCheckerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IEntitlementCheckerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type IEntitlementCheckerSession struct { + Contract *IEntitlementChecker // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IEntitlementCheckerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type IEntitlementCheckerCallerSession struct { + Contract *IEntitlementCheckerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// IEntitlementCheckerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type IEntitlementCheckerTransactorSession struct { + Contract *IEntitlementCheckerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IEntitlementCheckerRaw is an auto generated low-level Go binding around an Ethereum contract. +type IEntitlementCheckerRaw struct { + Contract *IEntitlementChecker // Generic contract binding to access the raw methods on +} + +// IEntitlementCheckerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type IEntitlementCheckerCallerRaw struct { + Contract *IEntitlementCheckerCaller // Generic read-only contract binding to access the raw methods on +} + +// IEntitlementCheckerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type IEntitlementCheckerTransactorRaw struct { + Contract *IEntitlementCheckerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewIEntitlementChecker creates a new instance of IEntitlementChecker, bound to a specific deployed contract. +func NewIEntitlementChecker(address common.Address, backend bind.ContractBackend) (*IEntitlementChecker, error) { + contract, err := bindIEntitlementChecker(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &IEntitlementChecker{IEntitlementCheckerCaller: IEntitlementCheckerCaller{contract: contract}, IEntitlementCheckerTransactor: IEntitlementCheckerTransactor{contract: contract}, IEntitlementCheckerFilterer: IEntitlementCheckerFilterer{contract: contract}}, nil +} + +// NewIEntitlementCheckerCaller creates a new read-only instance of IEntitlementChecker, bound to a specific deployed contract. +func NewIEntitlementCheckerCaller(address common.Address, caller bind.ContractCaller) (*IEntitlementCheckerCaller, error) { + contract, err := bindIEntitlementChecker(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &IEntitlementCheckerCaller{contract: contract}, nil +} + +// NewIEntitlementCheckerTransactor creates a new write-only instance of IEntitlementChecker, bound to a specific deployed contract. +func NewIEntitlementCheckerTransactor(address common.Address, transactor bind.ContractTransactor) (*IEntitlementCheckerTransactor, error) { + contract, err := bindIEntitlementChecker(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &IEntitlementCheckerTransactor{contract: contract}, nil +} + +// NewIEntitlementCheckerFilterer creates a new log filterer instance of IEntitlementChecker, bound to a specific deployed contract. +func NewIEntitlementCheckerFilterer(address common.Address, filterer bind.ContractFilterer) (*IEntitlementCheckerFilterer, error) { + contract, err := bindIEntitlementChecker(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &IEntitlementCheckerFilterer{contract: contract}, nil +} + +// bindIEntitlementChecker binds a generic wrapper to an already deployed contract. +func bindIEntitlementChecker(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := IEntitlementCheckerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IEntitlementChecker *IEntitlementCheckerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IEntitlementChecker.Contract.IEntitlementCheckerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IEntitlementChecker *IEntitlementCheckerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.IEntitlementCheckerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IEntitlementChecker *IEntitlementCheckerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.IEntitlementCheckerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IEntitlementChecker *IEntitlementCheckerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IEntitlementChecker.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IEntitlementChecker *IEntitlementCheckerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IEntitlementChecker *IEntitlementCheckerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.contract.Transact(opts, method, params...) +} + +// GetNodeAtIndex is a free data retrieval call binding the contract method 0x3c59f126. +// +// Solidity: function getNodeAtIndex(uint256 index) view returns(address) +func (_IEntitlementChecker *IEntitlementCheckerCaller) GetNodeAtIndex(opts *bind.CallOpts, index *big.Int) (common.Address, error) { + var out []interface{} + err := _IEntitlementChecker.contract.Call(opts, &out, "getNodeAtIndex", index) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetNodeAtIndex is a free data retrieval call binding the contract method 0x3c59f126. +// +// Solidity: function getNodeAtIndex(uint256 index) view returns(address) +func (_IEntitlementChecker *IEntitlementCheckerSession) GetNodeAtIndex(index *big.Int) (common.Address, error) { + return _IEntitlementChecker.Contract.GetNodeAtIndex(&_IEntitlementChecker.CallOpts, index) +} + +// GetNodeAtIndex is a free data retrieval call binding the contract method 0x3c59f126. +// +// Solidity: function getNodeAtIndex(uint256 index) view returns(address) +func (_IEntitlementChecker *IEntitlementCheckerCallerSession) GetNodeAtIndex(index *big.Int) (common.Address, error) { + return _IEntitlementChecker.Contract.GetNodeAtIndex(&_IEntitlementChecker.CallOpts, index) +} + +// GetNodeCount is a free data retrieval call binding the contract method 0x39bf397e. +// +// Solidity: function getNodeCount() view returns(uint256) +func (_IEntitlementChecker *IEntitlementCheckerCaller) GetNodeCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _IEntitlementChecker.contract.Call(opts, &out, "getNodeCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetNodeCount is a free data retrieval call binding the contract method 0x39bf397e. +// +// Solidity: function getNodeCount() view returns(uint256) +func (_IEntitlementChecker *IEntitlementCheckerSession) GetNodeCount() (*big.Int, error) { + return _IEntitlementChecker.Contract.GetNodeCount(&_IEntitlementChecker.CallOpts) +} + +// GetNodeCount is a free data retrieval call binding the contract method 0x39bf397e. +// +// Solidity: function getNodeCount() view returns(uint256) +func (_IEntitlementChecker *IEntitlementCheckerCallerSession) GetNodeCount() (*big.Int, error) { + return _IEntitlementChecker.Contract.GetNodeCount(&_IEntitlementChecker.CallOpts) +} + +// GetRandomNodes is a free data retrieval call binding the contract method 0x4f845445. +// +// Solidity: function getRandomNodes(uint256 count) view returns(address[]) +func (_IEntitlementChecker *IEntitlementCheckerCaller) GetRandomNodes(opts *bind.CallOpts, count *big.Int) ([]common.Address, error) { + var out []interface{} + err := _IEntitlementChecker.contract.Call(opts, &out, "getRandomNodes", count) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetRandomNodes is a free data retrieval call binding the contract method 0x4f845445. +// +// Solidity: function getRandomNodes(uint256 count) view returns(address[]) +func (_IEntitlementChecker *IEntitlementCheckerSession) GetRandomNodes(count *big.Int) ([]common.Address, error) { + return _IEntitlementChecker.Contract.GetRandomNodes(&_IEntitlementChecker.CallOpts, count) +} + +// GetRandomNodes is a free data retrieval call binding the contract method 0x4f845445. +// +// Solidity: function getRandomNodes(uint256 count) view returns(address[]) +func (_IEntitlementChecker *IEntitlementCheckerCallerSession) GetRandomNodes(count *big.Int) ([]common.Address, error) { + return _IEntitlementChecker.Contract.GetRandomNodes(&_IEntitlementChecker.CallOpts, count) +} + +// IsValidNode is a free data retrieval call binding the contract method 0x9ebd11ef. +// +// Solidity: function isValidNode(address node) view returns(bool) +func (_IEntitlementChecker *IEntitlementCheckerCaller) IsValidNode(opts *bind.CallOpts, node common.Address) (bool, error) { + var out []interface{} + err := _IEntitlementChecker.contract.Call(opts, &out, "isValidNode", node) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsValidNode is a free data retrieval call binding the contract method 0x9ebd11ef. +// +// Solidity: function isValidNode(address node) view returns(bool) +func (_IEntitlementChecker *IEntitlementCheckerSession) IsValidNode(node common.Address) (bool, error) { + return _IEntitlementChecker.Contract.IsValidNode(&_IEntitlementChecker.CallOpts, node) +} + +// IsValidNode is a free data retrieval call binding the contract method 0x9ebd11ef. +// +// Solidity: function isValidNode(address node) view returns(bool) +func (_IEntitlementChecker *IEntitlementCheckerCallerSession) IsValidNode(node common.Address) (bool, error) { + return _IEntitlementChecker.Contract.IsValidNode(&_IEntitlementChecker.CallOpts, node) +} + +// RegisterNode is a paid mutator transaction binding the contract method 0x672d7a0d. +// +// Solidity: function registerNode(address node) returns() +func (_IEntitlementChecker *IEntitlementCheckerTransactor) RegisterNode(opts *bind.TransactOpts, node common.Address) (*types.Transaction, error) { + return _IEntitlementChecker.contract.Transact(opts, "registerNode", node) +} + +// RegisterNode is a paid mutator transaction binding the contract method 0x672d7a0d. +// +// Solidity: function registerNode(address node) returns() +func (_IEntitlementChecker *IEntitlementCheckerSession) RegisterNode(node common.Address) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.RegisterNode(&_IEntitlementChecker.TransactOpts, node) +} + +// RegisterNode is a paid mutator transaction binding the contract method 0x672d7a0d. +// +// Solidity: function registerNode(address node) returns() +func (_IEntitlementChecker *IEntitlementCheckerTransactorSession) RegisterNode(node common.Address) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.RegisterNode(&_IEntitlementChecker.TransactOpts, node) +} + +// RequestEntitlementCheck is a paid mutator transaction binding the contract method 0x541da4e5. +// +// Solidity: function requestEntitlementCheck(address callerAddress, bytes32 transactionId, uint256 roleId, address[] nodes) returns() +func (_IEntitlementChecker *IEntitlementCheckerTransactor) RequestEntitlementCheck(opts *bind.TransactOpts, callerAddress common.Address, transactionId [32]byte, roleId *big.Int, nodes []common.Address) (*types.Transaction, error) { + return _IEntitlementChecker.contract.Transact(opts, "requestEntitlementCheck", callerAddress, transactionId, roleId, nodes) +} + +// RequestEntitlementCheck is a paid mutator transaction binding the contract method 0x541da4e5. +// +// Solidity: function requestEntitlementCheck(address callerAddress, bytes32 transactionId, uint256 roleId, address[] nodes) returns() +func (_IEntitlementChecker *IEntitlementCheckerSession) RequestEntitlementCheck(callerAddress common.Address, transactionId [32]byte, roleId *big.Int, nodes []common.Address) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.RequestEntitlementCheck(&_IEntitlementChecker.TransactOpts, callerAddress, transactionId, roleId, nodes) +} + +// RequestEntitlementCheck is a paid mutator transaction binding the contract method 0x541da4e5. +// +// Solidity: function requestEntitlementCheck(address callerAddress, bytes32 transactionId, uint256 roleId, address[] nodes) returns() +func (_IEntitlementChecker *IEntitlementCheckerTransactorSession) RequestEntitlementCheck(callerAddress common.Address, transactionId [32]byte, roleId *big.Int, nodes []common.Address) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.RequestEntitlementCheck(&_IEntitlementChecker.TransactOpts, callerAddress, transactionId, roleId, nodes) +} + +// UnregisterNode is a paid mutator transaction binding the contract method 0xc5e41cf6. +// +// Solidity: function unregisterNode(address node) returns() +func (_IEntitlementChecker *IEntitlementCheckerTransactor) UnregisterNode(opts *bind.TransactOpts, node common.Address) (*types.Transaction, error) { + return _IEntitlementChecker.contract.Transact(opts, "unregisterNode", node) +} + +// UnregisterNode is a paid mutator transaction binding the contract method 0xc5e41cf6. +// +// Solidity: function unregisterNode(address node) returns() +func (_IEntitlementChecker *IEntitlementCheckerSession) UnregisterNode(node common.Address) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.UnregisterNode(&_IEntitlementChecker.TransactOpts, node) +} + +// UnregisterNode is a paid mutator transaction binding the contract method 0xc5e41cf6. +// +// Solidity: function unregisterNode(address node) returns() +func (_IEntitlementChecker *IEntitlementCheckerTransactorSession) UnregisterNode(node common.Address) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.UnregisterNode(&_IEntitlementChecker.TransactOpts, node) +} + +// IEntitlementCheckerEntitlementCheckRequestedIterator is returned from FilterEntitlementCheckRequested and is used to iterate over the raw logs and unpacked data for EntitlementCheckRequested events raised by the IEntitlementChecker contract. +type IEntitlementCheckerEntitlementCheckRequestedIterator struct { + Event *IEntitlementCheckerEntitlementCheckRequested // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IEntitlementCheckerEntitlementCheckRequestedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IEntitlementCheckerEntitlementCheckRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IEntitlementCheckerEntitlementCheckRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IEntitlementCheckerEntitlementCheckRequestedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IEntitlementCheckerEntitlementCheckRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IEntitlementCheckerEntitlementCheckRequested represents a EntitlementCheckRequested event raised by the IEntitlementChecker contract. +type IEntitlementCheckerEntitlementCheckRequested struct { + CallerAddress common.Address + ContractAddress common.Address + TransactionId [32]byte + RoleId *big.Int + SelectedNodes []common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEntitlementCheckRequested is a free log retrieval operation binding the contract event 0x4675e3cc15801ffde520a3076d6ad75c0c6dbe8f23bdbea1dd45b676caffe4f3. +// +// Solidity: event EntitlementCheckRequested(address callerAddress, address contractAddress, bytes32 transactionId, uint256 roleId, address[] selectedNodes) +func (_IEntitlementChecker *IEntitlementCheckerFilterer) FilterEntitlementCheckRequested(opts *bind.FilterOpts) (*IEntitlementCheckerEntitlementCheckRequestedIterator, error) { + + logs, sub, err := _IEntitlementChecker.contract.FilterLogs(opts, "EntitlementCheckRequested") + if err != nil { + return nil, err + } + return &IEntitlementCheckerEntitlementCheckRequestedIterator{contract: _IEntitlementChecker.contract, event: "EntitlementCheckRequested", logs: logs, sub: sub}, nil +} + +// WatchEntitlementCheckRequested is a free log subscription operation binding the contract event 0x4675e3cc15801ffde520a3076d6ad75c0c6dbe8f23bdbea1dd45b676caffe4f3. +// +// Solidity: event EntitlementCheckRequested(address callerAddress, address contractAddress, bytes32 transactionId, uint256 roleId, address[] selectedNodes) +func (_IEntitlementChecker *IEntitlementCheckerFilterer) WatchEntitlementCheckRequested(opts *bind.WatchOpts, sink chan<- *IEntitlementCheckerEntitlementCheckRequested) (event.Subscription, error) { + + logs, sub, err := _IEntitlementChecker.contract.WatchLogs(opts, "EntitlementCheckRequested") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IEntitlementCheckerEntitlementCheckRequested) + if err := _IEntitlementChecker.contract.UnpackLog(event, "EntitlementCheckRequested", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEntitlementCheckRequested is a log parse operation binding the contract event 0x4675e3cc15801ffde520a3076d6ad75c0c6dbe8f23bdbea1dd45b676caffe4f3. +// +// Solidity: event EntitlementCheckRequested(address callerAddress, address contractAddress, bytes32 transactionId, uint256 roleId, address[] selectedNodes) +func (_IEntitlementChecker *IEntitlementCheckerFilterer) ParseEntitlementCheckRequested(log types.Log) (*IEntitlementCheckerEntitlementCheckRequested, error) { + event := new(IEntitlementCheckerEntitlementCheckRequested) + if err := _IEntitlementChecker.contract.UnpackLog(event, "EntitlementCheckRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IEntitlementCheckerNodeRegisteredIterator is returned from FilterNodeRegistered and is used to iterate over the raw logs and unpacked data for NodeRegistered events raised by the IEntitlementChecker contract. +type IEntitlementCheckerNodeRegisteredIterator struct { + Event *IEntitlementCheckerNodeRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IEntitlementCheckerNodeRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IEntitlementCheckerNodeRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IEntitlementCheckerNodeRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IEntitlementCheckerNodeRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IEntitlementCheckerNodeRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IEntitlementCheckerNodeRegistered represents a NodeRegistered event raised by the IEntitlementChecker contract. +type IEntitlementCheckerNodeRegistered struct { + NodeAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeRegistered is a free log retrieval operation binding the contract event 0x564728e6a7c8edd446557d94e0339d5e6ca2e05f42188914efdbdc87bcbbabf6. +// +// Solidity: event NodeRegistered(address indexed nodeAddress) +func (_IEntitlementChecker *IEntitlementCheckerFilterer) FilterNodeRegistered(opts *bind.FilterOpts, nodeAddress []common.Address) (*IEntitlementCheckerNodeRegisteredIterator, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _IEntitlementChecker.contract.FilterLogs(opts, "NodeRegistered", nodeAddressRule) + if err != nil { + return nil, err + } + return &IEntitlementCheckerNodeRegisteredIterator{contract: _IEntitlementChecker.contract, event: "NodeRegistered", logs: logs, sub: sub}, nil +} + +// WatchNodeRegistered is a free log subscription operation binding the contract event 0x564728e6a7c8edd446557d94e0339d5e6ca2e05f42188914efdbdc87bcbbabf6. +// +// Solidity: event NodeRegistered(address indexed nodeAddress) +func (_IEntitlementChecker *IEntitlementCheckerFilterer) WatchNodeRegistered(opts *bind.WatchOpts, sink chan<- *IEntitlementCheckerNodeRegistered, nodeAddress []common.Address) (event.Subscription, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _IEntitlementChecker.contract.WatchLogs(opts, "NodeRegistered", nodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IEntitlementCheckerNodeRegistered) + if err := _IEntitlementChecker.contract.UnpackLog(event, "NodeRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeRegistered is a log parse operation binding the contract event 0x564728e6a7c8edd446557d94e0339d5e6ca2e05f42188914efdbdc87bcbbabf6. +// +// Solidity: event NodeRegistered(address indexed nodeAddress) +func (_IEntitlementChecker *IEntitlementCheckerFilterer) ParseNodeRegistered(log types.Log) (*IEntitlementCheckerNodeRegistered, error) { + event := new(IEntitlementCheckerNodeRegistered) + if err := _IEntitlementChecker.contract.UnpackLog(event, "NodeRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IEntitlementCheckerNodeUnregisteredIterator is returned from FilterNodeUnregistered and is used to iterate over the raw logs and unpacked data for NodeUnregistered events raised by the IEntitlementChecker contract. +type IEntitlementCheckerNodeUnregisteredIterator struct { + Event *IEntitlementCheckerNodeUnregistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IEntitlementCheckerNodeUnregisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IEntitlementCheckerNodeUnregistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IEntitlementCheckerNodeUnregistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IEntitlementCheckerNodeUnregisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IEntitlementCheckerNodeUnregisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IEntitlementCheckerNodeUnregistered represents a NodeUnregistered event raised by the IEntitlementChecker contract. +type IEntitlementCheckerNodeUnregistered struct { + NodeAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeUnregistered is a free log retrieval operation binding the contract event 0xb1864577e4f285436a80ebc833984755393e2450d58622a65fb4fce87ea3573a. +// +// Solidity: event NodeUnregistered(address indexed nodeAddress) +func (_IEntitlementChecker *IEntitlementCheckerFilterer) FilterNodeUnregistered(opts *bind.FilterOpts, nodeAddress []common.Address) (*IEntitlementCheckerNodeUnregisteredIterator, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _IEntitlementChecker.contract.FilterLogs(opts, "NodeUnregistered", nodeAddressRule) + if err != nil { + return nil, err + } + return &IEntitlementCheckerNodeUnregisteredIterator{contract: _IEntitlementChecker.contract, event: "NodeUnregistered", logs: logs, sub: sub}, nil +} + +// WatchNodeUnregistered is a free log subscription operation binding the contract event 0xb1864577e4f285436a80ebc833984755393e2450d58622a65fb4fce87ea3573a. +// +// Solidity: event NodeUnregistered(address indexed nodeAddress) +func (_IEntitlementChecker *IEntitlementCheckerFilterer) WatchNodeUnregistered(opts *bind.WatchOpts, sink chan<- *IEntitlementCheckerNodeUnregistered, nodeAddress []common.Address) (event.Subscription, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _IEntitlementChecker.contract.WatchLogs(opts, "NodeUnregistered", nodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IEntitlementCheckerNodeUnregistered) + if err := _IEntitlementChecker.contract.UnpackLog(event, "NodeUnregistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeUnregistered is a log parse operation binding the contract event 0xb1864577e4f285436a80ebc833984755393e2450d58622a65fb4fce87ea3573a. +// +// Solidity: event NodeUnregistered(address indexed nodeAddress) +func (_IEntitlementChecker *IEntitlementCheckerFilterer) ParseNodeUnregistered(log types.Log) (*IEntitlementCheckerNodeUnregistered, error) { + event := new(IEntitlementCheckerNodeUnregistered) + if err := _IEntitlementChecker.contract.UnpackLog(event, "NodeUnregistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/xchain/contracts/dev/i_entitlement_gated.go b/core/xchain/contracts/dev/i_entitlement_gated.go new file mode 100644 index 000000000..57497cd0c --- /dev/null +++ b/core/xchain/contracts/dev/i_entitlement_gated.go @@ -0,0 +1,406 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package dev + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// IRuleEntitlementCheckOperation is an auto generated low-level Go binding around an user-defined struct. +type IRuleEntitlementCheckOperation struct { + OpType uint8 + ChainId *big.Int + ContractAddress common.Address + Threshold *big.Int +} + +// IRuleEntitlementLogicalOperation is an auto generated low-level Go binding around an user-defined struct. +type IRuleEntitlementLogicalOperation struct { + LogOpType uint8 + LeftOperationIndex uint8 + RightOperationIndex uint8 +} + +// IRuleEntitlementOperation is an auto generated low-level Go binding around an user-defined struct. +type IRuleEntitlementOperation struct { + OpType uint8 + Index uint8 +} + +// IRuleEntitlementRuleData is an auto generated low-level Go binding around an user-defined struct. +type IRuleEntitlementRuleData struct { + Operations []IRuleEntitlementOperation + CheckOperations []IRuleEntitlementCheckOperation + LogicalOperations []IRuleEntitlementLogicalOperation +} + +// IEntitlementGatedMetaData contains all meta data concerning the IEntitlementGated contract. +var IEntitlementGatedMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"getRuleData\",\"inputs\":[{\"name\":\"transactionId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRuleEntitlement.RuleData\",\"components\":[{\"name\":\"operations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.Operation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CombinedOperationType\"},{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"checkOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.CheckOperation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CheckOperationType\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"logicalOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.LogicalOperation[]\",\"components\":[{\"name\":\"logOpType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.LogicalOperationType\"},{\"name\":\"leftOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rightOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"postEntitlementCheckResult\",\"inputs\":[{\"name\":\"transactionId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"result\",\"type\":\"uint8\",\"internalType\":\"enumIEntitlementGatedBase.NodeVoteStatus\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"EntitlementCheckResultPosted\",\"inputs\":[{\"name\":\"transactionId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"result\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIEntitlementGatedBase.NodeVoteStatus\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"EntitlementGated_InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_NodeAlreadyVoted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_NodeNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_TransactionCheckAlreadyCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_TransactionCheckAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_TransactionNotRegistered\",\"inputs\":[]}]", +} + +// IEntitlementGatedABI is the input ABI used to generate the binding from. +// Deprecated: Use IEntitlementGatedMetaData.ABI instead. +var IEntitlementGatedABI = IEntitlementGatedMetaData.ABI + +// IEntitlementGated is an auto generated Go binding around an Ethereum contract. +type IEntitlementGated struct { + IEntitlementGatedCaller // Read-only binding to the contract + IEntitlementGatedTransactor // Write-only binding to the contract + IEntitlementGatedFilterer // Log filterer for contract events +} + +// IEntitlementGatedCaller is an auto generated read-only Go binding around an Ethereum contract. +type IEntitlementGatedCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IEntitlementGatedTransactor is an auto generated write-only Go binding around an Ethereum contract. +type IEntitlementGatedTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IEntitlementGatedFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type IEntitlementGatedFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IEntitlementGatedSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type IEntitlementGatedSession struct { + Contract *IEntitlementGated // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IEntitlementGatedCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type IEntitlementGatedCallerSession struct { + Contract *IEntitlementGatedCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// IEntitlementGatedTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type IEntitlementGatedTransactorSession struct { + Contract *IEntitlementGatedTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IEntitlementGatedRaw is an auto generated low-level Go binding around an Ethereum contract. +type IEntitlementGatedRaw struct { + Contract *IEntitlementGated // Generic contract binding to access the raw methods on +} + +// IEntitlementGatedCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type IEntitlementGatedCallerRaw struct { + Contract *IEntitlementGatedCaller // Generic read-only contract binding to access the raw methods on +} + +// IEntitlementGatedTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type IEntitlementGatedTransactorRaw struct { + Contract *IEntitlementGatedTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewIEntitlementGated creates a new instance of IEntitlementGated, bound to a specific deployed contract. +func NewIEntitlementGated(address common.Address, backend bind.ContractBackend) (*IEntitlementGated, error) { + contract, err := bindIEntitlementGated(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &IEntitlementGated{IEntitlementGatedCaller: IEntitlementGatedCaller{contract: contract}, IEntitlementGatedTransactor: IEntitlementGatedTransactor{contract: contract}, IEntitlementGatedFilterer: IEntitlementGatedFilterer{contract: contract}}, nil +} + +// NewIEntitlementGatedCaller creates a new read-only instance of IEntitlementGated, bound to a specific deployed contract. +func NewIEntitlementGatedCaller(address common.Address, caller bind.ContractCaller) (*IEntitlementGatedCaller, error) { + contract, err := bindIEntitlementGated(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &IEntitlementGatedCaller{contract: contract}, nil +} + +// NewIEntitlementGatedTransactor creates a new write-only instance of IEntitlementGated, bound to a specific deployed contract. +func NewIEntitlementGatedTransactor(address common.Address, transactor bind.ContractTransactor) (*IEntitlementGatedTransactor, error) { + contract, err := bindIEntitlementGated(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &IEntitlementGatedTransactor{contract: contract}, nil +} + +// NewIEntitlementGatedFilterer creates a new log filterer instance of IEntitlementGated, bound to a specific deployed contract. +func NewIEntitlementGatedFilterer(address common.Address, filterer bind.ContractFilterer) (*IEntitlementGatedFilterer, error) { + contract, err := bindIEntitlementGated(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &IEntitlementGatedFilterer{contract: contract}, nil +} + +// bindIEntitlementGated binds a generic wrapper to an already deployed contract. +func bindIEntitlementGated(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := IEntitlementGatedMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IEntitlementGated *IEntitlementGatedRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IEntitlementGated.Contract.IEntitlementGatedCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IEntitlementGated *IEntitlementGatedRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IEntitlementGated.Contract.IEntitlementGatedTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IEntitlementGated *IEntitlementGatedRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IEntitlementGated.Contract.IEntitlementGatedTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IEntitlementGated *IEntitlementGatedCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IEntitlementGated.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IEntitlementGated *IEntitlementGatedTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IEntitlementGated.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IEntitlementGated *IEntitlementGatedTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IEntitlementGated.Contract.contract.Transact(opts, method, params...) +} + +// GetRuleData is a free data retrieval call binding the contract method 0x92c399ff. +// +// Solidity: function getRuleData(bytes32 transactionId, uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])) +func (_IEntitlementGated *IEntitlementGatedCaller) GetRuleData(opts *bind.CallOpts, transactionId [32]byte, roleId *big.Int) (IRuleEntitlementRuleData, error) { + var out []interface{} + err := _IEntitlementGated.contract.Call(opts, &out, "getRuleData", transactionId, roleId) + + if err != nil { + return *new(IRuleEntitlementRuleData), err + } + + out0 := *abi.ConvertType(out[0], new(IRuleEntitlementRuleData)).(*IRuleEntitlementRuleData) + + return out0, err + +} + +// GetRuleData is a free data retrieval call binding the contract method 0x92c399ff. +// +// Solidity: function getRuleData(bytes32 transactionId, uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])) +func (_IEntitlementGated *IEntitlementGatedSession) GetRuleData(transactionId [32]byte, roleId *big.Int) (IRuleEntitlementRuleData, error) { + return _IEntitlementGated.Contract.GetRuleData(&_IEntitlementGated.CallOpts, transactionId, roleId) +} + +// GetRuleData is a free data retrieval call binding the contract method 0x92c399ff. +// +// Solidity: function getRuleData(bytes32 transactionId, uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])) +func (_IEntitlementGated *IEntitlementGatedCallerSession) GetRuleData(transactionId [32]byte, roleId *big.Int) (IRuleEntitlementRuleData, error) { + return _IEntitlementGated.Contract.GetRuleData(&_IEntitlementGated.CallOpts, transactionId, roleId) +} + +// PostEntitlementCheckResult is a paid mutator transaction binding the contract method 0x4739e805. +// +// Solidity: function postEntitlementCheckResult(bytes32 transactionId, uint256 roleId, uint8 result) returns() +func (_IEntitlementGated *IEntitlementGatedTransactor) PostEntitlementCheckResult(opts *bind.TransactOpts, transactionId [32]byte, roleId *big.Int, result uint8) (*types.Transaction, error) { + return _IEntitlementGated.contract.Transact(opts, "postEntitlementCheckResult", transactionId, roleId, result) +} + +// PostEntitlementCheckResult is a paid mutator transaction binding the contract method 0x4739e805. +// +// Solidity: function postEntitlementCheckResult(bytes32 transactionId, uint256 roleId, uint8 result) returns() +func (_IEntitlementGated *IEntitlementGatedSession) PostEntitlementCheckResult(transactionId [32]byte, roleId *big.Int, result uint8) (*types.Transaction, error) { + return _IEntitlementGated.Contract.PostEntitlementCheckResult(&_IEntitlementGated.TransactOpts, transactionId, roleId, result) +} + +// PostEntitlementCheckResult is a paid mutator transaction binding the contract method 0x4739e805. +// +// Solidity: function postEntitlementCheckResult(bytes32 transactionId, uint256 roleId, uint8 result) returns() +func (_IEntitlementGated *IEntitlementGatedTransactorSession) PostEntitlementCheckResult(transactionId [32]byte, roleId *big.Int, result uint8) (*types.Transaction, error) { + return _IEntitlementGated.Contract.PostEntitlementCheckResult(&_IEntitlementGated.TransactOpts, transactionId, roleId, result) +} + +// IEntitlementGatedEntitlementCheckResultPostedIterator is returned from FilterEntitlementCheckResultPosted and is used to iterate over the raw logs and unpacked data for EntitlementCheckResultPosted events raised by the IEntitlementGated contract. +type IEntitlementGatedEntitlementCheckResultPostedIterator struct { + Event *IEntitlementGatedEntitlementCheckResultPosted // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IEntitlementGatedEntitlementCheckResultPostedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IEntitlementGatedEntitlementCheckResultPosted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IEntitlementGatedEntitlementCheckResultPosted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IEntitlementGatedEntitlementCheckResultPostedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IEntitlementGatedEntitlementCheckResultPostedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IEntitlementGatedEntitlementCheckResultPosted represents a EntitlementCheckResultPosted event raised by the IEntitlementGated contract. +type IEntitlementGatedEntitlementCheckResultPosted struct { + TransactionId [32]byte + Result uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEntitlementCheckResultPosted is a free log retrieval operation binding the contract event 0xb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c633. +// +// Solidity: event EntitlementCheckResultPosted(bytes32 indexed transactionId, uint8 result) +func (_IEntitlementGated *IEntitlementGatedFilterer) FilterEntitlementCheckResultPosted(opts *bind.FilterOpts, transactionId [][32]byte) (*IEntitlementGatedEntitlementCheckResultPostedIterator, error) { + + var transactionIdRule []interface{} + for _, transactionIdItem := range transactionId { + transactionIdRule = append(transactionIdRule, transactionIdItem) + } + + logs, sub, err := _IEntitlementGated.contract.FilterLogs(opts, "EntitlementCheckResultPosted", transactionIdRule) + if err != nil { + return nil, err + } + return &IEntitlementGatedEntitlementCheckResultPostedIterator{contract: _IEntitlementGated.contract, event: "EntitlementCheckResultPosted", logs: logs, sub: sub}, nil +} + +// WatchEntitlementCheckResultPosted is a free log subscription operation binding the contract event 0xb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c633. +// +// Solidity: event EntitlementCheckResultPosted(bytes32 indexed transactionId, uint8 result) +func (_IEntitlementGated *IEntitlementGatedFilterer) WatchEntitlementCheckResultPosted(opts *bind.WatchOpts, sink chan<- *IEntitlementGatedEntitlementCheckResultPosted, transactionId [][32]byte) (event.Subscription, error) { + + var transactionIdRule []interface{} + for _, transactionIdItem := range transactionId { + transactionIdRule = append(transactionIdRule, transactionIdItem) + } + + logs, sub, err := _IEntitlementGated.contract.WatchLogs(opts, "EntitlementCheckResultPosted", transactionIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IEntitlementGatedEntitlementCheckResultPosted) + if err := _IEntitlementGated.contract.UnpackLog(event, "EntitlementCheckResultPosted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEntitlementCheckResultPosted is a log parse operation binding the contract event 0xb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c633. +// +// Solidity: event EntitlementCheckResultPosted(bytes32 indexed transactionId, uint8 result) +func (_IEntitlementGated *IEntitlementGatedFilterer) ParseEntitlementCheckResultPosted(log types.Log) (*IEntitlementGatedEntitlementCheckResultPosted, error) { + event := new(IEntitlementGatedEntitlementCheckResultPosted) + if err := _IEntitlementGated.contract.UnpackLog(event, "EntitlementCheckResultPosted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/xchain/contracts/dev/i_wallet_link.go b/core/xchain/contracts/dev/i_wallet_link.go new file mode 100644 index 000000000..a92b5c886 --- /dev/null +++ b/core/xchain/contracts/dev/i_wallet_link.go @@ -0,0 +1,680 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package dev + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// IWalletLinkBaseLinkedWallet is an auto generated low-level Go binding around an user-defined struct. +type IWalletLinkBaseLinkedWallet struct { + Addr common.Address + Signature []byte +} + +// IWalletLinkMetaData contains all meta data concerning the IWalletLink contract. +var IWalletLinkMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"checkIfLinked\",\"inputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestNonceForRootKey\",\"inputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootKeyForWallet\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWalletsByRootKey\",\"inputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"wallets\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"linkCallerToRootKey\",\"inputs\":[{\"name\":\"rootWallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"linkWalletToRootKey\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"rootWallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeLink\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootWallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"LinkWalletToRootKey\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemoveLink\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"secondWallet\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"WalletLink__CannotLinkToRootWallet\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WalletLink__CannotLinkToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__CannotRemoveRootWallet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__LinkAlreadyExists\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WalletLink__LinkedToAnotherRootKey\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WalletLink__NotLinked\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]}]", +} + +// IWalletLinkABI is the input ABI used to generate the binding from. +// Deprecated: Use IWalletLinkMetaData.ABI instead. +var IWalletLinkABI = IWalletLinkMetaData.ABI + +// IWalletLink is an auto generated Go binding around an Ethereum contract. +type IWalletLink struct { + IWalletLinkCaller // Read-only binding to the contract + IWalletLinkTransactor // Write-only binding to the contract + IWalletLinkFilterer // Log filterer for contract events +} + +// IWalletLinkCaller is an auto generated read-only Go binding around an Ethereum contract. +type IWalletLinkCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IWalletLinkTransactor is an auto generated write-only Go binding around an Ethereum contract. +type IWalletLinkTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IWalletLinkFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type IWalletLinkFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IWalletLinkSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type IWalletLinkSession struct { + Contract *IWalletLink // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IWalletLinkCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type IWalletLinkCallerSession struct { + Contract *IWalletLinkCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// IWalletLinkTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type IWalletLinkTransactorSession struct { + Contract *IWalletLinkTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IWalletLinkRaw is an auto generated low-level Go binding around an Ethereum contract. +type IWalletLinkRaw struct { + Contract *IWalletLink // Generic contract binding to access the raw methods on +} + +// IWalletLinkCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type IWalletLinkCallerRaw struct { + Contract *IWalletLinkCaller // Generic read-only contract binding to access the raw methods on +} + +// IWalletLinkTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type IWalletLinkTransactorRaw struct { + Contract *IWalletLinkTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewIWalletLink creates a new instance of IWalletLink, bound to a specific deployed contract. +func NewIWalletLink(address common.Address, backend bind.ContractBackend) (*IWalletLink, error) { + contract, err := bindIWalletLink(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &IWalletLink{IWalletLinkCaller: IWalletLinkCaller{contract: contract}, IWalletLinkTransactor: IWalletLinkTransactor{contract: contract}, IWalletLinkFilterer: IWalletLinkFilterer{contract: contract}}, nil +} + +// NewIWalletLinkCaller creates a new read-only instance of IWalletLink, bound to a specific deployed contract. +func NewIWalletLinkCaller(address common.Address, caller bind.ContractCaller) (*IWalletLinkCaller, error) { + contract, err := bindIWalletLink(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &IWalletLinkCaller{contract: contract}, nil +} + +// NewIWalletLinkTransactor creates a new write-only instance of IWalletLink, bound to a specific deployed contract. +func NewIWalletLinkTransactor(address common.Address, transactor bind.ContractTransactor) (*IWalletLinkTransactor, error) { + contract, err := bindIWalletLink(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &IWalletLinkTransactor{contract: contract}, nil +} + +// NewIWalletLinkFilterer creates a new log filterer instance of IWalletLink, bound to a specific deployed contract. +func NewIWalletLinkFilterer(address common.Address, filterer bind.ContractFilterer) (*IWalletLinkFilterer, error) { + contract, err := bindIWalletLink(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &IWalletLinkFilterer{contract: contract}, nil +} + +// bindIWalletLink binds a generic wrapper to an already deployed contract. +func bindIWalletLink(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := IWalletLinkMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IWalletLink *IWalletLinkRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IWalletLink.Contract.IWalletLinkCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IWalletLink *IWalletLinkRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IWalletLink.Contract.IWalletLinkTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IWalletLink *IWalletLinkRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IWalletLink.Contract.IWalletLinkTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IWalletLink *IWalletLinkCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IWalletLink.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IWalletLink *IWalletLinkTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IWalletLink.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IWalletLink *IWalletLinkTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IWalletLink.Contract.contract.Transact(opts, method, params...) +} + +// CheckIfLinked is a free data retrieval call binding the contract method 0x912b9758. +// +// Solidity: function checkIfLinked(address rootKey, address wallet) view returns(bool) +func (_IWalletLink *IWalletLinkCaller) CheckIfLinked(opts *bind.CallOpts, rootKey common.Address, wallet common.Address) (bool, error) { + var out []interface{} + err := _IWalletLink.contract.Call(opts, &out, "checkIfLinked", rootKey, wallet) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// CheckIfLinked is a free data retrieval call binding the contract method 0x912b9758. +// +// Solidity: function checkIfLinked(address rootKey, address wallet) view returns(bool) +func (_IWalletLink *IWalletLinkSession) CheckIfLinked(rootKey common.Address, wallet common.Address) (bool, error) { + return _IWalletLink.Contract.CheckIfLinked(&_IWalletLink.CallOpts, rootKey, wallet) +} + +// CheckIfLinked is a free data retrieval call binding the contract method 0x912b9758. +// +// Solidity: function checkIfLinked(address rootKey, address wallet) view returns(bool) +func (_IWalletLink *IWalletLinkCallerSession) CheckIfLinked(rootKey common.Address, wallet common.Address) (bool, error) { + return _IWalletLink.Contract.CheckIfLinked(&_IWalletLink.CallOpts, rootKey, wallet) +} + +// GetLatestNonceForRootKey is a free data retrieval call binding the contract method 0x20a00ac8. +// +// Solidity: function getLatestNonceForRootKey(address rootKey) view returns(uint256) +func (_IWalletLink *IWalletLinkCaller) GetLatestNonceForRootKey(opts *bind.CallOpts, rootKey common.Address) (*big.Int, error) { + var out []interface{} + err := _IWalletLink.contract.Call(opts, &out, "getLatestNonceForRootKey", rootKey) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetLatestNonceForRootKey is a free data retrieval call binding the contract method 0x20a00ac8. +// +// Solidity: function getLatestNonceForRootKey(address rootKey) view returns(uint256) +func (_IWalletLink *IWalletLinkSession) GetLatestNonceForRootKey(rootKey common.Address) (*big.Int, error) { + return _IWalletLink.Contract.GetLatestNonceForRootKey(&_IWalletLink.CallOpts, rootKey) +} + +// GetLatestNonceForRootKey is a free data retrieval call binding the contract method 0x20a00ac8. +// +// Solidity: function getLatestNonceForRootKey(address rootKey) view returns(uint256) +func (_IWalletLink *IWalletLinkCallerSession) GetLatestNonceForRootKey(rootKey common.Address) (*big.Int, error) { + return _IWalletLink.Contract.GetLatestNonceForRootKey(&_IWalletLink.CallOpts, rootKey) +} + +// GetRootKeyForWallet is a free data retrieval call binding the contract method 0xf8210398. +// +// Solidity: function getRootKeyForWallet(address wallet) view returns(address rootKey) +func (_IWalletLink *IWalletLinkCaller) GetRootKeyForWallet(opts *bind.CallOpts, wallet common.Address) (common.Address, error) { + var out []interface{} + err := _IWalletLink.contract.Call(opts, &out, "getRootKeyForWallet", wallet) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetRootKeyForWallet is a free data retrieval call binding the contract method 0xf8210398. +// +// Solidity: function getRootKeyForWallet(address wallet) view returns(address rootKey) +func (_IWalletLink *IWalletLinkSession) GetRootKeyForWallet(wallet common.Address) (common.Address, error) { + return _IWalletLink.Contract.GetRootKeyForWallet(&_IWalletLink.CallOpts, wallet) +} + +// GetRootKeyForWallet is a free data retrieval call binding the contract method 0xf8210398. +// +// Solidity: function getRootKeyForWallet(address wallet) view returns(address rootKey) +func (_IWalletLink *IWalletLinkCallerSession) GetRootKeyForWallet(wallet common.Address) (common.Address, error) { + return _IWalletLink.Contract.GetRootKeyForWallet(&_IWalletLink.CallOpts, wallet) +} + +// GetWalletsByRootKey is a free data retrieval call binding the contract method 0x02345b98. +// +// Solidity: function getWalletsByRootKey(address rootKey) view returns(address[] wallets) +func (_IWalletLink *IWalletLinkCaller) GetWalletsByRootKey(opts *bind.CallOpts, rootKey common.Address) ([]common.Address, error) { + var out []interface{} + err := _IWalletLink.contract.Call(opts, &out, "getWalletsByRootKey", rootKey) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetWalletsByRootKey is a free data retrieval call binding the contract method 0x02345b98. +// +// Solidity: function getWalletsByRootKey(address rootKey) view returns(address[] wallets) +func (_IWalletLink *IWalletLinkSession) GetWalletsByRootKey(rootKey common.Address) ([]common.Address, error) { + return _IWalletLink.Contract.GetWalletsByRootKey(&_IWalletLink.CallOpts, rootKey) +} + +// GetWalletsByRootKey is a free data retrieval call binding the contract method 0x02345b98. +// +// Solidity: function getWalletsByRootKey(address rootKey) view returns(address[] wallets) +func (_IWalletLink *IWalletLinkCallerSession) GetWalletsByRootKey(rootKey common.Address) ([]common.Address, error) { + return _IWalletLink.Contract.GetWalletsByRootKey(&_IWalletLink.CallOpts, rootKey) +} + +// LinkCallerToRootKey is a paid mutator transaction binding the contract method 0xe65dfe9d. +// +// Solidity: function linkCallerToRootKey((address,bytes) rootWallet, uint256 nonce) returns() +func (_IWalletLink *IWalletLinkTransactor) LinkCallerToRootKey(opts *bind.TransactOpts, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _IWalletLink.contract.Transact(opts, "linkCallerToRootKey", rootWallet, nonce) +} + +// LinkCallerToRootKey is a paid mutator transaction binding the contract method 0xe65dfe9d. +// +// Solidity: function linkCallerToRootKey((address,bytes) rootWallet, uint256 nonce) returns() +func (_IWalletLink *IWalletLinkSession) LinkCallerToRootKey(rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _IWalletLink.Contract.LinkCallerToRootKey(&_IWalletLink.TransactOpts, rootWallet, nonce) +} + +// LinkCallerToRootKey is a paid mutator transaction binding the contract method 0xe65dfe9d. +// +// Solidity: function linkCallerToRootKey((address,bytes) rootWallet, uint256 nonce) returns() +func (_IWalletLink *IWalletLinkTransactorSession) LinkCallerToRootKey(rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _IWalletLink.Contract.LinkCallerToRootKey(&_IWalletLink.TransactOpts, rootWallet, nonce) +} + +// LinkWalletToRootKey is a paid mutator transaction binding the contract method 0x1a31fc8d. +// +// Solidity: function linkWalletToRootKey((address,bytes) wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_IWalletLink *IWalletLinkTransactor) LinkWalletToRootKey(opts *bind.TransactOpts, wallet IWalletLinkBaseLinkedWallet, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _IWalletLink.contract.Transact(opts, "linkWalletToRootKey", wallet, rootWallet, nonce) +} + +// LinkWalletToRootKey is a paid mutator transaction binding the contract method 0x1a31fc8d. +// +// Solidity: function linkWalletToRootKey((address,bytes) wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_IWalletLink *IWalletLinkSession) LinkWalletToRootKey(wallet IWalletLinkBaseLinkedWallet, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _IWalletLink.Contract.LinkWalletToRootKey(&_IWalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// LinkWalletToRootKey is a paid mutator transaction binding the contract method 0x1a31fc8d. +// +// Solidity: function linkWalletToRootKey((address,bytes) wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_IWalletLink *IWalletLinkTransactorSession) LinkWalletToRootKey(wallet IWalletLinkBaseLinkedWallet, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _IWalletLink.Contract.LinkWalletToRootKey(&_IWalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// RemoveLink is a paid mutator transaction binding the contract method 0xd80bd3b9. +// +// Solidity: function removeLink(address wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_IWalletLink *IWalletLinkTransactor) RemoveLink(opts *bind.TransactOpts, wallet common.Address, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _IWalletLink.contract.Transact(opts, "removeLink", wallet, rootWallet, nonce) +} + +// RemoveLink is a paid mutator transaction binding the contract method 0xd80bd3b9. +// +// Solidity: function removeLink(address wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_IWalletLink *IWalletLinkSession) RemoveLink(wallet common.Address, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _IWalletLink.Contract.RemoveLink(&_IWalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// RemoveLink is a paid mutator transaction binding the contract method 0xd80bd3b9. +// +// Solidity: function removeLink(address wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_IWalletLink *IWalletLinkTransactorSession) RemoveLink(wallet common.Address, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _IWalletLink.Contract.RemoveLink(&_IWalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// IWalletLinkLinkWalletToRootKeyIterator is returned from FilterLinkWalletToRootKey and is used to iterate over the raw logs and unpacked data for LinkWalletToRootKey events raised by the IWalletLink contract. +type IWalletLinkLinkWalletToRootKeyIterator struct { + Event *IWalletLinkLinkWalletToRootKey // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IWalletLinkLinkWalletToRootKeyIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IWalletLinkLinkWalletToRootKey) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IWalletLinkLinkWalletToRootKey) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IWalletLinkLinkWalletToRootKeyIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IWalletLinkLinkWalletToRootKeyIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IWalletLinkLinkWalletToRootKey represents a LinkWalletToRootKey event raised by the IWalletLink contract. +type IWalletLinkLinkWalletToRootKey struct { + Wallet common.Address + RootKey common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterLinkWalletToRootKey is a free log retrieval operation binding the contract event 0x64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b5721. +// +// Solidity: event LinkWalletToRootKey(address indexed wallet, address indexed rootKey) +func (_IWalletLink *IWalletLinkFilterer) FilterLinkWalletToRootKey(opts *bind.FilterOpts, wallet []common.Address, rootKey []common.Address) (*IWalletLinkLinkWalletToRootKeyIterator, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var rootKeyRule []interface{} + for _, rootKeyItem := range rootKey { + rootKeyRule = append(rootKeyRule, rootKeyItem) + } + + logs, sub, err := _IWalletLink.contract.FilterLogs(opts, "LinkWalletToRootKey", walletRule, rootKeyRule) + if err != nil { + return nil, err + } + return &IWalletLinkLinkWalletToRootKeyIterator{contract: _IWalletLink.contract, event: "LinkWalletToRootKey", logs: logs, sub: sub}, nil +} + +// WatchLinkWalletToRootKey is a free log subscription operation binding the contract event 0x64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b5721. +// +// Solidity: event LinkWalletToRootKey(address indexed wallet, address indexed rootKey) +func (_IWalletLink *IWalletLinkFilterer) WatchLinkWalletToRootKey(opts *bind.WatchOpts, sink chan<- *IWalletLinkLinkWalletToRootKey, wallet []common.Address, rootKey []common.Address) (event.Subscription, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var rootKeyRule []interface{} + for _, rootKeyItem := range rootKey { + rootKeyRule = append(rootKeyRule, rootKeyItem) + } + + logs, sub, err := _IWalletLink.contract.WatchLogs(opts, "LinkWalletToRootKey", walletRule, rootKeyRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IWalletLinkLinkWalletToRootKey) + if err := _IWalletLink.contract.UnpackLog(event, "LinkWalletToRootKey", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseLinkWalletToRootKey is a log parse operation binding the contract event 0x64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b5721. +// +// Solidity: event LinkWalletToRootKey(address indexed wallet, address indexed rootKey) +func (_IWalletLink *IWalletLinkFilterer) ParseLinkWalletToRootKey(log types.Log) (*IWalletLinkLinkWalletToRootKey, error) { + event := new(IWalletLinkLinkWalletToRootKey) + if err := _IWalletLink.contract.UnpackLog(event, "LinkWalletToRootKey", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IWalletLinkRemoveLinkIterator is returned from FilterRemoveLink and is used to iterate over the raw logs and unpacked data for RemoveLink events raised by the IWalletLink contract. +type IWalletLinkRemoveLinkIterator struct { + Event *IWalletLinkRemoveLink // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IWalletLinkRemoveLinkIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IWalletLinkRemoveLink) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IWalletLinkRemoveLink) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IWalletLinkRemoveLinkIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IWalletLinkRemoveLinkIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IWalletLinkRemoveLink represents a RemoveLink event raised by the IWalletLink contract. +type IWalletLinkRemoveLink struct { + Wallet common.Address + SecondWallet common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRemoveLink is a free log retrieval operation binding the contract event 0x9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da2. +// +// Solidity: event RemoveLink(address indexed wallet, address indexed secondWallet) +func (_IWalletLink *IWalletLinkFilterer) FilterRemoveLink(opts *bind.FilterOpts, wallet []common.Address, secondWallet []common.Address) (*IWalletLinkRemoveLinkIterator, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var secondWalletRule []interface{} + for _, secondWalletItem := range secondWallet { + secondWalletRule = append(secondWalletRule, secondWalletItem) + } + + logs, sub, err := _IWalletLink.contract.FilterLogs(opts, "RemoveLink", walletRule, secondWalletRule) + if err != nil { + return nil, err + } + return &IWalletLinkRemoveLinkIterator{contract: _IWalletLink.contract, event: "RemoveLink", logs: logs, sub: sub}, nil +} + +// WatchRemoveLink is a free log subscription operation binding the contract event 0x9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da2. +// +// Solidity: event RemoveLink(address indexed wallet, address indexed secondWallet) +func (_IWalletLink *IWalletLinkFilterer) WatchRemoveLink(opts *bind.WatchOpts, sink chan<- *IWalletLinkRemoveLink, wallet []common.Address, secondWallet []common.Address) (event.Subscription, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var secondWalletRule []interface{} + for _, secondWalletItem := range secondWallet { + secondWalletRule = append(secondWalletRule, secondWalletItem) + } + + logs, sub, err := _IWalletLink.contract.WatchLogs(opts, "RemoveLink", walletRule, secondWalletRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IWalletLinkRemoveLink) + if err := _IWalletLink.contract.UnpackLog(event, "RemoveLink", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRemoveLink is a log parse operation binding the contract event 0x9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da2. +// +// Solidity: event RemoveLink(address indexed wallet, address indexed secondWallet) +func (_IWalletLink *IWalletLinkFilterer) ParseRemoveLink(log types.Log) (*IWalletLinkRemoveLink, error) { + event := new(IWalletLinkRemoveLink) + if err := _IWalletLink.contract.UnpackLog(event, "RemoveLink", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/xchain/contracts/dev/mock_custom_entitlement.go b/core/xchain/contracts/dev/mock_custom_entitlement.go new file mode 100644 index 000000000..aaaeb7804 --- /dev/null +++ b/core/xchain/contracts/dev/mock_custom_entitlement.go @@ -0,0 +1,255 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package dev + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// MockCustomEntitlementMetaData contains all meta data concerning the MockCustomEntitlement contract. +var MockCustomEntitlementMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isEntitled\",\"inputs\":[{\"name\":\"user\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setEntitled\",\"inputs\":[{\"name\":\"user\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"userIsEntitled\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]", + Bin: "0x608060405234801561001057600080fd5b506102c1806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80633f4c4d831461003b578063ddc6e68e14610050575b600080fd5b61004e6100493660046101e0565b610077565b005b61006361005e366004610237565b6100c4565b604051901515815260200160405180910390f35b806000808460405160200161008c9190610274565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff19169115159190911790555050565b6000806000836040516020016100da9190610274565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1692915050565b634e487b7160e01b600052604160045260246000fd5b80356001600160a01b038116811461013657600080fd5b919050565b600082601f83011261014c57600080fd5b8135602067ffffffffffffffff8083111561016957610169610109565b8260051b604051601f19603f8301168101818110848211171561018e5761018e610109565b60405293845260208187018101949081019250878511156101ae57600080fd5b6020870191505b848210156101d5576101c68261011f565b835291830191908301906101b5565b979650505050505050565b600080604083850312156101f357600080fd5b823567ffffffffffffffff81111561020a57600080fd5b6102168582860161013b565b9250506020830135801515811461022c57600080fd5b809150509250929050565b60006020828403121561024957600080fd5b813567ffffffffffffffff81111561026057600080fd5b61026c8482850161013b565b949350505050565b6020808252825182820181905260009190848201906040850190845b818110156102b55783516001600160a01b031683529284019291840191600101610290565b5090969550505050505056", +} + +// MockCustomEntitlementABI is the input ABI used to generate the binding from. +// Deprecated: Use MockCustomEntitlementMetaData.ABI instead. +var MockCustomEntitlementABI = MockCustomEntitlementMetaData.ABI + +// MockCustomEntitlementBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use MockCustomEntitlementMetaData.Bin instead. +var MockCustomEntitlementBin = MockCustomEntitlementMetaData.Bin + +// DeployMockCustomEntitlement deploys a new Ethereum contract, binding an instance of MockCustomEntitlement to it. +func DeployMockCustomEntitlement(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *MockCustomEntitlement, error) { + parsed, err := MockCustomEntitlementMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(MockCustomEntitlementBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &MockCustomEntitlement{MockCustomEntitlementCaller: MockCustomEntitlementCaller{contract: contract}, MockCustomEntitlementTransactor: MockCustomEntitlementTransactor{contract: contract}, MockCustomEntitlementFilterer: MockCustomEntitlementFilterer{contract: contract}}, nil +} + +// MockCustomEntitlement is an auto generated Go binding around an Ethereum contract. +type MockCustomEntitlement struct { + MockCustomEntitlementCaller // Read-only binding to the contract + MockCustomEntitlementTransactor // Write-only binding to the contract + MockCustomEntitlementFilterer // Log filterer for contract events +} + +// MockCustomEntitlementCaller is an auto generated read-only Go binding around an Ethereum contract. +type MockCustomEntitlementCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockCustomEntitlementTransactor is an auto generated write-only Go binding around an Ethereum contract. +type MockCustomEntitlementTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockCustomEntitlementFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type MockCustomEntitlementFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockCustomEntitlementSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type MockCustomEntitlementSession struct { + Contract *MockCustomEntitlement // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MockCustomEntitlementCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type MockCustomEntitlementCallerSession struct { + Contract *MockCustomEntitlementCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// MockCustomEntitlementTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type MockCustomEntitlementTransactorSession struct { + Contract *MockCustomEntitlementTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MockCustomEntitlementRaw is an auto generated low-level Go binding around an Ethereum contract. +type MockCustomEntitlementRaw struct { + Contract *MockCustomEntitlement // Generic contract binding to access the raw methods on +} + +// MockCustomEntitlementCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type MockCustomEntitlementCallerRaw struct { + Contract *MockCustomEntitlementCaller // Generic read-only contract binding to access the raw methods on +} + +// MockCustomEntitlementTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type MockCustomEntitlementTransactorRaw struct { + Contract *MockCustomEntitlementTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewMockCustomEntitlement creates a new instance of MockCustomEntitlement, bound to a specific deployed contract. +func NewMockCustomEntitlement(address common.Address, backend bind.ContractBackend) (*MockCustomEntitlement, error) { + contract, err := bindMockCustomEntitlement(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &MockCustomEntitlement{MockCustomEntitlementCaller: MockCustomEntitlementCaller{contract: contract}, MockCustomEntitlementTransactor: MockCustomEntitlementTransactor{contract: contract}, MockCustomEntitlementFilterer: MockCustomEntitlementFilterer{contract: contract}}, nil +} + +// NewMockCustomEntitlementCaller creates a new read-only instance of MockCustomEntitlement, bound to a specific deployed contract. +func NewMockCustomEntitlementCaller(address common.Address, caller bind.ContractCaller) (*MockCustomEntitlementCaller, error) { + contract, err := bindMockCustomEntitlement(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &MockCustomEntitlementCaller{contract: contract}, nil +} + +// NewMockCustomEntitlementTransactor creates a new write-only instance of MockCustomEntitlement, bound to a specific deployed contract. +func NewMockCustomEntitlementTransactor(address common.Address, transactor bind.ContractTransactor) (*MockCustomEntitlementTransactor, error) { + contract, err := bindMockCustomEntitlement(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &MockCustomEntitlementTransactor{contract: contract}, nil +} + +// NewMockCustomEntitlementFilterer creates a new log filterer instance of MockCustomEntitlement, bound to a specific deployed contract. +func NewMockCustomEntitlementFilterer(address common.Address, filterer bind.ContractFilterer) (*MockCustomEntitlementFilterer, error) { + contract, err := bindMockCustomEntitlement(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &MockCustomEntitlementFilterer{contract: contract}, nil +} + +// bindMockCustomEntitlement binds a generic wrapper to an already deployed contract. +func bindMockCustomEntitlement(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := MockCustomEntitlementMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_MockCustomEntitlement *MockCustomEntitlementRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MockCustomEntitlement.Contract.MockCustomEntitlementCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_MockCustomEntitlement *MockCustomEntitlementRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MockCustomEntitlement.Contract.MockCustomEntitlementTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_MockCustomEntitlement *MockCustomEntitlementRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MockCustomEntitlement.Contract.MockCustomEntitlementTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_MockCustomEntitlement *MockCustomEntitlementCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MockCustomEntitlement.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_MockCustomEntitlement *MockCustomEntitlementTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MockCustomEntitlement.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_MockCustomEntitlement *MockCustomEntitlementTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MockCustomEntitlement.Contract.contract.Transact(opts, method, params...) +} + +// IsEntitled is a free data retrieval call binding the contract method 0xddc6e68e. +// +// Solidity: function isEntitled(address[] user) view returns(bool) +func (_MockCustomEntitlement *MockCustomEntitlementCaller) IsEntitled(opts *bind.CallOpts, user []common.Address) (bool, error) { + var out []interface{} + err := _MockCustomEntitlement.contract.Call(opts, &out, "isEntitled", user) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsEntitled is a free data retrieval call binding the contract method 0xddc6e68e. +// +// Solidity: function isEntitled(address[] user) view returns(bool) +func (_MockCustomEntitlement *MockCustomEntitlementSession) IsEntitled(user []common.Address) (bool, error) { + return _MockCustomEntitlement.Contract.IsEntitled(&_MockCustomEntitlement.CallOpts, user) +} + +// IsEntitled is a free data retrieval call binding the contract method 0xddc6e68e. +// +// Solidity: function isEntitled(address[] user) view returns(bool) +func (_MockCustomEntitlement *MockCustomEntitlementCallerSession) IsEntitled(user []common.Address) (bool, error) { + return _MockCustomEntitlement.Contract.IsEntitled(&_MockCustomEntitlement.CallOpts, user) +} + +// SetEntitled is a paid mutator transaction binding the contract method 0x3f4c4d83. +// +// Solidity: function setEntitled(address[] user, bool userIsEntitled) returns() +func (_MockCustomEntitlement *MockCustomEntitlementTransactor) SetEntitled(opts *bind.TransactOpts, user []common.Address, userIsEntitled bool) (*types.Transaction, error) { + return _MockCustomEntitlement.contract.Transact(opts, "setEntitled", user, userIsEntitled) +} + +// SetEntitled is a paid mutator transaction binding the contract method 0x3f4c4d83. +// +// Solidity: function setEntitled(address[] user, bool userIsEntitled) returns() +func (_MockCustomEntitlement *MockCustomEntitlementSession) SetEntitled(user []common.Address, userIsEntitled bool) (*types.Transaction, error) { + return _MockCustomEntitlement.Contract.SetEntitled(&_MockCustomEntitlement.TransactOpts, user, userIsEntitled) +} + +// SetEntitled is a paid mutator transaction binding the contract method 0x3f4c4d83. +// +// Solidity: function setEntitled(address[] user, bool userIsEntitled) returns() +func (_MockCustomEntitlement *MockCustomEntitlementTransactorSession) SetEntitled(user []common.Address, userIsEntitled bool) (*types.Transaction, error) { + return _MockCustomEntitlement.Contract.SetEntitled(&_MockCustomEntitlement.TransactOpts, user, userIsEntitled) +} diff --git a/core/xchain/contracts/dev/mock_entitlement_gated.go b/core/xchain/contracts/dev/mock_entitlement_gated.go new file mode 100644 index 000000000..57699f623 --- /dev/null +++ b/core/xchain/contracts/dev/mock_entitlement_gated.go @@ -0,0 +1,895 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package dev + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// MockEntitlementGatedMetaData contains all meta data concerning the MockEntitlementGated contract. +var MockEntitlementGatedMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"checker\",\"type\":\"address\",\"internalType\":\"contractIEntitlementChecker\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"__EntitlementGated_init\",\"inputs\":[{\"name\":\"entitlementChecker\",\"type\":\"address\",\"internalType\":\"contractIEntitlementChecker\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getRuleData\",\"inputs\":[{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRuleEntitlement.RuleData\",\"components\":[{\"name\":\"operations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.Operation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CombinedOperationType\"},{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"checkOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.CheckOperation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CheckOperationType\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"logicalOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.LogicalOperation[]\",\"components\":[{\"name\":\"logOpType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.LogicalOperationType\"},{\"name\":\"leftOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rightOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRuleData\",\"inputs\":[{\"name\":\"transactionId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRuleEntitlement.RuleData\",\"components\":[{\"name\":\"operations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.Operation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CombinedOperationType\"},{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"checkOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.CheckOperation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CheckOperationType\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"logicalOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.LogicalOperation[]\",\"components\":[{\"name\":\"logOpType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.LogicalOperationType\"},{\"name\":\"leftOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rightOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"postEntitlementCheckResult\",\"inputs\":[{\"name\":\"transactionId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"result\",\"type\":\"uint8\",\"internalType\":\"enumIEntitlementGatedBase.NodeVoteStatus\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestEntitlementCheck\",\"inputs\":[{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ruleData\",\"type\":\"tuple\",\"internalType\":\"structIRuleEntitlement.RuleData\",\"components\":[{\"name\":\"operations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.Operation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CombinedOperationType\"},{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"checkOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.CheckOperation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CheckOperationType\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"logicalOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.LogicalOperation[]\",\"components\":[{\"name\":\"logOpType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.LogicalOperationType\"},{\"name\":\"leftOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rightOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"EntitlementCheckResultPosted\",\"inputs\":[{\"name\":\"transactionId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"result\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIEntitlementGatedBase.NodeVoteStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InterfaceAdded\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"indexed\":true,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InterfaceRemoved\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"indexed\":true,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"EntitlementGated_InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_NodeAlreadyVoted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_NodeNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_TransactionCheckAlreadyCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_TransactionCheckAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_TransactionNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Initializable_InInitializingState\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Initializable_NotInInitializingState\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Introspection_AlreadySupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Introspection_NotSupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuard__ReentrantCall\",\"inputs\":[]}]", + Bin: "0x60806040523480156200001157600080fd5b5060405162001b9a38038062001b9a833981016040819052620000349162000127565b6200003e6200007f565b7f9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e0080546001600160a01b0319166001600160a01b0383161790555062000159565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff1615620000cc576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156200012457805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6000602082840312156200013a57600080fd5b81516001600160a01b03811681146200015257600080fd5b9392505050565b611a3180620001696000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063069a3ee91461005c5780634739e8051461008557806357e700271461009a5780637adc9cbe146100bb57806392c399ff146100ce575b600080fd5b61006f61006a366004610e1e565b6100e1565b60405161007c9190610f28565b60405180910390f35b610098610093366004610fd8565b610314565b005b6100ad6100a8366004611011565b6103b8565b60405190815260200161007c565b6100986100c9366004611074565b610426565b61006f6100dc366004611091565b61047c565b61010560405180606001604052806060815260200160608152602001606081525090565b6000828152602081815260408083208151815460809481028201850190935260608101838152909491938593919285929185015b828210156101a257600084815260209020604080518082019091529083018054829060ff16600281111561016f5761016f610e37565b600281111561018057610180610e37565b81529054610100900460ff166020918201529082526001929092019101610139565b50505050815260200160018201805480602002602001604051908101604052809291908181526020016000905b8282101561025a576000848152602090206040805160808101909152600484029091018054829060ff16600581111561020a5761020a610e37565b600581111561021b5761021b610e37565b815260018281015460208084019190915260028401546001600160a01b03166040840152600390930154606090920191909152918352920191016101cf565b50505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156103065760008481526020902060408051606081019091529083018054829060ff1660028111156102be576102be610e37565b60028111156102cf576102cf610e37565b8152905460ff6101008204811660208085019190915262010000909204166040909201919091529082526001929092019101610287565b505050915250909392505050565b60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a00540361035657604051635db5c7cd60e11b815260040160405180910390fd5b61037f60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b61038a8383836104aa565b6103b360017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b505050565b600082815260208190526040812082906103d2828261140a565b50506040516bffffffffffffffffffffffff193260601b16602082015243603482015260009060540160405160208183030381529060405280519060200120905061041f81306000610743565b9392505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661047057604051630ef4733760e31b815260040160405180910390fd5b610479816109f2565b50565b6104a060405180606001604052806060815260200160608152602001606081525090565b61041f8383610a2d565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919061010090046001600160a01b031615806104f45750805460ff16155b1561051257604051637ad5a43960e11b815260040160405180910390fd5b600084815260028201602052604090205460ff161561054457604051637912b73960e01b815260040160405180910390fd5b600084815260018201602052604081205481908190815b8181101561068257600089815260018701602052604081208054839081106105855761058561150e565b60009182526020909120018054909150336001600160a01b03909116036106115760008154600160a01b900460ff1660028111156105c5576105c5610e37565b146105e3576040516347592a4d60e01b815260040160405180910390fd5b80548990829060ff60a01b1916600160a01b83600281111561060757610607610e37565b0217905550600195505b60018154600160a01b900460ff16600281111561063057610630610e37565b03610647578461063f81611524565b955050610679565b60028154600160a01b900460ff16600281111561066657610666610e37565b03610679578361067581611524565b9450505b5060010161055b565b50836106a157604051638223a7e960e01b815260040160405180910390fd5b6106ac60028261153d565b8311806106c257506106bf60028261153d565b82115b156107385760008881526002860160205260408120805460ff191660011790558284116106f05760026106f3565b60015b9050897fb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c63382604051610725919061155f565b60405180910390a26107368a610b27565b505b505050505050505050565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919060ff1615156001036107d55760005b60048201548110156107d357838260040182815481106107a2576107a261150e565b9060005260206000200154036107cb576040516301ab53df60e31b815260040160405180910390fd5b600101610780565b505b81546001600160a01b03166107ec576107ec610bfb565b8154604051634f84544560e01b8152600560048201526000916001600160a01b031690634f84544590602401600060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085d9190810190611636565b825490915060ff1661089e5781546003830180546001600160a01b0319166001600160a01b0388161790556001600160a81b03191661010033021760011782555b600482018054600181018255600091825260208220018590555b815181101561098e5782600101600086815260200190815260200160002060405180604001604052808484815181106108f3576108f361150e565b60200260200101516001600160a01b031681526020016000600281111561091c5761091c610e37565b9052815460018101835560009283526020928390208251910180546001600160a01b031981166001600160a01b03909316928317825593830151929390929183916001600160a81b03191617600160a01b83600281111561097f5761097f610e37565b021790555050506001016108b8565b50825460405163541da4e560e01b81526001600160a01b039091169063541da4e5906109c49033908a90899087906004016116ca565b600060405180830381600087803b1580156109de57600080fd5b505af1158015610736573d6000803e3d6000fd5b610a02636afd38fd60e11b610ccc565b6000805160206119f183398151915280546001600160a01b0319166001600160a01b03831617905550565b610a5160405180606001604052806060815260200160608152602001606081525090565b6000838152600080516020611a118339815191526020526040812080546000805160206119f18339815191529260ff90911615159003610aa457604051637ad5a43960e11b815260040160405180910390fd5b600381015460405163069a3ee960e01b8152600481018690526001600160a01b0390911690600090829063069a3ee990602401600060405180830381865afa158015610af4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b1c9190810190611893565b979650505050505050565b6000818152600080516020611a11833981519152602052604081206000805160206119f1833981519152915b6004820154811015610ba757816001016000836004018381548110610b7a57610b7a61150e565b906000526020600020015481526020019081526020016000206000610b9f9190610daa565b600101610b53565b50610bb6600482016000610dc8565b6000838152600183016020526040812080546001600160a81b03191681556003810180546001600160a01b031916905590610bf46004830182610dc8565b5050505050565b60006000805160206119f1833981519152905060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60060060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad91906119d3565b82546001600160a01b0319166001600160a01b03919091161790915550565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610d59576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610d72565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b50805460008255906000526020600020908101906104799190610de6565b50805460008255906000526020600020908101906104799190610e09565b5b80821115610e055780546001600160a81b0319168155600101610de7565b5090565b5b80821115610e055760008155600101610e0a565b600060208284031215610e3057600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b6003811061047957610479610e37565b60008151808452602080850194506020840160005b83811015610ec7578151805160068110610e8e57610e8e610e37565b885280840151848901526040808201516001600160a01b0316908901526060908101519088015260809096019590820190600101610e72565b509495945050505050565b60008151808452602080850194506020840160005b83811015610ec75781518051610efc81610e4d565b88528084015160ff908116858a0152604091820151169088015260609096019590820190600101610ee7565b6020808252825160608383015280516080840181905260009291820190839060a08601905b80831015610f845783518051610f6281610e4d565b835285015160ff16858301529284019260019290920191604090910190610f4d565b50838701519350601f19925082868203016040870152610fa48185610e5d565b93505050604085015181858403016060860152610fc18382610ed2565b9695505050505050565b6003811061047957600080fd5b600080600060608486031215610fed57600080fd5b8335925060208401359150604084013561100681610fcb565b809150509250925092565b6000806040838503121561102457600080fd5b82359150602083013567ffffffffffffffff81111561104257600080fd5b83016060818603121561105457600080fd5b809150509250929050565b6001600160a01b038116811461047957600080fd5b60006020828403121561108657600080fd5b813561041f8161105f565b600080604083850312156110a457600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60ff8116811461047957600080fd5b81356110f981610fcb565b61110281610e4d565b60ff1982541660ff82168117835550506020820135611120816110df565b815461ff001916600882901b61ff0016178255505050565b6000808335601e1984360301811261114f57600080fd5b83018035915067ffffffffffffffff82111561116a57600080fd5b6020019150600781901b360382131561118257600080fd5b9250929050565b6006811061047957600080fd5b81356111a181611189565b600681106111b1576111b1610e37565b60ff1982541660ff8216811783555050602082013560018201556002810160408301356111dd8161105f565b81546001600160a01b0319166001600160a01b03919091161790556060919091013560039190910155565b600160401b83111561121c5761121c6110b3565b80548382558084101561129a5760026001600160fe1b038281168314611244576112446110c9565b8086168614611255576112556110c9565b506000838152602081208360021b81018760021b820191505b8082101561129557828255826001830155828483015582600383015560048201915061126e565b505050505b5060008181526020812083915b858110156112cf576112b98383611196565b60809290920191600491909101906001016112a7565b505050505050565b6000808335601e198436030181126112ee57600080fd5b83018035915067ffffffffffffffff82111561130957600080fd5b602001915060608102360382131561118257600080fd5b813561132b81610fcb565b61133481610e4d565b60ff1982541660ff82168117835550506020820135611352816110df565b815461ff001916600882901b61ff0016178255506040820135611374816110df565b815462ff0000191660109190911b62ff00001617905550565b600160401b8311156113a1576113a16110b3565b8054838255808410156113d8576000828152602081208581019083015b808210156113d4578282556001820191506113be565b5050505b5060008181526020812083915b858110156112cf576113f78383611320565b60609290920191600191820191016113e5565b8135601e1983360301811261141e57600080fd5b8201803567ffffffffffffffff81111561143757600080fd5b6020820191508060061b360382131561144f57600080fd5b600160401b811115611463576114636110b3565b82548184558082101561149a576000848152602081208381019083015b8082101561149657828255600182019150611480565b5050505b5060008381526020902060005b828110156114cc576114b984836110ee565b60409390930192600191820191016114a7565b505050506114dd6020830183611138565b6114eb818360018601611208565b50506114fa60408301836112d7565b61150881836002860161138d565b50505050565b634e487b7160e01b600052603260045260246000fd5b600060018201611536576115366110c9565b5060010190565b60008261155a57634e487b7160e01b600052601260045260246000fd5b500490565b6020810161156c83610e4d565b91905290565b6040516080810167ffffffffffffffff81118282101715611595576115956110b3565b60405290565b6040516060810167ffffffffffffffff81118282101715611595576115956110b3565b6040805190810167ffffffffffffffff81118282101715611595576115956110b3565b604051601f8201601f1916810167ffffffffffffffff8111828210171561160a5761160a6110b3565b604052919050565b600067ffffffffffffffff82111561162c5761162c6110b3565b5060051b60200190565b6000602080838503121561164957600080fd5b825167ffffffffffffffff81111561166057600080fd5b8301601f8101851361167157600080fd5b805161168461167f82611612565b6115e1565b81815260059190911b820183019083810190878311156116a357600080fd5b928401925b82841015610b1c5783516116bb8161105f565b825292840192908401906116a8565b60006080820160018060a01b03808816845260208760208601528660408601526080606086015282865180855260a08701915060208801945060005b81811015611724578551851683529483019491830191600101611706565b50909a9950505050505050505050565b600082601f83011261174557600080fd5b8151602061175561167f83611612565b82815260079290921b8401810191818101908684111561177457600080fd5b8286015b848110156117d957608081890312156117915760008081fd5b611799611572565b81516117a481611189565b815281850151858201526040808301516117bd8161105f565b9082015260608281015190820152835291830191608001611778565b509695505050505050565b600082601f8301126117f557600080fd5b8151602061180561167f83611612565b8281526060928302850182019282820191908785111561182457600080fd5b8387015b858110156118865781818a0312156118405760008081fd5b61184861159b565b815161185381610fcb565b815281860151611862816110df565b81870152604082810151611875816110df565b908201528452928401928101611828565b5090979650505050505050565b600060208083850312156118a657600080fd5b825167ffffffffffffffff808211156118be57600080fd5b90840190606082870312156118d257600080fd5b6118da61159b565b8251828111156118e957600080fd5b8301601f810188136118fa57600080fd5b805161190861167f82611612565b81815260069190911b8201860190868101908a83111561192757600080fd5b928701925b8284101561197d576040848c0312156119455760008081fd5b61194d6115be565b845161195881610fcb565b815284890151611967816110df565b818a01528252604093909301929087019061192c565b8452505050828401518281111561199357600080fd5b61199f88828601611734565b858301525060408301519350818411156119b857600080fd5b6119c4878585016117e4565b60408201529695505050505050565b6000602082840312156119e557600080fd5b815161041f8161105f56fe9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e01", +} + +// MockEntitlementGatedABI is the input ABI used to generate the binding from. +// Deprecated: Use MockEntitlementGatedMetaData.ABI instead. +var MockEntitlementGatedABI = MockEntitlementGatedMetaData.ABI + +// MockEntitlementGatedBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use MockEntitlementGatedMetaData.Bin instead. +var MockEntitlementGatedBin = MockEntitlementGatedMetaData.Bin + +// DeployMockEntitlementGated deploys a new Ethereum contract, binding an instance of MockEntitlementGated to it. +func DeployMockEntitlementGated(auth *bind.TransactOpts, backend bind.ContractBackend, checker common.Address) (common.Address, *types.Transaction, *MockEntitlementGated, error) { + parsed, err := MockEntitlementGatedMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(MockEntitlementGatedBin), backend, checker) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &MockEntitlementGated{MockEntitlementGatedCaller: MockEntitlementGatedCaller{contract: contract}, MockEntitlementGatedTransactor: MockEntitlementGatedTransactor{contract: contract}, MockEntitlementGatedFilterer: MockEntitlementGatedFilterer{contract: contract}}, nil +} + +// MockEntitlementGated is an auto generated Go binding around an Ethereum contract. +type MockEntitlementGated struct { + MockEntitlementGatedCaller // Read-only binding to the contract + MockEntitlementGatedTransactor // Write-only binding to the contract + MockEntitlementGatedFilterer // Log filterer for contract events +} + +// MockEntitlementGatedCaller is an auto generated read-only Go binding around an Ethereum contract. +type MockEntitlementGatedCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockEntitlementGatedTransactor is an auto generated write-only Go binding around an Ethereum contract. +type MockEntitlementGatedTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockEntitlementGatedFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type MockEntitlementGatedFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockEntitlementGatedSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type MockEntitlementGatedSession struct { + Contract *MockEntitlementGated // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MockEntitlementGatedCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type MockEntitlementGatedCallerSession struct { + Contract *MockEntitlementGatedCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// MockEntitlementGatedTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type MockEntitlementGatedTransactorSession struct { + Contract *MockEntitlementGatedTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MockEntitlementGatedRaw is an auto generated low-level Go binding around an Ethereum contract. +type MockEntitlementGatedRaw struct { + Contract *MockEntitlementGated // Generic contract binding to access the raw methods on +} + +// MockEntitlementGatedCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type MockEntitlementGatedCallerRaw struct { + Contract *MockEntitlementGatedCaller // Generic read-only contract binding to access the raw methods on +} + +// MockEntitlementGatedTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type MockEntitlementGatedTransactorRaw struct { + Contract *MockEntitlementGatedTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewMockEntitlementGated creates a new instance of MockEntitlementGated, bound to a specific deployed contract. +func NewMockEntitlementGated(address common.Address, backend bind.ContractBackend) (*MockEntitlementGated, error) { + contract, err := bindMockEntitlementGated(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &MockEntitlementGated{MockEntitlementGatedCaller: MockEntitlementGatedCaller{contract: contract}, MockEntitlementGatedTransactor: MockEntitlementGatedTransactor{contract: contract}, MockEntitlementGatedFilterer: MockEntitlementGatedFilterer{contract: contract}}, nil +} + +// NewMockEntitlementGatedCaller creates a new read-only instance of MockEntitlementGated, bound to a specific deployed contract. +func NewMockEntitlementGatedCaller(address common.Address, caller bind.ContractCaller) (*MockEntitlementGatedCaller, error) { + contract, err := bindMockEntitlementGated(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &MockEntitlementGatedCaller{contract: contract}, nil +} + +// NewMockEntitlementGatedTransactor creates a new write-only instance of MockEntitlementGated, bound to a specific deployed contract. +func NewMockEntitlementGatedTransactor(address common.Address, transactor bind.ContractTransactor) (*MockEntitlementGatedTransactor, error) { + contract, err := bindMockEntitlementGated(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &MockEntitlementGatedTransactor{contract: contract}, nil +} + +// NewMockEntitlementGatedFilterer creates a new log filterer instance of MockEntitlementGated, bound to a specific deployed contract. +func NewMockEntitlementGatedFilterer(address common.Address, filterer bind.ContractFilterer) (*MockEntitlementGatedFilterer, error) { + contract, err := bindMockEntitlementGated(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &MockEntitlementGatedFilterer{contract: contract}, nil +} + +// bindMockEntitlementGated binds a generic wrapper to an already deployed contract. +func bindMockEntitlementGated(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := MockEntitlementGatedMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_MockEntitlementGated *MockEntitlementGatedRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MockEntitlementGated.Contract.MockEntitlementGatedCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_MockEntitlementGated *MockEntitlementGatedRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.MockEntitlementGatedTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_MockEntitlementGated *MockEntitlementGatedRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.MockEntitlementGatedTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_MockEntitlementGated *MockEntitlementGatedCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MockEntitlementGated.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_MockEntitlementGated *MockEntitlementGatedTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_MockEntitlementGated *MockEntitlementGatedTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.contract.Transact(opts, method, params...) +} + +// GetRuleData is a free data retrieval call binding the contract method 0x069a3ee9. +// +// Solidity: function getRuleData(uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])) +func (_MockEntitlementGated *MockEntitlementGatedCaller) GetRuleData(opts *bind.CallOpts, roleId *big.Int) (IRuleEntitlementRuleData, error) { + var out []interface{} + err := _MockEntitlementGated.contract.Call(opts, &out, "getRuleData", roleId) + + if err != nil { + return *new(IRuleEntitlementRuleData), err + } + + out0 := *abi.ConvertType(out[0], new(IRuleEntitlementRuleData)).(*IRuleEntitlementRuleData) + + return out0, err + +} + +// GetRuleData is a free data retrieval call binding the contract method 0x069a3ee9. +// +// Solidity: function getRuleData(uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])) +func (_MockEntitlementGated *MockEntitlementGatedSession) GetRuleData(roleId *big.Int) (IRuleEntitlementRuleData, error) { + return _MockEntitlementGated.Contract.GetRuleData(&_MockEntitlementGated.CallOpts, roleId) +} + +// GetRuleData is a free data retrieval call binding the contract method 0x069a3ee9. +// +// Solidity: function getRuleData(uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])) +func (_MockEntitlementGated *MockEntitlementGatedCallerSession) GetRuleData(roleId *big.Int) (IRuleEntitlementRuleData, error) { + return _MockEntitlementGated.Contract.GetRuleData(&_MockEntitlementGated.CallOpts, roleId) +} + +// GetRuleData0 is a free data retrieval call binding the contract method 0x92c399ff. +// +// Solidity: function getRuleData(bytes32 transactionId, uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])) +func (_MockEntitlementGated *MockEntitlementGatedCaller) GetRuleData0(opts *bind.CallOpts, transactionId [32]byte, roleId *big.Int) (IRuleEntitlementRuleData, error) { + var out []interface{} + err := _MockEntitlementGated.contract.Call(opts, &out, "getRuleData0", transactionId, roleId) + + if err != nil { + return *new(IRuleEntitlementRuleData), err + } + + out0 := *abi.ConvertType(out[0], new(IRuleEntitlementRuleData)).(*IRuleEntitlementRuleData) + + return out0, err + +} + +// GetRuleData0 is a free data retrieval call binding the contract method 0x92c399ff. +// +// Solidity: function getRuleData(bytes32 transactionId, uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])) +func (_MockEntitlementGated *MockEntitlementGatedSession) GetRuleData0(transactionId [32]byte, roleId *big.Int) (IRuleEntitlementRuleData, error) { + return _MockEntitlementGated.Contract.GetRuleData0(&_MockEntitlementGated.CallOpts, transactionId, roleId) +} + +// GetRuleData0 is a free data retrieval call binding the contract method 0x92c399ff. +// +// Solidity: function getRuleData(bytes32 transactionId, uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])) +func (_MockEntitlementGated *MockEntitlementGatedCallerSession) GetRuleData0(transactionId [32]byte, roleId *big.Int) (IRuleEntitlementRuleData, error) { + return _MockEntitlementGated.Contract.GetRuleData0(&_MockEntitlementGated.CallOpts, transactionId, roleId) +} + +// EntitlementGatedInit is a paid mutator transaction binding the contract method 0x7adc9cbe. +// +// Solidity: function __EntitlementGated_init(address entitlementChecker) returns() +func (_MockEntitlementGated *MockEntitlementGatedTransactor) EntitlementGatedInit(opts *bind.TransactOpts, entitlementChecker common.Address) (*types.Transaction, error) { + return _MockEntitlementGated.contract.Transact(opts, "__EntitlementGated_init", entitlementChecker) +} + +// EntitlementGatedInit is a paid mutator transaction binding the contract method 0x7adc9cbe. +// +// Solidity: function __EntitlementGated_init(address entitlementChecker) returns() +func (_MockEntitlementGated *MockEntitlementGatedSession) EntitlementGatedInit(entitlementChecker common.Address) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.EntitlementGatedInit(&_MockEntitlementGated.TransactOpts, entitlementChecker) +} + +// EntitlementGatedInit is a paid mutator transaction binding the contract method 0x7adc9cbe. +// +// Solidity: function __EntitlementGated_init(address entitlementChecker) returns() +func (_MockEntitlementGated *MockEntitlementGatedTransactorSession) EntitlementGatedInit(entitlementChecker common.Address) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.EntitlementGatedInit(&_MockEntitlementGated.TransactOpts, entitlementChecker) +} + +// PostEntitlementCheckResult is a paid mutator transaction binding the contract method 0x4739e805. +// +// Solidity: function postEntitlementCheckResult(bytes32 transactionId, uint256 roleId, uint8 result) returns() +func (_MockEntitlementGated *MockEntitlementGatedTransactor) PostEntitlementCheckResult(opts *bind.TransactOpts, transactionId [32]byte, roleId *big.Int, result uint8) (*types.Transaction, error) { + return _MockEntitlementGated.contract.Transact(opts, "postEntitlementCheckResult", transactionId, roleId, result) +} + +// PostEntitlementCheckResult is a paid mutator transaction binding the contract method 0x4739e805. +// +// Solidity: function postEntitlementCheckResult(bytes32 transactionId, uint256 roleId, uint8 result) returns() +func (_MockEntitlementGated *MockEntitlementGatedSession) PostEntitlementCheckResult(transactionId [32]byte, roleId *big.Int, result uint8) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.PostEntitlementCheckResult(&_MockEntitlementGated.TransactOpts, transactionId, roleId, result) +} + +// PostEntitlementCheckResult is a paid mutator transaction binding the contract method 0x4739e805. +// +// Solidity: function postEntitlementCheckResult(bytes32 transactionId, uint256 roleId, uint8 result) returns() +func (_MockEntitlementGated *MockEntitlementGatedTransactorSession) PostEntitlementCheckResult(transactionId [32]byte, roleId *big.Int, result uint8) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.PostEntitlementCheckResult(&_MockEntitlementGated.TransactOpts, transactionId, roleId, result) +} + +// RequestEntitlementCheck is a paid mutator transaction binding the contract method 0x57e70027. +// +// Solidity: function requestEntitlementCheck(uint256 roleId, ((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]) ruleData) returns(bytes32) +func (_MockEntitlementGated *MockEntitlementGatedTransactor) RequestEntitlementCheck(opts *bind.TransactOpts, roleId *big.Int, ruleData IRuleEntitlementRuleData) (*types.Transaction, error) { + return _MockEntitlementGated.contract.Transact(opts, "requestEntitlementCheck", roleId, ruleData) +} + +// RequestEntitlementCheck is a paid mutator transaction binding the contract method 0x57e70027. +// +// Solidity: function requestEntitlementCheck(uint256 roleId, ((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]) ruleData) returns(bytes32) +func (_MockEntitlementGated *MockEntitlementGatedSession) RequestEntitlementCheck(roleId *big.Int, ruleData IRuleEntitlementRuleData) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.RequestEntitlementCheck(&_MockEntitlementGated.TransactOpts, roleId, ruleData) +} + +// RequestEntitlementCheck is a paid mutator transaction binding the contract method 0x57e70027. +// +// Solidity: function requestEntitlementCheck(uint256 roleId, ((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]) ruleData) returns(bytes32) +func (_MockEntitlementGated *MockEntitlementGatedTransactorSession) RequestEntitlementCheck(roleId *big.Int, ruleData IRuleEntitlementRuleData) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.RequestEntitlementCheck(&_MockEntitlementGated.TransactOpts, roleId, ruleData) +} + +// MockEntitlementGatedEntitlementCheckResultPostedIterator is returned from FilterEntitlementCheckResultPosted and is used to iterate over the raw logs and unpacked data for EntitlementCheckResultPosted events raised by the MockEntitlementGated contract. +type MockEntitlementGatedEntitlementCheckResultPostedIterator struct { + Event *MockEntitlementGatedEntitlementCheckResultPosted // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockEntitlementGatedEntitlementCheckResultPostedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockEntitlementGatedEntitlementCheckResultPosted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockEntitlementGatedEntitlementCheckResultPosted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockEntitlementGatedEntitlementCheckResultPostedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockEntitlementGatedEntitlementCheckResultPostedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockEntitlementGatedEntitlementCheckResultPosted represents a EntitlementCheckResultPosted event raised by the MockEntitlementGated contract. +type MockEntitlementGatedEntitlementCheckResultPosted struct { + TransactionId [32]byte + Result uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEntitlementCheckResultPosted is a free log retrieval operation binding the contract event 0xb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c633. +// +// Solidity: event EntitlementCheckResultPosted(bytes32 indexed transactionId, uint8 result) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) FilterEntitlementCheckResultPosted(opts *bind.FilterOpts, transactionId [][32]byte) (*MockEntitlementGatedEntitlementCheckResultPostedIterator, error) { + + var transactionIdRule []interface{} + for _, transactionIdItem := range transactionId { + transactionIdRule = append(transactionIdRule, transactionIdItem) + } + + logs, sub, err := _MockEntitlementGated.contract.FilterLogs(opts, "EntitlementCheckResultPosted", transactionIdRule) + if err != nil { + return nil, err + } + return &MockEntitlementGatedEntitlementCheckResultPostedIterator{contract: _MockEntitlementGated.contract, event: "EntitlementCheckResultPosted", logs: logs, sub: sub}, nil +} + +// WatchEntitlementCheckResultPosted is a free log subscription operation binding the contract event 0xb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c633. +// +// Solidity: event EntitlementCheckResultPosted(bytes32 indexed transactionId, uint8 result) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) WatchEntitlementCheckResultPosted(opts *bind.WatchOpts, sink chan<- *MockEntitlementGatedEntitlementCheckResultPosted, transactionId [][32]byte) (event.Subscription, error) { + + var transactionIdRule []interface{} + for _, transactionIdItem := range transactionId { + transactionIdRule = append(transactionIdRule, transactionIdItem) + } + + logs, sub, err := _MockEntitlementGated.contract.WatchLogs(opts, "EntitlementCheckResultPosted", transactionIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockEntitlementGatedEntitlementCheckResultPosted) + if err := _MockEntitlementGated.contract.UnpackLog(event, "EntitlementCheckResultPosted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEntitlementCheckResultPosted is a log parse operation binding the contract event 0xb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c633. +// +// Solidity: event EntitlementCheckResultPosted(bytes32 indexed transactionId, uint8 result) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) ParseEntitlementCheckResultPosted(log types.Log) (*MockEntitlementGatedEntitlementCheckResultPosted, error) { + event := new(MockEntitlementGatedEntitlementCheckResultPosted) + if err := _MockEntitlementGated.contract.UnpackLog(event, "EntitlementCheckResultPosted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockEntitlementGatedInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the MockEntitlementGated contract. +type MockEntitlementGatedInitializedIterator struct { + Event *MockEntitlementGatedInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockEntitlementGatedInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockEntitlementGatedInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockEntitlementGatedInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockEntitlementGatedInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockEntitlementGatedInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockEntitlementGatedInitialized represents a Initialized event raised by the MockEntitlementGated contract. +type MockEntitlementGatedInitialized struct { + Version uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) FilterInitialized(opts *bind.FilterOpts) (*MockEntitlementGatedInitializedIterator, error) { + + logs, sub, err := _MockEntitlementGated.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &MockEntitlementGatedInitializedIterator{contract: _MockEntitlementGated.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *MockEntitlementGatedInitialized) (event.Subscription, error) { + + logs, sub, err := _MockEntitlementGated.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockEntitlementGatedInitialized) + if err := _MockEntitlementGated.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) ParseInitialized(log types.Log) (*MockEntitlementGatedInitialized, error) { + event := new(MockEntitlementGatedInitialized) + if err := _MockEntitlementGated.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockEntitlementGatedInterfaceAddedIterator is returned from FilterInterfaceAdded and is used to iterate over the raw logs and unpacked data for InterfaceAdded events raised by the MockEntitlementGated contract. +type MockEntitlementGatedInterfaceAddedIterator struct { + Event *MockEntitlementGatedInterfaceAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockEntitlementGatedInterfaceAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockEntitlementGatedInterfaceAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockEntitlementGatedInterfaceAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockEntitlementGatedInterfaceAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockEntitlementGatedInterfaceAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockEntitlementGatedInterfaceAdded represents a InterfaceAdded event raised by the MockEntitlementGated contract. +type MockEntitlementGatedInterfaceAdded struct { + InterfaceId [4]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInterfaceAdded is a free log retrieval operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) FilterInterfaceAdded(opts *bind.FilterOpts, interfaceId [][4]byte) (*MockEntitlementGatedInterfaceAddedIterator, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _MockEntitlementGated.contract.FilterLogs(opts, "InterfaceAdded", interfaceIdRule) + if err != nil { + return nil, err + } + return &MockEntitlementGatedInterfaceAddedIterator{contract: _MockEntitlementGated.contract, event: "InterfaceAdded", logs: logs, sub: sub}, nil +} + +// WatchInterfaceAdded is a free log subscription operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) WatchInterfaceAdded(opts *bind.WatchOpts, sink chan<- *MockEntitlementGatedInterfaceAdded, interfaceId [][4]byte) (event.Subscription, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _MockEntitlementGated.contract.WatchLogs(opts, "InterfaceAdded", interfaceIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockEntitlementGatedInterfaceAdded) + if err := _MockEntitlementGated.contract.UnpackLog(event, "InterfaceAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInterfaceAdded is a log parse operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) ParseInterfaceAdded(log types.Log) (*MockEntitlementGatedInterfaceAdded, error) { + event := new(MockEntitlementGatedInterfaceAdded) + if err := _MockEntitlementGated.contract.UnpackLog(event, "InterfaceAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockEntitlementGatedInterfaceRemovedIterator is returned from FilterInterfaceRemoved and is used to iterate over the raw logs and unpacked data for InterfaceRemoved events raised by the MockEntitlementGated contract. +type MockEntitlementGatedInterfaceRemovedIterator struct { + Event *MockEntitlementGatedInterfaceRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockEntitlementGatedInterfaceRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockEntitlementGatedInterfaceRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockEntitlementGatedInterfaceRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockEntitlementGatedInterfaceRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockEntitlementGatedInterfaceRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockEntitlementGatedInterfaceRemoved represents a InterfaceRemoved event raised by the MockEntitlementGated contract. +type MockEntitlementGatedInterfaceRemoved struct { + InterfaceId [4]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInterfaceRemoved is a free log retrieval operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) FilterInterfaceRemoved(opts *bind.FilterOpts, interfaceId [][4]byte) (*MockEntitlementGatedInterfaceRemovedIterator, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _MockEntitlementGated.contract.FilterLogs(opts, "InterfaceRemoved", interfaceIdRule) + if err != nil { + return nil, err + } + return &MockEntitlementGatedInterfaceRemovedIterator{contract: _MockEntitlementGated.contract, event: "InterfaceRemoved", logs: logs, sub: sub}, nil +} + +// WatchInterfaceRemoved is a free log subscription operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) WatchInterfaceRemoved(opts *bind.WatchOpts, sink chan<- *MockEntitlementGatedInterfaceRemoved, interfaceId [][4]byte) (event.Subscription, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _MockEntitlementGated.contract.WatchLogs(opts, "InterfaceRemoved", interfaceIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockEntitlementGatedInterfaceRemoved) + if err := _MockEntitlementGated.contract.UnpackLog(event, "InterfaceRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInterfaceRemoved is a log parse operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) ParseInterfaceRemoved(log types.Log) (*MockEntitlementGatedInterfaceRemoved, error) { + event := new(MockEntitlementGatedInterfaceRemoved) + if err := _MockEntitlementGated.contract.UnpackLog(event, "InterfaceRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/xchain/contracts/dev/wallet_link.go b/core/xchain/contracts/dev/wallet_link.go new file mode 100644 index 000000000..a460be941 --- /dev/null +++ b/core/xchain/contracts/dev/wallet_link.go @@ -0,0 +1,1139 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package dev + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// WalletLinkMetaData contains all meta data concerning the WalletLink contract. +var WalletLinkMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"__WalletLink_init\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkIfLinked\",\"inputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestNonceForRootKey\",\"inputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootKeyForWallet\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWalletsByRootKey\",\"inputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"wallets\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"linkCallerToRootKey\",\"inputs\":[{\"name\":\"rootWallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"linkWalletToRootKey\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"rootWallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeLink\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootWallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InterfaceAdded\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"indexed\":true,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InterfaceRemoved\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"indexed\":true,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LinkWalletToRootKey\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemoveLink\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"secondWallet\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ECDSAInvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ECDSAInvalidSignatureLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ECDSAInvalidSignatureS\",\"inputs\":[{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"Initializable_InInitializingState\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Initializable_NotInInitializingState\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Introspection_AlreadySupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Introspection_NotSupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAccountNonce\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"currentNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WalletLink__CannotLinkToRootWallet\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WalletLink__CannotLinkToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__CannotRemoveRootWallet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__LinkAlreadyExists\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WalletLink__LinkedToAnotherRootKey\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WalletLink__NotLinked\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6111ba806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063912b97581161005b578063912b9758146100f4578063d80bd3b914610117578063e65dfe9d1461012a578063f82103981461013d57600080fd5b806302345b981461008d5780631a31fc8d146100b657806320a00ac8146100cb578063260a409d146100ec575b600080fd5b6100a061009b366004610e84565b610168565b6040516100ad9190610e9f565b60405180910390f35b6100c96100c436600461100b565b610179565b005b6100de6100d9366004610e84565b610189565b6040519081526020016100ad565b6100c96101c6565b610107610102366004611078565b610222565b60405190151581526020016100ad565b6100c96101253660046110ab565b61026b565b6100c96101383660046110f1565b610276565b61015061014b366004610e84565b610284565b6040516001600160a01b0390911681526020016100ad565b6060610173826102c5565b92915050565b6101848383836102f6565b505050565b6001600160a01b03811660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c006020526040812054610173565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661021057604051630ef4733760e31b815260040160405180910390fd5b610220636ff9143960e01b6104da565b565b6001600160a01b0381811660009081527f19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc01602052604081205490918481169116145b9392505050565b6101848383836105b8565b6102808282610780565b5050565b6001600160a01b0380821660009081527f19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc016020526040812054909116610173565b6001600160a01b038116600090815260008051602061119a83398151915260205260409020606090610173906108a7565b8251825160008051602061119a83398151915291610316918391906108b4565b8351604080516001600160a01b0390921660208301528101839052600090610385906060015b604051602081830303815290604052805190602001207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b905083600001516001600160a01b03166103a3828660200151610a25565b6001600160a01b0316146103ca57604051632af0041d60e11b815260040160405180910390fd5b8351604080516001600160a01b03909216602083015281018490526000906103f49060600161033c565b905085600001516001600160a01b0316610412828860200151610a25565b6001600160a01b03161461043957604051632af0041d60e11b815260040160405180910390fd5b84516104459085610a4f565b855185516001600160a01b0316600090815260208590526040902061046991610ac1565b50845186516001600160a01b03908116600090815260018601602052604080822080546001600160a01b0319169484169490941790935587518951935190831693909216917f64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b57219190a3505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610567576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610580565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60008051602061119a8339815191526001600160a01b03841615806105e5575082516001600160a01b0316155b1561060357604051636df3f5c360e01b815260040160405180910390fd5b82600001516001600160a01b0316846001600160a01b031603610639576040516333976e3b60e11b815260040160405180910390fd5b82516001600160a01b0385811660009081526001840160205260409020548116911614610694578251604051635e300c8360e01b81526001600160a01b03808716600483015290911660248201526044015b60405180910390fd5b604080516001600160a01b03861660208201529081018390526000906106bc9060600161033c565b905083600001516001600160a01b03166106da828660200151610a25565b6001600160a01b03161461070157604051632af0041d60e11b815260040160405180910390fd5b6001600160a01b038086166000908152600184016020908152604080832080546001600160a01b031916905587519093168252849052206107429086610ad6565b5060405133906001600160a01b038716907f9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da290600090a35050505050565b815160008051602061119a8339815191529033906107a190839083906108b4565b604080516001600160a01b03831660208201529081018490526000906107c99060600161033c565b905084600001516001600160a01b03166107e7828760200151610a25565b6001600160a01b03161461080e57604051632af0041d60e11b815260040160405180910390fd5b845161081a9085610a4f565b84516001600160a01b0316600090815260208490526040902061083d9083610ac1565b5084516001600160a01b03838116600081815260018701602052604080822080546001600160a01b0319169585169590951790945588519351939092169290917f64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b572191a35050505050565b6060600061026483610aeb565b6001600160a01b03821615806108d157506001600160a01b038116155b156108ef57604051636df3f5c360e01b815260040160405180910390fd5b806001600160a01b0316826001600160a01b0316036109215760405163848ba26d60e01b815260040160405180910390fd5b6001600160a01b038281166000908152600185016020526040902054161561096f576040516314790b7f60e01b81526001600160a01b0380841660048301528216602482015260440161068b565b6001600160a01b03818116600090815260018501602052604090205416156109d2576001600160a01b038181166000908152600185016020526040908190205490516347227b5d60e01b815284831660048201529116602482015260440161068b565b6001600160a01b03821660009081526020849052604081206109f390610b47565b111561018457604051637b815eed60e11b81526001600160a01b0380841660048301528216602482015260440161068b565b600080600080610a358686610b51565b925092509250610a458282610b9e565b5090949350505050565b6001600160a01b03821660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c0060205260409020805460018101909155818114610184576040516301d4b62360e61b81526001600160a01b03841660048201526024810182905260440161068b565b6000610264836001600160a01b038416610c57565b6000610264836001600160a01b038416610ca6565b606081600001805480602002602001604051908101604052809291908181526020018280548015610b3b57602002820191906000526020600020905b815481526020019060010190808311610b27575b50505050509050919050565b6000610173825490565b60008060008351604103610b8b5760208401516040850151606086015160001a610b7d88828585610d99565b955095509550505050610b97565b50508151600091506002905b9250925092565b6000826003811115610bb257610bb2611136565b03610bbb575050565b6001826003811115610bcf57610bcf611136565b03610bed5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610c0157610c01611136565b03610c225760405163fce698f760e01b81526004810182905260240161068b565b6003826003811115610c3657610c36611136565b03610280576040516335e2f38360e21b81526004810182905260240161068b565b6000818152600183016020526040812054610c9e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610173565b506000610173565b60008181526001830160205260408120548015610d8f576000610cca60018361114c565b8554909150600090610cde9060019061114c565b9050808214610d43576000866000018281548110610cfe57610cfe61116d565b9060005260206000200154905080876000018481548110610d2157610d2161116d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610d5457610d54611183565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610173565b6000915050610173565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610dd45750600091506003905082610e5e565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610e28573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e5457506000925060019150829050610e5e565b9250600091508190505b9450945094915050565b80356001600160a01b0381168114610e7f57600080fd5b919050565b600060208284031215610e9657600080fd5b61026482610e68565b6020808252825182820181905260009190848201906040850190845b81811015610ee05783516001600160a01b031683529284019291840191600101610ebb565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610f2557610f25610eec565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610f5457610f54610eec565b604052919050565b600060408284031215610f6e57600080fd5b610f76610f02565b9050610f8182610e68565b815260208083013567ffffffffffffffff80821115610f9f57600080fd5b818501915085601f830112610fb357600080fd5b813581811115610fc557610fc5610eec565b610fd7601f8201601f19168501610f2b565b91508082528684828501011115610fed57600080fd5b80848401858401376000908201840152918301919091525092915050565b60008060006060848603121561102057600080fd5b833567ffffffffffffffff8082111561103857600080fd5b61104487838801610f5c565b9450602086013591508082111561105a57600080fd5b5061106786828701610f5c565b925050604084013590509250925092565b6000806040838503121561108b57600080fd5b61109483610e68565b91506110a260208401610e68565b90509250929050565b6000806000606084860312156110c057600080fd5b6110c984610e68565b9250602084013567ffffffffffffffff8111156110e557600080fd5b61106786828701610f5c565b6000806040838503121561110457600080fd5b823567ffffffffffffffff81111561111b57600080fd5b61112785828601610f5c565b95602094909401359450505050565b634e487b7160e01b600052602160045260246000fd5b8181038181111561017357634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfe19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc00", +} + +// WalletLinkABI is the input ABI used to generate the binding from. +// Deprecated: Use WalletLinkMetaData.ABI instead. +var WalletLinkABI = WalletLinkMetaData.ABI + +// WalletLinkBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use WalletLinkMetaData.Bin instead. +var WalletLinkBin = WalletLinkMetaData.Bin + +// DeployWalletLink deploys a new Ethereum contract, binding an instance of WalletLink to it. +func DeployWalletLink(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *WalletLink, error) { + parsed, err := WalletLinkMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(WalletLinkBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &WalletLink{WalletLinkCaller: WalletLinkCaller{contract: contract}, WalletLinkTransactor: WalletLinkTransactor{contract: contract}, WalletLinkFilterer: WalletLinkFilterer{contract: contract}}, nil +} + +// WalletLink is an auto generated Go binding around an Ethereum contract. +type WalletLink struct { + WalletLinkCaller // Read-only binding to the contract + WalletLinkTransactor // Write-only binding to the contract + WalletLinkFilterer // Log filterer for contract events +} + +// WalletLinkCaller is an auto generated read-only Go binding around an Ethereum contract. +type WalletLinkCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// WalletLinkTransactor is an auto generated write-only Go binding around an Ethereum contract. +type WalletLinkTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// WalletLinkFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type WalletLinkFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// WalletLinkSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type WalletLinkSession struct { + Contract *WalletLink // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// WalletLinkCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type WalletLinkCallerSession struct { + Contract *WalletLinkCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// WalletLinkTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type WalletLinkTransactorSession struct { + Contract *WalletLinkTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// WalletLinkRaw is an auto generated low-level Go binding around an Ethereum contract. +type WalletLinkRaw struct { + Contract *WalletLink // Generic contract binding to access the raw methods on +} + +// WalletLinkCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type WalletLinkCallerRaw struct { + Contract *WalletLinkCaller // Generic read-only contract binding to access the raw methods on +} + +// WalletLinkTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type WalletLinkTransactorRaw struct { + Contract *WalletLinkTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewWalletLink creates a new instance of WalletLink, bound to a specific deployed contract. +func NewWalletLink(address common.Address, backend bind.ContractBackend) (*WalletLink, error) { + contract, err := bindWalletLink(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &WalletLink{WalletLinkCaller: WalletLinkCaller{contract: contract}, WalletLinkTransactor: WalletLinkTransactor{contract: contract}, WalletLinkFilterer: WalletLinkFilterer{contract: contract}}, nil +} + +// NewWalletLinkCaller creates a new read-only instance of WalletLink, bound to a specific deployed contract. +func NewWalletLinkCaller(address common.Address, caller bind.ContractCaller) (*WalletLinkCaller, error) { + contract, err := bindWalletLink(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &WalletLinkCaller{contract: contract}, nil +} + +// NewWalletLinkTransactor creates a new write-only instance of WalletLink, bound to a specific deployed contract. +func NewWalletLinkTransactor(address common.Address, transactor bind.ContractTransactor) (*WalletLinkTransactor, error) { + contract, err := bindWalletLink(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &WalletLinkTransactor{contract: contract}, nil +} + +// NewWalletLinkFilterer creates a new log filterer instance of WalletLink, bound to a specific deployed contract. +func NewWalletLinkFilterer(address common.Address, filterer bind.ContractFilterer) (*WalletLinkFilterer, error) { + contract, err := bindWalletLink(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &WalletLinkFilterer{contract: contract}, nil +} + +// bindWalletLink binds a generic wrapper to an already deployed contract. +func bindWalletLink(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := WalletLinkMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_WalletLink *WalletLinkRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _WalletLink.Contract.WalletLinkCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_WalletLink *WalletLinkRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _WalletLink.Contract.WalletLinkTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_WalletLink *WalletLinkRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _WalletLink.Contract.WalletLinkTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_WalletLink *WalletLinkCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _WalletLink.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_WalletLink *WalletLinkTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _WalletLink.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_WalletLink *WalletLinkTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _WalletLink.Contract.contract.Transact(opts, method, params...) +} + +// CheckIfLinked is a free data retrieval call binding the contract method 0x912b9758. +// +// Solidity: function checkIfLinked(address rootKey, address wallet) view returns(bool) +func (_WalletLink *WalletLinkCaller) CheckIfLinked(opts *bind.CallOpts, rootKey common.Address, wallet common.Address) (bool, error) { + var out []interface{} + err := _WalletLink.contract.Call(opts, &out, "checkIfLinked", rootKey, wallet) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// CheckIfLinked is a free data retrieval call binding the contract method 0x912b9758. +// +// Solidity: function checkIfLinked(address rootKey, address wallet) view returns(bool) +func (_WalletLink *WalletLinkSession) CheckIfLinked(rootKey common.Address, wallet common.Address) (bool, error) { + return _WalletLink.Contract.CheckIfLinked(&_WalletLink.CallOpts, rootKey, wallet) +} + +// CheckIfLinked is a free data retrieval call binding the contract method 0x912b9758. +// +// Solidity: function checkIfLinked(address rootKey, address wallet) view returns(bool) +func (_WalletLink *WalletLinkCallerSession) CheckIfLinked(rootKey common.Address, wallet common.Address) (bool, error) { + return _WalletLink.Contract.CheckIfLinked(&_WalletLink.CallOpts, rootKey, wallet) +} + +// GetLatestNonceForRootKey is a free data retrieval call binding the contract method 0x20a00ac8. +// +// Solidity: function getLatestNonceForRootKey(address rootKey) view returns(uint256) +func (_WalletLink *WalletLinkCaller) GetLatestNonceForRootKey(opts *bind.CallOpts, rootKey common.Address) (*big.Int, error) { + var out []interface{} + err := _WalletLink.contract.Call(opts, &out, "getLatestNonceForRootKey", rootKey) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetLatestNonceForRootKey is a free data retrieval call binding the contract method 0x20a00ac8. +// +// Solidity: function getLatestNonceForRootKey(address rootKey) view returns(uint256) +func (_WalletLink *WalletLinkSession) GetLatestNonceForRootKey(rootKey common.Address) (*big.Int, error) { + return _WalletLink.Contract.GetLatestNonceForRootKey(&_WalletLink.CallOpts, rootKey) +} + +// GetLatestNonceForRootKey is a free data retrieval call binding the contract method 0x20a00ac8. +// +// Solidity: function getLatestNonceForRootKey(address rootKey) view returns(uint256) +func (_WalletLink *WalletLinkCallerSession) GetLatestNonceForRootKey(rootKey common.Address) (*big.Int, error) { + return _WalletLink.Contract.GetLatestNonceForRootKey(&_WalletLink.CallOpts, rootKey) +} + +// GetRootKeyForWallet is a free data retrieval call binding the contract method 0xf8210398. +// +// Solidity: function getRootKeyForWallet(address wallet) view returns(address rootKey) +func (_WalletLink *WalletLinkCaller) GetRootKeyForWallet(opts *bind.CallOpts, wallet common.Address) (common.Address, error) { + var out []interface{} + err := _WalletLink.contract.Call(opts, &out, "getRootKeyForWallet", wallet) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetRootKeyForWallet is a free data retrieval call binding the contract method 0xf8210398. +// +// Solidity: function getRootKeyForWallet(address wallet) view returns(address rootKey) +func (_WalletLink *WalletLinkSession) GetRootKeyForWallet(wallet common.Address) (common.Address, error) { + return _WalletLink.Contract.GetRootKeyForWallet(&_WalletLink.CallOpts, wallet) +} + +// GetRootKeyForWallet is a free data retrieval call binding the contract method 0xf8210398. +// +// Solidity: function getRootKeyForWallet(address wallet) view returns(address rootKey) +func (_WalletLink *WalletLinkCallerSession) GetRootKeyForWallet(wallet common.Address) (common.Address, error) { + return _WalletLink.Contract.GetRootKeyForWallet(&_WalletLink.CallOpts, wallet) +} + +// GetWalletsByRootKey is a free data retrieval call binding the contract method 0x02345b98. +// +// Solidity: function getWalletsByRootKey(address rootKey) view returns(address[] wallets) +func (_WalletLink *WalletLinkCaller) GetWalletsByRootKey(opts *bind.CallOpts, rootKey common.Address) ([]common.Address, error) { + var out []interface{} + err := _WalletLink.contract.Call(opts, &out, "getWalletsByRootKey", rootKey) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetWalletsByRootKey is a free data retrieval call binding the contract method 0x02345b98. +// +// Solidity: function getWalletsByRootKey(address rootKey) view returns(address[] wallets) +func (_WalletLink *WalletLinkSession) GetWalletsByRootKey(rootKey common.Address) ([]common.Address, error) { + return _WalletLink.Contract.GetWalletsByRootKey(&_WalletLink.CallOpts, rootKey) +} + +// GetWalletsByRootKey is a free data retrieval call binding the contract method 0x02345b98. +// +// Solidity: function getWalletsByRootKey(address rootKey) view returns(address[] wallets) +func (_WalletLink *WalletLinkCallerSession) GetWalletsByRootKey(rootKey common.Address) ([]common.Address, error) { + return _WalletLink.Contract.GetWalletsByRootKey(&_WalletLink.CallOpts, rootKey) +} + +// WalletLinkInit is a paid mutator transaction binding the contract method 0x260a409d. +// +// Solidity: function __WalletLink_init() returns() +func (_WalletLink *WalletLinkTransactor) WalletLinkInit(opts *bind.TransactOpts) (*types.Transaction, error) { + return _WalletLink.contract.Transact(opts, "__WalletLink_init") +} + +// WalletLinkInit is a paid mutator transaction binding the contract method 0x260a409d. +// +// Solidity: function __WalletLink_init() returns() +func (_WalletLink *WalletLinkSession) WalletLinkInit() (*types.Transaction, error) { + return _WalletLink.Contract.WalletLinkInit(&_WalletLink.TransactOpts) +} + +// WalletLinkInit is a paid mutator transaction binding the contract method 0x260a409d. +// +// Solidity: function __WalletLink_init() returns() +func (_WalletLink *WalletLinkTransactorSession) WalletLinkInit() (*types.Transaction, error) { + return _WalletLink.Contract.WalletLinkInit(&_WalletLink.TransactOpts) +} + +// LinkCallerToRootKey is a paid mutator transaction binding the contract method 0xe65dfe9d. +// +// Solidity: function linkCallerToRootKey((address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkTransactor) LinkCallerToRootKey(opts *bind.TransactOpts, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.contract.Transact(opts, "linkCallerToRootKey", rootWallet, nonce) +} + +// LinkCallerToRootKey is a paid mutator transaction binding the contract method 0xe65dfe9d. +// +// Solidity: function linkCallerToRootKey((address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkSession) LinkCallerToRootKey(rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.Contract.LinkCallerToRootKey(&_WalletLink.TransactOpts, rootWallet, nonce) +} + +// LinkCallerToRootKey is a paid mutator transaction binding the contract method 0xe65dfe9d. +// +// Solidity: function linkCallerToRootKey((address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkTransactorSession) LinkCallerToRootKey(rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.Contract.LinkCallerToRootKey(&_WalletLink.TransactOpts, rootWallet, nonce) +} + +// LinkWalletToRootKey is a paid mutator transaction binding the contract method 0x1a31fc8d. +// +// Solidity: function linkWalletToRootKey((address,bytes) wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkTransactor) LinkWalletToRootKey(opts *bind.TransactOpts, wallet IWalletLinkBaseLinkedWallet, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.contract.Transact(opts, "linkWalletToRootKey", wallet, rootWallet, nonce) +} + +// LinkWalletToRootKey is a paid mutator transaction binding the contract method 0x1a31fc8d. +// +// Solidity: function linkWalletToRootKey((address,bytes) wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkSession) LinkWalletToRootKey(wallet IWalletLinkBaseLinkedWallet, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.Contract.LinkWalletToRootKey(&_WalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// LinkWalletToRootKey is a paid mutator transaction binding the contract method 0x1a31fc8d. +// +// Solidity: function linkWalletToRootKey((address,bytes) wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkTransactorSession) LinkWalletToRootKey(wallet IWalletLinkBaseLinkedWallet, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.Contract.LinkWalletToRootKey(&_WalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// RemoveLink is a paid mutator transaction binding the contract method 0xd80bd3b9. +// +// Solidity: function removeLink(address wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkTransactor) RemoveLink(opts *bind.TransactOpts, wallet common.Address, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.contract.Transact(opts, "removeLink", wallet, rootWallet, nonce) +} + +// RemoveLink is a paid mutator transaction binding the contract method 0xd80bd3b9. +// +// Solidity: function removeLink(address wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkSession) RemoveLink(wallet common.Address, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.Contract.RemoveLink(&_WalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// RemoveLink is a paid mutator transaction binding the contract method 0xd80bd3b9. +// +// Solidity: function removeLink(address wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkTransactorSession) RemoveLink(wallet common.Address, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.Contract.RemoveLink(&_WalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// WalletLinkInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the WalletLink contract. +type WalletLinkInitializedIterator struct { + Event *WalletLinkInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *WalletLinkInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(WalletLinkInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(WalletLinkInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *WalletLinkInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *WalletLinkInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// WalletLinkInitialized represents a Initialized event raised by the WalletLink contract. +type WalletLinkInitialized struct { + Version uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_WalletLink *WalletLinkFilterer) FilterInitialized(opts *bind.FilterOpts) (*WalletLinkInitializedIterator, error) { + + logs, sub, err := _WalletLink.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &WalletLinkInitializedIterator{contract: _WalletLink.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_WalletLink *WalletLinkFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *WalletLinkInitialized) (event.Subscription, error) { + + logs, sub, err := _WalletLink.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(WalletLinkInitialized) + if err := _WalletLink.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_WalletLink *WalletLinkFilterer) ParseInitialized(log types.Log) (*WalletLinkInitialized, error) { + event := new(WalletLinkInitialized) + if err := _WalletLink.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// WalletLinkInterfaceAddedIterator is returned from FilterInterfaceAdded and is used to iterate over the raw logs and unpacked data for InterfaceAdded events raised by the WalletLink contract. +type WalletLinkInterfaceAddedIterator struct { + Event *WalletLinkInterfaceAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *WalletLinkInterfaceAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(WalletLinkInterfaceAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(WalletLinkInterfaceAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *WalletLinkInterfaceAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *WalletLinkInterfaceAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// WalletLinkInterfaceAdded represents a InterfaceAdded event raised by the WalletLink contract. +type WalletLinkInterfaceAdded struct { + InterfaceId [4]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInterfaceAdded is a free log retrieval operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_WalletLink *WalletLinkFilterer) FilterInterfaceAdded(opts *bind.FilterOpts, interfaceId [][4]byte) (*WalletLinkInterfaceAddedIterator, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _WalletLink.contract.FilterLogs(opts, "InterfaceAdded", interfaceIdRule) + if err != nil { + return nil, err + } + return &WalletLinkInterfaceAddedIterator{contract: _WalletLink.contract, event: "InterfaceAdded", logs: logs, sub: sub}, nil +} + +// WatchInterfaceAdded is a free log subscription operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_WalletLink *WalletLinkFilterer) WatchInterfaceAdded(opts *bind.WatchOpts, sink chan<- *WalletLinkInterfaceAdded, interfaceId [][4]byte) (event.Subscription, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _WalletLink.contract.WatchLogs(opts, "InterfaceAdded", interfaceIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(WalletLinkInterfaceAdded) + if err := _WalletLink.contract.UnpackLog(event, "InterfaceAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInterfaceAdded is a log parse operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_WalletLink *WalletLinkFilterer) ParseInterfaceAdded(log types.Log) (*WalletLinkInterfaceAdded, error) { + event := new(WalletLinkInterfaceAdded) + if err := _WalletLink.contract.UnpackLog(event, "InterfaceAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// WalletLinkInterfaceRemovedIterator is returned from FilterInterfaceRemoved and is used to iterate over the raw logs and unpacked data for InterfaceRemoved events raised by the WalletLink contract. +type WalletLinkInterfaceRemovedIterator struct { + Event *WalletLinkInterfaceRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *WalletLinkInterfaceRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(WalletLinkInterfaceRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(WalletLinkInterfaceRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *WalletLinkInterfaceRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *WalletLinkInterfaceRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// WalletLinkInterfaceRemoved represents a InterfaceRemoved event raised by the WalletLink contract. +type WalletLinkInterfaceRemoved struct { + InterfaceId [4]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInterfaceRemoved is a free log retrieval operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_WalletLink *WalletLinkFilterer) FilterInterfaceRemoved(opts *bind.FilterOpts, interfaceId [][4]byte) (*WalletLinkInterfaceRemovedIterator, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _WalletLink.contract.FilterLogs(opts, "InterfaceRemoved", interfaceIdRule) + if err != nil { + return nil, err + } + return &WalletLinkInterfaceRemovedIterator{contract: _WalletLink.contract, event: "InterfaceRemoved", logs: logs, sub: sub}, nil +} + +// WatchInterfaceRemoved is a free log subscription operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_WalletLink *WalletLinkFilterer) WatchInterfaceRemoved(opts *bind.WatchOpts, sink chan<- *WalletLinkInterfaceRemoved, interfaceId [][4]byte) (event.Subscription, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _WalletLink.contract.WatchLogs(opts, "InterfaceRemoved", interfaceIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(WalletLinkInterfaceRemoved) + if err := _WalletLink.contract.UnpackLog(event, "InterfaceRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInterfaceRemoved is a log parse operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_WalletLink *WalletLinkFilterer) ParseInterfaceRemoved(log types.Log) (*WalletLinkInterfaceRemoved, error) { + event := new(WalletLinkInterfaceRemoved) + if err := _WalletLink.contract.UnpackLog(event, "InterfaceRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// WalletLinkLinkWalletToRootKeyIterator is returned from FilterLinkWalletToRootKey and is used to iterate over the raw logs and unpacked data for LinkWalletToRootKey events raised by the WalletLink contract. +type WalletLinkLinkWalletToRootKeyIterator struct { + Event *WalletLinkLinkWalletToRootKey // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *WalletLinkLinkWalletToRootKeyIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(WalletLinkLinkWalletToRootKey) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(WalletLinkLinkWalletToRootKey) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *WalletLinkLinkWalletToRootKeyIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *WalletLinkLinkWalletToRootKeyIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// WalletLinkLinkWalletToRootKey represents a LinkWalletToRootKey event raised by the WalletLink contract. +type WalletLinkLinkWalletToRootKey struct { + Wallet common.Address + RootKey common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterLinkWalletToRootKey is a free log retrieval operation binding the contract event 0x64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b5721. +// +// Solidity: event LinkWalletToRootKey(address indexed wallet, address indexed rootKey) +func (_WalletLink *WalletLinkFilterer) FilterLinkWalletToRootKey(opts *bind.FilterOpts, wallet []common.Address, rootKey []common.Address) (*WalletLinkLinkWalletToRootKeyIterator, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var rootKeyRule []interface{} + for _, rootKeyItem := range rootKey { + rootKeyRule = append(rootKeyRule, rootKeyItem) + } + + logs, sub, err := _WalletLink.contract.FilterLogs(opts, "LinkWalletToRootKey", walletRule, rootKeyRule) + if err != nil { + return nil, err + } + return &WalletLinkLinkWalletToRootKeyIterator{contract: _WalletLink.contract, event: "LinkWalletToRootKey", logs: logs, sub: sub}, nil +} + +// WatchLinkWalletToRootKey is a free log subscription operation binding the contract event 0x64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b5721. +// +// Solidity: event LinkWalletToRootKey(address indexed wallet, address indexed rootKey) +func (_WalletLink *WalletLinkFilterer) WatchLinkWalletToRootKey(opts *bind.WatchOpts, sink chan<- *WalletLinkLinkWalletToRootKey, wallet []common.Address, rootKey []common.Address) (event.Subscription, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var rootKeyRule []interface{} + for _, rootKeyItem := range rootKey { + rootKeyRule = append(rootKeyRule, rootKeyItem) + } + + logs, sub, err := _WalletLink.contract.WatchLogs(opts, "LinkWalletToRootKey", walletRule, rootKeyRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(WalletLinkLinkWalletToRootKey) + if err := _WalletLink.contract.UnpackLog(event, "LinkWalletToRootKey", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseLinkWalletToRootKey is a log parse operation binding the contract event 0x64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b5721. +// +// Solidity: event LinkWalletToRootKey(address indexed wallet, address indexed rootKey) +func (_WalletLink *WalletLinkFilterer) ParseLinkWalletToRootKey(log types.Log) (*WalletLinkLinkWalletToRootKey, error) { + event := new(WalletLinkLinkWalletToRootKey) + if err := _WalletLink.contract.UnpackLog(event, "LinkWalletToRootKey", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// WalletLinkRemoveLinkIterator is returned from FilterRemoveLink and is used to iterate over the raw logs and unpacked data for RemoveLink events raised by the WalletLink contract. +type WalletLinkRemoveLinkIterator struct { + Event *WalletLinkRemoveLink // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *WalletLinkRemoveLinkIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(WalletLinkRemoveLink) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(WalletLinkRemoveLink) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *WalletLinkRemoveLinkIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *WalletLinkRemoveLinkIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// WalletLinkRemoveLink represents a RemoveLink event raised by the WalletLink contract. +type WalletLinkRemoveLink struct { + Wallet common.Address + SecondWallet common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRemoveLink is a free log retrieval operation binding the contract event 0x9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da2. +// +// Solidity: event RemoveLink(address indexed wallet, address indexed secondWallet) +func (_WalletLink *WalletLinkFilterer) FilterRemoveLink(opts *bind.FilterOpts, wallet []common.Address, secondWallet []common.Address) (*WalletLinkRemoveLinkIterator, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var secondWalletRule []interface{} + for _, secondWalletItem := range secondWallet { + secondWalletRule = append(secondWalletRule, secondWalletItem) + } + + logs, sub, err := _WalletLink.contract.FilterLogs(opts, "RemoveLink", walletRule, secondWalletRule) + if err != nil { + return nil, err + } + return &WalletLinkRemoveLinkIterator{contract: _WalletLink.contract, event: "RemoveLink", logs: logs, sub: sub}, nil +} + +// WatchRemoveLink is a free log subscription operation binding the contract event 0x9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da2. +// +// Solidity: event RemoveLink(address indexed wallet, address indexed secondWallet) +func (_WalletLink *WalletLinkFilterer) WatchRemoveLink(opts *bind.WatchOpts, sink chan<- *WalletLinkRemoveLink, wallet []common.Address, secondWallet []common.Address) (event.Subscription, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var secondWalletRule []interface{} + for _, secondWalletItem := range secondWallet { + secondWalletRule = append(secondWalletRule, secondWalletItem) + } + + logs, sub, err := _WalletLink.contract.WatchLogs(opts, "RemoveLink", walletRule, secondWalletRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(WalletLinkRemoveLink) + if err := _WalletLink.contract.UnpackLog(event, "RemoveLink", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRemoveLink is a log parse operation binding the contract event 0x9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da2. +// +// Solidity: event RemoveLink(address indexed wallet, address indexed secondWallet) +func (_WalletLink *WalletLinkFilterer) ParseRemoveLink(log types.Log) (*WalletLinkRemoveLink, error) { + event := new(WalletLinkRemoveLink) + if err := _WalletLink.contract.UnpackLog(event, "RemoveLink", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/xchain/contracts/test/mock_erc20.go b/core/xchain/contracts/test/mock_erc20.go new file mode 100644 index 000000000..e64c350de --- /dev/null +++ b/core/xchain/contracts/test/mock_erc20.go @@ -0,0 +1,1562 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package dev + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// MockErc20MetaData contains all meta data concerning the MockErc20 contract. +var MockErc20MetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"result\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"__ERC20_init\",\"inputs\":[{\"name\":\"name_\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"symbol_\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"decimals_\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"__Introspection_init\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"result\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"result\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InterfaceAdded\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"indexed\":true,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InterfaceRemoved\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"indexed\":true,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AllowanceOverflow\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AllowanceUnderflow\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ECDSAInvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ECDSAInvalidSignatureLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ECDSAInvalidSignatureS\",\"inputs\":[{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"Initializable_InInitializingState\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Initializable_NotInInitializingState\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientAllowance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Introspection_AlreadySupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Introspection_NotSupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAccountNonce\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"currentNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidPermit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PermitExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSupplyOverflow\",\"inputs\":[]}]", + Bin: "0x60806040523480156200001157600080fd5b5060405162001a7838038062001a78833981016040819052620000349162000418565b6200003e62000054565b6200004c82826012620000fc565b5050620005de565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff1615620000a1576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff9081161015620000f957805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6200010e6336372b0760e01b6200016f565b62000120634ec7fbed60e11b6200016f565b6200013263a219a02560e01b6200016f565b6200013f8383836200024f565b6200016a83604051806040016040528060018152602001603160f81b815250620002a860201b60201c565b505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114620001fe576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff1916600117905562000217565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b7f42eeb43a78e08448a75e4dd4bca52199850157e8648ba508b0c6a00addcdffbe806200027d858262000512565b50600181016200028e848262000512565b50600201805460ff191660ff929092169190911790555050565b7f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336e620002d5838262000512565b507f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336f62000303828262000512565b505060007f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336c8190557f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d5550565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200037857600080fd5b81516001600160401b038082111562000395576200039562000350565b604051601f8301601f19908116603f01168101908282118183101715620003c057620003c062000350565b8160405283815260209250866020858801011115620003de57600080fd5b600091505b83821015620004025785820183015181830184015290820190620003e3565b6000602085830101528094505050505092915050565b600080604083850312156200042c57600080fd5b82516001600160401b03808211156200044457600080fd5b620004528683870162000366565b935060208501519150808211156200046957600080fd5b50620004788582860162000366565b9150509250929050565b600181811c908216806200049757607f821691505b602082108103620004b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200016a576000816000526020600020601f850160051c81016020861015620004e95750805b601f850160051c820191505b818110156200050a57828155600101620004f5565b505050505050565b81516001600160401b038111156200052e576200052e62000350565b62000546816200053f845462000482565b84620004be565b602080601f8311600181146200057e5760008415620005655750858301515b600019600386901b1c1916600185901b1785556200050a565b600085815260208120601f198616915b82811015620005af578886015182559484019460019091019084016200058e565b5085821015620005ce5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61148a80620005ee6000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a257806395d89b411161007157806395d89b4114610209578063a9059cbb14610211578063aa23aa0214610224578063d505accf14610237578063dd62ed3e1461024a57600080fd5b806370a08231146101c05780637ecebe00146101d357806384b0196e146101e6578063930fc8ca1461020157600080fd5b806323b872dd116100de57806323b872dd14610176578063313ce567146101895780633644e515146101a357806340c10f19146101ab57600080fd5b806301ffc9a71461011057806306fdde0314610138578063095ea7b31461014d57806318160ddd14610160575b600080fd5b61012361011e366004610f8b565b61025d565b60405190151581526020015b60405180910390f35b61014061026e565b60405161012f9190610ffb565b61012361015b36600461102a565b61027d565b610168610290565b60405190815260200161012f565b610123610184366004611054565b6102a3565b6101916102b8565b60405160ff909116815260200161012f565b6101686102e5565b6101be6101b936600461102a565b6102ef565b005b6101686101ce366004611090565b6102fd565b6101686101e1366004611090565b610317565b6101ee610354565b60405161012f97969594939291906110ab565b6101be61041c565b610140610470565b61012361021f36600461102a565b61047a565b6101be6102323660046111f8565b610486565b6101be61024536600461126c565b6104e0565b6101686102583660046112d6565b6104f8565b600061026882610517565b92915050565b606061027861055a565b905090565b6000610289838361060b565b9392505050565b60006102786805345cdf77eb68f44c5490565b60006102b084848461065e565b949350505050565b60006102787f42eeb43a78e08448a75e4dd4bca52199850157e8648ba508b0c6a00addcdffc05460ff1690565b600061027861071c565b6102f98282610726565b5050565b6387a211a2600c9081526000828152602090912054610268565b6001600160a01b03811660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c006020526040812054610268565b60006060808280808360008051602061146a8339815191525415801561039957507f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d54155b6103e25760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064015b60405180910390fd5b6103ea6107a5565b6103f26107c4565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661046657604051630ef4733760e31b815260040160405180910390fd5b61046e6107e3565b565b60606102786107f3565b60006102898383610824565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166104d057604051630ef4733760e31b815260040160405180910390fd5b6104db83838361089f565b505050565b6104ef878787878787876108fd565b50505050505050565b6020819052637f5e9f20600c9081526000838152603490912054610289565b6001600160e01b03191660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff16151560011490565b60607f42eeb43a78e08448a75e4dd4bca52199850157e8648ba508b0c6a00addcdffbe805461058890611309565b80601f01602080910402602001604051908101604052809291908181526020018280546105b490611309565b80156106015780601f106105d657610100808354040283529160200191610601565b820191906000526020600020905b8154815290600101906020018083116105e457829003601f168201915b5050505050905090565b600082602052637f5e9f20600c5233600052816034600c205581600052602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a350600192915050565b60008360601b33602052637f5e9f208117600c526034600c208054600181011561069e5780851115610698576313be252b6000526004601cfd5b84810382555b50506387a211a28117600c526020600c208054808511156106c75763f4d678b86000526004601cfd5b84810382555050836000526020600c208381540181555082602052600c5160601c8160601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3505060019392505050565b6000610278610a9e565b6805345cdf77eb68f44c548181018181101561074a5763e5cfe9576000526004601cfd5b806805345cdf77eb68f44c5550506387a211a2600c52816000526020600c208181540181555080602052600c5160601c60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a35050565b606060008051602061146a833981519152600201805461058890611309565b606060008051602061146a833981519152600301805461058890611309565b61046e6301ffc9a760e01b610b12565b60607f42eeb43a78e08448a75e4dd4bca52199850157e8648ba508b0c6a00addcdffbe600101805461058890611309565b60006387a211a2600c52336000526020600c2080548084111561084f5763f4d678b86000526004601cfd5b83810382555050826000526020600c208281540181555081602052600c5160601c337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a350600192915050565b6108af6336372b0760e01b610b12565b6108bf634ec7fbed60e11b610b12565b6108cf63a219a02560e01b610b12565b6108da838383610bb8565b6104db83604051806040016040528060018152602001603160f81b815250610c0d565b8342111561094d5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016103d9565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886109b9836001600160a01b031660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c006020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610a1482610c9f565b90506000610a2482878787610ccc565b9050896001600160a01b0316816001600160a01b031614610a875760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016103d9565b610a928a8a8a610cfa565b50505050505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610ac9610d4d565b610ad1610db3565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b610b1b81610517565b610b67576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610b80565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b7f42eeb43a78e08448a75e4dd4bca52199850157e8648ba508b0c6a00addcdffbe80610be48582611393565b5060018101610bf38482611393565b50600201805460ff191660ff929092169190911790555050565b7f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336e610c388382611393565b507f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336f610c648282611393565b5050600060008051602061146a8339815191528190557f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d5550565b6000610268610cac61071c565b8360405161190160f01b8152600281019290925260228201526042902090565b600080600080610cde88888888610e03565b925092509250610cee8282610ed2565b50909695505050505050565b8260601b82602052637f5e9f208117600c52816034600c205581600052602c5160601c8160601c7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a350505050565b600080610d586107a5565b805190915015610d6f578051602090910120919050565b60008051602061146a833981519152548015610d8b5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b600080610dbe6107c4565b805190915015610dd5578051602090910120919050565b7f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d548015610d8b5792915050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610e3e5750600091506003905082610ec8565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610e92573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610ebe57506000925060019150829050610ec8565b9250600091508190505b9450945094915050565b6000826003811115610ee657610ee6611453565b03610eef575050565b6001826003811115610f0357610f03611453565b03610f215760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610f3557610f35611453565b03610f565760405163fce698f760e01b8152600481018290526024016103d9565b6003826003811115610f6a57610f6a611453565b036102f9576040516335e2f38360e21b8152600481018290526024016103d9565b600060208284031215610f9d57600080fd5b81356001600160e01b03198116811461028957600080fd5b6000815180845260005b81811015610fdb57602081850181015186830182015201610fbf565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006102896020830184610fb5565b80356001600160a01b038116811461102557600080fd5b919050565b6000806040838503121561103d57600080fd5b6110468361100e565b946020939093013593505050565b60008060006060848603121561106957600080fd5b6110728461100e565b92506110806020850161100e565b9150604084013590509250925092565b6000602082840312156110a257600080fd5b6102898261100e565b60ff60f81b881681526000602060e060208401526110cc60e084018a610fb5565b83810360408501526110de818a610fb5565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b8181101561113257835183529284019291840191600101611116565b50909c9b505050505050505050505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261116b57600080fd5b813567ffffffffffffffff8082111561118657611186611144565b604051601f8301601f19908116603f011681019082821181831017156111ae576111ae611144565b816040528381528660208588010111156111c757600080fd5b836020870160208301376000602085830101528094505050505092915050565b803560ff8116811461102557600080fd5b60008060006060848603121561120d57600080fd5b833567ffffffffffffffff8082111561122557600080fd5b6112318783880161115a565b9450602086013591508082111561124757600080fd5b506112548682870161115a565b925050611263604085016111e7565b90509250925092565b600080600080600080600060e0888a03121561128757600080fd5b6112908861100e565b965061129e6020890161100e565b955060408801359450606088013593506112ba608089016111e7565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156112e957600080fd5b6112f28361100e565b91506113006020840161100e565b90509250929050565b600181811c9082168061131d57607f821691505b60208210810361133d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156104db576000816000526020600020601f850160051c8101602086101561136c5750805b601f850160051c820191505b8181101561138b57828155600101611378565b505050505050565b815167ffffffffffffffff8111156113ad576113ad611144565b6113c1816113bb8454611309565b84611343565b602080601f8311600181146113f657600084156113de5750858301515b600019600386901b1c1916600185901b17855561138b565b600085815260208120601f198616915b8281101561142557888601518255948401946001909101908401611406565b50858210156114435787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052602160045260246000fdfe3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336c", +} + +// MockErc20ABI is the input ABI used to generate the binding from. +// Deprecated: Use MockErc20MetaData.ABI instead. +var MockErc20ABI = MockErc20MetaData.ABI + +// MockErc20Bin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use MockErc20MetaData.Bin instead. +var MockErc20Bin = MockErc20MetaData.Bin + +// DeployMockErc20 deploys a new Ethereum contract, binding an instance of MockErc20 to it. +func DeployMockErc20(auth *bind.TransactOpts, backend bind.ContractBackend, name string, symbol string) (common.Address, *types.Transaction, *MockErc20, error) { + parsed, err := MockErc20MetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(MockErc20Bin), backend, name, symbol) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &MockErc20{MockErc20Caller: MockErc20Caller{contract: contract}, MockErc20Transactor: MockErc20Transactor{contract: contract}, MockErc20Filterer: MockErc20Filterer{contract: contract}}, nil +} + +// MockErc20 is an auto generated Go binding around an Ethereum contract. +type MockErc20 struct { + MockErc20Caller // Read-only binding to the contract + MockErc20Transactor // Write-only binding to the contract + MockErc20Filterer // Log filterer for contract events +} + +// MockErc20Caller is an auto generated read-only Go binding around an Ethereum contract. +type MockErc20Caller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockErc20Transactor is an auto generated write-only Go binding around an Ethereum contract. +type MockErc20Transactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockErc20Filterer is an auto generated log filtering Go binding around an Ethereum contract events. +type MockErc20Filterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockErc20Session is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type MockErc20Session struct { + Contract *MockErc20 // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MockErc20CallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type MockErc20CallerSession struct { + Contract *MockErc20Caller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// MockErc20TransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type MockErc20TransactorSession struct { + Contract *MockErc20Transactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MockErc20Raw is an auto generated low-level Go binding around an Ethereum contract. +type MockErc20Raw struct { + Contract *MockErc20 // Generic contract binding to access the raw methods on +} + +// MockErc20CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type MockErc20CallerRaw struct { + Contract *MockErc20Caller // Generic read-only contract binding to access the raw methods on +} + +// MockErc20TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type MockErc20TransactorRaw struct { + Contract *MockErc20Transactor // Generic write-only contract binding to access the raw methods on +} + +// NewMockErc20 creates a new instance of MockErc20, bound to a specific deployed contract. +func NewMockErc20(address common.Address, backend bind.ContractBackend) (*MockErc20, error) { + contract, err := bindMockErc20(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &MockErc20{MockErc20Caller: MockErc20Caller{contract: contract}, MockErc20Transactor: MockErc20Transactor{contract: contract}, MockErc20Filterer: MockErc20Filterer{contract: contract}}, nil +} + +// NewMockErc20Caller creates a new read-only instance of MockErc20, bound to a specific deployed contract. +func NewMockErc20Caller(address common.Address, caller bind.ContractCaller) (*MockErc20Caller, error) { + contract, err := bindMockErc20(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &MockErc20Caller{contract: contract}, nil +} + +// NewMockErc20Transactor creates a new write-only instance of MockErc20, bound to a specific deployed contract. +func NewMockErc20Transactor(address common.Address, transactor bind.ContractTransactor) (*MockErc20Transactor, error) { + contract, err := bindMockErc20(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &MockErc20Transactor{contract: contract}, nil +} + +// NewMockErc20Filterer creates a new log filterer instance of MockErc20, bound to a specific deployed contract. +func NewMockErc20Filterer(address common.Address, filterer bind.ContractFilterer) (*MockErc20Filterer, error) { + contract, err := bindMockErc20(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &MockErc20Filterer{contract: contract}, nil +} + +// bindMockErc20 binds a generic wrapper to an already deployed contract. +func bindMockErc20(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := MockErc20MetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_MockErc20 *MockErc20Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MockErc20.Contract.MockErc20Caller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_MockErc20 *MockErc20Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MockErc20.Contract.MockErc20Transactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_MockErc20 *MockErc20Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MockErc20.Contract.MockErc20Transactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_MockErc20 *MockErc20CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MockErc20.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_MockErc20 *MockErc20TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MockErc20.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_MockErc20 *MockErc20TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MockErc20.Contract.contract.Transact(opts, method, params...) +} + +// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515. +// +// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32 result) +func (_MockErc20 *MockErc20Caller) DOMAINSEPARATOR(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _MockErc20.contract.Call(opts, &out, "DOMAIN_SEPARATOR") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515. +// +// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32 result) +func (_MockErc20 *MockErc20Session) DOMAINSEPARATOR() ([32]byte, error) { + return _MockErc20.Contract.DOMAINSEPARATOR(&_MockErc20.CallOpts) +} + +// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515. +// +// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32 result) +func (_MockErc20 *MockErc20CallerSession) DOMAINSEPARATOR() ([32]byte, error) { + return _MockErc20.Contract.DOMAINSEPARATOR(&_MockErc20.CallOpts) +} + +// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. +// +// Solidity: function allowance(address owner, address spender) view returns(uint256 result) +func (_MockErc20 *MockErc20Caller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error) { + var out []interface{} + err := _MockErc20.contract.Call(opts, &out, "allowance", owner, spender) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. +// +// Solidity: function allowance(address owner, address spender) view returns(uint256 result) +func (_MockErc20 *MockErc20Session) Allowance(owner common.Address, spender common.Address) (*big.Int, error) { + return _MockErc20.Contract.Allowance(&_MockErc20.CallOpts, owner, spender) +} + +// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. +// +// Solidity: function allowance(address owner, address spender) view returns(uint256 result) +func (_MockErc20 *MockErc20CallerSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) { + return _MockErc20.Contract.Allowance(&_MockErc20.CallOpts, owner, spender) +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address account) view returns(uint256) +func (_MockErc20 *MockErc20Caller) BalanceOf(opts *bind.CallOpts, account common.Address) (*big.Int, error) { + var out []interface{} + err := _MockErc20.contract.Call(opts, &out, "balanceOf", account) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address account) view returns(uint256) +func (_MockErc20 *MockErc20Session) BalanceOf(account common.Address) (*big.Int, error) { + return _MockErc20.Contract.BalanceOf(&_MockErc20.CallOpts, account) +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address account) view returns(uint256) +func (_MockErc20 *MockErc20CallerSession) BalanceOf(account common.Address) (*big.Int, error) { + return _MockErc20.Contract.BalanceOf(&_MockErc20.CallOpts, account) +} + +// Decimals is a free data retrieval call binding the contract method 0x313ce567. +// +// Solidity: function decimals() view returns(uint8) +func (_MockErc20 *MockErc20Caller) Decimals(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _MockErc20.contract.Call(opts, &out, "decimals") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// Decimals is a free data retrieval call binding the contract method 0x313ce567. +// +// Solidity: function decimals() view returns(uint8) +func (_MockErc20 *MockErc20Session) Decimals() (uint8, error) { + return _MockErc20.Contract.Decimals(&_MockErc20.CallOpts) +} + +// Decimals is a free data retrieval call binding the contract method 0x313ce567. +// +// Solidity: function decimals() view returns(uint8) +func (_MockErc20 *MockErc20CallerSession) Decimals() (uint8, error) { + return _MockErc20.Contract.Decimals(&_MockErc20.CallOpts) +} + +// Eip712Domain is a free data retrieval call binding the contract method 0x84b0196e. +// +// Solidity: function eip712Domain() view returns(bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions) +func (_MockErc20 *MockErc20Caller) Eip712Domain(opts *bind.CallOpts) (struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int +}, error) { + var out []interface{} + err := _MockErc20.contract.Call(opts, &out, "eip712Domain") + + outstruct := new(struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int + }) + if err != nil { + return *outstruct, err + } + + outstruct.Fields = *abi.ConvertType(out[0], new([1]byte)).(*[1]byte) + outstruct.Name = *abi.ConvertType(out[1], new(string)).(*string) + outstruct.Version = *abi.ConvertType(out[2], new(string)).(*string) + outstruct.ChainId = *abi.ConvertType(out[3], new(*big.Int)).(**big.Int) + outstruct.VerifyingContract = *abi.ConvertType(out[4], new(common.Address)).(*common.Address) + outstruct.Salt = *abi.ConvertType(out[5], new([32]byte)).(*[32]byte) + outstruct.Extensions = *abi.ConvertType(out[6], new([]*big.Int)).(*[]*big.Int) + + return *outstruct, err + +} + +// Eip712Domain is a free data retrieval call binding the contract method 0x84b0196e. +// +// Solidity: function eip712Domain() view returns(bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions) +func (_MockErc20 *MockErc20Session) Eip712Domain() (struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int +}, error) { + return _MockErc20.Contract.Eip712Domain(&_MockErc20.CallOpts) +} + +// Eip712Domain is a free data retrieval call binding the contract method 0x84b0196e. +// +// Solidity: function eip712Domain() view returns(bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions) +func (_MockErc20 *MockErc20CallerSession) Eip712Domain() (struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int +}, error) { + return _MockErc20.Contract.Eip712Domain(&_MockErc20.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_MockErc20 *MockErc20Caller) Name(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _MockErc20.contract.Call(opts, &out, "name") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_MockErc20 *MockErc20Session) Name() (string, error) { + return _MockErc20.Contract.Name(&_MockErc20.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_MockErc20 *MockErc20CallerSession) Name() (string, error) { + return _MockErc20.Contract.Name(&_MockErc20.CallOpts) +} + +// Nonces is a free data retrieval call binding the contract method 0x7ecebe00. +// +// Solidity: function nonces(address owner) view returns(uint256 result) +func (_MockErc20 *MockErc20Caller) Nonces(opts *bind.CallOpts, owner common.Address) (*big.Int, error) { + var out []interface{} + err := _MockErc20.contract.Call(opts, &out, "nonces", owner) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Nonces is a free data retrieval call binding the contract method 0x7ecebe00. +// +// Solidity: function nonces(address owner) view returns(uint256 result) +func (_MockErc20 *MockErc20Session) Nonces(owner common.Address) (*big.Int, error) { + return _MockErc20.Contract.Nonces(&_MockErc20.CallOpts, owner) +} + +// Nonces is a free data retrieval call binding the contract method 0x7ecebe00. +// +// Solidity: function nonces(address owner) view returns(uint256 result) +func (_MockErc20 *MockErc20CallerSession) Nonces(owner common.Address) (*big.Int, error) { + return _MockErc20.Contract.Nonces(&_MockErc20.CallOpts, owner) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_MockErc20 *MockErc20Caller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _MockErc20.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_MockErc20 *MockErc20Session) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _MockErc20.Contract.SupportsInterface(&_MockErc20.CallOpts, interfaceId) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_MockErc20 *MockErc20CallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _MockErc20.Contract.SupportsInterface(&_MockErc20.CallOpts, interfaceId) +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_MockErc20 *MockErc20Caller) Symbol(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _MockErc20.contract.Call(opts, &out, "symbol") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_MockErc20 *MockErc20Session) Symbol() (string, error) { + return _MockErc20.Contract.Symbol(&_MockErc20.CallOpts) +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_MockErc20 *MockErc20CallerSession) Symbol() (string, error) { + return _MockErc20.Contract.Symbol(&_MockErc20.CallOpts) +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_MockErc20 *MockErc20Caller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _MockErc20.contract.Call(opts, &out, "totalSupply") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_MockErc20 *MockErc20Session) TotalSupply() (*big.Int, error) { + return _MockErc20.Contract.TotalSupply(&_MockErc20.CallOpts) +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_MockErc20 *MockErc20CallerSession) TotalSupply() (*big.Int, error) { + return _MockErc20.Contract.TotalSupply(&_MockErc20.CallOpts) +} + +// ERC20Init is a paid mutator transaction binding the contract method 0xaa23aa02. +// +// Solidity: function __ERC20_init(string name_, string symbol_, uint8 decimals_) returns() +func (_MockErc20 *MockErc20Transactor) ERC20Init(opts *bind.TransactOpts, name_ string, symbol_ string, decimals_ uint8) (*types.Transaction, error) { + return _MockErc20.contract.Transact(opts, "__ERC20_init", name_, symbol_, decimals_) +} + +// ERC20Init is a paid mutator transaction binding the contract method 0xaa23aa02. +// +// Solidity: function __ERC20_init(string name_, string symbol_, uint8 decimals_) returns() +func (_MockErc20 *MockErc20Session) ERC20Init(name_ string, symbol_ string, decimals_ uint8) (*types.Transaction, error) { + return _MockErc20.Contract.ERC20Init(&_MockErc20.TransactOpts, name_, symbol_, decimals_) +} + +// ERC20Init is a paid mutator transaction binding the contract method 0xaa23aa02. +// +// Solidity: function __ERC20_init(string name_, string symbol_, uint8 decimals_) returns() +func (_MockErc20 *MockErc20TransactorSession) ERC20Init(name_ string, symbol_ string, decimals_ uint8) (*types.Transaction, error) { + return _MockErc20.Contract.ERC20Init(&_MockErc20.TransactOpts, name_, symbol_, decimals_) +} + +// IntrospectionInit is a paid mutator transaction binding the contract method 0x930fc8ca. +// +// Solidity: function __Introspection_init() returns() +func (_MockErc20 *MockErc20Transactor) IntrospectionInit(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MockErc20.contract.Transact(opts, "__Introspection_init") +} + +// IntrospectionInit is a paid mutator transaction binding the contract method 0x930fc8ca. +// +// Solidity: function __Introspection_init() returns() +func (_MockErc20 *MockErc20Session) IntrospectionInit() (*types.Transaction, error) { + return _MockErc20.Contract.IntrospectionInit(&_MockErc20.TransactOpts) +} + +// IntrospectionInit is a paid mutator transaction binding the contract method 0x930fc8ca. +// +// Solidity: function __Introspection_init() returns() +func (_MockErc20 *MockErc20TransactorSession) IntrospectionInit() (*types.Transaction, error) { + return _MockErc20.Contract.IntrospectionInit(&_MockErc20.TransactOpts) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address spender, uint256 amount) returns(bool) +func (_MockErc20 *MockErc20Transactor) Approve(opts *bind.TransactOpts, spender common.Address, amount *big.Int) (*types.Transaction, error) { + return _MockErc20.contract.Transact(opts, "approve", spender, amount) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address spender, uint256 amount) returns(bool) +func (_MockErc20 *MockErc20Session) Approve(spender common.Address, amount *big.Int) (*types.Transaction, error) { + return _MockErc20.Contract.Approve(&_MockErc20.TransactOpts, spender, amount) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address spender, uint256 amount) returns(bool) +func (_MockErc20 *MockErc20TransactorSession) Approve(spender common.Address, amount *big.Int) (*types.Transaction, error) { + return _MockErc20.Contract.Approve(&_MockErc20.TransactOpts, spender, amount) +} + +// Mint is a paid mutator transaction binding the contract method 0x40c10f19. +// +// Solidity: function mint(address account, uint256 amount) returns() +func (_MockErc20 *MockErc20Transactor) Mint(opts *bind.TransactOpts, account common.Address, amount *big.Int) (*types.Transaction, error) { + return _MockErc20.contract.Transact(opts, "mint", account, amount) +} + +// Mint is a paid mutator transaction binding the contract method 0x40c10f19. +// +// Solidity: function mint(address account, uint256 amount) returns() +func (_MockErc20 *MockErc20Session) Mint(account common.Address, amount *big.Int) (*types.Transaction, error) { + return _MockErc20.Contract.Mint(&_MockErc20.TransactOpts, account, amount) +} + +// Mint is a paid mutator transaction binding the contract method 0x40c10f19. +// +// Solidity: function mint(address account, uint256 amount) returns() +func (_MockErc20 *MockErc20TransactorSession) Mint(account common.Address, amount *big.Int) (*types.Transaction, error) { + return _MockErc20.Contract.Mint(&_MockErc20.TransactOpts, account, amount) +} + +// Permit is a paid mutator transaction binding the contract method 0xd505accf. +// +// Solidity: function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns() +func (_MockErc20 *MockErc20Transactor) Permit(opts *bind.TransactOpts, owner common.Address, spender common.Address, amount *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) { + return _MockErc20.contract.Transact(opts, "permit", owner, spender, amount, deadline, v, r, s) +} + +// Permit is a paid mutator transaction binding the contract method 0xd505accf. +// +// Solidity: function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns() +func (_MockErc20 *MockErc20Session) Permit(owner common.Address, spender common.Address, amount *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) { + return _MockErc20.Contract.Permit(&_MockErc20.TransactOpts, owner, spender, amount, deadline, v, r, s) +} + +// Permit is a paid mutator transaction binding the contract method 0xd505accf. +// +// Solidity: function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns() +func (_MockErc20 *MockErc20TransactorSession) Permit(owner common.Address, spender common.Address, amount *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) { + return _MockErc20.Contract.Permit(&_MockErc20.TransactOpts, owner, spender, amount, deadline, v, r, s) +} + +// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. +// +// Solidity: function transfer(address to, uint256 amount) returns(bool) +func (_MockErc20 *MockErc20Transactor) Transfer(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _MockErc20.contract.Transact(opts, "transfer", to, amount) +} + +// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. +// +// Solidity: function transfer(address to, uint256 amount) returns(bool) +func (_MockErc20 *MockErc20Session) Transfer(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _MockErc20.Contract.Transfer(&_MockErc20.TransactOpts, to, amount) +} + +// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. +// +// Solidity: function transfer(address to, uint256 amount) returns(bool) +func (_MockErc20 *MockErc20TransactorSession) Transfer(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _MockErc20.Contract.Transfer(&_MockErc20.TransactOpts, to, amount) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool) +func (_MockErc20 *MockErc20Transactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _MockErc20.contract.Transact(opts, "transferFrom", from, to, amount) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool) +func (_MockErc20 *MockErc20Session) TransferFrom(from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _MockErc20.Contract.TransferFrom(&_MockErc20.TransactOpts, from, to, amount) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool) +func (_MockErc20 *MockErc20TransactorSession) TransferFrom(from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _MockErc20.Contract.TransferFrom(&_MockErc20.TransactOpts, from, to, amount) +} + +// MockErc20ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the MockErc20 contract. +type MockErc20ApprovalIterator struct { + Event *MockErc20Approval // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockErc20ApprovalIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockErc20Approval) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockErc20Approval) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockErc20ApprovalIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockErc20ApprovalIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockErc20Approval represents a Approval event raised by the MockErc20 contract. +type MockErc20Approval struct { + Owner common.Address + Spender common.Address + Value *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value) +func (_MockErc20 *MockErc20Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*MockErc20ApprovalIterator, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var spenderRule []interface{} + for _, spenderItem := range spender { + spenderRule = append(spenderRule, spenderItem) + } + + logs, sub, err := _MockErc20.contract.FilterLogs(opts, "Approval", ownerRule, spenderRule) + if err != nil { + return nil, err + } + return &MockErc20ApprovalIterator{contract: _MockErc20.contract, event: "Approval", logs: logs, sub: sub}, nil +} + +// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value) +func (_MockErc20 *MockErc20Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *MockErc20Approval, owner []common.Address, spender []common.Address) (event.Subscription, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var spenderRule []interface{} + for _, spenderItem := range spender { + spenderRule = append(spenderRule, spenderItem) + } + + logs, sub, err := _MockErc20.contract.WatchLogs(opts, "Approval", ownerRule, spenderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockErc20Approval) + if err := _MockErc20.contract.UnpackLog(event, "Approval", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value) +func (_MockErc20 *MockErc20Filterer) ParseApproval(log types.Log) (*MockErc20Approval, error) { + event := new(MockErc20Approval) + if err := _MockErc20.contract.UnpackLog(event, "Approval", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockErc20EIP712DomainChangedIterator is returned from FilterEIP712DomainChanged and is used to iterate over the raw logs and unpacked data for EIP712DomainChanged events raised by the MockErc20 contract. +type MockErc20EIP712DomainChangedIterator struct { + Event *MockErc20EIP712DomainChanged // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockErc20EIP712DomainChangedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockErc20EIP712DomainChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockErc20EIP712DomainChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockErc20EIP712DomainChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockErc20EIP712DomainChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockErc20EIP712DomainChanged represents a EIP712DomainChanged event raised by the MockErc20 contract. +type MockErc20EIP712DomainChanged struct { + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEIP712DomainChanged is a free log retrieval operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31. +// +// Solidity: event EIP712DomainChanged() +func (_MockErc20 *MockErc20Filterer) FilterEIP712DomainChanged(opts *bind.FilterOpts) (*MockErc20EIP712DomainChangedIterator, error) { + + logs, sub, err := _MockErc20.contract.FilterLogs(opts, "EIP712DomainChanged") + if err != nil { + return nil, err + } + return &MockErc20EIP712DomainChangedIterator{contract: _MockErc20.contract, event: "EIP712DomainChanged", logs: logs, sub: sub}, nil +} + +// WatchEIP712DomainChanged is a free log subscription operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31. +// +// Solidity: event EIP712DomainChanged() +func (_MockErc20 *MockErc20Filterer) WatchEIP712DomainChanged(opts *bind.WatchOpts, sink chan<- *MockErc20EIP712DomainChanged) (event.Subscription, error) { + + logs, sub, err := _MockErc20.contract.WatchLogs(opts, "EIP712DomainChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockErc20EIP712DomainChanged) + if err := _MockErc20.contract.UnpackLog(event, "EIP712DomainChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEIP712DomainChanged is a log parse operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31. +// +// Solidity: event EIP712DomainChanged() +func (_MockErc20 *MockErc20Filterer) ParseEIP712DomainChanged(log types.Log) (*MockErc20EIP712DomainChanged, error) { + event := new(MockErc20EIP712DomainChanged) + if err := _MockErc20.contract.UnpackLog(event, "EIP712DomainChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockErc20InitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the MockErc20 contract. +type MockErc20InitializedIterator struct { + Event *MockErc20Initialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockErc20InitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockErc20Initialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockErc20Initialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockErc20InitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockErc20InitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockErc20Initialized represents a Initialized event raised by the MockErc20 contract. +type MockErc20Initialized struct { + Version uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_MockErc20 *MockErc20Filterer) FilterInitialized(opts *bind.FilterOpts) (*MockErc20InitializedIterator, error) { + + logs, sub, err := _MockErc20.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &MockErc20InitializedIterator{contract: _MockErc20.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_MockErc20 *MockErc20Filterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *MockErc20Initialized) (event.Subscription, error) { + + logs, sub, err := _MockErc20.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockErc20Initialized) + if err := _MockErc20.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_MockErc20 *MockErc20Filterer) ParseInitialized(log types.Log) (*MockErc20Initialized, error) { + event := new(MockErc20Initialized) + if err := _MockErc20.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockErc20InterfaceAddedIterator is returned from FilterInterfaceAdded and is used to iterate over the raw logs and unpacked data for InterfaceAdded events raised by the MockErc20 contract. +type MockErc20InterfaceAddedIterator struct { + Event *MockErc20InterfaceAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockErc20InterfaceAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockErc20InterfaceAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockErc20InterfaceAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockErc20InterfaceAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockErc20InterfaceAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockErc20InterfaceAdded represents a InterfaceAdded event raised by the MockErc20 contract. +type MockErc20InterfaceAdded struct { + InterfaceId [4]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInterfaceAdded is a free log retrieval operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_MockErc20 *MockErc20Filterer) FilterInterfaceAdded(opts *bind.FilterOpts, interfaceId [][4]byte) (*MockErc20InterfaceAddedIterator, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _MockErc20.contract.FilterLogs(opts, "InterfaceAdded", interfaceIdRule) + if err != nil { + return nil, err + } + return &MockErc20InterfaceAddedIterator{contract: _MockErc20.contract, event: "InterfaceAdded", logs: logs, sub: sub}, nil +} + +// WatchInterfaceAdded is a free log subscription operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_MockErc20 *MockErc20Filterer) WatchInterfaceAdded(opts *bind.WatchOpts, sink chan<- *MockErc20InterfaceAdded, interfaceId [][4]byte) (event.Subscription, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _MockErc20.contract.WatchLogs(opts, "InterfaceAdded", interfaceIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockErc20InterfaceAdded) + if err := _MockErc20.contract.UnpackLog(event, "InterfaceAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInterfaceAdded is a log parse operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_MockErc20 *MockErc20Filterer) ParseInterfaceAdded(log types.Log) (*MockErc20InterfaceAdded, error) { + event := new(MockErc20InterfaceAdded) + if err := _MockErc20.contract.UnpackLog(event, "InterfaceAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockErc20InterfaceRemovedIterator is returned from FilterInterfaceRemoved and is used to iterate over the raw logs and unpacked data for InterfaceRemoved events raised by the MockErc20 contract. +type MockErc20InterfaceRemovedIterator struct { + Event *MockErc20InterfaceRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockErc20InterfaceRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockErc20InterfaceRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockErc20InterfaceRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockErc20InterfaceRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockErc20InterfaceRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockErc20InterfaceRemoved represents a InterfaceRemoved event raised by the MockErc20 contract. +type MockErc20InterfaceRemoved struct { + InterfaceId [4]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInterfaceRemoved is a free log retrieval operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_MockErc20 *MockErc20Filterer) FilterInterfaceRemoved(opts *bind.FilterOpts, interfaceId [][4]byte) (*MockErc20InterfaceRemovedIterator, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _MockErc20.contract.FilterLogs(opts, "InterfaceRemoved", interfaceIdRule) + if err != nil { + return nil, err + } + return &MockErc20InterfaceRemovedIterator{contract: _MockErc20.contract, event: "InterfaceRemoved", logs: logs, sub: sub}, nil +} + +// WatchInterfaceRemoved is a free log subscription operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_MockErc20 *MockErc20Filterer) WatchInterfaceRemoved(opts *bind.WatchOpts, sink chan<- *MockErc20InterfaceRemoved, interfaceId [][4]byte) (event.Subscription, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _MockErc20.contract.WatchLogs(opts, "InterfaceRemoved", interfaceIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockErc20InterfaceRemoved) + if err := _MockErc20.contract.UnpackLog(event, "InterfaceRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInterfaceRemoved is a log parse operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_MockErc20 *MockErc20Filterer) ParseInterfaceRemoved(log types.Log) (*MockErc20InterfaceRemoved, error) { + event := new(MockErc20InterfaceRemoved) + if err := _MockErc20.contract.UnpackLog(event, "InterfaceRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockErc20TransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the MockErc20 contract. +type MockErc20TransferIterator struct { + Event *MockErc20Transfer // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockErc20TransferIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockErc20Transfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockErc20Transfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockErc20TransferIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockErc20TransferIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockErc20Transfer represents a Transfer event raised by the MockErc20 contract. +type MockErc20Transfer struct { + From common.Address + To common.Address + Value *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 value) +func (_MockErc20 *MockErc20Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*MockErc20TransferIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _MockErc20.contract.FilterLogs(opts, "Transfer", fromRule, toRule) + if err != nil { + return nil, err + } + return &MockErc20TransferIterator{contract: _MockErc20.contract, event: "Transfer", logs: logs, sub: sub}, nil +} + +// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 value) +func (_MockErc20 *MockErc20Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *MockErc20Transfer, from []common.Address, to []common.Address) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _MockErc20.contract.WatchLogs(opts, "Transfer", fromRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockErc20Transfer) + if err := _MockErc20.contract.UnpackLog(event, "Transfer", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 value) +func (_MockErc20 *MockErc20Filterer) ParseTransfer(log types.Log) (*MockErc20Transfer, error) { + event := new(MockErc20Transfer) + if err := _MockErc20.contract.UnpackLog(event, "Transfer", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/xchain/contracts/test/mock_erc721.go b/core/xchain/contracts/test/mock_erc721.go new file mode 100644 index 000000000..0a7b786f0 --- /dev/null +++ b/core/xchain/contracts/test/mock_erc721.go @@ -0,0 +1,1128 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package dev + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// MockErc721MetaData contains all meta data concerning the MockErc721 contract. +var MockErc721MetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"token\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getApproved\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mintTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerOf\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approved\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"tokenId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"tokenURI\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"approved\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ApprovalForAll\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"approved\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ERC721IncorrectOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC721InsufficientApproval\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC721InvalidApprover\",\"inputs\":[{\"name\":\"approver\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC721InvalidOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC721InvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC721InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC721InvalidSender\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC721NonexistentToken\",\"inputs\":[{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", + Bin: "0x60806040523480156200001157600080fd5b5060405180604001604052806005815260200164135e53919560da1b815250604051806040016040528060048152602001631353919560e21b81525081600090816200005e91906200011d565b5060016200006d82826200011d565b505050620001e9565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620000a157607f821691505b602082108103620000c257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000118576000816000526020600020601f850160051c81016020861015620000f35750805b601f850160051c820191505b818110156200011457828155600101620000ff565b5050505b505050565b81516001600160401b0381111562000139576200013962000076565b62000151816200014a84546200008c565b84620000c8565b602080601f831160018114620001895760008415620001705750858301515b600019600386901b1c1916600185901b17855562000114565b600085815260208120601f198616915b82811015620001ba5788860151825594840194600190910190840162000199565b5085821015620001d95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61105380620001f96000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806342966c68116100a257806395d89b411161007157806395d89b4114610229578063a22cb46514610231578063b88d4fde14610244578063c87b56dd14610257578063e985e9c51461026a57600080fd5b806342966c68146101dd5780636352211e146101f057806370a0823114610203578063755edd171461021657600080fd5b806317d70f7c116100de57806317d70f7c1461018d57806323b872dd146101a457806340c10f19146101b757806342842e0e146101ca57600080fd5b806301ffc9a71461011057806306fdde0314610138578063081812fc1461014d578063095ea7b314610178575b600080fd5b61012361011e366004610cd2565b61027d565b60405190151581526020015b60405180910390f35b6101406102cf565b60405161012f9190610d3f565b61016061015b366004610d52565b610361565b6040516001600160a01b03909116815260200161012f565b61018b610186366004610d87565b61038a565b005b61019660065481565b60405190815260200161012f565b61018b6101b2366004610db1565b610399565b61018b6101c5366004610d87565b610429565b61018b6101d8366004610db1565b610462565b61018b6101eb366004610d52565b61047d565b6101606101fe366004610d52565b610489565b610196610211366004610ded565b610494565b610196610224366004610ded565b6104dc565b610140610506565b61018b61023f366004610e08565b610515565b61018b610252366004610e5a565b610520565b610140610265366004610d52565b610537565b610123610278366004610f36565b6105ac565b60006001600160e01b031982166380ac58cd60e01b14806102ae57506001600160e01b03198216635b5e139f60e01b145b806102c957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546102de90610f69565b80601f016020809104026020016040519081016040528092919081815260200182805461030a90610f69565b80156103575780601f1061032c57610100808354040283529160200191610357565b820191906000526020600020905b81548152906001019060200180831161033a57829003601f168201915b5050505050905090565b600061036c826105da565b506000828152600460205260409020546001600160a01b03166102c9565b610395828233610613565b5050565b6001600160a01b0382166103c857604051633250574960e11b8152600060048201526024015b60405180910390fd5b60006103d5838333610620565b9050836001600160a01b0316816001600160a01b031614610423576040516364283d7b60e01b81526001600160a01b03808616600483015260248201849052821660448201526064016103bf565b50505050565b60005b8181101561045d5761044083600654610719565b6006805490600061045083610fa3565b909155505060010161042c565b505050565b61045d83838360405180602001604052806000815250610520565b6104868161077e565b50565b60006102c9826105da565b60006001600160a01b0382166104c0576040516322718ad960e21b8152600060048201526024016103bf565b506001600160a01b031660009081526003602052604090205490565b60068054600091826104ed83610fa3565b91905055506104fe82600654610719565b505060065490565b6060600180546102de90610f69565b6103953383836107b9565b61052b848484610399565b61042384848484610858565b6060610542826105da565b50600061055a60408051602081019091526000815290565b9050600081511161057a57604051806020016040528060008152506105a5565b8061058484610981565b604051602001610595929190610fca565b6040516020818303038152906040525b9392505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6000818152600260205260408120546001600160a01b0316806102c957604051637e27328960e01b8152600481018490526024016103bf565b61045d8383836001610a14565b6000828152600260205260408120546001600160a01b039081169083161561064d5761064d818486610b1a565b6001600160a01b0381161561068b5761066a600085600080610a14565b6001600160a01b038116600090815260036020526040902080546000190190555b6001600160a01b038516156106ba576001600160a01b0385166000908152600360205260409020805460010190555b60008481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6001600160a01b03821661074357604051633250574960e11b8152600060048201526024016103bf565b600061075183836000610620565b90506001600160a01b0381161561045d576040516339e3563760e11b8152600060048201526024016103bf565b600061078d6000836000610620565b90506001600160a01b03811661039557604051637e27328960e01b8152600481018390526024016103bf565b6001600160a01b0382166107eb57604051630b61174360e31b81526001600160a01b03831660048201526024016103bf565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561042357604051630a85bd0160e11b81526001600160a01b0384169063150b7a029061089a903390889087908790600401610ff9565b6020604051808303816000875af19250505080156108d5575060408051601f3d908101601f191682019092526108d291810190611036565b60015b61093e573d808015610903576040519150601f19603f3d011682016040523d82523d6000602084013e610908565b606091505b50805160000361093657604051633250574960e11b81526001600160a01b03851660048201526024016103bf565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b1461097a57604051633250574960e11b81526001600160a01b03851660048201526024016103bf565b5050505050565b6060600061098e83610b7e565b600101905060008167ffffffffffffffff8111156109ae576109ae610e44565b6040519080825280601f01601f1916602001820160405280156109d8576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846109e257509392505050565b8080610a2857506001600160a01b03821615155b15610aea576000610a38846105da565b90506001600160a01b03831615801590610a645750826001600160a01b0316816001600160a01b031614155b8015610a775750610a7581846105ac565b155b15610aa05760405163a9fbf51f60e01b81526001600160a01b03841660048201526024016103bf565b8115610ae85783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b610b25838383610c56565b61045d576001600160a01b038316610b5357604051637e27328960e01b8152600481018290526024016103bf565b60405163177e802f60e01b81526001600160a01b0383166004820152602481018290526044016103bf565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610bbd5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310610be9576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310610c0757662386f26fc10000830492506010015b6305f5e1008310610c1f576305f5e100830492506008015b6127108310610c3357612710830492506004015b60648310610c45576064830492506002015b600a83106102c95760010192915050565b60006001600160a01b03831615801590610cb45750826001600160a01b0316846001600160a01b03161480610c905750610c9084846105ac565b80610cb457506000828152600460205260409020546001600160a01b038481169116145b949350505050565b6001600160e01b03198116811461048657600080fd5b600060208284031215610ce457600080fd5b81356105a581610cbc565b60005b83811015610d0a578181015183820152602001610cf2565b50506000910152565b60008151808452610d2b816020860160208601610cef565b601f01601f19169290920160200192915050565b6020815260006105a56020830184610d13565b600060208284031215610d6457600080fd5b5035919050565b80356001600160a01b0381168114610d8257600080fd5b919050565b60008060408385031215610d9a57600080fd5b610da383610d6b565b946020939093013593505050565b600080600060608486031215610dc657600080fd5b610dcf84610d6b565b9250610ddd60208501610d6b565b9150604084013590509250925092565b600060208284031215610dff57600080fd5b6105a582610d6b565b60008060408385031215610e1b57600080fd5b610e2483610d6b565b915060208301358015158114610e3957600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215610e7057600080fd5b610e7985610d6b565b9350610e8760208601610d6b565b925060408501359150606085013567ffffffffffffffff80821115610eab57600080fd5b818701915087601f830112610ebf57600080fd5b813581811115610ed157610ed1610e44565b604051601f8201601f19908116603f01168101908382118183101715610ef957610ef9610e44565b816040528281528a6020848701011115610f1257600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215610f4957600080fd5b610f5283610d6b565b9150610f6060208401610d6b565b90509250929050565b600181811c90821680610f7d57607f821691505b602082108103610f9d57634e487b7160e01b600052602260045260246000fd5b50919050565b600060018201610fc357634e487b7160e01b600052601160045260246000fd5b5060010190565b60008351610fdc818460208801610cef565b835190830190610ff0818360208801610cef565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061102c90830184610d13565b9695505050505050565b60006020828403121561104857600080fd5b81516105a581610cbc56", +} + +// MockErc721ABI is the input ABI used to generate the binding from. +// Deprecated: Use MockErc721MetaData.ABI instead. +var MockErc721ABI = MockErc721MetaData.ABI + +// MockErc721Bin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use MockErc721MetaData.Bin instead. +var MockErc721Bin = MockErc721MetaData.Bin + +// DeployMockErc721 deploys a new Ethereum contract, binding an instance of MockErc721 to it. +func DeployMockErc721(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *MockErc721, error) { + parsed, err := MockErc721MetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(MockErc721Bin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &MockErc721{MockErc721Caller: MockErc721Caller{contract: contract}, MockErc721Transactor: MockErc721Transactor{contract: contract}, MockErc721Filterer: MockErc721Filterer{contract: contract}}, nil +} + +// MockErc721 is an auto generated Go binding around an Ethereum contract. +type MockErc721 struct { + MockErc721Caller // Read-only binding to the contract + MockErc721Transactor // Write-only binding to the contract + MockErc721Filterer // Log filterer for contract events +} + +// MockErc721Caller is an auto generated read-only Go binding around an Ethereum contract. +type MockErc721Caller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockErc721Transactor is an auto generated write-only Go binding around an Ethereum contract. +type MockErc721Transactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockErc721Filterer is an auto generated log filtering Go binding around an Ethereum contract events. +type MockErc721Filterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockErc721Session is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type MockErc721Session struct { + Contract *MockErc721 // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MockErc721CallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type MockErc721CallerSession struct { + Contract *MockErc721Caller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// MockErc721TransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type MockErc721TransactorSession struct { + Contract *MockErc721Transactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MockErc721Raw is an auto generated low-level Go binding around an Ethereum contract. +type MockErc721Raw struct { + Contract *MockErc721 // Generic contract binding to access the raw methods on +} + +// MockErc721CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type MockErc721CallerRaw struct { + Contract *MockErc721Caller // Generic read-only contract binding to access the raw methods on +} + +// MockErc721TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type MockErc721TransactorRaw struct { + Contract *MockErc721Transactor // Generic write-only contract binding to access the raw methods on +} + +// NewMockErc721 creates a new instance of MockErc721, bound to a specific deployed contract. +func NewMockErc721(address common.Address, backend bind.ContractBackend) (*MockErc721, error) { + contract, err := bindMockErc721(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &MockErc721{MockErc721Caller: MockErc721Caller{contract: contract}, MockErc721Transactor: MockErc721Transactor{contract: contract}, MockErc721Filterer: MockErc721Filterer{contract: contract}}, nil +} + +// NewMockErc721Caller creates a new read-only instance of MockErc721, bound to a specific deployed contract. +func NewMockErc721Caller(address common.Address, caller bind.ContractCaller) (*MockErc721Caller, error) { + contract, err := bindMockErc721(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &MockErc721Caller{contract: contract}, nil +} + +// NewMockErc721Transactor creates a new write-only instance of MockErc721, bound to a specific deployed contract. +func NewMockErc721Transactor(address common.Address, transactor bind.ContractTransactor) (*MockErc721Transactor, error) { + contract, err := bindMockErc721(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &MockErc721Transactor{contract: contract}, nil +} + +// NewMockErc721Filterer creates a new log filterer instance of MockErc721, bound to a specific deployed contract. +func NewMockErc721Filterer(address common.Address, filterer bind.ContractFilterer) (*MockErc721Filterer, error) { + contract, err := bindMockErc721(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &MockErc721Filterer{contract: contract}, nil +} + +// bindMockErc721 binds a generic wrapper to an already deployed contract. +func bindMockErc721(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := MockErc721MetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_MockErc721 *MockErc721Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MockErc721.Contract.MockErc721Caller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_MockErc721 *MockErc721Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MockErc721.Contract.MockErc721Transactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_MockErc721 *MockErc721Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MockErc721.Contract.MockErc721Transactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_MockErc721 *MockErc721CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MockErc721.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_MockErc721 *MockErc721TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MockErc721.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_MockErc721 *MockErc721TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MockErc721.Contract.contract.Transact(opts, method, params...) +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address owner) view returns(uint256) +func (_MockErc721 *MockErc721Caller) BalanceOf(opts *bind.CallOpts, owner common.Address) (*big.Int, error) { + var out []interface{} + err := _MockErc721.contract.Call(opts, &out, "balanceOf", owner) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address owner) view returns(uint256) +func (_MockErc721 *MockErc721Session) BalanceOf(owner common.Address) (*big.Int, error) { + return _MockErc721.Contract.BalanceOf(&_MockErc721.CallOpts, owner) +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address owner) view returns(uint256) +func (_MockErc721 *MockErc721CallerSession) BalanceOf(owner common.Address) (*big.Int, error) { + return _MockErc721.Contract.BalanceOf(&_MockErc721.CallOpts, owner) +} + +// GetApproved is a free data retrieval call binding the contract method 0x081812fc. +// +// Solidity: function getApproved(uint256 tokenId) view returns(address) +func (_MockErc721 *MockErc721Caller) GetApproved(opts *bind.CallOpts, tokenId *big.Int) (common.Address, error) { + var out []interface{} + err := _MockErc721.contract.Call(opts, &out, "getApproved", tokenId) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetApproved is a free data retrieval call binding the contract method 0x081812fc. +// +// Solidity: function getApproved(uint256 tokenId) view returns(address) +func (_MockErc721 *MockErc721Session) GetApproved(tokenId *big.Int) (common.Address, error) { + return _MockErc721.Contract.GetApproved(&_MockErc721.CallOpts, tokenId) +} + +// GetApproved is a free data retrieval call binding the contract method 0x081812fc. +// +// Solidity: function getApproved(uint256 tokenId) view returns(address) +func (_MockErc721 *MockErc721CallerSession) GetApproved(tokenId *big.Int) (common.Address, error) { + return _MockErc721.Contract.GetApproved(&_MockErc721.CallOpts, tokenId) +} + +// IsApprovedForAll is a free data retrieval call binding the contract method 0xe985e9c5. +// +// Solidity: function isApprovedForAll(address owner, address operator) view returns(bool) +func (_MockErc721 *MockErc721Caller) IsApprovedForAll(opts *bind.CallOpts, owner common.Address, operator common.Address) (bool, error) { + var out []interface{} + err := _MockErc721.contract.Call(opts, &out, "isApprovedForAll", owner, operator) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsApprovedForAll is a free data retrieval call binding the contract method 0xe985e9c5. +// +// Solidity: function isApprovedForAll(address owner, address operator) view returns(bool) +func (_MockErc721 *MockErc721Session) IsApprovedForAll(owner common.Address, operator common.Address) (bool, error) { + return _MockErc721.Contract.IsApprovedForAll(&_MockErc721.CallOpts, owner, operator) +} + +// IsApprovedForAll is a free data retrieval call binding the contract method 0xe985e9c5. +// +// Solidity: function isApprovedForAll(address owner, address operator) view returns(bool) +func (_MockErc721 *MockErc721CallerSession) IsApprovedForAll(owner common.Address, operator common.Address) (bool, error) { + return _MockErc721.Contract.IsApprovedForAll(&_MockErc721.CallOpts, owner, operator) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_MockErc721 *MockErc721Caller) Name(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _MockErc721.contract.Call(opts, &out, "name") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_MockErc721 *MockErc721Session) Name() (string, error) { + return _MockErc721.Contract.Name(&_MockErc721.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_MockErc721 *MockErc721CallerSession) Name() (string, error) { + return _MockErc721.Contract.Name(&_MockErc721.CallOpts) +} + +// OwnerOf is a free data retrieval call binding the contract method 0x6352211e. +// +// Solidity: function ownerOf(uint256 tokenId) view returns(address) +func (_MockErc721 *MockErc721Caller) OwnerOf(opts *bind.CallOpts, tokenId *big.Int) (common.Address, error) { + var out []interface{} + err := _MockErc721.contract.Call(opts, &out, "ownerOf", tokenId) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// OwnerOf is a free data retrieval call binding the contract method 0x6352211e. +// +// Solidity: function ownerOf(uint256 tokenId) view returns(address) +func (_MockErc721 *MockErc721Session) OwnerOf(tokenId *big.Int) (common.Address, error) { + return _MockErc721.Contract.OwnerOf(&_MockErc721.CallOpts, tokenId) +} + +// OwnerOf is a free data retrieval call binding the contract method 0x6352211e. +// +// Solidity: function ownerOf(uint256 tokenId) view returns(address) +func (_MockErc721 *MockErc721CallerSession) OwnerOf(tokenId *big.Int) (common.Address, error) { + return _MockErc721.Contract.OwnerOf(&_MockErc721.CallOpts, tokenId) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_MockErc721 *MockErc721Caller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _MockErc721.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_MockErc721 *MockErc721Session) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _MockErc721.Contract.SupportsInterface(&_MockErc721.CallOpts, interfaceId) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_MockErc721 *MockErc721CallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _MockErc721.Contract.SupportsInterface(&_MockErc721.CallOpts, interfaceId) +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_MockErc721 *MockErc721Caller) Symbol(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _MockErc721.contract.Call(opts, &out, "symbol") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_MockErc721 *MockErc721Session) Symbol() (string, error) { + return _MockErc721.Contract.Symbol(&_MockErc721.CallOpts) +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_MockErc721 *MockErc721CallerSession) Symbol() (string, error) { + return _MockErc721.Contract.Symbol(&_MockErc721.CallOpts) +} + +// TokenId is a free data retrieval call binding the contract method 0x17d70f7c. +// +// Solidity: function tokenId() view returns(uint256) +func (_MockErc721 *MockErc721Caller) TokenId(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _MockErc721.contract.Call(opts, &out, "tokenId") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TokenId is a free data retrieval call binding the contract method 0x17d70f7c. +// +// Solidity: function tokenId() view returns(uint256) +func (_MockErc721 *MockErc721Session) TokenId() (*big.Int, error) { + return _MockErc721.Contract.TokenId(&_MockErc721.CallOpts) +} + +// TokenId is a free data retrieval call binding the contract method 0x17d70f7c. +// +// Solidity: function tokenId() view returns(uint256) +func (_MockErc721 *MockErc721CallerSession) TokenId() (*big.Int, error) { + return _MockErc721.Contract.TokenId(&_MockErc721.CallOpts) +} + +// TokenURI is a free data retrieval call binding the contract method 0xc87b56dd. +// +// Solidity: function tokenURI(uint256 tokenId) view returns(string) +func (_MockErc721 *MockErc721Caller) TokenURI(opts *bind.CallOpts, tokenId *big.Int) (string, error) { + var out []interface{} + err := _MockErc721.contract.Call(opts, &out, "tokenURI", tokenId) + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// TokenURI is a free data retrieval call binding the contract method 0xc87b56dd. +// +// Solidity: function tokenURI(uint256 tokenId) view returns(string) +func (_MockErc721 *MockErc721Session) TokenURI(tokenId *big.Int) (string, error) { + return _MockErc721.Contract.TokenURI(&_MockErc721.CallOpts, tokenId) +} + +// TokenURI is a free data retrieval call binding the contract method 0xc87b56dd. +// +// Solidity: function tokenURI(uint256 tokenId) view returns(string) +func (_MockErc721 *MockErc721CallerSession) TokenURI(tokenId *big.Int) (string, error) { + return _MockErc721.Contract.TokenURI(&_MockErc721.CallOpts, tokenId) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address to, uint256 tokenId) returns() +func (_MockErc721 *MockErc721Transactor) Approve(opts *bind.TransactOpts, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _MockErc721.contract.Transact(opts, "approve", to, tokenId) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address to, uint256 tokenId) returns() +func (_MockErc721 *MockErc721Session) Approve(to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _MockErc721.Contract.Approve(&_MockErc721.TransactOpts, to, tokenId) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address to, uint256 tokenId) returns() +func (_MockErc721 *MockErc721TransactorSession) Approve(to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _MockErc721.Contract.Approve(&_MockErc721.TransactOpts, to, tokenId) +} + +// Burn is a paid mutator transaction binding the contract method 0x42966c68. +// +// Solidity: function burn(uint256 token) returns() +func (_MockErc721 *MockErc721Transactor) Burn(opts *bind.TransactOpts, token *big.Int) (*types.Transaction, error) { + return _MockErc721.contract.Transact(opts, "burn", token) +} + +// Burn is a paid mutator transaction binding the contract method 0x42966c68. +// +// Solidity: function burn(uint256 token) returns() +func (_MockErc721 *MockErc721Session) Burn(token *big.Int) (*types.Transaction, error) { + return _MockErc721.Contract.Burn(&_MockErc721.TransactOpts, token) +} + +// Burn is a paid mutator transaction binding the contract method 0x42966c68. +// +// Solidity: function burn(uint256 token) returns() +func (_MockErc721 *MockErc721TransactorSession) Burn(token *big.Int) (*types.Transaction, error) { + return _MockErc721.Contract.Burn(&_MockErc721.TransactOpts, token) +} + +// Mint is a paid mutator transaction binding the contract method 0x40c10f19. +// +// Solidity: function mint(address to, uint256 amount) returns() +func (_MockErc721 *MockErc721Transactor) Mint(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _MockErc721.contract.Transact(opts, "mint", to, amount) +} + +// Mint is a paid mutator transaction binding the contract method 0x40c10f19. +// +// Solidity: function mint(address to, uint256 amount) returns() +func (_MockErc721 *MockErc721Session) Mint(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _MockErc721.Contract.Mint(&_MockErc721.TransactOpts, to, amount) +} + +// Mint is a paid mutator transaction binding the contract method 0x40c10f19. +// +// Solidity: function mint(address to, uint256 amount) returns() +func (_MockErc721 *MockErc721TransactorSession) Mint(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _MockErc721.Contract.Mint(&_MockErc721.TransactOpts, to, amount) +} + +// MintTo is a paid mutator transaction binding the contract method 0x755edd17. +// +// Solidity: function mintTo(address to) returns(uint256) +func (_MockErc721 *MockErc721Transactor) MintTo(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _MockErc721.contract.Transact(opts, "mintTo", to) +} + +// MintTo is a paid mutator transaction binding the contract method 0x755edd17. +// +// Solidity: function mintTo(address to) returns(uint256) +func (_MockErc721 *MockErc721Session) MintTo(to common.Address) (*types.Transaction, error) { + return _MockErc721.Contract.MintTo(&_MockErc721.TransactOpts, to) +} + +// MintTo is a paid mutator transaction binding the contract method 0x755edd17. +// +// Solidity: function mintTo(address to) returns(uint256) +func (_MockErc721 *MockErc721TransactorSession) MintTo(to common.Address) (*types.Transaction, error) { + return _MockErc721.Contract.MintTo(&_MockErc721.TransactOpts, to) +} + +// SafeTransferFrom is a paid mutator transaction binding the contract method 0x42842e0e. +// +// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId) returns() +func (_MockErc721 *MockErc721Transactor) SafeTransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _MockErc721.contract.Transact(opts, "safeTransferFrom", from, to, tokenId) +} + +// SafeTransferFrom is a paid mutator transaction binding the contract method 0x42842e0e. +// +// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId) returns() +func (_MockErc721 *MockErc721Session) SafeTransferFrom(from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _MockErc721.Contract.SafeTransferFrom(&_MockErc721.TransactOpts, from, to, tokenId) +} + +// SafeTransferFrom is a paid mutator transaction binding the contract method 0x42842e0e. +// +// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId) returns() +func (_MockErc721 *MockErc721TransactorSession) SafeTransferFrom(from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _MockErc721.Contract.SafeTransferFrom(&_MockErc721.TransactOpts, from, to, tokenId) +} + +// SafeTransferFrom0 is a paid mutator transaction binding the contract method 0xb88d4fde. +// +// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId, bytes data) returns() +func (_MockErc721 *MockErc721Transactor) SafeTransferFrom0(opts *bind.TransactOpts, from common.Address, to common.Address, tokenId *big.Int, data []byte) (*types.Transaction, error) { + return _MockErc721.contract.Transact(opts, "safeTransferFrom0", from, to, tokenId, data) +} + +// SafeTransferFrom0 is a paid mutator transaction binding the contract method 0xb88d4fde. +// +// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId, bytes data) returns() +func (_MockErc721 *MockErc721Session) SafeTransferFrom0(from common.Address, to common.Address, tokenId *big.Int, data []byte) (*types.Transaction, error) { + return _MockErc721.Contract.SafeTransferFrom0(&_MockErc721.TransactOpts, from, to, tokenId, data) +} + +// SafeTransferFrom0 is a paid mutator transaction binding the contract method 0xb88d4fde. +// +// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId, bytes data) returns() +func (_MockErc721 *MockErc721TransactorSession) SafeTransferFrom0(from common.Address, to common.Address, tokenId *big.Int, data []byte) (*types.Transaction, error) { + return _MockErc721.Contract.SafeTransferFrom0(&_MockErc721.TransactOpts, from, to, tokenId, data) +} + +// SetApprovalForAll is a paid mutator transaction binding the contract method 0xa22cb465. +// +// Solidity: function setApprovalForAll(address operator, bool approved) returns() +func (_MockErc721 *MockErc721Transactor) SetApprovalForAll(opts *bind.TransactOpts, operator common.Address, approved bool) (*types.Transaction, error) { + return _MockErc721.contract.Transact(opts, "setApprovalForAll", operator, approved) +} + +// SetApprovalForAll is a paid mutator transaction binding the contract method 0xa22cb465. +// +// Solidity: function setApprovalForAll(address operator, bool approved) returns() +func (_MockErc721 *MockErc721Session) SetApprovalForAll(operator common.Address, approved bool) (*types.Transaction, error) { + return _MockErc721.Contract.SetApprovalForAll(&_MockErc721.TransactOpts, operator, approved) +} + +// SetApprovalForAll is a paid mutator transaction binding the contract method 0xa22cb465. +// +// Solidity: function setApprovalForAll(address operator, bool approved) returns() +func (_MockErc721 *MockErc721TransactorSession) SetApprovalForAll(operator common.Address, approved bool) (*types.Transaction, error) { + return _MockErc721.Contract.SetApprovalForAll(&_MockErc721.TransactOpts, operator, approved) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 tokenId) returns() +func (_MockErc721 *MockErc721Transactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _MockErc721.contract.Transact(opts, "transferFrom", from, to, tokenId) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 tokenId) returns() +func (_MockErc721 *MockErc721Session) TransferFrom(from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _MockErc721.Contract.TransferFrom(&_MockErc721.TransactOpts, from, to, tokenId) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 tokenId) returns() +func (_MockErc721 *MockErc721TransactorSession) TransferFrom(from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _MockErc721.Contract.TransferFrom(&_MockErc721.TransactOpts, from, to, tokenId) +} + +// MockErc721ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the MockErc721 contract. +type MockErc721ApprovalIterator struct { + Event *MockErc721Approval // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockErc721ApprovalIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockErc721Approval) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockErc721Approval) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockErc721ApprovalIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockErc721ApprovalIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockErc721Approval represents a Approval event raised by the MockErc721 contract. +type MockErc721Approval struct { + Owner common.Address + Approved common.Address + TokenId *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId) +func (_MockErc721 *MockErc721Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, approved []common.Address, tokenId []*big.Int) (*MockErc721ApprovalIterator, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var approvedRule []interface{} + for _, approvedItem := range approved { + approvedRule = append(approvedRule, approvedItem) + } + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + + logs, sub, err := _MockErc721.contract.FilterLogs(opts, "Approval", ownerRule, approvedRule, tokenIdRule) + if err != nil { + return nil, err + } + return &MockErc721ApprovalIterator{contract: _MockErc721.contract, event: "Approval", logs: logs, sub: sub}, nil +} + +// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId) +func (_MockErc721 *MockErc721Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *MockErc721Approval, owner []common.Address, approved []common.Address, tokenId []*big.Int) (event.Subscription, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var approvedRule []interface{} + for _, approvedItem := range approved { + approvedRule = append(approvedRule, approvedItem) + } + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + + logs, sub, err := _MockErc721.contract.WatchLogs(opts, "Approval", ownerRule, approvedRule, tokenIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockErc721Approval) + if err := _MockErc721.contract.UnpackLog(event, "Approval", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId) +func (_MockErc721 *MockErc721Filterer) ParseApproval(log types.Log) (*MockErc721Approval, error) { + event := new(MockErc721Approval) + if err := _MockErc721.contract.UnpackLog(event, "Approval", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockErc721ApprovalForAllIterator is returned from FilterApprovalForAll and is used to iterate over the raw logs and unpacked data for ApprovalForAll events raised by the MockErc721 contract. +type MockErc721ApprovalForAllIterator struct { + Event *MockErc721ApprovalForAll // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockErc721ApprovalForAllIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockErc721ApprovalForAll) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockErc721ApprovalForAll) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockErc721ApprovalForAllIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockErc721ApprovalForAllIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockErc721ApprovalForAll represents a ApprovalForAll event raised by the MockErc721 contract. +type MockErc721ApprovalForAll struct { + Owner common.Address + Operator common.Address + Approved bool + Raw types.Log // Blockchain specific contextual infos +} + +// FilterApprovalForAll is a free log retrieval operation binding the contract event 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31. +// +// Solidity: event ApprovalForAll(address indexed owner, address indexed operator, bool approved) +func (_MockErc721 *MockErc721Filterer) FilterApprovalForAll(opts *bind.FilterOpts, owner []common.Address, operator []common.Address) (*MockErc721ApprovalForAllIterator, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _MockErc721.contract.FilterLogs(opts, "ApprovalForAll", ownerRule, operatorRule) + if err != nil { + return nil, err + } + return &MockErc721ApprovalForAllIterator{contract: _MockErc721.contract, event: "ApprovalForAll", logs: logs, sub: sub}, nil +} + +// WatchApprovalForAll is a free log subscription operation binding the contract event 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31. +// +// Solidity: event ApprovalForAll(address indexed owner, address indexed operator, bool approved) +func (_MockErc721 *MockErc721Filterer) WatchApprovalForAll(opts *bind.WatchOpts, sink chan<- *MockErc721ApprovalForAll, owner []common.Address, operator []common.Address) (event.Subscription, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _MockErc721.contract.WatchLogs(opts, "ApprovalForAll", ownerRule, operatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockErc721ApprovalForAll) + if err := _MockErc721.contract.UnpackLog(event, "ApprovalForAll", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseApprovalForAll is a log parse operation binding the contract event 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31. +// +// Solidity: event ApprovalForAll(address indexed owner, address indexed operator, bool approved) +func (_MockErc721 *MockErc721Filterer) ParseApprovalForAll(log types.Log) (*MockErc721ApprovalForAll, error) { + event := new(MockErc721ApprovalForAll) + if err := _MockErc721.contract.UnpackLog(event, "ApprovalForAll", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockErc721TransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the MockErc721 contract. +type MockErc721TransferIterator struct { + Event *MockErc721Transfer // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockErc721TransferIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockErc721Transfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockErc721Transfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockErc721TransferIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockErc721TransferIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockErc721Transfer represents a Transfer event raised by the MockErc721 contract. +type MockErc721Transfer struct { + From common.Address + To common.Address + TokenId *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 indexed tokenId) +func (_MockErc721 *MockErc721Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address, tokenId []*big.Int) (*MockErc721TransferIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + + logs, sub, err := _MockErc721.contract.FilterLogs(opts, "Transfer", fromRule, toRule, tokenIdRule) + if err != nil { + return nil, err + } + return &MockErc721TransferIterator{contract: _MockErc721.contract, event: "Transfer", logs: logs, sub: sub}, nil +} + +// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 indexed tokenId) +func (_MockErc721 *MockErc721Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *MockErc721Transfer, from []common.Address, to []common.Address, tokenId []*big.Int) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) + } + + logs, sub, err := _MockErc721.contract.WatchLogs(opts, "Transfer", fromRule, toRule, tokenIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockErc721Transfer) + if err := _MockErc721.contract.UnpackLog(event, "Transfer", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 indexed tokenId) +func (_MockErc721 *MockErc721Filterer) ParseTransfer(log types.Log) (*MockErc721Transfer, error) { + event := new(MockErc721Transfer) + if err := _MockErc721.contract.UnpackLog(event, "Transfer", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/xchain/contracts/v3/entitlement_checker.go b/core/xchain/contracts/v3/entitlement_checker.go new file mode 100644 index 000000000..1c4d6a0d4 --- /dev/null +++ b/core/xchain/contracts/v3/entitlement_checker.go @@ -0,0 +1,1259 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package v3 + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// EntitlementCheckerMetaData contains all meta data concerning the EntitlementChecker contract. +var EntitlementCheckerMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"__EntitlementChecker_init\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getNodeAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNodeCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRandomNodes\",\"inputs\":[{\"name\":\"count\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isValidNode\",\"inputs\":[{\"name\":\"node\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerNode\",\"inputs\":[{\"name\":\"node\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestEntitlementCheck\",\"inputs\":[{\"name\":\"callerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"transactionId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unregisterNode\",\"inputs\":[{\"name\":\"node\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"EntitlementCheckRequested\",\"inputs\":[{\"name\":\"callerAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contractAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"transactionId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"selectedNodes\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InterfaceAdded\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"indexed\":true,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InterfaceRemoved\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"indexed\":true,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NodeRegistered\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NodeUnregistered\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"EntitlementChecker_InsufficientNumberOfNodes\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementChecker_InvalidNodeOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementChecker_NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementChecker_NodeNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Initializable_InInitializingState\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Initializable_NotInInitializingState\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Introspection_AlreadySupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Introspection_NotSupported\",\"inputs\":[]}]", + Bin: "0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b610b5a806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063541da4e51161005b578063541da4e5146100fd578063672d7a0d146101105780639ebd11ef14610123578063c5e41cf61461014657600080fd5b806339bf397e1461008d57806339dc5b3e146100a85780633c59f126146100b25780634f845445146100dd575b600080fd5b610095610159565b6040519081526020015b60405180910390f35b6100b0610179565b005b6100c56100c03660046108bf565b6101d5565b6040516001600160a01b03909116815260200161009f565b6100f06100eb3660046108bf565b610248565b60405161009f919061091d565b6100b061010b366004610962565b610259565b6100b061011e366004610a4b565b61029e565b610136610131366004610a4b565b610334565b604051901515815260200161009f565b6100b0610154366004610a4b565b61034f565b6000600080516020610b3a833981519152610173816103e2565b91505090565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166101c357604051630ef4733760e31b815260040160405180910390fd5b6101d3630882d3fb60e21b6103ec565b565b6000600080516020610b3a8339815191526101ef816103e2565b83106102375760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b604482015260640160405180910390fd5b61024181846104ca565b9392505050565b6060610253826104d6565b92915050565b7f4675e3cc15801ffde520a3076d6ad75c0c6dbe8f23bdbea1dd45b676caffe4f38433858585604051610290959493929190610a66565b60405180910390a150505050565b600080516020610b3a8339815191526102b781836106ab565b156102d55760405163d1922fc160e01b815260040160405180910390fd5b6102df81836106cd565b506001600160a01b038216600081815260028301602052604080822080546001600160a01b03191633179055517f564728e6a7c8edd446557d94e0339d5e6ca2e05f42188914efdbdc87bcbbabf69190a25050565b6000600080516020610b3a83398151915261024181846106ab565b600080516020610b3a83398151915261036881836106ab565b610385576040516317e3e0b960e01b815260040160405180910390fd5b61038f81836106e2565b506001600160a01b038216600081815260028301602052604080822080546001600160a01b0319169055517fb1864577e4f285436a80ebc833984755393e2450d58622a65fb4fce87ea3573a9190a25050565b6000610253825490565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610479576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610492565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b600061024183836106f7565b6060600080516020610b3a83398151915260006104f2826103e2565b90508084111561051557604051631762997d60e01b815260040160405180910390fd5b60008467ffffffffffffffff8111156105305761053061094c565b604051908082528060200260200182016040528015610559578160200160208202803683370190505b50905060008267ffffffffffffffff8111156105775761057761094c565b6040519080825280602002602001820160405280156105a0578160200160208202803683370190505b50905060005b838110156105d457808282815181106105c1576105c1610aab565b60209081029190910101526001016105a6565b508260005b8781101561069f5760006105ed8284610721565b905061061e84828151811061060457610604610aab565b6020026020010151886000016104ca90919063ffffffff16565b85838151811061063057610630610aab565b6001600160a01b039092166020928302919091019091015283610654600185610ad7565b8151811061066457610664610aab565b602002602001015184828151811061067e5761067e610aab565b60209081029190910101528261069381610aea565b935050506001016105d9565b50919695505050505050565b6001600160a01b03811660009081526001830160205260408120541515610241565b6000610241836001600160a01b03841661077d565b6000610241836001600160a01b0384166107cc565b600082600001828154811061070e5761070e610aab565b9060005260206000200154905092915050565b604080514460208201524291810191909152606080820184905233901b6bffffffffffffffffffffffff1916608082015260009082906094016040516020818303038152906040528051906020012060001c6102419190610b01565b60008181526001830160205260408120546107c457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610253565b506000610253565b600081815260018301602052604081205480156108b55760006107f0600183610ad7565b855490915060009061080490600190610ad7565b905080821461086957600086600001828154811061082457610824610aab565b906000526020600020015490508087600001848154811061084757610847610aab565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061087a5761087a610b23565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610253565b6000915050610253565b6000602082840312156108d157600080fd5b5035919050565b60008151808452602080850194506020840160005b838110156109125781516001600160a01b0316875295820195908201906001016108ed565b509495945050505050565b60208152600061024160208301846108d8565b80356001600160a01b038116811461094757600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561097857600080fd5b61098185610930565b9350602080860135935060408601359250606086013567ffffffffffffffff808211156109ad57600080fd5b818801915088601f8301126109c157600080fd5b8135818111156109d3576109d361094c565b8060051b604051601f19603f830116810181811085821117156109f8576109f861094c565b60405291825284820192508381018501918b831115610a1657600080fd5b938501935b82851015610a3b57610a2c85610930565b84529385019392850192610a1b565b989b979a50959850505050505050565b600060208284031215610a5d57600080fd5b61024182610930565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090610aa0908301846108d8565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561025357610253610ac1565b600081610af957610af9610ac1565b506000190190565b600082610b1e57634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052603160045260246000fdfe180c1d0b9e5eeea9f2f078bc2712cd77acc6afea03b37705abe96dda6f602600", +} + +// EntitlementCheckerABI is the input ABI used to generate the binding from. +// Deprecated: Use EntitlementCheckerMetaData.ABI instead. +var EntitlementCheckerABI = EntitlementCheckerMetaData.ABI + +// EntitlementCheckerBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use EntitlementCheckerMetaData.Bin instead. +var EntitlementCheckerBin = EntitlementCheckerMetaData.Bin + +// DeployEntitlementChecker deploys a new Ethereum contract, binding an instance of EntitlementChecker to it. +func DeployEntitlementChecker(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *EntitlementChecker, error) { + parsed, err := EntitlementCheckerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(EntitlementCheckerBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &EntitlementChecker{EntitlementCheckerCaller: EntitlementCheckerCaller{contract: contract}, EntitlementCheckerTransactor: EntitlementCheckerTransactor{contract: contract}, EntitlementCheckerFilterer: EntitlementCheckerFilterer{contract: contract}}, nil +} + +// EntitlementChecker is an auto generated Go binding around an Ethereum contract. +type EntitlementChecker struct { + EntitlementCheckerCaller // Read-only binding to the contract + EntitlementCheckerTransactor // Write-only binding to the contract + EntitlementCheckerFilterer // Log filterer for contract events +} + +// EntitlementCheckerCaller is an auto generated read-only Go binding around an Ethereum contract. +type EntitlementCheckerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// EntitlementCheckerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type EntitlementCheckerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// EntitlementCheckerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type EntitlementCheckerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// EntitlementCheckerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type EntitlementCheckerSession struct { + Contract *EntitlementChecker // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// EntitlementCheckerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type EntitlementCheckerCallerSession struct { + Contract *EntitlementCheckerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// EntitlementCheckerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type EntitlementCheckerTransactorSession struct { + Contract *EntitlementCheckerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// EntitlementCheckerRaw is an auto generated low-level Go binding around an Ethereum contract. +type EntitlementCheckerRaw struct { + Contract *EntitlementChecker // Generic contract binding to access the raw methods on +} + +// EntitlementCheckerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type EntitlementCheckerCallerRaw struct { + Contract *EntitlementCheckerCaller // Generic read-only contract binding to access the raw methods on +} + +// EntitlementCheckerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type EntitlementCheckerTransactorRaw struct { + Contract *EntitlementCheckerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewEntitlementChecker creates a new instance of EntitlementChecker, bound to a specific deployed contract. +func NewEntitlementChecker(address common.Address, backend bind.ContractBackend) (*EntitlementChecker, error) { + contract, err := bindEntitlementChecker(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &EntitlementChecker{EntitlementCheckerCaller: EntitlementCheckerCaller{contract: contract}, EntitlementCheckerTransactor: EntitlementCheckerTransactor{contract: contract}, EntitlementCheckerFilterer: EntitlementCheckerFilterer{contract: contract}}, nil +} + +// NewEntitlementCheckerCaller creates a new read-only instance of EntitlementChecker, bound to a specific deployed contract. +func NewEntitlementCheckerCaller(address common.Address, caller bind.ContractCaller) (*EntitlementCheckerCaller, error) { + contract, err := bindEntitlementChecker(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &EntitlementCheckerCaller{contract: contract}, nil +} + +// NewEntitlementCheckerTransactor creates a new write-only instance of EntitlementChecker, bound to a specific deployed contract. +func NewEntitlementCheckerTransactor(address common.Address, transactor bind.ContractTransactor) (*EntitlementCheckerTransactor, error) { + contract, err := bindEntitlementChecker(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &EntitlementCheckerTransactor{contract: contract}, nil +} + +// NewEntitlementCheckerFilterer creates a new log filterer instance of EntitlementChecker, bound to a specific deployed contract. +func NewEntitlementCheckerFilterer(address common.Address, filterer bind.ContractFilterer) (*EntitlementCheckerFilterer, error) { + contract, err := bindEntitlementChecker(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &EntitlementCheckerFilterer{contract: contract}, nil +} + +// bindEntitlementChecker binds a generic wrapper to an already deployed contract. +func bindEntitlementChecker(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := EntitlementCheckerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_EntitlementChecker *EntitlementCheckerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _EntitlementChecker.Contract.EntitlementCheckerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_EntitlementChecker *EntitlementCheckerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _EntitlementChecker.Contract.EntitlementCheckerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_EntitlementChecker *EntitlementCheckerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _EntitlementChecker.Contract.EntitlementCheckerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_EntitlementChecker *EntitlementCheckerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _EntitlementChecker.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_EntitlementChecker *EntitlementCheckerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _EntitlementChecker.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_EntitlementChecker *EntitlementCheckerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _EntitlementChecker.Contract.contract.Transact(opts, method, params...) +} + +// GetNodeAtIndex is a free data retrieval call binding the contract method 0x3c59f126. +// +// Solidity: function getNodeAtIndex(uint256 index) view returns(address) +func (_EntitlementChecker *EntitlementCheckerCaller) GetNodeAtIndex(opts *bind.CallOpts, index *big.Int) (common.Address, error) { + var out []interface{} + err := _EntitlementChecker.contract.Call(opts, &out, "getNodeAtIndex", index) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetNodeAtIndex is a free data retrieval call binding the contract method 0x3c59f126. +// +// Solidity: function getNodeAtIndex(uint256 index) view returns(address) +func (_EntitlementChecker *EntitlementCheckerSession) GetNodeAtIndex(index *big.Int) (common.Address, error) { + return _EntitlementChecker.Contract.GetNodeAtIndex(&_EntitlementChecker.CallOpts, index) +} + +// GetNodeAtIndex is a free data retrieval call binding the contract method 0x3c59f126. +// +// Solidity: function getNodeAtIndex(uint256 index) view returns(address) +func (_EntitlementChecker *EntitlementCheckerCallerSession) GetNodeAtIndex(index *big.Int) (common.Address, error) { + return _EntitlementChecker.Contract.GetNodeAtIndex(&_EntitlementChecker.CallOpts, index) +} + +// GetNodeCount is a free data retrieval call binding the contract method 0x39bf397e. +// +// Solidity: function getNodeCount() view returns(uint256) +func (_EntitlementChecker *EntitlementCheckerCaller) GetNodeCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _EntitlementChecker.contract.Call(opts, &out, "getNodeCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetNodeCount is a free data retrieval call binding the contract method 0x39bf397e. +// +// Solidity: function getNodeCount() view returns(uint256) +func (_EntitlementChecker *EntitlementCheckerSession) GetNodeCount() (*big.Int, error) { + return _EntitlementChecker.Contract.GetNodeCount(&_EntitlementChecker.CallOpts) +} + +// GetNodeCount is a free data retrieval call binding the contract method 0x39bf397e. +// +// Solidity: function getNodeCount() view returns(uint256) +func (_EntitlementChecker *EntitlementCheckerCallerSession) GetNodeCount() (*big.Int, error) { + return _EntitlementChecker.Contract.GetNodeCount(&_EntitlementChecker.CallOpts) +} + +// GetRandomNodes is a free data retrieval call binding the contract method 0x4f845445. +// +// Solidity: function getRandomNodes(uint256 count) view returns(address[]) +func (_EntitlementChecker *EntitlementCheckerCaller) GetRandomNodes(opts *bind.CallOpts, count *big.Int) ([]common.Address, error) { + var out []interface{} + err := _EntitlementChecker.contract.Call(opts, &out, "getRandomNodes", count) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetRandomNodes is a free data retrieval call binding the contract method 0x4f845445. +// +// Solidity: function getRandomNodes(uint256 count) view returns(address[]) +func (_EntitlementChecker *EntitlementCheckerSession) GetRandomNodes(count *big.Int) ([]common.Address, error) { + return _EntitlementChecker.Contract.GetRandomNodes(&_EntitlementChecker.CallOpts, count) +} + +// GetRandomNodes is a free data retrieval call binding the contract method 0x4f845445. +// +// Solidity: function getRandomNodes(uint256 count) view returns(address[]) +func (_EntitlementChecker *EntitlementCheckerCallerSession) GetRandomNodes(count *big.Int) ([]common.Address, error) { + return _EntitlementChecker.Contract.GetRandomNodes(&_EntitlementChecker.CallOpts, count) +} + +// IsValidNode is a free data retrieval call binding the contract method 0x9ebd11ef. +// +// Solidity: function isValidNode(address node) view returns(bool) +func (_EntitlementChecker *EntitlementCheckerCaller) IsValidNode(opts *bind.CallOpts, node common.Address) (bool, error) { + var out []interface{} + err := _EntitlementChecker.contract.Call(opts, &out, "isValidNode", node) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsValidNode is a free data retrieval call binding the contract method 0x9ebd11ef. +// +// Solidity: function isValidNode(address node) view returns(bool) +func (_EntitlementChecker *EntitlementCheckerSession) IsValidNode(node common.Address) (bool, error) { + return _EntitlementChecker.Contract.IsValidNode(&_EntitlementChecker.CallOpts, node) +} + +// IsValidNode is a free data retrieval call binding the contract method 0x9ebd11ef. +// +// Solidity: function isValidNode(address node) view returns(bool) +func (_EntitlementChecker *EntitlementCheckerCallerSession) IsValidNode(node common.Address) (bool, error) { + return _EntitlementChecker.Contract.IsValidNode(&_EntitlementChecker.CallOpts, node) +} + +// EntitlementCheckerInit is a paid mutator transaction binding the contract method 0x39dc5b3e. +// +// Solidity: function __EntitlementChecker_init() returns() +func (_EntitlementChecker *EntitlementCheckerTransactor) EntitlementCheckerInit(opts *bind.TransactOpts) (*types.Transaction, error) { + return _EntitlementChecker.contract.Transact(opts, "__EntitlementChecker_init") +} + +// EntitlementCheckerInit is a paid mutator transaction binding the contract method 0x39dc5b3e. +// +// Solidity: function __EntitlementChecker_init() returns() +func (_EntitlementChecker *EntitlementCheckerSession) EntitlementCheckerInit() (*types.Transaction, error) { + return _EntitlementChecker.Contract.EntitlementCheckerInit(&_EntitlementChecker.TransactOpts) +} + +// EntitlementCheckerInit is a paid mutator transaction binding the contract method 0x39dc5b3e. +// +// Solidity: function __EntitlementChecker_init() returns() +func (_EntitlementChecker *EntitlementCheckerTransactorSession) EntitlementCheckerInit() (*types.Transaction, error) { + return _EntitlementChecker.Contract.EntitlementCheckerInit(&_EntitlementChecker.TransactOpts) +} + +// RegisterNode is a paid mutator transaction binding the contract method 0x672d7a0d. +// +// Solidity: function registerNode(address node) returns() +func (_EntitlementChecker *EntitlementCheckerTransactor) RegisterNode(opts *bind.TransactOpts, node common.Address) (*types.Transaction, error) { + return _EntitlementChecker.contract.Transact(opts, "registerNode", node) +} + +// RegisterNode is a paid mutator transaction binding the contract method 0x672d7a0d. +// +// Solidity: function registerNode(address node) returns() +func (_EntitlementChecker *EntitlementCheckerSession) RegisterNode(node common.Address) (*types.Transaction, error) { + return _EntitlementChecker.Contract.RegisterNode(&_EntitlementChecker.TransactOpts, node) +} + +// RegisterNode is a paid mutator transaction binding the contract method 0x672d7a0d. +// +// Solidity: function registerNode(address node) returns() +func (_EntitlementChecker *EntitlementCheckerTransactorSession) RegisterNode(node common.Address) (*types.Transaction, error) { + return _EntitlementChecker.Contract.RegisterNode(&_EntitlementChecker.TransactOpts, node) +} + +// RequestEntitlementCheck is a paid mutator transaction binding the contract method 0x541da4e5. +// +// Solidity: function requestEntitlementCheck(address callerAddress, bytes32 transactionId, uint256 roleId, address[] nodes) returns() +func (_EntitlementChecker *EntitlementCheckerTransactor) RequestEntitlementCheck(opts *bind.TransactOpts, callerAddress common.Address, transactionId [32]byte, roleId *big.Int, nodes []common.Address) (*types.Transaction, error) { + return _EntitlementChecker.contract.Transact(opts, "requestEntitlementCheck", callerAddress, transactionId, roleId, nodes) +} + +// RequestEntitlementCheck is a paid mutator transaction binding the contract method 0x541da4e5. +// +// Solidity: function requestEntitlementCheck(address callerAddress, bytes32 transactionId, uint256 roleId, address[] nodes) returns() +func (_EntitlementChecker *EntitlementCheckerSession) RequestEntitlementCheck(callerAddress common.Address, transactionId [32]byte, roleId *big.Int, nodes []common.Address) (*types.Transaction, error) { + return _EntitlementChecker.Contract.RequestEntitlementCheck(&_EntitlementChecker.TransactOpts, callerAddress, transactionId, roleId, nodes) +} + +// RequestEntitlementCheck is a paid mutator transaction binding the contract method 0x541da4e5. +// +// Solidity: function requestEntitlementCheck(address callerAddress, bytes32 transactionId, uint256 roleId, address[] nodes) returns() +func (_EntitlementChecker *EntitlementCheckerTransactorSession) RequestEntitlementCheck(callerAddress common.Address, transactionId [32]byte, roleId *big.Int, nodes []common.Address) (*types.Transaction, error) { + return _EntitlementChecker.Contract.RequestEntitlementCheck(&_EntitlementChecker.TransactOpts, callerAddress, transactionId, roleId, nodes) +} + +// UnregisterNode is a paid mutator transaction binding the contract method 0xc5e41cf6. +// +// Solidity: function unregisterNode(address node) returns() +func (_EntitlementChecker *EntitlementCheckerTransactor) UnregisterNode(opts *bind.TransactOpts, node common.Address) (*types.Transaction, error) { + return _EntitlementChecker.contract.Transact(opts, "unregisterNode", node) +} + +// UnregisterNode is a paid mutator transaction binding the contract method 0xc5e41cf6. +// +// Solidity: function unregisterNode(address node) returns() +func (_EntitlementChecker *EntitlementCheckerSession) UnregisterNode(node common.Address) (*types.Transaction, error) { + return _EntitlementChecker.Contract.UnregisterNode(&_EntitlementChecker.TransactOpts, node) +} + +// UnregisterNode is a paid mutator transaction binding the contract method 0xc5e41cf6. +// +// Solidity: function unregisterNode(address node) returns() +func (_EntitlementChecker *EntitlementCheckerTransactorSession) UnregisterNode(node common.Address) (*types.Transaction, error) { + return _EntitlementChecker.Contract.UnregisterNode(&_EntitlementChecker.TransactOpts, node) +} + +// EntitlementCheckerEntitlementCheckRequestedIterator is returned from FilterEntitlementCheckRequested and is used to iterate over the raw logs and unpacked data for EntitlementCheckRequested events raised by the EntitlementChecker contract. +type EntitlementCheckerEntitlementCheckRequestedIterator struct { + Event *EntitlementCheckerEntitlementCheckRequested // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EntitlementCheckerEntitlementCheckRequestedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerEntitlementCheckRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerEntitlementCheckRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EntitlementCheckerEntitlementCheckRequestedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EntitlementCheckerEntitlementCheckRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EntitlementCheckerEntitlementCheckRequested represents a EntitlementCheckRequested event raised by the EntitlementChecker contract. +type EntitlementCheckerEntitlementCheckRequested struct { + CallerAddress common.Address + ContractAddress common.Address + TransactionId [32]byte + RoleId *big.Int + SelectedNodes []common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEntitlementCheckRequested is a free log retrieval operation binding the contract event 0x4675e3cc15801ffde520a3076d6ad75c0c6dbe8f23bdbea1dd45b676caffe4f3. +// +// Solidity: event EntitlementCheckRequested(address callerAddress, address contractAddress, bytes32 transactionId, uint256 roleId, address[] selectedNodes) +func (_EntitlementChecker *EntitlementCheckerFilterer) FilterEntitlementCheckRequested(opts *bind.FilterOpts) (*EntitlementCheckerEntitlementCheckRequestedIterator, error) { + + logs, sub, err := _EntitlementChecker.contract.FilterLogs(opts, "EntitlementCheckRequested") + if err != nil { + return nil, err + } + return &EntitlementCheckerEntitlementCheckRequestedIterator{contract: _EntitlementChecker.contract, event: "EntitlementCheckRequested", logs: logs, sub: sub}, nil +} + +// WatchEntitlementCheckRequested is a free log subscription operation binding the contract event 0x4675e3cc15801ffde520a3076d6ad75c0c6dbe8f23bdbea1dd45b676caffe4f3. +// +// Solidity: event EntitlementCheckRequested(address callerAddress, address contractAddress, bytes32 transactionId, uint256 roleId, address[] selectedNodes) +func (_EntitlementChecker *EntitlementCheckerFilterer) WatchEntitlementCheckRequested(opts *bind.WatchOpts, sink chan<- *EntitlementCheckerEntitlementCheckRequested) (event.Subscription, error) { + + logs, sub, err := _EntitlementChecker.contract.WatchLogs(opts, "EntitlementCheckRequested") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EntitlementCheckerEntitlementCheckRequested) + if err := _EntitlementChecker.contract.UnpackLog(event, "EntitlementCheckRequested", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEntitlementCheckRequested is a log parse operation binding the contract event 0x4675e3cc15801ffde520a3076d6ad75c0c6dbe8f23bdbea1dd45b676caffe4f3. +// +// Solidity: event EntitlementCheckRequested(address callerAddress, address contractAddress, bytes32 transactionId, uint256 roleId, address[] selectedNodes) +func (_EntitlementChecker *EntitlementCheckerFilterer) ParseEntitlementCheckRequested(log types.Log) (*EntitlementCheckerEntitlementCheckRequested, error) { + event := new(EntitlementCheckerEntitlementCheckRequested) + if err := _EntitlementChecker.contract.UnpackLog(event, "EntitlementCheckRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EntitlementCheckerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the EntitlementChecker contract. +type EntitlementCheckerInitializedIterator struct { + Event *EntitlementCheckerInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EntitlementCheckerInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EntitlementCheckerInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EntitlementCheckerInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EntitlementCheckerInitialized represents a Initialized event raised by the EntitlementChecker contract. +type EntitlementCheckerInitialized struct { + Version uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_EntitlementChecker *EntitlementCheckerFilterer) FilterInitialized(opts *bind.FilterOpts) (*EntitlementCheckerInitializedIterator, error) { + + logs, sub, err := _EntitlementChecker.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &EntitlementCheckerInitializedIterator{contract: _EntitlementChecker.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_EntitlementChecker *EntitlementCheckerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *EntitlementCheckerInitialized) (event.Subscription, error) { + + logs, sub, err := _EntitlementChecker.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EntitlementCheckerInitialized) + if err := _EntitlementChecker.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_EntitlementChecker *EntitlementCheckerFilterer) ParseInitialized(log types.Log) (*EntitlementCheckerInitialized, error) { + event := new(EntitlementCheckerInitialized) + if err := _EntitlementChecker.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EntitlementCheckerInterfaceAddedIterator is returned from FilterInterfaceAdded and is used to iterate over the raw logs and unpacked data for InterfaceAdded events raised by the EntitlementChecker contract. +type EntitlementCheckerInterfaceAddedIterator struct { + Event *EntitlementCheckerInterfaceAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EntitlementCheckerInterfaceAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerInterfaceAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerInterfaceAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EntitlementCheckerInterfaceAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EntitlementCheckerInterfaceAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EntitlementCheckerInterfaceAdded represents a InterfaceAdded event raised by the EntitlementChecker contract. +type EntitlementCheckerInterfaceAdded struct { + InterfaceId [4]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInterfaceAdded is a free log retrieval operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_EntitlementChecker *EntitlementCheckerFilterer) FilterInterfaceAdded(opts *bind.FilterOpts, interfaceId [][4]byte) (*EntitlementCheckerInterfaceAddedIterator, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _EntitlementChecker.contract.FilterLogs(opts, "InterfaceAdded", interfaceIdRule) + if err != nil { + return nil, err + } + return &EntitlementCheckerInterfaceAddedIterator{contract: _EntitlementChecker.contract, event: "InterfaceAdded", logs: logs, sub: sub}, nil +} + +// WatchInterfaceAdded is a free log subscription operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_EntitlementChecker *EntitlementCheckerFilterer) WatchInterfaceAdded(opts *bind.WatchOpts, sink chan<- *EntitlementCheckerInterfaceAdded, interfaceId [][4]byte) (event.Subscription, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _EntitlementChecker.contract.WatchLogs(opts, "InterfaceAdded", interfaceIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EntitlementCheckerInterfaceAdded) + if err := _EntitlementChecker.contract.UnpackLog(event, "InterfaceAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInterfaceAdded is a log parse operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_EntitlementChecker *EntitlementCheckerFilterer) ParseInterfaceAdded(log types.Log) (*EntitlementCheckerInterfaceAdded, error) { + event := new(EntitlementCheckerInterfaceAdded) + if err := _EntitlementChecker.contract.UnpackLog(event, "InterfaceAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EntitlementCheckerInterfaceRemovedIterator is returned from FilterInterfaceRemoved and is used to iterate over the raw logs and unpacked data for InterfaceRemoved events raised by the EntitlementChecker contract. +type EntitlementCheckerInterfaceRemovedIterator struct { + Event *EntitlementCheckerInterfaceRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EntitlementCheckerInterfaceRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerInterfaceRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerInterfaceRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EntitlementCheckerInterfaceRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EntitlementCheckerInterfaceRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EntitlementCheckerInterfaceRemoved represents a InterfaceRemoved event raised by the EntitlementChecker contract. +type EntitlementCheckerInterfaceRemoved struct { + InterfaceId [4]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInterfaceRemoved is a free log retrieval operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_EntitlementChecker *EntitlementCheckerFilterer) FilterInterfaceRemoved(opts *bind.FilterOpts, interfaceId [][4]byte) (*EntitlementCheckerInterfaceRemovedIterator, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _EntitlementChecker.contract.FilterLogs(opts, "InterfaceRemoved", interfaceIdRule) + if err != nil { + return nil, err + } + return &EntitlementCheckerInterfaceRemovedIterator{contract: _EntitlementChecker.contract, event: "InterfaceRemoved", logs: logs, sub: sub}, nil +} + +// WatchInterfaceRemoved is a free log subscription operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_EntitlementChecker *EntitlementCheckerFilterer) WatchInterfaceRemoved(opts *bind.WatchOpts, sink chan<- *EntitlementCheckerInterfaceRemoved, interfaceId [][4]byte) (event.Subscription, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _EntitlementChecker.contract.WatchLogs(opts, "InterfaceRemoved", interfaceIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EntitlementCheckerInterfaceRemoved) + if err := _EntitlementChecker.contract.UnpackLog(event, "InterfaceRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInterfaceRemoved is a log parse operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_EntitlementChecker *EntitlementCheckerFilterer) ParseInterfaceRemoved(log types.Log) (*EntitlementCheckerInterfaceRemoved, error) { + event := new(EntitlementCheckerInterfaceRemoved) + if err := _EntitlementChecker.contract.UnpackLog(event, "InterfaceRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EntitlementCheckerNodeRegisteredIterator is returned from FilterNodeRegistered and is used to iterate over the raw logs and unpacked data for NodeRegistered events raised by the EntitlementChecker contract. +type EntitlementCheckerNodeRegisteredIterator struct { + Event *EntitlementCheckerNodeRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EntitlementCheckerNodeRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerNodeRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerNodeRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EntitlementCheckerNodeRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EntitlementCheckerNodeRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EntitlementCheckerNodeRegistered represents a NodeRegistered event raised by the EntitlementChecker contract. +type EntitlementCheckerNodeRegistered struct { + NodeAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeRegistered is a free log retrieval operation binding the contract event 0x564728e6a7c8edd446557d94e0339d5e6ca2e05f42188914efdbdc87bcbbabf6. +// +// Solidity: event NodeRegistered(address indexed nodeAddress) +func (_EntitlementChecker *EntitlementCheckerFilterer) FilterNodeRegistered(opts *bind.FilterOpts, nodeAddress []common.Address) (*EntitlementCheckerNodeRegisteredIterator, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _EntitlementChecker.contract.FilterLogs(opts, "NodeRegistered", nodeAddressRule) + if err != nil { + return nil, err + } + return &EntitlementCheckerNodeRegisteredIterator{contract: _EntitlementChecker.contract, event: "NodeRegistered", logs: logs, sub: sub}, nil +} + +// WatchNodeRegistered is a free log subscription operation binding the contract event 0x564728e6a7c8edd446557d94e0339d5e6ca2e05f42188914efdbdc87bcbbabf6. +// +// Solidity: event NodeRegistered(address indexed nodeAddress) +func (_EntitlementChecker *EntitlementCheckerFilterer) WatchNodeRegistered(opts *bind.WatchOpts, sink chan<- *EntitlementCheckerNodeRegistered, nodeAddress []common.Address) (event.Subscription, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _EntitlementChecker.contract.WatchLogs(opts, "NodeRegistered", nodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EntitlementCheckerNodeRegistered) + if err := _EntitlementChecker.contract.UnpackLog(event, "NodeRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeRegistered is a log parse operation binding the contract event 0x564728e6a7c8edd446557d94e0339d5e6ca2e05f42188914efdbdc87bcbbabf6. +// +// Solidity: event NodeRegistered(address indexed nodeAddress) +func (_EntitlementChecker *EntitlementCheckerFilterer) ParseNodeRegistered(log types.Log) (*EntitlementCheckerNodeRegistered, error) { + event := new(EntitlementCheckerNodeRegistered) + if err := _EntitlementChecker.contract.UnpackLog(event, "NodeRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EntitlementCheckerNodeUnregisteredIterator is returned from FilterNodeUnregistered and is used to iterate over the raw logs and unpacked data for NodeUnregistered events raised by the EntitlementChecker contract. +type EntitlementCheckerNodeUnregisteredIterator struct { + Event *EntitlementCheckerNodeUnregistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EntitlementCheckerNodeUnregisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerNodeUnregistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EntitlementCheckerNodeUnregistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EntitlementCheckerNodeUnregisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EntitlementCheckerNodeUnregisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EntitlementCheckerNodeUnregistered represents a NodeUnregistered event raised by the EntitlementChecker contract. +type EntitlementCheckerNodeUnregistered struct { + NodeAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeUnregistered is a free log retrieval operation binding the contract event 0xb1864577e4f285436a80ebc833984755393e2450d58622a65fb4fce87ea3573a. +// +// Solidity: event NodeUnregistered(address indexed nodeAddress) +func (_EntitlementChecker *EntitlementCheckerFilterer) FilterNodeUnregistered(opts *bind.FilterOpts, nodeAddress []common.Address) (*EntitlementCheckerNodeUnregisteredIterator, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _EntitlementChecker.contract.FilterLogs(opts, "NodeUnregistered", nodeAddressRule) + if err != nil { + return nil, err + } + return &EntitlementCheckerNodeUnregisteredIterator{contract: _EntitlementChecker.contract, event: "NodeUnregistered", logs: logs, sub: sub}, nil +} + +// WatchNodeUnregistered is a free log subscription operation binding the contract event 0xb1864577e4f285436a80ebc833984755393e2450d58622a65fb4fce87ea3573a. +// +// Solidity: event NodeUnregistered(address indexed nodeAddress) +func (_EntitlementChecker *EntitlementCheckerFilterer) WatchNodeUnregistered(opts *bind.WatchOpts, sink chan<- *EntitlementCheckerNodeUnregistered, nodeAddress []common.Address) (event.Subscription, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _EntitlementChecker.contract.WatchLogs(opts, "NodeUnregistered", nodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EntitlementCheckerNodeUnregistered) + if err := _EntitlementChecker.contract.UnpackLog(event, "NodeUnregistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeUnregistered is a log parse operation binding the contract event 0xb1864577e4f285436a80ebc833984755393e2450d58622a65fb4fce87ea3573a. +// +// Solidity: event NodeUnregistered(address indexed nodeAddress) +func (_EntitlementChecker *EntitlementCheckerFilterer) ParseNodeUnregistered(log types.Log) (*EntitlementCheckerNodeUnregistered, error) { + event := new(EntitlementCheckerNodeUnregistered) + if err := _EntitlementChecker.contract.UnpackLog(event, "NodeUnregistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/xchain/contracts/v3/i_custom_entitlement.go b/core/xchain/contracts/v3/i_custom_entitlement.go new file mode 100644 index 000000000..99b0881fc --- /dev/null +++ b/core/xchain/contracts/v3/i_custom_entitlement.go @@ -0,0 +1,212 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package v3 + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ICustomEntitlementMetaData contains all meta data concerning the ICustomEntitlement contract. +var ICustomEntitlementMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"isEntitled\",\"inputs\":[{\"name\":\"user\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"}]", +} + +// ICustomEntitlementABI is the input ABI used to generate the binding from. +// Deprecated: Use ICustomEntitlementMetaData.ABI instead. +var ICustomEntitlementABI = ICustomEntitlementMetaData.ABI + +// ICustomEntitlement is an auto generated Go binding around an Ethereum contract. +type ICustomEntitlement struct { + ICustomEntitlementCaller // Read-only binding to the contract + ICustomEntitlementTransactor // Write-only binding to the contract + ICustomEntitlementFilterer // Log filterer for contract events +} + +// ICustomEntitlementCaller is an auto generated read-only Go binding around an Ethereum contract. +type ICustomEntitlementCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ICustomEntitlementTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ICustomEntitlementTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ICustomEntitlementFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ICustomEntitlementFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ICustomEntitlementSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ICustomEntitlementSession struct { + Contract *ICustomEntitlement // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ICustomEntitlementCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ICustomEntitlementCallerSession struct { + Contract *ICustomEntitlementCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ICustomEntitlementTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ICustomEntitlementTransactorSession struct { + Contract *ICustomEntitlementTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ICustomEntitlementRaw is an auto generated low-level Go binding around an Ethereum contract. +type ICustomEntitlementRaw struct { + Contract *ICustomEntitlement // Generic contract binding to access the raw methods on +} + +// ICustomEntitlementCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ICustomEntitlementCallerRaw struct { + Contract *ICustomEntitlementCaller // Generic read-only contract binding to access the raw methods on +} + +// ICustomEntitlementTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ICustomEntitlementTransactorRaw struct { + Contract *ICustomEntitlementTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewICustomEntitlement creates a new instance of ICustomEntitlement, bound to a specific deployed contract. +func NewICustomEntitlement(address common.Address, backend bind.ContractBackend) (*ICustomEntitlement, error) { + contract, err := bindICustomEntitlement(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ICustomEntitlement{ICustomEntitlementCaller: ICustomEntitlementCaller{contract: contract}, ICustomEntitlementTransactor: ICustomEntitlementTransactor{contract: contract}, ICustomEntitlementFilterer: ICustomEntitlementFilterer{contract: contract}}, nil +} + +// NewICustomEntitlementCaller creates a new read-only instance of ICustomEntitlement, bound to a specific deployed contract. +func NewICustomEntitlementCaller(address common.Address, caller bind.ContractCaller) (*ICustomEntitlementCaller, error) { + contract, err := bindICustomEntitlement(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ICustomEntitlementCaller{contract: contract}, nil +} + +// NewICustomEntitlementTransactor creates a new write-only instance of ICustomEntitlement, bound to a specific deployed contract. +func NewICustomEntitlementTransactor(address common.Address, transactor bind.ContractTransactor) (*ICustomEntitlementTransactor, error) { + contract, err := bindICustomEntitlement(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ICustomEntitlementTransactor{contract: contract}, nil +} + +// NewICustomEntitlementFilterer creates a new log filterer instance of ICustomEntitlement, bound to a specific deployed contract. +func NewICustomEntitlementFilterer(address common.Address, filterer bind.ContractFilterer) (*ICustomEntitlementFilterer, error) { + contract, err := bindICustomEntitlement(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ICustomEntitlementFilterer{contract: contract}, nil +} + +// bindICustomEntitlement binds a generic wrapper to an already deployed contract. +func bindICustomEntitlement(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ICustomEntitlementMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ICustomEntitlement *ICustomEntitlementRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ICustomEntitlement.Contract.ICustomEntitlementCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ICustomEntitlement *ICustomEntitlementRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ICustomEntitlement.Contract.ICustomEntitlementTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ICustomEntitlement *ICustomEntitlementRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ICustomEntitlement.Contract.ICustomEntitlementTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ICustomEntitlement *ICustomEntitlementCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ICustomEntitlement.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ICustomEntitlement *ICustomEntitlementTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ICustomEntitlement.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ICustomEntitlement *ICustomEntitlementTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ICustomEntitlement.Contract.contract.Transact(opts, method, params...) +} + +// IsEntitled is a free data retrieval call binding the contract method 0xddc6e68e. +// +// Solidity: function isEntitled(address[] user) view returns(bool) +func (_ICustomEntitlement *ICustomEntitlementCaller) IsEntitled(opts *bind.CallOpts, user []common.Address) (bool, error) { + var out []interface{} + err := _ICustomEntitlement.contract.Call(opts, &out, "isEntitled", user) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsEntitled is a free data retrieval call binding the contract method 0xddc6e68e. +// +// Solidity: function isEntitled(address[] user) view returns(bool) +func (_ICustomEntitlement *ICustomEntitlementSession) IsEntitled(user []common.Address) (bool, error) { + return _ICustomEntitlement.Contract.IsEntitled(&_ICustomEntitlement.CallOpts, user) +} + +// IsEntitled is a free data retrieval call binding the contract method 0xddc6e68e. +// +// Solidity: function isEntitled(address[] user) view returns(bool) +func (_ICustomEntitlement *ICustomEntitlementCallerSession) IsEntitled(user []common.Address) (bool, error) { + return _ICustomEntitlement.Contract.IsEntitled(&_ICustomEntitlement.CallOpts, user) +} diff --git a/core/xchain/contracts/v3/i_entitlement.go b/core/xchain/contracts/v3/i_entitlement.go new file mode 100644 index 000000000..08c54fac7 --- /dev/null +++ b/core/xchain/contracts/v3/i_entitlement.go @@ -0,0 +1,430 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package v3 + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// IEntitlementMetaData contains all meta data concerning the IEntitlement contract. +var IEntitlementMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"description\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEntitlementDataByRoleId\",\"inputs\":[{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"space\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isCrosschain\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isEntitled\",\"inputs\":[{\"name\":\"channelId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"user\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"permission\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"moduleType\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeEntitlement\",\"inputs\":[{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setEntitlement\",\"inputs\":[{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"entitlementData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"error\",\"name\":\"Entitlement__InvalidValue\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Entitlement__NotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Entitlement__NotMember\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Entitlement__ValueAlreadyExists\",\"inputs\":[]}]", +} + +// IEntitlementABI is the input ABI used to generate the binding from. +// Deprecated: Use IEntitlementMetaData.ABI instead. +var IEntitlementABI = IEntitlementMetaData.ABI + +// IEntitlement is an auto generated Go binding around an Ethereum contract. +type IEntitlement struct { + IEntitlementCaller // Read-only binding to the contract + IEntitlementTransactor // Write-only binding to the contract + IEntitlementFilterer // Log filterer for contract events +} + +// IEntitlementCaller is an auto generated read-only Go binding around an Ethereum contract. +type IEntitlementCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IEntitlementTransactor is an auto generated write-only Go binding around an Ethereum contract. +type IEntitlementTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IEntitlementFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type IEntitlementFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IEntitlementSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type IEntitlementSession struct { + Contract *IEntitlement // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IEntitlementCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type IEntitlementCallerSession struct { + Contract *IEntitlementCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// IEntitlementTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type IEntitlementTransactorSession struct { + Contract *IEntitlementTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IEntitlementRaw is an auto generated low-level Go binding around an Ethereum contract. +type IEntitlementRaw struct { + Contract *IEntitlement // Generic contract binding to access the raw methods on +} + +// IEntitlementCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type IEntitlementCallerRaw struct { + Contract *IEntitlementCaller // Generic read-only contract binding to access the raw methods on +} + +// IEntitlementTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type IEntitlementTransactorRaw struct { + Contract *IEntitlementTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewIEntitlement creates a new instance of IEntitlement, bound to a specific deployed contract. +func NewIEntitlement(address common.Address, backend bind.ContractBackend) (*IEntitlement, error) { + contract, err := bindIEntitlement(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &IEntitlement{IEntitlementCaller: IEntitlementCaller{contract: contract}, IEntitlementTransactor: IEntitlementTransactor{contract: contract}, IEntitlementFilterer: IEntitlementFilterer{contract: contract}}, nil +} + +// NewIEntitlementCaller creates a new read-only instance of IEntitlement, bound to a specific deployed contract. +func NewIEntitlementCaller(address common.Address, caller bind.ContractCaller) (*IEntitlementCaller, error) { + contract, err := bindIEntitlement(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &IEntitlementCaller{contract: contract}, nil +} + +// NewIEntitlementTransactor creates a new write-only instance of IEntitlement, bound to a specific deployed contract. +func NewIEntitlementTransactor(address common.Address, transactor bind.ContractTransactor) (*IEntitlementTransactor, error) { + contract, err := bindIEntitlement(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &IEntitlementTransactor{contract: contract}, nil +} + +// NewIEntitlementFilterer creates a new log filterer instance of IEntitlement, bound to a specific deployed contract. +func NewIEntitlementFilterer(address common.Address, filterer bind.ContractFilterer) (*IEntitlementFilterer, error) { + contract, err := bindIEntitlement(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &IEntitlementFilterer{contract: contract}, nil +} + +// bindIEntitlement binds a generic wrapper to an already deployed contract. +func bindIEntitlement(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := IEntitlementMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IEntitlement *IEntitlementRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IEntitlement.Contract.IEntitlementCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IEntitlement *IEntitlementRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IEntitlement.Contract.IEntitlementTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IEntitlement *IEntitlementRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IEntitlement.Contract.IEntitlementTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IEntitlement *IEntitlementCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IEntitlement.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IEntitlement *IEntitlementTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IEntitlement.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IEntitlement *IEntitlementTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IEntitlement.Contract.contract.Transact(opts, method, params...) +} + +// Description is a free data retrieval call binding the contract method 0x7284e416. +// +// Solidity: function description() view returns(string) +func (_IEntitlement *IEntitlementCaller) Description(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _IEntitlement.contract.Call(opts, &out, "description") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Description is a free data retrieval call binding the contract method 0x7284e416. +// +// Solidity: function description() view returns(string) +func (_IEntitlement *IEntitlementSession) Description() (string, error) { + return _IEntitlement.Contract.Description(&_IEntitlement.CallOpts) +} + +// Description is a free data retrieval call binding the contract method 0x7284e416. +// +// Solidity: function description() view returns(string) +func (_IEntitlement *IEntitlementCallerSession) Description() (string, error) { + return _IEntitlement.Contract.Description(&_IEntitlement.CallOpts) +} + +// GetEntitlementDataByRoleId is a free data retrieval call binding the contract method 0x1eee07b2. +// +// Solidity: function getEntitlementDataByRoleId(uint256 roleId) view returns(bytes) +func (_IEntitlement *IEntitlementCaller) GetEntitlementDataByRoleId(opts *bind.CallOpts, roleId *big.Int) ([]byte, error) { + var out []interface{} + err := _IEntitlement.contract.Call(opts, &out, "getEntitlementDataByRoleId", roleId) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetEntitlementDataByRoleId is a free data retrieval call binding the contract method 0x1eee07b2. +// +// Solidity: function getEntitlementDataByRoleId(uint256 roleId) view returns(bytes) +func (_IEntitlement *IEntitlementSession) GetEntitlementDataByRoleId(roleId *big.Int) ([]byte, error) { + return _IEntitlement.Contract.GetEntitlementDataByRoleId(&_IEntitlement.CallOpts, roleId) +} + +// GetEntitlementDataByRoleId is a free data retrieval call binding the contract method 0x1eee07b2. +// +// Solidity: function getEntitlementDataByRoleId(uint256 roleId) view returns(bytes) +func (_IEntitlement *IEntitlementCallerSession) GetEntitlementDataByRoleId(roleId *big.Int) ([]byte, error) { + return _IEntitlement.Contract.GetEntitlementDataByRoleId(&_IEntitlement.CallOpts, roleId) +} + +// IsCrosschain is a free data retrieval call binding the contract method 0x2e1b61e4. +// +// Solidity: function isCrosschain() view returns(bool) +func (_IEntitlement *IEntitlementCaller) IsCrosschain(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _IEntitlement.contract.Call(opts, &out, "isCrosschain") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsCrosschain is a free data retrieval call binding the contract method 0x2e1b61e4. +// +// Solidity: function isCrosschain() view returns(bool) +func (_IEntitlement *IEntitlementSession) IsCrosschain() (bool, error) { + return _IEntitlement.Contract.IsCrosschain(&_IEntitlement.CallOpts) +} + +// IsCrosschain is a free data retrieval call binding the contract method 0x2e1b61e4. +// +// Solidity: function isCrosschain() view returns(bool) +func (_IEntitlement *IEntitlementCallerSession) IsCrosschain() (bool, error) { + return _IEntitlement.Contract.IsCrosschain(&_IEntitlement.CallOpts) +} + +// IsEntitled is a free data retrieval call binding the contract method 0x0cf0b533. +// +// Solidity: function isEntitled(bytes32 channelId, address[] user, bytes32 permission) view returns(bool) +func (_IEntitlement *IEntitlementCaller) IsEntitled(opts *bind.CallOpts, channelId [32]byte, user []common.Address, permission [32]byte) (bool, error) { + var out []interface{} + err := _IEntitlement.contract.Call(opts, &out, "isEntitled", channelId, user, permission) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsEntitled is a free data retrieval call binding the contract method 0x0cf0b533. +// +// Solidity: function isEntitled(bytes32 channelId, address[] user, bytes32 permission) view returns(bool) +func (_IEntitlement *IEntitlementSession) IsEntitled(channelId [32]byte, user []common.Address, permission [32]byte) (bool, error) { + return _IEntitlement.Contract.IsEntitled(&_IEntitlement.CallOpts, channelId, user, permission) +} + +// IsEntitled is a free data retrieval call binding the contract method 0x0cf0b533. +// +// Solidity: function isEntitled(bytes32 channelId, address[] user, bytes32 permission) view returns(bool) +func (_IEntitlement *IEntitlementCallerSession) IsEntitled(channelId [32]byte, user []common.Address, permission [32]byte) (bool, error) { + return _IEntitlement.Contract.IsEntitled(&_IEntitlement.CallOpts, channelId, user, permission) +} + +// ModuleType is a free data retrieval call binding the contract method 0x6465e69f. +// +// Solidity: function moduleType() view returns(string) +func (_IEntitlement *IEntitlementCaller) ModuleType(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _IEntitlement.contract.Call(opts, &out, "moduleType") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// ModuleType is a free data retrieval call binding the contract method 0x6465e69f. +// +// Solidity: function moduleType() view returns(string) +func (_IEntitlement *IEntitlementSession) ModuleType() (string, error) { + return _IEntitlement.Contract.ModuleType(&_IEntitlement.CallOpts) +} + +// ModuleType is a free data retrieval call binding the contract method 0x6465e69f. +// +// Solidity: function moduleType() view returns(string) +func (_IEntitlement *IEntitlementCallerSession) ModuleType() (string, error) { + return _IEntitlement.Contract.ModuleType(&_IEntitlement.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_IEntitlement *IEntitlementCaller) Name(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _IEntitlement.contract.Call(opts, &out, "name") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_IEntitlement *IEntitlementSession) Name() (string, error) { + return _IEntitlement.Contract.Name(&_IEntitlement.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_IEntitlement *IEntitlementCallerSession) Name() (string, error) { + return _IEntitlement.Contract.Name(&_IEntitlement.CallOpts) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address space) returns() +func (_IEntitlement *IEntitlementTransactor) Initialize(opts *bind.TransactOpts, space common.Address) (*types.Transaction, error) { + return _IEntitlement.contract.Transact(opts, "initialize", space) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address space) returns() +func (_IEntitlement *IEntitlementSession) Initialize(space common.Address) (*types.Transaction, error) { + return _IEntitlement.Contract.Initialize(&_IEntitlement.TransactOpts, space) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address space) returns() +func (_IEntitlement *IEntitlementTransactorSession) Initialize(space common.Address) (*types.Transaction, error) { + return _IEntitlement.Contract.Initialize(&_IEntitlement.TransactOpts, space) +} + +// RemoveEntitlement is a paid mutator transaction binding the contract method 0xf0c111f9. +// +// Solidity: function removeEntitlement(uint256 roleId) returns() +func (_IEntitlement *IEntitlementTransactor) RemoveEntitlement(opts *bind.TransactOpts, roleId *big.Int) (*types.Transaction, error) { + return _IEntitlement.contract.Transact(opts, "removeEntitlement", roleId) +} + +// RemoveEntitlement is a paid mutator transaction binding the contract method 0xf0c111f9. +// +// Solidity: function removeEntitlement(uint256 roleId) returns() +func (_IEntitlement *IEntitlementSession) RemoveEntitlement(roleId *big.Int) (*types.Transaction, error) { + return _IEntitlement.Contract.RemoveEntitlement(&_IEntitlement.TransactOpts, roleId) +} + +// RemoveEntitlement is a paid mutator transaction binding the contract method 0xf0c111f9. +// +// Solidity: function removeEntitlement(uint256 roleId) returns() +func (_IEntitlement *IEntitlementTransactorSession) RemoveEntitlement(roleId *big.Int) (*types.Transaction, error) { + return _IEntitlement.Contract.RemoveEntitlement(&_IEntitlement.TransactOpts, roleId) +} + +// SetEntitlement is a paid mutator transaction binding the contract method 0xef8be574. +// +// Solidity: function setEntitlement(uint256 roleId, bytes entitlementData) returns() +func (_IEntitlement *IEntitlementTransactor) SetEntitlement(opts *bind.TransactOpts, roleId *big.Int, entitlementData []byte) (*types.Transaction, error) { + return _IEntitlement.contract.Transact(opts, "setEntitlement", roleId, entitlementData) +} + +// SetEntitlement is a paid mutator transaction binding the contract method 0xef8be574. +// +// Solidity: function setEntitlement(uint256 roleId, bytes entitlementData) returns() +func (_IEntitlement *IEntitlementSession) SetEntitlement(roleId *big.Int, entitlementData []byte) (*types.Transaction, error) { + return _IEntitlement.Contract.SetEntitlement(&_IEntitlement.TransactOpts, roleId, entitlementData) +} + +// SetEntitlement is a paid mutator transaction binding the contract method 0xef8be574. +// +// Solidity: function setEntitlement(uint256 roleId, bytes entitlementData) returns() +func (_IEntitlement *IEntitlementTransactorSession) SetEntitlement(roleId *big.Int, entitlementData []byte) (*types.Transaction, error) { + return _IEntitlement.Contract.SetEntitlement(&_IEntitlement.TransactOpts, roleId, entitlementData) +} diff --git a/core/xchain/contracts/v3/i_entitlement_checker.go b/core/xchain/contracts/v3/i_entitlement_checker.go new file mode 100644 index 000000000..6b67145fa --- /dev/null +++ b/core/xchain/contracts/v3/i_entitlement_checker.go @@ -0,0 +1,794 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package v3 + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// IEntitlementCheckerMetaData contains all meta data concerning the IEntitlementChecker contract. +var IEntitlementCheckerMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"getNodeAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNodeCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRandomNodes\",\"inputs\":[{\"name\":\"count\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isValidNode\",\"inputs\":[{\"name\":\"node\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerNode\",\"inputs\":[{\"name\":\"node\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestEntitlementCheck\",\"inputs\":[{\"name\":\"callerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"transactionId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodes\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unregisterNode\",\"inputs\":[{\"name\":\"node\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"EntitlementCheckRequested\",\"inputs\":[{\"name\":\"callerAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contractAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"transactionId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"selectedNodes\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NodeRegistered\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NodeUnregistered\",\"inputs\":[{\"name\":\"nodeAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"EntitlementChecker_InsufficientNumberOfNodes\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementChecker_InvalidNodeOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementChecker_NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementChecker_NodeNotRegistered\",\"inputs\":[]}]", +} + +// IEntitlementCheckerABI is the input ABI used to generate the binding from. +// Deprecated: Use IEntitlementCheckerMetaData.ABI instead. +var IEntitlementCheckerABI = IEntitlementCheckerMetaData.ABI + +// IEntitlementChecker is an auto generated Go binding around an Ethereum contract. +type IEntitlementChecker struct { + IEntitlementCheckerCaller // Read-only binding to the contract + IEntitlementCheckerTransactor // Write-only binding to the contract + IEntitlementCheckerFilterer // Log filterer for contract events +} + +// IEntitlementCheckerCaller is an auto generated read-only Go binding around an Ethereum contract. +type IEntitlementCheckerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IEntitlementCheckerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type IEntitlementCheckerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IEntitlementCheckerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type IEntitlementCheckerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IEntitlementCheckerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type IEntitlementCheckerSession struct { + Contract *IEntitlementChecker // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IEntitlementCheckerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type IEntitlementCheckerCallerSession struct { + Contract *IEntitlementCheckerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// IEntitlementCheckerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type IEntitlementCheckerTransactorSession struct { + Contract *IEntitlementCheckerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IEntitlementCheckerRaw is an auto generated low-level Go binding around an Ethereum contract. +type IEntitlementCheckerRaw struct { + Contract *IEntitlementChecker // Generic contract binding to access the raw methods on +} + +// IEntitlementCheckerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type IEntitlementCheckerCallerRaw struct { + Contract *IEntitlementCheckerCaller // Generic read-only contract binding to access the raw methods on +} + +// IEntitlementCheckerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type IEntitlementCheckerTransactorRaw struct { + Contract *IEntitlementCheckerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewIEntitlementChecker creates a new instance of IEntitlementChecker, bound to a specific deployed contract. +func NewIEntitlementChecker(address common.Address, backend bind.ContractBackend) (*IEntitlementChecker, error) { + contract, err := bindIEntitlementChecker(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &IEntitlementChecker{IEntitlementCheckerCaller: IEntitlementCheckerCaller{contract: contract}, IEntitlementCheckerTransactor: IEntitlementCheckerTransactor{contract: contract}, IEntitlementCheckerFilterer: IEntitlementCheckerFilterer{contract: contract}}, nil +} + +// NewIEntitlementCheckerCaller creates a new read-only instance of IEntitlementChecker, bound to a specific deployed contract. +func NewIEntitlementCheckerCaller(address common.Address, caller bind.ContractCaller) (*IEntitlementCheckerCaller, error) { + contract, err := bindIEntitlementChecker(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &IEntitlementCheckerCaller{contract: contract}, nil +} + +// NewIEntitlementCheckerTransactor creates a new write-only instance of IEntitlementChecker, bound to a specific deployed contract. +func NewIEntitlementCheckerTransactor(address common.Address, transactor bind.ContractTransactor) (*IEntitlementCheckerTransactor, error) { + contract, err := bindIEntitlementChecker(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &IEntitlementCheckerTransactor{contract: contract}, nil +} + +// NewIEntitlementCheckerFilterer creates a new log filterer instance of IEntitlementChecker, bound to a specific deployed contract. +func NewIEntitlementCheckerFilterer(address common.Address, filterer bind.ContractFilterer) (*IEntitlementCheckerFilterer, error) { + contract, err := bindIEntitlementChecker(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &IEntitlementCheckerFilterer{contract: contract}, nil +} + +// bindIEntitlementChecker binds a generic wrapper to an already deployed contract. +func bindIEntitlementChecker(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := IEntitlementCheckerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IEntitlementChecker *IEntitlementCheckerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IEntitlementChecker.Contract.IEntitlementCheckerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IEntitlementChecker *IEntitlementCheckerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.IEntitlementCheckerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IEntitlementChecker *IEntitlementCheckerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.IEntitlementCheckerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IEntitlementChecker *IEntitlementCheckerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IEntitlementChecker.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IEntitlementChecker *IEntitlementCheckerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IEntitlementChecker *IEntitlementCheckerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.contract.Transact(opts, method, params...) +} + +// GetNodeAtIndex is a free data retrieval call binding the contract method 0x3c59f126. +// +// Solidity: function getNodeAtIndex(uint256 index) view returns(address) +func (_IEntitlementChecker *IEntitlementCheckerCaller) GetNodeAtIndex(opts *bind.CallOpts, index *big.Int) (common.Address, error) { + var out []interface{} + err := _IEntitlementChecker.contract.Call(opts, &out, "getNodeAtIndex", index) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetNodeAtIndex is a free data retrieval call binding the contract method 0x3c59f126. +// +// Solidity: function getNodeAtIndex(uint256 index) view returns(address) +func (_IEntitlementChecker *IEntitlementCheckerSession) GetNodeAtIndex(index *big.Int) (common.Address, error) { + return _IEntitlementChecker.Contract.GetNodeAtIndex(&_IEntitlementChecker.CallOpts, index) +} + +// GetNodeAtIndex is a free data retrieval call binding the contract method 0x3c59f126. +// +// Solidity: function getNodeAtIndex(uint256 index) view returns(address) +func (_IEntitlementChecker *IEntitlementCheckerCallerSession) GetNodeAtIndex(index *big.Int) (common.Address, error) { + return _IEntitlementChecker.Contract.GetNodeAtIndex(&_IEntitlementChecker.CallOpts, index) +} + +// GetNodeCount is a free data retrieval call binding the contract method 0x39bf397e. +// +// Solidity: function getNodeCount() view returns(uint256) +func (_IEntitlementChecker *IEntitlementCheckerCaller) GetNodeCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _IEntitlementChecker.contract.Call(opts, &out, "getNodeCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetNodeCount is a free data retrieval call binding the contract method 0x39bf397e. +// +// Solidity: function getNodeCount() view returns(uint256) +func (_IEntitlementChecker *IEntitlementCheckerSession) GetNodeCount() (*big.Int, error) { + return _IEntitlementChecker.Contract.GetNodeCount(&_IEntitlementChecker.CallOpts) +} + +// GetNodeCount is a free data retrieval call binding the contract method 0x39bf397e. +// +// Solidity: function getNodeCount() view returns(uint256) +func (_IEntitlementChecker *IEntitlementCheckerCallerSession) GetNodeCount() (*big.Int, error) { + return _IEntitlementChecker.Contract.GetNodeCount(&_IEntitlementChecker.CallOpts) +} + +// GetRandomNodes is a free data retrieval call binding the contract method 0x4f845445. +// +// Solidity: function getRandomNodes(uint256 count) view returns(address[]) +func (_IEntitlementChecker *IEntitlementCheckerCaller) GetRandomNodes(opts *bind.CallOpts, count *big.Int) ([]common.Address, error) { + var out []interface{} + err := _IEntitlementChecker.contract.Call(opts, &out, "getRandomNodes", count) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetRandomNodes is a free data retrieval call binding the contract method 0x4f845445. +// +// Solidity: function getRandomNodes(uint256 count) view returns(address[]) +func (_IEntitlementChecker *IEntitlementCheckerSession) GetRandomNodes(count *big.Int) ([]common.Address, error) { + return _IEntitlementChecker.Contract.GetRandomNodes(&_IEntitlementChecker.CallOpts, count) +} + +// GetRandomNodes is a free data retrieval call binding the contract method 0x4f845445. +// +// Solidity: function getRandomNodes(uint256 count) view returns(address[]) +func (_IEntitlementChecker *IEntitlementCheckerCallerSession) GetRandomNodes(count *big.Int) ([]common.Address, error) { + return _IEntitlementChecker.Contract.GetRandomNodes(&_IEntitlementChecker.CallOpts, count) +} + +// IsValidNode is a free data retrieval call binding the contract method 0x9ebd11ef. +// +// Solidity: function isValidNode(address node) view returns(bool) +func (_IEntitlementChecker *IEntitlementCheckerCaller) IsValidNode(opts *bind.CallOpts, node common.Address) (bool, error) { + var out []interface{} + err := _IEntitlementChecker.contract.Call(opts, &out, "isValidNode", node) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsValidNode is a free data retrieval call binding the contract method 0x9ebd11ef. +// +// Solidity: function isValidNode(address node) view returns(bool) +func (_IEntitlementChecker *IEntitlementCheckerSession) IsValidNode(node common.Address) (bool, error) { + return _IEntitlementChecker.Contract.IsValidNode(&_IEntitlementChecker.CallOpts, node) +} + +// IsValidNode is a free data retrieval call binding the contract method 0x9ebd11ef. +// +// Solidity: function isValidNode(address node) view returns(bool) +func (_IEntitlementChecker *IEntitlementCheckerCallerSession) IsValidNode(node common.Address) (bool, error) { + return _IEntitlementChecker.Contract.IsValidNode(&_IEntitlementChecker.CallOpts, node) +} + +// RegisterNode is a paid mutator transaction binding the contract method 0x672d7a0d. +// +// Solidity: function registerNode(address node) returns() +func (_IEntitlementChecker *IEntitlementCheckerTransactor) RegisterNode(opts *bind.TransactOpts, node common.Address) (*types.Transaction, error) { + return _IEntitlementChecker.contract.Transact(opts, "registerNode", node) +} + +// RegisterNode is a paid mutator transaction binding the contract method 0x672d7a0d. +// +// Solidity: function registerNode(address node) returns() +func (_IEntitlementChecker *IEntitlementCheckerSession) RegisterNode(node common.Address) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.RegisterNode(&_IEntitlementChecker.TransactOpts, node) +} + +// RegisterNode is a paid mutator transaction binding the contract method 0x672d7a0d. +// +// Solidity: function registerNode(address node) returns() +func (_IEntitlementChecker *IEntitlementCheckerTransactorSession) RegisterNode(node common.Address) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.RegisterNode(&_IEntitlementChecker.TransactOpts, node) +} + +// RequestEntitlementCheck is a paid mutator transaction binding the contract method 0x541da4e5. +// +// Solidity: function requestEntitlementCheck(address callerAddress, bytes32 transactionId, uint256 roleId, address[] nodes) returns() +func (_IEntitlementChecker *IEntitlementCheckerTransactor) RequestEntitlementCheck(opts *bind.TransactOpts, callerAddress common.Address, transactionId [32]byte, roleId *big.Int, nodes []common.Address) (*types.Transaction, error) { + return _IEntitlementChecker.contract.Transact(opts, "requestEntitlementCheck", callerAddress, transactionId, roleId, nodes) +} + +// RequestEntitlementCheck is a paid mutator transaction binding the contract method 0x541da4e5. +// +// Solidity: function requestEntitlementCheck(address callerAddress, bytes32 transactionId, uint256 roleId, address[] nodes) returns() +func (_IEntitlementChecker *IEntitlementCheckerSession) RequestEntitlementCheck(callerAddress common.Address, transactionId [32]byte, roleId *big.Int, nodes []common.Address) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.RequestEntitlementCheck(&_IEntitlementChecker.TransactOpts, callerAddress, transactionId, roleId, nodes) +} + +// RequestEntitlementCheck is a paid mutator transaction binding the contract method 0x541da4e5. +// +// Solidity: function requestEntitlementCheck(address callerAddress, bytes32 transactionId, uint256 roleId, address[] nodes) returns() +func (_IEntitlementChecker *IEntitlementCheckerTransactorSession) RequestEntitlementCheck(callerAddress common.Address, transactionId [32]byte, roleId *big.Int, nodes []common.Address) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.RequestEntitlementCheck(&_IEntitlementChecker.TransactOpts, callerAddress, transactionId, roleId, nodes) +} + +// UnregisterNode is a paid mutator transaction binding the contract method 0xc5e41cf6. +// +// Solidity: function unregisterNode(address node) returns() +func (_IEntitlementChecker *IEntitlementCheckerTransactor) UnregisterNode(opts *bind.TransactOpts, node common.Address) (*types.Transaction, error) { + return _IEntitlementChecker.contract.Transact(opts, "unregisterNode", node) +} + +// UnregisterNode is a paid mutator transaction binding the contract method 0xc5e41cf6. +// +// Solidity: function unregisterNode(address node) returns() +func (_IEntitlementChecker *IEntitlementCheckerSession) UnregisterNode(node common.Address) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.UnregisterNode(&_IEntitlementChecker.TransactOpts, node) +} + +// UnregisterNode is a paid mutator transaction binding the contract method 0xc5e41cf6. +// +// Solidity: function unregisterNode(address node) returns() +func (_IEntitlementChecker *IEntitlementCheckerTransactorSession) UnregisterNode(node common.Address) (*types.Transaction, error) { + return _IEntitlementChecker.Contract.UnregisterNode(&_IEntitlementChecker.TransactOpts, node) +} + +// IEntitlementCheckerEntitlementCheckRequestedIterator is returned from FilterEntitlementCheckRequested and is used to iterate over the raw logs and unpacked data for EntitlementCheckRequested events raised by the IEntitlementChecker contract. +type IEntitlementCheckerEntitlementCheckRequestedIterator struct { + Event *IEntitlementCheckerEntitlementCheckRequested // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IEntitlementCheckerEntitlementCheckRequestedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IEntitlementCheckerEntitlementCheckRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IEntitlementCheckerEntitlementCheckRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IEntitlementCheckerEntitlementCheckRequestedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IEntitlementCheckerEntitlementCheckRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IEntitlementCheckerEntitlementCheckRequested represents a EntitlementCheckRequested event raised by the IEntitlementChecker contract. +type IEntitlementCheckerEntitlementCheckRequested struct { + CallerAddress common.Address + ContractAddress common.Address + TransactionId [32]byte + RoleId *big.Int + SelectedNodes []common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEntitlementCheckRequested is a free log retrieval operation binding the contract event 0x4675e3cc15801ffde520a3076d6ad75c0c6dbe8f23bdbea1dd45b676caffe4f3. +// +// Solidity: event EntitlementCheckRequested(address callerAddress, address contractAddress, bytes32 transactionId, uint256 roleId, address[] selectedNodes) +func (_IEntitlementChecker *IEntitlementCheckerFilterer) FilterEntitlementCheckRequested(opts *bind.FilterOpts) (*IEntitlementCheckerEntitlementCheckRequestedIterator, error) { + + logs, sub, err := _IEntitlementChecker.contract.FilterLogs(opts, "EntitlementCheckRequested") + if err != nil { + return nil, err + } + return &IEntitlementCheckerEntitlementCheckRequestedIterator{contract: _IEntitlementChecker.contract, event: "EntitlementCheckRequested", logs: logs, sub: sub}, nil +} + +// WatchEntitlementCheckRequested is a free log subscription operation binding the contract event 0x4675e3cc15801ffde520a3076d6ad75c0c6dbe8f23bdbea1dd45b676caffe4f3. +// +// Solidity: event EntitlementCheckRequested(address callerAddress, address contractAddress, bytes32 transactionId, uint256 roleId, address[] selectedNodes) +func (_IEntitlementChecker *IEntitlementCheckerFilterer) WatchEntitlementCheckRequested(opts *bind.WatchOpts, sink chan<- *IEntitlementCheckerEntitlementCheckRequested) (event.Subscription, error) { + + logs, sub, err := _IEntitlementChecker.contract.WatchLogs(opts, "EntitlementCheckRequested") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IEntitlementCheckerEntitlementCheckRequested) + if err := _IEntitlementChecker.contract.UnpackLog(event, "EntitlementCheckRequested", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEntitlementCheckRequested is a log parse operation binding the contract event 0x4675e3cc15801ffde520a3076d6ad75c0c6dbe8f23bdbea1dd45b676caffe4f3. +// +// Solidity: event EntitlementCheckRequested(address callerAddress, address contractAddress, bytes32 transactionId, uint256 roleId, address[] selectedNodes) +func (_IEntitlementChecker *IEntitlementCheckerFilterer) ParseEntitlementCheckRequested(log types.Log) (*IEntitlementCheckerEntitlementCheckRequested, error) { + event := new(IEntitlementCheckerEntitlementCheckRequested) + if err := _IEntitlementChecker.contract.UnpackLog(event, "EntitlementCheckRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IEntitlementCheckerNodeRegisteredIterator is returned from FilterNodeRegistered and is used to iterate over the raw logs and unpacked data for NodeRegistered events raised by the IEntitlementChecker contract. +type IEntitlementCheckerNodeRegisteredIterator struct { + Event *IEntitlementCheckerNodeRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IEntitlementCheckerNodeRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IEntitlementCheckerNodeRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IEntitlementCheckerNodeRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IEntitlementCheckerNodeRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IEntitlementCheckerNodeRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IEntitlementCheckerNodeRegistered represents a NodeRegistered event raised by the IEntitlementChecker contract. +type IEntitlementCheckerNodeRegistered struct { + NodeAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeRegistered is a free log retrieval operation binding the contract event 0x564728e6a7c8edd446557d94e0339d5e6ca2e05f42188914efdbdc87bcbbabf6. +// +// Solidity: event NodeRegistered(address indexed nodeAddress) +func (_IEntitlementChecker *IEntitlementCheckerFilterer) FilterNodeRegistered(opts *bind.FilterOpts, nodeAddress []common.Address) (*IEntitlementCheckerNodeRegisteredIterator, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _IEntitlementChecker.contract.FilterLogs(opts, "NodeRegistered", nodeAddressRule) + if err != nil { + return nil, err + } + return &IEntitlementCheckerNodeRegisteredIterator{contract: _IEntitlementChecker.contract, event: "NodeRegistered", logs: logs, sub: sub}, nil +} + +// WatchNodeRegistered is a free log subscription operation binding the contract event 0x564728e6a7c8edd446557d94e0339d5e6ca2e05f42188914efdbdc87bcbbabf6. +// +// Solidity: event NodeRegistered(address indexed nodeAddress) +func (_IEntitlementChecker *IEntitlementCheckerFilterer) WatchNodeRegistered(opts *bind.WatchOpts, sink chan<- *IEntitlementCheckerNodeRegistered, nodeAddress []common.Address) (event.Subscription, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _IEntitlementChecker.contract.WatchLogs(opts, "NodeRegistered", nodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IEntitlementCheckerNodeRegistered) + if err := _IEntitlementChecker.contract.UnpackLog(event, "NodeRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeRegistered is a log parse operation binding the contract event 0x564728e6a7c8edd446557d94e0339d5e6ca2e05f42188914efdbdc87bcbbabf6. +// +// Solidity: event NodeRegistered(address indexed nodeAddress) +func (_IEntitlementChecker *IEntitlementCheckerFilterer) ParseNodeRegistered(log types.Log) (*IEntitlementCheckerNodeRegistered, error) { + event := new(IEntitlementCheckerNodeRegistered) + if err := _IEntitlementChecker.contract.UnpackLog(event, "NodeRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IEntitlementCheckerNodeUnregisteredIterator is returned from FilterNodeUnregistered and is used to iterate over the raw logs and unpacked data for NodeUnregistered events raised by the IEntitlementChecker contract. +type IEntitlementCheckerNodeUnregisteredIterator struct { + Event *IEntitlementCheckerNodeUnregistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IEntitlementCheckerNodeUnregisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IEntitlementCheckerNodeUnregistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IEntitlementCheckerNodeUnregistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IEntitlementCheckerNodeUnregisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IEntitlementCheckerNodeUnregisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IEntitlementCheckerNodeUnregistered represents a NodeUnregistered event raised by the IEntitlementChecker contract. +type IEntitlementCheckerNodeUnregistered struct { + NodeAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNodeUnregistered is a free log retrieval operation binding the contract event 0xb1864577e4f285436a80ebc833984755393e2450d58622a65fb4fce87ea3573a. +// +// Solidity: event NodeUnregistered(address indexed nodeAddress) +func (_IEntitlementChecker *IEntitlementCheckerFilterer) FilterNodeUnregistered(opts *bind.FilterOpts, nodeAddress []common.Address) (*IEntitlementCheckerNodeUnregisteredIterator, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _IEntitlementChecker.contract.FilterLogs(opts, "NodeUnregistered", nodeAddressRule) + if err != nil { + return nil, err + } + return &IEntitlementCheckerNodeUnregisteredIterator{contract: _IEntitlementChecker.contract, event: "NodeUnregistered", logs: logs, sub: sub}, nil +} + +// WatchNodeUnregistered is a free log subscription operation binding the contract event 0xb1864577e4f285436a80ebc833984755393e2450d58622a65fb4fce87ea3573a. +// +// Solidity: event NodeUnregistered(address indexed nodeAddress) +func (_IEntitlementChecker *IEntitlementCheckerFilterer) WatchNodeUnregistered(opts *bind.WatchOpts, sink chan<- *IEntitlementCheckerNodeUnregistered, nodeAddress []common.Address) (event.Subscription, error) { + + var nodeAddressRule []interface{} + for _, nodeAddressItem := range nodeAddress { + nodeAddressRule = append(nodeAddressRule, nodeAddressItem) + } + + logs, sub, err := _IEntitlementChecker.contract.WatchLogs(opts, "NodeUnregistered", nodeAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IEntitlementCheckerNodeUnregistered) + if err := _IEntitlementChecker.contract.UnpackLog(event, "NodeUnregistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNodeUnregistered is a log parse operation binding the contract event 0xb1864577e4f285436a80ebc833984755393e2450d58622a65fb4fce87ea3573a. +// +// Solidity: event NodeUnregistered(address indexed nodeAddress) +func (_IEntitlementChecker *IEntitlementCheckerFilterer) ParseNodeUnregistered(log types.Log) (*IEntitlementCheckerNodeUnregistered, error) { + event := new(IEntitlementCheckerNodeUnregistered) + if err := _IEntitlementChecker.contract.UnpackLog(event, "NodeUnregistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/xchain/contracts/v3/i_entitlement_gated.go b/core/xchain/contracts/v3/i_entitlement_gated.go new file mode 100644 index 000000000..e806f61b2 --- /dev/null +++ b/core/xchain/contracts/v3/i_entitlement_gated.go @@ -0,0 +1,406 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package v3 + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// IRuleEntitlementCheckOperation is an auto generated low-level Go binding around an user-defined struct. +type IRuleEntitlementCheckOperation struct { + OpType uint8 + ChainId *big.Int + ContractAddress common.Address + Threshold *big.Int +} + +// IRuleEntitlementLogicalOperation is an auto generated low-level Go binding around an user-defined struct. +type IRuleEntitlementLogicalOperation struct { + LogOpType uint8 + LeftOperationIndex uint8 + RightOperationIndex uint8 +} + +// IRuleEntitlementOperation is an auto generated low-level Go binding around an user-defined struct. +type IRuleEntitlementOperation struct { + OpType uint8 + Index uint8 +} + +// IRuleEntitlementRuleData is an auto generated low-level Go binding around an user-defined struct. +type IRuleEntitlementRuleData struct { + Operations []IRuleEntitlementOperation + CheckOperations []IRuleEntitlementCheckOperation + LogicalOperations []IRuleEntitlementLogicalOperation +} + +// IEntitlementGatedMetaData contains all meta data concerning the IEntitlementGated contract. +var IEntitlementGatedMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"getRuleData\",\"inputs\":[{\"name\":\"transactionId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRuleEntitlement.RuleData\",\"components\":[{\"name\":\"operations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.Operation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CombinedOperationType\"},{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"checkOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.CheckOperation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CheckOperationType\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"logicalOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.LogicalOperation[]\",\"components\":[{\"name\":\"logOpType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.LogicalOperationType\"},{\"name\":\"leftOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rightOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"postEntitlementCheckResult\",\"inputs\":[{\"name\":\"transactionId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"result\",\"type\":\"uint8\",\"internalType\":\"enumIEntitlementGatedBase.NodeVoteStatus\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"EntitlementCheckResultPosted\",\"inputs\":[{\"name\":\"transactionId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"result\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIEntitlementGatedBase.NodeVoteStatus\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"EntitlementGated_InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_NodeAlreadyVoted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_NodeNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_TransactionCheckAlreadyCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_TransactionCheckAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_TransactionNotRegistered\",\"inputs\":[]}]", +} + +// IEntitlementGatedABI is the input ABI used to generate the binding from. +// Deprecated: Use IEntitlementGatedMetaData.ABI instead. +var IEntitlementGatedABI = IEntitlementGatedMetaData.ABI + +// IEntitlementGated is an auto generated Go binding around an Ethereum contract. +type IEntitlementGated struct { + IEntitlementGatedCaller // Read-only binding to the contract + IEntitlementGatedTransactor // Write-only binding to the contract + IEntitlementGatedFilterer // Log filterer for contract events +} + +// IEntitlementGatedCaller is an auto generated read-only Go binding around an Ethereum contract. +type IEntitlementGatedCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IEntitlementGatedTransactor is an auto generated write-only Go binding around an Ethereum contract. +type IEntitlementGatedTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IEntitlementGatedFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type IEntitlementGatedFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IEntitlementGatedSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type IEntitlementGatedSession struct { + Contract *IEntitlementGated // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IEntitlementGatedCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type IEntitlementGatedCallerSession struct { + Contract *IEntitlementGatedCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// IEntitlementGatedTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type IEntitlementGatedTransactorSession struct { + Contract *IEntitlementGatedTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IEntitlementGatedRaw is an auto generated low-level Go binding around an Ethereum contract. +type IEntitlementGatedRaw struct { + Contract *IEntitlementGated // Generic contract binding to access the raw methods on +} + +// IEntitlementGatedCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type IEntitlementGatedCallerRaw struct { + Contract *IEntitlementGatedCaller // Generic read-only contract binding to access the raw methods on +} + +// IEntitlementGatedTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type IEntitlementGatedTransactorRaw struct { + Contract *IEntitlementGatedTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewIEntitlementGated creates a new instance of IEntitlementGated, bound to a specific deployed contract. +func NewIEntitlementGated(address common.Address, backend bind.ContractBackend) (*IEntitlementGated, error) { + contract, err := bindIEntitlementGated(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &IEntitlementGated{IEntitlementGatedCaller: IEntitlementGatedCaller{contract: contract}, IEntitlementGatedTransactor: IEntitlementGatedTransactor{contract: contract}, IEntitlementGatedFilterer: IEntitlementGatedFilterer{contract: contract}}, nil +} + +// NewIEntitlementGatedCaller creates a new read-only instance of IEntitlementGated, bound to a specific deployed contract. +func NewIEntitlementGatedCaller(address common.Address, caller bind.ContractCaller) (*IEntitlementGatedCaller, error) { + contract, err := bindIEntitlementGated(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &IEntitlementGatedCaller{contract: contract}, nil +} + +// NewIEntitlementGatedTransactor creates a new write-only instance of IEntitlementGated, bound to a specific deployed contract. +func NewIEntitlementGatedTransactor(address common.Address, transactor bind.ContractTransactor) (*IEntitlementGatedTransactor, error) { + contract, err := bindIEntitlementGated(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &IEntitlementGatedTransactor{contract: contract}, nil +} + +// NewIEntitlementGatedFilterer creates a new log filterer instance of IEntitlementGated, bound to a specific deployed contract. +func NewIEntitlementGatedFilterer(address common.Address, filterer bind.ContractFilterer) (*IEntitlementGatedFilterer, error) { + contract, err := bindIEntitlementGated(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &IEntitlementGatedFilterer{contract: contract}, nil +} + +// bindIEntitlementGated binds a generic wrapper to an already deployed contract. +func bindIEntitlementGated(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := IEntitlementGatedMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IEntitlementGated *IEntitlementGatedRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IEntitlementGated.Contract.IEntitlementGatedCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IEntitlementGated *IEntitlementGatedRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IEntitlementGated.Contract.IEntitlementGatedTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IEntitlementGated *IEntitlementGatedRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IEntitlementGated.Contract.IEntitlementGatedTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IEntitlementGated *IEntitlementGatedCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IEntitlementGated.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IEntitlementGated *IEntitlementGatedTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IEntitlementGated.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IEntitlementGated *IEntitlementGatedTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IEntitlementGated.Contract.contract.Transact(opts, method, params...) +} + +// GetRuleData is a free data retrieval call binding the contract method 0x92c399ff. +// +// Solidity: function getRuleData(bytes32 transactionId, uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])) +func (_IEntitlementGated *IEntitlementGatedCaller) GetRuleData(opts *bind.CallOpts, transactionId [32]byte, roleId *big.Int) (IRuleEntitlementRuleData, error) { + var out []interface{} + err := _IEntitlementGated.contract.Call(opts, &out, "getRuleData", transactionId, roleId) + + if err != nil { + return *new(IRuleEntitlementRuleData), err + } + + out0 := *abi.ConvertType(out[0], new(IRuleEntitlementRuleData)).(*IRuleEntitlementRuleData) + + return out0, err + +} + +// GetRuleData is a free data retrieval call binding the contract method 0x92c399ff. +// +// Solidity: function getRuleData(bytes32 transactionId, uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])) +func (_IEntitlementGated *IEntitlementGatedSession) GetRuleData(transactionId [32]byte, roleId *big.Int) (IRuleEntitlementRuleData, error) { + return _IEntitlementGated.Contract.GetRuleData(&_IEntitlementGated.CallOpts, transactionId, roleId) +} + +// GetRuleData is a free data retrieval call binding the contract method 0x92c399ff. +// +// Solidity: function getRuleData(bytes32 transactionId, uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])) +func (_IEntitlementGated *IEntitlementGatedCallerSession) GetRuleData(transactionId [32]byte, roleId *big.Int) (IRuleEntitlementRuleData, error) { + return _IEntitlementGated.Contract.GetRuleData(&_IEntitlementGated.CallOpts, transactionId, roleId) +} + +// PostEntitlementCheckResult is a paid mutator transaction binding the contract method 0x4739e805. +// +// Solidity: function postEntitlementCheckResult(bytes32 transactionId, uint256 roleId, uint8 result) returns() +func (_IEntitlementGated *IEntitlementGatedTransactor) PostEntitlementCheckResult(opts *bind.TransactOpts, transactionId [32]byte, roleId *big.Int, result uint8) (*types.Transaction, error) { + return _IEntitlementGated.contract.Transact(opts, "postEntitlementCheckResult", transactionId, roleId, result) +} + +// PostEntitlementCheckResult is a paid mutator transaction binding the contract method 0x4739e805. +// +// Solidity: function postEntitlementCheckResult(bytes32 transactionId, uint256 roleId, uint8 result) returns() +func (_IEntitlementGated *IEntitlementGatedSession) PostEntitlementCheckResult(transactionId [32]byte, roleId *big.Int, result uint8) (*types.Transaction, error) { + return _IEntitlementGated.Contract.PostEntitlementCheckResult(&_IEntitlementGated.TransactOpts, transactionId, roleId, result) +} + +// PostEntitlementCheckResult is a paid mutator transaction binding the contract method 0x4739e805. +// +// Solidity: function postEntitlementCheckResult(bytes32 transactionId, uint256 roleId, uint8 result) returns() +func (_IEntitlementGated *IEntitlementGatedTransactorSession) PostEntitlementCheckResult(transactionId [32]byte, roleId *big.Int, result uint8) (*types.Transaction, error) { + return _IEntitlementGated.Contract.PostEntitlementCheckResult(&_IEntitlementGated.TransactOpts, transactionId, roleId, result) +} + +// IEntitlementGatedEntitlementCheckResultPostedIterator is returned from FilterEntitlementCheckResultPosted and is used to iterate over the raw logs and unpacked data for EntitlementCheckResultPosted events raised by the IEntitlementGated contract. +type IEntitlementGatedEntitlementCheckResultPostedIterator struct { + Event *IEntitlementGatedEntitlementCheckResultPosted // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IEntitlementGatedEntitlementCheckResultPostedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IEntitlementGatedEntitlementCheckResultPosted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IEntitlementGatedEntitlementCheckResultPosted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IEntitlementGatedEntitlementCheckResultPostedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IEntitlementGatedEntitlementCheckResultPostedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IEntitlementGatedEntitlementCheckResultPosted represents a EntitlementCheckResultPosted event raised by the IEntitlementGated contract. +type IEntitlementGatedEntitlementCheckResultPosted struct { + TransactionId [32]byte + Result uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEntitlementCheckResultPosted is a free log retrieval operation binding the contract event 0xb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c633. +// +// Solidity: event EntitlementCheckResultPosted(bytes32 indexed transactionId, uint8 result) +func (_IEntitlementGated *IEntitlementGatedFilterer) FilterEntitlementCheckResultPosted(opts *bind.FilterOpts, transactionId [][32]byte) (*IEntitlementGatedEntitlementCheckResultPostedIterator, error) { + + var transactionIdRule []interface{} + for _, transactionIdItem := range transactionId { + transactionIdRule = append(transactionIdRule, transactionIdItem) + } + + logs, sub, err := _IEntitlementGated.contract.FilterLogs(opts, "EntitlementCheckResultPosted", transactionIdRule) + if err != nil { + return nil, err + } + return &IEntitlementGatedEntitlementCheckResultPostedIterator{contract: _IEntitlementGated.contract, event: "EntitlementCheckResultPosted", logs: logs, sub: sub}, nil +} + +// WatchEntitlementCheckResultPosted is a free log subscription operation binding the contract event 0xb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c633. +// +// Solidity: event EntitlementCheckResultPosted(bytes32 indexed transactionId, uint8 result) +func (_IEntitlementGated *IEntitlementGatedFilterer) WatchEntitlementCheckResultPosted(opts *bind.WatchOpts, sink chan<- *IEntitlementGatedEntitlementCheckResultPosted, transactionId [][32]byte) (event.Subscription, error) { + + var transactionIdRule []interface{} + for _, transactionIdItem := range transactionId { + transactionIdRule = append(transactionIdRule, transactionIdItem) + } + + logs, sub, err := _IEntitlementGated.contract.WatchLogs(opts, "EntitlementCheckResultPosted", transactionIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IEntitlementGatedEntitlementCheckResultPosted) + if err := _IEntitlementGated.contract.UnpackLog(event, "EntitlementCheckResultPosted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEntitlementCheckResultPosted is a log parse operation binding the contract event 0xb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c633. +// +// Solidity: event EntitlementCheckResultPosted(bytes32 indexed transactionId, uint8 result) +func (_IEntitlementGated *IEntitlementGatedFilterer) ParseEntitlementCheckResultPosted(log types.Log) (*IEntitlementGatedEntitlementCheckResultPosted, error) { + event := new(IEntitlementGatedEntitlementCheckResultPosted) + if err := _IEntitlementGated.contract.UnpackLog(event, "EntitlementCheckResultPosted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/xchain/contracts/v3/i_wallet_link.go b/core/xchain/contracts/v3/i_wallet_link.go new file mode 100644 index 000000000..5a916d36b --- /dev/null +++ b/core/xchain/contracts/v3/i_wallet_link.go @@ -0,0 +1,680 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package v3 + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// IWalletLinkBaseLinkedWallet is an auto generated low-level Go binding around an user-defined struct. +type IWalletLinkBaseLinkedWallet struct { + Addr common.Address + Signature []byte +} + +// IWalletLinkMetaData contains all meta data concerning the IWalletLink contract. +var IWalletLinkMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"checkIfLinked\",\"inputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestNonceForRootKey\",\"inputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootKeyForWallet\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWalletsByRootKey\",\"inputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"wallets\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"linkCallerToRootKey\",\"inputs\":[{\"name\":\"rootWallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"linkWalletToRootKey\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"rootWallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeLink\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootWallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"LinkWalletToRootKey\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemoveLink\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"secondWallet\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"WalletLink__CannotLinkToRootWallet\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WalletLink__CannotLinkToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__CannotRemoveRootWallet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__LinkAlreadyExists\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WalletLink__LinkedToAnotherRootKey\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WalletLink__NotLinked\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]}]", +} + +// IWalletLinkABI is the input ABI used to generate the binding from. +// Deprecated: Use IWalletLinkMetaData.ABI instead. +var IWalletLinkABI = IWalletLinkMetaData.ABI + +// IWalletLink is an auto generated Go binding around an Ethereum contract. +type IWalletLink struct { + IWalletLinkCaller // Read-only binding to the contract + IWalletLinkTransactor // Write-only binding to the contract + IWalletLinkFilterer // Log filterer for contract events +} + +// IWalletLinkCaller is an auto generated read-only Go binding around an Ethereum contract. +type IWalletLinkCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IWalletLinkTransactor is an auto generated write-only Go binding around an Ethereum contract. +type IWalletLinkTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IWalletLinkFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type IWalletLinkFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IWalletLinkSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type IWalletLinkSession struct { + Contract *IWalletLink // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IWalletLinkCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type IWalletLinkCallerSession struct { + Contract *IWalletLinkCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// IWalletLinkTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type IWalletLinkTransactorSession struct { + Contract *IWalletLinkTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IWalletLinkRaw is an auto generated low-level Go binding around an Ethereum contract. +type IWalletLinkRaw struct { + Contract *IWalletLink // Generic contract binding to access the raw methods on +} + +// IWalletLinkCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type IWalletLinkCallerRaw struct { + Contract *IWalletLinkCaller // Generic read-only contract binding to access the raw methods on +} + +// IWalletLinkTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type IWalletLinkTransactorRaw struct { + Contract *IWalletLinkTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewIWalletLink creates a new instance of IWalletLink, bound to a specific deployed contract. +func NewIWalletLink(address common.Address, backend bind.ContractBackend) (*IWalletLink, error) { + contract, err := bindIWalletLink(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &IWalletLink{IWalletLinkCaller: IWalletLinkCaller{contract: contract}, IWalletLinkTransactor: IWalletLinkTransactor{contract: contract}, IWalletLinkFilterer: IWalletLinkFilterer{contract: contract}}, nil +} + +// NewIWalletLinkCaller creates a new read-only instance of IWalletLink, bound to a specific deployed contract. +func NewIWalletLinkCaller(address common.Address, caller bind.ContractCaller) (*IWalletLinkCaller, error) { + contract, err := bindIWalletLink(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &IWalletLinkCaller{contract: contract}, nil +} + +// NewIWalletLinkTransactor creates a new write-only instance of IWalletLink, bound to a specific deployed contract. +func NewIWalletLinkTransactor(address common.Address, transactor bind.ContractTransactor) (*IWalletLinkTransactor, error) { + contract, err := bindIWalletLink(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &IWalletLinkTransactor{contract: contract}, nil +} + +// NewIWalletLinkFilterer creates a new log filterer instance of IWalletLink, bound to a specific deployed contract. +func NewIWalletLinkFilterer(address common.Address, filterer bind.ContractFilterer) (*IWalletLinkFilterer, error) { + contract, err := bindIWalletLink(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &IWalletLinkFilterer{contract: contract}, nil +} + +// bindIWalletLink binds a generic wrapper to an already deployed contract. +func bindIWalletLink(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := IWalletLinkMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IWalletLink *IWalletLinkRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IWalletLink.Contract.IWalletLinkCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IWalletLink *IWalletLinkRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IWalletLink.Contract.IWalletLinkTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IWalletLink *IWalletLinkRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IWalletLink.Contract.IWalletLinkTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IWalletLink *IWalletLinkCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IWalletLink.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IWalletLink *IWalletLinkTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IWalletLink.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IWalletLink *IWalletLinkTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IWalletLink.Contract.contract.Transact(opts, method, params...) +} + +// CheckIfLinked is a free data retrieval call binding the contract method 0x912b9758. +// +// Solidity: function checkIfLinked(address rootKey, address wallet) view returns(bool) +func (_IWalletLink *IWalletLinkCaller) CheckIfLinked(opts *bind.CallOpts, rootKey common.Address, wallet common.Address) (bool, error) { + var out []interface{} + err := _IWalletLink.contract.Call(opts, &out, "checkIfLinked", rootKey, wallet) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// CheckIfLinked is a free data retrieval call binding the contract method 0x912b9758. +// +// Solidity: function checkIfLinked(address rootKey, address wallet) view returns(bool) +func (_IWalletLink *IWalletLinkSession) CheckIfLinked(rootKey common.Address, wallet common.Address) (bool, error) { + return _IWalletLink.Contract.CheckIfLinked(&_IWalletLink.CallOpts, rootKey, wallet) +} + +// CheckIfLinked is a free data retrieval call binding the contract method 0x912b9758. +// +// Solidity: function checkIfLinked(address rootKey, address wallet) view returns(bool) +func (_IWalletLink *IWalletLinkCallerSession) CheckIfLinked(rootKey common.Address, wallet common.Address) (bool, error) { + return _IWalletLink.Contract.CheckIfLinked(&_IWalletLink.CallOpts, rootKey, wallet) +} + +// GetLatestNonceForRootKey is a free data retrieval call binding the contract method 0x20a00ac8. +// +// Solidity: function getLatestNonceForRootKey(address rootKey) view returns(uint256) +func (_IWalletLink *IWalletLinkCaller) GetLatestNonceForRootKey(opts *bind.CallOpts, rootKey common.Address) (*big.Int, error) { + var out []interface{} + err := _IWalletLink.contract.Call(opts, &out, "getLatestNonceForRootKey", rootKey) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetLatestNonceForRootKey is a free data retrieval call binding the contract method 0x20a00ac8. +// +// Solidity: function getLatestNonceForRootKey(address rootKey) view returns(uint256) +func (_IWalletLink *IWalletLinkSession) GetLatestNonceForRootKey(rootKey common.Address) (*big.Int, error) { + return _IWalletLink.Contract.GetLatestNonceForRootKey(&_IWalletLink.CallOpts, rootKey) +} + +// GetLatestNonceForRootKey is a free data retrieval call binding the contract method 0x20a00ac8. +// +// Solidity: function getLatestNonceForRootKey(address rootKey) view returns(uint256) +func (_IWalletLink *IWalletLinkCallerSession) GetLatestNonceForRootKey(rootKey common.Address) (*big.Int, error) { + return _IWalletLink.Contract.GetLatestNonceForRootKey(&_IWalletLink.CallOpts, rootKey) +} + +// GetRootKeyForWallet is a free data retrieval call binding the contract method 0xf8210398. +// +// Solidity: function getRootKeyForWallet(address wallet) view returns(address rootKey) +func (_IWalletLink *IWalletLinkCaller) GetRootKeyForWallet(opts *bind.CallOpts, wallet common.Address) (common.Address, error) { + var out []interface{} + err := _IWalletLink.contract.Call(opts, &out, "getRootKeyForWallet", wallet) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetRootKeyForWallet is a free data retrieval call binding the contract method 0xf8210398. +// +// Solidity: function getRootKeyForWallet(address wallet) view returns(address rootKey) +func (_IWalletLink *IWalletLinkSession) GetRootKeyForWallet(wallet common.Address) (common.Address, error) { + return _IWalletLink.Contract.GetRootKeyForWallet(&_IWalletLink.CallOpts, wallet) +} + +// GetRootKeyForWallet is a free data retrieval call binding the contract method 0xf8210398. +// +// Solidity: function getRootKeyForWallet(address wallet) view returns(address rootKey) +func (_IWalletLink *IWalletLinkCallerSession) GetRootKeyForWallet(wallet common.Address) (common.Address, error) { + return _IWalletLink.Contract.GetRootKeyForWallet(&_IWalletLink.CallOpts, wallet) +} + +// GetWalletsByRootKey is a free data retrieval call binding the contract method 0x02345b98. +// +// Solidity: function getWalletsByRootKey(address rootKey) view returns(address[] wallets) +func (_IWalletLink *IWalletLinkCaller) GetWalletsByRootKey(opts *bind.CallOpts, rootKey common.Address) ([]common.Address, error) { + var out []interface{} + err := _IWalletLink.contract.Call(opts, &out, "getWalletsByRootKey", rootKey) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetWalletsByRootKey is a free data retrieval call binding the contract method 0x02345b98. +// +// Solidity: function getWalletsByRootKey(address rootKey) view returns(address[] wallets) +func (_IWalletLink *IWalletLinkSession) GetWalletsByRootKey(rootKey common.Address) ([]common.Address, error) { + return _IWalletLink.Contract.GetWalletsByRootKey(&_IWalletLink.CallOpts, rootKey) +} + +// GetWalletsByRootKey is a free data retrieval call binding the contract method 0x02345b98. +// +// Solidity: function getWalletsByRootKey(address rootKey) view returns(address[] wallets) +func (_IWalletLink *IWalletLinkCallerSession) GetWalletsByRootKey(rootKey common.Address) ([]common.Address, error) { + return _IWalletLink.Contract.GetWalletsByRootKey(&_IWalletLink.CallOpts, rootKey) +} + +// LinkCallerToRootKey is a paid mutator transaction binding the contract method 0xe65dfe9d. +// +// Solidity: function linkCallerToRootKey((address,bytes) rootWallet, uint256 nonce) returns() +func (_IWalletLink *IWalletLinkTransactor) LinkCallerToRootKey(opts *bind.TransactOpts, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _IWalletLink.contract.Transact(opts, "linkCallerToRootKey", rootWallet, nonce) +} + +// LinkCallerToRootKey is a paid mutator transaction binding the contract method 0xe65dfe9d. +// +// Solidity: function linkCallerToRootKey((address,bytes) rootWallet, uint256 nonce) returns() +func (_IWalletLink *IWalletLinkSession) LinkCallerToRootKey(rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _IWalletLink.Contract.LinkCallerToRootKey(&_IWalletLink.TransactOpts, rootWallet, nonce) +} + +// LinkCallerToRootKey is a paid mutator transaction binding the contract method 0xe65dfe9d. +// +// Solidity: function linkCallerToRootKey((address,bytes) rootWallet, uint256 nonce) returns() +func (_IWalletLink *IWalletLinkTransactorSession) LinkCallerToRootKey(rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _IWalletLink.Contract.LinkCallerToRootKey(&_IWalletLink.TransactOpts, rootWallet, nonce) +} + +// LinkWalletToRootKey is a paid mutator transaction binding the contract method 0x1a31fc8d. +// +// Solidity: function linkWalletToRootKey((address,bytes) wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_IWalletLink *IWalletLinkTransactor) LinkWalletToRootKey(opts *bind.TransactOpts, wallet IWalletLinkBaseLinkedWallet, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _IWalletLink.contract.Transact(opts, "linkWalletToRootKey", wallet, rootWallet, nonce) +} + +// LinkWalletToRootKey is a paid mutator transaction binding the contract method 0x1a31fc8d. +// +// Solidity: function linkWalletToRootKey((address,bytes) wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_IWalletLink *IWalletLinkSession) LinkWalletToRootKey(wallet IWalletLinkBaseLinkedWallet, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _IWalletLink.Contract.LinkWalletToRootKey(&_IWalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// LinkWalletToRootKey is a paid mutator transaction binding the contract method 0x1a31fc8d. +// +// Solidity: function linkWalletToRootKey((address,bytes) wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_IWalletLink *IWalletLinkTransactorSession) LinkWalletToRootKey(wallet IWalletLinkBaseLinkedWallet, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _IWalletLink.Contract.LinkWalletToRootKey(&_IWalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// RemoveLink is a paid mutator transaction binding the contract method 0xd80bd3b9. +// +// Solidity: function removeLink(address wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_IWalletLink *IWalletLinkTransactor) RemoveLink(opts *bind.TransactOpts, wallet common.Address, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _IWalletLink.contract.Transact(opts, "removeLink", wallet, rootWallet, nonce) +} + +// RemoveLink is a paid mutator transaction binding the contract method 0xd80bd3b9. +// +// Solidity: function removeLink(address wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_IWalletLink *IWalletLinkSession) RemoveLink(wallet common.Address, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _IWalletLink.Contract.RemoveLink(&_IWalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// RemoveLink is a paid mutator transaction binding the contract method 0xd80bd3b9. +// +// Solidity: function removeLink(address wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_IWalletLink *IWalletLinkTransactorSession) RemoveLink(wallet common.Address, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _IWalletLink.Contract.RemoveLink(&_IWalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// IWalletLinkLinkWalletToRootKeyIterator is returned from FilterLinkWalletToRootKey and is used to iterate over the raw logs and unpacked data for LinkWalletToRootKey events raised by the IWalletLink contract. +type IWalletLinkLinkWalletToRootKeyIterator struct { + Event *IWalletLinkLinkWalletToRootKey // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IWalletLinkLinkWalletToRootKeyIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IWalletLinkLinkWalletToRootKey) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IWalletLinkLinkWalletToRootKey) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IWalletLinkLinkWalletToRootKeyIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IWalletLinkLinkWalletToRootKeyIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IWalletLinkLinkWalletToRootKey represents a LinkWalletToRootKey event raised by the IWalletLink contract. +type IWalletLinkLinkWalletToRootKey struct { + Wallet common.Address + RootKey common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterLinkWalletToRootKey is a free log retrieval operation binding the contract event 0x64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b5721. +// +// Solidity: event LinkWalletToRootKey(address indexed wallet, address indexed rootKey) +func (_IWalletLink *IWalletLinkFilterer) FilterLinkWalletToRootKey(opts *bind.FilterOpts, wallet []common.Address, rootKey []common.Address) (*IWalletLinkLinkWalletToRootKeyIterator, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var rootKeyRule []interface{} + for _, rootKeyItem := range rootKey { + rootKeyRule = append(rootKeyRule, rootKeyItem) + } + + logs, sub, err := _IWalletLink.contract.FilterLogs(opts, "LinkWalletToRootKey", walletRule, rootKeyRule) + if err != nil { + return nil, err + } + return &IWalletLinkLinkWalletToRootKeyIterator{contract: _IWalletLink.contract, event: "LinkWalletToRootKey", logs: logs, sub: sub}, nil +} + +// WatchLinkWalletToRootKey is a free log subscription operation binding the contract event 0x64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b5721. +// +// Solidity: event LinkWalletToRootKey(address indexed wallet, address indexed rootKey) +func (_IWalletLink *IWalletLinkFilterer) WatchLinkWalletToRootKey(opts *bind.WatchOpts, sink chan<- *IWalletLinkLinkWalletToRootKey, wallet []common.Address, rootKey []common.Address) (event.Subscription, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var rootKeyRule []interface{} + for _, rootKeyItem := range rootKey { + rootKeyRule = append(rootKeyRule, rootKeyItem) + } + + logs, sub, err := _IWalletLink.contract.WatchLogs(opts, "LinkWalletToRootKey", walletRule, rootKeyRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IWalletLinkLinkWalletToRootKey) + if err := _IWalletLink.contract.UnpackLog(event, "LinkWalletToRootKey", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseLinkWalletToRootKey is a log parse operation binding the contract event 0x64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b5721. +// +// Solidity: event LinkWalletToRootKey(address indexed wallet, address indexed rootKey) +func (_IWalletLink *IWalletLinkFilterer) ParseLinkWalletToRootKey(log types.Log) (*IWalletLinkLinkWalletToRootKey, error) { + event := new(IWalletLinkLinkWalletToRootKey) + if err := _IWalletLink.contract.UnpackLog(event, "LinkWalletToRootKey", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IWalletLinkRemoveLinkIterator is returned from FilterRemoveLink and is used to iterate over the raw logs and unpacked data for RemoveLink events raised by the IWalletLink contract. +type IWalletLinkRemoveLinkIterator struct { + Event *IWalletLinkRemoveLink // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IWalletLinkRemoveLinkIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IWalletLinkRemoveLink) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IWalletLinkRemoveLink) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IWalletLinkRemoveLinkIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IWalletLinkRemoveLinkIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IWalletLinkRemoveLink represents a RemoveLink event raised by the IWalletLink contract. +type IWalletLinkRemoveLink struct { + Wallet common.Address + SecondWallet common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRemoveLink is a free log retrieval operation binding the contract event 0x9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da2. +// +// Solidity: event RemoveLink(address indexed wallet, address indexed secondWallet) +func (_IWalletLink *IWalletLinkFilterer) FilterRemoveLink(opts *bind.FilterOpts, wallet []common.Address, secondWallet []common.Address) (*IWalletLinkRemoveLinkIterator, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var secondWalletRule []interface{} + for _, secondWalletItem := range secondWallet { + secondWalletRule = append(secondWalletRule, secondWalletItem) + } + + logs, sub, err := _IWalletLink.contract.FilterLogs(opts, "RemoveLink", walletRule, secondWalletRule) + if err != nil { + return nil, err + } + return &IWalletLinkRemoveLinkIterator{contract: _IWalletLink.contract, event: "RemoveLink", logs: logs, sub: sub}, nil +} + +// WatchRemoveLink is a free log subscription operation binding the contract event 0x9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da2. +// +// Solidity: event RemoveLink(address indexed wallet, address indexed secondWallet) +func (_IWalletLink *IWalletLinkFilterer) WatchRemoveLink(opts *bind.WatchOpts, sink chan<- *IWalletLinkRemoveLink, wallet []common.Address, secondWallet []common.Address) (event.Subscription, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var secondWalletRule []interface{} + for _, secondWalletItem := range secondWallet { + secondWalletRule = append(secondWalletRule, secondWalletItem) + } + + logs, sub, err := _IWalletLink.contract.WatchLogs(opts, "RemoveLink", walletRule, secondWalletRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IWalletLinkRemoveLink) + if err := _IWalletLink.contract.UnpackLog(event, "RemoveLink", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRemoveLink is a log parse operation binding the contract event 0x9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da2. +// +// Solidity: event RemoveLink(address indexed wallet, address indexed secondWallet) +func (_IWalletLink *IWalletLinkFilterer) ParseRemoveLink(log types.Log) (*IWalletLinkRemoveLink, error) { + event := new(IWalletLinkRemoveLink) + if err := _IWalletLink.contract.UnpackLog(event, "RemoveLink", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/xchain/contracts/v3/mock_custom_entitlement.go b/core/xchain/contracts/v3/mock_custom_entitlement.go new file mode 100644 index 000000000..0d07db1e2 --- /dev/null +++ b/core/xchain/contracts/v3/mock_custom_entitlement.go @@ -0,0 +1,255 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package v3 + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// MockCustomEntitlementMetaData contains all meta data concerning the MockCustomEntitlement contract. +var MockCustomEntitlementMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isEntitled\",\"inputs\":[{\"name\":\"user\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setEntitled\",\"inputs\":[{\"name\":\"user\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"userIsEntitled\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]", + Bin: "0x608060405234801561001057600080fd5b506102c1806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80633f4c4d831461003b578063ddc6e68e14610050575b600080fd5b61004e6100493660046101e0565b610077565b005b61006361005e366004610237565b6100c4565b604051901515815260200160405180910390f35b806000808460405160200161008c9190610274565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff19169115159190911790555050565b6000806000836040516020016100da9190610274565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1692915050565b634e487b7160e01b600052604160045260246000fd5b80356001600160a01b038116811461013657600080fd5b919050565b600082601f83011261014c57600080fd5b8135602067ffffffffffffffff8083111561016957610169610109565b8260051b604051601f19603f8301168101818110848211171561018e5761018e610109565b60405293845260208187018101949081019250878511156101ae57600080fd5b6020870191505b848210156101d5576101c68261011f565b835291830191908301906101b5565b979650505050505050565b600080604083850312156101f357600080fd5b823567ffffffffffffffff81111561020a57600080fd5b6102168582860161013b565b9250506020830135801515811461022c57600080fd5b809150509250929050565b60006020828403121561024957600080fd5b813567ffffffffffffffff81111561026057600080fd5b61026c8482850161013b565b949350505050565b6020808252825182820181905260009190848201906040850190845b818110156102b55783516001600160a01b031683529284019291840191600101610290565b5090969550505050505056", +} + +// MockCustomEntitlementABI is the input ABI used to generate the binding from. +// Deprecated: Use MockCustomEntitlementMetaData.ABI instead. +var MockCustomEntitlementABI = MockCustomEntitlementMetaData.ABI + +// MockCustomEntitlementBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use MockCustomEntitlementMetaData.Bin instead. +var MockCustomEntitlementBin = MockCustomEntitlementMetaData.Bin + +// DeployMockCustomEntitlement deploys a new Ethereum contract, binding an instance of MockCustomEntitlement to it. +func DeployMockCustomEntitlement(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *MockCustomEntitlement, error) { + parsed, err := MockCustomEntitlementMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(MockCustomEntitlementBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &MockCustomEntitlement{MockCustomEntitlementCaller: MockCustomEntitlementCaller{contract: contract}, MockCustomEntitlementTransactor: MockCustomEntitlementTransactor{contract: contract}, MockCustomEntitlementFilterer: MockCustomEntitlementFilterer{contract: contract}}, nil +} + +// MockCustomEntitlement is an auto generated Go binding around an Ethereum contract. +type MockCustomEntitlement struct { + MockCustomEntitlementCaller // Read-only binding to the contract + MockCustomEntitlementTransactor // Write-only binding to the contract + MockCustomEntitlementFilterer // Log filterer for contract events +} + +// MockCustomEntitlementCaller is an auto generated read-only Go binding around an Ethereum contract. +type MockCustomEntitlementCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockCustomEntitlementTransactor is an auto generated write-only Go binding around an Ethereum contract. +type MockCustomEntitlementTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockCustomEntitlementFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type MockCustomEntitlementFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockCustomEntitlementSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type MockCustomEntitlementSession struct { + Contract *MockCustomEntitlement // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MockCustomEntitlementCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type MockCustomEntitlementCallerSession struct { + Contract *MockCustomEntitlementCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// MockCustomEntitlementTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type MockCustomEntitlementTransactorSession struct { + Contract *MockCustomEntitlementTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MockCustomEntitlementRaw is an auto generated low-level Go binding around an Ethereum contract. +type MockCustomEntitlementRaw struct { + Contract *MockCustomEntitlement // Generic contract binding to access the raw methods on +} + +// MockCustomEntitlementCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type MockCustomEntitlementCallerRaw struct { + Contract *MockCustomEntitlementCaller // Generic read-only contract binding to access the raw methods on +} + +// MockCustomEntitlementTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type MockCustomEntitlementTransactorRaw struct { + Contract *MockCustomEntitlementTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewMockCustomEntitlement creates a new instance of MockCustomEntitlement, bound to a specific deployed contract. +func NewMockCustomEntitlement(address common.Address, backend bind.ContractBackend) (*MockCustomEntitlement, error) { + contract, err := bindMockCustomEntitlement(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &MockCustomEntitlement{MockCustomEntitlementCaller: MockCustomEntitlementCaller{contract: contract}, MockCustomEntitlementTransactor: MockCustomEntitlementTransactor{contract: contract}, MockCustomEntitlementFilterer: MockCustomEntitlementFilterer{contract: contract}}, nil +} + +// NewMockCustomEntitlementCaller creates a new read-only instance of MockCustomEntitlement, bound to a specific deployed contract. +func NewMockCustomEntitlementCaller(address common.Address, caller bind.ContractCaller) (*MockCustomEntitlementCaller, error) { + contract, err := bindMockCustomEntitlement(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &MockCustomEntitlementCaller{contract: contract}, nil +} + +// NewMockCustomEntitlementTransactor creates a new write-only instance of MockCustomEntitlement, bound to a specific deployed contract. +func NewMockCustomEntitlementTransactor(address common.Address, transactor bind.ContractTransactor) (*MockCustomEntitlementTransactor, error) { + contract, err := bindMockCustomEntitlement(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &MockCustomEntitlementTransactor{contract: contract}, nil +} + +// NewMockCustomEntitlementFilterer creates a new log filterer instance of MockCustomEntitlement, bound to a specific deployed contract. +func NewMockCustomEntitlementFilterer(address common.Address, filterer bind.ContractFilterer) (*MockCustomEntitlementFilterer, error) { + contract, err := bindMockCustomEntitlement(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &MockCustomEntitlementFilterer{contract: contract}, nil +} + +// bindMockCustomEntitlement binds a generic wrapper to an already deployed contract. +func bindMockCustomEntitlement(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := MockCustomEntitlementMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_MockCustomEntitlement *MockCustomEntitlementRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MockCustomEntitlement.Contract.MockCustomEntitlementCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_MockCustomEntitlement *MockCustomEntitlementRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MockCustomEntitlement.Contract.MockCustomEntitlementTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_MockCustomEntitlement *MockCustomEntitlementRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MockCustomEntitlement.Contract.MockCustomEntitlementTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_MockCustomEntitlement *MockCustomEntitlementCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MockCustomEntitlement.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_MockCustomEntitlement *MockCustomEntitlementTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MockCustomEntitlement.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_MockCustomEntitlement *MockCustomEntitlementTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MockCustomEntitlement.Contract.contract.Transact(opts, method, params...) +} + +// IsEntitled is a free data retrieval call binding the contract method 0xddc6e68e. +// +// Solidity: function isEntitled(address[] user) view returns(bool) +func (_MockCustomEntitlement *MockCustomEntitlementCaller) IsEntitled(opts *bind.CallOpts, user []common.Address) (bool, error) { + var out []interface{} + err := _MockCustomEntitlement.contract.Call(opts, &out, "isEntitled", user) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsEntitled is a free data retrieval call binding the contract method 0xddc6e68e. +// +// Solidity: function isEntitled(address[] user) view returns(bool) +func (_MockCustomEntitlement *MockCustomEntitlementSession) IsEntitled(user []common.Address) (bool, error) { + return _MockCustomEntitlement.Contract.IsEntitled(&_MockCustomEntitlement.CallOpts, user) +} + +// IsEntitled is a free data retrieval call binding the contract method 0xddc6e68e. +// +// Solidity: function isEntitled(address[] user) view returns(bool) +func (_MockCustomEntitlement *MockCustomEntitlementCallerSession) IsEntitled(user []common.Address) (bool, error) { + return _MockCustomEntitlement.Contract.IsEntitled(&_MockCustomEntitlement.CallOpts, user) +} + +// SetEntitled is a paid mutator transaction binding the contract method 0x3f4c4d83. +// +// Solidity: function setEntitled(address[] user, bool userIsEntitled) returns() +func (_MockCustomEntitlement *MockCustomEntitlementTransactor) SetEntitled(opts *bind.TransactOpts, user []common.Address, userIsEntitled bool) (*types.Transaction, error) { + return _MockCustomEntitlement.contract.Transact(opts, "setEntitled", user, userIsEntitled) +} + +// SetEntitled is a paid mutator transaction binding the contract method 0x3f4c4d83. +// +// Solidity: function setEntitled(address[] user, bool userIsEntitled) returns() +func (_MockCustomEntitlement *MockCustomEntitlementSession) SetEntitled(user []common.Address, userIsEntitled bool) (*types.Transaction, error) { + return _MockCustomEntitlement.Contract.SetEntitled(&_MockCustomEntitlement.TransactOpts, user, userIsEntitled) +} + +// SetEntitled is a paid mutator transaction binding the contract method 0x3f4c4d83. +// +// Solidity: function setEntitled(address[] user, bool userIsEntitled) returns() +func (_MockCustomEntitlement *MockCustomEntitlementTransactorSession) SetEntitled(user []common.Address, userIsEntitled bool) (*types.Transaction, error) { + return _MockCustomEntitlement.Contract.SetEntitled(&_MockCustomEntitlement.TransactOpts, user, userIsEntitled) +} diff --git a/core/xchain/contracts/v3/mock_entitlement_gated.go b/core/xchain/contracts/v3/mock_entitlement_gated.go new file mode 100644 index 000000000..f1692ac0c --- /dev/null +++ b/core/xchain/contracts/v3/mock_entitlement_gated.go @@ -0,0 +1,895 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package v3 + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// MockEntitlementGatedMetaData contains all meta data concerning the MockEntitlementGated contract. +var MockEntitlementGatedMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"checker\",\"type\":\"address\",\"internalType\":\"contractIEntitlementChecker\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"__EntitlementGated_init\",\"inputs\":[{\"name\":\"entitlementChecker\",\"type\":\"address\",\"internalType\":\"contractIEntitlementChecker\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getRuleData\",\"inputs\":[{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRuleEntitlement.RuleData\",\"components\":[{\"name\":\"operations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.Operation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CombinedOperationType\"},{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"checkOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.CheckOperation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CheckOperationType\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"logicalOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.LogicalOperation[]\",\"components\":[{\"name\":\"logOpType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.LogicalOperationType\"},{\"name\":\"leftOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rightOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRuleData\",\"inputs\":[{\"name\":\"transactionId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRuleEntitlement.RuleData\",\"components\":[{\"name\":\"operations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.Operation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CombinedOperationType\"},{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"checkOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.CheckOperation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CheckOperationType\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"logicalOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.LogicalOperation[]\",\"components\":[{\"name\":\"logOpType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.LogicalOperationType\"},{\"name\":\"leftOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rightOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"postEntitlementCheckResult\",\"inputs\":[{\"name\":\"transactionId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"result\",\"type\":\"uint8\",\"internalType\":\"enumIEntitlementGatedBase.NodeVoteStatus\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestEntitlementCheck\",\"inputs\":[{\"name\":\"roleId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ruleData\",\"type\":\"tuple\",\"internalType\":\"structIRuleEntitlement.RuleData\",\"components\":[{\"name\":\"operations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.Operation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CombinedOperationType\"},{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"checkOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.CheckOperation[]\",\"components\":[{\"name\":\"opType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.CheckOperationType\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"contractAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"logicalOperations\",\"type\":\"tuple[]\",\"internalType\":\"structIRuleEntitlement.LogicalOperation[]\",\"components\":[{\"name\":\"logOpType\",\"type\":\"uint8\",\"internalType\":\"enumIRuleEntitlement.LogicalOperationType\"},{\"name\":\"leftOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rightOperationIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"EntitlementCheckResultPosted\",\"inputs\":[{\"name\":\"transactionId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"result\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIEntitlementGatedBase.NodeVoteStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InterfaceAdded\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"indexed\":true,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InterfaceRemoved\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"indexed\":true,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"EntitlementGated_InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_NodeAlreadyVoted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_NodeNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_TransactionCheckAlreadyCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_TransactionCheckAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EntitlementGated_TransactionNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Initializable_InInitializingState\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Initializable_NotInInitializingState\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Introspection_AlreadySupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Introspection_NotSupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuard__ReentrantCall\",\"inputs\":[]}]", + Bin: "0x60806040523480156200001157600080fd5b5060405162001b9a38038062001b9a833981016040819052620000349162000127565b6200003e6200007f565b7f9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e0080546001600160a01b0319166001600160a01b0383161790555062000159565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff1615620000cc576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156200012457805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6000602082840312156200013a57600080fd5b81516001600160a01b03811681146200015257600080fd5b9392505050565b611a3180620001696000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063069a3ee91461005c5780634739e8051461008557806357e700271461009a5780637adc9cbe146100bb57806392c399ff146100ce575b600080fd5b61006f61006a366004610e1e565b6100e1565b60405161007c9190610f28565b60405180910390f35b610098610093366004610fd8565b610314565b005b6100ad6100a8366004611011565b6103b8565b60405190815260200161007c565b6100986100c9366004611074565b610426565b61006f6100dc366004611091565b61047c565b61010560405180606001604052806060815260200160608152602001606081525090565b6000828152602081815260408083208151815460809481028201850190935260608101838152909491938593919285929185015b828210156101a257600084815260209020604080518082019091529083018054829060ff16600281111561016f5761016f610e37565b600281111561018057610180610e37565b81529054610100900460ff166020918201529082526001929092019101610139565b50505050815260200160018201805480602002602001604051908101604052809291908181526020016000905b8282101561025a576000848152602090206040805160808101909152600484029091018054829060ff16600581111561020a5761020a610e37565b600581111561021b5761021b610e37565b815260018281015460208084019190915260028401546001600160a01b03166040840152600390930154606090920191909152918352920191016101cf565b50505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156103065760008481526020902060408051606081019091529083018054829060ff1660028111156102be576102be610e37565b60028111156102cf576102cf610e37565b8152905460ff6101008204811660208085019190915262010000909204166040909201919091529082526001929092019101610287565b505050915250909392505050565b60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a00540361035657604051635db5c7cd60e11b815260040160405180910390fd5b61037f60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b61038a8383836104aa565b6103b360017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b505050565b600082815260208190526040812082906103d2828261140a565b50506040516bffffffffffffffffffffffff193260601b16602082015243603482015260009060540160405160208183030381529060405280519060200120905061041f81306000610743565b9392505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661047057604051630ef4733760e31b815260040160405180910390fd5b610479816109f2565b50565b6104a060405180606001604052806060815260200160608152602001606081525090565b61041f8383610a2d565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919061010090046001600160a01b031615806104f45750805460ff16155b1561051257604051637ad5a43960e11b815260040160405180910390fd5b600084815260028201602052604090205460ff161561054457604051637912b73960e01b815260040160405180910390fd5b600084815260018201602052604081205481908190815b8181101561068257600089815260018701602052604081208054839081106105855761058561150e565b60009182526020909120018054909150336001600160a01b03909116036106115760008154600160a01b900460ff1660028111156105c5576105c5610e37565b146105e3576040516347592a4d60e01b815260040160405180910390fd5b80548990829060ff60a01b1916600160a01b83600281111561060757610607610e37565b0217905550600195505b60018154600160a01b900460ff16600281111561063057610630610e37565b03610647578461063f81611524565b955050610679565b60028154600160a01b900460ff16600281111561066657610666610e37565b03610679578361067581611524565b9450505b5060010161055b565b50836106a157604051638223a7e960e01b815260040160405180910390fd5b6106ac60028261153d565b8311806106c257506106bf60028261153d565b82115b156107385760008881526002860160205260408120805460ff191660011790558284116106f05760026106f3565b60015b9050897fb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c63382604051610725919061155f565b60405180910390a26107368a610b27565b505b505050505050505050565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919060ff1615156001036107d55760005b60048201548110156107d357838260040182815481106107a2576107a261150e565b9060005260206000200154036107cb576040516301ab53df60e31b815260040160405180910390fd5b600101610780565b505b81546001600160a01b03166107ec576107ec610bfb565b8154604051634f84544560e01b8152600560048201526000916001600160a01b031690634f84544590602401600060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085d9190810190611636565b825490915060ff1661089e5781546003830180546001600160a01b0319166001600160a01b0388161790556001600160a81b03191661010033021760011782555b600482018054600181018255600091825260208220018590555b815181101561098e5782600101600086815260200190815260200160002060405180604001604052808484815181106108f3576108f361150e565b60200260200101516001600160a01b031681526020016000600281111561091c5761091c610e37565b9052815460018101835560009283526020928390208251910180546001600160a01b031981166001600160a01b03909316928317825593830151929390929183916001600160a81b03191617600160a01b83600281111561097f5761097f610e37565b021790555050506001016108b8565b50825460405163541da4e560e01b81526001600160a01b039091169063541da4e5906109c49033908a90899087906004016116ca565b600060405180830381600087803b1580156109de57600080fd5b505af1158015610736573d6000803e3d6000fd5b610a02636afd38fd60e11b610ccc565b6000805160206119f183398151915280546001600160a01b0319166001600160a01b03831617905550565b610a5160405180606001604052806060815260200160608152602001606081525090565b6000838152600080516020611a118339815191526020526040812080546000805160206119f18339815191529260ff90911615159003610aa457604051637ad5a43960e11b815260040160405180910390fd5b600381015460405163069a3ee960e01b8152600481018690526001600160a01b0390911690600090829063069a3ee990602401600060405180830381865afa158015610af4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b1c9190810190611893565b979650505050505050565b6000818152600080516020611a11833981519152602052604081206000805160206119f1833981519152915b6004820154811015610ba757816001016000836004018381548110610b7a57610b7a61150e565b906000526020600020015481526020019081526020016000206000610b9f9190610daa565b600101610b53565b50610bb6600482016000610dc8565b6000838152600183016020526040812080546001600160a81b03191681556003810180546001600160a01b031916905590610bf46004830182610dc8565b5050505050565b60006000805160206119f1833981519152905060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60060060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad91906119d3565b82546001600160a01b0319166001600160a01b03919091161790915550565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610d59576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610d72565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b50805460008255906000526020600020908101906104799190610de6565b50805460008255906000526020600020908101906104799190610e09565b5b80821115610e055780546001600160a81b0319168155600101610de7565b5090565b5b80821115610e055760008155600101610e0a565b600060208284031215610e3057600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b6003811061047957610479610e37565b60008151808452602080850194506020840160005b83811015610ec7578151805160068110610e8e57610e8e610e37565b885280840151848901526040808201516001600160a01b0316908901526060908101519088015260809096019590820190600101610e72565b509495945050505050565b60008151808452602080850194506020840160005b83811015610ec75781518051610efc81610e4d565b88528084015160ff908116858a0152604091820151169088015260609096019590820190600101610ee7565b6020808252825160608383015280516080840181905260009291820190839060a08601905b80831015610f845783518051610f6281610e4d565b835285015160ff16858301529284019260019290920191604090910190610f4d565b50838701519350601f19925082868203016040870152610fa48185610e5d565b93505050604085015181858403016060860152610fc18382610ed2565b9695505050505050565b6003811061047957600080fd5b600080600060608486031215610fed57600080fd5b8335925060208401359150604084013561100681610fcb565b809150509250925092565b6000806040838503121561102457600080fd5b82359150602083013567ffffffffffffffff81111561104257600080fd5b83016060818603121561105457600080fd5b809150509250929050565b6001600160a01b038116811461047957600080fd5b60006020828403121561108657600080fd5b813561041f8161105f565b600080604083850312156110a457600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60ff8116811461047957600080fd5b81356110f981610fcb565b61110281610e4d565b60ff1982541660ff82168117835550506020820135611120816110df565b815461ff001916600882901b61ff0016178255505050565b6000808335601e1984360301811261114f57600080fd5b83018035915067ffffffffffffffff82111561116a57600080fd5b6020019150600781901b360382131561118257600080fd5b9250929050565b6006811061047957600080fd5b81356111a181611189565b600681106111b1576111b1610e37565b60ff1982541660ff8216811783555050602082013560018201556002810160408301356111dd8161105f565b81546001600160a01b0319166001600160a01b03919091161790556060919091013560039190910155565b600160401b83111561121c5761121c6110b3565b80548382558084101561129a5760026001600160fe1b038281168314611244576112446110c9565b8086168614611255576112556110c9565b506000838152602081208360021b81018760021b820191505b8082101561129557828255826001830155828483015582600383015560048201915061126e565b505050505b5060008181526020812083915b858110156112cf576112b98383611196565b60809290920191600491909101906001016112a7565b505050505050565b6000808335601e198436030181126112ee57600080fd5b83018035915067ffffffffffffffff82111561130957600080fd5b602001915060608102360382131561118257600080fd5b813561132b81610fcb565b61133481610e4d565b60ff1982541660ff82168117835550506020820135611352816110df565b815461ff001916600882901b61ff0016178255506040820135611374816110df565b815462ff0000191660109190911b62ff00001617905550565b600160401b8311156113a1576113a16110b3565b8054838255808410156113d8576000828152602081208581019083015b808210156113d4578282556001820191506113be565b5050505b5060008181526020812083915b858110156112cf576113f78383611320565b60609290920191600191820191016113e5565b8135601e1983360301811261141e57600080fd5b8201803567ffffffffffffffff81111561143757600080fd5b6020820191508060061b360382131561144f57600080fd5b600160401b811115611463576114636110b3565b82548184558082101561149a576000848152602081208381019083015b8082101561149657828255600182019150611480565b5050505b5060008381526020902060005b828110156114cc576114b984836110ee565b60409390930192600191820191016114a7565b505050506114dd6020830183611138565b6114eb818360018601611208565b50506114fa60408301836112d7565b61150881836002860161138d565b50505050565b634e487b7160e01b600052603260045260246000fd5b600060018201611536576115366110c9565b5060010190565b60008261155a57634e487b7160e01b600052601260045260246000fd5b500490565b6020810161156c83610e4d565b91905290565b6040516080810167ffffffffffffffff81118282101715611595576115956110b3565b60405290565b6040516060810167ffffffffffffffff81118282101715611595576115956110b3565b6040805190810167ffffffffffffffff81118282101715611595576115956110b3565b604051601f8201601f1916810167ffffffffffffffff8111828210171561160a5761160a6110b3565b604052919050565b600067ffffffffffffffff82111561162c5761162c6110b3565b5060051b60200190565b6000602080838503121561164957600080fd5b825167ffffffffffffffff81111561166057600080fd5b8301601f8101851361167157600080fd5b805161168461167f82611612565b6115e1565b81815260059190911b820183019083810190878311156116a357600080fd5b928401925b82841015610b1c5783516116bb8161105f565b825292840192908401906116a8565b60006080820160018060a01b03808816845260208760208601528660408601526080606086015282865180855260a08701915060208801945060005b81811015611724578551851683529483019491830191600101611706565b50909a9950505050505050505050565b600082601f83011261174557600080fd5b8151602061175561167f83611612565b82815260079290921b8401810191818101908684111561177457600080fd5b8286015b848110156117d957608081890312156117915760008081fd5b611799611572565b81516117a481611189565b815281850151858201526040808301516117bd8161105f565b9082015260608281015190820152835291830191608001611778565b509695505050505050565b600082601f8301126117f557600080fd5b8151602061180561167f83611612565b8281526060928302850182019282820191908785111561182457600080fd5b8387015b858110156118865781818a0312156118405760008081fd5b61184861159b565b815161185381610fcb565b815281860151611862816110df565b81870152604082810151611875816110df565b908201528452928401928101611828565b5090979650505050505050565b600060208083850312156118a657600080fd5b825167ffffffffffffffff808211156118be57600080fd5b90840190606082870312156118d257600080fd5b6118da61159b565b8251828111156118e957600080fd5b8301601f810188136118fa57600080fd5b805161190861167f82611612565b81815260069190911b8201860190868101908a83111561192757600080fd5b928701925b8284101561197d576040848c0312156119455760008081fd5b61194d6115be565b845161195881610fcb565b815284890151611967816110df565b818a01528252604093909301929087019061192c565b8452505050828401518281111561199357600080fd5b61199f88828601611734565b858301525060408301519350818411156119b857600080fd5b6119c4878585016117e4565b60408201529695505050505050565b6000602082840312156119e557600080fd5b815161041f8161105f56fe9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e01", +} + +// MockEntitlementGatedABI is the input ABI used to generate the binding from. +// Deprecated: Use MockEntitlementGatedMetaData.ABI instead. +var MockEntitlementGatedABI = MockEntitlementGatedMetaData.ABI + +// MockEntitlementGatedBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use MockEntitlementGatedMetaData.Bin instead. +var MockEntitlementGatedBin = MockEntitlementGatedMetaData.Bin + +// DeployMockEntitlementGated deploys a new Ethereum contract, binding an instance of MockEntitlementGated to it. +func DeployMockEntitlementGated(auth *bind.TransactOpts, backend bind.ContractBackend, checker common.Address) (common.Address, *types.Transaction, *MockEntitlementGated, error) { + parsed, err := MockEntitlementGatedMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(MockEntitlementGatedBin), backend, checker) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &MockEntitlementGated{MockEntitlementGatedCaller: MockEntitlementGatedCaller{contract: contract}, MockEntitlementGatedTransactor: MockEntitlementGatedTransactor{contract: contract}, MockEntitlementGatedFilterer: MockEntitlementGatedFilterer{contract: contract}}, nil +} + +// MockEntitlementGated is an auto generated Go binding around an Ethereum contract. +type MockEntitlementGated struct { + MockEntitlementGatedCaller // Read-only binding to the contract + MockEntitlementGatedTransactor // Write-only binding to the contract + MockEntitlementGatedFilterer // Log filterer for contract events +} + +// MockEntitlementGatedCaller is an auto generated read-only Go binding around an Ethereum contract. +type MockEntitlementGatedCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockEntitlementGatedTransactor is an auto generated write-only Go binding around an Ethereum contract. +type MockEntitlementGatedTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockEntitlementGatedFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type MockEntitlementGatedFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MockEntitlementGatedSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type MockEntitlementGatedSession struct { + Contract *MockEntitlementGated // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MockEntitlementGatedCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type MockEntitlementGatedCallerSession struct { + Contract *MockEntitlementGatedCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// MockEntitlementGatedTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type MockEntitlementGatedTransactorSession struct { + Contract *MockEntitlementGatedTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MockEntitlementGatedRaw is an auto generated low-level Go binding around an Ethereum contract. +type MockEntitlementGatedRaw struct { + Contract *MockEntitlementGated // Generic contract binding to access the raw methods on +} + +// MockEntitlementGatedCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type MockEntitlementGatedCallerRaw struct { + Contract *MockEntitlementGatedCaller // Generic read-only contract binding to access the raw methods on +} + +// MockEntitlementGatedTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type MockEntitlementGatedTransactorRaw struct { + Contract *MockEntitlementGatedTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewMockEntitlementGated creates a new instance of MockEntitlementGated, bound to a specific deployed contract. +func NewMockEntitlementGated(address common.Address, backend bind.ContractBackend) (*MockEntitlementGated, error) { + contract, err := bindMockEntitlementGated(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &MockEntitlementGated{MockEntitlementGatedCaller: MockEntitlementGatedCaller{contract: contract}, MockEntitlementGatedTransactor: MockEntitlementGatedTransactor{contract: contract}, MockEntitlementGatedFilterer: MockEntitlementGatedFilterer{contract: contract}}, nil +} + +// NewMockEntitlementGatedCaller creates a new read-only instance of MockEntitlementGated, bound to a specific deployed contract. +func NewMockEntitlementGatedCaller(address common.Address, caller bind.ContractCaller) (*MockEntitlementGatedCaller, error) { + contract, err := bindMockEntitlementGated(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &MockEntitlementGatedCaller{contract: contract}, nil +} + +// NewMockEntitlementGatedTransactor creates a new write-only instance of MockEntitlementGated, bound to a specific deployed contract. +func NewMockEntitlementGatedTransactor(address common.Address, transactor bind.ContractTransactor) (*MockEntitlementGatedTransactor, error) { + contract, err := bindMockEntitlementGated(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &MockEntitlementGatedTransactor{contract: contract}, nil +} + +// NewMockEntitlementGatedFilterer creates a new log filterer instance of MockEntitlementGated, bound to a specific deployed contract. +func NewMockEntitlementGatedFilterer(address common.Address, filterer bind.ContractFilterer) (*MockEntitlementGatedFilterer, error) { + contract, err := bindMockEntitlementGated(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &MockEntitlementGatedFilterer{contract: contract}, nil +} + +// bindMockEntitlementGated binds a generic wrapper to an already deployed contract. +func bindMockEntitlementGated(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := MockEntitlementGatedMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_MockEntitlementGated *MockEntitlementGatedRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MockEntitlementGated.Contract.MockEntitlementGatedCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_MockEntitlementGated *MockEntitlementGatedRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.MockEntitlementGatedTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_MockEntitlementGated *MockEntitlementGatedRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.MockEntitlementGatedTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_MockEntitlementGated *MockEntitlementGatedCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MockEntitlementGated.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_MockEntitlementGated *MockEntitlementGatedTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_MockEntitlementGated *MockEntitlementGatedTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.contract.Transact(opts, method, params...) +} + +// GetRuleData is a free data retrieval call binding the contract method 0x069a3ee9. +// +// Solidity: function getRuleData(uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])) +func (_MockEntitlementGated *MockEntitlementGatedCaller) GetRuleData(opts *bind.CallOpts, roleId *big.Int) (IRuleEntitlementRuleData, error) { + var out []interface{} + err := _MockEntitlementGated.contract.Call(opts, &out, "getRuleData", roleId) + + if err != nil { + return *new(IRuleEntitlementRuleData), err + } + + out0 := *abi.ConvertType(out[0], new(IRuleEntitlementRuleData)).(*IRuleEntitlementRuleData) + + return out0, err + +} + +// GetRuleData is a free data retrieval call binding the contract method 0x069a3ee9. +// +// Solidity: function getRuleData(uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])) +func (_MockEntitlementGated *MockEntitlementGatedSession) GetRuleData(roleId *big.Int) (IRuleEntitlementRuleData, error) { + return _MockEntitlementGated.Contract.GetRuleData(&_MockEntitlementGated.CallOpts, roleId) +} + +// GetRuleData is a free data retrieval call binding the contract method 0x069a3ee9. +// +// Solidity: function getRuleData(uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])) +func (_MockEntitlementGated *MockEntitlementGatedCallerSession) GetRuleData(roleId *big.Int) (IRuleEntitlementRuleData, error) { + return _MockEntitlementGated.Contract.GetRuleData(&_MockEntitlementGated.CallOpts, roleId) +} + +// GetRuleData0 is a free data retrieval call binding the contract method 0x92c399ff. +// +// Solidity: function getRuleData(bytes32 transactionId, uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])) +func (_MockEntitlementGated *MockEntitlementGatedCaller) GetRuleData0(opts *bind.CallOpts, transactionId [32]byte, roleId *big.Int) (IRuleEntitlementRuleData, error) { + var out []interface{} + err := _MockEntitlementGated.contract.Call(opts, &out, "getRuleData0", transactionId, roleId) + + if err != nil { + return *new(IRuleEntitlementRuleData), err + } + + out0 := *abi.ConvertType(out[0], new(IRuleEntitlementRuleData)).(*IRuleEntitlementRuleData) + + return out0, err + +} + +// GetRuleData0 is a free data retrieval call binding the contract method 0x92c399ff. +// +// Solidity: function getRuleData(bytes32 transactionId, uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])) +func (_MockEntitlementGated *MockEntitlementGatedSession) GetRuleData0(transactionId [32]byte, roleId *big.Int) (IRuleEntitlementRuleData, error) { + return _MockEntitlementGated.Contract.GetRuleData0(&_MockEntitlementGated.CallOpts, transactionId, roleId) +} + +// GetRuleData0 is a free data retrieval call binding the contract method 0x92c399ff. +// +// Solidity: function getRuleData(bytes32 transactionId, uint256 roleId) view returns(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])) +func (_MockEntitlementGated *MockEntitlementGatedCallerSession) GetRuleData0(transactionId [32]byte, roleId *big.Int) (IRuleEntitlementRuleData, error) { + return _MockEntitlementGated.Contract.GetRuleData0(&_MockEntitlementGated.CallOpts, transactionId, roleId) +} + +// EntitlementGatedInit is a paid mutator transaction binding the contract method 0x7adc9cbe. +// +// Solidity: function __EntitlementGated_init(address entitlementChecker) returns() +func (_MockEntitlementGated *MockEntitlementGatedTransactor) EntitlementGatedInit(opts *bind.TransactOpts, entitlementChecker common.Address) (*types.Transaction, error) { + return _MockEntitlementGated.contract.Transact(opts, "__EntitlementGated_init", entitlementChecker) +} + +// EntitlementGatedInit is a paid mutator transaction binding the contract method 0x7adc9cbe. +// +// Solidity: function __EntitlementGated_init(address entitlementChecker) returns() +func (_MockEntitlementGated *MockEntitlementGatedSession) EntitlementGatedInit(entitlementChecker common.Address) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.EntitlementGatedInit(&_MockEntitlementGated.TransactOpts, entitlementChecker) +} + +// EntitlementGatedInit is a paid mutator transaction binding the contract method 0x7adc9cbe. +// +// Solidity: function __EntitlementGated_init(address entitlementChecker) returns() +func (_MockEntitlementGated *MockEntitlementGatedTransactorSession) EntitlementGatedInit(entitlementChecker common.Address) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.EntitlementGatedInit(&_MockEntitlementGated.TransactOpts, entitlementChecker) +} + +// PostEntitlementCheckResult is a paid mutator transaction binding the contract method 0x4739e805. +// +// Solidity: function postEntitlementCheckResult(bytes32 transactionId, uint256 roleId, uint8 result) returns() +func (_MockEntitlementGated *MockEntitlementGatedTransactor) PostEntitlementCheckResult(opts *bind.TransactOpts, transactionId [32]byte, roleId *big.Int, result uint8) (*types.Transaction, error) { + return _MockEntitlementGated.contract.Transact(opts, "postEntitlementCheckResult", transactionId, roleId, result) +} + +// PostEntitlementCheckResult is a paid mutator transaction binding the contract method 0x4739e805. +// +// Solidity: function postEntitlementCheckResult(bytes32 transactionId, uint256 roleId, uint8 result) returns() +func (_MockEntitlementGated *MockEntitlementGatedSession) PostEntitlementCheckResult(transactionId [32]byte, roleId *big.Int, result uint8) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.PostEntitlementCheckResult(&_MockEntitlementGated.TransactOpts, transactionId, roleId, result) +} + +// PostEntitlementCheckResult is a paid mutator transaction binding the contract method 0x4739e805. +// +// Solidity: function postEntitlementCheckResult(bytes32 transactionId, uint256 roleId, uint8 result) returns() +func (_MockEntitlementGated *MockEntitlementGatedTransactorSession) PostEntitlementCheckResult(transactionId [32]byte, roleId *big.Int, result uint8) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.PostEntitlementCheckResult(&_MockEntitlementGated.TransactOpts, transactionId, roleId, result) +} + +// RequestEntitlementCheck is a paid mutator transaction binding the contract method 0x57e70027. +// +// Solidity: function requestEntitlementCheck(uint256 roleId, ((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]) ruleData) returns(bytes32) +func (_MockEntitlementGated *MockEntitlementGatedTransactor) RequestEntitlementCheck(opts *bind.TransactOpts, roleId *big.Int, ruleData IRuleEntitlementRuleData) (*types.Transaction, error) { + return _MockEntitlementGated.contract.Transact(opts, "requestEntitlementCheck", roleId, ruleData) +} + +// RequestEntitlementCheck is a paid mutator transaction binding the contract method 0x57e70027. +// +// Solidity: function requestEntitlementCheck(uint256 roleId, ((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]) ruleData) returns(bytes32) +func (_MockEntitlementGated *MockEntitlementGatedSession) RequestEntitlementCheck(roleId *big.Int, ruleData IRuleEntitlementRuleData) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.RequestEntitlementCheck(&_MockEntitlementGated.TransactOpts, roleId, ruleData) +} + +// RequestEntitlementCheck is a paid mutator transaction binding the contract method 0x57e70027. +// +// Solidity: function requestEntitlementCheck(uint256 roleId, ((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]) ruleData) returns(bytes32) +func (_MockEntitlementGated *MockEntitlementGatedTransactorSession) RequestEntitlementCheck(roleId *big.Int, ruleData IRuleEntitlementRuleData) (*types.Transaction, error) { + return _MockEntitlementGated.Contract.RequestEntitlementCheck(&_MockEntitlementGated.TransactOpts, roleId, ruleData) +} + +// MockEntitlementGatedEntitlementCheckResultPostedIterator is returned from FilterEntitlementCheckResultPosted and is used to iterate over the raw logs and unpacked data for EntitlementCheckResultPosted events raised by the MockEntitlementGated contract. +type MockEntitlementGatedEntitlementCheckResultPostedIterator struct { + Event *MockEntitlementGatedEntitlementCheckResultPosted // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockEntitlementGatedEntitlementCheckResultPostedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockEntitlementGatedEntitlementCheckResultPosted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockEntitlementGatedEntitlementCheckResultPosted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockEntitlementGatedEntitlementCheckResultPostedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockEntitlementGatedEntitlementCheckResultPostedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockEntitlementGatedEntitlementCheckResultPosted represents a EntitlementCheckResultPosted event raised by the MockEntitlementGated contract. +type MockEntitlementGatedEntitlementCheckResultPosted struct { + TransactionId [32]byte + Result uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEntitlementCheckResultPosted is a free log retrieval operation binding the contract event 0xb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c633. +// +// Solidity: event EntitlementCheckResultPosted(bytes32 indexed transactionId, uint8 result) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) FilterEntitlementCheckResultPosted(opts *bind.FilterOpts, transactionId [][32]byte) (*MockEntitlementGatedEntitlementCheckResultPostedIterator, error) { + + var transactionIdRule []interface{} + for _, transactionIdItem := range transactionId { + transactionIdRule = append(transactionIdRule, transactionIdItem) + } + + logs, sub, err := _MockEntitlementGated.contract.FilterLogs(opts, "EntitlementCheckResultPosted", transactionIdRule) + if err != nil { + return nil, err + } + return &MockEntitlementGatedEntitlementCheckResultPostedIterator{contract: _MockEntitlementGated.contract, event: "EntitlementCheckResultPosted", logs: logs, sub: sub}, nil +} + +// WatchEntitlementCheckResultPosted is a free log subscription operation binding the contract event 0xb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c633. +// +// Solidity: event EntitlementCheckResultPosted(bytes32 indexed transactionId, uint8 result) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) WatchEntitlementCheckResultPosted(opts *bind.WatchOpts, sink chan<- *MockEntitlementGatedEntitlementCheckResultPosted, transactionId [][32]byte) (event.Subscription, error) { + + var transactionIdRule []interface{} + for _, transactionIdItem := range transactionId { + transactionIdRule = append(transactionIdRule, transactionIdItem) + } + + logs, sub, err := _MockEntitlementGated.contract.WatchLogs(opts, "EntitlementCheckResultPosted", transactionIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockEntitlementGatedEntitlementCheckResultPosted) + if err := _MockEntitlementGated.contract.UnpackLog(event, "EntitlementCheckResultPosted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEntitlementCheckResultPosted is a log parse operation binding the contract event 0xb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c633. +// +// Solidity: event EntitlementCheckResultPosted(bytes32 indexed transactionId, uint8 result) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) ParseEntitlementCheckResultPosted(log types.Log) (*MockEntitlementGatedEntitlementCheckResultPosted, error) { + event := new(MockEntitlementGatedEntitlementCheckResultPosted) + if err := _MockEntitlementGated.contract.UnpackLog(event, "EntitlementCheckResultPosted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockEntitlementGatedInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the MockEntitlementGated contract. +type MockEntitlementGatedInitializedIterator struct { + Event *MockEntitlementGatedInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockEntitlementGatedInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockEntitlementGatedInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockEntitlementGatedInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockEntitlementGatedInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockEntitlementGatedInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockEntitlementGatedInitialized represents a Initialized event raised by the MockEntitlementGated contract. +type MockEntitlementGatedInitialized struct { + Version uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) FilterInitialized(opts *bind.FilterOpts) (*MockEntitlementGatedInitializedIterator, error) { + + logs, sub, err := _MockEntitlementGated.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &MockEntitlementGatedInitializedIterator{contract: _MockEntitlementGated.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *MockEntitlementGatedInitialized) (event.Subscription, error) { + + logs, sub, err := _MockEntitlementGated.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockEntitlementGatedInitialized) + if err := _MockEntitlementGated.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) ParseInitialized(log types.Log) (*MockEntitlementGatedInitialized, error) { + event := new(MockEntitlementGatedInitialized) + if err := _MockEntitlementGated.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockEntitlementGatedInterfaceAddedIterator is returned from FilterInterfaceAdded and is used to iterate over the raw logs and unpacked data for InterfaceAdded events raised by the MockEntitlementGated contract. +type MockEntitlementGatedInterfaceAddedIterator struct { + Event *MockEntitlementGatedInterfaceAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockEntitlementGatedInterfaceAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockEntitlementGatedInterfaceAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockEntitlementGatedInterfaceAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockEntitlementGatedInterfaceAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockEntitlementGatedInterfaceAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockEntitlementGatedInterfaceAdded represents a InterfaceAdded event raised by the MockEntitlementGated contract. +type MockEntitlementGatedInterfaceAdded struct { + InterfaceId [4]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInterfaceAdded is a free log retrieval operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) FilterInterfaceAdded(opts *bind.FilterOpts, interfaceId [][4]byte) (*MockEntitlementGatedInterfaceAddedIterator, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _MockEntitlementGated.contract.FilterLogs(opts, "InterfaceAdded", interfaceIdRule) + if err != nil { + return nil, err + } + return &MockEntitlementGatedInterfaceAddedIterator{contract: _MockEntitlementGated.contract, event: "InterfaceAdded", logs: logs, sub: sub}, nil +} + +// WatchInterfaceAdded is a free log subscription operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) WatchInterfaceAdded(opts *bind.WatchOpts, sink chan<- *MockEntitlementGatedInterfaceAdded, interfaceId [][4]byte) (event.Subscription, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _MockEntitlementGated.contract.WatchLogs(opts, "InterfaceAdded", interfaceIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockEntitlementGatedInterfaceAdded) + if err := _MockEntitlementGated.contract.UnpackLog(event, "InterfaceAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInterfaceAdded is a log parse operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) ParseInterfaceAdded(log types.Log) (*MockEntitlementGatedInterfaceAdded, error) { + event := new(MockEntitlementGatedInterfaceAdded) + if err := _MockEntitlementGated.contract.UnpackLog(event, "InterfaceAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MockEntitlementGatedInterfaceRemovedIterator is returned from FilterInterfaceRemoved and is used to iterate over the raw logs and unpacked data for InterfaceRemoved events raised by the MockEntitlementGated contract. +type MockEntitlementGatedInterfaceRemovedIterator struct { + Event *MockEntitlementGatedInterfaceRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MockEntitlementGatedInterfaceRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MockEntitlementGatedInterfaceRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MockEntitlementGatedInterfaceRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MockEntitlementGatedInterfaceRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MockEntitlementGatedInterfaceRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MockEntitlementGatedInterfaceRemoved represents a InterfaceRemoved event raised by the MockEntitlementGated contract. +type MockEntitlementGatedInterfaceRemoved struct { + InterfaceId [4]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInterfaceRemoved is a free log retrieval operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) FilterInterfaceRemoved(opts *bind.FilterOpts, interfaceId [][4]byte) (*MockEntitlementGatedInterfaceRemovedIterator, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _MockEntitlementGated.contract.FilterLogs(opts, "InterfaceRemoved", interfaceIdRule) + if err != nil { + return nil, err + } + return &MockEntitlementGatedInterfaceRemovedIterator{contract: _MockEntitlementGated.contract, event: "InterfaceRemoved", logs: logs, sub: sub}, nil +} + +// WatchInterfaceRemoved is a free log subscription operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) WatchInterfaceRemoved(opts *bind.WatchOpts, sink chan<- *MockEntitlementGatedInterfaceRemoved, interfaceId [][4]byte) (event.Subscription, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _MockEntitlementGated.contract.WatchLogs(opts, "InterfaceRemoved", interfaceIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MockEntitlementGatedInterfaceRemoved) + if err := _MockEntitlementGated.contract.UnpackLog(event, "InterfaceRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInterfaceRemoved is a log parse operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_MockEntitlementGated *MockEntitlementGatedFilterer) ParseInterfaceRemoved(log types.Log) (*MockEntitlementGatedInterfaceRemoved, error) { + event := new(MockEntitlementGatedInterfaceRemoved) + if err := _MockEntitlementGated.contract.UnpackLog(event, "InterfaceRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/xchain/contracts/v3/wallet_link.go b/core/xchain/contracts/v3/wallet_link.go new file mode 100644 index 000000000..1cf2fc790 --- /dev/null +++ b/core/xchain/contracts/v3/wallet_link.go @@ -0,0 +1,1139 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package v3 + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// WalletLinkMetaData contains all meta data concerning the WalletLink contract. +var WalletLinkMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"__WalletLink_init\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkIfLinked\",\"inputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestNonceForRootKey\",\"inputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootKeyForWallet\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWalletsByRootKey\",\"inputs\":[{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"wallets\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"linkCallerToRootKey\",\"inputs\":[{\"name\":\"rootWallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"linkWalletToRootKey\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"rootWallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeLink\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootWallet\",\"type\":\"tuple\",\"internalType\":\"structIWalletLinkBase.LinkedWallet\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InterfaceAdded\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"indexed\":true,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InterfaceRemoved\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"indexed\":true,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LinkWalletToRootKey\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemoveLink\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"secondWallet\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ECDSAInvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ECDSAInvalidSignatureLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ECDSAInvalidSignatureS\",\"inputs\":[{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"Initializable_InInitializingState\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Initializable_NotInInitializingState\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Introspection_AlreadySupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Introspection_NotSupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAccountNonce\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"currentNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WalletLink__CannotLinkToRootWallet\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WalletLink__CannotLinkToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__CannotRemoveRootWallet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WalletLink__LinkAlreadyExists\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WalletLink__LinkedToAnotherRootKey\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"WalletLink__NotLinked\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rootKey\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6111ba806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063912b97581161005b578063912b9758146100f4578063d80bd3b914610117578063e65dfe9d1461012a578063f82103981461013d57600080fd5b806302345b981461008d5780631a31fc8d146100b657806320a00ac8146100cb578063260a409d146100ec575b600080fd5b6100a061009b366004610e84565b610168565b6040516100ad9190610e9f565b60405180910390f35b6100c96100c436600461100b565b610179565b005b6100de6100d9366004610e84565b610189565b6040519081526020016100ad565b6100c96101c6565b610107610102366004611078565b610222565b60405190151581526020016100ad565b6100c96101253660046110ab565b61026b565b6100c96101383660046110f1565b610276565b61015061014b366004610e84565b610284565b6040516001600160a01b0390911681526020016100ad565b6060610173826102c5565b92915050565b6101848383836102f6565b505050565b6001600160a01b03811660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c006020526040812054610173565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661021057604051630ef4733760e31b815260040160405180910390fd5b610220636ff9143960e01b6104da565b565b6001600160a01b0381811660009081527f19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc01602052604081205490918481169116145b9392505050565b6101848383836105b8565b6102808282610780565b5050565b6001600160a01b0380821660009081527f19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc016020526040812054909116610173565b6001600160a01b038116600090815260008051602061119a83398151915260205260409020606090610173906108a7565b8251825160008051602061119a83398151915291610316918391906108b4565b8351604080516001600160a01b0390921660208301528101839052600090610385906060015b604051602081830303815290604052805190602001207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b905083600001516001600160a01b03166103a3828660200151610a25565b6001600160a01b0316146103ca57604051632af0041d60e11b815260040160405180910390fd5b8351604080516001600160a01b03909216602083015281018490526000906103f49060600161033c565b905085600001516001600160a01b0316610412828860200151610a25565b6001600160a01b03161461043957604051632af0041d60e11b815260040160405180910390fd5b84516104459085610a4f565b855185516001600160a01b0316600090815260208590526040902061046991610ac1565b50845186516001600160a01b03908116600090815260018601602052604080822080546001600160a01b0319169484169490941790935587518951935190831693909216917f64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b57219190a3505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610567576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610580565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60008051602061119a8339815191526001600160a01b03841615806105e5575082516001600160a01b0316155b1561060357604051636df3f5c360e01b815260040160405180910390fd5b82600001516001600160a01b0316846001600160a01b031603610639576040516333976e3b60e11b815260040160405180910390fd5b82516001600160a01b0385811660009081526001840160205260409020548116911614610694578251604051635e300c8360e01b81526001600160a01b03808716600483015290911660248201526044015b60405180910390fd5b604080516001600160a01b03861660208201529081018390526000906106bc9060600161033c565b905083600001516001600160a01b03166106da828660200151610a25565b6001600160a01b03161461070157604051632af0041d60e11b815260040160405180910390fd5b6001600160a01b038086166000908152600184016020908152604080832080546001600160a01b031916905587519093168252849052206107429086610ad6565b5060405133906001600160a01b038716907f9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da290600090a35050505050565b815160008051602061119a8339815191529033906107a190839083906108b4565b604080516001600160a01b03831660208201529081018490526000906107c99060600161033c565b905084600001516001600160a01b03166107e7828760200151610a25565b6001600160a01b03161461080e57604051632af0041d60e11b815260040160405180910390fd5b845161081a9085610a4f565b84516001600160a01b0316600090815260208490526040902061083d9083610ac1565b5084516001600160a01b03838116600081815260018701602052604080822080546001600160a01b0319169585169590951790945588519351939092169290917f64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b572191a35050505050565b6060600061026483610aeb565b6001600160a01b03821615806108d157506001600160a01b038116155b156108ef57604051636df3f5c360e01b815260040160405180910390fd5b806001600160a01b0316826001600160a01b0316036109215760405163848ba26d60e01b815260040160405180910390fd5b6001600160a01b038281166000908152600185016020526040902054161561096f576040516314790b7f60e01b81526001600160a01b0380841660048301528216602482015260440161068b565b6001600160a01b03818116600090815260018501602052604090205416156109d2576001600160a01b038181166000908152600185016020526040908190205490516347227b5d60e01b815284831660048201529116602482015260440161068b565b6001600160a01b03821660009081526020849052604081206109f390610b47565b111561018457604051637b815eed60e11b81526001600160a01b0380841660048301528216602482015260440161068b565b600080600080610a358686610b51565b925092509250610a458282610b9e565b5090949350505050565b6001600160a01b03821660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c0060205260409020805460018101909155818114610184576040516301d4b62360e61b81526001600160a01b03841660048201526024810182905260440161068b565b6000610264836001600160a01b038416610c57565b6000610264836001600160a01b038416610ca6565b606081600001805480602002602001604051908101604052809291908181526020018280548015610b3b57602002820191906000526020600020905b815481526020019060010190808311610b27575b50505050509050919050565b6000610173825490565b60008060008351604103610b8b5760208401516040850151606086015160001a610b7d88828585610d99565b955095509550505050610b97565b50508151600091506002905b9250925092565b6000826003811115610bb257610bb2611136565b03610bbb575050565b6001826003811115610bcf57610bcf611136565b03610bed5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610c0157610c01611136565b03610c225760405163fce698f760e01b81526004810182905260240161068b565b6003826003811115610c3657610c36611136565b03610280576040516335e2f38360e21b81526004810182905260240161068b565b6000818152600183016020526040812054610c9e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610173565b506000610173565b60008181526001830160205260408120548015610d8f576000610cca60018361114c565b8554909150600090610cde9060019061114c565b9050808214610d43576000866000018281548110610cfe57610cfe61116d565b9060005260206000200154905080876000018481548110610d2157610d2161116d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610d5457610d54611183565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610173565b6000915050610173565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610dd45750600091506003905082610e5e565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610e28573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e5457506000925060019150829050610e5e565b9250600091508190505b9450945094915050565b80356001600160a01b0381168114610e7f57600080fd5b919050565b600060208284031215610e9657600080fd5b61026482610e68565b6020808252825182820181905260009190848201906040850190845b81811015610ee05783516001600160a01b031683529284019291840191600101610ebb565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610f2557610f25610eec565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610f5457610f54610eec565b604052919050565b600060408284031215610f6e57600080fd5b610f76610f02565b9050610f8182610e68565b815260208083013567ffffffffffffffff80821115610f9f57600080fd5b818501915085601f830112610fb357600080fd5b813581811115610fc557610fc5610eec565b610fd7601f8201601f19168501610f2b565b91508082528684828501011115610fed57600080fd5b80848401858401376000908201840152918301919091525092915050565b60008060006060848603121561102057600080fd5b833567ffffffffffffffff8082111561103857600080fd5b61104487838801610f5c565b9450602086013591508082111561105a57600080fd5b5061106786828701610f5c565b925050604084013590509250925092565b6000806040838503121561108b57600080fd5b61109483610e68565b91506110a260208401610e68565b90509250929050565b6000806000606084860312156110c057600080fd5b6110c984610e68565b9250602084013567ffffffffffffffff8111156110e557600080fd5b61106786828701610f5c565b6000806040838503121561110457600080fd5b823567ffffffffffffffff81111561111b57600080fd5b61112785828601610f5c565b95602094909401359450505050565b634e487b7160e01b600052602160045260246000fd5b8181038181111561017357634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfe19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc00", +} + +// WalletLinkABI is the input ABI used to generate the binding from. +// Deprecated: Use WalletLinkMetaData.ABI instead. +var WalletLinkABI = WalletLinkMetaData.ABI + +// WalletLinkBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use WalletLinkMetaData.Bin instead. +var WalletLinkBin = WalletLinkMetaData.Bin + +// DeployWalletLink deploys a new Ethereum contract, binding an instance of WalletLink to it. +func DeployWalletLink(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *WalletLink, error) { + parsed, err := WalletLinkMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(WalletLinkBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &WalletLink{WalletLinkCaller: WalletLinkCaller{contract: contract}, WalletLinkTransactor: WalletLinkTransactor{contract: contract}, WalletLinkFilterer: WalletLinkFilterer{contract: contract}}, nil +} + +// WalletLink is an auto generated Go binding around an Ethereum contract. +type WalletLink struct { + WalletLinkCaller // Read-only binding to the contract + WalletLinkTransactor // Write-only binding to the contract + WalletLinkFilterer // Log filterer for contract events +} + +// WalletLinkCaller is an auto generated read-only Go binding around an Ethereum contract. +type WalletLinkCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// WalletLinkTransactor is an auto generated write-only Go binding around an Ethereum contract. +type WalletLinkTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// WalletLinkFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type WalletLinkFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// WalletLinkSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type WalletLinkSession struct { + Contract *WalletLink // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// WalletLinkCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type WalletLinkCallerSession struct { + Contract *WalletLinkCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// WalletLinkTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type WalletLinkTransactorSession struct { + Contract *WalletLinkTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// WalletLinkRaw is an auto generated low-level Go binding around an Ethereum contract. +type WalletLinkRaw struct { + Contract *WalletLink // Generic contract binding to access the raw methods on +} + +// WalletLinkCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type WalletLinkCallerRaw struct { + Contract *WalletLinkCaller // Generic read-only contract binding to access the raw methods on +} + +// WalletLinkTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type WalletLinkTransactorRaw struct { + Contract *WalletLinkTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewWalletLink creates a new instance of WalletLink, bound to a specific deployed contract. +func NewWalletLink(address common.Address, backend bind.ContractBackend) (*WalletLink, error) { + contract, err := bindWalletLink(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &WalletLink{WalletLinkCaller: WalletLinkCaller{contract: contract}, WalletLinkTransactor: WalletLinkTransactor{contract: contract}, WalletLinkFilterer: WalletLinkFilterer{contract: contract}}, nil +} + +// NewWalletLinkCaller creates a new read-only instance of WalletLink, bound to a specific deployed contract. +func NewWalletLinkCaller(address common.Address, caller bind.ContractCaller) (*WalletLinkCaller, error) { + contract, err := bindWalletLink(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &WalletLinkCaller{contract: contract}, nil +} + +// NewWalletLinkTransactor creates a new write-only instance of WalletLink, bound to a specific deployed contract. +func NewWalletLinkTransactor(address common.Address, transactor bind.ContractTransactor) (*WalletLinkTransactor, error) { + contract, err := bindWalletLink(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &WalletLinkTransactor{contract: contract}, nil +} + +// NewWalletLinkFilterer creates a new log filterer instance of WalletLink, bound to a specific deployed contract. +func NewWalletLinkFilterer(address common.Address, filterer bind.ContractFilterer) (*WalletLinkFilterer, error) { + contract, err := bindWalletLink(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &WalletLinkFilterer{contract: contract}, nil +} + +// bindWalletLink binds a generic wrapper to an already deployed contract. +func bindWalletLink(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := WalletLinkMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_WalletLink *WalletLinkRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _WalletLink.Contract.WalletLinkCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_WalletLink *WalletLinkRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _WalletLink.Contract.WalletLinkTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_WalletLink *WalletLinkRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _WalletLink.Contract.WalletLinkTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_WalletLink *WalletLinkCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _WalletLink.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_WalletLink *WalletLinkTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _WalletLink.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_WalletLink *WalletLinkTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _WalletLink.Contract.contract.Transact(opts, method, params...) +} + +// CheckIfLinked is a free data retrieval call binding the contract method 0x912b9758. +// +// Solidity: function checkIfLinked(address rootKey, address wallet) view returns(bool) +func (_WalletLink *WalletLinkCaller) CheckIfLinked(opts *bind.CallOpts, rootKey common.Address, wallet common.Address) (bool, error) { + var out []interface{} + err := _WalletLink.contract.Call(opts, &out, "checkIfLinked", rootKey, wallet) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// CheckIfLinked is a free data retrieval call binding the contract method 0x912b9758. +// +// Solidity: function checkIfLinked(address rootKey, address wallet) view returns(bool) +func (_WalletLink *WalletLinkSession) CheckIfLinked(rootKey common.Address, wallet common.Address) (bool, error) { + return _WalletLink.Contract.CheckIfLinked(&_WalletLink.CallOpts, rootKey, wallet) +} + +// CheckIfLinked is a free data retrieval call binding the contract method 0x912b9758. +// +// Solidity: function checkIfLinked(address rootKey, address wallet) view returns(bool) +func (_WalletLink *WalletLinkCallerSession) CheckIfLinked(rootKey common.Address, wallet common.Address) (bool, error) { + return _WalletLink.Contract.CheckIfLinked(&_WalletLink.CallOpts, rootKey, wallet) +} + +// GetLatestNonceForRootKey is a free data retrieval call binding the contract method 0x20a00ac8. +// +// Solidity: function getLatestNonceForRootKey(address rootKey) view returns(uint256) +func (_WalletLink *WalletLinkCaller) GetLatestNonceForRootKey(opts *bind.CallOpts, rootKey common.Address) (*big.Int, error) { + var out []interface{} + err := _WalletLink.contract.Call(opts, &out, "getLatestNonceForRootKey", rootKey) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetLatestNonceForRootKey is a free data retrieval call binding the contract method 0x20a00ac8. +// +// Solidity: function getLatestNonceForRootKey(address rootKey) view returns(uint256) +func (_WalletLink *WalletLinkSession) GetLatestNonceForRootKey(rootKey common.Address) (*big.Int, error) { + return _WalletLink.Contract.GetLatestNonceForRootKey(&_WalletLink.CallOpts, rootKey) +} + +// GetLatestNonceForRootKey is a free data retrieval call binding the contract method 0x20a00ac8. +// +// Solidity: function getLatestNonceForRootKey(address rootKey) view returns(uint256) +func (_WalletLink *WalletLinkCallerSession) GetLatestNonceForRootKey(rootKey common.Address) (*big.Int, error) { + return _WalletLink.Contract.GetLatestNonceForRootKey(&_WalletLink.CallOpts, rootKey) +} + +// GetRootKeyForWallet is a free data retrieval call binding the contract method 0xf8210398. +// +// Solidity: function getRootKeyForWallet(address wallet) view returns(address rootKey) +func (_WalletLink *WalletLinkCaller) GetRootKeyForWallet(opts *bind.CallOpts, wallet common.Address) (common.Address, error) { + var out []interface{} + err := _WalletLink.contract.Call(opts, &out, "getRootKeyForWallet", wallet) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetRootKeyForWallet is a free data retrieval call binding the contract method 0xf8210398. +// +// Solidity: function getRootKeyForWallet(address wallet) view returns(address rootKey) +func (_WalletLink *WalletLinkSession) GetRootKeyForWallet(wallet common.Address) (common.Address, error) { + return _WalletLink.Contract.GetRootKeyForWallet(&_WalletLink.CallOpts, wallet) +} + +// GetRootKeyForWallet is a free data retrieval call binding the contract method 0xf8210398. +// +// Solidity: function getRootKeyForWallet(address wallet) view returns(address rootKey) +func (_WalletLink *WalletLinkCallerSession) GetRootKeyForWallet(wallet common.Address) (common.Address, error) { + return _WalletLink.Contract.GetRootKeyForWallet(&_WalletLink.CallOpts, wallet) +} + +// GetWalletsByRootKey is a free data retrieval call binding the contract method 0x02345b98. +// +// Solidity: function getWalletsByRootKey(address rootKey) view returns(address[] wallets) +func (_WalletLink *WalletLinkCaller) GetWalletsByRootKey(opts *bind.CallOpts, rootKey common.Address) ([]common.Address, error) { + var out []interface{} + err := _WalletLink.contract.Call(opts, &out, "getWalletsByRootKey", rootKey) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetWalletsByRootKey is a free data retrieval call binding the contract method 0x02345b98. +// +// Solidity: function getWalletsByRootKey(address rootKey) view returns(address[] wallets) +func (_WalletLink *WalletLinkSession) GetWalletsByRootKey(rootKey common.Address) ([]common.Address, error) { + return _WalletLink.Contract.GetWalletsByRootKey(&_WalletLink.CallOpts, rootKey) +} + +// GetWalletsByRootKey is a free data retrieval call binding the contract method 0x02345b98. +// +// Solidity: function getWalletsByRootKey(address rootKey) view returns(address[] wallets) +func (_WalletLink *WalletLinkCallerSession) GetWalletsByRootKey(rootKey common.Address) ([]common.Address, error) { + return _WalletLink.Contract.GetWalletsByRootKey(&_WalletLink.CallOpts, rootKey) +} + +// WalletLinkInit is a paid mutator transaction binding the contract method 0x260a409d. +// +// Solidity: function __WalletLink_init() returns() +func (_WalletLink *WalletLinkTransactor) WalletLinkInit(opts *bind.TransactOpts) (*types.Transaction, error) { + return _WalletLink.contract.Transact(opts, "__WalletLink_init") +} + +// WalletLinkInit is a paid mutator transaction binding the contract method 0x260a409d. +// +// Solidity: function __WalletLink_init() returns() +func (_WalletLink *WalletLinkSession) WalletLinkInit() (*types.Transaction, error) { + return _WalletLink.Contract.WalletLinkInit(&_WalletLink.TransactOpts) +} + +// WalletLinkInit is a paid mutator transaction binding the contract method 0x260a409d. +// +// Solidity: function __WalletLink_init() returns() +func (_WalletLink *WalletLinkTransactorSession) WalletLinkInit() (*types.Transaction, error) { + return _WalletLink.Contract.WalletLinkInit(&_WalletLink.TransactOpts) +} + +// LinkCallerToRootKey is a paid mutator transaction binding the contract method 0xe65dfe9d. +// +// Solidity: function linkCallerToRootKey((address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkTransactor) LinkCallerToRootKey(opts *bind.TransactOpts, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.contract.Transact(opts, "linkCallerToRootKey", rootWallet, nonce) +} + +// LinkCallerToRootKey is a paid mutator transaction binding the contract method 0xe65dfe9d. +// +// Solidity: function linkCallerToRootKey((address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkSession) LinkCallerToRootKey(rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.Contract.LinkCallerToRootKey(&_WalletLink.TransactOpts, rootWallet, nonce) +} + +// LinkCallerToRootKey is a paid mutator transaction binding the contract method 0xe65dfe9d. +// +// Solidity: function linkCallerToRootKey((address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkTransactorSession) LinkCallerToRootKey(rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.Contract.LinkCallerToRootKey(&_WalletLink.TransactOpts, rootWallet, nonce) +} + +// LinkWalletToRootKey is a paid mutator transaction binding the contract method 0x1a31fc8d. +// +// Solidity: function linkWalletToRootKey((address,bytes) wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkTransactor) LinkWalletToRootKey(opts *bind.TransactOpts, wallet IWalletLinkBaseLinkedWallet, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.contract.Transact(opts, "linkWalletToRootKey", wallet, rootWallet, nonce) +} + +// LinkWalletToRootKey is a paid mutator transaction binding the contract method 0x1a31fc8d. +// +// Solidity: function linkWalletToRootKey((address,bytes) wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkSession) LinkWalletToRootKey(wallet IWalletLinkBaseLinkedWallet, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.Contract.LinkWalletToRootKey(&_WalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// LinkWalletToRootKey is a paid mutator transaction binding the contract method 0x1a31fc8d. +// +// Solidity: function linkWalletToRootKey((address,bytes) wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkTransactorSession) LinkWalletToRootKey(wallet IWalletLinkBaseLinkedWallet, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.Contract.LinkWalletToRootKey(&_WalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// RemoveLink is a paid mutator transaction binding the contract method 0xd80bd3b9. +// +// Solidity: function removeLink(address wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkTransactor) RemoveLink(opts *bind.TransactOpts, wallet common.Address, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.contract.Transact(opts, "removeLink", wallet, rootWallet, nonce) +} + +// RemoveLink is a paid mutator transaction binding the contract method 0xd80bd3b9. +// +// Solidity: function removeLink(address wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkSession) RemoveLink(wallet common.Address, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.Contract.RemoveLink(&_WalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// RemoveLink is a paid mutator transaction binding the contract method 0xd80bd3b9. +// +// Solidity: function removeLink(address wallet, (address,bytes) rootWallet, uint256 nonce) returns() +func (_WalletLink *WalletLinkTransactorSession) RemoveLink(wallet common.Address, rootWallet IWalletLinkBaseLinkedWallet, nonce *big.Int) (*types.Transaction, error) { + return _WalletLink.Contract.RemoveLink(&_WalletLink.TransactOpts, wallet, rootWallet, nonce) +} + +// WalletLinkInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the WalletLink contract. +type WalletLinkInitializedIterator struct { + Event *WalletLinkInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *WalletLinkInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(WalletLinkInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(WalletLinkInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *WalletLinkInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *WalletLinkInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// WalletLinkInitialized represents a Initialized event raised by the WalletLink contract. +type WalletLinkInitialized struct { + Version uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_WalletLink *WalletLinkFilterer) FilterInitialized(opts *bind.FilterOpts) (*WalletLinkInitializedIterator, error) { + + logs, sub, err := _WalletLink.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &WalletLinkInitializedIterator{contract: _WalletLink.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_WalletLink *WalletLinkFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *WalletLinkInitialized) (event.Subscription, error) { + + logs, sub, err := _WalletLink.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(WalletLinkInitialized) + if err := _WalletLink.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c. +// +// Solidity: event Initialized(uint32 version) +func (_WalletLink *WalletLinkFilterer) ParseInitialized(log types.Log) (*WalletLinkInitialized, error) { + event := new(WalletLinkInitialized) + if err := _WalletLink.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// WalletLinkInterfaceAddedIterator is returned from FilterInterfaceAdded and is used to iterate over the raw logs and unpacked data for InterfaceAdded events raised by the WalletLink contract. +type WalletLinkInterfaceAddedIterator struct { + Event *WalletLinkInterfaceAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *WalletLinkInterfaceAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(WalletLinkInterfaceAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(WalletLinkInterfaceAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *WalletLinkInterfaceAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *WalletLinkInterfaceAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// WalletLinkInterfaceAdded represents a InterfaceAdded event raised by the WalletLink contract. +type WalletLinkInterfaceAdded struct { + InterfaceId [4]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInterfaceAdded is a free log retrieval operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_WalletLink *WalletLinkFilterer) FilterInterfaceAdded(opts *bind.FilterOpts, interfaceId [][4]byte) (*WalletLinkInterfaceAddedIterator, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _WalletLink.contract.FilterLogs(opts, "InterfaceAdded", interfaceIdRule) + if err != nil { + return nil, err + } + return &WalletLinkInterfaceAddedIterator{contract: _WalletLink.contract, event: "InterfaceAdded", logs: logs, sub: sub}, nil +} + +// WatchInterfaceAdded is a free log subscription operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_WalletLink *WalletLinkFilterer) WatchInterfaceAdded(opts *bind.WatchOpts, sink chan<- *WalletLinkInterfaceAdded, interfaceId [][4]byte) (event.Subscription, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _WalletLink.contract.WatchLogs(opts, "InterfaceAdded", interfaceIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(WalletLinkInterfaceAdded) + if err := _WalletLink.contract.UnpackLog(event, "InterfaceAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInterfaceAdded is a log parse operation binding the contract event 0x78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f22. +// +// Solidity: event InterfaceAdded(bytes4 indexed interfaceId) +func (_WalletLink *WalletLinkFilterer) ParseInterfaceAdded(log types.Log) (*WalletLinkInterfaceAdded, error) { + event := new(WalletLinkInterfaceAdded) + if err := _WalletLink.contract.UnpackLog(event, "InterfaceAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// WalletLinkInterfaceRemovedIterator is returned from FilterInterfaceRemoved and is used to iterate over the raw logs and unpacked data for InterfaceRemoved events raised by the WalletLink contract. +type WalletLinkInterfaceRemovedIterator struct { + Event *WalletLinkInterfaceRemoved // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *WalletLinkInterfaceRemovedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(WalletLinkInterfaceRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(WalletLinkInterfaceRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *WalletLinkInterfaceRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *WalletLinkInterfaceRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// WalletLinkInterfaceRemoved represents a InterfaceRemoved event raised by the WalletLink contract. +type WalletLinkInterfaceRemoved struct { + InterfaceId [4]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInterfaceRemoved is a free log retrieval operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_WalletLink *WalletLinkFilterer) FilterInterfaceRemoved(opts *bind.FilterOpts, interfaceId [][4]byte) (*WalletLinkInterfaceRemovedIterator, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _WalletLink.contract.FilterLogs(opts, "InterfaceRemoved", interfaceIdRule) + if err != nil { + return nil, err + } + return &WalletLinkInterfaceRemovedIterator{contract: _WalletLink.contract, event: "InterfaceRemoved", logs: logs, sub: sub}, nil +} + +// WatchInterfaceRemoved is a free log subscription operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_WalletLink *WalletLinkFilterer) WatchInterfaceRemoved(opts *bind.WatchOpts, sink chan<- *WalletLinkInterfaceRemoved, interfaceId [][4]byte) (event.Subscription, error) { + + var interfaceIdRule []interface{} + for _, interfaceIdItem := range interfaceId { + interfaceIdRule = append(interfaceIdRule, interfaceIdItem) + } + + logs, sub, err := _WalletLink.contract.WatchLogs(opts, "InterfaceRemoved", interfaceIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(WalletLinkInterfaceRemoved) + if err := _WalletLink.contract.UnpackLog(event, "InterfaceRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInterfaceRemoved is a log parse operation binding the contract event 0x8bd383568d0bc57b64b8e424138fc19ae827e694e05757faa8fea8f63fb87315. +// +// Solidity: event InterfaceRemoved(bytes4 indexed interfaceId) +func (_WalletLink *WalletLinkFilterer) ParseInterfaceRemoved(log types.Log) (*WalletLinkInterfaceRemoved, error) { + event := new(WalletLinkInterfaceRemoved) + if err := _WalletLink.contract.UnpackLog(event, "InterfaceRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// WalletLinkLinkWalletToRootKeyIterator is returned from FilterLinkWalletToRootKey and is used to iterate over the raw logs and unpacked data for LinkWalletToRootKey events raised by the WalletLink contract. +type WalletLinkLinkWalletToRootKeyIterator struct { + Event *WalletLinkLinkWalletToRootKey // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *WalletLinkLinkWalletToRootKeyIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(WalletLinkLinkWalletToRootKey) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(WalletLinkLinkWalletToRootKey) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *WalletLinkLinkWalletToRootKeyIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *WalletLinkLinkWalletToRootKeyIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// WalletLinkLinkWalletToRootKey represents a LinkWalletToRootKey event raised by the WalletLink contract. +type WalletLinkLinkWalletToRootKey struct { + Wallet common.Address + RootKey common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterLinkWalletToRootKey is a free log retrieval operation binding the contract event 0x64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b5721. +// +// Solidity: event LinkWalletToRootKey(address indexed wallet, address indexed rootKey) +func (_WalletLink *WalletLinkFilterer) FilterLinkWalletToRootKey(opts *bind.FilterOpts, wallet []common.Address, rootKey []common.Address) (*WalletLinkLinkWalletToRootKeyIterator, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var rootKeyRule []interface{} + for _, rootKeyItem := range rootKey { + rootKeyRule = append(rootKeyRule, rootKeyItem) + } + + logs, sub, err := _WalletLink.contract.FilterLogs(opts, "LinkWalletToRootKey", walletRule, rootKeyRule) + if err != nil { + return nil, err + } + return &WalletLinkLinkWalletToRootKeyIterator{contract: _WalletLink.contract, event: "LinkWalletToRootKey", logs: logs, sub: sub}, nil +} + +// WatchLinkWalletToRootKey is a free log subscription operation binding the contract event 0x64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b5721. +// +// Solidity: event LinkWalletToRootKey(address indexed wallet, address indexed rootKey) +func (_WalletLink *WalletLinkFilterer) WatchLinkWalletToRootKey(opts *bind.WatchOpts, sink chan<- *WalletLinkLinkWalletToRootKey, wallet []common.Address, rootKey []common.Address) (event.Subscription, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var rootKeyRule []interface{} + for _, rootKeyItem := range rootKey { + rootKeyRule = append(rootKeyRule, rootKeyItem) + } + + logs, sub, err := _WalletLink.contract.WatchLogs(opts, "LinkWalletToRootKey", walletRule, rootKeyRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(WalletLinkLinkWalletToRootKey) + if err := _WalletLink.contract.UnpackLog(event, "LinkWalletToRootKey", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseLinkWalletToRootKey is a log parse operation binding the contract event 0x64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b5721. +// +// Solidity: event LinkWalletToRootKey(address indexed wallet, address indexed rootKey) +func (_WalletLink *WalletLinkFilterer) ParseLinkWalletToRootKey(log types.Log) (*WalletLinkLinkWalletToRootKey, error) { + event := new(WalletLinkLinkWalletToRootKey) + if err := _WalletLink.contract.UnpackLog(event, "LinkWalletToRootKey", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// WalletLinkRemoveLinkIterator is returned from FilterRemoveLink and is used to iterate over the raw logs and unpacked data for RemoveLink events raised by the WalletLink contract. +type WalletLinkRemoveLinkIterator struct { + Event *WalletLinkRemoveLink // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *WalletLinkRemoveLinkIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(WalletLinkRemoveLink) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(WalletLinkRemoveLink) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *WalletLinkRemoveLinkIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *WalletLinkRemoveLinkIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// WalletLinkRemoveLink represents a RemoveLink event raised by the WalletLink contract. +type WalletLinkRemoveLink struct { + Wallet common.Address + SecondWallet common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRemoveLink is a free log retrieval operation binding the contract event 0x9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da2. +// +// Solidity: event RemoveLink(address indexed wallet, address indexed secondWallet) +func (_WalletLink *WalletLinkFilterer) FilterRemoveLink(opts *bind.FilterOpts, wallet []common.Address, secondWallet []common.Address) (*WalletLinkRemoveLinkIterator, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var secondWalletRule []interface{} + for _, secondWalletItem := range secondWallet { + secondWalletRule = append(secondWalletRule, secondWalletItem) + } + + logs, sub, err := _WalletLink.contract.FilterLogs(opts, "RemoveLink", walletRule, secondWalletRule) + if err != nil { + return nil, err + } + return &WalletLinkRemoveLinkIterator{contract: _WalletLink.contract, event: "RemoveLink", logs: logs, sub: sub}, nil +} + +// WatchRemoveLink is a free log subscription operation binding the contract event 0x9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da2. +// +// Solidity: event RemoveLink(address indexed wallet, address indexed secondWallet) +func (_WalletLink *WalletLinkFilterer) WatchRemoveLink(opts *bind.WatchOpts, sink chan<- *WalletLinkRemoveLink, wallet []common.Address, secondWallet []common.Address) (event.Subscription, error) { + + var walletRule []interface{} + for _, walletItem := range wallet { + walletRule = append(walletRule, walletItem) + } + var secondWalletRule []interface{} + for _, secondWalletItem := range secondWallet { + secondWalletRule = append(secondWalletRule, secondWalletItem) + } + + logs, sub, err := _WalletLink.contract.WatchLogs(opts, "RemoveLink", walletRule, secondWalletRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(WalletLinkRemoveLink) + if err := _WalletLink.contract.UnpackLog(event, "RemoveLink", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRemoveLink is a log parse operation binding the contract event 0x9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da2. +// +// Solidity: event RemoveLink(address indexed wallet, address indexed secondWallet) +func (_WalletLink *WalletLinkFilterer) ParseRemoveLink(log types.Log) (*WalletLinkRemoveLink, error) { + event := new(WalletLinkRemoveLink) + if err := _WalletLink.contract.UnpackLog(event, "RemoveLink", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/core/xchain/create_multi.sh b/core/xchain/create_multi.sh new file mode 100755 index 000000000..381d4b524 --- /dev/null +++ b/core/xchain/create_multi.sh @@ -0,0 +1,113 @@ +#!/bin/bash +set -euo pipefail + +# Skip script execution if running in a CI environment +if [ -z "${CI:-}" ]; then + # Check if Homebrew is installed + if ! command -v brew &> /dev/null; then + echo "Homebrew is not installed. Installing Homebrew first..." + # Download and execute Homebrew installation script + # Handle potential failure in downloading the script + if ! /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"; then + echo "Failed to install Homebrew." + exit 1 + fi + fi + + # Install yq using Homebrew if not present + if ! command -v yq &> /dev/null; then + echo "yq is not installed. Installing it using Homebrew..." + if ! brew install yq; then + echo "Failed to install yq." + exit 1 + fi + echo "yq installed successfully." + fi + + # Install yq using Homebrew if not present + if ! command -v jq &> /dev/null; then + echo "jq is not installed. Installing it using Homebrew..." + if ! brew install jq; then + echo "Failed to install jq." + exit 1 + fi + echo "jq installed successfully." + fi +fi + +# Change the current working directory to the directory of the script +cd "$(dirname "$0")" + + +: ${RUN_ENV:?} +: ${RIVER_ENV:?} + +BASE_CHAIN_URL="ws://localhost:8545" +BASE_REGISTRY_ADDRESS=$(jq -r '.address' ../../packages/generated/deployments/${RIVER_ENV}/base/addresses/baseRegistry.json) +SPACE_FACTORY_ADDRESS=$(jq -r '.address' ../../packages/generated/deployments/${RIVER_ENV}/base/addresses/spaceFactory.json) +ENTITLEMENT_TEST_ADDRESS=$(jq -r '.address' ../../packages/generated/deployments/${RIVER_ENV}/base/addresses/entitlementGatedExample.json) +CUSTOM_ENTITLEMENT_TEST_ADDRESS=$(jq -r '.address' ../../packages/generated/deployments/${RIVER_ENV}/base/addresses/customEntitlementExample.json) +BASE_CHAIN_ID=31337 + +make + +# Number of instances +N=5 + +# Base directory for the instances +BASE_DIR="./run_files/${RUN_ENV}" + + + +mkdir -p "${BASE_DIR}" + +# Loop to create N instances in parallel +for (( i=1; i<=N; i++ )) +do + ( + # Directory for this instance + INSTANCE_DIR="${BASE_DIR}/instance_${i}" + + if [ -d "${INSTANCE_DIR}" ]; then + rm -rf "${INSTANCE_DIR}" + fi + # Create the directory structure + mkdir -p "${INSTANCE_DIR}/bin" "${INSTANCE_DIR}/logs" "${INSTANCE_DIR}/config" "${INSTANCE_DIR}/wallet" + + # Copy node binary and config template + cp "./bin/xchain_node" "${INSTANCE_DIR}/bin" + cp default_config.yaml "${INSTANCE_DIR}/config/config.yaml" + + # Substitute METRIC_PORT and create config.yaml + METRICS_PORT=$((9080 + i)) + + echo "Creating instance_${i}" + + yq eval ".metrics.port = \"$METRICS_PORT\"" -i "${INSTANCE_DIR}/config/config.yaml" + yq eval ".entitlement_contract.url = \"$BASE_CHAIN_URL\"" -i "${INSTANCE_DIR}/config/config.yaml" + yq eval ".entitlement_contract.address = \"$BASE_REGISTRY_ADDRESS\"" -i "${INSTANCE_DIR}/config/config.yaml" + yq eval ".entitlement_contract.chainId = \"$BASE_CHAIN_ID\"" -i "${INSTANCE_DIR}/config/config.yaml" + yq eval ".wallet_link_contract.url = \"$BASE_CHAIN_URL\"" -i "${INSTANCE_DIR}/config/config.yaml" + yq eval ".wallet_link_contract.address = \"$SPACE_FACTORY_ADDRESS\"" -i "${INSTANCE_DIR}/config/config.yaml" + yq eval ".wallet_link_contract.chainId = \"$BASE_CHAIN_ID\"" -i "${INSTANCE_DIR}/config/config.yaml" + yq eval ".test_contract.url = \"$BASE_CHAIN_URL\"" -i "${INSTANCE_DIR}/config/config.yaml" + yq eval ".test_contract.address = \"$ENTITLEMENT_TEST_ADDRESS\"" -i "${INSTANCE_DIR}/config/config.yaml" + yq eval ".test_contract.chainId = \"$BASE_CHAIN_ID\"" -i "${INSTANCE_DIR}/config/config.yaml" + yq eval ".test_custom_entitlement_contract.url = \"$BASE_CHAIN_URL\"" -i "${INSTANCE_DIR}/config/config.yaml" + yq eval ".test_custom_entitlement_contract.address = \"$CUSTOM_ENTITLEMENT_TEST_ADDRESS\"" -i "${INSTANCE_DIR}/config/config.yaml" + yq eval ".test_custom_entitlement_contract.chainId = \"$BASE_CHAIN_ID\"" -i "${INSTANCE_DIR}/config/config.yaml" + + yq eval ".log.level = \"debug\"" -i "${INSTANCE_DIR}/config/config.yaml" + + pushd "${INSTANCE_DIR}" + # Run each process with 'generate_key' argument + "./bin/xchain_node" genkey + + popd + ) & +done + +# Wait for all background processes to finish +wait + +echo "All instances created." diff --git a/core/xchain/default_config.yaml b/core/xchain/default_config.yaml new file mode 100644 index 000000000..7f9f9f5f8 --- /dev/null +++ b/core/xchain/default_config.yaml @@ -0,0 +1,34 @@ +chains: '31337:http://localhost:8545,31338:http://localhost:8546,84532:https://sepolia.base.org,11155111:https://ethereum-sepolia-rpc.publicnode.com' +history: 30s +entitlement_contract: + url: '' + chainId: '' + address: '' +test_contract: + url: '' + chainId: '' + address: '' +architectContract: + address: '' + version: '' +wallet_link_contract: + address: '' + version: '' +log: + file: logs/dev.log + level: info + console: true + noColor: false + format: text +metrics: + enabled: true + port: '9081' +# Blockchain configuration +baseChain: + chainId: 31337 + networkUrl: 'http://127.0.0.1:8545' + blockTimeMs: 2000 +riverChain: + chainId: 31338 + networkUrl: 'http://127.0.0.1:8546' + blockTimeMs: 2000 diff --git a/core/xchain/entitlement/check_operation.go b/core/xchain/entitlement/check_operation.go new file mode 100644 index 000000000..17982ec63 --- /dev/null +++ b/core/xchain/entitlement/check_operation.go @@ -0,0 +1,242 @@ +package entitlement + +import ( + "context" + "core/xchain/bindings/erc20" + "core/xchain/bindings/erc721" + "core/xchain/config" + "core/xchain/contracts" + "fmt" + "math/big" + "sync" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/infra" +) + +var ( + clientsOnce sync.Once + clients BlockchainClientPool +) + +func Init(ctx context.Context, cfg *config.Config) error { + var err error + clientsOnce.Do(func() { + clients, err = NewBlockchainClientPool(ctx, cfg) + }) + return err +} + +func evaluateCheckOperation( + ctx context.Context, + cfg *config.Config, + op *CheckOperation, + linkedWallets []common.Address, +) (bool, error) { + switch op.CheckType { + case MOCK: + defer infra.StoreExecutionTimeMetrics("evaluateMockOperation", infra.CONTRACT_CALLS_CATEGORY, time.Now()) + return evaluateMockOperation(ctx, op) + case ISENTITLED: + defer infra.StoreExecutionTimeMetrics("evaluateIsEntitledOperation", infra.CONTRACT_CALLS_CATEGORY, time.Now()) + return evaluateIsEntitledOperation(ctx, cfg, op, linkedWallets) + case ERC20: + defer infra.StoreExecutionTimeMetrics("evaluateErc20Operation", infra.CONTRACT_CALLS_CATEGORY, time.Now()) + return evaluateErc20Operation(ctx, cfg, op, linkedWallets) + case ERC721: + defer infra.StoreExecutionTimeMetrics("evaluateErc721Operation", infra.CONTRACT_CALLS_CATEGORY, time.Now()) + return evaluateErc721Operation(ctx, cfg, op, linkedWallets) + case ERC1155: + defer infra.StoreExecutionTimeMetrics("evaluateErc1155Operation", infra.CONTRACT_CALLS_CATEGORY, time.Now()) + return evaluateErc1155Operation(ctx, op) + case CheckNONE: + fallthrough + default: + return false, fmt.Errorf("unknown operation") + } +} + +func evaluateMockOperation(ctx context.Context, + op *CheckOperation, +) (bool, error) { + delay := int(op.Threshold.Int64()) + + result := awaitTimeout(ctx, func() error { + delayDuration := time.Duration(delay) * time.Millisecond + time.Sleep(delayDuration) // simulate a long-running operation + return nil + }) + if result != nil { + return false, result + } + if op.ChainID.Sign() != 0 { + return true, nil + } else { + return false, nil + } +} + +func evaluateIsEntitledOperation( + ctx context.Context, + cfg *config.Config, + op *CheckOperation, + linkedWallets []common.Address, +) (bool, error) { + log := dlog.FromCtx(ctx).With("function", "evaluateErc20Operation") + client, err := clients.Get(op.ChainID.Uint64()) + if err != nil { + log.Error("Chain ID not found", "chainID", op.ChainID) + return false, fmt.Errorf("evaluateErc20Operation: Chain ID %v not found", op.ChainID) + } + + customEntitlementChecker, err := contracts.NewICustomEntitlement( + op.ContractAddress, + client, + cfg.GetContractVersion(), + ) + if err != nil { + log.Error("Failed to instantiate a CustomEntitlement contract from supplied contract address", + "err", err, + "contractAddress", op.ContractAddress, + "chainId", op.ChainID, + ) + return false, err + } + for _, wallet := range linkedWallets { + // Check if the caller is entitled + isEntitled, err := customEntitlementChecker.IsEntitled( + &bind.CallOpts{Context: ctx}, + []common.Address{wallet}, + ) + if err != nil { + log.Error("Failed to check if caller is entitled", + "error", err, + "contractAddress", op.ContractAddress, + "wallet", wallet, + "channelId", op.ChannelId, + "permission", op.Permission, + "chainId", op.ChainID, + ) + return false, err + } + if isEntitled { + return true, nil + } + } + return false, nil +} + +func evaluateErc20Operation( + ctx context.Context, + cfg *config.Config, + op *CheckOperation, + linkedWallets []common.Address, +) (bool, error) { + log := dlog.FromCtx(ctx).With("function", "evaluateErc20Operation") + client, err := clients.Get(op.ChainID.Uint64()) + if err != nil { + log.Error("Chain ID not found", "chainID", op.ChainID) + return false, fmt.Errorf("evaluateErc20Operation: Chain ID %v not found", op.ChainID) + } + + // Create a new instance of the token contract + token, err := erc20.NewErc20Caller(op.ContractAddress, client) + if err != nil { + log.Error( + "Failed to instantiate a Token contract", + "err", err, + "contractAddress", op.ContractAddress, + ) + return false, err + } + + total := big.NewInt(0) + + for _, wallet := range linkedWallets { + // Balance is returned as a representation of the balance according to the token's decimals, + // which stores the balance in exponentiated form. + // Default decimals for most tokens is 18, meaning the balance is stored as balance * 10^18. + balance, err := token.BalanceOf(&bind.CallOpts{Context: ctx}, wallet) + if err != nil { + log.Error("Failed to retrieve token balance", "error", err) + return false, err + } + total.Add(total, balance) + + log.Debug("Retrieved ERC20 token balance", + "balance", balance.String(), + "total", total.String(), + "threshold", op.Threshold.String(), + "chainID", op.ChainID.String(), + "erc20ContractAddress", op.ContractAddress.String(), + ) + + // Balance is a *big.Int + // Iteratively check if the total balance of evaluated wallets is greater than or equal to the threshold + if op.Threshold.Sign() > 0 && total.Sign() > 0 && total.Cmp(op.Threshold) >= 0 { + return true, nil + } + } + return false, nil +} + +func evaluateErc721Operation( + ctx context.Context, + cfg *config.Config, + op *CheckOperation, + linkedWallets []common.Address, +) (bool, error) { + log := dlog.FromCtx(ctx).With("function", "evaluateErc721Operation") + + client, err := clients.Get(op.ChainID.Uint64()) + if err != nil { + log.Error("Chain ID not found", "chainID", op.ChainID) + return false, fmt.Errorf("evaluateErc20Operation: Chain ID %v not found", op.ChainID) + } + + nft, err := erc721.NewErc721Caller(op.ContractAddress, client) + if err != nil { + log.Error("Failed to instantiate a NFT contract", + "err", err, + "contractAddress", op.ContractAddress, + ) + return false, err + } + + total := big.NewInt(0) + for _, wallet := range linkedWallets { + tokenBalance, err := nft.BalanceOf(&bind.CallOpts{Context: ctx}, wallet) + if err != nil { + log.Error("Failed to retrieve NFT balance", + "error", err, + "contractAddress", op.ContractAddress, + "wallet", wallet, + ) + return false, err + } + + // Accumulate the total balance across evaluated wallets + total.Add(total, tokenBalance) + // log.Info("Retrieved ERC721 token balance for wallet", + // "balance", tokenBalance.String(), + // "total", total.String(), + // "threshold", op.Threshold.String(), + // "wallet", wallet, + // ) + + // Iteratively check if the total balance of evaluated wallets is greater than or equal to the threshold + if total.Cmp(op.Threshold) >= 0 { + return true, nil + } + } + return false, err +} + +func evaluateErc1155Operation(ctx context.Context, + op *CheckOperation, +) (bool, error) { + return false, fmt.Errorf("ERC1155 not implemented") +} diff --git a/core/xchain/entitlement/client_pool.go b/core/xchain/entitlement/client_pool.go new file mode 100644 index 000000000..75e25ead0 --- /dev/null +++ b/core/xchain/entitlement/client_pool.go @@ -0,0 +1,70 @@ +package entitlement + +import ( + "context" + "core/xchain/config" + + "github.com/ethereum/go-ethereum/ethclient" + . "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/dlog" + . "github.com/river-build/river/core/node/protocol" +) + +type ( + // BlockchainClientPool is a pool of reusable blockchain clients + BlockchainClientPool interface { + Get(chainID uint64) (crypto.BlockchainClient, error) + } + + // blockchainClientPoolImpl is a basic implementation of BlockchainClientPool and uses ethclient.Client as + // blockchain clients. + blockchainClientPoolImpl struct { + clients map[uint64]crypto.BlockchainClient + } +) + +// NewBlockchainClientPool creates a new blockchain client pool for the chains in the given cfg. +// It uses ethclient.Client instances that are safe to use concurrently. Therefor the pool keeps a reference to each +// client and there is no need for callers to return the obtained client back to the pool after use. +func NewBlockchainClientPool(ctx context.Context, cfg *config.Config) (BlockchainClientPool, error) { + log := dlog.FromCtx(ctx) + clients := make(map[uint64]crypto.BlockchainClient) + for chainID, endpoint := range cfg.Chains { + if _, got := clients[chainID]; got { + return nil, RiverError(Err_BAD_CONFIG, "Duplicate chain in configuration").Tag("chainId", chainID) + } + + client, err := ethclient.DialContext(ctx, endpoint) + if err != nil { + log.Warn("Unable to dial endpoint", "chainId", chainID, "endpoint", endpoint, "err", err) + continue + } + + // make sure that the endpoint points to the correct endpoint + fetchedChainID, err := client.ChainID(ctx) + if err != nil { + client.Close() + log.Warn("Unable to connect to endpoint", "chainId", chainID, "endpoint", endpoint, "err", err) + continue + } + if fetchedChainID.Uint64() != chainID { + log.Warn("Chain points to different endpoint", "chainId", chainID, "gotChainId", fetchedChainID, "url", endpoint) + client.Close() + continue + } + + clients[chainID] = client + } + + return &blockchainClientPoolImpl{clients: clients}, nil +} + +// Get a blockchain client that connects to the chain identified by the given chainID. +// Callers don't have to return the client back to the pool after use. +func (pool *blockchainClientPoolImpl) Get(chainID uint64) (crypto.BlockchainClient, error) { + if client, ok := pool.clients[chainID]; ok { + return client, nil + } + return nil, RiverError(Err_NOT_FOUND, "Unsupported chain").Tag("chainID", chainID) +} diff --git a/core/xchain/entitlement/entitlement.go b/core/xchain/entitlement/entitlement.go new file mode 100644 index 000000000..47132c750 --- /dev/null +++ b/core/xchain/entitlement/entitlement.go @@ -0,0 +1,364 @@ +package entitlement + +import ( + "context" + "core/xchain/config" + "errors" + "fmt" + "math/big" + "sync" + + er "core/xchain/contracts" + + "github.com/ethereum/go-ethereum/common" + "github.com/river-build/river/core/node/dlog" +) + +func EvaluateRuleData( + ctx context.Context, + cfg *config.Config, + linkedWallets []common.Address, + ruleData *er.IRuleData, +) (bool, error) { + log := dlog.FromCtx(ctx) + log.Debug("Evaluating rule data", "ruleData", ruleData) + opTree, err := getOperationTree(ctx, ruleData) + if err != nil { + return false, err + } + return evaluateOp(ctx, cfg, opTree, linkedWallets) +} + +// OperationType Enum +type OperationType int + +const ( + NONE OperationType = iota + CHECK + LOGICAL +) + +// CheckOperationType Enum +type CheckOperationType int + +const ( + CheckNONE CheckOperationType = iota + MOCK // MOCK is a mock operation type for testing + ERC20 + ERC721 + ERC1155 + ISENTITLED +) + +// LogicalOperationType Enum +type LogicalOperationType int + +const ( + LogNONE LogicalOperationType = iota + AND + OR +) + +type Operation interface { + GetOpType() OperationType +} + +type CheckOperation struct { + Operation // Embedding Operation interface + OpType OperationType + CheckType CheckOperationType + ChainID *big.Int + ContractAddress common.Address + Threshold *big.Int + ChannelId [32]byte + Permission string +} + +func (c *CheckOperation) GetOpType() OperationType { + return c.OpType +} + +type LogicalOperation interface { + Operation // Embedding Operation interface + GetLogicalType() LogicalOperationType + GetLeftOperation() Operation + GetRightOperation() Operation + SetLeftOperation(Operation) + SetRightOperation(Operation) +} + +type OrOperation struct { + LogicalOperation // Embedding LogicalOperation interface + OpType OperationType + LogicalType LogicalOperationType + LeftOperation Operation + RightOperation Operation +} + +func (o *OrOperation) GetOpType() OperationType { + return o.OpType +} + +func (o *OrOperation) GetLogicalType() LogicalOperationType { + return o.LogicalType +} + +func (o *OrOperation) GetLeftOperation() Operation { + return o.LeftOperation +} + +func (o *OrOperation) GetRightOperation() Operation { + return o.RightOperation +} + +func (o *OrOperation) SetLeftOperation(left Operation) { + o.LeftOperation = left +} + +func (o *OrOperation) SetRightOperation(right Operation) { + o.RightOperation = right +} + +type AndOperation struct { + LogicalOperation // Embedding LogicalOperation interface + OpType OperationType + LogicalType LogicalOperationType + LeftOperation Operation + RightOperation Operation +} + +func (a *AndOperation) GetOpType() OperationType { + return a.OpType +} + +func (a *AndOperation) GetLogicalType() LogicalOperationType { + return a.LogicalType +} + +func (a *AndOperation) GetLeftOperation() Operation { + return a.LeftOperation +} + +func (a *AndOperation) GetRightOperation() Operation { + return a.RightOperation +} + +func (a *AndOperation) SetLeftOperation(left Operation) { + a.LeftOperation = left +} + +func (a *AndOperation) SetRightOperation(right Operation) { + a.RightOperation = right +} + +func getOperationTree(ctx context.Context, + ruleData *er.IRuleData) (Operation, error) { + log := dlog.FromCtx(ctx) + decodedOperations := []Operation{} + log.Debug("Decoding operations", "ruleData", ruleData) + for _, operation := range ruleData.Operations { + if OperationType(operation.OpType) == CHECK { + checkOperation := ruleData.CheckOperations[operation.Index] + decodedOperations = append(decodedOperations, &CheckOperation{ + OpType: CHECK, + CheckType: CheckOperationType(checkOperation.OpType), + ChainID: checkOperation.ChainId, + ContractAddress: checkOperation.ContractAddress, + Threshold: checkOperation.Threshold, + }) + } else if OperationType(operation.OpType) == LOGICAL { + logicalOperation := ruleData.LogicalOperations[operation.Index] + if LogicalOperationType(logicalOperation.LogOpType) == AND { + decodedOperations = append(decodedOperations, &AndOperation{ + OpType: LOGICAL, + LogicalType: LogicalOperationType(logicalOperation.LogOpType), + LeftOperation: decodedOperations[logicalOperation.LeftOperationIndex], + RightOperation: decodedOperations[logicalOperation.RightOperationIndex], + }) + } else if LogicalOperationType(logicalOperation.LogOpType) == OR { + decodedOperations = append(decodedOperations, &OrOperation{ + OpType: LOGICAL, + LogicalType: LogicalOperationType(logicalOperation.LogOpType), + LeftOperation: decodedOperations[logicalOperation.LeftOperationIndex], + RightOperation: decodedOperations[logicalOperation.RightOperationIndex], + }) + } else { + return nil, errors.New("Unknown logical operation type") + } + } else { + return nil, errors.New("Unknown logical operation type") + } + log.Debug("Decoded operation", "operation", operation, "decodedOperations", decodedOperations) + } + + var stack []Operation + + for _, op := range decodedOperations { + if OperationType(op.GetOpType()) == LOGICAL { + if len(stack) < 2 { + return nil, errors.New("Invalid post-order array, not enough operands") + } + right := stack[len(stack)-1] + left := stack[len(stack)-2] + stack = stack[:len(stack)-2] + + if logicalOp, ok := op.(LogicalOperation); ok { + logicalOp.SetLeftOperation(left) + logicalOp.SetRightOperation(right) + stack = append(stack, logicalOp) + } else { + return nil, errors.New("Unknown logical operation type") + } + } else if OperationType(op.GetOpType()) == CHECK { + stack = append(stack, op) + } else { + return nil, errors.New("Unknown operation type") + } + log.Debug("decodedOperation", "op", op, "stack", stack) + } + + if len(stack) != 1 { + return nil, errors.New("Invalid post-order array") + } + + return stack[0], nil +} + +func evaluateAndOperation( + ctx context.Context, + cfg *config.Config, + op *AndOperation, + linkedWallets []common.Address, +) (bool, error) { + if op.LeftOperation == nil || op.RightOperation == nil { + return false, fmt.Errorf("operation is nil") + } + leftCtx, leftCancel := context.WithCancel(ctx) + rightCtx, rightCancel := context.WithCancel(ctx) + leftResult := false + leftErr := error(nil) + rightResult := false + rightErr := error(nil) + wg := sync.WaitGroup{} + wg.Add(2) + defer leftCancel() + defer rightCancel() + go func() { + leftResult, leftErr = evaluateOp(leftCtx, cfg, op.LeftOperation, linkedWallets) + if !leftResult || leftErr != nil { + // cancel the other goroutine + // if the left result is false or there is an error + rightCancel() + } + wg.Done() + }() + + go func() { + rightResult, rightErr = evaluateOp(rightCtx, cfg, op.RightOperation, linkedWallets) + if !rightResult || rightErr != nil { + // cancel the other goroutine + // if the right result is false or there is an error + leftCancel() + } + wg.Done() + }() + + wg.Wait() + return leftResult && rightResult, nil +} + +func evaluateOrOperation( + ctx context.Context, + cfg *config.Config, + op *OrOperation, + linkedWallets []common.Address, +) (bool, error) { + if op.LeftOperation == nil || op.RightOperation == nil { + return false, fmt.Errorf("operation is nil") + } + leftCtx, leftCancel := context.WithCancel(ctx) + rightCtx, rightCancel := context.WithCancel(ctx) + leftResult := false + leftErr := error(nil) + rightResult := false + rightErr := error(nil) + wg := sync.WaitGroup{} + wg.Add(2) + defer leftCancel() + defer rightCancel() + go func() { + leftResult, leftErr = evaluateOp(leftCtx, cfg, op.LeftOperation, linkedWallets) + if leftResult || leftErr != nil { + // cancel the other goroutine + // if the left result is true or there is an error + rightCancel() + } + wg.Done() + }() + + go func() { + rightResult, rightErr = evaluateOp(rightCtx, cfg, op.RightOperation, linkedWallets) + if rightResult || rightErr != nil { + // cancel the other goroutine + // if the right result is true or there is an error + leftCancel() + } + wg.Done() + }() + + wg.Wait() + return leftResult || rightResult, nil +} + +func awaitTimeout(ctx context.Context, f func() error) error { + doneCh := make(chan error, 1) + + go func() { + doneCh <- f() + }() + + select { + case <-ctx.Done(): + // If the context was cancelled or expired, return an error + return fmt.Errorf("operation cancelled: %w", ctx.Err()) + case err := <-doneCh: + // If the function finished executing, return its result + return err + } +} + +func evaluateOp( + ctx context.Context, + cfg *config.Config, + op Operation, + linkedWallets []common.Address, +) (bool, error) { + if op == nil { + return false, fmt.Errorf("operation is nil") + } + + switch op.GetOpType() { + case CHECK: + checkOp := (op).(*CheckOperation) + return evaluateCheckOperation(ctx, cfg, checkOp, linkedWallets) + case LOGICAL: + logicalOp := (op).(LogicalOperation) + + switch logicalOp.GetLogicalType() { + case AND: + andOp := (op).(*AndOperation) + return evaluateAndOperation(ctx, cfg, andOp, linkedWallets) + case OR: + orOp := (op).(*OrOperation) + return evaluateOrOperation(ctx, cfg, orOp, linkedWallets) + case LogNONE: + fallthrough + default: + return false, fmt.Errorf("invalid LogicalOperation type") + } + case NONE: + fallthrough + default: + return false, fmt.Errorf("invalid Operation type") + } +} diff --git a/core/xchain/entitlement/entitlement_test.go b/core/xchain/entitlement/entitlement_test.go new file mode 100644 index 000000000..1ca6fb19f --- /dev/null +++ b/core/xchain/entitlement/entitlement_test.go @@ -0,0 +1,372 @@ +package entitlement + +import ( + "context" + "core/xchain/config" + "core/xchain/examples" + "math/big" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/common" +) + +const ( + slow = 500 + fast = 10 +) + +var fastTrueCheck = CheckOperation{ + OpType: CHECK, + CheckType: CheckOperationType(MOCK), + ChainID: big.NewInt(1), + ContractAddress: common.Address{}, + Threshold: big.NewInt(fast), +} + +var slowTrueCheck = CheckOperation{ + OpType: CHECK, + CheckType: CheckOperationType(MOCK), + ChainID: big.NewInt(1), + ContractAddress: common.Address{}, + Threshold: big.NewInt(slow), +} + +var fastFalseCheck = CheckOperation{ + OpType: CHECK, + CheckType: CheckOperationType(MOCK), + ChainID: big.NewInt(0), + ContractAddress: common.Address{}, + Threshold: big.NewInt(fast), +} + +var slowFalseCheck = CheckOperation{ + OpType: CHECK, + CheckType: CheckOperationType(MOCK), + ChainID: big.NewInt(0), + ContractAddress: common.Address{}, + Threshold: big.NewInt(slow), +} + +var ( + // Token decimals for LINK + ChainlinkExp = new(big.Int).Exp(big.NewInt(10), big.NewInt(18), nil) + + // Constants to define LINK token amounts exponentiated by the token's decimals + TwentyChainlinkTokens = new(big.Int).Mul(big.NewInt(20), ChainlinkExp) + ThirtyChainlinkTokens = new(big.Int).Mul(big.NewInt(30), ChainlinkExp) + SixtyChainlinkTokens = new(big.Int).Mul(big.NewInt(60), ChainlinkExp) + + // These wallets have been loaded with custom test NFTs on ethereum sepolia and base sepolia, contract + // addresses defined below. They have the same balance of NFTs on both networks. + sepoliaTestNftWallet_1Token = common.HexToAddress("0x1FDBA84c2153568bc22686B88B617CF64cdb0637") + sepoliaTestNftWallet_3Tokens = common.HexToAddress("0xB79Af997239A334355F60DBeD75bEDf30AcD37bD") + sepoliaTestNftWallet_2Tokens = common.HexToAddress("0x8cECcB1e5537040Fc63A06C88b4c1dE61880dA4d") + // This wallet has been kept void of nfts on all testnets. + sepoliaTestNoNftsWallet = examples.SepoliaChainlinkWallet +) + +var erc20TrueCheckBaseSepolia = CheckOperation{ + OpType: CHECK, + CheckType: CheckOperationType(ERC20), + ChainID: examples.BaseSepoliaChainId, + ContractAddress: examples.BaseSepoliaChainlinkContract, + Threshold: TwentyChainlinkTokens, +} + +var erc20FalseCheckBaseSepolia = CheckOperation{ + OpType: CHECK, + CheckType: CheckOperationType(ERC20), + ChainID: examples.BaseSepoliaChainId, + ContractAddress: examples.BaseSepoliaChainlinkContract, + Threshold: ThirtyChainlinkTokens, +} + +var erc20TrueCheckEthereumSepolia = CheckOperation{ + OpType: CHECK, + CheckType: CheckOperationType(ERC20), + ChainID: examples.EthSepoliaChainId, + ContractAddress: examples.EthSepoliaChainlinkContract, + Threshold: TwentyChainlinkTokens, +} + +var erc20FalseCheckEthereumSepolia = CheckOperation{ + OpType: CHECK, + CheckType: CheckOperationType(ERC20), + ChainID: examples.EthSepoliaChainId, + ContractAddress: examples.EthSepoliaChainlinkContract, + Threshold: SixtyChainlinkTokens, +} + +// These nft checks will be true or false depending on caller address. +var nftCheckEthereumSepolia = CheckOperation{ + OpType: CHECK, + CheckType: CheckOperationType(ERC721), + ChainID: examples.EthSepoliaChainId, + ContractAddress: examples.EthSepoliaTestNftContract, + Threshold: big.NewInt(1), +} + +var nftMultiCheckEthereumSepolia = CheckOperation{ + OpType: CHECK, + CheckType: CheckOperationType(ERC721), + ChainID: examples.EthSepoliaChainId, + ContractAddress: examples.EthSepoliaTestNftContract, + Threshold: big.NewInt(6), +} + +var nftMultiCheckHighThresholdEthereumSepolia = CheckOperation{ + OpType: CHECK, + CheckType: CheckOperationType(ERC721), + ChainID: examples.EthSepoliaChainId, + ContractAddress: examples.EthSepoliaTestNftContract, + Threshold: big.NewInt(10), +} + +var nftCheckBaseSepolia = CheckOperation{ + OpType: CHECK, + CheckType: CheckOperationType(ERC721), + ChainID: examples.BaseSepoliaChainId, + ContractAddress: examples.BaseSepoliaTestNftContract, + Threshold: big.NewInt(1), +} + +var nftMultiCheckBaseSepolia = CheckOperation{ + OpType: CHECK, + CheckType: CheckOperationType(ERC721), + ChainID: examples.BaseSepoliaChainId, + ContractAddress: examples.EthSepoliaTestNftContract, + Threshold: big.NewInt(6), +} + +var nftMultiCheckHighThresholdBaseSepolia = CheckOperation{ + OpType: CHECK, + CheckType: CheckOperationType(ERC721), + ChainID: examples.BaseSepoliaChainId, + ContractAddress: examples.EthSepoliaTestNftContract, + Threshold: big.NewInt(10), +} + +var chains = map[uint64]string{ + examples.BaseSepoliaChainId.Uint64(): "https://sepolia.base.org", + examples.EthSepoliaChainId.Uint64(): "https://ethereum-sepolia-rpc.publicnode.com", +} + +var cfg = &config.Config{ + Chains: chains, +} + +func TestAndOperation(t *testing.T) { + testCases := []struct { + a Operation + b Operation + expected bool + expectedTime int32 + }{ + {&fastTrueCheck, &fastTrueCheck, true, fast}, + {&fastTrueCheck, &slowTrueCheck, true, slow}, + {&slowTrueCheck, &fastTrueCheck, true, slow}, + {&slowTrueCheck, &slowTrueCheck, true, slow}, + {&fastFalseCheck, &fastFalseCheck, false, fast}, + {&slowFalseCheck, &slowFalseCheck, false, slow}, + {&slowFalseCheck, &fastFalseCheck, false, fast}, + {&fastFalseCheck, &slowFalseCheck, false, fast}, + {&fastTrueCheck, &fastFalseCheck, false, fast}, + {&fastTrueCheck, &slowFalseCheck, false, slow}, + {&slowTrueCheck, &fastFalseCheck, false, fast}, + {&slowTrueCheck, &slowFalseCheck, false, slow}, + } + + for idx, tc := range testCases { + tree := &AndOperation{ + OpType: LOGICAL, + LogicalType: LogicalOperationType(AND), + LeftOperation: tc.a, + RightOperation: tc.b, + } + startTime := time.Now() // Get the current time + + callerAddress := common.Address{} + + result, error := evaluateOp(context.Background(), cfg, tree, []common.Address{callerAddress}) + elapsedTime := time.Since(startTime) + if error != nil { + t.Errorf("evaluateAndOperation(%v) = %v; want %v", idx, error, nil) + } + if result != tc.expected { + t.Errorf("evaluateAndOperation(%v) = %v; want %v", idx, result, tc.expected) + } + if !areDurationsClose( + elapsedTime, + time.Duration(tc.expectedTime*int32(time.Millisecond)), + 10*time.Millisecond, + ) { + t.Errorf("evaluateAndOperation(%v) took %v; want %v", idx, elapsedTime, time.Duration(tc.expectedTime)) + } + } +} + +func TestOrOperation(t *testing.T) { + testCases := []struct { + a Operation + b Operation + expected bool + expectedTime int32 + }{ + {&fastTrueCheck, &fastTrueCheck, true, fast}, + {&fastTrueCheck, &slowTrueCheck, true, fast}, + {&slowTrueCheck, &fastTrueCheck, true, fast}, + {&slowTrueCheck, &slowTrueCheck, true, slow}, + {&fastFalseCheck, &fastFalseCheck, false, fast}, + {&slowFalseCheck, &slowFalseCheck, false, slow}, + {&slowFalseCheck, &fastFalseCheck, false, slow}, + {&fastFalseCheck, &slowFalseCheck, false, slow}, + {&fastTrueCheck, &fastFalseCheck, true, fast}, + {&fastTrueCheck, &slowFalseCheck, true, fast}, + {&slowTrueCheck, &fastFalseCheck, true, slow}, + {&slowTrueCheck, &slowFalseCheck, true, slow}, + } + + for idx, tc := range testCases { + tree := &OrOperation{ + OpType: LOGICAL, + LogicalType: LogicalOperationType(OR), + LeftOperation: tc.a, + RightOperation: tc.b, + } + startTime := time.Now() // Get the current time + + callerAddress := common.Address{} + + result, error := evaluateOp(context.Background(), cfg, tree, []common.Address{callerAddress}) + elapsedTime := time.Since(startTime) + if error != nil { + t.Errorf("evaluateOrOperation(%v) = %v; want %v", idx, error, nil) + } + if result != tc.expected { + t.Errorf("evaluateOrOperation(%v) = %v; want %v", idx, result, tc.expected) + } + if !areDurationsClose( + elapsedTime, + time.Duration(tc.expectedTime*int32(time.Millisecond)), + 10*time.Millisecond, + ) { + t.Errorf("evaluateOrOperation(%v) took %v; want %v", idx, elapsedTime, time.Duration(tc.expectedTime)) + } + + } +} + +func areDurationsClose(d1, d2, threshold time.Duration) bool { + diff := d1 - d2 + if diff < 0 { + diff = -diff + } + return diff <= threshold +} + +func TestCheckOperation(t *testing.T) { + testCases := []struct { + a Operation + wallets []common.Address + expected bool + expectedTime int32 + }{ + {&fastTrueCheck, []common.Address{}, true, fast}, + {&slowTrueCheck, []common.Address{}, true, slow}, + {&fastFalseCheck, []common.Address{}, false, fast}, + {&slowFalseCheck, []common.Address{}, false, slow}, + } + + require.NoError(t, Init(context.Background(), cfg), "init entitlement package") + + for _, tc := range testCases { + startTime := time.Now() // Get the current time + + result, err := evaluateOp(context.Background(), cfg, tc.a, tc.wallets) + elapsedTime := time.Since(startTime) + + if err != nil { + t.Errorf("evaluateCheckOperation error (%v) = %v; want %v", tc.a, err, nil) + } + if result != tc.expected { + t.Errorf("evaluateCheckOperation result (%v) = %v; want %v", tc.a, result, tc.expected) + } + if !areDurationsClose( + elapsedTime, + time.Duration(tc.expectedTime*int32(time.Millisecond)), + 10*time.Millisecond, + ) { + t.Errorf( + "evaluateCheckOperation(%v) took %v; want %v", + fastFalseCheck, + elapsedTime, + time.Duration(tc.expectedTime), + ) + } + } +} + +func TestCheckOperation_Untimed(t *testing.T) { + testCases := map[string]struct { + a Operation + wallets []common.Address + expected bool + }{ + // Note: these tests call out to base sepolia and ethereum sepolia, so they are not + // really unit tests. However, we've had deploy failures since anvil does not always + // behave the same as a real chain, so these tests are here to ensure that the + // entitlement checks work on base and ethereum mainnets, which is where they will happen + // in practice. + // ERC20 checks with single wallet + "ERC20 base sepolia": {&erc20TrueCheckBaseSepolia, []common.Address{examples.SepoliaChainlinkWallet}, true}, + "ERC20 base sepolia (false)": {&erc20FalseCheckBaseSepolia, []common.Address{examples.SepoliaChainlinkWallet}, false}, + "ERC20 eth sepolia": {&erc20TrueCheckEthereumSepolia, []common.Address{examples.SepoliaChainlinkWallet}, true}, + "ERC20 eth sepolia (false)": {&erc20FalseCheckEthereumSepolia, []common.Address{examples.SepoliaChainlinkWallet}, false}, + + // NFT checks with single and multiple NFTs, wallets + "ERC721 eth sepolia": {&nftCheckEthereumSepolia, []common.Address{sepoliaTestNftWallet_1Token}, true}, + "ERC721 eth sepolia (no tokens)": {&nftCheckEthereumSepolia, []common.Address{sepoliaTestNoNftsWallet}, false}, + "ERC721 eth sepolia (insufficient balance)": {&nftMultiCheckEthereumSepolia, []common.Address{sepoliaTestNftWallet_1Token}, false}, + "ERC721 multi-wallet eth sepolia": { + &nftMultiCheckEthereumSepolia, + []common.Address{sepoliaTestNftWallet_1Token, sepoliaTestNftWallet_2Tokens, sepoliaTestNftWallet_3Tokens}, + true, + }, + "ERC721 multi-wallet eth sepolia (insufficient balance)": { + &nftMultiCheckHighThresholdEthereumSepolia, + []common.Address{sepoliaTestNftWallet_1Token, sepoliaTestNftWallet_2Tokens, sepoliaTestNftWallet_3Tokens}, + false, + }, + "ERC721 base sepolia": {&nftCheckBaseSepolia, []common.Address{sepoliaTestNftWallet_1Token}, true}, + "ERC721 base sepolia (no tokens)": {&nftCheckBaseSepolia, []common.Address{sepoliaTestNoNftsWallet}, false}, + "ERC721 base sepolia (insufficient balance)": {&nftMultiCheckBaseSepolia, []common.Address{sepoliaTestNftWallet_1Token}, false}, + "ERC721 multi-wallet base sepolia": { + &nftMultiCheckEthereumSepolia, + []common.Address{sepoliaTestNftWallet_1Token, sepoliaTestNftWallet_2Tokens, sepoliaTestNftWallet_3Tokens}, + true, + }, + "ERC721 multi-wallet base sepolia (insufficient balance)": { + &nftMultiCheckHighThresholdBaseSepolia, + []common.Address{sepoliaTestNftWallet_1Token, sepoliaTestNftWallet_2Tokens, sepoliaTestNftWallet_3Tokens}, + false, + }, + } + + require.NoError(t, Init(context.Background(), cfg), "init entitlement package") + + for name, tc := range testCases { + t.Run(name, func(t *testing.T) { + result, err := evaluateOp(context.Background(), cfg, tc.a, tc.wallets) + + if err != nil { + t.Errorf("evaluateCheckOperation error (%v) = %v; want %v", tc.a, err, nil) + } + if result != tc.expected { + t.Errorf("evaluateCheckOperation result (%v) = %v; want %v", tc.a, result, tc.expected) + } + }) + } +} diff --git a/core/xchain/examples/common.go b/core/xchain/examples/common.go new file mode 100644 index 000000000..f2c68eddc --- /dev/null +++ b/core/xchain/examples/common.go @@ -0,0 +1,29 @@ +package examples + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" +) + +var ( + // These constants are used for testing the entitlement system on real world networks. xchain is + // not sufficiently tested locally by anvil, because anvil diverges from real ethereum networks + // in ways that have led to outages in the past. + BaseSepoliaChainId = big.NewInt(84532) + EthSepoliaChainId = big.NewInt(11155111) + + // This wallet has been loaded with 25 LINK tokens on base sepolia and 50 on ethereum sepolia + SepoliaChainlinkWallet = common.HexToAddress("0x4BCfC6962Ab0297aF801da21216014F53B46E991") + + // Contract addresses for LINK on base sepolia and ethereum sepolia. It's relatively easy + // to get LINK tokens from faucets on both networks. + BaseSepoliaChainlinkContract = common.HexToAddress("0xE4aB69C077896252FAFBD49EFD26B5D171A32410") + EthSepoliaChainlinkContract = common.HexToAddress("0x779877A7B0D9E8603169DdbD7836e478b4624789") + + // We have a custom NFT contract deployed to both ethereum sepolia and base sepolia where we + // can mint NFTs for testing. + // Contract addresses for the test NFT contracts. + EthSepoliaTestNftContract = common.HexToAddress("0xb088b3f2b35511A611bF2aaC13fE605d491D6C19") + BaseSepoliaTestNftContract = common.HexToAddress("0xb088b3f2b35511A611bF2aaC13fE605d491D6C19") +) diff --git a/core/xchain/fmt.sh b/core/xchain/fmt.sh new file mode 100755 index 000000000..ca18018eb --- /dev/null +++ b/core/xchain/fmt.sh @@ -0,0 +1,21 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +# In addition to running gofumpt this script also limits line length to 120 characters +# There is no good way to run golines for single file from .vscode +# due to this bug: https://github.com/golang/vscode-go/issues/2582 + +# Set ARGS to -w if not set, otherwie to cmd line args +ARGS=${@:-"-w"} + +OUTPUT=$(go list -f '{{.Dir}}' ./... | grep -v /contracts | xargs golines --base-formatter=gofumpt --max-len=120 $ARGS) +if [ -n "$OUTPUT" ] +then + echo "$OUTPUT" +fi + +if [ "$ARGS" == "-l" ] && [ -n "$OUTPUT" ] +then + exit 1 +fi diff --git a/core/xchain/fund_multi.sh b/core/xchain/fund_multi.sh new file mode 100755 index 000000000..d5a1f2d72 --- /dev/null +++ b/core/xchain/fund_multi.sh @@ -0,0 +1,28 @@ +#!/bin/bash +set -euo pipefail + +# Base directory for the instances +BASE_DIR="./run_files" + +# Find all node_address files under the base directory +ADDRESS_FILES=$(find "$BASE_DIR" -type f -name 'node_address') + +# Check if Homebrew is installed and install cast if needed +if ! command -v cast &> /dev/null; then + echo "cast is not installed. Please install it before running this script." + exit 1 +fi + +# Iterate over each found node_address file to set the balance in Anvil +for file in $ADDRESS_FILES; do + WALLET_ADDRESS=$(cat "$file") + if [ -n "$WALLET_ADDRESS" ]; then + echo "Setting balance for wallet with address $WALLET_ADDRESS" + cast rpc anvil_setBalance $WALLET_ADDRESS 10000000000000000000 --rpc-url http://127.0.0.1:8545 + # cast balance $WALLET_ADDRESS --rpc-url http://127.0.0.1:8546 --ether + else + echo "No wallet address found in $file." + fi +done + +echo "All wallet addresses processed for balance setting in Anvil." diff --git a/core/xchain/go.mod b/core/xchain/go.mod new file mode 100644 index 000000000..4fec52dd9 --- /dev/null +++ b/core/xchain/go.mod @@ -0,0 +1,116 @@ +module core/xchain + +go 1.22.2 + +replace github.com/river-build/river/core/node => ./../node + +require ( + github.com/ethereum/go-ethereum v1.13.12 + github.com/mitchellh/mapstructure v1.5.0 + github.com/river-build/river/core/node v0.0.0-00010101000000-000000000000 + github.com/spf13/cobra v1.8.0 + github.com/spf13/viper v1.18.2 + github.com/stretchr/testify v1.9.0 + gopkg.in/yaml.v3 v3.0.1 +) + +require ( + connectrpc.com/connect v1.14.0 // indirect + github.com/DataDog/zstd v1.4.5 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.13.0 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cockroachdb/errors v1.8.1 // indirect + github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect + github.com/cockroachdb/redact v1.0.8 // indirect + github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/deckarep/golang-set/v2 v2.3.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/ethereum/c-kzg-4844 v0.4.1 // indirect + github.com/fjl/memsize v0.0.2 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect + github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/gofrs/flock v0.8.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/gorilla/mux v1.8.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/hashicorp/go-bexpr v0.1.10 // indirect + github.com/hashicorp/hcl v1.0.1-vault-5 // indirect + github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect + github.com/huin/goupnp v1.3.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jackc/pgx/v5 v5.5.5 // indirect + github.com/jackpal/go-nat-pmp v1.0.2 // indirect + github.com/klauspost/compress v1.17.1 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/matoous/go-nanoid v1.5.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mitchellh/pointerstructure v1.2.0 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/pelletier/go-toml/v2 v2.1.1 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.16.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/procfs v0.11.1 // indirect + github.com/rivo/uniseg v0.4.4 // indirect + github.com/rogpeppe/go-internal v1.11.0 // indirect + github.com/rs/cors v1.9.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/status-im/keycard-go v0.2.0 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/supranational/blst v0.3.11 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/urfave/cli/v2 v2.25.7 // indirect + github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect + github.com/yusufpapurcu/wmi v1.2.3 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.17.0 // indirect + google.golang.org/protobuf v1.32.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect + rsc.io/tmplfunc v0.0.3 // indirect +) diff --git a/core/xchain/go.sum b/core/xchain/go.sum new file mode 100644 index 000000000..defdd382a --- /dev/null +++ b/core/xchain/go.sum @@ -0,0 +1,570 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +connectrpc.com/connect v1.14.0 h1:PDS+J7uoz5Oui2VEOMcfz6Qft7opQM9hPiKvtGC01pA= +connectrpc.com/connect v1.14.0/go.mod h1:uoAq5bmhhn43TwhaKdGKN/bZcGtzPW1v+ngDTn5u+8s= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= +github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= +github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= +github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= +github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= +github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= +github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= +github.com/cockroachdb/redact v1.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw= +github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set/v2 v2.3.1 h1:vjmkvJt/IV27WXPyYQpAh4bRyWJc5Y435D17XQ9QU5A= +github.com/deckarep/golang-set/v2 v2.3.1/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= +github.com/ethereum/c-kzg-4844 v0.4.1 h1:ftiEBwhGX3Q08lJiMEfoSmqiUZPyad0exVSmGLjyPuc= +github.com/ethereum/c-kzg-4844 v0.4.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.12 h1:iDr9UM2JWkngBHGovRJEQn4Kor7mT4gt9rUZqB5M29Y= +github.com/ethereum/go-ethereum v1.13.12/go.mod h1:hKL2Qcj1OvStXNSEDbucexqnEt1Wh4Cz329XsjAalZY= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM= +github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= +github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA= +github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw= +github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww= +github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= +github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= +github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= +github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.17.1 h1:NE3C767s2ak2bweCZo3+rdP4U/HoyVXLv/X9f2gPS5g= +github.com/klauspost/compress v1.17.1/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/matoous/go-nanoid v1.5.0 h1:VRorl6uCngneC4oUQqOYtO3S0H5QKFtKuKycFG3euek= +github.com/matoous/go-nanoid v1.5.0/go.mod h1:zyD2a71IubI24efhpvkJz+ZwfwagzgSO6UNiFsZKN7U= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= +github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= +github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= +github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= +github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= +github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= +github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= +github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 h1:/RIbNt/Zr7rVhIkQhooTxCxFcdWLGIKnZA4IXNFSrvo= +golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/core/xchain/launch_multi.sh b/core/xchain/launch_multi.sh new file mode 100755 index 000000000..a23462ca0 --- /dev/null +++ b/core/xchain/launch_multi.sh @@ -0,0 +1,74 @@ +#!/bin/bash +set -euo pipefail + +# Change the current working directory to the directory of the script +cd "$(dirname "$0")" + +: ${RUN_ENV:?} + +# Base directory for the instances +RUN_FILES_DIR="./run_files" + +# PID file for the script, stored in the base directory +SCRIPT_PID_FILE="${RUN_FILES_DIR}/${RUN_ENV}/launch_multi.pid" + +BASE_DIR="${RUN_FILES_DIR}/${RUN_ENV}" + +mkdir -p "${BASE_DIR}" + +# stop previous instances +./stop_multi.sh + +# Record the script's own PID +echo $$ > "$SCRIPT_PID_FILE" + +make + +# Get number of instances by counting instance directories +N=$(ls -d ${BASE_DIR}/instance_* 2>/dev/null | wc -l) + +# Function to handle Ctrl+C and wait for the child processes +cleanup() { + echo "Sending SIGINT to child processes..." + + for (( i=1; i<=N; i++ )) + do + instance_dir="${BASE_DIR}/instance_${i}" + + if [[ -f "${instance_dir}/node.pid" ]]; then + pid=$(cat "${instance_dir}/node.pid") + echo "Waiting on in ${instance_dir} with PID $pid has completed." + kill "$pid" 2>/dev/null || true + wait "$pid" || true + echo "Instance in ${instance_dir} with PID $pid has completed." + rm -f "${instance_dir}/node.pid" + fi + done + echo "Sent SIGINT to child processes..." +} + +# Trap Ctrl+C and call cleanup() +trap cleanup SIGINT SIGTERM + +# Fund the instances +./fund_multi.sh + +# Loop to launch N instances from instance directories +for (( i=1; i<=N; i++ )) +do + INSTANCE_DIR="${BASE_DIR}/instance_${i}" + cp bin/xchain_node "${INSTANCE_DIR}/bin/xchain_node" + pushd "${INSTANCE_DIR}" + "./bin/xchain_node" register --approve wallet/private_key + "./bin/xchain_node" run & + node_pid=$! + pwd + echo $node_pid > node.pid + echo "Launched instance $i from ${INSTANCE_DIR} with PID $node_pid" + popd +done + +wait + +rm $SCRIPT_PID_FILE +echo "All child processes have completed." diff --git a/core/xchain/node/main.go b/core/xchain/node/main.go new file mode 100644 index 000000000..87cc66054 --- /dev/null +++ b/core/xchain/node/main.go @@ -0,0 +1,16 @@ +package main + +import ( + "context" + "core/xchain/cmd" + + "github.com/river-build/river/core/node/dlog" +) + +func main() { + log := dlog.FromCtx(context.Background()) + + cmd.Execute() + + log.Info("Shutdown") +} diff --git a/core/xchain/server/server.go b/core/xchain/server/server.go new file mode 100644 index 000000000..10abb5b7f --- /dev/null +++ b/core/xchain/server/server.go @@ -0,0 +1,566 @@ +package server + +import ( + "context" + "core/xchain/config" + "core/xchain/contracts" + "core/xchain/entitlement" + "core/xchain/util" + "log/slog" + "math/big" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + go_eth_types "github.com/ethereum/go-ethereum/core/types" + . "github.com/river-build/river/core/node/base" + node_contracts "github.com/river-build/river/core/node/contracts" + "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/dlog" + "github.com/river-build/river/core/node/infra" + . "github.com/river-build/river/core/node/protocol" +) + +var ( + // contractReads is the root for contract reads/event decode operations. + contractReads = infra.NewSuccessMetrics(infra.CONTRACT_CALLS_CATEGORY, nil) + // contractWrites is the root for transactions sent by xchain. + contractWrites = infra.NewSuccessMetrics(infra.CONTRACT_WRITES_CATEGORY, nil) + // entitlementCheckRequested keeps track how many entitlement check requests are read and decoded from Base. + entitlementCheckRequested = infra.NewSuccessMetrics("entitlement_checks_requested", nil) + // entitlementCheckProcessed keeps track how many entitlement check requests are processed. + // Failures are expected when other xchain instances have already reached a quorum and the request was dropped on + // Base. + entitlementCheckProcessed = infra.NewSuccessMetrics("entitlement_checks_processed", nil) + // entitlementCheckTx keeps tracks how many times an entitlement check result transaction was sent to Base. + entitlementCheckTx = infra.NewSuccessMetrics("entitlement_checks", contractWrites) + + getRootKeyForWalletCalls = infra.NewSuccessMetrics("get_root_key_for_wallet", contractReads) + getWalletsByRootKeyCalls = infra.NewSuccessMetrics("get_wallets_by_root_key", contractReads) + getRuleDataCalls = infra.NewSuccessMetrics("get_rule_data", contractReads) +) + +type ( + // xchain reads entitlement requests from base chain and writes the result after processing back to base. + xchain struct { + workerID int + checker *contracts.IEntitlementChecker + checkerABI *abi.ABI + checkerContract *bind.BoundContract + baseChain *crypto.Blockchain + evmErrDecoder *node_contracts.EvmErrorDecoder + config *config.Config + cancel context.CancelFunc + } + + // entitlementCheckReceipt holds the outcome of an xchain entitlement check request + entitlementCheckReceipt struct { + TransactionID common.Hash + RoleId *big.Int + Outcome bool + Event contracts.IEntitlementCheckRequestEvent + } + + // pending task to write the entitlement check outcome to base + inprogress struct { + ptx crypto.TransactionPoolPendingTransaction + gasEstimate uint64 + outcome *entitlementCheckReceipt + } +) + +type XChain interface { + Run(ctx context.Context) + Stop() +} + +// New creates a new xchain instance that reads entitlement requests from Base, +// processes the requests and writes the results back to Base. +func New( + ctx context.Context, + cfg *config.Config, + baseChain *crypto.Blockchain, + workerID int, +) (server *xchain, err error) { + ctx, cancel := context.WithCancel(ctx) + + // Cleanup on error + defer func() { + if err != nil { + cancel() + } + }() + + if err = entitlement.Init(ctx, cfg); err != nil { + return nil, err + } + + checker, err := contracts.NewIEntitlementChecker(cfg.GetEntitlementContractAddress(), nil, cfg.GetContractVersion()) + if err != nil { + return nil, err + } + + var ( + log = dlog.FromCtx(ctx). + With("worker_id", workerID). + With("application", "xchain") + checkerABI = checker.GetAbi() + checkerContract = bind.NewBoundContract( + cfg.GetEntitlementContractAddress(), + *checker.GetAbi(), + nil, + nil, + nil, + ) + entitlementGatedMetaData = contracts.NewEntitlementGatedMetaData(cfg.GetContractVersion()) + ) + + log.Info("Starting xchain node", "cfg", cfg) + + var wallet *crypto.Wallet + if baseChain == nil { + wallet, err = util.LoadWallet(ctx) + if err != nil { + return nil, err + } + } else { + wallet = baseChain.Wallet + } + log = log.With("nodeAddress", wallet.Address.Hex()) + + if baseChain == nil { + baseChain, err = crypto.NewBlockchain(ctx, &cfg.BaseChain, wallet) + if err != nil { + return nil, err + } + // determine from which block to start processing entitlement check requests + startBlock, err := util.StartBlockNumberWithHistory(ctx, baseChain.Client, cfg.History) + if err != nil { + return nil, err + } + if startBlock < baseChain.InitialBlockNum.AsUint64() { + baseChain.InitialBlockNum = crypto.BlockNumber(startBlock) + } + + log.Info("Start processing entitlement check requests", "startBlock", baseChain.InitialBlockNum) + go baseChain.ChainMonitor.RunWithBlockPeriod( + ctx, + baseChain.Client, + baseChain.InitialBlockNum, + time.Duration(cfg.BaseChain.BlockTimeMs)*time.Millisecond, + ) + } + + walletLink, err := contracts.NewIWalletLink( + cfg.GetWalletLinkContractAddress(), + baseChain.Client, + cfg.GetContractVersion(), + ) + if err != nil { + return nil, err + } + + decoder, err := node_contracts.NewEVMErrorDecoder( + checker.GetMetadata(), + entitlementGatedMetaData.GetMetadata(), + walletLink.GetMetadata(), + ) + if err != nil { + return nil, err + } + + x := &xchain{ + workerID: workerID, + checker: checker, + checkerABI: checkerABI, + checkerContract: checkerContract, + baseChain: baseChain, + evmErrDecoder: decoder, + config: cfg, + } + + isRegistered, err := x.isRegistered(ctx) + if err != nil { + return nil, err + } + if !isRegistered { + return nil, RiverError(Err_BAD_CONFIG, "xchain node not registered") + } + + return x, nil +} + +func (x *xchain) Stop() { + if x.cancel != nil { + x.cancel() + } +} + +func (x *xchain) Log(ctx context.Context) *slog.Logger { + return dlog.FromCtx(ctx). + With("worker_id", x.workerID). + With("application", "xchain"). + With("nodeAddress", x.baseChain.Wallet.Address.Hex()) +} + +// isRegistered returns an indication if this instance is registered by its operator as a xchain node. +// if not this instance isn't allowed to submit entitlement check results. +func (x *xchain) isRegistered(ctx context.Context) (bool, error) { + checker, err := contracts.NewIEntitlementChecker( + x.config.GetEntitlementContractAddress(), x.baseChain.Client, x.config.GetContractVersion()) + if err != nil { + return false, AsRiverError(err, Err_CANNOT_CALL_CONTRACT) + } + return checker.IsValidNode(&bind.CallOpts{Context: ctx}, x.baseChain.Wallet.Address) +} + +// Run xchain until the given ctx expires. +// When ctx expires xchain stops reading new xchain requests from Base. +// Pending requests are processed before Run returns. +func (x *xchain) Run(ctx context.Context) { + var ( + runCtx, cancel = context.WithCancel(ctx) + log = x.Log(ctx) + entitlementAddress = x.config.GetEntitlementContractAddress() + entitlementCheckReceipts = make(chan *entitlementCheckReceipt, 256) + onEntitlementCheckRequestedCallback = func(ctx context.Context, event types.Log) { + x.onEntitlementCheckRequested(ctx, event, entitlementCheckReceipts) + } + ) + x.cancel = cancel + + log.Info( + "Starting xchain node", + "entitlementAddress", entitlementAddress.Hex(), + "nodeAddress", x.baseChain.Wallet.Address.Hex(), + ) + + if x.config.Metrics.Enabled { + // node and xchain are run in the same docker container and share the same config key for the metrics port. + // to prevent both processes claiming the same port we decided to increment the port by 1 for xchain. + x.config.Metrics.Port += 1 + go infra.StartMetricsService(ctx, x.config.Metrics) + } + + // register callback for Base EntitlementCheckRequested events + x.baseChain.ChainMonitor.OnContractWithTopicsEvent( + entitlementAddress, + [][]common.Hash{{x.checkerABI.Events["EntitlementCheckRequested"].ID}}, + onEntitlementCheckRequestedCallback) + + // read entitlement check results from entitlementCheckReceipts and write the result to Base + x.writeEntitlementCheckResults(runCtx, entitlementCheckReceipts) +} + +// onEntitlementCheckRequested is the callback that the chain monitor calls for each EntitlementCheckRequested +// event raised on Base in the entitlement contract. +func (x *xchain) onEntitlementCheckRequested( + ctx context.Context, + event types.Log, + entitlementCheckResults chan<- *entitlementCheckReceipt, +) { + var ( + log = x.Log(ctx) + entitlementCheckRequest = x.checker.EntitlementCheckRequestEvent() + ) + + // try to decode the EntitlementCheckRequested event + if err := x.checkerContract.UnpackLog(entitlementCheckRequest.Raw(), "EntitlementCheckRequested", event); err != nil { + entitlementCheckRequested.FailInc() + log.Error("Unable to decode EntitlementCheckRequested event", "err", err) + return + } + + log.Info("Received EntitlementCheckRequested", "xchain.req.txid", entitlementCheckRequest.TransactionID().Hex()) + + // process the entitlement request and post the result to entitlementCheckResults + outcome, err := x.handleEntitlementCheckRequest(ctx, entitlementCheckRequest) + if err != nil { + entitlementCheckRequested.FailInc() + log.Error("Entitlement check failed to process", + "err", err, "xchain.req.txid", entitlementCheckRequest.TransactionID().Hex()) + return + } + if outcome != nil { // request was not intended for this xchain instance. + entitlementCheckRequested.PassInc() + log.Info( + "Queueing check result for post", + "transactionId", + outcome.TransactionID.Hex(), + "outcome", + outcome.Outcome, + ) + entitlementCheckResults <- outcome + } +} + +// handleEntitlementCheckRequest processes the given xchain entitlement check request. +// It can return nil, nil in case the request wasn't targeted for the current xchain instance. +func (x *xchain) handleEntitlementCheckRequest( + ctx context.Context, + request contracts.IEntitlementCheckRequestEvent, +) (*entitlementCheckReceipt, error) { + log := x.Log(ctx). + With("function", "handleEntitlementCheckRequest"). + With("req.txid", request.TransactionID().Hex()). + With("roleId", request.RoleId().String()) + + for _, selectedNodeAddress := range request.SelectedNodes() { + if selectedNodeAddress == x.baseChain.Wallet.Address { + log.Info("Processing EntitlementCheckRequested") + outcome, err := x.process(ctx, request, x.baseChain.Client, request.CallerAddress()) + if err != nil { + return nil, err + } + return &entitlementCheckReceipt{ + TransactionID: request.TransactionID(), + RoleId: request.RoleId(), + Outcome: outcome, + Event: request, + }, nil + } + } + log.Debug( + "EntitlementCheckRequested not for this xchain instance", + "selectedNodes", request.SelectedNodes(), + "nodeAddress", x.baseChain.Wallet.Address.Hex(), + ) + return nil, nil // request not for this xchain instance +} + +// writeEntitlementCheckResults writes the outcomes of entitlement checks to Base. +// returns when all items in checkResults are processed. +func (x *xchain) writeEntitlementCheckResults(ctx context.Context, checkResults <-chan *entitlementCheckReceipt) { + var ( + log = x.Log(ctx) + pending = make(chan *inprogress, 128) + ) + + // write entitlement check outcome to base + go func() { + for { + select { + case <-ctx.Done(): + close(pending) + return + case receipt := <-checkResults: + // 0 - NodeVoteStatus.NOT_VOTED, 1 - pass, 2 - fail + outcome := contracts.NodeVoteStatus__FAILED + if receipt.Outcome { + outcome = contracts.NodeVoteStatus__PASSED + } + + createPostResultTx := func(opts *bind.TransactOpts) (*types.Transaction, error) { + gated, err := contracts.NewIEntitlementGated( + receipt.Event.ContractAddress(), + x.baseChain.Client, + x.config.GetContractVersion(), + ) + if err != nil { + return nil, err + } + return gated.PostEntitlementCheckResult(opts, receipt.TransactionID, receipt.RoleId, uint8(outcome)) + } + gasEstimate, err := x.baseChain.TxPool.EstimateGas(ctx, createPostResultTx) + if err != nil { + log.Warn("Failed to estimate gas for PostEntitlementCheckResult (entitlement check complete?)", "err", err) + } + + pendingTx, err := x.baseChain.TxPool.Submit( + ctx, + "PostEntitlementCheckResult", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + // Ensure gas limit is at least 2_500_000 as a workaround for simulated backend issues in tests. + opts.GasLimit = max(opts.GasLimit, 2_500_000) + return createPostResultTx(opts) + }, + ) + + // it is possible that some entitlement checks are already processed before xchain restarted, + // or enough other xchain instances have already reached a quorum -> ignore these errors. + ce, _, _ := x.evmErrDecoder.DecodeEVMError(err) + if ce != nil && (ce.DecodedError.Sig == "EntitlementGated_TransactionNotRegistered()" || + ce.DecodedError.Sig == "EntitlementGated_NodeAlreadyVoted()" || + ce.DecodedError.Sig == "EntitlementGated_TransactionCheckAlreadyCompleted()") { + log.Debug("Unable to submit entitlement check outcome", + "err", ce.DecodedError.Name, + "txid", receipt.TransactionID.Hex()) + continue + } + + if err != nil { + entitlementCheckTx.FailInc() + x.handleContractError(log, err, "Failed to submit transaction for xchain request") + continue + } + pending <- &inprogress{pendingTx, gasEstimate, receipt} + } + } + }() + + // wait until all transactions are processed before returning + for task := range pending { + receipt := <-task.ptx.Wait() // Base transaction receipt + + entitlementCheckTx.PassInc() + if receipt.Status == go_eth_types.ReceiptStatusFailed { + // it is possible that other xchain instances have already reached a quorum and our transaction was simply + // too late and failed because of that. Therefore this can be an expected error. + log.Warn("entitlement check response failed to post", + "gasUsed", receipt.GasUsed, + "gasEstimate", task.gasEstimate, + "tx.hash", task.ptx.TransactionHash(), + "tx.success", receipt.Status == crypto.TransactionResultSuccess, + "xchain.req.txid", task.outcome.TransactionID, + "xchain.req.outcome", task.outcome.Outcome, + "gatedContract", task.outcome.Event.ContractAddress()) + entitlementCheckProcessed.FailInc() + } else { + log.Info("entitlement check response posted", + "gasUsed", receipt.GasUsed, + "gasEstimate", task.gasEstimate, + "tx.hash", task.ptx.TransactionHash(), + "tx.success", receipt.Status == crypto.TransactionResultSuccess, + "xchain.req.txid", task.outcome.TransactionID, + "xchain.req.outcome", task.outcome.Outcome, + "gatedContract", task.outcome.Event.ContractAddress()) + entitlementCheckProcessed.PassInc() + } + } +} + +func (x *xchain) handleContractError(log *slog.Logger, err error, msg string) error { + ce, se, err := x.evmErrDecoder.DecodeEVMError(err) + switch { + case ce != nil: + log.Error(msg, "err", ce) + return ce + case se != nil: + log.Error(msg, "err", se) + return se + case err != nil: + log.Error(msg, "err", err) + return err + } + return nil +} + +func (x *xchain) getLinkedWallets(ctx context.Context, wallet common.Address) ([]common.Address, error) { + log := x.Log(ctx) + log.Debug("GetLinkedWallets", "wallet", wallet.Hex(), "walletLinkContract", x.config.GetWalletLinkContractAddress()) + iWalletLink, err := contracts.NewIWalletLink( + x.config.GetWalletLinkContractAddress(), + x.baseChain.Client, + x.config.GetContractVersion(), + ) + if err != nil { + return nil, x.handleContractError(log, err, "Failed to create IWalletLink") + } + + start := time.Now() + rootKey, err := iWalletLink.GetRootKeyForWallet(&bind.CallOpts{Context: ctx}, wallet) + infra.StoreExecutionTimeMetrics("GetRootKeyForWallet", infra.CONTRACT_CALLS_CATEGORY, start) + if err != nil { + getRootKeyForWalletCalls.FailInc() + return nil, x.handleContractError(log, err, "Failed to GetRootKeyForWallet") + } + getRootKeyForWalletCalls.PassInc() + + var zero common.Address + if rootKey == zero { + log.Debug("Wallet not linked to any root key, trying as root key", "wallet", wallet.Hex()) + rootKey = wallet + } + + start = time.Now() + wallets, err := iWalletLink.GetWalletsByRootKey(&bind.CallOpts{Context: ctx}, rootKey) + infra.StoreExecutionTimeMetrics("GetWalletsByRootKey", infra.CONTRACT_CALLS_CATEGORY, start) + if err != nil { + getWalletsByRootKeyCalls.FailInc() + return nil, x.handleContractError(log, err, "Failed to GetWalletsByRootKey") + } + getWalletsByRootKeyCalls.PassInc() + + if len(wallets) == 0 { + log.Debug("No linked wallets found", "rootKey", rootKey.Hex()) + return []common.Address{wallet}, nil + } + + // Make sure the root wallet is included in the returned list of linked wallets. This will not + // be the case when the wallet passed to the check is the root wallet. + containsRootWallet := false + for _, w := range wallets { + if w == rootKey { + containsRootWallet = true + break + } + } + if !containsRootWallet { + wallets = append(wallets, rootKey) + } + + log.Debug("Linked wallets", "rootKey", rootKey.Hex(), "wallets", wallets) + + return wallets, nil +} + +func (x *xchain) getRuleData( + ctx context.Context, + transactionId [32]byte, + roleId *big.Int, + contractAddress common.Address, + client crypto.BlockchainClient, +) (*contracts.IRuleData, error) { + log := x.Log(ctx).With("function", "getRuleData", "req.txid", transactionId) + gater, err := contracts.NewIEntitlementGated(contractAddress, client, x.config.GetContractVersion()) + if err != nil { + return nil, x.handleContractError(log, err, "Failed to create NewEntitlementGated") + } + + defer infra.StoreExecutionTimeMetrics("GetRuleData", infra.CONTRACT_CALLS_CATEGORY, time.Now()) + + ruleData, err := gater.GetRuleData(&bind.CallOpts{Context: ctx}, transactionId, roleId) + if err != nil { + getRuleDataCalls.FailInc() + return nil, x.handleContractError(log, err, "Failed to GetEncodedRuleData") + } + getRuleDataCalls.PassInc() + return ruleData, nil +} + +// process the given entitlement request. +// It returns an indication of the request passes checks. +func (x *xchain) process( + ctx context.Context, + request contracts.IEntitlementCheckRequestEvent, + client crypto.BlockchainClient, + callerAddress common.Address, +) (result bool, err error) { + log := x.Log(ctx). + With("caller_address", callerAddress.Hex()) + + log = log.With("function", "process", "req.txid", request.TransactionID().Hex()) + log.Info("Process EntitlementCheckRequested") + + wallets, err := x.getLinkedWallets(ctx, callerAddress) + if err != nil { + return false, err + } + + ruleData, err := x.getRuleData(ctx, request.TransactionID(), request.RoleId(), request.ContractAddress(), client) + if err != nil { + return false, err + } + + // Embed log metadata for rule evaluation logs + ctx = dlog.CtxWithLog(ctx, log) + result, err = entitlement.EvaluateRuleData(ctx, x.config, wallets, ruleData) + if err != nil { + log.Error("Failed to EvaluateRuleData", "err", err) + return false, err + } + + return result, nil +} diff --git a/core/xchain/server/server_test.go b/core/xchain/server/server_test.go new file mode 100644 index 000000000..4604d917c --- /dev/null +++ b/core/xchain/server/server_test.go @@ -0,0 +1,758 @@ +//go:build integration +// +build integration + +package server_test + +import ( + "context" + "core/xchain/client_simulator" + xc_common "core/xchain/common" + "core/xchain/config" + "core/xchain/contracts" + test_contracts "core/xchain/contracts/test" + "core/xchain/entitlement" + "core/xchain/server" + "fmt" + "log" + "log/slog" + "math/big" + "testing" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/river-build/river/core/node/base/test" + node_config "github.com/river-build/river/core/node/config" + node_contracts "github.com/river-build/river/core/node/contracts" + node_crypto "github.com/river-build/river/core/node/crypto" + "github.com/river-build/river/core/node/dlog" + infra "github.com/river-build/river/core/node/infra/config" + "github.com/stretchr/testify/require" +) + +const ( + ChainID = 31337 + BaseRpcEndpoint = "http://localhost:8545" +) + +type testNodeRecord struct { + svr server.XChain + address common.Address +} + +type serviceTester struct { + ctx context.Context + cancel context.CancelFunc + require *require.Assertions + btc *node_crypto.BlockchainTestContext + nodes []*testNodeRecord + stopBlockAutoMining func() + + // Addresses + mockEntitlementGatedAddress common.Address + mockCustomEntitlementAddress common.Address + entitlementCheckerAddress common.Address + walletLinkingAddress common.Address + + // Contracts + entitlementChecker *contracts.IEntitlementChecker + walletLink *contracts.IWalletLink + + decoder *node_contracts.EvmErrorDecoder +} + +// Disable color output for console testing. +func noColorLogger() *slog.Logger { + return slog.New( + dlog.NewPrettyTextHandler(dlog.DefaultLogOut, &dlog.PrettyHandlerOptions{ + Colors: dlog.ColorMap_Disabled, + }), + ) +} + +func silentLogger() *slog.Logger { + return slog.New(&dlog.NullHandler{}) +} + +func newServiceTester(numNodes int, require *require.Assertions) *serviceTester { + ctx, cancel := test.NewTestContext() + // Comment out to silence xchain and client simulator logs. Chain monitoring logs are still visible. + ctx = dlog.CtxWithLog(ctx, noColorLogger()) + + log := dlog.FromCtx(ctx) + log.Info("Creating service tester") + + st := &serviceTester{ + ctx: ctx, + cancel: cancel, + require: require, + nodes: make([]*testNodeRecord, numNodes), + } + + btc, err := node_crypto.NewBlockchainTestContext(ctx, numNodes+1, true) + require.NoError(err) + st.btc = btc + + st.deployXchainTestContracts() + return st +} + +func (st *serviceTester) deployXchainTestContracts() { + log := dlog.FromCtx(st.ctx) + log.Info("Deploying contracts") + client := st.btc.DeployerBlockchain.Client + + chainId, err := client.ChainID(st.ctx) + st.require.NoError(err) + + auth, err := bind.NewKeyedTransactorWithChainID(st.btc.DeployerBlockchain.Wallet.PrivateKeyStruct, chainId) + st.require.NoError(err) + + // Deploy the entitlement checker + addr, _, _, err := contracts.DeployEntitlementChecker(auth, client, st.Config().GetContractVersion()) + st.require.NoError(err) + + st.entitlementCheckerAddress = addr + iChecker, err := contracts.NewIEntitlementChecker(addr, client, st.Config().GetContractVersion()) + st.require.NoError(err) + st.entitlementChecker = iChecker + + // Deploy the mock entitlement gated contract + addr, _, _, err = contracts.DeployMockEntitlementGated( + auth, + client, + st.entitlementCheckerAddress, + st.Config().GetContractVersion(), + ) + st.require.NoError(err) + st.mockEntitlementGatedAddress = addr + + // Deploy the mock custom entitlement contract + addr, _, _, err = contracts.DeployMockCustomEntitlement(auth, client, st.Config().GetContractVersion()) + st.require.NoError(err) + st.mockCustomEntitlementAddress = addr + + // Deploy the wallet linking contract + addr, _, _, err = contracts.DeployWalletLink(auth, client, st.Config().GetContractVersion()) + st.require.NoError(err) + st.walletLinkingAddress = addr + walletLink, err := contracts.NewIWalletLink(addr, client, st.Config().GetContractVersion()) + st.require.NoError(err) + st.walletLink = walletLink + + // Commit all deploys + st.btc.Commit(st.ctx) + + log = dlog.FromCtx(st.ctx) + log.Info( + "Contracts deployed", + "entitlementChecker", + st.entitlementCheckerAddress.Hex(), + "mockEntitlementGated", + st.mockEntitlementGatedAddress.Hex(), + "mockCustomEntitlement", + st.mockCustomEntitlementAddress.Hex(), + "walletLink", + st.walletLinkingAddress.Hex(), + ) + + decoder, err := node_contracts.NewEVMErrorDecoder(iChecker.GetMetadata(), walletLink.GetMetadata()) + st.decoder = decoder +} + +func (st *serviceTester) AssertNoEVMError(err error) { + ce, se, wrapped := st.decoder.DecodeEVMError(err) + st.require.NoError(err, "EVM errors", ce, se, wrapped) +} + +func (st *serviceTester) ClientSimulatorBlockchain() *node_crypto.Blockchain { + return st.btc.GetBlockchain(st.ctx, len(st.nodes)) +} + +func (st *serviceTester) Close() { + // Is this needed? Or is the cancel enough here? Do we need to cancel individual nodes? + for _, node := range st.nodes { + node.svr.Stop() + } + if st.stopBlockAutoMining != nil { + st.stopBlockAutoMining() + } + st.cancel() +} + +func (st *serviceTester) Start(t *testing.T) { + ctx, cancel := context.WithCancel(st.ctx) + done := make(chan struct{}) + st.stopBlockAutoMining = func() { + cancel() + <-done + } + + // hack to ensure that the chain always produces blocks (automining=true) + // commit on simulated backend with no pending txs can sometimes crash the simulator. + // by having a pending tx with automining enabled we can work around that issue. + go func() { + blockPeriod := time.NewTicker(2 * time.Second) + chainID, err := st.btc.Client().ChainID(st.ctx) + if err != nil { + log.Fatal(err) + } + signer := types.LatestSignerForChainID(chainID) + for { + select { + case <-ctx.Done(): + close(done) + return + case <-blockPeriod.C: + _, _ = st.btc.DeployerBlockchain.TxPool.Submit( + ctx, + "noop", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + gp, err := st.btc.Client().SuggestGasPrice(ctx) + if err != nil { + return nil, err + } + tx := types.NewTransaction( + opts.Nonce.Uint64(), + st.btc.GetDeployerWallet().Address, + big.NewInt(1), + 21000, + gp, + nil, + ) + return types.SignTx(tx, signer, st.btc.GetDeployerWallet().PrivateKeyStruct) + }, + ) + } + } + }() + + for i := 0; i < len(st.nodes); i++ { + st.nodes[i] = &testNodeRecord{} + bc := st.btc.GetBlockchain(st.ctx, i) + + // register node + pendingTx, err := bc.TxPool.Submit(ctx, "RegisterNode", func(opts *bind.TransactOpts) (*types.Transaction, error) { + return st.entitlementChecker.RegisterNode(opts, bc.Wallet.Address) + }) + + require.NoError(t, err, "register node") + receipt := <-pendingTx.Wait() + if receipt == nil || receipt.Status != node_crypto.TransactionResultSuccess { + log.Fatal("unable to register node") + } + + svr, err := server.New(st.ctx, st.Config(), bc, i) + st.require.NoError(err) + st.nodes[i].svr = svr + st.nodes[i].address = bc.Wallet.Address + go svr.Run(st.ctx) + } +} + +func (st *serviceTester) Config() *config.Config { + cfg := &config.Config{ + BaseChain: node_config.ChainConfig{}, + RiverChain: node_config.ChainConfig{}, + ChainsString: fmt.Sprintf("%d:%s", ChainID, BaseRpcEndpoint), + TestingContract: config.ContractConfig{ + Address: st.mockEntitlementGatedAddress.String(), + }, + EntitlementContract: config.ContractConfig{ + Address: st.entitlementCheckerAddress.String(), + }, + WalletLinkContract: config.ContractConfig{ + Address: st.walletLinkingAddress.String(), + }, + TestCustomEntitlementContract: config.ContractConfig{ + Address: st.mockCustomEntitlementAddress.String(), + }, + Log: infra.LogConfig{ + NoColor: true, + }, + } + cfg.Init() + return cfg +} + +func (st *serviceTester) linkWalletToRootWallet( + ctx context.Context, + wallet *node_crypto.Wallet, + rootWallet *node_crypto.Wallet, +) { + // Root key nonce + rootKeyNonce, err := st.walletLink.GetLatestNonceForRootKey(nil, rootWallet.Address) + st.require.NoError(err) + + // Create RootKey IWalletLinkLinkedWallet + hash, err := node_crypto.PackWithNonce(wallet.Address, rootKeyNonce.Uint64()) + st.require.NoError(err) + rootKeySignature, err := rootWallet.SignHash(node_crypto.ToEthMessageHash(hash)) + rootKeySignature[64] += 27 // Transform V from 0/1 to 27/28 + + rootKeyWallet := contracts.IWalletLinkBaseLinkedWallet{ + Addr: rootWallet.Address, + Signature: rootKeySignature, + } + + // Create Wallet IWalletLinkLinkedWallet + hash, err = node_crypto.PackWithNonce(rootWallet.Address, rootKeyNonce.Uint64()) + st.require.NoError(err) + nodeWalletSignature, err := wallet.SignHash(node_crypto.ToEthMessageHash(hash)) + nodeWalletSignature[64] += 27 // Transform V from 0/1 to 27/28 + nodeWallet := contracts.IWalletLinkBaseLinkedWallet{ + Addr: wallet.Address, + Signature: nodeWalletSignature, + } + + pendingTx, err := st.ClientSimulatorBlockchain().TxPool.Submit( + ctx, + "LinkWalletToRootKey", + func(opts *bind.TransactOpts) (*types.Transaction, error) { + return st.walletLink.LinkWalletToRootKey(opts, nodeWallet, rootKeyWallet, rootKeyNonce) + }, + ) + + st.AssertNoEVMError(err) + receipt := <-pendingTx.Wait() + st.require.Equal(uint64(1), receipt.Status) +} + +func erc721Check(chainId uint64, contractAddress common.Address, threshold uint64) contracts.IRuleData { + return contracts.IRuleData{ + Operations: []contracts.IRuleEntitlementOperation{ + { + OpType: uint8(entitlement.CHECK), + Index: 0, + }, + }, + CheckOperations: []contracts.IRuleEntitlementCheckOperation{ + { + OpType: uint8(entitlement.ERC721), + ChainId: new(big.Int).SetUint64(chainId), + ContractAddress: contractAddress, + Threshold: new(big.Int).SetUint64(threshold), + }, + }, + } +} + +func erc20Check(chainId uint64, contractAddress common.Address, threshold uint64) contracts.IRuleData { + return contracts.IRuleData{ + Operations: []contracts.IRuleEntitlementOperation{ + { + OpType: uint8(entitlement.CHECK), + Index: 0, + }, + }, + CheckOperations: []contracts.IRuleEntitlementCheckOperation{ + { + OpType: uint8(entitlement.ERC20), + ChainId: new(big.Int).SetUint64(chainId), + // Chainlink is a good ERC 20 token to use for testing because it's easy to get from faucets. + ContractAddress: contractAddress, + Threshold: new(big.Int).SetUint64(threshold), + }, + }, + } +} + +func customEntitlementCheck(chainId uint64, contractAddress common.Address) contracts.IRuleData { + return contracts.IRuleData{ + Operations: []contracts.IRuleEntitlementOperation{ + { + OpType: uint8(entitlement.CHECK), + Index: 0, + }, + }, + CheckOperations: []contracts.IRuleEntitlementCheckOperation{ + { + OpType: uint8(entitlement.ISENTITLED), + ChainId: new(big.Int).SetUint64(chainId), + ContractAddress: contractAddress, + Threshold: new(big.Int).SetUint64(0), + }, + }, + } +} + +// Expect base anvil chain available at localhost:8545. +// xchain needs an rpc url endpoint available for evaluating entitlements. +var ( + anvilWallet *node_crypto.Wallet + anvilClient *ethclient.Client +) + +func TestMain(m *testing.M) { + ctx := context.Background() + var err error + anvilWallet, err = node_crypto.NewWallet(ctx) + if err != nil { + panic(err) + } + + anvilClient, err = ethclient.Dial(BaseRpcEndpoint) + if err != nil { + // Expect a panic here if anvil base chain is not running. + panic(err) + } + + // Fund the wallet for deploying anvil contracts + err = anvilClient.Client(). + CallContext(ctx, nil, "anvil_setBalance", anvilWallet.Address, node_crypto.Eth_100.String()) + if err != nil { + panic(err) + } + + m.Run() +} + +func TestNodeIsRegistered(t *testing.T) { + require := require.New(t) + st := newServiceTester(5, require) + defer st.Close() + st.Start(t) + + count, err := st.entitlementChecker.NodeCount(nil) + require.NoError(err) + require.Equal(5, int(count.Int64())) + + for _, node := range st.nodes { + valid, err := st.entitlementChecker.IsValidNode(nil, node.address) + require.NoError(err) + require.True(valid) + } +} + +func mintTokenForWallet( + require *require.Assertions, + auth *bind.TransactOpts, + st *serviceTester, + erc721 *test_contracts.MockErc721, + wallet *node_crypto.Wallet, + amount int64, +) { + nonce, err := anvilClient.PendingNonceAt(context.Background(), anvilWallet.Address) + require.NoError(err) + auth.Nonce = big.NewInt(int64(nonce)) + txn, err := erc721.Mint(auth, wallet.Address, big.NewInt(amount)) + st.AssertNoEVMError(err) + require.NotNil(xc_common.WaitForTransaction(anvilClient, txn)) +} + +func expectEntitlementCheckResult( + require *require.Assertions, + cs client_simulator.ClientSimulator, + ctx context.Context, + data contracts.IRuleData, + expected bool, +) { + result, err := cs.EvaluateRuleData(ctx, data) + require.NoError(err) + require.Equal(expected, result) +} + +func generateLinkedWallets( + ctx context.Context, + require *require.Assertions, + simulatorAsRoot bool, + st *serviceTester, + csWallet *node_crypto.Wallet, +) (rootKey *node_crypto.Wallet, wallet1 *node_crypto.Wallet, wallet2 *node_crypto.Wallet, wallet3 *node_crypto.Wallet) { + // Create a set of 3 linked wallets using client simulator address. + var err error + if simulatorAsRoot { + rootKey = csWallet + wallet3, err = node_crypto.NewWallet(ctx) + require.NoError(err) + } else { + rootKey, err = node_crypto.NewWallet(ctx) + require.NoError(err) + wallet3 = csWallet + } + wallet1, err = node_crypto.NewWallet(ctx) + require.NoError(err) + wallet2, err = node_crypto.NewWallet(ctx) + require.NoError(err) + + st.linkWalletToRootWallet(ctx, wallet1, rootKey) + st.linkWalletToRootWallet(ctx, wallet2, rootKey) + st.linkWalletToRootWallet(ctx, wallet3, rootKey) + + return rootKey, wallet1, wallet2, wallet3 +} + +func deployMockErc721Contract( + require *require.Assertions, + st *serviceTester, +) (*bind.TransactOpts, common.Address, *test_contracts.MockErc721) { + // Deploy mock ERC721 contract to anvil chain + auth, err := bind.NewKeyedTransactorWithChainID(anvilWallet.PrivateKeyStruct, big.NewInt(31337)) + require.NoError(err) + + nonce, err := anvilClient.PendingNonceAt(context.Background(), anvilWallet.Address) + require.NoError(err) + auth.Nonce = big.NewInt(int64(nonce)) + auth.Value = big.NewInt(0) // in wei + auth.GasLimit = uint64(30_000_000) // in units + + contractAddress, txn, erc721, err := test_contracts.DeployMockErc721(auth, anvilClient) + st.AssertNoEVMError(err) + require.NotEmpty(contractAddress) + require.NotNil(erc721) + blockNum := xc_common.WaitForTransaction(anvilClient, txn) + require.NotNil(blockNum) + return auth, contractAddress, erc721 +} + +func TestErc721Entitlements(t *testing.T) { + tests := map[string]struct { + sentByRootKeyWallet bool + }{ + "request sent by root key wallet": {sentByRootKeyWallet: true}, + "request sent by linked wallet": {sentByRootKeyWallet: false}, + } + for name, tc := range tests { + t.Run(name, func(t *testing.T) { + ctx, cancel := test.NewTestContext() + ctx = dlog.CtxWithLog(ctx, noColorLogger()) + defer cancel() + + require := require.New(t) + st := newServiceTester(5, require) + defer st.Close() + st.Start(t) + + bc := st.ClientSimulatorBlockchain() + cs, err := client_simulator.New(ctx, st.Config(), bc, bc.Wallet) + require.NoError(err) + cs.Start(ctx) + defer cs.Stop() + + // Deploy mock ERC721 contract to anvil chain + auth, contractAddress, erc721 := deployMockErc721Contract(require, st) + + // Expect no NFT minted for the client simulator wallet + expectEntitlementCheckResult(require, cs, ctx, erc721Check(ChainID, contractAddress, 1), false) + + // Mint an NFT for client simulator wallet. + mintTokenForWallet(require, auth, st, erc721, cs.Wallet(), 1) + + // Check if the wallet a 1 balance of the NFT - should pass + expectEntitlementCheckResult(require, cs, ctx, erc721Check(ChainID, contractAddress, 1), true) + + // Checking for balance of 2 should fail + expectEntitlementCheckResult(require, cs, ctx, erc721Check(ChainID, contractAddress, 2), false) + + // Create a set of 3 linked wallets using client simulator address. + _, wallet1, wallet2, _ := generateLinkedWallets(ctx, require, tc.sentByRootKeyWallet, st, cs.Wallet()) + + // Sanity check: balance of 4 across all 3 wallets should fail + expectEntitlementCheckResult(require, cs, ctx, erc721Check(ChainID, contractAddress, 4), false) + + // Mint 2 NFTs for wallet1. + mintTokenForWallet(require, auth, st, erc721, wallet1, 2) + + // Mint 1 NFT for wallet2. + mintTokenForWallet(require, auth, st, erc721, wallet2, 1) + + // Accumulated balance of 4 across all 3 wallets should now pass + expectEntitlementCheckResult(require, cs, ctx, erc721Check(ChainID, contractAddress, 4), true) + }) + } +} + +func mintErc20TokensForWallet( + require *require.Assertions, + auth *bind.TransactOpts, + st *serviceTester, + erc20 *test_contracts.MockErc20, + wallet *node_crypto.Wallet, + amount int64, +) { + nonce, err := anvilClient.PendingNonceAt(context.Background(), anvilWallet.Address) + require.NoError(err) + auth.Nonce = big.NewInt(int64(nonce)) + txn, err := erc20.Mint(auth, wallet.Address, big.NewInt(amount)) + st.AssertNoEVMError(err) + require.NotNil(xc_common.WaitForTransaction(anvilClient, txn)) +} + +func deployMockErc20Contract( + require *require.Assertions, + st *serviceTester, +) (*bind.TransactOpts, common.Address, *test_contracts.MockErc20) { + // Deploy mock ERC20 contract to anvil chain + nonce, err := anvilClient.PendingNonceAt(context.Background(), anvilWallet.Address) + require.NoError(err) + auth, err := bind.NewKeyedTransactorWithChainID(anvilWallet.PrivateKeyStruct, big.NewInt(31337)) + require.NoError(err) + auth.Nonce = big.NewInt(int64(nonce)) + auth.Value = big.NewInt(0) // in wei + auth.GasLimit = uint64(30_000_000) // in units + + contractAddress, txn, erc20, err := test_contracts.DeployMockErc20(auth, anvilClient, "MockERC20", "M20") + require.NoError(err) + require.NotNil(xc_common.WaitForTransaction(anvilClient, txn), "Failed to mine ERC20 contract deployment") + return auth, contractAddress, erc20 +} + +func TestErc20Entitlements(t *testing.T) { + tests := map[string]struct { + sentByRootKeyWallet bool + }{ + "request sent by root key wallet": {sentByRootKeyWallet: true}, + "request sent by linked wallet": {sentByRootKeyWallet: false}, + } + for name, tc := range tests { + t.Run(name, func(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + + require := require.New(t) + st := newServiceTester(5, require) + defer st.Close() + st.Start(t) + + bc := st.ClientSimulatorBlockchain() + cs, err := client_simulator.New(ctx, st.Config(), bc, bc.Wallet) + require.NoError(err) + cs.Start(ctx) + defer cs.Stop() + + // Deploy mock ERC20 contract to anvil chain + auth, contractAddress, erc20 := deployMockErc20Contract(require, st) + + // Check for balance of 1 should fail, as this wallet has no coins. + expectEntitlementCheckResult(require, cs, ctx, erc20Check(ChainID, contractAddress, 1), false) + + // Mint 10 tokens for the client simulator wallet. + mintErc20TokensForWallet(require, auth, st, erc20, cs.Wallet(), 10) + + // Check for balance of 10 should pass. + expectEntitlementCheckResult(require, cs, ctx, erc20Check(ChainID, contractAddress, 10), true) + + // Checking for balance of 20 should fail + expectEntitlementCheckResult(require, cs, ctx, erc20Check(ChainID, contractAddress, 20), false) + + // Create a set of 3 linked wallets using client simulator address. + _, wallet1, wallet2, _ := generateLinkedWallets(ctx, require, tc.sentByRootKeyWallet, st, cs.Wallet()) + + // Sanity check: balance of 30 across all 3 wallets should fail + expectEntitlementCheckResult(require, cs, ctx, erc20Check(ChainID, contractAddress, 30), false) + + // Mint 19 tokens for wallet1. + mintErc20TokensForWallet(require, auth, st, erc20, wallet1, 19) + // Mint 1 token for wallet2. + mintErc20TokensForWallet(require, auth, st, erc20, wallet2, 1) + + // Accumulated balance of 30 across all 3 wallets should now pass + expectEntitlementCheckResult(require, cs, ctx, erc20Check(ChainID, contractAddress, 30), true) + }) + } +} + +func toggleEntitlement( + require *require.Assertions, + auth *bind.TransactOpts, + customEntitlement *contracts.MockCustomEntitlement, + wallet *node_crypto.Wallet, + response bool, +) { + // Update nonce + nonce, err := anvilClient.PendingNonceAt(context.Background(), anvilWallet.Address) + require.NoError(err) + auth.Nonce = big.NewInt(int64(nonce)) + + // Toggle contract response + txn, err := customEntitlement.SetEntitled(auth, []common.Address{wallet.Address}, response) + require.NoError(err) + blockNum := xc_common.WaitForTransaction(anvilClient, txn) + require.NotNil(blockNum) +} + +func deployMockCustomEntitlement( + require *require.Assertions, + st *serviceTester, +) (*bind.TransactOpts, common.Address, *contracts.MockCustomEntitlement) { + // Deploy mock custom entitlement contract to anvil chain + nonce, err := anvilClient.PendingNonceAt(context.Background(), anvilWallet.Address) + require.NoError(err) + auth, err := bind.NewKeyedTransactorWithChainID(anvilWallet.PrivateKeyStruct, big.NewInt(31337)) + require.NoError(err) + auth.Nonce = big.NewInt(int64(nonce)) + auth.Value = big.NewInt(0) // in wei + auth.GasLimit = uint64(30_000_000) // in units + + contractAddress, txn, customEntitlement, err := contracts.DeployMockCustomEntitlement( + auth, + anvilClient, + st.Config().GetContractVersion(), + ) + require.NoError(err) + require.NotNil( + xc_common.WaitForTransaction(anvilClient, txn), + "Failed to mine custom entitlement contract deployment", + ) + return auth, contractAddress, customEntitlement +} + +func TestCustomEntitlements(t *testing.T) { + tests := map[string]struct { + sentByRootKeyWallet bool + }{ + "request sent by root key wallet": {sentByRootKeyWallet: true}, + "request sent by linked wallet": {sentByRootKeyWallet: false}, + } + for name, tc := range tests { + t.Run(name, func(t *testing.T) { + ctx, cancel := test.NewTestContext() + defer cancel() + + require := require.New(t) + st := newServiceTester(5, require) + defer st.Close() + st.Start(t) + + bc := st.ClientSimulatorBlockchain() + cs, err := client_simulator.New(ctx, st.Config(), bc, bc.Wallet) + require.NoError(err) + cs.Start(ctx) + defer cs.Stop() + + // Deploy mock custom entitlement contract to anvil chain + auth, contractAddress, customEntitlement := deployMockCustomEntitlement(require, st) + + // Initially the check should fail. + customCheck := customEntitlementCheck(ChainID, contractAddress) + expectEntitlementCheckResult(require, cs, ctx, customCheck, false) + + toggleEntitlement(require, auth, customEntitlement, cs.Wallet(), true) + + // Check should now succeed. + expectEntitlementCheckResult(require, cs, ctx, customCheck, true) + + // Untoggle entitlement for client simulator wallet + toggleEntitlement(require, auth, customEntitlement, cs.Wallet(), false) + + // Create a set of 3 linked wallets using client simulator address. + _, wallet1, wallet2, wallet3 := generateLinkedWallets(ctx, require, tc.sentByRootKeyWallet, st, cs.Wallet()) + + for _, wallet := range []*node_crypto.Wallet{wallet1, wallet2, wallet3} { + // Check should fail for all wallets. + expectEntitlementCheckResult(require, cs, ctx, customCheck, false) + + // Toggle entitlement for a particular linked wallet + toggleEntitlement(require, auth, customEntitlement, wallet, true) + + // Check should now succeed for the wallet. + expectEntitlementCheckResult(require, cs, ctx, customCheck, true) + + // Untoggle entitlement for the wallet + toggleEntitlement(require, auth, customEntitlement, wallet, false) + } + }) + } +} diff --git a/core/xchain/stop_multi.sh b/core/xchain/stop_multi.sh new file mode 100755 index 000000000..7adba67ea --- /dev/null +++ b/core/xchain/stop_multi.sh @@ -0,0 +1,25 @@ +#!/bin/bash +set -euo pipefail + +# Change the current working directory to the directory of the script +cd "$(dirname "$0")" + +# Base directory for the instances +BASE_DIR="./run_files" + +# PID file for the script, stored in the RUN_ENV directory +SCRIPT_PID_FILE="${BASE_DIR}/${RUN_ENV}/launch_multi.pid" + + +if [[ -f "$SCRIPT_PID_FILE" ]]; then + old_pid=$(cat "$SCRIPT_PID_FILE") + if [[ -n "$old_pid" && "$old_pid" != "$$" ]]; then + echo "Stopping previous script instance with PID $old_pid" + kill "$old_pid" || true + while ps -p $old_pid > /dev/null 2>&1; do + sleep 1 # Wait for 1 second before checking again + done + echo "Previous script instance stopped." + fi +fi + diff --git a/core/xchain/util/chain.go b/core/xchain/util/chain.go new file mode 100644 index 000000000..3c5e0801e --- /dev/null +++ b/core/xchain/util/chain.go @@ -0,0 +1,73 @@ +package util + +import ( + "context" + "math/big" + "time" + + "github.com/river-build/river/core/node/base" + "github.com/river-build/river/core/node/protocol" + + "github.com/river-build/river/core/node/crypto" +) + +const ( + // MaxHistoricalBlockOffset is the maximum number of blocks to go back when searching for a start block. + MaxHistoricalBlockOffset uint64 = 100 +) + +func StartBlockNumber( + ctx context.Context, + client crypto.BlockchainClient, + deadline time.Time, +) (uint64, error) { + head, err := client.HeaderByNumber(ctx, nil) + if err != nil { + return 0, err + } + + // determine the first block with block.Time >= deadline, start at the maximum offset of 100 blocks + // and do a binary search to find the first block that satisfies the criteria. + var ( + last = head.Number.Uint64() + start = uint64(0) + step = MaxHistoricalBlockOffset + ) + + if step < last { // consider only last 100 blocks if chain > 100 blocks long + start = last - step + } + + for start <= last { + middle := (start + last) / 2 + middleHead, err := client.HeaderByNumber(ctx, new(big.Int).SetUint64(middle)) + if err != nil { + return 0, base.AsRiverError(err, protocol.Err_UNAVAILABLE).Message("Unable to determine start block") + } + t := time.Unix(int64(middleHead.Time), 0) + if t.After(deadline) { + last = middle - 1 + } else if t.Before(deadline) { + start = middle + 1 + } else { + return middle, nil + } + } + + return start, nil +} + +// StartBlockNumberWithHistory returns the first block with a timestamp that is equal or larger than the given history +// to look back. It will only go back MaxHistoricalBlockOffset blocks. +func StartBlockNumberWithHistory( + ctx context.Context, + client crypto.BlockchainClient, + history time.Duration, +) (uint64, error) { + if history < 0 || history > time.Minute { + return 0, base.AsRiverError(nil, protocol.Err_INVALID_ARGUMENT). + Message("History must be in range [0s, 1m]") + } + + return StartBlockNumber(ctx, client, time.Now().Add(-history)) +} diff --git a/core/xchain/util/chain_test.go b/core/xchain/util/chain_test.go new file mode 100644 index 000000000..6b504e660 --- /dev/null +++ b/core/xchain/util/chain_test.go @@ -0,0 +1,118 @@ +package util_test + +import ( + "core/xchain/util" + "testing" + "time" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/river-build/river/core/node/base/test" + "github.com/river-build/river/core/node/crypto" + "github.com/stretchr/testify/require" +) + +// TestStartBlockNumberRange ensures that utils.StartBlockNumber ensures that the duration to go back falls within an +// acceptable range. +func TestStartBlockNumberRange(t *testing.T) { + t.Parallel() + + var ( + require = require.New(t) + ctx, cancel = test.NewTestContext() + tests = []struct { + history time.Duration + }{ + {history: -1}, + {history: time.Minute + 1}, + } + ) + defer cancel() + + for _, tt := range tests { + _, err := util.StartBlockNumberWithHistory(ctx, nil, tt.history) + require.Error(err, "history expected out of range") + } +} + +// TestStartBlockNumber tests that utils.StartBlockNumber returns the correct block number given a deadline. +func TestStartBlockNumber(t *testing.T) { + t.Parallel() + + require := require.New(t) + ctx, cancel := test.NewTestContext() + defer cancel() + + btc, err := crypto.NewBlockchainTestContext(ctx, 0, false) + require.NoError(err, "instantiate blockchain test context") + defer btc.Close() + + // create several blocks so we can go back in history + var ( + blocks []*types.Header + client = btc.Client() + tests []struct { + deadline time.Time + exp uint64 + } + ) + + for i := 0; i < 4; i++ { + <-time.After(time.Duration(1+i) * time.Second) + btc.Commit(ctx) + + header, err := client.HeaderByNumber(ctx, nil) + require.NoError(err, "get header by number") + blocks = append(blocks, header) + t.Logf("block %d: %d", header.Number.Uint64(), header.Time) + } + + for _, b := range blocks { + tests = append(tests, struct { + deadline time.Time + exp uint64 + }{ + deadline: time.Unix(int64(b.Time), 0), + exp: b.Number.Uint64(), + }) + } + + for _, tt := range tests { + start, err := util.StartBlockNumber(ctx, client, tt.deadline) + require.NoError(err, "start block number") + require.Equalf(tt.exp, start, "unexpected start block number - deadline: %d", tt.deadline.Unix()) + } +} + +// TestStartBlockNumberLongChain tests that utils.StartBlockNumber returns the correct block number given a deadline +// on a chain that is longer than MaxHistoricalBlockOffset. +func TestStartBlockNumberLongChain(t *testing.T) { + t.Parallel() + + require := require.New(t) + ctx, cancel := test.NewTestContext() + defer cancel() + + btc, err := crypto.NewBlockchainTestContext(ctx, 0, false) + require.NoError(err, "instantiate blockchain test context") + defer btc.Close() + + // create a chain that has more blocks that MaxHistoricalBlockOffset + var ( + blocks []*types.Header + client = btc.Client() + ) + + for range int(util.MaxHistoricalBlockOffset) + 25 { + btc.Commit(ctx) + header, err := client.HeaderByNumber(ctx, nil) + require.NoError(err, "get header by number") + blocks = append(blocks, header) + } + + // go no more than util.MaxHistoricalBlockOffset blocks back + exp := blocks[len(blocks)-1-int(util.MaxHistoricalBlockOffset)].Number.Uint64() + + start, err := util.StartBlockNumberWithHistory(ctx, client, time.Minute) + require.NoError(err, "start block number") + require.Equal(exp, start, "unexpected start block number") +} diff --git a/core/xchain/util/credentials.go b/core/xchain/util/credentials.go new file mode 100644 index 000000000..4ac6b093a --- /dev/null +++ b/core/xchain/util/credentials.go @@ -0,0 +1,29 @@ +package util + +import ( + "context" + "os" + + "github.com/river-build/river/core/node/crypto" +) + +func LoadWallet(ctx context.Context) (*crypto.Wallet, error) { + var ( + wallet *crypto.Wallet + privKey = os.Getenv("WALLETPRIVATEKEY") + err error + ) + // Read env var WALLETPRIVATEKEY or PRIVATE_KEY + if privKey == "" { + privKey = os.Getenv("PRIVATE_KEY") + } + if privKey != "" { + wallet, err = crypto.NewWalletFromPrivKey(ctx, privKey) + } else { + wallet, err = crypto.LoadWallet(ctx, crypto.WALLET_PATH_PRIVATE_KEY) + } + if err != nil { + return nil, err + } + return wallet, err +} diff --git a/foundry.toml b/foundry.toml new file mode 100644 index 000000000..bcc7643e2 --- /dev/null +++ b/foundry.toml @@ -0,0 +1,52 @@ +[profile.default] +auto_detect_solc = false # Foundry will automatically try to resolve appropriate Solidity compiler versions +block_timestamp = 1_680_220_800 # The value of block.timestamp in tests. March 31, 2023 at 00:00 GMT +bytecode_hash = "none" # Determines the hash method for the metadata hash that is appended to the bytecode +cbor_metadata = false # Remove all metadata hashes from your contract's bytecode. +evm_version = "paris" # The EVM version to use during tests. +fuzz = { runs = 256 } # The amount of fuzz runs to perform for each fuzz test case. +gas_reports = ["*"] # The contracts to print gas reports for. +libs = ["node_modules", "lib"] +optimizer = true # Whether or not to enable the Solidity optimizer. +optimizer_runs = 200 # The amount of optimizer runs to perform. +out = "contracts/out" # The path to put contract artifacts in, relative to the root of the project. +script = "contracts/scripts" # The path to the contract scripts relative to the root of the project. +solc_version = "0.8.24" # Uses a single Solidity compiler version for the project +src = "contracts" # The path to the contract sources relative to the root of the project. +test = "contracts/test" # The path to the test contract sources relative to the root of the project. +cache_path = "contracts/cache" # The path to the cache, relative to the root of the project. +verbosity = 3 # The verbosity level to use during tests. +fs_permissions = [ + { access = "read-write", path = "./contracts/deployments" }, +] # Configures permissions for cheatcodes that touch the filesystem +extra_output = ["metadata", "abi", "bin"] +extra_output_files = ["metadata", "abi", "bin"] + +[etherscan] +sepolia = { key = "${ETHERSCAN_API_KEY}" } +base_sepolia = { key = "${BLOCKSCOUT_SEPOLIA_API_KEY}", url = "${BLOCKSCOUT_SEPOLIA_URL}" } +base = { key = "${BASESCAN_API_KEY}", url = "${BASESCAN_URL}" } +river = { key = "${RIVERSCAN_API_KEY}", url = "${RIVERSCAN_URL}" } +mainnet = { key = "${ETHERSCAN_API_KEY}" } + +[rpc_endpoints] +base_anvil = "${BASE_ANVIL_RPC_URL}" +river_anvil = "${RIVER_ANVIL_RPC_URL}" +river = "${RIVER_RPC_URL}" +sepolia = "${SEPOLIA_RPC_URL}" +base_sepolia = "${BASE_SEPOLIA_RPC_URL}" +base = "${BASE_RPC_URL}" +mainnet = "${MAINNET_RPC_URL}" + +[fmt] +line_length = 80 +tab_width = 2 +bracket_spacing = true +int_types = "long" +multiline_func_header = "all" +number_underscore = "thousands" +quote_style = "double" +wrap_comments = true + + +# See more config options https://github.com/foundry-rs/foundry/tree/master/config diff --git a/go.work b/go.work new file mode 100644 index 000000000..e89dc29d6 --- /dev/null +++ b/go.work @@ -0,0 +1,6 @@ +go 1.22.2 + +use ( + ./core/node + ./core/xchain +) diff --git a/package.json b/package.json new file mode 100644 index 000000000..18b1820c3 --- /dev/null +++ b/package.json @@ -0,0 +1,135 @@ +{ + "name": "river", + "version": "1.0.0", + "license": "MIT", + "private": true, + "packageManager": "yarn@3.8.0", + "scripts": { + "anvil": "yarn workspace @river/contracts exec anvil", + "build": "turbo build", + "cast": "yarn workspace @river/contracts exec cast", + "csb:build": "yarn workspace @river-build/proto run build && yarn workspace @river-build/dlog run build && yarn workspace @river-build/web3 run build && yarn workspace @river-build/encryption run build && yarn workspace @river/sdk run build && echo BUILD DONE || (echo BUILD ERROR; exit 1)", + "csb:cb": "yarn csb:clean && yarn csb:build", + "csb:clean": "yarn csb:command run clean", + "csb:command": "bash -c 'yarn workspaces foreach --verbose $(yarn csb:list:include) $0 $@'", + "csb:dev": "yarn csb:dev:entitlements", + "csb:dev:entitlements": "./core/scripts/launch.sh", + "csb:dev:no-entitlements": "./core/scripts/launch.sh --disable_entitlements", + "csb:list": "yarn workspaces list --json | grep core | grep -o '\"name\":\"[^\"]*' | grep -o '[^\"]*$'", + "csb:list:exclude:filter": "yarn csb:list | xargs -I arg echo -n \"--filter=!arg \"", + "csb:list:filter": "yarn csb:list | xargs -I arg echo -n \"--filter arg \"", + "csb:list:filter-without-sdk": "yarn csb:list | grep -v sdk | xargs -I arg echo -n \"--filter arg \"", + "csb:list:include": "yarn csb:list | xargs -I arg echo -n \"--include arg \"", + "csb:multi": "./core/scripts/launch_multi.sh", + "csb:multi:no-entitlements": "./core/scripts/launch_multi.sh --disable_entitlements", + "csb:node": "./core/scripts/start_node.sh", + "csb:prettier:check": "prettier --check ./core", + "csb:prettier:fix": "prettier --write ./core", + "csb:start": "yarn csb:start:entitlements", + "csb:start:entitlements": "./core/scripts/start_node.sh", + "csb:start:no-entitlements": "./core/scripts/start_node.sh --disable_entitlements", + "csb:stop": "./core/scripts/stop.sh", + "csb:storage": "./core/scripts/launch_storage.sh", + "csb:test": "yarn csb:command run test && echo ALL GOOD || (echo NOT PASSED; exit 1)", + "csb:test-remote": "yarn workspace @river/sdk run test", + "csb:turbo": "bash -c 'yarn run turbo run build test:ci $(yarn csb:list:filter)'", + "csb:turbo-no-sdk": "bash -c 'yarn run turbo run build test:ci $(yarn csb:list:filter-without-sdk) --no-cache --force'", + "csb:wait": "yarn csb:wait:entitlements", + "csb:wait:entitlements": "wait-on https://localhost:5157/info --timeout=900000 --i=5000 --verbose", + "csb:wait:no-entitlements": "wait-on https://localhost:5158/info --timeout=900000 --i=5000 --verbose", + "drt:wait": "wait-on tcp:8008 --timeout=900000 --i=5000 --verbose", + "harmonyweb:build": "turbo build --filter harmonyweb", + "install:foundry": "./scripts/foundry-up.sh && yarn forge install", + "lint": "turbo lint", + "postinstall": "husky install", + "prepare": "husky install", + "prettier:check": "prettier --check .", + "prettier:fix": "prettier --write .", + "publish:local": "turbo publish:local", + "sampleapp:build": "turbo build --filter sample-app", + "syncpack:check": "syncpack list-mismatches", + "syncpack:fix": "syncpack fix-mismatches && syncpack format", + "test": "turbo test", + "test:unit": "turbo test:unit -- --silent", + "worker:wait:stackup": "wait-on tcp:127.0.0.1:${PORT:-8686} --timeout=900000 --i=5000 --verbose", + "workers:build": "turbo build --filter gateway-worker --filter siwe-worker --filter token-worker --filter unfurl-worker --filter jwt-worker" + }, + "devDependencies": { + "@typechain/ethers-v5": "^10.1.1", + "@types/node": "^20.5.0", + "eslint": "^8.53.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-mocha": "^10.1.0", + "eslint-plugin-n": "^16.0.0", + "eslint-plugin-prettier": "^4.2.1", + "husky": "^8.0.1", + "lint-staged": "^13.1.2", + "prettier": "^2.8.8", + "solidity-docgen": "^0.6.0-beta.29", + "syncpack": "^10.7.3", + "ts-node": "^10.9.1", + "turbo": "^1.12.2", + "typechain": "^8.1.1", + "typescript": "^5.1.6", + "wait-on": "^7.0.1" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.{js,mdx,ts,tsx}": [ + "eslint --fix" + ], + "*.{json,yml}": [ + "prettier --write" + ] + }, + "resolutions": { + "jest-worker@^29.5.0": "patch:jest-worker@npm%3A29.5.0#./.yarn/patches/jest-worker-npm-29.5.0-70da3388f1.patch" + }, + "syncpack": { + "dependencyTypes": [ + "dev", + "prod", + "peer" + ], + "indent": " ", + "sortFirst": [ + "name", + "description", + "version", + "author", + "license", + "private", + "packageManager", + "type", + "main", + "types", + "scripts" + ], + "versionGroups": [ + { + "label": "Different versions in worker & client - need v2.x in workers, which breaks client", + "dependencies": [ + "siwe" + ], + "packages": [ + "siwe-worker", + "worker-common" + ], + "dependencyTypes": [ + "prod", + "dev", + "peer" + ] + } + ] + }, + "workspaces": [ + "core/*", + "packages/*", + "contracts" + ] +} diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json new file mode 100644 index 000000000..38759192f --- /dev/null +++ b/packages/eslint-config/package.json @@ -0,0 +1,7 @@ +{ + "name": "@harmony/eslint-config", + "version": "1.0.0", + "license": "MIT", + "private": true, + "main": "typescript.js" +} diff --git a/packages/eslint-config/react.js b/packages/eslint-config/react.js new file mode 100644 index 000000000..d950da4bc --- /dev/null +++ b/packages/eslint-config/react.js @@ -0,0 +1,104 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 8, + sourceType: 'module', + ecmaFeatures: { + impliedStrict: true, + experimentalObjectRestSpread: true, + }, + allowImportExportEverywhere: true, + }, + plugins: ['@typescript-eslint', 'import', 'react', 'jest'], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:import/warnings', + 'plugin:import/typescript', + 'react-app', + 'plugin:prettier/recommended', + 'prettier', + ], + rules: { + '@typescript-eslint/no-base-to-string': 'error', + 'import/no-named-as-default-member': 'off', + 'react/display-name': 'off', + 'react/jsx-boolean-value': ['warn', 'never'], + 'react/jsx-curly-brace-presence': ['error', { props: 'never', children: 'ignore' }], + 'react/jsx-wrap-multilines': 'error', + 'react/no-array-index-key': 'error', + 'react/no-multi-comp': 'off', + 'react/prop-types': 'off', + 'react/self-closing-comp': 'warn', + + 'react/jsx-sort-props': [ + 'warn', + { + shorthandFirst: true, + callbacksLast: true, + noSortAlphabetically: true, + }, + ], + 'import/order': [ + 'error', + { + groups: ['external', 'internal'], + }, + ], + 'sort-imports': [ + 'warn', + { + ignoreCase: false, + ignoreDeclarationSort: true, + ignoreMemberSort: false, + }, + ], + }, + overrides: [ + { + files: ['src/*.mdx'], + extends: ['plugin:mdx/recommended'], + rules: { + 'prettier/prettier': 'off', + 'import/no-anonymous-default-export': 'off', + 'react/display-name': 'off', + 'react/jsx-no-undef': 'off', + 'no-undef': 'warn', + }, + settings: { + 'mdx/code-blocks': true, + }, + }, + { + files: ['src/*.{md,mdx}'], + extends: 'plugin:mdx/code-blocks', + rules: { + 'prettier/prettier': 'off', + '@typescript-eslint/no-unused-vars': 'off', + 'import/no-unresolved': 'off', + 'react/react-in-jsx-scope': 'off', + 'react/jsx-no-undef': 'off', + }, + }, + ], + settings: { + 'import/parsers': { + '@typescript-eslint/parser': ['.ts', '.tsx', '.d.ts'], + }, + 'import/resolver': { + typescript: { + alwaysTryTypes: true, + project: ['./tsconfig.json'], + }, + }, + react: { + version: 'detect', + }, + }, + env: { + es6: true, + browser: true, + node: true, + jest: true, + }, +} diff --git a/packages/eslint-config/typescript.js b/packages/eslint-config/typescript.js new file mode 100644 index 000000000..c0e5d2878 --- /dev/null +++ b/packages/eslint-config/typescript.js @@ -0,0 +1,122 @@ +module.exports = { + /** + * Note: `parser` and `parserOptions` should be always provided on the package level given the way eslint resolves parser options paths + * parser: '@typescript-eslint/parser', + * parserOptions: { + * ecmaVersion: 2020, // Allows for the parsing of modern ECMAScript features + * sourceType: 'module', // Allows for the use of imports + * project: './tsconfig.json', + * tsconfigRootDir: './', + * }, + */ + env: { + es6: true, + commonjs: true, + }, + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:@typescript-eslint/recommended-requiring-type-checking', + 'plugin:import/typescript', + 'prettier', + 'plugin:prettier/recommended', + ], + plugins: ['@typescript-eslint', 'import'], + overrides: [ + { + files: ['*.ts', '*.tsx'], + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint/eslint-plugin'], + rules: { + // Overwrites ts rules that conflicts with basic eslint rules + + /** + * `no-shadow` doesn't support Typescript enums + * see https://github.com/typescript-eslint/typescript-eslint/issues/2483 + */ + 'no-shadow': 'off', + '@typescript-eslint/no-shadow': 'error', + + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + }, + ], + + '@typescript-eslint/naming-convention': [ + 'error', + { + selector: 'interface', + format: ['PascalCase'], + prefix: ['I'], + }, + ], + }, + }, + ], + rules: { + 'no-console': 'error', + 'no-void': ['error', { allowAsStatement: true }], + 'no-restricted-imports': [ + 'error', + { + paths: [ + { + name: 'lodash', + message: 'Please use lodash submodules imports.', + }, + { + name: 'lodash/fp', + message: 'Please use lodash submodules imports.', + }, + ], + }, + ], + 'no-constant-condition': 'off', + + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/require-await': 'off', + + '@typescript-eslint/no-misused-promises': [ + 'error', + { + checksVoidReturn: false, + }, + ], + + /** + * Import eslint rules + */ + 'import/no-cycle': ['error', { ignoreExternal: true }], + 'import/no-useless-path-segments': 'error', + 'import/no-extraneous-dependencies': 'error', + 'import/no-default-export': 'error', + 'import/order': [ + 'error', + { + groups: [ + 'builtin', + 'external', + 'unknown', + ['internal', 'parent', 'sibling', 'index'], + ], + pathGroups: [ + { + pattern: '$**', + group: 'unknown', + position: 'after', + }, + ], + 'newlines-between': 'always', + }, + ], + 'import/no-duplicates': 'error', + }, +} diff --git a/packages/generated/.gitignore b/packages/generated/.gitignore new file mode 100644 index 000000000..d80c5e790 --- /dev/null +++ b/packages/generated/.gitignore @@ -0,0 +1,4 @@ +# the env file is generated with yarn preinstall or scripts/make-environment.sh +config/* +# ignore any known localhost deployments +deployments/local* \ No newline at end of file diff --git a/packages/generated/README.md b/packages/generated/README.md new file mode 100644 index 000000000..861d90e1b --- /dev/null +++ b/packages/generated/README.md @@ -0,0 +1,25 @@ +# @harmony/contracts + +## How to bundle and publish this package? + +From the root of the repo, run: + +```bash +./scripts/build-contract-types.sh +``` + +## How to install this package in a workspace? + +```bash +yarn workspace @harmony/{workspace_name} add @harmony/contracts +``` + +## What are deployments? + +Deployments are a group of contracts on multiple chains that together make up a river environment + +from the root of the repo run ./scripts/deploy-contracts.sh --e single + +## Addresses + +One off contracts that are important to the ecosystem at large \ No newline at end of file diff --git a/packages/generated/addresses/base_sepolia/airdrop.json b/packages/generated/addresses/base_sepolia/airdrop.json new file mode 100644 index 000000000..18a54d0d5 --- /dev/null +++ b/packages/generated/addresses/base_sepolia/airdrop.json @@ -0,0 +1 @@ +{"address":"0x37F83D12825EBa5F648b5D74a0AE2b7EbbF2F146"} \ No newline at end of file diff --git a/packages/generated/addresses/ethereum_mainnet/river.json b/packages/generated/addresses/ethereum_mainnet/river.json new file mode 100644 index 000000000..d9160ec5f --- /dev/null +++ b/packages/generated/addresses/ethereum_mainnet/river.json @@ -0,0 +1 @@ +{"address": "0x53319181e003E7f86fB79f794649a2aB680Db244"} diff --git a/packages/generated/addresses/sepolia/river.json b/packages/generated/addresses/sepolia/river.json new file mode 100644 index 000000000..7c4d9a174 --- /dev/null +++ b/packages/generated/addresses/sepolia/river.json @@ -0,0 +1 @@ +{"address":"0x40eF1bb984503bb5Adef041A88a4F9180e8586f9"} \ No newline at end of file diff --git a/packages/generated/deployments/gamma/base/addresses/authorizedClaimers.json b/packages/generated/deployments/gamma/base/addresses/authorizedClaimers.json new file mode 100644 index 000000000..0a4c1a431 --- /dev/null +++ b/packages/generated/deployments/gamma/base/addresses/authorizedClaimers.json @@ -0,0 +1 @@ +{"address":"0x74032476f0Db6aF6bab77074433a04B5659D3cF6"} \ No newline at end of file diff --git a/packages/generated/deployments/gamma/base/addresses/baseRegistry.json b/packages/generated/deployments/gamma/base/addresses/baseRegistry.json new file mode 100644 index 000000000..76e6c3331 --- /dev/null +++ b/packages/generated/deployments/gamma/base/addresses/baseRegistry.json @@ -0,0 +1 @@ +{"address":"0x08cC41b782F27d62995056a4EF2fCBAe0d3c266F"} diff --git a/packages/generated/deployments/gamma/base/addresses/entitlementChecker.json b/packages/generated/deployments/gamma/base/addresses/entitlementChecker.json new file mode 100644 index 000000000..76e6c3331 --- /dev/null +++ b/packages/generated/deployments/gamma/base/addresses/entitlementChecker.json @@ -0,0 +1 @@ +{"address":"0x08cC41b782F27d62995056a4EF2fCBAe0d3c266F"} diff --git a/packages/generated/deployments/gamma/base/addresses/multiInit.json b/packages/generated/deployments/gamma/base/addresses/multiInit.json new file mode 100644 index 000000000..848dcdc19 --- /dev/null +++ b/packages/generated/deployments/gamma/base/addresses/multiInit.json @@ -0,0 +1 @@ +{"address":"0x6CE0b1d4Ff723E24129db83F2baC4845805B5f5a"} \ No newline at end of file diff --git a/packages/generated/deployments/gamma/base/addresses/ruleEntitlement.json b/packages/generated/deployments/gamma/base/addresses/ruleEntitlement.json new file mode 100644 index 000000000..1d50a0a55 --- /dev/null +++ b/packages/generated/deployments/gamma/base/addresses/ruleEntitlement.json @@ -0,0 +1 @@ +{"address":"0x56147104aBFB0294c8af995bF335e50b44F671F0"} diff --git a/packages/generated/deployments/gamma/base/addresses/space.json b/packages/generated/deployments/gamma/base/addresses/space.json new file mode 100644 index 000000000..40f1d4a78 --- /dev/null +++ b/packages/generated/deployments/gamma/base/addresses/space.json @@ -0,0 +1 @@ +{"address":"0x0Fd3f9E6C2530424b8C82dcFf3552e91c965DC1f"} diff --git a/packages/generated/deployments/gamma/base/addresses/spaceFactory.json b/packages/generated/deployments/gamma/base/addresses/spaceFactory.json new file mode 100644 index 000000000..cea3a1ea8 --- /dev/null +++ b/packages/generated/deployments/gamma/base/addresses/spaceFactory.json @@ -0,0 +1 @@ +{"address":"0x968696BC59431Ef085441641f550C8e2Eaca8BEd"} \ No newline at end of file diff --git a/packages/generated/deployments/gamma/base/addresses/spaceOwner.json b/packages/generated/deployments/gamma/base/addresses/spaceOwner.json new file mode 100644 index 000000000..03e384418 --- /dev/null +++ b/packages/generated/deployments/gamma/base/addresses/spaceOwner.json @@ -0,0 +1 @@ +{"address":"0x9dEdb330A126C6dF2893a33018bb81aFE8573805"} \ No newline at end of file diff --git a/packages/generated/deployments/gamma/base/addresses/userEntitlement.json b/packages/generated/deployments/gamma/base/addresses/userEntitlement.json new file mode 100644 index 000000000..3fbfb4d2b --- /dev/null +++ b/packages/generated/deployments/gamma/base/addresses/userEntitlement.json @@ -0,0 +1 @@ +{"address":"0xfEcF282a3B1cebe1116434C3adCDD86889FfdAD6"} \ No newline at end of file diff --git a/packages/generated/deployments/gamma/base/addresses/walletLink.json b/packages/generated/deployments/gamma/base/addresses/walletLink.json new file mode 100644 index 000000000..124500256 --- /dev/null +++ b/packages/generated/deployments/gamma/base/addresses/walletLink.json @@ -0,0 +1 @@ +{"address":"0x968696BC59431Ef085441641f550C8e2Eaca8BEd"} diff --git a/packages/generated/deployments/gamma/base/chainId.json b/packages/generated/deployments/gamma/base/chainId.json new file mode 100644 index 000000000..6fabeccba --- /dev/null +++ b/packages/generated/deployments/gamma/base/chainId.json @@ -0,0 +1 @@ +{ "id": 84532 } \ No newline at end of file diff --git a/packages/generated/deployments/gamma/base/contractVersion.json b/packages/generated/deployments/gamma/base/contractVersion.json new file mode 100644 index 000000000..c1c6e9266 --- /dev/null +++ b/packages/generated/deployments/gamma/base/contractVersion.json @@ -0,0 +1 @@ +{"version":"v3"} \ No newline at end of file diff --git a/packages/generated/deployments/gamma/river/addresses/riverRegistry.json b/packages/generated/deployments/gamma/river/addresses/riverRegistry.json new file mode 100644 index 000000000..ab85fad8e --- /dev/null +++ b/packages/generated/deployments/gamma/river/addresses/riverRegistry.json @@ -0,0 +1 @@ +{"address":"0xf18E98D36A6bd1aDb52F776aCc191E69B491c070"} \ No newline at end of file diff --git a/packages/generated/deployments/gamma/river/chainId.json b/packages/generated/deployments/gamma/river/chainId.json new file mode 100644 index 000000000..3f6428995 --- /dev/null +++ b/packages/generated/deployments/gamma/river/chainId.json @@ -0,0 +1 @@ +{ "id": 6524490 } \ No newline at end of file diff --git a/packages/generated/deployments/gamma/river/contractVersion.json b/packages/generated/deployments/gamma/river/contractVersion.json new file mode 100644 index 000000000..c1c6e9266 --- /dev/null +++ b/packages/generated/deployments/gamma/river/contractVersion.json @@ -0,0 +1 @@ +{"version":"v3"} \ No newline at end of file diff --git a/packages/generated/deployments/gamma/sepolia/addresses/authorizedClaimers.json b/packages/generated/deployments/gamma/sepolia/addresses/authorizedClaimers.json new file mode 100644 index 000000000..cfa7be3b6 --- /dev/null +++ b/packages/generated/deployments/gamma/sepolia/addresses/authorizedClaimers.json @@ -0,0 +1 @@ +{"address":"0xeeDCAB3c3B032D5627dcF5e1475E0e24a88b4A21"} \ No newline at end of file diff --git a/packages/generated/deployments/gamma/sepolia/addresses/riverMainnet.json b/packages/generated/deployments/gamma/sepolia/addresses/riverMainnet.json new file mode 100644 index 000000000..7c4d9a174 --- /dev/null +++ b/packages/generated/deployments/gamma/sepolia/addresses/riverMainnet.json @@ -0,0 +1 @@ +{"address":"0x40eF1bb984503bb5Adef041A88a4F9180e8586f9"} \ No newline at end of file diff --git a/packages/generated/deployments/gamma/sepolia/chainId.json b/packages/generated/deployments/gamma/sepolia/chainId.json new file mode 100644 index 000000000..16d27f38d --- /dev/null +++ b/packages/generated/deployments/gamma/sepolia/chainId.json @@ -0,0 +1 @@ +{ "id": 11155111 } diff --git a/packages/generated/deployments/gamma/sepolia/contractVersion.json b/packages/generated/deployments/gamma/sepolia/contractVersion.json new file mode 100644 index 000000000..c1c6e9266 --- /dev/null +++ b/packages/generated/deployments/gamma/sepolia/contractVersion.json @@ -0,0 +1 @@ +{"version":"v3"} \ No newline at end of file diff --git a/packages/generated/dev/abis/Architect.abi.json b/packages/generated/dev/abis/Architect.abi.json new file mode 100644 index 000000000..f533696b7 --- /dev/null +++ b/packages/generated/dev/abis/Architect.abi.json @@ -0,0 +1,496 @@ +[ + { + "type": "function", + "name": "__Architect_init", + "inputs": [ + { + "name": "ownerImplementation", + "type": "address", + "internalType": "contract ISpaceOwner" + }, + { + "name": "userEntitlementImplementation", + "type": "address", + "internalType": "contract IUserEntitlement" + }, + { + "name": "ruleEntitlementImplementation", + "type": "address", + "internalType": "contract IRuleEntitlement" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "createSpace", + "inputs": [ + { + "name": "spaceInfo", + "type": "tuple", + "internalType": "struct IArchitectBase.SpaceInfo", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "uri", + "type": "string", + "internalType": "string" + }, + { + "name": "membership", + "type": "tuple", + "internalType": "struct IArchitectBase.Membership", + "components": [ + { + "name": "settings", + "type": "tuple", + "internalType": "struct IMembershipBase.Membership", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol", + "type": "string", + "internalType": "string" + }, + { + "name": "price", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maxSupply", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "duration", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "currency", + "type": "address", + "internalType": "address" + }, + { + "name": "feeRecipient", + "type": "address", + "internalType": "address" + }, + { + "name": "freeAllocation", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "pricingModule", + "type": "address", + "internalType": "address" + } + ] + }, + { + "name": "requirements", + "type": "tuple", + "internalType": "struct IArchitectBase.MembershipRequirements", + "components": [ + { + "name": "everyone", + "type": "bool", + "internalType": "bool" + }, + { + "name": "users", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "ruleData", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ] + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + } + ] + }, + { + "name": "channel", + "type": "tuple", + "internalType": "struct IArchitectBase.ChannelInfo", + "components": [ + { + "name": "metadata", + "type": "string", + "internalType": "string" + } + ] + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getSpaceArchitectImplementations", + "inputs": [], + "outputs": [ + { + "name": "spaceToken", + "type": "address", + "internalType": "contract ISpaceOwner" + }, + { + "name": "userEntitlementImplementation", + "type": "address", + "internalType": "contract IUserEntitlement" + }, + { + "name": "ruleEntitlementImplementation", + "type": "address", + "internalType": "contract IRuleEntitlement" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getSpaceByTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getTokenIdBySpace", + "inputs": [ + { + "name": "space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "setSpaceArchitectImplementations", + "inputs": [ + { + "name": "spaceToken", + "type": "address", + "internalType": "contract ISpaceOwner" + }, + { + "name": "userEntitlementImplementation", + "type": "address", + "internalType": "contract IUserEntitlement" + }, + { + "name": "ruleEntitlementImplementation", + "type": "address", + "internalType": "contract IRuleEntitlement" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SpaceCreated", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "space", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Architect__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Architect__InvalidNetworkId", + "inputs": [] + }, + { + "type": "error", + "name": "Architect__InvalidStringLength", + "inputs": [] + }, + { + "type": "error", + "name": "Architect__NotContract", + "inputs": [] + }, + { + "type": "error", + "name": "Factory__FailedDeployment", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "ReentrancyGuard__ReentrantCall", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidAddress", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/Architect.abi.ts b/packages/generated/dev/abis/Architect.abi.ts new file mode 100644 index 000000000..bd1e9f7f3 --- /dev/null +++ b/packages/generated/dev/abis/Architect.abi.ts @@ -0,0 +1,496 @@ +export default [ + { + "type": "function", + "name": "__Architect_init", + "inputs": [ + { + "name": "ownerImplementation", + "type": "address", + "internalType": "contract ISpaceOwner" + }, + { + "name": "userEntitlementImplementation", + "type": "address", + "internalType": "contract IUserEntitlement" + }, + { + "name": "ruleEntitlementImplementation", + "type": "address", + "internalType": "contract IRuleEntitlement" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "createSpace", + "inputs": [ + { + "name": "spaceInfo", + "type": "tuple", + "internalType": "struct IArchitectBase.SpaceInfo", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "uri", + "type": "string", + "internalType": "string" + }, + { + "name": "membership", + "type": "tuple", + "internalType": "struct IArchitectBase.Membership", + "components": [ + { + "name": "settings", + "type": "tuple", + "internalType": "struct IMembershipBase.Membership", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol", + "type": "string", + "internalType": "string" + }, + { + "name": "price", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maxSupply", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "duration", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "currency", + "type": "address", + "internalType": "address" + }, + { + "name": "feeRecipient", + "type": "address", + "internalType": "address" + }, + { + "name": "freeAllocation", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "pricingModule", + "type": "address", + "internalType": "address" + } + ] + }, + { + "name": "requirements", + "type": "tuple", + "internalType": "struct IArchitectBase.MembershipRequirements", + "components": [ + { + "name": "everyone", + "type": "bool", + "internalType": "bool" + }, + { + "name": "users", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "ruleData", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ] + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + } + ] + }, + { + "name": "channel", + "type": "tuple", + "internalType": "struct IArchitectBase.ChannelInfo", + "components": [ + { + "name": "metadata", + "type": "string", + "internalType": "string" + } + ] + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getSpaceArchitectImplementations", + "inputs": [], + "outputs": [ + { + "name": "spaceToken", + "type": "address", + "internalType": "contract ISpaceOwner" + }, + { + "name": "userEntitlementImplementation", + "type": "address", + "internalType": "contract IUserEntitlement" + }, + { + "name": "ruleEntitlementImplementation", + "type": "address", + "internalType": "contract IRuleEntitlement" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getSpaceByTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getTokenIdBySpace", + "inputs": [ + { + "name": "space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "setSpaceArchitectImplementations", + "inputs": [ + { + "name": "spaceToken", + "type": "address", + "internalType": "contract ISpaceOwner" + }, + { + "name": "userEntitlementImplementation", + "type": "address", + "internalType": "contract IUserEntitlement" + }, + { + "name": "ruleEntitlementImplementation", + "type": "address", + "internalType": "contract IRuleEntitlement" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SpaceCreated", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "space", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Architect__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Architect__InvalidNetworkId", + "inputs": [] + }, + { + "type": "error", + "name": "Architect__InvalidStringLength", + "inputs": [] + }, + { + "type": "error", + "name": "Architect__NotContract", + "inputs": [] + }, + { + "type": "error", + "name": "Factory__FailedDeployment", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "ReentrancyGuard__ReentrantCall", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidAddress", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/Architect.bin b/packages/generated/dev/abis/Architect.bin new file mode 100644 index 000000000..2f2f9e009 --- /dev/null +++ b/packages/generated/dev/abis/Architect.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b61431b80620000d46000396000f3fe60806040523480156200001157600080fd5b50600436106200006a5760003560e01c8063545efb2d146200006f578063673f0dd514620000a85780637d8c452214620000d85780638bfc94b914620000ef578063c0bc67961462000108578063dc1b9f23146200012e575b600080fd5b6200007962000145565b604080516001600160a01b03948516815292841660208401529216918101919091526060015b60405180910390f35b620000bf620000b93660046200128f565b620001c2565b6040516001600160a01b0390911681526020016200009f565b620000bf620000e936600462001a75565b62000200565b620001066200010036600462001b5e565b620002ef565b005b6200011f6200011936600462001bb0565b62000352565b6040519081526020016200009f565b620001066200013f36600462001b5e565b62000390565b6000806000620001b7600080516020620042fb833981519152547f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d01547f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d02546001600160a01b0392831693918316921690565b925092509250909192565b60008181527f06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f000260205260408120546001600160a01b03165b92915050565b600060027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0054036200024557604051635db5c7cd60e11b815260040160405180910390fd5b6200026f60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b7fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff1615620002b3576040516302ca8ced60e11b815260040160405180910390fd5b620002be82620003db565b9050620002ea60017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b919050565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b0316331462000340576040516365f4906560e01b815233600482015260240160405180910390fd5b6200034d8383836200077c565b505050565b6001600160a01b03811660009081527f06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f00016020526040812054620001fa565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166200034057604051630ef4733760e31b815260040160405180910390fd5b600080516020620042fb833981519152805460408051631d5e528f60e21b815290516000937f06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f000093909285926001600160a01b03909216916375794a3c916004808201926020929091908290030181865afa1580156200045e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000484919062001bd7565b9050620004968186604001516200088b565b8354909450836000620004a98362001bf1565b90915550506000818152600284016020908152604080832080546001600160a01b0319166001600160a01b03898116918217909255845260018701835292819020849055845488519289015191516391de4a8360e01b81529316926391de4a83926200051c929091899060040162001c6d565b6020604051808303816000875af11580156200053c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000562919062001bd7565b50600182015460009062000580906001600160a01b031686620008b5565b6002840154909150600090620005a0906001600160a01b031687620008b5565b60408051600280825260608201835292935060009290916020830190803683370190505090508281600081518110620005dd57620005dd62001caf565b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811062000614576200061462001caf565b6001600160a01b039283166020918202929092010152604051638bfc820f60e01b815290881690638bfc820f906200065190849060040162001cc5565b600060405180830381600087803b1580156200066c57600080fd5b505af115801562000681573d6000803e3d6000fd5b505050506200069b8784848b604001516020015162000972565b50604080890151805151910151600091620006ba918a91908762000da5565b9050620006cd88828b6060015162000f35565b8554604051632142170760e11b8152306004820152336024820152604481018790526001600160a01b03909116906342842e0e90606401600060405180830381600087803b1580156200071f57600080fd5b505af115801562000734573d6000803e3d6000fd5b50506040516001600160a01b038b16925087915033907fe50fc3942f8a2d7e5a7c8fb9488499eba5255b41e18bc3f1b4791402976d1d0b90600090a450505050505050919050565b826001600160a01b03163b600003620007a8576040516302f3d00b60e01b815260040160405180910390fd5b816001600160a01b03163b600003620007d4576040516302f3d00b60e01b815260040160405180910390fd5b806001600160a01b03163b60000362000800576040516302f3d00b60e01b815260040160405180910390fd5b600080516020620042fb83398151915280546001600160a01b039485166001600160a01b0319918216179091557f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d018054938516938216939093179092557f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d028054919093169116179055565b60008060006200089c858562001036565b91509150620008ac8282620011d3565b95945050505050565b60008060405180602001620008ca9062001273565b601f1982820381018352601f9091011660408190526001600160a01b0385166024820152859060440160408051601f19818403018152918152602080830180516001600160e01b031663189acdbd60e31b17905290516200092e9392910162001d14565b60408051601f19818403018152908290526200094e929160200162001d3a565b60405160208183030381529060405290506200096a816200120e565b949350505050565b604080516001808252818301909252600091829190816020015b60608152602001906001900390816200098c579050509050604051806040016040528060098152602001684a6f696e537061636560b81b81525081600081518110620009dc57620009dc62001caf565b6020026020010181905250856001600160a01b0316638fcd793d6040518060400160405280600681526020016526b4b73a32b960d11b8152508360006001600160401b0381111562000a325762000a32620012a9565b60405190808252806020026020018201604052801562000a7a57816020015b60408051808201909152600081526060602082015281526020019060019003908162000a515790505b506040518463ffffffff1660e01b815260040162000a9b9392919062001d96565b6020604051808303816000875af115801562000abb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ae1919062001bd7565b83519092501562000bef576040805160018082528183019092526000916020808301908036833701905050905060018160008151811062000b265762000b2662001caf565b60200260200101906001600160a01b031690816001600160a01b031681525050866001600160a01b031663ba201ba88460405180604001604052808a6001600160a01b031681526020018560405160200162000b83919062001cc5565b6040516020818303038152906040528152506040518363ffffffff1660e01b815260040162000bb492919062001e68565b600060405180830381600087803b15801562000bcf57600080fd5b505af115801562000be4573d6000803e3d6000fd5b505050505062000d9c565b6020830151511562000ce85760005b83602001515181101562000c405762000c378460200151828151811062000c295762000c2962001caf565b602002602001015162001248565b60010162000bfe565b50856001600160a01b031663ba201ba8836040518060400160405280896001600160a01b03168152602001876020015160405160200162000c82919062001cc5565b6040516020818303038152906040528152506040518363ffffffff1660e01b815260040162000cb392919062001e68565b600060405180830381600087803b15801562000cce57600080fd5b505af115801562000ce3573d6000803e3d6000fd5b505050505b604083015151511562000d9c57856001600160a01b031663ba201ba8836040518060400160405280886001600160a01b03168152602001876040015160405160200162000d36919062001f80565b6040516020818303038152906040528152506040518363ffffffff1660e01b815260040162000d6792919062001e68565b600060405180830381600087803b15801562000d8257600080fd5b505af115801562000d97573d6000803e3d6000fd5b505050505b50949350505050565b6040805160018082528183019092526000918291906020808301908036833701905050905060018160008151811062000de25762000de262001caf565b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252600091816020015b60408051808201909152600081526060602082015281526020019060019003908162000e12579050509050838160008151811062000e545762000e5462001caf565b6020908102919091018101516001600160a01b0390921690915260405162000e7f9184910162001cc5565b6040516020818303038152906040528160008151811062000ea45762000ea462001caf565b6020908102919091018101510152604051638fcd793d60e01b81526001600160a01b03881690638fcd793d9062000ee49089908990869060040162001d96565b6020604051808303816000875af115801562000f04573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f2a919062001bd7565b979650505050505050565b60408051600180825281830190925260009160208083019080368337019050509050828160008151811062000f6e5762000f6e62001caf565b602090810291909101810191909152604051600160fd1b918101919091526bffffffffffffffffffffffff19606086901b16602182015260009060350160405160208183030381529060405262000fc5906200202b565b835160405163921f717560e01b81529192506001600160a01b0387169163921f71759162000ffb91859190879060040162002053565b600060405180830381600087803b1580156200101657600080fd5b505af11580156200102b573d6000803e3d6000fd5b505050505050505050565b6060600080600080516020620042fb8339815191526040805133602082015290810187905242606082015290915060800160405160208183030381529060405280519060200120915060405180602001620010919062001281565b601f19828203810183526040601f90920116818101825263dc9cc64560e01b8152306020828101919091528251808401845285546001600160a01b0390811682528183018b90528451610120810186528a515181528a518401519381019390935289518501519483019490945288516060908101519083015288516080908101516001600160401b031690830152885160a090810151851690830152885160c09081015133959293929183019116156200115157895160c0015162001153565b335b6001600160a01b03168152602001896000015160e001518152602001896000015161010001516001600160a01b03168152506040516020016200119a9493929190620020b4565b60408051601f1981840301815290829052620011ba929160200162001d3a565b6040516020818303038152906040529250509250929050565b60008260200183518381836000f59250506001600160a01b0382169050620001fa5760405163ef35ca1960e01b815260040160405180910390fd5b600081602001825180826000f09250506001600160a01b0382169050620002ea5760405163ef35ca1960e01b815260040160405180910390fd5b6001600160a01b03811662001270576040516302e47d1560e41b815260040160405180910390fd5b50565b6103d480620021b083390190565b611d77806200258483390190565b600060208284031215620012a257600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620012e457620012e4620012a9565b60405290565b604051606081016001600160401b0381118282101715620012e457620012e4620012a9565b604080519081016001600160401b0381118282101715620012e457620012e4620012a9565b60405161012081016001600160401b0381118282101715620012e457620012e4620012a9565b604051601f8201601f191681016001600160401b0381118282101715620013855762001385620012a9565b604052919050565b600082601f8301126200139f57600080fd5b81356001600160401b03811115620013bb57620013bb620012a9565b620013d0601f8201601f19166020016200135a565b818152846020838601011115620013e657600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160401b0381168114620002ea57600080fd5b6001600160a01b03811681146200127057600080fd5b8035620002ea816200141b565b60006001600160401b038211156200145a576200145a620012a9565b5060051b60200190565b600381106200127057600080fd5b803560ff81168114620002ea57600080fd5b600082601f8301126200149657600080fd5b81356020620014af620014a9836200143e565b6200135a565b82815260079290921b84018101918181019086841115620014cf57600080fd5b8286015b84811015620015415760808189031215620014ee5760008081fd5b620014f8620012bf565b813560068110620015095760008081fd5b8152818501358582015260408083013562001524816200141b565b9082015260608281013590820152835291830191608001620014d3565b509695505050505050565b600082601f8301126200155e57600080fd5b8135602062001571620014a9836200143e565b828152606092830285018201928282019190878511156200159157600080fd5b8387015b85811015620015fa5781818a031215620015af5760008081fd5b620015b9620012ea565b8135620015c68162001464565b8152620015d582870162001472565b868201526040620015e881840162001472565b90820152845292840192810162001595565b5090979650505050505050565b6000606082840312156200161a57600080fd5b62001624620012ea565b905081356001600160401b03808211156200163e57600080fd5b818401915084601f8301126200165357600080fd5b8135602062001666620014a9836200143e565b82815260069290921b840181019181810190888411156200168657600080fd5b948201945b83861015620016e3576040868a031215620016a65760008081fd5b620016b06200130f565b8635620016bd8162001464565b8152620016cc87850162001472565b81850152825260409590950194908201906200168b565b86525085810135935082841115620016fa57600080fd5b620017088785880162001484565b908501525060408401359150808211156200172257600080fd5b5062001731848285016200154c565b60408301525092915050565b6000606082840312156200175057600080fd5b6200175a620012ea565b9050813580151581146200176d57600080fd5b81526020828101356001600160401b03808211156200178b57600080fd5b818501915085601f830112620017a057600080fd5b8135620017b1620014a9826200143e565b81815260059190911b83018401908481019088831115620017d157600080fd5b938501935b82851015620017fc578435620017ec816200141b565b82529385019390850190620017d6565b808688015250505060408501359250808311156200181957600080fd5b5050620017318482850162001607565b600082601f8301126200183b57600080fd5b813560206200184e620014a9836200143e565b82815260059290921b840181019181810190868411156200186e57600080fd5b8286015b84811015620015415780356001600160401b03811115620018935760008081fd5b620018a38986838b01016200138d565b84525091830191830162001872565b600060608284031215620018c557600080fd5b620018cf620012ea565b905081356001600160401b0380821115620018e957600080fd5b908301906101208286031215620018ff57600080fd5b6200190962001334565b8235828111156200191957600080fd5b62001927878286016200138d565b8252506020830135828111156200193d57600080fd5b6200194b878286016200138d565b6020830152506040830135604082015260608301356060820152620019736080840162001403565b60808201526200198660a0840162001431565b60a08201526200199960c0840162001431565b60c082015260e083013560e0820152610100620019b881850162001431565b9082015283526020840135915080821115620019d357600080fd5b620019e1858386016200173d565b60208401526040840135915080821115620019fb57600080fd5b50620017318482850162001829565b60006020828403121562001a1d57600080fd5b604051602081016001600160401b03828210818311171562001a435762001a43620012a9565b81604052829350843591508082111562001a5c57600080fd5b5062001a6b858286016200138d565b8252505092915050565b60006020828403121562001a8857600080fd5b81356001600160401b038082111562001aa057600080fd5b908301906080828603121562001ab557600080fd5b62001abf620012bf565b82358281111562001acf57600080fd5b62001add878286016200138d565b82525060208301358281111562001af357600080fd5b62001b01878286016200138d565b60208301525060408301358281111562001b1a57600080fd5b62001b2887828601620018b2565b60408301525060608301358281111562001b4157600080fd5b62001b4f8782860162001a0a565b60608301525095945050505050565b60008060006060848603121562001b7457600080fd5b833562001b81816200141b565b9250602084013562001b93816200141b565b9150604084013562001ba5816200141b565b809150509250925092565b60006020828403121562001bc357600080fd5b813562001bd0816200141b565b9392505050565b60006020828403121562001bea57600080fd5b5051919050565b60006001820162001c1257634e487b7160e01b600052601160045260246000fd5b5060010190565b60005b8381101562001c3657818101518382015260200162001c1c565b50506000910152565b6000815180845262001c5981602086016020860162001c19565b601f01601f19169290920160200192915050565b60608152600062001c82606083018662001c3f565b828103602084015262001c96818662001c3f565b91505060018060a01b0383166040830152949350505050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b8181101562001d085783516001600160a01b03168352928401929184019160010162001ce1565b50909695505050505050565b6001600160a01b03831681526040602082018190526000906200096a9083018462001c3f565b6000835162001d4e81846020880162001c19565b83519083019062001d6481836020880162001c19565b01949350505050565b60018060a01b03815116825260006020820151604060208501526200096a604085018262001c3f565b60608152600062001dab606083018662001c3f565b6020838203818501528186518084528284019150828160051b85010183890160005b8381101562001dff57601f1987840301855262001dec83835162001c3f565b9486019492509085019060010162001dcd565b50508681036040880152875180825284820195509250600583901b81018401915083880160005b8481101562001e5857601f1983850301875262001e4584835162001d6d565b9686019693509085019060010162001e26565b50919a9950505050505050505050565b8281526040602082015260006200096a604083018462001d6d565b634e487b7160e01b600052602160045260246000fd5b6003811062001270576200127062001e83565b60008151808452602080850194506020840160005b8381101562001f1b57815180516006811062001ee15762001ee162001e83565b885280840151848901526040808201516001600160a01b031690890152606090810151908801526080909601959082019060010162001ec1565b509495945050505050565b60008151808452602080850194506020840160005b8381101562001f1b578151805162001f538162001e99565b88528084015160ff908116858a015260409182015116908801526060909601959082019060010162001f3b565b6020808252825160608383015280516080840181905260009291820190839060a08601905b8083101562001fe0578351805162001fbd8162001e99565b835285015160ff1685830152928401926001929092019160409091019062001fa5565b50838701519350601f1992508286820301604087015262002002818562001eac565b9350505060408501518185840301606086015262002021838262001f26565b9695505050505050565b805160208083015191908110156200204d576000198160200360031b1b821691505b50919050565b838152600060206060602084015262002070606084018662001c3f565b83810360408501528451808252602080870192019060005b81811015620020a65783518352928401929184019160010162002088565b509098975050505050505050565b600060018060a01b03808716835263ffffffff60e01b8651166020840152806020870151166040840152808551166060840152506020840151608083015260c060a083015282516101208060c0850152620021146101e085018362001c3f565b9150602085015160bf198584030160e086015262002133838262001c3f565b92505060408501516101008181870152606087015183870152608087015192506200216a6101408701846001600160401b03169052565b60a08701516001600160a01b0390811661016088015260c0880151811661018088015260e08801516101a0880152908701519081166101c0870152915062001541905056fe60806040526040516103d43803806103d483398101604081905261002291610268565b61002c8282610033565b5050610352565b61003c82610092565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561008657610081828261010e565b505050565b61008e610185565b5050565b806001600160a01b03163b6000036100cd57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161012b9190610336565b600060405180830381855af49150503d8060008114610166576040519150601f19603f3d011682016040523d82523d6000602084013e61016b565b606091505b50909250905061017c8583836101a6565b95945050505050565b34156101a45760405163b398979f60e01b815260040160405180910390fd5b565b6060826101bb576101b682610205565b6101fe565b81511580156101d257506001600160a01b0384163b155b156101fb57604051639996b31560e01b81526001600160a01b03851660048201526024016100c4565b50805b9392505050565b8051156102155780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b60005b8381101561025f578181015183820152602001610247565b50506000910152565b6000806040838503121561027b57600080fd5b82516001600160a01b038116811461029257600080fd5b60208401519092506001600160401b03808211156102af57600080fd5b818501915085601f8301126102c357600080fd5b8151818111156102d5576102d561022e565b604051601f8201601f19908116603f011681019083821181831017156102fd576102fd61022e565b8160405282815288602084870101111561031657600080fd5b610327836020830160208801610244565b80955050505050509250929050565b60008251610348818460208701610244565b9190910192915050565b6074806103606000396000f3fe6080604052600a600c565b005b60186014601a565b6051565b565b6000604c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015606f573d6000f35b3d6000fd60806040523480156200001157600080fd5b5060405162001d7738038062001d77833981016040819052620000349162000dfe565b6200003e6200016a565b620000a58380517f9c16cba5b9f2fcbd952b38bec34079e93cbe107475c15fc20705f4e704198a0080546020909301516001600160a01b03166001600160a01b031960e09390931c600160a01b02929092166001600160c01b031990931692909217179055565b81517fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60080546001600160a01b0319166001600160a01b0390921691909117905560208201517fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60155805160208201516200011f91906200017e565b62000135818460200151620001d560201b60201c565b6200013f6200038b565b6200014c8460016200039a565b62000156620003c0565b6200016062000495565b5050505062001107565b6200017c6301ffc9a760e01b620004ea565b565b60008051602062001cf78339815191527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df02620001bb848262000f64565b5060038101620001cc838262000f64565b50600090555050565b60008051602062001d1783398151915280546001600160a01b038381166001600160a01b0319928316179092556101008401517fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb608805491909316908216179091557fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb604805490911673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee17905560608201517fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6035560e08201517fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60781905560008051602062001d578339815191529015620002eb5760e0830151620002eb90620005ca565b610100830151620002fc9062000678565b6040830151156200038657604083015162000317906200074a565b600881015460408085015190516391b7f5ed60e01b81526001600160a01b03909216916391b7f5ed91620003519160040190815260200190565b600060405180830381600087803b1580156200036c57600080fd5b505af115801562000381573d6000803e3d6000fd5b505050505b505050565b6200017c607b6103e8620007f5565b620003bc828260405180602001604052806000815250620008ee60201b60201c565b5050565b60007f9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009050600060008051602062001d5783398151915260060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa15801562000450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000476919062001030565b82546001600160a01b0319166001600160a01b03919091161790915550565b620004a76380ac58cd60e01b620004ea565b620004b9635b5e139f60e01b620004ea565b620004cb638c65f84d60e01b620004ea565b620004dd6307f5828d60e41b620004ea565b6200017c63421fb7a760e01b5b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff16151560011462000579576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff1916600117905562000592565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60008051602062001d178339815191525460408051632cbb9d1360e01b8152905160008051602062001d57833981519152926001600160a01b031691632cbb9d139160048083019260209291908290030181865afa15801562000631573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000657919062001055565b821115620003bc5760405163c3983b9160e01b815260040160405180910390fd5b6001600160a01b038116620006a057604051630e88bf4b60e01b815260040160405180910390fd5b60008051602062001d17833981519152546001600160a01b03166040516346fc05eb60e11b81526001600160a01b0383811660048301529190911690638df80bd690602401602060405180830381865afa15801562000703573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200072991906200106f565b6200074757604051630e88bf4b60e01b815260040160405180910390fd5b50565b60006200076d60008051602062001d17833981519152546001600160a01b031690565b6001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620007ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007d1919062001055565b905080821015620003bc57604051631a23d64760e11b815260040160405180910390fd5b8160000362000817576040516306c1cb6d60e51b815260040160405180910390fd5b6127108161ffff1611156200083f57604051634e7ee09d60e11b815260040160405180910390fd5b60008281527f3c2290b88407133303e904ceb4ee7d0d14164eda8a629372d8406216ceb57e00602081905260409091205461ffff16801562000894576040516306c1cb6d60e51b815260040160405180910390fd5b60008481526020838152604091829020805461ffff191661ffff8716908117909155915191825285917f674ed3e313f9254fbafb8a51fa62be8b5f0a767d64c64cfe6f099c80c779a528910160405180910390a250505050565b620008fa838362000980565b6001600160a01b0383163b15620003865760008051602062001cf7833981519152548281035b6001810190620009369060009087908662000aba565b62000954576040516368d2bf6b60e11b815260040160405180910390fd5b81811062000920578160008051602062001cf783398151915254146200097957600080fd5b5050505050565b60008051602062001cf7833981519152546000829003620009b45760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df056020908152604080832080546801000000000000000188020190558483527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0490915281206001851460e11b4260a01b1783179055828401908390839060008051602062001d378339815191528180a4600183015b81811462000a81578083600060008051602062001d37833981519152600080a460010162000a58565b508160000362000aa357604051622e076360e81b815260040160405180910390fd5b60008051602062001cf78339815191525550505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029062000af190339089908890889060040162001093565b6020604051808303816000875af192505050801562000b2f575060408051601f3d908101601f1916820190925262000b2c91810190620010e9565b60015b62000b91573d80801562000b60576040519150601f19603f3d011682016040523d82523d6000602084013e62000b65565b606091505b50805160000362000b89576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b80516001600160a01b038116811462000bc657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b038111828210171562000c075762000c0762000bcb565b60405290565b604080519081016001600160401b038111828210171562000c075762000c0762000bcb565b80516001600160e01b03198116811462000bc657600080fd5b60005b8381101562000c6857818101518382015260200162000c4e565b50506000910152565b600082601f83011262000c8357600080fd5b81516001600160401b038082111562000ca05762000ca062000bcb565b604051601f8301601f19908116603f0116810190828211818310171562000ccb5762000ccb62000bcb565b8160405283815286602085880101111562000ce557600080fd5b62000cf884602083016020890162000c4b565b9695505050505050565b80516001600160401b038116811462000bc657600080fd5b6000610120828403121562000d2e57600080fd5b62000d3862000be1565b82519091506001600160401b038082111562000d5357600080fd5b62000d618583860162000c71565b8352602084015191508082111562000d7857600080fd5b5062000d878482850162000c71565b602083015250604082015160408201526060820151606082015262000daf6080830162000d02565b608082015262000dc260a0830162000bae565b60a082015262000dd560c0830162000bae565b60c082015260e082015160e082015261010062000df481840162000bae565b9082015292915050565b60008060008084860360c081121562000e1657600080fd5b62000e218662000bae565b94506040601f198201121562000e3657600080fd5b62000e4062000c0d565b62000e4e6020880162000c32565b815262000e5e6040880162000bae565b602082015293506040605f198201121562000e7857600080fd5b5062000e8362000c0d565b62000e916060870162000bae565b81526080860151602082015260a08601519092506001600160401b0381111562000eba57600080fd5b62000ec88782880162000d1a565b91505092959194509250565b600181811c9082168062000ee957607f821691505b60208210810362000f0a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000386576000816000526020600020601f850160051c8101602086101562000f3b5750805b601f850160051c820191505b8181101562000f5c5782815560010162000f47565b505050505050565b81516001600160401b0381111562000f805762000f8062000bcb565b62000f988162000f91845462000ed4565b8462000f10565b602080601f83116001811462000fd0576000841562000fb75750858301515b600019600386901b1c1916600185901b17855562000f5c565b600085815260208120601f198616915b82811015620010015788860151825594840194600190910190840162000fe0565b5085821015620010205787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200104357600080fd5b6200104e8262000bae565b9392505050565b6000602082840312156200106857600080fd5b5051919050565b6000602082840312156200108257600080fd5b815180151581146200104e57600080fd5b600060018060a01b038087168352808616602084015250836040830152608060608301528251806080840152620010d28160a085016020870162000c4b565b601f01601f19169190910160a00195945050505050565b600060208284031215620010fc57600080fd5b6200104e8262000c32565b610be080620011176000396000f3fe6080604052600436106100a05760003560e01c80638934207f116100645780638934207f1461020d578063ac7ee62614610241578063ac9650d81461027e578063b3a5be6d146102ab578063d33d9345146102c0578063f9d5d22c146102e2576100a7565b80633ded10de146100b157806369d9346b146100e4578063702515631461014057806373fc5a051461019157806377460cd3146101d0576100a7565b366100a757005b6100af610302565b005b3480156100bd57600080fd5b506100d16100cc366004610918565b61035d565b6040519081526020015b60405180910390f35b3480156100f057600080fd5b506100af6100ff366004610949565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60880546001600160a01b0319166001600160a01b0392909216919091179055565b34801561014c57600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb604546001600160a01b03165b6040516001600160a01b0390911681526020016100db565b34801561019d57600080fd5b506100af6101ac366004610918565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60355565b3480156101dc57600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb606546001600160a01b0316610179565b34801561021957600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb603546100d1565b34801561024d57600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb608546001600160a01b0316610179565b34801561028a57600080fd5b5061029e61029936600461096d565b6104ef565b6040516100db9190610a32565b3480156102b757600080fd5b506100d161060c565b3480156102cc57600080fd5b506102d56106cd565b6040516100db9190610a96565b3480156102ee57600080fd5b506100af6102fd366004610918565b61076f565b600061030c6107d2565b9050806001600160a01b03163b600003610339576040516321f27f0d60e21b815260040160405180910390fd5b3660008037600080366000845af43d6000803e808015610358573d6000f35b3d6000fd5b6000600080516020610bc08339815191528161037761060c565b90508381111561038b575060009392505050565b6006820154604051639262b1b360e01b815230600482015285916001600160a01b031690639262b1b390602401602060405180830381865afa1580156103d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f99190610aa9565b1115610409575060009392505050565b60088201546001600160a01b03161561049a576008820154604051635cf4ee9160e01b815260048101839052602481018690526001600160a01b0390911690635cf4ee9190604401602060405180830381865afa15801561046e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104929190610aa9565b949350505050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046e573d6000803e3d6000fd5b6060818067ffffffffffffffff81111561050b5761050b610ac2565b60405190808252806020026020018201604052801561053e57816020015b60608152602001906001900390816105295790505b50915060005b81811015610604576000803087878581811061056257610562610ad8565b90506020028101906105749190610aee565b604051610582929190610b3c565b600060405180830381855af49150503d80600081146105bd576040519150601f19603f3d011682016040523d82523d6000602084013e6105c2565b606091505b509150915081156105f057808584815181106105e0576105e0610ad8565b60200260200101819052506105fa565b3d6000803e3d6000fd5b5050600101610544565b505092915050565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60754600090600080516020610bc083398151915290801561064d5792915050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c69190610aa9565b9250505090565b6060600080516020610bc0833981519152600c0180546106ec90610b4c565b80601f016020809104026020016040519081016040528092919081815260200182805461071890610b4c565b80156107655780601f1061073a57610100808354040283529160200191610765565b820191906000526020600020905b81548152906001019060200180831161074857829003601f168201915b5050505050905090565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb607819055604051600080516020610bc08339815191529082907fab14a23e88fb272313490d4f20d63098e64fd38304c0e07a377db98c2b39b92f90600090a25050565b7f9c16cba5b9f2fcbd952b38bec34079e93cbe107475c15fc20705f4e704198a0054600090600160a01b900460e01b81806108347f9c16cba5b9f2fcbd952b38bec34079e93cbe107475c15fc20705f4e704198a00546001600160a01b031690565b6040516001600160e01b03196000351660248201526001600160a01b039190911690849060440160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516108999190610b86565b600060405180830381855afa9150503d80600081146108d4576040519150601f19603f3d011682016040523d82523d6000602084013e6108d9565b606091505b5091509150816108fc5760405163391aa44560e01b815260040160405180910390fd5b808060200190518101906109109190610ba2565b935050505090565b60006020828403121561092a57600080fd5b5035919050565b6001600160a01b038116811461094657600080fd5b50565b60006020828403121561095b57600080fd5b813561096681610931565b9392505050565b6000806020838503121561098057600080fd5b823567ffffffffffffffff8082111561099857600080fd5b818501915085601f8301126109ac57600080fd5b8135818111156109bb57600080fd5b8660208260051b85010111156109d057600080fd5b60209290920196919550909350505050565b60005b838110156109fd5781810151838201526020016109e5565b50506000910152565b60008151808452610a1e8160208601602086016109e2565b601f01601f19169290920160200192915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015610a8957603f19888603018452610a77858351610a06565b94509285019290850190600101610a5b565b5092979650505050505050565b6020815260006109666020830184610a06565b600060208284031215610abb57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610b0557600080fd5b83018035915067ffffffffffffffff821115610b2057600080fd5b602001915036819003821315610b3557600080fd5b9250929050565b8183823760009101908152919050565b600181811c90821680610b6057607f821691505b602082108103610b8057634e487b7160e01b600052602260045260246000fd5b50919050565b60008251610b988184602087016109e2565b9190910192915050565b600060208284031215610bb457600080fd5b81516109668161093156fec21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df00c21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb606ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6009e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d00 \ No newline at end of file diff --git a/packages/generated/dev/abis/Architect.json b/packages/generated/dev/abis/Architect.json new file mode 100644 index 000000000..61e4f48cf --- /dev/null +++ b/packages/generated/dev/abis/Architect.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__Architect_init","inputs":[{"name":"ownerImplementation","type":"address","internalType":"contract ISpaceOwner"},{"name":"userEntitlementImplementation","type":"address","internalType":"contract IUserEntitlement"},{"name":"ruleEntitlementImplementation","type":"address","internalType":"contract IRuleEntitlement"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"createSpace","inputs":[{"name":"spaceInfo","type":"tuple","internalType":"struct IArchitectBase.SpaceInfo","components":[{"name":"name","type":"string","internalType":"string"},{"name":"uri","type":"string","internalType":"string"},{"name":"membership","type":"tuple","internalType":"struct IArchitectBase.Membership","components":[{"name":"settings","type":"tuple","internalType":"struct IMembershipBase.Membership","components":[{"name":"name","type":"string","internalType":"string"},{"name":"symbol","type":"string","internalType":"string"},{"name":"price","type":"uint256","internalType":"uint256"},{"name":"maxSupply","type":"uint256","internalType":"uint256"},{"name":"duration","type":"uint64","internalType":"uint64"},{"name":"currency","type":"address","internalType":"address"},{"name":"feeRecipient","type":"address","internalType":"address"},{"name":"freeAllocation","type":"uint256","internalType":"uint256"},{"name":"pricingModule","type":"address","internalType":"address"}]},{"name":"requirements","type":"tuple","internalType":"struct IArchitectBase.MembershipRequirements","components":[{"name":"everyone","type":"bool","internalType":"bool"},{"name":"users","type":"address[]","internalType":"address[]"},{"name":"ruleData","type":"tuple","internalType":"struct IRuleEntitlement.RuleData","components":[{"name":"operations","type":"tuple[]","internalType":"struct IRuleEntitlement.Operation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CombinedOperationType"},{"name":"index","type":"uint8","internalType":"uint8"}]},{"name":"checkOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.CheckOperation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CheckOperationType"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"contractAddress","type":"address","internalType":"address"},{"name":"threshold","type":"uint256","internalType":"uint256"}]},{"name":"logicalOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.LogicalOperation[]","components":[{"name":"logOpType","type":"uint8","internalType":"enum IRuleEntitlement.LogicalOperationType"},{"name":"leftOperationIndex","type":"uint8","internalType":"uint8"},{"name":"rightOperationIndex","type":"uint8","internalType":"uint8"}]}]}]},{"name":"permissions","type":"string[]","internalType":"string[]"}]},{"name":"channel","type":"tuple","internalType":"struct IArchitectBase.ChannelInfo","components":[{"name":"metadata","type":"string","internalType":"string"}]}]}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"getSpaceArchitectImplementations","inputs":[],"outputs":[{"name":"spaceToken","type":"address","internalType":"contract ISpaceOwner"},{"name":"userEntitlementImplementation","type":"address","internalType":"contract IUserEntitlement"},{"name":"ruleEntitlementImplementation","type":"address","internalType":"contract IRuleEntitlement"}],"stateMutability":"view"},{"type":"function","name":"getSpaceByTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getTokenIdBySpace","inputs":[{"name":"space","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"setSpaceArchitectImplementations","inputs":[{"name":"spaceToken","type":"address","internalType":"contract ISpaceOwner"},{"name":"userEntitlementImplementation","type":"address","internalType":"contract IUserEntitlement"},{"name":"ruleEntitlementImplementation","type":"address","internalType":"contract IRuleEntitlement"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"SpaceCreated","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"space","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"Architect__InvalidAddress","inputs":[]},{"type":"error","name":"Architect__InvalidNetworkId","inputs":[]},{"type":"error","name":"Architect__InvalidStringLength","inputs":[]},{"type":"error","name":"Architect__NotContract","inputs":[]},{"type":"error","name":"Factory__FailedDeployment","inputs":[]},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]},{"type":"error","name":"Pausable__NotPaused","inputs":[]},{"type":"error","name":"Pausable__Paused","inputs":[]},{"type":"error","name":"ReentrancyGuard__ReentrantCall","inputs":[]},{"type":"error","name":"Validator__InvalidAddress","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b61431b80620000d46000396000f3fe60806040523480156200001157600080fd5b50600436106200006a5760003560e01c8063545efb2d146200006f578063673f0dd514620000a85780637d8c452214620000d85780638bfc94b914620000ef578063c0bc67961462000108578063dc1b9f23146200012e575b600080fd5b6200007962000145565b604080516001600160a01b03948516815292841660208401529216918101919091526060015b60405180910390f35b620000bf620000b93660046200128f565b620001c2565b6040516001600160a01b0390911681526020016200009f565b620000bf620000e936600462001a75565b62000200565b620001066200010036600462001b5e565b620002ef565b005b6200011f6200011936600462001bb0565b62000352565b6040519081526020016200009f565b620001066200013f36600462001b5e565b62000390565b6000806000620001b7600080516020620042fb833981519152547f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d01547f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d02546001600160a01b0392831693918316921690565b925092509250909192565b60008181527f06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f000260205260408120546001600160a01b03165b92915050565b600060027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0054036200024557604051635db5c7cd60e11b815260040160405180910390fd5b6200026f60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b7fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff1615620002b3576040516302ca8ced60e11b815260040160405180910390fd5b620002be82620003db565b9050620002ea60017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b919050565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b0316331462000340576040516365f4906560e01b815233600482015260240160405180910390fd5b6200034d8383836200077c565b505050565b6001600160a01b03811660009081527f06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f00016020526040812054620001fa565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166200034057604051630ef4733760e31b815260040160405180910390fd5b600080516020620042fb833981519152805460408051631d5e528f60e21b815290516000937f06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f000093909285926001600160a01b03909216916375794a3c916004808201926020929091908290030181865afa1580156200045e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000484919062001bd7565b9050620004968186604001516200088b565b8354909450836000620004a98362001bf1565b90915550506000818152600284016020908152604080832080546001600160a01b0319166001600160a01b03898116918217909255845260018701835292819020849055845488519289015191516391de4a8360e01b81529316926391de4a83926200051c929091899060040162001c6d565b6020604051808303816000875af11580156200053c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000562919062001bd7565b50600182015460009062000580906001600160a01b031686620008b5565b6002840154909150600090620005a0906001600160a01b031687620008b5565b60408051600280825260608201835292935060009290916020830190803683370190505090508281600081518110620005dd57620005dd62001caf565b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811062000614576200061462001caf565b6001600160a01b039283166020918202929092010152604051638bfc820f60e01b815290881690638bfc820f906200065190849060040162001cc5565b600060405180830381600087803b1580156200066c57600080fd5b505af115801562000681573d6000803e3d6000fd5b505050506200069b8784848b604001516020015162000972565b50604080890151805151910151600091620006ba918a91908762000da5565b9050620006cd88828b6060015162000f35565b8554604051632142170760e11b8152306004820152336024820152604481018790526001600160a01b03909116906342842e0e90606401600060405180830381600087803b1580156200071f57600080fd5b505af115801562000734573d6000803e3d6000fd5b50506040516001600160a01b038b16925087915033907fe50fc3942f8a2d7e5a7c8fb9488499eba5255b41e18bc3f1b4791402976d1d0b90600090a450505050505050919050565b826001600160a01b03163b600003620007a8576040516302f3d00b60e01b815260040160405180910390fd5b816001600160a01b03163b600003620007d4576040516302f3d00b60e01b815260040160405180910390fd5b806001600160a01b03163b60000362000800576040516302f3d00b60e01b815260040160405180910390fd5b600080516020620042fb83398151915280546001600160a01b039485166001600160a01b0319918216179091557f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d018054938516938216939093179092557f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d028054919093169116179055565b60008060006200089c858562001036565b91509150620008ac8282620011d3565b95945050505050565b60008060405180602001620008ca9062001273565b601f1982820381018352601f9091011660408190526001600160a01b0385166024820152859060440160408051601f19818403018152918152602080830180516001600160e01b031663189acdbd60e31b17905290516200092e9392910162001d14565b60408051601f19818403018152908290526200094e929160200162001d3a565b60405160208183030381529060405290506200096a816200120e565b949350505050565b604080516001808252818301909252600091829190816020015b60608152602001906001900390816200098c579050509050604051806040016040528060098152602001684a6f696e537061636560b81b81525081600081518110620009dc57620009dc62001caf565b6020026020010181905250856001600160a01b0316638fcd793d6040518060400160405280600681526020016526b4b73a32b960d11b8152508360006001600160401b0381111562000a325762000a32620012a9565b60405190808252806020026020018201604052801562000a7a57816020015b60408051808201909152600081526060602082015281526020019060019003908162000a515790505b506040518463ffffffff1660e01b815260040162000a9b9392919062001d96565b6020604051808303816000875af115801562000abb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ae1919062001bd7565b83519092501562000bef576040805160018082528183019092526000916020808301908036833701905050905060018160008151811062000b265762000b2662001caf565b60200260200101906001600160a01b031690816001600160a01b031681525050866001600160a01b031663ba201ba88460405180604001604052808a6001600160a01b031681526020018560405160200162000b83919062001cc5565b6040516020818303038152906040528152506040518363ffffffff1660e01b815260040162000bb492919062001e68565b600060405180830381600087803b15801562000bcf57600080fd5b505af115801562000be4573d6000803e3d6000fd5b505050505062000d9c565b6020830151511562000ce85760005b83602001515181101562000c405762000c378460200151828151811062000c295762000c2962001caf565b602002602001015162001248565b60010162000bfe565b50856001600160a01b031663ba201ba8836040518060400160405280896001600160a01b03168152602001876020015160405160200162000c82919062001cc5565b6040516020818303038152906040528152506040518363ffffffff1660e01b815260040162000cb392919062001e68565b600060405180830381600087803b15801562000cce57600080fd5b505af115801562000ce3573d6000803e3d6000fd5b505050505b604083015151511562000d9c57856001600160a01b031663ba201ba8836040518060400160405280886001600160a01b03168152602001876040015160405160200162000d36919062001f80565b6040516020818303038152906040528152506040518363ffffffff1660e01b815260040162000d6792919062001e68565b600060405180830381600087803b15801562000d8257600080fd5b505af115801562000d97573d6000803e3d6000fd5b505050505b50949350505050565b6040805160018082528183019092526000918291906020808301908036833701905050905060018160008151811062000de25762000de262001caf565b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252600091816020015b60408051808201909152600081526060602082015281526020019060019003908162000e12579050509050838160008151811062000e545762000e5462001caf565b6020908102919091018101516001600160a01b0390921690915260405162000e7f9184910162001cc5565b6040516020818303038152906040528160008151811062000ea45762000ea462001caf565b6020908102919091018101510152604051638fcd793d60e01b81526001600160a01b03881690638fcd793d9062000ee49089908990869060040162001d96565b6020604051808303816000875af115801562000f04573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f2a919062001bd7565b979650505050505050565b60408051600180825281830190925260009160208083019080368337019050509050828160008151811062000f6e5762000f6e62001caf565b602090810291909101810191909152604051600160fd1b918101919091526bffffffffffffffffffffffff19606086901b16602182015260009060350160405160208183030381529060405262000fc5906200202b565b835160405163921f717560e01b81529192506001600160a01b0387169163921f71759162000ffb91859190879060040162002053565b600060405180830381600087803b1580156200101657600080fd5b505af11580156200102b573d6000803e3d6000fd5b505050505050505050565b6060600080600080516020620042fb8339815191526040805133602082015290810187905242606082015290915060800160405160208183030381529060405280519060200120915060405180602001620010919062001281565b601f19828203810183526040601f90920116818101825263dc9cc64560e01b8152306020828101919091528251808401845285546001600160a01b0390811682528183018b90528451610120810186528a515181528a518401519381019390935289518501519483019490945288516060908101519083015288516080908101516001600160401b031690830152885160a090810151851690830152885160c09081015133959293929183019116156200115157895160c0015162001153565b335b6001600160a01b03168152602001896000015160e001518152602001896000015161010001516001600160a01b03168152506040516020016200119a9493929190620020b4565b60408051601f1981840301815290829052620011ba929160200162001d3a565b6040516020818303038152906040529250509250929050565b60008260200183518381836000f59250506001600160a01b0382169050620001fa5760405163ef35ca1960e01b815260040160405180910390fd5b600081602001825180826000f09250506001600160a01b0382169050620002ea5760405163ef35ca1960e01b815260040160405180910390fd5b6001600160a01b03811662001270576040516302e47d1560e41b815260040160405180910390fd5b50565b6103d480620021b083390190565b611d77806200258483390190565b600060208284031215620012a257600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620012e457620012e4620012a9565b60405290565b604051606081016001600160401b0381118282101715620012e457620012e4620012a9565b604080519081016001600160401b0381118282101715620012e457620012e4620012a9565b60405161012081016001600160401b0381118282101715620012e457620012e4620012a9565b604051601f8201601f191681016001600160401b0381118282101715620013855762001385620012a9565b604052919050565b600082601f8301126200139f57600080fd5b81356001600160401b03811115620013bb57620013bb620012a9565b620013d0601f8201601f19166020016200135a565b818152846020838601011115620013e657600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160401b0381168114620002ea57600080fd5b6001600160a01b03811681146200127057600080fd5b8035620002ea816200141b565b60006001600160401b038211156200145a576200145a620012a9565b5060051b60200190565b600381106200127057600080fd5b803560ff81168114620002ea57600080fd5b600082601f8301126200149657600080fd5b81356020620014af620014a9836200143e565b6200135a565b82815260079290921b84018101918181019086841115620014cf57600080fd5b8286015b84811015620015415760808189031215620014ee5760008081fd5b620014f8620012bf565b813560068110620015095760008081fd5b8152818501358582015260408083013562001524816200141b565b9082015260608281013590820152835291830191608001620014d3565b509695505050505050565b600082601f8301126200155e57600080fd5b8135602062001571620014a9836200143e565b828152606092830285018201928282019190878511156200159157600080fd5b8387015b85811015620015fa5781818a031215620015af5760008081fd5b620015b9620012ea565b8135620015c68162001464565b8152620015d582870162001472565b868201526040620015e881840162001472565b90820152845292840192810162001595565b5090979650505050505050565b6000606082840312156200161a57600080fd5b62001624620012ea565b905081356001600160401b03808211156200163e57600080fd5b818401915084601f8301126200165357600080fd5b8135602062001666620014a9836200143e565b82815260069290921b840181019181810190888411156200168657600080fd5b948201945b83861015620016e3576040868a031215620016a65760008081fd5b620016b06200130f565b8635620016bd8162001464565b8152620016cc87850162001472565b81850152825260409590950194908201906200168b565b86525085810135935082841115620016fa57600080fd5b620017088785880162001484565b908501525060408401359150808211156200172257600080fd5b5062001731848285016200154c565b60408301525092915050565b6000606082840312156200175057600080fd5b6200175a620012ea565b9050813580151581146200176d57600080fd5b81526020828101356001600160401b03808211156200178b57600080fd5b818501915085601f830112620017a057600080fd5b8135620017b1620014a9826200143e565b81815260059190911b83018401908481019088831115620017d157600080fd5b938501935b82851015620017fc578435620017ec816200141b565b82529385019390850190620017d6565b808688015250505060408501359250808311156200181957600080fd5b5050620017318482850162001607565b600082601f8301126200183b57600080fd5b813560206200184e620014a9836200143e565b82815260059290921b840181019181810190868411156200186e57600080fd5b8286015b84811015620015415780356001600160401b03811115620018935760008081fd5b620018a38986838b01016200138d565b84525091830191830162001872565b600060608284031215620018c557600080fd5b620018cf620012ea565b905081356001600160401b0380821115620018e957600080fd5b908301906101208286031215620018ff57600080fd5b6200190962001334565b8235828111156200191957600080fd5b62001927878286016200138d565b8252506020830135828111156200193d57600080fd5b6200194b878286016200138d565b6020830152506040830135604082015260608301356060820152620019736080840162001403565b60808201526200198660a0840162001431565b60a08201526200199960c0840162001431565b60c082015260e083013560e0820152610100620019b881850162001431565b9082015283526020840135915080821115620019d357600080fd5b620019e1858386016200173d565b60208401526040840135915080821115620019fb57600080fd5b50620017318482850162001829565b60006020828403121562001a1d57600080fd5b604051602081016001600160401b03828210818311171562001a435762001a43620012a9565b81604052829350843591508082111562001a5c57600080fd5b5062001a6b858286016200138d565b8252505092915050565b60006020828403121562001a8857600080fd5b81356001600160401b038082111562001aa057600080fd5b908301906080828603121562001ab557600080fd5b62001abf620012bf565b82358281111562001acf57600080fd5b62001add878286016200138d565b82525060208301358281111562001af357600080fd5b62001b01878286016200138d565b60208301525060408301358281111562001b1a57600080fd5b62001b2887828601620018b2565b60408301525060608301358281111562001b4157600080fd5b62001b4f8782860162001a0a565b60608301525095945050505050565b60008060006060848603121562001b7457600080fd5b833562001b81816200141b565b9250602084013562001b93816200141b565b9150604084013562001ba5816200141b565b809150509250925092565b60006020828403121562001bc357600080fd5b813562001bd0816200141b565b9392505050565b60006020828403121562001bea57600080fd5b5051919050565b60006001820162001c1257634e487b7160e01b600052601160045260246000fd5b5060010190565b60005b8381101562001c3657818101518382015260200162001c1c565b50506000910152565b6000815180845262001c5981602086016020860162001c19565b601f01601f19169290920160200192915050565b60608152600062001c82606083018662001c3f565b828103602084015262001c96818662001c3f565b91505060018060a01b0383166040830152949350505050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b8181101562001d085783516001600160a01b03168352928401929184019160010162001ce1565b50909695505050505050565b6001600160a01b03831681526040602082018190526000906200096a9083018462001c3f565b6000835162001d4e81846020880162001c19565b83519083019062001d6481836020880162001c19565b01949350505050565b60018060a01b03815116825260006020820151604060208501526200096a604085018262001c3f565b60608152600062001dab606083018662001c3f565b6020838203818501528186518084528284019150828160051b85010183890160005b8381101562001dff57601f1987840301855262001dec83835162001c3f565b9486019492509085019060010162001dcd565b50508681036040880152875180825284820195509250600583901b81018401915083880160005b8481101562001e5857601f1983850301875262001e4584835162001d6d565b9686019693509085019060010162001e26565b50919a9950505050505050505050565b8281526040602082015260006200096a604083018462001d6d565b634e487b7160e01b600052602160045260246000fd5b6003811062001270576200127062001e83565b60008151808452602080850194506020840160005b8381101562001f1b57815180516006811062001ee15762001ee162001e83565b885280840151848901526040808201516001600160a01b031690890152606090810151908801526080909601959082019060010162001ec1565b509495945050505050565b60008151808452602080850194506020840160005b8381101562001f1b578151805162001f538162001e99565b88528084015160ff908116858a015260409182015116908801526060909601959082019060010162001f3b565b6020808252825160608383015280516080840181905260009291820190839060a08601905b8083101562001fe0578351805162001fbd8162001e99565b835285015160ff1685830152928401926001929092019160409091019062001fa5565b50838701519350601f1992508286820301604087015262002002818562001eac565b9350505060408501518185840301606086015262002021838262001f26565b9695505050505050565b805160208083015191908110156200204d576000198160200360031b1b821691505b50919050565b838152600060206060602084015262002070606084018662001c3f565b83810360408501528451808252602080870192019060005b81811015620020a65783518352928401929184019160010162002088565b509098975050505050505050565b600060018060a01b03808716835263ffffffff60e01b8651166020840152806020870151166040840152808551166060840152506020840151608083015260c060a083015282516101208060c0850152620021146101e085018362001c3f565b9150602085015160bf198584030160e086015262002133838262001c3f565b92505060408501516101008181870152606087015183870152608087015192506200216a6101408701846001600160401b03169052565b60a08701516001600160a01b0390811661016088015260c0880151811661018088015260e08801516101a0880152908701519081166101c0870152915062001541905056fe60806040526040516103d43803806103d483398101604081905261002291610268565b61002c8282610033565b5050610352565b61003c82610092565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561008657610081828261010e565b505050565b61008e610185565b5050565b806001600160a01b03163b6000036100cd57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161012b9190610336565b600060405180830381855af49150503d8060008114610166576040519150601f19603f3d011682016040523d82523d6000602084013e61016b565b606091505b50909250905061017c8583836101a6565b95945050505050565b34156101a45760405163b398979f60e01b815260040160405180910390fd5b565b6060826101bb576101b682610205565b6101fe565b81511580156101d257506001600160a01b0384163b155b156101fb57604051639996b31560e01b81526001600160a01b03851660048201526024016100c4565b50805b9392505050565b8051156102155780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b60005b8381101561025f578181015183820152602001610247565b50506000910152565b6000806040838503121561027b57600080fd5b82516001600160a01b038116811461029257600080fd5b60208401519092506001600160401b03808211156102af57600080fd5b818501915085601f8301126102c357600080fd5b8151818111156102d5576102d561022e565b604051601f8201601f19908116603f011681019083821181831017156102fd576102fd61022e565b8160405282815288602084870101111561031657600080fd5b610327836020830160208801610244565b80955050505050509250929050565b60008251610348818460208701610244565b9190910192915050565b6074806103606000396000f3fe6080604052600a600c565b005b60186014601a565b6051565b565b6000604c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015606f573d6000f35b3d6000fd60806040523480156200001157600080fd5b5060405162001d7738038062001d77833981016040819052620000349162000dfe565b6200003e6200016a565b620000a58380517f9c16cba5b9f2fcbd952b38bec34079e93cbe107475c15fc20705f4e704198a0080546020909301516001600160a01b03166001600160a01b031960e09390931c600160a01b02929092166001600160c01b031990931692909217179055565b81517fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60080546001600160a01b0319166001600160a01b0390921691909117905560208201517fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60155805160208201516200011f91906200017e565b62000135818460200151620001d560201b60201c565b6200013f6200038b565b6200014c8460016200039a565b62000156620003c0565b6200016062000495565b5050505062001107565b6200017c6301ffc9a760e01b620004ea565b565b60008051602062001cf78339815191527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df02620001bb848262000f64565b5060038101620001cc838262000f64565b50600090555050565b60008051602062001d1783398151915280546001600160a01b038381166001600160a01b0319928316179092556101008401517fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb608805491909316908216179091557fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb604805490911673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee17905560608201517fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6035560e08201517fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60781905560008051602062001d578339815191529015620002eb5760e0830151620002eb90620005ca565b610100830151620002fc9062000678565b6040830151156200038657604083015162000317906200074a565b600881015460408085015190516391b7f5ed60e01b81526001600160a01b03909216916391b7f5ed91620003519160040190815260200190565b600060405180830381600087803b1580156200036c57600080fd5b505af115801562000381573d6000803e3d6000fd5b505050505b505050565b6200017c607b6103e8620007f5565b620003bc828260405180602001604052806000815250620008ee60201b60201c565b5050565b60007f9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009050600060008051602062001d5783398151915260060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa15801562000450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000476919062001030565b82546001600160a01b0319166001600160a01b03919091161790915550565b620004a76380ac58cd60e01b620004ea565b620004b9635b5e139f60e01b620004ea565b620004cb638c65f84d60e01b620004ea565b620004dd6307f5828d60e41b620004ea565b6200017c63421fb7a760e01b5b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff16151560011462000579576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff1916600117905562000592565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60008051602062001d178339815191525460408051632cbb9d1360e01b8152905160008051602062001d57833981519152926001600160a01b031691632cbb9d139160048083019260209291908290030181865afa15801562000631573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000657919062001055565b821115620003bc5760405163c3983b9160e01b815260040160405180910390fd5b6001600160a01b038116620006a057604051630e88bf4b60e01b815260040160405180910390fd5b60008051602062001d17833981519152546001600160a01b03166040516346fc05eb60e11b81526001600160a01b0383811660048301529190911690638df80bd690602401602060405180830381865afa15801562000703573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200072991906200106f565b6200074757604051630e88bf4b60e01b815260040160405180910390fd5b50565b60006200076d60008051602062001d17833981519152546001600160a01b031690565b6001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620007ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007d1919062001055565b905080821015620003bc57604051631a23d64760e11b815260040160405180910390fd5b8160000362000817576040516306c1cb6d60e51b815260040160405180910390fd5b6127108161ffff1611156200083f57604051634e7ee09d60e11b815260040160405180910390fd5b60008281527f3c2290b88407133303e904ceb4ee7d0d14164eda8a629372d8406216ceb57e00602081905260409091205461ffff16801562000894576040516306c1cb6d60e51b815260040160405180910390fd5b60008481526020838152604091829020805461ffff191661ffff8716908117909155915191825285917f674ed3e313f9254fbafb8a51fa62be8b5f0a767d64c64cfe6f099c80c779a528910160405180910390a250505050565b620008fa838362000980565b6001600160a01b0383163b15620003865760008051602062001cf7833981519152548281035b6001810190620009369060009087908662000aba565b62000954576040516368d2bf6b60e11b815260040160405180910390fd5b81811062000920578160008051602062001cf783398151915254146200097957600080fd5b5050505050565b60008051602062001cf7833981519152546000829003620009b45760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df056020908152604080832080546801000000000000000188020190558483527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0490915281206001851460e11b4260a01b1783179055828401908390839060008051602062001d378339815191528180a4600183015b81811462000a81578083600060008051602062001d37833981519152600080a460010162000a58565b508160000362000aa357604051622e076360e81b815260040160405180910390fd5b60008051602062001cf78339815191525550505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029062000af190339089908890889060040162001093565b6020604051808303816000875af192505050801562000b2f575060408051601f3d908101601f1916820190925262000b2c91810190620010e9565b60015b62000b91573d80801562000b60576040519150601f19603f3d011682016040523d82523d6000602084013e62000b65565b606091505b50805160000362000b89576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b80516001600160a01b038116811462000bc657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b038111828210171562000c075762000c0762000bcb565b60405290565b604080519081016001600160401b038111828210171562000c075762000c0762000bcb565b80516001600160e01b03198116811462000bc657600080fd5b60005b8381101562000c6857818101518382015260200162000c4e565b50506000910152565b600082601f83011262000c8357600080fd5b81516001600160401b038082111562000ca05762000ca062000bcb565b604051601f8301601f19908116603f0116810190828211818310171562000ccb5762000ccb62000bcb565b8160405283815286602085880101111562000ce557600080fd5b62000cf884602083016020890162000c4b565b9695505050505050565b80516001600160401b038116811462000bc657600080fd5b6000610120828403121562000d2e57600080fd5b62000d3862000be1565b82519091506001600160401b038082111562000d5357600080fd5b62000d618583860162000c71565b8352602084015191508082111562000d7857600080fd5b5062000d878482850162000c71565b602083015250604082015160408201526060820151606082015262000daf6080830162000d02565b608082015262000dc260a0830162000bae565b60a082015262000dd560c0830162000bae565b60c082015260e082015160e082015261010062000df481840162000bae565b9082015292915050565b60008060008084860360c081121562000e1657600080fd5b62000e218662000bae565b94506040601f198201121562000e3657600080fd5b62000e4062000c0d565b62000e4e6020880162000c32565b815262000e5e6040880162000bae565b602082015293506040605f198201121562000e7857600080fd5b5062000e8362000c0d565b62000e916060870162000bae565b81526080860151602082015260a08601519092506001600160401b0381111562000eba57600080fd5b62000ec88782880162000d1a565b91505092959194509250565b600181811c9082168062000ee957607f821691505b60208210810362000f0a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000386576000816000526020600020601f850160051c8101602086101562000f3b5750805b601f850160051c820191505b8181101562000f5c5782815560010162000f47565b505050505050565b81516001600160401b0381111562000f805762000f8062000bcb565b62000f988162000f91845462000ed4565b8462000f10565b602080601f83116001811462000fd0576000841562000fb75750858301515b600019600386901b1c1916600185901b17855562000f5c565b600085815260208120601f198616915b82811015620010015788860151825594840194600190910190840162000fe0565b5085821015620010205787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200104357600080fd5b6200104e8262000bae565b9392505050565b6000602082840312156200106857600080fd5b5051919050565b6000602082840312156200108257600080fd5b815180151581146200104e57600080fd5b600060018060a01b038087168352808616602084015250836040830152608060608301528251806080840152620010d28160a085016020870162000c4b565b601f01601f19169190910160a00195945050505050565b600060208284031215620010fc57600080fd5b6200104e8262000c32565b610be080620011176000396000f3fe6080604052600436106100a05760003560e01c80638934207f116100645780638934207f1461020d578063ac7ee62614610241578063ac9650d81461027e578063b3a5be6d146102ab578063d33d9345146102c0578063f9d5d22c146102e2576100a7565b80633ded10de146100b157806369d9346b146100e4578063702515631461014057806373fc5a051461019157806377460cd3146101d0576100a7565b366100a757005b6100af610302565b005b3480156100bd57600080fd5b506100d16100cc366004610918565b61035d565b6040519081526020015b60405180910390f35b3480156100f057600080fd5b506100af6100ff366004610949565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60880546001600160a01b0319166001600160a01b0392909216919091179055565b34801561014c57600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb604546001600160a01b03165b6040516001600160a01b0390911681526020016100db565b34801561019d57600080fd5b506100af6101ac366004610918565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60355565b3480156101dc57600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb606546001600160a01b0316610179565b34801561021957600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb603546100d1565b34801561024d57600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb608546001600160a01b0316610179565b34801561028a57600080fd5b5061029e61029936600461096d565b6104ef565b6040516100db9190610a32565b3480156102b757600080fd5b506100d161060c565b3480156102cc57600080fd5b506102d56106cd565b6040516100db9190610a96565b3480156102ee57600080fd5b506100af6102fd366004610918565b61076f565b600061030c6107d2565b9050806001600160a01b03163b600003610339576040516321f27f0d60e21b815260040160405180910390fd5b3660008037600080366000845af43d6000803e808015610358573d6000f35b3d6000fd5b6000600080516020610bc08339815191528161037761060c565b90508381111561038b575060009392505050565b6006820154604051639262b1b360e01b815230600482015285916001600160a01b031690639262b1b390602401602060405180830381865afa1580156103d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f99190610aa9565b1115610409575060009392505050565b60088201546001600160a01b03161561049a576008820154604051635cf4ee9160e01b815260048101839052602481018690526001600160a01b0390911690635cf4ee9190604401602060405180830381865afa15801561046e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104929190610aa9565b949350505050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046e573d6000803e3d6000fd5b6060818067ffffffffffffffff81111561050b5761050b610ac2565b60405190808252806020026020018201604052801561053e57816020015b60608152602001906001900390816105295790505b50915060005b81811015610604576000803087878581811061056257610562610ad8565b90506020028101906105749190610aee565b604051610582929190610b3c565b600060405180830381855af49150503d80600081146105bd576040519150601f19603f3d011682016040523d82523d6000602084013e6105c2565b606091505b509150915081156105f057808584815181106105e0576105e0610ad8565b60200260200101819052506105fa565b3d6000803e3d6000fd5b5050600101610544565b505092915050565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60754600090600080516020610bc083398151915290801561064d5792915050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c69190610aa9565b9250505090565b6060600080516020610bc0833981519152600c0180546106ec90610b4c565b80601f016020809104026020016040519081016040528092919081815260200182805461071890610b4c565b80156107655780601f1061073a57610100808354040283529160200191610765565b820191906000526020600020905b81548152906001019060200180831161074857829003601f168201915b5050505050905090565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb607819055604051600080516020610bc08339815191529082907fab14a23e88fb272313490d4f20d63098e64fd38304c0e07a377db98c2b39b92f90600090a25050565b7f9c16cba5b9f2fcbd952b38bec34079e93cbe107475c15fc20705f4e704198a0054600090600160a01b900460e01b81806108347f9c16cba5b9f2fcbd952b38bec34079e93cbe107475c15fc20705f4e704198a00546001600160a01b031690565b6040516001600160e01b03196000351660248201526001600160a01b039190911690849060440160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516108999190610b86565b600060405180830381855afa9150503d80600081146108d4576040519150601f19603f3d011682016040523d82523d6000602084013e6108d9565b606091505b5091509150816108fc5760405163391aa44560e01b815260040160405180910390fd5b808060200190518101906109109190610ba2565b935050505090565b60006020828403121561092a57600080fd5b5035919050565b6001600160a01b038116811461094657600080fd5b50565b60006020828403121561095b57600080fd5b813561096681610931565b9392505050565b6000806020838503121561098057600080fd5b823567ffffffffffffffff8082111561099857600080fd5b818501915085601f8301126109ac57600080fd5b8135818111156109bb57600080fd5b8660208260051b85010111156109d057600080fd5b60209290920196919550909350505050565b60005b838110156109fd5781810151838201526020016109e5565b50506000910152565b60008151808452610a1e8160208601602086016109e2565b601f01601f19169290920160200192915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015610a8957603f19888603018452610a77858351610a06565b94509285019290850190600101610a5b565b5092979650505050505050565b6020815260006109666020830184610a06565b600060208284031215610abb57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610b0557600080fd5b83018035915067ffffffffffffffff821115610b2057600080fd5b602001915036819003821315610b3557600080fd5b9250929050565b8183823760009101908152919050565b600181811c90821680610b6057607f821691505b602082108103610b8057634e487b7160e01b600052602260045260246000fd5b50919050565b60008251610b988184602087016109e2565b9190910192915050565b600060208284031215610bb457600080fd5b81516109668161093156fec21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df00c21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb606ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6009e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d00","sourceMap":"830:1802:127:-:0;;;;;;;;;;;;-1:-1:-1;385:22:49;:20;:22::i;:::-;830:1802:127;;1653:314:63;303:66:64;1779:14:63;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:63;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:63;1898:16;1886:28;;;;;1927:29;;158:42:376;;;1927:29:63;;146:2:376;131:18;1927:29:63;;;;;;;1844:119;1694:273;1653:314::o;14:192:376:-;830:1802:127;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040523480156200001157600080fd5b50600436106200006a5760003560e01c8063545efb2d146200006f578063673f0dd514620000a85780637d8c452214620000d85780638bfc94b914620000ef578063c0bc67961462000108578063dc1b9f23146200012e575b600080fd5b6200007962000145565b604080516001600160a01b03948516815292841660208401529216918101919091526060015b60405180910390f35b620000bf620000b93660046200128f565b620001c2565b6040516001600160a01b0390911681526020016200009f565b620000bf620000e936600462001a75565b62000200565b620001066200010036600462001b5e565b620002ef565b005b6200011f6200011936600462001bb0565b62000352565b6040519081526020016200009f565b620001066200013f36600462001b5e565b62000390565b6000806000620001b7600080516020620042fb833981519152547f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d01547f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d02546001600160a01b0392831693918316921690565b925092509250909192565b60008181527f06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f000260205260408120546001600160a01b03165b92915050565b600060027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0054036200024557604051635db5c7cd60e11b815260040160405180910390fd5b6200026f60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b7fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff1615620002b3576040516302ca8ced60e11b815260040160405180910390fd5b620002be82620003db565b9050620002ea60017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b919050565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b0316331462000340576040516365f4906560e01b815233600482015260240160405180910390fd5b6200034d8383836200077c565b505050565b6001600160a01b03811660009081527f06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f00016020526040812054620001fa565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166200034057604051630ef4733760e31b815260040160405180910390fd5b600080516020620042fb833981519152805460408051631d5e528f60e21b815290516000937f06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f000093909285926001600160a01b03909216916375794a3c916004808201926020929091908290030181865afa1580156200045e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000484919062001bd7565b9050620004968186604001516200088b565b8354909450836000620004a98362001bf1565b90915550506000818152600284016020908152604080832080546001600160a01b0319166001600160a01b03898116918217909255845260018701835292819020849055845488519289015191516391de4a8360e01b81529316926391de4a83926200051c929091899060040162001c6d565b6020604051808303816000875af11580156200053c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000562919062001bd7565b50600182015460009062000580906001600160a01b031686620008b5565b6002840154909150600090620005a0906001600160a01b031687620008b5565b60408051600280825260608201835292935060009290916020830190803683370190505090508281600081518110620005dd57620005dd62001caf565b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811062000614576200061462001caf565b6001600160a01b039283166020918202929092010152604051638bfc820f60e01b815290881690638bfc820f906200065190849060040162001cc5565b600060405180830381600087803b1580156200066c57600080fd5b505af115801562000681573d6000803e3d6000fd5b505050506200069b8784848b604001516020015162000972565b50604080890151805151910151600091620006ba918a91908762000da5565b9050620006cd88828b6060015162000f35565b8554604051632142170760e11b8152306004820152336024820152604481018790526001600160a01b03909116906342842e0e90606401600060405180830381600087803b1580156200071f57600080fd5b505af115801562000734573d6000803e3d6000fd5b50506040516001600160a01b038b16925087915033907fe50fc3942f8a2d7e5a7c8fb9488499eba5255b41e18bc3f1b4791402976d1d0b90600090a450505050505050919050565b826001600160a01b03163b600003620007a8576040516302f3d00b60e01b815260040160405180910390fd5b816001600160a01b03163b600003620007d4576040516302f3d00b60e01b815260040160405180910390fd5b806001600160a01b03163b60000362000800576040516302f3d00b60e01b815260040160405180910390fd5b600080516020620042fb83398151915280546001600160a01b039485166001600160a01b0319918216179091557f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d018054938516938216939093179092557f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d028054919093169116179055565b60008060006200089c858562001036565b91509150620008ac8282620011d3565b95945050505050565b60008060405180602001620008ca9062001273565b601f1982820381018352601f9091011660408190526001600160a01b0385166024820152859060440160408051601f19818403018152918152602080830180516001600160e01b031663189acdbd60e31b17905290516200092e9392910162001d14565b60408051601f19818403018152908290526200094e929160200162001d3a565b60405160208183030381529060405290506200096a816200120e565b949350505050565b604080516001808252818301909252600091829190816020015b60608152602001906001900390816200098c579050509050604051806040016040528060098152602001684a6f696e537061636560b81b81525081600081518110620009dc57620009dc62001caf565b6020026020010181905250856001600160a01b0316638fcd793d6040518060400160405280600681526020016526b4b73a32b960d11b8152508360006001600160401b0381111562000a325762000a32620012a9565b60405190808252806020026020018201604052801562000a7a57816020015b60408051808201909152600081526060602082015281526020019060019003908162000a515790505b506040518463ffffffff1660e01b815260040162000a9b9392919062001d96565b6020604051808303816000875af115801562000abb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ae1919062001bd7565b83519092501562000bef576040805160018082528183019092526000916020808301908036833701905050905060018160008151811062000b265762000b2662001caf565b60200260200101906001600160a01b031690816001600160a01b031681525050866001600160a01b031663ba201ba88460405180604001604052808a6001600160a01b031681526020018560405160200162000b83919062001cc5565b6040516020818303038152906040528152506040518363ffffffff1660e01b815260040162000bb492919062001e68565b600060405180830381600087803b15801562000bcf57600080fd5b505af115801562000be4573d6000803e3d6000fd5b505050505062000d9c565b6020830151511562000ce85760005b83602001515181101562000c405762000c378460200151828151811062000c295762000c2962001caf565b602002602001015162001248565b60010162000bfe565b50856001600160a01b031663ba201ba8836040518060400160405280896001600160a01b03168152602001876020015160405160200162000c82919062001cc5565b6040516020818303038152906040528152506040518363ffffffff1660e01b815260040162000cb392919062001e68565b600060405180830381600087803b15801562000cce57600080fd5b505af115801562000ce3573d6000803e3d6000fd5b505050505b604083015151511562000d9c57856001600160a01b031663ba201ba8836040518060400160405280886001600160a01b03168152602001876040015160405160200162000d36919062001f80565b6040516020818303038152906040528152506040518363ffffffff1660e01b815260040162000d6792919062001e68565b600060405180830381600087803b15801562000d8257600080fd5b505af115801562000d97573d6000803e3d6000fd5b505050505b50949350505050565b6040805160018082528183019092526000918291906020808301908036833701905050905060018160008151811062000de25762000de262001caf565b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252600091816020015b60408051808201909152600081526060602082015281526020019060019003908162000e12579050509050838160008151811062000e545762000e5462001caf565b6020908102919091018101516001600160a01b0390921690915260405162000e7f9184910162001cc5565b6040516020818303038152906040528160008151811062000ea45762000ea462001caf565b6020908102919091018101510152604051638fcd793d60e01b81526001600160a01b03881690638fcd793d9062000ee49089908990869060040162001d96565b6020604051808303816000875af115801562000f04573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f2a919062001bd7565b979650505050505050565b60408051600180825281830190925260009160208083019080368337019050509050828160008151811062000f6e5762000f6e62001caf565b602090810291909101810191909152604051600160fd1b918101919091526bffffffffffffffffffffffff19606086901b16602182015260009060350160405160208183030381529060405262000fc5906200202b565b835160405163921f717560e01b81529192506001600160a01b0387169163921f71759162000ffb91859190879060040162002053565b600060405180830381600087803b1580156200101657600080fd5b505af11580156200102b573d6000803e3d6000fd5b505050505050505050565b6060600080600080516020620042fb8339815191526040805133602082015290810187905242606082015290915060800160405160208183030381529060405280519060200120915060405180602001620010919062001281565b601f19828203810183526040601f90920116818101825263dc9cc64560e01b8152306020828101919091528251808401845285546001600160a01b0390811682528183018b90528451610120810186528a515181528a518401519381019390935289518501519483019490945288516060908101519083015288516080908101516001600160401b031690830152885160a090810151851690830152885160c09081015133959293929183019116156200115157895160c0015162001153565b335b6001600160a01b03168152602001896000015160e001518152602001896000015161010001516001600160a01b03168152506040516020016200119a9493929190620020b4565b60408051601f1981840301815290829052620011ba929160200162001d3a565b6040516020818303038152906040529250509250929050565b60008260200183518381836000f59250506001600160a01b0382169050620001fa5760405163ef35ca1960e01b815260040160405180910390fd5b600081602001825180826000f09250506001600160a01b0382169050620002ea5760405163ef35ca1960e01b815260040160405180910390fd5b6001600160a01b03811662001270576040516302e47d1560e41b815260040160405180910390fd5b50565b6103d480620021b083390190565b611d77806200258483390190565b600060208284031215620012a257600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620012e457620012e4620012a9565b60405290565b604051606081016001600160401b0381118282101715620012e457620012e4620012a9565b604080519081016001600160401b0381118282101715620012e457620012e4620012a9565b60405161012081016001600160401b0381118282101715620012e457620012e4620012a9565b604051601f8201601f191681016001600160401b0381118282101715620013855762001385620012a9565b604052919050565b600082601f8301126200139f57600080fd5b81356001600160401b03811115620013bb57620013bb620012a9565b620013d0601f8201601f19166020016200135a565b818152846020838601011115620013e657600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160401b0381168114620002ea57600080fd5b6001600160a01b03811681146200127057600080fd5b8035620002ea816200141b565b60006001600160401b038211156200145a576200145a620012a9565b5060051b60200190565b600381106200127057600080fd5b803560ff81168114620002ea57600080fd5b600082601f8301126200149657600080fd5b81356020620014af620014a9836200143e565b6200135a565b82815260079290921b84018101918181019086841115620014cf57600080fd5b8286015b84811015620015415760808189031215620014ee5760008081fd5b620014f8620012bf565b813560068110620015095760008081fd5b8152818501358582015260408083013562001524816200141b565b9082015260608281013590820152835291830191608001620014d3565b509695505050505050565b600082601f8301126200155e57600080fd5b8135602062001571620014a9836200143e565b828152606092830285018201928282019190878511156200159157600080fd5b8387015b85811015620015fa5781818a031215620015af5760008081fd5b620015b9620012ea565b8135620015c68162001464565b8152620015d582870162001472565b868201526040620015e881840162001472565b90820152845292840192810162001595565b5090979650505050505050565b6000606082840312156200161a57600080fd5b62001624620012ea565b905081356001600160401b03808211156200163e57600080fd5b818401915084601f8301126200165357600080fd5b8135602062001666620014a9836200143e565b82815260069290921b840181019181810190888411156200168657600080fd5b948201945b83861015620016e3576040868a031215620016a65760008081fd5b620016b06200130f565b8635620016bd8162001464565b8152620016cc87850162001472565b81850152825260409590950194908201906200168b565b86525085810135935082841115620016fa57600080fd5b620017088785880162001484565b908501525060408401359150808211156200172257600080fd5b5062001731848285016200154c565b60408301525092915050565b6000606082840312156200175057600080fd5b6200175a620012ea565b9050813580151581146200176d57600080fd5b81526020828101356001600160401b03808211156200178b57600080fd5b818501915085601f830112620017a057600080fd5b8135620017b1620014a9826200143e565b81815260059190911b83018401908481019088831115620017d157600080fd5b938501935b82851015620017fc578435620017ec816200141b565b82529385019390850190620017d6565b808688015250505060408501359250808311156200181957600080fd5b5050620017318482850162001607565b600082601f8301126200183b57600080fd5b813560206200184e620014a9836200143e565b82815260059290921b840181019181810190868411156200186e57600080fd5b8286015b84811015620015415780356001600160401b03811115620018935760008081fd5b620018a38986838b01016200138d565b84525091830191830162001872565b600060608284031215620018c557600080fd5b620018cf620012ea565b905081356001600160401b0380821115620018e957600080fd5b908301906101208286031215620018ff57600080fd5b6200190962001334565b8235828111156200191957600080fd5b62001927878286016200138d565b8252506020830135828111156200193d57600080fd5b6200194b878286016200138d565b6020830152506040830135604082015260608301356060820152620019736080840162001403565b60808201526200198660a0840162001431565b60a08201526200199960c0840162001431565b60c082015260e083013560e0820152610100620019b881850162001431565b9082015283526020840135915080821115620019d357600080fd5b620019e1858386016200173d565b60208401526040840135915080821115620019fb57600080fd5b50620017318482850162001829565b60006020828403121562001a1d57600080fd5b604051602081016001600160401b03828210818311171562001a435762001a43620012a9565b81604052829350843591508082111562001a5c57600080fd5b5062001a6b858286016200138d565b8252505092915050565b60006020828403121562001a8857600080fd5b81356001600160401b038082111562001aa057600080fd5b908301906080828603121562001ab557600080fd5b62001abf620012bf565b82358281111562001acf57600080fd5b62001add878286016200138d565b82525060208301358281111562001af357600080fd5b62001b01878286016200138d565b60208301525060408301358281111562001b1a57600080fd5b62001b2887828601620018b2565b60408301525060608301358281111562001b4157600080fd5b62001b4f8782860162001a0a565b60608301525095945050505050565b60008060006060848603121562001b7457600080fd5b833562001b81816200141b565b9250602084013562001b93816200141b565b9150604084013562001ba5816200141b565b809150509250925092565b60006020828403121562001bc357600080fd5b813562001bd0816200141b565b9392505050565b60006020828403121562001bea57600080fd5b5051919050565b60006001820162001c1257634e487b7160e01b600052601160045260246000fd5b5060010190565b60005b8381101562001c3657818101518382015260200162001c1c565b50506000910152565b6000815180845262001c5981602086016020860162001c19565b601f01601f19169290920160200192915050565b60608152600062001c82606083018662001c3f565b828103602084015262001c96818662001c3f565b91505060018060a01b0383166040830152949350505050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b8181101562001d085783516001600160a01b03168352928401929184019160010162001ce1565b50909695505050505050565b6001600160a01b03831681526040602082018190526000906200096a9083018462001c3f565b6000835162001d4e81846020880162001c19565b83519083019062001d6481836020880162001c19565b01949350505050565b60018060a01b03815116825260006020820151604060208501526200096a604085018262001c3f565b60608152600062001dab606083018662001c3f565b6020838203818501528186518084528284019150828160051b85010183890160005b8381101562001dff57601f1987840301855262001dec83835162001c3f565b9486019492509085019060010162001dcd565b50508681036040880152875180825284820195509250600583901b81018401915083880160005b8481101562001e5857601f1983850301875262001e4584835162001d6d565b9686019693509085019060010162001e26565b50919a9950505050505050505050565b8281526040602082015260006200096a604083018462001d6d565b634e487b7160e01b600052602160045260246000fd5b6003811062001270576200127062001e83565b60008151808452602080850194506020840160005b8381101562001f1b57815180516006811062001ee15762001ee162001e83565b885280840151848901526040808201516001600160a01b031690890152606090810151908801526080909601959082019060010162001ec1565b509495945050505050565b60008151808452602080850194506020840160005b8381101562001f1b578151805162001f538162001e99565b88528084015160ff908116858a015260409182015116908801526060909601959082019060010162001f3b565b6020808252825160608383015280516080840181905260009291820190839060a08601905b8083101562001fe0578351805162001fbd8162001e99565b835285015160ff1685830152928401926001929092019160409091019062001fa5565b50838701519350601f1992508286820301604087015262002002818562001eac565b9350505060408501518185840301606086015262002021838262001f26565b9695505050505050565b805160208083015191908110156200204d576000198160200360031b1b821691505b50919050565b838152600060206060602084015262002070606084018662001c3f565b83810360408501528451808252602080870192019060005b81811015620020a65783518352928401929184019160010162002088565b509098975050505050505050565b600060018060a01b03808716835263ffffffff60e01b8651166020840152806020870151166040840152808551166060840152506020840151608083015260c060a083015282516101208060c0850152620021146101e085018362001c3f565b9150602085015160bf198584030160e086015262002133838262001c3f565b92505060408501516101008181870152606087015183870152608087015192506200216a6101408701846001600160401b03169052565b60a08701516001600160a01b0390811661016088015260c0880151811661018088015260e08801516101a0880152908701519081166101c0870152915062001541905056fe60806040526040516103d43803806103d483398101604081905261002291610268565b61002c8282610033565b5050610352565b61003c82610092565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561008657610081828261010e565b505050565b61008e610185565b5050565b806001600160a01b03163b6000036100cd57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161012b9190610336565b600060405180830381855af49150503d8060008114610166576040519150601f19603f3d011682016040523d82523d6000602084013e61016b565b606091505b50909250905061017c8583836101a6565b95945050505050565b34156101a45760405163b398979f60e01b815260040160405180910390fd5b565b6060826101bb576101b682610205565b6101fe565b81511580156101d257506001600160a01b0384163b155b156101fb57604051639996b31560e01b81526001600160a01b03851660048201526024016100c4565b50805b9392505050565b8051156102155780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b60005b8381101561025f578181015183820152602001610247565b50506000910152565b6000806040838503121561027b57600080fd5b82516001600160a01b038116811461029257600080fd5b60208401519092506001600160401b03808211156102af57600080fd5b818501915085601f8301126102c357600080fd5b8151818111156102d5576102d561022e565b604051601f8201601f19908116603f011681019083821181831017156102fd576102fd61022e565b8160405282815288602084870101111561031657600080fd5b610327836020830160208801610244565b80955050505050509250929050565b60008251610348818460208701610244565b9190910192915050565b6074806103606000396000f3fe6080604052600a600c565b005b60186014601a565b6051565b565b6000604c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015606f573d6000f35b3d6000fd60806040523480156200001157600080fd5b5060405162001d7738038062001d77833981016040819052620000349162000dfe565b6200003e6200016a565b620000a58380517f9c16cba5b9f2fcbd952b38bec34079e93cbe107475c15fc20705f4e704198a0080546020909301516001600160a01b03166001600160a01b031960e09390931c600160a01b02929092166001600160c01b031990931692909217179055565b81517fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60080546001600160a01b0319166001600160a01b0390921691909117905560208201517fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60155805160208201516200011f91906200017e565b62000135818460200151620001d560201b60201c565b6200013f6200038b565b6200014c8460016200039a565b62000156620003c0565b6200016062000495565b5050505062001107565b6200017c6301ffc9a760e01b620004ea565b565b60008051602062001cf78339815191527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df02620001bb848262000f64565b5060038101620001cc838262000f64565b50600090555050565b60008051602062001d1783398151915280546001600160a01b038381166001600160a01b0319928316179092556101008401517fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb608805491909316908216179091557fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb604805490911673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee17905560608201517fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6035560e08201517fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60781905560008051602062001d578339815191529015620002eb5760e0830151620002eb90620005ca565b610100830151620002fc9062000678565b6040830151156200038657604083015162000317906200074a565b600881015460408085015190516391b7f5ed60e01b81526001600160a01b03909216916391b7f5ed91620003519160040190815260200190565b600060405180830381600087803b1580156200036c57600080fd5b505af115801562000381573d6000803e3d6000fd5b505050505b505050565b6200017c607b6103e8620007f5565b620003bc828260405180602001604052806000815250620008ee60201b60201c565b5050565b60007f9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009050600060008051602062001d5783398151915260060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa15801562000450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000476919062001030565b82546001600160a01b0319166001600160a01b03919091161790915550565b620004a76380ac58cd60e01b620004ea565b620004b9635b5e139f60e01b620004ea565b620004cb638c65f84d60e01b620004ea565b620004dd6307f5828d60e41b620004ea565b6200017c63421fb7a760e01b5b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff16151560011462000579576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff1916600117905562000592565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60008051602062001d178339815191525460408051632cbb9d1360e01b8152905160008051602062001d57833981519152926001600160a01b031691632cbb9d139160048083019260209291908290030181865afa15801562000631573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000657919062001055565b821115620003bc5760405163c3983b9160e01b815260040160405180910390fd5b6001600160a01b038116620006a057604051630e88bf4b60e01b815260040160405180910390fd5b60008051602062001d17833981519152546001600160a01b03166040516346fc05eb60e11b81526001600160a01b0383811660048301529190911690638df80bd690602401602060405180830381865afa15801562000703573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200072991906200106f565b6200074757604051630e88bf4b60e01b815260040160405180910390fd5b50565b60006200076d60008051602062001d17833981519152546001600160a01b031690565b6001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620007ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007d1919062001055565b905080821015620003bc57604051631a23d64760e11b815260040160405180910390fd5b8160000362000817576040516306c1cb6d60e51b815260040160405180910390fd5b6127108161ffff1611156200083f57604051634e7ee09d60e11b815260040160405180910390fd5b60008281527f3c2290b88407133303e904ceb4ee7d0d14164eda8a629372d8406216ceb57e00602081905260409091205461ffff16801562000894576040516306c1cb6d60e51b815260040160405180910390fd5b60008481526020838152604091829020805461ffff191661ffff8716908117909155915191825285917f674ed3e313f9254fbafb8a51fa62be8b5f0a767d64c64cfe6f099c80c779a528910160405180910390a250505050565b620008fa838362000980565b6001600160a01b0383163b15620003865760008051602062001cf7833981519152548281035b6001810190620009369060009087908662000aba565b62000954576040516368d2bf6b60e11b815260040160405180910390fd5b81811062000920578160008051602062001cf783398151915254146200097957600080fd5b5050505050565b60008051602062001cf7833981519152546000829003620009b45760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df056020908152604080832080546801000000000000000188020190558483527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0490915281206001851460e11b4260a01b1783179055828401908390839060008051602062001d378339815191528180a4600183015b81811462000a81578083600060008051602062001d37833981519152600080a460010162000a58565b508160000362000aa357604051622e076360e81b815260040160405180910390fd5b60008051602062001cf78339815191525550505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029062000af190339089908890889060040162001093565b6020604051808303816000875af192505050801562000b2f575060408051601f3d908101601f1916820190925262000b2c91810190620010e9565b60015b62000b91573d80801562000b60576040519150601f19603f3d011682016040523d82523d6000602084013e62000b65565b606091505b50805160000362000b89576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b80516001600160a01b038116811462000bc657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b038111828210171562000c075762000c0762000bcb565b60405290565b604080519081016001600160401b038111828210171562000c075762000c0762000bcb565b80516001600160e01b03198116811462000bc657600080fd5b60005b8381101562000c6857818101518382015260200162000c4e565b50506000910152565b600082601f83011262000c8357600080fd5b81516001600160401b038082111562000ca05762000ca062000bcb565b604051601f8301601f19908116603f0116810190828211818310171562000ccb5762000ccb62000bcb565b8160405283815286602085880101111562000ce557600080fd5b62000cf884602083016020890162000c4b565b9695505050505050565b80516001600160401b038116811462000bc657600080fd5b6000610120828403121562000d2e57600080fd5b62000d3862000be1565b82519091506001600160401b038082111562000d5357600080fd5b62000d618583860162000c71565b8352602084015191508082111562000d7857600080fd5b5062000d878482850162000c71565b602083015250604082015160408201526060820151606082015262000daf6080830162000d02565b608082015262000dc260a0830162000bae565b60a082015262000dd560c0830162000bae565b60c082015260e082015160e082015261010062000df481840162000bae565b9082015292915050565b60008060008084860360c081121562000e1657600080fd5b62000e218662000bae565b94506040601f198201121562000e3657600080fd5b62000e4062000c0d565b62000e4e6020880162000c32565b815262000e5e6040880162000bae565b602082015293506040605f198201121562000e7857600080fd5b5062000e8362000c0d565b62000e916060870162000bae565b81526080860151602082015260a08601519092506001600160401b0381111562000eba57600080fd5b62000ec88782880162000d1a565b91505092959194509250565b600181811c9082168062000ee957607f821691505b60208210810362000f0a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000386576000816000526020600020601f850160051c8101602086101562000f3b5750805b601f850160051c820191505b8181101562000f5c5782815560010162000f47565b505050505050565b81516001600160401b0381111562000f805762000f8062000bcb565b62000f988162000f91845462000ed4565b8462000f10565b602080601f83116001811462000fd0576000841562000fb75750858301515b600019600386901b1c1916600185901b17855562000f5c565b600085815260208120601f198616915b82811015620010015788860151825594840194600190910190840162000fe0565b5085821015620010205787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200104357600080fd5b6200104e8262000bae565b9392505050565b6000602082840312156200106857600080fd5b5051919050565b6000602082840312156200108257600080fd5b815180151581146200104e57600080fd5b600060018060a01b038087168352808616602084015250836040830152608060608301528251806080840152620010d28160a085016020870162000c4b565b601f01601f19169190910160a00195945050505050565b600060208284031215620010fc57600080fd5b6200104e8262000c32565b610be080620011176000396000f3fe6080604052600436106100a05760003560e01c80638934207f116100645780638934207f1461020d578063ac7ee62614610241578063ac9650d81461027e578063b3a5be6d146102ab578063d33d9345146102c0578063f9d5d22c146102e2576100a7565b80633ded10de146100b157806369d9346b146100e4578063702515631461014057806373fc5a051461019157806377460cd3146101d0576100a7565b366100a757005b6100af610302565b005b3480156100bd57600080fd5b506100d16100cc366004610918565b61035d565b6040519081526020015b60405180910390f35b3480156100f057600080fd5b506100af6100ff366004610949565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60880546001600160a01b0319166001600160a01b0392909216919091179055565b34801561014c57600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb604546001600160a01b03165b6040516001600160a01b0390911681526020016100db565b34801561019d57600080fd5b506100af6101ac366004610918565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60355565b3480156101dc57600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb606546001600160a01b0316610179565b34801561021957600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb603546100d1565b34801561024d57600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb608546001600160a01b0316610179565b34801561028a57600080fd5b5061029e61029936600461096d565b6104ef565b6040516100db9190610a32565b3480156102b757600080fd5b506100d161060c565b3480156102cc57600080fd5b506102d56106cd565b6040516100db9190610a96565b3480156102ee57600080fd5b506100af6102fd366004610918565b61076f565b600061030c6107d2565b9050806001600160a01b03163b600003610339576040516321f27f0d60e21b815260040160405180910390fd5b3660008037600080366000845af43d6000803e808015610358573d6000f35b3d6000fd5b6000600080516020610bc08339815191528161037761060c565b90508381111561038b575060009392505050565b6006820154604051639262b1b360e01b815230600482015285916001600160a01b031690639262b1b390602401602060405180830381865afa1580156103d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f99190610aa9565b1115610409575060009392505050565b60088201546001600160a01b03161561049a576008820154604051635cf4ee9160e01b815260048101839052602481018690526001600160a01b0390911690635cf4ee9190604401602060405180830381865afa15801561046e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104929190610aa9565b949350505050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046e573d6000803e3d6000fd5b6060818067ffffffffffffffff81111561050b5761050b610ac2565b60405190808252806020026020018201604052801561053e57816020015b60608152602001906001900390816105295790505b50915060005b81811015610604576000803087878581811061056257610562610ad8565b90506020028101906105749190610aee565b604051610582929190610b3c565b600060405180830381855af49150503d80600081146105bd576040519150601f19603f3d011682016040523d82523d6000602084013e6105c2565b606091505b509150915081156105f057808584815181106105e0576105e0610ad8565b60200260200101819052506105fa565b3d6000803e3d6000fd5b5050600101610544565b505092915050565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60754600090600080516020610bc083398151915290801561064d5792915050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c69190610aa9565b9250505090565b6060600080516020610bc0833981519152600c0180546106ec90610b4c565b80601f016020809104026020016040519081016040528092919081815260200182805461071890610b4c565b80156107655780601f1061073a57610100808354040283529160200191610765565b820191906000526020600020905b81548152906001019060200180831161074857829003601f168201915b5050505050905090565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb607819055604051600080516020610bc08339815191529082907fab14a23e88fb272313490d4f20d63098e64fd38304c0e07a377db98c2b39b92f90600090a25050565b7f9c16cba5b9f2fcbd952b38bec34079e93cbe107475c15fc20705f4e704198a0054600090600160a01b900460e01b81806108347f9c16cba5b9f2fcbd952b38bec34079e93cbe107475c15fc20705f4e704198a00546001600160a01b031690565b6040516001600160e01b03196000351660248201526001600160a01b039190911690849060440160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516108999190610b86565b600060405180830381855afa9150503d80600081146108d4576040519150601f19603f3d011682016040523d82523d6000602084013e6108d9565b606091505b5091509150816108fc5760405163391aa44560e01b815260040160405180910390fd5b808060200190518101906109109190610ba2565b935050505090565b60006020828403121561092a57600080fd5b5035919050565b6001600160a01b038116811461094657600080fd5b50565b60006020828403121561095b57600080fd5b813561096681610931565b9392505050565b6000806020838503121561098057600080fd5b823567ffffffffffffffff8082111561099857600080fd5b818501915085601f8301126109ac57600080fd5b8135818111156109bb57600080fd5b8660208260051b85010111156109d057600080fd5b60209290920196919550909350505050565b60005b838110156109fd5781810151838201526020016109e5565b50506000910152565b60008151808452610a1e8160208601602086016109e2565b601f01601f19169290920160200192915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015610a8957603f19888603018452610a77858351610a06565b94509285019290850190600101610a5b565b5092979650505050505050565b6020815260006109666020830184610a06565b600060208284031215610abb57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610b0557600080fd5b83018035915067ffffffffffffffff821115610b2057600080fd5b602001915036819003821315610b3557600080fd5b9250929050565b8183823760009101908152919050565b600181811c90821680610b6057607f821691505b602082108103610b8057634e487b7160e01b600052602260045260246000fd5b50919050565b60008251610b988184602087016109e2565b9190910192915050565b600060208284031215610bb457600080fd5b81516109668161093156fec21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df00c21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb606ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6009e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d00","sourceMap":"830:1802:127:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2366:264;;;:::i;:::-;;;;-1:-1:-1;;;;;345:15:376;;;327:34;;397:15;;;392:2;377:18;;370:43;449:15;;429:18;;;422:43;;;;277:2;262:18;2366:264:127;;;;;;;;1611:121;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;934:32:376;;;916:51;;904:2;889:18;1611:121:127;770:203:376;1455:152:127;;;;;;:::i;:::-;;:::i;2037:325::-;;;;;;:::i;:::-;;:::i;:::-;;1736:117;;;;;;:::i;:::-;;:::i;:::-;;;14824:25:376;;;14812:2;14797:18;1736:117:127;14678:177:376;945:334:127;;;;;;:::i;:::-;;:::i;2366:264::-;2452:22;2482:46;2536;2604:21;-1:-1:-1;;;;;;;;;;;5890:13:128;5905:18;;5925;;-1:-1:-1;;;;;5890:13:128;;;;5905:18;;;;5925;;5585:364;2604:21:127;2597:28;;;;;;2366:264;;;:::o;1611:121::-;1678:7;2630:49:128;;;:40;:49;;;;;;-1:-1:-1;;;;;2630:49:128;1700:27:127;1693:34;1611:121;-1:-1:-1;;1611:121:127:o;1455:152::-;1557:7;415:1:92;302:66:93;515:38:92;:66;511:117;;596:32;;-1:-1:-1;;;596:32:92;;;;;;;;;;;511:117;634:22;415:1;302:66:93;832:65:92;777:125;634:22;293:66:89;526:31:87;;;293:55:::1;;;323:18;;-1:-1:-1::0;;;323:18:87::1;;;;;;;;;;;293:55;1579:23:127::2;1592:9;1579:12;:23::i;:::-;1572:30;;669:24:92::0;475:1;302:66:93;832:65:92;777:125;669:24;1455:152:127;;;:::o;2037:325::-;291:66:77;445:29:75;-1:-1:-1;;;;;445:29:75;286:10;:22;282:79;;325:29;;-1:-1:-1;;;325:29:75;;343:10;325:29;;;916:51:376;889:18;;325:29:75;;;;;;;282:79;2240:117:127::1;2267:10;2285:29;2322;2240:19;:117::i;:::-;2037:325:::0;;;:::o;1736:117::-;-1:-1:-1;;;;;2484:47:128;;1801:7:127;2484:47:128;;;:40;:47;;;;;;1823:25:127;2396:140:128;945:334:127;303:66:64;1263:42:63;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:63;;;;;;;;;;;2688:2102:128;-1:-1:-1;;;;;;;;;;;3005:14:128;;:28;;;-1:-1:-1;;;3005:28:128;;;;2764:20;;281:66:129;;772::131;;2764:20:128;;-1:-1:-1;;;;;3005:14:128;;;;:26;;:28;;;;;;;;;;;;;;;:14;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2982:51;;3075:48;3088:12;3102:9;:20;;;3075:12;:48::i;:::-;3164:15;;3060:63;;-1:-1:-1;3164:2:128;:13;:15;;;:::i;:::-;;;;-1:-1:-1;;3210:31:128;;;;:17;;;:31;;;;;;;;:46;;-1:-1:-1;;;;;;3210:46:128;-1:-1:-1;;;;;3210:46:128;;;;;;;;;3262:31;;-1:-1:-1;3262:17:128;;:31;;;;;;:46;;;3362:14;;3387;;3403:13;;;;3362:69;;-1:-1:-1;;;3362:69:128;;:14;;;:24;;:69;;3387:14;;3210:46;;3362:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;3547:19:128;;;;3469:32;;3528:53;;-1:-1:-1;;;;;3547:19:128;3568:12;3528:18;:53::i;:::-;3704:19;;;;3469:118;;-1:-1:-1;3626:32:128;;3685:53;;-1:-1:-1;;;;;3704:19:128;3725:12;3685:18;:53::i;:::-;3783:16;;;3797:1;3783:16;;;;;;;;3626:118;;-1:-1:-1;3751:29:128;;3783:16;;;;;;;;;;;;-1:-1:-1;3783:16:128;3751:48;;3831:15;3805:12;3818:1;3805:15;;;;;;;;:::i;:::-;;;;;;:42;-1:-1:-1;;;;;3805:42:128;;;-1:-1:-1;;;;;3805:42:128;;;;;3879:15;3853:12;3866:1;3853:15;;;;;;;;:::i;:::-;-1:-1:-1;;;;;3853:42:128;;;:15;;;;;;;;;:42;3939:73;;-1:-1:-1;;;3939:73:128;;:59;;;;;;:73;;3999:12;;3939:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4063:137;4095:12;4115:15;4138;4161:9;:20;;;:33;;;4063:24;:137::i;:::-;-1:-1:-1;4343:20:128;;;;;:29;;:34;4385:32;;;4268:20;;4291:155;;4323:12;;4343:34;4425:15;4291:24;:155::i;:::-;4268:178;;4483:68;4505:12;4519;4533:9;:17;;;4483:21;:68::i;:::-;4605:14;;4588:115;;-1:-1:-1;;;4588:115:128;;4654:4;4588:115;;;17337:34:376;4667:10:128;17387:18:376;;;17380:43;17439:18;;;17432:34;;;-1:-1:-1;;;;;4605:14:128;;;;4588:50;;17272:18:376;;4588:115:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4733:52:128;;-1:-1:-1;;;;;4733:52:128;;;-1:-1:-1;4758:12:128;;-1:-1:-1;4746:10:128;;4733:52;;;;;2786:2004;;;;;;;2688:2102;;;:::o;4976:605::-;5140:10;-1:-1:-1;;;;;5132:31:128;;5167:1;5132:36;5128:73;;5177:24;;-1:-1:-1;;;5177:24:128;;;;;;;;;;;5128:73;5219:15;-1:-1:-1;;;;;5211:36:128;;5251:1;5211:41;5207:84;;5267:24;;-1:-1:-1;;;5267:24:128;;;;;;;;;;;5207:84;5309:15;-1:-1:-1;;;;;5301:36:128;;5341:1;5301:41;5297:84;;5357:24;;-1:-1:-1;;;5357:24:128;;;;;;;;;;;5297:84;-1:-1:-1;;;;;;;;;;;5466:26:128;;-1:-1:-1;;;;;5466:26:128;;;-1:-1:-1;;;;;;5466:26:128;;;;;;;5498:18;:36;;;;;;;;;;;;;;;5540:18;:36;;;;;;;;;;;4976:605::o;9109:300::-;9213:13;9262:21;9285:12;9301:67;9332:12;9352:10;9301:23;:67::i;:::-;9261:107;;;;9381:23;9389:8;9399:4;9381:7;:23::i;:::-;9374:30;9109:300;-1:-1:-1;;;;;9109:300:128:o;9413:381::-;9519:7;9561:21;9609:31;;;;;;;;:::i;:::-;-1:-1:-1;;9609:31:128;;;;;;;;;;;;;;;;-1:-1:-1;;;;;934:32:376;;9689:55:128;;;916:51:376;9668:11:128;;889:18:376;;9689:55:128;;;-1:-1:-1;;9689:55:128;;;;;;;;;;;;;;;-1:-1:-1;;;;;9689:55:128;-1:-1:-1;;;9689:55:128;;;9648:104;;;;;9689:55;9648:104;;:::i;:::-;;;;-1:-1:-1;;9648:104:128;;;;;;;;;;9585:173;;;9648:104;9585:173;;:::i;:::-;;;;;;;;;;;;;9561:197;;9772:17;9780:8;9772:7;:17::i;:::-;9765:24;9413:381;-1:-1:-1;;;;9413:381:128:o;6731:1589::-;6993:15;;;7006:1;6993:15;;;;;;;;;6937:14;;;;6993:15;;;;;;;;;;;;;;;;;;;;;6959:49;;7035:21;;;;;;;;;;;;;-1:-1:-1;;;7035:21:128;;;7014:15;7030:1;7014:18;;;;;;;;:::i;:::-;;;;;;:42;;;;7079:12;-1:-1:-1;;;;;7072:31:128;;7111:11;;;;;;;;;;;;;-1:-1:-1;;;7111:11:128;;;7130:15;7188:1;-1:-1:-1;;;;;7153:37:128;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;7153:37:128;;;;;;;;;;;;;;;;7072:124;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7207:21;;7063:133;;-1:-1:-1;7203:1094:128;;;7263:16;;;7277:1;7263:16;;;;;;;;;7238:22;;7263:16;;;;;;;;;;;-1:-1:-1;7263:16:128;7238:41;;2116:1;7287:5;7293:1;7287:8;;;;;;;;:::i;:::-;;;;;;:27;-1:-1:-1;;;;;7287:27:128;;;-1:-1:-1;;;;;7287:27:128;;;;;7330:12;-1:-1:-1;;;;;7323:41:128;;7374:6;7390:110;;;;;;;;7439:15;-1:-1:-1;;;;;7390:110:128;;;;;7483:5;7472:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;7390:110;;;7323:185;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7230:285;7203:1094;;;7533:18;;;;:25;:30;7529:473;;7606:9;7601:172;7625:12;:18;;;:25;7621:1;:29;7601:172;;;7666:45;7689:12;:18;;;7708:1;7689:21;;;;;;;;:::i;:::-;;;;;;;7666:22;:45::i;:::-;7747:3;;7601:172;;;;7790:12;-1:-1:-1;;;;;7783:41:128;;7836:6;7854:129;;;;;;;;7905:15;-1:-1:-1;;;;;7854:129:128;;;;;7951:12;:18;;;7940:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;7854:129;;;7783:210;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7529:473;8014:21;;;;:32;:39;:43;8010:281;;8076:12;-1:-1:-1;;;;;8069:41:128;;8122:6;8140:132;;;;;;;;8191:15;-1:-1:-1;;;;;8140:132:128;;;;;8237:12;:21;;;8226:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;8140:132;;;8069:213;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8010:281;8302:13;6731:1589;;;;;;:::o;8324:601::-;8560:16;;;8574:1;8560:16;;;;;;;;;8513:14;;;;8560:16;;;;;;;;;;;;-1:-1:-1;8560:16:128;8535:41;;2116:1;8582:5;8588:1;8582:8;;;;;;;;:::i;:::-;-1:-1:-1;;;;;8582:27:128;;;;:8;;;;;;;;;;;:27;8675:37;;;8710:1;8675:37;;;;;;;;;8616:56;;8675:37;;;;-1:-1:-1;;;;;;;;;;;;;;;;;8675:37:128;;;;;;;;;;;;;;;8616:96;;8743:15;8718:12;8731:1;8718:15;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;8718:40:128;;;;;;8787:17;;;;8798:5;;8787:17;;:::i;:::-;;;;;;;;;;;;;8764:12;8777:1;8764:15;;;;;;;;:::i;:::-;;;;;;;;;;;;:20;:40;8820:100;;-1:-1:-1;;;8820:100:128;;-1:-1:-1;;;;;8820:31:128;;;;;:100;;8859:10;;8877:17;;8902:12;;8820:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8811:109;8324:601;-1:-1:-1;;;;;;;8324:601:128:o;6135:406::-;6287:16;;;6301:1;6287:16;;;;;;;;;6260:24;;6287:16;;;;;;;;;;;-1:-1:-1;6287:16:128;6260:43;;6322:6;6309:7;6317:1;6309:10;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;;6377:44;;-1:-1:-1;;;6377:44:128;;;24044:39:376;;;;-1:-1:-1;;6406:14:128;;;;24112:44:376;24099:11;;;24092:65;6335:24:128;;24173:12:376;;6377:44:128;;;;;;;;;;;;6362:65;;;:::i;:::-;6495:20;;6434:102;;-1:-1:-1;;;6434:102:128;;6335:92;;-1:-1:-1;;;;;;6434:29:128;;;;;:102;;6335:92;;6495:20;6523:7;;6434:102;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6254:287;;6135:406;;;:::o;9798:1374::-;9918:21;9941:12;;-1:-1:-1;;;;;;;;;;;10079:53:128;;;10090:10;10079:53;;;25539:51:376;25606:18;;;25599:34;;;10116:15:128;25649:18:376;;;25642:34;9961:72:128;;-1:-1:-1;25512:18:376;;10079:53:128;;;;;;;;;;;;10069:64;;;;;;10062:71;;10202:29;;;;;;;;:::i;:::-;-1:-1:-1;;10202:29:128;;;;;;;;;;;;;10279:145;;;;;-1:-1:-1;;;10279:145:128;;10408:4;10202:29;10279:145;;;;;;;10434:121;;;;;;;10497:13;;-1:-1:-1;;;;;10497:13:128;;;10434:121;;;;;;;;10565:588;;;;;;;10610:19;;:24;10565:588;;10654:19;;:26;;;10565:588;;;;;;;10699:19;;:25;;;10565:588;;;;;;;10747:19;;10565:588;10747:29;;;;10565:588;;;;10798:19;;10565:588;10798:28;;;;-1:-1:-1;;;;;10565:588:128;;;;;10848:19;;10565:588;10848:28;;;;10565:588;;;;;;10902:19;;10565:588;10902:32;;;;10259:10;;10434:121;;10565:588;;;;;10902:46;;:118;;10988:19;;:32;;;10902:118;;;10963:10;10902:118;-1:-1:-1;;;;;10565:588:128;;;;;11048:10;:19;;;:34;;;10565:588;;;;11109:10;:19;;;:33;;;-1:-1:-1;;;;;10565:588:128;;;;10239:922;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;10239:922:128;;;;;;;;;;10178:989;;;10239:922;10178:989;;:::i;:::-;;;;;;;;;;;;;10167:1000;;9955:1217;9798:1374;;;;;:::o;1061:354:220:-;1145:18;1218:8;1212:4;1208:19;1260:8;1254:15;1329:4;1315:12;1301;1298:1;1290:44;1276:58;-1:-1:-1;;;;;;;1350:24:220;;;-1:-1:-1;1346:64:220;;1383:27;;-1:-1:-1;;;1383:27:220;;;;;;;;;;;401:329;467:18;540:8;534:4;530:19;582:8;576:15;636:12;622;619:1;612:37;598:51;-1:-1:-1;;;;;;;665:24:220;;;-1:-1:-1;661:64:220;;698:27;;-1:-1:-1;;;698:27:220;;;;;;;;;;;744:119:222;-1:-1:-1;;;;;804:18:222;;800:58;;831:27;;-1:-1:-1;;;831:27:222;;;;;;;;;;;800:58;744:119;:::o;-1:-1:-1:-;;;;;;;;:::o;:::-;;;;;;;;:::o;476:180:376:-;535:6;588:2;576:9;567:7;563:23;559:32;556:52;;;604:1;601;594:12;556:52;-1:-1:-1;627:23:376;;476:180;-1:-1:-1;476:180:376:o;978:127::-;1039:10;1034:3;1030:20;1027:1;1020:31;1070:4;1067:1;1060:15;1094:4;1091:1;1084:15;1110:253;1182:2;1176:9;1224:4;1212:17;;-1:-1:-1;;;;;1244:34:376;;1280:22;;;1241:62;1238:88;;;1306:18;;:::i;:::-;1342:2;1335:22;1110:253;:::o;1368:::-;1440:2;1434:9;1482:4;1470:17;;-1:-1:-1;;;;;1502:34:376;;1538:22;;;1499:62;1496:88;;;1564:18;;:::i;1626:257::-;1698:4;1692:11;;;1730:17;;-1:-1:-1;;;;;1762:34:376;;1798:22;;;1759:62;1756:88;;;1824:18;;:::i;1888:255::-;1960:2;1954:9;2002:6;1990:19;;-1:-1:-1;;;;;2024:34:376;;2060:22;;;2021:62;2018:88;;;2086:18;;:::i;2148:275::-;2219:2;2213:9;2284:2;2265:13;;-1:-1:-1;;2261:27:376;2249:40;;-1:-1:-1;;;;;2304:34:376;;2340:22;;;2301:62;2298:88;;;2366:18;;:::i;:::-;2402:2;2395:22;2148:275;;-1:-1:-1;2148:275:376:o;2428:531::-;2471:5;2524:3;2517:4;2509:6;2505:17;2501:27;2491:55;;2542:1;2539;2532:12;2491:55;2578:6;2565:20;-1:-1:-1;;;;;2600:2:376;2597:26;2594:52;;;2626:18;;:::i;:::-;2670:55;2713:2;2694:13;;-1:-1:-1;;2690:27:376;2719:4;2686:38;2670:55;:::i;:::-;2750:2;2741:7;2734:19;2796:3;2789:4;2784:2;2776:6;2772:15;2768:26;2765:35;2762:55;;;2813:1;2810;2803:12;2762:55;2878:2;2871:4;2863:6;2859:17;2852:4;2843:7;2839:18;2826:55;2926:1;2901:16;;;2919:4;2897:27;2890:38;;;;2905:7;2428:531;-1:-1:-1;;;2428:531:376:o;2964:171::-;3031:20;;-1:-1:-1;;;;;3080:30:376;;3070:41;;3060:69;;3125:1;3122;3115:12;3140:131;-1:-1:-1;;;;;3215:31:376;;3205:42;;3195:70;;3261:1;3258;3251:12;3276:134;3344:20;;3373:31;3344:20;3373:31;:::i;3415:183::-;3475:4;-1:-1:-1;;;;;3500:6:376;3497:30;3494:56;;;3530:18;;:::i;:::-;-1:-1:-1;3575:1:376;3571:14;3587:4;3567:25;;3415:183::o;3603:120::-;3697:1;3690:5;3687:12;3677:40;;3713:1;3710;3703:12;3728:156;3794:20;;3854:4;3843:16;;3833:27;;3823:55;;3874:1;3871;3864:12;3889:1366;3957:5;4010:3;4003:4;3995:6;3991:17;3987:27;3977:55;;4028:1;4025;4018:12;3977:55;4064:6;4051:20;4090:4;4114:60;4130:43;4170:2;4130:43;:::i;:::-;4114:60;:::i;:::-;4208:15;;;4294:1;4290:10;;;;4278:23;;4274:32;;;4239:12;;;;4318:15;;;4315:35;;;4346:1;4343;4336:12;4315:35;4382:2;4374:6;4370:15;4394:832;4410:6;4405:3;4402:15;4394:832;;;4488:4;4482:3;4477;4473:13;4469:24;4466:114;;;4534:1;4563:2;4559;4552:14;4466:114;4606:22;;:::i;:::-;4669:3;4656:17;4708:1;4699:7;4696:14;4686:112;;4752:1;4781:2;4777;4770:14;4686:112;4811:22;;4882:12;;;4869:26;4853:14;;;4846:50;4919:2;4962:12;;;4949:26;4988:33;4949:26;4988:33;:::i;:::-;5041:14;;;5034:31;5088:2;5139:12;;;5126:26;5110:14;;;5103:50;5166:18;;5204:12;;;;4436:4;4427:14;4394:832;;;-1:-1:-1;5244:5:376;3889:1366;-1:-1:-1;;;;;;3889:1366:376:o;5260:1169::-;5330:5;5383:3;5376:4;5368:6;5364:17;5360:27;5350:55;;5401:1;5398;5391:12;5350:55;5437:6;5424:20;5463:4;5487:60;5503:43;5543:2;5503:43;:::i;5487:60::-;5581:15;;;5643:4;5686:13;;;5674:26;;5670:35;;;5612:12;;;;5569:3;5717:15;;;5714:35;;;5745:1;5742;5735:12;5714:35;5781:2;5773:6;5769:15;5793:607;5809:6;5804:3;5801:15;5793:607;;;5885:2;5879:3;5874;5870:13;5866:22;5863:112;;;5929:1;5958:2;5954;5947:14;5863:112;6001:22;;:::i;:::-;6064:3;6051:17;6081:52;6125:7;6081:52;:::i;:::-;6146:22;;6204:30;6221:12;;;6204:30;:::i;:::-;6199:2;6192:5;6188:14;6181:54;6258:2;6296:30;6322:2;6317:3;6313:12;6296:30;:::i;:::-;6280:14;;;6273:54;6340:18;;6378:12;;;;5826;;5793:607;;;-1:-1:-1;6418:5:376;;5260:1169;-1:-1:-1;;;;;;;5260:1169:376:o;6434:1726::-;6489:5;6537:4;6525:9;6520:3;6516:19;6512:30;6509:50;;;6555:1;6552;6545:12;6509:50;6577:22;;:::i;:::-;6568:31;;6635:9;6622:23;-1:-1:-1;;;;;6705:2:376;6697:6;6694:14;6691:34;;;6721:1;6718;6711:12;6691:34;6759:6;6748:9;6744:22;6734:32;;6804:3;6797:4;6793:2;6789:13;6785:23;6775:51;;6822:1;6819;6812:12;6775:51;6858:2;6845:16;6880:4;6904:60;6920:43;6960:2;6920:43;:::i;6904:60::-;6998:15;;;7080:1;7076:10;;;;7068:19;;7064:28;;;7029:12;;;;7104:15;;;7101:35;;;7132:1;7129;7122:12;7101:35;7156:11;;;;7176:527;7192:6;7187:3;7184:15;7176:527;;;7270:4;7264:3;7259;7255:13;7251:24;7248:114;;;7316:1;7345:2;7341;7334:14;7248:114;7390:22;;:::i;:::-;7453:3;7440:17;7470:52;7514:7;7470:52;:::i;:::-;7535:24;;7597:30;7614:12;;;7597:30;:::i;:::-;7579:16;;;7572:56;7641:20;;7218:4;7209:14;;;;;7681:12;;;;7176:527;;;7712:20;;-1:-1:-1;7770:18:376;;;7757:32;;-1:-1:-1;7801:16:376;;;7798:36;;;7830:1;7827;7820:12;7798:36;7866:73;7935:3;7924:8;7913:9;7909:24;7866:73;:::i;:::-;7850:14;;;7843:97;-1:-1:-1;7993:4:376;7978:20;;7965:34;;-1:-1:-1;8011:16:376;;;8008:36;;;8040:1;8037;8030:12;8008:36;;8078:75;8149:3;8138:8;8127:9;8123:24;8078:75;:::i;:::-;8071:4;8064:5;8060:16;8053:101;;6434:1726;;;;:::o;8165:1373::-;8234:5;8282:4;8270:9;8265:3;8261:19;8257:30;8254:50;;;8300:1;8297;8290:12;8254:50;8322:22;;:::i;:::-;8313:31;;8381:9;8368:23;8436:7;8429:15;8422:23;8413:7;8410:36;8400:64;;8460:1;8457;8450:12;8400:64;8473:22;;8514:2;8552:18;;;8539:32;-1:-1:-1;;;;;8620:14:376;;;8617:34;;;8647:1;8644;8637:12;8617:34;8685:6;8674:9;8670:22;8660:32;;8730:3;8723:4;8719:2;8715:13;8711:23;8701:51;;8748:1;8745;8738:12;8701:51;8784:2;8771:16;8807:60;8823:43;8863:2;8823:43;:::i;8807:60::-;8901:15;;;8983:1;8979:10;;;;8971:19;;8967:28;;;8932:12;;;;9007:15;;;9004:35;;;9035:1;9032;9025:12;9004:35;9059:11;;;;9079:223;9095:6;9090:3;9087:15;9079:223;;;9177:3;9164:17;9194:33;9219:7;9194:33;:::i;:::-;9240:20;;9112:12;;;;9280;;;;9079:223;;;9334:5;9329:2;9322:5;9318:14;9311:29;;;;9393:2;9382:9;9378:18;9365:32;9349:48;;9422:2;9412:8;9409:16;9406:36;;;9438:1;9435;9428:12;9406:36;;;9474:57;9527:3;9516:8;9505:9;9501:24;9474:57;:::i;9543:888::-;9596:5;9649:3;9642:4;9634:6;9630:17;9626:27;9616:55;;9667:1;9664;9657:12;9616:55;9703:6;9690:20;9729:4;9753:60;9769:43;9809:2;9769:43;:::i;9753:60::-;9847:15;;;9933:1;9929:10;;;;9917:23;;9913:32;;;9878:12;;;;9957:15;;;9954:35;;;9985:1;9982;9975:12;9954:35;10021:2;10013:6;10009:15;10033:369;10049:6;10044:3;10041:15;10033:369;;;10135:3;10122:17;-1:-1:-1;;;;;10158:11:376;10155:35;10152:125;;;10231:1;10260:2;10256;10249:14;10152:125;10302:57;10355:3;10350:2;10336:11;10328:6;10324:24;10320:33;10302:57;:::i;:::-;10290:70;;-1:-1:-1;10380:12:376;;;;10066;;10033:369;;10436:1671;10493:5;10541:4;10529:9;10524:3;10520:19;10516:30;10513:50;;;10559:1;10556;10549:12;10513:50;10581:22;;:::i;:::-;10572:31;;10639:9;10626:23;-1:-1:-1;;;;;10709:2:376;10701:6;10698:14;10695:34;;;10725:1;10722;10715:12;10695:34;10748:22;;;;10800:6;10786:12;;;10782:25;10779:45;;;10820:1;10817;10810:12;10779:45;10848:22;;:::i;:::-;10908:2;10895:16;10936:2;10926:8;10923:16;10920:36;;;10952:1;10949;10942:12;10920:36;10981:41;11018:3;11007:8;11003:2;10999:17;10981:41;:::i;:::-;10972:7;10965:58;;11069:2;11065;11061:11;11048:25;11098:2;11088:8;11085:16;11082:36;;;11114:1;11111;11104:12;11082:36;11152:41;11189:3;11178:8;11174:2;11170:17;11152:41;:::i;:::-;11147:2;11138:7;11134:16;11127:67;;11249:2;11245;11241:11;11228:25;11223:2;11214:7;11210:16;11203:51;11311:4;11307:2;11303:13;11290:27;11283:4;11274:7;11270:18;11263:55;11353:31;11379:3;11375:2;11371:12;11353:31;:::i;:::-;11347:3;11338:7;11334:17;11327:58;11420:32;11447:3;11443:2;11439:12;11420:32;:::i;:::-;11414:3;11405:7;11401:17;11394:59;11488:32;11515:3;11511:2;11507:12;11488:32;:::i;:::-;11482:3;11473:7;11469:17;11462:59;11577:3;11573:2;11569:12;11556:26;11550:3;11541:7;11537:17;11530:53;11602:3;11639:31;11666:2;11662;11658:11;11639:31;:::i;:::-;11621:16;;;11614:57;11680:22;;11755:2;11740:18;;11727:32;;-1:-1:-1;11771:16:376;;;11768:36;;;11800:1;11797;11790:12;11768:36;11836:71;11903:3;11892:8;11881:9;11877:24;11836:71;:::i;:::-;11831:2;11824:5;11820:14;11813:95;11961:2;11950:9;11946:18;11933:32;11917:48;;11990:2;11980:8;11977:16;11974:36;;;12006:1;12003;11996:12;11974:36;;12042:58;12096:3;12085:8;12074:9;12070:24;12042:58;:::i;12112:543::-;12170:5;12218:4;12206:9;12201:3;12197:19;12193:30;12190:50;;;12236:1;12233;12226:12;12190:50;12269:2;12263:9;12311:4;12303:6;12299:17;-1:-1:-1;;;;;12403:6:376;12391:10;12388:22;12383:2;12371:10;12368:18;12365:46;12362:72;;;12414:18;;:::i;:::-;12454:10;12450:2;12443:22;12483:6;12474:15;;12525:9;12512:23;12498:37;;12558:2;12550:6;12547:14;12544:34;;;12574:1;12571;12564:12;12544:34;;12602:46;12644:3;12635:6;12624:9;12620:22;12602:46;:::i;:::-;12594:6;12587:62;;;12112:543;;;;:::o;12660:1154::-;12747:6;12800:2;12788:9;12779:7;12775:23;12771:32;12768:52;;;12816:1;12813;12806:12;12768:52;12856:9;12843:23;-1:-1:-1;;;;;12926:2:376;12918:6;12915:14;12912:34;;;12942:1;12939;12932:12;12912:34;12965:22;;;;13021:4;13003:16;;;12999:27;12996:47;;;13039:1;13036;13029:12;12996:47;13065:22;;:::i;:::-;13125:2;13112:16;13153:2;13143:8;13140:16;13137:36;;;13169:1;13166;13159:12;13137:36;13196:45;13233:7;13222:8;13218:2;13214:17;13196:45;:::i;:::-;13189:5;13182:60;;13288:2;13284;13280:11;13267:25;13317:2;13307:8;13304:16;13301:36;;;13333:1;13330;13323:12;13301:36;13369:45;13406:7;13395:8;13391:2;13387:17;13369:45;:::i;:::-;13364:2;13357:5;13353:14;13346:69;;13461:2;13457;13453:11;13440:25;13490:2;13480:8;13477:16;13474:36;;;13506:1;13503;13496:12;13474:36;13542:56;13590:7;13579:8;13575:2;13571:17;13542:56;:::i;:::-;13537:2;13530:5;13526:14;13519:80;;13645:2;13641;13637:11;13624:25;13674:2;13664:8;13661:16;13658:36;;;13690:1;13687;13680:12;13658:36;13726:57;13775:7;13764:8;13760:2;13756:17;13726:57;:::i;:::-;13721:2;13710:14;;13703:81;-1:-1:-1;13714:5:376;12660:1154;-1:-1:-1;;;;;12660:1154:376:o;13819:602::-;13969:6;13977;13985;14038:2;14026:9;14017:7;14013:23;14009:32;14006:52;;;14054:1;14051;14044:12;14006:52;14093:9;14080:23;14112:31;14137:5;14112:31;:::i;:::-;14162:5;-1:-1:-1;14219:2:376;14204:18;;14191:32;14232:33;14191:32;14232:33;:::i;:::-;14284:7;-1:-1:-1;14343:2:376;14328:18;;14315:32;14356:33;14315:32;14356:33;:::i;:::-;14408:7;14398:17;;;13819:602;;;;;:::o;14426:247::-;14485:6;14538:2;14526:9;14517:7;14513:23;14509:32;14506:52;;;14554:1;14551;14544:12;14506:52;14593:9;14580:23;14612:31;14637:5;14612:31;:::i;:::-;14662:5;14426:247;-1:-1:-1;;;14426:247:376:o;14860:184::-;14930:6;14983:2;14971:9;14962:7;14958:23;14954:32;14951:52;;;14999:1;14996;14989:12;14951:52;-1:-1:-1;15022:16:376;;14860:184;-1:-1:-1;14860:184:376:o;15049:232::-;15088:3;15109:17;;;15106:140;;15168:10;15163:3;15159:20;15156:1;15149:31;15203:4;15200:1;15193:15;15231:4;15228:1;15221:15;15106:140;-1:-1:-1;15273:1:376;15262:13;;15049:232::o;15286:250::-;15371:1;15381:113;15395:6;15392:1;15389:13;15381:113;;;15471:11;;;15465:18;15452:11;;;15445:39;15417:2;15410:10;15381:113;;;-1:-1:-1;;15528:1:376;15510:16;;15503:27;15286:250::o;15541:271::-;15583:3;15621:5;15615:12;15648:6;15643:3;15636:19;15664:76;15733:6;15726:4;15721:3;15717:14;15710:4;15703:5;15699:16;15664:76;:::i;:::-;15794:2;15773:15;-1:-1:-1;;15769:29:376;15760:39;;;;15801:4;15756:50;;15541:271;-1:-1:-1;;15541:271:376:o;15817:480::-;16042:2;16031:9;16024:21;16005:4;16068:45;16109:2;16098:9;16094:18;16086:6;16068:45;:::i;:::-;16161:9;16153:6;16149:22;16144:2;16133:9;16129:18;16122:50;16189:33;16215:6;16207;16189:33;:::i;:::-;16181:41;;;16287:1;16283;16278:3;16274:11;16270:19;16262:6;16258:32;16253:2;16242:9;16238:18;16231:60;15817:480;;;;;;:::o;16302:127::-;16363:10;16358:3;16354:20;16351:1;16344:31;16394:4;16391:1;16384:15;16418:4;16415:1;16408:15;16434:658;16605:2;16657:21;;;16727:13;;16630:18;;;16749:22;;;16576:4;;16605:2;16828:15;;;;16802:2;16787:18;;;16576:4;16871:195;16885:6;16882:1;16879:13;16871:195;;;16950:13;;-1:-1:-1;;;;;16946:39:376;16934:52;;17041:15;;;;17006:12;;;;16982:1;16900:9;16871:195;;;-1:-1:-1;17083:3:376;;16434:658;-1:-1:-1;;;;;;16434:658:376:o;17477:337::-;-1:-1:-1;;;;;17674:32:376;;17656:51;;17743:2;17738;17723:18;;17716:30;;;-1:-1:-1;;17763:45:376;;17789:18;;17781:6;17763:45;:::i;17819:492::-;17994:3;18032:6;18026:13;18048:66;18107:6;18102:3;18095:4;18087:6;18083:17;18048:66;:::i;:::-;18177:13;;18136:16;;;;18199:70;18177:13;18136:16;18246:4;18234:17;;18199:70;:::i;:::-;18285:20;;17819:492;-1:-1:-1;;;;17819:492:376:o;18316:287::-;18441:1;18437;18432:3;18428:11;18424:19;18416:5;18410:12;18406:38;18401:3;18394:51;18376:3;18491:4;18484:5;18480:16;18474:23;18529:4;18522;18517:3;18513:14;18506:28;18550:47;18591:4;18586:3;18582:14;18568:12;18550:47;:::i;18608:1690::-;19005:2;18994:9;18987:21;18968:4;19031:45;19072:2;19061:9;19057:18;19049:6;19031:45;:::i;:::-;19095:2;19145:9;19137:6;19133:22;19128:2;19117:9;19113:18;19106:50;19176:6;19211;19205:13;19242:6;19234;19227:22;19277:2;19269:6;19265:15;19258:22;;19336:2;19326:6;19323:1;19319:14;19311:6;19307:27;19303:36;19374:2;19366:6;19362:15;19395:1;19405:252;19419:6;19416:1;19413:13;19405:252;;;19509:2;19505:7;19496:6;19488;19484:19;19480:33;19475:3;19468:46;19537:40;19570:6;19561;19555:13;19537:40;:::i;:::-;19635:12;;;;19527:50;-1:-1:-1;19600:15:376;;;;19441:1;19434:9;19405:252;;;-1:-1:-1;;19693:22:376;;;19688:2;19673:18;;19666:50;19769:13;;19791:24;;;19833:15;;;;-1:-1:-1;19769:13:376;-1:-1:-1;19891:1:376;19887:16;;;19875:29;;19871:38;;;-1:-1:-1;19934:15:376;;;19969:1;19979:290;19995:8;19990:3;19987:17;19979:290;;;20093:2;20089:7;20080:6;20072;20068:19;20064:33;20057:5;20050:48;20121:60;20174:6;20163:8;20157:15;20121:60;:::i;:::-;20245:14;;;;20111:70;-1:-1:-1;20206:17:376;;;;20023:1;20014:11;19979:290;;;-1:-1:-1;20286:6:376;;18608:1690;-1:-1:-1;;;;;;;;;;18608:1690:376:o;20303:361::-;20532:6;20521:9;20514:25;20575:2;20570;20559:9;20555:18;20548:30;20495:4;20595:63;20654:2;20643:9;20639:18;20631:6;20595:63;:::i;20669:127::-;20730:10;20725:3;20721:20;20718:1;20711:31;20761:4;20758:1;20751:15;20785:4;20782:1;20775:15;20801:126;20895:1;20888:5;20885:12;20875:46;;20901:18;;:::i;20932:807::-;20999:3;21037:5;21031:12;21064:6;21059:3;21052:19;21090:4;21119;21114:3;21110:14;21103:21;;21158:4;21151:5;21147:16;21181:1;21191:523;21205:6;21202:1;21199:13;21191:523;;;21270:6;21264:13;21306:2;21300:9;21339:1;21335:2;21332:9;21322:43;;21345:18;;:::i;:::-;21378:15;;21433:11;;;21427:18;21413:12;;;21406:40;21469:4;21517:11;;;21511:18;-1:-1:-1;;;;;21507:44:376;21493:12;;;21486:66;21575:4;21619:11;;;21613:18;21599:12;;;21592:40;21661:4;21652:14;;;;21689:15;;;;21548:1;21220:9;21191:523;;;-1:-1:-1;21730:3:376;;20932:807;-1:-1:-1;;;;;20932:807:376:o;21744:797::-;21813:3;21851:5;21845:12;21878:6;21873:3;21866:19;21904:4;21933;21928:3;21924:14;21917:21;;21972:4;21965:5;21961:16;21995:1;22005:511;22019:6;22016:1;22013:13;22005:511;;;22084:6;22078:13;22120:2;22114:9;22136:47;22180:2;22136:47;:::i;:::-;22196:15;;22250:11;;;22244:18;22285:4;22323:21;;;22309:12;;;22302:43;22368:4;22416:11;;;22410:18;22406:27;22392:12;;;22385:49;22463:4;22454:14;;;;22491:15;;;;22041:1;22034:9;22005:511;;22546:1338;22721:2;22732:21;;;22824:13;;22873:4;22853:18;;;22846:32;22927:19;;22791:3;22776:19;;22955:22;;;22692:4;;22721:2;23035:21;;;22692:4;;23008:3;22993:19;;;23084:352;23098:6;23095:1;23092:13;23084:352;;;23163:6;23157:13;23199:2;23193:9;23215:47;23259:2;23215:47;:::i;:::-;23275:15;;23334:11;;23328:18;23348:4;23324:29;23310:12;;;23303:51;23411:15;;;;23120:1;23113:9;;;;;23383:4;23374:14;;;;23084:352;;;23088:3;23485:2;23477:6;23473:15;23467:22;23445:44;;23512:2;23508:7;23498:17;;23578:2;23566:9;23561:3;23557:19;23553:28;23546:4;23535:9;23531:20;23524:58;23605:63;23664:3;23648:14;23605:63;:::i;:::-;23591:77;;;;23717:4;23709:6;23705:17;23699:24;23789:2;23777:9;23769:6;23765:22;23761:31;23754:4;23743:9;23739:20;23732:61;23810:68;23871:6;23855:14;23810:68;:::i;:::-;23802:76;22546:1338;-1:-1:-1;;;;;;22546:1338:376:o;24196:297::-;24314:12;;24361:4;24350:16;;;24344:23;;24314:12;24379:16;;24376:111;;;24473:1;24469:6;24459;24453:4;24449:17;24446:1;24442:25;24438:38;24431:5;24427:50;24418:59;;24376:111;;24196:297;;;:::o;24498:834::-;24753:6;24742:9;24735:25;24716:4;24779:2;24817;24812;24801:9;24797:18;24790:30;24843:45;24884:2;24873:9;24869:18;24861:6;24843:45;:::i;:::-;24924:22;;;24919:2;24904:18;;24897:50;24996:13;;25018:22;;;25068:2;25094:15;;;;25056;;25127:1;25137:169;25151:6;25148:1;25145:13;25137:169;;;25212:13;;25200:26;;25281:15;;;;25246:12;;;;25173:1;25166:9;25137:169;;;-1:-1:-1;25323:3:376;;24498:834;-1:-1:-1;;;;;;;;24498:834:376:o;25794:1849::-;26152:4;26198:1;26194;26189:3;26185:11;26181:19;26239:2;26231:6;26227:15;26216:9;26209:34;26307:10;26302:3;26298:20;26289:6;26283:13;26279:40;26274:2;26263:9;26259:18;26252:68;26384:2;26378;26370:6;26366:15;26360:22;26356:31;26351:2;26340:9;26336:18;26329:59;26443:2;26434:6;26428:13;26424:22;26419:2;26408:9;26404:18;26397:50;;26502:2;26494:6;26490:15;26484:22;26478:3;26467:9;26463:19;26456:51;26544:3;26538;26527:9;26523:19;26516:32;26583:6;26577:13;26609:6;26652:2;26646:3;26635:9;26631:19;26624:31;26678:52;26725:3;26714:9;26710:19;26696:12;26678:52;:::i;:::-;26664:66;;26779:2;26771:6;26767:15;26761:22;26852:3;26848:8;26836:9;26828:6;26824:22;26820:37;26814:3;26803:9;26799:19;26792:66;26881:41;26915:6;26899:14;26881:41;:::i;:::-;26867:55;;;26959:2;26951:6;26947:15;26941:22;26982:3;27021:2;27016;27005:9;27001:18;26994:30;27078:2;27070:6;27066:15;27060:22;27055:2;27044:9;27040:18;27033:50;27132:3;27124:6;27120:16;27114:23;27092:45;;27146:54;27195:3;27184:9;27180:19;27164:14;-1:-1:-1;;;;;25752:30:376;25740:43;;25687:102;27146:54;27249:3;27237:16;;27231:23;-1:-1:-1;;;;;727:31:376;;;27313:3;27298:19;;715:44;27367:3;27355:16;;27349:23;727:31;;27431:3;27416:19;;715:44;27491:3;27479:16;;27473:23;27467:3;27452:19;;27445:52;27534:15;;;27528:22;727:31;;;27609:3;27594:19;;715:44;27528:22;-1:-1:-1;27559:55:376;;-1:-1:-1;661:104:376","linkReferences":{}},"methodIdentifiers":{"__Architect_init(address,address,address)":"dc1b9f23","createSpace((string,string,((string,string,uint256,uint256,uint64,address,address,uint256,address),(bool,address[],((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])),string[]),(string)))":"7d8c4522","getSpaceArchitectImplementations()":"545efb2d","getSpaceByTokenId(uint256)":"673f0dd5","getTokenIdBySpace(address)":"c0bc6796","setSpaceArchitectImplementations(address,address,address)":"8bfc94b9"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"Architect__InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Architect__InvalidNetworkId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Architect__InvalidStringLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Architect__NotContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Factory__FailedDeployment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__Paused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuard__ReentrantCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Validator__InvalidAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"space\",\"type\":\"address\"}],\"name\":\"SpaceCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"contract ISpaceOwner\",\"name\":\"ownerImplementation\",\"type\":\"address\"},{\"internalType\":\"contract IUserEntitlement\",\"name\":\"userEntitlementImplementation\",\"type\":\"address\"},{\"internalType\":\"contract IRuleEntitlement\",\"name\":\"ruleEntitlementImplementation\",\"type\":\"address\"}],\"name\":\"__Architect_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"},{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"duration\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"currency\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeRecipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"freeAllocation\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"pricingModule\",\"type\":\"address\"}],\"internalType\":\"struct IMembershipBase.Membership\",\"name\":\"settings\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"everyone\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"users\",\"type\":\"address[]\"},{\"components\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CombinedOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.Operation[]\",\"name\":\"operations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CheckOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"internalType\":\"struct IRuleEntitlement.CheckOperation[]\",\"name\":\"checkOperations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.LogicalOperationType\",\"name\":\"logOpType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"leftOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"rightOperationIndex\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.LogicalOperation[]\",\"name\":\"logicalOperations\",\"type\":\"tuple[]\"}],\"internalType\":\"struct IRuleEntitlement.RuleData\",\"name\":\"ruleData\",\"type\":\"tuple\"}],\"internalType\":\"struct IArchitectBase.MembershipRequirements\",\"name\":\"requirements\",\"type\":\"tuple\"},{\"internalType\":\"string[]\",\"name\":\"permissions\",\"type\":\"string[]\"}],\"internalType\":\"struct IArchitectBase.Membership\",\"name\":\"membership\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"internalType\":\"struct IArchitectBase.ChannelInfo\",\"name\":\"channel\",\"type\":\"tuple\"}],\"internalType\":\"struct IArchitectBase.SpaceInfo\",\"name\":\"spaceInfo\",\"type\":\"tuple\"}],\"name\":\"createSpace\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSpaceArchitectImplementations\",\"outputs\":[{\"internalType\":\"contract ISpaceOwner\",\"name\":\"spaceToken\",\"type\":\"address\"},{\"internalType\":\"contract IUserEntitlement\",\"name\":\"userEntitlementImplementation\",\"type\":\"address\"},{\"internalType\":\"contract IRuleEntitlement\",\"name\":\"ruleEntitlementImplementation\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getSpaceByTokenId\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"space\",\"type\":\"address\"}],\"name\":\"getTokenIdBySpace\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ISpaceOwner\",\"name\":\"spaceToken\",\"type\":\"address\"},{\"internalType\":\"contract IUserEntitlement\",\"name\":\"userEntitlementImplementation\",\"type\":\"address\"},{\"internalType\":\"contract IRuleEntitlement\",\"name\":\"ruleEntitlementImplementation\",\"type\":\"address\"}],\"name\":\"setSpaceArchitectImplementations\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/factory/facets/architect/Architect.sol\":\"Architect\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/base/registry/facets/checker/IEntitlementChecker.sol\":{\"keccak256\":\"0x5c9a99c94e95a0c89b3d3310e252cd98aeafe34d87ffc0058f9b001af6f28bd1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7983b17a371e76c8681756dc10abe26f8fffd35d3d6d8773c2023f06c8600ba3\",\"dweb:/ipfs/QmSDkTctKCTaMGYF2LZ1N9YWwDTZD75XegpPyLrP694JFf\"]},\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/OwnableBase.sol\":{\"keccak256\":\"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4\",\"dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa\"]},\"contracts/src/diamond/facets/ownable/OwnableStorage.sol\":{\"keccak256\":\"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105\",\"dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ\"]},\"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol\":{\"keccak256\":\"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f\",\"dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol\":{\"keccak256\":\"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5\",\"dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol\":{\"keccak256\":\"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc\",\"dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf\"]},\"contracts/src/diamond/facets/pausable/IPausable.sol\":{\"keccak256\":\"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6\",\"dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM\"]},\"contracts/src/diamond/facets/pausable/PausableBase.sol\":{\"keccak256\":\"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c\",\"dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1\"]},\"contracts/src/diamond/facets/pausable/PausableStorage.sol\":{\"keccak256\":\"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b\",\"dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL\"]},\"contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol\":{\"keccak256\":\"0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b\",\"dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq\"]},\"contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol\":{\"keccak256\":\"0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c\",\"dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T\"]},\"contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol\":{\"keccak256\":\"0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6\",\"dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC\"]},\"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol\":{\"keccak256\":\"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f\",\"dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol\":{\"keccak256\":\"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa\",\"dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol\":{\"keccak256\":\"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c\",\"dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu\"]},\"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol\":{\"keccak256\":\"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e\",\"dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM\"]},\"contracts/src/diamond/proxy/IProxy.sol\":{\"keccak256\":\"0xb3cc38cae21021aec88e128eaec4994e926e4961d166c7e6e3a40a41c69aa105\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6da721f34f1359068ebe71ce01472403940b4e8fe87c38ff5be2d77e673520e5\",\"dweb:/ipfs/QmfNgDv5eQsLzc9bKi1EGWdxDX84Vhr2SARa7zm4pcCdpy\"]},\"contracts/src/diamond/proxy/Proxy.sol\":{\"keccak256\":\"0xae6d6933073274683d2684fc806cffbdc157d56b181d7ea0c962c3cd7746b78d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://43378c060da21e547d10282839ff3dc690615c8993949f6a072f9ed4693ba548\",\"dweb:/ipfs/QmaT7GdtDpNBRJPLRnGEoGmZJSFNPkqHUzPde5LSYXc1q1\"]},\"contracts/src/diamond/proxy/managed/IManagedProxy.sol\":{\"keccak256\":\"0x50761de44dd190dd8e5b01080c073c1190fa393406c12621ecb51f7bf6131929\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://afccbdf66bb1bda60a91c481f0770b4409841efd2e7198693b025e2ed06f66d5\",\"dweb:/ipfs/QmTvoHQAv5LvyT5UVqrsgSaS7QpywxAVZMxNRevuSeLo7p\"]},\"contracts/src/diamond/proxy/managed/ManagedProxyBase.sol\":{\"keccak256\":\"0x709b83c1c463f07fea33d7b315087e35087be1ebce59a9659bad36cb25b68f2a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a258b4cb33c4595b31216316b3b0a37364dabbc1bcd076de8efb1433850d38bf\",\"dweb:/ipfs/QmR54ko5NH1p1WdfUSVaRhJtTtnGcBPndS7xTJ1MbQ398v\"]},\"contracts/src/diamond/proxy/managed/ManagedProxyStorage.sol\":{\"keccak256\":\"0x3b9124d97b9f84a56a37c8e1cafb741756b11e76c7b98fab034c009fa990a761\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2958827286beb633f06ac9f2eeebec7fdbf612da520cca93646f1f02e24048fa\",\"dweb:/ipfs/QmaUHopT1SWHsZQEy7J5CH2ZmpwY7xh4ujfNW8mPUYAuFY\"]},\"contracts/src/diamond/proxy/manager/IProxyManager.sol\":{\"keccak256\":\"0xde8f6048e58e36541aebff781fb013334e8ea2fa824d9790e629d3733944929a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c79d9ac525a370f6f56b229506cf2d2ffeacafbeb02d417ed34c86c75fe01650\",\"dweb:/ipfs/QmT9CReyEvK2UkcwnzwierQdWw2T7NVZPtVDLcwhyNBhSC\"]},\"contracts/src/diamond/utils/multicall/IMulticall.sol\":{\"keccak256\":\"0x0f1a1884b290dc829323fa6d01e0dedc785ff582e9dbffd52e44e6f2fc7beff6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1ce824d7f2b31f53a807bf6d6d7e9d0eaaf2d81b75fa316cda616e29cb4669a9\",\"dweb:/ipfs/QmWyiRtGKtX6Kfng8Az2ujKDZdqjnfwxMuD1rQEZz6aki5\"]},\"contracts/src/diamond/utils/multicall/Multicall.sol\":{\"keccak256\":\"0x52c952ab050b3eb1dbb3c9cbaad900eaf83ba2ce42a47f204f9aa9e460126701\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://442e5db41748e2a5b7c028b55ad6a680960c1819c3b576a162edea85f623aa44\",\"dweb:/ipfs/Qmb3mNdPBLFh6wgj8ih2EXs8rTcTniKpxk8eZHiY1ahaud\"]},\"contracts/src/factory/facets/architect/Architect.sol\":{\"keccak256\":\"0xcaed43dc30dbfe658129da749a082195539cf8c5d6c221b198e324c613ee49b7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6f703d4315ab0c9217fc8a3b387be8ef812fafac75111fe48fbc8d005778f119\",\"dweb:/ipfs/QmdGLpqs5oLnVN4en8Z8exNdjh3NTaMUV4S7YrjzukgSmD\"]},\"contracts/src/factory/facets/architect/ArchitectBase.sol\":{\"keccak256\":\"0x6513727490f0258589a8c0060041c099392f286e86fe26d632006992fc24b408\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://24f5c44f47d880b23d25b4ae76e6b6488d284123f3a8f530bd674d42c774542f\",\"dweb:/ipfs/QmaCnjKQMUGiQ1UwCwCuBWsxYVx4UuJe3i3gc8qtLKCcfR\"]},\"contracts/src/factory/facets/architect/ArchitectStorage.sol\":{\"keccak256\":\"0x6a11f25a21155e73624631305407602e8ac0e1f11c53936ffaab820263f51d1e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3c88b9f38fba7ca69b355fdce609e898857c2bfc69ca62365138bbda9aa6b74b\",\"dweb:/ipfs/QmVfoXqJ1WDnxtRzKiynzkduXbizL4H9WVVDFDVNH7aNxq\"]},\"contracts/src/factory/facets/architect/IArchitect.sol\":{\"keccak256\":\"0x08eec3f16ce7bf98d68cefb0bd103329616dc260d9c34e5a8e0de68bcd8fb2fe\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c6e9607219790d046c451e58e84f2794d0f461521de05569aa5e74c5a61a79b8\",\"dweb:/ipfs/QmamxpUEceWUMKc8i2d2q7fnLdDM1611yPMX6QiQpbJDzz\"]},\"contracts/src/factory/facets/architect/ImplementationStorage.sol\":{\"keccak256\":\"0x7115f015df0678057d03a9bb6614c0c960c9c2334cec9919da3b1c73c65268e1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dcafc368c1a3f230851f981861bac731e9bdb2e48b78d7679978b3d2a4eaab85\",\"dweb:/ipfs/QmTJ72YsxYZHdGqkF4G6KsmH2GVGVad295xvbvdZ2Yq7s9\"]},\"contracts/src/factory/facets/architect/pricing/IPricingModules.sol\":{\"keccak256\":\"0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716\",\"dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU\"]},\"contracts/src/factory/facets/platform/requirements/IPlatformRequirements.sol\":{\"keccak256\":\"0xc0b22b0caa2336e0c3f6b6813432643053785c39531d30e5851eeb613a0a7991\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8a7ceb199e92f484efcc444fffd54fbabaf332c210dda0ef46d89a66f4cb47c7\",\"dweb:/ipfs/QmRJVrZiZpbGsLngz4J3NVgapKXLErdLc7BPyEyTNKdijg\"]},\"contracts/src/factory/facets/prepay/IPrepay.sol\":{\"keccak256\":\"0x0c5c097dd77471d041cdbb84011ac789147af937d275329d857d1a4b257635e9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://baca271a5a66856f3144a4bf0ed6a484b0c981539d6bf0c57ffade9e4986eb49\",\"dweb:/ipfs/QmVgPWMEL5q2J5kmZQZFRadWjuVQeFLaa9K2gCHdhjLUa9\"]},\"contracts/src/factory/facets/registry/IImplementationRegistry.sol\":{\"keccak256\":\"0x2409b9eb86a4dc5849050d06409fd7548ac21f9bf6e7419b91dfb9226db0a3d5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://613195fc78a1a496820c5934f315c586ad33edf7608022d2ae0ea44f52529e61\",\"dweb:/ipfs/QmR8Gn11UNq2rKC5Qp7Prdk61oWhNg3UVc8KeyWCRfrEqV\"]},\"contracts/src/factory/facets/wallet-link/IWalletLink.sol\":{\"keccak256\":\"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13\",\"dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR\"]},\"contracts/src/spaces/entitlements/IEntitlement.sol\":{\"keccak256\":\"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3\",\"dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf\"]},\"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol\":{\"keccak256\":\"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1\",\"dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97\"]},\"contracts/src/spaces/entitlements/user/IUserEntitlement.sol\":{\"keccak256\":\"0x96fef5ebaa7e9e79c77c887d9053ae06dc91cf1301f33db652e6ac811b3b5cc5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6cff649b95f65c9e3ecfa7dfa3b1c7b524ec7244eb5223c55674a4679eb8e7bf\",\"dweb:/ipfs/QmQy5sXRywRWB3aM58TCp5Xw5b258Y5PfDM8RasDznAPzA\"]},\"contracts/src/spaces/facets/Permissions.sol\":{\"keccak256\":\"0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721\",\"dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp\"]},\"contracts/src/spaces/facets/channels/IChannel.sol\":{\"keccak256\":\"0x4a62ec6410779121880a21ae1a42bab2480f672c683f79c7f2e11bf2bfe1bd6e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://61b4142a55418d8e15e4db77bf6614a830489dc6aa191afe3dadc9ef16534b2c\",\"dweb:/ipfs/Qmbuc8VBmoFrbWZGinbCQaCrBRw3DznYhZNLzqk2FXABUx\"]},\"contracts/src/spaces/facets/entitlements/IEntitlementsManager.sol\":{\"keccak256\":\"0x1c3cff6f7a35610df492abc39a62ba704e408d43477ba2e34833197c2956e9d3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c5d5f08c5bc196e6166678b39d415da12c285d9bee3584d5e200bbf0c5ea911d\",\"dweb:/ipfs/QmdYkU6kzHFw7KFYAdvxiwHK7hWCrz3E3pwiCjWZ97PVGx\"]},\"contracts/src/spaces/facets/gated/EntitlementGatedBase.sol\":{\"keccak256\":\"0x0aa9887cf58dd68d0270c85e2d7610080f35410b845c2227e4bd84356b7a2cb7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6dbdbed895fc2a53bffa3dbc1cfd4c992a096f153e6bbb7aeb9894485e7fc1a6\",\"dweb:/ipfs/QmZp76Gd8aL9pWbiTvLaiHv1w12yjN59PtYdMvoUCbfbH5\"]},\"contracts/src/spaces/facets/gated/EntitlementGatedStorage.sol\":{\"keccak256\":\"0xe997c0dd62f6ceb300729d3f56a3f25a47b40ed5946d68c5210c38941cb37eaa\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://63fcfd9f667538e8e9339534d2ddc6f7899e4179a54f3c6595e2598babb5bb9c\",\"dweb:/ipfs/QmUfKtfgW1uskEWkhhGqTjcbCqMANQoKKfTgV2ZvdAZpvJ\"]},\"contracts/src/spaces/facets/gated/IEntitlementGated.sol\":{\"keccak256\":\"0x948de1018f7f78366263a40e0f8269e10941216bd03a9996edb24a6230959e74\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://dc985539ce639f39fd68723acca6424a78deac6cec3693c9d8e1084a487c83ec\",\"dweb:/ipfs/QmQujX5rmDwhJZurp11FTiPLb7ev9swLTtdkagA8wydZiT\"]},\"contracts/src/spaces/facets/membership/IMembership.sol\":{\"keccak256\":\"0x233066dd470121818082ba6a4c868f90feafc3be29942aae2c7a5c25543b7485\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://30d976a1882102493e7cee87b75ab04c662626d71aca51c9334ed2f60402bb59\",\"dweb:/ipfs/QmerPfizrjueQSgG8SkSoi44fkyaqrN2ZCFTnaxnM3UqF7\"]},\"contracts/src/spaces/facets/membership/MembershipBase.sol\":{\"keccak256\":\"0x82b3314afcd1fe84a5261c38627c2537c09271372504af10549558c0fd608791\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dadc28ee124081ea64228b8a12e0fcc93c7256535597ea9e29d58140bb599fc5\",\"dweb:/ipfs/QmYNZjhBJnPf9kMt2J6pL2d746AB3EHrXVAj5Ce3ibZpBh\"]},\"contracts/src/spaces/facets/membership/MembershipStorage.sol\":{\"keccak256\":\"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee\",\"dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5\"]},\"contracts/src/spaces/facets/membership/pricing/IMembershipPricing.sol\":{\"keccak256\":\"0xb68faf2b90536ea53110ebb1d4456f2e9a261b5fac4515df47076da73e0cbd77\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://063fca54f8210be704b5d9f54efac08017266fafc9d287a6ece7866b25174448\",\"dweb:/ipfs/QmbXUgKgh36CmNRA5NrtRrVcgfrKYEzZprAcjTVWhHmXBF\"]},\"contracts/src/spaces/facets/membership/referral/IMembershipReferral.sol\":{\"keccak256\":\"0xeb2feee4b1f3e83509bc1425c0ecd60eaf168fa7686c14dc2bd636e5a691bc6a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ec9bcb8c4106639ec9e0d37fa59385c1e853fb07f9ebedcd9f2bc1198979a807\",\"dweb:/ipfs/QmcAdwQKn2jMo7grzXNGSPr9PvQBxdKURF6xxLPorCDrFt\"]},\"contracts/src/spaces/facets/membership/referral/MembershipReferralBase.sol\":{\"keccak256\":\"0x6f29e73b113fce75e54a41f248621b1adaa5ac4a3b189ef0903308bfa69165ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://abc7b25a74097434912f4940bfcd6cf9e312b0989279cb31a9a74d7ae6c09636\",\"dweb:/ipfs/QmPdttVeMBDBb8SMrga6YnKz3aiGDKMqo2MofCXtag4w4E\"]},\"contracts/src/spaces/facets/membership/referral/MembershipReferralStorage.sol\":{\"keccak256\":\"0x607aabf7ae45b7f112165c1028e0fa2d18b86c6db78f4df4bdf39dd0f20973ea\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4d61919ebf0ba0d3706cf2c3755b9d9920312c82bb1b83d0023f1cb09c2fc31d\",\"dweb:/ipfs/QmSQ1G7rRMf6tAuzdU6M5ydKetaSZXdN3UV33wNjvDrqAL\"]},\"contracts/src/spaces/facets/owner/ISpaceOwner.sol\":{\"keccak256\":\"0xf68eb1b3aceeacc0c4162304f74d89890e8c641a9c0778c1786db850a79cfb3f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8a345161f4d34be281c5f4d165dac958ed3a5e7d2888924d498555871906e6ea\",\"dweb:/ipfs/QmQcWfQ6k54UPr9eMA2KnXCJAc4NR24LhzbmyA5NUKBVN3\"]},\"contracts/src/spaces/facets/proxy/SpaceProxy.sol\":{\"keccak256\":\"0x31a5bc85ec005c60e58c94948b159806b14c7cd0466cc8d3ef32844e4564412d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4935d5100b48c5f7ad3adc068ea70701ad5e22963c4698aa6e42a61d54227984\",\"dweb:/ipfs/QmXopMyXerTvJFV1xwLnVv2GdhBCwDAE2oNtWywVPbxKRf\"]},\"contracts/src/spaces/facets/roles/IRoles.sol\":{\"keccak256\":\"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8\",\"dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N\"]},\"contracts/src/utils/Factory.sol\":{\"keccak256\":\"0xc5c6a4043577ffe33f61680b5bb12eb7267c68851339890831f37a85c823e7b4\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://81eec744d4993f4184010b16490a546d84a0ed1d4f3f9f84553cb374268ef8b3\",\"dweb:/ipfs/QmNX3gotr3ycE2XnVS48iatZh97uoeuVvoRRGiQh68Jij3\"]},\"contracts/src/utils/StringSet.sol\":{\"keccak256\":\"0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6\",\"dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK\"]},\"contracts/src/utils/Validator.sol\":{\"keccak256\":\"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64\",\"dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72\"]},\"contracts/src/utils/interfaces/IWETH.sol\":{\"keccak256\":\"0xd274612ab96215dcdb6e3717a63e7a0f76c7facadff93b2b23ed278f6e7b3b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://12444da1f06a0fbe6d2d564d73d6d6bc58c09496af3aeea6988c3d3f9ee81c73\",\"dweb:/ipfs/QmTkpQ6cZmRYgvLUS4mqzLvFg5nabgQjpMnVK8JENboiA3\"]},\"contracts/src/utils/libraries/BasisPoints.sol\":{\"keccak256\":\"0x797b0a1d3da51f4256c83b5d5c885b034df5bdff69c8dfa0fac9777cfa2f1d26\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://52ba0c85e5de8a7d76e2e4bcbccdaffa68e29281191ae1f889430a496ce5cf1c\",\"dweb:/ipfs/Qmd5bYypjF6gcJKKagdRpvAgV4LCs4iyn7KYdaLBWjjuHr\"]},\"contracts/src/utils/libraries/CurrencyTransfer.sol\":{\"keccak256\":\"0x1c6b5b33831f8c5c02c49dff5ceac3ad1a6cdb74c988ebba72c36329ca704750\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://78122f27b67a5d3ebe95c4260dc972ab7be5c04b277cbd71a833dd74fbd23fa4\",\"dweb:/ipfs/QmU78EApEim92KMVtW69coFPZdhvbkhmYn6dW2zwqJKPBp\"]},\"lib/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\":{\"keccak256\":\"0xbfb6695731de677140fbf76c772ab08c4233a122fb51ac28ac120fc49bbbc4ec\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://68f8fded7cc318efa15874b7c6a983fe17a4a955d72d240353a9a4ca1e1b824c\",\"dweb:/ipfs/QmdcmBL9Qo4Tk3Dby4wFYabGyot9JNeLPxpSXZUgUm92BV\"]},\"lib/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\":{\"keccak256\":\"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a\",\"dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE\"]},\"lib/@openzeppelin/contracts/proxy/Proxy.sol\":{\"keccak256\":\"0xc3f2ec76a3de8ed7a7007c46166f5550c72c7709e3fc7e8bb3111a7191cdedbd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e73efb4c2ca655882dc237c6b4f234a9bd36d97159d8fcaa837eb01171f726ac\",\"dweb:/ipfs/QmTNnnv7Gu5fs5G1ZMh7Fexp8N4XUs3XrNAngjcxgiss3e\"]},\"lib/@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa\",\"dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM\"]},\"lib/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c\",\"dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq\"]},\"lib/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d\",\"dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi\"]},\"lib/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0\",\"dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3\"]},\"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c\",\"dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"Architect__InvalidAddress"},{"inputs":[],"type":"error","name":"Architect__InvalidNetworkId"},{"inputs":[],"type":"error","name":"Architect__InvalidStringLength"},{"inputs":[],"type":"error","name":"Architect__NotContract"},{"inputs":[],"type":"error","name":"Factory__FailedDeployment"},{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[],"type":"error","name":"Pausable__NotPaused"},{"inputs":[],"type":"error","name":"Pausable__Paused"},{"inputs":[],"type":"error","name":"ReentrancyGuard__ReentrantCall"},{"inputs":[],"type":"error","name":"Validator__InvalidAddress"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true},{"internalType":"address","name":"space","type":"address","indexed":true}],"type":"event","name":"SpaceCreated","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[{"internalType":"contract ISpaceOwner","name":"ownerImplementation","type":"address"},{"internalType":"contract IUserEntitlement","name":"userEntitlementImplementation","type":"address"},{"internalType":"contract IRuleEntitlement","name":"ruleEntitlementImplementation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"__Architect_init"},{"inputs":[{"internalType":"struct IArchitectBase.SpaceInfo","name":"spaceInfo","type":"tuple","components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"struct IArchitectBase.Membership","name":"membership","type":"tuple","components":[{"internalType":"struct IMembershipBase.Membership","name":"settings","type":"tuple","components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint64","name":"duration","type":"uint64"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"address","name":"feeRecipient","type":"address"},{"internalType":"uint256","name":"freeAllocation","type":"uint256"},{"internalType":"address","name":"pricingModule","type":"address"}]},{"internalType":"struct IArchitectBase.MembershipRequirements","name":"requirements","type":"tuple","components":[{"internalType":"bool","name":"everyone","type":"bool"},{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"struct IRuleEntitlement.RuleData","name":"ruleData","type":"tuple","components":[{"internalType":"struct IRuleEntitlement.Operation[]","name":"operations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CombinedOperationType","name":"opType","type":"uint8"},{"internalType":"uint8","name":"index","type":"uint8"}]},{"internalType":"struct IRuleEntitlement.CheckOperation[]","name":"checkOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CheckOperationType","name":"opType","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"threshold","type":"uint256"}]},{"internalType":"struct IRuleEntitlement.LogicalOperation[]","name":"logicalOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.LogicalOperationType","name":"logOpType","type":"uint8"},{"internalType":"uint8","name":"leftOperationIndex","type":"uint8"},{"internalType":"uint8","name":"rightOperationIndex","type":"uint8"}]}]}]},{"internalType":"string[]","name":"permissions","type":"string[]"}]},{"internalType":"struct IArchitectBase.ChannelInfo","name":"channel","type":"tuple","components":[{"internalType":"string","name":"metadata","type":"string"}]}]}],"stateMutability":"nonpayable","type":"function","name":"createSpace","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getSpaceArchitectImplementations","outputs":[{"internalType":"contract ISpaceOwner","name":"spaceToken","type":"address"},{"internalType":"contract IUserEntitlement","name":"userEntitlementImplementation","type":"address"},{"internalType":"contract IRuleEntitlement","name":"ruleEntitlementImplementation","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getSpaceByTokenId","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"space","type":"address"}],"stateMutability":"view","type":"function","name":"getTokenIdBySpace","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"contract ISpaceOwner","name":"spaceToken","type":"address"},{"internalType":"contract IUserEntitlement","name":"userEntitlementImplementation","type":"address"},{"internalType":"contract IRuleEntitlement","name":"ruleEntitlementImplementation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setSpaceArchitectImplementations"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/factory/facets/architect/Architect.sol":"Architect"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/base/registry/facets/checker/IEntitlementChecker.sol":{"keccak256":"0x5c9a99c94e95a0c89b3d3310e252cd98aeafe34d87ffc0058f9b001af6f28bd1","urls":["bzz-raw://7983b17a371e76c8681756dc10abe26f8fffd35d3d6d8773c2023f06c8600ba3","dweb:/ipfs/QmSDkTctKCTaMGYF2LZ1N9YWwDTZD75XegpPyLrP694JFf"],"license":"MIT"},"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableBase.sol":{"keccak256":"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762","urls":["bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4","dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableStorage.sol":{"keccak256":"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64","urls":["bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105","dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol":{"keccak256":"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d","urls":["bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f","dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol":{"keccak256":"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a","urls":["bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5","dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol":{"keccak256":"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0","urls":["bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc","dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/IPausable.sol":{"keccak256":"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261","urls":["bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6","dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableBase.sol":{"keccak256":"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438","urls":["bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c","dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableStorage.sol":{"keccak256":"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07","urls":["bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b","dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol":{"keccak256":"0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a","urls":["bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b","dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol":{"keccak256":"0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f","urls":["bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c","dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol":{"keccak256":"0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c","urls":["bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6","dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol":{"keccak256":"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218","urls":["bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f","dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol":{"keccak256":"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334","urls":["bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa","dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol":{"keccak256":"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1","urls":["bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c","dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9","urls":["bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e","dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/IProxy.sol":{"keccak256":"0xb3cc38cae21021aec88e128eaec4994e926e4961d166c7e6e3a40a41c69aa105","urls":["bzz-raw://6da721f34f1359068ebe71ce01472403940b4e8fe87c38ff5be2d77e673520e5","dweb:/ipfs/QmfNgDv5eQsLzc9bKi1EGWdxDX84Vhr2SARa7zm4pcCdpy"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/Proxy.sol":{"keccak256":"0xae6d6933073274683d2684fc806cffbdc157d56b181d7ea0c962c3cd7746b78d","urls":["bzz-raw://43378c060da21e547d10282839ff3dc690615c8993949f6a072f9ed4693ba548","dweb:/ipfs/QmaT7GdtDpNBRJPLRnGEoGmZJSFNPkqHUzPde5LSYXc1q1"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/managed/IManagedProxy.sol":{"keccak256":"0x50761de44dd190dd8e5b01080c073c1190fa393406c12621ecb51f7bf6131929","urls":["bzz-raw://afccbdf66bb1bda60a91c481f0770b4409841efd2e7198693b025e2ed06f66d5","dweb:/ipfs/QmTvoHQAv5LvyT5UVqrsgSaS7QpywxAVZMxNRevuSeLo7p"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/managed/ManagedProxyBase.sol":{"keccak256":"0x709b83c1c463f07fea33d7b315087e35087be1ebce59a9659bad36cb25b68f2a","urls":["bzz-raw://a258b4cb33c4595b31216316b3b0a37364dabbc1bcd076de8efb1433850d38bf","dweb:/ipfs/QmR54ko5NH1p1WdfUSVaRhJtTtnGcBPndS7xTJ1MbQ398v"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/managed/ManagedProxyStorage.sol":{"keccak256":"0x3b9124d97b9f84a56a37c8e1cafb741756b11e76c7b98fab034c009fa990a761","urls":["bzz-raw://2958827286beb633f06ac9f2eeebec7fdbf612da520cca93646f1f02e24048fa","dweb:/ipfs/QmaUHopT1SWHsZQEy7J5CH2ZmpwY7xh4ujfNW8mPUYAuFY"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/manager/IProxyManager.sol":{"keccak256":"0xde8f6048e58e36541aebff781fb013334e8ea2fa824d9790e629d3733944929a","urls":["bzz-raw://c79d9ac525a370f6f56b229506cf2d2ffeacafbeb02d417ed34c86c75fe01650","dweb:/ipfs/QmT9CReyEvK2UkcwnzwierQdWw2T7NVZPtVDLcwhyNBhSC"],"license":"Apache-2.0"},"contracts/src/diamond/utils/multicall/IMulticall.sol":{"keccak256":"0x0f1a1884b290dc829323fa6d01e0dedc785ff582e9dbffd52e44e6f2fc7beff6","urls":["bzz-raw://1ce824d7f2b31f53a807bf6d6d7e9d0eaaf2d81b75fa316cda616e29cb4669a9","dweb:/ipfs/QmWyiRtGKtX6Kfng8Az2ujKDZdqjnfwxMuD1rQEZz6aki5"],"license":"Apache-2.0"},"contracts/src/diamond/utils/multicall/Multicall.sol":{"keccak256":"0x52c952ab050b3eb1dbb3c9cbaad900eaf83ba2ce42a47f204f9aa9e460126701","urls":["bzz-raw://442e5db41748e2a5b7c028b55ad6a680960c1819c3b576a162edea85f623aa44","dweb:/ipfs/Qmb3mNdPBLFh6wgj8ih2EXs8rTcTniKpxk8eZHiY1ahaud"],"license":"Apache-2.0"},"contracts/src/factory/facets/architect/Architect.sol":{"keccak256":"0xcaed43dc30dbfe658129da749a082195539cf8c5d6c221b198e324c613ee49b7","urls":["bzz-raw://6f703d4315ab0c9217fc8a3b387be8ef812fafac75111fe48fbc8d005778f119","dweb:/ipfs/QmdGLpqs5oLnVN4en8Z8exNdjh3NTaMUV4S7YrjzukgSmD"],"license":"Apache-2.0"},"contracts/src/factory/facets/architect/ArchitectBase.sol":{"keccak256":"0x6513727490f0258589a8c0060041c099392f286e86fe26d632006992fc24b408","urls":["bzz-raw://24f5c44f47d880b23d25b4ae76e6b6488d284123f3a8f530bd674d42c774542f","dweb:/ipfs/QmaCnjKQMUGiQ1UwCwCuBWsxYVx4UuJe3i3gc8qtLKCcfR"],"license":"Apache-2.0"},"contracts/src/factory/facets/architect/ArchitectStorage.sol":{"keccak256":"0x6a11f25a21155e73624631305407602e8ac0e1f11c53936ffaab820263f51d1e","urls":["bzz-raw://3c88b9f38fba7ca69b355fdce609e898857c2bfc69ca62365138bbda9aa6b74b","dweb:/ipfs/QmVfoXqJ1WDnxtRzKiynzkduXbizL4H9WVVDFDVNH7aNxq"],"license":"Apache-2.0"},"contracts/src/factory/facets/architect/IArchitect.sol":{"keccak256":"0x08eec3f16ce7bf98d68cefb0bd103329616dc260d9c34e5a8e0de68bcd8fb2fe","urls":["bzz-raw://c6e9607219790d046c451e58e84f2794d0f461521de05569aa5e74c5a61a79b8","dweb:/ipfs/QmamxpUEceWUMKc8i2d2q7fnLdDM1611yPMX6QiQpbJDzz"],"license":"Apache-2.0"},"contracts/src/factory/facets/architect/ImplementationStorage.sol":{"keccak256":"0x7115f015df0678057d03a9bb6614c0c960c9c2334cec9919da3b1c73c65268e1","urls":["bzz-raw://dcafc368c1a3f230851f981861bac731e9bdb2e48b78d7679978b3d2a4eaab85","dweb:/ipfs/QmTJ72YsxYZHdGqkF4G6KsmH2GVGVad295xvbvdZ2Yq7s9"],"license":"Apache-2.0"},"contracts/src/factory/facets/architect/pricing/IPricingModules.sol":{"keccak256":"0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e","urls":["bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716","dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU"],"license":"Apache-2.0"},"contracts/src/factory/facets/platform/requirements/IPlatformRequirements.sol":{"keccak256":"0xc0b22b0caa2336e0c3f6b6813432643053785c39531d30e5851eeb613a0a7991","urls":["bzz-raw://8a7ceb199e92f484efcc444fffd54fbabaf332c210dda0ef46d89a66f4cb47c7","dweb:/ipfs/QmRJVrZiZpbGsLngz4J3NVgapKXLErdLc7BPyEyTNKdijg"],"license":"Apache-2.0"},"contracts/src/factory/facets/prepay/IPrepay.sol":{"keccak256":"0x0c5c097dd77471d041cdbb84011ac789147af937d275329d857d1a4b257635e9","urls":["bzz-raw://baca271a5a66856f3144a4bf0ed6a484b0c981539d6bf0c57ffade9e4986eb49","dweb:/ipfs/QmVgPWMEL5q2J5kmZQZFRadWjuVQeFLaa9K2gCHdhjLUa9"],"license":"Apache-2.0"},"contracts/src/factory/facets/registry/IImplementationRegistry.sol":{"keccak256":"0x2409b9eb86a4dc5849050d06409fd7548ac21f9bf6e7419b91dfb9226db0a3d5","urls":["bzz-raw://613195fc78a1a496820c5934f315c586ad33edf7608022d2ae0ea44f52529e61","dweb:/ipfs/QmR8Gn11UNq2rKC5Qp7Prdk61oWhNg3UVc8KeyWCRfrEqV"],"license":"Apache-2.0"},"contracts/src/factory/facets/wallet-link/IWalletLink.sol":{"keccak256":"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b","urls":["bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13","dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/IEntitlement.sol":{"keccak256":"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca","urls":["bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3","dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol":{"keccak256":"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf","urls":["bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1","dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97"],"license":"MIT"},"contracts/src/spaces/entitlements/user/IUserEntitlement.sol":{"keccak256":"0x96fef5ebaa7e9e79c77c887d9053ae06dc91cf1301f33db652e6ac811b3b5cc5","urls":["bzz-raw://6cff649b95f65c9e3ecfa7dfa3b1c7b524ec7244eb5223c55674a4679eb8e7bf","dweb:/ipfs/QmQy5sXRywRWB3aM58TCp5Xw5b258Y5PfDM8RasDznAPzA"],"license":"Apache-2.0"},"contracts/src/spaces/facets/Permissions.sol":{"keccak256":"0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5","urls":["bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721","dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/IChannel.sol":{"keccak256":"0x4a62ec6410779121880a21ae1a42bab2480f672c683f79c7f2e11bf2bfe1bd6e","urls":["bzz-raw://61b4142a55418d8e15e4db77bf6614a830489dc6aa191afe3dadc9ef16534b2c","dweb:/ipfs/Qmbuc8VBmoFrbWZGinbCQaCrBRw3DznYhZNLzqk2FXABUx"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/IEntitlementsManager.sol":{"keccak256":"0x1c3cff6f7a35610df492abc39a62ba704e408d43477ba2e34833197c2956e9d3","urls":["bzz-raw://c5d5f08c5bc196e6166678b39d415da12c285d9bee3584d5e200bbf0c5ea911d","dweb:/ipfs/QmdYkU6kzHFw7KFYAdvxiwHK7hWCrz3E3pwiCjWZ97PVGx"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/EntitlementGatedBase.sol":{"keccak256":"0x0aa9887cf58dd68d0270c85e2d7610080f35410b845c2227e4bd84356b7a2cb7","urls":["bzz-raw://6dbdbed895fc2a53bffa3dbc1cfd4c992a096f153e6bbb7aeb9894485e7fc1a6","dweb:/ipfs/QmZp76Gd8aL9pWbiTvLaiHv1w12yjN59PtYdMvoUCbfbH5"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/EntitlementGatedStorage.sol":{"keccak256":"0xe997c0dd62f6ceb300729d3f56a3f25a47b40ed5946d68c5210c38941cb37eaa","urls":["bzz-raw://63fcfd9f667538e8e9339534d2ddc6f7899e4179a54f3c6595e2598babb5bb9c","dweb:/ipfs/QmUfKtfgW1uskEWkhhGqTjcbCqMANQoKKfTgV2ZvdAZpvJ"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/IEntitlementGated.sol":{"keccak256":"0x948de1018f7f78366263a40e0f8269e10941216bd03a9996edb24a6230959e74","urls":["bzz-raw://dc985539ce639f39fd68723acca6424a78deac6cec3693c9d8e1084a487c83ec","dweb:/ipfs/QmQujX5rmDwhJZurp11FTiPLb7ev9swLTtdkagA8wydZiT"],"license":"MIT"},"contracts/src/spaces/facets/membership/IMembership.sol":{"keccak256":"0x233066dd470121818082ba6a4c868f90feafc3be29942aae2c7a5c25543b7485","urls":["bzz-raw://30d976a1882102493e7cee87b75ab04c662626d71aca51c9334ed2f60402bb59","dweb:/ipfs/QmerPfizrjueQSgG8SkSoi44fkyaqrN2ZCFTnaxnM3UqF7"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/MembershipBase.sol":{"keccak256":"0x82b3314afcd1fe84a5261c38627c2537c09271372504af10549558c0fd608791","urls":["bzz-raw://dadc28ee124081ea64228b8a12e0fcc93c7256535597ea9e29d58140bb599fc5","dweb:/ipfs/QmYNZjhBJnPf9kMt2J6pL2d746AB3EHrXVAj5Ce3ibZpBh"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/MembershipStorage.sol":{"keccak256":"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3","urls":["bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee","dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/pricing/IMembershipPricing.sol":{"keccak256":"0xb68faf2b90536ea53110ebb1d4456f2e9a261b5fac4515df47076da73e0cbd77","urls":["bzz-raw://063fca54f8210be704b5d9f54efac08017266fafc9d287a6ece7866b25174448","dweb:/ipfs/QmbXUgKgh36CmNRA5NrtRrVcgfrKYEzZprAcjTVWhHmXBF"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/referral/IMembershipReferral.sol":{"keccak256":"0xeb2feee4b1f3e83509bc1425c0ecd60eaf168fa7686c14dc2bd636e5a691bc6a","urls":["bzz-raw://ec9bcb8c4106639ec9e0d37fa59385c1e853fb07f9ebedcd9f2bc1198979a807","dweb:/ipfs/QmcAdwQKn2jMo7grzXNGSPr9PvQBxdKURF6xxLPorCDrFt"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/referral/MembershipReferralBase.sol":{"keccak256":"0x6f29e73b113fce75e54a41f248621b1adaa5ac4a3b189ef0903308bfa69165ca","urls":["bzz-raw://abc7b25a74097434912f4940bfcd6cf9e312b0989279cb31a9a74d7ae6c09636","dweb:/ipfs/QmPdttVeMBDBb8SMrga6YnKz3aiGDKMqo2MofCXtag4w4E"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/referral/MembershipReferralStorage.sol":{"keccak256":"0x607aabf7ae45b7f112165c1028e0fa2d18b86c6db78f4df4bdf39dd0f20973ea","urls":["bzz-raw://4d61919ebf0ba0d3706cf2c3755b9d9920312c82bb1b83d0023f1cb09c2fc31d","dweb:/ipfs/QmSQ1G7rRMf6tAuzdU6M5ydKetaSZXdN3UV33wNjvDrqAL"],"license":"Apache-2.0"},"contracts/src/spaces/facets/owner/ISpaceOwner.sol":{"keccak256":"0xf68eb1b3aceeacc0c4162304f74d89890e8c641a9c0778c1786db850a79cfb3f","urls":["bzz-raw://8a345161f4d34be281c5f4d165dac958ed3a5e7d2888924d498555871906e6ea","dweb:/ipfs/QmQcWfQ6k54UPr9eMA2KnXCJAc4NR24LhzbmyA5NUKBVN3"],"license":"Apache-2.0"},"contracts/src/spaces/facets/proxy/SpaceProxy.sol":{"keccak256":"0x31a5bc85ec005c60e58c94948b159806b14c7cd0466cc8d3ef32844e4564412d","urls":["bzz-raw://4935d5100b48c5f7ad3adc068ea70701ad5e22963c4698aa6e42a61d54227984","dweb:/ipfs/QmXopMyXerTvJFV1xwLnVv2GdhBCwDAE2oNtWywVPbxKRf"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/IRoles.sol":{"keccak256":"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d","urls":["bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8","dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N"],"license":"Apache-2.0"},"contracts/src/utils/Factory.sol":{"keccak256":"0xc5c6a4043577ffe33f61680b5bb12eb7267c68851339890831f37a85c823e7b4","urls":["bzz-raw://81eec744d4993f4184010b16490a546d84a0ed1d4f3f9f84553cb374268ef8b3","dweb:/ipfs/QmNX3gotr3ycE2XnVS48iatZh97uoeuVvoRRGiQh68Jij3"],"license":"Apache-2.0"},"contracts/src/utils/StringSet.sol":{"keccak256":"0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319","urls":["bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6","dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK"],"license":"Apache-2.0"},"contracts/src/utils/Validator.sol":{"keccak256":"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50","urls":["bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64","dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72"],"license":"Apache-2.0"},"contracts/src/utils/interfaces/IWETH.sol":{"keccak256":"0xd274612ab96215dcdb6e3717a63e7a0f76c7facadff93b2b23ed278f6e7b3b00","urls":["bzz-raw://12444da1f06a0fbe6d2d564d73d6d6bc58c09496af3aeea6988c3d3f9ee81c73","dweb:/ipfs/QmTkpQ6cZmRYgvLUS4mqzLvFg5nabgQjpMnVK8JENboiA3"],"license":"Apache-2.0"},"contracts/src/utils/libraries/BasisPoints.sol":{"keccak256":"0x797b0a1d3da51f4256c83b5d5c885b034df5bdff69c8dfa0fac9777cfa2f1d26","urls":["bzz-raw://52ba0c85e5de8a7d76e2e4bcbccdaffa68e29281191ae1f889430a496ce5cf1c","dweb:/ipfs/Qmd5bYypjF6gcJKKagdRpvAgV4LCs4iyn7KYdaLBWjjuHr"],"license":"Apache-2.0"},"contracts/src/utils/libraries/CurrencyTransfer.sol":{"keccak256":"0x1c6b5b33831f8c5c02c49dff5ceac3ad1a6cdb74c988ebba72c36329ca704750","urls":["bzz-raw://78122f27b67a5d3ebe95c4260dc972ab7be5c04b277cbd71a833dd74fbd23fa4","dweb:/ipfs/QmU78EApEim92KMVtW69coFPZdhvbkhmYn6dW2zwqJKPBp"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol":{"keccak256":"0xbfb6695731de677140fbf76c772ab08c4233a122fb51ac28ac120fc49bbbc4ec","urls":["bzz-raw://68f8fded7cc318efa15874b7c6a983fe17a4a955d72d240353a9a4ca1e1b824c","dweb:/ipfs/QmdcmBL9Qo4Tk3Dby4wFYabGyot9JNeLPxpSXZUgUm92BV"],"license":"MIT"},"lib/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"],"license":"MIT"},"lib/@openzeppelin/contracts/proxy/Proxy.sol":{"keccak256":"0xc3f2ec76a3de8ed7a7007c46166f5550c72c7709e3fc7e8bb3111a7191cdedbd","urls":["bzz-raw://e73efb4c2ca655882dc237c6b4f234a9bd36d97159d8fcaa837eb01171f726ac","dweb:/ipfs/QmTNnnv7Gu5fs5G1ZMh7Fexp8N4XUs3XrNAngjcxgiss3e"],"license":"MIT"},"lib/@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"keccak256":"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4","urls":["bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7","dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":127} \ No newline at end of file diff --git a/packages/generated/dev/abis/Architect.metadata.json b/packages/generated/dev/abis/Architect.metadata.json new file mode 100644 index 000000000..68810e457 --- /dev/null +++ b/packages/generated/dev/abis/Architect.metadata.json @@ -0,0 +1,1164 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "Architect__InvalidAddress" + }, + { + "inputs": [], + "type": "error", + "name": "Architect__InvalidNetworkId" + }, + { + "inputs": [], + "type": "error", + "name": "Architect__InvalidStringLength" + }, + { + "inputs": [], + "type": "error", + "name": "Architect__NotContract" + }, + { + "inputs": [], + "type": "error", + "name": "Factory__FailedDeployment" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__NotPaused" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__Paused" + }, + { + "inputs": [], + "type": "error", + "name": "ReentrancyGuard__ReentrantCall" + }, + { + "inputs": [], + "type": "error", + "name": "Validator__InvalidAddress" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Paused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "address", + "name": "space", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "SpaceCreated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Unpaused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "contract ISpaceOwner", + "name": "ownerImplementation", + "type": "address" + }, + { + "internalType": "contract IUserEntitlement", + "name": "userEntitlementImplementation", + "type": "address" + }, + { + "internalType": "contract IRuleEntitlement", + "name": "ruleEntitlementImplementation", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__Architect_init" + }, + { + "inputs": [ + { + "internalType": "struct IArchitectBase.SpaceInfo", + "name": "spaceInfo", + "type": "tuple", + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "uri", + "type": "string" + }, + { + "internalType": "struct IArchitectBase.Membership", + "name": "membership", + "type": "tuple", + "components": [ + { + "internalType": "struct IMembershipBase.Membership", + "name": "settings", + "type": "tuple", + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxSupply", + "type": "uint256" + }, + { + "internalType": "uint64", + "name": "duration", + "type": "uint64" + }, + { + "internalType": "address", + "name": "currency", + "type": "address" + }, + { + "internalType": "address", + "name": "feeRecipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "freeAllocation", + "type": "uint256" + }, + { + "internalType": "address", + "name": "pricingModule", + "type": "address" + } + ] + }, + { + "internalType": "struct IArchitectBase.MembershipRequirements", + "name": "requirements", + "type": "tuple", + "components": [ + { + "internalType": "bool", + "name": "everyone", + "type": "bool" + }, + { + "internalType": "address[]", + "name": "users", + "type": "address[]" + }, + { + "internalType": "struct IRuleEntitlement.RuleData", + "name": "ruleData", + "type": "tuple", + "components": [ + { + "internalType": "struct IRuleEntitlement.Operation[]", + "name": "operations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CombinedOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "index", + "type": "uint8" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "name": "checkOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CheckOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "name": "logicalOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.LogicalOperationType", + "name": "logOpType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "leftOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "rightOperationIndex", + "type": "uint8" + } + ] + } + ] + } + ] + }, + { + "internalType": "string[]", + "name": "permissions", + "type": "string[]" + } + ] + }, + { + "internalType": "struct IArchitectBase.ChannelInfo", + "name": "channel", + "type": "tuple", + "components": [ + { + "internalType": "string", + "name": "metadata", + "type": "string" + } + ] + } + ] + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "createSpace", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getSpaceArchitectImplementations", + "outputs": [ + { + "internalType": "contract ISpaceOwner", + "name": "spaceToken", + "type": "address" + }, + { + "internalType": "contract IUserEntitlement", + "name": "userEntitlementImplementation", + "type": "address" + }, + { + "internalType": "contract IRuleEntitlement", + "name": "ruleEntitlementImplementation", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getSpaceByTokenId", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "space", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getTokenIdBySpace", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "contract ISpaceOwner", + "name": "spaceToken", + "type": "address" + }, + { + "internalType": "contract IUserEntitlement", + "name": "userEntitlementImplementation", + "type": "address" + }, + { + "internalType": "contract IRuleEntitlement", + "name": "ruleEntitlementImplementation", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setSpaceArchitectImplementations" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/factory/facets/architect/Architect.sol": "Architect" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/base/registry/facets/checker/IEntitlementChecker.sol": { + "keccak256": "0x5c9a99c94e95a0c89b3d3310e252cd98aeafe34d87ffc0058f9b001af6f28bd1", + "urls": [ + "bzz-raw://7983b17a371e76c8681756dc10abe26f8fffd35d3d6d8773c2023f06c8600ba3", + "dweb:/ipfs/QmSDkTctKCTaMGYF2LZ1N9YWwDTZD75XegpPyLrP694JFf" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableBase.sol": { + "keccak256": "0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762", + "urls": [ + "bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4", + "dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableStorage.sol": { + "keccak256": "0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64", + "urls": [ + "bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105", + "dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol": { + "keccak256": "0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d", + "urls": [ + "bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f", + "dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol": { + "keccak256": "0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a", + "urls": [ + "bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5", + "dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol": { + "keccak256": "0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0", + "urls": [ + "bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc", + "dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/IPausable.sol": { + "keccak256": "0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261", + "urls": [ + "bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6", + "dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableBase.sol": { + "keccak256": "0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438", + "urls": [ + "bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c", + "dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableStorage.sol": { + "keccak256": "0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07", + "urls": [ + "bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b", + "dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol": { + "keccak256": "0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a", + "urls": [ + "bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b", + "dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol": { + "keccak256": "0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f", + "urls": [ + "bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c", + "dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol": { + "keccak256": "0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c", + "urls": [ + "bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6", + "dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/IERC5643.sol": { + "keccak256": "0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218", + "urls": [ + "bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f", + "dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol": { + "keccak256": "0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334", + "urls": [ + "bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa", + "dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol": { + "keccak256": "0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1", + "urls": [ + "bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c", + "dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/IERC721A.sol": { + "keccak256": "0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9", + "urls": [ + "bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e", + "dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/IProxy.sol": { + "keccak256": "0xb3cc38cae21021aec88e128eaec4994e926e4961d166c7e6e3a40a41c69aa105", + "urls": [ + "bzz-raw://6da721f34f1359068ebe71ce01472403940b4e8fe87c38ff5be2d77e673520e5", + "dweb:/ipfs/QmfNgDv5eQsLzc9bKi1EGWdxDX84Vhr2SARa7zm4pcCdpy" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/Proxy.sol": { + "keccak256": "0xae6d6933073274683d2684fc806cffbdc157d56b181d7ea0c962c3cd7746b78d", + "urls": [ + "bzz-raw://43378c060da21e547d10282839ff3dc690615c8993949f6a072f9ed4693ba548", + "dweb:/ipfs/QmaT7GdtDpNBRJPLRnGEoGmZJSFNPkqHUzPde5LSYXc1q1" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/managed/IManagedProxy.sol": { + "keccak256": "0x50761de44dd190dd8e5b01080c073c1190fa393406c12621ecb51f7bf6131929", + "urls": [ + "bzz-raw://afccbdf66bb1bda60a91c481f0770b4409841efd2e7198693b025e2ed06f66d5", + "dweb:/ipfs/QmTvoHQAv5LvyT5UVqrsgSaS7QpywxAVZMxNRevuSeLo7p" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/managed/ManagedProxyBase.sol": { + "keccak256": "0x709b83c1c463f07fea33d7b315087e35087be1ebce59a9659bad36cb25b68f2a", + "urls": [ + "bzz-raw://a258b4cb33c4595b31216316b3b0a37364dabbc1bcd076de8efb1433850d38bf", + "dweb:/ipfs/QmR54ko5NH1p1WdfUSVaRhJtTtnGcBPndS7xTJ1MbQ398v" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/managed/ManagedProxyStorage.sol": { + "keccak256": "0x3b9124d97b9f84a56a37c8e1cafb741756b11e76c7b98fab034c009fa990a761", + "urls": [ + "bzz-raw://2958827286beb633f06ac9f2eeebec7fdbf612da520cca93646f1f02e24048fa", + "dweb:/ipfs/QmaUHopT1SWHsZQEy7J5CH2ZmpwY7xh4ujfNW8mPUYAuFY" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/manager/IProxyManager.sol": { + "keccak256": "0xde8f6048e58e36541aebff781fb013334e8ea2fa824d9790e629d3733944929a", + "urls": [ + "bzz-raw://c79d9ac525a370f6f56b229506cf2d2ffeacafbeb02d417ed34c86c75fe01650", + "dweb:/ipfs/QmT9CReyEvK2UkcwnzwierQdWw2T7NVZPtVDLcwhyNBhSC" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/utils/multicall/IMulticall.sol": { + "keccak256": "0x0f1a1884b290dc829323fa6d01e0dedc785ff582e9dbffd52e44e6f2fc7beff6", + "urls": [ + "bzz-raw://1ce824d7f2b31f53a807bf6d6d7e9d0eaaf2d81b75fa316cda616e29cb4669a9", + "dweb:/ipfs/QmWyiRtGKtX6Kfng8Az2ujKDZdqjnfwxMuD1rQEZz6aki5" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/utils/multicall/Multicall.sol": { + "keccak256": "0x52c952ab050b3eb1dbb3c9cbaad900eaf83ba2ce42a47f204f9aa9e460126701", + "urls": [ + "bzz-raw://442e5db41748e2a5b7c028b55ad6a680960c1819c3b576a162edea85f623aa44", + "dweb:/ipfs/Qmb3mNdPBLFh6wgj8ih2EXs8rTcTniKpxk8eZHiY1ahaud" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/architect/Architect.sol": { + "keccak256": "0xcaed43dc30dbfe658129da749a082195539cf8c5d6c221b198e324c613ee49b7", + "urls": [ + "bzz-raw://6f703d4315ab0c9217fc8a3b387be8ef812fafac75111fe48fbc8d005778f119", + "dweb:/ipfs/QmdGLpqs5oLnVN4en8Z8exNdjh3NTaMUV4S7YrjzukgSmD" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/architect/ArchitectBase.sol": { + "keccak256": "0x6513727490f0258589a8c0060041c099392f286e86fe26d632006992fc24b408", + "urls": [ + "bzz-raw://24f5c44f47d880b23d25b4ae76e6b6488d284123f3a8f530bd674d42c774542f", + "dweb:/ipfs/QmaCnjKQMUGiQ1UwCwCuBWsxYVx4UuJe3i3gc8qtLKCcfR" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/architect/ArchitectStorage.sol": { + "keccak256": "0x6a11f25a21155e73624631305407602e8ac0e1f11c53936ffaab820263f51d1e", + "urls": [ + "bzz-raw://3c88b9f38fba7ca69b355fdce609e898857c2bfc69ca62365138bbda9aa6b74b", + "dweb:/ipfs/QmVfoXqJ1WDnxtRzKiynzkduXbizL4H9WVVDFDVNH7aNxq" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/architect/IArchitect.sol": { + "keccak256": "0x08eec3f16ce7bf98d68cefb0bd103329616dc260d9c34e5a8e0de68bcd8fb2fe", + "urls": [ + "bzz-raw://c6e9607219790d046c451e58e84f2794d0f461521de05569aa5e74c5a61a79b8", + "dweb:/ipfs/QmamxpUEceWUMKc8i2d2q7fnLdDM1611yPMX6QiQpbJDzz" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/architect/ImplementationStorage.sol": { + "keccak256": "0x7115f015df0678057d03a9bb6614c0c960c9c2334cec9919da3b1c73c65268e1", + "urls": [ + "bzz-raw://dcafc368c1a3f230851f981861bac731e9bdb2e48b78d7679978b3d2a4eaab85", + "dweb:/ipfs/QmTJ72YsxYZHdGqkF4G6KsmH2GVGVad295xvbvdZ2Yq7s9" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/architect/pricing/IPricingModules.sol": { + "keccak256": "0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e", + "urls": [ + "bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716", + "dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/platform/requirements/IPlatformRequirements.sol": { + "keccak256": "0xc0b22b0caa2336e0c3f6b6813432643053785c39531d30e5851eeb613a0a7991", + "urls": [ + "bzz-raw://8a7ceb199e92f484efcc444fffd54fbabaf332c210dda0ef46d89a66f4cb47c7", + "dweb:/ipfs/QmRJVrZiZpbGsLngz4J3NVgapKXLErdLc7BPyEyTNKdijg" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/prepay/IPrepay.sol": { + "keccak256": "0x0c5c097dd77471d041cdbb84011ac789147af937d275329d857d1a4b257635e9", + "urls": [ + "bzz-raw://baca271a5a66856f3144a4bf0ed6a484b0c981539d6bf0c57ffade9e4986eb49", + "dweb:/ipfs/QmVgPWMEL5q2J5kmZQZFRadWjuVQeFLaa9K2gCHdhjLUa9" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/registry/IImplementationRegistry.sol": { + "keccak256": "0x2409b9eb86a4dc5849050d06409fd7548ac21f9bf6e7419b91dfb9226db0a3d5", + "urls": [ + "bzz-raw://613195fc78a1a496820c5934f315c586ad33edf7608022d2ae0ea44f52529e61", + "dweb:/ipfs/QmR8Gn11UNq2rKC5Qp7Prdk61oWhNg3UVc8KeyWCRfrEqV" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/wallet-link/IWalletLink.sol": { + "keccak256": "0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b", + "urls": [ + "bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13", + "dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/IEntitlement.sol": { + "keccak256": "0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca", + "urls": [ + "bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3", + "dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol": { + "keccak256": "0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf", + "urls": [ + "bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1", + "dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97" + ], + "license": "MIT" + }, + "contracts/src/spaces/entitlements/user/IUserEntitlement.sol": { + "keccak256": "0x96fef5ebaa7e9e79c77c887d9053ae06dc91cf1301f33db652e6ac811b3b5cc5", + "urls": [ + "bzz-raw://6cff649b95f65c9e3ecfa7dfa3b1c7b524ec7244eb5223c55674a4679eb8e7bf", + "dweb:/ipfs/QmQy5sXRywRWB3aM58TCp5Xw5b258Y5PfDM8RasDznAPzA" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/Permissions.sol": { + "keccak256": "0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5", + "urls": [ + "bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721", + "dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/IChannel.sol": { + "keccak256": "0x4a62ec6410779121880a21ae1a42bab2480f672c683f79c7f2e11bf2bfe1bd6e", + "urls": [ + "bzz-raw://61b4142a55418d8e15e4db77bf6614a830489dc6aa191afe3dadc9ef16534b2c", + "dweb:/ipfs/Qmbuc8VBmoFrbWZGinbCQaCrBRw3DznYhZNLzqk2FXABUx" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/IEntitlementsManager.sol": { + "keccak256": "0x1c3cff6f7a35610df492abc39a62ba704e408d43477ba2e34833197c2956e9d3", + "urls": [ + "bzz-raw://c5d5f08c5bc196e6166678b39d415da12c285d9bee3584d5e200bbf0c5ea911d", + "dweb:/ipfs/QmdYkU6kzHFw7KFYAdvxiwHK7hWCrz3E3pwiCjWZ97PVGx" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/EntitlementGatedBase.sol": { + "keccak256": "0x0aa9887cf58dd68d0270c85e2d7610080f35410b845c2227e4bd84356b7a2cb7", + "urls": [ + "bzz-raw://6dbdbed895fc2a53bffa3dbc1cfd4c992a096f153e6bbb7aeb9894485e7fc1a6", + "dweb:/ipfs/QmZp76Gd8aL9pWbiTvLaiHv1w12yjN59PtYdMvoUCbfbH5" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/EntitlementGatedStorage.sol": { + "keccak256": "0xe997c0dd62f6ceb300729d3f56a3f25a47b40ed5946d68c5210c38941cb37eaa", + "urls": [ + "bzz-raw://63fcfd9f667538e8e9339534d2ddc6f7899e4179a54f3c6595e2598babb5bb9c", + "dweb:/ipfs/QmUfKtfgW1uskEWkhhGqTjcbCqMANQoKKfTgV2ZvdAZpvJ" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/IEntitlementGated.sol": { + "keccak256": "0x948de1018f7f78366263a40e0f8269e10941216bd03a9996edb24a6230959e74", + "urls": [ + "bzz-raw://dc985539ce639f39fd68723acca6424a78deac6cec3693c9d8e1084a487c83ec", + "dweb:/ipfs/QmQujX5rmDwhJZurp11FTiPLb7ev9swLTtdkagA8wydZiT" + ], + "license": "MIT" + }, + "contracts/src/spaces/facets/membership/IMembership.sol": { + "keccak256": "0x233066dd470121818082ba6a4c868f90feafc3be29942aae2c7a5c25543b7485", + "urls": [ + "bzz-raw://30d976a1882102493e7cee87b75ab04c662626d71aca51c9334ed2f60402bb59", + "dweb:/ipfs/QmerPfizrjueQSgG8SkSoi44fkyaqrN2ZCFTnaxnM3UqF7" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/MembershipBase.sol": { + "keccak256": "0x82b3314afcd1fe84a5261c38627c2537c09271372504af10549558c0fd608791", + "urls": [ + "bzz-raw://dadc28ee124081ea64228b8a12e0fcc93c7256535597ea9e29d58140bb599fc5", + "dweb:/ipfs/QmYNZjhBJnPf9kMt2J6pL2d746AB3EHrXVAj5Ce3ibZpBh" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/MembershipStorage.sol": { + "keccak256": "0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3", + "urls": [ + "bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee", + "dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/pricing/IMembershipPricing.sol": { + "keccak256": "0xb68faf2b90536ea53110ebb1d4456f2e9a261b5fac4515df47076da73e0cbd77", + "urls": [ + "bzz-raw://063fca54f8210be704b5d9f54efac08017266fafc9d287a6ece7866b25174448", + "dweb:/ipfs/QmbXUgKgh36CmNRA5NrtRrVcgfrKYEzZprAcjTVWhHmXBF" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/referral/IMembershipReferral.sol": { + "keccak256": "0xeb2feee4b1f3e83509bc1425c0ecd60eaf168fa7686c14dc2bd636e5a691bc6a", + "urls": [ + "bzz-raw://ec9bcb8c4106639ec9e0d37fa59385c1e853fb07f9ebedcd9f2bc1198979a807", + "dweb:/ipfs/QmcAdwQKn2jMo7grzXNGSPr9PvQBxdKURF6xxLPorCDrFt" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/referral/MembershipReferralBase.sol": { + "keccak256": "0x6f29e73b113fce75e54a41f248621b1adaa5ac4a3b189ef0903308bfa69165ca", + "urls": [ + "bzz-raw://abc7b25a74097434912f4940bfcd6cf9e312b0989279cb31a9a74d7ae6c09636", + "dweb:/ipfs/QmPdttVeMBDBb8SMrga6YnKz3aiGDKMqo2MofCXtag4w4E" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/referral/MembershipReferralStorage.sol": { + "keccak256": "0x607aabf7ae45b7f112165c1028e0fa2d18b86c6db78f4df4bdf39dd0f20973ea", + "urls": [ + "bzz-raw://4d61919ebf0ba0d3706cf2c3755b9d9920312c82bb1b83d0023f1cb09c2fc31d", + "dweb:/ipfs/QmSQ1G7rRMf6tAuzdU6M5ydKetaSZXdN3UV33wNjvDrqAL" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/owner/ISpaceOwner.sol": { + "keccak256": "0xf68eb1b3aceeacc0c4162304f74d89890e8c641a9c0778c1786db850a79cfb3f", + "urls": [ + "bzz-raw://8a345161f4d34be281c5f4d165dac958ed3a5e7d2888924d498555871906e6ea", + "dweb:/ipfs/QmQcWfQ6k54UPr9eMA2KnXCJAc4NR24LhzbmyA5NUKBVN3" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/proxy/SpaceProxy.sol": { + "keccak256": "0x31a5bc85ec005c60e58c94948b159806b14c7cd0466cc8d3ef32844e4564412d", + "urls": [ + "bzz-raw://4935d5100b48c5f7ad3adc068ea70701ad5e22963c4698aa6e42a61d54227984", + "dweb:/ipfs/QmXopMyXerTvJFV1xwLnVv2GdhBCwDAE2oNtWywVPbxKRf" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/IRoles.sol": { + "keccak256": "0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d", + "urls": [ + "bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8", + "dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/Factory.sol": { + "keccak256": "0xc5c6a4043577ffe33f61680b5bb12eb7267c68851339890831f37a85c823e7b4", + "urls": [ + "bzz-raw://81eec744d4993f4184010b16490a546d84a0ed1d4f3f9f84553cb374268ef8b3", + "dweb:/ipfs/QmNX3gotr3ycE2XnVS48iatZh97uoeuVvoRRGiQh68Jij3" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/StringSet.sol": { + "keccak256": "0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319", + "urls": [ + "bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6", + "dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/Validator.sol": { + "keccak256": "0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50", + "urls": [ + "bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64", + "dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/interfaces/IWETH.sol": { + "keccak256": "0xd274612ab96215dcdb6e3717a63e7a0f76c7facadff93b2b23ed278f6e7b3b00", + "urls": [ + "bzz-raw://12444da1f06a0fbe6d2d564d73d6d6bc58c09496af3aeea6988c3d3f9ee81c73", + "dweb:/ipfs/QmTkpQ6cZmRYgvLUS4mqzLvFg5nabgQjpMnVK8JENboiA3" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/libraries/BasisPoints.sol": { + "keccak256": "0x797b0a1d3da51f4256c83b5d5c885b034df5bdff69c8dfa0fac9777cfa2f1d26", + "urls": [ + "bzz-raw://52ba0c85e5de8a7d76e2e4bcbccdaffa68e29281191ae1f889430a496ce5cf1c", + "dweb:/ipfs/Qmd5bYypjF6gcJKKagdRpvAgV4LCs4iyn7KYdaLBWjjuHr" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/libraries/CurrencyTransfer.sol": { + "keccak256": "0x1c6b5b33831f8c5c02c49dff5ceac3ad1a6cdb74c988ebba72c36329ca704750", + "urls": [ + "bzz-raw://78122f27b67a5d3ebe95c4260dc972ab7be5c04b277cbd71a833dd74fbd23fa4", + "dweb:/ipfs/QmU78EApEim92KMVtW69coFPZdhvbkhmYn6dW2zwqJKPBp" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol": { + "keccak256": "0xbfb6695731de677140fbf76c772ab08c4233a122fb51ac28ac120fc49bbbc4ec", + "urls": [ + "bzz-raw://68f8fded7cc318efa15874b7c6a983fe17a4a955d72d240353a9a4ca1e1b824c", + "dweb:/ipfs/QmdcmBL9Qo4Tk3Dby4wFYabGyot9JNeLPxpSXZUgUm92BV" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol": { + "keccak256": "0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65", + "urls": [ + "bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a", + "dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/proxy/Proxy.sol": { + "keccak256": "0xc3f2ec76a3de8ed7a7007c46166f5550c72c7709e3fc7e8bb3111a7191cdedbd", + "urls": [ + "bzz-raw://e73efb4c2ca655882dc237c6b4f234a9bd36d97159d8fcaa837eb01171f726ac", + "dweb:/ipfs/QmTNnnv7Gu5fs5G1ZMh7Fexp8N4XUs3XrNAngjcxgiss3e" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/proxy/beacon/IBeacon.sol": { + "keccak256": "0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c", + "urls": [ + "bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa", + "dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70", + "urls": [ + "bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c", + "dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { + "keccak256": "0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff", + "urls": [ + "bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d", + "dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { + "keccak256": "0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386", + "urls": [ + "bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0", + "dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4", + "urls": [ + "bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7", + "dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/StorageSlot.sol": { + "keccak256": "0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418", + "urls": [ + "bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c", + "dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/Channels.abi.json b/packages/generated/dev/abis/Channels.abi.json new file mode 100644 index 000000000..5610d468a --- /dev/null +++ b/packages/generated/dev/abis/Channels.abi.json @@ -0,0 +1,772 @@ +[ + { + "type": "function", + "name": "addRoleToChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "createChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "metadata", + "type": "string", + "internalType": "string" + }, + { + "name": "roleIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "channel", + "type": "tuple", + "internalType": "struct IChannelBase.Channel", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + }, + { + "name": "metadata", + "type": "string", + "internalType": "string" + }, + { + "name": "roleIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getChannels", + "inputs": [], + "outputs": [ + { + "name": "channels", + "type": "tuple[]", + "internalType": "struct IChannelBase.Channel[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + }, + { + "name": "metadata", + "type": "string", + "internalType": "string" + }, + { + "name": "roleIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRolesByChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "roleIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeRoleFromChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "metadata", + "type": "string", + "internalType": "string" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelCreated", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelRemoved", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelRoleAdded", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelRoleRemoved", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelUpdated", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SubscriptionUpdate", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "expiration", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ChannelService__ChannelAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__ChannelDisabled", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__ChannelDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__RoleAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__DurationZero", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__NotApprovedOrOwner", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidStringLength", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/Channels.abi.ts b/packages/generated/dev/abis/Channels.abi.ts new file mode 100644 index 000000000..c9e64e828 --- /dev/null +++ b/packages/generated/dev/abis/Channels.abi.ts @@ -0,0 +1,772 @@ +export default [ + { + "type": "function", + "name": "addRoleToChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "createChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "metadata", + "type": "string", + "internalType": "string" + }, + { + "name": "roleIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "channel", + "type": "tuple", + "internalType": "struct IChannelBase.Channel", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + }, + { + "name": "metadata", + "type": "string", + "internalType": "string" + }, + { + "name": "roleIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getChannels", + "inputs": [], + "outputs": [ + { + "name": "channels", + "type": "tuple[]", + "internalType": "struct IChannelBase.Channel[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + }, + { + "name": "metadata", + "type": "string", + "internalType": "string" + }, + { + "name": "roleIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRolesByChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "roleIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeRoleFromChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "metadata", + "type": "string", + "internalType": "string" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelCreated", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelRemoved", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelRoleAdded", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelRoleRemoved", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelUpdated", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SubscriptionUpdate", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "expiration", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ChannelService__ChannelAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__ChannelDisabled", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__ChannelDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__RoleAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__DurationZero", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__NotApprovedOrOwner", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidStringLength", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/Channels.bin b/packages/generated/dev/abis/Channels.bin new file mode 100644 index 000000000..c21da1426 --- /dev/null +++ b/packages/generated/dev/abis/Channels.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b611d27806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80639575f6ac1161005b5780639575f6ac146100f15780639935218314610106578063b9de615914610126578063ef86d6961461013957600080fd5b806302da0e511461008d57806337644cf7146100a2578063831c2b82146100b5578063921f7175146100de575b600080fd5b6100a061009b366004611597565b61014c565b005b6100a06100b03660046115b0565b61018a565b6100c86100c3366004611597565b6101cb565b6040516100d5919061168f565b60405180910390f35b6100a06100ec36600461177d565b6101fd565b6100f961023f565b6040516100d59190611845565b610119610114366004611597565b61024e565b6040516100d591906118a9565b6100a06101343660046115b0565b610259565b6100a06101473660046118fb565b610296565b61017e6040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b610187816102fb565b50565b6101bd826040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b81525061033c565b6101c78282610363565b5050565b60408051608081018252600080825260208201526060918101829052818101919091526101f7826103ad565b92915050565b61022f6040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b61023a838383610414565b505050565b6060610249610465565b905090565b60606101f78261059d565b61028c826040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b81525061033c565b6101c782826105a8565b6102c86040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b61023a8383836105ea565b6102de600082610627565b61018757604051630ce39a4b60e21b815260040160405180910390fd5b610304816106ab565b60405181815233907f3a3f387aa42656bc1732adfc7aea5cde9ccc05a59f9af9c29ebfa68e66383e939060200160405180910390a250565b6103468282610627565b6101c757604051630ce39a4b60e21b815260040160405180910390fd5b61036d82826107a2565b604080518381526020810183905233917f2b10481523b59a7978f8ab73b237349b0f38c801f6094bdc8994d379c067d71391015b60405180910390a25050565b60408051608081018252600080825260208201526060918101829052818101919091526000806103dc84610833565b925092505060006103ec85610953565b6040805160808101825296875292151560208701529185019290925260608401525090919050565b61041f8260006109ab565b61042a8383836109cf565b60405183815233907fdd6c5b83be3557f8b2674712946f9f05dcd882b82bfd58b9539b9706efd35d8c906020015b60405180910390a2505050565b60606000610471610b09565b90506000815167ffffffffffffffff81111561048f5761048f6116a2565b6040519080825280602002602001820160405280156104e357816020015b60408051608081018252600080825260208201526060918101829052818101919091528152602001906001900390816104ad5790505b50905060005b825181101561059657600080600061051986858151811061050c5761050c611956565b6020026020010151610833565b925092509250600061054387868151811061053657610536611956565b6020026020010151610953565b9050604051806080016040528085815260200183151581526020018481526020018281525086868151811061057a5761057a611956565b60200260200101819052505050505080806001019150506104e9565b5092915050565b60606101f782610953565b6105b28282610b29565b604080518381526020810183905233917faee688d80dbf97230e5d2b4b06aa7074bfe38ddd8abf856551177db30395612991016103a1565b6105f5838383610bb9565b60405183815233907f94af4a611b3fb1eaa653a6b29f82b71bcea25ca378171c5f059010fa18e0716e90602001610458565b60003380610633610c6e565b6001600160a01b031614806106a357507fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff161580156106a357506106a3848285604051602001610686919061196c565b60405160208183030381529060405261069e90611988565b610d32565b949350505050565b6106b481610fdf565b600080516020611d078339815191526106cd8183611016565b5060408051602080820183526000808352858152600280860190925292909220909101906106fb9082611a30565b50600082815260028083016020526040822060018101805460ff19169055828155919061072a90830182611549565b50506000828152600382016020526040812061074590611022565b905060005b815181101561079c5761079382828151811061076857610768611956565b602002602001015184600301600087815260200190815260200160002061101690919063ffffffff16565b5060010161074a565b50505050565b6107ab82610fdf565b6107b48261102f565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d07833981519152906107fb9083611091565b15610819576040516302369ff360e41b815260040160405180910390fd5b6000838152600382016020526040902061079c90836110a9565b60006060600061084284610fdf565b60008481527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430260209081526040808320815160608101835281548152600182015460ff16151593810193909352600281018054600080516020611d07833981519152959493840191906108b4906119ac565b80601f01602080910402602001604051908101604052809291908181526020018280546108e0906119ac565b801561092d5780601f106109025761010080835404028352916020019161092d565b820191906000526020600020905b81548152906001019060200180831161091057829003601f168201915b505050919092525050815160408301516020909301519099929850965090945050505050565b606061095e82610fdf565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d07833981519152906109a490611022565b9392505050565b8151829082111561023a576040516374eb20a760e01b815260040160405180910390fd5b6109d8836110b5565b600080516020611d078339815191526109f181856110a9565b50604080516060810182528581526000602080830182815283850188815289845260028781019093529490922083518155915160018301805460ff191691151591909117905592519192909190820190610a4b9082611a30565b5090505060005b8251811015610b0257610a9b838281518110610a7057610a70611956565b602002602001015183600301600088815260200190815260200160002061109190919063ffffffff16565b15610ab9576040516302369ff360e41b815260040160405180910390fd5b610af9838281518110610ace57610ace611956565b60200260200101518360030160008881526020019081526020016000206110a990919063ffffffff16565b50600101610a52565b5050505050565b6060600080516020611d07833981519152610b2381611022565b91505090565b610b3282610fdf565b610b3b8261102f565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d0783398151915290610b829083611091565b610b9f576040516333cb039f60e11b815260040160405180910390fd5b6000838152600382016020526040902061079c9083611016565b610bc283610fdf565b60008381527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504302602052604090208251600080516020611d07833981519152919015801590610c2f575080600201604051610c1c9190611af0565b6040518091039020848051906020012014155b15610c445760028101610c428582611a30565b505b600181015460ff16151583151514610b0257600101805460ff191692151592909217909155505050565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190611b82565b600080610d3d610c6e565b90506000610d4a856110eb565b80519091506000610d5961126a565b805190915060005b83811015610e18576000858281518110610d7d57610d7d611956565b60200260200101519050866001600160a01b0316816001600160a01b031603610db05760019750505050505050506109a4565b60005b83811015610e0e57816001600160a01b0316610de7868381518110610dda57610dda611956565b6020026020010151611295565b6001600160a01b031603610e06576000985050505050505050506109a4565b600101610db3565b5050600101610d61565b507fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006000610e657fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931016112a0565b905060005b81811015610fcd5760008381610e8360018301856112aa565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015610f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f309190611b9d565b158015610fad575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401610f6c93929190611bba565b602060405180830381865afa158015610f89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fad9190611b9d565b15610fc457600199505050505050505050506109a4565b50600101610e6a565b5060009b9a5050505050505050505050565b610ff981600080516020611d078339815191525b90611091565b6101875760405163560b4b4160e11b815260040160405180910390fd5b60006109a483836112b6565b606060006109a4836113a9565b60008181527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af5185043026020526040902060010154600080516020611d078339815191529060ff16156101c757604051636ce0028960e11b815260040160405180910390fd5b600081815260018301602052604081205415156109a4565b60006109a48383611405565b6110cd81600080516020611d07833981519152610ff3565b1561018757604051632324f7d960e21b815260040160405180910390fd5b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa158015611160573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111889190810190611c1c565b8051909150600061119a826001611cca565b67ffffffffffffffff8111156111b2576111b26116a2565b6040519080825280602002602001820160405280156111db578160200160208202803683370190505b50905060005b82811015611235578381815181106111fb576111fb611956565b602002602001015182828151811061121557611215611956565b6001600160a01b03909216602092830291909101909101526001016111e1565b508581838151811061124957611249611956565b6001600160a01b039092166020928302919091019091015295945050505050565b60606102497f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611022565b60006101f782611454565b60006101f7825490565b60006109a4838361151f565b6000818152600183016020526040812054801561139f5760006112da600183611cdd565b85549091506000906112ee90600190611cdd565b905080821461135357600086600001828154811061130e5761130e611956565b906000526020600020015490508087600001848154811061133157611331611956565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061136457611364611cf0565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506101f7565b60009150506101f7565b6060816000018054806020026020016040519081016040528092919081815260200182805480156113f957602002820191906000526020600020905b8154815260200190600101908083116113e5575b50505050509050919050565b600081815260018301602052604081205461144c575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556101f7565b5060006101f7565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b8316900361150557816000036114ff57805483106114db57604051636f96cda160e11b815260040160405180910390fd5b5b6000199092016000818152600484016020526040902054909290915081156114dc575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b600082600001828154811061153657611536611956565b9060005260206000200154905092915050565b508054611555906119ac565b6000825580601f10611565575050565b601f01602090049060005260206000209081019061018791905b80821115611593576000815560010161157f565b5090565b6000602082840312156115a957600080fd5b5035919050565b600080604083850312156115c357600080fd5b50508035926020909101359150565b60005b838110156115ed5781810151838201526020016115d5565b50506000910152565b805182526000602080830151151581850152604083015160806040860152805180608087015261162c8160a088018585016115d2565b601f19601f820116860191505060a08101606085015160a087840301606088015281815180845260c0850191508583019450600093505b808410156116835784518252938501936001939093019290850190611663565b50979650505050505050565b6020815260006109a460208301846115f6565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156116e1576116e16116a2565b604052919050565b600082601f8301126116fa57600080fd5b813567ffffffffffffffff811115611714576117146116a2565b611727601f8201601f19166020016116b8565b81815284602083860101111561173c57600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff821115611773576117736116a2565b5060051b60200190565b60008060006060848603121561179257600080fd5b8335925060208085013567ffffffffffffffff808211156117b257600080fd5b6117be888389016116e9565b945060408701359150808211156117d457600080fd5b508501601f810187136117e657600080fd5b80356117f96117f482611759565b6116b8565b81815260059190911b8201830190838101908983111561181857600080fd5b928401925b828410156118365783358252928401929084019061181d565b80955050505050509250925092565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561189c57603f1988860301845261188a8583516115f6565b9450928501929085019060010161186e565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156118e1578351835292840192918401916001016118c5565b50909695505050505050565b801515811461018757600080fd5b60008060006060848603121561191057600080fd5b83359250602084013567ffffffffffffffff81111561192e57600080fd5b61193a868287016116e9565b925050604084013561194b816118ed565b809150509250925092565b634e487b7160e01b600052603260045260246000fd5b6000825161197e8184602087016115d2565b9190910192915050565b805160208083015191908110156114ff5760001960209190910360031b1b16919050565b600181811c908216806119c057607f821691505b6020821081036114ff57634e487b7160e01b600052602260045260246000fd5b601f82111561023a576000816000526020600020601f850160051c81016020861015611a095750805b601f850160051c820191505b81811015611a2857828155600101611a15565b505050505050565b815167ffffffffffffffff811115611a4a57611a4a6116a2565b611a5e81611a5884546119ac565b846119e0565b602080601f831160018114611a935760008415611a7b5750858301515b600019600386901b1c1916600185901b178555611a28565b600085815260208120601f198616915b82811015611ac257888601518255948401946001909101908401611aa3565b5085821015611ae05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354611afe816119ac565b60018281168015611b165760018114611b2b57611b5a565b60ff1984168752821515830287019450611b5a565b8760005260208060002060005b85811015611b515781548a820152908401908201611b38565b50505082870194505b50929695505050505050565b80516001600160a01b0381168114611b7d57600080fd5b919050565b600060208284031215611b9457600080fd5b6109a482611b66565b600060208284031215611baf57600080fd5b81516109a4816118ed565b60006060820185835260206060602085015281865180845260808601915060208801935060005b81811015611c065784516001600160a01b031683529383019391830191600101611be1565b5050809350505050826040830152949350505050565b60006020808385031215611c2f57600080fd5b825167ffffffffffffffff811115611c4657600080fd5b8301601f81018513611c5757600080fd5b8051611c656117f482611759565b81815260059190911b82018301908381019087831115611c8457600080fd5b928401925b82841015611ca957611c9a84611b66565b82529284019290840190611c89565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156101f7576101f7611cb4565b818103818111156101f7576101f7611cb4565b634e487b7160e01b600052603160045260246000fdfe804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504300 \ No newline at end of file diff --git a/packages/generated/dev/abis/Channels.json b/packages/generated/dev/abis/Channels.json new file mode 100644 index 000000000..cd3766275 --- /dev/null +++ b/packages/generated/dev/abis/Channels.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"addRoleToChannel","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"},{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"createChannel","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"},{"name":"metadata","type":"string","internalType":"string"},{"name":"roleIds","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getChannel","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"channel","type":"tuple","internalType":"struct IChannelBase.Channel","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"disabled","type":"bool","internalType":"bool"},{"name":"metadata","type":"string","internalType":"string"},{"name":"roleIds","type":"uint256[]","internalType":"uint256[]"}]}],"stateMutability":"view"},{"type":"function","name":"getChannels","inputs":[],"outputs":[{"name":"channels","type":"tuple[]","internalType":"struct IChannelBase.Channel[]","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"disabled","type":"bool","internalType":"bool"},{"name":"metadata","type":"string","internalType":"string"},{"name":"roleIds","type":"uint256[]","internalType":"uint256[]"}]}],"stateMutability":"view"},{"type":"function","name":"getRolesByChannel","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"roleIds","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"removeChannel","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeRoleFromChannel","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"},{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateChannel","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"},{"name":"metadata","type":"string","internalType":"string"},{"name":"disabled","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"Banned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ChannelCreated","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"channelId","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"ChannelRemoved","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"channelId","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"ChannelRoleAdded","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"channelId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"roleId","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ChannelRoleRemoved","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"channelId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"roleId","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ChannelUpdated","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"channelId","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"ConsecutiveTransfer","inputs":[{"name":"fromTokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"toTokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"SubscriptionUpdate","inputs":[{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"expiration","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unbanned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"ApprovalCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"ApprovalQueryForNonexistentToken","inputs":[]},{"type":"error","name":"BalanceQueryForZeroAddress","inputs":[]},{"type":"error","name":"Banning__AlreadyBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__CannotBanSelf","inputs":[]},{"type":"error","name":"Banning__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__NotBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ChannelService__ChannelAlreadyExists","inputs":[]},{"type":"error","name":"ChannelService__ChannelDisabled","inputs":[]},{"type":"error","name":"ChannelService__ChannelDoesNotExist","inputs":[]},{"type":"error","name":"ChannelService__RoleAlreadyExists","inputs":[]},{"type":"error","name":"ChannelService__RoleDoesNotExist","inputs":[]},{"type":"error","name":"ERC5643__DurationZero","inputs":[]},{"type":"error","name":"ERC5643__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC5643__NotApprovedOrOwner","inputs":[]},{"type":"error","name":"ERC5643__SubscriptionNotRenewable","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Entitlement__InvalidValue","inputs":[]},{"type":"error","name":"Entitlement__NotAllowed","inputs":[]},{"type":"error","name":"Entitlement__NotMember","inputs":[]},{"type":"error","name":"Entitlement__ValueAlreadyExists","inputs":[]},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"MintERC2309QuantityExceedsLimit","inputs":[]},{"type":"error","name":"MintToZeroAddress","inputs":[]},{"type":"error","name":"MintZeroQuantity","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]},{"type":"error","name":"OwnerQueryForNonexistentToken","inputs":[]},{"type":"error","name":"OwnershipNotInitializedForExtraData","inputs":[]},{"type":"error","name":"Pausable__NotPaused","inputs":[]},{"type":"error","name":"Pausable__Paused","inputs":[]},{"type":"error","name":"TransferCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"TransferFromIncorrectOwner","inputs":[]},{"type":"error","name":"TransferToNonERC721ReceiverImplementer","inputs":[]},{"type":"error","name":"TransferToZeroAddress","inputs":[]},{"type":"error","name":"URIQueryForNonexistentToken","inputs":[]},{"type":"error","name":"Validator__InvalidStringLength","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b611d27806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80639575f6ac1161005b5780639575f6ac146100f15780639935218314610106578063b9de615914610126578063ef86d6961461013957600080fd5b806302da0e511461008d57806337644cf7146100a2578063831c2b82146100b5578063921f7175146100de575b600080fd5b6100a061009b366004611597565b61014c565b005b6100a06100b03660046115b0565b61018a565b6100c86100c3366004611597565b6101cb565b6040516100d5919061168f565b60405180910390f35b6100a06100ec36600461177d565b6101fd565b6100f961023f565b6040516100d59190611845565b610119610114366004611597565b61024e565b6040516100d591906118a9565b6100a06101343660046115b0565b610259565b6100a06101473660046118fb565b610296565b61017e6040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b610187816102fb565b50565b6101bd826040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b81525061033c565b6101c78282610363565b5050565b60408051608081018252600080825260208201526060918101829052818101919091526101f7826103ad565b92915050565b61022f6040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b61023a838383610414565b505050565b6060610249610465565b905090565b60606101f78261059d565b61028c826040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b81525061033c565b6101c782826105a8565b6102c86040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b61023a8383836105ea565b6102de600082610627565b61018757604051630ce39a4b60e21b815260040160405180910390fd5b610304816106ab565b60405181815233907f3a3f387aa42656bc1732adfc7aea5cde9ccc05a59f9af9c29ebfa68e66383e939060200160405180910390a250565b6103468282610627565b6101c757604051630ce39a4b60e21b815260040160405180910390fd5b61036d82826107a2565b604080518381526020810183905233917f2b10481523b59a7978f8ab73b237349b0f38c801f6094bdc8994d379c067d71391015b60405180910390a25050565b60408051608081018252600080825260208201526060918101829052818101919091526000806103dc84610833565b925092505060006103ec85610953565b6040805160808101825296875292151560208701529185019290925260608401525090919050565b61041f8260006109ab565b61042a8383836109cf565b60405183815233907fdd6c5b83be3557f8b2674712946f9f05dcd882b82bfd58b9539b9706efd35d8c906020015b60405180910390a2505050565b60606000610471610b09565b90506000815167ffffffffffffffff81111561048f5761048f6116a2565b6040519080825280602002602001820160405280156104e357816020015b60408051608081018252600080825260208201526060918101829052818101919091528152602001906001900390816104ad5790505b50905060005b825181101561059657600080600061051986858151811061050c5761050c611956565b6020026020010151610833565b925092509250600061054387868151811061053657610536611956565b6020026020010151610953565b9050604051806080016040528085815260200183151581526020018481526020018281525086868151811061057a5761057a611956565b60200260200101819052505050505080806001019150506104e9565b5092915050565b60606101f782610953565b6105b28282610b29565b604080518381526020810183905233917faee688d80dbf97230e5d2b4b06aa7074bfe38ddd8abf856551177db30395612991016103a1565b6105f5838383610bb9565b60405183815233907f94af4a611b3fb1eaa653a6b29f82b71bcea25ca378171c5f059010fa18e0716e90602001610458565b60003380610633610c6e565b6001600160a01b031614806106a357507fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff161580156106a357506106a3848285604051602001610686919061196c565b60405160208183030381529060405261069e90611988565b610d32565b949350505050565b6106b481610fdf565b600080516020611d078339815191526106cd8183611016565b5060408051602080820183526000808352858152600280860190925292909220909101906106fb9082611a30565b50600082815260028083016020526040822060018101805460ff19169055828155919061072a90830182611549565b50506000828152600382016020526040812061074590611022565b905060005b815181101561079c5761079382828151811061076857610768611956565b602002602001015184600301600087815260200190815260200160002061101690919063ffffffff16565b5060010161074a565b50505050565b6107ab82610fdf565b6107b48261102f565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d07833981519152906107fb9083611091565b15610819576040516302369ff360e41b815260040160405180910390fd5b6000838152600382016020526040902061079c90836110a9565b60006060600061084284610fdf565b60008481527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430260209081526040808320815160608101835281548152600182015460ff16151593810193909352600281018054600080516020611d07833981519152959493840191906108b4906119ac565b80601f01602080910402602001604051908101604052809291908181526020018280546108e0906119ac565b801561092d5780601f106109025761010080835404028352916020019161092d565b820191906000526020600020905b81548152906001019060200180831161091057829003601f168201915b505050919092525050815160408301516020909301519099929850965090945050505050565b606061095e82610fdf565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d07833981519152906109a490611022565b9392505050565b8151829082111561023a576040516374eb20a760e01b815260040160405180910390fd5b6109d8836110b5565b600080516020611d078339815191526109f181856110a9565b50604080516060810182528581526000602080830182815283850188815289845260028781019093529490922083518155915160018301805460ff191691151591909117905592519192909190820190610a4b9082611a30565b5090505060005b8251811015610b0257610a9b838281518110610a7057610a70611956565b602002602001015183600301600088815260200190815260200160002061109190919063ffffffff16565b15610ab9576040516302369ff360e41b815260040160405180910390fd5b610af9838281518110610ace57610ace611956565b60200260200101518360030160008881526020019081526020016000206110a990919063ffffffff16565b50600101610a52565b5050505050565b6060600080516020611d07833981519152610b2381611022565b91505090565b610b3282610fdf565b610b3b8261102f565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d0783398151915290610b829083611091565b610b9f576040516333cb039f60e11b815260040160405180910390fd5b6000838152600382016020526040902061079c9083611016565b610bc283610fdf565b60008381527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504302602052604090208251600080516020611d07833981519152919015801590610c2f575080600201604051610c1c9190611af0565b6040518091039020848051906020012014155b15610c445760028101610c428582611a30565b505b600181015460ff16151583151514610b0257600101805460ff191692151592909217909155505050565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190611b82565b600080610d3d610c6e565b90506000610d4a856110eb565b80519091506000610d5961126a565b805190915060005b83811015610e18576000858281518110610d7d57610d7d611956565b60200260200101519050866001600160a01b0316816001600160a01b031603610db05760019750505050505050506109a4565b60005b83811015610e0e57816001600160a01b0316610de7868381518110610dda57610dda611956565b6020026020010151611295565b6001600160a01b031603610e06576000985050505050505050506109a4565b600101610db3565b5050600101610d61565b507fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006000610e657fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931016112a0565b905060005b81811015610fcd5760008381610e8360018301856112aa565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015610f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f309190611b9d565b158015610fad575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401610f6c93929190611bba565b602060405180830381865afa158015610f89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fad9190611b9d565b15610fc457600199505050505050505050506109a4565b50600101610e6a565b5060009b9a5050505050505050505050565b610ff981600080516020611d078339815191525b90611091565b6101875760405163560b4b4160e11b815260040160405180910390fd5b60006109a483836112b6565b606060006109a4836113a9565b60008181527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af5185043026020526040902060010154600080516020611d078339815191529060ff16156101c757604051636ce0028960e11b815260040160405180910390fd5b600081815260018301602052604081205415156109a4565b60006109a48383611405565b6110cd81600080516020611d07833981519152610ff3565b1561018757604051632324f7d960e21b815260040160405180910390fd5b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa158015611160573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111889190810190611c1c565b8051909150600061119a826001611cca565b67ffffffffffffffff8111156111b2576111b26116a2565b6040519080825280602002602001820160405280156111db578160200160208202803683370190505b50905060005b82811015611235578381815181106111fb576111fb611956565b602002602001015182828151811061121557611215611956565b6001600160a01b03909216602092830291909101909101526001016111e1565b508581838151811061124957611249611956565b6001600160a01b039092166020928302919091019091015295945050505050565b60606102497f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611022565b60006101f782611454565b60006101f7825490565b60006109a4838361151f565b6000818152600183016020526040812054801561139f5760006112da600183611cdd565b85549091506000906112ee90600190611cdd565b905080821461135357600086600001828154811061130e5761130e611956565b906000526020600020015490508087600001848154811061133157611331611956565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061136457611364611cf0565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506101f7565b60009150506101f7565b6060816000018054806020026020016040519081016040528092919081815260200182805480156113f957602002820191906000526020600020905b8154815260200190600101908083116113e5575b50505050509050919050565b600081815260018301602052604081205461144c575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556101f7565b5060006101f7565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b8316900361150557816000036114ff57805483106114db57604051636f96cda160e11b815260040160405180910390fd5b5b6000199092016000818152600484016020526040902054909290915081156114dc575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b600082600001828154811061153657611536611956565b9060005260206000200154905092915050565b508054611555906119ac565b6000825580601f10611565575050565b601f01602090049060005260206000209081019061018791905b80821115611593576000815560010161157f565b5090565b6000602082840312156115a957600080fd5b5035919050565b600080604083850312156115c357600080fd5b50508035926020909101359150565b60005b838110156115ed5781810151838201526020016115d5565b50506000910152565b805182526000602080830151151581850152604083015160806040860152805180608087015261162c8160a088018585016115d2565b601f19601f820116860191505060a08101606085015160a087840301606088015281815180845260c0850191508583019450600093505b808410156116835784518252938501936001939093019290850190611663565b50979650505050505050565b6020815260006109a460208301846115f6565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156116e1576116e16116a2565b604052919050565b600082601f8301126116fa57600080fd5b813567ffffffffffffffff811115611714576117146116a2565b611727601f8201601f19166020016116b8565b81815284602083860101111561173c57600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff821115611773576117736116a2565b5060051b60200190565b60008060006060848603121561179257600080fd5b8335925060208085013567ffffffffffffffff808211156117b257600080fd5b6117be888389016116e9565b945060408701359150808211156117d457600080fd5b508501601f810187136117e657600080fd5b80356117f96117f482611759565b6116b8565b81815260059190911b8201830190838101908983111561181857600080fd5b928401925b828410156118365783358252928401929084019061181d565b80955050505050509250925092565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561189c57603f1988860301845261188a8583516115f6565b9450928501929085019060010161186e565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156118e1578351835292840192918401916001016118c5565b50909695505050505050565b801515811461018757600080fd5b60008060006060848603121561191057600080fd5b83359250602084013567ffffffffffffffff81111561192e57600080fd5b61193a868287016116e9565b925050604084013561194b816118ed565b809150509250925092565b634e487b7160e01b600052603260045260246000fd5b6000825161197e8184602087016115d2565b9190910192915050565b805160208083015191908110156114ff5760001960209190910360031b1b16919050565b600181811c908216806119c057607f821691505b6020821081036114ff57634e487b7160e01b600052602260045260246000fd5b601f82111561023a576000816000526020600020601f850160051c81016020861015611a095750805b601f850160051c820191505b81811015611a2857828155600101611a15565b505050505050565b815167ffffffffffffffff811115611a4a57611a4a6116a2565b611a5e81611a5884546119ac565b846119e0565b602080601f831160018114611a935760008415611a7b5750858301515b600019600386901b1c1916600185901b178555611a28565b600085815260208120601f198616915b82811015611ac257888601518255948401946001909101908401611aa3565b5085821015611ae05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354611afe816119ac565b60018281168015611b165760018114611b2b57611b5a565b60ff1984168752821515830287019450611b5a565b8760005260208060002060005b85811015611b515781548a820152908401908201611b38565b50505082870194505b50929695505050505050565b80516001600160a01b0381168114611b7d57600080fd5b919050565b600060208284031215611b9457600080fd5b6109a482611b66565b600060208284031215611baf57600080fd5b81516109a4816118ed565b60006060820185835260206060602085015281865180845260808601915060208801935060005b81811015611c065784516001600160a01b031683529383019391830191600101611be1565b5050809350505050826040830152949350505050565b60006020808385031215611c2f57600080fd5b825167ffffffffffffffff811115611c4657600080fd5b8301601f81018513611c5757600080fd5b8051611c656117f482611759565b81815260059190911b82018301908381019087831115611c8457600080fd5b928401925b82841015611ca957611c9a84611b66565b82529284019290840190611c89565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156101f7576101f7611cb4565b818103818111156101f7576101f7611cb4565b634e487b7160e01b600052603160045260246000fdfe804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504300","sourceMap":"398:1449:201:-:0;;;;;;;;;;;;-1:-1:-1;385:22:71;:20;:22::i;:::-;398:1449:201;;1653:314:85;303:66:86;1779:14:85;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:85;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:85;1898:16;1886:28;;;;;1927:29;;158:42:516;;;1927:29:85;;146:2:516;131:18;1927:29:85;;;;;;;1844:119;1694:273;1653:314::o;14:192:516:-;398:1449:201;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100885760003560e01c80639575f6ac1161005b5780639575f6ac146100f15780639935218314610106578063b9de615914610126578063ef86d6961461013957600080fd5b806302da0e511461008d57806337644cf7146100a2578063831c2b82146100b5578063921f7175146100de575b600080fd5b6100a061009b366004611597565b61014c565b005b6100a06100b03660046115b0565b61018a565b6100c86100c3366004611597565b6101cb565b6040516100d5919061168f565b60405180910390f35b6100a06100ec36600461177d565b6101fd565b6100f961023f565b6040516100d59190611845565b610119610114366004611597565b61024e565b6040516100d591906118a9565b6100a06101343660046115b0565b610259565b6100a06101473660046118fb565b610296565b61017e6040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b610187816102fb565b50565b6101bd826040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b81525061033c565b6101c78282610363565b5050565b60408051608081018252600080825260208201526060918101829052818101919091526101f7826103ad565b92915050565b61022f6040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b61023a838383610414565b505050565b6060610249610465565b905090565b60606101f78261059d565b61028c826040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b81525061033c565b6101c782826105a8565b6102c86040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b61023a8383836105ea565b6102de600082610627565b61018757604051630ce39a4b60e21b815260040160405180910390fd5b610304816106ab565b60405181815233907f3a3f387aa42656bc1732adfc7aea5cde9ccc05a59f9af9c29ebfa68e66383e939060200160405180910390a250565b6103468282610627565b6101c757604051630ce39a4b60e21b815260040160405180910390fd5b61036d82826107a2565b604080518381526020810183905233917f2b10481523b59a7978f8ab73b237349b0f38c801f6094bdc8994d379c067d71391015b60405180910390a25050565b60408051608081018252600080825260208201526060918101829052818101919091526000806103dc84610833565b925092505060006103ec85610953565b6040805160808101825296875292151560208701529185019290925260608401525090919050565b61041f8260006109ab565b61042a8383836109cf565b60405183815233907fdd6c5b83be3557f8b2674712946f9f05dcd882b82bfd58b9539b9706efd35d8c906020015b60405180910390a2505050565b60606000610471610b09565b90506000815167ffffffffffffffff81111561048f5761048f6116a2565b6040519080825280602002602001820160405280156104e357816020015b60408051608081018252600080825260208201526060918101829052818101919091528152602001906001900390816104ad5790505b50905060005b825181101561059657600080600061051986858151811061050c5761050c611956565b6020026020010151610833565b925092509250600061054387868151811061053657610536611956565b6020026020010151610953565b9050604051806080016040528085815260200183151581526020018481526020018281525086868151811061057a5761057a611956565b60200260200101819052505050505080806001019150506104e9565b5092915050565b60606101f782610953565b6105b28282610b29565b604080518381526020810183905233917faee688d80dbf97230e5d2b4b06aa7074bfe38ddd8abf856551177db30395612991016103a1565b6105f5838383610bb9565b60405183815233907f94af4a611b3fb1eaa653a6b29f82b71bcea25ca378171c5f059010fa18e0716e90602001610458565b60003380610633610c6e565b6001600160a01b031614806106a357507fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff161580156106a357506106a3848285604051602001610686919061196c565b60405160208183030381529060405261069e90611988565b610d32565b949350505050565b6106b481610fdf565b600080516020611d078339815191526106cd8183611016565b5060408051602080820183526000808352858152600280860190925292909220909101906106fb9082611a30565b50600082815260028083016020526040822060018101805460ff19169055828155919061072a90830182611549565b50506000828152600382016020526040812061074590611022565b905060005b815181101561079c5761079382828151811061076857610768611956565b602002602001015184600301600087815260200190815260200160002061101690919063ffffffff16565b5060010161074a565b50505050565b6107ab82610fdf565b6107b48261102f565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d07833981519152906107fb9083611091565b15610819576040516302369ff360e41b815260040160405180910390fd5b6000838152600382016020526040902061079c90836110a9565b60006060600061084284610fdf565b60008481527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430260209081526040808320815160608101835281548152600182015460ff16151593810193909352600281018054600080516020611d07833981519152959493840191906108b4906119ac565b80601f01602080910402602001604051908101604052809291908181526020018280546108e0906119ac565b801561092d5780601f106109025761010080835404028352916020019161092d565b820191906000526020600020905b81548152906001019060200180831161091057829003601f168201915b505050919092525050815160408301516020909301519099929850965090945050505050565b606061095e82610fdf565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d07833981519152906109a490611022565b9392505050565b8151829082111561023a576040516374eb20a760e01b815260040160405180910390fd5b6109d8836110b5565b600080516020611d078339815191526109f181856110a9565b50604080516060810182528581526000602080830182815283850188815289845260028781019093529490922083518155915160018301805460ff191691151591909117905592519192909190820190610a4b9082611a30565b5090505060005b8251811015610b0257610a9b838281518110610a7057610a70611956565b602002602001015183600301600088815260200190815260200160002061109190919063ffffffff16565b15610ab9576040516302369ff360e41b815260040160405180910390fd5b610af9838281518110610ace57610ace611956565b60200260200101518360030160008881526020019081526020016000206110a990919063ffffffff16565b50600101610a52565b5050505050565b6060600080516020611d07833981519152610b2381611022565b91505090565b610b3282610fdf565b610b3b8261102f565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d0783398151915290610b829083611091565b610b9f576040516333cb039f60e11b815260040160405180910390fd5b6000838152600382016020526040902061079c9083611016565b610bc283610fdf565b60008381527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504302602052604090208251600080516020611d07833981519152919015801590610c2f575080600201604051610c1c9190611af0565b6040518091039020848051906020012014155b15610c445760028101610c428582611a30565b505b600181015460ff16151583151514610b0257600101805460ff191692151592909217909155505050565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190611b82565b600080610d3d610c6e565b90506000610d4a856110eb565b80519091506000610d5961126a565b805190915060005b83811015610e18576000858281518110610d7d57610d7d611956565b60200260200101519050866001600160a01b0316816001600160a01b031603610db05760019750505050505050506109a4565b60005b83811015610e0e57816001600160a01b0316610de7868381518110610dda57610dda611956565b6020026020010151611295565b6001600160a01b031603610e06576000985050505050505050506109a4565b600101610db3565b5050600101610d61565b507fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006000610e657fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931016112a0565b905060005b81811015610fcd5760008381610e8360018301856112aa565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015610f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f309190611b9d565b158015610fad575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401610f6c93929190611bba565b602060405180830381865afa158015610f89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fad9190611b9d565b15610fc457600199505050505050505050506109a4565b50600101610e6a565b5060009b9a5050505050505050505050565b610ff981600080516020611d078339815191525b90611091565b6101875760405163560b4b4160e11b815260040160405180910390fd5b60006109a483836112b6565b606060006109a4836113a9565b60008181527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af5185043026020526040902060010154600080516020611d078339815191529060ff16156101c757604051636ce0028960e11b815260040160405180910390fd5b600081815260018301602052604081205415156109a4565b60006109a48383611405565b6110cd81600080516020611d07833981519152610ff3565b1561018757604051632324f7d960e21b815260040160405180910390fd5b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa158015611160573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111889190810190611c1c565b8051909150600061119a826001611cca565b67ffffffffffffffff8111156111b2576111b26116a2565b6040519080825280602002602001820160405280156111db578160200160208202803683370190505b50905060005b82811015611235578381815181106111fb576111fb611956565b602002602001015182828151811061121557611215611956565b6001600160a01b03909216602092830291909101909101526001016111e1565b508581838151811061124957611249611956565b6001600160a01b039092166020928302919091019091015295945050505050565b60606102497f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611022565b60006101f782611454565b60006101f7825490565b60006109a4838361151f565b6000818152600183016020526040812054801561139f5760006112da600183611cdd565b85549091506000906112ee90600190611cdd565b905080821461135357600086600001828154811061130e5761130e611956565b906000526020600020015490508087600001848154811061133157611331611956565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061136457611364611cf0565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506101f7565b60009150506101f7565b6060816000018054806020026020016040519081016040528092919081815260200182805480156113f957602002820191906000526020600020905b8154815260200190600101908083116113e5575b50505050509050919050565b600081815260018301602052604081205461144c575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556101f7565b5060006101f7565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b8316900361150557816000036114ff57805483106114db57604051636f96cda160e11b815260040160405180910390fd5b5b6000199092016000818152600484016020526040902054909290915081156114dc575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b600082600001828154811061153657611536611956565b9060005260206000200154905092915050565b508054611555906119ac565b6000825580601f10611565575050565b601f01602090049060005260206000209081019061018791905b80821115611593576000815560010161157f565b5090565b6000602082840312156115a957600080fd5b5035919050565b600080604083850312156115c357600080fd5b50508035926020909101359150565b60005b838110156115ed5781810151838201526020016115d5565b50506000910152565b805182526000602080830151151581850152604083015160806040860152805180608087015261162c8160a088018585016115d2565b601f19601f820116860191505060a08101606085015160a087840301606088015281815180845260c0850191508583019450600093505b808410156116835784518252938501936001939093019290850190611663565b50979650505050505050565b6020815260006109a460208301846115f6565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156116e1576116e16116a2565b604052919050565b600082601f8301126116fa57600080fd5b813567ffffffffffffffff811115611714576117146116a2565b611727601f8201601f19166020016116b8565b81815284602083860101111561173c57600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff821115611773576117736116a2565b5060051b60200190565b60008060006060848603121561179257600080fd5b8335925060208085013567ffffffffffffffff808211156117b257600080fd5b6117be888389016116e9565b945060408701359150808211156117d457600080fd5b508501601f810187136117e657600080fd5b80356117f96117f482611759565b6116b8565b81815260059190911b8201830190838101908983111561181857600080fd5b928401925b828410156118365783358252928401929084019061181d565b80955050505050509250925092565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561189c57603f1988860301845261188a8583516115f6565b9450928501929085019060010161186e565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156118e1578351835292840192918401916001016118c5565b50909695505050505050565b801515811461018757600080fd5b60008060006060848603121561191057600080fd5b83359250602084013567ffffffffffffffff81111561192e57600080fd5b61193a868287016116e9565b925050604084013561194b816118ed565b809150509250925092565b634e487b7160e01b600052603260045260246000fd5b6000825161197e8184602087016115d2565b9190910192915050565b805160208083015191908110156114ff5760001960209190910360031b1b16919050565b600181811c908216806119c057607f821691505b6020821081036114ff57634e487b7160e01b600052602260045260246000fd5b601f82111561023a576000816000526020600020601f850160051c81016020861015611a095750805b601f850160051c820191505b81811015611a2857828155600101611a15565b505050505050565b815167ffffffffffffffff811115611a4a57611a4a6116a2565b611a5e81611a5884546119ac565b846119e0565b602080601f831160018114611a935760008415611a7b5750858301515b600019600386901b1c1916600185901b178555611a28565b600085815260208120601f198616915b82811015611ac257888601518255948401946001909101908401611aa3565b5085821015611ae05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354611afe816119ac565b60018281168015611b165760018114611b2b57611b5a565b60ff1984168752821515830287019450611b5a565b8760005260208060002060005b85811015611b515781548a820152908401908201611b38565b50505082870194505b50929695505050505050565b80516001600160a01b0381168114611b7d57600080fd5b919050565b600060208284031215611b9457600080fd5b6109a482611b66565b600060208284031215611baf57600080fd5b81516109a4816118ed565b60006060820185835260206060602085015281865180845260808601915060208801935060005b81811015611c065784516001600160a01b031683529383019391830191600101611be1565b5050809350505050826040830152949350505050565b60006020808385031215611c2f57600080fd5b825167ffffffffffffffff811115611c4657600080fd5b8301601f81018513611c5757600080fd5b8051611c656117f482611759565b81815260059190911b82018301908381019087831115611c8457600080fd5b928401925b82841015611ca957611c9a84611b66565b82529284019290840190611c89565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156101f7576101f7611cb4565b818103818111156101f7576101f7611cb4565b634e487b7160e01b600052603160045260246000fdfe804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504300","sourceMap":"398:1449:201:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1157:140;;;;;;:::i;:::-;;:::i;:::-;;1301:188;;;;;;:::i;:::-;;:::i;691:134::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;462:225;;;;;;:::i;:::-;;:::i;829:105::-;;;:::i;:::-;;;;;;;:::i;1493:150::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1647:198::-;;;;;;:::i;:::-;;:::i;938:215::-;;;;;;:::i;:::-;;:::i;1157:140::-;1214:47;1234:26;;;;;;;;;;;;;-1:-1:-1;;;1234:26:201;;;1214:19;:47::i;:::-;1267:25;1282:9;1267:14;:25::i;:::-;1157:140;:::o;1301:188::-;1377:65;1404:9;1415:26;;;;;;;;;;;;;-1:-1:-1;;;1415:26:201;;;1377;:65::i;:::-;1448:36;1466:9;1477:6;1448:17;:36::i;:::-;1301:188;;:::o;691:134::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;798:22:201;810:9;798:11;:22::i;:::-;791:29;691:134;-1:-1:-1;;691:134:201:o;462:225::-;585:47;605:26;;;;;;;;;;;;;-1:-1:-1;;;605:26:201;;;585:19;:47::i;:::-;638:44;653:9;664:8;674:7;638:14;:44::i;:::-;462:225;;;:::o;829:105::-;875:25;915:14;:12;:14::i;:::-;908:21;;829:105;:::o;1493:150::-;1570:24;1609:29;1628:9;1609:18;:29::i;1647:198::-;1728:65;1755:9;1766:26;;;;;;;;;;;;;-1:-1:-1;;;1766:26:201;;;1728;:65::i;:::-;1799:41;1822:9;1833:6;1799:22;:41::i;938:215::-;1050:47;1070:26;;;;;;;;;;;;;-1:-1:-1;;;1070:26:201;;;1050:19;:47::i;:::-;1103:45;1118:9;1129:8;1139;1103:14;:45::i;3809:164:192:-;3889:31;1445:3;3909:10;3889;:31::i;:::-;3884:85;;3937:25;;-1:-1:-1;;;3937:25:192;;;;;;;;;;;1883:150:198;1941:39;1970:9;1941:28;:39::i;:::-;1991:37;;6633:25:516;;;2006:10:198;;1991:37;;6621:2:516;6606:18;1991:37:198;;;;;;;1883:150;:::o;4340:204:192:-;4458:33;4469:9;4480:10;4458;:33::i;:::-;4453:87;;4508:25;;-1:-1:-1;;;4508:25:192;;;;;;;;;;;2198:190:198;2275:50;2307:9;2318:6;2275:31;:50::i;:::-;2336:47;;;6843:25:516;;;6899:2;6884:18;;6877:34;;;2353:10:198;;2336:47;;6816:18:516;2336:47:198;;;;;;;;2198:190;;:::o;595:417::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;699:22:198;723:13;740:48;773:9;740:25;:48::i;:::-;696:92;;;;;795:24;822:43;855:9;822:32;:43::i;:::-;885:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;885:122:198;;595:417;-1:-1:-1;595:417:198:o;316:275::-;440:34;462:8;472:1;440:21;:34::i;:::-;480:58;509:9;520:8;530:7;480:28;:58::i;:::-;549:37;;6633:25:516;;;564:10:198;;549:37;;6621:2:516;6606:18;549:37:198;;;;;;;;316:275;;;:::o;1016:634::-;1063:16;1087:27;1117:30;:28;:30::i;:::-;1087:60;;1154:25;1196:10;:17;1182:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1182:32:198;;;;;;;;;;;;;;;;1154:60;;1226:9;1221:403;1245:10;:17;1241:1;:21;1221:403;;;1278:10;1290:22;1314:13;1331:49;1366:10;1377:1;1366:13;;;;;;;;:::i;:::-;;;;;;;1331:34;:49::i;:::-;1277:103;;;;;;1389:24;1416:63;1458:10;1469:1;1458:13;;;;;;;;:::i;:::-;;;;;;;1416:32;:63::i;:::-;1389:90;;1502:115;;;;;;;;1524:2;1502:115;;;;1546:8;1502:115;;;;;;1574:8;1502:115;;;;1601:7;1502:115;;;1488:8;1497:1;1488:11;;;;;;;;:::i;:::-;;;;;;:129;;;;1269:355;;;;1264:3;;;;;;;1221:403;;;-1:-1:-1;1637:8:198;1016:634;-1:-1:-1;;1016:634:198:o;2037:157::-;2115:16;2146:43;2179:9;2146:32;:43::i;2392:202::-;2474:55;2511:9;2522:6;2474:36;:55::i;:::-;2540:49;;;6843:25:516;;;6899:2;6884:18;;6877:34;;;2559:10:198;;2540:49;;6816:18:516;2540:49:198;6669:248:516;1654:225:198;1767:59;1796:9;1807:8;1817;1767:28;:59::i;:::-;1837:37;;6633:25:516;;;1852:10:198;;1837:37;;6621:2:516;6606:18;1837:37:198;6487:177:516;3520:285:192;3620:4;3649:10;;3679:8;:6;:8::i;:::-;-1:-1:-1;;;;;3679:18:192;;:121;;;-1:-1:-1;293:66:111;526:31:109;;;3708:10:192;:91;;;;;3730:69;3742:9;3753:6;3786:10;3769:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;3761:37;;;:::i;:::-;3730:11;:69::i;:::-;3666:134;3520:285;-1:-1:-1;;;;3520:285:192:o;2492:579:199:-;2549:29;2568:9;2549:18;:29::i;:::-;-1:-1:-1;;;;;;;;;;;2655:36:199;377:66:200;2681:9:199;2655:25;:36::i;:::-;-1:-1:-1;2697:44:199;;;;;;;;;-1:-1:-1;2697:44:199;;;:30;;;:19;;;;:30;;;;;;;:39;;;;:44;;:39;:44;:::i;:::-;-1:-1:-1;2789:5:199;2747:30;;;:19;;;;:30;;;;;:39;;;:47;;-1:-1:-1;;2747:47:199;;;2800:37;;;2747:30;2789:5;2800:37;;;;2789:5;2800:37;:::i;:::-;-1:-1:-1;;2881:22:199;2906:35;;;:24;;;:35;;;;;:44;;:42;:44::i;:::-;2881:69;;2962:9;2957:110;2981:5;:12;2977:1;:16;2957:110;;;3008:52;3051:5;3057:1;3051:8;;;;;;;;:::i;:::-;;;;;;;3008:7;:24;;:35;3033:9;3008:35;;;;;;;;;;;:42;;:52;;;;:::i;:::-;-1:-1:-1;2995:3:199;;2957:110;;;;2543:528;;2492:579;:::o;4059:438::-;4135:29;4154:9;4135:18;:29::i;:::-;4170:34;4194:9;4170:23;:34::i;:::-;4211:37;4328:35;;;:24;:35;;;;;-1:-1:-1;;;;;;;;;;;377:66:200;4328:52:199;;4373:6;4328:44;:52::i;:::-;4324:115;;;4397:35;;-1:-1:-1;;;4397:35:199;;;;;;;;;;;4324:115;4445:35;;;;:24;;;:35;;;;;:47;;4485:6;4445:39;:47::i;1511:411::-;1581:10;1593:22;1617:13;1638:29;1657:9;1638:18;:29::i;:::-;1674:37;1787:30;;;:19;:30;;;;;;;;1743:74;;;;;;;;;;;;;;;;;;;;;;;;;;1787:19;1743:74;;;;-1:-1:-1;;;;;;;;;;;377:66:200;1674:37:199;1743:74;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1743:74:199;;;;-1:-1:-1;;1829:14:199;;1860:20;;;;1897;;;;;1829:14;;1860:20;;-1:-1:-1;1897:20:199;-1:-1:-1;1511:411:199;;-1:-1:-1;;;;;1511:411:199:o;4943:262::-;5020:16;5044:29;5063:9;5044:18;:29::i;:::-;5080:37;5156:35;;;:24;:35;;;;;-1:-1:-1;;;;;;;;;;;377:66:200;5156:44:199;;:42;:44::i;:::-;5149:51;4943:262;-1:-1:-1;;;4943:262:199:o;425:183:273:-;541:15;;526:4;;541:21;-1:-1:-1;537:66:273;;;571:32;;-1:-1:-1;;;571:32:273;;;;;;;;;;;821:686:199;944:23;957:9;944:12;:23::i;:::-;-1:-1:-1;;;;;;;;;;;1044:33:199;377:66:200;1067:9:199;1044:22;:33::i;:::-;-1:-1:-1;1116:100:199;;;;;;;;;;;-1:-1:-1;1116:100:199;;;;;;;;;;;;;1083:30;;;:19;;;;:30;;;;;;;:133;;;;;;1116:100;1083:133;;;;-1:-1:-1;;1083:133:199;;;;;;;;;;;;1116:100;;1083:30;;:133;;;;;;;;:::i;:::-;;;;;1228:9;1223:280;1247:7;:14;1243:1;:18;1223:280;;;1329:56;1374:7;1382:1;1374:10;;;;;;;;:::i;:::-;;;;;;;1329:7;:24;;:35;1354:9;1329:35;;;;;;;;;;;:44;;:56;;;;:::i;:::-;1325:112;;;1402:35;;-1:-1:-1;;;1402:35:199;;;;;;;;;;;1325:112;1445:51;1485:7;1493:1;1485:10;;;;;;;;:::i;:::-;;;;;;;1445:7;:24;;:35;1470:9;1445:35;;;;;;;;;;;:39;;:51;;;;:::i;:::-;-1:-1:-1;1263:3:199;;1223:280;;;;938:569;821:686;;;:::o;3075:180::-;3123:16;-1:-1:-1;;;;;;;;;;;3223:27:199;377:66:200;3223:25:199;:27::i;:::-;3216:34;;;3075:180;:::o;4501:438::-;4582:29;4601:9;4582:18;:29::i;:::-;4617:34;4641:9;4617:23;:34::i;:::-;4657:37;4768:35;;;:24;:35;;;;;-1:-1:-1;;;;;;;;;;;377:66:200;4768:52:199;;4813:6;4768:44;:52::i;:::-;4763:115;;4837:34;;-1:-1:-1;;;4837:34:199;;;;;;;;;;;4763:115;4884:35;;;;:24;;;:35;;;;;:50;;4927:6;4884:42;:50::i;1926:562::-;2038:29;2057:9;2038:18;:29::i;:::-;2074:37;2189:30;;;:19;:30;;;;;2237:22;;-1:-1:-1;;;;;;;;;;;377:66:200;2189:30:199;2237:26;;;;:104;;;2319:11;:20;;2303:38;;;;;;:::i;:::-;;;;;;;;2289:8;2273:26;;;;;;:68;;2237:104;2226:168;;;2356:20;;;:31;2379:8;2356:20;:31;:::i;:::-;;2226:168;2404:20;;;;;;:32;;;;;;2400:84;;2446:20;;:31;;-1:-1:-1;;2446:31:199;;;;;;;;;;;-1:-1:-1;;;1926:562:199:o;724:189:105:-;786:67;;;;;;;;302:66:107;786:67:105;-1:-1:-1;;;;;786:67:105;;;;;;;;;;;;;866:42;;-1:-1:-1;;;866:42:105;;;;;6633:25:516;;;;866:42:105;;765:13;;866:30;;6606:18:516;;;;;866:42:105;;;;;;786:67;866:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1566:1252:192:-;1679:4;1691:13;1707:8;:6;:8::i;:::-;1691:24;;1722;1749:31;1775:4;1749:25;:31::i;:::-;1816:14;;1722:58;;-1:-1:-1;1786:27:192;1869:17;:15;:17::i;:::-;1918:19;;1837:49;;-1:-1:-1;1892:23:192;1944:320;1968:19;1964:1;:23;1944:320;;;2002:14;2019:7;2027:1;2019:10;;;;;;;;:::i;:::-;;;;;;;2002:27;;2052:5;-1:-1:-1;;;;;2042:15:192;:6;-1:-1:-1;;;;;2042:15:192;;2038:51;;2076:4;2069:11;;;;;;;;;;;2038:51;2127:9;2122:136;2142:15;2138:1;:19;2122:136;;;2207:6;-1:-1:-1;;;;;2178:35:192;:25;2187:12;2200:1;2187:15;;;;;;;;:::i;:::-;;;;;;;2178:8;:25::i;:::-;-1:-1:-1;;;;;2178:35:192;;2174:76;;2234:5;2227:12;;;;;;;;;;;;2174:76;2159:3;;2122:136;;;-1:-1:-1;;1989:3:192;;1944:320;;;-1:-1:-1;483:66:211;2308:44:192;2432:24;:15;:22;:24::i;:::-;2403:53;;2468:9;2463:332;2487:18;2483:1;:22;2463:332;;;2520:47;2570:2;2520:47;2603:21;:15;;;2622:1;2603:18;:21::i;:::-;-1:-1:-1;;;;;2570:62:192;;;;;;;;;;;;;;;;;-1:-1:-1;2570:62:192;2520:112;;;;;;;;;;;;;;;;-1:-1:-1;;;2520:112:192;;;;;;;;;;-1:-1:-1;;;2520:112:192;;;;;;;;;;;;2654:28;;-1:-1:-1;;;2654:28:192;;;;2520:112;;-1:-1:-1;2520:112:192;;2654:26;;:28;;;;;;;;;;;2520:112;2654:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2653:29;:97;;;;;2694:1;:13;;;-1:-1:-1;;;;;2694:24:192;;2719:9;2730:7;2739:10;2694:56;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2640:149;;;2776:4;2769:11;;;;;;;;;;;;;2640:149;-1:-1:-1;2507:3:192;;2463:332;;;-1:-1:-1;2808:5:192;;1566:1252;-1:-1:-1;;;;;;;;;;;1566:1252:192:o;5855:224:199:-;5960:54;6004:9;-1:-1:-1;;;;;;;;;;;5960:23:199;:34;:43;:54::i;:::-;5955:120;;6031:37;;-1:-1:-1;;;6031:37:199;;;;;;;;;;;6221:129:449;6294:4;6317:26;6325:3;6337:5;6317:7;:26::i;12671:297::-;12731:16;12759:22;12784:19;12792:3;12784:7;:19::i;5383:246:199:-;5455:37;5529:30;;;:19;:30;;;;;:39;;;-1:-1:-1;;;;;;;;;;;377:66:200;5529:39:199;;5525:100;;;5585:33;;-1:-1:-1;;;5585:33:199;;;;;;;;;;;11317:144:449;11394:4;4360:21;;;:14;;;:21;;;;;;:26;;11417:37;4264:129;10804;10871:4;10894:32;10899:3;10919:5;10894:4;:32::i;5633:218:199:-;5731:54;5775:9;-1:-1:-1;;;;;;;;;;;5731:23:199;721:141:200;5731:54:199;5727:120;;;5802:38;;-1:-1:-1;;;5802:38:199;;;;;;;;;;;4548:533:192;4628:16;4652:14;294:66:224;4681:39:192;;;4760:28;;-1:-1:-1;;;4760:28:192;;-1:-1:-1;;;;;12877:32:516;;;4760:28:192;;;12859:51:516;4681:39:192;;;;-1:-1:-1;4681:39:192;;;;4760:22;;12832:18:516;;4760:28:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4760:28:192;;;;;;;;;;;;:::i;:::-;4824:20;;4727:61;;-1:-1:-1;4794:27:192;4892:23;4824:20;4914:1;4892:23;:::i;:::-;4878:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4878:38:192;;4851:65;;4927:9;4922:94;4946:19;4942:1;:23;4922:94;;;4993:13;5007:1;4993:16;;;;;;;;:::i;:::-;;;;;;;4980:7;4988:1;4980:10;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4980:29:192;;;:10;;;;;;;;;;;:29;4967:3;;4922:94;;;;5052:4;5021:7;5029:19;5021:28;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5021:35:192;;;:28;;;;;;;;;;;:35;5069:7;4548:533;-1:-1:-1;;;;;4548:533:192:o;1228:128:195:-;1278:16;1309:42;377:66:196;1309:40:195;:42::i;22045:138:129:-;22111:7;22149:27;22168:7;22149:18;:27::i;9117:115:449:-;9180:7;9206:19;9214:3;4556:18;;4474:107;9574:156;9648:7;9698:22;9702:3;9714:5;9698:3;:22::i;2815:1368::-;2881:4;3010:21;;;:14;;;:21;;;;;;3046:13;;3042:1135;;3413:18;3434:12;3445:1;3434:8;:12;:::i;:::-;3480:18;;3413:33;;-1:-1:-1;3460:17:449;;3480:22;;3501:1;;3480:22;:::i;:::-;3460:42;;3535:9;3521:10;:23;3517:378;;3564:17;3584:3;:11;;3596:9;3584:22;;;;;;;;:::i;:::-;;;;;;;;;3564:42;;3731:9;3705:3;:11;;3717:10;3705:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;3844:25;;;:14;;;:25;;;;;:36;;;3517:378;3973:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4076:3;:14;;:21;4091:5;4076:21;;;;;;;;;;;4069:28;;;4119:4;4112:11;;;;;;;3042:1135;4161:5;4154:12;;;;;5581:109;5637:16;5672:3;:11;;5665:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5581:109;;;:::o;2241:406::-;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:449;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:449;2618:12;;7836:1501:129;7974:32;8050:29;;;:20;:29;;;;;;;300:66:131;;-1:-1:-1;;;8115:24:129;;:29;;8111:1172;;8236:6;8246:1;8236:11;8232:791;;8276:16;;8265:27;;8261:83;;8313:31;;-1:-1:-1;;;8313:31:129;;;;;;;;;;;8261:83;8831:182;-1:-1:-1;;8910:9:129;;;8889:31;;;;:20;;;:31;;;;;;8910:9;;8889:31;;-1:-1:-1;8948:25:129;;8831:182;8948:25;;8987:13;7836:1501;;;:::o;8111:1172::-;7966:1323;9301:31;;-1:-1:-1;;;9301:31:129;;;;;;;;;;;4923:118:449;4990:7;5016:3;:11;;5028:5;5016:18;;;;;;;;:::i;:::-;;;;;;;;;5009:25;;4923:118;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:180:516:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:516;;14:180;-1:-1:-1;14:180:516:o;199:248::-;267:6;275;328:2;316:9;307:7;303:23;299:32;296:52;;;344:1;341;334:12;296:52;-1:-1:-1;;367:23:516;;;437:2;422:18;;;409:32;;-1:-1:-1;199:248:516:o;452:250::-;537:1;547:113;561:6;558:1;555:13;547:113;;;637:11;;;631:18;618:11;;;611:39;583:2;576:10;547:113;;;-1:-1:-1;;694:1:516;676:16;;669:27;452:250::o;707:1057::-;793:5;787:12;782:3;775:25;757:3;819:4;884:2;877:5;873:14;867:21;860:29;853:37;848:2;843:3;839:12;832:59;937:4;930:5;926:16;920:23;975:4;968;963:3;959:14;952:28;1009:12;1003:19;1054:6;1047:4;1042:3;1038:14;1031:30;1070:80;1143:6;1137:3;1132;1128:13;1123:2;1109:12;1105:21;1070:80;:::i;:::-;1203:2;1199:7;1194:2;1186:6;1182:15;1178:29;1173:3;1169:39;1159:49;;;1238:3;1234:2;1230:12;1290:4;1283:5;1279:16;1273:23;1346:3;1340;1336:2;1332:12;1328:22;1321:4;1316:3;1312:14;1305:46;1373:5;1409:14;1403:21;1447:8;1440:5;1433:23;1482:3;1478:2;1474:12;1465:21;;1529:2;1513:14;1509:23;1495:37;;1550:1;1541:10;;1560:177;1574:8;1571:1;1568:15;1560:177;;;1639:13;;1625:28;;1712:15;;;;1598:1;1591:9;;;;;1675:14;;;;1560:177;;;-1:-1:-1;1753:5:516;707:1057;-1:-1:-1;;;;;;;707:1057:516:o;1769:260::-;1950:2;1939:9;1932:21;1913:4;1970:53;2019:2;2008:9;2004:18;1996:6;1970:53;:::i;2034:127::-;2095:10;2090:3;2086:20;2083:1;2076:31;2126:4;2123:1;2116:15;2150:4;2147:1;2140:15;2166:275;2237:2;2231:9;2302:2;2283:13;;-1:-1:-1;;2279:27:516;2267:40;;2337:18;2322:34;;2358:22;;;2319:62;2316:88;;;2384:18;;:::i;:::-;2420:2;2413:22;2166:275;;-1:-1:-1;2166:275:516:o;2446:531::-;2489:5;2542:3;2535:4;2527:6;2523:17;2519:27;2509:55;;2560:1;2557;2550:12;2509:55;2596:6;2583:20;2622:18;2618:2;2615:26;2612:52;;;2644:18;;:::i;:::-;2688:55;2731:2;2712:13;;-1:-1:-1;;2708:27:516;2737:4;2704:38;2688:55;:::i;:::-;2768:2;2759:7;2752:19;2814:3;2807:4;2802:2;2794:6;2790:15;2786:26;2783:35;2780:55;;;2831:1;2828;2821:12;2780:55;2896:2;2889:4;2881:6;2877:17;2870:4;2861:7;2857:18;2844:55;2944:1;2919:16;;;2937:4;2915:27;2908:38;;;;2923:7;2446:531;-1:-1:-1;;;2446:531:516:o;2982:183::-;3042:4;3075:18;3067:6;3064:30;3061:56;;;3097:18;;:::i;:::-;-1:-1:-1;3142:1:516;3138:14;3154:4;3134:25;;2982:183::o;3170:1180::-;3282:6;3290;3298;3351:2;3339:9;3330:7;3326:23;3322:32;3319:52;;;3367:1;3364;3357:12;3319:52;3403:9;3390:23;3380:33;;3432:2;3485;3474:9;3470:18;3457:32;3508:18;3549:2;3541:6;3538:14;3535:34;;;3565:1;3562;3555:12;3535:34;3588:50;3630:7;3621:6;3610:9;3606:22;3588:50;:::i;:::-;3578:60;;3691:2;3680:9;3676:18;3663:32;3647:48;;3720:2;3710:8;3707:16;3704:36;;;3736:1;3733;3726:12;3704:36;-1:-1:-1;3759:24:516;;3814:4;3806:13;;3802:27;-1:-1:-1;3792:55:516;;3843:1;3840;3833:12;3792:55;3879:2;3866:16;3902:60;3918:43;3958:2;3918:43;:::i;:::-;3902:60;:::i;:::-;3996:15;;;4078:1;4074:10;;;;4066:19;;4062:28;;;4027:12;;;;4102:19;;;4099:39;;;4134:1;4131;4124:12;4099:39;4158:11;;;;4178:142;4194:6;4189:3;4186:15;4178:142;;;4260:17;;4248:30;;4211:12;;;;4298;;;;4178:142;;;4339:5;4329:15;;;;;;;3170:1180;;;;;:::o;4355:843::-;4549:4;4578:2;4618;4607:9;4603:18;4648:2;4637:9;4630:21;4671:6;4706;4700:13;4737:6;4729;4722:22;4775:2;4764:9;4760:18;4753:25;;4837:2;4827:6;4824:1;4820:14;4809:9;4805:30;4801:39;4787:53;;4875:2;4867:6;4863:15;4896:1;4906:263;4920:6;4917:1;4914:13;4906:263;;;5013:2;5009:7;4997:9;4989:6;4985:22;4981:36;4976:3;4969:49;5041:48;5082:6;5073;5067:13;5041:48;:::i;:::-;5031:58;-1:-1:-1;5147:12:516;;;;5112:15;;;;4942:1;4935:9;4906:263;;;-1:-1:-1;5186:6:516;;4355:843;-1:-1:-1;;;;;;;4355:843:516:o;5203:632::-;5374:2;5426:21;;;5496:13;;5399:18;;;5518:22;;;5345:4;;5374:2;5597:15;;;;5571:2;5556:18;;;5345:4;5640:169;5654:6;5651:1;5648:13;5640:169;;;5715:13;;5703:26;;5784:15;;;;5749:12;;;;5676:1;5669:9;5640:169;;;-1:-1:-1;5826:3:516;;5203:632;-1:-1:-1;;;;;;5203:632:516:o;5840:118::-;5926:5;5919:13;5912:21;5905:5;5902:32;5892:60;;5948:1;5945;5938:12;5963:519;6047:6;6055;6063;6116:2;6104:9;6095:7;6091:23;6087:32;6084:52;;;6132:1;6129;6122:12;6084:52;6168:9;6155:23;6145:33;;6229:2;6218:9;6214:18;6201:32;6256:18;6248:6;6245:30;6242:50;;;6288:1;6285;6278:12;6242:50;6311;6353:7;6344:6;6333:9;6329:22;6311:50;:::i;:::-;6301:60;;;6411:2;6400:9;6396:18;6383:32;6424:28;6446:5;6424:28;:::i;:::-;6471:5;6461:15;;;5963:519;;;;;:::o;6922:127::-;6983:10;6978:3;6974:20;6971:1;6964:31;7014:4;7011:1;7004:15;7038:4;7035:1;7028:15;7054:289;7185:3;7223:6;7217:13;7239:66;7298:6;7293:3;7286:4;7278:6;7274:17;7239:66;:::i;:::-;7321:16;;;;;7054:289;-1:-1:-1;;7054:289:516:o;7348:297::-;7466:12;;7513:4;7502:16;;;7496:23;;7466:12;7531:16;;7528:111;;;-1:-1:-1;;7605:4:516;7601:17;;;;7598:1;7594:25;7590:38;7579:50;;7348:297;-1:-1:-1;7348:297:516:o;7650:380::-;7729:1;7725:12;;;;7772;;;7793:61;;7847:4;7839:6;7835:17;7825:27;;7793:61;7900:2;7892:6;7889:14;7869:18;7866:38;7863:161;;7946:10;7941:3;7937:20;7934:1;7927:31;7981:4;7978:1;7971:15;8009:4;8006:1;7999:15;8161:543;8263:2;8258:3;8255:11;8252:446;;;8299:1;8323:5;8320:1;8313:16;8367:4;8364:1;8354:18;8437:2;8425:10;8421:19;8418:1;8414:27;8408:4;8404:38;8473:4;8461:10;8458:20;8455:47;;;-1:-1:-1;8496:4:516;8455:47;8551:2;8546:3;8542:12;8539:1;8535:20;8529:4;8525:31;8515:41;;8606:82;8624:2;8617:5;8614:13;8606:82;;;8669:17;;;8650:1;8639:13;8606:82;;;8610:3;;;8161:543;;;:::o;8880:1345::-;9006:3;9000:10;9033:18;9025:6;9022:30;9019:56;;;9055:18;;:::i;:::-;9084:97;9174:6;9134:38;9166:4;9160:11;9134:38;:::i;:::-;9128:4;9084:97;:::i;:::-;9236:4;;9293:2;9282:14;;9310:1;9305:663;;;;10012:1;10029:6;10026:89;;;-1:-1:-1;10081:19:516;;;10075:26;10026:89;-1:-1:-1;;8837:1:516;8833:11;;;8829:24;8825:29;8815:40;8861:1;8857:11;;;8812:57;10128:81;;9275:944;;9305:663;8108:1;8101:14;;;8145:4;8132:18;;-1:-1:-1;;9341:20:516;;;9459:236;9473:7;9470:1;9467:14;9459:236;;;9562:19;;;9556:26;9541:42;;9654:27;;;;9622:1;9610:14;;;;9489:19;;9459:236;;;9463:3;9723:6;9714:7;9711:19;9708:201;;;9784:19;;;9778:26;-1:-1:-1;;9867:1:516;9863:14;;;9879:3;9859:24;9855:37;9851:42;9836:58;9821:74;;9708:201;-1:-1:-1;;;;;9955:1:516;9939:14;;;9935:22;9922:36;;-1:-1:-1;8880:1345:516:o;10230:845::-;10360:3;10389:1;10422:6;10416:13;10452:36;10478:9;10452:36;:::i;:::-;10507:1;10524:17;;;10550:133;;;;10697:1;10692:358;;;;10517:533;;10550:133;-1:-1:-1;;10583:24:516;;10571:37;;10656:14;;10649:22;10637:35;;10628:45;;;-1:-1:-1;10550:133:516;;10692:358;10723:6;10720:1;10713:17;10753:4;10798;10795:1;10785:18;10825:1;10839:165;10853:6;10850:1;10847:13;10839:165;;;10931:14;;10918:11;;;10911:35;10974:16;;;;10868:10;;10839:165;;;10843:3;;;11033:6;11028:3;11024:16;11017:23;;10517:533;-1:-1:-1;11066:3:516;;10230:845;-1:-1:-1;;;;;;10230:845:516:o;11262:177::-;11341:13;;-1:-1:-1;;;;;11383:31:516;;11373:42;;11363:70;;11429:1;11426;11419:12;11363:70;11262:177;;;:::o;11444:208::-;11514:6;11567:2;11555:9;11546:7;11542:23;11538:32;11535:52;;;11583:1;11580;11573:12;11535:52;11606:40;11636:9;11606:40;:::i;11657:245::-;11724:6;11777:2;11765:9;11756:7;11752:23;11748:32;11745:52;;;11793:1;11790;11783:12;11745:52;11825:9;11819:16;11844:28;11866:5;11844:28;:::i;11907:801::-;12105:4;12153:2;12142:9;12138:18;12183:6;12172:9;12165:25;12209:2;12247;12242;12231:9;12227:18;12220:30;12270:6;12305;12299:13;12336:6;12328;12321:22;12374:3;12363:9;12359:19;12352:26;;12413:2;12405:6;12401:15;12387:29;;12434:1;12444:195;12458:6;12455:1;12452:13;12444:195;;;12523:13;;-1:-1:-1;;;;;12519:39:516;12507:52;;12614:15;;;;12579:12;;;;12555:1;12473:9;12444:195;;;12448:3;;12656;12648:11;;;;;12695:6;12690:2;12679:9;12675:18;12668:34;11907:801;;;;;;:::o;12921:905::-;13016:6;13047:2;13090;13078:9;13069:7;13065:23;13061:32;13058:52;;;13106:1;13103;13096:12;13058:52;13139:9;13133:16;13172:18;13164:6;13161:30;13158:50;;;13204:1;13201;13194:12;13158:50;13227:22;;13280:4;13272:13;;13268:27;-1:-1:-1;13258:55:516;;13309:1;13306;13299:12;13258:55;13338:2;13332:9;13361:60;13377:43;13417:2;13377:43;:::i;13361:60::-;13455:15;;;13537:1;13533:10;;;;13525:19;;13521:28;;;13486:12;;;;13561:19;;;13558:39;;;13593:1;13590;13583:12;13558:39;13617:11;;;;13637:159;13653:6;13648:3;13645:15;13637:159;;;13719:34;13749:3;13719:34;:::i;:::-;13707:47;;13670:12;;;;13774;;;;13637:159;;;13815:5;12921:905;-1:-1:-1;;;;;;;12921:905:516:o;13831:127::-;13892:10;13887:3;13883:20;13880:1;13873:31;13923:4;13920:1;13913:15;13947:4;13944:1;13937:15;13963:125;14028:9;;;14049:10;;;14046:36;;;14062:18;;:::i;14093:128::-;14160:9;;;14181:11;;;14178:37;;;14195:18;;:::i;14226:127::-;14287:10;14282:3;14278:20;14275:1;14268:31;14318:4;14315:1;14308:15;14342:4;14339:1;14332:15","linkReferences":{}},"methodIdentifiers":{"addRoleToChannel(bytes32,uint256)":"37644cf7","createChannel(bytes32,string,uint256[])":"921f7175","getChannel(bytes32)":"831c2b82","getChannels()":"9575f6ac","getRolesByChannel(bytes32)":"99352183","removeChannel(bytes32)":"02da0e51","removeRoleFromChannel(bytes32,uint256)":"b9de6159","updateChannel(bytes32,string,bool)":"ef86d696"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ApprovalCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BalanceQueryForZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__AlreadyBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Banning__CannotBanSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__NotBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChannelService__ChannelAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChannelService__ChannelDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChannelService__ChannelDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChannelService__RoleAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChannelService__RoleDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC5643__DurationZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC5643__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC5643__NotApprovedOrOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC5643__SubscriptionNotRenewable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__ValueAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintERC2309QuantityExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintZeroQuantity\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnershipNotInitializedForExtraData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__Paused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFromIncorrectOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC721ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"URIQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Validator__InvalidStringLength\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"}],\"name\":\"ChannelCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"}],\"name\":\"ChannelRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"ChannelRoleAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"ChannelRoleRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"}],\"name\":\"ChannelUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"toTokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"ConsecutiveTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"expiration\",\"type\":\"uint64\"}],\"name\":\"SubscriptionUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Unbanned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"addRoleToChannel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"uint256[]\",\"name\":\"roleIds\",\"type\":\"uint256[]\"}],\"name\":\"createChannel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"}],\"name\":\"getChannel\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"uint256[]\",\"name\":\"roleIds\",\"type\":\"uint256[]\"}],\"internalType\":\"struct IChannelBase.Channel\",\"name\":\"channel\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChannels\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"uint256[]\",\"name\":\"roleIds\",\"type\":\"uint256[]\"}],\"internalType\":\"struct IChannelBase.Channel[]\",\"name\":\"channels\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"}],\"name\":\"getRolesByChannel\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"roleIds\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"}],\"name\":\"removeChannel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"removeRoleFromChannel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"}],\"name\":\"updateChannel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"ConsecutiveTransfer(uint256,uint256,address,address)\":{\"details\":\"Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, as defined in the [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. See {_mintERC2309} for more details.\"},\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"},\"SubscriptionUpdate(uint256,uint64)\":{\"details\":\"When a subscription is canceled, the expiration value should also be 0.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"addRoleToChannel(bytes32,uint256)\":{\"params\":{\"channelId\":\"the channelId to add the role to\",\"roleId\":\"the roleId to add to the channel\"}},\"createChannel(bytes32,string,uint256[])\":{\"params\":{\"channelId\":\"the channelId of the channel\",\"metadata\":\"the metadata of the channel\",\"roleIds\":\"the roleIds to add to the channel\"}},\"getChannel(bytes32)\":{\"params\":{\"channelId\":\"the channelId to get\"},\"returns\":{\"channel\":\"the channel\"}},\"getChannels()\":{\"returns\":{\"channels\":\"an array of all channels\"}},\"getRolesByChannel(bytes32)\":{\"params\":{\"channelId\":\"the channelId to get the roles for\"},\"returns\":{\"roleIds\":\"an array of roleIds for the channel\"}},\"removeChannel(bytes32)\":{\"params\":{\"channelId\":\"the channelId to remove\"}},\"removeRoleFromChannel(bytes32,uint256)\":{\"params\":{\"channelId\":\"the channelId to remove the role from\",\"roleId\":\"the roleId to remove from the channel\"}},\"updateChannel(bytes32,string,bool)\":{\"params\":{\"channelId\":\"the channelId to update\",\"disabled\":\"whether or not the channel is disabled\",\"metadata\":\"the new metadata of the channel\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ApprovalCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"ApprovalQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"BalanceQueryForZeroAddress()\":[{\"notice\":\"Cannot query the balance for the zero address.\"}],\"MintERC2309QuantityExceedsLimit()\":[{\"notice\":\"The `quantity` minted with ERC2309 exceeds the safety limit.\"}],\"MintToZeroAddress()\":[{\"notice\":\"Cannot mint to the zero address.\"}],\"MintZeroQuantity()\":[{\"notice\":\"The quantity of tokens minted must be more than zero.\"}],\"OwnerQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"OwnershipNotInitializedForExtraData()\":[{\"notice\":\"The `extraData` cannot be set on an unintialized ownership slot.\"}],\"TransferCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"TransferFromIncorrectOwner()\":[{\"notice\":\"The token must be owned by `from`.\"}],\"TransferToNonERC721ReceiverImplementer()\":[{\"notice\":\"Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"notice\":\"Cannot transfer to the zero address.\"}],\"URIQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}]},\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"},\"SubscriptionUpdate(uint256,uint64)\":{\"notice\":\"Emitted when a subscription expiration changes\"}},\"kind\":\"user\",\"methods\":{\"addRoleToChannel(bytes32,uint256)\":{\"notice\":\"adds a role to a channel\"},\"createChannel(bytes32,string,uint256[])\":{\"notice\":\"creates a channel\"},\"getChannel(bytes32)\":{\"notice\":\"gets a channel\"},\"getChannels()\":{\"notice\":\"gets all channels\"},\"getRolesByChannel(bytes32)\":{\"notice\":\"gets all roles for a channel\"},\"removeChannel(bytes32)\":{\"notice\":\"removes a channel\"},\"removeRoleFromChannel(bytes32,uint256)\":{\"notice\":\"removes a role from a channel\"},\"updateChannel(bytes32,string,bool)\":{\"notice\":\"updates a channel\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/facets/channels/Channels.sol\":\"Channels\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol\":{\"keccak256\":\"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f\",\"dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol\":{\"keccak256\":\"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5\",\"dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol\":{\"keccak256\":\"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc\",\"dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf\"]},\"contracts/src/diamond/facets/pausable/IPausable.sol\":{\"keccak256\":\"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6\",\"dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM\"]},\"contracts/src/diamond/facets/pausable/PausableBase.sol\":{\"keccak256\":\"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c\",\"dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1\"]},\"contracts/src/diamond/facets/pausable/PausableStorage.sol\":{\"keccak256\":\"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b\",\"dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL\"]},\"contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol\":{\"keccak256\":\"0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714\",\"dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8\"]},\"contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol\":{\"keccak256\":\"0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7\",\"dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7\"]},\"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol\":{\"keccak256\":\"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f\",\"dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol\":{\"keccak256\":\"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa\",\"dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol\":{\"keccak256\":\"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c\",\"dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu\"]},\"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol\":{\"keccak256\":\"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e\",\"dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM\"]},\"contracts/src/factory/facets/wallet-link/IWalletLink.sol\":{\"keccak256\":\"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13\",\"dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR\"]},\"contracts/src/spaces/entitlements/IEntitlement.sol\":{\"keccak256\":\"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3\",\"dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf\"]},\"contracts/src/spaces/facets/Entitled.sol\":{\"keccak256\":\"0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7\",\"dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc\"]},\"contracts/src/spaces/facets/Permissions.sol\":{\"keccak256\":\"0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721\",\"dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp\"]},\"contracts/src/spaces/facets/banning/BanningBase.sol\":{\"keccak256\":\"0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d\",\"dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN\"]},\"contracts/src/spaces/facets/banning/BanningStorage.sol\":{\"keccak256\":\"0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0\",\"dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1\"]},\"contracts/src/spaces/facets/banning/IBanning.sol\":{\"keccak256\":\"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419\",\"dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6\"]},\"contracts/src/spaces/facets/channels/ChannelBase.sol\":{\"keccak256\":\"0x51d5d8335e585b052a43afc3b5018429c2dd22f67e4b60b3f8f659d9d0b0ec08\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b6d5953dfa9b5e857aaf153df1c1d04ece5fb9d7250c78a87edaef84d3b053d7\",\"dweb:/ipfs/QmYrKaVH2ftMJBWfUJGdQYV3LBoYuxTsXj1erndYrEE4Jp\"]},\"contracts/src/spaces/facets/channels/ChannelService.sol\":{\"keccak256\":\"0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9\",\"dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi\"]},\"contracts/src/spaces/facets/channels/ChannelStorage.sol\":{\"keccak256\":\"0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7\",\"dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS\"]},\"contracts/src/spaces/facets/channels/Channels.sol\":{\"keccak256\":\"0xeb1a27c173aa374fb10e7864b10926b2207b344099f35c36ceaa61f737c29580\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dc8606c41a52c9c41dfe5fd26c306b6eae730618b1a074e6e862f46e6deeec82\",\"dweb:/ipfs/QmfVXU1NQkxKSYH3tApnHKEzatmHjmJnKzM1Vo6n9QaH7S\"]},\"contracts/src/spaces/facets/channels/IChannel.sol\":{\"keccak256\":\"0x4a62ec6410779121880a21ae1a42bab2480f672c683f79c7f2e11bf2bfe1bd6e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://61b4142a55418d8e15e4db77bf6614a830489dc6aa191afe3dadc9ef16534b2c\",\"dweb:/ipfs/Qmbuc8VBmoFrbWZGinbCQaCrBRw3DznYhZNLzqk2FXABUx\"]},\"contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol\":{\"keccak256\":\"0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5\",\"dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9\"]},\"contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol\":{\"keccak256\":\"0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07\",\"dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek\"]},\"contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol\":{\"keccak256\":\"0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583\",\"dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK\"]},\"contracts/src/spaces/facets/membership/MembershipStorage.sol\":{\"keccak256\":\"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee\",\"dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5\"]},\"contracts/src/utils/Validator.sol\":{\"keccak256\":\"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64\",\"dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72\"]},\"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"ApprovalCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"ApprovalQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"BalanceQueryForZeroAddress"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__AlreadyBanned"},{"inputs":[],"type":"error","name":"Banning__CannotBanSelf"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__InvalidTokenId"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__NotBanned"},{"inputs":[],"type":"error","name":"ChannelService__ChannelAlreadyExists"},{"inputs":[],"type":"error","name":"ChannelService__ChannelDisabled"},{"inputs":[],"type":"error","name":"ChannelService__ChannelDoesNotExist"},{"inputs":[],"type":"error","name":"ChannelService__RoleAlreadyExists"},{"inputs":[],"type":"error","name":"ChannelService__RoleDoesNotExist"},{"inputs":[],"type":"error","name":"ERC5643__DurationZero"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC5643__InvalidTokenId"},{"inputs":[],"type":"error","name":"ERC5643__NotApprovedOrOwner"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC5643__SubscriptionNotRenewable"},{"inputs":[],"type":"error","name":"Entitlement__InvalidValue"},{"inputs":[],"type":"error","name":"Entitlement__NotAllowed"},{"inputs":[],"type":"error","name":"Entitlement__NotMember"},{"inputs":[],"type":"error","name":"Entitlement__ValueAlreadyExists"},{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[],"type":"error","name":"MintERC2309QuantityExceedsLimit"},{"inputs":[],"type":"error","name":"MintToZeroAddress"},{"inputs":[],"type":"error","name":"MintZeroQuantity"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[],"type":"error","name":"OwnerQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"OwnershipNotInitializedForExtraData"},{"inputs":[],"type":"error","name":"Pausable__NotPaused"},{"inputs":[],"type":"error","name":"Pausable__Paused"},{"inputs":[],"type":"error","name":"TransferCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"TransferFromIncorrectOwner"},{"inputs":[],"type":"error","name":"TransferToNonERC721ReceiverImplementer"},{"inputs":[],"type":"error","name":"TransferToZeroAddress"},{"inputs":[],"type":"error","name":"URIQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"Validator__InvalidStringLength"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"approved","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bool","name":"approved","type":"bool","indexed":false}],"type":"event","name":"ApprovalForAll","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Banned","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"bytes32","name":"channelId","type":"bytes32","indexed":false}],"type":"event","name":"ChannelCreated","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"bytes32","name":"channelId","type":"bytes32","indexed":false}],"type":"event","name":"ChannelRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"bytes32","name":"channelId","type":"bytes32","indexed":false},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":false}],"type":"event","name":"ChannelRoleAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"bytes32","name":"channelId","type":"bytes32","indexed":false},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":false}],"type":"event","name":"ChannelRoleRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"bytes32","name":"channelId","type":"bytes32","indexed":false}],"type":"event","name":"ChannelUpdated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"fromTokenId","type":"uint256","indexed":true},{"internalType":"uint256","name":"toTokenId","type":"uint256","indexed":false},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true}],"type":"event","name":"ConsecutiveTransfer","anonymous":false},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true},{"internalType":"uint64","name":"expiration","type":"uint64","indexed":false}],"type":"event","name":"SubscriptionUpdate","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Unbanned","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"},{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"addRoleToChannel"},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"},{"internalType":"string","name":"metadata","type":"string"},{"internalType":"uint256[]","name":"roleIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function","name":"createChannel"},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getChannel","outputs":[{"internalType":"struct IChannelBase.Channel","name":"channel","type":"tuple","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"bool","name":"disabled","type":"bool"},{"internalType":"string","name":"metadata","type":"string"},{"internalType":"uint256[]","name":"roleIds","type":"uint256[]"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getChannels","outputs":[{"internalType":"struct IChannelBase.Channel[]","name":"channels","type":"tuple[]","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"bool","name":"disabled","type":"bool"},{"internalType":"string","name":"metadata","type":"string"},{"internalType":"uint256[]","name":"roleIds","type":"uint256[]"}]}]},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRolesByChannel","outputs":[{"internalType":"uint256[]","name":"roleIds","type":"uint256[]"}]},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"removeChannel"},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"},{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"removeRoleFromChannel"},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"},{"internalType":"string","name":"metadata","type":"string"},{"internalType":"bool","name":"disabled","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"updateChannel"}],"devdoc":{"kind":"dev","methods":{"addRoleToChannel(bytes32,uint256)":{"params":{"channelId":"the channelId to add the role to","roleId":"the roleId to add to the channel"}},"createChannel(bytes32,string,uint256[])":{"params":{"channelId":"the channelId of the channel","metadata":"the metadata of the channel","roleIds":"the roleIds to add to the channel"}},"getChannel(bytes32)":{"params":{"channelId":"the channelId to get"},"returns":{"channel":"the channel"}},"getChannels()":{"returns":{"channels":"an array of all channels"}},"getRolesByChannel(bytes32)":{"params":{"channelId":"the channelId to get the roles for"},"returns":{"roleIds":"an array of roleIds for the channel"}},"removeChannel(bytes32)":{"params":{"channelId":"the channelId to remove"}},"removeRoleFromChannel(bytes32,uint256)":{"params":{"channelId":"the channelId to remove the role from","roleId":"the roleId to remove from the channel"}},"updateChannel(bytes32,string,bool)":{"params":{"channelId":"the channelId to update","disabled":"whether or not the channel is disabled","metadata":"the new metadata of the channel"}}},"version":1},"userdoc":{"kind":"user","methods":{"addRoleToChannel(bytes32,uint256)":{"notice":"adds a role to a channel"},"createChannel(bytes32,string,uint256[])":{"notice":"creates a channel"},"getChannel(bytes32)":{"notice":"gets a channel"},"getChannels()":{"notice":"gets all channels"},"getRolesByChannel(bytes32)":{"notice":"gets all roles for a channel"},"removeChannel(bytes32)":{"notice":"removes a channel"},"removeRoleFromChannel(bytes32,uint256)":{"notice":"removes a role from a channel"},"updateChannel(bytes32,string,bool)":{"notice":"updates a channel"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/facets/channels/Channels.sol":"Channels"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol":{"keccak256":"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d","urls":["bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f","dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol":{"keccak256":"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a","urls":["bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5","dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol":{"keccak256":"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0","urls":["bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc","dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/IPausable.sol":{"keccak256":"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261","urls":["bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6","dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableBase.sol":{"keccak256":"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438","urls":["bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c","dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableStorage.sol":{"keccak256":"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07","urls":["bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b","dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol":{"keccak256":"0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3","urls":["bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714","dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol":{"keccak256":"0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e","urls":["bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7","dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol":{"keccak256":"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218","urls":["bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f","dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol":{"keccak256":"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334","urls":["bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa","dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol":{"keccak256":"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1","urls":["bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c","dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9","urls":["bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e","dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM"],"license":"Apache-2.0"},"contracts/src/factory/facets/wallet-link/IWalletLink.sol":{"keccak256":"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b","urls":["bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13","dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/IEntitlement.sol":{"keccak256":"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca","urls":["bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3","dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf"],"license":"Apache-2.0"},"contracts/src/spaces/facets/Entitled.sol":{"keccak256":"0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c","urls":["bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7","dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc"],"license":"Apache-2.0"},"contracts/src/spaces/facets/Permissions.sol":{"keccak256":"0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5","urls":["bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721","dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/BanningBase.sol":{"keccak256":"0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270","urls":["bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d","dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/BanningStorage.sol":{"keccak256":"0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492","urls":["bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0","dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/IBanning.sol":{"keccak256":"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505","urls":["bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419","dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/ChannelBase.sol":{"keccak256":"0x51d5d8335e585b052a43afc3b5018429c2dd22f67e4b60b3f8f659d9d0b0ec08","urls":["bzz-raw://b6d5953dfa9b5e857aaf153df1c1d04ece5fb9d7250c78a87edaef84d3b053d7","dweb:/ipfs/QmYrKaVH2ftMJBWfUJGdQYV3LBoYuxTsXj1erndYrEE4Jp"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/ChannelService.sol":{"keccak256":"0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7","urls":["bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9","dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/ChannelStorage.sol":{"keccak256":"0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f","urls":["bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7","dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/Channels.sol":{"keccak256":"0xeb1a27c173aa374fb10e7864b10926b2207b344099f35c36ceaa61f737c29580","urls":["bzz-raw://dc8606c41a52c9c41dfe5fd26c306b6eae730618b1a074e6e862f46e6deeec82","dweb:/ipfs/QmfVXU1NQkxKSYH3tApnHKEzatmHjmJnKzM1Vo6n9QaH7S"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/IChannel.sol":{"keccak256":"0x4a62ec6410779121880a21ae1a42bab2480f672c683f79c7f2e11bf2bfe1bd6e","urls":["bzz-raw://61b4142a55418d8e15e4db77bf6614a830489dc6aa191afe3dadc9ef16534b2c","dweb:/ipfs/Qmbuc8VBmoFrbWZGinbCQaCrBRw3DznYhZNLzqk2FXABUx"],"license":"Apache-2.0"},"contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol":{"keccak256":"0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2","urls":["bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5","dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9"],"license":"Apache-2.0"},"contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol":{"keccak256":"0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef","urls":["bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07","dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol":{"keccak256":"0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8","urls":["bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583","dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/MembershipStorage.sol":{"keccak256":"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3","urls":["bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee","dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5"],"license":"Apache-2.0"},"contracts/src/utils/Validator.sol":{"keccak256":"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50","urls":["bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64","dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"keccak256":"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4","urls":["bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7","dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":201} \ No newline at end of file diff --git a/packages/generated/dev/abis/Channels.metadata.json b/packages/generated/dev/abis/Channels.metadata.json new file mode 100644 index 000000000..1b7bcdfc4 --- /dev/null +++ b/packages/generated/dev/abis/Channels.metadata.json @@ -0,0 +1,1211 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "ApprovalQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "BalanceQueryForZeroAddress" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__AlreadyBanned" + }, + { + "inputs": [], + "type": "error", + "name": "Banning__CannotBanSelf" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__InvalidTokenId" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__NotBanned" + }, + { + "inputs": [], + "type": "error", + "name": "ChannelService__ChannelAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "ChannelService__ChannelDisabled" + }, + { + "inputs": [], + "type": "error", + "name": "ChannelService__ChannelDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "ChannelService__RoleAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "ChannelService__RoleDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "ERC5643__DurationZero" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC5643__InvalidTokenId" + }, + { + "inputs": [], + "type": "error", + "name": "ERC5643__NotApprovedOrOwner" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__InvalidValue" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotAllowed" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotMember" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__ValueAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [], + "type": "error", + "name": "MintERC2309QuantityExceedsLimit" + }, + { + "inputs": [], + "type": "error", + "name": "MintToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "MintZeroQuantity" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "OwnerQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "OwnershipNotInitializedForExtraData" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__NotPaused" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__Paused" + }, + { + "inputs": [], + "type": "error", + "name": "TransferCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "TransferFromIncorrectOwner" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "URIQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "Validator__InvalidStringLength" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "approved", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Approval", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "operator", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ApprovalForAll", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Banned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address", + "indexed": true + }, + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32", + "indexed": false + } + ], + "type": "event", + "name": "ChannelCreated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address", + "indexed": true + }, + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32", + "indexed": false + } + ], + "type": "event", + "name": "ChannelRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address", + "indexed": true + }, + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "ChannelRoleAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address", + "indexed": true + }, + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "ChannelRoleRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address", + "indexed": true + }, + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32", + "indexed": false + } + ], + "type": "event", + "name": "ChannelUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fromTokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint256", + "name": "toTokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConsecutiveTransfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Paused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint64", + "name": "expiration", + "type": "uint64", + "indexed": false + } + ], + "type": "event", + "name": "SubscriptionUpdate", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Transfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Unbanned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Unpaused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "addRoleToChannel" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "metadata", + "type": "string" + }, + { + "internalType": "uint256[]", + "name": "roleIds", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "createChannel" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getChannel", + "outputs": [ + { + "internalType": "struct IChannelBase.Channel", + "name": "channel", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "disabled", + "type": "bool" + }, + { + "internalType": "string", + "name": "metadata", + "type": "string" + }, + { + "internalType": "uint256[]", + "name": "roleIds", + "type": "uint256[]" + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getChannels", + "outputs": [ + { + "internalType": "struct IChannelBase.Channel[]", + "name": "channels", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "disabled", + "type": "bool" + }, + { + "internalType": "string", + "name": "metadata", + "type": "string" + }, + { + "internalType": "uint256[]", + "name": "roleIds", + "type": "uint256[]" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getRolesByChannel", + "outputs": [ + { + "internalType": "uint256[]", + "name": "roleIds", + "type": "uint256[]" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeChannel" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeRoleFromChannel" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "metadata", + "type": "string" + }, + { + "internalType": "bool", + "name": "disabled", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "updateChannel" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "addRoleToChannel(bytes32,uint256)": { + "params": { + "channelId": "the channelId to add the role to", + "roleId": "the roleId to add to the channel" + } + }, + "createChannel(bytes32,string,uint256[])": { + "params": { + "channelId": "the channelId of the channel", + "metadata": "the metadata of the channel", + "roleIds": "the roleIds to add to the channel" + } + }, + "getChannel(bytes32)": { + "params": { + "channelId": "the channelId to get" + }, + "returns": { + "channel": "the channel" + } + }, + "getChannels()": { + "returns": { + "channels": "an array of all channels" + } + }, + "getRolesByChannel(bytes32)": { + "params": { + "channelId": "the channelId to get the roles for" + }, + "returns": { + "roleIds": "an array of roleIds for the channel" + } + }, + "removeChannel(bytes32)": { + "params": { + "channelId": "the channelId to remove" + } + }, + "removeRoleFromChannel(bytes32,uint256)": { + "params": { + "channelId": "the channelId to remove the role from", + "roleId": "the roleId to remove from the channel" + } + }, + "updateChannel(bytes32,string,bool)": { + "params": { + "channelId": "the channelId to update", + "disabled": "whether or not the channel is disabled", + "metadata": "the new metadata of the channel" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "addRoleToChannel(bytes32,uint256)": { + "notice": "adds a role to a channel" + }, + "createChannel(bytes32,string,uint256[])": { + "notice": "creates a channel" + }, + "getChannel(bytes32)": { + "notice": "gets a channel" + }, + "getChannels()": { + "notice": "gets all channels" + }, + "getRolesByChannel(bytes32)": { + "notice": "gets all roles for a channel" + }, + "removeChannel(bytes32)": { + "notice": "removes a channel" + }, + "removeRoleFromChannel(bytes32,uint256)": { + "notice": "removes a role from a channel" + }, + "updateChannel(bytes32,string,bool)": { + "notice": "updates a channel" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/facets/channels/Channels.sol": "Channels" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol": { + "keccak256": "0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d", + "urls": [ + "bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f", + "dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol": { + "keccak256": "0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a", + "urls": [ + "bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5", + "dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol": { + "keccak256": "0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0", + "urls": [ + "bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc", + "dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/IPausable.sol": { + "keccak256": "0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261", + "urls": [ + "bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6", + "dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableBase.sol": { + "keccak256": "0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438", + "urls": [ + "bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c", + "dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableStorage.sol": { + "keccak256": "0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07", + "urls": [ + "bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b", + "dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol": { + "keccak256": "0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3", + "urls": [ + "bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714", + "dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol": { + "keccak256": "0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e", + "urls": [ + "bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7", + "dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/IERC5643.sol": { + "keccak256": "0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218", + "urls": [ + "bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f", + "dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol": { + "keccak256": "0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334", + "urls": [ + "bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa", + "dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol": { + "keccak256": "0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1", + "urls": [ + "bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c", + "dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/IERC721A.sol": { + "keccak256": "0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9", + "urls": [ + "bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e", + "dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/wallet-link/IWalletLink.sol": { + "keccak256": "0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b", + "urls": [ + "bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13", + "dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/IEntitlement.sol": { + "keccak256": "0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca", + "urls": [ + "bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3", + "dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/Entitled.sol": { + "keccak256": "0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c", + "urls": [ + "bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7", + "dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/Permissions.sol": { + "keccak256": "0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5", + "urls": [ + "bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721", + "dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/BanningBase.sol": { + "keccak256": "0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270", + "urls": [ + "bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d", + "dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/BanningStorage.sol": { + "keccak256": "0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492", + "urls": [ + "bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0", + "dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/IBanning.sol": { + "keccak256": "0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505", + "urls": [ + "bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419", + "dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/ChannelBase.sol": { + "keccak256": "0x51d5d8335e585b052a43afc3b5018429c2dd22f67e4b60b3f8f659d9d0b0ec08", + "urls": [ + "bzz-raw://b6d5953dfa9b5e857aaf153df1c1d04ece5fb9d7250c78a87edaef84d3b053d7", + "dweb:/ipfs/QmYrKaVH2ftMJBWfUJGdQYV3LBoYuxTsXj1erndYrEE4Jp" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/ChannelService.sol": { + "keccak256": "0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7", + "urls": [ + "bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9", + "dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/ChannelStorage.sol": { + "keccak256": "0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f", + "urls": [ + "bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7", + "dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/Channels.sol": { + "keccak256": "0xeb1a27c173aa374fb10e7864b10926b2207b344099f35c36ceaa61f737c29580", + "urls": [ + "bzz-raw://dc8606c41a52c9c41dfe5fd26c306b6eae730618b1a074e6e862f46e6deeec82", + "dweb:/ipfs/QmfVXU1NQkxKSYH3tApnHKEzatmHjmJnKzM1Vo6n9QaH7S" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/IChannel.sol": { + "keccak256": "0x4a62ec6410779121880a21ae1a42bab2480f672c683f79c7f2e11bf2bfe1bd6e", + "urls": [ + "bzz-raw://61b4142a55418d8e15e4db77bf6614a830489dc6aa191afe3dadc9ef16534b2c", + "dweb:/ipfs/Qmbuc8VBmoFrbWZGinbCQaCrBRw3DznYhZNLzqk2FXABUx" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol": { + "keccak256": "0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2", + "urls": [ + "bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5", + "dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol": { + "keccak256": "0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef", + "urls": [ + "bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07", + "dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol": { + "keccak256": "0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8", + "urls": [ + "bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583", + "dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/MembershipStorage.sol": { + "keccak256": "0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3", + "urls": [ + "bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee", + "dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/Validator.sol": { + "keccak256": "0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50", + "urls": [ + "bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64", + "dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4", + "urls": [ + "bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7", + "dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/Diamond.abi.json b/packages/generated/dev/abis/Diamond.abi.json new file mode 100644 index 000000000..4772f6d49 --- /dev/null +++ b/packages/generated/dev/abis/Diamond.abi.json @@ -0,0 +1,249 @@ +[ + { + "type": "constructor", + "inputs": [ + { + "name": "initDiamondCut", + "type": "tuple", + "internalType": "struct Diamond.InitParams", + "components": [ + { + "name": "baseFacets", + "type": "tuple[]", + "internalType": "struct IDiamond.FacetCut[]", + "components": [ + { + "name": "facetAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "action", + "type": "uint8", + "internalType": "enum IDiamond.FacetCutAction" + }, + { + "name": "functionSelectors", + "type": "bytes4[]", + "internalType": "bytes4[]" + } + ] + }, + { + "name": "init", + "type": "address", + "internalType": "address" + }, + { + "name": "initData", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "fallback", + "stateMutability": "payable" + }, + { + "type": "receive", + "stateMutability": "payable" + }, + { + "type": "event", + "name": "DiamondCut", + "inputs": [ + { + "name": "facetCuts", + "type": "tuple[]", + "indexed": false, + "internalType": "struct IDiamond.FacetCut[]", + "components": [ + { + "name": "facetAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "action", + "type": "uint8", + "internalType": "enum IDiamond.FacetCutAction" + }, + { + "name": "functionSelectors", + "type": "bytes4[]", + "internalType": "bytes4[]" + } + ] + }, + { + "name": "init", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "initPayload", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionAlreadyExists", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionDoesNotExist", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionFromSameFacetAlreadyExists", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_ImmutableFacet", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidContract", + "inputs": [ + { + "name": "init", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacet", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetCutAction", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetCutLength", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetRemoval", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + }, + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetSelectors", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidSelector", + "inputs": [] + }, + { + "type": "error", + "name": "Diamond_UnsupportedFunction", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_AlreadyInitialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "internalType": "uint32" + } + ] + }, + { + "type": "error", + "name": "Proxy__ImplementationIsNotContract", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/Diamond.abi.ts b/packages/generated/dev/abis/Diamond.abi.ts new file mode 100644 index 000000000..eaa6960cc --- /dev/null +++ b/packages/generated/dev/abis/Diamond.abi.ts @@ -0,0 +1,249 @@ +export default [ + { + "type": "constructor", + "inputs": [ + { + "name": "initDiamondCut", + "type": "tuple", + "internalType": "struct Diamond.InitParams", + "components": [ + { + "name": "baseFacets", + "type": "tuple[]", + "internalType": "struct IDiamond.FacetCut[]", + "components": [ + { + "name": "facetAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "action", + "type": "uint8", + "internalType": "enum IDiamond.FacetCutAction" + }, + { + "name": "functionSelectors", + "type": "bytes4[]", + "internalType": "bytes4[]" + } + ] + }, + { + "name": "init", + "type": "address", + "internalType": "address" + }, + { + "name": "initData", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "fallback", + "stateMutability": "payable" + }, + { + "type": "receive", + "stateMutability": "payable" + }, + { + "type": "event", + "name": "DiamondCut", + "inputs": [ + { + "name": "facetCuts", + "type": "tuple[]", + "indexed": false, + "internalType": "struct IDiamond.FacetCut[]", + "components": [ + { + "name": "facetAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "action", + "type": "uint8", + "internalType": "enum IDiamond.FacetCutAction" + }, + { + "name": "functionSelectors", + "type": "bytes4[]", + "internalType": "bytes4[]" + } + ] + }, + { + "name": "init", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "initPayload", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionAlreadyExists", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionDoesNotExist", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionFromSameFacetAlreadyExists", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_ImmutableFacet", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidContract", + "inputs": [ + { + "name": "init", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacet", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetCutAction", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetCutLength", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetRemoval", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + }, + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetSelectors", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidSelector", + "inputs": [] + }, + { + "type": "error", + "name": "Diamond_UnsupportedFunction", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_AlreadyInitialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "internalType": "uint32" + } + ] + }, + { + "type": "error", + "name": "Proxy__ImplementationIsNotContract", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/Diamond.bin b/packages/generated/dev/abis/Diamond.bin new file mode 100644 index 000000000..772199895 --- /dev/null +++ b/packages/generated/dev/abis/Diamond.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b506040516110fa3803806110fa83398101604081905261002f91610c6e565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16158061006c57303b151561007b565b8154600163ffffffff90911610155b156100a9578154604051630a8ef77f60e31b815263ffffffff90911660048201526024015b60405180910390fd5b815463ffffffff1916600117825580156100d057815460ff60201b19166401000000001782555b8251602084015160408501516100e7929190610135565b801561012d57815460ff60201b19168255604051600181527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b505050611001565b825160000361015757604051632795bfe160e11b815260040160405180910390fd5b60005b835181101561022857600084828151811061017757610177610e53565b602002602001015190506101908161027460201b60201c565b6000816020015160028111156101a8576101a8610e69565b036101c357805160408201516101be9190610330565b61021f565b6001816020015160028111156101db576101db610e69565b036101f157805160408201516101be919061045d565b60028160200151600281111561020957610209610e69565b0361021f578051604082015161021f919061067c565b5060010161015a565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67383838360405161025c93929190610eab565b60405180910390a161026f83838361082b565b505050565b80516001600160a01b03166102aa5780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b80516001600160a01b031630148015906102cd575080516001600160a01b03163b155b156102f95780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b80604001515160000361032d5780516040516305fb96cb60e41b81526001600160a01b0390911660048201526024016100a0565b50565b6000805160206110da833981519152610349818461087e565b6103595761035781846108a5565b505b815160005b8181101561045657600084828151811061037a5761037a610e53565b602090810291909101015190506001600160e01b031981166103af576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b0316156103fe57604051630e6c4db160e41b81526001600160e01b0319821660048201526024016100a0565b6001600160e01b031981166000818152600286016020908152604080832080546001600160a01b0319166001600160a01b038c16908117909155835260038801909152902061044c916108ba565b505060010161035e565b5050505050565b6000805160206110da833981519152306001600160a01b0384160361049557604051630e7ce30960e11b815260040160405180910390fd5b61049f818461087e565b6104af576104ad81846108a5565b505b815160005b818110156104565760008482815181106104d0576104d0610e53565b602090810291909101015190506001600160e01b03198116610505576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b031630810361054a57604051630e7ce30960e11b815260040160405180910390fd5b6001600160a01b03811661057c5760405163126f174360e11b81526001600160a01b03881660048201526024016100a0565b866001600160a01b0316816001600160a01b0316036105ba57604051631403eec360e21b81526001600160e01b0319831660048201526024016100a0565b6001600160e01b031982166000818152600287016020908152604080832080546001600160a01b0319166001600160a01b038d8116919091179091558516835260038901909152902061060c916108c6565b506001600160a01b0387166000908152600386016020526040902061063b906001600160e01b031984166108ba565b506001600160a01b0381166000908152600386016020526040902061065f906108d2565b6000036106725761067085826108dc565b505b50506001016104b4565b6000805160206110da833981519152306001600160a01b038416036106b457604051630e7ce30960e11b815260040160405180910390fd5b6106be818461087e565b6106e6576040516344ae58e160e01b81526001600160a01b03841660048201526024016100a0565b60005b82518110156107f057600083828151811061070657610706610e53565b602090810291909101015190506001600160e01b0319811661073b576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002840160205260409020546001600160a01b0386811691161461079c5760405162062efb60e51b81526001600160a01b03861660048201526001600160e01b0319821660248201526044016100a0565b6001600160e01b031981166000818152600285016020908152604080832080546001600160a01b03191690556001600160a01b03891683526003870190915290206107e6916108c6565b50506001016106e9565b506001600160a01b03831660009081526003820160205260409020610814906108d2565b60000361026f5761082581846108dc565b50505050565b6001600160a01b03821661083e57505050565b816001600160a01b03163b60000361087457604051633b367e1560e21b81526001600160a01b03831660048201526024016100a0565b61082582826108f1565b6001600160a01b038116600090815260018301602052604081205415155b90505b92915050565b600061089c836001600160a01b038416610968565b600061089c8383610968565b600061089c83836109b7565b600061089f825490565b600061089c836001600160a01b0384166109b7565b6060600080846001600160a01b03168460405161090e9190610fae565b600060405180830381855af49150503d8060008114610949576040519150601f19603f3d011682016040523d82523d6000602084013e61094e565b606091505b50909250905061095f858383610aaa565b95945050505050565b60008181526001830160205260408120546109af5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561089f565b50600061089f565b60008181526001830160205260408120548015610aa05760006109db600183610fca565b85549091506000906109ef90600190610fca565b9050808214610a54576000866000018281548110610a0f57610a0f610e53565b9060005260206000200154905080876000018481548110610a3257610a32610e53565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610a6557610a65610feb565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061089f565b600091505061089f565b606082610abf57610aba82610b09565b610b02565b8151158015610ad657506001600160a01b0384163b155b15610aff57604051639996b31560e01b81526001600160a01b03851660048201526024016100a0565b50805b9392505050565b805115610b195780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715610b6a57610b6a610b32565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610b9857610b98610b32565b604052919050565b60006001600160401b03821115610bb957610bb9610b32565b5060051b60200190565b80516001600160a01b0381168114610bda57600080fd5b919050565b60005b83811015610bfa578181015183820152602001610be2565b50506000910152565b600082601f830112610c1457600080fd5b81516001600160401b03811115610c2d57610c2d610b32565b610c40601f8201601f1916602001610b70565b818152846020838601011115610c5557600080fd5b610c66826020830160208701610bdf565b949350505050565b600060208284031215610c8057600080fd5b81516001600160401b0380821115610c9757600080fd5b9083019060608286031215610cab57600080fd5b610cb3610b48565b825182811115610cc257600080fd5b8301601f81018713610cd357600080fd5b8051610ce6610ce182610ba0565b610b70565b8082825260208201915060208360051b850101925089831115610d0857600080fd5b602084015b83811015610e0e57805187811115610d2457600080fd5b85016060818d03601f19011215610d3a57600080fd5b610d42610b48565b610d4e60208301610bc3565b8152604082015160038110610d6257600080fd5b6020820152606082015189811115610d7957600080fd5b8083019250508c603f830112610d8e57600080fd5b6020820151610d9f610ce182610ba0565b81815260059190911b83016040019060208101908f831115610dc057600080fd5b6040850194505b82851015610df85784516001600160e01b031981168114610de757600080fd5b825260209485019490910190610dc7565b6040840152505084525060209283019201610d0d565b50845250610e2191505060208401610bc3565b6020820152604083015182811115610e3857600080fd5b610e4487828601610c03565b60408301525095945050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b60008151808452610e97816020860160208601610bdf565b601f01601f19169290920160200192915050565b60006060808301606084528087518083526080925060808601915060808160051b8701016020808b0160005b84811015610f7e57898403607f19018652815180516001600160a01b03168552838101518986019060038110610f1d57634e487b7160e01b600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b80831015610f695783516001600160e01b0319168252928601926001929092019190860190610f3f565b50978501979550505090820190600101610ed7565b50506001600160a01b038a16908801528681036040880152610fa08189610e7f565b9a9950505050505050505050565b60008251610fc0818460208701610bdf565b9190910192915050565b8181038181111561089f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60cb8061100f6000396000f3fe608060405236600a57005b60106012565b005b6000601a6069565b9050806001600160a01b03163b6000036046576040516321f27f0d60e21b815260040160405180910390fd5b3660008037600080366000845af43d6000803e8080156064573d6000f35b3d6000fd5b600080356001600160e01b03191681527fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc90260205260409020546001600160a01b03168060c857604051630ff409c160e11b815260040160405180910390fd5b9056c6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc900 \ No newline at end of file diff --git a/packages/generated/dev/abis/Diamond.json b/packages/generated/dev/abis/Diamond.json new file mode 100644 index 000000000..75824fd63 --- /dev/null +++ b/packages/generated/dev/abis/Diamond.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"initDiamondCut","type":"tuple","internalType":"struct Diamond.InitParams","components":[{"name":"baseFacets","type":"tuple[]","internalType":"struct IDiamond.FacetCut[]","components":[{"name":"facetAddress","type":"address","internalType":"address"},{"name":"action","type":"uint8","internalType":"enum IDiamond.FacetCutAction"},{"name":"functionSelectors","type":"bytes4[]","internalType":"bytes4[]"}]},{"name":"init","type":"address","internalType":"address"},{"name":"initData","type":"bytes","internalType":"bytes"}]}],"stateMutability":"nonpayable"},{"type":"fallback","stateMutability":"payable"},{"type":"receive","stateMutability":"payable"},{"type":"event","name":"DiamondCut","inputs":[{"name":"facetCuts","type":"tuple[]","indexed":false,"internalType":"struct IDiamond.FacetCut[]","components":[{"name":"facetAddress","type":"address","internalType":"address"},{"name":"action","type":"uint8","internalType":"enum IDiamond.FacetCutAction"},{"name":"functionSelectors","type":"bytes4[]","internalType":"bytes4[]"}]},{"name":"init","type":"address","indexed":false,"internalType":"address"},{"name":"initPayload","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_FunctionAlreadyExists","inputs":[{"name":"selector","type":"bytes4","internalType":"bytes4"}]},{"type":"error","name":"DiamondCut_FunctionDoesNotExist","inputs":[{"name":"facet","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_FunctionFromSameFacetAlreadyExists","inputs":[{"name":"selector","type":"bytes4","internalType":"bytes4"}]},{"type":"error","name":"DiamondCut_ImmutableFacet","inputs":[]},{"type":"error","name":"DiamondCut_InvalidContract","inputs":[{"name":"init","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_InvalidFacet","inputs":[{"name":"facet","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_InvalidFacetCutAction","inputs":[]},{"type":"error","name":"DiamondCut_InvalidFacetCutLength","inputs":[]},{"type":"error","name":"DiamondCut_InvalidFacetRemoval","inputs":[{"name":"facet","type":"address","internalType":"address"},{"name":"selector","type":"bytes4","internalType":"bytes4"}]},{"type":"error","name":"DiamondCut_InvalidFacetSelectors","inputs":[{"name":"facet","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_InvalidSelector","inputs":[]},{"type":"error","name":"Diamond_UnsupportedFunction","inputs":[]},{"type":"error","name":"FailedInnerCall","inputs":[]},{"type":"error","name":"Initializable_AlreadyInitialized","inputs":[{"name":"version","type":"uint32","internalType":"uint32"}]},{"type":"error","name":"Proxy__ImplementationIsNotContract","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b506040516110fa3803806110fa83398101604081905261002f91610c6e565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16158061006c57303b151561007b565b8154600163ffffffff90911610155b156100a9578154604051630a8ef77f60e31b815263ffffffff90911660048201526024015b60405180910390fd5b815463ffffffff1916600117825580156100d057815460ff60201b19166401000000001782555b8251602084015160408501516100e7929190610135565b801561012d57815460ff60201b19168255604051600181527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b505050611001565b825160000361015757604051632795bfe160e11b815260040160405180910390fd5b60005b835181101561022857600084828151811061017757610177610e53565b602002602001015190506101908161027460201b60201c565b6000816020015160028111156101a8576101a8610e69565b036101c357805160408201516101be9190610330565b61021f565b6001816020015160028111156101db576101db610e69565b036101f157805160408201516101be919061045d565b60028160200151600281111561020957610209610e69565b0361021f578051604082015161021f919061067c565b5060010161015a565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67383838360405161025c93929190610eab565b60405180910390a161026f83838361082b565b505050565b80516001600160a01b03166102aa5780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b80516001600160a01b031630148015906102cd575080516001600160a01b03163b155b156102f95780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b80604001515160000361032d5780516040516305fb96cb60e41b81526001600160a01b0390911660048201526024016100a0565b50565b6000805160206110da833981519152610349818461087e565b6103595761035781846108a5565b505b815160005b8181101561045657600084828151811061037a5761037a610e53565b602090810291909101015190506001600160e01b031981166103af576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b0316156103fe57604051630e6c4db160e41b81526001600160e01b0319821660048201526024016100a0565b6001600160e01b031981166000818152600286016020908152604080832080546001600160a01b0319166001600160a01b038c16908117909155835260038801909152902061044c916108ba565b505060010161035e565b5050505050565b6000805160206110da833981519152306001600160a01b0384160361049557604051630e7ce30960e11b815260040160405180910390fd5b61049f818461087e565b6104af576104ad81846108a5565b505b815160005b818110156104565760008482815181106104d0576104d0610e53565b602090810291909101015190506001600160e01b03198116610505576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b031630810361054a57604051630e7ce30960e11b815260040160405180910390fd5b6001600160a01b03811661057c5760405163126f174360e11b81526001600160a01b03881660048201526024016100a0565b866001600160a01b0316816001600160a01b0316036105ba57604051631403eec360e21b81526001600160e01b0319831660048201526024016100a0565b6001600160e01b031982166000818152600287016020908152604080832080546001600160a01b0319166001600160a01b038d8116919091179091558516835260038901909152902061060c916108c6565b506001600160a01b0387166000908152600386016020526040902061063b906001600160e01b031984166108ba565b506001600160a01b0381166000908152600386016020526040902061065f906108d2565b6000036106725761067085826108dc565b505b50506001016104b4565b6000805160206110da833981519152306001600160a01b038416036106b457604051630e7ce30960e11b815260040160405180910390fd5b6106be818461087e565b6106e6576040516344ae58e160e01b81526001600160a01b03841660048201526024016100a0565b60005b82518110156107f057600083828151811061070657610706610e53565b602090810291909101015190506001600160e01b0319811661073b576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002840160205260409020546001600160a01b0386811691161461079c5760405162062efb60e51b81526001600160a01b03861660048201526001600160e01b0319821660248201526044016100a0565b6001600160e01b031981166000818152600285016020908152604080832080546001600160a01b03191690556001600160a01b03891683526003870190915290206107e6916108c6565b50506001016106e9565b506001600160a01b03831660009081526003820160205260409020610814906108d2565b60000361026f5761082581846108dc565b50505050565b6001600160a01b03821661083e57505050565b816001600160a01b03163b60000361087457604051633b367e1560e21b81526001600160a01b03831660048201526024016100a0565b61082582826108f1565b6001600160a01b038116600090815260018301602052604081205415155b90505b92915050565b600061089c836001600160a01b038416610968565b600061089c8383610968565b600061089c83836109b7565b600061089f825490565b600061089c836001600160a01b0384166109b7565b6060600080846001600160a01b03168460405161090e9190610fae565b600060405180830381855af49150503d8060008114610949576040519150601f19603f3d011682016040523d82523d6000602084013e61094e565b606091505b50909250905061095f858383610aaa565b95945050505050565b60008181526001830160205260408120546109af5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561089f565b50600061089f565b60008181526001830160205260408120548015610aa05760006109db600183610fca565b85549091506000906109ef90600190610fca565b9050808214610a54576000866000018281548110610a0f57610a0f610e53565b9060005260206000200154905080876000018481548110610a3257610a32610e53565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610a6557610a65610feb565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061089f565b600091505061089f565b606082610abf57610aba82610b09565b610b02565b8151158015610ad657506001600160a01b0384163b155b15610aff57604051639996b31560e01b81526001600160a01b03851660048201526024016100a0565b50805b9392505050565b805115610b195780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715610b6a57610b6a610b32565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610b9857610b98610b32565b604052919050565b60006001600160401b03821115610bb957610bb9610b32565b5060051b60200190565b80516001600160a01b0381168114610bda57600080fd5b919050565b60005b83811015610bfa578181015183820152602001610be2565b50506000910152565b600082601f830112610c1457600080fd5b81516001600160401b03811115610c2d57610c2d610b32565b610c40601f8201601f1916602001610b70565b818152846020838601011115610c5557600080fd5b610c66826020830160208701610bdf565b949350505050565b600060208284031215610c8057600080fd5b81516001600160401b0380821115610c9757600080fd5b9083019060608286031215610cab57600080fd5b610cb3610b48565b825182811115610cc257600080fd5b8301601f81018713610cd357600080fd5b8051610ce6610ce182610ba0565b610b70565b8082825260208201915060208360051b850101925089831115610d0857600080fd5b602084015b83811015610e0e57805187811115610d2457600080fd5b85016060818d03601f19011215610d3a57600080fd5b610d42610b48565b610d4e60208301610bc3565b8152604082015160038110610d6257600080fd5b6020820152606082015189811115610d7957600080fd5b8083019250508c603f830112610d8e57600080fd5b6020820151610d9f610ce182610ba0565b81815260059190911b83016040019060208101908f831115610dc057600080fd5b6040850194505b82851015610df85784516001600160e01b031981168114610de757600080fd5b825260209485019490910190610dc7565b6040840152505084525060209283019201610d0d565b50845250610e2191505060208401610bc3565b6020820152604083015182811115610e3857600080fd5b610e4487828601610c03565b60408301525095945050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b60008151808452610e97816020860160208601610bdf565b601f01601f19169290920160200192915050565b60006060808301606084528087518083526080925060808601915060808160051b8701016020808b0160005b84811015610f7e57898403607f19018652815180516001600160a01b03168552838101518986019060038110610f1d57634e487b7160e01b600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b80831015610f695783516001600160e01b0319168252928601926001929092019190860190610f3f565b50978501979550505090820190600101610ed7565b50506001600160a01b038a16908801528681036040880152610fa08189610e7f565b9a9950505050505050505050565b60008251610fc0818460208701610bdf565b9190910192915050565b8181038181111561089f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60cb8061100f6000396000f3fe608060405236600a57005b60106012565b005b6000601a6069565b9050806001600160a01b03163b6000036046576040516321f27f0d60e21b815260040160405180910390fd5b3660008037600080366000845af43d6000803e8080156064573d6000f35b3d6000fd5b600080356001600160e01b03191681527fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc90260205260409020546001600160a01b03168060c857604051630ff409c160e11b815260040160405180910390fd5b9056c6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc900","sourceMap":"396:796:69:-:0;;;587:177;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;303:66:86;540:14:85;;;;;;;539:15;;564:53;;2049:4;2041:25;:30;;564:53;;;581:9;;594:1;581:9;;;;:14;;564:53;560:124;;;667:9;;634:43;;-1:-1:-1;;;634:43:85;;667:9;;;;634:43;;;4784:42:516;4757:18;;634:43:85;;;;;;;;560:124;689:13;;-1:-1:-1;;689:13:85;701:1;689:13;;;708:56;;;;736:21;;-1:-1:-1;;;;736:21:85;;;;;708:56;670:25:69;;703:19:::1;::::0;::::1;::::0;730:23:::1;::::0;::::1;::::0;651:108:::1;::::0;670:25;703:19;651:11:::1;:108::i;:::-;780:14:85::0;776:84;;;804:22;;-1:-1:-1;;;;804:22:85;;;839:14;;-1:-1:-1;4784:42:516;;839:14:85;;4772:2:516;4757:18;839:14:85;;;;;;;776:84;435:429;;587:177:69;396:796;;646:888:72;780:9;:16;800:1;780:21;776:68;;810:34;;-1:-1:-1;;;810:34:72;;;;;;;;;;;776:68;856:9;851:569;871:9;:16;867:1;:20;851:569;;;902:33;938:9;948:1;938:12;;;;;;;;:::i;:::-;;;;;;;902:48;;959:27;977:8;959:17;;;:27;;:::i;:::-;1018;999:8;:15;;;:46;;;;;;;;:::i;:::-;;995:419;;1067:21;;1090:26;;;;1057:60;;1067:21;1057:9;:60::i;:::-;995:419;;;1155:31;1136:8;:15;;;:50;;;;;;;;:::i;:::-;;1132:282;;1212:21;;1235:26;;;;1198:64;;1212:21;1198:13;:64::i;1132:282::-;1300:30;1281:8;:15;;;:49;;;;;;;;:::i;:::-;;1277:137;;1355:21;;1378:26;;;;1342:63;;1355:21;1342:12;:63::i;:::-;-1:-1:-1;889:3:72;;851:569;;;;1431:40;1442:9;1453:4;1459:11;1431:40;;;;;;;;:::i;:::-;;;;;;;;1478:51;1500:9;1511:4;1517:11;1478:21;:51::i;:::-;646:888;;;:::o;4746:500::-;4832:21;;-1:-1:-1;;;;;4832:35:72;4828:109;;4908:21;;4884:46;;-1:-1:-1;;;4884:46:72;;-1:-1:-1;;;;;7954:32:516;;;4884:46:72;;;7936:51:516;7909:18;;4884:46:72;7790:203:516;4828:109:72;4954:21;;-1:-1:-1;;;;;4954:38:72;4987:4;4954:38;;;;:86;;-1:-1:-1;5002:21:72;;-1:-1:-1;;;;;5002:33:72;;:38;4954:86;4943:172;;;5086:21;;5062:46;;-1:-1:-1;;;5062:46:72;;-1:-1:-1;;;;;7954:32:516;;;5062:46:72;;;7936:51:516;7909:18;;5062:46:72;7790:203:516;4943:172:72;5125:8;:26;;;:33;5162:1;5125:38;5121:121;;5213:21;;5180:55;;-1:-1:-1;;;5180:55:72;;-1:-1:-1;;;;;7954:32:516;;;5180:55:72;;;7936:51:516;7909:18;;5180:55:72;7790:203:516;5121:121:72;4746:500;:::o;1667:761::-;-1:-1:-1;;;;;;;;;;;1855:25:72;377:66:74;1874:5:72;1855:18;:25::i;:::-;1850:52;;1882:20;:2;1896:5;1882:13;:20::i;:::-;;1850:52;1933:16;;1909:21;1996:428;2016:13;2012:1;:17;1996:428;;;2041:15;2059:9;2069:1;2059:12;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;;;2084:21:72;;2080:81;;2124:28;;-1:-1:-1;;;2124:28:72;;;;;;;;;;;2080:81;-1:-1:-1;;;;;;2173:28:72;;2213:1;2173:28;;;:18;;;:28;;;;;;-1:-1:-1;;;;;2173:28:72;:42;2169:116;;2234:42;;-1:-1:-1;;;2234:42:72;;-1:-1:-1;;;;;;8160:33:516;;2234:42:72;;;8142:52:516;8115:18;;2234:42:72;7998:202:516;2169:116:72;-1:-1:-1;;;;;;2293:28:72;;;;;;:18;;;:28;;;;;;;;:36;;-1:-1:-1;;;;;;2293:36:72;-1:-1:-1;;;;;2293:36:72;;;;;;;;2337:26;;:19;;;:26;;;;;:40;;:30;:40::i;:::-;-1:-1:-1;;2406:3:72;;1996:428;;;;1737:691;;1667:761;;:::o;3484:1175::-;-1:-1:-1;;;;;;;;;;;3656:4:72;-1:-1:-1;;;;;3639:22:72;;;3635:62;;3670:27;;-1:-1:-1;;;3670:27:72;;;;;;;;;;;3635:62;3709:25;:2;3728:5;3709:18;:25::i;:::-;3704:52;;3736:20;:2;3750:5;3736:13;:20::i;:::-;;3704:52;3787:16;;3763:21;3810:845;3830:13;3826:1;:17;3810:845;;;3855:15;3873:9;3883:1;3873:12;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;;;3898:21:72;;3894:81;;3938:28;;-1:-1:-1;;;3938:28:72;;;;;;;;;;;3894:81;-1:-1:-1;;;;;;4002:28:72;;3983:16;4002:28;;;:18;;;:28;;;;;;-1:-1:-1;;;;;4002:28:72;4063:4;4043:25;;4039:65;;4077:27;;-1:-1:-1;;;4077:27:72;;;;;;;;;;;4039:65;-1:-1:-1;;;;;4117:22:72;;4113:92;;4158:38;;-1:-1:-1;;;4158:38:72;;-1:-1:-1;;;;;7954:32:516;;4158:38:72;;;7936:51:516;7909:18;;4158:38:72;7790:203:516;4113:92:72;4229:5;-1:-1:-1;;;;;4217:17:72;:8;-1:-1:-1;;;;;4217:17:72;;4213:104;;4253:55;;-1:-1:-1;;;4253:55:72;;-1:-1:-1;;;;;;8160:33:516;;4253:55:72;;;8142:52:516;8115:18;;4253:55:72;7998:202:516;4213:104:72;-1:-1:-1;;;;;;4366:28:72;;;;;;:18;;;:28;;;;;;;;:36;;-1:-1:-1;;;;;;4366:36:72;-1:-1:-1;;;;;4366:36:72;;;;;;;;;;4411:29;;;;:19;;;:29;;;;;:46;;:36;:46::i;:::-;-1:-1:-1;;;;;;4466:26:72;;;;;;:19;;;:26;;;;;:40;;-1:-1:-1;;;;;;4466:40:72;;:30;:40::i;:::-;-1:-1:-1;;;;;;4519:29:72;;;;;;:19;;;:29;;;;;:38;;:36;:38::i;:::-;4561:1;4519:43;4515:94;;4574:26;:2;4591:8;4574:16;:26::i;:::-;;4515:94;-1:-1:-1;;4637:3:72;;3810:845;;2565:786;-1:-1:-1;;;;;;;;;;;2736:4:72;-1:-1:-1;;;;;2719:22:72;;;2715:62;;2750:27;;-1:-1:-1;;;2750:27:72;;;;;;;;;;;2715:62;2789:25;:2;2808:5;2789:18;:25::i;:::-;2784:69;;2823:30;;-1:-1:-1;;;2823:30:72;;-1:-1:-1;;;;;7954:32:516;;2823:30:72;;;7936:51:516;7909:18;;2823:30:72;7790:203:516;2784:69:72;2865:9;2860:397;2880:9;:16;2876:1;:20;2860:397;;;2911:15;2929:9;2939:1;2929:12;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;;;2954:21:72;;2950:81;;2994:28;;-1:-1:-1;;;2994:28:72;;;;;;;;;;;2950:81;-1:-1:-1;;;;;;3043:28:72;;;;;;:18;;;:28;;;;;;-1:-1:-1;;;;;3043:37:72;;;:28;;:37;3039:116;;3099:47;;-1:-1:-1;;;3099:47:72;;-1:-1:-1;;;;;8395:32:516;;3099:47:72;;;8377:51:516;-1:-1:-1;;;;;;8464:33:516;;8444:18;;;8437:61;8350:18;;3099:47:72;8205:299:516;3039:116:72;-1:-1:-1;;;;;;3170:28:72;;;;;;:18;;;:28;;;;;;;;3163:35;;-1:-1:-1;;;;;;3163:35:72;;;-1:-1:-1;;;;;3207:26:72;;;;:19;;;:26;;;;;:43;;:33;:43::i;:::-;-1:-1:-1;;2898:3:72;;2860:397;;;-1:-1:-1;;;;;;3267:26:72;;;;;;:19;;;:26;;;;;:35;;:33;:35::i;:::-;3306:1;3267:40;3263:84;;3317:23;:2;3334:5;3317:16;:23::i;:::-;;2638:713;2565:786;;:::o;5372:306::-;-1:-1:-1;;;;;5506:18:72;;5502:31;;5372:306;;;:::o;5502:31::-;5543:4;-1:-1:-1;;;;;5543:16:72;;5563:1;5543:21;5539:81;;5581:32;;-1:-1:-1;;;5581:32:72;;-1:-1:-1;;;;;7954:32:516;;5581::72;;;7936:51:516;7909:18;;5581:32:72;7790:203:516;5539:81:72;5626:47;5655:4;5661:11;5626:28;:47::i;8871:165:449:-;-1:-1:-1;;;;;9004:23:449;;8951:4;4360:21;;;:14;;;:21;;;;;;:26;;8974:55;8967:62;;8871:165;;;;;:::o;8316:150::-;8386:4;8409:50;8414:3;-1:-1:-1;;;;;8434:23:449;;8409:4;:50::i;5930:123::-;6000:4;6023:23;6028:3;6040:5;6023:4;:23::i;6221:129::-;6294:4;6317:26;6325:3;6337:5;6317:7;:26::i;6650:115::-;6713:7;6739:19;6747:3;4556:18;;4474:107;8634:156;8707:4;8730:53;8738:3;-1:-1:-1;;;;;8758:23:449;;8730:7;:53::i;4106:253:430:-;4189:12;4214;4228:23;4255:6;-1:-1:-1;;;;;4255:19:430;4275:4;4255:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4213:67:430;;-1:-1:-1;4213:67:430;-1:-1:-1;4297:55:430;4324:6;4213:67;;4297:26;:55::i;:::-;4290:62;4106:253;-1:-1:-1;;;;;4106:253:430:o;2241:406:449:-;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:449;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:449;2618:12;;2815:1368;2881:4;3010:21;;;:14;;;:21;;;;;;3046:13;;3042:1135;;3413:18;3434:12;3445:1;3434:8;:12;:::i;:::-;3480:18;;3413:33;;-1:-1:-1;3460:17:449;;3480:22;;3501:1;;3480:22;:::i;:::-;3460:42;;3535:9;3521:10;:23;3517:378;;3564:17;3584:3;:11;;3596:9;3584:22;;;;;;;;:::i;:::-;;;;;;;;;3564:42;;3731:9;3705:3;:11;;3717:10;3705:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;3844:25;;;:14;;;:25;;;;;:36;;;3517:378;3973:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4076:3;:14;;:21;4091:5;4076:21;;;;;;;;;;;4069:28;;;4119:4;4112:11;;;;;;;3042:1135;4161:5;4154:12;;;;;4625:582:430;4769:12;4798:7;4793:408;;4821:19;4829:10;4821:7;:19::i;:::-;4793:408;;;5045:17;;:22;:49;;;;-1:-1:-1;;;;;;5071:18:430;;;:23;5045:49;5041:119;;;5121:24;;-1:-1:-1;;;5121:24:430;;-1:-1:-1;;;;;7954:32:516;;5121:24:430;;;7936:51:516;7909:18;;5121:24:430;7790:203:516;5041:119:430;-1:-1:-1;5180:10:430;4793:408;4625:582;;;;;:::o;5743:516::-;5874:17;;:21;5870:383;;6102:10;6096:17;6158:15;6145:10;6141:2;6137:19;6130:44;5870:383;6225:17;;-1:-1:-1;;;6225:17:430;;;;;;;;;;;14:127:516;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:253;218:2;212:9;260:4;248:17;;-1:-1:-1;;;;;280:34:516;;316:22;;;277:62;274:88;;;342:18;;:::i;:::-;378:2;371:22;146:253;:::o;404:275::-;475:2;469:9;540:2;521:13;;-1:-1:-1;;517:27:516;505:40;;-1:-1:-1;;;;;560:34:516;;596:22;;;557:62;554:88;;;622:18;;:::i;:::-;658:2;651:22;404:275;;-1:-1:-1;404:275:516:o;684:191::-;752:4;-1:-1:-1;;;;;774:30:516;;771:56;;;807:18;;:::i;:::-;-1:-1:-1;852:1:516;848:14;864:4;844:25;;684:191::o;880:177::-;959:13;;-1:-1:-1;;;;;1001:31:516;;991:42;;981:70;;1047:1;1044;1037:12;981:70;880:177;;;:::o;1062:250::-;1147:1;1157:113;1171:6;1168:1;1165:13;1157:113;;;1247:11;;;1241:18;1228:11;;;1221:39;1193:2;1186:10;1157:113;;;-1:-1:-1;;1304:1:516;1286:16;;1279:27;1062:250::o;1317:509::-;1370:5;1423:3;1416:4;1408:6;1404:17;1400:27;1390:55;;1441:1;1438;1431:12;1390:55;1464:13;;-1:-1:-1;;;;;1489:26:516;;1486:52;;;1518:18;;:::i;:::-;1562:55;1605:2;1586:13;;-1:-1:-1;;1582:27:516;1611:4;1578:38;1562:55;:::i;:::-;1642:2;1633:7;1626:19;1688:3;1681:4;1676:2;1668:6;1664:15;1660:26;1657:35;1654:55;;;1705:1;1702;1695:12;1654:55;1718:77;1792:2;1785:4;1776:7;1772:18;1765:4;1757:6;1753:17;1718:77;:::i;:::-;1813:7;1317:509;-1:-1:-1;;;;1317:509:516:o;1831:2804::-;1930:6;1983:2;1971:9;1962:7;1958:23;1954:32;1951:52;;;1999:1;1996;1989:12;1951:52;2026:16;;-1:-1:-1;;;;;2091:14:516;;;2088:34;;;2118:1;2115;2108:12;2088:34;2141:22;;;;2197:4;2179:16;;;2175:27;2172:47;;;2215:1;2212;2205:12;2172:47;2241:22;;:::i;:::-;2294:2;2288:9;2322:2;2312:8;2309:16;2306:36;;;2338:1;2335;2328:12;2306:36;2361:17;;2409:4;2401:13;;2397:27;-1:-1:-1;2387:55:516;;2438:1;2435;2428:12;2387:55;2467:2;2461:9;2490:68;2506:51;2554:2;2506:51;:::i;:::-;2490:68;:::i;:::-;2580:3;2604:2;2599:3;2592:15;2632:2;2627:3;2623:12;2616:19;;2683:2;2677;2674:1;2670:10;2666:2;2662:19;2658:28;2644:42;;2709:7;2701:6;2698:19;2695:39;;;2730:1;2727;2720:12;2695:39;2762:2;2758;2754:11;2774:1551;2790:6;2785:3;2782:15;2774:1551;;;2869:3;2863:10;2905:2;2892:11;2889:19;2886:39;;;2921:1;2918;2911:12;2886:39;2948:20;;3020:4;2992:16;;;-1:-1:-1;;2988:30:516;2984:41;2981:61;;;3038:1;3035;3028:12;2981:61;3070:22;;:::i;:::-;3121:42;3159:2;3155;3151:11;3121:42;:::i;:::-;3112:7;3105:59;3206:2;3202;3198:11;3192:18;3245:1;3236:7;3233:14;3223:42;;3261:1;3258;3251:12;3223:42;3298:2;3285:16;;3278:33;3354:4;3346:13;;3340:20;3376:16;;;3373:36;;;3405:1;3402;3395:12;3373:36;3440:8;3436:2;3432:17;3422:27;;;3489:7;3484:2;3480;3476:11;3472:25;3462:53;;3511:1;3508;3501:12;3462:53;3552:2;3548;3544:11;3538:18;3582:68;3598:51;3646:2;3598:51;:::i;3582:68::-;3694:17;;;3792:1;3788:10;;;;3780:19;;3801:2;3776:28;;3744:2;3733:14;;;3820:21;;;3817:41;;;3854:1;3851;3844:12;3817:41;3892:2;3888;3884:11;3871:24;;3908:298;3926:8;3919:5;3916:19;3908:298;;;4009:12;;-1:-1:-1;;;;;;4060:34:516;;4048:47;;4038:75;;4109:1;4106;4099:12;4038:75;4130:22;;4189:2;3947:14;;;;4178;;;;3908:298;;;4239:2;4226:16;;4219:31;-1:-1:-1;;4263:20:516;;-1:-1:-1;4312:2:516;4303:12;;;;2807;2774:1551;;;-1:-1:-1;4334:20:516;;-1:-1:-1;4386:42:516;;-1:-1:-1;;4424:2:516;4416:11;;4386:42;:::i;:::-;4381:2;4374:5;4370:14;4363:66;4468:2;4464;4460:11;4454:18;4497:2;4487:8;4484:16;4481:36;;;4513:1;4510;4503:12;4481:36;4549:55;4596:7;4585:8;4581:2;4577:17;4549:55;:::i;:::-;4544:2;4533:14;;4526:79;-1:-1:-1;4537:5:516;1831:2804;-1:-1:-1;;;;;1831:2804:516:o;5043:127::-;5104:10;5099:3;5095:20;5092:1;5085:31;5135:4;5132:1;5125:15;5159:4;5156:1;5149:15;5175:127;5236:10;5231:3;5227:20;5224:1;5217:31;5267:4;5264:1;5257:15;5291:4;5288:1;5281:15;5416:270;5457:3;5495:5;5489:12;5522:6;5517:3;5510:19;5538:76;5607:6;5600:4;5595:3;5591:14;5584:4;5577:5;5573:16;5538:76;:::i;:::-;5668:2;5647:15;-1:-1:-1;;5643:29:516;5634:39;;;;5675:4;5630:50;;5416:270;-1:-1:-1;;5416:270:516:o;5691:2094::-;5961:4;5990:2;6030;6019:9;6015:18;6060:2;6049:9;6042:21;6083:6;6118;6112:13;6149:6;6141;6134:22;6175:3;6165:13;;6209:3;6198:9;6194:19;6187:26;;6272:3;6262:6;6259:1;6255:14;6244:9;6240:30;6236:40;6295:4;6334:2;6326:6;6322:15;6355:1;6365:1249;6379:6;6376:1;6373:13;6365:1249;;;6444:22;;;-1:-1:-1;;6440:37:516;6428:50;;6501:13;;6588:9;;-1:-1:-1;;;;;6584:35:516;6569:51;;6659:11;;;6653:18;6541:15;;;;6711:1;6694:19;;6684:170;;6764:10;6759:3;6755:20;6752:1;6745:31;6803:4;6800:1;6793:15;6835:4;6832:1;6825:15;6684:170;6874:15;;;6867:37;6927:4;6972:11;;;6966:18;7004:15;;;6997:27;;;7085:21;;7119:24;;;;7209:23;;;;-1:-1:-1;;7165:15:516;;;;7270:236;7286:8;7281:3;7278:17;7270:236;;;7367:15;;-1:-1:-1;;;;;;7363:42:516;7349:57;;7475:17;;;;7314:1;7305:11;;;;;7432:14;;;;7270:236;;;-1:-1:-1;7592:12:516;;;;7529:5;-1:-1:-1;;;7557:15:516;;;;6401:1;6394:9;6365:1249;;;-1:-1:-1;;;;;;;5373:31:516;;7650:18;;;5361:44;7707:22;;;7700:4;7685:20;;7678:52;7747:32;7711:6;7764;7747:32;:::i;:::-;7739:40;5691:2094;-1:-1:-1;;;;;;;;;;5691:2094:516:o;8509:287::-;8638:3;8676:6;8670:13;8692:66;8751:6;8746:3;8739:4;8731:6;8727:17;8692:66;:::i;:::-;8774:16;;;;;8509:287;-1:-1:-1;;8509:287:516:o;8801:225::-;8868:9;;;8889:11;;;8886:134;;;8942:10;8937:3;8933:20;8930:1;8923:31;8977:4;8974:1;8967:15;9005:4;9002:1;8995:15;9031:127;9092:10;9087:3;9083:20;9080:1;9073:31;9123:4;9120:1;9113:15;9147:4;9144:1;9137:15;9031:127;396:796:69;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405236600a57005b60106012565b005b6000601a6069565b9050806001600160a01b03163b6000036046576040516321f27f0d60e21b815260040160405180910390fd5b3660008037600080366000845af43d6000803e8080156064573d6000f35b3d6000fd5b600080356001600160e01b03191681527fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc90260205260409020546001600160a01b03168060c857604051630ff409c160e11b815260040160405180910390fd5b9056","sourceMap":"396:796:69:-:0;;;;;;;;284:11:137;:9;:11::i;:::-;396:796:69;304:527:137;340:13;356:20;:18;:20::i;:::-;340:36;;387:5;-1:-1:-1;;;;;387:17:137;;408:1;387:22;383:71;;418:36;;-1:-1:-1;;;418:36:137;;;;;;;;;;;383:71;549:14;546:1;543;530:34;634:1;631;615:14;612:1;605:5;598;585:51;664:16;661:1;658;643:38;696:6;709:52;;;;796:16;793:1;786:27;709:52;736:16;733:1;726:27;975:215:69;1065:13;1110:7;;-1:-1:-1;;;;;;1110:7:69;1186:52:91;;:42;:52;;;;;;-1:-1:-1;;;;;1186:52:91;;1124:61:69;;1156:29;;-1:-1:-1;;;1156:29:69;;;;;;;;;;;1124:61;975:215;:::o","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facetAddress\",\"type\":\"address\"},{\"internalType\":\"enum IDiamond.FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"functionSelectors\",\"type\":\"bytes4[]\"}],\"internalType\":\"struct IDiamond.FacetCut[]\",\"name\":\"baseFacets\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"init\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initData\",\"type\":\"bytes\"}],\"internalType\":\"struct Diamond.InitParams\",\"name\":\"initDiamondCut\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"DiamondCut_FunctionAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"DiamondCut_FunctionDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"DiamondCut_FunctionFromSameFacetAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DiamondCut_ImmutableFacet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"init\",\"type\":\"address\"}],\"name\":\"DiamondCut_InvalidContract\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"DiamondCut_InvalidFacet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DiamondCut_InvalidFacetCutAction\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DiamondCut_InvalidFacetCutLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"DiamondCut_InvalidFacetRemoval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"DiamondCut_InvalidFacetSelectors\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DiamondCut_InvalidSelector\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Diamond_UnsupportedFunction\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initializable_AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Proxy__ImplementationIsNotContract\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facetAddress\",\"type\":\"address\"},{\"internalType\":\"enum IDiamond.FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"functionSelectors\",\"type\":\"bytes4[]\"}],\"indexed\":false,\"internalType\":\"struct IDiamond.FacetCut[]\",\"name\":\"facetCuts\",\"type\":\"tuple[]\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"init\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"initPayload\",\"type\":\"bytes\"}],\"name\":\"DiamondCut\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"FailedInnerCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}]},\"events\":{\"DiamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"params\":{\"facetCuts\":\"Facet addresses and function selectors.\",\"init\":\"Address of contract or facet to execute initPayload.\",\"initPayload\":\"A function call, including function selector and arguments.\"}}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"errors\":{\"Diamond_UnsupportedFunction()\":[{\"notice\":\"Thrown when calling a function that was not registered in the diamond.\"}]},\"events\":{\"DiamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"notice\":\"Event emitted when facets are added/removed/replaced\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/diamond/Diamond.sol\":\"Diamond\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/Diamond.sol\":{\"keccak256\":\"0x9e4da6928d58a8f0f62062cd4070dbcebdb716539e7a9d5cdb24588f5e20b84b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c1db36481f741516e8bf5b6ce4eccbc8f91b6a5ee4351cb629e5c5f9b04c19f2\",\"dweb:/ipfs/QmUVbZLWr9evtBpD3q9z9V1EJrchujUUxbS4SFKTEj5pU5\"]},\"contracts/src/diamond/IDiamond.sol\":{\"keccak256\":\"0xd4907618ad3b9847c656008815820f23a89a587e408712b450cff075625e1553\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://652645a543f65b0415327a8a88398fc7835b1d6ee01df8c898f9e43867d02714\",\"dweb:/ipfs/QmPXt4Kks2o5CJKbT8U1mCryQJP6EMzzP5kdcqUFvXX7y5\"]},\"contracts/src/diamond/facets/cut/DiamondCutBase.sol\":{\"keccak256\":\"0x45ed391ae6aa52996ce3fc3095b0d420457fa5f58a2c5a2f9939e2b55dc8e7a6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f6a5e87525d3c98c10ceb838124d48fdf7e687ffddbdb1647b93dc5882d91339\",\"dweb:/ipfs/Qmf137S5255pVWXpfFnrU3fdE3G6Di2VuJQueBn8SC8cpd\"]},\"contracts/src/diamond/facets/cut/DiamondCutStorage.sol\":{\"keccak256\":\"0xf47d0ca88515dc8714c89931c5a91c402bac3fad08388d780a0873e962386071\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://04d4023a5be5140892c547bb5df4eb5906120d1eca3bf29fc562da991639c894\",\"dweb:/ipfs/QmVf28LUpAVeCz5Aiewbjt7ZzM6bixZn166aS1PVJGzSSX\"]},\"contracts/src/diamond/facets/cut/IDiamondCut.sol\":{\"keccak256\":\"0xa5985f00fabb7f6e5925542c9d0c955d4e7ec4f9ffe59d0fa81d75bed7ecdd55\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2ebbb450aac3c12f690d7457d04d6fc53736b36cc60dcd757e11840335103688\",\"dweb:/ipfs/QmbcjTgejYrj3m2Lj9hHpCe2wt63fmLhhN6aY8XFoScitw\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/loupe/DiamondLoupeBase.sol\":{\"keccak256\":\"0xad4a6b5803d9ba9cc7aba2d52a1f5129049f05102a202522550641877e348436\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b2ea927748e41a3a6c5ac7cd255a64b8d0eaddec1153e2bfa81b80bbdcffb4e\",\"dweb:/ipfs/QmW4hBGMrER8DFGeC8M7nGyomcazy3k8rDTUDMcRaZEs7G\"]},\"contracts/src/diamond/facets/loupe/IDiamondLoupe.sol\":{\"keccak256\":\"0xafbe8346e6043ac3f6977e9ca43603ca3bbbfc2c2962b47024cf9aa0dcb23f7f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7b0fd31aeddde2f351471e0fd1f5a5da20570491d5604420b283a4749838514c\",\"dweb:/ipfs/QmbuKxmTX8HC9SHNUPsraBTc6NWECwsbgmXsrpXjPqkLLi\"]},\"contracts/src/diamond/proxy/IProxy.sol\":{\"keccak256\":\"0xb3cc38cae21021aec88e128eaec4994e926e4961d166c7e6e3a40a41c69aa105\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6da721f34f1359068ebe71ce01472403940b4e8fe87c38ff5be2d77e673520e5\",\"dweb:/ipfs/QmfNgDv5eQsLzc9bKi1EGWdxDX84Vhr2SARa7zm4pcCdpy\"]},\"contracts/src/diamond/proxy/Proxy.sol\":{\"keccak256\":\"0xae6d6933073274683d2684fc806cffbdc157d56b181d7ea0c962c3cd7746b78d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://43378c060da21e547d10282839ff3dc690615c8993949f6a072f9ed4693ba548\",\"dweb:/ipfs/QmaT7GdtDpNBRJPLRnGEoGmZJSFNPkqHUzPde5LSYXc1q1\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"struct Diamond.InitParams","name":"initDiamondCut","type":"tuple","components":[{"internalType":"struct IDiamond.FacetCut[]","name":"baseFacets","type":"tuple[]","components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamond.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}]},{"internalType":"address","name":"init","type":"address"},{"internalType":"bytes","name":"initData","type":"bytes"}]}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"type":"error","name":"DiamondCut_FunctionAlreadyExists"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"type":"error","name":"DiamondCut_FunctionDoesNotExist"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"type":"error","name":"DiamondCut_FunctionFromSameFacetAlreadyExists"},{"inputs":[],"type":"error","name":"DiamondCut_ImmutableFacet"},{"inputs":[{"internalType":"address","name":"init","type":"address"}],"type":"error","name":"DiamondCut_InvalidContract"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"type":"error","name":"DiamondCut_InvalidFacet"},{"inputs":[],"type":"error","name":"DiamondCut_InvalidFacetCutAction"},{"inputs":[],"type":"error","name":"DiamondCut_InvalidFacetCutLength"},{"inputs":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"type":"error","name":"DiamondCut_InvalidFacetRemoval"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"type":"error","name":"DiamondCut_InvalidFacetSelectors"},{"inputs":[],"type":"error","name":"DiamondCut_InvalidSelector"},{"inputs":[],"type":"error","name":"Diamond_UnsupportedFunction"},{"inputs":[],"type":"error","name":"FailedInnerCall"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32"}],"type":"error","name":"Initializable_AlreadyInitialized"},{"inputs":[],"type":"error","name":"Proxy__ImplementationIsNotContract"},{"inputs":[{"internalType":"struct IDiamond.FacetCut[]","name":"facetCuts","type":"tuple[]","components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamond.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"indexed":false},{"internalType":"address","name":"init","type":"address","indexed":false},{"internalType":"bytes","name":"initPayload","type":"bytes","indexed":false}],"type":"event","name":"DiamondCut","anonymous":false},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[],"stateMutability":"payable","type":"fallback"},{"inputs":[],"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/diamond/Diamond.sol":"Diamond"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/Diamond.sol":{"keccak256":"0x9e4da6928d58a8f0f62062cd4070dbcebdb716539e7a9d5cdb24588f5e20b84b","urls":["bzz-raw://c1db36481f741516e8bf5b6ce4eccbc8f91b6a5ee4351cb629e5c5f9b04c19f2","dweb:/ipfs/QmUVbZLWr9evtBpD3q9z9V1EJrchujUUxbS4SFKTEj5pU5"],"license":"Apache-2.0"},"contracts/src/diamond/IDiamond.sol":{"keccak256":"0xd4907618ad3b9847c656008815820f23a89a587e408712b450cff075625e1553","urls":["bzz-raw://652645a543f65b0415327a8a88398fc7835b1d6ee01df8c898f9e43867d02714","dweb:/ipfs/QmPXt4Kks2o5CJKbT8U1mCryQJP6EMzzP5kdcqUFvXX7y5"],"license":"Apache-2.0"},"contracts/src/diamond/facets/cut/DiamondCutBase.sol":{"keccak256":"0x45ed391ae6aa52996ce3fc3095b0d420457fa5f58a2c5a2f9939e2b55dc8e7a6","urls":["bzz-raw://f6a5e87525d3c98c10ceb838124d48fdf7e687ffddbdb1647b93dc5882d91339","dweb:/ipfs/Qmf137S5255pVWXpfFnrU3fdE3G6Di2VuJQueBn8SC8cpd"],"license":"Apache-2.0"},"contracts/src/diamond/facets/cut/DiamondCutStorage.sol":{"keccak256":"0xf47d0ca88515dc8714c89931c5a91c402bac3fad08388d780a0873e962386071","urls":["bzz-raw://04d4023a5be5140892c547bb5df4eb5906120d1eca3bf29fc562da991639c894","dweb:/ipfs/QmVf28LUpAVeCz5Aiewbjt7ZzM6bixZn166aS1PVJGzSSX"],"license":"Apache-2.0"},"contracts/src/diamond/facets/cut/IDiamondCut.sol":{"keccak256":"0xa5985f00fabb7f6e5925542c9d0c955d4e7ec4f9ffe59d0fa81d75bed7ecdd55","urls":["bzz-raw://2ebbb450aac3c12f690d7457d04d6fc53736b36cc60dcd757e11840335103688","dweb:/ipfs/QmbcjTgejYrj3m2Lj9hHpCe2wt63fmLhhN6aY8XFoScitw"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/loupe/DiamondLoupeBase.sol":{"keccak256":"0xad4a6b5803d9ba9cc7aba2d52a1f5129049f05102a202522550641877e348436","urls":["bzz-raw://1b2ea927748e41a3a6c5ac7cd255a64b8d0eaddec1153e2bfa81b80bbdcffb4e","dweb:/ipfs/QmW4hBGMrER8DFGeC8M7nGyomcazy3k8rDTUDMcRaZEs7G"],"license":"Apache-2.0"},"contracts/src/diamond/facets/loupe/IDiamondLoupe.sol":{"keccak256":"0xafbe8346e6043ac3f6977e9ca43603ca3bbbfc2c2962b47024cf9aa0dcb23f7f","urls":["bzz-raw://7b0fd31aeddde2f351471e0fd1f5a5da20570491d5604420b283a4749838514c","dweb:/ipfs/QmbuKxmTX8HC9SHNUPsraBTc6NWECwsbgmXsrpXjPqkLLi"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/IProxy.sol":{"keccak256":"0xb3cc38cae21021aec88e128eaec4994e926e4961d166c7e6e3a40a41c69aa105","urls":["bzz-raw://6da721f34f1359068ebe71ce01472403940b4e8fe87c38ff5be2d77e673520e5","dweb:/ipfs/QmfNgDv5eQsLzc9bKi1EGWdxDX84Vhr2SARa7zm4pcCdpy"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/Proxy.sol":{"keccak256":"0xae6d6933073274683d2684fc806cffbdc157d56b181d7ea0c962c3cd7746b78d","urls":["bzz-raw://43378c060da21e547d10282839ff3dc690615c8993949f6a072f9ed4693ba548","dweb:/ipfs/QmaT7GdtDpNBRJPLRnGEoGmZJSFNPkqHUzPde5LSYXc1q1"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":69} \ No newline at end of file diff --git a/packages/generated/dev/abis/Diamond.metadata.json b/packages/generated/dev/abis/Diamond.metadata.json new file mode 100644 index 000000000..870c27a90 --- /dev/null +++ b/packages/generated/dev/abis/Diamond.metadata.json @@ -0,0 +1,401 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "struct Diamond.InitParams", + "name": "initDiamondCut", + "type": "tuple", + "components": [ + { + "internalType": "struct IDiamond.FacetCut[]", + "name": "baseFacets", + "type": "tuple[]", + "components": [ + { + "internalType": "address", + "name": "facetAddress", + "type": "address" + }, + { + "internalType": "enum IDiamond.FacetCutAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "bytes4[]", + "name": "functionSelectors", + "type": "bytes4[]" + } + ] + }, + { + "internalType": "address", + "name": "init", + "type": "address" + }, + { + "internalType": "bytes", + "name": "initData", + "type": "bytes" + } + ] + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "type": "error", + "name": "AddressEmptyCode" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "type": "error", + "name": "DiamondCut_FunctionAlreadyExists" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "facet", + "type": "address" + } + ], + "type": "error", + "name": "DiamondCut_FunctionDoesNotExist" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "type": "error", + "name": "DiamondCut_FunctionFromSameFacetAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "DiamondCut_ImmutableFacet" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "init", + "type": "address" + } + ], + "type": "error", + "name": "DiamondCut_InvalidContract" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "facet", + "type": "address" + } + ], + "type": "error", + "name": "DiamondCut_InvalidFacet" + }, + { + "inputs": [], + "type": "error", + "name": "DiamondCut_InvalidFacetCutAction" + }, + { + "inputs": [], + "type": "error", + "name": "DiamondCut_InvalidFacetCutLength" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "facet", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "type": "error", + "name": "DiamondCut_InvalidFacetRemoval" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "facet", + "type": "address" + } + ], + "type": "error", + "name": "DiamondCut_InvalidFacetSelectors" + }, + { + "inputs": [], + "type": "error", + "name": "DiamondCut_InvalidSelector" + }, + { + "inputs": [], + "type": "error", + "name": "Diamond_UnsupportedFunction" + }, + { + "inputs": [], + "type": "error", + "name": "FailedInnerCall" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32" + } + ], + "type": "error", + "name": "Initializable_AlreadyInitialized" + }, + { + "inputs": [], + "type": "error", + "name": "Proxy__ImplementationIsNotContract" + }, + { + "inputs": [ + { + "internalType": "struct IDiamond.FacetCut[]", + "name": "facetCuts", + "type": "tuple[]", + "components": [ + { + "internalType": "address", + "name": "facetAddress", + "type": "address" + }, + { + "internalType": "enum IDiamond.FacetCutAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "bytes4[]", + "name": "functionSelectors", + "type": "bytes4[]" + } + ], + "indexed": false + }, + { + "internalType": "address", + "name": "init", + "type": "address", + "indexed": false + }, + { + "internalType": "bytes", + "name": "initPayload", + "type": "bytes", + "indexed": false + } + ], + "type": "event", + "name": "DiamondCut", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "stateMutability": "payable", + "type": "receive" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/diamond/Diamond.sol": "Diamond" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/Diamond.sol": { + "keccak256": "0x9e4da6928d58a8f0f62062cd4070dbcebdb716539e7a9d5cdb24588f5e20b84b", + "urls": [ + "bzz-raw://c1db36481f741516e8bf5b6ce4eccbc8f91b6a5ee4351cb629e5c5f9b04c19f2", + "dweb:/ipfs/QmUVbZLWr9evtBpD3q9z9V1EJrchujUUxbS4SFKTEj5pU5" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/IDiamond.sol": { + "keccak256": "0xd4907618ad3b9847c656008815820f23a89a587e408712b450cff075625e1553", + "urls": [ + "bzz-raw://652645a543f65b0415327a8a88398fc7835b1d6ee01df8c898f9e43867d02714", + "dweb:/ipfs/QmPXt4Kks2o5CJKbT8U1mCryQJP6EMzzP5kdcqUFvXX7y5" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/cut/DiamondCutBase.sol": { + "keccak256": "0x45ed391ae6aa52996ce3fc3095b0d420457fa5f58a2c5a2f9939e2b55dc8e7a6", + "urls": [ + "bzz-raw://f6a5e87525d3c98c10ceb838124d48fdf7e687ffddbdb1647b93dc5882d91339", + "dweb:/ipfs/Qmf137S5255pVWXpfFnrU3fdE3G6Di2VuJQueBn8SC8cpd" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/cut/DiamondCutStorage.sol": { + "keccak256": "0xf47d0ca88515dc8714c89931c5a91c402bac3fad08388d780a0873e962386071", + "urls": [ + "bzz-raw://04d4023a5be5140892c547bb5df4eb5906120d1eca3bf29fc562da991639c894", + "dweb:/ipfs/QmVf28LUpAVeCz5Aiewbjt7ZzM6bixZn166aS1PVJGzSSX" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/cut/IDiamondCut.sol": { + "keccak256": "0xa5985f00fabb7f6e5925542c9d0c955d4e7ec4f9ffe59d0fa81d75bed7ecdd55", + "urls": [ + "bzz-raw://2ebbb450aac3c12f690d7457d04d6fc53736b36cc60dcd757e11840335103688", + "dweb:/ipfs/QmbcjTgejYrj3m2Lj9hHpCe2wt63fmLhhN6aY8XFoScitw" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/loupe/DiamondLoupeBase.sol": { + "keccak256": "0xad4a6b5803d9ba9cc7aba2d52a1f5129049f05102a202522550641877e348436", + "urls": [ + "bzz-raw://1b2ea927748e41a3a6c5ac7cd255a64b8d0eaddec1153e2bfa81b80bbdcffb4e", + "dweb:/ipfs/QmW4hBGMrER8DFGeC8M7nGyomcazy3k8rDTUDMcRaZEs7G" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/loupe/IDiamondLoupe.sol": { + "keccak256": "0xafbe8346e6043ac3f6977e9ca43603ca3bbbfc2c2962b47024cf9aa0dcb23f7f", + "urls": [ + "bzz-raw://7b0fd31aeddde2f351471e0fd1f5a5da20570491d5604420b283a4749838514c", + "dweb:/ipfs/QmbuKxmTX8HC9SHNUPsraBTc6NWECwsbgmXsrpXjPqkLLi" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/IProxy.sol": { + "keccak256": "0xb3cc38cae21021aec88e128eaec4994e926e4961d166c7e6e3a40a41c69aa105", + "urls": [ + "bzz-raw://6da721f34f1359068ebe71ce01472403940b4e8fe87c38ff5be2d77e673520e5", + "dweb:/ipfs/QmfNgDv5eQsLzc9bKi1EGWdxDX84Vhr2SARa7zm4pcCdpy" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/Proxy.sol": { + "keccak256": "0xae6d6933073274683d2684fc806cffbdc157d56b181d7ea0c962c3cd7746b78d", + "urls": [ + "bzz-raw://43378c060da21e547d10282839ff3dc690615c8993949f6a072f9ed4693ba548", + "dweb:/ipfs/QmaT7GdtDpNBRJPLRnGEoGmZJSFNPkqHUzPde5LSYXc1q1" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/DiamondCutFacet.abi.json b/packages/generated/dev/abis/DiamondCutFacet.abi.json new file mode 100644 index 000000000..401d3b4fb --- /dev/null +++ b/packages/generated/dev/abis/DiamondCutFacet.abi.json @@ -0,0 +1,314 @@ +[ + { + "type": "function", + "name": "__DiamondCut_init", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "diamondCut", + "inputs": [ + { + "name": "facetCuts", + "type": "tuple[]", + "internalType": "struct IDiamond.FacetCut[]", + "components": [ + { + "name": "facetAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "action", + "type": "uint8", + "internalType": "enum IDiamond.FacetCutAction" + }, + { + "name": "functionSelectors", + "type": "bytes4[]", + "internalType": "bytes4[]" + } + ] + }, + { + "name": "init", + "type": "address", + "internalType": "address" + }, + { + "name": "initPayload", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "DiamondCut", + "inputs": [ + { + "name": "facetCuts", + "type": "tuple[]", + "indexed": false, + "internalType": "struct IDiamond.FacetCut[]", + "components": [ + { + "name": "facetAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "action", + "type": "uint8", + "internalType": "enum IDiamond.FacetCutAction" + }, + { + "name": "functionSelectors", + "type": "bytes4[]", + "internalType": "bytes4[]" + } + ] + }, + { + "name": "init", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "initPayload", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionAlreadyExists", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionDoesNotExist", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionFromSameFacetAlreadyExists", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_ImmutableFacet", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidContract", + "inputs": [ + { + "name": "init", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacet", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetCutAction", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetCutLength", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetRemoval", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + }, + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetSelectors", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidSelector", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_AlreadyInitialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "internalType": "uint32" + } + ] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/DiamondCutFacet.abi.ts b/packages/generated/dev/abis/DiamondCutFacet.abi.ts new file mode 100644 index 000000000..3bbc0f0c2 --- /dev/null +++ b/packages/generated/dev/abis/DiamondCutFacet.abi.ts @@ -0,0 +1,314 @@ +export default [ + { + "type": "function", + "name": "__DiamondCut_init", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "diamondCut", + "inputs": [ + { + "name": "facetCuts", + "type": "tuple[]", + "internalType": "struct IDiamond.FacetCut[]", + "components": [ + { + "name": "facetAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "action", + "type": "uint8", + "internalType": "enum IDiamond.FacetCutAction" + }, + { + "name": "functionSelectors", + "type": "bytes4[]", + "internalType": "bytes4[]" + } + ] + }, + { + "name": "init", + "type": "address", + "internalType": "address" + }, + { + "name": "initPayload", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "DiamondCut", + "inputs": [ + { + "name": "facetCuts", + "type": "tuple[]", + "indexed": false, + "internalType": "struct IDiamond.FacetCut[]", + "components": [ + { + "name": "facetAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "action", + "type": "uint8", + "internalType": "enum IDiamond.FacetCutAction" + }, + { + "name": "functionSelectors", + "type": "bytes4[]", + "internalType": "bytes4[]" + } + ] + }, + { + "name": "init", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "initPayload", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionAlreadyExists", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionDoesNotExist", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionFromSameFacetAlreadyExists", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_ImmutableFacet", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidContract", + "inputs": [ + { + "name": "init", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacet", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetCutAction", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetCutLength", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetRemoval", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + }, + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetSelectors", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidSelector", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_AlreadyInitialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "internalType": "uint32" + } + ] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/DiamondCutFacet.bin b/packages/generated/dev/abis/DiamondCutFacet.bin new file mode 100644 index 000000000..2956331ff --- /dev/null +++ b/packages/generated/dev/abis/DiamondCutFacet.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b611207806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80631f931c1c1461003b5780634f4bb5d614610050575b600080fd5b61004e610049366004610e59565b610058565b005b61004e61018f565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031633146100a9576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6100b16101eb565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16806100f45750805463ffffffff808416911610155b1561011d578054604051630a8ef77f60e31b815263ffffffff90911660048201526024016100a0565b805464ffffffffff191663ffffffff831617640100000000178155610143858585610225565b805464ff000000001916815560405163ffffffff831681527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15050505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166101d957604051630ef4733760e31b815260040160405180910390fd5b6101e96307e4c70760e21b610361565b565b60007f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef52000546102209063ffffffff166001611026565b905090565b825160000361024757604051632795bfe160e11b815260040160405180910390fd5b60005b835181101561031557600084828151811061026757610267611043565b6020026020010151905061027a8161043f565b60008160200151600281111561029257610292611059565b036102ae576102a9816000015182604001516104fb565b61030c565b6001816020015160028111156102c6576102c6611059565b036102dd576102a98160000151826040015161063a565b6002816020015160028111156102f5576102f5611059565b0361030c5761030c8160000151826040015161086b565b5060010161024a565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673838383604051610349939291906110bf565b60405180910390a161035c838383610a2c565b505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146103ee576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610407565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b80516001600160a01b03166104755780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b80516001600160a01b03163014801590610498575080516001600160a01b03163b155b156104c45780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b8060400151516000036104f85780516040516305fb96cb60e41b81526001600160a01b0390911660048201526024016100a0565b50565b7fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc9006105268184610a7f565b610536576105348184610aa6565b505b815160005b8181101561063357600084828151811061055757610557611043565b602090810291909101015190506001600160e01b0319811661058c576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b0316156105db57604051630e6c4db160e41b81526001600160e01b0319821660048201526024016100a0565b6001600160e01b031981166000818152600286016020908152604080832080546001600160a01b0319166001600160a01b038c16908117909155835260038801909152902061062991610abb565b505060010161053b565b5050505050565b7fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc900306001600160a01b0384160361068457604051630e7ce30960e11b815260040160405180910390fd5b61068e8184610a7f565b61069e5761069c8184610aa6565b505b815160005b818110156106335760008482815181106106bf576106bf611043565b602090810291909101015190506001600160e01b031981166106f4576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b031630810361073957604051630e7ce30960e11b815260040160405180910390fd5b6001600160a01b03811661076b5760405163126f174360e11b81526001600160a01b03881660048201526024016100a0565b866001600160a01b0316816001600160a01b0316036107a957604051631403eec360e21b81526001600160e01b0319831660048201526024016100a0565b6001600160e01b031982166000818152600287016020908152604080832080546001600160a01b0319166001600160a01b038d811691909117909155851683526003890190915290206107fb91610ac7565b506001600160a01b0387166000908152600386016020526040902061082a906001600160e01b03198416610abb565b506001600160a01b0381166000908152600386016020526040902061084e90610ad3565b6000036108615761085f8582610add565b505b50506001016106a3565b7fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc900306001600160a01b038416036108b557604051630e7ce30960e11b815260040160405180910390fd5b6108bf8184610a7f565b6108e7576040516344ae58e160e01b81526001600160a01b03841660048201526024016100a0565b60005b82518110156109f157600083828151811061090757610907611043565b602090810291909101015190506001600160e01b0319811661093c576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002840160205260409020546001600160a01b0386811691161461099d5760405162062efb60e51b81526001600160a01b03861660048201526001600160e01b0319821660248201526044016100a0565b6001600160e01b031981166000818152600285016020908152604080832080546001600160a01b03191690556001600160a01b03891683526003870190915290206109e791610ac7565b50506001016108ea565b506001600160a01b03831660009081526003820160205260409020610a1590610ad3565b60000361035c57610a268184610add565b50505050565b6001600160a01b038216610a3f57505050565b816001600160a01b03163b600003610a7557604051633b367e1560e21b81526001600160a01b03831660048201526024016100a0565b610a268282610af2565b6001600160a01b038116600090815260018301602052604081205415155b90505b92915050565b6000610a9d836001600160a01b038416610b68565b6000610a9d8383610b68565b6000610a9d8383610bb7565b6000610aa0825490565b6000610a9d836001600160a01b038416610bb7565b6060600080846001600160a01b031684604051610b0f91906111c2565b600060405180830381855af49150503d8060008114610b4a576040519150601f19603f3d011682016040523d82523d6000602084013e610b4f565b606091505b5091509150610b5f858383610cb1565b95945050505050565b6000818152600183016020526040812054610baf57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610aa0565b506000610aa0565b60008181526001830160205260408120548015610ca0576000610bdb6001836111de565b8554909150600090610bef906001906111de565b9050808214610c54576000866000018281548110610c0f57610c0f611043565b9060005260206000200154905080876000018481548110610c3257610c32611043565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610c6557610c656111f1565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610aa0565b6000915050610aa0565b5092915050565b606082610cc657610cc182610d10565b610d09565b8151158015610cdd57506001600160a01b0384163b155b15610d0657604051639996b31560e01b81526001600160a01b03851660048201526024016100a0565b50805b9392505050565b805115610d205780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715610d7257610d72610d39565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610da157610da1610d39565b604052919050565b600067ffffffffffffffff821115610dc357610dc3610d39565b5060051b60200190565b80356001600160a01b0381168114610de457600080fd5b919050565b600082601f830112610dfa57600080fd5b813567ffffffffffffffff811115610e1457610e14610d39565b610e27601f8201601f1916602001610d78565b818152846020838601011115610e3c57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215610e6e57600080fd5b67ffffffffffffffff8085351115610e8557600080fd5b8435850186601f820112610e9857600080fd5b610eaa610ea58235610da9565b610d78565b81358082526020808301929160051b84010189811115610ec957600080fd5b602084015b81811015610fd1578581351115610ee457600080fd5b803585016060818d03601f19011215610efc57600080fd5b610f04610d4f565b610f1060208301610dcd565b8152604082013560038110610f2457600080fd5b6020820152606082013588811115610f3b57600080fd5b8083019250508c603f830112610f5057600080fd5b6020820135610f61610ea582610da9565b81815260059190911b83016040019060208101908f831115610f8257600080fd5b6040850194505b82851015610fbb5784356001600160e01b0319811614610fa857600080fd5b8435825260209485019490910190610f89565b6040840152505085525060209384019301610ece565b5050809650505050610fe560208601610dcd565b9250604085013581811115610ff957600080fd5b61100587828801610de9565b925050509250925092565b634e487b7160e01b600052601160045260246000fd5b63ffffffff818116838216019080821115610caa57610caa611010565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b60005b8381101561108a578181015183820152602001611072565b50506000910152565b600081518084526110ab81602086016020860161106f565b601f01601f19169290920160200192915050565b60006060808301606084528087518083526080925060808601915060808160051b8701016020808b0160005b8481101561119257898403607f19018652815180516001600160a01b0316855283810151898601906003811061113157634e487b7160e01b600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b8083101561117d5783516001600160e01b0319168252928601926001929092019190860190611153565b509785019795505050908201906001016110eb565b50506001600160a01b038a169088015286810360408801526111b48189611093565b9a9950505050505050505050565b600082516111d481846020870161106f565b9190910192915050565b81810381811115610aa057610aa0611010565b634e487b7160e01b600052603160045260246000fd \ No newline at end of file diff --git a/packages/generated/dev/abis/DiamondCutFacet.json b/packages/generated/dev/abis/DiamondCutFacet.json new file mode 100644 index 000000000..99d0661e1 --- /dev/null +++ b/packages/generated/dev/abis/DiamondCutFacet.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__DiamondCut_init","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"diamondCut","inputs":[{"name":"facetCuts","type":"tuple[]","internalType":"struct IDiamond.FacetCut[]","components":[{"name":"facetAddress","type":"address","internalType":"address"},{"name":"action","type":"uint8","internalType":"enum IDiamond.FacetCutAction"},{"name":"functionSelectors","type":"bytes4[]","internalType":"bytes4[]"}]},{"name":"init","type":"address","internalType":"address"},{"name":"initPayload","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"DiamondCut","inputs":[{"name":"facetCuts","type":"tuple[]","indexed":false,"internalType":"struct IDiamond.FacetCut[]","components":[{"name":"facetAddress","type":"address","internalType":"address"},{"name":"action","type":"uint8","internalType":"enum IDiamond.FacetCutAction"},{"name":"functionSelectors","type":"bytes4[]","internalType":"bytes4[]"}]},{"name":"init","type":"address","indexed":false,"internalType":"address"},{"name":"initPayload","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_FunctionAlreadyExists","inputs":[{"name":"selector","type":"bytes4","internalType":"bytes4"}]},{"type":"error","name":"DiamondCut_FunctionDoesNotExist","inputs":[{"name":"facet","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_FunctionFromSameFacetAlreadyExists","inputs":[{"name":"selector","type":"bytes4","internalType":"bytes4"}]},{"type":"error","name":"DiamondCut_ImmutableFacet","inputs":[]},{"type":"error","name":"DiamondCut_InvalidContract","inputs":[{"name":"init","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_InvalidFacet","inputs":[{"name":"facet","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_InvalidFacetCutAction","inputs":[]},{"type":"error","name":"DiamondCut_InvalidFacetCutLength","inputs":[]},{"type":"error","name":"DiamondCut_InvalidFacetRemoval","inputs":[{"name":"facet","type":"address","internalType":"address"},{"name":"selector","type":"bytes4","internalType":"bytes4"}]},{"type":"error","name":"DiamondCut_InvalidFacetSelectors","inputs":[{"name":"facet","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_InvalidSelector","inputs":[]},{"type":"error","name":"FailedInnerCall","inputs":[]},{"type":"error","name":"Initializable_AlreadyInitialized","inputs":[{"name":"version","type":"uint32","internalType":"uint32"}]},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b611207806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80631f931c1c1461003b5780634f4bb5d614610050575b600080fd5b61004e610049366004610e59565b610058565b005b61004e61018f565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031633146100a9576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6100b16101eb565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16806100f45750805463ffffffff808416911610155b1561011d578054604051630a8ef77f60e31b815263ffffffff90911660048201526024016100a0565b805464ffffffffff191663ffffffff831617640100000000178155610143858585610225565b805464ff000000001916815560405163ffffffff831681527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15050505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166101d957604051630ef4733760e31b815260040160405180910390fd5b6101e96307e4c70760e21b610361565b565b60007f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef52000546102209063ffffffff166001611026565b905090565b825160000361024757604051632795bfe160e11b815260040160405180910390fd5b60005b835181101561031557600084828151811061026757610267611043565b6020026020010151905061027a8161043f565b60008160200151600281111561029257610292611059565b036102ae576102a9816000015182604001516104fb565b61030c565b6001816020015160028111156102c6576102c6611059565b036102dd576102a98160000151826040015161063a565b6002816020015160028111156102f5576102f5611059565b0361030c5761030c8160000151826040015161086b565b5060010161024a565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673838383604051610349939291906110bf565b60405180910390a161035c838383610a2c565b505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146103ee576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610407565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b80516001600160a01b03166104755780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b80516001600160a01b03163014801590610498575080516001600160a01b03163b155b156104c45780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b8060400151516000036104f85780516040516305fb96cb60e41b81526001600160a01b0390911660048201526024016100a0565b50565b7fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc9006105268184610a7f565b610536576105348184610aa6565b505b815160005b8181101561063357600084828151811061055757610557611043565b602090810291909101015190506001600160e01b0319811661058c576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b0316156105db57604051630e6c4db160e41b81526001600160e01b0319821660048201526024016100a0565b6001600160e01b031981166000818152600286016020908152604080832080546001600160a01b0319166001600160a01b038c16908117909155835260038801909152902061062991610abb565b505060010161053b565b5050505050565b7fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc900306001600160a01b0384160361068457604051630e7ce30960e11b815260040160405180910390fd5b61068e8184610a7f565b61069e5761069c8184610aa6565b505b815160005b818110156106335760008482815181106106bf576106bf611043565b602090810291909101015190506001600160e01b031981166106f4576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b031630810361073957604051630e7ce30960e11b815260040160405180910390fd5b6001600160a01b03811661076b5760405163126f174360e11b81526001600160a01b03881660048201526024016100a0565b866001600160a01b0316816001600160a01b0316036107a957604051631403eec360e21b81526001600160e01b0319831660048201526024016100a0565b6001600160e01b031982166000818152600287016020908152604080832080546001600160a01b0319166001600160a01b038d811691909117909155851683526003890190915290206107fb91610ac7565b506001600160a01b0387166000908152600386016020526040902061082a906001600160e01b03198416610abb565b506001600160a01b0381166000908152600386016020526040902061084e90610ad3565b6000036108615761085f8582610add565b505b50506001016106a3565b7fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc900306001600160a01b038416036108b557604051630e7ce30960e11b815260040160405180910390fd5b6108bf8184610a7f565b6108e7576040516344ae58e160e01b81526001600160a01b03841660048201526024016100a0565b60005b82518110156109f157600083828151811061090757610907611043565b602090810291909101015190506001600160e01b0319811661093c576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002840160205260409020546001600160a01b0386811691161461099d5760405162062efb60e51b81526001600160a01b03861660048201526001600160e01b0319821660248201526044016100a0565b6001600160e01b031981166000818152600285016020908152604080832080546001600160a01b03191690556001600160a01b03891683526003870190915290206109e791610ac7565b50506001016108ea565b506001600160a01b03831660009081526003820160205260409020610a1590610ad3565b60000361035c57610a268184610add565b50505050565b6001600160a01b038216610a3f57505050565b816001600160a01b03163b600003610a7557604051633b367e1560e21b81526001600160a01b03831660048201526024016100a0565b610a268282610af2565b6001600160a01b038116600090815260018301602052604081205415155b90505b92915050565b6000610a9d836001600160a01b038416610b68565b6000610a9d8383610b68565b6000610a9d8383610bb7565b6000610aa0825490565b6000610a9d836001600160a01b038416610bb7565b6060600080846001600160a01b031684604051610b0f91906111c2565b600060405180830381855af49150503d8060008114610b4a576040519150601f19603f3d011682016040523d82523d6000602084013e610b4f565b606091505b5091509150610b5f858383610cb1565b95945050505050565b6000818152600183016020526040812054610baf57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610aa0565b506000610aa0565b60008181526001830160205260408120548015610ca0576000610bdb6001836111de565b8554909150600090610bef906001906111de565b9050808214610c54576000866000018281548110610c0f57610c0f611043565b9060005260206000200154905080876000018481548110610c3257610c32611043565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610c6557610c656111f1565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610aa0565b6000915050610aa0565b5092915050565b606082610cc657610cc182610d10565b610d09565b8151158015610cdd57506001600160a01b0384163b155b15610d0657604051639996b31560e01b81526001600160a01b03851660048201526024016100a0565b50805b9392505050565b805115610d205780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715610d7257610d72610d39565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610da157610da1610d39565b604052919050565b600067ffffffffffffffff821115610dc357610dc3610d39565b5060051b60200190565b80356001600160a01b0381168114610de457600080fd5b919050565b600082601f830112610dfa57600080fd5b813567ffffffffffffffff811115610e1457610e14610d39565b610e27601f8201601f1916602001610d78565b818152846020838601011115610e3c57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215610e6e57600080fd5b67ffffffffffffffff8085351115610e8557600080fd5b8435850186601f820112610e9857600080fd5b610eaa610ea58235610da9565b610d78565b81358082526020808301929160051b84010189811115610ec957600080fd5b602084015b81811015610fd1578581351115610ee457600080fd5b803585016060818d03601f19011215610efc57600080fd5b610f04610d4f565b610f1060208301610dcd565b8152604082013560038110610f2457600080fd5b6020820152606082013588811115610f3b57600080fd5b8083019250508c603f830112610f5057600080fd5b6020820135610f61610ea582610da9565b81815260059190911b83016040019060208101908f831115610f8257600080fd5b6040850194505b82851015610fbb5784356001600160e01b0319811614610fa857600080fd5b8435825260209485019490910190610f89565b6040840152505085525060209384019301610ece565b5050809650505050610fe560208601610dcd565b9250604085013581811115610ff957600080fd5b61100587828801610de9565b925050509250925092565b634e487b7160e01b600052601160045260246000fd5b63ffffffff818116838216019080821115610caa57610caa611010565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b60005b8381101561108a578181015183820152602001611072565b50506000910152565b600081518084526110ab81602086016020860161106f565b601f01601f19169290920160200192915050565b60006060808301606084528087518083526080925060808601915060808160051b8701016020808b0160005b8481101561119257898403607f19018652815180516001600160a01b0316855283810151898601906003811061113157634e487b7160e01b600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b8083101561117d5783516001600160e01b0319168252928601926001929092019190860190611153565b509785019795505050908201906001016110eb565b50506001600160a01b038a169088015286810360408801526111b48189611093565b9a9950505050505050505050565b600082516111d481846020870161106f565b9190910192915050565b81810381811115610aa057610aa0611010565b634e487b7160e01b600052603160045260246000fd","sourceMap":"413:441:73:-:0;;;;;;;;;;;;-1:-1:-1;385:22:71;:20;:22::i;:::-;413:441:73;;1653:314:85;303:66:86;1779:14:85;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:85;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:85;1898:16;1886:28;;;;;1927:29;;158:42:516;;;1927:29:85;;146:2:516;131:18;1927:29:85;;;;;;;1844:119;1694:273;1653:314::o;14:192:516:-;413:441:73;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100365760003560e01c80631f931c1c1461003b5780634f4bb5d614610050575b600080fd5b61004e610049366004610e59565b610058565b005b61004e61018f565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031633146100a9576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6100b16101eb565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16806100f45750805463ffffffff808416911610155b1561011d578054604051630a8ef77f60e31b815263ffffffff90911660048201526024016100a0565b805464ffffffffff191663ffffffff831617640100000000178155610143858585610225565b805464ff000000001916815560405163ffffffff831681527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15050505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166101d957604051630ef4733760e31b815260040160405180910390fd5b6101e96307e4c70760e21b610361565b565b60007f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef52000546102209063ffffffff166001611026565b905090565b825160000361024757604051632795bfe160e11b815260040160405180910390fd5b60005b835181101561031557600084828151811061026757610267611043565b6020026020010151905061027a8161043f565b60008160200151600281111561029257610292611059565b036102ae576102a9816000015182604001516104fb565b61030c565b6001816020015160028111156102c6576102c6611059565b036102dd576102a98160000151826040015161063a565b6002816020015160028111156102f5576102f5611059565b0361030c5761030c8160000151826040015161086b565b5060010161024a565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673838383604051610349939291906110bf565b60405180910390a161035c838383610a2c565b505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146103ee576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610407565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b80516001600160a01b03166104755780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b80516001600160a01b03163014801590610498575080516001600160a01b03163b155b156104c45780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b8060400151516000036104f85780516040516305fb96cb60e41b81526001600160a01b0390911660048201526024016100a0565b50565b7fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc9006105268184610a7f565b610536576105348184610aa6565b505b815160005b8181101561063357600084828151811061055757610557611043565b602090810291909101015190506001600160e01b0319811661058c576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b0316156105db57604051630e6c4db160e41b81526001600160e01b0319821660048201526024016100a0565b6001600160e01b031981166000818152600286016020908152604080832080546001600160a01b0319166001600160a01b038c16908117909155835260038801909152902061062991610abb565b505060010161053b565b5050505050565b7fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc900306001600160a01b0384160361068457604051630e7ce30960e11b815260040160405180910390fd5b61068e8184610a7f565b61069e5761069c8184610aa6565b505b815160005b818110156106335760008482815181106106bf576106bf611043565b602090810291909101015190506001600160e01b031981166106f4576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b031630810361073957604051630e7ce30960e11b815260040160405180910390fd5b6001600160a01b03811661076b5760405163126f174360e11b81526001600160a01b03881660048201526024016100a0565b866001600160a01b0316816001600160a01b0316036107a957604051631403eec360e21b81526001600160e01b0319831660048201526024016100a0565b6001600160e01b031982166000818152600287016020908152604080832080546001600160a01b0319166001600160a01b038d811691909117909155851683526003890190915290206107fb91610ac7565b506001600160a01b0387166000908152600386016020526040902061082a906001600160e01b03198416610abb565b506001600160a01b0381166000908152600386016020526040902061084e90610ad3565b6000036108615761085f8582610add565b505b50506001016106a3565b7fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc900306001600160a01b038416036108b557604051630e7ce30960e11b815260040160405180910390fd5b6108bf8184610a7f565b6108e7576040516344ae58e160e01b81526001600160a01b03841660048201526024016100a0565b60005b82518110156109f157600083828151811061090757610907611043565b602090810291909101015190506001600160e01b0319811661093c576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002840160205260409020546001600160a01b0386811691161461099d5760405162062efb60e51b81526001600160a01b03861660048201526001600160e01b0319821660248201526044016100a0565b6001600160e01b031981166000818152600285016020908152604080832080546001600160a01b03191690556001600160a01b03891683526003870190915290206109e791610ac7565b50506001016108ea565b506001600160a01b03831660009081526003820160205260409020610a1590610ad3565b60000361035c57610a268184610add565b50505050565b6001600160a01b038216610a3f57505050565b816001600160a01b03163b600003610a7557604051633b367e1560e21b81526001600160a01b03831660048201526024016100a0565b610a268282610af2565b6001600160a01b038116600090815260018301602052604081205415155b90505b92915050565b6000610a9d836001600160a01b038416610b68565b6000610a9d8383610b68565b6000610a9d8383610bb7565b6000610aa0825490565b6000610a9d836001600160a01b038416610bb7565b6060600080846001600160a01b031684604051610b0f91906111c2565b600060405180830381855af49150503d8060008114610b4a576040519150601f19603f3d011682016040523d82523d6000602084013e610b4f565b606091505b5091509150610b5f858383610cb1565b95945050505050565b6000818152600183016020526040812054610baf57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610aa0565b506000610aa0565b60008181526001830160205260408120548015610ca0576000610bdb6001836111de565b8554909150600090610bef906001906111de565b9050808214610c54576000866000018281548110610c0f57610c0f611043565b9060005260206000200154905080876000018481548110610c3257610c32611043565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610c6557610c656111f1565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610aa0565b6000915050610aa0565b5092915050565b606082610cc657610cc182610d10565b610d09565b8151158015610cdd57506001600160a01b0384163b155b15610d0657604051639996b31560e01b81526001600160a01b03851660048201526024016100a0565b50805b9392505050565b805115610d205780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715610d7257610d72610d39565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610da157610da1610d39565b604052919050565b600067ffffffffffffffff821115610dc357610dc3610d39565b5060051b60200190565b80356001600160a01b0381168114610de457600080fd5b919050565b600082601f830112610dfa57600080fd5b813567ffffffffffffffff811115610e1457610e14610d39565b610e27601f8201601f1916602001610d78565b818152846020838601011115610e3c57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215610e6e57600080fd5b67ffffffffffffffff8085351115610e8557600080fd5b8435850186601f820112610e9857600080fd5b610eaa610ea58235610da9565b610d78565b81358082526020808301929160051b84010189811115610ec957600080fd5b602084015b81811015610fd1578581351115610ee457600080fd5b803585016060818d03601f19011215610efc57600080fd5b610f04610d4f565b610f1060208301610dcd565b8152604082013560038110610f2457600080fd5b6020820152606082013588811115610f3b57600080fd5b8083019250508c603f830112610f5057600080fd5b6020820135610f61610ea582610da9565b81815260059190911b83016040019060208101908f831115610f8257600080fd5b6040850194505b82851015610fbb5784356001600160e01b0319811614610fa857600080fd5b8435825260209485019490910190610f89565b6040840152505085525060209384019301610ece565b5050809650505050610fe560208601610dcd565b9250604085013581811115610ff957600080fd5b61100587828801610de9565b925050509250925092565b634e487b7160e01b600052601160045260246000fd5b63ffffffff818116838216019080821115610caa57610caa611010565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b60005b8381101561108a578181015183820152602001611072565b50506000910152565b600081518084526110ab81602086016020860161106f565b601f01601f19169290920160200192915050565b60006060808301606084528087518083526080925060808601915060808160051b8701016020808b0160005b8481101561119257898403607f19018652815180516001600160a01b0316855283810151898601906003811061113157634e487b7160e01b600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b8083101561117d5783516001600160e01b0319168252928601926001929092019190860190611153565b509785019795505050908201906001016110eb565b50506001600160a01b038a169088015286810360408801526111b48189611093565b9a9950505050505050505050565b600082516111d481846020870161106f565b9190910192915050565b81810381811115610aa057610aa0611010565b634e487b7160e01b600052603160045260246000fd","sourceMap":"413:441:73:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;637:215;;;;;;:::i;:::-;;:::i;:::-;;493:110;;;:::i;637:215::-;291:66:99;445:29:97;-1:-1:-1;;;;;445:29:97;286:10;:22;282:79;;325:29;;-1:-1:-1;;;325:29:97;;343:10;325:29;;;4429:51:516;4402:18;;325:29:97;;;;;;;;282:79;784:14:73::1;:12;:14::i;:::-;303:66:86::0;993:14:85;;;;::::1;;;::::0;:38:::1;;-1:-1:-1::0;1011:9:85;;:20:::1;::::0;;::::1;:9:::0;::::1;:20;;993:38;989:109;;;1081:9:::0;;1048:43:::1;::::0;-1:-1:-1;;;1048:43:85;;1081:9:::1;::::0;;::::1;1048:43;::::0;::::1;4635:42:516::0;4608:18;;1048:43:85::1;4491:192:516::0;989:109:85::1;1103:19:::0;;-1:-1:-1;;1128:21:85;1103:19:::1;::::0;::::1;1128:21:::0;;::::1;::::0;;806:41:73::2;818:9:::0;829:4;835:11;806::::2;:41::i;:::-;1162:22:85::0;;-1:-1:-1;;1162:22:85::1;::::0;;1195:20:::1;::::0;4665:10:516;4653:23;;4635:42;;1195:20:85::1;::::0;4623:2:516;4608:18;1195:20:85::1;;;;;;;907:313;366:1:97;637:215:73::0;;;:::o;493:110::-;303:66:86;1263:42:85;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:85;;;;;;;;;;;1258:100;554:44:73::1;-1:-1:-1::0;;;554:13:73::1;:44::i;:::-;493:110::o:0;1535:114:85:-;1582:6;303:66:86;1603:37:85;:41;;:37;;;:41;:::i;:::-;1596:48;;1535:114;:::o;646:888:72:-;780:9;:16;800:1;780:21;776:68;;810:34;;-1:-1:-1;;;810:34:72;;;;;;;;;;;776:68;856:9;851:569;871:9;:16;867:1;:20;851:569;;;902:33;938:9;948:1;938:12;;;;;;;;:::i;:::-;;;;;;;902:48;;959:27;977:8;959:17;:27::i;:::-;1018;999:8;:15;;;:46;;;;;;;;:::i;:::-;;995:419;;1057:60;1067:8;:21;;;1090:8;:26;;;1057:9;:60::i;:::-;995:419;;;1155:31;1136:8;:15;;;:50;;;;;;;;:::i;:::-;;1132:282;;1198:64;1212:8;:21;;;1235:8;:26;;;1198:13;:64::i;1132:282::-;1300:30;1281:8;:15;;;:49;;;;;;;;:::i;:::-;;1277:137;;1342:63;1355:8;:21;;;1378:8;:26;;;1342:12;:63::i;:::-;-1:-1:-1;889:3:72;;851:569;;;;1431:40;1442:9;1453:4;1459:11;1431:40;;;;;;;;:::i;:::-;;;;;;;;1478:51;1500:9;1511:4;1517:11;1478:21;:51::i;:::-;646:888;;;:::o;452:282:88:-;-1:-1:-1;;;;;;1121:62:88;;1096:4;1121:62;;;303:66:90;1121:62:88;;;;;;;;:70;;:62;:70;510:182;;-1:-1:-1;;;;;;556:62:88;;:49;:62;;;303:66:90;556:62:88;;;;;:69;;-1:-1:-1;;556:69:88;621:4;556:69;;;510:182;;;653:32;;-1:-1:-1;;;653:32:88;;;;;;;;;;;510:182;702:27;;-1:-1:-1;;;;;;702:27:88;;;;;;;;452:282;:::o;4746:500:72:-;4832:21;;-1:-1:-1;;;;;4832:35:72;4828:109;;4908:21;;4884:46;;-1:-1:-1;;;4884:46:72;;-1:-1:-1;;;;;4447:32:516;;;4884:46:72;;;4429:51:516;4402:18;;4884:46:72;4283:203:516;4828:109:72;4954:21;;-1:-1:-1;;;;;4954:38:72;4987:4;4954:38;;;;:86;;-1:-1:-1;5002:21:72;;-1:-1:-1;;;;;5002:33:72;;:38;4954:86;4943:172;;;5086:21;;5062:46;;-1:-1:-1;;;5062:46:72;;-1:-1:-1;;;;;4447:32:516;;;5062:46:72;;;4429:51:516;4402:18;;5062:46:72;4283:203:516;4943:172:72;5125:8;:26;;;:33;5162:1;5125:38;5121:121;;5213:21;;5180:55;;-1:-1:-1;;;5180:55:72;;-1:-1:-1;;;;;4447:32:516;;;5180:55:72;;;4429:51:516;4402:18;;5180:55:72;4283:203:516;5121:121:72;4746:500;:::o;1667:761::-;377:66:74;1855:25:72;377:66:74;1874:5:72;1855:18;:25::i;:::-;1850:52;;1882:20;:2;1896:5;1882:13;:20::i;:::-;;1850:52;1933:16;;1909:21;1996:428;2016:13;2012:1;:17;1996:428;;;2041:15;2059:9;2069:1;2059:12;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;;;2084:21:72;;2080:81;;2124:28;;-1:-1:-1;;;2124:28:72;;;;;;;;;;;2080:81;-1:-1:-1;;;;;;2173:28:72;;2213:1;2173:28;;;:18;;;:28;;;;;;-1:-1:-1;;;;;2173:28:72;:42;2169:116;;2234:42;;-1:-1:-1;;;2234:42:72;;-1:-1:-1;;;;;;8052:33:516;;2234:42:72;;;8034:52:516;8007:18;;2234:42:72;7890:202:516;2169:116:72;-1:-1:-1;;;;;;2293:28:72;;;;;;:18;;;:28;;;;;;;;:36;;-1:-1:-1;;;;;;2293:36:72;-1:-1:-1;;;;;2293:36:72;;;;;;;;2337:26;;:19;;;:26;;;;;:40;;:30;:40::i;:::-;-1:-1:-1;;2406:3:72;;1996:428;;;;1737:691;;1667:761;;:::o;3484:1175::-;377:66:74;3656:4:72;-1:-1:-1;;;;;3639:22:72;;;3635:62;;3670:27;;-1:-1:-1;;;3670:27:72;;;;;;;;;;;3635:62;3709:25;:2;3728:5;3709:18;:25::i;:::-;3704:52;;3736:20;:2;3750:5;3736:13;:20::i;:::-;;3704:52;3787:16;;3763:21;3810:845;3830:13;3826:1;:17;3810:845;;;3855:15;3873:9;3883:1;3873:12;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;;;3898:21:72;;3894:81;;3938:28;;-1:-1:-1;;;3938:28:72;;;;;;;;;;;3894:81;-1:-1:-1;;;;;;4002:28:72;;3983:16;4002:28;;;:18;;;:28;;;;;;-1:-1:-1;;;;;4002:28:72;4063:4;4043:25;;4039:65;;4077:27;;-1:-1:-1;;;4077:27:72;;;;;;;;;;;4039:65;-1:-1:-1;;;;;4117:22:72;;4113:92;;4158:38;;-1:-1:-1;;;4158:38:72;;-1:-1:-1;;;;;4447:32:516;;4158:38:72;;;4429:51:516;4402:18;;4158:38:72;4283:203:516;4113:92:72;4229:5;-1:-1:-1;;;;;4217:17:72;:8;-1:-1:-1;;;;;4217:17:72;;4213:104;;4253:55;;-1:-1:-1;;;4253:55:72;;-1:-1:-1;;;;;;8052:33:516;;4253:55:72;;;8034:52:516;8007:18;;4253:55:72;7890:202:516;4213:104:72;-1:-1:-1;;;;;;4366:28:72;;;;;;:18;;;:28;;;;;;;;:36;;-1:-1:-1;;;;;;4366:36:72;-1:-1:-1;;;;;4366:36:72;;;;;;;;;;4411:29;;;;:19;;;:29;;;;;:46;;:36;:46::i;:::-;-1:-1:-1;;;;;;4466:26:72;;;;;;:19;;;:26;;;;;:40;;-1:-1:-1;;;;;;4466:40:72;;:30;:40::i;:::-;-1:-1:-1;;;;;;4519:29:72;;;;;;:19;;;:29;;;;;:38;;:36;:38::i;:::-;4561:1;4519:43;4515:94;;4574:26;:2;4591:8;4574:16;:26::i;:::-;;4515:94;-1:-1:-1;;4637:3:72;;3810:845;;2565:786;377:66:74;2736:4:72;-1:-1:-1;;;;;2719:22:72;;;2715:62;;2750:27;;-1:-1:-1;;;2750:27:72;;;;;;;;;;;2715:62;2789:25;:2;2808:5;2789:18;:25::i;:::-;2784:69;;2823:30;;-1:-1:-1;;;2823:30:72;;-1:-1:-1;;;;;4447:32:516;;2823:30:72;;;4429:51:516;4402:18;;2823:30:72;4283:203:516;2784:69:72;2865:9;2860:397;2880:9;:16;2876:1;:20;2860:397;;;2911:15;2929:9;2939:1;2929:12;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;;;2954:21:72;;2950:81;;2994:28;;-1:-1:-1;;;2994:28:72;;;;;;;;;;;2950:81;-1:-1:-1;;;;;;3043:28:72;;;;;;:18;;;:28;;;;;;-1:-1:-1;;;;;3043:37:72;;;:28;;:37;3039:116;;3099:47;;-1:-1:-1;;;3099:47:72;;-1:-1:-1;;;;;8287:32:516;;3099:47:72;;;8269:51:516;-1:-1:-1;;;;;;8356:33:516;;8336:18;;;8329:61;8242:18;;3099:47:72;8097:299:516;3039:116:72;-1:-1:-1;;;;;;3170:28:72;;;;;;:18;;;:28;;;;;;;;3163:35;;-1:-1:-1;;;;;;3163:35:72;;;-1:-1:-1;;;;;3207:26:72;;;;:19;;;:26;;;;;:43;;:33;:43::i;:::-;-1:-1:-1;;2898:3:72;;2860:397;;;-1:-1:-1;;;;;;3267:26:72;;;;;;:19;;;:26;;;;;:35;;:33;:35::i;:::-;3306:1;3267:40;3263:84;;3317:23;:2;3334:5;3317:16;:23::i;:::-;;2638:713;2565:786;;:::o;5372:306::-;-1:-1:-1;;;;;5506:18:72;;5502:31;;5372:306;;;:::o;5502:31::-;5543:4;-1:-1:-1;;;;;5543:16:72;;5563:1;5543:21;5539:81;;5581:32;;-1:-1:-1;;;5581:32:72;;-1:-1:-1;;;;;4447:32:516;;5581::72;;;4429:51:516;4402:18;;5581:32:72;4283:203:516;5539:81:72;5626:47;5655:4;5661:11;5626:28;:47::i;8871:165:449:-;-1:-1:-1;;;;;9004:23:449;;8951:4;4360:21;;;:14;;;:21;;;;;;:26;;8974:55;8967:62;;8871:165;;;;;:::o;8316:150::-;8386:4;8409:50;8414:3;-1:-1:-1;;;;;8434:23:449;;8409:4;:50::i;5930:123::-;6000:4;6023:23;6028:3;6040:5;6023:4;:23::i;6221:129::-;6294:4;6317:26;6325:3;6337:5;6317:7;:26::i;6650:115::-;6713:7;6739:19;6747:3;4556:18;;4474:107;8634:156;8707:4;8730:53;8738:3;-1:-1:-1;;;;;8758:23:449;;8730:7;:53::i;4106:253:430:-;4189:12;4214;4228:23;4255:6;-1:-1:-1;;;;;4255:19:430;4275:4;4255:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4213:67;;;;4297:55;4324:6;4332:7;4341:10;4297:26;:55::i;:::-;4290:62;4106:253;-1:-1:-1;;;;;4106:253:430:o;2241:406:449:-;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:449;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:449;2618:12;;2815:1368;2881:4;3010:21;;;:14;;;:21;;;;;;3046:13;;3042:1135;;3413:18;3434:12;3445:1;3434:8;:12;:::i;:::-;3480:18;;3413:33;;-1:-1:-1;3460:17:449;;3480:22;;3501:1;;3480:22;:::i;:::-;3460:42;;3535:9;3521:10;:23;3517:378;;3564:17;3584:3;:11;;3596:9;3584:22;;;;;;;;:::i;:::-;;;;;;;;;3564:42;;3731:9;3705:3;:11;;3717:10;3705:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;3844:25;;;:14;;;:25;;;;;:36;;;3517:378;3973:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4076:3;:14;;:21;4091:5;4076:21;;;;;;;;;;;4069:28;;;4119:4;4112:11;;;;;;;3042:1135;4161:5;4154:12;;;;;3042:1135;2887:1296;2815:1368;;;;:::o;4625:582:430:-;4769:12;4798:7;4793:408;;4821:19;4829:10;4821:7;:19::i;:::-;4793:408;;;5045:17;;:22;:49;;;;-1:-1:-1;;;;;;5071:18:430;;;:23;5045:49;5041:119;;;5121:24;;-1:-1:-1;;;5121:24:430;;-1:-1:-1;;;;;4447:32:516;;5121:24:430;;;4429:51:516;4402:18;;5121:24:430;4283:203:516;5041:119:430;-1:-1:-1;5180:10:430;4793:408;4625:582;;;;;:::o;5743:516::-;5874:17;;:21;5870:383;;6102:10;6096:17;6158:15;6145:10;6141:2;6137:19;6130:44;5870:383;6225:17;;-1:-1:-1;;;6225:17:430;;;;;;;;;;;14:127:516;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:251;218:2;212:9;260:2;248:15;;293:18;278:34;;314:22;;;275:62;272:88;;;340:18;;:::i;:::-;376:2;369:22;146:251;:::o;402:275::-;473:2;467:9;538:2;519:13;;-1:-1:-1;;515:27:516;503:40;;573:18;558:34;;594:22;;;555:62;552:88;;;620:18;;:::i;:::-;656:2;649:22;402:275;;-1:-1:-1;402:275:516:o;682:191::-;750:4;783:18;775:6;772:30;769:56;;;805:18;;:::i;:::-;-1:-1:-1;850:1:516;846:14;862:4;842:25;;682:191::o;878:173::-;946:20;;-1:-1:-1;;;;;995:31:516;;985:42;;975:70;;1041:1;1038;1031:12;975:70;878:173;;;:::o;1056:530::-;1098:5;1151:3;1144:4;1136:6;1132:17;1128:27;1118:55;;1169:1;1166;1159:12;1118:55;1205:6;1192:20;1231:18;1227:2;1224:26;1221:52;;;1253:18;;:::i;:::-;1297:55;1340:2;1321:13;;-1:-1:-1;;1317:27:516;1346:4;1313:38;1297:55;:::i;:::-;1377:2;1368:7;1361:19;1423:3;1416:4;1411:2;1403:6;1399:15;1395:26;1392:35;1389:55;;;1440:1;1437;1430:12;1389:55;1505:2;1498:4;1490:6;1486:17;1479:4;1470:7;1466:18;1453:55;1553:1;1528:16;;;1546:4;1524:27;1517:38;;;;1532:7;1056:530;-1:-1:-1;;;1056:530:516:o;1591:2578::-;1729:6;1737;1745;1798:2;1786:9;1777:7;1773:23;1769:32;1766:52;;;1814:1;1811;1804:12;1766:52;1837:18;1895:2;1883:9;1870:23;1867:31;1864:51;;;1911:1;1908;1901:12;1864:51;1962:9;1949:23;1938:9;1934:39;2011:7;2004:4;2000:2;1996:13;1992:27;1982:55;;2033:1;2030;2023:12;1982:55;2057:82;2073:65;2134:2;2121:16;2073:65;:::i;:::-;2057:82;:::i;:::-;2185:16;;2173:29;;;2227:4;2218:14;;;;2161:3;2271:1;2267:24;2259:33;;2255:44;2311:19;;;2308:39;;;2343:1;2340;2333:12;2308:39;2375:4;2371:2;2367:13;2389:1519;2405:6;2400:3;2397:15;2389:1519;;;2486:2;2480:3;2467:17;2464:25;2461:45;;;2502:1;2499;2492:12;2461:45;2537:17;;2529:26;;2607:2;2579:16;;;-1:-1:-1;;2575:30:516;2571:39;2568:59;;;2623:1;2620;2613:12;2568:59;2653:22;;:::i;:::-;2702:33;2729:4;2725:2;2721:13;2702:33;:::i;:::-;2695:5;2688:48;2785:2;2781;2777:11;2764:25;2824:1;2815:7;2812:14;2802:42;;2840:1;2837;2830:12;2802:42;2875:4;2864:16;;2857:33;2938:2;2930:11;;2917:25;2958:14;;;2955:34;;;2985:1;2982;2975:12;2955:34;3020:6;3016:2;3012:15;3002:25;;;3067:7;3062:2;3058;3054:11;3050:25;3040:53;;3089:1;3086;3079:12;3040:53;3137:4;3133:2;3129:13;3116:27;3169:68;3185:51;3233:2;3185:51;:::i;3169:68::-;3281:17;;;3381:1;3377:10;;;;3369:19;;3390:2;3365:28;;3331:4;3320:16;;;3409:21;;;3406:41;;;3443:1;3440;3433:12;3406:41;3481:2;3477;3473:11;3460:24;;3497:294;3515:8;3508:5;3505:19;3497:294;;;3623:19;;-1:-1:-1;;;;;;3619:46:516;;3595:71;3585:99;;3680:1;3677;3670:12;3585:99;3715:19;;3701:34;;3772:4;3536:16;;;;3761;;;;3497:294;;;3822:2;3811:14;;3804:29;-1:-1:-1;;3846:18:516;;-1:-1:-1;3893:4:516;3884:14;;;;2422;2389:1519;;;2393:3;;3927:5;3917:15;;;;;3951:40;3985:4;3974:9;3970:20;3951:40;:::i;:::-;3941:50;;4044:2;4033:9;4029:18;4016:32;4073:2;4063:8;4060:16;4057:36;;;4089:1;4086;4079:12;4057:36;4112:51;4155:7;4144:8;4133:9;4129:24;4112:51;:::i;:::-;4102:61;;;;1591:2578;;;;;:::o;4688:127::-;4749:10;4744:3;4740:20;4737:1;4730:31;4780:4;4777:1;4770:15;4804:4;4801:1;4794:15;4820:172;4887:10;4917;;;4929;;;4913:27;;4952:11;;;4949:37;;;4966:18;;:::i;4997:127::-;5058:10;5053:3;5049:20;5046:1;5039:31;5089:4;5086:1;5079:15;5113:4;5110:1;5103:15;5129:127;5190:10;5185:3;5181:20;5178:1;5171:31;5221:4;5218:1;5211:15;5245:4;5242:1;5235:15;5261:250;5346:1;5356:113;5370:6;5367:1;5364:13;5356:113;;;5446:11;;;5440:18;5427:11;;;5420:39;5392:2;5385:10;5356:113;;;-1:-1:-1;;5503:1:516;5485:16;;5478:27;5261:250::o;5516:270::-;5557:3;5595:5;5589:12;5622:6;5617:3;5610:19;5638:76;5707:6;5700:4;5695:3;5691:14;5684:4;5677:5;5673:16;5638:76;:::i;:::-;5768:2;5747:15;-1:-1:-1;;5743:29:516;5734:39;;;;5775:4;5730:50;;5516:270;-1:-1:-1;;5516:270:516:o;5791:2094::-;6061:4;6090:2;6130;6119:9;6115:18;6160:2;6149:9;6142:21;6183:6;6218;6212:13;6249:6;6241;6234:22;6275:3;6265:13;;6309:3;6298:9;6294:19;6287:26;;6372:3;6362:6;6359:1;6355:14;6344:9;6340:30;6336:40;6395:4;6434:2;6426:6;6422:15;6455:1;6465:1249;6479:6;6476:1;6473:13;6465:1249;;;6544:22;;;-1:-1:-1;;6540:37:516;6528:50;;6601:13;;6688:9;;-1:-1:-1;;;;;6684:35:516;6669:51;;6759:11;;;6753:18;6641:15;;;;6811:1;6794:19;;6784:170;;6864:10;6859:3;6855:20;6852:1;6845:31;6903:4;6900:1;6893:15;6935:4;6932:1;6925:15;6784:170;6974:15;;;6967:37;7027:4;7072:11;;;7066:18;7104:15;;;7097:27;;;7185:21;;7219:24;;;;7309:23;;;;-1:-1:-1;;7265:15:516;;;;7370:236;7386:8;7381:3;7378:17;7370:236;;;7467:15;;-1:-1:-1;;;;;;7463:42:516;7449:57;;7575:17;;;;7414:1;7405:11;;;;;7532:14;;;;7370:236;;;-1:-1:-1;7692:12:516;;;;7629:5;-1:-1:-1;;;7657:15:516;;;;6501:1;6494:9;6465:1249;;;-1:-1:-1;;;;;;;4240:31:516;;7750:18;;;4228:44;7807:22;;;7800:4;7785:20;;7778:52;7847:32;7811:6;7864;7847:32;:::i;:::-;7839:40;5791:2094;-1:-1:-1;;;;;;;;;;5791:2094:516:o;8401:287::-;8530:3;8568:6;8562:13;8584:66;8643:6;8638:3;8631:4;8623:6;8619:17;8584:66;:::i;:::-;8666:16;;;;;8401:287;-1:-1:-1;;8401:287:516:o;8693:128::-;8760:9;;;8781:11;;;8778:37;;;8795:18;;:::i;8826:127::-;8887:10;8882:3;8878:20;8875:1;8868:31;8918:4;8915:1;8908:15;8942:4;8939:1;8932:15","linkReferences":{}},"methodIdentifiers":{"__DiamondCut_init()":"4f4bb5d6","diamondCut((address,uint8,bytes4[])[],address,bytes)":"1f931c1c"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"DiamondCut_FunctionAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"DiamondCut_FunctionDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"DiamondCut_FunctionFromSameFacetAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DiamondCut_ImmutableFacet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"init\",\"type\":\"address\"}],\"name\":\"DiamondCut_InvalidContract\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"DiamondCut_InvalidFacet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DiamondCut_InvalidFacetCutAction\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DiamondCut_InvalidFacetCutLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"DiamondCut_InvalidFacetRemoval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"DiamondCut_InvalidFacetSelectors\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DiamondCut_InvalidSelector\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initializable_AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facetAddress\",\"type\":\"address\"},{\"internalType\":\"enum IDiamond.FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"functionSelectors\",\"type\":\"bytes4[]\"}],\"indexed\":false,\"internalType\":\"struct IDiamond.FacetCut[]\",\"name\":\"facetCuts\",\"type\":\"tuple[]\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"init\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"initPayload\",\"type\":\"bytes\"}],\"name\":\"DiamondCut\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__DiamondCut_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facetAddress\",\"type\":\"address\"},{\"internalType\":\"enum IDiamond.FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"functionSelectors\",\"type\":\"bytes4[]\"}],\"internalType\":\"struct IDiamond.FacetCut[]\",\"name\":\"facetCuts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"init\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initPayload\",\"type\":\"bytes\"}],\"name\":\"diamondCut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"FailedInnerCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}]},\"events\":{\"DiamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"params\":{\"facetCuts\":\"Facet addresses and function selectors.\",\"init\":\"Address of contract or facet to execute initPayload.\",\"initPayload\":\"A function call, including function selector and arguments.\"}},\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"}},\"kind\":\"dev\",\"methods\":{\"diamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"params\":{\"facetCuts\":\"Facet addresses and function selectors.\",\"init\":\"Address of contract or facet to execute initPayload.\",\"initPayload\":\"A function call, including function selector and arguments. Executed with delegatecall on init address.\"}}},\"version\":1},\"userdoc\":{\"events\":{\"DiamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"notice\":\"Event emitted when facets are added/removed/replaced\"},\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{\"diamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"notice\":\"Add/replace/remove any number of functions and optionally execute a function with delegatecall\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/diamond/facets/cut/DiamondCutFacet.sol\":\"DiamondCutFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/IDiamond.sol\":{\"keccak256\":\"0xd4907618ad3b9847c656008815820f23a89a587e408712b450cff075625e1553\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://652645a543f65b0415327a8a88398fc7835b1d6ee01df8c898f9e43867d02714\",\"dweb:/ipfs/QmPXt4Kks2o5CJKbT8U1mCryQJP6EMzzP5kdcqUFvXX7y5\"]},\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/cut/DiamondCutBase.sol\":{\"keccak256\":\"0x45ed391ae6aa52996ce3fc3095b0d420457fa5f58a2c5a2f9939e2b55dc8e7a6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f6a5e87525d3c98c10ceb838124d48fdf7e687ffddbdb1647b93dc5882d91339\",\"dweb:/ipfs/Qmf137S5255pVWXpfFnrU3fdE3G6Di2VuJQueBn8SC8cpd\"]},\"contracts/src/diamond/facets/cut/DiamondCutFacet.sol\":{\"keccak256\":\"0xfa7c216c41e95f675c5763e97622c61349a94510d45d9c08c24282d85f24a2c5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dbc5de1ab9212db8c38baf5560453bb9edcda5054335c2d29f5a7d8d7a1ca6de\",\"dweb:/ipfs/QmW6juTkWA8J2CsiLWSehNYPs3j32NDNi7sKcmA1fobbX7\"]},\"contracts/src/diamond/facets/cut/DiamondCutStorage.sol\":{\"keccak256\":\"0xf47d0ca88515dc8714c89931c5a91c402bac3fad08388d780a0873e962386071\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://04d4023a5be5140892c547bb5df4eb5906120d1eca3bf29fc562da991639c894\",\"dweb:/ipfs/QmVf28LUpAVeCz5Aiewbjt7ZzM6bixZn166aS1PVJGzSSX\"]},\"contracts/src/diamond/facets/cut/IDiamondCut.sol\":{\"keccak256\":\"0xa5985f00fabb7f6e5925542c9d0c955d4e7ec4f9ffe59d0fa81d75bed7ecdd55\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2ebbb450aac3c12f690d7457d04d6fc53736b36cc60dcd757e11840335103688\",\"dweb:/ipfs/QmbcjTgejYrj3m2Lj9hHpCe2wt63fmLhhN6aY8XFoScitw\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/OwnableBase.sol\":{\"keccak256\":\"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4\",\"dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa\"]},\"contracts/src/diamond/facets/ownable/OwnableStorage.sol\":{\"keccak256\":\"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105\",\"dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"type":"error","name":"DiamondCut_FunctionAlreadyExists"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"type":"error","name":"DiamondCut_FunctionDoesNotExist"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"type":"error","name":"DiamondCut_FunctionFromSameFacetAlreadyExists"},{"inputs":[],"type":"error","name":"DiamondCut_ImmutableFacet"},{"inputs":[{"internalType":"address","name":"init","type":"address"}],"type":"error","name":"DiamondCut_InvalidContract"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"type":"error","name":"DiamondCut_InvalidFacet"},{"inputs":[],"type":"error","name":"DiamondCut_InvalidFacetCutAction"},{"inputs":[],"type":"error","name":"DiamondCut_InvalidFacetCutLength"},{"inputs":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"type":"error","name":"DiamondCut_InvalidFacetRemoval"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"type":"error","name":"DiamondCut_InvalidFacetSelectors"},{"inputs":[],"type":"error","name":"DiamondCut_InvalidSelector"},{"inputs":[],"type":"error","name":"FailedInnerCall"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32"}],"type":"error","name":"Initializable_AlreadyInitialized"},{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[{"internalType":"struct IDiamond.FacetCut[]","name":"facetCuts","type":"tuple[]","components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamond.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"indexed":false},{"internalType":"address","name":"init","type":"address","indexed":false},{"internalType":"bytes","name":"initPayload","type":"bytes","indexed":false}],"type":"event","name":"DiamondCut","anonymous":false},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"__DiamondCut_init"},{"inputs":[{"internalType":"struct IDiamond.FacetCut[]","name":"facetCuts","type":"tuple[]","components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamond.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}]},{"internalType":"address","name":"init","type":"address"},{"internalType":"bytes","name":"initPayload","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"diamondCut"}],"devdoc":{"kind":"dev","methods":{"diamondCut((address,uint8,bytes4[])[],address,bytes)":{"params":{"facetCuts":"Facet addresses and function selectors.","init":"Address of contract or facet to execute initPayload.","initPayload":"A function call, including function selector and arguments. Executed with delegatecall on init address."}}},"version":1},"userdoc":{"kind":"user","methods":{"diamondCut((address,uint8,bytes4[])[],address,bytes)":{"notice":"Add/replace/remove any number of functions and optionally execute a function with delegatecall"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/diamond/facets/cut/DiamondCutFacet.sol":"DiamondCutFacet"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/IDiamond.sol":{"keccak256":"0xd4907618ad3b9847c656008815820f23a89a587e408712b450cff075625e1553","urls":["bzz-raw://652645a543f65b0415327a8a88398fc7835b1d6ee01df8c898f9e43867d02714","dweb:/ipfs/QmPXt4Kks2o5CJKbT8U1mCryQJP6EMzzP5kdcqUFvXX7y5"],"license":"Apache-2.0"},"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/cut/DiamondCutBase.sol":{"keccak256":"0x45ed391ae6aa52996ce3fc3095b0d420457fa5f58a2c5a2f9939e2b55dc8e7a6","urls":["bzz-raw://f6a5e87525d3c98c10ceb838124d48fdf7e687ffddbdb1647b93dc5882d91339","dweb:/ipfs/Qmf137S5255pVWXpfFnrU3fdE3G6Di2VuJQueBn8SC8cpd"],"license":"Apache-2.0"},"contracts/src/diamond/facets/cut/DiamondCutFacet.sol":{"keccak256":"0xfa7c216c41e95f675c5763e97622c61349a94510d45d9c08c24282d85f24a2c5","urls":["bzz-raw://dbc5de1ab9212db8c38baf5560453bb9edcda5054335c2d29f5a7d8d7a1ca6de","dweb:/ipfs/QmW6juTkWA8J2CsiLWSehNYPs3j32NDNi7sKcmA1fobbX7"],"license":"Apache-2.0"},"contracts/src/diamond/facets/cut/DiamondCutStorage.sol":{"keccak256":"0xf47d0ca88515dc8714c89931c5a91c402bac3fad08388d780a0873e962386071","urls":["bzz-raw://04d4023a5be5140892c547bb5df4eb5906120d1eca3bf29fc562da991639c894","dweb:/ipfs/QmVf28LUpAVeCz5Aiewbjt7ZzM6bixZn166aS1PVJGzSSX"],"license":"Apache-2.0"},"contracts/src/diamond/facets/cut/IDiamondCut.sol":{"keccak256":"0xa5985f00fabb7f6e5925542c9d0c955d4e7ec4f9ffe59d0fa81d75bed7ecdd55","urls":["bzz-raw://2ebbb450aac3c12f690d7457d04d6fc53736b36cc60dcd757e11840335103688","dweb:/ipfs/QmbcjTgejYrj3m2Lj9hHpCe2wt63fmLhhN6aY8XFoScitw"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableBase.sol":{"keccak256":"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762","urls":["bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4","dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableStorage.sol":{"keccak256":"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64","urls":["bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105","dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":73} \ No newline at end of file diff --git a/packages/generated/dev/abis/DiamondCutFacet.metadata.json b/packages/generated/dev/abis/DiamondCutFacet.metadata.json new file mode 100644 index 000000000..aa25c5e05 --- /dev/null +++ b/packages/generated/dev/abis/DiamondCutFacet.metadata.json @@ -0,0 +1,506 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "type": "error", + "name": "AddressEmptyCode" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "type": "error", + "name": "DiamondCut_FunctionAlreadyExists" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "facet", + "type": "address" + } + ], + "type": "error", + "name": "DiamondCut_FunctionDoesNotExist" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "type": "error", + "name": "DiamondCut_FunctionFromSameFacetAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "DiamondCut_ImmutableFacet" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "init", + "type": "address" + } + ], + "type": "error", + "name": "DiamondCut_InvalidContract" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "facet", + "type": "address" + } + ], + "type": "error", + "name": "DiamondCut_InvalidFacet" + }, + { + "inputs": [], + "type": "error", + "name": "DiamondCut_InvalidFacetCutAction" + }, + { + "inputs": [], + "type": "error", + "name": "DiamondCut_InvalidFacetCutLength" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "facet", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "type": "error", + "name": "DiamondCut_InvalidFacetRemoval" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "facet", + "type": "address" + } + ], + "type": "error", + "name": "DiamondCut_InvalidFacetSelectors" + }, + { + "inputs": [], + "type": "error", + "name": "DiamondCut_InvalidSelector" + }, + { + "inputs": [], + "type": "error", + "name": "FailedInnerCall" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32" + } + ], + "type": "error", + "name": "Initializable_AlreadyInitialized" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [ + { + "internalType": "struct IDiamond.FacetCut[]", + "name": "facetCuts", + "type": "tuple[]", + "components": [ + { + "internalType": "address", + "name": "facetAddress", + "type": "address" + }, + { + "internalType": "enum IDiamond.FacetCutAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "bytes4[]", + "name": "functionSelectors", + "type": "bytes4[]" + } + ], + "indexed": false + }, + { + "internalType": "address", + "name": "init", + "type": "address", + "indexed": false + }, + { + "internalType": "bytes", + "name": "initPayload", + "type": "bytes", + "indexed": false + } + ], + "type": "event", + "name": "DiamondCut", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "__DiamondCut_init" + }, + { + "inputs": [ + { + "internalType": "struct IDiamond.FacetCut[]", + "name": "facetCuts", + "type": "tuple[]", + "components": [ + { + "internalType": "address", + "name": "facetAddress", + "type": "address" + }, + { + "internalType": "enum IDiamond.FacetCutAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "bytes4[]", + "name": "functionSelectors", + "type": "bytes4[]" + } + ] + }, + { + "internalType": "address", + "name": "init", + "type": "address" + }, + { + "internalType": "bytes", + "name": "initPayload", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "diamondCut" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "diamondCut((address,uint8,bytes4[])[],address,bytes)": { + "params": { + "facetCuts": "Facet addresses and function selectors.", + "init": "Address of contract or facet to execute initPayload.", + "initPayload": "A function call, including function selector and arguments. Executed with delegatecall on init address." + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "diamondCut((address,uint8,bytes4[])[],address,bytes)": { + "notice": "Add/replace/remove any number of functions and optionally execute a function with delegatecall" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/diamond/facets/cut/DiamondCutFacet.sol": "DiamondCutFacet" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/IDiamond.sol": { + "keccak256": "0xd4907618ad3b9847c656008815820f23a89a587e408712b450cff075625e1553", + "urls": [ + "bzz-raw://652645a543f65b0415327a8a88398fc7835b1d6ee01df8c898f9e43867d02714", + "dweb:/ipfs/QmPXt4Kks2o5CJKbT8U1mCryQJP6EMzzP5kdcqUFvXX7y5" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/cut/DiamondCutBase.sol": { + "keccak256": "0x45ed391ae6aa52996ce3fc3095b0d420457fa5f58a2c5a2f9939e2b55dc8e7a6", + "urls": [ + "bzz-raw://f6a5e87525d3c98c10ceb838124d48fdf7e687ffddbdb1647b93dc5882d91339", + "dweb:/ipfs/Qmf137S5255pVWXpfFnrU3fdE3G6Di2VuJQueBn8SC8cpd" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/cut/DiamondCutFacet.sol": { + "keccak256": "0xfa7c216c41e95f675c5763e97622c61349a94510d45d9c08c24282d85f24a2c5", + "urls": [ + "bzz-raw://dbc5de1ab9212db8c38baf5560453bb9edcda5054335c2d29f5a7d8d7a1ca6de", + "dweb:/ipfs/QmW6juTkWA8J2CsiLWSehNYPs3j32NDNi7sKcmA1fobbX7" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/cut/DiamondCutStorage.sol": { + "keccak256": "0xf47d0ca88515dc8714c89931c5a91c402bac3fad08388d780a0873e962386071", + "urls": [ + "bzz-raw://04d4023a5be5140892c547bb5df4eb5906120d1eca3bf29fc562da991639c894", + "dweb:/ipfs/QmVf28LUpAVeCz5Aiewbjt7ZzM6bixZn166aS1PVJGzSSX" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/cut/IDiamondCut.sol": { + "keccak256": "0xa5985f00fabb7f6e5925542c9d0c955d4e7ec4f9ffe59d0fa81d75bed7ecdd55", + "urls": [ + "bzz-raw://2ebbb450aac3c12f690d7457d04d6fc53736b36cc60dcd757e11840335103688", + "dweb:/ipfs/QmbcjTgejYrj3m2Lj9hHpCe2wt63fmLhhN6aY8XFoScitw" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableBase.sol": { + "keccak256": "0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762", + "urls": [ + "bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4", + "dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableStorage.sol": { + "keccak256": "0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64", + "urls": [ + "bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105", + "dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/EntitlementsManager.abi.json b/packages/generated/dev/abis/EntitlementsManager.abi.json new file mode 100644 index 000000000..d19fb3ed9 --- /dev/null +++ b/packages/generated/dev/abis/EntitlementsManager.abi.json @@ -0,0 +1,745 @@ +[ + { + "type": "function", + "name": "addEntitlementModule", + "inputs": [ + { + "name": "entitlement", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "addImmutableEntitlements", + "inputs": [ + { + "name": "entitlements", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getEntitlement", + "inputs": [ + { + "name": "entitlement", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IEntitlementsManagerBase.Entitlement", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "moduleAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "moduleType", + "type": "string", + "internalType": "string" + }, + { + "name": "isImmutable", + "type": "bool", + "internalType": "bool" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEntitlementDataByPermission", + "inputs": [ + { + "name": "permission", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IEntitlementsManager.EntitlementData[]", + "components": [ + { + "name": "entitlementType", + "type": "string", + "internalType": "string" + }, + { + "name": "entitlementData", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEntitlements", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IEntitlementsManagerBase.Entitlement[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "moduleAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "moduleType", + "type": "string", + "internalType": "string" + }, + { + "name": "isImmutable", + "type": "bool", + "internalType": "bool" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isEntitledToChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "user", + "type": "address", + "internalType": "address" + }, + { + "name": "permission", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isEntitledToSpace", + "inputs": [ + { + "name": "user", + "type": "address", + "internalType": "address" + }, + { + "name": "permission", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeEntitlementModule", + "inputs": [ + { + "name": "entitlement", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EntitlementModuleAdded", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "entitlement", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EntitlementModuleRemoved", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "entitlement", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleCreated", + "inputs": [ + { + "name": "creator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRemoved", + "inputs": [ + { + "name": "remover", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleUpdated", + "inputs": [ + { + "name": "updater", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SubscriptionUpdate", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "expiration", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__DurationZero", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__NotApprovedOrOwner", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__EntitlementAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__ImmutableEntitlement", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__InvalidEntitlementInterface", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidPermission", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/EntitlementsManager.abi.ts b/packages/generated/dev/abis/EntitlementsManager.abi.ts new file mode 100644 index 000000000..25150c28e --- /dev/null +++ b/packages/generated/dev/abis/EntitlementsManager.abi.ts @@ -0,0 +1,745 @@ +export default [ + { + "type": "function", + "name": "addEntitlementModule", + "inputs": [ + { + "name": "entitlement", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "addImmutableEntitlements", + "inputs": [ + { + "name": "entitlements", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getEntitlement", + "inputs": [ + { + "name": "entitlement", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IEntitlementsManagerBase.Entitlement", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "moduleAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "moduleType", + "type": "string", + "internalType": "string" + }, + { + "name": "isImmutable", + "type": "bool", + "internalType": "bool" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEntitlementDataByPermission", + "inputs": [ + { + "name": "permission", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IEntitlementsManager.EntitlementData[]", + "components": [ + { + "name": "entitlementType", + "type": "string", + "internalType": "string" + }, + { + "name": "entitlementData", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEntitlements", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IEntitlementsManagerBase.Entitlement[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "moduleAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "moduleType", + "type": "string", + "internalType": "string" + }, + { + "name": "isImmutable", + "type": "bool", + "internalType": "bool" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isEntitledToChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "user", + "type": "address", + "internalType": "address" + }, + { + "name": "permission", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isEntitledToSpace", + "inputs": [ + { + "name": "user", + "type": "address", + "internalType": "address" + }, + { + "name": "permission", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeEntitlementModule", + "inputs": [ + { + "name": "entitlement", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EntitlementModuleAdded", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "entitlement", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EntitlementModuleRemoved", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "entitlement", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleCreated", + "inputs": [ + { + "name": "creator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRemoved", + "inputs": [ + { + "name": "remover", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleUpdated", + "inputs": [ + { + "name": "updater", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SubscriptionUpdate", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "expiration", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__DurationZero", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__NotApprovedOrOwner", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__EntitlementAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__ImmutableEntitlement", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__InvalidEntitlementInterface", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidPermission", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/EntitlementsManager.bin b/packages/generated/dev/abis/EntitlementsManager.bin new file mode 100644 index 000000000..20331ecc3 --- /dev/null +++ b/packages/generated/dev/abis/EntitlementsManager.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b50612284806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80638bfc820f1161005b5780638bfc820f146100f2578063be24138d14610105578063db0a69a814610118578063fba4ff9d1461013857600080fd5b8063070b9c3f1461008d57806320759f9e146100a2578063367287e3146100ca578063487dc38c146100dd575b600080fd5b6100a061009b366004611b6a565b610158565b005b6100b56100b0366004611bcf565b6101a4565b60405190151581526020015b60405180910390f35b6100b56100d8366004611c23565b6101bb565b6100e56101d2565b6040516100c19190611d27565b6100a0610100366004611df4565b6101e1565b6100a0610113366004611b6a565b610225565b61012b610126366004611e92565b610269565b6040516100c19190611ed3565b61014b610146366004611b6a565b610681565b6040516100c19190611f5a565b610160610692565b6001600160a01b0316336001600160a01b031614610198576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6101a18161075c565b50565b60006101b18484846107b2565b90505b9392505050565b60006101c9858585856107ec565b95945050505050565b60606101dc610806565b905090565b6101e9610692565b6001600160a01b0316336001600160a01b03161461021c576040516365f4906560e01b815233600482015260240161018f565b6101a181610904565b61022d610692565b6001600160a01b0316336001600160a01b031614610260576040516365f4906560e01b815233600482015260240161018f565b6101a181610962565b606060006102ac84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506109af92505050565b90506000805b82518110156102fe5760008382815181106102cf576102cf611f6d565b6020026020010151905080604001516102f5576080810151516102f29084611f99565b92505b506001016102b2565b506000816001600160401b0381111561031957610319611d8b565b60405190808252806020026020018201604052801561035e57816020015b60408051808201909152606080825260208201528152602001906001900390816103375790505b5090506000915060005b835181101561067557600084828151811061038557610385611f6d565b60200260200101519050806040015161066c5760005b81608001515181101561066a576000826080015182815181106103c0576103c0611f6d565b60200260200101519050806001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042c9190611fac565b6105445760008190506040518060400160405280826001600160a01b0316636465e69f6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561047e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104a6919081019061201c565b81528551604051630f7703d960e11b815260048101919091526020909101906001600160a01b03841690631eee07b290602401600060405180830381865afa1580156104f6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261051e919081019061201c565b81525086888151811061053357610533611f6d565b602002602001018190525050610654565b60008190506040518060400160405280826001600160a01b0316636465e69f6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610592573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105ba919081019061201c565b81528551604051630f7703d960e11b815260048101919091526020909101906001600160a01b03841690631eee07b290602401600060405180830381865afa15801561060a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610632919081019061201c565b81525086888151811061064757610647611f6d565b6020026020010181905250505b8561065e8161206c565b9650505060010161039b565b505b50600101610368565b50925050505b92915050565b610689611b22565b61067b82610bf9565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015610732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107569190612085565b91505090565b61076581610c4b565b610770816000610d14565b6040516001600160a01b038216815233907f055c4c0e6f85afe96beaac6c9d650859c001e6ef93103856624cce6ceba811b4906020015b60405180910390a250565b60006101b16000801b8585856040516020016107cf9291906120a2565b6040516020818303038152906040526107e7906120b2565b610e53565b60006101c9858585856040516020016107cf9291906120a2565b606060006108126110dc565b905080516001600160401b0381111561082d5761082d611d8b565b60405190808252806020026020018201604052801561086657816020015b610853611b22565b81526020019060019003908161084b5790505b50915060005b81518110156108ff5760008060008061089d86868151811061089057610890611f6d565b60200260200101516110f9565b93509350935093506040518060800160405280858152602001846001600160a01b031681526020018381526020018215158152508786815181106108e3576108e3611f6d565b602002602001018190525050505050808060010191505061086c565b505090565b60005b815181101561095e5761093282828151811061092557610925611f6d565b6020026020010151610c4b565b61095682828151811061094757610947611f6d565b60200260200101516001610d14565b600101610907565b5050565b61096b81610c4b565b6109748161126d565b6040516001600160a01b038216815233907fa8e3e13a35b592afaa9d213d12c7ea06384518ada9733585d20883cfafcf249b906020016107a7565b606060006109bb61132a565b80519091506000816001600160401b038111156109da576109da611d8b565b604051908082528060200260200182016040528015610a03578160200160208202803683370190505b5085516020870120909150600090815b84811015610ad2576000610a3f878381518110610a3257610a32611f6d565b6020026020010151611355565b509250505060005b8151811015610ac85783828281518110610a6357610a63611f6d565b60200260200101518051906020012003610ac057878381518110610a8957610a89611f6d565b6020026020010151868681518110610aa357610aa3611f6d565b602090810291909101015284610ab88161206c565b955050610ac8565b600101610a47565b5050600101610a13565b506000826001600160401b03811115610aed57610aed611d8b565b604051908082528060200260200182016040528015610b5257816020015b610b3f6040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b815260200190600190039081610b0b5790505b50905060005b83811015610bed576000858281518110610b7457610b74611f6d565b60200260200101519050600080600080610b8d85611355565b93509350935093506040518060a00160405280868152602001858152602001841515815260200183815260200182815250878781518110610bd057610bd0611f6d565b602002602001018190525050505050508080600101915050610b58565b50979650505050505050565b610c01611b22565b610c0a82610c4b565b600080600080610c19866110f9565b604080516080810182529485526001600160a01b03909316602085015291830152151560608201529695505050505050565b6001600160a01b038116610c7257604051630706e15760e51b815260040160405180910390fd5b6040516301ffc9a760e01b8152637bc2cb4560e11b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa925050508015610cd9575060408051601f3d908101601f19168201909252610cd691810190611fac565b60015b610cf65760405163f58a5f2760e01b815260040160405180910390fd5b8061095e5760405163f58a5f2760e01b815260040160405180910390fd5b81600080516020612264833981519152610d3c60008051602061224483398151915283611480565b15610d5a57604051632406020960e01b815260040160405180910390fd5b610d6760018201856114a2565b506040518060600160405280856001600160a01b031681526020018415158152602001836001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dec9190611fac565b151590526001600160a01b0394851660009081526020928352604090819020825181549484015193909201511515600160a81b0260ff60a81b19931515600160a01b026001600160a81b031990951692909716919091179290921716939093179092555050565b600080610e5e610692565b90506000610e6b856114b7565b80519091506000610e7a611635565b805190915060005b83811015610f39576000858281518110610e9e57610e9e611f6d565b60200260200101519050866001600160a01b0316816001600160a01b031603610ed15760019750505050505050506101b4565b60005b83811015610f2f57816001600160a01b0316610f08868381518110610efb57610efb611f6d565b6020026020010151611660565b6001600160a01b031603610f27576000985050505050505050506101b4565b600101610ed4565b5050600101610e82565b506000805160206122648339815191526000610f6260008051602061224483398151915261166b565b905060005b818110156110ca5760008381610f806001830185611675565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015611009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102d9190611fac565b1580156110aa575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401611069939291906120d6565b602060405180830381865afa158015611086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110aa9190611fac565b156110c157600199505050505050505050506101b4565b50600101610f67565b5060009b9a5050505050505050505050565b60606101dc6000805160206122648339815191525b600101611681565b60606000818160008051602061226483398151915261112660008051602061224483398151915287611480565b6111435760405163017ab33760e71b815260040160405180910390fd5b60008690506000816001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611188573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111b0919081019061201c565b6001600160a01b03808a16600090815260208690526040808220548151636465e69f60e01b815291519495508316939192861691636465e69f9160048082019286929091908290030181865afa15801561120e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611236919081019061201c565b6001600160a01b039a909a16600090815260209590955250604090932054909892979650600160a01b900460ff1694509092505050565b60008051602061226483398151915261129460008051602061224483398151915283611480565b6112b15760405163017ab33760e71b815260040160405180910390fd5b6001600160a01b038216600090815260208290526040902054600160a01b900460ff16156112f257604051636045809760e11b815260040160405180910390fd5b6112ff600182018361168e565b506001600160a01b0390911660009081526020919091526040902080546001600160b01b0319169055565b60606101dc7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd006110f1565b600081815260008051602061222483398151915260205260408120805460609291839182919061138490612138565b80601f01602080910402602001604051908101604052809291908181526020018280546113b090612138565b80156113fd5780601f106113d2576101008083540402835291602001916113fd565b820191906000526020600020905b8154815290600101906020018083116113e057829003601f168201915b5050505050935061142b7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0090565b6000868152600391909101602090815260408083206001015460008051602061222483398151915290925290912060ff909116935061146c906002016116a3565b9150611477856116ae565b90509193509193565b6001600160a01b038116600090815260018301602052604081205415156101b4565b60006101b4836001600160a01b0384166117b2565b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa15801561152c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611554919081019061216c565b80519091506000611566826001611f99565b6001600160401b0381111561157d5761157d611d8b565b6040519080825280602002602001820160405280156115a6578160200160208202803683370190505b50905060005b82811015611600578381815181106115c6576115c6611f6d565b60200260200101518282815181106115e0576115e0611f6d565b6001600160a01b03909216602092830291909101909101526001016115ac565b508581838151811061161457611614611f6d565b6001600160a01b039092166020928302919091019091015295945050505050565b60606101dc7f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611681565b600061067b82611801565b600061067b825490565b60006101b483836118cc565b606060006101b4836118f6565b60006101b4836001600160a01b038416611952565b606061067b82611a45565b600081815260008051602061222483398151915260205260408120606091906116d99060040161166b565b6001600160401b038111156116f0576116f0611d8b565b604051908082528060200260200182016040528015611719578160200160208202803683370190505b50905060005b6000848152600080516020612224833981519152602052604090206117469060040161166b565b8110156117ab576000848152600080516020612224833981519152602052604081206117759060040183611675565b90508083838151811061178a5761178a611f6d565b6001600160a01b03909216602092830291909101909101525060010161171f565b5092915050565b60008181526001830160205260408120546117f95750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561067b565b50600061067b565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b831690036118b257816000036118ac578054831061188857604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115611889575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b60008260000182815481106118e3576118e3611f6d565b9060005260206000200154905092915050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561194657602002820191906000526020600020905b815481526020019060010190808311611932575b50505050509050919050565b60008181526001830160205260408120548015611a3b5760006119766001836121fa565b855490915060009061198a906001906121fa565b90508082146119ef5760008660000182815481106119aa576119aa611f6d565b90600052602060002001549050808760000184815481106119cd576119cd611f6d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611a0057611a0061220d565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061067b565b600091505061067b565b606081600001805480602002602001604051908101604052809291908181526020016000905b82821015611b17578382906000526020600020018054611a8a90612138565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab690612138565b8015611b035780601f10611ad857610100808354040283529160200191611b03565b820191906000526020600020905b815481529060010190602001808311611ae657829003601f168201915b505050505081526020019060010190611a6b565b505050509050919050565b60405180608001604052806060815260200160006001600160a01b03168152602001606081526020016000151581525090565b6001600160a01b03811681146101a157600080fd5b600060208284031215611b7c57600080fd5b81356101b481611b55565b60008083601f840112611b9957600080fd5b5081356001600160401b03811115611bb057600080fd5b602083019150836020828501011115611bc857600080fd5b9250929050565b600080600060408486031215611be457600080fd5b8335611bef81611b55565b925060208401356001600160401b03811115611c0a57600080fd5b611c1686828701611b87565b9497909650939450505050565b60008060008060608587031215611c3957600080fd5b843593506020850135611c4b81611b55565b925060408501356001600160401b03811115611c6657600080fd5b611c7287828801611b87565b95989497509550505050565b60005b83811015611c99578181015183820152602001611c81565b50506000910152565b60008151808452611cba816020860160208601611c7e565b601f01601f19169290920160200192915050565b6000815160808452611ce36080850182611ca2565b905060018060a01b03602084015116602085015260408301518482036040860152611d0e8282611ca2565b9150506060830151151560608501528091505092915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015611d7e57603f19888603018452611d6c858351611cce565b94509285019290850190600101611d50565b5092979650505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611dc957611dc9611d8b565b604052919050565b60006001600160401b03821115611dea57611dea611d8b565b5060051b60200190565b60006020808385031215611e0757600080fd5b82356001600160401b03811115611e1d57600080fd5b8301601f81018513611e2e57600080fd5b8035611e41611e3c82611dd1565b611da1565b81815260059190911b82018301908381019087831115611e6057600080fd5b928401925b82841015611e87578335611e7881611b55565b82529284019290840190611e65565b979650505050505050565b60008060208385031215611ea557600080fd5b82356001600160401b03811115611ebb57600080fd5b611ec785828601611b87565b90969095509350505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015611f4c57888303603f1901855281518051878552611f2088860182611ca2565b91890151858303868b0152919050611f388183611ca2565b968901969450505090860190600101611efc565b509098975050505050505050565b6020815260006101b46020830184611cce565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561067b5761067b611f83565b600060208284031215611fbe57600080fd5b815180151581146101b457600080fd5b60006001600160401b03831115611fe757611fe7611d8b565b611ffa601f8401601f1916602001611da1565b905082815283838301111561200e57600080fd5b6101b4836020830184611c7e565b60006020828403121561202e57600080fd5b81516001600160401b0381111561204457600080fd5b8201601f8101841361205557600080fd5b61206484825160208401611fce565b949350505050565b60006001820161207e5761207e611f83565b5060010190565b60006020828403121561209757600080fd5b81516101b481611b55565b8183823760009101908152919050565b805160208083015191908110156118ac5760001960209190910360031b1b16919050565b60006060820185835260206060602085015281865180845260808601915060208801935060005b818110156121225784516001600160a01b0316835293830193918301916001016120fd565b5050809350505050826040830152949350505050565b600181811c9082168061214c57607f821691505b6020821081036118ac57634e487b7160e01b600052602260045260246000fd5b6000602080838503121561217f57600080fd5b82516001600160401b0381111561219557600080fd5b8301601f810185136121a657600080fd5b80516121b4611e3c82611dd1565b81815260059190911b820183019083810190878311156121d357600080fd5b928401925b82841015611e875783516121eb81611b55565b825292840192908401906121d8565b8181038181111561067b5761067b611f83565b634e487b7160e01b600052603160045260246000fdfe672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd03a558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c93101a558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c93100 \ No newline at end of file diff --git a/packages/generated/dev/abis/EntitlementsManager.json b/packages/generated/dev/abis/EntitlementsManager.json new file mode 100644 index 000000000..26003631d --- /dev/null +++ b/packages/generated/dev/abis/EntitlementsManager.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"addEntitlementModule","inputs":[{"name":"entitlement","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addImmutableEntitlements","inputs":[{"name":"entitlements","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getEntitlement","inputs":[{"name":"entitlement","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IEntitlementsManagerBase.Entitlement","components":[{"name":"name","type":"string","internalType":"string"},{"name":"moduleAddress","type":"address","internalType":"address"},{"name":"moduleType","type":"string","internalType":"string"},{"name":"isImmutable","type":"bool","internalType":"bool"}]}],"stateMutability":"view"},{"type":"function","name":"getEntitlementDataByPermission","inputs":[{"name":"permission","type":"string","internalType":"string"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IEntitlementsManager.EntitlementData[]","components":[{"name":"entitlementType","type":"string","internalType":"string"},{"name":"entitlementData","type":"bytes","internalType":"bytes"}]}],"stateMutability":"view"},{"type":"function","name":"getEntitlements","inputs":[],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IEntitlementsManagerBase.Entitlement[]","components":[{"name":"name","type":"string","internalType":"string"},{"name":"moduleAddress","type":"address","internalType":"address"},{"name":"moduleType","type":"string","internalType":"string"},{"name":"isImmutable","type":"bool","internalType":"bool"}]}],"stateMutability":"view"},{"type":"function","name":"isEntitledToChannel","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"},{"name":"user","type":"address","internalType":"address"},{"name":"permission","type":"string","internalType":"string"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isEntitledToSpace","inputs":[{"name":"user","type":"address","internalType":"address"},{"name":"permission","type":"string","internalType":"string"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"removeEntitlementModule","inputs":[{"name":"entitlement","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"Banned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ConsecutiveTransfer","inputs":[{"name":"fromTokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"toTokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EntitlementModuleAdded","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"entitlement","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EntitlementModuleRemoved","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"entitlement","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleCreated","inputs":[{"name":"creator","type":"address","indexed":true,"internalType":"address"},{"name":"roleId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"RoleRemoved","inputs":[{"name":"remover","type":"address","indexed":true,"internalType":"address"},{"name":"roleId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"RoleUpdated","inputs":[{"name":"updater","type":"address","indexed":true,"internalType":"address"},{"name":"roleId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"SubscriptionUpdate","inputs":[{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"expiration","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unbanned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"ApprovalCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"ApprovalQueryForNonexistentToken","inputs":[]},{"type":"error","name":"BalanceQueryForZeroAddress","inputs":[]},{"type":"error","name":"Banning__AlreadyBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__CannotBanSelf","inputs":[]},{"type":"error","name":"Banning__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__NotBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC5643__DurationZero","inputs":[]},{"type":"error","name":"ERC5643__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC5643__NotApprovedOrOwner","inputs":[]},{"type":"error","name":"ERC5643__SubscriptionNotRenewable","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Entitlement__InvalidValue","inputs":[]},{"type":"error","name":"Entitlement__NotAllowed","inputs":[]},{"type":"error","name":"Entitlement__NotMember","inputs":[]},{"type":"error","name":"Entitlement__ValueAlreadyExists","inputs":[]},{"type":"error","name":"EntitlementsService__EntitlementAlreadyExists","inputs":[]},{"type":"error","name":"EntitlementsService__EntitlementDoesNotExist","inputs":[]},{"type":"error","name":"EntitlementsService__ImmutableEntitlement","inputs":[]},{"type":"error","name":"EntitlementsService__InvalidEntitlementAddress","inputs":[]},{"type":"error","name":"EntitlementsService__InvalidEntitlementInterface","inputs":[]},{"type":"error","name":"MintERC2309QuantityExceedsLimit","inputs":[]},{"type":"error","name":"MintToZeroAddress","inputs":[]},{"type":"error","name":"MintZeroQuantity","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]},{"type":"error","name":"OwnerQueryForNonexistentToken","inputs":[]},{"type":"error","name":"OwnershipNotInitializedForExtraData","inputs":[]},{"type":"error","name":"Pausable__NotPaused","inputs":[]},{"type":"error","name":"Pausable__Paused","inputs":[]},{"type":"error","name":"Roles__EntitlementAlreadyExists","inputs":[]},{"type":"error","name":"Roles__EntitlementDoesNotExist","inputs":[]},{"type":"error","name":"Roles__InvalidEntitlementAddress","inputs":[]},{"type":"error","name":"Roles__InvalidPermission","inputs":[]},{"type":"error","name":"Roles__PermissionAlreadyExists","inputs":[]},{"type":"error","name":"Roles__PermissionDoesNotExist","inputs":[]},{"type":"error","name":"Roles__RoleDoesNotExist","inputs":[]},{"type":"error","name":"TransferCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"TransferFromIncorrectOwner","inputs":[]},{"type":"error","name":"TransferToNonERC721ReceiverImplementer","inputs":[]},{"type":"error","name":"TransferToZeroAddress","inputs":[]},{"type":"error","name":"URIQueryForNonexistentToken","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b50612284806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80638bfc820f1161005b5780638bfc820f146100f2578063be24138d14610105578063db0a69a814610118578063fba4ff9d1461013857600080fd5b8063070b9c3f1461008d57806320759f9e146100a2578063367287e3146100ca578063487dc38c146100dd575b600080fd5b6100a061009b366004611b6a565b610158565b005b6100b56100b0366004611bcf565b6101a4565b60405190151581526020015b60405180910390f35b6100b56100d8366004611c23565b6101bb565b6100e56101d2565b6040516100c19190611d27565b6100a0610100366004611df4565b6101e1565b6100a0610113366004611b6a565b610225565b61012b610126366004611e92565b610269565b6040516100c19190611ed3565b61014b610146366004611b6a565b610681565b6040516100c19190611f5a565b610160610692565b6001600160a01b0316336001600160a01b031614610198576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6101a18161075c565b50565b60006101b18484846107b2565b90505b9392505050565b60006101c9858585856107ec565b95945050505050565b60606101dc610806565b905090565b6101e9610692565b6001600160a01b0316336001600160a01b03161461021c576040516365f4906560e01b815233600482015260240161018f565b6101a181610904565b61022d610692565b6001600160a01b0316336001600160a01b031614610260576040516365f4906560e01b815233600482015260240161018f565b6101a181610962565b606060006102ac84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506109af92505050565b90506000805b82518110156102fe5760008382815181106102cf576102cf611f6d565b6020026020010151905080604001516102f5576080810151516102f29084611f99565b92505b506001016102b2565b506000816001600160401b0381111561031957610319611d8b565b60405190808252806020026020018201604052801561035e57816020015b60408051808201909152606080825260208201528152602001906001900390816103375790505b5090506000915060005b835181101561067557600084828151811061038557610385611f6d565b60200260200101519050806040015161066c5760005b81608001515181101561066a576000826080015182815181106103c0576103c0611f6d565b60200260200101519050806001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042c9190611fac565b6105445760008190506040518060400160405280826001600160a01b0316636465e69f6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561047e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104a6919081019061201c565b81528551604051630f7703d960e11b815260048101919091526020909101906001600160a01b03841690631eee07b290602401600060405180830381865afa1580156104f6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261051e919081019061201c565b81525086888151811061053357610533611f6d565b602002602001018190525050610654565b60008190506040518060400160405280826001600160a01b0316636465e69f6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610592573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105ba919081019061201c565b81528551604051630f7703d960e11b815260048101919091526020909101906001600160a01b03841690631eee07b290602401600060405180830381865afa15801561060a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610632919081019061201c565b81525086888151811061064757610647611f6d565b6020026020010181905250505b8561065e8161206c565b9650505060010161039b565b505b50600101610368565b50925050505b92915050565b610689611b22565b61067b82610bf9565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015610732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107569190612085565b91505090565b61076581610c4b565b610770816000610d14565b6040516001600160a01b038216815233907f055c4c0e6f85afe96beaac6c9d650859c001e6ef93103856624cce6ceba811b4906020015b60405180910390a250565b60006101b16000801b8585856040516020016107cf9291906120a2565b6040516020818303038152906040526107e7906120b2565b610e53565b60006101c9858585856040516020016107cf9291906120a2565b606060006108126110dc565b905080516001600160401b0381111561082d5761082d611d8b565b60405190808252806020026020018201604052801561086657816020015b610853611b22565b81526020019060019003908161084b5790505b50915060005b81518110156108ff5760008060008061089d86868151811061089057610890611f6d565b60200260200101516110f9565b93509350935093506040518060800160405280858152602001846001600160a01b031681526020018381526020018215158152508786815181106108e3576108e3611f6d565b602002602001018190525050505050808060010191505061086c565b505090565b60005b815181101561095e5761093282828151811061092557610925611f6d565b6020026020010151610c4b565b61095682828151811061094757610947611f6d565b60200260200101516001610d14565b600101610907565b5050565b61096b81610c4b565b6109748161126d565b6040516001600160a01b038216815233907fa8e3e13a35b592afaa9d213d12c7ea06384518ada9733585d20883cfafcf249b906020016107a7565b606060006109bb61132a565b80519091506000816001600160401b038111156109da576109da611d8b565b604051908082528060200260200182016040528015610a03578160200160208202803683370190505b5085516020870120909150600090815b84811015610ad2576000610a3f878381518110610a3257610a32611f6d565b6020026020010151611355565b509250505060005b8151811015610ac85783828281518110610a6357610a63611f6d565b60200260200101518051906020012003610ac057878381518110610a8957610a89611f6d565b6020026020010151868681518110610aa357610aa3611f6d565b602090810291909101015284610ab88161206c565b955050610ac8565b600101610a47565b5050600101610a13565b506000826001600160401b03811115610aed57610aed611d8b565b604051908082528060200260200182016040528015610b5257816020015b610b3f6040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b815260200190600190039081610b0b5790505b50905060005b83811015610bed576000858281518110610b7457610b74611f6d565b60200260200101519050600080600080610b8d85611355565b93509350935093506040518060a00160405280868152602001858152602001841515815260200183815260200182815250878781518110610bd057610bd0611f6d565b602002602001018190525050505050508080600101915050610b58565b50979650505050505050565b610c01611b22565b610c0a82610c4b565b600080600080610c19866110f9565b604080516080810182529485526001600160a01b03909316602085015291830152151560608201529695505050505050565b6001600160a01b038116610c7257604051630706e15760e51b815260040160405180910390fd5b6040516301ffc9a760e01b8152637bc2cb4560e11b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa925050508015610cd9575060408051601f3d908101601f19168201909252610cd691810190611fac565b60015b610cf65760405163f58a5f2760e01b815260040160405180910390fd5b8061095e5760405163f58a5f2760e01b815260040160405180910390fd5b81600080516020612264833981519152610d3c60008051602061224483398151915283611480565b15610d5a57604051632406020960e01b815260040160405180910390fd5b610d6760018201856114a2565b506040518060600160405280856001600160a01b031681526020018415158152602001836001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dec9190611fac565b151590526001600160a01b0394851660009081526020928352604090819020825181549484015193909201511515600160a81b0260ff60a81b19931515600160a01b026001600160a81b031990951692909716919091179290921716939093179092555050565b600080610e5e610692565b90506000610e6b856114b7565b80519091506000610e7a611635565b805190915060005b83811015610f39576000858281518110610e9e57610e9e611f6d565b60200260200101519050866001600160a01b0316816001600160a01b031603610ed15760019750505050505050506101b4565b60005b83811015610f2f57816001600160a01b0316610f08868381518110610efb57610efb611f6d565b6020026020010151611660565b6001600160a01b031603610f27576000985050505050505050506101b4565b600101610ed4565b5050600101610e82565b506000805160206122648339815191526000610f6260008051602061224483398151915261166b565b905060005b818110156110ca5760008381610f806001830185611675565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015611009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102d9190611fac565b1580156110aa575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401611069939291906120d6565b602060405180830381865afa158015611086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110aa9190611fac565b156110c157600199505050505050505050506101b4565b50600101610f67565b5060009b9a5050505050505050505050565b60606101dc6000805160206122648339815191525b600101611681565b60606000818160008051602061226483398151915261112660008051602061224483398151915287611480565b6111435760405163017ab33760e71b815260040160405180910390fd5b60008690506000816001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611188573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111b0919081019061201c565b6001600160a01b03808a16600090815260208690526040808220548151636465e69f60e01b815291519495508316939192861691636465e69f9160048082019286929091908290030181865afa15801561120e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611236919081019061201c565b6001600160a01b039a909a16600090815260209590955250604090932054909892979650600160a01b900460ff1694509092505050565b60008051602061226483398151915261129460008051602061224483398151915283611480565b6112b15760405163017ab33760e71b815260040160405180910390fd5b6001600160a01b038216600090815260208290526040902054600160a01b900460ff16156112f257604051636045809760e11b815260040160405180910390fd5b6112ff600182018361168e565b506001600160a01b0390911660009081526020919091526040902080546001600160b01b0319169055565b60606101dc7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd006110f1565b600081815260008051602061222483398151915260205260408120805460609291839182919061138490612138565b80601f01602080910402602001604051908101604052809291908181526020018280546113b090612138565b80156113fd5780601f106113d2576101008083540402835291602001916113fd565b820191906000526020600020905b8154815290600101906020018083116113e057829003601f168201915b5050505050935061142b7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0090565b6000868152600391909101602090815260408083206001015460008051602061222483398151915290925290912060ff909116935061146c906002016116a3565b9150611477856116ae565b90509193509193565b6001600160a01b038116600090815260018301602052604081205415156101b4565b60006101b4836001600160a01b0384166117b2565b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa15801561152c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611554919081019061216c565b80519091506000611566826001611f99565b6001600160401b0381111561157d5761157d611d8b565b6040519080825280602002602001820160405280156115a6578160200160208202803683370190505b50905060005b82811015611600578381815181106115c6576115c6611f6d565b60200260200101518282815181106115e0576115e0611f6d565b6001600160a01b03909216602092830291909101909101526001016115ac565b508581838151811061161457611614611f6d565b6001600160a01b039092166020928302919091019091015295945050505050565b60606101dc7f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611681565b600061067b82611801565b600061067b825490565b60006101b483836118cc565b606060006101b4836118f6565b60006101b4836001600160a01b038416611952565b606061067b82611a45565b600081815260008051602061222483398151915260205260408120606091906116d99060040161166b565b6001600160401b038111156116f0576116f0611d8b565b604051908082528060200260200182016040528015611719578160200160208202803683370190505b50905060005b6000848152600080516020612224833981519152602052604090206117469060040161166b565b8110156117ab576000848152600080516020612224833981519152602052604081206117759060040183611675565b90508083838151811061178a5761178a611f6d565b6001600160a01b03909216602092830291909101909101525060010161171f565b5092915050565b60008181526001830160205260408120546117f95750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561067b565b50600061067b565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b831690036118b257816000036118ac578054831061188857604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115611889575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b60008260000182815481106118e3576118e3611f6d565b9060005260206000200154905092915050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561194657602002820191906000526020600020905b815481526020019060010190808311611932575b50505050509050919050565b60008181526001830160205260408120548015611a3b5760006119766001836121fa565b855490915060009061198a906001906121fa565b90508082146119ef5760008660000182815481106119aa576119aa611f6d565b90600052602060002001549050808760000184815481106119cd576119cd611f6d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611a0057611a0061220d565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061067b565b600091505061067b565b606081600001805480602002602001604051908101604052809291908181526020016000905b82821015611b17578382906000526020600020018054611a8a90612138565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab690612138565b8015611b035780601f10611ad857610100808354040283529160200191611b03565b820191906000526020600020905b815481529060010190602001808311611ae657829003601f168201915b505050505081526020019060010190611a6b565b505050509050919050565b60405180608001604052806060815260200160006001600160a01b03168152602001606081526020016000151581525090565b6001600160a01b03811681146101a157600080fd5b600060208284031215611b7c57600080fd5b81356101b481611b55565b60008083601f840112611b9957600080fd5b5081356001600160401b03811115611bb057600080fd5b602083019150836020828501011115611bc857600080fd5b9250929050565b600080600060408486031215611be457600080fd5b8335611bef81611b55565b925060208401356001600160401b03811115611c0a57600080fd5b611c1686828701611b87565b9497909650939450505050565b60008060008060608587031215611c3957600080fd5b843593506020850135611c4b81611b55565b925060408501356001600160401b03811115611c6657600080fd5b611c7287828801611b87565b95989497509550505050565b60005b83811015611c99578181015183820152602001611c81565b50506000910152565b60008151808452611cba816020860160208601611c7e565b601f01601f19169290920160200192915050565b6000815160808452611ce36080850182611ca2565b905060018060a01b03602084015116602085015260408301518482036040860152611d0e8282611ca2565b9150506060830151151560608501528091505092915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015611d7e57603f19888603018452611d6c858351611cce565b94509285019290850190600101611d50565b5092979650505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611dc957611dc9611d8b565b604052919050565b60006001600160401b03821115611dea57611dea611d8b565b5060051b60200190565b60006020808385031215611e0757600080fd5b82356001600160401b03811115611e1d57600080fd5b8301601f81018513611e2e57600080fd5b8035611e41611e3c82611dd1565b611da1565b81815260059190911b82018301908381019087831115611e6057600080fd5b928401925b82841015611e87578335611e7881611b55565b82529284019290840190611e65565b979650505050505050565b60008060208385031215611ea557600080fd5b82356001600160401b03811115611ebb57600080fd5b611ec785828601611b87565b90969095509350505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015611f4c57888303603f1901855281518051878552611f2088860182611ca2565b91890151858303868b0152919050611f388183611ca2565b968901969450505090860190600101611efc565b509098975050505050505050565b6020815260006101b46020830184611cce565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561067b5761067b611f83565b600060208284031215611fbe57600080fd5b815180151581146101b457600080fd5b60006001600160401b03831115611fe757611fe7611d8b565b611ffa601f8401601f1916602001611da1565b905082815283838301111561200e57600080fd5b6101b4836020830184611c7e565b60006020828403121561202e57600080fd5b81516001600160401b0381111561204457600080fd5b8201601f8101841361205557600080fd5b61206484825160208401611fce565b949350505050565b60006001820161207e5761207e611f83565b5060010190565b60006020828403121561209757600080fd5b81516101b481611b55565b8183823760009101908152919050565b805160208083015191908110156118ac5760001960209190910360031b1b16919050565b60006060820185835260206060602085015281865180845260808601915060208801935060005b818110156121225784516001600160a01b0316835293830193918301916001016120fd565b5050809350505050826040830152949350505050565b600181811c9082168061214c57607f821691505b6020821081036118ac57634e487b7160e01b600052602260045260246000fd5b6000602080838503121561217f57600080fd5b82516001600160401b0381111561219557600080fd5b8301601f810185136121a657600080fd5b80516121b4611e3c82611dd1565b81815260059190911b820183019083810190878311156121d357600080fd5b928401925b82841015611e875783516121eb81611b55565b825292840192908401906121d8565b8181038181111561067b5761067b611f83565b634e487b7160e01b600052603160045260246000fdfe672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd03a558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c93101a558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c93100","sourceMap":"634:2588:208:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100885760003560e01c80638bfc820f1161005b5780638bfc820f146100f2578063be24138d14610105578063db0a69a814610118578063fba4ff9d1461013857600080fd5b8063070b9c3f1461008d57806320759f9e146100a2578063367287e3146100ca578063487dc38c146100dd575b600080fd5b6100a061009b366004611b6a565b610158565b005b6100b56100b0366004611bcf565b6101a4565b60405190151581526020015b60405180910390f35b6100b56100d8366004611c23565b6101bb565b6100e56101d2565b6040516100c19190611d27565b6100a0610100366004611df4565b6101e1565b6100a0610113366004611b6a565b610225565b61012b610126366004611e92565b610269565b6040516100c19190611ed3565b61014b610146366004611b6a565b610681565b6040516100c19190611f5a565b610160610692565b6001600160a01b0316336001600160a01b031614610198576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6101a18161075c565b50565b60006101b18484846107b2565b90505b9392505050565b60006101c9858585856107ec565b95945050505050565b60606101dc610806565b905090565b6101e9610692565b6001600160a01b0316336001600160a01b03161461021c576040516365f4906560e01b815233600482015260240161018f565b6101a181610904565b61022d610692565b6001600160a01b0316336001600160a01b031614610260576040516365f4906560e01b815233600482015260240161018f565b6101a181610962565b606060006102ac84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506109af92505050565b90506000805b82518110156102fe5760008382815181106102cf576102cf611f6d565b6020026020010151905080604001516102f5576080810151516102f29084611f99565b92505b506001016102b2565b506000816001600160401b0381111561031957610319611d8b565b60405190808252806020026020018201604052801561035e57816020015b60408051808201909152606080825260208201528152602001906001900390816103375790505b5090506000915060005b835181101561067557600084828151811061038557610385611f6d565b60200260200101519050806040015161066c5760005b81608001515181101561066a576000826080015182815181106103c0576103c0611f6d565b60200260200101519050806001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042c9190611fac565b6105445760008190506040518060400160405280826001600160a01b0316636465e69f6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561047e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104a6919081019061201c565b81528551604051630f7703d960e11b815260048101919091526020909101906001600160a01b03841690631eee07b290602401600060405180830381865afa1580156104f6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261051e919081019061201c565b81525086888151811061053357610533611f6d565b602002602001018190525050610654565b60008190506040518060400160405280826001600160a01b0316636465e69f6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610592573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105ba919081019061201c565b81528551604051630f7703d960e11b815260048101919091526020909101906001600160a01b03841690631eee07b290602401600060405180830381865afa15801561060a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610632919081019061201c565b81525086888151811061064757610647611f6d565b6020026020010181905250505b8561065e8161206c565b9650505060010161039b565b505b50600101610368565b50925050505b92915050565b610689611b22565b61067b82610bf9565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015610732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107569190612085565b91505090565b61076581610c4b565b610770816000610d14565b6040516001600160a01b038216815233907f055c4c0e6f85afe96beaac6c9d650859c001e6ef93103856624cce6ceba811b4906020015b60405180910390a250565b60006101b16000801b8585856040516020016107cf9291906120a2565b6040516020818303038152906040526107e7906120b2565b610e53565b60006101c9858585856040516020016107cf9291906120a2565b606060006108126110dc565b905080516001600160401b0381111561082d5761082d611d8b565b60405190808252806020026020018201604052801561086657816020015b610853611b22565b81526020019060019003908161084b5790505b50915060005b81518110156108ff5760008060008061089d86868151811061089057610890611f6d565b60200260200101516110f9565b93509350935093506040518060800160405280858152602001846001600160a01b031681526020018381526020018215158152508786815181106108e3576108e3611f6d565b602002602001018190525050505050808060010191505061086c565b505090565b60005b815181101561095e5761093282828151811061092557610925611f6d565b6020026020010151610c4b565b61095682828151811061094757610947611f6d565b60200260200101516001610d14565b600101610907565b5050565b61096b81610c4b565b6109748161126d565b6040516001600160a01b038216815233907fa8e3e13a35b592afaa9d213d12c7ea06384518ada9733585d20883cfafcf249b906020016107a7565b606060006109bb61132a565b80519091506000816001600160401b038111156109da576109da611d8b565b604051908082528060200260200182016040528015610a03578160200160208202803683370190505b5085516020870120909150600090815b84811015610ad2576000610a3f878381518110610a3257610a32611f6d565b6020026020010151611355565b509250505060005b8151811015610ac85783828281518110610a6357610a63611f6d565b60200260200101518051906020012003610ac057878381518110610a8957610a89611f6d565b6020026020010151868681518110610aa357610aa3611f6d565b602090810291909101015284610ab88161206c565b955050610ac8565b600101610a47565b5050600101610a13565b506000826001600160401b03811115610aed57610aed611d8b565b604051908082528060200260200182016040528015610b5257816020015b610b3f6040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b815260200190600190039081610b0b5790505b50905060005b83811015610bed576000858281518110610b7457610b74611f6d565b60200260200101519050600080600080610b8d85611355565b93509350935093506040518060a00160405280868152602001858152602001841515815260200183815260200182815250878781518110610bd057610bd0611f6d565b602002602001018190525050505050508080600101915050610b58565b50979650505050505050565b610c01611b22565b610c0a82610c4b565b600080600080610c19866110f9565b604080516080810182529485526001600160a01b03909316602085015291830152151560608201529695505050505050565b6001600160a01b038116610c7257604051630706e15760e51b815260040160405180910390fd5b6040516301ffc9a760e01b8152637bc2cb4560e11b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa925050508015610cd9575060408051601f3d908101601f19168201909252610cd691810190611fac565b60015b610cf65760405163f58a5f2760e01b815260040160405180910390fd5b8061095e5760405163f58a5f2760e01b815260040160405180910390fd5b81600080516020612264833981519152610d3c60008051602061224483398151915283611480565b15610d5a57604051632406020960e01b815260040160405180910390fd5b610d6760018201856114a2565b506040518060600160405280856001600160a01b031681526020018415158152602001836001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dec9190611fac565b151590526001600160a01b0394851660009081526020928352604090819020825181549484015193909201511515600160a81b0260ff60a81b19931515600160a01b026001600160a81b031990951692909716919091179290921716939093179092555050565b600080610e5e610692565b90506000610e6b856114b7565b80519091506000610e7a611635565b805190915060005b83811015610f39576000858281518110610e9e57610e9e611f6d565b60200260200101519050866001600160a01b0316816001600160a01b031603610ed15760019750505050505050506101b4565b60005b83811015610f2f57816001600160a01b0316610f08868381518110610efb57610efb611f6d565b6020026020010151611660565b6001600160a01b031603610f27576000985050505050505050506101b4565b600101610ed4565b5050600101610e82565b506000805160206122648339815191526000610f6260008051602061224483398151915261166b565b905060005b818110156110ca5760008381610f806001830185611675565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015611009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102d9190611fac565b1580156110aa575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401611069939291906120d6565b602060405180830381865afa158015611086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110aa9190611fac565b156110c157600199505050505050505050506101b4565b50600101610f67565b5060009b9a5050505050505050505050565b60606101dc6000805160206122648339815191525b600101611681565b60606000818160008051602061226483398151915261112660008051602061224483398151915287611480565b6111435760405163017ab33760e71b815260040160405180910390fd5b60008690506000816001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611188573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111b0919081019061201c565b6001600160a01b03808a16600090815260208690526040808220548151636465e69f60e01b815291519495508316939192861691636465e69f9160048082019286929091908290030181865afa15801561120e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611236919081019061201c565b6001600160a01b039a909a16600090815260209590955250604090932054909892979650600160a01b900460ff1694509092505050565b60008051602061226483398151915261129460008051602061224483398151915283611480565b6112b15760405163017ab33760e71b815260040160405180910390fd5b6001600160a01b038216600090815260208290526040902054600160a01b900460ff16156112f257604051636045809760e11b815260040160405180910390fd5b6112ff600182018361168e565b506001600160a01b0390911660009081526020919091526040902080546001600160b01b0319169055565b60606101dc7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd006110f1565b600081815260008051602061222483398151915260205260408120805460609291839182919061138490612138565b80601f01602080910402602001604051908101604052809291908181526020018280546113b090612138565b80156113fd5780601f106113d2576101008083540402835291602001916113fd565b820191906000526020600020905b8154815290600101906020018083116113e057829003601f168201915b5050505050935061142b7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0090565b6000868152600391909101602090815260408083206001015460008051602061222483398151915290925290912060ff909116935061146c906002016116a3565b9150611477856116ae565b90509193509193565b6001600160a01b038116600090815260018301602052604081205415156101b4565b60006101b4836001600160a01b0384166117b2565b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa15801561152c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611554919081019061216c565b80519091506000611566826001611f99565b6001600160401b0381111561157d5761157d611d8b565b6040519080825280602002602001820160405280156115a6578160200160208202803683370190505b50905060005b82811015611600578381815181106115c6576115c6611f6d565b60200260200101518282815181106115e0576115e0611f6d565b6001600160a01b03909216602092830291909101909101526001016115ac565b508581838151811061161457611614611f6d565b6001600160a01b039092166020928302919091019091015295945050505050565b60606101dc7f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611681565b600061067b82611801565b600061067b825490565b60006101b483836118cc565b606060006101b4836118f6565b60006101b4836001600160a01b038416611952565b606061067b82611a45565b600081815260008051602061222483398151915260205260408120606091906116d99060040161166b565b6001600160401b038111156116f0576116f0611d8b565b604051908082528060200260200182016040528015611719578160200160208202803683370190505b50905060005b6000848152600080516020612224833981519152602052604090206117469060040161166b565b8110156117ab576000848152600080516020612224833981519152602052604081206117759060040183611675565b90508083838151811061178a5761178a611f6d565b6001600160a01b03909216602092830291909101909101525060010161171f565b5092915050565b60008181526001830160205260408120546117f95750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561067b565b50600061067b565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b831690036118b257816000036118ac578054831061188857604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115611889575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b60008260000182815481106118e3576118e3611f6d565b9060005260206000200154905092915050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561194657602002820191906000526020600020905b815481526020019060010190808311611932575b50505050509050919050565b60008181526001830160205260408120548015611a3b5760006119766001836121fa565b855490915060009061198a906001906121fa565b90508082146119ef5760008660000182815481106119aa576119aa611f6d565b90600052602060002001549050808760000184815481106119cd576119cd611f6d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611a0057611a0061220d565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061067b565b600091505061067b565b606081600001805480602002602001604051908101604052809291908181526020016000905b82821015611b17578382906000526020600020018054611a8a90612138565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab690612138565b8015611b035780601f10611ad857610100808354040283529160200191611b03565b820191906000526020600020905b815481529060010190602001808311611ae657829003601f168201915b505050505081526020019060010190611a6b565b505050509050919050565b60405180608001604052806060815260200160006001600160a01b03168152602001606081526020016000151581525090565b6001600160a01b03811681146101a157600080fd5b600060208284031215611b7c57600080fd5b81356101b481611b55565b60008083601f840112611b9957600080fd5b5081356001600160401b03811115611bb057600080fd5b602083019150836020828501011115611bc857600080fd5b9250929050565b600080600060408486031215611be457600080fd5b8335611bef81611b55565b925060208401356001600160401b03811115611c0a57600080fd5b611c1686828701611b87565b9497909650939450505050565b60008060008060608587031215611c3957600080fd5b843593506020850135611c4b81611b55565b925060408501356001600160401b03811115611c6657600080fd5b611c7287828801611b87565b95989497509550505050565b60005b83811015611c99578181015183820152602001611c81565b50506000910152565b60008151808452611cba816020860160208601611c7e565b601f01601f19169290920160200192915050565b6000815160808452611ce36080850182611ca2565b905060018060a01b03602084015116602085015260408301518482036040860152611d0e8282611ca2565b9150506060830151151560608501528091505092915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015611d7e57603f19888603018452611d6c858351611cce565b94509285019290850190600101611d50565b5092979650505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611dc957611dc9611d8b565b604052919050565b60006001600160401b03821115611dea57611dea611d8b565b5060051b60200190565b60006020808385031215611e0757600080fd5b82356001600160401b03811115611e1d57600080fd5b8301601f81018513611e2e57600080fd5b8035611e41611e3c82611dd1565b611da1565b81815260059190911b82018301908381019087831115611e6057600080fd5b928401925b82841015611e87578335611e7881611b55565b82529284019290840190611e65565b979650505050505050565b60008060208385031215611ea557600080fd5b82356001600160401b03811115611ebb57600080fd5b611ec785828601611b87565b90969095509350505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015611f4c57888303603f1901855281518051878552611f2088860182611ca2565b91890151858303868b0152919050611f388183611ca2565b968901969450505090860190600101611efc565b509098975050505050505050565b6020815260006101b46020830184611cce565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561067b5761067b611f83565b600060208284031215611fbe57600080fd5b815180151581146101b457600080fd5b60006001600160401b03831115611fe757611fe7611d8b565b611ffa601f8401601f1916602001611da1565b905082815283838301111561200e57600080fd5b6101b4836020830184611c7e565b60006020828403121561202e57600080fd5b81516001600160401b0381111561204457600080fd5b8201601f8101841361205557600080fd5b61206484825160208401611fce565b949350505050565b60006001820161207e5761207e611f83565b5060010190565b60006020828403121561209757600080fd5b81516101b481611b55565b8183823760009101908152919050565b805160208083015191908110156118ac5760001960209190910360031b1b16919050565b60006060820185835260206060602085015281865180845260808601915060208801935060005b818110156121225784516001600160a01b0316835293830193918301916001016120fd565b5050809350505050826040830152949350505050565b600181811c9082168061214c57607f821691505b6020821081036118ac57634e487b7160e01b600052602260045260246000fd5b6000602080838503121561217f57600080fd5b82516001600160401b0381111561219557600080fd5b8301601f810185136121a657600080fd5b80516121b4611e3c82611dd1565b81815260059190911b820183019083810190878311156121d357600080fd5b928401925b82841015611e875783516121eb81611b55565b825292840192908401906121d8565b8181038181111561067b5761067b611f83565b634e487b7160e01b600052603160045260246000fdfe672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd03a558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c93101a558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c93100","sourceMap":"634:2588:208:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;891:115;;;;;;:::i;:::-;;:::i;:::-;;1393:164;;;;;;:::i;:::-;;:::i;:::-;;;1471:14:516;;1464:22;1446:41;;1434:2;1419:18;1393:164:208;;;;;;;;1561:202;;;;;;:::i;:::-;;:::i;1135:108::-;;;:::i;:::-;;;;;;;:::i;745:142::-;;;;;;:::i;:::-;;:::i;1010:121::-;;;;;;:::i;:::-;;:::i;1767:1453::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1247:142::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;891:115::-;648:8:105;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:105;:10;-1:-1:-1;;;;;634:22:105;;630:79;;673:29;;-1:-1:-1;;;673:29:105;;691:10;673:29;;;7638:51:516;7611:18;;673:29:105;;;;;;;;630:79;967:34:208::1;989:11;967:21;:34::i;:::-;891:115:::0;:::o;1393:164::-;1497:4;1516:36;1535:4;1541:10;;1516:18;:36::i;:::-;1509:43;;1393:164;;;;;;:::o;1561:202::-;1690:4;1709:49;1730:9;1741:4;1747:10;;1709:20;:49::i;:::-;1702:56;1561:202;-1:-1:-1;;;;;1561:202:208:o;1135:108::-;1185:20;1220:18;:16;:18::i;:::-;1213:25;;1135:108;:::o;745:142::-;648:8:105;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:105;:10;-1:-1:-1;;;;;634:22:105;;630:79;;673:29;;-1:-1:-1;;;673:29:105;;691:10;673:29;;;7638:51:516;7611:18;;673:29:105;7492:203:516;630:79:105;843:39:208::1;869:12;843:25;:39::i;1010:121::-:0;648:8:105;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:105;:10;-1:-1:-1;;;;;634:22:105;;630:79;;673:29;;-1:-1:-1;;;673:29:105;;691:10;673:29;;;7638:51:516;7611:18;;673:29:105;7492:203:516;630:79:105;1089:37:208::1;1114:11;1089:24;:37::i;1767:1453::-:0;1866:24;1898:30;1931:35;1955:10;;1931:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1931:23:208;;-1:-1:-1;;;1931:35:208:i;:::-;1898:68;;1972:24;2011:9;2006:186;2030:5;:12;2026:1;:16;2006:186;;;2057:27;2087:5;2093:1;2087:8;;;;;;;;:::i;:::-;;;;;;;2057:38;;2108:4;:13;;;2103:83;;2153:17;;;;:24;2133:44;;;;:::i;:::-;;;2103:83;-1:-1:-1;2044:3:208;;2006:186;;;;2198:40;2270:16;-1:-1:-1;;;;;2241:51:208;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;2241:51:208;;;;;;;;;;;;;;;;2198:94;;2318:1;2299:20;;2331:9;2326:862;2350:5;:12;2346:1;:16;2326:862;;;2377:27;2407:5;2413:1;2407:8;;;;;;;;:::i;:::-;;;;;;;2377:38;;2428:4;:13;;;2423:759;;2458:9;2453:721;2477:4;:17;;;:24;2473:1;:28;2453:721;;;2520:24;2560:4;:17;;;2578:1;2560:20;;;;;;;;:::i;:::-;;;;;;;2520:61;;2598:11;-1:-1:-1;;;;;2598:24:208;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2593:541;;2640:19;2687:11;2640:60;;2750:114;;;;;;;;2781:2;-1:-1:-1;;;;;2781:13:208;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2781:15:208;;;;;;;;;;;;:::i;:::-;2750:114;;2842:7;;2812:38;;-1:-1:-1;;;2812:38:208;;;;;9382:25:516;;;;2750:114:208;;;;;-1:-1:-1;;;;;2812:29:208;;;;;9355:18:516;;2812:38:208;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2812:38:208;;;;;;;;;;;;:::i;:::-;2750:114;;;2714:15;2730:16;2714:33;;;;;;;;:::i;:::-;;;;;;:150;;;;2626:251;2593:541;;;2897:19;2944:11;2897:60;;3007:114;;;;;;;;3038:2;-1:-1:-1;;;;;3038:13:208;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3038:15:208;;;;;;;;;;;;:::i;:::-;3007:114;;3099:7;;3069:38;;-1:-1:-1;;;3069:38:208;;;;;9382:25:516;;;;3007:114:208;;;;;-1:-1:-1;;;;;3069:29:208;;;;;9355:18:516;;3069:38:208;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3069:38:208;;;;;;;;;;;;:::i;:::-;3007:114;;;2971:15;2987:16;2971:33;;;;;;;;:::i;:::-;;;;;;:150;;;;2883:251;2593:541;3145:18;;;;:::i;:::-;;-1:-1:-1;;;2503:3:208;;2453:721;;;;2423:759;-1:-1:-1;2364:3:208;;2326:862;;;-1:-1:-1;3200:15:208;-1:-1:-1;;;1767:1453:208;;;;;:::o;1247:142::-;1323:18;;:::i;:::-;1356:28;1372:11;1356:15;:28::i;724:189:105:-;786:67;;;;;;;;302:66:107;786:67:105;-1:-1:-1;;;;;786:67:105;;;;;;;;;;;;;866:42;;-1:-1:-1;;;866:42:105;;;;;9382:25:516;;;;866:42:105;;765:13;;866:30;;9355:18:516;;;;;866:42:105;;;;;;786:67;866:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;859:49;;;724:189;:::o;647:355:209:-;770:59;817:11;770:46;:59::i;:::-;859:61;901:11;914:5;859:41;:61::i;:::-;950:47;;-1:-1:-1;;;;;7656:32:516;;7638:51;;973:10:209;;950:47;;7626:2:516;7611:18;950:47:209;;;;;;;;647:355;:::o;2822:194:192:-;2927:4;2946:65;1445:3;2958:7;;2967:4;2998:10;;2981:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2973:37;;;:::i;:::-;2946:11;:65::i;3020:221::-;3150:4;3169:67;3181:9;3192:4;3223:10;;3206:28;;;;;;;;;:::i;1886:680:209:-;1949:28;1987:29;2019:51;:49;:51::i;:::-;1987:83;;2105:12;:19;-1:-1:-1;;;;;2087:38:209;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2077:48;;2137:9;2132:430;2156:12;:19;2152:1;:23;2132:430;;;2200:18;2228:26;2264:24;2298:16;2325:58;2367:12;2380:1;2367:15;;;;;;;;:::i;:::-;;;;;;;2325:41;:58::i;:::-;2190:193;;;;;;;;2405:150;;;;;;;;2433:4;2405:150;;;;2462:18;-1:-1:-1;;;;;2405:150:209;;;;;2502:10;2405:150;;;;2535:11;2405:150;;;;;2392:7;2400:1;2392:10;;;;;;;;:::i;:::-;;;;;;:163;;;;2182:380;;;;2177:3;;;;;;;2132:430;;;;1981:585;1886:680;:::o;358:285::-;444:9;439:200;463:12;:19;459:1;:23;439:200;;;497:63;544:12;557:1;544:15;;;;;;;;:::i;:::-;;;;;;;497:46;:63::i;:::-;568:64;610:12;623:1;610:15;;;;;;;;:::i;:::-;;;;;;;627:4;568:41;:64::i;:::-;484:3;;439:200;;;;358:285;:::o;1006:356::-;1132:59;1179:11;1132:46;:59::i;:::-;1221:57;1266:11;1221:44;:57::i;:::-;1308:49;;-1:-1:-1;;;;;7656:32:516;;7638:51;;1333:10:209;;1308:49;;7626:2:516;7611:18;1308:49:209;7492:203:516;2762:1424:242;2852:13;2873:24;2900:13;:11;:13::i;:::-;2939:14;;2873:40;;-1:-1:-1;2919:17:242;2939:14;-1:-1:-1;;;;;2993:24:242;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2993:24:242;-1:-1:-1;3077:28:242;;;;;;2959:58;;-1:-1:-1;3023:13:242;;;3186:341;3210:9;3206:1;:13;3186:341;;;3239:27;3272:20;3281:7;3289:1;3281:10;;;;;;;;:::i;:::-;;;;;;;3272:8;:20::i;:::-;3234:58;;;;;3305:9;3300:221;3324:11;:18;3320:1;:22;3300:221;;;3399:19;3379:11;3391:1;3379:14;;;;;;;;:::i;:::-;;;;;;;3363:32;;;;;;:55;3359:154;;3456:7;3464:1;3456:10;;;;;;;;:::i;:::-;;;;;;;3432:14;3447:5;3432:21;;;;;;;;:::i;:::-;;;;;;;;;;:34;3478:7;;;;:::i;:::-;;;;3497:5;;3359:154;3344:3;;3300:221;;;-1:-1:-1;;3221:3:242;;3186:341;;;;3592:33;3639:5;-1:-1:-1;;;;;3628:17:242;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3628:17:242;;;;;;;;;;;;;;;;;3592:53;;3711:9;3706:443;3730:5;3726:1;:9;3706:443;;;3750:14;3767;3782:1;3767:17;;;;;;;;:::i;:::-;;;;;;;3750:34;;3802:18;3830:16;3856:27;3893:34;3938:16;3947:6;3938:8;:16::i;:::-;3792:162;;;;;;;;3987:155;;;;;;;;4006:6;3987:155;;;;4028:4;3987:155;;;;4052:11;3987:155;;;;;;4086:11;3987:155;;;;4121:12;3987:155;;;3962:19;3982:1;3962:22;;;;;;;;:::i;:::-;;;;;;:180;;;;3742:407;;;;;3737:3;;;;;;;3706:443;;;-1:-1:-1;4162:19:242;2762:1424;-1:-1:-1;;;;;;;2762:1424:242:o;1366:516:209:-;1443:25;;:::i;:::-;1476:59;1523:11;1476:46;:59::i;:::-;1550:18;1576:26;1610:24;1642:16;1667:54;1709:11;1667:41;:54::i;:::-;1737:140;;;;;;;;;;;-1:-1:-1;;;;;1737:140:209;;;;;;;;;;;;;;;;;;1366:516;-1:-1:-1;;;;;;1366:516:209:o;3437:476:210:-;-1:-1:-1;;;;;3511:25:210;;3507:101;;3553:48;;-1:-1:-1;;;3553:48:210;;;;;;;;;;;3507:101;3624:70;;-1:-1:-1;;;3624:70:210;;-1:-1:-1;;;3624:70:210;;;11001:52:516;-1:-1:-1;;;;;3624:38:210;;;;;10974:18:516;;3624:70:210;;;;;;;;;;;;;;;;;;-1:-1:-1;3624:70:210;;;;;;;;-1:-1:-1;;3624:70:210;;;;;;;;;;;;:::i;:::-;;;3614:295;;3852:50;;-1:-1:-1;;;3852:50:210;;;;;;;;;;;3614:295;3737:9;3732:92;;3765:50;;-1:-1:-1;;;3765:50:210;;;;;;;;;;;1239:601;1348:11;-1:-1:-1;;;;;;;;;;;1466:37:210;-1:-1:-1;;;;;;;;;;;1348:11:210;1466:24;:37::i;:::-;1462:112;;;1520:47;;-1:-1:-1;;;1520:47:210;;;;;;;;;;;1462:112;1580:32;:15;;;1600:11;1580:19;:32::i;:::-;;1657:178;;;;;;;;1739:11;-1:-1:-1;;;;;1657:178:210;;;;;1774:11;1657:178;;;;;;1809:2;-1:-1:-1;;;;;1809:15:210;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1657:178;;;;-1:-1:-1;;;;;1618:36:210;;;:23;:36;;;;;;;;;;;;:217;;;;;;;;;;;;;;;-1:-1:-1;;;1618:217:210;-1:-1:-1;;;;1618:217:210;;;-1:-1:-1;;;1618:217:210;-1:-1:-1;;;;;;1618:217:210;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1239:601:210:o;1566:1252:192:-;1679:4;1691:13;1707:8;:6;:8::i;:::-;1691:24;;1722;1749:31;1775:4;1749:25;:31::i;:::-;1816:14;;1722:58;;-1:-1:-1;1786:27:192;1869:17;:15;:17::i;:::-;1918:19;;1837:49;;-1:-1:-1;1892:23:192;1944:320;1968:19;1964:1;:23;1944:320;;;2002:14;2019:7;2027:1;2019:10;;;;;;;;:::i;:::-;;;;;;;2002:27;;2052:5;-1:-1:-1;;;;;2042:15:192;:6;-1:-1:-1;;;;;2042:15:192;;2038:51;;2076:4;2069:11;;;;;;;;;;;2038:51;2127:9;2122:136;2142:15;2138:1;:19;2122:136;;;2207:6;-1:-1:-1;;;;;2178:35:192;:25;2187:12;2200:1;2187:15;;;;;;;;:::i;:::-;;;;;;;2178:8;:25::i;:::-;-1:-1:-1;;;;;2178:35:192;;2174:76;;2234:5;2227:12;;;;;;;;;;;;2174:76;2159:3;;2122:136;;;-1:-1:-1;;1989:3:192;;1944:320;;;-1:-1:-1;;;;;;;;;;;;2308:44:192;2432:24;-1:-1:-1;;;;;;;;;;;2432:22:192;:24::i;:::-;2403:53;;2468:9;2463:332;2487:18;2483:1;:22;2463:332;;;2520:47;2570:2;2520:47;2603:21;:15;;;2622:1;2603:18;:21::i;:::-;-1:-1:-1;;;;;2570:62:192;;;;;;;;;;;;;;;;;-1:-1:-1;2570:62:192;2520:112;;;;;;;;;;;;;;;;-1:-1:-1;;;2520:112:192;;;;;;;;;;-1:-1:-1;;;2520:112:192;;;;;;;;;;;;2654:28;;-1:-1:-1;;;2654:28:192;;;;2520:112;;-1:-1:-1;2520:112:192;;2654:26;;:28;;;;;;;;;;;2520:112;2654:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2653:29;:97;;;;;2694:1;:13;;;-1:-1:-1;;;;;2694:24:192;;2719:9;2730:7;2739:10;2694:56;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2640:149;;;2776:4;2769:11;;;;;;;;;;;;;2640:149;-1:-1:-1;2507:3:192;;2463:332;;;-1:-1:-1;2808:5:192;;1566:1252;-1:-1:-1;;;;;;;;;;;1566:1252:192:o;3086:170:210:-;3148:29;3194:57;-1:-1:-1;;;;;;;;;;;3194:35:210;:48;;:55;:57::i;2339:743::-;2434:18;2460:21;2434:18;2460:21;-1:-1:-1;;;;;;;;;;;2653:37:210;-1:-1:-1;;;;;;;;;;;2678:11:210;2653:24;:37::i;:::-;2648:112;;2707:46;;-1:-1:-1;;;2707:46:210;;;;;;;;;;;2648:112;2766:15;2797:11;2766:43;;2815:19;2837:2;-1:-1:-1;;;;;2837:7:210;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2837:9:210;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2876:36:210;;;2852:13;2876:36;;;;;;;;;;;:48;2953:15;;-1:-1:-1;;;2953:15:210;;;;2815:31;;-1:-1:-1;2876:48:210;;;2852:13;;2953;;;;;:15;;;;;2852:13;;2953:15;;;;;;;;:13;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2953:15:210;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2987:36:210;;;;2974:10;2987:36;;;;;;;;-1:-1:-1;2987:36:210;;;;:48;3050:5;;3057;;2987:36;-1:-1:-1;;;;2987:48:210;;;;;-1:-1:-1;2339:743:210;;-1:-1:-1;;;2339:743:210:o;1844:491::-;-1:-1:-1;;;;;;;;;;;2008:37:210;-1:-1:-1;;;;;;;;;;;2033:11:210;2008:24;:37::i;:::-;2003:112;;2062:46;;-1:-1:-1;;;2062:46:210;;;;;;;;;;;2003:112;-1:-1:-1;;;;;2125:36:210;;:23;:36;;;;;;;;;;:48;-1:-1:-1;;;2125:48:210;;;;2121:119;;;2190:43;;-1:-1:-1;;;2190:43:210;;;;;;;;;;;2121:119;2246:35;:15;;;2269:11;2246:22;:35::i;:::-;-1:-1:-1;;;;;;2294:36:210;;;:23;:36;;;;;;;;;;;2287:43;;-1:-1:-1;;;;;;2287:43:210;;;1844:491::o;9970:126:242:-;10016:24;10055:36;434:66:243;10055:21:242;764:141:243;9493:473:242;9603:16;9718:38;;;-1:-1:-1;;;;;;;;;;;9718:38:242;;;;;9711:50;;9577:18;;9603:16;9577:18;;;;9718:38;9711:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9781:21;434:66:243;;764:141;9781:21:242;:38;;;;:30;;;;;:38;;;;;;;;:50;;;-1:-1:-1;;;;;;;;;;;9851:38:242;;;;;;9781:50;;;;;-1:-1:-1;9851:59:242;;:50;;:57;:59::i;:::-;9837:73;;9931:30;9954:6;9931:22;:30::i;:::-;9916:45;;9493:473;;;;;:::o;8871:165:449:-;-1:-1:-1;;;;;9004:23:449;;8951:4;4360:21;;;:14;;;:21;;;;;;:26;;8974:55;4264:129;8316:150;8386:4;8409:50;8414:3;-1:-1:-1;;;;;8434:23:449;;8409:4;:50::i;4548:533:192:-;4628:16;4652:14;294:66:224;4681:39:192;;;4760:28;;-1:-1:-1;;;4760:28:192;;-1:-1:-1;;;;;7656:32:516;;;4760:28:192;;;7638:51:516;4681:39:192;;;;-1:-1:-1;4681:39:192;;;;4760:22;;7611:18:516;;4760:28:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4760:28:192;;;;;;;;;;;;:::i;:::-;4824:20;;4727:61;;-1:-1:-1;4794:27:192;4892:23;4824:20;4914:1;4892:23;:::i;:::-;-1:-1:-1;;;;;4878:38:192;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4878:38:192;;4851:65;;4927:9;4922:94;4946:19;4942:1;:23;4922:94;;;4993:13;5007:1;4993:16;;;;;;;;:::i;:::-;;;;;;;4980:7;4988:1;4980:10;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4980:29:192;;;:10;;;;;;;;;;;:29;4967:3;;4922:94;;;;5052:4;5021:7;5029:19;5021:28;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5021:35:192;;;:28;;;;;;;;;;;:35;5069:7;4548:533;-1:-1:-1;;;;;4548:533:192:o;1228:128:195:-;1278:16;1309:42;377:66:196;1309:40:195;:42::i;22045:138:129:-;22111:7;22149:27;22168:7;22149:18;:27::i;9117:115:449:-;9180:7;9206:19;9214:3;4556:18;;4474:107;9574:156;9648:7;9698:22;9702:3;9714:5;9698:3;:22::i;10270:300::-;10333:16;10361:22;10386:19;10394:3;10386:7;:19::i;8634:156::-;8707:4;8730:53;8738:3;-1:-1:-1;;;;;8758:23:449;;8730:7;:53::i;5598:103:272:-;5654:15;5684:12;5692:3;5684:7;:12::i;10100:599:242:-;10208:39;10276:38;;;-1:-1:-1;;;;;;;;;;;10276:38:242;;;;;10179:21;;10208:39;10276:60;;:51;;:58;:60::i;:::-;-1:-1:-1;;;;;10250:92:242;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10250:92:242;;10208:134;;10361:9;10349:315;10386:38;;;;-1:-1:-1;;;;;;;;;;;10386:38:242;;;;;:60;;:51;;:58;:60::i;:::-;10382:1;:64;10349:315;;;10472:26;10501:56;;;-1:-1:-1;;;;;;;;;;;10501:56:242;;;;;:93;;:78;;10592:1;10501:90;:93::i;:::-;10472:122;;10638:18;10602:17;10620:1;10602:20;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10602:55:242;;;:20;;;;;;;;;;;:55;-1:-1:-1;10454:3:242;;10349:315;;;-1:-1:-1;10677:17:242;10100:599;-1:-1:-1;;10100:599:242:o;2241:406:449:-;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:449;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:449;2618:12;;7836:1501:129;7974:32;8050:29;;;:20;:29;;;;;;;300:66:131;;-1:-1:-1;;;8115:24:129;;:29;;8111:1172;;8236:6;8246:1;8236:11;8232:791;;8276:16;;8265:27;;8261:83;;8313:31;;-1:-1:-1;;;8313:31:129;;;;;;;;;;;8261:83;8831:182;-1:-1:-1;;8910:9:129;;;8889:31;;;;:20;;;:31;;;;;;8910:9;;8889:31;;-1:-1:-1;8948:25:129;;8831:182;8948:25;;8987:13;7836:1501;;;:::o;8111:1172::-;7966:1323;9301:31;;-1:-1:-1;;;9301:31:129;;;;;;;;;;;4923:118:449;4990:7;5016:3;:11;;5028:5;5016:18;;;;;;;;:::i;:::-;;;;;;;;;5009:25;;4923:118;;;;:::o;5581:109::-;5637:16;5672:3;:11;;5665:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5581:109;;;:::o;2815:1368::-;2881:4;3010:21;;;:14;;;:21;;;;;;3046:13;;3042:1135;;3413:18;3434:12;3445:1;3434:8;:12;:::i;:::-;3480:18;;3413:33;;-1:-1:-1;3460:17:449;;3480:22;;3501:1;;3480:22;:::i;:::-;3460:42;;3535:9;3521:10;:23;3517:378;;3564:17;3584:3;:11;;3596:9;3584:22;;;;;;;;:::i;:::-;;;;;;;;;3564:42;;3731:9;3705:3;:11;;3717:10;3705:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;3844:25;;;:14;;;:25;;;;;:36;;;3517:378;3973:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4076:3;:14;;:21;4091:5;4076:21;;;;;;;;;;;4069:28;;;4119:4;4112:11;;;;;;;3042:1135;4161:5;4154:12;;;;;3604:102:272;3660:15;3690:3;:11;;3683:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3604:102;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:516:-;-1:-1:-1;;;;;89:31:516;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;402:348::-;454:8;464:6;518:3;511:4;503:6;499:17;495:27;485:55;;536:1;533;526:12;485:55;-1:-1:-1;559:20:516;;-1:-1:-1;;;;;591:30:516;;588:50;;;634:1;631;624:12;588:50;671:4;663:6;659:17;647:29;;723:3;716:4;707:6;699;695:19;691:30;688:39;685:59;;;740:1;737;730:12;685:59;402:348;;;;;:::o;755:546::-;835:6;843;851;904:2;892:9;883:7;879:23;875:32;872:52;;;920:1;917;910:12;872:52;959:9;946:23;978:31;1003:5;978:31;:::i;:::-;1028:5;-1:-1:-1;1084:2:516;1069:18;;1056:32;-1:-1:-1;;;;;1100:30:516;;1097:50;;;1143:1;1140;1133:12;1097:50;1182:59;1233:7;1224:6;1213:9;1209:22;1182:59;:::i;:::-;755:546;;1260:8;;-1:-1:-1;1156:85:516;;-1:-1:-1;;;;755:546:516:o;1498:614::-;1587:6;1595;1603;1611;1664:2;1652:9;1643:7;1639:23;1635:32;1632:52;;;1680:1;1677;1670:12;1632:52;1716:9;1703:23;1693:33;;1776:2;1765:9;1761:18;1748:32;1789:31;1814:5;1789:31;:::i;:::-;1839:5;-1:-1:-1;1895:2:516;1880:18;;1867:32;-1:-1:-1;;;;;1911:30:516;;1908:50;;;1954:1;1951;1944:12;1908:50;1993:59;2044:7;2035:6;2024:9;2020:22;1993:59;:::i;:::-;1498:614;;;;-1:-1:-1;2071:8:516;-1:-1:-1;;;;1498:614:516:o;2117:250::-;2202:1;2212:113;2226:6;2223:1;2220:13;2212:113;;;2302:11;;;2296:18;2283:11;;;2276:39;2248:2;2241:10;2212:113;;;-1:-1:-1;;2359:1:516;2341:16;;2334:27;2117:250::o;2372:271::-;2414:3;2452:5;2446:12;2479:6;2474:3;2467:19;2495:76;2564:6;2557:4;2552:3;2548:14;2541:4;2534:5;2530:16;2495:76;:::i;:::-;2625:2;2604:15;-1:-1:-1;;2600:29:516;2591:39;;;;2632:4;2587:50;;2372:271;-1:-1:-1;;2372:271:516:o;2648:543::-;2702:3;2746:5;2740:12;2773:4;2768:3;2761:17;2799:47;2840:4;2835:3;2831:14;2817:12;2799:47;:::i;:::-;2787:59;;2924:1;2920;2915:3;2911:11;2907:19;2899:4;2892:5;2888:16;2882:23;2878:49;2871:4;2866:3;2862:14;2855:73;2976:4;2969:5;2965:16;2959:23;3024:3;3018:4;3014:14;3007:4;3002:3;2998:14;2991:38;3052:39;3086:4;3070:14;3052:39;:::i;:::-;3038:53;;;3154:4;3147:5;3143:16;3137:23;3130:31;3123:39;3116:4;3111:3;3107:14;3100:63;3179:6;3172:13;;;2648:543;;;;:::o;3196:855::-;3398:4;3427:2;3467;3456:9;3452:18;3497:2;3486:9;3479:21;3520:6;3555;3549:13;3586:6;3578;3571:22;3624:2;3613:9;3609:18;3602:25;;3686:2;3676:6;3673:1;3669:14;3658:9;3654:30;3650:39;3636:53;;3724:2;3716:6;3712:15;3745:1;3755:267;3769:6;3766:1;3763:13;3755:267;;;3862:2;3858:7;3846:9;3838:6;3834:22;3830:36;3825:3;3818:49;3890:52;3935:6;3926;3920:13;3890:52;:::i;:::-;3880:62;-1:-1:-1;4000:12:516;;;;3965:15;;;;3791:1;3784:9;3755:267;;;-1:-1:-1;4039:6:516;;3196:855;-1:-1:-1;;;;;;;3196:855:516:o;4056:127::-;4117:10;4112:3;4108:20;4105:1;4098:31;4148:4;4145:1;4138:15;4172:4;4169:1;4162:15;4188:275;4259:2;4253:9;4324:2;4305:13;;-1:-1:-1;;4301:27:516;4289:40;;-1:-1:-1;;;;;4344:34:516;;4380:22;;;4341:62;4338:88;;;4406:18;;:::i;:::-;4442:2;4435:22;4188:275;;-1:-1:-1;4188:275:516:o;4468:183::-;4528:4;-1:-1:-1;;;;;4553:6:516;4550:30;4547:56;;;4583:18;;:::i;:::-;-1:-1:-1;4628:1:516;4624:14;4640:4;4620:25;;4468:183::o;4656:966::-;4740:6;4771:2;4814;4802:9;4793:7;4789:23;4785:32;4782:52;;;4830:1;4827;4820:12;4782:52;4870:9;4857:23;-1:-1:-1;;;;;4895:6:516;4892:30;4889:50;;;4935:1;4932;4925:12;4889:50;4958:22;;5011:4;5003:13;;4999:27;-1:-1:-1;4989:55:516;;5040:1;5037;5030:12;4989:55;5076:2;5063:16;5099:60;5115:43;5155:2;5115:43;:::i;:::-;5099:60;:::i;:::-;5193:15;;;5275:1;5271:10;;;;5263:19;;5259:28;;;5224:12;;;;5299:19;;;5296:39;;;5331:1;5328;5321:12;5296:39;5355:11;;;;5375:217;5391:6;5386:3;5383:15;5375:217;;;5471:3;5458:17;5488:31;5513:5;5488:31;:::i;:::-;5532:18;;5408:12;;;;5570;;;;5375:217;;;5611:5;4656:966;-1:-1:-1;;;;;;;4656:966:516:o;5627:411::-;5698:6;5706;5759:2;5747:9;5738:7;5734:23;5730:32;5727:52;;;5775:1;5772;5765:12;5727:52;5815:9;5802:23;-1:-1:-1;;;;;5840:6:516;5837:30;5834:50;;;5880:1;5877;5870:12;5834:50;5919:59;5970:7;5961:6;5950:9;5946:22;5919:59;:::i;:::-;5997:8;;5893:85;;-1:-1:-1;5627:411:516;-1:-1:-1;;;;5627:411:516:o;6043:1167::-;6253:4;6282:2;6322;6311:9;6307:18;6352:2;6341:9;6334:21;6375:6;6410;6404:13;6441:6;6433;6426:22;6467:2;6457:12;;6500:2;6489:9;6485:18;6478:25;;6562:2;6552:6;6549:1;6545:14;6534:9;6530:30;6526:39;6600:2;6592:6;6588:15;6621:1;6631:550;6645:6;6642:1;6639:13;6631:550;;;6710:22;;;-1:-1:-1;;6706:36:516;6694:49;;6766:13;;6812:9;;6834:18;;;6879:48;6911:15;;;6812:9;6879:48;:::i;:::-;6968:11;;;6962:18;7017:19;;;7000:15;;;6993:44;6962:18;6865:62;-1:-1:-1;7060:41:516;6865:62;6962:18;7060:41;:::i;:::-;7159:12;;;;7050:51;-1:-1:-1;;;7124:15:516;;;;6667:1;6660:9;6631:550;;;-1:-1:-1;7198:6:516;;6043:1167;-1:-1:-1;;;;;;;;6043:1167:516:o;7215:272::-;7404:2;7393:9;7386:21;7367:4;7424:57;7477:2;7466:9;7462:18;7454:6;7424:57;:::i;7700:127::-;7761:10;7756:3;7752:20;7749:1;7742:31;7792:4;7789:1;7782:15;7816:4;7813:1;7806:15;7832:127;7893:10;7888:3;7884:20;7881:1;7874:31;7924:4;7921:1;7914:15;7948:4;7945:1;7938:15;7964:125;8029:9;;;8050:10;;;8047:36;;;8063:18;;:::i;8094:277::-;8161:6;8214:2;8202:9;8193:7;8189:23;8185:32;8182:52;;;8230:1;8227;8220:12;8182:52;8262:9;8256:16;8315:5;8308:13;8301:21;8294:5;8291:32;8281:60;;8337:1;8334;8327:12;8376:391;8452:5;-1:-1:-1;;;;;8478:6:516;8475:30;8472:56;;;8508:18;;:::i;:::-;8546:57;8591:2;8570:15;;-1:-1:-1;;8566:29:516;8597:4;8562:40;8546:57;:::i;:::-;8537:66;;8626:6;8619:5;8612:21;8666:3;8657:6;8652:3;8648:16;8645:25;8642:45;;;8683:1;8680;8673:12;8642:45;8696:65;8754:6;8747:4;8740:5;8736:16;8731:3;8696:65;:::i;8772:459::-;8852:6;8905:2;8893:9;8884:7;8880:23;8876:32;8873:52;;;8921:1;8918;8911:12;8873:52;8954:9;8948:16;-1:-1:-1;;;;;8979:6:516;8976:30;8973:50;;;9019:1;9016;9009:12;8973:50;9042:22;;9095:4;9087:13;;9083:27;-1:-1:-1;9073:55:516;;9124:1;9121;9114:12;9073:55;9147:78;9217:7;9212:2;9206:9;9201:2;9197;9193:11;9147:78;:::i;:::-;9137:88;8772:459;-1:-1:-1;;;;8772:459:516:o;9881:135::-;9920:3;9941:17;;;9938:43;;9961:18;;:::i;:::-;-1:-1:-1;10008:1:516;9997:13;;9881:135::o;10021:251::-;10091:6;10144:2;10132:9;10123:7;10119:23;10115:32;10112:52;;;10160:1;10157;10150:12;10112:52;10192:9;10186:16;10211:31;10236:5;10211:31;:::i;10277:273::-;10462:6;10454;10449:3;10436:33;10418:3;10488:16;;10513:13;;;10488:16;10277:273;-1:-1:-1;10277:273:516:o;10555:297::-;10673:12;;10720:4;10709:16;;;10703:23;;10673:12;10738:16;;10735:111;;;-1:-1:-1;;10812:4:516;10808:17;;;;10805:1;10801:25;10797:38;10786:50;;10555:297;-1:-1:-1;10555:297:516:o;11064:801::-;11262:4;11310:2;11299:9;11295:18;11340:6;11329:9;11322:25;11366:2;11404;11399;11388:9;11384:18;11377:30;11427:6;11462;11456:13;11493:6;11485;11478:22;11531:3;11520:9;11516:19;11509:26;;11570:2;11562:6;11558:15;11544:29;;11591:1;11601:195;11615:6;11612:1;11609:13;11601:195;;;11680:13;;-1:-1:-1;;;;;11676:39:516;11664:52;;11771:15;;;;11736:12;;;;11712:1;11630:9;11601:195;;;11605:3;;11813;11805:11;;;;;11852:6;11847:2;11836:9;11832:18;11825:34;11064:801;;;;;;:::o;11870:380::-;11949:1;11945:12;;;;11992;;;12013:61;;12067:4;12059:6;12055:17;12045:27;;12013:61;12120:2;12112:6;12109:14;12089:18;12086:38;12083:161;;12166:10;12161:3;12157:20;12154:1;12147:31;12201:4;12198:1;12191:15;12229:4;12226:1;12219:15;12255:956;12350:6;12381:2;12424;12412:9;12403:7;12399:23;12395:32;12392:52;;;12440:1;12437;12430:12;12392:52;12473:9;12467:16;-1:-1:-1;;;;;12498:6:516;12495:30;12492:50;;;12538:1;12535;12528:12;12492:50;12561:22;;12614:4;12606:13;;12602:27;-1:-1:-1;12592:55:516;;12643:1;12640;12633:12;12592:55;12672:2;12666:9;12695:60;12711:43;12751:2;12711:43;:::i;12695:60::-;12789:15;;;12871:1;12867:10;;;;12859:19;;12855:28;;;12820:12;;;;12895:19;;;12892:39;;;12927:1;12924;12917:12;12892:39;12951:11;;;;12971:210;12987:6;12982:3;12979:15;12971:210;;;13060:3;13054:10;13077:31;13102:5;13077:31;:::i;:::-;13121:18;;13004:12;;;;13159;;;;12971:210;;13216:128;13283:9;;;13304:11;;;13301:37;;;13318:18;;:::i;13349:127::-;13410:10;13405:3;13401:20;13398:1;13391:31;13441:4;13438:1;13431:15;13465:4;13462:1;13455:15","linkReferences":{}},"methodIdentifiers":{"addEntitlementModule(address)":"070b9c3f","addImmutableEntitlements(address[])":"8bfc820f","getEntitlement(address)":"fba4ff9d","getEntitlementDataByPermission(string)":"db0a69a8","getEntitlements()":"487dc38c","isEntitledToChannel(bytes32,address,string)":"367287e3","isEntitledToSpace(address,string)":"20759f9e","removeEntitlementModule(address)":"be24138d"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ApprovalCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BalanceQueryForZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__AlreadyBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Banning__CannotBanSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__NotBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC5643__DurationZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC5643__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC5643__NotApprovedOrOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC5643__SubscriptionNotRenewable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__ValueAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementsService__EntitlementAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementsService__EntitlementDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementsService__ImmutableEntitlement\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementsService__InvalidEntitlementAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementsService__InvalidEntitlementInterface\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintERC2309QuantityExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintZeroQuantity\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnershipNotInitializedForExtraData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__Paused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__EntitlementAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__EntitlementDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__InvalidEntitlementAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__InvalidPermission\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__PermissionAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__PermissionDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__RoleDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFromIncorrectOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC721ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"URIQueryForNonexistentToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"toTokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"ConsecutiveTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"entitlement\",\"type\":\"address\"}],\"name\":\"EntitlementModuleAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"entitlement\",\"type\":\"address\"}],\"name\":\"EntitlementModuleRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"RoleCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remover\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"RoleRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"updater\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"RoleUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"expiration\",\"type\":\"uint64\"}],\"name\":\"SubscriptionUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Unbanned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"entitlement\",\"type\":\"address\"}],\"name\":\"addEntitlementModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"entitlements\",\"type\":\"address[]\"}],\"name\":\"addImmutableEntitlements\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"entitlement\",\"type\":\"address\"}],\"name\":\"getEntitlement\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"moduleAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"moduleType\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isImmutable\",\"type\":\"bool\"}],\"internalType\":\"struct IEntitlementsManagerBase.Entitlement\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"permission\",\"type\":\"string\"}],\"name\":\"getEntitlementDataByPermission\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"entitlementType\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"entitlementData\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntitlementsManager.EntitlementData[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEntitlements\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"moduleAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"moduleType\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isImmutable\",\"type\":\"bool\"}],\"internalType\":\"struct IEntitlementsManagerBase.Entitlement[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"permission\",\"type\":\"string\"}],\"name\":\"isEntitledToChannel\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"permission\",\"type\":\"string\"}],\"name\":\"isEntitledToSpace\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"entitlement\",\"type\":\"address\"}],\"name\":\"removeEntitlementModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"ConsecutiveTransfer(uint256,uint256,address,address)\":{\"details\":\"Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, as defined in the [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. See {_mintERC2309} for more details.\"},\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"},\"SubscriptionUpdate(uint256,uint64)\":{\"details\":\"When a subscription is canceled, the expiration value should also be 0.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"addEntitlementModule(address)\":{\"params\":{\"entitlement\":\"The entitlement to add\"}},\"addImmutableEntitlements(address[])\":{\"params\":{\"entitlements\":\"The entitlements to add\"}},\"getEntitlement(address)\":{\"params\":{\"entitlement\":\"The entitlement to get\"},\"returns\":{\"_0\":\"The entitlement module address\"}},\"getEntitlements()\":{\"returns\":{\"_0\":\"The entitlement modules\"}},\"isEntitledToChannel(bytes32,address,string)\":{\"params\":{\"channelId\":\"The channel to check\",\"permission\":\"The permission to check\",\"user\":\"The user to check\"},\"returns\":{\"_0\":\"True if the user is entitled to the permission, false otherwise\"}},\"isEntitledToSpace(address,string)\":{\"params\":{\"permission\":\"The permission to check\",\"user\":\"The user to check\"},\"returns\":{\"_0\":\"True if the user is entitled to the permission, false otherwise\"}},\"removeEntitlementModule(address)\":{\"params\":{\"entitlement\":\"The entitlement to remove\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ApprovalCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"ApprovalQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"BalanceQueryForZeroAddress()\":[{\"notice\":\"Cannot query the balance for the zero address.\"}],\"MintERC2309QuantityExceedsLimit()\":[{\"notice\":\"The `quantity` minted with ERC2309 exceeds the safety limit.\"}],\"MintToZeroAddress()\":[{\"notice\":\"Cannot mint to the zero address.\"}],\"MintZeroQuantity()\":[{\"notice\":\"The quantity of tokens minted must be more than zero.\"}],\"OwnerQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"OwnershipNotInitializedForExtraData()\":[{\"notice\":\"The `extraData` cannot be set on an unintialized ownership slot.\"}],\"TransferCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"TransferFromIncorrectOwner()\":[{\"notice\":\"The token must be owned by `from`.\"}],\"TransferToNonERC721ReceiverImplementer()\":[{\"notice\":\"Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"notice\":\"Cannot transfer to the zero address.\"}],\"URIQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}]},\"events\":{\"SubscriptionUpdate(uint256,uint64)\":{\"notice\":\"Emitted when a subscription expiration changes\"}},\"kind\":\"user\",\"methods\":{\"addEntitlementModule(address)\":{\"notice\":\"Adds an entitlement to the space\"},\"addImmutableEntitlements(address[])\":{\"notice\":\"Allows the space owner to add immutable entitlements to the space\"},\"getEntitlement(address)\":{\"notice\":\"Gets an entitlement from the space\"},\"getEntitlements()\":{\"notice\":\"Gets all entitlements from the space\"},\"isEntitledToChannel(bytes32,address,string)\":{\"notice\":\"Checks if a user is entitled to a permission in a channel\"},\"isEntitledToSpace(address,string)\":{\"notice\":\"Checks if a user is entitled to a permission in the space\"},\"removeEntitlementModule(address)\":{\"notice\":\"Removes an entitlement from the space\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/facets/entitlements/EntitlementsManager.sol\":\"EntitlementsManager\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol\":{\"keccak256\":\"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f\",\"dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol\":{\"keccak256\":\"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5\",\"dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol\":{\"keccak256\":\"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc\",\"dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf\"]},\"contracts/src/diamond/facets/pausable/IPausable.sol\":{\"keccak256\":\"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6\",\"dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM\"]},\"contracts/src/diamond/facets/pausable/PausableBase.sol\":{\"keccak256\":\"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c\",\"dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1\"]},\"contracts/src/diamond/facets/pausable/PausableStorage.sol\":{\"keccak256\":\"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b\",\"dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL\"]},\"contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol\":{\"keccak256\":\"0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714\",\"dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8\"]},\"contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol\":{\"keccak256\":\"0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7\",\"dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7\"]},\"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol\":{\"keccak256\":\"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f\",\"dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol\":{\"keccak256\":\"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa\",\"dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol\":{\"keccak256\":\"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c\",\"dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu\"]},\"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol\":{\"keccak256\":\"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e\",\"dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM\"]},\"contracts/src/factory/facets/wallet-link/IWalletLink.sol\":{\"keccak256\":\"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13\",\"dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR\"]},\"contracts/src/spaces/entitlements/IEntitlement.sol\":{\"keccak256\":\"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3\",\"dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf\"]},\"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol\":{\"keccak256\":\"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1\",\"dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97\"]},\"contracts/src/spaces/entitlements/user/IUserEntitlement.sol\":{\"keccak256\":\"0x96fef5ebaa7e9e79c77c887d9053ae06dc91cf1301f33db652e6ac811b3b5cc5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6cff649b95f65c9e3ecfa7dfa3b1c7b524ec7244eb5223c55674a4679eb8e7bf\",\"dweb:/ipfs/QmQy5sXRywRWB3aM58TCp5Xw5b258Y5PfDM8RasDznAPzA\"]},\"contracts/src/spaces/facets/Entitled.sol\":{\"keccak256\":\"0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7\",\"dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc\"]},\"contracts/src/spaces/facets/banning/BanningBase.sol\":{\"keccak256\":\"0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d\",\"dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN\"]},\"contracts/src/spaces/facets/banning/BanningStorage.sol\":{\"keccak256\":\"0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0\",\"dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1\"]},\"contracts/src/spaces/facets/banning/IBanning.sol\":{\"keccak256\":\"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419\",\"dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6\"]},\"contracts/src/spaces/facets/channels/ChannelService.sol\":{\"keccak256\":\"0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9\",\"dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi\"]},\"contracts/src/spaces/facets/channels/ChannelStorage.sol\":{\"keccak256\":\"0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7\",\"dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS\"]},\"contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol\":{\"keccak256\":\"0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5\",\"dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9\"]},\"contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol\":{\"keccak256\":\"0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07\",\"dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek\"]},\"contracts/src/spaces/facets/entitlements/EntitlementsManager.sol\":{\"keccak256\":\"0x5121b9ebb57a7c98594a52360044b5a5105d3ffbc86d717e25f8e5957f6b221a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dd65322faa757c44c93eeb7dd68fc208d11b4a2068d8c1241d657d447d98be92\",\"dweb:/ipfs/Qmeu61gEnz8o26AwnpWnTKhoM2mBDygyimYpbuSjDbsDyb\"]},\"contracts/src/spaces/facets/entitlements/EntitlementsManagerBase.sol\":{\"keccak256\":\"0x043ba820a71407d23bb2f14f4809f8c6024c90de44e403130a0e3c2998b53cd6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a161f6aea0bf6796f5b87abe51192796fe4926515ffa927aa3bd3c01d657b951\",\"dweb:/ipfs/QmTZF7rCKaCQ4YRdGSsm1f6T8HCSX2KPzcEFqpvkF3riMi\"]},\"contracts/src/spaces/facets/entitlements/EntitlementsManagerService.sol\":{\"keccak256\":\"0x6f40f5b41ad702ea55bf10f987b3e2b6d02ac527a66be523f06f025cead1867d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://da2012c616b833c5b491735c230be707e4f9b7657b3a71d7bdf52e7c2ba128b9\",\"dweb:/ipfs/Qme4864V46rozVDRWtfYqtpyzE1SzBnqYQQf3iD2rrqiPg\"]},\"contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol\":{\"keccak256\":\"0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583\",\"dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK\"]},\"contracts/src/spaces/facets/entitlements/IEntitlementsManager.sol\":{\"keccak256\":\"0x1c3cff6f7a35610df492abc39a62ba704e408d43477ba2e34833197c2956e9d3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c5d5f08c5bc196e6166678b39d415da12c285d9bee3584d5e200bbf0c5ea911d\",\"dweb:/ipfs/QmdYkU6kzHFw7KFYAdvxiwHK7hWCrz3E3pwiCjWZ97PVGx\"]},\"contracts/src/spaces/facets/membership/MembershipStorage.sol\":{\"keccak256\":\"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee\",\"dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5\"]},\"contracts/src/spaces/facets/roles/IRoles.sol\":{\"keccak256\":\"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8\",\"dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N\"]},\"contracts/src/spaces/facets/roles/RolesBase.sol\":{\"keccak256\":\"0x2ef137dec4a5390009fd931e34fdbb4a742c96b68b40f5c152cec8cf2809ed6f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3cb29b4a780742a30ba3af5719f77a4a65ea55ebbdc3ccd9c93c86573f20c7df\",\"dweb:/ipfs/QmdvPJydLCcEwCB3xk5VpET8X2GfrxC3NBUD5G6C8a9aW8\"]},\"contracts/src/spaces/facets/roles/RolesStorage.sol\":{\"keccak256\":\"0x40f288a613e35cbc02aceb1d23f89af888f65538853f61cc1fcd25901b9bc4af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://396b5e157c9a29adc94edc5d234f416a44e6e7c4588b1aaa0587bb04018705e9\",\"dweb:/ipfs/QmWDCQz555WbvZw7XxfkybE5dPfouc6rKxU5Zu1Gsuz1Zr\"]},\"contracts/src/utils/StringSet.sol\":{\"keccak256\":\"0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6\",\"dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK\"]},\"contracts/src/utils/Validator.sol\":{\"keccak256\":\"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64\",\"dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72\"]},\"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"ApprovalCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"ApprovalQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"BalanceQueryForZeroAddress"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__AlreadyBanned"},{"inputs":[],"type":"error","name":"Banning__CannotBanSelf"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__InvalidTokenId"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__NotBanned"},{"inputs":[],"type":"error","name":"ERC5643__DurationZero"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC5643__InvalidTokenId"},{"inputs":[],"type":"error","name":"ERC5643__NotApprovedOrOwner"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC5643__SubscriptionNotRenewable"},{"inputs":[],"type":"error","name":"Entitlement__InvalidValue"},{"inputs":[],"type":"error","name":"Entitlement__NotAllowed"},{"inputs":[],"type":"error","name":"Entitlement__NotMember"},{"inputs":[],"type":"error","name":"Entitlement__ValueAlreadyExists"},{"inputs":[],"type":"error","name":"EntitlementsService__EntitlementAlreadyExists"},{"inputs":[],"type":"error","name":"EntitlementsService__EntitlementDoesNotExist"},{"inputs":[],"type":"error","name":"EntitlementsService__ImmutableEntitlement"},{"inputs":[],"type":"error","name":"EntitlementsService__InvalidEntitlementAddress"},{"inputs":[],"type":"error","name":"EntitlementsService__InvalidEntitlementInterface"},{"inputs":[],"type":"error","name":"MintERC2309QuantityExceedsLimit"},{"inputs":[],"type":"error","name":"MintToZeroAddress"},{"inputs":[],"type":"error","name":"MintZeroQuantity"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[],"type":"error","name":"OwnerQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"OwnershipNotInitializedForExtraData"},{"inputs":[],"type":"error","name":"Pausable__NotPaused"},{"inputs":[],"type":"error","name":"Pausable__Paused"},{"inputs":[],"type":"error","name":"Roles__EntitlementAlreadyExists"},{"inputs":[],"type":"error","name":"Roles__EntitlementDoesNotExist"},{"inputs":[],"type":"error","name":"Roles__InvalidEntitlementAddress"},{"inputs":[],"type":"error","name":"Roles__InvalidPermission"},{"inputs":[],"type":"error","name":"Roles__PermissionAlreadyExists"},{"inputs":[],"type":"error","name":"Roles__PermissionDoesNotExist"},{"inputs":[],"type":"error","name":"Roles__RoleDoesNotExist"},{"inputs":[],"type":"error","name":"TransferCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"TransferFromIncorrectOwner"},{"inputs":[],"type":"error","name":"TransferToNonERC721ReceiverImplementer"},{"inputs":[],"type":"error","name":"TransferToZeroAddress"},{"inputs":[],"type":"error","name":"URIQueryForNonexistentToken"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"approved","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bool","name":"approved","type":"bool","indexed":false}],"type":"event","name":"ApprovalForAll","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Banned","anonymous":false},{"inputs":[{"internalType":"uint256","name":"fromTokenId","type":"uint256","indexed":true},{"internalType":"uint256","name":"toTokenId","type":"uint256","indexed":false},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true}],"type":"event","name":"ConsecutiveTransfer","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"address","name":"entitlement","type":"address","indexed":false}],"type":"event","name":"EntitlementModuleAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"address","name":"entitlement","type":"address","indexed":false}],"type":"event","name":"EntitlementModuleRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"address","name":"creator","type":"address","indexed":true},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":true}],"type":"event","name":"RoleCreated","anonymous":false},{"inputs":[{"internalType":"address","name":"remover","type":"address","indexed":true},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":true}],"type":"event","name":"RoleRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"updater","type":"address","indexed":true},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":true}],"type":"event","name":"RoleUpdated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true},{"internalType":"uint64","name":"expiration","type":"uint64","indexed":false}],"type":"event","name":"SubscriptionUpdate","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Unbanned","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[{"internalType":"address","name":"entitlement","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"addEntitlementModule"},{"inputs":[{"internalType":"address[]","name":"entitlements","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"addImmutableEntitlements"},{"inputs":[{"internalType":"address","name":"entitlement","type":"address"}],"stateMutability":"view","type":"function","name":"getEntitlement","outputs":[{"internalType":"struct IEntitlementsManagerBase.Entitlement","name":"","type":"tuple","components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"moduleAddress","type":"address"},{"internalType":"string","name":"moduleType","type":"string"},{"internalType":"bool","name":"isImmutable","type":"bool"}]}]},{"inputs":[{"internalType":"string","name":"permission","type":"string"}],"stateMutability":"view","type":"function","name":"getEntitlementDataByPermission","outputs":[{"internalType":"struct IEntitlementsManager.EntitlementData[]","name":"","type":"tuple[]","components":[{"internalType":"string","name":"entitlementType","type":"string"},{"internalType":"bytes","name":"entitlementData","type":"bytes"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getEntitlements","outputs":[{"internalType":"struct IEntitlementsManagerBase.Entitlement[]","name":"","type":"tuple[]","components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"moduleAddress","type":"address"},{"internalType":"string","name":"moduleType","type":"string"},{"internalType":"bool","name":"isImmutable","type":"bool"}]}]},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"},{"internalType":"address","name":"user","type":"address"},{"internalType":"string","name":"permission","type":"string"}],"stateMutability":"view","type":"function","name":"isEntitledToChannel","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"string","name":"permission","type":"string"}],"stateMutability":"view","type":"function","name":"isEntitledToSpace","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"entitlement","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeEntitlementModule"}],"devdoc":{"kind":"dev","methods":{"addEntitlementModule(address)":{"params":{"entitlement":"The entitlement to add"}},"addImmutableEntitlements(address[])":{"params":{"entitlements":"The entitlements to add"}},"getEntitlement(address)":{"params":{"entitlement":"The entitlement to get"},"returns":{"_0":"The entitlement module address"}},"getEntitlements()":{"returns":{"_0":"The entitlement modules"}},"isEntitledToChannel(bytes32,address,string)":{"params":{"channelId":"The channel to check","permission":"The permission to check","user":"The user to check"},"returns":{"_0":"True if the user is entitled to the permission, false otherwise"}},"isEntitledToSpace(address,string)":{"params":{"permission":"The permission to check","user":"The user to check"},"returns":{"_0":"True if the user is entitled to the permission, false otherwise"}},"removeEntitlementModule(address)":{"params":{"entitlement":"The entitlement to remove"}}},"version":1},"userdoc":{"kind":"user","methods":{"addEntitlementModule(address)":{"notice":"Adds an entitlement to the space"},"addImmutableEntitlements(address[])":{"notice":"Allows the space owner to add immutable entitlements to the space"},"getEntitlement(address)":{"notice":"Gets an entitlement from the space"},"getEntitlements()":{"notice":"Gets all entitlements from the space"},"isEntitledToChannel(bytes32,address,string)":{"notice":"Checks if a user is entitled to a permission in a channel"},"isEntitledToSpace(address,string)":{"notice":"Checks if a user is entitled to a permission in the space"},"removeEntitlementModule(address)":{"notice":"Removes an entitlement from the space"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/facets/entitlements/EntitlementsManager.sol":"EntitlementsManager"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol":{"keccak256":"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d","urls":["bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f","dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol":{"keccak256":"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a","urls":["bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5","dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol":{"keccak256":"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0","urls":["bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc","dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/IPausable.sol":{"keccak256":"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261","urls":["bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6","dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableBase.sol":{"keccak256":"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438","urls":["bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c","dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableStorage.sol":{"keccak256":"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07","urls":["bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b","dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol":{"keccak256":"0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3","urls":["bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714","dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol":{"keccak256":"0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e","urls":["bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7","dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol":{"keccak256":"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218","urls":["bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f","dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol":{"keccak256":"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334","urls":["bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa","dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol":{"keccak256":"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1","urls":["bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c","dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9","urls":["bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e","dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM"],"license":"Apache-2.0"},"contracts/src/factory/facets/wallet-link/IWalletLink.sol":{"keccak256":"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b","urls":["bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13","dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/IEntitlement.sol":{"keccak256":"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca","urls":["bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3","dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol":{"keccak256":"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf","urls":["bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1","dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97"],"license":"MIT"},"contracts/src/spaces/entitlements/user/IUserEntitlement.sol":{"keccak256":"0x96fef5ebaa7e9e79c77c887d9053ae06dc91cf1301f33db652e6ac811b3b5cc5","urls":["bzz-raw://6cff649b95f65c9e3ecfa7dfa3b1c7b524ec7244eb5223c55674a4679eb8e7bf","dweb:/ipfs/QmQy5sXRywRWB3aM58TCp5Xw5b258Y5PfDM8RasDznAPzA"],"license":"Apache-2.0"},"contracts/src/spaces/facets/Entitled.sol":{"keccak256":"0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c","urls":["bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7","dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/BanningBase.sol":{"keccak256":"0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270","urls":["bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d","dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/BanningStorage.sol":{"keccak256":"0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492","urls":["bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0","dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/IBanning.sol":{"keccak256":"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505","urls":["bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419","dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/ChannelService.sol":{"keccak256":"0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7","urls":["bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9","dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/ChannelStorage.sol":{"keccak256":"0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f","urls":["bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7","dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS"],"license":"Apache-2.0"},"contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol":{"keccak256":"0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2","urls":["bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5","dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9"],"license":"Apache-2.0"},"contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol":{"keccak256":"0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef","urls":["bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07","dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/EntitlementsManager.sol":{"keccak256":"0x5121b9ebb57a7c98594a52360044b5a5105d3ffbc86d717e25f8e5957f6b221a","urls":["bzz-raw://dd65322faa757c44c93eeb7dd68fc208d11b4a2068d8c1241d657d447d98be92","dweb:/ipfs/Qmeu61gEnz8o26AwnpWnTKhoM2mBDygyimYpbuSjDbsDyb"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/EntitlementsManagerBase.sol":{"keccak256":"0x043ba820a71407d23bb2f14f4809f8c6024c90de44e403130a0e3c2998b53cd6","urls":["bzz-raw://a161f6aea0bf6796f5b87abe51192796fe4926515ffa927aa3bd3c01d657b951","dweb:/ipfs/QmTZF7rCKaCQ4YRdGSsm1f6T8HCSX2KPzcEFqpvkF3riMi"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/EntitlementsManagerService.sol":{"keccak256":"0x6f40f5b41ad702ea55bf10f987b3e2b6d02ac527a66be523f06f025cead1867d","urls":["bzz-raw://da2012c616b833c5b491735c230be707e4f9b7657b3a71d7bdf52e7c2ba128b9","dweb:/ipfs/Qme4864V46rozVDRWtfYqtpyzE1SzBnqYQQf3iD2rrqiPg"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol":{"keccak256":"0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8","urls":["bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583","dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/IEntitlementsManager.sol":{"keccak256":"0x1c3cff6f7a35610df492abc39a62ba704e408d43477ba2e34833197c2956e9d3","urls":["bzz-raw://c5d5f08c5bc196e6166678b39d415da12c285d9bee3584d5e200bbf0c5ea911d","dweb:/ipfs/QmdYkU6kzHFw7KFYAdvxiwHK7hWCrz3E3pwiCjWZ97PVGx"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/MembershipStorage.sol":{"keccak256":"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3","urls":["bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee","dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/IRoles.sol":{"keccak256":"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d","urls":["bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8","dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/RolesBase.sol":{"keccak256":"0x2ef137dec4a5390009fd931e34fdbb4a742c96b68b40f5c152cec8cf2809ed6f","urls":["bzz-raw://3cb29b4a780742a30ba3af5719f77a4a65ea55ebbdc3ccd9c93c86573f20c7df","dweb:/ipfs/QmdvPJydLCcEwCB3xk5VpET8X2GfrxC3NBUD5G6C8a9aW8"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/RolesStorage.sol":{"keccak256":"0x40f288a613e35cbc02aceb1d23f89af888f65538853f61cc1fcd25901b9bc4af","urls":["bzz-raw://396b5e157c9a29adc94edc5d234f416a44e6e7c4588b1aaa0587bb04018705e9","dweb:/ipfs/QmWDCQz555WbvZw7XxfkybE5dPfouc6rKxU5Zu1Gsuz1Zr"],"license":"Apache-2.0"},"contracts/src/utils/StringSet.sol":{"keccak256":"0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319","urls":["bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6","dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK"],"license":"Apache-2.0"},"contracts/src/utils/Validator.sol":{"keccak256":"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50","urls":["bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64","dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"keccak256":"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4","urls":["bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7","dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":208} \ No newline at end of file diff --git a/packages/generated/dev/abis/EntitlementsManager.metadata.json b/packages/generated/dev/abis/EntitlementsManager.metadata.json new file mode 100644 index 000000000..513be091f --- /dev/null +++ b/packages/generated/dev/abis/EntitlementsManager.metadata.json @@ -0,0 +1,1178 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "ApprovalQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "BalanceQueryForZeroAddress" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__AlreadyBanned" + }, + { + "inputs": [], + "type": "error", + "name": "Banning__CannotBanSelf" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__InvalidTokenId" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__NotBanned" + }, + { + "inputs": [], + "type": "error", + "name": "ERC5643__DurationZero" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC5643__InvalidTokenId" + }, + { + "inputs": [], + "type": "error", + "name": "ERC5643__NotApprovedOrOwner" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__InvalidValue" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotAllowed" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotMember" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__ValueAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementsService__EntitlementAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementsService__EntitlementDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementsService__ImmutableEntitlement" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementsService__InvalidEntitlementAddress" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementsService__InvalidEntitlementInterface" + }, + { + "inputs": [], + "type": "error", + "name": "MintERC2309QuantityExceedsLimit" + }, + { + "inputs": [], + "type": "error", + "name": "MintToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "MintZeroQuantity" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "OwnerQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "OwnershipNotInitializedForExtraData" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__NotPaused" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__Paused" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__EntitlementAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__EntitlementDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__InvalidEntitlementAddress" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__InvalidPermission" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__PermissionAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__PermissionDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__RoleDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "TransferCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "TransferFromIncorrectOwner" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "URIQueryForNonexistentToken" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "approved", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Approval", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "operator", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ApprovalForAll", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Banned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fromTokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint256", + "name": "toTokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConsecutiveTransfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "entitlement", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "EntitlementModuleAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "entitlement", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "EntitlementModuleRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Paused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "creator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RoleCreated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "remover", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RoleRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "updater", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RoleUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint64", + "name": "expiration", + "type": "uint64", + "indexed": false + } + ], + "type": "event", + "name": "SubscriptionUpdate", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Transfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Unbanned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Unpaused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "entitlement", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "addEntitlementModule" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "entitlements", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "addImmutableEntitlements" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "entitlement", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getEntitlement", + "outputs": [ + { + "internalType": "struct IEntitlementsManagerBase.Entitlement", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "address", + "name": "moduleAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "moduleType", + "type": "string" + }, + { + "internalType": "bool", + "name": "isImmutable", + "type": "bool" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "string", + "name": "permission", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getEntitlementDataByPermission", + "outputs": [ + { + "internalType": "struct IEntitlementsManager.EntitlementData[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "string", + "name": "entitlementType", + "type": "string" + }, + { + "internalType": "bytes", + "name": "entitlementData", + "type": "bytes" + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getEntitlements", + "outputs": [ + { + "internalType": "struct IEntitlementsManagerBase.Entitlement[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "address", + "name": "moduleAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "moduleType", + "type": "string" + }, + { + "internalType": "bool", + "name": "isImmutable", + "type": "bool" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "string", + "name": "permission", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isEntitledToChannel", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "string", + "name": "permission", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isEntitledToSpace", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "entitlement", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeEntitlementModule" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "addEntitlementModule(address)": { + "params": { + "entitlement": "The entitlement to add" + } + }, + "addImmutableEntitlements(address[])": { + "params": { + "entitlements": "The entitlements to add" + } + }, + "getEntitlement(address)": { + "params": { + "entitlement": "The entitlement to get" + }, + "returns": { + "_0": "The entitlement module address" + } + }, + "getEntitlements()": { + "returns": { + "_0": "The entitlement modules" + } + }, + "isEntitledToChannel(bytes32,address,string)": { + "params": { + "channelId": "The channel to check", + "permission": "The permission to check", + "user": "The user to check" + }, + "returns": { + "_0": "True if the user is entitled to the permission, false otherwise" + } + }, + "isEntitledToSpace(address,string)": { + "params": { + "permission": "The permission to check", + "user": "The user to check" + }, + "returns": { + "_0": "True if the user is entitled to the permission, false otherwise" + } + }, + "removeEntitlementModule(address)": { + "params": { + "entitlement": "The entitlement to remove" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "addEntitlementModule(address)": { + "notice": "Adds an entitlement to the space" + }, + "addImmutableEntitlements(address[])": { + "notice": "Allows the space owner to add immutable entitlements to the space" + }, + "getEntitlement(address)": { + "notice": "Gets an entitlement from the space" + }, + "getEntitlements()": { + "notice": "Gets all entitlements from the space" + }, + "isEntitledToChannel(bytes32,address,string)": { + "notice": "Checks if a user is entitled to a permission in a channel" + }, + "isEntitledToSpace(address,string)": { + "notice": "Checks if a user is entitled to a permission in the space" + }, + "removeEntitlementModule(address)": { + "notice": "Removes an entitlement from the space" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/facets/entitlements/EntitlementsManager.sol": "EntitlementsManager" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol": { + "keccak256": "0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d", + "urls": [ + "bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f", + "dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol": { + "keccak256": "0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a", + "urls": [ + "bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5", + "dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol": { + "keccak256": "0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0", + "urls": [ + "bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc", + "dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/IPausable.sol": { + "keccak256": "0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261", + "urls": [ + "bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6", + "dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableBase.sol": { + "keccak256": "0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438", + "urls": [ + "bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c", + "dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableStorage.sol": { + "keccak256": "0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07", + "urls": [ + "bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b", + "dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol": { + "keccak256": "0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3", + "urls": [ + "bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714", + "dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol": { + "keccak256": "0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e", + "urls": [ + "bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7", + "dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/IERC5643.sol": { + "keccak256": "0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218", + "urls": [ + "bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f", + "dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol": { + "keccak256": "0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334", + "urls": [ + "bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa", + "dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol": { + "keccak256": "0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1", + "urls": [ + "bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c", + "dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/IERC721A.sol": { + "keccak256": "0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9", + "urls": [ + "bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e", + "dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/wallet-link/IWalletLink.sol": { + "keccak256": "0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b", + "urls": [ + "bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13", + "dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/IEntitlement.sol": { + "keccak256": "0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca", + "urls": [ + "bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3", + "dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol": { + "keccak256": "0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf", + "urls": [ + "bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1", + "dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97" + ], + "license": "MIT" + }, + "contracts/src/spaces/entitlements/user/IUserEntitlement.sol": { + "keccak256": "0x96fef5ebaa7e9e79c77c887d9053ae06dc91cf1301f33db652e6ac811b3b5cc5", + "urls": [ + "bzz-raw://6cff649b95f65c9e3ecfa7dfa3b1c7b524ec7244eb5223c55674a4679eb8e7bf", + "dweb:/ipfs/QmQy5sXRywRWB3aM58TCp5Xw5b258Y5PfDM8RasDznAPzA" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/Entitled.sol": { + "keccak256": "0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c", + "urls": [ + "bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7", + "dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/BanningBase.sol": { + "keccak256": "0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270", + "urls": [ + "bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d", + "dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/BanningStorage.sol": { + "keccak256": "0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492", + "urls": [ + "bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0", + "dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/IBanning.sol": { + "keccak256": "0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505", + "urls": [ + "bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419", + "dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/ChannelService.sol": { + "keccak256": "0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7", + "urls": [ + "bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9", + "dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/ChannelStorage.sol": { + "keccak256": "0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f", + "urls": [ + "bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7", + "dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol": { + "keccak256": "0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2", + "urls": [ + "bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5", + "dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol": { + "keccak256": "0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef", + "urls": [ + "bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07", + "dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/EntitlementsManager.sol": { + "keccak256": "0x5121b9ebb57a7c98594a52360044b5a5105d3ffbc86d717e25f8e5957f6b221a", + "urls": [ + "bzz-raw://dd65322faa757c44c93eeb7dd68fc208d11b4a2068d8c1241d657d447d98be92", + "dweb:/ipfs/Qmeu61gEnz8o26AwnpWnTKhoM2mBDygyimYpbuSjDbsDyb" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/EntitlementsManagerBase.sol": { + "keccak256": "0x043ba820a71407d23bb2f14f4809f8c6024c90de44e403130a0e3c2998b53cd6", + "urls": [ + "bzz-raw://a161f6aea0bf6796f5b87abe51192796fe4926515ffa927aa3bd3c01d657b951", + "dweb:/ipfs/QmTZF7rCKaCQ4YRdGSsm1f6T8HCSX2KPzcEFqpvkF3riMi" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/EntitlementsManagerService.sol": { + "keccak256": "0x6f40f5b41ad702ea55bf10f987b3e2b6d02ac527a66be523f06f025cead1867d", + "urls": [ + "bzz-raw://da2012c616b833c5b491735c230be707e4f9b7657b3a71d7bdf52e7c2ba128b9", + "dweb:/ipfs/Qme4864V46rozVDRWtfYqtpyzE1SzBnqYQQf3iD2rrqiPg" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol": { + "keccak256": "0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8", + "urls": [ + "bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583", + "dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/IEntitlementsManager.sol": { + "keccak256": "0x1c3cff6f7a35610df492abc39a62ba704e408d43477ba2e34833197c2956e9d3", + "urls": [ + "bzz-raw://c5d5f08c5bc196e6166678b39d415da12c285d9bee3584d5e200bbf0c5ea911d", + "dweb:/ipfs/QmdYkU6kzHFw7KFYAdvxiwHK7hWCrz3E3pwiCjWZ97PVGx" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/MembershipStorage.sol": { + "keccak256": "0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3", + "urls": [ + "bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee", + "dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/IRoles.sol": { + "keccak256": "0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d", + "urls": [ + "bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8", + "dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/RolesBase.sol": { + "keccak256": "0x2ef137dec4a5390009fd931e34fdbb4a742c96b68b40f5c152cec8cf2809ed6f", + "urls": [ + "bzz-raw://3cb29b4a780742a30ba3af5719f77a4a65ea55ebbdc3ccd9c93c86573f20c7df", + "dweb:/ipfs/QmdvPJydLCcEwCB3xk5VpET8X2GfrxC3NBUD5G6C8a9aW8" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/RolesStorage.sol": { + "keccak256": "0x40f288a613e35cbc02aceb1d23f89af888f65538853f61cc1fcd25901b9bc4af", + "urls": [ + "bzz-raw://396b5e157c9a29adc94edc5d234f416a44e6e7c4588b1aaa0587bb04018705e9", + "dweb:/ipfs/QmWDCQz555WbvZw7XxfkybE5dPfouc6rKxU5Zu1Gsuz1Zr" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/StringSet.sol": { + "keccak256": "0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319", + "urls": [ + "bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6", + "dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/Validator.sol": { + "keccak256": "0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50", + "urls": [ + "bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64", + "dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4", + "urls": [ + "bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7", + "dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/IBanning.abi.json b/packages/generated/dev/abis/IBanning.abi.json new file mode 100644 index 000000000..cdff8b414 --- /dev/null +++ b/packages/generated/dev/abis/IBanning.abi.json @@ -0,0 +1,136 @@ +[ + { + "type": "function", + "name": "ban", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "banned", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "unban", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/IBanning.abi.ts b/packages/generated/dev/abis/IBanning.abi.ts new file mode 100644 index 000000000..1ace53d43 --- /dev/null +++ b/packages/generated/dev/abis/IBanning.abi.ts @@ -0,0 +1,136 @@ +export default [ + { + "type": "function", + "name": "ban", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "banned", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "unban", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + } +] as const diff --git a/packages/generated/dev/abis/IBanning.bin b/packages/generated/dev/abis/IBanning.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/dev/abis/IBanning.json b/packages/generated/dev/abis/IBanning.json new file mode 100644 index 000000000..bcf45ae76 --- /dev/null +++ b/packages/generated/dev/abis/IBanning.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"ban","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"banned","inputs":[],"outputs":[{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"isBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"unban","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Banned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unbanned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"Banning__AlreadyBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__CannotBanSelf","inputs":[]},{"type":"error","name":"Banning__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__NotBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"ban(uint256)":"6b6ece26","banned()":"158fba8f","isBanned(uint256)":"c57a9c56","unban(uint256)":"1519ff4c"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__AlreadyBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Banning__CannotBanSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__NotBanned\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Unbanned\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ban\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"banned\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"isBanned\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"unban\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/facets/banning/IBanning.sol\":\"IBanning\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/spaces/facets/banning/IBanning.sol\":{\"keccak256\":\"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419\",\"dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__AlreadyBanned"},{"inputs":[],"type":"error","name":"Banning__CannotBanSelf"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__InvalidTokenId"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__NotBanned"},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Banned","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Unbanned","anonymous":false},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"ban"},{"inputs":[],"stateMutability":"view","type":"function","name":"banned","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"isBanned","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"unban"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/facets/banning/IBanning.sol":"IBanning"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/spaces/facets/banning/IBanning.sol":{"keccak256":"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505","urls":["bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419","dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6"],"license":"Apache-2.0"}},"version":1},"id":197} \ No newline at end of file diff --git a/packages/generated/dev/abis/IBanning.metadata.json b/packages/generated/dev/abis/IBanning.metadata.json new file mode 100644 index 000000000..58b725256 --- /dev/null +++ b/packages/generated/dev/abis/IBanning.metadata.json @@ -0,0 +1,188 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__AlreadyBanned" + }, + { + "inputs": [], + "type": "error", + "name": "Banning__CannotBanSelf" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__InvalidTokenId" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__NotBanned" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Banned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Unbanned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "ban" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "banned", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isBanned", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "unban" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/facets/banning/IBanning.sol": "IBanning" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/spaces/facets/banning/IBanning.sol": { + "keccak256": "0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505", + "urls": [ + "bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419", + "dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/IBanningBase.abi.json b/packages/generated/dev/abis/IBanningBase.abi.json new file mode 100644 index 000000000..6419f38ac --- /dev/null +++ b/packages/generated/dev/abis/IBanningBase.abi.json @@ -0,0 +1,78 @@ +[ + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/IBanningBase.abi.ts b/packages/generated/dev/abis/IBanningBase.abi.ts new file mode 100644 index 000000000..4250368dc --- /dev/null +++ b/packages/generated/dev/abis/IBanningBase.abi.ts @@ -0,0 +1,78 @@ +export default [ + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + } +] as const diff --git a/packages/generated/dev/abis/IBanningBase.bin b/packages/generated/dev/abis/IBanningBase.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/dev/abis/IBanningBase.json b/packages/generated/dev/abis/IBanningBase.json new file mode 100644 index 000000000..0ee380462 --- /dev/null +++ b/packages/generated/dev/abis/IBanningBase.json @@ -0,0 +1 @@ +{"abi":[{"type":"event","name":"Banned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unbanned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"Banning__AlreadyBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__CannotBanSelf","inputs":[]},{"type":"error","name":"Banning__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__NotBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__AlreadyBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Banning__CannotBanSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__NotBanned\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Unbanned\",\"type\":\"event\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/facets/banning/IBanning.sol\":\"IBanningBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/spaces/facets/banning/IBanning.sol\":{\"keccak256\":\"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419\",\"dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__AlreadyBanned"},{"inputs":[],"type":"error","name":"Banning__CannotBanSelf"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__InvalidTokenId"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__NotBanned"},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Banned","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Unbanned","anonymous":false}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/facets/banning/IBanning.sol":"IBanningBase"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/spaces/facets/banning/IBanning.sol":{"keccak256":"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505","urls":["bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419","dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6"],"license":"Apache-2.0"}},"version":1},"id":197} \ No newline at end of file diff --git a/packages/generated/dev/abis/IBanningBase.metadata.json b/packages/generated/dev/abis/IBanningBase.metadata.json new file mode 100644 index 000000000..fd38c3681 --- /dev/null +++ b/packages/generated/dev/abis/IBanningBase.metadata.json @@ -0,0 +1,132 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__AlreadyBanned" + }, + { + "inputs": [], + "type": "error", + "name": "Banning__CannotBanSelf" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__InvalidTokenId" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__NotBanned" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Banned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Unbanned", + "anonymous": false + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/facets/banning/IBanning.sol": "IBanningBase" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/spaces/facets/banning/IBanning.sol": { + "keccak256": "0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505", + "urls": [ + "bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419", + "dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/ICustomEntitlement.abi.json b/packages/generated/dev/abis/ICustomEntitlement.abi.json new file mode 100644 index 000000000..43ed6b85c --- /dev/null +++ b/packages/generated/dev/abis/ICustomEntitlement.abi.json @@ -0,0 +1,21 @@ +[ + { + "type": "function", + "name": "isEntitled", + "inputs": [ + { + "name": "user", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/ICustomEntitlement.abi.ts b/packages/generated/dev/abis/ICustomEntitlement.abi.ts new file mode 100644 index 000000000..52b8e1f42 --- /dev/null +++ b/packages/generated/dev/abis/ICustomEntitlement.abi.ts @@ -0,0 +1,21 @@ +export default [ + { + "type": "function", + "name": "isEntitled", + "inputs": [ + { + "name": "user", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + } +] as const diff --git a/packages/generated/dev/abis/ICustomEntitlement.bin b/packages/generated/dev/abis/ICustomEntitlement.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/dev/abis/ICustomEntitlement.json b/packages/generated/dev/abis/ICustomEntitlement.json new file mode 100644 index 000000000..fb13c9339 --- /dev/null +++ b/packages/generated/dev/abis/ICustomEntitlement.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"isEntitled","inputs":[{"name":"user","type":"address[]","internalType":"address[]"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"isEntitled(address[])":"ddc6e68e"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"user\",\"type\":\"address[]\"}],\"name\":\"isEntitled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"isEntitled(address[])\":{\"params\":{\"user\":\"address of the user to check\"},\"returns\":{\"_0\":\"whether the user is entitled to the permission\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isEntitled(address[])\":{\"notice\":\"checks whether a user is has a given permission for a channel or a space\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/entitlements/ICustomEntitlement.sol\":\"ICustomEntitlement\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/spaces/entitlements/ICustomEntitlement.sol\":{\"keccak256\":\"0xbb879f5fd547f6f93c898ae5d4fc5c6a738123ddac530b6a7267da9307f3e08d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://39e90fc649d84e0ccb48b067ea61d0a5564051d69b0f1dd59d13689625632e05\",\"dweb:/ipfs/QmQAB6ASqGYURyoQuPqf1SaahZtfnAEyr9me3cM3iCLT1K\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address[]","name":"user","type":"address[]"}],"stateMutability":"view","type":"function","name":"isEntitled","outputs":[{"internalType":"bool","name":"","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{"isEntitled(address[])":{"params":{"user":"address of the user to check"},"returns":{"_0":"whether the user is entitled to the permission"}}},"version":1},"userdoc":{"kind":"user","methods":{"isEntitled(address[])":{"notice":"checks whether a user is has a given permission for a channel or a space"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/entitlements/ICustomEntitlement.sol":"ICustomEntitlement"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/spaces/entitlements/ICustomEntitlement.sol":{"keccak256":"0xbb879f5fd547f6f93c898ae5d4fc5c6a738123ddac530b6a7267da9307f3e08d","urls":["bzz-raw://39e90fc649d84e0ccb48b067ea61d0a5564051d69b0f1dd59d13689625632e05","dweb:/ipfs/QmQAB6ASqGYURyoQuPqf1SaahZtfnAEyr9me3cM3iCLT1K"],"license":"Apache-2.0"}},"version":1},"id":186} \ No newline at end of file diff --git a/packages/generated/dev/abis/ICustomEntitlement.metadata.json b/packages/generated/dev/abis/ICustomEntitlement.metadata.json new file mode 100644 index 000000000..2fbb17d4b --- /dev/null +++ b/packages/generated/dev/abis/ICustomEntitlement.metadata.json @@ -0,0 +1,88 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address[]", + "name": "user", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isEntitled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "isEntitled(address[])": { + "params": { + "user": "address of the user to check" + }, + "returns": { + "_0": "whether the user is entitled to the permission" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "isEntitled(address[])": { + "notice": "checks whether a user is has a given permission for a channel or a space" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/entitlements/ICustomEntitlement.sol": "ICustomEntitlement" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/spaces/entitlements/ICustomEntitlement.sol": { + "keccak256": "0xbb879f5fd547f6f93c898ae5d4fc5c6a738123ddac530b6a7267da9307f3e08d", + "urls": [ + "bzz-raw://39e90fc649d84e0ccb48b067ea61d0a5564051d69b0f1dd59d13689625632e05", + "dweb:/ipfs/QmQAB6ASqGYURyoQuPqf1SaahZtfnAEyr9me3cM3iCLT1K" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/IERC721AQueryable.abi.json b/packages/generated/dev/abis/IERC721AQueryable.abi.json new file mode 100644 index 000000000..f01d3f780 --- /dev/null +++ b/packages/generated/dev/abis/IERC721AQueryable.abi.json @@ -0,0 +1,308 @@ +[ + { + "type": "function", + "name": "explicitOwnershipOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IERC721ABase.TokenOwnership", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "startTimestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "burned", + "type": "bool", + "internalType": "bool" + }, + { + "name": "extraData", + "type": "uint24", + "internalType": "uint24" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "explicitOwnershipsOf", + "inputs": [ + { + "name": "tokenIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IERC721ABase.TokenOwnership[]", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "startTimestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "burned", + "type": "bool", + "internalType": "bool" + }, + { + "name": "extraData", + "type": "uint24", + "internalType": "uint24" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokensOfOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokensOfOwnerIn", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "start", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "stop", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidQueryRange", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/IERC721AQueryable.abi.ts b/packages/generated/dev/abis/IERC721AQueryable.abi.ts new file mode 100644 index 000000000..ef2f22d68 --- /dev/null +++ b/packages/generated/dev/abis/IERC721AQueryable.abi.ts @@ -0,0 +1,308 @@ +export default [ + { + "type": "function", + "name": "explicitOwnershipOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IERC721ABase.TokenOwnership", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "startTimestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "burned", + "type": "bool", + "internalType": "bool" + }, + { + "name": "extraData", + "type": "uint24", + "internalType": "uint24" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "explicitOwnershipsOf", + "inputs": [ + { + "name": "tokenIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IERC721ABase.TokenOwnership[]", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "startTimestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "burned", + "type": "bool", + "internalType": "bool" + }, + { + "name": "extraData", + "type": "uint24", + "internalType": "uint24" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokensOfOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokensOfOwnerIn", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "start", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "stop", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidQueryRange", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/IERC721AQueryable.bin b/packages/generated/dev/abis/IERC721AQueryable.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/dev/abis/IERC721AQueryable.json b/packages/generated/dev/abis/IERC721AQueryable.json new file mode 100644 index 000000000..6f4c95b8e --- /dev/null +++ b/packages/generated/dev/abis/IERC721AQueryable.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"explicitOwnershipOf","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IERC721ABase.TokenOwnership","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"startTimestamp","type":"uint64","internalType":"uint64"},{"name":"burned","type":"bool","internalType":"bool"},{"name":"extraData","type":"uint24","internalType":"uint24"}]}],"stateMutability":"view"},{"type":"function","name":"explicitOwnershipsOf","inputs":[{"name":"tokenIds","type":"uint256[]","internalType":"uint256[]"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IERC721ABase.TokenOwnership[]","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"startTimestamp","type":"uint64","internalType":"uint64"},{"name":"burned","type":"bool","internalType":"bool"},{"name":"extraData","type":"uint24","internalType":"uint24"}]}],"stateMutability":"view"},{"type":"function","name":"tokensOfOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"tokensOfOwnerIn","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"start","type":"uint256","internalType":"uint256"},{"name":"stop","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"ConsecutiveTransfer","inputs":[{"name":"fromTokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"toTokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"ApprovalCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"ApprovalQueryForNonexistentToken","inputs":[]},{"type":"error","name":"BalanceQueryForZeroAddress","inputs":[]},{"type":"error","name":"InvalidQueryRange","inputs":[]},{"type":"error","name":"MintERC2309QuantityExceedsLimit","inputs":[]},{"type":"error","name":"MintToZeroAddress","inputs":[]},{"type":"error","name":"MintZeroQuantity","inputs":[]},{"type":"error","name":"OwnerQueryForNonexistentToken","inputs":[]},{"type":"error","name":"OwnershipNotInitializedForExtraData","inputs":[]},{"type":"error","name":"TransferCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"TransferFromIncorrectOwner","inputs":[]},{"type":"error","name":"TransferToNonERC721ReceiverImplementer","inputs":[]},{"type":"error","name":"TransferToZeroAddress","inputs":[]},{"type":"error","name":"URIQueryForNonexistentToken","inputs":[]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"explicitOwnershipOf(uint256)":"c23dc68f","explicitOwnershipsOf(uint256[])":"5bbb2177","tokensOfOwner(address)":"8462151c","tokensOfOwnerIn(address,uint256,uint256)":"99a2557a"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ApprovalCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BalanceQueryForZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidQueryRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintERC2309QuantityExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintZeroQuantity\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnershipNotInitializedForExtraData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFromIncorrectOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC721ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"URIQueryForNonexistentToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"toTokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"ConsecutiveTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"explicitOwnershipOf\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"startTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"burned\",\"type\":\"bool\"},{\"internalType\":\"uint24\",\"name\":\"extraData\",\"type\":\"uint24\"}],\"internalType\":\"struct IERC721ABase.TokenOwnership\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"explicitOwnershipsOf\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"startTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"burned\",\"type\":\"bool\"},{\"internalType\":\"uint24\",\"name\":\"extraData\",\"type\":\"uint24\"}],\"internalType\":\"struct IERC721ABase.TokenOwnership[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"tokensOfOwner\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"start\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stop\",\"type\":\"uint256\"}],\"name\":\"tokensOfOwnerIn\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of ERC721AQueryable.\",\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"ConsecutiveTransfer(uint256,uint256,address,address)\":{\"details\":\"Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, as defined in the [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. See {_mintERC2309} for more details.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"explicitOwnershipOf(uint256)\":{\"details\":\"Returns the `TokenOwnership` struct at `tokenId` without reverting. If the `tokenId` is out of bounds: - `addr = address(0)` - `startTimestamp = 0` - `burned = false` - `extraData = 0` If the `tokenId` is burned: - `addr =
` - `startTimestamp = ` - `burned = true` - `extraData = ` Otherwise: - `addr =
` - `startTimestamp = ` - `burned = false` - `extraData = `\"},\"explicitOwnershipsOf(uint256[])\":{\"details\":\"Returns an array of `TokenOwnership` structs at `tokenIds` in order. See {ERC721AQueryable-explicitOwnershipOf}\"},\"tokensOfOwner(address)\":{\"details\":\"Returns an array of token IDs owned by `owner`. This function scans the ownership mapping and is O(`totalSupply`) in complexity. It is meant to be called off-chain. See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into multiple smaller scans if the collection is large enough to cause an out-of-gas error (10K collections should be fine).\"},\"tokensOfOwnerIn(address,uint256,uint256)\":{\"details\":\"Returns an array of token IDs owned by `owner`, in the range [`start`, `stop`) (i.e. `start <= tokenId < stop`). This function allows for tokens to be queried if the collection grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. Requirements: - `start < stop`\"}},\"version\":1},\"userdoc\":{\"errors\":{\"ApprovalCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"ApprovalQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"BalanceQueryForZeroAddress()\":[{\"notice\":\"Cannot query the balance for the zero address.\"}],\"InvalidQueryRange()\":[{\"notice\":\"Invalid query range (`start` >= `stop`).\"}],\"MintERC2309QuantityExceedsLimit()\":[{\"notice\":\"The `quantity` minted with ERC2309 exceeds the safety limit.\"}],\"MintToZeroAddress()\":[{\"notice\":\"Cannot mint to the zero address.\"}],\"MintZeroQuantity()\":[{\"notice\":\"The quantity of tokens minted must be more than zero.\"}],\"OwnerQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"OwnershipNotInitializedForExtraData()\":[{\"notice\":\"The `extraData` cannot be set on an unintialized ownership slot.\"}],\"TransferCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"TransferFromIncorrectOwner()\":[{\"notice\":\"The token must be owned by `from`.\"}],\"TransferToNonERC721ReceiverImplementer()\":[{\"notice\":\"Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"notice\":\"Cannot transfer to the zero address.\"}],\"URIQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}]},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/diamond/facets/token/ERC721A/extensions/IERC721AQueryable.sol\":\"IERC721AQueryable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol\":{\"keccak256\":\"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e\",\"dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM\"]},\"contracts/src/diamond/facets/token/ERC721A/extensions/IERC721AQueryable.sol\":{\"keccak256\":\"0x4f771b745db219765ea57142179c383c3650e70d117e6aaedda07faeab0a2174\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ae401ba6b212057bb5ccaa749cd19b8f3adf81b8f8394d0b73b2b2c138da21c2\",\"dweb:/ipfs/QmSPd32GxN6L1K157yuRXvRBXPeNLa7TiKE93ouH8ccR6V\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"ApprovalCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"ApprovalQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"BalanceQueryForZeroAddress"},{"inputs":[],"type":"error","name":"InvalidQueryRange"},{"inputs":[],"type":"error","name":"MintERC2309QuantityExceedsLimit"},{"inputs":[],"type":"error","name":"MintToZeroAddress"},{"inputs":[],"type":"error","name":"MintZeroQuantity"},{"inputs":[],"type":"error","name":"OwnerQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"OwnershipNotInitializedForExtraData"},{"inputs":[],"type":"error","name":"TransferCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"TransferFromIncorrectOwner"},{"inputs":[],"type":"error","name":"TransferToNonERC721ReceiverImplementer"},{"inputs":[],"type":"error","name":"TransferToZeroAddress"},{"inputs":[],"type":"error","name":"URIQueryForNonexistentToken"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"approved","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bool","name":"approved","type":"bool","indexed":false}],"type":"event","name":"ApprovalForAll","anonymous":false},{"inputs":[{"internalType":"uint256","name":"fromTokenId","type":"uint256","indexed":true},{"internalType":"uint256","name":"toTokenId","type":"uint256","indexed":false},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true}],"type":"event","name":"ConsecutiveTransfer","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"explicitOwnershipOf","outputs":[{"internalType":"struct IERC721ABase.TokenOwnership","name":"","type":"tuple","components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}]}]},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"view","type":"function","name":"explicitOwnershipsOf","outputs":[{"internalType":"struct IERC721ABase.TokenOwnership[]","name":"","type":"tuple[]","components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}]}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function","name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"stateMutability":"view","type":"function","name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}]}],"devdoc":{"kind":"dev","methods":{"explicitOwnershipOf(uint256)":{"details":"Returns the `TokenOwnership` struct at `tokenId` without reverting. If the `tokenId` is out of bounds: - `addr = address(0)` - `startTimestamp = 0` - `burned = false` - `extraData = 0` If the `tokenId` is burned: - `addr =
` - `startTimestamp = ` - `burned = true` - `extraData = ` Otherwise: - `addr =
` - `startTimestamp = ` - `burned = false` - `extraData = `"},"explicitOwnershipsOf(uint256[])":{"details":"Returns an array of `TokenOwnership` structs at `tokenIds` in order. See {ERC721AQueryable-explicitOwnershipOf}"},"tokensOfOwner(address)":{"details":"Returns an array of token IDs owned by `owner`. This function scans the ownership mapping and is O(`totalSupply`) in complexity. It is meant to be called off-chain. See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into multiple smaller scans if the collection is large enough to cause an out-of-gas error (10K collections should be fine)."},"tokensOfOwnerIn(address,uint256,uint256)":{"details":"Returns an array of token IDs owned by `owner`, in the range [`start`, `stop`) (i.e. `start <= tokenId < stop`). This function allows for tokens to be queried if the collection grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. Requirements: - `start < stop`"}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/diamond/facets/token/ERC721A/extensions/IERC721AQueryable.sol":"IERC721AQueryable"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9","urls":["bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e","dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/extensions/IERC721AQueryable.sol":{"keccak256":"0x4f771b745db219765ea57142179c383c3650e70d117e6aaedda07faeab0a2174","urls":["bzz-raw://ae401ba6b212057bb5ccaa749cd19b8f3adf81b8f8394d0b73b2b2c138da21c2","dweb:/ipfs/QmSPd32GxN6L1K157yuRXvRBXPeNLa7TiKE93ouH8ccR6V"],"license":"Apache-2.0"}},"version":1},"id":134} \ No newline at end of file diff --git a/packages/generated/dev/abis/IERC721AQueryable.metadata.json b/packages/generated/dev/abis/IERC721AQueryable.metadata.json new file mode 100644 index 000000000..ac5dd32e5 --- /dev/null +++ b/packages/generated/dev/abis/IERC721AQueryable.metadata.json @@ -0,0 +1,383 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "ApprovalQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "BalanceQueryForZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "InvalidQueryRange" + }, + { + "inputs": [], + "type": "error", + "name": "MintERC2309QuantityExceedsLimit" + }, + { + "inputs": [], + "type": "error", + "name": "MintToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "MintZeroQuantity" + }, + { + "inputs": [], + "type": "error", + "name": "OwnerQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "OwnershipNotInitializedForExtraData" + }, + { + "inputs": [], + "type": "error", + "name": "TransferCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "TransferFromIncorrectOwner" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "URIQueryForNonexistentToken" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "approved", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Approval", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "operator", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ApprovalForAll", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fromTokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint256", + "name": "toTokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConsecutiveTransfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Transfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "explicitOwnershipOf", + "outputs": [ + { + "internalType": "struct IERC721ABase.TokenOwnership", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "uint64", + "name": "startTimestamp", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "burned", + "type": "bool" + }, + { + "internalType": "uint24", + "name": "extraData", + "type": "uint24" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function", + "name": "explicitOwnershipsOf", + "outputs": [ + { + "internalType": "struct IERC721ABase.TokenOwnership[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "uint64", + "name": "startTimestamp", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "burned", + "type": "bool" + }, + { + "internalType": "uint24", + "name": "extraData", + "type": "uint24" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "tokensOfOwner", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stop", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "tokensOfOwnerIn", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ] + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "explicitOwnershipOf(uint256)": { + "details": "Returns the `TokenOwnership` struct at `tokenId` without reverting. If the `tokenId` is out of bounds: - `addr = address(0)` - `startTimestamp = 0` - `burned = false` - `extraData = 0` If the `tokenId` is burned: - `addr =
` - `startTimestamp = ` - `burned = true` - `extraData = ` Otherwise: - `addr =
` - `startTimestamp = ` - `burned = false` - `extraData = `" + }, + "explicitOwnershipsOf(uint256[])": { + "details": "Returns an array of `TokenOwnership` structs at `tokenIds` in order. See {ERC721AQueryable-explicitOwnershipOf}" + }, + "tokensOfOwner(address)": { + "details": "Returns an array of token IDs owned by `owner`. This function scans the ownership mapping and is O(`totalSupply`) in complexity. It is meant to be called off-chain. See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into multiple smaller scans if the collection is large enough to cause an out-of-gas error (10K collections should be fine)." + }, + "tokensOfOwnerIn(address,uint256,uint256)": { + "details": "Returns an array of token IDs owned by `owner`, in the range [`start`, `stop`) (i.e. `start <= tokenId < stop`). This function allows for tokens to be queried if the collection grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. Requirements: - `start < stop`" + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/diamond/facets/token/ERC721A/extensions/IERC721AQueryable.sol": "IERC721AQueryable" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/token/ERC721A/IERC721A.sol": { + "keccak256": "0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9", + "urls": [ + "bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e", + "dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/extensions/IERC721AQueryable.sol": { + "keccak256": "0x4f771b745db219765ea57142179c383c3650e70d117e6aaedda07faeab0a2174", + "urls": [ + "bzz-raw://ae401ba6b212057bb5ccaa749cd19b8f3adf81b8f8394d0b73b2b2c138da21c2", + "dweb:/ipfs/QmSPd32GxN6L1K157yuRXvRBXPeNLa7TiKE93ouH8ccR6V" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/IMulticall.abi.json b/packages/generated/dev/abis/IMulticall.abi.json new file mode 100644 index 000000000..a24b4e01e --- /dev/null +++ b/packages/generated/dev/abis/IMulticall.abi.json @@ -0,0 +1,21 @@ +[ + { + "type": "function", + "name": "multicall", + "inputs": [ + { + "name": "data", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "outputs": [ + { + "name": "results", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "stateMutability": "nonpayable" + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/IMulticall.abi.ts b/packages/generated/dev/abis/IMulticall.abi.ts new file mode 100644 index 000000000..673261ec8 --- /dev/null +++ b/packages/generated/dev/abis/IMulticall.abi.ts @@ -0,0 +1,21 @@ +export default [ + { + "type": "function", + "name": "multicall", + "inputs": [ + { + "name": "data", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "outputs": [ + { + "name": "results", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "stateMutability": "nonpayable" + } +] as const diff --git a/packages/generated/dev/abis/IMulticall.bin b/packages/generated/dev/abis/IMulticall.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/dev/abis/IMulticall.json b/packages/generated/dev/abis/IMulticall.json new file mode 100644 index 000000000..f55d3c28d --- /dev/null +++ b/packages/generated/dev/abis/IMulticall.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"multicall","inputs":[{"name":"data","type":"bytes[]","internalType":"bytes[]"}],"outputs":[{"name":"results","type":"bytes[]","internalType":"bytes[]"}],"stateMutability":"nonpayable"}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"multicall(bytes[])":"ac9650d8"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"multicall(bytes[])\":{\"params\":{\"data\":\"array of function call data payloads\"},\"returns\":{\"results\":\"array of function call results\"}}},\"title\":\"Interface for the Multicall utility contract\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"multicall(bytes[])\":{\"notice\":\"batch function calls to the contract and return the results of each\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/diamond/utils/multicall/IMulticall.sol\":\"IMulticall\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/utils/multicall/IMulticall.sol\":{\"keccak256\":\"0x0f1a1884b290dc829323fa6d01e0dedc785ff582e9dbffd52e44e6f2fc7beff6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1ce824d7f2b31f53a807bf6d6d7e9d0eaaf2d81b75fa316cda616e29cb4669a9\",\"dweb:/ipfs/QmWyiRtGKtX6Kfng8Az2ujKDZdqjnfwxMuD1rQEZz6aki5\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function","name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}]}],"devdoc":{"kind":"dev","methods":{"multicall(bytes[])":{"params":{"data":"array of function call data payloads"},"returns":{"results":"array of function call results"}}},"version":1},"userdoc":{"kind":"user","methods":{"multicall(bytes[])":{"notice":"batch function calls to the contract and return the results of each"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/diamond/utils/multicall/IMulticall.sol":"IMulticall"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/utils/multicall/IMulticall.sol":{"keccak256":"0x0f1a1884b290dc829323fa6d01e0dedc785ff582e9dbffd52e44e6f2fc7beff6","urls":["bzz-raw://1ce824d7f2b31f53a807bf6d6d7e9d0eaaf2d81b75fa316cda616e29cb4669a9","dweb:/ipfs/QmWyiRtGKtX6Kfng8Az2ujKDZdqjnfwxMuD1rQEZz6aki5"],"license":"Apache-2.0"}},"version":1},"id":150} \ No newline at end of file diff --git a/packages/generated/dev/abis/IMulticall.metadata.json b/packages/generated/dev/abis/IMulticall.metadata.json new file mode 100644 index 000000000..ed8dbd558 --- /dev/null +++ b/packages/generated/dev/abis/IMulticall.metadata.json @@ -0,0 +1,88 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ] + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "multicall(bytes[])": { + "params": { + "data": "array of function call data payloads" + }, + "returns": { + "results": "array of function call results" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "multicall(bytes[])": { + "notice": "batch function calls to the contract and return the results of each" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/diamond/utils/multicall/IMulticall.sol": "IMulticall" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/utils/multicall/IMulticall.sol": { + "keccak256": "0x0f1a1884b290dc829323fa6d01e0dedc785ff582e9dbffd52e44e6f2fc7beff6", + "urls": [ + "bzz-raw://1ce824d7f2b31f53a807bf6d6d7e9d0eaaf2d81b75fa316cda616e29cb4669a9", + "dweb:/ipfs/QmWyiRtGKtX6Kfng8Az2ujKDZdqjnfwxMuD1rQEZz6aki5" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/IPausable.abi.json b/packages/generated/dev/abis/IPausable.abi.json new file mode 100644 index 000000000..1f2168a61 --- /dev/null +++ b/packages/generated/dev/abis/IPausable.abi.json @@ -0,0 +1,65 @@ +[ + { + "type": "function", + "name": "pause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "paused", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "unpause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/IPausable.abi.ts b/packages/generated/dev/abis/IPausable.abi.ts new file mode 100644 index 000000000..0237ecea0 --- /dev/null +++ b/packages/generated/dev/abis/IPausable.abi.ts @@ -0,0 +1,65 @@ +export default [ + { + "type": "function", + "name": "pause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "paused", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "unpause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/IPausable.bin b/packages/generated/dev/abis/IPausable.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/dev/abis/IPausable.json b/packages/generated/dev/abis/IPausable.json new file mode 100644 index 000000000..d12ede873 --- /dev/null +++ b/packages/generated/dev/abis/IPausable.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"pause","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"unpause","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"Pausable__NotPaused","inputs":[]},{"type":"error","name":"Pausable__Paused","inputs":[]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"pause()":"8456cb59","paused()":"5c975abb","unpause()":"3f4ba83a"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"Pausable__NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__Paused\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/diamond/facets/pausable/IPausable.sol\":\"IPausable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/pausable/IPausable.sol\":{\"keccak256\":\"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6\",\"dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"Pausable__NotPaused"},{"inputs":[],"type":"error","name":"Pausable__Paused"},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"pause"},{"inputs":[],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"unpause"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/diamond/facets/pausable/IPausable.sol":"IPausable"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/pausable/IPausable.sol":{"keccak256":"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261","urls":["bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6","dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM"],"license":"Apache-2.0"}},"version":1},"id":108} \ No newline at end of file diff --git a/packages/generated/dev/abis/IPausable.metadata.json b/packages/generated/dev/abis/IPausable.metadata.json new file mode 100644 index 000000000..3336ee94b --- /dev/null +++ b/packages/generated/dev/abis/IPausable.metadata.json @@ -0,0 +1,117 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "Pausable__NotPaused" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__Paused" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Paused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Unpaused", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "pause" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "unpause" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/diamond/facets/pausable/IPausable.sol": "IPausable" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/pausable/IPausable.sol": { + "keccak256": "0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261", + "urls": [ + "bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6", + "dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/IPausableBase.abi.json b/packages/generated/dev/abis/IPausableBase.abi.json new file mode 100644 index 000000000..b55c603c4 --- /dev/null +++ b/packages/generated/dev/abis/IPausableBase.abi.json @@ -0,0 +1,38 @@ +[ + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/IPausableBase.abi.ts b/packages/generated/dev/abis/IPausableBase.abi.ts new file mode 100644 index 000000000..22c668d52 --- /dev/null +++ b/packages/generated/dev/abis/IPausableBase.abi.ts @@ -0,0 +1,38 @@ +export default [ + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/IPausableBase.bin b/packages/generated/dev/abis/IPausableBase.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/dev/abis/IPausableBase.json b/packages/generated/dev/abis/IPausableBase.json new file mode 100644 index 000000000..e89868929 --- /dev/null +++ b/packages/generated/dev/abis/IPausableBase.json @@ -0,0 +1 @@ +{"abi":[{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"Pausable__NotPaused","inputs":[]},{"type":"error","name":"Pausable__Paused","inputs":[]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"Pausable__NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__Paused\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/diamond/facets/pausable/IPausable.sol\":\"IPausableBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/pausable/IPausable.sol\":{\"keccak256\":\"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6\",\"dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"Pausable__NotPaused"},{"inputs":[],"type":"error","name":"Pausable__Paused"},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/diamond/facets/pausable/IPausable.sol":"IPausableBase"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/pausable/IPausable.sol":{"keccak256":"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261","urls":["bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6","dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM"],"license":"Apache-2.0"}},"version":1},"id":108} \ No newline at end of file diff --git a/packages/generated/dev/abis/IPausableBase.metadata.json b/packages/generated/dev/abis/IPausableBase.metadata.json new file mode 100644 index 000000000..2fe025189 --- /dev/null +++ b/packages/generated/dev/abis/IPausableBase.metadata.json @@ -0,0 +1,92 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "Pausable__NotPaused" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__Paused" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Paused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Unpaused", + "anonymous": false + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/diamond/facets/pausable/IPausable.sol": "IPausableBase" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/pausable/IPausable.sol": { + "keccak256": "0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261", + "urls": [ + "bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6", + "dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/IPricingModules.abi.json b/packages/generated/dev/abis/IPricingModules.abi.json new file mode 100644 index 000000000..d1fffafd7 --- /dev/null +++ b/packages/generated/dev/abis/IPricingModules.abi.json @@ -0,0 +1,127 @@ +[ + { + "type": "function", + "name": "addPricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isPricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "listPricingModules", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IPricingModulesBase.PricingModule[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "module", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removePricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "PricingModuleAdded", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PricingModuleRemoved", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PricingModuleUpdated", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "InvalidPricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/IPricingModules.abi.ts b/packages/generated/dev/abis/IPricingModules.abi.ts new file mode 100644 index 000000000..8ffc82bc7 --- /dev/null +++ b/packages/generated/dev/abis/IPricingModules.abi.ts @@ -0,0 +1,127 @@ +export default [ + { + "type": "function", + "name": "addPricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isPricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "listPricingModules", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IPricingModulesBase.PricingModule[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "module", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removePricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "PricingModuleAdded", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PricingModuleRemoved", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PricingModuleUpdated", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "InvalidPricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ] + } +] as const diff --git a/packages/generated/dev/abis/IPricingModules.bin b/packages/generated/dev/abis/IPricingModules.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/dev/abis/IPricingModules.json b/packages/generated/dev/abis/IPricingModules.json new file mode 100644 index 000000000..2c613cc3b --- /dev/null +++ b/packages/generated/dev/abis/IPricingModules.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"addPricingModule","inputs":[{"name":"module","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isPricingModule","inputs":[{"name":"module","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"listPricingModules","inputs":[],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IPricingModulesBase.PricingModule[]","components":[{"name":"name","type":"string","internalType":"string"},{"name":"description","type":"string","internalType":"string"},{"name":"module","type":"address","internalType":"address"}]}],"stateMutability":"view"},{"type":"function","name":"removePricingModule","inputs":[{"name":"module","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"PricingModuleAdded","inputs":[{"name":"module","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"PricingModuleRemoved","inputs":[{"name":"module","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"PricingModuleUpdated","inputs":[{"name":"module","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"InvalidPricingModule","inputs":[{"name":"module","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"addPricingModule(address)":"804d898e","isPricingModule(address)":"8df80bd6","listPricingModules()":"4066cb90","removePricingModule(address)":"31655db1"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"InvalidPricingModule\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"PricingModuleAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"PricingModuleRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"PricingModuleUpdated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"addPricingModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"isPricingModule\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"listPricingModules\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"internalType\":\"struct IPricingModulesBase.PricingModule[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"removePricingModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/factory/facets/architect/pricing/IPricingModules.sol\":\"IPricingModules\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/factory/facets/architect/pricing/IPricingModules.sol\":{\"keccak256\":\"0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716\",\"dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"module","type":"address"}],"type":"error","name":"InvalidPricingModule"},{"inputs":[{"internalType":"address","name":"module","type":"address","indexed":true}],"type":"event","name":"PricingModuleAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"module","type":"address","indexed":true}],"type":"event","name":"PricingModuleRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"module","type":"address","indexed":true}],"type":"event","name":"PricingModuleUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"addPricingModule"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"stateMutability":"view","type":"function","name":"isPricingModule","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"listPricingModules","outputs":[{"internalType":"struct IPricingModulesBase.PricingModule[]","name":"","type":"tuple[]","components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"address","name":"module","type":"address"}]}]},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removePricingModule"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/factory/facets/architect/pricing/IPricingModules.sol":"IPricingModules"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/factory/facets/architect/pricing/IPricingModules.sol":{"keccak256":"0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e","urls":["bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716","dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU"],"license":"Apache-2.0"}},"version":1},"id":157} \ No newline at end of file diff --git a/packages/generated/dev/abis/IPricingModules.metadata.json b/packages/generated/dev/abis/IPricingModules.metadata.json new file mode 100644 index 000000000..d8792ef3f --- /dev/null +++ b/packages/generated/dev/abis/IPricingModules.metadata.json @@ -0,0 +1,179 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "type": "error", + "name": "InvalidPricingModule" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "PricingModuleAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "PricingModuleRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "PricingModuleUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "addPricingModule" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isPricingModule", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "listPricingModules", + "outputs": [ + { + "internalType": "struct IPricingModulesBase.PricingModule[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + }, + { + "internalType": "address", + "name": "module", + "type": "address" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removePricingModule" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/factory/facets/architect/pricing/IPricingModules.sol": "IPricingModules" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/factory/facets/architect/pricing/IPricingModules.sol": { + "keccak256": "0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e", + "urls": [ + "bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716", + "dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/IPricingModulesBase.abi.json b/packages/generated/dev/abis/IPricingModulesBase.abi.json new file mode 100644 index 000000000..8993b726e --- /dev/null +++ b/packages/generated/dev/abis/IPricingModulesBase.abi.json @@ -0,0 +1,52 @@ +[ + { + "type": "event", + "name": "PricingModuleAdded", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PricingModuleRemoved", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PricingModuleUpdated", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "InvalidPricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/IPricingModulesBase.abi.ts b/packages/generated/dev/abis/IPricingModulesBase.abi.ts new file mode 100644 index 000000000..d49583cab --- /dev/null +++ b/packages/generated/dev/abis/IPricingModulesBase.abi.ts @@ -0,0 +1,52 @@ +export default [ + { + "type": "event", + "name": "PricingModuleAdded", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PricingModuleRemoved", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PricingModuleUpdated", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "InvalidPricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ] + } +] as const diff --git a/packages/generated/dev/abis/IPricingModulesBase.bin b/packages/generated/dev/abis/IPricingModulesBase.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/dev/abis/IPricingModulesBase.json b/packages/generated/dev/abis/IPricingModulesBase.json new file mode 100644 index 000000000..56e3959e7 --- /dev/null +++ b/packages/generated/dev/abis/IPricingModulesBase.json @@ -0,0 +1 @@ +{"abi":[{"type":"event","name":"PricingModuleAdded","inputs":[{"name":"module","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"PricingModuleRemoved","inputs":[{"name":"module","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"PricingModuleUpdated","inputs":[{"name":"module","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"InvalidPricingModule","inputs":[{"name":"module","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"InvalidPricingModule\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"PricingModuleAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"PricingModuleRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"PricingModuleUpdated\",\"type\":\"event\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/factory/facets/architect/pricing/IPricingModules.sol\":\"IPricingModulesBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/factory/facets/architect/pricing/IPricingModules.sol\":{\"keccak256\":\"0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716\",\"dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"module","type":"address"}],"type":"error","name":"InvalidPricingModule"},{"inputs":[{"internalType":"address","name":"module","type":"address","indexed":true}],"type":"event","name":"PricingModuleAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"module","type":"address","indexed":true}],"type":"event","name":"PricingModuleRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"module","type":"address","indexed":true}],"type":"event","name":"PricingModuleUpdated","anonymous":false}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/factory/facets/architect/pricing/IPricingModules.sol":"IPricingModulesBase"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/factory/facets/architect/pricing/IPricingModules.sol":{"keccak256":"0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e","urls":["bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716","dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU"],"license":"Apache-2.0"}},"version":1},"id":157} \ No newline at end of file diff --git a/packages/generated/dev/abis/IPricingModulesBase.metadata.json b/packages/generated/dev/abis/IPricingModulesBase.metadata.json new file mode 100644 index 000000000..067f73da5 --- /dev/null +++ b/packages/generated/dev/abis/IPricingModulesBase.metadata.json @@ -0,0 +1,106 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "type": "error", + "name": "InvalidPricingModule" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "PricingModuleAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "PricingModuleRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "PricingModuleUpdated", + "anonymous": false + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/factory/facets/architect/pricing/IPricingModules.sol": "IPricingModulesBase" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/factory/facets/architect/pricing/IPricingModules.sol": { + "keccak256": "0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e", + "urls": [ + "bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716", + "dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/IRuleEntitlement.abi.json b/packages/generated/dev/abis/IRuleEntitlement.abi.json new file mode 100644 index 000000000..fda3fe91a --- /dev/null +++ b/packages/generated/dev/abis/IRuleEntitlement.abi.json @@ -0,0 +1,556 @@ +[ + { + "type": "function", + "name": "description", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "encodeRuleData", + "inputs": [ + { + "name": "data", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "getCheckOperations", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEntitlementDataByRoleId", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getLogicalOperations", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getOperations", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRuleData", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "data", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isCrosschain", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isEntitled", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "user", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "permission", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "moduleType", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "entitlementData", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "error", + "name": "CheckOperationsLimitReaced", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidCheckOperationIndex", + "inputs": [ + { + "name": "operationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "checkOperationsLength", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "type": "error", + "name": "InvalidLeftOperationIndex", + "inputs": [ + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "currentOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "type": "error", + "name": "InvalidLogicalOperationIndex", + "inputs": [ + { + "name": "operationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "logicalOperationsLength", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "type": "error", + "name": "InvalidOperationType", + "inputs": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + } + ] + }, + { + "type": "error", + "name": "InvalidRightOperationIndex", + "inputs": [ + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "currentOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "type": "error", + "name": "LogicalOperationLimitReached", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "OperationsLimitReached", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/IRuleEntitlement.abi.ts b/packages/generated/dev/abis/IRuleEntitlement.abi.ts new file mode 100644 index 000000000..d593061ba --- /dev/null +++ b/packages/generated/dev/abis/IRuleEntitlement.abi.ts @@ -0,0 +1,556 @@ +export default [ + { + "type": "function", + "name": "description", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "encodeRuleData", + "inputs": [ + { + "name": "data", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "getCheckOperations", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEntitlementDataByRoleId", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getLogicalOperations", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getOperations", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRuleData", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "data", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isCrosschain", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isEntitled", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "user", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "permission", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "moduleType", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "entitlementData", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "error", + "name": "CheckOperationsLimitReaced", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidCheckOperationIndex", + "inputs": [ + { + "name": "operationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "checkOperationsLength", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "type": "error", + "name": "InvalidLeftOperationIndex", + "inputs": [ + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "currentOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "type": "error", + "name": "InvalidLogicalOperationIndex", + "inputs": [ + { + "name": "operationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "logicalOperationsLength", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "type": "error", + "name": "InvalidOperationType", + "inputs": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + } + ] + }, + { + "type": "error", + "name": "InvalidRightOperationIndex", + "inputs": [ + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "currentOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "type": "error", + "name": "LogicalOperationLimitReached", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "OperationsLimitReached", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ] + } +] as const diff --git a/packages/generated/dev/abis/IRuleEntitlement.bin b/packages/generated/dev/abis/IRuleEntitlement.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/dev/abis/IRuleEntitlement.json b/packages/generated/dev/abis/IRuleEntitlement.json new file mode 100644 index 000000000..a9231f3f4 --- /dev/null +++ b/packages/generated/dev/abis/IRuleEntitlement.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"description","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"encodeRuleData","inputs":[{"name":"data","type":"tuple","internalType":"struct IRuleEntitlement.RuleData","components":[{"name":"operations","type":"tuple[]","internalType":"struct IRuleEntitlement.Operation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CombinedOperationType"},{"name":"index","type":"uint8","internalType":"uint8"}]},{"name":"checkOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.CheckOperation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CheckOperationType"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"contractAddress","type":"address","internalType":"address"},{"name":"threshold","type":"uint256","internalType":"uint256"}]},{"name":"logicalOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.LogicalOperation[]","components":[{"name":"logOpType","type":"uint8","internalType":"enum IRuleEntitlement.LogicalOperationType"},{"name":"leftOperationIndex","type":"uint8","internalType":"uint8"},{"name":"rightOperationIndex","type":"uint8","internalType":"uint8"}]}]}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"pure"},{"type":"function","name":"getCheckOperations","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IRuleEntitlement.CheckOperation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CheckOperationType"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"contractAddress","type":"address","internalType":"address"},{"name":"threshold","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"getEntitlementDataByRoleId","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getLogicalOperations","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IRuleEntitlement.LogicalOperation[]","components":[{"name":"logOpType","type":"uint8","internalType":"enum IRuleEntitlement.LogicalOperationType"},{"name":"leftOperationIndex","type":"uint8","internalType":"uint8"},{"name":"rightOperationIndex","type":"uint8","internalType":"uint8"}]}],"stateMutability":"view"},{"type":"function","name":"getOperations","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IRuleEntitlement.Operation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CombinedOperationType"},{"name":"index","type":"uint8","internalType":"uint8"}]}],"stateMutability":"view"},{"type":"function","name":"getRuleData","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"data","type":"tuple","internalType":"struct IRuleEntitlement.RuleData","components":[{"name":"operations","type":"tuple[]","internalType":"struct IRuleEntitlement.Operation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CombinedOperationType"},{"name":"index","type":"uint8","internalType":"uint8"}]},{"name":"checkOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.CheckOperation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CheckOperationType"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"contractAddress","type":"address","internalType":"address"},{"name":"threshold","type":"uint256","internalType":"uint256"}]},{"name":"logicalOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.LogicalOperation[]","components":[{"name":"logOpType","type":"uint8","internalType":"enum IRuleEntitlement.LogicalOperationType"},{"name":"leftOperationIndex","type":"uint8","internalType":"uint8"},{"name":"rightOperationIndex","type":"uint8","internalType":"uint8"}]}]}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"space","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isCrosschain","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isEntitled","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"},{"name":"user","type":"address[]","internalType":"address[]"},{"name":"permission","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"moduleType","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"removeEntitlement","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setEntitlement","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"entitlementData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"error","name":"CheckOperationsLimitReaced","inputs":[{"name":"limit","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Entitlement__InvalidValue","inputs":[]},{"type":"error","name":"Entitlement__NotAllowed","inputs":[]},{"type":"error","name":"Entitlement__NotMember","inputs":[]},{"type":"error","name":"Entitlement__ValueAlreadyExists","inputs":[]},{"type":"error","name":"InvalidCheckOperationIndex","inputs":[{"name":"operationIndex","type":"uint8","internalType":"uint8"},{"name":"checkOperationsLength","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"InvalidLeftOperationIndex","inputs":[{"name":"leftOperationIndex","type":"uint8","internalType":"uint8"},{"name":"currentOperationIndex","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"InvalidLogicalOperationIndex","inputs":[{"name":"operationIndex","type":"uint8","internalType":"uint8"},{"name":"logicalOperationsLength","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"InvalidOperationType","inputs":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CombinedOperationType"}]},{"type":"error","name":"InvalidRightOperationIndex","inputs":[{"name":"rightOperationIndex","type":"uint8","internalType":"uint8"},{"name":"currentOperationIndex","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"LogicalOperationLimitReached","inputs":[{"name":"limit","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"OperationsLimitReached","inputs":[{"name":"limit","type":"uint256","internalType":"uint256"}]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"description()":"7284e416","encodeRuleData(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]))":"5d115072","getCheckOperations(uint256)":"e3eeace1","getEntitlementDataByRoleId(uint256)":"1eee07b2","getLogicalOperations(uint256)":"545f09d3","getOperations(uint256)":"5ad4d49e","getRuleData(uint256)":"069a3ee9","initialize(address)":"c4d66de8","isCrosschain()":"2e1b61e4","isEntitled(bytes32,address[],bytes32)":"0cf0b533","moduleType()":"6465e69f","name()":"06fdde03","removeEntitlement(uint256)":"f0c111f9","setEntitlement(uint256,bytes)":"ef8be574"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"CheckOperationsLimitReaced\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__ValueAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"operationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"checkOperationsLength\",\"type\":\"uint8\"}],\"name\":\"InvalidCheckOperationIndex\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"leftOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"currentOperationIndex\",\"type\":\"uint8\"}],\"name\":\"InvalidLeftOperationIndex\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"operationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"logicalOperationsLength\",\"type\":\"uint8\"}],\"name\":\"InvalidLogicalOperationIndex\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enum IRuleEntitlement.CombinedOperationType\",\"name\":\"opType\",\"type\":\"uint8\"}],\"name\":\"InvalidOperationType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"rightOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"currentOperationIndex\",\"type\":\"uint8\"}],\"name\":\"InvalidRightOperationIndex\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"LogicalOperationLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"OperationsLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"description\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CombinedOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.Operation[]\",\"name\":\"operations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CheckOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"internalType\":\"struct IRuleEntitlement.CheckOperation[]\",\"name\":\"checkOperations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.LogicalOperationType\",\"name\":\"logOpType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"leftOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"rightOperationIndex\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.LogicalOperation[]\",\"name\":\"logicalOperations\",\"type\":\"tuple[]\"}],\"internalType\":\"struct IRuleEntitlement.RuleData\",\"name\":\"data\",\"type\":\"tuple\"}],\"name\":\"encodeRuleData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getCheckOperations\",\"outputs\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CheckOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"internalType\":\"struct IRuleEntitlement.CheckOperation[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getEntitlementDataByRoleId\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getLogicalOperations\",\"outputs\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.LogicalOperationType\",\"name\":\"logOpType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"leftOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"rightOperationIndex\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.LogicalOperation[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getOperations\",\"outputs\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CombinedOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.Operation[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getRuleData\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CombinedOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.Operation[]\",\"name\":\"operations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CheckOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"internalType\":\"struct IRuleEntitlement.CheckOperation[]\",\"name\":\"checkOperations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.LogicalOperationType\",\"name\":\"logOpType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"leftOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"rightOperationIndex\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.LogicalOperation[]\",\"name\":\"logicalOperations\",\"type\":\"tuple[]\"}],\"internalType\":\"struct IRuleEntitlement.RuleData\",\"name\":\"data\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"space\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isCrosschain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"user\",\"type\":\"address[]\"},{\"internalType\":\"bytes32\",\"name\":\"permission\",\"type\":\"bytes32\"}],\"name\":\"isEntitled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"moduleType\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"removeEntitlement\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"entitlementData\",\"type\":\"bytes\"}],\"name\":\"setEntitlement\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getEntitlementDataByRoleId(uint256)\":{\"params\":{\"roleId\":\"the roleId to fetch the entitlement data for\"},\"returns\":{\"_0\":\"entitlementData array for the role\"}},\"isCrosschain()\":{\"returns\":{\"_0\":\"whether this entitlement will require crosschain evaluation\"}},\"isEntitled(bytes32,address[],bytes32)\":{\"params\":{\"channelId\":\"id of the channel to check, if empty, checks space\",\"permission\":\"the permission to check\",\"user\":\"address of the user to check\"},\"returns\":{\"_0\":\"whether the user is entitled to the permission\"}},\"removeEntitlement(uint256)\":{\"params\":{\"roleId\":\"id of the role to remove\"}},\"setEntitlement(uint256,bytes)\":{\"params\":{\"entitlementData\":\"abi encoded array of data necessary to set the entitlement\",\"roleId\":\"id of the role to gate\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"description()\":{\"notice\":\"The description of the entitlement module\"},\"getEntitlementDataByRoleId(uint256)\":{\"notice\":\"fetches the entitlement data for a roleId\"},\"initialize(address)\":{\"notice\":\"initializes the entitlement module\"},\"isCrosschain()\":{\"notice\":\"some entitlements require cross chain evaluation and may not be executed directly from other contracts\"},\"isEntitled(bytes32,address[],bytes32)\":{\"notice\":\"checks whether a user is has a given permission for a channel or a space\"},\"moduleType()\":{\"notice\":\"The type of the entitlement module\"},\"name()\":{\"notice\":\"The name of the entitlement module\"},\"removeEntitlement(uint256)\":{\"notice\":\"removes an entitlement\"},\"setEntitlement(uint256,bytes)\":{\"notice\":\"sets a new entitlement\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol\":\"IRuleEntitlement\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/spaces/entitlements/IEntitlement.sol\":{\"keccak256\":\"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3\",\"dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf\"]},\"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol\":{\"keccak256\":\"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1\",\"dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"type":"error","name":"CheckOperationsLimitReaced"},{"inputs":[],"type":"error","name":"Entitlement__InvalidValue"},{"inputs":[],"type":"error","name":"Entitlement__NotAllowed"},{"inputs":[],"type":"error","name":"Entitlement__NotMember"},{"inputs":[],"type":"error","name":"Entitlement__ValueAlreadyExists"},{"inputs":[{"internalType":"uint8","name":"operationIndex","type":"uint8"},{"internalType":"uint8","name":"checkOperationsLength","type":"uint8"}],"type":"error","name":"InvalidCheckOperationIndex"},{"inputs":[{"internalType":"uint8","name":"leftOperationIndex","type":"uint8"},{"internalType":"uint8","name":"currentOperationIndex","type":"uint8"}],"type":"error","name":"InvalidLeftOperationIndex"},{"inputs":[{"internalType":"uint8","name":"operationIndex","type":"uint8"},{"internalType":"uint8","name":"logicalOperationsLength","type":"uint8"}],"type":"error","name":"InvalidLogicalOperationIndex"},{"inputs":[{"internalType":"enum IRuleEntitlement.CombinedOperationType","name":"opType","type":"uint8"}],"type":"error","name":"InvalidOperationType"},{"inputs":[{"internalType":"uint8","name":"rightOperationIndex","type":"uint8"},{"internalType":"uint8","name":"currentOperationIndex","type":"uint8"}],"type":"error","name":"InvalidRightOperationIndex"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"type":"error","name":"LogicalOperationLimitReached"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"type":"error","name":"OperationsLimitReached"},{"inputs":[],"stateMutability":"view","type":"function","name":"description","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"struct IRuleEntitlement.RuleData","name":"data","type":"tuple","components":[{"internalType":"struct IRuleEntitlement.Operation[]","name":"operations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CombinedOperationType","name":"opType","type":"uint8"},{"internalType":"uint8","name":"index","type":"uint8"}]},{"internalType":"struct IRuleEntitlement.CheckOperation[]","name":"checkOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CheckOperationType","name":"opType","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"threshold","type":"uint256"}]},{"internalType":"struct IRuleEntitlement.LogicalOperation[]","name":"logicalOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.LogicalOperationType","name":"logOpType","type":"uint8"},{"internalType":"uint8","name":"leftOperationIndex","type":"uint8"},{"internalType":"uint8","name":"rightOperationIndex","type":"uint8"}]}]}],"stateMutability":"pure","type":"function","name":"encodeRuleData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getCheckOperations","outputs":[{"internalType":"struct IRuleEntitlement.CheckOperation[]","name":"","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CheckOperationType","name":"opType","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"threshold","type":"uint256"}]}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getEntitlementDataByRoleId","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getLogicalOperations","outputs":[{"internalType":"struct IRuleEntitlement.LogicalOperation[]","name":"","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.LogicalOperationType","name":"logOpType","type":"uint8"},{"internalType":"uint8","name":"leftOperationIndex","type":"uint8"},{"internalType":"uint8","name":"rightOperationIndex","type":"uint8"}]}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getOperations","outputs":[{"internalType":"struct IRuleEntitlement.Operation[]","name":"","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CombinedOperationType","name":"opType","type":"uint8"},{"internalType":"uint8","name":"index","type":"uint8"}]}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getRuleData","outputs":[{"internalType":"struct IRuleEntitlement.RuleData","name":"data","type":"tuple","components":[{"internalType":"struct IRuleEntitlement.Operation[]","name":"operations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CombinedOperationType","name":"opType","type":"uint8"},{"internalType":"uint8","name":"index","type":"uint8"}]},{"internalType":"struct IRuleEntitlement.CheckOperation[]","name":"checkOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CheckOperationType","name":"opType","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"threshold","type":"uint256"}]},{"internalType":"struct IRuleEntitlement.LogicalOperation[]","name":"logicalOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.LogicalOperationType","name":"logOpType","type":"uint8"},{"internalType":"uint8","name":"leftOperationIndex","type":"uint8"},{"internalType":"uint8","name":"rightOperationIndex","type":"uint8"}]}]}]},{"inputs":[{"internalType":"address","name":"space","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"view","type":"function","name":"isCrosschain","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"},{"internalType":"address[]","name":"user","type":"address[]"},{"internalType":"bytes32","name":"permission","type":"bytes32"}],"stateMutability":"view","type":"function","name":"isEntitled","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"moduleType","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"removeEntitlement"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"bytes","name":"entitlementData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"setEntitlement"}],"devdoc":{"kind":"dev","methods":{"getEntitlementDataByRoleId(uint256)":{"params":{"roleId":"the roleId to fetch the entitlement data for"},"returns":{"_0":"entitlementData array for the role"}},"isCrosschain()":{"returns":{"_0":"whether this entitlement will require crosschain evaluation"}},"isEntitled(bytes32,address[],bytes32)":{"params":{"channelId":"id of the channel to check, if empty, checks space","permission":"the permission to check","user":"address of the user to check"},"returns":{"_0":"whether the user is entitled to the permission"}},"removeEntitlement(uint256)":{"params":{"roleId":"id of the role to remove"}},"setEntitlement(uint256,bytes)":{"params":{"entitlementData":"abi encoded array of data necessary to set the entitlement","roleId":"id of the role to gate"}}},"version":1},"userdoc":{"kind":"user","methods":{"description()":{"notice":"The description of the entitlement module"},"getEntitlementDataByRoleId(uint256)":{"notice":"fetches the entitlement data for a roleId"},"initialize(address)":{"notice":"initializes the entitlement module"},"isCrosschain()":{"notice":"some entitlements require cross chain evaluation and may not be executed directly from other contracts"},"isEntitled(bytes32,address[],bytes32)":{"notice":"checks whether a user is has a given permission for a channel or a space"},"moduleType()":{"notice":"The type of the entitlement module"},"name()":{"notice":"The name of the entitlement module"},"removeEntitlement(uint256)":{"notice":"removes an entitlement"},"setEntitlement(uint256,bytes)":{"notice":"sets a new entitlement"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol":"IRuleEntitlement"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/spaces/entitlements/IEntitlement.sol":{"keccak256":"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca","urls":["bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3","dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol":{"keccak256":"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf","urls":["bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1","dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97"],"license":"MIT"}},"version":1},"id":188} \ No newline at end of file diff --git a/packages/generated/dev/abis/IRuleEntitlement.metadata.json b/packages/generated/dev/abis/IRuleEntitlement.metadata.json new file mode 100644 index 000000000..4ea790861 --- /dev/null +++ b/packages/generated/dev/abis/IRuleEntitlement.metadata.json @@ -0,0 +1,678 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + } + ], + "type": "error", + "name": "CheckOperationsLimitReaced" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__InvalidValue" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotAllowed" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotMember" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__ValueAlreadyExists" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "operationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "checkOperationsLength", + "type": "uint8" + } + ], + "type": "error", + "name": "InvalidCheckOperationIndex" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "leftOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "currentOperationIndex", + "type": "uint8" + } + ], + "type": "error", + "name": "InvalidLeftOperationIndex" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "operationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "logicalOperationsLength", + "type": "uint8" + } + ], + "type": "error", + "name": "InvalidLogicalOperationIndex" + }, + { + "inputs": [ + { + "internalType": "enum IRuleEntitlement.CombinedOperationType", + "name": "opType", + "type": "uint8" + } + ], + "type": "error", + "name": "InvalidOperationType" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "rightOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "currentOperationIndex", + "type": "uint8" + } + ], + "type": "error", + "name": "InvalidRightOperationIndex" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + } + ], + "type": "error", + "name": "LogicalOperationLimitReached" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + } + ], + "type": "error", + "name": "OperationsLimitReached" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "description", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "struct IRuleEntitlement.RuleData", + "name": "data", + "type": "tuple", + "components": [ + { + "internalType": "struct IRuleEntitlement.Operation[]", + "name": "operations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CombinedOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "index", + "type": "uint8" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "name": "checkOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CheckOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "name": "logicalOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.LogicalOperationType", + "name": "logOpType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "leftOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "rightOperationIndex", + "type": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "pure", + "type": "function", + "name": "encodeRuleData", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getCheckOperations", + "outputs": [ + { + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CheckOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getEntitlementDataByRoleId", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getLogicalOperations", + "outputs": [ + { + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.LogicalOperationType", + "name": "logOpType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "leftOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "rightOperationIndex", + "type": "uint8" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getOperations", + "outputs": [ + { + "internalType": "struct IRuleEntitlement.Operation[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CombinedOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "index", + "type": "uint8" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getRuleData", + "outputs": [ + { + "internalType": "struct IRuleEntitlement.RuleData", + "name": "data", + "type": "tuple", + "components": [ + { + "internalType": "struct IRuleEntitlement.Operation[]", + "name": "operations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CombinedOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "index", + "type": "uint8" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "name": "checkOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CheckOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "name": "logicalOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.LogicalOperationType", + "name": "logOpType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "leftOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "rightOperationIndex", + "type": "uint8" + } + ] + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "space", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "initialize" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "isCrosschain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "user", + "type": "address[]" + }, + { + "internalType": "bytes32", + "name": "permission", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isEntitled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "moduleType", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeEntitlement" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "entitlementData", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setEntitlement" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "getEntitlementDataByRoleId(uint256)": { + "params": { + "roleId": "the roleId to fetch the entitlement data for" + }, + "returns": { + "_0": "entitlementData array for the role" + } + }, + "isCrosschain()": { + "returns": { + "_0": "whether this entitlement will require crosschain evaluation" + } + }, + "isEntitled(bytes32,address[],bytes32)": { + "params": { + "channelId": "id of the channel to check, if empty, checks space", + "permission": "the permission to check", + "user": "address of the user to check" + }, + "returns": { + "_0": "whether the user is entitled to the permission" + } + }, + "removeEntitlement(uint256)": { + "params": { + "roleId": "id of the role to remove" + } + }, + "setEntitlement(uint256,bytes)": { + "params": { + "entitlementData": "abi encoded array of data necessary to set the entitlement", + "roleId": "id of the role to gate" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "description()": { + "notice": "The description of the entitlement module" + }, + "getEntitlementDataByRoleId(uint256)": { + "notice": "fetches the entitlement data for a roleId" + }, + "initialize(address)": { + "notice": "initializes the entitlement module" + }, + "isCrosschain()": { + "notice": "some entitlements require cross chain evaluation and may not be executed directly from other contracts" + }, + "isEntitled(bytes32,address[],bytes32)": { + "notice": "checks whether a user is has a given permission for a channel or a space" + }, + "moduleType()": { + "notice": "The type of the entitlement module" + }, + "name()": { + "notice": "The name of the entitlement module" + }, + "removeEntitlement(uint256)": { + "notice": "removes an entitlement" + }, + "setEntitlement(uint256,bytes)": { + "notice": "sets a new entitlement" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol": "IRuleEntitlement" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/spaces/entitlements/IEntitlement.sol": { + "keccak256": "0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca", + "urls": [ + "bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3", + "dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol": { + "keccak256": "0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf", + "urls": [ + "bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1", + "dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/Member.abi.json b/packages/generated/dev/abis/Member.abi.json new file mode 100644 index 000000000..ee2e9072f --- /dev/null +++ b/packages/generated/dev/abis/Member.abi.json @@ -0,0 +1,795 @@ +[ + { + "type": "constructor", + "inputs": [ + { + "name": "name_", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol_", + "type": "string", + "internalType": "string" + }, + { + "name": "baseURI_", + "type": "string", + "internalType": "string" + }, + { + "name": "merkleRoot_", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "MINT_PRICE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "TOTAL_SUPPLY", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_hasMinted", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "baseURI", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "currentTokenId", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getApproved", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isApprovedForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ownerOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "privateMint", + "inputs": [ + { + "name": "recipient", + "type": "address", + "internalType": "address" + }, + { + "name": "allowance", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "proof", + "type": "bytes32[]", + "internalType": "bytes32[]" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "publicMint", + "inputs": [ + { + "name": "recipient", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setApprovalForAll", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setBaseURI", + "inputs": [ + { + "name": "baseURI_", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "startPublicMint", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "startWaitlistMint", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "supportsInterface", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenURI", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "withdrawPayments", + "inputs": [ + { + "name": "payee", + "type": "address", + "internalType": "address payable" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MintStateChanged", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "prevState", + "type": "uint8", + "indexed": true, + "internalType": "enum Member.MintState" + }, + { + "name": "newState", + "type": "uint8", + "indexed": true, + "internalType": "enum Member.MintState" + }, + { + "name": "timestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Minted", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "timestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AlreadyMinted", + "inputs": [] + }, + { + "type": "error", + "name": "ERC721IncorrectOwner", + "inputs": [ + { + "name": "sender", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InsufficientApproval", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidApprover", + "inputs": [ + { + "name": "approver", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidReceiver", + "inputs": [ + { + "name": "receiver", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidSender", + "inputs": [ + { + "name": "sender", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721NonexistentToken", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidMintState", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidProof", + "inputs": [] + }, + { + "type": "error", + "name": "MaxSupplyReached", + "inputs": [] + }, + { + "type": "error", + "name": "MintPriceNotPaid", + "inputs": [] + }, + { + "type": "error", + "name": "NonExistentTokenURI", + "inputs": [] + }, + { + "type": "error", + "name": "NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "OwnableInvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "OwnableUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "WithdrawTransfer", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/Member.abi.ts b/packages/generated/dev/abis/Member.abi.ts new file mode 100644 index 000000000..725a2f5f3 --- /dev/null +++ b/packages/generated/dev/abis/Member.abi.ts @@ -0,0 +1,795 @@ +export default [ + { + "type": "constructor", + "inputs": [ + { + "name": "name_", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol_", + "type": "string", + "internalType": "string" + }, + { + "name": "baseURI_", + "type": "string", + "internalType": "string" + }, + { + "name": "merkleRoot_", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "MINT_PRICE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "TOTAL_SUPPLY", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_hasMinted", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "baseURI", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "currentTokenId", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getApproved", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isApprovedForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ownerOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "privateMint", + "inputs": [ + { + "name": "recipient", + "type": "address", + "internalType": "address" + }, + { + "name": "allowance", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "proof", + "type": "bytes32[]", + "internalType": "bytes32[]" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "publicMint", + "inputs": [ + { + "name": "recipient", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setApprovalForAll", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setBaseURI", + "inputs": [ + { + "name": "baseURI_", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "startPublicMint", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "startWaitlistMint", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "supportsInterface", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenURI", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "withdrawPayments", + "inputs": [ + { + "name": "payee", + "type": "address", + "internalType": "address payable" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MintStateChanged", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "prevState", + "type": "uint8", + "indexed": true, + "internalType": "enum Member.MintState" + }, + { + "name": "newState", + "type": "uint8", + "indexed": true, + "internalType": "enum Member.MintState" + }, + { + "name": "timestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Minted", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "timestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AlreadyMinted", + "inputs": [] + }, + { + "type": "error", + "name": "ERC721IncorrectOwner", + "inputs": [ + { + "name": "sender", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InsufficientApproval", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidApprover", + "inputs": [ + { + "name": "approver", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidReceiver", + "inputs": [ + { + "name": "receiver", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidSender", + "inputs": [ + { + "name": "sender", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721NonexistentToken", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidMintState", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidProof", + "inputs": [] + }, + { + "type": "error", + "name": "MaxSupplyReached", + "inputs": [] + }, + { + "type": "error", + "name": "MintPriceNotPaid", + "inputs": [] + }, + { + "type": "error", + "name": "NonExistentTokenURI", + "inputs": [] + }, + { + "type": "error", + "name": "NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "OwnableInvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "OwnableUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "WithdrawTransfer", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/Member.bin b/packages/generated/dev/abis/Member.bin new file mode 100644 index 000000000..2d7a6db63 --- /dev/null +++ b/packages/generated/dev/abis/Member.bin @@ -0,0 +1 @@ +60a06040523480156200001157600080fd5b5060405162001d7438038062001d748339810160408190526200003491620001d1565b3384846000620000458382620002fb565b506001620000548282620002fb565b5050506001600160a01b0381166200008657604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6200009181620000b7565b506007620000a08382620002fb565b5060805250506009805460ff1916905550620003c7565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200013157600080fd5b81516001600160401b03808211156200014e576200014e62000109565b604051601f8301601f19908116603f0116810190828211818310171562000179576200017962000109565b81604052838152602092508660208588010111156200019757600080fd5b600091505b83821015620001bb57858201830151818301840152908201906200019c565b6000602085830101528094505050505092915050565b60008060008060808587031215620001e857600080fd5b84516001600160401b03808211156200020057600080fd5b6200020e888389016200011f565b955060208701519150808211156200022557600080fd5b62000233888389016200011f565b945060408701519150808211156200024a57600080fd5b5062000259878288016200011f565b606096909601519497939650505050565b600181811c908216806200027f57607f821691505b602082108103620002a057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002f6576000816000526020600020601f850160051c81016020861015620002d15750805b601f850160051c820191505b81811015620002f257828155600101620002dd565b5050505b505050565b81516001600160401b0381111562000317576200031762000109565b6200032f816200032884546200026a565b84620002a6565b602080601f8311600181146200036757600084156200034e5750858301515b600019600386901b1c1916600185901b178555620002f2565b600085815260208120601f198616915b82811015620003985788860151825594840194600190910190840162000377565b5085821015620003b75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b608051611991620003e3600039600061093a01526119916000f3fe60806040526004361061019b5760003560e01c8063715018a6116100ec578063a839e5011161008a578063c87b56dd11610064578063c87b56dd14610454578063d92d1bd614610474578063e985e9c5146104a4578063f2fde38b146104c457600080fd5b8063a839e50114610403578063b88d4fde14610418578063c002d23d1461043857600080fd5b8063902d55a5116100c6578063902d55a5146103a557806395d89b41146103bb5780639886a902146103d0578063a22cb465146103e357600080fd5b8063715018a61461035d57806376c64c62146103725780638da5cb5b1461038757600080fd5b806331b3eb941161015957806355f804b31161013357806355f804b3146102e85780636352211e146103085780636c0360eb1461032857806370a082311461033d57600080fd5b806331b3eb941461029557806332a93a3a146102b557806342842e0e146102c857600080fd5b80629a9b7b146101a057806301ffc9a7146101c957806306fdde03146101f9578063081812fc1461021b578063095ea7b31461025357806323b872dd14610275575b600080fd5b3480156101ac57600080fd5b506101b6600a5481565b6040519081526020015b60405180910390f35b3480156101d557600080fd5b506101e96101e436600461139c565b6104e4565b60405190151581526020016101c0565b34801561020557600080fd5b5061020e610536565b6040516101c091906113ff565b34801561022757600080fd5b5061023b610236366004611412565b6105c8565b6040516001600160a01b0390911681526020016101c0565b34801561025f57600080fd5b5061027361026e366004611440565b6105f1565b005b34801561028157600080fd5b5061027361029036600461146c565b610600565b3480156102a157600080fd5b506102736102b03660046114ad565b610690565b6101b66102c33660046114ad565b610711565b3480156102d457600080fd5b506102736102e336600461146c565b610748565b3480156102f457600080fd5b50610273610303366004611556565b610763565b34801561031457600080fd5b5061023b610323366004611412565b610777565b34801561033457600080fd5b5061020e610782565b34801561034957600080fd5b506101b66103583660046114ad565b610810565b34801561036957600080fd5b50610273610858565b34801561037e57600080fd5b5061027361086c565b34801561039357600080fd5b506006546001600160a01b031661023b565b3480156103b157600080fd5b506101b66109c481565b3480156103c757600080fd5b5061020e610888565b6101b66103de36600461159f565b610897565b3480156103ef57600080fd5b506102736103fe36600461162b565b610995565b34801561040f57600080fd5b506102736109a0565b34801561042457600080fd5b50610273610433366004611669565b6109bc565b34801561044457600080fd5b506101b667011c37937e08000081565b34801561046057600080fd5b5061020e61046f366004611412565b6109d3565b34801561048057600080fd5b506101e961048f3660046114ad565b60086020526000908152604090205460ff1681565b3480156104b057600080fd5b506101e96104bf3660046116e9565b610a59565b3480156104d057600080fd5b506102736104df3660046114ad565b610a87565b60006001600160e01b031982166380ac58cd60e01b148061051557506001600160e01b03198216635b5e139f60e01b145b8061053057506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461054590611717565b80601f016020809104026020016040519081016040528092919081815260200182805461057190611717565b80156105be5780601f10610593576101008083540402835291602001916105be565b820191906000526020600020905b8154815290600101906020018083116105a157829003601f168201915b5050505050905090565b60006105d382610ac5565b506000828152600460205260409020546001600160a01b0316610530565b6105fc828233610afe565b5050565b6001600160a01b03821661062f57604051633250574960e11b8152600060048201526024015b60405180910390fd5b600061063c838333610b0b565b9050836001600160a01b0316816001600160a01b03161461068a576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610626565b50505050565b610698610c04565b60405147906000906001600160a01b0384169083908381818185875af1925050503d80600081146106e5576040519150601f19603f3d011682016040523d82523d6000602084013e6106ea565b606091505b505090508061070c5760405163d23a9e8960e01b815260040160405180910390fd5b505050565b600061071c82610c31565b610724610c58565b61072c610c80565b61073582610ca4565b61073f6002610cde565b61053082610d25565b61070c838383604051806020016040528060008152506109bc565b61076b610c04565b60076105fc82826117a1565b600061053082610ac5565b6007805461078f90611717565b80601f01602080910402602001604051908101604052809291908181526020018280546107bb90611717565b80156108085780601f106107dd57610100808354040283529160200191610808565b820191906000526020600020905b8154815290600101906020018083116107eb57829003601f168201915b505050505081565b60006001600160a01b03821661083c576040516322718ad960e21b815260006004820152602401610626565b506001600160a01b031660009081526003602052604090205490565b610860610c04565b61086a6000610db1565b565b610874610c04565b61087e6001610cde565b61086a6002610e03565b60606001805461054590611717565b60006108a285610c31565b6108aa610c58565b6108b2610c80565b6108bb85610ca4565b6108c484610e88565b6040516bffffffffffffffffffffffff19606087901b166020820152603481018590526000906054016040516020818303038152906040528051906020012090506109658484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f00000000000000000000000000000000000000000000000000000000000000009250859150610ecd9050565b610982576040516309bde33960e01b815260040160405180910390fd5b61098b86610d25565b9695505050505050565b6105fc338383610ee3565b6109a8610c04565b6109b26000610cde565b61086a6001610e03565b6109c7848484610600565b61068a84848484610f82565b606060006109e083610777565b6001600160a01b031603610a075760405163d872946b60e01b815260040160405180910390fd5b600060078054610a1690611717565b905011610a325760405180602001604052806000815250610530565b6007604051602001610a449190611861565b60405160208183030381529060405292915050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610a8f610c04565b6001600160a01b038116610ab957604051631e4fbdf760e01b815260006004820152602401610626565b610ac281610db1565b50565b6000818152600260205260408120546001600160a01b03168061053057604051637e27328960e01b815260048101849052602401610626565b61070c83838360016110ab565b6000828152600260205260408120546001600160a01b0390811690831615610b3857610b388184866111b1565b6001600160a01b03811615610b7657610b556000856000806110ab565b6001600160a01b038116600090815260036020526040902080546000190190555b6001600160a01b03851615610ba5576001600160a01b0385166000908152600360205260409020805460010190555b60008481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6006546001600160a01b0316331461086a5760405163118cdaa760e01b8152336004820152602401610626565b6001600160a01b038116610ac25760405163e6c4247b60e01b815260040160405180910390fd5b67011c37937e080000341461086a576040516310f0c8f160e11b815260040160405180910390fd5b6109c4600a541061086a5760405163d05cb60960e01b815260040160405180910390fd5b6001600160a01b03811660009081526008602052604090205460ff1615610ac257604051631bbdf5c560e31b815260040160405180910390fd5b806002811115610cf057610cf06118ee565b60095460ff166002811115610d0757610d076118ee565b14610ac25760405163a1f6623960e01b815260040160405180910390fd5b6001600160a01b0381166000908152600860205260408120805460ff19166001179055600a805490819083610d5983611904565b9190505550610d688382611215565b604080518281524260208201526001600160a01b038516917f25b428dfde728ccfaddad7e29e4ac23c24ed7fd1a6e3e3f91894a9a073f5dfff910160405180910390a292915050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6009805460ff811691839160ff19166001836002811115610e2657610e266118ee565b0217905550816002811115610e3d57610e3d6118ee565b816002811115610e4f57610e4f6118ee565b60405142815233907f7a5907205f46c7df4a68b33c1da8921886b57f025f0ec67a42c38d2c2013a7849060200160405180910390a45050565b600060095460ff166002811115610ea157610ea16118ee565b148015610eaf575080600114155b15610ac257604051631eb49d6d60e11b815260040160405180910390fd5b600082610eda858461122f565b14949350505050565b6001600160a01b038216610f1557604051630b61174360e31b81526001600160a01b0383166004820152602401610626565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561068a57604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290610fc490339088908790879060040161192b565b6020604051808303816000875af1925050508015610fff575060408051601f3d908101601f19168201909252610ffc9181019061195e565b60015b611068573d80801561102d576040519150601f19603f3d011682016040523d82523d6000602084013e611032565b606091505b50805160000361106057604051633250574960e11b81526001600160a01b0385166004820152602401610626565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146110a457604051633250574960e11b81526001600160a01b0385166004820152602401610626565b5050505050565b80806110bf57506001600160a01b03821615155b156111815760006110cf84610ac5565b90506001600160a01b038316158015906110fb5750826001600160a01b0316816001600160a01b031614155b801561110e575061110c8184610a59565b155b156111375760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610626565b811561117f5783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6111bc838383611272565b61070c576001600160a01b0383166111ea57604051637e27328960e01b815260048101829052602401610626565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610626565b6105fc8282604051806020016040528060008152506112d8565b600081815b845181101561126a57611260828683815181106112535761125361197b565b60200260200101516112ef565b9150600101611234565b509392505050565b60006001600160a01b038316158015906112d05750826001600160a01b0316846001600160a01b031614806112ac57506112ac8484610a59565b806112d057506000828152600460205260409020546001600160a01b038481169116145b949350505050565b6112e28383611321565b61070c6000848484610f82565b600081831061130b57600082815260208490526040902061131a565b60008381526020839052604090205b9392505050565b6001600160a01b03821661134b57604051633250574960e11b815260006004820152602401610626565b600061135983836000610b0b565b90506001600160a01b0381161561070c576040516339e3563760e11b815260006004820152602401610626565b6001600160e01b031981168114610ac257600080fd5b6000602082840312156113ae57600080fd5b813561131a81611386565b6000815180845260005b818110156113df576020818501810151868301820152016113c3565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061131a60208301846113b9565b60006020828403121561142457600080fd5b5035919050565b6001600160a01b0381168114610ac257600080fd5b6000806040838503121561145357600080fd5b823561145e8161142b565b946020939093013593505050565b60008060006060848603121561148157600080fd5b833561148c8161142b565b9250602084013561149c8161142b565b929592945050506040919091013590565b6000602082840312156114bf57600080fd5b813561131a8161142b565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156114fb576114fb6114ca565b604051601f8501601f19908116603f01168101908282118183101715611523576115236114ca565b8160405280935085815286868601111561153c57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561156857600080fd5b813567ffffffffffffffff81111561157f57600080fd5b8201601f8101841361159057600080fd5b6112d0848235602084016114e0565b600080600080606085870312156115b557600080fd5b84356115c08161142b565b935060208501359250604085013567ffffffffffffffff808211156115e457600080fd5b818701915087601f8301126115f857600080fd5b81358181111561160757600080fd5b8860208260051b850101111561161c57600080fd5b95989497505060200194505050565b6000806040838503121561163e57600080fd5b82356116498161142b565b91506020830135801515811461165e57600080fd5b809150509250929050565b6000806000806080858703121561167f57600080fd5b843561168a8161142b565b9350602085013561169a8161142b565b925060408501359150606085013567ffffffffffffffff8111156116bd57600080fd5b8501601f810187136116ce57600080fd5b6116dd878235602084016114e0565b91505092959194509250565b600080604083850312156116fc57600080fd5b82356117078161142b565b9150602083013561165e8161142b565b600181811c9082168061172b57607f821691505b60208210810361174b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561070c576000816000526020600020601f850160051c8101602086101561177a5750805b601f850160051c820191505b8181101561179957828155600101611786565b505050505050565b815167ffffffffffffffff8111156117bb576117bb6114ca565b6117cf816117c98454611717565b84611751565b602080601f83116001811461180457600084156117ec5750858301515b600019600386901b1c1916600185901b178555611799565b600085815260208120601f198616915b8281101561183357888601518255948401946001909101908401611814565b50858210156118515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600080835461186f81611717565b60018281168015611887576001811461189c576118cb565b60ff19841687528215158302870194506118cb565b8760005260208060002060005b858110156118c25781548a8201529084019082016118a9565b50505082870194505b50506e636f756e63696c6d6574616461746160881b83525050600f019392505050565b634e487b7160e01b600052602160045260246000fd5b60006001820161192457634e487b7160e01b600052601160045260246000fd5b5060010190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061098b908301846113b9565b60006020828403121561197057600080fd5b815161131a81611386565b634e487b7160e01b600052603260045260246000fd \ No newline at end of file diff --git a/packages/generated/dev/abis/Member.json b/packages/generated/dev/abis/Member.json new file mode 100644 index 000000000..ff2f6a571 --- /dev/null +++ b/packages/generated/dev/abis/Member.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"name_","type":"string","internalType":"string"},{"name":"symbol_","type":"string","internalType":"string"},{"name":"baseURI_","type":"string","internalType":"string"},{"name":"merkleRoot_","type":"bytes32","internalType":"bytes32"}],"stateMutability":"nonpayable"},{"type":"function","name":"MINT_PRICE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"TOTAL_SUPPLY","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"_hasMinted","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"approve","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"balanceOf","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"baseURI","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"currentTokenId","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getApproved","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"isApprovedForAll","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"ownerOf","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"privateMint","inputs":[{"name":"recipient","type":"address","internalType":"address"},{"name":"allowance","type":"uint256","internalType":"uint256"},{"name":"proof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"type":"function","name":"publicMint","inputs":[{"name":"recipient","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setApprovalForAll","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setBaseURI","inputs":[{"name":"baseURI_","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"startPublicMint","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"startWaitlistMint","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"tokenURI","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"withdrawPayments","inputs":[{"name":"payee","type":"address","internalType":"address payable"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"MintStateChanged","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"prevState","type":"uint8","indexed":true,"internalType":"enum Member.MintState"},{"name":"newState","type":"uint8","indexed":true,"internalType":"enum Member.MintState"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Minted","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"AlreadyMinted","inputs":[]},{"type":"error","name":"ERC721IncorrectOwner","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"ERC721InsufficientApproval","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC721InvalidApprover","inputs":[{"name":"approver","type":"address","internalType":"address"}]},{"type":"error","name":"ERC721InvalidOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}]},{"type":"error","name":"ERC721InvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"ERC721InvalidReceiver","inputs":[{"name":"receiver","type":"address","internalType":"address"}]},{"type":"error","name":"ERC721InvalidSender","inputs":[{"name":"sender","type":"address","internalType":"address"}]},{"type":"error","name":"ERC721NonexistentToken","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidAddress","inputs":[]},{"type":"error","name":"InvalidMintState","inputs":[]},{"type":"error","name":"InvalidProof","inputs":[]},{"type":"error","name":"MaxSupplyReached","inputs":[]},{"type":"error","name":"MintPriceNotPaid","inputs":[]},{"type":"error","name":"NonExistentTokenURI","inputs":[]},{"type":"error","name":"NotAllowed","inputs":[]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"WithdrawTransfer","inputs":[]}],"bytecode":{"object":"0x60a06040523480156200001157600080fd5b5060405162001d7438038062001d748339810160408190526200003491620001d1565b3384846000620000458382620002fb565b506001620000548282620002fb565b5050506001600160a01b0381166200008657604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6200009181620000b7565b506007620000a08382620002fb565b5060805250506009805460ff1916905550620003c7565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200013157600080fd5b81516001600160401b03808211156200014e576200014e62000109565b604051601f8301601f19908116603f0116810190828211818310171562000179576200017962000109565b81604052838152602092508660208588010111156200019757600080fd5b600091505b83821015620001bb57858201830151818301840152908201906200019c565b6000602085830101528094505050505092915050565b60008060008060808587031215620001e857600080fd5b84516001600160401b03808211156200020057600080fd5b6200020e888389016200011f565b955060208701519150808211156200022557600080fd5b62000233888389016200011f565b945060408701519150808211156200024a57600080fd5b5062000259878288016200011f565b606096909601519497939650505050565b600181811c908216806200027f57607f821691505b602082108103620002a057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002f6576000816000526020600020601f850160051c81016020861015620002d15750805b601f850160051c820191505b81811015620002f257828155600101620002dd565b5050505b505050565b81516001600160401b0381111562000317576200031762000109565b6200032f816200032884546200026a565b84620002a6565b602080601f8311600181146200036757600084156200034e5750858301515b600019600386901b1c1916600185901b178555620002f2565b600085815260208120601f198616915b82811015620003985788860151825594840194600190910190840162000377565b5085821015620003b75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b608051611991620003e3600039600061093a01526119916000f3fe60806040526004361061019b5760003560e01c8063715018a6116100ec578063a839e5011161008a578063c87b56dd11610064578063c87b56dd14610454578063d92d1bd614610474578063e985e9c5146104a4578063f2fde38b146104c457600080fd5b8063a839e50114610403578063b88d4fde14610418578063c002d23d1461043857600080fd5b8063902d55a5116100c6578063902d55a5146103a557806395d89b41146103bb5780639886a902146103d0578063a22cb465146103e357600080fd5b8063715018a61461035d57806376c64c62146103725780638da5cb5b1461038757600080fd5b806331b3eb941161015957806355f804b31161013357806355f804b3146102e85780636352211e146103085780636c0360eb1461032857806370a082311461033d57600080fd5b806331b3eb941461029557806332a93a3a146102b557806342842e0e146102c857600080fd5b80629a9b7b146101a057806301ffc9a7146101c957806306fdde03146101f9578063081812fc1461021b578063095ea7b31461025357806323b872dd14610275575b600080fd5b3480156101ac57600080fd5b506101b6600a5481565b6040519081526020015b60405180910390f35b3480156101d557600080fd5b506101e96101e436600461139c565b6104e4565b60405190151581526020016101c0565b34801561020557600080fd5b5061020e610536565b6040516101c091906113ff565b34801561022757600080fd5b5061023b610236366004611412565b6105c8565b6040516001600160a01b0390911681526020016101c0565b34801561025f57600080fd5b5061027361026e366004611440565b6105f1565b005b34801561028157600080fd5b5061027361029036600461146c565b610600565b3480156102a157600080fd5b506102736102b03660046114ad565b610690565b6101b66102c33660046114ad565b610711565b3480156102d457600080fd5b506102736102e336600461146c565b610748565b3480156102f457600080fd5b50610273610303366004611556565b610763565b34801561031457600080fd5b5061023b610323366004611412565b610777565b34801561033457600080fd5b5061020e610782565b34801561034957600080fd5b506101b66103583660046114ad565b610810565b34801561036957600080fd5b50610273610858565b34801561037e57600080fd5b5061027361086c565b34801561039357600080fd5b506006546001600160a01b031661023b565b3480156103b157600080fd5b506101b66109c481565b3480156103c757600080fd5b5061020e610888565b6101b66103de36600461159f565b610897565b3480156103ef57600080fd5b506102736103fe36600461162b565b610995565b34801561040f57600080fd5b506102736109a0565b34801561042457600080fd5b50610273610433366004611669565b6109bc565b34801561044457600080fd5b506101b667011c37937e08000081565b34801561046057600080fd5b5061020e61046f366004611412565b6109d3565b34801561048057600080fd5b506101e961048f3660046114ad565b60086020526000908152604090205460ff1681565b3480156104b057600080fd5b506101e96104bf3660046116e9565b610a59565b3480156104d057600080fd5b506102736104df3660046114ad565b610a87565b60006001600160e01b031982166380ac58cd60e01b148061051557506001600160e01b03198216635b5e139f60e01b145b8061053057506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461054590611717565b80601f016020809104026020016040519081016040528092919081815260200182805461057190611717565b80156105be5780601f10610593576101008083540402835291602001916105be565b820191906000526020600020905b8154815290600101906020018083116105a157829003601f168201915b5050505050905090565b60006105d382610ac5565b506000828152600460205260409020546001600160a01b0316610530565b6105fc828233610afe565b5050565b6001600160a01b03821661062f57604051633250574960e11b8152600060048201526024015b60405180910390fd5b600061063c838333610b0b565b9050836001600160a01b0316816001600160a01b03161461068a576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610626565b50505050565b610698610c04565b60405147906000906001600160a01b0384169083908381818185875af1925050503d80600081146106e5576040519150601f19603f3d011682016040523d82523d6000602084013e6106ea565b606091505b505090508061070c5760405163d23a9e8960e01b815260040160405180910390fd5b505050565b600061071c82610c31565b610724610c58565b61072c610c80565b61073582610ca4565b61073f6002610cde565b61053082610d25565b61070c838383604051806020016040528060008152506109bc565b61076b610c04565b60076105fc82826117a1565b600061053082610ac5565b6007805461078f90611717565b80601f01602080910402602001604051908101604052809291908181526020018280546107bb90611717565b80156108085780601f106107dd57610100808354040283529160200191610808565b820191906000526020600020905b8154815290600101906020018083116107eb57829003601f168201915b505050505081565b60006001600160a01b03821661083c576040516322718ad960e21b815260006004820152602401610626565b506001600160a01b031660009081526003602052604090205490565b610860610c04565b61086a6000610db1565b565b610874610c04565b61087e6001610cde565b61086a6002610e03565b60606001805461054590611717565b60006108a285610c31565b6108aa610c58565b6108b2610c80565b6108bb85610ca4565b6108c484610e88565b6040516bffffffffffffffffffffffff19606087901b166020820152603481018590526000906054016040516020818303038152906040528051906020012090506109658484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f00000000000000000000000000000000000000000000000000000000000000009250859150610ecd9050565b610982576040516309bde33960e01b815260040160405180910390fd5b61098b86610d25565b9695505050505050565b6105fc338383610ee3565b6109a8610c04565b6109b26000610cde565b61086a6001610e03565b6109c7848484610600565b61068a84848484610f82565b606060006109e083610777565b6001600160a01b031603610a075760405163d872946b60e01b815260040160405180910390fd5b600060078054610a1690611717565b905011610a325760405180602001604052806000815250610530565b6007604051602001610a449190611861565b60405160208183030381529060405292915050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610a8f610c04565b6001600160a01b038116610ab957604051631e4fbdf760e01b815260006004820152602401610626565b610ac281610db1565b50565b6000818152600260205260408120546001600160a01b03168061053057604051637e27328960e01b815260048101849052602401610626565b61070c83838360016110ab565b6000828152600260205260408120546001600160a01b0390811690831615610b3857610b388184866111b1565b6001600160a01b03811615610b7657610b556000856000806110ab565b6001600160a01b038116600090815260036020526040902080546000190190555b6001600160a01b03851615610ba5576001600160a01b0385166000908152600360205260409020805460010190555b60008481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6006546001600160a01b0316331461086a5760405163118cdaa760e01b8152336004820152602401610626565b6001600160a01b038116610ac25760405163e6c4247b60e01b815260040160405180910390fd5b67011c37937e080000341461086a576040516310f0c8f160e11b815260040160405180910390fd5b6109c4600a541061086a5760405163d05cb60960e01b815260040160405180910390fd5b6001600160a01b03811660009081526008602052604090205460ff1615610ac257604051631bbdf5c560e31b815260040160405180910390fd5b806002811115610cf057610cf06118ee565b60095460ff166002811115610d0757610d076118ee565b14610ac25760405163a1f6623960e01b815260040160405180910390fd5b6001600160a01b0381166000908152600860205260408120805460ff19166001179055600a805490819083610d5983611904565b9190505550610d688382611215565b604080518281524260208201526001600160a01b038516917f25b428dfde728ccfaddad7e29e4ac23c24ed7fd1a6e3e3f91894a9a073f5dfff910160405180910390a292915050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6009805460ff811691839160ff19166001836002811115610e2657610e266118ee565b0217905550816002811115610e3d57610e3d6118ee565b816002811115610e4f57610e4f6118ee565b60405142815233907f7a5907205f46c7df4a68b33c1da8921886b57f025f0ec67a42c38d2c2013a7849060200160405180910390a45050565b600060095460ff166002811115610ea157610ea16118ee565b148015610eaf575080600114155b15610ac257604051631eb49d6d60e11b815260040160405180910390fd5b600082610eda858461122f565b14949350505050565b6001600160a01b038216610f1557604051630b61174360e31b81526001600160a01b0383166004820152602401610626565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561068a57604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290610fc490339088908790879060040161192b565b6020604051808303816000875af1925050508015610fff575060408051601f3d908101601f19168201909252610ffc9181019061195e565b60015b611068573d80801561102d576040519150601f19603f3d011682016040523d82523d6000602084013e611032565b606091505b50805160000361106057604051633250574960e11b81526001600160a01b0385166004820152602401610626565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146110a457604051633250574960e11b81526001600160a01b0385166004820152602401610626565b5050505050565b80806110bf57506001600160a01b03821615155b156111815760006110cf84610ac5565b90506001600160a01b038316158015906110fb5750826001600160a01b0316816001600160a01b031614155b801561110e575061110c8184610a59565b155b156111375760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610626565b811561117f5783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6111bc838383611272565b61070c576001600160a01b0383166111ea57604051637e27328960e01b815260048101829052602401610626565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610626565b6105fc8282604051806020016040528060008152506112d8565b600081815b845181101561126a57611260828683815181106112535761125361197b565b60200260200101516112ef565b9150600101611234565b509392505050565b60006001600160a01b038316158015906112d05750826001600160a01b0316846001600160a01b031614806112ac57506112ac8484610a59565b806112d057506000828152600460205260409020546001600160a01b038481169116145b949350505050565b6112e28383611321565b61070c6000848484610f82565b600081831061130b57600082815260208490526040902061131a565b60008381526020839052604090205b9392505050565b6001600160a01b03821661134b57604051633250574960e11b815260006004820152602401610626565b600061135983836000610b0b565b90506001600160a01b0381161561070c576040516339e3563760e11b815260006004820152602401610626565b6001600160e01b031981168114610ac257600080fd5b6000602082840312156113ae57600080fd5b813561131a81611386565b6000815180845260005b818110156113df576020818501810151868301820152016113c3565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061131a60208301846113b9565b60006020828403121561142457600080fd5b5035919050565b6001600160a01b0381168114610ac257600080fd5b6000806040838503121561145357600080fd5b823561145e8161142b565b946020939093013593505050565b60008060006060848603121561148157600080fd5b833561148c8161142b565b9250602084013561149c8161142b565b929592945050506040919091013590565b6000602082840312156114bf57600080fd5b813561131a8161142b565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156114fb576114fb6114ca565b604051601f8501601f19908116603f01168101908282118183101715611523576115236114ca565b8160405280935085815286868601111561153c57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561156857600080fd5b813567ffffffffffffffff81111561157f57600080fd5b8201601f8101841361159057600080fd5b6112d0848235602084016114e0565b600080600080606085870312156115b557600080fd5b84356115c08161142b565b935060208501359250604085013567ffffffffffffffff808211156115e457600080fd5b818701915087601f8301126115f857600080fd5b81358181111561160757600080fd5b8860208260051b850101111561161c57600080fd5b95989497505060200194505050565b6000806040838503121561163e57600080fd5b82356116498161142b565b91506020830135801515811461165e57600080fd5b809150509250929050565b6000806000806080858703121561167f57600080fd5b843561168a8161142b565b9350602085013561169a8161142b565b925060408501359150606085013567ffffffffffffffff8111156116bd57600080fd5b8501601f810187136116ce57600080fd5b6116dd878235602084016114e0565b91505092959194509250565b600080604083850312156116fc57600080fd5b82356117078161142b565b9150602083013561165e8161142b565b600181811c9082168061172b57607f821691505b60208210810361174b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561070c576000816000526020600020601f850160051c8101602086101561177a5750805b601f850160051c820191505b8181101561179957828155600101611786565b505050505050565b815167ffffffffffffffff8111156117bb576117bb6114ca565b6117cf816117c98454611717565b84611751565b602080601f83116001811461180457600084156117ec5750858301515b600019600386901b1c1916600185901b178555611799565b600085815260208120601f198616915b8281101561183357888601518255948401946001909101908401611814565b50858210156118515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600080835461186f81611717565b60018281168015611887576001811461189c576118cb565b60ff19841687528215158302870194506118cb565b8760005260208060002060005b858110156118c25781548a8201529084019082016118a9565b50505082870194505b50506e636f756e63696c6d6574616461746160881b83525050600f019392505050565b634e487b7160e01b600052602160045260246000fd5b60006001820161192457634e487b7160e01b600052601160045260246000fd5b5060010190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061098b908301846113b9565b60006020828403121561197057600080fd5b815161131a81611386565b634e487b7160e01b600052603260045260246000fd","sourceMap":"384:7219:244:-:0;;;3045:262;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3197:10;3173:5;3180:7;1447:5:426;:13;3173:5:244;1447::426;:13;:::i;:::-;-1:-1:-1;1470:7:426;:17;1480:7;1470;:17;:::i;:::-;-1:-1:-1;;;;;;;;1273:26:400;;1269:95;;1322:31;;-1:-1:-1;;;1322:31:400;;1350:1;1322:31;;;4554:51:516;4527:18;;1322:31:400;;;;;;;1269:95;1373:32;1392:12;1373:18;:32::i;:::-;-1:-1:-1;3215:7:244::2;:18;3225:8:::0;3215:7;:18:::2;:::i;:::-;-1:-1:-1::0;3239:25:244::2;::::0;-1:-1:-1;;3270:10:244::2;:32:::0;;-1:-1:-1;;3270:32:244::2;::::0;;-1:-1:-1;384:7219:244;;2912:187:400;3004:6;;;-1:-1:-1;;;;;3020:17:400;;;-1:-1:-1;;;;;;3020:17:400;;;;;;;3052:40;;3004:6;;;3020:17;3004:6;;3052:40;;2985:16;;3052:40;2975:124;2912:187;:::o;14:127:516:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:844;200:5;253:3;246:4;238:6;234:17;230:27;220:55;;271:1;268;261:12;220:55;294:13;;-1:-1:-1;;;;;356:10:516;;;353:36;;;369:18;;:::i;:::-;444:2;438:9;412:2;498:13;;-1:-1:-1;;494:22:516;;;518:2;490:31;486:40;474:53;;;542:18;;;562:22;;;539:46;536:72;;;588:18;;:::i;:::-;628:10;624:2;617:22;663:2;655:6;648:18;685:4;675:14;;732:3;725:4;720:2;712:6;708:15;704:26;701:35;698:55;;;749:1;746;739:12;698:55;771:1;762:10;;781:133;795:2;792:1;789:9;781:133;;;883:14;;;879:23;;873:30;852:14;;;848:23;;841:63;806:10;;;;781:133;;;958:1;951:4;946:2;938:6;934:15;930:26;923:37;978:6;969:15;;;;;;146:844;;;;:::o;995:828::-;1122:6;1130;1138;1146;1199:3;1187:9;1178:7;1174:23;1170:33;1167:53;;;1216:1;1213;1206:12;1167:53;1243:16;;-1:-1:-1;;;;;1308:14:516;;;1305:34;;;1335:1;1332;1325:12;1305:34;1358:61;1411:7;1402:6;1391:9;1387:22;1358:61;:::i;:::-;1348:71;;1465:2;1454:9;1450:18;1444:25;1428:41;;1494:2;1484:8;1481:16;1478:36;;;1510:1;1507;1500:12;1478:36;1533:63;1588:7;1577:8;1566:9;1562:24;1533:63;:::i;:::-;1523:73;;1642:2;1631:9;1627:18;1621:25;1605:41;;1671:2;1661:8;1658:16;1655:36;;;1687:1;1684;1677:12;1655:36;;1710:63;1765:7;1754:8;1743:9;1739:24;1710:63;:::i;:::-;1813:2;1798:18;;;;1792:25;995:828;;;;-1:-1:-1;;;;995:828:516:o;1828:380::-;1907:1;1903:12;;;;1950;;;1971:61;;2025:4;2017:6;2013:17;2003:27;;1971:61;2078:2;2070:6;2067:14;2047:18;2044:38;2041:161;;2124:10;2119:3;2115:20;2112:1;2105:31;2159:4;2156:1;2149:15;2187:4;2184:1;2177:15;2041:161;;1828:380;;;:::o;2339:543::-;2441:2;2436:3;2433:11;2430:446;;;2477:1;2501:5;2498:1;2491:16;2545:4;2542:1;2532:18;2615:2;2603:10;2599:19;2596:1;2592:27;2586:4;2582:38;2651:4;2639:10;2636:20;2633:47;;;-1:-1:-1;2674:4:516;2633:47;2729:2;2724:3;2720:12;2717:1;2713:20;2707:4;2703:31;2693:41;;2784:82;2802:2;2795:5;2792:13;2784:82;;;2847:17;;;2828:1;2817:13;2784:82;;;2788:3;;;2430:446;2339:543;;;:::o;3058:1345::-;3178:10;;-1:-1:-1;;;;;3200:30:516;;3197:56;;;3233:18;;:::i;:::-;3262:97;3352:6;3312:38;3344:4;3338:11;3312:38;:::i;:::-;3306:4;3262:97;:::i;:::-;3414:4;;3471:2;3460:14;;3488:1;3483:663;;;;4190:1;4207:6;4204:89;;;-1:-1:-1;4259:19:516;;;4253:26;4204:89;-1:-1:-1;;3015:1:516;3011:11;;;3007:24;3003:29;2993:40;3039:1;3035:11;;;2990:57;4306:81;;3453:944;;3483:663;2286:1;2279:14;;;2323:4;2310:18;;-1:-1:-1;;3519:20:516;;;3637:236;3651:7;3648:1;3645:14;3637:236;;;3740:19;;;3734:26;3719:42;;3832:27;;;;3800:1;3788:14;;;;3667:19;;3637:236;;;3641:3;3901:6;3892:7;3889:19;3886:201;;;3962:19;;;3956:26;-1:-1:-1;;4045:1:516;4041:14;;;4057:3;4037:24;4033:37;4029:42;4014:58;3999:74;;3886:201;-1:-1:-1;;;;;4133:1:516;4117:14;;;4113:22;4100:36;;-1:-1:-1;3058:1345:516:o;4616:127::-;384:7219:244;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361061019b5760003560e01c8063715018a6116100ec578063a839e5011161008a578063c87b56dd11610064578063c87b56dd14610454578063d92d1bd614610474578063e985e9c5146104a4578063f2fde38b146104c457600080fd5b8063a839e50114610403578063b88d4fde14610418578063c002d23d1461043857600080fd5b8063902d55a5116100c6578063902d55a5146103a557806395d89b41146103bb5780639886a902146103d0578063a22cb465146103e357600080fd5b8063715018a61461035d57806376c64c62146103725780638da5cb5b1461038757600080fd5b806331b3eb941161015957806355f804b31161013357806355f804b3146102e85780636352211e146103085780636c0360eb1461032857806370a082311461033d57600080fd5b806331b3eb941461029557806332a93a3a146102b557806342842e0e146102c857600080fd5b80629a9b7b146101a057806301ffc9a7146101c957806306fdde03146101f9578063081812fc1461021b578063095ea7b31461025357806323b872dd14610275575b600080fd5b3480156101ac57600080fd5b506101b6600a5481565b6040519081526020015b60405180910390f35b3480156101d557600080fd5b506101e96101e436600461139c565b6104e4565b60405190151581526020016101c0565b34801561020557600080fd5b5061020e610536565b6040516101c091906113ff565b34801561022757600080fd5b5061023b610236366004611412565b6105c8565b6040516001600160a01b0390911681526020016101c0565b34801561025f57600080fd5b5061027361026e366004611440565b6105f1565b005b34801561028157600080fd5b5061027361029036600461146c565b610600565b3480156102a157600080fd5b506102736102b03660046114ad565b610690565b6101b66102c33660046114ad565b610711565b3480156102d457600080fd5b506102736102e336600461146c565b610748565b3480156102f457600080fd5b50610273610303366004611556565b610763565b34801561031457600080fd5b5061023b610323366004611412565b610777565b34801561033457600080fd5b5061020e610782565b34801561034957600080fd5b506101b66103583660046114ad565b610810565b34801561036957600080fd5b50610273610858565b34801561037e57600080fd5b5061027361086c565b34801561039357600080fd5b506006546001600160a01b031661023b565b3480156103b157600080fd5b506101b66109c481565b3480156103c757600080fd5b5061020e610888565b6101b66103de36600461159f565b610897565b3480156103ef57600080fd5b506102736103fe36600461162b565b610995565b34801561040f57600080fd5b506102736109a0565b34801561042457600080fd5b50610273610433366004611669565b6109bc565b34801561044457600080fd5b506101b667011c37937e08000081565b34801561046057600080fd5b5061020e61046f366004611412565b6109d3565b34801561048057600080fd5b506101e961048f3660046114ad565b60086020526000908152604090205460ff1681565b3480156104b057600080fd5b506101e96104bf3660046116e9565b610a59565b3480156104d057600080fd5b506102736104df3660046114ad565b610a87565b60006001600160e01b031982166380ac58cd60e01b148061051557506001600160e01b03198216635b5e139f60e01b145b8061053057506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461054590611717565b80601f016020809104026020016040519081016040528092919081815260200182805461057190611717565b80156105be5780601f10610593576101008083540402835291602001916105be565b820191906000526020600020905b8154815290600101906020018083116105a157829003601f168201915b5050505050905090565b60006105d382610ac5565b506000828152600460205260409020546001600160a01b0316610530565b6105fc828233610afe565b5050565b6001600160a01b03821661062f57604051633250574960e11b8152600060048201526024015b60405180910390fd5b600061063c838333610b0b565b9050836001600160a01b0316816001600160a01b03161461068a576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610626565b50505050565b610698610c04565b60405147906000906001600160a01b0384169083908381818185875af1925050503d80600081146106e5576040519150601f19603f3d011682016040523d82523d6000602084013e6106ea565b606091505b505090508061070c5760405163d23a9e8960e01b815260040160405180910390fd5b505050565b600061071c82610c31565b610724610c58565b61072c610c80565b61073582610ca4565b61073f6002610cde565b61053082610d25565b61070c838383604051806020016040528060008152506109bc565b61076b610c04565b60076105fc82826117a1565b600061053082610ac5565b6007805461078f90611717565b80601f01602080910402602001604051908101604052809291908181526020018280546107bb90611717565b80156108085780601f106107dd57610100808354040283529160200191610808565b820191906000526020600020905b8154815290600101906020018083116107eb57829003601f168201915b505050505081565b60006001600160a01b03821661083c576040516322718ad960e21b815260006004820152602401610626565b506001600160a01b031660009081526003602052604090205490565b610860610c04565b61086a6000610db1565b565b610874610c04565b61087e6001610cde565b61086a6002610e03565b60606001805461054590611717565b60006108a285610c31565b6108aa610c58565b6108b2610c80565b6108bb85610ca4565b6108c484610e88565b6040516bffffffffffffffffffffffff19606087901b166020820152603481018590526000906054016040516020818303038152906040528051906020012090506109658484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f00000000000000000000000000000000000000000000000000000000000000009250859150610ecd9050565b610982576040516309bde33960e01b815260040160405180910390fd5b61098b86610d25565b9695505050505050565b6105fc338383610ee3565b6109a8610c04565b6109b26000610cde565b61086a6001610e03565b6109c7848484610600565b61068a84848484610f82565b606060006109e083610777565b6001600160a01b031603610a075760405163d872946b60e01b815260040160405180910390fd5b600060078054610a1690611717565b905011610a325760405180602001604052806000815250610530565b6007604051602001610a449190611861565b60405160208183030381529060405292915050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610a8f610c04565b6001600160a01b038116610ab957604051631e4fbdf760e01b815260006004820152602401610626565b610ac281610db1565b50565b6000818152600260205260408120546001600160a01b03168061053057604051637e27328960e01b815260048101849052602401610626565b61070c83838360016110ab565b6000828152600260205260408120546001600160a01b0390811690831615610b3857610b388184866111b1565b6001600160a01b03811615610b7657610b556000856000806110ab565b6001600160a01b038116600090815260036020526040902080546000190190555b6001600160a01b03851615610ba5576001600160a01b0385166000908152600360205260409020805460010190555b60008481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6006546001600160a01b0316331461086a5760405163118cdaa760e01b8152336004820152602401610626565b6001600160a01b038116610ac25760405163e6c4247b60e01b815260040160405180910390fd5b67011c37937e080000341461086a576040516310f0c8f160e11b815260040160405180910390fd5b6109c4600a541061086a5760405163d05cb60960e01b815260040160405180910390fd5b6001600160a01b03811660009081526008602052604090205460ff1615610ac257604051631bbdf5c560e31b815260040160405180910390fd5b806002811115610cf057610cf06118ee565b60095460ff166002811115610d0757610d076118ee565b14610ac25760405163a1f6623960e01b815260040160405180910390fd5b6001600160a01b0381166000908152600860205260408120805460ff19166001179055600a805490819083610d5983611904565b9190505550610d688382611215565b604080518281524260208201526001600160a01b038516917f25b428dfde728ccfaddad7e29e4ac23c24ed7fd1a6e3e3f91894a9a073f5dfff910160405180910390a292915050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6009805460ff811691839160ff19166001836002811115610e2657610e266118ee565b0217905550816002811115610e3d57610e3d6118ee565b816002811115610e4f57610e4f6118ee565b60405142815233907f7a5907205f46c7df4a68b33c1da8921886b57f025f0ec67a42c38d2c2013a7849060200160405180910390a45050565b600060095460ff166002811115610ea157610ea16118ee565b148015610eaf575080600114155b15610ac257604051631eb49d6d60e11b815260040160405180910390fd5b600082610eda858461122f565b14949350505050565b6001600160a01b038216610f1557604051630b61174360e31b81526001600160a01b0383166004820152602401610626565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561068a57604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290610fc490339088908790879060040161192b565b6020604051808303816000875af1925050508015610fff575060408051601f3d908101601f19168201909252610ffc9181019061195e565b60015b611068573d80801561102d576040519150601f19603f3d011682016040523d82523d6000602084013e611032565b606091505b50805160000361106057604051633250574960e11b81526001600160a01b0385166004820152602401610626565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146110a457604051633250574960e11b81526001600160a01b0385166004820152602401610626565b5050505050565b80806110bf57506001600160a01b03821615155b156111815760006110cf84610ac5565b90506001600160a01b038316158015906110fb5750826001600160a01b0316816001600160a01b031614155b801561110e575061110c8184610a59565b155b156111375760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610626565b811561117f5783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6111bc838383611272565b61070c576001600160a01b0383166111ea57604051637e27328960e01b815260048101829052602401610626565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610626565b6105fc8282604051806020016040528060008152506112d8565b600081815b845181101561126a57611260828683815181106112535761125361197b565b60200260200101516112ef565b9150600101611234565b509392505050565b60006001600160a01b038316158015906112d05750826001600160a01b0316846001600160a01b031614806112ac57506112ac8484610a59565b806112d057506000828152600460205260409020546001600160a01b038481169116145b949350505050565b6112e28383611321565b61070c6000848484610f82565b600081831061130b57600082815260208490526040902061131a565b60008381526020839052604090205b9392505050565b6001600160a01b03821661134b57604051633250574960e11b815260006004820152602401610626565b600061135983836000610b0b565b90506001600160a01b0381161561070c576040516339e3563760e11b815260006004820152602401610626565b6001600160e01b031981168114610ac257600080fd5b6000602082840312156113ae57600080fd5b813561131a81611386565b6000815180845260005b818110156113df576020818501810151868301820152016113c3565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061131a60208301846113b9565b60006020828403121561142457600080fd5b5035919050565b6001600160a01b0381168114610ac257600080fd5b6000806040838503121561145357600080fd5b823561145e8161142b565b946020939093013593505050565b60008060006060848603121561148157600080fd5b833561148c8161142b565b9250602084013561149c8161142b565b929592945050506040919091013590565b6000602082840312156114bf57600080fd5b813561131a8161142b565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156114fb576114fb6114ca565b604051601f8501601f19908116603f01168101908282118183101715611523576115236114ca565b8160405280935085815286868601111561153c57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561156857600080fd5b813567ffffffffffffffff81111561157f57600080fd5b8201601f8101841361159057600080fd5b6112d0848235602084016114e0565b600080600080606085870312156115b557600080fd5b84356115c08161142b565b935060208501359250604085013567ffffffffffffffff808211156115e457600080fd5b818701915087601f8301126115f857600080fd5b81358181111561160757600080fd5b8860208260051b850101111561161c57600080fd5b95989497505060200194505050565b6000806040838503121561163e57600080fd5b82356116498161142b565b91506020830135801515811461165e57600080fd5b809150509250929050565b6000806000806080858703121561167f57600080fd5b843561168a8161142b565b9350602085013561169a8161142b565b925060408501359150606085013567ffffffffffffffff8111156116bd57600080fd5b8501601f810187136116ce57600080fd5b6116dd878235602084016114e0565b91505092959194509250565b600080604083850312156116fc57600080fd5b82356117078161142b565b9150602083013561165e8161142b565b600181811c9082168061172b57607f821691505b60208210810361174b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561070c576000816000526020600020601f850160051c8101602086101561177a5750805b601f850160051c820191505b8181101561179957828155600101611786565b505050505050565b815167ffffffffffffffff8111156117bb576117bb6114ca565b6117cf816117c98454611717565b84611751565b602080601f83116001811461180457600084156117ec5750858301515b600019600386901b1c1916600185901b178555611799565b600085815260208120601f198616915b8281101561183357888601518255948401946001909101908401611814565b50858210156118515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600080835461186f81611717565b60018281168015611887576001811461189c576118cb565b60ff19841687528215158302870194506118cb565b8760005260208060002060005b858110156118c25781548a8201529084019082016118a9565b50505082870194505b50506e636f756e63696c6d6574616461746160881b83525050600f019392505050565b634e487b7160e01b600052602160045260246000fd5b60006001820161192457634e487b7160e01b600052601160045260246000fd5b5060010190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061098b908301846113b9565b60006020828403121561197057600080fd5b815161131a81611386565b634e487b7160e01b600052603260045260246000fd","sourceMap":"384:7219:244:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2834:29;;;;;;;;;;;;;;;;;;;160:25:516;;;148:2;133:18;2834:29:244;;;;;;;;1561:300:426;;;;;;;;;;-1:-1:-1;1561:300:426;;;;;:::i;:::-;;:::i;:::-;;;747:14:516;;740:22;722:41;;710:2;695:18;1561:300:426;582:187:516;2365:89:426;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3497:154::-;;;;;;;;;;-1:-1:-1;3497:154:426;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1776:32:516;;;1758:51;;1746:2;1731:18;3497:154:426;1612:203:516;3323:113:426;;;;;;;;;;-1:-1:-1;3323:113:426;;;;;:::i;:::-;;:::i;:::-;;4143:578;;;;;;;;;;-1:-1:-1;4143:578:426;;;;;:::i;:::-;;:::i;5868:238:244:-;;;;;;;;;;-1:-1:-1;5868:238:244;;;;;:::i;:::-;;:::i;3995:272::-;;;;;;:::i;:::-;;:::i;4787:132:426:-;;;;;;;;;;-1:-1:-1;4787:132:426;;;;;:::i;:::-;;:::i;4454:92:244:-;;;;;;;;;;-1:-1:-1;4454:92:244;;;;;:::i;:::-;;:::i;2185:118:426:-;;;;;;;;;;-1:-1:-1;2185:118:426;;;;;:::i;:::-;;:::i;2470:21:244:-;;;;;;;;;;;;;:::i;1920:208:426:-;;;;;;;;;;-1:-1:-1;1920:208:426;;;;;:::i;:::-;;:::i;2293:101:400:-;;;;;;;;;;;;;:::i;5439:124:244:-;;;;;;;;;;;;;:::i;1638:85:400:-;;;;;;;;;;-1:-1:-1;1710:6:400;;-1:-1:-1;;;;;1710:6:400;1638:85;;2118:43:244;;;;;;;;;;;;2157:4;2118:43;;2518:93:426;;;;;;;;;;;;;:::i;3489:502:244:-;;;;;;:::i;:::-;;:::i;3718:144:426:-;;;;;;;;;;-1:-1:-1;3718:144:426;;;;;:::i;:::-;;:::i;5306:129:244:-;;;;;;;;;;;;;:::i;4985:208:426:-;;;;;;;;;;-1:-1:-1;4985:208:426;;;;;:::i;:::-;;:::i;2217:47:244:-;;;;;;;;;;;;2254:10;2217:47;;4813:305;;;;;;;;;;-1:-1:-1;4813:305:244;;;;;:::i;:::-;;:::i;2558:42::-;;;;;;;;;;-1:-1:-1;2558:42:244;;;;;:::i;:::-;;;;;;;;;;;;;;;;3928:153:426;;;;;;;;;;-1:-1:-1;3928:153:426;;;;;:::i;:::-;;:::i;2543:215:400:-;;;;;;;;;;-1:-1:-1;2543:215:400;;;;;:::i;:::-;;:::i;1561:300:426:-;1663:4;-1:-1:-1;;;;;;1698:40:426;;-1:-1:-1;;;1698:40:426;;:104;;-1:-1:-1;;;;;;;1754:48:426;;-1:-1:-1;;;1754:48:426;1698:104;:156;;;-1:-1:-1;;;;;;;;;;861:40:443;;;1818:36:426;1679:175;1561:300;-1:-1:-1;;1561:300:426:o;2365:89::-;2410:13;2442:5;2435:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2365:89;:::o;3497:154::-;3564:7;3583:22;3597:7;3583:13;:22::i;:::-;-1:-1:-1;6008:7:426;6034:24;;;:15;:24;;;;;;-1:-1:-1;;;;;6034:24:426;3623:21;5938:127;3323:113;3394:35;3403:2;3407:7;735:10:432;3394:8:426;:35::i;:::-;3323:113;;:::o;4143:578::-;-1:-1:-1;;;;;4237:16:426;;4233:87;;4276:33;;-1:-1:-1;;;4276:33:426;;4306:1;4276:33;;;1758:51:516;1731:18;;4276:33:426;;;;;;;;4233:87;4538:21;4562:34;4570:2;4574:7;735:10:432;4562:7:426;:34::i;:::-;4538:58;;4627:4;-1:-1:-1;;;;;4610:21:426;:13;-1:-1:-1;;;;;4610:21:426;;4606:109;;4654:50;;-1:-1:-1;;;4654:50:426;;-1:-1:-1;;;;;7554:15:516;;;4654:50:426;;;7536:34:516;7586:18;;;7579:34;;;7649:15;;7629:18;;;7622:43;7471:18;;4654:50:426;7296:375:516;4606:109:426;4223:498;4143:578;;;:::o;5868:238:244:-;1531:13:400;:11;:13::i;:::-;6009:30:244::1;::::0;5960:21:::1;::::0;5942:15:::1;::::0;-1:-1:-1;;;;;6009:10:244;::::1;::::0;5960:21;;5942:15;6009:30;5942:15;6009:30;5960:21;6009:10;:30:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5987:52;;;6050:10;6045:57;;6077:18;;-1:-1:-1::0;;;6077:18:244::1;;;;;;;;;;;6045:57;5936:170;;5868:238:::0;:::o;3995:272::-;4060:7;4075:34;4099:9;4075:23;:34::i;:::-;4115:20;:18;:20::i;:::-;4141;:18;:20::i;:::-;4167:26;4183:9;4167:15;:26::i;:::-;4199:32;4214:16;4199:14;:32::i;:::-;4244:18;4252:9;4244:7;:18::i;4787:132:426:-;4873:39;4890:4;4896:2;4900:7;4873:39;;;;;;;;;;;;:16;:39::i;4454:92:244:-;1531:13:400;:11;:13::i;:::-;4523:7:244::1;:18;4533:8:::0;4523:7;:18:::1;:::i;2185:118:426:-:0;2248:7;2274:22;2288:7;2274:13;:22::i;2470:21:244:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1920:208:426:-;1983:7;-1:-1:-1;;;;;2006:19:426;;2002:87;;2048:30;;-1:-1:-1;;;2048:30:426;;2075:1;2048:30;;;1758:51:516;1731:18;;2048:30:426;1612:203:516;2002:87:426;-1:-1:-1;;;;;;2105:16:426;;;;;:9;:16;;;;;;;1920:208::o;2293:101:400:-;1531:13;:11;:13::i;:::-;2357:30:::1;2384:1;2357:18;:30::i;:::-;2293:101::o:0;5439:124:244:-;1531:13:400;:11;:13::i;:::-;5491:34:244::1;5506:18;5491:14;:34::i;:::-;5531:27;5541:16;5531:9;:27::i;2518:93:426:-:0;2565:13;2597:7;2590:14;;;;;:::i;3489:502:244:-;3616:7;3631:34;3655:9;3631:23;:34::i;:::-;3671:20;:18;:20::i;:::-;3697;:18;:20::i;:::-;3723:26;3739:9;3723:15;:26::i;:::-;3755:29;3774:9;3755:18;:29::i;:::-;3819:38;;-1:-1:-1;;10258:2:516;10254:15;;;10250:53;3819:38:244;;;10238:66:516;10320:12;;;10313:28;;;3791:15:244;;10357:12:516;;3819:38:244;;;;;;;;;;;;3809:49;;;;;;3791:67;;3870:47;3889:5;;3870:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3896:11:244;;-1:-1:-1;3909:7:244;;-1:-1:-1;3870:18:244;;-1:-1:-1;3870:47:244:i;:::-;3865:90;;3934:14;;-1:-1:-1;;;3934:14:244;;;;;;;;;;;3865:90;3968:18;3976:9;3968:7;:18::i;:::-;3961:25;3489:502;-1:-1:-1;;;;;;3489:502:244:o;3718:144:426:-;3803:52;735:10:432;3836:8:426;3846;3803:18;:52::i;5306:129:244:-;1531:13:400;:11;:13::i;:::-;5360:35:244::1;5375:19;5360:14;:35::i;:::-;5401:29;5411:18;5401:9;:29::i;4985:208:426:-:0;5098:31;5111:4;5117:2;5121:7;5098:12;:31::i;:::-;5139:47;5162:4;5168:2;5172:7;5181:4;5139:22;:47::i;4813:305:244:-;4894:13;4947:1;4919:16;4927:7;4919;:16::i;:::-;-1:-1:-1;;;;;4919:30:244;;4915:79;;4966:21;;-1:-1:-1;;;4966:21:244;;;;;;;;;;;4915:79;5036:1;5018:7;5012:21;;;;;:::i;:::-;;;:25;:101;;;;;;;;;;;;;;;;;5072:7;5055:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;4999:114;4813:305;-1:-1:-1;;4813:305:244:o;3928:153:426:-;-1:-1:-1;;;;;4039:25:426;;;4016:4;4039:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;3928:153::o;2543:215:400:-;1531:13;:11;:13::i;:::-;-1:-1:-1;;;;;2627:22:400;::::1;2623:91;;2672:31;::::0;-1:-1:-1;;;2672:31:400;;2700:1:::1;2672:31;::::0;::::1;1758:51:516::0;1731:18;;2672:31:400::1;1612:203:516::0;2623:91:400::1;2723:28;2742:8;2723:18;:28::i;:::-;2543:215:::0;:::o;16138:241:426:-;16201:7;5799:16;;;:7;:16;;;;;;-1:-1:-1;;;;;5799:16:426;;16263:88;;16309:31;;-1:-1:-1;;;16309:31:426;;;;;160:25:516;;;133:18;;16309:31:426;14:177:516;14418:120:426;14498:33;14507:2;14511:7;14520:4;14526;14498:8;:33::i;8838:795::-;8924:7;5799:16;;;:7;:16;;;;;;-1:-1:-1;;;;;5799:16:426;;;;9035:18;;;9031:86;;9069:37;9086:4;9092;9098:7;9069:16;:37::i;:::-;-1:-1:-1;;;;;9161:18:426;;;9157:256;;9277:48;9294:1;9298:7;9315:1;9319:5;9277:8;:48::i;:::-;-1:-1:-1;;;;;9368:15:426;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;9368:20:426;;;9157:256;-1:-1:-1;;;;;9427:16:426;;;9423:107;;-1:-1:-1;;;;;9487:13:426;;;;;;:9;:13;;;;;:18;;9504:1;9487:18;;;9423:107;9540:16;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9540:21:426;-1:-1:-1;;;;;9540:21:426;;;;;;;;;9577:27;;9540:16;;9577:27;;;;;;;9622:4;8838:795;-1:-1:-1;;;;8838:795:426:o;1796:162:400:-;1710:6;;-1:-1:-1;;;;;1710:6:400;735:10:432;1855:23:400;1851:101;;1901:40;;-1:-1:-1;;;1901:40:400;;735:10:432;1901:40:400;;;1758:51:516;1731:18;;1901:40:400;1612:203:516;6759:143:244;-1:-1:-1;;;;;6835:23:244;;6831:67;;6875:16;;-1:-1:-1;;;6875:16:244;;;;;;;;;;;7478:123;2254:10;7532:9;:23;7528:69;;7572:18;;-1:-1:-1;;;7572:18:244;;;;;;;;;;;6906:130;2157:4;6960:14;;:30;6956:76;;7007:18;;-1:-1:-1;;;7007:18:244;;;;;;;;;;;7342:132;-1:-1:-1;;;;;7410:21:244;;;;;;:10;:21;;;;;;;;7406:64;;;7448:15;;-1:-1:-1;;;7448:15:244;;;;;;;;;;;7040:132;7120:6;7106:20;;;;;;;;:::i;:::-;:10;;;;:20;;;;;;;;:::i;:::-;;7102:66;;7143:18;;-1:-1:-1;;;7143:18:244;;;;;;;;;;;6291:271;-1:-1:-1;;;;;6360:21:244;;6345:7;6360:21;;;:10;:21;;;;;:28;;-1:-1:-1;;6360:28:244;6384:4;6360:28;;;6412:14;;;;;;6345:7;6432:16;6412:14;6432:16;:::i;:::-;;;;;;6454:29;6464:9;6475:7;6454:9;:29::i;:::-;6494:43;;;11920:25:516;;;6521:15:244;11976:2:516;11961:18;;11954:34;-1:-1:-1;;;;;6494:43:244;;;;;11893:18:516;6494:43:244;;;;;;;6550:7;6291:271;-1:-1:-1;;6291:271:244:o;2912:187:400:-;3004:6;;;-1:-1:-1;;;;;3020:17:400;;;-1:-1:-1;;;;;;3020:17:400;;;;;;;3052:40;;3004:6;;;3020:17;3004:6;;3052:40;;2985:16;;3052:40;2975:124;2912:187;:::o;6566:189:244:-;6640:10;;;;;;;6669:6;;-1:-1:-1;;6656:19:244;6640:10;6669:6;6656:19;;;;;;;;:::i;:::-;;;;;;6726:6;6686:64;;;;;;;;:::i;:::-;6715:9;6686:64;;;;;;;;:::i;:::-;;;6734:15;160:25:516;;6703:10:244;;6686:64;;148:2:516;133:18;6686:64:244;;;;;;;6612:143;6566:189;:::o;7176:162::-;7261:19;7247:10;;;;:33;;;;;;;;:::i;:::-;;:51;;;;;7284:9;7297:1;7284:14;;7247:51;7243:91;;;7315:12;;-1:-1:-1;;;7315:12:244;;;;;;;;;;;1265:154:441;1356:4;1408;1379:25;1392:5;1399:4;1379:12;:25::i;:::-;:33;;1265:154;-1:-1:-1;;;;1265:154:441:o;15591:312:426:-;-1:-1:-1;;;;;15698:22:426;;15694:91;;15743:31;;-1:-1:-1;;;15743:31:426;;-1:-1:-1;;;;;1776:32:516;;15743:31:426;;;1758:51:516;1731:18;;15743:31:426;1612:203:516;15694:91:426;-1:-1:-1;;;;;15794:25:426;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;15794:46:426;;;;;;;;;;15855:41;;722::516;;;15855::426;;695:18:516;15855:41:426;;;;;;;15591:312;;;:::o;16918:782::-;-1:-1:-1;;;;;17034:14:426;;;:18;17030:664;;17072:71;;-1:-1:-1;;;17072:71:426;;-1:-1:-1;;;;;17072:36:426;;;;;:71;;735:10:432;;17123:4:426;;17129:7;;17138:4;;17072:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17072:71:426;;;;;;;;-1:-1:-1;;17072:71:426;;;;;;;;;;;;:::i;:::-;;;17068:616;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17381:6;:13;17398:1;17381:18;17377:293;;17430:25;;-1:-1:-1;;;17430:25:426;;-1:-1:-1;;;;;1776:32:516;;17430:25:426;;;1758:51:516;1731:18;;17430:25:426;1612:203:516;17377:293:426;17622:6;17616:13;17607:6;17603:2;17599:15;17592:38;17068:616;-1:-1:-1;;;;;;17190:51:426;;-1:-1:-1;;;17190:51:426;17186:130;;17272:25;;-1:-1:-1;;;17272:25:426;;-1:-1:-1;;;;;1776:32:516;;17272:25:426;;;1758:51:516;1731:18;;17272:25:426;1612:203:516;17186:130:426;17144:186;16918:782;;;;:::o;14720:662::-;14880:9;:31;;;-1:-1:-1;;;;;;14893:18:426;;;;14880:31;14876:460;;;14927:13;14943:22;14957:7;14943:13;:22::i;:::-;14927:38;-1:-1:-1;;;;;;15093:18:426;;;;;;:35;;;15124:4;-1:-1:-1;;;;;15115:13:426;:5;-1:-1:-1;;;;;15115:13:426;;;15093:35;:69;;;;;15133:29;15150:5;15157:4;15133:16;:29::i;:::-;15132:30;15093:69;15089:142;;;15189:27;;-1:-1:-1;;;15189:27:426;;-1:-1:-1;;;;;1776:32:516;;15189:27:426;;;1758:51:516;1731:18;;15189:27:426;1612:203:516;15089:142:426;15249:9;15245:81;;;15303:7;15299:2;-1:-1:-1;;;;;15283:28:426;15292:5;-1:-1:-1;;;;;15283:28:426;;;;;;;;;;;15245:81;14913:423;14876:460;-1:-1:-1;;15346:24:426;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;15346:29:426;-1:-1:-1;;;;;15346:29:426;;;;;;;;;;14720:662::o;7082:368::-;7194:38;7208:5;7215:7;7224;7194:13;:38::i;:::-;7189:255;;-1:-1:-1;;;;;7252:19:426;;7248:186;;7298:31;;-1:-1:-1;;;7298:31:426;;;;;160:25:516;;;133:18;;7298:31:426;14:177:516;7248:186:426;7375:44;;-1:-1:-1;;;7375:44:426;;-1:-1:-1;;;;;12939:32:516;;7375:44:426;;;12921:51:516;12988:18;;;12981:34;;;12894:18;;7375:44:426;12747:274:516;10633:100:426;10700:26;10710:2;10714:7;10700:26;;;;;;;;;;;;:9;:26::i;1967:290:441:-;2050:7;2092:4;2050:7;2106:116;2130:5;:12;2126:1;:16;2106:116;;;2178:33;2188:12;2202:5;2208:1;2202:8;;;;;;;;:::i;:::-;;;;;;;2178:9;:33::i;:::-;2163:48;-1:-1:-1;2144:3:441;;2106:116;;;-1:-1:-1;2238:12:441;1967:290;-1:-1:-1;;;1967:290:441:o;6376:272:426:-;6479:4;-1:-1:-1;;;;;6514:21:426;;;;;;:127;;;6561:7;-1:-1:-1;;;;;6552:16:426;:5;-1:-1:-1;;;;;6552:16:426;;:52;;;;6572:32;6589:5;6596:7;6572:16;:32::i;:::-;6552:88;;;-1:-1:-1;6008:7:426;6034:24;;;:15;:24;;;;;;-1:-1:-1;;;;;6608:32:426;;;6034:24;;6608:32;6552:88;6495:146;6376:272;-1:-1:-1;;;;6376:272:426:o;10954:182::-;11048:18;11054:2;11058:7;11048:5;:18::i;:::-;11076:53;11107:1;11111:2;11115:7;11124:4;11076:22;:53::i;9229:147:441:-;9292:7;9322:1;9318;:5;:51;;9564:13;9655:15;;;9690:4;9683:15;;;9736:4;9720:21;;9318:51;;;9564:13;9655:15;;;9690:4;9683:15;;;9736:4;9720:21;;9326:20;9311:58;9229:147;-1:-1:-1;;;9229:147:441:o;9955:327:426:-;-1:-1:-1;;;;;10022:16:426;;10018:87;;10061:33;;-1:-1:-1;;;10061:33:426;;10091:1;10061:33;;;1758:51:516;1731:18;;10061:33:426;1612:203:516;10018:87:426;10114:21;10138:32;10146:2;10150:7;10167:1;10138:7;:32::i;:::-;10114:56;-1:-1:-1;;;;;;10184:27:426;;;10180:96;;10234:31;;-1:-1:-1;;;10234:31:426;;10262:1;10234:31;;;1758:51:516;1731:18;;10234:31:426;1612:203:516;196:131;-1:-1:-1;;;;;;270:32:516;;260:43;;250:71;;317:1;314;307:12;332:245;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;498:9;485:23;517:30;541:5;517:30;:::i;774:423::-;816:3;854:5;848:12;881:6;876:3;869:19;906:1;916:162;930:6;927:1;924:13;916:162;;;992:4;1048:13;;;1044:22;;1038:29;1020:11;;;1016:20;;1009:59;945:12;916:162;;;920:3;1123:1;1116:4;1107:6;1102:3;1098:16;1094:27;1087:38;1186:4;1179:2;1175:7;1170:2;1162:6;1158:15;1154:29;1149:3;1145:39;1141:50;1134:57;;;774:423;;;;:::o;1202:220::-;1351:2;1340:9;1333:21;1314:4;1371:45;1412:2;1401:9;1397:18;1389:6;1371:45;:::i;1427:180::-;1486:6;1539:2;1527:9;1518:7;1514:23;1510:32;1507:52;;;1555:1;1552;1545:12;1507:52;-1:-1:-1;1578:23:516;;1427:180;-1:-1:-1;1427:180:516:o;1820:131::-;-1:-1:-1;;;;;1895:31:516;;1885:42;;1875:70;;1941:1;1938;1931:12;1956:315;2024:6;2032;2085:2;2073:9;2064:7;2060:23;2056:32;2053:52;;;2101:1;2098;2091:12;2053:52;2140:9;2127:23;2159:31;2184:5;2159:31;:::i;:::-;2209:5;2261:2;2246:18;;;;2233:32;;-1:-1:-1;;;1956:315:516:o;2276:456::-;2353:6;2361;2369;2422:2;2410:9;2401:7;2397:23;2393:32;2390:52;;;2438:1;2435;2428:12;2390:52;2477:9;2464:23;2496:31;2521:5;2496:31;:::i;:::-;2546:5;-1:-1:-1;2603:2:516;2588:18;;2575:32;2616:33;2575:32;2616:33;:::i;:::-;2276:456;;2668:7;;-1:-1:-1;;;2722:2:516;2707:18;;;;2694:32;;2276:456::o;2737:255::-;2804:6;2857:2;2845:9;2836:7;2832:23;2828:32;2825:52;;;2873:1;2870;2863:12;2825:52;2912:9;2899:23;2931:31;2956:5;2931:31;:::i;3249:127::-;3310:10;3305:3;3301:20;3298:1;3291:31;3341:4;3338:1;3331:15;3365:4;3362:1;3355:15;3381:632;3446:5;3476:18;3517:2;3509:6;3506:14;3503:40;;;3523:18;;:::i;:::-;3598:2;3592:9;3566:2;3652:15;;-1:-1:-1;;3648:24:516;;;3674:2;3644:33;3640:42;3628:55;;;3698:18;;;3718:22;;;3695:46;3692:72;;;3744:18;;:::i;:::-;3784:10;3780:2;3773:22;3813:6;3804:15;;3843:6;3835;3828:22;3883:3;3874:6;3869:3;3865:16;3862:25;3859:45;;;3900:1;3897;3890:12;3859:45;3950:6;3945:3;3938:4;3930:6;3926:17;3913:44;4005:1;3998:4;3989:6;3981;3977:19;3973:30;3966:41;;;;3381:632;;;;;:::o;4018:451::-;4087:6;4140:2;4128:9;4119:7;4115:23;4111:32;4108:52;;;4156:1;4153;4146:12;4108:52;4196:9;4183:23;4229:18;4221:6;4218:30;4215:50;;;4261:1;4258;4251:12;4215:50;4284:22;;4337:4;4329:13;;4325:27;-1:-1:-1;4315:55:516;;4366:1;4363;4356:12;4315:55;4389:74;4455:7;4450:2;4437:16;4432:2;4428;4424:11;4389:74;:::i;4474:818::-;4578:6;4586;4594;4602;4655:2;4643:9;4634:7;4630:23;4626:32;4623:52;;;4671:1;4668;4661:12;4623:52;4710:9;4697:23;4729:31;4754:5;4729:31;:::i;:::-;4779:5;-1:-1:-1;4831:2:516;4816:18;;4803:32;;-1:-1:-1;4886:2:516;4871:18;;4858:32;4909:18;4939:14;;;4936:34;;;4966:1;4963;4956:12;4936:34;5004:6;4993:9;4989:22;4979:32;;5049:7;5042:4;5038:2;5034:13;5030:27;5020:55;;5071:1;5068;5061:12;5020:55;5111:2;5098:16;5137:2;5129:6;5126:14;5123:34;;;5153:1;5150;5143:12;5123:34;5206:7;5201:2;5191:6;5188:1;5184:14;5180:2;5176:23;5172:32;5169:45;5166:65;;;5227:1;5224;5217:12;5166:65;4474:818;;;;-1:-1:-1;;5258:2:516;5250:11;;-1:-1:-1;;;4474:818:516:o;5297:416::-;5362:6;5370;5423:2;5411:9;5402:7;5398:23;5394:32;5391:52;;;5439:1;5436;5429:12;5391:52;5478:9;5465:23;5497:31;5522:5;5497:31;:::i;:::-;5547:5;-1:-1:-1;5604:2:516;5589:18;;5576:32;5646:15;;5639:23;5627:36;;5617:64;;5677:1;5674;5667:12;5617:64;5700:7;5690:17;;;5297:416;;;;;:::o;5718:795::-;5813:6;5821;5829;5837;5890:3;5878:9;5869:7;5865:23;5861:33;5858:53;;;5907:1;5904;5897:12;5858:53;5946:9;5933:23;5965:31;5990:5;5965:31;:::i;:::-;6015:5;-1:-1:-1;6072:2:516;6057:18;;6044:32;6085:33;6044:32;6085:33;:::i;:::-;6137:7;-1:-1:-1;6191:2:516;6176:18;;6163:32;;-1:-1:-1;6246:2:516;6231:18;;6218:32;6273:18;6262:30;;6259:50;;;6305:1;6302;6295:12;6259:50;6328:22;;6381:4;6373:13;;6369:27;-1:-1:-1;6359:55:516;;6410:1;6407;6400:12;6359:55;6433:74;6499:7;6494:2;6481:16;6476:2;6472;6468:11;6433:74;:::i;:::-;6423:84;;;5718:795;;;;;;;:::o;6518:388::-;6586:6;6594;6647:2;6635:9;6626:7;6622:23;6618:32;6615:52;;;6663:1;6660;6653:12;6615:52;6702:9;6689:23;6721:31;6746:5;6721:31;:::i;:::-;6771:5;-1:-1:-1;6828:2:516;6813:18;;6800:32;6841:33;6800:32;6841:33;:::i;6911:380::-;6990:1;6986:12;;;;7033;;;7054:61;;7108:4;7100:6;7096:17;7086:27;;7054:61;7161:2;7153:6;7150:14;7130:18;7127:38;7124:161;;7207:10;7202:3;7198:20;7195:1;7188:31;7242:4;7239:1;7232:15;7270:4;7267:1;7260:15;7124:161;;6911:380;;;:::o;8012:543::-;8114:2;8109:3;8106:11;8103:446;;;8150:1;8174:5;8171:1;8164:16;8218:4;8215:1;8205:18;8288:2;8276:10;8272:19;8269:1;8265:27;8259:4;8255:38;8324:4;8312:10;8309:20;8306:47;;;-1:-1:-1;8347:4:516;8306:47;8402:2;8397:3;8393:12;8390:1;8386:20;8380:4;8376:31;8366:41;;8457:82;8475:2;8468:5;8465:13;8457:82;;;8520:17;;;8501:1;8490:13;8457:82;;;8461:3;;;8012:543;;;:::o;8731:1345::-;8857:3;8851:10;8884:18;8876:6;8873:30;8870:56;;;8906:18;;:::i;:::-;8935:97;9025:6;8985:38;9017:4;9011:11;8985:38;:::i;:::-;8979:4;8935:97;:::i;:::-;9087:4;;9144:2;9133:14;;9161:1;9156:663;;;;9863:1;9880:6;9877:89;;;-1:-1:-1;9932:19:516;;;9926:26;9877:89;-1:-1:-1;;8688:1:516;8684:11;;;8680:24;8676:29;8666:40;8712:1;8708:11;;;8663:57;9979:81;;9126:944;;9156:663;7959:1;7952:14;;;7996:4;7983:18;;-1:-1:-1;;9192:20:516;;;9310:236;9324:7;9321:1;9318:14;9310:236;;;9413:19;;;9407:26;9392:42;;9505:27;;;;9473:1;9461:14;;;;9340:19;;9310:236;;;9314:3;9574:6;9565:7;9562:19;9559:201;;;9635:19;;;9629:26;-1:-1:-1;;9718:1:516;9714:14;;;9730:3;9710:24;9706:37;9702:42;9687:58;9672:74;;9559:201;-1:-1:-1;;;;;9806:1:516;9790:14;;;9786:22;9773:36;;-1:-1:-1;8731:1345:516:o;10380:992::-;10609:3;10638:1;10671:6;10665:13;10701:36;10727:9;10701:36;:::i;:::-;10756:1;10773:17;;;10799:133;;;;10946:1;10941:358;;;;10766:533;;10799:133;-1:-1:-1;;10832:24:516;;10820:37;;10905:14;;10898:22;10886:35;;10877:45;;;-1:-1:-1;10799:133:516;;10941:358;10972:6;10969:1;10962:17;11002:4;11047;11044:1;11034:18;11074:1;11088:165;11102:6;11099:1;11096:13;11088:165;;;11180:14;;11167:11;;;11160:35;11223:16;;;;11117:10;;11088:165;;;11092:3;;;11282:6;11277:3;11273:16;11266:23;;10766:533;-1:-1:-1;;;;;11308:30:516;;-1:-1:-1;;11363:2:516;11354:12;;10380:992;-1:-1:-1;;;10380:992:516:o;11377:127::-;11438:10;11433:3;11429:20;11426:1;11419:31;11469:4;11466:1;11459:15;11493:4;11490:1;11483:15;11509:232;11548:3;11569:17;;;11566:140;;11628:10;11623:3;11619:20;11616:1;11609:31;11663:4;11660:1;11653:15;11691:4;11688:1;11681:15;11566:140;-1:-1:-1;11733:1:516;11722:13;;11509:232::o;11999:489::-;-1:-1:-1;;;;;12268:15:516;;;12250:34;;12320:15;;12315:2;12300:18;;12293:43;12367:2;12352:18;;12345:34;;;12415:3;12410:2;12395:18;;12388:31;;;12193:4;;12436:46;;12462:19;;12454:6;12436:46;:::i;12493:249::-;12562:6;12615:2;12603:9;12594:7;12590:23;12586:32;12583:52;;;12631:1;12628;12621:12;12583:52;12663:9;12657:16;12682:30;12706:5;12682:30;:::i;13026:127::-;13087:10;13082:3;13078:20;13075:1;13068:31;13118:4;13115:1;13108:15;13142:4;13139:1;13132:15","linkReferences":{},"immutableReferences":{"39419":[{"start":2362,"length":32}]}},"methodIdentifiers":{"MINT_PRICE()":"c002d23d","TOTAL_SUPPLY()":"902d55a5","_hasMinted(address)":"d92d1bd6","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","baseURI()":"6c0360eb","currentTokenId()":"009a9b7b","getApproved(uint256)":"081812fc","isApprovedForAll(address,address)":"e985e9c5","name()":"06fdde03","owner()":"8da5cb5b","ownerOf(uint256)":"6352211e","privateMint(address,uint256,bytes32[])":"9886a902","publicMint(address)":"32a93a3a","renounceOwnership()":"715018a6","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setBaseURI(string)":"55f804b3","startPublicMint()":"76c64c62","startWaitlistMint()":"a839e501","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b","withdrawPayments(address)":"31b3eb94"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"baseURI_\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot_\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyMinted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721IncorrectOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721InsufficientApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC721InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMintState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxSupplyReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintPriceNotPaid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonExistentTokenURI\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WithdrawTransfer\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"enum Member.MintState\",\"name\":\"prevState\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"enum Member.MintState\",\"name\":\"newState\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"MintStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINT_PRICE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOTAL_SUPPLY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"_hasMinted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentTokenId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"proof\",\"type\":\"bytes32[]\"}],\"name\":\"privateMint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"publicMint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"baseURI_\",\"type\":\"string\"}],\"name\":\"setBaseURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPublicMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startWaitlistMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"payee\",\"type\":\"address\"}],\"name\":\"withdrawPayments\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC721IncorrectOwner(address,uint256,address)\":[{\"details\":\"Indicates an error related to the ownership over a particular token. Used in transfers.\",\"params\":{\"owner\":\"Address of the current owner of a token.\",\"sender\":\"Address whose tokens are being transferred.\",\"tokenId\":\"Identifier number of a token.\"}}],\"ERC721InsufficientApproval(address,uint256)\":[{\"details\":\"Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\",\"params\":{\"operator\":\"Address that may be allowed to operate on tokens without being their owner.\",\"tokenId\":\"Identifier number of a token.\"}}],\"ERC721InvalidApprover(address)\":[{\"details\":\"Indicates a failure with the `approver` of a token to be approved. Used in approvals.\",\"params\":{\"approver\":\"Address initiating an approval operation.\"}}],\"ERC721InvalidOperator(address)\":[{\"details\":\"Indicates a failure with the `operator` to be approved. Used in approvals.\",\"params\":{\"operator\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC721InvalidOwner(address)\":[{\"details\":\"Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. Used in balance queries.\",\"params\":{\"owner\":\"Address of the current owner of a token.\"}}],\"ERC721InvalidReceiver(address)\":[{\"details\":\"Indicates a failure with the token `receiver`. Used in transfers.\",\"params\":{\"receiver\":\"Address to which tokens are being transferred.\"}}],\"ERC721InvalidSender(address)\":[{\"details\":\"Indicates a failure with the token `sender`. Used in transfers.\",\"params\":{\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC721NonexistentToken(uint256)\":[{\"details\":\"Indicates a `tokenId` whose `owner` is the zero address.\",\"params\":{\"tokenId\":\"Identifier number of a token.\"}}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"MintStateChanged(address,uint8,uint8,uint256)\":{\"params\":{\"caller\":\"the address that called the function\",\"newState\":\"the new mint state\",\"prevState\":\"the previous mint state\",\"timestamp\":\"the timestamp of the state change\"}},\"Minted(address,uint256,uint256)\":{\"params\":{\"recipient\":\"the address that receives the NFT\"}},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"params\":{\"tokenId\":\"the id of the token to get the tokenURI for\"},\"returns\":{\"_0\":\"the tokenURI for the given tokenId\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawPayments(address)\":{\"params\":{\"payee\":\"the address that will receive the withdrawn ether\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"AlreadyMinted()\":[{\"notice\":\"thrown when user tries to mint more than 1 token with same wallet\"}],\"InvalidAddress()\":[{\"notice\":\"thrown when the address is invalid\"}],\"InvalidMintState()\":[{\"notice\":\"thrown when the mint state is invalid\"}],\"InvalidProof()\":[{\"notice\":\"thrown when the proof is invalid\"}],\"MaxSupplyReached()\":[{\"notice\":\"thrown when the max supply is reached\"}],\"MintPriceNotPaid()\":[{\"notice\":\"thrown when an incorrect amount of ETH is sent to mint\"}],\"NonExistentTokenURI()\":[{\"notice\":\"thrown when a token is not minted\"}],\"NotAllowed()\":[{\"notice\":\"thrown when the user is not allowed to perform the action\"}],\"WithdrawTransfer()\":[{\"notice\":\"thrown when the withdraw payment transaction fails\"}]},\"events\":{\"MintStateChanged(address,uint8,uint8,uint256)\":{\"notice\":\"emitted when the mint state is changed\"},\"Minted(address,uint256,uint256)\":{\"notice\":\"emitted when an NFT is minted\"}},\"kind\":\"user\",\"methods\":{\"MINT_PRICE()\":{\"notice\":\"the mint price for an individual nft\"},\"TOTAL_SUPPLY()\":{\"notice\":\"the total supply of the collection\"},\"_hasMinted(address)\":{\"notice\":\"mapping to track if a wallet has already minted\"},\"baseURI()\":{\"notice\":\"the base uri\"},\"tokenURI(uint256)\":{\"notice\":\"Get the tokenURI for the given tokenId\"},\"withdrawPayments(address)\":{\"notice\":\"withdraw the balance from the contract\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/tokens/Member.sol\":\"Member\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/tokens/Member.sol\":{\"keccak256\":\"0x6ab0be5b468d6392088351134a124c49fc7d7a8935d623b1e7ff791eba990c40\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://23c9bba8929a167e27ec1e7e01c7eb60bc4add047125f1a23b16eabcdb798c43\",\"dweb:/ipfs/Qmf5K6F7tg7xczvqGnb2bdXdBUDamwXHpYP8d45CSF2owA\"]},\"lib/@openzeppelin/contracts/access/Ownable.sol\":{\"keccak256\":\"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6\",\"dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a\"]},\"lib/@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"keccak256\":\"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f\",\"dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt\"]},\"lib/@openzeppelin/contracts/token/ERC721/ERC721.sol\":{\"keccak256\":\"0x13dd061770956c8489b80cfc89d9cdfc8ea2783d953691ea037a380731d52784\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ed37f0f86e7fe31659e48c3a2a5920a92dd7f13c85cf8991fb79fe5f01e08efd\",\"dweb:/ipfs/QmUtm9bQGvjr9hHGwkPWrbgFmVqzaJcxjkaYDex2oGsonS\"]},\"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"]},\"lib/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"keccak256\":\"0x7f7a26306c79a65fb8b3b6c757cd74660c532cd8a02e165488e30027dd34ca49\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d01e0b2b837ee2f628545e54d8715b49c7ef2befd08356c2e7f6c50dde8a1c22\",\"dweb:/ipfs/QmWBAn6y2D1xgftci97Z3qR9tQnkvwQpYwFwkTvDMvqU4i\"]},\"lib/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol\":{\"keccak256\":\"0x37d1aaaa5a2908a09e9dcf56a26ddf762ecf295afb5964695937344fc6802ce1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ed0bfc1b92153c5000e50f4021367b931bbe96372ac6facec3c4961b72053d02\",\"dweb:/ipfs/Qmbwp8VDerjS5SV1quwHH1oMXxPQ93fzfLVqJ2RCqbowGE\"]},\"lib/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453\",\"dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i\"]},\"lib/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol\":{\"keccak256\":\"0x6400c4bee15052e043e5d10315135972529bd1c8012f43da494dc6b4f4661058\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da5d3d47d35af4373743a559ea4b9b7ecfe4bab6f0703f410c1e59959b7966ac\",\"dweb:/ipfs/QmTHdoghh4WLu4yURjGEgRk162pcwwdsG52MPGa12GqnGR\"]},\"lib/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875\",\"dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L\"]},\"lib/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc\",\"dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AlreadyMinted"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"type":"error","name":"ERC721IncorrectOwner"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC721InsufficientApproval"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"type":"error","name":"ERC721InvalidApprover"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"type":"error","name":"ERC721InvalidOperator"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"type":"error","name":"ERC721InvalidOwner"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"type":"error","name":"ERC721InvalidReceiver"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"type":"error","name":"ERC721InvalidSender"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC721NonexistentToken"},{"inputs":[],"type":"error","name":"InvalidAddress"},{"inputs":[],"type":"error","name":"InvalidMintState"},{"inputs":[],"type":"error","name":"InvalidProof"},{"inputs":[],"type":"error","name":"MaxSupplyReached"},{"inputs":[],"type":"error","name":"MintPriceNotPaid"},{"inputs":[],"type":"error","name":"NonExistentTokenURI"},{"inputs":[],"type":"error","name":"NotAllowed"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"type":"error","name":"OwnableInvalidOwner"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"OwnableUnauthorizedAccount"},{"inputs":[],"type":"error","name":"WithdrawTransfer"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"approved","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bool","name":"approved","type":"bool","indexed":false}],"type":"event","name":"ApprovalForAll","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"enum Member.MintState","name":"prevState","type":"uint8","indexed":true},{"internalType":"enum Member.MintState","name":"newState","type":"uint8","indexed":true},{"internalType":"uint256","name":"timestamp","type":"uint256","indexed":false}],"type":"event","name":"MintStateChanged","anonymous":false},{"inputs":[{"internalType":"address","name":"recipient","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":false},{"internalType":"uint256","name":"timestamp","type":"uint256","indexed":false}],"type":"event","name":"Minted","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"_hasMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"approve"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function","name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"stateMutability":"payable","type":"function","name":"privateMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"stateMutability":"payable","type":"function","name":"publicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setApprovalForAll"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"setBaseURI"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"startPublicMint"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"startWaitlistMint"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transferFrom"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"address payable","name":"payee","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"withdrawPayments"}],"devdoc":{"kind":"dev","methods":{"approve(address,uint256)":{"details":"See {IERC721-approve}."},"balanceOf(address)":{"details":"See {IERC721-balanceOf}."},"getApproved(uint256)":{"details":"See {IERC721-getApproved}."},"isApprovedForAll(address,address)":{"details":"See {IERC721-isApprovedForAll}."},"name()":{"details":"See {IERC721Metadata-name}."},"owner()":{"details":"Returns the address of the current owner."},"ownerOf(uint256)":{"details":"See {IERC721-ownerOf}."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"safeTransferFrom(address,address,uint256)":{"details":"See {IERC721-safeTransferFrom}."},"safeTransferFrom(address,address,uint256,bytes)":{"details":"See {IERC721-safeTransferFrom}."},"setApprovalForAll(address,bool)":{"details":"See {IERC721-setApprovalForAll}."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"symbol()":{"details":"See {IERC721Metadata-symbol}."},"tokenURI(uint256)":{"params":{"tokenId":"the id of the token to get the tokenURI for"},"returns":{"_0":"the tokenURI for the given tokenId"}},"transferFrom(address,address,uint256)":{"details":"See {IERC721-transferFrom}."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"withdrawPayments(address)":{"params":{"payee":"the address that will receive the withdrawn ether"}}},"version":1},"userdoc":{"kind":"user","methods":{"MINT_PRICE()":{"notice":"the mint price for an individual nft"},"TOTAL_SUPPLY()":{"notice":"the total supply of the collection"},"_hasMinted(address)":{"notice":"mapping to track if a wallet has already minted"},"baseURI()":{"notice":"the base uri"},"tokenURI(uint256)":{"notice":"Get the tokenURI for the given tokenId"},"withdrawPayments(address)":{"notice":"withdraw the balance from the contract"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/tokens/Member.sol":"Member"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/tokens/Member.sol":{"keccak256":"0x6ab0be5b468d6392088351134a124c49fc7d7a8935d623b1e7ff791eba990c40","urls":["bzz-raw://23c9bba8929a167e27ec1e7e01c7eb60bc4add047125f1a23b16eabcdb798c43","dweb:/ipfs/Qmf5K6F7tg7xczvqGnb2bdXdBUDamwXHpYP8d45CSF2owA"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"],"license":"MIT"},"lib/@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC721/ERC721.sol":{"keccak256":"0x13dd061770956c8489b80cfc89d9cdfc8ea2783d953691ea037a380731d52784","urls":["bzz-raw://ed37f0f86e7fe31659e48c3a2a5920a92dd7f13c85cf8991fb79fe5f01e08efd","dweb:/ipfs/QmUtm9bQGvjr9hHGwkPWrbgFmVqzaJcxjkaYDex2oGsonS"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"keccak256":"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4","urls":["bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7","dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol":{"keccak256":"0x7f7a26306c79a65fb8b3b6c757cd74660c532cd8a02e165488e30027dd34ca49","urls":["bzz-raw://d01e0b2b837ee2f628545e54d8715b49c7ef2befd08356c2e7f6c50dde8a1c22","dweb:/ipfs/QmWBAn6y2D1xgftci97Z3qR9tQnkvwQpYwFwkTvDMvqU4i"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol":{"keccak256":"0x37d1aaaa5a2908a09e9dcf56a26ddf762ecf295afb5964695937344fc6802ce1","urls":["bzz-raw://ed0bfc1b92153c5000e50f4021367b931bbe96372ac6facec3c4961b72053d02","dweb:/ipfs/Qmbwp8VDerjS5SV1quwHH1oMXxPQ93fzfLVqJ2RCqbowGE"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol":{"keccak256":"0x6400c4bee15052e043e5d10315135972529bd1c8012f43da494dc6b4f4661058","urls":["bzz-raw://da5d3d47d35af4373743a559ea4b9b7ecfe4bab6f0703f410c1e59959b7966ac","dweb:/ipfs/QmTHdoghh4WLu4yURjGEgRk162pcwwdsG52MPGa12GqnGR"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"],"license":"MIT"}},"version":1},"id":244} \ No newline at end of file diff --git a/packages/generated/dev/abis/Member.metadata.json b/packages/generated/dev/abis/Member.metadata.json new file mode 100644 index 000000000..803760fbf --- /dev/null +++ b/packages/generated/dev/abis/Member.metadata.json @@ -0,0 +1,1020 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "name_", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol_", + "type": "string" + }, + { + "internalType": "string", + "name": "baseURI_", + "type": "string" + }, + { + "internalType": "bytes32", + "name": "merkleRoot_", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "type": "error", + "name": "AlreadyMinted" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "type": "error", + "name": "ERC721IncorrectOwner" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC721InsufficientApproval" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "approver", + "type": "address" + } + ], + "type": "error", + "name": "ERC721InvalidApprover" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "type": "error", + "name": "ERC721InvalidOperator" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "type": "error", + "name": "ERC721InvalidOwner" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "type": "error", + "name": "ERC721InvalidReceiver" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "type": "error", + "name": "ERC721InvalidSender" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC721NonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "InvalidAddress" + }, + { + "inputs": [], + "type": "error", + "name": "InvalidMintState" + }, + { + "inputs": [], + "type": "error", + "name": "InvalidProof" + }, + { + "inputs": [], + "type": "error", + "name": "MaxSupplyReached" + }, + { + "inputs": [], + "type": "error", + "name": "MintPriceNotPaid" + }, + { + "inputs": [], + "type": "error", + "name": "NonExistentTokenURI" + }, + { + "inputs": [], + "type": "error", + "name": "NotAllowed" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "type": "error", + "name": "OwnableInvalidOwner" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "OwnableUnauthorizedAccount" + }, + { + "inputs": [], + "type": "error", + "name": "WithdrawTransfer" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "approved", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Approval", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "operator", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ApprovalForAll", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address", + "indexed": true + }, + { + "internalType": "enum Member.MintState", + "name": "prevState", + "type": "uint8", + "indexed": true + }, + { + "internalType": "enum Member.MintState", + "name": "newState", + "type": "uint8", + "indexed": true + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "MintStateChanged", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "Minted", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Transfer", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "MINT_PRICE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "TOTAL_SUPPLY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "_hasMinted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "approve" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "baseURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "currentTokenId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "allowance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "privateMint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "publicMint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "renounceOwnership" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "safeTransferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "safeTransferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setApprovalForAll" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "baseURI_", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setBaseURI" + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "startPublicMint" + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "startWaitlistMint" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function", + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "transferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "transferOwnership" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "payee", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "withdrawPayments" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "approve(address,uint256)": { + "details": "See {IERC721-approve}." + }, + "balanceOf(address)": { + "details": "See {IERC721-balanceOf}." + }, + "getApproved(uint256)": { + "details": "See {IERC721-getApproved}." + }, + "isApprovedForAll(address,address)": { + "details": "See {IERC721-isApprovedForAll}." + }, + "name()": { + "details": "See {IERC721Metadata-name}." + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "ownerOf(uint256)": { + "details": "See {IERC721-ownerOf}." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner." + }, + "safeTransferFrom(address,address,uint256)": { + "details": "See {IERC721-safeTransferFrom}." + }, + "safeTransferFrom(address,address,uint256,bytes)": { + "details": "See {IERC721-safeTransferFrom}." + }, + "setApprovalForAll(address,bool)": { + "details": "See {IERC721-setApprovalForAll}." + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + }, + "symbol()": { + "details": "See {IERC721Metadata-symbol}." + }, + "tokenURI(uint256)": { + "params": { + "tokenId": "the id of the token to get the tokenURI for" + }, + "returns": { + "_0": "the tokenURI for the given tokenId" + } + }, + "transferFrom(address,address,uint256)": { + "details": "See {IERC721-transferFrom}." + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + }, + "withdrawPayments(address)": { + "params": { + "payee": "the address that will receive the withdrawn ether" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "MINT_PRICE()": { + "notice": "the mint price for an individual nft" + }, + "TOTAL_SUPPLY()": { + "notice": "the total supply of the collection" + }, + "_hasMinted(address)": { + "notice": "mapping to track if a wallet has already minted" + }, + "baseURI()": { + "notice": "the base uri" + }, + "tokenURI(uint256)": { + "notice": "Get the tokenURI for the given tokenId" + }, + "withdrawPayments(address)": { + "notice": "withdraw the balance from the contract" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/tokens/Member.sol": "Member" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/tokens/Member.sol": { + "keccak256": "0x6ab0be5b468d6392088351134a124c49fc7d7a8935d623b1e7ff791eba990c40", + "urls": [ + "bzz-raw://23c9bba8929a167e27ec1e7e01c7eb60bc4add047125f1a23b16eabcdb798c43", + "dweb:/ipfs/Qmf5K6F7tg7xczvqGnb2bdXdBUDamwXHpYP8d45CSF2owA" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/access/Ownable.sol": { + "keccak256": "0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb", + "urls": [ + "bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6", + "dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/interfaces/draft-IERC6093.sol": { + "keccak256": "0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7", + "urls": [ + "bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f", + "dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC721/ERC721.sol": { + "keccak256": "0x13dd061770956c8489b80cfc89d9cdfc8ea2783d953691ea037a380731d52784", + "urls": [ + "bzz-raw://ed37f0f86e7fe31659e48c3a2a5920a92dd7f13c85cf8991fb79fe5f01e08efd", + "dweb:/ipfs/QmUtm9bQGvjr9hHGwkPWrbgFmVqzaJcxjkaYDex2oGsonS" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4", + "urls": [ + "bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7", + "dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { + "keccak256": "0x7f7a26306c79a65fb8b3b6c757cd74660c532cd8a02e165488e30027dd34ca49", + "urls": [ + "bzz-raw://d01e0b2b837ee2f628545e54d8715b49c7ef2befd08356c2e7f6c50dde8a1c22", + "dweb:/ipfs/QmWBAn6y2D1xgftci97Z3qR9tQnkvwQpYwFwkTvDMvqU4i" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol": { + "keccak256": "0x37d1aaaa5a2908a09e9dcf56a26ddf762ecf295afb5964695937344fc6802ce1", + "urls": [ + "bzz-raw://ed0bfc1b92153c5000e50f4021367b931bbe96372ac6facec3c4961b72053d02", + "dweb:/ipfs/Qmbwp8VDerjS5SV1quwHH1oMXxPQ93fzfLVqJ2RCqbowGE" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Context.sol": { + "keccak256": "0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2", + "urls": [ + "bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12", + "dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Strings.sol": { + "keccak256": "0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792", + "urls": [ + "bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453", + "dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol": { + "keccak256": "0x6400c4bee15052e043e5d10315135972529bd1c8012f43da494dc6b4f4661058", + "urls": [ + "bzz-raw://da5d3d47d35af4373743a559ea4b9b7ecfe4bab6f0703f410c1e59959b7966ac", + "dweb:/ipfs/QmTHdoghh4WLu4yURjGEgRk162pcwwdsG52MPGa12GqnGR" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/ERC165.sol": { + "keccak256": "0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133", + "urls": [ + "bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8", + "dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/math/Math.sol": { + "keccak256": "0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d", + "urls": [ + "bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875", + "dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/math/SignedMath.sol": { + "keccak256": "0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72", + "urls": [ + "bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc", + "dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/MembershipFacet.abi.json b/packages/generated/dev/abis/MembershipFacet.abi.json new file mode 100644 index 000000000..0d9ec6fb2 --- /dev/null +++ b/packages/generated/dev/abis/MembershipFacet.abi.json @@ -0,0 +1,1783 @@ +[ + { + "type": "function", + "name": "__ERC721A_init", + "inputs": [ + { + "name": "name_", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol_", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__EntitlementGated_init", + "inputs": [ + { + "name": "entitlementChecker", + "type": "address", + "internalType": "contract IEntitlementChecker" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__Membership_init", + "inputs": [ + { + "name": "info", + "type": "tuple", + "internalType": "struct IMembershipBase.Membership", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol", + "type": "string", + "internalType": "string" + }, + { + "name": "price", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maxSupply", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "duration", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "currency", + "type": "address", + "internalType": "address" + }, + { + "name": "feeRecipient", + "type": "address", + "internalType": "address" + }, + { + "name": "freeAllocation", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "pricingModule", + "type": "address", + "internalType": "address" + } + ] + }, + { + "name": "spaceFactory", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "_getMembershipCurrency", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getMembershipFreeAllocation", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getMembershipImage", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getMembershipPrice", + "inputs": [ + { + "name": "totalSupply", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getMembershipSupplyLimit", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getPricingModule", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getSpaceFactory", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_setMembershipFreeAllocation", + "inputs": [ + { + "name": "newAllocation", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "_setMembershipSupplyLimit", + "inputs": [ + { + "name": "newLimit", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "_setPricingModule", + "inputs": [ + { + "name": "newPricingModule", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "expiresAt", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getApproved", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipCurrency", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipDuration", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint64", + "internalType": "uint64" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipFreeAllocation", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipImage", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipLimit", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipPrice", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipPricingModule", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipRenewalPrice", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRuleData", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getSpaceFactory", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isApprovedForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "joinSpace", + "inputs": [ + { + "name": "receiver", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "joinSpaceWithReferral", + "inputs": [ + { + "name": "receiver", + "type": "address", + "internalType": "address" + }, + { + "name": "referrer", + "type": "address", + "internalType": "address" + }, + { + "name": "referralCode", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ownerOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "postEntitlementCheckResult", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "result", + "type": "uint8", + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renewMembership", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "setApprovalForAll", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipFreeAllocation", + "inputs": [ + { + "name": "newAllocation", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipImage", + "inputs": [ + { + "name": "newImage", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipLimit", + "inputs": [ + { + "name": "newLimit", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipPrice", + "inputs": [ + { + "name": "newPrice", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipPricingModule", + "inputs": [ + { + "name": "pricingModule", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenURI", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "withdraw", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EntitlementCheckResultPosted", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "result", + "type": "uint8", + "indexed": false, + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipCurrencyUpdated", + "inputs": [ + { + "name": "currency", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipFeeRecipientUpdated", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipFreeAllocationUpdated", + "inputs": [ + { + "name": "allocation", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipLimitUpdated", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipPriceUpdated", + "inputs": [ + { + "name": "price", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipTokenIssued", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipTokenRejected", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipWithdrawal", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Membership__ReferralCreated", + "inputs": [ + { + "name": "code", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "bps", + "type": "uint16", + "indexed": false, + "internalType": "uint16" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Membership__ReferralRemoved", + "inputs": [ + { + "name": "code", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Membership__ReferralTimeCreated", + "inputs": [ + { + "name": "code", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "bps", + "type": "uint16", + "indexed": false, + "internalType": "uint16" + }, + { + "name": "startTime", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "endTime", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleCreated", + "inputs": [ + { + "name": "creator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRemoved", + "inputs": [ + { + "name": "remover", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleUpdated", + "inputs": [ + { + "name": "updater", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SubscriptionUpdate", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "expiration", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "AddressInsufficientBalance", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Dispatcher__InvalidCaller", + "inputs": [] + }, + { + "type": "error", + "name": "Dispatcher__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__DurationZero", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__NotApprovedOrOwner", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "EntitlementGated_InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_NodeAlreadyVoted", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_NodeNotFound", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyCompleted", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyRegistered", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionNotRegistered", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__AlreadyMember", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InsufficientAllowance", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InsufficientPayment", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidCurrency", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidDuration", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidFeeRecipient", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidFreeAllocation", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidLimit", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidMaxSupply", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidPrice", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidPricingModule", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidReferralBps", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidReferralCode", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidReferralTime", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidTokenId", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__MaxSupplyReached", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__NotExpired", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__PriceTooLow", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "ReentrancyGuard__ReentrantCall", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidPermission", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "SafeERC20FailedOperation", + "inputs": [ + { + "name": "token", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/MembershipFacet.abi.ts b/packages/generated/dev/abis/MembershipFacet.abi.ts new file mode 100644 index 000000000..d23aaa7dd --- /dev/null +++ b/packages/generated/dev/abis/MembershipFacet.abi.ts @@ -0,0 +1,1783 @@ +export default [ + { + "type": "function", + "name": "__ERC721A_init", + "inputs": [ + { + "name": "name_", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol_", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__EntitlementGated_init", + "inputs": [ + { + "name": "entitlementChecker", + "type": "address", + "internalType": "contract IEntitlementChecker" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__Membership_init", + "inputs": [ + { + "name": "info", + "type": "tuple", + "internalType": "struct IMembershipBase.Membership", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol", + "type": "string", + "internalType": "string" + }, + { + "name": "price", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maxSupply", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "duration", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "currency", + "type": "address", + "internalType": "address" + }, + { + "name": "feeRecipient", + "type": "address", + "internalType": "address" + }, + { + "name": "freeAllocation", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "pricingModule", + "type": "address", + "internalType": "address" + } + ] + }, + { + "name": "spaceFactory", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "_getMembershipCurrency", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getMembershipFreeAllocation", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getMembershipImage", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getMembershipPrice", + "inputs": [ + { + "name": "totalSupply", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getMembershipSupplyLimit", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getPricingModule", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getSpaceFactory", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_setMembershipFreeAllocation", + "inputs": [ + { + "name": "newAllocation", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "_setMembershipSupplyLimit", + "inputs": [ + { + "name": "newLimit", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "_setPricingModule", + "inputs": [ + { + "name": "newPricingModule", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "expiresAt", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getApproved", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipCurrency", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipDuration", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint64", + "internalType": "uint64" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipFreeAllocation", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipImage", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipLimit", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipPrice", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipPricingModule", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipRenewalPrice", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRuleData", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getSpaceFactory", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isApprovedForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "joinSpace", + "inputs": [ + { + "name": "receiver", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "joinSpaceWithReferral", + "inputs": [ + { + "name": "receiver", + "type": "address", + "internalType": "address" + }, + { + "name": "referrer", + "type": "address", + "internalType": "address" + }, + { + "name": "referralCode", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ownerOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "postEntitlementCheckResult", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "result", + "type": "uint8", + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renewMembership", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "setApprovalForAll", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipFreeAllocation", + "inputs": [ + { + "name": "newAllocation", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipImage", + "inputs": [ + { + "name": "newImage", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipLimit", + "inputs": [ + { + "name": "newLimit", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipPrice", + "inputs": [ + { + "name": "newPrice", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipPricingModule", + "inputs": [ + { + "name": "pricingModule", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenURI", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "withdraw", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EntitlementCheckResultPosted", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "result", + "type": "uint8", + "indexed": false, + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipCurrencyUpdated", + "inputs": [ + { + "name": "currency", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipFeeRecipientUpdated", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipFreeAllocationUpdated", + "inputs": [ + { + "name": "allocation", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipLimitUpdated", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipPriceUpdated", + "inputs": [ + { + "name": "price", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipTokenIssued", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipTokenRejected", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipWithdrawal", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Membership__ReferralCreated", + "inputs": [ + { + "name": "code", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "bps", + "type": "uint16", + "indexed": false, + "internalType": "uint16" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Membership__ReferralRemoved", + "inputs": [ + { + "name": "code", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Membership__ReferralTimeCreated", + "inputs": [ + { + "name": "code", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "bps", + "type": "uint16", + "indexed": false, + "internalType": "uint16" + }, + { + "name": "startTime", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "endTime", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleCreated", + "inputs": [ + { + "name": "creator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRemoved", + "inputs": [ + { + "name": "remover", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleUpdated", + "inputs": [ + { + "name": "updater", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SubscriptionUpdate", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "expiration", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "AddressInsufficientBalance", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Dispatcher__InvalidCaller", + "inputs": [] + }, + { + "type": "error", + "name": "Dispatcher__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__DurationZero", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__NotApprovedOrOwner", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "EntitlementGated_InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_NodeAlreadyVoted", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_NodeNotFound", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyCompleted", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyRegistered", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionNotRegistered", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__AlreadyMember", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InsufficientAllowance", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InsufficientPayment", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidCurrency", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidDuration", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidFeeRecipient", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidFreeAllocation", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidLimit", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidMaxSupply", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidPrice", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidPricingModule", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidReferralBps", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidReferralCode", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidReferralTime", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidTokenId", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__MaxSupplyReached", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__NotExpired", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__PriceTooLow", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "ReentrancyGuard__ReentrantCall", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidPermission", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "SafeERC20FailedOperation", + "inputs": [ + { + "name": "token", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/MembershipFacet.bin b/packages/generated/dev/abis/MembershipFacet.bin new file mode 100644 index 000000000..75db1fd03 --- /dev/null +++ b/packages/generated/dev/abis/MembershipFacet.bin @@ -0,0 +1 @@ +60806040523480156200001157600080fd5b506200001c62000022565b620000ca565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16156200006f576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff9081161015620000c757805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6152c880620000da6000396000f3fe6080604052600436106102885760003560e01c806377460cd31161015a578063a22cb465116100c1578063d2f01f191161007a578063d2f01f1914610745578063d33d934514610765578063df9a9fe61461077a578063e847abdd1461079a578063e985e9c5146107af578063f9d5d22c146107df57600080fd5b8063a22cb465146106b5578063ac7ee626146106d5578063b3a5be6d146106ea578063b88d4fde146106ff578063c87b56dd14610712578063c9f7c8331461073257600080fd5b80638c625b06116101135780638c625b061461061657806392c399ff1461062957806393b13cb71461065657806395d600c81461066b57806395d89b411461068057806397fb7c1e1461069557600080fd5b806377460cd31461057757806379dda5851461058c5780637adc9cbe146105a15780637c9669ac146105c15780638120f0ba146105d45780638934207f1461060157600080fd5b80634c2abfbe116101fe57806369d5f38a116101b757806369d5f38a146104cd57806369d9346b146104ed578063702515631461050d578063706b8e091461052257806370a082311461053757806373fc5a051461055757600080fd5b80634c2abfbe1461041857806351cff8d9146104385780635803909f146104585780635becd24a146104785780636352211e14610498578063657e45e8146104b857600080fd5b806317c957091161025057806317c957091461034857806318160ddd1461039d57806323b872dd146103b25780633ded10de146103c557806342842e0e146103e55780634739e805146103f857600080fd5b806306fdde031461028d578063081812fc146102b8578063095ea7b3146102f05780630ef1be5f146103055780631278076a14610325575b600080fd5b34801561029957600080fd5b506102a26107ff565b6040516102af9190614348565b60405180910390f35b3480156102c457600080fd5b506102d86102d336600461435b565b61089a565b6040516001600160a01b0390911681526020016102af565b6103036102fe366004614399565b6108ab565b005b34801561031157600080fd5b506103036103203660046143c5565b6108bb565b34801561033157600080fd5b5061033a61093a565b6040519081526020016102af565b34801561035457600080fd5b5061033a61036336600461435b565b60009081527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce0060205260409020546001600160401b031690565b3480156103a957600080fd5b5061033a61094c565b6103036103c0366004614436565b610956565b3480156103d157600080fd5b5061033a6103e036600461435b565b610b4d565b6103036103f3366004614436565b610cdc565b34801561040457600080fd5b50610303610413366004614484565b610cfc565b34801561042457600080fd5b50610303610433366004614629565b610d65565b34801561044457600080fd5b50610303610453366004614732565b610dc9565b34801561046457600080fd5b5061033a61047336600461435b565b610e6b565b34801561048457600080fd5b5061030361049336600461435b565b610e7e565b3480156104a457600080fd5b506102d86104b336600461435b565b610f03565b3480156104c457600080fd5b506102d8610f0e565b3480156104d957600080fd5b506103036104e836600461435b565b610f18565b3480156104f957600080fd5b50610303610508366004614732565b610fc6565b34801561051957600080fd5b506102d8610ff3565b34801561052e57600080fd5b5061033a61100f565b34801561054357600080fd5b5061033a610552366004614732565b611019565b34801561056357600080fd5b5061030361057236600461435b565b611024565b34801561058357600080fd5b506102d8611034565b34801561059857600080fd5b506102d8611050565b3480156105ad57600080fd5b506103036105bc366004614732565b61105a565b6103036105cf36600461435b565b61109e565b3480156105e057600080fd5b506105e96111fb565b6040516001600160401b0390911681526020016102af565b34801561060d57600080fd5b5061033a611205565b610303610624366004614732565b611218565b34801561063557600080fd5b5061064961064436600461474f565b61162a565b6040516102af9190614862565b34801561066257600080fd5b506102a261165f565b34801561067757600080fd5b5061033a611669565b34801561068c57600080fd5b506102a2611673565b3480156106a157600080fd5b506103036106b036600461435b565b61168b565b3480156106c157600080fd5b506103036106d0366004614909565b6116e0565b3480156106e157600080fd5b506102d861175d565b3480156106f657600080fd5b5061033a611779565b61030361070d366004614942565b611818565b34801561071e57600080fd5b506102a261072d36600461435b565b611862565b610303610740366004614436565b6118f2565b34801561075157600080fd5b506103036107603660046149c1565b611a0c565b34801561077157600080fd5b506102a2611a4e565b34801561078657600080fd5b50610303610795366004614732565b611a66565b3480156107a657600080fd5b506102d8611ab3565b3480156107bb57600080fd5b506107cf6107ca366004614a24565b611abd565b60405190151581526020016102af565b3480156107eb57600080fd5b506103036107fa36600461435b565b611ac9565b6060610809611b0c565b600201805461081790614a52565b80601f016020809104026020016040519081016040528092919081815260200182805461084390614a52565b80156108905780601f1061086557610100808354040283529160200191610890565b820191906000526020600020905b81548152906001019060200180831161087357829003601f168201915b5050505050905090565b60006108a582611b30565b92915050565b6108b782826001611b7d565b5050565b6108c3611c32565b6001600160a01b0316336001600160a01b0316146108fb576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6108b782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611cfc92505050565b60006109476103e0611d13565b905090565b6000610947611d13565b600061096182611d32565b9050836001600160a01b0316816001600160a01b0316146109945760405162a1148160e81b815260040160405180910390fd5b6000806109a084611dcd565b915091506109c581876109b03390565b6001600160a01b039081169116811491141790565b6109f0576109d38633611abd565b6109f057604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610a1757604051633a954ecd60e21b815260040160405180910390fd5b8015610a2257600082555b610a2a611b0c565b6001600160a01b0387166000908152600591909101602052604090208054600019019055610a56611b0c565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b17610a8d611b0c565b60008681526004919091016020526040812091909155600160e11b84169003610b035760018401610abc611b0c565b600082815260049190910160205260408120549003610b0157610add611b0c565b548114610b015783610aed611b0c565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600080610b58611df5565b90506000610b64611779565b905083811115610b78575060009392505050565b6006820154604051639262b1b360e01b815230600482015285916001600160a01b031690639262b1b390602401602060405180830381865afa158015610bc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be69190614a86565b1115610bf6575060009392505050565b60088201546001600160a01b031615610c87576008820154604051635cf4ee9160e01b815260048101839052602481018690526001600160a01b0390911690635cf4ee9190604401602060405180830381865afa158015610c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7f9190614a86565b949350505050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c5b573d6000803e3d6000fd5b610cf783838360405180602001604052806000815250611818565b505050565b60026000805160206152288339815191525403610d2c57604051635db5c7cd60e11b815260040160405180910390fd5b610d43600260008051602061522883398151915255565b610d4e838383611e19565b610cf7600160008051602061522883398151915255565b60008051602061528883398151915254640100000000900460ff16610d9d57604051630ef4733760e31b815260040160405180910390fd5b610dad63421fb7a760e01b6120bc565b610db7828261219a565b6108b7826000015183602001516122bd565b610dd1611c32565b6001600160a01b0316336001600160a01b031614610e04576040516365f4906560e01b81523360048201526024016108f2565b6001600160a01b038116610e2b57604051635fbd571760e01b815260040160405180910390fd5b6000610e3561231f565b905080600003610e5857604051635894b54560e11b815260040160405180910390fd5b6108b7610e63610ff3565b308484612332565b60006108a582610e79611d13565b612378565b610e86611c32565b6001600160a01b0316336001600160a01b031614610eb9576040516365f4906560e01b81523360048201526024016108f2565b6000610ec3611205565b90508015801590610ed357508082115b15610ef15760405163c3983b9160e01b815260040160405180910390fd5b610efa826123be565b6108b782611ac9565b60006108a582611d32565b6000610947610ff3565b610f20611c32565b6001600160a01b0316336001600160a01b031614610f53576040516365f4906560e01b81523360048201526024016108f2565b610f5c81612463565b610f6461175d565b6001600160a01b03166391b7f5ed826040518263ffffffff1660e01b8152600401610f9191815260200190565b600060405180830381600087803b158015610fab57600080fd5b505af1158015610fbf573d6000803e3d6000fd5b5050505050565b80610fcf611df5565b60080180546001600160a01b0319166001600160a01b039290921691909117905550565b6000610ffd611df5565b600401546001600160a01b0316919050565b6000610947611779565b60006108a5826124f1565b8061102d611df5565b6003015550565b600061103e611df5565b600601546001600160a01b0316919050565b6000610947611034565b60008051602061528883398151915254640100000000900460ff1661109257604051630ef4733760e31b815260040160405180910390fd5b61109b81612559565b50565b600260008051602061522883398151915254036110ce57604051635db5c7cd60e11b815260040160405180910390fd5b6110e5600260008051602061522883398151915255565b60006110f082610f03565b90506001600160a01b03811661111957604051635fbd571760e01b815260040160405180910390fd5b60008281527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce0060205260409020546001600160401b0316611158612594565b6001600160401b031661116b4283614ab5565b106111895760405163dce9a1d360e01b815260040160405180910390fd5b600061119784610e79611d13565b905080156111d05760006111ab848361261a565b905060006111b98284614ab5565b905080156111cd576111cb8582612732565b505b50505b6111e1846111dc612594565b6128d0565b50505061109b600160008051602061522883398151915255565b6000610947612594565b600061120f611df5565b60030154905090565b6002600080516020615228833981519152540361124857604051635db5c7cd60e11b815260040160405180910390fd5b61125f600260008051602061522883398151915255565b61126881612999565b60405133606081901b6bffffffffffffffffffffffff191660208301524360348301526000918290605401604051602081830303815290604052805190602001209050600061132b826112ff84866112bf87612a02565b604080516020808201959095526001600160a01b039390931683820152606080840192909252805180840390920182526080909201909152805191012090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905061136d8184876040516020016113599291906001600160a01b0392831681529116602082015260400190565b604051602081830303815290604052612a37565b341561137d5761137d8134612a7e565b60006113a9604051806040016040528060098152602001684a6f696e537061636560b81b815250612b04565b905060005b81518110156115d25760008282815181106113cb576113cb614ac8565b6020026020010151905080604001516115c95760005b8160800151518110156115c75760008260800151828151811061140657611406614ac8565b60200260200101519050806001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561144e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114729190614ade565b6115aa576040805160018082528183019092526000916020808301908036833701905050905088816000815181106114ac576114ac614ac8565b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b0316630cf0b533600083604051806040016040528060098152602001684a6f696e537061636560b81b8152506040516020016115109190614afb565b60405160208183030381529060405261152890614b17565b6040518463ffffffff1660e01b815260040161154693929190614b75565b602060405180830381865afa158015611563573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115879190614ade565b156115a45761159587612d4e565b50505050505050505050611613565b506115be565b6115b986828560000151612ea3565b600198505b506001016113e1565b505b506001016113ae565b508461160d576040516001600160a01b038716907f86fd446d5c04e892d58b448a924dcd9c3ece3a5e0d2960b8c35cd475a5595a1f90600090a25b50505050505b61109b600160008051602061522883398151915255565b61164e60405180606001604052806060815260200160608152602001606081525090565b6116588383613152565b9392505050565b6060610947611a4e565b6000610947611205565b606061167d611b0c565b600301805461081790614a52565b611693611c32565b6001600160a01b0316336001600160a01b0316146116c6576040516365f4906560e01b81523360048201526024016108f2565b6116d7816116d2611d13565b61324c565b61109b81611024565b806116e9611b0c565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000611767611df5565b600801546001600160a01b0316919050565b600080611784611df5565b600781015490915080156117985792915050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118119190614a86565b9250505090565b611823848484610956565b6001600160a01b0383163b1561185c5761183f8484848461326d565b61185c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061186d82613358565b61188a57604051630a14c4b560e41b815260040160405180910390fd5b60006118a160408051602081019091526000815290565b905080516000036118c15760405180602001604052806000815250611658565b806118cb84613394565b6040516020016118dc929190614b9e565b6040516020818303038152906040529392505050565b6002600080516020615228833981519152540361192257604051635db5c7cd60e11b815260040160405180910390fd5b611939600260008051602061522883398151915255565b61194283612999565b600061194c6133d8565b9050600061195b6103e0611d13565b905080156119dc5761196d82826133e8565b6000611979868361261a565b905060006119878284614ab5565b90506000611993610ff3565b905081156119d85760006119a78388613408565b90506119b5828a8a84612332565b60006119c18285614ab5565b905080156119d5576119d38a82612732565b505b50505b5050505b6119e78560016134bb565b6119f3826111dc612594565b5050610cf7600160008051602061522883398151915255565b60008051602061528883398151915254640100000000900460ff16611a4457604051630ef4733760e31b815260040160405180910390fd5b6108b782826122bd565b6060611a58611df5565b600c01805461081790614a52565b611a6e611c32565b6001600160a01b0316336001600160a01b031614611aa1576040516365f4906560e01b81523360048201526024016108f2565b611aaa816134d5565b61109b81610fc6565b600061094761175d565b6000611658838361358d565b6000611ad3611df5565b6007810183905560405190915082907fab14a23e88fb272313490d4f20d63098e64fd38304c0e07a377db98c2b39b92f90600090a25050565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b6000611b3b82613358565b611b58576040516333d1c03960e21b815260040160405180910390fd5b611b60611b0c565b60009283526006016020525060409020546001600160a01b031690565b6000611b8883610f03565b90508115611bc757336001600160a01b03821614611bc757611baa813361358d565b611bc7576040516367d9dca160e11b815260040160405180910390fd5b83611bd0611b0c565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015611cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190614bcd565b91505090565b80611d05611df5565b600c01906108b79082614c32565b600080611d1e611b0c565b60010154611d2a611b0c565b540303919050565b600080611d3d611b0c565b60008481526004820160205260408120549350909150600160e01b83169003611db35781600003611dad5780548310611d8957604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115611d8a575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b6000806000611dda611b0c565b60009485526006016020525050604090912080549092909150565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60090565b60008381526000805160206152088339815191526020526040902080546000805160206151e8833981519152919061010090046001600160a01b03161580611e635750805460ff16155b15611e8157604051637ad5a43960e11b815260040160405180910390fd5b600084815260028201602052604090205460ff1615611eb357604051637912b73960e01b815260040160405180910390fd5b600084815260018201602052604081205481908190815b81811015611ff15760008981526001870160205260408120805483908110611ef457611ef4614ac8565b60009182526020909120018054909150336001600160a01b0390911603611f805760008154600160a01b900460ff166002811115611f3457611f34614771565b14611f52576040516347592a4d60e01b815260040160405180910390fd5b80548990829060ff60a01b1916600160a01b836002811115611f7657611f76614771565b0217905550600195505b60018154600160a01b900460ff166002811115611f9f57611f9f614771565b03611fb65784611fae81614cf1565b955050611fe8565b60028154600160a01b900460ff166002811115611fd557611fd5614771565b03611fe85783611fe481614cf1565b9450505b50600101611eca565b508361201057604051638223a7e960e01b815260040160405180910390fd5b61201b600282614d0a565b831180612031575061202e600282614d0a565b82115b156120b15760008881526002860160205260408120805460ff1916600117905582841161205f576002612062565b60015b905061206e8a826135ca565b897fb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c6338260405161209e9190614d2c565b60405180910390a26120af8a6136a2565b505b505050505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114612149576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055612162565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006121a4611df5565b6006810180546001600160a01b038086166001600160a01b031992831617909255610100860151600884018054919093169082161790915560048201805490911673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1790556060840151600382015560e08401516007820181905590915015612228576122288360e001516123be565b6122368361010001516134d5565b604083015115610cf75761224d8360400151612463565b600881015460408085015190516391b7f5ed60e01b81526001600160a01b03909216916391b7f5ed916122869160040190815260200190565b600060405180830381600087803b1580156122a057600080fd5b505af11580156122b4573d6000803e3d6000fd5b50505050505050565b60008051602061528883398151915254640100000000900460ff166122f557604051630ef4733760e31b815260040160405180910390fd5b6123056380ac58cd60e01b6120bc565b612315635b5e139f60e01b6120bc565b6108b7828261376f565b6000612329611df5565b600a0154905090565b801561185c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b0385160161236c5761236782826137a1565b61185c565b61185c84848484613844565b600080612383611df5565b6000858152600982016020526040902054909150156123b55760008481526009909101602052604090205490506108a5565b610c7f83610b4d565b60006123c8611df5565b90508060060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa15801561241f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124439190614a86565b8211156108b75760405163c3983b9160e01b815260040160405180910390fd5b600061246d611034565b6001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ce9190614a86565b9050808210156108b757604051631a23d64760e11b815260040160405180910390fd5b60006001600160a01b03821661251a576040516323d3ad8160e21b815260040160405180910390fd5b6001600160401b0361252a611b0c565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b612569636afd38fd60e11b6120bc565b6000805160206151e883398151915280546001600160a01b0319166001600160a01b03831617905550565b60008061259f611df5565b90508060060160009054906101000a90046001600160a01b03166001600160a01b0316638120f0ba6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190614d3f565b600080612625611df5565b6006810154600480830154604080516301332c8360e61b815290519495506001600160a01b039384169493909116926000928592634ccb20c092818301926020928290030181865afa15801561267f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a39190614bcd565b90506000836001600160a01b0316639f6542aa6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127099190614d5c565b9050612719878261ffff16613897565b955061272783898489612332565b505050505092915050565b60008061273d611df5565b90506000612749610ff3565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03821601612794578382600a0160008282546127849190614d80565b909155508493506108a592505050565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156127dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128019190614a86565b905061280f83883089612332565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015612856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287a9190614a86565b905060006128888383614ab5565b90508781146128aa57604051635894b54560e11b815260040160405180910390fd5b8086600a0160008282546128be9190614d80565b90915550909998505050505050505050565b60008281527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce006020819052604082205490916001600160401b03909116908181036129265761291f8442614d93565b9050612933565b6129308483614d93565b90505b60008581526020848152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825286917f2ec2be2c4b90c2cf13ecb6751a24daed6bb741ae5ed3f7371aabf9402f6d62e8910160405180910390a25050505050565b6001600160a01b0381166129c057604051635fbd571760e01b815260040160405180910390fd5b6129c8611205565b158015906129e457506129d9611205565b6129e1611d13565b10155b1561109b57604051637efcdb4960e01b815260040160405180910390fd5b600081815260008051602061524883398151915260208190526040822080549083612a2c83614cf1565b909155509392505050565b60008281527f34516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e02602052604090206000805160206152488339815191529061185c8382614c32565b80600003612a9f5760405163acdc0d4960e01b815260040160405180910390fd5b803414612abf5760405163acdc0d4960e01b815260040160405180910390fd5b60008281526000805160206152a883398151915260205260408120805460008051602061524883398151915292849291612afa908490614d80565b9091555050505050565b60606000612b1061390c565b80519091506000816001600160401b03811115612b2f57612b2f6144bd565b604051908082528060200260200182016040528015612b58578160200160208202803683370190505b5085516020870120909150600090815b84811015612c27576000612b94878381518110612b8757612b87614ac8565b6020026020010151613937565b509250505060005b8151811015612c1d5783828281518110612bb857612bb8614ac8565b60200260200101518051906020012003612c1557878381518110612bde57612bde614ac8565b6020026020010151868681518110612bf857612bf8614ac8565b602090810291909101015284612c0d81614cf1565b955050612c1d565b600101612b9c565b5050600101612b68565b506000826001600160401b03811115612c4257612c426144bd565b604051908082528060200260200182016040528015612ca757816020015b612c946040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b815260200190600190039081612c605790505b50905060005b83811015612d42576000858281518110612cc957612cc9614ac8565b60200260200101519050600080600080612ce285613937565b93509350935093506040518060a00160405280868152602001858152602001841515815260200183815260200182815250878781518110612d2557612d25614ac8565b602002602001018190525050505050508080600101915050612cad565b50979650505050505050565b600080612d5a83613a62565b806020019051810190612d6d9190614db3565b915091506000612d7e6103e0611d13565b90506000612d8a6133d8565b90508115612e4f5760008581526000805160206152a8833981519152602052604081205490819003612dcf57604051635894b54560e11b815260040160405180910390fd5b80831115612df057604051635894b54560e11b815260040160405180910390fd5b612dfa82846133e8565b6000612e06868561261a565b90506000612e148286614ab5565b90508015612e2857612e268782612732565b505b612e328886613b33565b612e4b8860405180602001604052806000815250612a37565b5050505b612e5a8360016134bb565b612e66816111dc612594565b60405181906001600160a01b038516907f2f40b0474996b72a4251e00fb9170cdd960deea1dc749772cbbab61395b9b57690600090a35050505050565b60008381526000805160206152088339815191526020526040902080546000805160206151e8833981519152919060ff161515600103612f355760005b6004820154811015612f335783826004018281548110612f0257612f02614ac8565b906000526020600020015403612f2b576040516301ab53df60e31b815260040160405180910390fd5b600101612ee0565b505b81546001600160a01b0316612f4c57612f4c613b6e565b8154604051634f84544560e01b8152600560048201526000916001600160a01b031690634f84544590602401600060405180830381865afa158015612f95573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612fbd9190810190614e05565b825490915060ff16612ffe5781546003830180546001600160a01b0319166001600160a01b0388161790556001600160a81b03191661010033021760011782555b600482018054600181018255600091825260208220018590555b81518110156130ee57826001016000868152602001908152602001600020604051806040016040528084848151811061305357613053614ac8565b60200260200101516001600160a01b031681526020016000600281111561307c5761307c614771565b9052815460018101835560009283526020928390208251910180546001600160a01b031981166001600160a01b03909316928317825593830151929390929183916001600160a81b03191617600160a01b8360028111156130df576130df614771565b02179055505050600101613018565b50825460405163541da4e560e01b81526001600160a01b039091169063541da4e5906131249033908a9089908790600401614e98565b600060405180830381600087803b15801561313e57600080fd5b505af11580156120af573d6000803e3d6000fd5b61317660405180606001604052806060815260200160608152602001606081525090565b60008381526000805160206152088339815191526020526040812080546000805160206151e88339815191529260ff909116151590036131c957604051637ad5a43960e11b815260040160405180910390fd5b600381015460405163069a3ee960e01b8152600481018690526001600160a01b0390911690600090829063069a3ee990602401600060405180830381865afa158015613219573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132419190810190615036565b979650505050505050565b808210156108b757604051636664d51760e11b815260040160405180910390fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906132a2903390899088908890600401615173565b6020604051808303816000875af19250505080156132dd575060408051601f3d908101601f191682019092526132da918101906151a6565b60015b61333b573d80801561330b576040519150601f19603f3d011682016040523d82523d6000602084013e613310565b606091505b508051600003613333576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000613362611b0c565b54821080156108a55750600160e01b613379611b0c565b60008481526004919091016020526040902054161592915050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806133ae5750819003601f19909101908152919050565b60006133e2611b0c565b54919050565b806133f1611df5565b600093845260090160205260409092209190915550565b60008181527f3c2290b88407133303e904ceb4ee7d0d14164eda8a629372d8406216ceb57e006020819052604082205461ffff1680830361344e576000925050506108a5565b600084815260018084016020908152604092839020835180850190945280548085529201549083015215801590613492575080514210806134925750806020015142115b156134a357600093505050506108a5565b6134b1868361ffff16613897565b9695505050505050565b6108b7828260405180602001604052806000815250613c22565b6001600160a01b0381166134fc57604051630e88bf4b60e01b815260040160405180910390fd5b613504611034565b6040516346fc05eb60e11b81526001600160a01b0383811660048301529190911690638df80bd690602401602060405180830381865afa15801561354c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135709190614ade565b61109b57604051630e88bf4b60e01b815260040160405180910390fd5b6000613597611b0c565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b60018160028111156135de576135de614771565b036135ec576108b782612d4e565b6000806135f884613a62565b80602001905181019061360b9190614db3565b915091506136288460405180602001604052806000815250612a37565b60008481526000805160206152a883398151915260205260409020548015613667576136548582613b33565b61366761365f610ff3565b308584612332565b6040516001600160a01b038316907f86fd446d5c04e892d58b448a924dcd9c3ece3a5e0d2960b8c35cd475a5595a1f90600090a25050505050565b6000818152600080516020615208833981519152602052604081206000805160206151e8833981519152915b6004820154811015613722578160010160008360040183815481106136f5576136f5614ac8565b90600052602060002001548152602001908152602001600020600061371a9190614284565b6001016136ce565b506137316004820160006142a2565b6000838152600183016020526040812080546001600160a81b03191681556003810180546001600160a01b031916905590610fbf60048301826142a2565b6000613779611b0c565b9050600281016137898482614c32565b50600381016137988382614c32565b50600090555050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146137ee576040519150601f19603f3d011682016040523d82523d6000602084013e6137f3565b606091505b5050905080610cf75760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c65640000000060448201526064016108f2565b816001600160a01b0316836001600160a01b0316031561185c57306001600160a01b03841603613882576123676001600160a01b0385168383613c98565b61185c6001600160a01b038516848484613cf7565b60006127108211156138f55760405162461bcd60e51b815260206004820152602160248201527f426173697320706f696e74732063616e6e6f74206578636565642031305f30306044820152600360fc1b60648201526084016108f2565b61271061390283856151d0565b6116589190614d0a565b60606109477f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01613d30565b600081815260008051602061526883398151915260205260408120805460609291839182919061396690614a52565b80601f016020809104026020016040519081016040528092919081815260200182805461399290614a52565b80156139df5780601f106139b4576101008083540402835291602001916139df565b820191906000526020600020905b8154815290600101906020018083116139c257829003601f168201915b50505050509350613a0d7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0090565b6000868152600391909101602090815260408083206001015460008051602061526883398151915290925290912060ff9091169350613a4e90600201613d3d565b9150613a5985613d48565b90509193509193565b60008181527f34516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e0260205260409020805460609160008051602061524883398151915291613aad90614a52565b80601f0160208091040260200160405190810160405280929190818152602001828054613ad990614a52565b8015613b265780601f10613afb57610100808354040283529160200191613b26565b820191906000526020600020905b815481529060010190602001808311613b0957829003601f168201915b5050505050915050919050565b60008281526000805160206152a883398151915260205260408120805460008051602061524883398151915292849291612afa908490614ab5565b6000805160206151e88339815191526000613b87611df5565b60060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa158015613bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c039190614bcd565b82546001600160a01b0319166001600160a01b03919091161790915550565b613c2c8383613e4c565b6001600160a01b0383163b15610cf7576000613c46611b0c565b5490508281035b613c60600086838060010194508661326d565b613c7d576040516368d2bf6b60e11b815260040160405180910390fd5b818110613c4d5781613c8d611b0c565b5414610fbf57600080fd5b6040516001600160a01b03838116602483015260448201839052610cf791859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613f87565b6040516001600160a01b03848116602483015283811660448301526064820183905261185c9186918216906323b872dd90608401613cc5565b6060600061165883613fea565b60606108a582614046565b60008181526000805160206152688339815191526020526040812060609190613d7390600401614123565b6001600160401b03811115613d8a57613d8a6144bd565b604051908082528060200260200182016040528015613db3578160200160208202803683370190505b50905060005b600084815260008051602061526883398151915260205260409020613de090600401614123565b811015613e4557600084815260008051602061526883398151915260205260408120613e0f906004018361412d565b905080838381518110613e2457613e24614ac8565b6001600160a01b039092166020928302919091019091015250600101613db9565b5092915050565b6000613e56611b0c565b5490506000829003613e7b5760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202613e8f611b0c565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717613eca611b0c565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114613f5457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101613f1c565b5081600003613f7557604051622e076360e81b815260040160405180910390fd5b80613f7e611b0c565b5550610cf79050565b6000613f9c6001600160a01b03841683614139565b90508051600014158015613fc1575080806020019051810190613fbf9190614ade565b155b15610cf757604051635274afe760e01b81526001600160a01b03841660048201526024016108f2565b60608160000180548060200260200160405190810160405280929190818152602001828054801561403a57602002820191906000526020600020905b815481526020019060010190808311614026575b50505050509050919050565b606081600001805480602002602001604051908101604052809291908181526020016000905b8282101561411857838290600052602060002001805461408b90614a52565b80601f01602080910402602001604051908101604052809291908181526020018280546140b790614a52565b80156141045780601f106140d957610100808354040283529160200191614104565b820191906000526020600020905b8154815290600101906020018083116140e757829003601f168201915b50505050508152602001906001019061406c565b505050509050919050565b60006108a5825490565b60006116588383614147565b606061165883836000614171565b600082600001828154811061415e5761415e614ac8565b9060005260206000200154905092915050565b6060814710156141965760405163cd78605960e01b81523060048201526024016108f2565b600080856001600160a01b031684866040516141b29190614afb565b60006040518083038185875af1925050503d80600081146141ef576040519150601f19603f3d011682016040523d82523d6000602084013e6141f4565b606091505b50915091506134b18683836060826142145761420f8261425b565b611658565b815115801561422b57506001600160a01b0384163b155b1561425457604051639996b31560e01b81526001600160a01b03851660048201526024016108f2565b5080611658565b80511561426b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054600082559060005260206000209081019061109b91906142c0565b508054600082559060005260206000209081019061109b91906142e3565b5b808211156142df5780546001600160a81b03191681556001016142c1565b5090565b5b808211156142df57600081556001016142e4565b60005b838110156143135781810151838201526020016142fb565b50506000910152565b600081518084526143348160208601602086016142f8565b601f01601f19169290920160200192915050565b602081526000611658602083018461431c565b60006020828403121561436d57600080fd5b5035919050565b6001600160a01b038116811461109b57600080fd5b803561439481614374565b919050565b600080604083850312156143ac57600080fd5b82356143b781614374565b946020939093013593505050565b600080602083850312156143d857600080fd5b82356001600160401b03808211156143ef57600080fd5b818501915085601f83011261440357600080fd5b81358181111561441257600080fd5b86602082850101111561442457600080fd5b60209290920196919550909350505050565b60008060006060848603121561444b57600080fd5b833561445681614374565b9250602084013561446681614374565b929592945050506040919091013590565b6003811061109b57600080fd5b60008060006060848603121561449957600080fd5b833592506020840135915060408401356144b281614477565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b03811182821017156144f6576144f66144bd565b60405290565b604051608081016001600160401b03811182821017156144f6576144f66144bd565b604051606081016001600160401b03811182821017156144f6576144f66144bd565b604080519081016001600160401b03811182821017156144f6576144f66144bd565b604051601f8201601f191681016001600160401b038111828210171561458a5761458a6144bd565b604052919050565b60006001600160401b038311156145ab576145ab6144bd565b6145be601f8401601f1916602001614562565b90508281528383830111156145d257600080fd5b828260208301376000602084830101529392505050565b600082601f8301126145fa57600080fd5b61165883833560208501614592565b6001600160401b038116811461109b57600080fd5b803561439481614609565b6000806040838503121561463c57600080fd5b82356001600160401b038082111561465357600080fd5b90840190610120828703121561466857600080fd5b6146706144d3565b82358281111561467f57600080fd5b61468b888286016145e9565b8252506020830135828111156146a057600080fd5b6146ac888286016145e9565b60208301525060408301356040820152606083013560608201526146d26080840161461e565b60808201526146e360a08401614389565b60a08201526146f460c08401614389565b60c082015260e083013560e08201526101009150614713828401614389565b8282015280945050505061472960208401614389565b90509250929050565b60006020828403121561474457600080fd5b813561165881614374565b6000806040838503121561476257600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b6003811061109b5761109b614771565b60008151808452602080850194506020840160005b838110156148015781518051600681106147c8576147c8614771565b885280840151848901526040808201516001600160a01b03169089015260609081015190880152608090960195908201906001016147ac565b509495945050505050565b60008151808452602080850194506020840160005b83811015614801578151805161483681614787565b88528084015160ff908116858a0152604091820151169088015260609096019590820190600101614821565b6020808252825160608383015280516080840181905260009291820190839060a08601905b808310156148be578351805161489c81614787565b835285015160ff16858301529284019260019290920191604090910190614887565b50838701519350601f199250828682030160408701526148de8185614797565b935050506040850151818584030160608601526134b1838261480c565b801515811461109b57600080fd5b6000806040838503121561491c57600080fd5b823561492781614374565b91506020830135614937816148fb565b809150509250929050565b6000806000806080858703121561495857600080fd5b843561496381614374565b9350602085013561497381614374565b92506040850135915060608501356001600160401b0381111561499557600080fd5b8501601f810187136149a657600080fd5b6149b587823560208401614592565b91505092959194509250565b600080604083850312156149d457600080fd5b82356001600160401b03808211156149eb57600080fd5b6149f7868387016145e9565b93506020850135915080821115614a0d57600080fd5b50614a1a858286016145e9565b9150509250929050565b60008060408385031215614a3757600080fd5b8235614a4281614374565b9150602083013561493781614374565b600181811c90821680614a6657607f821691505b602082108103611dad57634e487b7160e01b600052602260045260246000fd5b600060208284031215614a9857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108a5576108a5614a9f565b634e487b7160e01b600052603260045260246000fd5b600060208284031215614af057600080fd5b8151611658816148fb565b60008251614b0d8184602087016142f8565b9190910192915050565b80516020808301519190811015611dad5760001960209190910360031b1b16919050565b60008151808452602080850194506020840160005b838110156148015781516001600160a01b031687529582019590820190600101614b50565b838152606060208201526000614b8e6060830185614b3b565b9050826040830152949350505050565b60008351614bb08184602088016142f8565b835190830190614bc48183602088016142f8565b01949350505050565b600060208284031215614bdf57600080fd5b815161165881614374565b601f821115610cf7576000816000526020600020601f850160051c81016020861015614c135750805b601f850160051c820191505b81811015610b4557828155600101614c1f565b81516001600160401b03811115614c4b57614c4b6144bd565b614c5f81614c598454614a52565b84614bea565b602080601f831160018114614c945760008415614c7c5750858301515b600019600386901b1c1916600185901b178555610b45565b600085815260208120601f198616915b82811015614cc357888601518255948401946001909101908401614ca4565b5085821015614ce15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201614d0357614d03614a9f565b5060010190565b600082614d2757634e487b7160e01b600052601260045260246000fd5b500490565b60208101614d3983614787565b91905290565b600060208284031215614d5157600080fd5b815161165881614609565b600060208284031215614d6e57600080fd5b815161ffff8116811461165857600080fd5b808201808211156108a5576108a5614a9f565b6001600160401b03818116838216019080821115613e4557613e45614a9f565b60008060408385031215614dc657600080fd5b8251614dd181614374565b602084015190925061493781614374565b60006001600160401b03821115614dfb57614dfb6144bd565b5060051b60200190565b60006020808385031215614e1857600080fd5b82516001600160401b03811115614e2e57600080fd5b8301601f81018513614e3f57600080fd5b8051614e52614e4d82614de2565b614562565b81815260059190911b82018301908381019087831115614e7157600080fd5b928401925b82841015613241578351614e8981614374565b82529284019290840190614e76565b60018060a01b03851681528360208201528260408201526080606082015260006134b16080830184614b3b565b805160ff8116811461439457600080fd5b600082601f830112614ee757600080fd5b81516020614ef7614e4d83614de2565b82815260079290921b84018101918181019086841115614f1657600080fd5b8286015b84811015614f805760808189031215614f335760008081fd5b614f3b6144fc565b815160068110614f4b5760008081fd5b81528185015185820152604080830151614f6481614374565b9082015260608281015190820152835291830191608001614f1a565b509695505050505050565b600082601f830112614f9c57600080fd5b81516020614fac614e4d83614de2565b82815260609283028501820192828201919087851115614fcb57600080fd5b8387015b858110156150295781818a031215614fe75760008081fd5b614fef61451e565b8151614ffa81614477565b8152615007828701614ec5565b868201526040615018818401614ec5565b908201528452928401928101614fcf565b5090979650505050505050565b6000602080838503121561504957600080fd5b82516001600160401b038082111561506057600080fd5b908401906060828703121561507457600080fd5b61507c61451e565b82518281111561508b57600080fd5b8301601f8101881361509c57600080fd5b80516150aa614e4d82614de2565b81815260069190911b8201860190868101908a8311156150c957600080fd5b928701925b8284101561511d576040848c0312156150e75760008081fd5b6150ef614540565b84516150fa81614477565b8152615107858a01614ec5565b818a0152825260409390930192908701906150ce565b8452505050828401518281111561513357600080fd5b61513f88828601614ed6565b8583015250604083015193508184111561515857600080fd5b61516487858501614f8b565b60408201529695505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134b19083018461431c565b6000602082840312156151b857600080fd5b81516001600160e01b03198116811461165857600080fd5b80820281158282048414176108a5576108a5614a9f56fe9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e0154f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0034516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e00672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0359b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200034516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e01 \ No newline at end of file diff --git a/packages/generated/dev/abis/MembershipFacet.json b/packages/generated/dev/abis/MembershipFacet.json new file mode 100644 index 000000000..eba9ccdc1 --- /dev/null +++ b/packages/generated/dev/abis/MembershipFacet.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__ERC721A_init","inputs":[{"name":"name_","type":"string","internalType":"string"},{"name":"symbol_","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"__EntitlementGated_init","inputs":[{"name":"entitlementChecker","type":"address","internalType":"contract IEntitlementChecker"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"__Membership_init","inputs":[{"name":"info","type":"tuple","internalType":"struct IMembershipBase.Membership","components":[{"name":"name","type":"string","internalType":"string"},{"name":"symbol","type":"string","internalType":"string"},{"name":"price","type":"uint256","internalType":"uint256"},{"name":"maxSupply","type":"uint256","internalType":"uint256"},{"name":"duration","type":"uint64","internalType":"uint64"},{"name":"currency","type":"address","internalType":"address"},{"name":"feeRecipient","type":"address","internalType":"address"},{"name":"freeAllocation","type":"uint256","internalType":"uint256"},{"name":"pricingModule","type":"address","internalType":"address"}]},{"name":"spaceFactory","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"_getMembershipCurrency","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"_getMembershipFreeAllocation","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"_getMembershipImage","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"_getMembershipPrice","inputs":[{"name":"totalSupply","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"_getMembershipSupplyLimit","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"_getPricingModule","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"_getSpaceFactory","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"_setMembershipFreeAllocation","inputs":[{"name":"newAllocation","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"_setMembershipSupplyLimit","inputs":[{"name":"newLimit","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"_setPricingModule","inputs":[{"name":"newPricingModule","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"approve","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"balanceOf","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expiresAt","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getApproved","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getMembershipCurrency","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getMembershipDuration","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"getMembershipFreeAllocation","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getMembershipImage","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"getMembershipLimit","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getMembershipPrice","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getMembershipPricingModule","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getMembershipRenewalPrice","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRuleData","inputs":[{"name":"transactionId","type":"bytes32","internalType":"bytes32"},{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IRuleEntitlement.RuleData","components":[{"name":"operations","type":"tuple[]","internalType":"struct IRuleEntitlement.Operation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CombinedOperationType"},{"name":"index","type":"uint8","internalType":"uint8"}]},{"name":"checkOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.CheckOperation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CheckOperationType"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"contractAddress","type":"address","internalType":"address"},{"name":"threshold","type":"uint256","internalType":"uint256"}]},{"name":"logicalOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.LogicalOperation[]","components":[{"name":"logOpType","type":"uint8","internalType":"enum IRuleEntitlement.LogicalOperationType"},{"name":"leftOperationIndex","type":"uint8","internalType":"uint8"},{"name":"rightOperationIndex","type":"uint8","internalType":"uint8"}]}]}],"stateMutability":"view"},{"type":"function","name":"getSpaceFactory","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"isApprovedForAll","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"joinSpace","inputs":[{"name":"receiver","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"joinSpaceWithReferral","inputs":[{"name":"receiver","type":"address","internalType":"address"},{"name":"referrer","type":"address","internalType":"address"},{"name":"referralCode","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"ownerOf","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"postEntitlementCheckResult","inputs":[{"name":"transactionId","type":"bytes32","internalType":"bytes32"},{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"result","type":"uint8","internalType":"enum IEntitlementGatedBase.NodeVoteStatus"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renewMembership","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"setApprovalForAll","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMembershipFreeAllocation","inputs":[{"name":"newAllocation","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMembershipImage","inputs":[{"name":"newImage","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMembershipLimit","inputs":[{"name":"newLimit","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMembershipPrice","inputs":[{"name":"newPrice","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMembershipPricingModule","inputs":[{"name":"pricingModule","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"tokenURI","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"withdraw","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"Banned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ConsecutiveTransfer","inputs":[{"name":"fromTokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"toTokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EntitlementCheckResultPosted","inputs":[{"name":"transactionId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"result","type":"uint8","indexed":false,"internalType":"enum IEntitlementGatedBase.NodeVoteStatus"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"MembershipCurrencyUpdated","inputs":[{"name":"currency","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"MembershipFeeRecipientUpdated","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"MembershipFreeAllocationUpdated","inputs":[{"name":"allocation","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"MembershipLimitUpdated","inputs":[{"name":"limit","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"MembershipPriceUpdated","inputs":[{"name":"price","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"MembershipTokenIssued","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"MembershipTokenRejected","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"MembershipWithdrawal","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Membership__ReferralCreated","inputs":[{"name":"code","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"bps","type":"uint16","indexed":false,"internalType":"uint16"}],"anonymous":false},{"type":"event","name":"Membership__ReferralRemoved","inputs":[{"name":"code","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Membership__ReferralTimeCreated","inputs":[{"name":"code","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"bps","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"startTime","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"endTime","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleCreated","inputs":[{"name":"creator","type":"address","indexed":true,"internalType":"address"},{"name":"roleId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"RoleRemoved","inputs":[{"name":"remover","type":"address","indexed":true,"internalType":"address"},{"name":"roleId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"RoleUpdated","inputs":[{"name":"updater","type":"address","indexed":true,"internalType":"address"},{"name":"roleId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"SubscriptionUpdate","inputs":[{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"expiration","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unbanned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"AddressInsufficientBalance","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"ApprovalCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"ApprovalQueryForNonexistentToken","inputs":[]},{"type":"error","name":"BalanceQueryForZeroAddress","inputs":[]},{"type":"error","name":"Banning__AlreadyBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__CannotBanSelf","inputs":[]},{"type":"error","name":"Banning__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__NotBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Dispatcher__InvalidCaller","inputs":[]},{"type":"error","name":"Dispatcher__InvalidValue","inputs":[]},{"type":"error","name":"ERC5643__DurationZero","inputs":[]},{"type":"error","name":"ERC5643__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC5643__NotApprovedOrOwner","inputs":[]},{"type":"error","name":"ERC5643__SubscriptionNotRenewable","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"EntitlementGated_InvalidAddress","inputs":[]},{"type":"error","name":"EntitlementGated_NodeAlreadyVoted","inputs":[]},{"type":"error","name":"EntitlementGated_NodeNotFound","inputs":[]},{"type":"error","name":"EntitlementGated_TransactionCheckAlreadyCompleted","inputs":[]},{"type":"error","name":"EntitlementGated_TransactionCheckAlreadyRegistered","inputs":[]},{"type":"error","name":"EntitlementGated_TransactionNotRegistered","inputs":[]},{"type":"error","name":"Entitlement__InvalidValue","inputs":[]},{"type":"error","name":"Entitlement__NotAllowed","inputs":[]},{"type":"error","name":"Entitlement__NotMember","inputs":[]},{"type":"error","name":"Entitlement__ValueAlreadyExists","inputs":[]},{"type":"error","name":"FailedInnerCall","inputs":[]},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"Membership__AlreadyMember","inputs":[]},{"type":"error","name":"Membership__InsufficientAllowance","inputs":[]},{"type":"error","name":"Membership__InsufficientPayment","inputs":[]},{"type":"error","name":"Membership__InvalidAddress","inputs":[]},{"type":"error","name":"Membership__InvalidCurrency","inputs":[]},{"type":"error","name":"Membership__InvalidDuration","inputs":[]},{"type":"error","name":"Membership__InvalidFeeRecipient","inputs":[]},{"type":"error","name":"Membership__InvalidFreeAllocation","inputs":[]},{"type":"error","name":"Membership__InvalidLimit","inputs":[]},{"type":"error","name":"Membership__InvalidMaxSupply","inputs":[]},{"type":"error","name":"Membership__InvalidPrice","inputs":[]},{"type":"error","name":"Membership__InvalidPricingModule","inputs":[]},{"type":"error","name":"Membership__InvalidReferralBps","inputs":[]},{"type":"error","name":"Membership__InvalidReferralCode","inputs":[]},{"type":"error","name":"Membership__InvalidReferralTime","inputs":[]},{"type":"error","name":"Membership__InvalidTokenId","inputs":[]},{"type":"error","name":"Membership__MaxSupplyReached","inputs":[]},{"type":"error","name":"Membership__NotExpired","inputs":[]},{"type":"error","name":"Membership__PriceTooLow","inputs":[]},{"type":"error","name":"MintERC2309QuantityExceedsLimit","inputs":[]},{"type":"error","name":"MintToZeroAddress","inputs":[]},{"type":"error","name":"MintZeroQuantity","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]},{"type":"error","name":"OwnerQueryForNonexistentToken","inputs":[]},{"type":"error","name":"OwnershipNotInitializedForExtraData","inputs":[]},{"type":"error","name":"Pausable__NotPaused","inputs":[]},{"type":"error","name":"Pausable__Paused","inputs":[]},{"type":"error","name":"ReentrancyGuard__ReentrantCall","inputs":[]},{"type":"error","name":"Roles__EntitlementAlreadyExists","inputs":[]},{"type":"error","name":"Roles__EntitlementDoesNotExist","inputs":[]},{"type":"error","name":"Roles__InvalidEntitlementAddress","inputs":[]},{"type":"error","name":"Roles__InvalidPermission","inputs":[]},{"type":"error","name":"Roles__PermissionAlreadyExists","inputs":[]},{"type":"error","name":"Roles__PermissionDoesNotExist","inputs":[]},{"type":"error","name":"Roles__RoleDoesNotExist","inputs":[]},{"type":"error","name":"SafeERC20FailedOperation","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"type":"error","name":"TransferCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"TransferFromIncorrectOwner","inputs":[]},{"type":"error","name":"TransferToNonERC721ReceiverImplementer","inputs":[]},{"type":"error","name":"TransferToZeroAddress","inputs":[]},{"type":"error","name":"URIQueryForNonexistentToken","inputs":[]}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b506200001c62000022565b620000ca565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16156200006f576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff9081161015620000c757805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6152c880620000da6000396000f3fe6080604052600436106102885760003560e01c806377460cd31161015a578063a22cb465116100c1578063d2f01f191161007a578063d2f01f1914610745578063d33d934514610765578063df9a9fe61461077a578063e847abdd1461079a578063e985e9c5146107af578063f9d5d22c146107df57600080fd5b8063a22cb465146106b5578063ac7ee626146106d5578063b3a5be6d146106ea578063b88d4fde146106ff578063c87b56dd14610712578063c9f7c8331461073257600080fd5b80638c625b06116101135780638c625b061461061657806392c399ff1461062957806393b13cb71461065657806395d600c81461066b57806395d89b411461068057806397fb7c1e1461069557600080fd5b806377460cd31461057757806379dda5851461058c5780637adc9cbe146105a15780637c9669ac146105c15780638120f0ba146105d45780638934207f1461060157600080fd5b80634c2abfbe116101fe57806369d5f38a116101b757806369d5f38a146104cd57806369d9346b146104ed578063702515631461050d578063706b8e091461052257806370a082311461053757806373fc5a051461055757600080fd5b80634c2abfbe1461041857806351cff8d9146104385780635803909f146104585780635becd24a146104785780636352211e14610498578063657e45e8146104b857600080fd5b806317c957091161025057806317c957091461034857806318160ddd1461039d57806323b872dd146103b25780633ded10de146103c557806342842e0e146103e55780634739e805146103f857600080fd5b806306fdde031461028d578063081812fc146102b8578063095ea7b3146102f05780630ef1be5f146103055780631278076a14610325575b600080fd5b34801561029957600080fd5b506102a26107ff565b6040516102af9190614348565b60405180910390f35b3480156102c457600080fd5b506102d86102d336600461435b565b61089a565b6040516001600160a01b0390911681526020016102af565b6103036102fe366004614399565b6108ab565b005b34801561031157600080fd5b506103036103203660046143c5565b6108bb565b34801561033157600080fd5b5061033a61093a565b6040519081526020016102af565b34801561035457600080fd5b5061033a61036336600461435b565b60009081527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce0060205260409020546001600160401b031690565b3480156103a957600080fd5b5061033a61094c565b6103036103c0366004614436565b610956565b3480156103d157600080fd5b5061033a6103e036600461435b565b610b4d565b6103036103f3366004614436565b610cdc565b34801561040457600080fd5b50610303610413366004614484565b610cfc565b34801561042457600080fd5b50610303610433366004614629565b610d65565b34801561044457600080fd5b50610303610453366004614732565b610dc9565b34801561046457600080fd5b5061033a61047336600461435b565b610e6b565b34801561048457600080fd5b5061030361049336600461435b565b610e7e565b3480156104a457600080fd5b506102d86104b336600461435b565b610f03565b3480156104c457600080fd5b506102d8610f0e565b3480156104d957600080fd5b506103036104e836600461435b565b610f18565b3480156104f957600080fd5b50610303610508366004614732565b610fc6565b34801561051957600080fd5b506102d8610ff3565b34801561052e57600080fd5b5061033a61100f565b34801561054357600080fd5b5061033a610552366004614732565b611019565b34801561056357600080fd5b5061030361057236600461435b565b611024565b34801561058357600080fd5b506102d8611034565b34801561059857600080fd5b506102d8611050565b3480156105ad57600080fd5b506103036105bc366004614732565b61105a565b6103036105cf36600461435b565b61109e565b3480156105e057600080fd5b506105e96111fb565b6040516001600160401b0390911681526020016102af565b34801561060d57600080fd5b5061033a611205565b610303610624366004614732565b611218565b34801561063557600080fd5b5061064961064436600461474f565b61162a565b6040516102af9190614862565b34801561066257600080fd5b506102a261165f565b34801561067757600080fd5b5061033a611669565b34801561068c57600080fd5b506102a2611673565b3480156106a157600080fd5b506103036106b036600461435b565b61168b565b3480156106c157600080fd5b506103036106d0366004614909565b6116e0565b3480156106e157600080fd5b506102d861175d565b3480156106f657600080fd5b5061033a611779565b61030361070d366004614942565b611818565b34801561071e57600080fd5b506102a261072d36600461435b565b611862565b610303610740366004614436565b6118f2565b34801561075157600080fd5b506103036107603660046149c1565b611a0c565b34801561077157600080fd5b506102a2611a4e565b34801561078657600080fd5b50610303610795366004614732565b611a66565b3480156107a657600080fd5b506102d8611ab3565b3480156107bb57600080fd5b506107cf6107ca366004614a24565b611abd565b60405190151581526020016102af565b3480156107eb57600080fd5b506103036107fa36600461435b565b611ac9565b6060610809611b0c565b600201805461081790614a52565b80601f016020809104026020016040519081016040528092919081815260200182805461084390614a52565b80156108905780601f1061086557610100808354040283529160200191610890565b820191906000526020600020905b81548152906001019060200180831161087357829003601f168201915b5050505050905090565b60006108a582611b30565b92915050565b6108b782826001611b7d565b5050565b6108c3611c32565b6001600160a01b0316336001600160a01b0316146108fb576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6108b782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611cfc92505050565b60006109476103e0611d13565b905090565b6000610947611d13565b600061096182611d32565b9050836001600160a01b0316816001600160a01b0316146109945760405162a1148160e81b815260040160405180910390fd5b6000806109a084611dcd565b915091506109c581876109b03390565b6001600160a01b039081169116811491141790565b6109f0576109d38633611abd565b6109f057604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610a1757604051633a954ecd60e21b815260040160405180910390fd5b8015610a2257600082555b610a2a611b0c565b6001600160a01b0387166000908152600591909101602052604090208054600019019055610a56611b0c565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b17610a8d611b0c565b60008681526004919091016020526040812091909155600160e11b84169003610b035760018401610abc611b0c565b600082815260049190910160205260408120549003610b0157610add611b0c565b548114610b015783610aed611b0c565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600080610b58611df5565b90506000610b64611779565b905083811115610b78575060009392505050565b6006820154604051639262b1b360e01b815230600482015285916001600160a01b031690639262b1b390602401602060405180830381865afa158015610bc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be69190614a86565b1115610bf6575060009392505050565b60088201546001600160a01b031615610c87576008820154604051635cf4ee9160e01b815260048101839052602481018690526001600160a01b0390911690635cf4ee9190604401602060405180830381865afa158015610c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7f9190614a86565b949350505050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c5b573d6000803e3d6000fd5b610cf783838360405180602001604052806000815250611818565b505050565b60026000805160206152288339815191525403610d2c57604051635db5c7cd60e11b815260040160405180910390fd5b610d43600260008051602061522883398151915255565b610d4e838383611e19565b610cf7600160008051602061522883398151915255565b60008051602061528883398151915254640100000000900460ff16610d9d57604051630ef4733760e31b815260040160405180910390fd5b610dad63421fb7a760e01b6120bc565b610db7828261219a565b6108b7826000015183602001516122bd565b610dd1611c32565b6001600160a01b0316336001600160a01b031614610e04576040516365f4906560e01b81523360048201526024016108f2565b6001600160a01b038116610e2b57604051635fbd571760e01b815260040160405180910390fd5b6000610e3561231f565b905080600003610e5857604051635894b54560e11b815260040160405180910390fd5b6108b7610e63610ff3565b308484612332565b60006108a582610e79611d13565b612378565b610e86611c32565b6001600160a01b0316336001600160a01b031614610eb9576040516365f4906560e01b81523360048201526024016108f2565b6000610ec3611205565b90508015801590610ed357508082115b15610ef15760405163c3983b9160e01b815260040160405180910390fd5b610efa826123be565b6108b782611ac9565b60006108a582611d32565b6000610947610ff3565b610f20611c32565b6001600160a01b0316336001600160a01b031614610f53576040516365f4906560e01b81523360048201526024016108f2565b610f5c81612463565b610f6461175d565b6001600160a01b03166391b7f5ed826040518263ffffffff1660e01b8152600401610f9191815260200190565b600060405180830381600087803b158015610fab57600080fd5b505af1158015610fbf573d6000803e3d6000fd5b5050505050565b80610fcf611df5565b60080180546001600160a01b0319166001600160a01b039290921691909117905550565b6000610ffd611df5565b600401546001600160a01b0316919050565b6000610947611779565b60006108a5826124f1565b8061102d611df5565b6003015550565b600061103e611df5565b600601546001600160a01b0316919050565b6000610947611034565b60008051602061528883398151915254640100000000900460ff1661109257604051630ef4733760e31b815260040160405180910390fd5b61109b81612559565b50565b600260008051602061522883398151915254036110ce57604051635db5c7cd60e11b815260040160405180910390fd5b6110e5600260008051602061522883398151915255565b60006110f082610f03565b90506001600160a01b03811661111957604051635fbd571760e01b815260040160405180910390fd5b60008281527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce0060205260409020546001600160401b0316611158612594565b6001600160401b031661116b4283614ab5565b106111895760405163dce9a1d360e01b815260040160405180910390fd5b600061119784610e79611d13565b905080156111d05760006111ab848361261a565b905060006111b98284614ab5565b905080156111cd576111cb8582612732565b505b50505b6111e1846111dc612594565b6128d0565b50505061109b600160008051602061522883398151915255565b6000610947612594565b600061120f611df5565b60030154905090565b6002600080516020615228833981519152540361124857604051635db5c7cd60e11b815260040160405180910390fd5b61125f600260008051602061522883398151915255565b61126881612999565b60405133606081901b6bffffffffffffffffffffffff191660208301524360348301526000918290605401604051602081830303815290604052805190602001209050600061132b826112ff84866112bf87612a02565b604080516020808201959095526001600160a01b039390931683820152606080840192909252805180840390920182526080909201909152805191012090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905061136d8184876040516020016113599291906001600160a01b0392831681529116602082015260400190565b604051602081830303815290604052612a37565b341561137d5761137d8134612a7e565b60006113a9604051806040016040528060098152602001684a6f696e537061636560b81b815250612b04565b905060005b81518110156115d25760008282815181106113cb576113cb614ac8565b6020026020010151905080604001516115c95760005b8160800151518110156115c75760008260800151828151811061140657611406614ac8565b60200260200101519050806001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561144e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114729190614ade565b6115aa576040805160018082528183019092526000916020808301908036833701905050905088816000815181106114ac576114ac614ac8565b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b0316630cf0b533600083604051806040016040528060098152602001684a6f696e537061636560b81b8152506040516020016115109190614afb565b60405160208183030381529060405261152890614b17565b6040518463ffffffff1660e01b815260040161154693929190614b75565b602060405180830381865afa158015611563573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115879190614ade565b156115a45761159587612d4e565b50505050505050505050611613565b506115be565b6115b986828560000151612ea3565b600198505b506001016113e1565b505b506001016113ae565b508461160d576040516001600160a01b038716907f86fd446d5c04e892d58b448a924dcd9c3ece3a5e0d2960b8c35cd475a5595a1f90600090a25b50505050505b61109b600160008051602061522883398151915255565b61164e60405180606001604052806060815260200160608152602001606081525090565b6116588383613152565b9392505050565b6060610947611a4e565b6000610947611205565b606061167d611b0c565b600301805461081790614a52565b611693611c32565b6001600160a01b0316336001600160a01b0316146116c6576040516365f4906560e01b81523360048201526024016108f2565b6116d7816116d2611d13565b61324c565b61109b81611024565b806116e9611b0c565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000611767611df5565b600801546001600160a01b0316919050565b600080611784611df5565b600781015490915080156117985792915050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118119190614a86565b9250505090565b611823848484610956565b6001600160a01b0383163b1561185c5761183f8484848461326d565b61185c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061186d82613358565b61188a57604051630a14c4b560e41b815260040160405180910390fd5b60006118a160408051602081019091526000815290565b905080516000036118c15760405180602001604052806000815250611658565b806118cb84613394565b6040516020016118dc929190614b9e565b6040516020818303038152906040529392505050565b6002600080516020615228833981519152540361192257604051635db5c7cd60e11b815260040160405180910390fd5b611939600260008051602061522883398151915255565b61194283612999565b600061194c6133d8565b9050600061195b6103e0611d13565b905080156119dc5761196d82826133e8565b6000611979868361261a565b905060006119878284614ab5565b90506000611993610ff3565b905081156119d85760006119a78388613408565b90506119b5828a8a84612332565b60006119c18285614ab5565b905080156119d5576119d38a82612732565b505b50505b5050505b6119e78560016134bb565b6119f3826111dc612594565b5050610cf7600160008051602061522883398151915255565b60008051602061528883398151915254640100000000900460ff16611a4457604051630ef4733760e31b815260040160405180910390fd5b6108b782826122bd565b6060611a58611df5565b600c01805461081790614a52565b611a6e611c32565b6001600160a01b0316336001600160a01b031614611aa1576040516365f4906560e01b81523360048201526024016108f2565b611aaa816134d5565b61109b81610fc6565b600061094761175d565b6000611658838361358d565b6000611ad3611df5565b6007810183905560405190915082907fab14a23e88fb272313490d4f20d63098e64fd38304c0e07a377db98c2b39b92f90600090a25050565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b6000611b3b82613358565b611b58576040516333d1c03960e21b815260040160405180910390fd5b611b60611b0c565b60009283526006016020525060409020546001600160a01b031690565b6000611b8883610f03565b90508115611bc757336001600160a01b03821614611bc757611baa813361358d565b611bc7576040516367d9dca160e11b815260040160405180910390fd5b83611bd0611b0c565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015611cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190614bcd565b91505090565b80611d05611df5565b600c01906108b79082614c32565b600080611d1e611b0c565b60010154611d2a611b0c565b540303919050565b600080611d3d611b0c565b60008481526004820160205260408120549350909150600160e01b83169003611db35781600003611dad5780548310611d8957604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115611d8a575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b6000806000611dda611b0c565b60009485526006016020525050604090912080549092909150565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60090565b60008381526000805160206152088339815191526020526040902080546000805160206151e8833981519152919061010090046001600160a01b03161580611e635750805460ff16155b15611e8157604051637ad5a43960e11b815260040160405180910390fd5b600084815260028201602052604090205460ff1615611eb357604051637912b73960e01b815260040160405180910390fd5b600084815260018201602052604081205481908190815b81811015611ff15760008981526001870160205260408120805483908110611ef457611ef4614ac8565b60009182526020909120018054909150336001600160a01b0390911603611f805760008154600160a01b900460ff166002811115611f3457611f34614771565b14611f52576040516347592a4d60e01b815260040160405180910390fd5b80548990829060ff60a01b1916600160a01b836002811115611f7657611f76614771565b0217905550600195505b60018154600160a01b900460ff166002811115611f9f57611f9f614771565b03611fb65784611fae81614cf1565b955050611fe8565b60028154600160a01b900460ff166002811115611fd557611fd5614771565b03611fe85783611fe481614cf1565b9450505b50600101611eca565b508361201057604051638223a7e960e01b815260040160405180910390fd5b61201b600282614d0a565b831180612031575061202e600282614d0a565b82115b156120b15760008881526002860160205260408120805460ff1916600117905582841161205f576002612062565b60015b905061206e8a826135ca565b897fb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c6338260405161209e9190614d2c565b60405180910390a26120af8a6136a2565b505b505050505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114612149576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055612162565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006121a4611df5565b6006810180546001600160a01b038086166001600160a01b031992831617909255610100860151600884018054919093169082161790915560048201805490911673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1790556060840151600382015560e08401516007820181905590915015612228576122288360e001516123be565b6122368361010001516134d5565b604083015115610cf75761224d8360400151612463565b600881015460408085015190516391b7f5ed60e01b81526001600160a01b03909216916391b7f5ed916122869160040190815260200190565b600060405180830381600087803b1580156122a057600080fd5b505af11580156122b4573d6000803e3d6000fd5b50505050505050565b60008051602061528883398151915254640100000000900460ff166122f557604051630ef4733760e31b815260040160405180910390fd5b6123056380ac58cd60e01b6120bc565b612315635b5e139f60e01b6120bc565b6108b7828261376f565b6000612329611df5565b600a0154905090565b801561185c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b0385160161236c5761236782826137a1565b61185c565b61185c84848484613844565b600080612383611df5565b6000858152600982016020526040902054909150156123b55760008481526009909101602052604090205490506108a5565b610c7f83610b4d565b60006123c8611df5565b90508060060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa15801561241f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124439190614a86565b8211156108b75760405163c3983b9160e01b815260040160405180910390fd5b600061246d611034565b6001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ce9190614a86565b9050808210156108b757604051631a23d64760e11b815260040160405180910390fd5b60006001600160a01b03821661251a576040516323d3ad8160e21b815260040160405180910390fd5b6001600160401b0361252a611b0c565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b612569636afd38fd60e11b6120bc565b6000805160206151e883398151915280546001600160a01b0319166001600160a01b03831617905550565b60008061259f611df5565b90508060060160009054906101000a90046001600160a01b03166001600160a01b0316638120f0ba6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190614d3f565b600080612625611df5565b6006810154600480830154604080516301332c8360e61b815290519495506001600160a01b039384169493909116926000928592634ccb20c092818301926020928290030181865afa15801561267f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a39190614bcd565b90506000836001600160a01b0316639f6542aa6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127099190614d5c565b9050612719878261ffff16613897565b955061272783898489612332565b505050505092915050565b60008061273d611df5565b90506000612749610ff3565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03821601612794578382600a0160008282546127849190614d80565b909155508493506108a592505050565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156127dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128019190614a86565b905061280f83883089612332565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015612856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287a9190614a86565b905060006128888383614ab5565b90508781146128aa57604051635894b54560e11b815260040160405180910390fd5b8086600a0160008282546128be9190614d80565b90915550909998505050505050505050565b60008281527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce006020819052604082205490916001600160401b03909116908181036129265761291f8442614d93565b9050612933565b6129308483614d93565b90505b60008581526020848152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825286917f2ec2be2c4b90c2cf13ecb6751a24daed6bb741ae5ed3f7371aabf9402f6d62e8910160405180910390a25050505050565b6001600160a01b0381166129c057604051635fbd571760e01b815260040160405180910390fd5b6129c8611205565b158015906129e457506129d9611205565b6129e1611d13565b10155b1561109b57604051637efcdb4960e01b815260040160405180910390fd5b600081815260008051602061524883398151915260208190526040822080549083612a2c83614cf1565b909155509392505050565b60008281527f34516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e02602052604090206000805160206152488339815191529061185c8382614c32565b80600003612a9f5760405163acdc0d4960e01b815260040160405180910390fd5b803414612abf5760405163acdc0d4960e01b815260040160405180910390fd5b60008281526000805160206152a883398151915260205260408120805460008051602061524883398151915292849291612afa908490614d80565b9091555050505050565b60606000612b1061390c565b80519091506000816001600160401b03811115612b2f57612b2f6144bd565b604051908082528060200260200182016040528015612b58578160200160208202803683370190505b5085516020870120909150600090815b84811015612c27576000612b94878381518110612b8757612b87614ac8565b6020026020010151613937565b509250505060005b8151811015612c1d5783828281518110612bb857612bb8614ac8565b60200260200101518051906020012003612c1557878381518110612bde57612bde614ac8565b6020026020010151868681518110612bf857612bf8614ac8565b602090810291909101015284612c0d81614cf1565b955050612c1d565b600101612b9c565b5050600101612b68565b506000826001600160401b03811115612c4257612c426144bd565b604051908082528060200260200182016040528015612ca757816020015b612c946040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b815260200190600190039081612c605790505b50905060005b83811015612d42576000858281518110612cc957612cc9614ac8565b60200260200101519050600080600080612ce285613937565b93509350935093506040518060a00160405280868152602001858152602001841515815260200183815260200182815250878781518110612d2557612d25614ac8565b602002602001018190525050505050508080600101915050612cad565b50979650505050505050565b600080612d5a83613a62565b806020019051810190612d6d9190614db3565b915091506000612d7e6103e0611d13565b90506000612d8a6133d8565b90508115612e4f5760008581526000805160206152a8833981519152602052604081205490819003612dcf57604051635894b54560e11b815260040160405180910390fd5b80831115612df057604051635894b54560e11b815260040160405180910390fd5b612dfa82846133e8565b6000612e06868561261a565b90506000612e148286614ab5565b90508015612e2857612e268782612732565b505b612e328886613b33565b612e4b8860405180602001604052806000815250612a37565b5050505b612e5a8360016134bb565b612e66816111dc612594565b60405181906001600160a01b038516907f2f40b0474996b72a4251e00fb9170cdd960deea1dc749772cbbab61395b9b57690600090a35050505050565b60008381526000805160206152088339815191526020526040902080546000805160206151e8833981519152919060ff161515600103612f355760005b6004820154811015612f335783826004018281548110612f0257612f02614ac8565b906000526020600020015403612f2b576040516301ab53df60e31b815260040160405180910390fd5b600101612ee0565b505b81546001600160a01b0316612f4c57612f4c613b6e565b8154604051634f84544560e01b8152600560048201526000916001600160a01b031690634f84544590602401600060405180830381865afa158015612f95573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612fbd9190810190614e05565b825490915060ff16612ffe5781546003830180546001600160a01b0319166001600160a01b0388161790556001600160a81b03191661010033021760011782555b600482018054600181018255600091825260208220018590555b81518110156130ee57826001016000868152602001908152602001600020604051806040016040528084848151811061305357613053614ac8565b60200260200101516001600160a01b031681526020016000600281111561307c5761307c614771565b9052815460018101835560009283526020928390208251910180546001600160a01b031981166001600160a01b03909316928317825593830151929390929183916001600160a81b03191617600160a01b8360028111156130df576130df614771565b02179055505050600101613018565b50825460405163541da4e560e01b81526001600160a01b039091169063541da4e5906131249033908a9089908790600401614e98565b600060405180830381600087803b15801561313e57600080fd5b505af11580156120af573d6000803e3d6000fd5b61317660405180606001604052806060815260200160608152602001606081525090565b60008381526000805160206152088339815191526020526040812080546000805160206151e88339815191529260ff909116151590036131c957604051637ad5a43960e11b815260040160405180910390fd5b600381015460405163069a3ee960e01b8152600481018690526001600160a01b0390911690600090829063069a3ee990602401600060405180830381865afa158015613219573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132419190810190615036565b979650505050505050565b808210156108b757604051636664d51760e11b815260040160405180910390fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906132a2903390899088908890600401615173565b6020604051808303816000875af19250505080156132dd575060408051601f3d908101601f191682019092526132da918101906151a6565b60015b61333b573d80801561330b576040519150601f19603f3d011682016040523d82523d6000602084013e613310565b606091505b508051600003613333576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000613362611b0c565b54821080156108a55750600160e01b613379611b0c565b60008481526004919091016020526040902054161592915050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806133ae5750819003601f19909101908152919050565b60006133e2611b0c565b54919050565b806133f1611df5565b600093845260090160205260409092209190915550565b60008181527f3c2290b88407133303e904ceb4ee7d0d14164eda8a629372d8406216ceb57e006020819052604082205461ffff1680830361344e576000925050506108a5565b600084815260018084016020908152604092839020835180850190945280548085529201549083015215801590613492575080514210806134925750806020015142115b156134a357600093505050506108a5565b6134b1868361ffff16613897565b9695505050505050565b6108b7828260405180602001604052806000815250613c22565b6001600160a01b0381166134fc57604051630e88bf4b60e01b815260040160405180910390fd5b613504611034565b6040516346fc05eb60e11b81526001600160a01b0383811660048301529190911690638df80bd690602401602060405180830381865afa15801561354c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135709190614ade565b61109b57604051630e88bf4b60e01b815260040160405180910390fd5b6000613597611b0c565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b60018160028111156135de576135de614771565b036135ec576108b782612d4e565b6000806135f884613a62565b80602001905181019061360b9190614db3565b915091506136288460405180602001604052806000815250612a37565b60008481526000805160206152a883398151915260205260409020548015613667576136548582613b33565b61366761365f610ff3565b308584612332565b6040516001600160a01b038316907f86fd446d5c04e892d58b448a924dcd9c3ece3a5e0d2960b8c35cd475a5595a1f90600090a25050505050565b6000818152600080516020615208833981519152602052604081206000805160206151e8833981519152915b6004820154811015613722578160010160008360040183815481106136f5576136f5614ac8565b90600052602060002001548152602001908152602001600020600061371a9190614284565b6001016136ce565b506137316004820160006142a2565b6000838152600183016020526040812080546001600160a81b03191681556003810180546001600160a01b031916905590610fbf60048301826142a2565b6000613779611b0c565b9050600281016137898482614c32565b50600381016137988382614c32565b50600090555050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146137ee576040519150601f19603f3d011682016040523d82523d6000602084013e6137f3565b606091505b5050905080610cf75760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c65640000000060448201526064016108f2565b816001600160a01b0316836001600160a01b0316031561185c57306001600160a01b03841603613882576123676001600160a01b0385168383613c98565b61185c6001600160a01b038516848484613cf7565b60006127108211156138f55760405162461bcd60e51b815260206004820152602160248201527f426173697320706f696e74732063616e6e6f74206578636565642031305f30306044820152600360fc1b60648201526084016108f2565b61271061390283856151d0565b6116589190614d0a565b60606109477f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01613d30565b600081815260008051602061526883398151915260205260408120805460609291839182919061396690614a52565b80601f016020809104026020016040519081016040528092919081815260200182805461399290614a52565b80156139df5780601f106139b4576101008083540402835291602001916139df565b820191906000526020600020905b8154815290600101906020018083116139c257829003601f168201915b50505050509350613a0d7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0090565b6000868152600391909101602090815260408083206001015460008051602061526883398151915290925290912060ff9091169350613a4e90600201613d3d565b9150613a5985613d48565b90509193509193565b60008181527f34516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e0260205260409020805460609160008051602061524883398151915291613aad90614a52565b80601f0160208091040260200160405190810160405280929190818152602001828054613ad990614a52565b8015613b265780601f10613afb57610100808354040283529160200191613b26565b820191906000526020600020905b815481529060010190602001808311613b0957829003601f168201915b5050505050915050919050565b60008281526000805160206152a883398151915260205260408120805460008051602061524883398151915292849291612afa908490614ab5565b6000805160206151e88339815191526000613b87611df5565b60060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa158015613bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c039190614bcd565b82546001600160a01b0319166001600160a01b03919091161790915550565b613c2c8383613e4c565b6001600160a01b0383163b15610cf7576000613c46611b0c565b5490508281035b613c60600086838060010194508661326d565b613c7d576040516368d2bf6b60e11b815260040160405180910390fd5b818110613c4d5781613c8d611b0c565b5414610fbf57600080fd5b6040516001600160a01b03838116602483015260448201839052610cf791859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613f87565b6040516001600160a01b03848116602483015283811660448301526064820183905261185c9186918216906323b872dd90608401613cc5565b6060600061165883613fea565b60606108a582614046565b60008181526000805160206152688339815191526020526040812060609190613d7390600401614123565b6001600160401b03811115613d8a57613d8a6144bd565b604051908082528060200260200182016040528015613db3578160200160208202803683370190505b50905060005b600084815260008051602061526883398151915260205260409020613de090600401614123565b811015613e4557600084815260008051602061526883398151915260205260408120613e0f906004018361412d565b905080838381518110613e2457613e24614ac8565b6001600160a01b039092166020928302919091019091015250600101613db9565b5092915050565b6000613e56611b0c565b5490506000829003613e7b5760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202613e8f611b0c565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717613eca611b0c565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114613f5457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101613f1c565b5081600003613f7557604051622e076360e81b815260040160405180910390fd5b80613f7e611b0c565b5550610cf79050565b6000613f9c6001600160a01b03841683614139565b90508051600014158015613fc1575080806020019051810190613fbf9190614ade565b155b15610cf757604051635274afe760e01b81526001600160a01b03841660048201526024016108f2565b60608160000180548060200260200160405190810160405280929190818152602001828054801561403a57602002820191906000526020600020905b815481526020019060010190808311614026575b50505050509050919050565b606081600001805480602002602001604051908101604052809291908181526020016000905b8282101561411857838290600052602060002001805461408b90614a52565b80601f01602080910402602001604051908101604052809291908181526020018280546140b790614a52565b80156141045780601f106140d957610100808354040283529160200191614104565b820191906000526020600020905b8154815290600101906020018083116140e757829003601f168201915b50505050508152602001906001019061406c565b505050509050919050565b60006108a5825490565b60006116588383614147565b606061165883836000614171565b600082600001828154811061415e5761415e614ac8565b9060005260206000200154905092915050565b6060814710156141965760405163cd78605960e01b81523060048201526024016108f2565b600080856001600160a01b031684866040516141b29190614afb565b60006040518083038185875af1925050503d80600081146141ef576040519150601f19603f3d011682016040523d82523d6000602084013e6141f4565b606091505b50915091506134b18683836060826142145761420f8261425b565b611658565b815115801561422b57506001600160a01b0384163b155b1561425457604051639996b31560e01b81526001600160a01b03851660048201526024016108f2565b5080611658565b80511561426b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054600082559060005260206000209081019061109b91906142c0565b508054600082559060005260206000209081019061109b91906142e3565b5b808211156142df5780546001600160a81b03191681556001016142c1565b5090565b5b808211156142df57600081556001016142e4565b60005b838110156143135781810151838201526020016142fb565b50506000910152565b600081518084526143348160208601602086016142f8565b601f01601f19169290920160200192915050565b602081526000611658602083018461431c565b60006020828403121561436d57600080fd5b5035919050565b6001600160a01b038116811461109b57600080fd5b803561439481614374565b919050565b600080604083850312156143ac57600080fd5b82356143b781614374565b946020939093013593505050565b600080602083850312156143d857600080fd5b82356001600160401b03808211156143ef57600080fd5b818501915085601f83011261440357600080fd5b81358181111561441257600080fd5b86602082850101111561442457600080fd5b60209290920196919550909350505050565b60008060006060848603121561444b57600080fd5b833561445681614374565b9250602084013561446681614374565b929592945050506040919091013590565b6003811061109b57600080fd5b60008060006060848603121561449957600080fd5b833592506020840135915060408401356144b281614477565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b03811182821017156144f6576144f66144bd565b60405290565b604051608081016001600160401b03811182821017156144f6576144f66144bd565b604051606081016001600160401b03811182821017156144f6576144f66144bd565b604080519081016001600160401b03811182821017156144f6576144f66144bd565b604051601f8201601f191681016001600160401b038111828210171561458a5761458a6144bd565b604052919050565b60006001600160401b038311156145ab576145ab6144bd565b6145be601f8401601f1916602001614562565b90508281528383830111156145d257600080fd5b828260208301376000602084830101529392505050565b600082601f8301126145fa57600080fd5b61165883833560208501614592565b6001600160401b038116811461109b57600080fd5b803561439481614609565b6000806040838503121561463c57600080fd5b82356001600160401b038082111561465357600080fd5b90840190610120828703121561466857600080fd5b6146706144d3565b82358281111561467f57600080fd5b61468b888286016145e9565b8252506020830135828111156146a057600080fd5b6146ac888286016145e9565b60208301525060408301356040820152606083013560608201526146d26080840161461e565b60808201526146e360a08401614389565b60a08201526146f460c08401614389565b60c082015260e083013560e08201526101009150614713828401614389565b8282015280945050505061472960208401614389565b90509250929050565b60006020828403121561474457600080fd5b813561165881614374565b6000806040838503121561476257600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b6003811061109b5761109b614771565b60008151808452602080850194506020840160005b838110156148015781518051600681106147c8576147c8614771565b885280840151848901526040808201516001600160a01b03169089015260609081015190880152608090960195908201906001016147ac565b509495945050505050565b60008151808452602080850194506020840160005b83811015614801578151805161483681614787565b88528084015160ff908116858a0152604091820151169088015260609096019590820190600101614821565b6020808252825160608383015280516080840181905260009291820190839060a08601905b808310156148be578351805161489c81614787565b835285015160ff16858301529284019260019290920191604090910190614887565b50838701519350601f199250828682030160408701526148de8185614797565b935050506040850151818584030160608601526134b1838261480c565b801515811461109b57600080fd5b6000806040838503121561491c57600080fd5b823561492781614374565b91506020830135614937816148fb565b809150509250929050565b6000806000806080858703121561495857600080fd5b843561496381614374565b9350602085013561497381614374565b92506040850135915060608501356001600160401b0381111561499557600080fd5b8501601f810187136149a657600080fd5b6149b587823560208401614592565b91505092959194509250565b600080604083850312156149d457600080fd5b82356001600160401b03808211156149eb57600080fd5b6149f7868387016145e9565b93506020850135915080821115614a0d57600080fd5b50614a1a858286016145e9565b9150509250929050565b60008060408385031215614a3757600080fd5b8235614a4281614374565b9150602083013561493781614374565b600181811c90821680614a6657607f821691505b602082108103611dad57634e487b7160e01b600052602260045260246000fd5b600060208284031215614a9857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108a5576108a5614a9f565b634e487b7160e01b600052603260045260246000fd5b600060208284031215614af057600080fd5b8151611658816148fb565b60008251614b0d8184602087016142f8565b9190910192915050565b80516020808301519190811015611dad5760001960209190910360031b1b16919050565b60008151808452602080850194506020840160005b838110156148015781516001600160a01b031687529582019590820190600101614b50565b838152606060208201526000614b8e6060830185614b3b565b9050826040830152949350505050565b60008351614bb08184602088016142f8565b835190830190614bc48183602088016142f8565b01949350505050565b600060208284031215614bdf57600080fd5b815161165881614374565b601f821115610cf7576000816000526020600020601f850160051c81016020861015614c135750805b601f850160051c820191505b81811015610b4557828155600101614c1f565b81516001600160401b03811115614c4b57614c4b6144bd565b614c5f81614c598454614a52565b84614bea565b602080601f831160018114614c945760008415614c7c5750858301515b600019600386901b1c1916600185901b178555610b45565b600085815260208120601f198616915b82811015614cc357888601518255948401946001909101908401614ca4565b5085821015614ce15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201614d0357614d03614a9f565b5060010190565b600082614d2757634e487b7160e01b600052601260045260246000fd5b500490565b60208101614d3983614787565b91905290565b600060208284031215614d5157600080fd5b815161165881614609565b600060208284031215614d6e57600080fd5b815161ffff8116811461165857600080fd5b808201808211156108a5576108a5614a9f565b6001600160401b03818116838216019080821115613e4557613e45614a9f565b60008060408385031215614dc657600080fd5b8251614dd181614374565b602084015190925061493781614374565b60006001600160401b03821115614dfb57614dfb6144bd565b5060051b60200190565b60006020808385031215614e1857600080fd5b82516001600160401b03811115614e2e57600080fd5b8301601f81018513614e3f57600080fd5b8051614e52614e4d82614de2565b614562565b81815260059190911b82018301908381019087831115614e7157600080fd5b928401925b82841015613241578351614e8981614374565b82529284019290840190614e76565b60018060a01b03851681528360208201528260408201526080606082015260006134b16080830184614b3b565b805160ff8116811461439457600080fd5b600082601f830112614ee757600080fd5b81516020614ef7614e4d83614de2565b82815260079290921b84018101918181019086841115614f1657600080fd5b8286015b84811015614f805760808189031215614f335760008081fd5b614f3b6144fc565b815160068110614f4b5760008081fd5b81528185015185820152604080830151614f6481614374565b9082015260608281015190820152835291830191608001614f1a565b509695505050505050565b600082601f830112614f9c57600080fd5b81516020614fac614e4d83614de2565b82815260609283028501820192828201919087851115614fcb57600080fd5b8387015b858110156150295781818a031215614fe75760008081fd5b614fef61451e565b8151614ffa81614477565b8152615007828701614ec5565b868201526040615018818401614ec5565b908201528452928401928101614fcf565b5090979650505050505050565b6000602080838503121561504957600080fd5b82516001600160401b038082111561506057600080fd5b908401906060828703121561507457600080fd5b61507c61451e565b82518281111561508b57600080fd5b8301601f8101881361509c57600080fd5b80516150aa614e4d82614de2565b81815260069190911b8201860190868101908a8311156150c957600080fd5b928701925b8284101561511d576040848c0312156150e75760008081fd5b6150ef614540565b84516150fa81614477565b8152615107858a01614ec5565b818a0152825260409390930192908701906150ce565b8452505050828401518281111561513357600080fd5b61513f88828601614ed6565b8583015250604083015193508184111561515857600080fd5b61516487858501614f8b565b60408201529695505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134b19083018461431c565b6000602082840312156151b857600080fd5b81516001600160e01b03198116811461165857600080fd5b80820281158282048414176108a5576108a5614a9f56fe9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e0154f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0034516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e00672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0359b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200034516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e01","sourceMap":"1438:12584:187:-:0;;;;;;;;;;;;-1:-1:-1;385:22:49;:20;:22::i;:::-;1438:12584:187;;1653:314:63;303:66:64;1779:14:63;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:63;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:63;1898:16;1886:28;;;;;1927:29;;158:42:376;;;1927:29:63;;146:2:376;131:18;1927:29:63;;;;;;;1844:119;1694:273;1653:314::o;14:192:376:-;1438:12584:187;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106102885760003560e01c806377460cd31161015a578063a22cb465116100c1578063d2f01f191161007a578063d2f01f1914610745578063d33d934514610765578063df9a9fe61461077a578063e847abdd1461079a578063e985e9c5146107af578063f9d5d22c146107df57600080fd5b8063a22cb465146106b5578063ac7ee626146106d5578063b3a5be6d146106ea578063b88d4fde146106ff578063c87b56dd14610712578063c9f7c8331461073257600080fd5b80638c625b06116101135780638c625b061461061657806392c399ff1461062957806393b13cb71461065657806395d600c81461066b57806395d89b411461068057806397fb7c1e1461069557600080fd5b806377460cd31461057757806379dda5851461058c5780637adc9cbe146105a15780637c9669ac146105c15780638120f0ba146105d45780638934207f1461060157600080fd5b80634c2abfbe116101fe57806369d5f38a116101b757806369d5f38a146104cd57806369d9346b146104ed578063702515631461050d578063706b8e091461052257806370a082311461053757806373fc5a051461055757600080fd5b80634c2abfbe1461041857806351cff8d9146104385780635803909f146104585780635becd24a146104785780636352211e14610498578063657e45e8146104b857600080fd5b806317c957091161025057806317c957091461034857806318160ddd1461039d57806323b872dd146103b25780633ded10de146103c557806342842e0e146103e55780634739e805146103f857600080fd5b806306fdde031461028d578063081812fc146102b8578063095ea7b3146102f05780630ef1be5f146103055780631278076a14610325575b600080fd5b34801561029957600080fd5b506102a26107ff565b6040516102af9190614348565b60405180910390f35b3480156102c457600080fd5b506102d86102d336600461435b565b61089a565b6040516001600160a01b0390911681526020016102af565b6103036102fe366004614399565b6108ab565b005b34801561031157600080fd5b506103036103203660046143c5565b6108bb565b34801561033157600080fd5b5061033a61093a565b6040519081526020016102af565b34801561035457600080fd5b5061033a61036336600461435b565b60009081527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce0060205260409020546001600160401b031690565b3480156103a957600080fd5b5061033a61094c565b6103036103c0366004614436565b610956565b3480156103d157600080fd5b5061033a6103e036600461435b565b610b4d565b6103036103f3366004614436565b610cdc565b34801561040457600080fd5b50610303610413366004614484565b610cfc565b34801561042457600080fd5b50610303610433366004614629565b610d65565b34801561044457600080fd5b50610303610453366004614732565b610dc9565b34801561046457600080fd5b5061033a61047336600461435b565b610e6b565b34801561048457600080fd5b5061030361049336600461435b565b610e7e565b3480156104a457600080fd5b506102d86104b336600461435b565b610f03565b3480156104c457600080fd5b506102d8610f0e565b3480156104d957600080fd5b506103036104e836600461435b565b610f18565b3480156104f957600080fd5b50610303610508366004614732565b610fc6565b34801561051957600080fd5b506102d8610ff3565b34801561052e57600080fd5b5061033a61100f565b34801561054357600080fd5b5061033a610552366004614732565b611019565b34801561056357600080fd5b5061030361057236600461435b565b611024565b34801561058357600080fd5b506102d8611034565b34801561059857600080fd5b506102d8611050565b3480156105ad57600080fd5b506103036105bc366004614732565b61105a565b6103036105cf36600461435b565b61109e565b3480156105e057600080fd5b506105e96111fb565b6040516001600160401b0390911681526020016102af565b34801561060d57600080fd5b5061033a611205565b610303610624366004614732565b611218565b34801561063557600080fd5b5061064961064436600461474f565b61162a565b6040516102af9190614862565b34801561066257600080fd5b506102a261165f565b34801561067757600080fd5b5061033a611669565b34801561068c57600080fd5b506102a2611673565b3480156106a157600080fd5b506103036106b036600461435b565b61168b565b3480156106c157600080fd5b506103036106d0366004614909565b6116e0565b3480156106e157600080fd5b506102d861175d565b3480156106f657600080fd5b5061033a611779565b61030361070d366004614942565b611818565b34801561071e57600080fd5b506102a261072d36600461435b565b611862565b610303610740366004614436565b6118f2565b34801561075157600080fd5b506103036107603660046149c1565b611a0c565b34801561077157600080fd5b506102a2611a4e565b34801561078657600080fd5b50610303610795366004614732565b611a66565b3480156107a657600080fd5b506102d8611ab3565b3480156107bb57600080fd5b506107cf6107ca366004614a24565b611abd565b60405190151581526020016102af565b3480156107eb57600080fd5b506103036107fa36600461435b565b611ac9565b6060610809611b0c565b600201805461081790614a52565b80601f016020809104026020016040519081016040528092919081815260200182805461084390614a52565b80156108905780601f1061086557610100808354040283529160200191610890565b820191906000526020600020905b81548152906001019060200180831161087357829003601f168201915b5050505050905090565b60006108a582611b30565b92915050565b6108b782826001611b7d565b5050565b6108c3611c32565b6001600160a01b0316336001600160a01b0316146108fb576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6108b782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611cfc92505050565b60006109476103e0611d13565b905090565b6000610947611d13565b600061096182611d32565b9050836001600160a01b0316816001600160a01b0316146109945760405162a1148160e81b815260040160405180910390fd5b6000806109a084611dcd565b915091506109c581876109b03390565b6001600160a01b039081169116811491141790565b6109f0576109d38633611abd565b6109f057604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610a1757604051633a954ecd60e21b815260040160405180910390fd5b8015610a2257600082555b610a2a611b0c565b6001600160a01b0387166000908152600591909101602052604090208054600019019055610a56611b0c565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b17610a8d611b0c565b60008681526004919091016020526040812091909155600160e11b84169003610b035760018401610abc611b0c565b600082815260049190910160205260408120549003610b0157610add611b0c565b548114610b015783610aed611b0c565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600080610b58611df5565b90506000610b64611779565b905083811115610b78575060009392505050565b6006820154604051639262b1b360e01b815230600482015285916001600160a01b031690639262b1b390602401602060405180830381865afa158015610bc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be69190614a86565b1115610bf6575060009392505050565b60088201546001600160a01b031615610c87576008820154604051635cf4ee9160e01b815260048101839052602481018690526001600160a01b0390911690635cf4ee9190604401602060405180830381865afa158015610c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7f9190614a86565b949350505050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c5b573d6000803e3d6000fd5b610cf783838360405180602001604052806000815250611818565b505050565b60026000805160206152288339815191525403610d2c57604051635db5c7cd60e11b815260040160405180910390fd5b610d43600260008051602061522883398151915255565b610d4e838383611e19565b610cf7600160008051602061522883398151915255565b60008051602061528883398151915254640100000000900460ff16610d9d57604051630ef4733760e31b815260040160405180910390fd5b610dad63421fb7a760e01b6120bc565b610db7828261219a565b6108b7826000015183602001516122bd565b610dd1611c32565b6001600160a01b0316336001600160a01b031614610e04576040516365f4906560e01b81523360048201526024016108f2565b6001600160a01b038116610e2b57604051635fbd571760e01b815260040160405180910390fd5b6000610e3561231f565b905080600003610e5857604051635894b54560e11b815260040160405180910390fd5b6108b7610e63610ff3565b308484612332565b60006108a582610e79611d13565b612378565b610e86611c32565b6001600160a01b0316336001600160a01b031614610eb9576040516365f4906560e01b81523360048201526024016108f2565b6000610ec3611205565b90508015801590610ed357508082115b15610ef15760405163c3983b9160e01b815260040160405180910390fd5b610efa826123be565b6108b782611ac9565b60006108a582611d32565b6000610947610ff3565b610f20611c32565b6001600160a01b0316336001600160a01b031614610f53576040516365f4906560e01b81523360048201526024016108f2565b610f5c81612463565b610f6461175d565b6001600160a01b03166391b7f5ed826040518263ffffffff1660e01b8152600401610f9191815260200190565b600060405180830381600087803b158015610fab57600080fd5b505af1158015610fbf573d6000803e3d6000fd5b5050505050565b80610fcf611df5565b60080180546001600160a01b0319166001600160a01b039290921691909117905550565b6000610ffd611df5565b600401546001600160a01b0316919050565b6000610947611779565b60006108a5826124f1565b8061102d611df5565b6003015550565b600061103e611df5565b600601546001600160a01b0316919050565b6000610947611034565b60008051602061528883398151915254640100000000900460ff1661109257604051630ef4733760e31b815260040160405180910390fd5b61109b81612559565b50565b600260008051602061522883398151915254036110ce57604051635db5c7cd60e11b815260040160405180910390fd5b6110e5600260008051602061522883398151915255565b60006110f082610f03565b90506001600160a01b03811661111957604051635fbd571760e01b815260040160405180910390fd5b60008281527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce0060205260409020546001600160401b0316611158612594565b6001600160401b031661116b4283614ab5565b106111895760405163dce9a1d360e01b815260040160405180910390fd5b600061119784610e79611d13565b905080156111d05760006111ab848361261a565b905060006111b98284614ab5565b905080156111cd576111cb8582612732565b505b50505b6111e1846111dc612594565b6128d0565b50505061109b600160008051602061522883398151915255565b6000610947612594565b600061120f611df5565b60030154905090565b6002600080516020615228833981519152540361124857604051635db5c7cd60e11b815260040160405180910390fd5b61125f600260008051602061522883398151915255565b61126881612999565b60405133606081901b6bffffffffffffffffffffffff191660208301524360348301526000918290605401604051602081830303815290604052805190602001209050600061132b826112ff84866112bf87612a02565b604080516020808201959095526001600160a01b039390931683820152606080840192909252805180840390920182526080909201909152805191012090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905061136d8184876040516020016113599291906001600160a01b0392831681529116602082015260400190565b604051602081830303815290604052612a37565b341561137d5761137d8134612a7e565b60006113a9604051806040016040528060098152602001684a6f696e537061636560b81b815250612b04565b905060005b81518110156115d25760008282815181106113cb576113cb614ac8565b6020026020010151905080604001516115c95760005b8160800151518110156115c75760008260800151828151811061140657611406614ac8565b60200260200101519050806001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561144e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114729190614ade565b6115aa576040805160018082528183019092526000916020808301908036833701905050905088816000815181106114ac576114ac614ac8565b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b0316630cf0b533600083604051806040016040528060098152602001684a6f696e537061636560b81b8152506040516020016115109190614afb565b60405160208183030381529060405261152890614b17565b6040518463ffffffff1660e01b815260040161154693929190614b75565b602060405180830381865afa158015611563573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115879190614ade565b156115a45761159587612d4e565b50505050505050505050611613565b506115be565b6115b986828560000151612ea3565b600198505b506001016113e1565b505b506001016113ae565b508461160d576040516001600160a01b038716907f86fd446d5c04e892d58b448a924dcd9c3ece3a5e0d2960b8c35cd475a5595a1f90600090a25b50505050505b61109b600160008051602061522883398151915255565b61164e60405180606001604052806060815260200160608152602001606081525090565b6116588383613152565b9392505050565b6060610947611a4e565b6000610947611205565b606061167d611b0c565b600301805461081790614a52565b611693611c32565b6001600160a01b0316336001600160a01b0316146116c6576040516365f4906560e01b81523360048201526024016108f2565b6116d7816116d2611d13565b61324c565b61109b81611024565b806116e9611b0c565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000611767611df5565b600801546001600160a01b0316919050565b600080611784611df5565b600781015490915080156117985792915050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118119190614a86565b9250505090565b611823848484610956565b6001600160a01b0383163b1561185c5761183f8484848461326d565b61185c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061186d82613358565b61188a57604051630a14c4b560e41b815260040160405180910390fd5b60006118a160408051602081019091526000815290565b905080516000036118c15760405180602001604052806000815250611658565b806118cb84613394565b6040516020016118dc929190614b9e565b6040516020818303038152906040529392505050565b6002600080516020615228833981519152540361192257604051635db5c7cd60e11b815260040160405180910390fd5b611939600260008051602061522883398151915255565b61194283612999565b600061194c6133d8565b9050600061195b6103e0611d13565b905080156119dc5761196d82826133e8565b6000611979868361261a565b905060006119878284614ab5565b90506000611993610ff3565b905081156119d85760006119a78388613408565b90506119b5828a8a84612332565b60006119c18285614ab5565b905080156119d5576119d38a82612732565b505b50505b5050505b6119e78560016134bb565b6119f3826111dc612594565b5050610cf7600160008051602061522883398151915255565b60008051602061528883398151915254640100000000900460ff16611a4457604051630ef4733760e31b815260040160405180910390fd5b6108b782826122bd565b6060611a58611df5565b600c01805461081790614a52565b611a6e611c32565b6001600160a01b0316336001600160a01b031614611aa1576040516365f4906560e01b81523360048201526024016108f2565b611aaa816134d5565b61109b81610fc6565b600061094761175d565b6000611658838361358d565b6000611ad3611df5565b6007810183905560405190915082907fab14a23e88fb272313490d4f20d63098e64fd38304c0e07a377db98c2b39b92f90600090a25050565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b6000611b3b82613358565b611b58576040516333d1c03960e21b815260040160405180910390fd5b611b60611b0c565b60009283526006016020525060409020546001600160a01b031690565b6000611b8883610f03565b90508115611bc757336001600160a01b03821614611bc757611baa813361358d565b611bc7576040516367d9dca160e11b815260040160405180910390fd5b83611bd0611b0c565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015611cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190614bcd565b91505090565b80611d05611df5565b600c01906108b79082614c32565b600080611d1e611b0c565b60010154611d2a611b0c565b540303919050565b600080611d3d611b0c565b60008481526004820160205260408120549350909150600160e01b83169003611db35781600003611dad5780548310611d8957604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115611d8a575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b6000806000611dda611b0c565b60009485526006016020525050604090912080549092909150565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60090565b60008381526000805160206152088339815191526020526040902080546000805160206151e8833981519152919061010090046001600160a01b03161580611e635750805460ff16155b15611e8157604051637ad5a43960e11b815260040160405180910390fd5b600084815260028201602052604090205460ff1615611eb357604051637912b73960e01b815260040160405180910390fd5b600084815260018201602052604081205481908190815b81811015611ff15760008981526001870160205260408120805483908110611ef457611ef4614ac8565b60009182526020909120018054909150336001600160a01b0390911603611f805760008154600160a01b900460ff166002811115611f3457611f34614771565b14611f52576040516347592a4d60e01b815260040160405180910390fd5b80548990829060ff60a01b1916600160a01b836002811115611f7657611f76614771565b0217905550600195505b60018154600160a01b900460ff166002811115611f9f57611f9f614771565b03611fb65784611fae81614cf1565b955050611fe8565b60028154600160a01b900460ff166002811115611fd557611fd5614771565b03611fe85783611fe481614cf1565b9450505b50600101611eca565b508361201057604051638223a7e960e01b815260040160405180910390fd5b61201b600282614d0a565b831180612031575061202e600282614d0a565b82115b156120b15760008881526002860160205260408120805460ff1916600117905582841161205f576002612062565b60015b905061206e8a826135ca565b897fb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c6338260405161209e9190614d2c565b60405180910390a26120af8a6136a2565b505b505050505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114612149576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055612162565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006121a4611df5565b6006810180546001600160a01b038086166001600160a01b031992831617909255610100860151600884018054919093169082161790915560048201805490911673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1790556060840151600382015560e08401516007820181905590915015612228576122288360e001516123be565b6122368361010001516134d5565b604083015115610cf75761224d8360400151612463565b600881015460408085015190516391b7f5ed60e01b81526001600160a01b03909216916391b7f5ed916122869160040190815260200190565b600060405180830381600087803b1580156122a057600080fd5b505af11580156122b4573d6000803e3d6000fd5b50505050505050565b60008051602061528883398151915254640100000000900460ff166122f557604051630ef4733760e31b815260040160405180910390fd5b6123056380ac58cd60e01b6120bc565b612315635b5e139f60e01b6120bc565b6108b7828261376f565b6000612329611df5565b600a0154905090565b801561185c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b0385160161236c5761236782826137a1565b61185c565b61185c84848484613844565b600080612383611df5565b6000858152600982016020526040902054909150156123b55760008481526009909101602052604090205490506108a5565b610c7f83610b4d565b60006123c8611df5565b90508060060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa15801561241f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124439190614a86565b8211156108b75760405163c3983b9160e01b815260040160405180910390fd5b600061246d611034565b6001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ce9190614a86565b9050808210156108b757604051631a23d64760e11b815260040160405180910390fd5b60006001600160a01b03821661251a576040516323d3ad8160e21b815260040160405180910390fd5b6001600160401b0361252a611b0c565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b612569636afd38fd60e11b6120bc565b6000805160206151e883398151915280546001600160a01b0319166001600160a01b03831617905550565b60008061259f611df5565b90508060060160009054906101000a90046001600160a01b03166001600160a01b0316638120f0ba6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190614d3f565b600080612625611df5565b6006810154600480830154604080516301332c8360e61b815290519495506001600160a01b039384169493909116926000928592634ccb20c092818301926020928290030181865afa15801561267f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a39190614bcd565b90506000836001600160a01b0316639f6542aa6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127099190614d5c565b9050612719878261ffff16613897565b955061272783898489612332565b505050505092915050565b60008061273d611df5565b90506000612749610ff3565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03821601612794578382600a0160008282546127849190614d80565b909155508493506108a592505050565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156127dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128019190614a86565b905061280f83883089612332565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015612856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287a9190614a86565b905060006128888383614ab5565b90508781146128aa57604051635894b54560e11b815260040160405180910390fd5b8086600a0160008282546128be9190614d80565b90915550909998505050505050505050565b60008281527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce006020819052604082205490916001600160401b03909116908181036129265761291f8442614d93565b9050612933565b6129308483614d93565b90505b60008581526020848152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825286917f2ec2be2c4b90c2cf13ecb6751a24daed6bb741ae5ed3f7371aabf9402f6d62e8910160405180910390a25050505050565b6001600160a01b0381166129c057604051635fbd571760e01b815260040160405180910390fd5b6129c8611205565b158015906129e457506129d9611205565b6129e1611d13565b10155b1561109b57604051637efcdb4960e01b815260040160405180910390fd5b600081815260008051602061524883398151915260208190526040822080549083612a2c83614cf1565b909155509392505050565b60008281527f34516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e02602052604090206000805160206152488339815191529061185c8382614c32565b80600003612a9f5760405163acdc0d4960e01b815260040160405180910390fd5b803414612abf5760405163acdc0d4960e01b815260040160405180910390fd5b60008281526000805160206152a883398151915260205260408120805460008051602061524883398151915292849291612afa908490614d80565b9091555050505050565b60606000612b1061390c565b80519091506000816001600160401b03811115612b2f57612b2f6144bd565b604051908082528060200260200182016040528015612b58578160200160208202803683370190505b5085516020870120909150600090815b84811015612c27576000612b94878381518110612b8757612b87614ac8565b6020026020010151613937565b509250505060005b8151811015612c1d5783828281518110612bb857612bb8614ac8565b60200260200101518051906020012003612c1557878381518110612bde57612bde614ac8565b6020026020010151868681518110612bf857612bf8614ac8565b602090810291909101015284612c0d81614cf1565b955050612c1d565b600101612b9c565b5050600101612b68565b506000826001600160401b03811115612c4257612c426144bd565b604051908082528060200260200182016040528015612ca757816020015b612c946040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b815260200190600190039081612c605790505b50905060005b83811015612d42576000858281518110612cc957612cc9614ac8565b60200260200101519050600080600080612ce285613937565b93509350935093506040518060a00160405280868152602001858152602001841515815260200183815260200182815250878781518110612d2557612d25614ac8565b602002602001018190525050505050508080600101915050612cad565b50979650505050505050565b600080612d5a83613a62565b806020019051810190612d6d9190614db3565b915091506000612d7e6103e0611d13565b90506000612d8a6133d8565b90508115612e4f5760008581526000805160206152a8833981519152602052604081205490819003612dcf57604051635894b54560e11b815260040160405180910390fd5b80831115612df057604051635894b54560e11b815260040160405180910390fd5b612dfa82846133e8565b6000612e06868561261a565b90506000612e148286614ab5565b90508015612e2857612e268782612732565b505b612e328886613b33565b612e4b8860405180602001604052806000815250612a37565b5050505b612e5a8360016134bb565b612e66816111dc612594565b60405181906001600160a01b038516907f2f40b0474996b72a4251e00fb9170cdd960deea1dc749772cbbab61395b9b57690600090a35050505050565b60008381526000805160206152088339815191526020526040902080546000805160206151e8833981519152919060ff161515600103612f355760005b6004820154811015612f335783826004018281548110612f0257612f02614ac8565b906000526020600020015403612f2b576040516301ab53df60e31b815260040160405180910390fd5b600101612ee0565b505b81546001600160a01b0316612f4c57612f4c613b6e565b8154604051634f84544560e01b8152600560048201526000916001600160a01b031690634f84544590602401600060405180830381865afa158015612f95573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612fbd9190810190614e05565b825490915060ff16612ffe5781546003830180546001600160a01b0319166001600160a01b0388161790556001600160a81b03191661010033021760011782555b600482018054600181018255600091825260208220018590555b81518110156130ee57826001016000868152602001908152602001600020604051806040016040528084848151811061305357613053614ac8565b60200260200101516001600160a01b031681526020016000600281111561307c5761307c614771565b9052815460018101835560009283526020928390208251910180546001600160a01b031981166001600160a01b03909316928317825593830151929390929183916001600160a81b03191617600160a01b8360028111156130df576130df614771565b02179055505050600101613018565b50825460405163541da4e560e01b81526001600160a01b039091169063541da4e5906131249033908a9089908790600401614e98565b600060405180830381600087803b15801561313e57600080fd5b505af11580156120af573d6000803e3d6000fd5b61317660405180606001604052806060815260200160608152602001606081525090565b60008381526000805160206152088339815191526020526040812080546000805160206151e88339815191529260ff909116151590036131c957604051637ad5a43960e11b815260040160405180910390fd5b600381015460405163069a3ee960e01b8152600481018690526001600160a01b0390911690600090829063069a3ee990602401600060405180830381865afa158015613219573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132419190810190615036565b979650505050505050565b808210156108b757604051636664d51760e11b815260040160405180910390fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906132a2903390899088908890600401615173565b6020604051808303816000875af19250505080156132dd575060408051601f3d908101601f191682019092526132da918101906151a6565b60015b61333b573d80801561330b576040519150601f19603f3d011682016040523d82523d6000602084013e613310565b606091505b508051600003613333576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000613362611b0c565b54821080156108a55750600160e01b613379611b0c565b60008481526004919091016020526040902054161592915050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806133ae5750819003601f19909101908152919050565b60006133e2611b0c565b54919050565b806133f1611df5565b600093845260090160205260409092209190915550565b60008181527f3c2290b88407133303e904ceb4ee7d0d14164eda8a629372d8406216ceb57e006020819052604082205461ffff1680830361344e576000925050506108a5565b600084815260018084016020908152604092839020835180850190945280548085529201549083015215801590613492575080514210806134925750806020015142115b156134a357600093505050506108a5565b6134b1868361ffff16613897565b9695505050505050565b6108b7828260405180602001604052806000815250613c22565b6001600160a01b0381166134fc57604051630e88bf4b60e01b815260040160405180910390fd5b613504611034565b6040516346fc05eb60e11b81526001600160a01b0383811660048301529190911690638df80bd690602401602060405180830381865afa15801561354c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135709190614ade565b61109b57604051630e88bf4b60e01b815260040160405180910390fd5b6000613597611b0c565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b60018160028111156135de576135de614771565b036135ec576108b782612d4e565b6000806135f884613a62565b80602001905181019061360b9190614db3565b915091506136288460405180602001604052806000815250612a37565b60008481526000805160206152a883398151915260205260409020548015613667576136548582613b33565b61366761365f610ff3565b308584612332565b6040516001600160a01b038316907f86fd446d5c04e892d58b448a924dcd9c3ece3a5e0d2960b8c35cd475a5595a1f90600090a25050505050565b6000818152600080516020615208833981519152602052604081206000805160206151e8833981519152915b6004820154811015613722578160010160008360040183815481106136f5576136f5614ac8565b90600052602060002001548152602001908152602001600020600061371a9190614284565b6001016136ce565b506137316004820160006142a2565b6000838152600183016020526040812080546001600160a81b03191681556003810180546001600160a01b031916905590610fbf60048301826142a2565b6000613779611b0c565b9050600281016137898482614c32565b50600381016137988382614c32565b50600090555050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146137ee576040519150601f19603f3d011682016040523d82523d6000602084013e6137f3565b606091505b5050905080610cf75760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c65640000000060448201526064016108f2565b816001600160a01b0316836001600160a01b0316031561185c57306001600160a01b03841603613882576123676001600160a01b0385168383613c98565b61185c6001600160a01b038516848484613cf7565b60006127108211156138f55760405162461bcd60e51b815260206004820152602160248201527f426173697320706f696e74732063616e6e6f74206578636565642031305f30306044820152600360fc1b60648201526084016108f2565b61271061390283856151d0565b6116589190614d0a565b60606109477f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01613d30565b600081815260008051602061526883398151915260205260408120805460609291839182919061396690614a52565b80601f016020809104026020016040519081016040528092919081815260200182805461399290614a52565b80156139df5780601f106139b4576101008083540402835291602001916139df565b820191906000526020600020905b8154815290600101906020018083116139c257829003601f168201915b50505050509350613a0d7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0090565b6000868152600391909101602090815260408083206001015460008051602061526883398151915290925290912060ff9091169350613a4e90600201613d3d565b9150613a5985613d48565b90509193509193565b60008181527f34516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e0260205260409020805460609160008051602061524883398151915291613aad90614a52565b80601f0160208091040260200160405190810160405280929190818152602001828054613ad990614a52565b8015613b265780601f10613afb57610100808354040283529160200191613b26565b820191906000526020600020905b815481529060010190602001808311613b0957829003601f168201915b5050505050915050919050565b60008281526000805160206152a883398151915260205260408120805460008051602061524883398151915292849291612afa908490614ab5565b6000805160206151e88339815191526000613b87611df5565b60060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa158015613bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c039190614bcd565b82546001600160a01b0319166001600160a01b03919091161790915550565b613c2c8383613e4c565b6001600160a01b0383163b15610cf7576000613c46611b0c565b5490508281035b613c60600086838060010194508661326d565b613c7d576040516368d2bf6b60e11b815260040160405180910390fd5b818110613c4d5781613c8d611b0c565b5414610fbf57600080fd5b6040516001600160a01b03838116602483015260448201839052610cf791859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613f87565b6040516001600160a01b03848116602483015283811660448301526064820183905261185c9186918216906323b872dd90608401613cc5565b6060600061165883613fea565b60606108a582614046565b60008181526000805160206152688339815191526020526040812060609190613d7390600401614123565b6001600160401b03811115613d8a57613d8a6144bd565b604051908082528060200260200182016040528015613db3578160200160208202803683370190505b50905060005b600084815260008051602061526883398151915260205260409020613de090600401614123565b811015613e4557600084815260008051602061526883398151915260205260408120613e0f906004018361412d565b905080838381518110613e2457613e24614ac8565b6001600160a01b039092166020928302919091019091015250600101613db9565b5092915050565b6000613e56611b0c565b5490506000829003613e7b5760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202613e8f611b0c565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717613eca611b0c565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114613f5457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101613f1c565b5081600003613f7557604051622e076360e81b815260040160405180910390fd5b80613f7e611b0c565b5550610cf79050565b6000613f9c6001600160a01b03841683614139565b90508051600014158015613fc1575080806020019051810190613fbf9190614ade565b155b15610cf757604051635274afe760e01b81526001600160a01b03841660048201526024016108f2565b60608160000180548060200260200160405190810160405280929190818152602001828054801561403a57602002820191906000526020600020905b815481526020019060010190808311614026575b50505050509050919050565b606081600001805480602002602001604051908101604052809291908181526020016000905b8282101561411857838290600052602060002001805461408b90614a52565b80601f01602080910402602001604051908101604052809291908181526020018280546140b790614a52565b80156141045780601f106140d957610100808354040283529160200191614104565b820191906000526020600020905b8154815290600101906020018083116140e757829003601f168201915b50505050508152602001906001019061406c565b505050509050919050565b60006108a5825490565b60006116588383614147565b606061165883836000614171565b600082600001828154811061415e5761415e614ac8565b9060005260206000200154905092915050565b6060814710156141965760405163cd78605960e01b81523060048201526024016108f2565b600080856001600160a01b031684866040516141b29190614afb565b60006040518083038185875af1925050503d80600081146141ef576040519150601f19603f3d011682016040523d82523d6000602084013e6141f4565b606091505b50915091506134b18683836060826142145761420f8261425b565b611658565b815115801561422b57506001600160a01b0384163b155b1561425457604051639996b31560e01b81526001600160a01b03851660048201526024016108f2565b5080611658565b80511561426b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054600082559060005260206000209081019061109b91906142c0565b508054600082559060005260206000209081019061109b91906142e3565b5b808211156142df5780546001600160a81b03191681556001016142c1565b5090565b5b808211156142df57600081556001016142e4565b60005b838110156143135781810151838201526020016142fb565b50506000910152565b600081518084526143348160208601602086016142f8565b601f01601f19169290920160200192915050565b602081526000611658602083018461431c565b60006020828403121561436d57600080fd5b5035919050565b6001600160a01b038116811461109b57600080fd5b803561439481614374565b919050565b600080604083850312156143ac57600080fd5b82356143b781614374565b946020939093013593505050565b600080602083850312156143d857600080fd5b82356001600160401b03808211156143ef57600080fd5b818501915085601f83011261440357600080fd5b81358181111561441257600080fd5b86602082850101111561442457600080fd5b60209290920196919550909350505050565b60008060006060848603121561444b57600080fd5b833561445681614374565b9250602084013561446681614374565b929592945050506040919091013590565b6003811061109b57600080fd5b60008060006060848603121561449957600080fd5b833592506020840135915060408401356144b281614477565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b03811182821017156144f6576144f66144bd565b60405290565b604051608081016001600160401b03811182821017156144f6576144f66144bd565b604051606081016001600160401b03811182821017156144f6576144f66144bd565b604080519081016001600160401b03811182821017156144f6576144f66144bd565b604051601f8201601f191681016001600160401b038111828210171561458a5761458a6144bd565b604052919050565b60006001600160401b038311156145ab576145ab6144bd565b6145be601f8401601f1916602001614562565b90508281528383830111156145d257600080fd5b828260208301376000602084830101529392505050565b600082601f8301126145fa57600080fd5b61165883833560208501614592565b6001600160401b038116811461109b57600080fd5b803561439481614609565b6000806040838503121561463c57600080fd5b82356001600160401b038082111561465357600080fd5b90840190610120828703121561466857600080fd5b6146706144d3565b82358281111561467f57600080fd5b61468b888286016145e9565b8252506020830135828111156146a057600080fd5b6146ac888286016145e9565b60208301525060408301356040820152606083013560608201526146d26080840161461e565b60808201526146e360a08401614389565b60a08201526146f460c08401614389565b60c082015260e083013560e08201526101009150614713828401614389565b8282015280945050505061472960208401614389565b90509250929050565b60006020828403121561474457600080fd5b813561165881614374565b6000806040838503121561476257600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b6003811061109b5761109b614771565b60008151808452602080850194506020840160005b838110156148015781518051600681106147c8576147c8614771565b885280840151848901526040808201516001600160a01b03169089015260609081015190880152608090960195908201906001016147ac565b509495945050505050565b60008151808452602080850194506020840160005b83811015614801578151805161483681614787565b88528084015160ff908116858a0152604091820151169088015260609096019590820190600101614821565b6020808252825160608383015280516080840181905260009291820190839060a08601905b808310156148be578351805161489c81614787565b835285015160ff16858301529284019260019290920191604090910190614887565b50838701519350601f199250828682030160408701526148de8185614797565b935050506040850151818584030160608601526134b1838261480c565b801515811461109b57600080fd5b6000806040838503121561491c57600080fd5b823561492781614374565b91506020830135614937816148fb565b809150509250929050565b6000806000806080858703121561495857600080fd5b843561496381614374565b9350602085013561497381614374565b92506040850135915060608501356001600160401b0381111561499557600080fd5b8501601f810187136149a657600080fd5b6149b587823560208401614592565b91505092959194509250565b600080604083850312156149d457600080fd5b82356001600160401b03808211156149eb57600080fd5b6149f7868387016145e9565b93506020850135915080821115614a0d57600080fd5b50614a1a858286016145e9565b9150509250929050565b60008060408385031215614a3757600080fd5b8235614a4281614374565b9150602083013561493781614374565b600181811c90821680614a6657607f821691505b602082108103611dad57634e487b7160e01b600052602260045260246000fd5b600060208284031215614a9857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108a5576108a5614a9f565b634e487b7160e01b600052603260045260246000fd5b600060208284031215614af057600080fd5b8151611658816148fb565b60008251614b0d8184602087016142f8565b9190910192915050565b80516020808301519190811015611dad5760001960209190910360031b1b16919050565b60008151808452602080850194506020840160005b838110156148015781516001600160a01b031687529582019590820190600101614b50565b838152606060208201526000614b8e6060830185614b3b565b9050826040830152949350505050565b60008351614bb08184602088016142f8565b835190830190614bc48183602088016142f8565b01949350505050565b600060208284031215614bdf57600080fd5b815161165881614374565b601f821115610cf7576000816000526020600020601f850160051c81016020861015614c135750805b601f850160051c820191505b81811015610b4557828155600101614c1f565b81516001600160401b03811115614c4b57614c4b6144bd565b614c5f81614c598454614a52565b84614bea565b602080601f831160018114614c945760008415614c7c5750858301515b600019600386901b1c1916600185901b178555610b45565b600085815260208120601f198616915b82811015614cc357888601518255948401946001909101908401614ca4565b5085821015614ce15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201614d0357614d03614a9f565b5060010190565b600082614d2757634e487b7160e01b600052601260045260246000fd5b500490565b60208101614d3983614787565b91905290565b600060208284031215614d5157600080fd5b815161165881614609565b600060208284031215614d6e57600080fd5b815161ffff8116811461165857600080fd5b808201808211156108a5576108a5614a9f565b6001600160401b03818116838216019080821115613e4557613e45614a9f565b60008060408385031215614dc657600080fd5b8251614dd181614374565b602084015190925061493781614374565b60006001600160401b03821115614dfb57614dfb6144bd565b5060051b60200190565b60006020808385031215614e1857600080fd5b82516001600160401b03811115614e2e57600080fd5b8301601f81018513614e3f57600080fd5b8051614e52614e4d82614de2565b614562565b81815260059190911b82018301908381019087831115614e7157600080fd5b928401925b82841015613241578351614e8981614374565b82529284019290840190614e76565b60018060a01b03851681528360208201528260408201526080606082015260006134b16080830184614b3b565b805160ff8116811461439457600080fd5b600082601f830112614ee757600080fd5b81516020614ef7614e4d83614de2565b82815260079290921b84018101918181019086841115614f1657600080fd5b8286015b84811015614f805760808189031215614f335760008081fd5b614f3b6144fc565b815160068110614f4b5760008081fd5b81528185015185820152604080830151614f6481614374565b9082015260608281015190820152835291830191608001614f1a565b509695505050505050565b600082601f830112614f9c57600080fd5b81516020614fac614e4d83614de2565b82815260609283028501820192828201919087851115614fcb57600080fd5b8387015b858110156150295781818a031215614fe75760008081fd5b614fef61451e565b8151614ffa81614477565b8152615007828701614ec5565b868201526040615018818401614ec5565b908201528452928401928101614fcf565b5090979650505050505050565b6000602080838503121561504957600080fd5b82516001600160401b038082111561506057600080fd5b908401906060828703121561507457600080fd5b61507c61451e565b82518281111561508b57600080fd5b8301601f8101881361509c57600080fd5b80516150aa614e4d82614de2565b81815260069190911b8201860190868101908a8311156150c957600080fd5b928701925b8284101561511d576040848c0312156150e75760008081fd5b6150ef614540565b84516150fa81614477565b8152615107858a01614ec5565b818a0152825260409390930192908701906150ce565b8452505050828401518281111561513357600080fd5b61513f88828601614ed6565b8583015250604083015193508184111561515857600080fd5b61516487858501614f8b565b60408201529695505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134b19083018461431c565b6000602082840312156151b857600080fd5b81516001600160e01b03198116811461165857600080fd5b80820281158282048414176108a5576108a5614a9f56fe9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e0154f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0034516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e00672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0359b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200034516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e01","sourceMap":"1438:12584:187:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2044:116:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3522:132;;;;;;;;;;-1:-1:-1;3522:132:104;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1119:32:376;;;1101:51;;1089:2;1074:18;3522:132:104;955:203:376;3260:128:104;;;;;;:::i;:::-;;:::i;:::-;;12481:113:187;;;;;;;;;;-1:-1:-1;12481:113:187;;;;;:::i;:::-;;:::i;10273:115::-;;;;;;;;;;;;;:::i;:::-;;;2501:25:376;;;2489:2;2474:18;10273:115:187;2355:177:376;8927:105:187;;;;;;;;;;-1:-1:-1;8927:105:187;;;;;:::i;:::-;8986:7;1090:43:101;;;297:66:102;1090:43:101;;;;;;-1:-1:-1;;;;;1090:43:101;;8927:105:187;1527:93:104;;;;;;;;;;;;;:::i;4917:2680::-;;;;;;:::i;:::-;;:::i;5023:841:186:-;;;;;;;;;;-1:-1:-1;5023:841:186;;;;;:::i;:::-;;:::i;7680:167:104:-;;;;;;:::i;:::-;;:::i;1223:205:177:-;;;;;;;;;;-1:-1:-1;1223:205:177;;;;;:::i;:::-;;:::i;1786:267:187:-;;;;;;;;;;-1:-1:-1;1786:267:187;;;;;:::i;:::-;;:::i;2233:363::-;;;;;;;;;;-1:-1:-1;2233:363:187;;;;;:::i;:::-;;:::i;10422:161::-;;;;;;;;;;-1:-1:-1;10422:161:187;;;;;:::i;:::-;;:::i;10793:528::-;;;;;;;;;;-1:-1:-1;10793:528:187;;;;;:::i;:::-;;:::i;2891:152:104:-;;;;;;;;;;-1:-1:-1;2891:152:104;;;;;:::i;:::-;;:::i;12199:107:187:-;;;;;;;;;;;;;:::i;10077:162::-;;;;;;;;;;-1:-1:-1;10077:162:187;;;;;:::i;:::-;;:::i;4315:130:186:-;;;;;;;;;;-1:-1:-1;4315:130:186;;;;;:::i;:::-;;:::i;8358:127::-;;;;;;;;;;;;;:::i;11355:119:187:-;;;;;;;;;;;;;:::i;1697:107:104:-;;;;;;;;;;-1:-1:-1;1697:107:104;;;;;:::i;:::-;;:::i;7917:128:186:-;;;;;;;;;;-1:-1:-1;7917:128:186;;;;;:::i;:::-;;:::i;8662:115::-;;;;;;;;;;;;;:::i;12913:95:187:-;;;;;;;;;;;;;:::i;690:171:177:-;;;;;;;;;;-1:-1:-1;690:171:177;;;;;:::i;:::-;;:::i;8064:829:187:-;;;;;;:::i;:::-;;:::i;9241:106::-;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;7916:31:376;;;7898:50;;7886:2;7871:18;9241:106:187;7754:200:376;8049:131:186;;;;;;;;;;;;;:::i;3260:2054:187:-;;;;;;:::i;:::-;;:::i;1432:182:177:-;;;;;;;;;;-1:-1:-1;1432:182:177;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;12598:107:187:-;;;;;;;;;;;;;:::i;11883:::-;;;;;;;;;;;;;:::i;2223:120:104:-;;;;;;;;;;;;;:::i;11690:159:187:-;;;;;;;;;;-1:-1:-1;11690:159:187;;;;;:::i;:::-;;:::i;3957:269:104:-;;;;;;;;;;-1:-1:-1;3957:269:104;;;;;:::i;:::-;;:::i;4449:117:186:-;;;;;;;;;;;;;:::i;7169:322::-;;;;;;;;;;;;;:::i;8396:348:104:-;;;;;;:::i;:::-;;:::i;2436:329::-;;;;;;;;;;-1:-1:-1;2436:329:104;;;;;:::i;:::-;;:::i;6546:1310:187:-;;;;;;:::i;:::-;;:::i;876:157:104:-;;;;;;;;;;-1:-1:-1;876:157:104;;;;;:::i;:::-;;:::i;8952:127:186:-;;;;;;;;;;;;;:::i;9558:170:187:-;;;;;;;;;;-1:-1:-1;9558:170:187;;;;;:::i;:::-;;:::i;9762:107::-;;;;;;;;;;;;;:::i;4364:167:104:-;;;;;;;;;;-1:-1:-1;4364:167:104;;;;;:::i;:::-;;:::i;:::-;;;13848:14:376;;13841:22;13823:41;;13811:2;13796:18;4364:167:104;13683:187:376;6926:239:186;;;;;;;;;;-1:-1:-1;6926:239:186;;;;;:::i;:::-;;:::i;2044:116:104:-;2098:13;2126:23;:21;:23::i;:::-;:29;;2119:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2044:116;:::o;3522:132::-;3606:7;3628:21;3641:7;3628:12;:21::i;:::-;3621:28;3522:132;-1:-1:-1;;3522:132:104:o;3260:128::-;3356:27;3365:2;3369:7;3378:4;3356:8;:27::i;:::-;3260:128;;:::o;12481:113:187:-;648:8:83;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:83;:10;-1:-1:-1;;;;;634:22:83;;630:79;;673:29;;-1:-1:-1;;;673:29:83;;691:10;673:29;;;1101:51:376;1074:18;;673:29:83;;;;;;;;630:79;12560:29:187::1;12580:8;;12560:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;12560:19:187::1;::::0;-1:-1:-1;;;12560:29:187:i:1;10273:115::-:0;10326:7;10348:35;10368:14;:12;:14::i;10348:35::-;10341:42;;10273:115;:::o;1527:93:104:-;1579:7;1601:14;:12;:14::i;4917:2680::-;5036:27;5066;5085:7;5066:18;:27::i;:::-;5036:57;;5145:4;-1:-1:-1;;;;;5104:45:104;5120:19;-1:-1:-1;;;;;5104:45:104;;5100:92;;5164:28;;-1:-1:-1;;;5164:28:104;;;;;;;;;;;5100:92;5207:27;5242:23;5274:35;5301:7;5274:26;:35::i;:::-;5199:110;;;;5398:68;5423:15;5440:4;5446:19;29371:10:105;;29289:97;5446:19:104;-1:-1:-1;;;;;11877:32:105;;;11735:28;;11992:20;;12014:30;;11989:56;;11468:587;5398:68:104;5393:181;;5479:43;5496:4;29371:10:105;4364:167:104;:::i;5479:43::-;5474:100;;5539:35;;-1:-1:-1;;;5539:35:104;;;;;;;;;;;5474:100;-1:-1:-1;;;;;5585:16:104;;5581:52;;5610:23;;-1:-1:-1;;;5610:23:104;;;;;;;;;;;5581:52;5758:15;5755:135;;;5880:1;5859:19;5852:30;5755:135;6230:23;:21;:23::i;:::-;-1:-1:-1;;;;;6230:48:104;;;;;;:42;;;;;:48;;;;;6228:50;;-1:-1:-1;;6228:50:104;;;6316:23;:21;:23::i;:::-;-1:-1:-1;;;;;6316:46:104;;;;;;:42;;;;;:46;;;;;;6314:48;;;;;;10236:11:105;10211:23;10207:41;10194:63;-1:-1:-1;;;10194:63:105;6590:23:104;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;:184;;;;-1:-1:-1;;;6879:47:104;;:52;;6875:625;;6975:1;6965:11;;7080:23;:21;:23::i;:::-;:54;;;;:41;;;;;:54;;;;;;:59;;7076:416;;7220:23;:21;:23::i;:::-;:37;7205:52;;7201:281;;7450:19;7365:23;:21;:23::i;:::-;:82;;;;:41;;;;;:82;;;;;:104;7201:281;6933:567;6875:625;7536:7;7532:2;-1:-1:-1;;;;;7517:27:104;7526:4;-1:-1:-1;;;;;7517:27:104;;;;;;;;;;;7550:42;5030:2567;;;4917:2680;;;:::o;5023:841:186:-;5110:7;5125:35;5163:26;:24;:26::i;:::-;5125:64;;5223:22;5248:30;:28;:30::i;:::-;5223:55;;5379:11;5362:14;:28;5358:42;;;-1:-1:-1;5399:1:186;;5023:841;-1:-1:-1;;;5023:841:186:o;5358:42::-;5530:15;;;;5522:63;;-1:-1:-1;;;5522:63:186;;5579:4;5522:63;;;1101:51:376;5594:11:186;;-1:-1:-1;;;;;5530:15:186;;5522:48;;1074:18:376;;5522:63:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:83;5511:109;;;-1:-1:-1;5619:1:186;;5023:841;-1:-1:-1;;;5023:841:186:o;5511:109::-;5631:16;;;;-1:-1:-1;;;;;5631:16:186;:30;5627:161;;5703:16;;;;5684:104;;-1:-1:-1;;;5684:104:186;;;;;14623:25:376;;;14664:18;;;14657:34;;;-1:-1:-1;;;;;5703:16:186;;;;5684:45;;14596:18:376;;5684:104:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5669:119;5023:841;-1:-1:-1;;;;5023:841:186:o;5627:161::-;5824:2;:15;;;;;;;;;;-1:-1:-1;;;;;5824:15:186;-1:-1:-1;;;;;5802:55:186;;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7680:167:104;7803:39;7820:4;7826:2;7830:7;7803:39;;;;;;;;;;;;:16;:39::i;:::-;7680:167;;;:::o;1223:205:177:-;415:1:92;-1:-1:-1;;;;;;;;;;;515:38:92;:66;511:117;;596:32;;-1:-1:-1;;;596:32:92;;;;;;;;;;;511:117;634:22;415:1;-1:-1:-1;;;;;;;;;;;832:65:92;777:125;634:22;1365:58:177::1;1393:13;1408:6;1416;1365:27;:58::i;:::-;669:24:92::0;475:1;-1:-1:-1;;;;;;;;;;;832:65:92;777:125;1786:267:187;-1:-1:-1;;;;;;;;;;;1263:42:63;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:63;;;;;;;;;;;1258:100;1903:44:187::1;-1:-1:-1::0;;;1903:13:187::1;:44::i;:::-;1953:41;1975:4;1981:12;1953:21;:41::i;:::-;2000:48;2025:4;:9;;;2036:4;:11;;;2000:24;:48::i;2233:363::-:0;648:8:83;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:83;:10;-1:-1:-1;;;;;634:22:83;;630:79;;673:29;;-1:-1:-1;;;673:29:83;;691:10;673:29;;;1101:51:376;1074:18;;673:29:83;955:203:376;630:79:83;-1:-1:-1;;;;;2297:21:187;::::1;2293:62;;2327:28;;-1:-1:-1::0;;;2327:28:187::1;;;;;;;;;;;2293:62;2361:15;2379:20;:18;:20::i;:::-;2361:38;;2409:7;2420:1;2409:12:::0;2405:58:::1;;2430:33;;-1:-1:-1::0;;;2430:33:187::1;;;;;;;;;;;2405:58;2469:122;2510:24;:22;:24::i;:::-;2550:4;2563:7;2578;2469:33;:122::i;10422:161::-:0;10505:7;10527:51;10554:7;10563:14;:12;:14::i;:::-;10527:26;:51::i;10793:528::-;648:8:83;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:83;:10;-1:-1:-1;;;;;634:22:83;;630:79;;673:29;;-1:-1:-1;;;673:29:83;;691:10;673:29;;;1101:51:376;1074:18;;673:29:83;955:203:376;630:79:83;10918:26:187::1;10947:27;:25;:27::i;:::-;10918:56:::0;-1:-1:-1;11046:23:187;;;::::1;::::0;:61:::1;;;11089:18;11073:13;:34;11046:61;11042:115;;;11122:35;;-1:-1:-1::0;;;11122:35:187::1;;;;;;;;;;;11042:115;11231:36;11253:13;11231:21;:36::i;:::-;11273:43;11302:13;11273:28;:43::i;2891:152:104:-:0;2971:7;3009:27;3028:7;3009:18;:27::i;12199:107:187:-;12255:7;12277:24;:22;:24::i;10077:162::-;648:8:83;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:83;:10;-1:-1:-1;;;;;634:22:83;;630:79;;673:29;;-1:-1:-1;;;673:29:83;;691:10;673:29;;;1101:51:376;1074:18;;673:29:83;955:203:376;630:79:83;10148:22:187::1;10161:8;10148:12;:22::i;:::-;10195:19;:17;:19::i;:::-;-1:-1:-1::0;;;;;10176:48:187::1;;10225:8;10176:58;;;;;;;;;;;;;2501:25:376::0;;2489:2;2474:18;;2355:177;10176:58:187::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10077:162:::0;:::o;4315:130:186:-;4424:16;4381:26;:24;:26::i;:::-;:40;;:59;;-1:-1:-1;;;;;;4381:59:186;-1:-1:-1;;;;;4381:59:186;;;;;;;;;;-1:-1:-1;4315:130:186:o;8358:127::-;8413:7;8435:26;:24;:26::i;:::-;:45;;;-1:-1:-1;;;;;8435:45:186;;8358:127;-1:-1:-1;8358:127:186:o;11355:119:187:-;11417:7;11439:30;:28;:30::i;1697:107:104:-;1760:7;1782:17;1793:5;1782:10;:17::i;7917:128:186:-;8032:8;7983:26;:24;:26::i;:::-;:46;;:57;-1:-1:-1;7917:128:186:o;8662:115::-;8711:7;8733:26;:24;:26::i;:::-;:39;;;-1:-1:-1;;;;;8733:39:186;;8662:115;-1:-1:-1;8662:115:186:o;12913:95:187:-;12963:7;12985:18;:16;:18::i;690:171:177:-;-1:-1:-1;;;;;;;;;;;1263:42:63;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:63;;;;;;;;;;;1258:100;803:53:177::1;837:18;803:33;:53::i;:::-;690:171:::0;:::o;8064:829:187:-;415:1:92;-1:-1:-1;;;;;;;;;;;515:38:92;:66;511:117;;596:32;;-1:-1:-1;;;596:32:92;;;;;;;;;;;511:117;634:22;415:1;-1:-1:-1;;;;;;;;;;;832:65:92;777:125;634:22;8142:16:187::1;8161:17;8170:7;8161:8;:17::i;:::-;8142:36:::0;-1:-1:-1;;;;;;8189:22:187;::::1;8185:63;;8220:28;;-1:-1:-1::0;;;8220:28:187::1;;;;;;;;;;;8185:63;8312:18;1090:43:101::0;;;297:66:102;1090:43:101;;;;;;-1:-1:-1;;;;;1090:43:101;8394:24:187::1;:22;:24::i;:::-;-1:-1:-1::0;;;;;8362:56:187::1;:28;8375:15;8362:10:::0;:28:::1;:::i;:::-;:56;8358:99;;8433:24;;-1:-1:-1::0;;;8433:24:187::1;;;;;;;;;;;8358:99;8509:23;8535:69;8569:7;8584:14;:12;:14::i;8535:69::-;8509:95:::0;-1:-1:-1;8615:19:187;;8611:218:::1;;8644:19;8666:46;8686:8;8696:15;8666:19;:46::i;:::-;8644:68:::0;-1:-1:-1;8720:15:187::1;8738:29;8644:68:::0;8738:15;:29:::1;:::i;:::-;8720:47:::0;-1:-1:-1;8779:11:187;;8775:47:::1;;8792:30;8804:8;8814:7;8792:11;:30::i;:::-;;8775:47;8636:193;;8611:218;8835:53;8854:7;8863:24;:22;:24::i;:::-;8835:18;:53::i;:::-;8136:757;;;669:24:92::0;475:1;-1:-1:-1;;;;;;;;;;;832:65:92;777:125;9241:106:187;9297:6;9318:24;:22;:24::i;8049:131:186:-;8107:7;8129:26;:24;:26::i;:::-;:46;;;8122:53;;8049:131;:::o;3260:2054:187:-;415:1:92;-1:-1:-1;;;;;;;;;;;515:38:92;:66;511:117;;596:32;;-1:-1:-1;;;596:32:92;;;;;;;;;;;511:117;634:22;415:1;-1:-1:-1;;;;;;;;;;;832:65:92;777:125;634:22;3333:28:187::1;3352:8;3333:18;:28::i;:::-;3460:38;::::0;3415:10:::1;15144:2:376::0;15140:15;;;-1:-1:-1;;15136:53:376;3460:38:187::1;::::0;::::1;15124:66:376::0;3485:12:187::1;15206::376::0;;;15199:28;-1:-1:-1;;;;15243:12:376;;3460:38:187::1;;;;;;;;;;;;3450:49;;;;;;3432:67;;3505:21;3529:111;3552:7;3567:67;3590:7;3599:6;3607:26;3625:7;3607:17;:26::i;:::-;1996:37:169::0;;;;;;;22065:25:376;;;;-1:-1:-1;;;;;22126:32:376;;;;22106:18;;;22099:60;22175:18;;;;22168:34;;;;1996:37:169;;;;;;;;;;22038:18:376;;;;1996:37:169;;;1986:48;;;;;;1834:206;3567:67:187::1;2172:36:169::0;;;;;;;22370:19:376;;;;22405:12;;;22398:28;;;;2172:36:169;;;;;;;;;22442:12:376;;;;2172:36:169;;2162:47;;;;;;2044:170;3529:111:187::1;3505:135;;3647:57;3660:13;3686:6;3694:8;3675:28;;;;;;;;-1:-1:-1::0;;;;;15496:15:376;;;15478:34;;15548:15;;15543:2;15528:18;;15521:43;15428:2;15413:18;;15266:304;3675:28:187::1;;;;;;;;;;;;;3647:12;:57::i;:::-;3714:9;:13:::0;3710:58:::1;;3729:39;3743:13;3758:9;3729:13;:39::i;:::-;3775:30;3808:58;3839:21;;;;;;;;;;;;;-1:-1:-1::0;;;3839:21:187::1;;::::0;3808:23:::1;:58::i;:::-;3775:91;;3878:9;3873:1353;3897:5;:12;3893:1;:16;3873:1353;;;3924:27;3954:5;3960:1;3954:8;;;;;;;;:::i;:::-;;;;;;;3924:38;;3976:4;:13;;;3971:1249;;4006:9;4001:1211;4025:4;:17;;;:24;4021:1;:28;4001:1211;;;4068:24;4108:4;:17;;;4126:1;4108:20;;;;;;;;:::i;:::-;;;;;;;4068:61;;4146:11;-1:-1:-1::0;;;;;4146:24:187::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4141:1061;;4213:16;::::0;;4227:1:::1;4213:16:::0;;;;;::::1;::::0;;;4188:22:::1;::::0;4213:16:::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;4213:16:187::1;4188:41;;4254:6;4243:5;4249:1;4243:8;;;;;;;;:::i;:::-;;;;;;:17;-1:-1:-1::0;;;;;4243:17:187::1;;;-1:-1:-1::0;;;;;4243:17:187::1;;;::::0;::::1;4846:11;-1:-1:-1::0;;;;;4846:22:187::1;;4869:3;4874:5;1695:21;;;;;;;;;;;;;-1:-1:-1::0;;;1695:21:187::1;;::::0;1678:39:::1;;;;;;;;:::i;:::-;;;;;;;;;;;;;1670:48;;;:::i;:::-;4846:46;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4842:131;;;4910:26;4922:13;4910:11;:26::i;:::-;4952:7;;;;;;;;;;;;4842:131;4174:811;4141:1061;;;5005:144;5045:13;5099:11;5128:4;:7;;;5005:24;:144::i;:::-;5185:4;5163:26;;4141:1061;-1:-1:-1::0;4051:3:187::1;;4001:1211;;;;3971:1249;-1:-1:-1::0;3911:3:187::1;;3873:1353;;;;5236:19;5231:79;;5270:33;::::0;-1:-1:-1;;;;;5270:33:187;::::1;::::0;::::1;::::0;;;::::1;5231:79;3327:1987;;;;;662:1:92;669:24:::0;475:1;-1:-1:-1;;;;;;;;;;;832:65:92;777:125;1432:182:177;1527:32;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;1527:32:177;1574:35;1587:13;1602:6;1574:12;:35::i;:::-;1567:42;1432:182;-1:-1:-1;;;1432:182:177:o;12598:107:187:-;12651:13;12679:21;:19;:21::i;11883:107::-;11936:7;11958:27;:25;:27::i;2223:120:104:-;2279:13;2307:23;:21;:23::i;:::-;:31;;2300:38;;;;;:::i;11690:159:187:-;648:8:83;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:83;:10;-1:-1:-1;;;;;634:22:83;;630:79;;673:29;;-1:-1:-1;;;673:29:83;;691:10;673:29;;;1101:51:376;1074:18;;673:29:83;955:203:376;630:79:83;11761:42:187::1;11778:8;11788:14;:12;:14::i;:::-;11761:16;:42::i;:::-;11809:35;11835:8;11809:25;:35::i;3957:269:104:-:0;4147:8;4059:23;:21;:23::i;:::-;29371:10:105;4059:63:104;;;;:42;;;;;:63;;;;;;;;-1:-1:-1;;;;;4059:85:104;;;;;;;;;;;;:96;;-1:-1:-1;;4059:96:104;;;;;;;;;;;4166:55;;13848:14:376;;13841:22;13823:41;;4059:85:104;;29371:10:105;;4166:55:104;;13796:18:376;4166:55:104;;;;;;;3957:269;;:::o;4449:117:186:-;4499:7;4521:26;:24;:26::i;:::-;:40;;;-1:-1:-1;;;;;4521:40:186;;4449:117;-1:-1:-1;4449:117:186:o;7169:322::-;7230:7;7245:35;7283:26;:24;:26::i;:::-;7341:17;;;;7245:64;;-1:-1:-1;7369:18:186;;7365:45;;7396:14;7169:322;-1:-1:-1;;7169:322:186:o;7365:45::-;7445:2;:15;;;;;;;;;;-1:-1:-1;;;;;7445:15:186;-1:-1:-1;;;;;7423:61:186;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7416:70;;;;7169:322;:::o;8396:348:104:-;8543:31;8556:4;8562:2;8566:7;8543:12;:31::i;:::-;-1:-1:-1;;;;;8584:14:104;;;:19;8580:160;;8616:56;8647:4;8653:2;8657:7;8666:5;8616:30;:56::i;:::-;8611:129;;8691:40;;-1:-1:-1;;;8691:40:104;;;;;;;;;;;8611:129;8396:348;;;;:::o;2436:329::-;2517:13;2543:16;2551:7;2543;:16::i;:::-;2538:59;;2568:29;;-1:-1:-1;;;2568:29:104;;;;;;;;;;;2538:59;2604:21;2628:10;6624:9:105;;;;;;;;;-1:-1:-1;6624:9:105;;;6552:86;2628:10:104;2604:34;;2663:7;2657:21;2682:1;2657:26;:103;;;;;;;;;;;;;;;;;2718:7;2727:18;2737:7;2727:9;:18::i;:::-;2701:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2644:116;2436:329;-1:-1:-1;;;2436:329:104:o;6546:1310:187:-;415:1:92;-1:-1:-1;;;;;;;;;;;515:38:92;:66;511:117;;596:32;;-1:-1:-1;;;596:32:92;;;;;;;;;;;511:117;634:22;415:1;-1:-1:-1;;;;;;;;;;;832:65:92;777:125;634:22;6687:28:187::1;6706:8;6687:18;:28::i;:::-;6742:15;6760:14;:12;:14::i;:::-;6742:32;;6836:23;6862:35;6882:14;:12;:14::i;6862:35::-;6836:61:::0;-1:-1:-1;6908:19:187;;6904:800:::1;;6977:52;7004:7;7013:15;6977:26;:52::i;:::-;7038:19;7060:46;7080:8;7090:15;7060:19;:46::i;:::-;7038:68:::0;-1:-1:-1;7114:15:187::1;7132:29;7038:68:::0;7132:15;:29:::1;:::i;:::-;7114:47;;7169:16;7188:24;:22;:24::i;:::-;7169:43:::0;-1:-1:-1;7225:11:187;;7221:477:::1;;7308:19;7330:47;7355:7;7364:12;7330:24;:47::i;:::-;7308:69;;7387:126;7432:8;7452;7472;7492:11;7387:33;:126::i;:::-;7578:20;7601:21;7611:11:::0;7601:7;:21:::1;:::i;:::-;7578:44:::0;-1:-1:-1;7636:16:187;;7632:57:::1;;7654:35;7666:8;7676:12;7654:11;:35::i;:::-;;7632:57;7238:460;;7221:477;6929:775;;;6904:800;7733:22;7743:8;7753:1;7733:9;:22::i;:::-;7798:53;7817:7;7826:24;:22;:24::i;7798:53::-;6681:1175;;669:24:92::0;475:1;-1:-1:-1;;;;;;;;;;;832:65:92;777:125;876:157:104;-1:-1:-1;;;;;;;;;;;1263:42:63;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:63;;;;;;;;;;;1258:100;988:40:104::1;1013:5;1020:7;988:24;:40::i;8952:127:186:-:0;9004:13;9032:26;:24;:26::i;:::-;:42;;9025:49;;;;;:::i;9558:170:187:-;648:8:83;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:83;:10;-1:-1:-1;;;;;634:22:83;;630:79;;673:29;;-1:-1:-1;;;673:29:83;;691:10;673:29;;;1101:51:376;1074:18;;673:29:83;955:203:376;630:79:83;9650:35:187::1;9671:13;9650:20;:35::i;:::-;9691:32;9709:13;9691:17;:32::i;9762:107::-:0;9823:7;9845:19;:17;:19::i;4364:167:104:-;4473:4;4492:34;4510:5;4517:8;4492:17;:34::i;6926:239:186:-;7000:35;7038:26;:24;:26::i;:::-;7070:17;;;:33;;;7114:46;;7000:64;;-1:-1:-1;7090:13:186;;7114:46;;;;;6994:171;6926:239;:::o;1696:139:107:-;300:66;;1696:139::o;22511:230:105:-;22589:7;22609:16;22617:7;22609;:16::i;:::-;22604:64;;22634:34;;-1:-1:-1;;;22634:34:105;;;;;;;;;;;22604:64;22682:23;:21;:23::i;:::-;:48;;;;:39;;:48;;-1:-1:-1;22682:48:105;;;:54;-1:-1:-1;;;;;22682:54:105;;22511:230::o;23291:439::-;23397:13;23413:17;23422:7;23413:8;:17::i;:::-;23397:33;;23441:13;23437:184;;;29371:10;-1:-1:-1;;;;;23466:28:105;;;23462:159;;23509:45;23527:5;29371:10;23509:17;:45::i;:::-;23504:117;;23575:35;;-1:-1:-1;;;23575:35:105;;;;;;;;;;;23504:117;23684:2;23627:23;:21;:23::i;:::-;:48;;;;:39;;;;;:48;;;;;;:59;;-1:-1:-1;;;;;;23627:59:105;-1:-1:-1;;;;;23627:59:105;;;;;;23697:28;23627:48;;23697:28;;;;;;;;;;23627:48;23697:28;23391:339;23291:439;;;:::o;724:189:83:-;786:67;;;;;;;;302:66:85;786:67:83;-1:-1:-1;;;;;786:67:83;;;;;;;;;;;;;866:42;;-1:-1:-1;;;866:42:83;;;;;2501:25:376;;;;866:42:83;;765:13;;866:30;;2474:18:376;;;;;866:42:83;;;;;;786:67;866:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;859:49;;;724:189;:::o;9083:120:186:-;9193:5;9148:26;:24;:26::i;:::-;:42;;;:50;;:42;:50;:::i;2985:351:105:-;3032:7;;3263:23;:21;:23::i;:::-;:36;;;3215:23;:21;:23::i;:::-;:37;:84;:110;;2985:351;-1:-1:-1;2985:351:105:o;7836:1501::-;7912:14;7974:32;8009:23;:21;:23::i;:::-;8050:29;;;;:20;;;:29;;;;;;;-1:-1:-1;7974:58:105;;-1:-1:-1;;;;8115:24:105;;:29;;8111:1172;;8236:6;8246:1;8236:11;8232:791;;8276:16;;8265:27;;8261:83;;8313:31;;-1:-1:-1;;;8313:31:105;;;;;;;;;;;8261:83;8831:182;-1:-1:-1;;8910:9:105;;;8889:31;;;;:20;;;:31;;;;;;8910:9;;8889:31;;-1:-1:-1;8948:25:105;;8831:182;8948:25;;8987:13;7836:1501;;;:::o;8111:1172::-;7966:1323;9301:31;;-1:-1:-1;;;9301:31:105;;;;;;;;;;;12155:478;12251:27;12280:23;12313:38;12354:30;:28;:30::i;:::-;:62;;;;:53;;:62;;-1:-1:-1;;12354:62:105;;;;12597:26;;12354:62;;12597:26;;-1:-1:-1;12155:478:105:o;910:139:188:-;294:66;;910:139::o;2771:1911:178:-;2901:41;3024:30;;;-1:-1:-1;;;;;;;;;;;3024:30:178;;;;;3072:25;;-1:-1:-1;;;;;;;;;;;469:66:179;3024:30:178;3072:25;;;-1:-1:-1;;;;;3072:25:178;:39;;:73;;-1:-1:-1;3115:21:178;;;;:30;3072:73;3061:156;;;3167:43;;-1:-1:-1;;;3167:43:178;;;;;;;;;;;3061:156;3227:31;;;;:23;;;:31;;;;;;;;3223:110;;;3275:51;;-1:-1:-1;;;3275:51:178;;;;;;;;;;;3223:110;3420:10;3542:34;;;:26;;;:34;;;;;:41;3420:10;;;;;3590:573;3614:22;3610:1;:26;3590:573;;;3651:25;3679:34;;;:26;;;:34;;;;;:37;;3714:1;;3679:37;;;;;;:::i;:::-;;;;;;;;;;3767:13;;3679:37;;-1:-1:-1;3784:10:178;-1:-1:-1;;;;;3767:13:178;;;:27;3763:217;;3827:24;3810:13;;-1:-1:-1;;;3810:13:178;;;;:41;;;;;;;;:::i;:::-;;3806:112;;3872:35;;-1:-1:-1;;;3872:35:178;;;;;;;;;;;3806:112;3927:22;;3943:6;;3927:8;;-1:-1:-1;;;;3927:22:178;-1:-1:-1;;;3943:6:178;3927:22;;;;;;;;:::i;:::-;;;;;;3967:4;3959:12;;3763:217;4030:21;4013:13;;-1:-1:-1;;;4013:13:178;;;;:38;;;;;;;;:::i;:::-;;4009:148;;4063:8;;;;:::i;:::-;;;;4009:148;;;4107:21;4090:13;;-1:-1:-1;;;4090:13:178;;;;:38;;;;;;;;:::i;:::-;;4086:71;;4140:8;;;;:::i;:::-;;;;4086:71;-1:-1:-1;3638:3:178;;3590:573;;;;4174:5;4169:65;;4196:31;;-1:-1:-1;;;4196:31:178;;;;;;;;;;;4169:65;4260:26;4285:1;4260:22;:26;:::i;:::-;4251:6;:35;:74;;;-1:-1:-1;4299:26:178;4324:1;4299:22;:26;:::i;:::-;4290:6;:35;4251:74;4240:438;;;4340:31;;;;:23;;;:31;;;;;:38;;-1:-1:-1;;4340:38:178;4374:4;4340:38;;;4415:15;;;:79;;4473:21;4415:79;;;4441:21;4415:79;4386:108;;4502:59;4534:13;4549:11;4502:31;:59::i;:::-;4603:13;4574:56;4618:11;4574:56;;;;;;:::i;:::-;;;;;;;;4638:33;4657:13;4638:18;:33::i;:::-;4332:346;4240:438;2895:1787;;;;;;2771:1911;;;:::o;452:282:66:-;-1:-1:-1;;;;;;1121:62:66;;1096:4;1121:62;;;303:66:68;1121:62:66;;;;;;;;:70;;:62;:70;510:182;;-1:-1:-1;;;;;;556:62:66;;:49;:62;;;303:66:68;556:62:66;;;;;:69;;-1:-1:-1;;556:69:66;621:4;556:69;;;510:182;;;653:32;;-1:-1:-1;;;653:32:66;;;;;;;;;;;510:182;702:27;;-1:-1:-1;;;;;;702:27:66;;;;;;;;452:282;:::o;899:671:186:-;1003:35;1041:26;:24;:26::i;:::-;1074:15;;;:30;;-1:-1:-1;;;;;1074:30:186;;;-1:-1:-1;;;;;;1074:30:186;;;;;;;;1129:18;;;1110:16;;;:37;;;;;;;;;;;;;1153:21;;;:53;;;;;439:42:226;1153:53:186;;;1237:14;;;;1212:22;;;:39;1277:19;;;;1257:17;;;:39;;;1003:64;;-1:-1:-1;1307:23:186;1303:86;;1340:42;1362:4;:19;;;1340:21;:42::i;:::-;1395:40;1416:4;:18;;;1395:20;:40::i;:::-;1446:10;;;;:14;1442:124;;1470:24;1483:4;:10;;;1470:12;:24::i;:::-;1521:16;;;;1548:10;;;;;1502:57;;-1:-1:-1;;;1502:57:186;;-1:-1:-1;;;;;1521:16:186;;;;1502:45;;:57;;;;2501:25:376;;;2489:2;2474:18;;2355:177;1502:57:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;997:573;899:671;;:::o;1037:299:104:-;-1:-1:-1;;;;;;;;;;;1263:42:63;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:63;;;;;;;;;;;1258:100;1159:25:104::1;-1:-1:-1::0;;;1159:13:104::1;:25::i;:::-;1224;-1:-1:-1::0;;;1224:13:104::1;:25::i;:::-;1297:34;1316:5;1323:7;1297:18;:34::i;3339:119:186:-:0;3392:7;3414:26;:24;:26::i;:::-;:39;;;3407:46;;3339:119;:::o;720:315:226:-;841:38;;866:7;841:38;-1:-1:-1;;;;;;;889:24:226;;;885:146;;923:35;947:2;951:6;923:23;:35::i;:::-;885:146;;;979:45;997:8;1007:4;1013:2;1017:6;979:17;:45::i;6045:335:186:-;6154:7;6169:35;6207:26;:24;:26::i;:::-;6280:1;6244:33;;;:24;;;:33;;;;;;6169:64;;-1:-1:-1;6244:37:186;6240:89;;6296:33;;;;:24;;;;:33;;;;;;;-1:-1:-1;6289:40:186;;6240:89;6343:32;6363:11;6343:19;:32::i;6560:362::-;6634:35;6672:26;:24;:26::i;:::-;6634:64;;6827:2;:15;;;;;;;;;;-1:-1:-1;;;;;6827:15:186;-1:-1:-1;;;;;6805:61:186;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6783:13;:85;6772:145;;;6882:35;;-1:-1:-1;;;6882:35:186;;;;;;;;;;;4743:214;4803:16;4844:18;:16;:18::i;:::-;-1:-1:-1;;;;;4822:65:186;;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4803:86;;4910:8;4899;:19;4895:57;;;4927:25;;-1:-1:-1;;;4927:25:186;;;;;;;;;;;3340:242:105;3398:7;-1:-1:-1;;;;;3417:19:105;;3413:60;;3445:28;;-1:-1:-1;;;3445:28:105;;;;;;;;;;;3413:60;-1:-1:-1;;;;;3492:23:105;:21;:23::i;:::-;:42;;:49;3535:5;-1:-1:-1;;;;;3492:49:105;-1:-1:-1;;;;;3492:49:105;;;;;;;;;;;;;:85;3479:98;;3340:242;;;:::o;865:209:177:-;971:50;-1:-1:-1;;;971:13:177;:50::i;:::-;-1:-1:-1;;;;;;;;;;;1368:72:178;;-1:-1:-1;;;;;;1368:72:178;-1:-1:-1;;;;;1368:72:178;;;;;690:171:177;:::o;3636:215:186:-;3693:6;3707:35;3745:26;:24;:26::i;:::-;3707:64;;3806:2;:15;;;;;;;;;;-1:-1:-1;;;;;3806:15:186;-1:-1:-1;;;;;3784:60:186;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1751:698::-;1850:22;1880:35;1918:26;:24;:26::i;:::-;2005:15;;;;2047:21;;;;;2102:26;;;-1:-1:-1;;;2102:26:186;;;;2005:15;;-1:-1:-1;;;;;;2005:15:186;;;;2047:21;;;;;1950:30;;2005:15;;2102:24;;:26;;;;;;;;;;;2005:15;2102:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2074:54;;2134:13;2150:8;-1:-1:-1;;;;;2150:25:186;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2134:43;;2200:46;2222:15;2239:6;2200:46;;:21;:46::i;:::-;2183:63;;2315:129;2356:8;2372:5;2393:17;2424:14;2315:33;:129::i;:::-;1874:575;;;;;1751:698;;;;:::o;2453:882::-;2534:7;2549:35;2587:26;:24;:26::i;:::-;2549:64;;2670:16;2689:24;:22;:24::i;:::-;2670:43;-1:-1:-1;;;;;;;;2724:41:186;;;2720:108;;2794:6;2775:2;:15;;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;2815:6:186;;-1:-1:-1;2808:13:186;;-1:-1:-1;;;2808:13:186;2720:108;2922:30;;-1:-1:-1;;;2922:30:186;;2946:4;2922:30;;;1101:51:376;2883:8:186;;2861:12;;-1:-1:-1;;;;;2922:15:186;;;;;1074:18:376;;2922:30:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2898:54;;2958:72;2992:8;3002:4;3016;3023:6;2958:33;:72::i;:::-;3059:30;;-1:-1:-1;;;3059:30:186;;3083:4;3059:30;;;1101:51:376;3036:20:186;;-1:-1:-1;;;;;3059:15:186;;;;;1074:18:376;;3059:30:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3036:53;-1:-1:-1;3146:19:186;3168:28;3183:13;3036:53;3168:28;:::i;:::-;3146:50;;3221:6;3206:11;:21;3202:67;;3236:33;;-1:-1:-1;;;3236:33:186;;;;;;;;;;;3202:67;3295:11;3276:2;:15;;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;3319:11:186;;2453:882;-1:-1:-1;;;;;;;;;2453:882:186:o;256:588:101:-;333:32;425:22;;;297:66:102;425:22:101;;;;;;;;297:66:102;;-1:-1:-1;;;;;425:22:101;;;;484;;;480:261;;532:34;558:8;539:15;532:34;:::i;:::-;516:50;;480:261;;;706:28;726:8;706:17;:28;:::i;:::-;690:44;;480:261;747:13;:22;;;;;;;;;;;;:38;;-1:-1:-1;;747:38:101;-1:-1:-1;;;;;747:38:101;;;;;;;;797:42;;7898:50:376;;;747:22:101;;797:42;;7871:18:376;797:42:101;;;;;;;327:517;;;256:588;;:::o;2773:282:187:-;-1:-1:-1;;;;;2843:22:187;;2839:63;;2874:28;;-1:-1:-1;;;2874:28:187;;;;;;;;;;;2839:63;2919:27;:25;:27::i;:::-;:32;;;;:87;;;2979:27;:25;:27::i;:::-;2961:14;:12;:14::i;:::-;:45;;2919:87;2908:142;;;3020:30;;-1:-1:-1;;;3020:30:187;;;;;;;;;;;1641:189:169;1703:7;1795:28;;;-1:-1:-1;;;;;;;;;;;1795:28:169;;;;;;;:30;;;1703:7;1795:30;;;:::i;:::-;;;;-1:-1:-1;1788:37:169;1641:189;-1:-1:-1;;;1641:189:169:o;274:194::-;353:35;423:33;;;:18;:33;;;;;-1:-1:-1;;;;;;;;;;;296:66:170;423:40:169;459:4;423:33;:40;:::i;691:315::-;771:5;780:1;771:10;767:49;;790:26;;-1:-1:-1;;;790:26:169;;;;;;;;;;;767:49;839:5;826:9;:18;822:57;;853:26;;-1:-1:-1;;;853:26:169;;;;;;;;;;;822:57;886:35;956:36;;;-1:-1:-1;;;;;;;;;;;956:36:169;;;;;:45;;-1:-1:-1;;;;;;;;;;;296:66:170;996:5:169;;956:36;:45;;996:5;;956:45;:::i;:::-;;;;-1:-1:-1;;;;;691:315:169:o;2762:1424:206:-;2852:13;2873:24;2900:13;:11;:13::i;:::-;2939:14;;2873:40;;-1:-1:-1;2919:17:206;2939:14;-1:-1:-1;;;;;2993:24:206;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2993:24:206;-1:-1:-1;3077:28:206;;;;;;2959:58;;-1:-1:-1;3023:13:206;;;3186:341;3210:9;3206:1;:13;3186:341;;;3239:27;3272:20;3281:7;3289:1;3281:10;;;;;;;;:::i;:::-;;;;;;;3272:8;:20::i;:::-;3234:58;;;;;3305:9;3300:221;3324:11;:18;3320:1;:22;3300:221;;;3399:19;3379:11;3391:1;3379:14;;;;;;;;:::i;:::-;;;;;;;3363:32;;;;;;:55;3359:154;;3456:7;3464:1;3456:10;;;;;;;;:::i;:::-;;;;;;;3432:14;3447:5;3432:21;;;;;;;;:::i;:::-;;;;;;;;;;:34;3478:7;;;;:::i;:::-;;;;3497:5;;3359:154;3344:3;;3300:221;;;-1:-1:-1;;3221:3:206;;3186:341;;;;3592:33;3639:5;-1:-1:-1;;;;;3628:17:206;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3628:17:206;;;;;;;;;;;;;;;;;3592:53;;3711:9;3706:443;3730:5;3726:1;:9;3706:443;;;3750:14;3767;3782:1;3767:17;;;;;;;;:::i;:::-;;;;;;;3750:34;;3802:18;3830:16;3856:27;3893:34;3938:16;3947:6;3938:8;:16::i;:::-;3792:162;;;;;;;;3987:155;;;;;;;;4006:6;3987:155;;;;4028:4;3987:155;;;;4052:11;3987:155;;;;;;4086:11;3987:155;;;;4121:12;3987:155;;;3962:19;3982:1;3962:22;;;;;;;;:::i;:::-;;;;;;:180;;;;3742:407;;;;;3737:3;;;;;;;3706:443;;;-1:-1:-1;4162:19:206;2762:1424;-1:-1:-1;;;;;;;2762:1424:206:o;5318:1194:187:-;5378:14;5394:16;5432:31;5449:13;5432:16;:31::i;:::-;5414:81;;;;;;;;;;;;:::i;:::-;5377:118;;;;5547:23;5573:35;5593:14;:12;:14::i;5573:35::-;5547:61;;5614:15;5632:14;:12;:14::i;:::-;5614:32;-1:-1:-1;5657:19:187;;5653:656;;5686:17;1403:36:169;;;-1:-1:-1;;;;;;;;;;;1403:36:169;;;;;;;5751:14:187;;;5747:60;;5774:33;;-1:-1:-1;;;5774:33:187;;;;;;;;;;;5747:60;5837:9;5819:15;:27;5815:73;;;5855:33;;-1:-1:-1;;;5855:33:187;;;;;;;;;;;5815:73;5934:52;5961:7;5970:15;5934:26;:52::i;:::-;5994:19;6016:44;6036:6;6044:15;6016:19;:44::i;:::-;5994:66;-1:-1:-1;6069:15:187;6087:29;5994:66;6087:15;:29;:::i;:::-;6069:47;-1:-1:-1;6128:11:187;;6124:45;;6141:28;6153:6;6161:7;6141:11;:28::i;:::-;;6124:45;6210:53;6232:13;6247:15;6210:21;:53::i;:::-;6271:31;6284:13;6271:31;;;;;;;;;;;;:12;:31::i;:::-;5678:631;;;5653:656;6338:22;6348:8;6358:1;6338:9;:22::i;:::-;6403:53;6422:7;6431:24;:22;:24::i;6403:53::-;6467:40;;6499:7;;-1:-1:-1;;;;;6467:40:187;;;;;;;;5371:1141;;;;5318:1194;:::o;1449:1318:178:-;1583:41;1707:30;;;-1:-1:-1;;;;;;;;;;;1707:30:178;;;;;1748:21;;-1:-1:-1;;;;;;;;;;;469:66:179;1707:30:178;1748:21;;:29;;1707:15;1748:29;1744:244;;1792:9;1787:195;1811:19;;;:26;1807:30;;1787:195;;;1884:6;1858:11;:19;;1878:1;1858:22;;;;;;;;:::i;:::-;;;;;;;;;:32;1854:120;;1911:52;;-1:-1:-1;;;1911:52:178;;;;;;;;;;;1854:120;1839:3;;1787:195;;;;1744:244;2065:21;;-1:-1:-1;;;;;2065:21:178;2053:97;;2111:32;:30;:32::i;:::-;2189:21;;:39;;-1:-1:-1;;;2189:39:178;;2226:1;2189:39;;;2501:25:376;2156:30:178;;-1:-1:-1;;;;;2189:21:178;;:36;;2474:18:376;;2189:39:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2189:39:178;;;;;;;;;;;;:::i;:::-;2240:21;;2156:72;;-1:-1:-1;2240:21:178;;2235:162;;2271:28;;2307:23;;;:37;;-1:-1:-1;;;;;;2307:37:178;-1:-1:-1;;;;;2307:37:178;;;;;-1:-1:-1;;;;;;2352:38:178;2271:28;2380:10;2352:38;;-1:-1:-1;2352:38:178;;;2235:162;2403:19;;;:32;;;;;;;-1:-1:-1;2403:32:178;;;;;;;;;;2442:189;2466:13;:20;2462:1;:24;2442:189;;;2501:11;:26;;:34;2528:6;2501:34;;;;;;;;;;;2550:66;;;;;;;;2566:13;2580:1;2566:16;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;2550:66:178;;;;;2590:24;2550:66;;;;;;;;:::i;:::-;;;2501:123;;;;;;;-1:-1:-1;2501:123:178;;;;;;;;;;;;;;-1:-1:-1;;;;;;2501:123:178;;-1:-1:-1;;;;;2501:123:178;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2501:123:178;;-1:-1:-1;;;2501:123:178;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;2488:3:178;;2442:189;;;-1:-1:-1;2637:21:178;;:125;;-1:-1:-1;;;2637:125:178;;-1:-1:-1;;;;;2637:21:178;;;;:45;;:125;;2690:10;;2708:13;;2729:6;;2743:13;;2637:125;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5124:575;5220:32;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;5220:32:178;5260:41;5384:30;;;-1:-1:-1;;;;;;;;;;;5384:30:178;;;;;5425:21;;-1:-1:-1;;;;;;;;;;;469:66:179;5425:21:178;;;;:30;;;;5421:101;;5472:43;;-1:-1:-1;;;5472:43:178;;;;;;;;;;;5421:101;5575:23;;;;5650:22;;-1:-1:-1;;;5650:22:178;;;;;2501:25:376;;;-1:-1:-1;;;;;5575:23:178;;;;5528:19;;5575:23;;5650:14;;2474:18:376;;5650:22:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5650:22:178;;;;;;;;;;;;:::i;:::-;5606:66;5124:575;-1:-1:-1;;;;;;;5124:575:178:o;7676:237:186:-;7858:11;7847:8;:22;7843:65;;;7878:30;;-1:-1:-1;;;7878:30:186;;;;;;;;;;;14714:674:105;14877:139;;-1:-1:-1;;;14877:139:105;;14855:4;;-1:-1:-1;;;;;14877:56:105;;;;;:139;;29371:10;;14972:4;;14986:7;;15003:5;;14877:139;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14877:139:105;;;;;;;;-1:-1:-1;;14877:139:105;;;;;;;;;;;;:::i;:::-;;;14867:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15199:6;:13;15216:1;15199:18;15195:183;;15236:40;;-1:-1:-1;;;15236:40:105;;;;;;;;;;;15195:183;15352:6;15346:13;15337:6;15333:2;15329:15;15322:38;14867:517;-1:-1:-1;;;;;;15068:83:105;-1:-1:-1;;;15068:83:105;;-1:-1:-1;14714:674:105;;;;;;:::o;11071:301::-;11136:4;11207:23;:21;:23::i;:::-;:37;11197:47;;11161:187;;;;;-1:-1:-1;;;11275:23:105;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;;:68;:73;11148:200;11071:301;-1:-1:-1;;11071:301:105:o;29475:1574::-;29548:17;29942:4;29935;29929:11;29925:22;30020:1;30014:4;30007:15;30081:4;30078:1;30074:12;30067:19;;;30149:1;30144:3;30137:14;30238:3;30448:5;30430:419;30495:1;30490:3;30486:11;30479:18;;30663:2;30657:4;30653:13;30649:2;30645:22;30640:3;30632:36;30755:2;30745:13;;30810:25;30430:419;30810:25;-1:-1:-1;30871:13:105;;;-1:-1:-1;;30972:14:105;;;31020:19;;;30972:14;29475:1574;-1:-1:-1;29475:1574:105:o;4042:119::-;4097:7;4119:23;:21;:23::i;:::-;:37;;4042:119;-1:-1:-1;4042:119:105:o;5868:173:186:-;6027:9;5967:26;:24;:26::i;:::-;:57;;;;:48;;:57;;;;;;:69;;;;-1:-1:-1;5868:173:186:o;2776:601:195:-;2892:7;3022:30;;;380:66:197;3022:30:195;;;;;;;;;;3063:16;;;3059:30;;3088:1;3081:8;;;;;;3059:30;3096:24;3123:34;;;:20;;;;:34;;;;;;;;;3096:61;;;;;;;;;;;;;;;;;;;;3175:23;;;;:117;;-1:-1:-1;3227:18:195;;3209:15;:36;;:82;;;3275:8;:16;;;3257:15;:34;3209:82;3164:143;;;3306:1;3299:8;;;;;;;3164:143;3321:51;3343:15;3360:11;3321:51;;:21;:51::i;:::-;3314:58;2776:601;-1:-1:-1;;;;;;2776:601:195:o;21756:104:105:-;21828:27;21838:2;21842:8;21828:27;;;;;;;;;;;;:9;:27::i;4032:279:186:-;-1:-1:-1;;;;;4109:27:186;;4105:74;;4145:34;;-1:-1:-1;;;4145:34:186;;;;;;;;;;;4105:74;4207:18;:16;:18::i;:::-;4191:66;;-1:-1:-1;;;4191:66:186;;-1:-1:-1;;;;;1119:32:376;;;4191:66:186;;;1101:51:376;4191::186;;;;;;;1074:18:376;;4191:66:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4186:120;;4272:34;;-1:-1:-1;;;4272:34:186;;;;;;;;;;;22321:186:105;22424:4;22443:23;:21;:23::i;:::-;-1:-1:-1;;;;;22443:49:105;;;;;;;:42;;;;;:49;;;;;;;;:59;;;;;;;;;;-1:-1:-1;22443:59:105;;;;;22321:186::o;13270:750:187:-;13429:21;13419:6;:31;;;;;;;;:::i;:::-;;13415:601;;13460:26;13472:13;13460:11;:26::i;13415:601::-;13508:14;13524:16;13564:31;13581:13;13564:16;:31::i;:::-;13544:87;;;;;;;;;;;;:::i;:::-;13507:124;;;;13640:31;13653:13;13640:31;;;;;;;;;;;;:12;:31::i;:::-;13680:13;1403:36:169;;;-1:-1:-1;;;;;;;;;;;1403:36:169;;;;;;13741:9:187;;13737:226;;13762:43;13784:13;13799:5;13762:21;:43::i;:::-;13815:139;13860:24;:22;:24::i;:::-;13904:4;13921:6;13939:5;13815:33;:139::i;:::-;13976:33;;-1:-1:-1;;;;;13976:33:187;;;;;;;;13499:517;;;13270:750;;:::o;4686:434:178:-;4752:41;4876:30;;;-1:-1:-1;;;;;;;;;;;4876:30:178;;;;;-1:-1:-1;;;;;;;;;;;469:66:179;4912:129:178;4936:19;;;:26;4932:30;;4912:129;;;4984:11;:26;;:50;5011:11;:19;;5031:1;5011:22;;;;;;;;:::i;:::-;;;;;;;;;4984:50;;;;;;;;;;;;4977:57;;;;:::i;:::-;4964:3;;4912:129;;;-1:-1:-1;5046:26:178;5053:19;;;;5046:26;:::i;:::-;5085:30;;;;:15;;;:30;;;;;5078:37;;-1:-1:-1;;;;;;5078:37:178;;;;;;;;-1:-1:-1;;;;;;5078:37:178;;;5085:30;5078:37;;;;5085:30;5078:37;:::i;2560:247:105:-;2657:32;2692:23;:21;:23::i;:::-;2657:58;-1:-1:-1;2722:8:105;;;:15;2733:4;2722:8;:15;:::i;:::-;-1:-1:-1;2743:10:105;;;:19;2756:6;2743:10;:19;:::i;:::-;-1:-1:-1;3948:7:105;2768:34;;-1:-1:-1;;2560:247:105:o;2561:178:226:-;2637:12;2655:2;-1:-1:-1;;;;;2655:7:226;2670:5;2655:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2636:44;;;2694:7;2686:48;;;;-1:-1:-1;;;2686:48:226;;31920:2:376;2686:48:226;;;31902:21:376;31959:2;31939:18;;;31932:30;31998;31978:18;;;31971:58;32046:18;;2686:48:226;31718:352:376;2187:315:226;2318:2;-1:-1:-1;;;;;2310:10:226;:4;-1:-1:-1;;;;;2310:10:226;;2306:37;2330:7;2306:37;2369:4;-1:-1:-1;;;;;2353:21:226;;;2349:149;;2384:38;-1:-1:-1;;;;;2384:26:226;;2411:2;2415:6;2384:26;:38::i;2349:149::-;2443:48;-1:-1:-1;;;;;2443:30:226;;2474:4;2480:2;2484:6;2443:30;:48::i;368:224:225:-;459:7;123:6;482:11;:22;;474:68;;;;-1:-1:-1;;;474:68:225;;32277:2:376;474:68:225;;;32259:21:376;32316:2;32296:18;;;32289:30;32355:34;32335:18;;;32328:62;-1:-1:-1;;;32406:18:376;;;32399:31;32447:19;;474:68:225;32075:397:376;474:68:225;123:6;556:20;565:11;556:6;:20;:::i;:::-;555:32;;;;:::i;9970:126:206:-;10016:24;10055:36;:27;:34;:36::i;9493:473::-;9603:16;9718:38;;;-1:-1:-1;;;;;;;;;;;9718:38:206;;;;;9711:50;;9577:18;;9603:16;9577:18;;;;9718:38;9711:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9781:21;434:66:207;;764:141;9781:21:206;:38;;;;:30;;;;;:38;;;;;;;;:50;;;-1:-1:-1;;;;;;;;;;;9851:38:206;;;;;;9781:50;;;;;-1:-1:-1;9851:59:206;;:50;;:57;:59::i;:::-;9837:73;;9931:30;9954:6;9931:22;:30::i;:::-;9916:45;;9493:473;;;;;:::o;472:215:169:-;572:35;649:33;;;:18;:33;;;;;642:40;;552:12;;-1:-1:-1;;;;;;;;;;;296:66:170;642:40:169;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;472:215;;;:::o;1010:216::-;1106:35;1176:36;;;-1:-1:-1;;;;;;;;;;;1176:36:169;;;;;:45;;-1:-1:-1;;;;;;;;;;;296:66:170;1216:5:169;;1176:36;:45;;1216:5;;1176:45;:::i;5891:366:178:-;-1:-1:-1;;;;;;;;;;;5948:41:178;6097:26;:24;:26::i;:::-;:39;;;6066:117;;-1:-1:-1;;;6066:117:178;;-1:-1:-1;;;6066:117:178;;;32859:34:376;-1:-1:-1;;;;;6097:39:178;;;;6066:100;;32832:18:376;;6066:117:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6189:63;;-1:-1:-1;;;;;;6189:63:178;-1:-1:-1;;;;;6189:63:178;;;;;;;;-1:-1:-1;5891:366:178:o;21088:597:105:-;21196:19;21202:2;21206:8;21196:5;:19::i;:::-;-1:-1:-1;;;;;21244:14:105;;;:19;21240:435;;21275:11;21289:23;:21;:23::i;:::-;:37;;-1:-1:-1;21352:14:105;;;21376:189;21396:62;21435:1;21439:2;21443:7;;;;;;21452:5;21396:30;:62::i;:::-;21391:143;;21481:40;;-1:-1:-1;;;21481:40:105;;;;;;;;;;;21391:143;21560:3;21552:5;:11;21376:189;;21653:3;21612:23;:21;:23::i;:::-;:37;:44;21608:58;;21658:8;;;1303:160:308;1412:43;;-1:-1:-1;;;;;33096:32:376;;;1412:43:308;;;33078:51:376;33145:18;;;33138:34;;;1385:71:308;;1405:5;;1427:14;;;;;33051:18:376;;1412:43:308;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1412:43:308;;;;;;;;;;;1385:19;:71::i;1702:188::-;1829:53;;-1:-1:-1;;;;;33441:15:376;;;1829:53:308;;;33423:34:376;33493:15;;;33473:18;;;33466:43;33525:18;;;33518:34;;;1802:81:308;;1822:5;;1844:18;;;;;33358::376;;1829:53:308;33183:375:376;12671:297:328;12731:16;12759:22;12784:19;12792:3;12784:7;:19::i;5598:103:221:-;5654:15;5684:12;5692:3;5684:7;:12::i;10100:599:206:-;10208:39;10276:38;;;-1:-1:-1;;;;;;;;;;;10276:38:206;;;;;10179:21;;10208:39;10276:60;;:51;;:58;:60::i;:::-;-1:-1:-1;;;;;10250:92:206;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10250:92:206;;10208:134;;10361:9;10349:315;10386:38;;;;-1:-1:-1;;;;;;;;;;;10386:38:206;;;;;:60;;:51;;:58;:60::i;:::-;10382:1;:64;10349:315;;;10472:26;10501:56;;;-1:-1:-1;;;;;;;;;;;10501:56:206;;;;;:93;;:78;;10592:1;10501:90;:93::i;:::-;10472:122;;10638:18;10602:17;10620:1;10602:20;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10602:55:206;;;:20;;;;;;;;;;;:55;-1:-1:-1;10454:3:206;;10349:315;;;-1:-1:-1;10677:17:206;10100:599;-1:-1:-1;;10100:599:206:o;15806:2642:105:-;15874:20;15897:23;:21;:23::i;:::-;:37;;-1:-1:-1;15897:37:105;15944:13;;;15940:44;;15966:18;;-1:-1:-1;;;15966:18:105;;;;;;;;;;;15940:44;16481:32;16461:53;;16403:23;:21;:23::i;:::-;-1:-1:-1;;;;;16403:46:105;;;;;;:42;;;;;:46;;;;;;:111;;;;;;;;;10236:11;10211:23;10207:41;-1:-1:-1;10631:15:105;;10605:24;10601:46;10204:52;10194:63;16714:23;:21;:23::i;:::-;:71;;;;:41;;;;;:71;;;;;:188;;;;-1:-1:-1;;;;;17423:25:105;;;16949:23;;;;16765:12;;17423:25;;17609;16714:71;;17495:260;18033:1;18019:12;18015:20;17984:275;18065:3;18056:7;18053:16;17984:275;;18241:7;18231:8;18228:1;18201:25;18198:1;18195;18190:59;18107:1;18094:15;17984:275;;;17988:57;18278:8;18290:1;18278:13;18274:45;;18300:19;;-1:-1:-1;;;18300:19:105;;;;;;;;;;;18274:45;18368:3;18328:23;:21;:23::i;:::-;:43;-1:-1:-1;18383:60:105;;-1:-1:-1;8396:348:104;4059:629:308;4478:23;4504:33;-1:-1:-1;;;;;4504:27:308;;4532:4;4504:27;:33::i;:::-;4478:59;;4551:10;:17;4572:1;4551:22;;:57;;;;;4589:10;4578:30;;;;;;;;;;;;:::i;:::-;4577:31;4551:57;4547:135;;;4631:40;;-1:-1:-1;;;4631:40:308;;-1:-1:-1;;;;;1119:32:376;;4631:40:308;;;1101:51:376;1074:18;;4631:40:308;955:203:376;5581:109:328;5637:16;5672:3;:11;;5665:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5581:109;;;:::o;3604:102:221:-;3660:15;3690:3;:11;;3683:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3604:102;;;:::o;9117:115:328:-;9180:7;9206:19;9214:3;4556:18;;4474:107;9574:156;9648:7;9698:22;9702:3;9714:5;9698:3;:22::i;2705:151:313:-;2780:12;2811:38;2833:6;2841:4;2847:1;2811:21;:38::i;4923:118:328:-;4990:7;5016:3;:11;;5028:5;5016:18;;;;;;;;:::i;:::-;;;;;;;;;5009:25;;4923:118;;;;:::o;3180:392:313:-;3279:12;3331:5;3307:21;:29;3303:108;;;3359:41;;-1:-1:-1;;;3359:41:313;;3394:4;3359:41;;;1101:51:376;1074:18;;3359:41:313;955:203:376;3303:108:313;3421:12;3435:23;3462:6;-1:-1:-1;;;;;3462:11:313;3481:5;3488:4;3462:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3420:73;;;;3510:55;3537:6;3545:7;3554:10;4769:12;4798:7;4793:408;;4821:19;4829:10;4821:7;:19::i;:::-;4793:408;;;5045:17;;:22;:49;;;;-1:-1:-1;;;;;;5071:18:313;;;:23;5045:49;5041:119;;;5121:24;;-1:-1:-1;;;5121:24:313;;-1:-1:-1;;;;;1119:32:376;;5121:24:313;;;1101:51:376;1074:18;;5121:24:313;955:203:376;5041:119:313;-1:-1:-1;5180:10:313;5173:17;;5743:516;5874:17;;:21;5870:383;;6102:10;6096:17;6158:15;6145:10;6141:2;6137:19;6130:44;5870:383;6225:17;;-1:-1:-1;;;6225:17:313;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:250:376;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:376;238:16;;231:27;14:250::o;269:271::-;311:3;349:5;343:12;376:6;371:3;364:19;392:76;461:6;454:4;449:3;445:14;438:4;431:5;427:16;392:76;:::i;:::-;522:2;501:15;-1:-1:-1;;497:29:376;488:39;;;;529:4;484:50;;269:271;-1:-1:-1;;269:271:376:o;545:220::-;694:2;683:9;676:21;657:4;714:45;755:2;744:9;740:18;732:6;714:45;:::i;770:180::-;829:6;882:2;870:9;861:7;857:23;853:32;850:52;;;898:1;895;888:12;850:52;-1:-1:-1;921:23:376;;770:180;-1:-1:-1;770:180:376:o;1163:131::-;-1:-1:-1;;;;;1238:31:376;;1228:42;;1218:70;;1284:1;1281;1274:12;1299:134;1367:20;;1396:31;1367:20;1396:31;:::i;:::-;1299:134;;;:::o;1438:315::-;1506:6;1514;1567:2;1555:9;1546:7;1542:23;1538:32;1535:52;;;1583:1;1580;1573:12;1535:52;1622:9;1609:23;1641:31;1666:5;1641:31;:::i;:::-;1691:5;1743:2;1728:18;;;;1715:32;;-1:-1:-1;;;1438:315:376:o;1758:592::-;1829:6;1837;1890:2;1878:9;1869:7;1865:23;1861:32;1858:52;;;1906:1;1903;1896:12;1858:52;1946:9;1933:23;-1:-1:-1;;;;;2016:2:376;2008:6;2005:14;2002:34;;;2032:1;2029;2022:12;2002:34;2070:6;2059:9;2055:22;2045:32;;2115:7;2108:4;2104:2;2100:13;2096:27;2086:55;;2137:1;2134;2127:12;2086:55;2177:2;2164:16;2203:2;2195:6;2192:14;2189:34;;;2219:1;2216;2209:12;2189:34;2264:7;2259:2;2250:6;2246:2;2242:15;2238:24;2235:37;2232:57;;;2285:1;2282;2275:12;2232:57;2316:2;2308:11;;;;;2338:6;;-1:-1:-1;1758:592:376;;-1:-1:-1;;;;1758:592:376:o;2537:456::-;2614:6;2622;2630;2683:2;2671:9;2662:7;2658:23;2654:32;2651:52;;;2699:1;2696;2689:12;2651:52;2738:9;2725:23;2757:31;2782:5;2757:31;:::i;:::-;2807:5;-1:-1:-1;2864:2:376;2849:18;;2836:32;2877:33;2836:32;2877:33;:::i;:::-;2537:456;;2929:7;;-1:-1:-1;;;2983:2:376;2968:18;;;;2955:32;;2537:456::o;2998:113::-;3085:1;3078:5;3075:12;3065:40;;3101:1;3098;3091:12;3116:415;3213:6;3221;3229;3282:2;3270:9;3261:7;3257:23;3253:32;3250:52;;;3298:1;3295;3288:12;3250:52;3334:9;3321:23;3311:33;;3391:2;3380:9;3376:18;3363:32;3353:42;;3445:2;3434:9;3430:18;3417:32;3458:43;3495:5;3458:43;:::i;:::-;3520:5;3510:15;;;3116:415;;;;;:::o;3536:127::-;3597:10;3592:3;3588:20;3585:1;3578:31;3628:4;3625:1;3618:15;3652:4;3649:1;3642:15;3668:255;3740:2;3734:9;3782:6;3770:19;;-1:-1:-1;;;;;3804:34:376;;3840:22;;;3801:62;3798:88;;;3866:18;;:::i;:::-;3902:2;3895:22;3668:255;:::o;3928:253::-;4000:2;3994:9;4042:4;4030:17;;-1:-1:-1;;;;;4062:34:376;;4098:22;;;4059:62;4056:88;;;4124:18;;:::i;4186:253::-;4258:2;4252:9;4300:4;4288:17;;-1:-1:-1;;;;;4320:34:376;;4356:22;;;4317:62;4314:88;;;4382:18;;:::i;4444:257::-;4516:4;4510:11;;;4548:17;;-1:-1:-1;;;;;4580:34:376;;4616:22;;;4577:62;4574:88;;;4642:18;;:::i;4706:275::-;4777:2;4771:9;4842:2;4823:13;;-1:-1:-1;;4819:27:376;4807:40;;-1:-1:-1;;;;;4862:34:376;;4898:22;;;4859:62;4856:88;;;4924:18;;:::i;:::-;4960:2;4953:22;4706:275;;-1:-1:-1;4706:275:376:o;4986:407::-;5051:5;-1:-1:-1;;;;;5077:6:376;5074:30;5071:56;;;5107:18;;:::i;:::-;5145:57;5190:2;5169:15;;-1:-1:-1;;5165:29:376;5196:4;5161:40;5145:57;:::i;:::-;5136:66;;5225:6;5218:5;5211:21;5265:3;5256:6;5251:3;5247:16;5244:25;5241:45;;;5282:1;5279;5272:12;5241:45;5331:6;5326:3;5319:4;5312:5;5308:16;5295:43;5385:1;5378:4;5369:6;5362:5;5358:18;5354:29;5347:40;4986:407;;;;;:::o;5398:222::-;5441:5;5494:3;5487:4;5479:6;5475:17;5471:27;5461:55;;5512:1;5509;5502:12;5461:55;5534:80;5610:3;5601:6;5588:20;5581:4;5573:6;5569:17;5534:80;:::i;5625:129::-;-1:-1:-1;;;;;5703:5:376;5699:30;5692:5;5689:41;5679:69;;5744:1;5741;5734:12;5759:132;5826:20;;5855:30;5826:20;5855:30;:::i;5896:1321::-;5993:6;6001;6054:2;6042:9;6033:7;6029:23;6025:32;6022:52;;;6070:1;6067;6060:12;6022:52;6110:9;6097:23;-1:-1:-1;;;;;6180:2:376;6172:6;6169:14;6166:34;;;6196:1;6193;6186:12;6166:34;6219:22;;;;6275:6;6257:16;;;6253:29;6250:49;;;6295:1;6292;6285:12;6250:49;6321:22;;:::i;:::-;6381:2;6368:16;6409:2;6399:8;6396:16;6393:36;;;6425:1;6422;6415:12;6393:36;6452:45;6489:7;6478:8;6474:2;6470:17;6452:45;:::i;:::-;6445:5;6438:60;;6544:2;6540;6536:11;6523:25;6573:2;6563:8;6560:16;6557:36;;;6589:1;6586;6579:12;6557:36;6625:45;6662:7;6651:8;6647:2;6643:17;6625:45;:::i;:::-;6620:2;6613:5;6609:14;6602:69;;6724:2;6720;6716:11;6703:25;6698:2;6691:5;6687:14;6680:49;6782:2;6778;6774:11;6761:25;6756:2;6749:5;6745:14;6738:49;6820:31;6846:3;6842:2;6838:12;6820:31;:::i;:::-;6814:3;6807:5;6803:15;6796:56;6885:32;6912:3;6908:2;6904:12;6885:32;:::i;:::-;6879:3;6872:5;6868:15;6861:57;6951:32;6978:3;6974:2;6970:12;6951:32;:::i;:::-;6945:3;6938:5;6934:15;6927:57;7038:3;7034:2;7030:12;7017:26;7011:3;7004:5;7000:15;6993:51;7063:3;7053:13;;7098:31;7125:2;7121;7117:11;7098:31;:::i;:::-;7093:2;7086:5;7082:14;7075:55;7149:5;7139:15;;;;;7173:38;7207:2;7196:9;7192:18;7173:38;:::i;:::-;7163:48;;5896:1321;;;;;:::o;7222:247::-;7281:6;7334:2;7322:9;7313:7;7309:23;7305:32;7302:52;;;7350:1;7347;7340:12;7302:52;7389:9;7376:23;7408:31;7433:5;7408:31;:::i;7959:248::-;8027:6;8035;8088:2;8076:9;8067:7;8063:23;8059:32;8056:52;;;8104:1;8101;8094:12;8056:52;-1:-1:-1;;8127:23:376;;;8197:2;8182:18;;;8169:32;;-1:-1:-1;7959:248:376:o;8212:127::-;8273:10;8268:3;8264:20;8261:1;8254:31;8304:4;8301:1;8294:15;8328:4;8325:1;8318:15;8344:126;8438:1;8431:5;8428:12;8418:46;;8444:18;;:::i;8475:807::-;8542:3;8580:5;8574:12;8607:6;8602:3;8595:19;8633:4;8662;8657:3;8653:14;8646:21;;8701:4;8694:5;8690:16;8724:1;8734:523;8748:6;8745:1;8742:13;8734:523;;;8813:6;8807:13;8849:2;8843:9;8882:1;8878:2;8875:9;8865:43;;8888:18;;:::i;:::-;8921:15;;8976:11;;;8970:18;8956:12;;;8949:40;9012:4;9060:11;;;9054:18;-1:-1:-1;;;;;9050:44:376;9036:12;;;9029:66;9118:4;9162:11;;;9156:18;9142:12;;;9135:40;9204:4;9195:14;;;;9232:15;;;;9091:1;8763:9;8734:523;;;-1:-1:-1;9273:3:376;;8475:807;-1:-1:-1;;;;;8475:807:376:o;9287:797::-;9356:3;9394:5;9388:12;9421:6;9416:3;9409:19;9447:4;9476;9471:3;9467:14;9460:21;;9515:4;9508:5;9504:16;9538:1;9548:511;9562:6;9559:1;9556:13;9548:511;;;9627:6;9621:13;9663:2;9657:9;9679:47;9723:2;9679:47;:::i;:::-;9739:15;;9793:11;;;9787:18;9828:4;9866:21;;;9852:12;;;9845:43;9911:4;9959:11;;;9953:18;9949:27;9935:12;;;9928:49;10006:4;9997:14;;;;10034:15;;;;9584:1;9577:9;9548:511;;10089:1338;10264:2;10275:21;;;10367:13;;10416:4;10396:18;;;10389:32;10470:19;;10334:3;10319:19;;10498:22;;;10235:4;;10264:2;10578:21;;;10235:4;;10551:3;10536:19;;;10627:352;10641:6;10638:1;10635:13;10627:352;;;10706:6;10700:13;10742:2;10736:9;10758:47;10802:2;10758:47;:::i;:::-;10818:15;;10877:11;;10871:18;10891:4;10867:29;10853:12;;;10846:51;10954:15;;;;10663:1;10656:9;;;;;10926:4;10917:14;;;;10627:352;;;10631:3;11028:2;11020:6;11016:15;11010:22;10988:44;;11055:2;11051:7;11041:17;;11121:2;11109:9;11104:3;11100:19;11096:28;11089:4;11078:9;11074:20;11067:58;11148:63;11207:3;11191:14;11148:63;:::i;:::-;11134:77;;;;11260:4;11252:6;11248:17;11242:24;11332:2;11320:9;11312:6;11308:22;11304:31;11297:4;11286:9;11282:20;11275:61;11353:68;11414:6;11398:14;11353:68;:::i;11432:118::-;11518:5;11511:13;11504:21;11497:5;11494:32;11484:60;;11540:1;11537;11530:12;11555:382;11620:6;11628;11681:2;11669:9;11660:7;11656:23;11652:32;11649:52;;;11697:1;11694;11687:12;11649:52;11736:9;11723:23;11755:31;11780:5;11755:31;:::i;:::-;11805:5;-1:-1:-1;11862:2:376;11847:18;;11834:32;11875:30;11834:32;11875:30;:::i;:::-;11924:7;11914:17;;;11555:382;;;;;:::o;11942:795::-;12037:6;12045;12053;12061;12114:3;12102:9;12093:7;12089:23;12085:33;12082:53;;;12131:1;12128;12121:12;12082:53;12170:9;12157:23;12189:31;12214:5;12189:31;:::i;:::-;12239:5;-1:-1:-1;12296:2:376;12281:18;;12268:32;12309:33;12268:32;12309:33;:::i;:::-;12361:7;-1:-1:-1;12415:2:376;12400:18;;12387:32;;-1:-1:-1;12470:2:376;12455:18;;12442:32;-1:-1:-1;;;;;12486:30:376;;12483:50;;;12529:1;12526;12519:12;12483:50;12552:22;;12605:4;12597:13;;12593:27;-1:-1:-1;12583:55:376;;12634:1;12631;12624:12;12583:55;12657:74;12723:7;12718:2;12705:16;12700:2;12696;12692:11;12657:74;:::i;:::-;12647:84;;;11942:795;;;;;;;:::o;12742:543::-;12830:6;12838;12891:2;12879:9;12870:7;12866:23;12862:32;12859:52;;;12907:1;12904;12897:12;12859:52;12947:9;12934:23;-1:-1:-1;;;;;13017:2:376;13009:6;13006:14;13003:34;;;13033:1;13030;13023:12;13003:34;13056:50;13098:7;13089:6;13078:9;13074:22;13056:50;:::i;:::-;13046:60;;13159:2;13148:9;13144:18;13131:32;13115:48;;13188:2;13178:8;13175:16;13172:36;;;13204:1;13201;13194:12;13172:36;;13227:52;13271:7;13260:8;13249:9;13245:24;13227:52;:::i;:::-;13217:62;;;12742:543;;;;;:::o;13290:388::-;13358:6;13366;13419:2;13407:9;13398:7;13394:23;13390:32;13387:52;;;13435:1;13432;13425:12;13387:52;13474:9;13461:23;13493:31;13518:5;13493:31;:::i;:::-;13543:5;-1:-1:-1;13600:2:376;13585:18;;13572:32;13613:33;13572:32;13613:33;:::i;13875:380::-;13954:1;13950:12;;;;13997;;;14018:61;;14072:4;14064:6;14060:17;14050:27;;14018:61;14125:2;14117:6;14114:14;14094:18;14091:38;14088:161;;14171:10;14166:3;14162:20;14159:1;14152:31;14206:4;14203:1;14196:15;14234:4;14231:1;14224:15;14260:184;14330:6;14383:2;14371:9;14362:7;14358:23;14354:32;14351:52;;;14399:1;14396;14389:12;14351:52;-1:-1:-1;14422:16:376;;14260:184;-1:-1:-1;14260:184:376:o;14702:127::-;14763:10;14758:3;14754:20;14751:1;14744:31;14794:4;14791:1;14784:15;14818:4;14815:1;14808:15;14834:128;14901:9;;;14922:11;;;14919:37;;;14936:18;;:::i;15575:127::-;15636:10;15631:3;15627:20;15624:1;15617:31;15667:4;15664:1;15657:15;15691:4;15688:1;15681:15;15707:245;15774:6;15827:2;15815:9;15806:7;15802:23;15798:32;15795:52;;;15843:1;15840;15833:12;15795:52;15875:9;15869:16;15894:28;15916:5;15894:28;:::i;15957:289::-;16088:3;16126:6;16120:13;16142:66;16201:6;16196:3;16189:4;16181:6;16177:17;16142:66;:::i;:::-;16224:16;;;;;15957:289;-1:-1:-1;;15957:289:376:o;16251:297::-;16369:12;;16416:4;16405:16;;;16399:23;;16369:12;16434:16;;16431:111;;;-1:-1:-1;;16508:4:376;16504:17;;;;16501:1;16497:25;16493:38;16482:50;;16251:297;-1:-1:-1;16251:297:376:o;16553:465::-;16606:3;16644:5;16638:12;16671:6;16666:3;16659:19;16697:4;16726;16721:3;16717:14;16710:21;;16765:4;16758:5;16754:16;16788:1;16798:195;16812:6;16809:1;16806:13;16798:195;;;16877:13;;-1:-1:-1;;;;;16873:39:376;16861:52;;16933:12;;;;16968:15;;;;16909:1;16827:9;16798:195;;17023:411;17266:6;17255:9;17248:25;17309:2;17304;17293:9;17289:18;17282:30;17229:4;17329:56;17381:2;17370:9;17366:18;17358:6;17329:56;:::i;:::-;17321:64;;17421:6;17416:2;17405:9;17401:18;17394:34;17023:411;;;;;;:::o;17439:496::-;17618:3;17656:6;17650:13;17672:66;17731:6;17726:3;17719:4;17711:6;17707:17;17672:66;:::i;:::-;17801:13;;17760:16;;;;17823:70;17801:13;17760:16;17870:4;17858:17;;17823:70;:::i;:::-;17909:20;;17439:496;-1:-1:-1;;;;17439:496:376:o;17940:251::-;18010:6;18063:2;18051:9;18042:7;18038:23;18034:32;18031:52;;;18079:1;18076;18069:12;18031:52;18111:9;18105:16;18130:31;18155:5;18130:31;:::i;18322:543::-;18424:2;18419:3;18416:11;18413:446;;;18460:1;18484:5;18481:1;18474:16;18528:4;18525:1;18515:18;18598:2;18586:10;18582:19;18579:1;18575:27;18569:4;18565:38;18634:4;18622:10;18619:20;18616:47;;;-1:-1:-1;18657:4:376;18616:47;18712:2;18707:3;18703:12;18700:1;18696:20;18690:4;18686:31;18676:41;;18767:82;18785:2;18778:5;18775:13;18767:82;;;18830:17;;;18811:1;18800:13;18767:82;;19041:1345;19167:3;19161:10;-1:-1:-1;;;;;19186:6:376;19183:30;19180:56;;;19216:18;;:::i;:::-;19245:97;19335:6;19295:38;19327:4;19321:11;19295:38;:::i;:::-;19289:4;19245:97;:::i;:::-;19397:4;;19454:2;19443:14;;19471:1;19466:663;;;;20173:1;20190:6;20187:89;;;-1:-1:-1;20242:19:376;;;20236:26;20187:89;-1:-1:-1;;18998:1:376;18994:11;;;18990:24;18986:29;18976:40;19022:1;19018:11;;;18973:57;20289:81;;19436:944;;19466:663;18269:1;18262:14;;;18306:4;18293:18;;-1:-1:-1;;19502:20:376;;;19620:236;19634:7;19631:1;19628:14;19620:236;;;19723:19;;;19717:26;19702:42;;19815:27;;;;19783:1;19771:14;;;;19650:19;;19620:236;;;19624:3;19884:6;19875:7;19872:19;19869:201;;;19945:19;;;19939:26;-1:-1:-1;;20028:1:376;20024:14;;;20040:3;20020:24;20016:37;20012:42;19997:58;19982:74;;19869:201;-1:-1:-1;;;;;20116:1:376;20100:14;;;20096:22;20083:36;;-1:-1:-1;19041:1345:376:o;20391:135::-;20430:3;20451:17;;;20448:43;;20471:18;;:::i;:::-;-1:-1:-1;20518:1:376;20507:13;;20391:135::o;20531:217::-;20571:1;20597;20587:132;;20641:10;20636:3;20632:20;20629:1;20622:31;20676:4;20673:1;20666:15;20704:4;20701:1;20694:15;20587:132;-1:-1:-1;20733:9:376;;20531:217::o;20753:255::-;20905:2;20890:18;;20917:51;20961:6;20917:51;:::i;:::-;20977:25;;;20753:255;:::o;21013:249::-;21082:6;21135:2;21123:9;21114:7;21110:23;21106:32;21103:52;;;21151:1;21148;21141:12;21103:52;21183:9;21177:16;21202:30;21226:5;21202:30;:::i;21267:276::-;21336:6;21389:2;21377:9;21368:7;21364:23;21360:32;21357:52;;;21405:1;21402;21395:12;21357:52;21437:9;21431:16;21487:6;21480:5;21476:18;21469:5;21466:29;21456:57;;21509:1;21506;21499:12;21548:125;21613:9;;;21634:10;;;21631:36;;;21647:18;;:::i;21678:180::-;-1:-1:-1;;;;;21783:10:376;;;21795;;;21779:27;;21818:11;;;21815:37;;;21832:18;;:::i;23813:401::-;23908:6;23916;23969:2;23957:9;23948:7;23944:23;23940:32;23937:52;;;23985:1;23982;23975:12;23937:52;24017:9;24011:16;24036:31;24061:5;24036:31;:::i;:::-;24136:2;24121:18;;24115:25;24086:5;;-1:-1:-1;24149:33:376;24115:25;24149:33;:::i;24409:183::-;24469:4;-1:-1:-1;;;;;24494:6:376;24491:30;24488:56;;;24524:18;;:::i;:::-;-1:-1:-1;24569:1:376;24565:14;24581:4;24561:25;;24409:183::o;24597:956::-;24692:6;24723:2;24766;24754:9;24745:7;24741:23;24737:32;24734:52;;;24782:1;24779;24772:12;24734:52;24815:9;24809:16;-1:-1:-1;;;;;24840:6:376;24837:30;24834:50;;;24880:1;24877;24870:12;24834:50;24903:22;;24956:4;24948:13;;24944:27;-1:-1:-1;24934:55:376;;24985:1;24982;24975:12;24934:55;25014:2;25008:9;25037:60;25053:43;25093:2;25053:43;:::i;:::-;25037:60;:::i;:::-;25131:15;;;25213:1;25209:10;;;;25201:19;;25197:28;;;25162:12;;;;25237:19;;;25234:39;;;25269:1;25266;25259:12;25234:39;25293:11;;;;25313:210;25329:6;25324:3;25321:15;25313:210;;;25402:3;25396:10;25419:31;25444:5;25419:31;:::i;:::-;25463:18;;25346:12;;;;25501;;;;25313:210;;25558:502;25850:1;25846;25841:3;25837:11;25833:19;25825:6;25821:32;25810:9;25803:51;25890:6;25885:2;25874:9;25870:18;25863:34;25933:6;25928:2;25917:9;25913:18;25906:34;25976:3;25971:2;25960:9;25956:18;25949:31;25784:4;25997:57;26049:3;26038:9;26034:19;26026:6;25997:57;:::i;26065:160::-;26142:13;;26195:4;26184:16;;26174:27;;26164:55;;26215:1;26212;26205:12;26230:1342;26309:5;26362:3;26355:4;26347:6;26343:17;26339:27;26329:55;;26380:1;26377;26370:12;26329:55;26409:6;26403:13;26435:4;26459:60;26475:43;26515:2;26475:43;:::i;26459:60::-;26553:15;;;26639:1;26635:10;;;;26623:23;;26619:32;;;26584:12;;;;26663:15;;;26660:35;;;26691:1;26688;26681:12;26660:35;26727:2;26719:6;26715:15;26739:804;26755:6;26750:3;26747:15;26739:804;;;26833:4;26827:3;26822;26818:13;26814:24;26811:114;;;26879:1;26908:2;26904;26897:14;26811:114;26951:22;;:::i;:::-;27007:3;27001:10;27046:1;27037:7;27034:14;27024:112;;27090:1;27119:2;27115;27108:14;27024:112;27149:22;;27213:12;;;27207:19;27191:14;;;27184:43;27250:2;27286:12;;;27280:19;27312:33;27280:19;27312:33;:::i;:::-;27365:14;;;27358:31;27412:2;27456:12;;;27450:19;27434:14;;;27427:43;27483:18;;27521:12;;;;26781:4;26772:14;26739:804;;;-1:-1:-1;27561:5:376;26230:1342;-1:-1:-1;;;;;;26230:1342:376:o;27577:1181::-;27658:5;27711:3;27704:4;27696:6;27692:17;27688:27;27678:55;;27729:1;27726;27719:12;27678:55;27758:6;27752:13;27784:4;27808:60;27824:43;27864:2;27824:43;:::i;27808:60::-;27902:15;;;27964:4;28007:13;;;27995:26;;27991:35;;;27933:12;;;;27890:3;28038:15;;;28035:35;;;28066:1;28063;28056:12;28035:35;28102:2;28094:6;28090:15;28114:615;28130:6;28125:3;28122:15;28114:615;;;28206:2;28200:3;28195;28191:13;28187:22;28184:112;;;28250:1;28279:2;28275;28268:14;28184:112;28322:22;;:::i;:::-;28378:3;28372:10;28395:45;28432:7;28395:45;:::i;:::-;28453:22;;28511:41;28539:12;;;28511:41;:::i;:::-;28506:2;28499:5;28495:14;28488:65;28576:2;28614:41;28651:2;28646:3;28642:12;28614:41;:::i;:::-;28598:14;;;28591:65;28669:18;;28707:12;;;;28147;;28114:615;;;-1:-1:-1;28747:5:376;;27577:1181;-1:-1:-1;;;;;;;27577:1181:376:o;28763:1951::-;28860:6;28891:2;28934;28922:9;28913:7;28909:23;28905:32;28902:52;;;28950:1;28947;28940:12;28902:52;28983:9;28977:16;-1:-1:-1;;;;;29053:2:376;29045:6;29042:14;29039:34;;;29069:1;29066;29059:12;29039:34;29092:22;;;;29148:4;29130:16;;;29126:27;29123:47;;;29166:1;29163;29156:12;29123:47;29192:22;;:::i;:::-;29245:2;29239:9;29273:2;29263:8;29260:16;29257:36;;;29289:1;29286;29279:12;29257:36;29312:17;;29360:4;29352:13;;29348:27;-1:-1:-1;29338:55:376;;29389:1;29386;29379:12;29338:55;29418:2;29412:9;29441:60;29457:43;29497:2;29457:43;:::i;29441:60::-;29535:15;;;29617:1;29613:10;;;;29605:19;;29601:28;;;29566:12;;;;29641:19;;;29638:39;;;29673:1;29670;29663:12;29638:39;29697:11;;;;29717:528;29733:6;29728:3;29725:15;29717:528;;;29815:4;29809:3;29800:7;29796:17;29792:28;29789:118;;;29861:1;29890:2;29886;29879:14;29789:118;29935:22;;:::i;:::-;29991:3;29985:10;30008:45;30045:7;30008:45;:::i;:::-;30066:24;;30128:41;30156:12;;;30128:41;:::i;:::-;30110:16;;;30103:67;30183:20;;29759:4;29750:14;;;;;30223:12;;;;29717:528;;;30254:20;;-1:-1:-1;;;30305:11:376;;;30299:18;30329:16;;;30326:36;;;30358:1;30355;30348:12;30326:36;30394:81;30467:7;30456:8;30452:2;30448:17;30394:81;:::i;:::-;30389:2;30382:5;30378:14;30371:105;;30515:4;30511:2;30507:13;30501:20;30485:36;;30546:2;30536:8;30533:16;30530:36;;;30562:1;30559;30552:12;30530:36;30600:83;30675:7;30664:8;30660:2;30656:17;30600:83;:::i;:::-;30593:4;30582:16;;30575:109;30586:5;28763:1951;-1:-1:-1;;;;;;28763:1951:376:o;30719:489::-;-1:-1:-1;;;;;30988:15:376;;;30970:34;;31040:15;;31035:2;31020:18;;31013:43;31087:2;31072:18;;31065:34;;;31135:3;31130:2;31115:18;;31108:31;;;30913:4;;31156:46;;31182:19;;31174:6;31156:46;:::i;31213:290::-;31282:6;31335:2;31323:9;31314:7;31310:23;31306:32;31303:52;;;31351:1;31348;31341:12;31303:52;31377:16;;-1:-1:-1;;;;;;31422:32:376;;31412:43;;31402:71;;31469:1;31466;31459:12;32477:168;32550:9;;;32581;;32598:15;;;32592:22;;32578:37;32568:71;;32619:18;;:::i","linkReferences":{}},"methodIdentifiers":{"__ERC721A_init(string,string)":"d2f01f19","__EntitlementGated_init(address)":"7adc9cbe","__Membership_init((string,string,uint256,uint256,uint64,address,address,uint256,address),address)":"4c2abfbe","_getMembershipCurrency()":"70251563","_getMembershipFreeAllocation()":"b3a5be6d","_getMembershipImage()":"d33d9345","_getMembershipPrice(uint256)":"3ded10de","_getMembershipSupplyLimit()":"8934207f","_getPricingModule()":"ac7ee626","_getSpaceFactory()":"77460cd3","_setMembershipFreeAllocation(uint256)":"f9d5d22c","_setMembershipSupplyLimit(uint256)":"73fc5a05","_setPricingModule(address)":"69d9346b","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","expiresAt(uint256)":"17c95709","getApproved(uint256)":"081812fc","getMembershipCurrency()":"657e45e8","getMembershipDuration()":"8120f0ba","getMembershipFreeAllocation()":"706b8e09","getMembershipImage()":"93b13cb7","getMembershipLimit()":"95d600c8","getMembershipPrice()":"1278076a","getMembershipPricingModule()":"e847abdd","getMembershipRenewalPrice(uint256)":"5803909f","getRuleData(bytes32,uint256)":"92c399ff","getSpaceFactory()":"79dda585","isApprovedForAll(address,address)":"e985e9c5","joinSpace(address)":"8c625b06","joinSpaceWithReferral(address,address,uint256)":"c9f7c833","name()":"06fdde03","ownerOf(uint256)":"6352211e","postEntitlementCheckResult(bytes32,uint256,uint8)":"4739e805","renewMembership(uint256)":"7c9669ac","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setMembershipFreeAllocation(uint256)":"5becd24a","setMembershipImage(string)":"0ef1be5f","setMembershipLimit(uint256)":"97fb7c1e","setMembershipPrice(uint256)":"69d5f38a","setMembershipPricingModule(address)":"df9a9fe6","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","totalSupply()":"18160ddd","transferFrom(address,address,uint256)":"23b872dd","withdraw(address)":"51cff8d9"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BalanceQueryForZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__AlreadyBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Banning__CannotBanSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__NotBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Dispatcher__InvalidCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Dispatcher__InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC5643__DurationZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC5643__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC5643__NotApprovedOrOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC5643__SubscriptionNotRenewable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_NodeAlreadyVoted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_NodeNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_TransactionCheckAlreadyCompleted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_TransactionCheckAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_TransactionNotRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__ValueAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__AlreadyMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InsufficientPayment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidCurrency\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidDuration\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidFeeRecipient\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidFreeAllocation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidMaxSupply\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidPrice\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidPricingModule\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidReferralBps\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidReferralCode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidReferralTime\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__MaxSupplyReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__NotExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__PriceTooLow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintERC2309QuantityExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintZeroQuantity\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnershipNotInitializedForExtraData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__Paused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuard__ReentrantCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__EntitlementAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__EntitlementDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__InvalidEntitlementAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__InvalidPermission\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__PermissionAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__PermissionDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__RoleDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFromIncorrectOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC721ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"URIQueryForNonexistentToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"toTokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"ConsecutiveTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"transactionId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enum IEntitlementGatedBase.NodeVoteStatus\",\"name\":\"result\",\"type\":\"uint8\"}],\"name\":\"EntitlementCheckResultPosted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"currency\",\"type\":\"address\"}],\"name\":\"MembershipCurrencyUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"MembershipFeeRecipientUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"allocation\",\"type\":\"uint256\"}],\"name\":\"MembershipFreeAllocationUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"MembershipLimitUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"MembershipPriceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"MembershipTokenIssued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"MembershipTokenRejected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"MembershipWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"code\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"bps\",\"type\":\"uint16\"}],\"name\":\"Membership__ReferralCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"code\",\"type\":\"uint256\"}],\"name\":\"Membership__ReferralRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"code\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"bps\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"Membership__ReferralTimeCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"RoleCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remover\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"RoleRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"updater\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"RoleUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"expiration\",\"type\":\"uint64\"}],\"name\":\"SubscriptionUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Unbanned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"name\":\"__ERC721A_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IEntitlementChecker\",\"name\":\"entitlementChecker\",\"type\":\"address\"}],\"name\":\"__EntitlementGated_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"duration\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"currency\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeRecipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"freeAllocation\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"pricingModule\",\"type\":\"address\"}],\"internalType\":\"struct IMembershipBase.Membership\",\"name\":\"info\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"spaceFactory\",\"type\":\"address\"}],\"name\":\"__Membership_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"_getMembershipCurrency\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"_getMembershipFreeAllocation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"_getMembershipImage\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"}],\"name\":\"_getMembershipPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"_getMembershipSupplyLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"_getPricingModule\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"_getSpaceFactory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newAllocation\",\"type\":\"uint256\"}],\"name\":\"_setMembershipFreeAllocation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"_setMembershipSupplyLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newPricingModule\",\"type\":\"address\"}],\"name\":\"_setPricingModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"expiresAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMembershipCurrency\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMembershipDuration\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMembershipFreeAllocation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMembershipImage\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMembershipLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMembershipPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMembershipPricingModule\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getMembershipRenewalPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"transactionId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getRuleData\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CombinedOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.Operation[]\",\"name\":\"operations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CheckOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"internalType\":\"struct IRuleEntitlement.CheckOperation[]\",\"name\":\"checkOperations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.LogicalOperationType\",\"name\":\"logOpType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"leftOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"rightOperationIndex\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.LogicalOperation[]\",\"name\":\"logicalOperations\",\"type\":\"tuple[]\"}],\"internalType\":\"struct IRuleEntitlement.RuleData\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSpaceFactory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"joinSpace\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"referralCode\",\"type\":\"uint256\"}],\"name\":\"joinSpaceWithReferral\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"transactionId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"internalType\":\"enum IEntitlementGatedBase.NodeVoteStatus\",\"name\":\"result\",\"type\":\"uint8\"}],\"name\":\"postEntitlementCheckResult\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"renewMembership\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newAllocation\",\"type\":\"uint256\"}],\"name\":\"setMembershipFreeAllocation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"newImage\",\"type\":\"string\"}],\"name\":\"setMembershipImage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"setMembershipLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newPrice\",\"type\":\"uint256\"}],\"name\":\"setMembershipPrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"pricingModule\",\"type\":\"address\"}],\"name\":\"setMembershipPricingModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"AddressInsufficientBalance(address)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"FailedInnerCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"ConsecutiveTransfer(uint256,uint256,address,address)\":{\"details\":\"Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, as defined in the [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. See {_mintERC2309} for more details.\"},\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"},\"SubscriptionUpdate(uint256,uint64)\":{\"details\":\"When a subscription is canceled, the expiration value should also be 0.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"__Membership_init((string,string,uint256,uint256,uint64,address,address,uint256,address),address)\":{\"details\":\"Initialization logic when facet is added to diamond\"},\"_getMembershipPrice(uint256)\":{\"details\":\"Makes it virtual to allow other pricing strategies\"},\"approve(address,uint256)\":{\"details\":\"Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator.\"},\"balanceOf(address)\":{\"details\":\"Returns the number of tokens in `owner`'s account.\"},\"expiresAt(uint256)\":{\"params\":{\"tokenId\":\"The token id of the membership\"}},\"getApproved(uint256)\":{\"details\":\"Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist.\"},\"getMembershipCurrency()\":{\"returns\":{\"_0\":\"The membership currency\"}},\"getMembershipDuration()\":{\"returns\":{\"_0\":\"The membership duration\"}},\"getMembershipFreeAllocation()\":{\"returns\":{\"_0\":\"The membership free allocation\"}},\"getMembershipImage()\":{\"returns\":{\"_0\":\"The membership image\"}},\"getMembershipLimit()\":{\"returns\":{\"_0\":\"The membership limit\"}},\"getMembershipPrice()\":{\"returns\":{\"_0\":\"The membership price\"}},\"getMembershipPricingModule()\":{\"returns\":{\"_0\":\"The membership pricing module\"}},\"getMembershipRenewalPrice(uint256)\":{\"params\":{\"tokenId\":\"The token id of the membership\"},\"returns\":{\"_0\":\"The membership renewal price\"}},\"getSpaceFactory()\":{\"returns\":{\"_0\":\"The space factory\"}},\"isApprovedForAll(address,address)\":{\"details\":\"Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}.\"},\"joinSpace(address)\":{\"params\":{\"receiver\":\"The address of the receiver\"}},\"joinSpaceWithReferral(address,address,uint256)\":{\"params\":{\"receiver\":\"The address of the receiver\",\"referralCode\":\"The referral code\",\"referrer\":\"The address of the referrer\"}},\"name()\":{\"details\":\"Returns the token collection name.\"},\"ownerOf(uint256)\":{\"details\":\"Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist.\"},\"renewMembership(uint256)\":{\"params\":{\"tokenId\":\"The token id of the membership\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Equivalent to `safeTransferFrom(from, to, tokenId, '')`.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event.\"},\"setMembershipFreeAllocation(uint256)\":{\"params\":{\"newAllocation\":\"The new membership free allocation\"}},\"setMembershipLimit(uint256)\":{\"params\":{\"newLimit\":\"The new membership limit\"}},\"setMembershipPrice(uint256)\":{\"params\":{\"newPrice\":\"The new membership price\"}},\"setMembershipPricingModule(address)\":{\"params\":{\"pricingModule\":\"The new pricing module\"}},\"symbol()\":{\"details\":\"Returns the token collection symbol.\"},\"tokenURI(uint256)\":{\"details\":\"Returns the Uniform Resource Identifier (URI) for `tokenId` token.\"},\"totalSupply()\":{\"details\":\"Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"errors\":{\"ApprovalCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"ApprovalQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"BalanceQueryForZeroAddress()\":[{\"notice\":\"Cannot query the balance for the zero address.\"}],\"MintERC2309QuantityExceedsLimit()\":[{\"notice\":\"The `quantity` minted with ERC2309 exceeds the safety limit.\"}],\"MintToZeroAddress()\":[{\"notice\":\"Cannot mint to the zero address.\"}],\"MintZeroQuantity()\":[{\"notice\":\"The quantity of tokens minted must be more than zero.\"}],\"OwnerQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"OwnershipNotInitializedForExtraData()\":[{\"notice\":\"The `extraData` cannot be set on an unintialized ownership slot.\"}],\"TransferCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"TransferFromIncorrectOwner()\":[{\"notice\":\"The token must be owned by `from`.\"}],\"TransferToNonERC721ReceiverImplementer()\":[{\"notice\":\"Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"notice\":\"Cannot transfer to the zero address.\"}],\"URIQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}]},\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"},\"SubscriptionUpdate(uint256,uint64)\":{\"notice\":\"Emitted when a subscription expiration changes\"}},\"kind\":\"user\",\"methods\":{\"expiresAt(uint256)\":{\"notice\":\"Return the expiration date of a membership\"},\"getMembershipCurrency()\":{\"notice\":\"Get the membership currency\"},\"getMembershipDuration()\":{\"notice\":\"Get the membership duration\"},\"getMembershipFreeAllocation()\":{\"notice\":\"Get the membership free allocation\"},\"getMembershipImage()\":{\"notice\":\"Get the membership image\"},\"getMembershipLimit()\":{\"notice\":\"Get the membership limit\"},\"getMembershipPrice()\":{\"notice\":\"Get the membership price\"},\"getMembershipPricingModule()\":{\"notice\":\"Get the membership pricing module\"},\"getMembershipRenewalPrice(uint256)\":{\"notice\":\"Get the membership renewal price\"},\"getSpaceFactory()\":{\"notice\":\"Get the space factory\"},\"joinSpace(address)\":{\"notice\":\"Join a space\"},\"joinSpaceWithReferral(address,address,uint256)\":{\"notice\":\"Join a space with a referral\"},\"renewMembership(uint256)\":{\"notice\":\"Renew a space membership\"},\"setMembershipFreeAllocation(uint256)\":{\"notice\":\"Set the membership free allocation\"},\"setMembershipLimit(uint256)\":{\"notice\":\"Set the membership limit\"},\"setMembershipPrice(uint256)\":{\"notice\":\"Set the membership price\"},\"setMembershipPricingModule(address)\":{\"notice\":\"Set the membership pricing module\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/facets/membership/MembershipFacet.sol\":\"MembershipFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/base/registry/facets/checker/IEntitlementChecker.sol\":{\"keccak256\":\"0x5c9a99c94e95a0c89b3d3310e252cd98aeafe34d87ffc0058f9b001af6f28bd1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7983b17a371e76c8681756dc10abe26f8fffd35d3d6d8773c2023f06c8600ba3\",\"dweb:/ipfs/QmSDkTctKCTaMGYF2LZ1N9YWwDTZD75XegpPyLrP694JFf\"]},\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol\":{\"keccak256\":\"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f\",\"dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol\":{\"keccak256\":\"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5\",\"dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol\":{\"keccak256\":\"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc\",\"dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf\"]},\"contracts/src/diamond/facets/pausable/IPausable.sol\":{\"keccak256\":\"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6\",\"dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM\"]},\"contracts/src/diamond/facets/pausable/PausableBase.sol\":{\"keccak256\":\"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c\",\"dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1\"]},\"contracts/src/diamond/facets/pausable/PausableStorage.sol\":{\"keccak256\":\"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b\",\"dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL\"]},\"contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol\":{\"keccak256\":\"0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b\",\"dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq\"]},\"contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol\":{\"keccak256\":\"0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c\",\"dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T\"]},\"contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol\":{\"keccak256\":\"0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6\",\"dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC\"]},\"contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol\":{\"keccak256\":\"0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714\",\"dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8\"]},\"contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol\":{\"keccak256\":\"0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7\",\"dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7\"]},\"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol\":{\"keccak256\":\"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f\",\"dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721A.sol\":{\"keccak256\":\"0xc8fab662d9a0c4e697c8dcaad72dd2a190331b01476649a742b6f317266ac5a1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://9c84047a6d47a901f45f90f12f713432289ae6d88fea95a383900906005cf70b\",\"dweb:/ipfs/QmVdLUVdtjTQn2fCG85Uv2ZAzCSfNbWYcAg5eXthunnigc\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol\":{\"keccak256\":\"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa\",\"dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol\":{\"keccak256\":\"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c\",\"dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu\"]},\"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol\":{\"keccak256\":\"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e\",\"dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM\"]},\"contracts/src/factory/facets/architect/pricing/IPricingModules.sol\":{\"keccak256\":\"0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716\",\"dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU\"]},\"contracts/src/factory/facets/platform/requirements/IPlatformRequirements.sol\":{\"keccak256\":\"0xc0b22b0caa2336e0c3f6b6813432643053785c39531d30e5851eeb613a0a7991\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8a7ceb199e92f484efcc444fffd54fbabaf332c210dda0ef46d89a66f4cb47c7\",\"dweb:/ipfs/QmRJVrZiZpbGsLngz4J3NVgapKXLErdLc7BPyEyTNKdijg\"]},\"contracts/src/factory/facets/prepay/IPrepay.sol\":{\"keccak256\":\"0x0c5c097dd77471d041cdbb84011ac789147af937d275329d857d1a4b257635e9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://baca271a5a66856f3144a4bf0ed6a484b0c981539d6bf0c57ffade9e4986eb49\",\"dweb:/ipfs/QmVgPWMEL5q2J5kmZQZFRadWjuVQeFLaa9K2gCHdhjLUa9\"]},\"contracts/src/factory/facets/registry/IImplementationRegistry.sol\":{\"keccak256\":\"0x2409b9eb86a4dc5849050d06409fd7548ac21f9bf6e7419b91dfb9226db0a3d5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://613195fc78a1a496820c5934f315c586ad33edf7608022d2ae0ea44f52529e61\",\"dweb:/ipfs/QmR8Gn11UNq2rKC5Qp7Prdk61oWhNg3UVc8KeyWCRfrEqV\"]},\"contracts/src/factory/facets/wallet-link/IWalletLink.sol\":{\"keccak256\":\"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13\",\"dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR\"]},\"contracts/src/spaces/entitlements/IEntitlement.sol\":{\"keccak256\":\"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3\",\"dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf\"]},\"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol\":{\"keccak256\":\"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1\",\"dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97\"]},\"contracts/src/spaces/facets/Entitled.sol\":{\"keccak256\":\"0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7\",\"dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc\"]},\"contracts/src/spaces/facets/Permissions.sol\":{\"keccak256\":\"0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721\",\"dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp\"]},\"contracts/src/spaces/facets/banning/BanningBase.sol\":{\"keccak256\":\"0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d\",\"dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN\"]},\"contracts/src/spaces/facets/banning/BanningStorage.sol\":{\"keccak256\":\"0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0\",\"dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1\"]},\"contracts/src/spaces/facets/banning/IBanning.sol\":{\"keccak256\":\"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419\",\"dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6\"]},\"contracts/src/spaces/facets/channels/ChannelService.sol\":{\"keccak256\":\"0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9\",\"dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi\"]},\"contracts/src/spaces/facets/channels/ChannelStorage.sol\":{\"keccak256\":\"0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7\",\"dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS\"]},\"contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol\":{\"keccak256\":\"0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5\",\"dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9\"]},\"contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol\":{\"keccak256\":\"0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07\",\"dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek\"]},\"contracts/src/spaces/facets/dispatcher/DispatcherBase.sol\":{\"keccak256\":\"0x903020fbe095e548604af198fd56798a1cc7ebd875294f247e38b5c2c25b4b27\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4b9778b31d1fb831115edf4502f6b0166dd0dc5c255bd4bf081d58a40effe675\",\"dweb:/ipfs/QmZ8X9YRtXaPVhxmjY9g6dUTKJb2LxxtCYELm1buoe9UEU\"]},\"contracts/src/spaces/facets/dispatcher/DispatcherStorage.sol\":{\"keccak256\":\"0x72ce4a1e04daeb7732b3559ef699a921d20d0056ad73b1a013ccc131957f9a5b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1053eb5b1f78f5ead722e36fc6a33100534f9bdf065bfb511677c3a5bf8e91b6\",\"dweb:/ipfs/QmeKcC2E8ym4nJ7f84HgjojFDcoghDWyZyKNjQ32ca1RXA\"]},\"contracts/src/spaces/facets/dispatcher/IDispatcher.sol\":{\"keccak256\":\"0x9542fdb04a005a1d923bd266f539db381275f2c5de9de06807eca7d043648308\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://64ebd4899ff63689607fa3014987b953b2ec7d2314667eedceabb868cb042c43\",\"dweb:/ipfs/QmdP8qNW5g1rnFK1Czogvp6JDAvUsPoUavxiJbdci6s6zo\"]},\"contracts/src/spaces/facets/entitlements/EntitlementsManagerService.sol\":{\"keccak256\":\"0x6f40f5b41ad702ea55bf10f987b3e2b6d02ac527a66be523f06f025cead1867d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://da2012c616b833c5b491735c230be707e4f9b7657b3a71d7bdf52e7c2ba128b9\",\"dweb:/ipfs/Qme4864V46rozVDRWtfYqtpyzE1SzBnqYQQf3iD2rrqiPg\"]},\"contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol\":{\"keccak256\":\"0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583\",\"dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK\"]},\"contracts/src/spaces/facets/gated/EntitlementGated.sol\":{\"keccak256\":\"0x69b525c004a345b89f3c784df334780a2d399b3f2058183daf65862f2d095820\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e927c722387563b909fd26cbd09cff0b5bc905a3c0c5c00b9c40c4d66bf19e70\",\"dweb:/ipfs/Qmbk5XXjzLaZJSaSSjhpEm2pyB2GSj1cDPChYdJup9wStk\"]},\"contracts/src/spaces/facets/gated/EntitlementGatedBase.sol\":{\"keccak256\":\"0x0aa9887cf58dd68d0270c85e2d7610080f35410b845c2227e4bd84356b7a2cb7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6dbdbed895fc2a53bffa3dbc1cfd4c992a096f153e6bbb7aeb9894485e7fc1a6\",\"dweb:/ipfs/QmZp76Gd8aL9pWbiTvLaiHv1w12yjN59PtYdMvoUCbfbH5\"]},\"contracts/src/spaces/facets/gated/EntitlementGatedStorage.sol\":{\"keccak256\":\"0xe997c0dd62f6ceb300729d3f56a3f25a47b40ed5946d68c5210c38941cb37eaa\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://63fcfd9f667538e8e9339534d2ddc6f7899e4179a54f3c6595e2598babb5bb9c\",\"dweb:/ipfs/QmUfKtfgW1uskEWkhhGqTjcbCqMANQoKKfTgV2ZvdAZpvJ\"]},\"contracts/src/spaces/facets/gated/IEntitlementGated.sol\":{\"keccak256\":\"0x948de1018f7f78366263a40e0f8269e10941216bd03a9996edb24a6230959e74\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://dc985539ce639f39fd68723acca6424a78deac6cec3693c9d8e1084a487c83ec\",\"dweb:/ipfs/QmQujX5rmDwhJZurp11FTiPLb7ev9swLTtdkagA8wydZiT\"]},\"contracts/src/spaces/facets/membership/IMembership.sol\":{\"keccak256\":\"0x233066dd470121818082ba6a4c868f90feafc3be29942aae2c7a5c25543b7485\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://30d976a1882102493e7cee87b75ab04c662626d71aca51c9334ed2f60402bb59\",\"dweb:/ipfs/QmerPfizrjueQSgG8SkSoi44fkyaqrN2ZCFTnaxnM3UqF7\"]},\"contracts/src/spaces/facets/membership/MembershipBase.sol\":{\"keccak256\":\"0x82b3314afcd1fe84a5261c38627c2537c09271372504af10549558c0fd608791\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dadc28ee124081ea64228b8a12e0fcc93c7256535597ea9e29d58140bb599fc5\",\"dweb:/ipfs/QmYNZjhBJnPf9kMt2J6pL2d746AB3EHrXVAj5Ce3ibZpBh\"]},\"contracts/src/spaces/facets/membership/MembershipFacet.sol\":{\"keccak256\":\"0xdc782a29cb2a6a7f136c6e4a65186112cbc9eb517dc234ac391ce7f437cc0dcf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7df5a5738f97cae15e9a1d59ca3dd7efb5ab860848e0205aae9c6e6bb066464c\",\"dweb:/ipfs/QmQ61dYiibSaKrjzPvn9npQn7b83dM8tkwF48HxtaW6gwg\"]},\"contracts/src/spaces/facets/membership/MembershipStorage.sol\":{\"keccak256\":\"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee\",\"dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5\"]},\"contracts/src/spaces/facets/membership/pricing/IMembershipPricing.sol\":{\"keccak256\":\"0xb68faf2b90536ea53110ebb1d4456f2e9a261b5fac4515df47076da73e0cbd77\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://063fca54f8210be704b5d9f54efac08017266fafc9d287a6ece7866b25174448\",\"dweb:/ipfs/QmbXUgKgh36CmNRA5NrtRrVcgfrKYEzZprAcjTVWhHmXBF\"]},\"contracts/src/spaces/facets/membership/referral/IMembershipReferral.sol\":{\"keccak256\":\"0xeb2feee4b1f3e83509bc1425c0ecd60eaf168fa7686c14dc2bd636e5a691bc6a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ec9bcb8c4106639ec9e0d37fa59385c1e853fb07f9ebedcd9f2bc1198979a807\",\"dweb:/ipfs/QmcAdwQKn2jMo7grzXNGSPr9PvQBxdKURF6xxLPorCDrFt\"]},\"contracts/src/spaces/facets/membership/referral/MembershipReferralBase.sol\":{\"keccak256\":\"0x6f29e73b113fce75e54a41f248621b1adaa5ac4a3b189ef0903308bfa69165ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://abc7b25a74097434912f4940bfcd6cf9e312b0989279cb31a9a74d7ae6c09636\",\"dweb:/ipfs/QmPdttVeMBDBb8SMrga6YnKz3aiGDKMqo2MofCXtag4w4E\"]},\"contracts/src/spaces/facets/membership/referral/MembershipReferralStorage.sol\":{\"keccak256\":\"0x607aabf7ae45b7f112165c1028e0fa2d18b86c6db78f4df4bdf39dd0f20973ea\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4d61919ebf0ba0d3706cf2c3755b9d9920312c82bb1b83d0023f1cb09c2fc31d\",\"dweb:/ipfs/QmSQ1G7rRMf6tAuzdU6M5ydKetaSZXdN3UV33wNjvDrqAL\"]},\"contracts/src/spaces/facets/roles/IRoles.sol\":{\"keccak256\":\"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8\",\"dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N\"]},\"contracts/src/spaces/facets/roles/RolesBase.sol\":{\"keccak256\":\"0x2ef137dec4a5390009fd931e34fdbb4a742c96b68b40f5c152cec8cf2809ed6f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3cb29b4a780742a30ba3af5719f77a4a65ea55ebbdc3ccd9c93c86573f20c7df\",\"dweb:/ipfs/QmdvPJydLCcEwCB3xk5VpET8X2GfrxC3NBUD5G6C8a9aW8\"]},\"contracts/src/spaces/facets/roles/RolesStorage.sol\":{\"keccak256\":\"0x40f288a613e35cbc02aceb1d23f89af888f65538853f61cc1fcd25901b9bc4af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://396b5e157c9a29adc94edc5d234f416a44e6e7c4588b1aaa0587bb04018705e9\",\"dweb:/ipfs/QmWDCQz555WbvZw7XxfkybE5dPfouc6rKxU5Zu1Gsuz1Zr\"]},\"contracts/src/utils/StringSet.sol\":{\"keccak256\":\"0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6\",\"dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK\"]},\"contracts/src/utils/Validator.sol\":{\"keccak256\":\"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64\",\"dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72\"]},\"contracts/src/utils/interfaces/IWETH.sol\":{\"keccak256\":\"0xd274612ab96215dcdb6e3717a63e7a0f76c7facadff93b2b23ed278f6e7b3b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://12444da1f06a0fbe6d2d564d73d6d6bc58c09496af3aeea6988c3d3f9ee81c73\",\"dweb:/ipfs/QmTkpQ6cZmRYgvLUS4mqzLvFg5nabgQjpMnVK8JENboiA3\"]},\"contracts/src/utils/libraries/BasisPoints.sol\":{\"keccak256\":\"0x797b0a1d3da51f4256c83b5d5c885b034df5bdff69c8dfa0fac9777cfa2f1d26\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://52ba0c85e5de8a7d76e2e4bcbccdaffa68e29281191ae1f889430a496ce5cf1c\",\"dweb:/ipfs/Qmd5bYypjF6gcJKKagdRpvAgV4LCs4iyn7KYdaLBWjjuHr\"]},\"contracts/src/utils/libraries/CurrencyTransfer.sol\":{\"keccak256\":\"0x1c6b5b33831f8c5c02c49dff5ceac3ad1a6cdb74c988ebba72c36329ca704750\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://78122f27b67a5d3ebe95c4260dc972ab7be5c04b277cbd71a833dd74fbd23fa4\",\"dweb:/ipfs/QmU78EApEim92KMVtW69coFPZdhvbkhmYn6dW2zwqJKPBp\"]},\"lib/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c\",\"dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq\"]},\"lib/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d\",\"dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi\"]},\"lib/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0\",\"dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3\"]},\"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"AddressInsufficientBalance"},{"inputs":[],"type":"error","name":"ApprovalCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"ApprovalQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"BalanceQueryForZeroAddress"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__AlreadyBanned"},{"inputs":[],"type":"error","name":"Banning__CannotBanSelf"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__InvalidTokenId"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__NotBanned"},{"inputs":[],"type":"error","name":"Dispatcher__InvalidCaller"},{"inputs":[],"type":"error","name":"Dispatcher__InvalidValue"},{"inputs":[],"type":"error","name":"ERC5643__DurationZero"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC5643__InvalidTokenId"},{"inputs":[],"type":"error","name":"ERC5643__NotApprovedOrOwner"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC5643__SubscriptionNotRenewable"},{"inputs":[],"type":"error","name":"EntitlementGated_InvalidAddress"},{"inputs":[],"type":"error","name":"EntitlementGated_NodeAlreadyVoted"},{"inputs":[],"type":"error","name":"EntitlementGated_NodeNotFound"},{"inputs":[],"type":"error","name":"EntitlementGated_TransactionCheckAlreadyCompleted"},{"inputs":[],"type":"error","name":"EntitlementGated_TransactionCheckAlreadyRegistered"},{"inputs":[],"type":"error","name":"EntitlementGated_TransactionNotRegistered"},{"inputs":[],"type":"error","name":"Entitlement__InvalidValue"},{"inputs":[],"type":"error","name":"Entitlement__NotAllowed"},{"inputs":[],"type":"error","name":"Entitlement__NotMember"},{"inputs":[],"type":"error","name":"Entitlement__ValueAlreadyExists"},{"inputs":[],"type":"error","name":"FailedInnerCall"},{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[],"type":"error","name":"Membership__AlreadyMember"},{"inputs":[],"type":"error","name":"Membership__InsufficientAllowance"},{"inputs":[],"type":"error","name":"Membership__InsufficientPayment"},{"inputs":[],"type":"error","name":"Membership__InvalidAddress"},{"inputs":[],"type":"error","name":"Membership__InvalidCurrency"},{"inputs":[],"type":"error","name":"Membership__InvalidDuration"},{"inputs":[],"type":"error","name":"Membership__InvalidFeeRecipient"},{"inputs":[],"type":"error","name":"Membership__InvalidFreeAllocation"},{"inputs":[],"type":"error","name":"Membership__InvalidLimit"},{"inputs":[],"type":"error","name":"Membership__InvalidMaxSupply"},{"inputs":[],"type":"error","name":"Membership__InvalidPrice"},{"inputs":[],"type":"error","name":"Membership__InvalidPricingModule"},{"inputs":[],"type":"error","name":"Membership__InvalidReferralBps"},{"inputs":[],"type":"error","name":"Membership__InvalidReferralCode"},{"inputs":[],"type":"error","name":"Membership__InvalidReferralTime"},{"inputs":[],"type":"error","name":"Membership__InvalidTokenId"},{"inputs":[],"type":"error","name":"Membership__MaxSupplyReached"},{"inputs":[],"type":"error","name":"Membership__NotExpired"},{"inputs":[],"type":"error","name":"Membership__PriceTooLow"},{"inputs":[],"type":"error","name":"MintERC2309QuantityExceedsLimit"},{"inputs":[],"type":"error","name":"MintToZeroAddress"},{"inputs":[],"type":"error","name":"MintZeroQuantity"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[],"type":"error","name":"OwnerQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"OwnershipNotInitializedForExtraData"},{"inputs":[],"type":"error","name":"Pausable__NotPaused"},{"inputs":[],"type":"error","name":"Pausable__Paused"},{"inputs":[],"type":"error","name":"ReentrancyGuard__ReentrantCall"},{"inputs":[],"type":"error","name":"Roles__EntitlementAlreadyExists"},{"inputs":[],"type":"error","name":"Roles__EntitlementDoesNotExist"},{"inputs":[],"type":"error","name":"Roles__InvalidEntitlementAddress"},{"inputs":[],"type":"error","name":"Roles__InvalidPermission"},{"inputs":[],"type":"error","name":"Roles__PermissionAlreadyExists"},{"inputs":[],"type":"error","name":"Roles__PermissionDoesNotExist"},{"inputs":[],"type":"error","name":"Roles__RoleDoesNotExist"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"type":"error","name":"SafeERC20FailedOperation"},{"inputs":[],"type":"error","name":"TransferCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"TransferFromIncorrectOwner"},{"inputs":[],"type":"error","name":"TransferToNonERC721ReceiverImplementer"},{"inputs":[],"type":"error","name":"TransferToZeroAddress"},{"inputs":[],"type":"error","name":"URIQueryForNonexistentToken"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"approved","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bool","name":"approved","type":"bool","indexed":false}],"type":"event","name":"ApprovalForAll","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Banned","anonymous":false},{"inputs":[{"internalType":"uint256","name":"fromTokenId","type":"uint256","indexed":true},{"internalType":"uint256","name":"toTokenId","type":"uint256","indexed":false},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true}],"type":"event","name":"ConsecutiveTransfer","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"transactionId","type":"bytes32","indexed":true},{"internalType":"enum IEntitlementGatedBase.NodeVoteStatus","name":"result","type":"uint8","indexed":false}],"type":"event","name":"EntitlementCheckResultPosted","anonymous":false},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"currency","type":"address","indexed":true}],"type":"event","name":"MembershipCurrencyUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"recipient","type":"address","indexed":true}],"type":"event","name":"MembershipFeeRecipientUpdated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"allocation","type":"uint256","indexed":true}],"type":"event","name":"MembershipFreeAllocationUpdated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256","indexed":true}],"type":"event","name":"MembershipLimitUpdated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256","indexed":true}],"type":"event","name":"MembershipPriceUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"recipient","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"MembershipTokenIssued","anonymous":false},{"inputs":[{"internalType":"address","name":"recipient","type":"address","indexed":true}],"type":"event","name":"MembershipTokenRejected","anonymous":false},{"inputs":[{"internalType":"address","name":"recipient","type":"address","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false}],"type":"event","name":"MembershipWithdrawal","anonymous":false},{"inputs":[{"internalType":"uint256","name":"code","type":"uint256","indexed":true},{"internalType":"uint16","name":"bps","type":"uint16","indexed":false}],"type":"event","name":"Membership__ReferralCreated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"code","type":"uint256","indexed":true}],"type":"event","name":"Membership__ReferralRemoved","anonymous":false},{"inputs":[{"internalType":"uint256","name":"code","type":"uint256","indexed":true},{"internalType":"uint16","name":"bps","type":"uint16","indexed":false},{"internalType":"uint256","name":"startTime","type":"uint256","indexed":false},{"internalType":"uint256","name":"endTime","type":"uint256","indexed":false}],"type":"event","name":"Membership__ReferralTimeCreated","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"address","name":"creator","type":"address","indexed":true},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":true}],"type":"event","name":"RoleCreated","anonymous":false},{"inputs":[{"internalType":"address","name":"remover","type":"address","indexed":true},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":true}],"type":"event","name":"RoleRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"updater","type":"address","indexed":true},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":true}],"type":"event","name":"RoleUpdated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true},{"internalType":"uint64","name":"expiration","type":"uint64","indexed":false}],"type":"event","name":"SubscriptionUpdate","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Unbanned","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"__ERC721A_init"},{"inputs":[{"internalType":"contract IEntitlementChecker","name":"entitlementChecker","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"__EntitlementGated_init"},{"inputs":[{"internalType":"struct IMembershipBase.Membership","name":"info","type":"tuple","components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint64","name":"duration","type":"uint64"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"address","name":"feeRecipient","type":"address"},{"internalType":"uint256","name":"freeAllocation","type":"uint256"},{"internalType":"address","name":"pricingModule","type":"address"}]},{"internalType":"address","name":"spaceFactory","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"__Membership_init"},{"inputs":[],"stateMutability":"view","type":"function","name":"_getMembershipCurrency","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"_getMembershipFreeAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"_getMembershipImage","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"stateMutability":"view","type":"function","name":"_getMembershipPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"_getMembershipSupplyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"_getPricingModule","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"_getSpaceFactory","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"newAllocation","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"_setMembershipFreeAllocation"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"_setMembershipSupplyLimit"},{"inputs":[{"internalType":"address","name":"newPricingModule","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"_setPricingModule"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"approve"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function","name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"expiresAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getMembershipCurrency","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getMembershipDuration","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getMembershipFreeAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getMembershipImage","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getMembershipLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getMembershipPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getMembershipPricingModule","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getMembershipRenewalPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes32","name":"transactionId","type":"bytes32"},{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getRuleData","outputs":[{"internalType":"struct IRuleEntitlement.RuleData","name":"","type":"tuple","components":[{"internalType":"struct IRuleEntitlement.Operation[]","name":"operations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CombinedOperationType","name":"opType","type":"uint8"},{"internalType":"uint8","name":"index","type":"uint8"}]},{"internalType":"struct IRuleEntitlement.CheckOperation[]","name":"checkOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CheckOperationType","name":"opType","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"threshold","type":"uint256"}]},{"internalType":"struct IRuleEntitlement.LogicalOperation[]","name":"logicalOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.LogicalOperationType","name":"logOpType","type":"uint8"},{"internalType":"uint8","name":"leftOperationIndex","type":"uint8"},{"internalType":"uint8","name":"rightOperationIndex","type":"uint8"}]}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getSpaceFactory","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"stateMutability":"payable","type":"function","name":"joinSpace"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"referrer","type":"address"},{"internalType":"uint256","name":"referralCode","type":"uint256"}],"stateMutability":"payable","type":"function","name":"joinSpaceWithReferral"},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"bytes32","name":"transactionId","type":"bytes32"},{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"enum IEntitlementGatedBase.NodeVoteStatus","name":"result","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"postEntitlementCheckResult"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"renewMembership"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setApprovalForAll"},{"inputs":[{"internalType":"uint256","name":"newAllocation","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"setMembershipFreeAllocation"},{"inputs":[{"internalType":"string","name":"newImage","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"setMembershipImage"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"setMembershipLimit"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"setMembershipPrice"},{"inputs":[{"internalType":"address","name":"pricingModule","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setMembershipPricingModule"},{"inputs":[],"stateMutability":"view","type":"function","name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"transferFrom"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"withdraw"}],"devdoc":{"kind":"dev","methods":{"__Membership_init((string,string,uint256,uint256,uint64,address,address,uint256,address),address)":{"details":"Initialization logic when facet is added to diamond"},"_getMembershipPrice(uint256)":{"details":"Makes it virtual to allow other pricing strategies"},"approve(address,uint256)":{"details":"Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator."},"balanceOf(address)":{"details":"Returns the number of tokens in `owner`'s account."},"expiresAt(uint256)":{"params":{"tokenId":"The token id of the membership"}},"getApproved(uint256)":{"details":"Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist."},"getMembershipCurrency()":{"returns":{"_0":"The membership currency"}},"getMembershipDuration()":{"returns":{"_0":"The membership duration"}},"getMembershipFreeAllocation()":{"returns":{"_0":"The membership free allocation"}},"getMembershipImage()":{"returns":{"_0":"The membership image"}},"getMembershipLimit()":{"returns":{"_0":"The membership limit"}},"getMembershipPrice()":{"returns":{"_0":"The membership price"}},"getMembershipPricingModule()":{"returns":{"_0":"The membership pricing module"}},"getMembershipRenewalPrice(uint256)":{"params":{"tokenId":"The token id of the membership"},"returns":{"_0":"The membership renewal price"}},"getSpaceFactory()":{"returns":{"_0":"The space factory"}},"isApprovedForAll(address,address)":{"details":"Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}."},"joinSpace(address)":{"params":{"receiver":"The address of the receiver"}},"joinSpaceWithReferral(address,address,uint256)":{"params":{"receiver":"The address of the receiver","referralCode":"The referral code","referrer":"The address of the referrer"}},"name()":{"details":"Returns the token collection name."},"ownerOf(uint256)":{"details":"Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist."},"renewMembership(uint256)":{"params":{"tokenId":"The token id of the membership"}},"safeTransferFrom(address,address,uint256)":{"details":"Equivalent to `safeTransferFrom(from, to, tokenId, '')`."},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event."},"setApprovalForAll(address,bool)":{"details":"Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event."},"setMembershipFreeAllocation(uint256)":{"params":{"newAllocation":"The new membership free allocation"}},"setMembershipLimit(uint256)":{"params":{"newLimit":"The new membership limit"}},"setMembershipPrice(uint256)":{"params":{"newPrice":"The new membership price"}},"setMembershipPricingModule(address)":{"params":{"pricingModule":"The new pricing module"}},"symbol()":{"details":"Returns the token collection symbol."},"tokenURI(uint256)":{"details":"Returns the Uniform Resource Identifier (URI) for `tokenId` token."},"totalSupply()":{"details":"Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}."},"transferFrom(address,address,uint256)":{"details":"Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event."}},"version":1},"userdoc":{"kind":"user","methods":{"expiresAt(uint256)":{"notice":"Return the expiration date of a membership"},"getMembershipCurrency()":{"notice":"Get the membership currency"},"getMembershipDuration()":{"notice":"Get the membership duration"},"getMembershipFreeAllocation()":{"notice":"Get the membership free allocation"},"getMembershipImage()":{"notice":"Get the membership image"},"getMembershipLimit()":{"notice":"Get the membership limit"},"getMembershipPrice()":{"notice":"Get the membership price"},"getMembershipPricingModule()":{"notice":"Get the membership pricing module"},"getMembershipRenewalPrice(uint256)":{"notice":"Get the membership renewal price"},"getSpaceFactory()":{"notice":"Get the space factory"},"joinSpace(address)":{"notice":"Join a space"},"joinSpaceWithReferral(address,address,uint256)":{"notice":"Join a space with a referral"},"renewMembership(uint256)":{"notice":"Renew a space membership"},"setMembershipFreeAllocation(uint256)":{"notice":"Set the membership free allocation"},"setMembershipLimit(uint256)":{"notice":"Set the membership limit"},"setMembershipPrice(uint256)":{"notice":"Set the membership price"},"setMembershipPricingModule(address)":{"notice":"Set the membership pricing module"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/facets/membership/MembershipFacet.sol":"MembershipFacet"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/base/registry/facets/checker/IEntitlementChecker.sol":{"keccak256":"0x5c9a99c94e95a0c89b3d3310e252cd98aeafe34d87ffc0058f9b001af6f28bd1","urls":["bzz-raw://7983b17a371e76c8681756dc10abe26f8fffd35d3d6d8773c2023f06c8600ba3","dweb:/ipfs/QmSDkTctKCTaMGYF2LZ1N9YWwDTZD75XegpPyLrP694JFf"],"license":"MIT"},"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol":{"keccak256":"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d","urls":["bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f","dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol":{"keccak256":"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a","urls":["bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5","dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol":{"keccak256":"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0","urls":["bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc","dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/IPausable.sol":{"keccak256":"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261","urls":["bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6","dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableBase.sol":{"keccak256":"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438","urls":["bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c","dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableStorage.sol":{"keccak256":"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07","urls":["bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b","dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol":{"keccak256":"0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a","urls":["bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b","dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol":{"keccak256":"0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f","urls":["bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c","dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol":{"keccak256":"0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c","urls":["bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6","dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol":{"keccak256":"0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3","urls":["bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714","dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol":{"keccak256":"0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e","urls":["bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7","dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol":{"keccak256":"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218","urls":["bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f","dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721A.sol":{"keccak256":"0xc8fab662d9a0c4e697c8dcaad72dd2a190331b01476649a742b6f317266ac5a1","urls":["bzz-raw://9c84047a6d47a901f45f90f12f713432289ae6d88fea95a383900906005cf70b","dweb:/ipfs/QmVdLUVdtjTQn2fCG85Uv2ZAzCSfNbWYcAg5eXthunnigc"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol":{"keccak256":"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334","urls":["bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa","dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol":{"keccak256":"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1","urls":["bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c","dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9","urls":["bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e","dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM"],"license":"Apache-2.0"},"contracts/src/factory/facets/architect/pricing/IPricingModules.sol":{"keccak256":"0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e","urls":["bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716","dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU"],"license":"Apache-2.0"},"contracts/src/factory/facets/platform/requirements/IPlatformRequirements.sol":{"keccak256":"0xc0b22b0caa2336e0c3f6b6813432643053785c39531d30e5851eeb613a0a7991","urls":["bzz-raw://8a7ceb199e92f484efcc444fffd54fbabaf332c210dda0ef46d89a66f4cb47c7","dweb:/ipfs/QmRJVrZiZpbGsLngz4J3NVgapKXLErdLc7BPyEyTNKdijg"],"license":"Apache-2.0"},"contracts/src/factory/facets/prepay/IPrepay.sol":{"keccak256":"0x0c5c097dd77471d041cdbb84011ac789147af937d275329d857d1a4b257635e9","urls":["bzz-raw://baca271a5a66856f3144a4bf0ed6a484b0c981539d6bf0c57ffade9e4986eb49","dweb:/ipfs/QmVgPWMEL5q2J5kmZQZFRadWjuVQeFLaa9K2gCHdhjLUa9"],"license":"Apache-2.0"},"contracts/src/factory/facets/registry/IImplementationRegistry.sol":{"keccak256":"0x2409b9eb86a4dc5849050d06409fd7548ac21f9bf6e7419b91dfb9226db0a3d5","urls":["bzz-raw://613195fc78a1a496820c5934f315c586ad33edf7608022d2ae0ea44f52529e61","dweb:/ipfs/QmR8Gn11UNq2rKC5Qp7Prdk61oWhNg3UVc8KeyWCRfrEqV"],"license":"Apache-2.0"},"contracts/src/factory/facets/wallet-link/IWalletLink.sol":{"keccak256":"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b","urls":["bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13","dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/IEntitlement.sol":{"keccak256":"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca","urls":["bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3","dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol":{"keccak256":"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf","urls":["bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1","dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97"],"license":"MIT"},"contracts/src/spaces/facets/Entitled.sol":{"keccak256":"0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c","urls":["bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7","dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc"],"license":"Apache-2.0"},"contracts/src/spaces/facets/Permissions.sol":{"keccak256":"0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5","urls":["bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721","dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/BanningBase.sol":{"keccak256":"0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270","urls":["bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d","dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/BanningStorage.sol":{"keccak256":"0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492","urls":["bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0","dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/IBanning.sol":{"keccak256":"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505","urls":["bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419","dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/ChannelService.sol":{"keccak256":"0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7","urls":["bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9","dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/ChannelStorage.sol":{"keccak256":"0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f","urls":["bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7","dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS"],"license":"Apache-2.0"},"contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol":{"keccak256":"0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2","urls":["bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5","dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9"],"license":"Apache-2.0"},"contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol":{"keccak256":"0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef","urls":["bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07","dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek"],"license":"Apache-2.0"},"contracts/src/spaces/facets/dispatcher/DispatcherBase.sol":{"keccak256":"0x903020fbe095e548604af198fd56798a1cc7ebd875294f247e38b5c2c25b4b27","urls":["bzz-raw://4b9778b31d1fb831115edf4502f6b0166dd0dc5c255bd4bf081d58a40effe675","dweb:/ipfs/QmZ8X9YRtXaPVhxmjY9g6dUTKJb2LxxtCYELm1buoe9UEU"],"license":"Apache-2.0"},"contracts/src/spaces/facets/dispatcher/DispatcherStorage.sol":{"keccak256":"0x72ce4a1e04daeb7732b3559ef699a921d20d0056ad73b1a013ccc131957f9a5b","urls":["bzz-raw://1053eb5b1f78f5ead722e36fc6a33100534f9bdf065bfb511677c3a5bf8e91b6","dweb:/ipfs/QmeKcC2E8ym4nJ7f84HgjojFDcoghDWyZyKNjQ32ca1RXA"],"license":"Apache-2.0"},"contracts/src/spaces/facets/dispatcher/IDispatcher.sol":{"keccak256":"0x9542fdb04a005a1d923bd266f539db381275f2c5de9de06807eca7d043648308","urls":["bzz-raw://64ebd4899ff63689607fa3014987b953b2ec7d2314667eedceabb868cb042c43","dweb:/ipfs/QmdP8qNW5g1rnFK1Czogvp6JDAvUsPoUavxiJbdci6s6zo"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/EntitlementsManagerService.sol":{"keccak256":"0x6f40f5b41ad702ea55bf10f987b3e2b6d02ac527a66be523f06f025cead1867d","urls":["bzz-raw://da2012c616b833c5b491735c230be707e4f9b7657b3a71d7bdf52e7c2ba128b9","dweb:/ipfs/Qme4864V46rozVDRWtfYqtpyzE1SzBnqYQQf3iD2rrqiPg"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol":{"keccak256":"0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8","urls":["bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583","dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/EntitlementGated.sol":{"keccak256":"0x69b525c004a345b89f3c784df334780a2d399b3f2058183daf65862f2d095820","urls":["bzz-raw://e927c722387563b909fd26cbd09cff0b5bc905a3c0c5c00b9c40c4d66bf19e70","dweb:/ipfs/Qmbk5XXjzLaZJSaSSjhpEm2pyB2GSj1cDPChYdJup9wStk"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/EntitlementGatedBase.sol":{"keccak256":"0x0aa9887cf58dd68d0270c85e2d7610080f35410b845c2227e4bd84356b7a2cb7","urls":["bzz-raw://6dbdbed895fc2a53bffa3dbc1cfd4c992a096f153e6bbb7aeb9894485e7fc1a6","dweb:/ipfs/QmZp76Gd8aL9pWbiTvLaiHv1w12yjN59PtYdMvoUCbfbH5"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/EntitlementGatedStorage.sol":{"keccak256":"0xe997c0dd62f6ceb300729d3f56a3f25a47b40ed5946d68c5210c38941cb37eaa","urls":["bzz-raw://63fcfd9f667538e8e9339534d2ddc6f7899e4179a54f3c6595e2598babb5bb9c","dweb:/ipfs/QmUfKtfgW1uskEWkhhGqTjcbCqMANQoKKfTgV2ZvdAZpvJ"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/IEntitlementGated.sol":{"keccak256":"0x948de1018f7f78366263a40e0f8269e10941216bd03a9996edb24a6230959e74","urls":["bzz-raw://dc985539ce639f39fd68723acca6424a78deac6cec3693c9d8e1084a487c83ec","dweb:/ipfs/QmQujX5rmDwhJZurp11FTiPLb7ev9swLTtdkagA8wydZiT"],"license":"MIT"},"contracts/src/spaces/facets/membership/IMembership.sol":{"keccak256":"0x233066dd470121818082ba6a4c868f90feafc3be29942aae2c7a5c25543b7485","urls":["bzz-raw://30d976a1882102493e7cee87b75ab04c662626d71aca51c9334ed2f60402bb59","dweb:/ipfs/QmerPfizrjueQSgG8SkSoi44fkyaqrN2ZCFTnaxnM3UqF7"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/MembershipBase.sol":{"keccak256":"0x82b3314afcd1fe84a5261c38627c2537c09271372504af10549558c0fd608791","urls":["bzz-raw://dadc28ee124081ea64228b8a12e0fcc93c7256535597ea9e29d58140bb599fc5","dweb:/ipfs/QmYNZjhBJnPf9kMt2J6pL2d746AB3EHrXVAj5Ce3ibZpBh"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/MembershipFacet.sol":{"keccak256":"0xdc782a29cb2a6a7f136c6e4a65186112cbc9eb517dc234ac391ce7f437cc0dcf","urls":["bzz-raw://7df5a5738f97cae15e9a1d59ca3dd7efb5ab860848e0205aae9c6e6bb066464c","dweb:/ipfs/QmQ61dYiibSaKrjzPvn9npQn7b83dM8tkwF48HxtaW6gwg"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/MembershipStorage.sol":{"keccak256":"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3","urls":["bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee","dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/pricing/IMembershipPricing.sol":{"keccak256":"0xb68faf2b90536ea53110ebb1d4456f2e9a261b5fac4515df47076da73e0cbd77","urls":["bzz-raw://063fca54f8210be704b5d9f54efac08017266fafc9d287a6ece7866b25174448","dweb:/ipfs/QmbXUgKgh36CmNRA5NrtRrVcgfrKYEzZprAcjTVWhHmXBF"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/referral/IMembershipReferral.sol":{"keccak256":"0xeb2feee4b1f3e83509bc1425c0ecd60eaf168fa7686c14dc2bd636e5a691bc6a","urls":["bzz-raw://ec9bcb8c4106639ec9e0d37fa59385c1e853fb07f9ebedcd9f2bc1198979a807","dweb:/ipfs/QmcAdwQKn2jMo7grzXNGSPr9PvQBxdKURF6xxLPorCDrFt"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/referral/MembershipReferralBase.sol":{"keccak256":"0x6f29e73b113fce75e54a41f248621b1adaa5ac4a3b189ef0903308bfa69165ca","urls":["bzz-raw://abc7b25a74097434912f4940bfcd6cf9e312b0989279cb31a9a74d7ae6c09636","dweb:/ipfs/QmPdttVeMBDBb8SMrga6YnKz3aiGDKMqo2MofCXtag4w4E"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/referral/MembershipReferralStorage.sol":{"keccak256":"0x607aabf7ae45b7f112165c1028e0fa2d18b86c6db78f4df4bdf39dd0f20973ea","urls":["bzz-raw://4d61919ebf0ba0d3706cf2c3755b9d9920312c82bb1b83d0023f1cb09c2fc31d","dweb:/ipfs/QmSQ1G7rRMf6tAuzdU6M5ydKetaSZXdN3UV33wNjvDrqAL"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/IRoles.sol":{"keccak256":"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d","urls":["bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8","dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/RolesBase.sol":{"keccak256":"0x2ef137dec4a5390009fd931e34fdbb4a742c96b68b40f5c152cec8cf2809ed6f","urls":["bzz-raw://3cb29b4a780742a30ba3af5719f77a4a65ea55ebbdc3ccd9c93c86573f20c7df","dweb:/ipfs/QmdvPJydLCcEwCB3xk5VpET8X2GfrxC3NBUD5G6C8a9aW8"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/RolesStorage.sol":{"keccak256":"0x40f288a613e35cbc02aceb1d23f89af888f65538853f61cc1fcd25901b9bc4af","urls":["bzz-raw://396b5e157c9a29adc94edc5d234f416a44e6e7c4588b1aaa0587bb04018705e9","dweb:/ipfs/QmWDCQz555WbvZw7XxfkybE5dPfouc6rKxU5Zu1Gsuz1Zr"],"license":"Apache-2.0"},"contracts/src/utils/StringSet.sol":{"keccak256":"0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319","urls":["bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6","dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK"],"license":"Apache-2.0"},"contracts/src/utils/Validator.sol":{"keccak256":"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50","urls":["bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64","dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72"],"license":"Apache-2.0"},"contracts/src/utils/interfaces/IWETH.sol":{"keccak256":"0xd274612ab96215dcdb6e3717a63e7a0f76c7facadff93b2b23ed278f6e7b3b00","urls":["bzz-raw://12444da1f06a0fbe6d2d564d73d6d6bc58c09496af3aeea6988c3d3f9ee81c73","dweb:/ipfs/QmTkpQ6cZmRYgvLUS4mqzLvFg5nabgQjpMnVK8JENboiA3"],"license":"Apache-2.0"},"contracts/src/utils/libraries/BasisPoints.sol":{"keccak256":"0x797b0a1d3da51f4256c83b5d5c885b034df5bdff69c8dfa0fac9777cfa2f1d26","urls":["bzz-raw://52ba0c85e5de8a7d76e2e4bcbccdaffa68e29281191ae1f889430a496ce5cf1c","dweb:/ipfs/Qmd5bYypjF6gcJKKagdRpvAgV4LCs4iyn7KYdaLBWjjuHr"],"license":"Apache-2.0"},"contracts/src/utils/libraries/CurrencyTransfer.sol":{"keccak256":"0x1c6b5b33831f8c5c02c49dff5ceac3ad1a6cdb74c988ebba72c36329ca704750","urls":["bzz-raw://78122f27b67a5d3ebe95c4260dc972ab7be5c04b277cbd71a833dd74fbd23fa4","dweb:/ipfs/QmU78EApEim92KMVtW69coFPZdhvbkhmYn6dW2zwqJKPBp"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"keccak256":"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4","urls":["bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7","dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":187} \ No newline at end of file diff --git a/packages/generated/dev/abis/MembershipFacet.metadata.json b/packages/generated/dev/abis/MembershipFacet.metadata.json new file mode 100644 index 000000000..398143660 --- /dev/null +++ b/packages/generated/dev/abis/MembershipFacet.metadata.json @@ -0,0 +1,2572 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "type": "error", + "name": "AddressEmptyCode" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "AddressInsufficientBalance" + }, + { + "inputs": [], + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "ApprovalQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "BalanceQueryForZeroAddress" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__AlreadyBanned" + }, + { + "inputs": [], + "type": "error", + "name": "Banning__CannotBanSelf" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__InvalidTokenId" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__NotBanned" + }, + { + "inputs": [], + "type": "error", + "name": "Dispatcher__InvalidCaller" + }, + { + "inputs": [], + "type": "error", + "name": "Dispatcher__InvalidValue" + }, + { + "inputs": [], + "type": "error", + "name": "ERC5643__DurationZero" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC5643__InvalidTokenId" + }, + { + "inputs": [], + "type": "error", + "name": "ERC5643__NotApprovedOrOwner" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_InvalidAddress" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_NodeAlreadyVoted" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_NodeNotFound" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyCompleted" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyRegistered" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_TransactionNotRegistered" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__InvalidValue" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotAllowed" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotMember" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__ValueAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "FailedInnerCall" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__AlreadyMember" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InsufficientAllowance" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InsufficientPayment" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidAddress" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidCurrency" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidDuration" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidFeeRecipient" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidFreeAllocation" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidLimit" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidMaxSupply" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidPrice" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidPricingModule" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidReferralBps" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidReferralCode" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidReferralTime" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidTokenId" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__MaxSupplyReached" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__NotExpired" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__PriceTooLow" + }, + { + "inputs": [], + "type": "error", + "name": "MintERC2309QuantityExceedsLimit" + }, + { + "inputs": [], + "type": "error", + "name": "MintToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "MintZeroQuantity" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "OwnerQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "OwnershipNotInitializedForExtraData" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__NotPaused" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__Paused" + }, + { + "inputs": [], + "type": "error", + "name": "ReentrancyGuard__ReentrantCall" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__EntitlementAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__EntitlementDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__InvalidEntitlementAddress" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__InvalidPermission" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__PermissionAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__PermissionDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__RoleDoesNotExist" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "type": "error", + "name": "SafeERC20FailedOperation" + }, + { + "inputs": [], + "type": "error", + "name": "TransferCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "TransferFromIncorrectOwner" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "URIQueryForNonexistentToken" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "approved", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Approval", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "operator", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ApprovalForAll", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Banned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fromTokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint256", + "name": "toTokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConsecutiveTransfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "transactionId", + "type": "bytes32", + "indexed": true + }, + { + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus", + "name": "result", + "type": "uint8", + "indexed": false + } + ], + "type": "event", + "name": "EntitlementCheckResultPosted", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "currency", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "MembershipCurrencyUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "MembershipFeeRecipientUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "allocation", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "MembershipFreeAllocationUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "limit", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "MembershipLimitUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "MembershipPriceUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "MembershipTokenIssued", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "MembershipTokenRejected", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "MembershipWithdrawal", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "code", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint16", + "name": "bps", + "type": "uint16", + "indexed": false + } + ], + "type": "event", + "name": "Membership__ReferralCreated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "code", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Membership__ReferralRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "code", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint16", + "name": "bps", + "type": "uint16", + "indexed": false + }, + { + "internalType": "uint256", + "name": "startTime", + "type": "uint256", + "indexed": false + }, + { + "internalType": "uint256", + "name": "endTime", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "Membership__ReferralTimeCreated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Paused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "creator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RoleCreated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "remover", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RoleRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "updater", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RoleUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint64", + "name": "expiration", + "type": "uint64", + "indexed": false + } + ], + "type": "event", + "name": "SubscriptionUpdate", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Transfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Unbanned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Unpaused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name_", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol_", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__ERC721A_init" + }, + { + "inputs": [ + { + "internalType": "contract IEntitlementChecker", + "name": "entitlementChecker", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__EntitlementGated_init" + }, + { + "inputs": [ + { + "internalType": "struct IMembershipBase.Membership", + "name": "info", + "type": "tuple", + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxSupply", + "type": "uint256" + }, + { + "internalType": "uint64", + "name": "duration", + "type": "uint64" + }, + { + "internalType": "address", + "name": "currency", + "type": "address" + }, + { + "internalType": "address", + "name": "feeRecipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "freeAllocation", + "type": "uint256" + }, + { + "internalType": "address", + "name": "pricingModule", + "type": "address" + } + ] + }, + { + "internalType": "address", + "name": "spaceFactory", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__Membership_init" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "_getMembershipCurrency", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "_getMembershipFreeAllocation", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "_getMembershipImage", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "totalSupply", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "_getMembershipPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "_getMembershipSupplyLimit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "_getPricingModule", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "_getSpaceFactory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newAllocation", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "_setMembershipFreeAllocation" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newLimit", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "_setMembershipSupplyLimit" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newPricingModule", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "_setPricingModule" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "approve" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "expiresAt", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getMembershipCurrency", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getMembershipDuration", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getMembershipFreeAllocation", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getMembershipImage", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getMembershipLimit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getMembershipPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getMembershipPricingModule", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getMembershipRenewalPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "transactionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getRuleData", + "outputs": [ + { + "internalType": "struct IRuleEntitlement.RuleData", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "struct IRuleEntitlement.Operation[]", + "name": "operations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CombinedOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "index", + "type": "uint8" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "name": "checkOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CheckOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "name": "logicalOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.LogicalOperationType", + "name": "logOpType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "leftOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "rightOperationIndex", + "type": "uint8" + } + ] + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getSpaceFactory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "joinSpace" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "address", + "name": "referrer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "referralCode", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "joinSpaceWithReferral" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "transactionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus", + "name": "result", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "postEntitlementCheckResult" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "renewMembership" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "safeTransferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "safeTransferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setApprovalForAll" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newAllocation", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setMembershipFreeAllocation" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "newImage", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setMembershipImage" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newLimit", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setMembershipLimit" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setMembershipPrice" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pricingModule", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setMembershipPricingModule" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "transferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "withdraw" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "__Membership_init((string,string,uint256,uint256,uint64,address,address,uint256,address),address)": { + "details": "Initialization logic when facet is added to diamond" + }, + "_getMembershipPrice(uint256)": { + "details": "Makes it virtual to allow other pricing strategies" + }, + "approve(address,uint256)": { + "details": "Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator." + }, + "balanceOf(address)": { + "details": "Returns the number of tokens in `owner`'s account." + }, + "expiresAt(uint256)": { + "params": { + "tokenId": "The token id of the membership" + } + }, + "getApproved(uint256)": { + "details": "Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist." + }, + "getMembershipCurrency()": { + "returns": { + "_0": "The membership currency" + } + }, + "getMembershipDuration()": { + "returns": { + "_0": "The membership duration" + } + }, + "getMembershipFreeAllocation()": { + "returns": { + "_0": "The membership free allocation" + } + }, + "getMembershipImage()": { + "returns": { + "_0": "The membership image" + } + }, + "getMembershipLimit()": { + "returns": { + "_0": "The membership limit" + } + }, + "getMembershipPrice()": { + "returns": { + "_0": "The membership price" + } + }, + "getMembershipPricingModule()": { + "returns": { + "_0": "The membership pricing module" + } + }, + "getMembershipRenewalPrice(uint256)": { + "params": { + "tokenId": "The token id of the membership" + }, + "returns": { + "_0": "The membership renewal price" + } + }, + "getSpaceFactory()": { + "returns": { + "_0": "The space factory" + } + }, + "isApprovedForAll(address,address)": { + "details": "Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}." + }, + "joinSpace(address)": { + "params": { + "receiver": "The address of the receiver" + } + }, + "joinSpaceWithReferral(address,address,uint256)": { + "params": { + "receiver": "The address of the receiver", + "referralCode": "The referral code", + "referrer": "The address of the referrer" + } + }, + "name()": { + "details": "Returns the token collection name." + }, + "ownerOf(uint256)": { + "details": "Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist." + }, + "renewMembership(uint256)": { + "params": { + "tokenId": "The token id of the membership" + } + }, + "safeTransferFrom(address,address,uint256)": { + "details": "Equivalent to `safeTransferFrom(from, to, tokenId, '')`." + }, + "safeTransferFrom(address,address,uint256,bytes)": { + "details": "Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event." + }, + "setApprovalForAll(address,bool)": { + "details": "Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event." + }, + "setMembershipFreeAllocation(uint256)": { + "params": { + "newAllocation": "The new membership free allocation" + } + }, + "setMembershipLimit(uint256)": { + "params": { + "newLimit": "The new membership limit" + } + }, + "setMembershipPrice(uint256)": { + "params": { + "newPrice": "The new membership price" + } + }, + "setMembershipPricingModule(address)": { + "params": { + "pricingModule": "The new pricing module" + } + }, + "symbol()": { + "details": "Returns the token collection symbol." + }, + "tokenURI(uint256)": { + "details": "Returns the Uniform Resource Identifier (URI) for `tokenId` token." + }, + "totalSupply()": { + "details": "Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}." + }, + "transferFrom(address,address,uint256)": { + "details": "Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "expiresAt(uint256)": { + "notice": "Return the expiration date of a membership" + }, + "getMembershipCurrency()": { + "notice": "Get the membership currency" + }, + "getMembershipDuration()": { + "notice": "Get the membership duration" + }, + "getMembershipFreeAllocation()": { + "notice": "Get the membership free allocation" + }, + "getMembershipImage()": { + "notice": "Get the membership image" + }, + "getMembershipLimit()": { + "notice": "Get the membership limit" + }, + "getMembershipPrice()": { + "notice": "Get the membership price" + }, + "getMembershipPricingModule()": { + "notice": "Get the membership pricing module" + }, + "getMembershipRenewalPrice(uint256)": { + "notice": "Get the membership renewal price" + }, + "getSpaceFactory()": { + "notice": "Get the space factory" + }, + "joinSpace(address)": { + "notice": "Join a space" + }, + "joinSpaceWithReferral(address,address,uint256)": { + "notice": "Join a space with a referral" + }, + "renewMembership(uint256)": { + "notice": "Renew a space membership" + }, + "setMembershipFreeAllocation(uint256)": { + "notice": "Set the membership free allocation" + }, + "setMembershipLimit(uint256)": { + "notice": "Set the membership limit" + }, + "setMembershipPrice(uint256)": { + "notice": "Set the membership price" + }, + "setMembershipPricingModule(address)": { + "notice": "Set the membership pricing module" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/facets/membership/MembershipFacet.sol": "MembershipFacet" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/base/registry/facets/checker/IEntitlementChecker.sol": { + "keccak256": "0x5c9a99c94e95a0c89b3d3310e252cd98aeafe34d87ffc0058f9b001af6f28bd1", + "urls": [ + "bzz-raw://7983b17a371e76c8681756dc10abe26f8fffd35d3d6d8773c2023f06c8600ba3", + "dweb:/ipfs/QmSDkTctKCTaMGYF2LZ1N9YWwDTZD75XegpPyLrP694JFf" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol": { + "keccak256": "0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d", + "urls": [ + "bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f", + "dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol": { + "keccak256": "0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a", + "urls": [ + "bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5", + "dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol": { + "keccak256": "0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0", + "urls": [ + "bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc", + "dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/IPausable.sol": { + "keccak256": "0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261", + "urls": [ + "bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6", + "dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableBase.sol": { + "keccak256": "0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438", + "urls": [ + "bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c", + "dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableStorage.sol": { + "keccak256": "0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07", + "urls": [ + "bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b", + "dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol": { + "keccak256": "0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a", + "urls": [ + "bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b", + "dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol": { + "keccak256": "0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f", + "urls": [ + "bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c", + "dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol": { + "keccak256": "0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c", + "urls": [ + "bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6", + "dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol": { + "keccak256": "0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3", + "urls": [ + "bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714", + "dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol": { + "keccak256": "0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e", + "urls": [ + "bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7", + "dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/IERC5643.sol": { + "keccak256": "0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218", + "urls": [ + "bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f", + "dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721A.sol": { + "keccak256": "0xc8fab662d9a0c4e697c8dcaad72dd2a190331b01476649a742b6f317266ac5a1", + "urls": [ + "bzz-raw://9c84047a6d47a901f45f90f12f713432289ae6d88fea95a383900906005cf70b", + "dweb:/ipfs/QmVdLUVdtjTQn2fCG85Uv2ZAzCSfNbWYcAg5eXthunnigc" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol": { + "keccak256": "0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334", + "urls": [ + "bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa", + "dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol": { + "keccak256": "0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1", + "urls": [ + "bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c", + "dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/IERC721A.sol": { + "keccak256": "0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9", + "urls": [ + "bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e", + "dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/architect/pricing/IPricingModules.sol": { + "keccak256": "0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e", + "urls": [ + "bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716", + "dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/platform/requirements/IPlatformRequirements.sol": { + "keccak256": "0xc0b22b0caa2336e0c3f6b6813432643053785c39531d30e5851eeb613a0a7991", + "urls": [ + "bzz-raw://8a7ceb199e92f484efcc444fffd54fbabaf332c210dda0ef46d89a66f4cb47c7", + "dweb:/ipfs/QmRJVrZiZpbGsLngz4J3NVgapKXLErdLc7BPyEyTNKdijg" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/prepay/IPrepay.sol": { + "keccak256": "0x0c5c097dd77471d041cdbb84011ac789147af937d275329d857d1a4b257635e9", + "urls": [ + "bzz-raw://baca271a5a66856f3144a4bf0ed6a484b0c981539d6bf0c57ffade9e4986eb49", + "dweb:/ipfs/QmVgPWMEL5q2J5kmZQZFRadWjuVQeFLaa9K2gCHdhjLUa9" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/registry/IImplementationRegistry.sol": { + "keccak256": "0x2409b9eb86a4dc5849050d06409fd7548ac21f9bf6e7419b91dfb9226db0a3d5", + "urls": [ + "bzz-raw://613195fc78a1a496820c5934f315c586ad33edf7608022d2ae0ea44f52529e61", + "dweb:/ipfs/QmR8Gn11UNq2rKC5Qp7Prdk61oWhNg3UVc8KeyWCRfrEqV" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/wallet-link/IWalletLink.sol": { + "keccak256": "0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b", + "urls": [ + "bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13", + "dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/IEntitlement.sol": { + "keccak256": "0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca", + "urls": [ + "bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3", + "dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol": { + "keccak256": "0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf", + "urls": [ + "bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1", + "dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97" + ], + "license": "MIT" + }, + "contracts/src/spaces/facets/Entitled.sol": { + "keccak256": "0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c", + "urls": [ + "bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7", + "dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/Permissions.sol": { + "keccak256": "0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5", + "urls": [ + "bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721", + "dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/BanningBase.sol": { + "keccak256": "0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270", + "urls": [ + "bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d", + "dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/BanningStorage.sol": { + "keccak256": "0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492", + "urls": [ + "bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0", + "dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/IBanning.sol": { + "keccak256": "0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505", + "urls": [ + "bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419", + "dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/ChannelService.sol": { + "keccak256": "0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7", + "urls": [ + "bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9", + "dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/ChannelStorage.sol": { + "keccak256": "0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f", + "urls": [ + "bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7", + "dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol": { + "keccak256": "0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2", + "urls": [ + "bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5", + "dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol": { + "keccak256": "0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef", + "urls": [ + "bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07", + "dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/dispatcher/DispatcherBase.sol": { + "keccak256": "0x903020fbe095e548604af198fd56798a1cc7ebd875294f247e38b5c2c25b4b27", + "urls": [ + "bzz-raw://4b9778b31d1fb831115edf4502f6b0166dd0dc5c255bd4bf081d58a40effe675", + "dweb:/ipfs/QmZ8X9YRtXaPVhxmjY9g6dUTKJb2LxxtCYELm1buoe9UEU" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/dispatcher/DispatcherStorage.sol": { + "keccak256": "0x72ce4a1e04daeb7732b3559ef699a921d20d0056ad73b1a013ccc131957f9a5b", + "urls": [ + "bzz-raw://1053eb5b1f78f5ead722e36fc6a33100534f9bdf065bfb511677c3a5bf8e91b6", + "dweb:/ipfs/QmeKcC2E8ym4nJ7f84HgjojFDcoghDWyZyKNjQ32ca1RXA" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/dispatcher/IDispatcher.sol": { + "keccak256": "0x9542fdb04a005a1d923bd266f539db381275f2c5de9de06807eca7d043648308", + "urls": [ + "bzz-raw://64ebd4899ff63689607fa3014987b953b2ec7d2314667eedceabb868cb042c43", + "dweb:/ipfs/QmdP8qNW5g1rnFK1Czogvp6JDAvUsPoUavxiJbdci6s6zo" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/EntitlementsManagerService.sol": { + "keccak256": "0x6f40f5b41ad702ea55bf10f987b3e2b6d02ac527a66be523f06f025cead1867d", + "urls": [ + "bzz-raw://da2012c616b833c5b491735c230be707e4f9b7657b3a71d7bdf52e7c2ba128b9", + "dweb:/ipfs/Qme4864V46rozVDRWtfYqtpyzE1SzBnqYQQf3iD2rrqiPg" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol": { + "keccak256": "0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8", + "urls": [ + "bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583", + "dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/EntitlementGated.sol": { + "keccak256": "0x69b525c004a345b89f3c784df334780a2d399b3f2058183daf65862f2d095820", + "urls": [ + "bzz-raw://e927c722387563b909fd26cbd09cff0b5bc905a3c0c5c00b9c40c4d66bf19e70", + "dweb:/ipfs/Qmbk5XXjzLaZJSaSSjhpEm2pyB2GSj1cDPChYdJup9wStk" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/EntitlementGatedBase.sol": { + "keccak256": "0x0aa9887cf58dd68d0270c85e2d7610080f35410b845c2227e4bd84356b7a2cb7", + "urls": [ + "bzz-raw://6dbdbed895fc2a53bffa3dbc1cfd4c992a096f153e6bbb7aeb9894485e7fc1a6", + "dweb:/ipfs/QmZp76Gd8aL9pWbiTvLaiHv1w12yjN59PtYdMvoUCbfbH5" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/EntitlementGatedStorage.sol": { + "keccak256": "0xe997c0dd62f6ceb300729d3f56a3f25a47b40ed5946d68c5210c38941cb37eaa", + "urls": [ + "bzz-raw://63fcfd9f667538e8e9339534d2ddc6f7899e4179a54f3c6595e2598babb5bb9c", + "dweb:/ipfs/QmUfKtfgW1uskEWkhhGqTjcbCqMANQoKKfTgV2ZvdAZpvJ" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/IEntitlementGated.sol": { + "keccak256": "0x948de1018f7f78366263a40e0f8269e10941216bd03a9996edb24a6230959e74", + "urls": [ + "bzz-raw://dc985539ce639f39fd68723acca6424a78deac6cec3693c9d8e1084a487c83ec", + "dweb:/ipfs/QmQujX5rmDwhJZurp11FTiPLb7ev9swLTtdkagA8wydZiT" + ], + "license": "MIT" + }, + "contracts/src/spaces/facets/membership/IMembership.sol": { + "keccak256": "0x233066dd470121818082ba6a4c868f90feafc3be29942aae2c7a5c25543b7485", + "urls": [ + "bzz-raw://30d976a1882102493e7cee87b75ab04c662626d71aca51c9334ed2f60402bb59", + "dweb:/ipfs/QmerPfizrjueQSgG8SkSoi44fkyaqrN2ZCFTnaxnM3UqF7" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/MembershipBase.sol": { + "keccak256": "0x82b3314afcd1fe84a5261c38627c2537c09271372504af10549558c0fd608791", + "urls": [ + "bzz-raw://dadc28ee124081ea64228b8a12e0fcc93c7256535597ea9e29d58140bb599fc5", + "dweb:/ipfs/QmYNZjhBJnPf9kMt2J6pL2d746AB3EHrXVAj5Ce3ibZpBh" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/MembershipFacet.sol": { + "keccak256": "0xdc782a29cb2a6a7f136c6e4a65186112cbc9eb517dc234ac391ce7f437cc0dcf", + "urls": [ + "bzz-raw://7df5a5738f97cae15e9a1d59ca3dd7efb5ab860848e0205aae9c6e6bb066464c", + "dweb:/ipfs/QmQ61dYiibSaKrjzPvn9npQn7b83dM8tkwF48HxtaW6gwg" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/MembershipStorage.sol": { + "keccak256": "0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3", + "urls": [ + "bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee", + "dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/pricing/IMembershipPricing.sol": { + "keccak256": "0xb68faf2b90536ea53110ebb1d4456f2e9a261b5fac4515df47076da73e0cbd77", + "urls": [ + "bzz-raw://063fca54f8210be704b5d9f54efac08017266fafc9d287a6ece7866b25174448", + "dweb:/ipfs/QmbXUgKgh36CmNRA5NrtRrVcgfrKYEzZprAcjTVWhHmXBF" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/referral/IMembershipReferral.sol": { + "keccak256": "0xeb2feee4b1f3e83509bc1425c0ecd60eaf168fa7686c14dc2bd636e5a691bc6a", + "urls": [ + "bzz-raw://ec9bcb8c4106639ec9e0d37fa59385c1e853fb07f9ebedcd9f2bc1198979a807", + "dweb:/ipfs/QmcAdwQKn2jMo7grzXNGSPr9PvQBxdKURF6xxLPorCDrFt" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/referral/MembershipReferralBase.sol": { + "keccak256": "0x6f29e73b113fce75e54a41f248621b1adaa5ac4a3b189ef0903308bfa69165ca", + "urls": [ + "bzz-raw://abc7b25a74097434912f4940bfcd6cf9e312b0989279cb31a9a74d7ae6c09636", + "dweb:/ipfs/QmPdttVeMBDBb8SMrga6YnKz3aiGDKMqo2MofCXtag4w4E" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/referral/MembershipReferralStorage.sol": { + "keccak256": "0x607aabf7ae45b7f112165c1028e0fa2d18b86c6db78f4df4bdf39dd0f20973ea", + "urls": [ + "bzz-raw://4d61919ebf0ba0d3706cf2c3755b9d9920312c82bb1b83d0023f1cb09c2fc31d", + "dweb:/ipfs/QmSQ1G7rRMf6tAuzdU6M5ydKetaSZXdN3UV33wNjvDrqAL" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/IRoles.sol": { + "keccak256": "0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d", + "urls": [ + "bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8", + "dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/RolesBase.sol": { + "keccak256": "0x2ef137dec4a5390009fd931e34fdbb4a742c96b68b40f5c152cec8cf2809ed6f", + "urls": [ + "bzz-raw://3cb29b4a780742a30ba3af5719f77a4a65ea55ebbdc3ccd9c93c86573f20c7df", + "dweb:/ipfs/QmdvPJydLCcEwCB3xk5VpET8X2GfrxC3NBUD5G6C8a9aW8" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/RolesStorage.sol": { + "keccak256": "0x40f288a613e35cbc02aceb1d23f89af888f65538853f61cc1fcd25901b9bc4af", + "urls": [ + "bzz-raw://396b5e157c9a29adc94edc5d234f416a44e6e7c4588b1aaa0587bb04018705e9", + "dweb:/ipfs/QmWDCQz555WbvZw7XxfkybE5dPfouc6rKxU5Zu1Gsuz1Zr" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/StringSet.sol": { + "keccak256": "0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319", + "urls": [ + "bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6", + "dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/Validator.sol": { + "keccak256": "0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50", + "urls": [ + "bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64", + "dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/interfaces/IWETH.sol": { + "keccak256": "0xd274612ab96215dcdb6e3717a63e7a0f76c7facadff93b2b23ed278f6e7b3b00", + "urls": [ + "bzz-raw://12444da1f06a0fbe6d2d564d73d6d6bc58c09496af3aeea6988c3d3f9ee81c73", + "dweb:/ipfs/QmTkpQ6cZmRYgvLUS4mqzLvFg5nabgQjpMnVK8JENboiA3" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/libraries/BasisPoints.sol": { + "keccak256": "0x797b0a1d3da51f4256c83b5d5c885b034df5bdff69c8dfa0fac9777cfa2f1d26", + "urls": [ + "bzz-raw://52ba0c85e5de8a7d76e2e4bcbccdaffa68e29281191ae1f889430a496ce5cf1c", + "dweb:/ipfs/Qmd5bYypjF6gcJKKagdRpvAgV4LCs4iyn7KYdaLBWjjuHr" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/libraries/CurrencyTransfer.sol": { + "keccak256": "0x1c6b5b33831f8c5c02c49dff5ceac3ad1a6cdb74c988ebba72c36329ca704750", + "urls": [ + "bzz-raw://78122f27b67a5d3ebe95c4260dc972ab7be5c04b277cbd71a833dd74fbd23fa4", + "dweb:/ipfs/QmU78EApEim92KMVtW69coFPZdhvbkhmYn6dW2zwqJKPBp" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70", + "urls": [ + "bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c", + "dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { + "keccak256": "0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff", + "urls": [ + "bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d", + "dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { + "keccak256": "0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386", + "urls": [ + "bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0", + "dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4", + "urls": [ + "bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7", + "dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/MockCustomEntitlement.abi.json b/packages/generated/dev/abis/MockCustomEntitlement.abi.json new file mode 100644 index 000000000..bf21b011f --- /dev/null +++ b/packages/generated/dev/abis/MockCustomEntitlement.abi.json @@ -0,0 +1,44 @@ +[ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isEntitled", + "inputs": [ + { + "name": "user", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "setEntitled", + "inputs": [ + { + "name": "user", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "userIsEntitled", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/MockCustomEntitlement.abi.ts b/packages/generated/dev/abis/MockCustomEntitlement.abi.ts new file mode 100644 index 000000000..69711dacb --- /dev/null +++ b/packages/generated/dev/abis/MockCustomEntitlement.abi.ts @@ -0,0 +1,44 @@ +export default [ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isEntitled", + "inputs": [ + { + "name": "user", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "setEntitled", + "inputs": [ + { + "name": "user", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "userIsEntitled", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + } +] as const diff --git a/packages/generated/dev/abis/MockCustomEntitlement.bin b/packages/generated/dev/abis/MockCustomEntitlement.bin new file mode 100644 index 000000000..cfd3d50d1 --- /dev/null +++ b/packages/generated/dev/abis/MockCustomEntitlement.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b506102c1806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80633f4c4d831461003b578063ddc6e68e14610050575b600080fd5b61004e6100493660046101e0565b610077565b005b61006361005e366004610237565b6100c4565b604051901515815260200160405180910390f35b806000808460405160200161008c9190610274565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff19169115159190911790555050565b6000806000836040516020016100da9190610274565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1692915050565b634e487b7160e01b600052604160045260246000fd5b80356001600160a01b038116811461013657600080fd5b919050565b600082601f83011261014c57600080fd5b8135602067ffffffffffffffff8083111561016957610169610109565b8260051b604051601f19603f8301168101818110848211171561018e5761018e610109565b60405293845260208187018101949081019250878511156101ae57600080fd5b6020870191505b848210156101d5576101c68261011f565b835291830191908301906101b5565b979650505050505050565b600080604083850312156101f357600080fd5b823567ffffffffffffffff81111561020a57600080fd5b6102168582860161013b565b9250506020830135801515811461022c57600080fd5b809150509250929050565b60006020828403121561024957600080fd5b813567ffffffffffffffff81111561026057600080fd5b61026c8482850161013b565b949350505050565b6020808252825182820181905260009190848201906040850190845b818110156102b55783516001600160a01b031683529284019291840191600101610290565b5090969550505050505056 \ No newline at end of file diff --git a/packages/generated/dev/abis/MockCustomEntitlement.json b/packages/generated/dev/abis/MockCustomEntitlement.json new file mode 100644 index 000000000..d6662abeb --- /dev/null +++ b/packages/generated/dev/abis/MockCustomEntitlement.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isEntitled","inputs":[{"name":"user","type":"address[]","internalType":"address[]"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"setEntitled","inputs":[{"name":"user","type":"address[]","internalType":"address[]"},{"name":"userIsEntitled","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"}],"bytecode":{"object":"0x608060405234801561001057600080fd5b506102c1806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80633f4c4d831461003b578063ddc6e68e14610050575b600080fd5b61004e6100493660046101e0565b610077565b005b61006361005e366004610237565b6100c4565b604051901515815260200160405180910390f35b806000808460405160200161008c9190610274565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff19169115159190911790555050565b6000806000836040516020016100da9190610274565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1692915050565b634e487b7160e01b600052604160045260246000fd5b80356001600160a01b038116811461013657600080fd5b919050565b600082601f83011261014c57600080fd5b8135602067ffffffffffffffff8083111561016957610169610109565b8260051b604051601f19603f8301168101818110848211171561018e5761018e610109565b60405293845260208187018101949081019250878511156101ae57600080fd5b6020870191505b848210156101d5576101c68261011f565b835291830191908301906101b5565b979650505050505050565b600080604083850312156101f357600080fd5b823567ffffffffffffffff81111561020a57600080fd5b6102168582860161013b565b9250506020830135801515811461022c57600080fd5b809150509250929050565b60006020828403121561024957600080fd5b813567ffffffffffffffff81111561026057600080fd5b61026c8482850161013b565b949350505050565b6020808252825182820181905260009190848201906040850190845b818110156102b55783516001600160a01b031683529284019291840191600101610290565b5090969550505050505056","sourceMap":"159:404:322:-:0;;;254:16;;;;;;;;;;159:404;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100365760003560e01c80633f4c4d831461003b578063ddc6e68e14610050575b600080fd5b61004e6100493660046101e0565b610077565b005b61006361005e366004610237565b6100c4565b604051901515815260200160405180910390f35b806000808460405160200161008c9190610274565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff19169115159190911790555050565b6000806000836040516020016100da9190610274565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1692915050565b634e487b7160e01b600052604160045260246000fd5b80356001600160a01b038116811461013657600080fd5b919050565b600082601f83011261014c57600080fd5b8135602067ffffffffffffffff8083111561016957610169610109565b8260051b604051601f19603f8301168101818110848211171561018e5761018e610109565b60405293845260208187018101949081019250878511156101ae57600080fd5b6020870191505b848210156101d5576101c68261011f565b835291830191908301906101b5565b979650505050505050565b600080604083850312156101f357600080fd5b823567ffffffffffffffff81111561020a57600080fd5b6102168582860161013b565b9250506020830135801515811461022c57600080fd5b809150509250929050565b60006020828403121561024957600080fd5b813567ffffffffffffffff81111561026057600080fd5b61026c8482850161013b565b949350505050565b6020808252825182820181905260009190848201906040850190845b818110156102b55783516001600160a01b031683529284019291840191600101610290565b5090969550505050505056","sourceMap":"159:404:322:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;274:139;;;;;;:::i;:::-;;:::i;:::-;;417:144;;;;;;:::i;:::-;;:::i;:::-;;;2275:14:516;;2268:22;2250:41;;2238:2;2223:18;417:144:322;;;;;;;274:139;394:14;354:8;:37;384:4;373:16;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;373:16:322;;;;;;363:27;;373:16;363:27;;;;354:37;;;;;;;;;;-1:-1:-1;354:37:322;:54;;-1:-1:-1;;354:54:322;;;;;;;;;;-1:-1:-1;;274:139:322:o;417:144::-;500:4;519:8;:37;549:4;538:16;;;;;;;;:::i;:::-;;;;-1:-1:-1;;538:16:322;;;;;;;;;528:27;;538:16;528:27;;;;519:37;;;;;;;;;;-1:-1:-1;519:37:322;;;;;417:144;-1:-1:-1;;417:144:322:o;14:127:516:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:173;214:20;;-1:-1:-1;;;;;263:31:516;;253:42;;243:70;;309:1;306;299:12;243:70;146:173;;;:::o;324:914::-;378:5;431:3;424:4;416:6;412:17;408:27;398:55;;449:1;446;439:12;398:55;485:6;472:20;511:4;534:18;571:2;567;564:10;561:36;;;577:18;;:::i;:::-;623:2;620:1;616:10;655:2;649:9;718:2;714:7;709:2;705;701:11;697:25;689:6;685:38;773:6;761:10;758:22;753:2;741:10;738:18;735:46;732:72;;;784:18;;:::i;:::-;820:2;813:22;870:18;;;916:4;948:15;;;944:26;;;904:17;;;;-1:-1:-1;982:15:516;;;979:35;;;1010:1;1007;1000:12;979:35;1046:4;1038:6;1034:17;1023:28;;1060:148;1076:6;1071:3;1068:15;1060:148;;;1142:23;1161:3;1142:23;:::i;:::-;1130:36;;1186:12;;;;1093;;;;1060:148;;;1226:6;324:914;-1:-1:-1;;;;;;;324:914:516:o;1243:509::-;1333:6;1341;1394:2;1382:9;1373:7;1369:23;1365:32;1362:52;;;1410:1;1407;1400:12;1362:52;1450:9;1437:23;1483:18;1475:6;1472:30;1469:50;;;1515:1;1512;1505:12;1469:50;1538:61;1591:7;1582:6;1571:9;1567:22;1538:61;:::i;:::-;1528:71;;;1649:2;1638:9;1634:18;1621:32;1696:5;1689:13;1682:21;1675:5;1672:32;1662:60;;1718:1;1715;1708:12;1662:60;1741:5;1731:15;;;1243:509;;;;;:::o;1757:348::-;1841:6;1894:2;1882:9;1873:7;1869:23;1865:32;1862:52;;;1910:1;1907;1900:12;1862:52;1950:9;1937:23;1983:18;1975:6;1972:30;1969:50;;;2015:1;2012;2005:12;1969:50;2038:61;2091:7;2082:6;2071:9;2067:22;2038:61;:::i;:::-;2028:71;1757:348;-1:-1:-1;;;;1757:348:516:o;2302:658::-;2473:2;2525:21;;;2595:13;;2498:18;;;2617:22;;;2444:4;;2473:2;2696:15;;;;2670:2;2655:18;;;2444:4;2739:195;2753:6;2750:1;2747:13;2739:195;;;2818:13;;-1:-1:-1;;;;;2814:39:516;2802:52;;2909:15;;;;2874:12;;;;2850:1;2768:9;2739:195;;;-1:-1:-1;2951:3:516;;2302:658;-1:-1:-1;;;;;;2302:658:516:o","linkReferences":{}},"methodIdentifiers":{"isEntitled(address[])":"ddc6e68e","setEntitled(address[],bool)":"3f4c4d83"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"user\",\"type\":\"address[]\"}],\"name\":\"isEntitled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"user\",\"type\":\"address[]\"},{\"internalType\":\"bool\",\"name\":\"userIsEntitled\",\"type\":\"bool\"}],\"name\":\"setEntitled\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"isEntitled(address[])\":{\"params\":{\"user\":\"address of the user to check\"},\"returns\":{\"_0\":\"whether the user is entitled to the permission\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isEntitled(address[])\":{\"notice\":\"checks whether a user is has a given permission for a channel or a space\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/mocks/MockCustomEntitlement.sol\":\"MockCustomEntitlement\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/spaces/entitlements/ICustomEntitlement.sol\":{\"keccak256\":\"0xbb879f5fd547f6f93c898ae5d4fc5c6a738123ddac530b6a7267da9307f3e08d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://39e90fc649d84e0ccb48b067ea61d0a5564051d69b0f1dd59d13689625632e05\",\"dweb:/ipfs/QmQAB6ASqGYURyoQuPqf1SaahZtfnAEyr9me3cM3iCLT1K\"]},\"contracts/test/mocks/MockCustomEntitlement.sol\":{\"keccak256\":\"0x58f8e47c0a04408aa3704e92a04711e19a943f0c9d404cb15458e09292d31025\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f39f963d26cb282f9491cb0ab4c7708d320427dbd74953b8abf455318f3ee8b8\",\"dweb:/ipfs/QmQyi2udFz4fpBvpuUSNmgpArs9KED5aMuu9H78ZWpUULB\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address[]","name":"user","type":"address[]"}],"stateMutability":"view","type":"function","name":"isEntitled","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address[]","name":"user","type":"address[]"},{"internalType":"bool","name":"userIsEntitled","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setEntitled"}],"devdoc":{"kind":"dev","methods":{"isEntitled(address[])":{"params":{"user":"address of the user to check"},"returns":{"_0":"whether the user is entitled to the permission"}}},"version":1},"userdoc":{"kind":"user","methods":{"isEntitled(address[])":{"notice":"checks whether a user is has a given permission for a channel or a space"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/test/mocks/MockCustomEntitlement.sol":"MockCustomEntitlement"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/spaces/entitlements/ICustomEntitlement.sol":{"keccak256":"0xbb879f5fd547f6f93c898ae5d4fc5c6a738123ddac530b6a7267da9307f3e08d","urls":["bzz-raw://39e90fc649d84e0ccb48b067ea61d0a5564051d69b0f1dd59d13689625632e05","dweb:/ipfs/QmQAB6ASqGYURyoQuPqf1SaahZtfnAEyr9me3cM3iCLT1K"],"license":"Apache-2.0"},"contracts/test/mocks/MockCustomEntitlement.sol":{"keccak256":"0x58f8e47c0a04408aa3704e92a04711e19a943f0c9d404cb15458e09292d31025","urls":["bzz-raw://f39f963d26cb282f9491cb0ab4c7708d320427dbd74953b8abf455318f3ee8b8","dweb:/ipfs/QmQyi2udFz4fpBvpuUSNmgpArs9KED5aMuu9H78ZWpUULB"],"license":"Apache-2.0"}},"version":1},"id":322} \ No newline at end of file diff --git a/packages/generated/dev/abis/MockCustomEntitlement.metadata.json b/packages/generated/dev/abis/MockCustomEntitlement.metadata.json new file mode 100644 index 000000000..e0b7cbbc0 --- /dev/null +++ b/packages/generated/dev/abis/MockCustomEntitlement.metadata.json @@ -0,0 +1,118 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "user", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isEntitled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "user", + "type": "address[]" + }, + { + "internalType": "bool", + "name": "userIsEntitled", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setEntitled" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "isEntitled(address[])": { + "params": { + "user": "address of the user to check" + }, + "returns": { + "_0": "whether the user is entitled to the permission" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "isEntitled(address[])": { + "notice": "checks whether a user is has a given permission for a channel or a space" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/test/mocks/MockCustomEntitlement.sol": "MockCustomEntitlement" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/spaces/entitlements/ICustomEntitlement.sol": { + "keccak256": "0xbb879f5fd547f6f93c898ae5d4fc5c6a738123ddac530b6a7267da9307f3e08d", + "urls": [ + "bzz-raw://39e90fc649d84e0ccb48b067ea61d0a5564051d69b0f1dd59d13689625632e05", + "dweb:/ipfs/QmQAB6ASqGYURyoQuPqf1SaahZtfnAEyr9me3cM3iCLT1K" + ], + "license": "Apache-2.0" + }, + "contracts/test/mocks/MockCustomEntitlement.sol": { + "keccak256": "0x58f8e47c0a04408aa3704e92a04711e19a943f0c9d404cb15458e09292d31025", + "urls": [ + "bzz-raw://f39f963d26cb282f9491cb0ab4c7708d320427dbd74953b8abf455318f3ee8b8", + "dweb:/ipfs/QmQyi2udFz4fpBvpuUSNmgpArs9KED5aMuu9H78ZWpUULB" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/MockERC721A.abi.json b/packages/generated/dev/abis/MockERC721A.abi.json new file mode 100644 index 000000000..bd984ceb2 --- /dev/null +++ b/packages/generated/dev/abis/MockERC721A.abi.json @@ -0,0 +1,549 @@ +[ + { + "type": "function", + "name": "__ERC721A_init", + "inputs": [ + { + "name": "name_", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol_", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "burn", + "inputs": [ + { + "name": "token", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getApproved", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isApprovedForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "mint", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "mintTo", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ownerOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "setApprovalForAll", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenURI", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/MockERC721A.abi.ts b/packages/generated/dev/abis/MockERC721A.abi.ts new file mode 100644 index 000000000..cd3920491 --- /dev/null +++ b/packages/generated/dev/abis/MockERC721A.abi.ts @@ -0,0 +1,549 @@ +export default [ + { + "type": "function", + "name": "__ERC721A_init", + "inputs": [ + { + "name": "name_", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol_", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "burn", + "inputs": [ + { + "name": "token", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getApproved", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isApprovedForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "mint", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "mintTo", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ownerOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "setApprovalForAll", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenURI", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/MockERC721A.bin b/packages/generated/dev/abis/MockERC721A.bin new file mode 100644 index 000000000..fec7a38a1 --- /dev/null +++ b/packages/generated/dev/abis/MockERC721A.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b611516806100d36000396000f3fe6080604052600436106100fe5760003560e01c80636352211e11610095578063a22cb46511610064578063a22cb46514610279578063b88d4fde14610299578063c87b56dd146102ac578063d2f01f19146102cc578063e985e9c5146102ec57600080fd5b80636352211e1461020457806370a0823114610224578063755edd171461024457806395d89b411461026457600080fd5b806323b872dd116100d157806323b872dd1461019e57806340c10f19146101b157806342842e0e146101d157806342966c68146101e457600080fd5b806306fdde0314610103578063081812fc1461012e578063095ea7b31461016657806318160ddd1461017b575b600080fd5b34801561010f57600080fd5b5061011861031c565b6040516101259190611064565b60405180910390f35b34801561013a57600080fd5b5061014e610149366004611077565b6103b7565b6040516001600160a01b039091168152602001610125565b6101796101743660046110a7565b6103c8565b005b34801561018757600080fd5b506101906103d8565b604051908152602001610125565b6101796101ac3660046110d1565b6103e7565b3480156101bd57600080fd5b506101796101cc3660046110a7565b6105cc565b6101796101df3660046110d1565b6105d6565b3480156101f057600080fd5b506101796101ff366004611077565b6105f6565b34801561021057600080fd5b5061014e61021f366004611077565b610602565b34801561023057600080fd5b5061019061023f36600461110d565b61060d565b34801561025057600080fd5b5061019061025f36600461110d565b610618565b34801561027057600080fd5b50610118610634565b34801561028557600080fd5b50610179610294366004611128565b61064c565b6101796102a73660046111f0565b6106c9565b3480156102b857600080fd5b506101186102c7366004611077565b610713565b3480156102d857600080fd5b506101796102e736600461128c565b6107a4565b3480156102f857600080fd5b5061030c6103073660046112f0565b6107f8565b6040519015158152602001610125565b6060610326610804565b600201805461033490611323565b80601f016020809104026020016040519081016040528092919081815260200182805461036090611323565b80156103ad5780601f10610382576101008083540402835291602001916103ad565b820191906000526020600020905b81548152906001019060200180831161039057829003601f168201915b5050505050905090565b60006103c282610828565b92915050565b6103d482826001610875565b5050565b60006103e261092a565b905090565b60006103f282610949565b9050836001600160a01b0316816001600160a01b0316146104255760405162a1148160e81b815260040160405180910390fd5b600080610431846109e4565b9150915061045681876104413390565b6001600160a01b039081169116811491141790565b6104815761046486336107f8565b61048157604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166104a857604051633a954ecd60e21b815260040160405180910390fd5b80156104b357600082555b6104bb610804565b6001600160a01b03871660009081526005919091016020526040902080546000190190556104e7610804565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b1761051e610804565b60008681526004919091016020526040812091909155600160e11b84169003610594576001840161054d610804565b6000828152600491909101602052604081205490036105925761056e610804565b548114610592578361057e610804565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03166000805160206114f683398151915260405160405180910390a45b505050505050565b6103d48282610a0c565b6105f1838383604051806020016040528060008152506106c9565b505050565b6105ff81610b23565b50565b60006103c282610949565b60006103c282610b2e565b6000610622610b97565b905061062f826001610a0c565b919050565b606061063e610804565b600301805461033490611323565b80610655610804565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6106d48484846103e7565b6001600160a01b0383163b1561070d576106f084848484610ba7565b61070d576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061071e82610c92565b61073b57604051630a14c4b560e41b815260040160405180910390fd5b600061075260408051602081019091526000815290565b90508051600003610772576040518060200160405280600081525061079d565b8061077c84610cce565b60405160200161078d929190611357565b6040516020818303038152906040525b9392505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166107ee57604051630ef4733760e31b815260040160405180910390fd5b6103d48282610d12565b600061079d8383610d86565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b600061083382610c92565b610850576040516333d1c03960e21b815260040160405180910390fd5b610858610804565b60009283526006016020525060409020546001600160a01b031690565b600061088083610602565b905081156108bf57336001600160a01b038216146108bf576108a28133610d86565b6108bf576040516367d9dca160e11b815260040160405180910390fd5b836108c8610804565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b600080610935610804565b60010154610941610804565b540303919050565b600080610954610804565b60008481526004820160205260408120549350909150600160e01b831690036109ca57816000036109c457805483106109a057604051636f96cda160e11b815260040160405180910390fd5b5b6000199092016000818152600484016020526040902054909290915081156109a1575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b60008060006109f1610804565b60009485526006016020525050604090912080549092909150565b6000610a16610804565b5490506000829003610a3b5760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202610a4f610804565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717610a8a610804565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083906000805160206114f68339815191528180a4600183015b818114610af057808360006000805160206114f6833981519152600080a4600101610aca565b5081600003610b1157604051622e076360e81b815260040160405180910390fd5b80610b1a610804565b55506105f19050565b6105ff816000610dc3565b60006001600160a01b038216610b57576040516323d3ad8160e21b815260040160405180910390fd5b67ffffffffffffffff610b68610804565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6000610ba1610804565b54919050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290610bdc903390899088908890600401611386565b6020604051808303816000875af1925050508015610c17575060408051601f3d908101601f19168201909252610c14918101906113c3565b60015b610c75573d808015610c45576040519150601f19603f3d011682016040523d82523d6000602084013e610c4a565b606091505b508051600003610c6d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000610c9c610804565b54821080156103c25750600160e01b610cb3610804565b60008481526004919091016020526040902054161592915050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480610ce85750819003601f19909101908152919050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff16610d5c57604051630ef4733760e31b815260040160405180910390fd5b610d6c6380ac58cd60e01b610f04565b610d7c635b5e139f60e01b610f04565b6103d48282610fe2565b6000610d90610804565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b6000610dce83610949565b905080600080610ddd866109e4565b915091508415610e1d57610df2818433610441565b610e1d57610e008333610d86565b610e1d57604051632ce44b5f60e11b815260040160405180910390fd5b8015610e2857600082555b6000610e32610804565b6001600160a01b0385166000818152600583016020526040902080546fffffffffffffffffffffffffffffffff0190559091504260a01b17600360e01b176000888152600483016020526040812091909155600160e11b86169003610eca576001870160008181526004830160205260408120549003610ec85781548114610ec857600081815260048301602052604090208690555b505b60405187906000906001600160a01b038716906000805160206114f6833981519152908390a4600190810180549091019055505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610f91576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610faa565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6000610fec610804565b905060028101610ffc8482611435565b506003810161100b8382611435565b50600090555050565b60005b8381101561102f578181015183820152602001611017565b50506000910152565b60008151808452611050816020860160208601611014565b601f01601f19169290920160200192915050565b60208152600061079d6020830184611038565b60006020828403121561108957600080fd5b5035919050565b80356001600160a01b038116811461062f57600080fd5b600080604083850312156110ba57600080fd5b6110c383611090565b946020939093013593505050565b6000806000606084860312156110e657600080fd5b6110ef84611090565b92506110fd60208501611090565b9150604084013590509250925092565b60006020828403121561111f57600080fd5b61079d82611090565b6000806040838503121561113b57600080fd5b61114483611090565b91506020830135801515811461115957600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561119557611195611164565b604051601f8501601f19908116603f011681019082821181831017156111bd576111bd611164565b816040528093508581528686860111156111d657600080fd5b858560208301376000602087830101525050509392505050565b6000806000806080858703121561120657600080fd5b61120f85611090565b935061121d60208601611090565b925060408501359150606085013567ffffffffffffffff81111561124057600080fd5b8501601f8101871361125157600080fd5b6112608782356020840161117a565b91505092959194509250565b600082601f83011261127d57600080fd5b61079d8383356020850161117a565b6000806040838503121561129f57600080fd5b823567ffffffffffffffff808211156112b757600080fd5b6112c38683870161126c565b935060208501359150808211156112d957600080fd5b506112e68582860161126c565b9150509250929050565b6000806040838503121561130357600080fd5b61130c83611090565b915061131a60208401611090565b90509250929050565b600181811c9082168061133757607f821691505b6020821081036109c457634e487b7160e01b600052602260045260246000fd5b60008351611369818460208801611014565b83519083019061137d818360208801611014565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906113b990830184611038565b9695505050505050565b6000602082840312156113d557600080fd5b81516001600160e01b03198116811461079d57600080fd5b601f8211156105f1576000816000526020600020601f850160051c810160208610156114165750805b601f850160051c820191505b818110156105c457828155600101611422565b815167ffffffffffffffff81111561144f5761144f611164565b6114638161145d8454611323565b846113ed565b602080601f83116001811461149857600084156114805750858301515b600019600386901b1c1916600185901b1785556105c4565b600085815260208120601f198616915b828110156114c7578886015182559484019460019091019084016114a8565b50858210156114e55787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef \ No newline at end of file diff --git a/packages/generated/dev/abis/MockERC721A.json b/packages/generated/dev/abis/MockERC721A.json new file mode 100644 index 000000000..590b2bf7b --- /dev/null +++ b/packages/generated/dev/abis/MockERC721A.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__ERC721A_init","inputs":[{"name":"name_","type":"string","internalType":"string"},{"name":"symbol_","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"approve","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"balanceOf","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"burn","inputs":[{"name":"token","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getApproved","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"isApprovedForAll","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"mint","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"mintTo","inputs":[{"name":"to","type":"address","internalType":"address"}],"outputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"ownerOf","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"setApprovalForAll","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"tokenURI","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"ConsecutiveTransfer","inputs":[{"name":"fromTokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"toTokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"ApprovalCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"ApprovalQueryForNonexistentToken","inputs":[]},{"type":"error","name":"BalanceQueryForZeroAddress","inputs":[]},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"MintERC2309QuantityExceedsLimit","inputs":[]},{"type":"error","name":"MintToZeroAddress","inputs":[]},{"type":"error","name":"MintZeroQuantity","inputs":[]},{"type":"error","name":"OwnerQueryForNonexistentToken","inputs":[]},{"type":"error","name":"OwnershipNotInitializedForExtraData","inputs":[]},{"type":"error","name":"TransferCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"TransferFromIncorrectOwner","inputs":[]},{"type":"error","name":"TransferToNonERC721ReceiverImplementer","inputs":[]},{"type":"error","name":"TransferToZeroAddress","inputs":[]},{"type":"error","name":"URIQueryForNonexistentToken","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b611516806100d36000396000f3fe6080604052600436106100fe5760003560e01c80636352211e11610095578063a22cb46511610064578063a22cb46514610279578063b88d4fde14610299578063c87b56dd146102ac578063d2f01f19146102cc578063e985e9c5146102ec57600080fd5b80636352211e1461020457806370a0823114610224578063755edd171461024457806395d89b411461026457600080fd5b806323b872dd116100d157806323b872dd1461019e57806340c10f19146101b157806342842e0e146101d157806342966c68146101e457600080fd5b806306fdde0314610103578063081812fc1461012e578063095ea7b31461016657806318160ddd1461017b575b600080fd5b34801561010f57600080fd5b5061011861031c565b6040516101259190611064565b60405180910390f35b34801561013a57600080fd5b5061014e610149366004611077565b6103b7565b6040516001600160a01b039091168152602001610125565b6101796101743660046110a7565b6103c8565b005b34801561018757600080fd5b506101906103d8565b604051908152602001610125565b6101796101ac3660046110d1565b6103e7565b3480156101bd57600080fd5b506101796101cc3660046110a7565b6105cc565b6101796101df3660046110d1565b6105d6565b3480156101f057600080fd5b506101796101ff366004611077565b6105f6565b34801561021057600080fd5b5061014e61021f366004611077565b610602565b34801561023057600080fd5b5061019061023f36600461110d565b61060d565b34801561025057600080fd5b5061019061025f36600461110d565b610618565b34801561027057600080fd5b50610118610634565b34801561028557600080fd5b50610179610294366004611128565b61064c565b6101796102a73660046111f0565b6106c9565b3480156102b857600080fd5b506101186102c7366004611077565b610713565b3480156102d857600080fd5b506101796102e736600461128c565b6107a4565b3480156102f857600080fd5b5061030c6103073660046112f0565b6107f8565b6040519015158152602001610125565b6060610326610804565b600201805461033490611323565b80601f016020809104026020016040519081016040528092919081815260200182805461036090611323565b80156103ad5780601f10610382576101008083540402835291602001916103ad565b820191906000526020600020905b81548152906001019060200180831161039057829003601f168201915b5050505050905090565b60006103c282610828565b92915050565b6103d482826001610875565b5050565b60006103e261092a565b905090565b60006103f282610949565b9050836001600160a01b0316816001600160a01b0316146104255760405162a1148160e81b815260040160405180910390fd5b600080610431846109e4565b9150915061045681876104413390565b6001600160a01b039081169116811491141790565b6104815761046486336107f8565b61048157604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166104a857604051633a954ecd60e21b815260040160405180910390fd5b80156104b357600082555b6104bb610804565b6001600160a01b03871660009081526005919091016020526040902080546000190190556104e7610804565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b1761051e610804565b60008681526004919091016020526040812091909155600160e11b84169003610594576001840161054d610804565b6000828152600491909101602052604081205490036105925761056e610804565b548114610592578361057e610804565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03166000805160206114f683398151915260405160405180910390a45b505050505050565b6103d48282610a0c565b6105f1838383604051806020016040528060008152506106c9565b505050565b6105ff81610b23565b50565b60006103c282610949565b60006103c282610b2e565b6000610622610b97565b905061062f826001610a0c565b919050565b606061063e610804565b600301805461033490611323565b80610655610804565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6106d48484846103e7565b6001600160a01b0383163b1561070d576106f084848484610ba7565b61070d576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061071e82610c92565b61073b57604051630a14c4b560e41b815260040160405180910390fd5b600061075260408051602081019091526000815290565b90508051600003610772576040518060200160405280600081525061079d565b8061077c84610cce565b60405160200161078d929190611357565b6040516020818303038152906040525b9392505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166107ee57604051630ef4733760e31b815260040160405180910390fd5b6103d48282610d12565b600061079d8383610d86565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b600061083382610c92565b610850576040516333d1c03960e21b815260040160405180910390fd5b610858610804565b60009283526006016020525060409020546001600160a01b031690565b600061088083610602565b905081156108bf57336001600160a01b038216146108bf576108a28133610d86565b6108bf576040516367d9dca160e11b815260040160405180910390fd5b836108c8610804565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b600080610935610804565b60010154610941610804565b540303919050565b600080610954610804565b60008481526004820160205260408120549350909150600160e01b831690036109ca57816000036109c457805483106109a057604051636f96cda160e11b815260040160405180910390fd5b5b6000199092016000818152600484016020526040902054909290915081156109a1575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b60008060006109f1610804565b60009485526006016020525050604090912080549092909150565b6000610a16610804565b5490506000829003610a3b5760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202610a4f610804565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717610a8a610804565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083906000805160206114f68339815191528180a4600183015b818114610af057808360006000805160206114f6833981519152600080a4600101610aca565b5081600003610b1157604051622e076360e81b815260040160405180910390fd5b80610b1a610804565b55506105f19050565b6105ff816000610dc3565b60006001600160a01b038216610b57576040516323d3ad8160e21b815260040160405180910390fd5b67ffffffffffffffff610b68610804565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6000610ba1610804565b54919050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290610bdc903390899088908890600401611386565b6020604051808303816000875af1925050508015610c17575060408051601f3d908101601f19168201909252610c14918101906113c3565b60015b610c75573d808015610c45576040519150601f19603f3d011682016040523d82523d6000602084013e610c4a565b606091505b508051600003610c6d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000610c9c610804565b54821080156103c25750600160e01b610cb3610804565b60008481526004919091016020526040902054161592915050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480610ce85750819003601f19909101908152919050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff16610d5c57604051630ef4733760e31b815260040160405180910390fd5b610d6c6380ac58cd60e01b610f04565b610d7c635b5e139f60e01b610f04565b6103d48282610fe2565b6000610d90610804565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b6000610dce83610949565b905080600080610ddd866109e4565b915091508415610e1d57610df2818433610441565b610e1d57610e008333610d86565b610e1d57604051632ce44b5f60e11b815260040160405180910390fd5b8015610e2857600082555b6000610e32610804565b6001600160a01b0385166000818152600583016020526040902080546fffffffffffffffffffffffffffffffff0190559091504260a01b17600360e01b176000888152600483016020526040812091909155600160e11b86169003610eca576001870160008181526004830160205260408120549003610ec85781548114610ec857600081815260048301602052604090208690555b505b60405187906000906001600160a01b038716906000805160206114f6833981519152908390a4600190810180549091019055505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610f91576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610faa565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6000610fec610804565b905060028101610ffc8482611435565b506003810161100b8382611435565b50600090555050565b60005b8381101561102f578181015183820152602001611017565b50506000910152565b60008151808452611050816020860160208601611014565b601f01601f19169290920160200192915050565b60208152600061079d6020830184611038565b60006020828403121561108957600080fd5b5035919050565b80356001600160a01b038116811461062f57600080fd5b600080604083850312156110ba57600080fd5b6110c383611090565b946020939093013593505050565b6000806000606084860312156110e657600080fd5b6110ef84611090565b92506110fd60208501611090565b9150604084013590509250925092565b60006020828403121561111f57600080fd5b61079d82611090565b6000806040838503121561113b57600080fd5b61114483611090565b91506020830135801515811461115957600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561119557611195611164565b604051601f8501601f19908116603f011681019082821181831017156111bd576111bd611164565b816040528093508581528686860111156111d657600080fd5b858560208301376000602087830101525050509392505050565b6000806000806080858703121561120657600080fd5b61120f85611090565b935061121d60208601611090565b925060408501359150606085013567ffffffffffffffff81111561124057600080fd5b8501601f8101871361125157600080fd5b6112608782356020840161117a565b91505092959194509250565b600082601f83011261127d57600080fd5b61079d8383356020850161117a565b6000806040838503121561129f57600080fd5b823567ffffffffffffffff808211156112b757600080fd5b6112c38683870161126c565b935060208501359150808211156112d957600080fd5b506112e68582860161126c565b9150509250929050565b6000806040838503121561130357600080fd5b61130c83611090565b915061131a60208401611090565b90509250929050565b600181811c9082168061133757607f821691505b6020821081036109c457634e487b7160e01b600052602260045260246000fd5b60008351611369818460208801611014565b83519083019061137d818360208801611014565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906113b990830184611038565b9695505050505050565b6000602082840312156113d557600080fd5b81516001600160e01b03198116811461079d57600080fd5b601f8211156105f1576000816000526020600020601f850160051c810160208610156114165750805b601f850160051c820191505b818110156105c457828155600101611422565b815167ffffffffffffffff81111561144f5761144f611164565b6114638161145d8454611323565b846113ed565b602080601f83116001811461149857600084156114805750858301515b600019600386901b1c1916600185901b1785556105c4565b600085815260208120601f198616915b828110156114c7578886015182559484019460019091019084016114a8565b50858210156114e55787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","sourceMap":"188:302:329:-:0;;;;;;;;;;;;-1:-1:-1;385:22:71;:20;:22::i;:::-;188:302:329;;1653:314:85;303:66:86;1779:14:85;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:85;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:85;1898:16;1886:28;;;;;1927:29;;158:42:516;;;1927:29:85;;146:2:516;131:18;1927:29:85;;;;;;;1844:119;1694:273;1653:314::o;14:192:516:-;188:302:329;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106100fe5760003560e01c80636352211e11610095578063a22cb46511610064578063a22cb46514610279578063b88d4fde14610299578063c87b56dd146102ac578063d2f01f19146102cc578063e985e9c5146102ec57600080fd5b80636352211e1461020457806370a0823114610224578063755edd171461024457806395d89b411461026457600080fd5b806323b872dd116100d157806323b872dd1461019e57806340c10f19146101b157806342842e0e146101d157806342966c68146101e457600080fd5b806306fdde0314610103578063081812fc1461012e578063095ea7b31461016657806318160ddd1461017b575b600080fd5b34801561010f57600080fd5b5061011861031c565b6040516101259190611064565b60405180910390f35b34801561013a57600080fd5b5061014e610149366004611077565b6103b7565b6040516001600160a01b039091168152602001610125565b6101796101743660046110a7565b6103c8565b005b34801561018757600080fd5b506101906103d8565b604051908152602001610125565b6101796101ac3660046110d1565b6103e7565b3480156101bd57600080fd5b506101796101cc3660046110a7565b6105cc565b6101796101df3660046110d1565b6105d6565b3480156101f057600080fd5b506101796101ff366004611077565b6105f6565b34801561021057600080fd5b5061014e61021f366004611077565b610602565b34801561023057600080fd5b5061019061023f36600461110d565b61060d565b34801561025057600080fd5b5061019061025f36600461110d565b610618565b34801561027057600080fd5b50610118610634565b34801561028557600080fd5b50610179610294366004611128565b61064c565b6101796102a73660046111f0565b6106c9565b3480156102b857600080fd5b506101186102c7366004611077565b610713565b3480156102d857600080fd5b506101796102e736600461128c565b6107a4565b3480156102f857600080fd5b5061030c6103073660046112f0565b6107f8565b6040519015158152602001610125565b6060610326610804565b600201805461033490611323565b80601f016020809104026020016040519081016040528092919081815260200182805461036090611323565b80156103ad5780601f10610382576101008083540402835291602001916103ad565b820191906000526020600020905b81548152906001019060200180831161039057829003601f168201915b5050505050905090565b60006103c282610828565b92915050565b6103d482826001610875565b5050565b60006103e261092a565b905090565b60006103f282610949565b9050836001600160a01b0316816001600160a01b0316146104255760405162a1148160e81b815260040160405180910390fd5b600080610431846109e4565b9150915061045681876104413390565b6001600160a01b039081169116811491141790565b6104815761046486336107f8565b61048157604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166104a857604051633a954ecd60e21b815260040160405180910390fd5b80156104b357600082555b6104bb610804565b6001600160a01b03871660009081526005919091016020526040902080546000190190556104e7610804565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b1761051e610804565b60008681526004919091016020526040812091909155600160e11b84169003610594576001840161054d610804565b6000828152600491909101602052604081205490036105925761056e610804565b548114610592578361057e610804565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03166000805160206114f683398151915260405160405180910390a45b505050505050565b6103d48282610a0c565b6105f1838383604051806020016040528060008152506106c9565b505050565b6105ff81610b23565b50565b60006103c282610949565b60006103c282610b2e565b6000610622610b97565b905061062f826001610a0c565b919050565b606061063e610804565b600301805461033490611323565b80610655610804565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6106d48484846103e7565b6001600160a01b0383163b1561070d576106f084848484610ba7565b61070d576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061071e82610c92565b61073b57604051630a14c4b560e41b815260040160405180910390fd5b600061075260408051602081019091526000815290565b90508051600003610772576040518060200160405280600081525061079d565b8061077c84610cce565b60405160200161078d929190611357565b6040516020818303038152906040525b9392505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166107ee57604051630ef4733760e31b815260040160405180910390fd5b6103d48282610d12565b600061079d8383610d86565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b600061083382610c92565b610850576040516333d1c03960e21b815260040160405180910390fd5b610858610804565b60009283526006016020525060409020546001600160a01b031690565b600061088083610602565b905081156108bf57336001600160a01b038216146108bf576108a28133610d86565b6108bf576040516367d9dca160e11b815260040160405180910390fd5b836108c8610804565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b600080610935610804565b60010154610941610804565b540303919050565b600080610954610804565b60008481526004820160205260408120549350909150600160e01b831690036109ca57816000036109c457805483106109a057604051636f96cda160e11b815260040160405180910390fd5b5b6000199092016000818152600484016020526040902054909290915081156109a1575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b60008060006109f1610804565b60009485526006016020525050604090912080549092909150565b6000610a16610804565b5490506000829003610a3b5760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202610a4f610804565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717610a8a610804565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083906000805160206114f68339815191528180a4600183015b818114610af057808360006000805160206114f6833981519152600080a4600101610aca565b5081600003610b1157604051622e076360e81b815260040160405180910390fd5b80610b1a610804565b55506105f19050565b6105ff816000610dc3565b60006001600160a01b038216610b57576040516323d3ad8160e21b815260040160405180910390fd5b67ffffffffffffffff610b68610804565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6000610ba1610804565b54919050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290610bdc903390899088908890600401611386565b6020604051808303816000875af1925050508015610c17575060408051601f3d908101601f19168201909252610c14918101906113c3565b60015b610c75573d808015610c45576040519150601f19603f3d011682016040523d82523d6000602084013e610c4a565b606091505b508051600003610c6d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000610c9c610804565b54821080156103c25750600160e01b610cb3610804565b60008481526004919091016020526040902054161592915050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480610ce85750819003601f19909101908152919050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff16610d5c57604051630ef4733760e31b815260040160405180910390fd5b610d6c6380ac58cd60e01b610f04565b610d7c635b5e139f60e01b610f04565b6103d48282610fe2565b6000610d90610804565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b6000610dce83610949565b905080600080610ddd866109e4565b915091508415610e1d57610df2818433610441565b610e1d57610e008333610d86565b610e1d57604051632ce44b5f60e11b815260040160405180910390fd5b8015610e2857600082555b6000610e32610804565b6001600160a01b0385166000818152600583016020526040902080546fffffffffffffffffffffffffffffffff0190559091504260a01b17600360e01b176000888152600483016020526040812091909155600160e11b86169003610eca576001870160008181526004830160205260408120549003610ec85781548114610ec857600081815260048301602052604090208690555b505b60405187906000906001600160a01b038716906000805160206114f6833981519152908390a4600190810180549091019055505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610f91576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610faa565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6000610fec610804565b905060028101610ffc8482611435565b506003810161100b8382611435565b50600090555050565b60005b8381101561102f578181015183820152602001611017565b50506000910152565b60008151808452611050816020860160208601611014565b601f01601f19169290920160200192915050565b60208152600061079d6020830184611038565b60006020828403121561108957600080fd5b5035919050565b80356001600160a01b038116811461062f57600080fd5b600080604083850312156110ba57600080fd5b6110c383611090565b946020939093013593505050565b6000806000606084860312156110e657600080fd5b6110ef84611090565b92506110fd60208501611090565b9150604084013590509250925092565b60006020828403121561111f57600080fd5b61079d82611090565b6000806040838503121561113b57600080fd5b61114483611090565b91506020830135801515811461115957600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561119557611195611164565b604051601f8501601f19908116603f011681019082821181831017156111bd576111bd611164565b816040528093508581528686860111156111d657600080fd5b858560208301376000602087830101525050509392505050565b6000806000806080858703121561120657600080fd5b61120f85611090565b935061121d60208601611090565b925060408501359150606085013567ffffffffffffffff81111561124057600080fd5b8501601f8101871361125157600080fd5b6112608782356020840161117a565b91505092959194509250565b600082601f83011261127d57600080fd5b61079d8383356020850161117a565b6000806040838503121561129f57600080fd5b823567ffffffffffffffff808211156112b757600080fd5b6112c38683870161126c565b935060208501359150808211156112d957600080fd5b506112e68582860161126c565b9150509250929050565b6000806040838503121561130357600080fd5b61130c83611090565b915061131a60208401611090565b90509250929050565b600181811c9082168061133757607f821691505b6020821081036109c457634e487b7160e01b600052602260045260246000fd5b60008351611369818460208801611014565b83519083019061137d818360208801611014565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906113b990830184611038565b9695505050505050565b6000602082840312156113d557600080fd5b81516001600160e01b03198116811461079d57600080fd5b601f8211156105f1576000816000526020600020601f850160051c810160208610156114165750805b601f850160051c820191505b818110156105c457828155600101611422565b815167ffffffffffffffff81111561144f5761144f611164565b6114638161145d8454611323565b846113ed565b602080601f83116001811461149857600084156114805750858301515b600019600386901b1c1916600185901b1785556105c4565b600085815260208120601f198616915b828110156114c7578886015182559484019460019091019084016114a8565b50858210156114e55787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","sourceMap":"188:302:329:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2044:116:128;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3522:132;;;;;;;;;;-1:-1:-1;3522:132:128;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1119:32:516;;;1101:51;;1089:2;1074:18;3522:132:128;955:203:516;3260:128:128;;;;;;:::i;:::-;;:::i;:::-;;1527:93;;;;;;;;;;;;;:::i;:::-;;;1746:25:516;;;1734:2;1719:18;1527:93:128;1600:177:516;4917:2680:128;;;;;;:::i;:::-;;:::i;344:79:329:-;;;;;;;;;;-1:-1:-1;344:79:329;;;;;:::i;:::-;;:::i;7680:167:128:-;;;;;;:::i;:::-;;:::i;427:61:329:-;;;;;;;;;;-1:-1:-1;427:61:329;;;;;:::i;:::-;;:::i;2891:152:128:-;;;;;;;;;;-1:-1:-1;2891:152:128;;;;;:::i;:::-;;:::i;1697:107::-;;;;;;;;;;-1:-1:-1;1697:107:128;;;;;:::i;:::-;;:::i;224:116:329:-;;;;;;;;;;-1:-1:-1;224:116:329;;;;;:::i;:::-;;:::i;2223:120:128:-;;;;;;;;;;;;;:::i;3957:269::-;;;;;;;;;;-1:-1:-1;3957:269:128;;;;;:::i;:::-;;:::i;8396:348::-;;;;;;:::i;:::-;;:::i;2436:329::-;;;;;;;;;;-1:-1:-1;2436:329:128;;;;;:::i;:::-;;:::i;876:157::-;;;;;;;;;;-1:-1:-1;876:157:128;;;;;:::i;:::-;;:::i;4364:167::-;;;;;;;;;;-1:-1:-1;4364:167:128;;;;;:::i;:::-;;:::i;:::-;;;5301:14:516;;5294:22;5276:41;;5264:2;5249:18;4364:167:128;5136:187:516;2044:116:128;2098:13;2126:23;:21;:23::i;:::-;:29;;2119:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2044:116;:::o;3522:132::-;3606:7;3628:21;3641:7;3628:12;:21::i;:::-;3621:28;3522:132;-1:-1:-1;;3522:132:128:o;3260:128::-;3356:27;3365:2;3369:7;3378:4;3356:8;:27::i;:::-;3260:128;;:::o;1527:93::-;1579:7;1601:14;:12;:14::i;:::-;1594:21;;1527:93;:::o;4917:2680::-;5036:27;5066;5085:7;5066:18;:27::i;:::-;5036:57;;5145:4;-1:-1:-1;;;;;5104:45:128;5120:19;-1:-1:-1;;;;;5104:45:128;;5100:92;;5164:28;;-1:-1:-1;;;5164:28:128;;;;;;;;;;;5100:92;5207:27;5242:23;5274:35;5301:7;5274:26;:35::i;:::-;5199:110;;;;5398:68;5423:15;5440:4;5446:19;29371:10:129;;29289:97;5446:19:128;-1:-1:-1;;;;;11877:32:129;;;11735:28;;11992:20;;12014:30;;11989:56;;11468:587;5398:68:128;5393:181;;5479:43;5496:4;29371:10:129;4364:167:128;:::i;5479:43::-;5474:100;;5539:35;;-1:-1:-1;;;5539:35:128;;;;;;;;;;;5474:100;-1:-1:-1;;;;;5585:16:128;;5581:52;;5610:23;;-1:-1:-1;;;5610:23:128;;;;;;;;;;;5581:52;5758:15;5755:135;;;5880:1;5859:19;5852:30;5755:135;6230:23;:21;:23::i;:::-;-1:-1:-1;;;;;6230:48:128;;;;;;:42;;;;;:48;;;;;6228:50;;-1:-1:-1;;6228:50:128;;;6316:23;:21;:23::i;:::-;-1:-1:-1;;;;;6316:46:128;;;;;;:42;;;;;:46;;;;;;6314:48;;;;;;10236:11:129;10211:23;10207:41;10194:63;-1:-1:-1;;;10194:63:129;6590:23:128;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;:184;;;;-1:-1:-1;;;6879:47:128;;:52;;6875:625;;6975:1;6965:11;;7080:23;:21;:23::i;:::-;:54;;;;:41;;;;;:54;;;;;;:59;;7076:416;;7220:23;:21;:23::i;:::-;:37;7205:52;;7201:281;;7450:19;7365:23;:21;:23::i;:::-;:82;;;;:41;;;;;:82;;;;;:104;7201:281;6933:567;6875:625;7536:7;7532:2;-1:-1:-1;;;;;7517:27:128;7526:4;-1:-1:-1;;;;;7517:27:128;-1:-1:-1;;;;;;;;;;;7517:27:128;;;;;;;;;7550:42;5030:2567;;;4917:2680;;;:::o;344:79:329:-;401:17;407:2;411:6;401:5;:17::i;7680:167:128:-;7803:39;7820:4;7826:2;7830:7;7803:39;;;;;;;;;;;;:16;:39::i;:::-;7680:167;;;:::o;427:61:329:-;471:12;477:5;471;:12::i;:::-;427:61;:::o;2891:152:128:-;2971:7;3009:27;3028:7;3009:18;:27::i;1697:107::-;1760:7;1782:17;1793:5;1782:10;:17::i;224:116:329:-;270:15;303:14;:12;:14::i;:::-;293:24;;323:12;329:2;333:1;323:5;:12::i;:::-;224:116;;;:::o;2223:120:128:-;2279:13;2307:23;:21;:23::i;:::-;:31;;2300:38;;;;;:::i;3957:269::-;4147:8;4059:23;:21;:23::i;:::-;29371:10:129;4059:63:128;;;;:42;;;;;:63;;;;;;;;-1:-1:-1;;;;;4059:85:128;;;;;;;;;;;;:96;;-1:-1:-1;;4059:96:128;;;;;;;;;;;4166:55;;5301:14:516;;5294:22;5276:41;;4059:85:128;;29371:10:129;;4166:55:128;;5249:18:516;4166:55:128;;;;;;;3957:269;;:::o;8396:348::-;8543:31;8556:4;8562:2;8566:7;8543:12;:31::i;:::-;-1:-1:-1;;;;;8584:14:128;;;:19;8580:160;;8616:56;8647:4;8653:2;8657:7;8666:5;8616:30;:56::i;:::-;8611:129;;8691:40;;-1:-1:-1;;;8691:40:128;;;;;;;;;;;8611:129;8396:348;;;;:::o;2436:329::-;2517:13;2543:16;2551:7;2543;:16::i;:::-;2538:59;;2568:29;;-1:-1:-1;;;2568:29:128;;;;;;;;;;;2538:59;2604:21;2628:10;6624:9:129;;;;;;;;;-1:-1:-1;6624:9:129;;;6552:86;2628:10:128;2604:34;;2663:7;2657:21;2682:1;2657:26;:103;;;;;;;;;;;;;;;;;2718:7;2727:18;2737:7;2727:9;:18::i;:::-;2701:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2657:103;2644:116;2436:329;-1:-1:-1;;;2436:329:128:o;876:157::-;303:66:86;1263:42:85;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:85;;;;;;;;;;;1258:100;988:40:128::1;1013:5;1020:7;988:24;:40::i;4364:167::-:0;4473:4;4492:34;4510:5;4517:8;4492:17;:34::i;1696:139:131:-;300:66;;1696:139::o;22511:230:129:-;22589:7;22609:16;22617:7;22609;:16::i;:::-;22604:64;;22634:34;;-1:-1:-1;;;22634:34:129;;;;;;;;;;;22604:64;22682:23;:21;:23::i;:::-;:48;;;;:39;;:48;;-1:-1:-1;22682:48:129;;;:54;-1:-1:-1;;;;;22682:54:129;;22511:230::o;23291:439::-;23397:13;23413:17;23422:7;23413:8;:17::i;:::-;23397:33;;23441:13;23437:184;;;29371:10;-1:-1:-1;;;;;23466:28:129;;;23462:159;;23509:45;23527:5;29371:10;23509:17;:45::i;:::-;23504:117;;23575:35;;-1:-1:-1;;;23575:35:129;;;;;;;;;;;23504:117;23684:2;23627:23;:21;:23::i;:::-;:48;;;;:39;;;;;:48;;;;;;:59;;-1:-1:-1;;;;;;23627:59:129;-1:-1:-1;;;;;23627:59:129;;;;;;23697:28;23627:48;;23697:28;;;;;;;;;;23627:48;23697:28;23391:339;23291:439;;;:::o;2985:351::-;3032:7;;3263:23;:21;:23::i;:::-;:36;;;3215:23;:21;:23::i;:::-;:37;:84;:110;;2985:351;-1:-1:-1;2985:351:129:o;7836:1501::-;7912:14;7974:32;8009:23;:21;:23::i;:::-;8050:29;;;;:20;;;:29;;;;;;;-1:-1:-1;7974:58:129;;-1:-1:-1;;;;8115:24:129;;:29;;8111:1172;;8236:6;8246:1;8236:11;8232:791;;8276:16;;8265:27;;8261:83;;8313:31;;-1:-1:-1;;;8313:31:129;;;;;;;;;;;8261:83;8831:182;-1:-1:-1;;8910:9:129;;;8889:31;;;;:20;;;:31;;;;;;8910:9;;8889:31;;-1:-1:-1;8948:25:129;;8831:182;8948:25;;8987:13;7836:1501;;;:::o;8111:1172::-;7966:1323;9301:31;;-1:-1:-1;;;9301:31:129;;;;;;;;;;;12155:478;12251:27;12280:23;12313:38;12354:30;:28;:30::i;:::-;:62;;;;:53;;:62;;-1:-1:-1;;12354:62:129;;;;12597:26;;12354:62;;12597:26;;-1:-1:-1;12155:478:129:o;15806:2642::-;15874:20;15897:23;:21;:23::i;:::-;:37;;-1:-1:-1;15897:37:129;15944:13;;;15940:44;;15966:18;;-1:-1:-1;;;15966:18:129;;;;;;;;;;;15940:44;16481:32;16461:53;;16403:23;:21;:23::i;:::-;-1:-1:-1;;;;;16403:46:129;;;;;;:42;;;;;:46;;;;;;:111;;;;;;;;;10236:11;10211:23;10207:41;-1:-1:-1;10631:15:129;;10605:24;10601:46;10204:52;10194:63;16714:23;:21;:23::i;:::-;:71;;;;:41;;;;;:71;;;;;:188;;;;-1:-1:-1;;;;;17423:25:129;;;16949:23;;;;16765:12;;17423:25;;-1:-1:-1;;;;;;;;;;;16714:71:129;;17495:260;18033:1;18019:12;18015:20;17984:275;18065:3;18056:7;18053:16;17984:275;;18241:7;18231:8;18228:1;-1:-1:-1;;;;;;;;;;;18198:1:129;18195;18190:59;18107:1;18094:15;17984:275;;;17988:57;18278:8;18290:1;18278:13;18274:45;;18300:19;;-1:-1:-1;;;18300:19:129;;;;;;;;;;;18274:45;18368:3;18328:23;:21;:23::i;:::-;:43;-1:-1:-1;18383:60:129;;-1:-1:-1;8396:348:128;23974:81:129;24029:21;24035:7;24044:5;24029;:21::i;3340:242::-;3398:7;-1:-1:-1;;;;;3417:19:129;;3413:60;;3445:28;;-1:-1:-1;;;3445:28:129;;;;;;;;;;;3413:60;571:13;3492:23;:21;:23::i;:::-;:42;;:49;3535:5;-1:-1:-1;;;;;3492:49:129;-1:-1:-1;;;;;3492:49:129;;;;;;;;;;;;;:85;3479:98;;3340:242;;;:::o;4042:119::-;4097:7;4119:23;:21;:23::i;:::-;:37;;4042:119;-1:-1:-1;4042:119:129:o;14714:674::-;14877:139;;-1:-1:-1;;;14877:139:129;;14855:4;;-1:-1:-1;;;;;14877:56:129;;;;;:139;;29371:10;;14972:4;;14986:7;;15003:5;;14877:139;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14877:139:129;;;;;;;;-1:-1:-1;;14877:139:129;;;;;;;;;;;;:::i;:::-;;;14867:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15199:6;:13;15216:1;15199:18;15195:183;;15236:40;;-1:-1:-1;;;15236:40:129;;;;;;;;;;;15195:183;15352:6;15346:13;15337:6;15333:2;15329:15;15322:38;14867:517;-1:-1:-1;;;;;;15068:83:129;-1:-1:-1;;;15068:83:129;;-1:-1:-1;14714:674:129;;;;;;:::o;11071:301::-;11136:4;11207:23;:21;:23::i;:::-;:37;11197:47;;11161:187;;;;;-1:-1:-1;;;11275:23:129;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;;:68;:73;11148:200;11071:301;-1:-1:-1;;11071:301:129:o;29475:1574::-;29548:17;29942:4;29935;29929:11;29925:22;30020:1;30014:4;30007:15;30081:4;30078:1;30074:12;30067:19;;;30149:1;30144:3;30137:14;30238:3;30448:5;30430:419;30495:1;30490:3;30486:11;30479:18;;30663:2;30657:4;30653:13;30649:2;30645:22;30640:3;30632:36;30755:2;30745:13;;30810:25;30430:419;30810:25;-1:-1:-1;30871:13:129;;;-1:-1:-1;;30972:14:129;;;31020:19;;;30972:14;29475:1574;-1:-1:-1;29475:1574:129:o;1037:299:128:-;303:66:86;1263:42:85;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:85;;;;;;;;;;;1258:100;1159:25:128::1;-1:-1:-1::0;;;1159:13:128::1;:25::i;:::-;1224;-1:-1:-1::0;;;1224:13:128::1;:25::i;:::-;1297:34;1316:5;1323:7;1297:18;:34::i;22321:186:129:-:0;22424:4;22443:23;:21;:23::i;:::-;-1:-1:-1;;;;;22443:49:129;;;;;;;:42;;;;;:49;;;;;;;;:59;;;;;;;;;;-1:-1:-1;22443:59:129;;;;;22321:186::o;24250:2801::-;24325:27;24355;24374:7;24355:18;:27::i;:::-;24325:57;-1:-1:-1;24325:57:129;24389:12;;24523:35;24550:7;24523:26;:35::i;:::-;24448:110;;;;24569:13;24565:299;;;24676:68;24701:15;24718:4;29371:10;24724:19;29289:97;24676:68;24671:186;;24759:44;24777:4;29371:10;23509:17;:45::i;24759:44::-;24754:103;;24822:35;;-1:-1:-1;;;24822:35:129;;;;;;;;;;;24754:103;24996:15;24993:135;;;25118:1;25097:19;25090:30;24993:135;25140:32;25175:23;:21;:23::i;:::-;-1:-1:-1;;;;;25720:27:129;;;;;;:21;;;:27;;;;;:63;;25751:32;25720:63;;;:21;;-1:-1:-1;10236:11:129;10211:23;10207:41;10194:63;-1:-1:-1;;;10194:63:129;25978:29;;;;:20;;;:29;;;;;:193;;;;-1:-1:-1;;;26276:47:129;;:52;;26272:534;;26372:1;26362:11;;26340:19;26477:33;;;:20;;;:33;;;;;;:38;;26473:325;;26596:16;;26581:31;;26577:211;;26720:33;;;;:20;;;:33;;;;;:55;;;26577:211;26330:476;26272:534;26823:35;;26850:7;;26846:1;;-1:-1:-1;;;;;26823:35:129;;;-1:-1:-1;;;;;;;;;;;26823:35:129;26846:1;;26823:35;27023:15;;;;:17;;;;;;;-1:-1:-1;;;;;;24250:2801:129:o;452:282:88:-;-1:-1:-1;;;;;;1121:62:88;;1096:4;1121:62;;;303:66:90;1121:62:88;;;;;;;;:70;;:62;:70;510:182;;-1:-1:-1;;;;;;556:62:88;;:49;:62;;;303:66:90;556:62:88;;;;;:69;;-1:-1:-1;;556:69:88;621:4;556:69;;;510:182;;;653:32;;-1:-1:-1;;;653:32:88;;;;;;;;;;;510:182;702:27;;-1:-1:-1;;;;;;702:27:88;;;;;;;;452:282;:::o;2560:247:129:-;2657:32;2692:23;:21;:23::i;:::-;2657:58;-1:-1:-1;2722:8:129;;;:15;2733:4;2722:8;:15;:::i;:::-;-1:-1:-1;2743:10:129;;;:19;2756:6;2743:10;:19;:::i;:::-;-1:-1:-1;3948:7:129;2768:34;;-1:-1:-1;;2560:247:129:o;14:250:516:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:516;238:16;;231:27;14:250::o;269:271::-;311:3;349:5;343:12;376:6;371:3;364:19;392:76;461:6;454:4;449:3;445:14;438:4;431:5;427:16;392:76;:::i;:::-;522:2;501:15;-1:-1:-1;;497:29:516;488:39;;;;529:4;484:50;;269:271;-1:-1:-1;;269:271:516:o;545:220::-;694:2;683:9;676:21;657:4;714:45;755:2;744:9;740:18;732:6;714:45;:::i;770:180::-;829:6;882:2;870:9;861:7;857:23;853:32;850:52;;;898:1;895;888:12;850:52;-1:-1:-1;921:23:516;;770:180;-1:-1:-1;770:180:516:o;1163:173::-;1231:20;;-1:-1:-1;;;;;1280:31:516;;1270:42;;1260:70;;1326:1;1323;1316:12;1341:254;1409:6;1417;1470:2;1458:9;1449:7;1445:23;1441:32;1438:52;;;1486:1;1483;1476:12;1438:52;1509:29;1528:9;1509:29;:::i;:::-;1499:39;1585:2;1570:18;;;;1557:32;;-1:-1:-1;;;1341:254:516:o;1782:328::-;1859:6;1867;1875;1928:2;1916:9;1907:7;1903:23;1899:32;1896:52;;;1944:1;1941;1934:12;1896:52;1967:29;1986:9;1967:29;:::i;:::-;1957:39;;2015:38;2049:2;2038:9;2034:18;2015:38;:::i;:::-;2005:48;;2100:2;2089:9;2085:18;2072:32;2062:42;;1782:328;;;;;:::o;2115:186::-;2174:6;2227:2;2215:9;2206:7;2202:23;2198:32;2195:52;;;2243:1;2240;2233:12;2195:52;2266:29;2285:9;2266:29;:::i;2306:347::-;2371:6;2379;2432:2;2420:9;2411:7;2407:23;2403:32;2400:52;;;2448:1;2445;2438:12;2400:52;2471:29;2490:9;2471:29;:::i;:::-;2461:39;;2550:2;2539:9;2535:18;2522:32;2597:5;2590:13;2583:21;2576:5;2573:32;2563:60;;2619:1;2616;2609:12;2563:60;2642:5;2632:15;;;2306:347;;;;;:::o;2658:127::-;2719:10;2714:3;2710:20;2707:1;2700:31;2750:4;2747:1;2740:15;2774:4;2771:1;2764:15;2790:631;2854:5;2884:18;2925:2;2917:6;2914:14;2911:40;;;2931:18;;:::i;:::-;3006:2;3000:9;2974:2;3060:15;;-1:-1:-1;;3056:24:516;;;3082:2;3052:33;3048:42;3036:55;;;3106:18;;;3126:22;;;3103:46;3100:72;;;3152:18;;:::i;:::-;3192:10;3188:2;3181:22;3221:6;3212:15;;3251:6;3243;3236:22;3291:3;3282:6;3277:3;3273:16;3270:25;3267:45;;;3308:1;3305;3298:12;3267:45;3358:6;3353:3;3346:4;3338:6;3334:17;3321:44;3413:1;3406:4;3397:6;3389;3385:19;3381:30;3374:41;;;;2790:631;;;;;:::o;3426:666::-;3521:6;3529;3537;3545;3598:3;3586:9;3577:7;3573:23;3569:33;3566:53;;;3615:1;3612;3605:12;3566:53;3638:29;3657:9;3638:29;:::i;:::-;3628:39;;3686:38;3720:2;3709:9;3705:18;3686:38;:::i;:::-;3676:48;;3771:2;3760:9;3756:18;3743:32;3733:42;;3826:2;3815:9;3811:18;3798:32;3853:18;3845:6;3842:30;3839:50;;;3885:1;3882;3875:12;3839:50;3908:22;;3961:4;3953:13;;3949:27;-1:-1:-1;3939:55:516;;3990:1;3987;3980:12;3939:55;4013:73;4078:7;4073:2;4060:16;4055:2;4051;4047:11;4013:73;:::i;:::-;4003:83;;;3426:666;;;;;;;:::o;4097:221::-;4140:5;4193:3;4186:4;4178:6;4174:17;4170:27;4160:55;;4211:1;4208;4201:12;4160:55;4233:79;4308:3;4299:6;4286:20;4279:4;4271:6;4267:17;4233:79;:::i;4323:543::-;4411:6;4419;4472:2;4460:9;4451:7;4447:23;4443:32;4440:52;;;4488:1;4485;4478:12;4440:52;4528:9;4515:23;4557:18;4598:2;4590:6;4587:14;4584:34;;;4614:1;4611;4604:12;4584:34;4637:50;4679:7;4670:6;4659:9;4655:22;4637:50;:::i;:::-;4627:60;;4740:2;4729:9;4725:18;4712:32;4696:48;;4769:2;4759:8;4756:16;4753:36;;;4785:1;4782;4775:12;4753:36;;4808:52;4852:7;4841:8;4830:9;4826:24;4808:52;:::i;:::-;4798:62;;;4323:543;;;;;:::o;4871:260::-;4939:6;4947;5000:2;4988:9;4979:7;4975:23;4971:32;4968:52;;;5016:1;5013;5006:12;4968:52;5039:29;5058:9;5039:29;:::i;:::-;5029:39;;5087:38;5121:2;5110:9;5106:18;5087:38;:::i;:::-;5077:48;;4871:260;;;;;:::o;5328:380::-;5407:1;5403:12;;;;5450;;;5471:61;;5525:4;5517:6;5513:17;5503:27;;5471:61;5578:2;5570:6;5567:14;5547:18;5544:38;5541:161;;5624:10;5619:3;5615:20;5612:1;5605:31;5659:4;5656:1;5649:15;5687:4;5684:1;5677:15;5713:496;5892:3;5930:6;5924:13;5946:66;6005:6;6000:3;5993:4;5985:6;5981:17;5946:66;:::i;:::-;6075:13;;6034:16;;;;6097:70;6075:13;6034:16;6144:4;6132:17;;6097:70;:::i;:::-;6183:20;;5713:496;-1:-1:-1;;;;5713:496:516:o;6214:489::-;-1:-1:-1;;;;;6483:15:516;;;6465:34;;6535:15;;6530:2;6515:18;;6508:43;6582:2;6567:18;;6560:34;;;6630:3;6625:2;6610:18;;6603:31;;;6408:4;;6651:46;;6677:19;;6669:6;6651:46;:::i;:::-;6643:54;6214:489;-1:-1:-1;;;;;;6214:489:516:o;6708:290::-;6777:6;6830:2;6818:9;6809:7;6805:23;6801:32;6798:52;;;6846:1;6843;6836:12;6798:52;6872:16;;-1:-1:-1;;;;;;6917:32:516;;6907:43;;6897:71;;6964:1;6961;6954:12;7129:543;7231:2;7226:3;7223:11;7220:446;;;7267:1;7291:5;7288:1;7281:16;7335:4;7332:1;7322:18;7405:2;7393:10;7389:19;7386:1;7382:27;7376:4;7372:38;7441:4;7429:10;7426:20;7423:47;;;-1:-1:-1;7464:4:516;7423:47;7519:2;7514:3;7510:12;7507:1;7503:20;7497:4;7493:31;7483:41;;7574:82;7592:2;7585:5;7582:13;7574:82;;;7637:17;;;7618:1;7607:13;7574:82;;7848:1345;7974:3;7968:10;8001:18;7993:6;7990:30;7987:56;;;8023:18;;:::i;:::-;8052:97;8142:6;8102:38;8134:4;8128:11;8102:38;:::i;:::-;8096:4;8052:97;:::i;:::-;8204:4;;8261:2;8250:14;;8278:1;8273:663;;;;8980:1;8997:6;8994:89;;;-1:-1:-1;9049:19:516;;;9043:26;8994:89;-1:-1:-1;;7805:1:516;7801:11;;;7797:24;7793:29;7783:40;7829:1;7825:11;;;7780:57;9096:81;;8243:944;;8273:663;7076:1;7069:14;;;7113:4;7100:18;;-1:-1:-1;;8309:20:516;;;8427:236;8441:7;8438:1;8435:14;8427:236;;;8530:19;;;8524:26;8509:42;;8622:27;;;;8590:1;8578:14;;;;8457:19;;8427:236;;;8431:3;8691:6;8682:7;8679:19;8676:201;;;8752:19;;;8746:26;-1:-1:-1;;8835:1:516;8831:14;;;8847:3;8827:24;8823:37;8819:42;8804:58;8789:74;;8676:201;-1:-1:-1;;;;;8923:1:516;8907:14;;;8903:22;8890:36;;-1:-1:-1;7848:1345:516:o","linkReferences":{}},"methodIdentifiers":{"__ERC721A_init(string,string)":"d2f01f19","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","burn(uint256)":"42966c68","getApproved(uint256)":"081812fc","isApprovedForAll(address,address)":"e985e9c5","mint(address,uint256)":"40c10f19","mintTo(address)":"755edd17","name()":"06fdde03","ownerOf(uint256)":"6352211e","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","totalSupply()":"18160ddd","transferFrom(address,address,uint256)":"23b872dd"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ApprovalCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BalanceQueryForZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintERC2309QuantityExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintZeroQuantity\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnershipNotInitializedForExtraData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFromIncorrectOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC721ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"URIQueryForNonexistentToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"toTokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"ConsecutiveTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"name\":\"__ERC721A_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"token\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"mintTo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"ConsecutiveTransfer(uint256,uint256,address,address)\":{\"details\":\"Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, as defined in the [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. See {_mintERC2309} for more details.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator.\"},\"balanceOf(address)\":{\"details\":\"Returns the number of tokens in `owner`'s account.\"},\"getApproved(uint256)\":{\"details\":\"Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist.\"},\"isApprovedForAll(address,address)\":{\"details\":\"Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}.\"},\"name()\":{\"details\":\"Returns the token collection name.\"},\"ownerOf(uint256)\":{\"details\":\"Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Equivalent to `safeTransferFrom(from, to, tokenId, '')`.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event.\"},\"symbol()\":{\"details\":\"Returns the token collection symbol.\"},\"tokenURI(uint256)\":{\"details\":\"Returns the Uniform Resource Identifier (URI) for `tokenId` token.\"},\"totalSupply()\":{\"details\":\"Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"errors\":{\"ApprovalCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"ApprovalQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"BalanceQueryForZeroAddress()\":[{\"notice\":\"Cannot query the balance for the zero address.\"}],\"MintERC2309QuantityExceedsLimit()\":[{\"notice\":\"The `quantity` minted with ERC2309 exceeds the safety limit.\"}],\"MintToZeroAddress()\":[{\"notice\":\"Cannot mint to the zero address.\"}],\"MintZeroQuantity()\":[{\"notice\":\"The quantity of tokens minted must be more than zero.\"}],\"OwnerQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"OwnershipNotInitializedForExtraData()\":[{\"notice\":\"The `extraData` cannot be set on an unintialized ownership slot.\"}],\"TransferCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"TransferFromIncorrectOwner()\":[{\"notice\":\"The token must be owned by `from`.\"}],\"TransferToNonERC721ReceiverImplementer()\":[{\"notice\":\"Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"notice\":\"Cannot transfer to the zero address.\"}],\"URIQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}]},\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/mocks/MockERC721A.sol\":\"MockERC721A\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721A.sol\":{\"keccak256\":\"0xc8fab662d9a0c4e697c8dcaad72dd2a190331b01476649a742b6f317266ac5a1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://9c84047a6d47a901f45f90f12f713432289ae6d88fea95a383900906005cf70b\",\"dweb:/ipfs/QmVdLUVdtjTQn2fCG85Uv2ZAzCSfNbWYcAg5eXthunnigc\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol\":{\"keccak256\":\"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa\",\"dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol\":{\"keccak256\":\"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c\",\"dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu\"]},\"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol\":{\"keccak256\":\"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e\",\"dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM\"]},\"contracts/test/mocks/MockERC721A.sol\":{\"keccak256\":\"0xc82f921539b1b78768b8b86d98a05194bf32af4b512537f6d9eaab0ad496f0eb\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://934b78d502b0f8e8609c9576724e1a3038377c04ef46dadde97956ce3974a07a\",\"dweb:/ipfs/QmfTwkrXXW7gGJYeJyVKDKKzEU9P831pwYRnYajt8TLiYt\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"ApprovalCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"ApprovalQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"BalanceQueryForZeroAddress"},{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[],"type":"error","name":"MintERC2309QuantityExceedsLimit"},{"inputs":[],"type":"error","name":"MintToZeroAddress"},{"inputs":[],"type":"error","name":"MintZeroQuantity"},{"inputs":[],"type":"error","name":"OwnerQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"OwnershipNotInitializedForExtraData"},{"inputs":[],"type":"error","name":"TransferCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"TransferFromIncorrectOwner"},{"inputs":[],"type":"error","name":"TransferToNonERC721ReceiverImplementer"},{"inputs":[],"type":"error","name":"TransferToZeroAddress"},{"inputs":[],"type":"error","name":"URIQueryForNonexistentToken"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"approved","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bool","name":"approved","type":"bool","indexed":false}],"type":"event","name":"ApprovalForAll","anonymous":false},{"inputs":[{"internalType":"uint256","name":"fromTokenId","type":"uint256","indexed":true},{"internalType":"uint256","name":"toTokenId","type":"uint256","indexed":false},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true}],"type":"event","name":"ConsecutiveTransfer","anonymous":false},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"__ERC721A_init"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"approve"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function","name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"burn"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"mint"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"mintTo","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setApprovalForAll"},{"inputs":[],"stateMutability":"view","type":"function","name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"transferFrom"}],"devdoc":{"kind":"dev","methods":{"approve(address,uint256)":{"details":"Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator."},"balanceOf(address)":{"details":"Returns the number of tokens in `owner`'s account."},"getApproved(uint256)":{"details":"Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist."},"isApprovedForAll(address,address)":{"details":"Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}."},"name()":{"details":"Returns the token collection name."},"ownerOf(uint256)":{"details":"Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist."},"safeTransferFrom(address,address,uint256)":{"details":"Equivalent to `safeTransferFrom(from, to, tokenId, '')`."},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event."},"setApprovalForAll(address,bool)":{"details":"Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event."},"symbol()":{"details":"Returns the token collection symbol."},"tokenURI(uint256)":{"details":"Returns the Uniform Resource Identifier (URI) for `tokenId` token."},"totalSupply()":{"details":"Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}."},"transferFrom(address,address,uint256)":{"details":"Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/test/mocks/MockERC721A.sol":"MockERC721A"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721A.sol":{"keccak256":"0xc8fab662d9a0c4e697c8dcaad72dd2a190331b01476649a742b6f317266ac5a1","urls":["bzz-raw://9c84047a6d47a901f45f90f12f713432289ae6d88fea95a383900906005cf70b","dweb:/ipfs/QmVdLUVdtjTQn2fCG85Uv2ZAzCSfNbWYcAg5eXthunnigc"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol":{"keccak256":"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334","urls":["bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa","dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol":{"keccak256":"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1","urls":["bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c","dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9","urls":["bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e","dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM"],"license":"Apache-2.0"},"contracts/test/mocks/MockERC721A.sol":{"keccak256":"0xc82f921539b1b78768b8b86d98a05194bf32af4b512537f6d9eaab0ad496f0eb","urls":["bzz-raw://934b78d502b0f8e8609c9576724e1a3038377c04ef46dadde97956ce3974a07a","dweb:/ipfs/QmfTwkrXXW7gGJYeJyVKDKKzEU9P831pwYRnYajt8TLiYt"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"}},"version":1},"id":329} \ No newline at end of file diff --git a/packages/generated/dev/abis/MockERC721A.metadata.json b/packages/generated/dev/abis/MockERC721A.metadata.json new file mode 100644 index 000000000..5b2cad10a --- /dev/null +++ b/packages/generated/dev/abis/MockERC721A.metadata.json @@ -0,0 +1,731 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "ApprovalQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "BalanceQueryForZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [], + "type": "error", + "name": "MintERC2309QuantityExceedsLimit" + }, + { + "inputs": [], + "type": "error", + "name": "MintToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "MintZeroQuantity" + }, + { + "inputs": [], + "type": "error", + "name": "OwnerQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "OwnershipNotInitializedForExtraData" + }, + { + "inputs": [], + "type": "error", + "name": "TransferCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "TransferFromIncorrectOwner" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "URIQueryForNonexistentToken" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "approved", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Approval", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "operator", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ApprovalForAll", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fromTokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint256", + "name": "toTokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConsecutiveTransfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Transfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name_", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol_", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__ERC721A_init" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "approve" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "token", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "burn" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "mint" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "mintTo", + "outputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "safeTransferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "safeTransferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setApprovalForAll" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "transferFrom" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "approve(address,uint256)": { + "details": "Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator." + }, + "balanceOf(address)": { + "details": "Returns the number of tokens in `owner`'s account." + }, + "getApproved(uint256)": { + "details": "Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist." + }, + "isApprovedForAll(address,address)": { + "details": "Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}." + }, + "name()": { + "details": "Returns the token collection name." + }, + "ownerOf(uint256)": { + "details": "Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist." + }, + "safeTransferFrom(address,address,uint256)": { + "details": "Equivalent to `safeTransferFrom(from, to, tokenId, '')`." + }, + "safeTransferFrom(address,address,uint256,bytes)": { + "details": "Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event." + }, + "setApprovalForAll(address,bool)": { + "details": "Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event." + }, + "symbol()": { + "details": "Returns the token collection symbol." + }, + "tokenURI(uint256)": { + "details": "Returns the Uniform Resource Identifier (URI) for `tokenId` token." + }, + "totalSupply()": { + "details": "Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}." + }, + "transferFrom(address,address,uint256)": { + "details": "Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/test/mocks/MockERC721A.sol": "MockERC721A" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721A.sol": { + "keccak256": "0xc8fab662d9a0c4e697c8dcaad72dd2a190331b01476649a742b6f317266ac5a1", + "urls": [ + "bzz-raw://9c84047a6d47a901f45f90f12f713432289ae6d88fea95a383900906005cf70b", + "dweb:/ipfs/QmVdLUVdtjTQn2fCG85Uv2ZAzCSfNbWYcAg5eXthunnigc" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol": { + "keccak256": "0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334", + "urls": [ + "bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa", + "dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol": { + "keccak256": "0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1", + "urls": [ + "bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c", + "dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/IERC721A.sol": { + "keccak256": "0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9", + "urls": [ + "bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e", + "dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM" + ], + "license": "Apache-2.0" + }, + "contracts/test/mocks/MockERC721A.sol": { + "keccak256": "0xc82f921539b1b78768b8b86d98a05194bf32af4b512537f6d9eaab0ad496f0eb", + "urls": [ + "bzz-raw://934b78d502b0f8e8609c9576724e1a3038377c04ef46dadde97956ce3974a07a", + "dweb:/ipfs/QmfTwkrXXW7gGJYeJyVKDKKzEU9P831pwYRnYajt8TLiYt" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/MockEntitlementGated.abi.json b/packages/generated/dev/abis/MockEntitlementGated.abi.json new file mode 100644 index 000000000..d5bffedf8 --- /dev/null +++ b/packages/generated/dev/abis/MockEntitlementGated.abi.json @@ -0,0 +1,433 @@ +[ + { + "type": "constructor", + "inputs": [ + { + "name": "checker", + "type": "address", + "internalType": "contract IEntitlementChecker" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__EntitlementGated_init", + "inputs": [ + { + "name": "entitlementChecker", + "type": "address", + "internalType": "contract IEntitlementChecker" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getRuleData", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRuleData", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "postEntitlementCheckResult", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "result", + "type": "uint8", + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "requestEntitlementCheck", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "ruleData", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "EntitlementCheckResultPosted", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "result", + "type": "uint8", + "indexed": false, + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "EntitlementGated_InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_NodeAlreadyVoted", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_NodeNotFound", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyCompleted", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyRegistered", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionNotRegistered", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "ReentrancyGuard__ReentrantCall", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/MockEntitlementGated.abi.ts b/packages/generated/dev/abis/MockEntitlementGated.abi.ts new file mode 100644 index 000000000..0d6db77c2 --- /dev/null +++ b/packages/generated/dev/abis/MockEntitlementGated.abi.ts @@ -0,0 +1,433 @@ +export default [ + { + "type": "constructor", + "inputs": [ + { + "name": "checker", + "type": "address", + "internalType": "contract IEntitlementChecker" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__EntitlementGated_init", + "inputs": [ + { + "name": "entitlementChecker", + "type": "address", + "internalType": "contract IEntitlementChecker" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getRuleData", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRuleData", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "postEntitlementCheckResult", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "result", + "type": "uint8", + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "requestEntitlementCheck", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "ruleData", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "EntitlementCheckResultPosted", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "result", + "type": "uint8", + "indexed": false, + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "EntitlementGated_InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_NodeAlreadyVoted", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_NodeNotFound", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyCompleted", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyRegistered", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionNotRegistered", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "ReentrancyGuard__ReentrantCall", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/MockEntitlementGated.bin b/packages/generated/dev/abis/MockEntitlementGated.bin new file mode 100644 index 000000000..1cd6217be --- /dev/null +++ b/packages/generated/dev/abis/MockEntitlementGated.bin @@ -0,0 +1 @@ +60806040523480156200001157600080fd5b5060405162001b9a38038062001b9a833981016040819052620000349162000127565b6200003e6200007f565b7f9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e0080546001600160a01b0319166001600160a01b0383161790555062000159565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff1615620000cc576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156200012457805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6000602082840312156200013a57600080fd5b81516001600160a01b03811681146200015257600080fd5b9392505050565b611a3180620001696000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063069a3ee91461005c5780634739e8051461008557806357e700271461009a5780637adc9cbe146100bb57806392c399ff146100ce575b600080fd5b61006f61006a366004610e1e565b6100e1565b60405161007c9190610f28565b60405180910390f35b610098610093366004610fd8565b610314565b005b6100ad6100a8366004611011565b6103b8565b60405190815260200161007c565b6100986100c9366004611074565b610426565b61006f6100dc366004611091565b61047c565b61010560405180606001604052806060815260200160608152602001606081525090565b6000828152602081815260408083208151815460809481028201850190935260608101838152909491938593919285929185015b828210156101a257600084815260209020604080518082019091529083018054829060ff16600281111561016f5761016f610e37565b600281111561018057610180610e37565b81529054610100900460ff166020918201529082526001929092019101610139565b50505050815260200160018201805480602002602001604051908101604052809291908181526020016000905b8282101561025a576000848152602090206040805160808101909152600484029091018054829060ff16600581111561020a5761020a610e37565b600581111561021b5761021b610e37565b815260018281015460208084019190915260028401546001600160a01b03166040840152600390930154606090920191909152918352920191016101cf565b50505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156103065760008481526020902060408051606081019091529083018054829060ff1660028111156102be576102be610e37565b60028111156102cf576102cf610e37565b8152905460ff6101008204811660208085019190915262010000909204166040909201919091529082526001929092019101610287565b505050915250909392505050565b60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a00540361035657604051635db5c7cd60e11b815260040160405180910390fd5b61037f60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b61038a8383836104aa565b6103b360017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b505050565b600082815260208190526040812082906103d2828261140a565b50506040516bffffffffffffffffffffffff193260601b16602082015243603482015260009060540160405160208183030381529060405280519060200120905061041f81306000610743565b9392505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661047057604051630ef4733760e31b815260040160405180910390fd5b610479816109f2565b50565b6104a060405180606001604052806060815260200160608152602001606081525090565b61041f8383610a2d565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919061010090046001600160a01b031615806104f45750805460ff16155b1561051257604051637ad5a43960e11b815260040160405180910390fd5b600084815260028201602052604090205460ff161561054457604051637912b73960e01b815260040160405180910390fd5b600084815260018201602052604081205481908190815b8181101561068257600089815260018701602052604081208054839081106105855761058561150e565b60009182526020909120018054909150336001600160a01b03909116036106115760008154600160a01b900460ff1660028111156105c5576105c5610e37565b146105e3576040516347592a4d60e01b815260040160405180910390fd5b80548990829060ff60a01b1916600160a01b83600281111561060757610607610e37565b0217905550600195505b60018154600160a01b900460ff16600281111561063057610630610e37565b03610647578461063f81611524565b955050610679565b60028154600160a01b900460ff16600281111561066657610666610e37565b03610679578361067581611524565b9450505b5060010161055b565b50836106a157604051638223a7e960e01b815260040160405180910390fd5b6106ac60028261153d565b8311806106c257506106bf60028261153d565b82115b156107385760008881526002860160205260408120805460ff191660011790558284116106f05760026106f3565b60015b9050897fb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c63382604051610725919061155f565b60405180910390a26107368a610b27565b505b505050505050505050565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919060ff1615156001036107d55760005b60048201548110156107d357838260040182815481106107a2576107a261150e565b9060005260206000200154036107cb576040516301ab53df60e31b815260040160405180910390fd5b600101610780565b505b81546001600160a01b03166107ec576107ec610bfb565b8154604051634f84544560e01b8152600560048201526000916001600160a01b031690634f84544590602401600060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085d9190810190611636565b825490915060ff1661089e5781546003830180546001600160a01b0319166001600160a01b0388161790556001600160a81b03191661010033021760011782555b600482018054600181018255600091825260208220018590555b815181101561098e5782600101600086815260200190815260200160002060405180604001604052808484815181106108f3576108f361150e565b60200260200101516001600160a01b031681526020016000600281111561091c5761091c610e37565b9052815460018101835560009283526020928390208251910180546001600160a01b031981166001600160a01b03909316928317825593830151929390929183916001600160a81b03191617600160a01b83600281111561097f5761097f610e37565b021790555050506001016108b8565b50825460405163541da4e560e01b81526001600160a01b039091169063541da4e5906109c49033908a90899087906004016116ca565b600060405180830381600087803b1580156109de57600080fd5b505af1158015610736573d6000803e3d6000fd5b610a02636afd38fd60e11b610ccc565b6000805160206119f183398151915280546001600160a01b0319166001600160a01b03831617905550565b610a5160405180606001604052806060815260200160608152602001606081525090565b6000838152600080516020611a118339815191526020526040812080546000805160206119f18339815191529260ff90911615159003610aa457604051637ad5a43960e11b815260040160405180910390fd5b600381015460405163069a3ee960e01b8152600481018690526001600160a01b0390911690600090829063069a3ee990602401600060405180830381865afa158015610af4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b1c9190810190611893565b979650505050505050565b6000818152600080516020611a11833981519152602052604081206000805160206119f1833981519152915b6004820154811015610ba757816001016000836004018381548110610b7a57610b7a61150e565b906000526020600020015481526020019081526020016000206000610b9f9190610daa565b600101610b53565b50610bb6600482016000610dc8565b6000838152600183016020526040812080546001600160a81b03191681556003810180546001600160a01b031916905590610bf46004830182610dc8565b5050505050565b60006000805160206119f1833981519152905060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60060060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad91906119d3565b82546001600160a01b0319166001600160a01b03919091161790915550565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610d59576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610d72565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b50805460008255906000526020600020908101906104799190610de6565b50805460008255906000526020600020908101906104799190610e09565b5b80821115610e055780546001600160a81b0319168155600101610de7565b5090565b5b80821115610e055760008155600101610e0a565b600060208284031215610e3057600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b6003811061047957610479610e37565b60008151808452602080850194506020840160005b83811015610ec7578151805160068110610e8e57610e8e610e37565b885280840151848901526040808201516001600160a01b0316908901526060908101519088015260809096019590820190600101610e72565b509495945050505050565b60008151808452602080850194506020840160005b83811015610ec75781518051610efc81610e4d565b88528084015160ff908116858a0152604091820151169088015260609096019590820190600101610ee7565b6020808252825160608383015280516080840181905260009291820190839060a08601905b80831015610f845783518051610f6281610e4d565b835285015160ff16858301529284019260019290920191604090910190610f4d565b50838701519350601f19925082868203016040870152610fa48185610e5d565b93505050604085015181858403016060860152610fc18382610ed2565b9695505050505050565b6003811061047957600080fd5b600080600060608486031215610fed57600080fd5b8335925060208401359150604084013561100681610fcb565b809150509250925092565b6000806040838503121561102457600080fd5b82359150602083013567ffffffffffffffff81111561104257600080fd5b83016060818603121561105457600080fd5b809150509250929050565b6001600160a01b038116811461047957600080fd5b60006020828403121561108657600080fd5b813561041f8161105f565b600080604083850312156110a457600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60ff8116811461047957600080fd5b81356110f981610fcb565b61110281610e4d565b60ff1982541660ff82168117835550506020820135611120816110df565b815461ff001916600882901b61ff0016178255505050565b6000808335601e1984360301811261114f57600080fd5b83018035915067ffffffffffffffff82111561116a57600080fd5b6020019150600781901b360382131561118257600080fd5b9250929050565b6006811061047957600080fd5b81356111a181611189565b600681106111b1576111b1610e37565b60ff1982541660ff8216811783555050602082013560018201556002810160408301356111dd8161105f565b81546001600160a01b0319166001600160a01b03919091161790556060919091013560039190910155565b600160401b83111561121c5761121c6110b3565b80548382558084101561129a5760026001600160fe1b038281168314611244576112446110c9565b8086168614611255576112556110c9565b506000838152602081208360021b81018760021b820191505b8082101561129557828255826001830155828483015582600383015560048201915061126e565b505050505b5060008181526020812083915b858110156112cf576112b98383611196565b60809290920191600491909101906001016112a7565b505050505050565b6000808335601e198436030181126112ee57600080fd5b83018035915067ffffffffffffffff82111561130957600080fd5b602001915060608102360382131561118257600080fd5b813561132b81610fcb565b61133481610e4d565b60ff1982541660ff82168117835550506020820135611352816110df565b815461ff001916600882901b61ff0016178255506040820135611374816110df565b815462ff0000191660109190911b62ff00001617905550565b600160401b8311156113a1576113a16110b3565b8054838255808410156113d8576000828152602081208581019083015b808210156113d4578282556001820191506113be565b5050505b5060008181526020812083915b858110156112cf576113f78383611320565b60609290920191600191820191016113e5565b8135601e1983360301811261141e57600080fd5b8201803567ffffffffffffffff81111561143757600080fd5b6020820191508060061b360382131561144f57600080fd5b600160401b811115611463576114636110b3565b82548184558082101561149a576000848152602081208381019083015b8082101561149657828255600182019150611480565b5050505b5060008381526020902060005b828110156114cc576114b984836110ee565b60409390930192600191820191016114a7565b505050506114dd6020830183611138565b6114eb818360018601611208565b50506114fa60408301836112d7565b61150881836002860161138d565b50505050565b634e487b7160e01b600052603260045260246000fd5b600060018201611536576115366110c9565b5060010190565b60008261155a57634e487b7160e01b600052601260045260246000fd5b500490565b6020810161156c83610e4d565b91905290565b6040516080810167ffffffffffffffff81118282101715611595576115956110b3565b60405290565b6040516060810167ffffffffffffffff81118282101715611595576115956110b3565b6040805190810167ffffffffffffffff81118282101715611595576115956110b3565b604051601f8201601f1916810167ffffffffffffffff8111828210171561160a5761160a6110b3565b604052919050565b600067ffffffffffffffff82111561162c5761162c6110b3565b5060051b60200190565b6000602080838503121561164957600080fd5b825167ffffffffffffffff81111561166057600080fd5b8301601f8101851361167157600080fd5b805161168461167f82611612565b6115e1565b81815260059190911b820183019083810190878311156116a357600080fd5b928401925b82841015610b1c5783516116bb8161105f565b825292840192908401906116a8565b60006080820160018060a01b03808816845260208760208601528660408601526080606086015282865180855260a08701915060208801945060005b81811015611724578551851683529483019491830191600101611706565b50909a9950505050505050505050565b600082601f83011261174557600080fd5b8151602061175561167f83611612565b82815260079290921b8401810191818101908684111561177457600080fd5b8286015b848110156117d957608081890312156117915760008081fd5b611799611572565b81516117a481611189565b815281850151858201526040808301516117bd8161105f565b9082015260608281015190820152835291830191608001611778565b509695505050505050565b600082601f8301126117f557600080fd5b8151602061180561167f83611612565b8281526060928302850182019282820191908785111561182457600080fd5b8387015b858110156118865781818a0312156118405760008081fd5b61184861159b565b815161185381610fcb565b815281860151611862816110df565b81870152604082810151611875816110df565b908201528452928401928101611828565b5090979650505050505050565b600060208083850312156118a657600080fd5b825167ffffffffffffffff808211156118be57600080fd5b90840190606082870312156118d257600080fd5b6118da61159b565b8251828111156118e957600080fd5b8301601f810188136118fa57600080fd5b805161190861167f82611612565b81815260069190911b8201860190868101908a83111561192757600080fd5b928701925b8284101561197d576040848c0312156119455760008081fd5b61194d6115be565b845161195881610fcb565b815284890151611967816110df565b818a01528252604093909301929087019061192c565b8452505050828401518281111561199357600080fd5b61199f88828601611734565b858301525060408301519350818411156119b857600080fd5b6119c4878585016117e4565b60408201529695505050505050565b6000602082840312156119e557600080fd5b815161041f8161105f56fe9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e01 \ No newline at end of file diff --git a/packages/generated/dev/abis/MockEntitlementGated.json b/packages/generated/dev/abis/MockEntitlementGated.json new file mode 100644 index 000000000..e718623d2 --- /dev/null +++ b/packages/generated/dev/abis/MockEntitlementGated.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"checker","type":"address","internalType":"contract IEntitlementChecker"}],"stateMutability":"nonpayable"},{"type":"function","name":"__EntitlementGated_init","inputs":[{"name":"entitlementChecker","type":"address","internalType":"contract IEntitlementChecker"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getRuleData","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IRuleEntitlement.RuleData","components":[{"name":"operations","type":"tuple[]","internalType":"struct IRuleEntitlement.Operation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CombinedOperationType"},{"name":"index","type":"uint8","internalType":"uint8"}]},{"name":"checkOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.CheckOperation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CheckOperationType"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"contractAddress","type":"address","internalType":"address"},{"name":"threshold","type":"uint256","internalType":"uint256"}]},{"name":"logicalOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.LogicalOperation[]","components":[{"name":"logOpType","type":"uint8","internalType":"enum IRuleEntitlement.LogicalOperationType"},{"name":"leftOperationIndex","type":"uint8","internalType":"uint8"},{"name":"rightOperationIndex","type":"uint8","internalType":"uint8"}]}]}],"stateMutability":"view"},{"type":"function","name":"getRuleData","inputs":[{"name":"transactionId","type":"bytes32","internalType":"bytes32"},{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IRuleEntitlement.RuleData","components":[{"name":"operations","type":"tuple[]","internalType":"struct IRuleEntitlement.Operation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CombinedOperationType"},{"name":"index","type":"uint8","internalType":"uint8"}]},{"name":"checkOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.CheckOperation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CheckOperationType"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"contractAddress","type":"address","internalType":"address"},{"name":"threshold","type":"uint256","internalType":"uint256"}]},{"name":"logicalOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.LogicalOperation[]","components":[{"name":"logOpType","type":"uint8","internalType":"enum IRuleEntitlement.LogicalOperationType"},{"name":"leftOperationIndex","type":"uint8","internalType":"uint8"},{"name":"rightOperationIndex","type":"uint8","internalType":"uint8"}]}]}],"stateMutability":"view"},{"type":"function","name":"postEntitlementCheckResult","inputs":[{"name":"transactionId","type":"bytes32","internalType":"bytes32"},{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"result","type":"uint8","internalType":"enum IEntitlementGatedBase.NodeVoteStatus"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"requestEntitlementCheck","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"ruleData","type":"tuple","internalType":"struct IRuleEntitlement.RuleData","components":[{"name":"operations","type":"tuple[]","internalType":"struct IRuleEntitlement.Operation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CombinedOperationType"},{"name":"index","type":"uint8","internalType":"uint8"}]},{"name":"checkOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.CheckOperation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CheckOperationType"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"contractAddress","type":"address","internalType":"address"},{"name":"threshold","type":"uint256","internalType":"uint256"}]},{"name":"logicalOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.LogicalOperation[]","components":[{"name":"logOpType","type":"uint8","internalType":"enum IRuleEntitlement.LogicalOperationType"},{"name":"leftOperationIndex","type":"uint8","internalType":"uint8"},{"name":"rightOperationIndex","type":"uint8","internalType":"uint8"}]}]}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"nonpayable"},{"type":"event","name":"EntitlementCheckResultPosted","inputs":[{"name":"transactionId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"result","type":"uint8","indexed":false,"internalType":"enum IEntitlementGatedBase.NodeVoteStatus"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"error","name":"EntitlementGated_InvalidAddress","inputs":[]},{"type":"error","name":"EntitlementGated_NodeAlreadyVoted","inputs":[]},{"type":"error","name":"EntitlementGated_NodeNotFound","inputs":[]},{"type":"error","name":"EntitlementGated_TransactionCheckAlreadyCompleted","inputs":[]},{"type":"error","name":"EntitlementGated_TransactionCheckAlreadyRegistered","inputs":[]},{"type":"error","name":"EntitlementGated_TransactionNotRegistered","inputs":[]},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"ReentrancyGuard__ReentrantCall","inputs":[]}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b5060405162001b9a38038062001b9a833981016040819052620000349162000127565b6200003e6200007f565b7f9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e0080546001600160a01b0319166001600160a01b0383161790555062000159565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff1615620000cc576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156200012457805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6000602082840312156200013a57600080fd5b81516001600160a01b03811681146200015257600080fd5b9392505050565b611a3180620001696000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063069a3ee91461005c5780634739e8051461008557806357e700271461009a5780637adc9cbe146100bb57806392c399ff146100ce575b600080fd5b61006f61006a366004610e1e565b6100e1565b60405161007c9190610f28565b60405180910390f35b610098610093366004610fd8565b610314565b005b6100ad6100a8366004611011565b6103b8565b60405190815260200161007c565b6100986100c9366004611074565b610426565b61006f6100dc366004611091565b61047c565b61010560405180606001604052806060815260200160608152602001606081525090565b6000828152602081815260408083208151815460809481028201850190935260608101838152909491938593919285929185015b828210156101a257600084815260209020604080518082019091529083018054829060ff16600281111561016f5761016f610e37565b600281111561018057610180610e37565b81529054610100900460ff166020918201529082526001929092019101610139565b50505050815260200160018201805480602002602001604051908101604052809291908181526020016000905b8282101561025a576000848152602090206040805160808101909152600484029091018054829060ff16600581111561020a5761020a610e37565b600581111561021b5761021b610e37565b815260018281015460208084019190915260028401546001600160a01b03166040840152600390930154606090920191909152918352920191016101cf565b50505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156103065760008481526020902060408051606081019091529083018054829060ff1660028111156102be576102be610e37565b60028111156102cf576102cf610e37565b8152905460ff6101008204811660208085019190915262010000909204166040909201919091529082526001929092019101610287565b505050915250909392505050565b60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a00540361035657604051635db5c7cd60e11b815260040160405180910390fd5b61037f60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b61038a8383836104aa565b6103b360017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b505050565b600082815260208190526040812082906103d2828261140a565b50506040516bffffffffffffffffffffffff193260601b16602082015243603482015260009060540160405160208183030381529060405280519060200120905061041f81306000610743565b9392505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661047057604051630ef4733760e31b815260040160405180910390fd5b610479816109f2565b50565b6104a060405180606001604052806060815260200160608152602001606081525090565b61041f8383610a2d565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919061010090046001600160a01b031615806104f45750805460ff16155b1561051257604051637ad5a43960e11b815260040160405180910390fd5b600084815260028201602052604090205460ff161561054457604051637912b73960e01b815260040160405180910390fd5b600084815260018201602052604081205481908190815b8181101561068257600089815260018701602052604081208054839081106105855761058561150e565b60009182526020909120018054909150336001600160a01b03909116036106115760008154600160a01b900460ff1660028111156105c5576105c5610e37565b146105e3576040516347592a4d60e01b815260040160405180910390fd5b80548990829060ff60a01b1916600160a01b83600281111561060757610607610e37565b0217905550600195505b60018154600160a01b900460ff16600281111561063057610630610e37565b03610647578461063f81611524565b955050610679565b60028154600160a01b900460ff16600281111561066657610666610e37565b03610679578361067581611524565b9450505b5060010161055b565b50836106a157604051638223a7e960e01b815260040160405180910390fd5b6106ac60028261153d565b8311806106c257506106bf60028261153d565b82115b156107385760008881526002860160205260408120805460ff191660011790558284116106f05760026106f3565b60015b9050897fb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c63382604051610725919061155f565b60405180910390a26107368a610b27565b505b505050505050505050565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919060ff1615156001036107d55760005b60048201548110156107d357838260040182815481106107a2576107a261150e565b9060005260206000200154036107cb576040516301ab53df60e31b815260040160405180910390fd5b600101610780565b505b81546001600160a01b03166107ec576107ec610bfb565b8154604051634f84544560e01b8152600560048201526000916001600160a01b031690634f84544590602401600060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085d9190810190611636565b825490915060ff1661089e5781546003830180546001600160a01b0319166001600160a01b0388161790556001600160a81b03191661010033021760011782555b600482018054600181018255600091825260208220018590555b815181101561098e5782600101600086815260200190815260200160002060405180604001604052808484815181106108f3576108f361150e565b60200260200101516001600160a01b031681526020016000600281111561091c5761091c610e37565b9052815460018101835560009283526020928390208251910180546001600160a01b031981166001600160a01b03909316928317825593830151929390929183916001600160a81b03191617600160a01b83600281111561097f5761097f610e37565b021790555050506001016108b8565b50825460405163541da4e560e01b81526001600160a01b039091169063541da4e5906109c49033908a90899087906004016116ca565b600060405180830381600087803b1580156109de57600080fd5b505af1158015610736573d6000803e3d6000fd5b610a02636afd38fd60e11b610ccc565b6000805160206119f183398151915280546001600160a01b0319166001600160a01b03831617905550565b610a5160405180606001604052806060815260200160608152602001606081525090565b6000838152600080516020611a118339815191526020526040812080546000805160206119f18339815191529260ff90911615159003610aa457604051637ad5a43960e11b815260040160405180910390fd5b600381015460405163069a3ee960e01b8152600481018690526001600160a01b0390911690600090829063069a3ee990602401600060405180830381865afa158015610af4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b1c9190810190611893565b979650505050505050565b6000818152600080516020611a11833981519152602052604081206000805160206119f1833981519152915b6004820154811015610ba757816001016000836004018381548110610b7a57610b7a61150e565b906000526020600020015481526020019081526020016000206000610b9f9190610daa565b600101610b53565b50610bb6600482016000610dc8565b6000838152600183016020526040812080546001600160a81b03191681556003810180546001600160a01b031916905590610bf46004830182610dc8565b5050505050565b60006000805160206119f1833981519152905060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60060060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad91906119d3565b82546001600160a01b0319166001600160a01b03919091161790915550565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610d59576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610d72565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b50805460008255906000526020600020908101906104799190610de6565b50805460008255906000526020600020908101906104799190610e09565b5b80821115610e055780546001600160a81b0319168155600101610de7565b5090565b5b80821115610e055760008155600101610e0a565b600060208284031215610e3057600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b6003811061047957610479610e37565b60008151808452602080850194506020840160005b83811015610ec7578151805160068110610e8e57610e8e610e37565b885280840151848901526040808201516001600160a01b0316908901526060908101519088015260809096019590820190600101610e72565b509495945050505050565b60008151808452602080850194506020840160005b83811015610ec75781518051610efc81610e4d565b88528084015160ff908116858a0152604091820151169088015260609096019590820190600101610ee7565b6020808252825160608383015280516080840181905260009291820190839060a08601905b80831015610f845783518051610f6281610e4d565b835285015160ff16858301529284019260019290920191604090910190610f4d565b50838701519350601f19925082868203016040870152610fa48185610e5d565b93505050604085015181858403016060860152610fc18382610ed2565b9695505050505050565b6003811061047957600080fd5b600080600060608486031215610fed57600080fd5b8335925060208401359150604084013561100681610fcb565b809150509250925092565b6000806040838503121561102457600080fd5b82359150602083013567ffffffffffffffff81111561104257600080fd5b83016060818603121561105457600080fd5b809150509250929050565b6001600160a01b038116811461047957600080fd5b60006020828403121561108657600080fd5b813561041f8161105f565b600080604083850312156110a457600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60ff8116811461047957600080fd5b81356110f981610fcb565b61110281610e4d565b60ff1982541660ff82168117835550506020820135611120816110df565b815461ff001916600882901b61ff0016178255505050565b6000808335601e1984360301811261114f57600080fd5b83018035915067ffffffffffffffff82111561116a57600080fd5b6020019150600781901b360382131561118257600080fd5b9250929050565b6006811061047957600080fd5b81356111a181611189565b600681106111b1576111b1610e37565b60ff1982541660ff8216811783555050602082013560018201556002810160408301356111dd8161105f565b81546001600160a01b0319166001600160a01b03919091161790556060919091013560039190910155565b600160401b83111561121c5761121c6110b3565b80548382558084101561129a5760026001600160fe1b038281168314611244576112446110c9565b8086168614611255576112556110c9565b506000838152602081208360021b81018760021b820191505b8082101561129557828255826001830155828483015582600383015560048201915061126e565b505050505b5060008181526020812083915b858110156112cf576112b98383611196565b60809290920191600491909101906001016112a7565b505050505050565b6000808335601e198436030181126112ee57600080fd5b83018035915067ffffffffffffffff82111561130957600080fd5b602001915060608102360382131561118257600080fd5b813561132b81610fcb565b61133481610e4d565b60ff1982541660ff82168117835550506020820135611352816110df565b815461ff001916600882901b61ff0016178255506040820135611374816110df565b815462ff0000191660109190911b62ff00001617905550565b600160401b8311156113a1576113a16110b3565b8054838255808410156113d8576000828152602081208581019083015b808210156113d4578282556001820191506113be565b5050505b5060008181526020812083915b858110156112cf576113f78383611320565b60609290920191600191820191016113e5565b8135601e1983360301811261141e57600080fd5b8201803567ffffffffffffffff81111561143757600080fd5b6020820191508060061b360382131561144f57600080fd5b600160401b811115611463576114636110b3565b82548184558082101561149a576000848152602081208381019083015b8082101561149657828255600182019150611480565b5050505b5060008381526020902060005b828110156114cc576114b984836110ee565b60409390930192600191820191016114a7565b505050506114dd6020830183611138565b6114eb818360018601611208565b50506114fa60408301836112d7565b61150881836002860161138d565b50505050565b634e487b7160e01b600052603260045260246000fd5b600060018201611536576115366110c9565b5060010190565b60008261155a57634e487b7160e01b600052601260045260246000fd5b500490565b6020810161156c83610e4d565b91905290565b6040516080810167ffffffffffffffff81118282101715611595576115956110b3565b60405290565b6040516060810167ffffffffffffffff81118282101715611595576115956110b3565b6040805190810167ffffffffffffffff81118282101715611595576115956110b3565b604051601f8201601f1916810167ffffffffffffffff8111828210171561160a5761160a6110b3565b604052919050565b600067ffffffffffffffff82111561162c5761162c6110b3565b5060051b60200190565b6000602080838503121561164957600080fd5b825167ffffffffffffffff81111561166057600080fd5b8301601f8101851361167157600080fd5b805161168461167f82611612565b6115e1565b81815260059190911b820183019083810190878311156116a357600080fd5b928401925b82841015610b1c5783516116bb8161105f565b825292840192908401906116a8565b60006080820160018060a01b03808816845260208760208601528660408601526080606086015282865180855260a08701915060208801945060005b81811015611724578551851683529483019491830191600101611706565b50909a9950505050505050505050565b600082601f83011261174557600080fd5b8151602061175561167f83611612565b82815260079290921b8401810191818101908684111561177457600080fd5b8286015b848110156117d957608081890312156117915760008081fd5b611799611572565b81516117a481611189565b815281850151858201526040808301516117bd8161105f565b9082015260608281015190820152835291830191608001611778565b509695505050505050565b600082601f8301126117f557600080fd5b8151602061180561167f83611612565b8281526060928302850182019282820191908785111561182457600080fd5b8387015b858110156118865781818a0312156118405760008081fd5b61184861159b565b815161185381610fcb565b815281860151611862816110df565b81870152604082810151611875816110df565b908201528452928401928101611828565b5090979650505050505050565b600060208083850312156118a657600080fd5b825167ffffffffffffffff808211156118be57600080fd5b90840190606082870312156118d257600080fd5b6118da61159b565b8251828111156118e957600080fd5b8301601f810188136118fa57600080fd5b805161190861167f82611612565b81815260069190911b8201860190868101908a83111561192757600080fd5b928701925b8284101561197d576040848c0312156119455760008081fd5b61194d6115be565b845161195881610fcb565b815284890151611967816110df565b818a01528252604093909301929087019061192c565b8452505050828401518281111561199357600080fd5b61199f88828601611734565b858301525060408301519350818411156119b857600080fd5b6119c4878585016117e4565b60408201529695505050505050565b6000602082840312156119e557600080fd5b815161041f8161105f56fe9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e01","sourceMap":"353:932:247:-:0;;;520:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;385:22:49;:20;:22::i;:::-;469:66:179;1368:72:178;;-1:-1:-1;;;;;;1368:72:178;-1:-1:-1;;;;;1368:72:178;;;;;520:83:247;353:932;;1653:314:63;303:66:64;1779:14:63;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:63;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:63;1898:16;1886:28;;;;;1927:29;;481:42:376;;;1927:29:63;;469:2:376;454:18;1927:29:63;;;;;;;1844:119;1694:273;1653:314::o;14:318:376:-;112:6;165:2;153:9;144:7;140:23;136:32;133:52;;;181:1;178;171:12;133:52;207:16;;-1:-1:-1;;;;;252:31:376;;242:42;;232:70;;298:1;295;288:12;232:70;321:5;14:318;-1:-1:-1;;;14:318:376:o;337:192::-;353:932:247;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063069a3ee91461005c5780634739e8051461008557806357e700271461009a5780637adc9cbe146100bb57806392c399ff146100ce575b600080fd5b61006f61006a366004610e1e565b6100e1565b60405161007c9190610f28565b60405180910390f35b610098610093366004610fd8565b610314565b005b6100ad6100a8366004611011565b6103b8565b60405190815260200161007c565b6100986100c9366004611074565b610426565b61006f6100dc366004611091565b61047c565b61010560405180606001604052806060815260200160608152602001606081525090565b6000828152602081815260408083208151815460809481028201850190935260608101838152909491938593919285929185015b828210156101a257600084815260209020604080518082019091529083018054829060ff16600281111561016f5761016f610e37565b600281111561018057610180610e37565b81529054610100900460ff166020918201529082526001929092019101610139565b50505050815260200160018201805480602002602001604051908101604052809291908181526020016000905b8282101561025a576000848152602090206040805160808101909152600484029091018054829060ff16600581111561020a5761020a610e37565b600581111561021b5761021b610e37565b815260018281015460208084019190915260028401546001600160a01b03166040840152600390930154606090920191909152918352920191016101cf565b50505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156103065760008481526020902060408051606081019091529083018054829060ff1660028111156102be576102be610e37565b60028111156102cf576102cf610e37565b8152905460ff6101008204811660208085019190915262010000909204166040909201919091529082526001929092019101610287565b505050915250909392505050565b60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a00540361035657604051635db5c7cd60e11b815260040160405180910390fd5b61037f60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b61038a8383836104aa565b6103b360017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b505050565b600082815260208190526040812082906103d2828261140a565b50506040516bffffffffffffffffffffffff193260601b16602082015243603482015260009060540160405160208183030381529060405280519060200120905061041f81306000610743565b9392505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661047057604051630ef4733760e31b815260040160405180910390fd5b610479816109f2565b50565b6104a060405180606001604052806060815260200160608152602001606081525090565b61041f8383610a2d565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919061010090046001600160a01b031615806104f45750805460ff16155b1561051257604051637ad5a43960e11b815260040160405180910390fd5b600084815260028201602052604090205460ff161561054457604051637912b73960e01b815260040160405180910390fd5b600084815260018201602052604081205481908190815b8181101561068257600089815260018701602052604081208054839081106105855761058561150e565b60009182526020909120018054909150336001600160a01b03909116036106115760008154600160a01b900460ff1660028111156105c5576105c5610e37565b146105e3576040516347592a4d60e01b815260040160405180910390fd5b80548990829060ff60a01b1916600160a01b83600281111561060757610607610e37565b0217905550600195505b60018154600160a01b900460ff16600281111561063057610630610e37565b03610647578461063f81611524565b955050610679565b60028154600160a01b900460ff16600281111561066657610666610e37565b03610679578361067581611524565b9450505b5060010161055b565b50836106a157604051638223a7e960e01b815260040160405180910390fd5b6106ac60028261153d565b8311806106c257506106bf60028261153d565b82115b156107385760008881526002860160205260408120805460ff191660011790558284116106f05760026106f3565b60015b9050897fb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c63382604051610725919061155f565b60405180910390a26107368a610b27565b505b505050505050505050565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919060ff1615156001036107d55760005b60048201548110156107d357838260040182815481106107a2576107a261150e565b9060005260206000200154036107cb576040516301ab53df60e31b815260040160405180910390fd5b600101610780565b505b81546001600160a01b03166107ec576107ec610bfb565b8154604051634f84544560e01b8152600560048201526000916001600160a01b031690634f84544590602401600060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085d9190810190611636565b825490915060ff1661089e5781546003830180546001600160a01b0319166001600160a01b0388161790556001600160a81b03191661010033021760011782555b600482018054600181018255600091825260208220018590555b815181101561098e5782600101600086815260200190815260200160002060405180604001604052808484815181106108f3576108f361150e565b60200260200101516001600160a01b031681526020016000600281111561091c5761091c610e37565b9052815460018101835560009283526020928390208251910180546001600160a01b031981166001600160a01b03909316928317825593830151929390929183916001600160a81b03191617600160a01b83600281111561097f5761097f610e37565b021790555050506001016108b8565b50825460405163541da4e560e01b81526001600160a01b039091169063541da4e5906109c49033908a90899087906004016116ca565b600060405180830381600087803b1580156109de57600080fd5b505af1158015610736573d6000803e3d6000fd5b610a02636afd38fd60e11b610ccc565b6000805160206119f183398151915280546001600160a01b0319166001600160a01b03831617905550565b610a5160405180606001604052806060815260200160608152602001606081525090565b6000838152600080516020611a118339815191526020526040812080546000805160206119f18339815191529260ff90911615159003610aa457604051637ad5a43960e11b815260040160405180910390fd5b600381015460405163069a3ee960e01b8152600481018690526001600160a01b0390911690600090829063069a3ee990602401600060405180830381865afa158015610af4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b1c9190810190611893565b979650505050505050565b6000818152600080516020611a11833981519152602052604081206000805160206119f1833981519152915b6004820154811015610ba757816001016000836004018381548110610b7a57610b7a61150e565b906000526020600020015481526020019081526020016000206000610b9f9190610daa565b600101610b53565b50610bb6600482016000610dc8565b6000838152600183016020526040812080546001600160a81b03191681556003810180546001600160a01b031916905590610bf46004830182610dc8565b5050505050565b60006000805160206119f1833981519152905060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60060060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad91906119d3565b82546001600160a01b0319166001600160a01b03919091161790915550565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610d59576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610d72565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b50805460008255906000526020600020908101906104799190610de6565b50805460008255906000526020600020908101906104799190610e09565b5b80821115610e055780546001600160a81b0319168155600101610de7565b5090565b5b80821115610e055760008155600101610e0a565b600060208284031215610e3057600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b6003811061047957610479610e37565b60008151808452602080850194506020840160005b83811015610ec7578151805160068110610e8e57610e8e610e37565b885280840151848901526040808201516001600160a01b0316908901526060908101519088015260809096019590820190600101610e72565b509495945050505050565b60008151808452602080850194506020840160005b83811015610ec75781518051610efc81610e4d565b88528084015160ff908116858a0152604091820151169088015260609096019590820190600101610ee7565b6020808252825160608383015280516080840181905260009291820190839060a08601905b80831015610f845783518051610f6281610e4d565b835285015160ff16858301529284019260019290920191604090910190610f4d565b50838701519350601f19925082868203016040870152610fa48185610e5d565b93505050604085015181858403016060860152610fc18382610ed2565b9695505050505050565b6003811061047957600080fd5b600080600060608486031215610fed57600080fd5b8335925060208401359150604084013561100681610fcb565b809150509250925092565b6000806040838503121561102457600080fd5b82359150602083013567ffffffffffffffff81111561104257600080fd5b83016060818603121561105457600080fd5b809150509250929050565b6001600160a01b038116811461047957600080fd5b60006020828403121561108657600080fd5b813561041f8161105f565b600080604083850312156110a457600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60ff8116811461047957600080fd5b81356110f981610fcb565b61110281610e4d565b60ff1982541660ff82168117835550506020820135611120816110df565b815461ff001916600882901b61ff0016178255505050565b6000808335601e1984360301811261114f57600080fd5b83018035915067ffffffffffffffff82111561116a57600080fd5b6020019150600781901b360382131561118257600080fd5b9250929050565b6006811061047957600080fd5b81356111a181611189565b600681106111b1576111b1610e37565b60ff1982541660ff8216811783555050602082013560018201556002810160408301356111dd8161105f565b81546001600160a01b0319166001600160a01b03919091161790556060919091013560039190910155565b600160401b83111561121c5761121c6110b3565b80548382558084101561129a5760026001600160fe1b038281168314611244576112446110c9565b8086168614611255576112556110c9565b506000838152602081208360021b81018760021b820191505b8082101561129557828255826001830155828483015582600383015560048201915061126e565b505050505b5060008181526020812083915b858110156112cf576112b98383611196565b60809290920191600491909101906001016112a7565b505050505050565b6000808335601e198436030181126112ee57600080fd5b83018035915067ffffffffffffffff82111561130957600080fd5b602001915060608102360382131561118257600080fd5b813561132b81610fcb565b61133481610e4d565b60ff1982541660ff82168117835550506020820135611352816110df565b815461ff001916600882901b61ff0016178255506040820135611374816110df565b815462ff0000191660109190911b62ff00001617905550565b600160401b8311156113a1576113a16110b3565b8054838255808410156113d8576000828152602081208581019083015b808210156113d4578282556001820191506113be565b5050505b5060008181526020812083915b858110156112cf576113f78383611320565b60609290920191600191820191016113e5565b8135601e1983360301811261141e57600080fd5b8201803567ffffffffffffffff81111561143757600080fd5b6020820191508060061b360382131561144f57600080fd5b600160401b811115611463576114636110b3565b82548184558082101561149a576000848152602081208381019083015b8082101561149657828255600182019150611480565b5050505b5060008381526020902060005b828110156114cc576114b984836110ee565b60409390930192600191820191016114a7565b505050506114dd6020830183611138565b6114eb818360018601611208565b50506114fa60408301836112d7565b61150881836002860161138d565b50505050565b634e487b7160e01b600052603260045260246000fd5b600060018201611536576115366110c9565b5060010190565b60008261155a57634e487b7160e01b600052601260045260246000fd5b500490565b6020810161156c83610e4d565b91905290565b6040516080810167ffffffffffffffff81118282101715611595576115956110b3565b60405290565b6040516060810167ffffffffffffffff81118282101715611595576115956110b3565b6040805190810167ffffffffffffffff81118282101715611595576115956110b3565b604051601f8201601f1916810167ffffffffffffffff8111828210171561160a5761160a6110b3565b604052919050565b600067ffffffffffffffff82111561162c5761162c6110b3565b5060051b60200190565b6000602080838503121561164957600080fd5b825167ffffffffffffffff81111561166057600080fd5b8301601f8101851361167157600080fd5b805161168461167f82611612565b6115e1565b81815260059190911b820183019083810190878311156116a357600080fd5b928401925b82841015610b1c5783516116bb8161105f565b825292840192908401906116a8565b60006080820160018060a01b03808816845260208760208601528660408601526080606086015282865180855260a08701915060208801945060005b81811015611724578551851683529483019491830191600101611706565b50909a9950505050505050505050565b600082601f83011261174557600080fd5b8151602061175561167f83611612565b82815260079290921b8401810191818101908684111561177457600080fd5b8286015b848110156117d957608081890312156117915760008081fd5b611799611572565b81516117a481611189565b815281850151858201526040808301516117bd8161105f565b9082015260608281015190820152835291830191608001611778565b509695505050505050565b600082601f8301126117f557600080fd5b8151602061180561167f83611612565b8281526060928302850182019282820191908785111561182457600080fd5b8387015b858110156118865781818a0312156118405760008081fd5b61184861159b565b815161185381610fcb565b815281860151611862816110df565b81870152604082810151611875816110df565b908201528452928401928101611828565b5090979650505050505050565b600060208083850312156118a657600080fd5b825167ffffffffffffffff808211156118be57600080fd5b90840190606082870312156118d257600080fd5b6118da61159b565b8251828111156118e957600080fd5b8301601f810188136118fa57600080fd5b805161190861167f82611612565b81815260069190911b8201860190868101908a83111561192757600080fd5b928701925b8284101561197d576040848c0312156119455760008081fd5b61194d6115be565b845161195881610fcb565b815284890151611967816110df565b818a01528252604093909301929087019061192c565b8452505050828401518281111561199357600080fd5b61199f88828601611734565b858301525060408301519350818411156119b857600080fd5b6119c4878585016117e4565b60408201529695505050505050565b6000602082840312156119e557600080fd5b815161041f8161105f56fe9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e01","sourceMap":"353:932:247:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;753:145;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1223:205:177;;;;;;:::i;:::-;;:::i;:::-;;902:381:247;;;;;;:::i;:::-;;:::i;:::-;;;4564:25:376;;;4552:2;4537:18;902:381:247;4418:177:376;690:171:177;;;;;;:::i;:::-;;:::i;1432:182::-;;;;;;:::i;:::-;;:::i;753:145:247:-;821:32;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;821:32:247;868:17;:25;;;;;;;;;;;861:32;;;;;;;;;;;;;;;;;;;;;;;868:25;;861:32;;;;868:25;;861:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;861:32:247;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;861:32:247;;-1:-1:-1;861:32:247;;753:145;-1:-1:-1;;;753:145:247:o;1223:205:177:-;415:1:92;302:66:93;515:38:92;:66;511:117;;596:32;;-1:-1:-1;;;596:32:92;;;;;;;;;;;511:117;634:22;415:1;302:66:93;832:65:92;777:125;634:22;1365:58:177::1;1393:13;1408:6;1416;1365:27;:58::i;:::-;669:24:92::0;475:1;302:66:93;832:65:92;777:125;669:24;1223:205:177;;;:::o;902:381:247:-;1026:7;1041:25;;;;;;;;;;1069:8;;1041:36;1069:8;1041:25;:36;:::i;:::-;-1:-1:-1;;1124:41:247;;-1:-1:-1;;1141:9:247;13920:2:376;13916:15;13912:53;1124:41:247;;;13900:66:376;1152:12:247;13982::376;;;13975:28;1083:21:247;;14019:12:376;;1124:41:247;;;;;;;;;;;;1107:64;;;;;;1083:88;;1177:75;1202:13;1242:4;1250:1;1177:24;:75::i;:::-;1265:13;902:381;-1:-1:-1;;;902:381:247:o;690:171:177:-;303:66:64;1263:42:63;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:63;;;;;;;;;;;1258:100;803:53:177::1;837:18;803:33;:53::i;:::-;690:171:::0;:::o;1432:182::-;1527:32;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;1527:32:177;1574:35;1587:13;1602:6;1574:12;:35::i;2771:1911:178:-;2901:41;3024:30;;;-1:-1:-1;;;;;;;;;;;3024:30:178;;;;;3072:25;;-1:-1:-1;;;;;;;;;;;469:66:179;3024:30:178;3072:25;;;-1:-1:-1;;;;;3072:25:178;:39;;:73;;-1:-1:-1;3115:21:178;;;;:30;3072:73;3061:156;;;3167:43;;-1:-1:-1;;;3167:43:178;;;;;;;;;;;3061:156;3227:31;;;;:23;;;:31;;;;;;;;3223:110;;;3275:51;;-1:-1:-1;;;3275:51:178;;;;;;;;;;;3223:110;3420:10;3542:34;;;:26;;;:34;;;;;:41;3420:10;;;;;3590:573;3614:22;3610:1;:26;3590:573;;;3651:25;3679:34;;;:26;;;:34;;;;;:37;;3714:1;;3679:37;;;;;;:::i;:::-;;;;;;;;;;3767:13;;3679:37;;-1:-1:-1;3784:10:178;-1:-1:-1;;;;;3767:13:178;;;:27;3763:217;;3827:24;3810:13;;-1:-1:-1;;;3810:13:178;;;;:41;;;;;;;;:::i;:::-;;3806:112;;3872:35;;-1:-1:-1;;;3872:35:178;;;;;;;;;;;3806:112;3927:22;;3943:6;;3927:8;;-1:-1:-1;;;;3927:22:178;-1:-1:-1;;;3943:6:178;3927:22;;;;;;;;:::i;:::-;;;;;;3967:4;3959:12;;3763:217;4030:21;4013:13;;-1:-1:-1;;;4013:13:178;;;;:38;;;;;;;;:::i;:::-;;4009:148;;4063:8;;;;:::i;:::-;;;;4009:148;;;4107:21;4090:13;;-1:-1:-1;;;4090:13:178;;;;:38;;;;;;;;:::i;:::-;;4086:71;;4140:8;;;;:::i;:::-;;;;4086:71;-1:-1:-1;3638:3:178;;3590:573;;;;4174:5;4169:65;;4196:31;;-1:-1:-1;;;4196:31:178;;;;;;;;;;;4169:65;4260:26;4285:1;4260:22;:26;:::i;:::-;4251:6;:35;:74;;;-1:-1:-1;4299:26:178;4324:1;4299:22;:26;:::i;:::-;4290:6;:35;4251:74;4240:438;;;4340:31;;;;:23;;;:31;;;;;:38;;-1:-1:-1;;4340:38:178;4374:4;4340:38;;;4415:15;;;:79;;4473:21;4415:79;;;4441:21;4415:79;4386:108;;4603:13;4574:56;4618:11;4574:56;;;;;;:::i;:::-;;;;;;;;4638:33;4657:13;4638:18;:33::i;:::-;4332:346;4240:438;2895:1787;;;;;;2771:1911;;;:::o;1449:1318::-;1583:41;1707:30;;;-1:-1:-1;;;;;;;;;;;1707:30:178;;;;;1748:21;;-1:-1:-1;;;;;;;;;;;469:66:179;1707:30:178;1748:21;;:29;;1707:15;1748:29;1744:244;;1792:9;1787:195;1811:19;;;:26;1807:30;;1787:195;;;1884:6;1858:11;:19;;1878:1;1858:22;;;;;;;;:::i;:::-;;;;;;;;;:32;1854:120;;1911:52;;-1:-1:-1;;;1911:52:178;;;;;;;;;;;1854:120;1839:3;;1787:195;;;;1744:244;2065:21;;-1:-1:-1;;;;;2065:21:178;2053:97;;2111:32;:30;:32::i;:::-;2189:21;;:39;;-1:-1:-1;;;2189:39:178;;2226:1;2189:39;;;4564:25:376;2156:30:178;;-1:-1:-1;;;;;2189:21:178;;:36;;4537:18:376;;2189:39:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2189:39:178;;;;;;;;;;;;:::i;:::-;2240:21;;2156:72;;-1:-1:-1;2240:21:178;;2235:162;;2271:28;;2307:23;;;:37;;-1:-1:-1;;;;;;2307:37:178;-1:-1:-1;;;;;2307:37:178;;;;;-1:-1:-1;;;;;;2352:38:178;2271:28;2380:10;2352:38;;-1:-1:-1;2352:38:178;;;2235:162;2403:19;;;:32;;;;;;;-1:-1:-1;2403:32:178;;;;;;;;;;2442:189;2466:13;:20;2462:1;:24;2442:189;;;2501:11;:26;;:34;2528:6;2501:34;;;;;;;;;;;2550:66;;;;;;;;2566:13;2580:1;2566:16;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;2550:66:178;;;;;2590:24;2550:66;;;;;;;;:::i;:::-;;;2501:123;;;;;;;-1:-1:-1;2501:123:178;;;;;;;;;;;;;;-1:-1:-1;;;;;;2501:123:178;;-1:-1:-1;;;;;2501:123:178;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2501:123:178;;-1:-1:-1;;;2501:123:178;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;2488:3:178;;2442:189;;;-1:-1:-1;2637:21:178;;:125;;-1:-1:-1;;;2637:125:178;;-1:-1:-1;;;;;2637:21:178;;;;:45;;:125;;2690:10;;2708:13;;2729:6;;2743:13;;2637:125;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;865:209:177;971:50;-1:-1:-1;;;971:13:177;:50::i;:::-;-1:-1:-1;;;;;;;;;;;1368:72:178;;-1:-1:-1;;;;;;1368:72:178;-1:-1:-1;;;;;1368:72:178;;;;;690:171:177;:::o;5124:575:178:-;5220:32;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;5220:32:178;5260:41;5384:30;;;-1:-1:-1;;;;;;;;;;;5384:30:178;;;;;5425:21;;-1:-1:-1;;;;;;;;;;;469:66:179;5425:21:178;;;;:30;;;;5421:101;;5472:43;;-1:-1:-1;;;5472:43:178;;;;;;;;;;;5421:101;5575:23;;;;5650:22;;-1:-1:-1;;;5650:22:178;;;;;4564:25:376;;;-1:-1:-1;;;;;5575:23:178;;;;5528:19;;5575:23;;5650:14;;4537:18:376;;5650:22:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5650:22:178;;;;;;;;;;;;:::i;:::-;5606:66;5124:575;-1:-1:-1;;;;;;;5124:575:178:o;4686:434::-;4752:41;4876:30;;;-1:-1:-1;;;;;;;;;;;4876:30:178;;;;;-1:-1:-1;;;;;;;;;;;469:66:179;4912:129:178;4936:19;;;:26;4932:30;;4912:129;;;4984:11;:26;;:50;5011:11;:19;;5031:1;5011:22;;;;;;;;:::i;:::-;;;;;;;;;4984:50;;;;;;;;;;;;4977:57;;;;:::i;:::-;4964:3;;4912:129;;;-1:-1:-1;5046:26:178;5053:19;;;;5046:26;:::i;:::-;5085:30;;;;:15;;;:30;;;;;5078:37;;-1:-1:-1;;;;;;5078:37:178;;;;;;;;-1:-1:-1;;;;;;5078:37:178;;;5085:30;5078:37;;;;5085:30;5078:37;:::i;:::-;;;4746:374;;4686:434;:::o;5891:366::-;5948:41;-1:-1:-1;;;;;;;;;;;5948:83:178;-1:-1:-1;6037:26:178;294:66:188;6097:39:178;;;6066:117;;-1:-1:-1;;;6066:117:178;;-1:-1:-1;;;6066:117:178;;;23132:34:376;-1:-1:-1;;;;;6097:39:178;;;;6066:100;;23105:18:376;;6066:117:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6189:63;;-1:-1:-1;;;;;;6189:63:178;-1:-1:-1;;;;;6189:63:178;;;;;;;;-1:-1:-1;5891:366:178:o;452:282:66:-;-1:-1:-1;;;;;;1121:62:66;;1096:4;1121:62;;;303:66:68;1121:62:66;;;;;;;;:70;;:62;:70;510:182;;-1:-1:-1;;;;;;556:62:66;;:49;:62;;;303:66:68;556:62:66;;;;;:69;;-1:-1:-1;;556:69:66;621:4;556:69;;;510:182;;;653:32;;-1:-1:-1;;;653:32:66;;;;;;;;;;;510:182;702:27;;-1:-1:-1;;;;;;702:27:66;;;;;;;;452:282;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:180:376;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:376;;14:180;-1:-1:-1;14:180:376:o;199:127::-;260:10;255:3;251:20;248:1;241:31;291:4;288:1;281:15;315:4;312:1;305:15;331:126;425:1;418:5;415:12;405:46;;431:18;;:::i;462:807::-;529:3;567:5;561:12;594:6;589:3;582:19;620:4;649;644:3;640:14;633:21;;688:4;681:5;677:16;711:1;721:523;735:6;732:1;729:13;721:523;;;800:6;794:13;836:2;830:9;869:1;865:2;862:9;852:43;;875:18;;:::i;:::-;908:15;;963:11;;;957:18;943:12;;;936:40;999:4;1047:11;;;1041:18;-1:-1:-1;;;;;1037:44:376;1023:12;;;1016:66;1105:4;1149:11;;;1143:18;1129:12;;;1122:40;1191:4;1182:14;;;;1219:15;;;;1078:1;750:9;721:523;;;-1:-1:-1;1260:3:376;;462:807;-1:-1:-1;;;;;462:807:376:o;1274:797::-;1343:3;1381:5;1375:12;1408:6;1403:3;1396:19;1434:4;1463;1458:3;1454:14;1447:21;;1502:4;1495:5;1491:16;1525:1;1535:511;1549:6;1546:1;1543:13;1535:511;;;1614:6;1608:13;1650:2;1644:9;1666:47;1710:2;1666:47;:::i;:::-;1726:15;;1780:11;;;1774:18;1815:4;1853:21;;;1839:12;;;1832:43;1898:4;1946:11;;;1940:18;1936:27;1922:12;;;1915:49;1993:4;1984:14;;;;2021:15;;;;1571:1;1564:9;1535:511;;2076:1338;2251:2;2262:21;;;2354:13;;2403:4;2383:18;;;2376:32;2457:19;;2321:3;2306:19;;2485:22;;;2222:4;;2251:2;2565:21;;;2222:4;;2538:3;2523:19;;;2614:352;2628:6;2625:1;2622:13;2614:352;;;2693:6;2687:13;2729:2;2723:9;2745:47;2789:2;2745:47;:::i;:::-;2805:15;;2864:11;;2858:18;2878:4;2854:29;2840:12;;;2833:51;2941:15;;;;2650:1;2643:9;;;;;2913:4;2904:14;;;;2614:352;;;2618:3;3015:2;3007:6;3003:15;2997:22;2975:44;;3042:2;3038:7;3028:17;;3108:2;3096:9;3091:3;3087:19;3083:28;3076:4;3065:9;3061:20;3054:58;3135:63;3194:3;3178:14;3135:63;:::i;:::-;3121:77;;;;3247:4;3239:6;3235:17;3229:24;3319:2;3307:9;3299:6;3295:22;3291:31;3284:4;3273:9;3269:20;3262:61;3340:68;3401:6;3385:14;3340:68;:::i;:::-;3332:76;2076:1338;-1:-1:-1;;;;;;2076:1338:376:o;3419:113::-;3506:1;3499:5;3496:12;3486:40;;3522:1;3519;3512:12;3537:415;3634:6;3642;3650;3703:2;3691:9;3682:7;3678:23;3674:32;3671:52;;;3719:1;3716;3709:12;3671:52;3755:9;3742:23;3732:33;;3812:2;3801:9;3797:18;3784:32;3774:42;;3866:2;3855:9;3851:18;3838:32;3879:43;3916:5;3879:43;:::i;:::-;3941:5;3931:15;;;3537:415;;;;;:::o;3957:456::-;4054:6;4062;4115:2;4103:9;4094:7;4090:23;4086:32;4083:52;;;4131:1;4128;4121:12;4083:52;4167:9;4154:23;4144:33;;4228:2;4217:9;4213:18;4200:32;4255:18;4247:6;4244:30;4241:50;;;4287:1;4284;4277:12;4241:50;4310:22;;4366:2;4348:16;;;4344:25;4341:45;;;4382:1;4379;4372:12;4341:45;4405:2;4395:12;;;3957:456;;;;;:::o;4600:152::-;-1:-1:-1;;;;;4696:31:376;;4686:42;;4676:70;;4742:1;4739;4732:12;4757:296;4844:6;4897:2;4885:9;4876:7;4872:23;4868:32;4865:52;;;4913:1;4910;4903:12;4865:52;4952:9;4939:23;4971:52;5017:5;4971:52;:::i;5058:248::-;5126:6;5134;5187:2;5175:9;5166:7;5162:23;5158:32;5155:52;;;5203:1;5200;5193:12;5155:52;-1:-1:-1;;5226:23:376;;;5296:2;5281:18;;;5268:32;;-1:-1:-1;5058:248:376:o;5311:127::-;5372:10;5367:3;5363:20;5360:1;5353:31;5403:4;5400:1;5393:15;5427:4;5424:1;5417:15;5443:127;5504:10;5499:3;5495:20;5492:1;5485:31;5535:4;5532:1;5525:15;5559:4;5556:1;5549:15;5721:114;5805:4;5798:5;5794:16;5787:5;5784:27;5774:55;;5825:1;5822;5815:12;6025:527;6163:5;6150:19;6178:45;6215:7;6178:45;:::i;:::-;6232:52;6276:7;6232:52;:::i;:::-;6329:3;6325:8;6318:4;6312:11;6308:26;6381:3;6372:7;6368:17;6359:7;6356:30;6350:4;6343:44;;;6435:2;6428:5;6424:14;6411:28;6448:31;6471:7;6448:31;:::i;:::-;5930:11;;-1:-1:-1;;5966:19:376;5995:1;5991:13;;;6006:5;5987:25;5963:50;5950:64;;1223:205:177;;;:::o;6557:558:376:-;6663:4;6669:6;6729:11;6716:25;6823:2;6819:7;6808:8;6792:14;6788:29;6784:43;6764:18;6760:68;6750:96;;6842:1;6839;6832:12;6750:96;6869:33;;6921:20;;;-1:-1:-1;6964:18:376;6953:30;;6950:50;;;6996:1;6993;6986:12;6950:50;7029:4;7017:17;;-1:-1:-1;7080:1:376;7076:14;;;7060;7056:35;7046:46;;7043:66;;;7105:1;7102;7095:12;7043:66;6557:558;;;;;:::o;7120:117::-;7211:1;7204:5;7201:12;7191:40;;7227:1;7224;7217:12;7242:778;7390:5;7377:19;7405:49;7446:7;7405:49;:::i;:::-;7485:1;7476:7;7473:14;7463:48;;7491:18;;:::i;:::-;7556:3;7552:8;7545:4;7539:11;7535:26;7608:3;7599:7;7595:17;7586:7;7583:30;7577:4;7570:44;;;7668:2;7661:5;7657:14;7644:28;7640:1;7634:4;7630:12;7623:50;7710:1;7704:4;7700:12;7760:2;7753:5;7749:14;7736:28;7773:54;7819:7;7773:54;:::i;:::-;7862:17;;-1:-1:-1;;;;;;7858:60:376;-1:-1:-1;;;;;7920:33:376;;;;7855:99;7836:119;;8009:2;7998:14;;;;7985:28;7981:1;7971:12;;;;7964:50;7242:778::o;8025:1372::-;-1:-1:-1;;;8185:3:376;8182:29;8179:55;;;8214:18;;:::i;:::-;8263:4;8257:11;8290:3;8284:4;8277:17;8314:6;8309:3;8306:15;8303:689;;;8354:1;-1:-1:-1;;;;;8431:15:376;;;8420:27;;8410:61;;8451:18;;:::i;:::-;8511:2;8506:3;8502:12;8497:3;8494:21;8484:55;;8519:18;;:::i;:::-;8484:55;8562:1;8587:4;8583:2;8576:16;8631:4;8627:2;8617:19;8676:6;8673:1;8669:14;8663:4;8659:25;8727:3;8724:1;8720:11;8714:4;8710:22;8697:35;;8745:237;8763:2;8756:5;8753:13;8745:237;;;8838:2;8831:5;8824:17;8880:2;8876:1;8869:5;8865:13;8858:25;8923:2;8918;8911:5;8907:14;8900:26;8965:2;8961:1;8954:5;8950:13;8943:25;8789:1;8782:5;8778:13;8769:22;;8745:237;;;8749:3;;;;8303:689;-1:-1:-1;5668:1:376;5661:14;;;5705:4;5692:18;;9015:5;;9131:260;9145:3;9142:1;9139:10;9131:260;;;9191:104;9288:6;9275:11;9191:104;:::i;:::-;9330:3;9318:16;;;;;9379:1;9362:19;;;;;9164:1;9157:9;9131:260;;;9135:3;;;8025:1372;;;:::o;9402:563::-;9510:4;9516:6;9576:11;9563:25;9670:2;9666:7;9655:8;9639:14;9635:29;9631:43;9611:18;9607:68;9597:96;;9689:1;9686;9679:12;9597:96;9716:33;;9768:20;;;-1:-1:-1;9811:18:376;9800:30;;9797:50;;;9843:1;9840;9833:12;9797:50;9876:4;9864:17;;-1:-1:-1;9935:4:376;9923:17;;9907:14;9903:38;9893:49;;9890:69;;;9955:1;9952;9945:12;9970:745;10122:5;10109:19;10137:45;10174:7;10137:45;:::i;:::-;10191:52;10235:7;10191:52;:::i;:::-;10288:3;10284:8;10277:4;10271:11;10267:26;10340:3;10331:7;10327:17;10318:7;10315:30;10309:4;10302:44;;;10394:2;10387:5;10383:14;10370:28;10407:31;10430:7;10407:31;:::i;:::-;5930:11;;-1:-1:-1;;5966:19:376;5995:1;5991:13;;;6006:5;5987:25;5963:50;5950:64;;10447:58;10553:2;10546:5;10542:14;10529:28;10566:31;10589:7;10566:31;:::i;:::-;10616:11;;-1:-1:-1;;10652:22:376;10684:2;10680:16;;;;10698:8;10676:31;10649:59;10636:73;;-1:-1:-1;9970:745:376:o;10720:998::-;-1:-1:-1;;;10884:3:376;10881:29;10878:55;;;10913:18;;:::i;:::-;10962:4;10956:11;10989:3;10983:4;10976:17;11013:6;11008:3;11005:15;11002:308;;;11053:1;11067:15;;;11120:4;11107:18;;11191:14;;;;11148:17;;11218:82;11236:2;11229:5;11226:13;11218:82;;;11295:2;11288:5;11281:17;11262:1;11255:5;11251:13;11242:22;;11218:82;;;11222:3;;;11002:308;-1:-1:-1;5668:1:376;5661:14;;;5705:4;5692:18;;11333:5;;11449:263;11463:3;11460:1;11457:10;11449:263;;;11509:108;11610:6;11597:11;11509:108;:::i;:::-;11652:2;11640:15;;;;;11700:1;11683:19;;;;11475:9;11449:263;;11723:2015;11903:5;11890:19;11988:2;11984:7;11976:5;11960:14;11956:26;11952:40;11932:18;11928:65;11918:93;;12007:1;12004;11997:12;11918:93;12032:30;;12085:18;;12126;12115:30;;12112:50;;;12158:1;12155;12148:12;12112:50;12195:4;12189;12185:15;12171:29;;12251:6;12248:1;12244:14;12228;12224:35;12216:6;12212:48;12209:68;;;12273:1;12270;12263:12;12209:68;-1:-1:-1;;;12292:6:376;12289:32;12286:58;;;12324:18;;:::i;:::-;12373:4;12367:11;12400:6;12394:4;12387:20;12430:6;12422;12419:18;12416:314;;;12470:1;12484:15;;;12537:4;12524:18;;12608:17;;;;12565;;12638:82;12656:2;12649:5;12646:13;12638:82;;;12715:2;12708:5;12701:17;12682:1;12675:5;12671:13;12662:22;;12638:82;;;12642:3;;;12416:314;-1:-1:-1;5668:1:376;5661:14;;;5705:4;5692:18;;12860:1;12870:252;12884:6;12881:1;12878:13;12870:252;;;12933:94;13020:6;13007:11;12933:94;:::i;:::-;13062:2;13050:15;;;;;13110:1;13093:19;;;;12899:9;12870:252;;;12874:3;;;;13165:95;13254:4;13247:5;13243:16;13236:5;13165:95;:::i;:::-;13269:154;13409:13;13396:11;13392:1;13386:4;13382:12;13269:154;:::i;:::-;;;13468:95;13559:2;13552:5;13548:14;13541:5;13468:95;:::i;:::-;13572:160;13718:13;13703;13699:1;13693:4;13689:12;13572:160;:::i;:::-;;;11723:2015;;:::o;14042:127::-;14103:10;14098:3;14094:20;14091:1;14084:31;14134:4;14131:1;14124:15;14158:4;14155:1;14148:15;14174:135;14213:3;14234:17;;;14231:43;;14254:18;;:::i;:::-;-1:-1:-1;14301:1:376;14290:13;;14174:135::o;14314:217::-;14354:1;14380;14370:132;;14424:10;14419:3;14415:20;14412:1;14405:31;14459:4;14456:1;14449:15;14487:4;14484:1;14477:15;14370:132;-1:-1:-1;14516:9:376;;14314:217::o;14536:255::-;14688:2;14673:18;;14700:51;14744:6;14700:51;:::i;:::-;14760:25;;;14536:255;:::o;14986:253::-;15058:2;15052:9;15100:4;15088:17;;15135:18;15120:34;;15156:22;;;15117:62;15114:88;;;15182:18;;:::i;:::-;15218:2;15211:22;14986:253;:::o;15244:::-;15316:2;15310:9;15358:4;15346:17;;15393:18;15378:34;;15414:22;;;15375:62;15372:88;;;15440:18;;:::i;15502:257::-;15574:4;15568:11;;;15606:17;;15653:18;15638:34;;15674:22;;;15635:62;15632:88;;;15700:18;;:::i;15764:275::-;15835:2;15829:9;15900:2;15881:13;;-1:-1:-1;;15877:27:376;15865:40;;15935:18;15920:34;;15956:22;;;15917:62;15914:88;;;15982:18;;:::i;:::-;16018:2;16011:22;15764:275;;-1:-1:-1;15764:275:376:o;16044:183::-;16104:4;16137:18;16129:6;16126:30;16123:56;;;16159:18;;:::i;:::-;-1:-1:-1;16204:1:376;16200:14;16216:4;16196:25;;16044:183::o;16232:977::-;16327:6;16358:2;16401;16389:9;16380:7;16376:23;16372:32;16369:52;;;16417:1;16414;16407:12;16369:52;16450:9;16444:16;16483:18;16475:6;16472:30;16469:50;;;16515:1;16512;16505:12;16469:50;16538:22;;16591:4;16583:13;;16579:27;-1:-1:-1;16569:55:376;;16620:1;16617;16610:12;16569:55;16649:2;16643:9;16672:60;16688:43;16728:2;16688:43;:::i;:::-;16672:60;:::i;:::-;16766:15;;;16848:1;16844:10;;;;16836:19;;16832:28;;;16797:12;;;;16872:19;;;16869:39;;;16904:1;16901;16894:12;16869:39;16928:11;;;;16948:231;16964:6;16959:3;16956:15;16948:231;;;17037:3;17031:10;17054:52;17100:5;17054:52;:::i;:::-;17119:18;;16981:12;;;;17157;;;;16948:231;;17214:904;17440:4;17488:3;17477:9;17473:19;17528:1;17524;17519:3;17515:11;17511:19;17569:2;17561:6;17557:15;17546:9;17539:34;17592:2;17630:6;17625:2;17614:9;17610:18;17603:34;17673:6;17668:2;17657:9;17653:18;17646:34;17716:3;17711:2;17700:9;17696:18;17689:31;17740:6;17775;17769:13;17806:6;17798;17791:22;17844:3;17833:9;17829:19;17822:26;;17883:2;17875:6;17871:15;17857:29;;17904:1;17914:178;17928:6;17925:1;17922:13;17914:178;;;17993:13;;17989:22;;17977:35;;18067:15;;;;18032:12;;;;17950:1;17943:9;17914:178;;;-1:-1:-1;18109:3:376;;17214:904;-1:-1:-1;;;;;;;;;;17214:904:376:o;18305:1300::-;18384:5;18437:3;18430:4;18422:6;18418:17;18414:27;18404:55;;18455:1;18452;18445:12;18404:55;18484:6;18478:13;18510:4;18534:60;18550:43;18590:2;18550:43;:::i;18534:60::-;18628:15;;;18714:1;18710:10;;;;18698:23;;18694:32;;;18659:12;;;;18738:15;;;18735:35;;;18766:1;18763;18756:12;18735:35;18802:2;18794:6;18790:15;18814:762;18830:6;18825:3;18822:15;18814:762;;;18908:4;18902:3;18897;18893:13;18889:24;18886:114;;;18954:1;18983:2;18979;18972:14;18886:114;19026:22;;:::i;:::-;19082:3;19076:10;19099:49;19140:7;19099:49;:::i;:::-;19161:22;;19225:12;;;19219:19;19203:14;;;19196:43;19262:2;19298:12;;;19292:19;19324:54;19292:19;19324:54;:::i;:::-;19398:14;;;19391:31;19445:2;19489:12;;;19483:19;19467:14;;;19460:43;19516:18;;19554:12;;;;18856:4;18847:14;18814:762;;;-1:-1:-1;19594:5:376;18305:1300;-1:-1:-1;;;;;;18305:1300:376:o;19610:1295::-;19691:5;19744:3;19737:4;19729:6;19725:17;19721:27;19711:55;;19762:1;19759;19752:12;19711:55;19791:6;19785:13;19817:4;19841:60;19857:43;19897:2;19857:43;:::i;19841:60::-;19935:15;;;19997:4;20040:13;;;20028:26;;20024:35;;;19966:12;;;;19923:3;20071:15;;;20068:35;;;20099:1;20096;20089:12;20068:35;20135:2;20127:6;20123:15;20147:729;20163:6;20158:3;20155:15;20147:729;;;20239:2;20233:3;20228;20224:13;20220:22;20217:112;;;20283:1;20312:2;20308;20301:14;20217:112;20355:22;;:::i;:::-;20411:3;20405:10;20428:45;20465:7;20428:45;:::i;:::-;20486:22;;20542:12;;;20536:19;20568:31;20536:19;20568:31;:::i;:::-;20619:14;;;20612:31;20666:2;20702:12;;;20696:19;20728:31;20696:19;20728:31;:::i;:::-;20779:14;;;20772:31;20816:18;;20854:12;;;;20180;;20147:729;;;-1:-1:-1;20894:5:376;;19610:1295;-1:-1:-1;;;;;;;19610:1295:376:o;20910:2008::-;21007:6;21038:2;21081;21069:9;21060:7;21056:23;21052:32;21049:52;;;21097:1;21094;21087:12;21049:52;21130:9;21124:16;21159:18;21200:2;21192:6;21189:14;21186:34;;;21216:1;21213;21206:12;21186:34;21239:22;;;;21295:4;21277:16;;;21273:27;21270:47;;;21313:1;21310;21303:12;21270:47;21339:22;;:::i;:::-;21392:2;21386:9;21420:2;21410:8;21407:16;21404:36;;;21436:1;21433;21426:12;21404:36;21459:17;;21507:4;21499:13;;21495:27;-1:-1:-1;21485:55:376;;21536:1;21533;21526:12;21485:55;21565:2;21559:9;21588:60;21604:43;21644:2;21604:43;:::i;21588:60::-;21682:15;;;21764:1;21760:10;;;;21752:19;;21748:28;;;21713:12;;;;21788:19;;;21785:39;;;21820:1;21817;21810:12;21785:39;21844:11;;;;21864:585;21880:6;21875:3;21872:15;21864:585;;;21962:4;21956:3;21947:7;21943:17;21939:28;21936:118;;;22008:1;22037:2;22033;22026:14;21936:118;22082:22;;:::i;:::-;22138:3;22132:10;22155:45;22192:7;22155:45;:::i;:::-;22213:24;;22271:12;;;22265:19;22297:31;22265:19;22297:31;:::i;:::-;22348:16;;;22341:33;22387:20;;21906:4;21897:14;;;;;22427:12;;;;21864:585;;;22458:20;;-1:-1:-1;;;22509:11:376;;;22503:18;22533:16;;;22530:36;;;22562:1;22559;22552:12;22530:36;22598:81;22671:7;22660:8;22656:2;22652:17;22598:81;:::i;:::-;22593:2;22586:5;22582:14;22575:105;;22719:4;22715:2;22711:13;22705:20;22689:36;;22750:2;22740:8;22737:16;22734:36;;;22766:1;22763;22756:12;22734:36;22804:83;22879:7;22868:8;22864:2;22860:17;22804:83;:::i;:::-;22797:4;22786:16;;22779:109;22790:5;20910:2008;-1:-1:-1;;;;;;20910:2008:376:o;23177:272::-;23247:6;23300:2;23288:9;23279:7;23275:23;23271:32;23268:52;;;23316:1;23313;23306:12;23268:52;23348:9;23342:16;23367:52;23413:5;23367:52;:::i","linkReferences":{}},"methodIdentifiers":{"__EntitlementGated_init(address)":"7adc9cbe","getRuleData(bytes32,uint256)":"92c399ff","getRuleData(uint256)":"069a3ee9","postEntitlementCheckResult(bytes32,uint256,uint8)":"4739e805","requestEntitlementCheck(uint256,((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]))":"57e70027"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntitlementChecker\",\"name\":\"checker\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"EntitlementGated_InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_NodeAlreadyVoted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_NodeNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_TransactionCheckAlreadyCompleted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_TransactionCheckAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_TransactionNotRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuard__ReentrantCall\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"transactionId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enum IEntitlementGatedBase.NodeVoteStatus\",\"name\":\"result\",\"type\":\"uint8\"}],\"name\":\"EntitlementCheckResultPosted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"contract IEntitlementChecker\",\"name\":\"entitlementChecker\",\"type\":\"address\"}],\"name\":\"__EntitlementGated_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getRuleData\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CombinedOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.Operation[]\",\"name\":\"operations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CheckOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"internalType\":\"struct IRuleEntitlement.CheckOperation[]\",\"name\":\"checkOperations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.LogicalOperationType\",\"name\":\"logOpType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"leftOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"rightOperationIndex\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.LogicalOperation[]\",\"name\":\"logicalOperations\",\"type\":\"tuple[]\"}],\"internalType\":\"struct IRuleEntitlement.RuleData\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"transactionId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getRuleData\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CombinedOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.Operation[]\",\"name\":\"operations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CheckOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"internalType\":\"struct IRuleEntitlement.CheckOperation[]\",\"name\":\"checkOperations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.LogicalOperationType\",\"name\":\"logOpType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"leftOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"rightOperationIndex\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.LogicalOperation[]\",\"name\":\"logicalOperations\",\"type\":\"tuple[]\"}],\"internalType\":\"struct IRuleEntitlement.RuleData\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"transactionId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"internalType\":\"enum IEntitlementGatedBase.NodeVoteStatus\",\"name\":\"result\",\"type\":\"uint8\"}],\"name\":\"postEntitlementCheckResult\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"components\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CombinedOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.Operation[]\",\"name\":\"operations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CheckOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"internalType\":\"struct IRuleEntitlement.CheckOperation[]\",\"name\":\"checkOperations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.LogicalOperationType\",\"name\":\"logOpType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"leftOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"rightOperationIndex\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.LogicalOperation[]\",\"name\":\"logicalOperations\",\"type\":\"tuple[]\"}],\"internalType\":\"struct IRuleEntitlement.RuleData\",\"name\":\"ruleData\",\"type\":\"tuple\"}],\"name\":\"requestEntitlementCheck\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/mocks/MockEntitlementGated.sol\":\"MockEntitlementGated\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/base/registry/facets/checker/IEntitlementChecker.sol\":{\"keccak256\":\"0x5c9a99c94e95a0c89b3d3310e252cd98aeafe34d87ffc0058f9b001af6f28bd1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7983b17a371e76c8681756dc10abe26f8fffd35d3d6d8773c2023f06c8600ba3\",\"dweb:/ipfs/QmSDkTctKCTaMGYF2LZ1N9YWwDTZD75XegpPyLrP694JFf\"]},\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol\":{\"keccak256\":\"0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b\",\"dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq\"]},\"contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol\":{\"keccak256\":\"0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c\",\"dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T\"]},\"contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol\":{\"keccak256\":\"0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6\",\"dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC\"]},\"contracts/src/factory/facets/registry/IImplementationRegistry.sol\":{\"keccak256\":\"0x2409b9eb86a4dc5849050d06409fd7548ac21f9bf6e7419b91dfb9226db0a3d5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://613195fc78a1a496820c5934f315c586ad33edf7608022d2ae0ea44f52529e61\",\"dweb:/ipfs/QmR8Gn11UNq2rKC5Qp7Prdk61oWhNg3UVc8KeyWCRfrEqV\"]},\"contracts/src/spaces/entitlements/IEntitlement.sol\":{\"keccak256\":\"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3\",\"dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf\"]},\"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol\":{\"keccak256\":\"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1\",\"dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97\"]},\"contracts/src/spaces/facets/gated/EntitlementGated.sol\":{\"keccak256\":\"0x69b525c004a345b89f3c784df334780a2d399b3f2058183daf65862f2d095820\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e927c722387563b909fd26cbd09cff0b5bc905a3c0c5c00b9c40c4d66bf19e70\",\"dweb:/ipfs/Qmbk5XXjzLaZJSaSSjhpEm2pyB2GSj1cDPChYdJup9wStk\"]},\"contracts/src/spaces/facets/gated/EntitlementGatedBase.sol\":{\"keccak256\":\"0x0aa9887cf58dd68d0270c85e2d7610080f35410b845c2227e4bd84356b7a2cb7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6dbdbed895fc2a53bffa3dbc1cfd4c992a096f153e6bbb7aeb9894485e7fc1a6\",\"dweb:/ipfs/QmZp76Gd8aL9pWbiTvLaiHv1w12yjN59PtYdMvoUCbfbH5\"]},\"contracts/src/spaces/facets/gated/EntitlementGatedStorage.sol\":{\"keccak256\":\"0xe997c0dd62f6ceb300729d3f56a3f25a47b40ed5946d68c5210c38941cb37eaa\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://63fcfd9f667538e8e9339534d2ddc6f7899e4179a54f3c6595e2598babb5bb9c\",\"dweb:/ipfs/QmUfKtfgW1uskEWkhhGqTjcbCqMANQoKKfTgV2ZvdAZpvJ\"]},\"contracts/src/spaces/facets/gated/IEntitlementGated.sol\":{\"keccak256\":\"0x948de1018f7f78366263a40e0f8269e10941216bd03a9996edb24a6230959e74\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://dc985539ce639f39fd68723acca6424a78deac6cec3693c9d8e1084a487c83ec\",\"dweb:/ipfs/QmQujX5rmDwhJZurp11FTiPLb7ev9swLTtdkagA8wydZiT\"]},\"contracts/src/spaces/facets/membership/MembershipStorage.sol\":{\"keccak256\":\"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee\",\"dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5\"]},\"contracts/test/mocks/MockEntitlementGated.sol\":{\"keccak256\":\"0x6150ce1c80ac5a5a06b512f794eb412446e6ba9b21b9746e06d2114fd1dcac4f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f303850697a14ea243ec90c2a514a028e9d1c319756e85d7a5985fc259b2c37a\",\"dweb:/ipfs/QmNuLXg5x4L8rEGMyfGdjVDQYoLKoVSZPQi2FGA7YJJSWv\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"contract IEntitlementChecker","name":"checker","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"EntitlementGated_InvalidAddress"},{"inputs":[],"type":"error","name":"EntitlementGated_NodeAlreadyVoted"},{"inputs":[],"type":"error","name":"EntitlementGated_NodeNotFound"},{"inputs":[],"type":"error","name":"EntitlementGated_TransactionCheckAlreadyCompleted"},{"inputs":[],"type":"error","name":"EntitlementGated_TransactionCheckAlreadyRegistered"},{"inputs":[],"type":"error","name":"EntitlementGated_TransactionNotRegistered"},{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[],"type":"error","name":"ReentrancyGuard__ReentrantCall"},{"inputs":[{"internalType":"bytes32","name":"transactionId","type":"bytes32","indexed":true},{"internalType":"enum IEntitlementGatedBase.NodeVoteStatus","name":"result","type":"uint8","indexed":false}],"type":"event","name":"EntitlementCheckResultPosted","anonymous":false},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"contract IEntitlementChecker","name":"entitlementChecker","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"__EntitlementGated_init"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getRuleData","outputs":[{"internalType":"struct IRuleEntitlement.RuleData","name":"","type":"tuple","components":[{"internalType":"struct IRuleEntitlement.Operation[]","name":"operations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CombinedOperationType","name":"opType","type":"uint8"},{"internalType":"uint8","name":"index","type":"uint8"}]},{"internalType":"struct IRuleEntitlement.CheckOperation[]","name":"checkOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CheckOperationType","name":"opType","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"threshold","type":"uint256"}]},{"internalType":"struct IRuleEntitlement.LogicalOperation[]","name":"logicalOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.LogicalOperationType","name":"logOpType","type":"uint8"},{"internalType":"uint8","name":"leftOperationIndex","type":"uint8"},{"internalType":"uint8","name":"rightOperationIndex","type":"uint8"}]}]}]},{"inputs":[{"internalType":"bytes32","name":"transactionId","type":"bytes32"},{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getRuleData","outputs":[{"internalType":"struct IRuleEntitlement.RuleData","name":"","type":"tuple","components":[{"internalType":"struct IRuleEntitlement.Operation[]","name":"operations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CombinedOperationType","name":"opType","type":"uint8"},{"internalType":"uint8","name":"index","type":"uint8"}]},{"internalType":"struct IRuleEntitlement.CheckOperation[]","name":"checkOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CheckOperationType","name":"opType","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"threshold","type":"uint256"}]},{"internalType":"struct IRuleEntitlement.LogicalOperation[]","name":"logicalOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.LogicalOperationType","name":"logOpType","type":"uint8"},{"internalType":"uint8","name":"leftOperationIndex","type":"uint8"},{"internalType":"uint8","name":"rightOperationIndex","type":"uint8"}]}]}]},{"inputs":[{"internalType":"bytes32","name":"transactionId","type":"bytes32"},{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"enum IEntitlementGatedBase.NodeVoteStatus","name":"result","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"postEntitlementCheckResult"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"struct IRuleEntitlement.RuleData","name":"ruleData","type":"tuple","components":[{"internalType":"struct IRuleEntitlement.Operation[]","name":"operations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CombinedOperationType","name":"opType","type":"uint8"},{"internalType":"uint8","name":"index","type":"uint8"}]},{"internalType":"struct IRuleEntitlement.CheckOperation[]","name":"checkOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CheckOperationType","name":"opType","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"threshold","type":"uint256"}]},{"internalType":"struct IRuleEntitlement.LogicalOperation[]","name":"logicalOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.LogicalOperationType","name":"logOpType","type":"uint8"},{"internalType":"uint8","name":"leftOperationIndex","type":"uint8"},{"internalType":"uint8","name":"rightOperationIndex","type":"uint8"}]}]}],"stateMutability":"nonpayable","type":"function","name":"requestEntitlementCheck","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/test/mocks/MockEntitlementGated.sol":"MockEntitlementGated"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/base/registry/facets/checker/IEntitlementChecker.sol":{"keccak256":"0x5c9a99c94e95a0c89b3d3310e252cd98aeafe34d87ffc0058f9b001af6f28bd1","urls":["bzz-raw://7983b17a371e76c8681756dc10abe26f8fffd35d3d6d8773c2023f06c8600ba3","dweb:/ipfs/QmSDkTctKCTaMGYF2LZ1N9YWwDTZD75XegpPyLrP694JFf"],"license":"MIT"},"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol":{"keccak256":"0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a","urls":["bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b","dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol":{"keccak256":"0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f","urls":["bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c","dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol":{"keccak256":"0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c","urls":["bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6","dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC"],"license":"Apache-2.0"},"contracts/src/factory/facets/registry/IImplementationRegistry.sol":{"keccak256":"0x2409b9eb86a4dc5849050d06409fd7548ac21f9bf6e7419b91dfb9226db0a3d5","urls":["bzz-raw://613195fc78a1a496820c5934f315c586ad33edf7608022d2ae0ea44f52529e61","dweb:/ipfs/QmR8Gn11UNq2rKC5Qp7Prdk61oWhNg3UVc8KeyWCRfrEqV"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/IEntitlement.sol":{"keccak256":"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca","urls":["bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3","dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol":{"keccak256":"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf","urls":["bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1","dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97"],"license":"MIT"},"contracts/src/spaces/facets/gated/EntitlementGated.sol":{"keccak256":"0x69b525c004a345b89f3c784df334780a2d399b3f2058183daf65862f2d095820","urls":["bzz-raw://e927c722387563b909fd26cbd09cff0b5bc905a3c0c5c00b9c40c4d66bf19e70","dweb:/ipfs/Qmbk5XXjzLaZJSaSSjhpEm2pyB2GSj1cDPChYdJup9wStk"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/EntitlementGatedBase.sol":{"keccak256":"0x0aa9887cf58dd68d0270c85e2d7610080f35410b845c2227e4bd84356b7a2cb7","urls":["bzz-raw://6dbdbed895fc2a53bffa3dbc1cfd4c992a096f153e6bbb7aeb9894485e7fc1a6","dweb:/ipfs/QmZp76Gd8aL9pWbiTvLaiHv1w12yjN59PtYdMvoUCbfbH5"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/EntitlementGatedStorage.sol":{"keccak256":"0xe997c0dd62f6ceb300729d3f56a3f25a47b40ed5946d68c5210c38941cb37eaa","urls":["bzz-raw://63fcfd9f667538e8e9339534d2ddc6f7899e4179a54f3c6595e2598babb5bb9c","dweb:/ipfs/QmUfKtfgW1uskEWkhhGqTjcbCqMANQoKKfTgV2ZvdAZpvJ"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/IEntitlementGated.sol":{"keccak256":"0x948de1018f7f78366263a40e0f8269e10941216bd03a9996edb24a6230959e74","urls":["bzz-raw://dc985539ce639f39fd68723acca6424a78deac6cec3693c9d8e1084a487c83ec","dweb:/ipfs/QmQujX5rmDwhJZurp11FTiPLb7ev9swLTtdkagA8wydZiT"],"license":"MIT"},"contracts/src/spaces/facets/membership/MembershipStorage.sol":{"keccak256":"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3","urls":["bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee","dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5"],"license":"Apache-2.0"},"contracts/test/mocks/MockEntitlementGated.sol":{"keccak256":"0x6150ce1c80ac5a5a06b512f794eb412446e6ba9b21b9746e06d2114fd1dcac4f","urls":["bzz-raw://f303850697a14ea243ec90c2a514a028e9d1c319756e85d7a5985fc259b2c37a","dweb:/ipfs/QmNuLXg5x4L8rEGMyfGdjVDQYoLKoVSZPQi2FGA7YJJSWv"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"}},"version":1},"id":247} \ No newline at end of file diff --git a/packages/generated/dev/abis/MockEntitlementGated.metadata.json b/packages/generated/dev/abis/MockEntitlementGated.metadata.json new file mode 100644 index 000000000..226834f6a --- /dev/null +++ b/packages/generated/dev/abis/MockEntitlementGated.metadata.json @@ -0,0 +1,645 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "contract IEntitlementChecker", + "name": "checker", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_InvalidAddress" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_NodeAlreadyVoted" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_NodeNotFound" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyCompleted" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyRegistered" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_TransactionNotRegistered" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [], + "type": "error", + "name": "ReentrancyGuard__ReentrantCall" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "transactionId", + "type": "bytes32", + "indexed": true + }, + { + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus", + "name": "result", + "type": "uint8", + "indexed": false + } + ], + "type": "event", + "name": "EntitlementCheckResultPosted", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "contract IEntitlementChecker", + "name": "entitlementChecker", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__EntitlementGated_init" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getRuleData", + "outputs": [ + { + "internalType": "struct IRuleEntitlement.RuleData", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "struct IRuleEntitlement.Operation[]", + "name": "operations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CombinedOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "index", + "type": "uint8" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "name": "checkOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CheckOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "name": "logicalOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.LogicalOperationType", + "name": "logOpType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "leftOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "rightOperationIndex", + "type": "uint8" + } + ] + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "transactionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getRuleData", + "outputs": [ + { + "internalType": "struct IRuleEntitlement.RuleData", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "struct IRuleEntitlement.Operation[]", + "name": "operations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CombinedOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "index", + "type": "uint8" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "name": "checkOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CheckOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "name": "logicalOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.LogicalOperationType", + "name": "logOpType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "leftOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "rightOperationIndex", + "type": "uint8" + } + ] + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "transactionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus", + "name": "result", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "postEntitlementCheckResult" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "struct IRuleEntitlement.RuleData", + "name": "ruleData", + "type": "tuple", + "components": [ + { + "internalType": "struct IRuleEntitlement.Operation[]", + "name": "operations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CombinedOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "index", + "type": "uint8" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "name": "checkOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CheckOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "name": "logicalOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.LogicalOperationType", + "name": "logOpType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "leftOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "rightOperationIndex", + "type": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "requestEntitlementCheck", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ] + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/test/mocks/MockEntitlementGated.sol": "MockEntitlementGated" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/base/registry/facets/checker/IEntitlementChecker.sol": { + "keccak256": "0x5c9a99c94e95a0c89b3d3310e252cd98aeafe34d87ffc0058f9b001af6f28bd1", + "urls": [ + "bzz-raw://7983b17a371e76c8681756dc10abe26f8fffd35d3d6d8773c2023f06c8600ba3", + "dweb:/ipfs/QmSDkTctKCTaMGYF2LZ1N9YWwDTZD75XegpPyLrP694JFf" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol": { + "keccak256": "0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a", + "urls": [ + "bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b", + "dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol": { + "keccak256": "0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f", + "urls": [ + "bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c", + "dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol": { + "keccak256": "0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c", + "urls": [ + "bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6", + "dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/registry/IImplementationRegistry.sol": { + "keccak256": "0x2409b9eb86a4dc5849050d06409fd7548ac21f9bf6e7419b91dfb9226db0a3d5", + "urls": [ + "bzz-raw://613195fc78a1a496820c5934f315c586ad33edf7608022d2ae0ea44f52529e61", + "dweb:/ipfs/QmR8Gn11UNq2rKC5Qp7Prdk61oWhNg3UVc8KeyWCRfrEqV" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/IEntitlement.sol": { + "keccak256": "0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca", + "urls": [ + "bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3", + "dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol": { + "keccak256": "0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf", + "urls": [ + "bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1", + "dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97" + ], + "license": "MIT" + }, + "contracts/src/spaces/facets/gated/EntitlementGated.sol": { + "keccak256": "0x69b525c004a345b89f3c784df334780a2d399b3f2058183daf65862f2d095820", + "urls": [ + "bzz-raw://e927c722387563b909fd26cbd09cff0b5bc905a3c0c5c00b9c40c4d66bf19e70", + "dweb:/ipfs/Qmbk5XXjzLaZJSaSSjhpEm2pyB2GSj1cDPChYdJup9wStk" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/EntitlementGatedBase.sol": { + "keccak256": "0x0aa9887cf58dd68d0270c85e2d7610080f35410b845c2227e4bd84356b7a2cb7", + "urls": [ + "bzz-raw://6dbdbed895fc2a53bffa3dbc1cfd4c992a096f153e6bbb7aeb9894485e7fc1a6", + "dweb:/ipfs/QmZp76Gd8aL9pWbiTvLaiHv1w12yjN59PtYdMvoUCbfbH5" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/EntitlementGatedStorage.sol": { + "keccak256": "0xe997c0dd62f6ceb300729d3f56a3f25a47b40ed5946d68c5210c38941cb37eaa", + "urls": [ + "bzz-raw://63fcfd9f667538e8e9339534d2ddc6f7899e4179a54f3c6595e2598babb5bb9c", + "dweb:/ipfs/QmUfKtfgW1uskEWkhhGqTjcbCqMANQoKKfTgV2ZvdAZpvJ" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/IEntitlementGated.sol": { + "keccak256": "0x948de1018f7f78366263a40e0f8269e10941216bd03a9996edb24a6230959e74", + "urls": [ + "bzz-raw://dc985539ce639f39fd68723acca6424a78deac6cec3693c9d8e1084a487c83ec", + "dweb:/ipfs/QmQujX5rmDwhJZurp11FTiPLb7ev9swLTtdkagA8wydZiT" + ], + "license": "MIT" + }, + "contracts/src/spaces/facets/membership/MembershipStorage.sol": { + "keccak256": "0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3", + "urls": [ + "bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee", + "dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5" + ], + "license": "Apache-2.0" + }, + "contracts/test/mocks/MockEntitlementGated.sol": { + "keccak256": "0x6150ce1c80ac5a5a06b512f794eb412446e6ba9b21b9746e06d2114fd1dcac4f", + "urls": [ + "bzz-raw://f303850697a14ea243ec90c2a514a028e9d1c319756e85d7a5985fc259b2c37a", + "dweb:/ipfs/QmNuLXg5x4L8rEGMyfGdjVDQYoLKoVSZPQi2FGA7YJJSWv" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/MockRiverRegistry.abi.json b/packages/generated/dev/abis/MockRiverRegistry.abi.json new file mode 100644 index 000000000..742ac42f1 --- /dev/null +++ b/packages/generated/dev/abis/MockRiverRegistry.abi.json @@ -0,0 +1,1314 @@ +[ + { + "type": "constructor", + "inputs": [ + { + "name": "approvedOperators", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__OperatorRegistry_init", + "inputs": [ + { + "name": "initialOperators", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__RiverConfig_init", + "inputs": [ + { + "name": "configManagers", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "allocateStream", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "genesisMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "genesisMiniblock", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approveConfigurationManager", + "inputs": [ + { + "name": "manager", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approveOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "configurationExists", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "deleteConfiguration", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "deleteConfigurationOnBlock", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "blockNumber", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getAllConfiguration", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct Setting[]", + "components": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "blockNumber", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllNodeAddresses", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllNodes", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct Node[]", + "components": [ + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllStreamIds", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32[]", + "internalType": "bytes32[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllStreams", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getConfiguration", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct Setting[]", + "components": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "blockNumber", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Node", + "components": [ + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNodeCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPaginatedStreams", + "inputs": [ + { + "name": "start", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "stop", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + }, + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStream", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamByIndex", + "inputs": [ + { + "name": "i", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct StreamWithId", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamWithGenesis", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + }, + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamsOnNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isConfigurationManager", + "inputs": [ + { + "name": "manager", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "placeStreamOnNode", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "registerNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeConfigurationManager", + "inputs": [ + { + "name": "manager", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeStreamFromNode", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setConfiguration", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "blockNumber", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setStreamLastMiniblock", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setStreamLastMiniblockBatch", + "inputs": [ + { + "name": "miniblocks", + "type": "tuple[]", + "internalType": "struct SetMiniblock[]", + "components": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "prevMiniBlockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "internalType": "bool" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateNodeStatus", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateNodeUrl", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "ConfigurationChanged", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "block", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + }, + { + "name": "value", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + }, + { + "name": "deleted", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConfigurationManagerAdded", + "inputs": [ + { + "name": "manager", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConfigurationManagerRemoved", + "inputs": [ + { + "name": "manager", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeAdded", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "status", + "type": "uint8", + "indexed": false, + "internalType": "enum NodeStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeRemoved", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeStatusUpdated", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "status", + "type": "uint8", + "indexed": false, + "internalType": "enum NodeStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeUrlUpdated", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "indexed": false, + "internalType": "string" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorAdded", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorRemoved", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamAllocated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "nodes", + "type": "address[]", + "indexed": false, + "internalType": "address[]" + }, + { + "name": "genesisMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "genesisMiniblock", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamLastMiniblockUpdateFailed", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + }, + { + "name": "reason", + "type": "string", + "indexed": false, + "internalType": "string" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamLastMiniblockUpdated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamPlacementUpdated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "isAdded", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/MockRiverRegistry.abi.ts b/packages/generated/dev/abis/MockRiverRegistry.abi.ts new file mode 100644 index 000000000..acdda5322 --- /dev/null +++ b/packages/generated/dev/abis/MockRiverRegistry.abi.ts @@ -0,0 +1,1314 @@ +export default [ + { + "type": "constructor", + "inputs": [ + { + "name": "approvedOperators", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__OperatorRegistry_init", + "inputs": [ + { + "name": "initialOperators", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__RiverConfig_init", + "inputs": [ + { + "name": "configManagers", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "allocateStream", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "genesisMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "genesisMiniblock", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approveConfigurationManager", + "inputs": [ + { + "name": "manager", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approveOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "configurationExists", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "deleteConfiguration", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "deleteConfigurationOnBlock", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "blockNumber", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getAllConfiguration", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct Setting[]", + "components": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "blockNumber", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllNodeAddresses", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllNodes", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct Node[]", + "components": [ + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllStreamIds", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32[]", + "internalType": "bytes32[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllStreams", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getConfiguration", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct Setting[]", + "components": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "blockNumber", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Node", + "components": [ + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNodeCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPaginatedStreams", + "inputs": [ + { + "name": "start", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "stop", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + }, + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStream", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamByIndex", + "inputs": [ + { + "name": "i", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct StreamWithId", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamWithGenesis", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + }, + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamsOnNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isConfigurationManager", + "inputs": [ + { + "name": "manager", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "placeStreamOnNode", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "registerNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeConfigurationManager", + "inputs": [ + { + "name": "manager", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeStreamFromNode", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setConfiguration", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "blockNumber", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setStreamLastMiniblock", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setStreamLastMiniblockBatch", + "inputs": [ + { + "name": "miniblocks", + "type": "tuple[]", + "internalType": "struct SetMiniblock[]", + "components": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "prevMiniBlockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "internalType": "bool" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateNodeStatus", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateNodeUrl", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "ConfigurationChanged", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "block", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + }, + { + "name": "value", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + }, + { + "name": "deleted", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConfigurationManagerAdded", + "inputs": [ + { + "name": "manager", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConfigurationManagerRemoved", + "inputs": [ + { + "name": "manager", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeAdded", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "status", + "type": "uint8", + "indexed": false, + "internalType": "enum NodeStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeRemoved", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeStatusUpdated", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "status", + "type": "uint8", + "indexed": false, + "internalType": "enum NodeStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeUrlUpdated", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "indexed": false, + "internalType": "string" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorAdded", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorRemoved", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamAllocated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "nodes", + "type": "address[]", + "indexed": false, + "internalType": "address[]" + }, + { + "name": "genesisMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "genesisMiniblock", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamLastMiniblockUpdateFailed", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + }, + { + "name": "reason", + "type": "string", + "indexed": false, + "internalType": "string" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamLastMiniblockUpdated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamPlacementUpdated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "isAdded", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/MockRiverRegistry.bin b/packages/generated/dev/abis/MockRiverRegistry.bin new file mode 100644 index 000000000..28d2c4c76 --- /dev/null +++ b/packages/generated/dev/abis/MockRiverRegistry.bin @@ -0,0 +1 @@ +60806040523480156200001157600080fd5b5060405162004e2838038062004e288339810160408190526200003491620004a6565b6200003e620000c1565b620000493362000169565b60005b8151811015620000b957620000838282815181106200006f576200006f62000578565b60200260200101516200023760201b60201c565b620000b08282815181106200009c576200009c62000578565b60200260200101516200031c60201b60201c565b6001016200004c565b5050620005df565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16156200010e576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156200016657805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b60006200019d7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b90506001600160a01b038216620001c757604051634e3ef82560e01b815260040160405180910390fd5b817f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae30080546001600160a01b0319166001600160a01b03928316179055604051838216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038116620002865760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526200027d91906004016200058e565b60405180910390fd5b62000293600882620003e9565b15620002d757604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526200027d91906004016200058e565b620002e460088262000410565b506040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b6001600160a01b038116620003625760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526200027d91906004016200058e565b6200036f600d8262000410565b620003b257604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526200027d91906004016200058e565b6040516001600160a01b038216907f7afd798379ae2d2e5035438544cea2b60eb1dde6a8128e6d447fd2a25f8825a290600090a250565b6001600160a01b038116600090815260018301602052604081205415155b90505b92915050565b600062000407836001600160a01b03841660008181526001830160205260408120546200046a575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200040a565b5060006200040a565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b0381168114620004a157600080fd5b919050565b60006020808385031215620004ba57600080fd5b82516001600160401b0380821115620004d257600080fd5b818501915085601f830112620004e757600080fd5b815181811115620004fc57620004fc62000473565b8060051b604051601f19603f8301168101818110858211171562000524576200052462000473565b6040529182528482019250838101850191888311156200054357600080fd5b938501935b828510156200056c576200055c8562000489565b8452938501939285019262000548565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020808352835180602085015260005b81811015620005be57858101830151858201604001528201620005a0565b506000604082860101526040601f19601f8301168501019250505092915050565b61483980620005ef6000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80639d20904811610125578063c179b85f116100ad578063d7a3158a1161007c578063d7a3158a146104b1578063ee885b12146104c4578063eecc66f4146104d7578063fc207c01146104ea578063ff3a14ab146104fd57600080fd5b8063c179b85f14610455578063c8fe3a0114610468578063ca78c41a1461047d578063d4bd44a01461049e57600080fd5b8063ac8a584a116100f4578063ac8a584a14610401578063b2b99ec914610414578063b7f227ee14610427578063ba428b1a1461043a578063c0f220841461044d57600080fd5b80639d209048146103a65780639ee86d38146103c6578063a09449a6146103d9578063a1174e7d146103ec57600080fd5b80633c2544d1116101a85780636d70f7ae116101775780636d70f7ae146103355780637e4465e714610358578063813049ec1461036b57806386789fc61461037e5780639283ae3a1461039357600080fd5b80633c2544d1146102cd578063581f8b9b146102ef57806368b454df146103025780636b883c391461032257600080fd5b806331374511116101e4578063313745111461027c57806332705ac41461028f57806339bf397e146102af5780633bd84c0c146102c557600080fd5b8063035759e114610216578063081814db1461022b5780631290abe814610249578063242cae9f14610269575b600080fd5b6102296102243660046139ac565b610510565b005b61023361067d565b6040516102409190613a15565b60405180910390f35b61025c6102573660046139ac565b6108e8565b6040516102409190613b30565b610229610277366004613b5f565b610a0a565b61022961028a366004613b7a565b610a51565b6102a261029d366004613b5f565b610ae2565b6040516102409190613c6f565b6102b7610d92565b604051908152602001610240565b6102a2610da3565b6102e06102db3660046139ac565b610f14565b60405161024093929190613c82565b6102296102fd366004613cc6565b6110e5565b6103156103103660046139ac565b611285565b6040516102409190613cf9565b610229610330366004613dc1565b6113ac565b610348610343366004613b5f565b611611565b6040519015158152602001610240565b610229610366366004613ea4565b611624565b610229610379366004613b5f565b61181c565b610386611917565b6040516102409190613ef1565b6102336103a13660046139ac565b611923565b6103b96103b4366004613b5f565b611a85565b6040516102409190613fc1565b6102296103d4366004613fd4565b611c06565b6102296103e736600461400e565b611dc3565b6103f4612044565b6040516102409190614094565b61022961040f366004613b5f565b612218565b610229610422366004613b5f565b61237b565b6102296104353660046140f8565b612544565b610229610448366004613b7a565b612793565b6102b761281f565b610229610463366004613b5f565b61282a565b61047061286e565b6040516102409190614160565b61049061048b366004614173565b61287a565b604051610240929190614195565b6103486104ac366004613b5f565b612a73565b6102296104bf3660046141c9565b612a80565b6102296104d2366004613fd4565b612c0b565b6102296104e5366004614219565b612e57565b6103486104f83660046139ac565b613021565b61022961050b366004614276565b61302e565b3361051c600d82613295565b61055f5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b60405180910390fd5b8161056b600a826132ba565b6105a65760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6000838152600c602052604090205415610619576000838152600c602052604090208054806105d7576105d76142eb565b60008281526020812060036000199093019283020181815560018101805467ffffffffffffffff19169055906106106002830182613857565b505090556105a6565b6000838152600c6020526040812061063091613891565b61063b600a846132d2565b506040805184815260006020820181905260808284018190528201526001606082015290516000805160206148198339815191529181900360a00190a1505050565b606060008061068c600a6132de565b905060005b818110156106cd5760006106a6600a836132e8565b6000818152600c60205260409020549091506106c29085614317565b935050600101610691565b506000826001600160401b038111156106e8576106e8613d0c565b60405190808252806020026020018201604052801561073557816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816107065790505b5090506000610744600a6132de565b90506000805b828110156108dd57600061075f600a836132e8565b6000818152600c6020908152604080832080548251818502810185019093528083529495509293909291849084015b8282101561087257600084815260209081902060408051606081018252600386029092018054835260018101546001600160401b031693830193909352600283018054929392918401916107e19061432a565b80601f016020809104026020016040519081016040528092919081815260200182805461080d9061432a565b801561085a5780601f1061082f5761010080835404028352916020019161085a565b820191906000526020600020905b81548152906001019060200180831161083d57829003601f168201915b5050505050815250508152602001906001019061078e565b50505050905060005b81518110156108cf578181815181106108965761089661435e565b60200260200101518786806108aa90614374565b9750815181106108bc576108bc61435e565b602090810291909101015260010161087b565b50505080600101905061074a565b509195945050505050565b6040805160a081018252600080825260208201819052918101829052606080820183905260808201529061091c90836132ba565b6109575760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b600082815260026020818152604092839020835160a0810185528154815260018201546001600160401b0380821683860152600160401b8204811683880152600160801b90910416606082015292810180548551818502810185019096528086529394919360808601938301828280156109fa57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109dc575b5050505050815250509050919050565b610a126132f4565b6001600160a01b0316336001600160a01b031614610a45576040516365f4906560e01b8152336004820152602401610556565b610a4e81613322565b50565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff16610a9b57604051630ef4733760e31b815260040160405180910390fd5b60005b81811015610add57610ad5838383818110610abb57610abb61435e565b9050602002016020810190610ad09190613b5f565b6133f4565b600101610a9e565b505050565b60606000610aef816132de565b6001600160401b03811115610b0657610b06613d0c565b604051908082528060200260200182016040528015610b2f578160200160208202803683370190505b5090506000805b610b4060006132de565b811015610bf5576000610b5381836132e8565b60008181526002602052604081209192505b6002820154811015610be757876001600160a01b0316826002018281548110610b9057610b9061435e565b6000918252602090912001546001600160a01b031603610bdf57828686610bb68161438d565b975063ffffffff1681518110610bce57610bce61435e565b602002602001018181525050610be7565b600101610b65565b505050806001019050610b36565b5060008163ffffffff166001600160401b03811115610c1657610c16613d0c565b604051908082528060200260200182016040528015610c4f57816020015b610c3c6138b2565b815260200190600190039081610c345790505b50905060005b8263ffffffff16811015610d89576040518060400160405280858381518110610c8057610c8061435e565b6020026020010151815260200160006002016000878581518110610ca657610ca661435e565b6020908102919091018101518252818101929092526040908101600020815160a0810183528154815260018201546001600160401b0380821683870152600160401b8204811683860152600160801b909104166060820152600282018054845181870281018701909552808552919492936080860193909290830182828015610d5857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d3a575b505050505081525050815250828281518110610d7657610d7661435e565b6020908102919091010152600101610c55565b50949350505050565b6000610d9e60056132de565b905090565b60606000610db0816132de565b6001600160401b03811115610dc757610dc7613d0c565b604051908082528060200260200182016040528015610e0057816020015b610ded6138b2565b815260200190600190039081610de55790505b50905060005b610e1060006132de565b811015610f0e576000610e2381836132e8565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015610edc57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ebe575b505050505081525050815250838381518110610efa57610efa61435e565b602090810291909101015250600101610e06565b50919050565b6040805160a081018252600080825260208201819052918101829052606080820183905260808201819052909190610f4c82856132ba565b610f875760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b600084815260026020818152604080842060048352818520546003845294829020825160a0810184528254815260018301546001600160401b0380821683880152600160401b8204811683870152600160801b9091041660608201529482018054845181870281018701909552808552929695919491938793608086019391929183018282801561104157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611023575b50505050508152505092508080546110589061432a565b80601f01602080910402602001604051908101604052809291908181526020018280546110849061432a565b80156110d15780601f106110a6576101008083540402835291602001916110d1565b820191906000526020600020905b8154815290600101906020018083116110b457829003601f168201915b505050505090509250925092509193909250565b6001600160a01b0380831660009081526007602052604090206002015483911661114557604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b33611151600882613295565b61118b5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b03808516600090815260076020526040902060030154859133911681146111e95760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038616600090815260076020526040902080546112109060ff16876134b9565b80548690829060ff1916600183600581111561122e5761122e613f35565b021790555060028101546040516001600160a01b03909116907f20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0906112749089906143b0565b60405180910390a250505050505050565b61128d6138b2565b61129760006132de565b82106112d45760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b60006112e081846132e8565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b909104166060820152918101805486518186028101860190975280875296975093958387019592949193608086019392919083018282801561139957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161137b575b5050509190925250505090529392505050565b336000818152600760205260409020600201546001600160a01b031661140857604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b6114136000866132ba565b1561145457604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b60005b84518110156114d8576114908582815181106114755761147561435e565b6020026020010151600060050161329590919063ffffffff16565b6114d057604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b600101611457565b506040805160a08101825284815260006020820181905291810182905260608101829052608081018690529061150e908761364c565b5060008681526002602081815260409283902084518155818501516001820180549587015160608801516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026fffffffffffffffffffffffffffffffff1990991691909416179690961795909516179093556080840151805185949361159e939085019201906138fc565b50505060008681526003602052604090206115b98482614423565b5060008681526004602052604090819020859055517f55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb906116019088908890889088906144dc565b60405180910390a1505050505050565b600061161e600883613295565b92915050565b33611630600882613295565b61166a5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038084166000908152600760205260409020600201548491166116ca57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b03808516600090815260076020526040902060030154859133911681146117285760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038616600090815260076020908152604091829020915161175291889101614518565b604051602081830303815290604052805190602001208160010160405160200161177c9190614534565b60405160208183030381529060405280519060200120036117cc5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b600181016117da8782614423565b5060028101546040516001600160a01b03909116907f4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac906112749089906142d8565b6118246132f4565b6001600160a01b0316336001600160a01b031614611857576040516365f4906560e01b8152336004820152602401610556565b6001600160a01b03811661189a5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b6118a5600d82613658565b6118e05760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6040516001600160a01b038216907ff9889c857e5356066b564327caa757c325ecbc001b2b47d72edf8cf9aedb1be590600090a250565b6060610d9e600061366d565b606081611931600a826132ba565b61196c5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6000838152600c6020908152604080832080548251818502810185019093528083529193909284015b82821015611a7957600084815260209081902060408051606081018252600386029092018054835260018101546001600160401b031693830193909352600283018054929392918401916119e89061432a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a149061432a565b8015611a615780601f10611a3657610100808354040283529160200191611a61565b820191906000526020600020905b815481529060010190602001808311611a4457829003601f168201915b50505050508152505081526020019060010190611995565b50505050915050919050565b611ab06040805160808101909152806000815260606020820181905260006040830181905291015290565b611abb600583613295565b611afb57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038216600090815260076020526040908190208151608081019092528054829060ff166005811115611b3657611b36613f35565b6005811115611b4757611b47613f35565b8152602001600182018054611b5b9061432a565b80601f0160208091040260200160405190810160405280929190818152602001828054611b879061432a565b8015611bd45780601f10611ba957610100808354040283529160200191611bd4565b820191906000526020600020905b815481529060010190602001808311611bb757829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015292915050565b81611c126000826132ba565b611c4d5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b03808316600090815260076020526040902060020154839116611cad57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b6000848152600260205260408120905b6002820154811015611d4657846001600160a01b0316826002018281548110611ce857611ce861435e565b6000918252602090912001546001600160a01b031603611d3e57604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b600101611cbd565b5060028101805460018082018355600092835260209283902090910180546001600160a01b0319166001600160a01b03881690811790915560408051898152938401919091528201527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f9060600160405180910390a15050505050565b33611dcf600d82613295565b611e095760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6000829003611e475760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b611e52600a866132ba565b611e6357611e61600a8661364c565b505b6000858152600c6020526040812054905b81811015611f4a576000878152600c6020526040902080546001600160401b038816919083908110611ea857611ea861435e565b60009182526020909120600160039092020101546001600160401b031603611f42576000878152600c6020526040902080548691869184908110611eee57611eee61435e565b90600052602060002090600302016002019182611f0c9291906145aa565b50600080516020614819833981519152878787876000604051611f33959493929190614663565b60405180910390a1505061203d565b600101611e74565b506000600c0160008781526020019081526020016000206040518060600160405280888152602001876001600160401b0316815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050835460018082018655948252602091829020845160039092020190815590830151938101805467ffffffffffffffff19166001600160401b039095169490941790935550604081015190919060028201906120149082614423565b505050600080516020614819833981519152868686866000604051611601959493929190614663565b5050505050565b6060600061205260056132de565b6001600160401b0381111561206957612069613d0c565b6040519080825280602002602001820160405280156120c557816020015b6120b26040805160808101909152806000815260606020820181905260006040830181905291015290565b8152602001906001900390816120875790505b50905060005b6120d560056132de565b811015610f0e57600760006120eb6005846132e8565b6001600160a01b03168152602081019190915260409081016000208151608081019092528054829060ff16600581111561212757612127613f35565b600581111561213857612138613f35565b815260200160018201805461214c9061432a565b80601f01602080910402602001604051908101604052809291908181526020018280546121789061432a565b80156121c55780601f1061219a576101008083540402835291602001916121c5565b820191906000526020600020905b8154815290600101906020018083116121a857829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015282518390839081106122055761220561435e565b60209081029190910101526001016120cb565b6122206132f4565b6001600160a01b0316336001600160a01b031614612253576040516365f4906560e01b8152336004820152602401610556565b61225e600882613295565b6122a257604080518082018252601281527113d41154905513d497d393d517d193d5539160721b6020820152905162461bcd60e51b815261055691906004016142d8565b60005b6122af60056132de565b811015612337576001600160a01b038216600760006122cf6005856132e8565b6001600160a01b039081168252602082019290925260400160002060030154160361232f57604080518082018252600d81526c4f55545f4f465f424f554e445360981b6020820152905162461bcd60e51b815261055691906004016142d8565b6001016122a5565b50612343600882613658565b506040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b6001600160a01b03808216600090815260076020526040902060030154829133911681146123d95760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038381166000908152600760205260409020600201541661243757604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b60056001600160a01b03841660009081526007602052604090205460ff16600581111561246657612466613f35565b146124af5760408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b815261055691906004016142d8565b6124ba600584613658565b506001600160a01b0383166000908152600760205260408120805460ff19168155906124e96001830182613857565b506002810180546001600160a01b03199081169091556003909101805490911690556040516001600160a01b038416907fcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b90600090a2505050565b33612550600d82613295565b61258a5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6000805b6000858152600c602052604090205481101561270b576000858152600c6020526040902080546001600160401b0386169190839081106125d0576125d061435e565b60009182526020909120600160039092020101546001600160401b031603612703576000858152600c60205260409020805461260e906001906146b3565b8154811061261e5761261e61435e565b90600052602060002090600302016000600c01600087815260200190815260200160002082815481106126535761265361435e565b600091825260209091208254600390920201908155600180830154908201805467ffffffffffffffff19166001600160401b039092169190911790556002808201906126a1908401826146c6565b5050506000858152600c602052604090208054806126c1576126c16142eb565b60008281526020812060036000199093019283020181815560018101805467ffffffffffffffff19169055906126fa6002830182613857565b50509055600191505b60010161258e565b50806127485760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b604080518581526001600160401b038516602082015260808183018190526000908201526001606082015290516000805160206148198339815191529181900360a00190a150505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166127dd57604051630ef4733760e31b815260040160405180910390fd5b60005b81811015610add576128178383838181106127fd576127fd61435e565b90506020020160208101906128129190613b5f565b613322565b6001016127e0565b6000610d9e816132de565b6128326132f4565b6001600160a01b0316336001600160a01b031614612865576040516365f4906560e01b8152336004820152602401610556565b610a4e816133f4565b6060610d9e600561366d565b60606000828410604051806040016040528060078152602001664241445f41524760c81b815250906128bf5760405162461bcd60e51b815260040161055691906142d8565b5060006128cc85856146b3565b6001600160401b038111156128e3576128e3613d0c565b60405190808252806020026020018201604052801561291c57816020015b6129096138b2565b8152602001906001900390816129015790505b50905060005b61292c60006132de565b6129368288614317565b10801561294b5750846129498288614317565b105b15612a5b57600061296761295f8389614317565b6000906132e8565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015612a2057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a02575b505050505081525050815250838381518110612a3e57612a3e61435e565b60200260200101819052505080612a5490614374565b9050612922565b5080612a6760006132de565b90969410159450505050565b600061161e600d83613295565b336000818152600760205260409020600201546001600160a01b0316612adc57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b612ae76000876132ba565b612b225760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b600086815260026020526040902084815560018101805467ffffffffffffffff19166001600160401b0386161790558215612b8a576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b836001600160401b0316600103612bb2576000878152600360205260408120612bb291613857565b60408051888152602081018790526001600160401b03861681830152841515606082015290517fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b9181900360800190a150505050505050565b81612c176000826132ba565b612c525760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b03808316600090815260076020526040902060020154839116612cb257604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b600084815260026020526040812090805b6002830154811015612dcc57856001600160a01b0316836002018281548110612cee57612cee61435e565b6000918252602090912001546001600160a01b031603612dc457600283018054612d1a906001906146b3565b81548110612d2a57612d2a61435e565b6000918252602090912001546002840180546001600160a01b039092169183908110612d5857612d5861435e565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082600201805480612d9957612d996142eb565b600082815260209020810160001990810180546001600160a01b031916905501905560019150612dcc565b600101612cc3565b5080612e0e57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b604080518781526001600160a01b03871660208201526000918101919091527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f90606001611601565b33612e63600882613295565b612e9d5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038481166000908152600760205260409020600201541615612efc57604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b60006040518060800160405280846005811115612f1b57612f1b613f35565b8152602081018690526001600160a01b0387166040820152336060909101529050612f4760058661367a565b506001600160a01b03851660009081526007602052604090208151815483929190829060ff19166001836005811115612f8257612f82613f35565b021790555060208201516001820190612f9b9082614423565b506040828101516002830180546001600160a01b03199081166001600160a01b039384161790915560609094015160039093018054909416928116929092179092559051908616907fd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e561906130129087908790614792565b60405180910390a25050505050565b600061161e600a836132ba565b336000818152600760205260409020600201546001600160a01b031661308a57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b60005b8281101561328f57368484838181106130a8576130a861435e565b60a0029190910191506130bf9050600082356132ba565b613137577f75460fe319331413a18a82d99b07735cec53fa0c4061ada38c2141e331082afa813560408301356130fb60808501606086016147b4565b60408051808201825260098152681393d517d193d5539160ba1b6020820152905161312994939291906147cf565b60405180910390a150613287565b80356000908152600260205260409081902090820135815561315f60808301606084016147b4565b60018201805467ffffffffffffffff19166001600160401b039290921691909117905561319260a08301608084016147fd565b156131ca576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b6131da60808301606084016147b4565b6001600160401b0316600103613203578135600090815260036020526040812061320391613857565b7fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b8235604084013561323b60808601606087016147b4565b61324b60a08701608088016147fd565b60405161327c949392919093845260208401929092526001600160401b031660408301521515606082015260800190565b60405180910390a150505b60010161308d565b50505050565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b600081815260018301602052604081205415156132b3565b60006132b3838361368f565b600061161e825490565b60006132b38383613782565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b6001600160a01b0381166133655760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b613370600882613295565b156133b157604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b6133bc60088261367a565b506040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b6001600160a01b0381166134375760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b613442600d8261367a565b61348257604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b6040516001600160a01b038216907f7afd798379ae2d2e5035438544cea2b60eb1dde6a8128e6d447fd2a25f8825a290600090a250565b60008260058111156134cd576134cd613f35565b1480613521575060018260058111156134e8576134e8613f35565b1480156135215750600381600581111561350457613504613f35565b14806135215750600481600581111561351f5761351f613f35565b145b806135745750600282600581111561353b5761353b613f35565b1480156135745750600381600581111561355757613557613f35565b14806135745750600481600581111561357257613572613f35565b145b806135c75750600482600581111561358e5761358e613f35565b1480156135c7575060038160058111156135aa576135aa613f35565b14806135c7575060058160058111156135c5576135c5613f35565b145b806135ff575060038260058111156135e1576135e1613f35565b1480156135ff575060058160058111156135fd576135fd613f35565b145b15613608575050565b60408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b815261055691906004016142d8565b60006132b383836137ac565b60006132b3836001600160a01b03841661368f565b606060006132b3836137fb565b60006132b3836001600160a01b0384166137ac565b600081815260018301602052604081205480156137785760006136b36001836146b3565b85549091506000906136c7906001906146b3565b905080821461372c5760008660000182815481106136e7576136e761435e565b906000526020600020015490508087600001848154811061370a5761370a61435e565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061373d5761373d6142eb565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061161e565b600091505061161e565b60008260000182815481106137995761379961435e565b9060005260206000200154905092915050565b60008181526001830160205260408120546137f35750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561161e565b50600061161e565b60608160000180548060200260200160405190810160405280929190818152602001828054801561384b57602002820191906000526020600020905b815481526020019060010190808311613837575b50505050509050919050565b5080546138639061432a565b6000825580601f10613873575050565b601f016020900490600052602060002090810190610a4e9190613961565b5080546000825560030290600052602060002090810190610a4e9190613976565b6040805180820190915260008152602081016138f76040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b905290565b828054828255906000526020600020908101928215613951579160200282015b8281111561395157825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061391c565b5061395d929150613961565b5090565b5b8082111561395d5760008155600101613962565b8082111561395d57600080825560018201805467ffffffffffffffff191690556139a36002830182613857565b50600301613976565b6000602082840312156139be57600080fd5b5035919050565b60005b838110156139e05781810151838201526020016139c8565b50506000910152565b60008151808452613a018160208601602086016139c5565b601f01601f19169290920160200192915050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015613a9157888303603f19018552815180518452878101516001600160401b0316888501528601516060878501819052613a7d818601836139e9565b968901969450505090860190600101613a3e565b509098975050505050505050565b600060a08301825184526020808401516001600160401b0380821660208801528060408701511660408801528060608701511660608801525050608084015160a0608087015282815180855260c088019150602083019450600092505b80831015613b255784516001600160a01b03168252938301936001929092019190830190613afc565b509695505050505050565b6020815260006132b36020830184613a9f565b80356001600160a01b0381168114613b5a57600080fd5b919050565b600060208284031215613b7157600080fd5b6132b382613b43565b60008060208385031215613b8d57600080fd5b82356001600160401b0380821115613ba457600080fd5b818501915085601f830112613bb857600080fd5b813581811115613bc757600080fd5b8660208260051b8501011115613bdc57600080fd5b60209290920196919550909350505050565b805182526000602082015160406020850152613c0d6040850182613a9f565b949350505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015613c6257601f19868403018952613c50838351613bee565b98840198925090830190600101613c34565b5090979650505050505050565b6020815260006132b36020830184613c15565b606081526000613c956060830186613a9f565b8460208401528281036040840152613cad81856139e9565b9695505050505050565b803560068110613b5a57600080fd5b60008060408385031215613cd957600080fd5b613ce283613b43565b9150613cf060208401613cb7565b90509250929050565b6020815260006132b36020830184613bee565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613d4a57613d4a613d0c565b604052919050565b600082601f830112613d6357600080fd5b81356001600160401b03811115613d7c57613d7c613d0c565b613d8f601f8201601f1916602001613d22565b818152846020838601011115613da457600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215613dd757600080fd5b843593506020808601356001600160401b0380821115613df657600080fd5b818801915088601f830112613e0a57600080fd5b813581811115613e1c57613e1c613d0c565b8060051b613e2b858201613d22565b918252838101850191858101908c841115613e4557600080fd5b948601945b83861015613e6a57613e5b86613b43565b82529486019490860190613e4a565b9850505050604088013594506060880135925080831115613e8a57600080fd5b5050613e9887828801613d52565b91505092959194509250565b60008060408385031215613eb757600080fd5b613ec083613b43565b915060208301356001600160401b03811115613edb57600080fd5b613ee785828601613d52565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015613f2957835183529284019291840191600101613f0d565b50909695505050505050565b634e487b7160e01b600052602160045260246000fd5b60068110613f6957634e487b7160e01b600052602160045260246000fd5b9052565b613f78828251613f4b565b6000602082015160806020850152613f9360808501826139e9565b6040848101516001600160a01b03908116918701919091526060948501511693909401929092525090919050565b6020815260006132b36020830184613f6d565b60008060408385031215613fe757600080fd5b82359150613cf060208401613b43565b80356001600160401b0381168114613b5a57600080fd5b6000806000806060858703121561402457600080fd5b8435935061403460208601613ff7565b925060408501356001600160401b038082111561405057600080fd5b818701915087601f83011261406457600080fd5b81358181111561407357600080fd5b88602082850101111561408557600080fd5b95989497505060200194505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156140eb57603f198886030184526140d9858351613f6d565b945092850192908501906001016140bd565b5092979650505050505050565b6000806040838503121561410b57600080fd5b82359150613cf060208401613ff7565b60008151808452602080850194506020840160005b838110156141555781516001600160a01b031687529582019590820190600101614130565b509495945050505050565b6020815260006132b3602083018461411b565b6000806040838503121561418657600080fd5b50508035926020909101359150565b6040815260006141a86040830185613c15565b905082151560208301529392505050565b80358015158114613b5a57600080fd5b600080600080600060a086880312156141e157600080fd5b8535945060208601359350604086013592506141ff60608701613ff7565b915061420d608087016141b9565b90509295509295909350565b60008060006060848603121561422e57600080fd5b61423784613b43565b925060208401356001600160401b0381111561425257600080fd5b61425e86828701613d52565b92505061426d60408501613cb7565b90509250925092565b6000806020838503121561428957600080fd5b82356001600160401b03808211156142a057600080fd5b818501915085601f8301126142b457600080fd5b8135818111156142c357600080fd5b86602060a083028501011115613bdc57600080fd5b6020815260006132b360208301846139e9565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561161e5761161e614301565b600181811c9082168061433e57607f821691505b602082108103610f0e57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60006001820161438657614386614301565b5060010190565b600063ffffffff8083168181036143a6576143a6614301565b6001019392505050565b6020810161161e8284613f4b565b601f821115610add576000816000526020600020601f850160051c810160208610156143e75750805b601f850160051c820191505b81811015614406578281556001016143f3565b505050505050565b600019600383901b1c191660019190911b1790565b81516001600160401b0381111561443c5761443c613d0c565b6144508161444a845461432a565b846143be565b602080601f83116001811461447f576000841561446d5750858301515b614477858261440e565b865550614406565b600085815260208120601f198616915b828110156144ae5788860151825594840194600190910190840161448f565b50858210156144cc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8481526080602082015260006144f5608083018661411b565b846040840152828103606084015261450d81856139e9565b979650505050505050565b6000825161452a8184602087016139c5565b9190910192915050565b60008083546145428161432a565b6001828116801561455a576001811461456f5761459e565b60ff198416875282151583028701945061459e565b8760005260208060002060005b858110156145955781548a82015290840190820161457c565b50505082870194505b50929695505050505050565b6001600160401b038311156145c1576145c1613d0c565b6145d5836145cf835461432a565b836143be565b6000601f84116001811461460357600085156145f15750838201355b6145fb868261440e565b84555061203d565b600083815260209020601f19861690835b828110156146345786850135825560209485019460019092019101614614565b50868210156146515760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8581526001600160401b038516602082015260806040820152826080820152828460a0830137600081840160a0908101919091529115156060820152601f909201601f1916909101019392505050565b8181038181111561161e5761161e614301565b8181036146d1575050565b6146db825461432a565b6001600160401b038111156146f2576146f2613d0c565b6147008161444a845461432a565b6000601f82116001811461472e576000831561471c5750848201545b614726848261440e565b85555061203d565b600085815260209020601f19841690600086815260209020845b838110156147685782860154825560019586019590910190602001614748565b50858310156144cc5793015460001960f8600387901b161c19169092555050600190811b01905550565b6040815260006147a560408301856139e9565b90506132b36020830184613f4b565b6000602082840312156147c657600080fd5b6132b382613ff7565b8481528360208201526001600160401b0383166040820152608060608201526000613cad60808301846139e9565b60006020828403121561480f57600080fd5b6132b3826141b956fec01483261a841a868b99cb8802faed4ea44a1a816651c4f7ee061a96a205fe98 \ No newline at end of file diff --git a/packages/generated/dev/abis/MockRiverRegistry.json b/packages/generated/dev/abis/MockRiverRegistry.json new file mode 100644 index 000000000..6f1c89fe5 --- /dev/null +++ b/packages/generated/dev/abis/MockRiverRegistry.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"approvedOperators","type":"address[]","internalType":"address[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"__OperatorRegistry_init","inputs":[{"name":"initialOperators","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"__RiverConfig_init","inputs":[{"name":"configManagers","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"allocateStream","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"},{"name":"nodes","type":"address[]","internalType":"address[]"},{"name":"genesisMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"genesisMiniblock","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"approveConfigurationManager","inputs":[{"name":"manager","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"approveOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"configurationExists","inputs":[{"name":"key","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"deleteConfiguration","inputs":[{"name":"key","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"deleteConfigurationOnBlock","inputs":[{"name":"key","type":"bytes32","internalType":"bytes32"},{"name":"blockNumber","type":"uint64","internalType":"uint64"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getAllConfiguration","inputs":[],"outputs":[{"name":"","type":"tuple[]","internalType":"struct Setting[]","components":[{"name":"key","type":"bytes32","internalType":"bytes32"},{"name":"blockNumber","type":"uint64","internalType":"uint64"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"stateMutability":"view"},{"type":"function","name":"getAllNodeAddresses","inputs":[],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"getAllNodes","inputs":[],"outputs":[{"name":"","type":"tuple[]","internalType":"struct Node[]","components":[{"name":"status","type":"uint8","internalType":"enum NodeStatus"},{"name":"url","type":"string","internalType":"string"},{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}]}],"stateMutability":"view"},{"type":"function","name":"getAllStreamIds","inputs":[],"outputs":[{"name":"","type":"bytes32[]","internalType":"bytes32[]"}],"stateMutability":"view"},{"type":"function","name":"getAllStreams","inputs":[],"outputs":[{"name":"","type":"tuple[]","internalType":"struct StreamWithId[]","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"stream","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}]}],"stateMutability":"view"},{"type":"function","name":"getConfiguration","inputs":[{"name":"key","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct Setting[]","components":[{"name":"key","type":"bytes32","internalType":"bytes32"},{"name":"blockNumber","type":"uint64","internalType":"uint64"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"stateMutability":"view"},{"type":"function","name":"getNode","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","internalType":"struct Node","components":[{"name":"status","type":"uint8","internalType":"enum NodeStatus"},{"name":"url","type":"string","internalType":"string"},{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}]}],"stateMutability":"view"},{"type":"function","name":"getNodeCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getPaginatedStreams","inputs":[{"name":"start","type":"uint256","internalType":"uint256"},{"name":"stop","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct StreamWithId[]","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"stream","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}]},{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getStream","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}],"stateMutability":"view"},{"type":"function","name":"getStreamByIndex","inputs":[{"name":"i","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct StreamWithId","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"stream","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}]}],"stateMutability":"view"},{"type":"function","name":"getStreamCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getStreamWithGenesis","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]},{"name":"","type":"bytes32","internalType":"bytes32"},{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getStreamsOnNode","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct StreamWithId[]","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"stream","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}]}],"stateMutability":"view"},{"type":"function","name":"isConfigurationManager","inputs":[{"name":"manager","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"placeStreamOnNode","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"},{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"registerNode","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"url","type":"string","internalType":"string"},{"name":"status","type":"uint8","internalType":"enum NodeStatus"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeConfigurationManager","inputs":[{"name":"manager","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeNode","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeStreamFromNode","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"},{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setConfiguration","inputs":[{"name":"key","type":"bytes32","internalType":"bytes32"},{"name":"blockNumber","type":"uint64","internalType":"uint64"},{"name":"value","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setStreamLastMiniblock","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"},{"name":"","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"isSealed","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setStreamLastMiniblockBatch","inputs":[{"name":"miniblocks","type":"tuple[]","internalType":"struct SetMiniblock[]","components":[{"name":"streamId","type":"bytes32","internalType":"bytes32"},{"name":"prevMiniBlockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"isSealed","type":"bool","internalType":"bool"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateNodeStatus","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"status","type":"uint8","internalType":"enum NodeStatus"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateNodeUrl","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"url","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"ConfigurationChanged","inputs":[{"name":"key","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"block","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"value","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"deleted","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"ConfigurationManagerAdded","inputs":[{"name":"manager","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ConfigurationManagerRemoved","inputs":[{"name":"manager","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"NodeAdded","inputs":[{"name":"nodeAddress","type":"address","indexed":true,"internalType":"address"},{"name":"url","type":"string","indexed":false,"internalType":"string"},{"name":"status","type":"uint8","indexed":false,"internalType":"enum NodeStatus"}],"anonymous":false},{"type":"event","name":"NodeRemoved","inputs":[{"name":"nodeAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"NodeStatusUpdated","inputs":[{"name":"nodeAddress","type":"address","indexed":true,"internalType":"address"},{"name":"status","type":"uint8","indexed":false,"internalType":"enum NodeStatus"}],"anonymous":false},{"type":"event","name":"NodeUrlUpdated","inputs":[{"name":"nodeAddress","type":"address","indexed":true,"internalType":"address"},{"name":"url","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"OperatorAdded","inputs":[{"name":"operatorAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OperatorRemoved","inputs":[{"name":"operatorAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"StreamAllocated","inputs":[{"name":"streamId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"nodes","type":"address[]","indexed":false,"internalType":"address[]"},{"name":"genesisMiniblockHash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"genesisMiniblock","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"StreamLastMiniblockUpdateFailed","inputs":[{"name":"streamId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"lastMiniblockHash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"reason","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"StreamLastMiniblockUpdated","inputs":[{"name":"streamId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"lastMiniblockHash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"isSealed","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"StreamPlacementUpdated","inputs":[{"name":"streamId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"nodeAddress","type":"address","indexed":false,"internalType":"address"},{"name":"isAdded","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b5060405162004e2838038062004e288339810160408190526200003491620004a6565b6200003e620000c1565b620000493362000169565b60005b8151811015620000b957620000838282815181106200006f576200006f62000578565b60200260200101516200023760201b60201c565b620000b08282815181106200009c576200009c62000578565b60200260200101516200031c60201b60201c565b6001016200004c565b5050620005df565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16156200010e576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156200016657805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b60006200019d7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b90506001600160a01b038216620001c757604051634e3ef82560e01b815260040160405180910390fd5b817f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae30080546001600160a01b0319166001600160a01b03928316179055604051838216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038116620002865760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526200027d91906004016200058e565b60405180910390fd5b62000293600882620003e9565b15620002d757604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526200027d91906004016200058e565b620002e460088262000410565b506040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b6001600160a01b038116620003625760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526200027d91906004016200058e565b6200036f600d8262000410565b620003b257604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526200027d91906004016200058e565b6040516001600160a01b038216907f7afd798379ae2d2e5035438544cea2b60eb1dde6a8128e6d447fd2a25f8825a290600090a250565b6001600160a01b038116600090815260018301602052604081205415155b90505b92915050565b600062000407836001600160a01b03841660008181526001830160205260408120546200046a575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200040a565b5060006200040a565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b0381168114620004a157600080fd5b919050565b60006020808385031215620004ba57600080fd5b82516001600160401b0380821115620004d257600080fd5b818501915085601f830112620004e757600080fd5b815181811115620004fc57620004fc62000473565b8060051b604051601f19603f8301168101818110858211171562000524576200052462000473565b6040529182528482019250838101850191888311156200054357600080fd5b938501935b828510156200056c576200055c8562000489565b8452938501939285019262000548565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020808352835180602085015260005b81811015620005be57858101830151858201604001528201620005a0565b506000604082860101526040601f19601f8301168501019250505092915050565b61483980620005ef6000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80639d20904811610125578063c179b85f116100ad578063d7a3158a1161007c578063d7a3158a146104b1578063ee885b12146104c4578063eecc66f4146104d7578063fc207c01146104ea578063ff3a14ab146104fd57600080fd5b8063c179b85f14610455578063c8fe3a0114610468578063ca78c41a1461047d578063d4bd44a01461049e57600080fd5b8063ac8a584a116100f4578063ac8a584a14610401578063b2b99ec914610414578063b7f227ee14610427578063ba428b1a1461043a578063c0f220841461044d57600080fd5b80639d209048146103a65780639ee86d38146103c6578063a09449a6146103d9578063a1174e7d146103ec57600080fd5b80633c2544d1116101a85780636d70f7ae116101775780636d70f7ae146103355780637e4465e714610358578063813049ec1461036b57806386789fc61461037e5780639283ae3a1461039357600080fd5b80633c2544d1146102cd578063581f8b9b146102ef57806368b454df146103025780636b883c391461032257600080fd5b806331374511116101e4578063313745111461027c57806332705ac41461028f57806339bf397e146102af5780633bd84c0c146102c557600080fd5b8063035759e114610216578063081814db1461022b5780631290abe814610249578063242cae9f14610269575b600080fd5b6102296102243660046139ac565b610510565b005b61023361067d565b6040516102409190613a15565b60405180910390f35b61025c6102573660046139ac565b6108e8565b6040516102409190613b30565b610229610277366004613b5f565b610a0a565b61022961028a366004613b7a565b610a51565b6102a261029d366004613b5f565b610ae2565b6040516102409190613c6f565b6102b7610d92565b604051908152602001610240565b6102a2610da3565b6102e06102db3660046139ac565b610f14565b60405161024093929190613c82565b6102296102fd366004613cc6565b6110e5565b6103156103103660046139ac565b611285565b6040516102409190613cf9565b610229610330366004613dc1565b6113ac565b610348610343366004613b5f565b611611565b6040519015158152602001610240565b610229610366366004613ea4565b611624565b610229610379366004613b5f565b61181c565b610386611917565b6040516102409190613ef1565b6102336103a13660046139ac565b611923565b6103b96103b4366004613b5f565b611a85565b6040516102409190613fc1565b6102296103d4366004613fd4565b611c06565b6102296103e736600461400e565b611dc3565b6103f4612044565b6040516102409190614094565b61022961040f366004613b5f565b612218565b610229610422366004613b5f565b61237b565b6102296104353660046140f8565b612544565b610229610448366004613b7a565b612793565b6102b761281f565b610229610463366004613b5f565b61282a565b61047061286e565b6040516102409190614160565b61049061048b366004614173565b61287a565b604051610240929190614195565b6103486104ac366004613b5f565b612a73565b6102296104bf3660046141c9565b612a80565b6102296104d2366004613fd4565b612c0b565b6102296104e5366004614219565b612e57565b6103486104f83660046139ac565b613021565b61022961050b366004614276565b61302e565b3361051c600d82613295565b61055f5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b60405180910390fd5b8161056b600a826132ba565b6105a65760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6000838152600c602052604090205415610619576000838152600c602052604090208054806105d7576105d76142eb565b60008281526020812060036000199093019283020181815560018101805467ffffffffffffffff19169055906106106002830182613857565b505090556105a6565b6000838152600c6020526040812061063091613891565b61063b600a846132d2565b506040805184815260006020820181905260808284018190528201526001606082015290516000805160206148198339815191529181900360a00190a1505050565b606060008061068c600a6132de565b905060005b818110156106cd5760006106a6600a836132e8565b6000818152600c60205260409020549091506106c29085614317565b935050600101610691565b506000826001600160401b038111156106e8576106e8613d0c565b60405190808252806020026020018201604052801561073557816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816107065790505b5090506000610744600a6132de565b90506000805b828110156108dd57600061075f600a836132e8565b6000818152600c6020908152604080832080548251818502810185019093528083529495509293909291849084015b8282101561087257600084815260209081902060408051606081018252600386029092018054835260018101546001600160401b031693830193909352600283018054929392918401916107e19061432a565b80601f016020809104026020016040519081016040528092919081815260200182805461080d9061432a565b801561085a5780601f1061082f5761010080835404028352916020019161085a565b820191906000526020600020905b81548152906001019060200180831161083d57829003601f168201915b5050505050815250508152602001906001019061078e565b50505050905060005b81518110156108cf578181815181106108965761089661435e565b60200260200101518786806108aa90614374565b9750815181106108bc576108bc61435e565b602090810291909101015260010161087b565b50505080600101905061074a565b509195945050505050565b6040805160a081018252600080825260208201819052918101829052606080820183905260808201529061091c90836132ba565b6109575760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b600082815260026020818152604092839020835160a0810185528154815260018201546001600160401b0380821683860152600160401b8204811683880152600160801b90910416606082015292810180548551818502810185019096528086529394919360808601938301828280156109fa57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109dc575b5050505050815250509050919050565b610a126132f4565b6001600160a01b0316336001600160a01b031614610a45576040516365f4906560e01b8152336004820152602401610556565b610a4e81613322565b50565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff16610a9b57604051630ef4733760e31b815260040160405180910390fd5b60005b81811015610add57610ad5838383818110610abb57610abb61435e565b9050602002016020810190610ad09190613b5f565b6133f4565b600101610a9e565b505050565b60606000610aef816132de565b6001600160401b03811115610b0657610b06613d0c565b604051908082528060200260200182016040528015610b2f578160200160208202803683370190505b5090506000805b610b4060006132de565b811015610bf5576000610b5381836132e8565b60008181526002602052604081209192505b6002820154811015610be757876001600160a01b0316826002018281548110610b9057610b9061435e565b6000918252602090912001546001600160a01b031603610bdf57828686610bb68161438d565b975063ffffffff1681518110610bce57610bce61435e565b602002602001018181525050610be7565b600101610b65565b505050806001019050610b36565b5060008163ffffffff166001600160401b03811115610c1657610c16613d0c565b604051908082528060200260200182016040528015610c4f57816020015b610c3c6138b2565b815260200190600190039081610c345790505b50905060005b8263ffffffff16811015610d89576040518060400160405280858381518110610c8057610c8061435e565b6020026020010151815260200160006002016000878581518110610ca657610ca661435e565b6020908102919091018101518252818101929092526040908101600020815160a0810183528154815260018201546001600160401b0380821683870152600160401b8204811683860152600160801b909104166060820152600282018054845181870281018701909552808552919492936080860193909290830182828015610d5857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d3a575b505050505081525050815250828281518110610d7657610d7661435e565b6020908102919091010152600101610c55565b50949350505050565b6000610d9e60056132de565b905090565b60606000610db0816132de565b6001600160401b03811115610dc757610dc7613d0c565b604051908082528060200260200182016040528015610e0057816020015b610ded6138b2565b815260200190600190039081610de55790505b50905060005b610e1060006132de565b811015610f0e576000610e2381836132e8565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015610edc57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ebe575b505050505081525050815250838381518110610efa57610efa61435e565b602090810291909101015250600101610e06565b50919050565b6040805160a081018252600080825260208201819052918101829052606080820183905260808201819052909190610f4c82856132ba565b610f875760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b600084815260026020818152604080842060048352818520546003845294829020825160a0810184528254815260018301546001600160401b0380821683880152600160401b8204811683870152600160801b9091041660608201529482018054845181870281018701909552808552929695919491938793608086019391929183018282801561104157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611023575b50505050508152505092508080546110589061432a565b80601f01602080910402602001604051908101604052809291908181526020018280546110849061432a565b80156110d15780601f106110a6576101008083540402835291602001916110d1565b820191906000526020600020905b8154815290600101906020018083116110b457829003601f168201915b505050505090509250925092509193909250565b6001600160a01b0380831660009081526007602052604090206002015483911661114557604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b33611151600882613295565b61118b5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b03808516600090815260076020526040902060030154859133911681146111e95760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038616600090815260076020526040902080546112109060ff16876134b9565b80548690829060ff1916600183600581111561122e5761122e613f35565b021790555060028101546040516001600160a01b03909116907f20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0906112749089906143b0565b60405180910390a250505050505050565b61128d6138b2565b61129760006132de565b82106112d45760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b60006112e081846132e8565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b909104166060820152918101805486518186028101860190975280875296975093958387019592949193608086019392919083018282801561139957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161137b575b5050509190925250505090529392505050565b336000818152600760205260409020600201546001600160a01b031661140857604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b6114136000866132ba565b1561145457604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b60005b84518110156114d8576114908582815181106114755761147561435e565b6020026020010151600060050161329590919063ffffffff16565b6114d057604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b600101611457565b506040805160a08101825284815260006020820181905291810182905260608101829052608081018690529061150e908761364c565b5060008681526002602081815260409283902084518155818501516001820180549587015160608801516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026fffffffffffffffffffffffffffffffff1990991691909416179690961795909516179093556080840151805185949361159e939085019201906138fc565b50505060008681526003602052604090206115b98482614423565b5060008681526004602052604090819020859055517f55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb906116019088908890889088906144dc565b60405180910390a1505050505050565b600061161e600883613295565b92915050565b33611630600882613295565b61166a5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038084166000908152600760205260409020600201548491166116ca57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b03808516600090815260076020526040902060030154859133911681146117285760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038616600090815260076020908152604091829020915161175291889101614518565b604051602081830303815290604052805190602001208160010160405160200161177c9190614534565b60405160208183030381529060405280519060200120036117cc5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b600181016117da8782614423565b5060028101546040516001600160a01b03909116907f4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac906112749089906142d8565b6118246132f4565b6001600160a01b0316336001600160a01b031614611857576040516365f4906560e01b8152336004820152602401610556565b6001600160a01b03811661189a5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b6118a5600d82613658565b6118e05760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6040516001600160a01b038216907ff9889c857e5356066b564327caa757c325ecbc001b2b47d72edf8cf9aedb1be590600090a250565b6060610d9e600061366d565b606081611931600a826132ba565b61196c5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6000838152600c6020908152604080832080548251818502810185019093528083529193909284015b82821015611a7957600084815260209081902060408051606081018252600386029092018054835260018101546001600160401b031693830193909352600283018054929392918401916119e89061432a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a149061432a565b8015611a615780601f10611a3657610100808354040283529160200191611a61565b820191906000526020600020905b815481529060010190602001808311611a4457829003601f168201915b50505050508152505081526020019060010190611995565b50505050915050919050565b611ab06040805160808101909152806000815260606020820181905260006040830181905291015290565b611abb600583613295565b611afb57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038216600090815260076020526040908190208151608081019092528054829060ff166005811115611b3657611b36613f35565b6005811115611b4757611b47613f35565b8152602001600182018054611b5b9061432a565b80601f0160208091040260200160405190810160405280929190818152602001828054611b879061432a565b8015611bd45780601f10611ba957610100808354040283529160200191611bd4565b820191906000526020600020905b815481529060010190602001808311611bb757829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015292915050565b81611c126000826132ba565b611c4d5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b03808316600090815260076020526040902060020154839116611cad57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b6000848152600260205260408120905b6002820154811015611d4657846001600160a01b0316826002018281548110611ce857611ce861435e565b6000918252602090912001546001600160a01b031603611d3e57604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b600101611cbd565b5060028101805460018082018355600092835260209283902090910180546001600160a01b0319166001600160a01b03881690811790915560408051898152938401919091528201527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f9060600160405180910390a15050505050565b33611dcf600d82613295565b611e095760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6000829003611e475760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b611e52600a866132ba565b611e6357611e61600a8661364c565b505b6000858152600c6020526040812054905b81811015611f4a576000878152600c6020526040902080546001600160401b038816919083908110611ea857611ea861435e565b60009182526020909120600160039092020101546001600160401b031603611f42576000878152600c6020526040902080548691869184908110611eee57611eee61435e565b90600052602060002090600302016002019182611f0c9291906145aa565b50600080516020614819833981519152878787876000604051611f33959493929190614663565b60405180910390a1505061203d565b600101611e74565b506000600c0160008781526020019081526020016000206040518060600160405280888152602001876001600160401b0316815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050835460018082018655948252602091829020845160039092020190815590830151938101805467ffffffffffffffff19166001600160401b039095169490941790935550604081015190919060028201906120149082614423565b505050600080516020614819833981519152868686866000604051611601959493929190614663565b5050505050565b6060600061205260056132de565b6001600160401b0381111561206957612069613d0c565b6040519080825280602002602001820160405280156120c557816020015b6120b26040805160808101909152806000815260606020820181905260006040830181905291015290565b8152602001906001900390816120875790505b50905060005b6120d560056132de565b811015610f0e57600760006120eb6005846132e8565b6001600160a01b03168152602081019190915260409081016000208151608081019092528054829060ff16600581111561212757612127613f35565b600581111561213857612138613f35565b815260200160018201805461214c9061432a565b80601f01602080910402602001604051908101604052809291908181526020018280546121789061432a565b80156121c55780601f1061219a576101008083540402835291602001916121c5565b820191906000526020600020905b8154815290600101906020018083116121a857829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015282518390839081106122055761220561435e565b60209081029190910101526001016120cb565b6122206132f4565b6001600160a01b0316336001600160a01b031614612253576040516365f4906560e01b8152336004820152602401610556565b61225e600882613295565b6122a257604080518082018252601281527113d41154905513d497d393d517d193d5539160721b6020820152905162461bcd60e51b815261055691906004016142d8565b60005b6122af60056132de565b811015612337576001600160a01b038216600760006122cf6005856132e8565b6001600160a01b039081168252602082019290925260400160002060030154160361232f57604080518082018252600d81526c4f55545f4f465f424f554e445360981b6020820152905162461bcd60e51b815261055691906004016142d8565b6001016122a5565b50612343600882613658565b506040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b6001600160a01b03808216600090815260076020526040902060030154829133911681146123d95760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038381166000908152600760205260409020600201541661243757604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b60056001600160a01b03841660009081526007602052604090205460ff16600581111561246657612466613f35565b146124af5760408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b815261055691906004016142d8565b6124ba600584613658565b506001600160a01b0383166000908152600760205260408120805460ff19168155906124e96001830182613857565b506002810180546001600160a01b03199081169091556003909101805490911690556040516001600160a01b038416907fcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b90600090a2505050565b33612550600d82613295565b61258a5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6000805b6000858152600c602052604090205481101561270b576000858152600c6020526040902080546001600160401b0386169190839081106125d0576125d061435e565b60009182526020909120600160039092020101546001600160401b031603612703576000858152600c60205260409020805461260e906001906146b3565b8154811061261e5761261e61435e565b90600052602060002090600302016000600c01600087815260200190815260200160002082815481106126535761265361435e565b600091825260209091208254600390920201908155600180830154908201805467ffffffffffffffff19166001600160401b039092169190911790556002808201906126a1908401826146c6565b5050506000858152600c602052604090208054806126c1576126c16142eb565b60008281526020812060036000199093019283020181815560018101805467ffffffffffffffff19169055906126fa6002830182613857565b50509055600191505b60010161258e565b50806127485760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b604080518581526001600160401b038516602082015260808183018190526000908201526001606082015290516000805160206148198339815191529181900360a00190a150505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166127dd57604051630ef4733760e31b815260040160405180910390fd5b60005b81811015610add576128178383838181106127fd576127fd61435e565b90506020020160208101906128129190613b5f565b613322565b6001016127e0565b6000610d9e816132de565b6128326132f4565b6001600160a01b0316336001600160a01b031614612865576040516365f4906560e01b8152336004820152602401610556565b610a4e816133f4565b6060610d9e600561366d565b60606000828410604051806040016040528060078152602001664241445f41524760c81b815250906128bf5760405162461bcd60e51b815260040161055691906142d8565b5060006128cc85856146b3565b6001600160401b038111156128e3576128e3613d0c565b60405190808252806020026020018201604052801561291c57816020015b6129096138b2565b8152602001906001900390816129015790505b50905060005b61292c60006132de565b6129368288614317565b10801561294b5750846129498288614317565b105b15612a5b57600061296761295f8389614317565b6000906132e8565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015612a2057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a02575b505050505081525050815250838381518110612a3e57612a3e61435e565b60200260200101819052505080612a5490614374565b9050612922565b5080612a6760006132de565b90969410159450505050565b600061161e600d83613295565b336000818152600760205260409020600201546001600160a01b0316612adc57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b612ae76000876132ba565b612b225760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b600086815260026020526040902084815560018101805467ffffffffffffffff19166001600160401b0386161790558215612b8a576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b836001600160401b0316600103612bb2576000878152600360205260408120612bb291613857565b60408051888152602081018790526001600160401b03861681830152841515606082015290517fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b9181900360800190a150505050505050565b81612c176000826132ba565b612c525760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b03808316600090815260076020526040902060020154839116612cb257604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b600084815260026020526040812090805b6002830154811015612dcc57856001600160a01b0316836002018281548110612cee57612cee61435e565b6000918252602090912001546001600160a01b031603612dc457600283018054612d1a906001906146b3565b81548110612d2a57612d2a61435e565b6000918252602090912001546002840180546001600160a01b039092169183908110612d5857612d5861435e565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082600201805480612d9957612d996142eb565b600082815260209020810160001990810180546001600160a01b031916905501905560019150612dcc565b600101612cc3565b5080612e0e57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b604080518781526001600160a01b03871660208201526000918101919091527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f90606001611601565b33612e63600882613295565b612e9d5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038481166000908152600760205260409020600201541615612efc57604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b60006040518060800160405280846005811115612f1b57612f1b613f35565b8152602081018690526001600160a01b0387166040820152336060909101529050612f4760058661367a565b506001600160a01b03851660009081526007602052604090208151815483929190829060ff19166001836005811115612f8257612f82613f35565b021790555060208201516001820190612f9b9082614423565b506040828101516002830180546001600160a01b03199081166001600160a01b039384161790915560609094015160039093018054909416928116929092179092559051908616907fd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e561906130129087908790614792565b60405180910390a25050505050565b600061161e600a836132ba565b336000818152600760205260409020600201546001600160a01b031661308a57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b60005b8281101561328f57368484838181106130a8576130a861435e565b60a0029190910191506130bf9050600082356132ba565b613137577f75460fe319331413a18a82d99b07735cec53fa0c4061ada38c2141e331082afa813560408301356130fb60808501606086016147b4565b60408051808201825260098152681393d517d193d5539160ba1b6020820152905161312994939291906147cf565b60405180910390a150613287565b80356000908152600260205260409081902090820135815561315f60808301606084016147b4565b60018201805467ffffffffffffffff19166001600160401b039290921691909117905561319260a08301608084016147fd565b156131ca576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b6131da60808301606084016147b4565b6001600160401b0316600103613203578135600090815260036020526040812061320391613857565b7fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b8235604084013561323b60808601606087016147b4565b61324b60a08701608088016147fd565b60405161327c949392919093845260208401929092526001600160401b031660408301521515606082015260800190565b60405180910390a150505b60010161308d565b50505050565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b600081815260018301602052604081205415156132b3565b60006132b3838361368f565b600061161e825490565b60006132b38383613782565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b6001600160a01b0381166133655760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b613370600882613295565b156133b157604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b6133bc60088261367a565b506040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b6001600160a01b0381166134375760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b613442600d8261367a565b61348257604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b6040516001600160a01b038216907f7afd798379ae2d2e5035438544cea2b60eb1dde6a8128e6d447fd2a25f8825a290600090a250565b60008260058111156134cd576134cd613f35565b1480613521575060018260058111156134e8576134e8613f35565b1480156135215750600381600581111561350457613504613f35565b14806135215750600481600581111561351f5761351f613f35565b145b806135745750600282600581111561353b5761353b613f35565b1480156135745750600381600581111561355757613557613f35565b14806135745750600481600581111561357257613572613f35565b145b806135c75750600482600581111561358e5761358e613f35565b1480156135c7575060038160058111156135aa576135aa613f35565b14806135c7575060058160058111156135c5576135c5613f35565b145b806135ff575060038260058111156135e1576135e1613f35565b1480156135ff575060058160058111156135fd576135fd613f35565b145b15613608575050565b60408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b815261055691906004016142d8565b60006132b383836137ac565b60006132b3836001600160a01b03841661368f565b606060006132b3836137fb565b60006132b3836001600160a01b0384166137ac565b600081815260018301602052604081205480156137785760006136b36001836146b3565b85549091506000906136c7906001906146b3565b905080821461372c5760008660000182815481106136e7576136e761435e565b906000526020600020015490508087600001848154811061370a5761370a61435e565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061373d5761373d6142eb565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061161e565b600091505061161e565b60008260000182815481106137995761379961435e565b9060005260206000200154905092915050565b60008181526001830160205260408120546137f35750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561161e565b50600061161e565b60608160000180548060200260200160405190810160405280929190818152602001828054801561384b57602002820191906000526020600020905b815481526020019060010190808311613837575b50505050509050919050565b5080546138639061432a565b6000825580601f10613873575050565b601f016020900490600052602060002090810190610a4e9190613961565b5080546000825560030290600052602060002090810190610a4e9190613976565b6040805180820190915260008152602081016138f76040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b905290565b828054828255906000526020600020908101928215613951579160200282015b8281111561395157825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061391c565b5061395d929150613961565b5090565b5b8082111561395d5760008155600101613962565b8082111561395d57600080825560018201805467ffffffffffffffff191690556139a36002830182613857565b50600301613976565b6000602082840312156139be57600080fd5b5035919050565b60005b838110156139e05781810151838201526020016139c8565b50506000910152565b60008151808452613a018160208601602086016139c5565b601f01601f19169290920160200192915050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015613a9157888303603f19018552815180518452878101516001600160401b0316888501528601516060878501819052613a7d818601836139e9565b968901969450505090860190600101613a3e565b509098975050505050505050565b600060a08301825184526020808401516001600160401b0380821660208801528060408701511660408801528060608701511660608801525050608084015160a0608087015282815180855260c088019150602083019450600092505b80831015613b255784516001600160a01b03168252938301936001929092019190830190613afc565b509695505050505050565b6020815260006132b36020830184613a9f565b80356001600160a01b0381168114613b5a57600080fd5b919050565b600060208284031215613b7157600080fd5b6132b382613b43565b60008060208385031215613b8d57600080fd5b82356001600160401b0380821115613ba457600080fd5b818501915085601f830112613bb857600080fd5b813581811115613bc757600080fd5b8660208260051b8501011115613bdc57600080fd5b60209290920196919550909350505050565b805182526000602082015160406020850152613c0d6040850182613a9f565b949350505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015613c6257601f19868403018952613c50838351613bee565b98840198925090830190600101613c34565b5090979650505050505050565b6020815260006132b36020830184613c15565b606081526000613c956060830186613a9f565b8460208401528281036040840152613cad81856139e9565b9695505050505050565b803560068110613b5a57600080fd5b60008060408385031215613cd957600080fd5b613ce283613b43565b9150613cf060208401613cb7565b90509250929050565b6020815260006132b36020830184613bee565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613d4a57613d4a613d0c565b604052919050565b600082601f830112613d6357600080fd5b81356001600160401b03811115613d7c57613d7c613d0c565b613d8f601f8201601f1916602001613d22565b818152846020838601011115613da457600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215613dd757600080fd5b843593506020808601356001600160401b0380821115613df657600080fd5b818801915088601f830112613e0a57600080fd5b813581811115613e1c57613e1c613d0c565b8060051b613e2b858201613d22565b918252838101850191858101908c841115613e4557600080fd5b948601945b83861015613e6a57613e5b86613b43565b82529486019490860190613e4a565b9850505050604088013594506060880135925080831115613e8a57600080fd5b5050613e9887828801613d52565b91505092959194509250565b60008060408385031215613eb757600080fd5b613ec083613b43565b915060208301356001600160401b03811115613edb57600080fd5b613ee785828601613d52565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015613f2957835183529284019291840191600101613f0d565b50909695505050505050565b634e487b7160e01b600052602160045260246000fd5b60068110613f6957634e487b7160e01b600052602160045260246000fd5b9052565b613f78828251613f4b565b6000602082015160806020850152613f9360808501826139e9565b6040848101516001600160a01b03908116918701919091526060948501511693909401929092525090919050565b6020815260006132b36020830184613f6d565b60008060408385031215613fe757600080fd5b82359150613cf060208401613b43565b80356001600160401b0381168114613b5a57600080fd5b6000806000806060858703121561402457600080fd5b8435935061403460208601613ff7565b925060408501356001600160401b038082111561405057600080fd5b818701915087601f83011261406457600080fd5b81358181111561407357600080fd5b88602082850101111561408557600080fd5b95989497505060200194505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156140eb57603f198886030184526140d9858351613f6d565b945092850192908501906001016140bd565b5092979650505050505050565b6000806040838503121561410b57600080fd5b82359150613cf060208401613ff7565b60008151808452602080850194506020840160005b838110156141555781516001600160a01b031687529582019590820190600101614130565b509495945050505050565b6020815260006132b3602083018461411b565b6000806040838503121561418657600080fd5b50508035926020909101359150565b6040815260006141a86040830185613c15565b905082151560208301529392505050565b80358015158114613b5a57600080fd5b600080600080600060a086880312156141e157600080fd5b8535945060208601359350604086013592506141ff60608701613ff7565b915061420d608087016141b9565b90509295509295909350565b60008060006060848603121561422e57600080fd5b61423784613b43565b925060208401356001600160401b0381111561425257600080fd5b61425e86828701613d52565b92505061426d60408501613cb7565b90509250925092565b6000806020838503121561428957600080fd5b82356001600160401b03808211156142a057600080fd5b818501915085601f8301126142b457600080fd5b8135818111156142c357600080fd5b86602060a083028501011115613bdc57600080fd5b6020815260006132b360208301846139e9565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561161e5761161e614301565b600181811c9082168061433e57607f821691505b602082108103610f0e57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60006001820161438657614386614301565b5060010190565b600063ffffffff8083168181036143a6576143a6614301565b6001019392505050565b6020810161161e8284613f4b565b601f821115610add576000816000526020600020601f850160051c810160208610156143e75750805b601f850160051c820191505b81811015614406578281556001016143f3565b505050505050565b600019600383901b1c191660019190911b1790565b81516001600160401b0381111561443c5761443c613d0c565b6144508161444a845461432a565b846143be565b602080601f83116001811461447f576000841561446d5750858301515b614477858261440e565b865550614406565b600085815260208120601f198616915b828110156144ae5788860151825594840194600190910190840161448f565b50858210156144cc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8481526080602082015260006144f5608083018661411b565b846040840152828103606084015261450d81856139e9565b979650505050505050565b6000825161452a8184602087016139c5565b9190910192915050565b60008083546145428161432a565b6001828116801561455a576001811461456f5761459e565b60ff198416875282151583028701945061459e565b8760005260208060002060005b858110156145955781548a82015290840190820161457c565b50505082870194505b50929695505050505050565b6001600160401b038311156145c1576145c1613d0c565b6145d5836145cf835461432a565b836143be565b6000601f84116001811461460357600085156145f15750838201355b6145fb868261440e565b84555061203d565b600083815260209020601f19861690835b828110156146345786850135825560209485019460019092019101614614565b50868210156146515760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8581526001600160401b038516602082015260806040820152826080820152828460a0830137600081840160a0908101919091529115156060820152601f909201601f1916909101019392505050565b8181038181111561161e5761161e614301565b8181036146d1575050565b6146db825461432a565b6001600160401b038111156146f2576146f2613d0c565b6147008161444a845461432a565b6000601f82116001811461472e576000831561471c5750848201545b614726848261440e565b85555061203d565b600085815260209020601f19841690600086815260209020845b838110156147685782860154825560019586019590910190602001614748565b50858310156144cc5793015460001960f8600387901b161c19169092555050600190811b01905550565b6040815260006147a560408301856139e9565b90506132b36020830184613f4b565b6000602082840312156147c657600080fd5b6132b382613ff7565b8481528360208201526001600160401b0383166040820152608060608201526000613cad60808301846139e9565b60006020828403121561480f57600080fd5b6132b3826141b956fec01483261a841a868b99cb8802faed4ea44a1a816651c4f7ee061a96a205fe98","sourceMap":"560:732:48:-:0;;;1030:260;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;385:22:16;:20;:22::i;:::-;1084:30:48;1103:10;1084:18;:30::i;:::-;1125:9;1120:166;1144:17;:24;1140:1;:28;1120:166;;;1183:38;1200:17;1218:1;1200:20;;;;;;;;:::i;:::-;;;;;;;1183:16;;;:38;;:::i;:::-;1229:50;1258:17;1276:1;1258:20;;;;;;;;:::i;:::-;;;;;;;1229:28;;;:50;;:::i;:::-;1170:3;;1120:166;;;;1030:260;560:732;;1653:314:21;303:66:22;1779:14:21;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:21;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:21;1898:16;1886:28;;;;;1927:29;;1738:42:84;;;1927:29:21;;1726:2:84;1711:18;1927:29:21;;;;;;;1844:119;1694:273;1653:314::o;483:253:31:-;544:16;563:8;291:66:33;445:29:31;-1:-1:-1;;;;;445:29:31;;376:103;563:8;544:27;-1:-1:-1;;;;;;581:22:31;;577:57;;612:22;;-1:-1:-1;;;612:22:31;;;;;;;;;;;577:57;672:8;291:66:33;640:40:31;;-1:-1:-1;;;;;;640:40:31;-1:-1:-1;;;;;640:40:31;;;;;;691;;;;;;;;;;;-1:-1:-1;;691:40:31;538:198;483:253;:::o;2005:320:42:-;-1:-1:-1;;;;;2101:22:42;;2097:63;;2132:27;;;;;;;;;;;-1:-1:-1;;;2132:27:42;;;;2125:35;;-1:-1:-1;;;2125:35:42;;;;2132:27;2125:35;;;:::i;:::-;;;;;;;;2097:63;2171:31;:12;2193:8;2171:21;:31::i;:::-;2167:85;;;2217:34;;;;;;;;;;;-1:-1:-1;;;2217:34:42;;;;2210:42;;-1:-1:-1;;;2210:42:42;;;;2217:34;2210:42;;;:::i;2167:85::-;2259:26;:12;2276:8;2259:16;:26::i;:::-;-1:-1:-1;2297:23:42;;-1:-1:-1;;;;;2297:23:42;;;;;;;;2005:320;:::o;5944:282:38:-;-1:-1:-1;;;;;6018:21:38;;6014:62;;6048:27;;;;;;;;;;;-1:-1:-1;;;6048:27:38;;;;6041:35;;-1:-1:-1;;;6041:35:38;;;;6048:27;6041:35;;;:::i;6014:62::-;6088:37;:24;6117:7;6088:28;:37::i;:::-;6083:92;;6140:34;;;;;;;;;;;-1:-1:-1;;;6140:34:38;;;;6133:42;;-1:-1:-1;;;6133:42:38;;;;6140:34;6133:42;;;:::i;6083:92::-;6187:34;;-1:-1:-1;;;;;6187:34:38;;;;;;;;5944:282;:::o;8871:165:61:-;-1:-1:-1;;;;;9004:23:61;;8951:4;4360:21;;;:14;;;:21;;;;;;:26;;8974:55;8967:62;;8871:165;;;;;:::o;8316:150::-;8386:4;8409:50;8414:3;-1:-1:-1;;;;;8434:23:61;;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:61;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:61;2618:12;;14:127:84;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:177;225:13;;-1:-1:-1;;;;;267:31:84;;257:42;;247:70;;313:1;310;303:12;247:70;146:177;;;:::o;328:1129::-;423:6;454:2;497;485:9;476:7;472:23;468:32;465:52;;;513:1;510;503:12;465:52;540:16;;-1:-1:-1;;;;;605:14:84;;;602:34;;;632:1;629;622:12;602:34;670:6;659:9;655:22;645:32;;715:7;708:4;704:2;700:13;696:27;686:55;;737:1;734;727:12;686:55;766:2;760:9;788:2;784;781:10;778:36;;;794:18;;:::i;:::-;840:2;837:1;833:10;872:2;866:9;935:2;931:7;926:2;922;918:11;914:25;906:6;902:38;990:6;978:10;975:22;970:2;958:10;955:18;952:46;949:72;;;1001:18;;:::i;:::-;1037:2;1030:22;1087:18;;;1121:15;;;;-1:-1:-1;1163:11:84;;;1159:20;;;1191:19;;;1188:39;;;1223:1;1220;1213:12;1188:39;1247:11;;;;1267:159;1283:6;1278:3;1275:15;1267:159;;;1349:34;1379:3;1349:34;:::i;:::-;1337:47;;1300:12;;;;1404;;;;1267:159;;;1445:6;328:1129;-1:-1:-1;;;;;;;;328:1129:84:o;1462:127::-;1523:10;1518:3;1514:20;1511:1;1504:31;1554:4;1551:1;1544:15;1578:4;1575:1;1568:15;1791:548;1903:4;1932:2;1961;1950:9;1943:21;1993:6;1987:13;2036:6;2031:2;2020:9;2016:18;2009:34;2061:1;2071:140;2085:6;2082:1;2079:13;2071:140;;;2180:14;;;2176:23;;2170:30;2146:17;;;2165:2;2142:26;2135:66;2100:10;;2071:140;;;2075:3;2260:1;2255:2;2246:6;2235:9;2231:22;2227:31;2220:42;2330:2;2323;2319:7;2314:2;2306:6;2302:15;2298:29;2287:9;2283:45;2279:54;2271:62;;;;1791:548;;;;:::o;:::-;560:732:48;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106102115760003560e01c80639d20904811610125578063c179b85f116100ad578063d7a3158a1161007c578063d7a3158a146104b1578063ee885b12146104c4578063eecc66f4146104d7578063fc207c01146104ea578063ff3a14ab146104fd57600080fd5b8063c179b85f14610455578063c8fe3a0114610468578063ca78c41a1461047d578063d4bd44a01461049e57600080fd5b8063ac8a584a116100f4578063ac8a584a14610401578063b2b99ec914610414578063b7f227ee14610427578063ba428b1a1461043a578063c0f220841461044d57600080fd5b80639d209048146103a65780639ee86d38146103c6578063a09449a6146103d9578063a1174e7d146103ec57600080fd5b80633c2544d1116101a85780636d70f7ae116101775780636d70f7ae146103355780637e4465e714610358578063813049ec1461036b57806386789fc61461037e5780639283ae3a1461039357600080fd5b80633c2544d1146102cd578063581f8b9b146102ef57806368b454df146103025780636b883c391461032257600080fd5b806331374511116101e4578063313745111461027c57806332705ac41461028f57806339bf397e146102af5780633bd84c0c146102c557600080fd5b8063035759e114610216578063081814db1461022b5780631290abe814610249578063242cae9f14610269575b600080fd5b6102296102243660046139ac565b610510565b005b61023361067d565b6040516102409190613a15565b60405180910390f35b61025c6102573660046139ac565b6108e8565b6040516102409190613b30565b610229610277366004613b5f565b610a0a565b61022961028a366004613b7a565b610a51565b6102a261029d366004613b5f565b610ae2565b6040516102409190613c6f565b6102b7610d92565b604051908152602001610240565b6102a2610da3565b6102e06102db3660046139ac565b610f14565b60405161024093929190613c82565b6102296102fd366004613cc6565b6110e5565b6103156103103660046139ac565b611285565b6040516102409190613cf9565b610229610330366004613dc1565b6113ac565b610348610343366004613b5f565b611611565b6040519015158152602001610240565b610229610366366004613ea4565b611624565b610229610379366004613b5f565b61181c565b610386611917565b6040516102409190613ef1565b6102336103a13660046139ac565b611923565b6103b96103b4366004613b5f565b611a85565b6040516102409190613fc1565b6102296103d4366004613fd4565b611c06565b6102296103e736600461400e565b611dc3565b6103f4612044565b6040516102409190614094565b61022961040f366004613b5f565b612218565b610229610422366004613b5f565b61237b565b6102296104353660046140f8565b612544565b610229610448366004613b7a565b612793565b6102b761281f565b610229610463366004613b5f565b61282a565b61047061286e565b6040516102409190614160565b61049061048b366004614173565b61287a565b604051610240929190614195565b6103486104ac366004613b5f565b612a73565b6102296104bf3660046141c9565b612a80565b6102296104d2366004613fd4565b612c0b565b6102296104e5366004614219565b612e57565b6103486104f83660046139ac565b613021565b61022961050b366004614276565b61302e565b3361051c600d82613295565b61055f5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b60405180910390fd5b8161056b600a826132ba565b6105a65760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6000838152600c602052604090205415610619576000838152600c602052604090208054806105d7576105d76142eb565b60008281526020812060036000199093019283020181815560018101805467ffffffffffffffff19169055906106106002830182613857565b505090556105a6565b6000838152600c6020526040812061063091613891565b61063b600a846132d2565b506040805184815260006020820181905260808284018190528201526001606082015290516000805160206148198339815191529181900360a00190a1505050565b606060008061068c600a6132de565b905060005b818110156106cd5760006106a6600a836132e8565b6000818152600c60205260409020549091506106c29085614317565b935050600101610691565b506000826001600160401b038111156106e8576106e8613d0c565b60405190808252806020026020018201604052801561073557816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816107065790505b5090506000610744600a6132de565b90506000805b828110156108dd57600061075f600a836132e8565b6000818152600c6020908152604080832080548251818502810185019093528083529495509293909291849084015b8282101561087257600084815260209081902060408051606081018252600386029092018054835260018101546001600160401b031693830193909352600283018054929392918401916107e19061432a565b80601f016020809104026020016040519081016040528092919081815260200182805461080d9061432a565b801561085a5780601f1061082f5761010080835404028352916020019161085a565b820191906000526020600020905b81548152906001019060200180831161083d57829003601f168201915b5050505050815250508152602001906001019061078e565b50505050905060005b81518110156108cf578181815181106108965761089661435e565b60200260200101518786806108aa90614374565b9750815181106108bc576108bc61435e565b602090810291909101015260010161087b565b50505080600101905061074a565b509195945050505050565b6040805160a081018252600080825260208201819052918101829052606080820183905260808201529061091c90836132ba565b6109575760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b600082815260026020818152604092839020835160a0810185528154815260018201546001600160401b0380821683860152600160401b8204811683880152600160801b90910416606082015292810180548551818502810185019096528086529394919360808601938301828280156109fa57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109dc575b5050505050815250509050919050565b610a126132f4565b6001600160a01b0316336001600160a01b031614610a45576040516365f4906560e01b8152336004820152602401610556565b610a4e81613322565b50565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff16610a9b57604051630ef4733760e31b815260040160405180910390fd5b60005b81811015610add57610ad5838383818110610abb57610abb61435e565b9050602002016020810190610ad09190613b5f565b6133f4565b600101610a9e565b505050565b60606000610aef816132de565b6001600160401b03811115610b0657610b06613d0c565b604051908082528060200260200182016040528015610b2f578160200160208202803683370190505b5090506000805b610b4060006132de565b811015610bf5576000610b5381836132e8565b60008181526002602052604081209192505b6002820154811015610be757876001600160a01b0316826002018281548110610b9057610b9061435e565b6000918252602090912001546001600160a01b031603610bdf57828686610bb68161438d565b975063ffffffff1681518110610bce57610bce61435e565b602002602001018181525050610be7565b600101610b65565b505050806001019050610b36565b5060008163ffffffff166001600160401b03811115610c1657610c16613d0c565b604051908082528060200260200182016040528015610c4f57816020015b610c3c6138b2565b815260200190600190039081610c345790505b50905060005b8263ffffffff16811015610d89576040518060400160405280858381518110610c8057610c8061435e565b6020026020010151815260200160006002016000878581518110610ca657610ca661435e565b6020908102919091018101518252818101929092526040908101600020815160a0810183528154815260018201546001600160401b0380821683870152600160401b8204811683860152600160801b909104166060820152600282018054845181870281018701909552808552919492936080860193909290830182828015610d5857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d3a575b505050505081525050815250828281518110610d7657610d7661435e565b6020908102919091010152600101610c55565b50949350505050565b6000610d9e60056132de565b905090565b60606000610db0816132de565b6001600160401b03811115610dc757610dc7613d0c565b604051908082528060200260200182016040528015610e0057816020015b610ded6138b2565b815260200190600190039081610de55790505b50905060005b610e1060006132de565b811015610f0e576000610e2381836132e8565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015610edc57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ebe575b505050505081525050815250838381518110610efa57610efa61435e565b602090810291909101015250600101610e06565b50919050565b6040805160a081018252600080825260208201819052918101829052606080820183905260808201819052909190610f4c82856132ba565b610f875760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b600084815260026020818152604080842060048352818520546003845294829020825160a0810184528254815260018301546001600160401b0380821683880152600160401b8204811683870152600160801b9091041660608201529482018054845181870281018701909552808552929695919491938793608086019391929183018282801561104157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611023575b50505050508152505092508080546110589061432a565b80601f01602080910402602001604051908101604052809291908181526020018280546110849061432a565b80156110d15780601f106110a6576101008083540402835291602001916110d1565b820191906000526020600020905b8154815290600101906020018083116110b457829003601f168201915b505050505090509250925092509193909250565b6001600160a01b0380831660009081526007602052604090206002015483911661114557604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b33611151600882613295565b61118b5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b03808516600090815260076020526040902060030154859133911681146111e95760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038616600090815260076020526040902080546112109060ff16876134b9565b80548690829060ff1916600183600581111561122e5761122e613f35565b021790555060028101546040516001600160a01b03909116907f20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0906112749089906143b0565b60405180910390a250505050505050565b61128d6138b2565b61129760006132de565b82106112d45760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b60006112e081846132e8565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b909104166060820152918101805486518186028101860190975280875296975093958387019592949193608086019392919083018282801561139957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161137b575b5050509190925250505090529392505050565b336000818152600760205260409020600201546001600160a01b031661140857604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b6114136000866132ba565b1561145457604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b60005b84518110156114d8576114908582815181106114755761147561435e565b6020026020010151600060050161329590919063ffffffff16565b6114d057604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b600101611457565b506040805160a08101825284815260006020820181905291810182905260608101829052608081018690529061150e908761364c565b5060008681526002602081815260409283902084518155818501516001820180549587015160608801516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026fffffffffffffffffffffffffffffffff1990991691909416179690961795909516179093556080840151805185949361159e939085019201906138fc565b50505060008681526003602052604090206115b98482614423565b5060008681526004602052604090819020859055517f55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb906116019088908890889088906144dc565b60405180910390a1505050505050565b600061161e600883613295565b92915050565b33611630600882613295565b61166a5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038084166000908152600760205260409020600201548491166116ca57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b03808516600090815260076020526040902060030154859133911681146117285760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038616600090815260076020908152604091829020915161175291889101614518565b604051602081830303815290604052805190602001208160010160405160200161177c9190614534565b60405160208183030381529060405280519060200120036117cc5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b600181016117da8782614423565b5060028101546040516001600160a01b03909116907f4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac906112749089906142d8565b6118246132f4565b6001600160a01b0316336001600160a01b031614611857576040516365f4906560e01b8152336004820152602401610556565b6001600160a01b03811661189a5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b6118a5600d82613658565b6118e05760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6040516001600160a01b038216907ff9889c857e5356066b564327caa757c325ecbc001b2b47d72edf8cf9aedb1be590600090a250565b6060610d9e600061366d565b606081611931600a826132ba565b61196c5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6000838152600c6020908152604080832080548251818502810185019093528083529193909284015b82821015611a7957600084815260209081902060408051606081018252600386029092018054835260018101546001600160401b031693830193909352600283018054929392918401916119e89061432a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a149061432a565b8015611a615780601f10611a3657610100808354040283529160200191611a61565b820191906000526020600020905b815481529060010190602001808311611a4457829003601f168201915b50505050508152505081526020019060010190611995565b50505050915050919050565b611ab06040805160808101909152806000815260606020820181905260006040830181905291015290565b611abb600583613295565b611afb57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038216600090815260076020526040908190208151608081019092528054829060ff166005811115611b3657611b36613f35565b6005811115611b4757611b47613f35565b8152602001600182018054611b5b9061432a565b80601f0160208091040260200160405190810160405280929190818152602001828054611b879061432a565b8015611bd45780601f10611ba957610100808354040283529160200191611bd4565b820191906000526020600020905b815481529060010190602001808311611bb757829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015292915050565b81611c126000826132ba565b611c4d5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b03808316600090815260076020526040902060020154839116611cad57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b6000848152600260205260408120905b6002820154811015611d4657846001600160a01b0316826002018281548110611ce857611ce861435e565b6000918252602090912001546001600160a01b031603611d3e57604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b600101611cbd565b5060028101805460018082018355600092835260209283902090910180546001600160a01b0319166001600160a01b03881690811790915560408051898152938401919091528201527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f9060600160405180910390a15050505050565b33611dcf600d82613295565b611e095760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6000829003611e475760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b611e52600a866132ba565b611e6357611e61600a8661364c565b505b6000858152600c6020526040812054905b81811015611f4a576000878152600c6020526040902080546001600160401b038816919083908110611ea857611ea861435e565b60009182526020909120600160039092020101546001600160401b031603611f42576000878152600c6020526040902080548691869184908110611eee57611eee61435e565b90600052602060002090600302016002019182611f0c9291906145aa565b50600080516020614819833981519152878787876000604051611f33959493929190614663565b60405180910390a1505061203d565b600101611e74565b506000600c0160008781526020019081526020016000206040518060600160405280888152602001876001600160401b0316815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050835460018082018655948252602091829020845160039092020190815590830151938101805467ffffffffffffffff19166001600160401b039095169490941790935550604081015190919060028201906120149082614423565b505050600080516020614819833981519152868686866000604051611601959493929190614663565b5050505050565b6060600061205260056132de565b6001600160401b0381111561206957612069613d0c565b6040519080825280602002602001820160405280156120c557816020015b6120b26040805160808101909152806000815260606020820181905260006040830181905291015290565b8152602001906001900390816120875790505b50905060005b6120d560056132de565b811015610f0e57600760006120eb6005846132e8565b6001600160a01b03168152602081019190915260409081016000208151608081019092528054829060ff16600581111561212757612127613f35565b600581111561213857612138613f35565b815260200160018201805461214c9061432a565b80601f01602080910402602001604051908101604052809291908181526020018280546121789061432a565b80156121c55780601f1061219a576101008083540402835291602001916121c5565b820191906000526020600020905b8154815290600101906020018083116121a857829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015282518390839081106122055761220561435e565b60209081029190910101526001016120cb565b6122206132f4565b6001600160a01b0316336001600160a01b031614612253576040516365f4906560e01b8152336004820152602401610556565b61225e600882613295565b6122a257604080518082018252601281527113d41154905513d497d393d517d193d5539160721b6020820152905162461bcd60e51b815261055691906004016142d8565b60005b6122af60056132de565b811015612337576001600160a01b038216600760006122cf6005856132e8565b6001600160a01b039081168252602082019290925260400160002060030154160361232f57604080518082018252600d81526c4f55545f4f465f424f554e445360981b6020820152905162461bcd60e51b815261055691906004016142d8565b6001016122a5565b50612343600882613658565b506040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b6001600160a01b03808216600090815260076020526040902060030154829133911681146123d95760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038381166000908152600760205260409020600201541661243757604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b60056001600160a01b03841660009081526007602052604090205460ff16600581111561246657612466613f35565b146124af5760408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b815261055691906004016142d8565b6124ba600584613658565b506001600160a01b0383166000908152600760205260408120805460ff19168155906124e96001830182613857565b506002810180546001600160a01b03199081169091556003909101805490911690556040516001600160a01b038416907fcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b90600090a2505050565b33612550600d82613295565b61258a5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6000805b6000858152600c602052604090205481101561270b576000858152600c6020526040902080546001600160401b0386169190839081106125d0576125d061435e565b60009182526020909120600160039092020101546001600160401b031603612703576000858152600c60205260409020805461260e906001906146b3565b8154811061261e5761261e61435e565b90600052602060002090600302016000600c01600087815260200190815260200160002082815481106126535761265361435e565b600091825260209091208254600390920201908155600180830154908201805467ffffffffffffffff19166001600160401b039092169190911790556002808201906126a1908401826146c6565b5050506000858152600c602052604090208054806126c1576126c16142eb565b60008281526020812060036000199093019283020181815560018101805467ffffffffffffffff19169055906126fa6002830182613857565b50509055600191505b60010161258e565b50806127485760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b604080518581526001600160401b038516602082015260808183018190526000908201526001606082015290516000805160206148198339815191529181900360a00190a150505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166127dd57604051630ef4733760e31b815260040160405180910390fd5b60005b81811015610add576128178383838181106127fd576127fd61435e565b90506020020160208101906128129190613b5f565b613322565b6001016127e0565b6000610d9e816132de565b6128326132f4565b6001600160a01b0316336001600160a01b031614612865576040516365f4906560e01b8152336004820152602401610556565b610a4e816133f4565b6060610d9e600561366d565b60606000828410604051806040016040528060078152602001664241445f41524760c81b815250906128bf5760405162461bcd60e51b815260040161055691906142d8565b5060006128cc85856146b3565b6001600160401b038111156128e3576128e3613d0c565b60405190808252806020026020018201604052801561291c57816020015b6129096138b2565b8152602001906001900390816129015790505b50905060005b61292c60006132de565b6129368288614317565b10801561294b5750846129498288614317565b105b15612a5b57600061296761295f8389614317565b6000906132e8565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015612a2057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a02575b505050505081525050815250838381518110612a3e57612a3e61435e565b60200260200101819052505080612a5490614374565b9050612922565b5080612a6760006132de565b90969410159450505050565b600061161e600d83613295565b336000818152600760205260409020600201546001600160a01b0316612adc57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b612ae76000876132ba565b612b225760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b600086815260026020526040902084815560018101805467ffffffffffffffff19166001600160401b0386161790558215612b8a576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b836001600160401b0316600103612bb2576000878152600360205260408120612bb291613857565b60408051888152602081018790526001600160401b03861681830152841515606082015290517fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b9181900360800190a150505050505050565b81612c176000826132ba565b612c525760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b03808316600090815260076020526040902060020154839116612cb257604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b600084815260026020526040812090805b6002830154811015612dcc57856001600160a01b0316836002018281548110612cee57612cee61435e565b6000918252602090912001546001600160a01b031603612dc457600283018054612d1a906001906146b3565b81548110612d2a57612d2a61435e565b6000918252602090912001546002840180546001600160a01b039092169183908110612d5857612d5861435e565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082600201805480612d9957612d996142eb565b600082815260209020810160001990810180546001600160a01b031916905501905560019150612dcc565b600101612cc3565b5080612e0e57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b604080518781526001600160a01b03871660208201526000918101919091527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f90606001611601565b33612e63600882613295565b612e9d5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b815261055691906004016142d8565b6001600160a01b038481166000908152600760205260409020600201541615612efc57604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b60006040518060800160405280846005811115612f1b57612f1b613f35565b8152602081018690526001600160a01b0387166040820152336060909101529050612f4760058661367a565b506001600160a01b03851660009081526007602052604090208151815483929190829060ff19166001836005811115612f8257612f82613f35565b021790555060208201516001820190612f9b9082614423565b506040828101516002830180546001600160a01b03199081166001600160a01b039384161790915560609094015160039093018054909416928116929092179092559051908616907fd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e561906130129087908790614792565b60405180910390a25050505050565b600061161e600a836132ba565b336000818152600760205260409020600201546001600160a01b031661308a57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b815261055691906004016142d8565b60005b8281101561328f57368484838181106130a8576130a861435e565b60a0029190910191506130bf9050600082356132ba565b613137577f75460fe319331413a18a82d99b07735cec53fa0c4061ada38c2141e331082afa813560408301356130fb60808501606086016147b4565b60408051808201825260098152681393d517d193d5539160ba1b6020820152905161312994939291906147cf565b60405180910390a150613287565b80356000908152600260205260409081902090820135815561315f60808301606084016147b4565b60018201805467ffffffffffffffff19166001600160401b039290921691909117905561319260a08301608084016147fd565b156131ca576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b6131da60808301606084016147b4565b6001600160401b0316600103613203578135600090815260036020526040812061320391613857565b7fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b8235604084013561323b60808601606087016147b4565b61324b60a08701608088016147fd565b60405161327c949392919093845260208401929092526001600160401b031660408301521515606082015260800190565b60405180910390a150505b60010161308d565b50505050565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b600081815260018301602052604081205415156132b3565b60006132b3838361368f565b600061161e825490565b60006132b38383613782565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b6001600160a01b0381166133655760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b613370600882613295565b156133b157604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b6133bc60088261367a565b506040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b6001600160a01b0381166134375760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b815261055691906004016142d8565b613442600d8261367a565b61348257604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b815261055691906004016142d8565b6040516001600160a01b038216907f7afd798379ae2d2e5035438544cea2b60eb1dde6a8128e6d447fd2a25f8825a290600090a250565b60008260058111156134cd576134cd613f35565b1480613521575060018260058111156134e8576134e8613f35565b1480156135215750600381600581111561350457613504613f35565b14806135215750600481600581111561351f5761351f613f35565b145b806135745750600282600581111561353b5761353b613f35565b1480156135745750600381600581111561355757613557613f35565b14806135745750600481600581111561357257613572613f35565b145b806135c75750600482600581111561358e5761358e613f35565b1480156135c7575060038160058111156135aa576135aa613f35565b14806135c7575060058160058111156135c5576135c5613f35565b145b806135ff575060038260058111156135e1576135e1613f35565b1480156135ff575060058160058111156135fd576135fd613f35565b145b15613608575050565b60408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b815261055691906004016142d8565b60006132b383836137ac565b60006132b3836001600160a01b03841661368f565b606060006132b3836137fb565b60006132b3836001600160a01b0384166137ac565b600081815260018301602052604081205480156137785760006136b36001836146b3565b85549091506000906136c7906001906146b3565b905080821461372c5760008660000182815481106136e7576136e761435e565b906000526020600020015490508087600001848154811061370a5761370a61435e565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061373d5761373d6142eb565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061161e565b600091505061161e565b60008260000182815481106137995761379961435e565b9060005260206000200154905092915050565b60008181526001830160205260408120546137f35750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561161e565b50600061161e565b60608160000180548060200260200160405190810160405280929190818152602001828054801561384b57602002820191906000526020600020905b815481526020019060010190808311613837575b50505050509050919050565b5080546138639061432a565b6000825580601f10613873575050565b601f016020900490600052602060002090810190610a4e9190613961565b5080546000825560030290600052602060002090810190610a4e9190613976565b6040805180820190915260008152602081016138f76040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b905290565b828054828255906000526020600020908101928215613951579160200282015b8281111561395157825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061391c565b5061395d929150613961565b5090565b5b8082111561395d5760008155600101613962565b8082111561395d57600080825560018201805467ffffffffffffffff191690556139a36002830182613857565b50600301613976565b6000602082840312156139be57600080fd5b5035919050565b60005b838110156139e05781810151838201526020016139c8565b50506000910152565b60008151808452613a018160208601602086016139c5565b601f01601f19169290920160200192915050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015613a9157888303603f19018552815180518452878101516001600160401b0316888501528601516060878501819052613a7d818601836139e9565b968901969450505090860190600101613a3e565b509098975050505050505050565b600060a08301825184526020808401516001600160401b0380821660208801528060408701511660408801528060608701511660608801525050608084015160a0608087015282815180855260c088019150602083019450600092505b80831015613b255784516001600160a01b03168252938301936001929092019190830190613afc565b509695505050505050565b6020815260006132b36020830184613a9f565b80356001600160a01b0381168114613b5a57600080fd5b919050565b600060208284031215613b7157600080fd5b6132b382613b43565b60008060208385031215613b8d57600080fd5b82356001600160401b0380821115613ba457600080fd5b818501915085601f830112613bb857600080fd5b813581811115613bc757600080fd5b8660208260051b8501011115613bdc57600080fd5b60209290920196919550909350505050565b805182526000602082015160406020850152613c0d6040850182613a9f565b949350505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015613c6257601f19868403018952613c50838351613bee565b98840198925090830190600101613c34565b5090979650505050505050565b6020815260006132b36020830184613c15565b606081526000613c956060830186613a9f565b8460208401528281036040840152613cad81856139e9565b9695505050505050565b803560068110613b5a57600080fd5b60008060408385031215613cd957600080fd5b613ce283613b43565b9150613cf060208401613cb7565b90509250929050565b6020815260006132b36020830184613bee565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613d4a57613d4a613d0c565b604052919050565b600082601f830112613d6357600080fd5b81356001600160401b03811115613d7c57613d7c613d0c565b613d8f601f8201601f1916602001613d22565b818152846020838601011115613da457600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215613dd757600080fd5b843593506020808601356001600160401b0380821115613df657600080fd5b818801915088601f830112613e0a57600080fd5b813581811115613e1c57613e1c613d0c565b8060051b613e2b858201613d22565b918252838101850191858101908c841115613e4557600080fd5b948601945b83861015613e6a57613e5b86613b43565b82529486019490860190613e4a565b9850505050604088013594506060880135925080831115613e8a57600080fd5b5050613e9887828801613d52565b91505092959194509250565b60008060408385031215613eb757600080fd5b613ec083613b43565b915060208301356001600160401b03811115613edb57600080fd5b613ee785828601613d52565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015613f2957835183529284019291840191600101613f0d565b50909695505050505050565b634e487b7160e01b600052602160045260246000fd5b60068110613f6957634e487b7160e01b600052602160045260246000fd5b9052565b613f78828251613f4b565b6000602082015160806020850152613f9360808501826139e9565b6040848101516001600160a01b03908116918701919091526060948501511693909401929092525090919050565b6020815260006132b36020830184613f6d565b60008060408385031215613fe757600080fd5b82359150613cf060208401613b43565b80356001600160401b0381168114613b5a57600080fd5b6000806000806060858703121561402457600080fd5b8435935061403460208601613ff7565b925060408501356001600160401b038082111561405057600080fd5b818701915087601f83011261406457600080fd5b81358181111561407357600080fd5b88602082850101111561408557600080fd5b95989497505060200194505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156140eb57603f198886030184526140d9858351613f6d565b945092850192908501906001016140bd565b5092979650505050505050565b6000806040838503121561410b57600080fd5b82359150613cf060208401613ff7565b60008151808452602080850194506020840160005b838110156141555781516001600160a01b031687529582019590820190600101614130565b509495945050505050565b6020815260006132b3602083018461411b565b6000806040838503121561418657600080fd5b50508035926020909101359150565b6040815260006141a86040830185613c15565b905082151560208301529392505050565b80358015158114613b5a57600080fd5b600080600080600060a086880312156141e157600080fd5b8535945060208601359350604086013592506141ff60608701613ff7565b915061420d608087016141b9565b90509295509295909350565b60008060006060848603121561422e57600080fd5b61423784613b43565b925060208401356001600160401b0381111561425257600080fd5b61425e86828701613d52565b92505061426d60408501613cb7565b90509250925092565b6000806020838503121561428957600080fd5b82356001600160401b03808211156142a057600080fd5b818501915085601f8301126142b457600080fd5b8135818111156142c357600080fd5b86602060a083028501011115613bdc57600080fd5b6020815260006132b360208301846139e9565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561161e5761161e614301565b600181811c9082168061433e57607f821691505b602082108103610f0e57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60006001820161438657614386614301565b5060010190565b600063ffffffff8083168181036143a6576143a6614301565b6001019392505050565b6020810161161e8284613f4b565b601f821115610add576000816000526020600020601f850160051c810160208610156143e75750805b601f850160051c820191505b81811015614406578281556001016143f3565b505050505050565b600019600383901b1c191660019190911b1790565b81516001600160401b0381111561443c5761443c613d0c565b6144508161444a845461432a565b846143be565b602080601f83116001811461447f576000841561446d5750858301515b614477858261440e565b865550614406565b600085815260208120601f198616915b828110156144ae5788860151825594840194600190910190840161448f565b50858210156144cc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8481526080602082015260006144f5608083018661411b565b846040840152828103606084015261450d81856139e9565b979650505050505050565b6000825161452a8184602087016139c5565b9190910192915050565b60008083546145428161432a565b6001828116801561455a576001811461456f5761459e565b60ff198416875282151583028701945061459e565b8760005260208060002060005b858110156145955781548a82015290840190820161457c565b50505082870194505b50929695505050505050565b6001600160401b038311156145c1576145c1613d0c565b6145d5836145cf835461432a565b836143be565b6000601f84116001811461460357600085156145f15750838201355b6145fb868261440e565b84555061203d565b600083815260209020601f19861690835b828110156146345786850135825560209485019460019092019101614614565b50868210156146515760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8581526001600160401b038516602082015260806040820152826080820152828460a0830137600081840160a0908101919091529115156060820152601f909201601f1916909101019392505050565b8181038181111561161e5761161e614301565b8181036146d1575050565b6146db825461432a565b6001600160401b038111156146f2576146f2613d0c565b6147008161444a845461432a565b6000601f82116001811461472e576000831561471c5750848201545b614726848261440e565b85555061203d565b600085815260209020601f19841690600086815260209020845b838110156147685782860154825560019586019590910190602001614748565b50858310156144cc5793015460001960f8600387901b161c19169092555050600190811b01905550565b6040815260006147a560408301856139e9565b90506132b36020830184613f4b565b6000602082840312156147c657600080fd5b6132b382613ff7565b8481528360208201526001600160401b0383166040820152608060608201526000613cad60808301846139e9565b60006020828403121561480f57600080fd5b6132b3826141b956fec01483261a841a868b99cb8802faed4ea44a1a816651c4f7ee061a96a205fe98","sourceMap":"560:732:48:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2631:336:38;;;;;;:::i;:::-;;:::i;:::-;;3952:747;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1862:196:44;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1137:99:42:-;;;;;;:::i;:::-;;:::i;1024:221:38:-;;;;;;:::i;:::-;;:::i;9133:855:44:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2849:91:40:-;;;:::i;:::-;;;5451:25:84;;;5439:2;5424:18;2849:91:40;5305:177:84;8237:344:44;;;:::i;2423:350::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;1728:394:40:-;;;;;;:::i;:::-;;:::i;2062:296:44:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;776:1082::-;;;;;;:::i;:::-;;:::i;1240:116:42:-;;;;;;:::i;:::-;;:::i;:::-;;;9289:14:84;;9282:22;9264:41;;9252:2;9237:18;1240:116:42;9124:187:84;2126:453:40;;;;;;:::i;:::-;;:::i;5383:290:38:-;;;;;;:::i;:::-;;:::i;8128:105:44:-;;;:::i;:::-;;;;;;;:::i;3724:148:38:-;;;;;;:::i;:::-;;:::i;2583:262:40:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6933:504:44:-;;;;;;:::i;:::-;;:::i;1712:826:38:-;;;;;;:::i;:::-;;:::i;3055:254:40:-;;;:::i;:::-;;;;;;;:::i;1360:466:42:-;;;;;;:::i;:::-;;:::i;1248:476:40:-;;;;;;:::i;:::-;;:::i;3065:587:38:-;;;;;;:::i;:::-;;:::i;738:220:42:-;;;;;;:::i;:::-;;:::i;8029:95:44:-;;;:::i;5190:121:38:-;;;;;;:::i;:::-;;:::i;2944:107:40:-;;;:::i;:::-;;;;;;;:::i;8585:544:44:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;4975:146:38:-;;;;;;:::i;:::-;;:::i;2777:1696:44:-;;;;;;:::i;:::-;;:::i;7441:584::-;;;;;;:::i;:::-;;:::i;643:601:40:-;;;;;;:::i;:::-;;:::i;1510:123:38:-;;;;;;:::i;:::-;;:::i;4477:2452:44:-;;;;;;:::i;:::-;;:::i;2631:336:38:-;2715:10;3806:42:46;:24;2715:10:38;3806:33:46;:42::i;:::-;3801:91;;3863:28;;;;;;;;;;;-1:-1:-1;;;3863:28:46;;;;3856:36;;-1:-1:-1;;;3856:36:46;;;;3863:28;3856:36;;;:::i;:::-;;;;;;;;3801:91;2743:3:38;3649:34:46::1;:20;2743:3:38::0;3649:29:46::1;:34::i;:::-;3644:84;;3698:29;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3698:29:46::1;::::0;::::1;::::0;3691:37;;-1:-1:-1;;;3691:37:46;;::::1;::::0;3698:29;3691:37:::1;;;:::i;3644:84::-;2761:2:38::2;:21:::0;;;:16:::2;:21;::::0;;;;:28;:33;2754:84:::2;;2804:2;:21:::0;;;:16:::2;:21;::::0;;;;:27;;;::::2;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;-1:-1:-1::0;;2804:27:38;;;;;::::2;;::::0;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;2804:27:38::2;::::0;;;::::2;;::::0;::::2;::::0;::::2;:::i;:::-;;;;;2754:84;;;2851:2;:21:::0;;;:16:::2;:21;::::0;;;;2843:30:::2;::::0;::::2;:::i;:::-;2880:32;:20;2908:3:::0;2880:27:::2;:32::i;:::-;-1:-1:-1::0;2924:38:38::2;::::0;;17569:25:84;;;2950:1:38::2;17625:2:84::0;17610:18;;17603:59;;;17698:3;17678:18;;;17671:31;;;17718:19;;17711:30;2957:4:38::2;17808:2:84::0;17793:18;;17786:50;2924:38:38;;-1:-1:-1;;;;;;;;;;;2924:38:38;;;;17773:3:84;2924:38:38;;::::2;3898:1:46::1;2631:336:38::0;;:::o;3952:747::-;4006:16;4030:20;;4088:29;:20;:27;:29::i;:::-;4061:56;;4128:9;4123:154;4147:16;4143:1;:20;4123:154;;;4178:11;4192:26;:20;4216:1;4192:23;:26::i;:::-;4242:2;:21;;;:16;:21;;;;;:28;4178:40;;-1:-1:-1;4226:44:38;;;;:::i;:::-;;-1:-1:-1;;4165:3:38;;4123:154;;;;4283:25;4325:12;-1:-1:-1;;;;;4311:27:38;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;4311:27:38;;;;;;;;;;;;;;;-1:-1:-1;4283:55:38;-1:-1:-1;4345:14:38;4362:29;:20;:27;:29::i;:::-;4345:46;;4397:9;4421;4416:257;4440:6;4436:1;:10;4416:257;;;4461:11;4475:26;:20;4499:1;4475:23;:26::i;:::-;4509:28;4540:21;;;:16;:21;;;;;;;;4509:52;;;;;;;;;;;;;;;;;4461:40;;-1:-1:-1;4509:28:38;;:52;;4540:21;4509:28;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4509:52:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4574:9;4569:98;4593:11;:18;4589:1;:22;4569:98;;;4644:11;4656:1;4644:14;;;;;;;;:::i;:::-;;;;;;;4628:8;4637:3;;;;;:::i;:::-;;;4628:13;;;;;;;;:::i;:::-;;;;;;;;;;:30;4613:3;;4569:98;;;;4453:220;;4448:3;;;;;4416:257;;;-1:-1:-1;4686:8:38;;3952:747;-1:-1:-1;;;;;3952:747:38:o;1862:196:44:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1948:29:44;;1968:8;1948:19;:29::i;:::-;1943:73;;1986:29;;;;;;;;;;;-1:-1:-1;;;1986:29:44;;;;1979:37;;-1:-1:-1;;;1979:37:44;;;;1986:29;1979:37;;;:::i;1943:73::-;2030:2;:23;;;:13;:23;;;;;;;;;2023:30;;;;;;;;;;;;;;;-1:-1:-1;;;;;2023:30:44;;;;;;;-1:-1:-1;;;2023:30:44;;;;;;;;-1:-1:-1;;;2023:30:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2030:23;;2023:30;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2023:30:44;;;;;;;;;;;;;;;;;;;;;;;;;;;1862:196;;;:::o;1137:99:42:-;300:8:31;:6;:8::i;:::-;-1:-1:-1;;;;;286:22:31;:10;-1:-1:-1;;;;;286:22:31;;282:79;;325:29;;-1:-1:-1;;;325:29:31;;343:10;325:29;;;18912:51:84;18885:18;;325:29:31;18766:203:84;282:79:31;1205:26:42::1;1222:8;1205:16;:26::i;:::-;1137:99:::0;:::o;1024:221:38:-;303:66:22;1263:42:21;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:21;;;;;;;;;;;1258:100;1132:9:38::1;1127:114;1147:25:::0;;::::1;1127:114;;;1187:47;1216:14;;1231:1;1216:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;1187:28;:47::i;:::-;1174:3;;1127:114;;;;1024:221:::0;;:::o;9133:855:44:-;9211:21;9297:29;9343:19;9297:29;9343:17;:19::i;:::-;-1:-1:-1;;;;;9329:34:44;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9329:34:44;-1:-1:-1;9297:66:44;-1:-1:-1;9369:18:44;;9393:326;9417:19;:2;:17;:19::i;:::-;9413:1;:23;9393:326;;;9451:10;9464:16;9451:10;9478:1;9464:13;:16::i;:::-;9488:21;9512:17;;;:13;:17;;;;;9451:29;;-1:-1:-1;9537:176:44;9561:12;;;:19;9557:23;;9537:176;;;9620:11;-1:-1:-1;;;;;9601:30:44;:6;:12;;9614:1;9601:15;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;9601:15:44;:30;9597:108;;9675:2;9645:12;9658:13;;;;:::i;:::-;;;9645:27;;;;;;;;;;:::i;:::-;;;;;;:32;;;;;9689:5;;9597:108;9582:3;;9537:176;;;;9443:276;;9438:3;;;;;9393:326;;;;9725:29;9776:11;9757:31;;-1:-1:-1;;;;;9757:31:44;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;9725:63;;9799:9;9794:169;9818:11;9814:15;;:1;:15;9794:169;;;9857:99;;;;;;;;9884:12;9897:1;9884:15;;;;;;;;:::i;:::-;;;;;;;9857:99;;;;9917:2;:13;;:30;9931:12;9944:1;9931:15;;;;;;;;:::i;:::-;;;;;;;;;;;;9917:30;;;;;;;;;;;;;-1:-1:-1;9917:30:44;9857:99;;;;;;;;;;;;;;;-1:-1:-1;;;;;9857:99:44;;;;;;;-1:-1:-1;;;9857:99:44;;;;;;;;-1:-1:-1;;;9857:99:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9917:30;;9857:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9857:99:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;9844:7;9852:1;9844:10;;;;;;;;:::i;:::-;;;;;;;;;;:112;9831:3;;9794:169;;;-1:-1:-1;9976:7:44;9133:855;-1:-1:-1;;;;9133:855:44:o;2849:91:40:-;2896:7;2918:17;:8;:15;:17::i;:::-;2911:24;;2849:91;:::o;8237:344:44:-;8285:21;8314:29;8365:19;8314:29;8365:17;:19::i;:::-;-1:-1:-1;;;;;8346:39:44;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;8314:71;;8397:9;8392:164;8416:19;:2;:17;:19::i;:::-;8412:1;:23;8392:164;;;8450:10;8463:16;8450:10;8477:1;8463:13;:16::i;:::-;8500:49;;;;;;;;;;;-1:-1:-1;8530:17:44;;;:13;8500:49;8530:17;;;;;;;8500:49;;;;;;;;;;;;;;;-1:-1:-1;;;;;8500:49:44;;;;;;;-1:-1:-1;;;8500:49:44;;;;;;;;-1:-1:-1;;;8500:49:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;8450:29;;-1:-1:-1;8500:49:44;;;;;;;;8530:17;;8500:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8500:49:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;8487:7;8495:1;8487:10;;;;;;;;:::i;:::-;;;;;;;;;;:62;-1:-1:-1;8437:3:44;;8392:164;;;-1:-1:-1;8569:7:44;8237:344;-1:-1:-1;8237:344:44:o;2423:350::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2551:29:44;-1:-1:-1;2571:8:44;2551:19;:29::i;:::-;2546:73;;2589:29;;;;;;;;;;;-1:-1:-1;;;2589:29:44;;;;2582:37;;-1:-1:-1;;;2582:37:44;;;;2589:29;2582:37;;;:::i;2546:73::-;2641:2;:23;;;:13;:23;;;;;;;;2672:33;:43;;;;;;2723:29;:39;;;;;;2626:142;;;;;;;;;;;;;;;-1:-1:-1;;;;;2626:142:44;;;;;;;-1:-1:-1;;;2626:142:44;;;;;;;;-1:-1:-1;;;2626:142:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;2641:23;;2672:43;2723:39;;2626:142;;2641:23;;2626:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2626:142:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2423:350;;;;;:::o;1728:394:40:-;-1:-1:-1;;;;;3046:22:46;;;3092:1;3046:22;;;:16;:22;;;;;:34;;;1832:11:40;;3046:34:46;3042:102;;3109:34;;;;;;;;;;;-1:-1:-1;;;3109:34:46;;;;3102:42;;-1:-1:-1;;;3102:42:46;;;;3109:34;3102:42;;;:::i;3042:102::-;1862:10:40::1;3211:31:46;:12;1862:10:40::0;3211:21:46::1;:31::i;:::-;3206:74;;3251:28;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3251:28:46::1;::::0;::::1;::::0;3244:36;;-1:-1:-1;;;3244:36:46;;::::1;::::0;3251:28;3244:36:::1;;;:::i;3206:74::-;-1:-1:-1::0;;;;;3497:22:46;;::::2;:2;:22:::0;;;:16:::2;:22;::::0;;;;:31:::2;;::::0;1895:11:40;;1908:10:::2;::::0;3497:31:46::2;:43:::0;::::2;3493:91;;3555:28;::::0;;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;3555:28:46::2;::::0;::::2;::::0;3548:36;;-1:-1:-1;;;3548:36:46;;::::2;::::0;3555:28;3548:36:::2;;;:::i;3493:91::-;-1:-1:-1::0;;;;;1948:29:40;::::3;1928:17;1948:29:::0;;;:16:::3;:29;::::0;;;;2016:11;;1984:52:::3;::::0;2016:11:::3;;2029:6:::0;1984:31:::3;:52::i;:::-;2043:20:::0;;2057:6;;2043:4;;-1:-1:-1;;2043:20:40::3;::::0;2057:6;2043:20:::3;::::0;::::3;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;2092:16:40::3;::::0;::::3;::::0;2074:43:::3;::::0;-1:-1:-1;;;;;2092:16:40;;::::3;::::0;2074:43:::3;::::0;::::3;::::0;2110:6;;2074:43:::3;:::i;:::-;;;;;;;;1922:200;3286:1:46::2;;3150::::1;1728:394:40::0;;;:::o;2062:296:44:-;2130:19;;:::i;:::-;2166;:2;:17;:19::i;:::-;2161:1;:24;2157:82;;2202:29;;;;;;;;;;;-1:-1:-1;;;2202:29:44;;;;2195:37;;-1:-1:-1;;;2195:37:44;;;;2202:29;2195:37;;;:::i;2157:82::-;2244:16;2263;2244;2277:1;2263:13;:16::i;:::-;2292:61;;;;;;;;;;;-1:-1:-1;2328:23:44;;;:13;2292:61;2328:23;;;;;;;2292:61;;;;;;;;;;;;;;;-1:-1:-1;;;;;2292:61:44;;;;;;;-1:-1:-1;;;2292:61:44;;;;;;;;-1:-1:-1;;;2292:61:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;2244:35;;-1:-1:-1;2292:61:44;;;;;;;;2328:23;;2292:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2292:61:44;;;;;;;;;;;;;;;;-1:-1:-1;;;2292:61:44;;;;-1:-1:-1;;;2292:61:44;;2285:68;2062:296;-1:-1:-1;;;2062:296:44:o;776:1082::-;941:10;3092:1:46;3046:22;;;:16;:22;;;;;:34;;;-1:-1:-1;;;;;3046:34:46;3042:102;;3109:34;;;;;;;;;;;-1:-1:-1;;;3109:34:46;;;;3102:42;;-1:-1:-1;;;3102:42:46;;;;3109:34;3102:42;;;:::i;3042:102::-;1026:29:44::1;:2;1046:8:::0;1026:19:::1;:29::i;:::-;1022:83;;;1070:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1070:34:44::1;::::0;::::1;::::0;1063:42;;-1:-1:-1;;;1063:42:44;;::::1;::::0;1070:34;1063:42:::1;;;:::i;1022:83::-;1186:9;1181:142;1205:5;:12;1201:1;:16;1181:142;;;1237:27;1255:5;1261:1;1255:8;;;;;;;;:::i;:::-;;;;;;;1237:2;:8;;:17;;:27;;;;:::i;:::-;1232:84;;1281:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1281:34:44::1;::::0;::::1;::::0;1274:42;;-1:-1:-1;;;1274:42:44;;::::1;::::0;1281:34;1274:42:::1;;;:::i;1232:84::-;1219:3;;1181:142;;;-1:-1:-1::0;1390:144:44::1;::::0;;::::1;::::0;::::1;::::0;;;;;1367:20:::1;1390:144;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;1541:24:::1;::::0;1556:8;1541:14:::1;:24::i;:::-;-1:-1:-1::0;1571:2:44::1;:23:::0;;;:13:::1;:23;::::0;;;;;;;;:32;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;1571:32:44;;::::1;-1:-1:-1::0;;;1571:32:44::1;-1:-1:-1::0;;;;1571:32:44;;::::1;-1:-1:-1::0;;;1571:32:44::1;-1:-1:-1::0;;1571:32:44;;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;1597:6;;1571:23;:32:::1;::::0;;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;1609:2:44::1;:39:::0;;;:29:::1;:39;::::0;;;;:58:::1;1651:16:::0;1609:39;:58:::1;:::i;:::-;-1:-1:-1::0;1673:2:44::1;:43:::0;;;:33:::1;:43;::::0;;;;;;:66;;;1751:102;::::1;::::0;::::1;::::0;1707:8;;1790:5;;1719:20;;1831:16;;1751:102:::1;:::i;:::-;;;;;;;;953:905;776:1082:::0;;;;;:::o;1240:116:42:-;1301:4;1320:31;:12;1342:8;1320:21;:31::i;:::-;1313:38;1240:116;-1:-1:-1;;1240:116:42:o;2126:453:40:-;2231:10;3211:31:46;:12;2231:10:40;3211:21:46;:31::i;:::-;3206:74;;3251:28;;;;;;;;;;;-1:-1:-1;;;3251:28:46;;;;3244:36;;-1:-1:-1;;;3244:36:46;;;;3251:28;3244:36;;;:::i;3206:74::-;-1:-1:-1;;;;;3046:22:46;;::::1;3092:1;3046:22:::0;;;:16:::1;:22;::::0;;;;:34:::1;;::::0;2256:11:40;;3046:34:46::1;3042:102;;3109:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3109:34:46::1;::::0;::::1;::::0;3102:42;;-1:-1:-1;;;3102:42:46;;::::1;::::0;3109:34;3102:42:::1;;;:::i;3042:102::-;-1:-1:-1::0;;;;;3497:22:46;;::::2;:2;:22:::0;;;:16:::2;:22;::::0;;;;:31:::2;;::::0;2290:11:40;;2303:10:::2;::::0;3497:31:46::2;:43:::0;::::2;3493:91;;3555:28;::::0;;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;3555:28:46::2;::::0;::::2;::::0;3548:36;;-1:-1:-1;;;3548:36:46;;::::2;::::0;3555:28;3548:36:::2;;;:::i;3493:91::-;-1:-1:-1::0;;;;;2343:29:40;::::3;2323:17;2343:29:::0;;;:16:::3;:29;::::0;;;;;;;;2441:21;;::::3;::::0;2458:3;;2441:21:::3;;:::i;:::-;;;;;;;;;;;;;2431:32;;;;;;2417:4;:8;;2400:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;2390:37;;;;;;:73:::0;2379:126:::3;;2477:27;::::0;;;;::::3;::::0;;::::3;::::0;;-1:-1:-1;;;2477:27:40::3;::::0;::::3;::::0;2470:35;;-1:-1:-1;;;2470:35:40;;::::3;::::0;2477:27;2470:35:::3;;;:::i;2379:126::-;2512:8;::::0;::::3;:14;2523:3:::0;2512:8;:14:::3;:::i;:::-;-1:-1:-1::0;2552:16:40::3;::::0;::::3;::::0;2537:37:::3;::::0;-1:-1:-1;;;;;2552:16:40;;::::3;::::0;2537:37:::3;::::0;::::3;::::0;2570:3;;2537:37:::3;:::i;5383:290:38:-:0;300:8:31;:6;:8::i;:::-;-1:-1:-1;;;;;286:22:31;:10;-1:-1:-1;;;;;286:22:31;;282:79;;325:29;;-1:-1:-1;;;325:29:31;;343:10;325:29;;;18912:51:84;18885:18;;325:29:31;18766:203:84;282:79:31;-1:-1:-1;;;;;5465:21:38;::::1;5461:62;;5495:27;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;5495:27:38::1;::::0;::::1;::::0;5488:35;;-1:-1:-1;;;5488:35:38;;::::1;::::0;5495:27;5488:35:::1;;;:::i;5461:62::-;5535:40;:24;5567:7:::0;5535:31:::1;:40::i;:::-;5530:90;;5590:29;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;5590:29:38::1;::::0;::::1;::::0;5583:37;;-1:-1:-1;;;5583:37:38;;::::1;::::0;5590:29;5583:37:::1;;;:::i;5530:90::-;5632:36;::::0;-1:-1:-1;;;;;5632:36:38;::::1;::::0;::::1;::::0;;;::::1;5383:290:::0;:::o;8128:105:44:-;8178:16;8209:19;:2;:17;:19::i;3724:148:38:-;3815:16;3801:3;3649:34:46;:20;3801:3:38;3649:29:46;:34::i;:::-;3644:84;;3698:29;;;;;;;;;;;-1:-1:-1;;;3698:29:46;;;;3691:37;;-1:-1:-1;;;3691:37:46;;;;3698:29;3691:37;;;:::i;3644:84::-;3846:2:38::1;:21:::0;;;:16:::1;:21;::::0;;;;;;;3839:28;;;;;;::::1;::::0;;;;;;;;;;;;3846:21;;3839:28;::::1;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;3839:28:38::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;3724:148:::0;;;;:::o;2583:262:40:-;2644:11;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2644:11:40;2717:30;:8;2735:11;2717:17;:30::i;:::-;2712:85;;2762:34;;;;;;;;;;;-1:-1:-1;;;2762:34:40;;;;2755:42;;-1:-1:-1;;;2755:42:40;;;;2762:34;2755:42;;;:::i;2712:85::-;-1:-1:-1;;;;;2811:29:40;;:2;:29;;;:16;:29;;;;;;;2804:36;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2804:36:40;;;-1:-1:-1;;2804:36:40;;;;-1:-1:-1;;;;;2804:36:40;;;;;;;;;;;;;;;;;;;;;2583:262;-1:-1:-1;;2583:262:40:o;6933:504:44:-;7031:8;3345:29:46;:2;7031:8:44;3345:19:46;:29::i;:::-;3340:73;;3383:29;;;;;;;;;;;-1:-1:-1;;;3383:29:46;;;;3376:37;;-1:-1:-1;;;3376:37:46;;;;3383:29;3376:37;;;:::i;3340:73::-;-1:-1:-1;;;;;3046:22:46;;::::1;3092:1;3046:22:::0;;;:16:::1;:22;::::0;;;;:34:::1;;::::0;7050:11:44;;3046:34:46::1;3042:102;;3109:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3109:34:46::1;::::0;::::1;::::0;3102:42;;-1:-1:-1;;;3102:42:46;;::::1;::::0;3109:34;3102:42:::1;;;:::i;3042:102::-;7069:21:44::2;7093:23:::0;;;:13:::2;:23;::::0;;;;;7182:151:::2;7206:12;::::0;::::2;:19:::0;7202:23;::::2;7182:151;;;7263:11;-1:-1:-1::0;;;;;7244:30:44::2;:6;:12;;7257:1;7244:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;7244:15:44::2;:30:::0;7240:86:::2;;7291:34;::::0;;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;7291:34:44::2;::::0;::::2;::::0;7284:42;;-1:-1:-1;;;7284:42:44;;::::2;::::0;7291:34;7284:42:::2;;;:::i;7240:86::-;7227:3;;7182:151;;;-1:-1:-1::0;7339:12:44::2;::::0;::::2;:30:::0;;::::2;::::0;;::::2;::::0;;-1:-1:-1;7339:30:44;;;::::2;::::0;;;;;;::::2;::::0;;-1:-1:-1;;;;;;7339:30:44::2;-1:-1:-1::0;;;;;7339:30:44;::::2;::::0;;::::2;::::0;;;7381:51:::2;::::0;;24840:25:84;;;24881:18;;;24874:60;;;;24950:18;;24943:50;7381:51:44::2;::::0;24828:2:84;24813:18;7381:51:44::2;;;;;;;7063:374;3419:1:46::1;6933:504:44::0;;;:::o;1712:826:38:-;1843:10;3806:42:46;:24;1843:10:38;3806:33:46;:42::i;:::-;3801:91;;3863:28;;;;;;;;;;;-1:-1:-1;;;3863:28:46;;;;3856:36;;-1:-1:-1;;;3856:36:46;;;;3863:28;3856:36;;;:::i;3801:91::-;1881:1:38::1;1865:17:::0;;;1861:58:::1;;1891:27;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1891:27:38::1;::::0;::::1;::::0;1884:35;;-1:-1:-1;;;1884:35:38;;::::1;::::0;1891:27;1884:35:::1;;;:::i;1861:58::-;1931:34;:20;1961:3:::0;1931:29:::1;:34::i;:::-;1926:85;;1975:29;:20;2000:3:::0;1975:24:::1;:29::i;:::-;;1926:85;2085:24;2112:21:::0;;;:16:::1;:21;::::0;;;;:28;;2146:258:::1;2170:16;2166:1;:20;2146:258;;;2205:2;:21:::0;;;:16:::1;:21;::::0;;;;:24;;-1:-1:-1;;;;;2205:51:38;::::1;::::0;:21;2227:1;;2205:24;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:36:::1;:24;::::0;;::::1;;:36;::::0;-1:-1:-1;;;;;2205:36:38::1;:51:::0;2201:197:::1;;2268:2;:21:::0;;;:16:::1;:21;::::0;;;;:24;;2301:5;;;;2290:1;;2268:24;::::1;;;;;:::i;:::-;;;;;;;;;;;:30;;:38;;;;;;;:::i;:::-;;-1:-1:-1::0;;;;;;;;;;;2342:3:38::1;2347:11;2360:5;;2367;2321:52;;;;;;;;;;:::i;:::-;;;;;;;;2383:7;;;;2201:197;2188:3;;2146:258;;;;2410:2;:16;;:21;2427:3;2410:21;;;;;;;;;;;2437:32;;;;;;;;2445:3;2437:32;;;;2450:11;-1:-1:-1::0;;;;;2437:32:38::1;;;;;2463:5;;2437:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;2437:32:38;;;;-1:-1:-1;;2410:60:38;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;2410:60:38::1;-1:-1:-1::0;;;;;2410:60:38;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;2410:60:38::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;;;;-1:-1:-1::0;;;;;;;;;;;2502:3:38::1;2507:11;2520:5;;2527;2481:52;;;;;;;;;;:::i;3898:1:46:-;1712:826:38::0;;;;;:::o;3055:254:40:-;3101:13;3122:19;3155:17;:8;:15;:17::i;:::-;-1:-1:-1;;;;;3144:29:40;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3144:29:40;;;;;;;;;;;;;;;;;3122:51;;3185:9;3180:106;3204:17;:8;:15;:17::i;:::-;3200:1;:21;3180:106;;;3247:16;:2;3264:14;:8;3276:1;3264:11;:14::i;:::-;-1:-1:-1;;;;;3247:32:40;;;;;;;;;;;;;;-1:-1:-1;3247:32:40;3236:43;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3236:43:40;;;-1:-1:-1;;3236:43:40;;;;-1:-1:-1;;;;;3236:43:40;;;;;;;;;;;;;;;;;;;;:8;;:5;;3242:1;;3236:8;;;;;;:::i;:::-;;;;;;;;;;:43;3223:3;;3180:106;;1360:466:42;300:8:31;:6;:8::i;:::-;-1:-1:-1;;;;;286:22:31;:10;-1:-1:-1;;;;;286:22:31;;282:79;;325:29;;-1:-1:-1;;;325:29:31;;343:10;325:29;;;18912:51:84;18885:18;;325:29:31;18766:203:84;282:79:31;1432:31:42::1;:12;1454:8:::0;1432:21:::1;:31::i;:::-;1427:90;;1478:38;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1478:38:42::1;::::0;::::1;::::0;1471:46;;-1:-1:-1;;;1471:46:42;;::::1;::::0;1478:38;1471:46:::1;;;:::i;1427:90::-;1583:9;1578:171;1602:17;:8;:15;:17::i;:::-;1598:1;:21;1578:171;;;-1:-1:-1::0;;;;;1638:53:42;::::1;:16;:2;1655:14;:8;1667:1:::0;1655:11:::1;:14::i;:::-;-1:-1:-1::0;;;;;1638:32:42;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;1638:32:42;:41:::1;;::::0;::::1;:53:::0;1634:108:::1;;1708:33;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1708:33:42::1;::::0;::::1;::::0;1701:41;;-1:-1:-1;;;1701:41:42;;::::1;::::0;1708:33;1701:41:::1;;;:::i;1634:108::-;1621:3;;1578:171;;;-1:-1:-1::0;1755:29:42::1;:12;1775:8:::0;1755:19:::1;:29::i;:::-;-1:-1:-1::0;1796:25:42::1;::::0;-1:-1:-1;;;;;1796:25:42;::::1;::::0;::::1;::::0;;;::::1;1360:466:::0;:::o;1248:476:40:-;-1:-1:-1;;;;;3497:22:46;;;:2;:22;;;:16;:22;;;;;:31;;;1323:11:40;;1336:10;;3497:31:46;:43;;3493:91;;3555:28;;;;;;;;;;;-1:-1:-1;;;3555:28:46;;;;3548:36;;-1:-1:-1;;;3548:36:46;;;;3555:28;3548:36;;;:::i;3493:91::-;-1:-1:-1;;;;;1358:29:40;;::::1;1411:1;1358:29:::0;;;:16:::1;:29;::::0;;;;:41:::1;;::::0;::::1;1354:118;;1430:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1430:34:40::1;::::0;::::1;::::0;1423:42;;-1:-1:-1;;;1423:42:40;;::::1;::::0;1430:34;1423:42:::1;;;:::i;1354:118::-;1522:18;-1:-1:-1::0;;;;;1482:29:40;::::1;:2;:29:::0;;;:16:::1;:29;::::0;;;;:36;::::1;;:58;::::0;::::1;;;;;;:::i;:::-;;1478:129;;1557:42;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1557:42:40::1;::::0;::::1;::::0;1550:50;;-1:-1:-1;;;1550:50:40;;::::1;::::0;1557:42;1550:50:::1;;;:::i;1478:129::-;1613:28;:8;1629:11:::0;1613:15:::1;:28::i;:::-;-1:-1:-1::0;;;;;;1654:29:40;::::1;:2;:29:::0;;;:16:::1;:29;::::0;;;;1647:36;;-1:-1:-1;;1647:36:40::1;::::0;;1654:29;1647:36:::1;::::0;;::::1;1654:2:::0;1647:36:::1;:::i;:::-;-1:-1:-1::0;1647:36:40::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;1647:36:40;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;1695:24:::1;::::0;-1:-1:-1;;;;;1695:24:40;::::1;::::0;::::1;::::0;1647:36:::1;::::0;1695:24:::1;1248:476:::0;;;:::o;3065:587:38:-;3180:10;3806:42:46;:24;3180:10:38;3806:33:46;:42::i;:::-;3801:91;;3863:28;;;;;;;;;;;-1:-1:-1;;;3863:28:46;;;;3856:36;;-1:-1:-1;;;3856:36:46;;;;3863:28;3856:36;;;:::i;3801:91::-;3198:10:38::1;3227:9:::0;3222:310:::1;3246:2;:21:::0;;;:16:::1;:21;::::0;;;;:28;3242:32;::::1;3222:310;;;3293:2;:21:::0;;;:16:::1;:21;::::0;;;;:24;;-1:-1:-1;;;;;3293:51:38;::::1;::::0;:21;3315:1;;3293:24;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:36:::1;:24;::::0;;::::1;;:36;::::0;-1:-1:-1;;;;;3293:36:38::1;:51:::0;3289:237:::1;;3383:2;:21:::0;;;:16:::1;:21;::::0;;;;3416:28;;:32:::1;::::0;3447:1:::1;::::0;3416:32:::1;:::i;:::-;3383:75;;;;;;;;:::i;:::-;;;;;;;;;;;3356:2;:16;;:21;3373:3;3356:21;;;;;;;;;;;3378:1;3356:24;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:102;;:24:::1;::::0;;::::1;;:102:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;3356:102:38::1;-1:-1:-1::0;;;;;3356:102:38;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;3468:2:38::1;:21:::0;;;:16:::1;:21;::::0;;;;:27;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;3468:27:38;;;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;3468:27:38::1;::::0;;;::::1;;::::0;::::1;::::0;::::1;:::i;:::-;;;;;3513:4;3505:12;;3289:237;3276:3;;3222:310;;;;3543:5;3538:49;;3557:29;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3557:29:38::1;::::0;::::1;::::0;3550:37;;-1:-1:-1;;;3550:37:38;;::::1;::::0;3557:29;3550:37:::1;;;:::i;3538:49::-;3599:48;::::0;;17569:25:84;;;-1:-1:-1;;;;;17630:31:84;;17625:2;17610:18;;17603:59;17698:3;17678:18;;;17671:31;;;-1:-1:-1;17718:19:84;;;17711:30;3642:4:38::1;17808:2:84::0;17793:18;;17786:50;3599:48:38;;-1:-1:-1;;;;;;;;;;;3599:48:38;;;;17773:3:84;3599:48:38;;::::1;3192:460;3065:587:::0;;;:::o;738:220:42:-;303:66:22;1263:42:21;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:21;;;;;;;;;;;1258:100;853:9:42::1;848:106;868:27:::0;;::::1;848:106;;;910:37;927:16;;944:1;927:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;910:16;:37::i;:::-;897:3;;848:106;;8029:95:44::0;8078:7;8100:19;8078:7;8100:17;:19::i;5190:121:38:-;300:8:31;:6;:8::i;:::-;-1:-1:-1;;;;;286:22:31;:10;-1:-1:-1;;;;;286:22:31;;282:79;;325:29;;-1:-1:-1;;;325:29:31;;343:10;325:29;;;18912:51:84;18885:18;;325:29:31;18766:203:84;282:79:31;5269:37:38::1;5298:7;5269:28;:37::i;2944:107:40:-:0;2998:16;3029:17;:8;:15;:17::i;8585:544:44:-;8678:21;8701:4;8729;8721:5;:12;8735:27;;;;;;;;;;;;;-1:-1:-1;;;8735:27:44;;;8713:50;;;;;-1:-1:-1;;;8713:50:44;;;;;;;;:::i;:::-;-1:-1:-1;8770:29:44;8821:12;8828:5;8821:4;:12;:::i;:::-;-1:-1:-1;;;;;8802:32:44;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;8770:64;;8853:9;8841:232;8889:19;:2;:17;:19::i;:::-;8876:9;8884:1;8876:5;:9;:::i;:::-;8875:33;8874:59;;;;-1:-1:-1;8928:4:44;8915:9;8923:1;8915:5;:9;:::i;:::-;8914:18;8874:59;8841:232;;;8959:10;8972:24;8986:9;8994:1;8986:5;:9;:::i;:::-;8972:2;;:13;:24::i;:::-;9017:49;;;;;;;;;;;-1:-1:-1;9047:17:44;;;:13;9017:49;9047:17;;;;;;;9017:49;;;;;;;;;;;;;;;-1:-1:-1;;;;;9017:49:44;;;;;;;-1:-1:-1;;;9017:49:44;;;;;;;;-1:-1:-1;;;9017:49:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;8959:37;;-1:-1:-1;9017:49:44;;;;;;;;9047:17;;9017:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9017:49:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;9004:7;9012:1;9004:10;;;;;;;;:::i;:::-;;;;;;:62;;;;8951:122;8941:3;;;;:::i;:::-;;;8841:232;;;-1:-1:-1;9087:7:44;9104:19;:2;:17;:19::i;:::-;9079:45;;9096:27;;;;-1:-1:-1;;;;8585:544:44:o;4975:146:38:-;5055:4;5074:42;:24;5108:7;5074:33;:42::i;2777:1696:44:-;2967:10;3092:1:46;3046:22;;;:16;:22;;;;;:34;;;-1:-1:-1;;;;;3046:34:46;3042:102;;3109:34;;;;;;;;;;;-1:-1:-1;;;3109:34:46;;;;3102:42;;-1:-1:-1;;;3102:42:46;;;;3109:34;3102:42;;;:::i;3042:102::-;3043:29:44::1;:2;3063:8:::0;3043:19:::1;:29::i;:::-;3038:88;;3089:29;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3089:29:44::1;::::0;::::1;::::0;3082:37;;-1:-1:-1;;;3082:37:44;;::::1;::::0;3089:29;3082:37:::1;;;:::i;3038:88::-;3132:21;3156:23:::0;;;:13:::1;:23;::::0;;;;3971:44;;;4021:23:::1;::::0;::::1;:42:::0;;-1:-1:-1;;4021:42:44::1;-1:-1:-1::0;;;;;4021:42:44;::::1;;::::0;;4110:63;::::1;;;599:1;4132:12:::0;;::::1;:34:::0;;-1:-1:-1;;;;4132:34:44;::::1;-1:-1:-1::0;;;4132:34:44;;;::::1;-1:-1:-1::0;;;;;4132:34:44::1;::::0;;::::1;;::::0;;;::::1;::::0;;4110:63:::1;4260:16;-1:-1:-1::0;;;;;4260:21:44::1;4280:1;4260:21:::0;4256:88:::1;;4298:2;:39:::0;;;:29:::1;:39;::::0;;;;4291:46:::1;::::0;::::1;:::i;:::-;4355:113;::::0;;29179:25:84;;;29235:2;29220:18;;29213:34;;;-1:-1:-1;;;;;29283:31:84;;29263:18;;;29256:59;29358:14;;29351:22;29346:2;29331:18;;29324:50;4355:113:44;;::::1;::::0;;;;29166:3:84;4355:113:44;;::::1;2979:1494;2777:1696:::0;;;;;;:::o;7441:584::-;7542:8;3345:29:46;:2;7542:8:44;3345:19:46;:29::i;:::-;3340:73;;3383:29;;;;;;;;;;;-1:-1:-1;;;3383:29:46;;;;3376:37;;-1:-1:-1;;;3376:37:46;;;;3383:29;3376:37;;;:::i;3340:73::-;-1:-1:-1;;;;;3046:22:46;;::::1;3092:1;3046:22:::0;;;:16:::1;:22;::::0;;;;:34:::1;;::::0;7561:11:44;;3046:34:46::1;3042:102;;3109:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3109:34:46::1;::::0;::::1;::::0;3102:42;;-1:-1:-1;;;3102:42:46;;::::1;::::0;3109:34;3102:42:::1;;;:::i;3042:102::-;7580:21:44::2;7604:23:::0;;;:13:::2;:23;::::0;;;;;7580:21;7658:239:::2;7682:12;::::0;::::2;:19:::0;7678:23;::::2;7658:239;;;7739:11;-1:-1:-1::0;;;;;7720:30:44::2;:6;:12;;7733:1;7720:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;7720:15:44::2;:30:::0;7716:175:::2;;7780:12;::::0;::::2;7793:19:::0;;:23:::2;::::0;7815:1:::2;::::0;7793:23:::2;:::i;:::-;7780:37;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;7762:12:::2;::::0;::::2;:15:::0;;-1:-1:-1;;;;;7780:37:44;;::::2;::::0;7775:1;;7762:15;::::2;;;;;:::i;:::-;;;;;;;;;:55;;;;;-1:-1:-1::0;;;;;7762:55:44::2;;;;;-1:-1:-1::0;;;;;7762:55:44::2;;;;;;7827:6;:12;;:18;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;-1:-1:-1;;7827:18:44;;;;;-1:-1:-1;;;;;;7827:18:44::2;::::0;;;;;::::2;::::0;-1:-1:-1;7877:5:44::2;;7716:175;7703:3;;7658:239;;;;7907:5;7902:54;;7921:34;::::0;;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;7921:34:44::2;::::0;::::2;::::0;7914:42;;-1:-1:-1;;;7914:42:44;;::::2;::::0;7921:34;7914:42:::2;;;:::i;7902:54::-;7968:52;::::0;;24840:25:84;;;-1:-1:-1;;;;;24901:32:84;;24896:2;24881:18;;24874:60;8014:5:44::2;24950:18:84::0;;;24943:50;;;;7968:52:44::2;::::0;24828:2:84;24813:18;7968:52:44::2;24644:355:84::0;643:601:40;762:10;3211:31:46;:12;762:10:40;3211:21:46;:31::i;:::-;3206:74;;3251:28;;;;;;;;;;;-1:-1:-1;;;3251:28:46;;;;3244:36;;-1:-1:-1;;;3244:36:46;;;;3251:28;3244:36;;;:::i;3206:74::-;-1:-1:-1;;;;;845:29:40;;::::1;898:1;845:29:::0;;;:16:::1;:29;::::0;;;;:41:::1;;::::0;::::1;:55:::0;841:109:::1;;915:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;915:34:40::1;::::0;::::1;::::0;908:42;;-1:-1:-1;;;908:42:40;;::::1;::::0;915:34;908:42:::1;;;:::i;841:109::-;957:19;979:110;;;;;;;;1048:6;979:110;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;979:110:40;::::1;::::0;;;;1072:10:::1;979:110:::0;;;;;957:132;-1:-1:-1;1096:25:40::1;:8;1005:11:::0;1096:12:::1;:25::i;:::-;-1:-1:-1::0;;;;;;1153:29:40;::::1;:2;:29:::0;;;:16:::1;:29;::::0;;;;:39;;;;1185:7;;1153:29;:39;:29;;-1:-1:-1;;1153:39:40::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;1153:39:40::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;1153:39:40::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;1153:39:40;;::::1;-1:-1:-1::0;;;;;1153:39:40;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;1204:35;;;;::::1;::::0;::::1;::::0;::::1;::::0;1227:3;;1232:6;;1204:35:::1;:::i;:::-;;;;;;;;774:470;643:601:::0;;;;:::o;1510:123:38:-;1575:4;1594:34;:20;1624:3;1594:29;:34::i;4477:2452:44:-;4576:10;3092:1:46;3046:22;;;:16;:22;;;;;:34;;;-1:-1:-1;;;;;3046:34:46;3042:102;;3109:34;;;;;;;;;;;-1:-1:-1;;;3109:34:46;;;;3102:42;;-1:-1:-1;;;3102:42:46;;;;3109:34;3102:42;;;:::i;3042:102::-;4599:9:44::1;4594:2331;4614:21:::0;;::::1;4594:2331;;;4650:31;4684:10;;4695:1;4684:13;;;;;;;:::i;:::-;;;::::0;;;::::1;::::0;-1:-1:-1;4711:39:44::1;::::0;-1:-1:-1;4731:18:44::1;::::0;::::1;4711:19;:39::i;:::-;4706:277;;4767:189;4810:18:::0;::::1;4840:27;::::0;::::1;;4879:26;::::0;;;::::1;::::0;::::1;;:::i;:::-;4917:29;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;4917:29:44::1;::::0;::::1;::::0;4767:189;;::::1;::::0;;;;4917:29;4767:189:::1;:::i;:::-;;;;;;;;4966:8;;;4706:277;5029:18:::0;::::1;4991:21;5015:33:::0;;;:13:::1;:33;::::0;;;;;;6328:27;;::::1;;6301:54:::0;;6389:26:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;6363:23;::::0;::::1;:52:::0;;-1:-1:-1;;6363:52:44::1;-1:-1:-1::0;;;;;6363:52:44;;;::::1;::::0;;;::::1;::::0;;6470:18:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;6466:77;;;599:1;6500:12:::0;;::::1;:34:::0;;-1:-1:-1;;;;6500:34:44;::::1;-1:-1:-1::0;;;6500:34:44;;;::::1;-1:-1:-1::0;;;;;6500:34:44::1;::::0;;::::1;;::::0;;;::::1;::::0;;6466:77:::1;6634:26;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;6634:31:44::1;6664:1;6634:31:::0;6630:112:::1;;6714:18:::0;::::1;6684:2;:49:::0;;;:29:::1;:49;::::0;;;;6677:56:::1;::::0;::::1;:::i;:::-;6755:163;6791:18:::0;::::1;6819:27;::::0;::::1;;6856:26;::::0;;;::::1;::::0;::::1;;:::i;:::-;6892:18;::::0;;;::::1;::::0;::::1;;:::i;:::-;6755:163;;;;;;;;29179:25:84::0;;;29235:2;29220:18;;29213:34;;;;-1:-1:-1;;;;;29283:31:84;29278:2;29263:18;;29256:59;29358:14;29351:22;29346:2;29331:18;;29324:50;29166:3;29151:19;;28956:424;6755:163:44::1;;;;;;;;4642:2283;;4594:2331;4637:3;;4594:2331;;;;4477:2452:::0;;;:::o;8871:165:61:-;-1:-1:-1;;;;;9004:23:61;;8951:4;4360:21;;;:14;;;:21;;;;;;:26;;8974:55;8967:62;8871:165;-1:-1:-1;;;8871:165:61:o;6431:138::-;6511:4;4360:21;;;:14;;;:21;;;;;;:26;;6534:28;4264:129;6221;6294:4;6317:26;6325:3;6337:5;6317:7;:26::i;6650:115::-;6713:7;6739:19;6747:3;4556:18;;4474:107;7107:129;7181:7;7207:22;7211:3;7223:5;7207:3;:22::i;376:103:31:-;291:66:33;445:29:31;-1:-1:-1;;;;;445:29:31;;376:103::o;2005:320:42:-;-1:-1:-1;;;;;2101:22:42;;2097:63;;2132:27;;;;;;;;;;;-1:-1:-1;;;2132:27:42;;;;2125:35;;-1:-1:-1;;;2125:35:42;;;;2132:27;2125:35;;;:::i;2097:63::-;2171:31;:12;2193:8;2171:21;:31::i;:::-;2167:85;;;2217:34;;;;;;;;;;;-1:-1:-1;;;2217:34:42;;;;2210:42;;-1:-1:-1;;;2210:42:42;;;;2217:34;2210:42;;;:::i;2167:85::-;2259:26;:12;2276:8;2259:16;:26::i;:::-;-1:-1:-1;2297:23:42;;-1:-1:-1;;;;;2297:23:42;;;;;;;;2005:320;:::o;5944:282:38:-;-1:-1:-1;;;;;6018:21:38;;6014:62;;6048:27;;;;;;;;;;;-1:-1:-1;;;6048:27:38;;;;6041:35;;-1:-1:-1;;;6041:35:38;;;;6048:27;6041:35;;;:::i;6014:62::-;6088:37;:24;6117:7;6088:28;:37::i;:::-;6083:92;;6140:34;;;;;;;;;;;-1:-1:-1;;;6140:34:38;;;;6133:42;;-1:-1:-1;;;6133:42:38;;;;6140:34;6133:42;;;:::i;6083:92::-;6187:34;;-1:-1:-1;;;;;6187:34:38;;;;;;;;5944:282;:::o;3313:624:40:-;3437:25;3429:4;:33;;;;;;;;:::i;:::-;;:141;;;-1:-1:-1;3481:21:40;3473:4;:29;;;;;;;;:::i;:::-;;:96;;;;-1:-1:-1;3521:17:40;3515:2;:23;;;;;;;;:::i;:::-;;:53;;;-1:-1:-1;3548:20:40;3542:2;:26;;;;;;;;:::i;:::-;;3515:53;3429:250;;;-1:-1:-1;3589:22:40;3581:4;:30;;;;;;;;:::i;:::-;;:97;;;;-1:-1:-1;3630:17:40;3624:2;:23;;;;;;;;:::i;:::-;;:53;;;-1:-1:-1;3657:20:40;3651:2;:26;;;;;;;;:::i;:::-;;3624:53;3429:355;;;-1:-1:-1;3698:20:40;3690:4;:28;;;;;;;;:::i;:::-;;:93;;;;-1:-1:-1;3737:17:40;3731:2;:23;;;;;;;;:::i;:::-;;:51;;;-1:-1:-1;3764:18:40;3758:2;:24;;;;;;;;:::i;:::-;;3731:51;3429:420;;;-1:-1:-1;3803:17:40;3795:4;:25;;;;;;;;:::i;:::-;;:53;;;;-1:-1:-1;3830:18:40;3824:2;:24;;;;;;;;:::i;:::-;;3795:53;3418:459;;;3313:624;;:::o;3418:459::-;3889:42;;;;;;;;;;;-1:-1:-1;;;3889:42:40;;;;3882:50;;-1:-1:-1;;;3882:50:40;;;;3889:42;3882:50;;;:::i;5930:123:61:-;6000:4;6023:23;6028:3;6040:5;6023:4;:23::i;8634:156::-;8707:4;8730:53;8738:3;-1:-1:-1;;;;;8758:23:61;;8730:7;:53::i;7776:300::-;7839:16;7867:22;7892:19;7900:3;7892:7;:19::i;8316:150::-;8386:4;8409:50;8414:3;-1:-1:-1;;;;;8434:23:61;;8409:4;:50::i;2815:1368::-;2881:4;3010:21;;;:14;;;:21;;;;;;3046:13;;3042:1135;;3413:18;3434:12;3445:1;3434:8;:12;:::i;:::-;3480:18;;3413:33;;-1:-1:-1;3460:17:61;;3480:22;;3501:1;;3480:22;:::i;:::-;3460:42;;3535:9;3521:10;:23;3517:378;;3564:17;3584:3;:11;;3596:9;3584:22;;;;;;;;:::i;:::-;;;;;;;;;3564:42;;3731:9;3705:3;:11;;3717:10;3705:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;3844:25;;;:14;;;:25;;;;;:36;;;3517:378;3973:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4076:3;:14;;:21;4091:5;4076:21;;;;;;;;;;;4069:28;;;4119:4;4112:11;;;;;;;3042:1135;4161:5;4154:12;;;;;4923:118;4990:7;5016:3;:11;;5028:5;5016:18;;;;;;;;:::i;:::-;;;;;;;;;5009:25;;4923:118;;;;:::o;2241:406::-;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:61;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:61;2618:12;;5581:109;5637:16;5672:3;:11;;5665:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5581:109;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;14:180:84;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:84;;14:180;-1:-1:-1;14:180:84:o;199:250::-;284:1;294:113;308:6;305:1;302:13;294:113;;;384:11;;;378:18;365:11;;;358:39;330:2;323:10;294:113;;;-1:-1:-1;;441:1:84;423:16;;416:27;199:250::o;454:270::-;495:3;533:5;527:12;560:6;555:3;548:19;576:76;645:6;638:4;633:3;629:14;622:4;615:5;611:16;576:76;:::i;:::-;706:2;685:15;-1:-1:-1;;681:29:84;672:39;;;;713:4;668:50;;454:270;-1:-1:-1;;454:270:84:o;729:1134::-;921:4;950:2;990;979:9;975:18;1020:2;1009:9;1002:21;1043:6;1078;1072:13;1109:6;1101;1094:22;1135:2;1125:12;;1168:2;1157:9;1153:18;1146:25;;1230:2;1220:6;1217:1;1213:14;1202:9;1198:30;1194:39;1268:2;1260:6;1256:15;1289:1;1299:535;1313:6;1310:1;1307:13;1299:535;;;1378:22;;;-1:-1:-1;;1374:36:84;1362:49;;1434:13;;1502:9;;1487:25;;1559:11;;;1553:18;-1:-1:-1;;;;;1549:43:84;1532:15;;;1525:68;1632:11;;1626:18;1470:4;1664:15;;;1657:27;;;1707:47;1738:15;;;1626:18;1707:47;:::i;:::-;1812:12;;;;1697:57;-1:-1:-1;;;1777:15:84;;;;1335:1;1328:9;1299:535;;;-1:-1:-1;1851:6:84;;729:1134;-1:-1:-1;;;;;;;;729:1134:84:o;1868:948::-;1917:3;1956:4;1951:3;1947:14;1988:5;1982:12;1977:3;1970:25;2014:4;2064;2057:5;2053:16;2047:23;-1:-1:-1;;;;;2157:2:84;2143:12;2139:21;2132:4;2127:3;2123:14;2116:45;2222:2;2214:4;2207:5;2203:16;2197:23;2193:32;2186:4;2181:3;2177:14;2170:56;2287:2;2279:4;2272:5;2268:16;2262:23;2258:32;2251:4;2246:3;2242:14;2235:56;;;2339:4;2332:5;2328:16;2322:23;2377:4;2370;2365:3;2361:14;2354:28;2404:4;2437:14;2431:21;2474:6;2468:4;2461:20;2508:3;2503;2499:13;2490:22;;2555:4;2539:14;2535:25;2521:39;;2578:1;2569:10;;2588:201;2602:6;2599:1;2596:13;2588:201;;;2669:13;;-1:-1:-1;;;;;2665:39:84;2651:54;;2764:15;;;;2701:1;2617:9;;;;;2727:14;;;;2588:201;;;-1:-1:-1;2805:5:84;1868:948;-1:-1:-1;;;;;;1868:948:84:o;2821:255::-;2998:2;2987:9;2980:21;2961:4;3018:52;3066:2;3055:9;3051:18;3043:6;3018:52;:::i;3081:173::-;3149:20;;-1:-1:-1;;;;;3198:31:84;;3188:42;;3178:70;;3244:1;3241;3234:12;3178:70;3081:173;;;:::o;3259:186::-;3318:6;3371:2;3359:9;3350:7;3346:23;3342:32;3339:52;;;3387:1;3384;3377:12;3339:52;3410:29;3429:9;3410:29;:::i;3450:615::-;3536:6;3544;3597:2;3585:9;3576:7;3572:23;3568:32;3565:52;;;3613:1;3610;3603:12;3565:52;3653:9;3640:23;-1:-1:-1;;;;;3723:2:84;3715:6;3712:14;3709:34;;;3739:1;3736;3729:12;3709:34;3777:6;3766:9;3762:22;3752:32;;3822:7;3815:4;3811:2;3807:13;3803:27;3793:55;;3844:1;3841;3834:12;3793:55;3884:2;3871:16;3910:2;3902:6;3899:14;3896:34;;;3926:1;3923;3916:12;3896:34;3979:7;3974:2;3964:6;3961:1;3957:14;3953:2;3949:23;3945:32;3942:45;3939:65;;;4000:1;3997;3990:12;3939:65;4031:2;4023:11;;;;;4053:6;;-1:-1:-1;3450:615:84;;-1:-1:-1;;;;3450:615:84:o;4070:263::-;4161:5;4155:12;4150:3;4143:25;4125:3;4214:4;4207:5;4203:16;4197:23;4252:4;4245;4240:3;4236:14;4229:28;4273:54;4321:4;4316:3;4312:14;4298:12;4273:54;:::i;:::-;4266:61;4070:263;-1:-1:-1;;;;4070:263:84:o;4338:624::-;4403:3;4434;4466:5;4460:12;4493:6;4488:3;4481:19;4519:4;4548;4543:3;4539:14;4532:21;;4606:4;4596:6;4593:1;4589:14;4582:5;4578:26;4574:37;4645:4;4638:5;4634:16;4668:1;4678:258;4692:6;4689:1;4686:13;4678:258;;;4779:2;4775:7;4767:5;4761:4;4757:16;4753:30;4748:3;4741:43;4805:51;4851:4;4842:6;4836:13;4805:51;:::i;:::-;4914:12;;;;4797:59;-1:-1:-1;4879:15:84;;;;4714:1;4707:9;4678:258;;;-1:-1:-1;4952:4:84;;4338:624;-1:-1:-1;;;;;;;4338:624:84:o;4967:333::-;5206:2;5195:9;5188:21;5169:4;5226:68;5290:2;5279:9;5275:18;5267:6;5226:68;:::i;5487:486::-;5738:2;5727:9;5720:21;5701:4;5764:52;5812:2;5801:9;5797:18;5789:6;5764:52;:::i;:::-;5852:6;5847:2;5836:9;5832:18;5825:34;5907:9;5899:6;5895:22;5890:2;5879:9;5875:18;5868:50;5935:32;5960:6;5952;5935:32;:::i;:::-;5927:40;5487:486;-1:-1:-1;;;;;;5487:486:84:o;5978:151::-;6054:20;;6103:1;6093:12;;6083:40;;6119:1;6116;6109:12;6134:283;6217:6;6225;6278:2;6266:9;6257:7;6253:23;6249:32;6246:52;;;6294:1;6291;6284:12;6246:52;6317:29;6336:9;6317:29;:::i;:::-;6307:39;;6365:46;6407:2;6396:9;6392:18;6365:46;:::i;:::-;6355:56;;6134:283;;;;;:::o;6607:273::-;6796:2;6785:9;6778:21;6759:4;6816:58;6870:2;6859:9;6855:18;6847:6;6816:58;:::i;6885:127::-;6946:10;6941:3;6937:20;6934:1;6927:31;6977:4;6974:1;6967:15;7001:4;6998:1;6991:15;7017:275;7088:2;7082:9;7153:2;7134:13;;-1:-1:-1;;7130:27:84;7118:40;;-1:-1:-1;;;;;7173:34:84;;7209:22;;;7170:62;7167:88;;;7235:18;;:::i;:::-;7271:2;7264:22;7017:275;;-1:-1:-1;7017:275:84:o;7297:530::-;7339:5;7392:3;7385:4;7377:6;7373:17;7369:27;7359:55;;7410:1;7407;7400:12;7359:55;7446:6;7433:20;-1:-1:-1;;;;;7468:2:84;7465:26;7462:52;;;7494:18;;:::i;:::-;7538:55;7581:2;7562:13;;-1:-1:-1;;7558:27:84;7587:4;7554:38;7538:55;:::i;:::-;7618:2;7609:7;7602:19;7664:3;7657:4;7652:2;7644:6;7640:15;7636:26;7633:35;7630:55;;;7681:1;7678;7671:12;7630:55;7746:2;7739:4;7731:6;7727:17;7720:4;7711:7;7707:18;7694:55;7794:1;7769:16;;;7787:4;7765:27;7758:38;;;;7773:7;7297:530;-1:-1:-1;;;7297:530:84:o;7832:1287::-;7952:6;7960;7968;7976;8029:3;8017:9;8008:7;8004:23;8000:33;7997:53;;;8046:1;8043;8036:12;7997:53;8082:9;8069:23;8059:33;;8111:2;8164;8153:9;8149:18;8136:32;-1:-1:-1;;;;;8228:2:84;8220:6;8217:14;8214:34;;;8244:1;8241;8234:12;8214:34;8282:6;8271:9;8267:22;8257:32;;8327:7;8320:4;8316:2;8312:13;8308:27;8298:55;;8349:1;8346;8339:12;8298:55;8385:2;8372:16;8407:2;8403;8400:10;8397:36;;;8413:18;;:::i;:::-;8459:2;8456:1;8452:10;8482:28;8506:2;8502;8498:11;8482:28;:::i;:::-;8544:15;;;8614:11;;;8610:20;;;8575:12;;;;8642:19;;;8639:39;;;8674:1;8671;8664:12;8639:39;8698:11;;;;8718:148;8734:6;8729:3;8726:15;8718:148;;;8800:23;8819:3;8800:23;:::i;:::-;8788:36;;8751:12;;;;8844;;;;8718:148;;;8885:5;-1:-1:-1;;;;8937:2:84;8922:18;;8909:32;;-1:-1:-1;8994:2:84;8979:18;;8966:32;;-1:-1:-1;9010:16:84;;;9007:36;;;9039:1;9036;9029:12;9007:36;;;9062:51;9105:7;9094:8;9083:9;9079:24;9062:51;:::i;:::-;9052:61;;;7832:1287;;;;;;;:::o;9316:395::-;9394:6;9402;9455:2;9443:9;9434:7;9430:23;9426:32;9423:52;;;9471:1;9468;9461:12;9423:52;9494:29;9513:9;9494:29;:::i;:::-;9484:39;;9574:2;9563:9;9559:18;9546:32;-1:-1:-1;;;;;9593:6:84;9590:30;9587:50;;;9633:1;9630;9623:12;9587:50;9656:49;9697:7;9688:6;9677:9;9673:22;9656:49;:::i;:::-;9646:59;;;9316:395;;;;;:::o;9716:632::-;9887:2;9939:21;;;10009:13;;9912:18;;;10031:22;;;9858:4;;9887:2;10110:15;;;;10084:2;10069:18;;;9858:4;10153:169;10167:6;10164:1;10161:13;10153:169;;;10228:13;;10216:26;;10297:15;;;;10262:12;;;;10189:1;10182:9;10153:169;;;-1:-1:-1;10339:3:84;;9716:632;-1:-1:-1;;;;;;9716:632:84:o;10353:127::-;10414:10;10409:3;10405:20;10402:1;10395:31;10445:4;10442:1;10435:15;10469:4;10466:1;10459:15;10485:238;10567:1;10560:5;10557:12;10547:143;;10612:10;10607:3;10603:20;10600:1;10593:31;10647:4;10644:1;10637:15;10675:4;10672:1;10665:15;10547:143;10699:18;;10485:238::o;10728:505::-;10793:45;10834:3;10826:5;10820:12;10793:45;:::i;:::-;10775:3;10884:4;10877:5;10873:16;10867:23;10922:4;10915;10910:3;10906:14;10899:28;10948:46;10988:4;10983:3;10979:14;10965:12;10948:46;:::i;:::-;11042:4;11031:16;;;11025:23;-1:-1:-1;;;;;11118:23:84;;;11102:14;;;11095:47;;;;11195:4;11184:16;;;11178:23;11174:32;11158:14;;;;11151:56;;;;-1:-1:-1;10936:58:84;;10728:505;-1:-1:-1;10728:505:84:o;11238:249::-;11411:2;11400:9;11393:21;11374:4;11431:50;11477:2;11466:9;11462:18;11454:6;11431:50;:::i;11492:254::-;11560:6;11568;11621:2;11609:9;11600:7;11596:23;11592:32;11589:52;;;11637:1;11634;11627:12;11589:52;11673:9;11660:23;11650:33;;11702:38;11736:2;11725:9;11721:18;11702:38;:::i;11751:171::-;11818:20;;-1:-1:-1;;;;;11867:30:84;;11857:41;;11847:69;;11912:1;11909;11902:12;11927:731;12014:6;12022;12030;12038;12091:2;12079:9;12070:7;12066:23;12062:32;12059:52;;;12107:1;12104;12097:12;12059:52;12143:9;12130:23;12120:33;;12172:37;12205:2;12194:9;12190:18;12172:37;:::i;:::-;12162:47;;12260:2;12249:9;12245:18;12232:32;-1:-1:-1;;;;;12324:2:84;12316:6;12313:14;12310:34;;;12340:1;12337;12330:12;12310:34;12378:6;12367:9;12363:22;12353:32;;12423:7;12416:4;12412:2;12408:13;12404:27;12394:55;;12445:1;12442;12435:12;12394:55;12485:2;12472:16;12511:2;12503:6;12500:14;12497:34;;;12527:1;12524;12517:12;12497:34;12572:7;12567:2;12558:6;12554:2;12550:15;12546:24;12543:37;12540:57;;;12593:1;12590;12583:12;12540:57;11927:731;;;;-1:-1:-1;;12624:2:84;12616:11;;-1:-1:-1;;;11927:731:84:o;12663:832::-;12849:4;12878:2;12918;12907:9;12903:18;12948:2;12937:9;12930:21;12971:6;13006;13000:13;13037:6;13029;13022:22;13075:2;13064:9;13060:18;13053:25;;13137:2;13127:6;13124:1;13120:14;13109:9;13105:30;13101:39;13087:53;;13175:2;13167:6;13163:15;13196:1;13206:260;13220:6;13217:1;13214:13;13206:260;;;13313:2;13309:7;13297:9;13289:6;13285:22;13281:36;13276:3;13269:49;13341:45;13379:6;13370;13364:13;13341:45;:::i;:::-;13331:55;-1:-1:-1;13444:12:84;;;;13409:15;;;;13242:1;13235:9;13206:260;;;-1:-1:-1;13483:6:84;;12663:832;-1:-1:-1;;;;;;;12663:832:84:o;13500:252::-;13567:6;13575;13628:2;13616:9;13607:7;13603:23;13599:32;13596:52;;;13644:1;13641;13634:12;13596:52;13680:9;13667:23;13657:33;;13709:37;13742:2;13731:9;13727:18;13709:37;:::i;13757:465::-;13810:3;13848:5;13842:12;13875:6;13870:3;13863:19;13901:4;13930;13925:3;13921:14;13914:21;;13969:4;13962:5;13958:16;13992:1;14002:195;14016:6;14013:1;14010:13;14002:195;;;14081:13;;-1:-1:-1;;;;;14077:39:84;14065:52;;14137:12;;;;14172:15;;;;14113:1;14031:9;14002:195;;;-1:-1:-1;14213:3:84;;13757:465;-1:-1:-1;;;;;13757:465:84:o;14227:261::-;14406:2;14395:9;14388:21;14369:4;14426:56;14478:2;14467:9;14463:18;14455:6;14426:56;:::i;14493:248::-;14561:6;14569;14622:2;14610:9;14601:7;14597:23;14593:32;14590:52;;;14638:1;14635;14628:12;14590:52;-1:-1:-1;;14661:23:84;;;14731:2;14716:18;;;14703:32;;-1:-1:-1;14493:248:84:o;14746:414::-;15007:2;14996:9;14989:21;14970:4;15027:68;15091:2;15080:9;15076:18;15068:6;15027:68;:::i;:::-;15019:76;;15145:6;15138:14;15131:22;15126:2;15115:9;15111:18;15104:50;14746:414;;;;;:::o;15165:160::-;15230:20;;15286:13;;15279:21;15269:32;;15259:60;;15315:1;15312;15305:12;15330:458;15421:6;15429;15437;15445;15453;15506:3;15494:9;15485:7;15481:23;15477:33;15474:53;;;15523:1;15520;15513:12;15474:53;15559:9;15546:23;15536:33;;15616:2;15605:9;15601:18;15588:32;15578:42;;15667:2;15656:9;15652:18;15639:32;15629:42;;15690:37;15723:2;15712:9;15708:18;15690:37;:::i;:::-;15680:47;;15746:36;15777:3;15766:9;15762:19;15746:36;:::i;:::-;15736:46;;15330:458;;;;;;;;:::o;15793:492::-;15895:6;15903;15911;15964:2;15952:9;15943:7;15939:23;15935:32;15932:52;;;15980:1;15977;15970:12;15932:52;16003:29;16022:9;16003:29;:::i;:::-;15993:39;;16083:2;16072:9;16068:18;16055:32;-1:-1:-1;;;;;16102:6:84;16099:30;16096:50;;;16142:1;16139;16132:12;16096:50;16165:49;16206:7;16197:6;16186:9;16182:22;16165:49;:::i;:::-;16155:59;;;16233:46;16275:2;16264:9;16260:18;16233:46;:::i;:::-;16223:56;;15793:492;;;;;:::o;16290:650::-;16408:6;16416;16469:2;16457:9;16448:7;16444:23;16440:32;16437:52;;;16485:1;16482;16475:12;16437:52;16525:9;16512:23;-1:-1:-1;;;;;16595:2:84;16587:6;16584:14;16581:34;;;16611:1;16608;16601:12;16581:34;16649:6;16638:9;16634:22;16624:32;;16694:7;16687:4;16683:2;16679:13;16675:27;16665:55;;16716:1;16713;16706:12;16665:55;16756:2;16743:16;16782:2;16774:6;16771:14;16768:34;;;16798:1;16795;16788:12;16768:34;16854:7;16849:2;16841:4;16833:6;16829:17;16825:2;16821:26;16817:35;16814:48;16811:68;;;16875:1;16872;16865:12;16945:219;17094:2;17083:9;17076:21;17057:4;17114:44;17154:2;17143:9;17139:18;17131:6;17114:44;:::i;17169:127::-;17230:10;17225:3;17221:20;17218:1;17211:31;17261:4;17258:1;17251:15;17285:4;17282:1;17275:15;17847:127;17908:10;17903:3;17899:20;17896:1;17889:31;17939:4;17936:1;17929:15;17963:4;17960:1;17953:15;17979:125;18044:9;;;18065:10;;;18062:36;;;18078:18;;:::i;18109:380::-;18188:1;18184:12;;;;18231;;;18252:61;;18306:4;18298:6;18294:17;18284:27;;18252:61;18359:2;18351:6;18348:14;18328:18;18325:38;18322:161;;18405:10;18400:3;18396:20;18393:1;18386:31;18440:4;18437:1;18430:15;18468:4;18465:1;18458:15;18494:127;18555:10;18550:3;18546:20;18543:1;18536:31;18586:4;18583:1;18576:15;18610:4;18607:1;18600:15;18626:135;18665:3;18686:17;;;18683:43;;18706:18;;:::i;:::-;-1:-1:-1;18753:1:84;18742:13;;18626:135::o;18974:201::-;19012:3;19040:10;19085:2;19078:5;19074:14;19112:2;19103:7;19100:15;19097:41;;19118:18;;:::i;:::-;19167:1;19154:15;;18974:201;-1:-1:-1;;;18974:201:84:o;19180:210::-;19327:2;19312:18;;19339:45;19316:9;19366:6;19339:45;:::i;19520:542::-;19621:2;19616:3;19613:11;19610:446;;;19657:1;19681:5;19678:1;19671:16;19725:4;19722:1;19712:18;19795:2;19783:10;19779:19;19776:1;19772:27;19766:4;19762:38;19831:4;19819:10;19816:20;19813:47;;;-1:-1:-1;19854:4:84;19813:47;19909:2;19904:3;19900:12;19897:1;19893:20;19887:4;19883:31;19873:41;;19964:82;19982:2;19975:5;19972:13;19964:82;;;20027:17;;;20008:1;19997:13;19964:82;;;19968:3;;;19520:542;;;:::o;20067:166::-;-1:-1:-1;;20195:1:84;20191:11;;;20187:24;20183:29;20173:40;20219:1;20215:11;;;;20170:57;;20067:166::o;20238:1341::-;20362:3;20356:10;-1:-1:-1;;;;;20381:6:84;20378:30;20375:56;;;20411:18;;:::i;:::-;20440:96;20529:6;20489:38;20521:4;20515:11;20489:38;:::i;:::-;20483:4;20440:96;:::i;:::-;20591:4;;20648:2;20637:14;;20665:1;20660:662;;;;21366:1;21383:6;21380:89;;;-1:-1:-1;21435:19:84;;;21429:26;21380:89;21495:67;21555:6;21548:5;21495:67;:::i;:::-;21489:4;21482:81;;20630:943;;20660:662;19467:1;19460:14;;;19504:4;19491:18;;-1:-1:-1;;20696:20:84;;;20813:236;20827:7;20824:1;20821:14;20813:236;;;20916:19;;;20910:26;20895:42;;21008:27;;;;20976:1;20964:14;;;;20843:19;;20813:236;;;20817:3;21077:6;21068:7;21065:19;21062:201;;;21138:19;;;21132:26;-1:-1:-1;;21221:1:84;21217:14;;;21233:3;21213:24;21209:37;21205:42;21190:58;21175:74;;21062:201;-1:-1:-1;;;;;21309:1:84;21293:14;;;21289:22;21276:36;;-1:-1:-1;20238:1341:84:o;21584:565::-;21865:6;21854:9;21847:25;21908:3;21903:2;21892:9;21888:18;21881:31;21828:4;21935:57;21987:3;21976:9;21972:19;21964:6;21935:57;:::i;:::-;22028:6;22023:2;22012:9;22008:18;22001:34;22083:9;22075:6;22071:22;22066:2;22055:9;22051:18;22044:50;22111:32;22136:6;22128;22111:32;:::i;:::-;22103:40;21584:565;-1:-1:-1;;;;;;;21584:565:84:o;22154:289::-;22285:3;22323:6;22317:13;22339:66;22398:6;22393:3;22386:4;22378:6;22374:17;22339:66;:::i;:::-;22421:16;;;;;22154:289;-1:-1:-1;;22154:289:84:o;22448:843::-;22576:3;22605:1;22638:6;22632:13;22668:36;22694:9;22668:36;:::i;:::-;22723:1;22740:17;;;22766:133;;;;22913:1;22908:358;;;;22733:533;;22766:133;-1:-1:-1;;22799:24:84;;22787:37;;22872:14;;22865:22;22853:35;;22844:45;;;-1:-1:-1;22766:133:84;;22908:358;22939:6;22936:1;22929:17;22969:4;23014;23011:1;23001:18;23041:1;23055:165;23069:6;23066:1;23063:13;23055:165;;;23147:14;;23134:11;;;23127:35;23190:16;;;;23084:10;;23055:165;;;23059:3;;;23249:6;23244:3;23240:16;23233:23;;22733:533;-1:-1:-1;23282:3:84;;22448:843;-1:-1:-1;;;;;;22448:843:84:o;25004:1202::-;-1:-1:-1;;;;;25121:3:84;25118:27;25115:53;;;25148:18;;:::i;:::-;25177:93;25266:3;25226:38;25258:4;25252:11;25226:38;:::i;:::-;25220:4;25177:93;:::i;:::-;25296:1;25321:2;25316:3;25313:11;25338:1;25333:615;;;;25992:1;26009:3;26006:93;;;-1:-1:-1;26065:19:84;;;26052:33;26006:93;26125:64;26185:3;26178:5;26125:64;:::i;:::-;26119:4;26112:78;;25306:894;;25333:615;19467:1;19460:14;;;19504:4;19491:18;;-1:-1:-1;;25369:17:84;;;25469:9;25491:229;25505:7;25502:1;25499:14;25491:229;;;25594:19;;;25581:33;25566:49;;25701:4;25686:20;;;;25654:1;25642:14;;;;25521:12;25491:229;;;25495:3;25748;25739:7;25736:16;25733:159;;;25872:1;25868:6;25862:3;25856;25853:1;25849:11;25845:21;25841:34;25837:39;25824:9;25819:3;25815:19;25802:33;25798:79;25790:6;25783:95;25733:159;;;25935:1;25929:3;25926:1;25922:11;25918:19;25912:4;25905:33;25306:894;;25004:1202;;;:::o;26211:639::-;26444:6;26433:9;26426:25;-1:-1:-1;;;;;26491:6:84;26487:31;26482:2;26471:9;26467:18;26460:59;26555:3;26550:2;26539:9;26535:18;26528:31;26596:6;26590:3;26579:9;26575:19;26568:35;26654:6;26646;26640:3;26629:9;26625:19;26612:49;26711:1;26681:22;;;26705:3;26677:32;;;26670:43;;;;26828:14;;26821:22;26816:2;26801:18;;26794:50;26774:2;26753:15;;;-1:-1:-1;;26749:29:84;26734:45;;;26730:55;;26211:639;-1:-1:-1;;;26211:639:84:o;26855:128::-;26922:9;;;26943:11;;;26940:37;;;26957:18;;:::i;26988:1426::-;27101:3;27095:4;27092:13;27089:26;;27108:5;;26988:1426::o;27089:26::-;27138:37;27170:3;27164:10;27138:37;:::i;:::-;-1:-1:-1;;;;;27190:6:84;27187:30;27184:56;;;27220:18;;:::i;:::-;27249:96;27338:6;27298:38;27330:4;27324:11;27298:38;:::i;27249:96::-;27371:1;27399:2;27391:6;27388:14;27416:1;27411:746;;;;28201:1;28218:6;28215:89;;;-1:-1:-1;28270:19:84;;;28264:26;28215:89;28330:67;28390:6;28383:5;28330:67;:::i;:::-;28324:4;28317:81;;27381:1027;;27411:746;19467:1;19460:14;;;19504:4;19491:18;;-1:-1:-1;;27447:20:84;;;19467:1;19460:14;;;19504:4;19491:18;;27609:9;27631:251;27645:7;27642:1;27639:14;27631:251;;;27727:21;;;27721:28;27706:44;;27777:1;27850:18;;;;27805:15;;;;27668:4;27661:12;27631:251;;;27635:3;27910:6;27901:7;27898:19;27895:203;;;27971:21;;27965:28;-1:-1:-1;;28068:3:84;28056:1;28052:14;;;28048:24;28044:37;28040:42;28025:58;28010:74;;;-1:-1:-1;;28144:1:84;28128:14;;;28124:22;28111:36;;-1:-1:-1;26988:1426:84:o;29385:323::-;29575:2;29564:9;29557:21;29538:4;29595:44;29635:2;29624:9;29620:18;29612:6;29595:44;:::i;:::-;29587:52;;29648:54;29698:2;29687:9;29683:18;29675:6;29648:54;:::i;29713:184::-;29771:6;29824:2;29812:9;29803:7;29799:23;29795:32;29792:52;;;29840:1;29837;29830:12;29792:52;29863:28;29881:9;29863:28;:::i;29902:457::-;30133:6;30122:9;30115:25;30176:6;30171:2;30160:9;30156:18;30149:34;-1:-1:-1;;;;;30223:6:84;30219:31;30214:2;30203:9;30199:18;30192:59;30287:3;30282:2;30271:9;30267:18;30260:31;30096:4;30308:45;30348:3;30337:9;30333:19;30325:6;30308:45;:::i;30364:180::-;30420:6;30473:2;30461:9;30452:7;30448:23;30444:32;30441:52;;;30489:1;30486;30479:12;30441:52;30512:26;30528:9;30512:26;:::i","linkReferences":{}},"methodIdentifiers":{"__OperatorRegistry_init(address[])":"ba428b1a","__RiverConfig_init(address[])":"31374511","allocateStream(bytes32,address[],bytes32,bytes)":"6b883c39","approveConfigurationManager(address)":"c179b85f","approveOperator(address)":"242cae9f","configurationExists(bytes32)":"fc207c01","deleteConfiguration(bytes32)":"035759e1","deleteConfigurationOnBlock(bytes32,uint64)":"b7f227ee","getAllConfiguration()":"081814db","getAllNodeAddresses()":"c8fe3a01","getAllNodes()":"a1174e7d","getAllStreamIds()":"86789fc6","getAllStreams()":"3bd84c0c","getConfiguration(bytes32)":"9283ae3a","getNode(address)":"9d209048","getNodeCount()":"39bf397e","getPaginatedStreams(uint256,uint256)":"ca78c41a","getStream(bytes32)":"1290abe8","getStreamByIndex(uint256)":"68b454df","getStreamCount()":"c0f22084","getStreamWithGenesis(bytes32)":"3c2544d1","getStreamsOnNode(address)":"32705ac4","isConfigurationManager(address)":"d4bd44a0","isOperator(address)":"6d70f7ae","placeStreamOnNode(bytes32,address)":"9ee86d38","registerNode(address,string,uint8)":"eecc66f4","removeConfigurationManager(address)":"813049ec","removeNode(address)":"b2b99ec9","removeOperator(address)":"ac8a584a","removeStreamFromNode(bytes32,address)":"ee885b12","setConfiguration(bytes32,uint64,bytes)":"a09449a6","setStreamLastMiniblock(bytes32,bytes32,bytes32,uint64,bool)":"d7a3158a","setStreamLastMiniblockBatch((bytes32,bytes32,bytes32,uint64,bool)[])":"ff3a14ab","updateNodeStatus(address,uint8)":"581f8b9b","updateNodeUrl(address,string)":"7e4465e7"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"approvedOperators\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"block\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"deleted\",\"type\":\"bool\"}],\"name\":\"ConfigurationChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"manager\",\"type\":\"address\"}],\"name\":\"ConfigurationManagerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"manager\",\"type\":\"address\"}],\"name\":\"ConfigurationManagerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"NodeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"NodeRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"NodeStatusUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"}],\"name\":\"NodeUrlUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operatorAddress\",\"type\":\"address\"}],\"name\":\"OperatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operatorAddress\",\"type\":\"address\"}],\"name\":\"OperatorRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"genesisMiniblockHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"genesisMiniblock\",\"type\":\"bytes\"}],\"name\":\"StreamAllocated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"StreamLastMiniblockUpdateFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isSealed\",\"type\":\"bool\"}],\"name\":\"StreamLastMiniblockUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isAdded\",\"type\":\"bool\"}],\"name\":\"StreamPlacementUpdated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"initialOperators\",\"type\":\"address[]\"}],\"name\":\"__OperatorRegistry_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"configManagers\",\"type\":\"address[]\"}],\"name\":\"__RiverConfig_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"},{\"internalType\":\"bytes32\",\"name\":\"genesisMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"genesisMiniblock\",\"type\":\"bytes\"}],\"name\":\"allocateStream\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"manager\",\"type\":\"address\"}],\"name\":\"approveConfigurationManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"approveOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"configurationExists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"deleteConfiguration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"blockNumber\",\"type\":\"uint64\"}],\"name\":\"deleteConfigurationOnBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllConfiguration\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"blockNumber\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct Setting[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllNodeAddresses\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllNodes\",\"outputs\":[{\"components\":[{\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"internalType\":\"struct Node[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllStreamIds\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllStreams\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"stream\",\"type\":\"tuple\"}],\"internalType\":\"struct StreamWithId[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"getConfiguration\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"blockNumber\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct Setting[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"getNode\",\"outputs\":[{\"components\":[{\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"internalType\":\"struct Node\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodeCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"start\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stop\",\"type\":\"uint256\"}],\"name\":\"getPaginatedStreams\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"stream\",\"type\":\"tuple\"}],\"internalType\":\"struct StreamWithId[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"}],\"name\":\"getStream\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"i\",\"type\":\"uint256\"}],\"name\":\"getStreamByIndex\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"stream\",\"type\":\"tuple\"}],\"internalType\":\"struct StreamWithId\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStreamCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"}],\"name\":\"getStreamWithGenesis\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"getStreamsOnNode\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"stream\",\"type\":\"tuple\"}],\"internalType\":\"struct StreamWithId[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"manager\",\"type\":\"address\"}],\"name\":\"isConfigurationManager\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isOperator\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"placeStreamOnNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"registerNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"manager\",\"type\":\"address\"}],\"name\":\"removeConfigurationManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"removeNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"removeOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"removeStreamFromNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"blockNumber\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"name\":\"setConfiguration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isSealed\",\"type\":\"bool\"}],\"name\":\"setStreamLastMiniblock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"prevMiniBlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isSealed\",\"type\":\"bool\"}],\"internalType\":\"struct SetMiniblock[]\",\"name\":\"miniblocks\",\"type\":\"tuple[]\"}],\"name\":\"setStreamLastMiniblockBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"updateNodeStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"}],\"name\":\"updateNodeUrl\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"ConfigurationChanged(bytes32,uint64,bytes,bool)\":{\"params\":{\"block\":\"The block number on which the setting becomes active\",\"deleted\":\"True if the setting is deleted (value is empty in this case)\",\"key\":\"The setting key that is changed\",\"value\":\"The new setting value\"}},\"ConfigurationManagerAdded(address)\":{\"params\":{\"manager\":\"The configuration manager address\"}},\"ConfigurationManagerRemoved(address)\":{\"params\":{\"manager\":\"The configuration manager address\"}},\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"}},\"kind\":\"dev\",\"methods\":{\"approveConfigurationManager(address)\":{\"params\":{\"manager\":\"The address to add\"}},\"configurationExists(bytes32)\":{\"params\":{\"key\":\"The setting key\"},\"returns\":{\"_0\":\"True if the setting exists\"}},\"deleteConfiguration(bytes32)\":{\"params\":{\"key\":\"The setting key\"}},\"deleteConfigurationOnBlock(bytes32,uint64)\":{\"params\":{\"blockNumber\":\"The block number on which the setting becomes active\",\"key\":\"The setting key\"}},\"getAllConfiguration()\":{\"details\":\"Note that the returned list is ordered on key but NOT on block number\",\"returns\":{\"_0\":\"List will all stored settings\"}},\"getAllNodeAddresses()\":{\"details\":\"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.\"},\"getAllNodes()\":{\"details\":\"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.\"},\"getAllStreamIds()\":{\"details\":\"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.\"},\"getAllStreams()\":{\"details\":\"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.\"},\"getConfiguration(bytes32)\":{\"details\":\"Note that the returned list isn't ordered by block number\",\"params\":{\"key\":\"The setting key\"},\"returns\":{\"_0\":\"The setting value\"}},\"getPaginatedStreams(uint256,uint256)\":{\"details\":\"Recommended range is 5000 streams, returns true if on the last page.\"},\"getStreamWithGenesis(bytes32)\":{\"returns\":{\"_0\":\"stream, genesisMiniblockHash, genesisMiniblock\"}},\"isConfigurationManager(address)\":{\"params\":{\"manager\":\"The address to check\"},\"returns\":{\"_0\":\"True if the address is a configuration manager\"}},\"removeConfigurationManager(address)\":{\"params\":{\"manager\":\"The address to remove\"}},\"setConfiguration(bytes32,uint64,bytes)\":{\"params\":{\"blockNumber\":\"The block number on which the setting becomes active\",\"key\":\"The setting key\",\"value\":\"The setting value (value must be its ABI representation)\"}}},\"version\":1},\"userdoc\":{\"events\":{\"ConfigurationChanged(bytes32,uint64,bytes,bool)\":{\"notice\":\"Emitted when a setting is changed\"},\"ConfigurationManagerAdded(address)\":{\"notice\":\"Emitted when a configuration manager is added\"},\"ConfigurationManagerRemoved(address)\":{\"notice\":\"Emitted when a configuration manager is removed\"},\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{\"approveConfigurationManager(address)\":{\"notice\":\"Add a configuration manager\"},\"configurationExists(bytes32)\":{\"notice\":\"Indication if there is a setting for the given key\"},\"deleteConfiguration(bytes32)\":{\"notice\":\"Deletes the setting for the given key on all blocks\"},\"deleteConfigurationOnBlock(bytes32,uint64)\":{\"notice\":\"Deletes the setting for the given key at the given block\"},\"getAllConfiguration()\":{\"notice\":\"Get all settings store in the registry\"},\"getAllNodeAddresses()\":{\"notice\":\"Return array containing all node addresses\"},\"getAllNodes()\":{\"notice\":\"Return array containing all nodes\"},\"getAllStreamIds()\":{\"notice\":\"Return array containing all stream ids\"},\"getAllStreams()\":{\"notice\":\"Return array containing all streams\"},\"getConfiguration(bytes32)\":{\"notice\":\"Get settings for the given key\"},\"isConfigurationManager(address)\":{\"notice\":\"Check if the given address is a configuration manager\"},\"removeConfigurationManager(address)\":{\"notice\":\"Remove a configuration manager\"},\"setConfiguration(bytes32,uint64,bytes)\":{\"notice\":\"Set a bytes setting for the given key\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/mocks/MockRiverRegistry.sol\":\"MockRiverRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/OwnableBase.sol\":{\"keccak256\":\"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4\",\"dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa\"]},\"contracts/src/diamond/facets/ownable/OwnableStorage.sol\":{\"keccak256\":\"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105\",\"dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ\"]},\"contracts/src/river/registry/facets/config/IRiverConfig.sol\":{\"keccak256\":\"0xb60d58699681871a89edca7a16fa75bc0ae10f1c211f5f04ff554b9b8f65d359\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://9bb986017b16eb242adc1f04922b075fcbb80e643d5e3c6db28ba2f9ef312279\",\"dweb:/ipfs/QmYB4em4ZYPm3xSRZtG23y9XHQpNB1JnnDTwgj66ad8g2i\"]},\"contracts/src/river/registry/facets/config/RiverConfig.sol\":{\"keccak256\":\"0x74e51e8ba684604b253c428eaa51f6c48b71efcd024ac76a71e494efe1fed719\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5e303ad9653c11487e42cb5d2ae86cf778a8cf54f0ca655ca2dbd7bdb683f321\",\"dweb:/ipfs/QmdL5XdYWCW3QeS53mu2moBP2ZYR8pT4FJAHsD74oTWhcK\"]},\"contracts/src/river/registry/facets/node/INodeRegistry.sol\":{\"keccak256\":\"0x1f64f644ca9a6bfa00f2b4fe5242d7bf4a2410a3b0619e5f31813bf84d51f30a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://879e826a7772b560cfa439f2a352fbe378900ec4e8ab636b3f023e36f43b7fb5\",\"dweb:/ipfs/QmeVW4Kuji8B3p8D8NaruxBzQPutPMYiXxcMpfrvGFwjhZ\"]},\"contracts/src/river/registry/facets/node/NodeRegistry.sol\":{\"keccak256\":\"0x36153c58edd2ec86b4b5476955e7a4ab0f19332112179a8a28fdd10512b68a39\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6ef08c0ea25f34ed52a506be080bee1d260a2493f2762929032e6cce56d478d2\",\"dweb:/ipfs/QmZqXgxo5Vhi3E1SnWwXrGPPG83V4ggjH7eMbo687kkX4r\"]},\"contracts/src/river/registry/facets/operator/IOperatorRegistry.sol\":{\"keccak256\":\"0xf0dbf037e3ebc65945ce4e24e16ff8126e96dbc30174059b693a75e9b8213672\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://44c0fa0d32854421ba0d1a9041b0124504d3c9cb4da4d8c4bb77a69645350b10\",\"dweb:/ipfs/QmNUtMBujetyWHo87mSAvkgLRBjEgQwsrpoMdST8LPm6Zb\"]},\"contracts/src/river/registry/facets/operator/OperatorRegistry.sol\":{\"keccak256\":\"0xe4b80ab4faaaf470a46907bbbe9a02783eff94492c4ba9a9d5f681af54bbadff\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b9aa3f826f53fdb824e9f686486efdbcdc9231ca67da5954a33bdbf0f1bc123\",\"dweb:/ipfs/QmaLSPnRmeJPaNSd8RdTA5uyxUfxa8owNnRe2cZvw4W5YP\"]},\"contracts/src/river/registry/facets/stream/IStreamRegistry.sol\":{\"keccak256\":\"0x6065b337e753c34ff06f91172aa92e473fe3e7a74bfea20e30eb79f349a338c5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://db641411b66939873b494e5914cd06955b03bdc278d784675c4e4035027f32a4\",\"dweb:/ipfs/QmRkaPZSa1stxb9XKiD6WKwEZmcaqqYXi8DQzGaZiBtKhd\"]},\"contracts/src/river/registry/facets/stream/StreamRegistry.sol\":{\"keccak256\":\"0xc54bdda2a2add8c10aa260a4921eb7c6e00bedea05370bb1b0b6794dff089d53\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a04f114efbf72b82368386acefd175c426103a3fd4fc06b1098f8aad5b22346e\",\"dweb:/ipfs/QmT8z1QQjYmZjYSFoGAJAoCU7AvZuADDzYfEUBBFXXhydX\"]},\"contracts/src/river/registry/libraries/RegistryErrors.sol\":{\"keccak256\":\"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3\",\"dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy\"]},\"contracts/src/river/registry/libraries/RegistryStorage.sol\":{\"keccak256\":\"0x63c17d46ed41fb58a08d84b2159db6ab7a19a4e1e1e636129b7cdd5f3d83c51c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7633256f01d2ffea41292d8f0b259d6f33a61ef362026d649a3e6955f53eec4c\",\"dweb:/ipfs/QmSYCB6CWCjQMqVeSG7yqy72tr7SkPSRkfzpz6FnK33XqZ\"]},\"contracts/test/mocks/MockRiverRegistry.sol\":{\"keccak256\":\"0xa08a296baf3f059c6b580141b0603034a0addbb6037347ac020073cb2a29e9af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7091b951140ecabb2073630fc59a81510c6f5282f1ad1c7074765ec859dd0f70\",\"dweb:/ipfs/Qmf3krporaQr22C52bgk5WLpWZvrfH7K3xAzckWYsA5yLZ\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address[]","name":"approvedOperators","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32","indexed":false},{"internalType":"uint64","name":"block","type":"uint64","indexed":false},{"internalType":"bytes","name":"value","type":"bytes","indexed":false},{"internalType":"bool","name":"deleted","type":"bool","indexed":false}],"type":"event","name":"ConfigurationChanged","anonymous":false},{"inputs":[{"internalType":"address","name":"manager","type":"address","indexed":true}],"type":"event","name":"ConfigurationManagerAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"manager","type":"address","indexed":true}],"type":"event","name":"ConfigurationManagerRemoved","anonymous":false},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address","indexed":true},{"internalType":"string","name":"url","type":"string","indexed":false},{"internalType":"enum NodeStatus","name":"status","type":"uint8","indexed":false}],"type":"event","name":"NodeAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address","indexed":true}],"type":"event","name":"NodeRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address","indexed":true},{"internalType":"enum NodeStatus","name":"status","type":"uint8","indexed":false}],"type":"event","name":"NodeStatusUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address","indexed":true},{"internalType":"string","name":"url","type":"string","indexed":false}],"type":"event","name":"NodeUrlUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"operatorAddress","type":"address","indexed":true}],"type":"event","name":"OperatorAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"operatorAddress","type":"address","indexed":true}],"type":"event","name":"OperatorRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32","indexed":false},{"internalType":"address[]","name":"nodes","type":"address[]","indexed":false},{"internalType":"bytes32","name":"genesisMiniblockHash","type":"bytes32","indexed":false},{"internalType":"bytes","name":"genesisMiniblock","type":"bytes","indexed":false}],"type":"event","name":"StreamAllocated","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32","indexed":false},{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32","indexed":false},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64","indexed":false},{"internalType":"string","name":"reason","type":"string","indexed":false}],"type":"event","name":"StreamLastMiniblockUpdateFailed","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32","indexed":false},{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32","indexed":false},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64","indexed":false},{"internalType":"bool","name":"isSealed","type":"bool","indexed":false}],"type":"event","name":"StreamLastMiniblockUpdated","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32","indexed":false},{"internalType":"address","name":"nodeAddress","type":"address","indexed":false},{"internalType":"bool","name":"isAdded","type":"bool","indexed":false}],"type":"event","name":"StreamPlacementUpdated","anonymous":false},{"inputs":[{"internalType":"address[]","name":"initialOperators","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"__OperatorRegistry_init"},{"inputs":[{"internalType":"address[]","name":"configManagers","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"__RiverConfig_init"},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"},{"internalType":"address[]","name":"nodes","type":"address[]"},{"internalType":"bytes32","name":"genesisMiniblockHash","type":"bytes32"},{"internalType":"bytes","name":"genesisMiniblock","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"allocateStream"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"approveConfigurationManager"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"approveOperator"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"stateMutability":"view","type":"function","name":"configurationExists","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"deleteConfiguration"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint64","name":"blockNumber","type":"uint64"}],"stateMutability":"nonpayable","type":"function","name":"deleteConfigurationOnBlock"},{"inputs":[],"stateMutability":"view","type":"function","name":"getAllConfiguration","outputs":[{"internalType":"struct Setting[]","name":"","type":"tuple[]","components":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint64","name":"blockNumber","type":"uint64"},{"internalType":"bytes","name":"value","type":"bytes"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getAllNodeAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getAllNodes","outputs":[{"internalType":"struct Node[]","name":"","type":"tuple[]","components":[{"internalType":"enum NodeStatus","name":"status","type":"uint8"},{"internalType":"string","name":"url","type":"string"},{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"address","name":"operator","type":"address"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getAllStreamIds","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getAllStreams","outputs":[{"internalType":"struct StreamWithId[]","name":"","type":"tuple[]","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"struct Stream","name":"stream","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]}]},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getConfiguration","outputs":[{"internalType":"struct Setting[]","name":"","type":"tuple[]","components":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint64","name":"blockNumber","type":"uint64"},{"internalType":"bytes","name":"value","type":"bytes"}]}]},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"view","type":"function","name":"getNode","outputs":[{"internalType":"struct Node","name":"","type":"tuple","components":[{"internalType":"enum NodeStatus","name":"status","type":"uint8"},{"internalType":"string","name":"url","type":"string"},{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"address","name":"operator","type":"address"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getNodeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"stateMutability":"view","type":"function","name":"getPaginatedStreams","outputs":[{"internalType":"struct StreamWithId[]","name":"","type":"tuple[]","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"struct Stream","name":"stream","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]},{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getStream","outputs":[{"internalType":"struct Stream","name":"","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"stateMutability":"view","type":"function","name":"getStreamByIndex","outputs":[{"internalType":"struct StreamWithId","name":"","type":"tuple","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"struct Stream","name":"stream","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getStreamCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getStreamWithGenesis","outputs":[{"internalType":"struct Stream","name":"","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"view","type":"function","name":"getStreamsOnNode","outputs":[{"internalType":"struct StreamWithId[]","name":"","type":"tuple[]","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"struct Stream","name":"stream","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]}]},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"stateMutability":"view","type":"function","name":"isConfigurationManager","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"},{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"placeStreamOnNode"},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"string","name":"url","type":"string"},{"internalType":"enum NodeStatus","name":"status","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"registerNode"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeConfigurationManager"},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeNode"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeOperator"},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"},{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeStreamFromNode"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint64","name":"blockNumber","type":"uint64"},{"internalType":"bytes","name":"value","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"setConfiguration"},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"bool","name":"isSealed","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setStreamLastMiniblock"},{"inputs":[{"internalType":"struct SetMiniblock[]","name":"miniblocks","type":"tuple[]","components":[{"internalType":"bytes32","name":"streamId","type":"bytes32"},{"internalType":"bytes32","name":"prevMiniBlockHash","type":"bytes32"},{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"bool","name":"isSealed","type":"bool"}]}],"stateMutability":"nonpayable","type":"function","name":"setStreamLastMiniblockBatch"},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"enum NodeStatus","name":"status","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"updateNodeStatus"},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"string","name":"url","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"updateNodeUrl"}],"devdoc":{"kind":"dev","methods":{"approveConfigurationManager(address)":{"params":{"manager":"The address to add"}},"configurationExists(bytes32)":{"params":{"key":"The setting key"},"returns":{"_0":"True if the setting exists"}},"deleteConfiguration(bytes32)":{"params":{"key":"The setting key"}},"deleteConfigurationOnBlock(bytes32,uint64)":{"params":{"blockNumber":"The block number on which the setting becomes active","key":"The setting key"}},"getAllConfiguration()":{"details":"Note that the returned list is ordered on key but NOT on block number","returns":{"_0":"List will all stored settings"}},"getAllNodeAddresses()":{"details":"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block."},"getAllNodes()":{"details":"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block."},"getAllStreamIds()":{"details":"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block."},"getAllStreams()":{"details":"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block."},"getConfiguration(bytes32)":{"details":"Note that the returned list isn't ordered by block number","params":{"key":"The setting key"},"returns":{"_0":"The setting value"}},"getPaginatedStreams(uint256,uint256)":{"details":"Recommended range is 5000 streams, returns true if on the last page."},"getStreamWithGenesis(bytes32)":{"returns":{"_0":"stream, genesisMiniblockHash, genesisMiniblock"}},"isConfigurationManager(address)":{"params":{"manager":"The address to check"},"returns":{"_0":"True if the address is a configuration manager"}},"removeConfigurationManager(address)":{"params":{"manager":"The address to remove"}},"setConfiguration(bytes32,uint64,bytes)":{"params":{"blockNumber":"The block number on which the setting becomes active","key":"The setting key","value":"The setting value (value must be its ABI representation)"}}},"version":1},"userdoc":{"kind":"user","methods":{"approveConfigurationManager(address)":{"notice":"Add a configuration manager"},"configurationExists(bytes32)":{"notice":"Indication if there is a setting for the given key"},"deleteConfiguration(bytes32)":{"notice":"Deletes the setting for the given key on all blocks"},"deleteConfigurationOnBlock(bytes32,uint64)":{"notice":"Deletes the setting for the given key at the given block"},"getAllConfiguration()":{"notice":"Get all settings store in the registry"},"getAllNodeAddresses()":{"notice":"Return array containing all node addresses"},"getAllNodes()":{"notice":"Return array containing all nodes"},"getAllStreamIds()":{"notice":"Return array containing all stream ids"},"getAllStreams()":{"notice":"Return array containing all streams"},"getConfiguration(bytes32)":{"notice":"Get settings for the given key"},"isConfigurationManager(address)":{"notice":"Check if the given address is a configuration manager"},"removeConfigurationManager(address)":{"notice":"Remove a configuration manager"},"setConfiguration(bytes32,uint64,bytes)":{"notice":"Set a bytes setting for the given key"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/test/mocks/MockRiverRegistry.sol":"MockRiverRegistry"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableBase.sol":{"keccak256":"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762","urls":["bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4","dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableStorage.sol":{"keccak256":"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64","urls":["bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105","dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/config/IRiverConfig.sol":{"keccak256":"0xb60d58699681871a89edca7a16fa75bc0ae10f1c211f5f04ff554b9b8f65d359","urls":["bzz-raw://9bb986017b16eb242adc1f04922b075fcbb80e643d5e3c6db28ba2f9ef312279","dweb:/ipfs/QmYB4em4ZYPm3xSRZtG23y9XHQpNB1JnnDTwgj66ad8g2i"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/config/RiverConfig.sol":{"keccak256":"0x74e51e8ba684604b253c428eaa51f6c48b71efcd024ac76a71e494efe1fed719","urls":["bzz-raw://5e303ad9653c11487e42cb5d2ae86cf778a8cf54f0ca655ca2dbd7bdb683f321","dweb:/ipfs/QmdL5XdYWCW3QeS53mu2moBP2ZYR8pT4FJAHsD74oTWhcK"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/node/INodeRegistry.sol":{"keccak256":"0x1f64f644ca9a6bfa00f2b4fe5242d7bf4a2410a3b0619e5f31813bf84d51f30a","urls":["bzz-raw://879e826a7772b560cfa439f2a352fbe378900ec4e8ab636b3f023e36f43b7fb5","dweb:/ipfs/QmeVW4Kuji8B3p8D8NaruxBzQPutPMYiXxcMpfrvGFwjhZ"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/node/NodeRegistry.sol":{"keccak256":"0x36153c58edd2ec86b4b5476955e7a4ab0f19332112179a8a28fdd10512b68a39","urls":["bzz-raw://6ef08c0ea25f34ed52a506be080bee1d260a2493f2762929032e6cce56d478d2","dweb:/ipfs/QmZqXgxo5Vhi3E1SnWwXrGPPG83V4ggjH7eMbo687kkX4r"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/operator/IOperatorRegistry.sol":{"keccak256":"0xf0dbf037e3ebc65945ce4e24e16ff8126e96dbc30174059b693a75e9b8213672","urls":["bzz-raw://44c0fa0d32854421ba0d1a9041b0124504d3c9cb4da4d8c4bb77a69645350b10","dweb:/ipfs/QmNUtMBujetyWHo87mSAvkgLRBjEgQwsrpoMdST8LPm6Zb"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/operator/OperatorRegistry.sol":{"keccak256":"0xe4b80ab4faaaf470a46907bbbe9a02783eff94492c4ba9a9d5f681af54bbadff","urls":["bzz-raw://1b9aa3f826f53fdb824e9f686486efdbcdc9231ca67da5954a33bdbf0f1bc123","dweb:/ipfs/QmaLSPnRmeJPaNSd8RdTA5uyxUfxa8owNnRe2cZvw4W5YP"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/stream/IStreamRegistry.sol":{"keccak256":"0x6065b337e753c34ff06f91172aa92e473fe3e7a74bfea20e30eb79f349a338c5","urls":["bzz-raw://db641411b66939873b494e5914cd06955b03bdc278d784675c4e4035027f32a4","dweb:/ipfs/QmRkaPZSa1stxb9XKiD6WKwEZmcaqqYXi8DQzGaZiBtKhd"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/stream/StreamRegistry.sol":{"keccak256":"0xc54bdda2a2add8c10aa260a4921eb7c6e00bedea05370bb1b0b6794dff089d53","urls":["bzz-raw://a04f114efbf72b82368386acefd175c426103a3fd4fc06b1098f8aad5b22346e","dweb:/ipfs/QmT8z1QQjYmZjYSFoGAJAoCU7AvZuADDzYfEUBBFXXhydX"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryErrors.sol":{"keccak256":"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc","urls":["bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3","dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryStorage.sol":{"keccak256":"0x63c17d46ed41fb58a08d84b2159db6ab7a19a4e1e1e636129b7cdd5f3d83c51c","urls":["bzz-raw://7633256f01d2ffea41292d8f0b259d6f33a61ef362026d649a3e6955f53eec4c","dweb:/ipfs/QmSYCB6CWCjQMqVeSG7yqy72tr7SkPSRkfzpz6FnK33XqZ"],"license":"Apache-2.0"},"contracts/test/mocks/MockRiverRegistry.sol":{"keccak256":"0xa08a296baf3f059c6b580141b0603034a0addbb6037347ac020073cb2a29e9af","urls":["bzz-raw://7091b951140ecabb2073630fc59a81510c6f5282f1ad1c7074765ec859dd0f70","dweb:/ipfs/Qmf3krporaQr22C52bgk5WLpWZvrfH7K3xAzckWYsA5yLZ"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":48} \ No newline at end of file diff --git a/packages/generated/dev/abis/MockRiverRegistry.metadata.json b/packages/generated/dev/abis/MockRiverRegistry.metadata.json new file mode 100644 index 000000000..75072a027 --- /dev/null +++ b/packages/generated/dev/abis/MockRiverRegistry.metadata.json @@ -0,0 +1,1646 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address[]", + "name": "approvedOperators", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "uint64", + "name": "block", + "type": "uint64", + "indexed": false + }, + { + "internalType": "bytes", + "name": "value", + "type": "bytes", + "indexed": false + }, + { + "internalType": "bool", + "name": "deleted", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ConfigurationChanged", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "manager", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConfigurationManagerAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "manager", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConfigurationManagerRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "string", + "name": "url", + "type": "string", + "indexed": false + }, + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8", + "indexed": false + } + ], + "type": "event", + "name": "NodeAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "NodeRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8", + "indexed": false + } + ], + "type": "event", + "name": "NodeStatusUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "string", + "name": "url", + "type": "string", + "indexed": false + } + ], + "type": "event", + "name": "NodeUrlUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operatorAddress", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OperatorAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operatorAddress", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OperatorRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]", + "indexed": false + }, + { + "internalType": "bytes32", + "name": "genesisMiniblockHash", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "bytes", + "name": "genesisMiniblock", + "type": "bytes", + "indexed": false + } + ], + "type": "event", + "name": "StreamAllocated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64", + "indexed": false + }, + { + "internalType": "string", + "name": "reason", + "type": "string", + "indexed": false + } + ], + "type": "event", + "name": "StreamLastMiniblockUpdateFailed", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64", + "indexed": false + }, + { + "internalType": "bool", + "name": "isSealed", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "StreamLastMiniblockUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": false + }, + { + "internalType": "bool", + "name": "isAdded", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "StreamPlacementUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "initialOperators", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__OperatorRegistry_init" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "configManagers", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__RiverConfig_init" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + }, + { + "internalType": "bytes32", + "name": "genesisMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "genesisMiniblock", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "allocateStream" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "manager", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "approveConfigurationManager" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "approveOperator" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "configurationExists", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "deleteConfiguration" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "blockNumber", + "type": "uint64" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "deleteConfigurationOnBlock" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllConfiguration", + "outputs": [ + { + "internalType": "struct Setting[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "blockNumber", + "type": "uint64" + }, + { + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllNodeAddresses", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllNodes", + "outputs": [ + { + "internalType": "struct Node[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllStreamIds", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllStreams", + "outputs": [ + { + "internalType": "struct StreamWithId[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "struct Stream", + "name": "stream", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getConfiguration", + "outputs": [ + { + "internalType": "struct Setting[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "blockNumber", + "type": "uint64" + }, + { + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getNode", + "outputs": [ + { + "internalType": "struct Node", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getNodeCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stop", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getPaginatedStreams", + "outputs": [ + { + "internalType": "struct StreamWithId[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "struct Stream", + "name": "stream", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + }, + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getStream", + "outputs": [ + { + "internalType": "struct Stream", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "i", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getStreamByIndex", + "outputs": [ + { + "internalType": "struct StreamWithId", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "struct Stream", + "name": "stream", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getStreamCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getStreamWithGenesis", + "outputs": [ + { + "internalType": "struct Stream", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getStreamsOnNode", + "outputs": [ + { + "internalType": "struct StreamWithId[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "struct Stream", + "name": "stream", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "manager", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isConfigurationManager", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isOperator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "placeStreamOnNode" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + }, + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "registerNode" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "manager", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeConfigurationManager" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeNode" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeOperator" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeStreamFromNode" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "blockNumber", + "type": "uint64" + }, + { + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setConfiguration" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "isSealed", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setStreamLastMiniblock" + }, + { + "inputs": [ + { + "internalType": "struct SetMiniblock[]", + "name": "miniblocks", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "prevMiniBlockHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "isSealed", + "type": "bool" + } + ] + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setStreamLastMiniblockBatch" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "updateNodeStatus" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "updateNodeUrl" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "approveConfigurationManager(address)": { + "params": { + "manager": "The address to add" + } + }, + "configurationExists(bytes32)": { + "params": { + "key": "The setting key" + }, + "returns": { + "_0": "True if the setting exists" + } + }, + "deleteConfiguration(bytes32)": { + "params": { + "key": "The setting key" + } + }, + "deleteConfigurationOnBlock(bytes32,uint64)": { + "params": { + "blockNumber": "The block number on which the setting becomes active", + "key": "The setting key" + } + }, + "getAllConfiguration()": { + "details": "Note that the returned list is ordered on key but NOT on block number", + "returns": { + "_0": "List will all stored settings" + } + }, + "getAllNodeAddresses()": { + "details": "WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block." + }, + "getAllNodes()": { + "details": "WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block." + }, + "getAllStreamIds()": { + "details": "WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block." + }, + "getAllStreams()": { + "details": "WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block." + }, + "getConfiguration(bytes32)": { + "details": "Note that the returned list isn't ordered by block number", + "params": { + "key": "The setting key" + }, + "returns": { + "_0": "The setting value" + } + }, + "getPaginatedStreams(uint256,uint256)": { + "details": "Recommended range is 5000 streams, returns true if on the last page." + }, + "getStreamWithGenesis(bytes32)": { + "returns": { + "_0": "stream, genesisMiniblockHash, genesisMiniblock" + } + }, + "isConfigurationManager(address)": { + "params": { + "manager": "The address to check" + }, + "returns": { + "_0": "True if the address is a configuration manager" + } + }, + "removeConfigurationManager(address)": { + "params": { + "manager": "The address to remove" + } + }, + "setConfiguration(bytes32,uint64,bytes)": { + "params": { + "blockNumber": "The block number on which the setting becomes active", + "key": "The setting key", + "value": "The setting value (value must be its ABI representation)" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "approveConfigurationManager(address)": { + "notice": "Add a configuration manager" + }, + "configurationExists(bytes32)": { + "notice": "Indication if there is a setting for the given key" + }, + "deleteConfiguration(bytes32)": { + "notice": "Deletes the setting for the given key on all blocks" + }, + "deleteConfigurationOnBlock(bytes32,uint64)": { + "notice": "Deletes the setting for the given key at the given block" + }, + "getAllConfiguration()": { + "notice": "Get all settings store in the registry" + }, + "getAllNodeAddresses()": { + "notice": "Return array containing all node addresses" + }, + "getAllNodes()": { + "notice": "Return array containing all nodes" + }, + "getAllStreamIds()": { + "notice": "Return array containing all stream ids" + }, + "getAllStreams()": { + "notice": "Return array containing all streams" + }, + "getConfiguration(bytes32)": { + "notice": "Get settings for the given key" + }, + "isConfigurationManager(address)": { + "notice": "Check if the given address is a configuration manager" + }, + "removeConfigurationManager(address)": { + "notice": "Remove a configuration manager" + }, + "setConfiguration(bytes32,uint64,bytes)": { + "notice": "Set a bytes setting for the given key" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/test/mocks/MockRiverRegistry.sol": "MockRiverRegistry" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableBase.sol": { + "keccak256": "0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762", + "urls": [ + "bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4", + "dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableStorage.sol": { + "keccak256": "0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64", + "urls": [ + "bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105", + "dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/config/IRiverConfig.sol": { + "keccak256": "0xb60d58699681871a89edca7a16fa75bc0ae10f1c211f5f04ff554b9b8f65d359", + "urls": [ + "bzz-raw://9bb986017b16eb242adc1f04922b075fcbb80e643d5e3c6db28ba2f9ef312279", + "dweb:/ipfs/QmYB4em4ZYPm3xSRZtG23y9XHQpNB1JnnDTwgj66ad8g2i" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/config/RiverConfig.sol": { + "keccak256": "0x74e51e8ba684604b253c428eaa51f6c48b71efcd024ac76a71e494efe1fed719", + "urls": [ + "bzz-raw://5e303ad9653c11487e42cb5d2ae86cf778a8cf54f0ca655ca2dbd7bdb683f321", + "dweb:/ipfs/QmdL5XdYWCW3QeS53mu2moBP2ZYR8pT4FJAHsD74oTWhcK" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/node/INodeRegistry.sol": { + "keccak256": "0x1f64f644ca9a6bfa00f2b4fe5242d7bf4a2410a3b0619e5f31813bf84d51f30a", + "urls": [ + "bzz-raw://879e826a7772b560cfa439f2a352fbe378900ec4e8ab636b3f023e36f43b7fb5", + "dweb:/ipfs/QmeVW4Kuji8B3p8D8NaruxBzQPutPMYiXxcMpfrvGFwjhZ" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/node/NodeRegistry.sol": { + "keccak256": "0x36153c58edd2ec86b4b5476955e7a4ab0f19332112179a8a28fdd10512b68a39", + "urls": [ + "bzz-raw://6ef08c0ea25f34ed52a506be080bee1d260a2493f2762929032e6cce56d478d2", + "dweb:/ipfs/QmZqXgxo5Vhi3E1SnWwXrGPPG83V4ggjH7eMbo687kkX4r" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/operator/IOperatorRegistry.sol": { + "keccak256": "0xf0dbf037e3ebc65945ce4e24e16ff8126e96dbc30174059b693a75e9b8213672", + "urls": [ + "bzz-raw://44c0fa0d32854421ba0d1a9041b0124504d3c9cb4da4d8c4bb77a69645350b10", + "dweb:/ipfs/QmNUtMBujetyWHo87mSAvkgLRBjEgQwsrpoMdST8LPm6Zb" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/operator/OperatorRegistry.sol": { + "keccak256": "0xe4b80ab4faaaf470a46907bbbe9a02783eff94492c4ba9a9d5f681af54bbadff", + "urls": [ + "bzz-raw://1b9aa3f826f53fdb824e9f686486efdbcdc9231ca67da5954a33bdbf0f1bc123", + "dweb:/ipfs/QmaLSPnRmeJPaNSd8RdTA5uyxUfxa8owNnRe2cZvw4W5YP" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/stream/IStreamRegistry.sol": { + "keccak256": "0x6065b337e753c34ff06f91172aa92e473fe3e7a74bfea20e30eb79f349a338c5", + "urls": [ + "bzz-raw://db641411b66939873b494e5914cd06955b03bdc278d784675c4e4035027f32a4", + "dweb:/ipfs/QmRkaPZSa1stxb9XKiD6WKwEZmcaqqYXi8DQzGaZiBtKhd" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/stream/StreamRegistry.sol": { + "keccak256": "0xc54bdda2a2add8c10aa260a4921eb7c6e00bedea05370bb1b0b6794dff089d53", + "urls": [ + "bzz-raw://a04f114efbf72b82368386acefd175c426103a3fd4fc06b1098f8aad5b22346e", + "dweb:/ipfs/QmT8z1QQjYmZjYSFoGAJAoCU7AvZuADDzYfEUBBFXXhydX" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryErrors.sol": { + "keccak256": "0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc", + "urls": [ + "bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3", + "dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryStorage.sol": { + "keccak256": "0x63c17d46ed41fb58a08d84b2159db6ab7a19a4e1e1e636129b7cdd5f3d83c51c", + "urls": [ + "bzz-raw://7633256f01d2ffea41292d8f0b259d6f33a61ef362026d649a3e6955f53eec4c", + "dweb:/ipfs/QmSYCB6CWCjQMqVeSG7yqy72tr7SkPSRkfzpz6FnK33XqZ" + ], + "license": "Apache-2.0" + }, + "contracts/test/mocks/MockRiverRegistry.sol": { + "keccak256": "0xa08a296baf3f059c6b580141b0603034a0addbb6037347ac020073cb2a29e9af", + "urls": [ + "bzz-raw://7091b951140ecabb2073630fc59a81510c6f5282f1ad1c7074765ec859dd0f70", + "dweb:/ipfs/Qmf3krporaQr22C52bgk5WLpWZvrfH7K3xAzckWYsA5yLZ" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/NodeRegistry.abi.json b/packages/generated/dev/abis/NodeRegistry.abi.json new file mode 100644 index 000000000..1a4147bd8 --- /dev/null +++ b/packages/generated/dev/abis/NodeRegistry.abi.json @@ -0,0 +1,252 @@ +[ + { + "type": "function", + "name": "getAllNodeAddresses", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllNodes", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct Node[]", + "components": [ + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Node", + "components": [ + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNodeCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "registerNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateNodeStatus", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateNodeUrl", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "NodeAdded", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "status", + "type": "uint8", + "indexed": false, + "internalType": "enum NodeStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeRemoved", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeStatusUpdated", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "status", + "type": "uint8", + "indexed": false, + "internalType": "enum NodeStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeUrlUpdated", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "indexed": false, + "internalType": "string" + } + ], + "anonymous": false + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/NodeRegistry.abi.ts b/packages/generated/dev/abis/NodeRegistry.abi.ts new file mode 100644 index 000000000..1e9d6ae02 --- /dev/null +++ b/packages/generated/dev/abis/NodeRegistry.abi.ts @@ -0,0 +1,252 @@ +export default [ + { + "type": "function", + "name": "getAllNodeAddresses", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllNodes", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct Node[]", + "components": [ + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Node", + "components": [ + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNodeCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "registerNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateNodeStatus", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateNodeUrl", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "NodeAdded", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "status", + "type": "uint8", + "indexed": false, + "internalType": "enum NodeStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeRemoved", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeStatusUpdated", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "status", + "type": "uint8", + "indexed": false, + "internalType": "enum NodeStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeUrlUpdated", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "indexed": false, + "internalType": "string" + } + ], + "anonymous": false + } +] as const diff --git a/packages/generated/dev/abis/NodeRegistry.bin b/packages/generated/dev/abis/NodeRegistry.bin new file mode 100644 index 000000000..fa1f88a2c --- /dev/null +++ b/packages/generated/dev/abis/NodeRegistry.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b506115e5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063a1174e7d1161005b578063a1174e7d146100f0578063b2b99ec914610105578063c8fe3a0114610118578063eecc66f41461012d57600080fd5b806339bf397e1461008d578063581f8b9b146100a85780637e4465e7146100bd5780639d209048146100d0575b600080fd5b610095610140565b6040519081526020015b60405180910390f35b6100bb6100b6366004611041565b610151565b005b6100bb6100cb366004611117565b6102fa565b6100e36100de366004611165565b6104f2565b60405161009f919061125c565b6100f8610673565b60405161009f919061126f565b6100bb610113366004611165565b61084e565b610120610a17565b60405161009f91906112d3565b6100bb61013b366004611320565b610a23565b600061014c6005610bed565b905090565b6001600160a01b038083166000908152600760205260409020600201548391166101ba57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b60405180910390fd5b336101c6600882610bfd565b6102005760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038085166000908152600760205260409020600301548591339116811461025e5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038616600090815260076020526040902080546102859060ff1687610c22565b80548690829060ff191660018360058111156102a3576102a3611180565b021790555060028101546040516001600160a01b03909116907f20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0906102e9908990611391565b60405180910390a250505050505050565b33610306600882610bfd565b6103405760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038084166000908152600760205260409020600201548491166103a057604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b03808516600090815260076020526040902060030154859133911681146103fe5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b03861660009081526007602090815260409182902091516104289188910161139f565b604051602081830303815290604052805190602001208160010160405160200161045291906113ef565b60405160208183030381529060405280519060200120036104a25760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526101b1919060040161137e565b600181016104b087826114b6565b5060028101546040516001600160a01b03909116907f4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac906102e990899061137e565b61051d6040805160808101909152806000815260606020820181905260006040830181905291015290565b610528600583610bfd565b61056857604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038216600090815260076020526040908190208151608081019092528054829060ff1660058111156105a3576105a3611180565b60058111156105b4576105b4611180565b81526020016001820180546105c8906113bb565b80601f01602080910402602001604051908101604052809291908181526020018280546105f4906113bb565b80156106415780601f1061061657610100808354040283529160200191610641565b820191906000526020600020905b81548152906001019060200180831161062457829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015292915050565b606060006106816005610bed565b67ffffffffffffffff81111561069957610699611074565b6040519080825280602002602001820160405280156106f557816020015b6106e26040805160808101909152806000815260606020820181905260006040830181905291015290565b8152602001906001900390816106b75790505b50905060005b6107056005610bed565b811015610848576007600061071b600584610db5565b6001600160a01b03168152602081019190915260409081016000208151608081019092528054829060ff16600581111561075757610757611180565b600581111561076857610768611180565b815260200160018201805461077c906113bb565b80601f01602080910402602001604051908101604052809291908181526020018280546107a8906113bb565b80156107f55780601f106107ca576101008083540402835291602001916107f5565b820191906000526020600020905b8154815290600101906020018083116107d857829003601f168201915b505050918352505060028201546001600160a01b039081166020830152600390920154909116604090910152825183908390811061083557610835611576565b60209081029190910101526001016106fb565b50919050565b6001600160a01b03808216600090815260076020526040902060030154829133911681146108ac5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038381166000908152600760205260409020600201541661090a57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b60056001600160a01b03841660009081526007602052604090205460ff16600581111561093957610939611180565b146109825760408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b81526101b1919060040161137e565b61098d600584610dc1565b506001600160a01b0383166000908152600760205260408120805460ff19168155906109bc6001830182610fc0565b506002810180546001600160a01b03199081169091556003909101805490911690556040516001600160a01b038416907fcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b90600090a2505050565b606061014c6005610dd6565b33610a2f600882610bfd565b610a695760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038481166000908152600760205260409020600201541615610ac857604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526101b1919060040161137e565b60006040518060800160405280846005811115610ae757610ae7611180565b8152602081018690526001600160a01b0387166040820152336060909101529050610b13600586610de3565b506001600160a01b03851660009081526007602052604090208151815483929190829060ff19166001836005811115610b4e57610b4e611180565b021790555060208201516001820190610b6790826114b6565b506040828101516002830180546001600160a01b03199081166001600160a01b039384161790915560609094015160039093018054909416928116929092179092559051908616907fd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e56190610bde908790879061158c565b60405180910390a25050505050565b6000610bf7825490565b92915050565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b6000826005811115610c3657610c36611180565b1480610c8a57506001826005811115610c5157610c51611180565b148015610c8a57506003816005811115610c6d57610c6d611180565b1480610c8a57506004816005811115610c8857610c88611180565b145b80610cdd57506002826005811115610ca457610ca4611180565b148015610cdd57506003816005811115610cc057610cc0611180565b1480610cdd57506004816005811115610cdb57610cdb611180565b145b80610d3057506004826005811115610cf757610cf7611180565b148015610d3057506003816005811115610d1357610d13611180565b1480610d3057506005816005811115610d2e57610d2e611180565b145b80610d6857506003826005811115610d4a57610d4a611180565b148015610d6857506005816005811115610d6657610d66611180565b145b15610d71575050565b60408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b81526101b1919060040161137e565b6000610c1b8383610df8565b6000610c1b836001600160a01b038416610e22565b60606000610c1b83610f15565b6000610c1b836001600160a01b038416610f71565b6000826000018281548110610e0f57610e0f611576565b9060005260206000200154905092915050565b60008181526001830160205260408120548015610f0b576000610e466001836115ae565b8554909150600090610e5a906001906115ae565b9050808214610ebf576000866000018281548110610e7a57610e7a611576565b9060005260206000200154905080876000018481548110610e9d57610e9d611576565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610ed057610ed06115cf565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610bf7565b6000915050610bf7565b606081600001805480602002602001604051908101604052809291908181526020018280548015610f6557602002820191906000526020600020905b815481526020019060010190808311610f51575b50505050509050919050565b6000818152600183016020526040812054610fb857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bf7565b506000610bf7565b508054610fcc906113bb565b6000825580601f10610fdc575050565b601f016020900490600052602060002090810190610ffa9190610ffd565b50565b5b808211156110125760008155600101610ffe565b5090565b80356001600160a01b038116811461102d57600080fd5b919050565b80356006811061102d57600080fd5b6000806040838503121561105457600080fd5b61105d83611016565b915061106b60208401611032565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261109b57600080fd5b813567ffffffffffffffff808211156110b6576110b6611074565b604051601f8301601f19908116603f011681019082821181831017156110de576110de611074565b816040528381528660208588010111156110f757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561112a57600080fd5b61113383611016565b9150602083013567ffffffffffffffff81111561114f57600080fd5b61115b8582860161108a565b9150509250929050565b60006020828403121561117757600080fd5b610c1b82611016565b634e487b7160e01b600052602160045260246000fd5b600681106111b457634e487b7160e01b600052602160045260246000fd5b9052565b60005b838110156111d35781810151838201526020016111bb565b50506000910152565b600081518084526111f48160208601602086016111b8565b601f01601f19169290920160200192915050565b611213828251611196565b600060208201516080602085015261122e60808501826111dc565b6040848101516001600160a01b03908116918701919091526060948501511693909401929092525090919050565b602081526000610c1b6020830184611208565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156112c657603f198886030184526112b4858351611208565b94509285019290850190600101611298565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156113145783516001600160a01b0316835292840192918401916001016112ef565b50909695505050505050565b60008060006060848603121561133557600080fd5b61133e84611016565b9250602084013567ffffffffffffffff81111561135a57600080fd5b6113668682870161108a565b92505061137560408501611032565b90509250925092565b602081526000610c1b60208301846111dc565b60208101610bf78284611196565b600082516113b18184602087016111b8565b9190910192915050565b600181811c908216806113cf57607f821691505b60208210810361084857634e487b7160e01b600052602260045260246000fd5b60008083546113fd816113bb565b60018281168015611415576001811461142a57611459565b60ff1984168752821515830287019450611459565b8760005260208060002060005b858110156114505781548a820152908401908201611437565b50505082870194505b50929695505050505050565b601f8211156114b1576000816000526020600020601f850160051c8101602086101561148e5750805b601f850160051c820191505b818110156114ad5782815560010161149a565b5050505b505050565b815167ffffffffffffffff8111156114d0576114d0611074565b6114e4816114de84546113bb565b84611465565b602080601f83116001811461151957600084156115015750858301515b600019600386901b1c1916600185901b1785556114ad565b600085815260208120601f198616915b8281101561154857888601518255948401946001909101908401611529565b50858210156115665787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b60408152600061159f60408301856111dc565b9050610c1b6020830184611196565b81810381811115610bf757634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd \ No newline at end of file diff --git a/packages/generated/dev/abis/NodeRegistry.json b/packages/generated/dev/abis/NodeRegistry.json new file mode 100644 index 000000000..4d9fef6b9 --- /dev/null +++ b/packages/generated/dev/abis/NodeRegistry.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"getAllNodeAddresses","inputs":[],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"getAllNodes","inputs":[],"outputs":[{"name":"","type":"tuple[]","internalType":"struct Node[]","components":[{"name":"status","type":"uint8","internalType":"enum NodeStatus"},{"name":"url","type":"string","internalType":"string"},{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}]}],"stateMutability":"view"},{"type":"function","name":"getNode","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","internalType":"struct Node","components":[{"name":"status","type":"uint8","internalType":"enum NodeStatus"},{"name":"url","type":"string","internalType":"string"},{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}]}],"stateMutability":"view"},{"type":"function","name":"getNodeCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"registerNode","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"url","type":"string","internalType":"string"},{"name":"status","type":"uint8","internalType":"enum NodeStatus"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeNode","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateNodeStatus","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"status","type":"uint8","internalType":"enum NodeStatus"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateNodeUrl","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"url","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"NodeAdded","inputs":[{"name":"nodeAddress","type":"address","indexed":true,"internalType":"address"},{"name":"url","type":"string","indexed":false,"internalType":"string"},{"name":"status","type":"uint8","indexed":false,"internalType":"enum NodeStatus"}],"anonymous":false},{"type":"event","name":"NodeRemoved","inputs":[{"name":"nodeAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"NodeStatusUpdated","inputs":[{"name":"nodeAddress","type":"address","indexed":true,"internalType":"address"},{"name":"status","type":"uint8","indexed":false,"internalType":"enum NodeStatus"}],"anonymous":false},{"type":"event","name":"NodeUrlUpdated","inputs":[{"name":"nodeAddress","type":"address","indexed":true,"internalType":"address"},{"name":"url","type":"string","indexed":false,"internalType":"string"}],"anonymous":false}],"bytecode":{"object":"0x608060405234801561001057600080fd5b506115e5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063a1174e7d1161005b578063a1174e7d146100f0578063b2b99ec914610105578063c8fe3a0114610118578063eecc66f41461012d57600080fd5b806339bf397e1461008d578063581f8b9b146100a85780637e4465e7146100bd5780639d209048146100d0575b600080fd5b610095610140565b6040519081526020015b60405180910390f35b6100bb6100b6366004611041565b610151565b005b6100bb6100cb366004611117565b6102fa565b6100e36100de366004611165565b6104f2565b60405161009f919061125c565b6100f8610673565b60405161009f919061126f565b6100bb610113366004611165565b61084e565b610120610a17565b60405161009f91906112d3565b6100bb61013b366004611320565b610a23565b600061014c6005610bed565b905090565b6001600160a01b038083166000908152600760205260409020600201548391166101ba57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b60405180910390fd5b336101c6600882610bfd565b6102005760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038085166000908152600760205260409020600301548591339116811461025e5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038616600090815260076020526040902080546102859060ff1687610c22565b80548690829060ff191660018360058111156102a3576102a3611180565b021790555060028101546040516001600160a01b03909116907f20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0906102e9908990611391565b60405180910390a250505050505050565b33610306600882610bfd565b6103405760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038084166000908152600760205260409020600201548491166103a057604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b03808516600090815260076020526040902060030154859133911681146103fe5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b03861660009081526007602090815260409182902091516104289188910161139f565b604051602081830303815290604052805190602001208160010160405160200161045291906113ef565b60405160208183030381529060405280519060200120036104a25760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526101b1919060040161137e565b600181016104b087826114b6565b5060028101546040516001600160a01b03909116907f4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac906102e990899061137e565b61051d6040805160808101909152806000815260606020820181905260006040830181905291015290565b610528600583610bfd565b61056857604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038216600090815260076020526040908190208151608081019092528054829060ff1660058111156105a3576105a3611180565b60058111156105b4576105b4611180565b81526020016001820180546105c8906113bb565b80601f01602080910402602001604051908101604052809291908181526020018280546105f4906113bb565b80156106415780601f1061061657610100808354040283529160200191610641565b820191906000526020600020905b81548152906001019060200180831161062457829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015292915050565b606060006106816005610bed565b67ffffffffffffffff81111561069957610699611074565b6040519080825280602002602001820160405280156106f557816020015b6106e26040805160808101909152806000815260606020820181905260006040830181905291015290565b8152602001906001900390816106b75790505b50905060005b6107056005610bed565b811015610848576007600061071b600584610db5565b6001600160a01b03168152602081019190915260409081016000208151608081019092528054829060ff16600581111561075757610757611180565b600581111561076857610768611180565b815260200160018201805461077c906113bb565b80601f01602080910402602001604051908101604052809291908181526020018280546107a8906113bb565b80156107f55780601f106107ca576101008083540402835291602001916107f5565b820191906000526020600020905b8154815290600101906020018083116107d857829003601f168201915b505050918352505060028201546001600160a01b039081166020830152600390920154909116604090910152825183908390811061083557610835611576565b60209081029190910101526001016106fb565b50919050565b6001600160a01b03808216600090815260076020526040902060030154829133911681146108ac5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038381166000908152600760205260409020600201541661090a57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b60056001600160a01b03841660009081526007602052604090205460ff16600581111561093957610939611180565b146109825760408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b81526101b1919060040161137e565b61098d600584610dc1565b506001600160a01b0383166000908152600760205260408120805460ff19168155906109bc6001830182610fc0565b506002810180546001600160a01b03199081169091556003909101805490911690556040516001600160a01b038416907fcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b90600090a2505050565b606061014c6005610dd6565b33610a2f600882610bfd565b610a695760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038481166000908152600760205260409020600201541615610ac857604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526101b1919060040161137e565b60006040518060800160405280846005811115610ae757610ae7611180565b8152602081018690526001600160a01b0387166040820152336060909101529050610b13600586610de3565b506001600160a01b03851660009081526007602052604090208151815483929190829060ff19166001836005811115610b4e57610b4e611180565b021790555060208201516001820190610b6790826114b6565b506040828101516002830180546001600160a01b03199081166001600160a01b039384161790915560609094015160039093018054909416928116929092179092559051908616907fd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e56190610bde908790879061158c565b60405180910390a25050505050565b6000610bf7825490565b92915050565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b6000826005811115610c3657610c36611180565b1480610c8a57506001826005811115610c5157610c51611180565b148015610c8a57506003816005811115610c6d57610c6d611180565b1480610c8a57506004816005811115610c8857610c88611180565b145b80610cdd57506002826005811115610ca457610ca4611180565b148015610cdd57506003816005811115610cc057610cc0611180565b1480610cdd57506004816005811115610cdb57610cdb611180565b145b80610d3057506004826005811115610cf757610cf7611180565b148015610d3057506003816005811115610d1357610d13611180565b1480610d3057506005816005811115610d2e57610d2e611180565b145b80610d6857506003826005811115610d4a57610d4a611180565b148015610d6857506005816005811115610d6657610d66611180565b145b15610d71575050565b60408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b81526101b1919060040161137e565b6000610c1b8383610df8565b6000610c1b836001600160a01b038416610e22565b60606000610c1b83610f15565b6000610c1b836001600160a01b038416610f71565b6000826000018281548110610e0f57610e0f611576565b9060005260206000200154905092915050565b60008181526001830160205260408120548015610f0b576000610e466001836115ae565b8554909150600090610e5a906001906115ae565b9050808214610ebf576000866000018281548110610e7a57610e7a611576565b9060005260206000200154905080876000018481548110610e9d57610e9d611576565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610ed057610ed06115cf565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610bf7565b6000915050610bf7565b606081600001805480602002602001604051908101604052809291908181526020018280548015610f6557602002820191906000526020600020905b815481526020019060010190808311610f51575b50505050509050919050565b6000818152600183016020526040812054610fb857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bf7565b506000610bf7565b508054610fcc906113bb565b6000825580601f10610fdc575050565b601f016020900490600052602060002090810190610ffa9190610ffd565b50565b5b808211156110125760008155600101610ffe565b5090565b80356001600160a01b038116811461102d57600080fd5b919050565b80356006811061102d57600080fd5b6000806040838503121561105457600080fd5b61105d83611016565b915061106b60208401611032565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261109b57600080fd5b813567ffffffffffffffff808211156110b6576110b6611074565b604051601f8301601f19908116603f011681019082821181831017156110de576110de611074565b816040528381528660208588010111156110f757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561112a57600080fd5b61113383611016565b9150602083013567ffffffffffffffff81111561114f57600080fd5b61115b8582860161108a565b9150509250929050565b60006020828403121561117757600080fd5b610c1b82611016565b634e487b7160e01b600052602160045260246000fd5b600681106111b457634e487b7160e01b600052602160045260246000fd5b9052565b60005b838110156111d35781810151838201526020016111bb565b50506000910152565b600081518084526111f48160208601602086016111b8565b601f01601f19169290920160200192915050565b611213828251611196565b600060208201516080602085015261122e60808501826111dc565b6040848101516001600160a01b03908116918701919091526060948501511693909401929092525090919050565b602081526000610c1b6020830184611208565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156112c657603f198886030184526112b4858351611208565b94509285019290850190600101611298565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156113145783516001600160a01b0316835292840192918401916001016112ef565b50909695505050505050565b60008060006060848603121561133557600080fd5b61133e84611016565b9250602084013567ffffffffffffffff81111561135a57600080fd5b6113668682870161108a565b92505061137560408501611032565b90509250925092565b602081526000610c1b60208301846111dc565b60208101610bf78284611196565b600082516113b18184602087016111b8565b9190910192915050565b600181811c908216806113cf57607f821691505b60208210810361084857634e487b7160e01b600052602260045260246000fd5b60008083546113fd816113bb565b60018281168015611415576001811461142a57611459565b60ff1984168752821515830287019450611459565b8760005260208060002060005b858110156114505781548a820152908401908201611437565b50505082870194505b50929695505050505050565b601f8211156114b1576000816000526020600020601f850160051c8101602086101561148e5750805b601f850160051c820191505b818110156114ad5782815560010161149a565b5050505b505050565b815167ffffffffffffffff8111156114d0576114d0611074565b6114e4816114de84546113bb565b84611465565b602080601f83116001811461151957600084156115015750858301515b600019600386901b1c1916600185901b1785556114ad565b600085815260208120601f198616915b8281101561154857888601518255948401946001909101908401611529565b50858210156115665787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b60408152600061159f60408301856111dc565b9050610c1b6020830184611196565b81810381811115610bf757634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd","sourceMap":"528:3411:40:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063a1174e7d1161005b578063a1174e7d146100f0578063b2b99ec914610105578063c8fe3a0114610118578063eecc66f41461012d57600080fd5b806339bf397e1461008d578063581f8b9b146100a85780637e4465e7146100bd5780639d209048146100d0575b600080fd5b610095610140565b6040519081526020015b60405180910390f35b6100bb6100b6366004611041565b610151565b005b6100bb6100cb366004611117565b6102fa565b6100e36100de366004611165565b6104f2565b60405161009f919061125c565b6100f8610673565b60405161009f919061126f565b6100bb610113366004611165565b61084e565b610120610a17565b60405161009f91906112d3565b6100bb61013b366004611320565b610a23565b600061014c6005610bed565b905090565b6001600160a01b038083166000908152600760205260409020600201548391166101ba57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b60405180910390fd5b336101c6600882610bfd565b6102005760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038085166000908152600760205260409020600301548591339116811461025e5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038616600090815260076020526040902080546102859060ff1687610c22565b80548690829060ff191660018360058111156102a3576102a3611180565b021790555060028101546040516001600160a01b03909116907f20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0906102e9908990611391565b60405180910390a250505050505050565b33610306600882610bfd565b6103405760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038084166000908152600760205260409020600201548491166103a057604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b03808516600090815260076020526040902060030154859133911681146103fe5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b03861660009081526007602090815260409182902091516104289188910161139f565b604051602081830303815290604052805190602001208160010160405160200161045291906113ef565b60405160208183030381529060405280519060200120036104a25760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526101b1919060040161137e565b600181016104b087826114b6565b5060028101546040516001600160a01b03909116907f4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac906102e990899061137e565b61051d6040805160808101909152806000815260606020820181905260006040830181905291015290565b610528600583610bfd565b61056857604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038216600090815260076020526040908190208151608081019092528054829060ff1660058111156105a3576105a3611180565b60058111156105b4576105b4611180565b81526020016001820180546105c8906113bb565b80601f01602080910402602001604051908101604052809291908181526020018280546105f4906113bb565b80156106415780601f1061061657610100808354040283529160200191610641565b820191906000526020600020905b81548152906001019060200180831161062457829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015292915050565b606060006106816005610bed565b67ffffffffffffffff81111561069957610699611074565b6040519080825280602002602001820160405280156106f557816020015b6106e26040805160808101909152806000815260606020820181905260006040830181905291015290565b8152602001906001900390816106b75790505b50905060005b6107056005610bed565b811015610848576007600061071b600584610db5565b6001600160a01b03168152602081019190915260409081016000208151608081019092528054829060ff16600581111561075757610757611180565b600581111561076857610768611180565b815260200160018201805461077c906113bb565b80601f01602080910402602001604051908101604052809291908181526020018280546107a8906113bb565b80156107f55780601f106107ca576101008083540402835291602001916107f5565b820191906000526020600020905b8154815290600101906020018083116107d857829003601f168201915b505050918352505060028201546001600160a01b039081166020830152600390920154909116604090910152825183908390811061083557610835611576565b60209081029190910101526001016106fb565b50919050565b6001600160a01b03808216600090815260076020526040902060030154829133911681146108ac5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038381166000908152600760205260409020600201541661090a57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b60056001600160a01b03841660009081526007602052604090205460ff16600581111561093957610939611180565b146109825760408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b81526101b1919060040161137e565b61098d600584610dc1565b506001600160a01b0383166000908152600760205260408120805460ff19168155906109bc6001830182610fc0565b506002810180546001600160a01b03199081169091556003909101805490911690556040516001600160a01b038416907fcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b90600090a2505050565b606061014c6005610dd6565b33610a2f600882610bfd565b610a695760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038481166000908152600760205260409020600201541615610ac857604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526101b1919060040161137e565b60006040518060800160405280846005811115610ae757610ae7611180565b8152602081018690526001600160a01b0387166040820152336060909101529050610b13600586610de3565b506001600160a01b03851660009081526007602052604090208151815483929190829060ff19166001836005811115610b4e57610b4e611180565b021790555060208201516001820190610b6790826114b6565b506040828101516002830180546001600160a01b03199081166001600160a01b039384161790915560609094015160039093018054909416928116929092179092559051908616907fd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e56190610bde908790879061158c565b60405180910390a25050505050565b6000610bf7825490565b92915050565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b6000826005811115610c3657610c36611180565b1480610c8a57506001826005811115610c5157610c51611180565b148015610c8a57506003816005811115610c6d57610c6d611180565b1480610c8a57506004816005811115610c8857610c88611180565b145b80610cdd57506002826005811115610ca457610ca4611180565b148015610cdd57506003816005811115610cc057610cc0611180565b1480610cdd57506004816005811115610cdb57610cdb611180565b145b80610d3057506004826005811115610cf757610cf7611180565b148015610d3057506003816005811115610d1357610d13611180565b1480610d3057506005816005811115610d2e57610d2e611180565b145b80610d6857506003826005811115610d4a57610d4a611180565b148015610d6857506005816005811115610d6657610d66611180565b145b15610d71575050565b60408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b81526101b1919060040161137e565b6000610c1b8383610df8565b6000610c1b836001600160a01b038416610e22565b60606000610c1b83610f15565b6000610c1b836001600160a01b038416610f71565b6000826000018281548110610e0f57610e0f611576565b9060005260206000200154905092915050565b60008181526001830160205260408120548015610f0b576000610e466001836115ae565b8554909150600090610e5a906001906115ae565b9050808214610ebf576000866000018281548110610e7a57610e7a611576565b9060005260206000200154905080876000018481548110610e9d57610e9d611576565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610ed057610ed06115cf565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610bf7565b6000915050610bf7565b606081600001805480602002602001604051908101604052809291908181526020018280548015610f6557602002820191906000526020600020905b815481526020019060010190808311610f51575b50505050509050919050565b6000818152600183016020526040812054610fb857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bf7565b506000610bf7565b508054610fcc906113bb565b6000825580601f10610fdc575050565b601f016020900490600052602060002090810190610ffa9190610ffd565b50565b5b808211156110125760008155600101610ffe565b5090565b80356001600160a01b038116811461102d57600080fd5b919050565b80356006811061102d57600080fd5b6000806040838503121561105457600080fd5b61105d83611016565b915061106b60208401611032565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261109b57600080fd5b813567ffffffffffffffff808211156110b6576110b6611074565b604051601f8301601f19908116603f011681019082821181831017156110de576110de611074565b816040528381528660208588010111156110f757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561112a57600080fd5b61113383611016565b9150602083013567ffffffffffffffff81111561114f57600080fd5b61115b8582860161108a565b9150509250929050565b60006020828403121561117757600080fd5b610c1b82611016565b634e487b7160e01b600052602160045260246000fd5b600681106111b457634e487b7160e01b600052602160045260246000fd5b9052565b60005b838110156111d35781810151838201526020016111bb565b50506000910152565b600081518084526111f48160208601602086016111b8565b601f01601f19169290920160200192915050565b611213828251611196565b600060208201516080602085015261122e60808501826111dc565b6040848101516001600160a01b03908116918701919091526060948501511693909401929092525090919050565b602081526000610c1b6020830184611208565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156112c657603f198886030184526112b4858351611208565b94509285019290850190600101611298565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156113145783516001600160a01b0316835292840192918401916001016112ef565b50909695505050505050565b60008060006060848603121561133557600080fd5b61133e84611016565b9250602084013567ffffffffffffffff81111561135a57600080fd5b6113668682870161108a565b92505061137560408501611032565b90509250925092565b602081526000610c1b60208301846111dc565b60208101610bf78284611196565b600082516113b18184602087016111b8565b9190910192915050565b600181811c908216806113cf57607f821691505b60208210810361084857634e487b7160e01b600052602260045260246000fd5b60008083546113fd816113bb565b60018281168015611415576001811461142a57611459565b60ff1984168752821515830287019450611459565b8760005260208060002060005b858110156114505781548a820152908401908201611437565b50505082870194505b50929695505050505050565b601f8211156114b1576000816000526020600020601f850160051c8101602086101561148e5750805b601f850160051c820191505b818110156114ad5782815560010161149a565b5050505b505050565b815167ffffffffffffffff8111156114d0576114d0611074565b6114e4816114de84546113bb565b84611465565b602080601f83116001811461151957600084156115015750858301515b600019600386901b1c1916600185901b1785556114ad565b600085815260208120601f198616915b8281101561154857888601518255948401946001909101908401611529565b50858210156115665787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b60408152600061159f60408301856111dc565b9050610c1b6020830184611196565b81810381811115610bf757634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd","sourceMap":"528:3411:40:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2849:91;;;:::i;:::-;;;160:25:84;;;148:2;133:18;2849:91:40;;;;;;;;1728:394;;;;;;:::i;:::-;;:::i;:::-;;2126:453;;;;;;:::i;:::-;;:::i;2583:262::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3055:254::-;;;:::i;:::-;;;;;;;:::i;1248:476::-;;;;;;:::i;:::-;;:::i;2944:107::-;;;:::i;:::-;;;;;;;:::i;643:601::-;;;;;;:::i;:::-;;:::i;2849:91::-;2896:7;2918:17;:8;:15;:17::i;:::-;2911:24;;2849:91;:::o;1728:394::-;-1:-1:-1;;;;;3046:22:46;;;3092:1;3046:22;;;:16;:22;;;;;:34;;;1832:11:40;;3046:34:46;3042:102;;3109:34;;;;;;;;;;;-1:-1:-1;;;3109:34:46;;;;3102:42;;-1:-1:-1;;;3102:42:46;;;;3109:34;3102:42;;;:::i;:::-;;;;;;;;3042:102;1862:10:40::1;3211:31:46;:12;1862:10:40::0;3211:21:46::1;:31::i;:::-;3206:74;;3251:28;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3251:28:46::1;::::0;::::1;::::0;3244:36;;-1:-1:-1;;;3244:36:46;;::::1;::::0;3251:28;3244:36:::1;;;:::i;3206:74::-;-1:-1:-1::0;;;;;3497:22:46;;::::2;:2;:22:::0;;;:16:::2;:22;::::0;;;;:31:::2;;::::0;1895:11:40;;1908:10:::2;::::0;3497:31:46::2;:43:::0;::::2;3493:91;;3555:28;::::0;;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;3555:28:46::2;::::0;::::2;::::0;3548:36;;-1:-1:-1;;;3548:36:46;;::::2;::::0;3555:28;3548:36:::2;;;:::i;3493:91::-;-1:-1:-1::0;;;;;1948:29:40;::::3;1928:17;1948:29:::0;;;:16:::3;:29;::::0;;;;2016:11;;1984:52:::3;::::0;2016:11:::3;;2029:6:::0;1984:31:::3;:52::i;:::-;2043:20:::0;;2057:6;;2043:4;;-1:-1:-1;;2043:20:40::3;::::0;2057:6;2043:20:::3;::::0;::::3;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;2092:16:40::3;::::0;::::3;::::0;2074:43:::3;::::0;-1:-1:-1;;;;;2092:16:40;;::::3;::::0;2074:43:::3;::::0;::::3;::::0;2110:6;;2074:43:::3;:::i;:::-;;;;;;;;1922:200;3286:1:46::2;;3150::::1;1728:394:40::0;;;:::o;2126:453::-;2231:10;3211:31:46;:12;2231:10:40;3211:21:46;:31::i;:::-;3206:74;;3251:28;;;;;;;;;;;-1:-1:-1;;;3251:28:46;;;;3244:36;;-1:-1:-1;;;3244:36:46;;;;3251:28;3244:36;;;:::i;3206:74::-;-1:-1:-1;;;;;3046:22:46;;::::1;3092:1;3046:22:::0;;;:16:::1;:22;::::0;;;;:34:::1;;::::0;2256:11:40;;3046:34:46::1;3042:102;;3109:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3109:34:46::1;::::0;::::1;::::0;3102:42;;-1:-1:-1;;;3102:42:46;;::::1;::::0;3109:34;3102:42:::1;;;:::i;3042:102::-;-1:-1:-1::0;;;;;3497:22:46;;::::2;:2;:22:::0;;;:16:::2;:22;::::0;;;;:31:::2;;::::0;2290:11:40;;2303:10:::2;::::0;3497:31:46::2;:43:::0;::::2;3493:91;;3555:28;::::0;;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;3555:28:46::2;::::0;::::2;::::0;3548:36;;-1:-1:-1;;;3548:36:46;;::::2;::::0;3555:28;3548:36:::2;;;:::i;3493:91::-;-1:-1:-1::0;;;;;2343:29:40;::::3;2323:17;2343:29:::0;;;:16:::3;:29;::::0;;;;;;;;2441:21;;::::3;::::0;2458:3;;2441:21:::3;;:::i;:::-;;;;;;;;;;;;;2431:32;;;;;;2417:4;:8;;2400:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;2390:37;;;;;;:73:::0;2379:126:::3;;2477:27;::::0;;;;::::3;::::0;;::::3;::::0;;-1:-1:-1;;;2477:27:40::3;::::0;::::3;::::0;2470:35;;-1:-1:-1;;;2470:35:40;;::::3;::::0;2477:27;2470:35:::3;;;:::i;2379:126::-;2512:8;::::0;::::3;:14;2523:3:::0;2512:8;:14:::3;:::i;:::-;-1:-1:-1::0;2552:16:40::3;::::0;::::3;::::0;2537:37:::3;::::0;-1:-1:-1;;;;;2552:16:40;;::::3;::::0;2537:37:::3;::::0;::::3;::::0;2570:3;;2537:37:::3;:::i;2583:262::-:0;2644:11;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2644:11:40;2717:30;:8;2735:11;2717:17;:30::i;:::-;2712:85;;2762:34;;;;;;;;;;;-1:-1:-1;;;2762:34:40;;;;2755:42;;-1:-1:-1;;;2755:42:40;;;;2762:34;2755:42;;;:::i;2712:85::-;-1:-1:-1;;;;;2811:29:40;;:2;:29;;;:16;:29;;;;;;;2804:36;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2804:36:40;;;-1:-1:-1;;2804:36:40;;;;-1:-1:-1;;;;;2804:36:40;;;;;;;;;;;;;;;;;;;;;2583:262;-1:-1:-1;;2583:262:40:o;3055:254::-;3101:13;3122:19;3155:17;:8;:15;:17::i;:::-;3144:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3144:29:40;;;;;;;;;;;;;;;;;3122:51;;3185:9;3180:106;3204:17;:8;:15;:17::i;:::-;3200:1;:21;3180:106;;;3247:16;:2;3264:14;:8;3276:1;3264:11;:14::i;:::-;-1:-1:-1;;;;;3247:32:40;;;;;;;;;;;;;;-1:-1:-1;3247:32:40;3236:43;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3236:43:40;;;-1:-1:-1;;3236:43:40;;;;-1:-1:-1;;;;;3236:43:40;;;;;;;;;;;;;;;;;;;;:8;;:5;;3242:1;;3236:8;;;;;;:::i;:::-;;;;;;;;;;:43;3223:3;;3180:106;;;-1:-1:-1;3299:5:40;3055:254;-1:-1:-1;3055:254:40:o;1248:476::-;-1:-1:-1;;;;;3497:22:46;;;:2;:22;;;:16;:22;;;;;:31;;;1323:11:40;;1336:10;;3497:31:46;:43;;3493:91;;3555:28;;;;;;;;;;;-1:-1:-1;;;3555:28:46;;;;3548:36;;-1:-1:-1;;;3548:36:46;;;;3555:28;3548:36;;;:::i;3493:91::-;-1:-1:-1;;;;;1358:29:40;;::::1;1411:1;1358:29:::0;;;:16:::1;:29;::::0;;;;:41:::1;;::::0;::::1;1354:118;;1430:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1430:34:40::1;::::0;::::1;::::0;1423:42;;-1:-1:-1;;;1423:42:40;;::::1;::::0;1430:34;1423:42:::1;;;:::i;1354:118::-;1522:18;-1:-1:-1::0;;;;;1482:29:40;::::1;:2;:29:::0;;;:16:::1;:29;::::0;;;;:36;::::1;;:58;::::0;::::1;;;;;;:::i;:::-;;1478:129;;1557:42;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1557:42:40::1;::::0;::::1;::::0;1550:50;;-1:-1:-1;;;1550:50:40;;::::1;::::0;1557:42;1550:50:::1;;;:::i;1478:129::-;1613:28;:8;1629:11:::0;1613:15:::1;:28::i;:::-;-1:-1:-1::0;;;;;;1654:29:40;::::1;:2;:29:::0;;;:16:::1;:29;::::0;;;;1647:36;;-1:-1:-1;;1647:36:40::1;::::0;;1654:29;1647:36:::1;::::0;;::::1;1654:2:::0;1647:36:::1;:::i;:::-;-1:-1:-1::0;1647:36:40::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;1647:36:40;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;1695:24:::1;::::0;-1:-1:-1;;;;;1695:24:40;::::1;::::0;::::1;::::0;1647:36:::1;::::0;1695:24:::1;1248:476:::0;;;:::o;2944:107::-;2998:16;3029:17;:8;:15;:17::i;643:601::-;762:10;3211:31:46;:12;762:10:40;3211:21:46;:31::i;:::-;3206:74;;3251:28;;;;;;;;;;;-1:-1:-1;;;3251:28:46;;;;3244:36;;-1:-1:-1;;;3244:36:46;;;;3251:28;3244:36;;;:::i;3206:74::-;-1:-1:-1;;;;;845:29:40;;::::1;898:1;845:29:::0;;;:16:::1;:29;::::0;;;;:41:::1;;::::0;::::1;:55:::0;841:109:::1;;915:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;915:34:40::1;::::0;::::1;::::0;908:42;;-1:-1:-1;;;908:42:40;;::::1;::::0;915:34;908:42:::1;;;:::i;841:109::-;957:19;979:110;;;;;;;;1048:6;979:110;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;979:110:40;::::1;::::0;;;;1072:10:::1;979:110:::0;;;;;957:132;-1:-1:-1;1096:25:40::1;:8;1005:11:::0;1096:12:::1;:25::i;:::-;-1:-1:-1::0;;;;;;1153:29:40;::::1;:2;:29:::0;;;:16:::1;:29;::::0;;;;:39;;;;1185:7;;1153:29;:39;:29;;-1:-1:-1;;1153:39:40::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;1153:39:40::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;1153:39:40::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;1153:39:40;;::::1;-1:-1:-1::0;;;;;1153:39:40;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;1204:35;;;;::::1;::::0;::::1;::::0;::::1;::::0;1227:3;;1232:6;;1204:35:::1;:::i;:::-;;;;;;;;774:470;643:601:::0;;;;:::o;9117:115:61:-;9180:7;9206:19;9214:3;4556:18;;4474:107;9206:19;9199:26;9117:115;-1:-1:-1;;9117:115:61:o;8871:165::-;-1:-1:-1;;;;;9004:23:61;;8951:4;4360:21;;;:14;;;:21;;;;;;:26;;8974:55;8967:62;8871:165;-1:-1:-1;;;8871:165:61:o;3313:624:40:-;3437:25;3429:4;:33;;;;;;;;:::i;:::-;;:141;;;-1:-1:-1;3481:21:40;3473:4;:29;;;;;;;;:::i;:::-;;:96;;;;-1:-1:-1;3521:17:40;3515:2;:23;;;;;;;;:::i;:::-;;:53;;;-1:-1:-1;3548:20:40;3542:2;:26;;;;;;;;:::i;:::-;;3515:53;3429:250;;;-1:-1:-1;3589:22:40;3581:4;:30;;;;;;;;:::i;:::-;;:97;;;;-1:-1:-1;3630:17:40;3624:2;:23;;;;;;;;:::i;:::-;;:53;;;-1:-1:-1;3657:20:40;3651:2;:26;;;;;;;;:::i;:::-;;3624:53;3429:355;;;-1:-1:-1;3698:20:40;3690:4;:28;;;;;;;;:::i;:::-;;:93;;;;-1:-1:-1;3737:17:40;3731:2;:23;;;;;;;;:::i;:::-;;:51;;;-1:-1:-1;3764:18:40;3758:2;:24;;;;;;;;:::i;:::-;;3731:51;3429:420;;;-1:-1:-1;3803:17:40;3795:4;:25;;;;;;;;:::i;:::-;;:53;;;;-1:-1:-1;3830:18:40;3824:2;:24;;;;;;;;:::i;:::-;;3795:53;3418:459;;;3313:624;;:::o;3418:459::-;3889:42;;;;;;;;;;;-1:-1:-1;;;3889:42:40;;;;3882:50;;-1:-1:-1;;;3882:50:40;;;;3889:42;3882:50;;;:::i;9574:156:61:-;9648:7;9698:22;9702:3;9714:5;9698:3;:22::i;8634:156::-;8707:4;8730:53;8738:3;-1:-1:-1;;;;;8758:23:61;;8730:7;:53::i;10270:300::-;10333:16;10361:22;10386:19;10394:3;10386:7;:19::i;8316:150::-;8386:4;8409:50;8414:3;-1:-1:-1;;;;;8434:23:61;;8409:4;:50::i;4923:118::-;4990:7;5016:3;:11;;5028:5;5016:18;;;;;;;;:::i;:::-;;;;;;;;;5009:25;;4923:118;;;;:::o;2815:1368::-;2881:4;3010:21;;;:14;;;:21;;;;;;3046:13;;3042:1135;;3413:18;3434:12;3445:1;3434:8;:12;:::i;:::-;3480:18;;3413:33;;-1:-1:-1;3460:17:61;;3480:22;;3501:1;;3480:22;:::i;:::-;3460:42;;3535:9;3521:10;:23;3517:378;;3564:17;3584:3;:11;;3596:9;3584:22;;;;;;;;:::i;:::-;;;;;;;;;3564:42;;3731:9;3705:3;:11;;3717:10;3705:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;3844:25;;;:14;;;:25;;;;;:36;;;3517:378;3973:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4076:3;:14;;:21;4091:5;4076:21;;;;;;;;;;;4069:28;;;4119:4;4112:11;;;;;;;3042:1135;4161:5;4154:12;;;;;5581:109;5637:16;5672:3;:11;;5665:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5581:109;;;:::o;2241:406::-;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:61;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:61;2618:12;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;196:173:84:-;264:20;;-1:-1:-1;;;;;313:31:84;;303:42;;293:70;;359:1;356;349:12;293:70;196:173;;;:::o;374:151::-;450:20;;499:1;489:12;;479:40;;515:1;512;505:12;530:283;613:6;621;674:2;662:9;653:7;649:23;645:32;642:52;;;690:1;687;680:12;642:52;713:29;732:9;713:29;:::i;:::-;703:39;;761:46;803:2;792:9;788:18;761:46;:::i;:::-;751:56;;530:283;;;;;:::o;818:127::-;879:10;874:3;870:20;867:1;860:31;910:4;907:1;900:15;934:4;931:1;924:15;950:719;993:5;1046:3;1039:4;1031:6;1027:17;1023:27;1013:55;;1064:1;1061;1054:12;1013:55;1100:6;1087:20;1126:18;1163:2;1159;1156:10;1153:36;;;1169:18;;:::i;:::-;1244:2;1238:9;1212:2;1298:13;;-1:-1:-1;;1294:22:84;;;1318:2;1290:31;1286:40;1274:53;;;1342:18;;;1362:22;;;1339:46;1336:72;;;1388:18;;:::i;:::-;1428:10;1424:2;1417:22;1463:2;1455:6;1448:18;1509:3;1502:4;1497:2;1489:6;1485:15;1481:26;1478:35;1475:55;;;1526:1;1523;1516:12;1475:55;1590:2;1583:4;1575:6;1571:17;1564:4;1556:6;1552:17;1539:54;1637:1;1630:4;1625:2;1617:6;1613:15;1609:26;1602:37;1657:6;1648:15;;;;;;950:719;;;;:::o;1674:396::-;1752:6;1760;1813:2;1801:9;1792:7;1788:23;1784:32;1781:52;;;1829:1;1826;1819:12;1781:52;1852:29;1871:9;1852:29;:::i;:::-;1842:39;;1932:2;1921:9;1917:18;1904:32;1959:18;1951:6;1948:30;1945:50;;;1991:1;1988;1981:12;1945:50;2014;2056:7;2047:6;2036:9;2032:22;2014:50;:::i;:::-;2004:60;;;1674:396;;;;;:::o;2075:186::-;2134:6;2187:2;2175:9;2166:7;2162:23;2158:32;2155:52;;;2203:1;2200;2193:12;2155:52;2226:29;2245:9;2226:29;:::i;2266:127::-;2327:10;2322:3;2318:20;2315:1;2308:31;2358:4;2355:1;2348:15;2382:4;2379:1;2372:15;2398:238;2480:1;2473:5;2470:12;2460:143;;2525:10;2520:3;2516:20;2513:1;2506:31;2560:4;2557:1;2550:15;2588:4;2585:1;2578:15;2460:143;2612:18;;2398:238::o;2641:250::-;2726:1;2736:113;2750:6;2747:1;2744:13;2736:113;;;2826:11;;;2820:18;2807:11;;;2800:39;2772:2;2765:10;2736:113;;;-1:-1:-1;;2883:1:84;2865:16;;2858:27;2641:250::o;2896:271::-;2938:3;2976:5;2970:12;3003:6;2998:3;2991:19;3019:76;3088:6;3081:4;3076:3;3072:14;3065:4;3058:5;3054:16;3019:76;:::i;:::-;3149:2;3128:15;-1:-1:-1;;3124:29:84;3115:39;;;;3156:4;3111:50;;2896:271;-1:-1:-1;;2896:271:84:o;3172:506::-;3237:45;3278:3;3270:5;3264:12;3237:45;:::i;:::-;3219:3;3328:4;3321:5;3317:16;3311:23;3366:4;3359;3354:3;3350:14;3343:28;3392:47;3433:4;3428:3;3424:14;3410:12;3392:47;:::i;:::-;3487:4;3476:16;;;3470:23;-1:-1:-1;;;;;3563:23:84;;;3547:14;;;3540:47;;;;3640:4;3629:16;;;3623:23;3619:32;3603:14;;;;3596:56;;;;-1:-1:-1;3380:59:84;;3172:506;-1:-1:-1;3172:506:84:o;3683:249::-;3856:2;3845:9;3838:21;3819:4;3876:50;3922:2;3911:9;3907:18;3899:6;3876:50;:::i;3937:832::-;4123:4;4152:2;4192;4181:9;4177:18;4222:2;4211:9;4204:21;4245:6;4280;4274:13;4311:6;4303;4296:22;4349:2;4338:9;4334:18;4327:25;;4411:2;4401:6;4398:1;4394:14;4383:9;4379:30;4375:39;4361:53;;4449:2;4441:6;4437:15;4470:1;4480:260;4494:6;4491:1;4488:13;4480:260;;;4587:2;4583:7;4571:9;4563:6;4559:22;4555:36;4550:3;4543:49;4615:45;4653:6;4644;4638:13;4615:45;:::i;:::-;4605:55;-1:-1:-1;4718:12:84;;;;4683:15;;;;4516:1;4509:9;4480:260;;;-1:-1:-1;4757:6:84;;3937:832;-1:-1:-1;;;;;;;3937:832:84:o;4774:658::-;4945:2;4997:21;;;5067:13;;4970:18;;;5089:22;;;4916:4;;4945:2;5168:15;;;;5142:2;5127:18;;;4916:4;5211:195;5225:6;5222:1;5219:13;5211:195;;;5290:13;;-1:-1:-1;;;;;5286:39:84;5274:52;;5381:15;;;;5346:12;;;;5322:1;5240:9;5211:195;;;-1:-1:-1;5423:3:84;;4774:658;-1:-1:-1;;;;;;4774:658:84:o;5437:493::-;5539:6;5547;5555;5608:2;5596:9;5587:7;5583:23;5579:32;5576:52;;;5624:1;5621;5614:12;5576:52;5647:29;5666:9;5647:29;:::i;:::-;5637:39;;5727:2;5716:9;5712:18;5699:32;5754:18;5746:6;5743:30;5740:50;;;5786:1;5783;5776:12;5740:50;5809;5851:7;5842:6;5831:9;5827:22;5809:50;:::i;:::-;5799:60;;;5878:46;5920:2;5909:9;5905:18;5878:46;:::i;:::-;5868:56;;5437:493;;;;;:::o;5935:220::-;6084:2;6073:9;6066:21;6047:4;6104:45;6145:2;6134:9;6130:18;6122:6;6104:45;:::i;6160:210::-;6307:2;6292:18;;6319:45;6296:9;6346:6;6319:45;:::i;6375:289::-;6506:3;6544:6;6538:13;6560:66;6619:6;6614:3;6607:4;6599:6;6595:17;6560:66;:::i;:::-;6642:16;;;;;6375:289;-1:-1:-1;;6375:289:84:o;6669:380::-;6748:1;6744:12;;;;6791;;;6812:61;;6866:4;6858:6;6854:17;6844:27;;6812:61;6919:2;6911:6;6908:14;6888:18;6885:38;6882:161;;6965:10;6960:3;6956:20;6953:1;6946:31;7000:4;6997:1;6990:15;7028:4;7025:1;7018:15;7180:843;7308:3;7337:1;7370:6;7364:13;7400:36;7426:9;7400:36;:::i;:::-;7455:1;7472:17;;;7498:133;;;;7645:1;7640:358;;;;7465:533;;7498:133;-1:-1:-1;;7531:24:84;;7519:37;;7604:14;;7597:22;7585:35;;7576:45;;;-1:-1:-1;7498:133:84;;7640:358;7671:6;7668:1;7661:17;7701:4;7746;7743:1;7733:18;7773:1;7787:165;7801:6;7798:1;7795:13;7787:165;;;7879:14;;7866:11;;;7859:35;7922:16;;;;7816:10;;7787:165;;;7791:3;;;7981:6;7976:3;7972:16;7965:23;;7465:533;-1:-1:-1;8014:3:84;;7180:843;-1:-1:-1;;;;;;7180:843:84:o;8028:543::-;8130:2;8125:3;8122:11;8119:446;;;8166:1;8190:5;8187:1;8180:16;8234:4;8231:1;8221:18;8304:2;8292:10;8288:19;8285:1;8281:27;8275:4;8271:38;8340:4;8328:10;8325:20;8322:47;;;-1:-1:-1;8363:4:84;8322:47;8418:2;8413:3;8409:12;8406:1;8402:20;8396:4;8392:31;8382:41;;8473:82;8491:2;8484:5;8481:13;8473:82;;;8536:17;;;8517:1;8506:13;8473:82;;;8477:3;;;8119:446;8028:543;;;:::o;8747:1345::-;8873:3;8867:10;8900:18;8892:6;8889:30;8886:56;;;8922:18;;:::i;:::-;8951:97;9041:6;9001:38;9033:4;9027:11;9001:38;:::i;:::-;8995:4;8951:97;:::i;:::-;9103:4;;9160:2;9149:14;;9177:1;9172:663;;;;9879:1;9896:6;9893:89;;;-1:-1:-1;9948:19:84;;;9942:26;9893:89;-1:-1:-1;;8704:1:84;8700:11;;;8696:24;8692:29;8682:40;8728:1;8724:11;;;8679:57;9995:81;;9142:944;;9172:663;7127:1;7120:14;;;7164:4;7151:18;;-1:-1:-1;;9208:20:84;;;9326:236;9340:7;9337:1;9334:14;9326:236;;;9429:19;;;9423:26;9408:42;;9521:27;;;;9489:1;9477:14;;;;9356:19;;9326:236;;;9330:3;9590:6;9581:7;9578:19;9575:201;;;9651:19;;;9645:26;-1:-1:-1;;9734:1:84;9730:14;;;9746:3;9726:24;9722:37;9718:42;9703:58;9688:74;;9575:201;-1:-1:-1;;;;;9822:1:84;9806:14;;;9802:22;9789:36;;-1:-1:-1;8747:1345:84:o;10097:127::-;10158:10;10153:3;10149:20;10146:1;10139:31;10189:4;10186:1;10179:15;10213:4;10210:1;10203:15;10229:324;10419:2;10408:9;10401:21;10382:4;10439:45;10480:2;10469:9;10465:18;10457:6;10439:45;:::i;:::-;10431:53;;10493:54;10543:2;10532:9;10528:18;10520:6;10493:54;:::i;10558:225::-;10625:9;;;10646:11;;;10643:134;;;10699:10;10694:3;10690:20;10687:1;10680:31;10734:4;10731:1;10724:15;10762:4;10759:1;10752:15;10788:127;10849:10;10844:3;10840:20;10837:1;10830:31;10880:4;10877:1;10870:15;10904:4;10901:1;10894:15","linkReferences":{}},"methodIdentifiers":{"getAllNodeAddresses()":"c8fe3a01","getAllNodes()":"a1174e7d","getNode(address)":"9d209048","getNodeCount()":"39bf397e","registerNode(address,string,uint8)":"eecc66f4","removeNode(address)":"b2b99ec9","updateNodeStatus(address,uint8)":"581f8b9b","updateNodeUrl(address,string)":"7e4465e7"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"NodeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"NodeRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"NodeStatusUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"}],\"name\":\"NodeUrlUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"getAllNodeAddresses\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllNodes\",\"outputs\":[{\"components\":[{\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"internalType\":\"struct Node[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"getNode\",\"outputs\":[{\"components\":[{\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"internalType\":\"struct Node\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodeCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"registerNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"removeNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"updateNodeStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"}],\"name\":\"updateNodeUrl\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAllNodeAddresses()\":{\"details\":\"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.\"},\"getAllNodes()\":{\"details\":\"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAllNodeAddresses()\":{\"notice\":\"Return array containing all node addresses\"},\"getAllNodes()\":{\"notice\":\"Return array containing all nodes\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/river/registry/facets/node/NodeRegistry.sol\":\"NodeRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/river/registry/facets/node/INodeRegistry.sol\":{\"keccak256\":\"0x1f64f644ca9a6bfa00f2b4fe5242d7bf4a2410a3b0619e5f31813bf84d51f30a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://879e826a7772b560cfa439f2a352fbe378900ec4e8ab636b3f023e36f43b7fb5\",\"dweb:/ipfs/QmeVW4Kuji8B3p8D8NaruxBzQPutPMYiXxcMpfrvGFwjhZ\"]},\"contracts/src/river/registry/facets/node/NodeRegistry.sol\":{\"keccak256\":\"0x36153c58edd2ec86b4b5476955e7a4ab0f19332112179a8a28fdd10512b68a39\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6ef08c0ea25f34ed52a506be080bee1d260a2493f2762929032e6cce56d478d2\",\"dweb:/ipfs/QmZqXgxo5Vhi3E1SnWwXrGPPG83V4ggjH7eMbo687kkX4r\"]},\"contracts/src/river/registry/libraries/RegistryErrors.sol\":{\"keccak256\":\"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3\",\"dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy\"]},\"contracts/src/river/registry/libraries/RegistryStorage.sol\":{\"keccak256\":\"0x63c17d46ed41fb58a08d84b2159db6ab7a19a4e1e1e636129b7cdd5f3d83c51c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7633256f01d2ffea41292d8f0b259d6f33a61ef362026d649a3e6955f53eec4c\",\"dweb:/ipfs/QmSYCB6CWCjQMqVeSG7yqy72tr7SkPSRkfzpz6FnK33XqZ\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address","indexed":true},{"internalType":"string","name":"url","type":"string","indexed":false},{"internalType":"enum NodeStatus","name":"status","type":"uint8","indexed":false}],"type":"event","name":"NodeAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address","indexed":true}],"type":"event","name":"NodeRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address","indexed":true},{"internalType":"enum NodeStatus","name":"status","type":"uint8","indexed":false}],"type":"event","name":"NodeStatusUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address","indexed":true},{"internalType":"string","name":"url","type":"string","indexed":false}],"type":"event","name":"NodeUrlUpdated","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"getAllNodeAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getAllNodes","outputs":[{"internalType":"struct Node[]","name":"","type":"tuple[]","components":[{"internalType":"enum NodeStatus","name":"status","type":"uint8"},{"internalType":"string","name":"url","type":"string"},{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"address","name":"operator","type":"address"}]}]},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"view","type":"function","name":"getNode","outputs":[{"internalType":"struct Node","name":"","type":"tuple","components":[{"internalType":"enum NodeStatus","name":"status","type":"uint8"},{"internalType":"string","name":"url","type":"string"},{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"address","name":"operator","type":"address"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getNodeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"string","name":"url","type":"string"},{"internalType":"enum NodeStatus","name":"status","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"registerNode"},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeNode"},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"enum NodeStatus","name":"status","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"updateNodeStatus"},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"string","name":"url","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"updateNodeUrl"}],"devdoc":{"kind":"dev","methods":{"getAllNodeAddresses()":{"details":"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block."},"getAllNodes()":{"details":"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block."}},"version":1},"userdoc":{"kind":"user","methods":{"getAllNodeAddresses()":{"notice":"Return array containing all node addresses"},"getAllNodes()":{"notice":"Return array containing all nodes"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/river/registry/facets/node/NodeRegistry.sol":"NodeRegistry"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/river/registry/facets/node/INodeRegistry.sol":{"keccak256":"0x1f64f644ca9a6bfa00f2b4fe5242d7bf4a2410a3b0619e5f31813bf84d51f30a","urls":["bzz-raw://879e826a7772b560cfa439f2a352fbe378900ec4e8ab636b3f023e36f43b7fb5","dweb:/ipfs/QmeVW4Kuji8B3p8D8NaruxBzQPutPMYiXxcMpfrvGFwjhZ"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/node/NodeRegistry.sol":{"keccak256":"0x36153c58edd2ec86b4b5476955e7a4ab0f19332112179a8a28fdd10512b68a39","urls":["bzz-raw://6ef08c0ea25f34ed52a506be080bee1d260a2493f2762929032e6cce56d478d2","dweb:/ipfs/QmZqXgxo5Vhi3E1SnWwXrGPPG83V4ggjH7eMbo687kkX4r"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryErrors.sol":{"keccak256":"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc","urls":["bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3","dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryStorage.sol":{"keccak256":"0x63c17d46ed41fb58a08d84b2159db6ab7a19a4e1e1e636129b7cdd5f3d83c51c","urls":["bzz-raw://7633256f01d2ffea41292d8f0b259d6f33a61ef362026d649a3e6955f53eec4c","dweb:/ipfs/QmSYCB6CWCjQMqVeSG7yqy72tr7SkPSRkfzpz6FnK33XqZ"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":40} \ No newline at end of file diff --git a/packages/generated/dev/abis/NodeRegistry.metadata.json b/packages/generated/dev/abis/NodeRegistry.metadata.json new file mode 100644 index 000000000..212937a6d --- /dev/null +++ b/packages/generated/dev/abis/NodeRegistry.metadata.json @@ -0,0 +1,348 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "string", + "name": "url", + "type": "string", + "indexed": false + }, + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8", + "indexed": false + } + ], + "type": "event", + "name": "NodeAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "NodeRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8", + "indexed": false + } + ], + "type": "event", + "name": "NodeStatusUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "string", + "name": "url", + "type": "string", + "indexed": false + } + ], + "type": "event", + "name": "NodeUrlUpdated", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllNodeAddresses", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllNodes", + "outputs": [ + { + "internalType": "struct Node[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getNode", + "outputs": [ + { + "internalType": "struct Node", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getNodeCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + }, + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "registerNode" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeNode" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "updateNodeStatus" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "updateNodeUrl" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "getAllNodeAddresses()": { + "details": "WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block." + }, + "getAllNodes()": { + "details": "WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getAllNodeAddresses()": { + "notice": "Return array containing all node addresses" + }, + "getAllNodes()": { + "notice": "Return array containing all nodes" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/river/registry/facets/node/NodeRegistry.sol": "NodeRegistry" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/river/registry/facets/node/INodeRegistry.sol": { + "keccak256": "0x1f64f644ca9a6bfa00f2b4fe5242d7bf4a2410a3b0619e5f31813bf84d51f30a", + "urls": [ + "bzz-raw://879e826a7772b560cfa439f2a352fbe378900ec4e8ab636b3f023e36f43b7fb5", + "dweb:/ipfs/QmeVW4Kuji8B3p8D8NaruxBzQPutPMYiXxcMpfrvGFwjhZ" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/node/NodeRegistry.sol": { + "keccak256": "0x36153c58edd2ec86b4b5476955e7a4ab0f19332112179a8a28fdd10512b68a39", + "urls": [ + "bzz-raw://6ef08c0ea25f34ed52a506be080bee1d260a2493f2762929032e6cce56d478d2", + "dweb:/ipfs/QmZqXgxo5Vhi3E1SnWwXrGPPG83V4ggjH7eMbo687kkX4r" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryErrors.sol": { + "keccak256": "0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc", + "urls": [ + "bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3", + "dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryStorage.sol": { + "keccak256": "0x63c17d46ed41fb58a08d84b2159db6ab7a19a4e1e1e636129b7cdd5f3d83c51c", + "urls": [ + "bzz-raw://7633256f01d2ffea41292d8f0b259d6f33a61ef362026d649a3e6955f53eec4c", + "dweb:/ipfs/QmSYCB6CWCjQMqVeSG7yqy72tr7SkPSRkfzpz6FnK33XqZ" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/OperatorRegistry.abi.json b/packages/generated/dev/abis/OperatorRegistry.abi.json new file mode 100644 index 000000000..a42bd18fa --- /dev/null +++ b/packages/generated/dev/abis/OperatorRegistry.abi.json @@ -0,0 +1,180 @@ +[ + { + "type": "function", + "name": "__OperatorRegistry_init", + "inputs": [ + { + "name": "initialOperators", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approveOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorAdded", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorRemoved", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/OperatorRegistry.abi.ts b/packages/generated/dev/abis/OperatorRegistry.abi.ts new file mode 100644 index 000000000..35c946f60 --- /dev/null +++ b/packages/generated/dev/abis/OperatorRegistry.abi.ts @@ -0,0 +1,180 @@ +export default [ + { + "type": "function", + "name": "__OperatorRegistry_init", + "inputs": [ + { + "name": "initialOperators", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approveOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorAdded", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorRemoved", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/OperatorRegistry.bin b/packages/generated/dev/abis/OperatorRegistry.bin new file mode 100644 index 000000000..5e8c37798 --- /dev/null +++ b/packages/generated/dev/abis/OperatorRegistry.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b610705806100d36000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063242cae9f146100515780636d70f7ae14610066578063ac8a584a1461008d578063ba428b1a146100a0575b600080fd5b61006461005f3660046105cb565b6100b3565b005b6100796100743660046105cb565b610110565b604051901515815260200160405180910390f35b61006461009b3660046105cb565b610123565b6100646100ae3660046105f4565b610297565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b03163314610104576040516365f4906560e01b81523360048201526024015b60405180910390fd5b61010d81610328565b50565b600061011d6008836103fa565b92915050565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b0316331461016f576040516365f4906560e01b81523360048201526024016100fb565b61017a6008826103fa565b6101be57604080518082018252601281527113d41154905513d497d393d517d193d5539160721b6020820152905162461bcd60e51b81526100fb9190600401610669565b60005b6101cb600561041f565b811015610253576001600160a01b038216600760006101eb600585610429565b6001600160a01b039081168252602082019290925260400160002060030154160361024b57604080518082018252600d81526c4f55545f4f465f424f554e445360981b6020820152905162461bcd60e51b81526100fb9190600401610669565b6001016101c1565b5061025f600882610435565b506040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166102e157604051630ef4733760e31b815260040160405180910390fd5b60005b818110156103235761031b838383818110610301576103016106b8565b905060200201602081019061031691906105cb565b610328565b6001016102e4565b505050565b6001600160a01b03811661036b5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526100fb9190600401610669565b6103766008826103fa565b156103b757604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526100fb9190600401610669565b6103c260088261044a565b506040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b600061011d825490565b6000610418838361045f565b6000610418836001600160a01b038416610489565b6000610418836001600160a01b03841661057c565b6000826000018281548110610476576104766106b8565b9060005260206000200154905092915050565b600081815260018301602052604081205480156105725760006104ad6001836106ce565b85549091506000906104c1906001906106ce565b90508082146105265760008660000182815481106104e1576104e16106b8565b9060005260206000200154905080876000018481548110610504576105046106b8565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610537576105376106ef565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061011d565b600091505061011d565b60008181526001830160205260408120546105c35750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561011d565b50600061011d565b6000602082840312156105dd57600080fd5b81356001600160a01b038116811461041857600080fd5b6000806020838503121561060757600080fd5b823567ffffffffffffffff8082111561061f57600080fd5b818501915085601f83011261063357600080fd5b81358181111561064257600080fd5b8660208260051b850101111561065757600080fd5b60209290920196919550909350505050565b60006020808352835180602085015260005b818110156106975785810183015185820160400152820161067b565b506000604082860101526040601f19601f8301168501019250505092915050565b634e487b7160e01b600052603260045260246000fd5b8181038181111561011d57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd \ No newline at end of file diff --git a/packages/generated/dev/abis/OperatorRegistry.json b/packages/generated/dev/abis/OperatorRegistry.json new file mode 100644 index 000000000..d530e6c73 --- /dev/null +++ b/packages/generated/dev/abis/OperatorRegistry.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__OperatorRegistry_init","inputs":[{"name":"initialOperators","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"approveOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"removeOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"OperatorAdded","inputs":[{"name":"operatorAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OperatorRemoved","inputs":[{"name":"operatorAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b610705806100d36000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063242cae9f146100515780636d70f7ae14610066578063ac8a584a1461008d578063ba428b1a146100a0575b600080fd5b61006461005f3660046105cb565b6100b3565b005b6100796100743660046105cb565b610110565b604051901515815260200160405180910390f35b61006461009b3660046105cb565b610123565b6100646100ae3660046105f4565b610297565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b03163314610104576040516365f4906560e01b81523360048201526024015b60405180910390fd5b61010d81610328565b50565b600061011d6008836103fa565b92915050565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b0316331461016f576040516365f4906560e01b81523360048201526024016100fb565b61017a6008826103fa565b6101be57604080518082018252601281527113d41154905513d497d393d517d193d5539160721b6020820152905162461bcd60e51b81526100fb9190600401610669565b60005b6101cb600561041f565b811015610253576001600160a01b038216600760006101eb600585610429565b6001600160a01b039081168252602082019290925260400160002060030154160361024b57604080518082018252600d81526c4f55545f4f465f424f554e445360981b6020820152905162461bcd60e51b81526100fb9190600401610669565b6001016101c1565b5061025f600882610435565b506040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166102e157604051630ef4733760e31b815260040160405180910390fd5b60005b818110156103235761031b838383818110610301576103016106b8565b905060200201602081019061031691906105cb565b610328565b6001016102e4565b505050565b6001600160a01b03811661036b5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526100fb9190600401610669565b6103766008826103fa565b156103b757604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526100fb9190600401610669565b6103c260088261044a565b506040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b600061011d825490565b6000610418838361045f565b6000610418836001600160a01b038416610489565b6000610418836001600160a01b03841661057c565b6000826000018281548110610476576104766106b8565b9060005260206000200154905092915050565b600081815260018301602052604081205480156105725760006104ad6001836106ce565b85549091506000906104c1906001906106ce565b90508082146105265760008660000182815481106104e1576104e16106b8565b9060005260206000200154905080876000018481548110610504576105046106b8565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610537576105376106ef565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061011d565b600091505061011d565b60008181526001830160205260408120546105c35750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561011d565b50600061011d565b6000602082840312156105dd57600080fd5b81356001600160a01b038116811461041857600080fd5b6000806020838503121561060757600080fd5b823567ffffffffffffffff8082111561061f57600080fd5b818501915085601f83011261063357600080fd5b81358181111561064257600080fd5b8660208260051b850101111561065757600080fd5b60209290920196919550909350505050565b60006020808352835180602085015260005b818110156106975785810183015185820160400152820161067b565b506000604082860101526040601f19601f8301168501019250505092915050565b634e487b7160e01b600052603260045260246000fd5b8181038181111561011d57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd","sourceMap":"587:1740:42:-:0;;;;;;;;;;;;-1:-1:-1;385:22:16;:20;:22::i;:::-;587:1740:42;;1653:314:21;303:66:22;1779:14:21;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:21;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:21;1898:16;1886:28;;;;;1927:29;;158:42:84;;;1927:29:21;;146:2:84;131:18;1927:29:21;;;;;;;1844:119;1694:273;1653:314::o;14:192:84:-;587:1740:42;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063242cae9f146100515780636d70f7ae14610066578063ac8a584a1461008d578063ba428b1a146100a0575b600080fd5b61006461005f3660046105cb565b6100b3565b005b6100796100743660046105cb565b610110565b604051901515815260200160405180910390f35b61006461009b3660046105cb565b610123565b6100646100ae3660046105f4565b610297565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b03163314610104576040516365f4906560e01b81523360048201526024015b60405180910390fd5b61010d81610328565b50565b600061011d6008836103fa565b92915050565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b0316331461016f576040516365f4906560e01b81523360048201526024016100fb565b61017a6008826103fa565b6101be57604080518082018252601281527113d41154905513d497d393d517d193d5539160721b6020820152905162461bcd60e51b81526100fb9190600401610669565b60005b6101cb600561041f565b811015610253576001600160a01b038216600760006101eb600585610429565b6001600160a01b039081168252602082019290925260400160002060030154160361024b57604080518082018252600d81526c4f55545f4f465f424f554e445360981b6020820152905162461bcd60e51b81526100fb9190600401610669565b6001016101c1565b5061025f600882610435565b506040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166102e157604051630ef4733760e31b815260040160405180910390fd5b60005b818110156103235761031b838383818110610301576103016106b8565b905060200201602081019061031691906105cb565b610328565b6001016102e4565b505050565b6001600160a01b03811661036b5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526100fb9190600401610669565b6103766008826103fa565b156103b757604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526100fb9190600401610669565b6103c260088261044a565b506040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b600061011d825490565b6000610418838361045f565b6000610418836001600160a01b038416610489565b6000610418836001600160a01b03841661057c565b6000826000018281548110610476576104766106b8565b9060005260206000200154905092915050565b600081815260018301602052604081205480156105725760006104ad6001836106ce565b85549091506000906104c1906001906106ce565b90508082146105265760008660000182815481106104e1576104e16106b8565b9060005260206000200154905080876000018481548110610504576105046106b8565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610537576105376106ef565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061011d565b600091505061011d565b60008181526001830160205260408120546105c35750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561011d565b50600061011d565b6000602082840312156105dd57600080fd5b81356001600160a01b038116811461041857600080fd5b6000806020838503121561060757600080fd5b823567ffffffffffffffff8082111561061f57600080fd5b818501915085601f83011261063357600080fd5b81358181111561064257600080fd5b8660208260051b850101111561065757600080fd5b60209290920196919550909350505050565b60006020808352835180602085015260005b818110156106975785810183015185820160400152820161067b565b506000604082860101526040601f19601f8301168501019250505092915050565b634e487b7160e01b600052603260045260246000fd5b8181038181111561011d57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd","sourceMap":"587:1740:42:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1137:99;;;;;;:::i;:::-;;:::i;:::-;;1240:116;;;;;;:::i;:::-;;:::i;:::-;;;470:14:84;;463:22;445:41;;433:2;418:18;1240:116:42;;;;;;;1360:466;;;;;;:::i;:::-;;:::i;738:220::-;;;;;;:::i;:::-;;:::i;1137:99::-;291:66:33;445:29:31;-1:-1:-1;;;;;445:29:31;286:10;:22;282:79;;325:29;;-1:-1:-1;;;325:29:31;;343:10;325:29;;;1263:51:84;1236:18;;325:29:31;;;;;;;;282:79;1205:26:42::1;1222:8;1205:16;:26::i;:::-;1137:99:::0;:::o;1240:116::-;1301:4;1320:31;:12;1342:8;1320:21;:31::i;:::-;1313:38;1240:116;-1:-1:-1;;1240:116:42:o;1360:466::-;291:66:33;445:29:31;-1:-1:-1;;;;;445:29:31;286:10;:22;282:79;;325:29;;-1:-1:-1;;;325:29:31;;343:10;325:29;;;1263:51:84;1236:18;;325:29:31;1117:203:84;282:79:31;1432:31:42::1;:12;1454:8:::0;1432:21:::1;:31::i;:::-;1427:90;;1478:38;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1478:38:42::1;::::0;::::1;::::0;1471:46;;-1:-1:-1;;;1471:46:42;;::::1;::::0;1478:38;1471:46:::1;;;:::i;1427:90::-;1583:9;1578:171;1602:17;:8;:15;:17::i;:::-;1598:1;:21;1578:171;;;-1:-1:-1::0;;;;;1638:53:42;::::1;:16;:2;1655:14;:8;1667:1:::0;1655:11:::1;:14::i;:::-;-1:-1:-1::0;;;;;1638:32:42;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;1638:32:42;:41:::1;;::::0;::::1;:53:::0;1634:108:::1;;1708:33;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1708:33:42::1;::::0;::::1;::::0;1701:41;;-1:-1:-1;;;1701:41:42;;::::1;::::0;1708:33;1701:41:::1;;;:::i;1634:108::-;1621:3;;1578:171;;;-1:-1:-1::0;1755:29:42::1;:12;1775:8:::0;1755:19:::1;:29::i;:::-;-1:-1:-1::0;1796:25:42::1;::::0;-1:-1:-1;;;;;1796:25:42;::::1;::::0;::::1;::::0;;;::::1;1360:466:::0;:::o;738:220::-;303:66:22;1263:42:21;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:21;;;;;;;;;;;1258:100;853:9:42::1;848:106;868:27:::0;;::::1;848:106;;;910:37;927:16;;944:1;927:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;910:16;:37::i;:::-;897:3;;848:106;;;;738:220:::0;;:::o;2005:320::-;-1:-1:-1;;;;;2101:22:42;;2097:63;;2132:27;;;;;;;;;;;-1:-1:-1;;;2132:27:42;;;;2125:35;;-1:-1:-1;;;2125:35:42;;;;2132:27;2125:35;;;:::i;2097:63::-;2171:31;:12;2193:8;2171:21;:31::i;:::-;2167:85;;;2217:34;;;;;;;;;;;-1:-1:-1;;;2217:34:42;;;;2210:42;;-1:-1:-1;;;2210:42:42;;;;2217:34;2210:42;;;:::i;2167:85::-;2259:26;:12;2276:8;2259:16;:26::i;:::-;-1:-1:-1;2297:23:42;;-1:-1:-1;;;;;2297:23:42;;;;;;;;2005:320;:::o;8871:165:61:-;-1:-1:-1;;;;;9004:23:61;;8951:4;4360:21;;;:14;;;:21;;;;;;:26;;8974:55;8967:62;8871:165;-1:-1:-1;;;8871:165:61:o;9117:115::-;9180:7;9206:19;9214:3;4556:18;;4474:107;9574:156;9648:7;9698:22;9702:3;9714:5;9698:3;:22::i;8634:156::-;8707:4;8730:53;8738:3;-1:-1:-1;;;;;8758:23:61;;8730:7;:53::i;8316:150::-;8386:4;8409:50;8414:3;-1:-1:-1;;;;;8434:23:61;;8409:4;:50::i;4923:118::-;4990:7;5016:3;:11;;5028:5;5016:18;;;;;;;;:::i;:::-;;;;;;;;;5009:25;;4923:118;;;;:::o;2815:1368::-;2881:4;3010:21;;;:14;;;:21;;;;;;3046:13;;3042:1135;;3413:18;3434:12;3445:1;3434:8;:12;:::i;:::-;3480:18;;3413:33;;-1:-1:-1;3460:17:61;;3480:22;;3501:1;;3480:22;:::i;:::-;3460:42;;3535:9;3521:10;:23;3517:378;;3564:17;3584:3;:11;;3596:9;3584:22;;;;;;;;:::i;:::-;;;;;;;;;3564:42;;3731:9;3705:3;:11;;3717:10;3705:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;3844:25;;;:14;;;:25;;;;;:36;;;3517:378;3973:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4076:3;:14;;:21;4091:5;4076:21;;;;;;;;;;;4069:28;;;4119:4;4112:11;;;;;;;3042:1135;4161:5;4154:12;;;;;2241:406;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:61;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:61;2618:12;;14:286:84;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;168:23;;-1:-1:-1;;;;;220:31:84;;210:42;;200:70;;266:1;263;256:12;497:615;583:6;591;644:2;632:9;623:7;619:23;615:32;612:52;;;660:1;657;650:12;612:52;700:9;687:23;729:18;770:2;762:6;759:14;756:34;;;786:1;783;776:12;756:34;824:6;813:9;809:22;799:32;;869:7;862:4;858:2;854:13;850:27;840:55;;891:1;888;881:12;840:55;931:2;918:16;957:2;949:6;946:14;943:34;;;973:1;970;963:12;943:34;1026:7;1021:2;1011:6;1008:1;1004:14;1000:2;996:23;992:32;989:45;986:65;;;1047:1;1044;1037:12;986:65;1078:2;1070:11;;;;;1100:6;;-1:-1:-1;497:615:84;;-1:-1:-1;;;;497:615:84:o;1325:548::-;1437:4;1466:2;1495;1484:9;1477:21;1527:6;1521:13;1570:6;1565:2;1554:9;1550:18;1543:34;1595:1;1605:140;1619:6;1616:1;1613:13;1605:140;;;1714:14;;;1710:23;;1704:30;1680:17;;;1699:2;1676:26;1669:66;1634:10;;1605:140;;;1609:3;1794:1;1789:2;1780:6;1769:9;1765:22;1761:31;1754:42;1864:2;1857;1853:7;1848:2;1840:6;1836:15;1832:29;1821:9;1817:45;1813:54;1805:62;;;;1325:548;;;;:::o;1878:127::-;1939:10;1934:3;1930:20;1927:1;1920:31;1970:4;1967:1;1960:15;1994:4;1991:1;1984:15;2010:225;2077:9;;;2098:11;;;2095:134;;;2151:10;2146:3;2142:20;2139:1;2132:31;2186:4;2183:1;2176:15;2214:4;2211:1;2204:15;2240:127;2301:10;2296:3;2292:20;2289:1;2282:31;2332:4;2329:1;2322:15;2356:4;2353:1;2346:15","linkReferences":{}},"methodIdentifiers":{"__OperatorRegistry_init(address[])":"ba428b1a","approveOperator(address)":"242cae9f","isOperator(address)":"6d70f7ae","removeOperator(address)":"ac8a584a"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operatorAddress\",\"type\":\"address\"}],\"name\":\"OperatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operatorAddress\",\"type\":\"address\"}],\"name\":\"OperatorRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"initialOperators\",\"type\":\"address[]\"}],\"name\":\"__OperatorRegistry_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"approveOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isOperator\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"removeOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/river/registry/facets/operator/OperatorRegistry.sol\":\"OperatorRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/OwnableBase.sol\":{\"keccak256\":\"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4\",\"dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa\"]},\"contracts/src/diamond/facets/ownable/OwnableStorage.sol\":{\"keccak256\":\"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105\",\"dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ\"]},\"contracts/src/river/registry/facets/operator/IOperatorRegistry.sol\":{\"keccak256\":\"0xf0dbf037e3ebc65945ce4e24e16ff8126e96dbc30174059b693a75e9b8213672\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://44c0fa0d32854421ba0d1a9041b0124504d3c9cb4da4d8c4bb77a69645350b10\",\"dweb:/ipfs/QmNUtMBujetyWHo87mSAvkgLRBjEgQwsrpoMdST8LPm6Zb\"]},\"contracts/src/river/registry/facets/operator/OperatorRegistry.sol\":{\"keccak256\":\"0xe4b80ab4faaaf470a46907bbbe9a02783eff94492c4ba9a9d5f681af54bbadff\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b9aa3f826f53fdb824e9f686486efdbcdc9231ca67da5954a33bdbf0f1bc123\",\"dweb:/ipfs/QmaLSPnRmeJPaNSd8RdTA5uyxUfxa8owNnRe2cZvw4W5YP\"]},\"contracts/src/river/registry/libraries/RegistryErrors.sol\":{\"keccak256\":\"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3\",\"dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy\"]},\"contracts/src/river/registry/libraries/RegistryStorage.sol\":{\"keccak256\":\"0x63c17d46ed41fb58a08d84b2159db6ab7a19a4e1e1e636129b7cdd5f3d83c51c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7633256f01d2ffea41292d8f0b259d6f33a61ef362026d649a3e6955f53eec4c\",\"dweb:/ipfs/QmSYCB6CWCjQMqVeSG7yqy72tr7SkPSRkfzpz6FnK33XqZ\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"operatorAddress","type":"address","indexed":true}],"type":"event","name":"OperatorAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"operatorAddress","type":"address","indexed":true}],"type":"event","name":"OperatorRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address[]","name":"initialOperators","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"__OperatorRegistry_init"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"approveOperator"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeOperator"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/river/registry/facets/operator/OperatorRegistry.sol":"OperatorRegistry"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableBase.sol":{"keccak256":"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762","urls":["bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4","dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableStorage.sol":{"keccak256":"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64","urls":["bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105","dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/operator/IOperatorRegistry.sol":{"keccak256":"0xf0dbf037e3ebc65945ce4e24e16ff8126e96dbc30174059b693a75e9b8213672","urls":["bzz-raw://44c0fa0d32854421ba0d1a9041b0124504d3c9cb4da4d8c4bb77a69645350b10","dweb:/ipfs/QmNUtMBujetyWHo87mSAvkgLRBjEgQwsrpoMdST8LPm6Zb"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/operator/OperatorRegistry.sol":{"keccak256":"0xe4b80ab4faaaf470a46907bbbe9a02783eff94492c4ba9a9d5f681af54bbadff","urls":["bzz-raw://1b9aa3f826f53fdb824e9f686486efdbcdc9231ca67da5954a33bdbf0f1bc123","dweb:/ipfs/QmaLSPnRmeJPaNSd8RdTA5uyxUfxa8owNnRe2cZvw4W5YP"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryErrors.sol":{"keccak256":"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc","urls":["bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3","dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryStorage.sol":{"keccak256":"0x63c17d46ed41fb58a08d84b2159db6ab7a19a4e1e1e636129b7cdd5f3d83c51c","urls":["bzz-raw://7633256f01d2ffea41292d8f0b259d6f33a61ef362026d649a3e6955f53eec4c","dweb:/ipfs/QmSYCB6CWCjQMqVeSG7yqy72tr7SkPSRkfzpz6FnK33XqZ"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":42} \ No newline at end of file diff --git a/packages/generated/dev/abis/OperatorRegistry.metadata.json b/packages/generated/dev/abis/OperatorRegistry.metadata.json new file mode 100644 index 000000000..fde4f4c3a --- /dev/null +++ b/packages/generated/dev/abis/OperatorRegistry.metadata.json @@ -0,0 +1,351 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operatorAddress", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OperatorAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operatorAddress", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OperatorRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "initialOperators", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__OperatorRegistry_init" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "approveOperator" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isOperator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeOperator" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/river/registry/facets/operator/OperatorRegistry.sol": "OperatorRegistry" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableBase.sol": { + "keccak256": "0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762", + "urls": [ + "bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4", + "dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableStorage.sol": { + "keccak256": "0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64", + "urls": [ + "bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105", + "dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/operator/IOperatorRegistry.sol": { + "keccak256": "0xf0dbf037e3ebc65945ce4e24e16ff8126e96dbc30174059b693a75e9b8213672", + "urls": [ + "bzz-raw://44c0fa0d32854421ba0d1a9041b0124504d3c9cb4da4d8c4bb77a69645350b10", + "dweb:/ipfs/QmNUtMBujetyWHo87mSAvkgLRBjEgQwsrpoMdST8LPm6Zb" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/operator/OperatorRegistry.sol": { + "keccak256": "0xe4b80ab4faaaf470a46907bbbe9a02783eff94492c4ba9a9d5f681af54bbadff", + "urls": [ + "bzz-raw://1b9aa3f826f53fdb824e9f686486efdbcdc9231ca67da5954a33bdbf0f1bc123", + "dweb:/ipfs/QmaLSPnRmeJPaNSd8RdTA5uyxUfxa8owNnRe2cZvw4W5YP" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryErrors.sol": { + "keccak256": "0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc", + "urls": [ + "bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3", + "dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryStorage.sol": { + "keccak256": "0x63c17d46ed41fb58a08d84b2159db6ab7a19a4e1e1e636129b7cdd5f3d83c51c", + "urls": [ + "bzz-raw://7633256f01d2ffea41292d8f0b259d6f33a61ef362026d649a3e6955f53eec4c", + "dweb:/ipfs/QmSYCB6CWCjQMqVeSG7yqy72tr7SkPSRkfzpz6FnK33XqZ" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/OwnableFacet.abi.json b/packages/generated/dev/abis/OwnableFacet.abi.json new file mode 100644 index 000000000..0cf44446d --- /dev/null +++ b/packages/generated/dev/abis/OwnableFacet.abi.json @@ -0,0 +1,135 @@ +[ + { + "type": "function", + "name": "__Ownable_init", + "inputs": [ + { + "name": "owner_", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/OwnableFacet.abi.ts b/packages/generated/dev/abis/OwnableFacet.abi.ts new file mode 100644 index 000000000..6e2c5e89c --- /dev/null +++ b/packages/generated/dev/abis/OwnableFacet.abi.ts @@ -0,0 +1,135 @@ +export default [ + { + "type": "function", + "name": "__Ownable_init", + "inputs": [ + { + "name": "owner_", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/OwnableFacet.bin b/packages/generated/dev/abis/OwnableFacet.bin new file mode 100644 index 000000000..209c6398b --- /dev/null +++ b/packages/generated/dev/abis/OwnableFacet.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b610337806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80638da5cb5b14610046578063d78f00211461006a578063f2fde38b1461007f575b600080fd5b61004e610092565b6040516001600160a01b03909116815260200160405180910390f35b61007d610078366004610307565b6100a1565b005b61007d61008d366004610307565b6100f7565b600061009c61013f565b905090565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166100eb57604051630ef4733760e31b815260040160405180910390fd5b6100f48161016d565b50565b6100ff61013f565b6001600160a01b0316336001600160a01b031614610136576040516365f4906560e01b815233600482015260240160405180910390fd5b6100f481610186565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b61017681610186565b6100f46307f5828d60e41b610229565b600061019061013f565b90506001600160a01b0382166101b957604051634e3ef82560e01b815260040160405180910390fd5b817f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae30080546001600160a01b0319166001600160a01b03928316179055604051838216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146102b6576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff191660011790556102cf565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006020828403121561031957600080fd5b81356001600160a01b038116811461033057600080fd5b939250505056 \ No newline at end of file diff --git a/packages/generated/dev/abis/OwnableFacet.json b/packages/generated/dev/abis/OwnableFacet.json new file mode 100644 index 000000000..a228bc0c3 --- /dev/null +++ b/packages/generated/dev/abis/OwnableFacet.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__Ownable_init","inputs":[{"name":"owner_","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b610337806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80638da5cb5b14610046578063d78f00211461006a578063f2fde38b1461007f575b600080fd5b61004e610092565b6040516001600160a01b03909116815260200160405180910390f35b61007d610078366004610307565b6100a1565b005b61007d61008d366004610307565b6100f7565b600061009c61013f565b905090565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166100eb57604051630ef4733760e31b815260040160405180910390fd5b6100f48161016d565b50565b6100ff61013f565b6001600160a01b0316336001600160a01b031614610136576040516365f4906560e01b815233600482015260240160405180910390fd5b6100f481610186565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b61017681610186565b6100f46307f5828d60e41b610229565b600061019061013f565b90506001600160a01b0382166101b957604051634e3ef82560e01b815260040160405180910390fd5b817f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae30080546001600160a01b0319166001600160a01b03928316179055604051838216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146102b6576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff191660011790556102cf565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006020828403121561031957600080fd5b81356001600160a01b038116811461033057600080fd5b939250505056","sourceMap":"291:552:98:-:0;;;;;;;;;;;;-1:-1:-1;385:22:71;:20;:22::i;:::-;291:552:98;;1653:314:85;303:66:86;1779:14:85;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:85;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:85;1898:16;1886:28;;;;;1927:29;;158:42:516;;;1927:29:85;;146:2:516;131:18;1927:29:85;;;;;;;1844:119;1694:273;1653:314::o;14:192:516:-;291:552:98;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100415760003560e01c80638da5cb5b14610046578063d78f00211461006a578063f2fde38b1461007f575b600080fd5b61004e610092565b6040516001600160a01b03909116815260200160405180910390f35b61007d610078366004610307565b6100a1565b005b61007d61008d366004610307565b6100f7565b600061009c61013f565b905090565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166100eb57604051630ef4733760e31b815260040160405180910390fd5b6100f48161016d565b50565b6100ff61013f565b6001600160a01b0316336001600160a01b031614610136576040516365f4906560e01b815233600482015260240160405180910390fd5b6100f481610186565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b61017681610186565b6100f46307f5828d60e41b610229565b600061019061013f565b90506001600160a01b0382166101b957604051634e3ef82560e01b815260040160405180910390fd5b817f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae30080546001600160a01b0319166001600160a01b03928316179055604051838216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146102b6576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff191660011790556102cf565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006020828403121561031957600080fd5b81356001600160a01b038116811461033057600080fd5b939250505056","sourceMap":"291:552:98:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;633:75;;;:::i;:::-;;;-1:-1:-1;;;;;178:32:516;;;160:51;;148:2;133:18;633:75:98;;;;;;;348:109;;;;;;:::i;:::-;;:::i;:::-;;738:103;;;;;;:::i;:::-;;:::i;633:75::-;673:7;695:8;:6;:8::i;:::-;688:15;;633:75;:::o;348:109::-;303:66:86;1263:42:85;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:85;;;;;;;;;;;1258:100;420:32:98::1;445:6;420:24;:32::i;:::-;348:109:::0;:::o;738:103::-;300:8:97;:6;:8::i;:::-;-1:-1:-1;;;;;286:22:97;:10;-1:-1:-1;;;;;286:22:97;;282:79;;325:29;;-1:-1:-1;;;325:29:97;;343:10;325:29;;;160:51:516;133:18;;325:29:97;;;;;;;282:79;808:28:98::1;827:8;808:18;:28::i;376:103:97:-:0;291:66:99;445:29:97;-1:-1:-1;;;;;445:29:97;;376:103::o;461:142:98:-;526:26;545:6;526:18;:26::i;:::-;558:40;-1:-1:-1;;;558:13:98;:40::i;483:253:97:-;544:16;563:8;:6;:8::i;:::-;544:27;-1:-1:-1;;;;;;581:22:97;;577:57;;612:22;;-1:-1:-1;;;612:22:97;;;;;;;;;;;577:57;672:8;291:66:99;640:40:97;;-1:-1:-1;;;;;;640:40:97;-1:-1:-1;;;;;640:40:97;;;;;;691;;;;;;;;;;;-1:-1:-1;;691:40:97;538:198;483:253;:::o;452:282:88:-;-1:-1:-1;;;;;;1121:62:88;;1096:4;1121:62;;;303:66:90;1121:62:88;;;;;;;;:70;;:62;:70;510:182;;-1:-1:-1;;;;;;556:62:88;;:49;:62;;;303:66:90;556:62:88;;;;;:69;;-1:-1:-1;;556:69:88;621:4;556:69;;;510:182;;;653:32;;-1:-1:-1;;;653:32:88;;;;;;;;;;;510:182;702:27;;-1:-1:-1;;;;;;702:27:88;;;;;;;;452:282;:::o;222:286:516:-;281:6;334:2;322:9;313:7;309:23;305:32;302:52;;;350:1;347;340:12;302:52;376:23;;-1:-1:-1;;;;;428:31:516;;418:42;;408:70;;474:1;471;464:12;408:70;497:5;222:286;-1:-1:-1;;;222:286:516:o","linkReferences":{}},"methodIdentifiers":{"__Ownable_init(address)":"d78f0021","owner()":"8da5cb5b","transferOwnership(address)":"f2fde38b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner_\",\"type\":\"address\"}],\"name\":\"__Ownable_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"}},\"kind\":\"dev\",\"methods\":{\"owner()\":{\"returns\":{\"_0\":\"The address of the owner.\"}},\"transferOwnership(address)\":{\"details\":\"Set _newOwner to address(0) to renounce any ownership.\",\"params\":{\"_newOwner\":\"The address of the new owner of the contract\"}}},\"version\":1},\"userdoc\":{\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{\"owner()\":{\"notice\":\"Get the address of the owner\"},\"transferOwnership(address)\":{\"notice\":\"Set the address of the new owner of the contract\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/diamond/facets/ownable/OwnableFacet.sol\":\"OwnableFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/OwnableBase.sol\":{\"keccak256\":\"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4\",\"dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa\"]},\"contracts/src/diamond/facets/ownable/OwnableFacet.sol\":{\"keccak256\":\"0x0ee318837fcec7bd0fb366b83076a4f8982c0085f10a3a554ccd688e608e124c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3d8321720036af122a01b085289e3a74f4c5970bc041d746fa8784da82978278\",\"dweb:/ipfs/QmWVkNkhm4UyD3yC4sT3MxECi3NzG7jouxSaXoSveEEKyF\"]},\"contracts/src/diamond/facets/ownable/OwnableStorage.sol\":{\"keccak256\":\"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105\",\"dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"__Ownable_init"},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"}],"devdoc":{"kind":"dev","methods":{"owner()":{"returns":{"_0":"The address of the owner."}},"transferOwnership(address)":{"details":"Set _newOwner to address(0) to renounce any ownership.","params":{"_newOwner":"The address of the new owner of the contract"}}},"version":1},"userdoc":{"kind":"user","methods":{"owner()":{"notice":"Get the address of the owner"},"transferOwnership(address)":{"notice":"Set the address of the new owner of the contract"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/diamond/facets/ownable/OwnableFacet.sol":"OwnableFacet"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableBase.sol":{"keccak256":"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762","urls":["bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4","dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableFacet.sol":{"keccak256":"0x0ee318837fcec7bd0fb366b83076a4f8982c0085f10a3a554ccd688e608e124c","urls":["bzz-raw://3d8321720036af122a01b085289e3a74f4c5970bc041d746fa8784da82978278","dweb:/ipfs/QmWVkNkhm4UyD3yC4sT3MxECi3NzG7jouxSaXoSveEEKyF"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableStorage.sol":{"keccak256":"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64","urls":["bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105","dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"}},"version":1},"id":98} \ No newline at end of file diff --git a/packages/generated/dev/abis/OwnableFacet.metadata.json b/packages/generated/dev/abis/OwnableFacet.metadata.json new file mode 100644 index 000000000..f73404987 --- /dev/null +++ b/packages/generated/dev/abis/OwnableFacet.metadata.json @@ -0,0 +1,294 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__Ownable_init" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "transferOwnership" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "owner()": { + "returns": { + "_0": "The address of the owner." + } + }, + "transferOwnership(address)": { + "details": "Set _newOwner to address(0) to renounce any ownership.", + "params": { + "_newOwner": "The address of the new owner of the contract" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "owner()": { + "notice": "Get the address of the owner" + }, + "transferOwnership(address)": { + "notice": "Set the address of the new owner of the contract" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/diamond/facets/ownable/OwnableFacet.sol": "OwnableFacet" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableBase.sol": { + "keccak256": "0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762", + "urls": [ + "bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4", + "dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableFacet.sol": { + "keccak256": "0x0ee318837fcec7bd0fb366b83076a4f8982c0085f10a3a554ccd688e608e124c", + "urls": [ + "bzz-raw://3d8321720036af122a01b085289e3a74f4c5970bc041d746fa8784da82978278", + "dweb:/ipfs/QmWVkNkhm4UyD3yC4sT3MxECi3NzG7jouxSaXoSveEEKyF" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableStorage.sol": { + "keccak256": "0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64", + "urls": [ + "bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105", + "dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/PrepayFacet.abi.json b/packages/generated/dev/abis/PrepayFacet.abi.json new file mode 100644 index 000000000..fc7ba5cdc --- /dev/null +++ b/packages/generated/dev/abis/PrepayFacet.abi.json @@ -0,0 +1,248 @@ +[ + { + "type": "function", + "name": "__PrepayFacet_init", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "calculateMembershipPrepayFee", + "inputs": [ + { + "name": "supply", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "prepaidMembershipSupply", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "prepayMembership", + "inputs": [ + { + "name": "membership", + "type": "address", + "internalType": "address" + }, + { + "name": "supply", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformFeeRecipientSet", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformMembershipBpsSet", + "inputs": [ + { + "name": "bps", + "type": "uint16", + "indexed": false, + "internalType": "uint16" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformMembershipDurationSet", + "inputs": [ + { + "name": "duration", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformMembershipFeeSet", + "inputs": [ + { + "name": "fee", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformMembershipMintLimitSet", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PrepayBase__Prepaid", + "inputs": [ + { + "name": "membership", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "supply", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Platform__InvalidFeeRecipient", + "inputs": [] + }, + { + "type": "error", + "name": "Platform__InvalidMembershipBps", + "inputs": [] + }, + { + "type": "error", + "name": "Platform__InvalidMembershipDuration", + "inputs": [] + }, + { + "type": "error", + "name": "Platform__InvalidMembershipMintLimit", + "inputs": [] + }, + { + "type": "error", + "name": "PrepayBase__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "PrepayBase__InvalidAmount", + "inputs": [] + }, + { + "type": "error", + "name": "PrepayBase__InvalidMembership", + "inputs": [] + }, + { + "type": "error", + "name": "ReentrancyGuard__ReentrantCall", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/PrepayFacet.abi.ts b/packages/generated/dev/abis/PrepayFacet.abi.ts new file mode 100644 index 000000000..3220f54fb --- /dev/null +++ b/packages/generated/dev/abis/PrepayFacet.abi.ts @@ -0,0 +1,248 @@ +export default [ + { + "type": "function", + "name": "__PrepayFacet_init", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "calculateMembershipPrepayFee", + "inputs": [ + { + "name": "supply", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "prepaidMembershipSupply", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "prepayMembership", + "inputs": [ + { + "name": "membership", + "type": "address", + "internalType": "address" + }, + { + "name": "supply", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformFeeRecipientSet", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformMembershipBpsSet", + "inputs": [ + { + "name": "bps", + "type": "uint16", + "indexed": false, + "internalType": "uint16" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformMembershipDurationSet", + "inputs": [ + { + "name": "duration", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformMembershipFeeSet", + "inputs": [ + { + "name": "fee", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformMembershipMintLimitSet", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PrepayBase__Prepaid", + "inputs": [ + { + "name": "membership", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "supply", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Platform__InvalidFeeRecipient", + "inputs": [] + }, + { + "type": "error", + "name": "Platform__InvalidMembershipBps", + "inputs": [] + }, + { + "type": "error", + "name": "Platform__InvalidMembershipDuration", + "inputs": [] + }, + { + "type": "error", + "name": "Platform__InvalidMembershipMintLimit", + "inputs": [] + }, + { + "type": "error", + "name": "PrepayBase__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "PrepayBase__InvalidAmount", + "inputs": [] + }, + { + "type": "error", + "name": "PrepayBase__InvalidMembership", + "inputs": [] + }, + { + "type": "error", + "name": "ReentrancyGuard__ReentrantCall", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/PrepayFacet.bin b/packages/generated/dev/abis/PrepayFacet.bin new file mode 100644 index 000000000..5853c8e22 --- /dev/null +++ b/packages/generated/dev/abis/PrepayFacet.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6107a5806100d36000396000f3fe60806040526004361061003f5760003560e01c806327bc79f11461004457806386272406146100765780639262b1b31461008b578063aabe967d146100ab575b600080fd5b34801561005057600080fd5b5061006461005f36600461068c565b6100c0565b60405190815260200160405180910390f35b6100896100843660046106bd565b6100d1565b005b34801561009757600080fd5b506100646100a63660046106e9565b6103bb565b3480156100b757600080fd5b506100896103f8565b60006100cb82610454565b92915050565b60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a00540361011357604051635db5c7cd60e11b815260040160405180910390fd5b61013c60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b8060000361015d57604051632484b54d60e01b815260040160405180910390fd5b6001600160a01b03821661018457604051631ea9dac160e21b815260040160405180910390fd5b6040516301ffc9a760e01b815263421fb7a760e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa1580156101cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f3919061070d565b6102105760405163b2c5c0f360e01b815260040160405180910390fd5b336001600160a01b0316826001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610258573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027c919061072f565b6001600160a01b0316146102a357604051631ea9dac160e21b815260040160405180910390fd5b60006102d67fb29a817dd0719f30ad87abc8dff26e6354077e5b46bf38f34d5ac48732860d02546001600160a01b031690565b905060006102e383610454565b90508034101561030657604051632484b54d60e01b815260040160405180910390fd5b600083856001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036b919061074c565b610375919061077b565b90506103818582610488565b61038b8383610502565b5050506103b760017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b5050565b6001600160a01b03811660009081527f097b4f25b64e012d0cf55f67e9b34fe5d57f15b11b95baa4ddd136b424967c0060205260408120546100cb565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661044257604051630ef4733760e31b815260040160405180910390fd5b610452630cfe7b1160e21b6105ae565b565b600061047e7fb29a817dd0719f30ad87abc8dff26e6354077e5b46bf38f34d5ac48732860d005490565b6100cb908361078e565b60007f097b4f25b64e012d0cf55f67e9b34fe5d57f15b11b95baa4ddd136b424967c006001600160a01b03841660008181526020838152604091829020869055905185815292935090917f884527d8d797310d66e571e2a24daeddc15ae52474ef2c763ab29b60c5678369910160405180910390a2505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461054f576040519150601f19603f3d011682016040523d82523d6000602084013e610554565b606091505b50509050806105a95760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c656400000000604482015260640160405180910390fd5b505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff16151560011461063b576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610654565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006020828403121561069e57600080fd5b5035919050565b6001600160a01b03811681146106ba57600080fd5b50565b600080604083850312156106d057600080fd5b82356106db816106a5565b946020939093013593505050565b6000602082840312156106fb57600080fd5b8135610706816106a5565b9392505050565b60006020828403121561071f57600080fd5b8151801515811461070657600080fd5b60006020828403121561074157600080fd5b8151610706816106a5565b60006020828403121561075e57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156100cb576100cb610765565b80820281158282048414176100cb576100cb61076556 \ No newline at end of file diff --git a/packages/generated/dev/abis/PrepayFacet.json b/packages/generated/dev/abis/PrepayFacet.json new file mode 100644 index 000000000..e06bb4554 --- /dev/null +++ b/packages/generated/dev/abis/PrepayFacet.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__PrepayFacet_init","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"calculateMembershipPrepayFee","inputs":[{"name":"supply","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"prepaidMembershipSupply","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"prepayMembership","inputs":[{"name":"membership","type":"address","internalType":"address"},{"name":"supply","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"PlatformFeeRecipientSet","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"PlatformMembershipBpsSet","inputs":[{"name":"bps","type":"uint16","indexed":false,"internalType":"uint16"}],"anonymous":false},{"type":"event","name":"PlatformMembershipDurationSet","inputs":[{"name":"duration","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"PlatformMembershipFeeSet","inputs":[{"name":"fee","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"PlatformMembershipMintLimitSet","inputs":[{"name":"limit","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"PrepayBase__Prepaid","inputs":[{"name":"membership","type":"address","indexed":true,"internalType":"address"},{"name":"supply","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"Platform__InvalidFeeRecipient","inputs":[]},{"type":"error","name":"Platform__InvalidMembershipBps","inputs":[]},{"type":"error","name":"Platform__InvalidMembershipDuration","inputs":[]},{"type":"error","name":"Platform__InvalidMembershipMintLimit","inputs":[]},{"type":"error","name":"PrepayBase__InvalidAddress","inputs":[]},{"type":"error","name":"PrepayBase__InvalidAmount","inputs":[]},{"type":"error","name":"PrepayBase__InvalidMembership","inputs":[]},{"type":"error","name":"ReentrancyGuard__ReentrantCall","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6107a5806100d36000396000f3fe60806040526004361061003f5760003560e01c806327bc79f11461004457806386272406146100765780639262b1b31461008b578063aabe967d146100ab575b600080fd5b34801561005057600080fd5b5061006461005f36600461068c565b6100c0565b60405190815260200160405180910390f35b6100896100843660046106bd565b6100d1565b005b34801561009757600080fd5b506100646100a63660046106e9565b6103bb565b3480156100b757600080fd5b506100896103f8565b60006100cb82610454565b92915050565b60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a00540361011357604051635db5c7cd60e11b815260040160405180910390fd5b61013c60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b8060000361015d57604051632484b54d60e01b815260040160405180910390fd5b6001600160a01b03821661018457604051631ea9dac160e21b815260040160405180910390fd5b6040516301ffc9a760e01b815263421fb7a760e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa1580156101cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f3919061070d565b6102105760405163b2c5c0f360e01b815260040160405180910390fd5b336001600160a01b0316826001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610258573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027c919061072f565b6001600160a01b0316146102a357604051631ea9dac160e21b815260040160405180910390fd5b60006102d67fb29a817dd0719f30ad87abc8dff26e6354077e5b46bf38f34d5ac48732860d02546001600160a01b031690565b905060006102e383610454565b90508034101561030657604051632484b54d60e01b815260040160405180910390fd5b600083856001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036b919061074c565b610375919061077b565b90506103818582610488565b61038b8383610502565b5050506103b760017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b5050565b6001600160a01b03811660009081527f097b4f25b64e012d0cf55f67e9b34fe5d57f15b11b95baa4ddd136b424967c0060205260408120546100cb565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661044257604051630ef4733760e31b815260040160405180910390fd5b610452630cfe7b1160e21b6105ae565b565b600061047e7fb29a817dd0719f30ad87abc8dff26e6354077e5b46bf38f34d5ac48732860d005490565b6100cb908361078e565b60007f097b4f25b64e012d0cf55f67e9b34fe5d57f15b11b95baa4ddd136b424967c006001600160a01b03841660008181526020838152604091829020869055905185815292935090917f884527d8d797310d66e571e2a24daeddc15ae52474ef2c763ab29b60c5678369910160405180910390a2505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461054f576040519150601f19603f3d011682016040523d82523d6000602084013e610554565b606091505b50509050806105a95760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c656400000000604482015260640160405180910390fd5b505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff16151560011461063b576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610654565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006020828403121561069e57600080fd5b5035919050565b6001600160a01b03811681146106ba57600080fd5b50565b600080604083850312156106d057600080fd5b82356106db816106a5565b946020939093013593505050565b6000602082840312156106fb57600080fd5b8135610706816106a5565b9392505050565b60006020828403121561071f57600080fd5b8151801515811461070657600080fd5b60006020828403121561074157600080fd5b8151610706816106a5565b60006020828403121561075e57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156100cb576100cb610765565b80820281158282048414176100cb576100cb61076556","sourceMap":"908:1601:167:-:0;;;;;;;;;;;;-1:-1:-1;385:22:71;:20;:22::i;:::-;908:1601:167;;1653:314:85;303:66:86;1779:14:85;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:85;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:85;1898:16;1886:28;;;;;1927:29;;158:42:516;;;1927:29:85;;146:2:516;131:18;1927:29:85;;;;;;;1844:119;1694:273;1653:314::o;14:192:516:-;908:1601:167;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361061003f5760003560e01c806327bc79f11461004457806386272406146100765780639262b1b31461008b578063aabe967d146100ab575b600080fd5b34801561005057600080fd5b5061006461005f36600461068c565b6100c0565b60405190815260200160405180910390f35b6100896100843660046106bd565b6100d1565b005b34801561009757600080fd5b506100646100a63660046106e9565b6103bb565b3480156100b757600080fd5b506100896103f8565b60006100cb82610454565b92915050565b60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a00540361011357604051635db5c7cd60e11b815260040160405180910390fd5b61013c60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b8060000361015d57604051632484b54d60e01b815260040160405180910390fd5b6001600160a01b03821661018457604051631ea9dac160e21b815260040160405180910390fd5b6040516301ffc9a760e01b815263421fb7a760e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa1580156101cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f3919061070d565b6102105760405163b2c5c0f360e01b815260040160405180910390fd5b336001600160a01b0316826001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610258573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027c919061072f565b6001600160a01b0316146102a357604051631ea9dac160e21b815260040160405180910390fd5b60006102d67fb29a817dd0719f30ad87abc8dff26e6354077e5b46bf38f34d5ac48732860d02546001600160a01b031690565b905060006102e383610454565b90508034101561030657604051632484b54d60e01b815260040160405180910390fd5b600083856001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036b919061074c565b610375919061077b565b90506103818582610488565b61038b8383610502565b5050506103b760017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b5050565b6001600160a01b03811660009081527f097b4f25b64e012d0cf55f67e9b34fe5d57f15b11b95baa4ddd136b424967c0060205260408120546100cb565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661044257604051630ef4733760e31b815260040160405180910390fd5b610452630cfe7b1160e21b6105ae565b565b600061047e7fb29a817dd0719f30ad87abc8dff26e6354077e5b46bf38f34d5ac48732860d005490565b6100cb908361078e565b60007f097b4f25b64e012d0cf55f67e9b34fe5d57f15b11b95baa4ddd136b424967c006001600160a01b03841660008181526020838152604091829020869055905185815292935090917f884527d8d797310d66e571e2a24daeddc15ae52474ef2c763ab29b60c5678369910160405180910390a2505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461054f576040519150601f19603f3d011682016040523d82523d6000602084013e610554565b606091505b50509050806105a95760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c656400000000604482015260640160405180910390fd5b505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff16151560011461063b576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610654565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006020828403121561069e57600080fd5b5035919050565b6001600160a01b03811681146106ba57600080fd5b50565b600080604083850312156106d057600080fd5b82356106db816106a5565b946020939093013593505050565b6000602082840312156106fb57600080fd5b8135610706816106a5565b9392505050565b60006020828403121561071f57600080fd5b8151801515811461070657600080fd5b60006020828403121561074157600080fd5b8151610706816106a5565b60006020828403121561075e57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156100cb576100cb610765565b80820281158282048414176100cb576100cb61076556","sourceMap":"908:1601:167:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2253:133;;;;;;;;;;-1:-1:-1;2253:133:167;;;;;:::i;:::-;;:::i;:::-;;;345:25:516;;;333:2;318:18;2253:133:167;;;;;;;1127:984;;;;;;:::i;:::-;;:::i;:::-;;2115:134;;;;;;;;;;-1:-1:-1;2115:134:167;;;;;:::i;:::-;;:::i;1016:107::-;;;;;;;;;;;;;:::i;2253:133::-;2338:7;2360:21;2374:6;2360:13;:21::i;:::-;2353:28;2253:133;-1:-1:-1;;2253:133:167:o;1127:984::-;415:1:114;302:66:115;515:38:114;:66;511:117;;596:32;;-1:-1:-1;;;596:32:114;;;;;;;;;;;511:117;634:22;415:1;302:66:115;832:65:114;777:125;634:22;1241:6:167::1;1251:1;1241:11:::0;1237:51:::1;;1261:27;;-1:-1:-1::0;;;1261:27:167::1;;;;;;;;;;;1237:51;-1:-1:-1::0;;;;;1298:24:167;::::1;1294:65;;1331:28;;-1:-1:-1::0;;;1331:28:167::1;;;;;;;;;;;1294:65;1415:68;::::0;-1:-1:-1;;;1415:68:167;;-1:-1:-1;;;1415:68:167::1;::::0;::::1;1233:52:516::0;-1:-1:-1;;;;;1415:37:167;::::1;::::0;::::1;::::0;1206:18:516;;1415:68:167::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1410:128;;1500:31;;-1:-1:-1::0;;;1500:31:167::1;;;;;;;;;;;1410:128;1611:10;-1:-1:-1::0;;;;;1580:41:167::1;1588:10;-1:-1:-1::0;;;;;1580:25:167::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;1580:41:167::1;;1576:97;;1638:28;;-1:-1:-1::0;;;1638:28:167::1;;;;;;;;;;;1576:97;1679:20;1702:18;864:49:162::0;;-1:-1:-1;;;;;864:49:162;;791:127;1702:18:167::1;1679:41;;1726:12;1741:21;1755:6;1741:13;:21::i;:::-;1726:36;;1831:4;1819:9;:16;1815:56;;;1844:27;;-1:-1:-1::0;;;1844:27:167::1;;;;;;;;;;;1815:56;1912:17;1969:6;1941:10;-1:-1:-1::0;;;;;1932:32:167::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;;:::i;:::-;1912:63;;1982:30;1990:10;2002:9;1982:7;:30::i;:::-;2046:60;2087:12;2101:4;2046:40;:60::i;:::-;1231:880;;;669:24:114::0;475:1;302:66:115;832:65:114;777:125;669:24;1127:984:167;;:::o;2115:134::-;-1:-1:-1;;;;;578:50:166;;2196:7:167;578:50:166;;;279:66:168;578:50:166;;;;;;2218:26:167;478:155:166;1016:107:167;303:66:86;1263:42:85;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:85;;;;;;;;;;;1258:100;1078:40:167::1;-1:-1:-1::0;;;1078:13:167::1;:40::i;:::-;1016:107::o:0;2390:117::-;2452:7;2483:19;317:66:164;1563:50:162;;1489:129;2483:19:167;2474:28;;:6;:28;:::i;250:224:166:-;318:31;279:66:168;-1:-1:-1;;;;;380:30:166;;:18;:30;;;;;;;;;;;;:39;;;430;;345:25:516;;;380:30:166;;-1:-1:-1;380:30:166;;430:39;;318:18:516;430:39:166;;;;;;;312:162;250:224;;:::o;2561:178:286:-;2637:12;2655:2;-1:-1:-1;;;;;2655:7:286;2670:5;2655:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2636:44;;;2694:7;2686:48;;;;-1:-1:-1;;;2686:48:286;;2870:2:516;2686:48:286;;;2852:21:516;2909:2;2889:18;;;2882:30;2948;2928:18;;;2921:58;2996:18;;2686:48:286;;;;;;;;2630:109;2561:178;;:::o;452:282:88:-;-1:-1:-1;;;;;;1121:62:88;;1096:4;1121:62;;;303:66:90;1121:62:88;;;;;;;;:70;;:62;:70;510:182;;-1:-1:-1;;;;;;556:62:88;;:49;:62;;;303:66:90;556:62:88;;;;;:69;;-1:-1:-1;;556:69:88;621:4;556:69;;;510:182;;;653:32;;-1:-1:-1;;;653:32:88;;;;;;;;;;;510:182;702:27;;-1:-1:-1;;;;;;702:27:88;;;;;;;;452:282;:::o;14:180:516:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:516;;14:180;-1:-1:-1;14:180:516:o;381:131::-;-1:-1:-1;;;;;456:31:516;;446:42;;436:70;;502:1;499;492:12;436:70;381:131;:::o;517:315::-;585:6;593;646:2;634:9;625:7;621:23;617:32;614:52;;;662:1;659;652:12;614:52;701:9;688:23;720:31;745:5;720:31;:::i;:::-;770:5;822:2;807:18;;;;794:32;;-1:-1:-1;;;517:315:516:o;837:247::-;896:6;949:2;937:9;928:7;924:23;920:32;917:52;;;965:1;962;955:12;917:52;1004:9;991:23;1023:31;1048:5;1023:31;:::i;:::-;1073:5;837:247;-1:-1:-1;;;837:247:516:o;1296:277::-;1363:6;1416:2;1404:9;1395:7;1391:23;1387:32;1384:52;;;1432:1;1429;1422:12;1384:52;1464:9;1458:16;1517:5;1510:13;1503:21;1496:5;1493:32;1483:60;;1539:1;1536;1529:12;1578:251;1648:6;1701:2;1689:9;1680:7;1676:23;1672:32;1669:52;;;1717:1;1714;1707:12;1669:52;1749:9;1743:16;1768:31;1793:5;1768:31;:::i;1834:184::-;1904:6;1957:2;1945:9;1936:7;1932:23;1928:32;1925:52;;;1973:1;1970;1963:12;1925:52;-1:-1:-1;1996:16:516;;1834:184;-1:-1:-1;1834:184:516:o;2023:127::-;2084:10;2079:3;2075:20;2072:1;2065:31;2115:4;2112:1;2105:15;2139:4;2136:1;2129:15;2155:125;2220:9;;;2241:10;;;2238:36;;;2254:18;;:::i;2285:168::-;2358:9;;;2389;;2406:15;;;2400:22;;2386:37;2376:71;;2427:18;;:::i","linkReferences":{}},"methodIdentifiers":{"__PrepayFacet_init()":"aabe967d","calculateMembershipPrepayFee(uint256)":"27bc79f1","prepaidMembershipSupply(address)":"9262b1b3","prepayMembership(address,uint256)":"86272406"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Platform__InvalidFeeRecipient\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Platform__InvalidMembershipBps\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Platform__InvalidMembershipDuration\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Platform__InvalidMembershipMintLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PrepayBase__InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PrepayBase__InvalidAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PrepayBase__InvalidMembership\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuard__ReentrantCall\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"PlatformFeeRecipientSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"bps\",\"type\":\"uint16\"}],\"name\":\"PlatformMembershipBpsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"PlatformMembershipDurationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"name\":\"PlatformMembershipFeeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"PlatformMembershipMintLimitSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"membership\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"name\":\"PrepayBase__Prepaid\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__PrepayFacet_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"name\":\"calculateMembershipPrepayFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"prepaidMembershipSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"membership\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"name\":\"prepayMembership\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"calculateMembershipPrepayFee(uint256)\":{\"params\":{\"supply\":\"The supply to calculate the fee for\"},\"returns\":{\"_0\":\"The fee\"}},\"prepaidMembershipSupply(address)\":{\"params\":{\"account\":\"The account to get the prepaid supply for\"},\"returns\":{\"_0\":\"The prepaid supply\"}},\"prepayMembership(address,uint256)\":{\"params\":{\"membership\":\"The membership contract address\",\"supply\":\"The amount of memberships to prepay\"}}},\"version\":1},\"userdoc\":{\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{\"calculateMembershipPrepayFee(uint256)\":{\"notice\":\"Calculate the prepay fee for a given supply\"},\"prepaidMembershipSupply(address)\":{\"notice\":\"Get the prepaid supply for an account\"},\"prepayMembership(address,uint256)\":{\"notice\":\"Prepay a membership\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/factory/facets/prepay/PrepayFacet.sol\":\"PrepayFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol\":{\"keccak256\":\"0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b\",\"dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq\"]},\"contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol\":{\"keccak256\":\"0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c\",\"dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T\"]},\"contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol\":{\"keccak256\":\"0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6\",\"dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC\"]},\"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol\":{\"keccak256\":\"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e\",\"dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM\"]},\"contracts/src/factory/facets/platform/requirements/IPlatformRequirements.sol\":{\"keccak256\":\"0xc0b22b0caa2336e0c3f6b6813432643053785c39531d30e5851eeb613a0a7991\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8a7ceb199e92f484efcc444fffd54fbabaf332c210dda0ef46d89a66f4cb47c7\",\"dweb:/ipfs/QmRJVrZiZpbGsLngz4J3NVgapKXLErdLc7BPyEyTNKdijg\"]},\"contracts/src/factory/facets/platform/requirements/PlatformRequirementsBase.sol\":{\"keccak256\":\"0x158587dabf0ee4b1c3d0871feb4cdd661de24fc27746bea3e9781d8410a1d987\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6e3a3faf324ace9cd621f0579f665f1fdd13c700b7a0983f3fb88fa3ed21b877\",\"dweb:/ipfs/QmYzUNVXABjw4Av39mYXwdTLrCeGdq4qBHqCUDnw7N9vYv\"]},\"contracts/src/factory/facets/platform/requirements/PlatformRequirementsStorage.sol\":{\"keccak256\":\"0xbfe5f3eb736f32a6b32ce92ac245b50b35e2b09c83da83675825faa118ce7985\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f3070ff80c5066fc5239efdcf7eb764223bae7db941e8ebbc6124ad273d873e7\",\"dweb:/ipfs/QmSDqnPShWVwrG66A4LoNMgQ2q1MfRBebRUctWhjKpb5Y1\"]},\"contracts/src/factory/facets/prepay/IPrepay.sol\":{\"keccak256\":\"0x0c5c097dd77471d041cdbb84011ac789147af937d275329d857d1a4b257635e9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://baca271a5a66856f3144a4bf0ed6a484b0c981539d6bf0c57ffade9e4986eb49\",\"dweb:/ipfs/QmVgPWMEL5q2J5kmZQZFRadWjuVQeFLaa9K2gCHdhjLUa9\"]},\"contracts/src/factory/facets/prepay/PrepayBase.sol\":{\"keccak256\":\"0xfebe9ae4138390535139e73b23d1e32af042114beea5ef4d013c57b49069c210\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://57588fd465f1ee19fbe06dcc017b7de5b242f3bf35633b2373744263b61c11c4\",\"dweb:/ipfs/QmXktbrFSheqQ6AFQkwBpyNcaA13xK5gcEY3nLCi79Qpd8\"]},\"contracts/src/factory/facets/prepay/PrepayFacet.sol\":{\"keccak256\":\"0x9bf79ae0025eaa4136fcf9425de17ac7a37278d3177a4727271b1ce7766b3345\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5abffb1af0022309f8bed4f41b2d4fa11f33eac4f2dc1599751e85d62092fa9f\",\"dweb:/ipfs/QmceRDb3dH9MGYn8cWLoZmfTDWy8o7aSf8xKLyi99ZQtkU\"]},\"contracts/src/factory/facets/prepay/PrepayStorage.sol\":{\"keccak256\":\"0x78dc307810bb9021b19fc2793fe744e0e5b980441b4a98c457011eac402faa6a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://72a3727192e0b4f4c560ec0c0fd9d02b8fdd1e176d288684306f1bf3788ce8ab\",\"dweb:/ipfs/QmTxpmnY7wtmdX3k4GSepHLLxm3KBvqDBeRreMyDPMg8E4\"]},\"contracts/src/spaces/facets/membership/IMembership.sol\":{\"keccak256\":\"0x233066dd470121818082ba6a4c868f90feafc3be29942aae2c7a5c25543b7485\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://30d976a1882102493e7cee87b75ab04c662626d71aca51c9334ed2f60402bb59\",\"dweb:/ipfs/QmerPfizrjueQSgG8SkSoi44fkyaqrN2ZCFTnaxnM3UqF7\"]},\"contracts/src/utils/interfaces/IWETH.sol\":{\"keccak256\":\"0xd274612ab96215dcdb6e3717a63e7a0f76c7facadff93b2b23ed278f6e7b3b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://12444da1f06a0fbe6d2d564d73d6d6bc58c09496af3aeea6988c3d3f9ee81c73\",\"dweb:/ipfs/QmTkpQ6cZmRYgvLUS4mqzLvFg5nabgQjpMnVK8JENboiA3\"]},\"contracts/src/utils/libraries/BasisPoints.sol\":{\"keccak256\":\"0x797b0a1d3da51f4256c83b5d5c885b034df5bdff69c8dfa0fac9777cfa2f1d26\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://52ba0c85e5de8a7d76e2e4bcbccdaffa68e29281191ae1f889430a496ce5cf1c\",\"dweb:/ipfs/Qmd5bYypjF6gcJKKagdRpvAgV4LCs4iyn7KYdaLBWjjuHr\"]},\"contracts/src/utils/libraries/CurrencyTransfer.sol\":{\"keccak256\":\"0x1c6b5b33831f8c5c02c49dff5ceac3ad1a6cdb74c988ebba72c36329ca704750\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://78122f27b67a5d3ebe95c4260dc972ab7be5c04b277cbd71a833dd74fbd23fa4\",\"dweb:/ipfs/QmU78EApEim92KMVtW69coFPZdhvbkhmYn6dW2zwqJKPBp\"]},\"lib/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c\",\"dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq\"]},\"lib/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d\",\"dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi\"]},\"lib/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0\",\"dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[],"type":"error","name":"Platform__InvalidFeeRecipient"},{"inputs":[],"type":"error","name":"Platform__InvalidMembershipBps"},{"inputs":[],"type":"error","name":"Platform__InvalidMembershipDuration"},{"inputs":[],"type":"error","name":"Platform__InvalidMembershipMintLimit"},{"inputs":[],"type":"error","name":"PrepayBase__InvalidAddress"},{"inputs":[],"type":"error","name":"PrepayBase__InvalidAmount"},{"inputs":[],"type":"error","name":"PrepayBase__InvalidMembership"},{"inputs":[],"type":"error","name":"ReentrancyGuard__ReentrantCall"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"recipient","type":"address","indexed":true}],"type":"event","name":"PlatformFeeRecipientSet","anonymous":false},{"inputs":[{"internalType":"uint16","name":"bps","type":"uint16","indexed":false}],"type":"event","name":"PlatformMembershipBpsSet","anonymous":false},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256","indexed":false}],"type":"event","name":"PlatformMembershipDurationSet","anonymous":false},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256","indexed":false}],"type":"event","name":"PlatformMembershipFeeSet","anonymous":false},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256","indexed":false}],"type":"event","name":"PlatformMembershipMintLimitSet","anonymous":false},{"inputs":[{"internalType":"address","name":"membership","type":"address","indexed":true},{"internalType":"uint256","name":"supply","type":"uint256","indexed":false}],"type":"event","name":"PrepayBase__Prepaid","anonymous":false},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"__PrepayFacet_init"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function","name":"calculateMembershipPrepayFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"prepaidMembershipSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"membership","type":"address"},{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"payable","type":"function","name":"prepayMembership"}],"devdoc":{"kind":"dev","methods":{"calculateMembershipPrepayFee(uint256)":{"params":{"supply":"The supply to calculate the fee for"},"returns":{"_0":"The fee"}},"prepaidMembershipSupply(address)":{"params":{"account":"The account to get the prepaid supply for"},"returns":{"_0":"The prepaid supply"}},"prepayMembership(address,uint256)":{"params":{"membership":"The membership contract address","supply":"The amount of memberships to prepay"}}},"version":1},"userdoc":{"kind":"user","methods":{"calculateMembershipPrepayFee(uint256)":{"notice":"Calculate the prepay fee for a given supply"},"prepaidMembershipSupply(address)":{"notice":"Get the prepaid supply for an account"},"prepayMembership(address,uint256)":{"notice":"Prepay a membership"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/factory/facets/prepay/PrepayFacet.sol":"PrepayFacet"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol":{"keccak256":"0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a","urls":["bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b","dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol":{"keccak256":"0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f","urls":["bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c","dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol":{"keccak256":"0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c","urls":["bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6","dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9","urls":["bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e","dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM"],"license":"Apache-2.0"},"contracts/src/factory/facets/platform/requirements/IPlatformRequirements.sol":{"keccak256":"0xc0b22b0caa2336e0c3f6b6813432643053785c39531d30e5851eeb613a0a7991","urls":["bzz-raw://8a7ceb199e92f484efcc444fffd54fbabaf332c210dda0ef46d89a66f4cb47c7","dweb:/ipfs/QmRJVrZiZpbGsLngz4J3NVgapKXLErdLc7BPyEyTNKdijg"],"license":"Apache-2.0"},"contracts/src/factory/facets/platform/requirements/PlatformRequirementsBase.sol":{"keccak256":"0x158587dabf0ee4b1c3d0871feb4cdd661de24fc27746bea3e9781d8410a1d987","urls":["bzz-raw://6e3a3faf324ace9cd621f0579f665f1fdd13c700b7a0983f3fb88fa3ed21b877","dweb:/ipfs/QmYzUNVXABjw4Av39mYXwdTLrCeGdq4qBHqCUDnw7N9vYv"],"license":"Apache-2.0"},"contracts/src/factory/facets/platform/requirements/PlatformRequirementsStorage.sol":{"keccak256":"0xbfe5f3eb736f32a6b32ce92ac245b50b35e2b09c83da83675825faa118ce7985","urls":["bzz-raw://f3070ff80c5066fc5239efdcf7eb764223bae7db941e8ebbc6124ad273d873e7","dweb:/ipfs/QmSDqnPShWVwrG66A4LoNMgQ2q1MfRBebRUctWhjKpb5Y1"],"license":"Apache-2.0"},"contracts/src/factory/facets/prepay/IPrepay.sol":{"keccak256":"0x0c5c097dd77471d041cdbb84011ac789147af937d275329d857d1a4b257635e9","urls":["bzz-raw://baca271a5a66856f3144a4bf0ed6a484b0c981539d6bf0c57ffade9e4986eb49","dweb:/ipfs/QmVgPWMEL5q2J5kmZQZFRadWjuVQeFLaa9K2gCHdhjLUa9"],"license":"Apache-2.0"},"contracts/src/factory/facets/prepay/PrepayBase.sol":{"keccak256":"0xfebe9ae4138390535139e73b23d1e32af042114beea5ef4d013c57b49069c210","urls":["bzz-raw://57588fd465f1ee19fbe06dcc017b7de5b242f3bf35633b2373744263b61c11c4","dweb:/ipfs/QmXktbrFSheqQ6AFQkwBpyNcaA13xK5gcEY3nLCi79Qpd8"],"license":"Apache-2.0"},"contracts/src/factory/facets/prepay/PrepayFacet.sol":{"keccak256":"0x9bf79ae0025eaa4136fcf9425de17ac7a37278d3177a4727271b1ce7766b3345","urls":["bzz-raw://5abffb1af0022309f8bed4f41b2d4fa11f33eac4f2dc1599751e85d62092fa9f","dweb:/ipfs/QmceRDb3dH9MGYn8cWLoZmfTDWy8o7aSf8xKLyi99ZQtkU"],"license":"Apache-2.0"},"contracts/src/factory/facets/prepay/PrepayStorage.sol":{"keccak256":"0x78dc307810bb9021b19fc2793fe744e0e5b980441b4a98c457011eac402faa6a","urls":["bzz-raw://72a3727192e0b4f4c560ec0c0fd9d02b8fdd1e176d288684306f1bf3788ce8ab","dweb:/ipfs/QmTxpmnY7wtmdX3k4GSepHLLxm3KBvqDBeRreMyDPMg8E4"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/IMembership.sol":{"keccak256":"0x233066dd470121818082ba6a4c868f90feafc3be29942aae2c7a5c25543b7485","urls":["bzz-raw://30d976a1882102493e7cee87b75ab04c662626d71aca51c9334ed2f60402bb59","dweb:/ipfs/QmerPfizrjueQSgG8SkSoi44fkyaqrN2ZCFTnaxnM3UqF7"],"license":"Apache-2.0"},"contracts/src/utils/interfaces/IWETH.sol":{"keccak256":"0xd274612ab96215dcdb6e3717a63e7a0f76c7facadff93b2b23ed278f6e7b3b00","urls":["bzz-raw://12444da1f06a0fbe6d2d564d73d6d6bc58c09496af3aeea6988c3d3f9ee81c73","dweb:/ipfs/QmTkpQ6cZmRYgvLUS4mqzLvFg5nabgQjpMnVK8JENboiA3"],"license":"Apache-2.0"},"contracts/src/utils/libraries/BasisPoints.sol":{"keccak256":"0x797b0a1d3da51f4256c83b5d5c885b034df5bdff69c8dfa0fac9777cfa2f1d26","urls":["bzz-raw://52ba0c85e5de8a7d76e2e4bcbccdaffa68e29281191ae1f889430a496ce5cf1c","dweb:/ipfs/Qmd5bYypjF6gcJKKagdRpvAgV4LCs4iyn7KYdaLBWjjuHr"],"license":"Apache-2.0"},"contracts/src/utils/libraries/CurrencyTransfer.sol":{"keccak256":"0x1c6b5b33831f8c5c02c49dff5ceac3ad1a6cdb74c988ebba72c36329ca704750","urls":["bzz-raw://78122f27b67a5d3ebe95c4260dc972ab7be5c04b277cbd71a833dd74fbd23fa4","dweb:/ipfs/QmU78EApEim92KMVtW69coFPZdhvbkhmYn6dW2zwqJKPBp"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"}},"version":1},"id":167} \ No newline at end of file diff --git a/packages/generated/dev/abis/PrepayFacet.metadata.json b/packages/generated/dev/abis/PrepayFacet.metadata.json new file mode 100644 index 000000000..a27fb20b7 --- /dev/null +++ b/packages/generated/dev/abis/PrepayFacet.metadata.json @@ -0,0 +1,541 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [], + "type": "error", + "name": "Platform__InvalidFeeRecipient" + }, + { + "inputs": [], + "type": "error", + "name": "Platform__InvalidMembershipBps" + }, + { + "inputs": [], + "type": "error", + "name": "Platform__InvalidMembershipDuration" + }, + { + "inputs": [], + "type": "error", + "name": "Platform__InvalidMembershipMintLimit" + }, + { + "inputs": [], + "type": "error", + "name": "PrepayBase__InvalidAddress" + }, + { + "inputs": [], + "type": "error", + "name": "PrepayBase__InvalidAmount" + }, + { + "inputs": [], + "type": "error", + "name": "PrepayBase__InvalidMembership" + }, + { + "inputs": [], + "type": "error", + "name": "ReentrancyGuard__ReentrantCall" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "PlatformFeeRecipientSet", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "bps", + "type": "uint16", + "indexed": false + } + ], + "type": "event", + "name": "PlatformMembershipBpsSet", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "duration", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "PlatformMembershipDurationSet", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "PlatformMembershipFeeSet", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "limit", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "PlatformMembershipMintLimitSet", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "membership", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "supply", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "PrepayBase__Prepaid", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "__PrepayFacet_init" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "supply", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "calculateMembershipPrepayFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "prepaidMembershipSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "membership", + "type": "address" + }, + { + "internalType": "uint256", + "name": "supply", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "prepayMembership" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "calculateMembershipPrepayFee(uint256)": { + "params": { + "supply": "The supply to calculate the fee for" + }, + "returns": { + "_0": "The fee" + } + }, + "prepaidMembershipSupply(address)": { + "params": { + "account": "The account to get the prepaid supply for" + }, + "returns": { + "_0": "The prepaid supply" + } + }, + "prepayMembership(address,uint256)": { + "params": { + "membership": "The membership contract address", + "supply": "The amount of memberships to prepay" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "calculateMembershipPrepayFee(uint256)": { + "notice": "Calculate the prepay fee for a given supply" + }, + "prepaidMembershipSupply(address)": { + "notice": "Get the prepaid supply for an account" + }, + "prepayMembership(address,uint256)": { + "notice": "Prepay a membership" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/factory/facets/prepay/PrepayFacet.sol": "PrepayFacet" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol": { + "keccak256": "0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a", + "urls": [ + "bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b", + "dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol": { + "keccak256": "0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f", + "urls": [ + "bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c", + "dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol": { + "keccak256": "0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c", + "urls": [ + "bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6", + "dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/IERC721A.sol": { + "keccak256": "0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9", + "urls": [ + "bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e", + "dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/platform/requirements/IPlatformRequirements.sol": { + "keccak256": "0xc0b22b0caa2336e0c3f6b6813432643053785c39531d30e5851eeb613a0a7991", + "urls": [ + "bzz-raw://8a7ceb199e92f484efcc444fffd54fbabaf332c210dda0ef46d89a66f4cb47c7", + "dweb:/ipfs/QmRJVrZiZpbGsLngz4J3NVgapKXLErdLc7BPyEyTNKdijg" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/platform/requirements/PlatformRequirementsBase.sol": { + "keccak256": "0x158587dabf0ee4b1c3d0871feb4cdd661de24fc27746bea3e9781d8410a1d987", + "urls": [ + "bzz-raw://6e3a3faf324ace9cd621f0579f665f1fdd13c700b7a0983f3fb88fa3ed21b877", + "dweb:/ipfs/QmYzUNVXABjw4Av39mYXwdTLrCeGdq4qBHqCUDnw7N9vYv" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/platform/requirements/PlatformRequirementsStorage.sol": { + "keccak256": "0xbfe5f3eb736f32a6b32ce92ac245b50b35e2b09c83da83675825faa118ce7985", + "urls": [ + "bzz-raw://f3070ff80c5066fc5239efdcf7eb764223bae7db941e8ebbc6124ad273d873e7", + "dweb:/ipfs/QmSDqnPShWVwrG66A4LoNMgQ2q1MfRBebRUctWhjKpb5Y1" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/prepay/IPrepay.sol": { + "keccak256": "0x0c5c097dd77471d041cdbb84011ac789147af937d275329d857d1a4b257635e9", + "urls": [ + "bzz-raw://baca271a5a66856f3144a4bf0ed6a484b0c981539d6bf0c57ffade9e4986eb49", + "dweb:/ipfs/QmVgPWMEL5q2J5kmZQZFRadWjuVQeFLaa9K2gCHdhjLUa9" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/prepay/PrepayBase.sol": { + "keccak256": "0xfebe9ae4138390535139e73b23d1e32af042114beea5ef4d013c57b49069c210", + "urls": [ + "bzz-raw://57588fd465f1ee19fbe06dcc017b7de5b242f3bf35633b2373744263b61c11c4", + "dweb:/ipfs/QmXktbrFSheqQ6AFQkwBpyNcaA13xK5gcEY3nLCi79Qpd8" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/prepay/PrepayFacet.sol": { + "keccak256": "0x9bf79ae0025eaa4136fcf9425de17ac7a37278d3177a4727271b1ce7766b3345", + "urls": [ + "bzz-raw://5abffb1af0022309f8bed4f41b2d4fa11f33eac4f2dc1599751e85d62092fa9f", + "dweb:/ipfs/QmceRDb3dH9MGYn8cWLoZmfTDWy8o7aSf8xKLyi99ZQtkU" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/prepay/PrepayStorage.sol": { + "keccak256": "0x78dc307810bb9021b19fc2793fe744e0e5b980441b4a98c457011eac402faa6a", + "urls": [ + "bzz-raw://72a3727192e0b4f4c560ec0c0fd9d02b8fdd1e176d288684306f1bf3788ce8ab", + "dweb:/ipfs/QmTxpmnY7wtmdX3k4GSepHLLxm3KBvqDBeRreMyDPMg8E4" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/IMembership.sol": { + "keccak256": "0x233066dd470121818082ba6a4c868f90feafc3be29942aae2c7a5c25543b7485", + "urls": [ + "bzz-raw://30d976a1882102493e7cee87b75ab04c662626d71aca51c9334ed2f60402bb59", + "dweb:/ipfs/QmerPfizrjueQSgG8SkSoi44fkyaqrN2ZCFTnaxnM3UqF7" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/interfaces/IWETH.sol": { + "keccak256": "0xd274612ab96215dcdb6e3717a63e7a0f76c7facadff93b2b23ed278f6e7b3b00", + "urls": [ + "bzz-raw://12444da1f06a0fbe6d2d564d73d6d6bc58c09496af3aeea6988c3d3f9ee81c73", + "dweb:/ipfs/QmTkpQ6cZmRYgvLUS4mqzLvFg5nabgQjpMnVK8JENboiA3" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/libraries/BasisPoints.sol": { + "keccak256": "0x797b0a1d3da51f4256c83b5d5c885b034df5bdff69c8dfa0fac9777cfa2f1d26", + "urls": [ + "bzz-raw://52ba0c85e5de8a7d76e2e4bcbccdaffa68e29281191ae1f889430a496ce5cf1c", + "dweb:/ipfs/Qmd5bYypjF6gcJKKagdRpvAgV4LCs4iyn7KYdaLBWjjuHr" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/libraries/CurrencyTransfer.sol": { + "keccak256": "0x1c6b5b33831f8c5c02c49dff5ceac3ad1a6cdb74c988ebba72c36329ca704750", + "urls": [ + "bzz-raw://78122f27b67a5d3ebe95c4260dc972ab7be5c04b277cbd71a833dd74fbd23fa4", + "dweb:/ipfs/QmU78EApEim92KMVtW69coFPZdhvbkhmYn6dW2zwqJKPBp" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70", + "urls": [ + "bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c", + "dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { + "keccak256": "0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff", + "urls": [ + "bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d", + "dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { + "keccak256": "0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386", + "urls": [ + "bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0", + "dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/ProxyManager.abi.json b/packages/generated/dev/abis/ProxyManager.abi.json new file mode 100644 index 000000000..2412776ad --- /dev/null +++ b/packages/generated/dev/abis/ProxyManager.abi.json @@ -0,0 +1,165 @@ +[ + { + "type": "function", + "name": "__ProxyManager_init", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getImplementation", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "setImplementation", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ProxyManager__ImplementationSet", + "inputs": [ + { + "name": "implementation", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "ProxyManager__NotContract", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/ProxyManager.abi.ts b/packages/generated/dev/abis/ProxyManager.abi.ts new file mode 100644 index 000000000..9ecab7d60 --- /dev/null +++ b/packages/generated/dev/abis/ProxyManager.abi.ts @@ -0,0 +1,165 @@ +export default [ + { + "type": "function", + "name": "__ProxyManager_init", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getImplementation", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "setImplementation", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ProxyManager__ImplementationSet", + "inputs": [ + { + "name": "implementation", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "ProxyManager__NotContract", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ] + } +] as const diff --git a/packages/generated/dev/abis/ProxyManager.bin b/packages/generated/dev/abis/ProxyManager.bin new file mode 100644 index 000000000..a01ecd846 --- /dev/null +++ b/packages/generated/dev/abis/ProxyManager.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b61042b806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063d784d42614610046578063dc9cc6451461005b578063eb4ab8081461008a575b600080fd5b6100596100543660046103c7565b61009d565b005b61006e6100693660046103e4565b6100fa565b6040516001600160a01b03909116815260200160405180910390f35b6100596100983660046103c7565b61010b565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031633146100ee576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6100f78161016e565b50565b600061010582610218565b92915050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661015557604051630ef4733760e31b815260040160405180910390fd5b61015e8161016e565b6100f7630b18126360e01b6102d4565b806001600160a01b03163b6000036101a4576040516301804d6f60e31b81526001600160a01b03821660048201526024016100e5565b807f249d779ca269721f3d722925685859148db22a7b52f28bf3e74c7625696a0a0080546001600160a01b0319166001600160a01b0392831617905560405190821681527f8295fd24d168fe40d442afbd8648e2883f184648dd815a08f516f38fab1ed3489060200160405180910390a150565b6000807f249d779ca269721f3d722925685859148db22a7b52f28bf3e74c7625696a0a00546040516366ffd66360e11b81526001600160e01b0319851660048201526001600160a01b039091169150600090829063cdffacc690602401602060405180830381865afa158015610292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b6919061040e565b90506001600160a01b0381166102cd575092915050565b9392505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610361576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff1916600117905561037a565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6001600160a01b03811681146100f757600080fd5b6000602082840312156103d957600080fd5b81356102cd816103b2565b6000602082840312156103f657600080fd5b81356001600160e01b0319811681146102cd57600080fd5b60006020828403121561042057600080fd5b81516102cd816103b256 \ No newline at end of file diff --git a/packages/generated/dev/abis/ProxyManager.json b/packages/generated/dev/abis/ProxyManager.json new file mode 100644 index 000000000..0c4a8d982 --- /dev/null +++ b/packages/generated/dev/abis/ProxyManager.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__ProxyManager_init","inputs":[{"name":"implementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getImplementation","inputs":[{"name":"selector","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"setImplementation","inputs":[{"name":"implementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ProxyManager__ImplementationSet","inputs":[{"name":"implementation","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]},{"type":"error","name":"ProxyManager__NotContract","inputs":[{"name":"implementation","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b61042b806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063d784d42614610046578063dc9cc6451461005b578063eb4ab8081461008a575b600080fd5b6100596100543660046103c7565b61009d565b005b61006e6100693660046103e4565b6100fa565b6040516001600160a01b03909116815260200160405180910390f35b6100596100983660046103c7565b61010b565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031633146100ee576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6100f78161016e565b50565b600061010582610218565b92915050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661015557604051630ef4733760e31b815260040160405180910390fd5b61015e8161016e565b6100f7630b18126360e01b6102d4565b806001600160a01b03163b6000036101a4576040516301804d6f60e31b81526001600160a01b03821660048201526024016100e5565b807f249d779ca269721f3d722925685859148db22a7b52f28bf3e74c7625696a0a0080546001600160a01b0319166001600160a01b0392831617905560405190821681527f8295fd24d168fe40d442afbd8648e2883f184648dd815a08f516f38fab1ed3489060200160405180910390a150565b6000807f249d779ca269721f3d722925685859148db22a7b52f28bf3e74c7625696a0a00546040516366ffd66360e11b81526001600160e01b0319851660048201526001600160a01b039091169150600090829063cdffacc690602401602060405180830381865afa158015610292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b6919061040e565b90506001600160a01b0381166102cd575092915050565b9392505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610361576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff1916600117905561037a565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6001600160a01b03811681146100f757600080fd5b6000602082840312156103d957600080fd5b81356102cd816103b2565b6000602082840312156103f657600080fd5b81356001600160e01b0319811681146102cd57600080fd5b60006020828403121561042057600080fd5b81516102cd816103b256","sourceMap":"648:544:143:-:0;;;;;;;;;;;;-1:-1:-1;385:22:71;:20;:22::i;:::-;648:544:143;;1653:314:85;303:66:86;1779:14:85;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:85;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:85;1898:16;1886:28;;;;;1927:29;;158:42:516;;;1927:29:85;;146:2:516;131:18;1927:29:85;;;;;;;1844:119;1694:273;1653:314::o;14:192:516:-;648:544:143;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063d784d42614610046578063dc9cc6451461005b578063eb4ab8081461008a575b600080fd5b6100596100543660046103c7565b61009d565b005b61006e6100693660046103e4565b6100fa565b6040516001600160a01b03909116815260200160405180910390f35b6100596100983660046103c7565b61010b565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031633146100ee576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6100f78161016e565b50565b600061010582610218565b92915050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661015557604051630ef4733760e31b815260040160405180910390fd5b61015e8161016e565b6100f7630b18126360e01b6102d4565b806001600160a01b03163b6000036101a4576040516301804d6f60e31b81526001600160a01b03821660048201526024016100e5565b807f249d779ca269721f3d722925685859148db22a7b52f28bf3e74c7625696a0a0080546001600160a01b0319166001600160a01b0392831617905560405190821681527f8295fd24d168fe40d442afbd8648e2883f184648dd815a08f516f38fab1ed3489060200160405180910390a150565b6000807f249d779ca269721f3d722925685859148db22a7b52f28bf3e74c7625696a0a00546040516366ffd66360e11b81526001600160e01b0319851660048201526001600160a01b039091169150600090829063cdffacc690602401602060405180830381865afa158015610292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b6919061040e565b90506001600160a01b0381166102cd575092915050565b9392505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610361576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff1916600117905561037a565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6001600160a01b03811681146100f757600080fd5b6000602082840312156103d957600080fd5b81356102cd816103b2565b6000602082840312156103f657600080fd5b81356001600160e01b0319811681146102cd57600080fd5b60006020828403121561042057600080fd5b81516102cd816103b256","sourceMap":"648:544:143:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1059:131;;;;;;:::i;:::-;;:::i;:::-;;917:138;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;857:32:516;;;839:51;;827:2;812:18;917:138:143;;;;;;;729:184;;;;;;:::i;:::-;;:::i;1059:131::-;291:66:99;445:29:97;-1:-1:-1;;;;;445:29:97;286:10;:22;282:79;;325:29;;-1:-1:-1;;;325:29:97;;343:10;325:29;;;839:51:516;812:18;;325:29:97;;;;;;;;282:79;1151:34:143::1;1170:14;1151:18;:34::i;:::-;1059:131:::0;:::o;917:138::-;1000:7;1022:28;1041:8;1022:18;:28::i;:::-;1015:35;917:138;-1:-1:-1;;917:138:143:o;729:184::-;303:66:86;1263:42:85;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:85;;;;;;;;;;;1258:100;822:34:143::1;841:14;822:18;:34::i;:::-;862:46;-1:-1:-1::0;;;862:13:143::1;:46::i;758:297:144:-:0;829:14;-1:-1:-1;;;;;829:26:144;;859:1;829:31;825:100;;877:41;;-1:-1:-1;;;877:41:144;;-1:-1:-1;;;;;857:32:516;;877:41:144;;;839:51:516;812:18;;877:41:144;693:203:516;825:100:144;977:14;295:66:145;931:60:144;;-1:-1:-1;;;;;;931:60:144;-1:-1:-1;;;;;931:60:144;;;;;;1003:47;;857:32:516;;;839:51;;1003:47:144;;827:2:516;812:18;1003:47:144;;;;;;;758:297;:::o;437:317::-;521:7;;295:66:145;561:43:144;627:52;;-1:-1:-1;;;627:52:144;;-1:-1:-1;;;;;;1063:33:516;;627:52:144;;;1045::516;-1:-1:-1;;;;;561:43:144;;;;-1:-1:-1;561:43:144;;;;627:42;;1018:18:516;;627:52:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;611:68;-1:-1:-1;;;;;;689:19:144;;685:46;;-1:-1:-1;717:14:144;437:317;-1:-1:-1;;437:317:144:o;685:46::-;744:5;437:317;-1:-1:-1;;;437:317:144:o;452:282:88:-;-1:-1:-1;;;;;;1121:62:88;;1096:4;1121:62;;;303:66:90;1121:62:88;;;;;;;;:70;;:62;:70;510:182;;-1:-1:-1;;;;;;556:62:88;;:49;:62;;;303:66:90;556:62:88;;;;;:69;;-1:-1:-1;;556:69:88;621:4;556:69;;;510:182;;;653:32;;-1:-1:-1;;;653:32:88;;;;;;;;;;;510:182;702:27;;-1:-1:-1;;;;;;702:27:88;;;;;;;;452:282;:::o;14:131:516:-;-1:-1:-1;;;;;89:31:516;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;402:286::-;460:6;513:2;501:9;492:7;488:23;484:32;481:52;;;529:1;526;519:12;481:52;555:23;;-1:-1:-1;;;;;;607:32:516;;597:43;;587:71;;654:1;651;644:12;1108:251;1178:6;1231:2;1219:9;1210:7;1206:23;1202:32;1199:52;;;1247:1;1244;1237:12;1199:52;1279:9;1273:16;1298:31;1323:5;1298:31;:::i","linkReferences":{}},"methodIdentifiers":{"__ProxyManager_init(address)":"eb4ab808","getImplementation(bytes4)":"dc9cc645","setImplementation(address)":"d784d426"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ProxyManager__NotContract\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ProxyManager__ImplementationSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"__ProxyManager_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"setImplementation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The flow of calls goes as follows ManagedProxy -> ProxyManager -> Implementation\",\"events\":{\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"}},\"kind\":\"dev\",\"methods\":{\"getImplementation(bytes4)\":{\"params\":{\"selector\":\"The selector to get the implementation for\"},\"returns\":{\"_0\":\"The implementation address\"}},\"setImplementation(address)\":{\"params\":{\"implementation\":\"The implementation address\"}}},\"title\":\"ProxyManager\",\"version\":1},\"userdoc\":{\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{\"getImplementation(bytes4)\":{\"notice\":\"Get the implementation for a given selector\"},\"setImplementation(address)\":{\"notice\":\"Set the implementation\"}},\"notice\":\"In charge of directing calls to the correct implementation contract, in use by the ManagedProxy contract to correctly direct calls to the correct implementation contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/diamond/proxy/manager/ProxyManager.sol\":\"ProxyManager\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/loupe/IDiamondLoupe.sol\":{\"keccak256\":\"0xafbe8346e6043ac3f6977e9ca43603ca3bbbfc2c2962b47024cf9aa0dcb23f7f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7b0fd31aeddde2f351471e0fd1f5a5da20570491d5604420b283a4749838514c\",\"dweb:/ipfs/QmbuKxmTX8HC9SHNUPsraBTc6NWECwsbgmXsrpXjPqkLLi\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/OwnableBase.sol\":{\"keccak256\":\"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4\",\"dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa\"]},\"contracts/src/diamond/facets/ownable/OwnableStorage.sol\":{\"keccak256\":\"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105\",\"dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ\"]},\"contracts/src/diamond/proxy/manager/IProxyManager.sol\":{\"keccak256\":\"0xde8f6048e58e36541aebff781fb013334e8ea2fa824d9790e629d3733944929a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c79d9ac525a370f6f56b229506cf2d2ffeacafbeb02d417ed34c86c75fe01650\",\"dweb:/ipfs/QmT9CReyEvK2UkcwnzwierQdWw2T7NVZPtVDLcwhyNBhSC\"]},\"contracts/src/diamond/proxy/manager/ProxyManager.sol\":{\"keccak256\":\"0x63c7b73579e0781bec91f6fe7c0475f6d15f4ce6c08f177bcdfd3ac2d8db91c2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://451e530fb61dac8b54ba043c18305b8ef0f902e19952401322bf053afa242613\",\"dweb:/ipfs/QmQeD5nQJZRoPhyKJE6RvzgBYpJB6FGY7tnueqo2dTvLtq\"]},\"contracts/src/diamond/proxy/manager/ProxyManagerBase.sol\":{\"keccak256\":\"0xac5ab92217043d81e01353a8f60242880d18292ed90493161461ab3fd9b0c0c5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2e8933873ed8549a6568129bee694b9213fbb8c8ffa0fed50491f2d1a8f9ca0d\",\"dweb:/ipfs/QmSBUHdcCemYyk9L5WJduW4WvvMPjDS5FCzfbbhydJnGi7\"]},\"contracts/src/diamond/proxy/manager/ProxyManagerStorage.sol\":{\"keccak256\":\"0xf6636a2d69631c053de5784815e9474722f371cf5466fd469071a1a206759616\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://57d9cce006c55697bd4a6a202e6b4d2da25f311287a2e8928502e75212c0a265\",\"dweb:/ipfs/QmQ2fmatavgTHJMKVaDW4THzmAaXaGGWVUexvGkBEatac4\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"type":"error","name":"ProxyManager__NotContract"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"implementation","type":"address","indexed":false}],"type":"event","name":"ProxyManager__ImplementationSet","anonymous":false},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"__ProxyManager_init"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"stateMutability":"view","type":"function","name":"getImplementation","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setImplementation"}],"devdoc":{"kind":"dev","methods":{"getImplementation(bytes4)":{"params":{"selector":"The selector to get the implementation for"},"returns":{"_0":"The implementation address"}},"setImplementation(address)":{"params":{"implementation":"The implementation address"}}},"version":1},"userdoc":{"kind":"user","methods":{"getImplementation(bytes4)":{"notice":"Get the implementation for a given selector"},"setImplementation(address)":{"notice":"Set the implementation"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/diamond/proxy/manager/ProxyManager.sol":"ProxyManager"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/loupe/IDiamondLoupe.sol":{"keccak256":"0xafbe8346e6043ac3f6977e9ca43603ca3bbbfc2c2962b47024cf9aa0dcb23f7f","urls":["bzz-raw://7b0fd31aeddde2f351471e0fd1f5a5da20570491d5604420b283a4749838514c","dweb:/ipfs/QmbuKxmTX8HC9SHNUPsraBTc6NWECwsbgmXsrpXjPqkLLi"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableBase.sol":{"keccak256":"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762","urls":["bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4","dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableStorage.sol":{"keccak256":"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64","urls":["bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105","dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/manager/IProxyManager.sol":{"keccak256":"0xde8f6048e58e36541aebff781fb013334e8ea2fa824d9790e629d3733944929a","urls":["bzz-raw://c79d9ac525a370f6f56b229506cf2d2ffeacafbeb02d417ed34c86c75fe01650","dweb:/ipfs/QmT9CReyEvK2UkcwnzwierQdWw2T7NVZPtVDLcwhyNBhSC"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/manager/ProxyManager.sol":{"keccak256":"0x63c7b73579e0781bec91f6fe7c0475f6d15f4ce6c08f177bcdfd3ac2d8db91c2","urls":["bzz-raw://451e530fb61dac8b54ba043c18305b8ef0f902e19952401322bf053afa242613","dweb:/ipfs/QmQeD5nQJZRoPhyKJE6RvzgBYpJB6FGY7tnueqo2dTvLtq"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/manager/ProxyManagerBase.sol":{"keccak256":"0xac5ab92217043d81e01353a8f60242880d18292ed90493161461ab3fd9b0c0c5","urls":["bzz-raw://2e8933873ed8549a6568129bee694b9213fbb8c8ffa0fed50491f2d1a8f9ca0d","dweb:/ipfs/QmSBUHdcCemYyk9L5WJduW4WvvMPjDS5FCzfbbhydJnGi7"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/manager/ProxyManagerStorage.sol":{"keccak256":"0xf6636a2d69631c053de5784815e9474722f371cf5466fd469071a1a206759616","urls":["bzz-raw://57d9cce006c55697bd4a6a202e6b4d2da25f311287a2e8928502e75212c0a265","dweb:/ipfs/QmQ2fmatavgTHJMKVaDW4THzmAaXaGGWVUexvGkBEatac4"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"}},"version":1},"id":143} \ No newline at end of file diff --git a/packages/generated/dev/abis/ProxyManager.metadata.json b/packages/generated/dev/abis/ProxyManager.metadata.json new file mode 100644 index 000000000..403e97dec --- /dev/null +++ b/packages/generated/dev/abis/ProxyManager.metadata.json @@ -0,0 +1,358 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "type": "error", + "name": "ProxyManager__NotContract" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "ProxyManager__ImplementationSet", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__ProxyManager_init" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setImplementation" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "getImplementation(bytes4)": { + "params": { + "selector": "The selector to get the implementation for" + }, + "returns": { + "_0": "The implementation address" + } + }, + "setImplementation(address)": { + "params": { + "implementation": "The implementation address" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getImplementation(bytes4)": { + "notice": "Get the implementation for a given selector" + }, + "setImplementation(address)": { + "notice": "Set the implementation" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/diamond/proxy/manager/ProxyManager.sol": "ProxyManager" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/loupe/IDiamondLoupe.sol": { + "keccak256": "0xafbe8346e6043ac3f6977e9ca43603ca3bbbfc2c2962b47024cf9aa0dcb23f7f", + "urls": [ + "bzz-raw://7b0fd31aeddde2f351471e0fd1f5a5da20570491d5604420b283a4749838514c", + "dweb:/ipfs/QmbuKxmTX8HC9SHNUPsraBTc6NWECwsbgmXsrpXjPqkLLi" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableBase.sol": { + "keccak256": "0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762", + "urls": [ + "bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4", + "dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableStorage.sol": { + "keccak256": "0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64", + "urls": [ + "bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105", + "dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/manager/IProxyManager.sol": { + "keccak256": "0xde8f6048e58e36541aebff781fb013334e8ea2fa824d9790e629d3733944929a", + "urls": [ + "bzz-raw://c79d9ac525a370f6f56b229506cf2d2ffeacafbeb02d417ed34c86c75fe01650", + "dweb:/ipfs/QmT9CReyEvK2UkcwnzwierQdWw2T7NVZPtVDLcwhyNBhSC" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/manager/ProxyManager.sol": { + "keccak256": "0x63c7b73579e0781bec91f6fe7c0475f6d15f4ce6c08f177bcdfd3ac2d8db91c2", + "urls": [ + "bzz-raw://451e530fb61dac8b54ba043c18305b8ef0f902e19952401322bf053afa242613", + "dweb:/ipfs/QmQeD5nQJZRoPhyKJE6RvzgBYpJB6FGY7tnueqo2dTvLtq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/manager/ProxyManagerBase.sol": { + "keccak256": "0xac5ab92217043d81e01353a8f60242880d18292ed90493161461ab3fd9b0c0c5", + "urls": [ + "bzz-raw://2e8933873ed8549a6568129bee694b9213fbb8c8ffa0fed50491f2d1a8f9ca0d", + "dweb:/ipfs/QmSBUHdcCemYyk9L5WJduW4WvvMPjDS5FCzfbbhydJnGi7" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/manager/ProxyManagerStorage.sol": { + "keccak256": "0xf6636a2d69631c053de5784815e9474722f371cf5466fd469071a1a206759616", + "urls": [ + "bzz-raw://57d9cce006c55697bd4a6a202e6b4d2da25f311287a2e8928502e75212c0a265", + "dweb:/ipfs/QmQ2fmatavgTHJMKVaDW4THzmAaXaGGWVUexvGkBEatac4" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/Roles.abi.json b/packages/generated/dev/abis/Roles.abi.json new file mode 100644 index 000000000..47c6d8fef --- /dev/null +++ b/packages/generated/dev/abis/Roles.abi.json @@ -0,0 +1,818 @@ +[ + { + "type": "function", + "name": "addPermissionsToRole", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "addRoleToEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "entitlement", + "type": "tuple", + "internalType": "struct IRolesBase.CreateEntitlement", + "components": [ + { + "name": "module", + "type": "address", + "internalType": "contract IEntitlement" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "createRole", + "inputs": [ + { + "name": "roleName", + "type": "string", + "internalType": "string" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "entitlements", + "type": "tuple[]", + "internalType": "struct IRolesBase.CreateEntitlement[]", + "components": [ + { + "name": "module", + "type": "address", + "internalType": "contract IEntitlement" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getPermissionsByRoleId", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoleById", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IRolesBase.Role", + "components": [ + { + "name": "id", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "entitlements", + "type": "address[]", + "internalType": "contract IEntitlement[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoles", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IRolesBase.Role[]", + "components": [ + { + "name": "id", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "entitlements", + "type": "address[]", + "internalType": "contract IEntitlement[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removePermissionsFromRole", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeRole", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeRoleFromEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "entitlement", + "type": "tuple", + "internalType": "struct IRolesBase.CreateEntitlement", + "components": [ + { + "name": "module", + "type": "address", + "internalType": "contract IEntitlement" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateRole", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "roleName", + "type": "string", + "internalType": "string" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "entitlements", + "type": "tuple[]", + "internalType": "struct IRolesBase.CreateEntitlement[]", + "components": [ + { + "name": "module", + "type": "address", + "internalType": "contract IEntitlement" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleCreated", + "inputs": [ + { + "name": "creator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRemoved", + "inputs": [ + { + "name": "remover", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleUpdated", + "inputs": [ + { + "name": "updater", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SubscriptionUpdate", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "expiration", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ChannelService__ChannelDisabled", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__ChannelDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__DurationZero", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__NotApprovedOrOwner", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__InvalidEntitlementInterface", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidPermission", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidByteLength", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidStringLength", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/Roles.abi.ts b/packages/generated/dev/abis/Roles.abi.ts new file mode 100644 index 000000000..f81519fca --- /dev/null +++ b/packages/generated/dev/abis/Roles.abi.ts @@ -0,0 +1,818 @@ +export default [ + { + "type": "function", + "name": "addPermissionsToRole", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "addRoleToEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "entitlement", + "type": "tuple", + "internalType": "struct IRolesBase.CreateEntitlement", + "components": [ + { + "name": "module", + "type": "address", + "internalType": "contract IEntitlement" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "createRole", + "inputs": [ + { + "name": "roleName", + "type": "string", + "internalType": "string" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "entitlements", + "type": "tuple[]", + "internalType": "struct IRolesBase.CreateEntitlement[]", + "components": [ + { + "name": "module", + "type": "address", + "internalType": "contract IEntitlement" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getPermissionsByRoleId", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoleById", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IRolesBase.Role", + "components": [ + { + "name": "id", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "entitlements", + "type": "address[]", + "internalType": "contract IEntitlement[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoles", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IRolesBase.Role[]", + "components": [ + { + "name": "id", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "entitlements", + "type": "address[]", + "internalType": "contract IEntitlement[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removePermissionsFromRole", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeRole", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeRoleFromEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "entitlement", + "type": "tuple", + "internalType": "struct IRolesBase.CreateEntitlement", + "components": [ + { + "name": "module", + "type": "address", + "internalType": "contract IEntitlement" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateRole", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "roleName", + "type": "string", + "internalType": "string" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "entitlements", + "type": "tuple[]", + "internalType": "struct IRolesBase.CreateEntitlement[]", + "components": [ + { + "name": "module", + "type": "address", + "internalType": "contract IEntitlement" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleCreated", + "inputs": [ + { + "name": "creator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRemoved", + "inputs": [ + { + "name": "remover", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleUpdated", + "inputs": [ + { + "name": "updater", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SubscriptionUpdate", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "expiration", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ChannelService__ChannelDisabled", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__ChannelDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__DurationZero", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__NotApprovedOrOwner", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__InvalidEntitlementInterface", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidPermission", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidByteLength", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidStringLength", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/Roles.bin b/packages/generated/dev/abis/Roles.bin new file mode 100644 index 000000000..2c81d86c0 --- /dev/null +++ b/packages/generated/dev/abis/Roles.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b50613114806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80639a8e4c3e116100665780639a8e4c3e1461012a578063b42642331461013d578063b75157611461015d578063ba201ba814610170578063dba818641461018357600080fd5b80634d8b50a2146100a357806371061398146100b8578063784c872b146100d65780638fcd793d146100f65780639269182114610117575b600080fd5b6100b66100b13660046128d9565b610196565b005b6100c06101e7565b6040516100cd9190612aaf565b60405180910390f35b6100e96100e4366004612b13565b6101f6565b6040516100cd9190612b2c565b610109610104366004612b3f565b610242565b6040519081526020016100cd565b6100b6610125366004612b13565b61028d565b6100b6610138366004612bcc565b6102d6565b61015061014b366004612b13565b610321565b6040516100cd9190612c12565b6100b661016b366004612bcc565b61032c565b6100b661017e366004612c69565b610373565b6100b6610191366004612c69565b6103ba565b6101ca604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6101d385610429565b6101e08585858585610470565b5050505050565b60606101f161076d565b905090565b61022a6040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b61023382610429565b61023c826108af565b92915050565b6000610278604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b61028485858585610928565b95945050505050565b6102c1604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6102ca81610429565b6102d381610b0b565b50565b61030a604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b61031382610429565b61031d8282610d6f565b5050565b606061023c82610e5a565b610360604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b61036982610429565b61031d8282610e6e565b6103a7604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6103b082610429565b61031d8282610f1f565b6103ee604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6103f782610429565b61031d8282610f54565b61040c600082610f79565b6102d357604051630ce39a4b60e21b815260040160405180910390fd5b6104537f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0182610ffd565b6102d35760405163a3f70f7b60e01b815260040160405180910390fd5b600061047b86611018565b80518351919250906000816001600160401b0381111561049d5761049d612654565b6040519080825280602002602001820160405280156104c6578160200160208202803683370190505b50905060005b828110156105595760008682815181106104e8576104e8612ca5565b60200260200101516000015190506104ff8161111c565b610508816111e5565b86828151811061051a5761051a612ca5565b60200260200101516000015183838151811061053857610538612ca5565b6001600160a01b0390921660209283029190910190910152506001016104cc565b5086156105885760008981526000805160206130f483398151915260205260409020610586888a83612d37565b505b8551156105ce5760008981526000805160206130f4833981519152602052604081206105b69060020161124d565b90506105c28a82610d6f565b6105cc8a88610e6e565b505b816000036105df57505050506101e0565b80511561065857805160005b8481101561061e576106168b87838151811061060957610609612ca5565b6020026020010151611258565b6001016105eb565b5060005b818110156106555761064d8b84838151811061064057610640612ca5565b60200260200101516112d0565b600101610622565b50505b60005b8381101561068e5761068685828151811061067857610678612ca5565b60200260200101518b611343565b60010161065b565b5060005b828110156107345760008682815181106106ae576106ae612ca5565b60200260200101516020015151111561072c576106e78682815181106106d6576106d6612ca5565b6020026020010151602001516113aa565b61072c8682815181106106fc576106fc612ca5565b6020026020010151600001518b88848151811061071b5761071b612ca5565b6020026020010151602001516113cc565b600101610692565b50604051899033907f1aff41ff8e9139aae6bb355cc69107cda7e1d1dcd25511da436f3171bdbf77e690600090a3505050505050505050565b6060600061077961143a565b8051909150806001600160401b0381111561079657610796612654565b6040519080825280602002602001820160405280156107fb57816020015b6107e86040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b8152602001906001900390816107b45790505b50925060005b818110156108a95760008060008061083187868151811061082457610824612ca5565b6020026020010151611465565b93509350935093506040518060a0016040528088878151811061085657610856612ca5565b6020026020010151815260200185815260200184151581526020018381526020018281525088868151811061088d5761088d612ca5565b6020026020010181905250848060010195505050505050610801565b50505090565b6108e36040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b6000806000806108f286611465565b6040805160a0810182529a8b5260208b019490945291151592890192909252606088019190915260808701525093949350505050565b600061096c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506002925061157e915050565b81516000816001600160401b0381111561098857610988612654565b6040519080825280602002602001820160405280156109b1578160200160208202803683370190505b5090506109bc6115a7565b925060005b82811015610a90576109ef8582815181106109de576109de612ca5565b60200260200101516000015161111c565b848181518110610a0157610a01612ca5565b602002602001015160000151828281518110610a1f57610a1f612ca5565b60200260200101906001600160a01b031690816001600160a01b031681525050610a548582815181106106d6576106d6612ca5565b610a88858281518110610a6957610a69612ca5565b6020026020010151600001518587848151811061071b5761071b612ca5565b6001016109c1565b50610ad387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525092508991508590506115cd565b50604051839033907f20a7a288530dd94b1eccaa691a582ecfd7550c9dfcee78ddf50a97f774a2b14790600090a35050949350505050565b6000610b1682611018565b80519091506000805160206130d4833981519152610b547f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01856116f6565b506000848152600382016020526040812090610b708282612564565b60018201805460ff19169055600282016000610b8c828261259e565b50506004820160008181610ba082826125bc565b5050604080516020808201835260008083528b815260038901909152919091209450610bd193509150839050612df6565b506000848152600382016020526040812060018101805460ff19169055610bfa90600201611702565b6000868152600384016020526040812091925090610c1a90600401611702565b905060005b82811015610c6a5760008781526003850160205260409020610c6190610c48906002018361170c565b6000898152600387016020526040902060020190611718565b50600101610c1f565b5060005b81811015610cb95760008781526003850160205260409020610cb090610c979060040183611724565b6000898152600387016020526040902060040190611730565b50600101610c6e565b506000610cc587611745565b805190915060005b81811015610d0057610cf8838281518110610cea57610cea612ca5565b60200260200101518a611831565b600101610ccd565b5060005b86811015610d3757610d2f888281518110610d2157610d21612ca5565b60200260200101518a611343565b600101610d04565b50604051889033907f268a6f1b90f6f5ddf50cc736d36513e80cdc5fd56326bff71f335e8b4b61d05590600090a35050505050505050565b80516000805160206130d48339815191529060005b818110156101e057610dae848281518110610da157610da1612ca5565b60200260200101516118c1565b610df1848281518110610dc357610dc3612ca5565b60200260200101518460030160008881526020019081526020016000206002016118e290919063ffffffff16565b610e0e57604051633e2b026160e01b815260040160405180910390fd5b610e51848281518110610e2357610e23612ca5565b602002602001015184600301600088815260200190815260200160002060020161171890919063ffffffff16565b50600101610d84565b6060610e6582611465565b50949350505050565b80516000805160206130d48339815191529060005b818110156101e057610ea0848281518110610da157610da1612ca5565b610eb5848281518110610dc357610dc3612ca5565b15610ed35760405163b0ab682160e01b815260040160405180910390fd5b610f16848281518110610ee857610ee8612ca5565b60200260200101518460030160008881526020019081526020016000206002016118ee90919063ffffffff16565b50600101610e83565b610f2882610429565b8051610f33906111e5565b610f418282600001516112d0565b61031d81600001518383602001516113cc565b8051610f5f906111e5565b610f6d828260000151611258565b805161031d9083611343565b60003380610f856118fa565b6001600160a01b03161480610ff557507fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff16158015610ff55750610ff5848285604051602001610fd89190612eb5565b604051602081830303815290604052610ff090612ed1565b6119be565b949350505050565b600081815260018301602052604081205415155b9392505050565b60008181526000805160206130f4833981519152602052604081206060919061104390600401611702565b6001600160401b0381111561105a5761105a612654565b604051908082528060200260200182016040528015611083578160200160208202803683370190505b50905060005b60008481526000805160206130f4833981519152602052604090206110b090600401611702565b8110156111155760008481526000805160206130f4833981519152602052604081206110df9060040183611724565b9050808383815181106110f4576110f4612ca5565b6001600160a01b039092166020928302919091019091015250600101611089565b5092915050565b6001600160a01b03811661114357604051630706e15760e51b815260040160405180910390fd5b6040516301ffc9a760e01b8152637bc2cb4560e11b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa9250505080156111aa575060408051601f3d908101601f191682019092526111a791810190612ef5565b60015b6111c75760405163f58a5f2760e01b815260040160405180910390fd5b8061031d5760405163f58a5f2760e01b815260040160405180910390fd5b7fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006112307fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c9310183611c6b565b61031d5760405163017ab33760e71b815260040160405180910390fd5b606061023c82611c8d565b60008281526000805160206130f4833981519152602052604090206000805160206130d4833981519152906112909060040183611c6b565b6112ad57604051632405297d60e11b815260040160405180910390fd5b600083815260038201602052604090206112ca9060040183611730565b50505050565b60008281526000805160206130f4833981519152602052604090206000805160206130d4833981519152906113089060040183611c6b565b156113265760405163fb5584f160e01b815260040160405180910390fd5b600083815260038201602052604090206112ca9060040183611d6a565b61134c826111e5565b60405163f0c111f960e01b8152600481018290526001600160a01b0383169063f0c111f990602401600060405180830381600087803b15801561138e57600080fd5b505af11580156113a2573d6000803e3d6000fd5b505050505050565b80516000036102d3576040516319c6193b60e31b815260040160405180910390fd5b6113d5836111e5565b604051633be2f95d60e21b81526001600160a01b0384169063ef8be574906114039085908590600401612f17565b600060405180830381600087803b15801561141d57600080fd5b505af1158015611431573d6000803e3d6000fd5b50505050505050565b60606101f17f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01611d7f565b60008181526000805160206130f483398151915260205260408120805460609291839182919061149490612cbb565b80601f01602080910402602001604051908101604052809291908181526020018280546114c090612cbb565b801561150d5780601f106114e25761010080835404028352916020019161150d565b820191906000526020600020905b8154815290600101906020018083116114f057829003601f168201915b505050505093506115296000805160206130d483398151915290565b600086815260039190910160209081526040808320600101546000805160206130f483398151915290925290912060ff909116935061156a9060020161124d565b915061157585611018565b90509193509193565b815182908211156115a2576040516374eb20a760e01b815260040160405180910390fd5b505050565b6000805160206130d48339815191528054600091906115c7906001612f46565b91505090565b6000805160206130d4833981519152805460009190819083906115ef90612f59565b918290555091506116036001820183611d8c565b506000828152600382016020526040902061161e8782612df6565b5060008281526003820160205260409020600101805460ff19168615151790556116488285610e6e565b60005b83518110156116ec5760006001600160a01b031684828151811061167157611671612ca5565b60200260200101516001600160a01b0316036116a057604051637442429b60e01b815260040160405180910390fd5b6116e38482815181106116b5576116b5612ca5565b6020026020010151836003016000868152602001908152602001600020600401611d6a90919063ffffffff16565b5060010161164b565b5050949350505050565b60006110118383611d98565b600061023c825490565b60606110118383611e8b565b60006110118383611f3d565b600061101183836120f2565b6000611011836001600160a01b038416611d98565b60606000805160206130b4833981519152600061176182611702565b90506000816001600160401b0381111561177d5761177d612654565b6040519080825280602002602001820160405280156117a6578160200160208202803683370190505b50935060005b828110156118165760006117c08583611724565b600081815260038701602052604090209091506117dd9088610ffd565b1561180d578086846117ee81612f59565b95508151811061180057611800612ca5565b6020026020010181815250505b506001016117ac565b5080821115611829578351818303900384525b505050919050565b61183a8261211c565b61184382612151565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504303602052604090206000805160206130b48339815191529061188a9083610ffd565b6118a7576040516333cb039f60e11b815260040160405180910390fd5b600083815260038201602052604090206112ca90836116f6565b80516000036102d35760405162ce76c160e41b815260040160405180910390fd5b600061101183836121b3565b600061101183836121e0565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa15801561199a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c79190612f72565b6000806119c96118fa565b905060006119d685612242565b805190915060006119e56123c0565b805190915060005b83811015611aa4576000858281518110611a0957611a09612ca5565b60200260200101519050866001600160a01b0316816001600160a01b031603611a3c576001975050505050505050611011565b60005b83811015611a9a57816001600160a01b0316611a73868381518110611a6657611a66612ca5565b60200260200101516123eb565b6001600160a01b031603611a9257600098505050505050505050611011565b600101611a3f565b50506001016119ed565b507fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006000611af17fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c93101611702565b905060005b81811015611c595760008381611b0f6001830185611724565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015611b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbc9190612ef5565b158015611c39575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401611bf893929190612f8f565b602060405180830381865afa158015611c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c399190612ef5565b15611c505760019950505050505050505050611011565b50600101611af6565b5060009b9a5050505050505050505050565b6001600160a01b03811660009081526001830160205260408120541515611011565b606081600001805480602002602001604051908101604052809291908181526020016000905b82821015611d5f578382906000526020600020018054611cd290612cbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611cfe90612cbb565b8015611d4b5780601f10611d2057610100808354040283529160200191611d4b565b820191906000526020600020905b815481529060010190602001808311611d2e57829003601f168201915b505050505081526020019060010190611cb3565b505050509050919050565b6000611011836001600160a01b0384166123f6565b606060006110118361243d565b600061101183836123f6565b60008181526001830160205260408120548015611e81576000611dbc600183612ff1565b8554909150600090611dd090600190612ff1565b9050808214611e35576000866000018281548110611df057611df0612ca5565b9060005260206000200154905080876000018481548110611e1357611e13612ca5565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611e4657611e46613004565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061023c565b600091505061023c565b6060826000018281548110611ea257611ea2612ca5565b906000526020600020018054611eb790612cbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee390612cbb565b8015611f305780601f10611f0557610100808354040283529160200191611f30565b820191906000526020600020905b815481529060010190602001808311611f1357829003601f168201915b5050505050905092915050565b6000808360010183604051611f529190612eb5565b908152602001604051809103902054905080600014611e81576000611f78600183612ff1565b8554909150600090611f8c90600190612ff1565b9050818114612093576000866000018281548110611fac57611fac612ca5565b906000526020600020018054611fc190612cbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611fed90612cbb565b801561203a5780601f1061200f5761010080835404028352916020019161203a565b820191906000526020600020905b81548152906001019060200180831161201d57829003601f168201915b505050505090508087600001848154811061205757612057612ca5565b90600052602060002001908161206d9190612df6565b508387600101826040516120819190612eb5565b90815260405190819003602001902055505b85548690806120a4576120a4613004565b6001900381819060005260206000200160006120c09190612564565b905585600101856040516120d49190612eb5565b9081526020016040518091039020600090556001935050505061023c565b600082600001828154811061210957612109612ca5565b9060005260206000200154905092915050565b6121346000805160206130b483398151915282610ffd565b6102d35760405163560b4b4160e11b815260040160405180910390fd5b60008181527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430260205260409020600101546000805160206130b48339815191529060ff161561031d57604051636ce0028960e11b815260040160405180910390fd5b600082600101826040516121c79190612eb5565b9081526040519081900360200190205415159392505050565b60006121ec83836121b3565b61223a5782546001810184556000848152602090200161220c8382612df6565b5082546040516001850190612222908590612eb5565b9081526040519081900360200190205550600161023c565b50600061023c565b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa1580156122b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122df919081019061301a565b805190915060006122f1826001612f46565b6001600160401b0381111561230857612308612654565b604051908082528060200260200182016040528015612331578160200160208202803683370190505b50905060005b8281101561238b5783818151811061235157612351612ca5565b602002602001015182828151811061236b5761236b612ca5565b6001600160a01b0390921660209283029190910190910152600101612337565b508581838151811061239f5761239f612ca5565b6001600160a01b039092166020928302919091019091015295945050505050565b60606101f17f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611d7f565b600061023c82612499565b600081815260018301602052604081205461223a5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561023c565b60608160000180548060200260200160405190810160405280929190818152602001828054801561248d57602002820191906000526020600020905b815481526020019060010190808311612479575b50505050509050919050565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b8316900361254a5781600003612544578054831061252057604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115612521575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b50805461257090612cbb565b6000825580601f10612580575050565b601f0160209004906000526020600020908101906102d391906125d6565b50805460008255906000526020600020908101906102d391906125ef565b50805460008255906000526020600020908101906102d391905b5b808211156125eb57600081556001016125d7565b5090565b808211156125eb5760006126038282612564565b506001016125ef565b60008083601f84011261261e57600080fd5b5081356001600160401b0381111561263557600080fd5b60208301915083602082850101111561264d57600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561269257612692612654565b604052919050565b60006001600160401b038211156126b3576126b3612654565b5060051b60200190565b60006001600160401b038311156126d6576126d6612654565b6126e9601f8401601f191660200161266a565b90508281528383830111156126fd57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261272557600080fd5b8135602061273a6127358361269a565b61266a565b82815260059290921b8401810191818101908684111561275957600080fd5b8286015b848110156127ad5780356001600160401b0381111561277c5760008081fd5b8701603f8101891361278e5760008081fd5b61279f8986830135604084016126bd565b84525091830191830161275d565b509695505050505050565b6001600160a01b03811681146102d357600080fd5b6000604082840312156127df57600080fd5b604051604081016001600160401b03828210818311171561280257612802612654565b8160405282935084359150612816826127b8565b9082526020840135908082111561282c57600080fd5b508301601f8101851361283e57600080fd5b61284d858235602084016126bd565b6020830152505092915050565b600082601f83011261286b57600080fd5b8135602061287b6127358361269a565b82815260059290921b8401810191818101908684111561289a57600080fd5b8286015b848110156127ad5780356001600160401b038111156128bd5760008081fd5b6128cb8986838b01016127cd565b84525091830191830161289e565b6000806000806000608086880312156128f157600080fd5b8535945060208601356001600160401b038082111561290f57600080fd5b61291b89838a0161260c565b9096509450604088013591508082111561293457600080fd5b61294089838a01612714565b9350606088013591508082111561295657600080fd5b506129638882890161285a565b9150509295509295909350565b60005b8381101561298b578181015183820152602001612973565b50506000910152565b600081518084526129ac816020860160208601612970565b601f01601f19169290920160200192915050565b60008151808452602080850194506020840160005b838110156129fa5781516001600160a01b0316875295820195908201906001016129d5565b509495945050505050565b80518252600060208083015160a082860152612a2460a0860182612994565b9050604084015115156040860152606084015185820360608701528181518084528484019150848160051b850101858401935060005b82811015612a8857601f19868303018452612a76828651612994565b94870194938701939150600101612a5a565b506080880151955088810360808a0152612aa281876129c0565b9998505050505050505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015612b0657603f19888603018452612af4858351612a05565b94509285019290850190600101612ad8565b5092979650505050505050565b600060208284031215612b2557600080fd5b5035919050565b6020815260006110116020830184612a05565b60008060008060608587031215612b5557600080fd5b84356001600160401b0380821115612b6c57600080fd5b612b788883890161260c565b90965094506020870135915080821115612b9157600080fd5b612b9d88838901612714565b93506040870135915080821115612bb357600080fd5b50612bc08782880161285a565b91505092959194509250565b60008060408385031215612bdf57600080fd5b8235915060208301356001600160401b03811115612bfc57600080fd5b612c0885828601612714565b9150509250929050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015612b0657603f19888603018452612c57858351612994565b94509285019290850190600101612c3b565b60008060408385031215612c7c57600080fd5b8235915060208301356001600160401b03811115612c9957600080fd5b612c08858286016127cd565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680612ccf57607f821691505b60208210810361254457634e487b7160e01b600052602260045260246000fd5b601f8211156115a2576000816000526020600020601f850160051c81016020861015612d185750805b601f850160051c820191505b818110156113a257828155600101612d24565b6001600160401b03831115612d4e57612d4e612654565b612d6283612d5c8354612cbb565b83612cef565b6000601f841160018114612d965760008515612d7e5750838201355b600019600387901b1c1916600186901b1783556101e0565b600083815260209020601f19861690835b82811015612dc75786850135825560209485019460019092019101612da7565b5086821015612de45760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81516001600160401b03811115612e0f57612e0f612654565b612e2381612e1d8454612cbb565b84612cef565b602080601f831160018114612e585760008415612e405750858301515b600019600386901b1c1916600185901b1785556113a2565b600085815260208120601f198616915b82811015612e8757888601518255948401946001909101908401612e68565b5085821015612ea55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251612ec7818460208701612970565b9190910192915050565b805160208083015191908110156125445760001960209190910360031b1b16919050565b600060208284031215612f0757600080fd5b8151801515811461101157600080fd5b828152604060208201526000610ff56040830184612994565b634e487b7160e01b600052601160045260246000fd5b8082018082111561023c5761023c612f30565b600060018201612f6b57612f6b612f30565b5060010190565b600060208284031215612f8457600080fd5b8151611011816127b8565b60006060820185835260206060602085015281865180845260808601915060208801935060005b81811015612fdb5784516001600160a01b031683529383019391830191600101612fb6565b5050809350505050826040830152949350505050565b8181038181111561023c5761023c612f30565b634e487b7160e01b600052603160045260246000fd5b6000602080838503121561302d57600080fd5b82516001600160401b0381111561304357600080fd5b8301601f8101851361305457600080fd5b80516130626127358261269a565b81815260059190911b8201830190838101908783111561308157600080fd5b928401925b828410156130a8578351613099816127b8565b82529284019290840190613086565b97965050505050505056fe804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504300672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd00672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd03 \ No newline at end of file diff --git a/packages/generated/dev/abis/Roles.json b/packages/generated/dev/abis/Roles.json new file mode 100644 index 000000000..031364e8e --- /dev/null +++ b/packages/generated/dev/abis/Roles.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"addPermissionsToRole","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"permissions","type":"string[]","internalType":"string[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addRoleToEntitlement","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"entitlement","type":"tuple","internalType":"struct IRolesBase.CreateEntitlement","components":[{"name":"module","type":"address","internalType":"contract IEntitlement"},{"name":"data","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"createRole","inputs":[{"name":"roleName","type":"string","internalType":"string"},{"name":"permissions","type":"string[]","internalType":"string[]"},{"name":"entitlements","type":"tuple[]","internalType":"struct IRolesBase.CreateEntitlement[]","components":[{"name":"module","type":"address","internalType":"contract IEntitlement"},{"name":"data","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"getPermissionsByRoleId","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"permissions","type":"string[]","internalType":"string[]"}],"stateMutability":"view"},{"type":"function","name":"getRoleById","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IRolesBase.Role","components":[{"name":"id","type":"uint256","internalType":"uint256"},{"name":"name","type":"string","internalType":"string"},{"name":"disabled","type":"bool","internalType":"bool"},{"name":"permissions","type":"string[]","internalType":"string[]"},{"name":"entitlements","type":"address[]","internalType":"contract IEntitlement[]"}]}],"stateMutability":"view"},{"type":"function","name":"getRoles","inputs":[],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IRolesBase.Role[]","components":[{"name":"id","type":"uint256","internalType":"uint256"},{"name":"name","type":"string","internalType":"string"},{"name":"disabled","type":"bool","internalType":"bool"},{"name":"permissions","type":"string[]","internalType":"string[]"},{"name":"entitlements","type":"address[]","internalType":"contract IEntitlement[]"}]}],"stateMutability":"view"},{"type":"function","name":"removePermissionsFromRole","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"permissions","type":"string[]","internalType":"string[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeRole","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeRoleFromEntitlement","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"entitlement","type":"tuple","internalType":"struct IRolesBase.CreateEntitlement","components":[{"name":"module","type":"address","internalType":"contract IEntitlement"},{"name":"data","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateRole","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"roleName","type":"string","internalType":"string"},{"name":"permissions","type":"string[]","internalType":"string[]"},{"name":"entitlements","type":"tuple[]","internalType":"struct IRolesBase.CreateEntitlement[]","components":[{"name":"module","type":"address","internalType":"contract IEntitlement"},{"name":"data","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"Banned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ConsecutiveTransfer","inputs":[{"name":"fromTokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"toTokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleCreated","inputs":[{"name":"creator","type":"address","indexed":true,"internalType":"address"},{"name":"roleId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"RoleRemoved","inputs":[{"name":"remover","type":"address","indexed":true,"internalType":"address"},{"name":"roleId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"RoleUpdated","inputs":[{"name":"updater","type":"address","indexed":true,"internalType":"address"},{"name":"roleId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"SubscriptionUpdate","inputs":[{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"expiration","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unbanned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"ApprovalCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"ApprovalQueryForNonexistentToken","inputs":[]},{"type":"error","name":"BalanceQueryForZeroAddress","inputs":[]},{"type":"error","name":"Banning__AlreadyBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__CannotBanSelf","inputs":[]},{"type":"error","name":"Banning__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__NotBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ChannelService__ChannelDisabled","inputs":[]},{"type":"error","name":"ChannelService__ChannelDoesNotExist","inputs":[]},{"type":"error","name":"ChannelService__RoleDoesNotExist","inputs":[]},{"type":"error","name":"ERC5643__DurationZero","inputs":[]},{"type":"error","name":"ERC5643__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC5643__NotApprovedOrOwner","inputs":[]},{"type":"error","name":"ERC5643__SubscriptionNotRenewable","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Entitlement__InvalidValue","inputs":[]},{"type":"error","name":"Entitlement__NotAllowed","inputs":[]},{"type":"error","name":"Entitlement__NotMember","inputs":[]},{"type":"error","name":"Entitlement__ValueAlreadyExists","inputs":[]},{"type":"error","name":"EntitlementsService__EntitlementDoesNotExist","inputs":[]},{"type":"error","name":"EntitlementsService__InvalidEntitlementAddress","inputs":[]},{"type":"error","name":"EntitlementsService__InvalidEntitlementInterface","inputs":[]},{"type":"error","name":"MintERC2309QuantityExceedsLimit","inputs":[]},{"type":"error","name":"MintToZeroAddress","inputs":[]},{"type":"error","name":"MintZeroQuantity","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]},{"type":"error","name":"OwnerQueryForNonexistentToken","inputs":[]},{"type":"error","name":"OwnershipNotInitializedForExtraData","inputs":[]},{"type":"error","name":"Pausable__NotPaused","inputs":[]},{"type":"error","name":"Pausable__Paused","inputs":[]},{"type":"error","name":"Roles__EntitlementAlreadyExists","inputs":[]},{"type":"error","name":"Roles__EntitlementDoesNotExist","inputs":[]},{"type":"error","name":"Roles__InvalidEntitlementAddress","inputs":[]},{"type":"error","name":"Roles__InvalidPermission","inputs":[]},{"type":"error","name":"Roles__PermissionAlreadyExists","inputs":[]},{"type":"error","name":"Roles__PermissionDoesNotExist","inputs":[]},{"type":"error","name":"Roles__RoleDoesNotExist","inputs":[]},{"type":"error","name":"TransferCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"TransferFromIncorrectOwner","inputs":[]},{"type":"error","name":"TransferToNonERC721ReceiverImplementer","inputs":[]},{"type":"error","name":"TransferToZeroAddress","inputs":[]},{"type":"error","name":"URIQueryForNonexistentToken","inputs":[]},{"type":"error","name":"Validator__InvalidByteLength","inputs":[]},{"type":"error","name":"Validator__InvalidStringLength","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b50613114806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80639a8e4c3e116100665780639a8e4c3e1461012a578063b42642331461013d578063b75157611461015d578063ba201ba814610170578063dba818641461018357600080fd5b80634d8b50a2146100a357806371061398146100b8578063784c872b146100d65780638fcd793d146100f65780639269182114610117575b600080fd5b6100b66100b13660046128d9565b610196565b005b6100c06101e7565b6040516100cd9190612aaf565b60405180910390f35b6100e96100e4366004612b13565b6101f6565b6040516100cd9190612b2c565b610109610104366004612b3f565b610242565b6040519081526020016100cd565b6100b6610125366004612b13565b61028d565b6100b6610138366004612bcc565b6102d6565b61015061014b366004612b13565b610321565b6040516100cd9190612c12565b6100b661016b366004612bcc565b61032c565b6100b661017e366004612c69565b610373565b6100b6610191366004612c69565b6103ba565b6101ca604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6101d385610429565b6101e08585858585610470565b5050505050565b60606101f161076d565b905090565b61022a6040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b61023382610429565b61023c826108af565b92915050565b6000610278604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b61028485858585610928565b95945050505050565b6102c1604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6102ca81610429565b6102d381610b0b565b50565b61030a604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b61031382610429565b61031d8282610d6f565b5050565b606061023c82610e5a565b610360604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b61036982610429565b61031d8282610e6e565b6103a7604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6103b082610429565b61031d8282610f1f565b6103ee604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6103f782610429565b61031d8282610f54565b61040c600082610f79565b6102d357604051630ce39a4b60e21b815260040160405180910390fd5b6104537f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0182610ffd565b6102d35760405163a3f70f7b60e01b815260040160405180910390fd5b600061047b86611018565b80518351919250906000816001600160401b0381111561049d5761049d612654565b6040519080825280602002602001820160405280156104c6578160200160208202803683370190505b50905060005b828110156105595760008682815181106104e8576104e8612ca5565b60200260200101516000015190506104ff8161111c565b610508816111e5565b86828151811061051a5761051a612ca5565b60200260200101516000015183838151811061053857610538612ca5565b6001600160a01b0390921660209283029190910190910152506001016104cc565b5086156105885760008981526000805160206130f483398151915260205260409020610586888a83612d37565b505b8551156105ce5760008981526000805160206130f4833981519152602052604081206105b69060020161124d565b90506105c28a82610d6f565b6105cc8a88610e6e565b505b816000036105df57505050506101e0565b80511561065857805160005b8481101561061e576106168b87838151811061060957610609612ca5565b6020026020010151611258565b6001016105eb565b5060005b818110156106555761064d8b84838151811061064057610640612ca5565b60200260200101516112d0565b600101610622565b50505b60005b8381101561068e5761068685828151811061067857610678612ca5565b60200260200101518b611343565b60010161065b565b5060005b828110156107345760008682815181106106ae576106ae612ca5565b60200260200101516020015151111561072c576106e78682815181106106d6576106d6612ca5565b6020026020010151602001516113aa565b61072c8682815181106106fc576106fc612ca5565b6020026020010151600001518b88848151811061071b5761071b612ca5565b6020026020010151602001516113cc565b600101610692565b50604051899033907f1aff41ff8e9139aae6bb355cc69107cda7e1d1dcd25511da436f3171bdbf77e690600090a3505050505050505050565b6060600061077961143a565b8051909150806001600160401b0381111561079657610796612654565b6040519080825280602002602001820160405280156107fb57816020015b6107e86040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b8152602001906001900390816107b45790505b50925060005b818110156108a95760008060008061083187868151811061082457610824612ca5565b6020026020010151611465565b93509350935093506040518060a0016040528088878151811061085657610856612ca5565b6020026020010151815260200185815260200184151581526020018381526020018281525088868151811061088d5761088d612ca5565b6020026020010181905250848060010195505050505050610801565b50505090565b6108e36040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b6000806000806108f286611465565b6040805160a0810182529a8b5260208b019490945291151592890192909252606088019190915260808701525093949350505050565b600061096c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506002925061157e915050565b81516000816001600160401b0381111561098857610988612654565b6040519080825280602002602001820160405280156109b1578160200160208202803683370190505b5090506109bc6115a7565b925060005b82811015610a90576109ef8582815181106109de576109de612ca5565b60200260200101516000015161111c565b848181518110610a0157610a01612ca5565b602002602001015160000151828281518110610a1f57610a1f612ca5565b60200260200101906001600160a01b031690816001600160a01b031681525050610a548582815181106106d6576106d6612ca5565b610a88858281518110610a6957610a69612ca5565b6020026020010151600001518587848151811061071b5761071b612ca5565b6001016109c1565b50610ad387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525092508991508590506115cd565b50604051839033907f20a7a288530dd94b1eccaa691a582ecfd7550c9dfcee78ddf50a97f774a2b14790600090a35050949350505050565b6000610b1682611018565b80519091506000805160206130d4833981519152610b547f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01856116f6565b506000848152600382016020526040812090610b708282612564565b60018201805460ff19169055600282016000610b8c828261259e565b50506004820160008181610ba082826125bc565b5050604080516020808201835260008083528b815260038901909152919091209450610bd193509150839050612df6565b506000848152600382016020526040812060018101805460ff19169055610bfa90600201611702565b6000868152600384016020526040812091925090610c1a90600401611702565b905060005b82811015610c6a5760008781526003850160205260409020610c6190610c48906002018361170c565b6000898152600387016020526040902060020190611718565b50600101610c1f565b5060005b81811015610cb95760008781526003850160205260409020610cb090610c979060040183611724565b6000898152600387016020526040902060040190611730565b50600101610c6e565b506000610cc587611745565b805190915060005b81811015610d0057610cf8838281518110610cea57610cea612ca5565b60200260200101518a611831565b600101610ccd565b5060005b86811015610d3757610d2f888281518110610d2157610d21612ca5565b60200260200101518a611343565b600101610d04565b50604051889033907f268a6f1b90f6f5ddf50cc736d36513e80cdc5fd56326bff71f335e8b4b61d05590600090a35050505050505050565b80516000805160206130d48339815191529060005b818110156101e057610dae848281518110610da157610da1612ca5565b60200260200101516118c1565b610df1848281518110610dc357610dc3612ca5565b60200260200101518460030160008881526020019081526020016000206002016118e290919063ffffffff16565b610e0e57604051633e2b026160e01b815260040160405180910390fd5b610e51848281518110610e2357610e23612ca5565b602002602001015184600301600088815260200190815260200160002060020161171890919063ffffffff16565b50600101610d84565b6060610e6582611465565b50949350505050565b80516000805160206130d48339815191529060005b818110156101e057610ea0848281518110610da157610da1612ca5565b610eb5848281518110610dc357610dc3612ca5565b15610ed35760405163b0ab682160e01b815260040160405180910390fd5b610f16848281518110610ee857610ee8612ca5565b60200260200101518460030160008881526020019081526020016000206002016118ee90919063ffffffff16565b50600101610e83565b610f2882610429565b8051610f33906111e5565b610f418282600001516112d0565b61031d81600001518383602001516113cc565b8051610f5f906111e5565b610f6d828260000151611258565b805161031d9083611343565b60003380610f856118fa565b6001600160a01b03161480610ff557507fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff16158015610ff55750610ff5848285604051602001610fd89190612eb5565b604051602081830303815290604052610ff090612ed1565b6119be565b949350505050565b600081815260018301602052604081205415155b9392505050565b60008181526000805160206130f4833981519152602052604081206060919061104390600401611702565b6001600160401b0381111561105a5761105a612654565b604051908082528060200260200182016040528015611083578160200160208202803683370190505b50905060005b60008481526000805160206130f4833981519152602052604090206110b090600401611702565b8110156111155760008481526000805160206130f4833981519152602052604081206110df9060040183611724565b9050808383815181106110f4576110f4612ca5565b6001600160a01b039092166020928302919091019091015250600101611089565b5092915050565b6001600160a01b03811661114357604051630706e15760e51b815260040160405180910390fd5b6040516301ffc9a760e01b8152637bc2cb4560e11b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa9250505080156111aa575060408051601f3d908101601f191682019092526111a791810190612ef5565b60015b6111c75760405163f58a5f2760e01b815260040160405180910390fd5b8061031d5760405163f58a5f2760e01b815260040160405180910390fd5b7fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006112307fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c9310183611c6b565b61031d5760405163017ab33760e71b815260040160405180910390fd5b606061023c82611c8d565b60008281526000805160206130f4833981519152602052604090206000805160206130d4833981519152906112909060040183611c6b565b6112ad57604051632405297d60e11b815260040160405180910390fd5b600083815260038201602052604090206112ca9060040183611730565b50505050565b60008281526000805160206130f4833981519152602052604090206000805160206130d4833981519152906113089060040183611c6b565b156113265760405163fb5584f160e01b815260040160405180910390fd5b600083815260038201602052604090206112ca9060040183611d6a565b61134c826111e5565b60405163f0c111f960e01b8152600481018290526001600160a01b0383169063f0c111f990602401600060405180830381600087803b15801561138e57600080fd5b505af11580156113a2573d6000803e3d6000fd5b505050505050565b80516000036102d3576040516319c6193b60e31b815260040160405180910390fd5b6113d5836111e5565b604051633be2f95d60e21b81526001600160a01b0384169063ef8be574906114039085908590600401612f17565b600060405180830381600087803b15801561141d57600080fd5b505af1158015611431573d6000803e3d6000fd5b50505050505050565b60606101f17f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01611d7f565b60008181526000805160206130f483398151915260205260408120805460609291839182919061149490612cbb565b80601f01602080910402602001604051908101604052809291908181526020018280546114c090612cbb565b801561150d5780601f106114e25761010080835404028352916020019161150d565b820191906000526020600020905b8154815290600101906020018083116114f057829003601f168201915b505050505093506115296000805160206130d483398151915290565b600086815260039190910160209081526040808320600101546000805160206130f483398151915290925290912060ff909116935061156a9060020161124d565b915061157585611018565b90509193509193565b815182908211156115a2576040516374eb20a760e01b815260040160405180910390fd5b505050565b6000805160206130d48339815191528054600091906115c7906001612f46565b91505090565b6000805160206130d4833981519152805460009190819083906115ef90612f59565b918290555091506116036001820183611d8c565b506000828152600382016020526040902061161e8782612df6565b5060008281526003820160205260409020600101805460ff19168615151790556116488285610e6e565b60005b83518110156116ec5760006001600160a01b031684828151811061167157611671612ca5565b60200260200101516001600160a01b0316036116a057604051637442429b60e01b815260040160405180910390fd5b6116e38482815181106116b5576116b5612ca5565b6020026020010151836003016000868152602001908152602001600020600401611d6a90919063ffffffff16565b5060010161164b565b5050949350505050565b60006110118383611d98565b600061023c825490565b60606110118383611e8b565b60006110118383611f3d565b600061101183836120f2565b6000611011836001600160a01b038416611d98565b60606000805160206130b4833981519152600061176182611702565b90506000816001600160401b0381111561177d5761177d612654565b6040519080825280602002602001820160405280156117a6578160200160208202803683370190505b50935060005b828110156118165760006117c08583611724565b600081815260038701602052604090209091506117dd9088610ffd565b1561180d578086846117ee81612f59565b95508151811061180057611800612ca5565b6020026020010181815250505b506001016117ac565b5080821115611829578351818303900384525b505050919050565b61183a8261211c565b61184382612151565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504303602052604090206000805160206130b48339815191529061188a9083610ffd565b6118a7576040516333cb039f60e11b815260040160405180910390fd5b600083815260038201602052604090206112ca90836116f6565b80516000036102d35760405162ce76c160e41b815260040160405180910390fd5b600061101183836121b3565b600061101183836121e0565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa15801561199a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c79190612f72565b6000806119c96118fa565b905060006119d685612242565b805190915060006119e56123c0565b805190915060005b83811015611aa4576000858281518110611a0957611a09612ca5565b60200260200101519050866001600160a01b0316816001600160a01b031603611a3c576001975050505050505050611011565b60005b83811015611a9a57816001600160a01b0316611a73868381518110611a6657611a66612ca5565b60200260200101516123eb565b6001600160a01b031603611a9257600098505050505050505050611011565b600101611a3f565b50506001016119ed565b507fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006000611af17fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c93101611702565b905060005b81811015611c595760008381611b0f6001830185611724565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015611b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbc9190612ef5565b158015611c39575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401611bf893929190612f8f565b602060405180830381865afa158015611c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c399190612ef5565b15611c505760019950505050505050505050611011565b50600101611af6565b5060009b9a5050505050505050505050565b6001600160a01b03811660009081526001830160205260408120541515611011565b606081600001805480602002602001604051908101604052809291908181526020016000905b82821015611d5f578382906000526020600020018054611cd290612cbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611cfe90612cbb565b8015611d4b5780601f10611d2057610100808354040283529160200191611d4b565b820191906000526020600020905b815481529060010190602001808311611d2e57829003601f168201915b505050505081526020019060010190611cb3565b505050509050919050565b6000611011836001600160a01b0384166123f6565b606060006110118361243d565b600061101183836123f6565b60008181526001830160205260408120548015611e81576000611dbc600183612ff1565b8554909150600090611dd090600190612ff1565b9050808214611e35576000866000018281548110611df057611df0612ca5565b9060005260206000200154905080876000018481548110611e1357611e13612ca5565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611e4657611e46613004565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061023c565b600091505061023c565b6060826000018281548110611ea257611ea2612ca5565b906000526020600020018054611eb790612cbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee390612cbb565b8015611f305780601f10611f0557610100808354040283529160200191611f30565b820191906000526020600020905b815481529060010190602001808311611f1357829003601f168201915b5050505050905092915050565b6000808360010183604051611f529190612eb5565b908152602001604051809103902054905080600014611e81576000611f78600183612ff1565b8554909150600090611f8c90600190612ff1565b9050818114612093576000866000018281548110611fac57611fac612ca5565b906000526020600020018054611fc190612cbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611fed90612cbb565b801561203a5780601f1061200f5761010080835404028352916020019161203a565b820191906000526020600020905b81548152906001019060200180831161201d57829003601f168201915b505050505090508087600001848154811061205757612057612ca5565b90600052602060002001908161206d9190612df6565b508387600101826040516120819190612eb5565b90815260405190819003602001902055505b85548690806120a4576120a4613004565b6001900381819060005260206000200160006120c09190612564565b905585600101856040516120d49190612eb5565b9081526020016040518091039020600090556001935050505061023c565b600082600001828154811061210957612109612ca5565b9060005260206000200154905092915050565b6121346000805160206130b483398151915282610ffd565b6102d35760405163560b4b4160e11b815260040160405180910390fd5b60008181527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430260205260409020600101546000805160206130b48339815191529060ff161561031d57604051636ce0028960e11b815260040160405180910390fd5b600082600101826040516121c79190612eb5565b9081526040519081900360200190205415159392505050565b60006121ec83836121b3565b61223a5782546001810184556000848152602090200161220c8382612df6565b5082546040516001850190612222908590612eb5565b9081526040519081900360200190205550600161023c565b50600061023c565b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa1580156122b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122df919081019061301a565b805190915060006122f1826001612f46565b6001600160401b0381111561230857612308612654565b604051908082528060200260200182016040528015612331578160200160208202803683370190505b50905060005b8281101561238b5783818151811061235157612351612ca5565b602002602001015182828151811061236b5761236b612ca5565b6001600160a01b0390921660209283029190910190910152600101612337565b508581838151811061239f5761239f612ca5565b6001600160a01b039092166020928302919091019091015295945050505050565b60606101f17f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611d7f565b600061023c82612499565b600081815260018301602052604081205461223a5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561023c565b60608160000180548060200260200160405190810160405280929190818152602001828054801561248d57602002820191906000526020600020905b815481526020019060010190808311612479575b50505050509050919050565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b8316900361254a5781600003612544578054831061252057604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115612521575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b50805461257090612cbb565b6000825580601f10612580575050565b601f0160209004906000526020600020908101906102d391906125d6565b50805460008255906000526020600020908101906102d391906125ef565b50805460008255906000526020600020908101906102d391905b5b808211156125eb57600081556001016125d7565b5090565b808211156125eb5760006126038282612564565b506001016125ef565b60008083601f84011261261e57600080fd5b5081356001600160401b0381111561263557600080fd5b60208301915083602082850101111561264d57600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561269257612692612654565b604052919050565b60006001600160401b038211156126b3576126b3612654565b5060051b60200190565b60006001600160401b038311156126d6576126d6612654565b6126e9601f8401601f191660200161266a565b90508281528383830111156126fd57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261272557600080fd5b8135602061273a6127358361269a565b61266a565b82815260059290921b8401810191818101908684111561275957600080fd5b8286015b848110156127ad5780356001600160401b0381111561277c5760008081fd5b8701603f8101891361278e5760008081fd5b61279f8986830135604084016126bd565b84525091830191830161275d565b509695505050505050565b6001600160a01b03811681146102d357600080fd5b6000604082840312156127df57600080fd5b604051604081016001600160401b03828210818311171561280257612802612654565b8160405282935084359150612816826127b8565b9082526020840135908082111561282c57600080fd5b508301601f8101851361283e57600080fd5b61284d858235602084016126bd565b6020830152505092915050565b600082601f83011261286b57600080fd5b8135602061287b6127358361269a565b82815260059290921b8401810191818101908684111561289a57600080fd5b8286015b848110156127ad5780356001600160401b038111156128bd5760008081fd5b6128cb8986838b01016127cd565b84525091830191830161289e565b6000806000806000608086880312156128f157600080fd5b8535945060208601356001600160401b038082111561290f57600080fd5b61291b89838a0161260c565b9096509450604088013591508082111561293457600080fd5b61294089838a01612714565b9350606088013591508082111561295657600080fd5b506129638882890161285a565b9150509295509295909350565b60005b8381101561298b578181015183820152602001612973565b50506000910152565b600081518084526129ac816020860160208601612970565b601f01601f19169290920160200192915050565b60008151808452602080850194506020840160005b838110156129fa5781516001600160a01b0316875295820195908201906001016129d5565b509495945050505050565b80518252600060208083015160a082860152612a2460a0860182612994565b9050604084015115156040860152606084015185820360608701528181518084528484019150848160051b850101858401935060005b82811015612a8857601f19868303018452612a76828651612994565b94870194938701939150600101612a5a565b506080880151955088810360808a0152612aa281876129c0565b9998505050505050505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015612b0657603f19888603018452612af4858351612a05565b94509285019290850190600101612ad8565b5092979650505050505050565b600060208284031215612b2557600080fd5b5035919050565b6020815260006110116020830184612a05565b60008060008060608587031215612b5557600080fd5b84356001600160401b0380821115612b6c57600080fd5b612b788883890161260c565b90965094506020870135915080821115612b9157600080fd5b612b9d88838901612714565b93506040870135915080821115612bb357600080fd5b50612bc08782880161285a565b91505092959194509250565b60008060408385031215612bdf57600080fd5b8235915060208301356001600160401b03811115612bfc57600080fd5b612c0885828601612714565b9150509250929050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015612b0657603f19888603018452612c57858351612994565b94509285019290850190600101612c3b565b60008060408385031215612c7c57600080fd5b8235915060208301356001600160401b03811115612c9957600080fd5b612c08858286016127cd565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680612ccf57607f821691505b60208210810361254457634e487b7160e01b600052602260045260246000fd5b601f8211156115a2576000816000526020600020601f850160051c81016020861015612d185750805b601f850160051c820191505b818110156113a257828155600101612d24565b6001600160401b03831115612d4e57612d4e612654565b612d6283612d5c8354612cbb565b83612cef565b6000601f841160018114612d965760008515612d7e5750838201355b600019600387901b1c1916600186901b1783556101e0565b600083815260209020601f19861690835b82811015612dc75786850135825560209485019460019092019101612da7565b5086821015612de45760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81516001600160401b03811115612e0f57612e0f612654565b612e2381612e1d8454612cbb565b84612cef565b602080601f831160018114612e585760008415612e405750858301515b600019600386901b1c1916600185901b1785556113a2565b600085815260208120601f198616915b82811015612e8757888601518255948401946001909101908401612e68565b5085821015612ea55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251612ec7818460208701612970565b9190910192915050565b805160208083015191908110156125445760001960209190910360031b1b16919050565b600060208284031215612f0757600080fd5b8151801515811461101157600080fd5b828152604060208201526000610ff56040830184612994565b634e487b7160e01b600052601160045260246000fd5b8082018082111561023c5761023c612f30565b600060018201612f6b57612f6b612f30565b5060010190565b600060208284031215612f8457600080fd5b8151611011816127b8565b60006060820185835260206060602085015281865180845260808601915060208801935060005b81811015612fdb5784516001600160a01b031683529383019391830191600101612fb6565b5050809350505050826040830152949350505050565b8181038181111561023c5761023c612f30565b634e487b7160e01b600052603160045260246000fd5b6000602080838503121561302d57600080fd5b82516001600160401b0381111561304357600080fd5b8301601f8101851361305457600080fd5b80516130626127358261269a565b81815260059190911b8201830190838101908783111561308157600080fd5b928401925b828410156130a8578351613099816127b8565b82529284019290840190613086565b97965050505050505056fe804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504300672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd00672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd03","sourceMap":"303:2281:241:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b506004361061009e5760003560e01c80639a8e4c3e116100665780639a8e4c3e1461012a578063b42642331461013d578063b75157611461015d578063ba201ba814610170578063dba818641461018357600080fd5b80634d8b50a2146100a357806371061398146100b8578063784c872b146100d65780638fcd793d146100f65780639269182114610117575b600080fd5b6100b66100b13660046128d9565b610196565b005b6100c06101e7565b6040516100cd9190612aaf565b60405180910390f35b6100e96100e4366004612b13565b6101f6565b6040516100cd9190612b2c565b610109610104366004612b3f565b610242565b6040519081526020016100cd565b6100b6610125366004612b13565b61028d565b6100b6610138366004612bcc565b6102d6565b61015061014b366004612b13565b610321565b6040516100cd9190612c12565b6100b661016b366004612bcc565b61032c565b6100b661017e366004612c69565b610373565b6100b6610191366004612c69565b6103ba565b6101ca604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6101d385610429565b6101e08585858585610470565b5050505050565b60606101f161076d565b905090565b61022a6040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b61023382610429565b61023c826108af565b92915050565b6000610278604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b61028485858585610928565b95945050505050565b6102c1604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6102ca81610429565b6102d381610b0b565b50565b61030a604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b61031382610429565b61031d8282610d6f565b5050565b606061023c82610e5a565b610360604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b61036982610429565b61031d8282610e6e565b6103a7604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6103b082610429565b61031d8282610f1f565b6103ee604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6103f782610429565b61031d8282610f54565b61040c600082610f79565b6102d357604051630ce39a4b60e21b815260040160405180910390fd5b6104537f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0182610ffd565b6102d35760405163a3f70f7b60e01b815260040160405180910390fd5b600061047b86611018565b80518351919250906000816001600160401b0381111561049d5761049d612654565b6040519080825280602002602001820160405280156104c6578160200160208202803683370190505b50905060005b828110156105595760008682815181106104e8576104e8612ca5565b60200260200101516000015190506104ff8161111c565b610508816111e5565b86828151811061051a5761051a612ca5565b60200260200101516000015183838151811061053857610538612ca5565b6001600160a01b0390921660209283029190910190910152506001016104cc565b5086156105885760008981526000805160206130f483398151915260205260409020610586888a83612d37565b505b8551156105ce5760008981526000805160206130f4833981519152602052604081206105b69060020161124d565b90506105c28a82610d6f565b6105cc8a88610e6e565b505b816000036105df57505050506101e0565b80511561065857805160005b8481101561061e576106168b87838151811061060957610609612ca5565b6020026020010151611258565b6001016105eb565b5060005b818110156106555761064d8b84838151811061064057610640612ca5565b60200260200101516112d0565b600101610622565b50505b60005b8381101561068e5761068685828151811061067857610678612ca5565b60200260200101518b611343565b60010161065b565b5060005b828110156107345760008682815181106106ae576106ae612ca5565b60200260200101516020015151111561072c576106e78682815181106106d6576106d6612ca5565b6020026020010151602001516113aa565b61072c8682815181106106fc576106fc612ca5565b6020026020010151600001518b88848151811061071b5761071b612ca5565b6020026020010151602001516113cc565b600101610692565b50604051899033907f1aff41ff8e9139aae6bb355cc69107cda7e1d1dcd25511da436f3171bdbf77e690600090a3505050505050505050565b6060600061077961143a565b8051909150806001600160401b0381111561079657610796612654565b6040519080825280602002602001820160405280156107fb57816020015b6107e86040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b8152602001906001900390816107b45790505b50925060005b818110156108a95760008060008061083187868151811061082457610824612ca5565b6020026020010151611465565b93509350935093506040518060a0016040528088878151811061085657610856612ca5565b6020026020010151815260200185815260200184151581526020018381526020018281525088868151811061088d5761088d612ca5565b6020026020010181905250848060010195505050505050610801565b50505090565b6108e36040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b6000806000806108f286611465565b6040805160a0810182529a8b5260208b019490945291151592890192909252606088019190915260808701525093949350505050565b600061096c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506002925061157e915050565b81516000816001600160401b0381111561098857610988612654565b6040519080825280602002602001820160405280156109b1578160200160208202803683370190505b5090506109bc6115a7565b925060005b82811015610a90576109ef8582815181106109de576109de612ca5565b60200260200101516000015161111c565b848181518110610a0157610a01612ca5565b602002602001015160000151828281518110610a1f57610a1f612ca5565b60200260200101906001600160a01b031690816001600160a01b031681525050610a548582815181106106d6576106d6612ca5565b610a88858281518110610a6957610a69612ca5565b6020026020010151600001518587848151811061071b5761071b612ca5565b6001016109c1565b50610ad387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525092508991508590506115cd565b50604051839033907f20a7a288530dd94b1eccaa691a582ecfd7550c9dfcee78ddf50a97f774a2b14790600090a35050949350505050565b6000610b1682611018565b80519091506000805160206130d4833981519152610b547f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01856116f6565b506000848152600382016020526040812090610b708282612564565b60018201805460ff19169055600282016000610b8c828261259e565b50506004820160008181610ba082826125bc565b5050604080516020808201835260008083528b815260038901909152919091209450610bd193509150839050612df6565b506000848152600382016020526040812060018101805460ff19169055610bfa90600201611702565b6000868152600384016020526040812091925090610c1a90600401611702565b905060005b82811015610c6a5760008781526003850160205260409020610c6190610c48906002018361170c565b6000898152600387016020526040902060020190611718565b50600101610c1f565b5060005b81811015610cb95760008781526003850160205260409020610cb090610c979060040183611724565b6000898152600387016020526040902060040190611730565b50600101610c6e565b506000610cc587611745565b805190915060005b81811015610d0057610cf8838281518110610cea57610cea612ca5565b60200260200101518a611831565b600101610ccd565b5060005b86811015610d3757610d2f888281518110610d2157610d21612ca5565b60200260200101518a611343565b600101610d04565b50604051889033907f268a6f1b90f6f5ddf50cc736d36513e80cdc5fd56326bff71f335e8b4b61d05590600090a35050505050505050565b80516000805160206130d48339815191529060005b818110156101e057610dae848281518110610da157610da1612ca5565b60200260200101516118c1565b610df1848281518110610dc357610dc3612ca5565b60200260200101518460030160008881526020019081526020016000206002016118e290919063ffffffff16565b610e0e57604051633e2b026160e01b815260040160405180910390fd5b610e51848281518110610e2357610e23612ca5565b602002602001015184600301600088815260200190815260200160002060020161171890919063ffffffff16565b50600101610d84565b6060610e6582611465565b50949350505050565b80516000805160206130d48339815191529060005b818110156101e057610ea0848281518110610da157610da1612ca5565b610eb5848281518110610dc357610dc3612ca5565b15610ed35760405163b0ab682160e01b815260040160405180910390fd5b610f16848281518110610ee857610ee8612ca5565b60200260200101518460030160008881526020019081526020016000206002016118ee90919063ffffffff16565b50600101610e83565b610f2882610429565b8051610f33906111e5565b610f418282600001516112d0565b61031d81600001518383602001516113cc565b8051610f5f906111e5565b610f6d828260000151611258565b805161031d9083611343565b60003380610f856118fa565b6001600160a01b03161480610ff557507fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff16158015610ff55750610ff5848285604051602001610fd89190612eb5565b604051602081830303815290604052610ff090612ed1565b6119be565b949350505050565b600081815260018301602052604081205415155b9392505050565b60008181526000805160206130f4833981519152602052604081206060919061104390600401611702565b6001600160401b0381111561105a5761105a612654565b604051908082528060200260200182016040528015611083578160200160208202803683370190505b50905060005b60008481526000805160206130f4833981519152602052604090206110b090600401611702565b8110156111155760008481526000805160206130f4833981519152602052604081206110df9060040183611724565b9050808383815181106110f4576110f4612ca5565b6001600160a01b039092166020928302919091019091015250600101611089565b5092915050565b6001600160a01b03811661114357604051630706e15760e51b815260040160405180910390fd5b6040516301ffc9a760e01b8152637bc2cb4560e11b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa9250505080156111aa575060408051601f3d908101601f191682019092526111a791810190612ef5565b60015b6111c75760405163f58a5f2760e01b815260040160405180910390fd5b8061031d5760405163f58a5f2760e01b815260040160405180910390fd5b7fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006112307fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c9310183611c6b565b61031d5760405163017ab33760e71b815260040160405180910390fd5b606061023c82611c8d565b60008281526000805160206130f4833981519152602052604090206000805160206130d4833981519152906112909060040183611c6b565b6112ad57604051632405297d60e11b815260040160405180910390fd5b600083815260038201602052604090206112ca9060040183611730565b50505050565b60008281526000805160206130f4833981519152602052604090206000805160206130d4833981519152906113089060040183611c6b565b156113265760405163fb5584f160e01b815260040160405180910390fd5b600083815260038201602052604090206112ca9060040183611d6a565b61134c826111e5565b60405163f0c111f960e01b8152600481018290526001600160a01b0383169063f0c111f990602401600060405180830381600087803b15801561138e57600080fd5b505af11580156113a2573d6000803e3d6000fd5b505050505050565b80516000036102d3576040516319c6193b60e31b815260040160405180910390fd5b6113d5836111e5565b604051633be2f95d60e21b81526001600160a01b0384169063ef8be574906114039085908590600401612f17565b600060405180830381600087803b15801561141d57600080fd5b505af1158015611431573d6000803e3d6000fd5b50505050505050565b60606101f17f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01611d7f565b60008181526000805160206130f483398151915260205260408120805460609291839182919061149490612cbb565b80601f01602080910402602001604051908101604052809291908181526020018280546114c090612cbb565b801561150d5780601f106114e25761010080835404028352916020019161150d565b820191906000526020600020905b8154815290600101906020018083116114f057829003601f168201915b505050505093506115296000805160206130d483398151915290565b600086815260039190910160209081526040808320600101546000805160206130f483398151915290925290912060ff909116935061156a9060020161124d565b915061157585611018565b90509193509193565b815182908211156115a2576040516374eb20a760e01b815260040160405180910390fd5b505050565b6000805160206130d48339815191528054600091906115c7906001612f46565b91505090565b6000805160206130d4833981519152805460009190819083906115ef90612f59565b918290555091506116036001820183611d8c565b506000828152600382016020526040902061161e8782612df6565b5060008281526003820160205260409020600101805460ff19168615151790556116488285610e6e565b60005b83518110156116ec5760006001600160a01b031684828151811061167157611671612ca5565b60200260200101516001600160a01b0316036116a057604051637442429b60e01b815260040160405180910390fd5b6116e38482815181106116b5576116b5612ca5565b6020026020010151836003016000868152602001908152602001600020600401611d6a90919063ffffffff16565b5060010161164b565b5050949350505050565b60006110118383611d98565b600061023c825490565b60606110118383611e8b565b60006110118383611f3d565b600061101183836120f2565b6000611011836001600160a01b038416611d98565b60606000805160206130b4833981519152600061176182611702565b90506000816001600160401b0381111561177d5761177d612654565b6040519080825280602002602001820160405280156117a6578160200160208202803683370190505b50935060005b828110156118165760006117c08583611724565b600081815260038701602052604090209091506117dd9088610ffd565b1561180d578086846117ee81612f59565b95508151811061180057611800612ca5565b6020026020010181815250505b506001016117ac565b5080821115611829578351818303900384525b505050919050565b61183a8261211c565b61184382612151565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504303602052604090206000805160206130b48339815191529061188a9083610ffd565b6118a7576040516333cb039f60e11b815260040160405180910390fd5b600083815260038201602052604090206112ca90836116f6565b80516000036102d35760405162ce76c160e41b815260040160405180910390fd5b600061101183836121b3565b600061101183836121e0565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa15801561199a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c79190612f72565b6000806119c96118fa565b905060006119d685612242565b805190915060006119e56123c0565b805190915060005b83811015611aa4576000858281518110611a0957611a09612ca5565b60200260200101519050866001600160a01b0316816001600160a01b031603611a3c576001975050505050505050611011565b60005b83811015611a9a57816001600160a01b0316611a73868381518110611a6657611a66612ca5565b60200260200101516123eb565b6001600160a01b031603611a9257600098505050505050505050611011565b600101611a3f565b50506001016119ed565b507fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006000611af17fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c93101611702565b905060005b81811015611c595760008381611b0f6001830185611724565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015611b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbc9190612ef5565b158015611c39575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401611bf893929190612f8f565b602060405180830381865afa158015611c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c399190612ef5565b15611c505760019950505050505050505050611011565b50600101611af6565b5060009b9a5050505050505050505050565b6001600160a01b03811660009081526001830160205260408120541515611011565b606081600001805480602002602001604051908101604052809291908181526020016000905b82821015611d5f578382906000526020600020018054611cd290612cbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611cfe90612cbb565b8015611d4b5780601f10611d2057610100808354040283529160200191611d4b565b820191906000526020600020905b815481529060010190602001808311611d2e57829003601f168201915b505050505081526020019060010190611cb3565b505050509050919050565b6000611011836001600160a01b0384166123f6565b606060006110118361243d565b600061101183836123f6565b60008181526001830160205260408120548015611e81576000611dbc600183612ff1565b8554909150600090611dd090600190612ff1565b9050808214611e35576000866000018281548110611df057611df0612ca5565b9060005260206000200154905080876000018481548110611e1357611e13612ca5565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611e4657611e46613004565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061023c565b600091505061023c565b6060826000018281548110611ea257611ea2612ca5565b906000526020600020018054611eb790612cbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee390612cbb565b8015611f305780601f10611f0557610100808354040283529160200191611f30565b820191906000526020600020905b815481529060010190602001808311611f1357829003601f168201915b5050505050905092915050565b6000808360010183604051611f529190612eb5565b908152602001604051809103902054905080600014611e81576000611f78600183612ff1565b8554909150600090611f8c90600190612ff1565b9050818114612093576000866000018281548110611fac57611fac612ca5565b906000526020600020018054611fc190612cbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611fed90612cbb565b801561203a5780601f1061200f5761010080835404028352916020019161203a565b820191906000526020600020905b81548152906001019060200180831161201d57829003601f168201915b505050505090508087600001848154811061205757612057612ca5565b90600052602060002001908161206d9190612df6565b508387600101826040516120819190612eb5565b90815260405190819003602001902055505b85548690806120a4576120a4613004565b6001900381819060005260206000200160006120c09190612564565b905585600101856040516120d49190612eb5565b9081526020016040518091039020600090556001935050505061023c565b600082600001828154811061210957612109612ca5565b9060005260206000200154905092915050565b6121346000805160206130b483398151915282610ffd565b6102d35760405163560b4b4160e11b815260040160405180910390fd5b60008181527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430260205260409020600101546000805160206130b48339815191529060ff161561031d57604051636ce0028960e11b815260040160405180910390fd5b600082600101826040516121c79190612eb5565b9081526040519081900360200190205415159392505050565b60006121ec83836121b3565b61223a5782546001810184556000848152602090200161220c8382612df6565b5082546040516001850190612222908590612eb5565b9081526040519081900360200190205550600161023c565b50600061023c565b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa1580156122b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122df919081019061301a565b805190915060006122f1826001612f46565b6001600160401b0381111561230857612308612654565b604051908082528060200260200182016040528015612331578160200160208202803683370190505b50905060005b8281101561238b5783818151811061235157612351612ca5565b602002602001015182828151811061236b5761236b612ca5565b6001600160a01b0390921660209283029190910190910152600101612337565b508581838151811061239f5761239f612ca5565b6001600160a01b039092166020928302919091019091015295945050505050565b60606101f17f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611d7f565b600061023c82612499565b600081815260018301602052604081205461223a5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561023c565b60608160000180548060200260200160405190810160405280929190818152602001828054801561248d57602002820191906000526020600020905b815481526020019060010190808311612479575b50505050509050919050565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b8316900361254a5781600003612544578054831061252057604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115612521575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b50805461257090612cbb565b6000825580601f10612580575050565b601f0160209004906000526020600020908101906102d391906125d6565b50805460008255906000526020600020908101906102d391906125ef565b50805460008255906000526020600020908101906102d391905b5b808211156125eb57600081556001016125d7565b5090565b808211156125eb5760006126038282612564565b506001016125ef565b60008083601f84011261261e57600080fd5b5081356001600160401b0381111561263557600080fd5b60208301915083602082850101111561264d57600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561269257612692612654565b604052919050565b60006001600160401b038211156126b3576126b3612654565b5060051b60200190565b60006001600160401b038311156126d6576126d6612654565b6126e9601f8401601f191660200161266a565b90508281528383830111156126fd57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261272557600080fd5b8135602061273a6127358361269a565b61266a565b82815260059290921b8401810191818101908684111561275957600080fd5b8286015b848110156127ad5780356001600160401b0381111561277c5760008081fd5b8701603f8101891361278e5760008081fd5b61279f8986830135604084016126bd565b84525091830191830161275d565b509695505050505050565b6001600160a01b03811681146102d357600080fd5b6000604082840312156127df57600080fd5b604051604081016001600160401b03828210818311171561280257612802612654565b8160405282935084359150612816826127b8565b9082526020840135908082111561282c57600080fd5b508301601f8101851361283e57600080fd5b61284d858235602084016126bd565b6020830152505092915050565b600082601f83011261286b57600080fd5b8135602061287b6127358361269a565b82815260059290921b8401810191818101908684111561289a57600080fd5b8286015b848110156127ad5780356001600160401b038111156128bd5760008081fd5b6128cb8986838b01016127cd565b84525091830191830161289e565b6000806000806000608086880312156128f157600080fd5b8535945060208601356001600160401b038082111561290f57600080fd5b61291b89838a0161260c565b9096509450604088013591508082111561293457600080fd5b61294089838a01612714565b9350606088013591508082111561295657600080fd5b506129638882890161285a565b9150509295509295909350565b60005b8381101561298b578181015183820152602001612973565b50506000910152565b600081518084526129ac816020860160208601612970565b601f01601f19169290920160200192915050565b60008151808452602080850194506020840160005b838110156129fa5781516001600160a01b0316875295820195908201906001016129d5565b509495945050505050565b80518252600060208083015160a082860152612a2460a0860182612994565b9050604084015115156040860152606084015185820360608701528181518084528484019150848160051b850101858401935060005b82811015612a8857601f19868303018452612a76828651612994565b94870194938701939150600101612a5a565b506080880151955088810360808a0152612aa281876129c0565b9998505050505050505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015612b0657603f19888603018452612af4858351612a05565b94509285019290850190600101612ad8565b5092979650505050505050565b600060208284031215612b2557600080fd5b5035919050565b6020815260006110116020830184612a05565b60008060008060608587031215612b5557600080fd5b84356001600160401b0380821115612b6c57600080fd5b612b788883890161260c565b90965094506020870135915080821115612b9157600080fd5b612b9d88838901612714565b93506040870135915080821115612bb357600080fd5b50612bc08782880161285a565b91505092959194509250565b60008060408385031215612bdf57600080fd5b8235915060208301356001600160401b03811115612bfc57600080fd5b612c0885828601612714565b9150509250929050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015612b0657603f19888603018452612c57858351612994565b94509285019290850190600101612c3b565b60008060408385031215612c7c57600080fd5b8235915060208301356001600160401b03811115612c9957600080fd5b612c08858286016127cd565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680612ccf57607f821691505b60208210810361254457634e487b7160e01b600052602260045260246000fd5b601f8211156115a2576000816000526020600020601f850160051c81016020861015612d185750805b601f850160051c820191505b818110156113a257828155600101612d24565b6001600160401b03831115612d4e57612d4e612654565b612d6283612d5c8354612cbb565b83612cef565b6000601f841160018114612d965760008515612d7e5750838201355b600019600387901b1c1916600186901b1783556101e0565b600083815260209020601f19861690835b82811015612dc75786850135825560209485019460019092019101612da7565b5086821015612de45760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81516001600160401b03811115612e0f57612e0f612654565b612e2381612e1d8454612cbb565b84612cef565b602080601f831160018114612e585760008415612e405750858301515b600019600386901b1c1916600185901b1785556113a2565b600085815260208120601f198616915b82811015612e8757888601518255948401946001909101908401612e68565b5085821015612ea55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251612ec7818460208701612970565b9190910192915050565b805160208083015191908110156125445760001960209190910360031b1b16919050565b600060208284031215612f0757600080fd5b8151801515811461101157600080fd5b828152604060208201526000610ff56040830184612994565b634e487b7160e01b600052601160045260246000fd5b8082018082111561023c5761023c612f30565b600060018201612f6b57612f6b612f30565b5060010190565b600060208284031215612f8457600080fd5b8151611011816127b8565b60006060820185835260206060602085015281865180845260808601915060208801935060005b81811015612fdb5784516001600160a01b031683529383019391830191600101612fb6565b5050809350505050826040830152949350505050565b8181038181111561023c5761023c612f30565b634e487b7160e01b600052603160045260246000fd5b6000602080838503121561302d57600080fd5b82516001600160401b0381111561304357600080fd5b8301601f8101851361305457600080fd5b80516130626127358261269a565b81815260059190911b8201830190838101908783111561308157600080fd5b928401925b828410156130a8578351613099816127b8565b82529284019290840190613086565b97965050505050505056fe804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504300672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd00672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd03","sourceMap":"303:2281:241:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;903:317;;;;;;:::i;:::-;;:::i;:::-;;641:96;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;741:158;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;353:284::-;;;;;;:::i;:::-;;:::i;:::-;;;9949:25:516;;;9937:2;9922:18;353:284:241;9803:177:516;1224:164:241;;;;;;:::i;:::-;;:::i;1652:248::-;;;;;;:::i;:::-;;:::i;1904:166::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1410:238::-;;;;;;:::i;:::-;;:::i;2092:::-;;;;;;:::i;:::-;;:::i;2334:248::-;;;;;;:::i;:::-;;:::i;903:317::-;1079:44;1099:23;;;;;;;;;;;;;-1:-1:-1;;;1099:23:241;;;1079:19;:44::i;:::-;1129:24;1146:6;1129:16;:24::i;:::-;1159:56;1171:6;1179:8;;1189:11;1202:12;1159:11;:56::i;:::-;903:317;;;;;:::o;641:96::-;693:13;721:11;:9;:11::i;:::-;714:18;;641:96;:::o;741:158::-;818:11;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;818:11:241;837:24;854:6;837:16;:24::i;:::-;874:20;887:6;874:12;:20::i;:::-;867:27;741:158;-1:-1:-1;;741:158:241:o;353:284::-;512:7;527:44;547:23;;;;;;;;;;;;;-1:-1:-1;;;547:23:241;;;527:19;:44::i;:::-;584:48;596:8;;606:11;619:12;584:11;:48::i;:::-;577:55;353:284;-1:-1:-1;;;;;353:284:241:o;1224:164::-;1284:44;1304:23;;;;;;;;;;;;;-1:-1:-1;;;1304:23:241;;;1284:19;:44::i;:::-;1334:24;1351:6;1334:16;:24::i;:::-;1364:19;1376:6;1364:11;:19::i;:::-;1224:164;:::o;1652:248::-;1768:44;1788:23;;;;;;;;;;;;;-1:-1:-1;;;1788:23:241;;;1768:19;:44::i;:::-;1818:24;1835:6;1818:16;:24::i;:::-;1848:47;1875:6;1883:11;1848:26;:47::i;:::-;1652:248;;:::o;1904:166::-;1992:27;2034:31;2058:6;2034:23;:31::i;1410:238::-;1521:44;1541:23;;;;;;;;;;;;;-1:-1:-1;;;1541:23:241;;;1521:19;:44::i;:::-;1571:24;1588:6;1571:16;:24::i;:::-;1601:42;1623:6;1631:11;1601:21;:42::i;2092:238::-;2203:44;2223:23;;;;;;;;;;;;;-1:-1:-1;;;2223:23:241;;;2203:19;:44::i;:::-;2253:24;2270:6;2253:16;:24::i;:::-;2283:42;2305:6;2313:11;2283:21;:42::i;2334:248::-;2450:44;2470:23;;;;;;;;;;;;;-1:-1:-1;;;2470:23:241;;;2450:19;:44::i;:::-;2500:24;2517:6;2500:16;:24::i;:::-;2530:47;2557:6;2565:11;2530:26;:47::i;3809:164:192:-;3889:31;1445:3;3909:10;3889;:31::i;:::-;3884:85;;3937:25;;-1:-1:-1;;;3937:25:192;;;;;;;;;;;9295:194:242;9392:44;:27;9429:6;9392:36;:44::i;:::-;9387:98;;9453:25;;-1:-1:-1;;;9453:25:242;;;;;;;;;;;4642:2709;4863:41;4907:30;4930:6;4907:22;:30::i;:::-;4976:26;;5035:19;;4863:74;;-1:-1:-1;4976:26:242;4943:30;5035:19;-1:-1:-1;;;;;5105:47:242;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5105:47:242;;5060:92;;5164:9;5159:322;5183:15;5179:1;:19;5159:322;;;5210:14;5235:12;5248:1;5235:15;;;;;;;;:::i;:::-;;;;;;;:22;;;5210:48;;5266:54;5313:6;5266:46;:54::i;:::-;5328:51;5372:6;5328:43;:51::i;:::-;5413:12;5426:1;5413:15;;;;;;;;:::i;:::-;;;;;;;:22;;;5387:20;5408:1;5387:23;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5387:48:242;;;:23;;;;;;;;;;;:48;-1:-1:-1;5463:3:242;;5159:322;;;-1:-1:-1;5519:26:242;;5515:101;;5555:38;;;;-1:-1:-1;;;;;;;;;;;5555:38:242;;;;;:54;5601:8;;5555:38;:54;:::i;:::-;;5515:101;5652:18;;:22;5648:370;;5684:34;5721:56;;;-1:-1:-1;;;;;;;;;;;5721:56:242;;;;;:95;;:77;;:93;:95::i;:::-;5684:132;;5869:54;5896:6;5904:18;5869:26;:54::i;:::-;5969:42;5991:6;5999:11;5969:21;:42::i;:::-;5676:342;5648:370;6028:15;6047:1;6028:20;6024:47;;6058:7;;;;;;6024:47;6081:27;;:31;6077:526;;6156:27;;6122:31;6192:181;6216:22;6212:1;:26;6192:181;;;6252:67;6279:6;6295:19;6315:1;6295:22;;;;;;;;:::i;:::-;;;;;;;6252:26;:67::i;:::-;6351:3;;6192:181;;;;6424:9;6419:178;6443:23;6439:1;:27;6419:178;;;6480:63;6502:6;6518:20;6539:1;6518:23;;;;;;;;:::i;:::-;;;;;;;6480:21;:63::i;:::-;6575:3;;6419:178;;;;6114:489;6077:526;6667:9;6662:227;6686:22;6682:1;:26;6662:227;;;6720:122;6795:19;6815:1;6795:22;;;;;;;;:::i;:::-;;;;;;;6828:6;6720:57;:122::i;:::-;6871:3;;6662:227;;;;6900:9;6895:409;6919:15;6915:1;:19;6895:409;;;6980:1;6950:12;6963:1;6950:15;;;;;;;;:::i;:::-;;;;;;;:20;;;:27;:31;6946:312;;;7036:47;7062:12;7075:1;7062:15;;;;;;;;:::i;:::-;;;;;;;:20;;;7036:25;:47::i;:::-;7094:155;7166:12;7179:1;7166:15;;;;;;;;:::i;:::-;;;;;;;:22;;;7201:6;7219:12;7232:1;7219:15;;;;;;;;:::i;:::-;;;;;;;:20;;;7094:52;:155::i;:::-;7286:3;;6895:409;;;-1:-1:-1;7315:31:242;;7339:6;;7327:10;;7315:31;;;;;4804:2547;;;;4642:2709;;;;;:::o;2123:635::-;2167:19;2194:24;2221:13;:11;:13::i;:::-;2260:14;;2194:40;;-1:-1:-1;2260:14:242;-1:-1:-1;;;;;2289:21:242;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2289:21:242;;;;;;;;;;;;;;;;;2281:29;;2322:9;2317:437;2341:9;2337:1;:13;2317:437;;;2372:18;2400:16;2426:27;2463:34;2508:20;2517:7;2525:1;2517:10;;;;;;;;:::i;:::-;;;;;;;2508:8;:20::i;:::-;2362:166;;;;;;;;2548:159;;;;;;;;2567:7;2575:1;2567:10;;;;;;;;:::i;:::-;;;;;;;2548:159;;;;2593:4;2548:159;;;;2617:11;2548:159;;;;;;2651:11;2548:159;;;;2686:12;2548:159;;;2537:5;2543:1;2537:8;;;;;;;;:::i;:::-;;;;;;:170;;;;2736:3;;;;;;;2354:400;;;;2317:437;;;;2188:570;;2123:635;:::o;4190:425::-;4259:16;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4259:16:242;4291:18;4317:16;4341:27;4376:34;4419:16;4428:6;4419:8;:16::i;:::-;4455:155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4455:155:242;;4190:425;-1:-1:-1;;;;4190:425:242:o;1106:1013::-;1257:14;1279:34;1301:8;;1279:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1311:1:242;;-1:-1:-1;1279:21:242;;-1:-1:-1;;1279:34:242:i;:::-;1346:19;;1320:23;1346:19;-1:-1:-1;;;;;1417:47:242;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1417:47:242;;1372:92;;1480:16;:14;:16::i;:::-;1471:25;;1508:9;1503:502;1527:15;1523:1;:19;1503:502;;;1554:95;1618:12;1631:1;1618:15;;;;;;;;:::i;:::-;;;;;;;:22;;;1554:46;:95::i;:::-;1683:12;1696:1;1683:15;;;;;;;;:::i;:::-;;;;;;;:22;;;1657:20;1678:1;1657:23;;;;;;;;:::i;:::-;;;;;;:48;-1:-1:-1;;;;;1657:48:242;;;-1:-1:-1;;;;;1657:48:242;;;;;1755:47;1781:12;1794:1;1781:15;;;;;;;;:::i;1755:47::-;1811:147;1881:12;1894:1;1881:15;;;;;;;;:::i;:::-;;;;;;;:22;;;1914:6;1930:12;1943:1;1930:15;;;;;;;;:::i;1811:147::-;1987:3;;1503:502;;;;2011:60;2020:8;;2011:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2011:60:242;-1:-1:-1;2037:11:242;;-1:-1:-1;2050:20:242;;-1:-1:-1;2011:8:242;:60::i;:::-;-1:-1:-1;2083:31:242;;2107:6;;2095:10;;2083:31;;;;;1273:846;;1106:1013;;;;;;:::o;7355:1598::-;7439:41;7483:30;7506:6;7483:22;:30::i;:::-;7552:26;;;;-1:-1:-1;;;;;;;;;;;;7646:23:242;:8;7662:6;7646:15;:23::i;:::-;-1:-1:-1;7682:19:242;;;;:11;;;:19;;;;;;7675:26;7682:19;;7675:26;:::i;:::-;;;;;;-1:-1:-1;;7675:26:242;;;;;;;;;;;:::i;:::-;-1:-1:-1;;7675:26:242;;;;;;;;;;:::i;:::-;-1:-1:-1;;7707:29:242;;;;;;;;;-1:-1:-1;7707:29:242;;;:19;;;:11;;;:19;;;;;;;;-1:-1:-1;7707:29:242;;-1:-1:-1;7707:29:242;-1:-1:-1;7707:19:242;;-1:-1:-1;7707:29:242;:::i;:::-;-1:-1:-1;7776:5:242;7742:19;;;:11;;;:19;;;;;:31;;;:39;;-1:-1:-1;;7742:39:242;;;7812:40;;:31;;:38;:40::i;:::-;7858:22;7883:19;;;:11;;;:19;;;;;7788:64;;-1:-1:-1;7858:22:242;7883:41;;:32;;:39;:41::i;:::-;7858:66;;7936:9;7931:188;7955:13;7951:1;:17;7931:188;;;8028:19;;;;:11;;;:19;;;;;7980:93;;8028:37;;:31;;8063:1;8028:34;:37::i;:::-;7980:19;;;;:11;;;:19;;;;;:31;;;:38;:93::i;:::-;-1:-1:-1;8101:3:242;;7931:188;;;;8130:9;8125:191;8149:14;8145:1;:18;8125:191;;;8224:19;;;;:11;;;:19;;;;;8175:95;;8224:38;;:32;;8260:1;8224:35;:38::i;:::-;8175:19;;;;:11;;;:19;;;;;:32;;;:39;:95::i;:::-;-1:-1:-1;8298:3:242;;8125:191;;;;8322:27;8352:42;8387:6;8352:34;:42::i;:::-;8424:17;;8322:72;;-1:-1:-1;8400:21:242;8481:155;8505:13;8501:1;:17;8481:155;;;8530:59;8567:10;8578:1;8567:13;;;;;;;;:::i;:::-;;;;;;;8582:6;8530:36;:59::i;:::-;8618:3;;8481:155;;;;8684:9;8679:227;8703:22;8699:1;:26;8679:227;;;8737:122;8812:19;8832:1;8812:22;;;;;;;;:::i;:::-;;;;;;;8845:6;8737:57;:122::i;:::-;8888:3;;8679:227;;;-1:-1:-1;8917:31:242;;8941:6;;8929:10;;8917:31;;;;;7401:1552;;;;;;;7355:1598;:::o;12238:607::-;12456:18;;-1:-1:-1;;;;;;;;;;;434:66:243;12371:30:242;12481:360;12505:13;12501:1;:17;12481:360;;;12570:33;12588:11;12600:1;12588:14;;;;;;;;:::i;:::-;;;;;;;12570:17;:33::i;:::-;12617:56;12658:11;12670:1;12658:14;;;;;;;;:::i;:::-;;;;;;;12617:2;:11;;:19;12629:6;12617:19;;;;;;;;;;;:31;;:40;;:56;;;;:::i;:::-;12612:120;;12692:31;;-1:-1:-1;;;12692:31:242;;;;;;;;;;;12612:120;12740:54;12779:11;12791:1;12779:14;;;;;;;;:::i;:::-;;;;;;;12740:2;:11;;:19;12752:6;12740:19;;;;;;;;;;;:31;;:38;;:54;;;;:::i;:::-;-1:-1:-1;12823:3:242;;12481:360;;12849:158;12929:27;12986:16;12995:6;12986:8;:16::i;:::-;-1:-1:-1;12964:38:242;12849:158;-1:-1:-1;;;;12849:158:242:o;11614:620::-;11802:18;;-1:-1:-1;;;;;;;;;;;434:66:243;11717:30:242;11827:403;11851:13;11847:1;:17;11827:403;;;11916:33;11934:11;11946:1;11934:14;;;;;;;;:::i;11916:33::-;12008:56;12049:11;12061:1;12049:14;;;;;;;;:::i;12008:56::-;12004:120;;;12083:32;;-1:-1:-1;;;12083:32:242;;;;;;;;;;;12004:120;12132:51;12168:11;12180:1;12168:14;;;;;;;;:::i;:::-;;;;;;;12132:2;:11;;:19;12144:6;12132:19;;;;;;;;;;;:31;;:35;;:51;;;;:::i;:::-;-1:-1:-1;12212:3:242;;11827:403;;13198:543;13335:24;13352:6;13335:16;:24::i;:::-;13451:18;;13399:72;;:43;:72::i;:::-;13509:58;13531:6;13547:11;:18;;;13509:21;:58::i;:::-;13605:131;13673:11;:18;;;13700:6;13714:11;:16;;;13605:52;:131::i;13745:483::-;13947:18;;13895:72;;:43;:72::i;:::-;14010:63;14037:6;14053:11;:18;;;14010:26;:63::i;:::-;14184:18;;14111:112;;14211:6;14111:57;:112::i;3520:285:192:-;3620:4;3649:10;;3679:8;:6;:8::i;:::-;-1:-1:-1;;;;;3679:18:192;;:121;;;-1:-1:-1;293:66:111;526:31:109;;;3708:10:192;:91;;;;;3730:69;3742:9;3753:6;3786:10;3769:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;3761:37;;;:::i;:::-;3730:11;:69::i;:::-;3666:134;3520:285;-1:-1:-1;;;;3520:285:192:o;11317:144:449:-;11394:4;4360:21;;;:14;;;:21;;;;;;:26;;11417:37;11410:44;11317:144;-1:-1:-1;;;11317:144:449:o;10100:599:242:-;10208:39;10276:38;;;-1:-1:-1;;;;;;;;;;;10276:38:242;;;;;10179:21;;10208:39;10276:60;;:51;;:58;:60::i;:::-;-1:-1:-1;;;;;10250:92:242;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10250:92:242;;10208:134;;10361:9;10349:315;10386:38;;;;-1:-1:-1;;;;;;;;;;;10386:38:242;;;;;:60;;:51;;:58;:60::i;:::-;10382:1;:64;10349:315;;;10472:26;10501:56;;;-1:-1:-1;;;;;;;;;;;10501:56:242;;;;;:93;;:78;;10592:1;10501:90;:93::i;:::-;10472:122;;10638:18;10602:17;10620:1;10602:20;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10602:55:242;;;:20;;;;;;;;;;;:55;-1:-1:-1;10454:3:242;;10349:315;;;-1:-1:-1;10677:17:242;10100:599;-1:-1:-1;;10100:599:242:o;3437:476:210:-;-1:-1:-1;;;;;3511:25:210;;3507:101;;3553:48;;-1:-1:-1;;;3553:48:210;;;;;;;;;;;3507:101;3624:70;;-1:-1:-1;;;3624:70:210;;-1:-1:-1;;;3624:70:210;;;16325:52:516;-1:-1:-1;;;;;3624:38:210;;;;;16298:18:516;;3624:70:210;;;;;;;;;;;;;;;;;;-1:-1:-1;3624:70:210;;;;;;;;-1:-1:-1;;3624:70:210;;;;;;;;;;;;:::i;:::-;;;3614:295;;3852:50;;-1:-1:-1;;;3852:50:210;;;;;;;;;;;3614:295;3737:9;3732:92;;3765:50;;-1:-1:-1;;;3765:50:210;;;;;;;;;;;916:279;483:66:211;1084:37:210;:15;1109:11;1084:24;:37::i;:::-;1079:112;;1138:46;;-1:-1:-1;;;1138:46:210;;;;;;;;;;;5598:103:272;5654:15;5684:12;5692:3;5684:7;:12::i;14382:339:242:-;14482:30;14548:19;;;-1:-1:-1;;;;;;;;;;;14548:19:242;;;;;-1:-1:-1;;;;;;;;;;;434:66:243;14548:54:242;;:32;;14590:11;14548:41;:54::i;:::-;14543:115;;14619:32;;-1:-1:-1;;;14619:32:242;;;;;;;;;;;14543:115;14664:19;;;;:11;;;:19;;;;;:52;;:32;;14704:11;14664:39;:52::i;:::-;;14476:245;14382:339;;:::o;14725:319::-;14808:30;14873:19;;;-1:-1:-1;;;;;;;;;;;14873:19:242;;;;;-1:-1:-1;;;;;;;;;;;434:66:243;14873:54:242;;:32;;14915:11;14873:41;:54::i;:::-;14869:115;;;14944:33;;-1:-1:-1;;;14944:33:242;;;;;;;;;;;14869:115;14990:19;;;;:11;;;:19;;;;;:49;;:32;;15027:11;14990:36;:49::i;4569:191:210:-;4671:29;4688:11;4671:16;:29::i;:::-;4706:49;;-1:-1:-1;;;4706:49:210;;;;;9949:25:516;;;-1:-1:-1;;;;;4706:43:210;;;;;9922:18:516;;4706:49:210;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4569:191;;:::o;612:128:273:-;680:4;:11;695:1;680:16;676:59;;705:30;;-1:-1:-1;;;705:30:273;;;;;;;;;;;4331:234:210;4462:29;4479:11;4462:16;:29::i;:::-;4497:63;;-1:-1:-1;;;4497:63:210;;-1:-1:-1;;;;;4497:40:210;;;;;:63;;4538:4;;4544:15;;4497:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4331:234;;;:::o;9970:126:242:-;10016:24;10055:36;:27;:34;:36::i;9493:473::-;9603:16;9718:38;;;-1:-1:-1;;;;;;;;;;;9718:38:242;;;;;9711:50;;9577:18;;9603:16;9577:18;;;;9718:38;9711:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9781:21;-1:-1:-1;;;;;;;;;;;434:66:243;764:141;9781:21:242;:38;;;;:30;;;;;:38;;;;;;;;:50;;;-1:-1:-1;;;;;;;;;;;9851:38:242;;;;;;9781:50;;;;;-1:-1:-1;9851:59:242;;:50;;:57;:59::i;:::-;9837:73;;9931:30;9954:6;9931:22;:30::i;:::-;9916:45;;9493:473;;;;;:::o;425:183:273:-;541:15;;526:4;;541:21;-1:-1:-1;537:66:273;;;571:32;;-1:-1:-1;;;571:32:273;;;;;;;;;;;537:66;490:118;425:183;;:::o;9132:159:242:-;-1:-1:-1;;;;;;;;;;;9270:12:242;;9181:14;;434:66:243;9270:16:242;;9285:1;9270:16;:::i;:::-;9263:23;;;9132:159;:::o;10703:726::-;-1:-1:-1;;;;;;;;;;;10958:14:242;;10866;;434:66:243;;;10866:14:242;;10958;;;:::i;:::-;;;;;-1:-1:-1;10958:14:242;-1:-1:-1;10979:20:242;:8;;;10958:14;10979:12;:20::i;:::-;-1:-1:-1;11005:19:242;;;;:11;;;:19;;;;;:35;11032:8;11005:19;:35;:::i;:::-;-1:-1:-1;11046:19:242;;;;:11;;;:19;;;;;:31;;:45;;-1:-1:-1;;11046:45:242;;;;;;;11098:42;11046:19;11128:11;11098:21;:42::i;:::-;11152:9;11147:278;11171:12;:19;11167:1;:23;11147:278;;;11284:1;-1:-1:-1;;;;;11248:38:242;11256:12;11269:1;11256:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;11248:38:242;;11244:104;;11305:34;;-1:-1:-1;;;11305:34:242;;;;;;;;;;;11244:104;11356:62;11401:12;11414:1;11401:15;;;;;;;;:::i;:::-;;;;;;;11356:2;:11;;:19;11368:6;11356:19;;;;;;;;;;;:32;;:36;;:62;;;;:::i;:::-;-1:-1:-1;11192:3:242;;11147:278;;;;10882:547;10703:726;;;;;;:::o;11101:135:449:-;11171:4;11194:35;11202:3;11222:5;11194:7;:35::i;4534:95:272:-;4590:7;4612:12;4620:3;2609:18;;2531:101;4949:127;5028:13;5056:15;5060:3;5065:5;5056:3;:15::i;4125:127::-;4209:4;4228:19;4236:3;4241:5;4228:7;:19::i;9574:156:449:-;9648:7;9698:22;9702:3;9714:5;9698:3;:22::i;8634:156::-;8707:4;8730:53;8738:3;-1:-1:-1;;;;;8758:23:449;;8730:7;:53::i;3259:796:199:-;3335:27;-1:-1:-1;;;;;;;;;;;3370:37:199;3474:27;377:66:200;3474:25:199;:27::i;:::-;3440:61;;3507:13;3558:23;-1:-1:-1;;;;;3544:38:199;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3544:38:199;;3531:51;;3594:9;3589:266;3613:23;3609:1;:27;3589:266;;;3648:17;3668:24;:7;3690:1;3668:21;:24::i;:::-;3705:35;;;;:24;;;:35;;;;;3648:44;;-1:-1:-1;3705:52:199;;3750:6;3705:44;:52::i;:::-;3701:108;;;3791:9;3769:10;3780:7;;;;:::i;:::-;;;3769:19;;;;;;;;:::i;:::-;;;;;;:31;;;;;3701:108;-1:-1:-1;3837:3:199;;3589:266;;;;3891:5;3865:23;:31;3861:190;;;4008:17;;3941:35;;;4004:32;;3985:52;;3861:190;3364:691;;;3259:796;;;:::o;4501:438::-;4582:29;4601:9;4582:18;:29::i;:::-;4617:34;4641:9;4617:23;:34::i;:::-;4657:37;4768:35;;;:24;:35;;;;;-1:-1:-1;;;;;;;;;;;377:66:200;4768:52:199;;4813:6;4768:44;:52::i;:::-;4763:115;;4837:34;;-1:-1:-1;;;4837:34:199;;;;;;;;;;;4763:115;4884:35;;;;:24;;;:35;;;;;:50;;4927:6;4884:42;:50::i;14232:146:242:-;14308:3;14302:17;14323:1;14302:22;14298:76;;14341:26;;-1:-1:-1;;;14341:26:242;;;;;;;;;;;4325:136:272;4416:4;4435:21;4445:3;4450:5;4435:9;:21::i;3862:109::-;3931:4;3950:16;3955:3;3960:5;3950:4;:16::i;724:189:105:-;786:67;;;;;;;;302:66:107;786:67:105;-1:-1:-1;;;;;786:67:105;;;;;;;;;;;;;866:42;;-1:-1:-1;;;866:42:105;;;;;9949:25:516;;;;866:42:105;;765:13;;866:30;;9922:18:516;;;;;866:42:105;;;;;;786:67;866:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1566:1252:192:-;1679:4;1691:13;1707:8;:6;:8::i;:::-;1691:24;;1722;1749:31;1775:4;1749:25;:31::i;:::-;1816:14;;1722:58;;-1:-1:-1;1786:27:192;1869:17;:15;:17::i;:::-;1918:19;;1837:49;;-1:-1:-1;1892:23:192;1944:320;1968:19;1964:1;:23;1944:320;;;2002:14;2019:7;2027:1;2019:10;;;;;;;;:::i;:::-;;;;;;;2002:27;;2052:5;-1:-1:-1;;;;;2042:15:192;:6;-1:-1:-1;;;;;2042:15:192;;2038:51;;2076:4;2069:11;;;;;;;;;;;2038:51;2127:9;2122:136;2142:15;2138:1;:19;2122:136;;;2207:6;-1:-1:-1;;;;;2178:35:192;:25;2187:12;2200:1;2187:15;;;;;;;;:::i;:::-;;;;;;;2178:8;:25::i;:::-;-1:-1:-1;;;;;2178:35:192;;2174:76;;2234:5;2227:12;;;;;;;;;;;;2174:76;2159:3;;2122:136;;;-1:-1:-1;;1989:3:192;;1944:320;;;-1:-1:-1;483:66:211;2308:44:192;2432:24;:15;:22;:24::i;:::-;2403:53;;2468:9;2463:332;2487:18;2483:1;:22;2463:332;;;2520:47;2570:2;2520:47;2603:21;:15;;;2622:1;2603:18;:21::i;:::-;-1:-1:-1;;;;;2570:62:192;;;;;;;;;;;;;;;;;-1:-1:-1;2570:62:192;2520:112;;;;;;;;;;;;;;;;-1:-1:-1;;;2520:112:192;;;;;;;;;;-1:-1:-1;;;2520:112:192;;;;;;;;;;;;2654:28;;-1:-1:-1;;;2654:28:192;;;;2520:112;;-1:-1:-1;2520:112:192;;2654:26;;:28;;;;;;;;;;;2520:112;2654:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2653:29;:97;;;;;2694:1;:13;;;-1:-1:-1;;;;;2694:24:192;;2719:9;2730:7;2739:10;2694:56;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2640:149;;;2776:4;2769:11;;;;;;;;;;;;;2640:149;-1:-1:-1;2507:3:192;;2463:332;;;-1:-1:-1;2808:5:192;;1566:1252;-1:-1:-1;;;;;;;;;;;1566:1252:192:o;8871:165:449:-;-1:-1:-1;;;;;9004:23:449;;8951:4;4360:21;;;:14;;;:21;;;;;;:26;;8974:55;4264:129;3604:102:272;3660:15;3690:3;:11;;3683:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3604:102;;;:::o;8316:150:449:-;8386:4;8409:50;8414:3;-1:-1:-1;;;;;8434:23:449;;8409:4;:50::i;12671:297::-;12731:16;12759:22;12784:19;12792:3;12784:7;:19::i;10804:129::-;10871:4;10894:32;10899:3;10919:5;10894:4;:32::i;2815:1368::-;2881:4;3010:21;;;:14;;;:21;;;;;;3046:13;;3042:1135;;3413:18;3434:12;3445:1;3434:8;:12;:::i;:::-;3480:18;;3413:33;;-1:-1:-1;3460:17:449;;3480:22;;3501:1;;3480:22;:::i;:::-;3460:42;;3535:9;3521:10;:23;3517:378;;3564:17;3584:3;:11;;3596:9;3584:22;;;;;;;;:::i;:::-;;;;;;;;;3564:42;;3731:9;3705:3;:11;;3717:10;3705:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;3844:25;;;:14;;;:25;;;;;:36;;;3517:378;3973:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4076:3;:14;;:21;4091:5;4076:21;;;;;;;;;;;4069:28;;;4119:4;4112:11;;;;;;;3042:1135;4161:5;4154:12;;;;;2952:130:272;3031:13;3059:3;:11;;3071:5;3059:18;;;;;;;;:::i;:::-;;;;;;;;3052:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2952:130;;;;:::o;980:1266::-;1064:4;1172:18;1193:3;:12;;1206:5;1193:19;;;;;;:::i;:::-;;;;;;;;;;;;;;1172:40;;1223:10;1237:1;1223:15;1219:1023;;1562:21;1586:14;1599:1;1586:10;:14;:::i;:::-;1628:18;;1562:38;;-1:-1:-1;1608:17:272;;1628:22;;1649:1;;1628:22;:::i;:::-;1608:42;;1676:13;1663:9;:26;1659:358;;1701:23;1727:3;:11;;1739:9;1727:22;;;;;;;;:::i;:::-;;;;;;;;1701:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1862:9;1833:3;:11;;1845:13;1833:26;;;;;;;;:::i;:::-;;;;;;;;:38;;;;;;:::i;:::-;;1955:10;1929:3;:12;;1942:9;1929:23;;;;;;:::i;:::-;;;;;;;;;;;;;;:36;-1:-1:-1;1659:358:272;2083:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;2163:3;:12;;2176:5;2163:19;;;;;;:::i;:::-;;;;;;;;;;;;;2156:26;;;2198:4;2191:11;;;;;;;4923:118:449;4990:7;5016:3;:11;;5028:5;5016:18;;;;;;;;:::i;:::-;;;;;;;;;5009:25;;4923:118;;;;:::o;5855:224:199:-;5960:54;-1:-1:-1;;;;;;;;;;;6004:9:199;5960:43;:54::i;:::-;5955:120;;6031:37;;-1:-1:-1;;;6031:37:199;;;;;;;;;;;5383:246;5455:37;5529:30;;;:19;:30;;;;;:39;;;-1:-1:-1;;;;;;;;;;;377:66:200;5529:39:199;;5525:100;;;5585:33;;-1:-1:-1;;;5585:33:199;;;;;;;;;;;2319:139:272;2410:4;2429:3;:12;;2442:5;2429:19;;;;;;:::i;:::-;;;;;;;;;;;;;;;:24;;;2319:139;-1:-1:-1;;;2319:139:272:o;466:360::-;535:4;552:21;562:3;567:5;552:9;:21::i;:::-;547:275;;583:23;;;;;;;:11;:23;;;;;;;;600:5;583:23;;:::i;:::-;-1:-1:-1;745:18:272;;723:19;;:12;;;;:19;;736:5;;723:19;:::i;:::-;;;;;;;;;;;;;;:40;-1:-1:-1;778:4:272;771:11;;547:275;-1:-1:-1;810:5:272;803:12;;4548:533:192;4628:16;4652:14;294:66:224;4681:39:192;;;4760:28;;-1:-1:-1;;;4760:28:192;;-1:-1:-1;;;;;18871:32:516;;;4760:28:192;;;18853:51:516;4681:39:192;;;;-1:-1:-1;4681:39:192;;;;4760:22;;18826:18:516;;4760:28:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4760:28:192;;;;;;;;;;;;:::i;:::-;4824:20;;4727:61;;-1:-1:-1;4794:27:192;4892:23;4824:20;4914:1;4892:23;:::i;:::-;-1:-1:-1;;;;;4878:38:192;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4878:38:192;;4851:65;;4927:9;4922:94;4946:19;4942:1;:23;4922:94;;;4993:13;5007:1;4993:16;;;;;;;;:::i;:::-;;;;;;;4980:7;4988:1;4980:10;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4980:29:192;;;:10;;;;;;;;;;;:29;4967:3;;4922:94;;;;5052:4;5021:7;5029:19;5021:28;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5021:35:192;;;:28;;;;;;;;;;;:35;5069:7;4548:533;-1:-1:-1;;;;;4548:533:192:o;1228:128:195:-;1278:16;1309:42;377:66:196;1309:40:195;:42::i;22045:138:129:-;22111:7;22149:27;22168:7;22149:18;:27::i;2241:406:449:-;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:449;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;5581:109;5637:16;5672:3;:11;;5665:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5581:109;;;:::o;7836:1501:129:-;7974:32;8050:29;;;:20;:29;;;;;;;300:66:131;;-1:-1:-1;;;8115:24:129;;:29;;8111:1172;;8236:6;8246:1;8236:11;8232:791;;8276:16;;8265:27;;8261:83;;8313:31;;-1:-1:-1;;;8313:31:129;;;;;;;;;;;8261:83;8831:182;-1:-1:-1;;8910:9:129;;;8889:31;;;;:20;;;:31;;;;;;8910:9;;8889:31;;-1:-1:-1;8948:25:129;;8831:182;8948:25;;8987:13;7836:1501;;;:::o;8111:1172::-;7966:1323;9301:31;;-1:-1:-1;;;9301:31:129;;;;;;;;;;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;14:348:516;66:8;76:6;130:3;123:4;115:6;111:17;107:27;97:55;;148:1;145;138:12;97:55;-1:-1:-1;171:20:516;;-1:-1:-1;;;;;203:30:516;;200:50;;;246:1;243;236:12;200:50;283:4;275:6;271:17;259:29;;335:3;328:4;319:6;311;307:19;303:30;300:39;297:59;;;352:1;349;342:12;297:59;14:348;;;;;:::o;367:127::-;428:10;423:3;419:20;416:1;409:31;459:4;456:1;449:15;483:4;480:1;473:15;499:275;570:2;564:9;635:2;616:13;;-1:-1:-1;;612:27:516;600:40;;-1:-1:-1;;;;;655:34:516;;691:22;;;652:62;649:88;;;717:18;;:::i;:::-;753:2;746:22;499:275;;-1:-1:-1;499:275:516:o;779:182::-;838:4;-1:-1:-1;;;;;863:6:516;860:30;857:56;;;893:18;;:::i;:::-;-1:-1:-1;938:1:516;934:14;950:4;930:25;;779:182::o;966:407::-;1031:5;-1:-1:-1;;;;;1057:6:516;1054:30;1051:56;;;1087:18;;:::i;:::-;1125:57;1170:2;1149:15;;-1:-1:-1;;1145:29:516;1176:4;1141:40;1125:57;:::i;:::-;1116:66;;1205:6;1198:5;1191:21;1245:3;1236:6;1231:3;1227:16;1224:25;1221:45;;;1262:1;1259;1252:12;1221:45;1311:6;1306:3;1299:4;1292:5;1288:16;1275:43;1365:1;1358:4;1349:6;1342:5;1338:18;1334:29;1327:40;966:407;;;;;:::o;1378:1088::-;1431:5;1484:3;1477:4;1469:6;1465:17;1461:27;1451:55;;1502:1;1499;1492:12;1451:55;1538:6;1525:20;1564:4;1588:59;1604:42;1643:2;1604:42;:::i;:::-;1588:59;:::i;:::-;1681:15;;;1767:1;1763:10;;;;1751:23;;1747:32;;;1712:12;;;;1791:15;;;1788:35;;;1819:1;1816;1809:12;1788:35;1855:2;1847:6;1843:15;1867:570;1883:6;1878:3;1875:15;1867:570;;;1969:3;1956:17;-1:-1:-1;;;;;1992:11:516;1989:35;1986:125;;;2065:1;2094:2;2090;2083:14;1986:125;2134:24;;2193:2;2185:11;;2181:21;-1:-1:-1;2171:119:516;;2244:1;2273:2;2269;2262:14;2171:119;2315:79;2390:3;2384:2;2380;2376:11;2363:25;2358:2;2354;2350:11;2315:79;:::i;:::-;2303:92;;-1:-1:-1;2415:12:516;;;;1900;;1867:570;;;-1:-1:-1;2455:5:516;1378:1088;-1:-1:-1;;;;;;1378:1088:516:o;2471:145::-;-1:-1:-1;;;;;2560:31:516;;2550:42;;2540:70;;2606:1;2603;2596:12;2621:831;2685:5;2733:4;2721:9;2716:3;2712:19;2708:30;2705:50;;;2751:1;2748;2741:12;2705:50;2784:4;2778:11;2828:4;2820:6;2816:17;-1:-1:-1;;;;;2920:6:516;2908:10;2905:22;2900:2;2888:10;2885:18;2882:46;2879:72;;;2931:18;;:::i;:::-;2973:10;2967:4;2960:24;3002:6;2993:15;;3045:9;3032:23;3017:38;;3064:47;3103:7;3064:47;:::i;:::-;3120:23;;;3194:2;3179:18;;3166:32;;3210:14;;;3207:34;;;3237:1;3234;3227:12;3207:34;-1:-1:-1;3260:22:516;;3313:4;3305:13;;3301:23;-1:-1:-1;3291:51:516;;3338:1;3335;3328:12;3291:51;3375:70;3441:3;3436:2;3423:16;3418:2;3414;3410:11;3375:70;:::i;:::-;3370:2;3362:6;3358:15;3351:95;;;2621:831;;;;:::o;3457:923::-;3528:5;3581:3;3574:4;3566:6;3562:17;3558:27;3548:55;;3599:1;3596;3589:12;3548:55;3635:6;3622:20;3661:4;3685:59;3701:42;3740:2;3701:42;:::i;3685:59::-;3778:15;;;3864:1;3860:10;;;;3848:23;;3844:32;;;3809:12;;;;3888:15;;;3885:35;;;3916:1;3913;3906:12;3885:35;3952:2;3944:6;3940:15;3964:387;3980:6;3975:3;3972:15;3964:387;;;4066:3;4053:17;-1:-1:-1;;;;;4089:11:516;4086:35;4083:125;;;4162:1;4191:2;4187;4180:14;4083:125;4233:75;4304:3;4299:2;4285:11;4277:6;4273:24;4269:33;4233:75;:::i;:::-;4221:88;;-1:-1:-1;4329:12:516;;;;3997;;3964:387;;4385:1015;4579:6;4587;4595;4603;4611;4664:3;4652:9;4643:7;4639:23;4635:33;4632:53;;;4681:1;4678;4671:12;4632:53;4717:9;4704:23;4694:33;;4778:2;4767:9;4763:18;4750:32;-1:-1:-1;;;;;4842:2:516;4834:6;4831:14;4828:34;;;4858:1;4855;4848:12;4828:34;4897:59;4948:7;4939:6;4928:9;4924:22;4897:59;:::i;:::-;4975:8;;-1:-1:-1;4871:85:516;-1:-1:-1;5063:2:516;5048:18;;5035:32;;-1:-1:-1;5079:16:516;;;5076:36;;;5108:1;5105;5098:12;5076:36;5131:62;5185:7;5174:8;5163:9;5159:24;5131:62;:::i;:::-;5121:72;;5246:2;5235:9;5231:18;5218:32;5202:48;;5275:2;5265:8;5262:16;5259:36;;;5291:1;5288;5281:12;5259:36;;5314:80;5386:7;5375:8;5364:9;5360:24;5314:80;:::i;:::-;5304:90;;;4385:1015;;;;;;;;:::o;5405:250::-;5490:1;5500:113;5514:6;5511:1;5508:13;5500:113;;;5590:11;;;5584:18;5571:11;;;5564:39;5536:2;5529:10;5500:113;;;-1:-1:-1;;5647:1:516;5629:16;;5622:27;5405:250::o;5660:271::-;5702:3;5740:5;5734:12;5767:6;5762:3;5755:19;5783:76;5852:6;5845:4;5840:3;5836:14;5829:4;5822:5;5818:16;5783:76;:::i;:::-;5913:2;5892:15;-1:-1:-1;;5888:29:516;5879:39;;;;5920:4;5875:50;;5660:271;-1:-1:-1;;5660:271:516:o;5936:479::-;6003:3;6041:5;6035:12;6068:6;6063:3;6056:19;6094:4;6123;6118:3;6114:14;6107:21;;6162:4;6155:5;6151:16;6185:1;6195:195;6209:6;6206:1;6203:13;6195:195;;;6274:13;;-1:-1:-1;;;;;6270:39:516;6258:52;;6330:12;;;;6365:15;;;;6306:1;6224:9;6195:195;;;-1:-1:-1;6406:3:516;;5936:479;-1:-1:-1;;;;;5936:479:516:o;6420:1147::-;6503:5;6497:12;6492:3;6485:25;6467:3;6529:4;6579:2;6572:5;6568:14;6562:21;6613:4;6608:2;6603:3;6599:12;6592:26;6639:47;6680:4;6675:3;6671:14;6657:12;6639:47;:::i;:::-;6627:59;;6749:4;6742:5;6738:16;6732:23;6725:31;6718:39;6711:4;6706:3;6702:14;6695:63;6806:4;6799:5;6795:16;6789:23;6854:3;6848:4;6844:14;6837:4;6832:3;6828:14;6821:38;6881:4;6914:14;6908:21;6951:6;6945:4;6938:20;6986:2;6980:4;6976:13;6967:22;;7043:2;7033:6;7030:1;7026:14;7020:4;7016:25;7012:34;7089:2;7073:14;7069:23;7055:37;;7110:1;7120:256;7134:6;7131:1;7128:13;7120:256;;;7224:2;7220:7;7213:4;7205:6;7201:17;7197:31;7190:5;7183:46;7252:40;7285:6;7276;7270:13;7252:40;:::i;:::-;7315:15;;;;7352:14;;;;7242:50;-1:-1:-1;7156:1:516;7149:9;7120:256;;;7124:3;7424:4;7417:5;7413:16;7407:23;7385:45;;7474:3;7466:6;7462:16;7455:4;7450:3;7446:14;7439:40;7495:66;7554:6;7538:14;7495:66;:::i;:::-;7488:73;6420:1147;-1:-1:-1;;;;;;;;;6420:1147:516:o;7572:834::-;7760:4;7789:2;7829;7818:9;7814:18;7859:2;7848:9;7841:21;7882:6;7917;7911:13;7948:6;7940;7933:22;7986:2;7975:9;7971:18;7964:25;;8048:2;8038:6;8035:1;8031:14;8020:9;8016:30;8012:39;7998:53;;8086:2;8078:6;8074:15;8107:1;8117:260;8131:6;8128:1;8125:13;8117:260;;;8224:2;8220:7;8208:9;8200:6;8196:22;8192:36;8187:3;8180:49;8252:45;8290:6;8281;8275:13;8252:45;:::i;:::-;8242:55;-1:-1:-1;8355:12:516;;;;8320:15;;;;8153:1;8146:9;8117:260;;;-1:-1:-1;8394:6:516;;7572:834;-1:-1:-1;;;;;;;7572:834:516:o;8411:180::-;8470:6;8523:2;8511:9;8502:7;8498:23;8494:32;8491:52;;;8539:1;8536;8529:12;8491:52;-1:-1:-1;8562:23:516;;8411:180;-1:-1:-1;8411:180:516:o;8596:251::-;8771:2;8760:9;8753:21;8734:4;8791:50;8837:2;8826:9;8822:18;8814:6;8791:50;:::i;8852:946::-;9037:6;9045;9053;9061;9114:2;9102:9;9093:7;9089:23;9085:32;9082:52;;;9130:1;9127;9120:12;9082:52;9170:9;9157:23;-1:-1:-1;;;;;9240:2:516;9232:6;9229:14;9226:34;;;9256:1;9253;9246:12;9226:34;9295:59;9346:7;9337:6;9326:9;9322:22;9295:59;:::i;:::-;9373:8;;-1:-1:-1;9269:85:516;-1:-1:-1;9461:2:516;9446:18;;9433:32;;-1:-1:-1;9477:16:516;;;9474:36;;;9506:1;9503;9496:12;9474:36;9529:62;9583:7;9572:8;9561:9;9557:24;9529:62;:::i;:::-;9519:72;;9644:2;9633:9;9629:18;9616:32;9600:48;;9673:2;9663:8;9660:16;9657:36;;;9689:1;9686;9679:12;9657:36;;9712:80;9784:7;9773:8;9762:9;9758:24;9712:80;:::i;:::-;9702:90;;;8852:946;;;;;;;:::o;9985:425::-;10088:6;10096;10149:2;10137:9;10128:7;10124:23;10120:32;10117:52;;;10165:1;10162;10155:12;10117:52;10201:9;10188:23;10178:33;;10262:2;10251:9;10247:18;10234:32;-1:-1:-1;;;;;10281:6:516;10278:30;10275:50;;;10321:1;10318;10311:12;10275:50;10344:60;10396:7;10387:6;10376:9;10372:22;10344:60;:::i;:::-;10334:70;;;9985:425;;;;;:::o;10415:803::-;10577:4;10606:2;10646;10635:9;10631:18;10676:2;10665:9;10658:21;10699:6;10734;10728:13;10765:6;10757;10750:22;10803:2;10792:9;10788:18;10781:25;;10865:2;10855:6;10852:1;10848:14;10837:9;10833:30;10829:39;10815:53;;10903:2;10895:6;10891:15;10924:1;10934:255;10948:6;10945:1;10942:13;10934:255;;;11041:2;11037:7;11025:9;11017:6;11013:22;11009:36;11004:3;10997:49;11069:40;11102:6;11093;11087:13;11069:40;:::i;:::-;11059:50;-1:-1:-1;11167:12:516;;;;11132:15;;;;10970:1;10963:9;10934:255;;11223:434;11327:6;11335;11388:2;11376:9;11367:7;11363:23;11359:32;11356:52;;;11404:1;11401;11394:12;11356:52;11440:9;11427:23;11417:33;;11501:2;11490:9;11486:18;11473:32;-1:-1:-1;;;;;11520:6:516;11517:30;11514:50;;;11560:1;11557;11550:12;11514:50;11583:68;11643:7;11634:6;11623:9;11619:22;11583:68;:::i;11662:127::-;11723:10;11718:3;11714:20;11711:1;11704:31;11754:4;11751:1;11744:15;11778:4;11775:1;11768:15;11794:380;11873:1;11869:12;;;;11916;;;11937:61;;11991:4;11983:6;11979:17;11969:27;;11937:61;12044:2;12036:6;12033:14;12013:18;12010:38;12007:161;;12090:10;12085:3;12081:20;12078:1;12071:31;12125:4;12122:1;12115:15;12153:4;12150:1;12143:15;12305:543;12407:2;12402:3;12399:11;12396:446;;;12443:1;12467:5;12464:1;12457:16;12511:4;12508:1;12498:18;12581:2;12569:10;12565:19;12562:1;12558:27;12552:4;12548:38;12617:4;12605:10;12602:20;12599:47;;;-1:-1:-1;12640:4:516;12599:47;12695:2;12690:3;12686:12;12683:1;12679:20;12673:4;12669:31;12659:41;;12750:82;12768:2;12761:5;12758:13;12750:82;;;12813:17;;;12794:1;12783:13;12750:82;;13024:1206;-1:-1:-1;;;;;13143:3:516;13140:27;13137:53;;;13170:18;;:::i;:::-;13199:94;13289:3;13249:38;13281:4;13275:11;13249:38;:::i;:::-;13243:4;13199:94;:::i;:::-;13319:1;13344:2;13339:3;13336:11;13361:1;13356:616;;;;14016:1;14033:3;14030:93;;;-1:-1:-1;14089:19:516;;;14076:33;14030:93;-1:-1:-1;;12981:1:516;12977:11;;;12973:24;12969:29;12959:40;13005:1;13001:11;;;12956:57;14136:78;;13329:895;;13356:616;12252:1;12245:14;;;12289:4;12276:18;;-1:-1:-1;;13392:17:516;;;13493:9;13515:229;13529:7;13526:1;13523:14;13515:229;;;13618:19;;;13605:33;13590:49;;13725:4;13710:20;;;;13678:1;13666:14;;;;13545:12;13515:229;;;13519:3;13772;13763:7;13760:16;13757:159;;;13896:1;13892:6;13886:3;13880;13877:1;13873:11;13869:21;13865:34;13861:39;13848:9;13843:3;13839:19;13826:33;13822:79;13814:6;13807:95;13757:159;;;13959:1;13953:3;13950:1;13946:11;13942:19;13936:4;13929:33;13329:895;;13024:1206;;;:::o;14235:1345::-;14361:3;14355:10;-1:-1:-1;;;;;14380:6:516;14377:30;14374:56;;;14410:18;;:::i;:::-;14439:97;14529:6;14489:38;14521:4;14515:11;14489:38;:::i;:::-;14483:4;14439:97;:::i;:::-;14591:4;;14648:2;14637:14;;14665:1;14660:663;;;;15367:1;15384:6;15381:89;;;-1:-1:-1;15436:19:516;;;15430:26;15381:89;-1:-1:-1;;12981:1:516;12977:11;;;12973:24;12969:29;12959:40;13005:1;13001:11;;;12956:57;15483:81;;14630:944;;14660:663;12252:1;12245:14;;;12289:4;12276:18;;-1:-1:-1;;14696:20:516;;;14814:236;14828:7;14825:1;14822:14;14814:236;;;14917:19;;;14911:26;14896:42;;15009:27;;;;14977:1;14965:14;;;;14844:19;;14814:236;;;14818:3;15078:6;15069:7;15066:19;15063:201;;;15139:19;;;15133:26;-1:-1:-1;;15222:1:516;15218:14;;;15234:3;15214:24;15210:37;15206:42;15191:58;15176:74;;15063:201;-1:-1:-1;;;;;15310:1:516;15294:14;;;15290:22;15277:36;;-1:-1:-1;14235:1345:516:o;15585:289::-;15716:3;15754:6;15748:13;15770:66;15829:6;15824:3;15817:4;15809:6;15805:17;15770:66;:::i;:::-;15852:16;;;;;15585:289;-1:-1:-1;;15585:289:516:o;15879:297::-;15997:12;;16044:4;16033:16;;;16027:23;;15997:12;16062:16;;16059:111;;;-1:-1:-1;;16136:4:516;16132:17;;;;16129:1;16125:25;16121:38;16110:50;;15879:297;-1:-1:-1;15879:297:516:o;16388:277::-;16455:6;16508:2;16496:9;16487:7;16483:23;16479:32;16476:52;;;16524:1;16521;16514:12;16476:52;16556:9;16550:16;16609:5;16602:13;16595:21;16588:5;16585:32;16575:60;;16631:1;16628;16621:12;16670:289;16845:6;16834:9;16827:25;16888:2;16883;16872:9;16868:18;16861:30;16808:4;16908:45;16949:2;16938:9;16934:18;16926:6;16908:45;:::i;16964:127::-;17025:10;17020:3;17016:20;17013:1;17006:31;17056:4;17053:1;17046:15;17080:4;17077:1;17070:15;17096:125;17161:9;;;17182:10;;;17179:36;;;17195:18;;:::i;17226:135::-;17265:3;17286:17;;;17283:43;;17306:18;;:::i;:::-;-1:-1:-1;17353:1:516;17342:13;;17226:135::o;17366:265::-;17436:6;17489:2;17477:9;17468:7;17464:23;17460:32;17457:52;;;17505:1;17502;17495:12;17457:52;17537:9;17531:16;17556:45;17595:5;17556:45;:::i;17636:801::-;17834:4;17882:2;17871:9;17867:18;17912:6;17901:9;17894:25;17938:2;17976;17971;17960:9;17956:18;17949:30;17999:6;18034;18028:13;18065:6;18057;18050:22;18103:3;18092:9;18088:19;18081:26;;18142:2;18134:6;18130:15;18116:29;;18163:1;18173:195;18187:6;18184:1;18181:13;18173:195;;;18252:13;;-1:-1:-1;;;;;18248:39:516;18236:52;;18343:15;;;;18308:12;;;;18284:1;18202:9;18173:195;;;18177:3;;18385;18377:11;;;;;18424:6;18419:2;18408:9;18404:18;18397:34;17636:801;;;;;;:::o;18442:128::-;18509:9;;;18530:11;;;18527:37;;;18544:18;;:::i;18575:127::-;18636:10;18631:3;18627:20;18624:1;18617:31;18667:4;18664:1;18657:15;18691:4;18688:1;18681:15;18915:969;19010:6;19041:2;19084;19072:9;19063:7;19059:23;19055:32;19052:52;;;19100:1;19097;19090:12;19052:52;19133:9;19127:16;-1:-1:-1;;;;;19158:6:516;19155:30;19152:50;;;19198:1;19195;19188:12;19152:50;19221:22;;19274:4;19266:13;;19262:27;-1:-1:-1;19252:55:516;;19303:1;19300;19293:12;19252:55;19332:2;19326:9;19355:59;19371:42;19410:2;19371:42;:::i;19355:59::-;19448:15;;;19530:1;19526:10;;;;19518:19;;19514:28;;;19479:12;;;;19554:19;;;19551:39;;;19586:1;19583;19576:12;19551:39;19610:11;;;;19630:224;19646:6;19641:3;19638:15;19630:224;;;19719:3;19713:10;19736:45;19775:5;19736:45;:::i;:::-;19794:18;;19663:12;;;;19832;;;;19630:224;;;19873:5;18915:969;-1:-1:-1;;;;;;;18915:969:516:o","linkReferences":{}},"methodIdentifiers":{"addPermissionsToRole(uint256,string[])":"b7515761","addRoleToEntitlement(uint256,(address,bytes))":"ba201ba8","createRole(string,string[],(address,bytes)[])":"8fcd793d","getPermissionsByRoleId(uint256)":"b4264233","getRoleById(uint256)":"784c872b","getRoles()":"71061398","removePermissionsFromRole(uint256,string[])":"9a8e4c3e","removeRole(uint256)":"92691821","removeRoleFromEntitlement(uint256,(address,bytes))":"dba81864","updateRole(uint256,string,string[],(address,bytes)[])":"4d8b50a2"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ApprovalCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BalanceQueryForZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__AlreadyBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Banning__CannotBanSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__NotBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChannelService__ChannelDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChannelService__ChannelDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChannelService__RoleDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC5643__DurationZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC5643__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC5643__NotApprovedOrOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC5643__SubscriptionNotRenewable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__ValueAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementsService__EntitlementDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementsService__InvalidEntitlementAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementsService__InvalidEntitlementInterface\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintERC2309QuantityExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintZeroQuantity\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnershipNotInitializedForExtraData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__Paused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__EntitlementAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__EntitlementDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__InvalidEntitlementAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__InvalidPermission\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__PermissionAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__PermissionDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__RoleDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFromIncorrectOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC721ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"URIQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Validator__InvalidByteLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Validator__InvalidStringLength\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"toTokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"ConsecutiveTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"RoleCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remover\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"RoleRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"updater\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"RoleUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"expiration\",\"type\":\"uint64\"}],\"name\":\"SubscriptionUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Unbanned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"internalType\":\"string[]\",\"name\":\"permissions\",\"type\":\"string[]\"}],\"name\":\"addPermissionsToRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"contract IEntitlement\",\"name\":\"module\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IRolesBase.CreateEntitlement\",\"name\":\"entitlement\",\"type\":\"tuple\"}],\"name\":\"addRoleToEntitlement\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"roleName\",\"type\":\"string\"},{\"internalType\":\"string[]\",\"name\":\"permissions\",\"type\":\"string[]\"},{\"components\":[{\"internalType\":\"contract IEntitlement\",\"name\":\"module\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IRolesBase.CreateEntitlement[]\",\"name\":\"entitlements\",\"type\":\"tuple[]\"}],\"name\":\"createRole\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getPermissionsByRoleId\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"permissions\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getRoleById\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"string[]\",\"name\":\"permissions\",\"type\":\"string[]\"},{\"internalType\":\"contract IEntitlement[]\",\"name\":\"entitlements\",\"type\":\"address[]\"}],\"internalType\":\"struct IRolesBase.Role\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRoles\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"string[]\",\"name\":\"permissions\",\"type\":\"string[]\"},{\"internalType\":\"contract IEntitlement[]\",\"name\":\"entitlements\",\"type\":\"address[]\"}],\"internalType\":\"struct IRolesBase.Role[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"internalType\":\"string[]\",\"name\":\"permissions\",\"type\":\"string[]\"}],\"name\":\"removePermissionsFromRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"removeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"contract IEntitlement\",\"name\":\"module\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IRolesBase.CreateEntitlement\",\"name\":\"entitlement\",\"type\":\"tuple\"}],\"name\":\"removeRoleFromEntitlement\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"roleName\",\"type\":\"string\"},{\"internalType\":\"string[]\",\"name\":\"permissions\",\"type\":\"string[]\"},{\"components\":[{\"internalType\":\"contract IEntitlement\",\"name\":\"module\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IRolesBase.CreateEntitlement[]\",\"name\":\"entitlements\",\"type\":\"tuple[]\"}],\"name\":\"updateRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"ConsecutiveTransfer(uint256,uint256,address,address)\":{\"details\":\"Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, as defined in the [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. See {_mintERC2309} for more details.\"},\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"},\"SubscriptionUpdate(uint256,uint64)\":{\"details\":\"When a subscription is canceled, the expiration value should also be 0.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"errors\":{\"ApprovalCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"ApprovalQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"BalanceQueryForZeroAddress()\":[{\"notice\":\"Cannot query the balance for the zero address.\"}],\"MintERC2309QuantityExceedsLimit()\":[{\"notice\":\"The `quantity` minted with ERC2309 exceeds the safety limit.\"}],\"MintToZeroAddress()\":[{\"notice\":\"Cannot mint to the zero address.\"}],\"MintZeroQuantity()\":[{\"notice\":\"The quantity of tokens minted must be more than zero.\"}],\"OwnerQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"OwnershipNotInitializedForExtraData()\":[{\"notice\":\"The `extraData` cannot be set on an unintialized ownership slot.\"}],\"TransferCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"TransferFromIncorrectOwner()\":[{\"notice\":\"The token must be owned by `from`.\"}],\"TransferToNonERC721ReceiverImplementer()\":[{\"notice\":\"Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"notice\":\"Cannot transfer to the zero address.\"}],\"URIQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}]},\"events\":{\"SubscriptionUpdate(uint256,uint64)\":{\"notice\":\"Emitted when a subscription expiration changes\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/facets/roles/Roles.sol\":\"Roles\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol\":{\"keccak256\":\"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f\",\"dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol\":{\"keccak256\":\"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5\",\"dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol\":{\"keccak256\":\"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc\",\"dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf\"]},\"contracts/src/diamond/facets/pausable/IPausable.sol\":{\"keccak256\":\"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6\",\"dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM\"]},\"contracts/src/diamond/facets/pausable/PausableBase.sol\":{\"keccak256\":\"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c\",\"dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1\"]},\"contracts/src/diamond/facets/pausable/PausableStorage.sol\":{\"keccak256\":\"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b\",\"dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL\"]},\"contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol\":{\"keccak256\":\"0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714\",\"dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8\"]},\"contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol\":{\"keccak256\":\"0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7\",\"dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7\"]},\"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol\":{\"keccak256\":\"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f\",\"dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol\":{\"keccak256\":\"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa\",\"dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol\":{\"keccak256\":\"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c\",\"dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu\"]},\"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol\":{\"keccak256\":\"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e\",\"dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM\"]},\"contracts/src/factory/facets/wallet-link/IWalletLink.sol\":{\"keccak256\":\"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13\",\"dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR\"]},\"contracts/src/spaces/entitlements/IEntitlement.sol\":{\"keccak256\":\"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3\",\"dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf\"]},\"contracts/src/spaces/facets/Entitled.sol\":{\"keccak256\":\"0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7\",\"dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc\"]},\"contracts/src/spaces/facets/Permissions.sol\":{\"keccak256\":\"0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721\",\"dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp\"]},\"contracts/src/spaces/facets/banning/BanningBase.sol\":{\"keccak256\":\"0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d\",\"dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN\"]},\"contracts/src/spaces/facets/banning/BanningStorage.sol\":{\"keccak256\":\"0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0\",\"dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1\"]},\"contracts/src/spaces/facets/banning/IBanning.sol\":{\"keccak256\":\"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419\",\"dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6\"]},\"contracts/src/spaces/facets/channels/ChannelService.sol\":{\"keccak256\":\"0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9\",\"dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi\"]},\"contracts/src/spaces/facets/channels/ChannelStorage.sol\":{\"keccak256\":\"0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7\",\"dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS\"]},\"contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol\":{\"keccak256\":\"0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5\",\"dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9\"]},\"contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol\":{\"keccak256\":\"0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07\",\"dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek\"]},\"contracts/src/spaces/facets/entitlements/EntitlementsManagerService.sol\":{\"keccak256\":\"0x6f40f5b41ad702ea55bf10f987b3e2b6d02ac527a66be523f06f025cead1867d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://da2012c616b833c5b491735c230be707e4f9b7657b3a71d7bdf52e7c2ba128b9\",\"dweb:/ipfs/Qme4864V46rozVDRWtfYqtpyzE1SzBnqYQQf3iD2rrqiPg\"]},\"contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol\":{\"keccak256\":\"0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583\",\"dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK\"]},\"contracts/src/spaces/facets/membership/MembershipStorage.sol\":{\"keccak256\":\"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee\",\"dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5\"]},\"contracts/src/spaces/facets/roles/IRoles.sol\":{\"keccak256\":\"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8\",\"dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N\"]},\"contracts/src/spaces/facets/roles/Roles.sol\":{\"keccak256\":\"0xc941bcf9a296c108389b1c0916ca05643a89c5f466e6b3f955bbd9dde64df762\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d86c333a63ffb52d23b7aa7af3711abb7501a0bddae059e5744d9ffcb1dee00b\",\"dweb:/ipfs/QmZMhHACX9gD7CGrHnMZNJM8CWzfndT3rihUWQm8PYy8XD\"]},\"contracts/src/spaces/facets/roles/RolesBase.sol\":{\"keccak256\":\"0x2ef137dec4a5390009fd931e34fdbb4a742c96b68b40f5c152cec8cf2809ed6f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3cb29b4a780742a30ba3af5719f77a4a65ea55ebbdc3ccd9c93c86573f20c7df\",\"dweb:/ipfs/QmdvPJydLCcEwCB3xk5VpET8X2GfrxC3NBUD5G6C8a9aW8\"]},\"contracts/src/spaces/facets/roles/RolesStorage.sol\":{\"keccak256\":\"0x40f288a613e35cbc02aceb1d23f89af888f65538853f61cc1fcd25901b9bc4af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://396b5e157c9a29adc94edc5d234f416a44e6e7c4588b1aaa0587bb04018705e9\",\"dweb:/ipfs/QmWDCQz555WbvZw7XxfkybE5dPfouc6rKxU5Zu1Gsuz1Zr\"]},\"contracts/src/utils/StringSet.sol\":{\"keccak256\":\"0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6\",\"dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK\"]},\"contracts/src/utils/Validator.sol\":{\"keccak256\":\"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64\",\"dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72\"]},\"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"ApprovalCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"ApprovalQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"BalanceQueryForZeroAddress"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__AlreadyBanned"},{"inputs":[],"type":"error","name":"Banning__CannotBanSelf"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__InvalidTokenId"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__NotBanned"},{"inputs":[],"type":"error","name":"ChannelService__ChannelDisabled"},{"inputs":[],"type":"error","name":"ChannelService__ChannelDoesNotExist"},{"inputs":[],"type":"error","name":"ChannelService__RoleDoesNotExist"},{"inputs":[],"type":"error","name":"ERC5643__DurationZero"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC5643__InvalidTokenId"},{"inputs":[],"type":"error","name":"ERC5643__NotApprovedOrOwner"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC5643__SubscriptionNotRenewable"},{"inputs":[],"type":"error","name":"Entitlement__InvalidValue"},{"inputs":[],"type":"error","name":"Entitlement__NotAllowed"},{"inputs":[],"type":"error","name":"Entitlement__NotMember"},{"inputs":[],"type":"error","name":"Entitlement__ValueAlreadyExists"},{"inputs":[],"type":"error","name":"EntitlementsService__EntitlementDoesNotExist"},{"inputs":[],"type":"error","name":"EntitlementsService__InvalidEntitlementAddress"},{"inputs":[],"type":"error","name":"EntitlementsService__InvalidEntitlementInterface"},{"inputs":[],"type":"error","name":"MintERC2309QuantityExceedsLimit"},{"inputs":[],"type":"error","name":"MintToZeroAddress"},{"inputs":[],"type":"error","name":"MintZeroQuantity"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[],"type":"error","name":"OwnerQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"OwnershipNotInitializedForExtraData"},{"inputs":[],"type":"error","name":"Pausable__NotPaused"},{"inputs":[],"type":"error","name":"Pausable__Paused"},{"inputs":[],"type":"error","name":"Roles__EntitlementAlreadyExists"},{"inputs":[],"type":"error","name":"Roles__EntitlementDoesNotExist"},{"inputs":[],"type":"error","name":"Roles__InvalidEntitlementAddress"},{"inputs":[],"type":"error","name":"Roles__InvalidPermission"},{"inputs":[],"type":"error","name":"Roles__PermissionAlreadyExists"},{"inputs":[],"type":"error","name":"Roles__PermissionDoesNotExist"},{"inputs":[],"type":"error","name":"Roles__RoleDoesNotExist"},{"inputs":[],"type":"error","name":"TransferCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"TransferFromIncorrectOwner"},{"inputs":[],"type":"error","name":"TransferToNonERC721ReceiverImplementer"},{"inputs":[],"type":"error","name":"TransferToZeroAddress"},{"inputs":[],"type":"error","name":"URIQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"Validator__InvalidByteLength"},{"inputs":[],"type":"error","name":"Validator__InvalidStringLength"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"approved","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bool","name":"approved","type":"bool","indexed":false}],"type":"event","name":"ApprovalForAll","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Banned","anonymous":false},{"inputs":[{"internalType":"uint256","name":"fromTokenId","type":"uint256","indexed":true},{"internalType":"uint256","name":"toTokenId","type":"uint256","indexed":false},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true}],"type":"event","name":"ConsecutiveTransfer","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"address","name":"creator","type":"address","indexed":true},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":true}],"type":"event","name":"RoleCreated","anonymous":false},{"inputs":[{"internalType":"address","name":"remover","type":"address","indexed":true},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":true}],"type":"event","name":"RoleRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"updater","type":"address","indexed":true},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":true}],"type":"event","name":"RoleUpdated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true},{"internalType":"uint64","name":"expiration","type":"uint64","indexed":false}],"type":"event","name":"SubscriptionUpdate","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Unbanned","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"string[]","name":"permissions","type":"string[]"}],"stateMutability":"nonpayable","type":"function","name":"addPermissionsToRole"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"struct IRolesBase.CreateEntitlement","name":"entitlement","type":"tuple","components":[{"internalType":"contract IEntitlement","name":"module","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"addRoleToEntitlement"},{"inputs":[{"internalType":"string","name":"roleName","type":"string"},{"internalType":"string[]","name":"permissions","type":"string[]"},{"internalType":"struct IRolesBase.CreateEntitlement[]","name":"entitlements","type":"tuple[]","components":[{"internalType":"contract IEntitlement","name":"module","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"createRole","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getPermissionsByRoleId","outputs":[{"internalType":"string[]","name":"permissions","type":"string[]"}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getRoleById","outputs":[{"internalType":"struct IRolesBase.Role","name":"","type":"tuple","components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"bool","name":"disabled","type":"bool"},{"internalType":"string[]","name":"permissions","type":"string[]"},{"internalType":"contract IEntitlement[]","name":"entitlements","type":"address[]"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getRoles","outputs":[{"internalType":"struct IRolesBase.Role[]","name":"","type":"tuple[]","components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"bool","name":"disabled","type":"bool"},{"internalType":"string[]","name":"permissions","type":"string[]"},{"internalType":"contract IEntitlement[]","name":"entitlements","type":"address[]"}]}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"string[]","name":"permissions","type":"string[]"}],"stateMutability":"nonpayable","type":"function","name":"removePermissionsFromRole"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"removeRole"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"struct IRolesBase.CreateEntitlement","name":"entitlement","type":"tuple","components":[{"internalType":"contract IEntitlement","name":"module","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"removeRoleFromEntitlement"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"string","name":"roleName","type":"string"},{"internalType":"string[]","name":"permissions","type":"string[]"},{"internalType":"struct IRolesBase.CreateEntitlement[]","name":"entitlements","type":"tuple[]","components":[{"internalType":"contract IEntitlement","name":"module","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"updateRole"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/facets/roles/Roles.sol":"Roles"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol":{"keccak256":"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d","urls":["bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f","dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol":{"keccak256":"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a","urls":["bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5","dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol":{"keccak256":"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0","urls":["bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc","dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/IPausable.sol":{"keccak256":"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261","urls":["bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6","dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableBase.sol":{"keccak256":"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438","urls":["bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c","dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableStorage.sol":{"keccak256":"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07","urls":["bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b","dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol":{"keccak256":"0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3","urls":["bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714","dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol":{"keccak256":"0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e","urls":["bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7","dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol":{"keccak256":"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218","urls":["bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f","dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol":{"keccak256":"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334","urls":["bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa","dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol":{"keccak256":"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1","urls":["bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c","dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9","urls":["bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e","dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM"],"license":"Apache-2.0"},"contracts/src/factory/facets/wallet-link/IWalletLink.sol":{"keccak256":"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b","urls":["bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13","dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/IEntitlement.sol":{"keccak256":"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca","urls":["bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3","dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf"],"license":"Apache-2.0"},"contracts/src/spaces/facets/Entitled.sol":{"keccak256":"0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c","urls":["bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7","dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc"],"license":"Apache-2.0"},"contracts/src/spaces/facets/Permissions.sol":{"keccak256":"0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5","urls":["bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721","dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/BanningBase.sol":{"keccak256":"0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270","urls":["bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d","dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/BanningStorage.sol":{"keccak256":"0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492","urls":["bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0","dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/IBanning.sol":{"keccak256":"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505","urls":["bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419","dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/ChannelService.sol":{"keccak256":"0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7","urls":["bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9","dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/ChannelStorage.sol":{"keccak256":"0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f","urls":["bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7","dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS"],"license":"Apache-2.0"},"contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol":{"keccak256":"0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2","urls":["bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5","dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9"],"license":"Apache-2.0"},"contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol":{"keccak256":"0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef","urls":["bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07","dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/EntitlementsManagerService.sol":{"keccak256":"0x6f40f5b41ad702ea55bf10f987b3e2b6d02ac527a66be523f06f025cead1867d","urls":["bzz-raw://da2012c616b833c5b491735c230be707e4f9b7657b3a71d7bdf52e7c2ba128b9","dweb:/ipfs/Qme4864V46rozVDRWtfYqtpyzE1SzBnqYQQf3iD2rrqiPg"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol":{"keccak256":"0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8","urls":["bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583","dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/MembershipStorage.sol":{"keccak256":"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3","urls":["bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee","dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/IRoles.sol":{"keccak256":"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d","urls":["bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8","dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/Roles.sol":{"keccak256":"0xc941bcf9a296c108389b1c0916ca05643a89c5f466e6b3f955bbd9dde64df762","urls":["bzz-raw://d86c333a63ffb52d23b7aa7af3711abb7501a0bddae059e5744d9ffcb1dee00b","dweb:/ipfs/QmZMhHACX9gD7CGrHnMZNJM8CWzfndT3rihUWQm8PYy8XD"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/RolesBase.sol":{"keccak256":"0x2ef137dec4a5390009fd931e34fdbb4a742c96b68b40f5c152cec8cf2809ed6f","urls":["bzz-raw://3cb29b4a780742a30ba3af5719f77a4a65ea55ebbdc3ccd9c93c86573f20c7df","dweb:/ipfs/QmdvPJydLCcEwCB3xk5VpET8X2GfrxC3NBUD5G6C8a9aW8"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/RolesStorage.sol":{"keccak256":"0x40f288a613e35cbc02aceb1d23f89af888f65538853f61cc1fcd25901b9bc4af","urls":["bzz-raw://396b5e157c9a29adc94edc5d234f416a44e6e7c4588b1aaa0587bb04018705e9","dweb:/ipfs/QmWDCQz555WbvZw7XxfkybE5dPfouc6rKxU5Zu1Gsuz1Zr"],"license":"Apache-2.0"},"contracts/src/utils/StringSet.sol":{"keccak256":"0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319","urls":["bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6","dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK"],"license":"Apache-2.0"},"contracts/src/utils/Validator.sol":{"keccak256":"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50","urls":["bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64","dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"keccak256":"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4","urls":["bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7","dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":241} \ No newline at end of file diff --git a/packages/generated/dev/abis/Roles.metadata.json b/packages/generated/dev/abis/Roles.metadata.json new file mode 100644 index 000000000..e524aad75 --- /dev/null +++ b/packages/generated/dev/abis/Roles.metadata.json @@ -0,0 +1,1154 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "ApprovalQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "BalanceQueryForZeroAddress" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__AlreadyBanned" + }, + { + "inputs": [], + "type": "error", + "name": "Banning__CannotBanSelf" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__InvalidTokenId" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__NotBanned" + }, + { + "inputs": [], + "type": "error", + "name": "ChannelService__ChannelDisabled" + }, + { + "inputs": [], + "type": "error", + "name": "ChannelService__ChannelDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "ChannelService__RoleDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "ERC5643__DurationZero" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC5643__InvalidTokenId" + }, + { + "inputs": [], + "type": "error", + "name": "ERC5643__NotApprovedOrOwner" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__InvalidValue" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotAllowed" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotMember" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__ValueAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementsService__EntitlementDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementsService__InvalidEntitlementAddress" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementsService__InvalidEntitlementInterface" + }, + { + "inputs": [], + "type": "error", + "name": "MintERC2309QuantityExceedsLimit" + }, + { + "inputs": [], + "type": "error", + "name": "MintToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "MintZeroQuantity" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "OwnerQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "OwnershipNotInitializedForExtraData" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__NotPaused" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__Paused" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__EntitlementAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__EntitlementDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__InvalidEntitlementAddress" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__InvalidPermission" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__PermissionAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__PermissionDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__RoleDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "TransferCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "TransferFromIncorrectOwner" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "URIQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "Validator__InvalidByteLength" + }, + { + "inputs": [], + "type": "error", + "name": "Validator__InvalidStringLength" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "approved", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Approval", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "operator", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ApprovalForAll", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Banned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fromTokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint256", + "name": "toTokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConsecutiveTransfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Paused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "creator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RoleCreated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "remover", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RoleRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "updater", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RoleUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint64", + "name": "expiration", + "type": "uint64", + "indexed": false + } + ], + "type": "event", + "name": "SubscriptionUpdate", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Transfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Unbanned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Unpaused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "permissions", + "type": "string[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "addPermissionsToRole" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "struct IRolesBase.CreateEntitlement", + "name": "entitlement", + "type": "tuple", + "components": [ + { + "internalType": "contract IEntitlement", + "name": "module", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ] + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "addRoleToEntitlement" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "roleName", + "type": "string" + }, + { + "internalType": "string[]", + "name": "permissions", + "type": "string[]" + }, + { + "internalType": "struct IRolesBase.CreateEntitlement[]", + "name": "entitlements", + "type": "tuple[]", + "components": [ + { + "internalType": "contract IEntitlement", + "name": "module", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ] + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "createRole", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getPermissionsByRoleId", + "outputs": [ + { + "internalType": "string[]", + "name": "permissions", + "type": "string[]" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getRoleById", + "outputs": [ + { + "internalType": "struct IRolesBase.Role", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "bool", + "name": "disabled", + "type": "bool" + }, + { + "internalType": "string[]", + "name": "permissions", + "type": "string[]" + }, + { + "internalType": "contract IEntitlement[]", + "name": "entitlements", + "type": "address[]" + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getRoles", + "outputs": [ + { + "internalType": "struct IRolesBase.Role[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "bool", + "name": "disabled", + "type": "bool" + }, + { + "internalType": "string[]", + "name": "permissions", + "type": "string[]" + }, + { + "internalType": "contract IEntitlement[]", + "name": "entitlements", + "type": "address[]" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "permissions", + "type": "string[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removePermissionsFromRole" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeRole" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "struct IRolesBase.CreateEntitlement", + "name": "entitlement", + "type": "tuple", + "components": [ + { + "internalType": "contract IEntitlement", + "name": "module", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ] + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeRoleFromEntitlement" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "roleName", + "type": "string" + }, + { + "internalType": "string[]", + "name": "permissions", + "type": "string[]" + }, + { + "internalType": "struct IRolesBase.CreateEntitlement[]", + "name": "entitlements", + "type": "tuple[]", + "components": [ + { + "internalType": "contract IEntitlement", + "name": "module", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ] + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "updateRole" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/facets/roles/Roles.sol": "Roles" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol": { + "keccak256": "0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d", + "urls": [ + "bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f", + "dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol": { + "keccak256": "0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a", + "urls": [ + "bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5", + "dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol": { + "keccak256": "0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0", + "urls": [ + "bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc", + "dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/IPausable.sol": { + "keccak256": "0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261", + "urls": [ + "bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6", + "dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableBase.sol": { + "keccak256": "0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438", + "urls": [ + "bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c", + "dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableStorage.sol": { + "keccak256": "0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07", + "urls": [ + "bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b", + "dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol": { + "keccak256": "0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3", + "urls": [ + "bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714", + "dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol": { + "keccak256": "0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e", + "urls": [ + "bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7", + "dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/IERC5643.sol": { + "keccak256": "0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218", + "urls": [ + "bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f", + "dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol": { + "keccak256": "0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334", + "urls": [ + "bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa", + "dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol": { + "keccak256": "0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1", + "urls": [ + "bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c", + "dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/IERC721A.sol": { + "keccak256": "0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9", + "urls": [ + "bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e", + "dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/wallet-link/IWalletLink.sol": { + "keccak256": "0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b", + "urls": [ + "bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13", + "dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/IEntitlement.sol": { + "keccak256": "0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca", + "urls": [ + "bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3", + "dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/Entitled.sol": { + "keccak256": "0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c", + "urls": [ + "bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7", + "dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/Permissions.sol": { + "keccak256": "0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5", + "urls": [ + "bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721", + "dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/BanningBase.sol": { + "keccak256": "0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270", + "urls": [ + "bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d", + "dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/BanningStorage.sol": { + "keccak256": "0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492", + "urls": [ + "bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0", + "dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/IBanning.sol": { + "keccak256": "0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505", + "urls": [ + "bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419", + "dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/ChannelService.sol": { + "keccak256": "0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7", + "urls": [ + "bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9", + "dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/ChannelStorage.sol": { + "keccak256": "0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f", + "urls": [ + "bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7", + "dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol": { + "keccak256": "0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2", + "urls": [ + "bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5", + "dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol": { + "keccak256": "0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef", + "urls": [ + "bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07", + "dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/EntitlementsManagerService.sol": { + "keccak256": "0x6f40f5b41ad702ea55bf10f987b3e2b6d02ac527a66be523f06f025cead1867d", + "urls": [ + "bzz-raw://da2012c616b833c5b491735c230be707e4f9b7657b3a71d7bdf52e7c2ba128b9", + "dweb:/ipfs/Qme4864V46rozVDRWtfYqtpyzE1SzBnqYQQf3iD2rrqiPg" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol": { + "keccak256": "0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8", + "urls": [ + "bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583", + "dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/MembershipStorage.sol": { + "keccak256": "0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3", + "urls": [ + "bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee", + "dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/IRoles.sol": { + "keccak256": "0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d", + "urls": [ + "bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8", + "dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/Roles.sol": { + "keccak256": "0xc941bcf9a296c108389b1c0916ca05643a89c5f466e6b3f955bbd9dde64df762", + "urls": [ + "bzz-raw://d86c333a63ffb52d23b7aa7af3711abb7501a0bddae059e5744d9ffcb1dee00b", + "dweb:/ipfs/QmZMhHACX9gD7CGrHnMZNJM8CWzfndT3rihUWQm8PYy8XD" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/RolesBase.sol": { + "keccak256": "0x2ef137dec4a5390009fd931e34fdbb4a742c96b68b40f5c152cec8cf2809ed6f", + "urls": [ + "bzz-raw://3cb29b4a780742a30ba3af5719f77a4a65ea55ebbdc3ccd9c93c86573f20c7df", + "dweb:/ipfs/QmdvPJydLCcEwCB3xk5VpET8X2GfrxC3NBUD5G6C8a9aW8" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/RolesStorage.sol": { + "keccak256": "0x40f288a613e35cbc02aceb1d23f89af888f65538853f61cc1fcd25901b9bc4af", + "urls": [ + "bzz-raw://396b5e157c9a29adc94edc5d234f416a44e6e7c4588b1aaa0587bb04018705e9", + "dweb:/ipfs/QmWDCQz555WbvZw7XxfkybE5dPfouc6rKxU5Zu1Gsuz1Zr" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/StringSet.sol": { + "keccak256": "0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319", + "urls": [ + "bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6", + "dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/Validator.sol": { + "keccak256": "0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50", + "urls": [ + "bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64", + "dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4", + "urls": [ + "bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7", + "dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/SpaceOwner.abi.json b/packages/generated/dev/abis/SpaceOwner.abi.json new file mode 100644 index 000000000..93524dc8b --- /dev/null +++ b/packages/generated/dev/abis/SpaceOwner.abi.json @@ -0,0 +1,1145 @@ +[ + { + "type": "function", + "name": "CLOCK_MODE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "DOMAIN_SEPARATOR", + "inputs": [], + "outputs": [ + { + "name": "result", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "__ERC721A_init", + "inputs": [ + { + "name": "name_", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol_", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__SpaceOwner_init", + "inputs": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "clock", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint48", + "internalType": "uint48" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "delegate", + "inputs": [ + { + "name": "delegatee", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegateBySig", + "inputs": [ + { + "name": "delegatee", + "type": "address", + "internalType": "address" + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "expiry", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "v", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "r", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegates", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "eip712Domain", + "inputs": [], + "outputs": [ + { + "name": "fields", + "type": "bytes1", + "internalType": "bytes1" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "verifyingContract", + "type": "address", + "internalType": "address" + }, + { + "name": "salt", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "extensions", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getApproved", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getFactory", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPastTotalSupply", + "inputs": [ + { + "name": "timepoint", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPastVotes", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "timepoint", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getSpaceInfo", + "inputs": [ + { + "name": "space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct ISpaceOwnerBase.Space", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "uri", + "type": "string", + "internalType": "string" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "createdAt", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getVotes", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isApprovedForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "mintSpace", + "inputs": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "uri", + "type": "string", + "internalType": "string" + }, + { + "name": "space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "nextTokenId", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "nonces", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "result", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ownerOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "setApprovalForAll", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setFactory", + "inputs": [ + { + "name": "factory", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenURI", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "updateSpaceInfo", + "inputs": [ + { + "name": "space", + "type": "address", + "internalType": "address" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "uri", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DelegateChanged", + "inputs": [ + { + "name": "delegator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "fromDelegate", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "toDelegate", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DelegateVotesChanged", + "inputs": [ + { + "name": "delegate", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "previousBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "newBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EIP712DomainChanged", + "inputs": [], + "anonymous": false + }, + { + "type": "event", + "name": "GuardianUpdated", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "enabled", + "type": "bool", + "indexed": true, + "internalType": "bool" + }, + { + "name": "cooldown", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "timestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SpaceOwner__SetFactory", + "inputs": [ + { + "name": "factory", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SpaceOwner__UpdateSpace", + "inputs": [ + { + "name": "space", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AlreadyDisabled", + "inputs": [] + }, + { + "type": "error", + "name": "AlreadyEnabled", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "ECDSAInvalidSignature", + "inputs": [] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureLength", + "inputs": [ + { + "name": "length", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureS", + "inputs": [ + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "GuardianEnabled", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_AlreadyInitialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "internalType": "uint32" + } + ] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidAccountNonce", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "currentNonce", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "NotExternalAccount", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "SafeCastOverflowedUintDowncast", + "inputs": [ + { + "name": "bits", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "SpaceOwner__OnlyFactoryAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "SpaceOwner__OnlySpaceOwnerAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidStringLength", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/SpaceOwner.abi.ts b/packages/generated/dev/abis/SpaceOwner.abi.ts new file mode 100644 index 000000000..765e69084 --- /dev/null +++ b/packages/generated/dev/abis/SpaceOwner.abi.ts @@ -0,0 +1,1145 @@ +export default [ + { + "type": "function", + "name": "CLOCK_MODE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "DOMAIN_SEPARATOR", + "inputs": [], + "outputs": [ + { + "name": "result", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "__ERC721A_init", + "inputs": [ + { + "name": "name_", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol_", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__SpaceOwner_init", + "inputs": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "clock", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint48", + "internalType": "uint48" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "delegate", + "inputs": [ + { + "name": "delegatee", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegateBySig", + "inputs": [ + { + "name": "delegatee", + "type": "address", + "internalType": "address" + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "expiry", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "v", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "r", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegates", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "eip712Domain", + "inputs": [], + "outputs": [ + { + "name": "fields", + "type": "bytes1", + "internalType": "bytes1" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "verifyingContract", + "type": "address", + "internalType": "address" + }, + { + "name": "salt", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "extensions", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getApproved", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getFactory", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPastTotalSupply", + "inputs": [ + { + "name": "timepoint", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPastVotes", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "timepoint", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getSpaceInfo", + "inputs": [ + { + "name": "space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct ISpaceOwnerBase.Space", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "uri", + "type": "string", + "internalType": "string" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "createdAt", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getVotes", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isApprovedForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "mintSpace", + "inputs": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "uri", + "type": "string", + "internalType": "string" + }, + { + "name": "space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "nextTokenId", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "nonces", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "result", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ownerOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "setApprovalForAll", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setFactory", + "inputs": [ + { + "name": "factory", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenURI", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "updateSpaceInfo", + "inputs": [ + { + "name": "space", + "type": "address", + "internalType": "address" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "uri", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DelegateChanged", + "inputs": [ + { + "name": "delegator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "fromDelegate", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "toDelegate", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DelegateVotesChanged", + "inputs": [ + { + "name": "delegate", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "previousBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "newBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EIP712DomainChanged", + "inputs": [], + "anonymous": false + }, + { + "type": "event", + "name": "GuardianUpdated", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "enabled", + "type": "bool", + "indexed": true, + "internalType": "bool" + }, + { + "name": "cooldown", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "timestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SpaceOwner__SetFactory", + "inputs": [ + { + "name": "factory", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SpaceOwner__UpdateSpace", + "inputs": [ + { + "name": "space", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AlreadyDisabled", + "inputs": [] + }, + { + "type": "error", + "name": "AlreadyEnabled", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "ECDSAInvalidSignature", + "inputs": [] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureLength", + "inputs": [ + { + "name": "length", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureS", + "inputs": [ + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "GuardianEnabled", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_AlreadyInitialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "internalType": "uint32" + } + ] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidAccountNonce", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "currentNonce", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "NotExternalAccount", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "SafeCastOverflowedUintDowncast", + "inputs": [ + { + "name": "bits", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "SpaceOwner__OnlyFactoryAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "SpaceOwner__OnlySpaceOwnerAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidStringLength", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/SpaceOwner.bin b/packages/generated/dev/abis/SpaceOwner.bin new file mode 100644 index 000000000..1f3dc3072 --- /dev/null +++ b/packages/generated/dev/abis/SpaceOwner.bin @@ -0,0 +1 @@ +60806040523480156200001157600080fd5b506200001c62000022565b620000ca565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16156200006f576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff9081161015620000c757805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b61394780620000da6000396000f3fe6080604052600436106101e35760003560e01c806375794a3c116101025780639ab24eb011610095578063c87b56dd11610064578063c87b56dd14610546578063d2f01f1914610566578063d7a901d314610586578063e985e9c5146105a657600080fd5b80639ab24eb0146104d3578063a22cb465146104f3578063b88d4fde14610513578063c3cda5201461052657600080fd5b80638e539e8c116100d15780638e539e8c1461045257806391ddadf41461047257806391de4a831461049e57806395d89b41146104be57600080fd5b806375794a3c146103e05780637ecebe00146103f557806384b0196e1461041557806388cc58e41461043d57600080fd5b806342842e0e1161017a5780635c19a95c116101495780635c19a95c146103535780636352211e146103735780636a9a38e61461039357806370a08231146103c057600080fd5b806342842e0e146102eb5780634bf5d7e9146102fe578063587cde1e146103135780635bb478081461033357600080fd5b806323b872dd116101b657806323b872dd146102835780633644e515146102965780633953801b146102ab5780633a46b1a8146102cb57600080fd5b806306fdde03146101e8578063081812fc14610213578063095ea7b31461024b57806318160ddd14610260575b600080fd5b3480156101f457600080fd5b506101fd6105d6565b60405161020a9190612f86565b60405180910390f35b34801561021f57600080fd5b5061023361022e366004612f99565b610671565b6040516001600160a01b03909116815260200161020a565b61025e610259366004612fce565b610682565b005b34801561026c57600080fd5b506102756106ca565b60405190815260200161020a565b61025e610291366004612ff8565b6106d9565b3480156102a257600080fd5b506102756108e9565b3480156102b757600080fd5b5061025e6102c63660046130e0565b6108f3565b3480156102d757600080fd5b506102756102e6366004612fce565b61090c565b61025e6102f9366004612ff8565b61091f565b34801561030a57600080fd5b506101fd61093a565b34801561031f57600080fd5b5061023361032e366004613154565b610944565b34801561033f57600080fd5b5061025e61034e366004613154565b61094f565b34801561035f57600080fd5b5061025e61036e366004613154565b6109ac565b34801561037f57600080fd5b5061023361038e366004612f99565b6109b6565b34801561039f57600080fd5b506103b36103ae366004613154565b6109c1565b60405161020a919061316f565b3480156103cc57600080fd5b506102756103db366004613154565b6109f5565b3480156103ec57600080fd5b50610275610a00565b34801561040157600080fd5b50610275610410366004613154565b610a0a565b34801561042157600080fd5b5061042a610a47565b60405161020a97969594939291906131c9565b34801561044957600080fd5b50610233610b0a565b34801561045e57600080fd5b5061027561046d366004612f99565b610b2b565b34801561047e57600080fd5b50610487610b36565b60405165ffffffffffff909116815260200161020a565b3480156104aa57600080fd5b506102756104b9366004613262565b610b40565b3480156104ca57600080fd5b506101fd610ba8565b3480156104df57600080fd5b506102756104ee366004613154565b610bc0565b3480156104ff57600080fd5b5061025e61050e3660046132d6565b610bcb565b61025e610521366004613312565b610c04565b34801561053257600080fd5b5061025e61054136600461338e565b610c4e565b34801561055257600080fd5b506101fd610561366004612f99565b610c5c565b34801561057257600080fd5b5061025e6105813660046133ee565b610c8d565b34801561059257600080fd5b5061025e6105a1366004613452565b610cce565b3480156105b257600080fd5b506105c66105c13660046134a1565b610db9565b604051901515815260200161020a565b60606105e0610dc5565b60020180546105ee906134d4565b80601f016020809104026020016040519081016040528092919081815260200182805461061a906134d4565b80156106675780601f1061063c57610100808354040283529160200191610667565b820191906000526020600020905b81548152906001019060200180831161064a57829003601f168201915b5050505050905090565b600061067c82610de9565b92915050565b6001600160a01b0382161580159061069e575061069e33610e36565b156106bc57604051638043dfaf60e01b815260040160405180910390fd5b6106c68282610eb2565b5050565b60006106d4610ebe565b905090565b60006106e482610edd565b9050836001600160a01b0316816001600160a01b0316146107175760405162a1148160e81b815260040160405180910390fd5b60008061072384610f78565b9150915061074881876107333390565b6001600160a01b039081169116811491141790565b610773576107568633610db9565b61077357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661079a57604051633a954ecd60e21b815260040160405180910390fd5b6107a78686866001610fa0565b80156107b257600082555b6107ba610dc5565b6001600160a01b03871660009081526005919091016020526040902080546000190190556107e6610dc5565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b1761081d610dc5565b60008681526004919091016020526040812091909155600160e11b84169003610893576001840161084c610dc5565b6000828152600491909101602052604081205490036108915761086d610dc5565b548114610891578361087d610dc5565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46108e18686866001610fdf565b505050505050565b60006106d4610fea565b6108fc83610ff4565b610907838383611031565b505050565b600061091883836110e4565b9392505050565b61090783838360405180602001604052806000815250610c04565b60606106d4611182565b600061067c8261121a565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031633146109a0576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6109a981611257565b50565b6109a933826112c1565b600061067c82610edd565b6109ec6040518060800160405280606081526020016060815260200160008152602001600081525090565b61067c8261135b565b600061067c82611519565b60006106d4611582565b6001600160a01b03811660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c00602052604081205461067c565b6000606080828080836000805160206138a783398151915254158015610a8c57507f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d54155b610ad05760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610997565b610ad8611592565b610ae06115a8565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60006106d4600080516020613887833981519152546001600160a01b031690565b600061067c826115be565b60006106d4611657565b60008060008051602061388783398151915280549091506001600160a01b03163314610b7f5760405163443e750b60e11b815260040160405180910390fd5b610b87611582565b9150610b9585858486611662565b610ba0336001611767565b509392505050565b6060610bb2610dc5565b60030180546105ee906134d4565b600061067c826118b7565b808015610bdc5750610bdc33610e36565b15610bfa57604051638043dfaf60e01b815260040160405180910390fd5b6106c682826118e5565b610c0f8484846106d9565b6001600160a01b0383163b15610c4857610c2b84848484611962565b610c48576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6108e1868686868686611a4d565b6060610c6782611b36565b610c8457604051630a14c4b560e41b815260040160405180910390fd5b61067c82611b72565b60008051602061390783398151915254600160201b900460ff16610cc457604051630ef4733760e31b815260040160405180910390fd5b6106c68282611d9e565b6000805160206139078339815191528054600160201b900460ff161580610cf857303b1515610d07565b8154600163ffffffff90911610155b15610d30578154604051630a8ef77f60e31b815263ffffffff9091166004820152602401610997565b815463ffffffff191660011782558015610d5757815464ff000000001916600160201b1782555b610d618585611d9e565b610d6b8584611dff565b8015610db257815464ff0000000019168255604051600181527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b5050505050565b60006109188383611e40565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b6000610df482611b36565b610e11576040516333d1c03960e21b815260040160405180910390fd5b610e19610dc5565b60009283526006016020525060409020546001600160a01b031690565b60007f0c89d3aad1b583c77a2e9f9fffa651b386c9c29e300bf2a8e2f3de1bb0100a006001600160a01b0383163b15801561091857506001600160a01b0383166000908152600182016020526040902054158061091857506001600160a01b038316600090815260018201602052604090205442109392505050565b6106c682826001611e7d565b600080610ec9610dc5565b60010154610ed5610dc5565b540303919050565b600080610ee8610dc5565b60008481526004820160205260408120549350909150600160e01b83169003610f5e5781600003610f585780548310610f3457604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115610f35575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b6000806000610f85610dc5565b60009485526006016020525050604090912080549092909150565b6001600160a01b03841615801590610fbc5750610fbc84610e36565b15610fda57604051638043dfaf60e01b815260040160405180910390fd5b610c48565b610fda848483611f32565b60006106d4611fd4565b3361100a6110018361135b565b604001516109b6565b6001600160a01b0316146109a95760405163dbfcf17d60e01b815260040160405180910390fd5b61103c826002612048565b611047816001612048565b6001600160a01b03831660009081527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477026020526040902060008051602061388783398151915290806110998582613550565b50600181016110a88482613550565b506040516001600160a01b038616907f66da702131703ee5e745ecf2f5b98311caa00729edd55541baad49289fc42ed890600090a25050505050565b60006110ee611657565b65ffffffffffff16821061113b5760405162461bcd60e51b81526020600482015260146024820152730566f7465733a20667574757265206c6f6f6b75760641b6044820152606401610997565b6111726111478361206c565b6001600160a01b038516600090815260008051602061392783398151915260205260409020906120a1565b6001600160e01b03169392505050565b60604361118d611657565b65ffffffffffff16146111e25760405162461bcd60e51b815260206004820152601860248201527f566f7465733a2062726f6b656e20636c6f636b206d6f646500000000000000006044820152606401610997565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6001600160a01b0390811660009081527f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f6560205260409020541690565b61126081612155565b60008051602061388783398151915280546001600160a01b0383166001600160a01b03199091168117825560408051918252517f64c14256e532eac2ec90ddc4973ed2d3f5623faf7951d90eec38f9b7812f99a79181900360200190a15050565b60006112cc8361121a565b6001600160a01b0384811660008181527f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f65602052604080822080546001600160a01b031916888616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461090781836113568661217c565b612187565b6113866040518060800160405280606081526020016060815260200160008152602001600081525090565b6001600160a01b03821660009081527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477026020526040908190208151608081019092528054600080516020613887833981519152929190829082906113e9906134d4565b80601f0160208091040260200160405190810160405280929190818152602001828054611415906134d4565b80156114625780601f1061143757610100808354040283529160200191611462565b820191906000526020600020905b81548152906001019060200180831161144557829003601f168201915b5050505050815260200160018201805461147b906134d4565b80601f01602080910402602001604051908101604052809291908181526020018280546114a7906134d4565b80156114f45780601f106114c9576101008083540402835291602001916114f4565b820191906000526020600020905b8154815290600101906020018083116114d757829003601f168201915b5050505050815260200160028201548152602001600382015481525050915050919050565b60006001600160a01b038216611542576040516323d3ad8160e21b815260040160405180910390fd5b67ffffffffffffffff611553610dc5565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b600061158c610dc5565b54919050565b60606000805160206138a78339815191526105e0565b60606000805160206138a7833981519152610bb2565b60006115c8611657565b65ffffffffffff1682106116155760405162461bcd60e51b81526020600482015260146024820152730566f7465733a20667574757265206c6f6f6b75760641b6044820152606401610997565b6116486116218361206c565b7f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f67906120a1565b6001600160e01b031692915050565b60006106d443612308565b61166d846002612048565b611678836000612048565b61168181612155565b60008281527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477016020908152604080832080546001600160a01b0319166001600160a01b03861690811790915581516080810183528881528084018890528083018790524260608201529084527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe5747702909252909120815160008051602061388783398151915292919081906117349082613550565b50602082015160018201906117499082613550565b50604082015160028201556060909101516003909101555050505050565b6000611771610dc5565b54905060008290036117965760405163b562e8dd60e01b815260040160405180910390fd5b6117a36000848385610fa0565b6801000000000000000182026117b7610dc5565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b17176117f2610dc5565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461187c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611844565b508160000361189d57604051622e076360e81b815260040160405180910390fd5b806118a6610dc5565b555061090790506000848385610fdf565b6001600160a01b0381166000908152600080516020613927833981519152602052604081206116489061233b565b806118ee610dc5565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611997903390899088908890600401613610565b6020604051808303816000875af19250505080156119d2575060408051601f3d908101601f191682019092526119cf9181019061364d565b60015b611a30573d808015611a00576040519150601f19603f3d011682016040523d82523d6000602084013e611a05565b606091505b508051600003611a28576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b83421115611a9d5760405162461bcd60e51b815260206004820152601860248201527f566f7465733a207369676e6174757265206578706972656400000000000000006044820152606401610997565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090611b1790611b0f9060a00160405160208183030381529060405280519060200120612374565b8585856123a1565b9050611b2381876123cf565b611b2d81886112c1565b50505050505050565b6000611b40610dc5565b548210801561067c5750600160e01b611b57610dc5565b60008481526004919091016020526040902054161592915050565b60008181527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477016020526040902054606090600080516020613887833981519152906001600160a01b031680611bd857505060408051602081019091526000815292915050565b6001600160a01b0381166000908152600283016020526040808220815160808101909252805482908290611c0b906134d4565b80601f0160208091040260200160405190810160405280929190818152602001828054611c37906134d4565b8015611c845780601f10611c5957610100808354040283529160200191611c84565b820191906000526020600020905b815481529060010190602001808311611c6757829003601f168201915b50505050508152602001600182018054611c9d906134d4565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc9906134d4565b8015611d165780601f10611ceb57610100808354040283529160200191611d16565b820191906000526020600020905b815481529060010190602001808311611cf957829003601f168201915b50505050508152602001600282015481526020016003820154815250509050611d7581600001518260200151611d4f8460600151612441565b604051602001611d6193929190613677565b6040516020818303038152906040526124d4565b604051602001611d859190613759565b6040516020818303038152906040529350505050919050565b60008051602061390783398151915254600160201b900460ff16611dd557604051630ef4733760e31b815260040160405180910390fd5b611de56380ac58cd60e01b612639565b611df5635b5e139f60e01b612639565b6106c68282612717565b60008051602061390783398151915254600160201b900460ff16611e3657604051630ef4733760e31b815260040160405180910390fd5b6106c68282612749565b6000611e4a610dc5565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b6000611e88836109b6565b90508115611ec757336001600160a01b03821614611ec757611eaa8133611e40565b611ec7576040516367d9dca160e11b815260040160405180910390fd5b83611ed0610dc5565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b6001600160a01b038316611f7857611f757f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f676127db611f70846127e7565b61281b565b50505b6001600160a01b038216611fb957611fb67f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f67612864611f70846127e7565b50505b610907611fc58461121a565b611fce8461121a565b83612187565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611fff612870565b6120076128d6565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b81518290821115610907576040516374eb20a760e01b815260040160405180910390fd5b600063ffffffff82111561209d576040516306dfcc6560e41b81526020600482015260248101839052604401610997565b5090565b8154600090818160058111156120fe5760006120bc84612926565b6120c690856137b4565b60008881526020902090915081015463ffffffff90811690871610156120ee578091506120fc565b6120f98160016137c7565b92505b505b600061210c87878585612a0e565b9050801561214757612131876121236001846137b4565b600091825260209091200190565b54600160201b90046001600160e01b031661214a565b60005b979650505050505050565b6001600160a01b0381166109a9576040516302e47d1560e41b815260040160405180910390fd5b600061067c826109f5565b816001600160a01b0316836001600160a01b0316141580156121a95750600081115b15610907576001600160a01b03831615612259576001600160a01b03831660009081526000805160206139278339815191526020526040812081906121f490612864611f70866127e7565b6001600160e01b031691506001600160e01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161224e929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610907576001600160a01b038216600090815260008051602061392783398151915260205260408120819061229f906127db611f70866127e7565b6001600160e01b031691506001600160e01b03169150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516122f9929190918252602082015260400190565b60405180910390a25050505050565b600065ffffffffffff82111561209d576040516306dfcc6560e41b81526030600482015260248101839052604401610997565b8054600090801561236b57612355836121236001846137b4565b54600160201b90046001600160e01b0316610918565b60009392505050565b600061067c612381610fea565b8360405161190160f01b8152600281019290925260228201526042902090565b6000806000806123b388888888612a64565b9250925092506123c38282612b33565b50909695505050505050565b6001600160a01b03821660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c0060205260409020805460018101909155818114610907576040516301d4b62360e61b81526001600160a01b038416600482015260248101829052604401610997565b6060600061244e83612bec565b600101905060008167ffffffffffffffff81111561246e5761246e613034565b6040519080825280601f01601f191660200182016040528015612498576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846124a257509392505050565b606081516000036124f357505060408051602081019091526000815290565b60006040518060600160405280604081526020016138c7604091399050600060038451600261252291906137c7565b61252c91906137f0565b612537906004613812565b905060006125468260206137c7565b67ffffffffffffffff81111561255e5761255e613034565b6040519080825280601f01601f191660200182016040528015612588576020820181803683370190505b509050818152600183018586518101602084015b818310156125f4576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182535060010161259c565b60038951066001811461260e576002811461261f5761262b565b613d3d60f01b60011983015261262b565b603d60f81b6000198301525b509398975050505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146126c6576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff191660011790556126df565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6000612721610dc5565b9050600281016127318482613550565b50600381016127408382613550565b50600090555050565b7f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336e6127748382613550565b507f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336f6127a08282613550565b505060006000805160206138a78339815191528190557f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d5550565b60006109188284613829565b60006001600160e01b0382111561209d576040516306dfcc6560e41b815260e0600482015260248101839052604401610997565b60008061285761283961282c611657565b65ffffffffffff1661206c565b61284f6128458861233b565b868863ffffffff16565b879190612cc4565b915091505b935093915050565b60006109188284613850565b60008061287b611592565b805190915015612892578051602090910120919050565b6000805160206138a78339815191525480156128ae5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b6000806128e16115a8565b8051909150156128f8578051602090910120919050565b7f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d5480156128ae5792915050565b60008160000361293857506000919050565b6000600161294584612cd2565b901c6001901b9050600181848161295e5761295e6137da565b048201901c90506001818481612976576129766137da565b048201901c9050600181848161298e5761298e6137da565b048201901c905060018184816129a6576129a66137da565b048201901c905060018184816129be576129be6137da565b048201901c905060018184816129d6576129d66137da565b048201901c905060018184816129ee576129ee6137da565b048201901c905061091881828581612a0857612a086137da565b04612d66565b60005b81831015610ba0576000612a258484612d7c565b60008781526020902090915063ffffffff86169082015463ffffffff161115612a5057809250612a5e565b612a5b8160016137c7565b93505b50612a11565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612a9f5750600091506003905082612b29565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612af3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612b1f57506000925060019150829050612b29565b9250600091508190505b9450945094915050565b6000826003811115612b4757612b47613870565b03612b50575050565b6001826003811115612b6457612b64613870565b03612b825760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115612b9657612b96613870565b03612bb75760405163fce698f760e01b815260048101829052602401610997565b6003826003811115612bcb57612bcb613870565b036106c6576040516335e2f38360e21b815260048101829052602401610997565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612c2b5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612c57576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612c7557662386f26fc10000830492506010015b6305f5e1008310612c8d576305f5e100830492506008015b6127108310612ca157612710830492506004015b60648310612cb3576064830492506002015b600a831061067c5760010192915050565b600080612857858585612d97565b600080608083901c15612ce757608092831c92015b604083901c15612cf957604092831c92015b602083901c15612d0b57602092831c92015b601083901c15612d1d57601092831c92015b600883901c15612d2f57600892831c92015b600483901c15612d4157600492831c92015b600283901c15612d5357600292831c92015b600183901c1561067c5760010192915050565b6000818310612d755781610918565b5090919050565b6000612d8b60028484186137f0565b610918908484166137c7565b825460009081908015612edd576000612db5876121236001856137b4565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b031660208401529192509087161015612e365760405162461bcd60e51b815260206004820152601b60248201527f436865636b706f696e743a2064656372656173696e67206b65797300000000006044820152606401610997565b805163ffffffff808816911603612e7e5784612e57886121236001866137b4565b80546001600160e01b0392909216600160201b0263ffffffff909216919091179055612ecd565b6040805180820190915263ffffffff80881682526001600160e01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216600160201b029216919091179101555b60200151925083915061285c9050565b50506040805180820190915263ffffffff80851682526001600160e01b0380851660208085019182528854600181018a5560008a815291822095519251909316600160201b02919093161792019190915590508161285c565b60005b83811015612f51578181015183820152602001612f39565b50506000910152565b60008151808452612f72816020860160208601612f36565b601f01601f19169290920160200192915050565b6020815260006109186020830184612f5a565b600060208284031215612fab57600080fd5b5035919050565b80356001600160a01b0381168114612fc957600080fd5b919050565b60008060408385031215612fe157600080fd5b612fea83612fb2565b946020939093013593505050565b60008060006060848603121561300d57600080fd5b61301684612fb2565b925061302460208501612fb2565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561306557613065613034565b604051601f8501601f19908116603f0116810190828211818310171561308d5761308d613034565b816040528093508581528686860111156130a657600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126130d157600080fd5b6109188383356020850161304a565b6000806000606084860312156130f557600080fd5b6130fe84612fb2565b9250602084013567ffffffffffffffff8082111561311b57600080fd5b613127878388016130c0565b9350604086013591508082111561313d57600080fd5b5061314a868287016130c0565b9150509250925092565b60006020828403121561316657600080fd5b61091882612fb2565b60208152600082516080602084015261318b60a0840182612f5a565b90506020840151601f198483030160408501526131a88282612f5a565b91505060408401516060840152606084015160808401528091505092915050565b60ff60f81b881681526000602060e060208401526131ea60e084018a612f5a565b83810360408501526131fc818a612f5a565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b8181101561325057835183529284019291840191600101613234565b50909c9b505050505050505050505050565b60008060006060848603121561327757600080fd5b833567ffffffffffffffff8082111561328f57600080fd5b61329b878388016130c0565b945060208601359150808211156132b157600080fd5b506132be868287016130c0565b9250506132cd60408501612fb2565b90509250925092565b600080604083850312156132e957600080fd5b6132f283612fb2565b91506020830135801515811461330757600080fd5b809150509250929050565b6000806000806080858703121561332857600080fd5b61333185612fb2565b935061333f60208601612fb2565b925060408501359150606085013567ffffffffffffffff81111561336257600080fd5b8501601f8101871361337357600080fd5b6133828782356020840161304a565b91505092959194509250565b60008060008060008060c087890312156133a757600080fd5b6133b087612fb2565b95506020870135945060408701359350606087013560ff811681146133d457600080fd5b9598949750929560808101359460a0909101359350915050565b6000806040838503121561340157600080fd5b823567ffffffffffffffff8082111561341957600080fd5b613425868387016130c0565b9350602085013591508082111561343b57600080fd5b50613448858286016130c0565b9150509250929050565b60008060006060848603121561346757600080fd5b833567ffffffffffffffff8082111561347f57600080fd5b61348b878388016130c0565b9450602086013591508082111561311b57600080fd5b600080604083850312156134b457600080fd5b6134bd83612fb2565b91506134cb60208401612fb2565b90509250929050565b600181811c908216806134e857607f821691505b602082108103610f5857634e487b7160e01b600052602260045260246000fd5b601f821115610907576000816000526020600020601f850160051c810160208610156135315750805b601f850160051c820191505b818110156108e15782815560010161353d565b815167ffffffffffffffff81111561356a5761356a613034565b61357e8161357884546134d4565b84613508565b602080601f8311600181146135b3576000841561359b5750858301515b600019600386901b1c1916600185901b1785556108e1565b600085815260208120601f198616915b828110156135e2578886015182559484019460019091019084016135c3565b50858210156136005787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061364390830184612f5a565b9695505050505050565b60006020828403121561365f57600080fd5b81516001600160e01b03198116811461091857600080fd5b683d913730b6b2911d1160b91b8152835160009061369c816009850160208901612f36565b6a11161134b6b0b3b2911d1160a91b60099184019182015284516136c7816014840160208901612f36565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a2243601492909101918201527f726561746564222c22646973706c61795f74797065223a202264617465222c20603482015267113b30b63ab2911d60c11b6054820152835161373c81605c840160208801612f36565b627d5d7d60e81b605c9290910191820152605f0195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161379181601d850160208701612f36565b91909101601d0192915050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561067c5761067c61379e565b8082018082111561067c5761067c61379e565b634e487b7160e01b600052601260045260246000fd5b60008261380d57634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761067c5761067c61379e565b6001600160e01b038181168382160190808211156138495761384961379e565b5092915050565b6001600160e01b038281168282160390808211156138495761384961379e565b634e487b7160e01b600052602160045260246000fdfe7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477003a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336c4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef52000423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f66 \ No newline at end of file diff --git a/packages/generated/dev/abis/SpaceOwner.json b/packages/generated/dev/abis/SpaceOwner.json new file mode 100644 index 000000000..293544f76 --- /dev/null +++ b/packages/generated/dev/abis/SpaceOwner.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"CLOCK_MODE","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"DOMAIN_SEPARATOR","inputs":[],"outputs":[{"name":"result","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"__ERC721A_init","inputs":[{"name":"name_","type":"string","internalType":"string"},{"name":"symbol_","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"__SpaceOwner_init","inputs":[{"name":"name","type":"string","internalType":"string"},{"name":"symbol","type":"string","internalType":"string"},{"name":"version","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"approve","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"balanceOf","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"clock","inputs":[],"outputs":[{"name":"","type":"uint48","internalType":"uint48"}],"stateMutability":"view"},{"type":"function","name":"delegate","inputs":[{"name":"delegatee","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"delegateBySig","inputs":[{"name":"delegatee","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"expiry","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"delegates","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"eip712Domain","inputs":[],"outputs":[{"name":"fields","type":"bytes1","internalType":"bytes1"},{"name":"name","type":"string","internalType":"string"},{"name":"version","type":"string","internalType":"string"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"verifyingContract","type":"address","internalType":"address"},{"name":"salt","type":"bytes32","internalType":"bytes32"},{"name":"extensions","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"getApproved","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getFactory","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getPastTotalSupply","inputs":[{"name":"timepoint","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getPastVotes","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"timepoint","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getSpaceInfo","inputs":[{"name":"space","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","internalType":"struct ISpaceOwnerBase.Space","components":[{"name":"name","type":"string","internalType":"string"},{"name":"uri","type":"string","internalType":"string"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"createdAt","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"getVotes","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"isApprovedForAll","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"mintSpace","inputs":[{"name":"name","type":"string","internalType":"string"},{"name":"uri","type":"string","internalType":"string"},{"name":"space","type":"address","internalType":"address"}],"outputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"nextTokenId","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"nonces","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"result","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"ownerOf","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"setApprovalForAll","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setFactory","inputs":[{"name":"factory","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"tokenURI","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"updateSpaceInfo","inputs":[{"name":"space","type":"address","internalType":"address"},{"name":"name","type":"string","internalType":"string"},{"name":"uri","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"ConsecutiveTransfer","inputs":[{"name":"fromTokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"toTokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"DelegateChanged","inputs":[{"name":"delegator","type":"address","indexed":true,"internalType":"address"},{"name":"fromDelegate","type":"address","indexed":true,"internalType":"address"},{"name":"toDelegate","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"DelegateVotesChanged","inputs":[{"name":"delegate","type":"address","indexed":true,"internalType":"address"},{"name":"previousBalance","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newBalance","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"EIP712DomainChanged","inputs":[],"anonymous":false},{"type":"event","name":"GuardianUpdated","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"enabled","type":"bool","indexed":true,"internalType":"bool"},{"name":"cooldown","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"SpaceOwner__SetFactory","inputs":[{"name":"factory","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"SpaceOwner__UpdateSpace","inputs":[{"name":"space","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"AlreadyDisabled","inputs":[]},{"type":"error","name":"AlreadyEnabled","inputs":[]},{"type":"error","name":"ApprovalCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"ApprovalQueryForNonexistentToken","inputs":[]},{"type":"error","name":"BalanceQueryForZeroAddress","inputs":[]},{"type":"error","name":"ECDSAInvalidSignature","inputs":[]},{"type":"error","name":"ECDSAInvalidSignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ECDSAInvalidSignatureS","inputs":[{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"GuardianEnabled","inputs":[]},{"type":"error","name":"Initializable_AlreadyInitialized","inputs":[{"name":"version","type":"uint32","internalType":"uint32"}]},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"InvalidAccountNonce","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"currentNonce","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"MintERC2309QuantityExceedsLimit","inputs":[]},{"type":"error","name":"MintToZeroAddress","inputs":[]},{"type":"error","name":"MintZeroQuantity","inputs":[]},{"type":"error","name":"NotExternalAccount","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]},{"type":"error","name":"OwnerQueryForNonexistentToken","inputs":[]},{"type":"error","name":"OwnershipNotInitializedForExtraData","inputs":[]},{"type":"error","name":"SafeCastOverflowedUintDowncast","inputs":[{"name":"bits","type":"uint8","internalType":"uint8"},{"name":"value","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"SpaceOwner__OnlyFactoryAllowed","inputs":[]},{"type":"error","name":"SpaceOwner__OnlySpaceOwnerAllowed","inputs":[]},{"type":"error","name":"TransferCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"TransferFromIncorrectOwner","inputs":[]},{"type":"error","name":"TransferToNonERC721ReceiverImplementer","inputs":[]},{"type":"error","name":"TransferToZeroAddress","inputs":[]},{"type":"error","name":"URIQueryForNonexistentToken","inputs":[]},{"type":"error","name":"Validator__InvalidAddress","inputs":[]},{"type":"error","name":"Validator__InvalidStringLength","inputs":[]}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b506200001c62000022565b620000ca565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16156200006f576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff9081161015620000c757805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b61394780620000da6000396000f3fe6080604052600436106101e35760003560e01c806375794a3c116101025780639ab24eb011610095578063c87b56dd11610064578063c87b56dd14610546578063d2f01f1914610566578063d7a901d314610586578063e985e9c5146105a657600080fd5b80639ab24eb0146104d3578063a22cb465146104f3578063b88d4fde14610513578063c3cda5201461052657600080fd5b80638e539e8c116100d15780638e539e8c1461045257806391ddadf41461047257806391de4a831461049e57806395d89b41146104be57600080fd5b806375794a3c146103e05780637ecebe00146103f557806384b0196e1461041557806388cc58e41461043d57600080fd5b806342842e0e1161017a5780635c19a95c116101495780635c19a95c146103535780636352211e146103735780636a9a38e61461039357806370a08231146103c057600080fd5b806342842e0e146102eb5780634bf5d7e9146102fe578063587cde1e146103135780635bb478081461033357600080fd5b806323b872dd116101b657806323b872dd146102835780633644e515146102965780633953801b146102ab5780633a46b1a8146102cb57600080fd5b806306fdde03146101e8578063081812fc14610213578063095ea7b31461024b57806318160ddd14610260575b600080fd5b3480156101f457600080fd5b506101fd6105d6565b60405161020a9190612f86565b60405180910390f35b34801561021f57600080fd5b5061023361022e366004612f99565b610671565b6040516001600160a01b03909116815260200161020a565b61025e610259366004612fce565b610682565b005b34801561026c57600080fd5b506102756106ca565b60405190815260200161020a565b61025e610291366004612ff8565b6106d9565b3480156102a257600080fd5b506102756108e9565b3480156102b757600080fd5b5061025e6102c63660046130e0565b6108f3565b3480156102d757600080fd5b506102756102e6366004612fce565b61090c565b61025e6102f9366004612ff8565b61091f565b34801561030a57600080fd5b506101fd61093a565b34801561031f57600080fd5b5061023361032e366004613154565b610944565b34801561033f57600080fd5b5061025e61034e366004613154565b61094f565b34801561035f57600080fd5b5061025e61036e366004613154565b6109ac565b34801561037f57600080fd5b5061023361038e366004612f99565b6109b6565b34801561039f57600080fd5b506103b36103ae366004613154565b6109c1565b60405161020a919061316f565b3480156103cc57600080fd5b506102756103db366004613154565b6109f5565b3480156103ec57600080fd5b50610275610a00565b34801561040157600080fd5b50610275610410366004613154565b610a0a565b34801561042157600080fd5b5061042a610a47565b60405161020a97969594939291906131c9565b34801561044957600080fd5b50610233610b0a565b34801561045e57600080fd5b5061027561046d366004612f99565b610b2b565b34801561047e57600080fd5b50610487610b36565b60405165ffffffffffff909116815260200161020a565b3480156104aa57600080fd5b506102756104b9366004613262565b610b40565b3480156104ca57600080fd5b506101fd610ba8565b3480156104df57600080fd5b506102756104ee366004613154565b610bc0565b3480156104ff57600080fd5b5061025e61050e3660046132d6565b610bcb565b61025e610521366004613312565b610c04565b34801561053257600080fd5b5061025e61054136600461338e565b610c4e565b34801561055257600080fd5b506101fd610561366004612f99565b610c5c565b34801561057257600080fd5b5061025e6105813660046133ee565b610c8d565b34801561059257600080fd5b5061025e6105a1366004613452565b610cce565b3480156105b257600080fd5b506105c66105c13660046134a1565b610db9565b604051901515815260200161020a565b60606105e0610dc5565b60020180546105ee906134d4565b80601f016020809104026020016040519081016040528092919081815260200182805461061a906134d4565b80156106675780601f1061063c57610100808354040283529160200191610667565b820191906000526020600020905b81548152906001019060200180831161064a57829003601f168201915b5050505050905090565b600061067c82610de9565b92915050565b6001600160a01b0382161580159061069e575061069e33610e36565b156106bc57604051638043dfaf60e01b815260040160405180910390fd5b6106c68282610eb2565b5050565b60006106d4610ebe565b905090565b60006106e482610edd565b9050836001600160a01b0316816001600160a01b0316146107175760405162a1148160e81b815260040160405180910390fd5b60008061072384610f78565b9150915061074881876107333390565b6001600160a01b039081169116811491141790565b610773576107568633610db9565b61077357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661079a57604051633a954ecd60e21b815260040160405180910390fd5b6107a78686866001610fa0565b80156107b257600082555b6107ba610dc5565b6001600160a01b03871660009081526005919091016020526040902080546000190190556107e6610dc5565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b1761081d610dc5565b60008681526004919091016020526040812091909155600160e11b84169003610893576001840161084c610dc5565b6000828152600491909101602052604081205490036108915761086d610dc5565b548114610891578361087d610dc5565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46108e18686866001610fdf565b505050505050565b60006106d4610fea565b6108fc83610ff4565b610907838383611031565b505050565b600061091883836110e4565b9392505050565b61090783838360405180602001604052806000815250610c04565b60606106d4611182565b600061067c8261121a565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031633146109a0576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6109a981611257565b50565b6109a933826112c1565b600061067c82610edd565b6109ec6040518060800160405280606081526020016060815260200160008152602001600081525090565b61067c8261135b565b600061067c82611519565b60006106d4611582565b6001600160a01b03811660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c00602052604081205461067c565b6000606080828080836000805160206138a783398151915254158015610a8c57507f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d54155b610ad05760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610997565b610ad8611592565b610ae06115a8565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60006106d4600080516020613887833981519152546001600160a01b031690565b600061067c826115be565b60006106d4611657565b60008060008051602061388783398151915280549091506001600160a01b03163314610b7f5760405163443e750b60e11b815260040160405180910390fd5b610b87611582565b9150610b9585858486611662565b610ba0336001611767565b509392505050565b6060610bb2610dc5565b60030180546105ee906134d4565b600061067c826118b7565b808015610bdc5750610bdc33610e36565b15610bfa57604051638043dfaf60e01b815260040160405180910390fd5b6106c682826118e5565b610c0f8484846106d9565b6001600160a01b0383163b15610c4857610c2b84848484611962565b610c48576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6108e1868686868686611a4d565b6060610c6782611b36565b610c8457604051630a14c4b560e41b815260040160405180910390fd5b61067c82611b72565b60008051602061390783398151915254600160201b900460ff16610cc457604051630ef4733760e31b815260040160405180910390fd5b6106c68282611d9e565b6000805160206139078339815191528054600160201b900460ff161580610cf857303b1515610d07565b8154600163ffffffff90911610155b15610d30578154604051630a8ef77f60e31b815263ffffffff9091166004820152602401610997565b815463ffffffff191660011782558015610d5757815464ff000000001916600160201b1782555b610d618585611d9e565b610d6b8584611dff565b8015610db257815464ff0000000019168255604051600181527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b5050505050565b60006109188383611e40565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b6000610df482611b36565b610e11576040516333d1c03960e21b815260040160405180910390fd5b610e19610dc5565b60009283526006016020525060409020546001600160a01b031690565b60007f0c89d3aad1b583c77a2e9f9fffa651b386c9c29e300bf2a8e2f3de1bb0100a006001600160a01b0383163b15801561091857506001600160a01b0383166000908152600182016020526040902054158061091857506001600160a01b038316600090815260018201602052604090205442109392505050565b6106c682826001611e7d565b600080610ec9610dc5565b60010154610ed5610dc5565b540303919050565b600080610ee8610dc5565b60008481526004820160205260408120549350909150600160e01b83169003610f5e5781600003610f585780548310610f3457604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115610f35575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b6000806000610f85610dc5565b60009485526006016020525050604090912080549092909150565b6001600160a01b03841615801590610fbc5750610fbc84610e36565b15610fda57604051638043dfaf60e01b815260040160405180910390fd5b610c48565b610fda848483611f32565b60006106d4611fd4565b3361100a6110018361135b565b604001516109b6565b6001600160a01b0316146109a95760405163dbfcf17d60e01b815260040160405180910390fd5b61103c826002612048565b611047816001612048565b6001600160a01b03831660009081527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477026020526040902060008051602061388783398151915290806110998582613550565b50600181016110a88482613550565b506040516001600160a01b038616907f66da702131703ee5e745ecf2f5b98311caa00729edd55541baad49289fc42ed890600090a25050505050565b60006110ee611657565b65ffffffffffff16821061113b5760405162461bcd60e51b81526020600482015260146024820152730566f7465733a20667574757265206c6f6f6b75760641b6044820152606401610997565b6111726111478361206c565b6001600160a01b038516600090815260008051602061392783398151915260205260409020906120a1565b6001600160e01b03169392505050565b60604361118d611657565b65ffffffffffff16146111e25760405162461bcd60e51b815260206004820152601860248201527f566f7465733a2062726f6b656e20636c6f636b206d6f646500000000000000006044820152606401610997565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6001600160a01b0390811660009081527f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f6560205260409020541690565b61126081612155565b60008051602061388783398151915280546001600160a01b0383166001600160a01b03199091168117825560408051918252517f64c14256e532eac2ec90ddc4973ed2d3f5623faf7951d90eec38f9b7812f99a79181900360200190a15050565b60006112cc8361121a565b6001600160a01b0384811660008181527f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f65602052604080822080546001600160a01b031916888616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461090781836113568661217c565b612187565b6113866040518060800160405280606081526020016060815260200160008152602001600081525090565b6001600160a01b03821660009081527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477026020526040908190208151608081019092528054600080516020613887833981519152929190829082906113e9906134d4565b80601f0160208091040260200160405190810160405280929190818152602001828054611415906134d4565b80156114625780601f1061143757610100808354040283529160200191611462565b820191906000526020600020905b81548152906001019060200180831161144557829003601f168201915b5050505050815260200160018201805461147b906134d4565b80601f01602080910402602001604051908101604052809291908181526020018280546114a7906134d4565b80156114f45780601f106114c9576101008083540402835291602001916114f4565b820191906000526020600020905b8154815290600101906020018083116114d757829003601f168201915b5050505050815260200160028201548152602001600382015481525050915050919050565b60006001600160a01b038216611542576040516323d3ad8160e21b815260040160405180910390fd5b67ffffffffffffffff611553610dc5565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b600061158c610dc5565b54919050565b60606000805160206138a78339815191526105e0565b60606000805160206138a7833981519152610bb2565b60006115c8611657565b65ffffffffffff1682106116155760405162461bcd60e51b81526020600482015260146024820152730566f7465733a20667574757265206c6f6f6b75760641b6044820152606401610997565b6116486116218361206c565b7f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f67906120a1565b6001600160e01b031692915050565b60006106d443612308565b61166d846002612048565b611678836000612048565b61168181612155565b60008281527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477016020908152604080832080546001600160a01b0319166001600160a01b03861690811790915581516080810183528881528084018890528083018790524260608201529084527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe5747702909252909120815160008051602061388783398151915292919081906117349082613550565b50602082015160018201906117499082613550565b50604082015160028201556060909101516003909101555050505050565b6000611771610dc5565b54905060008290036117965760405163b562e8dd60e01b815260040160405180910390fd5b6117a36000848385610fa0565b6801000000000000000182026117b7610dc5565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b17176117f2610dc5565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461187c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611844565b508160000361189d57604051622e076360e81b815260040160405180910390fd5b806118a6610dc5565b555061090790506000848385610fdf565b6001600160a01b0381166000908152600080516020613927833981519152602052604081206116489061233b565b806118ee610dc5565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611997903390899088908890600401613610565b6020604051808303816000875af19250505080156119d2575060408051601f3d908101601f191682019092526119cf9181019061364d565b60015b611a30573d808015611a00576040519150601f19603f3d011682016040523d82523d6000602084013e611a05565b606091505b508051600003611a28576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b83421115611a9d5760405162461bcd60e51b815260206004820152601860248201527f566f7465733a207369676e6174757265206578706972656400000000000000006044820152606401610997565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090611b1790611b0f9060a00160405160208183030381529060405280519060200120612374565b8585856123a1565b9050611b2381876123cf565b611b2d81886112c1565b50505050505050565b6000611b40610dc5565b548210801561067c5750600160e01b611b57610dc5565b60008481526004919091016020526040902054161592915050565b60008181527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477016020526040902054606090600080516020613887833981519152906001600160a01b031680611bd857505060408051602081019091526000815292915050565b6001600160a01b0381166000908152600283016020526040808220815160808101909252805482908290611c0b906134d4565b80601f0160208091040260200160405190810160405280929190818152602001828054611c37906134d4565b8015611c845780601f10611c5957610100808354040283529160200191611c84565b820191906000526020600020905b815481529060010190602001808311611c6757829003601f168201915b50505050508152602001600182018054611c9d906134d4565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc9906134d4565b8015611d165780601f10611ceb57610100808354040283529160200191611d16565b820191906000526020600020905b815481529060010190602001808311611cf957829003601f168201915b50505050508152602001600282015481526020016003820154815250509050611d7581600001518260200151611d4f8460600151612441565b604051602001611d6193929190613677565b6040516020818303038152906040526124d4565b604051602001611d859190613759565b6040516020818303038152906040529350505050919050565b60008051602061390783398151915254600160201b900460ff16611dd557604051630ef4733760e31b815260040160405180910390fd5b611de56380ac58cd60e01b612639565b611df5635b5e139f60e01b612639565b6106c68282612717565b60008051602061390783398151915254600160201b900460ff16611e3657604051630ef4733760e31b815260040160405180910390fd5b6106c68282612749565b6000611e4a610dc5565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b6000611e88836109b6565b90508115611ec757336001600160a01b03821614611ec757611eaa8133611e40565b611ec7576040516367d9dca160e11b815260040160405180910390fd5b83611ed0610dc5565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b6001600160a01b038316611f7857611f757f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f676127db611f70846127e7565b61281b565b50505b6001600160a01b038216611fb957611fb67f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f67612864611f70846127e7565b50505b610907611fc58461121a565b611fce8461121a565b83612187565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611fff612870565b6120076128d6565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b81518290821115610907576040516374eb20a760e01b815260040160405180910390fd5b600063ffffffff82111561209d576040516306dfcc6560e41b81526020600482015260248101839052604401610997565b5090565b8154600090818160058111156120fe5760006120bc84612926565b6120c690856137b4565b60008881526020902090915081015463ffffffff90811690871610156120ee578091506120fc565b6120f98160016137c7565b92505b505b600061210c87878585612a0e565b9050801561214757612131876121236001846137b4565b600091825260209091200190565b54600160201b90046001600160e01b031661214a565b60005b979650505050505050565b6001600160a01b0381166109a9576040516302e47d1560e41b815260040160405180910390fd5b600061067c826109f5565b816001600160a01b0316836001600160a01b0316141580156121a95750600081115b15610907576001600160a01b03831615612259576001600160a01b03831660009081526000805160206139278339815191526020526040812081906121f490612864611f70866127e7565b6001600160e01b031691506001600160e01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161224e929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610907576001600160a01b038216600090815260008051602061392783398151915260205260408120819061229f906127db611f70866127e7565b6001600160e01b031691506001600160e01b03169150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516122f9929190918252602082015260400190565b60405180910390a25050505050565b600065ffffffffffff82111561209d576040516306dfcc6560e41b81526030600482015260248101839052604401610997565b8054600090801561236b57612355836121236001846137b4565b54600160201b90046001600160e01b0316610918565b60009392505050565b600061067c612381610fea565b8360405161190160f01b8152600281019290925260228201526042902090565b6000806000806123b388888888612a64565b9250925092506123c38282612b33565b50909695505050505050565b6001600160a01b03821660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c0060205260409020805460018101909155818114610907576040516301d4b62360e61b81526001600160a01b038416600482015260248101829052604401610997565b6060600061244e83612bec565b600101905060008167ffffffffffffffff81111561246e5761246e613034565b6040519080825280601f01601f191660200182016040528015612498576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846124a257509392505050565b606081516000036124f357505060408051602081019091526000815290565b60006040518060600160405280604081526020016138c7604091399050600060038451600261252291906137c7565b61252c91906137f0565b612537906004613812565b905060006125468260206137c7565b67ffffffffffffffff81111561255e5761255e613034565b6040519080825280601f01601f191660200182016040528015612588576020820181803683370190505b509050818152600183018586518101602084015b818310156125f4576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182535060010161259c565b60038951066001811461260e576002811461261f5761262b565b613d3d60f01b60011983015261262b565b603d60f81b6000198301525b509398975050505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146126c6576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff191660011790556126df565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6000612721610dc5565b9050600281016127318482613550565b50600381016127408382613550565b50600090555050565b7f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336e6127748382613550565b507f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336f6127a08282613550565b505060006000805160206138a78339815191528190557f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d5550565b60006109188284613829565b60006001600160e01b0382111561209d576040516306dfcc6560e41b815260e0600482015260248101839052604401610997565b60008061285761283961282c611657565b65ffffffffffff1661206c565b61284f6128458861233b565b868863ffffffff16565b879190612cc4565b915091505b935093915050565b60006109188284613850565b60008061287b611592565b805190915015612892578051602090910120919050565b6000805160206138a78339815191525480156128ae5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b6000806128e16115a8565b8051909150156128f8578051602090910120919050565b7f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d5480156128ae5792915050565b60008160000361293857506000919050565b6000600161294584612cd2565b901c6001901b9050600181848161295e5761295e6137da565b048201901c90506001818481612976576129766137da565b048201901c9050600181848161298e5761298e6137da565b048201901c905060018184816129a6576129a66137da565b048201901c905060018184816129be576129be6137da565b048201901c905060018184816129d6576129d66137da565b048201901c905060018184816129ee576129ee6137da565b048201901c905061091881828581612a0857612a086137da565b04612d66565b60005b81831015610ba0576000612a258484612d7c565b60008781526020902090915063ffffffff86169082015463ffffffff161115612a5057809250612a5e565b612a5b8160016137c7565b93505b50612a11565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612a9f5750600091506003905082612b29565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612af3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612b1f57506000925060019150829050612b29565b9250600091508190505b9450945094915050565b6000826003811115612b4757612b47613870565b03612b50575050565b6001826003811115612b6457612b64613870565b03612b825760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115612b9657612b96613870565b03612bb75760405163fce698f760e01b815260048101829052602401610997565b6003826003811115612bcb57612bcb613870565b036106c6576040516335e2f38360e21b815260048101829052602401610997565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612c2b5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612c57576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612c7557662386f26fc10000830492506010015b6305f5e1008310612c8d576305f5e100830492506008015b6127108310612ca157612710830492506004015b60648310612cb3576064830492506002015b600a831061067c5760010192915050565b600080612857858585612d97565b600080608083901c15612ce757608092831c92015b604083901c15612cf957604092831c92015b602083901c15612d0b57602092831c92015b601083901c15612d1d57601092831c92015b600883901c15612d2f57600892831c92015b600483901c15612d4157600492831c92015b600283901c15612d5357600292831c92015b600183901c1561067c5760010192915050565b6000818310612d755781610918565b5090919050565b6000612d8b60028484186137f0565b610918908484166137c7565b825460009081908015612edd576000612db5876121236001856137b4565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b031660208401529192509087161015612e365760405162461bcd60e51b815260206004820152601b60248201527f436865636b706f696e743a2064656372656173696e67206b65797300000000006044820152606401610997565b805163ffffffff808816911603612e7e5784612e57886121236001866137b4565b80546001600160e01b0392909216600160201b0263ffffffff909216919091179055612ecd565b6040805180820190915263ffffffff80881682526001600160e01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216600160201b029216919091179101555b60200151925083915061285c9050565b50506040805180820190915263ffffffff80851682526001600160e01b0380851660208085019182528854600181018a5560008a815291822095519251909316600160201b02919093161792019190915590508161285c565b60005b83811015612f51578181015183820152602001612f39565b50506000910152565b60008151808452612f72816020860160208601612f36565b601f01601f19169290920160200192915050565b6020815260006109186020830184612f5a565b600060208284031215612fab57600080fd5b5035919050565b80356001600160a01b0381168114612fc957600080fd5b919050565b60008060408385031215612fe157600080fd5b612fea83612fb2565b946020939093013593505050565b60008060006060848603121561300d57600080fd5b61301684612fb2565b925061302460208501612fb2565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561306557613065613034565b604051601f8501601f19908116603f0116810190828211818310171561308d5761308d613034565b816040528093508581528686860111156130a657600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126130d157600080fd5b6109188383356020850161304a565b6000806000606084860312156130f557600080fd5b6130fe84612fb2565b9250602084013567ffffffffffffffff8082111561311b57600080fd5b613127878388016130c0565b9350604086013591508082111561313d57600080fd5b5061314a868287016130c0565b9150509250925092565b60006020828403121561316657600080fd5b61091882612fb2565b60208152600082516080602084015261318b60a0840182612f5a565b90506020840151601f198483030160408501526131a88282612f5a565b91505060408401516060840152606084015160808401528091505092915050565b60ff60f81b881681526000602060e060208401526131ea60e084018a612f5a565b83810360408501526131fc818a612f5a565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b8181101561325057835183529284019291840191600101613234565b50909c9b505050505050505050505050565b60008060006060848603121561327757600080fd5b833567ffffffffffffffff8082111561328f57600080fd5b61329b878388016130c0565b945060208601359150808211156132b157600080fd5b506132be868287016130c0565b9250506132cd60408501612fb2565b90509250925092565b600080604083850312156132e957600080fd5b6132f283612fb2565b91506020830135801515811461330757600080fd5b809150509250929050565b6000806000806080858703121561332857600080fd5b61333185612fb2565b935061333f60208601612fb2565b925060408501359150606085013567ffffffffffffffff81111561336257600080fd5b8501601f8101871361337357600080fd5b6133828782356020840161304a565b91505092959194509250565b60008060008060008060c087890312156133a757600080fd5b6133b087612fb2565b95506020870135945060408701359350606087013560ff811681146133d457600080fd5b9598949750929560808101359460a0909101359350915050565b6000806040838503121561340157600080fd5b823567ffffffffffffffff8082111561341957600080fd5b613425868387016130c0565b9350602085013591508082111561343b57600080fd5b50613448858286016130c0565b9150509250929050565b60008060006060848603121561346757600080fd5b833567ffffffffffffffff8082111561347f57600080fd5b61348b878388016130c0565b9450602086013591508082111561311b57600080fd5b600080604083850312156134b457600080fd5b6134bd83612fb2565b91506134cb60208401612fb2565b90509250929050565b600181811c908216806134e857607f821691505b602082108103610f5857634e487b7160e01b600052602260045260246000fd5b601f821115610907576000816000526020600020601f850160051c810160208610156135315750805b601f850160051c820191505b818110156108e15782815560010161353d565b815167ffffffffffffffff81111561356a5761356a613034565b61357e8161357884546134d4565b84613508565b602080601f8311600181146135b3576000841561359b5750858301515b600019600386901b1c1916600185901b1785556108e1565b600085815260208120601f198616915b828110156135e2578886015182559484019460019091019084016135c3565b50858210156136005787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061364390830184612f5a565b9695505050505050565b60006020828403121561365f57600080fd5b81516001600160e01b03198116811461091857600080fd5b683d913730b6b2911d1160b91b8152835160009061369c816009850160208901612f36565b6a11161134b6b0b3b2911d1160a91b60099184019182015284516136c7816014840160208901612f36565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a2243601492909101918201527f726561746564222c22646973706c61795f74797065223a202264617465222c20603482015267113b30b63ab2911d60c11b6054820152835161373c81605c840160208801612f36565b627d5d7d60e81b605c9290910191820152605f0195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161379181601d850160208701612f36565b91909101601d0192915050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561067c5761067c61379e565b8082018082111561067c5761067c61379e565b634e487b7160e01b600052601260045260246000fd5b60008261380d57634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761067c5761067c61379e565b6001600160e01b038181168382160190808211156138495761384961379e565b5092915050565b6001600160e01b038281168282160390808211156138495761384961379e565b634e487b7160e01b600052602160045260246000fdfe7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477003a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336c4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef52000423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f66","sourceMap":"593:3939:235:-:0;;;;;;;;;;;;-1:-1:-1;385:22:71;:20;:22::i;:::-;593:3939:235;;1653:314:85;303:66:86;1779:14:85;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:85;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:85;1898:16;1886:28;;;;;1927:29;;158:42:516;;;1927:29:85;;146:2:516;131:18;1927:29:85;;;;;;;1844:119;1694:273;1653:314::o;14:192:516:-;593:3939:235;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106101e35760003560e01c806375794a3c116101025780639ab24eb011610095578063c87b56dd11610064578063c87b56dd14610546578063d2f01f1914610566578063d7a901d314610586578063e985e9c5146105a657600080fd5b80639ab24eb0146104d3578063a22cb465146104f3578063b88d4fde14610513578063c3cda5201461052657600080fd5b80638e539e8c116100d15780638e539e8c1461045257806391ddadf41461047257806391de4a831461049e57806395d89b41146104be57600080fd5b806375794a3c146103e05780637ecebe00146103f557806384b0196e1461041557806388cc58e41461043d57600080fd5b806342842e0e1161017a5780635c19a95c116101495780635c19a95c146103535780636352211e146103735780636a9a38e61461039357806370a08231146103c057600080fd5b806342842e0e146102eb5780634bf5d7e9146102fe578063587cde1e146103135780635bb478081461033357600080fd5b806323b872dd116101b657806323b872dd146102835780633644e515146102965780633953801b146102ab5780633a46b1a8146102cb57600080fd5b806306fdde03146101e8578063081812fc14610213578063095ea7b31461024b57806318160ddd14610260575b600080fd5b3480156101f457600080fd5b506101fd6105d6565b60405161020a9190612f86565b60405180910390f35b34801561021f57600080fd5b5061023361022e366004612f99565b610671565b6040516001600160a01b03909116815260200161020a565b61025e610259366004612fce565b610682565b005b34801561026c57600080fd5b506102756106ca565b60405190815260200161020a565b61025e610291366004612ff8565b6106d9565b3480156102a257600080fd5b506102756108e9565b3480156102b757600080fd5b5061025e6102c63660046130e0565b6108f3565b3480156102d757600080fd5b506102756102e6366004612fce565b61090c565b61025e6102f9366004612ff8565b61091f565b34801561030a57600080fd5b506101fd61093a565b34801561031f57600080fd5b5061023361032e366004613154565b610944565b34801561033f57600080fd5b5061025e61034e366004613154565b61094f565b34801561035f57600080fd5b5061025e61036e366004613154565b6109ac565b34801561037f57600080fd5b5061023361038e366004612f99565b6109b6565b34801561039f57600080fd5b506103b36103ae366004613154565b6109c1565b60405161020a919061316f565b3480156103cc57600080fd5b506102756103db366004613154565b6109f5565b3480156103ec57600080fd5b50610275610a00565b34801561040157600080fd5b50610275610410366004613154565b610a0a565b34801561042157600080fd5b5061042a610a47565b60405161020a97969594939291906131c9565b34801561044957600080fd5b50610233610b0a565b34801561045e57600080fd5b5061027561046d366004612f99565b610b2b565b34801561047e57600080fd5b50610487610b36565b60405165ffffffffffff909116815260200161020a565b3480156104aa57600080fd5b506102756104b9366004613262565b610b40565b3480156104ca57600080fd5b506101fd610ba8565b3480156104df57600080fd5b506102756104ee366004613154565b610bc0565b3480156104ff57600080fd5b5061025e61050e3660046132d6565b610bcb565b61025e610521366004613312565b610c04565b34801561053257600080fd5b5061025e61054136600461338e565b610c4e565b34801561055257600080fd5b506101fd610561366004612f99565b610c5c565b34801561057257600080fd5b5061025e6105813660046133ee565b610c8d565b34801561059257600080fd5b5061025e6105a1366004613452565b610cce565b3480156105b257600080fd5b506105c66105c13660046134a1565b610db9565b604051901515815260200161020a565b60606105e0610dc5565b60020180546105ee906134d4565b80601f016020809104026020016040519081016040528092919081815260200182805461061a906134d4565b80156106675780601f1061063c57610100808354040283529160200191610667565b820191906000526020600020905b81548152906001019060200180831161064a57829003601f168201915b5050505050905090565b600061067c82610de9565b92915050565b6001600160a01b0382161580159061069e575061069e33610e36565b156106bc57604051638043dfaf60e01b815260040160405180910390fd5b6106c68282610eb2565b5050565b60006106d4610ebe565b905090565b60006106e482610edd565b9050836001600160a01b0316816001600160a01b0316146107175760405162a1148160e81b815260040160405180910390fd5b60008061072384610f78565b9150915061074881876107333390565b6001600160a01b039081169116811491141790565b610773576107568633610db9565b61077357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661079a57604051633a954ecd60e21b815260040160405180910390fd5b6107a78686866001610fa0565b80156107b257600082555b6107ba610dc5565b6001600160a01b03871660009081526005919091016020526040902080546000190190556107e6610dc5565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b1761081d610dc5565b60008681526004919091016020526040812091909155600160e11b84169003610893576001840161084c610dc5565b6000828152600491909101602052604081205490036108915761086d610dc5565b548114610891578361087d610dc5565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46108e18686866001610fdf565b505050505050565b60006106d4610fea565b6108fc83610ff4565b610907838383611031565b505050565b600061091883836110e4565b9392505050565b61090783838360405180602001604052806000815250610c04565b60606106d4611182565b600061067c8261121a565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031633146109a0576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6109a981611257565b50565b6109a933826112c1565b600061067c82610edd565b6109ec6040518060800160405280606081526020016060815260200160008152602001600081525090565b61067c8261135b565b600061067c82611519565b60006106d4611582565b6001600160a01b03811660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c00602052604081205461067c565b6000606080828080836000805160206138a783398151915254158015610a8c57507f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d54155b610ad05760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610997565b610ad8611592565b610ae06115a8565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60006106d4600080516020613887833981519152546001600160a01b031690565b600061067c826115be565b60006106d4611657565b60008060008051602061388783398151915280549091506001600160a01b03163314610b7f5760405163443e750b60e11b815260040160405180910390fd5b610b87611582565b9150610b9585858486611662565b610ba0336001611767565b509392505050565b6060610bb2610dc5565b60030180546105ee906134d4565b600061067c826118b7565b808015610bdc5750610bdc33610e36565b15610bfa57604051638043dfaf60e01b815260040160405180910390fd5b6106c682826118e5565b610c0f8484846106d9565b6001600160a01b0383163b15610c4857610c2b84848484611962565b610c48576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6108e1868686868686611a4d565b6060610c6782611b36565b610c8457604051630a14c4b560e41b815260040160405180910390fd5b61067c82611b72565b60008051602061390783398151915254600160201b900460ff16610cc457604051630ef4733760e31b815260040160405180910390fd5b6106c68282611d9e565b6000805160206139078339815191528054600160201b900460ff161580610cf857303b1515610d07565b8154600163ffffffff90911610155b15610d30578154604051630a8ef77f60e31b815263ffffffff9091166004820152602401610997565b815463ffffffff191660011782558015610d5757815464ff000000001916600160201b1782555b610d618585611d9e565b610d6b8584611dff565b8015610db257815464ff0000000019168255604051600181527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b5050505050565b60006109188383611e40565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b6000610df482611b36565b610e11576040516333d1c03960e21b815260040160405180910390fd5b610e19610dc5565b60009283526006016020525060409020546001600160a01b031690565b60007f0c89d3aad1b583c77a2e9f9fffa651b386c9c29e300bf2a8e2f3de1bb0100a006001600160a01b0383163b15801561091857506001600160a01b0383166000908152600182016020526040902054158061091857506001600160a01b038316600090815260018201602052604090205442109392505050565b6106c682826001611e7d565b600080610ec9610dc5565b60010154610ed5610dc5565b540303919050565b600080610ee8610dc5565b60008481526004820160205260408120549350909150600160e01b83169003610f5e5781600003610f585780548310610f3457604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115610f35575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b6000806000610f85610dc5565b60009485526006016020525050604090912080549092909150565b6001600160a01b03841615801590610fbc5750610fbc84610e36565b15610fda57604051638043dfaf60e01b815260040160405180910390fd5b610c48565b610fda848483611f32565b60006106d4611fd4565b3361100a6110018361135b565b604001516109b6565b6001600160a01b0316146109a95760405163dbfcf17d60e01b815260040160405180910390fd5b61103c826002612048565b611047816001612048565b6001600160a01b03831660009081527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477026020526040902060008051602061388783398151915290806110998582613550565b50600181016110a88482613550565b506040516001600160a01b038616907f66da702131703ee5e745ecf2f5b98311caa00729edd55541baad49289fc42ed890600090a25050505050565b60006110ee611657565b65ffffffffffff16821061113b5760405162461bcd60e51b81526020600482015260146024820152730566f7465733a20667574757265206c6f6f6b75760641b6044820152606401610997565b6111726111478361206c565b6001600160a01b038516600090815260008051602061392783398151915260205260409020906120a1565b6001600160e01b03169392505050565b60604361118d611657565b65ffffffffffff16146111e25760405162461bcd60e51b815260206004820152601860248201527f566f7465733a2062726f6b656e20636c6f636b206d6f646500000000000000006044820152606401610997565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6001600160a01b0390811660009081527f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f6560205260409020541690565b61126081612155565b60008051602061388783398151915280546001600160a01b0383166001600160a01b03199091168117825560408051918252517f64c14256e532eac2ec90ddc4973ed2d3f5623faf7951d90eec38f9b7812f99a79181900360200190a15050565b60006112cc8361121a565b6001600160a01b0384811660008181527f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f65602052604080822080546001600160a01b031916888616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461090781836113568661217c565b612187565b6113866040518060800160405280606081526020016060815260200160008152602001600081525090565b6001600160a01b03821660009081527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477026020526040908190208151608081019092528054600080516020613887833981519152929190829082906113e9906134d4565b80601f0160208091040260200160405190810160405280929190818152602001828054611415906134d4565b80156114625780601f1061143757610100808354040283529160200191611462565b820191906000526020600020905b81548152906001019060200180831161144557829003601f168201915b5050505050815260200160018201805461147b906134d4565b80601f01602080910402602001604051908101604052809291908181526020018280546114a7906134d4565b80156114f45780601f106114c9576101008083540402835291602001916114f4565b820191906000526020600020905b8154815290600101906020018083116114d757829003601f168201915b5050505050815260200160028201548152602001600382015481525050915050919050565b60006001600160a01b038216611542576040516323d3ad8160e21b815260040160405180910390fd5b67ffffffffffffffff611553610dc5565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b600061158c610dc5565b54919050565b60606000805160206138a78339815191526105e0565b60606000805160206138a7833981519152610bb2565b60006115c8611657565b65ffffffffffff1682106116155760405162461bcd60e51b81526020600482015260146024820152730566f7465733a20667574757265206c6f6f6b75760641b6044820152606401610997565b6116486116218361206c565b7f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f67906120a1565b6001600160e01b031692915050565b60006106d443612308565b61166d846002612048565b611678836000612048565b61168181612155565b60008281527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477016020908152604080832080546001600160a01b0319166001600160a01b03861690811790915581516080810183528881528084018890528083018790524260608201529084527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe5747702909252909120815160008051602061388783398151915292919081906117349082613550565b50602082015160018201906117499082613550565b50604082015160028201556060909101516003909101555050505050565b6000611771610dc5565b54905060008290036117965760405163b562e8dd60e01b815260040160405180910390fd5b6117a36000848385610fa0565b6801000000000000000182026117b7610dc5565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b17176117f2610dc5565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461187c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611844565b508160000361189d57604051622e076360e81b815260040160405180910390fd5b806118a6610dc5565b555061090790506000848385610fdf565b6001600160a01b0381166000908152600080516020613927833981519152602052604081206116489061233b565b806118ee610dc5565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611997903390899088908890600401613610565b6020604051808303816000875af19250505080156119d2575060408051601f3d908101601f191682019092526119cf9181019061364d565b60015b611a30573d808015611a00576040519150601f19603f3d011682016040523d82523d6000602084013e611a05565b606091505b508051600003611a28576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b83421115611a9d5760405162461bcd60e51b815260206004820152601860248201527f566f7465733a207369676e6174757265206578706972656400000000000000006044820152606401610997565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090611b1790611b0f9060a00160405160208183030381529060405280519060200120612374565b8585856123a1565b9050611b2381876123cf565b611b2d81886112c1565b50505050505050565b6000611b40610dc5565b548210801561067c5750600160e01b611b57610dc5565b60008481526004919091016020526040902054161592915050565b60008181527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477016020526040902054606090600080516020613887833981519152906001600160a01b031680611bd857505060408051602081019091526000815292915050565b6001600160a01b0381166000908152600283016020526040808220815160808101909252805482908290611c0b906134d4565b80601f0160208091040260200160405190810160405280929190818152602001828054611c37906134d4565b8015611c845780601f10611c5957610100808354040283529160200191611c84565b820191906000526020600020905b815481529060010190602001808311611c6757829003601f168201915b50505050508152602001600182018054611c9d906134d4565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc9906134d4565b8015611d165780601f10611ceb57610100808354040283529160200191611d16565b820191906000526020600020905b815481529060010190602001808311611cf957829003601f168201915b50505050508152602001600282015481526020016003820154815250509050611d7581600001518260200151611d4f8460600151612441565b604051602001611d6193929190613677565b6040516020818303038152906040526124d4565b604051602001611d859190613759565b6040516020818303038152906040529350505050919050565b60008051602061390783398151915254600160201b900460ff16611dd557604051630ef4733760e31b815260040160405180910390fd5b611de56380ac58cd60e01b612639565b611df5635b5e139f60e01b612639565b6106c68282612717565b60008051602061390783398151915254600160201b900460ff16611e3657604051630ef4733760e31b815260040160405180910390fd5b6106c68282612749565b6000611e4a610dc5565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b6000611e88836109b6565b90508115611ec757336001600160a01b03821614611ec757611eaa8133611e40565b611ec7576040516367d9dca160e11b815260040160405180910390fd5b83611ed0610dc5565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b6001600160a01b038316611f7857611f757f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f676127db611f70846127e7565b61281b565b50505b6001600160a01b038216611fb957611fb67f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f67612864611f70846127e7565b50505b610907611fc58461121a565b611fce8461121a565b83612187565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611fff612870565b6120076128d6565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b81518290821115610907576040516374eb20a760e01b815260040160405180910390fd5b600063ffffffff82111561209d576040516306dfcc6560e41b81526020600482015260248101839052604401610997565b5090565b8154600090818160058111156120fe5760006120bc84612926565b6120c690856137b4565b60008881526020902090915081015463ffffffff90811690871610156120ee578091506120fc565b6120f98160016137c7565b92505b505b600061210c87878585612a0e565b9050801561214757612131876121236001846137b4565b600091825260209091200190565b54600160201b90046001600160e01b031661214a565b60005b979650505050505050565b6001600160a01b0381166109a9576040516302e47d1560e41b815260040160405180910390fd5b600061067c826109f5565b816001600160a01b0316836001600160a01b0316141580156121a95750600081115b15610907576001600160a01b03831615612259576001600160a01b03831660009081526000805160206139278339815191526020526040812081906121f490612864611f70866127e7565b6001600160e01b031691506001600160e01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161224e929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610907576001600160a01b038216600090815260008051602061392783398151915260205260408120819061229f906127db611f70866127e7565b6001600160e01b031691506001600160e01b03169150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516122f9929190918252602082015260400190565b60405180910390a25050505050565b600065ffffffffffff82111561209d576040516306dfcc6560e41b81526030600482015260248101839052604401610997565b8054600090801561236b57612355836121236001846137b4565b54600160201b90046001600160e01b0316610918565b60009392505050565b600061067c612381610fea565b8360405161190160f01b8152600281019290925260228201526042902090565b6000806000806123b388888888612a64565b9250925092506123c38282612b33565b50909695505050505050565b6001600160a01b03821660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c0060205260409020805460018101909155818114610907576040516301d4b62360e61b81526001600160a01b038416600482015260248101829052604401610997565b6060600061244e83612bec565b600101905060008167ffffffffffffffff81111561246e5761246e613034565b6040519080825280601f01601f191660200182016040528015612498576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846124a257509392505050565b606081516000036124f357505060408051602081019091526000815290565b60006040518060600160405280604081526020016138c7604091399050600060038451600261252291906137c7565b61252c91906137f0565b612537906004613812565b905060006125468260206137c7565b67ffffffffffffffff81111561255e5761255e613034565b6040519080825280601f01601f191660200182016040528015612588576020820181803683370190505b509050818152600183018586518101602084015b818310156125f4576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182535060010161259c565b60038951066001811461260e576002811461261f5761262b565b613d3d60f01b60011983015261262b565b603d60f81b6000198301525b509398975050505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146126c6576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff191660011790556126df565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6000612721610dc5565b9050600281016127318482613550565b50600381016127408382613550565b50600090555050565b7f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336e6127748382613550565b507f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336f6127a08282613550565b505060006000805160206138a78339815191528190557f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d5550565b60006109188284613829565b60006001600160e01b0382111561209d576040516306dfcc6560e41b815260e0600482015260248101839052604401610997565b60008061285761283961282c611657565b65ffffffffffff1661206c565b61284f6128458861233b565b868863ffffffff16565b879190612cc4565b915091505b935093915050565b60006109188284613850565b60008061287b611592565b805190915015612892578051602090910120919050565b6000805160206138a78339815191525480156128ae5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b6000806128e16115a8565b8051909150156128f8578051602090910120919050565b7f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d5480156128ae5792915050565b60008160000361293857506000919050565b6000600161294584612cd2565b901c6001901b9050600181848161295e5761295e6137da565b048201901c90506001818481612976576129766137da565b048201901c9050600181848161298e5761298e6137da565b048201901c905060018184816129a6576129a66137da565b048201901c905060018184816129be576129be6137da565b048201901c905060018184816129d6576129d66137da565b048201901c905060018184816129ee576129ee6137da565b048201901c905061091881828581612a0857612a086137da565b04612d66565b60005b81831015610ba0576000612a258484612d7c565b60008781526020902090915063ffffffff86169082015463ffffffff161115612a5057809250612a5e565b612a5b8160016137c7565b93505b50612a11565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612a9f5750600091506003905082612b29565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612af3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612b1f57506000925060019150829050612b29565b9250600091508190505b9450945094915050565b6000826003811115612b4757612b47613870565b03612b50575050565b6001826003811115612b6457612b64613870565b03612b825760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115612b9657612b96613870565b03612bb75760405163fce698f760e01b815260048101829052602401610997565b6003826003811115612bcb57612bcb613870565b036106c6576040516335e2f38360e21b815260048101829052602401610997565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612c2b5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612c57576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612c7557662386f26fc10000830492506010015b6305f5e1008310612c8d576305f5e100830492506008015b6127108310612ca157612710830492506004015b60648310612cb3576064830492506002015b600a831061067c5760010192915050565b600080612857858585612d97565b600080608083901c15612ce757608092831c92015b604083901c15612cf957604092831c92015b602083901c15612d0b57602092831c92015b601083901c15612d1d57601092831c92015b600883901c15612d2f57600892831c92015b600483901c15612d4157600492831c92015b600283901c15612d5357600292831c92015b600183901c1561067c5760010192915050565b6000818310612d755781610918565b5090919050565b6000612d8b60028484186137f0565b610918908484166137c7565b825460009081908015612edd576000612db5876121236001856137b4565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b031660208401529192509087161015612e365760405162461bcd60e51b815260206004820152601b60248201527f436865636b706f696e743a2064656372656173696e67206b65797300000000006044820152606401610997565b805163ffffffff808816911603612e7e5784612e57886121236001866137b4565b80546001600160e01b0392909216600160201b0263ffffffff909216919091179055612ecd565b6040805180820190915263ffffffff80881682526001600160e01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216600160201b029216919091179101555b60200151925083915061285c9050565b50506040805180820190915263ffffffff80851682526001600160e01b0380851660208085019182528854600181018a5560008a815291822095519251909316600160201b02919093161792019190915590508161285c565b60005b83811015612f51578181015183820152602001612f39565b50506000910152565b60008151808452612f72816020860160208601612f36565b601f01601f19169290920160200192915050565b6020815260006109186020830184612f5a565b600060208284031215612fab57600080fd5b5035919050565b80356001600160a01b0381168114612fc957600080fd5b919050565b60008060408385031215612fe157600080fd5b612fea83612fb2565b946020939093013593505050565b60008060006060848603121561300d57600080fd5b61301684612fb2565b925061302460208501612fb2565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561306557613065613034565b604051601f8501601f19908116603f0116810190828211818310171561308d5761308d613034565b816040528093508581528686860111156130a657600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126130d157600080fd5b6109188383356020850161304a565b6000806000606084860312156130f557600080fd5b6130fe84612fb2565b9250602084013567ffffffffffffffff8082111561311b57600080fd5b613127878388016130c0565b9350604086013591508082111561313d57600080fd5b5061314a868287016130c0565b9150509250925092565b60006020828403121561316657600080fd5b61091882612fb2565b60208152600082516080602084015261318b60a0840182612f5a565b90506020840151601f198483030160408501526131a88282612f5a565b91505060408401516060840152606084015160808401528091505092915050565b60ff60f81b881681526000602060e060208401526131ea60e084018a612f5a565b83810360408501526131fc818a612f5a565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b8181101561325057835183529284019291840191600101613234565b50909c9b505050505050505050505050565b60008060006060848603121561327757600080fd5b833567ffffffffffffffff8082111561328f57600080fd5b61329b878388016130c0565b945060208601359150808211156132b157600080fd5b506132be868287016130c0565b9250506132cd60408501612fb2565b90509250925092565b600080604083850312156132e957600080fd5b6132f283612fb2565b91506020830135801515811461330757600080fd5b809150509250929050565b6000806000806080858703121561332857600080fd5b61333185612fb2565b935061333f60208601612fb2565b925060408501359150606085013567ffffffffffffffff81111561336257600080fd5b8501601f8101871361337357600080fd5b6133828782356020840161304a565b91505092959194509250565b60008060008060008060c087890312156133a757600080fd5b6133b087612fb2565b95506020870135945060408701359350606087013560ff811681146133d457600080fd5b9598949750929560808101359460a0909101359350915050565b6000806040838503121561340157600080fd5b823567ffffffffffffffff8082111561341957600080fd5b613425868387016130c0565b9350602085013591508082111561343b57600080fd5b50613448858286016130c0565b9150509250929050565b60008060006060848603121561346757600080fd5b833567ffffffffffffffff8082111561347f57600080fd5b61348b878388016130c0565b9450602086013591508082111561311b57600080fd5b600080604083850312156134b457600080fd5b6134bd83612fb2565b91506134cb60208401612fb2565b90509250929050565b600181811c908216806134e857607f821691505b602082108103610f5857634e487b7160e01b600052602260045260246000fd5b601f821115610907576000816000526020600020601f850160051c810160208610156135315750805b601f850160051c820191505b818110156108e15782815560010161353d565b815167ffffffffffffffff81111561356a5761356a613034565b61357e8161357884546134d4565b84613508565b602080601f8311600181146135b3576000841561359b5750858301515b600019600386901b1c1916600185901b1785556108e1565b600085815260208120601f198616915b828110156135e2578886015182559484019460019091019084016135c3565b50858210156136005787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061364390830184612f5a565b9695505050505050565b60006020828403121561365f57600080fd5b81516001600160e01b03198116811461091857600080fd5b683d913730b6b2911d1160b91b8152835160009061369c816009850160208901612f36565b6a11161134b6b0b3b2911d1160a91b60099184019182015284516136c7816014840160208901612f36565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a2243601492909101918201527f726561746564222c22646973706c61795f74797065223a202264617465222c20603482015267113b30b63ab2911d60c11b6054820152835161373c81605c840160208801612f36565b627d5d7d60e81b605c9290910191820152605f0195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161379181601d850160208701612f36565b91909101601d0192915050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561067c5761067c61379e565b8082018082111561067c5761067c61379e565b634e487b7160e01b600052601260045260246000fd5b60008261380d57634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761067c5761067c61379e565b6001600160e01b038181168382160190808211156138495761384961379e565b5092915050565b6001600160e01b038281168282160390808211156138495761384961379e565b634e487b7160e01b600052602160045260246000fdfe7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477003a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336c4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef52000423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f66","sourceMap":"593:3939:235:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2044:116:128;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3522:132;;;;;;;;;;-1:-1:-1;3522:132:128;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1119:32:516;;;1101:51;;1089:2;1074:18;3522:132:128;955:203:516;2665:266:235;;;;;;:::i;:::-;;:::i;:::-;;1527:93:128;;;;;;;;;;;;;:::i;:::-;;;1746:25:516;;;1734:2;1719:18;1527:93:128;1600:177:516;4917:2680:128;;;;;;:::i;:::-;;:::i;2381:105:235:-;;;;;;;;;;;;;:::i;2093:173::-;;;;;;;;;;-1:-1:-1;2093:173:235;;;;;:::i;:::-;;:::i;657:159:80:-;;;;;;;;;;-1:-1:-1;657:159:80;;;;;:::i;:::-;;:::i;7680:167:128:-;;;;;;:::i;:::-;;:::i;394:96:80:-;;;;;;;;;;;;;:::i;1015:111::-;;;;;;;;;;-1:-1:-1;1015:111:80;;;;;:::i;:::-;;:::i;1144:87:235:-;;;;;;;;;;-1:-1:-1;1144:87:235;;;;;:::i;:::-;;:::i;1155:95:80:-;;;;;;;;;;-1:-1:-1;1155:95:80;;;;;:::i;:::-;;:::i;2891:152:128:-;;;;;;;;;;-1:-1:-1;2891:152:128;;;;;:::i;:::-;;:::i;1951:108:235:-;;;;;;;;;;-1:-1:-1;1951:108:235;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1697:107:128:-;;;;;;;;;;-1:-1:-1;1697:107:128;;;;;:::i;:::-;;:::i;1556:87:235:-;;;;;;;;;;;;;:::i;2270:107::-;;;;;;;;;;-1:-1:-1;2270:107:235;;;;;:::i;:::-;;:::i;4521:801:148:-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;1265:85:235:-;;;;;;;;;;;;;:::i;845:141:80:-;;;;;;;;;;-1:-1:-1;845:141:80;;;;;:::i;:::-;;:::i;283:80::-;;;;;;;;;;;;;:::i;:::-;;;6226:14:516;6214:27;;;6196:46;;6184:2;6169:18;283:80:80;6052:196:516;1677:240:235;;;;;;;;;;-1:-1:-1;1677:240:235;;;;;:::i;:::-;;:::i;2223:120:128:-;;;;;;;;;;;;;:::i;519:109:80:-;;;;;;;;;;-1:-1:-1;519:109:80;;;;;:::i;:::-;;:::i;2935:281:235:-;;;;;;;;;;-1:-1:-1;2935:281:235;;;;;:::i;:::-;;:::i;8396:348:128:-;;;;;;:::i;:::-;;:::i;1279:214:80:-;;;;;;;;;;-1:-1:-1;1279:214:80;;;;;:::i;:::-;;:::i;3220:196:235:-;;;;;;;;;;-1:-1:-1;3220:196:235;;;;;:::i;:::-;;:::i;876:157:128:-;;;;;;;;;;-1:-1:-1;876:157:128;;;;;:::i;:::-;;:::i;724:212:235:-;;;;;;;;;;-1:-1:-1;724:212:235;;;;;:::i;:::-;;:::i;4364:167:128:-;;;;;;;;;;-1:-1:-1;4364:167:128;;;;;:::i;:::-;;:::i;:::-;;;10248:14:516;;10241:22;10223:41;;10211:2;10196:18;4364:167:128;10083:187:516;2044:116:128;2098:13;2126:23;:21;:23::i;:::-;:29;;2119:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2044:116;:::o;3522:132::-;3606:7;3628:21;3641:7;3628:12;:21::i;:::-;3621:28;3522:132;-1:-1:-1;;3522:132:128:o;2665:266:235:-;-1:-1:-1;;;;;2805:16:235;;;;;;:48;;;2825:28;2842:10;2825:16;:28::i;:::-;2801:93;;;2870:17;;-1:-1:-1;;;2870:17:235;;;;;;;;;;;2801:93;2900:26;2914:2;2918:7;2900:13;:26::i;:::-;2665:266;;:::o;1527:93:128:-;1579:7;1601:14;:12;:14::i;:::-;1594:21;;1527:93;:::o;4917:2680::-;5036:27;5066;5085:7;5066:18;:27::i;:::-;5036:57;;5145:4;-1:-1:-1;;;;;5104:45:128;5120:19;-1:-1:-1;;;;;5104:45:128;;5100:92;;5164:28;;-1:-1:-1;;;5164:28:128;;;;;;;;;;;5100:92;5207:27;5242:23;5274:35;5301:7;5274:26;:35::i;:::-;5199:110;;;;5398:68;5423:15;5440:4;5446:19;29371:10:129;;29289:97;5446:19:128;-1:-1:-1;;;;;11877:32:129;;;11735:28;;11992:20;;12014:30;;11989:56;;11468:587;5398:68:128;5393:181;;5479:43;5496:4;29371:10:129;4364:167:128;:::i;5479:43::-;5474:100;;5539:35;;-1:-1:-1;;;5539:35:128;;;;;;;;;;;5474:100;-1:-1:-1;;;;;5585:16:128;;5581:52;;5610:23;;-1:-1:-1;;;5610:23:128;;;;;;;;;;;5581:52;5640:43;5662:4;5668:2;5672:7;5681:1;5640:21;:43::i;:::-;5758:15;5755:135;;;5880:1;5859:19;5852:30;5755:135;6230:23;:21;:23::i;:::-;-1:-1:-1;;;;;6230:48:128;;;;;;:42;;;;;:48;;;;;6228:50;;-1:-1:-1;;6228:50:128;;;6316:23;:21;:23::i;:::-;-1:-1:-1;;;;;6316:46:128;;;;;;:42;;;;;:46;;;;;;6314:48;;;;;;10236:11:129;10211:23;10207:41;10194:63;-1:-1:-1;;;10194:63:129;6590:23:128;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;:184;;;;-1:-1:-1;;;6879:47:128;;:52;;6875:625;;6975:1;6965:11;;7080:23;:21;:23::i;:::-;:54;;;;:41;;;;;:54;;;;;;:59;;7076:416;;7220:23;:21;:23::i;:::-;:37;7205:52;;7201:281;;7450:19;7365:23;:21;:23::i;:::-;:82;;;;:41;;;;;:82;;;;;:104;7201:281;6933:567;6875:625;7536:7;7532:2;-1:-1:-1;;;;;7517:27:128;7526:4;-1:-1:-1;;;;;7517:27:128;;;;;;;;;;;7550:42;7571:4;7577:2;7581:7;7590:1;7550:20;:42::i;:::-;5030:2567;;;4917:2680;;;:::o;2381:105:235:-;2432:14;2461:20;:18;:20::i;2093:173::-;2203:22;2219:5;2203:15;:22::i;:::-;2231:30;2244:5;2251:4;2257:3;2231:12;:30::i;:::-;2093:173;;;:::o;657:159:80:-;756:7;778:33;792:7;801:9;778:13;:33::i;:::-;771:40;657:159;-1:-1:-1;;;657:159:80:o;7680:167:128:-;7803:39;7820:4;7826:2;7830:7;7803:39;;;;;;;;;;;;:16;:39::i;394:96:80:-;445:13;473:12;:10;:12::i;1015:111::-;1080:7;1102:19;1113:7;1102:10;:19::i;1144:87:235:-;291:66:99;445:29:97;-1:-1:-1;;;;;445:29:97;286:10;:22;282:79;;325:29;;-1:-1:-1;;;325:29:97;;343:10;325:29;;;1101:51:516;1074:18;;325:29:97;;;;;;;;282:79;1206:20:235::1;1218:7;1206:11;:20::i;:::-;1144:87:::0;:::o;1155:95:80:-;1213:32;1223:10;1235:9;1213;:32::i;2891:152:128:-;2971:7;3009:27;3028:7;3009:18;:27::i;1951:108:235:-;2011:12;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2011:12:235;2038:16;2048:5;2038:9;:16::i;1697:107:128:-;1760:7;1782:17;1793:5;1782:10;:17::i;1556:87:235:-;1602:7;1624:14;:12;:14::i;2270:107::-;-1:-1:-1;;;;;533:37:147;;2324:14:235;533:37:147;;;1561:66;533:37;;;;;;2353:19:235;443:132:147;4521:801:148;4610:13;4631:18;;4610:13;;;4631:18;-1:-1:-1;;;;;;;;;;;5014:34:148;:39;:93;;;;-1:-1:-1;5065:37:148;;:42;5014:93;4999:145;;;;-1:-1:-1;;;4999:145:148;;10862:2:516;4999:145:148;;;10844:21:516;10901:2;10881:18;;;10874:30;-1:-1:-1;;;10920:18:516;;;10913:51;10981:18;;4999:145:148;10660:345:516;4999:145:148;5190:13;:11;:13::i;:::-;5211:16;:14;:16::i;:::-;5295;;;5285:1;5295:16;;;;;;;;;-1:-1:-1;;;5151:166:148;;;-1:-1:-1;5151:166:148;;-1:-1:-1;5235:13:148;;-1:-1:-1;5264:4:148;;-1:-1:-1;5285:1:148;-1:-1:-1;5295:16:148;-1:-1:-1;5151:166:148;-1:-1:-1;4521:801:148:o;1265:85:235:-;1310:7;1332:13;-1:-1:-1;;;;;;;;;;;1076:10:236;-1:-1:-1;;;;;1076:10:236;;938:153;845:141:80;929:7;951:30;971:9;951:19;:30::i;283:80::-;329:6;350:8;:6;:8::i;1677:240:235:-;1796:15;;-1:-1:-1;;;;;;;;;;;625:10:236;;;;-1:-1:-1;;;;;;625:10:236;611;:24;607:84;;652:32;;-1:-1:-1;;;652:32:236;;;;;;;;;;;607:84;1829:14:235::1;:12;:14::i;:::-;1819:24;;1849:37;1860:4;1866:3;1871:7;1880:5;1849:10;:37::i;:::-;1892:20;1898:10;1910:1;1892:5;:20::i;:::-;531:171:236::0;1677:240:235;;;;;:::o;2223:120:128:-;2279:13;2307:23;:21;:23::i;:::-;:31;;2300:38;;;;;:::i;519:109:80:-;583:7;605:18;615:7;605:9;:18::i;2935:281:235:-;3081:8;:40;;;;;3093:28;3110:10;3093:16;:28::i;:::-;3077:85;;;3138:17;;-1:-1:-1;;;3138:17:235;;;;;;;;;;;3077:85;3168:43;3192:8;3202;3168:23;:43::i;8396:348:128:-;8543:31;8556:4;8562:2;8566:7;8543:12;:31::i;:::-;-1:-1:-1;;;;;8584:14:128;;;:19;8580:160;;8616:56;8647:4;8653:2;8657:7;8666:5;8616:30;:56::i;:::-;8611:129;;8691:40;;-1:-1:-1;;;8691:40:128;;;;;;;;;;;8611:129;8396:348;;;;:::o;1279:214:80:-;1439:49;1454:9;1465:5;1472:6;1480:1;1483;1486;1439:14;:49::i;3220:196:235:-;3301:13;3327:16;3335:7;3327;:16::i;:::-;3322:59;;3352:29;;-1:-1:-1;;;3352:29:235;;;;;;;;;;;3322:59;3395:16;3403:7;3395;:16::i;876:157:128:-;-1:-1:-1;;;;;;;;;;;1263:42:85;-1:-1:-1;;;1263:42:85;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:85;;;;;;;;;;;1258:100;988:40:128::1;1013:5;1020:7;988:24;:40::i;724:212:235:-:0;-1:-1:-1;;;;;;;;;;;540:14:85;;-1:-1:-1;;;540:14:85;;;;539:15;;564:53;;2049:4;2041:25;:30;;564:53;;;581:9;;594:1;581:9;;;;:14;;564:53;560:124;;;667:9;;634:43;;-1:-1:-1;;;634:43:85;;667:9;;;;634:43;;;11154:42:516;11127:18;;634:43:85;11010:192:516;560:124:85;689:13;;-1:-1:-1;;689:13:85;701:1;689:13;;;708:56;;;;736:21;;-1:-1:-1;;736:21:85;-1:-1:-1;;;736:21:85;;;708:56;859:38:235::1;884:4;890:6;859:24;:38::i;:::-;903:28;917:4;923:7;903:13;:28::i;:::-;780:14:85::0;776:84;;;804:22;;-1:-1:-1;;804:22:85;;;839:14;;-1:-1:-1;11154:42:516;;839:14:85;;11142:2:516;11127:18;839:14:85;;;;;;;776:84;435:429;;724:212:235;;;:::o;4364:167:128:-;4473:4;4492:34;4510:5;4517:8;4492:17;:34::i;1696:139:131:-;300:66;;1696:139::o;22511:230:129:-;22589:7;22609:16;22617:7;22609;:16::i;:::-;22604:64;;22634:34;;-1:-1:-1;;;22634:34:129;;;;;;;;;;;22604:64;22682:23;:21;:23::i;:::-;:48;;;;:39;;:48;;-1:-1:-1;22682:48:129;;;:54;-1:-1:-1;;;;;22682:54:129;;22511:230::o;1762:435:217:-;1829:4;287:66:219;-1:-1:-1;;;;;2060:20:217;;;:25;:132;;;;-1:-1:-1;;;;;;2096:30:217;;;;;;:20;;;:30;;;;;;:35;;:95;;-1:-1:-1;;;;;;2161:30:217;;;;;;:20;;;:30;;;;;;2143:15;:48;2047:145;1762:435;-1:-1:-1;;;1762:435:217:o;3260:128:128:-;3356:27;3365:2;3369:7;3378:4;3356:8;:27::i;2985:351:129:-;3032:7;;3263:23;:21;:23::i;:::-;:36;;;3215:23;:21;:23::i;:::-;:37;:84;:110;;2985:351;-1:-1:-1;2985:351:129:o;7836:1501::-;7912:14;7974:32;8009:23;:21;:23::i;:::-;8050:29;;;;:20;;;:29;;;;;;;-1:-1:-1;7974:58:129;;-1:-1:-1;;;;8115:24:129;;:29;;8111:1172;;8236:6;8246:1;8236:11;8232:791;;8276:16;;8265:27;;8261:83;;8313:31;;-1:-1:-1;;;8313:31:129;;;;;;;;;;;8261:83;8831:182;-1:-1:-1;;8910:9:129;;;8889:31;;;;:20;;;:31;;;;;;8910:9;;8889:31;;-1:-1:-1;8948:25:129;;8831:182;8948:25;;8987:13;7836:1501;;;:::o;8111:1172::-;7966:1323;9301:31;;-1:-1:-1;;;9301:31:129;;;;;;;;;;;12155:478;12251:27;12280:23;12313:38;12354:30;:28;:30::i;:::-;:62;;;;:53;;:62;;-1:-1:-1;;12354:62:129;;;;12597:26;;12354:62;;12597:26;;-1:-1:-1;12155:478:129:o;3420:352:235:-;-1:-1:-1;;;;;3565:18:235;;;;;;:44;;;3587:22;3604:4;3587:16;:22::i;:::-;3561:139;;;3676:17;;-1:-1:-1;;;3676:17:235;;;;;;;;;;;3561:139;3706:61;8396:348:128;3776:262:235;3925:41;3946:4;3952:2;3956:9;3925:20;:41::i;3299:103:148:-;3352:7;3374:23;:21;:23::i;4355:175:235:-;4457:10;4419:34;4428:16;4438:5;4428:9;:16::i;:::-;:24;;;4419:8;:34::i;:::-;-1:-1:-1;;;;;4419:48:235;;4415:111;;4484:35;;-1:-1:-1;;;4484:35:235;;;;;;;;;;;1752:399:236;1859:30;1881:4;1887:1;1859:21;:30::i;:::-;1895:29;1917:3;1922:1;1895:21;:29::i;:::-;-1:-1:-1;;;;;2028:24:236;;1931:35;2028:24;;;:17;:24;;;;;-1:-1:-1;;;;;;;;;;;342:66:237;2028:24:236;2058:21;2075:4;2028:24;2058:21;:::i;:::-;-1:-1:-1;2085:13:236;;;:19;2101:3;2085:13;:19;:::i;:::-;-1:-1:-1;2116:30:236;;-1:-1:-1;;;;;2116:30:236;;;;;;;;1853:298;;1752:399;;;:::o;4002:301:81:-;4096:7;4131:8;:6;:8::i;:::-;4119:20;;:9;:20;4111:53;;;;-1:-1:-1;;;4111:53:81;;13810:2:516;4111:53:81;;;13792:21:516;13849:2;13829:18;;;13822:30;-1:-1:-1;;;13868:18:516;;;13861:50;13928:18;;4111:53:81;13608:344:516;4111:53:81;4183:115;4262:28;4280:9;4262:17;:28::i;:::-;-1:-1:-1;;;;;4183:51:81;;;;;;-1:-1:-1;;;;;;;;;;;4183:51:81;;;;;;:69;:115::i;:::-;-1:-1:-1;;;;;4170:128:81;;4002:301;-1:-1:-1;;;4002:301:81:o;3014:221::-;3059:13;3145:12;3133:8;:6;:8::i;:::-;:24;;;3125:61;;;;-1:-1:-1;;;3125:61:81;;14159:2:516;3125:61:81;;;14141:21:516;14198:2;14178:18;;;14171:30;14237:26;14217:18;;;14210:54;14281:18;;3125:61:81;13957:348:516;3125:61:81;-1:-1:-1;3192:38:81;;;;;;;;;;;;;;;;;;3014:221::o;5261:129::-;-1:-1:-1;;;;;5343:42:81;;;5321:7;5343:42;;;226:52:82;5343:42:81;;;;;;;;5261:129::o;706:228:236:-;759:31;782:7;759:22;:31::i;:::-;-1:-1:-1;;;;;;;;;;;867:20:236;;-1:-1:-1;;;;;867:20:236;;-1:-1:-1;;;;;;867:20:236;;;;;;;898:31;;;1101:51:516;;;898:31:236;;;;;;1089:2:516;898:31:236;;;753:181;706:228;:::o;6619:401:81:-;6739:19;6761;6772:7;6761:10;:19::i;:::-;-1:-1:-1;;;;;6786:42:81;;;:33;:42;;;226:52:82;6786:42:81;;;;;;:54;;-1:-1:-1;;;;;;6786:54:81;;;;;;;;;;6852:48;;6739:41;;-1:-1:-1;6786:54:81;6852:48;;;;;;6786:33;6852:48;6906:68;6925:11;6938:9;6949:24;6965:7;6949:15;:24::i;:::-;6906:18;:68::i;2155:183:236:-;2212:12;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2212:12:236;-1:-1:-1;;;;;2309:24:236;;2232:35;2309:24;;;:17;:24;;;;;;;2302:31;;;;;;;;;;-1:-1:-1;;;;;;;;;;;342:66:237;2302:31:236;2309:24;2302:31;;2309:24;;2302:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2155:183;;;:::o;3340:242:129:-;3398:7;-1:-1:-1;;;;;3417:19:129;;3413:60;;3445:28;;-1:-1:-1;;;3445:28:129;;;;;;;;;;;3413:60;571:13;3492:23;:21;:23::i;:::-;:42;;:49;3535:5;-1:-1:-1;;;;;3492:49:129;-1:-1:-1;;;;;3492:49:129;;;;;;;;;;;;;:85;3479:98;;3340:242;;;:::o;4042:119::-;4097:7;4119:23;:21;:23::i;:::-;:37;;4042:119;-1:-1:-1;4042:119:129:o;5532:115:148:-;5586:13;-1:-1:-1;;;;;;;;;;;5614:22:148;7831:139;5860:121;5917:13;-1:-1:-1;;;;;;;;;;;5945:22:148;7831:139;4913:274:81;4992:7;5027:8;:6;:8::i;:::-;5015:20;;:9;:20;5007:53;;;;-1:-1:-1;;;5007:53:81;;13810:2:516;5007:53:81;;;13792:21:516;13849:2;13829:18;;;13822:30;-1:-1:-1;;;13868:18:516;;;13861:50;13928:18;;5007:53:81;13608:344:516;5007:53:81;5079:103;5146:28;5164:9;5146:17;:28::i;:::-;5079:39;;:57;:103::i;:::-;-1:-1:-1;;;;;5066:116:81;;4913:274;-1:-1:-1;;4913:274:81:o;2771:98::-;2812:6;2833:31;2851:12;2833:17;:31::i;1267:481:236:-;1393:30;1415:4;1421:1;1393:21;:30::i;:::-;1429:29;1451:3;1456:1;1429:21;:29::i;:::-;1464;1487:5;1464:22;:29::i;:::-;1500:35;1571:26;;;:17;:26;;;;;;;;:34;;-1:-1:-1;;;;;;1571:34:236;-1:-1:-1;;;;;1571:34:236;;;;;;;;1638:105;;;;;;;;;;;;;;;;;;;;;;1721:15;1638:105;;;;1611:24;;;:17;:24;;;;;;:132;;-1:-1:-1;;;;;;;;;;;342:66:237;1638:105:236;1611:24;;;:132;;:24;:132;:::i;:::-;-1:-1:-1;1611:132:236;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1611:132:236;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1267:481:236:o;15806:2642:129:-;15874:20;15897:23;:21;:23::i;:::-;:37;;-1:-1:-1;15897:37:129;15944:13;;;15940:44;;15966:18;;-1:-1:-1;;;15966:18:129;;;;;;;;;;;15940:44;15991:61;16021:1;16025:2;16029:12;16043:8;15991:21;:61::i;:::-;16481:32;16461:53;;16403:23;:21;:23::i;:::-;-1:-1:-1;;;;;16403:46:129;;;;;;:42;;;;;:46;;;;;;:111;;;;;;;;;10236:11;10211:23;10207:41;-1:-1:-1;10631:15:129;;10605:24;10601:46;10204:52;10194:63;16714:23;:21;:23::i;:::-;:71;;;;:41;;;;;:71;;;;;:188;;;;-1:-1:-1;;;;;17423:25:129;;;16949:23;;;;16765:12;;17423:25;;17609;16714:71;;17495:260;18033:1;18019:12;18015:20;17984:275;18065:3;18056:7;18053:16;17984:275;;18241:7;18231:8;18228:1;18201:25;18198:1;18195;18190:59;18107:1;18094:15;17984:275;;;17988:57;18278:8;18290:1;18278:13;18274:45;;18300:19;;-1:-1:-1;;;18300:19:129;;;;;;;;;;;18274:45;18368:3;18328:23;:21;:23::i;:::-;:43;-1:-1:-1;18383:60:129;;-1:-1:-1;18328:37:129;18416:2;18420:12;18434:8;18383:20;:60::i;3489:146:81:-;-1:-1:-1;;;;;3570:51:81;;3548:7;3570:51;;;-1:-1:-1;;;;;;;;;;;3570:51:81;;;;;:60;;:58;:60::i;3957:269:128:-;4147:8;4059:23;:21;:23::i;:::-;29371:10:129;4059:63:128;;;;:42;;;;;:63;;;;;;;;-1:-1:-1;;;;;4059:85:128;;;;;;;;;;;;:96;;-1:-1:-1;;4059:96:128;;;;;;;;;;;4166:55;;10248:14:516;;10241:22;10223:41;;4059:85:128;;29371:10:129;;4166:55:128;;10196:18:516;4166:55:128;;;;;;;3957:269;;:::o;14714:674:129:-;14877:139;;-1:-1:-1;;;14877:139:129;;14855:4;;-1:-1:-1;;;;;14877:56:129;;;;;:139;;29371:10;;14972:4;;14986:7;;15003:5;;14877:139;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14877:139:129;;;;;;;;-1:-1:-1;;14877:139:129;;;;;;;;;;;;:::i;:::-;;;14867:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15199:6;:13;15216:1;15199:18;15195:183;;15236:40;;-1:-1:-1;;;15236:40:129;;;;;;;;;;;15195:183;15352:6;15346:13;15337:6;15333:2;15329:15;15322:38;14867:517;-1:-1:-1;;;;;;15068:83:129;-1:-1:-1;;;15068:83:129;;-1:-1:-1;14714:674:129;;;;;;:::o;5460:467:81:-;5635:6;5616:15;:25;;5608:62;;;;-1:-1:-1;;;5608:62:81;;15301:2:516;5608:62:81;;;15283:21:516;15340:2;15320:18;;;15313:30;15379:26;15359:18;;;15352:54;15423:18;;5608:62:81;15099:348:516;5608:62:81;5750:58;;;2317:71;5750:58;;;15683:25:516;-1:-1:-1;;;;;15744:32:516;;15724:18;;;15717:60;;;;15793:18;;;15786:34;;;15836:18;;;15829:34;;;5676:14:81;;5693:157;;5714:103;;15655:19:516;;5750:58:81;;;;;;;;;;;;5740:69;;;;;;5714:16;:103::i;:::-;5825:1;5834;5843;5693:13;:157::i;:::-;5676:174;;5857:31;5874:6;5882:5;5857:16;:31::i;:::-;5894:28;5904:6;5912:9;5894;:28::i;:::-;5602:325;5460:467;;;;;;:::o;11071:301:129:-;11136:4;11207:23;:21;:23::i;:::-;:37;11197:47;;11161:187;;;;;-1:-1:-1;;;11275:23:129;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;;:68;:73;11148:200;11071:301;-1:-1:-1;;11071:301:129:o;450:786:238:-;544:35;637:26;;;:17;:26;;;;;;523:13;;-1:-1:-1;;;;;;;;;;;342:66:237;-1:-1:-1;;;;;637:26:238;;670:41;;-1:-1:-1;;702:9:238;;;;;;;;;-1:-1:-1;702:9:238;;;450:786;-1:-1:-1;;450:786:238:o;670:41::-;-1:-1:-1;;;;;739:31:238;;718:18;739:31;;;:17;;;:31;;;;;;718:52;;;;;;;;;;;;739:31;;718:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;877:336;963:5;:10;;;1018:5;:9;;;1133:33;1150:5;:15;;;1133:16;:33::i;:::-;904:297;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;877:13;:336::i;:::-;806:417;;;;;;;;:::i;:::-;;;;;;;;;;;;;777:454;;;;;450:786;;;:::o;1037:299:128:-;-1:-1:-1;;;;;;;;;;;1263:42:85;-1:-1:-1;;;1263:42:85;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:85;;;;;;;;;;;1258:100;1159:25:128::1;-1:-1:-1::0;;;1159:13:128::1;:25::i;:::-;1224;-1:-1:-1::0;;;1224:13:128::1;:25::i;:::-;1297:34;1316:5;1323:7;1297:18;:34::i;2732:153:148:-:0;-1:-1:-1;;;;;;;;;;;1263:42:85;-1:-1:-1;;;1263:42:85;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:85;;;;;;;;;;;1258:100;2842:38:148::1;2866:4;2872:7;2842:23;:38::i;22321:186:129:-:0;22424:4;22443:23;:21;:23::i;:::-;-1:-1:-1;;;;;22443:49:129;;;;;;;:42;;;;;:49;;;;;;;;:59;;;;;;;;;;-1:-1:-1;22443:59:129;;;;;22321:186::o;23291:439::-;23397:13;23413:17;23422:7;23413:8;:17::i;:::-;23397:33;;23441:13;23437:184;;;29371:10;-1:-1:-1;;;;;23466:28:129;;;23462:159;;23509:45;23527:5;29371:10;23509:17;:45::i;:::-;23504:117;;23575:35;;-1:-1:-1;;;23575:35:129;;;;;;;;;;;23504:117;23684:2;23627:23;:21;:23::i;:::-;:48;;;;:39;;;;;:48;;;;;;:59;;-1:-1:-1;;;;;;23627:59:129;-1:-1:-1;;;;;23627:59:129;;;;;;23697:28;23627:48;;23697:28;;;;;;;;;;23627:48;23697:28;23391:339;23291:439;;;:::o;7244:491:81:-;-1:-1:-1;;;;;7359:18:81;;7355:151;;7387:112;7402:39;7451:4;7465:26;7484:6;7465:18;:26::i;:::-;7387:5;:112::i;:::-;;;7355:151;-1:-1:-1;;;;;7515:16:81;;7511:154;;7541:117;7556:39;7605:9;7624:26;7643:6;7624:18;:26::i;7541:117::-;;;7511:154;7670:60;7689:16;7700:4;7689:10;:16::i;:::-;7707:14;7718:2;7707:10;:14::i;:::-;7723:6;7670:18;:60::i;3406:268:148:-;3461:7;2080:107;3552:17;:15;:17::i;:::-;3581:20;:18;:20::i;:::-;3508:153;;;;;;18149:25:516;;;;18190:18;;18183:34;;;;18233:18;;;18226:34;3613:13:148;18276:18:516;;;18269:34;3646:4:148;18319:19:516;;;18312:61;18121:19;;3508:153:148;;;;;;;;;;;;3489:180;;;;;;3476:193;;3406:268;:::o;425:183:273:-;541:15;;526:4;;541:21;-1:-1:-1;537:66:273;;;571:32;;-1:-1:-1;;;571:32:273;;;;;;;;;;;15291:213:446;15347:6;15377:16;15369:24;;15365:103;;;15416:41;;-1:-1:-1;;;15416:41:446;;15447:2;15416:41;;;18565:36:516;18617:18;;;18610:34;;;18538:18;;15416:41:446;18384:266:516;15365:103:446;-1:-1:-1;15491:5:446;15291:213::o;8964:548:76:-;9090:24;;9061:7;;;9090:24;9177:1;9171:7;;9167:190;;;9188:11;9208:14;9218:3;9208:9;:14::i;:::-;9202:20;;:3;:20;:::i;:::-;13062:28;13115:20;;;13174:4;13161:18;;9188:34;;-1:-1:-1;13157:28:76;;9240:42;;;;;9234:48;;;;9230:121;;;9301:3;9294:10;;9230:121;;;9335:7;:3;9341:1;9335:7;:::i;:::-;9329:13;;9230:121;9180:177;9167:190;9363:11;9377:53;9396:4;9415:3;9420;9425:4;9377:18;:53::i;:::-;9363:67;-1:-1:-1;9444:8:76;;:63;;9459:41;9473:4;9492:7;9498:1;9492:3;:7;:::i;:::-;13062:28;13115:20;;;13174:4;13161:18;;;13157:28;;12962:233;9459:41;:48;-1:-1:-1;;;9459:48:76;;-1:-1:-1;;;;;9459:48:76;9444:63;;;9455:1;9444:63;9437:70;8964:548;-1:-1:-1;;;;;;;8964:548:76:o;744:119:273:-;-1:-1:-1;;;;;804:18:273;;800:58;;831:27;;-1:-1:-1;;;831:27:273;;;;;;;;;;;4042:135:235;4132:7;4154:18;4164:7;4154:9;:18::i;7813:698:81:-;7925:2;-1:-1:-1;;;;;7917:10:81;:4;-1:-1:-1;;;;;7917:10:81;;;:24;;;;;7940:1;7931:6;:10;7917:24;7913:594;;;-1:-1:-1;;;;;7955:18:81;;;7951:277;;-1:-1:-1;;;;;8041:48:81;;7986:16;8041:48;;;-1:-1:-1;;;;;;;;;;;8041:48:81;;;;;7986:16;;8024:134;;8101:9;8122:26;8141:6;8122:18;:26::i;8024:134::-;-1:-1:-1;;;;;7985:173:81;;;-1:-1:-1;;;;;7985:173:81;;;8194:4;-1:-1:-1;;;;;8173:46:81;;8200:8;8210;8173:46;;;;;;19224:25:516;;;19280:2;19265:18;;19258:34;19212:2;19197:18;;19050:248;8173:46:81;;;;;;;;7975:253;;7951:277;-1:-1:-1;;;;;8239:16:81;;;8235:266;;-1:-1:-1;;;;;8323:46:81;;8268:16;8323:46;;;-1:-1:-1;;;;;;;;;;;8323:46:81;;;;;8268:16;;8306:127;;8381:4;8397:26;8416:6;8397:18;:26::i;8306:127::-;-1:-1:-1;;;;;8267:166:81;;;-1:-1:-1;;;;;8267:166:81;;;8469:2;-1:-1:-1;;;;;8448:44:81;;8473:8;8483;8448:44;;;;;;19224:25:516;;;19280:2;19265:18;;19258:34;19212:2;19197:18;;19050:248;8448:44:81;;;;;;;;8257:244;;7813:698;;;:::o;14291:213:446:-;14347:6;14377:16;14369:24;;14365:103;;;14416:41;;-1:-1:-1;;;14416:41:446;;14447:2;14416:41;;;18565:36:516;18617:18;;;18610:34;;;18538:18;;14416:41:446;18384:266:516;9624:196:76;9715:24;;9686:7;;9752:8;;:63;;9767:41;9781:4;9800:7;9806:1;9800:3;:7;:::i;9767:41::-;:48;-1:-1:-1;;;9767:48:76;;-1:-1:-1;;;;;9767:48:76;9752:63;;;9763:1;9745:70;9624:196;-1:-1:-1;;;9624:196:76:o;4267:178:148:-;4352:7;4374:66;4407:20;:18;:20::i;:::-;4429:10;3555:4:442;3549:11;-1:-1:-1;;;3573:23:442;;3625:4;3616:14;;3609:39;;;;3677:4;3668:14;;3661:34;3733:4;3718:20;;;3353:401;6803:260:439;6888:7;6908:17;6927:18;6947:16;6967:25;6978:4;6984:1;6987;6990;6967:10;:25::i;:::-;6907:85;;;;;;7002:28;7014:5;7021:8;7002:11;:28::i;:::-;-1:-1:-1;7047:9:439;;6803:260;-1:-1:-1;;;;;;6803:260:439:o;1168:202:147:-;-1:-1:-1;;;;;1015:37:147;;1247:15;1015:37;;;1561:66;1015:37;;;;;:39;;;;;;;;1291:16;;;1287:79;;1324:35;;-1:-1:-1;;;1324:35:147;;-1:-1:-1;;;;;19766:32:516;;1324:35:147;;;19748:51:516;19815:18;;;19808:34;;;19721:18;;1324:35:147;19574:274:516;637:698:438;693:13;742:14;759:17;770:5;759:10;:17::i;:::-;779:1;759:21;742:38;;794:20;828:6;817:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:18:438;-1:-1:-1;794:41:438;-1:-1:-1;955:28:438;;;971:2;955:28;1010:282;-1:-1:-1;;1041:5:438;-1:-1:-1;;;1175:2:438;1164:14;;1159:32;1041:5;1146:46;1236:2;1227:11;;;-1:-1:-1;1256:21:438;1010:282;1256:21;-1:-1:-1;1312:6:438;637:698;-1:-1:-1;;;637:698:438:o;777:1861:494:-;835:13;864:4;:11;879:1;864:16;860:31;;-1:-1:-1;;882:9:494;;;;;;;;;-1:-1:-1;882:9:494;;;777:1861::o;860:31::-;940:19;962:12;;;;;;;;;;;;;;;;;940:34;;1023:18;1069:1;1050:4;:11;1064:1;1050:15;;;;:::i;:::-;1049:21;;;;:::i;:::-;1044:27;;:1;:27;:::i;:::-;1023:48;-1:-1:-1;1151:20:494;1185:15;1023:48;1198:2;1185:15;:::i;:::-;1174:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1174:27:494;;1151:50;;1294:10;1286:6;1279:26;1386:1;1379:5;1375:13;1442:4;1492;1486:11;1477:7;1473:25;1585:2;1577:6;1573:15;1655:739;1674:6;1665:7;1662:19;1655:739;;;1771:1;1762:7;1758:15;1747:26;;1809:7;1803:14;1932:4;1924:5;1920:2;1916:14;1912:25;1902:8;1898:40;1892:47;1881:9;1873:67;1985:1;1974:9;1970:17;1957:30;;2063:4;2055:5;2051:2;2047:14;2043:25;2033:8;2029:40;2023:47;2012:9;2004:67;2116:1;2105:9;2101:17;2088:30;;2194:4;2186:5;2183:1;2178:14;2174:25;2164:8;2160:40;2154:47;2143:9;2135:67;2247:1;2236:9;2232:17;2219:30;;2325:4;2317:5;2305:25;2295:8;2291:40;2285:47;2274:9;2266:67;-1:-1:-1;2378:1:494;2363:17;1655:739;;;2464:1;2457:4;2451:11;2447:19;2484:1;2479:54;;;;2551:1;2546:52;;;;2440:158;;2479:54;-1:-1:-1;;;;;2495:17:494;;2488:43;2479:54;;2546:52;-1:-1:-1;;;;;2562:17:494;;2555:41;2440:158;-1:-1:-1;2625:6:494;;777:1861;-1:-1:-1;;;;;;;;777:1861:494:o;452:282:88:-;-1:-1:-1;;;;;;1121:62:88;;1096:4;1121:62;;;303:66:90;1121:62:88;;;;;;;;:70;;:62;:70;510:182;;-1:-1:-1;;;;;;556:62:88;;:49;:62;;;303:66:90;556:62:88;;;;;:69;;-1:-1:-1;;556:69:88;621:4;556:69;;;510:182;;;653:32;;-1:-1:-1;;;653:32:88;;;;;;;;;;;510:182;702:27;;-1:-1:-1;;;;;;702:27:88;;;;;;;;452:282;:::o;2560:247:129:-;2657:32;2692:23;:21;:23::i;:::-;2657:58;-1:-1:-1;2722:8:129;;;:15;2733:4;2722:8;:15;:::i;:::-;-1:-1:-1;2743:10:129;;;:19;2756:6;2743:10;:19;:::i;:::-;-1:-1:-1;3948:7:129;2768:34;;-1:-1:-1;;2560:247:129:o;2889:332:148:-;2992:28;:35;3023:4;2992:28;:35;:::i;:::-;-1:-1:-1;3033:31:148;:41;3067:7;3033:31;:41;:::i;:::-;-1:-1:-1;;3168:1:148;-1:-1:-1;;;;;;;;;;;3131:38:148;;;3175:37;:41;-1:-1:-1;2889:332:148:o;8774:90:81:-;8832:7;8854:5;8858:1;8854;:5;:::i;3151:218:446:-;3208:7;-1:-1:-1;;;;;3231:25:446;;3227:105;;;3279:42;;-1:-1:-1;;;3279:42:446;;3310:3;3279:42;;;18565:36:516;18617:18;;;18610:34;;;18538:18;;3279:42:446;18384:266:516;8515:255:81;8668:7;8677;8699:66;8710:27;8728:8;:6;:8::i;:::-;8710:27;;:17;:27::i;:::-;8739:25;8742:14;:5;:12;:14::i;:::-;8758:5;8739:2;:25;;:::i;:::-;8699:5;;:66;:10;:66::i;:::-;8692:73;;;;8515:255;;;;;;;:::o;8868:95::-;8931:7;8953:5;8957:1;8953;:5;:::i;6184:577:148:-;6234:7;6249:18;6270:13;:11;:13::i;:::-;6293:18;;6249:34;;-1:-1:-1;6293:22:148;6289:468;;6332:22;;;;;;;;6184:577;-1:-1:-1;6184:577:148:o;6289:468::-;-1:-1:-1;;;;;;;;;;;6607:34:148;6653:15;;6649:102;;6687:10;6184:577;-1:-1:-1;;6184:577:148:o;6649:102::-;6729:13;6722:20;;;;6184:577;:::o;6970:613::-;7023:7;7038:21;7062:16;:14;:16::i;:::-;7088:21;;7038:40;;-1:-1:-1;7088:25:148;7084:495;;7130:25;;;;;;;;6970:613;-1:-1:-1;6970:613:148:o;7084:495::-;7420:37;;7469:18;;7465:108;;7506:13;6970:613;-1:-1:-1;;6970:613:148:o;8587:1642:445:-;8635:7;8658:1;8663;8658:6;8654:45;;-1:-1:-1;8687:1:445;;8587:1642;-1:-1:-1;8587:1642:445:o;8654:45::-;9378:14;9412:1;9401:7;9406:1;9401:4;:7::i;:::-;:12;;9395:1;:19;;9378:36;;9873:1;9862:6;9858:1;:10;;;;;:::i;:::-;;9849:6;:19;9848:26;;9839:35;;9922:1;9911:6;9907:1;:10;;;;;:::i;:::-;;9898:6;:19;9897:26;;9888:35;;9971:1;9960:6;9956:1;:10;;;;;:::i;:::-;;9947:6;:19;9946:26;;9937:35;;10020:1;10009:6;10005:1;:10;;;;;:::i;:::-;;9996:6;:19;9995:26;;9986:35;;10069:1;10058:6;10054:1;:10;;;;;:::i;:::-;;10045:6;:19;10044:26;;10035:35;;10118:1;10107:6;10103:1;:10;;;;;:::i;:::-;;10094:6;:19;10093:26;;10084:35;;10167:1;10156:6;10152:1;:10;;;;;:::i;:::-;;10143:6;:19;10142:26;;10133:35;;10189:23;10193:6;10205;10201:1;:10;;;;;:::i;:::-;;10189:3;:23::i;11772:361:76:-;11911:7;11926:186;11939:4;11933:3;:10;11926:186;;;11953:11;11967:23;11980:3;11985:4;11967:12;:23::i;:::-;13062:28;13115:20;;;13174:4;13161:18;;11953:37;;-1:-1:-1;12002:35:76;;;;13157:28;;12002:29;;;:35;11998:108;;;12056:3;12049:10;;11998:108;;;12090:7;:3;12096:1;12090:7;:::i;:::-;12084:13;;11998:108;11945:167;11926:186;;5140:1530:439;5266:7;;;6199:66;6186:79;;6182:164;;;-1:-1:-1;6297:1:439;;-1:-1:-1;6301:30:439;;-1:-1:-1;6333:1:439;6281:54;;6182:164;6457:24;;;6440:14;6457:24;;;;;;;;;21256:25:516;;;21329:4;21317:17;;21297:18;;;21290:45;;;;21351:18;;;21344:34;;;21394:18;;;21387:34;;;6457:24:439;;21228:19:516;;6457:24:439;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6457:24:439;;-1:-1:-1;;6457:24:439;;;-1:-1:-1;;;;;;;6495:20:439;;6491:113;;-1:-1:-1;6547:1:439;;-1:-1:-1;6551:29:439;;-1:-1:-1;6547:1:439;;-1:-1:-1;6531:62:439;;6491:113;6622:6;-1:-1:-1;6630:20:439;;-1:-1:-1;6630:20:439;;-1:-1:-1;5140:1530:439;;;;;;;;;:::o;7196:532::-;7291:20;7282:5;:29;;;;;;;;:::i;:::-;;7278:444;;7196:532;;:::o;7278:444::-;7387:29;7378:5;:38;;;;;;;;:::i;:::-;;7374:348;;7439:23;;-1:-1:-1;;;7439:23:439;;;;;;;;;;;7374:348;7492:35;7483:5;:44;;;;;;;;:::i;:::-;;7479:243;;7550:46;;-1:-1:-1;;;7550:46:439;;;;;1746:25:516;;;1719:18;;7550:46:439;1600:177:516;7479:243:439;7626:30;7617:5;:39;;;;;;;;:::i;:::-;;7613:109;;7679:32;;-1:-1:-1;;;7679:32:439;;;;;1746:25:516;;;1719:18;;7679:32:439;1600:177:516;12214:916:445;12267:7;;-1:-1:-1;;;12342:17:445;;12338:103;;-1:-1:-1;;;12379:17:445;;;-1:-1:-1;12424:2:445;12414:12;12338:103;12467:8;12458:5;:17;12454:103;;12504:8;12495:17;;;-1:-1:-1;12540:2:445;12530:12;12454:103;12583:8;12574:5;:17;12570:103;;12620:8;12611:17;;;-1:-1:-1;12656:2:445;12646:12;12570:103;12699:7;12690:5;:16;12686:100;;12735:7;12726:16;;;-1:-1:-1;12770:1:445;12760:11;12686:100;12812:7;12803:5;:16;12799:100;;12848:7;12839:16;;;-1:-1:-1;12883:1:445;12873:11;12799:100;12925:7;12916:5;:16;12912:100;;12961:7;12952:16;;;-1:-1:-1;12996:1:445;12986:11;12912:100;13038:7;13029:5;:16;13025:66;;13075:1;13065:11;13117:6;12214:916;-1:-1:-1;;12214:916:445:o;7623:172:76:-;7721:7;;7752:38;7760:4;7779:3;7784:5;7752:7;:38::i;10699:983:445:-;10751:7;;10835:3;10826:12;;;:16;10822:99;;10872:3;10862:13;;;;10893;10822:99;10947:2;10938:11;;;:15;10934:96;;10983:2;10973:12;;;;11003;10934:96;11056:2;11047:11;;;:15;11043:96;;11092:2;11082:12;;;;11112;11043:96;11165:2;11156:11;;;:15;11152:96;;11201:2;11191:12;;;;11221;11152:96;11274:1;11265:10;;;:14;11261:93;;11309:1;11299:11;;;;11328;11261:93;11380:1;11371:10;;;:14;11367:93;;11415:1;11405:11;;;;11434;11367:93;11486:1;11477:10;;;:14;11473:93;;11521:1;11511:11;;;;11540;11473:93;11592:1;11583:10;;;:14;11579:64;;11627:1;11617:11;11669:6;10699:983;-1:-1:-1;;10699:983:445:o;2557:104::-;2615:7;2645:1;2641;:5;:13;;2653:1;2641:13;;;-1:-1:-1;2649:1:445;;2557:104;-1:-1:-1;2557:104:445:o;2774:153::-;2836:7;2909:11;2919:1;2910:5;;;2909:11;:::i;:::-;2899:21;;2900:5;;;2899:21;:::i;10688:752:76:-;10833:11;;10795:7;;;;10855;;10851:585;;10918:25;10946:28;10960:4;10966:7;10972:1;10966:3;:7;:::i;10946:28::-;10918:56;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10918:56:76;;;-1:-1:-1;;;;;10918:56:76;;;;;;;-1:-1:-1;11040:16:76;;;-1:-1:-1;11040:16:76;11032:56;;;;-1:-1:-1;;;11032:56:76;;21766:2:516;11032:56:76;;;21748:21:516;21805:2;21785:18;;;21778:30;21844:29;21824:18;;;21817:57;21891:18;;11032:56:76;21564:351:516;11032:56:76;11140:9;;:16;;;;;;;11136:161;;11206:5;11168:28;11182:4;11188:7;11194:1;11188:3;:7;:::i;11168:28::-;:43;;-1:-1:-1;;;;;11168:43:76;;;;-1:-1:-1;;;11168:43:76;;;;;;;;;;;11136:161;;;11246:41;;;;;;;;;;;;;;;-1:-1:-1;;;;;11246:41:76;;;;;;;;;;11236:52;;;;;;;-1:-1:-1;11236:52:76;;;;;;;;;;;;;;-1:-1:-1;;;11236:52:76;;;;;;;;;;11136:161;11312:11;;;;-1:-1:-1;11325:5:76;;-1:-1:-1;11304:27:76;;-1:-1:-1;11304:27:76;10851:585;-1:-1:-1;;11362:41:76;;;;;;;;;;;;;;;-1:-1:-1;;;;;11362:41:76;;;;;;;;;;11352:52;;;;;;;-1:-1:-1;11352:52:76;;;;;;;;;;;;;-1:-1:-1;;;11352:52:76;;;;;;;;;;;;-1:-1:-1;;11396:5:76;11412:17;;14:250:516;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:516;238:16;;231:27;14:250::o;269:271::-;311:3;349:5;343:12;376:6;371:3;364:19;392:76;461:6;454:4;449:3;445:14;438:4;431:5;427:16;392:76;:::i;:::-;522:2;501:15;-1:-1:-1;;497:29:516;488:39;;;;529:4;484:50;;269:271;-1:-1:-1;;269:271:516:o;545:220::-;694:2;683:9;676:21;657:4;714:45;755:2;744:9;740:18;732:6;714:45;:::i;770:180::-;829:6;882:2;870:9;861:7;857:23;853:32;850:52;;;898:1;895;888:12;850:52;-1:-1:-1;921:23:516;;770:180;-1:-1:-1;770:180:516:o;1163:173::-;1231:20;;-1:-1:-1;;;;;1280:31:516;;1270:42;;1260:70;;1326:1;1323;1316:12;1260:70;1163:173;;;:::o;1341:254::-;1409:6;1417;1470:2;1458:9;1449:7;1445:23;1441:32;1438:52;;;1486:1;1483;1476:12;1438:52;1509:29;1528:9;1509:29;:::i;:::-;1499:39;1585:2;1570:18;;;;1557:32;;-1:-1:-1;;;1341:254:516:o;1782:328::-;1859:6;1867;1875;1928:2;1916:9;1907:7;1903:23;1899:32;1896:52;;;1944:1;1941;1934:12;1896:52;1967:29;1986:9;1967:29;:::i;:::-;1957:39;;2015:38;2049:2;2038:9;2034:18;2015:38;:::i;:::-;2005:48;;2100:2;2089:9;2085:18;2072:32;2062:42;;1782:328;;;;;:::o;2297:127::-;2358:10;2353:3;2349:20;2346:1;2339:31;2389:4;2386:1;2379:15;2413:4;2410:1;2403:15;2429:632;2494:5;2524:18;2565:2;2557:6;2554:14;2551:40;;;2571:18;;:::i;:::-;2646:2;2640:9;2614:2;2700:15;;-1:-1:-1;;2696:24:516;;;2722:2;2692:33;2688:42;2676:55;;;2746:18;;;2766:22;;;2743:46;2740:72;;;2792:18;;:::i;:::-;2832:10;2828:2;2821:22;2861:6;2852:15;;2891:6;2883;2876:22;2931:3;2922:6;2917:3;2913:16;2910:25;2907:45;;;2948:1;2945;2938:12;2907:45;2998:6;2993:3;2986:4;2978:6;2974:17;2961:44;3053:1;3046:4;3037:6;3029;3025:19;3021:30;3014:41;;;;2429:632;;;;;:::o;3066:222::-;3109:5;3162:3;3155:4;3147:6;3143:17;3139:27;3129:55;;3180:1;3177;3170:12;3129:55;3202:80;3278:3;3269:6;3256:20;3249:4;3241:6;3237:17;3202:80;:::i;3293:617::-;3390:6;3398;3406;3459:2;3447:9;3438:7;3434:23;3430:32;3427:52;;;3475:1;3472;3465:12;3427:52;3498:29;3517:9;3498:29;:::i;:::-;3488:39;;3578:2;3567:9;3563:18;3550:32;3601:18;3642:2;3634:6;3631:14;3628:34;;;3658:1;3655;3648:12;3628:34;3681:50;3723:7;3714:6;3703:9;3699:22;3681:50;:::i;:::-;3671:60;;3784:2;3773:9;3769:18;3756:32;3740:48;;3813:2;3803:8;3800:16;3797:36;;;3829:1;3826;3819:12;3797:36;;3852:52;3896:7;3885:8;3874:9;3870:24;3852:52;:::i;:::-;3842:62;;;3293:617;;;;;:::o;3915:186::-;3974:6;4027:2;4015:9;4006:7;4002:23;3998:32;3995:52;;;4043:1;4040;4033:12;3995:52;4066:29;4085:9;4066:29;:::i;4106:677::-;4283:2;4272:9;4265:21;4246:4;4321:6;4315:13;4364:4;4359:2;4348:9;4344:18;4337:32;4392:52;4439:3;4428:9;4424:19;4410:12;4392:52;:::i;:::-;4378:66;;4493:2;4485:6;4481:15;4475:22;4565:2;4561:7;4549:9;4541:6;4537:22;4533:36;4528:2;4517:9;4513:18;4506:64;4593:41;4627:6;4611:14;4593:41;:::i;:::-;4579:55;;;4688:2;4680:6;4676:15;4670:22;4665:2;4654:9;4650:18;4643:50;4749:2;4741:6;4737:15;4731:22;4724:4;4713:9;4709:20;4702:52;4771:6;4763:14;;;4106:677;;;;:::o;4788:1259::-;5194:3;5189;5185:13;5177:6;5173:26;5162:9;5155:45;5136:4;5219:2;5257:3;5252:2;5241:9;5237:18;5230:31;5284:46;5325:3;5314:9;5310:19;5302:6;5284:46;:::i;:::-;5378:9;5370:6;5366:22;5361:2;5350:9;5346:18;5339:50;5412:33;5438:6;5430;5412:33;:::i;:::-;5476:2;5461:18;;5454:34;;;-1:-1:-1;;;;;5525:32:516;;5519:3;5504:19;;5497:61;5545:3;5574:19;;5567:35;;;5639:22;;;5633:3;5618:19;;5611:51;5711:13;;5733:22;;;5783:2;5809:15;;;;-1:-1:-1;5771:15:516;;;;-1:-1:-1;5852:169:516;5866:6;5863:1;5860:13;5852:169;;;5927:13;;5915:26;;5996:15;;;;5961:12;;;;5888:1;5881:9;5852:169;;;-1:-1:-1;6038:3:516;;4788:1259;-1:-1:-1;;;;;;;;;;;;4788:1259:516:o;6253:617::-;6350:6;6358;6366;6419:2;6407:9;6398:7;6394:23;6390:32;6387:52;;;6435:1;6432;6425:12;6387:52;6475:9;6462:23;6504:18;6545:2;6537:6;6534:14;6531:34;;;6561:1;6558;6551:12;6531:34;6584:50;6626:7;6617:6;6606:9;6602:22;6584:50;:::i;:::-;6574:60;;6687:2;6676:9;6672:18;6659:32;6643:48;;6716:2;6706:8;6703:16;6700:36;;;6732:1;6729;6722:12;6700:36;;6755:52;6799:7;6788:8;6777:9;6773:24;6755:52;:::i;:::-;6745:62;;;6826:38;6860:2;6849:9;6845:18;6826:38;:::i;:::-;6816:48;;6253:617;;;;;:::o;6875:347::-;6940:6;6948;7001:2;6989:9;6980:7;6976:23;6972:32;6969:52;;;7017:1;7014;7007:12;6969:52;7040:29;7059:9;7040:29;:::i;:::-;7030:39;;7119:2;7108:9;7104:18;7091:32;7166:5;7159:13;7152:21;7145:5;7142:32;7132:60;;7188:1;7185;7178:12;7132:60;7211:5;7201:15;;;6875:347;;;;;:::o;7227:667::-;7322:6;7330;7338;7346;7399:3;7387:9;7378:7;7374:23;7370:33;7367:53;;;7416:1;7413;7406:12;7367:53;7439:29;7458:9;7439:29;:::i;:::-;7429:39;;7487:38;7521:2;7510:9;7506:18;7487:38;:::i;:::-;7477:48;;7572:2;7561:9;7557:18;7544:32;7534:42;;7627:2;7616:9;7612:18;7599:32;7654:18;7646:6;7643:30;7640:50;;;7686:1;7683;7676:12;7640:50;7709:22;;7762:4;7754:13;;7750:27;-1:-1:-1;7740:55:516;;7791:1;7788;7781:12;7740:55;7814:74;7880:7;7875:2;7862:16;7857:2;7853;7849:11;7814:74;:::i;:::-;7804:84;;;7227:667;;;;;;;:::o;7899:618::-;8001:6;8009;8017;8025;8033;8041;8094:3;8082:9;8073:7;8069:23;8065:33;8062:53;;;8111:1;8108;8101:12;8062:53;8134:29;8153:9;8134:29;:::i;:::-;8124:39;;8210:2;8199:9;8195:18;8182:32;8172:42;;8261:2;8250:9;8246:18;8233:32;8223:42;;8315:2;8304:9;8300:18;8287:32;8359:4;8352:5;8348:16;8341:5;8338:27;8328:55;;8379:1;8376;8369:12;8328:55;7899:618;;;;-1:-1:-1;7899:618:516;;8454:3;8439:19;;8426:33;;8506:3;8491:19;;;8478:33;;-1:-1:-1;7899:618:516;-1:-1:-1;;7899:618:516:o;8522:543::-;8610:6;8618;8671:2;8659:9;8650:7;8646:23;8642:32;8639:52;;;8687:1;8684;8677:12;8639:52;8727:9;8714:23;8756:18;8797:2;8789:6;8786:14;8783:34;;;8813:1;8810;8803:12;8783:34;8836:50;8878:7;8869:6;8858:9;8854:22;8836:50;:::i;:::-;8826:60;;8939:2;8928:9;8924:18;8911:32;8895:48;;8968:2;8958:8;8955:16;8952:36;;;8984:1;8981;8974:12;8952:36;;9007:52;9051:7;9040:8;9029:9;9025:24;9007:52;:::i;:::-;8997:62;;;8522:543;;;;;:::o;9070:743::-;9177:6;9185;9193;9246:2;9234:9;9225:7;9221:23;9217:32;9214:52;;;9262:1;9259;9252:12;9214:52;9302:9;9289:23;9331:18;9372:2;9364:6;9361:14;9358:34;;;9388:1;9385;9378:12;9358:34;9411:50;9453:7;9444:6;9433:9;9429:22;9411:50;:::i;:::-;9401:60;;9514:2;9503:9;9499:18;9486:32;9470:48;;9543:2;9533:8;9530:16;9527:36;;;9559:1;9556;9549:12;9818:260;9886:6;9894;9947:2;9935:9;9926:7;9922:23;9918:32;9915:52;;;9963:1;9960;9953:12;9915:52;9986:29;10005:9;9986:29;:::i;:::-;9976:39;;10034:38;10068:2;10057:9;10053:18;10034:38;:::i;:::-;10024:48;;9818:260;;;;;:::o;10275:380::-;10354:1;10350:12;;;;10397;;;10418:61;;10472:4;10464:6;10460:17;10450:27;;10418:61;10525:2;10517:6;10514:14;10494:18;10491:38;10488:161;;10571:10;10566:3;10562:20;10559:1;10552:31;10606:4;10603:1;10596:15;10634:4;10631:1;10624:15;11539:543;11641:2;11636:3;11633:11;11630:446;;;11677:1;11701:5;11698:1;11691:16;11745:4;11742:1;11732:18;11815:2;11803:10;11799:19;11796:1;11792:27;11786:4;11782:38;11851:4;11839:10;11836:20;11833:47;;;-1:-1:-1;11874:4:516;11833:47;11929:2;11924:3;11920:12;11917:1;11913:20;11907:4;11903:31;11893:41;;11984:82;12002:2;11995:5;11992:13;11984:82;;;12047:17;;;12028:1;12017:13;11984:82;;12258:1345;12384:3;12378:10;12411:18;12403:6;12400:30;12397:56;;;12433:18;;:::i;:::-;12462:97;12552:6;12512:38;12544:4;12538:11;12512:38;:::i;:::-;12506:4;12462:97;:::i;:::-;12614:4;;12671:2;12660:14;;12688:1;12683:663;;;;13390:1;13407:6;13404:89;;;-1:-1:-1;13459:19:516;;;13453:26;13404:89;-1:-1:-1;;12215:1:516;12211:11;;;12207:24;12203:29;12193:40;12239:1;12235:11;;;12190:57;13506:81;;12653:944;;12683:663;11486:1;11479:14;;;11523:4;11510:18;;-1:-1:-1;;12719:20:516;;;12837:236;12851:7;12848:1;12845:14;12837:236;;;12940:19;;;12934:26;12919:42;;13032:27;;;;13000:1;12988:14;;;;12867:19;;12837:236;;;12841:3;13101:6;13092:7;13089:19;13086:201;;;13162:19;;;13156:26;-1:-1:-1;;13245:1:516;13241:14;;;13257:3;13237:24;13233:37;13229:42;13214:58;13199:74;;13086:201;-1:-1:-1;;;;;13333:1:516;13317:14;;;13313:22;13300:36;;-1:-1:-1;12258:1345:516:o;14310:489::-;-1:-1:-1;;;;;14579:15:516;;;14561:34;;14631:15;;14626:2;14611:18;;14604:43;14678:2;14663:18;;14656:34;;;14726:3;14721:2;14706:18;;14699:31;;;14504:4;;14747:46;;14773:19;;14765:6;14747:46;:::i;:::-;14739:54;14310:489;-1:-1:-1;;;;;;14310:489:516:o;14804:290::-;14873:6;14926:2;14914:9;14905:7;14901:23;14897:32;14894:52;;;14942:1;14939;14932:12;14894:52;14968:16;;-1:-1:-1;;;;;;15013:32:516;;15003:43;;14993:71;;15060:1;15057;15050:12;15874:1545;-1:-1:-1;;;16523:43:516;;16589:13;;16505:3;;16611:74;16589:13;16674:1;16665:11;;16658:4;16646:17;;16611:74;:::i;:::-;-1:-1:-1;;;16744:1:516;16704:16;;;16736:10;;;16729:54;16808:13;;16830:76;16808:13;16892:2;16884:11;;16877:4;16865:17;;16830:76;:::i;:::-;16971:66;16966:2;16925:17;;;;16958:11;;;16951:87;17067:66;17062:2;17054:11;;17047:87;-1:-1:-1;;;17158:2:516;17150:11;;17143:49;17217:13;;17239:76;17217:13;17301:2;17293:11;;17286:4;17274:17;;17239:76;:::i;:::-;-1:-1:-1;;;17375:2:516;17334:17;;;;17367:11;;;17360:26;17410:2;17402:11;;15874:1545;-1:-1:-1;;;;;15874:1545:516:o;17424:461::-;17686:31;17681:3;17674:44;17656:3;17747:6;17741:13;17763:75;17831:6;17826:2;17821:3;17817:12;17810:4;17802:6;17798:17;17763:75;:::i;:::-;17858:16;;;;17876:2;17854:25;;17424:461;-1:-1:-1;;17424:461:516:o;18655:127::-;18716:10;18711:3;18707:20;18704:1;18697:31;18747:4;18744:1;18737:15;18771:4;18768:1;18761:15;18787:128;18854:9;;;18875:11;;;18872:37;;;18889:18;;:::i;18920:125::-;18985:9;;;19006:10;;;19003:36;;;19019:18;;:::i;19853:127::-;19914:10;19909:3;19905:20;19902:1;19895:31;19945:4;19942:1;19935:15;19969:4;19966:1;19959:15;19985:217;20025:1;20051;20041:132;;20095:10;20090:3;20086:20;20083:1;20076:31;20130:4;20127:1;20120:15;20158:4;20155:1;20148:15;20041:132;-1:-1:-1;20187:9:516;;19985:217::o;20207:168::-;20280:9;;;20311;;20328:15;;;20322:22;;20308:37;20298:71;;20349:18;;:::i;20380:182::-;-1:-1:-1;;;;;20487:10:516;;;20499;;;20483:27;;20522:11;;;20519:37;;;20536:18;;:::i;:::-;20519:37;20380:182;;;;:::o;20839:185::-;-1:-1:-1;;;;;20960:10:516;;;20948;;;20944:27;;20983:12;;;20980:38;;;20998:18;;:::i;21432:127::-;21493:10;21488:3;21484:20;21481:1;21474:31;21524:4;21521:1;21514:15;21548:4;21545:1;21538:15","linkReferences":{}},"methodIdentifiers":{"CLOCK_MODE()":"4bf5d7e9","DOMAIN_SEPARATOR()":"3644e515","__ERC721A_init(string,string)":"d2f01f19","__SpaceOwner_init(string,string,string)":"d7a901d3","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","clock()":"91ddadf4","delegate(address)":"5c19a95c","delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)":"c3cda520","delegates(address)":"587cde1e","eip712Domain()":"84b0196e","getApproved(uint256)":"081812fc","getFactory()":"88cc58e4","getPastTotalSupply(uint256)":"8e539e8c","getPastVotes(address,uint256)":"3a46b1a8","getSpaceInfo(address)":"6a9a38e6","getVotes(address)":"9ab24eb0","isApprovedForAll(address,address)":"e985e9c5","mintSpace(string,string,address)":"91de4a83","name()":"06fdde03","nextTokenId()":"75794a3c","nonces(address)":"7ecebe00","ownerOf(uint256)":"6352211e","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setFactory(address)":"5bb47808","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","totalSupply()":"18160ddd","transferFrom(address,address,uint256)":"23b872dd","updateSpaceInfo(address,string,string)":"3953801b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AlreadyDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlreadyEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BalanceQueryForZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GuardianEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initializable_AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"currentNonce\",\"type\":\"uint256\"}],\"name\":\"InvalidAccountNonce\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintERC2309QuantityExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintZeroQuantity\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotExternalAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnershipNotInitializedForExtraData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"bits\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SafeCastOverflowedUintDowncast\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SpaceOwner__OnlyFactoryAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SpaceOwner__OnlySpaceOwnerAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFromIncorrectOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC721ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"URIQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Validator__InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Validator__InvalidStringLength\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"toTokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"ConsecutiveTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"cooldown\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"GuardianUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"}],\"name\":\"SpaceOwner__SetFactory\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"space\",\"type\":\"address\"}],\"name\":\"SpaceOwner__UpdateSpace\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CLOCK_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"result\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"name\":\"__ERC721A_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"}],\"name\":\"__SpaceOwner_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clock\",\"outputs\":[{\"internalType\":\"uint48\",\"name\":\"\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFactory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timepoint\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"timepoint\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"space\",\"type\":\"address\"}],\"name\":\"getSpaceInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"}],\"internalType\":\"struct ISpaceOwnerBase.Space\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"space\",\"type\":\"address\"}],\"name\":\"mintSpace\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextTokenId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"result\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"}],\"name\":\"setFactory\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"space\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"name\":\"updateSpaceInfo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ECDSAInvalidSignature()\":[{\"details\":\"The signature derives the `address(0)`.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}],\"InvalidAccountNonce(address,uint256)\":[{\"details\":\"The nonce used for an `account` is not the expected current nonce.\"}],\"SafeCastOverflowedUintDowncast(uint8,uint256)\":[{\"details\":\"Value doesn't fit in an uint of `bits` size.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"ConsecutiveTransfer(uint256,uint256,address,address)\":{\"details\":\"Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, as defined in the [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. See {_mintERC2309} for more details.\"},\"DelegateChanged(address,address,address)\":{\"details\":\"Emitted when an account changes their delegate.\"},\"DelegateVotesChanged(address,uint256,uint256)\":{\"details\":\"Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\"},\"EIP712DomainChanged()\":{\"details\":\"MAY be emitted to signal that the domain could have changed.\"},\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"CLOCK_MODE()\":{\"details\":\"Description of the clock\"},\"approve(address,uint256)\":{\"details\":\"Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator.\"},\"balanceOf(address)\":{\"details\":\"Returns the number of tokens in `owner`'s account.\"},\"clock()\":{\"details\":\"Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\"},\"delegate(address)\":{\"details\":\"Delegates votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`.\"},\"delegates(address)\":{\"details\":\"Returns the delegate that `account` has chosen.\"},\"eip712Domain()\":{\"details\":\"See {EIP-5267}. _Available since v4.9._\"},\"getApproved(uint256)\":{\"details\":\"Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist.\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Returns the total supply of votes available at a specific moment in the past. If the `clock()` is configured to use block numbers, this will return the value at the end of the corresponding block. NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. Votes that have not been delegated are still part of total supply, even though they would not participate in a vote.\"},\"getPastVotes(address,uint256)\":{\"details\":\"Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is configured to use block numbers, this will return the value at the end of the corresponding block.\"},\"getSpaceInfo(address)\":{\"params\":{\"space\":\"The address of the space\"},\"returns\":{\"_0\":\"space The space info\"}},\"getVotes(address)\":{\"details\":\"Returns the current amount of votes that `account` has.\"},\"isApprovedForAll(address,address)\":{\"details\":\"Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}.\"},\"mintSpace(string,string,address)\":{\"details\":\"Only the factory is allowed to mint spaces\",\"params\":{\"name\":\"The name of the space\",\"space\":\"The address of the space\",\"uri\":\"The URI of the space\"},\"returns\":{\"tokenId\":\"The token id of the minted space\"}},\"name()\":{\"details\":\"Returns the token collection name.\"},\"ownerOf(uint256)\":{\"details\":\"Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Equivalent to `safeTransferFrom(from, to, tokenId, '')`.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event.\"},\"symbol()\":{\"details\":\"Returns the token collection symbol.\"},\"tokenURI(uint256)\":{\"details\":\"Returns the Uniform Resource Identifier (URI) for `tokenId` token.\"},\"totalSupply()\":{\"details\":\"Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event.\"},\"updateSpaceInfo(address,string,string)\":{\"details\":\"Only the space owner is allowed to update the space info\",\"params\":{\"name\":\"The name of the space\",\"space\":\"The address of the space\",\"uri\":\"The URI of the space\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ApprovalCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"ApprovalQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"BalanceQueryForZeroAddress()\":[{\"notice\":\"Cannot query the balance for the zero address.\"}],\"MintERC2309QuantityExceedsLimit()\":[{\"notice\":\"The `quantity` minted with ERC2309 exceeds the safety limit.\"}],\"MintToZeroAddress()\":[{\"notice\":\"Cannot mint to the zero address.\"}],\"MintZeroQuantity()\":[{\"notice\":\"The quantity of tokens minted must be more than zero.\"}],\"OwnerQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"OwnershipNotInitializedForExtraData()\":[{\"notice\":\"The `extraData` cannot be set on an unintialized ownership slot.\"}],\"TransferCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"TransferFromIncorrectOwner()\":[{\"notice\":\"The token must be owned by `from`.\"}],\"TransferToNonERC721ReceiverImplementer()\":[{\"notice\":\"Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"notice\":\"Cannot transfer to the zero address.\"}],\"URIQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}]},\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{\"getFactory()\":{\"notice\":\"Get the factory address\"},\"getSpaceInfo(address)\":{\"notice\":\"Get the space info\"},\"mintSpace(string,string,address)\":{\"notice\":\"Mint a space\"},\"nextTokenId()\":{\"notice\":\"Get the next token id that will be used to mint a space\"},\"setFactory(address)\":{\"notice\":\"Set the factory address that is allowed to mint spaces\"},\"updateSpaceInfo(address,string,string)\":{\"notice\":\"Update the space info\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/facets/owner/SpaceOwner.sol\":\"SpaceOwner\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/governance/votes/Checkpoints.sol\":{\"keccak256\":\"0x4b98db2e67e47ec59caa78fade51e9ec6fa33ee2592e46fed09d9167ebe76c8a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://72ec6949ee33fb9c137bba362b94af699762fadd66334128d1dd0dbcd4301bc6\",\"dweb:/ipfs/QmQybe6k5K3gss4zzCPqoba6ZBZE5p8KJRoQ2RzkE91JRV\"]},\"contracts/src/diamond/facets/governance/votes/IERC5805.sol\":{\"keccak256\":\"0x8b3b84026610f99bcac6139359305a46c537edf377e44771b904c2bd35719ee3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://49a8e7af9b47b6bbd794ccb50380b8f9e9b84561d62bcbf16843dde55bab86e6\",\"dweb:/ipfs/QmdBdYxvhwCwtqW9DfPa6Bw5PrYdzhuKQyJv4vcLsttqrV\"]},\"contracts/src/diamond/facets/governance/votes/IERC6372.sol\":{\"keccak256\":\"0xc3fa5c25bdd3db6126e04897496889e68a65749b050ae8fede0ff80e322aca86\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bcf56ae1474c9a3032f8b15b1bbbeeb50ac21c574047f846673d4aca9bf82db4\",\"dweb:/ipfs/Qmcce1zD6TBWiMLXMDsFF6bUrwtVtharjwvAbtkMmoYRgd\"]},\"contracts/src/diamond/facets/governance/votes/IVotes.sol\":{\"keccak256\":\"0xe84a920ea7070bafd35afb05c057801a466ba5d9a0db10be3e31720a1db1f2e6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://72415e259038afac01a7e76dd74d31243518514e58fe01fd7a6a38f93dd8247b\",\"dweb:/ipfs/QmdS8GkX9Ze4rHp2JQ8Va1DMWHaqxQLCjGD8hVVR5KyMVS\"]},\"contracts/src/diamond/facets/governance/votes/Votes.sol\":{\"keccak256\":\"0x36ca9d8aa95a21f2812aa1f2a3712d4acecd78476d8e50900566cc233a54eefa\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0d910d09517696658fe1cb4291fca5f66cc0b7fd4605f2a4ad70f9c7c494206c\",\"dweb:/ipfs/QmVrcYUZPgbxfQkqXkEdnUFJ81XenXt8hbmDvXBnVyTpDS\"]},\"contracts/src/diamond/facets/governance/votes/VotesBase.sol\":{\"keccak256\":\"0x3234078063b2070a77f1b03e1d96e8c5a958450a70373df02cc0bdb51b69ccb8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6d66c3f430cf100ff52dbc614f6982e405996957b60b8de49f6e59bca7dc566f\",\"dweb:/ipfs/QmRKp88BWBr4Pzf4CnW2wWBkERVLMPEnVeZhxizc8tJXBN\"]},\"contracts/src/diamond/facets/governance/votes/VotesStorage.sol\":{\"keccak256\":\"0x2e1a1db6e37ca9a1552edfd2be03d6069e9858996ea1fe0387dd4f35d58455be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://723c3880d012108f1f442d89f972de200ef9033f1c3179bfa56054740e028fa6\",\"dweb:/ipfs/QmNxcE6H6Db93XzPepQ2xdPrgZkusCrV9LEq9rPvSPq3UT\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/OwnableBase.sol\":{\"keccak256\":\"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4\",\"dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa\"]},\"contracts/src/diamond/facets/ownable/OwnableStorage.sol\":{\"keccak256\":\"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105\",\"dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721A.sol\":{\"keccak256\":\"0xc8fab662d9a0c4e697c8dcaad72dd2a190331b01476649a742b6f317266ac5a1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://9c84047a6d47a901f45f90f12f713432289ae6d88fea95a383900906005cf70b\",\"dweb:/ipfs/QmVdLUVdtjTQn2fCG85Uv2ZAzCSfNbWYcAg5eXthunnigc\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol\":{\"keccak256\":\"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa\",\"dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol\":{\"keccak256\":\"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c\",\"dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu\"]},\"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol\":{\"keccak256\":\"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e\",\"dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM\"]},\"contracts/src/diamond/utils/Context.sol\":{\"keccak256\":\"0xbace3785343657020bee8dc579fec3a7f18741e5ddfaea001903f7ed087c5b8a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://df02a2fa496a45ceecd157bfed9d8e093b4ff236d3f83e89453cf0656b5c018d\",\"dweb:/ipfs/QmarCnWB7CNimfnNr51p2QBzdwpqbRAkgQncnA2c8kz7KR\"]},\"contracts/src/diamond/utils/Nonces.sol\":{\"keccak256\":\"0xce0cce96c8f30e4052523e2c67c7b08ed9defa8c2e3858d4534b359be9ee9ee3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://caae09675d571304907f51e64c255981c5fbfbd60bf26d0117c00ecd7ed7a7fb\",\"dweb:/ipfs/QmPNReTvJDZ242duATLyDDt1JUUd2ACg472E1vftw5zgXB\"]},\"contracts/src/diamond/utils/cryptography/EIP712.sol\":{\"keccak256\":\"0x4bc6ac914b47d64b899510e901545369b2b1c292fb392500c3fcc09bb13fbf21\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e7bd2f9bf25d82ff5f45c8075254dba48bcff67b1d6f1b5ab91d1b17a1d9f624\",\"dweb:/ipfs/QmegqbdjZy6DfKNzZHQ1rGJ67w4SaXUz6w3ZL8mrWkwQ5d\"]},\"contracts/src/diamond/utils/cryptography/IERC5267.sol\":{\"keccak256\":\"0x1369ee10d9df0a2700fdf659db717f7c6beae8b2e7173212ec4ed70909f86d50\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f43717adb31aaac44770deac2c689bc45472b9f752614ae32c9efe2013b2d42f\",\"dweb:/ipfs/Qmba5h3jR9Lenn5LRFwxfeEEiZMHqp8wnbX4FTfTtMxqHt\"]},\"contracts/src/spaces/facets/guardian/GuardianBase.sol\":{\"keccak256\":\"0x380bbefb6d29266ce37efcc247b355a714485e21e2c3a6789f81226c36d8ac41\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7c9512890c4dd3dddc10ac94bdd747c4e49d6e9eb6ebf808eb017eda1733221a\",\"dweb:/ipfs/QmWwocwLuRiKzqJoNdLPmxpEH34H2sBfMTH7iU4aFkW8Kj\"]},\"contracts/src/spaces/facets/guardian/GuardianStorage.sol\":{\"keccak256\":\"0xd8af0e2ff9c26165cd30e16eb881b2a58acff8f7f61bfac1b90dc6362f14dd63\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e06464b1498f896ad0c62ca19aed21f7667e36ebd0f77cb1831e0a60fb373688\",\"dweb:/ipfs/QmTFenitEo2y4UE3F4qtX1DfoBoEMs1pmtL1AmoeohTpw8\"]},\"contracts/src/spaces/facets/guardian/IGuardian.sol\":{\"keccak256\":\"0x9898180a058f5d922141026a1266008c9d7883a9863549ab76d8218123be6c19\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3481a5ced56b71d2b5e8bbc6bce46d80eb8161fb9195fb232272a442d015323b\",\"dweb:/ipfs/QmV6LvhxezH6PJw1gfV7DgAyHUpGd2GN56w6G9n83vGxa3\"]},\"contracts/src/spaces/facets/owner/ISpaceOwner.sol\":{\"keccak256\":\"0xf68eb1b3aceeacc0c4162304f74d89890e8c641a9c0778c1786db850a79cfb3f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8a345161f4d34be281c5f4d165dac958ed3a5e7d2888924d498555871906e6ea\",\"dweb:/ipfs/QmQcWfQ6k54UPr9eMA2KnXCJAc4NR24LhzbmyA5NUKBVN3\"]},\"contracts/src/spaces/facets/owner/SpaceOwner.sol\":{\"keccak256\":\"0x8a644478b3bcfb18fda9c887838d710e59c7c5a2ed7003dcda5ab479f2fefe9c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://640e9b7eebba29735acc6b96ebe107a58db8af60ffb84c1b580a1b7e041e9393\",\"dweb:/ipfs/QmVeuTQ87BVjzZc7FaVwrbz82PVCWkXNjz1sYBzeYRi3h7\"]},\"contracts/src/spaces/facets/owner/SpaceOwnerBase.sol\":{\"keccak256\":\"0xd4eda8665f05e74b37a99b21157baa102660d9143e6b45cc6800bbf795299ad2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://74c3e6034a8f74c315d6790c423b1083c8a9a468f76e3d9b93e86afc8143e7c1\",\"dweb:/ipfs/QmcZ8TV2rAmwQx2aRSvhRQmcevZYCWWxD4KUnyYteN2Qax\"]},\"contracts/src/spaces/facets/owner/SpaceOwnerStorage.sol\":{\"keccak256\":\"0xae80a53a918d9bd4b064aaeac74a8697a12f669e815f2fbd00385d3b82f39026\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://497ae2aeb902efd34779b277320544f2c194889b2df926614e19f3cbfc1e787f\",\"dweb:/ipfs/QmPNLznGfzdidEhCokiEFppJa6faPNNnFGt1Y43X3qrs6B\"]},\"contracts/src/spaces/facets/owner/SpaceOwnerUriBase.sol\":{\"keccak256\":\"0xf24d932787ab9862d27eba5d8b687644a95319aaa33141cc76f167f38d2bebf4\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8abc2878482017106e2cde6fa036ce74b8e8c434ea6ebc1915b2bbade66cfcde\",\"dweb:/ipfs/QmXEzY6CXnLZndoM6i27ewqCseR2sdArjCjyZXvg5y1TZy\"]},\"contracts/src/utils/Validator.sol\":{\"keccak256\":\"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64\",\"dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453\",\"dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i\"]},\"lib/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c\",\"dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF\"]},\"lib/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\":{\"keccak256\":\"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c\",\"dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875\",\"dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L\"]},\"lib/@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0xe19a4d5f31d2861e7344e8e535e2feafb913d806d3e2b5fe7782741a2a7094fe\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4aed79c0fa6f0546ed02f2f683e8f77f0fd2ed7eb34d8bbf3d373c9a6d95b13c\",\"dweb:/ipfs/QmWqVz6UAVqmnWU5pqYPt1o6iDEZyPaBraAA3rKfTTSfYj\"]},\"lib/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc\",\"dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT\"]},\"lib/base64/base64.sol\":{\"keccak256\":\"0xa73959e6ef0b693e4423a562e612370160b934a75e618361ddd8c9c4b8ddbaaf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://17c12e16d8d66f3af15d8787920bd41ca6c1e7517a212a6b9cebd4b6d38f36fe\",\"dweb:/ipfs/QmcXMnZUXEz6LRKsm3CSvqdPboAzmezavi8bTg2dRxM2yE\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"AlreadyDisabled"},{"inputs":[],"type":"error","name":"AlreadyEnabled"},{"inputs":[],"type":"error","name":"ApprovalCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"ApprovalQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"BalanceQueryForZeroAddress"},{"inputs":[],"type":"error","name":"ECDSAInvalidSignature"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"ECDSAInvalidSignatureLength"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"type":"error","name":"ECDSAInvalidSignatureS"},{"inputs":[],"type":"error","name":"GuardianEnabled"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32"}],"type":"error","name":"Initializable_AlreadyInitialized"},{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"currentNonce","type":"uint256"}],"type":"error","name":"InvalidAccountNonce"},{"inputs":[],"type":"error","name":"MintERC2309QuantityExceedsLimit"},{"inputs":[],"type":"error","name":"MintToZeroAddress"},{"inputs":[],"type":"error","name":"MintZeroQuantity"},{"inputs":[],"type":"error","name":"NotExternalAccount"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[],"type":"error","name":"OwnerQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"OwnershipNotInitializedForExtraData"},{"inputs":[{"internalType":"uint8","name":"bits","type":"uint8"},{"internalType":"uint256","name":"value","type":"uint256"}],"type":"error","name":"SafeCastOverflowedUintDowncast"},{"inputs":[],"type":"error","name":"SpaceOwner__OnlyFactoryAllowed"},{"inputs":[],"type":"error","name":"SpaceOwner__OnlySpaceOwnerAllowed"},{"inputs":[],"type":"error","name":"TransferCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"TransferFromIncorrectOwner"},{"inputs":[],"type":"error","name":"TransferToNonERC721ReceiverImplementer"},{"inputs":[],"type":"error","name":"TransferToZeroAddress"},{"inputs":[],"type":"error","name":"URIQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"Validator__InvalidAddress"},{"inputs":[],"type":"error","name":"Validator__InvalidStringLength"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"approved","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bool","name":"approved","type":"bool","indexed":false}],"type":"event","name":"ApprovalForAll","anonymous":false},{"inputs":[{"internalType":"uint256","name":"fromTokenId","type":"uint256","indexed":true},{"internalType":"uint256","name":"toTokenId","type":"uint256","indexed":false},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true}],"type":"event","name":"ConsecutiveTransfer","anonymous":false},{"inputs":[{"internalType":"address","name":"delegator","type":"address","indexed":true},{"internalType":"address","name":"fromDelegate","type":"address","indexed":true},{"internalType":"address","name":"toDelegate","type":"address","indexed":true}],"type":"event","name":"DelegateChanged","anonymous":false},{"inputs":[{"internalType":"address","name":"delegate","type":"address","indexed":true},{"internalType":"uint256","name":"previousBalance","type":"uint256","indexed":false},{"internalType":"uint256","name":"newBalance","type":"uint256","indexed":false}],"type":"event","name":"DelegateVotesChanged","anonymous":false},{"inputs":[],"type":"event","name":"EIP712DomainChanged","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"bool","name":"enabled","type":"bool","indexed":true},{"internalType":"uint256","name":"cooldown","type":"uint256","indexed":false},{"internalType":"uint256","name":"timestamp","type":"uint256","indexed":false}],"type":"event","name":"GuardianUpdated","anonymous":false},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"factory","type":"address","indexed":false}],"type":"event","name":"SpaceOwner__SetFactory","anonymous":false},{"inputs":[{"internalType":"address","name":"space","type":"address","indexed":true}],"type":"event","name":"SpaceOwner__UpdateSpace","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"CLOCK_MODE","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"result","type":"bytes32"}]},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"__ERC721A_init"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"version","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"__SpaceOwner_init"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"approve"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function","name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"clock","outputs":[{"internalType":"uint48","name":"","type":"uint48"}]},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"delegate"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"delegateBySig"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getFactory","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"timepoint","type":"uint256"}],"stateMutability":"view","type":"function","name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"timepoint","type":"uint256"}],"stateMutability":"view","type":"function","name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"space","type":"address"}],"stateMutability":"view","type":"function","name":"getSpaceInfo","outputs":[{"internalType":"struct ISpaceOwnerBase.Space","name":"","type":"tuple","components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"createdAt","type":"uint256"}]}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"address","name":"space","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"mintSpace","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"nextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function","name":"nonces","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setApprovalForAll"},{"inputs":[{"internalType":"address","name":"factory","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setFactory"},{"inputs":[],"stateMutability":"view","type":"function","name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"transferFrom"},{"inputs":[{"internalType":"address","name":"space","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"updateSpaceInfo"}],"devdoc":{"kind":"dev","methods":{"CLOCK_MODE()":{"details":"Description of the clock"},"approve(address,uint256)":{"details":"Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator."},"balanceOf(address)":{"details":"Returns the number of tokens in `owner`'s account."},"clock()":{"details":"Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting)."},"delegate(address)":{"details":"Delegates votes from the sender to `delegatee`."},"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Delegates votes from signer to `delegatee`."},"delegates(address)":{"details":"Returns the delegate that `account` has chosen."},"eip712Domain()":{"details":"See {EIP-5267}. _Available since v4.9._"},"getApproved(uint256)":{"details":"Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist."},"getPastTotalSupply(uint256)":{"details":"Returns the total supply of votes available at a specific moment in the past. If the `clock()` is configured to use block numbers, this will return the value at the end of the corresponding block. NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. Votes that have not been delegated are still part of total supply, even though they would not participate in a vote."},"getPastVotes(address,uint256)":{"details":"Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is configured to use block numbers, this will return the value at the end of the corresponding block."},"getSpaceInfo(address)":{"params":{"space":"The address of the space"},"returns":{"_0":"space The space info"}},"getVotes(address)":{"details":"Returns the current amount of votes that `account` has."},"isApprovedForAll(address,address)":{"details":"Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}."},"mintSpace(string,string,address)":{"details":"Only the factory is allowed to mint spaces","params":{"name":"The name of the space","space":"The address of the space","uri":"The URI of the space"},"returns":{"tokenId":"The token id of the minted space"}},"name()":{"details":"Returns the token collection name."},"ownerOf(uint256)":{"details":"Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist."},"safeTransferFrom(address,address,uint256)":{"details":"Equivalent to `safeTransferFrom(from, to, tokenId, '')`."},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event."},"setApprovalForAll(address,bool)":{"details":"Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event."},"symbol()":{"details":"Returns the token collection symbol."},"tokenURI(uint256)":{"details":"Returns the Uniform Resource Identifier (URI) for `tokenId` token."},"totalSupply()":{"details":"Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}."},"transferFrom(address,address,uint256)":{"details":"Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event."},"updateSpaceInfo(address,string,string)":{"details":"Only the space owner is allowed to update the space info","params":{"name":"The name of the space","space":"The address of the space","uri":"The URI of the space"}}},"version":1},"userdoc":{"kind":"user","methods":{"getFactory()":{"notice":"Get the factory address"},"getSpaceInfo(address)":{"notice":"Get the space info"},"mintSpace(string,string,address)":{"notice":"Mint a space"},"nextTokenId()":{"notice":"Get the next token id that will be used to mint a space"},"setFactory(address)":{"notice":"Set the factory address that is allowed to mint spaces"},"updateSpaceInfo(address,string,string)":{"notice":"Update the space info"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/facets/owner/SpaceOwner.sol":"SpaceOwner"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/governance/votes/Checkpoints.sol":{"keccak256":"0x4b98db2e67e47ec59caa78fade51e9ec6fa33ee2592e46fed09d9167ebe76c8a","urls":["bzz-raw://72ec6949ee33fb9c137bba362b94af699762fadd66334128d1dd0dbcd4301bc6","dweb:/ipfs/QmQybe6k5K3gss4zzCPqoba6ZBZE5p8KJRoQ2RzkE91JRV"],"license":"MIT"},"contracts/src/diamond/facets/governance/votes/IERC5805.sol":{"keccak256":"0x8b3b84026610f99bcac6139359305a46c537edf377e44771b904c2bd35719ee3","urls":["bzz-raw://49a8e7af9b47b6bbd794ccb50380b8f9e9b84561d62bcbf16843dde55bab86e6","dweb:/ipfs/QmdBdYxvhwCwtqW9DfPa6Bw5PrYdzhuKQyJv4vcLsttqrV"],"license":"MIT"},"contracts/src/diamond/facets/governance/votes/IERC6372.sol":{"keccak256":"0xc3fa5c25bdd3db6126e04897496889e68a65749b050ae8fede0ff80e322aca86","urls":["bzz-raw://bcf56ae1474c9a3032f8b15b1bbbeeb50ac21c574047f846673d4aca9bf82db4","dweb:/ipfs/Qmcce1zD6TBWiMLXMDsFF6bUrwtVtharjwvAbtkMmoYRgd"],"license":"MIT"},"contracts/src/diamond/facets/governance/votes/IVotes.sol":{"keccak256":"0xe84a920ea7070bafd35afb05c057801a466ba5d9a0db10be3e31720a1db1f2e6","urls":["bzz-raw://72415e259038afac01a7e76dd74d31243518514e58fe01fd7a6a38f93dd8247b","dweb:/ipfs/QmdS8GkX9Ze4rHp2JQ8Va1DMWHaqxQLCjGD8hVVR5KyMVS"],"license":"Apache-2.0"},"contracts/src/diamond/facets/governance/votes/Votes.sol":{"keccak256":"0x36ca9d8aa95a21f2812aa1f2a3712d4acecd78476d8e50900566cc233a54eefa","urls":["bzz-raw://0d910d09517696658fe1cb4291fca5f66cc0b7fd4605f2a4ad70f9c7c494206c","dweb:/ipfs/QmVrcYUZPgbxfQkqXkEdnUFJ81XenXt8hbmDvXBnVyTpDS"],"license":"Apache-2.0"},"contracts/src/diamond/facets/governance/votes/VotesBase.sol":{"keccak256":"0x3234078063b2070a77f1b03e1d96e8c5a958450a70373df02cc0bdb51b69ccb8","urls":["bzz-raw://6d66c3f430cf100ff52dbc614f6982e405996957b60b8de49f6e59bca7dc566f","dweb:/ipfs/QmRKp88BWBr4Pzf4CnW2wWBkERVLMPEnVeZhxizc8tJXBN"],"license":"Apache-2.0"},"contracts/src/diamond/facets/governance/votes/VotesStorage.sol":{"keccak256":"0x2e1a1db6e37ca9a1552edfd2be03d6069e9858996ea1fe0387dd4f35d58455be","urls":["bzz-raw://723c3880d012108f1f442d89f972de200ef9033f1c3179bfa56054740e028fa6","dweb:/ipfs/QmNxcE6H6Db93XzPepQ2xdPrgZkusCrV9LEq9rPvSPq3UT"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableBase.sol":{"keccak256":"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762","urls":["bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4","dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableStorage.sol":{"keccak256":"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64","urls":["bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105","dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721A.sol":{"keccak256":"0xc8fab662d9a0c4e697c8dcaad72dd2a190331b01476649a742b6f317266ac5a1","urls":["bzz-raw://9c84047a6d47a901f45f90f12f713432289ae6d88fea95a383900906005cf70b","dweb:/ipfs/QmVdLUVdtjTQn2fCG85Uv2ZAzCSfNbWYcAg5eXthunnigc"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol":{"keccak256":"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334","urls":["bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa","dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol":{"keccak256":"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1","urls":["bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c","dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9","urls":["bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e","dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM"],"license":"Apache-2.0"},"contracts/src/diamond/utils/Context.sol":{"keccak256":"0xbace3785343657020bee8dc579fec3a7f18741e5ddfaea001903f7ed087c5b8a","urls":["bzz-raw://df02a2fa496a45ceecd157bfed9d8e093b4ff236d3f83e89453cf0656b5c018d","dweb:/ipfs/QmarCnWB7CNimfnNr51p2QBzdwpqbRAkgQncnA2c8kz7KR"],"license":"Apache-2.0"},"contracts/src/diamond/utils/Nonces.sol":{"keccak256":"0xce0cce96c8f30e4052523e2c67c7b08ed9defa8c2e3858d4534b359be9ee9ee3","urls":["bzz-raw://caae09675d571304907f51e64c255981c5fbfbd60bf26d0117c00ecd7ed7a7fb","dweb:/ipfs/QmPNReTvJDZ242duATLyDDt1JUUd2ACg472E1vftw5zgXB"],"license":"Apache-2.0"},"contracts/src/diamond/utils/cryptography/EIP712.sol":{"keccak256":"0x4bc6ac914b47d64b899510e901545369b2b1c292fb392500c3fcc09bb13fbf21","urls":["bzz-raw://e7bd2f9bf25d82ff5f45c8075254dba48bcff67b1d6f1b5ab91d1b17a1d9f624","dweb:/ipfs/QmegqbdjZy6DfKNzZHQ1rGJ67w4SaXUz6w3ZL8mrWkwQ5d"],"license":"Apache-2.0"},"contracts/src/diamond/utils/cryptography/IERC5267.sol":{"keccak256":"0x1369ee10d9df0a2700fdf659db717f7c6beae8b2e7173212ec4ed70909f86d50","urls":["bzz-raw://f43717adb31aaac44770deac2c689bc45472b9f752614ae32c9efe2013b2d42f","dweb:/ipfs/Qmba5h3jR9Lenn5LRFwxfeEEiZMHqp8wnbX4FTfTtMxqHt"],"license":"Apache-2.0"},"contracts/src/spaces/facets/guardian/GuardianBase.sol":{"keccak256":"0x380bbefb6d29266ce37efcc247b355a714485e21e2c3a6789f81226c36d8ac41","urls":["bzz-raw://7c9512890c4dd3dddc10ac94bdd747c4e49d6e9eb6ebf808eb017eda1733221a","dweb:/ipfs/QmWwocwLuRiKzqJoNdLPmxpEH34H2sBfMTH7iU4aFkW8Kj"],"license":"Apache-2.0"},"contracts/src/spaces/facets/guardian/GuardianStorage.sol":{"keccak256":"0xd8af0e2ff9c26165cd30e16eb881b2a58acff8f7f61bfac1b90dc6362f14dd63","urls":["bzz-raw://e06464b1498f896ad0c62ca19aed21f7667e36ebd0f77cb1831e0a60fb373688","dweb:/ipfs/QmTFenitEo2y4UE3F4qtX1DfoBoEMs1pmtL1AmoeohTpw8"],"license":"Apache-2.0"},"contracts/src/spaces/facets/guardian/IGuardian.sol":{"keccak256":"0x9898180a058f5d922141026a1266008c9d7883a9863549ab76d8218123be6c19","urls":["bzz-raw://3481a5ced56b71d2b5e8bbc6bce46d80eb8161fb9195fb232272a442d015323b","dweb:/ipfs/QmV6LvhxezH6PJw1gfV7DgAyHUpGd2GN56w6G9n83vGxa3"],"license":"Apache-2.0"},"contracts/src/spaces/facets/owner/ISpaceOwner.sol":{"keccak256":"0xf68eb1b3aceeacc0c4162304f74d89890e8c641a9c0778c1786db850a79cfb3f","urls":["bzz-raw://8a345161f4d34be281c5f4d165dac958ed3a5e7d2888924d498555871906e6ea","dweb:/ipfs/QmQcWfQ6k54UPr9eMA2KnXCJAc4NR24LhzbmyA5NUKBVN3"],"license":"Apache-2.0"},"contracts/src/spaces/facets/owner/SpaceOwner.sol":{"keccak256":"0x8a644478b3bcfb18fda9c887838d710e59c7c5a2ed7003dcda5ab479f2fefe9c","urls":["bzz-raw://640e9b7eebba29735acc6b96ebe107a58db8af60ffb84c1b580a1b7e041e9393","dweb:/ipfs/QmVeuTQ87BVjzZc7FaVwrbz82PVCWkXNjz1sYBzeYRi3h7"],"license":"Apache-2.0"},"contracts/src/spaces/facets/owner/SpaceOwnerBase.sol":{"keccak256":"0xd4eda8665f05e74b37a99b21157baa102660d9143e6b45cc6800bbf795299ad2","urls":["bzz-raw://74c3e6034a8f74c315d6790c423b1083c8a9a468f76e3d9b93e86afc8143e7c1","dweb:/ipfs/QmcZ8TV2rAmwQx2aRSvhRQmcevZYCWWxD4KUnyYteN2Qax"],"license":"Apache-2.0"},"contracts/src/spaces/facets/owner/SpaceOwnerStorage.sol":{"keccak256":"0xae80a53a918d9bd4b064aaeac74a8697a12f669e815f2fbd00385d3b82f39026","urls":["bzz-raw://497ae2aeb902efd34779b277320544f2c194889b2df926614e19f3cbfc1e787f","dweb:/ipfs/QmPNLznGfzdidEhCokiEFppJa6faPNNnFGt1Y43X3qrs6B"],"license":"Apache-2.0"},"contracts/src/spaces/facets/owner/SpaceOwnerUriBase.sol":{"keccak256":"0xf24d932787ab9862d27eba5d8b687644a95319aaa33141cc76f167f38d2bebf4","urls":["bzz-raw://8abc2878482017106e2cde6fa036ce74b8e8c434ea6ebc1915b2bbade66cfcde","dweb:/ipfs/QmXEzY6CXnLZndoM6i27ewqCseR2sdArjCjyZXvg5y1TZy"],"license":"Apache-2.0"},"contracts/src/utils/Validator.sol":{"keccak256":"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50","urls":["bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64","dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf","urls":["bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c","dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435","urls":["bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c","dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/math/SafeCast.sol":{"keccak256":"0xe19a4d5f31d2861e7344e8e535e2feafb913d806d3e2b5fe7782741a2a7094fe","urls":["bzz-raw://4aed79c0fa6f0546ed02f2f683e8f77f0fd2ed7eb34d8bbf3d373c9a6d95b13c","dweb:/ipfs/QmWqVz6UAVqmnWU5pqYPt1o6iDEZyPaBraAA3rKfTTSfYj"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"],"license":"MIT"},"lib/base64/base64.sol":{"keccak256":"0xa73959e6ef0b693e4423a562e612370160b934a75e618361ddd8c9c4b8ddbaaf","urls":["bzz-raw://17c12e16d8d66f3af15d8787920bd41ca6c1e7517a212a6b9cebd4b6d38f36fe","dweb:/ipfs/QmcXMnZUXEz6LRKsm3CSvqdPboAzmezavi8bTg2dRxM2yE"],"license":"MIT"}},"version":1},"id":235} \ No newline at end of file diff --git a/packages/generated/dev/abis/SpaceOwner.metadata.json b/packages/generated/dev/abis/SpaceOwner.metadata.json new file mode 100644 index 000000000..58fa4ddc4 --- /dev/null +++ b/packages/generated/dev/abis/SpaceOwner.metadata.json @@ -0,0 +1,1629 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "AlreadyDisabled" + }, + { + "inputs": [], + "type": "error", + "name": "AlreadyEnabled" + }, + { + "inputs": [], + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "ApprovalQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "BalanceQueryForZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "ECDSAInvalidSignature" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "type": "error", + "name": "ECDSAInvalidSignatureLength" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "type": "error", + "name": "ECDSAInvalidSignatureS" + }, + { + "inputs": [], + "type": "error", + "name": "GuardianEnabled" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32" + } + ], + "type": "error", + "name": "Initializable_AlreadyInitialized" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "currentNonce", + "type": "uint256" + } + ], + "type": "error", + "name": "InvalidAccountNonce" + }, + { + "inputs": [], + "type": "error", + "name": "MintERC2309QuantityExceedsLimit" + }, + { + "inputs": [], + "type": "error", + "name": "MintToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "MintZeroQuantity" + }, + { + "inputs": [], + "type": "error", + "name": "NotExternalAccount" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "OwnerQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "OwnershipNotInitializedForExtraData" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "bits", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "type": "error", + "name": "SafeCastOverflowedUintDowncast" + }, + { + "inputs": [], + "type": "error", + "name": "SpaceOwner__OnlyFactoryAllowed" + }, + { + "inputs": [], + "type": "error", + "name": "SpaceOwner__OnlySpaceOwnerAllowed" + }, + { + "inputs": [], + "type": "error", + "name": "TransferCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "TransferFromIncorrectOwner" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "URIQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "Validator__InvalidAddress" + }, + { + "inputs": [], + "type": "error", + "name": "Validator__InvalidStringLength" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "approved", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Approval", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "operator", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ApprovalForAll", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fromTokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint256", + "name": "toTokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConsecutiveTransfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegator", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "fromDelegate", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "toDelegate", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "DelegateChanged", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegate", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "previousBalance", + "type": "uint256", + "indexed": false + }, + { + "internalType": "uint256", + "name": "newBalance", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "DelegateVotesChanged", + "anonymous": false + }, + { + "inputs": [], + "type": "event", + "name": "EIP712DomainChanged", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "enabled", + "type": "bool", + "indexed": true + }, + { + "internalType": "uint256", + "name": "cooldown", + "type": "uint256", + "indexed": false + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "GuardianUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "factory", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "SpaceOwner__SetFactory", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "space", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "SpaceOwner__UpdateSpace", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Transfer", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "CLOCK_MODE", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "result", + "type": "bytes32" + } + ] + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name_", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol_", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__ERC721A_init" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__SpaceOwner_init" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "approve" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "clock", + "outputs": [ + { + "internalType": "uint48", + "name": "", + "type": "uint48" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatee", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "delegate" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatee", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "delegateBySig" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "delegates", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getFactory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getPastTotalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getPastVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "space", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getSpaceInfo", + "outputs": [ + { + "internalType": "struct ISpaceOwnerBase.Space", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "uri", + "type": "string" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "uri", + "type": "string" + }, + { + "internalType": "address", + "name": "space", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "mintSpace", + "outputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "nextTokenId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "safeTransferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "safeTransferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setApprovalForAll" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "factory", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setFactory" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "transferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "space", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "uri", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "updateSpaceInfo" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "CLOCK_MODE()": { + "details": "Description of the clock" + }, + "approve(address,uint256)": { + "details": "Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator." + }, + "balanceOf(address)": { + "details": "Returns the number of tokens in `owner`'s account." + }, + "clock()": { + "details": "Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting)." + }, + "delegate(address)": { + "details": "Delegates votes from the sender to `delegatee`." + }, + "delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)": { + "details": "Delegates votes from signer to `delegatee`." + }, + "delegates(address)": { + "details": "Returns the delegate that `account` has chosen." + }, + "eip712Domain()": { + "details": "See {EIP-5267}. _Available since v4.9._" + }, + "getApproved(uint256)": { + "details": "Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist." + }, + "getPastTotalSupply(uint256)": { + "details": "Returns the total supply of votes available at a specific moment in the past. If the `clock()` is configured to use block numbers, this will return the value at the end of the corresponding block. NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. Votes that have not been delegated are still part of total supply, even though they would not participate in a vote." + }, + "getPastVotes(address,uint256)": { + "details": "Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is configured to use block numbers, this will return the value at the end of the corresponding block." + }, + "getSpaceInfo(address)": { + "params": { + "space": "The address of the space" + }, + "returns": { + "_0": "space The space info" + } + }, + "getVotes(address)": { + "details": "Returns the current amount of votes that `account` has." + }, + "isApprovedForAll(address,address)": { + "details": "Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}." + }, + "mintSpace(string,string,address)": { + "details": "Only the factory is allowed to mint spaces", + "params": { + "name": "The name of the space", + "space": "The address of the space", + "uri": "The URI of the space" + }, + "returns": { + "tokenId": "The token id of the minted space" + } + }, + "name()": { + "details": "Returns the token collection name." + }, + "ownerOf(uint256)": { + "details": "Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist." + }, + "safeTransferFrom(address,address,uint256)": { + "details": "Equivalent to `safeTransferFrom(from, to, tokenId, '')`." + }, + "safeTransferFrom(address,address,uint256,bytes)": { + "details": "Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event." + }, + "setApprovalForAll(address,bool)": { + "details": "Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event." + }, + "symbol()": { + "details": "Returns the token collection symbol." + }, + "tokenURI(uint256)": { + "details": "Returns the Uniform Resource Identifier (URI) for `tokenId` token." + }, + "totalSupply()": { + "details": "Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}." + }, + "transferFrom(address,address,uint256)": { + "details": "Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event." + }, + "updateSpaceInfo(address,string,string)": { + "details": "Only the space owner is allowed to update the space info", + "params": { + "name": "The name of the space", + "space": "The address of the space", + "uri": "The URI of the space" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getFactory()": { + "notice": "Get the factory address" + }, + "getSpaceInfo(address)": { + "notice": "Get the space info" + }, + "mintSpace(string,string,address)": { + "notice": "Mint a space" + }, + "nextTokenId()": { + "notice": "Get the next token id that will be used to mint a space" + }, + "setFactory(address)": { + "notice": "Set the factory address that is allowed to mint spaces" + }, + "updateSpaceInfo(address,string,string)": { + "notice": "Update the space info" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/facets/owner/SpaceOwner.sol": "SpaceOwner" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/governance/votes/Checkpoints.sol": { + "keccak256": "0x4b98db2e67e47ec59caa78fade51e9ec6fa33ee2592e46fed09d9167ebe76c8a", + "urls": [ + "bzz-raw://72ec6949ee33fb9c137bba362b94af699762fadd66334128d1dd0dbcd4301bc6", + "dweb:/ipfs/QmQybe6k5K3gss4zzCPqoba6ZBZE5p8KJRoQ2RzkE91JRV" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/governance/votes/IERC5805.sol": { + "keccak256": "0x8b3b84026610f99bcac6139359305a46c537edf377e44771b904c2bd35719ee3", + "urls": [ + "bzz-raw://49a8e7af9b47b6bbd794ccb50380b8f9e9b84561d62bcbf16843dde55bab86e6", + "dweb:/ipfs/QmdBdYxvhwCwtqW9DfPa6Bw5PrYdzhuKQyJv4vcLsttqrV" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/governance/votes/IERC6372.sol": { + "keccak256": "0xc3fa5c25bdd3db6126e04897496889e68a65749b050ae8fede0ff80e322aca86", + "urls": [ + "bzz-raw://bcf56ae1474c9a3032f8b15b1bbbeeb50ac21c574047f846673d4aca9bf82db4", + "dweb:/ipfs/Qmcce1zD6TBWiMLXMDsFF6bUrwtVtharjwvAbtkMmoYRgd" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/governance/votes/IVotes.sol": { + "keccak256": "0xe84a920ea7070bafd35afb05c057801a466ba5d9a0db10be3e31720a1db1f2e6", + "urls": [ + "bzz-raw://72415e259038afac01a7e76dd74d31243518514e58fe01fd7a6a38f93dd8247b", + "dweb:/ipfs/QmdS8GkX9Ze4rHp2JQ8Va1DMWHaqxQLCjGD8hVVR5KyMVS" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/governance/votes/Votes.sol": { + "keccak256": "0x36ca9d8aa95a21f2812aa1f2a3712d4acecd78476d8e50900566cc233a54eefa", + "urls": [ + "bzz-raw://0d910d09517696658fe1cb4291fca5f66cc0b7fd4605f2a4ad70f9c7c494206c", + "dweb:/ipfs/QmVrcYUZPgbxfQkqXkEdnUFJ81XenXt8hbmDvXBnVyTpDS" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/governance/votes/VotesBase.sol": { + "keccak256": "0x3234078063b2070a77f1b03e1d96e8c5a958450a70373df02cc0bdb51b69ccb8", + "urls": [ + "bzz-raw://6d66c3f430cf100ff52dbc614f6982e405996957b60b8de49f6e59bca7dc566f", + "dweb:/ipfs/QmRKp88BWBr4Pzf4CnW2wWBkERVLMPEnVeZhxizc8tJXBN" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/governance/votes/VotesStorage.sol": { + "keccak256": "0x2e1a1db6e37ca9a1552edfd2be03d6069e9858996ea1fe0387dd4f35d58455be", + "urls": [ + "bzz-raw://723c3880d012108f1f442d89f972de200ef9033f1c3179bfa56054740e028fa6", + "dweb:/ipfs/QmNxcE6H6Db93XzPepQ2xdPrgZkusCrV9LEq9rPvSPq3UT" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableBase.sol": { + "keccak256": "0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762", + "urls": [ + "bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4", + "dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableStorage.sol": { + "keccak256": "0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64", + "urls": [ + "bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105", + "dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721A.sol": { + "keccak256": "0xc8fab662d9a0c4e697c8dcaad72dd2a190331b01476649a742b6f317266ac5a1", + "urls": [ + "bzz-raw://9c84047a6d47a901f45f90f12f713432289ae6d88fea95a383900906005cf70b", + "dweb:/ipfs/QmVdLUVdtjTQn2fCG85Uv2ZAzCSfNbWYcAg5eXthunnigc" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol": { + "keccak256": "0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334", + "urls": [ + "bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa", + "dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol": { + "keccak256": "0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1", + "urls": [ + "bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c", + "dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/IERC721A.sol": { + "keccak256": "0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9", + "urls": [ + "bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e", + "dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/utils/Context.sol": { + "keccak256": "0xbace3785343657020bee8dc579fec3a7f18741e5ddfaea001903f7ed087c5b8a", + "urls": [ + "bzz-raw://df02a2fa496a45ceecd157bfed9d8e093b4ff236d3f83e89453cf0656b5c018d", + "dweb:/ipfs/QmarCnWB7CNimfnNr51p2QBzdwpqbRAkgQncnA2c8kz7KR" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/utils/Nonces.sol": { + "keccak256": "0xce0cce96c8f30e4052523e2c67c7b08ed9defa8c2e3858d4534b359be9ee9ee3", + "urls": [ + "bzz-raw://caae09675d571304907f51e64c255981c5fbfbd60bf26d0117c00ecd7ed7a7fb", + "dweb:/ipfs/QmPNReTvJDZ242duATLyDDt1JUUd2ACg472E1vftw5zgXB" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/utils/cryptography/EIP712.sol": { + "keccak256": "0x4bc6ac914b47d64b899510e901545369b2b1c292fb392500c3fcc09bb13fbf21", + "urls": [ + "bzz-raw://e7bd2f9bf25d82ff5f45c8075254dba48bcff67b1d6f1b5ab91d1b17a1d9f624", + "dweb:/ipfs/QmegqbdjZy6DfKNzZHQ1rGJ67w4SaXUz6w3ZL8mrWkwQ5d" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/utils/cryptography/IERC5267.sol": { + "keccak256": "0x1369ee10d9df0a2700fdf659db717f7c6beae8b2e7173212ec4ed70909f86d50", + "urls": [ + "bzz-raw://f43717adb31aaac44770deac2c689bc45472b9f752614ae32c9efe2013b2d42f", + "dweb:/ipfs/Qmba5h3jR9Lenn5LRFwxfeEEiZMHqp8wnbX4FTfTtMxqHt" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/guardian/GuardianBase.sol": { + "keccak256": "0x380bbefb6d29266ce37efcc247b355a714485e21e2c3a6789f81226c36d8ac41", + "urls": [ + "bzz-raw://7c9512890c4dd3dddc10ac94bdd747c4e49d6e9eb6ebf808eb017eda1733221a", + "dweb:/ipfs/QmWwocwLuRiKzqJoNdLPmxpEH34H2sBfMTH7iU4aFkW8Kj" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/guardian/GuardianStorage.sol": { + "keccak256": "0xd8af0e2ff9c26165cd30e16eb881b2a58acff8f7f61bfac1b90dc6362f14dd63", + "urls": [ + "bzz-raw://e06464b1498f896ad0c62ca19aed21f7667e36ebd0f77cb1831e0a60fb373688", + "dweb:/ipfs/QmTFenitEo2y4UE3F4qtX1DfoBoEMs1pmtL1AmoeohTpw8" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/guardian/IGuardian.sol": { + "keccak256": "0x9898180a058f5d922141026a1266008c9d7883a9863549ab76d8218123be6c19", + "urls": [ + "bzz-raw://3481a5ced56b71d2b5e8bbc6bce46d80eb8161fb9195fb232272a442d015323b", + "dweb:/ipfs/QmV6LvhxezH6PJw1gfV7DgAyHUpGd2GN56w6G9n83vGxa3" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/owner/ISpaceOwner.sol": { + "keccak256": "0xf68eb1b3aceeacc0c4162304f74d89890e8c641a9c0778c1786db850a79cfb3f", + "urls": [ + "bzz-raw://8a345161f4d34be281c5f4d165dac958ed3a5e7d2888924d498555871906e6ea", + "dweb:/ipfs/QmQcWfQ6k54UPr9eMA2KnXCJAc4NR24LhzbmyA5NUKBVN3" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/owner/SpaceOwner.sol": { + "keccak256": "0x8a644478b3bcfb18fda9c887838d710e59c7c5a2ed7003dcda5ab479f2fefe9c", + "urls": [ + "bzz-raw://640e9b7eebba29735acc6b96ebe107a58db8af60ffb84c1b580a1b7e041e9393", + "dweb:/ipfs/QmVeuTQ87BVjzZc7FaVwrbz82PVCWkXNjz1sYBzeYRi3h7" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/owner/SpaceOwnerBase.sol": { + "keccak256": "0xd4eda8665f05e74b37a99b21157baa102660d9143e6b45cc6800bbf795299ad2", + "urls": [ + "bzz-raw://74c3e6034a8f74c315d6790c423b1083c8a9a468f76e3d9b93e86afc8143e7c1", + "dweb:/ipfs/QmcZ8TV2rAmwQx2aRSvhRQmcevZYCWWxD4KUnyYteN2Qax" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/owner/SpaceOwnerStorage.sol": { + "keccak256": "0xae80a53a918d9bd4b064aaeac74a8697a12f669e815f2fbd00385d3b82f39026", + "urls": [ + "bzz-raw://497ae2aeb902efd34779b277320544f2c194889b2df926614e19f3cbfc1e787f", + "dweb:/ipfs/QmPNLznGfzdidEhCokiEFppJa6faPNNnFGt1Y43X3qrs6B" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/owner/SpaceOwnerUriBase.sol": { + "keccak256": "0xf24d932787ab9862d27eba5d8b687644a95319aaa33141cc76f167f38d2bebf4", + "urls": [ + "bzz-raw://8abc2878482017106e2cde6fa036ce74b8e8c434ea6ebc1915b2bbade66cfcde", + "dweb:/ipfs/QmXEzY6CXnLZndoM6i27ewqCseR2sdArjCjyZXvg5y1TZy" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/Validator.sol": { + "keccak256": "0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50", + "urls": [ + "bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64", + "dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Strings.sol": { + "keccak256": "0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792", + "urls": [ + "bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453", + "dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "keccak256": "0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf", + "urls": [ + "bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c", + "dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol": { + "keccak256": "0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435", + "urls": [ + "bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c", + "dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/math/Math.sol": { + "keccak256": "0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d", + "urls": [ + "bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875", + "dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/math/SafeCast.sol": { + "keccak256": "0xe19a4d5f31d2861e7344e8e535e2feafb913d806d3e2b5fe7782741a2a7094fe", + "urls": [ + "bzz-raw://4aed79c0fa6f0546ed02f2f683e8f77f0fd2ed7eb34d8bbf3d373c9a6d95b13c", + "dweb:/ipfs/QmWqVz6UAVqmnWU5pqYPt1o6iDEZyPaBraAA3rKfTTSfYj" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/math/SignedMath.sol": { + "keccak256": "0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72", + "urls": [ + "bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc", + "dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT" + ], + "license": "MIT" + }, + "lib/base64/base64.sol": { + "keccak256": "0xa73959e6ef0b693e4423a562e612370160b934a75e618361ddd8c9c4b8ddbaaf", + "urls": [ + "bzz-raw://17c12e16d8d66f3af15d8787920bd41ca6c1e7517a212a6b9cebd4b6d38f36fe", + "dweb:/ipfs/QmcXMnZUXEz6LRKsm3CSvqdPboAzmezavi8bTg2dRxM2yE" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/StreamFlags.abi.json b/packages/generated/dev/abis/StreamFlags.abi.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/packages/generated/dev/abis/StreamFlags.abi.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/packages/generated/dev/abis/StreamFlags.abi.ts b/packages/generated/dev/abis/StreamFlags.abi.ts new file mode 100644 index 000000000..257b9d513 --- /dev/null +++ b/packages/generated/dev/abis/StreamFlags.abi.ts @@ -0,0 +1 @@ +export default [] as const diff --git a/packages/generated/dev/abis/StreamFlags.bin b/packages/generated/dev/abis/StreamFlags.bin new file mode 100644 index 000000000..8957d3281 --- /dev/null +++ b/packages/generated/dev/abis/StreamFlags.bin @@ -0,0 +1 @@ +60206037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fd \ No newline at end of file diff --git a/packages/generated/dev/abis/StreamFlags.json b/packages/generated/dev/abis/StreamFlags.json new file mode 100644 index 000000000..3037d4372 --- /dev/null +++ b/packages/generated/dev/abis/StreamFlags.json @@ -0,0 +1 @@ +{"abi":[],"bytecode":{"object":"0x60206037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fd","sourceMap":"550:53:44:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;550:53:44;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x73000000000000000000000000000000000000000030146080604052600080fd","sourceMap":"550:53:44:-:0;;;;;;;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/river/registry/facets/stream/StreamRegistry.sol\":\"StreamFlags\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/river/registry/facets/stream/IStreamRegistry.sol\":{\"keccak256\":\"0x6065b337e753c34ff06f91172aa92e473fe3e7a74bfea20e30eb79f349a338c5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://db641411b66939873b494e5914cd06955b03bdc278d784675c4e4035027f32a4\",\"dweb:/ipfs/QmRkaPZSa1stxb9XKiD6WKwEZmcaqqYXi8DQzGaZiBtKhd\"]},\"contracts/src/river/registry/facets/stream/StreamRegistry.sol\":{\"keccak256\":\"0xc54bdda2a2add8c10aa260a4921eb7c6e00bedea05370bb1b0b6794dff089d53\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a04f114efbf72b82368386acefd175c426103a3fd4fc06b1098f8aad5b22346e\",\"dweb:/ipfs/QmT8z1QQjYmZjYSFoGAJAoCU7AvZuADDzYfEUBBFXXhydX\"]},\"contracts/src/river/registry/libraries/RegistryErrors.sol\":{\"keccak256\":\"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3\",\"dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy\"]},\"contracts/src/river/registry/libraries/RegistryStorage.sol\":{\"keccak256\":\"0x63c17d46ed41fb58a08d84b2159db6ab7a19a4e1e1e636129b7cdd5f3d83c51c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7633256f01d2ffea41292d8f0b259d6f33a61ef362026d649a3e6955f53eec4c\",\"dweb:/ipfs/QmSYCB6CWCjQMqVeSG7yqy72tr7SkPSRkfzpz6FnK33XqZ\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/river/registry/facets/stream/StreamRegistry.sol":"StreamFlags"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/river/registry/facets/stream/IStreamRegistry.sol":{"keccak256":"0x6065b337e753c34ff06f91172aa92e473fe3e7a74bfea20e30eb79f349a338c5","urls":["bzz-raw://db641411b66939873b494e5914cd06955b03bdc278d784675c4e4035027f32a4","dweb:/ipfs/QmRkaPZSa1stxb9XKiD6WKwEZmcaqqYXi8DQzGaZiBtKhd"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/stream/StreamRegistry.sol":{"keccak256":"0xc54bdda2a2add8c10aa260a4921eb7c6e00bedea05370bb1b0b6794dff089d53","urls":["bzz-raw://a04f114efbf72b82368386acefd175c426103a3fd4fc06b1098f8aad5b22346e","dweb:/ipfs/QmT8z1QQjYmZjYSFoGAJAoCU7AvZuADDzYfEUBBFXXhydX"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryErrors.sol":{"keccak256":"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc","urls":["bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3","dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryStorage.sol":{"keccak256":"0x63c17d46ed41fb58a08d84b2159db6ab7a19a4e1e1e636129b7cdd5f3d83c51c","urls":["bzz-raw://7633256f01d2ffea41292d8f0b259d6f33a61ef362026d649a3e6955f53eec4c","dweb:/ipfs/QmSYCB6CWCjQMqVeSG7yqy72tr7SkPSRkfzpz6FnK33XqZ"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":44} \ No newline at end of file diff --git a/packages/generated/dev/abis/StreamFlags.metadata.json b/packages/generated/dev/abis/StreamFlags.metadata.json new file mode 100644 index 000000000..04906a809 --- /dev/null +++ b/packages/generated/dev/abis/StreamFlags.metadata.json @@ -0,0 +1,87 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/river/registry/facets/stream/StreamRegistry.sol": "StreamFlags" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/river/registry/facets/stream/IStreamRegistry.sol": { + "keccak256": "0x6065b337e753c34ff06f91172aa92e473fe3e7a74bfea20e30eb79f349a338c5", + "urls": [ + "bzz-raw://db641411b66939873b494e5914cd06955b03bdc278d784675c4e4035027f32a4", + "dweb:/ipfs/QmRkaPZSa1stxb9XKiD6WKwEZmcaqqYXi8DQzGaZiBtKhd" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/stream/StreamRegistry.sol": { + "keccak256": "0xc54bdda2a2add8c10aa260a4921eb7c6e00bedea05370bb1b0b6794dff089d53", + "urls": [ + "bzz-raw://a04f114efbf72b82368386acefd175c426103a3fd4fc06b1098f8aad5b22346e", + "dweb:/ipfs/QmT8z1QQjYmZjYSFoGAJAoCU7AvZuADDzYfEUBBFXXhydX" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryErrors.sol": { + "keccak256": "0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc", + "urls": [ + "bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3", + "dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryStorage.sol": { + "keccak256": "0x63c17d46ed41fb58a08d84b2159db6ab7a19a4e1e1e636129b7cdd5f3d83c51c", + "urls": [ + "bzz-raw://7633256f01d2ffea41292d8f0b259d6f33a61ef362026d649a3e6955f53eec4c", + "dweb:/ipfs/QmSYCB6CWCjQMqVeSG7yqy72tr7SkPSRkfzpz6FnK33XqZ" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/StreamRegistry.abi.json b/packages/generated/dev/abis/StreamRegistry.abi.json new file mode 100644 index 000000000..940009b18 --- /dev/null +++ b/packages/generated/dev/abis/StreamRegistry.abi.json @@ -0,0 +1,621 @@ +[ + { + "type": "function", + "name": "allocateStream", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "genesisMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "genesisMiniblock", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getAllStreamIds", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32[]", + "internalType": "bytes32[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllStreams", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPaginatedStreams", + "inputs": [ + { + "name": "start", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "stop", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + }, + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStream", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamByIndex", + "inputs": [ + { + "name": "i", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct StreamWithId", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamWithGenesis", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + }, + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamsOnNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "placeStreamOnNode", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeStreamFromNode", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setStreamLastMiniblock", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setStreamLastMiniblockBatch", + "inputs": [ + { + "name": "miniblocks", + "type": "tuple[]", + "internalType": "struct SetMiniblock[]", + "components": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "prevMiniBlockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "internalType": "bool" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "StreamAllocated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "nodes", + "type": "address[]", + "indexed": false, + "internalType": "address[]" + }, + { + "name": "genesisMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "genesisMiniblock", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamLastMiniblockUpdateFailed", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + }, + { + "name": "reason", + "type": "string", + "indexed": false, + "internalType": "string" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamLastMiniblockUpdated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamPlacementUpdated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "isAdded", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/StreamRegistry.abi.ts b/packages/generated/dev/abis/StreamRegistry.abi.ts new file mode 100644 index 000000000..b1e37fc05 --- /dev/null +++ b/packages/generated/dev/abis/StreamRegistry.abi.ts @@ -0,0 +1,621 @@ +export default [ + { + "type": "function", + "name": "allocateStream", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "genesisMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "genesisMiniblock", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getAllStreamIds", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32[]", + "internalType": "bytes32[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllStreams", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPaginatedStreams", + "inputs": [ + { + "name": "start", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "stop", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + }, + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStream", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamByIndex", + "inputs": [ + { + "name": "i", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct StreamWithId", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamWithGenesis", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + }, + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamsOnNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "placeStreamOnNode", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeStreamFromNode", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setStreamLastMiniblock", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setStreamLastMiniblockBatch", + "inputs": [ + { + "name": "miniblocks", + "type": "tuple[]", + "internalType": "struct SetMiniblock[]", + "components": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "prevMiniBlockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "internalType": "bool" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "StreamAllocated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "nodes", + "type": "address[]", + "indexed": false, + "internalType": "address[]" + }, + { + "name": "genesisMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "genesisMiniblock", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamLastMiniblockUpdateFailed", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + }, + { + "name": "reason", + "type": "string", + "indexed": false, + "internalType": "string" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamLastMiniblockUpdated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamPlacementUpdated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "isAdded", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + } +] as const diff --git a/packages/generated/dev/abis/StreamRegistry.bin b/packages/generated/dev/abis/StreamRegistry.bin new file mode 100644 index 000000000..c92b740c5 --- /dev/null +++ b/packages/generated/dev/abis/StreamRegistry.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b50612139806100206000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806386789fc61161008c578063ca78c41a11610066578063ca78c41a146101ba578063d7a3158a146101db578063ee885b12146101ee578063ff3a14ab1461020157600080fd5b806386789fc61461017c5780639ee86d3814610191578063c0f22084146101a457600080fd5b80631290abe8146100d457806332705ac4146100fd5780633bd84c0c1461011d5780633c2544d11461012557806368b454df146101475780636b883c3914610167575b600080fd5b6100e76100e2366004611918565b610214565b6040516100f491906119c2565b60405180910390f35b61011061010b3660046119f1565b61033f565b6040516100f49190611a8d565b6101106105ef565b610138610133366004611918565b610760565b6040516100f493929190611ae6565b61015a610155366004611918565b610931565b6040516100f49190611b1b565b61017a610175366004611be3565b610a58565b005b610184610cbd565b6040516100f49190611cc6565b61017a61019f366004611d0a565b610cce565b6101ac610e8b565b6040519081526020016100f4565b6101cd6101c8366004611d36565b610e96565b6040516100f4929190611d58565b61017a6101e9366004611da3565b61108f565b61017a6101fc366004611d0a565b61121a565b61017a61020f366004611df3565b611466565b6040805160a081018252600080825260208201819052918101829052606080820183905260808201529061024890836116cd565b61028c5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102839190600401611e67565b60405180910390fd5b600082815260026020818152604092839020835160a0810185528154815260018201546001600160401b0380821683860152600160401b8204811683880152600160801b909104166060820152928101805485518185028101850190965280865293949193608086019383018282801561032f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610311575b5050505050815250509050919050565b6060600061034c816116ea565b6001600160401b0381111561036357610363611b2e565b60405190808252806020026020018201604052801561038c578160200160208202803683370190505b5090506000805b61039d60006116ea565b8110156104525760006103b081836116f4565b60008181526002602052604081209192505b600282015481101561044457876001600160a01b03168260020182815481106103ed576103ed611e7a565b6000918252602090912001546001600160a01b03160361043c5782868661041381611ea6565b975063ffffffff168151811061042b5761042b611e7a565b602002602001018181525050610444565b6001016103c2565b505050806001019050610393565b5060008163ffffffff166001600160401b0381111561047357610473611b2e565b6040519080825280602002602001820160405280156104ac57816020015b610499611817565b8152602001906001900390816104915790505b50905060005b8263ffffffff168110156105e65760405180604001604052808583815181106104dd576104dd611e7a565b602002602001015181526020016000600201600087858151811061050357610503611e7a565b6020908102919091018101518252818101929092526040908101600020815160a0810183528154815260018201546001600160401b0380821683870152600160401b8204811683860152600160801b9091041660608201526002820180548451818702810187019095528085529194929360808601939092908301828280156105b557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610597575b5050505050815250508152508282815181106105d3576105d3611e7a565b60209081029190910101526001016104b2565b50949350505050565b606060006105fc816116ea565b6001600160401b0381111561061357610613611b2e565b60405190808252806020026020018201604052801561064c57816020015b610639611817565b8152602001906001900390816106315790505b50905060005b61065c60006116ea565b81101561075a57600061066f81836116f4565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b909104166060820152918101805486518186028101860190975280875296975093958387019592949193608086019392919083018282801561072857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161070a575b50505050508152505081525083838151811061074657610746611e7a565b602090810291909101015250600101610652565b50919050565b6040805160a08101825260008082526020820181905291810182905260608082018390526080820181905290919061079882856116cd565b6107d35760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102839190600401611e67565b600084815260026020818152604080842060048352818520546003845294829020825160a0810184528254815260018301546001600160401b0380821683880152600160401b8204811683870152600160801b9091041660608201529482018054845181870281018701909552808552929695919491938793608086019391929183018282801561088d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161086f575b50505050508152505092508080546108a490611ec9565b80601f01602080910402602001604051908101604052809291908181526020018280546108d090611ec9565b801561091d5780601f106108f25761010080835404028352916020019161091d565b820191906000526020600020905b81548152906001019060200180831161090057829003601f168201915b505050505090509250925092509193909250565b610939611817565b61094360006116ea565b82106109805760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102839190600401611e67565b600061098c81846116f4565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015610a4557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a27575b5050509190925250505090529392505050565b336000818152600760205260409020600201546001600160a01b0316610ab457604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b610abf6000866116cd565b15610b0057604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526102839190600401611e67565b60005b8451811015610b8457610b3c858281518110610b2157610b21611e7a565b6020026020010151600060050161170090919063ffffffff16565b610b7c57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b600101610b03565b506040805160a081018252848152600060208201819052918101829052606081018290526080810186905290610bba9087611722565b5060008681526002602081815260409283902084518155818501516001820180549587015160608801516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026fffffffffffffffffffffffffffffffff19909916919094161796909617959095161790935560808401518051859493610c4a93908501920190611861565b5050506000868152600360205260409020610c658482611f4e565b5060008681526004602052604090819020859055517f55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb90610cad90889088908890889061200d565b60405180910390a1505050505050565b6060610cc9600061172e565b905090565b81610cda6000826116cd565b610d155760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102839190600401611e67565b6001600160a01b03808316600090815260076020526040902060020154839116610d7557604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b6000848152600260205260408120905b6002820154811015610e0e57846001600160a01b0316826002018281548110610db057610db0611e7a565b6000918252602090912001546001600160a01b031603610e0657604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526102839190600401611e67565b600101610d85565b5060028101805460018082018355600092835260209283902090910180546001600160a01b0319166001600160a01b03881690811790915560408051898152938401919091528201527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f9060600160405180910390a15050505050565b6000610cc9816116ea565b60606000828410604051806040016040528060078152602001664241445f41524760c81b81525090610edb5760405162461bcd60e51b81526004016102839190611e67565b506000610ee88585612080565b6001600160401b03811115610eff57610eff611b2e565b604051908082528060200260200182016040528015610f3857816020015b610f25611817565b815260200190600190039081610f1d5790505b50905060005b610f4860006116ea565b610f528288612093565b108015610f67575084610f658288612093565b105b15611077576000610f83610f7b8389612093565b6000906116f4565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b909104166060820152918101805486518186028101860190975280875296975093958387019592949193608086019392919083018282801561103c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161101e575b50505050508152505081525083838151811061105a5761105a611e7a565b60200260200101819052505080611070906120a6565b9050610f3e565b508061108360006116ea565b90969410159450505050565b336000818152600760205260409020600201546001600160a01b03166110eb57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b6110f66000876116cd565b6111315760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102839190600401611e67565b600086815260026020526040902084815560018101805467ffffffffffffffff19166001600160401b0386161790558215611199576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b836001600160401b03166001036111c15760008781526003602052604081206111c1916118c6565b60408051888152602081018790526001600160401b03861681830152841515606082015290517fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b9181900360800190a150505050505050565b816112266000826116cd565b6112615760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102839190600401611e67565b6001600160a01b038083166000908152600760205260409020600201548391166112c157604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b600084815260026020526040812090805b60028301548110156113db57856001600160a01b03168360020182815481106112fd576112fd611e7a565b6000918252602090912001546001600160a01b0316036113d35760028301805461132990600190612080565b8154811061133957611339611e7a565b6000918252602090912001546002840180546001600160a01b03909216918390811061136757611367611e7a565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550826002018054806113a8576113a86120bf565b600082815260209020810160001990810180546001600160a01b0319169055019055600191506113db565b6001016112d2565b508061141d57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b604080518781526001600160a01b03871660208201526000918101919091527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f90606001610cad565b336000818152600760205260409020600201546001600160a01b03166114c257604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b60005b828110156116c757368484838181106114e0576114e0611e7a565b60a0029190910191506114f79050600082356116cd565b61156f577f75460fe319331413a18a82d99b07735cec53fa0c4061ada38c2141e331082afa8135604083013561153360808501606086016120d5565b60408051808201825260098152681393d517d193d5539160ba1b6020820152905161156194939291906120f0565b60405180910390a1506116bf565b80356000908152600260205260409081902090820135815561159760808301606084016120d5565b60018201805467ffffffffffffffff19166001600160401b03929092169190911790556115ca60a083016080840161211e565b15611602576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b61161260808301606084016120d5565b6001600160401b031660010361163b578135600090815260036020526040812061163b916118c6565b7fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b8235604084013561167360808601606087016120d5565b61168360a087016080880161211e565b6040516116b4949392919093845260208401929092526001600160401b031660408301521515606082015260800190565b60405180910390a150505b6001016114c5565b50505050565b600081815260018301602052604081205415155b90505b92915050565b60006116e4825490565b60006116e18383611742565b6001600160a01b038116600090815260018301602052604081205415156116e1565b60006116e1838361176c565b6060600061173b836117bb565b9392505050565b600082600001828154811061175957611759611e7a565b9060005260206000200154905092915050565b60008181526001830160205260408120546117b3575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556116e4565b5060006116e4565b60608160000180548060200260200160405190810160405280929190818152602001828054801561180b57602002820191906000526020600020905b8154815260200190600101908083116117f7575b50505050509050919050565b60408051808201909152600081526020810161185c6040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b905290565b8280548282559060005260206000209081019282156118b6579160200282015b828111156118b657825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611881565b506118c2929150611903565b5090565b5080546118d290611ec9565b6000825580601f106118e2575050565b601f0160209004906000526020600020908101906119009190611903565b50565b5b808211156118c25760008155600101611904565b60006020828403121561192a57600080fd5b5035919050565b600060a08301825184526020808401516001600160401b0380821660208801528060408701511660408801528060608701511660608801525050608084015160a0608087015282815180855260c088019150602083019450600092505b808310156119b75784516001600160a01b0316825293830193600192909201919083019061198e565b509695505050505050565b6020815260006116e16020830184611931565b80356001600160a01b03811681146119ec57600080fd5b919050565b600060208284031215611a0357600080fd5b6116e1826119d5565b805182526000602082015160406020850152611a2b6040850182611931565b949350505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015611a8057601f19868403018952611a6e838351611a0c565b98840198925090830190600101611a52565b5090979650505050505050565b6020815260006116e16020830184611a33565b6000815180845260005b81811015611ac657602081850181015186830182015201611aaa565b506000602082860101526020601f19601f83011685010191505092915050565b606081526000611af96060830186611931565b8460208401528281036040840152611b118185611aa0565b9695505050505050565b6020815260006116e16020830184611a0c565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611b6c57611b6c611b2e565b604052919050565b600082601f830112611b8557600080fd5b81356001600160401b03811115611b9e57611b9e611b2e565b611bb1601f8201601f1916602001611b44565b818152846020838601011115611bc657600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611bf957600080fd5b843593506020808601356001600160401b0380821115611c1857600080fd5b818801915088601f830112611c2c57600080fd5b813581811115611c3e57611c3e611b2e565b8060051b611c4d858201611b44565b918252838101850191858101908c841115611c6757600080fd5b948601945b83861015611c8c57611c7d866119d5565b82529486019490860190611c6c565b9850505050604088013594506060880135925080831115611cac57600080fd5b5050611cba87828801611b74565b91505092959194509250565b6020808252825182820181905260009190848201906040850190845b81811015611cfe57835183529284019291840191600101611ce2565b50909695505050505050565b60008060408385031215611d1d57600080fd5b82359150611d2d602084016119d5565b90509250929050565b60008060408385031215611d4957600080fd5b50508035926020909101359150565b604081526000611d6b6040830185611a33565b905082151560208301529392505050565b80356001600160401b03811681146119ec57600080fd5b803580151581146119ec57600080fd5b600080600080600060a08688031215611dbb57600080fd5b853594506020860135935060408601359250611dd960608701611d7c565b9150611de760808701611d93565b90509295509295909350565b60008060208385031215611e0657600080fd5b82356001600160401b0380821115611e1d57600080fd5b818501915085601f830112611e3157600080fd5b813581811115611e4057600080fd5b86602060a083028501011115611e5557600080fd5b60209290920196919550909350505050565b6020815260006116e16020830184611aa0565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff808316818103611ebf57611ebf611e90565b6001019392505050565b600181811c90821680611edd57607f821691505b60208210810361075a57634e487b7160e01b600052602260045260246000fd5b601f821115611f49576000816000526020600020601f850160051c81016020861015611f265750805b601f850160051c820191505b81811015611f4557828155600101611f32565b5050505b505050565b81516001600160401b03811115611f6757611f67611b2e565b611f7b81611f758454611ec9565b84611efd565b602080601f831160018114611fb05760008415611f985750858301515b600019600386901b1c1916600185901b178555611f45565b600085815260208120601f198616915b82811015611fdf57888601518255948401946001909101908401611fc0565b5085821015611ffd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006080820186835260206080602085015281875180845260a08601915060208901935060005b818110156120595784516001600160a01b031683529383019391830191600101612034565b505086604086015284810360608601526120738187611aa0565b9998505050505050505050565b818103818111156116e4576116e4611e90565b808201808211156116e4576116e4611e90565b6000600182016120b8576120b8611e90565b5060010190565b634e487b7160e01b600052603160045260246000fd5b6000602082840312156120e757600080fd5b6116e182611d7c565b8481528360208201526001600160401b0383166040820152608060608201526000611b116080830184611aa0565b60006020828403121561213057600080fd5b6116e182611d9356 \ No newline at end of file diff --git a/packages/generated/dev/abis/StreamRegistry.json b/packages/generated/dev/abis/StreamRegistry.json new file mode 100644 index 000000000..d4a83242e --- /dev/null +++ b/packages/generated/dev/abis/StreamRegistry.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"allocateStream","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"},{"name":"nodes","type":"address[]","internalType":"address[]"},{"name":"genesisMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"genesisMiniblock","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getAllStreamIds","inputs":[],"outputs":[{"name":"","type":"bytes32[]","internalType":"bytes32[]"}],"stateMutability":"view"},{"type":"function","name":"getAllStreams","inputs":[],"outputs":[{"name":"","type":"tuple[]","internalType":"struct StreamWithId[]","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"stream","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}]}],"stateMutability":"view"},{"type":"function","name":"getPaginatedStreams","inputs":[{"name":"start","type":"uint256","internalType":"uint256"},{"name":"stop","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct StreamWithId[]","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"stream","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}]},{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getStream","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}],"stateMutability":"view"},{"type":"function","name":"getStreamByIndex","inputs":[{"name":"i","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct StreamWithId","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"stream","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}]}],"stateMutability":"view"},{"type":"function","name":"getStreamCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getStreamWithGenesis","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]},{"name":"","type":"bytes32","internalType":"bytes32"},{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getStreamsOnNode","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct StreamWithId[]","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"stream","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}]}],"stateMutability":"view"},{"type":"function","name":"placeStreamOnNode","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"},{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeStreamFromNode","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"},{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setStreamLastMiniblock","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"},{"name":"","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"isSealed","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setStreamLastMiniblockBatch","inputs":[{"name":"miniblocks","type":"tuple[]","internalType":"struct SetMiniblock[]","components":[{"name":"streamId","type":"bytes32","internalType":"bytes32"},{"name":"prevMiniBlockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"isSealed","type":"bool","internalType":"bool"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"StreamAllocated","inputs":[{"name":"streamId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"nodes","type":"address[]","indexed":false,"internalType":"address[]"},{"name":"genesisMiniblockHash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"genesisMiniblock","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"StreamLastMiniblockUpdateFailed","inputs":[{"name":"streamId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"lastMiniblockHash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"reason","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"StreamLastMiniblockUpdated","inputs":[{"name":"streamId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"lastMiniblockHash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"isSealed","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"StreamPlacementUpdated","inputs":[{"name":"streamId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"nodeAddress","type":"address","indexed":false,"internalType":"address"},{"name":"isAdded","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false}],"bytecode":{"object":"0x608060405234801561001057600080fd5b50612139806100206000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806386789fc61161008c578063ca78c41a11610066578063ca78c41a146101ba578063d7a3158a146101db578063ee885b12146101ee578063ff3a14ab1461020157600080fd5b806386789fc61461017c5780639ee86d3814610191578063c0f22084146101a457600080fd5b80631290abe8146100d457806332705ac4146100fd5780633bd84c0c1461011d5780633c2544d11461012557806368b454df146101475780636b883c3914610167575b600080fd5b6100e76100e2366004611918565b610214565b6040516100f491906119c2565b60405180910390f35b61011061010b3660046119f1565b61033f565b6040516100f49190611a8d565b6101106105ef565b610138610133366004611918565b610760565b6040516100f493929190611ae6565b61015a610155366004611918565b610931565b6040516100f49190611b1b565b61017a610175366004611be3565b610a58565b005b610184610cbd565b6040516100f49190611cc6565b61017a61019f366004611d0a565b610cce565b6101ac610e8b565b6040519081526020016100f4565b6101cd6101c8366004611d36565b610e96565b6040516100f4929190611d58565b61017a6101e9366004611da3565b61108f565b61017a6101fc366004611d0a565b61121a565b61017a61020f366004611df3565b611466565b6040805160a081018252600080825260208201819052918101829052606080820183905260808201529061024890836116cd565b61028c5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102839190600401611e67565b60405180910390fd5b600082815260026020818152604092839020835160a0810185528154815260018201546001600160401b0380821683860152600160401b8204811683880152600160801b909104166060820152928101805485518185028101850190965280865293949193608086019383018282801561032f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610311575b5050505050815250509050919050565b6060600061034c816116ea565b6001600160401b0381111561036357610363611b2e565b60405190808252806020026020018201604052801561038c578160200160208202803683370190505b5090506000805b61039d60006116ea565b8110156104525760006103b081836116f4565b60008181526002602052604081209192505b600282015481101561044457876001600160a01b03168260020182815481106103ed576103ed611e7a565b6000918252602090912001546001600160a01b03160361043c5782868661041381611ea6565b975063ffffffff168151811061042b5761042b611e7a565b602002602001018181525050610444565b6001016103c2565b505050806001019050610393565b5060008163ffffffff166001600160401b0381111561047357610473611b2e565b6040519080825280602002602001820160405280156104ac57816020015b610499611817565b8152602001906001900390816104915790505b50905060005b8263ffffffff168110156105e65760405180604001604052808583815181106104dd576104dd611e7a565b602002602001015181526020016000600201600087858151811061050357610503611e7a565b6020908102919091018101518252818101929092526040908101600020815160a0810183528154815260018201546001600160401b0380821683870152600160401b8204811683860152600160801b9091041660608201526002820180548451818702810187019095528085529194929360808601939092908301828280156105b557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610597575b5050505050815250508152508282815181106105d3576105d3611e7a565b60209081029190910101526001016104b2565b50949350505050565b606060006105fc816116ea565b6001600160401b0381111561061357610613611b2e565b60405190808252806020026020018201604052801561064c57816020015b610639611817565b8152602001906001900390816106315790505b50905060005b61065c60006116ea565b81101561075a57600061066f81836116f4565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b909104166060820152918101805486518186028101860190975280875296975093958387019592949193608086019392919083018282801561072857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161070a575b50505050508152505081525083838151811061074657610746611e7a565b602090810291909101015250600101610652565b50919050565b6040805160a08101825260008082526020820181905291810182905260608082018390526080820181905290919061079882856116cd565b6107d35760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102839190600401611e67565b600084815260026020818152604080842060048352818520546003845294829020825160a0810184528254815260018301546001600160401b0380821683880152600160401b8204811683870152600160801b9091041660608201529482018054845181870281018701909552808552929695919491938793608086019391929183018282801561088d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161086f575b50505050508152505092508080546108a490611ec9565b80601f01602080910402602001604051908101604052809291908181526020018280546108d090611ec9565b801561091d5780601f106108f25761010080835404028352916020019161091d565b820191906000526020600020905b81548152906001019060200180831161090057829003601f168201915b505050505090509250925092509193909250565b610939611817565b61094360006116ea565b82106109805760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102839190600401611e67565b600061098c81846116f4565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015610a4557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a27575b5050509190925250505090529392505050565b336000818152600760205260409020600201546001600160a01b0316610ab457604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b610abf6000866116cd565b15610b0057604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526102839190600401611e67565b60005b8451811015610b8457610b3c858281518110610b2157610b21611e7a565b6020026020010151600060050161170090919063ffffffff16565b610b7c57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b600101610b03565b506040805160a081018252848152600060208201819052918101829052606081018290526080810186905290610bba9087611722565b5060008681526002602081815260409283902084518155818501516001820180549587015160608801516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026fffffffffffffffffffffffffffffffff19909916919094161796909617959095161790935560808401518051859493610c4a93908501920190611861565b5050506000868152600360205260409020610c658482611f4e565b5060008681526004602052604090819020859055517f55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb90610cad90889088908890889061200d565b60405180910390a1505050505050565b6060610cc9600061172e565b905090565b81610cda6000826116cd565b610d155760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102839190600401611e67565b6001600160a01b03808316600090815260076020526040902060020154839116610d7557604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b6000848152600260205260408120905b6002820154811015610e0e57846001600160a01b0316826002018281548110610db057610db0611e7a565b6000918252602090912001546001600160a01b031603610e0657604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526102839190600401611e67565b600101610d85565b5060028101805460018082018355600092835260209283902090910180546001600160a01b0319166001600160a01b03881690811790915560408051898152938401919091528201527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f9060600160405180910390a15050505050565b6000610cc9816116ea565b60606000828410604051806040016040528060078152602001664241445f41524760c81b81525090610edb5760405162461bcd60e51b81526004016102839190611e67565b506000610ee88585612080565b6001600160401b03811115610eff57610eff611b2e565b604051908082528060200260200182016040528015610f3857816020015b610f25611817565b815260200190600190039081610f1d5790505b50905060005b610f4860006116ea565b610f528288612093565b108015610f67575084610f658288612093565b105b15611077576000610f83610f7b8389612093565b6000906116f4565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b909104166060820152918101805486518186028101860190975280875296975093958387019592949193608086019392919083018282801561103c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161101e575b50505050508152505081525083838151811061105a5761105a611e7a565b60200260200101819052505080611070906120a6565b9050610f3e565b508061108360006116ea565b90969410159450505050565b336000818152600760205260409020600201546001600160a01b03166110eb57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b6110f66000876116cd565b6111315760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102839190600401611e67565b600086815260026020526040902084815560018101805467ffffffffffffffff19166001600160401b0386161790558215611199576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b836001600160401b03166001036111c15760008781526003602052604081206111c1916118c6565b60408051888152602081018790526001600160401b03861681830152841515606082015290517fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b9181900360800190a150505050505050565b816112266000826116cd565b6112615760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102839190600401611e67565b6001600160a01b038083166000908152600760205260409020600201548391166112c157604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b600084815260026020526040812090805b60028301548110156113db57856001600160a01b03168360020182815481106112fd576112fd611e7a565b6000918252602090912001546001600160a01b0316036113d35760028301805461132990600190612080565b8154811061133957611339611e7a565b6000918252602090912001546002840180546001600160a01b03909216918390811061136757611367611e7a565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550826002018054806113a8576113a86120bf565b600082815260209020810160001990810180546001600160a01b0319169055019055600191506113db565b6001016112d2565b508061141d57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b604080518781526001600160a01b03871660208201526000918101919091527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f90606001610cad565b336000818152600760205260409020600201546001600160a01b03166114c257604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b60005b828110156116c757368484838181106114e0576114e0611e7a565b60a0029190910191506114f79050600082356116cd565b61156f577f75460fe319331413a18a82d99b07735cec53fa0c4061ada38c2141e331082afa8135604083013561153360808501606086016120d5565b60408051808201825260098152681393d517d193d5539160ba1b6020820152905161156194939291906120f0565b60405180910390a1506116bf565b80356000908152600260205260409081902090820135815561159760808301606084016120d5565b60018201805467ffffffffffffffff19166001600160401b03929092169190911790556115ca60a083016080840161211e565b15611602576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b61161260808301606084016120d5565b6001600160401b031660010361163b578135600090815260036020526040812061163b916118c6565b7fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b8235604084013561167360808601606087016120d5565b61168360a087016080880161211e565b6040516116b4949392919093845260208401929092526001600160401b031660408301521515606082015260800190565b60405180910390a150505b6001016114c5565b50505050565b600081815260018301602052604081205415155b90505b92915050565b60006116e4825490565b60006116e18383611742565b6001600160a01b038116600090815260018301602052604081205415156116e1565b60006116e1838361176c565b6060600061173b836117bb565b9392505050565b600082600001828154811061175957611759611e7a565b9060005260206000200154905092915050565b60008181526001830160205260408120546117b3575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556116e4565b5060006116e4565b60608160000180548060200260200160405190810160405280929190818152602001828054801561180b57602002820191906000526020600020905b8154815260200190600101908083116117f7575b50505050509050919050565b60408051808201909152600081526020810161185c6040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b905290565b8280548282559060005260206000209081019282156118b6579160200282015b828111156118b657825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611881565b506118c2929150611903565b5090565b5080546118d290611ec9565b6000825580601f106118e2575050565b601f0160209004906000526020600020908101906119009190611903565b50565b5b808211156118c25760008155600101611904565b60006020828403121561192a57600080fd5b5035919050565b600060a08301825184526020808401516001600160401b0380821660208801528060408701511660408801528060608701511660608801525050608084015160a0608087015282815180855260c088019150602083019450600092505b808310156119b75784516001600160a01b0316825293830193600192909201919083019061198e565b509695505050505050565b6020815260006116e16020830184611931565b80356001600160a01b03811681146119ec57600080fd5b919050565b600060208284031215611a0357600080fd5b6116e1826119d5565b805182526000602082015160406020850152611a2b6040850182611931565b949350505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015611a8057601f19868403018952611a6e838351611a0c565b98840198925090830190600101611a52565b5090979650505050505050565b6020815260006116e16020830184611a33565b6000815180845260005b81811015611ac657602081850181015186830182015201611aaa565b506000602082860101526020601f19601f83011685010191505092915050565b606081526000611af96060830186611931565b8460208401528281036040840152611b118185611aa0565b9695505050505050565b6020815260006116e16020830184611a0c565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611b6c57611b6c611b2e565b604052919050565b600082601f830112611b8557600080fd5b81356001600160401b03811115611b9e57611b9e611b2e565b611bb1601f8201601f1916602001611b44565b818152846020838601011115611bc657600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611bf957600080fd5b843593506020808601356001600160401b0380821115611c1857600080fd5b818801915088601f830112611c2c57600080fd5b813581811115611c3e57611c3e611b2e565b8060051b611c4d858201611b44565b918252838101850191858101908c841115611c6757600080fd5b948601945b83861015611c8c57611c7d866119d5565b82529486019490860190611c6c565b9850505050604088013594506060880135925080831115611cac57600080fd5b5050611cba87828801611b74565b91505092959194509250565b6020808252825182820181905260009190848201906040850190845b81811015611cfe57835183529284019291840191600101611ce2565b50909695505050505050565b60008060408385031215611d1d57600080fd5b82359150611d2d602084016119d5565b90509250929050565b60008060408385031215611d4957600080fd5b50508035926020909101359150565b604081526000611d6b6040830185611a33565b905082151560208301529392505050565b80356001600160401b03811681146119ec57600080fd5b803580151581146119ec57600080fd5b600080600080600060a08688031215611dbb57600080fd5b853594506020860135935060408601359250611dd960608701611d7c565b9150611de760808701611d93565b90509295509295909350565b60008060208385031215611e0657600080fd5b82356001600160401b0380821115611e1d57600080fd5b818501915085601f830112611e3157600080fd5b813581811115611e4057600080fd5b86602060a083028501011115611e5557600080fd5b60209290920196919550909350505050565b6020815260006116e16020830184611aa0565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff808316818103611ebf57611ebf611e90565b6001019392505050565b600181811c90821680611edd57607f821691505b60208210810361075a57634e487b7160e01b600052602260045260246000fd5b601f821115611f49576000816000526020600020601f850160051c81016020861015611f265750805b601f850160051c820191505b81811015611f4557828155600101611f32565b5050505b505050565b81516001600160401b03811115611f6757611f67611b2e565b611f7b81611f758454611ec9565b84611efd565b602080601f831160018114611fb05760008415611f985750858301515b600019600386901b1c1916600185901b178555611f45565b600085815260208120601f198616915b82811015611fdf57888601518255948401946001909101908401611fc0565b5085821015611ffd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006080820186835260206080602085015281875180845260a08601915060208901935060005b818110156120595784516001600160a01b031683529383019391830191600101612034565b505086604086015284810360608601526120738187611aa0565b9998505050505050505050565b818103818111156116e4576116e4611e90565b808201808211156116e4576116e4611e90565b6000600182016120b8576120b8611e90565b5060010190565b634e487b7160e01b600052603160045260246000fd5b6000602082840312156120e757600080fd5b6116e182611d7c565b8481528360208201526001600160401b0383166040820152608060608201526000611b116080830184611aa0565b60006020828403121561213057600080fd5b6116e182611d9356","sourceMap":"605:9385:44:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c806386789fc61161008c578063ca78c41a11610066578063ca78c41a146101ba578063d7a3158a146101db578063ee885b12146101ee578063ff3a14ab1461020157600080fd5b806386789fc61461017c5780639ee86d3814610191578063c0f22084146101a457600080fd5b80631290abe8146100d457806332705ac4146100fd5780633bd84c0c1461011d5780633c2544d11461012557806368b454df146101475780636b883c3914610167575b600080fd5b6100e76100e2366004611918565b610214565b6040516100f491906119c2565b60405180910390f35b61011061010b3660046119f1565b61033f565b6040516100f49190611a8d565b6101106105ef565b610138610133366004611918565b610760565b6040516100f493929190611ae6565b61015a610155366004611918565b610931565b6040516100f49190611b1b565b61017a610175366004611be3565b610a58565b005b610184610cbd565b6040516100f49190611cc6565b61017a61019f366004611d0a565b610cce565b6101ac610e8b565b6040519081526020016100f4565b6101cd6101c8366004611d36565b610e96565b6040516100f4929190611d58565b61017a6101e9366004611da3565b61108f565b61017a6101fc366004611d0a565b61121a565b61017a61020f366004611df3565b611466565b6040805160a081018252600080825260208201819052918101829052606080820183905260808201529061024890836116cd565b61028c5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102839190600401611e67565b60405180910390fd5b600082815260026020818152604092839020835160a0810185528154815260018201546001600160401b0380821683860152600160401b8204811683880152600160801b909104166060820152928101805485518185028101850190965280865293949193608086019383018282801561032f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610311575b5050505050815250509050919050565b6060600061034c816116ea565b6001600160401b0381111561036357610363611b2e565b60405190808252806020026020018201604052801561038c578160200160208202803683370190505b5090506000805b61039d60006116ea565b8110156104525760006103b081836116f4565b60008181526002602052604081209192505b600282015481101561044457876001600160a01b03168260020182815481106103ed576103ed611e7a565b6000918252602090912001546001600160a01b03160361043c5782868661041381611ea6565b975063ffffffff168151811061042b5761042b611e7a565b602002602001018181525050610444565b6001016103c2565b505050806001019050610393565b5060008163ffffffff166001600160401b0381111561047357610473611b2e565b6040519080825280602002602001820160405280156104ac57816020015b610499611817565b8152602001906001900390816104915790505b50905060005b8263ffffffff168110156105e65760405180604001604052808583815181106104dd576104dd611e7a565b602002602001015181526020016000600201600087858151811061050357610503611e7a565b6020908102919091018101518252818101929092526040908101600020815160a0810183528154815260018201546001600160401b0380821683870152600160401b8204811683860152600160801b9091041660608201526002820180548451818702810187019095528085529194929360808601939092908301828280156105b557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610597575b5050505050815250508152508282815181106105d3576105d3611e7a565b60209081029190910101526001016104b2565b50949350505050565b606060006105fc816116ea565b6001600160401b0381111561061357610613611b2e565b60405190808252806020026020018201604052801561064c57816020015b610639611817565b8152602001906001900390816106315790505b50905060005b61065c60006116ea565b81101561075a57600061066f81836116f4565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b909104166060820152918101805486518186028101860190975280875296975093958387019592949193608086019392919083018282801561072857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161070a575b50505050508152505081525083838151811061074657610746611e7a565b602090810291909101015250600101610652565b50919050565b6040805160a08101825260008082526020820181905291810182905260608082018390526080820181905290919061079882856116cd565b6107d35760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102839190600401611e67565b600084815260026020818152604080842060048352818520546003845294829020825160a0810184528254815260018301546001600160401b0380821683880152600160401b8204811683870152600160801b9091041660608201529482018054845181870281018701909552808552929695919491938793608086019391929183018282801561088d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161086f575b50505050508152505092508080546108a490611ec9565b80601f01602080910402602001604051908101604052809291908181526020018280546108d090611ec9565b801561091d5780601f106108f25761010080835404028352916020019161091d565b820191906000526020600020905b81548152906001019060200180831161090057829003601f168201915b505050505090509250925092509193909250565b610939611817565b61094360006116ea565b82106109805760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102839190600401611e67565b600061098c81846116f4565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015610a4557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a27575b5050509190925250505090529392505050565b336000818152600760205260409020600201546001600160a01b0316610ab457604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b610abf6000866116cd565b15610b0057604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526102839190600401611e67565b60005b8451811015610b8457610b3c858281518110610b2157610b21611e7a565b6020026020010151600060050161170090919063ffffffff16565b610b7c57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b600101610b03565b506040805160a081018252848152600060208201819052918101829052606081018290526080810186905290610bba9087611722565b5060008681526002602081815260409283902084518155818501516001820180549587015160608801516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026fffffffffffffffffffffffffffffffff19909916919094161796909617959095161790935560808401518051859493610c4a93908501920190611861565b5050506000868152600360205260409020610c658482611f4e565b5060008681526004602052604090819020859055517f55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb90610cad90889088908890889061200d565b60405180910390a1505050505050565b6060610cc9600061172e565b905090565b81610cda6000826116cd565b610d155760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102839190600401611e67565b6001600160a01b03808316600090815260076020526040902060020154839116610d7557604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b6000848152600260205260408120905b6002820154811015610e0e57846001600160a01b0316826002018281548110610db057610db0611e7a565b6000918252602090912001546001600160a01b031603610e0657604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526102839190600401611e67565b600101610d85565b5060028101805460018082018355600092835260209283902090910180546001600160a01b0319166001600160a01b03881690811790915560408051898152938401919091528201527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f9060600160405180910390a15050505050565b6000610cc9816116ea565b60606000828410604051806040016040528060078152602001664241445f41524760c81b81525090610edb5760405162461bcd60e51b81526004016102839190611e67565b506000610ee88585612080565b6001600160401b03811115610eff57610eff611b2e565b604051908082528060200260200182016040528015610f3857816020015b610f25611817565b815260200190600190039081610f1d5790505b50905060005b610f4860006116ea565b610f528288612093565b108015610f67575084610f658288612093565b105b15611077576000610f83610f7b8389612093565b6000906116f4565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b909104166060820152918101805486518186028101860190975280875296975093958387019592949193608086019392919083018282801561103c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161101e575b50505050508152505081525083838151811061105a5761105a611e7a565b60200260200101819052505080611070906120a6565b9050610f3e565b508061108360006116ea565b90969410159450505050565b336000818152600760205260409020600201546001600160a01b03166110eb57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b6110f66000876116cd565b6111315760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102839190600401611e67565b600086815260026020526040902084815560018101805467ffffffffffffffff19166001600160401b0386161790558215611199576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b836001600160401b03166001036111c15760008781526003602052604081206111c1916118c6565b60408051888152602081018790526001600160401b03861681830152841515606082015290517fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b9181900360800190a150505050505050565b816112266000826116cd565b6112615760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102839190600401611e67565b6001600160a01b038083166000908152600760205260409020600201548391166112c157604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b600084815260026020526040812090805b60028301548110156113db57856001600160a01b03168360020182815481106112fd576112fd611e7a565b6000918252602090912001546001600160a01b0316036113d35760028301805461132990600190612080565b8154811061133957611339611e7a565b6000918252602090912001546002840180546001600160a01b03909216918390811061136757611367611e7a565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550826002018054806113a8576113a86120bf565b600082815260209020810160001990810180546001600160a01b0319169055019055600191506113db565b6001016112d2565b508061141d57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b604080518781526001600160a01b03871660208201526000918101919091527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f90606001610cad565b336000818152600760205260409020600201546001600160a01b03166114c257604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102839190600401611e67565b60005b828110156116c757368484838181106114e0576114e0611e7a565b60a0029190910191506114f79050600082356116cd565b61156f577f75460fe319331413a18a82d99b07735cec53fa0c4061ada38c2141e331082afa8135604083013561153360808501606086016120d5565b60408051808201825260098152681393d517d193d5539160ba1b6020820152905161156194939291906120f0565b60405180910390a1506116bf565b80356000908152600260205260409081902090820135815561159760808301606084016120d5565b60018201805467ffffffffffffffff19166001600160401b03929092169190911790556115ca60a083016080840161211e565b15611602576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b61161260808301606084016120d5565b6001600160401b031660010361163b578135600090815260036020526040812061163b916118c6565b7fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b8235604084013561167360808601606087016120d5565b61168360a087016080880161211e565b6040516116b4949392919093845260208401929092526001600160401b031660408301521515606082015260800190565b60405180910390a150505b6001016114c5565b50505050565b600081815260018301602052604081205415155b90505b92915050565b60006116e4825490565b60006116e18383611742565b6001600160a01b038116600090815260018301602052604081205415156116e1565b60006116e1838361176c565b6060600061173b836117bb565b9392505050565b600082600001828154811061175957611759611e7a565b9060005260206000200154905092915050565b60008181526001830160205260408120546117b3575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556116e4565b5060006116e4565b60608160000180548060200260200160405190810160405280929190818152602001828054801561180b57602002820191906000526020600020905b8154815260200190600101908083116117f7575b50505050509050919050565b60408051808201909152600081526020810161185c6040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b905290565b8280548282559060005260206000209081019282156118b6579160200282015b828111156118b657825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611881565b506118c2929150611903565b5090565b5080546118d290611ec9565b6000825580601f106118e2575050565b601f0160209004906000526020600020908101906119009190611903565b50565b5b808211156118c25760008155600101611904565b60006020828403121561192a57600080fd5b5035919050565b600060a08301825184526020808401516001600160401b0380821660208801528060408701511660408801528060608701511660608801525050608084015160a0608087015282815180855260c088019150602083019450600092505b808310156119b75784516001600160a01b0316825293830193600192909201919083019061198e565b509695505050505050565b6020815260006116e16020830184611931565b80356001600160a01b03811681146119ec57600080fd5b919050565b600060208284031215611a0357600080fd5b6116e1826119d5565b805182526000602082015160406020850152611a2b6040850182611931565b949350505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015611a8057601f19868403018952611a6e838351611a0c565b98840198925090830190600101611a52565b5090979650505050505050565b6020815260006116e16020830184611a33565b6000815180845260005b81811015611ac657602081850181015186830182015201611aaa565b506000602082860101526020601f19601f83011685010191505092915050565b606081526000611af96060830186611931565b8460208401528281036040840152611b118185611aa0565b9695505050505050565b6020815260006116e16020830184611a0c565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611b6c57611b6c611b2e565b604052919050565b600082601f830112611b8557600080fd5b81356001600160401b03811115611b9e57611b9e611b2e565b611bb1601f8201601f1916602001611b44565b818152846020838601011115611bc657600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611bf957600080fd5b843593506020808601356001600160401b0380821115611c1857600080fd5b818801915088601f830112611c2c57600080fd5b813581811115611c3e57611c3e611b2e565b8060051b611c4d858201611b44565b918252838101850191858101908c841115611c6757600080fd5b948601945b83861015611c8c57611c7d866119d5565b82529486019490860190611c6c565b9850505050604088013594506060880135925080831115611cac57600080fd5b5050611cba87828801611b74565b91505092959194509250565b6020808252825182820181905260009190848201906040850190845b81811015611cfe57835183529284019291840191600101611ce2565b50909695505050505050565b60008060408385031215611d1d57600080fd5b82359150611d2d602084016119d5565b90509250929050565b60008060408385031215611d4957600080fd5b50508035926020909101359150565b604081526000611d6b6040830185611a33565b905082151560208301529392505050565b80356001600160401b03811681146119ec57600080fd5b803580151581146119ec57600080fd5b600080600080600060a08688031215611dbb57600080fd5b853594506020860135935060408601359250611dd960608701611d7c565b9150611de760808701611d93565b90509295509295909350565b60008060208385031215611e0657600080fd5b82356001600160401b0380821115611e1d57600080fd5b818501915085601f830112611e3157600080fd5b813581811115611e4057600080fd5b86602060a083028501011115611e5557600080fd5b60209290920196919550909350505050565b6020815260006116e16020830184611aa0565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff808316818103611ebf57611ebf611e90565b6001019392505050565b600181811c90821680611edd57607f821691505b60208210810361075a57634e487b7160e01b600052602260045260246000fd5b601f821115611f49576000816000526020600020601f850160051c81016020861015611f265750805b601f850160051c820191505b81811015611f4557828155600101611f32565b5050505b505050565b81516001600160401b03811115611f6757611f67611b2e565b611f7b81611f758454611ec9565b84611efd565b602080601f831160018114611fb05760008415611f985750858301515b600019600386901b1c1916600185901b178555611f45565b600085815260208120601f198616915b82811015611fdf57888601518255948401946001909101908401611fc0565b5085821015611ffd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006080820186835260206080602085015281875180845260a08601915060208901935060005b818110156120595784516001600160a01b031683529383019391830191600101612034565b505086604086015284810360608601526120738187611aa0565b9998505050505050505050565b818103818111156116e4576116e4611e90565b808201808211156116e4576116e4611e90565b6000600182016120b8576120b8611e90565b5060010190565b634e487b7160e01b600052603160045260246000fd5b6000602082840312156120e757600080fd5b6116e182611d7c565b8481528360208201526001600160401b0383166040820152608060608201526000611b116080830184611aa0565b60006020828403121561213057600080fd5b6116e182611d9356","sourceMap":"605:9385:44:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1862:196;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9133:855;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8237:344::-;;;:::i;2423:350::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;2062:296::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;776:1082::-;;;;;;:::i;:::-;;:::i;:::-;;8128:105;;;:::i;:::-;;;;;;;:::i;6933:504::-;;;;;;:::i;:::-;;:::i;8029:95::-;;;:::i;:::-;;;7678:25:84;;;7666:2;7651:18;8029:95:44;7532:177:84;8585:544:44;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;2777:1696::-;;;;;;:::i;:::-;;:::i;7441:584::-;;;;;;:::i;:::-;;:::i;4477:2452::-;;;;;;:::i;:::-;;:::i;1862:196::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1948:29:44;;1968:8;1948:19;:29::i;:::-;1943:73;;1986:29;;;;;;;;;;;-1:-1:-1;;;1986:29:44;;;;1979:37;;-1:-1:-1;;;1979:37:44;;;;1986:29;1979:37;;;:::i;:::-;;;;;;;;1943:73;2030:2;:23;;;:13;:23;;;;;;;;;2023:30;;;;;;;;;;;;;;;-1:-1:-1;;;;;2023:30:44;;;;;;;-1:-1:-1;;;2023:30:44;;;;;;;;-1:-1:-1;;;2023:30:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2030:23;;2023:30;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2023:30:44;;;;;;;;;;;;;;;;;;;;;;;;;;;1862:196;;;:::o;9133:855::-;9211:21;9297:29;9343:19;9297:29;9343:17;:19::i;:::-;-1:-1:-1;;;;;9329:34:44;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9329:34:44;-1:-1:-1;9297:66:44;-1:-1:-1;9369:18:44;;9393:326;9417:19;:2;:17;:19::i;:::-;9413:1;:23;9393:326;;;9451:10;9464:16;9451:10;9478:1;9464:13;:16::i;:::-;9488:21;9512:17;;;:13;:17;;;;;9451:29;;-1:-1:-1;9537:176:44;9561:12;;;:19;9557:23;;9537:176;;;9620:11;-1:-1:-1;;;;;9601:30:44;:6;:12;;9614:1;9601:15;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;9601:15:44;:30;9597:108;;9675:2;9645:12;9658:13;;;;:::i;:::-;;;9645:27;;;;;;;;;;:::i;:::-;;;;;;:32;;;;;9689:5;;9597:108;9582:3;;9537:176;;;;9443:276;;9438:3;;;;;9393:326;;;;9725:29;9776:11;9757:31;;-1:-1:-1;;;;;9757:31:44;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;9725:63;;9799:9;9794:169;9818:11;9814:15;;:1;:15;9794:169;;;9857:99;;;;;;;;9884:12;9897:1;9884:15;;;;;;;;:::i;:::-;;;;;;;9857:99;;;;9917:2;:13;;:30;9931:12;9944:1;9931:15;;;;;;;;:::i;:::-;;;;;;;;;;;;9917:30;;;;;;;;;;;;;-1:-1:-1;9917:30:44;9857:99;;;;;;;;;;;;;;;-1:-1:-1;;;;;9857:99:44;;;;;;;-1:-1:-1;;;9857:99:44;;;;;;;;-1:-1:-1;;;9857:99:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9917:30;;9857:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9857:99:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;9844:7;9852:1;9844:10;;;;;;;;:::i;:::-;;;;;;;;;;:112;9831:3;;9794:169;;;-1:-1:-1;9976:7:44;9133:855;-1:-1:-1;;;;9133:855:44:o;8237:344::-;8285:21;8314:29;8365:19;8314:29;8365:17;:19::i;:::-;-1:-1:-1;;;;;8346:39:44;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;8314:71;;8397:9;8392:164;8416:19;:2;:17;:19::i;:::-;8412:1;:23;8392:164;;;8450:10;8463:16;8450:10;8477:1;8463:13;:16::i;:::-;8500:49;;;;;;;;;;;-1:-1:-1;8530:17:44;;;:13;8500:49;8530:17;;;;;;;8500:49;;;;;;;;;;;;;;;-1:-1:-1;;;;;8500:49:44;;;;;;;-1:-1:-1;;;8500:49:44;;;;;;;;-1:-1:-1;;;8500:49:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;8450:29;;-1:-1:-1;8500:49:44;;;;;;;;8530:17;;8500:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8500:49:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;8487:7;8495:1;8487:10;;;;;;;;:::i;:::-;;;;;;;;;;:62;-1:-1:-1;8437:3:44;;8392:164;;;-1:-1:-1;8569:7:44;8237:344;-1:-1:-1;8237:344:44:o;2423:350::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2551:29:44;-1:-1:-1;2571:8:44;2551:19;:29::i;:::-;2546:73;;2589:29;;;;;;;;;;;-1:-1:-1;;;2589:29:44;;;;2582:37;;-1:-1:-1;;;2582:37:44;;;;2589:29;2582:37;;;:::i;2546:73::-;2641:2;:23;;;:13;:23;;;;;;;;2672:33;:43;;;;;;2723:29;:39;;;;;;2626:142;;;;;;;;;;;;;;;-1:-1:-1;;;;;2626:142:44;;;;;;;-1:-1:-1;;;2626:142:44;;;;;;;;-1:-1:-1;;;2626:142:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;2641:23;;2672:43;2723:39;;2626:142;;2641:23;;2626:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2626:142:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2423:350;;;;;:::o;2062:296::-;2130:19;;:::i;:::-;2166;:2;:17;:19::i;:::-;2161:1;:24;2157:82;;2202:29;;;;;;;;;;;-1:-1:-1;;;2202:29:44;;;;2195:37;;-1:-1:-1;;;2195:37:44;;;;2202:29;2195:37;;;:::i;2157:82::-;2244:16;2263;2244;2277:1;2263:13;:16::i;:::-;2292:61;;;;;;;;;;;-1:-1:-1;2328:23:44;;;:13;2292:61;2328:23;;;;;;;2292:61;;;;;;;;;;;;;;;-1:-1:-1;;;;;2292:61:44;;;;;;;-1:-1:-1;;;2292:61:44;;;;;;;;-1:-1:-1;;;2292:61:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;2244:35;;-1:-1:-1;2292:61:44;;;;;;;;2328:23;;2292:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2292:61:44;;;;;;;;;;;;;;;;-1:-1:-1;;;2292:61:44;;;;-1:-1:-1;;;2292:61:44;;2285:68;2062:296;-1:-1:-1;;;2062:296:44:o;776:1082::-;941:10;3092:1:46;3046:22;;;:16;:22;;;;;:34;;;-1:-1:-1;;;;;3046:34:46;3042:102;;3109:34;;;;;;;;;;;-1:-1:-1;;;3109:34:46;;;;3102:42;;-1:-1:-1;;;3102:42:46;;;;3109:34;3102:42;;;:::i;3042:102::-;1026:29:44::1;:2;1046:8:::0;1026:19:::1;:29::i;:::-;1022:83;;;1070:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1070:34:44::1;::::0;::::1;::::0;1063:42;;-1:-1:-1;;;1063:42:44;;::::1;::::0;1070:34;1063:42:::1;;;:::i;1022:83::-;1186:9;1181:142;1205:5;:12;1201:1;:16;1181:142;;;1237:27;1255:5;1261:1;1255:8;;;;;;;;:::i;:::-;;;;;;;1237:2;:8;;:17;;:27;;;;:::i;:::-;1232:84;;1281:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1281:34:44::1;::::0;::::1;::::0;1274:42;;-1:-1:-1;;;1274:42:44;;::::1;::::0;1281:34;1274:42:::1;;;:::i;1232:84::-;1219:3;;1181:142;;;-1:-1:-1::0;1390:144:44::1;::::0;;::::1;::::0;::::1;::::0;;;;;1367:20:::1;1390:144;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;1541:24:::1;::::0;1556:8;1541:14:::1;:24::i;:::-;-1:-1:-1::0;1571:2:44::1;:23:::0;;;:13:::1;:23;::::0;;;;;;;;:32;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;1571:32:44;;::::1;-1:-1:-1::0;;;1571:32:44::1;-1:-1:-1::0;;;;1571:32:44;;::::1;-1:-1:-1::0;;;1571:32:44::1;-1:-1:-1::0;;1571:32:44;;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;1597:6;;1571:23;:32:::1;::::0;;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;1609:2:44::1;:39:::0;;;:29:::1;:39;::::0;;;;:58:::1;1651:16:::0;1609:39;:58:::1;:::i;:::-;-1:-1:-1::0;1673:2:44::1;:43:::0;;;:33:::1;:43;::::0;;;;;;:66;;;1751:102;::::1;::::0;::::1;::::0;1707:8;;1790:5;;1719:20;;1831:16;;1751:102:::1;:::i;:::-;;;;;;;;953:905;776:1082:::0;;;;;:::o;8128:105::-;8178:16;8209:19;:2;:17;:19::i;:::-;8202:26;;8128:105;:::o;6933:504::-;7031:8;3345:29:46;:2;7031:8:44;3345:19:46;:29::i;:::-;3340:73;;3383:29;;;;;;;;;;;-1:-1:-1;;;3383:29:46;;;;3376:37;;-1:-1:-1;;;3376:37:46;;;;3383:29;3376:37;;;:::i;3340:73::-;-1:-1:-1;;;;;3046:22:46;;::::1;3092:1;3046:22:::0;;;:16:::1;:22;::::0;;;;:34:::1;;::::0;7050:11:44;;3046:34:46::1;3042:102;;3109:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3109:34:46::1;::::0;::::1;::::0;3102:42;;-1:-1:-1;;;3102:42:46;;::::1;::::0;3109:34;3102:42:::1;;;:::i;3042:102::-;7069:21:44::2;7093:23:::0;;;:13:::2;:23;::::0;;;;;7182:151:::2;7206:12;::::0;::::2;:19:::0;7202:23;::::2;7182:151;;;7263:11;-1:-1:-1::0;;;;;7244:30:44::2;:6;:12;;7257:1;7244:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;7244:15:44::2;:30:::0;7240:86:::2;;7291:34;::::0;;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;7291:34:44::2;::::0;::::2;::::0;7284:42;;-1:-1:-1;;;7284:42:44;;::::2;::::0;7291:34;7284:42:::2;;;:::i;7240:86::-;7227:3;;7182:151;;;-1:-1:-1::0;7339:12:44::2;::::0;::::2;:30:::0;;::::2;::::0;;::::2;::::0;;-1:-1:-1;7339:30:44;;;::::2;::::0;;;;;;::::2;::::0;;-1:-1:-1;;;;;;7339:30:44::2;-1:-1:-1::0;;;;;7339:30:44;::::2;::::0;;::::2;::::0;;;7381:51:::2;::::0;;14245:25:84;;;14286:18;;;14279:60;;;;14355:18;;14348:50;7381:51:44::2;::::0;14233:2:84;14218:18;7381:51:44::2;;;;;;;7063:374;3419:1:46::1;6933:504:44::0;;;:::o;8029:95::-;8078:7;8100:19;8078:7;8100:17;:19::i;8585:544::-;8678:21;8701:4;8729;8721:5;:12;8735:27;;;;;;;;;;;;;-1:-1:-1;;;8735:27:44;;;8713:50;;;;;-1:-1:-1;;;8713:50:44;;;;;;;;:::i;:::-;-1:-1:-1;8770:29:44;8821:12;8828:5;8821:4;:12;:::i;:::-;-1:-1:-1;;;;;8802:32:44;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;8770:64;;8853:9;8841:232;8889:19;:2;:17;:19::i;:::-;8876:9;8884:1;8876:5;:9;:::i;:::-;8875:33;8874:59;;;;-1:-1:-1;8928:4:44;8915:9;8923:1;8915:5;:9;:::i;:::-;8914:18;8874:59;8841:232;;;8959:10;8972:24;8986:9;8994:1;8986:5;:9;:::i;:::-;8972:2;;:13;:24::i;:::-;9017:49;;;;;;;;;;;-1:-1:-1;9047:17:44;;;:13;9017:49;9047:17;;;;;;;9017:49;;;;;;;;;;;;;;;-1:-1:-1;;;;;9017:49:44;;;;;;;-1:-1:-1;;;9017:49:44;;;;;;;;-1:-1:-1;;;9017:49:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;8959:37;;-1:-1:-1;9017:49:44;;;;;;;;9047:17;;9017:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9017:49:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;9004:7;9012:1;9004:10;;;;;;;;:::i;:::-;;;;;;:62;;;;8951:122;8941:3;;;;:::i;:::-;;;8841:232;;;-1:-1:-1;9087:7:44;9104:19;:2;:17;:19::i;:::-;9079:45;;9096:27;;;;-1:-1:-1;;;;8585:544:44:o;2777:1696::-;2967:10;3092:1:46;3046:22;;;:16;:22;;;;;:34;;;-1:-1:-1;;;;;3046:34:46;3042:102;;3109:34;;;;;;;;;;;-1:-1:-1;;;3109:34:46;;;;3102:42;;-1:-1:-1;;;3102:42:46;;;;3109:34;3102:42;;;:::i;3042:102::-;3043:29:44::1;:2;3063:8:::0;3043:19:::1;:29::i;:::-;3038:88;;3089:29;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3089:29:44::1;::::0;::::1;::::0;3082:37;;-1:-1:-1;;;3082:37:44;;::::1;::::0;3089:29;3082:37:::1;;;:::i;3038:88::-;3132:21;3156:23:::0;;;:13:::1;:23;::::0;;;;3971:44;;;4021:23:::1;::::0;::::1;:42:::0;;-1:-1:-1;;4021:42:44::1;-1:-1:-1::0;;;;;4021:42:44;::::1;;::::0;;4110:63;::::1;;;599:1;4132:12:::0;;::::1;:34:::0;;-1:-1:-1;;;;4132:34:44;::::1;-1:-1:-1::0;;;4132:34:44;;;::::1;-1:-1:-1::0;;;;;4132:34:44::1;::::0;;::::1;;::::0;;;::::1;::::0;;4110:63:::1;4260:16;-1:-1:-1::0;;;;;4260:21:44::1;4280:1;4260:21:::0;4256:88:::1;;4298:2;:39:::0;;;:29:::1;:39;::::0;;;;4291:46:::1;::::0;::::1;:::i;:::-;4355:113;::::0;;15035:25:84;;;15091:2;15076:18;;15069:34;;;-1:-1:-1;;;;;15139:31:84;;15119:18;;;15112:59;15214:14;;15207:22;15202:2;15187:18;;15180:50;4355:113:44;;::::1;::::0;;;;15022:3:84;4355:113:44;;::::1;2979:1494;2777:1696:::0;;;;;;:::o;7441:584::-;7542:8;3345:29:46;:2;7542:8:44;3345:19:46;:29::i;:::-;3340:73;;3383:29;;;;;;;;;;;-1:-1:-1;;;3383:29:46;;;;3376:37;;-1:-1:-1;;;3376:37:46;;;;3383:29;3376:37;;;:::i;3340:73::-;-1:-1:-1;;;;;3046:22:46;;::::1;3092:1;3046:22:::0;;;:16:::1;:22;::::0;;;;:34:::1;;::::0;7561:11:44;;3046:34:46::1;3042:102;;3109:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3109:34:46::1;::::0;::::1;::::0;3102:42;;-1:-1:-1;;;3102:42:46;;::::1;::::0;3109:34;3102:42:::1;;;:::i;3042:102::-;7580:21:44::2;7604:23:::0;;;:13:::2;:23;::::0;;;;;7580:21;7658:239:::2;7682:12;::::0;::::2;:19:::0;7678:23;::::2;7658:239;;;7739:11;-1:-1:-1::0;;;;;7720:30:44::2;:6;:12;;7733:1;7720:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;7720:15:44::2;:30:::0;7716:175:::2;;7780:12;::::0;::::2;7793:19:::0;;:23:::2;::::0;7815:1:::2;::::0;7793:23:::2;:::i;:::-;7780:37;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;7762:12:::2;::::0;::::2;:15:::0;;-1:-1:-1;;;;;7780:37:44;;::::2;::::0;7775:1;;7762:15;::::2;;;;;:::i;:::-;;;;;;;;;:55;;;;;-1:-1:-1::0;;;;;7762:55:44::2;;;;;-1:-1:-1::0;;;;;7762:55:44::2;;;;;;7827:6;:12;;:18;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;-1:-1:-1;;7827:18:44;;;;;-1:-1:-1;;;;;;7827:18:44::2;::::0;;;;;::::2;::::0;-1:-1:-1;7877:5:44::2;;7716:175;7703:3;;7658:239;;;;7907:5;7902:54;;7921:34;::::0;;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;7921:34:44::2;::::0;::::2;::::0;7914:42;;-1:-1:-1;;;7914:42:44;;::::2;::::0;7921:34;7914:42:::2;;;:::i;7902:54::-;7968:52;::::0;;14245:25:84;;;-1:-1:-1;;;;;14306:32:84;;14301:2;14286:18;;14279:60;8014:5:44::2;14355:18:84::0;;;14348:50;;;;7968:52:44::2;::::0;14233:2:84;14218:18;7968:52:44::2;14049:355:84::0;4477:2452:44;4576:10;3092:1:46;3046:22;;;:16;:22;;;;;:34;;;-1:-1:-1;;;;;3046:34:46;3042:102;;3109:34;;;;;;;;;;;-1:-1:-1;;;3109:34:46;;;;3102:42;;-1:-1:-1;;;3102:42:46;;;;3109:34;3102:42;;;:::i;3042:102::-;4599:9:44::1;4594:2331;4614:21:::0;;::::1;4594:2331;;;4650:31;4684:10;;4695:1;4684:13;;;;;;;:::i;:::-;;;::::0;;;::::1;::::0;-1:-1:-1;4711:39:44::1;::::0;-1:-1:-1;4731:18:44::1;::::0;::::1;4711:19;:39::i;:::-;4706:277;;4767:189;4810:18:::0;::::1;4840:27;::::0;::::1;;4879:26;::::0;;;::::1;::::0;::::1;;:::i;:::-;4917:29;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;4917:29:44::1;::::0;::::1;::::0;4767:189;;::::1;::::0;;;;4917:29;4767:189:::1;:::i;:::-;;;;;;;;4966:8;;;4706:277;5029:18:::0;::::1;4991:21;5015:33:::0;;;:13:::1;:33;::::0;;;;;;6328:27;;::::1;;6301:54:::0;;6389:26:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;6363:23;::::0;::::1;:52:::0;;-1:-1:-1;;6363:52:44::1;-1:-1:-1::0;;;;;6363:52:44;;;::::1;::::0;;;::::1;::::0;;6470:18:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;6466:77;;;599:1;6500:12:::0;;::::1;:34:::0;;-1:-1:-1;;;;6500:34:44;::::1;-1:-1:-1::0;;;6500:34:44;;;::::1;-1:-1:-1::0;;;;;6500:34:44::1;::::0;;::::1;;::::0;;;::::1;::::0;;6466:77:::1;6634:26;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;6634:31:44::1;6664:1;6634:31:::0;6630:112:::1;;6714:18:::0;::::1;6684:2;:49:::0;;;:29:::1;:49;::::0;;;;6677:56:::1;::::0;::::1;:::i;:::-;6755:163;6791:18:::0;::::1;6819:27;::::0;::::1;;6856:26;::::0;;;::::1;::::0;::::1;;:::i;:::-;6892:18;::::0;;;::::1;::::0;::::1;;:::i;:::-;6755:163;;;;;;;;15035:25:84::0;;;15091:2;15076:18;;15069:34;;;;-1:-1:-1;;;;;15139:31:84;15134:2;15119:18;;15112:59;15214:14;15207:22;15202:2;15187:18;;15180:50;15022:3;15007:19;;14812:424;6755:163:44::1;;;;;;;;4642:2283;;4594:2331;4637:3;;4594:2331;;;;4477:2452:::0;;;:::o;6431:138:61:-;6511:4;4360:21;;;:14;;;:21;;;;;;:26;;6534:28;6527:35;;6431:138;;;;;:::o;6650:115::-;6713:7;6739:19;6747:3;4556:18;;4474:107;7107:129;7181:7;7207:22;7211:3;7223:5;7207:3;:22::i;8871:165::-;-1:-1:-1;;;;;9004:23:61;;8951:4;4360:21;;;:14;;;:21;;;;;;:26;;8974:55;4264:129;5930:123;6000:4;6023:23;6028:3;6040:5;6023:4;:23::i;7776:300::-;7839:16;7867:22;7892:19;7900:3;7892:7;:19::i;:::-;7867:44;7776:300;-1:-1:-1;;;7776:300:61:o;4923:118::-;4990:7;5016:3;:11;;5028:5;5016:18;;;;;;;;:::i;:::-;;;;;;;;;5009:25;;4923:118;;;;:::o;2241:406::-;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:61;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:61;2618:12;;5581:109;5637:16;5672:3;:11;;5665:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5581:109;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;14:180:84;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:84;;14:180;-1:-1:-1;14:180:84:o;199:948::-;248:3;287:4;282:3;278:14;319:5;313:12;308:3;301:25;345:4;395;388:5;384:16;378:23;-1:-1:-1;;;;;488:2:84;474:12;470:21;463:4;458:3;454:14;447:45;553:2;545:4;538:5;534:16;528:23;524:32;517:4;512:3;508:14;501:56;618:2;610:4;603:5;599:16;593:23;589:32;582:4;577:3;573:14;566:56;;;670:4;663:5;659:16;653:23;708:4;701;696:3;692:14;685:28;735:4;768:14;762:21;805:6;799:4;792:20;839:3;834;830:13;821:22;;886:4;870:14;866:25;852:39;;909:1;900:10;;919:201;933:6;930:1;927:13;919:201;;;1000:13;;-1:-1:-1;;;;;996:39:84;982:54;;1095:15;;;;1032:1;948:9;;;;;1058:14;;;;919:201;;;-1:-1:-1;1136:5:84;199:948;-1:-1:-1;;;;;;199:948:84:o;1152:255::-;1329:2;1318:9;1311:21;1292:4;1349:52;1397:2;1386:9;1382:18;1374:6;1349:52;:::i;1412:173::-;1480:20;;-1:-1:-1;;;;;1529:31:84;;1519:42;;1509:70;;1575:1;1572;1565:12;1509:70;1412:173;;;:::o;1590:186::-;1649:6;1702:2;1690:9;1681:7;1677:23;1673:32;1670:52;;;1718:1;1715;1708:12;1670:52;1741:29;1760:9;1741:29;:::i;1781:263::-;1872:5;1866:12;1861:3;1854:25;1836:3;1925:4;1918:5;1914:16;1908:23;1963:4;1956;1951:3;1947:14;1940:28;1984:54;2032:4;2027:3;2023:14;2009:12;1984:54;:::i;:::-;1977:61;1781:263;-1:-1:-1;;;;1781:263:84:o;2049:624::-;2114:3;2145;2177:5;2171:12;2204:6;2199:3;2192:19;2230:4;2259;2254:3;2250:14;2243:21;;2317:4;2307:6;2304:1;2300:14;2293:5;2289:26;2285:37;2356:4;2349:5;2345:16;2379:1;2389:258;2403:6;2400:1;2397:13;2389:258;;;2490:2;2486:7;2478:5;2472:4;2468:16;2464:30;2459:3;2452:43;2516:51;2562:4;2553:6;2547:13;2516:51;:::i;:::-;2625:12;;;;2508:59;-1:-1:-1;2590:15:84;;;;2425:1;2418:9;2389:258;;;-1:-1:-1;2663:4:84;;2049:624;-1:-1:-1;;;;;;;2049:624:84:o;2678:333::-;2917:2;2906:9;2899:21;2880:4;2937:68;3001:2;2990:9;2986:18;2978:6;2937:68;:::i;3016:422::-;3057:3;3095:5;3089:12;3122:6;3117:3;3110:19;3147:1;3157:162;3171:6;3168:1;3165:13;3157:162;;;3233:4;3289:13;;;3285:22;;3279:29;3261:11;;;3257:20;;3250:59;3186:12;3157:162;;;3161:3;3364:1;3357:4;3348:6;3343:3;3339:16;3335:27;3328:38;3427:4;3420:2;3416:7;3411:2;3403:6;3399:15;3395:29;3390:3;3386:39;3382:50;3375:57;;;3016:422;;;;:::o;3443:486::-;3694:2;3683:9;3676:21;3657:4;3720:52;3768:2;3757:9;3753:18;3745:6;3720:52;:::i;:::-;3808:6;3803:2;3792:9;3788:18;3781:34;3863:9;3855:6;3851:22;3846:2;3835:9;3831:18;3824:50;3891:32;3916:6;3908;3891:32;:::i;:::-;3883:40;3443:486;-1:-1:-1;;;;;;3443:486:84:o;4119:273::-;4308:2;4297:9;4290:21;4271:4;4328:58;4382:2;4371:9;4367:18;4359:6;4328:58;:::i;4397:127::-;4458:10;4453:3;4449:20;4446:1;4439:31;4489:4;4486:1;4479:15;4513:4;4510:1;4503:15;4529:275;4600:2;4594:9;4665:2;4646:13;;-1:-1:-1;;4642:27:84;4630:40;;-1:-1:-1;;;;;4685:34:84;;4721:22;;;4682:62;4679:88;;;4747:18;;:::i;:::-;4783:2;4776:22;4529:275;;-1:-1:-1;4529:275:84:o;4809:530::-;4851:5;4904:3;4897:4;4889:6;4885:17;4881:27;4871:55;;4922:1;4919;4912:12;4871:55;4958:6;4945:20;-1:-1:-1;;;;;4980:2:84;4977:26;4974:52;;;5006:18;;:::i;:::-;5050:55;5093:2;5074:13;;-1:-1:-1;;5070:27:84;5099:4;5066:38;5050:55;:::i;:::-;5130:2;5121:7;5114:19;5176:3;5169:4;5164:2;5156:6;5152:15;5148:26;5145:35;5142:55;;;5193:1;5190;5183:12;5142:55;5258:2;5251:4;5243:6;5239:17;5232:4;5223:7;5219:18;5206:55;5306:1;5281:16;;;5299:4;5277:27;5270:38;;;;5285:7;4809:530;-1:-1:-1;;;4809:530:84:o;5344:1287::-;5464:6;5472;5480;5488;5541:3;5529:9;5520:7;5516:23;5512:33;5509:53;;;5558:1;5555;5548:12;5509:53;5594:9;5581:23;5571:33;;5623:2;5676;5665:9;5661:18;5648:32;-1:-1:-1;;;;;5740:2:84;5732:6;5729:14;5726:34;;;5756:1;5753;5746:12;5726:34;5794:6;5783:9;5779:22;5769:32;;5839:7;5832:4;5828:2;5824:13;5820:27;5810:55;;5861:1;5858;5851:12;5810:55;5897:2;5884:16;5919:2;5915;5912:10;5909:36;;;5925:18;;:::i;:::-;5971:2;5968:1;5964:10;5994:28;6018:2;6014;6010:11;5994:28;:::i;:::-;6056:15;;;6126:11;;;6122:20;;;6087:12;;;;6154:19;;;6151:39;;;6186:1;6183;6176:12;6151:39;6210:11;;;;6230:148;6246:6;6241:3;6238:15;6230:148;;;6312:23;6331:3;6312:23;:::i;:::-;6300:36;;6263:12;;;;6356;;;;6230:148;;;6397:5;-1:-1:-1;;;;6449:2:84;6434:18;;6421:32;;-1:-1:-1;6506:2:84;6491:18;;6478:32;;-1:-1:-1;6522:16:84;;;6519:36;;;6551:1;6548;6541:12;6519:36;;;6574:51;6617:7;6606:8;6595:9;6591:24;6574:51;:::i;:::-;6564:61;;;5344:1287;;;;;;;:::o;6636:632::-;6807:2;6859:21;;;6929:13;;6832:18;;;6951:22;;;6778:4;;6807:2;7030:15;;;;7004:2;6989:18;;;6778:4;7073:169;7087:6;7084:1;7081:13;7073:169;;;7148:13;;7136:26;;7217:15;;;;7182:12;;;;7109:1;7102:9;7073:169;;;-1:-1:-1;7259:3:84;;6636:632;-1:-1:-1;;;;;;6636:632:84:o;7273:254::-;7341:6;7349;7402:2;7390:9;7381:7;7377:23;7373:32;7370:52;;;7418:1;7415;7408:12;7370:52;7454:9;7441:23;7431:33;;7483:38;7517:2;7506:9;7502:18;7483:38;:::i;:::-;7473:48;;7273:254;;;;;:::o;7714:248::-;7782:6;7790;7843:2;7831:9;7822:7;7818:23;7814:32;7811:52;;;7859:1;7856;7849:12;7811:52;-1:-1:-1;;7882:23:84;;;7952:2;7937:18;;;7924:32;;-1:-1:-1;7714:248:84:o;7967:414::-;8228:2;8217:9;8210:21;8191:4;8248:68;8312:2;8301:9;8297:18;8289:6;8248:68;:::i;:::-;8240:76;;8366:6;8359:14;8352:22;8347:2;8336:9;8332:18;8325:50;7967:414;;;;;:::o;8386:171::-;8453:20;;-1:-1:-1;;;;;8502:30:84;;8492:41;;8482:69;;8547:1;8544;8537:12;8562:160;8627:20;;8683:13;;8676:21;8666:32;;8656:60;;8712:1;8709;8702:12;8727:458;8818:6;8826;8834;8842;8850;8903:3;8891:9;8882:7;8878:23;8874:33;8871:53;;;8920:1;8917;8910:12;8871:53;8956:9;8943:23;8933:33;;9013:2;9002:9;8998:18;8985:32;8975:42;;9064:2;9053:9;9049:18;9036:32;9026:42;;9087:37;9120:2;9109:9;9105:18;9087:37;:::i;:::-;9077:47;;9143:36;9174:3;9163:9;9159:19;9143:36;:::i;:::-;9133:46;;8727:458;;;;;;;;:::o;9190:650::-;9308:6;9316;9369:2;9357:9;9348:7;9344:23;9340:32;9337:52;;;9385:1;9382;9375:12;9337:52;9425:9;9412:23;-1:-1:-1;;;;;9495:2:84;9487:6;9484:14;9481:34;;;9511:1;9508;9501:12;9481:34;9549:6;9538:9;9534:22;9524:32;;9594:7;9587:4;9583:2;9579:13;9575:27;9565:55;;9616:1;9613;9606:12;9565:55;9656:2;9643:16;9682:2;9674:6;9671:14;9668:34;;;9698:1;9695;9688:12;9668:34;9754:7;9749:2;9741:4;9733:6;9729:17;9725:2;9721:26;9717:35;9714:48;9711:68;;;9775:1;9772;9765:12;9711:68;9806:2;9798:11;;;;;9828:6;;-1:-1:-1;9190:650:84;;-1:-1:-1;;;;9190:650:84:o;9845:219::-;9994:2;9983:9;9976:21;9957:4;10014:44;10054:2;10043:9;10039:18;10031:6;10014:44;:::i;10069:127::-;10130:10;10125:3;10121:20;10118:1;10111:31;10161:4;10158:1;10151:15;10185:4;10182:1;10175:15;10201:127;10262:10;10257:3;10253:20;10250:1;10243:31;10293:4;10290:1;10283:15;10317:4;10314:1;10307:15;10333:201;10371:3;10399:10;10444:2;10437:5;10433:14;10471:2;10462:7;10459:15;10456:41;;10477:18;;:::i;:::-;10526:1;10513:15;;10333:201;-1:-1:-1;;;10333:201:84:o;10539:380::-;10618:1;10614:12;;;;10661;;;10682:61;;10736:4;10728:6;10724:17;10714:27;;10682:61;10789:2;10781:6;10778:14;10758:18;10755:38;10752:161;;10835:10;10830:3;10826:20;10823:1;10816:31;10870:4;10867:1;10860:15;10898:4;10895:1;10888:15;11049:542;11150:2;11145:3;11142:11;11139:446;;;11186:1;11210:5;11207:1;11200:16;11254:4;11251:1;11241:18;11324:2;11312:10;11308:19;11305:1;11301:27;11295:4;11291:38;11360:4;11348:10;11345:20;11342:47;;;-1:-1:-1;11383:4:84;11342:47;11438:2;11433:3;11429:12;11426:1;11422:20;11416:4;11412:31;11402:41;;11493:82;11511:2;11504:5;11501:13;11493:82;;;11556:17;;;11537:1;11526:13;11493:82;;;11497:3;;;11139:446;11049:542;;;:::o;11767:1341::-;11891:3;11885:10;-1:-1:-1;;;;;11910:6:84;11907:30;11904:56;;;11940:18;;:::i;:::-;11969:96;12058:6;12018:38;12050:4;12044:11;12018:38;:::i;:::-;12012:4;11969:96;:::i;:::-;12120:4;;12177:2;12166:14;;12194:1;12189:662;;;;12895:1;12912:6;12909:89;;;-1:-1:-1;12964:19:84;;;12958:26;12909:89;-1:-1:-1;;11724:1:84;11720:11;;;11716:24;11712:29;11702:40;11748:1;11744:11;;;11699:57;13011:81;;12159:943;;12189:662;10996:1;10989:14;;;11033:4;11020:18;;-1:-1:-1;;12225:20:84;;;12342:236;12356:7;12353:1;12350:14;12342:236;;;12445:19;;;12439:26;12424:42;;12537:27;;;;12505:1;12493:14;;;;12372:19;;12342:236;;;12346:3;12606:6;12597:7;12594:19;12591:201;;;12667:19;;;12661:26;-1:-1:-1;;12750:1:84;12746:14;;;12762:3;12742:24;12738:37;12734:42;12719:58;12704:74;;12591:201;-1:-1:-1;;;;;12838:1:84;12822:14;;;12818:22;12805:36;;-1:-1:-1;11767:1341:84:o;13113:931::-;13357:4;13405:3;13394:9;13390:19;13436:6;13425:9;13418:25;13462:2;13500:3;13495:2;13484:9;13480:18;13473:31;13524:6;13559;13553:13;13590:6;13582;13575:22;13628:3;13617:9;13613:19;13606:26;;13667:2;13659:6;13655:15;13641:29;;13688:1;13698:195;13712:6;13709:1;13706:13;13698:195;;;13777:13;;-1:-1:-1;;;;;13773:39:84;13761:52;;13868:15;;;;13833:12;;;;13809:1;13727:9;13698:195;;;13702:3;;13929:6;13924:2;13913:9;13909:18;13902:34;13981:9;13976:3;13972:19;13967:2;13956:9;13952:18;13945:47;14009:29;14034:3;14026:6;14009:29;:::i;:::-;14001:37;13113:931;-1:-1:-1;;;;;;;;;13113:931:84:o;14409:128::-;14476:9;;;14497:11;;;14494:37;;;14511:18;;:::i;14542:125::-;14607:9;;;14628:10;;;14625:36;;;14641:18;;:::i;14672:135::-;14711:3;14732:17;;;14729:43;;14752:18;;:::i;:::-;-1:-1:-1;14799:1:84;14788:13;;14672:135::o;15241:127::-;15302:10;15297:3;15293:20;15290:1;15283:31;15333:4;15330:1;15323:15;15357:4;15354:1;15347:15;15373:184;15431:6;15484:2;15472:9;15463:7;15459:23;15455:32;15452:52;;;15500:1;15497;15490:12;15452:52;15523:28;15541:9;15523:28;:::i;15562:457::-;15793:6;15782:9;15775:25;15836:6;15831:2;15820:9;15816:18;15809:34;-1:-1:-1;;;;;15883:6:84;15879:31;15874:2;15863:9;15859:18;15852:59;15947:3;15942:2;15931:9;15927:18;15920:31;15756:4;15968:45;16008:3;15997:9;15993:19;15985:6;15968:45;:::i;16024:180::-;16080:6;16133:2;16121:9;16112:7;16108:23;16104:32;16101:52;;;16149:1;16146;16139:12;16101:52;16172:26;16188:9;16172:26;:::i","linkReferences":{}},"methodIdentifiers":{"allocateStream(bytes32,address[],bytes32,bytes)":"6b883c39","getAllStreamIds()":"86789fc6","getAllStreams()":"3bd84c0c","getPaginatedStreams(uint256,uint256)":"ca78c41a","getStream(bytes32)":"1290abe8","getStreamByIndex(uint256)":"68b454df","getStreamCount()":"c0f22084","getStreamWithGenesis(bytes32)":"3c2544d1","getStreamsOnNode(address)":"32705ac4","placeStreamOnNode(bytes32,address)":"9ee86d38","removeStreamFromNode(bytes32,address)":"ee885b12","setStreamLastMiniblock(bytes32,bytes32,bytes32,uint64,bool)":"d7a3158a","setStreamLastMiniblockBatch((bytes32,bytes32,bytes32,uint64,bool)[])":"ff3a14ab"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"genesisMiniblockHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"genesisMiniblock\",\"type\":\"bytes\"}],\"name\":\"StreamAllocated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"StreamLastMiniblockUpdateFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isSealed\",\"type\":\"bool\"}],\"name\":\"StreamLastMiniblockUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isAdded\",\"type\":\"bool\"}],\"name\":\"StreamPlacementUpdated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"},{\"internalType\":\"bytes32\",\"name\":\"genesisMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"genesisMiniblock\",\"type\":\"bytes\"}],\"name\":\"allocateStream\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllStreamIds\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllStreams\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"stream\",\"type\":\"tuple\"}],\"internalType\":\"struct StreamWithId[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"start\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stop\",\"type\":\"uint256\"}],\"name\":\"getPaginatedStreams\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"stream\",\"type\":\"tuple\"}],\"internalType\":\"struct StreamWithId[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"}],\"name\":\"getStream\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"i\",\"type\":\"uint256\"}],\"name\":\"getStreamByIndex\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"stream\",\"type\":\"tuple\"}],\"internalType\":\"struct StreamWithId\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStreamCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"}],\"name\":\"getStreamWithGenesis\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"getStreamsOnNode\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"stream\",\"type\":\"tuple\"}],\"internalType\":\"struct StreamWithId[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"placeStreamOnNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"removeStreamFromNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isSealed\",\"type\":\"bool\"}],\"name\":\"setStreamLastMiniblock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"prevMiniBlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isSealed\",\"type\":\"bool\"}],\"internalType\":\"struct SetMiniblock[]\",\"name\":\"miniblocks\",\"type\":\"tuple[]\"}],\"name\":\"setStreamLastMiniblockBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAllStreamIds()\":{\"details\":\"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.\"},\"getAllStreams()\":{\"details\":\"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.\"},\"getPaginatedStreams(uint256,uint256)\":{\"details\":\"Recommended range is 5000 streams, returns true if on the last page.\"},\"getStreamWithGenesis(bytes32)\":{\"returns\":{\"_0\":\"stream, genesisMiniblockHash, genesisMiniblock\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAllStreamIds()\":{\"notice\":\"Return array containing all stream ids\"},\"getAllStreams()\":{\"notice\":\"Return array containing all streams\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/river/registry/facets/stream/StreamRegistry.sol\":\"StreamRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/river/registry/facets/stream/IStreamRegistry.sol\":{\"keccak256\":\"0x6065b337e753c34ff06f91172aa92e473fe3e7a74bfea20e30eb79f349a338c5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://db641411b66939873b494e5914cd06955b03bdc278d784675c4e4035027f32a4\",\"dweb:/ipfs/QmRkaPZSa1stxb9XKiD6WKwEZmcaqqYXi8DQzGaZiBtKhd\"]},\"contracts/src/river/registry/facets/stream/StreamRegistry.sol\":{\"keccak256\":\"0xc54bdda2a2add8c10aa260a4921eb7c6e00bedea05370bb1b0b6794dff089d53\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a04f114efbf72b82368386acefd175c426103a3fd4fc06b1098f8aad5b22346e\",\"dweb:/ipfs/QmT8z1QQjYmZjYSFoGAJAoCU7AvZuADDzYfEUBBFXXhydX\"]},\"contracts/src/river/registry/libraries/RegistryErrors.sol\":{\"keccak256\":\"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3\",\"dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy\"]},\"contracts/src/river/registry/libraries/RegistryStorage.sol\":{\"keccak256\":\"0x63c17d46ed41fb58a08d84b2159db6ab7a19a4e1e1e636129b7cdd5f3d83c51c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7633256f01d2ffea41292d8f0b259d6f33a61ef362026d649a3e6955f53eec4c\",\"dweb:/ipfs/QmSYCB6CWCjQMqVeSG7yqy72tr7SkPSRkfzpz6FnK33XqZ\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32","indexed":false},{"internalType":"address[]","name":"nodes","type":"address[]","indexed":false},{"internalType":"bytes32","name":"genesisMiniblockHash","type":"bytes32","indexed":false},{"internalType":"bytes","name":"genesisMiniblock","type":"bytes","indexed":false}],"type":"event","name":"StreamAllocated","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32","indexed":false},{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32","indexed":false},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64","indexed":false},{"internalType":"string","name":"reason","type":"string","indexed":false}],"type":"event","name":"StreamLastMiniblockUpdateFailed","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32","indexed":false},{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32","indexed":false},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64","indexed":false},{"internalType":"bool","name":"isSealed","type":"bool","indexed":false}],"type":"event","name":"StreamLastMiniblockUpdated","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32","indexed":false},{"internalType":"address","name":"nodeAddress","type":"address","indexed":false},{"internalType":"bool","name":"isAdded","type":"bool","indexed":false}],"type":"event","name":"StreamPlacementUpdated","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"},{"internalType":"address[]","name":"nodes","type":"address[]"},{"internalType":"bytes32","name":"genesisMiniblockHash","type":"bytes32"},{"internalType":"bytes","name":"genesisMiniblock","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"allocateStream"},{"inputs":[],"stateMutability":"view","type":"function","name":"getAllStreamIds","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getAllStreams","outputs":[{"internalType":"struct StreamWithId[]","name":"","type":"tuple[]","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"struct Stream","name":"stream","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]}]},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"stateMutability":"view","type":"function","name":"getPaginatedStreams","outputs":[{"internalType":"struct StreamWithId[]","name":"","type":"tuple[]","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"struct Stream","name":"stream","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]},{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getStream","outputs":[{"internalType":"struct Stream","name":"","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"stateMutability":"view","type":"function","name":"getStreamByIndex","outputs":[{"internalType":"struct StreamWithId","name":"","type":"tuple","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"struct Stream","name":"stream","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getStreamCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getStreamWithGenesis","outputs":[{"internalType":"struct Stream","name":"","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"view","type":"function","name":"getStreamsOnNode","outputs":[{"internalType":"struct StreamWithId[]","name":"","type":"tuple[]","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"struct Stream","name":"stream","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]}]},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"},{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"placeStreamOnNode"},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"},{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeStreamFromNode"},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"bool","name":"isSealed","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setStreamLastMiniblock"},{"inputs":[{"internalType":"struct SetMiniblock[]","name":"miniblocks","type":"tuple[]","components":[{"internalType":"bytes32","name":"streamId","type":"bytes32"},{"internalType":"bytes32","name":"prevMiniBlockHash","type":"bytes32"},{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"bool","name":"isSealed","type":"bool"}]}],"stateMutability":"nonpayable","type":"function","name":"setStreamLastMiniblockBatch"}],"devdoc":{"kind":"dev","methods":{"getAllStreamIds()":{"details":"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block."},"getAllStreams()":{"details":"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block."},"getPaginatedStreams(uint256,uint256)":{"details":"Recommended range is 5000 streams, returns true if on the last page."},"getStreamWithGenesis(bytes32)":{"returns":{"_0":"stream, genesisMiniblockHash, genesisMiniblock"}}},"version":1},"userdoc":{"kind":"user","methods":{"getAllStreamIds()":{"notice":"Return array containing all stream ids"},"getAllStreams()":{"notice":"Return array containing all streams"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/river/registry/facets/stream/StreamRegistry.sol":"StreamRegistry"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/river/registry/facets/stream/IStreamRegistry.sol":{"keccak256":"0x6065b337e753c34ff06f91172aa92e473fe3e7a74bfea20e30eb79f349a338c5","urls":["bzz-raw://db641411b66939873b494e5914cd06955b03bdc278d784675c4e4035027f32a4","dweb:/ipfs/QmRkaPZSa1stxb9XKiD6WKwEZmcaqqYXi8DQzGaZiBtKhd"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/stream/StreamRegistry.sol":{"keccak256":"0xc54bdda2a2add8c10aa260a4921eb7c6e00bedea05370bb1b0b6794dff089d53","urls":["bzz-raw://a04f114efbf72b82368386acefd175c426103a3fd4fc06b1098f8aad5b22346e","dweb:/ipfs/QmT8z1QQjYmZjYSFoGAJAoCU7AvZuADDzYfEUBBFXXhydX"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryErrors.sol":{"keccak256":"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc","urls":["bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3","dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryStorage.sol":{"keccak256":"0x63c17d46ed41fb58a08d84b2159db6ab7a19a4e1e1e636129b7cdd5f3d83c51c","urls":["bzz-raw://7633256f01d2ffea41292d8f0b259d6f33a61ef362026d649a3e6955f53eec4c","dweb:/ipfs/QmSYCB6CWCjQMqVeSG7yqy72tr7SkPSRkfzpz6FnK33XqZ"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":44} \ No newline at end of file diff --git a/packages/generated/dev/abis/StreamRegistry.metadata.json b/packages/generated/dev/abis/StreamRegistry.metadata.json new file mode 100644 index 000000000..a35635cf1 --- /dev/null +++ b/packages/generated/dev/abis/StreamRegistry.metadata.json @@ -0,0 +1,724 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]", + "indexed": false + }, + { + "internalType": "bytes32", + "name": "genesisMiniblockHash", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "bytes", + "name": "genesisMiniblock", + "type": "bytes", + "indexed": false + } + ], + "type": "event", + "name": "StreamAllocated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64", + "indexed": false + }, + { + "internalType": "string", + "name": "reason", + "type": "string", + "indexed": false + } + ], + "type": "event", + "name": "StreamLastMiniblockUpdateFailed", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64", + "indexed": false + }, + { + "internalType": "bool", + "name": "isSealed", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "StreamLastMiniblockUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": false + }, + { + "internalType": "bool", + "name": "isAdded", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "StreamPlacementUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + }, + { + "internalType": "bytes32", + "name": "genesisMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "genesisMiniblock", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "allocateStream" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllStreamIds", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllStreams", + "outputs": [ + { + "internalType": "struct StreamWithId[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "struct Stream", + "name": "stream", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stop", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getPaginatedStreams", + "outputs": [ + { + "internalType": "struct StreamWithId[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "struct Stream", + "name": "stream", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + }, + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getStream", + "outputs": [ + { + "internalType": "struct Stream", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "i", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getStreamByIndex", + "outputs": [ + { + "internalType": "struct StreamWithId", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "struct Stream", + "name": "stream", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getStreamCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getStreamWithGenesis", + "outputs": [ + { + "internalType": "struct Stream", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getStreamsOnNode", + "outputs": [ + { + "internalType": "struct StreamWithId[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "struct Stream", + "name": "stream", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "placeStreamOnNode" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeStreamFromNode" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "isSealed", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setStreamLastMiniblock" + }, + { + "inputs": [ + { + "internalType": "struct SetMiniblock[]", + "name": "miniblocks", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "prevMiniBlockHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "isSealed", + "type": "bool" + } + ] + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setStreamLastMiniblockBatch" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "getAllStreamIds()": { + "details": "WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block." + }, + "getAllStreams()": { + "details": "WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block." + }, + "getPaginatedStreams(uint256,uint256)": { + "details": "Recommended range is 5000 streams, returns true if on the last page." + }, + "getStreamWithGenesis(bytes32)": { + "returns": { + "_0": "stream, genesisMiniblockHash, genesisMiniblock" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getAllStreamIds()": { + "notice": "Return array containing all stream ids" + }, + "getAllStreams()": { + "notice": "Return array containing all streams" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/river/registry/facets/stream/StreamRegistry.sol": "StreamRegistry" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/river/registry/facets/stream/IStreamRegistry.sol": { + "keccak256": "0x6065b337e753c34ff06f91172aa92e473fe3e7a74bfea20e30eb79f349a338c5", + "urls": [ + "bzz-raw://db641411b66939873b494e5914cd06955b03bdc278d784675c4e4035027f32a4", + "dweb:/ipfs/QmRkaPZSa1stxb9XKiD6WKwEZmcaqqYXi8DQzGaZiBtKhd" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/stream/StreamRegistry.sol": { + "keccak256": "0xc54bdda2a2add8c10aa260a4921eb7c6e00bedea05370bb1b0b6794dff089d53", + "urls": [ + "bzz-raw://a04f114efbf72b82368386acefd175c426103a3fd4fc06b1098f8aad5b22346e", + "dweb:/ipfs/QmT8z1QQjYmZjYSFoGAJAoCU7AvZuADDzYfEUBBFXXhydX" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryErrors.sol": { + "keccak256": "0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc", + "urls": [ + "bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3", + "dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryStorage.sol": { + "keccak256": "0x63c17d46ed41fb58a08d84b2159db6ab7a19a4e1e1e636129b7cdd5f3d83c51c", + "urls": [ + "bzz-raw://7633256f01d2ffea41292d8f0b259d6f33a61ef362026d649a3e6955f53eec4c", + "dweb:/ipfs/QmSYCB6CWCjQMqVeSG7yqy72tr7SkPSRkfzpz6FnK33XqZ" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/TokenPausableFacet.abi.json b/packages/generated/dev/abis/TokenPausableFacet.abi.json new file mode 100644 index 000000000..e20082f02 --- /dev/null +++ b/packages/generated/dev/abis/TokenPausableFacet.abi.json @@ -0,0 +1,166 @@ +[ + { + "type": "function", + "name": "__Pausable_init", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "pause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "paused", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "unpause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/TokenPausableFacet.abi.ts b/packages/generated/dev/abis/TokenPausableFacet.abi.ts new file mode 100644 index 000000000..198ce6401 --- /dev/null +++ b/packages/generated/dev/abis/TokenPausableFacet.abi.ts @@ -0,0 +1,166 @@ +export default [ + { + "type": "function", + "name": "__Pausable_init", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "pause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "paused", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "unpause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + } +] as const diff --git a/packages/generated/dev/abis/TokenPausableFacet.bin b/packages/generated/dev/abis/TokenPausableFacet.bin new file mode 100644 index 000000000..d3e43377e --- /dev/null +++ b/packages/generated/dev/abis/TokenPausableFacet.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b610391806100d36000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80633f4ba83a146100515780635c975abb1461005b5780638456cb591461007757806384d2023a1461007f575b600080fd5b610059610087565b005b610063610101565b604051901515815260200160405180910390f35b610059610121565b610059610195565b61008f6101df565b6001600160a01b0316336001600160a01b0316146100c7576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6000805160206103718339815191525460ff166100f757604051632ca4452d60e11b815260040160405180910390fd5b6100ff6102a9565b565b600061011c6000805160206103718339815191525460ff1690565b905090565b6101296101df565b6001600160a01b0316336001600160a01b03161461015c576040516365f4906560e01b81523360048201526024016100be565b6000805160206103718339815191525460ff161561018d576040516302ca8ced60e11b815260040160405180910390fd5b6100ff6102f6565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166100f757604051630ef4733760e31b815260040160405180910390fd5b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa15801561027f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102a39190610340565b91505090565b600080516020610371833981519152805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b600080516020610371833981519152805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016102ec565b60006020828403121561035257600080fd5b81516001600160a01b038116811461036957600080fd5b939250505056fee17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb00 \ No newline at end of file diff --git a/packages/generated/dev/abis/TokenPausableFacet.json b/packages/generated/dev/abis/TokenPausableFacet.json new file mode 100644 index 000000000..5e77391dc --- /dev/null +++ b/packages/generated/dev/abis/TokenPausableFacet.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__Pausable_init","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"pause","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"unpause","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]},{"type":"error","name":"Pausable__NotPaused","inputs":[]},{"type":"error","name":"Pausable__Paused","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b610391806100d36000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80633f4ba83a146100515780635c975abb1461005b5780638456cb591461007757806384d2023a1461007f575b600080fd5b610059610087565b005b610063610101565b604051901515815260200160405180910390f35b610059610121565b610059610195565b61008f6101df565b6001600160a01b0316336001600160a01b0316146100c7576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6000805160206103718339815191525460ff166100f757604051632ca4452d60e11b815260040160405180910390fd5b6100ff6102a9565b565b600061011c6000805160206103718339815191525460ff1690565b905090565b6101296101df565b6001600160a01b0316336001600160a01b03161461015c576040516365f4906560e01b81523360048201526024016100be565b6000805160206103718339815191525460ff161561018d576040516302ca8ced60e11b815260040160405180910390fd5b6100ff6102f6565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166100f757604051630ef4733760e31b815260040160405180910390fd5b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa15801561027f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102a39190610340565b91505090565b600080516020610371833981519152805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b600080516020610371833981519152805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016102ec565b60006020828403121561035257600080fd5b81516001600160a01b038116811461036957600080fd5b939250505056fee17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb00","sourceMap":"432:393:112:-:0;;;;;;;;;;;;-1:-1:-1;385:22:71;:20;:22::i;:::-;432:393:112;;1653:314:85;303:66:86;1779:14:85;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:85;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:85;1898:16;1886:28;;;;;1927:29;;158:42:516;;;1927:29:85;;146:2:516;131:18;1927:29:85;;;;;;;1844:119;1694:273;1653:314::o;14:192:516:-;432:393:112;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80633f4ba83a146100515780635c975abb1461005b5780638456cb591461007757806384d2023a1461007f575b600080fd5b610059610087565b005b610063610101565b604051901515815260200160405180910390f35b610059610121565b610059610195565b61008f6101df565b6001600160a01b0316336001600160a01b0316146100c7576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6000805160206103718339815191525460ff166100f757604051632ca4452d60e11b815260040160405180910390fd5b6100ff6102a9565b565b600061011c6000805160206103718339815191525460ff1690565b905090565b6101296101df565b6001600160a01b0316336001600160a01b03161461015c576040516365f4906560e01b81523360048201526024016100be565b6000805160206103718339815191525460ff161561018d576040516302ca8ced60e11b815260040160405180910390fd5b6100ff6102f6565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166100f757604051630ef4733760e31b815260040160405180910390fd5b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa15801561027f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102a39190610340565b91505090565b600080516020610371833981519152805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b600080516020610371833981519152805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016102ec565b60006020828403121561035257600080fd5b81516001600160a01b038116811461036957600080fd5b939250505056fee17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb00","sourceMap":"432:393:112:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;753:70;;;:::i;:::-;;602:74;;;:::i;:::-;;;179:14:516;;172:22;154:41;;142:2;127:18;602:74:112;;;;;;;680:69;;;:::i;524:74::-;;;:::i;753:70::-;648:8:105;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:105;:10;-1:-1:-1;;;;;634:22:105;;630:79;;673:29;;-1:-1:-1;;;673:29:105;;691:10;673:29;;;352:51:516;325:18;;673:29:105;;;;;;;;630:79;-1:-1:-1;;;;;;;;;;;526:31:109;;;391:59:::1;;422:21;;-1:-1:-1::0;;;422:21:109::1;;;;;;;;;;;391:59;808:10:112::2;:8;:10::i;:::-;753:70::o:0;602:74::-;643:4;662:9;-1:-1:-1;;;;;;;;;;;526:31:109;;;;465:97;662:9:112;655:16;;602:74;:::o;680:69::-;648:8:105;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:105;:10;-1:-1:-1;;;;;634:22:105;;630:79;;673:29;;-1:-1:-1;;;673:29:105;;691:10;673:29;;;352:51:516;325:18;;673:29:105;206:203:516;630:79:105;-1:-1:-1;;;;;;;;;;;526:31:109;;;293:55:::1;;;323:18;;-1:-1:-1::0;;;323:18:109::1;;;;;;;;;;;293:55;736:8:112::2;:6;:8::i;524:74::-:0;303:66:86;1263:42:85;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:85;;;;;;;;;;;724:189:105;786:67;;;;;;;;302:66:107;786:67:105;-1:-1:-1;;;;;786:67:105;;;;;;;;;;;;;866:42;;-1:-1:-1;;;866:42:105;;;;;560:25:516;;;;866:42:105;;765:13;;866:30;;533:18:516;;;;;866:42:105;;;;;;786:67;866:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;859:49;;;724:189;:::o;675:110:109:-;-1:-1:-1;;;;;;;;;;;710:39:109;;-1:-1:-1;;710:39:109;;;760:20;;769:10;352:51:516;;760:20:109;;340:2:516;325:18;760:20:109;;;;;;;;675:110::o;566:105::-;-1:-1:-1;;;;;;;;;;;599:38:109;;-1:-1:-1;;599:38:109;633:4;599:38;;;648:18;;655:10;352:51:516;;648:18:109;;340:2:516;325:18;648::109;206:203:516;596:290;666:6;719:2;707:9;698:7;694:23;690:32;687:52;;;735:1;732;725:12;687:52;761:16;;-1:-1:-1;;;;;806:31:516;;796:42;;786:70;;852:1;849;842:12;786:70;875:5;596:290;-1:-1:-1;;;596:290:516:o","linkReferences":{}},"methodIdentifiers":{"__Pausable_init()":"84d2023a","pause()":"8456cb59","paused()":"5c975abb","unpause()":"3f4ba83a"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__Paused\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__Pausable_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/diamond/facets/pausable/token/TokenPausableFacet.sol\":\"TokenPausableFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol\":{\"keccak256\":\"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f\",\"dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol\":{\"keccak256\":\"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5\",\"dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol\":{\"keccak256\":\"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc\",\"dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf\"]},\"contracts/src/diamond/facets/pausable/IPausable.sol\":{\"keccak256\":\"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6\",\"dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM\"]},\"contracts/src/diamond/facets/pausable/PausableBase.sol\":{\"keccak256\":\"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c\",\"dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1\"]},\"contracts/src/diamond/facets/pausable/PausableStorage.sol\":{\"keccak256\":\"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b\",\"dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL\"]},\"contracts/src/diamond/facets/pausable/token/TokenPausableFacet.sol\":{\"keccak256\":\"0xffb85d866efe6f2ce412c5b69807a50a1a54ae87b9dbe0781d2fcf5bd8974afd\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://529f7b9557969a32fafe9d97d1ac61391f11a3d2272117dd8b979ca50ba5d366\",\"dweb:/ipfs/QmZbTjaJb5j8Bnn4KJ73sq72S6Qe8WhxpFD8Bdf8kw826V\"]},\"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[],"type":"error","name":"Pausable__NotPaused"},{"inputs":[],"type":"error","name":"Pausable__Paused"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"__Pausable_init"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"pause"},{"inputs":[],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"unpause"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/diamond/facets/pausable/token/TokenPausableFacet.sol":"TokenPausableFacet"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol":{"keccak256":"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d","urls":["bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f","dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol":{"keccak256":"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a","urls":["bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5","dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol":{"keccak256":"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0","urls":["bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc","dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/IPausable.sol":{"keccak256":"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261","urls":["bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6","dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableBase.sol":{"keccak256":"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438","urls":["bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c","dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableStorage.sol":{"keccak256":"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07","urls":["bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b","dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/token/TokenPausableFacet.sol":{"keccak256":"0xffb85d866efe6f2ce412c5b69807a50a1a54ae87b9dbe0781d2fcf5bd8974afd","urls":["bzz-raw://529f7b9557969a32fafe9d97d1ac61391f11a3d2272117dd8b979ca50ba5d366","dweb:/ipfs/QmZbTjaJb5j8Bnn4KJ73sq72S6Qe8WhxpFD8Bdf8kw826V"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"keccak256":"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4","urls":["bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7","dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"}},"version":1},"id":112} \ No newline at end of file diff --git a/packages/generated/dev/abis/TokenPausableFacet.metadata.json b/packages/generated/dev/abis/TokenPausableFacet.metadata.json new file mode 100644 index 000000000..a81a8a8df --- /dev/null +++ b/packages/generated/dev/abis/TokenPausableFacet.metadata.json @@ -0,0 +1,345 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__NotPaused" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__Paused" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Paused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Unpaused", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "__Pausable_init" + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "pause" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "unpause" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/diamond/facets/pausable/token/TokenPausableFacet.sol": "TokenPausableFacet" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol": { + "keccak256": "0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d", + "urls": [ + "bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f", + "dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol": { + "keccak256": "0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a", + "urls": [ + "bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5", + "dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol": { + "keccak256": "0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0", + "urls": [ + "bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc", + "dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/IPausable.sol": { + "keccak256": "0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261", + "urls": [ + "bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6", + "dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableBase.sol": { + "keccak256": "0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438", + "urls": [ + "bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c", + "dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableStorage.sol": { + "keccak256": "0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07", + "urls": [ + "bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b", + "dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/token/TokenPausableFacet.sol": { + "keccak256": "0xffb85d866efe6f2ce412c5b69807a50a1a54ae87b9dbe0781d2fcf5bd8974afd", + "urls": [ + "bzz-raw://529f7b9557969a32fafe9d97d1ac61391f11a3d2272117dd8b979ca50ba5d366", + "dweb:/ipfs/QmZbTjaJb5j8Bnn4KJ73sq72S6Qe8WhxpFD8Bdf8kw826V" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4", + "urls": [ + "bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7", + "dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/UserEntitlement.abi.json b/packages/generated/dev/abis/UserEntitlement.abi.json new file mode 100644 index 000000000..01f1074f2 --- /dev/null +++ b/packages/generated/dev/abis/UserEntitlement.abi.json @@ -0,0 +1,331 @@ +[ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "SPACE_ADDRESS", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "UPGRADE_INTERFACE_VERSION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "description", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEntitlementDataByRoleId", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "_space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isCrosschain", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "isEntitled", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "wallets", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "permission", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "moduleType", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "proxiableUUID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "entitlementData", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "supportsInterface", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "upgradeToAndCall", + "inputs": [ + { + "name": "newImplementation", + "type": "address", + "internalType": "address" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Upgraded", + "inputs": [ + { + "name": "implementation", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967InvalidImplementation", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967NonPayable", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidInitialization", + "inputs": [] + }, + { + "type": "error", + "name": "NotInitializing", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnauthorizedCallContext", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnsupportedProxiableUUID", + "inputs": [ + { + "name": "slot", + "type": "bytes32", + "internalType": "bytes32" + } + ] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/UserEntitlement.abi.ts b/packages/generated/dev/abis/UserEntitlement.abi.ts new file mode 100644 index 000000000..b205f05e7 --- /dev/null +++ b/packages/generated/dev/abis/UserEntitlement.abi.ts @@ -0,0 +1,331 @@ +export default [ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "SPACE_ADDRESS", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "UPGRADE_INTERFACE_VERSION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "description", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEntitlementDataByRoleId", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "_space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isCrosschain", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "isEntitled", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "wallets", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "permission", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "moduleType", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "proxiableUUID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "entitlementData", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "supportsInterface", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "upgradeToAndCall", + "inputs": [ + { + "name": "newImplementation", + "type": "address", + "internalType": "address" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Upgraded", + "inputs": [ + { + "name": "implementation", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967InvalidImplementation", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967NonPayable", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidInitialization", + "inputs": [] + }, + { + "type": "error", + "name": "NotInitializing", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnauthorizedCallContext", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnsupportedProxiableUUID", + "inputs": [ + { + "name": "slot", + "type": "bytes32", + "internalType": "bytes32" + } + ] + } +] as const diff --git a/packages/generated/dev/abis/UserEntitlement.bin b/packages/generated/dev/abis/UserEntitlement.bin new file mode 100644 index 000000000..168c94bcb --- /dev/null +++ b/packages/generated/dev/abis/UserEntitlement.bin @@ -0,0 +1 @@ +60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051611ae36100fd60003960008181610aa101528181610aca0152610c410152611ae36000f3fe6080604052600436106100dd5760003560e01c806352d1902d1161007f578063ad3cb1cc11610059578063ad3cb1cc146102a0578063c4d66de8146102d1578063ef8be574146102f1578063f0c111f91461031157600080fd5b806352d1902d146102015780636465e69f146102245780637284e4161461025f57600080fd5b80631eee07b2116100bb5780631eee07b2146101805780632e1b61e4146101a057806334322eff146101b45780634f1ef286146101ec57600080fd5b806301ffc9a7146100e257806306fdde03146101175780630cf0b53314610160575b600080fd5b3480156100ee57600080fd5b506101026100fd3660046113fc565b610331565b60405190151581526020015b60405180910390f35b34801561012357600080fd5b506101536040518060400160405280601081526020016f155cd95c88115b9d1a5d1b195b595b9d60821b81525081565b60405161010e9190611476565b34801561016c57600080fd5b5061010261017b3660046115ac565b610368565b34801561018c57600080fd5b5061015361019b3660046115fb565b610393565b3480156101ac57600080fd5b506000610102565b3480156101c057600080fd5b506000546101d4906001600160a01b031681565b6040516001600160a01b03909116815260200161010e565b6101ff6101fa36600461163b565b6103d1565b005b34801561020d57600080fd5b506102166103f0565b60405190815260200161010e565b34801561023057600080fd5b506101536040518060400160405280600f81526020016e155cd95c915b9d1a5d1b195b595b9d608a1b81525081565b34801561026b57600080fd5b5061015360405180604001604052806015815260200174456e7469746c656d656e7420666f7220757365727360581b81525081565b3480156102ac57600080fd5b50610153604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156102dd57600080fd5b506101ff6102ec3660046116c6565b61040d565b3480156102fd57600080fd5b506101ff61030c3660046116e1565b610545565b34801561031d57600080fd5b506101ff61032c3660046115fb565b6107bb565b60006001600160e01b03198216637bc2cb4560e11b148061036257506301ffc9a760e01b6001600160e01b03198316145b92915050565b600083156103825761037b84848461090b565b905061038c565b61037b8383610a36565b9392505050565b6060600160008381526020019081526020016000206002016040516020016103bb919061175c565b6040516020818303038152906040529050919050565b6103d9610a96565b6103e282610b3d565b6103ec8282610b74565b5050565b60006103fa610c36565b50600080516020611ac383398151915290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156104525750825b90506000826001600160401b0316600114801561046e5750303b155b90508115801561047c575080155b1561049a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156104c457845460ff60401b1916600160401b1785555b6104cc610c7f565b6104d4610c7f565b6104dc610c7f565b600080546001600160a01b0319166001600160a01b038816179055831561053d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b6000546001600160a01b0316336001600160a01b03161461057957604051630ce39a4b60e21b815260040160405180910390fd5b6000610587828401846117ac565b905060005b81518110156105ef5760008282815181106105a9576105a96117e8565b6020026020010151905060006001600160a01b0316816001600160a01b0316036105e6576040516372bbc80f60e11b815260040160405180910390fd5b5060010161058c565b505b600084815260016020526040902060020154156106a157600084815260016020819052604082206002018054909161062891611814565b81548110610638576106386117e8565b6000918252602090912001546001600160a01b031690506106598186610c87565b600085815260016020526040902060020180548061067957610679611827565b600082815260209020810160001990810180546001600160a01b0319169055019055506105f1565b6000848152600160208190526040822080546001600160a01b0319168155908101829055906106d36002830182611364565b505060405180606001604052806106e73390565b6001600160a01b0390811682524260208084019190915260409283018590526000888152600180835290849020855181546001600160a01b03191694169390931783558482015190830155918301518051919261074c92600285019290910190611382565b5090505060005b81518110156107b45760026000838381518110610772576107726117e8565b6020908102919091018101516001600160a01b031682528181019290925260400160009081208054600181810183559183529290912090910186905501610753565b5050505050565b6000546001600160a01b0316336001600160a01b0316146107ef57604051630ce39a4b60e21b815260040160405180910390fd5b6000818152600160205260409020546001600160a01b0316610824576040516372bbc80f60e11b815260040160405180910390fd5b600081815260016020526040902060020154156108d457600081815260016020819052604082206002018054909161085b91611814565b8154811061086b5761086b6117e8565b6000918252602090912001546001600160a01b0316905061088c8183610c87565b60008281526001602052604090206002018054806108ac576108ac611827565b600082815260209020810160001990810180546001600160a01b031916905501905550610824565b6000818152600160208190526040822080546001600160a01b0319168155908101829055906109066002830182611364565b505050565b6000805460405163418e15c160e11b81526004810186905282916001600160a01b03169063831c2b8290602401600060405180830381865afa158015610955573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261097d9190810190611882565b9050600061098a85610d95565b905060005b826060015151811015610a2c576000836060015182815181106109b4576109b46117e8565b6020026020010151905060005b8351811015610a2257818482815181106109dd576109dd6117e8565b6020026020010151148015610a105750610a10848281518110610a0257610a026117e8565b602002602001015188611055565b15610a1a57600195505b6001016109c1565b505060010161098f565b5050509392505050565b600080610a4284610d95565b905060005b8151811015610a8b57610a73828281518110610a6557610a656117e8565b602002602001015185611055565b15610a8357600192505050610362565b600101610a47565b506000949350505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610b1d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b11600080516020611ac3833981519152546001600160a01b031690565b6001600160a01b031614155b15610b3b5760405163703e46dd60e11b815260040160405180910390fd5b565b6000546001600160a01b0316336001600160a01b031614610b7157604051630ce39a4b60e21b815260040160405180910390fd5b50565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610bce575060408051601f3d908101601f19168201909252610bcb9181019061198a565b60015b610bfb57604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b600080516020611ac38339815191528114610c2c57604051632a87526960e21b815260048101829052602401610bf2565b6109068383611146565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3b5760405163703e46dd60e11b815260040160405180910390fd5b610b3b61119c565b6001600160a01b0382166000908152600260205260408120905b8154811015610d4c5782828281548110610cbd57610cbd6117e8565b906000526020600020015403610d445781548290610cdd90600190611814565b81548110610ced57610ced6117e8565b9060005260206000200154828281548110610d0a57610d0a6117e8565b906000526020600020018190555081805480610d2857610d28611827565b6001900381819060005260206000200160009055905550505050565b600101610ca1565b5060405162461bcd60e51b815260206004820152601e60248201527f526f6c65204944206e6f7420666f756e6420666f7220746865207573657200006044820152606401610bf2565b60606000805b8351811015610dfb5760026000858381518110610dba57610dba6117e8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905082610df191906119a3565b9150600101610d9b565b50600160005260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e054610e3290826119a3565b90506000816001600160401b03811115610e4e57610e4e611489565b604051908082528060200260200182016040528015610e77578160200160208202803683370190505b5090506000805b8551811015610f7957600060026000888481518110610e9f57610e9f6117e8565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f1157602002820191906000526020600020905b815481526020019060010190808311610efd575b5050505050905060005b8151811015610f6f57818181518110610f3657610f366117e8565b6020026020010151858580610f4a906119b6565b965081518110610f5c57610f5c6117e8565b6020908102919091010152600101610f1b565b5050600101610e7e565b5060016000908152600260209081527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e08054604080518285028101850190915281815292830182828015610fec57602002820191906000526020600020905b815481526020019060010190808311610fd8575b5050505050905060005b815181101561104a57818181518110611011576110116117e8565b6020026020010151848480611025906119b6565b955081518110611037576110376117e8565b6020908102919091010152600101610ff6565b509195945050505050565b6000805460405163b426423360e01b81526004810185905282916001600160a01b03169063b426423390602401600060405180830381865afa15801561109f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110c791908101906119cf565b805190915060005b8181101561113a5760008382815181106110eb576110eb6117e8565b60200260200101516040516020016111039190611a7f565b60405160208183030381529060405261111b90611a9b565b9050858103611131576001945050505050610362565b506001016110cf565b50600095945050505050565b61114f826111e5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561119457610906828261124a565b6103ec6112c0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b3b57604051631afcd79f60e31b815260040160405180910390fd5b806001600160a01b03163b60000361121b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610bf2565b600080516020611ac383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516112679190611a7f565b600060405180830381855af49150503d80600081146112a2576040519150601f19603f3d011682016040523d82523d6000602084013e6112a7565b606091505b50915091506112b78583836112df565b95945050505050565b3415610b3b5760405163b398979f60e01b815260040160405180910390fd5b6060826112f4576112ef8261133b565b61038c565b815115801561130b57506001600160a01b0384163b155b1561133457604051639996b31560e01b81526001600160a01b0385166004820152602401610bf2565b508061038c565b80511561134b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610b7191906113e7565b8280548282559060005260206000209081019282156113d7579160200282015b828111156113d757825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906113a2565b506113e39291506113e7565b5090565b5b808211156113e357600081556001016113e8565b60006020828403121561140e57600080fd5b81356001600160e01b03198116811461038c57600080fd5b60005b83811015611441578181015183820152602001611429565b50506000910152565b60008151808452611462816020860160208601611426565b601f01601f19169290920160200192915050565b60208152600061038c602083018461144a565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156114c1576114c1611489565b60405290565b604051601f8201601f191681016001600160401b03811182821017156114ef576114ef611489565b604052919050565b60006001600160401b0382111561151057611510611489565b5060051b60200190565b80356001600160a01b038116811461153157600080fd5b919050565b600082601f83011261154757600080fd5b8135602061155c611557836114f7565b6114c7565b8083825260208201915060208460051b87010193508684111561157e57600080fd5b602086015b848110156115a1576115948161151a565b8352918301918301611583565b509695505050505050565b6000806000606084860312156115c157600080fd5b8335925060208401356001600160401b038111156115de57600080fd5b6115ea86828701611536565b925050604084013590509250925092565b60006020828403121561160d57600080fd5b5035919050565b60006001600160401b0382111561162d5761162d611489565b50601f01601f191660200190565b6000806040838503121561164e57600080fd5b6116578361151a565b915060208301356001600160401b0381111561167257600080fd5b8301601f8101851361168357600080fd5b803561169161155782611614565b8181528660208385010111156116a657600080fd5b816020840160208301376000602083830101528093505050509250929050565b6000602082840312156116d857600080fd5b61038c8261151a565b6000806000604084860312156116f657600080fd5b8335925060208401356001600160401b038082111561171457600080fd5b818601915086601f83011261172857600080fd5b81358181111561173757600080fd5b87602082850101111561174957600080fd5b6020830194508093505050509250925092565b6020808252825482820181905260008481528281209092916040850190845b818110156117a05783546001600160a01b03168352600193840193928501920161177b565b50909695505050505050565b6000602082840312156117be57600080fd5b81356001600160401b038111156117d457600080fd5b6117e084828501611536565b949350505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610362576103626117fe565b634e487b7160e01b600052603160045260246000fd5b600082601f83011261184e57600080fd5b815161185c61155782611614565b81815284602083860101111561187157600080fd5b6117e0826020830160208701611426565b6000602080838503121561189557600080fd5b82516001600160401b03808211156118ac57600080fd5b90840190608082870312156118c057600080fd5b6118c861149f565b825181528383015180151581146118de57600080fd5b818501526040830151828111156118f457600080fd5b6119008882860161183d565b60408301525060608301518281111561191857600080fd5b80840193505086601f84011261192d57600080fd5b8251915061193d611557836114f7565b82815260059290921b8301840191848101908884111561195c57600080fd5b938501935b8385101561197a57845182529385019390850190611961565b6060830152509695505050505050565b60006020828403121561199c57600080fd5b5051919050565b80820180821115610362576103626117fe565b6000600182016119c8576119c86117fe565b5060010190565b600060208083850312156119e257600080fd5b82516001600160401b03808211156119f957600080fd5b818501915085601f830112611a0d57600080fd5b8151611a1b611557826114f7565b81815260059190911b83018401908481019088831115611a3a57600080fd5b8585015b83811015611a7257805185811115611a565760008081fd5b611a648b89838a010161183d565b845250918601918601611a3e565b5098975050505050505050565b60008251611a91818460208701611426565b9190910192915050565b80516020808301519190811015611abc576000198160200360031b1b821691505b5091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc \ No newline at end of file diff --git a/packages/generated/dev/abis/UserEntitlement.json b/packages/generated/dev/abis/UserEntitlement.json new file mode 100644 index 000000000..4620df2f6 --- /dev/null +++ b/packages/generated/dev/abis/UserEntitlement.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"SPACE_ADDRESS","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"UPGRADE_INTERFACE_VERSION","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"description","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"getEntitlementDataByRoleId","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"_space","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isCrosschain","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"type":"function","name":"isEntitled","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"},{"name":"wallets","type":"address[]","internalType":"address[]"},{"name":"permission","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"moduleType","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"removeEntitlement","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setEntitlement","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"entitlementData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967InvalidImplementation","inputs":[{"name":"implementation","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967NonPayable","inputs":[]},{"type":"error","name":"Entitlement__InvalidValue","inputs":[]},{"type":"error","name":"Entitlement__NotAllowed","inputs":[]},{"type":"error","name":"Entitlement__NotMember","inputs":[]},{"type":"error","name":"Entitlement__ValueAlreadyExists","inputs":[]},{"type":"error","name":"FailedInnerCall","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"UUPSUnauthorizedCallContext","inputs":[]},{"type":"error","name":"UUPSUnsupportedProxiableUUID","inputs":[{"name":"slot","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051611ae36100fd60003960008181610aa101528181610aca0152610c410152611ae36000f3fe6080604052600436106100dd5760003560e01c806352d1902d1161007f578063ad3cb1cc11610059578063ad3cb1cc146102a0578063c4d66de8146102d1578063ef8be574146102f1578063f0c111f91461031157600080fd5b806352d1902d146102015780636465e69f146102245780637284e4161461025f57600080fd5b80631eee07b2116100bb5780631eee07b2146101805780632e1b61e4146101a057806334322eff146101b45780634f1ef286146101ec57600080fd5b806301ffc9a7146100e257806306fdde03146101175780630cf0b53314610160575b600080fd5b3480156100ee57600080fd5b506101026100fd3660046113fc565b610331565b60405190151581526020015b60405180910390f35b34801561012357600080fd5b506101536040518060400160405280601081526020016f155cd95c88115b9d1a5d1b195b595b9d60821b81525081565b60405161010e9190611476565b34801561016c57600080fd5b5061010261017b3660046115ac565b610368565b34801561018c57600080fd5b5061015361019b3660046115fb565b610393565b3480156101ac57600080fd5b506000610102565b3480156101c057600080fd5b506000546101d4906001600160a01b031681565b6040516001600160a01b03909116815260200161010e565b6101ff6101fa36600461163b565b6103d1565b005b34801561020d57600080fd5b506102166103f0565b60405190815260200161010e565b34801561023057600080fd5b506101536040518060400160405280600f81526020016e155cd95c915b9d1a5d1b195b595b9d608a1b81525081565b34801561026b57600080fd5b5061015360405180604001604052806015815260200174456e7469746c656d656e7420666f7220757365727360581b81525081565b3480156102ac57600080fd5b50610153604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156102dd57600080fd5b506101ff6102ec3660046116c6565b61040d565b3480156102fd57600080fd5b506101ff61030c3660046116e1565b610545565b34801561031d57600080fd5b506101ff61032c3660046115fb565b6107bb565b60006001600160e01b03198216637bc2cb4560e11b148061036257506301ffc9a760e01b6001600160e01b03198316145b92915050565b600083156103825761037b84848461090b565b905061038c565b61037b8383610a36565b9392505050565b6060600160008381526020019081526020016000206002016040516020016103bb919061175c565b6040516020818303038152906040529050919050565b6103d9610a96565b6103e282610b3d565b6103ec8282610b74565b5050565b60006103fa610c36565b50600080516020611ac383398151915290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156104525750825b90506000826001600160401b0316600114801561046e5750303b155b90508115801561047c575080155b1561049a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156104c457845460ff60401b1916600160401b1785555b6104cc610c7f565b6104d4610c7f565b6104dc610c7f565b600080546001600160a01b0319166001600160a01b038816179055831561053d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b6000546001600160a01b0316336001600160a01b03161461057957604051630ce39a4b60e21b815260040160405180910390fd5b6000610587828401846117ac565b905060005b81518110156105ef5760008282815181106105a9576105a96117e8565b6020026020010151905060006001600160a01b0316816001600160a01b0316036105e6576040516372bbc80f60e11b815260040160405180910390fd5b5060010161058c565b505b600084815260016020526040902060020154156106a157600084815260016020819052604082206002018054909161062891611814565b81548110610638576106386117e8565b6000918252602090912001546001600160a01b031690506106598186610c87565b600085815260016020526040902060020180548061067957610679611827565b600082815260209020810160001990810180546001600160a01b0319169055019055506105f1565b6000848152600160208190526040822080546001600160a01b0319168155908101829055906106d36002830182611364565b505060405180606001604052806106e73390565b6001600160a01b0390811682524260208084019190915260409283018590526000888152600180835290849020855181546001600160a01b03191694169390931783558482015190830155918301518051919261074c92600285019290910190611382565b5090505060005b81518110156107b45760026000838381518110610772576107726117e8565b6020908102919091018101516001600160a01b031682528181019290925260400160009081208054600181810183559183529290912090910186905501610753565b5050505050565b6000546001600160a01b0316336001600160a01b0316146107ef57604051630ce39a4b60e21b815260040160405180910390fd5b6000818152600160205260409020546001600160a01b0316610824576040516372bbc80f60e11b815260040160405180910390fd5b600081815260016020526040902060020154156108d457600081815260016020819052604082206002018054909161085b91611814565b8154811061086b5761086b6117e8565b6000918252602090912001546001600160a01b0316905061088c8183610c87565b60008281526001602052604090206002018054806108ac576108ac611827565b600082815260209020810160001990810180546001600160a01b031916905501905550610824565b6000818152600160208190526040822080546001600160a01b0319168155908101829055906109066002830182611364565b505050565b6000805460405163418e15c160e11b81526004810186905282916001600160a01b03169063831c2b8290602401600060405180830381865afa158015610955573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261097d9190810190611882565b9050600061098a85610d95565b905060005b826060015151811015610a2c576000836060015182815181106109b4576109b46117e8565b6020026020010151905060005b8351811015610a2257818482815181106109dd576109dd6117e8565b6020026020010151148015610a105750610a10848281518110610a0257610a026117e8565b602002602001015188611055565b15610a1a57600195505b6001016109c1565b505060010161098f565b5050509392505050565b600080610a4284610d95565b905060005b8151811015610a8b57610a73828281518110610a6557610a656117e8565b602002602001015185611055565b15610a8357600192505050610362565b600101610a47565b506000949350505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610b1d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b11600080516020611ac3833981519152546001600160a01b031690565b6001600160a01b031614155b15610b3b5760405163703e46dd60e11b815260040160405180910390fd5b565b6000546001600160a01b0316336001600160a01b031614610b7157604051630ce39a4b60e21b815260040160405180910390fd5b50565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610bce575060408051601f3d908101601f19168201909252610bcb9181019061198a565b60015b610bfb57604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b600080516020611ac38339815191528114610c2c57604051632a87526960e21b815260048101829052602401610bf2565b6109068383611146565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3b5760405163703e46dd60e11b815260040160405180910390fd5b610b3b61119c565b6001600160a01b0382166000908152600260205260408120905b8154811015610d4c5782828281548110610cbd57610cbd6117e8565b906000526020600020015403610d445781548290610cdd90600190611814565b81548110610ced57610ced6117e8565b9060005260206000200154828281548110610d0a57610d0a6117e8565b906000526020600020018190555081805480610d2857610d28611827565b6001900381819060005260206000200160009055905550505050565b600101610ca1565b5060405162461bcd60e51b815260206004820152601e60248201527f526f6c65204944206e6f7420666f756e6420666f7220746865207573657200006044820152606401610bf2565b60606000805b8351811015610dfb5760026000858381518110610dba57610dba6117e8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905082610df191906119a3565b9150600101610d9b565b50600160005260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e054610e3290826119a3565b90506000816001600160401b03811115610e4e57610e4e611489565b604051908082528060200260200182016040528015610e77578160200160208202803683370190505b5090506000805b8551811015610f7957600060026000888481518110610e9f57610e9f6117e8565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f1157602002820191906000526020600020905b815481526020019060010190808311610efd575b5050505050905060005b8151811015610f6f57818181518110610f3657610f366117e8565b6020026020010151858580610f4a906119b6565b965081518110610f5c57610f5c6117e8565b6020908102919091010152600101610f1b565b5050600101610e7e565b5060016000908152600260209081527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e08054604080518285028101850190915281815292830182828015610fec57602002820191906000526020600020905b815481526020019060010190808311610fd8575b5050505050905060005b815181101561104a57818181518110611011576110116117e8565b6020026020010151848480611025906119b6565b955081518110611037576110376117e8565b6020908102919091010152600101610ff6565b509195945050505050565b6000805460405163b426423360e01b81526004810185905282916001600160a01b03169063b426423390602401600060405180830381865afa15801561109f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110c791908101906119cf565b805190915060005b8181101561113a5760008382815181106110eb576110eb6117e8565b60200260200101516040516020016111039190611a7f565b60405160208183030381529060405261111b90611a9b565b9050858103611131576001945050505050610362565b506001016110cf565b50600095945050505050565b61114f826111e5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561119457610906828261124a565b6103ec6112c0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b3b57604051631afcd79f60e31b815260040160405180910390fd5b806001600160a01b03163b60000361121b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610bf2565b600080516020611ac383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516112679190611a7f565b600060405180830381855af49150503d80600081146112a2576040519150601f19603f3d011682016040523d82523d6000602084013e6112a7565b606091505b50915091506112b78583836112df565b95945050505050565b3415610b3b5760405163b398979f60e01b815260040160405180910390fd5b6060826112f4576112ef8261133b565b61038c565b815115801561130b57506001600160a01b0384163b155b1561133457604051639996b31560e01b81526001600160a01b0385166004820152602401610bf2565b508061038c565b80511561134b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610b7191906113e7565b8280548282559060005260206000209081019282156113d7579160200282015b828111156113d757825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906113a2565b506113e39291506113e7565b5090565b5b808211156113e357600081556001016113e8565b60006020828403121561140e57600080fd5b81356001600160e01b03198116811461038c57600080fd5b60005b83811015611441578181015183820152602001611429565b50506000910152565b60008151808452611462816020860160208601611426565b601f01601f19169290920160200192915050565b60208152600061038c602083018461144a565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156114c1576114c1611489565b60405290565b604051601f8201601f191681016001600160401b03811182821017156114ef576114ef611489565b604052919050565b60006001600160401b0382111561151057611510611489565b5060051b60200190565b80356001600160a01b038116811461153157600080fd5b919050565b600082601f83011261154757600080fd5b8135602061155c611557836114f7565b6114c7565b8083825260208201915060208460051b87010193508684111561157e57600080fd5b602086015b848110156115a1576115948161151a565b8352918301918301611583565b509695505050505050565b6000806000606084860312156115c157600080fd5b8335925060208401356001600160401b038111156115de57600080fd5b6115ea86828701611536565b925050604084013590509250925092565b60006020828403121561160d57600080fd5b5035919050565b60006001600160401b0382111561162d5761162d611489565b50601f01601f191660200190565b6000806040838503121561164e57600080fd5b6116578361151a565b915060208301356001600160401b0381111561167257600080fd5b8301601f8101851361168357600080fd5b803561169161155782611614565b8181528660208385010111156116a657600080fd5b816020840160208301376000602083830101528093505050509250929050565b6000602082840312156116d857600080fd5b61038c8261151a565b6000806000604084860312156116f657600080fd5b8335925060208401356001600160401b038082111561171457600080fd5b818601915086601f83011261172857600080fd5b81358181111561173757600080fd5b87602082850101111561174957600080fd5b6020830194508093505050509250925092565b6020808252825482820181905260008481528281209092916040850190845b818110156117a05783546001600160a01b03168352600193840193928501920161177b565b50909695505050505050565b6000602082840312156117be57600080fd5b81356001600160401b038111156117d457600080fd5b6117e084828501611536565b949350505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610362576103626117fe565b634e487b7160e01b600052603160045260246000fd5b600082601f83011261184e57600080fd5b815161185c61155782611614565b81815284602083860101111561187157600080fd5b6117e0826020830160208701611426565b6000602080838503121561189557600080fd5b82516001600160401b03808211156118ac57600080fd5b90840190608082870312156118c057600080fd5b6118c861149f565b825181528383015180151581146118de57600080fd5b818501526040830151828111156118f457600080fd5b6119008882860161183d565b60408301525060608301518281111561191857600080fd5b80840193505086601f84011261192d57600080fd5b8251915061193d611557836114f7565b82815260059290921b8301840191848101908884111561195c57600080fd5b938501935b8385101561197a57845182529385019390850190611961565b6060830152509695505050505050565b60006020828403121561199c57600080fd5b5051919050565b80820180821115610362576103626117fe565b6000600182016119c8576119c86117fe565b5060010190565b600060208083850312156119e257600080fd5b82516001600160401b03808211156119f957600080fd5b818501915085601f830112611a0d57600080fd5b8151611a1b611557826114f7565b81815260059190911b83018401908481019088831115611a3a57600080fd5b8585015b83811015611a7257805185811115611a565760008081fd5b611a648b89838a010161183d565b845250918601918601611a3e565b5098975050505050505050565b60008251611a91818460208701611426565b9190910192915050565b80516020808301519190811015611abc576000198160200360031b1b821691505b5091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","sourceMap":"859:8747:191:-:0;;;1171:4:397;1128:48;;1819:47:191;;;;;;;;;-1:-1:-1;1839:22:191;:20;:22::i;:::-;859:8747;;7711:422:396;8870:21;7900:15;;;;;;;7896:76;;;7938:23;;-1:-1:-1;;;7938:23:396;;;;;;;;;;;7896:76;7985:14;;-1:-1:-1;;;;;7985:14:396;;;:34;7981:146;;8035:33;;-1:-1:-1;;;;;;8035:33:396;-1:-1:-1;;;;;8035:33:396;;;;;8087:29;;158:50:516;;;8087:29:396;;146:2:516;131:18;8087:29:396;;;;;;;7981:146;7760:373;7711:422::o;14:200:516:-;859:8747:191;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106100dd5760003560e01c806352d1902d1161007f578063ad3cb1cc11610059578063ad3cb1cc146102a0578063c4d66de8146102d1578063ef8be574146102f1578063f0c111f91461031157600080fd5b806352d1902d146102015780636465e69f146102245780637284e4161461025f57600080fd5b80631eee07b2116100bb5780631eee07b2146101805780632e1b61e4146101a057806334322eff146101b45780634f1ef286146101ec57600080fd5b806301ffc9a7146100e257806306fdde03146101175780630cf0b53314610160575b600080fd5b3480156100ee57600080fd5b506101026100fd3660046113fc565b610331565b60405190151581526020015b60405180910390f35b34801561012357600080fd5b506101536040518060400160405280601081526020016f155cd95c88115b9d1a5d1b195b595b9d60821b81525081565b60405161010e9190611476565b34801561016c57600080fd5b5061010261017b3660046115ac565b610368565b34801561018c57600080fd5b5061015361019b3660046115fb565b610393565b3480156101ac57600080fd5b506000610102565b3480156101c057600080fd5b506000546101d4906001600160a01b031681565b6040516001600160a01b03909116815260200161010e565b6101ff6101fa36600461163b565b6103d1565b005b34801561020d57600080fd5b506102166103f0565b60405190815260200161010e565b34801561023057600080fd5b506101536040518060400160405280600f81526020016e155cd95c915b9d1a5d1b195b595b9d608a1b81525081565b34801561026b57600080fd5b5061015360405180604001604052806015815260200174456e7469746c656d656e7420666f7220757365727360581b81525081565b3480156102ac57600080fd5b50610153604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156102dd57600080fd5b506101ff6102ec3660046116c6565b61040d565b3480156102fd57600080fd5b506101ff61030c3660046116e1565b610545565b34801561031d57600080fd5b506101ff61032c3660046115fb565b6107bb565b60006001600160e01b03198216637bc2cb4560e11b148061036257506301ffc9a760e01b6001600160e01b03198316145b92915050565b600083156103825761037b84848461090b565b905061038c565b61037b8383610a36565b9392505050565b6060600160008381526020019081526020016000206002016040516020016103bb919061175c565b6040516020818303038152906040529050919050565b6103d9610a96565b6103e282610b3d565b6103ec8282610b74565b5050565b60006103fa610c36565b50600080516020611ac383398151915290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156104525750825b90506000826001600160401b0316600114801561046e5750303b155b90508115801561047c575080155b1561049a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156104c457845460ff60401b1916600160401b1785555b6104cc610c7f565b6104d4610c7f565b6104dc610c7f565b600080546001600160a01b0319166001600160a01b038816179055831561053d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b6000546001600160a01b0316336001600160a01b03161461057957604051630ce39a4b60e21b815260040160405180910390fd5b6000610587828401846117ac565b905060005b81518110156105ef5760008282815181106105a9576105a96117e8565b6020026020010151905060006001600160a01b0316816001600160a01b0316036105e6576040516372bbc80f60e11b815260040160405180910390fd5b5060010161058c565b505b600084815260016020526040902060020154156106a157600084815260016020819052604082206002018054909161062891611814565b81548110610638576106386117e8565b6000918252602090912001546001600160a01b031690506106598186610c87565b600085815260016020526040902060020180548061067957610679611827565b600082815260209020810160001990810180546001600160a01b0319169055019055506105f1565b6000848152600160208190526040822080546001600160a01b0319168155908101829055906106d36002830182611364565b505060405180606001604052806106e73390565b6001600160a01b0390811682524260208084019190915260409283018590526000888152600180835290849020855181546001600160a01b03191694169390931783558482015190830155918301518051919261074c92600285019290910190611382565b5090505060005b81518110156107b45760026000838381518110610772576107726117e8565b6020908102919091018101516001600160a01b031682528181019290925260400160009081208054600181810183559183529290912090910186905501610753565b5050505050565b6000546001600160a01b0316336001600160a01b0316146107ef57604051630ce39a4b60e21b815260040160405180910390fd5b6000818152600160205260409020546001600160a01b0316610824576040516372bbc80f60e11b815260040160405180910390fd5b600081815260016020526040902060020154156108d457600081815260016020819052604082206002018054909161085b91611814565b8154811061086b5761086b6117e8565b6000918252602090912001546001600160a01b0316905061088c8183610c87565b60008281526001602052604090206002018054806108ac576108ac611827565b600082815260209020810160001990810180546001600160a01b031916905501905550610824565b6000818152600160208190526040822080546001600160a01b0319168155908101829055906109066002830182611364565b505050565b6000805460405163418e15c160e11b81526004810186905282916001600160a01b03169063831c2b8290602401600060405180830381865afa158015610955573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261097d9190810190611882565b9050600061098a85610d95565b905060005b826060015151811015610a2c576000836060015182815181106109b4576109b46117e8565b6020026020010151905060005b8351811015610a2257818482815181106109dd576109dd6117e8565b6020026020010151148015610a105750610a10848281518110610a0257610a026117e8565b602002602001015188611055565b15610a1a57600195505b6001016109c1565b505060010161098f565b5050509392505050565b600080610a4284610d95565b905060005b8151811015610a8b57610a73828281518110610a6557610a656117e8565b602002602001015185611055565b15610a8357600192505050610362565b600101610a47565b506000949350505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610b1d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b11600080516020611ac3833981519152546001600160a01b031690565b6001600160a01b031614155b15610b3b5760405163703e46dd60e11b815260040160405180910390fd5b565b6000546001600160a01b0316336001600160a01b031614610b7157604051630ce39a4b60e21b815260040160405180910390fd5b50565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610bce575060408051601f3d908101601f19168201909252610bcb9181019061198a565b60015b610bfb57604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b600080516020611ac38339815191528114610c2c57604051632a87526960e21b815260048101829052602401610bf2565b6109068383611146565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3b5760405163703e46dd60e11b815260040160405180910390fd5b610b3b61119c565b6001600160a01b0382166000908152600260205260408120905b8154811015610d4c5782828281548110610cbd57610cbd6117e8565b906000526020600020015403610d445781548290610cdd90600190611814565b81548110610ced57610ced6117e8565b9060005260206000200154828281548110610d0a57610d0a6117e8565b906000526020600020018190555081805480610d2857610d28611827565b6001900381819060005260206000200160009055905550505050565b600101610ca1565b5060405162461bcd60e51b815260206004820152601e60248201527f526f6c65204944206e6f7420666f756e6420666f7220746865207573657200006044820152606401610bf2565b60606000805b8351811015610dfb5760026000858381518110610dba57610dba6117e8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905082610df191906119a3565b9150600101610d9b565b50600160005260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e054610e3290826119a3565b90506000816001600160401b03811115610e4e57610e4e611489565b604051908082528060200260200182016040528015610e77578160200160208202803683370190505b5090506000805b8551811015610f7957600060026000888481518110610e9f57610e9f6117e8565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f1157602002820191906000526020600020905b815481526020019060010190808311610efd575b5050505050905060005b8151811015610f6f57818181518110610f3657610f366117e8565b6020026020010151858580610f4a906119b6565b965081518110610f5c57610f5c6117e8565b6020908102919091010152600101610f1b565b5050600101610e7e565b5060016000908152600260209081527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e08054604080518285028101850190915281815292830182828015610fec57602002820191906000526020600020905b815481526020019060010190808311610fd8575b5050505050905060005b815181101561104a57818181518110611011576110116117e8565b6020026020010151848480611025906119b6565b955081518110611037576110376117e8565b6020908102919091010152600101610ff6565b509195945050505050565b6000805460405163b426423360e01b81526004810185905282916001600160a01b03169063b426423390602401600060405180830381865afa15801561109f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110c791908101906119cf565b805190915060005b8181101561113a5760008382815181106110eb576110eb6117e8565b60200260200101516040516020016111039190611a7f565b60405160208183030381529060405261111b90611a9b565b9050858103611131576001945050505050610362565b506001016110cf565b50600095945050505050565b61114f826111e5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561119457610906828261124a565b6103ec6112c0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b3b57604051631afcd79f60e31b815260040160405180910390fd5b806001600160a01b03163b60000361121b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610bf2565b600080516020611ac383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516112679190611a7f565b600060405180830381855af49150503d80600081146112a2576040519150601f19603f3d011682016040523d82523d6000602084013e6112a7565b606091505b50915091506112b78583836112df565b95945050505050565b3415610b3b5760405163b398979f60e01b815260040160405180910390fd5b6060826112f4576112ef8261133b565b61038c565b815115801561130b57506001600160a01b0384163b155b1561133457604051639996b31560e01b81526001600160a01b0385166004820152602401610bf2565b508061038c565b80511561134b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610b7191906113e7565b8280548282559060005260206000209081019282156113d7579160200282015b828111156113d757825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906113a2565b506113e39291506113e7565b5090565b5b808211156113e357600081556001016113e8565b60006020828403121561140e57600080fd5b81356001600160e01b03198116811461038c57600080fd5b60005b83811015611441578181015183820152602001611429565b50506000910152565b60008151808452611462816020860160208601611426565b601f01601f19169290920160200192915050565b60208152600061038c602083018461144a565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156114c1576114c1611489565b60405290565b604051601f8201601f191681016001600160401b03811182821017156114ef576114ef611489565b604052919050565b60006001600160401b0382111561151057611510611489565b5060051b60200190565b80356001600160a01b038116811461153157600080fd5b919050565b600082601f83011261154757600080fd5b8135602061155c611557836114f7565b6114c7565b8083825260208201915060208460051b87010193508684111561157e57600080fd5b602086015b848110156115a1576115948161151a565b8352918301918301611583565b509695505050505050565b6000806000606084860312156115c157600080fd5b8335925060208401356001600160401b038111156115de57600080fd5b6115ea86828701611536565b925050604084013590509250925092565b60006020828403121561160d57600080fd5b5035919050565b60006001600160401b0382111561162d5761162d611489565b50601f01601f191660200190565b6000806040838503121561164e57600080fd5b6116578361151a565b915060208301356001600160401b0381111561167257600080fd5b8301601f8101851361168357600080fd5b803561169161155782611614565b8181528660208385010111156116a657600080fd5b816020840160208301376000602083830101528093505050509250929050565b6000602082840312156116d857600080fd5b61038c8261151a565b6000806000604084860312156116f657600080fd5b8335925060208401356001600160401b038082111561171457600080fd5b818601915086601f83011261172857600080fd5b81358181111561173757600080fd5b87602082850101111561174957600080fd5b6020830194508093505050509250925092565b6020808252825482820181905260008481528281209092916040850190845b818110156117a05783546001600160a01b03168352600193840193928501920161177b565b50909695505050505050565b6000602082840312156117be57600080fd5b81356001600160401b038111156117d457600080fd5b6117e084828501611536565b949350505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610362576103626117fe565b634e487b7160e01b600052603160045260246000fd5b600082601f83011261184e57600080fd5b815161185c61155782611614565b81815284602083860101111561187157600080fd5b6117e0826020830160208701611426565b6000602080838503121561189557600080fd5b82516001600160401b03808211156118ac57600080fd5b90840190608082870312156118c057600080fd5b6118c861149f565b825181528383015180151581146118de57600080fd5b818501526040830151828111156118f457600080fd5b6119008882860161183d565b60408301525060608301518281111561191857600080fd5b80840193505086601f84011261192d57600080fd5b8251915061193d611557836114f7565b82815260059290921b8301840191848101908884111561195c57600080fd5b938501935b8385101561197a57845182529385019390850190611961565b6060830152509695505050505050565b60006020828403121561199c57600080fd5b5051919050565b80820180821115610362576103626117fe565b6000600182016119c8576119c86117fe565b5060010190565b600060208083850312156119e257600080fd5b82516001600160401b03808211156119f957600080fd5b818501915085601f830112611a0d57600080fd5b8151611a1b611557826114f7565b81815260059190911b83018401908481019088831115611a3a57600080fd5b8585015b83811015611a7257805185811115611a565760008081fd5b611a648b89838a010161183d565b845250918601918601611a3e565b5098975050505050505050565b60008251611a91818460208701611426565b9190910192915050565b80516020808301519190811015611abc576000198160200360031b1b821691505b5091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","sourceMap":"859:8747:191:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2267:214;;;;;;;;;;-1:-1:-1;2267:214:191;;;;;:::i;:::-;;:::i;:::-;;;470:14:516;;463:22;445:41;;433:2;418:18;2267:214:191;;;;;;;;1470:48;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1470:48:191;;;;;;;;;;;;:::i;2634:379::-;;;;;;;;;;-1:-1:-1;2634:379:191;;;;;:::i;:::-;;:::i;4599:161::-;;;;;;;;;;-1:-1:-1;4599:161:191;;;;;:::i;:::-;;:::i;2515:85::-;;;;;;;;;;-1:-1:-1;2571:4:191;2515:85;;1089:28;;;;;;;;;;-1:-1:-1;1089:28:191;;;;-1:-1:-1;;;;;1089:28:191;;;;;;-1:-1:-1;;;;;4029:32:516;;;4011:51;;3999:2;3984:18;1089:28:191;3865:203:516;4158:214:397;;;;;;:::i;:::-;;:::i;:::-;;3705:134;;;;;;;;;;;;;:::i;:::-;;;5160:25:516;;;5148:2;5133:18;3705:134:397;5014:177:516;1586:53:191;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1586:53:191;;;;;1522:60;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1522:60:191;;;;;1819:58:397;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1819:58:397;;;;;1870:162:191;;;;;;;;;;-1:-1:-1;1870:162:191;;;;;:::i;:::-;;:::i;3047:949::-;;;;;;;;;;-1:-1:-1;3047:949:191;;;;;:::i;:::-;;:::i;4030:535::-;;;;;;;;;;-1:-1:-1;4030:535:191;;;;;:::i;:::-;;:::i;2267:214::-;2360:4;-1:-1:-1;;;;;;2385:45:191;;-1:-1:-1;;;2385:45:191;;:91;;-1:-1:-1;;;;;;;;;;1133:40:399;;;2440:36:191;2372:104;2267:214;-1:-1:-1;;2267:214:191:o;2634:379::-;2758:4;2843:23;;2839:170;;2883:52;2904:9;2915:7;2924:10;2883:20;:52::i;:::-;2876:59;;;;2839:170;2963:39;2982:7;2991:10;2963:18;:39::i;2839:170::-;2634:379;;;;;:::o;4599:161::-;4682:12;4720:20;:28;4741:6;4720:28;;;;;;;;;;;:34;;4709:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;4702:53;;4599:161;;;:::o;4158:214:397:-;2653:13;:11;:13::i;:::-;4273:36:::1;4291:17;4273;:36::i;:::-;4319:46;4341:17;4360:4;4319:21;:46::i;:::-;4158:214:::0;;:::o;3705:134::-;3774:7;2924:20;:18;:20::i;:::-;-1:-1:-1;;;;;;;;;;;;3705:134:397;:::o;1870:162:191:-;8870:21:396;4302:15;;-1:-1:-1;;;4302:15:396;;;;4301:16;;-1:-1:-1;;;;;4348:14:396;4158:30;4726:16;;:34;;;;;4746:14;4726:34;4706:54;;4770:17;4790:11;-1:-1:-1;;;;;4790:16:396;4805:1;4790:16;:50;;;;-1:-1:-1;4818:4:396;4810:25;:30;4790:50;4770:70;;4856:12;4855:13;:30;;;;;4873:12;4872:13;4855:30;4851:91;;;4908:23;;-1:-1:-1;;;4908:23:396;;;;;;;;;;;4851:91;4951:18;;-1:-1:-1;;4951:18:396;4968:1;4951:18;;;4979:67;;;;5013:22;;-1:-1:-1;;;;5013:22:396;-1:-1:-1;;;5013:22:396;;;4979:67;1931:24:191::1;:22;:24::i;:::-;1961:15;:13;:15::i;:::-;1982:16;:14;:16::i;:::-;2005:13;:22:::0;;-1:-1:-1;;;;;;2005:22:191::1;-1:-1:-1::0;;;;;2005:22:191;::::1;;::::0;;5066:101:396;;;;5100:23;;-1:-1:-1;;;;5100:23:396;;;5142:14;;-1:-1:-1;6890:50:516;;5142:14:396;;6878:2:516;6863:18;5142:14:396;;;;;;;5066:101;4092:1081;;;;;1870:162:191;:::o;3047:949::-;1691:13;;-1:-1:-1;;;;;1691:13:191;966:10:398;-1:-1:-1;;;;;1675:29:191;;1671:82;;1721:25;;-1:-1:-1;;;1721:25:191;;;;;;;;;;;1671:82;3156:22:::1;3181:40;::::0;;::::1;3192:15:::0;3181:40:::1;:::i;:::-;3156:65;;3233:9;3228:165;3252:5;:12;3248:1;:16;3228:165;;;3279:12;3294:5;3300:1;3294:8;;;;;;;;:::i;:::-;;;;;;;3279:23;;3330:1;-1:-1:-1::0;;;;;3314:18:191::1;:4;-1:-1:-1::0;;;;;3314:18:191::1;::::0;3310:77:::1;;3351:27;;-1:-1:-1::0;;;3351:27:191::1;;;;;;;;;;;3310:77;-1:-1:-1::0;3266:3:191::1;;3228:165;;;;3436:272;3487:1;3443:28:::0;;;:20:::1;:28;::::0;;;;:34:::1;;:41:::0;:45;3436:272:::1;;3498:12;3513:28:::0;;;:20:::1;:28;::::0;;;;;;:34:::1;;3557:41:::0;;3513:34;;3557:45:::1;::::0;::::1;:::i;:::-;3513:97;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;3513:97:191::1;::::0;-1:-1:-1;3618:35:191::1;3513:97:::0;3646:6;3618:21:::1;:35::i;:::-;3661:28;::::0;;;:20:::1;:28;::::0;;;;:34:::1;;:40:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;3661:40:191;;;;;-1:-1:-1;;;;;;3661:40:191::1;::::0;;;;;-1:-1:-1;3436:272:191::1;;;3720:28;::::0;;;:20:::1;:28;::::0;;;;;;3713:35;;-1:-1:-1;;;;;;3713:35:191::1;::::0;;;;::::1;::::0;;;3720:28;3713:35:::1;;::::0;::::1;3720:28:::0;3713:35:::1;:::i;:::-;;;3786:106;;;;;;;;3817:12;966:10:398::0;;887:96;3817:12:191::1;-1:-1:-1::0;;;;;3786:106:191;;::::1;::::0;;3850:15:::1;3786:106;::::0;;::::1;::::0;;;;;;;;;;;-1:-1:-1;3755:28:191;;;:20:::1;:28:::0;;;;;;;:137;;;;-1:-1:-1;;;;;;3755:137:191::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;:28;;:137:::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;;;;;3903:9;3898:94;3922:5;:12;3918:1;:16;3898:94;;;3949:13;:23;3963:5;3969:1;3963:8;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;3949:23:191::1;::::0;;;;::::1;::::0;;;;;;-1:-1:-1;3949:23:191;;;:36;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;;;3936:3:::1;3898:94;;;;3150:846;3047:949:::0;;;:::o;4030:535::-;1691:13;;-1:-1:-1;;;;;1691:13:191;966:10:398;-1:-1:-1;;;;;1675:29:191;;1671:82;;1721:25;;-1:-1:-1;;;1721:25:191;;;;;;;;;;;1671:82;4152:1:::1;4102:28:::0;;;:20:::1;:28;::::0;;;;:38;-1:-1:-1;;;;;4102:38:191::1;4098:107;;4171:27;;-1:-1:-1::0;;;4171:27:191::1;;;;;;;;;;;4098:107;4299:1;4255:28:::0;;;:20:::1;:28;::::0;;;;:34:::1;;:41:::0;:45;4248:272:::1;;4310:12;4325:28:::0;;;:20:::1;:28;::::0;;;;;;:34:::1;;4369:41:::0;;4325:34;;4369:45:::1;::::0;::::1;:::i;:::-;4325:97;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;4325:97:191::1;::::0;-1:-1:-1;4430:35:191::1;4325:97:::0;4458:6;4430:21:::1;:35::i;:::-;4473:28;::::0;;;:20:::1;:28;::::0;;;;:34:::1;;:40:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;4473:40:191;;;;;-1:-1:-1;;;;;;4473:40:191::1;::::0;;;;;-1:-1:-1;4248:272:191::1;;;4532:28;::::0;;;:20:::1;:28;::::0;;;;;;4525:35;;-1:-1:-1;;;;;;4525:35:191::1;::::0;;;;::::1;::::0;;;4532:28;4525:35:::1;;::::0;::::1;4532:28:::0;4525:35:::1;:::i;:::-;;;4030:535:::0;:::o;5056:939::-;5190:14;5255:13;;5246:57;;-1:-1:-1;;;5246:57:191;;;;;5160:25:516;;;5190:14:191;;-1:-1:-1;;;;;5255:13:191;;5246:34;;5133:18:516;;5246:57:191;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5246:57:191;;;;;;;;;;;;:::i;:::-;5212:91;;5350:25;5378:26;5396:7;5378:17;:26::i;:::-;5350:54;;5459:9;5454:537;5478:7;:15;;;:22;5474:1;:26;5454:537;;;5541:14;5558:7;:15;;;5574:1;5558:18;;;;;;;;:::i;:::-;;;;;;;5541:35;;5636:9;5631:354;5655:8;:15;5651:1;:19;5631:354;;;5859:6;5844:8;5853:1;5844:11;;;;;;;;:::i;:::-;;;;;;;:21;:83;;;;;5879:48;5903:8;5912:1;5903:11;;;;;;;;:::i;:::-;;;;;;;5916:10;5879:23;:48::i;:::-;5829:148;;;5962:4;5950:16;;5829:148;5672:3;;5631:354;;;-1:-1:-1;;5502:3:191;;5454:537;;;;5206:789;;5056:939;;;;;:::o;7369:389::-;7478:4;7530:25;7558:26;7576:7;7558:17;:26::i;:::-;7530:54;;7596:9;7591:144;7615:8;:15;7611:1;:19;7591:144;;;7649:48;7673:8;7682:1;7673:11;;;;;;;;:::i;:::-;;;;;;;7686:10;7649:23;:48::i;:::-;7645:84;;;7716:4;7709:11;;;;;;7645:84;7632:3;;7591:144;;;-1:-1:-1;7748:5:191;;7369:389;-1:-1:-1;;;;7369:389:191:o;4599:312:397:-;4679:4;-1:-1:-1;;;;;4688:6:397;4671:23;;;:120;;;4785:6;-1:-1:-1;;;;;4749:42:397;:32;-1:-1:-1;;;;;;;;;;;2035:53:410;-1:-1:-1;;;;;2035:53:410;;1957:138;4749:32:397;-1:-1:-1;;;;;4749:42:397;;;4671:120;4654:251;;;4865:29;;-1:-1:-1;;;4865:29:397;;;;;;;;;;;4654:251;4599:312::o;2171:92:191:-;1691:13;;-1:-1:-1;;;;;1691:13:191;966:10:398;-1:-1:-1;;;;;1675:29:191;;1671:82;;1721:25;;-1:-1:-1;;;1721:25:191;;;;;;;;;;;1671:82;2171:92;:::o;6052:538:397:-;6169:17;-1:-1:-1;;;;;6151:50:397;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6151:52:397;;;;;;;;-1:-1:-1;;6151:52:397;;;;;;;;;;;;:::i;:::-;;;6147:437;;6513:60;;-1:-1:-1;;;6513:60:397;;-1:-1:-1;;;;;4029:32:516;;6513:60:397;;;4011:51:516;3984:18;;6513:60:397;;;;;;;;6147:437;-1:-1:-1;;;;;;;;;;;6245:40:397;;6241:120;;6312:34;;-1:-1:-1;;;6312:34:397;;;;;5160:25:516;;;5133:18;;6312:34:397;5014:177:516;6241:120:397;6374:54;6404:17;6423:4;6374:29;:54::i;5028:213::-;5102:4;-1:-1:-1;;;;;5111:6:397;5094:23;;5090:145;;5195:29;;-1:-1:-1;;;5195:29:397;;;;;;;;;;;2968:67;6931:20:396;:18;:20::i;8976:400:191:-;-1:-1:-1;;;;;9078:19:191;;9052:23;9078:19;;;:13;:19;;;;;;9103:171;9127:12;;9123:16;;9103:171;;;9170:6;9158:5;9164:1;9158:8;;;;;;;;:::i;:::-;;;;;;;;;:18;9154:114;;9205:12;;9199:5;;9205:16;;9220:1;;9205:16;:::i;:::-;9199:23;;;;;;;;:::i;:::-;;;;;;;;;9188:5;9194:1;9188:8;;;;;;;;:::i;:::-;;;;;;;;:34;;;;9232:5;:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;9253:7;;8976:400;;:::o;9154:114::-;9141:3;;9103:171;;;-1:-1:-1;9331:40:191;;-1:-1:-1;;;9331:40:191;;10206:2:516;9331:40:191;;;10188:21:516;10245:2;10225:18;;;10218:30;10284:32;10264:18;;;10257:60;10334:18;;9331:40:191;10004:354:516;6185:954:191;6269:16;6293:19;6358:9;6353:107;6377:7;:14;6373:1;:18;6353:107;;;6421:13;:25;6435:7;6443:1;6435:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;6421:25:191;-1:-1:-1;;;;;6421:25:191;;;;;;;;;;;;:32;;;;6406:47;;;;;:::i;:::-;;-1:-1:-1;6393:3:191;;6353:107;;;-1:-1:-1;1083:1:191;6481:31;;:13;:31;;;:38;6466:53;;;;:::i;:::-;;;6567:22;6606:11;-1:-1:-1;;;;;6592:26:191;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6592:26:191;;6567:51;;6624:20;6692:9;6687:238;6711:7;:14;6707:1;:18;6687:238;;;6740:31;6774:13;:25;6788:7;6796:1;6788:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;6774:25:191;-1:-1:-1;;;;;6774:25:191;;;;;;;;;;;;6740:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6812:9;6807:112;6831:14;:21;6827:1;:25;6807:112;;;6893:14;6908:1;6893:17;;;;;;;;:::i;:::-;;;;;;;6869:5;6875:14;;;;;:::i;:::-;;;6869:21;;;;;;;;:::i;:::-;;;;;;;;;;:41;6854:3;;6807:112;;;-1:-1:-1;;6727:3:191;;6687:238;;;-1:-1:-1;1083:1:191;6931:33;6967:31;;;:13;:31;;;;;6931:67;;6967:31;6931:67;;;;;;;;;;;;;;;;;;6967:31;6931:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7009:9;7004:112;7028:16;:23;7024:1;:27;7004:112;;;7090:16;7107:1;7090:19;;;;;;;;:::i;:::-;;;;;;;7066:5;7072:14;;;;;:::i;:::-;;;7066:21;;;;;;;;:::i;:::-;;;;;;;;;;:43;7053:3;;7004:112;;;-1:-1:-1;7129:5:191;;6185:954;-1:-1:-1;;;;;6185:954:191:o;7975:486::-;8079:4;8128:13;;8121:64;;-1:-1:-1;;;8121:64:191;;;;;5160:25:516;;;8079:4:191;;-1:-1:-1;;;;;8128:13:191;;8121:44;;5133:18:516;;8121:64:191;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8121:64:191;;;;;;;;;;;;:::i;:::-;8215:18;;8091:94;;-1:-1:-1;8191:21:191;8240:198;8264:13;8260:1;:17;8240:198;;;8292:23;8343:11;8355:1;8343:14;;;;;;;;:::i;:::-;;;;;;;8326:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;8318:41;;;:::i;:::-;8292:67;;8390:10;8371:15;:29;8367:65;;8419:4;8412:11;;;;;;;;8367:65;-1:-1:-1;8279:3:191;;8240:198;;;-1:-1:-1;8451:5:191;;7975:486;-1:-1:-1;;;;;7975:486:191:o;2779:335:410:-;2870:37;2889:17;2870:18;:37::i;:::-;2922:27;;-1:-1:-1;;;;;2922:27:410;;;;;;;;2964:11;;:15;2960:148;;2995:53;3024:17;3043:4;2995:28;:53::i;2960:148::-;3079:18;:16;:18::i;7084:141:396:-;8870:21;8560:40;-1:-1:-1;;;8560:40:396;;;;7146:73;;7191:17;;-1:-1:-1;;;7191:17:396;;;;;;;;;;;2186:281:410;2263:17;-1:-1:-1;;;;;2263:29:410;;2296:1;2263:34;2259:119;;2320:47;;-1:-1:-1;;;2320:47:410;;-1:-1:-1;;;;;4029:32:516;;2320:47:410;;;4011:51:516;3984:18;;2320:47:410;3865:203:516;2259:119:410;-1:-1:-1;;;;;;;;;;;2387:73:410;;-1:-1:-1;;;;;;2387:73:410;-1:-1:-1;;;;;2387:73:410;;;;;;;;;;2186:281::o;4106:253:430:-;4189:12;4214;4228:23;4255:6;-1:-1:-1;;;;;4255:19:430;4275:4;4255:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4213:67;;;;4297:55;4324:6;4332:7;4341:10;4297:26;:55::i;:::-;4290:62;4106:253;-1:-1:-1;;;;;4106:253:430:o;6598:122:410:-;6648:9;:13;6644:70;;6684:19;;-1:-1:-1;;;6684:19:410;;;;;;;;;;;4625:582:430;4769:12;4798:7;4793:408;;4821:19;4829:10;4821:7;:19::i;:::-;4793:408;;;5045:17;;:22;:49;;;;-1:-1:-1;;;;;;5071:18:430;;;:23;5045:49;5041:119;;;5121:24;;-1:-1:-1;;;5121:24:430;;-1:-1:-1;;;;;4029:32:516;;5121:24:430;;;4011:51:516;3984:18;;5121:24:430;3865:203:516;5041:119:430;-1:-1:-1;5180:10:430;5173:17;;5743:516;5874:17;;:21;5870:383;;6102:10;6096:17;6158:15;6145:10;6141:2;6137:19;6130:44;5870:383;6225:17;;-1:-1:-1;;;6225:17:430;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:286:516;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:516;;209:43;;199:71;;266:1;263;256:12;497:250;582:1;592:113;606:6;603:1;600:13;592:113;;;682:11;;;676:18;663:11;;;656:39;628:2;621:10;592:113;;;-1:-1:-1;;739:1:516;721:16;;714:27;497:250::o;752:271::-;794:3;832:5;826:12;859:6;854:3;847:19;875:76;944:6;937:4;932:3;928:14;921:4;914:5;910:16;875:76;:::i;:::-;1005:2;984:15;-1:-1:-1;;980:29:516;971:39;;;;1012:4;967:50;;752:271;-1:-1:-1;;752:271:516:o;1028:220::-;1177:2;1166:9;1159:21;1140:4;1197:45;1238:2;1227:9;1223:18;1215:6;1197:45;:::i;1253:127::-;1314:10;1309:3;1305:20;1302:1;1295:31;1345:4;1342:1;1335:15;1369:4;1366:1;1359:15;1385:253;1457:2;1451:9;1499:4;1487:17;;-1:-1:-1;;;;;1519:34:516;;1555:22;;;1516:62;1513:88;;;1581:18;;:::i;:::-;1617:2;1610:22;1385:253;:::o;1643:275::-;1714:2;1708:9;1779:2;1760:13;;-1:-1:-1;;1756:27:516;1744:40;;-1:-1:-1;;;;;1799:34:516;;1835:22;;;1796:62;1793:88;;;1861:18;;:::i;:::-;1897:2;1890:22;1643:275;;-1:-1:-1;1643:275:516:o;1923:183::-;1983:4;-1:-1:-1;;;;;2008:6:516;2005:30;2002:56;;;2038:18;;:::i;:::-;-1:-1:-1;2083:1:516;2079:14;2095:4;2075:25;;1923:183::o;2111:173::-;2179:20;;-1:-1:-1;;;;;2228:31:516;;2218:42;;2208:70;;2274:1;2271;2264:12;2208:70;2111:173;;;:::o;2289:674::-;2343:5;2396:3;2389:4;2381:6;2377:17;2373:27;2363:55;;2414:1;2411;2404:12;2363:55;2450:6;2437:20;2476:4;2500:60;2516:43;2556:2;2516:43;:::i;:::-;2500:60;:::i;:::-;2582:3;2606:2;2601:3;2594:15;2634:4;2629:3;2625:14;2618:21;;2691:4;2685:2;2682:1;2678:10;2670:6;2666:23;2662:34;2648:48;;2719:3;2711:6;2708:15;2705:35;;;2736:1;2733;2726:12;2705:35;2772:4;2764:6;2760:17;2786:148;2802:6;2797:3;2794:15;2786:148;;;2868:23;2887:3;2868:23;:::i;:::-;2856:36;;2912:12;;;;2819;;2786:148;;;-1:-1:-1;2952:5:516;2289:674;-1:-1:-1;;;;;;2289:674:516:o;2968:484::-;3070:6;3078;3086;3139:2;3127:9;3118:7;3114:23;3110:32;3107:52;;;3155:1;3152;3145:12;3107:52;3191:9;3178:23;3168:33;;3252:2;3241:9;3237:18;3224:32;-1:-1:-1;;;;;3271:6:516;3268:30;3265:50;;;3311:1;3308;3301:12;3265:50;3334:61;3387:7;3378:6;3367:9;3363:22;3334:61;:::i;:::-;3324:71;;;3442:2;3431:9;3427:18;3414:32;3404:42;;2968:484;;;;;:::o;3457:180::-;3516:6;3569:2;3557:9;3548:7;3544:23;3540:32;3537:52;;;3585:1;3582;3575:12;3537:52;-1:-1:-1;3608:23:516;;3457:180;-1:-1:-1;3457:180:516:o;4073:186::-;4121:4;-1:-1:-1;;;;;4146:6:516;4143:30;4140:56;;;4176:18;;:::i;:::-;-1:-1:-1;4242:2:516;4221:15;-1:-1:-1;;4217:29:516;4248:4;4213:40;;4073:186::o;4264:745::-;4341:6;4349;4402:2;4390:9;4381:7;4377:23;4373:32;4370:52;;;4418:1;4415;4408:12;4370:52;4441:29;4460:9;4441:29;:::i;:::-;4431:39;;4521:2;4510:9;4506:18;4493:32;-1:-1:-1;;;;;4540:6:516;4537:30;4534:50;;;4580:1;4577;4570:12;4534:50;4603:22;;4656:4;4648:13;;4644:27;-1:-1:-1;4634:55:516;;4685:1;4682;4675:12;4634:55;4721:2;4708:16;4746:48;4762:31;4790:2;4762:31;:::i;4746:48::-;4817:2;4810:5;4803:17;4857:7;4852:2;4847;4843;4839:11;4835:20;4832:33;4829:53;;;4878:1;4875;4868:12;4829:53;4933:2;4928;4924;4920:11;4915:2;4908:5;4904:14;4891:45;4977:1;4972:2;4967;4960:5;4956:14;4952:23;4945:34;4998:5;4988:15;;;;;4264:745;;;;;:::o;5196:186::-;5255:6;5308:2;5296:9;5287:7;5283:23;5279:32;5276:52;;;5324:1;5321;5314:12;5276:52;5347:29;5366:9;5347:29;:::i;5387:659::-;5466:6;5474;5482;5535:2;5523:9;5514:7;5510:23;5506:32;5503:52;;;5551:1;5548;5541:12;5503:52;5587:9;5574:23;5564:33;;5648:2;5637:9;5633:18;5620:32;-1:-1:-1;;;;;5712:2:516;5704:6;5701:14;5698:34;;;5728:1;5725;5718:12;5698:34;5766:6;5755:9;5751:22;5741:32;;5811:7;5804:4;5800:2;5796:13;5792:27;5782:55;;5833:1;5830;5823:12;5782:55;5873:2;5860:16;5899:2;5891:6;5888:14;5885:34;;;5915:1;5912;5905:12;5885:34;5960:7;5955:2;5946:6;5942:2;5938:15;5934:24;5931:37;5928:57;;;5981:1;5978;5971:12;5928:57;6012:2;6008;6004:11;5994:21;;6034:6;6024:16;;;;;5387:659;;;;;:::o;6051:681::-;6219:2;6271:21;;;6341:13;;6244:18;;;6363:22;;;6190:4;6428:17;;;6468:16;;;6190:4;;6219:2;6416;6401:18;;;6190:4;6512:194;6526:6;6523:1;6520:13;6512:194;;;6591:13;;-1:-1:-1;;;;;6587:39:516;6575:52;;6623:1;6682:14;;;;6647:12;;;;6541:9;6512:194;;;-1:-1:-1;6723:3:516;;6051:681;-1:-1:-1;;;;;;6051:681:516:o;6951:348::-;7035:6;7088:2;7076:9;7067:7;7063:23;7059:32;7056:52;;;7104:1;7101;7094:12;7056:52;7144:9;7131:23;-1:-1:-1;;;;;7169:6:516;7166:30;7163:50;;;7209:1;7206;7199:12;7163:50;7232:61;7285:7;7276:6;7265:9;7261:22;7232:61;:::i;:::-;7222:71;6951:348;-1:-1:-1;;;;6951:348:516:o;7304:127::-;7365:10;7360:3;7356:20;7353:1;7346:31;7396:4;7393:1;7386:15;7420:4;7417:1;7410:15;7436:127;7497:10;7492:3;7488:20;7485:1;7478:31;7528:4;7525:1;7518:15;7552:4;7549:1;7542:15;7568:128;7635:9;;;7656:11;;;7653:37;;;7670:18;;:::i;7701:127::-;7762:10;7757:3;7753:20;7750:1;7743:31;7793:4;7790:1;7783:15;7817:4;7814:1;7807:15;7833:442;7887:5;7940:3;7933:4;7925:6;7921:17;7917:27;7907:55;;7958:1;7955;7948:12;7907:55;7987:6;7981:13;8018:48;8034:31;8062:2;8034:31;:::i;8018:48::-;8091:2;8082:7;8075:19;8137:3;8130:4;8125:2;8117:6;8113:15;8109:26;8106:35;8103:55;;;8154:1;8151;8144:12;8103:55;8167:77;8241:2;8234:4;8225:7;8221:18;8214:4;8206:6;8202:17;8167:77;:::i;8280:1530::-;8376:6;8407:2;8450;8438:9;8429:7;8425:23;8421:32;8418:52;;;8466:1;8463;8456:12;8418:52;8499:9;8493:16;-1:-1:-1;;;;;8569:2:516;8561:6;8558:14;8555:34;;;8585:1;8582;8575:12;8555:34;8608:22;;;;8664:4;8646:16;;;8642:27;8639:47;;;8682:1;8679;8672:12;8639:47;8708:22;;:::i;:::-;8759:2;8753:9;8746:5;8739:24;8801:2;8797;8793:11;8787:18;8850:7;8843:15;8836:23;8827:7;8824:36;8814:64;;8874:1;8871;8864:12;8814:64;8894:14;;;8887:31;8957:2;8949:11;;8943:18;8973:16;;;8970:36;;;9002:1;8999;8992:12;8970:36;9038:56;9086:7;9075:8;9071:2;9067:17;9038:56;:::i;:::-;9033:2;9026:5;9022:14;9015:80;;9134:2;9130;9126:11;9120:18;9163:2;9153:8;9150:16;9147:36;;;9179:1;9176;9169:12;9147:36;9210:8;9206:2;9202:17;9192:27;;;9257:7;9250:4;9246:2;9242:13;9238:27;9228:55;;9279:1;9276;9269:12;9228:55;9308:2;9302:9;9292:19;;9331:60;9347:43;9387:2;9347:43;:::i;9331:60::-;9425:15;;;9507:1;9503:10;;;;9495:19;;9491:28;;;9456:12;;;;9531:19;;;9528:39;;;9563:1;9560;9553:12;9528:39;9587:11;;;;9607:135;9623:6;9618:3;9615:15;9607:135;;;9689:10;;9677:23;;9640:12;;;;9720;;;;9607:135;;;9769:2;9758:14;;9751:29;-1:-1:-1;9762:5:516;8280:1530;-1:-1:-1;;;;;;8280:1530:516:o;9815:184::-;9885:6;9938:2;9926:9;9917:7;9913:23;9909:32;9906:52;;;9954:1;9951;9944:12;9906:52;-1:-1:-1;9977:16:516;;9815:184;-1:-1:-1;9815:184:516:o;10363:125::-;10428:9;;;10449:10;;;10446:36;;;10462:18;;:::i;10493:135::-;10532:3;10553:17;;;10550:43;;10573:18;;:::i;:::-;-1:-1:-1;10620:1:516;10609:13;;10493:135::o;10815:1134::-;10920:6;10951:2;10994;10982:9;10973:7;10969:23;10965:32;10962:52;;;11010:1;11007;11000:12;10962:52;11043:9;11037:16;-1:-1:-1;;;;;11113:2:516;11105:6;11102:14;11099:34;;;11129:1;11126;11119:12;11099:34;11167:6;11156:9;11152:22;11142:32;;11212:7;11205:4;11201:2;11197:13;11193:27;11183:55;;11234:1;11231;11224:12;11183:55;11263:2;11257:9;11286:60;11302:43;11342:2;11302:43;:::i;11286:60::-;11380:15;;;11462:1;11458:10;;;;11450:19;;11446:28;;;11411:12;;;;11486:19;;;11483:39;;;11518:1;11515;11508:12;11483:39;11550:2;11546;11542:11;11562:357;11578:6;11573:3;11570:15;11562:357;;;11657:3;11651:10;11693:2;11680:11;11677:19;11674:109;;;11737:1;11766:2;11762;11755:14;11674:109;11808:68;11868:7;11863:2;11849:11;11845:2;11841:20;11837:29;11808:68;:::i;:::-;11796:81;;-1:-1:-1;11897:12:516;;;;11595;;11562:357;;;-1:-1:-1;11938:5:516;10815:1134;-1:-1:-1;;;;;;;;10815:1134:516:o;11954:289::-;12085:3;12123:6;12117:13;12139:66;12198:6;12193:3;12186:4;12178:6;12174:17;12139:66;:::i;:::-;12221:16;;;;;11954:289;-1:-1:-1;;11954:289:516:o;12248:297::-;12366:12;;12413:4;12402:16;;;12396:23;;12366:12;12431:16;;12428:111;;;12525:1;12521:6;12511;12505:4;12501:17;12498:1;12494:25;12490:38;12483:5;12479:50;12470:59;;12428:111;;12248:297;;;:::o","linkReferences":{},"immutableReferences":{"79701":[{"start":2721,"length":32},{"start":2762,"length":32},{"start":3137,"length":32}]}},"methodIdentifiers":{"SPACE_ADDRESS()":"34322eff","UPGRADE_INTERFACE_VERSION()":"ad3cb1cc","description()":"7284e416","getEntitlementDataByRoleId(uint256)":"1eee07b2","initialize(address)":"c4d66de8","isCrosschain()":"2e1b61e4","isEntitled(bytes32,address[],bytes32)":"0cf0b533","moduleType()":"6465e69f","name()":"06fdde03","proxiableUUID()":"52d1902d","removeEntitlement(uint256)":"f0c111f9","setEntitlement(uint256,bytes)":"ef8be574","supportsInterface(bytes4)":"01ffc9a7","upgradeToAndCall(address,bytes)":"4f1ef286"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ERC1967InvalidImplementation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1967NonPayable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__ValueAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UUPSUnauthorizedCallContext\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"slot\",\"type\":\"bytes32\"}],\"name\":\"UUPSUnsupportedProxiableUUID\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SPACE_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPGRADE_INTERFACE_VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"description\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getEntitlementDataByRoleId\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_space\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isCrosschain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"wallets\",\"type\":\"address[]\"},{\"internalType\":\"bytes32\",\"name\":\"permission\",\"type\":\"bytes32\"}],\"name\":\"isEntitled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"moduleType\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"removeEntitlement\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"entitlementData\",\"type\":\"bytes\"}],\"name\":\"setEntitlement\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"ERC1967InvalidImplementation(address)\":[{\"details\":\"The `implementation` of the proxy is invalid.\"}],\"ERC1967NonPayable()\":[{\"details\":\"An upgrade function sees `msg.value > 0` that may be lost.\"}],\"FailedInnerCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"UUPSUnauthorizedCallContext()\":[{\"details\":\"The call is from an unauthorized context.\"}],\"UUPSUnsupportedProxiableUUID(bytes32)\":[{\"details\":\"The storage `slot` is unsupported as a UUID.\"}]},\"events\":{\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\"},\"getEntitlementDataByRoleId(uint256)\":{\"params\":{\"roleId\":\"the roleId to fetch the entitlement data for\"},\"returns\":{\"_0\":\"entitlementData array for the role\"}},\"isCrosschain()\":{\"returns\":{\"_0\":\"whether this entitlement will require crosschain evaluation\"}},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"removeEntitlement(uint256)\":{\"params\":{\"roleId\":\"id of the role to remove\"}},\"setEntitlement(uint256,bytes)\":{\"params\":{\"entitlementData\":\"abi encoded array of data necessary to set the entitlement\",\"roleId\":\"id of the role to gate\"}},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"stateVariables\":{\"__gap\":{\"details\":\"Added to allow future versions to add new variables in case this contract becomes inherited. See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"description()\":{\"notice\":\"The description of the entitlement module\"},\"getEntitlementDataByRoleId(uint256)\":{\"notice\":\"fetches the entitlement data for a roleId\"},\"isCrosschain()\":{\"notice\":\"some entitlements require cross chain evaluation and may not be executed directly from other contracts\"},\"moduleType()\":{\"notice\":\"The type of the entitlement module\"},\"name()\":{\"notice\":\"The name of the entitlement module\"},\"removeEntitlement(uint256)\":{\"notice\":\"removes an entitlement\"},\"setEntitlement(uint256,bytes)\":{\"notice\":\"sets a new entitlement\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/entitlements/user/UserEntitlement.sol\":\"UserEntitlement\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/spaces/entitlements/IEntitlement.sol\":{\"keccak256\":\"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3\",\"dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf\"]},\"contracts/src/spaces/entitlements/user/IUserEntitlement.sol\":{\"keccak256\":\"0x96fef5ebaa7e9e79c77c887d9053ae06dc91cf1301f33db652e6ac811b3b5cc5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6cff649b95f65c9e3ecfa7dfa3b1c7b524ec7244eb5223c55674a4679eb8e7bf\",\"dweb:/ipfs/QmQy5sXRywRWB3aM58TCp5Xw5b258Y5PfDM8RasDznAPzA\"]},\"contracts/src/spaces/entitlements/user/UserEntitlement.sol\":{\"keccak256\":\"0xfddbdc0f0f5d94d2c50b8d45fc6e5187d723b6ca62b18675a888d4cdc7229281\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://52edc150c9fc04c1d75702122629612a9d452fc039d880e430e1281a7dad3e37\",\"dweb:/ipfs/QmRHzGQn5UhiL3xUiSmEVt5pqxexm4sD3iMRZgMHkKUmo9\"]},\"contracts/src/spaces/facets/channels/IChannel.sol\":{\"keccak256\":\"0x4a62ec6410779121880a21ae1a42bab2480f672c683f79c7f2e11bf2bfe1bd6e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://61b4142a55418d8e15e4db77bf6614a830489dc6aa191afe3dadc9ef16534b2c\",\"dweb:/ipfs/Qmbuc8VBmoFrbWZGinbCQaCrBRw3DznYhZNLzqk2FXABUx\"]},\"contracts/src/spaces/facets/roles/IRoles.sol\":{\"keccak256\":\"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8\",\"dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N\"]},\"lib/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609\",\"dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM\"]},\"lib/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0x3f13b947637c4969c0644cab4ef399cdc4b67f101463b8775c5a43b118558e53\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6683e6ade6985d394d32baaef5eea0d8b9ff0b3eca86ae413d6cdde114a9930\",\"dweb:/ipfs/QmdBE8T1BTddZxpdECMsb3KiCFyjNWmxcCddYrWFTXmWPj\"]},\"lib/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"lib/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"keccak256\":\"0xdaba3f7c42c55b2896353f32bd27d4d5f8bae741b3b05d4c53f67abc4dc47ce8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fa2e61141c602510bcd2cd936ed9561922ac8772a9b9c9a9db091a74e354a45\",\"dweb:/ipfs/QmcHQDDoEBwJmwUbzoVkytvJsBx3KVHYFFnDkvRGWh9Wmh\"]},\"lib/@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9\",\"dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v\"]},\"lib/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\":{\"keccak256\":\"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a\",\"dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE\"]},\"lib/@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa\",\"dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c\",\"dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"type":"error","name":"ERC1967InvalidImplementation"},{"inputs":[],"type":"error","name":"ERC1967NonPayable"},{"inputs":[],"type":"error","name":"Entitlement__InvalidValue"},{"inputs":[],"type":"error","name":"Entitlement__NotAllowed"},{"inputs":[],"type":"error","name":"Entitlement__NotMember"},{"inputs":[],"type":"error","name":"Entitlement__ValueAlreadyExists"},{"inputs":[],"type":"error","name":"FailedInnerCall"},{"inputs":[],"type":"error","name":"InvalidInitialization"},{"inputs":[],"type":"error","name":"NotInitializing"},{"inputs":[],"type":"error","name":"UUPSUnauthorizedCallContext"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"type":"error","name":"UUPSUnsupportedProxiableUUID"},{"inputs":[{"internalType":"uint64","name":"version","type":"uint64","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"address","name":"implementation","type":"address","indexed":true}],"type":"event","name":"Upgraded","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"SPACE_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"description","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getEntitlementDataByRoleId","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"address","name":"_space","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"pure","type":"function","name":"isCrosschain","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"},{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"bytes32","name":"permission","type":"bytes32"}],"stateMutability":"view","type":"function","name":"isEntitled","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"moduleType","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"removeEntitlement"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"bytes","name":"entitlementData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"setEntitlement"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"upgradeToAndCall"}],"devdoc":{"kind":"dev","methods":{"constructor":{"custom:oz-upgrades-unsafe-allow":"constructor"},"getEntitlementDataByRoleId(uint256)":{"params":{"roleId":"the roleId to fetch the entitlement data for"},"returns":{"_0":"entitlementData array for the role"}},"isCrosschain()":{"returns":{"_0":"whether this entitlement will require crosschain evaluation"}},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"removeEntitlement(uint256)":{"params":{"roleId":"id of the role to remove"}},"setEntitlement(uint256,bytes)":{"params":{"entitlementData":"abi encoded array of data necessary to set the entitlement","roleId":"id of the role to gate"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"version":1},"userdoc":{"kind":"user","methods":{"description()":{"notice":"The description of the entitlement module"},"getEntitlementDataByRoleId(uint256)":{"notice":"fetches the entitlement data for a roleId"},"isCrosschain()":{"notice":"some entitlements require cross chain evaluation and may not be executed directly from other contracts"},"moduleType()":{"notice":"The type of the entitlement module"},"name()":{"notice":"The name of the entitlement module"},"removeEntitlement(uint256)":{"notice":"removes an entitlement"},"setEntitlement(uint256,bytes)":{"notice":"sets a new entitlement"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/entitlements/user/UserEntitlement.sol":"UserEntitlement"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/spaces/entitlements/IEntitlement.sol":{"keccak256":"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca","urls":["bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3","dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/user/IUserEntitlement.sol":{"keccak256":"0x96fef5ebaa7e9e79c77c887d9053ae06dc91cf1301f33db652e6ac811b3b5cc5","urls":["bzz-raw://6cff649b95f65c9e3ecfa7dfa3b1c7b524ec7244eb5223c55674a4679eb8e7bf","dweb:/ipfs/QmQy5sXRywRWB3aM58TCp5Xw5b258Y5PfDM8RasDznAPzA"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/user/UserEntitlement.sol":{"keccak256":"0xfddbdc0f0f5d94d2c50b8d45fc6e5187d723b6ca62b18675a888d4cdc7229281","urls":["bzz-raw://52edc150c9fc04c1d75702122629612a9d452fc039d880e430e1281a7dad3e37","dweb:/ipfs/QmRHzGQn5UhiL3xUiSmEVt5pqxexm4sD3iMRZgMHkKUmo9"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/IChannel.sol":{"keccak256":"0x4a62ec6410779121880a21ae1a42bab2480f672c683f79c7f2e11bf2bfe1bd6e","urls":["bzz-raw://61b4142a55418d8e15e4db77bf6614a830489dc6aa191afe3dadc9ef16534b2c","dweb:/ipfs/Qmbuc8VBmoFrbWZGinbCQaCrBRw3DznYhZNLzqk2FXABUx"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/IRoles.sol":{"keccak256":"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d","urls":["bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8","dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"],"license":"MIT"},"lib/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3f13b947637c4969c0644cab4ef399cdc4b67f101463b8775c5a43b118558e53","urls":["bzz-raw://c6683e6ade6985d394d32baaef5eea0d8b9ff0b3eca86ae413d6cdde114a9930","dweb:/ipfs/QmdBE8T1BTddZxpdECMsb3KiCFyjNWmxcCddYrWFTXmWPj"],"license":"MIT"},"lib/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397","urls":["bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9","dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV"],"license":"MIT"},"lib/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0xdaba3f7c42c55b2896353f32bd27d4d5f8bae741b3b05d4c53f67abc4dc47ce8","urls":["bzz-raw://1fa2e61141c602510bcd2cd936ed9561922ac8772a9b9c9a9db091a74e354a45","dweb:/ipfs/QmcHQDDoEBwJmwUbzoVkytvJsBx3KVHYFFnDkvRGWh9Wmh"],"license":"MIT"},"lib/@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"],"license":"MIT"},"lib/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"],"license":"MIT"},"lib/@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":191} \ No newline at end of file diff --git a/packages/generated/dev/abis/UserEntitlement.metadata.json b/packages/generated/dev/abis/UserEntitlement.metadata.json new file mode 100644 index 000000000..99eec99da --- /dev/null +++ b/packages/generated/dev/abis/UserEntitlement.metadata.json @@ -0,0 +1,561 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "type": "error", + "name": "AddressEmptyCode" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "type": "error", + "name": "ERC1967InvalidImplementation" + }, + { + "inputs": [], + "type": "error", + "name": "ERC1967NonPayable" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__InvalidValue" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotAllowed" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotMember" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__ValueAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "FailedInnerCall" + }, + { + "inputs": [], + "type": "error", + "name": "InvalidInitialization" + }, + { + "inputs": [], + "type": "error", + "name": "NotInitializing" + }, + { + "inputs": [], + "type": "error", + "name": "UUPSUnauthorizedCallContext" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "slot", + "type": "bytes32" + } + ], + "type": "error", + "name": "UUPSUnsupportedProxiableUUID" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "version", + "type": "uint64", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "Upgraded", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "SPACE_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "UPGRADE_INTERFACE_VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "description", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getEntitlementDataByRoleId", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_space", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "initialize" + }, + { + "inputs": [], + "stateMutability": "pure", + "type": "function", + "name": "isCrosschain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "wallets", + "type": "address[]" + }, + { + "internalType": "bytes32", + "name": "permission", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isEntitled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "moduleType", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeEntitlement" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "entitlementData", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setEntitlement" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function", + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "upgradeToAndCall" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "constructor": { + "custom:oz-upgrades-unsafe-allow": "constructor" + }, + "getEntitlementDataByRoleId(uint256)": { + "params": { + "roleId": "the roleId to fetch the entitlement data for" + }, + "returns": { + "_0": "entitlementData array for the role" + } + }, + "isCrosschain()": { + "returns": { + "_0": "whether this entitlement will require crosschain evaluation" + } + }, + "proxiableUUID()": { + "details": "Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier." + }, + "removeEntitlement(uint256)": { + "params": { + "roleId": "id of the role to remove" + } + }, + "setEntitlement(uint256,bytes)": { + "params": { + "entitlementData": "abi encoded array of data necessary to set the entitlement", + "roleId": "id of the role to gate" + } + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + }, + "upgradeToAndCall(address,bytes)": { + "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", + "details": "Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "description()": { + "notice": "The description of the entitlement module" + }, + "getEntitlementDataByRoleId(uint256)": { + "notice": "fetches the entitlement data for a roleId" + }, + "isCrosschain()": { + "notice": "some entitlements require cross chain evaluation and may not be executed directly from other contracts" + }, + "moduleType()": { + "notice": "The type of the entitlement module" + }, + "name()": { + "notice": "The name of the entitlement module" + }, + "removeEntitlement(uint256)": { + "notice": "removes an entitlement" + }, + "setEntitlement(uint256,bytes)": { + "notice": "sets a new entitlement" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/entitlements/user/UserEntitlement.sol": "UserEntitlement" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/spaces/entitlements/IEntitlement.sol": { + "keccak256": "0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca", + "urls": [ + "bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3", + "dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/user/IUserEntitlement.sol": { + "keccak256": "0x96fef5ebaa7e9e79c77c887d9053ae06dc91cf1301f33db652e6ac811b3b5cc5", + "urls": [ + "bzz-raw://6cff649b95f65c9e3ecfa7dfa3b1c7b524ec7244eb5223c55674a4679eb8e7bf", + "dweb:/ipfs/QmQy5sXRywRWB3aM58TCp5Xw5b258Y5PfDM8RasDznAPzA" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/user/UserEntitlement.sol": { + "keccak256": "0xfddbdc0f0f5d94d2c50b8d45fc6e5187d723b6ca62b18675a888d4cdc7229281", + "urls": [ + "bzz-raw://52edc150c9fc04c1d75702122629612a9d452fc039d880e430e1281a7dad3e37", + "dweb:/ipfs/QmRHzGQn5UhiL3xUiSmEVt5pqxexm4sD3iMRZgMHkKUmo9" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/IChannel.sol": { + "keccak256": "0x4a62ec6410779121880a21ae1a42bab2480f672c683f79c7f2e11bf2bfe1bd6e", + "urls": [ + "bzz-raw://61b4142a55418d8e15e4db77bf6614a830489dc6aa191afe3dadc9ef16534b2c", + "dweb:/ipfs/Qmbuc8VBmoFrbWZGinbCQaCrBRw3DznYhZNLzqk2FXABUx" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/IRoles.sol": { + "keccak256": "0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d", + "urls": [ + "bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8", + "dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "keccak256": "0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b", + "urls": [ + "bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609", + "dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol": { + "keccak256": "0x3f13b947637c4969c0644cab4ef399cdc4b67f101463b8775c5a43b118558e53", + "urls": [ + "bzz-raw://c6683e6ade6985d394d32baaef5eea0d8b9ff0b3eca86ae413d6cdde114a9930", + "dweb:/ipfs/QmdBE8T1BTddZxpdECMsb3KiCFyjNWmxcCddYrWFTXmWPj" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "keccak256": "0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397", + "urls": [ + "bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9", + "dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol": { + "keccak256": "0xdaba3f7c42c55b2896353f32bd27d4d5f8bae741b3b05d4c53f67abc4dc47ce8", + "urls": [ + "bzz-raw://1fa2e61141c602510bcd2cd936ed9561922ac8772a9b9c9a9db091a74e354a45", + "dweb:/ipfs/QmcHQDDoEBwJmwUbzoVkytvJsBx3KVHYFFnDkvRGWh9Wmh" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/interfaces/draft-IERC1822.sol": { + "keccak256": "0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c", + "urls": [ + "bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9", + "dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol": { + "keccak256": "0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65", + "urls": [ + "bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a", + "dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/proxy/beacon/IBeacon.sol": { + "keccak256": "0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c", + "urls": [ + "bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa", + "dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/StorageSlot.sol": { + "keccak256": "0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418", + "urls": [ + "bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c", + "dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/abis/WalletLink.abi.json b/packages/generated/dev/abis/WalletLink.abi.json new file mode 100644 index 000000000..888b38544 --- /dev/null +++ b/packages/generated/dev/abis/WalletLink.abi.json @@ -0,0 +1,426 @@ +[ + { + "type": "function", + "name": "__WalletLink_init", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "checkIfLinked", + "inputs": [ + { + "name": "rootKey", + "type": "address", + "internalType": "address" + }, + { + "name": "wallet", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getLatestNonceForRootKey", + "inputs": [ + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRootKeyForWallet", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getWalletsByRootKey", + "inputs": [ + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "wallets", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "linkCallerToRootKey", + "inputs": [ + { + "name": "rootWallet", + "type": "tuple", + "internalType": "struct IWalletLinkBase.LinkedWallet", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "linkWalletToRootKey", + "inputs": [ + { + "name": "wallet", + "type": "tuple", + "internalType": "struct IWalletLinkBase.LinkedWallet", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "rootWallet", + "type": "tuple", + "internalType": "struct IWalletLinkBase.LinkedWallet", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeLink", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootWallet", + "type": "tuple", + "internalType": "struct IWalletLinkBase.LinkedWallet", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "LinkWalletToRootKey", + "inputs": [ + { + "name": "wallet", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RemoveLink", + "inputs": [ + { + "name": "wallet", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "secondWallet", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ECDSAInvalidSignature", + "inputs": [] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureLength", + "inputs": [ + { + "name": "length", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureS", + "inputs": [ + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidAccountNonce", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "currentNonce", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "WalletLink__CannotLinkToRootWallet", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "WalletLink__CannotLinkToSelf", + "inputs": [] + }, + { + "type": "error", + "name": "WalletLink__CannotRemoveRootWallet", + "inputs": [] + }, + { + "type": "error", + "name": "WalletLink__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "WalletLink__InvalidSignature", + "inputs": [] + }, + { + "type": "error", + "name": "WalletLink__LinkAlreadyExists", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "WalletLink__LinkedToAnotherRootKey", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "WalletLink__NotLinked", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ] + } +] \ No newline at end of file diff --git a/packages/generated/dev/abis/WalletLink.abi.ts b/packages/generated/dev/abis/WalletLink.abi.ts new file mode 100644 index 000000000..b22b2a39f --- /dev/null +++ b/packages/generated/dev/abis/WalletLink.abi.ts @@ -0,0 +1,426 @@ +export default [ + { + "type": "function", + "name": "__WalletLink_init", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "checkIfLinked", + "inputs": [ + { + "name": "rootKey", + "type": "address", + "internalType": "address" + }, + { + "name": "wallet", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getLatestNonceForRootKey", + "inputs": [ + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRootKeyForWallet", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getWalletsByRootKey", + "inputs": [ + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "wallets", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "linkCallerToRootKey", + "inputs": [ + { + "name": "rootWallet", + "type": "tuple", + "internalType": "struct IWalletLinkBase.LinkedWallet", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "linkWalletToRootKey", + "inputs": [ + { + "name": "wallet", + "type": "tuple", + "internalType": "struct IWalletLinkBase.LinkedWallet", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "rootWallet", + "type": "tuple", + "internalType": "struct IWalletLinkBase.LinkedWallet", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeLink", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootWallet", + "type": "tuple", + "internalType": "struct IWalletLinkBase.LinkedWallet", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "LinkWalletToRootKey", + "inputs": [ + { + "name": "wallet", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RemoveLink", + "inputs": [ + { + "name": "wallet", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "secondWallet", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ECDSAInvalidSignature", + "inputs": [] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureLength", + "inputs": [ + { + "name": "length", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureS", + "inputs": [ + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidAccountNonce", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "currentNonce", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "WalletLink__CannotLinkToRootWallet", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "WalletLink__CannotLinkToSelf", + "inputs": [] + }, + { + "type": "error", + "name": "WalletLink__CannotRemoveRootWallet", + "inputs": [] + }, + { + "type": "error", + "name": "WalletLink__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "WalletLink__InvalidSignature", + "inputs": [] + }, + { + "type": "error", + "name": "WalletLink__LinkAlreadyExists", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "WalletLink__LinkedToAnotherRootKey", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "WalletLink__NotLinked", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ] + } +] as const diff --git a/packages/generated/dev/abis/WalletLink.bin b/packages/generated/dev/abis/WalletLink.bin new file mode 100644 index 000000000..7fa2e5253 --- /dev/null +++ b/packages/generated/dev/abis/WalletLink.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6111ba806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063912b97581161005b578063912b9758146100f4578063d80bd3b914610117578063e65dfe9d1461012a578063f82103981461013d57600080fd5b806302345b981461008d5780631a31fc8d146100b657806320a00ac8146100cb578063260a409d146100ec575b600080fd5b6100a061009b366004610e84565b610168565b6040516100ad9190610e9f565b60405180910390f35b6100c96100c436600461100b565b610179565b005b6100de6100d9366004610e84565b610189565b6040519081526020016100ad565b6100c96101c6565b610107610102366004611078565b610222565b60405190151581526020016100ad565b6100c96101253660046110ab565b61026b565b6100c96101383660046110f1565b610276565b61015061014b366004610e84565b610284565b6040516001600160a01b0390911681526020016100ad565b6060610173826102c5565b92915050565b6101848383836102f6565b505050565b6001600160a01b03811660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c006020526040812054610173565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661021057604051630ef4733760e31b815260040160405180910390fd5b610220636ff9143960e01b6104da565b565b6001600160a01b0381811660009081527f19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc01602052604081205490918481169116145b9392505050565b6101848383836105b8565b6102808282610780565b5050565b6001600160a01b0380821660009081527f19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc016020526040812054909116610173565b6001600160a01b038116600090815260008051602061119a83398151915260205260409020606090610173906108a7565b8251825160008051602061119a83398151915291610316918391906108b4565b8351604080516001600160a01b0390921660208301528101839052600090610385906060015b604051602081830303815290604052805190602001207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b905083600001516001600160a01b03166103a3828660200151610a25565b6001600160a01b0316146103ca57604051632af0041d60e11b815260040160405180910390fd5b8351604080516001600160a01b03909216602083015281018490526000906103f49060600161033c565b905085600001516001600160a01b0316610412828860200151610a25565b6001600160a01b03161461043957604051632af0041d60e11b815260040160405180910390fd5b84516104459085610a4f565b855185516001600160a01b0316600090815260208590526040902061046991610ac1565b50845186516001600160a01b03908116600090815260018601602052604080822080546001600160a01b0319169484169490941790935587518951935190831693909216917f64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b57219190a3505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610567576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610580565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60008051602061119a8339815191526001600160a01b03841615806105e5575082516001600160a01b0316155b1561060357604051636df3f5c360e01b815260040160405180910390fd5b82600001516001600160a01b0316846001600160a01b031603610639576040516333976e3b60e11b815260040160405180910390fd5b82516001600160a01b0385811660009081526001840160205260409020548116911614610694578251604051635e300c8360e01b81526001600160a01b03808716600483015290911660248201526044015b60405180910390fd5b604080516001600160a01b03861660208201529081018390526000906106bc9060600161033c565b905083600001516001600160a01b03166106da828660200151610a25565b6001600160a01b03161461070157604051632af0041d60e11b815260040160405180910390fd5b6001600160a01b038086166000908152600184016020908152604080832080546001600160a01b031916905587519093168252849052206107429086610ad6565b5060405133906001600160a01b038716907f9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da290600090a35050505050565b815160008051602061119a8339815191529033906107a190839083906108b4565b604080516001600160a01b03831660208201529081018490526000906107c99060600161033c565b905084600001516001600160a01b03166107e7828760200151610a25565b6001600160a01b03161461080e57604051632af0041d60e11b815260040160405180910390fd5b845161081a9085610a4f565b84516001600160a01b0316600090815260208490526040902061083d9083610ac1565b5084516001600160a01b03838116600081815260018701602052604080822080546001600160a01b0319169585169590951790945588519351939092169290917f64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b572191a35050505050565b6060600061026483610aeb565b6001600160a01b03821615806108d157506001600160a01b038116155b156108ef57604051636df3f5c360e01b815260040160405180910390fd5b806001600160a01b0316826001600160a01b0316036109215760405163848ba26d60e01b815260040160405180910390fd5b6001600160a01b038281166000908152600185016020526040902054161561096f576040516314790b7f60e01b81526001600160a01b0380841660048301528216602482015260440161068b565b6001600160a01b03818116600090815260018501602052604090205416156109d2576001600160a01b038181166000908152600185016020526040908190205490516347227b5d60e01b815284831660048201529116602482015260440161068b565b6001600160a01b03821660009081526020849052604081206109f390610b47565b111561018457604051637b815eed60e11b81526001600160a01b0380841660048301528216602482015260440161068b565b600080600080610a358686610b51565b925092509250610a458282610b9e565b5090949350505050565b6001600160a01b03821660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c0060205260409020805460018101909155818114610184576040516301d4b62360e61b81526001600160a01b03841660048201526024810182905260440161068b565b6000610264836001600160a01b038416610c57565b6000610264836001600160a01b038416610ca6565b606081600001805480602002602001604051908101604052809291908181526020018280548015610b3b57602002820191906000526020600020905b815481526020019060010190808311610b27575b50505050509050919050565b6000610173825490565b60008060008351604103610b8b5760208401516040850151606086015160001a610b7d88828585610d99565b955095509550505050610b97565b50508151600091506002905b9250925092565b6000826003811115610bb257610bb2611136565b03610bbb575050565b6001826003811115610bcf57610bcf611136565b03610bed5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610c0157610c01611136565b03610c225760405163fce698f760e01b81526004810182905260240161068b565b6003826003811115610c3657610c36611136565b03610280576040516335e2f38360e21b81526004810182905260240161068b565b6000818152600183016020526040812054610c9e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610173565b506000610173565b60008181526001830160205260408120548015610d8f576000610cca60018361114c565b8554909150600090610cde9060019061114c565b9050808214610d43576000866000018281548110610cfe57610cfe61116d565b9060005260206000200154905080876000018481548110610d2157610d2161116d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610d5457610d54611183565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610173565b6000915050610173565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610dd45750600091506003905082610e5e565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610e28573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e5457506000925060019150829050610e5e565b9250600091508190505b9450945094915050565b80356001600160a01b0381168114610e7f57600080fd5b919050565b600060208284031215610e9657600080fd5b61026482610e68565b6020808252825182820181905260009190848201906040850190845b81811015610ee05783516001600160a01b031683529284019291840191600101610ebb565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610f2557610f25610eec565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610f5457610f54610eec565b604052919050565b600060408284031215610f6e57600080fd5b610f76610f02565b9050610f8182610e68565b815260208083013567ffffffffffffffff80821115610f9f57600080fd5b818501915085601f830112610fb357600080fd5b813581811115610fc557610fc5610eec565b610fd7601f8201601f19168501610f2b565b91508082528684828501011115610fed57600080fd5b80848401858401376000908201840152918301919091525092915050565b60008060006060848603121561102057600080fd5b833567ffffffffffffffff8082111561103857600080fd5b61104487838801610f5c565b9450602086013591508082111561105a57600080fd5b5061106786828701610f5c565b925050604084013590509250925092565b6000806040838503121561108b57600080fd5b61109483610e68565b91506110a260208401610e68565b90509250929050565b6000806000606084860312156110c057600080fd5b6110c984610e68565b9250602084013567ffffffffffffffff8111156110e557600080fd5b61106786828701610f5c565b6000806040838503121561110457600080fd5b823567ffffffffffffffff81111561111b57600080fd5b61112785828601610f5c565b95602094909401359450505050565b634e487b7160e01b600052602160045260246000fd5b8181038181111561017357634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfe19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc00 \ No newline at end of file diff --git a/packages/generated/dev/abis/WalletLink.json b/packages/generated/dev/abis/WalletLink.json new file mode 100644 index 000000000..bbcec8ff7 --- /dev/null +++ b/packages/generated/dev/abis/WalletLink.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__WalletLink_init","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"checkIfLinked","inputs":[{"name":"rootKey","type":"address","internalType":"address"},{"name":"wallet","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getLatestNonceForRootKey","inputs":[{"name":"rootKey","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRootKeyForWallet","inputs":[{"name":"wallet","type":"address","internalType":"address"}],"outputs":[{"name":"rootKey","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getWalletsByRootKey","inputs":[{"name":"rootKey","type":"address","internalType":"address"}],"outputs":[{"name":"wallets","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"linkCallerToRootKey","inputs":[{"name":"rootWallet","type":"tuple","internalType":"struct IWalletLinkBase.LinkedWallet","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"nonce","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"linkWalletToRootKey","inputs":[{"name":"wallet","type":"tuple","internalType":"struct IWalletLinkBase.LinkedWallet","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"rootWallet","type":"tuple","internalType":"struct IWalletLinkBase.LinkedWallet","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"nonce","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeLink","inputs":[{"name":"wallet","type":"address","internalType":"address"},{"name":"rootWallet","type":"tuple","internalType":"struct IWalletLinkBase.LinkedWallet","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"nonce","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"LinkWalletToRootKey","inputs":[{"name":"wallet","type":"address","indexed":true,"internalType":"address"},{"name":"rootKey","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RemoveLink","inputs":[{"name":"wallet","type":"address","indexed":true,"internalType":"address"},{"name":"secondWallet","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"ECDSAInvalidSignature","inputs":[]},{"type":"error","name":"ECDSAInvalidSignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ECDSAInvalidSignatureS","inputs":[{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"InvalidAccountNonce","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"currentNonce","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"WalletLink__CannotLinkToRootWallet","inputs":[{"name":"wallet","type":"address","internalType":"address"},{"name":"rootKey","type":"address","internalType":"address"}]},{"type":"error","name":"WalletLink__CannotLinkToSelf","inputs":[]},{"type":"error","name":"WalletLink__CannotRemoveRootWallet","inputs":[]},{"type":"error","name":"WalletLink__InvalidAddress","inputs":[]},{"type":"error","name":"WalletLink__InvalidSignature","inputs":[]},{"type":"error","name":"WalletLink__LinkAlreadyExists","inputs":[{"name":"wallet","type":"address","internalType":"address"},{"name":"rootKey","type":"address","internalType":"address"}]},{"type":"error","name":"WalletLink__LinkedToAnotherRootKey","inputs":[{"name":"wallet","type":"address","internalType":"address"},{"name":"rootKey","type":"address","internalType":"address"}]},{"type":"error","name":"WalletLink__NotLinked","inputs":[{"name":"wallet","type":"address","internalType":"address"},{"name":"rootKey","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6111ba806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063912b97581161005b578063912b9758146100f4578063d80bd3b914610117578063e65dfe9d1461012a578063f82103981461013d57600080fd5b806302345b981461008d5780631a31fc8d146100b657806320a00ac8146100cb578063260a409d146100ec575b600080fd5b6100a061009b366004610e84565b610168565b6040516100ad9190610e9f565b60405180910390f35b6100c96100c436600461100b565b610179565b005b6100de6100d9366004610e84565b610189565b6040519081526020016100ad565b6100c96101c6565b610107610102366004611078565b610222565b60405190151581526020016100ad565b6100c96101253660046110ab565b61026b565b6100c96101383660046110f1565b610276565b61015061014b366004610e84565b610284565b6040516001600160a01b0390911681526020016100ad565b6060610173826102c5565b92915050565b6101848383836102f6565b505050565b6001600160a01b03811660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c006020526040812054610173565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661021057604051630ef4733760e31b815260040160405180910390fd5b610220636ff9143960e01b6104da565b565b6001600160a01b0381811660009081527f19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc01602052604081205490918481169116145b9392505050565b6101848383836105b8565b6102808282610780565b5050565b6001600160a01b0380821660009081527f19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc016020526040812054909116610173565b6001600160a01b038116600090815260008051602061119a83398151915260205260409020606090610173906108a7565b8251825160008051602061119a83398151915291610316918391906108b4565b8351604080516001600160a01b0390921660208301528101839052600090610385906060015b604051602081830303815290604052805190602001207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b905083600001516001600160a01b03166103a3828660200151610a25565b6001600160a01b0316146103ca57604051632af0041d60e11b815260040160405180910390fd5b8351604080516001600160a01b03909216602083015281018490526000906103f49060600161033c565b905085600001516001600160a01b0316610412828860200151610a25565b6001600160a01b03161461043957604051632af0041d60e11b815260040160405180910390fd5b84516104459085610a4f565b855185516001600160a01b0316600090815260208590526040902061046991610ac1565b50845186516001600160a01b03908116600090815260018601602052604080822080546001600160a01b0319169484169490941790935587518951935190831693909216917f64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b57219190a3505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610567576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610580565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60008051602061119a8339815191526001600160a01b03841615806105e5575082516001600160a01b0316155b1561060357604051636df3f5c360e01b815260040160405180910390fd5b82600001516001600160a01b0316846001600160a01b031603610639576040516333976e3b60e11b815260040160405180910390fd5b82516001600160a01b0385811660009081526001840160205260409020548116911614610694578251604051635e300c8360e01b81526001600160a01b03808716600483015290911660248201526044015b60405180910390fd5b604080516001600160a01b03861660208201529081018390526000906106bc9060600161033c565b905083600001516001600160a01b03166106da828660200151610a25565b6001600160a01b03161461070157604051632af0041d60e11b815260040160405180910390fd5b6001600160a01b038086166000908152600184016020908152604080832080546001600160a01b031916905587519093168252849052206107429086610ad6565b5060405133906001600160a01b038716907f9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da290600090a35050505050565b815160008051602061119a8339815191529033906107a190839083906108b4565b604080516001600160a01b03831660208201529081018490526000906107c99060600161033c565b905084600001516001600160a01b03166107e7828760200151610a25565b6001600160a01b03161461080e57604051632af0041d60e11b815260040160405180910390fd5b845161081a9085610a4f565b84516001600160a01b0316600090815260208490526040902061083d9083610ac1565b5084516001600160a01b03838116600081815260018701602052604080822080546001600160a01b0319169585169590951790945588519351939092169290917f64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b572191a35050505050565b6060600061026483610aeb565b6001600160a01b03821615806108d157506001600160a01b038116155b156108ef57604051636df3f5c360e01b815260040160405180910390fd5b806001600160a01b0316826001600160a01b0316036109215760405163848ba26d60e01b815260040160405180910390fd5b6001600160a01b038281166000908152600185016020526040902054161561096f576040516314790b7f60e01b81526001600160a01b0380841660048301528216602482015260440161068b565b6001600160a01b03818116600090815260018501602052604090205416156109d2576001600160a01b038181166000908152600185016020526040908190205490516347227b5d60e01b815284831660048201529116602482015260440161068b565b6001600160a01b03821660009081526020849052604081206109f390610b47565b111561018457604051637b815eed60e11b81526001600160a01b0380841660048301528216602482015260440161068b565b600080600080610a358686610b51565b925092509250610a458282610b9e565b5090949350505050565b6001600160a01b03821660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c0060205260409020805460018101909155818114610184576040516301d4b62360e61b81526001600160a01b03841660048201526024810182905260440161068b565b6000610264836001600160a01b038416610c57565b6000610264836001600160a01b038416610ca6565b606081600001805480602002602001604051908101604052809291908181526020018280548015610b3b57602002820191906000526020600020905b815481526020019060010190808311610b27575b50505050509050919050565b6000610173825490565b60008060008351604103610b8b5760208401516040850151606086015160001a610b7d88828585610d99565b955095509550505050610b97565b50508151600091506002905b9250925092565b6000826003811115610bb257610bb2611136565b03610bbb575050565b6001826003811115610bcf57610bcf611136565b03610bed5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610c0157610c01611136565b03610c225760405163fce698f760e01b81526004810182905260240161068b565b6003826003811115610c3657610c36611136565b03610280576040516335e2f38360e21b81526004810182905260240161068b565b6000818152600183016020526040812054610c9e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610173565b506000610173565b60008181526001830160205260408120548015610d8f576000610cca60018361114c565b8554909150600090610cde9060019061114c565b9050808214610d43576000866000018281548110610cfe57610cfe61116d565b9060005260206000200154905080876000018481548110610d2157610d2161116d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610d5457610d54611183565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610173565b6000915050610173565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610dd45750600091506003905082610e5e565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610e28573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e5457506000925060019150829050610e5e565b9250600091508190505b9450945094915050565b80356001600160a01b0381168114610e7f57600080fd5b919050565b600060208284031215610e9657600080fd5b61026482610e68565b6020808252825182820181905260009190848201906040850190845b81811015610ee05783516001600160a01b031683529284019291840191600101610ebb565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610f2557610f25610eec565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610f5457610f54610eec565b604052919050565b600060408284031215610f6e57600080fd5b610f76610f02565b9050610f8182610e68565b815260208083013567ffffffffffffffff80821115610f9f57600080fd5b818501915085601f830112610fb357600080fd5b813581811115610fc557610fc5610eec565b610fd7601f8201601f19168501610f2b565b91508082528684828501011115610fed57600080fd5b80848401858401376000908201840152918301919091525092915050565b60008060006060848603121561102057600080fd5b833567ffffffffffffffff8082111561103857600080fd5b61104487838801610f5c565b9450602086013591508082111561105a57600080fd5b5061106786828701610f5c565b925050604084013590509250925092565b6000806040838503121561108b57600080fd5b61109483610e68565b91506110a260208401610e68565b90509250929050565b6000806000606084860312156110c057600080fd5b6110c984610e68565b9250602084013567ffffffffffffffff8111156110e557600080fd5b61106786828701610f5c565b6000806040838503121561110457600080fd5b823567ffffffffffffffff81111561111b57600080fd5b61112785828601610f5c565b95602094909401359450505050565b634e487b7160e01b600052602160045260246000fd5b8181038181111561017357634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfe19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc00","sourceMap":"270:1475:173:-:0;;;;;;;;;;;;-1:-1:-1;385:22:71;:20;:22::i;:::-;270:1475:173;;1653:314:85;303:66:86;1779:14:85;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:85;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:85;1898:16;1886:28;;;;;1927:29;;158:42:516;;;1927:29:85;;146:2:516;131:18;1927:29:85;;;;;;;1844:119;1694:273;1653:314::o;14:192:516:-;270:1475:173;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063912b97581161005b578063912b9758146100f4578063d80bd3b914610117578063e65dfe9d1461012a578063f82103981461013d57600080fd5b806302345b981461008d5780631a31fc8d146100b657806320a00ac8146100cb578063260a409d146100ec575b600080fd5b6100a061009b366004610e84565b610168565b6040516100ad9190610e9f565b60405180910390f35b6100c96100c436600461100b565b610179565b005b6100de6100d9366004610e84565b610189565b6040519081526020016100ad565b6100c96101c6565b610107610102366004611078565b610222565b60405190151581526020016100ad565b6100c96101253660046110ab565b61026b565b6100c96101383660046110f1565b610276565b61015061014b366004610e84565b610284565b6040516001600160a01b0390911681526020016100ad565b6060610173826102c5565b92915050565b6101848383836102f6565b505050565b6001600160a01b03811660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c006020526040812054610173565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661021057604051630ef4733760e31b815260040160405180910390fd5b610220636ff9143960e01b6104da565b565b6001600160a01b0381811660009081527f19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc01602052604081205490918481169116145b9392505050565b6101848383836105b8565b6102808282610780565b5050565b6001600160a01b0380821660009081527f19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc016020526040812054909116610173565b6001600160a01b038116600090815260008051602061119a83398151915260205260409020606090610173906108a7565b8251825160008051602061119a83398151915291610316918391906108b4565b8351604080516001600160a01b0390921660208301528101839052600090610385906060015b604051602081830303815290604052805190602001207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b905083600001516001600160a01b03166103a3828660200151610a25565b6001600160a01b0316146103ca57604051632af0041d60e11b815260040160405180910390fd5b8351604080516001600160a01b03909216602083015281018490526000906103f49060600161033c565b905085600001516001600160a01b0316610412828860200151610a25565b6001600160a01b03161461043957604051632af0041d60e11b815260040160405180910390fd5b84516104459085610a4f565b855185516001600160a01b0316600090815260208590526040902061046991610ac1565b50845186516001600160a01b03908116600090815260018601602052604080822080546001600160a01b0319169484169490941790935587518951935190831693909216917f64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b57219190a3505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610567576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610580565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60008051602061119a8339815191526001600160a01b03841615806105e5575082516001600160a01b0316155b1561060357604051636df3f5c360e01b815260040160405180910390fd5b82600001516001600160a01b0316846001600160a01b031603610639576040516333976e3b60e11b815260040160405180910390fd5b82516001600160a01b0385811660009081526001840160205260409020548116911614610694578251604051635e300c8360e01b81526001600160a01b03808716600483015290911660248201526044015b60405180910390fd5b604080516001600160a01b03861660208201529081018390526000906106bc9060600161033c565b905083600001516001600160a01b03166106da828660200151610a25565b6001600160a01b03161461070157604051632af0041d60e11b815260040160405180910390fd5b6001600160a01b038086166000908152600184016020908152604080832080546001600160a01b031916905587519093168252849052206107429086610ad6565b5060405133906001600160a01b038716907f9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da290600090a35050505050565b815160008051602061119a8339815191529033906107a190839083906108b4565b604080516001600160a01b03831660208201529081018490526000906107c99060600161033c565b905084600001516001600160a01b03166107e7828760200151610a25565b6001600160a01b03161461080e57604051632af0041d60e11b815260040160405180910390fd5b845161081a9085610a4f565b84516001600160a01b0316600090815260208490526040902061083d9083610ac1565b5084516001600160a01b03838116600081815260018701602052604080822080546001600160a01b0319169585169590951790945588519351939092169290917f64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b572191a35050505050565b6060600061026483610aeb565b6001600160a01b03821615806108d157506001600160a01b038116155b156108ef57604051636df3f5c360e01b815260040160405180910390fd5b806001600160a01b0316826001600160a01b0316036109215760405163848ba26d60e01b815260040160405180910390fd5b6001600160a01b038281166000908152600185016020526040902054161561096f576040516314790b7f60e01b81526001600160a01b0380841660048301528216602482015260440161068b565b6001600160a01b03818116600090815260018501602052604090205416156109d2576001600160a01b038181166000908152600185016020526040908190205490516347227b5d60e01b815284831660048201529116602482015260440161068b565b6001600160a01b03821660009081526020849052604081206109f390610b47565b111561018457604051637b815eed60e11b81526001600160a01b0380841660048301528216602482015260440161068b565b600080600080610a358686610b51565b925092509250610a458282610b9e565b5090949350505050565b6001600160a01b03821660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c0060205260409020805460018101909155818114610184576040516301d4b62360e61b81526001600160a01b03841660048201526024810182905260440161068b565b6000610264836001600160a01b038416610c57565b6000610264836001600160a01b038416610ca6565b606081600001805480602002602001604051908101604052809291908181526020018280548015610b3b57602002820191906000526020600020905b815481526020019060010190808311610b27575b50505050509050919050565b6000610173825490565b60008060008351604103610b8b5760208401516040850151606086015160001a610b7d88828585610d99565b955095509550505050610b97565b50508151600091506002905b9250925092565b6000826003811115610bb257610bb2611136565b03610bbb575050565b6001826003811115610bcf57610bcf611136565b03610bed5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610c0157610c01611136565b03610c225760405163fce698f760e01b81526004810182905260240161068b565b6003826003811115610c3657610c36611136565b03610280576040516335e2f38360e21b81526004810182905260240161068b565b6000818152600183016020526040812054610c9e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610173565b506000610173565b60008181526001830160205260408120548015610d8f576000610cca60018361114c565b8554909150600090610cde9060019061114c565b9050808214610d43576000866000018281548110610cfe57610cfe61116d565b9060005260206000200154905080876000018481548110610d2157610d2161116d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610d5457610d54611183565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610173565b6000915050610173565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610dd45750600091506003905082610e5e565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610e28573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e5457506000925060019150829050610e5e565b9250600091508190505b9450945094915050565b80356001600160a01b0381168114610e7f57600080fd5b919050565b600060208284031215610e9657600080fd5b61026482610e68565b6020808252825182820181905260009190848201906040850190845b81811015610ee05783516001600160a01b031683529284019291840191600101610ebb565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610f2557610f25610eec565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610f5457610f54610eec565b604052919050565b600060408284031215610f6e57600080fd5b610f76610f02565b9050610f8182610e68565b815260208083013567ffffffffffffffff80821115610f9f57600080fd5b818501915085601f830112610fb357600080fd5b813581811115610fc557610fc5610eec565b610fd7601f8201601f19168501610f2b565b91508082528684828501011115610fed57600080fd5b80848401858401376000908201840152918301919091525092915050565b60008060006060848603121561102057600080fd5b833567ffffffffffffffff8082111561103857600080fd5b61104487838801610f5c565b9450602086013591508082111561105a57600080fd5b5061106786828701610f5c565b925050604084013590509250925092565b6000806040838503121561108b57600080fd5b61109483610e68565b91506110a260208401610e68565b90509250929050565b6000806000606084860312156110c057600080fd5b6110c984610e68565b9250602084013567ffffffffffffffff8111156110e557600080fd5b61106786828701610f5c565b6000806040838503121561110457600080fd5b823567ffffffffffffffff81111561111b57600080fd5b61112785828601610f5c565b95602094909401359450505050565b634e487b7160e01b600052602160045260246000fd5b8181038181111561017357634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfe19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc00","sourceMap":"270:1475:173:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1085:150;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;660:190;;;;;;:::i;:::-;;:::i;:::-;;1613:130;;;;;;:::i;:::-;;:::i;:::-;;;3412:25:516;;;3400:2;3385:18;1613:130:173;3266:177:516;332:110:173;;;:::i;1463:146::-;;;;;;:::i;:::-;;:::i;:::-;;;3878:14:516;;3871:22;3853:41;;3841:2;3826:18;1463:146:173;3713:187:516;884:157:173;;;;;;:::i;:::-;;:::i;476:150::-;;;;;;:::i;:::-;;:::i;1280:138::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5001:32:516;;;4983:51;;4971:2;4956:18;1280:138:173;4837:203:516;1085:150:173;1162:24;1201:29;1222:7;1201:20;:29::i;:::-;1194:36;1085:150;-1:-1:-1;;1085:150:173:o;660:190::-;795:50;819:6;827:10;839:5;795:23;:50::i;:::-;660:190;;;:::o;1613:130::-;-1:-1:-1;;;;;533:37:147;;1695:7:173;533:37:147;;;1561:66;533:37;;;;;;1717:21:173;443:132:147;332:110:173;303:66:86;1263:42:85;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:85;;;;;;;;;;;1258:100;393:44:173::1;-1:-1:-1::0;;;393:13:173::1;:44::i;:::-;332:110::o:0;1463:146::-;-1:-1:-1;;;;;6107:26:174;;;1554:4:173;6107:26:174;;;:18;:26;;;;;;1554:4:173;;6107:37:174;;;:26;;:37;1573:31:173;1566:38;1463:146;-1:-1:-1;;;1463:146:173:o;884:157::-;998:38;1010:6;1018:10;1030:5;998:11;:38::i;476:150::-;579:42;603:10;615:5;579:23;:42::i;:::-;476:150;;:::o;1280:138::-;-1:-1:-1;;;;;5867:50:174;;;1356:15:173;5867:50:174;;;:42;:50;;;;;;1356:15:173;;5867:50:174;1386:27:173;5761:161:174;5574:183;-1:-1:-1;;;;;5691:52:174;;:43;:52;;;-1:-1:-1;;;;;;;;;;;5691:52:174;;;;;5652:24;;5691:61;;:59;:61::i;2484:1403::-;2713:11;;2726:15;;-1:-1:-1;;;;;;;;;;;367:66:175;2694:48:174;;367:66:175;;2713:11:174;2694:14;:48::i;:::-;2940:11;;2929:30;;;-1:-1:-1;;;;;5237:32:516;;;2929:30:174;;;5219:51:516;5286:18;;5279:34;;;2843:26:174;;2872:94;;5192:18:516;;2929:30:174;;;;;;;;;;;;;2919:41;;;;;;1403:34:442;1298:14;1390:48;;;1499:4;1492:25;;;;1597:4;1581:21;;;1222:460;2872:94:174;2843:123;;3134:10;:15;;;-1:-1:-1;;;;;3075:74:174;:55;3089:18;3109:10;:20;;;3075:13;:55::i;:::-;-1:-1:-1;;;;;3075:74:174;;3064:144;;3171:30;;-1:-1:-1;;;3171:30:174;;;;;;;;;;;3064:144;3310:15;;3299:34;;;-1:-1:-1;;;;;5237:32:516;;;3299:34:174;;;5219:51:516;5286:18;;5279:34;;;3214:25:174;;3242:98;;5192:18:516;;3299:34:174;5045:274:516;3242:98:174;3214:126;;3496:6;:11;;;-1:-1:-1;;;;;3442:65:174;:50;3456:17;3475:6;:16;;;3442:13;:50::i;:::-;-1:-1:-1;;;;;3442:65:174;;3438:123;;3524:30;;-1:-1:-1;;;3524:30:174;;;;;;;;;;;3438:123;3657:15;;3640:40;;3674:5;3640:16;:40::i;:::-;3754:11;;3733:15;;-1:-1:-1;;;;;3713:36:174;3754:11;3713:36;;;;;;;;;;:53;;:40;:53::i;:::-;-1:-1:-1;3806:15:174;;3791:11;;-1:-1:-1;;;;;3772:31:174;;;3806:15;3772:31;;;:18;;;:31;;;;;;:49;;-1:-1:-1;;;;;;3772:49:174;;;;;;;;;;;3866:15;;3853:11;;3833:49;;;;;;;;;;;;3806:15;3833:49;2617:1270;;;2484:1403;;;:::o;452:282:88:-;-1:-1:-1;;;;;;1121:62:88;;1096:4;1121:62;;;303:66:90;1121:62:88;;;;;;;;:70;;:62;:70;510:182;;-1:-1:-1;;;;;;556:62:88;;:49;:62;;;303:66:90;556:62:88;;;;;:69;;-1:-1:-1;;556:69:88;621:4;556:69;;;510:182;;;653:32;;-1:-1:-1;;;653:32:88;;;;;;;;;;;510:182;702:27;;-1:-1:-1;;;;;;702:27:88;;;;;;;;452:282;:::o;4064:1339:174:-;-1:-1:-1;;;;;;;;;;;;;;;;4328:28:174;;;;:61;;-1:-1:-1;4360:15:174;;-1:-1:-1;;;;;4360:29:174;;4328:61;4324:117;;;4406:28;;-1:-1:-1;;;4406:28:174;;;;;;;;;;;4324:117;4520:10;:15;;;-1:-1:-1;;;;;4502:33:174;:14;-1:-1:-1;;;;;4502:33:174;;4498:97;;4552:36;;-1:-1:-1;;;4552:36:174;;;;;;;;;;;4498:97;4701:15;;-1:-1:-1;;;;;4663:34:174;;;4701:15;4663:34;;;:18;;;:34;;;;;;;;:53;;;4659:135;;4771:15;;4733:54;;-1:-1:-1;;;4733:54:174;;-1:-1:-1;;;;;5554:15:516;;;4733:54:174;;;5536:34:516;5606:15;;;5586:18;;;5579:43;5471:18;;4733:54:174;;;;;;;;4659:135;4886:33;;;-1:-1:-1;;;;;5237:32:516;;4886:33:174;;;5219:51:516;5286:18;;;5279:34;;;4800:26:174;;4829:97;;5192:18:516;;4886:33:174;5045:274:516;4829:97:174;4800:126;;5094:10;:15;;;-1:-1:-1;;;;;5035:74:174;:55;5049:18;5069:10;:20;;;5035:13;:55::i;:::-;-1:-1:-1;;;;;5035:74:174;;5024:144;;5131:30;;-1:-1:-1;;;5131:30:174;;;;;;;;;;;5024:144;-1:-1:-1;;;;;5236:34:174;;;5281:1;5236:34;;;:18;;;:34;;;;;;;;:47;;-1:-1:-1;;;;;;5236:47:174;;;5309:15;;5289:36;;;;;;;;;:59;;5255:14;5289:43;:59::i;:::-;-1:-1:-1;5360:38:174;;5387:10;;-1:-1:-1;;;;;5360:38:174;;;;;;;;4181:1222;;4064:1339;;;:::o;1065:1124::-;1382:15;;-1:-1:-1;;;;;;;;;;;367:66:175;1335:10:174;;1352:46;;367:66:175;;1335:10:174;;1352:14;:46::i;:::-;1592:28;;;-1:-1:-1;;;;;5237:32:516;;1592:28:174;;;5219:51:516;5286:18;;;5279:34;;;1506:26:174;;1535:92;;5192:18:516;;1592:28:174;5045:274:516;1535:92:174;1506:121;;1795:10;:15;;;-1:-1:-1;;;;;1736:74:174;:55;1750:18;1770:10;:20;;;1736:13;:55::i;:::-;-1:-1:-1;;;;;1736:74:174;;1725:144;;1832:30;;-1:-1:-1;;;1832:30:174;;;;;;;;;;;1725:144;1965:15;;1948:40;;1982:5;1948:16;:40::i;:::-;2041:15;;-1:-1:-1;;;;;2021:36:174;:19;:36;;;;;;;;;;:51;;2062:9;2021:40;:51::i;:::-;-1:-1:-1;2110:15:174;;-1:-1:-1;;;;;2078:29:174;;;2110:15;2078:29;;;:18;;;:29;;;;;;:47;;-1:-1:-1;;;;;;2078:47:174;;;;;;;;;;;2168:15;;2137:47;;;;;;;2078:29;;2137:47;;;1166:1023;;;1065:1124;;:::o;10270:300:449:-;10333:16;10361:22;10386:19;10394:3;10386:7;:19::i;6327:1058:174:-;-1:-1:-1;;;;;6522:20:174;;;;:48;;-1:-1:-1;;;;;;6546:24:174;;;6522:48;6518:104;;;6587:28;;-1:-1:-1;;;6587:28:174;;;;;;;;;;;6518:104;6684:10;-1:-1:-1;;;;;6674:20:174;:6;-1:-1:-1;;;;;6674:20:174;;6670:78;;6711:30;;-1:-1:-1;;;6711:30:174;;;;;;;;;;;6670:78;-1:-1:-1;;;;;6828:26:174;;;6866:1;6828:26;;;:18;;;:26;;;;;;;:40;6824:117;;6885:49;;-1:-1:-1;;;6885:49:174;;-1:-1:-1;;;;;5554:15:516;;;6885:49:174;;;5536:34:516;5606:15;;5586:18;;;5579:43;5471:18;;6885:49:174;5324:304:516;6824:117:174;-1:-1:-1;;;;;7030:30:174;;;7072:1;7030:30;;;:18;;;:30;;;;;;;:44;7026:170;;-1:-1:-1;;;;;7151:30:174;;;;;;;:18;;;:30;;;;;;;;7091:98;;-1:-1:-1;;;7091:98:174;;5554:15:516;;;7091:98:174;;;5536:34:516;7151:30:174;;5586:18:516;;;5579:43;5471:18;;7091:98:174;5324:304:516;7026:170:174;-1:-1:-1;;;;;7263:27:174;;7302:1;7263:27;;;;;;;;;;:36;;:34;:36::i;:::-;:40;7259:122;;;7320:54;;-1:-1:-1;;;7320:54:174;;-1:-1:-1;;;;;5554:15:516;;;7320:54:174;;;5536:34:516;5606:15;;5586:18;;;5579:43;5471:18;;7320:54:174;5324:304:516;3702:255:439;3780:7;3800:17;3819:18;3839:16;3859:27;3870:4;3876:9;3859:10;:27::i;:::-;3799:87;;;;;;3896:28;3908:5;3915:8;3896:11;:28::i;:::-;-1:-1:-1;3941:9:439;;3702:255;-1:-1:-1;;;;3702:255:439:o;1168:202:147:-;-1:-1:-1;;;;;1015:37:147;;1247:15;1015:37;;;1561:66;1015:37;;;;;:39;;;;;;;;1291:16;;;1287:79;;1324:35;;-1:-1:-1;;;1324:35:147;;-1:-1:-1;;;;;5237:32:516;;1324:35:147;;;5219:51:516;5286:18;;;5279:34;;;5192:18;;1324:35:147;5045:274:516;8316:150:449;8386:4;8409:50;8414:3;-1:-1:-1;;;;;8434:23:449;;8409:4;:50::i;8634:156::-;8707:4;8730:53;8738:3;-1:-1:-1;;;;;8758:23:449;;8730:7;:53::i;5581:109::-;5637:16;5672:3;:11;;5665:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5581:109;;;:::o;9117:115::-;9180:7;9206:19;9214:3;4556:18;;4474:107;2129:766:439;2210:7;2219:12;2233:7;2256:9;:16;2276:2;2256:22;2252:637;;2592:4;2577:20;;2571:27;2641:4;2626:20;;2620:27;2698:4;2683:20;;2677:27;2294:9;2669:36;2739:25;2750:4;2669:36;2571:27;2620;2739:10;:25::i;:::-;2732:32;;;;;;;;;;;2252:637;-1:-1:-1;;2860:16:439;;2811:1;;-1:-1:-1;2815:35:439;;2252:637;2129:766;;;;;:::o;7196:532::-;7291:20;7282:5;:29;;;;;;;;:::i;:::-;;7278:444;;7196:532;;:::o;7278:444::-;7387:29;7378:5;:38;;;;;;;;:::i;:::-;;7374:348;;7439:23;;-1:-1:-1;;;7439:23:439;;;;;;;;;;;7374:348;7492:35;7483:5;:44;;;;;;;;:::i;:::-;;7479:243;;7550:46;;-1:-1:-1;;;7550:46:439;;;;;3412:25:516;;;3385:18;;7550:46:439;3266:177:516;7479:243:439;7626:30;7617:5;:39;;;;;;;;:::i;:::-;;7613:109;;7679:32;;-1:-1:-1;;;7679:32:439;;;;;3412:25:516;;;3385:18;;7679:32:439;3266:177:516;2241:406:449;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:449;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:449;2618:12;;2815:1368;2881:4;3010:21;;;:14;;;:21;;;;;;3046:13;;3042:1135;;3413:18;3434:12;3445:1;3434:8;:12;:::i;:::-;3480:18;;3413:33;;-1:-1:-1;3460:17:449;;3480:22;;3501:1;;3480:22;:::i;:::-;3460:42;;3535:9;3521:10;:23;3517:378;;3564:17;3584:3;:11;;3596:9;3584:22;;;;;;;;:::i;:::-;;;;;;;;;3564:42;;3731:9;3705:3;:11;;3717:10;3705:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;3844:25;;;:14;;;:25;;;;;:36;;;3517:378;3973:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4076:3;:14;;:21;4091:5;4076:21;;;;;;;;;;;4069:28;;;4119:4;4112:11;;;;;;;3042:1135;4161:5;4154:12;;;;;5140:1530:439;5266:7;;;6199:66;6186:79;;6182:164;;;-1:-1:-1;6297:1:439;;-1:-1:-1;6301:30:439;;-1:-1:-1;6333:1:439;6281:54;;6182:164;6457:24;;;6440:14;6457:24;;;;;;;;;6668:25:516;;;6741:4;6729:17;;6709:18;;;6702:45;;;;6763:18;;;6756:34;;;6806:18;;;6799:34;;;6457:24:439;;6640:19:516;;6457:24:439;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6457:24:439;;-1:-1:-1;;6457:24:439;;;-1:-1:-1;;;;;;;6495:20:439;;6491:113;;-1:-1:-1;6547:1:439;;-1:-1:-1;6551:29:439;;-1:-1:-1;6547:1:439;;-1:-1:-1;6531:62:439;;6491:113;6622:6;-1:-1:-1;6630:20:439;;-1:-1:-1;6630:20:439;;-1:-1:-1;5140:1530:439;;;;;;;;;:::o;14:173:516:-;82:20;;-1:-1:-1;;;;;131:31:516;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:658::-;554:2;606:21;;;676:13;;579:18;;;698:22;;;525:4;;554:2;777:15;;;;751:2;736:18;;;525:4;820:195;834:6;831:1;828:13;820:195;;;899:13;;-1:-1:-1;;;;;895:39:516;883:52;;990:15;;;;955:12;;;;931:1;849:9;820:195;;;-1:-1:-1;1032:3:516;;383:658;-1:-1:-1;;;;;;383:658:516:o;1046:127::-;1107:10;1102:3;1098:20;1095:1;1088:31;1138:4;1135:1;1128:15;1162:4;1159:1;1152:15;1178:256;1249:4;1243:11;;;1281:17;;1328:18;1313:34;;1349:22;;;1310:62;1307:88;;;1375:18;;:::i;:::-;1411:4;1404:24;1178:256;:::o;1439:275::-;1510:2;1504:9;1575:2;1556:13;;-1:-1:-1;;1552:27:516;1540:40;;1610:18;1595:34;;1631:22;;;1592:62;1589:88;;;1657:18;;:::i;:::-;1693:2;1686:22;1439:275;;-1:-1:-1;1439:275:516:o;1719:858::-;1778:5;1826:4;1814:9;1809:3;1805:19;1801:30;1798:50;;;1844:1;1841;1834:12;1798:50;1866:21;;:::i;:::-;1857:30;;1910:29;1929:9;1910:29;:::i;:::-;1903:5;1896:44;1959:2;2012;2001:9;1997:18;1984:32;2035:18;2076:2;2068:6;2065:14;2062:34;;;2092:1;2089;2082:12;2062:34;2130:6;2119:9;2115:22;2105:32;;2175:3;2168:4;2164:2;2160:13;2156:23;2146:51;;2193:1;2190;2183:12;2146:51;2229:2;2216:16;2251:2;2247;2244:10;2241:36;;;2257:18;;:::i;:::-;2299:53;2342:2;2323:13;;-1:-1:-1;;2319:27:516;2315:36;;2299:53;:::i;:::-;2286:66;;2375:2;2368:5;2361:17;2415:3;2410:2;2405;2401;2397:11;2393:20;2390:29;2387:49;;;2432:1;2429;2422:12;2387:49;2487:2;2482;2478;2474:11;2469:2;2462:5;2458:14;2445:45;2531:1;2510:14;;;2506:23;;2499:34;2549:14;;;2542:29;;;;-1:-1:-1;2553:5:516;1719:858;-1:-1:-1;;1719:858:516:o;2582:679::-;2721:6;2729;2737;2790:2;2778:9;2769:7;2765:23;2761:32;2758:52;;;2806:1;2803;2796:12;2758:52;2846:9;2833:23;2875:18;2916:2;2908:6;2905:14;2902:34;;;2932:1;2929;2922:12;2902:34;2955:63;3010:7;3001:6;2990:9;2986:22;2955:63;:::i;:::-;2945:73;;3071:2;3060:9;3056:18;3043:32;3027:48;;3100:2;3090:8;3087:16;3084:36;;;3116:1;3113;3106:12;3084:36;;3139:65;3196:7;3185:8;3174:9;3170:24;3139:65;:::i;:::-;3129:75;;;3251:2;3240:9;3236:18;3223:32;3213:42;;2582:679;;;;;:::o;3448:260::-;3516:6;3524;3577:2;3565:9;3556:7;3552:23;3548:32;3545:52;;;3593:1;3590;3583:12;3545:52;3616:29;3635:9;3616:29;:::i;:::-;3606:39;;3664:38;3698:2;3687:9;3683:18;3664:38;:::i;:::-;3654:48;;3448:260;;;;;:::o;3905:498::-;4013:6;4021;4029;4082:2;4070:9;4061:7;4057:23;4053:32;4050:52;;;4098:1;4095;4088:12;4050:52;4121:29;4140:9;4121:29;:::i;:::-;4111:39;;4201:2;4190:9;4186:18;4173:32;4228:18;4220:6;4217:30;4214:50;;;4260:1;4257;4250:12;4214:50;4283:63;4338:7;4329:6;4318:9;4314:22;4283:63;:::i;4408:424::-;4507:6;4515;4568:2;4556:9;4547:7;4543:23;4539:32;4536:52;;;4584:1;4581;4574:12;4536:52;4624:9;4611:23;4657:18;4649:6;4646:30;4643:50;;;4689:1;4686;4679:12;4643:50;4712:63;4767:7;4758:6;4747:9;4743:22;4712:63;:::i;:::-;4702:73;4822:2;4807:18;;;;4794:32;;-1:-1:-1;;;;4408:424:516:o;5633:127::-;5694:10;5689:3;5685:20;5682:1;5675:31;5725:4;5722:1;5715:15;5749:4;5746:1;5739:15;5947:225;6014:9;;;6035:11;;;6032:134;;;6088:10;6083:3;6079:20;6076:1;6069:31;6123:4;6120:1;6113:15;6151:4;6148:1;6141:15;6177:127;6238:10;6233:3;6229:20;6226:1;6219:31;6269:4;6266:1;6259:15;6293:4;6290:1;6283:15;6309:127;6370:10;6365:3;6361:20;6358:1;6351:31;6401:4;6398:1;6391:15;6425:4;6422:1;6415:15","linkReferences":{}},"methodIdentifiers":{"__WalletLink_init()":"260a409d","checkIfLinked(address,address)":"912b9758","getLatestNonceForRootKey(address)":"20a00ac8","getRootKeyForWallet(address)":"f8210398","getWalletsByRootKey(address)":"02345b98","linkCallerToRootKey((address,bytes),uint256)":"e65dfe9d","linkWalletToRootKey((address,bytes),(address,bytes),uint256)":"1a31fc8d","removeLink(address,(address,bytes),uint256)":"d80bd3b9"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"currentNonce\",\"type\":\"uint256\"}],\"name\":\"InvalidAccountNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rootKey\",\"type\":\"address\"}],\"name\":\"WalletLink__CannotLinkToRootWallet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WalletLink__CannotLinkToSelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WalletLink__CannotRemoveRootWallet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WalletLink__InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WalletLink__InvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rootKey\",\"type\":\"address\"}],\"name\":\"WalletLink__LinkAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rootKey\",\"type\":\"address\"}],\"name\":\"WalletLink__LinkedToAnotherRootKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rootKey\",\"type\":\"address\"}],\"name\":\"WalletLink__NotLinked\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rootKey\",\"type\":\"address\"}],\"name\":\"LinkWalletToRootKey\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"secondWallet\",\"type\":\"address\"}],\"name\":\"RemoveLink\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__WalletLink_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rootKey\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"}],\"name\":\"checkIfLinked\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rootKey\",\"type\":\"address\"}],\"name\":\"getLatestNonceForRootKey\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"}],\"name\":\"getRootKeyForWallet\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rootKey\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rootKey\",\"type\":\"address\"}],\"name\":\"getWalletsByRootKey\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"wallets\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IWalletLinkBase.LinkedWallet\",\"name\":\"rootWallet\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"linkCallerToRootKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IWalletLinkBase.LinkedWallet\",\"name\":\"wallet\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IWalletLinkBase.LinkedWallet\",\"name\":\"rootWallet\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"linkWalletToRootKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IWalletLinkBase.LinkedWallet\",\"name\":\"rootWallet\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"removeLink\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ECDSAInvalidSignature()\":[{\"details\":\"The signature derives the `address(0)`.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}],\"InvalidAccountNonce(address,uint256)\":[{\"details\":\"The nonce used for an `account` is not the expected current nonce.\"}]},\"kind\":\"dev\",\"methods\":{\"checkIfLinked(address,address)\":{\"params\":{\"rootKey\":\"the public key of the users rootkey to check\",\"wallet\":\"the ethereum wallet to check\"},\"returns\":{\"_0\":\"areLinked boolean if they are linked together\"}},\"getLatestNonceForRootKey(address)\":{\"params\":{\"rootKey\":\"the public key of the users rootkey to check\"}},\"getRootKeyForWallet(address)\":{\"params\":{\"wallet\":\"the ethereum wallet to find associated root key for\"},\"returns\":{\"rootKey\":\"the rootkey that this wallet is linked to\"}},\"getWalletsByRootKey(address)\":{\"params\":{\"rootKey\":\"the public key of the users rootkey to find associated wallets for\"},\"returns\":{\"wallets\":\"an array of ethereum wallets linked to this root key\"}},\"linkCallerToRootKey((address,bytes),uint256)\":{\"params\":{\"nonce\":\"a nonce used to prevent replay attacks, nonce must always be higher than previous nonce\",\"rootWallet\":\"the root wallet that the caller is linking to\"}},\"linkWalletToRootKey((address,bytes),(address,bytes),uint256)\":{\"params\":{\"nonce\":\"a nonce used to prevent replay attacks, nonce must always be higher than previous nonce\",\"rootWallet\":\"the root wallet that the caller is linking to\",\"wallet\":\"the wallet being linked to the root wallet\"}},\"removeLink(address,(address,bytes),uint256)\":{\"params\":{\"wallet\":\"the wallet being unlinked from the sending wallet\"}}},\"version\":1},\"userdoc\":{\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"},\"LinkWalletToRootKey(address,address)\":{\"notice\":\"Emitted when a user links their wallet to a rootKey\"},\"RemoveLink(address,address)\":{\"notice\":\"Emitted when two wallets are unlinked\"}},\"kind\":\"user\",\"methods\":{\"checkIfLinked(address,address)\":{\"notice\":\"checks if a root key and wallet are linked\"},\"getLatestNonceForRootKey(address)\":{\"notice\":\"gets the latest nonce for a rootkey to use a higher one for next link action\"},\"getRootKeyForWallet(address)\":{\"notice\":\"Returns the root key for a given wallet\"},\"getWalletsByRootKey(address)\":{\"notice\":\"Returns all wallets linked to a root key\"},\"linkCallerToRootKey((address,bytes),uint256)\":{\"notice\":\"Link caller wallet to a root wallet\"},\"linkWalletToRootKey((address,bytes),(address,bytes),uint256)\":{\"notice\":\"Link a wallet to a root wallet\"},\"removeLink(address,(address,bytes),uint256)\":{\"notice\":\"Called via the rootkey signing a message to a remove a wallet from itself\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/factory/facets/wallet-link/WalletLink.sol\":\"WalletLink\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/utils/Nonces.sol\":{\"keccak256\":\"0xce0cce96c8f30e4052523e2c67c7b08ed9defa8c2e3858d4534b359be9ee9ee3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://caae09675d571304907f51e64c255981c5fbfbd60bf26d0117c00ecd7ed7a7fb\",\"dweb:/ipfs/QmPNReTvJDZ242duATLyDDt1JUUd2ACg472E1vftw5zgXB\"]},\"contracts/src/factory/facets/wallet-link/IWalletLink.sol\":{\"keccak256\":\"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13\",\"dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR\"]},\"contracts/src/factory/facets/wallet-link/WalletLink.sol\":{\"keccak256\":\"0x0940bd508eeb3fcd0199c2a939bb7ff871b1b2929881f23cd346961a769fd807\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c8d144ca39586757c4d58a76489b4cef6c8d0ad5dfb5a77686b6e49d8b310c44\",\"dweb:/ipfs/QmQd9TQtCzeXSgn5xvBADXEs7kVB9o7hxo8Nvqz4u5nJTu\"]},\"contracts/src/factory/facets/wallet-link/WalletLinkBase.sol\":{\"keccak256\":\"0xfc27a5f7a57d45076dd4b4af704d6941f82d4ec825b262a0a144a00b3c83a0f0\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a79133d20a0ad20691c88dbfa3832c1f767273eb17aaf3f20ab1f128bb5a7b48\",\"dweb:/ipfs/QmcJbygpvz1tPifobw2SfgNvKRB4w9EZVqsM8kZKMtWf6e\"]},\"contracts/src/factory/facets/wallet-link/WalletLinkStorage.sol\":{\"keccak256\":\"0x2903de293c75c301de25bef504a0bb56b31158a2d5340bdf8103fa8f0c06bad1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3e8bdb8c34b2c3ef8fff3755dce77dea42bc5d605e030cca17791c0b697e64c4\",\"dweb:/ipfs/QmYhS5h3sja3dZaoaQ9jdhwsrNSbJ4oPU5VtCbotvedUXP\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453\",\"dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i\"]},\"lib/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c\",\"dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF\"]},\"lib/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\":{\"keccak256\":\"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c\",\"dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875\",\"dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L\"]},\"lib/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc\",\"dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"ECDSAInvalidSignature"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"ECDSAInvalidSignatureLength"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"type":"error","name":"ECDSAInvalidSignatureS"},{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"currentNonce","type":"uint256"}],"type":"error","name":"InvalidAccountNonce"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"address","name":"rootKey","type":"address"}],"type":"error","name":"WalletLink__CannotLinkToRootWallet"},{"inputs":[],"type":"error","name":"WalletLink__CannotLinkToSelf"},{"inputs":[],"type":"error","name":"WalletLink__CannotRemoveRootWallet"},{"inputs":[],"type":"error","name":"WalletLink__InvalidAddress"},{"inputs":[],"type":"error","name":"WalletLink__InvalidSignature"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"address","name":"rootKey","type":"address"}],"type":"error","name":"WalletLink__LinkAlreadyExists"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"address","name":"rootKey","type":"address"}],"type":"error","name":"WalletLink__LinkedToAnotherRootKey"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"address","name":"rootKey","type":"address"}],"type":"error","name":"WalletLink__NotLinked"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"wallet","type":"address","indexed":true},{"internalType":"address","name":"rootKey","type":"address","indexed":true}],"type":"event","name":"LinkWalletToRootKey","anonymous":false},{"inputs":[{"internalType":"address","name":"wallet","type":"address","indexed":true},{"internalType":"address","name":"secondWallet","type":"address","indexed":true}],"type":"event","name":"RemoveLink","anonymous":false},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"__WalletLink_init"},{"inputs":[{"internalType":"address","name":"rootKey","type":"address"},{"internalType":"address","name":"wallet","type":"address"}],"stateMutability":"view","type":"function","name":"checkIfLinked","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"rootKey","type":"address"}],"stateMutability":"view","type":"function","name":"getLatestNonceForRootKey","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"stateMutability":"view","type":"function","name":"getRootKeyForWallet","outputs":[{"internalType":"address","name":"rootKey","type":"address"}]},{"inputs":[{"internalType":"address","name":"rootKey","type":"address"}],"stateMutability":"view","type":"function","name":"getWalletsByRootKey","outputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}]},{"inputs":[{"internalType":"struct IWalletLinkBase.LinkedWallet","name":"rootWallet","type":"tuple","components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}]},{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"linkCallerToRootKey"},{"inputs":[{"internalType":"struct IWalletLinkBase.LinkedWallet","name":"wallet","type":"tuple","components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}]},{"internalType":"struct IWalletLinkBase.LinkedWallet","name":"rootWallet","type":"tuple","components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}]},{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"linkWalletToRootKey"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"struct IWalletLinkBase.LinkedWallet","name":"rootWallet","type":"tuple","components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}]},{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"removeLink"}],"devdoc":{"kind":"dev","methods":{"checkIfLinked(address,address)":{"params":{"rootKey":"the public key of the users rootkey to check","wallet":"the ethereum wallet to check"},"returns":{"_0":"areLinked boolean if they are linked together"}},"getLatestNonceForRootKey(address)":{"params":{"rootKey":"the public key of the users rootkey to check"}},"getRootKeyForWallet(address)":{"params":{"wallet":"the ethereum wallet to find associated root key for"},"returns":{"rootKey":"the rootkey that this wallet is linked to"}},"getWalletsByRootKey(address)":{"params":{"rootKey":"the public key of the users rootkey to find associated wallets for"},"returns":{"wallets":"an array of ethereum wallets linked to this root key"}},"linkCallerToRootKey((address,bytes),uint256)":{"params":{"nonce":"a nonce used to prevent replay attacks, nonce must always be higher than previous nonce","rootWallet":"the root wallet that the caller is linking to"}},"linkWalletToRootKey((address,bytes),(address,bytes),uint256)":{"params":{"nonce":"a nonce used to prevent replay attacks, nonce must always be higher than previous nonce","rootWallet":"the root wallet that the caller is linking to","wallet":"the wallet being linked to the root wallet"}},"removeLink(address,(address,bytes),uint256)":{"params":{"wallet":"the wallet being unlinked from the sending wallet"}}},"version":1},"userdoc":{"kind":"user","methods":{"checkIfLinked(address,address)":{"notice":"checks if a root key and wallet are linked"},"getLatestNonceForRootKey(address)":{"notice":"gets the latest nonce for a rootkey to use a higher one for next link action"},"getRootKeyForWallet(address)":{"notice":"Returns the root key for a given wallet"},"getWalletsByRootKey(address)":{"notice":"Returns all wallets linked to a root key"},"linkCallerToRootKey((address,bytes),uint256)":{"notice":"Link caller wallet to a root wallet"},"linkWalletToRootKey((address,bytes),(address,bytes),uint256)":{"notice":"Link a wallet to a root wallet"},"removeLink(address,(address,bytes),uint256)":{"notice":"Called via the rootkey signing a message to a remove a wallet from itself"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/factory/facets/wallet-link/WalletLink.sol":"WalletLink"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/utils/Nonces.sol":{"keccak256":"0xce0cce96c8f30e4052523e2c67c7b08ed9defa8c2e3858d4534b359be9ee9ee3","urls":["bzz-raw://caae09675d571304907f51e64c255981c5fbfbd60bf26d0117c00ecd7ed7a7fb","dweb:/ipfs/QmPNReTvJDZ242duATLyDDt1JUUd2ACg472E1vftw5zgXB"],"license":"Apache-2.0"},"contracts/src/factory/facets/wallet-link/IWalletLink.sol":{"keccak256":"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b","urls":["bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13","dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR"],"license":"Apache-2.0"},"contracts/src/factory/facets/wallet-link/WalletLink.sol":{"keccak256":"0x0940bd508eeb3fcd0199c2a939bb7ff871b1b2929881f23cd346961a769fd807","urls":["bzz-raw://c8d144ca39586757c4d58a76489b4cef6c8d0ad5dfb5a77686b6e49d8b310c44","dweb:/ipfs/QmQd9TQtCzeXSgn5xvBADXEs7kVB9o7hxo8Nvqz4u5nJTu"],"license":"Apache-2.0"},"contracts/src/factory/facets/wallet-link/WalletLinkBase.sol":{"keccak256":"0xfc27a5f7a57d45076dd4b4af704d6941f82d4ec825b262a0a144a00b3c83a0f0","urls":["bzz-raw://a79133d20a0ad20691c88dbfa3832c1f767273eb17aaf3f20ab1f128bb5a7b48","dweb:/ipfs/QmcJbygpvz1tPifobw2SfgNvKRB4w9EZVqsM8kZKMtWf6e"],"license":"Apache-2.0"},"contracts/src/factory/facets/wallet-link/WalletLinkStorage.sol":{"keccak256":"0x2903de293c75c301de25bef504a0bb56b31158a2d5340bdf8103fa8f0c06bad1","urls":["bzz-raw://3e8bdb8c34b2c3ef8fff3755dce77dea42bc5d605e030cca17791c0b697e64c4","dweb:/ipfs/QmYhS5h3sja3dZaoaQ9jdhwsrNSbJ4oPU5VtCbotvedUXP"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf","urls":["bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c","dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435","urls":["bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c","dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":173} \ No newline at end of file diff --git a/packages/generated/dev/abis/WalletLink.metadata.json b/packages/generated/dev/abis/WalletLink.metadata.json new file mode 100644 index 000000000..78f979d53 --- /dev/null +++ b/packages/generated/dev/abis/WalletLink.metadata.json @@ -0,0 +1,691 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "ECDSAInvalidSignature" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "type": "error", + "name": "ECDSAInvalidSignatureLength" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "type": "error", + "name": "ECDSAInvalidSignatureS" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "currentNonce", + "type": "uint256" + } + ], + "type": "error", + "name": "InvalidAccountNonce" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "internalType": "address", + "name": "rootKey", + "type": "address" + } + ], + "type": "error", + "name": "WalletLink__CannotLinkToRootWallet" + }, + { + "inputs": [], + "type": "error", + "name": "WalletLink__CannotLinkToSelf" + }, + { + "inputs": [], + "type": "error", + "name": "WalletLink__CannotRemoveRootWallet" + }, + { + "inputs": [], + "type": "error", + "name": "WalletLink__InvalidAddress" + }, + { + "inputs": [], + "type": "error", + "name": "WalletLink__InvalidSignature" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "internalType": "address", + "name": "rootKey", + "type": "address" + } + ], + "type": "error", + "name": "WalletLink__LinkAlreadyExists" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "internalType": "address", + "name": "rootKey", + "type": "address" + } + ], + "type": "error", + "name": "WalletLink__LinkedToAnotherRootKey" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "internalType": "address", + "name": "rootKey", + "type": "address" + } + ], + "type": "error", + "name": "WalletLink__NotLinked" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "rootKey", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "LinkWalletToRootKey", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "secondWallet", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "RemoveLink", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "__WalletLink_init" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rootKey", + "type": "address" + }, + { + "internalType": "address", + "name": "wallet", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "checkIfLinked", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rootKey", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getLatestNonceForRootKey", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getRootKeyForWallet", + "outputs": [ + { + "internalType": "address", + "name": "rootKey", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rootKey", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getWalletsByRootKey", + "outputs": [ + { + "internalType": "address[]", + "name": "wallets", + "type": "address[]" + } + ] + }, + { + "inputs": [ + { + "internalType": "struct IWalletLinkBase.LinkedWallet", + "name": "rootWallet", + "type": "tuple", + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ] + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "linkCallerToRootKey" + }, + { + "inputs": [ + { + "internalType": "struct IWalletLinkBase.LinkedWallet", + "name": "wallet", + "type": "tuple", + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ] + }, + { + "internalType": "struct IWalletLinkBase.LinkedWallet", + "name": "rootWallet", + "type": "tuple", + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ] + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "linkWalletToRootKey" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "internalType": "struct IWalletLinkBase.LinkedWallet", + "name": "rootWallet", + "type": "tuple", + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ] + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeLink" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "checkIfLinked(address,address)": { + "params": { + "rootKey": "the public key of the users rootkey to check", + "wallet": "the ethereum wallet to check" + }, + "returns": { + "_0": "areLinked boolean if they are linked together" + } + }, + "getLatestNonceForRootKey(address)": { + "params": { + "rootKey": "the public key of the users rootkey to check" + } + }, + "getRootKeyForWallet(address)": { + "params": { + "wallet": "the ethereum wallet to find associated root key for" + }, + "returns": { + "rootKey": "the rootkey that this wallet is linked to" + } + }, + "getWalletsByRootKey(address)": { + "params": { + "rootKey": "the public key of the users rootkey to find associated wallets for" + }, + "returns": { + "wallets": "an array of ethereum wallets linked to this root key" + } + }, + "linkCallerToRootKey((address,bytes),uint256)": { + "params": { + "nonce": "a nonce used to prevent replay attacks, nonce must always be higher than previous nonce", + "rootWallet": "the root wallet that the caller is linking to" + } + }, + "linkWalletToRootKey((address,bytes),(address,bytes),uint256)": { + "params": { + "nonce": "a nonce used to prevent replay attacks, nonce must always be higher than previous nonce", + "rootWallet": "the root wallet that the caller is linking to", + "wallet": "the wallet being linked to the root wallet" + } + }, + "removeLink(address,(address,bytes),uint256)": { + "params": { + "wallet": "the wallet being unlinked from the sending wallet" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "checkIfLinked(address,address)": { + "notice": "checks if a root key and wallet are linked" + }, + "getLatestNonceForRootKey(address)": { + "notice": "gets the latest nonce for a rootkey to use a higher one for next link action" + }, + "getRootKeyForWallet(address)": { + "notice": "Returns the root key for a given wallet" + }, + "getWalletsByRootKey(address)": { + "notice": "Returns all wallets linked to a root key" + }, + "linkCallerToRootKey((address,bytes),uint256)": { + "notice": "Link caller wallet to a root wallet" + }, + "linkWalletToRootKey((address,bytes),(address,bytes),uint256)": { + "notice": "Link a wallet to a root wallet" + }, + "removeLink(address,(address,bytes),uint256)": { + "notice": "Called via the rootkey signing a message to a remove a wallet from itself" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/factory/facets/wallet-link/WalletLink.sol": "WalletLink" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/utils/Nonces.sol": { + "keccak256": "0xce0cce96c8f30e4052523e2c67c7b08ed9defa8c2e3858d4534b359be9ee9ee3", + "urls": [ + "bzz-raw://caae09675d571304907f51e64c255981c5fbfbd60bf26d0117c00ecd7ed7a7fb", + "dweb:/ipfs/QmPNReTvJDZ242duATLyDDt1JUUd2ACg472E1vftw5zgXB" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/wallet-link/IWalletLink.sol": { + "keccak256": "0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b", + "urls": [ + "bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13", + "dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/wallet-link/WalletLink.sol": { + "keccak256": "0x0940bd508eeb3fcd0199c2a939bb7ff871b1b2929881f23cd346961a769fd807", + "urls": [ + "bzz-raw://c8d144ca39586757c4d58a76489b4cef6c8d0ad5dfb5a77686b6e49d8b310c44", + "dweb:/ipfs/QmQd9TQtCzeXSgn5xvBADXEs7kVB9o7hxo8Nvqz4u5nJTu" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/wallet-link/WalletLinkBase.sol": { + "keccak256": "0xfc27a5f7a57d45076dd4b4af704d6941f82d4ec825b262a0a144a00b3c83a0f0", + "urls": [ + "bzz-raw://a79133d20a0ad20691c88dbfa3832c1f767273eb17aaf3f20ab1f128bb5a7b48", + "dweb:/ipfs/QmcJbygpvz1tPifobw2SfgNvKRB4w9EZVqsM8kZKMtWf6e" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/wallet-link/WalletLinkStorage.sol": { + "keccak256": "0x2903de293c75c301de25bef504a0bb56b31158a2d5340bdf8103fa8f0c06bad1", + "urls": [ + "bzz-raw://3e8bdb8c34b2c3ef8fff3755dce77dea42bc5d605e030cca17791c0b697e64c4", + "dweb:/ipfs/QmYhS5h3sja3dZaoaQ9jdhwsrNSbJ4oPU5VtCbotvedUXP" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Strings.sol": { + "keccak256": "0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792", + "urls": [ + "bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453", + "dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "keccak256": "0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf", + "urls": [ + "bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c", + "dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol": { + "keccak256": "0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435", + "urls": [ + "bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c", + "dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/math/Math.sol": { + "keccak256": "0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d", + "urls": [ + "bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875", + "dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/math/SignedMath.sol": { + "keccak256": "0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72", + "urls": [ + "bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc", + "dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/dev/typings/IArchitect.ts b/packages/generated/dev/typings/IArchitect.ts new file mode 100644 index 000000000..9f7a22788 --- /dev/null +++ b/packages/generated/dev/typings/IArchitect.ts @@ -0,0 +1,459 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IMembershipBase { + export type MembershipStruct = { + name: PromiseOrValue; + symbol: PromiseOrValue; + price: PromiseOrValue; + maxSupply: PromiseOrValue; + duration: PromiseOrValue; + currency: PromiseOrValue; + feeRecipient: PromiseOrValue; + freeAllocation: PromiseOrValue; + pricingModule: PromiseOrValue; + }; + + export type MembershipStructOutput = [ + string, + string, + BigNumber, + BigNumber, + BigNumber, + string, + string, + BigNumber, + string + ] & { + name: string; + symbol: string; + price: BigNumber; + maxSupply: BigNumber; + duration: BigNumber; + currency: string; + feeRecipient: string; + freeAllocation: BigNumber; + pricingModule: string; + }; +} + +export declare namespace IRuleEntitlement { + export type OperationStruct = { + opType: PromiseOrValue; + index: PromiseOrValue; + }; + + export type OperationStructOutput = [number, number] & { + opType: number; + index: number; + }; + + export type CheckOperationStruct = { + opType: PromiseOrValue; + chainId: PromiseOrValue; + contractAddress: PromiseOrValue; + threshold: PromiseOrValue; + }; + + export type CheckOperationStructOutput = [ + number, + BigNumber, + string, + BigNumber + ] & { + opType: number; + chainId: BigNumber; + contractAddress: string; + threshold: BigNumber; + }; + + export type LogicalOperationStruct = { + logOpType: PromiseOrValue; + leftOperationIndex: PromiseOrValue; + rightOperationIndex: PromiseOrValue; + }; + + export type LogicalOperationStructOutput = [number, number, number] & { + logOpType: number; + leftOperationIndex: number; + rightOperationIndex: number; + }; + + export type RuleDataStruct = { + operations: IRuleEntitlement.OperationStruct[]; + checkOperations: IRuleEntitlement.CheckOperationStruct[]; + logicalOperations: IRuleEntitlement.LogicalOperationStruct[]; + }; + + export type RuleDataStructOutput = [ + IRuleEntitlement.OperationStructOutput[], + IRuleEntitlement.CheckOperationStructOutput[], + IRuleEntitlement.LogicalOperationStructOutput[] + ] & { + operations: IRuleEntitlement.OperationStructOutput[]; + checkOperations: IRuleEntitlement.CheckOperationStructOutput[]; + logicalOperations: IRuleEntitlement.LogicalOperationStructOutput[]; + }; +} + +export declare namespace IArchitectBase { + export type MembershipRequirementsStruct = { + everyone: PromiseOrValue; + users: PromiseOrValue[]; + ruleData: IRuleEntitlement.RuleDataStruct; + }; + + export type MembershipRequirementsStructOutput = [ + boolean, + string[], + IRuleEntitlement.RuleDataStructOutput + ] & { + everyone: boolean; + users: string[]; + ruleData: IRuleEntitlement.RuleDataStructOutput; + }; + + export type MembershipStruct = { + settings: IMembershipBase.MembershipStruct; + requirements: IArchitectBase.MembershipRequirementsStruct; + permissions: PromiseOrValue[]; + }; + + export type MembershipStructOutput = [ + IMembershipBase.MembershipStructOutput, + IArchitectBase.MembershipRequirementsStructOutput, + string[] + ] & { + settings: IMembershipBase.MembershipStructOutput; + requirements: IArchitectBase.MembershipRequirementsStructOutput; + permissions: string[]; + }; + + export type ChannelInfoStruct = { metadata: PromiseOrValue }; + + export type ChannelInfoStructOutput = [string] & { metadata: string }; + + export type SpaceInfoStruct = { + name: PromiseOrValue; + uri: PromiseOrValue; + membership: IArchitectBase.MembershipStruct; + channel: IArchitectBase.ChannelInfoStruct; + }; + + export type SpaceInfoStructOutput = [ + string, + string, + IArchitectBase.MembershipStructOutput, + IArchitectBase.ChannelInfoStructOutput + ] & { + name: string; + uri: string; + membership: IArchitectBase.MembershipStructOutput; + channel: IArchitectBase.ChannelInfoStructOutput; + }; +} + +export interface IArchitectInterface extends utils.Interface { + functions: { + "createSpace((string,string,((string,string,uint256,uint256,uint64,address,address,uint256,address),(bool,address[],((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])),string[]),(string)))": FunctionFragment; + "getSpaceArchitectImplementations()": FunctionFragment; + "getSpaceByTokenId(uint256)": FunctionFragment; + "getTokenIdBySpace(address)": FunctionFragment; + "setSpaceArchitectImplementations(address,address,address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "createSpace" + | "getSpaceArchitectImplementations" + | "getSpaceByTokenId" + | "getTokenIdBySpace" + | "setSpaceArchitectImplementations" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "createSpace", + values: [IArchitectBase.SpaceInfoStruct] + ): string; + encodeFunctionData( + functionFragment: "getSpaceArchitectImplementations", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getSpaceByTokenId", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getTokenIdBySpace", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setSpaceArchitectImplementations", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + + decodeFunctionResult( + functionFragment: "createSpace", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getSpaceArchitectImplementations", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getSpaceByTokenId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getTokenIdBySpace", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setSpaceArchitectImplementations", + data: BytesLike + ): Result; + + events: { + "SpaceCreated(address,uint256,address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "SpaceCreated"): EventFragment; +} + +export interface SpaceCreatedEventObject { + owner: string; + tokenId: BigNumber; + space: string; +} +export type SpaceCreatedEvent = TypedEvent< + [string, BigNumber, string], + SpaceCreatedEventObject +>; + +export type SpaceCreatedEventFilter = TypedEventFilter; + +export interface IArchitect extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IArchitectInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + createSpace( + SpaceInfo: IArchitectBase.SpaceInfoStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getSpaceArchitectImplementations( + overrides?: CallOverrides + ): Promise< + [string, string, string] & { + ownerTokenImplementation: string; + userEntitlementImplementation: string; + ruleEntitlementImplementation: string; + } + >; + + getSpaceByTokenId( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string] & { space: string }>; + + getTokenIdBySpace( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + setSpaceArchitectImplementations( + ownerTokenImplementation: PromiseOrValue, + userEntitlementImplementation: PromiseOrValue, + ruleEntitlementImplementation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + createSpace( + SpaceInfo: IArchitectBase.SpaceInfoStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getSpaceArchitectImplementations( + overrides?: CallOverrides + ): Promise< + [string, string, string] & { + ownerTokenImplementation: string; + userEntitlementImplementation: string; + ruleEntitlementImplementation: string; + } + >; + + getSpaceByTokenId( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getTokenIdBySpace( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setSpaceArchitectImplementations( + ownerTokenImplementation: PromiseOrValue, + userEntitlementImplementation: PromiseOrValue, + ruleEntitlementImplementation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + createSpace( + SpaceInfo: IArchitectBase.SpaceInfoStruct, + overrides?: CallOverrides + ): Promise; + + getSpaceArchitectImplementations( + overrides?: CallOverrides + ): Promise< + [string, string, string] & { + ownerTokenImplementation: string; + userEntitlementImplementation: string; + ruleEntitlementImplementation: string; + } + >; + + getSpaceByTokenId( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getTokenIdBySpace( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setSpaceArchitectImplementations( + ownerTokenImplementation: PromiseOrValue, + userEntitlementImplementation: PromiseOrValue, + ruleEntitlementImplementation: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "SpaceCreated(address,uint256,address)"( + owner?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null, + space?: PromiseOrValue | null + ): SpaceCreatedEventFilter; + SpaceCreated( + owner?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null, + space?: PromiseOrValue | null + ): SpaceCreatedEventFilter; + }; + + estimateGas: { + createSpace( + SpaceInfo: IArchitectBase.SpaceInfoStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getSpaceArchitectImplementations( + overrides?: CallOverrides + ): Promise; + + getSpaceByTokenId( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getTokenIdBySpace( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setSpaceArchitectImplementations( + ownerTokenImplementation: PromiseOrValue, + userEntitlementImplementation: PromiseOrValue, + ruleEntitlementImplementation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + createSpace( + SpaceInfo: IArchitectBase.SpaceInfoStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getSpaceArchitectImplementations( + overrides?: CallOverrides + ): Promise; + + getSpaceByTokenId( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getTokenIdBySpace( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setSpaceArchitectImplementations( + ownerTokenImplementation: PromiseOrValue, + userEntitlementImplementation: PromiseOrValue, + ruleEntitlementImplementation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/IBanning.ts b/packages/generated/dev/typings/IBanning.ts new file mode 100644 index 000000000..bb25662f4 --- /dev/null +++ b/packages/generated/dev/typings/IBanning.ts @@ -0,0 +1,227 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface IBanningInterface extends utils.Interface { + functions: { + "ban(uint256)": FunctionFragment; + "banned()": FunctionFragment; + "isBanned(uint256)": FunctionFragment; + "unban(uint256)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: "ban" | "banned" | "isBanned" | "unban" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "ban", + values: [PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "banned", values?: undefined): string; + encodeFunctionData( + functionFragment: "isBanned", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "unban", + values: [PromiseOrValue] + ): string; + + decodeFunctionResult(functionFragment: "ban", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "banned", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "isBanned", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "unban", data: BytesLike): Result; + + events: { + "Banned(address,uint256)": EventFragment; + "Unbanned(address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Banned"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Unbanned"): EventFragment; +} + +export interface BannedEventObject { + moderator: string; + tokenId: BigNumber; +} +export type BannedEvent = TypedEvent<[string, BigNumber], BannedEventObject>; + +export type BannedEventFilter = TypedEventFilter; + +export interface UnbannedEventObject { + moderator: string; + tokenId: BigNumber; +} +export type UnbannedEvent = TypedEvent< + [string, BigNumber], + UnbannedEventObject +>; + +export type UnbannedEventFilter = TypedEventFilter; + +export interface IBanning extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IBanningInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + ban( + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + banned(overrides?: CallOverrides): Promise<[BigNumber[]]>; + + isBanned( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + unban( + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + ban( + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + banned(overrides?: CallOverrides): Promise; + + isBanned( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + unban( + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + ban( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + banned(overrides?: CallOverrides): Promise; + + isBanned( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + unban( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Banned(address,uint256)"( + moderator?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): BannedEventFilter; + Banned( + moderator?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): BannedEventFilter; + + "Unbanned(address,uint256)"( + moderator?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): UnbannedEventFilter; + Unbanned( + moderator?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): UnbannedEventFilter; + }; + + estimateGas: { + ban( + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + banned(overrides?: CallOverrides): Promise; + + isBanned( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + unban( + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + ban( + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + banned(overrides?: CallOverrides): Promise; + + isBanned( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + unban( + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/IChannel.ts b/packages/generated/dev/typings/IChannel.ts new file mode 100644 index 000000000..b95c6848e --- /dev/null +++ b/packages/generated/dev/typings/IChannel.ts @@ -0,0 +1,528 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IChannelBase { + export type ChannelStruct = { + id: PromiseOrValue; + disabled: PromiseOrValue; + metadata: PromiseOrValue; + roleIds: PromiseOrValue[]; + }; + + export type ChannelStructOutput = [string, boolean, string, BigNumber[]] & { + id: string; + disabled: boolean; + metadata: string; + roleIds: BigNumber[]; + }; +} + +export interface IChannelInterface extends utils.Interface { + functions: { + "addRoleToChannel(bytes32,uint256)": FunctionFragment; + "createChannel(bytes32,string,uint256[])": FunctionFragment; + "getChannel(bytes32)": FunctionFragment; + "getChannels()": FunctionFragment; + "getRolesByChannel(bytes32)": FunctionFragment; + "removeChannel(bytes32)": FunctionFragment; + "removeRoleFromChannel(bytes32,uint256)": FunctionFragment; + "updateChannel(bytes32,string,bool)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "addRoleToChannel" + | "createChannel" + | "getChannel" + | "getChannels" + | "getRolesByChannel" + | "removeChannel" + | "removeRoleFromChannel" + | "updateChannel" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "addRoleToChannel", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "createChannel", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue[] + ] + ): string; + encodeFunctionData( + functionFragment: "getChannel", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getChannels", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getRolesByChannel", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "removeChannel", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "removeRoleFromChannel", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "updateChannel", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + + decodeFunctionResult( + functionFragment: "addRoleToChannel", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "createChannel", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getChannel", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getChannels", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRolesByChannel", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removeChannel", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removeRoleFromChannel", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "updateChannel", + data: BytesLike + ): Result; + + events: { + "ChannelCreated(address,bytes32)": EventFragment; + "ChannelRemoved(address,bytes32)": EventFragment; + "ChannelRoleAdded(address,bytes32,uint256)": EventFragment; + "ChannelRoleRemoved(address,bytes32,uint256)": EventFragment; + "ChannelUpdated(address,bytes32)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "ChannelCreated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ChannelRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ChannelRoleAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ChannelRoleRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ChannelUpdated"): EventFragment; +} + +export interface ChannelCreatedEventObject { + caller: string; + channelId: string; +} +export type ChannelCreatedEvent = TypedEvent< + [string, string], + ChannelCreatedEventObject +>; + +export type ChannelCreatedEventFilter = TypedEventFilter; + +export interface ChannelRemovedEventObject { + caller: string; + channelId: string; +} +export type ChannelRemovedEvent = TypedEvent< + [string, string], + ChannelRemovedEventObject +>; + +export type ChannelRemovedEventFilter = TypedEventFilter; + +export interface ChannelRoleAddedEventObject { + caller: string; + channelId: string; + roleId: BigNumber; +} +export type ChannelRoleAddedEvent = TypedEvent< + [string, string, BigNumber], + ChannelRoleAddedEventObject +>; + +export type ChannelRoleAddedEventFilter = + TypedEventFilter; + +export interface ChannelRoleRemovedEventObject { + caller: string; + channelId: string; + roleId: BigNumber; +} +export type ChannelRoleRemovedEvent = TypedEvent< + [string, string, BigNumber], + ChannelRoleRemovedEventObject +>; + +export type ChannelRoleRemovedEventFilter = + TypedEventFilter; + +export interface ChannelUpdatedEventObject { + caller: string; + channelId: string; +} +export type ChannelUpdatedEvent = TypedEvent< + [string, string], + ChannelUpdatedEventObject +>; + +export type ChannelUpdatedEventFilter = TypedEventFilter; + +export interface IChannel extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IChannelInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + addRoleToChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + createChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + roleIds: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise< + [IChannelBase.ChannelStructOutput] & { + channel: IChannelBase.ChannelStructOutput; + } + >; + + getChannels( + overrides?: CallOverrides + ): Promise< + [IChannelBase.ChannelStructOutput[]] & { + channels: IChannelBase.ChannelStructOutput[]; + } + >; + + getRolesByChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber[]] & { roleIds: BigNumber[] }>; + + removeChannel( + channelId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRoleFromChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + disabled: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + addRoleToChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + createChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + roleIds: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getChannels( + overrides?: CallOverrides + ): Promise; + + getRolesByChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeChannel( + channelId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRoleFromChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + disabled: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + addRoleToChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + createChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + roleIds: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + getChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getChannels( + overrides?: CallOverrides + ): Promise; + + getRolesByChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeRoleFromChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + updateChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + disabled: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "ChannelCreated(address,bytes32)"( + caller?: PromiseOrValue | null, + channelId?: null + ): ChannelCreatedEventFilter; + ChannelCreated( + caller?: PromiseOrValue | null, + channelId?: null + ): ChannelCreatedEventFilter; + + "ChannelRemoved(address,bytes32)"( + caller?: PromiseOrValue | null, + channelId?: null + ): ChannelRemovedEventFilter; + ChannelRemoved( + caller?: PromiseOrValue | null, + channelId?: null + ): ChannelRemovedEventFilter; + + "ChannelRoleAdded(address,bytes32,uint256)"( + caller?: PromiseOrValue | null, + channelId?: null, + roleId?: null + ): ChannelRoleAddedEventFilter; + ChannelRoleAdded( + caller?: PromiseOrValue | null, + channelId?: null, + roleId?: null + ): ChannelRoleAddedEventFilter; + + "ChannelRoleRemoved(address,bytes32,uint256)"( + caller?: PromiseOrValue | null, + channelId?: null, + roleId?: null + ): ChannelRoleRemovedEventFilter; + ChannelRoleRemoved( + caller?: PromiseOrValue | null, + channelId?: null, + roleId?: null + ): ChannelRoleRemovedEventFilter; + + "ChannelUpdated(address,bytes32)"( + caller?: PromiseOrValue | null, + channelId?: null + ): ChannelUpdatedEventFilter; + ChannelUpdated( + caller?: PromiseOrValue | null, + channelId?: null + ): ChannelUpdatedEventFilter; + }; + + estimateGas: { + addRoleToChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + createChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + roleIds: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getChannels(overrides?: CallOverrides): Promise; + + getRolesByChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeChannel( + channelId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRoleFromChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + disabled: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + addRoleToChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + createChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + roleIds: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getChannels(overrides?: CallOverrides): Promise; + + getRolesByChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeChannel( + channelId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRoleFromChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + disabled: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/ICustomEntitlement.ts b/packages/generated/dev/typings/ICustomEntitlement.ts new file mode 100644 index 000000000..ff001a752 --- /dev/null +++ b/packages/generated/dev/typings/ICustomEntitlement.ts @@ -0,0 +1,100 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { FunctionFragment, Result } from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface ICustomEntitlementInterface extends utils.Interface { + functions: { + "isEntitled(address[])": FunctionFragment; + }; + + getFunction(nameOrSignatureOrTopic: "isEntitled"): FunctionFragment; + + encodeFunctionData( + functionFragment: "isEntitled", + values: [PromiseOrValue[]] + ): string; + + decodeFunctionResult(functionFragment: "isEntitled", data: BytesLike): Result; + + events: {}; +} + +export interface ICustomEntitlement extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: ICustomEntitlementInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + isEntitled( + user: PromiseOrValue[], + overrides?: CallOverrides + ): Promise<[boolean]>; + }; + + isEntitled( + user: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + callStatic: { + isEntitled( + user: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + }; + + filters: {}; + + estimateGas: { + isEntitled( + user: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + }; + + populateTransaction: { + isEntitled( + user: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/IDiamond.ts b/packages/generated/dev/typings/IDiamond.ts new file mode 100644 index 000000000..35bafd983 --- /dev/null +++ b/packages/generated/dev/typings/IDiamond.ts @@ -0,0 +1,56 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { BaseContract, Signer, utils } from "ethers"; + +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface IDiamondInterface extends utils.Interface { + functions: {}; + + events: {}; +} + +export interface IDiamond extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IDiamondInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: {}; + + callStatic: {}; + + filters: {}; + + estimateGas: {}; + + populateTransaction: {}; +} diff --git a/packages/generated/dev/typings/IDiamondCut.ts b/packages/generated/dev/typings/IDiamondCut.ts new file mode 100644 index 000000000..429db2382 --- /dev/null +++ b/packages/generated/dev/typings/IDiamondCut.ts @@ -0,0 +1,162 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IDiamond { + export type FacetCutStruct = { + facetAddress: PromiseOrValue; + action: PromiseOrValue; + functionSelectors: PromiseOrValue[]; + }; + + export type FacetCutStructOutput = [string, number, string[]] & { + facetAddress: string; + action: number; + functionSelectors: string[]; + }; +} + +export interface IDiamondCutInterface extends utils.Interface { + functions: { + "diamondCut((address,uint8,bytes4[])[],address,bytes)": FunctionFragment; + }; + + getFunction(nameOrSignatureOrTopic: "diamondCut"): FunctionFragment; + + encodeFunctionData( + functionFragment: "diamondCut", + values: [ + IDiamond.FacetCutStruct[], + PromiseOrValue, + PromiseOrValue + ] + ): string; + + decodeFunctionResult(functionFragment: "diamondCut", data: BytesLike): Result; + + events: { + "DiamondCut(tuple[],address,bytes)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "DiamondCut"): EventFragment; +} + +export interface DiamondCutEventObject { + facetCuts: IDiamond.FacetCutStructOutput[]; + init: string; + initPayload: string; +} +export type DiamondCutEvent = TypedEvent< + [IDiamond.FacetCutStructOutput[], string, string], + DiamondCutEventObject +>; + +export type DiamondCutEventFilter = TypedEventFilter; + +export interface IDiamondCut extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IDiamondCutInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + diamondCut( + facetCuts: IDiamond.FacetCutStruct[], + init: PromiseOrValue, + initPayload: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + diamondCut( + facetCuts: IDiamond.FacetCutStruct[], + init: PromiseOrValue, + initPayload: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + diamondCut( + facetCuts: IDiamond.FacetCutStruct[], + init: PromiseOrValue, + initPayload: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "DiamondCut(tuple[],address,bytes)"( + facetCuts?: null, + init?: null, + initPayload?: null + ): DiamondCutEventFilter; + DiamondCut( + facetCuts?: null, + init?: null, + initPayload?: null + ): DiamondCutEventFilter; + }; + + estimateGas: { + diamondCut( + facetCuts: IDiamond.FacetCutStruct[], + init: PromiseOrValue, + initPayload: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + diamondCut( + facetCuts: IDiamond.FacetCutStruct[], + init: PromiseOrValue, + initPayload: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/IERC721AQueryable.ts b/packages/generated/dev/typings/IERC721AQueryable.ts new file mode 100644 index 000000000..dceeed525 --- /dev/null +++ b/packages/generated/dev/typings/IERC721AQueryable.ts @@ -0,0 +1,357 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IERC721ABase { + export type TokenOwnershipStruct = { + addr: PromiseOrValue; + startTimestamp: PromiseOrValue; + burned: PromiseOrValue; + extraData: PromiseOrValue; + }; + + export type TokenOwnershipStructOutput = [ + string, + BigNumber, + boolean, + number + ] & { + addr: string; + startTimestamp: BigNumber; + burned: boolean; + extraData: number; + }; +} + +export interface IERC721AQueryableInterface extends utils.Interface { + functions: { + "explicitOwnershipOf(uint256)": FunctionFragment; + "explicitOwnershipsOf(uint256[])": FunctionFragment; + "tokensOfOwner(address)": FunctionFragment; + "tokensOfOwnerIn(address,uint256,uint256)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "explicitOwnershipOf" + | "explicitOwnershipsOf" + | "tokensOfOwner" + | "tokensOfOwnerIn" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "explicitOwnershipOf", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "explicitOwnershipsOf", + values: [PromiseOrValue[]] + ): string; + encodeFunctionData( + functionFragment: "tokensOfOwner", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "tokensOfOwnerIn", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + + decodeFunctionResult( + functionFragment: "explicitOwnershipOf", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "explicitOwnershipsOf", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "tokensOfOwner", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "tokensOfOwnerIn", + data: BytesLike + ): Result; + + events: { + "Approval(address,address,uint256)": EventFragment; + "ApprovalForAll(address,address,bool)": EventFragment; + "ConsecutiveTransfer(uint256,uint256,address,address)": EventFragment; + "Transfer(address,address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ApprovalForAll"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ConsecutiveTransfer"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; +} + +export interface ApprovalEventObject { + owner: string; + approved: string; + tokenId: BigNumber; +} +export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], + ApprovalEventObject +>; + +export type ApprovalEventFilter = TypedEventFilter; + +export interface ApprovalForAllEventObject { + owner: string; + operator: string; + approved: boolean; +} +export type ApprovalForAllEvent = TypedEvent< + [string, string, boolean], + ApprovalForAllEventObject +>; + +export type ApprovalForAllEventFilter = TypedEventFilter; + +export interface ConsecutiveTransferEventObject { + fromTokenId: BigNumber; + toTokenId: BigNumber; + from: string; + to: string; +} +export type ConsecutiveTransferEvent = TypedEvent< + [BigNumber, BigNumber, string, string], + ConsecutiveTransferEventObject +>; + +export type ConsecutiveTransferEventFilter = + TypedEventFilter; + +export interface TransferEventObject { + from: string; + to: string; + tokenId: BigNumber; +} +export type TransferEvent = TypedEvent< + [string, string, BigNumber], + TransferEventObject +>; + +export type TransferEventFilter = TypedEventFilter; + +export interface IERC721AQueryable extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IERC721AQueryableInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + explicitOwnershipOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[IERC721ABase.TokenOwnershipStructOutput]>; + + explicitOwnershipsOf( + tokenIds: PromiseOrValue[], + overrides?: CallOverrides + ): Promise<[IERC721ABase.TokenOwnershipStructOutput[]]>; + + tokensOfOwner( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber[]]>; + + tokensOfOwnerIn( + owner: PromiseOrValue, + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber[]]>; + }; + + explicitOwnershipOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + explicitOwnershipsOf( + tokenIds: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + tokensOfOwner( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + tokensOfOwnerIn( + owner: PromiseOrValue, + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + callStatic: { + explicitOwnershipOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + explicitOwnershipsOf( + tokenIds: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + tokensOfOwner( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + tokensOfOwnerIn( + owner: PromiseOrValue, + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Approval(address,address,uint256)"( + owner?: PromiseOrValue | null, + approved?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): ApprovalEventFilter; + Approval( + owner?: PromiseOrValue | null, + approved?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): ApprovalEventFilter; + + "ApprovalForAll(address,address,bool)"( + owner?: PromiseOrValue | null, + operator?: PromiseOrValue | null, + approved?: null + ): ApprovalForAllEventFilter; + ApprovalForAll( + owner?: PromiseOrValue | null, + operator?: PromiseOrValue | null, + approved?: null + ): ApprovalForAllEventFilter; + + "ConsecutiveTransfer(uint256,uint256,address,address)"( + fromTokenId?: PromiseOrValue | null, + toTokenId?: null, + from?: PromiseOrValue | null, + to?: PromiseOrValue | null + ): ConsecutiveTransferEventFilter; + ConsecutiveTransfer( + fromTokenId?: PromiseOrValue | null, + toTokenId?: null, + from?: PromiseOrValue | null, + to?: PromiseOrValue | null + ): ConsecutiveTransferEventFilter; + + "Transfer(address,address,uint256)"( + from?: PromiseOrValue | null, + to?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): TransferEventFilter; + Transfer( + from?: PromiseOrValue | null, + to?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): TransferEventFilter; + }; + + estimateGas: { + explicitOwnershipOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + explicitOwnershipsOf( + tokenIds: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + tokensOfOwner( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + tokensOfOwnerIn( + owner: PromiseOrValue, + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + populateTransaction: { + explicitOwnershipOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + explicitOwnershipsOf( + tokenIds: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + tokensOfOwner( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + tokensOfOwnerIn( + owner: PromiseOrValue, + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/IEntitlementsManager.ts b/packages/generated/dev/typings/IEntitlementsManager.ts new file mode 100644 index 000000000..e0761627e --- /dev/null +++ b/packages/generated/dev/typings/IEntitlementsManager.ts @@ -0,0 +1,451 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IEntitlementsManagerBase { + export type EntitlementStruct = { + name: PromiseOrValue; + moduleAddress: PromiseOrValue; + moduleType: PromiseOrValue; + isImmutable: PromiseOrValue; + }; + + export type EntitlementStructOutput = [string, string, string, boolean] & { + name: string; + moduleAddress: string; + moduleType: string; + isImmutable: boolean; + }; +} + +export declare namespace IEntitlementsManager { + export type EntitlementDataStruct = { + entitlementType: PromiseOrValue; + entitlementData: PromiseOrValue; + }; + + export type EntitlementDataStructOutput = [string, string] & { + entitlementType: string; + entitlementData: string; + }; +} + +export interface IEntitlementsManagerInterface extends utils.Interface { + functions: { + "addEntitlementModule(address)": FunctionFragment; + "addImmutableEntitlements(address[])": FunctionFragment; + "getEntitlement(address)": FunctionFragment; + "getEntitlementDataByPermission(string)": FunctionFragment; + "getEntitlements()": FunctionFragment; + "isEntitledToChannel(bytes32,address,string)": FunctionFragment; + "isEntitledToSpace(address,string)": FunctionFragment; + "removeEntitlementModule(address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "addEntitlementModule" + | "addImmutableEntitlements" + | "getEntitlement" + | "getEntitlementDataByPermission" + | "getEntitlements" + | "isEntitledToChannel" + | "isEntitledToSpace" + | "removeEntitlementModule" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "addEntitlementModule", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "addImmutableEntitlements", + values: [PromiseOrValue[]] + ): string; + encodeFunctionData( + functionFragment: "getEntitlement", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getEntitlementDataByPermission", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getEntitlements", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "isEntitledToChannel", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "isEntitledToSpace", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "removeEntitlementModule", + values: [PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "addEntitlementModule", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "addImmutableEntitlements", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getEntitlement", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getEntitlementDataByPermission", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getEntitlements", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isEntitledToChannel", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isEntitledToSpace", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removeEntitlementModule", + data: BytesLike + ): Result; + + events: { + "EntitlementModuleAdded(address,address)": EventFragment; + "EntitlementModuleRemoved(address,address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "EntitlementModuleAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "EntitlementModuleRemoved"): EventFragment; +} + +export interface EntitlementModuleAddedEventObject { + caller: string; + entitlement: string; +} +export type EntitlementModuleAddedEvent = TypedEvent< + [string, string], + EntitlementModuleAddedEventObject +>; + +export type EntitlementModuleAddedEventFilter = + TypedEventFilter; + +export interface EntitlementModuleRemovedEventObject { + caller: string; + entitlement: string; +} +export type EntitlementModuleRemovedEvent = TypedEvent< + [string, string], + EntitlementModuleRemovedEventObject +>; + +export type EntitlementModuleRemovedEventFilter = + TypedEventFilter; + +export interface IEntitlementsManager extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IEntitlementsManagerInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + addEntitlementModule( + entitlement: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + addImmutableEntitlements( + entitlements: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getEntitlement( + entitlement: PromiseOrValue, + overrides?: CallOverrides + ): Promise< + [IEntitlementsManagerBase.EntitlementStructOutput] & { + entitlements: IEntitlementsManagerBase.EntitlementStructOutput; + } + >; + + getEntitlementDataByPermission( + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[IEntitlementsManager.EntitlementDataStructOutput[]]>; + + getEntitlements( + overrides?: CallOverrides + ): Promise< + [IEntitlementsManagerBase.EntitlementStructOutput[]] & { + entitlements: IEntitlementsManagerBase.EntitlementStructOutput[]; + } + >; + + isEntitledToChannel( + channelId: PromiseOrValue, + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isEntitledToSpace( + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + removeEntitlementModule( + entitlement: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + addEntitlementModule( + entitlement: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + addImmutableEntitlements( + entitlements: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getEntitlement( + entitlement: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlementDataByPermission( + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlements( + overrides?: CallOverrides + ): Promise; + + isEntitledToChannel( + channelId: PromiseOrValue, + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isEntitledToSpace( + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeEntitlementModule( + entitlement: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + addEntitlementModule( + entitlement: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + addImmutableEntitlements( + entitlements: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + getEntitlement( + entitlement: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlementDataByPermission( + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlements( + overrides?: CallOverrides + ): Promise; + + isEntitledToChannel( + channelId: PromiseOrValue, + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isEntitledToSpace( + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeEntitlementModule( + entitlement: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "EntitlementModuleAdded(address,address)"( + caller?: PromiseOrValue | null, + entitlement?: null + ): EntitlementModuleAddedEventFilter; + EntitlementModuleAdded( + caller?: PromiseOrValue | null, + entitlement?: null + ): EntitlementModuleAddedEventFilter; + + "EntitlementModuleRemoved(address,address)"( + caller?: PromiseOrValue | null, + entitlement?: null + ): EntitlementModuleRemovedEventFilter; + EntitlementModuleRemoved( + caller?: PromiseOrValue | null, + entitlement?: null + ): EntitlementModuleRemovedEventFilter; + }; + + estimateGas: { + addEntitlementModule( + entitlement: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + addImmutableEntitlements( + entitlements: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getEntitlement( + entitlement: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlementDataByPermission( + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlements(overrides?: CallOverrides): Promise; + + isEntitledToChannel( + channelId: PromiseOrValue, + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isEntitledToSpace( + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeEntitlementModule( + entitlement: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + addEntitlementModule( + entitlement: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + addImmutableEntitlements( + entitlements: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getEntitlement( + entitlement: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlementDataByPermission( + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlements(overrides?: CallOverrides): Promise; + + isEntitledToChannel( + channelId: PromiseOrValue, + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isEntitledToSpace( + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeEntitlementModule( + entitlement: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/IMulticall.ts b/packages/generated/dev/typings/IMulticall.ts new file mode 100644 index 000000000..feaf2667e --- /dev/null +++ b/packages/generated/dev/typings/IMulticall.ts @@ -0,0 +1,102 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { FunctionFragment, Result } from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface IMulticallInterface extends utils.Interface { + functions: { + "multicall(bytes[])": FunctionFragment; + }; + + getFunction(nameOrSignatureOrTopic: "multicall"): FunctionFragment; + + encodeFunctionData( + functionFragment: "multicall", + values: [PromiseOrValue[]] + ): string; + + decodeFunctionResult(functionFragment: "multicall", data: BytesLike): Result; + + events: {}; +} + +export interface IMulticall extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IMulticallInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + multicall( + data: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + multicall( + data: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + multicall( + data: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + }; + + filters: {}; + + estimateGas: { + multicall( + data: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + multicall( + data: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/INodeRegistry.ts b/packages/generated/dev/typings/INodeRegistry.ts new file mode 100644 index 000000000..9ccf7c79f --- /dev/null +++ b/packages/generated/dev/typings/INodeRegistry.ts @@ -0,0 +1,435 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export type NodeStruct = { + status: PromiseOrValue; + url: PromiseOrValue; + nodeAddress: PromiseOrValue; + operator: PromiseOrValue; +}; + +export type NodeStructOutput = [number, string, string, string] & { + status: number; + url: string; + nodeAddress: string; + operator: string; +}; + +export interface INodeRegistryInterface extends utils.Interface { + functions: { + "getAllNodeAddresses()": FunctionFragment; + "getAllNodes()": FunctionFragment; + "getNode(address)": FunctionFragment; + "getNodeCount()": FunctionFragment; + "registerNode(address,string,uint8)": FunctionFragment; + "removeNode(address)": FunctionFragment; + "updateNodeStatus(address,uint8)": FunctionFragment; + "updateNodeUrl(address,string)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "getAllNodeAddresses" + | "getAllNodes" + | "getNode" + | "getNodeCount" + | "registerNode" + | "removeNode" + | "updateNodeStatus" + | "updateNodeUrl" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getAllNodeAddresses", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getAllNodes", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getNode", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getNodeCount", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "registerNode", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "removeNode", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "updateNodeStatus", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "updateNodeUrl", + values: [PromiseOrValue, PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "getAllNodeAddresses", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getAllNodes", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getNode", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getNodeCount", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "registerNode", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "removeNode", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "updateNodeStatus", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "updateNodeUrl", + data: BytesLike + ): Result; + + events: { + "NodeAdded(address,string,uint8)": EventFragment; + "NodeRemoved(address)": EventFragment; + "NodeStatusUpdated(address,uint8)": EventFragment; + "NodeUrlUpdated(address,string)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "NodeAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "NodeRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "NodeStatusUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "NodeUrlUpdated"): EventFragment; +} + +export interface NodeAddedEventObject { + nodeAddress: string; + url: string; + status: number; +} +export type NodeAddedEvent = TypedEvent< + [string, string, number], + NodeAddedEventObject +>; + +export type NodeAddedEventFilter = TypedEventFilter; + +export interface NodeRemovedEventObject { + nodeAddress: string; +} +export type NodeRemovedEvent = TypedEvent<[string], NodeRemovedEventObject>; + +export type NodeRemovedEventFilter = TypedEventFilter; + +export interface NodeStatusUpdatedEventObject { + nodeAddress: string; + status: number; +} +export type NodeStatusUpdatedEvent = TypedEvent< + [string, number], + NodeStatusUpdatedEventObject +>; + +export type NodeStatusUpdatedEventFilter = + TypedEventFilter; + +export interface NodeUrlUpdatedEventObject { + nodeAddress: string; + url: string; +} +export type NodeUrlUpdatedEvent = TypedEvent< + [string, string], + NodeUrlUpdatedEventObject +>; + +export type NodeUrlUpdatedEventFilter = TypedEventFilter; + +export interface INodeRegistry extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: INodeRegistryInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + getAllNodeAddresses(overrides?: CallOverrides): Promise<[string[]]>; + + getAllNodes(overrides?: CallOverrides): Promise<[NodeStructOutput[]]>; + + getNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[NodeStructOutput]>; + + getNodeCount(overrides?: CallOverrides): Promise<[BigNumber]>; + + registerNode( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + status: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeNode( + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateNodeStatus( + nodeAddress: PromiseOrValue, + status: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateNodeUrl( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + getAllNodeAddresses(overrides?: CallOverrides): Promise; + + getAllNodes(overrides?: CallOverrides): Promise; + + getNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getNodeCount(overrides?: CallOverrides): Promise; + + registerNode( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + status: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeNode( + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateNodeStatus( + nodeAddress: PromiseOrValue, + status: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateNodeUrl( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + getAllNodeAddresses(overrides?: CallOverrides): Promise; + + getAllNodes(overrides?: CallOverrides): Promise; + + getNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getNodeCount(overrides?: CallOverrides): Promise; + + registerNode( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + status: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + updateNodeStatus( + nodeAddress: PromiseOrValue, + status: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + updateNodeUrl( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "NodeAdded(address,string,uint8)"( + nodeAddress?: PromiseOrValue | null, + url?: null, + status?: null + ): NodeAddedEventFilter; + NodeAdded( + nodeAddress?: PromiseOrValue | null, + url?: null, + status?: null + ): NodeAddedEventFilter; + + "NodeRemoved(address)"( + nodeAddress?: PromiseOrValue | null + ): NodeRemovedEventFilter; + NodeRemoved( + nodeAddress?: PromiseOrValue | null + ): NodeRemovedEventFilter; + + "NodeStatusUpdated(address,uint8)"( + nodeAddress?: PromiseOrValue | null, + status?: null + ): NodeStatusUpdatedEventFilter; + NodeStatusUpdated( + nodeAddress?: PromiseOrValue | null, + status?: null + ): NodeStatusUpdatedEventFilter; + + "NodeUrlUpdated(address,string)"( + nodeAddress?: PromiseOrValue | null, + url?: null + ): NodeUrlUpdatedEventFilter; + NodeUrlUpdated( + nodeAddress?: PromiseOrValue | null, + url?: null + ): NodeUrlUpdatedEventFilter; + }; + + estimateGas: { + getAllNodeAddresses(overrides?: CallOverrides): Promise; + + getAllNodes(overrides?: CallOverrides): Promise; + + getNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getNodeCount(overrides?: CallOverrides): Promise; + + registerNode( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + status: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeNode( + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateNodeStatus( + nodeAddress: PromiseOrValue, + status: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateNodeUrl( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + getAllNodeAddresses( + overrides?: CallOverrides + ): Promise; + + getAllNodes(overrides?: CallOverrides): Promise; + + getNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getNodeCount(overrides?: CallOverrides): Promise; + + registerNode( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + status: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeNode( + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateNodeStatus( + nodeAddress: PromiseOrValue, + status: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateNodeUrl( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/IOperatorRegistry.ts b/packages/generated/dev/typings/IOperatorRegistry.ts new file mode 100644 index 000000000..52ecb66e9 --- /dev/null +++ b/packages/generated/dev/typings/IOperatorRegistry.ts @@ -0,0 +1,213 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface IOperatorRegistryInterface extends utils.Interface { + functions: { + "approveOperator(address)": FunctionFragment; + "isOperator(address)": FunctionFragment; + "removeOperator(address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: "approveOperator" | "isOperator" | "removeOperator" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "approveOperator", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "isOperator", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "removeOperator", + values: [PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "approveOperator", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "isOperator", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "removeOperator", + data: BytesLike + ): Result; + + events: { + "OperatorAdded(address)": EventFragment; + "OperatorRemoved(address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "OperatorAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorRemoved"): EventFragment; +} + +export interface OperatorAddedEventObject { + operatorAddress: string; +} +export type OperatorAddedEvent = TypedEvent<[string], OperatorAddedEventObject>; + +export type OperatorAddedEventFilter = TypedEventFilter; + +export interface OperatorRemovedEventObject { + operatorAddress: string; +} +export type OperatorRemovedEvent = TypedEvent< + [string], + OperatorRemovedEventObject +>; + +export type OperatorRemovedEventFilter = TypedEventFilter; + +export interface IOperatorRegistry extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IOperatorRegistryInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + approveOperator( + operator: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isOperator( + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + removeOperator( + operator: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + approveOperator( + operator: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isOperator( + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeOperator( + operator: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + approveOperator( + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isOperator( + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeOperator( + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "OperatorAdded(address)"( + operatorAddress?: PromiseOrValue | null + ): OperatorAddedEventFilter; + OperatorAdded( + operatorAddress?: PromiseOrValue | null + ): OperatorAddedEventFilter; + + "OperatorRemoved(address)"( + operatorAddress?: PromiseOrValue | null + ): OperatorRemovedEventFilter; + OperatorRemoved( + operatorAddress?: PromiseOrValue | null + ): OperatorRemovedEventFilter; + }; + + estimateGas: { + approveOperator( + operator: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isOperator( + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeOperator( + operator: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + approveOperator( + operator: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isOperator( + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeOperator( + operator: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/IPausable.ts b/packages/generated/dev/typings/IPausable.ts new file mode 100644 index 000000000..a63c8c1a4 --- /dev/null +++ b/packages/generated/dev/typings/IPausable.ts @@ -0,0 +1,158 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface IPausableInterface extends utils.Interface { + functions: { + "pause()": FunctionFragment; + "paused()": FunctionFragment; + "unpause()": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: "pause" | "paused" | "unpause" + ): FunctionFragment; + + encodeFunctionData(functionFragment: "pause", values?: undefined): string; + encodeFunctionData(functionFragment: "paused", values?: undefined): string; + encodeFunctionData(functionFragment: "unpause", values?: undefined): string; + + decodeFunctionResult(functionFragment: "pause", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "paused", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "unpause", data: BytesLike): Result; + + events: { + "Paused(address)": EventFragment; + "Unpaused(address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; +} + +export interface PausedEventObject { + account: string; +} +export type PausedEvent = TypedEvent<[string], PausedEventObject>; + +export type PausedEventFilter = TypedEventFilter; + +export interface UnpausedEventObject { + account: string; +} +export type UnpausedEvent = TypedEvent<[string], UnpausedEventObject>; + +export type UnpausedEventFilter = TypedEventFilter; + +export interface IPausable extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IPausableInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + pause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + paused(overrides?: CallOverrides): Promise<[boolean]>; + + unpause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + pause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + paused(overrides?: CallOverrides): Promise; + + unpause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + pause(overrides?: CallOverrides): Promise; + + paused(overrides?: CallOverrides): Promise; + + unpause(overrides?: CallOverrides): Promise; + }; + + filters: { + "Paused(address)"(account?: null): PausedEventFilter; + Paused(account?: null): PausedEventFilter; + + "Unpaused(address)"(account?: null): UnpausedEventFilter; + Unpaused(account?: null): UnpausedEventFilter; + }; + + estimateGas: { + pause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + paused(overrides?: CallOverrides): Promise; + + unpause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + pause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + paused(overrides?: CallOverrides): Promise; + + unpause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/IPricingModules.ts b/packages/generated/dev/typings/IPricingModules.ts new file mode 100644 index 000000000..3a059a2f9 --- /dev/null +++ b/packages/generated/dev/typings/IPricingModules.ts @@ -0,0 +1,286 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IPricingModulesBase { + export type PricingModuleStruct = { + name: PromiseOrValue; + description: PromiseOrValue; + module: PromiseOrValue; + }; + + export type PricingModuleStructOutput = [string, string, string] & { + name: string; + description: string; + module: string; + }; +} + +export interface IPricingModulesInterface extends utils.Interface { + functions: { + "addPricingModule(address)": FunctionFragment; + "isPricingModule(address)": FunctionFragment; + "listPricingModules()": FunctionFragment; + "removePricingModule(address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "addPricingModule" + | "isPricingModule" + | "listPricingModules" + | "removePricingModule" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "addPricingModule", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "isPricingModule", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "listPricingModules", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "removePricingModule", + values: [PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "addPricingModule", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isPricingModule", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "listPricingModules", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removePricingModule", + data: BytesLike + ): Result; + + events: { + "PricingModuleAdded(address)": EventFragment; + "PricingModuleRemoved(address)": EventFragment; + "PricingModuleUpdated(address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "PricingModuleAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "PricingModuleRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "PricingModuleUpdated"): EventFragment; +} + +export interface PricingModuleAddedEventObject { + module: string; +} +export type PricingModuleAddedEvent = TypedEvent< + [string], + PricingModuleAddedEventObject +>; + +export type PricingModuleAddedEventFilter = + TypedEventFilter; + +export interface PricingModuleRemovedEventObject { + module: string; +} +export type PricingModuleRemovedEvent = TypedEvent< + [string], + PricingModuleRemovedEventObject +>; + +export type PricingModuleRemovedEventFilter = + TypedEventFilter; + +export interface PricingModuleUpdatedEventObject { + module: string; +} +export type PricingModuleUpdatedEvent = TypedEvent< + [string], + PricingModuleUpdatedEventObject +>; + +export type PricingModuleUpdatedEventFilter = + TypedEventFilter; + +export interface IPricingModules extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IPricingModulesInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + addPricingModule( + module: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isPricingModule( + module: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + listPricingModules( + overrides?: CallOverrides + ): Promise<[IPricingModulesBase.PricingModuleStructOutput[]]>; + + removePricingModule( + module: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + addPricingModule( + module: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isPricingModule( + module: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + listPricingModules( + overrides?: CallOverrides + ): Promise; + + removePricingModule( + module: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + addPricingModule( + module: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isPricingModule( + module: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + listPricingModules( + overrides?: CallOverrides + ): Promise; + + removePricingModule( + module: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "PricingModuleAdded(address)"( + module?: PromiseOrValue | null + ): PricingModuleAddedEventFilter; + PricingModuleAdded( + module?: PromiseOrValue | null + ): PricingModuleAddedEventFilter; + + "PricingModuleRemoved(address)"( + module?: PromiseOrValue | null + ): PricingModuleRemovedEventFilter; + PricingModuleRemoved( + module?: PromiseOrValue | null + ): PricingModuleRemovedEventFilter; + + "PricingModuleUpdated(address)"( + module?: PromiseOrValue | null + ): PricingModuleUpdatedEventFilter; + PricingModuleUpdated( + module?: PromiseOrValue | null + ): PricingModuleUpdatedEventFilter; + }; + + estimateGas: { + addPricingModule( + module: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isPricingModule( + module: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + listPricingModules(overrides?: CallOverrides): Promise; + + removePricingModule( + module: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + addPricingModule( + module: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isPricingModule( + module: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + listPricingModules( + overrides?: CallOverrides + ): Promise; + + removePricingModule( + module: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/IProxyManager.ts b/packages/generated/dev/typings/IProxyManager.ts new file mode 100644 index 000000000..11dcd6500 --- /dev/null +++ b/packages/generated/dev/typings/IProxyManager.ts @@ -0,0 +1,169 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface IProxyManagerInterface extends utils.Interface { + functions: { + "getImplementation(bytes4)": FunctionFragment; + "setImplementation(address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: "getImplementation" | "setImplementation" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getImplementation", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setImplementation", + values: [PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "getImplementation", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setImplementation", + data: BytesLike + ): Result; + + events: { + "ProxyManager__ImplementationSet(address)": EventFragment; + }; + + getEvent( + nameOrSignatureOrTopic: "ProxyManager__ImplementationSet" + ): EventFragment; +} + +export interface ProxyManager__ImplementationSetEventObject { + implementation: string; +} +export type ProxyManager__ImplementationSetEvent = TypedEvent< + [string], + ProxyManager__ImplementationSetEventObject +>; + +export type ProxyManager__ImplementationSetEventFilter = + TypedEventFilter; + +export interface IProxyManager extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IProxyManagerInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + getImplementation( + selector: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + setImplementation( + implementation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + getImplementation( + selector: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setImplementation( + implementation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + getImplementation( + selector: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setImplementation( + implementation: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "ProxyManager__ImplementationSet(address)"( + implementation?: null + ): ProxyManager__ImplementationSetEventFilter; + ProxyManager__ImplementationSet( + implementation?: null + ): ProxyManager__ImplementationSetEventFilter; + }; + + estimateGas: { + getImplementation( + selector: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setImplementation( + implementation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + getImplementation( + selector: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setImplementation( + implementation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/IRoles.ts b/packages/generated/dev/typings/IRoles.ts new file mode 100644 index 000000000..25699834e --- /dev/null +++ b/packages/generated/dev/typings/IRoles.ts @@ -0,0 +1,560 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IRolesBase { + export type CreateEntitlementStruct = { + module: PromiseOrValue; + data: PromiseOrValue; + }; + + export type CreateEntitlementStructOutput = [string, string] & { + module: string; + data: string; + }; + + export type RoleStruct = { + id: PromiseOrValue; + name: PromiseOrValue; + disabled: PromiseOrValue; + permissions: PromiseOrValue[]; + entitlements: PromiseOrValue[]; + }; + + export type RoleStructOutput = [ + BigNumber, + string, + boolean, + string[], + string[] + ] & { + id: BigNumber; + name: string; + disabled: boolean; + permissions: string[]; + entitlements: string[]; + }; +} + +export interface IRolesInterface extends utils.Interface { + functions: { + "addPermissionsToRole(uint256,string[])": FunctionFragment; + "addRoleToEntitlement(uint256,(address,bytes))": FunctionFragment; + "createRole(string,string[],(address,bytes)[])": FunctionFragment; + "getPermissionsByRoleId(uint256)": FunctionFragment; + "getRoleById(uint256)": FunctionFragment; + "getRoles()": FunctionFragment; + "removePermissionsFromRole(uint256,string[])": FunctionFragment; + "removeRole(uint256)": FunctionFragment; + "removeRoleFromEntitlement(uint256,(address,bytes))": FunctionFragment; + "updateRole(uint256,string,string[],(address,bytes)[])": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "addPermissionsToRole" + | "addRoleToEntitlement" + | "createRole" + | "getPermissionsByRoleId" + | "getRoleById" + | "getRoles" + | "removePermissionsFromRole" + | "removeRole" + | "removeRoleFromEntitlement" + | "updateRole" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "addPermissionsToRole", + values: [PromiseOrValue, PromiseOrValue[]] + ): string; + encodeFunctionData( + functionFragment: "addRoleToEntitlement", + values: [PromiseOrValue, IRolesBase.CreateEntitlementStruct] + ): string; + encodeFunctionData( + functionFragment: "createRole", + values: [ + PromiseOrValue, + PromiseOrValue[], + IRolesBase.CreateEntitlementStruct[] + ] + ): string; + encodeFunctionData( + functionFragment: "getPermissionsByRoleId", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getRoleById", + values: [PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "getRoles", values?: undefined): string; + encodeFunctionData( + functionFragment: "removePermissionsFromRole", + values: [PromiseOrValue, PromiseOrValue[]] + ): string; + encodeFunctionData( + functionFragment: "removeRole", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "removeRoleFromEntitlement", + values: [PromiseOrValue, IRolesBase.CreateEntitlementStruct] + ): string; + encodeFunctionData( + functionFragment: "updateRole", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue[], + IRolesBase.CreateEntitlementStruct[] + ] + ): string; + + decodeFunctionResult( + functionFragment: "addPermissionsToRole", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "addRoleToEntitlement", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "createRole", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getPermissionsByRoleId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRoleById", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getRoles", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "removePermissionsFromRole", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "removeRole", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "removeRoleFromEntitlement", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "updateRole", data: BytesLike): Result; + + events: { + "RoleCreated(address,uint256)": EventFragment; + "RoleRemoved(address,uint256)": EventFragment; + "RoleUpdated(address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "RoleCreated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleUpdated"): EventFragment; +} + +export interface RoleCreatedEventObject { + creator: string; + roleId: BigNumber; +} +export type RoleCreatedEvent = TypedEvent< + [string, BigNumber], + RoleCreatedEventObject +>; + +export type RoleCreatedEventFilter = TypedEventFilter; + +export interface RoleRemovedEventObject { + remover: string; + roleId: BigNumber; +} +export type RoleRemovedEvent = TypedEvent< + [string, BigNumber], + RoleRemovedEventObject +>; + +export type RoleRemovedEventFilter = TypedEventFilter; + +export interface RoleUpdatedEventObject { + updater: string; + roleId: BigNumber; +} +export type RoleUpdatedEvent = TypedEvent< + [string, BigNumber], + RoleUpdatedEventObject +>; + +export type RoleUpdatedEventFilter = TypedEventFilter; + +export interface IRoles extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IRolesInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + addPermissionsToRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + addRoleToEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + createRole( + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getPermissionsByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string[]] & { permissions: string[] }>; + + getRoleById( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise< + [IRolesBase.RoleStructOutput] & { role: IRolesBase.RoleStructOutput } + >; + + getRoles( + overrides?: CallOverrides + ): Promise< + [IRolesBase.RoleStructOutput[]] & { roles: IRolesBase.RoleStructOutput[] } + >; + + removePermissionsFromRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRole( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRoleFromEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateRole( + roleId: PromiseOrValue, + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + addPermissionsToRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + addRoleToEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + createRole( + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getPermissionsByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRoleById( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRoles(overrides?: CallOverrides): Promise; + + removePermissionsFromRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRole( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRoleFromEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateRole( + roleId: PromiseOrValue, + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + addPermissionsToRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + addRoleToEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: CallOverrides + ): Promise; + + createRole( + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: CallOverrides + ): Promise; + + getPermissionsByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRoleById( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRoles(overrides?: CallOverrides): Promise; + + removePermissionsFromRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + removeRole( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeRoleFromEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: CallOverrides + ): Promise; + + updateRole( + roleId: PromiseOrValue, + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "RoleCreated(address,uint256)"( + creator?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleCreatedEventFilter; + RoleCreated( + creator?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleCreatedEventFilter; + + "RoleRemoved(address,uint256)"( + remover?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleRemovedEventFilter; + RoleRemoved( + remover?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleRemovedEventFilter; + + "RoleUpdated(address,uint256)"( + updater?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleUpdatedEventFilter; + RoleUpdated( + updater?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleUpdatedEventFilter; + }; + + estimateGas: { + addPermissionsToRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + addRoleToEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + createRole( + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getPermissionsByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRoleById( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRoles(overrides?: CallOverrides): Promise; + + removePermissionsFromRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRole( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRoleFromEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateRole( + roleId: PromiseOrValue, + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + addPermissionsToRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + addRoleToEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + createRole( + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getPermissionsByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRoleById( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRoles(overrides?: CallOverrides): Promise; + + removePermissionsFromRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRole( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRoleFromEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateRole( + roleId: PromiseOrValue, + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/IRuleEntitlement.ts b/packages/generated/dev/typings/IRuleEntitlement.ts new file mode 100644 index 000000000..e6d177883 --- /dev/null +++ b/packages/generated/dev/typings/IRuleEntitlement.ts @@ -0,0 +1,571 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { FunctionFragment, Result } from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IRuleEntitlement { + export type OperationStruct = { + opType: PromiseOrValue; + index: PromiseOrValue; + }; + + export type OperationStructOutput = [number, number] & { + opType: number; + index: number; + }; + + export type CheckOperationStruct = { + opType: PromiseOrValue; + chainId: PromiseOrValue; + contractAddress: PromiseOrValue; + threshold: PromiseOrValue; + }; + + export type CheckOperationStructOutput = [ + number, + BigNumber, + string, + BigNumber + ] & { + opType: number; + chainId: BigNumber; + contractAddress: string; + threshold: BigNumber; + }; + + export type LogicalOperationStruct = { + logOpType: PromiseOrValue; + leftOperationIndex: PromiseOrValue; + rightOperationIndex: PromiseOrValue; + }; + + export type LogicalOperationStructOutput = [number, number, number] & { + logOpType: number; + leftOperationIndex: number; + rightOperationIndex: number; + }; + + export type RuleDataStruct = { + operations: IRuleEntitlement.OperationStruct[]; + checkOperations: IRuleEntitlement.CheckOperationStruct[]; + logicalOperations: IRuleEntitlement.LogicalOperationStruct[]; + }; + + export type RuleDataStructOutput = [ + IRuleEntitlement.OperationStructOutput[], + IRuleEntitlement.CheckOperationStructOutput[], + IRuleEntitlement.LogicalOperationStructOutput[] + ] & { + operations: IRuleEntitlement.OperationStructOutput[]; + checkOperations: IRuleEntitlement.CheckOperationStructOutput[]; + logicalOperations: IRuleEntitlement.LogicalOperationStructOutput[]; + }; +} + +export interface IRuleEntitlementInterface extends utils.Interface { + functions: { + "description()": FunctionFragment; + "encodeRuleData(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]))": FunctionFragment; + "getCheckOperations(uint256)": FunctionFragment; + "getEntitlementDataByRoleId(uint256)": FunctionFragment; + "getLogicalOperations(uint256)": FunctionFragment; + "getOperations(uint256)": FunctionFragment; + "getRuleData(uint256)": FunctionFragment; + "initialize(address)": FunctionFragment; + "isCrosschain()": FunctionFragment; + "isEntitled(bytes32,address[],bytes32)": FunctionFragment; + "moduleType()": FunctionFragment; + "name()": FunctionFragment; + "removeEntitlement(uint256)": FunctionFragment; + "setEntitlement(uint256,bytes)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "description" + | "encodeRuleData" + | "getCheckOperations" + | "getEntitlementDataByRoleId" + | "getLogicalOperations" + | "getOperations" + | "getRuleData" + | "initialize" + | "isCrosschain" + | "isEntitled" + | "moduleType" + | "name" + | "removeEntitlement" + | "setEntitlement" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "description", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "encodeRuleData", + values: [IRuleEntitlement.RuleDataStruct] + ): string; + encodeFunctionData( + functionFragment: "getCheckOperations", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getEntitlementDataByRoleId", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getLogicalOperations", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getOperations", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getRuleData", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "isCrosschain", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "isEntitled", + values: [ + PromiseOrValue, + PromiseOrValue[], + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "moduleType", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData( + functionFragment: "removeEntitlement", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setEntitlement", + values: [PromiseOrValue, PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "description", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "encodeRuleData", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getCheckOperations", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getEntitlementDataByRoleId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getLogicalOperations", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getOperations", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRuleData", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "isCrosschain", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "isEntitled", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "moduleType", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "removeEntitlement", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setEntitlement", + data: BytesLike + ): Result; + + events: {}; +} + +export interface IRuleEntitlement extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IRuleEntitlementInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + description(overrides?: CallOverrides): Promise<[string]>; + + encodeRuleData( + data: IRuleEntitlement.RuleDataStruct, + overrides?: CallOverrides + ): Promise<[string]>; + + getCheckOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[IRuleEntitlement.CheckOperationStructOutput[]]>; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + getLogicalOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[IRuleEntitlement.LogicalOperationStructOutput[]]>; + + getOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[IRuleEntitlement.OperationStructOutput[]]>; + + getRuleData( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise< + [IRuleEntitlement.RuleDataStructOutput] & { + data: IRuleEntitlement.RuleDataStructOutput; + } + >; + + initialize( + space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise<[boolean]>; + + isEntitled( + channelId: PromiseOrValue, + user: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + moduleType(overrides?: CallOverrides): Promise<[string]>; + + name(overrides?: CallOverrides): Promise<[string]>; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + description(overrides?: CallOverrides): Promise; + + encodeRuleData( + data: IRuleEntitlement.RuleDataStruct, + overrides?: CallOverrides + ): Promise; + + getCheckOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getLogicalOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRuleData( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + initialize( + space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise; + + isEntitled( + channelId: PromiseOrValue, + user: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + moduleType(overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + description(overrides?: CallOverrides): Promise; + + encodeRuleData( + data: IRuleEntitlement.RuleDataStruct, + overrides?: CallOverrides + ): Promise; + + getCheckOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getLogicalOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRuleData( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + initialize( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise; + + isEntitled( + channelId: PromiseOrValue, + user: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + moduleType(overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: {}; + + estimateGas: { + description(overrides?: CallOverrides): Promise; + + encodeRuleData( + data: IRuleEntitlement.RuleDataStruct, + overrides?: CallOverrides + ): Promise; + + getCheckOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getLogicalOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRuleData( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + initialize( + space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise; + + isEntitled( + channelId: PromiseOrValue, + user: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + moduleType(overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + description(overrides?: CallOverrides): Promise; + + encodeRuleData( + data: IRuleEntitlement.RuleDataStruct, + overrides?: CallOverrides + ): Promise; + + getCheckOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getLogicalOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRuleData( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + initialize( + space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise; + + isEntitled( + channelId: PromiseOrValue, + user: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + moduleType(overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/ISpaceOwner.ts b/packages/generated/dev/typings/ISpaceOwner.ts new file mode 100644 index 000000000..718aedf00 --- /dev/null +++ b/packages/generated/dev/typings/ISpaceOwner.ts @@ -0,0 +1,333 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace ISpaceOwnerBase { + export type SpaceStruct = { + name: PromiseOrValue; + uri: PromiseOrValue; + tokenId: PromiseOrValue; + createdAt: PromiseOrValue; + }; + + export type SpaceStructOutput = [string, string, BigNumber, BigNumber] & { + name: string; + uri: string; + tokenId: BigNumber; + createdAt: BigNumber; + }; +} + +export interface ISpaceOwnerInterface extends utils.Interface { + functions: { + "getFactory()": FunctionFragment; + "getSpaceInfo(address)": FunctionFragment; + "mintSpace(string,string,address)": FunctionFragment; + "nextTokenId()": FunctionFragment; + "setFactory(address)": FunctionFragment; + "updateSpaceInfo(address,string,string)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "getFactory" + | "getSpaceInfo" + | "mintSpace" + | "nextTokenId" + | "setFactory" + | "updateSpaceInfo" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getFactory", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getSpaceInfo", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "mintSpace", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "nextTokenId", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "setFactory", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "updateSpaceInfo", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + + decodeFunctionResult(functionFragment: "getFactory", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getSpaceInfo", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "mintSpace", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "nextTokenId", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "setFactory", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "updateSpaceInfo", + data: BytesLike + ): Result; + + events: { + "SpaceOwner__SetFactory(address)": EventFragment; + "SpaceOwner__UpdateSpace(address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "SpaceOwner__SetFactory"): EventFragment; + getEvent(nameOrSignatureOrTopic: "SpaceOwner__UpdateSpace"): EventFragment; +} + +export interface SpaceOwner__SetFactoryEventObject { + factory: string; +} +export type SpaceOwner__SetFactoryEvent = TypedEvent< + [string], + SpaceOwner__SetFactoryEventObject +>; + +export type SpaceOwner__SetFactoryEventFilter = + TypedEventFilter; + +export interface SpaceOwner__UpdateSpaceEventObject { + space: string; +} +export type SpaceOwner__UpdateSpaceEvent = TypedEvent< + [string], + SpaceOwner__UpdateSpaceEventObject +>; + +export type SpaceOwner__UpdateSpaceEventFilter = + TypedEventFilter; + +export interface ISpaceOwner extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: ISpaceOwnerInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + getFactory(overrides?: CallOverrides): Promise<[string]>; + + getSpaceInfo( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[ISpaceOwnerBase.SpaceStructOutput]>; + + mintSpace( + name: PromiseOrValue, + uri: PromiseOrValue, + space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + nextTokenId(overrides?: CallOverrides): Promise<[BigNumber]>; + + setFactory( + factory: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateSpaceInfo( + space: PromiseOrValue, + name: PromiseOrValue, + uri: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + getFactory(overrides?: CallOverrides): Promise; + + getSpaceInfo( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + mintSpace( + name: PromiseOrValue, + uri: PromiseOrValue, + space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + nextTokenId(overrides?: CallOverrides): Promise; + + setFactory( + factory: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateSpaceInfo( + space: PromiseOrValue, + name: PromiseOrValue, + uri: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + getFactory(overrides?: CallOverrides): Promise; + + getSpaceInfo( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + mintSpace( + name: PromiseOrValue, + uri: PromiseOrValue, + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + nextTokenId(overrides?: CallOverrides): Promise; + + setFactory( + factory: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + updateSpaceInfo( + space: PromiseOrValue, + name: PromiseOrValue, + uri: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "SpaceOwner__SetFactory(address)"( + factory?: null + ): SpaceOwner__SetFactoryEventFilter; + SpaceOwner__SetFactory(factory?: null): SpaceOwner__SetFactoryEventFilter; + + "SpaceOwner__UpdateSpace(address)"( + space?: PromiseOrValue | null + ): SpaceOwner__UpdateSpaceEventFilter; + SpaceOwner__UpdateSpace( + space?: PromiseOrValue | null + ): SpaceOwner__UpdateSpaceEventFilter; + }; + + estimateGas: { + getFactory(overrides?: CallOverrides): Promise; + + getSpaceInfo( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + mintSpace( + name: PromiseOrValue, + uri: PromiseOrValue, + space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + nextTokenId(overrides?: CallOverrides): Promise; + + setFactory( + factory: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateSpaceInfo( + space: PromiseOrValue, + name: PromiseOrValue, + uri: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + getFactory(overrides?: CallOverrides): Promise; + + getSpaceInfo( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + mintSpace( + name: PromiseOrValue, + uri: PromiseOrValue, + space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + nextTokenId(overrides?: CallOverrides): Promise; + + setFactory( + factory: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateSpaceInfo( + space: PromiseOrValue, + name: PromiseOrValue, + uri: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/IStreamRegistry.ts b/packages/generated/dev/typings/IStreamRegistry.ts new file mode 100644 index 000000000..c4bcce7d2 --- /dev/null +++ b/packages/generated/dev/typings/IStreamRegistry.ts @@ -0,0 +1,720 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export type StreamStruct = { + lastMiniblockHash: PromiseOrValue; + lastMiniblockNum: PromiseOrValue; + reserved0: PromiseOrValue; + flags: PromiseOrValue; + nodes: PromiseOrValue[]; +}; + +export type StreamStructOutput = [ + string, + BigNumber, + BigNumber, + BigNumber, + string[] +] & { + lastMiniblockHash: string; + lastMiniblockNum: BigNumber; + reserved0: BigNumber; + flags: BigNumber; + nodes: string[]; +}; + +export type StreamWithIdStruct = { + id: PromiseOrValue; + stream: StreamStruct; +}; + +export type StreamWithIdStructOutput = [string, StreamStructOutput] & { + id: string; + stream: StreamStructOutput; +}; + +export type SetMiniblockStruct = { + streamId: PromiseOrValue; + prevMiniBlockHash: PromiseOrValue; + lastMiniblockHash: PromiseOrValue; + lastMiniblockNum: PromiseOrValue; + isSealed: PromiseOrValue; +}; + +export type SetMiniblockStructOutput = [ + string, + string, + string, + BigNumber, + boolean +] & { + streamId: string; + prevMiniBlockHash: string; + lastMiniblockHash: string; + lastMiniblockNum: BigNumber; + isSealed: boolean; +}; + +export interface IStreamRegistryInterface extends utils.Interface { + functions: { + "allocateStream(bytes32,address[],bytes32,bytes)": FunctionFragment; + "getAllStreamIds()": FunctionFragment; + "getAllStreams()": FunctionFragment; + "getPaginatedStreams(uint256,uint256)": FunctionFragment; + "getStream(bytes32)": FunctionFragment; + "getStreamByIndex(uint256)": FunctionFragment; + "getStreamCount()": FunctionFragment; + "getStreamWithGenesis(bytes32)": FunctionFragment; + "getStreamsOnNode(address)": FunctionFragment; + "placeStreamOnNode(bytes32,address)": FunctionFragment; + "removeStreamFromNode(bytes32,address)": FunctionFragment; + "setStreamLastMiniblock(bytes32,bytes32,bytes32,uint64,bool)": FunctionFragment; + "setStreamLastMiniblockBatch((bytes32,bytes32,bytes32,uint64,bool)[])": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "allocateStream" + | "getAllStreamIds" + | "getAllStreams" + | "getPaginatedStreams" + | "getStream" + | "getStreamByIndex" + | "getStreamCount" + | "getStreamWithGenesis" + | "getStreamsOnNode" + | "placeStreamOnNode" + | "removeStreamFromNode" + | "setStreamLastMiniblock" + | "setStreamLastMiniblockBatch" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "allocateStream", + values: [ + PromiseOrValue, + PromiseOrValue[], + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "getAllStreamIds", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getAllStreams", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getPaginatedStreams", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getStream", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getStreamByIndex", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getStreamCount", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getStreamWithGenesis", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getStreamsOnNode", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "placeStreamOnNode", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "removeStreamFromNode", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setStreamLastMiniblock", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "setStreamLastMiniblockBatch", + values: [SetMiniblockStruct[]] + ): string; + + decodeFunctionResult( + functionFragment: "allocateStream", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getAllStreamIds", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getAllStreams", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getPaginatedStreams", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getStream", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getStreamByIndex", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getStreamCount", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getStreamWithGenesis", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getStreamsOnNode", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "placeStreamOnNode", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removeStreamFromNode", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setStreamLastMiniblock", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setStreamLastMiniblockBatch", + data: BytesLike + ): Result; + + events: { + "StreamAllocated(bytes32,address[],bytes32,bytes)": EventFragment; + "StreamLastMiniblockUpdateFailed(bytes32,bytes32,uint64,string)": EventFragment; + "StreamLastMiniblockUpdated(bytes32,bytes32,uint64,bool)": EventFragment; + "StreamPlacementUpdated(bytes32,address,bool)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "StreamAllocated"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "StreamLastMiniblockUpdateFailed" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "StreamLastMiniblockUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "StreamPlacementUpdated"): EventFragment; +} + +export interface StreamAllocatedEventObject { + streamId: string; + nodes: string[]; + genesisMiniblockHash: string; + genesisMiniblock: string; +} +export type StreamAllocatedEvent = TypedEvent< + [string, string[], string, string], + StreamAllocatedEventObject +>; + +export type StreamAllocatedEventFilter = TypedEventFilter; + +export interface StreamLastMiniblockUpdateFailedEventObject { + streamId: string; + lastMiniblockHash: string; + lastMiniblockNum: BigNumber; + reason: string; +} +export type StreamLastMiniblockUpdateFailedEvent = TypedEvent< + [string, string, BigNumber, string], + StreamLastMiniblockUpdateFailedEventObject +>; + +export type StreamLastMiniblockUpdateFailedEventFilter = + TypedEventFilter; + +export interface StreamLastMiniblockUpdatedEventObject { + streamId: string; + lastMiniblockHash: string; + lastMiniblockNum: BigNumber; + isSealed: boolean; +} +export type StreamLastMiniblockUpdatedEvent = TypedEvent< + [string, string, BigNumber, boolean], + StreamLastMiniblockUpdatedEventObject +>; + +export type StreamLastMiniblockUpdatedEventFilter = + TypedEventFilter; + +export interface StreamPlacementUpdatedEventObject { + streamId: string; + nodeAddress: string; + isAdded: boolean; +} +export type StreamPlacementUpdatedEvent = TypedEvent< + [string, string, boolean], + StreamPlacementUpdatedEventObject +>; + +export type StreamPlacementUpdatedEventFilter = + TypedEventFilter; + +export interface IStreamRegistry extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IStreamRegistryInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + allocateStream( + streamId: PromiseOrValue, + nodes: PromiseOrValue[], + genesisMiniblockHash: PromiseOrValue, + genesisMiniblock: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getAllStreamIds(overrides?: CallOverrides): Promise<[string[]]>; + + getAllStreams( + overrides?: CallOverrides + ): Promise<[StreamWithIdStructOutput[]]>; + + getPaginatedStreams( + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[StreamWithIdStructOutput[], boolean]>; + + getStream( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[StreamStructOutput]>; + + getStreamByIndex( + i: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[StreamWithIdStructOutput]>; + + getStreamCount(overrides?: CallOverrides): Promise<[BigNumber]>; + + getStreamWithGenesis( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[StreamStructOutput, string, string]>; + + getStreamsOnNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[StreamWithIdStructOutput[]]>; + + placeStreamOnNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeStreamFromNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setStreamLastMiniblock( + streamId: PromiseOrValue, + prevMiniBlockHash: PromiseOrValue, + lastMiniblockHash: PromiseOrValue, + lastMiniblockNum: PromiseOrValue, + isSealed: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setStreamLastMiniblockBatch( + miniblocks: SetMiniblockStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + allocateStream( + streamId: PromiseOrValue, + nodes: PromiseOrValue[], + genesisMiniblockHash: PromiseOrValue, + genesisMiniblock: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getAllStreamIds(overrides?: CallOverrides): Promise; + + getAllStreams(overrides?: CallOverrides): Promise; + + getPaginatedStreams( + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[StreamWithIdStructOutput[], boolean]>; + + getStream( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamByIndex( + i: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamCount(overrides?: CallOverrides): Promise; + + getStreamWithGenesis( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[StreamStructOutput, string, string]>; + + getStreamsOnNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + placeStreamOnNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeStreamFromNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setStreamLastMiniblock( + streamId: PromiseOrValue, + prevMiniBlockHash: PromiseOrValue, + lastMiniblockHash: PromiseOrValue, + lastMiniblockNum: PromiseOrValue, + isSealed: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setStreamLastMiniblockBatch( + miniblocks: SetMiniblockStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + allocateStream( + streamId: PromiseOrValue, + nodes: PromiseOrValue[], + genesisMiniblockHash: PromiseOrValue, + genesisMiniblock: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getAllStreamIds(overrides?: CallOverrides): Promise; + + getAllStreams( + overrides?: CallOverrides + ): Promise; + + getPaginatedStreams( + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[StreamWithIdStructOutput[], boolean]>; + + getStream( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamByIndex( + i: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamCount(overrides?: CallOverrides): Promise; + + getStreamWithGenesis( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[StreamStructOutput, string, string]>; + + getStreamsOnNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + placeStreamOnNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeStreamFromNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setStreamLastMiniblock( + streamId: PromiseOrValue, + prevMiniBlockHash: PromiseOrValue, + lastMiniblockHash: PromiseOrValue, + lastMiniblockNum: PromiseOrValue, + isSealed: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setStreamLastMiniblockBatch( + miniblocks: SetMiniblockStruct[], + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "StreamAllocated(bytes32,address[],bytes32,bytes)"( + streamId?: null, + nodes?: null, + genesisMiniblockHash?: null, + genesisMiniblock?: null + ): StreamAllocatedEventFilter; + StreamAllocated( + streamId?: null, + nodes?: null, + genesisMiniblockHash?: null, + genesisMiniblock?: null + ): StreamAllocatedEventFilter; + + "StreamLastMiniblockUpdateFailed(bytes32,bytes32,uint64,string)"( + streamId?: null, + lastMiniblockHash?: null, + lastMiniblockNum?: null, + reason?: null + ): StreamLastMiniblockUpdateFailedEventFilter; + StreamLastMiniblockUpdateFailed( + streamId?: null, + lastMiniblockHash?: null, + lastMiniblockNum?: null, + reason?: null + ): StreamLastMiniblockUpdateFailedEventFilter; + + "StreamLastMiniblockUpdated(bytes32,bytes32,uint64,bool)"( + streamId?: null, + lastMiniblockHash?: null, + lastMiniblockNum?: null, + isSealed?: null + ): StreamLastMiniblockUpdatedEventFilter; + StreamLastMiniblockUpdated( + streamId?: null, + lastMiniblockHash?: null, + lastMiniblockNum?: null, + isSealed?: null + ): StreamLastMiniblockUpdatedEventFilter; + + "StreamPlacementUpdated(bytes32,address,bool)"( + streamId?: null, + nodeAddress?: null, + isAdded?: null + ): StreamPlacementUpdatedEventFilter; + StreamPlacementUpdated( + streamId?: null, + nodeAddress?: null, + isAdded?: null + ): StreamPlacementUpdatedEventFilter; + }; + + estimateGas: { + allocateStream( + streamId: PromiseOrValue, + nodes: PromiseOrValue[], + genesisMiniblockHash: PromiseOrValue, + genesisMiniblock: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getAllStreamIds(overrides?: CallOverrides): Promise; + + getAllStreams(overrides?: CallOverrides): Promise; + + getPaginatedStreams( + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStream( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamByIndex( + i: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamCount(overrides?: CallOverrides): Promise; + + getStreamWithGenesis( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamsOnNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + placeStreamOnNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeStreamFromNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setStreamLastMiniblock( + streamId: PromiseOrValue, + prevMiniBlockHash: PromiseOrValue, + lastMiniblockHash: PromiseOrValue, + lastMiniblockNum: PromiseOrValue, + isSealed: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setStreamLastMiniblockBatch( + miniblocks: SetMiniblockStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + allocateStream( + streamId: PromiseOrValue, + nodes: PromiseOrValue[], + genesisMiniblockHash: PromiseOrValue, + genesisMiniblock: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getAllStreamIds(overrides?: CallOverrides): Promise; + + getAllStreams(overrides?: CallOverrides): Promise; + + getPaginatedStreams( + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStream( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamByIndex( + i: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamCount(overrides?: CallOverrides): Promise; + + getStreamWithGenesis( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamsOnNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + placeStreamOnNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeStreamFromNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setStreamLastMiniblock( + streamId: PromiseOrValue, + prevMiniBlockHash: PromiseOrValue, + lastMiniblockHash: PromiseOrValue, + lastMiniblockNum: PromiseOrValue, + isSealed: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setStreamLastMiniblockBatch( + miniblocks: SetMiniblockStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/IWalletLink.ts b/packages/generated/dev/typings/IWalletLink.ts new file mode 100644 index 000000000..4662254ea --- /dev/null +++ b/packages/generated/dev/typings/IWalletLink.ts @@ -0,0 +1,417 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IWalletLinkBase { + export type LinkedWalletStruct = { + addr: PromiseOrValue; + signature: PromiseOrValue; + }; + + export type LinkedWalletStructOutput = [string, string] & { + addr: string; + signature: string; + }; +} + +export interface IWalletLinkInterface extends utils.Interface { + functions: { + "checkIfLinked(address,address)": FunctionFragment; + "getLatestNonceForRootKey(address)": FunctionFragment; + "getRootKeyForWallet(address)": FunctionFragment; + "getWalletsByRootKey(address)": FunctionFragment; + "linkCallerToRootKey((address,bytes),uint256)": FunctionFragment; + "linkWalletToRootKey((address,bytes),(address,bytes),uint256)": FunctionFragment; + "removeLink(address,(address,bytes),uint256)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "checkIfLinked" + | "getLatestNonceForRootKey" + | "getRootKeyForWallet" + | "getWalletsByRootKey" + | "linkCallerToRootKey" + | "linkWalletToRootKey" + | "removeLink" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "checkIfLinked", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getLatestNonceForRootKey", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getRootKeyForWallet", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getWalletsByRootKey", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "linkCallerToRootKey", + values: [IWalletLinkBase.LinkedWalletStruct, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "linkWalletToRootKey", + values: [ + IWalletLinkBase.LinkedWalletStruct, + IWalletLinkBase.LinkedWalletStruct, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "removeLink", + values: [ + PromiseOrValue, + IWalletLinkBase.LinkedWalletStruct, + PromiseOrValue + ] + ): string; + + decodeFunctionResult( + functionFragment: "checkIfLinked", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getLatestNonceForRootKey", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRootKeyForWallet", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getWalletsByRootKey", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "linkCallerToRootKey", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "linkWalletToRootKey", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "removeLink", data: BytesLike): Result; + + events: { + "LinkWalletToRootKey(address,address)": EventFragment; + "RemoveLink(address,address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "LinkWalletToRootKey"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RemoveLink"): EventFragment; +} + +export interface LinkWalletToRootKeyEventObject { + wallet: string; + rootKey: string; +} +export type LinkWalletToRootKeyEvent = TypedEvent< + [string, string], + LinkWalletToRootKeyEventObject +>; + +export type LinkWalletToRootKeyEventFilter = + TypedEventFilter; + +export interface RemoveLinkEventObject { + wallet: string; + secondWallet: string; +} +export type RemoveLinkEvent = TypedEvent< + [string, string], + RemoveLinkEventObject +>; + +export type RemoveLinkEventFilter = TypedEventFilter; + +export interface IWalletLink extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IWalletLinkInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + checkIfLinked( + rootKey: PromiseOrValue, + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + getLatestNonceForRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getRootKeyForWallet( + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string] & { rootKey: string }>; + + getWalletsByRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string[]] & { wallets: string[] }>; + + linkCallerToRootKey( + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + linkWalletToRootKey( + wallet: IWalletLinkBase.LinkedWalletStruct, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeLink( + wallet: PromiseOrValue, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + checkIfLinked( + rootKey: PromiseOrValue, + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getLatestNonceForRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRootKeyForWallet( + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getWalletsByRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + linkCallerToRootKey( + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + linkWalletToRootKey( + wallet: IWalletLinkBase.LinkedWalletStruct, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeLink( + wallet: PromiseOrValue, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + checkIfLinked( + rootKey: PromiseOrValue, + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getLatestNonceForRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRootKeyForWallet( + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getWalletsByRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + linkCallerToRootKey( + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + linkWalletToRootKey( + wallet: IWalletLinkBase.LinkedWalletStruct, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeLink( + wallet: PromiseOrValue, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "LinkWalletToRootKey(address,address)"( + wallet?: PromiseOrValue | null, + rootKey?: PromiseOrValue | null + ): LinkWalletToRootKeyEventFilter; + LinkWalletToRootKey( + wallet?: PromiseOrValue | null, + rootKey?: PromiseOrValue | null + ): LinkWalletToRootKeyEventFilter; + + "RemoveLink(address,address)"( + wallet?: PromiseOrValue | null, + secondWallet?: PromiseOrValue | null + ): RemoveLinkEventFilter; + RemoveLink( + wallet?: PromiseOrValue | null, + secondWallet?: PromiseOrValue | null + ): RemoveLinkEventFilter; + }; + + estimateGas: { + checkIfLinked( + rootKey: PromiseOrValue, + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getLatestNonceForRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRootKeyForWallet( + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getWalletsByRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + linkCallerToRootKey( + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + linkWalletToRootKey( + wallet: IWalletLinkBase.LinkedWalletStruct, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeLink( + wallet: PromiseOrValue, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + checkIfLinked( + rootKey: PromiseOrValue, + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getLatestNonceForRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRootKeyForWallet( + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getWalletsByRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + linkCallerToRootKey( + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + linkWalletToRootKey( + wallet: IWalletLinkBase.LinkedWalletStruct, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeLink( + wallet: PromiseOrValue, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/Member.ts b/packages/generated/dev/typings/Member.ts new file mode 100644 index 000000000..bb261af70 --- /dev/null +++ b/packages/generated/dev/typings/Member.ts @@ -0,0 +1,1081 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PayableOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface MemberInterface extends utils.Interface { + functions: { + "MINT_PRICE()": FunctionFragment; + "TOTAL_SUPPLY()": FunctionFragment; + "_hasMinted(address)": FunctionFragment; + "approve(address,uint256)": FunctionFragment; + "balanceOf(address)": FunctionFragment; + "baseURI()": FunctionFragment; + "currentTokenId()": FunctionFragment; + "getApproved(uint256)": FunctionFragment; + "isApprovedForAll(address,address)": FunctionFragment; + "name()": FunctionFragment; + "owner()": FunctionFragment; + "ownerOf(uint256)": FunctionFragment; + "privateMint(address,uint256,bytes32[])": FunctionFragment; + "publicMint(address)": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "safeTransferFrom(address,address,uint256)": FunctionFragment; + "safeTransferFrom(address,address,uint256,bytes)": FunctionFragment; + "setApprovalForAll(address,bool)": FunctionFragment; + "setBaseURI(string)": FunctionFragment; + "startPublicMint()": FunctionFragment; + "startWaitlistMint()": FunctionFragment; + "supportsInterface(bytes4)": FunctionFragment; + "symbol()": FunctionFragment; + "tokenURI(uint256)": FunctionFragment; + "transferFrom(address,address,uint256)": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + "withdrawPayments(address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "MINT_PRICE" + | "TOTAL_SUPPLY" + | "_hasMinted" + | "approve" + | "balanceOf" + | "baseURI" + | "currentTokenId" + | "getApproved" + | "isApprovedForAll" + | "name" + | "owner" + | "ownerOf" + | "privateMint" + | "publicMint" + | "renounceOwnership" + | "safeTransferFrom(address,address,uint256)" + | "safeTransferFrom(address,address,uint256,bytes)" + | "setApprovalForAll" + | "setBaseURI" + | "startPublicMint" + | "startWaitlistMint" + | "supportsInterface" + | "symbol" + | "tokenURI" + | "transferFrom" + | "transferOwnership" + | "withdrawPayments" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "MINT_PRICE", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "TOTAL_SUPPLY", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_hasMinted", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "approve", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "balanceOf", + values: [PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "baseURI", values?: undefined): string; + encodeFunctionData( + functionFragment: "currentTokenId", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getApproved", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "isApprovedForAll", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "ownerOf", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "privateMint", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue[] + ] + ): string; + encodeFunctionData( + functionFragment: "publicMint", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "safeTransferFrom(address,address,uint256)", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "safeTransferFrom(address,address,uint256,bytes)", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "setApprovalForAll", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setBaseURI", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "startPublicMint", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "startWaitlistMint", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "supportsInterface", + values: [PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "symbol", values?: undefined): string; + encodeFunctionData( + functionFragment: "tokenURI", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "transferFrom", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "withdrawPayments", + values: [PromiseOrValue] + ): string; + + decodeFunctionResult(functionFragment: "MINT_PRICE", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "TOTAL_SUPPLY", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "_hasMinted", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "baseURI", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "currentTokenId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getApproved", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isApprovedForAll", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "ownerOf", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "privateMint", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "publicMint", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "safeTransferFrom(address,address,uint256)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "safeTransferFrom(address,address,uint256,bytes)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setApprovalForAll", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "setBaseURI", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "startPublicMint", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "startWaitlistMint", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "supportsInterface", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "tokenURI", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "transferFrom", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "withdrawPayments", + data: BytesLike + ): Result; + + events: { + "Approval(address,address,uint256)": EventFragment; + "ApprovalForAll(address,address,bool)": EventFragment; + "MintStateChanged(address,uint8,uint8,uint256)": EventFragment; + "Minted(address,uint256,uint256)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "Transfer(address,address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ApprovalForAll"): EventFragment; + getEvent(nameOrSignatureOrTopic: "MintStateChanged"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Minted"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; +} + +export interface ApprovalEventObject { + owner: string; + approved: string; + tokenId: BigNumber; +} +export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], + ApprovalEventObject +>; + +export type ApprovalEventFilter = TypedEventFilter; + +export interface ApprovalForAllEventObject { + owner: string; + operator: string; + approved: boolean; +} +export type ApprovalForAllEvent = TypedEvent< + [string, string, boolean], + ApprovalForAllEventObject +>; + +export type ApprovalForAllEventFilter = TypedEventFilter; + +export interface MintStateChangedEventObject { + caller: string; + prevState: number; + newState: number; + timestamp: BigNumber; +} +export type MintStateChangedEvent = TypedEvent< + [string, number, number, BigNumber], + MintStateChangedEventObject +>; + +export type MintStateChangedEventFilter = + TypedEventFilter; + +export interface MintedEventObject { + recipient: string; + tokenId: BigNumber; + timestamp: BigNumber; +} +export type MintedEvent = TypedEvent< + [string, BigNumber, BigNumber], + MintedEventObject +>; + +export type MintedEventFilter = TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface TransferEventObject { + from: string; + to: string; + tokenId: BigNumber; +} +export type TransferEvent = TypedEvent< + [string, string, BigNumber], + TransferEventObject +>; + +export type TransferEventFilter = TypedEventFilter; + +export interface Member extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: MemberInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + MINT_PRICE(overrides?: CallOverrides): Promise<[BigNumber]>; + + TOTAL_SUPPLY(overrides?: CallOverrides): Promise<[BigNumber]>; + + _hasMinted( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + baseURI(overrides?: CallOverrides): Promise<[string]>; + + currentTokenId(overrides?: CallOverrides): Promise<[BigNumber]>; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + name(overrides?: CallOverrides): Promise<[string]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + privateMint( + recipient: PromiseOrValue, + allowance: PromiseOrValue, + proof: PromiseOrValue[], + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + publicMint( + recipient: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + data: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setBaseURI( + baseURI_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + startPublicMint( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + startWaitlistMint( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + symbol(overrides?: CallOverrides): Promise<[string]>; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + withdrawPayments( + payee: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + MINT_PRICE(overrides?: CallOverrides): Promise; + + TOTAL_SUPPLY(overrides?: CallOverrides): Promise; + + _hasMinted( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + baseURI(overrides?: CallOverrides): Promise; + + currentTokenId(overrides?: CallOverrides): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + name(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + privateMint( + recipient: PromiseOrValue, + allowance: PromiseOrValue, + proof: PromiseOrValue[], + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + publicMint( + recipient: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + data: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setBaseURI( + baseURI_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + startPublicMint( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + startWaitlistMint( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + withdrawPayments( + payee: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + MINT_PRICE(overrides?: CallOverrides): Promise; + + TOTAL_SUPPLY(overrides?: CallOverrides): Promise; + + _hasMinted( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + baseURI(overrides?: CallOverrides): Promise; + + currentTokenId(overrides?: CallOverrides): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + name(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + privateMint( + recipient: PromiseOrValue, + allowance: PromiseOrValue, + proof: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + publicMint( + recipient: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setBaseURI( + baseURI_: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + startPublicMint(overrides?: CallOverrides): Promise; + + startWaitlistMint(overrides?: CallOverrides): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + withdrawPayments( + payee: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Approval(address,address,uint256)"( + owner?: PromiseOrValue | null, + approved?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): ApprovalEventFilter; + Approval( + owner?: PromiseOrValue | null, + approved?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): ApprovalEventFilter; + + "ApprovalForAll(address,address,bool)"( + owner?: PromiseOrValue | null, + operator?: PromiseOrValue | null, + approved?: null + ): ApprovalForAllEventFilter; + ApprovalForAll( + owner?: PromiseOrValue | null, + operator?: PromiseOrValue | null, + approved?: null + ): ApprovalForAllEventFilter; + + "MintStateChanged(address,uint8,uint8,uint256)"( + caller?: PromiseOrValue | null, + prevState?: PromiseOrValue | null, + newState?: PromiseOrValue | null, + timestamp?: null + ): MintStateChangedEventFilter; + MintStateChanged( + caller?: PromiseOrValue | null, + prevState?: PromiseOrValue | null, + newState?: PromiseOrValue | null, + timestamp?: null + ): MintStateChangedEventFilter; + + "Minted(address,uint256,uint256)"( + recipient?: PromiseOrValue | null, + tokenId?: null, + timestamp?: null + ): MintedEventFilter; + Minted( + recipient?: PromiseOrValue | null, + tokenId?: null, + timestamp?: null + ): MintedEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: PromiseOrValue | null, + newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: PromiseOrValue | null, + newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + + "Transfer(address,address,uint256)"( + from?: PromiseOrValue | null, + to?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): TransferEventFilter; + Transfer( + from?: PromiseOrValue | null, + to?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): TransferEventFilter; + }; + + estimateGas: { + MINT_PRICE(overrides?: CallOverrides): Promise; + + TOTAL_SUPPLY(overrides?: CallOverrides): Promise; + + _hasMinted( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + baseURI(overrides?: CallOverrides): Promise; + + currentTokenId(overrides?: CallOverrides): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + name(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + privateMint( + recipient: PromiseOrValue, + allowance: PromiseOrValue, + proof: PromiseOrValue[], + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + publicMint( + recipient: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + data: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setBaseURI( + baseURI_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + startPublicMint( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + startWaitlistMint( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + withdrawPayments( + payee: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + MINT_PRICE(overrides?: CallOverrides): Promise; + + TOTAL_SUPPLY(overrides?: CallOverrides): Promise; + + _hasMinted( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + baseURI(overrides?: CallOverrides): Promise; + + currentTokenId(overrides?: CallOverrides): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + name(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + privateMint( + recipient: PromiseOrValue, + allowance: PromiseOrValue, + proof: PromiseOrValue[], + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + publicMint( + recipient: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + data: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setBaseURI( + baseURI_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + startPublicMint( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + startWaitlistMint( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + withdrawPayments( + payee: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/MembershipFacet.ts b/packages/generated/dev/typings/MembershipFacet.ts new file mode 100644 index 000000000..87e8e3950 --- /dev/null +++ b/packages/generated/dev/typings/MembershipFacet.ts @@ -0,0 +1,2270 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PayableOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IMembershipBase { + export type MembershipStruct = { + name: PromiseOrValue; + symbol: PromiseOrValue; + price: PromiseOrValue; + maxSupply: PromiseOrValue; + duration: PromiseOrValue; + currency: PromiseOrValue; + feeRecipient: PromiseOrValue; + freeAllocation: PromiseOrValue; + pricingModule: PromiseOrValue; + }; + + export type MembershipStructOutput = [ + string, + string, + BigNumber, + BigNumber, + BigNumber, + string, + string, + BigNumber, + string + ] & { + name: string; + symbol: string; + price: BigNumber; + maxSupply: BigNumber; + duration: BigNumber; + currency: string; + feeRecipient: string; + freeAllocation: BigNumber; + pricingModule: string; + }; +} + +export declare namespace IRuleEntitlement { + export type OperationStruct = { + opType: PromiseOrValue; + index: PromiseOrValue; + }; + + export type OperationStructOutput = [number, number] & { + opType: number; + index: number; + }; + + export type CheckOperationStruct = { + opType: PromiseOrValue; + chainId: PromiseOrValue; + contractAddress: PromiseOrValue; + threshold: PromiseOrValue; + }; + + export type CheckOperationStructOutput = [ + number, + BigNumber, + string, + BigNumber + ] & { + opType: number; + chainId: BigNumber; + contractAddress: string; + threshold: BigNumber; + }; + + export type LogicalOperationStruct = { + logOpType: PromiseOrValue; + leftOperationIndex: PromiseOrValue; + rightOperationIndex: PromiseOrValue; + }; + + export type LogicalOperationStructOutput = [number, number, number] & { + logOpType: number; + leftOperationIndex: number; + rightOperationIndex: number; + }; + + export type RuleDataStruct = { + operations: IRuleEntitlement.OperationStruct[]; + checkOperations: IRuleEntitlement.CheckOperationStruct[]; + logicalOperations: IRuleEntitlement.LogicalOperationStruct[]; + }; + + export type RuleDataStructOutput = [ + IRuleEntitlement.OperationStructOutput[], + IRuleEntitlement.CheckOperationStructOutput[], + IRuleEntitlement.LogicalOperationStructOutput[] + ] & { + operations: IRuleEntitlement.OperationStructOutput[]; + checkOperations: IRuleEntitlement.CheckOperationStructOutput[]; + logicalOperations: IRuleEntitlement.LogicalOperationStructOutput[]; + }; +} + +export interface MembershipFacetInterface extends utils.Interface { + functions: { + "__ERC721A_init(string,string)": FunctionFragment; + "__EntitlementGated_init(address)": FunctionFragment; + "__Membership_init((string,string,uint256,uint256,uint64,address,address,uint256,address),address)": FunctionFragment; + "_getMembershipCurrency()": FunctionFragment; + "_getMembershipFreeAllocation()": FunctionFragment; + "_getMembershipImage()": FunctionFragment; + "_getMembershipPrice(uint256)": FunctionFragment; + "_getMembershipSupplyLimit()": FunctionFragment; + "_getPricingModule()": FunctionFragment; + "_getSpaceFactory()": FunctionFragment; + "_setMembershipFreeAllocation(uint256)": FunctionFragment; + "_setMembershipSupplyLimit(uint256)": FunctionFragment; + "_setPricingModule(address)": FunctionFragment; + "approve(address,uint256)": FunctionFragment; + "balanceOf(address)": FunctionFragment; + "expiresAt(uint256)": FunctionFragment; + "getApproved(uint256)": FunctionFragment; + "getMembershipCurrency()": FunctionFragment; + "getMembershipDuration()": FunctionFragment; + "getMembershipFreeAllocation()": FunctionFragment; + "getMembershipImage()": FunctionFragment; + "getMembershipLimit()": FunctionFragment; + "getMembershipPrice()": FunctionFragment; + "getMembershipPricingModule()": FunctionFragment; + "getMembershipRenewalPrice(uint256)": FunctionFragment; + "getRuleData(bytes32,uint256)": FunctionFragment; + "getSpaceFactory()": FunctionFragment; + "isApprovedForAll(address,address)": FunctionFragment; + "joinSpace(address)": FunctionFragment; + "joinSpaceWithReferral(address,address,uint256)": FunctionFragment; + "name()": FunctionFragment; + "ownerOf(uint256)": FunctionFragment; + "postEntitlementCheckResult(bytes32,uint256,uint8)": FunctionFragment; + "renewMembership(uint256)": FunctionFragment; + "safeTransferFrom(address,address,uint256)": FunctionFragment; + "safeTransferFrom(address,address,uint256,bytes)": FunctionFragment; + "setApprovalForAll(address,bool)": FunctionFragment; + "setMembershipFreeAllocation(uint256)": FunctionFragment; + "setMembershipImage(string)": FunctionFragment; + "setMembershipLimit(uint256)": FunctionFragment; + "setMembershipPrice(uint256)": FunctionFragment; + "setMembershipPricingModule(address)": FunctionFragment; + "symbol()": FunctionFragment; + "tokenURI(uint256)": FunctionFragment; + "totalSupply()": FunctionFragment; + "transferFrom(address,address,uint256)": FunctionFragment; + "withdraw(address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "__ERC721A_init" + | "__EntitlementGated_init" + | "__Membership_init" + | "_getMembershipCurrency" + | "_getMembershipFreeAllocation" + | "_getMembershipImage" + | "_getMembershipPrice" + | "_getMembershipSupplyLimit" + | "_getPricingModule" + | "_getSpaceFactory" + | "_setMembershipFreeAllocation" + | "_setMembershipSupplyLimit" + | "_setPricingModule" + | "approve" + | "balanceOf" + | "expiresAt" + | "getApproved" + | "getMembershipCurrency" + | "getMembershipDuration" + | "getMembershipFreeAllocation" + | "getMembershipImage" + | "getMembershipLimit" + | "getMembershipPrice" + | "getMembershipPricingModule" + | "getMembershipRenewalPrice" + | "getRuleData" + | "getSpaceFactory" + | "isApprovedForAll" + | "joinSpace" + | "joinSpaceWithReferral" + | "name" + | "ownerOf" + | "postEntitlementCheckResult" + | "renewMembership" + | "safeTransferFrom(address,address,uint256)" + | "safeTransferFrom(address,address,uint256,bytes)" + | "setApprovalForAll" + | "setMembershipFreeAllocation" + | "setMembershipImage" + | "setMembershipLimit" + | "setMembershipPrice" + | "setMembershipPricingModule" + | "symbol" + | "tokenURI" + | "totalSupply" + | "transferFrom" + | "withdraw" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "__ERC721A_init", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "__EntitlementGated_init", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "__Membership_init", + values: [IMembershipBase.MembershipStruct, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "_getMembershipCurrency", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_getMembershipFreeAllocation", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_getMembershipImage", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_getMembershipPrice", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "_getMembershipSupplyLimit", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_getPricingModule", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_getSpaceFactory", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_setMembershipFreeAllocation", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "_setMembershipSupplyLimit", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "_setPricingModule", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "approve", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "balanceOf", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "expiresAt", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getApproved", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getMembershipCurrency", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getMembershipDuration", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getMembershipFreeAllocation", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getMembershipImage", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getMembershipLimit", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getMembershipPrice", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getMembershipPricingModule", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getMembershipRenewalPrice", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getRuleData", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getSpaceFactory", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "isApprovedForAll", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "joinSpace", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "joinSpaceWithReferral", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData( + functionFragment: "ownerOf", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "postEntitlementCheckResult", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "renewMembership", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "safeTransferFrom(address,address,uint256)", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "safeTransferFrom(address,address,uint256,bytes)", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "setApprovalForAll", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setMembershipFreeAllocation", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setMembershipImage", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setMembershipLimit", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setMembershipPrice", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setMembershipPricingModule", + values: [PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "symbol", values?: undefined): string; + encodeFunctionData( + functionFragment: "tokenURI", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "totalSupply", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transferFrom", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "withdraw", + values: [PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "__ERC721A_init", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "__EntitlementGated_init", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "__Membership_init", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_getMembershipCurrency", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_getMembershipFreeAllocation", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_getMembershipImage", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_getMembershipPrice", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_getMembershipSupplyLimit", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_getPricingModule", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_getSpaceFactory", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_setMembershipFreeAllocation", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_setMembershipSupplyLimit", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_setPricingModule", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "expiresAt", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getApproved", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMembershipCurrency", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMembershipDuration", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMembershipFreeAllocation", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMembershipImage", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMembershipLimit", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMembershipPrice", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMembershipPricingModule", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMembershipRenewalPrice", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRuleData", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getSpaceFactory", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isApprovedForAll", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "joinSpace", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "joinSpaceWithReferral", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "ownerOf", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "postEntitlementCheckResult", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renewMembership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "safeTransferFrom(address,address,uint256)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "safeTransferFrom(address,address,uint256,bytes)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setApprovalForAll", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setMembershipFreeAllocation", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setMembershipImage", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setMembershipLimit", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setMembershipPrice", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setMembershipPricingModule", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "tokenURI", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "totalSupply", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferFrom", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result; + + events: { + "Approval(address,address,uint256)": EventFragment; + "ApprovalForAll(address,address,bool)": EventFragment; + "Banned(address,uint256)": EventFragment; + "ConsecutiveTransfer(uint256,uint256,address,address)": EventFragment; + "EntitlementCheckResultPosted(bytes32,uint8)": EventFragment; + "Initialized(uint32)": EventFragment; + "InterfaceAdded(bytes4)": EventFragment; + "InterfaceRemoved(bytes4)": EventFragment; + "MembershipCurrencyUpdated(address)": EventFragment; + "MembershipFeeRecipientUpdated(address)": EventFragment; + "MembershipFreeAllocationUpdated(uint256)": EventFragment; + "MembershipLimitUpdated(uint256)": EventFragment; + "MembershipPriceUpdated(uint256)": EventFragment; + "MembershipTokenIssued(address,uint256)": EventFragment; + "MembershipTokenRejected(address)": EventFragment; + "MembershipWithdrawal(address,uint256)": EventFragment; + "Membership__ReferralCreated(uint256,uint16)": EventFragment; + "Membership__ReferralRemoved(uint256)": EventFragment; + "Membership__ReferralTimeCreated(uint256,uint16,uint256,uint256)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "Paused(address)": EventFragment; + "RoleCreated(address,uint256)": EventFragment; + "RoleRemoved(address,uint256)": EventFragment; + "RoleUpdated(address,uint256)": EventFragment; + "SubscriptionUpdate(uint256,uint64)": EventFragment; + "Transfer(address,address,uint256)": EventFragment; + "Unbanned(address,uint256)": EventFragment; + "Unpaused(address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ApprovalForAll"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Banned"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ConsecutiveTransfer"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "EntitlementCheckResultPosted" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "MembershipCurrencyUpdated"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "MembershipFeeRecipientUpdated" + ): EventFragment; + getEvent( + nameOrSignatureOrTopic: "MembershipFreeAllocationUpdated" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "MembershipLimitUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "MembershipPriceUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "MembershipTokenIssued"): EventFragment; + getEvent(nameOrSignatureOrTopic: "MembershipTokenRejected"): EventFragment; + getEvent(nameOrSignatureOrTopic: "MembershipWithdrawal"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "Membership__ReferralCreated" + ): EventFragment; + getEvent( + nameOrSignatureOrTopic: "Membership__ReferralRemoved" + ): EventFragment; + getEvent( + nameOrSignatureOrTopic: "Membership__ReferralTimeCreated" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleCreated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "SubscriptionUpdate"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Unbanned"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; +} + +export interface ApprovalEventObject { + owner: string; + approved: string; + tokenId: BigNumber; +} +export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], + ApprovalEventObject +>; + +export type ApprovalEventFilter = TypedEventFilter; + +export interface ApprovalForAllEventObject { + owner: string; + operator: string; + approved: boolean; +} +export type ApprovalForAllEvent = TypedEvent< + [string, string, boolean], + ApprovalForAllEventObject +>; + +export type ApprovalForAllEventFilter = TypedEventFilter; + +export interface BannedEventObject { + moderator: string; + tokenId: BigNumber; +} +export type BannedEvent = TypedEvent<[string, BigNumber], BannedEventObject>; + +export type BannedEventFilter = TypedEventFilter; + +export interface ConsecutiveTransferEventObject { + fromTokenId: BigNumber; + toTokenId: BigNumber; + from: string; + to: string; +} +export type ConsecutiveTransferEvent = TypedEvent< + [BigNumber, BigNumber, string, string], + ConsecutiveTransferEventObject +>; + +export type ConsecutiveTransferEventFilter = + TypedEventFilter; + +export interface EntitlementCheckResultPostedEventObject { + transactionId: string; + result: number; +} +export type EntitlementCheckResultPostedEvent = TypedEvent< + [string, number], + EntitlementCheckResultPostedEventObject +>; + +export type EntitlementCheckResultPostedEventFilter = + TypedEventFilter; + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface InterfaceAddedEventObject { + interfaceId: string; +} +export type InterfaceAddedEvent = TypedEvent< + [string], + InterfaceAddedEventObject +>; + +export type InterfaceAddedEventFilter = TypedEventFilter; + +export interface InterfaceRemovedEventObject { + interfaceId: string; +} +export type InterfaceRemovedEvent = TypedEvent< + [string], + InterfaceRemovedEventObject +>; + +export type InterfaceRemovedEventFilter = + TypedEventFilter; + +export interface MembershipCurrencyUpdatedEventObject { + currency: string; +} +export type MembershipCurrencyUpdatedEvent = TypedEvent< + [string], + MembershipCurrencyUpdatedEventObject +>; + +export type MembershipCurrencyUpdatedEventFilter = + TypedEventFilter; + +export interface MembershipFeeRecipientUpdatedEventObject { + recipient: string; +} +export type MembershipFeeRecipientUpdatedEvent = TypedEvent< + [string], + MembershipFeeRecipientUpdatedEventObject +>; + +export type MembershipFeeRecipientUpdatedEventFilter = + TypedEventFilter; + +export interface MembershipFreeAllocationUpdatedEventObject { + allocation: BigNumber; +} +export type MembershipFreeAllocationUpdatedEvent = TypedEvent< + [BigNumber], + MembershipFreeAllocationUpdatedEventObject +>; + +export type MembershipFreeAllocationUpdatedEventFilter = + TypedEventFilter; + +export interface MembershipLimitUpdatedEventObject { + limit: BigNumber; +} +export type MembershipLimitUpdatedEvent = TypedEvent< + [BigNumber], + MembershipLimitUpdatedEventObject +>; + +export type MembershipLimitUpdatedEventFilter = + TypedEventFilter; + +export interface MembershipPriceUpdatedEventObject { + price: BigNumber; +} +export type MembershipPriceUpdatedEvent = TypedEvent< + [BigNumber], + MembershipPriceUpdatedEventObject +>; + +export type MembershipPriceUpdatedEventFilter = + TypedEventFilter; + +export interface MembershipTokenIssuedEventObject { + recipient: string; + tokenId: BigNumber; +} +export type MembershipTokenIssuedEvent = TypedEvent< + [string, BigNumber], + MembershipTokenIssuedEventObject +>; + +export type MembershipTokenIssuedEventFilter = + TypedEventFilter; + +export interface MembershipTokenRejectedEventObject { + recipient: string; +} +export type MembershipTokenRejectedEvent = TypedEvent< + [string], + MembershipTokenRejectedEventObject +>; + +export type MembershipTokenRejectedEventFilter = + TypedEventFilter; + +export interface MembershipWithdrawalEventObject { + recipient: string; + amount: BigNumber; +} +export type MembershipWithdrawalEvent = TypedEvent< + [string, BigNumber], + MembershipWithdrawalEventObject +>; + +export type MembershipWithdrawalEventFilter = + TypedEventFilter; + +export interface Membership__ReferralCreatedEventObject { + code: BigNumber; + bps: number; +} +export type Membership__ReferralCreatedEvent = TypedEvent< + [BigNumber, number], + Membership__ReferralCreatedEventObject +>; + +export type Membership__ReferralCreatedEventFilter = + TypedEventFilter; + +export interface Membership__ReferralRemovedEventObject { + code: BigNumber; +} +export type Membership__ReferralRemovedEvent = TypedEvent< + [BigNumber], + Membership__ReferralRemovedEventObject +>; + +export type Membership__ReferralRemovedEventFilter = + TypedEventFilter; + +export interface Membership__ReferralTimeCreatedEventObject { + code: BigNumber; + bps: number; + startTime: BigNumber; + endTime: BigNumber; +} +export type Membership__ReferralTimeCreatedEvent = TypedEvent< + [BigNumber, number, BigNumber, BigNumber], + Membership__ReferralTimeCreatedEventObject +>; + +export type Membership__ReferralTimeCreatedEventFilter = + TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface PausedEventObject { + account: string; +} +export type PausedEvent = TypedEvent<[string], PausedEventObject>; + +export type PausedEventFilter = TypedEventFilter; + +export interface RoleCreatedEventObject { + creator: string; + roleId: BigNumber; +} +export type RoleCreatedEvent = TypedEvent< + [string, BigNumber], + RoleCreatedEventObject +>; + +export type RoleCreatedEventFilter = TypedEventFilter; + +export interface RoleRemovedEventObject { + remover: string; + roleId: BigNumber; +} +export type RoleRemovedEvent = TypedEvent< + [string, BigNumber], + RoleRemovedEventObject +>; + +export type RoleRemovedEventFilter = TypedEventFilter; + +export interface RoleUpdatedEventObject { + updater: string; + roleId: BigNumber; +} +export type RoleUpdatedEvent = TypedEvent< + [string, BigNumber], + RoleUpdatedEventObject +>; + +export type RoleUpdatedEventFilter = TypedEventFilter; + +export interface SubscriptionUpdateEventObject { + tokenId: BigNumber; + expiration: BigNumber; +} +export type SubscriptionUpdateEvent = TypedEvent< + [BigNumber, BigNumber], + SubscriptionUpdateEventObject +>; + +export type SubscriptionUpdateEventFilter = + TypedEventFilter; + +export interface TransferEventObject { + from: string; + to: string; + tokenId: BigNumber; +} +export type TransferEvent = TypedEvent< + [string, string, BigNumber], + TransferEventObject +>; + +export type TransferEventFilter = TypedEventFilter; + +export interface UnbannedEventObject { + moderator: string; + tokenId: BigNumber; +} +export type UnbannedEvent = TypedEvent< + [string, BigNumber], + UnbannedEventObject +>; + +export type UnbannedEventFilter = TypedEventFilter; + +export interface UnpausedEventObject { + account: string; +} +export type UnpausedEvent = TypedEvent<[string], UnpausedEventObject>; + +export type UnpausedEventFilter = TypedEventFilter; + +export interface MembershipFacet extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: MembershipFacetInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + __Membership_init( + info: IMembershipBase.MembershipStruct, + spaceFactory: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _getMembershipCurrency(overrides?: CallOverrides): Promise<[string]>; + + _getMembershipFreeAllocation( + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + _getMembershipImage(overrides?: CallOverrides): Promise<[string]>; + + _getMembershipPrice( + totalSupply: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + _getMembershipSupplyLimit(overrides?: CallOverrides): Promise<[BigNumber]>; + + _getPricingModule(overrides?: CallOverrides): Promise<[string]>; + + _getSpaceFactory(overrides?: CallOverrides): Promise<[string]>; + + _setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _setMembershipSupplyLimit( + newLimit: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _setPricingModule( + newPricingModule: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + expiresAt( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + getMembershipCurrency(overrides?: CallOverrides): Promise<[string]>; + + getMembershipDuration(overrides?: CallOverrides): Promise<[BigNumber]>; + + getMembershipFreeAllocation( + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getMembershipImage(overrides?: CallOverrides): Promise<[string]>; + + getMembershipLimit(overrides?: CallOverrides): Promise<[BigNumber]>; + + getMembershipPrice(overrides?: CallOverrides): Promise<[BigNumber]>; + + getMembershipPricingModule(overrides?: CallOverrides): Promise<[string]>; + + getMembershipRenewalPrice( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getRuleData( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[IRuleEntitlement.RuleDataStructOutput]>; + + getSpaceFactory(overrides?: CallOverrides): Promise<[string]>; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + joinSpace( + receiver: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + joinSpaceWithReferral( + receiver: PromiseOrValue, + referrer: PromiseOrValue, + referralCode: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise<[string]>; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + renewMembership( + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipImage( + newImage: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipLimit( + newLimit: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipPrice( + newPrice: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipPricingModule( + pricingModule: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + symbol(overrides?: CallOverrides): Promise<[string]>; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + withdraw( + account: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + __Membership_init( + info: IMembershipBase.MembershipStruct, + spaceFactory: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _getMembershipCurrency(overrides?: CallOverrides): Promise; + + _getMembershipFreeAllocation(overrides?: CallOverrides): Promise; + + _getMembershipImage(overrides?: CallOverrides): Promise; + + _getMembershipPrice( + totalSupply: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + _getMembershipSupplyLimit(overrides?: CallOverrides): Promise; + + _getPricingModule(overrides?: CallOverrides): Promise; + + _getSpaceFactory(overrides?: CallOverrides): Promise; + + _setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _setMembershipSupplyLimit( + newLimit: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _setPricingModule( + newPricingModule: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + expiresAt( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getMembershipCurrency(overrides?: CallOverrides): Promise; + + getMembershipDuration(overrides?: CallOverrides): Promise; + + getMembershipFreeAllocation(overrides?: CallOverrides): Promise; + + getMembershipImage(overrides?: CallOverrides): Promise; + + getMembershipLimit(overrides?: CallOverrides): Promise; + + getMembershipPrice(overrides?: CallOverrides): Promise; + + getMembershipPricingModule(overrides?: CallOverrides): Promise; + + getMembershipRenewalPrice( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRuleData( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getSpaceFactory(overrides?: CallOverrides): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + joinSpace( + receiver: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + joinSpaceWithReferral( + receiver: PromiseOrValue, + referrer: PromiseOrValue, + referralCode: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + renewMembership( + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipImage( + newImage: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipLimit( + newLimit: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipPrice( + newPrice: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipPricingModule( + pricingModule: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + withdraw( + account: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + __Membership_init( + info: IMembershipBase.MembershipStruct, + spaceFactory: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + _getMembershipCurrency(overrides?: CallOverrides): Promise; + + _getMembershipFreeAllocation(overrides?: CallOverrides): Promise; + + _getMembershipImage(overrides?: CallOverrides): Promise; + + _getMembershipPrice( + totalSupply: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + _getMembershipSupplyLimit(overrides?: CallOverrides): Promise; + + _getPricingModule(overrides?: CallOverrides): Promise; + + _getSpaceFactory(overrides?: CallOverrides): Promise; + + _setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + _setMembershipSupplyLimit( + newLimit: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + _setPricingModule( + newPricingModule: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + expiresAt( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getMembershipCurrency(overrides?: CallOverrides): Promise; + + getMembershipDuration(overrides?: CallOverrides): Promise; + + getMembershipFreeAllocation(overrides?: CallOverrides): Promise; + + getMembershipImage(overrides?: CallOverrides): Promise; + + getMembershipLimit(overrides?: CallOverrides): Promise; + + getMembershipPrice(overrides?: CallOverrides): Promise; + + getMembershipPricingModule(overrides?: CallOverrides): Promise; + + getMembershipRenewalPrice( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRuleData( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getSpaceFactory(overrides?: CallOverrides): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + joinSpace( + receiver: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + joinSpaceWithReferral( + receiver: PromiseOrValue, + referrer: PromiseOrValue, + referralCode: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + name(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + renewMembership( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setMembershipImage( + newImage: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setMembershipLimit( + newLimit: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setMembershipPrice( + newPrice: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setMembershipPricingModule( + pricingModule: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + withdraw( + account: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Approval(address,address,uint256)"( + owner?: PromiseOrValue | null, + approved?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): ApprovalEventFilter; + Approval( + owner?: PromiseOrValue | null, + approved?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): ApprovalEventFilter; + + "ApprovalForAll(address,address,bool)"( + owner?: PromiseOrValue | null, + operator?: PromiseOrValue | null, + approved?: null + ): ApprovalForAllEventFilter; + ApprovalForAll( + owner?: PromiseOrValue | null, + operator?: PromiseOrValue | null, + approved?: null + ): ApprovalForAllEventFilter; + + "Banned(address,uint256)"( + moderator?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): BannedEventFilter; + Banned( + moderator?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): BannedEventFilter; + + "ConsecutiveTransfer(uint256,uint256,address,address)"( + fromTokenId?: PromiseOrValue | null, + toTokenId?: null, + from?: PromiseOrValue | null, + to?: PromiseOrValue | null + ): ConsecutiveTransferEventFilter; + ConsecutiveTransfer( + fromTokenId?: PromiseOrValue | null, + toTokenId?: null, + from?: PromiseOrValue | null, + to?: PromiseOrValue | null + ): ConsecutiveTransferEventFilter; + + "EntitlementCheckResultPosted(bytes32,uint8)"( + transactionId?: PromiseOrValue | null, + result?: null + ): EntitlementCheckResultPostedEventFilter; + EntitlementCheckResultPosted( + transactionId?: PromiseOrValue | null, + result?: null + ): EntitlementCheckResultPostedEventFilter; + + "Initialized(uint32)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "InterfaceAdded(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + InterfaceAdded( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + + "InterfaceRemoved(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + InterfaceRemoved( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + + "MembershipCurrencyUpdated(address)"( + currency?: PromiseOrValue | null + ): MembershipCurrencyUpdatedEventFilter; + MembershipCurrencyUpdated( + currency?: PromiseOrValue | null + ): MembershipCurrencyUpdatedEventFilter; + + "MembershipFeeRecipientUpdated(address)"( + recipient?: PromiseOrValue | null + ): MembershipFeeRecipientUpdatedEventFilter; + MembershipFeeRecipientUpdated( + recipient?: PromiseOrValue | null + ): MembershipFeeRecipientUpdatedEventFilter; + + "MembershipFreeAllocationUpdated(uint256)"( + allocation?: PromiseOrValue | null + ): MembershipFreeAllocationUpdatedEventFilter; + MembershipFreeAllocationUpdated( + allocation?: PromiseOrValue | null + ): MembershipFreeAllocationUpdatedEventFilter; + + "MembershipLimitUpdated(uint256)"( + limit?: PromiseOrValue | null + ): MembershipLimitUpdatedEventFilter; + MembershipLimitUpdated( + limit?: PromiseOrValue | null + ): MembershipLimitUpdatedEventFilter; + + "MembershipPriceUpdated(uint256)"( + price?: PromiseOrValue | null + ): MembershipPriceUpdatedEventFilter; + MembershipPriceUpdated( + price?: PromiseOrValue | null + ): MembershipPriceUpdatedEventFilter; + + "MembershipTokenIssued(address,uint256)"( + recipient?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): MembershipTokenIssuedEventFilter; + MembershipTokenIssued( + recipient?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): MembershipTokenIssuedEventFilter; + + "MembershipTokenRejected(address)"( + recipient?: PromiseOrValue | null + ): MembershipTokenRejectedEventFilter; + MembershipTokenRejected( + recipient?: PromiseOrValue | null + ): MembershipTokenRejectedEventFilter; + + "MembershipWithdrawal(address,uint256)"( + recipient?: PromiseOrValue | null, + amount?: null + ): MembershipWithdrawalEventFilter; + MembershipWithdrawal( + recipient?: PromiseOrValue | null, + amount?: null + ): MembershipWithdrawalEventFilter; + + "Membership__ReferralCreated(uint256,uint16)"( + code?: PromiseOrValue | null, + bps?: null + ): Membership__ReferralCreatedEventFilter; + Membership__ReferralCreated( + code?: PromiseOrValue | null, + bps?: null + ): Membership__ReferralCreatedEventFilter; + + "Membership__ReferralRemoved(uint256)"( + code?: PromiseOrValue | null + ): Membership__ReferralRemovedEventFilter; + Membership__ReferralRemoved( + code?: PromiseOrValue | null + ): Membership__ReferralRemovedEventFilter; + + "Membership__ReferralTimeCreated(uint256,uint16,uint256,uint256)"( + code?: PromiseOrValue | null, + bps?: null, + startTime?: null, + endTime?: null + ): Membership__ReferralTimeCreatedEventFilter; + Membership__ReferralTimeCreated( + code?: PromiseOrValue | null, + bps?: null, + startTime?: null, + endTime?: null + ): Membership__ReferralTimeCreatedEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: PromiseOrValue | null, + newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: PromiseOrValue | null, + newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + + "Paused(address)"(account?: null): PausedEventFilter; + Paused(account?: null): PausedEventFilter; + + "RoleCreated(address,uint256)"( + creator?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleCreatedEventFilter; + RoleCreated( + creator?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleCreatedEventFilter; + + "RoleRemoved(address,uint256)"( + remover?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleRemovedEventFilter; + RoleRemoved( + remover?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleRemovedEventFilter; + + "RoleUpdated(address,uint256)"( + updater?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleUpdatedEventFilter; + RoleUpdated( + updater?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleUpdatedEventFilter; + + "SubscriptionUpdate(uint256,uint64)"( + tokenId?: PromiseOrValue | null, + expiration?: null + ): SubscriptionUpdateEventFilter; + SubscriptionUpdate( + tokenId?: PromiseOrValue | null, + expiration?: null + ): SubscriptionUpdateEventFilter; + + "Transfer(address,address,uint256)"( + from?: PromiseOrValue | null, + to?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): TransferEventFilter; + Transfer( + from?: PromiseOrValue | null, + to?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): TransferEventFilter; + + "Unbanned(address,uint256)"( + moderator?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): UnbannedEventFilter; + Unbanned( + moderator?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): UnbannedEventFilter; + + "Unpaused(address)"(account?: null): UnpausedEventFilter; + Unpaused(account?: null): UnpausedEventFilter; + }; + + estimateGas: { + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + __Membership_init( + info: IMembershipBase.MembershipStruct, + spaceFactory: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _getMembershipCurrency(overrides?: CallOverrides): Promise; + + _getMembershipFreeAllocation(overrides?: CallOverrides): Promise; + + _getMembershipImage(overrides?: CallOverrides): Promise; + + _getMembershipPrice( + totalSupply: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + _getMembershipSupplyLimit(overrides?: CallOverrides): Promise; + + _getPricingModule(overrides?: CallOverrides): Promise; + + _getSpaceFactory(overrides?: CallOverrides): Promise; + + _setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _setMembershipSupplyLimit( + newLimit: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _setPricingModule( + newPricingModule: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + expiresAt( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getMembershipCurrency(overrides?: CallOverrides): Promise; + + getMembershipDuration(overrides?: CallOverrides): Promise; + + getMembershipFreeAllocation(overrides?: CallOverrides): Promise; + + getMembershipImage(overrides?: CallOverrides): Promise; + + getMembershipLimit(overrides?: CallOverrides): Promise; + + getMembershipPrice(overrides?: CallOverrides): Promise; + + getMembershipPricingModule(overrides?: CallOverrides): Promise; + + getMembershipRenewalPrice( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRuleData( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getSpaceFactory(overrides?: CallOverrides): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + joinSpace( + receiver: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + joinSpaceWithReferral( + receiver: PromiseOrValue, + referrer: PromiseOrValue, + referralCode: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + renewMembership( + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipImage( + newImage: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipLimit( + newLimit: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipPrice( + newPrice: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipPricingModule( + pricingModule: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + withdraw( + account: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + __Membership_init( + info: IMembershipBase.MembershipStruct, + spaceFactory: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _getMembershipCurrency( + overrides?: CallOverrides + ): Promise; + + _getMembershipFreeAllocation( + overrides?: CallOverrides + ): Promise; + + _getMembershipImage( + overrides?: CallOverrides + ): Promise; + + _getMembershipPrice( + totalSupply: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + _getMembershipSupplyLimit( + overrides?: CallOverrides + ): Promise; + + _getPricingModule(overrides?: CallOverrides): Promise; + + _getSpaceFactory(overrides?: CallOverrides): Promise; + + _setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _setMembershipSupplyLimit( + newLimit: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _setPricingModule( + newPricingModule: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + expiresAt( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getMembershipCurrency( + overrides?: CallOverrides + ): Promise; + + getMembershipDuration( + overrides?: CallOverrides + ): Promise; + + getMembershipFreeAllocation( + overrides?: CallOverrides + ): Promise; + + getMembershipImage( + overrides?: CallOverrides + ): Promise; + + getMembershipLimit( + overrides?: CallOverrides + ): Promise; + + getMembershipPrice( + overrides?: CallOverrides + ): Promise; + + getMembershipPricingModule( + overrides?: CallOverrides + ): Promise; + + getMembershipRenewalPrice( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRuleData( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getSpaceFactory(overrides?: CallOverrides): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + joinSpace( + receiver: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + joinSpaceWithReferral( + receiver: PromiseOrValue, + referrer: PromiseOrValue, + referralCode: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + renewMembership( + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipImage( + newImage: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipLimit( + newLimit: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipPrice( + newPrice: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipPricingModule( + pricingModule: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + withdraw( + account: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/MockERC721A.ts b/packages/generated/dev/typings/MockERC721A.ts new file mode 100644 index 000000000..b26c62b5a --- /dev/null +++ b/packages/generated/dev/typings/MockERC721A.ts @@ -0,0 +1,826 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PayableOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface MockERC721AInterface extends utils.Interface { + functions: { + "__ERC721A_init(string,string)": FunctionFragment; + "approve(address,uint256)": FunctionFragment; + "balanceOf(address)": FunctionFragment; + "burn(uint256)": FunctionFragment; + "getApproved(uint256)": FunctionFragment; + "isApprovedForAll(address,address)": FunctionFragment; + "mint(address,uint256)": FunctionFragment; + "mintTo(address)": FunctionFragment; + "name()": FunctionFragment; + "ownerOf(uint256)": FunctionFragment; + "safeTransferFrom(address,address,uint256)": FunctionFragment; + "safeTransferFrom(address,address,uint256,bytes)": FunctionFragment; + "setApprovalForAll(address,bool)": FunctionFragment; + "symbol()": FunctionFragment; + "tokenURI(uint256)": FunctionFragment; + "totalSupply()": FunctionFragment; + "transferFrom(address,address,uint256)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "__ERC721A_init" + | "approve" + | "balanceOf" + | "burn" + | "getApproved" + | "isApprovedForAll" + | "mint" + | "mintTo" + | "name" + | "ownerOf" + | "safeTransferFrom(address,address,uint256)" + | "safeTransferFrom(address,address,uint256,bytes)" + | "setApprovalForAll" + | "symbol" + | "tokenURI" + | "totalSupply" + | "transferFrom" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "__ERC721A_init", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "approve", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "balanceOf", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "burn", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getApproved", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "isApprovedForAll", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "mint", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "mintTo", + values: [PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData( + functionFragment: "ownerOf", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "safeTransferFrom(address,address,uint256)", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "safeTransferFrom(address,address,uint256,bytes)", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "setApprovalForAll", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "symbol", values?: undefined): string; + encodeFunctionData( + functionFragment: "tokenURI", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "totalSupply", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transferFrom", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + + decodeFunctionResult( + functionFragment: "__ERC721A_init", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "burn", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getApproved", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isApprovedForAll", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "mint", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "mintTo", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "ownerOf", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "safeTransferFrom(address,address,uint256)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "safeTransferFrom(address,address,uint256,bytes)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setApprovalForAll", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "tokenURI", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "totalSupply", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferFrom", + data: BytesLike + ): Result; + + events: { + "Approval(address,address,uint256)": EventFragment; + "ApprovalForAll(address,address,bool)": EventFragment; + "ConsecutiveTransfer(uint256,uint256,address,address)": EventFragment; + "Initialized(uint32)": EventFragment; + "InterfaceAdded(bytes4)": EventFragment; + "InterfaceRemoved(bytes4)": EventFragment; + "Transfer(address,address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ApprovalForAll"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ConsecutiveTransfer"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; +} + +export interface ApprovalEventObject { + owner: string; + approved: string; + tokenId: BigNumber; +} +export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], + ApprovalEventObject +>; + +export type ApprovalEventFilter = TypedEventFilter; + +export interface ApprovalForAllEventObject { + owner: string; + operator: string; + approved: boolean; +} +export type ApprovalForAllEvent = TypedEvent< + [string, string, boolean], + ApprovalForAllEventObject +>; + +export type ApprovalForAllEventFilter = TypedEventFilter; + +export interface ConsecutiveTransferEventObject { + fromTokenId: BigNumber; + toTokenId: BigNumber; + from: string; + to: string; +} +export type ConsecutiveTransferEvent = TypedEvent< + [BigNumber, BigNumber, string, string], + ConsecutiveTransferEventObject +>; + +export type ConsecutiveTransferEventFilter = + TypedEventFilter; + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface InterfaceAddedEventObject { + interfaceId: string; +} +export type InterfaceAddedEvent = TypedEvent< + [string], + InterfaceAddedEventObject +>; + +export type InterfaceAddedEventFilter = TypedEventFilter; + +export interface InterfaceRemovedEventObject { + interfaceId: string; +} +export type InterfaceRemovedEvent = TypedEvent< + [string], + InterfaceRemovedEventObject +>; + +export type InterfaceRemovedEventFilter = + TypedEventFilter; + +export interface TransferEventObject { + from: string; + to: string; + tokenId: BigNumber; +} +export type TransferEvent = TypedEvent< + [string, string, BigNumber], + TransferEventObject +>; + +export type TransferEventFilter = TypedEventFilter; + +export interface MockERC721A extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: MockERC721AInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + burn( + token: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + mint( + to: PromiseOrValue, + amount: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + mintTo( + to: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise<[string]>; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + symbol(overrides?: CallOverrides): Promise<[string]>; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + }; + + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + burn( + token: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + mint( + to: PromiseOrValue, + amount: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + mintTo( + to: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + burn( + token: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + mint( + to: PromiseOrValue, + amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + mintTo( + to: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + name(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Approval(address,address,uint256)"( + owner?: PromiseOrValue | null, + approved?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): ApprovalEventFilter; + Approval( + owner?: PromiseOrValue | null, + approved?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): ApprovalEventFilter; + + "ApprovalForAll(address,address,bool)"( + owner?: PromiseOrValue | null, + operator?: PromiseOrValue | null, + approved?: null + ): ApprovalForAllEventFilter; + ApprovalForAll( + owner?: PromiseOrValue | null, + operator?: PromiseOrValue | null, + approved?: null + ): ApprovalForAllEventFilter; + + "ConsecutiveTransfer(uint256,uint256,address,address)"( + fromTokenId?: PromiseOrValue | null, + toTokenId?: null, + from?: PromiseOrValue | null, + to?: PromiseOrValue | null + ): ConsecutiveTransferEventFilter; + ConsecutiveTransfer( + fromTokenId?: PromiseOrValue | null, + toTokenId?: null, + from?: PromiseOrValue | null, + to?: PromiseOrValue | null + ): ConsecutiveTransferEventFilter; + + "Initialized(uint32)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "InterfaceAdded(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + InterfaceAdded( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + + "InterfaceRemoved(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + InterfaceRemoved( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + + "Transfer(address,address,uint256)"( + from?: PromiseOrValue | null, + to?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): TransferEventFilter; + Transfer( + from?: PromiseOrValue | null, + to?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): TransferEventFilter; + }; + + estimateGas: { + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + burn( + token: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + mint( + to: PromiseOrValue, + amount: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + mintTo( + to: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + burn( + token: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + mint( + to: PromiseOrValue, + amount: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + mintTo( + to: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/MockEntitlementGated.ts b/packages/generated/dev/typings/MockEntitlementGated.ts new file mode 100644 index 000000000..88063bf5c --- /dev/null +++ b/packages/generated/dev/typings/MockEntitlementGated.ts @@ -0,0 +1,414 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IRuleEntitlement { + export type OperationStruct = { + opType: PromiseOrValue; + index: PromiseOrValue; + }; + + export type OperationStructOutput = [number, number] & { + opType: number; + index: number; + }; + + export type CheckOperationStruct = { + opType: PromiseOrValue; + chainId: PromiseOrValue; + contractAddress: PromiseOrValue; + threshold: PromiseOrValue; + }; + + export type CheckOperationStructOutput = [ + number, + BigNumber, + string, + BigNumber + ] & { + opType: number; + chainId: BigNumber; + contractAddress: string; + threshold: BigNumber; + }; + + export type LogicalOperationStruct = { + logOpType: PromiseOrValue; + leftOperationIndex: PromiseOrValue; + rightOperationIndex: PromiseOrValue; + }; + + export type LogicalOperationStructOutput = [number, number, number] & { + logOpType: number; + leftOperationIndex: number; + rightOperationIndex: number; + }; + + export type RuleDataStruct = { + operations: IRuleEntitlement.OperationStruct[]; + checkOperations: IRuleEntitlement.CheckOperationStruct[]; + logicalOperations: IRuleEntitlement.LogicalOperationStruct[]; + }; + + export type RuleDataStructOutput = [ + IRuleEntitlement.OperationStructOutput[], + IRuleEntitlement.CheckOperationStructOutput[], + IRuleEntitlement.LogicalOperationStructOutput[] + ] & { + operations: IRuleEntitlement.OperationStructOutput[]; + checkOperations: IRuleEntitlement.CheckOperationStructOutput[]; + logicalOperations: IRuleEntitlement.LogicalOperationStructOutput[]; + }; +} + +export interface MockEntitlementGatedInterface extends utils.Interface { + functions: { + "__EntitlementGated_init(address)": FunctionFragment; + "getRuleData(uint256)": FunctionFragment; + "getRuleData(bytes32,uint256)": FunctionFragment; + "postEntitlementCheckResult(bytes32,uint256,uint8)": FunctionFragment; + "requestEntitlementCheck(uint256,((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]))": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "__EntitlementGated_init" + | "getRuleData(uint256)" + | "getRuleData(bytes32,uint256)" + | "postEntitlementCheckResult" + | "requestEntitlementCheck" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "__EntitlementGated_init", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getRuleData(uint256)", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getRuleData(bytes32,uint256)", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "postEntitlementCheckResult", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "requestEntitlementCheck", + values: [PromiseOrValue, IRuleEntitlement.RuleDataStruct] + ): string; + + decodeFunctionResult( + functionFragment: "__EntitlementGated_init", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRuleData(uint256)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRuleData(bytes32,uint256)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "postEntitlementCheckResult", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "requestEntitlementCheck", + data: BytesLike + ): Result; + + events: { + "EntitlementCheckResultPosted(bytes32,uint8)": EventFragment; + "Initialized(uint32)": EventFragment; + "InterfaceAdded(bytes4)": EventFragment; + "InterfaceRemoved(bytes4)": EventFragment; + }; + + getEvent( + nameOrSignatureOrTopic: "EntitlementCheckResultPosted" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceRemoved"): EventFragment; +} + +export interface EntitlementCheckResultPostedEventObject { + transactionId: string; + result: number; +} +export type EntitlementCheckResultPostedEvent = TypedEvent< + [string, number], + EntitlementCheckResultPostedEventObject +>; + +export type EntitlementCheckResultPostedEventFilter = + TypedEventFilter; + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface InterfaceAddedEventObject { + interfaceId: string; +} +export type InterfaceAddedEvent = TypedEvent< + [string], + InterfaceAddedEventObject +>; + +export type InterfaceAddedEventFilter = TypedEventFilter; + +export interface InterfaceRemovedEventObject { + interfaceId: string; +} +export type InterfaceRemovedEvent = TypedEvent< + [string], + InterfaceRemovedEventObject +>; + +export type InterfaceRemovedEventFilter = + TypedEventFilter; + +export interface MockEntitlementGated extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: MockEntitlementGatedInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "getRuleData(uint256)"( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[IRuleEntitlement.RuleDataStructOutput]>; + + "getRuleData(bytes32,uint256)"( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[IRuleEntitlement.RuleDataStructOutput]>; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + requestEntitlementCheck( + roleId: PromiseOrValue, + ruleData: IRuleEntitlement.RuleDataStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "getRuleData(uint256)"( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "getRuleData(bytes32,uint256)"( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + requestEntitlementCheck( + roleId: PromiseOrValue, + ruleData: IRuleEntitlement.RuleDataStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "getRuleData(uint256)"( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "getRuleData(bytes32,uint256)"( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + requestEntitlementCheck( + roleId: PromiseOrValue, + ruleData: IRuleEntitlement.RuleDataStruct, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "EntitlementCheckResultPosted(bytes32,uint8)"( + transactionId?: PromiseOrValue | null, + result?: null + ): EntitlementCheckResultPostedEventFilter; + EntitlementCheckResultPosted( + transactionId?: PromiseOrValue | null, + result?: null + ): EntitlementCheckResultPostedEventFilter; + + "Initialized(uint32)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "InterfaceAdded(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + InterfaceAdded( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + + "InterfaceRemoved(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + InterfaceRemoved( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + }; + + estimateGas: { + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "getRuleData(uint256)"( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "getRuleData(bytes32,uint256)"( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + requestEntitlementCheck( + roleId: PromiseOrValue, + ruleData: IRuleEntitlement.RuleDataStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "getRuleData(uint256)"( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "getRuleData(bytes32,uint256)"( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + requestEntitlementCheck( + roleId: PromiseOrValue, + ruleData: IRuleEntitlement.RuleDataStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/OwnableFacet.ts b/packages/generated/dev/typings/OwnableFacet.ts new file mode 100644 index 000000000..07f706d96 --- /dev/null +++ b/packages/generated/dev/typings/OwnableFacet.ts @@ -0,0 +1,234 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface OwnableFacetInterface extends utils.Interface { + functions: { + "__Ownable_init(address)": FunctionFragment; + "owner()": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: "__Ownable_init" | "owner" | "transferOwnership" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "__Ownable_init", + values: [PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "__Ownable_init", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + + events: { + "Initialized(uint32)": EventFragment; + "InterfaceAdded(bytes4)": EventFragment; + "InterfaceRemoved(bytes4)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; +} + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface InterfaceAddedEventObject { + interfaceId: string; +} +export type InterfaceAddedEvent = TypedEvent< + [string], + InterfaceAddedEventObject +>; + +export type InterfaceAddedEventFilter = TypedEventFilter; + +export interface InterfaceRemovedEventObject { + interfaceId: string; +} +export type InterfaceRemovedEvent = TypedEvent< + [string], + InterfaceRemovedEventObject +>; + +export type InterfaceRemovedEventFilter = + TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface OwnableFacet extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: OwnableFacetInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + __Ownable_init( + owner_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + owner(overrides?: CallOverrides): Promise<[string]>; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + __Ownable_init( + owner_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + __Ownable_init( + owner_: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Initialized(uint32)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "InterfaceAdded(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + InterfaceAdded( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + + "InterfaceRemoved(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + InterfaceRemoved( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: PromiseOrValue | null, + newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: PromiseOrValue | null, + newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + }; + + estimateGas: { + __Ownable_init( + owner_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + __Ownable_init( + owner_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/PrepayFacet.ts b/packages/generated/dev/typings/PrepayFacet.ts new file mode 100644 index 000000000..fe1235994 --- /dev/null +++ b/packages/generated/dev/typings/PrepayFacet.ts @@ -0,0 +1,393 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PayableOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface PrepayFacetInterface extends utils.Interface { + functions: { + "__PrepayFacet_init()": FunctionFragment; + "calculateMembershipPrepayFee(uint256)": FunctionFragment; + "prepaidMembershipSupply(address)": FunctionFragment; + "prepayMembership(address,uint256)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "__PrepayFacet_init" + | "calculateMembershipPrepayFee" + | "prepaidMembershipSupply" + | "prepayMembership" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "__PrepayFacet_init", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "calculateMembershipPrepayFee", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "prepaidMembershipSupply", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "prepayMembership", + values: [PromiseOrValue, PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "__PrepayFacet_init", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "calculateMembershipPrepayFee", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "prepaidMembershipSupply", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "prepayMembership", + data: BytesLike + ): Result; + + events: { + "Initialized(uint32)": EventFragment; + "InterfaceAdded(bytes4)": EventFragment; + "InterfaceRemoved(bytes4)": EventFragment; + "PlatformFeeRecipientSet(address)": EventFragment; + "PlatformMembershipBpsSet(uint16)": EventFragment; + "PlatformMembershipDurationSet(uint256)": EventFragment; + "PlatformMembershipFeeSet(uint256)": EventFragment; + "PlatformMembershipMintLimitSet(uint256)": EventFragment; + "PrepayBase__Prepaid(address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "PlatformFeeRecipientSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "PlatformMembershipBpsSet"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "PlatformMembershipDurationSet" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "PlatformMembershipFeeSet"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "PlatformMembershipMintLimitSet" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "PrepayBase__Prepaid"): EventFragment; +} + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface InterfaceAddedEventObject { + interfaceId: string; +} +export type InterfaceAddedEvent = TypedEvent< + [string], + InterfaceAddedEventObject +>; + +export type InterfaceAddedEventFilter = TypedEventFilter; + +export interface InterfaceRemovedEventObject { + interfaceId: string; +} +export type InterfaceRemovedEvent = TypedEvent< + [string], + InterfaceRemovedEventObject +>; + +export type InterfaceRemovedEventFilter = + TypedEventFilter; + +export interface PlatformFeeRecipientSetEventObject { + recipient: string; +} +export type PlatformFeeRecipientSetEvent = TypedEvent< + [string], + PlatformFeeRecipientSetEventObject +>; + +export type PlatformFeeRecipientSetEventFilter = + TypedEventFilter; + +export interface PlatformMembershipBpsSetEventObject { + bps: number; +} +export type PlatformMembershipBpsSetEvent = TypedEvent< + [number], + PlatformMembershipBpsSetEventObject +>; + +export type PlatformMembershipBpsSetEventFilter = + TypedEventFilter; + +export interface PlatformMembershipDurationSetEventObject { + duration: BigNumber; +} +export type PlatformMembershipDurationSetEvent = TypedEvent< + [BigNumber], + PlatformMembershipDurationSetEventObject +>; + +export type PlatformMembershipDurationSetEventFilter = + TypedEventFilter; + +export interface PlatformMembershipFeeSetEventObject { + fee: BigNumber; +} +export type PlatformMembershipFeeSetEvent = TypedEvent< + [BigNumber], + PlatformMembershipFeeSetEventObject +>; + +export type PlatformMembershipFeeSetEventFilter = + TypedEventFilter; + +export interface PlatformMembershipMintLimitSetEventObject { + limit: BigNumber; +} +export type PlatformMembershipMintLimitSetEvent = TypedEvent< + [BigNumber], + PlatformMembershipMintLimitSetEventObject +>; + +export type PlatformMembershipMintLimitSetEventFilter = + TypedEventFilter; + +export interface PrepayBase__PrepaidEventObject { + membership: string; + supply: BigNumber; +} +export type PrepayBase__PrepaidEvent = TypedEvent< + [string, BigNumber], + PrepayBase__PrepaidEventObject +>; + +export type PrepayBase__PrepaidEventFilter = + TypedEventFilter; + +export interface PrepayFacet extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: PrepayFacetInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + __PrepayFacet_init( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + calculateMembershipPrepayFee( + supply: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + prepaidMembershipSupply( + account: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + prepayMembership( + membership: PromiseOrValue, + supply: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + }; + + __PrepayFacet_init( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + calculateMembershipPrepayFee( + supply: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + prepaidMembershipSupply( + account: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + prepayMembership( + membership: PromiseOrValue, + supply: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + __PrepayFacet_init(overrides?: CallOverrides): Promise; + + calculateMembershipPrepayFee( + supply: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + prepaidMembershipSupply( + account: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + prepayMembership( + membership: PromiseOrValue, + supply: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Initialized(uint32)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "InterfaceAdded(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + InterfaceAdded( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + + "InterfaceRemoved(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + InterfaceRemoved( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + + "PlatformFeeRecipientSet(address)"( + recipient?: PromiseOrValue | null + ): PlatformFeeRecipientSetEventFilter; + PlatformFeeRecipientSet( + recipient?: PromiseOrValue | null + ): PlatformFeeRecipientSetEventFilter; + + "PlatformMembershipBpsSet(uint16)"( + bps?: null + ): PlatformMembershipBpsSetEventFilter; + PlatformMembershipBpsSet(bps?: null): PlatformMembershipBpsSetEventFilter; + + "PlatformMembershipDurationSet(uint256)"( + duration?: null + ): PlatformMembershipDurationSetEventFilter; + PlatformMembershipDurationSet( + duration?: null + ): PlatformMembershipDurationSetEventFilter; + + "PlatformMembershipFeeSet(uint256)"( + fee?: null + ): PlatformMembershipFeeSetEventFilter; + PlatformMembershipFeeSet(fee?: null): PlatformMembershipFeeSetEventFilter; + + "PlatformMembershipMintLimitSet(uint256)"( + limit?: null + ): PlatformMembershipMintLimitSetEventFilter; + PlatformMembershipMintLimitSet( + limit?: null + ): PlatformMembershipMintLimitSetEventFilter; + + "PrepayBase__Prepaid(address,uint256)"( + membership?: PromiseOrValue | null, + supply?: null + ): PrepayBase__PrepaidEventFilter; + PrepayBase__Prepaid( + membership?: PromiseOrValue | null, + supply?: null + ): PrepayBase__PrepaidEventFilter; + }; + + estimateGas: { + __PrepayFacet_init( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + calculateMembershipPrepayFee( + supply: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + prepaidMembershipSupply( + account: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + prepayMembership( + membership: PromiseOrValue, + supply: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + __PrepayFacet_init( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + calculateMembershipPrepayFee( + supply: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + prepaidMembershipSupply( + account: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + prepayMembership( + membership: PromiseOrValue, + supply: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/TokenPausableFacet.ts b/packages/generated/dev/typings/TokenPausableFacet.ts new file mode 100644 index 000000000..8033d3fd3 --- /dev/null +++ b/packages/generated/dev/typings/TokenPausableFacet.ts @@ -0,0 +1,259 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface TokenPausableFacetInterface extends utils.Interface { + functions: { + "__Pausable_init()": FunctionFragment; + "pause()": FunctionFragment; + "paused()": FunctionFragment; + "unpause()": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: "__Pausable_init" | "pause" | "paused" | "unpause" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "__Pausable_init", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "pause", values?: undefined): string; + encodeFunctionData(functionFragment: "paused", values?: undefined): string; + encodeFunctionData(functionFragment: "unpause", values?: undefined): string; + + decodeFunctionResult( + functionFragment: "__Pausable_init", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "pause", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "paused", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "unpause", data: BytesLike): Result; + + events: { + "Initialized(uint32)": EventFragment; + "InterfaceAdded(bytes4)": EventFragment; + "InterfaceRemoved(bytes4)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "Paused(address)": EventFragment; + "Unpaused(address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; +} + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface InterfaceAddedEventObject { + interfaceId: string; +} +export type InterfaceAddedEvent = TypedEvent< + [string], + InterfaceAddedEventObject +>; + +export type InterfaceAddedEventFilter = TypedEventFilter; + +export interface InterfaceRemovedEventObject { + interfaceId: string; +} +export type InterfaceRemovedEvent = TypedEvent< + [string], + InterfaceRemovedEventObject +>; + +export type InterfaceRemovedEventFilter = + TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface PausedEventObject { + account: string; +} +export type PausedEvent = TypedEvent<[string], PausedEventObject>; + +export type PausedEventFilter = TypedEventFilter; + +export interface UnpausedEventObject { + account: string; +} +export type UnpausedEvent = TypedEvent<[string], UnpausedEventObject>; + +export type UnpausedEventFilter = TypedEventFilter; + +export interface TokenPausableFacet extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: TokenPausableFacetInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + __Pausable_init( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + pause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + paused(overrides?: CallOverrides): Promise<[boolean]>; + + unpause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + __Pausable_init( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + pause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + paused(overrides?: CallOverrides): Promise; + + unpause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + __Pausable_init(overrides?: CallOverrides): Promise; + + pause(overrides?: CallOverrides): Promise; + + paused(overrides?: CallOverrides): Promise; + + unpause(overrides?: CallOverrides): Promise; + }; + + filters: { + "Initialized(uint32)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "InterfaceAdded(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + InterfaceAdded( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + + "InterfaceRemoved(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + InterfaceRemoved( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: PromiseOrValue | null, + newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: PromiseOrValue | null, + newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + + "Paused(address)"(account?: null): PausedEventFilter; + Paused(account?: null): PausedEventFilter; + + "Unpaused(address)"(account?: null): UnpausedEventFilter; + Unpaused(account?: null): UnpausedEventFilter; + }; + + estimateGas: { + __Pausable_init( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + pause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + paused(overrides?: CallOverrides): Promise; + + unpause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + __Pausable_init( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + pause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + paused(overrides?: CallOverrides): Promise; + + unpause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/UserEntitlement.ts b/packages/generated/dev/typings/UserEntitlement.ts new file mode 100644 index 000000000..6939e1d61 --- /dev/null +++ b/packages/generated/dev/typings/UserEntitlement.ts @@ -0,0 +1,505 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PayableOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface UserEntitlementInterface extends utils.Interface { + functions: { + "SPACE_ADDRESS()": FunctionFragment; + "UPGRADE_INTERFACE_VERSION()": FunctionFragment; + "description()": FunctionFragment; + "getEntitlementDataByRoleId(uint256)": FunctionFragment; + "initialize(address)": FunctionFragment; + "isCrosschain()": FunctionFragment; + "isEntitled(bytes32,address[],bytes32)": FunctionFragment; + "moduleType()": FunctionFragment; + "name()": FunctionFragment; + "proxiableUUID()": FunctionFragment; + "removeEntitlement(uint256)": FunctionFragment; + "setEntitlement(uint256,bytes)": FunctionFragment; + "supportsInterface(bytes4)": FunctionFragment; + "upgradeToAndCall(address,bytes)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "SPACE_ADDRESS" + | "UPGRADE_INTERFACE_VERSION" + | "description" + | "getEntitlementDataByRoleId" + | "initialize" + | "isCrosschain" + | "isEntitled" + | "moduleType" + | "name" + | "proxiableUUID" + | "removeEntitlement" + | "setEntitlement" + | "supportsInterface" + | "upgradeToAndCall" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "SPACE_ADDRESS", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "UPGRADE_INTERFACE_VERSION", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "description", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getEntitlementDataByRoleId", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "isCrosschain", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "isEntitled", + values: [ + PromiseOrValue, + PromiseOrValue[], + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "moduleType", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData( + functionFragment: "proxiableUUID", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "removeEntitlement", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setEntitlement", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "supportsInterface", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "upgradeToAndCall", + values: [PromiseOrValue, PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "SPACE_ADDRESS", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "UPGRADE_INTERFACE_VERSION", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "description", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getEntitlementDataByRoleId", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "isCrosschain", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "isEntitled", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "moduleType", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "proxiableUUID", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removeEntitlement", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setEntitlement", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "supportsInterface", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "upgradeToAndCall", + data: BytesLike + ): Result; + + events: { + "Initialized(uint64)": EventFragment; + "Upgraded(address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Upgraded"): EventFragment; +} + +export interface InitializedEventObject { + version: BigNumber; +} +export type InitializedEvent = TypedEvent<[BigNumber], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface UpgradedEventObject { + implementation: string; +} +export type UpgradedEvent = TypedEvent<[string], UpgradedEventObject>; + +export type UpgradedEventFilter = TypedEventFilter; + +export interface UserEntitlement extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: UserEntitlementInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + SPACE_ADDRESS(overrides?: CallOverrides): Promise<[string]>; + + UPGRADE_INTERFACE_VERSION(overrides?: CallOverrides): Promise<[string]>; + + description(overrides?: CallOverrides): Promise<[string]>; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + initialize( + _space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise<[boolean]>; + + isEntitled( + channelId: PromiseOrValue, + wallets: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + moduleType(overrides?: CallOverrides): Promise<[string]>; + + name(overrides?: CallOverrides): Promise<[string]>; + + proxiableUUID(overrides?: CallOverrides): Promise<[string]>; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + upgradeToAndCall( + newImplementation: PromiseOrValue, + data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + }; + + SPACE_ADDRESS(overrides?: CallOverrides): Promise; + + UPGRADE_INTERFACE_VERSION(overrides?: CallOverrides): Promise; + + description(overrides?: CallOverrides): Promise; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + initialize( + _space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise; + + isEntitled( + channelId: PromiseOrValue, + wallets: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + moduleType(overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + proxiableUUID(overrides?: CallOverrides): Promise; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + upgradeToAndCall( + newImplementation: PromiseOrValue, + data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + SPACE_ADDRESS(overrides?: CallOverrides): Promise; + + UPGRADE_INTERFACE_VERSION(overrides?: CallOverrides): Promise; + + description(overrides?: CallOverrides): Promise; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + initialize( + _space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise; + + isEntitled( + channelId: PromiseOrValue, + wallets: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + moduleType(overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + proxiableUUID(overrides?: CallOverrides): Promise; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + upgradeToAndCall( + newImplementation: PromiseOrValue, + data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Initialized(uint64)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "Upgraded(address)"( + implementation?: PromiseOrValue | null + ): UpgradedEventFilter; + Upgraded( + implementation?: PromiseOrValue | null + ): UpgradedEventFilter; + }; + + estimateGas: { + SPACE_ADDRESS(overrides?: CallOverrides): Promise; + + UPGRADE_INTERFACE_VERSION(overrides?: CallOverrides): Promise; + + description(overrides?: CallOverrides): Promise; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + initialize( + _space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise; + + isEntitled( + channelId: PromiseOrValue, + wallets: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + moduleType(overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + proxiableUUID(overrides?: CallOverrides): Promise; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + upgradeToAndCall( + newImplementation: PromiseOrValue, + data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + SPACE_ADDRESS(overrides?: CallOverrides): Promise; + + UPGRADE_INTERFACE_VERSION( + overrides?: CallOverrides + ): Promise; + + description(overrides?: CallOverrides): Promise; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + initialize( + _space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise; + + isEntitled( + channelId: PromiseOrValue, + wallets: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + moduleType(overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + proxiableUUID(overrides?: CallOverrides): Promise; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + upgradeToAndCall( + newImplementation: PromiseOrValue, + data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/dev/typings/common.ts b/packages/generated/dev/typings/common.ts new file mode 100644 index 000000000..4c90b08bb --- /dev/null +++ b/packages/generated/dev/typings/common.ts @@ -0,0 +1,46 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { Listener } from "@ethersproject/providers"; +import type { Event, EventFilter } from "ethers"; + +export interface TypedEvent< + TArgsArray extends Array = any, + TArgsObject = any +> extends Event { + args: TArgsArray & TArgsObject; +} + +export interface TypedEventFilter<_TEvent extends TypedEvent> + extends EventFilter {} + +export interface TypedListener { + (...listenerArg: [...__TypechainArgsArray, TEvent]): void; +} + +type __TypechainArgsArray = T extends TypedEvent ? U : never; + +export interface OnEvent { + ( + eventFilter: TypedEventFilter, + listener: TypedListener + ): TRes; + (eventName: string, listener: Listener): TRes; +} + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise; +}; + +export type GetContractTypeFromFactory = F extends MinEthersFactory< + infer C, + any +> + ? C + : never; + +export type GetARGsTypeFromFactory = F extends MinEthersFactory + ? Parameters + : never; + +export type PromiseOrValue = T | Promise; diff --git a/packages/generated/dev/typings/factories/IArchitect__factory.ts b/packages/generated/dev/typings/factories/IArchitect__factory.ts new file mode 100644 index 000000000..6acd7e3eb --- /dev/null +++ b/packages/generated/dev/typings/factories/IArchitect__factory.ts @@ -0,0 +1,354 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IArchitect, IArchitectInterface } from "../IArchitect"; + +const _abi = [ + { + type: "function", + name: "createSpace", + inputs: [ + { + name: "SpaceInfo", + type: "tuple", + internalType: "struct IArchitectBase.SpaceInfo", + components: [ + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "uri", + type: "string", + internalType: "string", + }, + { + name: "membership", + type: "tuple", + internalType: "struct IArchitectBase.Membership", + components: [ + { + name: "settings", + type: "tuple", + internalType: "struct IMembershipBase.Membership", + components: [ + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "symbol", + type: "string", + internalType: "string", + }, + { + name: "price", + type: "uint256", + internalType: "uint256", + }, + { + name: "maxSupply", + type: "uint256", + internalType: "uint256", + }, + { + name: "duration", + type: "uint64", + internalType: "uint64", + }, + { + name: "currency", + type: "address", + internalType: "address", + }, + { + name: "feeRecipient", + type: "address", + internalType: "address", + }, + { + name: "freeAllocation", + type: "uint256", + internalType: "uint256", + }, + { + name: "pricingModule", + type: "address", + internalType: "address", + }, + ], + }, + { + name: "requirements", + type: "tuple", + internalType: "struct IArchitectBase.MembershipRequirements", + components: [ + { + name: "everyone", + type: "bool", + internalType: "bool", + }, + { + name: "users", + type: "address[]", + internalType: "address[]", + }, + { + name: "ruleData", + type: "tuple", + internalType: "struct IRuleEntitlement.RuleData", + components: [ + { + name: "operations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.Operation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: + "enum IRuleEntitlement.CombinedOperationType", + }, + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + name: "checkOperations", + type: "tuple[]", + internalType: + "struct IRuleEntitlement.CheckOperation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: + "enum IRuleEntitlement.CheckOperationType", + }, + { + name: "chainId", + type: "uint256", + internalType: "uint256", + }, + { + name: "contractAddress", + type: "address", + internalType: "address", + }, + { + name: "threshold", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "logicalOperations", + type: "tuple[]", + internalType: + "struct IRuleEntitlement.LogicalOperation[]", + components: [ + { + name: "logOpType", + type: "uint8", + internalType: + "enum IRuleEntitlement.LogicalOperationType", + }, + { + name: "leftOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "rightOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + ], + }, + ], + }, + { + name: "permissions", + type: "string[]", + internalType: "string[]", + }, + ], + }, + { + name: "channel", + type: "tuple", + internalType: "struct IArchitectBase.ChannelInfo", + components: [ + { + name: "metadata", + type: "string", + internalType: "string", + }, + ], + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "getSpaceArchitectImplementations", + inputs: [], + outputs: [ + { + name: "ownerTokenImplementation", + type: "address", + internalType: "contract ISpaceOwner", + }, + { + name: "userEntitlementImplementation", + type: "address", + internalType: "contract IUserEntitlement", + }, + { + name: "ruleEntitlementImplementation", + type: "address", + internalType: "contract IRuleEntitlement", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getSpaceByTokenId", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "space", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getTokenIdBySpace", + inputs: [ + { + name: "space", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "setSpaceArchitectImplementations", + inputs: [ + { + name: "ownerTokenImplementation", + type: "address", + internalType: "contract ISpaceOwner", + }, + { + name: "userEntitlementImplementation", + type: "address", + internalType: "contract IUserEntitlement", + }, + { + name: "ruleEntitlementImplementation", + type: "address", + internalType: "contract IRuleEntitlement", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "SpaceCreated", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + { + name: "space", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "Architect__InvalidAddress", + inputs: [], + }, + { + type: "error", + name: "Architect__InvalidNetworkId", + inputs: [], + }, + { + type: "error", + name: "Architect__InvalidStringLength", + inputs: [], + }, + { + type: "error", + name: "Architect__NotContract", + inputs: [], + }, +] as const; + +export class IArchitect__factory { + static readonly abi = _abi; + static createInterface(): IArchitectInterface { + return new utils.Interface(_abi) as IArchitectInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IArchitect { + return new Contract(address, _abi, signerOrProvider) as IArchitect; + } +} diff --git a/packages/generated/dev/typings/factories/IBanning__factory.ts b/packages/generated/dev/typings/factories/IBanning__factory.ts new file mode 100644 index 000000000..248fa2ac3 --- /dev/null +++ b/packages/generated/dev/typings/factories/IBanning__factory.ts @@ -0,0 +1,157 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IBanning, IBanningInterface } from "../IBanning"; + +const _abi = [ + { + type: "function", + name: "ban", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "banned", + inputs: [], + outputs: [ + { + name: "", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isBanned", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "unban", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "Banned", + inputs: [ + { + name: "moderator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Unbanned", + inputs: [ + { + name: "moderator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "Banning__AlreadyBanned", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "Banning__CannotBanSelf", + inputs: [], + }, + { + type: "error", + name: "Banning__InvalidTokenId", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "Banning__NotBanned", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, +] as const; + +export class IBanning__factory { + static readonly abi = _abi; + static createInterface(): IBanningInterface { + return new utils.Interface(_abi) as IBanningInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IBanning { + return new Contract(address, _abi, signerOrProvider) as IBanning; + } +} diff --git a/packages/generated/dev/typings/factories/IChannel__factory.ts b/packages/generated/dev/typings/factories/IChannel__factory.ts new file mode 100644 index 000000000..21431b351 --- /dev/null +++ b/packages/generated/dev/typings/factories/IChannel__factory.ts @@ -0,0 +1,320 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IChannel, IChannelInterface } from "../IChannel"; + +const _abi = [ + { + type: "function", + name: "addRoleToChannel", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "createChannel", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "metadata", + type: "string", + internalType: "string", + }, + { + name: "roleIds", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "getChannel", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "channel", + type: "tuple", + internalType: "struct IChannelBase.Channel", + components: [ + { + name: "id", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "disabled", + type: "bool", + internalType: "bool", + }, + { + name: "metadata", + type: "string", + internalType: "string", + }, + { + name: "roleIds", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getChannels", + inputs: [], + outputs: [ + { + name: "channels", + type: "tuple[]", + internalType: "struct IChannelBase.Channel[]", + components: [ + { + name: "id", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "disabled", + type: "bool", + internalType: "bool", + }, + { + name: "metadata", + type: "string", + internalType: "string", + }, + { + name: "roleIds", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getRolesByChannel", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "roleIds", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "removeChannel", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "removeRoleFromChannel", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateChannel", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "metadata", + type: "string", + internalType: "string", + }, + { + name: "disabled", + type: "bool", + internalType: "bool", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "ChannelCreated", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "channelId", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ChannelRemoved", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "channelId", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ChannelRoleAdded", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "channelId", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + { + name: "roleId", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ChannelRoleRemoved", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "channelId", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + { + name: "roleId", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ChannelUpdated", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "channelId", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + ], + anonymous: false, + }, +] as const; + +export class IChannel__factory { + static readonly abi = _abi; + static createInterface(): IChannelInterface { + return new utils.Interface(_abi) as IChannelInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IChannel { + return new Contract(address, _abi, signerOrProvider) as IChannel; + } +} diff --git a/packages/generated/dev/typings/factories/ICustomEntitlement__factory.ts b/packages/generated/dev/typings/factories/ICustomEntitlement__factory.ts new file mode 100644 index 000000000..0d18a3a07 --- /dev/null +++ b/packages/generated/dev/typings/factories/ICustomEntitlement__factory.ts @@ -0,0 +1,45 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { + ICustomEntitlement, + ICustomEntitlementInterface, +} from "../ICustomEntitlement"; + +const _abi = [ + { + type: "function", + name: "isEntitled", + inputs: [ + { + name: "user", + type: "address[]", + internalType: "address[]", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, +] as const; + +export class ICustomEntitlement__factory { + static readonly abi = _abi; + static createInterface(): ICustomEntitlementInterface { + return new utils.Interface(_abi) as ICustomEntitlementInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): ICustomEntitlement { + return new Contract(address, _abi, signerOrProvider) as ICustomEntitlement; + } +} diff --git a/packages/generated/dev/typings/factories/IDiamondCut__factory.ts b/packages/generated/dev/typings/factories/IDiamondCut__factory.ts new file mode 100644 index 000000000..5fec30b5f --- /dev/null +++ b/packages/generated/dev/typings/factories/IDiamondCut__factory.ts @@ -0,0 +1,207 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IDiamondCut, IDiamondCutInterface } from "../IDiamondCut"; + +const _abi = [ + { + type: "function", + name: "diamondCut", + inputs: [ + { + name: "facetCuts", + type: "tuple[]", + internalType: "struct IDiamond.FacetCut[]", + components: [ + { + name: "facetAddress", + type: "address", + internalType: "address", + }, + { + name: "action", + type: "uint8", + internalType: "enum IDiamond.FacetCutAction", + }, + { + name: "functionSelectors", + type: "bytes4[]", + internalType: "bytes4[]", + }, + ], + }, + { + name: "init", + type: "address", + internalType: "address", + }, + { + name: "initPayload", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "DiamondCut", + inputs: [ + { + name: "facetCuts", + type: "tuple[]", + indexed: false, + internalType: "struct IDiamond.FacetCut[]", + components: [ + { + name: "facetAddress", + type: "address", + internalType: "address", + }, + { + name: "action", + type: "uint8", + internalType: "enum IDiamond.FacetCutAction", + }, + { + name: "functionSelectors", + type: "bytes4[]", + internalType: "bytes4[]", + }, + ], + }, + { + name: "init", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "initPayload", + type: "bytes", + indexed: false, + internalType: "bytes", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "DiamondCut_FunctionAlreadyExists", + inputs: [ + { + name: "selector", + type: "bytes4", + internalType: "bytes4", + }, + ], + }, + { + type: "error", + name: "DiamondCut_FunctionDoesNotExist", + inputs: [ + { + name: "facet", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "DiamondCut_FunctionFromSameFacetAlreadyExists", + inputs: [ + { + name: "selector", + type: "bytes4", + internalType: "bytes4", + }, + ], + }, + { + type: "error", + name: "DiamondCut_ImmutableFacet", + inputs: [], + }, + { + type: "error", + name: "DiamondCut_InvalidContract", + inputs: [ + { + name: "init", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "DiamondCut_InvalidFacet", + inputs: [ + { + name: "facet", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "DiamondCut_InvalidFacetCutAction", + inputs: [], + }, + { + type: "error", + name: "DiamondCut_InvalidFacetCutLength", + inputs: [], + }, + { + type: "error", + name: "DiamondCut_InvalidFacetRemoval", + inputs: [ + { + name: "facet", + type: "address", + internalType: "address", + }, + { + name: "selector", + type: "bytes4", + internalType: "bytes4", + }, + ], + }, + { + type: "error", + name: "DiamondCut_InvalidFacetSelectors", + inputs: [ + { + name: "facet", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "DiamondCut_InvalidSelector", + inputs: [], + }, +] as const; + +export class IDiamondCut__factory { + static readonly abi = _abi; + static createInterface(): IDiamondCutInterface { + return new utils.Interface(_abi) as IDiamondCutInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IDiamondCut { + return new Contract(address, _abi, signerOrProvider) as IDiamondCut; + } +} diff --git a/packages/generated/dev/typings/factories/IDiamond__factory.ts b/packages/generated/dev/typings/factories/IDiamond__factory.ts new file mode 100644 index 000000000..33e89852b --- /dev/null +++ b/packages/generated/dev/typings/factories/IDiamond__factory.ts @@ -0,0 +1,28 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IDiamond, IDiamondInterface } from "../IDiamond"; + +const _abi = [ + { + type: "error", + name: "Diamond_UnsupportedFunction", + inputs: [], + }, +] as const; + +export class IDiamond__factory { + static readonly abi = _abi; + static createInterface(): IDiamondInterface { + return new utils.Interface(_abi) as IDiamondInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IDiamond { + return new Contract(address, _abi, signerOrProvider) as IDiamond; + } +} diff --git a/packages/generated/dev/typings/factories/IERC721AQueryable__factory.ts b/packages/generated/dev/typings/factories/IERC721AQueryable__factory.ts new file mode 100644 index 000000000..cdf857fa7 --- /dev/null +++ b/packages/generated/dev/typings/factories/IERC721AQueryable__factory.ts @@ -0,0 +1,332 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { + IERC721AQueryable, + IERC721AQueryableInterface, +} from "../IERC721AQueryable"; + +const _abi = [ + { + type: "function", + name: "explicitOwnershipOf", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct IERC721ABase.TokenOwnership", + components: [ + { + name: "addr", + type: "address", + internalType: "address", + }, + { + name: "startTimestamp", + type: "uint64", + internalType: "uint64", + }, + { + name: "burned", + type: "bool", + internalType: "bool", + }, + { + name: "extraData", + type: "uint24", + internalType: "uint24", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "explicitOwnershipsOf", + inputs: [ + { + name: "tokenIds", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct IERC721ABase.TokenOwnership[]", + components: [ + { + name: "addr", + type: "address", + internalType: "address", + }, + { + name: "startTimestamp", + type: "uint64", + internalType: "uint64", + }, + { + name: "burned", + type: "bool", + internalType: "bool", + }, + { + name: "extraData", + type: "uint24", + internalType: "uint24", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "tokensOfOwner", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "tokensOfOwnerIn", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + { + name: "start", + type: "uint256", + internalType: "uint256", + }, + { + name: "stop", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + stateMutability: "view", + }, + { + type: "event", + name: "Approval", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "approved", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ApprovalForAll", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "approved", + type: "bool", + indexed: false, + internalType: "bool", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ConsecutiveTransfer", + inputs: [ + { + name: "fromTokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + { + name: "toTokenId", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "from", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Transfer", + inputs: [ + { + name: "from", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "ApprovalCallerNotOwnerNorApproved", + inputs: [], + }, + { + type: "error", + name: "ApprovalQueryForNonexistentToken", + inputs: [], + }, + { + type: "error", + name: "BalanceQueryForZeroAddress", + inputs: [], + }, + { + type: "error", + name: "InvalidQueryRange", + inputs: [], + }, + { + type: "error", + name: "MintERC2309QuantityExceedsLimit", + inputs: [], + }, + { + type: "error", + name: "MintToZeroAddress", + inputs: [], + }, + { + type: "error", + name: "MintZeroQuantity", + inputs: [], + }, + { + type: "error", + name: "OwnerQueryForNonexistentToken", + inputs: [], + }, + { + type: "error", + name: "OwnershipNotInitializedForExtraData", + inputs: [], + }, + { + type: "error", + name: "TransferCallerNotOwnerNorApproved", + inputs: [], + }, + { + type: "error", + name: "TransferFromIncorrectOwner", + inputs: [], + }, + { + type: "error", + name: "TransferToNonERC721ReceiverImplementer", + inputs: [], + }, + { + type: "error", + name: "TransferToZeroAddress", + inputs: [], + }, + { + type: "error", + name: "URIQueryForNonexistentToken", + inputs: [], + }, +] as const; + +export class IERC721AQueryable__factory { + static readonly abi = _abi; + static createInterface(): IERC721AQueryableInterface { + return new utils.Interface(_abi) as IERC721AQueryableInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IERC721AQueryable { + return new Contract(address, _abi, signerOrProvider) as IERC721AQueryable; + } +} diff --git a/packages/generated/dev/typings/factories/IEntitlementsManager__factory.ts b/packages/generated/dev/typings/factories/IEntitlementsManager__factory.ts new file mode 100644 index 000000000..4000862eb --- /dev/null +++ b/packages/generated/dev/typings/factories/IEntitlementsManager__factory.ts @@ -0,0 +1,267 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { + IEntitlementsManager, + IEntitlementsManagerInterface, +} from "../IEntitlementsManager"; + +const _abi = [ + { + type: "function", + name: "addEntitlementModule", + inputs: [ + { + name: "entitlement", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "addImmutableEntitlements", + inputs: [ + { + name: "entitlements", + type: "address[]", + internalType: "address[]", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "getEntitlement", + inputs: [ + { + name: "entitlement", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "entitlements", + type: "tuple", + internalType: "struct IEntitlementsManagerBase.Entitlement", + components: [ + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "moduleAddress", + type: "address", + internalType: "address", + }, + { + name: "moduleType", + type: "string", + internalType: "string", + }, + { + name: "isImmutable", + type: "bool", + internalType: "bool", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getEntitlementDataByPermission", + inputs: [ + { + name: "permission", + type: "string", + internalType: "string", + }, + ], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct IEntitlementsManager.EntitlementData[]", + components: [ + { + name: "entitlementType", + type: "string", + internalType: "string", + }, + { + name: "entitlementData", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getEntitlements", + inputs: [], + outputs: [ + { + name: "entitlements", + type: "tuple[]", + internalType: "struct IEntitlementsManagerBase.Entitlement[]", + components: [ + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "moduleAddress", + type: "address", + internalType: "address", + }, + { + name: "moduleType", + type: "string", + internalType: "string", + }, + { + name: "isImmutable", + type: "bool", + internalType: "bool", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isEntitledToChannel", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "user", + type: "address", + internalType: "address", + }, + { + name: "permission", + type: "string", + internalType: "string", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isEntitledToSpace", + inputs: [ + { + name: "user", + type: "address", + internalType: "address", + }, + { + name: "permission", + type: "string", + internalType: "string", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "removeEntitlementModule", + inputs: [ + { + name: "entitlement", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "EntitlementModuleAdded", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "entitlement", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "EntitlementModuleRemoved", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "entitlement", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, +] as const; + +export class IEntitlementsManager__factory { + static readonly abi = _abi; + static createInterface(): IEntitlementsManagerInterface { + return new utils.Interface(_abi) as IEntitlementsManagerInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IEntitlementsManager { + return new Contract( + address, + _abi, + signerOrProvider + ) as IEntitlementsManager; + } +} diff --git a/packages/generated/dev/typings/factories/IMulticall__factory.ts b/packages/generated/dev/typings/factories/IMulticall__factory.ts new file mode 100644 index 000000000..0782e9fda --- /dev/null +++ b/packages/generated/dev/typings/factories/IMulticall__factory.ts @@ -0,0 +1,42 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IMulticall, IMulticallInterface } from "../IMulticall"; + +const _abi = [ + { + type: "function", + name: "multicall", + inputs: [ + { + name: "data", + type: "bytes[]", + internalType: "bytes[]", + }, + ], + outputs: [ + { + name: "results", + type: "bytes[]", + internalType: "bytes[]", + }, + ], + stateMutability: "nonpayable", + }, +] as const; + +export class IMulticall__factory { + static readonly abi = _abi; + static createInterface(): IMulticallInterface { + return new utils.Interface(_abi) as IMulticallInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IMulticall { + return new Contract(address, _abi, signerOrProvider) as IMulticall; + } +} diff --git a/packages/generated/dev/typings/factories/INodeRegistry__factory.ts b/packages/generated/dev/typings/factories/INodeRegistry__factory.ts new file mode 100644 index 000000000..f45e4dd09 --- /dev/null +++ b/packages/generated/dev/typings/factories/INodeRegistry__factory.ts @@ -0,0 +1,273 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { INodeRegistry, INodeRegistryInterface } from "../INodeRegistry"; + +const _abi = [ + { + type: "function", + name: "getAllNodeAddresses", + inputs: [], + outputs: [ + { + name: "", + type: "address[]", + internalType: "address[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getAllNodes", + inputs: [], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct Node[]", + components: [ + { + name: "status", + type: "uint8", + internalType: "enum NodeStatus", + }, + { + name: "url", + type: "string", + internalType: "string", + }, + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getNode", + inputs: [ + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct Node", + components: [ + { + name: "status", + type: "uint8", + internalType: "enum NodeStatus", + }, + { + name: "url", + type: "string", + internalType: "string", + }, + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getNodeCount", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "registerNode", + inputs: [ + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + { + name: "url", + type: "string", + internalType: "string", + }, + { + name: "status", + type: "uint8", + internalType: "enum NodeStatus", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "removeNode", + inputs: [ + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateNodeStatus", + inputs: [ + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + { + name: "status", + type: "uint8", + internalType: "enum NodeStatus", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateNodeUrl", + inputs: [ + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + { + name: "url", + type: "string", + internalType: "string", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "NodeAdded", + inputs: [ + { + name: "nodeAddress", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "url", + type: "string", + indexed: false, + internalType: "string", + }, + { + name: "status", + type: "uint8", + indexed: false, + internalType: "enum NodeStatus", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "NodeRemoved", + inputs: [ + { + name: "nodeAddress", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "NodeStatusUpdated", + inputs: [ + { + name: "nodeAddress", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "status", + type: "uint8", + indexed: false, + internalType: "enum NodeStatus", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "NodeUrlUpdated", + inputs: [ + { + name: "nodeAddress", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "url", + type: "string", + indexed: false, + internalType: "string", + }, + ], + anonymous: false, + }, +] as const; + +export class INodeRegistry__factory { + static readonly abi = _abi; + static createInterface(): INodeRegistryInterface { + return new utils.Interface(_abi) as INodeRegistryInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): INodeRegistry { + return new Contract(address, _abi, signerOrProvider) as INodeRegistry; + } +} diff --git a/packages/generated/dev/typings/factories/IOperatorRegistry__factory.ts b/packages/generated/dev/typings/factories/IOperatorRegistry__factory.ts new file mode 100644 index 000000000..901808656 --- /dev/null +++ b/packages/generated/dev/typings/factories/IOperatorRegistry__factory.ts @@ -0,0 +1,97 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { + IOperatorRegistry, + IOperatorRegistryInterface, +} from "../IOperatorRegistry"; + +const _abi = [ + { + type: "function", + name: "approveOperator", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "isOperator", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "removeOperator", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "OperatorAdded", + inputs: [ + { + name: "operatorAddress", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorRemoved", + inputs: [ + { + name: "operatorAddress", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, +] as const; + +export class IOperatorRegistry__factory { + static readonly abi = _abi; + static createInterface(): IOperatorRegistryInterface { + return new utils.Interface(_abi) as IOperatorRegistryInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IOperatorRegistry { + return new Contract(address, _abi, signerOrProvider) as IOperatorRegistry; + } +} diff --git a/packages/generated/dev/typings/factories/IPausable__factory.ts b/packages/generated/dev/typings/factories/IPausable__factory.ts new file mode 100644 index 000000000..2e779658e --- /dev/null +++ b/packages/generated/dev/typings/factories/IPausable__factory.ts @@ -0,0 +1,86 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IPausable, IPausableInterface } from "../IPausable"; + +const _abi = [ + { + type: "function", + name: "pause", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "paused", + inputs: [], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "unpause", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "Paused", + inputs: [ + { + name: "account", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Unpaused", + inputs: [ + { + name: "account", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "Pausable__NotPaused", + inputs: [], + }, + { + type: "error", + name: "Pausable__Paused", + inputs: [], + }, +] as const; + +export class IPausable__factory { + static readonly abi = _abi; + static createInterface(): IPausableInterface { + return new utils.Interface(_abi) as IPausableInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IPausable { + return new Contract(address, _abi, signerOrProvider) as IPausable; + } +} diff --git a/packages/generated/dev/typings/factories/IPricingModules__factory.ts b/packages/generated/dev/typings/factories/IPricingModules__factory.ts new file mode 100644 index 000000000..7ccfb3f8c --- /dev/null +++ b/packages/generated/dev/typings/factories/IPricingModules__factory.ts @@ -0,0 +1,151 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { + IPricingModules, + IPricingModulesInterface, +} from "../IPricingModules"; + +const _abi = [ + { + type: "function", + name: "addPricingModule", + inputs: [ + { + name: "module", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "isPricingModule", + inputs: [ + { + name: "module", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "listPricingModules", + inputs: [], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct IPricingModulesBase.PricingModule[]", + components: [ + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "description", + type: "string", + internalType: "string", + }, + { + name: "module", + type: "address", + internalType: "address", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "removePricingModule", + inputs: [ + { + name: "module", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "PricingModuleAdded", + inputs: [ + { + name: "module", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "PricingModuleRemoved", + inputs: [ + { + name: "module", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "PricingModuleUpdated", + inputs: [ + { + name: "module", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "InvalidPricingModule", + inputs: [ + { + name: "module", + type: "address", + internalType: "address", + }, + ], + }, +] as const; + +export class IPricingModules__factory { + static readonly abi = _abi; + static createInterface(): IPricingModulesInterface { + return new utils.Interface(_abi) as IPricingModulesInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IPricingModules { + return new Contract(address, _abi, signerOrProvider) as IPricingModules; + } +} diff --git a/packages/generated/dev/typings/factories/IProxyManager__factory.ts b/packages/generated/dev/typings/factories/IProxyManager__factory.ts new file mode 100644 index 000000000..e4a1843ce --- /dev/null +++ b/packages/generated/dev/typings/factories/IProxyManager__factory.ts @@ -0,0 +1,79 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IProxyManager, IProxyManagerInterface } from "../IProxyManager"; + +const _abi = [ + { + type: "function", + name: "getImplementation", + inputs: [ + { + name: "selector", + type: "bytes4", + internalType: "bytes4", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "setImplementation", + inputs: [ + { + name: "implementation", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "ProxyManager__ImplementationSet", + inputs: [ + { + name: "implementation", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "ProxyManager__NotContract", + inputs: [ + { + name: "implementation", + type: "address", + internalType: "address", + }, + ], + }, +] as const; + +export class IProxyManager__factory { + static readonly abi = _abi; + static createInterface(): IProxyManagerInterface { + return new utils.Interface(_abi) as IProxyManagerInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IProxyManager { + return new Contract(address, _abi, signerOrProvider) as IProxyManager; + } +} diff --git a/packages/generated/dev/typings/factories/IRoles__factory.ts b/packages/generated/dev/typings/factories/IRoles__factory.ts new file mode 100644 index 000000000..265f00671 --- /dev/null +++ b/packages/generated/dev/typings/factories/IRoles__factory.ts @@ -0,0 +1,407 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IRoles, IRolesInterface } from "../IRoles"; + +const _abi = [ + { + type: "function", + name: "addPermissionsToRole", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "permissions", + type: "string[]", + internalType: "string[]", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "addRoleToEntitlement", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "entitlement", + type: "tuple", + internalType: "struct IRolesBase.CreateEntitlement", + components: [ + { + name: "module", + type: "address", + internalType: "contract IEntitlement", + }, + { + name: "data", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "createRole", + inputs: [ + { + name: "roleName", + type: "string", + internalType: "string", + }, + { + name: "permissions", + type: "string[]", + internalType: "string[]", + }, + { + name: "entitlements", + type: "tuple[]", + internalType: "struct IRolesBase.CreateEntitlement[]", + components: [ + { + name: "module", + type: "address", + internalType: "contract IEntitlement", + }, + { + name: "data", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + outputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "getPermissionsByRoleId", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "permissions", + type: "string[]", + internalType: "string[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getRoleById", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "role", + type: "tuple", + internalType: "struct IRolesBase.Role", + components: [ + { + name: "id", + type: "uint256", + internalType: "uint256", + }, + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "disabled", + type: "bool", + internalType: "bool", + }, + { + name: "permissions", + type: "string[]", + internalType: "string[]", + }, + { + name: "entitlements", + type: "address[]", + internalType: "contract IEntitlement[]", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getRoles", + inputs: [], + outputs: [ + { + name: "roles", + type: "tuple[]", + internalType: "struct IRolesBase.Role[]", + components: [ + { + name: "id", + type: "uint256", + internalType: "uint256", + }, + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "disabled", + type: "bool", + internalType: "bool", + }, + { + name: "permissions", + type: "string[]", + internalType: "string[]", + }, + { + name: "entitlements", + type: "address[]", + internalType: "contract IEntitlement[]", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "removePermissionsFromRole", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "permissions", + type: "string[]", + internalType: "string[]", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "removeRole", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "removeRoleFromEntitlement", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "entitlement", + type: "tuple", + internalType: "struct IRolesBase.CreateEntitlement", + components: [ + { + name: "module", + type: "address", + internalType: "contract IEntitlement", + }, + { + name: "data", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateRole", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "roleName", + type: "string", + internalType: "string", + }, + { + name: "permissions", + type: "string[]", + internalType: "string[]", + }, + { + name: "entitlements", + type: "tuple[]", + internalType: "struct IRolesBase.CreateEntitlement[]", + components: [ + { + name: "module", + type: "address", + internalType: "contract IEntitlement", + }, + { + name: "data", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "RoleCreated", + inputs: [ + { + name: "creator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "roleId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "RoleRemoved", + inputs: [ + { + name: "remover", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "roleId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "RoleUpdated", + inputs: [ + { + name: "updater", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "roleId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "Roles__EntitlementAlreadyExists", + inputs: [], + }, + { + type: "error", + name: "Roles__EntitlementDoesNotExist", + inputs: [], + }, + { + type: "error", + name: "Roles__InvalidEntitlementAddress", + inputs: [], + }, + { + type: "error", + name: "Roles__InvalidPermission", + inputs: [], + }, + { + type: "error", + name: "Roles__PermissionAlreadyExists", + inputs: [], + }, + { + type: "error", + name: "Roles__PermissionDoesNotExist", + inputs: [], + }, + { + type: "error", + name: "Roles__RoleDoesNotExist", + inputs: [], + }, +] as const; + +export class IRoles__factory { + static readonly abi = _abi; + static createInterface(): IRolesInterface { + return new utils.Interface(_abi) as IRolesInterface; + } + static connect(address: string, signerOrProvider: Signer | Provider): IRoles { + return new Contract(address, _abi, signerOrProvider) as IRoles; + } +} diff --git a/packages/generated/dev/typings/factories/IRuleEntitlement__factory.ts b/packages/generated/dev/typings/factories/IRuleEntitlement__factory.ts new file mode 100644 index 000000000..3fea9c719 --- /dev/null +++ b/packages/generated/dev/typings/factories/IRuleEntitlement__factory.ts @@ -0,0 +1,580 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { + IRuleEntitlement, + IRuleEntitlementInterface, +} from "../IRuleEntitlement"; + +const _abi = [ + { + type: "function", + name: "description", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "encodeRuleData", + inputs: [ + { + name: "data", + type: "tuple", + internalType: "struct IRuleEntitlement.RuleData", + components: [ + { + name: "operations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.Operation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CombinedOperationType", + }, + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + name: "checkOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.CheckOperation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CheckOperationType", + }, + { + name: "chainId", + type: "uint256", + internalType: "uint256", + }, + { + name: "contractAddress", + type: "address", + internalType: "address", + }, + { + name: "threshold", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "logicalOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.LogicalOperation[]", + components: [ + { + name: "logOpType", + type: "uint8", + internalType: "enum IRuleEntitlement.LogicalOperationType", + }, + { + name: "leftOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "rightOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "bytes", + internalType: "bytes", + }, + ], + stateMutability: "pure", + }, + { + type: "function", + name: "getCheckOperations", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct IRuleEntitlement.CheckOperation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CheckOperationType", + }, + { + name: "chainId", + type: "uint256", + internalType: "uint256", + }, + { + name: "contractAddress", + type: "address", + internalType: "address", + }, + { + name: "threshold", + type: "uint256", + internalType: "uint256", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getEntitlementDataByRoleId", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "bytes", + internalType: "bytes", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getLogicalOperations", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct IRuleEntitlement.LogicalOperation[]", + components: [ + { + name: "logOpType", + type: "uint8", + internalType: "enum IRuleEntitlement.LogicalOperationType", + }, + { + name: "leftOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "rightOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperations", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct IRuleEntitlement.Operation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CombinedOperationType", + }, + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getRuleData", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "data", + type: "tuple", + internalType: "struct IRuleEntitlement.RuleData", + components: [ + { + name: "operations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.Operation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CombinedOperationType", + }, + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + name: "checkOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.CheckOperation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CheckOperationType", + }, + { + name: "chainId", + type: "uint256", + internalType: "uint256", + }, + { + name: "contractAddress", + type: "address", + internalType: "address", + }, + { + name: "threshold", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "logicalOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.LogicalOperation[]", + components: [ + { + name: "logOpType", + type: "uint8", + internalType: "enum IRuleEntitlement.LogicalOperationType", + }, + { + name: "leftOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "rightOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "initialize", + inputs: [ + { + name: "space", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "isCrosschain", + inputs: [], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isEntitled", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "user", + type: "address[]", + internalType: "address[]", + }, + { + name: "permission", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "moduleType", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "name", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "removeEntitlement", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setEntitlement", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "entitlementData", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "error", + name: "CheckOperationsLimitReaced", + inputs: [ + { + name: "limit", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "Entitlement__InvalidValue", + inputs: [], + }, + { + type: "error", + name: "Entitlement__NotAllowed", + inputs: [], + }, + { + type: "error", + name: "Entitlement__NotMember", + inputs: [], + }, + { + type: "error", + name: "Entitlement__ValueAlreadyExists", + inputs: [], + }, + { + type: "error", + name: "InvalidCheckOperationIndex", + inputs: [ + { + name: "operationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "checkOperationsLength", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + type: "error", + name: "InvalidLeftOperationIndex", + inputs: [ + { + name: "leftOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "currentOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + type: "error", + name: "InvalidLogicalOperationIndex", + inputs: [ + { + name: "operationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "logicalOperationsLength", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + type: "error", + name: "InvalidOperationType", + inputs: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CombinedOperationType", + }, + ], + }, + { + type: "error", + name: "InvalidRightOperationIndex", + inputs: [ + { + name: "rightOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "currentOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + type: "error", + name: "LogicalOperationLimitReached", + inputs: [ + { + name: "limit", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "OperationsLimitReached", + inputs: [ + { + name: "limit", + type: "uint256", + internalType: "uint256", + }, + ], + }, +] as const; + +export class IRuleEntitlement__factory { + static readonly abi = _abi; + static createInterface(): IRuleEntitlementInterface { + return new utils.Interface(_abi) as IRuleEntitlementInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IRuleEntitlement { + return new Contract(address, _abi, signerOrProvider) as IRuleEntitlement; + } +} diff --git a/packages/generated/dev/typings/factories/ISpaceOwner__factory.ts b/packages/generated/dev/typings/factories/ISpaceOwner__factory.ts new file mode 100644 index 000000000..d0c55e881 --- /dev/null +++ b/packages/generated/dev/typings/factories/ISpaceOwner__factory.ts @@ -0,0 +1,191 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { ISpaceOwner, ISpaceOwnerInterface } from "../ISpaceOwner"; + +const _abi = [ + { + type: "function", + name: "getFactory", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getSpaceInfo", + inputs: [ + { + name: "space", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct ISpaceOwnerBase.Space", + components: [ + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "uri", + type: "string", + internalType: "string", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + { + name: "createdAt", + type: "uint256", + internalType: "uint256", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "mintSpace", + inputs: [ + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "uri", + type: "string", + internalType: "string", + }, + { + name: "space", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "nextTokenId", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "setFactory", + inputs: [ + { + name: "factory", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateSpaceInfo", + inputs: [ + { + name: "space", + type: "address", + internalType: "address", + }, + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "uri", + type: "string", + internalType: "string", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "SpaceOwner__SetFactory", + inputs: [ + { + name: "factory", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "SpaceOwner__UpdateSpace", + inputs: [ + { + name: "space", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "SpaceOwner__OnlyFactoryAllowed", + inputs: [], + }, + { + type: "error", + name: "SpaceOwner__OnlySpaceOwnerAllowed", + inputs: [], + }, +] as const; + +export class ISpaceOwner__factory { + static readonly abi = _abi; + static createInterface(): ISpaceOwnerInterface { + return new utils.Interface(_abi) as ISpaceOwnerInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): ISpaceOwner { + return new Contract(address, _abi, signerOrProvider) as ISpaceOwner; + } +} diff --git a/packages/generated/dev/typings/factories/IStreamRegistry__factory.ts b/packages/generated/dev/typings/factories/IStreamRegistry__factory.ts new file mode 100644 index 000000000..eb26d4e6c --- /dev/null +++ b/packages/generated/dev/typings/factories/IStreamRegistry__factory.ts @@ -0,0 +1,645 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { + IStreamRegistry, + IStreamRegistryInterface, +} from "../IStreamRegistry"; + +const _abi = [ + { + type: "function", + name: "allocateStream", + inputs: [ + { + name: "streamId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "nodes", + type: "address[]", + internalType: "address[]", + }, + { + name: "genesisMiniblockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "genesisMiniblock", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "getAllStreamIds", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32[]", + internalType: "bytes32[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getAllStreams", + inputs: [], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct StreamWithId[]", + components: [ + { + name: "id", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "stream", + type: "tuple", + internalType: "struct Stream", + components: [ + { + name: "lastMiniblockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "lastMiniblockNum", + type: "uint64", + internalType: "uint64", + }, + { + name: "reserved0", + type: "uint64", + internalType: "uint64", + }, + { + name: "flags", + type: "uint64", + internalType: "uint64", + }, + { + name: "nodes", + type: "address[]", + internalType: "address[]", + }, + ], + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getPaginatedStreams", + inputs: [ + { + name: "start", + type: "uint256", + internalType: "uint256", + }, + { + name: "stop", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct StreamWithId[]", + components: [ + { + name: "id", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "stream", + type: "tuple", + internalType: "struct Stream", + components: [ + { + name: "lastMiniblockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "lastMiniblockNum", + type: "uint64", + internalType: "uint64", + }, + { + name: "reserved0", + type: "uint64", + internalType: "uint64", + }, + { + name: "flags", + type: "uint64", + internalType: "uint64", + }, + { + name: "nodes", + type: "address[]", + internalType: "address[]", + }, + ], + }, + ], + }, + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getStream", + inputs: [ + { + name: "streamId", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct Stream", + components: [ + { + name: "lastMiniblockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "lastMiniblockNum", + type: "uint64", + internalType: "uint64", + }, + { + name: "reserved0", + type: "uint64", + internalType: "uint64", + }, + { + name: "flags", + type: "uint64", + internalType: "uint64", + }, + { + name: "nodes", + type: "address[]", + internalType: "address[]", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getStreamByIndex", + inputs: [ + { + name: "i", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct StreamWithId", + components: [ + { + name: "id", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "stream", + type: "tuple", + internalType: "struct Stream", + components: [ + { + name: "lastMiniblockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "lastMiniblockNum", + type: "uint64", + internalType: "uint64", + }, + { + name: "reserved0", + type: "uint64", + internalType: "uint64", + }, + { + name: "flags", + type: "uint64", + internalType: "uint64", + }, + { + name: "nodes", + type: "address[]", + internalType: "address[]", + }, + ], + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getStreamCount", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getStreamWithGenesis", + inputs: [ + { + name: "streamId", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct Stream", + components: [ + { + name: "lastMiniblockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "lastMiniblockNum", + type: "uint64", + internalType: "uint64", + }, + { + name: "reserved0", + type: "uint64", + internalType: "uint64", + }, + { + name: "flags", + type: "uint64", + internalType: "uint64", + }, + { + name: "nodes", + type: "address[]", + internalType: "address[]", + }, + ], + }, + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "", + type: "bytes", + internalType: "bytes", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getStreamsOnNode", + inputs: [ + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct StreamWithId[]", + components: [ + { + name: "id", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "stream", + type: "tuple", + internalType: "struct Stream", + components: [ + { + name: "lastMiniblockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "lastMiniblockNum", + type: "uint64", + internalType: "uint64", + }, + { + name: "reserved0", + type: "uint64", + internalType: "uint64", + }, + { + name: "flags", + type: "uint64", + internalType: "uint64", + }, + { + name: "nodes", + type: "address[]", + internalType: "address[]", + }, + ], + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "placeStreamOnNode", + inputs: [ + { + name: "streamId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "removeStreamFromNode", + inputs: [ + { + name: "streamId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setStreamLastMiniblock", + inputs: [ + { + name: "streamId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "prevMiniBlockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "lastMiniblockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "lastMiniblockNum", + type: "uint64", + internalType: "uint64", + }, + { + name: "isSealed", + type: "bool", + internalType: "bool", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setStreamLastMiniblockBatch", + inputs: [ + { + name: "miniblocks", + type: "tuple[]", + internalType: "struct SetMiniblock[]", + components: [ + { + name: "streamId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "prevMiniBlockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "lastMiniblockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "lastMiniblockNum", + type: "uint64", + internalType: "uint64", + }, + { + name: "isSealed", + type: "bool", + internalType: "bool", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "StreamAllocated", + inputs: [ + { + name: "streamId", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + { + name: "nodes", + type: "address[]", + indexed: false, + internalType: "address[]", + }, + { + name: "genesisMiniblockHash", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + { + name: "genesisMiniblock", + type: "bytes", + indexed: false, + internalType: "bytes", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "StreamLastMiniblockUpdateFailed", + inputs: [ + { + name: "streamId", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + { + name: "lastMiniblockHash", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + { + name: "lastMiniblockNum", + type: "uint64", + indexed: false, + internalType: "uint64", + }, + { + name: "reason", + type: "string", + indexed: false, + internalType: "string", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "StreamLastMiniblockUpdated", + inputs: [ + { + name: "streamId", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + { + name: "lastMiniblockHash", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + { + name: "lastMiniblockNum", + type: "uint64", + indexed: false, + internalType: "uint64", + }, + { + name: "isSealed", + type: "bool", + indexed: false, + internalType: "bool", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "StreamPlacementUpdated", + inputs: [ + { + name: "streamId", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + { + name: "nodeAddress", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "isAdded", + type: "bool", + indexed: false, + internalType: "bool", + }, + ], + anonymous: false, + }, +] as const; + +export class IStreamRegistry__factory { + static readonly abi = _abi; + static createInterface(): IStreamRegistryInterface { + return new utils.Interface(_abi) as IStreamRegistryInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IStreamRegistry { + return new Contract(address, _abi, signerOrProvider) as IStreamRegistry; + } +} diff --git a/packages/generated/dev/typings/factories/IWalletLink__factory.ts b/packages/generated/dev/typings/factories/IWalletLink__factory.ts new file mode 100644 index 000000000..4c9f56053 --- /dev/null +++ b/packages/generated/dev/typings/factories/IWalletLink__factory.ts @@ -0,0 +1,338 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IWalletLink, IWalletLinkInterface } from "../IWalletLink"; + +const _abi = [ + { + type: "function", + name: "checkIfLinked", + inputs: [ + { + name: "rootKey", + type: "address", + internalType: "address", + }, + { + name: "wallet", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getLatestNonceForRootKey", + inputs: [ + { + name: "rootKey", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getRootKeyForWallet", + inputs: [ + { + name: "wallet", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "rootKey", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getWalletsByRootKey", + inputs: [ + { + name: "rootKey", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "wallets", + type: "address[]", + internalType: "address[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "linkCallerToRootKey", + inputs: [ + { + name: "rootWallet", + type: "tuple", + internalType: "struct IWalletLinkBase.LinkedWallet", + components: [ + { + name: "addr", + type: "address", + internalType: "address", + }, + { + name: "signature", + type: "bytes", + internalType: "bytes", + }, + ], + }, + { + name: "nonce", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "linkWalletToRootKey", + inputs: [ + { + name: "wallet", + type: "tuple", + internalType: "struct IWalletLinkBase.LinkedWallet", + components: [ + { + name: "addr", + type: "address", + internalType: "address", + }, + { + name: "signature", + type: "bytes", + internalType: "bytes", + }, + ], + }, + { + name: "rootWallet", + type: "tuple", + internalType: "struct IWalletLinkBase.LinkedWallet", + components: [ + { + name: "addr", + type: "address", + internalType: "address", + }, + { + name: "signature", + type: "bytes", + internalType: "bytes", + }, + ], + }, + { + name: "nonce", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "removeLink", + inputs: [ + { + name: "wallet", + type: "address", + internalType: "address", + }, + { + name: "rootWallet", + type: "tuple", + internalType: "struct IWalletLinkBase.LinkedWallet", + components: [ + { + name: "addr", + type: "address", + internalType: "address", + }, + { + name: "signature", + type: "bytes", + internalType: "bytes", + }, + ], + }, + { + name: "nonce", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "LinkWalletToRootKey", + inputs: [ + { + name: "wallet", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "rootKey", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "RemoveLink", + inputs: [ + { + name: "wallet", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "secondWallet", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "WalletLink__CannotLinkToRootWallet", + inputs: [ + { + name: "wallet", + type: "address", + internalType: "address", + }, + { + name: "rootKey", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "WalletLink__CannotLinkToSelf", + inputs: [], + }, + { + type: "error", + name: "WalletLink__CannotRemoveRootWallet", + inputs: [], + }, + { + type: "error", + name: "WalletLink__InvalidAddress", + inputs: [], + }, + { + type: "error", + name: "WalletLink__InvalidSignature", + inputs: [], + }, + { + type: "error", + name: "WalletLink__LinkAlreadyExists", + inputs: [ + { + name: "wallet", + type: "address", + internalType: "address", + }, + { + name: "rootKey", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "WalletLink__LinkedToAnotherRootKey", + inputs: [ + { + name: "wallet", + type: "address", + internalType: "address", + }, + { + name: "rootKey", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "WalletLink__NotLinked", + inputs: [ + { + name: "wallet", + type: "address", + internalType: "address", + }, + { + name: "rootKey", + type: "address", + internalType: "address", + }, + ], + }, +] as const; + +export class IWalletLink__factory { + static readonly abi = _abi; + static createInterface(): IWalletLinkInterface { + return new utils.Interface(_abi) as IWalletLinkInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IWalletLink { + return new Contract(address, _abi, signerOrProvider) as IWalletLink; + } +} diff --git a/packages/generated/dev/typings/factories/Member__factory.ts b/packages/generated/dev/typings/factories/Member__factory.ts new file mode 100644 index 000000000..5def6f4a5 --- /dev/null +++ b/packages/generated/dev/typings/factories/Member__factory.ts @@ -0,0 +1,877 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Signer, + utils, + Contract, + ContractFactory, + BytesLike, + Overrides, +} from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../common"; +import type { Member, MemberInterface } from "../Member"; + +const _abi = [ + { + type: "constructor", + inputs: [ + { + name: "name_", + type: "string", + internalType: "string", + }, + { + name: "symbol_", + type: "string", + internalType: "string", + }, + { + name: "baseURI_", + type: "string", + internalType: "string", + }, + { + name: "merkleRoot_", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "MINT_PRICE", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "TOTAL_SUPPLY", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "_hasMinted", + inputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "approve", + inputs: [ + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "balanceOf", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "baseURI", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "currentTokenId", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getApproved", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isApprovedForAll", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "name", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "owner", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "ownerOf", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "privateMint", + inputs: [ + { + name: "recipient", + type: "address", + internalType: "address", + }, + { + name: "allowance", + type: "uint256", + internalType: "uint256", + }, + { + name: "proof", + type: "bytes32[]", + internalType: "bytes32[]", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "payable", + }, + { + type: "function", + name: "publicMint", + inputs: [ + { + name: "recipient", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "payable", + }, + { + type: "function", + name: "renounceOwnership", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "safeTransferFrom", + inputs: [ + { + name: "from", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "safeTransferFrom", + inputs: [ + { + name: "from", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + { + name: "data", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setApprovalForAll", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "approved", + type: "bool", + internalType: "bool", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setBaseURI", + inputs: [ + { + name: "baseURI_", + type: "string", + internalType: "string", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "startPublicMint", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "startWaitlistMint", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "supportsInterface", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + internalType: "bytes4", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "symbol", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "tokenURI", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "transferFrom", + inputs: [ + { + name: "from", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "transferOwnership", + inputs: [ + { + name: "newOwner", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "withdrawPayments", + inputs: [ + { + name: "payee", + type: "address", + internalType: "address payable", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "Approval", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "approved", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ApprovalForAll", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "approved", + type: "bool", + indexed: false, + internalType: "bool", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MintStateChanged", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "prevState", + type: "uint8", + indexed: true, + internalType: "enum Member.MintState", + }, + { + name: "newState", + type: "uint8", + indexed: true, + internalType: "enum Member.MintState", + }, + { + name: "timestamp", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Minted", + inputs: [ + { + name: "recipient", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "timestamp", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OwnershipTransferred", + inputs: [ + { + name: "previousOwner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newOwner", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Transfer", + inputs: [ + { + name: "from", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "AlreadyMinted", + inputs: [], + }, + { + type: "error", + name: "ERC721IncorrectOwner", + inputs: [ + { + name: "sender", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + { + name: "owner", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "ERC721InsufficientApproval", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "ERC721InvalidApprover", + inputs: [ + { + name: "approver", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "ERC721InvalidOperator", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "ERC721InvalidOwner", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "ERC721InvalidReceiver", + inputs: [ + { + name: "receiver", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "ERC721InvalidSender", + inputs: [ + { + name: "sender", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "ERC721NonexistentToken", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "InvalidAddress", + inputs: [], + }, + { + type: "error", + name: "InvalidMintState", + inputs: [], + }, + { + type: "error", + name: "InvalidProof", + inputs: [], + }, + { + type: "error", + name: "MaxSupplyReached", + inputs: [], + }, + { + type: "error", + name: "MintPriceNotPaid", + inputs: [], + }, + { + type: "error", + name: "NonExistentTokenURI", + inputs: [], + }, + { + type: "error", + name: "NotAllowed", + inputs: [], + }, + { + type: "error", + name: "OwnableInvalidOwner", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "OwnableUnauthorizedAccount", + inputs: [ + { + name: "account", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "WithdrawTransfer", + inputs: [], + }, +] as const; + +const _bytecode = + "0x60a06040523480156200001157600080fd5b5060405162001d7438038062001d748339810160408190526200003491620001d1565b3384846000620000458382620002fb565b506001620000548282620002fb565b5050506001600160a01b0381166200008657604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6200009181620000b7565b506007620000a08382620002fb565b5060805250506009805460ff1916905550620003c7565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200013157600080fd5b81516001600160401b03808211156200014e576200014e62000109565b604051601f8301601f19908116603f0116810190828211818310171562000179576200017962000109565b81604052838152602092508660208588010111156200019757600080fd5b600091505b83821015620001bb57858201830151818301840152908201906200019c565b6000602085830101528094505050505092915050565b60008060008060808587031215620001e857600080fd5b84516001600160401b03808211156200020057600080fd5b6200020e888389016200011f565b955060208701519150808211156200022557600080fd5b62000233888389016200011f565b945060408701519150808211156200024a57600080fd5b5062000259878288016200011f565b606096909601519497939650505050565b600181811c908216806200027f57607f821691505b602082108103620002a057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002f6576000816000526020600020601f850160051c81016020861015620002d15750805b601f850160051c820191505b81811015620002f257828155600101620002dd565b5050505b505050565b81516001600160401b0381111562000317576200031762000109565b6200032f816200032884546200026a565b84620002a6565b602080601f8311600181146200036757600084156200034e5750858301515b600019600386901b1c1916600185901b178555620002f2565b600085815260208120601f198616915b82811015620003985788860151825594840194600190910190840162000377565b5085821015620003b75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b608051611991620003e3600039600061093a01526119916000f3fe60806040526004361061019b5760003560e01c8063715018a6116100ec578063a839e5011161008a578063c87b56dd11610064578063c87b56dd14610454578063d92d1bd614610474578063e985e9c5146104a4578063f2fde38b146104c457600080fd5b8063a839e50114610403578063b88d4fde14610418578063c002d23d1461043857600080fd5b8063902d55a5116100c6578063902d55a5146103a557806395d89b41146103bb5780639886a902146103d0578063a22cb465146103e357600080fd5b8063715018a61461035d57806376c64c62146103725780638da5cb5b1461038757600080fd5b806331b3eb941161015957806355f804b31161013357806355f804b3146102e85780636352211e146103085780636c0360eb1461032857806370a082311461033d57600080fd5b806331b3eb941461029557806332a93a3a146102b557806342842e0e146102c857600080fd5b80629a9b7b146101a057806301ffc9a7146101c957806306fdde03146101f9578063081812fc1461021b578063095ea7b31461025357806323b872dd14610275575b600080fd5b3480156101ac57600080fd5b506101b6600a5481565b6040519081526020015b60405180910390f35b3480156101d557600080fd5b506101e96101e436600461139c565b6104e4565b60405190151581526020016101c0565b34801561020557600080fd5b5061020e610536565b6040516101c091906113ff565b34801561022757600080fd5b5061023b610236366004611412565b6105c8565b6040516001600160a01b0390911681526020016101c0565b34801561025f57600080fd5b5061027361026e366004611440565b6105f1565b005b34801561028157600080fd5b5061027361029036600461146c565b610600565b3480156102a157600080fd5b506102736102b03660046114ad565b610690565b6101b66102c33660046114ad565b610711565b3480156102d457600080fd5b506102736102e336600461146c565b610748565b3480156102f457600080fd5b50610273610303366004611556565b610763565b34801561031457600080fd5b5061023b610323366004611412565b610777565b34801561033457600080fd5b5061020e610782565b34801561034957600080fd5b506101b66103583660046114ad565b610810565b34801561036957600080fd5b50610273610858565b34801561037e57600080fd5b5061027361086c565b34801561039357600080fd5b506006546001600160a01b031661023b565b3480156103b157600080fd5b506101b66109c481565b3480156103c757600080fd5b5061020e610888565b6101b66103de36600461159f565b610897565b3480156103ef57600080fd5b506102736103fe36600461162b565b610995565b34801561040f57600080fd5b506102736109a0565b34801561042457600080fd5b50610273610433366004611669565b6109bc565b34801561044457600080fd5b506101b667011c37937e08000081565b34801561046057600080fd5b5061020e61046f366004611412565b6109d3565b34801561048057600080fd5b506101e961048f3660046114ad565b60086020526000908152604090205460ff1681565b3480156104b057600080fd5b506101e96104bf3660046116e9565b610a59565b3480156104d057600080fd5b506102736104df3660046114ad565b610a87565b60006001600160e01b031982166380ac58cd60e01b148061051557506001600160e01b03198216635b5e139f60e01b145b8061053057506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461054590611717565b80601f016020809104026020016040519081016040528092919081815260200182805461057190611717565b80156105be5780601f10610593576101008083540402835291602001916105be565b820191906000526020600020905b8154815290600101906020018083116105a157829003601f168201915b5050505050905090565b60006105d382610ac5565b506000828152600460205260409020546001600160a01b0316610530565b6105fc828233610afe565b5050565b6001600160a01b03821661062f57604051633250574960e11b8152600060048201526024015b60405180910390fd5b600061063c838333610b0b565b9050836001600160a01b0316816001600160a01b03161461068a576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610626565b50505050565b610698610c04565b60405147906000906001600160a01b0384169083908381818185875af1925050503d80600081146106e5576040519150601f19603f3d011682016040523d82523d6000602084013e6106ea565b606091505b505090508061070c5760405163d23a9e8960e01b815260040160405180910390fd5b505050565b600061071c82610c31565b610724610c58565b61072c610c80565b61073582610ca4565b61073f6002610cde565b61053082610d25565b61070c838383604051806020016040528060008152506109bc565b61076b610c04565b60076105fc82826117a1565b600061053082610ac5565b6007805461078f90611717565b80601f01602080910402602001604051908101604052809291908181526020018280546107bb90611717565b80156108085780601f106107dd57610100808354040283529160200191610808565b820191906000526020600020905b8154815290600101906020018083116107eb57829003601f168201915b505050505081565b60006001600160a01b03821661083c576040516322718ad960e21b815260006004820152602401610626565b506001600160a01b031660009081526003602052604090205490565b610860610c04565b61086a6000610db1565b565b610874610c04565b61087e6001610cde565b61086a6002610e03565b60606001805461054590611717565b60006108a285610c31565b6108aa610c58565b6108b2610c80565b6108bb85610ca4565b6108c484610e88565b6040516bffffffffffffffffffffffff19606087901b166020820152603481018590526000906054016040516020818303038152906040528051906020012090506109658484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f00000000000000000000000000000000000000000000000000000000000000009250859150610ecd9050565b610982576040516309bde33960e01b815260040160405180910390fd5b61098b86610d25565b9695505050505050565b6105fc338383610ee3565b6109a8610c04565b6109b26000610cde565b61086a6001610e03565b6109c7848484610600565b61068a84848484610f82565b606060006109e083610777565b6001600160a01b031603610a075760405163d872946b60e01b815260040160405180910390fd5b600060078054610a1690611717565b905011610a325760405180602001604052806000815250610530565b6007604051602001610a449190611861565b60405160208183030381529060405292915050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610a8f610c04565b6001600160a01b038116610ab957604051631e4fbdf760e01b815260006004820152602401610626565b610ac281610db1565b50565b6000818152600260205260408120546001600160a01b03168061053057604051637e27328960e01b815260048101849052602401610626565b61070c83838360016110ab565b6000828152600260205260408120546001600160a01b0390811690831615610b3857610b388184866111b1565b6001600160a01b03811615610b7657610b556000856000806110ab565b6001600160a01b038116600090815260036020526040902080546000190190555b6001600160a01b03851615610ba5576001600160a01b0385166000908152600360205260409020805460010190555b60008481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6006546001600160a01b0316331461086a5760405163118cdaa760e01b8152336004820152602401610626565b6001600160a01b038116610ac25760405163e6c4247b60e01b815260040160405180910390fd5b67011c37937e080000341461086a576040516310f0c8f160e11b815260040160405180910390fd5b6109c4600a541061086a5760405163d05cb60960e01b815260040160405180910390fd5b6001600160a01b03811660009081526008602052604090205460ff1615610ac257604051631bbdf5c560e31b815260040160405180910390fd5b806002811115610cf057610cf06118ee565b60095460ff166002811115610d0757610d076118ee565b14610ac25760405163a1f6623960e01b815260040160405180910390fd5b6001600160a01b0381166000908152600860205260408120805460ff19166001179055600a805490819083610d5983611904565b9190505550610d688382611215565b604080518281524260208201526001600160a01b038516917f25b428dfde728ccfaddad7e29e4ac23c24ed7fd1a6e3e3f91894a9a073f5dfff910160405180910390a292915050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6009805460ff811691839160ff19166001836002811115610e2657610e266118ee565b0217905550816002811115610e3d57610e3d6118ee565b816002811115610e4f57610e4f6118ee565b60405142815233907f7a5907205f46c7df4a68b33c1da8921886b57f025f0ec67a42c38d2c2013a7849060200160405180910390a45050565b600060095460ff166002811115610ea157610ea16118ee565b148015610eaf575080600114155b15610ac257604051631eb49d6d60e11b815260040160405180910390fd5b600082610eda858461122f565b14949350505050565b6001600160a01b038216610f1557604051630b61174360e31b81526001600160a01b0383166004820152602401610626565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561068a57604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290610fc490339088908790879060040161192b565b6020604051808303816000875af1925050508015610fff575060408051601f3d908101601f19168201909252610ffc9181019061195e565b60015b611068573d80801561102d576040519150601f19603f3d011682016040523d82523d6000602084013e611032565b606091505b50805160000361106057604051633250574960e11b81526001600160a01b0385166004820152602401610626565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146110a457604051633250574960e11b81526001600160a01b0385166004820152602401610626565b5050505050565b80806110bf57506001600160a01b03821615155b156111815760006110cf84610ac5565b90506001600160a01b038316158015906110fb5750826001600160a01b0316816001600160a01b031614155b801561110e575061110c8184610a59565b155b156111375760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610626565b811561117f5783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6111bc838383611272565b61070c576001600160a01b0383166111ea57604051637e27328960e01b815260048101829052602401610626565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610626565b6105fc8282604051806020016040528060008152506112d8565b600081815b845181101561126a57611260828683815181106112535761125361197b565b60200260200101516112ef565b9150600101611234565b509392505050565b60006001600160a01b038316158015906112d05750826001600160a01b0316846001600160a01b031614806112ac57506112ac8484610a59565b806112d057506000828152600460205260409020546001600160a01b038481169116145b949350505050565b6112e28383611321565b61070c6000848484610f82565b600081831061130b57600082815260208490526040902061131a565b60008381526020839052604090205b9392505050565b6001600160a01b03821661134b57604051633250574960e11b815260006004820152602401610626565b600061135983836000610b0b565b90506001600160a01b0381161561070c576040516339e3563760e11b815260006004820152602401610626565b6001600160e01b031981168114610ac257600080fd5b6000602082840312156113ae57600080fd5b813561131a81611386565b6000815180845260005b818110156113df576020818501810151868301820152016113c3565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061131a60208301846113b9565b60006020828403121561142457600080fd5b5035919050565b6001600160a01b0381168114610ac257600080fd5b6000806040838503121561145357600080fd5b823561145e8161142b565b946020939093013593505050565b60008060006060848603121561148157600080fd5b833561148c8161142b565b9250602084013561149c8161142b565b929592945050506040919091013590565b6000602082840312156114bf57600080fd5b813561131a8161142b565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156114fb576114fb6114ca565b604051601f8501601f19908116603f01168101908282118183101715611523576115236114ca565b8160405280935085815286868601111561153c57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561156857600080fd5b813567ffffffffffffffff81111561157f57600080fd5b8201601f8101841361159057600080fd5b6112d0848235602084016114e0565b600080600080606085870312156115b557600080fd5b84356115c08161142b565b935060208501359250604085013567ffffffffffffffff808211156115e457600080fd5b818701915087601f8301126115f857600080fd5b81358181111561160757600080fd5b8860208260051b850101111561161c57600080fd5b95989497505060200194505050565b6000806040838503121561163e57600080fd5b82356116498161142b565b91506020830135801515811461165e57600080fd5b809150509250929050565b6000806000806080858703121561167f57600080fd5b843561168a8161142b565b9350602085013561169a8161142b565b925060408501359150606085013567ffffffffffffffff8111156116bd57600080fd5b8501601f810187136116ce57600080fd5b6116dd878235602084016114e0565b91505092959194509250565b600080604083850312156116fc57600080fd5b82356117078161142b565b9150602083013561165e8161142b565b600181811c9082168061172b57607f821691505b60208210810361174b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561070c576000816000526020600020601f850160051c8101602086101561177a5750805b601f850160051c820191505b8181101561179957828155600101611786565b505050505050565b815167ffffffffffffffff8111156117bb576117bb6114ca565b6117cf816117c98454611717565b84611751565b602080601f83116001811461180457600084156117ec5750858301515b600019600386901b1c1916600185901b178555611799565b600085815260208120601f198616915b8281101561183357888601518255948401946001909101908401611814565b50858210156118515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600080835461186f81611717565b60018281168015611887576001811461189c576118cb565b60ff19841687528215158302870194506118cb565b8760005260208060002060005b858110156118c25781548a8201529084019082016118a9565b50505082870194505b50506e636f756e63696c6d6574616461746160881b83525050600f019392505050565b634e487b7160e01b600052602160045260246000fd5b60006001820161192457634e487b7160e01b600052601160045260246000fd5b5060010190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061098b908301846113b9565b60006020828403121561197057600080fd5b815161131a81611386565b634e487b7160e01b600052603260045260246000fd"; + +type MemberConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: MemberConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class Member__factory extends ContractFactory { + constructor(...args: MemberConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + baseURI_: PromiseOrValue, + merkleRoot_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy( + name_, + symbol_, + baseURI_, + merkleRoot_, + overrides || {} + ) as Promise; + } + override getDeployTransaction( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + baseURI_: PromiseOrValue, + merkleRoot_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction( + name_, + symbol_, + baseURI_, + merkleRoot_, + overrides || {} + ); + } + override attach(address: string): Member { + return super.attach(address) as Member; + } + override connect(signer: Signer): Member__factory { + return super.connect(signer) as Member__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): MemberInterface { + return new utils.Interface(_abi) as MemberInterface; + } + static connect(address: string, signerOrProvider: Signer | Provider): Member { + return new Contract(address, _abi, signerOrProvider) as Member; + } +} diff --git a/packages/generated/dev/typings/factories/MembershipFacet__factory.ts b/packages/generated/dev/typings/factories/MembershipFacet__factory.ts new file mode 100644 index 000000000..245698ca3 --- /dev/null +++ b/packages/generated/dev/typings/factories/MembershipFacet__factory.ts @@ -0,0 +1,1844 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../common"; +import type { + MembershipFacet, + MembershipFacetInterface, +} from "../MembershipFacet"; + +const _abi = [ + { + type: "function", + name: "__ERC721A_init", + inputs: [ + { + name: "name_", + type: "string", + internalType: "string", + }, + { + name: "symbol_", + type: "string", + internalType: "string", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "__EntitlementGated_init", + inputs: [ + { + name: "entitlementChecker", + type: "address", + internalType: "contract IEntitlementChecker", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "__Membership_init", + inputs: [ + { + name: "info", + type: "tuple", + internalType: "struct IMembershipBase.Membership", + components: [ + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "symbol", + type: "string", + internalType: "string", + }, + { + name: "price", + type: "uint256", + internalType: "uint256", + }, + { + name: "maxSupply", + type: "uint256", + internalType: "uint256", + }, + { + name: "duration", + type: "uint64", + internalType: "uint64", + }, + { + name: "currency", + type: "address", + internalType: "address", + }, + { + name: "feeRecipient", + type: "address", + internalType: "address", + }, + { + name: "freeAllocation", + type: "uint256", + internalType: "uint256", + }, + { + name: "pricingModule", + type: "address", + internalType: "address", + }, + ], + }, + { + name: "spaceFactory", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "_getMembershipCurrency", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "_getMembershipFreeAllocation", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "_getMembershipImage", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "_getMembershipPrice", + inputs: [ + { + name: "totalSupply", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "_getMembershipSupplyLimit", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "_getPricingModule", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "_getSpaceFactory", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "_setMembershipFreeAllocation", + inputs: [ + { + name: "newAllocation", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "_setMembershipSupplyLimit", + inputs: [ + { + name: "newLimit", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "_setPricingModule", + inputs: [ + { + name: "newPricingModule", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "approve", + inputs: [ + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "balanceOf", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "expiresAt", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getApproved", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMembershipCurrency", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMembershipDuration", + inputs: [], + outputs: [ + { + name: "", + type: "uint64", + internalType: "uint64", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMembershipFreeAllocation", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMembershipImage", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMembershipLimit", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMembershipPrice", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMembershipPricingModule", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMembershipRenewalPrice", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getRuleData", + inputs: [ + { + name: "transactionId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct IRuleEntitlement.RuleData", + components: [ + { + name: "operations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.Operation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CombinedOperationType", + }, + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + name: "checkOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.CheckOperation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CheckOperationType", + }, + { + name: "chainId", + type: "uint256", + internalType: "uint256", + }, + { + name: "contractAddress", + type: "address", + internalType: "address", + }, + { + name: "threshold", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "logicalOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.LogicalOperation[]", + components: [ + { + name: "logOpType", + type: "uint8", + internalType: "enum IRuleEntitlement.LogicalOperationType", + }, + { + name: "leftOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "rightOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getSpaceFactory", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isApprovedForAll", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "joinSpace", + inputs: [ + { + name: "receiver", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "joinSpaceWithReferral", + inputs: [ + { + name: "receiver", + type: "address", + internalType: "address", + }, + { + name: "referrer", + type: "address", + internalType: "address", + }, + { + name: "referralCode", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "name", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "ownerOf", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "postEntitlementCheckResult", + inputs: [ + { + name: "transactionId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "result", + type: "uint8", + internalType: "enum IEntitlementGatedBase.NodeVoteStatus", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "renewMembership", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "safeTransferFrom", + inputs: [ + { + name: "from", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "safeTransferFrom", + inputs: [ + { + name: "from", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + { + name: "_data", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "setApprovalForAll", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "approved", + type: "bool", + internalType: "bool", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setMembershipFreeAllocation", + inputs: [ + { + name: "newAllocation", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setMembershipImage", + inputs: [ + { + name: "newImage", + type: "string", + internalType: "string", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setMembershipLimit", + inputs: [ + { + name: "newLimit", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setMembershipPrice", + inputs: [ + { + name: "newPrice", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setMembershipPricingModule", + inputs: [ + { + name: "pricingModule", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "symbol", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "tokenURI", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "totalSupply", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "transferFrom", + inputs: [ + { + name: "from", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "withdraw", + inputs: [ + { + name: "account", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "Approval", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "approved", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ApprovalForAll", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "approved", + type: "bool", + indexed: false, + internalType: "bool", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Banned", + inputs: [ + { + name: "moderator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ConsecutiveTransfer", + inputs: [ + { + name: "fromTokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + { + name: "toTokenId", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "from", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "EntitlementCheckResultPosted", + inputs: [ + { + name: "transactionId", + type: "bytes32", + indexed: true, + internalType: "bytes32", + }, + { + name: "result", + type: "uint8", + indexed: false, + internalType: "enum IEntitlementGatedBase.NodeVoteStatus", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceAdded", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceRemoved", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MembershipCurrencyUpdated", + inputs: [ + { + name: "currency", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MembershipFeeRecipientUpdated", + inputs: [ + { + name: "recipient", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MembershipFreeAllocationUpdated", + inputs: [ + { + name: "allocation", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MembershipLimitUpdated", + inputs: [ + { + name: "limit", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MembershipPriceUpdated", + inputs: [ + { + name: "price", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MembershipTokenIssued", + inputs: [ + { + name: "recipient", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MembershipTokenRejected", + inputs: [ + { + name: "recipient", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MembershipWithdrawal", + inputs: [ + { + name: "recipient", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "amount", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Membership__ReferralCreated", + inputs: [ + { + name: "code", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + { + name: "bps", + type: "uint16", + indexed: false, + internalType: "uint16", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Membership__ReferralRemoved", + inputs: [ + { + name: "code", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Membership__ReferralTimeCreated", + inputs: [ + { + name: "code", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + { + name: "bps", + type: "uint16", + indexed: false, + internalType: "uint16", + }, + { + name: "startTime", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "endTime", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OwnershipTransferred", + inputs: [ + { + name: "previousOwner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newOwner", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Paused", + inputs: [ + { + name: "account", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "RoleCreated", + inputs: [ + { + name: "creator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "roleId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "RoleRemoved", + inputs: [ + { + name: "remover", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "roleId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "RoleUpdated", + inputs: [ + { + name: "updater", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "roleId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "SubscriptionUpdate", + inputs: [ + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + { + name: "expiration", + type: "uint64", + indexed: false, + internalType: "uint64", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Transfer", + inputs: [ + { + name: "from", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Unbanned", + inputs: [ + { + name: "moderator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Unpaused", + inputs: [ + { + name: "account", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "AddressEmptyCode", + inputs: [ + { + name: "target", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "AddressInsufficientBalance", + inputs: [ + { + name: "account", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "ApprovalCallerNotOwnerNorApproved", + inputs: [], + }, + { + type: "error", + name: "ApprovalQueryForNonexistentToken", + inputs: [], + }, + { + type: "error", + name: "BalanceQueryForZeroAddress", + inputs: [], + }, + { + type: "error", + name: "Banning__AlreadyBanned", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "Banning__CannotBanSelf", + inputs: [], + }, + { + type: "error", + name: "Banning__InvalidTokenId", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "Banning__NotBanned", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "Dispatcher__InvalidCaller", + inputs: [], + }, + { + type: "error", + name: "Dispatcher__InvalidValue", + inputs: [], + }, + { + type: "error", + name: "ERC5643__DurationZero", + inputs: [], + }, + { + type: "error", + name: "ERC5643__InvalidTokenId", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "ERC5643__NotApprovedOrOwner", + inputs: [], + }, + { + type: "error", + name: "ERC5643__SubscriptionNotRenewable", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "EntitlementGated_InvalidAddress", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_NodeAlreadyVoted", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_NodeNotFound", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_TransactionCheckAlreadyCompleted", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_TransactionCheckAlreadyRegistered", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_TransactionNotRegistered", + inputs: [], + }, + { + type: "error", + name: "Entitlement__InvalidValue", + inputs: [], + }, + { + type: "error", + name: "Entitlement__NotAllowed", + inputs: [], + }, + { + type: "error", + name: "Entitlement__NotMember", + inputs: [], + }, + { + type: "error", + name: "Entitlement__ValueAlreadyExists", + inputs: [], + }, + { + type: "error", + name: "FailedInnerCall", + inputs: [], + }, + { + type: "error", + name: "Initializable_InInitializingState", + inputs: [], + }, + { + type: "error", + name: "Initializable_NotInInitializingState", + inputs: [], + }, + { + type: "error", + name: "Introspection_AlreadySupported", + inputs: [], + }, + { + type: "error", + name: "Introspection_NotSupported", + inputs: [], + }, + { + type: "error", + name: "Membership__AlreadyMember", + inputs: [], + }, + { + type: "error", + name: "Membership__InsufficientAllowance", + inputs: [], + }, + { + type: "error", + name: "Membership__InsufficientPayment", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidAddress", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidCurrency", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidDuration", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidFeeRecipient", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidFreeAllocation", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidLimit", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidMaxSupply", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidPrice", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidPricingModule", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidReferralBps", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidReferralCode", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidReferralTime", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidTokenId", + inputs: [], + }, + { + type: "error", + name: "Membership__MaxSupplyReached", + inputs: [], + }, + { + type: "error", + name: "Membership__NotExpired", + inputs: [], + }, + { + type: "error", + name: "Membership__PriceTooLow", + inputs: [], + }, + { + type: "error", + name: "MintERC2309QuantityExceedsLimit", + inputs: [], + }, + { + type: "error", + name: "MintToZeroAddress", + inputs: [], + }, + { + type: "error", + name: "MintZeroQuantity", + inputs: [], + }, + { + type: "error", + name: "Ownable__NotOwner", + inputs: [ + { + name: "account", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "Ownable__ZeroAddress", + inputs: [], + }, + { + type: "error", + name: "OwnerQueryForNonexistentToken", + inputs: [], + }, + { + type: "error", + name: "OwnershipNotInitializedForExtraData", + inputs: [], + }, + { + type: "error", + name: "Pausable__NotPaused", + inputs: [], + }, + { + type: "error", + name: "Pausable__Paused", + inputs: [], + }, + { + type: "error", + name: "ReentrancyGuard__ReentrantCall", + inputs: [], + }, + { + type: "error", + name: "Roles__EntitlementAlreadyExists", + inputs: [], + }, + { + type: "error", + name: "Roles__EntitlementDoesNotExist", + inputs: [], + }, + { + type: "error", + name: "Roles__InvalidEntitlementAddress", + inputs: [], + }, + { + type: "error", + name: "Roles__InvalidPermission", + inputs: [], + }, + { + type: "error", + name: "Roles__PermissionAlreadyExists", + inputs: [], + }, + { + type: "error", + name: "Roles__PermissionDoesNotExist", + inputs: [], + }, + { + type: "error", + name: "Roles__RoleDoesNotExist", + inputs: [], + }, + { + type: "error", + name: "SafeERC20FailedOperation", + inputs: [ + { + name: "token", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "TransferCallerNotOwnerNorApproved", + inputs: [], + }, + { + type: "error", + name: "TransferFromIncorrectOwner", + inputs: [], + }, + { + type: "error", + name: "TransferToNonERC721ReceiverImplementer", + inputs: [], + }, + { + type: "error", + name: "TransferToZeroAddress", + inputs: [], + }, + { + type: "error", + name: "URIQueryForNonexistentToken", + inputs: [], + }, +] as const; + +const _bytecode = + "0x60806040523480156200001157600080fd5b506200001c62000022565b620000ca565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16156200006f576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff9081161015620000c757805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6152c880620000da6000396000f3fe6080604052600436106102885760003560e01c806377460cd31161015a578063a22cb465116100c1578063d2f01f191161007a578063d2f01f1914610745578063d33d934514610765578063df9a9fe61461077a578063e847abdd1461079a578063e985e9c5146107af578063f9d5d22c146107df57600080fd5b8063a22cb465146106b5578063ac7ee626146106d5578063b3a5be6d146106ea578063b88d4fde146106ff578063c87b56dd14610712578063c9f7c8331461073257600080fd5b80638c625b06116101135780638c625b061461061657806392c399ff1461062957806393b13cb71461065657806395d600c81461066b57806395d89b411461068057806397fb7c1e1461069557600080fd5b806377460cd31461057757806379dda5851461058c5780637adc9cbe146105a15780637c9669ac146105c15780638120f0ba146105d45780638934207f1461060157600080fd5b80634c2abfbe116101fe57806369d5f38a116101b757806369d5f38a146104cd57806369d9346b146104ed578063702515631461050d578063706b8e091461052257806370a082311461053757806373fc5a051461055757600080fd5b80634c2abfbe1461041857806351cff8d9146104385780635803909f146104585780635becd24a146104785780636352211e14610498578063657e45e8146104b857600080fd5b806317c957091161025057806317c957091461034857806318160ddd1461039d57806323b872dd146103b25780633ded10de146103c557806342842e0e146103e55780634739e805146103f857600080fd5b806306fdde031461028d578063081812fc146102b8578063095ea7b3146102f05780630ef1be5f146103055780631278076a14610325575b600080fd5b34801561029957600080fd5b506102a26107ff565b6040516102af9190614348565b60405180910390f35b3480156102c457600080fd5b506102d86102d336600461435b565b61089a565b6040516001600160a01b0390911681526020016102af565b6103036102fe366004614399565b6108ab565b005b34801561031157600080fd5b506103036103203660046143c5565b6108bb565b34801561033157600080fd5b5061033a61093a565b6040519081526020016102af565b34801561035457600080fd5b5061033a61036336600461435b565b60009081527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce0060205260409020546001600160401b031690565b3480156103a957600080fd5b5061033a61094c565b6103036103c0366004614436565b610956565b3480156103d157600080fd5b5061033a6103e036600461435b565b610b4d565b6103036103f3366004614436565b610cdc565b34801561040457600080fd5b50610303610413366004614484565b610cfc565b34801561042457600080fd5b50610303610433366004614629565b610d65565b34801561044457600080fd5b50610303610453366004614732565b610dc9565b34801561046457600080fd5b5061033a61047336600461435b565b610e6b565b34801561048457600080fd5b5061030361049336600461435b565b610e7e565b3480156104a457600080fd5b506102d86104b336600461435b565b610f03565b3480156104c457600080fd5b506102d8610f0e565b3480156104d957600080fd5b506103036104e836600461435b565b610f18565b3480156104f957600080fd5b50610303610508366004614732565b610fc6565b34801561051957600080fd5b506102d8610ff3565b34801561052e57600080fd5b5061033a61100f565b34801561054357600080fd5b5061033a610552366004614732565b611019565b34801561056357600080fd5b5061030361057236600461435b565b611024565b34801561058357600080fd5b506102d8611034565b34801561059857600080fd5b506102d8611050565b3480156105ad57600080fd5b506103036105bc366004614732565b61105a565b6103036105cf36600461435b565b61109e565b3480156105e057600080fd5b506105e96111fb565b6040516001600160401b0390911681526020016102af565b34801561060d57600080fd5b5061033a611205565b610303610624366004614732565b611218565b34801561063557600080fd5b5061064961064436600461474f565b61162a565b6040516102af9190614862565b34801561066257600080fd5b506102a261165f565b34801561067757600080fd5b5061033a611669565b34801561068c57600080fd5b506102a2611673565b3480156106a157600080fd5b506103036106b036600461435b565b61168b565b3480156106c157600080fd5b506103036106d0366004614909565b6116e0565b3480156106e157600080fd5b506102d861175d565b3480156106f657600080fd5b5061033a611779565b61030361070d366004614942565b611818565b34801561071e57600080fd5b506102a261072d36600461435b565b611862565b610303610740366004614436565b6118f2565b34801561075157600080fd5b506103036107603660046149c1565b611a0c565b34801561077157600080fd5b506102a2611a4e565b34801561078657600080fd5b50610303610795366004614732565b611a66565b3480156107a657600080fd5b506102d8611ab3565b3480156107bb57600080fd5b506107cf6107ca366004614a24565b611abd565b60405190151581526020016102af565b3480156107eb57600080fd5b506103036107fa36600461435b565b611ac9565b6060610809611b0c565b600201805461081790614a52565b80601f016020809104026020016040519081016040528092919081815260200182805461084390614a52565b80156108905780601f1061086557610100808354040283529160200191610890565b820191906000526020600020905b81548152906001019060200180831161087357829003601f168201915b5050505050905090565b60006108a582611b30565b92915050565b6108b782826001611b7d565b5050565b6108c3611c32565b6001600160a01b0316336001600160a01b0316146108fb576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6108b782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611cfc92505050565b60006109476103e0611d13565b905090565b6000610947611d13565b600061096182611d32565b9050836001600160a01b0316816001600160a01b0316146109945760405162a1148160e81b815260040160405180910390fd5b6000806109a084611dcd565b915091506109c581876109b03390565b6001600160a01b039081169116811491141790565b6109f0576109d38633611abd565b6109f057604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610a1757604051633a954ecd60e21b815260040160405180910390fd5b8015610a2257600082555b610a2a611b0c565b6001600160a01b0387166000908152600591909101602052604090208054600019019055610a56611b0c565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b17610a8d611b0c565b60008681526004919091016020526040812091909155600160e11b84169003610b035760018401610abc611b0c565b600082815260049190910160205260408120549003610b0157610add611b0c565b548114610b015783610aed611b0c565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600080610b58611df5565b90506000610b64611779565b905083811115610b78575060009392505050565b6006820154604051639262b1b360e01b815230600482015285916001600160a01b031690639262b1b390602401602060405180830381865afa158015610bc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be69190614a86565b1115610bf6575060009392505050565b60088201546001600160a01b031615610c87576008820154604051635cf4ee9160e01b815260048101839052602481018690526001600160a01b0390911690635cf4ee9190604401602060405180830381865afa158015610c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7f9190614a86565b949350505050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c5b573d6000803e3d6000fd5b610cf783838360405180602001604052806000815250611818565b505050565b60026000805160206152288339815191525403610d2c57604051635db5c7cd60e11b815260040160405180910390fd5b610d43600260008051602061522883398151915255565b610d4e838383611e19565b610cf7600160008051602061522883398151915255565b60008051602061528883398151915254640100000000900460ff16610d9d57604051630ef4733760e31b815260040160405180910390fd5b610dad63421fb7a760e01b6120bc565b610db7828261219a565b6108b7826000015183602001516122bd565b610dd1611c32565b6001600160a01b0316336001600160a01b031614610e04576040516365f4906560e01b81523360048201526024016108f2565b6001600160a01b038116610e2b57604051635fbd571760e01b815260040160405180910390fd5b6000610e3561231f565b905080600003610e5857604051635894b54560e11b815260040160405180910390fd5b6108b7610e63610ff3565b308484612332565b60006108a582610e79611d13565b612378565b610e86611c32565b6001600160a01b0316336001600160a01b031614610eb9576040516365f4906560e01b81523360048201526024016108f2565b6000610ec3611205565b90508015801590610ed357508082115b15610ef15760405163c3983b9160e01b815260040160405180910390fd5b610efa826123be565b6108b782611ac9565b60006108a582611d32565b6000610947610ff3565b610f20611c32565b6001600160a01b0316336001600160a01b031614610f53576040516365f4906560e01b81523360048201526024016108f2565b610f5c81612463565b610f6461175d565b6001600160a01b03166391b7f5ed826040518263ffffffff1660e01b8152600401610f9191815260200190565b600060405180830381600087803b158015610fab57600080fd5b505af1158015610fbf573d6000803e3d6000fd5b5050505050565b80610fcf611df5565b60080180546001600160a01b0319166001600160a01b039290921691909117905550565b6000610ffd611df5565b600401546001600160a01b0316919050565b6000610947611779565b60006108a5826124f1565b8061102d611df5565b6003015550565b600061103e611df5565b600601546001600160a01b0316919050565b6000610947611034565b60008051602061528883398151915254640100000000900460ff1661109257604051630ef4733760e31b815260040160405180910390fd5b61109b81612559565b50565b600260008051602061522883398151915254036110ce57604051635db5c7cd60e11b815260040160405180910390fd5b6110e5600260008051602061522883398151915255565b60006110f082610f03565b90506001600160a01b03811661111957604051635fbd571760e01b815260040160405180910390fd5b60008281527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce0060205260409020546001600160401b0316611158612594565b6001600160401b031661116b4283614ab5565b106111895760405163dce9a1d360e01b815260040160405180910390fd5b600061119784610e79611d13565b905080156111d05760006111ab848361261a565b905060006111b98284614ab5565b905080156111cd576111cb8582612732565b505b50505b6111e1846111dc612594565b6128d0565b50505061109b600160008051602061522883398151915255565b6000610947612594565b600061120f611df5565b60030154905090565b6002600080516020615228833981519152540361124857604051635db5c7cd60e11b815260040160405180910390fd5b61125f600260008051602061522883398151915255565b61126881612999565b60405133606081901b6bffffffffffffffffffffffff191660208301524360348301526000918290605401604051602081830303815290604052805190602001209050600061132b826112ff84866112bf87612a02565b604080516020808201959095526001600160a01b039390931683820152606080840192909252805180840390920182526080909201909152805191012090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905061136d8184876040516020016113599291906001600160a01b0392831681529116602082015260400190565b604051602081830303815290604052612a37565b341561137d5761137d8134612a7e565b60006113a9604051806040016040528060098152602001684a6f696e537061636560b81b815250612b04565b905060005b81518110156115d25760008282815181106113cb576113cb614ac8565b6020026020010151905080604001516115c95760005b8160800151518110156115c75760008260800151828151811061140657611406614ac8565b60200260200101519050806001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561144e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114729190614ade565b6115aa576040805160018082528183019092526000916020808301908036833701905050905088816000815181106114ac576114ac614ac8565b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b0316630cf0b533600083604051806040016040528060098152602001684a6f696e537061636560b81b8152506040516020016115109190614afb565b60405160208183030381529060405261152890614b17565b6040518463ffffffff1660e01b815260040161154693929190614b75565b602060405180830381865afa158015611563573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115879190614ade565b156115a45761159587612d4e565b50505050505050505050611613565b506115be565b6115b986828560000151612ea3565b600198505b506001016113e1565b505b506001016113ae565b508461160d576040516001600160a01b038716907f86fd446d5c04e892d58b448a924dcd9c3ece3a5e0d2960b8c35cd475a5595a1f90600090a25b50505050505b61109b600160008051602061522883398151915255565b61164e60405180606001604052806060815260200160608152602001606081525090565b6116588383613152565b9392505050565b6060610947611a4e565b6000610947611205565b606061167d611b0c565b600301805461081790614a52565b611693611c32565b6001600160a01b0316336001600160a01b0316146116c6576040516365f4906560e01b81523360048201526024016108f2565b6116d7816116d2611d13565b61324c565b61109b81611024565b806116e9611b0c565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000611767611df5565b600801546001600160a01b0316919050565b600080611784611df5565b600781015490915080156117985792915050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118119190614a86565b9250505090565b611823848484610956565b6001600160a01b0383163b1561185c5761183f8484848461326d565b61185c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061186d82613358565b61188a57604051630a14c4b560e41b815260040160405180910390fd5b60006118a160408051602081019091526000815290565b905080516000036118c15760405180602001604052806000815250611658565b806118cb84613394565b6040516020016118dc929190614b9e565b6040516020818303038152906040529392505050565b6002600080516020615228833981519152540361192257604051635db5c7cd60e11b815260040160405180910390fd5b611939600260008051602061522883398151915255565b61194283612999565b600061194c6133d8565b9050600061195b6103e0611d13565b905080156119dc5761196d82826133e8565b6000611979868361261a565b905060006119878284614ab5565b90506000611993610ff3565b905081156119d85760006119a78388613408565b90506119b5828a8a84612332565b60006119c18285614ab5565b905080156119d5576119d38a82612732565b505b50505b5050505b6119e78560016134bb565b6119f3826111dc612594565b5050610cf7600160008051602061522883398151915255565b60008051602061528883398151915254640100000000900460ff16611a4457604051630ef4733760e31b815260040160405180910390fd5b6108b782826122bd565b6060611a58611df5565b600c01805461081790614a52565b611a6e611c32565b6001600160a01b0316336001600160a01b031614611aa1576040516365f4906560e01b81523360048201526024016108f2565b611aaa816134d5565b61109b81610fc6565b600061094761175d565b6000611658838361358d565b6000611ad3611df5565b6007810183905560405190915082907fab14a23e88fb272313490d4f20d63098e64fd38304c0e07a377db98c2b39b92f90600090a25050565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b6000611b3b82613358565b611b58576040516333d1c03960e21b815260040160405180910390fd5b611b60611b0c565b60009283526006016020525060409020546001600160a01b031690565b6000611b8883610f03565b90508115611bc757336001600160a01b03821614611bc757611baa813361358d565b611bc7576040516367d9dca160e11b815260040160405180910390fd5b83611bd0611b0c565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015611cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190614bcd565b91505090565b80611d05611df5565b600c01906108b79082614c32565b600080611d1e611b0c565b60010154611d2a611b0c565b540303919050565b600080611d3d611b0c565b60008481526004820160205260408120549350909150600160e01b83169003611db35781600003611dad5780548310611d8957604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115611d8a575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b6000806000611dda611b0c565b60009485526006016020525050604090912080549092909150565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60090565b60008381526000805160206152088339815191526020526040902080546000805160206151e8833981519152919061010090046001600160a01b03161580611e635750805460ff16155b15611e8157604051637ad5a43960e11b815260040160405180910390fd5b600084815260028201602052604090205460ff1615611eb357604051637912b73960e01b815260040160405180910390fd5b600084815260018201602052604081205481908190815b81811015611ff15760008981526001870160205260408120805483908110611ef457611ef4614ac8565b60009182526020909120018054909150336001600160a01b0390911603611f805760008154600160a01b900460ff166002811115611f3457611f34614771565b14611f52576040516347592a4d60e01b815260040160405180910390fd5b80548990829060ff60a01b1916600160a01b836002811115611f7657611f76614771565b0217905550600195505b60018154600160a01b900460ff166002811115611f9f57611f9f614771565b03611fb65784611fae81614cf1565b955050611fe8565b60028154600160a01b900460ff166002811115611fd557611fd5614771565b03611fe85783611fe481614cf1565b9450505b50600101611eca565b508361201057604051638223a7e960e01b815260040160405180910390fd5b61201b600282614d0a565b831180612031575061202e600282614d0a565b82115b156120b15760008881526002860160205260408120805460ff1916600117905582841161205f576002612062565b60015b905061206e8a826135ca565b897fb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c6338260405161209e9190614d2c565b60405180910390a26120af8a6136a2565b505b505050505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114612149576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055612162565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006121a4611df5565b6006810180546001600160a01b038086166001600160a01b031992831617909255610100860151600884018054919093169082161790915560048201805490911673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1790556060840151600382015560e08401516007820181905590915015612228576122288360e001516123be565b6122368361010001516134d5565b604083015115610cf75761224d8360400151612463565b600881015460408085015190516391b7f5ed60e01b81526001600160a01b03909216916391b7f5ed916122869160040190815260200190565b600060405180830381600087803b1580156122a057600080fd5b505af11580156122b4573d6000803e3d6000fd5b50505050505050565b60008051602061528883398151915254640100000000900460ff166122f557604051630ef4733760e31b815260040160405180910390fd5b6123056380ac58cd60e01b6120bc565b612315635b5e139f60e01b6120bc565b6108b7828261376f565b6000612329611df5565b600a0154905090565b801561185c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b0385160161236c5761236782826137a1565b61185c565b61185c84848484613844565b600080612383611df5565b6000858152600982016020526040902054909150156123b55760008481526009909101602052604090205490506108a5565b610c7f83610b4d565b60006123c8611df5565b90508060060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa15801561241f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124439190614a86565b8211156108b75760405163c3983b9160e01b815260040160405180910390fd5b600061246d611034565b6001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ce9190614a86565b9050808210156108b757604051631a23d64760e11b815260040160405180910390fd5b60006001600160a01b03821661251a576040516323d3ad8160e21b815260040160405180910390fd5b6001600160401b0361252a611b0c565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b612569636afd38fd60e11b6120bc565b6000805160206151e883398151915280546001600160a01b0319166001600160a01b03831617905550565b60008061259f611df5565b90508060060160009054906101000a90046001600160a01b03166001600160a01b0316638120f0ba6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190614d3f565b600080612625611df5565b6006810154600480830154604080516301332c8360e61b815290519495506001600160a01b039384169493909116926000928592634ccb20c092818301926020928290030181865afa15801561267f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a39190614bcd565b90506000836001600160a01b0316639f6542aa6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127099190614d5c565b9050612719878261ffff16613897565b955061272783898489612332565b505050505092915050565b60008061273d611df5565b90506000612749610ff3565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03821601612794578382600a0160008282546127849190614d80565b909155508493506108a592505050565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156127dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128019190614a86565b905061280f83883089612332565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015612856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287a9190614a86565b905060006128888383614ab5565b90508781146128aa57604051635894b54560e11b815260040160405180910390fd5b8086600a0160008282546128be9190614d80565b90915550909998505050505050505050565b60008281527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce006020819052604082205490916001600160401b03909116908181036129265761291f8442614d93565b9050612933565b6129308483614d93565b90505b60008581526020848152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825286917f2ec2be2c4b90c2cf13ecb6751a24daed6bb741ae5ed3f7371aabf9402f6d62e8910160405180910390a25050505050565b6001600160a01b0381166129c057604051635fbd571760e01b815260040160405180910390fd5b6129c8611205565b158015906129e457506129d9611205565b6129e1611d13565b10155b1561109b57604051637efcdb4960e01b815260040160405180910390fd5b600081815260008051602061524883398151915260208190526040822080549083612a2c83614cf1565b909155509392505050565b60008281527f34516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e02602052604090206000805160206152488339815191529061185c8382614c32565b80600003612a9f5760405163acdc0d4960e01b815260040160405180910390fd5b803414612abf5760405163acdc0d4960e01b815260040160405180910390fd5b60008281526000805160206152a883398151915260205260408120805460008051602061524883398151915292849291612afa908490614d80565b9091555050505050565b60606000612b1061390c565b80519091506000816001600160401b03811115612b2f57612b2f6144bd565b604051908082528060200260200182016040528015612b58578160200160208202803683370190505b5085516020870120909150600090815b84811015612c27576000612b94878381518110612b8757612b87614ac8565b6020026020010151613937565b509250505060005b8151811015612c1d5783828281518110612bb857612bb8614ac8565b60200260200101518051906020012003612c1557878381518110612bde57612bde614ac8565b6020026020010151868681518110612bf857612bf8614ac8565b602090810291909101015284612c0d81614cf1565b955050612c1d565b600101612b9c565b5050600101612b68565b506000826001600160401b03811115612c4257612c426144bd565b604051908082528060200260200182016040528015612ca757816020015b612c946040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b815260200190600190039081612c605790505b50905060005b83811015612d42576000858281518110612cc957612cc9614ac8565b60200260200101519050600080600080612ce285613937565b93509350935093506040518060a00160405280868152602001858152602001841515815260200183815260200182815250878781518110612d2557612d25614ac8565b602002602001018190525050505050508080600101915050612cad565b50979650505050505050565b600080612d5a83613a62565b806020019051810190612d6d9190614db3565b915091506000612d7e6103e0611d13565b90506000612d8a6133d8565b90508115612e4f5760008581526000805160206152a8833981519152602052604081205490819003612dcf57604051635894b54560e11b815260040160405180910390fd5b80831115612df057604051635894b54560e11b815260040160405180910390fd5b612dfa82846133e8565b6000612e06868561261a565b90506000612e148286614ab5565b90508015612e2857612e268782612732565b505b612e328886613b33565b612e4b8860405180602001604052806000815250612a37565b5050505b612e5a8360016134bb565b612e66816111dc612594565b60405181906001600160a01b038516907f2f40b0474996b72a4251e00fb9170cdd960deea1dc749772cbbab61395b9b57690600090a35050505050565b60008381526000805160206152088339815191526020526040902080546000805160206151e8833981519152919060ff161515600103612f355760005b6004820154811015612f335783826004018281548110612f0257612f02614ac8565b906000526020600020015403612f2b576040516301ab53df60e31b815260040160405180910390fd5b600101612ee0565b505b81546001600160a01b0316612f4c57612f4c613b6e565b8154604051634f84544560e01b8152600560048201526000916001600160a01b031690634f84544590602401600060405180830381865afa158015612f95573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612fbd9190810190614e05565b825490915060ff16612ffe5781546003830180546001600160a01b0319166001600160a01b0388161790556001600160a81b03191661010033021760011782555b600482018054600181018255600091825260208220018590555b81518110156130ee57826001016000868152602001908152602001600020604051806040016040528084848151811061305357613053614ac8565b60200260200101516001600160a01b031681526020016000600281111561307c5761307c614771565b9052815460018101835560009283526020928390208251910180546001600160a01b031981166001600160a01b03909316928317825593830151929390929183916001600160a81b03191617600160a01b8360028111156130df576130df614771565b02179055505050600101613018565b50825460405163541da4e560e01b81526001600160a01b039091169063541da4e5906131249033908a9089908790600401614e98565b600060405180830381600087803b15801561313e57600080fd5b505af11580156120af573d6000803e3d6000fd5b61317660405180606001604052806060815260200160608152602001606081525090565b60008381526000805160206152088339815191526020526040812080546000805160206151e88339815191529260ff909116151590036131c957604051637ad5a43960e11b815260040160405180910390fd5b600381015460405163069a3ee960e01b8152600481018690526001600160a01b0390911690600090829063069a3ee990602401600060405180830381865afa158015613219573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132419190810190615036565b979650505050505050565b808210156108b757604051636664d51760e11b815260040160405180910390fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906132a2903390899088908890600401615173565b6020604051808303816000875af19250505080156132dd575060408051601f3d908101601f191682019092526132da918101906151a6565b60015b61333b573d80801561330b576040519150601f19603f3d011682016040523d82523d6000602084013e613310565b606091505b508051600003613333576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000613362611b0c565b54821080156108a55750600160e01b613379611b0c565b60008481526004919091016020526040902054161592915050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806133ae5750819003601f19909101908152919050565b60006133e2611b0c565b54919050565b806133f1611df5565b600093845260090160205260409092209190915550565b60008181527f3c2290b88407133303e904ceb4ee7d0d14164eda8a629372d8406216ceb57e006020819052604082205461ffff1680830361344e576000925050506108a5565b600084815260018084016020908152604092839020835180850190945280548085529201549083015215801590613492575080514210806134925750806020015142115b156134a357600093505050506108a5565b6134b1868361ffff16613897565b9695505050505050565b6108b7828260405180602001604052806000815250613c22565b6001600160a01b0381166134fc57604051630e88bf4b60e01b815260040160405180910390fd5b613504611034565b6040516346fc05eb60e11b81526001600160a01b0383811660048301529190911690638df80bd690602401602060405180830381865afa15801561354c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135709190614ade565b61109b57604051630e88bf4b60e01b815260040160405180910390fd5b6000613597611b0c565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b60018160028111156135de576135de614771565b036135ec576108b782612d4e565b6000806135f884613a62565b80602001905181019061360b9190614db3565b915091506136288460405180602001604052806000815250612a37565b60008481526000805160206152a883398151915260205260409020548015613667576136548582613b33565b61366761365f610ff3565b308584612332565b6040516001600160a01b038316907f86fd446d5c04e892d58b448a924dcd9c3ece3a5e0d2960b8c35cd475a5595a1f90600090a25050505050565b6000818152600080516020615208833981519152602052604081206000805160206151e8833981519152915b6004820154811015613722578160010160008360040183815481106136f5576136f5614ac8565b90600052602060002001548152602001908152602001600020600061371a9190614284565b6001016136ce565b506137316004820160006142a2565b6000838152600183016020526040812080546001600160a81b03191681556003810180546001600160a01b031916905590610fbf60048301826142a2565b6000613779611b0c565b9050600281016137898482614c32565b50600381016137988382614c32565b50600090555050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146137ee576040519150601f19603f3d011682016040523d82523d6000602084013e6137f3565b606091505b5050905080610cf75760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c65640000000060448201526064016108f2565b816001600160a01b0316836001600160a01b0316031561185c57306001600160a01b03841603613882576123676001600160a01b0385168383613c98565b61185c6001600160a01b038516848484613cf7565b60006127108211156138f55760405162461bcd60e51b815260206004820152602160248201527f426173697320706f696e74732063616e6e6f74206578636565642031305f30306044820152600360fc1b60648201526084016108f2565b61271061390283856151d0565b6116589190614d0a565b60606109477f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01613d30565b600081815260008051602061526883398151915260205260408120805460609291839182919061396690614a52565b80601f016020809104026020016040519081016040528092919081815260200182805461399290614a52565b80156139df5780601f106139b4576101008083540402835291602001916139df565b820191906000526020600020905b8154815290600101906020018083116139c257829003601f168201915b50505050509350613a0d7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0090565b6000868152600391909101602090815260408083206001015460008051602061526883398151915290925290912060ff9091169350613a4e90600201613d3d565b9150613a5985613d48565b90509193509193565b60008181527f34516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e0260205260409020805460609160008051602061524883398151915291613aad90614a52565b80601f0160208091040260200160405190810160405280929190818152602001828054613ad990614a52565b8015613b265780601f10613afb57610100808354040283529160200191613b26565b820191906000526020600020905b815481529060010190602001808311613b0957829003601f168201915b5050505050915050919050565b60008281526000805160206152a883398151915260205260408120805460008051602061524883398151915292849291612afa908490614ab5565b6000805160206151e88339815191526000613b87611df5565b60060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa158015613bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c039190614bcd565b82546001600160a01b0319166001600160a01b03919091161790915550565b613c2c8383613e4c565b6001600160a01b0383163b15610cf7576000613c46611b0c565b5490508281035b613c60600086838060010194508661326d565b613c7d576040516368d2bf6b60e11b815260040160405180910390fd5b818110613c4d5781613c8d611b0c565b5414610fbf57600080fd5b6040516001600160a01b03838116602483015260448201839052610cf791859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613f87565b6040516001600160a01b03848116602483015283811660448301526064820183905261185c9186918216906323b872dd90608401613cc5565b6060600061165883613fea565b60606108a582614046565b60008181526000805160206152688339815191526020526040812060609190613d7390600401614123565b6001600160401b03811115613d8a57613d8a6144bd565b604051908082528060200260200182016040528015613db3578160200160208202803683370190505b50905060005b600084815260008051602061526883398151915260205260409020613de090600401614123565b811015613e4557600084815260008051602061526883398151915260205260408120613e0f906004018361412d565b905080838381518110613e2457613e24614ac8565b6001600160a01b039092166020928302919091019091015250600101613db9565b5092915050565b6000613e56611b0c565b5490506000829003613e7b5760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202613e8f611b0c565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717613eca611b0c565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114613f5457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101613f1c565b5081600003613f7557604051622e076360e81b815260040160405180910390fd5b80613f7e611b0c565b5550610cf79050565b6000613f9c6001600160a01b03841683614139565b90508051600014158015613fc1575080806020019051810190613fbf9190614ade565b155b15610cf757604051635274afe760e01b81526001600160a01b03841660048201526024016108f2565b60608160000180548060200260200160405190810160405280929190818152602001828054801561403a57602002820191906000526020600020905b815481526020019060010190808311614026575b50505050509050919050565b606081600001805480602002602001604051908101604052809291908181526020016000905b8282101561411857838290600052602060002001805461408b90614a52565b80601f01602080910402602001604051908101604052809291908181526020018280546140b790614a52565b80156141045780601f106140d957610100808354040283529160200191614104565b820191906000526020600020905b8154815290600101906020018083116140e757829003601f168201915b50505050508152602001906001019061406c565b505050509050919050565b60006108a5825490565b60006116588383614147565b606061165883836000614171565b600082600001828154811061415e5761415e614ac8565b9060005260206000200154905092915050565b6060814710156141965760405163cd78605960e01b81523060048201526024016108f2565b600080856001600160a01b031684866040516141b29190614afb565b60006040518083038185875af1925050503d80600081146141ef576040519150601f19603f3d011682016040523d82523d6000602084013e6141f4565b606091505b50915091506134b18683836060826142145761420f8261425b565b611658565b815115801561422b57506001600160a01b0384163b155b1561425457604051639996b31560e01b81526001600160a01b03851660048201526024016108f2565b5080611658565b80511561426b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054600082559060005260206000209081019061109b91906142c0565b508054600082559060005260206000209081019061109b91906142e3565b5b808211156142df5780546001600160a81b03191681556001016142c1565b5090565b5b808211156142df57600081556001016142e4565b60005b838110156143135781810151838201526020016142fb565b50506000910152565b600081518084526143348160208601602086016142f8565b601f01601f19169290920160200192915050565b602081526000611658602083018461431c565b60006020828403121561436d57600080fd5b5035919050565b6001600160a01b038116811461109b57600080fd5b803561439481614374565b919050565b600080604083850312156143ac57600080fd5b82356143b781614374565b946020939093013593505050565b600080602083850312156143d857600080fd5b82356001600160401b03808211156143ef57600080fd5b818501915085601f83011261440357600080fd5b81358181111561441257600080fd5b86602082850101111561442457600080fd5b60209290920196919550909350505050565b60008060006060848603121561444b57600080fd5b833561445681614374565b9250602084013561446681614374565b929592945050506040919091013590565b6003811061109b57600080fd5b60008060006060848603121561449957600080fd5b833592506020840135915060408401356144b281614477565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b03811182821017156144f6576144f66144bd565b60405290565b604051608081016001600160401b03811182821017156144f6576144f66144bd565b604051606081016001600160401b03811182821017156144f6576144f66144bd565b604080519081016001600160401b03811182821017156144f6576144f66144bd565b604051601f8201601f191681016001600160401b038111828210171561458a5761458a6144bd565b604052919050565b60006001600160401b038311156145ab576145ab6144bd565b6145be601f8401601f1916602001614562565b90508281528383830111156145d257600080fd5b828260208301376000602084830101529392505050565b600082601f8301126145fa57600080fd5b61165883833560208501614592565b6001600160401b038116811461109b57600080fd5b803561439481614609565b6000806040838503121561463c57600080fd5b82356001600160401b038082111561465357600080fd5b90840190610120828703121561466857600080fd5b6146706144d3565b82358281111561467f57600080fd5b61468b888286016145e9565b8252506020830135828111156146a057600080fd5b6146ac888286016145e9565b60208301525060408301356040820152606083013560608201526146d26080840161461e565b60808201526146e360a08401614389565b60a08201526146f460c08401614389565b60c082015260e083013560e08201526101009150614713828401614389565b8282015280945050505061472960208401614389565b90509250929050565b60006020828403121561474457600080fd5b813561165881614374565b6000806040838503121561476257600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b6003811061109b5761109b614771565b60008151808452602080850194506020840160005b838110156148015781518051600681106147c8576147c8614771565b885280840151848901526040808201516001600160a01b03169089015260609081015190880152608090960195908201906001016147ac565b509495945050505050565b60008151808452602080850194506020840160005b83811015614801578151805161483681614787565b88528084015160ff908116858a0152604091820151169088015260609096019590820190600101614821565b6020808252825160608383015280516080840181905260009291820190839060a08601905b808310156148be578351805161489c81614787565b835285015160ff16858301529284019260019290920191604090910190614887565b50838701519350601f199250828682030160408701526148de8185614797565b935050506040850151818584030160608601526134b1838261480c565b801515811461109b57600080fd5b6000806040838503121561491c57600080fd5b823561492781614374565b91506020830135614937816148fb565b809150509250929050565b6000806000806080858703121561495857600080fd5b843561496381614374565b9350602085013561497381614374565b92506040850135915060608501356001600160401b0381111561499557600080fd5b8501601f810187136149a657600080fd5b6149b587823560208401614592565b91505092959194509250565b600080604083850312156149d457600080fd5b82356001600160401b03808211156149eb57600080fd5b6149f7868387016145e9565b93506020850135915080821115614a0d57600080fd5b50614a1a858286016145e9565b9150509250929050565b60008060408385031215614a3757600080fd5b8235614a4281614374565b9150602083013561493781614374565b600181811c90821680614a6657607f821691505b602082108103611dad57634e487b7160e01b600052602260045260246000fd5b600060208284031215614a9857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108a5576108a5614a9f565b634e487b7160e01b600052603260045260246000fd5b600060208284031215614af057600080fd5b8151611658816148fb565b60008251614b0d8184602087016142f8565b9190910192915050565b80516020808301519190811015611dad5760001960209190910360031b1b16919050565b60008151808452602080850194506020840160005b838110156148015781516001600160a01b031687529582019590820190600101614b50565b838152606060208201526000614b8e6060830185614b3b565b9050826040830152949350505050565b60008351614bb08184602088016142f8565b835190830190614bc48183602088016142f8565b01949350505050565b600060208284031215614bdf57600080fd5b815161165881614374565b601f821115610cf7576000816000526020600020601f850160051c81016020861015614c135750805b601f850160051c820191505b81811015610b4557828155600101614c1f565b81516001600160401b03811115614c4b57614c4b6144bd565b614c5f81614c598454614a52565b84614bea565b602080601f831160018114614c945760008415614c7c5750858301515b600019600386901b1c1916600185901b178555610b45565b600085815260208120601f198616915b82811015614cc357888601518255948401946001909101908401614ca4565b5085821015614ce15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201614d0357614d03614a9f565b5060010190565b600082614d2757634e487b7160e01b600052601260045260246000fd5b500490565b60208101614d3983614787565b91905290565b600060208284031215614d5157600080fd5b815161165881614609565b600060208284031215614d6e57600080fd5b815161ffff8116811461165857600080fd5b808201808211156108a5576108a5614a9f565b6001600160401b03818116838216019080821115613e4557613e45614a9f565b60008060408385031215614dc657600080fd5b8251614dd181614374565b602084015190925061493781614374565b60006001600160401b03821115614dfb57614dfb6144bd565b5060051b60200190565b60006020808385031215614e1857600080fd5b82516001600160401b03811115614e2e57600080fd5b8301601f81018513614e3f57600080fd5b8051614e52614e4d82614de2565b614562565b81815260059190911b82018301908381019087831115614e7157600080fd5b928401925b82841015613241578351614e8981614374565b82529284019290840190614e76565b60018060a01b03851681528360208201528260408201526080606082015260006134b16080830184614b3b565b805160ff8116811461439457600080fd5b600082601f830112614ee757600080fd5b81516020614ef7614e4d83614de2565b82815260079290921b84018101918181019086841115614f1657600080fd5b8286015b84811015614f805760808189031215614f335760008081fd5b614f3b6144fc565b815160068110614f4b5760008081fd5b81528185015185820152604080830151614f6481614374565b9082015260608281015190820152835291830191608001614f1a565b509695505050505050565b600082601f830112614f9c57600080fd5b81516020614fac614e4d83614de2565b82815260609283028501820192828201919087851115614fcb57600080fd5b8387015b858110156150295781818a031215614fe75760008081fd5b614fef61451e565b8151614ffa81614477565b8152615007828701614ec5565b868201526040615018818401614ec5565b908201528452928401928101614fcf565b5090979650505050505050565b6000602080838503121561504957600080fd5b82516001600160401b038082111561506057600080fd5b908401906060828703121561507457600080fd5b61507c61451e565b82518281111561508b57600080fd5b8301601f8101881361509c57600080fd5b80516150aa614e4d82614de2565b81815260069190911b8201860190868101908a8311156150c957600080fd5b928701925b8284101561511d576040848c0312156150e75760008081fd5b6150ef614540565b84516150fa81614477565b8152615107858a01614ec5565b818a0152825260409390930192908701906150ce565b8452505050828401518281111561513357600080fd5b61513f88828601614ed6565b8583015250604083015193508184111561515857600080fd5b61516487858501614f8b565b60408201529695505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134b19083018461431c565b6000602082840312156151b857600080fd5b81516001600160e01b03198116811461165857600080fd5b80820281158282048414176108a5576108a5614a9f56fe9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e0154f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0034516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e00672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0359b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200034516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e01"; + +type MembershipFacetConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: MembershipFacetConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class MembershipFacet__factory extends ContractFactory { + constructor(...args: MembershipFacetConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy(overrides || {}) as Promise; + } + override getDeployTransaction( + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction(overrides || {}); + } + override attach(address: string): MembershipFacet { + return super.attach(address) as MembershipFacet; + } + override connect(signer: Signer): MembershipFacet__factory { + return super.connect(signer) as MembershipFacet__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): MembershipFacetInterface { + return new utils.Interface(_abi) as MembershipFacetInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): MembershipFacet { + return new Contract(address, _abi, signerOrProvider) as MembershipFacet; + } +} diff --git a/packages/generated/dev/typings/factories/MockERC721A__factory.ts b/packages/generated/dev/typings/factories/MockERC721A__factory.ts new file mode 100644 index 000000000..ec7598128 --- /dev/null +++ b/packages/generated/dev/typings/factories/MockERC721A__factory.ts @@ -0,0 +1,607 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../common"; +import type { MockERC721A, MockERC721AInterface } from "../MockERC721A"; + +const _abi = [ + { + type: "function", + name: "__ERC721A_init", + inputs: [ + { + name: "name_", + type: "string", + internalType: "string", + }, + { + name: "symbol_", + type: "string", + internalType: "string", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "approve", + inputs: [ + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "balanceOf", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "burn", + inputs: [ + { + name: "token", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "getApproved", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isApprovedForAll", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "mint", + inputs: [ + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "mintTo", + inputs: [ + { + name: "to", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "name", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "ownerOf", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "safeTransferFrom", + inputs: [ + { + name: "from", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "safeTransferFrom", + inputs: [ + { + name: "from", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + { + name: "_data", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "setApprovalForAll", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "approved", + type: "bool", + internalType: "bool", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "symbol", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "tokenURI", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "totalSupply", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "transferFrom", + inputs: [ + { + name: "from", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "event", + name: "Approval", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "approved", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ApprovalForAll", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "approved", + type: "bool", + indexed: false, + internalType: "bool", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ConsecutiveTransfer", + inputs: [ + { + name: "fromTokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + { + name: "toTokenId", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "from", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceAdded", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceRemoved", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Transfer", + inputs: [ + { + name: "from", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "ApprovalCallerNotOwnerNorApproved", + inputs: [], + }, + { + type: "error", + name: "ApprovalQueryForNonexistentToken", + inputs: [], + }, + { + type: "error", + name: "BalanceQueryForZeroAddress", + inputs: [], + }, + { + type: "error", + name: "Initializable_InInitializingState", + inputs: [], + }, + { + type: "error", + name: "Initializable_NotInInitializingState", + inputs: [], + }, + { + type: "error", + name: "Introspection_AlreadySupported", + inputs: [], + }, + { + type: "error", + name: "Introspection_NotSupported", + inputs: [], + }, + { + type: "error", + name: "MintERC2309QuantityExceedsLimit", + inputs: [], + }, + { + type: "error", + name: "MintToZeroAddress", + inputs: [], + }, + { + type: "error", + name: "MintZeroQuantity", + inputs: [], + }, + { + type: "error", + name: "OwnerQueryForNonexistentToken", + inputs: [], + }, + { + type: "error", + name: "OwnershipNotInitializedForExtraData", + inputs: [], + }, + { + type: "error", + name: "TransferCallerNotOwnerNorApproved", + inputs: [], + }, + { + type: "error", + name: "TransferFromIncorrectOwner", + inputs: [], + }, + { + type: "error", + name: "TransferToNonERC721ReceiverImplementer", + inputs: [], + }, + { + type: "error", + name: "TransferToZeroAddress", + inputs: [], + }, + { + type: "error", + name: "URIQueryForNonexistentToken", + inputs: [], + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b611516806100d36000396000f3fe6080604052600436106100fe5760003560e01c80636352211e11610095578063a22cb46511610064578063a22cb46514610279578063b88d4fde14610299578063c87b56dd146102ac578063d2f01f19146102cc578063e985e9c5146102ec57600080fd5b80636352211e1461020457806370a0823114610224578063755edd171461024457806395d89b411461026457600080fd5b806323b872dd116100d157806323b872dd1461019e57806340c10f19146101b157806342842e0e146101d157806342966c68146101e457600080fd5b806306fdde0314610103578063081812fc1461012e578063095ea7b31461016657806318160ddd1461017b575b600080fd5b34801561010f57600080fd5b5061011861031c565b6040516101259190611064565b60405180910390f35b34801561013a57600080fd5b5061014e610149366004611077565b6103b7565b6040516001600160a01b039091168152602001610125565b6101796101743660046110a7565b6103c8565b005b34801561018757600080fd5b506101906103d8565b604051908152602001610125565b6101796101ac3660046110d1565b6103e7565b3480156101bd57600080fd5b506101796101cc3660046110a7565b6105cc565b6101796101df3660046110d1565b6105d6565b3480156101f057600080fd5b506101796101ff366004611077565b6105f6565b34801561021057600080fd5b5061014e61021f366004611077565b610602565b34801561023057600080fd5b5061019061023f36600461110d565b61060d565b34801561025057600080fd5b5061019061025f36600461110d565b610618565b34801561027057600080fd5b50610118610634565b34801561028557600080fd5b50610179610294366004611128565b61064c565b6101796102a73660046111f0565b6106c9565b3480156102b857600080fd5b506101186102c7366004611077565b610713565b3480156102d857600080fd5b506101796102e736600461128c565b6107a4565b3480156102f857600080fd5b5061030c6103073660046112f0565b6107f8565b6040519015158152602001610125565b6060610326610804565b600201805461033490611323565b80601f016020809104026020016040519081016040528092919081815260200182805461036090611323565b80156103ad5780601f10610382576101008083540402835291602001916103ad565b820191906000526020600020905b81548152906001019060200180831161039057829003601f168201915b5050505050905090565b60006103c282610828565b92915050565b6103d482826001610875565b5050565b60006103e261092a565b905090565b60006103f282610949565b9050836001600160a01b0316816001600160a01b0316146104255760405162a1148160e81b815260040160405180910390fd5b600080610431846109e4565b9150915061045681876104413390565b6001600160a01b039081169116811491141790565b6104815761046486336107f8565b61048157604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166104a857604051633a954ecd60e21b815260040160405180910390fd5b80156104b357600082555b6104bb610804565b6001600160a01b03871660009081526005919091016020526040902080546000190190556104e7610804565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b1761051e610804565b60008681526004919091016020526040812091909155600160e11b84169003610594576001840161054d610804565b6000828152600491909101602052604081205490036105925761056e610804565b548114610592578361057e610804565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03166000805160206114f683398151915260405160405180910390a45b505050505050565b6103d48282610a0c565b6105f1838383604051806020016040528060008152506106c9565b505050565b6105ff81610b23565b50565b60006103c282610949565b60006103c282610b2e565b6000610622610b97565b905061062f826001610a0c565b919050565b606061063e610804565b600301805461033490611323565b80610655610804565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6106d48484846103e7565b6001600160a01b0383163b1561070d576106f084848484610ba7565b61070d576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061071e82610c92565b61073b57604051630a14c4b560e41b815260040160405180910390fd5b600061075260408051602081019091526000815290565b90508051600003610772576040518060200160405280600081525061079d565b8061077c84610cce565b60405160200161078d929190611357565b6040516020818303038152906040525b9392505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166107ee57604051630ef4733760e31b815260040160405180910390fd5b6103d48282610d12565b600061079d8383610d86565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b600061083382610c92565b610850576040516333d1c03960e21b815260040160405180910390fd5b610858610804565b60009283526006016020525060409020546001600160a01b031690565b600061088083610602565b905081156108bf57336001600160a01b038216146108bf576108a28133610d86565b6108bf576040516367d9dca160e11b815260040160405180910390fd5b836108c8610804565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b600080610935610804565b60010154610941610804565b540303919050565b600080610954610804565b60008481526004820160205260408120549350909150600160e01b831690036109ca57816000036109c457805483106109a057604051636f96cda160e11b815260040160405180910390fd5b5b6000199092016000818152600484016020526040902054909290915081156109a1575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b60008060006109f1610804565b60009485526006016020525050604090912080549092909150565b6000610a16610804565b5490506000829003610a3b5760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202610a4f610804565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717610a8a610804565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083906000805160206114f68339815191528180a4600183015b818114610af057808360006000805160206114f6833981519152600080a4600101610aca565b5081600003610b1157604051622e076360e81b815260040160405180910390fd5b80610b1a610804565b55506105f19050565b6105ff816000610dc3565b60006001600160a01b038216610b57576040516323d3ad8160e21b815260040160405180910390fd5b67ffffffffffffffff610b68610804565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6000610ba1610804565b54919050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290610bdc903390899088908890600401611386565b6020604051808303816000875af1925050508015610c17575060408051601f3d908101601f19168201909252610c14918101906113c3565b60015b610c75573d808015610c45576040519150601f19603f3d011682016040523d82523d6000602084013e610c4a565b606091505b508051600003610c6d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000610c9c610804565b54821080156103c25750600160e01b610cb3610804565b60008481526004919091016020526040902054161592915050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480610ce85750819003601f19909101908152919050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff16610d5c57604051630ef4733760e31b815260040160405180910390fd5b610d6c6380ac58cd60e01b610f04565b610d7c635b5e139f60e01b610f04565b6103d48282610fe2565b6000610d90610804565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b6000610dce83610949565b905080600080610ddd866109e4565b915091508415610e1d57610df2818433610441565b610e1d57610e008333610d86565b610e1d57604051632ce44b5f60e11b815260040160405180910390fd5b8015610e2857600082555b6000610e32610804565b6001600160a01b0385166000818152600583016020526040902080546fffffffffffffffffffffffffffffffff0190559091504260a01b17600360e01b176000888152600483016020526040812091909155600160e11b86169003610eca576001870160008181526004830160205260408120549003610ec85781548114610ec857600081815260048301602052604090208690555b505b60405187906000906001600160a01b038716906000805160206114f6833981519152908390a4600190810180549091019055505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610f91576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610faa565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6000610fec610804565b905060028101610ffc8482611435565b506003810161100b8382611435565b50600090555050565b60005b8381101561102f578181015183820152602001611017565b50506000910152565b60008151808452611050816020860160208601611014565b601f01601f19169290920160200192915050565b60208152600061079d6020830184611038565b60006020828403121561108957600080fd5b5035919050565b80356001600160a01b038116811461062f57600080fd5b600080604083850312156110ba57600080fd5b6110c383611090565b946020939093013593505050565b6000806000606084860312156110e657600080fd5b6110ef84611090565b92506110fd60208501611090565b9150604084013590509250925092565b60006020828403121561111f57600080fd5b61079d82611090565b6000806040838503121561113b57600080fd5b61114483611090565b91506020830135801515811461115957600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561119557611195611164565b604051601f8501601f19908116603f011681019082821181831017156111bd576111bd611164565b816040528093508581528686860111156111d657600080fd5b858560208301376000602087830101525050509392505050565b6000806000806080858703121561120657600080fd5b61120f85611090565b935061121d60208601611090565b925060408501359150606085013567ffffffffffffffff81111561124057600080fd5b8501601f8101871361125157600080fd5b6112608782356020840161117a565b91505092959194509250565b600082601f83011261127d57600080fd5b61079d8383356020850161117a565b6000806040838503121561129f57600080fd5b823567ffffffffffffffff808211156112b757600080fd5b6112c38683870161126c565b935060208501359150808211156112d957600080fd5b506112e68582860161126c565b9150509250929050565b6000806040838503121561130357600080fd5b61130c83611090565b915061131a60208401611090565b90509250929050565b600181811c9082168061133757607f821691505b6020821081036109c457634e487b7160e01b600052602260045260246000fd5b60008351611369818460208801611014565b83519083019061137d818360208801611014565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906113b990830184611038565b9695505050505050565b6000602082840312156113d557600080fd5b81516001600160e01b03198116811461079d57600080fd5b601f8211156105f1576000816000526020600020601f850160051c810160208610156114165750805b601f850160051c820191505b818110156105c457828155600101611422565b815167ffffffffffffffff81111561144f5761144f611164565b6114638161145d8454611323565b846113ed565b602080601f83116001811461149857600084156114805750858301515b600019600386901b1c1916600185901b1785556105c4565b600085815260208120601f198616915b828110156114c7578886015182559484019460019091019084016114a8565b50858210156114e55787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"; + +type MockERC721AConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: MockERC721AConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class MockERC721A__factory extends ContractFactory { + constructor(...args: MockERC721AConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy(overrides || {}) as Promise; + } + override getDeployTransaction( + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction(overrides || {}); + } + override attach(address: string): MockERC721A { + return super.attach(address) as MockERC721A; + } + override connect(signer: Signer): MockERC721A__factory { + return super.connect(signer) as MockERC721A__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): MockERC721AInterface { + return new utils.Interface(_abi) as MockERC721AInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): MockERC721A { + return new Contract(address, _abi, signerOrProvider) as MockERC721A; + } +} diff --git a/packages/generated/dev/typings/factories/MockEntitlementGated__factory.ts b/packages/generated/dev/typings/factories/MockEntitlementGated__factory.ts new file mode 100644 index 000000000..7a0ffb346 --- /dev/null +++ b/packages/generated/dev/typings/factories/MockEntitlementGated__factory.ts @@ -0,0 +1,503 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../common"; +import type { + MockEntitlementGated, + MockEntitlementGatedInterface, +} from "../MockEntitlementGated"; + +const _abi = [ + { + type: "constructor", + inputs: [ + { + name: "checker", + type: "address", + internalType: "contract IEntitlementChecker", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "__EntitlementGated_init", + inputs: [ + { + name: "entitlementChecker", + type: "address", + internalType: "contract IEntitlementChecker", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "getRuleData", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct IRuleEntitlement.RuleData", + components: [ + { + name: "operations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.Operation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CombinedOperationType", + }, + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + name: "checkOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.CheckOperation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CheckOperationType", + }, + { + name: "chainId", + type: "uint256", + internalType: "uint256", + }, + { + name: "contractAddress", + type: "address", + internalType: "address", + }, + { + name: "threshold", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "logicalOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.LogicalOperation[]", + components: [ + { + name: "logOpType", + type: "uint8", + internalType: "enum IRuleEntitlement.LogicalOperationType", + }, + { + name: "leftOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "rightOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getRuleData", + inputs: [ + { + name: "transactionId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct IRuleEntitlement.RuleData", + components: [ + { + name: "operations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.Operation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CombinedOperationType", + }, + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + name: "checkOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.CheckOperation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CheckOperationType", + }, + { + name: "chainId", + type: "uint256", + internalType: "uint256", + }, + { + name: "contractAddress", + type: "address", + internalType: "address", + }, + { + name: "threshold", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "logicalOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.LogicalOperation[]", + components: [ + { + name: "logOpType", + type: "uint8", + internalType: "enum IRuleEntitlement.LogicalOperationType", + }, + { + name: "leftOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "rightOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "postEntitlementCheckResult", + inputs: [ + { + name: "transactionId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "result", + type: "uint8", + internalType: "enum IEntitlementGatedBase.NodeVoteStatus", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "requestEntitlementCheck", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "ruleData", + type: "tuple", + internalType: "struct IRuleEntitlement.RuleData", + components: [ + { + name: "operations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.Operation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CombinedOperationType", + }, + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + name: "checkOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.CheckOperation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CheckOperationType", + }, + { + name: "chainId", + type: "uint256", + internalType: "uint256", + }, + { + name: "contractAddress", + type: "address", + internalType: "address", + }, + { + name: "threshold", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "logicalOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.LogicalOperation[]", + components: [ + { + name: "logOpType", + type: "uint8", + internalType: "enum IRuleEntitlement.LogicalOperationType", + }, + { + name: "leftOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "rightOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "EntitlementCheckResultPosted", + inputs: [ + { + name: "transactionId", + type: "bytes32", + indexed: true, + internalType: "bytes32", + }, + { + name: "result", + type: "uint8", + indexed: false, + internalType: "enum IEntitlementGatedBase.NodeVoteStatus", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceAdded", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceRemoved", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "EntitlementGated_InvalidAddress", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_NodeAlreadyVoted", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_NodeNotFound", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_TransactionCheckAlreadyCompleted", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_TransactionCheckAlreadyRegistered", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_TransactionNotRegistered", + inputs: [], + }, + { + type: "error", + name: "Initializable_InInitializingState", + inputs: [], + }, + { + type: "error", + name: "Initializable_NotInInitializingState", + inputs: [], + }, + { + type: "error", + name: "Introspection_AlreadySupported", + inputs: [], + }, + { + type: "error", + name: "Introspection_NotSupported", + inputs: [], + }, + { + type: "error", + name: "ReentrancyGuard__ReentrantCall", + inputs: [], + }, +] as const; + +const _bytecode = + "0x60806040523480156200001157600080fd5b5060405162001b9a38038062001b9a833981016040819052620000349162000127565b6200003e6200007f565b7f9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e0080546001600160a01b0319166001600160a01b0383161790555062000159565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff1615620000cc576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156200012457805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6000602082840312156200013a57600080fd5b81516001600160a01b03811681146200015257600080fd5b9392505050565b611a3180620001696000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063069a3ee91461005c5780634739e8051461008557806357e700271461009a5780637adc9cbe146100bb57806392c399ff146100ce575b600080fd5b61006f61006a366004610e1e565b6100e1565b60405161007c9190610f28565b60405180910390f35b610098610093366004610fd8565b610314565b005b6100ad6100a8366004611011565b6103b8565b60405190815260200161007c565b6100986100c9366004611074565b610426565b61006f6100dc366004611091565b61047c565b61010560405180606001604052806060815260200160608152602001606081525090565b6000828152602081815260408083208151815460809481028201850190935260608101838152909491938593919285929185015b828210156101a257600084815260209020604080518082019091529083018054829060ff16600281111561016f5761016f610e37565b600281111561018057610180610e37565b81529054610100900460ff166020918201529082526001929092019101610139565b50505050815260200160018201805480602002602001604051908101604052809291908181526020016000905b8282101561025a576000848152602090206040805160808101909152600484029091018054829060ff16600581111561020a5761020a610e37565b600581111561021b5761021b610e37565b815260018281015460208084019190915260028401546001600160a01b03166040840152600390930154606090920191909152918352920191016101cf565b50505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156103065760008481526020902060408051606081019091529083018054829060ff1660028111156102be576102be610e37565b60028111156102cf576102cf610e37565b8152905460ff6101008204811660208085019190915262010000909204166040909201919091529082526001929092019101610287565b505050915250909392505050565b60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a00540361035657604051635db5c7cd60e11b815260040160405180910390fd5b61037f60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b61038a8383836104aa565b6103b360017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b505050565b600082815260208190526040812082906103d2828261140a565b50506040516bffffffffffffffffffffffff193260601b16602082015243603482015260009060540160405160208183030381529060405280519060200120905061041f81306000610743565b9392505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661047057604051630ef4733760e31b815260040160405180910390fd5b610479816109f2565b50565b6104a060405180606001604052806060815260200160608152602001606081525090565b61041f8383610a2d565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919061010090046001600160a01b031615806104f45750805460ff16155b1561051257604051637ad5a43960e11b815260040160405180910390fd5b600084815260028201602052604090205460ff161561054457604051637912b73960e01b815260040160405180910390fd5b600084815260018201602052604081205481908190815b8181101561068257600089815260018701602052604081208054839081106105855761058561150e565b60009182526020909120018054909150336001600160a01b03909116036106115760008154600160a01b900460ff1660028111156105c5576105c5610e37565b146105e3576040516347592a4d60e01b815260040160405180910390fd5b80548990829060ff60a01b1916600160a01b83600281111561060757610607610e37565b0217905550600195505b60018154600160a01b900460ff16600281111561063057610630610e37565b03610647578461063f81611524565b955050610679565b60028154600160a01b900460ff16600281111561066657610666610e37565b03610679578361067581611524565b9450505b5060010161055b565b50836106a157604051638223a7e960e01b815260040160405180910390fd5b6106ac60028261153d565b8311806106c257506106bf60028261153d565b82115b156107385760008881526002860160205260408120805460ff191660011790558284116106f05760026106f3565b60015b9050897fb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c63382604051610725919061155f565b60405180910390a26107368a610b27565b505b505050505050505050565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919060ff1615156001036107d55760005b60048201548110156107d357838260040182815481106107a2576107a261150e565b9060005260206000200154036107cb576040516301ab53df60e31b815260040160405180910390fd5b600101610780565b505b81546001600160a01b03166107ec576107ec610bfb565b8154604051634f84544560e01b8152600560048201526000916001600160a01b031690634f84544590602401600060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085d9190810190611636565b825490915060ff1661089e5781546003830180546001600160a01b0319166001600160a01b0388161790556001600160a81b03191661010033021760011782555b600482018054600181018255600091825260208220018590555b815181101561098e5782600101600086815260200190815260200160002060405180604001604052808484815181106108f3576108f361150e565b60200260200101516001600160a01b031681526020016000600281111561091c5761091c610e37565b9052815460018101835560009283526020928390208251910180546001600160a01b031981166001600160a01b03909316928317825593830151929390929183916001600160a81b03191617600160a01b83600281111561097f5761097f610e37565b021790555050506001016108b8565b50825460405163541da4e560e01b81526001600160a01b039091169063541da4e5906109c49033908a90899087906004016116ca565b600060405180830381600087803b1580156109de57600080fd5b505af1158015610736573d6000803e3d6000fd5b610a02636afd38fd60e11b610ccc565b6000805160206119f183398151915280546001600160a01b0319166001600160a01b03831617905550565b610a5160405180606001604052806060815260200160608152602001606081525090565b6000838152600080516020611a118339815191526020526040812080546000805160206119f18339815191529260ff90911615159003610aa457604051637ad5a43960e11b815260040160405180910390fd5b600381015460405163069a3ee960e01b8152600481018690526001600160a01b0390911690600090829063069a3ee990602401600060405180830381865afa158015610af4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b1c9190810190611893565b979650505050505050565b6000818152600080516020611a11833981519152602052604081206000805160206119f1833981519152915b6004820154811015610ba757816001016000836004018381548110610b7a57610b7a61150e565b906000526020600020015481526020019081526020016000206000610b9f9190610daa565b600101610b53565b50610bb6600482016000610dc8565b6000838152600183016020526040812080546001600160a81b03191681556003810180546001600160a01b031916905590610bf46004830182610dc8565b5050505050565b60006000805160206119f1833981519152905060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60060060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad91906119d3565b82546001600160a01b0319166001600160a01b03919091161790915550565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610d59576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610d72565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b50805460008255906000526020600020908101906104799190610de6565b50805460008255906000526020600020908101906104799190610e09565b5b80821115610e055780546001600160a81b0319168155600101610de7565b5090565b5b80821115610e055760008155600101610e0a565b600060208284031215610e3057600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b6003811061047957610479610e37565b60008151808452602080850194506020840160005b83811015610ec7578151805160068110610e8e57610e8e610e37565b885280840151848901526040808201516001600160a01b0316908901526060908101519088015260809096019590820190600101610e72565b509495945050505050565b60008151808452602080850194506020840160005b83811015610ec75781518051610efc81610e4d565b88528084015160ff908116858a0152604091820151169088015260609096019590820190600101610ee7565b6020808252825160608383015280516080840181905260009291820190839060a08601905b80831015610f845783518051610f6281610e4d565b835285015160ff16858301529284019260019290920191604090910190610f4d565b50838701519350601f19925082868203016040870152610fa48185610e5d565b93505050604085015181858403016060860152610fc18382610ed2565b9695505050505050565b6003811061047957600080fd5b600080600060608486031215610fed57600080fd5b8335925060208401359150604084013561100681610fcb565b809150509250925092565b6000806040838503121561102457600080fd5b82359150602083013567ffffffffffffffff81111561104257600080fd5b83016060818603121561105457600080fd5b809150509250929050565b6001600160a01b038116811461047957600080fd5b60006020828403121561108657600080fd5b813561041f8161105f565b600080604083850312156110a457600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60ff8116811461047957600080fd5b81356110f981610fcb565b61110281610e4d565b60ff1982541660ff82168117835550506020820135611120816110df565b815461ff001916600882901b61ff0016178255505050565b6000808335601e1984360301811261114f57600080fd5b83018035915067ffffffffffffffff82111561116a57600080fd5b6020019150600781901b360382131561118257600080fd5b9250929050565b6006811061047957600080fd5b81356111a181611189565b600681106111b1576111b1610e37565b60ff1982541660ff8216811783555050602082013560018201556002810160408301356111dd8161105f565b81546001600160a01b0319166001600160a01b03919091161790556060919091013560039190910155565b600160401b83111561121c5761121c6110b3565b80548382558084101561129a5760026001600160fe1b038281168314611244576112446110c9565b8086168614611255576112556110c9565b506000838152602081208360021b81018760021b820191505b8082101561129557828255826001830155828483015582600383015560048201915061126e565b505050505b5060008181526020812083915b858110156112cf576112b98383611196565b60809290920191600491909101906001016112a7565b505050505050565b6000808335601e198436030181126112ee57600080fd5b83018035915067ffffffffffffffff82111561130957600080fd5b602001915060608102360382131561118257600080fd5b813561132b81610fcb565b61133481610e4d565b60ff1982541660ff82168117835550506020820135611352816110df565b815461ff001916600882901b61ff0016178255506040820135611374816110df565b815462ff0000191660109190911b62ff00001617905550565b600160401b8311156113a1576113a16110b3565b8054838255808410156113d8576000828152602081208581019083015b808210156113d4578282556001820191506113be565b5050505b5060008181526020812083915b858110156112cf576113f78383611320565b60609290920191600191820191016113e5565b8135601e1983360301811261141e57600080fd5b8201803567ffffffffffffffff81111561143757600080fd5b6020820191508060061b360382131561144f57600080fd5b600160401b811115611463576114636110b3565b82548184558082101561149a576000848152602081208381019083015b8082101561149657828255600182019150611480565b5050505b5060008381526020902060005b828110156114cc576114b984836110ee565b60409390930192600191820191016114a7565b505050506114dd6020830183611138565b6114eb818360018601611208565b50506114fa60408301836112d7565b61150881836002860161138d565b50505050565b634e487b7160e01b600052603260045260246000fd5b600060018201611536576115366110c9565b5060010190565b60008261155a57634e487b7160e01b600052601260045260246000fd5b500490565b6020810161156c83610e4d565b91905290565b6040516080810167ffffffffffffffff81118282101715611595576115956110b3565b60405290565b6040516060810167ffffffffffffffff81118282101715611595576115956110b3565b6040805190810167ffffffffffffffff81118282101715611595576115956110b3565b604051601f8201601f1916810167ffffffffffffffff8111828210171561160a5761160a6110b3565b604052919050565b600067ffffffffffffffff82111561162c5761162c6110b3565b5060051b60200190565b6000602080838503121561164957600080fd5b825167ffffffffffffffff81111561166057600080fd5b8301601f8101851361167157600080fd5b805161168461167f82611612565b6115e1565b81815260059190911b820183019083810190878311156116a357600080fd5b928401925b82841015610b1c5783516116bb8161105f565b825292840192908401906116a8565b60006080820160018060a01b03808816845260208760208601528660408601526080606086015282865180855260a08701915060208801945060005b81811015611724578551851683529483019491830191600101611706565b50909a9950505050505050505050565b600082601f83011261174557600080fd5b8151602061175561167f83611612565b82815260079290921b8401810191818101908684111561177457600080fd5b8286015b848110156117d957608081890312156117915760008081fd5b611799611572565b81516117a481611189565b815281850151858201526040808301516117bd8161105f565b9082015260608281015190820152835291830191608001611778565b509695505050505050565b600082601f8301126117f557600080fd5b8151602061180561167f83611612565b8281526060928302850182019282820191908785111561182457600080fd5b8387015b858110156118865781818a0312156118405760008081fd5b61184861159b565b815161185381610fcb565b815281860151611862816110df565b81870152604082810151611875816110df565b908201528452928401928101611828565b5090979650505050505050565b600060208083850312156118a657600080fd5b825167ffffffffffffffff808211156118be57600080fd5b90840190606082870312156118d257600080fd5b6118da61159b565b8251828111156118e957600080fd5b8301601f810188136118fa57600080fd5b805161190861167f82611612565b81815260069190911b8201860190868101908a83111561192757600080fd5b928701925b8284101561197d576040848c0312156119455760008081fd5b61194d6115be565b845161195881610fcb565b815284890151611967816110df565b818a01528252604093909301929087019061192c565b8452505050828401518281111561199357600080fd5b61199f88828601611734565b858301525060408301519350818411156119b857600080fd5b6119c4878585016117e4565b60408201529695505050505050565b6000602082840312156119e557600080fd5b815161041f8161105f56fe9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e01"; + +type MockEntitlementGatedConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: MockEntitlementGatedConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class MockEntitlementGated__factory extends ContractFactory { + constructor(...args: MockEntitlementGatedConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + checker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy( + checker, + overrides || {} + ) as Promise; + } + override getDeployTransaction( + checker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction(checker, overrides || {}); + } + override attach(address: string): MockEntitlementGated { + return super.attach(address) as MockEntitlementGated; + } + override connect(signer: Signer): MockEntitlementGated__factory { + return super.connect(signer) as MockEntitlementGated__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): MockEntitlementGatedInterface { + return new utils.Interface(_abi) as MockEntitlementGatedInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): MockEntitlementGated { + return new Contract( + address, + _abi, + signerOrProvider + ) as MockEntitlementGated; + } +} diff --git a/packages/generated/dev/typings/factories/OwnableFacet__factory.ts b/packages/generated/dev/typings/factories/OwnableFacet__factory.ts new file mode 100644 index 000000000..1111c232e --- /dev/null +++ b/packages/generated/dev/typings/factories/OwnableFacet__factory.ts @@ -0,0 +1,193 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../common"; +import type { OwnableFacet, OwnableFacetInterface } from "../OwnableFacet"; + +const _abi = [ + { + type: "function", + name: "__Ownable_init", + inputs: [ + { + name: "owner_", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "owner", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "transferOwnership", + inputs: [ + { + name: "newOwner", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceAdded", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceRemoved", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OwnershipTransferred", + inputs: [ + { + name: "previousOwner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newOwner", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "Initializable_InInitializingState", + inputs: [], + }, + { + type: "error", + name: "Initializable_NotInInitializingState", + inputs: [], + }, + { + type: "error", + name: "Introspection_AlreadySupported", + inputs: [], + }, + { + type: "error", + name: "Introspection_NotSupported", + inputs: [], + }, + { + type: "error", + name: "Ownable__NotOwner", + inputs: [ + { + name: "account", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "Ownable__ZeroAddress", + inputs: [], + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b610337806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80638da5cb5b14610046578063d78f00211461006a578063f2fde38b1461007f575b600080fd5b61004e610092565b6040516001600160a01b03909116815260200160405180910390f35b61007d610078366004610307565b6100a1565b005b61007d61008d366004610307565b6100f7565b600061009c61013f565b905090565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166100eb57604051630ef4733760e31b815260040160405180910390fd5b6100f48161016d565b50565b6100ff61013f565b6001600160a01b0316336001600160a01b031614610136576040516365f4906560e01b815233600482015260240160405180910390fd5b6100f481610186565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b61017681610186565b6100f46307f5828d60e41b610229565b600061019061013f565b90506001600160a01b0382166101b957604051634e3ef82560e01b815260040160405180910390fd5b817f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae30080546001600160a01b0319166001600160a01b03928316179055604051838216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146102b6576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff191660011790556102cf565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006020828403121561031957600080fd5b81356001600160a01b038116811461033057600080fd5b939250505056"; + +type OwnableFacetConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: OwnableFacetConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class OwnableFacet__factory extends ContractFactory { + constructor(...args: OwnableFacetConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy(overrides || {}) as Promise; + } + override getDeployTransaction( + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction(overrides || {}); + } + override attach(address: string): OwnableFacet { + return super.attach(address) as OwnableFacet; + } + override connect(signer: Signer): OwnableFacet__factory { + return super.connect(signer) as OwnableFacet__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): OwnableFacetInterface { + return new utils.Interface(_abi) as OwnableFacetInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): OwnableFacet { + return new Contract(address, _abi, signerOrProvider) as OwnableFacet; + } +} diff --git a/packages/generated/dev/typings/factories/PrepayFacet__factory.ts b/packages/generated/dev/typings/factories/PrepayFacet__factory.ts new file mode 100644 index 000000000..dcd736118 --- /dev/null +++ b/packages/generated/dev/typings/factories/PrepayFacet__factory.ts @@ -0,0 +1,306 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../common"; +import type { PrepayFacet, PrepayFacetInterface } from "../PrepayFacet"; + +const _abi = [ + { + type: "function", + name: "__PrepayFacet_init", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "calculateMembershipPrepayFee", + inputs: [ + { + name: "supply", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "prepaidMembershipSupply", + inputs: [ + { + name: "account", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "prepayMembership", + inputs: [ + { + name: "membership", + type: "address", + internalType: "address", + }, + { + name: "supply", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceAdded", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceRemoved", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "PlatformFeeRecipientSet", + inputs: [ + { + name: "recipient", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "PlatformMembershipBpsSet", + inputs: [ + { + name: "bps", + type: "uint16", + indexed: false, + internalType: "uint16", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "PlatformMembershipDurationSet", + inputs: [ + { + name: "duration", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "PlatformMembershipFeeSet", + inputs: [ + { + name: "fee", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "PlatformMembershipMintLimitSet", + inputs: [ + { + name: "limit", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "PrepayBase__Prepaid", + inputs: [ + { + name: "membership", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "supply", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "Initializable_InInitializingState", + inputs: [], + }, + { + type: "error", + name: "Initializable_NotInInitializingState", + inputs: [], + }, + { + type: "error", + name: "Introspection_AlreadySupported", + inputs: [], + }, + { + type: "error", + name: "Introspection_NotSupported", + inputs: [], + }, + { + type: "error", + name: "Platform__InvalidFeeRecipient", + inputs: [], + }, + { + type: "error", + name: "Platform__InvalidMembershipBps", + inputs: [], + }, + { + type: "error", + name: "Platform__InvalidMembershipDuration", + inputs: [], + }, + { + type: "error", + name: "Platform__InvalidMembershipMintLimit", + inputs: [], + }, + { + type: "error", + name: "PrepayBase__InvalidAddress", + inputs: [], + }, + { + type: "error", + name: "PrepayBase__InvalidAmount", + inputs: [], + }, + { + type: "error", + name: "PrepayBase__InvalidMembership", + inputs: [], + }, + { + type: "error", + name: "ReentrancyGuard__ReentrantCall", + inputs: [], + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6107a5806100d36000396000f3fe60806040526004361061003f5760003560e01c806327bc79f11461004457806386272406146100765780639262b1b31461008b578063aabe967d146100ab575b600080fd5b34801561005057600080fd5b5061006461005f36600461068c565b6100c0565b60405190815260200160405180910390f35b6100896100843660046106bd565b6100d1565b005b34801561009757600080fd5b506100646100a63660046106e9565b6103bb565b3480156100b757600080fd5b506100896103f8565b60006100cb82610454565b92915050565b60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a00540361011357604051635db5c7cd60e11b815260040160405180910390fd5b61013c60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b8060000361015d57604051632484b54d60e01b815260040160405180910390fd5b6001600160a01b03821661018457604051631ea9dac160e21b815260040160405180910390fd5b6040516301ffc9a760e01b815263421fb7a760e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa1580156101cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f3919061070d565b6102105760405163b2c5c0f360e01b815260040160405180910390fd5b336001600160a01b0316826001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610258573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027c919061072f565b6001600160a01b0316146102a357604051631ea9dac160e21b815260040160405180910390fd5b60006102d67fb29a817dd0719f30ad87abc8dff26e6354077e5b46bf38f34d5ac48732860d02546001600160a01b031690565b905060006102e383610454565b90508034101561030657604051632484b54d60e01b815260040160405180910390fd5b600083856001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036b919061074c565b610375919061077b565b90506103818582610488565b61038b8383610502565b5050506103b760017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b5050565b6001600160a01b03811660009081527f097b4f25b64e012d0cf55f67e9b34fe5d57f15b11b95baa4ddd136b424967c0060205260408120546100cb565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661044257604051630ef4733760e31b815260040160405180910390fd5b610452630cfe7b1160e21b6105ae565b565b600061047e7fb29a817dd0719f30ad87abc8dff26e6354077e5b46bf38f34d5ac48732860d005490565b6100cb908361078e565b60007f097b4f25b64e012d0cf55f67e9b34fe5d57f15b11b95baa4ddd136b424967c006001600160a01b03841660008181526020838152604091829020869055905185815292935090917f884527d8d797310d66e571e2a24daeddc15ae52474ef2c763ab29b60c5678369910160405180910390a2505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461054f576040519150601f19603f3d011682016040523d82523d6000602084013e610554565b606091505b50509050806105a95760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c656400000000604482015260640160405180910390fd5b505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff16151560011461063b576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610654565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006020828403121561069e57600080fd5b5035919050565b6001600160a01b03811681146106ba57600080fd5b50565b600080604083850312156106d057600080fd5b82356106db816106a5565b946020939093013593505050565b6000602082840312156106fb57600080fd5b8135610706816106a5565b9392505050565b60006020828403121561071f57600080fd5b8151801515811461070657600080fd5b60006020828403121561074157600080fd5b8151610706816106a5565b60006020828403121561075e57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156100cb576100cb610765565b80820281158282048414176100cb576100cb61076556"; + +type PrepayFacetConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: PrepayFacetConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class PrepayFacet__factory extends ContractFactory { + constructor(...args: PrepayFacetConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy(overrides || {}) as Promise; + } + override getDeployTransaction( + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction(overrides || {}); + } + override attach(address: string): PrepayFacet { + return super.attach(address) as PrepayFacet; + } + override connect(signer: Signer): PrepayFacet__factory { + return super.connect(signer) as PrepayFacet__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): PrepayFacetInterface { + return new utils.Interface(_abi) as PrepayFacetInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): PrepayFacet { + return new Contract(address, _abi, signerOrProvider) as PrepayFacet; + } +} diff --git a/packages/generated/dev/typings/factories/TokenPausableFacet__factory.ts b/packages/generated/dev/typings/factories/TokenPausableFacet__factory.ts new file mode 100644 index 000000000..3276b8504 --- /dev/null +++ b/packages/generated/dev/typings/factories/TokenPausableFacet__factory.ts @@ -0,0 +1,227 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../common"; +import type { + TokenPausableFacet, + TokenPausableFacetInterface, +} from "../TokenPausableFacet"; + +const _abi = [ + { + type: "function", + name: "__Pausable_init", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "pause", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "paused", + inputs: [], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "unpause", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceAdded", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceRemoved", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OwnershipTransferred", + inputs: [ + { + name: "previousOwner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newOwner", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Paused", + inputs: [ + { + name: "account", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Unpaused", + inputs: [ + { + name: "account", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "Initializable_InInitializingState", + inputs: [], + }, + { + type: "error", + name: "Initializable_NotInInitializingState", + inputs: [], + }, + { + type: "error", + name: "Introspection_AlreadySupported", + inputs: [], + }, + { + type: "error", + name: "Introspection_NotSupported", + inputs: [], + }, + { + type: "error", + name: "Ownable__NotOwner", + inputs: [ + { + name: "account", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "Ownable__ZeroAddress", + inputs: [], + }, + { + type: "error", + name: "Pausable__NotPaused", + inputs: [], + }, + { + type: "error", + name: "Pausable__Paused", + inputs: [], + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b610391806100d36000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80633f4ba83a146100515780635c975abb1461005b5780638456cb591461007757806384d2023a1461007f575b600080fd5b610059610087565b005b610063610101565b604051901515815260200160405180910390f35b610059610121565b610059610195565b61008f6101df565b6001600160a01b0316336001600160a01b0316146100c7576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6000805160206103718339815191525460ff166100f757604051632ca4452d60e11b815260040160405180910390fd5b6100ff6102a9565b565b600061011c6000805160206103718339815191525460ff1690565b905090565b6101296101df565b6001600160a01b0316336001600160a01b03161461015c576040516365f4906560e01b81523360048201526024016100be565b6000805160206103718339815191525460ff161561018d576040516302ca8ced60e11b815260040160405180910390fd5b6100ff6102f6565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166100f757604051630ef4733760e31b815260040160405180910390fd5b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa15801561027f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102a39190610340565b91505090565b600080516020610371833981519152805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b600080516020610371833981519152805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016102ec565b60006020828403121561035257600080fd5b81516001600160a01b038116811461036957600080fd5b939250505056fee17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb00"; + +type TokenPausableFacetConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: TokenPausableFacetConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class TokenPausableFacet__factory extends ContractFactory { + constructor(...args: TokenPausableFacetConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy(overrides || {}) as Promise; + } + override getDeployTransaction( + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction(overrides || {}); + } + override attach(address: string): TokenPausableFacet { + return super.attach(address) as TokenPausableFacet; + } + override connect(signer: Signer): TokenPausableFacet__factory { + return super.connect(signer) as TokenPausableFacet__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): TokenPausableFacetInterface { + return new utils.Interface(_abi) as TokenPausableFacetInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): TokenPausableFacet { + return new Contract(address, _abi, signerOrProvider) as TokenPausableFacet; + } +} diff --git a/packages/generated/dev/typings/factories/UserEntitlement__factory.ts b/packages/generated/dev/typings/factories/UserEntitlement__factory.ts new file mode 100644 index 000000000..7c948249a --- /dev/null +++ b/packages/generated/dev/typings/factories/UserEntitlement__factory.ts @@ -0,0 +1,392 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../common"; +import type { + UserEntitlement, + UserEntitlementInterface, +} from "../UserEntitlement"; + +const _abi = [ + { + type: "constructor", + inputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "SPACE_ADDRESS", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "UPGRADE_INTERFACE_VERSION", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "description", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getEntitlementDataByRoleId", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "bytes", + internalType: "bytes", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "initialize", + inputs: [ + { + name: "_space", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "isCrosschain", + inputs: [], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "pure", + }, + { + type: "function", + name: "isEntitled", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "wallets", + type: "address[]", + internalType: "address[]", + }, + { + name: "permission", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "moduleType", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "name", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "proxiableUUID", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "removeEntitlement", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setEntitlement", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "entitlementData", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "supportsInterface", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + internalType: "bytes4", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "upgradeToAndCall", + inputs: [ + { + name: "newImplementation", + type: "address", + internalType: "address", + }, + { + name: "data", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint64", + indexed: false, + internalType: "uint64", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Upgraded", + inputs: [ + { + name: "implementation", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "AddressEmptyCode", + inputs: [ + { + name: "target", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "ERC1967InvalidImplementation", + inputs: [ + { + name: "implementation", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "ERC1967NonPayable", + inputs: [], + }, + { + type: "error", + name: "Entitlement__InvalidValue", + inputs: [], + }, + { + type: "error", + name: "Entitlement__NotAllowed", + inputs: [], + }, + { + type: "error", + name: "Entitlement__NotMember", + inputs: [], + }, + { + type: "error", + name: "Entitlement__ValueAlreadyExists", + inputs: [], + }, + { + type: "error", + name: "FailedInnerCall", + inputs: [], + }, + { + type: "error", + name: "InvalidInitialization", + inputs: [], + }, + { + type: "error", + name: "NotInitializing", + inputs: [], + }, + { + type: "error", + name: "UUPSUnauthorizedCallContext", + inputs: [], + }, + { + type: "error", + name: "UUPSUnsupportedProxiableUUID", + inputs: [ + { + name: "slot", + type: "bytes32", + internalType: "bytes32", + }, + ], + }, +] as const; + +const _bytecode = + "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051611ae36100fd60003960008181610aa101528181610aca0152610c410152611ae36000f3fe6080604052600436106100dd5760003560e01c806352d1902d1161007f578063ad3cb1cc11610059578063ad3cb1cc146102a0578063c4d66de8146102d1578063ef8be574146102f1578063f0c111f91461031157600080fd5b806352d1902d146102015780636465e69f146102245780637284e4161461025f57600080fd5b80631eee07b2116100bb5780631eee07b2146101805780632e1b61e4146101a057806334322eff146101b45780634f1ef286146101ec57600080fd5b806301ffc9a7146100e257806306fdde03146101175780630cf0b53314610160575b600080fd5b3480156100ee57600080fd5b506101026100fd3660046113fc565b610331565b60405190151581526020015b60405180910390f35b34801561012357600080fd5b506101536040518060400160405280601081526020016f155cd95c88115b9d1a5d1b195b595b9d60821b81525081565b60405161010e9190611476565b34801561016c57600080fd5b5061010261017b3660046115ac565b610368565b34801561018c57600080fd5b5061015361019b3660046115fb565b610393565b3480156101ac57600080fd5b506000610102565b3480156101c057600080fd5b506000546101d4906001600160a01b031681565b6040516001600160a01b03909116815260200161010e565b6101ff6101fa36600461163b565b6103d1565b005b34801561020d57600080fd5b506102166103f0565b60405190815260200161010e565b34801561023057600080fd5b506101536040518060400160405280600f81526020016e155cd95c915b9d1a5d1b195b595b9d608a1b81525081565b34801561026b57600080fd5b5061015360405180604001604052806015815260200174456e7469746c656d656e7420666f7220757365727360581b81525081565b3480156102ac57600080fd5b50610153604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156102dd57600080fd5b506101ff6102ec3660046116c6565b61040d565b3480156102fd57600080fd5b506101ff61030c3660046116e1565b610545565b34801561031d57600080fd5b506101ff61032c3660046115fb565b6107bb565b60006001600160e01b03198216637bc2cb4560e11b148061036257506301ffc9a760e01b6001600160e01b03198316145b92915050565b600083156103825761037b84848461090b565b905061038c565b61037b8383610a36565b9392505050565b6060600160008381526020019081526020016000206002016040516020016103bb919061175c565b6040516020818303038152906040529050919050565b6103d9610a96565b6103e282610b3d565b6103ec8282610b74565b5050565b60006103fa610c36565b50600080516020611ac383398151915290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156104525750825b90506000826001600160401b0316600114801561046e5750303b155b90508115801561047c575080155b1561049a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156104c457845460ff60401b1916600160401b1785555b6104cc610c7f565b6104d4610c7f565b6104dc610c7f565b600080546001600160a01b0319166001600160a01b038816179055831561053d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b6000546001600160a01b0316336001600160a01b03161461057957604051630ce39a4b60e21b815260040160405180910390fd5b6000610587828401846117ac565b905060005b81518110156105ef5760008282815181106105a9576105a96117e8565b6020026020010151905060006001600160a01b0316816001600160a01b0316036105e6576040516372bbc80f60e11b815260040160405180910390fd5b5060010161058c565b505b600084815260016020526040902060020154156106a157600084815260016020819052604082206002018054909161062891611814565b81548110610638576106386117e8565b6000918252602090912001546001600160a01b031690506106598186610c87565b600085815260016020526040902060020180548061067957610679611827565b600082815260209020810160001990810180546001600160a01b0319169055019055506105f1565b6000848152600160208190526040822080546001600160a01b0319168155908101829055906106d36002830182611364565b505060405180606001604052806106e73390565b6001600160a01b0390811682524260208084019190915260409283018590526000888152600180835290849020855181546001600160a01b03191694169390931783558482015190830155918301518051919261074c92600285019290910190611382565b5090505060005b81518110156107b45760026000838381518110610772576107726117e8565b6020908102919091018101516001600160a01b031682528181019290925260400160009081208054600181810183559183529290912090910186905501610753565b5050505050565b6000546001600160a01b0316336001600160a01b0316146107ef57604051630ce39a4b60e21b815260040160405180910390fd5b6000818152600160205260409020546001600160a01b0316610824576040516372bbc80f60e11b815260040160405180910390fd5b600081815260016020526040902060020154156108d457600081815260016020819052604082206002018054909161085b91611814565b8154811061086b5761086b6117e8565b6000918252602090912001546001600160a01b0316905061088c8183610c87565b60008281526001602052604090206002018054806108ac576108ac611827565b600082815260209020810160001990810180546001600160a01b031916905501905550610824565b6000818152600160208190526040822080546001600160a01b0319168155908101829055906109066002830182611364565b505050565b6000805460405163418e15c160e11b81526004810186905282916001600160a01b03169063831c2b8290602401600060405180830381865afa158015610955573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261097d9190810190611882565b9050600061098a85610d95565b905060005b826060015151811015610a2c576000836060015182815181106109b4576109b46117e8565b6020026020010151905060005b8351811015610a2257818482815181106109dd576109dd6117e8565b6020026020010151148015610a105750610a10848281518110610a0257610a026117e8565b602002602001015188611055565b15610a1a57600195505b6001016109c1565b505060010161098f565b5050509392505050565b600080610a4284610d95565b905060005b8151811015610a8b57610a73828281518110610a6557610a656117e8565b602002602001015185611055565b15610a8357600192505050610362565b600101610a47565b506000949350505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610b1d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b11600080516020611ac3833981519152546001600160a01b031690565b6001600160a01b031614155b15610b3b5760405163703e46dd60e11b815260040160405180910390fd5b565b6000546001600160a01b0316336001600160a01b031614610b7157604051630ce39a4b60e21b815260040160405180910390fd5b50565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610bce575060408051601f3d908101601f19168201909252610bcb9181019061198a565b60015b610bfb57604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b600080516020611ac38339815191528114610c2c57604051632a87526960e21b815260048101829052602401610bf2565b6109068383611146565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3b5760405163703e46dd60e11b815260040160405180910390fd5b610b3b61119c565b6001600160a01b0382166000908152600260205260408120905b8154811015610d4c5782828281548110610cbd57610cbd6117e8565b906000526020600020015403610d445781548290610cdd90600190611814565b81548110610ced57610ced6117e8565b9060005260206000200154828281548110610d0a57610d0a6117e8565b906000526020600020018190555081805480610d2857610d28611827565b6001900381819060005260206000200160009055905550505050565b600101610ca1565b5060405162461bcd60e51b815260206004820152601e60248201527f526f6c65204944206e6f7420666f756e6420666f7220746865207573657200006044820152606401610bf2565b60606000805b8351811015610dfb5760026000858381518110610dba57610dba6117e8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905082610df191906119a3565b9150600101610d9b565b50600160005260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e054610e3290826119a3565b90506000816001600160401b03811115610e4e57610e4e611489565b604051908082528060200260200182016040528015610e77578160200160208202803683370190505b5090506000805b8551811015610f7957600060026000888481518110610e9f57610e9f6117e8565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f1157602002820191906000526020600020905b815481526020019060010190808311610efd575b5050505050905060005b8151811015610f6f57818181518110610f3657610f366117e8565b6020026020010151858580610f4a906119b6565b965081518110610f5c57610f5c6117e8565b6020908102919091010152600101610f1b565b5050600101610e7e565b5060016000908152600260209081527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e08054604080518285028101850190915281815292830182828015610fec57602002820191906000526020600020905b815481526020019060010190808311610fd8575b5050505050905060005b815181101561104a57818181518110611011576110116117e8565b6020026020010151848480611025906119b6565b955081518110611037576110376117e8565b6020908102919091010152600101610ff6565b509195945050505050565b6000805460405163b426423360e01b81526004810185905282916001600160a01b03169063b426423390602401600060405180830381865afa15801561109f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110c791908101906119cf565b805190915060005b8181101561113a5760008382815181106110eb576110eb6117e8565b60200260200101516040516020016111039190611a7f565b60405160208183030381529060405261111b90611a9b565b9050858103611131576001945050505050610362565b506001016110cf565b50600095945050505050565b61114f826111e5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561119457610906828261124a565b6103ec6112c0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b3b57604051631afcd79f60e31b815260040160405180910390fd5b806001600160a01b03163b60000361121b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610bf2565b600080516020611ac383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516112679190611a7f565b600060405180830381855af49150503d80600081146112a2576040519150601f19603f3d011682016040523d82523d6000602084013e6112a7565b606091505b50915091506112b78583836112df565b95945050505050565b3415610b3b5760405163b398979f60e01b815260040160405180910390fd5b6060826112f4576112ef8261133b565b61038c565b815115801561130b57506001600160a01b0384163b155b1561133457604051639996b31560e01b81526001600160a01b0385166004820152602401610bf2565b508061038c565b80511561134b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610b7191906113e7565b8280548282559060005260206000209081019282156113d7579160200282015b828111156113d757825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906113a2565b506113e39291506113e7565b5090565b5b808211156113e357600081556001016113e8565b60006020828403121561140e57600080fd5b81356001600160e01b03198116811461038c57600080fd5b60005b83811015611441578181015183820152602001611429565b50506000910152565b60008151808452611462816020860160208601611426565b601f01601f19169290920160200192915050565b60208152600061038c602083018461144a565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156114c1576114c1611489565b60405290565b604051601f8201601f191681016001600160401b03811182821017156114ef576114ef611489565b604052919050565b60006001600160401b0382111561151057611510611489565b5060051b60200190565b80356001600160a01b038116811461153157600080fd5b919050565b600082601f83011261154757600080fd5b8135602061155c611557836114f7565b6114c7565b8083825260208201915060208460051b87010193508684111561157e57600080fd5b602086015b848110156115a1576115948161151a565b8352918301918301611583565b509695505050505050565b6000806000606084860312156115c157600080fd5b8335925060208401356001600160401b038111156115de57600080fd5b6115ea86828701611536565b925050604084013590509250925092565b60006020828403121561160d57600080fd5b5035919050565b60006001600160401b0382111561162d5761162d611489565b50601f01601f191660200190565b6000806040838503121561164e57600080fd5b6116578361151a565b915060208301356001600160401b0381111561167257600080fd5b8301601f8101851361168357600080fd5b803561169161155782611614565b8181528660208385010111156116a657600080fd5b816020840160208301376000602083830101528093505050509250929050565b6000602082840312156116d857600080fd5b61038c8261151a565b6000806000604084860312156116f657600080fd5b8335925060208401356001600160401b038082111561171457600080fd5b818601915086601f83011261172857600080fd5b81358181111561173757600080fd5b87602082850101111561174957600080fd5b6020830194508093505050509250925092565b6020808252825482820181905260008481528281209092916040850190845b818110156117a05783546001600160a01b03168352600193840193928501920161177b565b50909695505050505050565b6000602082840312156117be57600080fd5b81356001600160401b038111156117d457600080fd5b6117e084828501611536565b949350505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610362576103626117fe565b634e487b7160e01b600052603160045260246000fd5b600082601f83011261184e57600080fd5b815161185c61155782611614565b81815284602083860101111561187157600080fd5b6117e0826020830160208701611426565b6000602080838503121561189557600080fd5b82516001600160401b03808211156118ac57600080fd5b90840190608082870312156118c057600080fd5b6118c861149f565b825181528383015180151581146118de57600080fd5b818501526040830151828111156118f457600080fd5b6119008882860161183d565b60408301525060608301518281111561191857600080fd5b80840193505086601f84011261192d57600080fd5b8251915061193d611557836114f7565b82815260059290921b8301840191848101908884111561195c57600080fd5b938501935b8385101561197a57845182529385019390850190611961565b6060830152509695505050505050565b60006020828403121561199c57600080fd5b5051919050565b80820180821115610362576103626117fe565b6000600182016119c8576119c86117fe565b5060010190565b600060208083850312156119e257600080fd5b82516001600160401b03808211156119f957600080fd5b818501915085601f830112611a0d57600080fd5b8151611a1b611557826114f7565b81815260059190911b83018401908481019088831115611a3a57600080fd5b8585015b83811015611a7257805185811115611a565760008081fd5b611a648b89838a010161183d565b845250918601918601611a3e565b5098975050505050505050565b60008251611a91818460208701611426565b9190910192915050565b80516020808301519190811015611abc576000198160200360031b1b821691505b5091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + +type UserEntitlementConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: UserEntitlementConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class UserEntitlement__factory extends ContractFactory { + constructor(...args: UserEntitlementConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy(overrides || {}) as Promise; + } + override getDeployTransaction( + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction(overrides || {}); + } + override attach(address: string): UserEntitlement { + return super.attach(address) as UserEntitlement; + } + override connect(signer: Signer): UserEntitlement__factory { + return super.connect(signer) as UserEntitlement__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): UserEntitlementInterface { + return new utils.Interface(_abi) as UserEntitlementInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): UserEntitlement { + return new Contract(address, _abi, signerOrProvider) as UserEntitlement; + } +} diff --git a/packages/generated/dev/typings/factories/index.ts b/packages/generated/dev/typings/factories/index.ts new file mode 100644 index 000000000..2dfa74ed8 --- /dev/null +++ b/packages/generated/dev/typings/factories/index.ts @@ -0,0 +1,30 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { IArchitect__factory } from "./IArchitect__factory"; +export { IBanning__factory } from "./IBanning__factory"; +export { IChannel__factory } from "./IChannel__factory"; +export { ICustomEntitlement__factory } from "./ICustomEntitlement__factory"; +export { IDiamond__factory } from "./IDiamond__factory"; +export { IDiamondCut__factory } from "./IDiamondCut__factory"; +export { IERC721AQueryable__factory } from "./IERC721AQueryable__factory"; +export { IEntitlementsManager__factory } from "./IEntitlementsManager__factory"; +export { IMulticall__factory } from "./IMulticall__factory"; +export { INodeRegistry__factory } from "./INodeRegistry__factory"; +export { IOperatorRegistry__factory } from "./IOperatorRegistry__factory"; +export { IPausable__factory } from "./IPausable__factory"; +export { IPricingModules__factory } from "./IPricingModules__factory"; +export { IProxyManager__factory } from "./IProxyManager__factory"; +export { IRoles__factory } from "./IRoles__factory"; +export { IRuleEntitlement__factory } from "./IRuleEntitlement__factory"; +export { ISpaceOwner__factory } from "./ISpaceOwner__factory"; +export { IStreamRegistry__factory } from "./IStreamRegistry__factory"; +export { IWalletLink__factory } from "./IWalletLink__factory"; +export { Member__factory } from "./Member__factory"; +export { MembershipFacet__factory } from "./MembershipFacet__factory"; +export { MockERC721A__factory } from "./MockERC721A__factory"; +export { MockEntitlementGated__factory } from "./MockEntitlementGated__factory"; +export { OwnableFacet__factory } from "./OwnableFacet__factory"; +export { PrepayFacet__factory } from "./PrepayFacet__factory"; +export { TokenPausableFacet__factory } from "./TokenPausableFacet__factory"; +export { UserEntitlement__factory } from "./UserEntitlement__factory"; diff --git a/packages/generated/dev/typings/index.ts b/packages/generated/dev/typings/index.ts new file mode 100644 index 000000000..95c0e3033 --- /dev/null +++ b/packages/generated/dev/typings/index.ts @@ -0,0 +1,58 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { IArchitect } from "./IArchitect"; +export type { IBanning } from "./IBanning"; +export type { IChannel } from "./IChannel"; +export type { ICustomEntitlement } from "./ICustomEntitlement"; +export type { IDiamond } from "./IDiamond"; +export type { IDiamondCut } from "./IDiamondCut"; +export type { IERC721AQueryable } from "./IERC721AQueryable"; +export type { IEntitlementsManager } from "./IEntitlementsManager"; +export type { IMulticall } from "./IMulticall"; +export type { INodeRegistry } from "./INodeRegistry"; +export type { IOperatorRegistry } from "./IOperatorRegistry"; +export type { IPausable } from "./IPausable"; +export type { IPricingModules } from "./IPricingModules"; +export type { IProxyManager } from "./IProxyManager"; +export type { IRoles } from "./IRoles"; +export type { IRuleEntitlement } from "./IRuleEntitlement"; +export type { ISpaceOwner } from "./ISpaceOwner"; +export type { IStreamRegistry } from "./IStreamRegistry"; +export type { IWalletLink } from "./IWalletLink"; +export type { Member } from "./Member"; +export type { MembershipFacet } from "./MembershipFacet"; +export type { MockERC721A } from "./MockERC721A"; +export type { MockEntitlementGated } from "./MockEntitlementGated"; +export type { OwnableFacet } from "./OwnableFacet"; +export type { PrepayFacet } from "./PrepayFacet"; +export type { TokenPausableFacet } from "./TokenPausableFacet"; +export type { UserEntitlement } from "./UserEntitlement"; +export * as factories from "./factories"; +export { IArchitect__factory } from "./factories/IArchitect__factory"; +export { IBanning__factory } from "./factories/IBanning__factory"; +export { IChannel__factory } from "./factories/IChannel__factory"; +export { ICustomEntitlement__factory } from "./factories/ICustomEntitlement__factory"; +export { IDiamond__factory } from "./factories/IDiamond__factory"; +export { IDiamondCut__factory } from "./factories/IDiamondCut__factory"; +export { IEntitlementsManager__factory } from "./factories/IEntitlementsManager__factory"; +export { IERC721AQueryable__factory } from "./factories/IERC721AQueryable__factory"; +export { IMulticall__factory } from "./factories/IMulticall__factory"; +export { INodeRegistry__factory } from "./factories/INodeRegistry__factory"; +export { IOperatorRegistry__factory } from "./factories/IOperatorRegistry__factory"; +export { IPausable__factory } from "./factories/IPausable__factory"; +export { IPricingModules__factory } from "./factories/IPricingModules__factory"; +export { IProxyManager__factory } from "./factories/IProxyManager__factory"; +export { IRoles__factory } from "./factories/IRoles__factory"; +export { IRuleEntitlement__factory } from "./factories/IRuleEntitlement__factory"; +export { ISpaceOwner__factory } from "./factories/ISpaceOwner__factory"; +export { IStreamRegistry__factory } from "./factories/IStreamRegistry__factory"; +export { IWalletLink__factory } from "./factories/IWalletLink__factory"; +export { Member__factory } from "./factories/Member__factory"; +export { MembershipFacet__factory } from "./factories/MembershipFacet__factory"; +export { MockEntitlementGated__factory } from "./factories/MockEntitlementGated__factory"; +export { MockERC721A__factory } from "./factories/MockERC721A__factory"; +export { OwnableFacet__factory } from "./factories/OwnableFacet__factory"; +export { PrepayFacet__factory } from "./factories/PrepayFacet__factory"; +export { TokenPausableFacet__factory } from "./factories/TokenPausableFacet__factory"; +export { UserEntitlement__factory } from "./factories/UserEntitlement__factory"; diff --git a/packages/generated/package.json b/packages/generated/package.json new file mode 100644 index 000000000..81be90b55 --- /dev/null +++ b/packages/generated/package.json @@ -0,0 +1,9 @@ +{ + "name": "@river-build/generated", + "version": "workspace:^", + "private": true, + "packageManager": "yarn@3.8.0", + "scripts": { + "preinstall": "./scripts/make-config.sh" + } +} diff --git a/packages/generated/scripts/make-config.js b/packages/generated/scripts/make-config.js new file mode 100644 index 000000000..dabd1bc3d --- /dev/null +++ b/packages/generated/scripts/make-config.js @@ -0,0 +1,43 @@ +const fs = require('fs'); +const path = require('path'); + +const deploymentsOutputFile = 'config/deployments.json'; +const deploymentsSourceDir = 'deployments'; + +function combineJson(dir) { + const outputData = {}; + const files = fs.readdirSync(dir).filter(file => file.endsWith('.json')); + const subdirs = fs.readdirSync(dir).filter(subdir => fs.statSync(path.join(dir, subdir)).isDirectory()); + + const dirName = path.basename(dir); + // console.log(`Processing ${dirName} of ${dir}`); + + for (const file of files) { + if (!file.endsWith('.json')) { + continue; + } + const filePath = path.join(dir, file); + // console.log(`Reading ${filePath}`); + const fileData = JSON.parse(fs.readFileSync(filePath, 'utf8')); + const fileName = path.basename(file, '.json'); + // if the file only has one property, just use that property + if (Object.keys(fileData).length === 1) { + outputData[fileName] = fileData[Object.keys(fileData)[0]]; + } else { + outputData[fileName] = fileData; + } + } + + for (const subdir of subdirs) { + const subdirPath = path.join(dir, subdir); + outputData[subdir] = combineJson(subdirPath); + } + return outputData; +} + +const outputData = combineJson(deploymentsSourceDir); + +fs.mkdirSync(path.dirname(deploymentsOutputFile), { recursive: true }); +fs.writeFileSync(deploymentsOutputFile, JSON.stringify(outputData, null, 2)); + +console.log(`Combined deployments config JSON written to ${deploymentsOutputFile}`); \ No newline at end of file diff --git a/packages/generated/scripts/make-config.sh b/packages/generated/scripts/make-config.sh new file mode 100755 index 000000000..899b3c59c --- /dev/null +++ b/packages/generated/scripts/make-config.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" +cd .. + +node ./scripts/make-config.js diff --git a/packages/generated/v3/abis/Architect.abi.json b/packages/generated/v3/abis/Architect.abi.json new file mode 100644 index 000000000..f533696b7 --- /dev/null +++ b/packages/generated/v3/abis/Architect.abi.json @@ -0,0 +1,496 @@ +[ + { + "type": "function", + "name": "__Architect_init", + "inputs": [ + { + "name": "ownerImplementation", + "type": "address", + "internalType": "contract ISpaceOwner" + }, + { + "name": "userEntitlementImplementation", + "type": "address", + "internalType": "contract IUserEntitlement" + }, + { + "name": "ruleEntitlementImplementation", + "type": "address", + "internalType": "contract IRuleEntitlement" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "createSpace", + "inputs": [ + { + "name": "spaceInfo", + "type": "tuple", + "internalType": "struct IArchitectBase.SpaceInfo", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "uri", + "type": "string", + "internalType": "string" + }, + { + "name": "membership", + "type": "tuple", + "internalType": "struct IArchitectBase.Membership", + "components": [ + { + "name": "settings", + "type": "tuple", + "internalType": "struct IMembershipBase.Membership", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol", + "type": "string", + "internalType": "string" + }, + { + "name": "price", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maxSupply", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "duration", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "currency", + "type": "address", + "internalType": "address" + }, + { + "name": "feeRecipient", + "type": "address", + "internalType": "address" + }, + { + "name": "freeAllocation", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "pricingModule", + "type": "address", + "internalType": "address" + } + ] + }, + { + "name": "requirements", + "type": "tuple", + "internalType": "struct IArchitectBase.MembershipRequirements", + "components": [ + { + "name": "everyone", + "type": "bool", + "internalType": "bool" + }, + { + "name": "users", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "ruleData", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ] + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + } + ] + }, + { + "name": "channel", + "type": "tuple", + "internalType": "struct IArchitectBase.ChannelInfo", + "components": [ + { + "name": "metadata", + "type": "string", + "internalType": "string" + } + ] + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getSpaceArchitectImplementations", + "inputs": [], + "outputs": [ + { + "name": "spaceToken", + "type": "address", + "internalType": "contract ISpaceOwner" + }, + { + "name": "userEntitlementImplementation", + "type": "address", + "internalType": "contract IUserEntitlement" + }, + { + "name": "ruleEntitlementImplementation", + "type": "address", + "internalType": "contract IRuleEntitlement" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getSpaceByTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getTokenIdBySpace", + "inputs": [ + { + "name": "space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "setSpaceArchitectImplementations", + "inputs": [ + { + "name": "spaceToken", + "type": "address", + "internalType": "contract ISpaceOwner" + }, + { + "name": "userEntitlementImplementation", + "type": "address", + "internalType": "contract IUserEntitlement" + }, + { + "name": "ruleEntitlementImplementation", + "type": "address", + "internalType": "contract IRuleEntitlement" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SpaceCreated", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "space", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Architect__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Architect__InvalidNetworkId", + "inputs": [] + }, + { + "type": "error", + "name": "Architect__InvalidStringLength", + "inputs": [] + }, + { + "type": "error", + "name": "Architect__NotContract", + "inputs": [] + }, + { + "type": "error", + "name": "Factory__FailedDeployment", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "ReentrancyGuard__ReentrantCall", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidAddress", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/Architect.abi.ts b/packages/generated/v3/abis/Architect.abi.ts new file mode 100644 index 000000000..bd1e9f7f3 --- /dev/null +++ b/packages/generated/v3/abis/Architect.abi.ts @@ -0,0 +1,496 @@ +export default [ + { + "type": "function", + "name": "__Architect_init", + "inputs": [ + { + "name": "ownerImplementation", + "type": "address", + "internalType": "contract ISpaceOwner" + }, + { + "name": "userEntitlementImplementation", + "type": "address", + "internalType": "contract IUserEntitlement" + }, + { + "name": "ruleEntitlementImplementation", + "type": "address", + "internalType": "contract IRuleEntitlement" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "createSpace", + "inputs": [ + { + "name": "spaceInfo", + "type": "tuple", + "internalType": "struct IArchitectBase.SpaceInfo", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "uri", + "type": "string", + "internalType": "string" + }, + { + "name": "membership", + "type": "tuple", + "internalType": "struct IArchitectBase.Membership", + "components": [ + { + "name": "settings", + "type": "tuple", + "internalType": "struct IMembershipBase.Membership", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol", + "type": "string", + "internalType": "string" + }, + { + "name": "price", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maxSupply", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "duration", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "currency", + "type": "address", + "internalType": "address" + }, + { + "name": "feeRecipient", + "type": "address", + "internalType": "address" + }, + { + "name": "freeAllocation", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "pricingModule", + "type": "address", + "internalType": "address" + } + ] + }, + { + "name": "requirements", + "type": "tuple", + "internalType": "struct IArchitectBase.MembershipRequirements", + "components": [ + { + "name": "everyone", + "type": "bool", + "internalType": "bool" + }, + { + "name": "users", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "ruleData", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ] + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + } + ] + }, + { + "name": "channel", + "type": "tuple", + "internalType": "struct IArchitectBase.ChannelInfo", + "components": [ + { + "name": "metadata", + "type": "string", + "internalType": "string" + } + ] + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getSpaceArchitectImplementations", + "inputs": [], + "outputs": [ + { + "name": "spaceToken", + "type": "address", + "internalType": "contract ISpaceOwner" + }, + { + "name": "userEntitlementImplementation", + "type": "address", + "internalType": "contract IUserEntitlement" + }, + { + "name": "ruleEntitlementImplementation", + "type": "address", + "internalType": "contract IRuleEntitlement" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getSpaceByTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getTokenIdBySpace", + "inputs": [ + { + "name": "space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "setSpaceArchitectImplementations", + "inputs": [ + { + "name": "spaceToken", + "type": "address", + "internalType": "contract ISpaceOwner" + }, + { + "name": "userEntitlementImplementation", + "type": "address", + "internalType": "contract IUserEntitlement" + }, + { + "name": "ruleEntitlementImplementation", + "type": "address", + "internalType": "contract IRuleEntitlement" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SpaceCreated", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "space", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Architect__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Architect__InvalidNetworkId", + "inputs": [] + }, + { + "type": "error", + "name": "Architect__InvalidStringLength", + "inputs": [] + }, + { + "type": "error", + "name": "Architect__NotContract", + "inputs": [] + }, + { + "type": "error", + "name": "Factory__FailedDeployment", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "ReentrancyGuard__ReentrantCall", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidAddress", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/Architect.bin b/packages/generated/v3/abis/Architect.bin new file mode 100644 index 000000000..2f2f9e009 --- /dev/null +++ b/packages/generated/v3/abis/Architect.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b61431b80620000d46000396000f3fe60806040523480156200001157600080fd5b50600436106200006a5760003560e01c8063545efb2d146200006f578063673f0dd514620000a85780637d8c452214620000d85780638bfc94b914620000ef578063c0bc67961462000108578063dc1b9f23146200012e575b600080fd5b6200007962000145565b604080516001600160a01b03948516815292841660208401529216918101919091526060015b60405180910390f35b620000bf620000b93660046200128f565b620001c2565b6040516001600160a01b0390911681526020016200009f565b620000bf620000e936600462001a75565b62000200565b620001066200010036600462001b5e565b620002ef565b005b6200011f6200011936600462001bb0565b62000352565b6040519081526020016200009f565b620001066200013f36600462001b5e565b62000390565b6000806000620001b7600080516020620042fb833981519152547f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d01547f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d02546001600160a01b0392831693918316921690565b925092509250909192565b60008181527f06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f000260205260408120546001600160a01b03165b92915050565b600060027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0054036200024557604051635db5c7cd60e11b815260040160405180910390fd5b6200026f60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b7fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff1615620002b3576040516302ca8ced60e11b815260040160405180910390fd5b620002be82620003db565b9050620002ea60017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b919050565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b0316331462000340576040516365f4906560e01b815233600482015260240160405180910390fd5b6200034d8383836200077c565b505050565b6001600160a01b03811660009081527f06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f00016020526040812054620001fa565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166200034057604051630ef4733760e31b815260040160405180910390fd5b600080516020620042fb833981519152805460408051631d5e528f60e21b815290516000937f06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f000093909285926001600160a01b03909216916375794a3c916004808201926020929091908290030181865afa1580156200045e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000484919062001bd7565b9050620004968186604001516200088b565b8354909450836000620004a98362001bf1565b90915550506000818152600284016020908152604080832080546001600160a01b0319166001600160a01b03898116918217909255845260018701835292819020849055845488519289015191516391de4a8360e01b81529316926391de4a83926200051c929091899060040162001c6d565b6020604051808303816000875af11580156200053c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000562919062001bd7565b50600182015460009062000580906001600160a01b031686620008b5565b6002840154909150600090620005a0906001600160a01b031687620008b5565b60408051600280825260608201835292935060009290916020830190803683370190505090508281600081518110620005dd57620005dd62001caf565b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811062000614576200061462001caf565b6001600160a01b039283166020918202929092010152604051638bfc820f60e01b815290881690638bfc820f906200065190849060040162001cc5565b600060405180830381600087803b1580156200066c57600080fd5b505af115801562000681573d6000803e3d6000fd5b505050506200069b8784848b604001516020015162000972565b50604080890151805151910151600091620006ba918a91908762000da5565b9050620006cd88828b6060015162000f35565b8554604051632142170760e11b8152306004820152336024820152604481018790526001600160a01b03909116906342842e0e90606401600060405180830381600087803b1580156200071f57600080fd5b505af115801562000734573d6000803e3d6000fd5b50506040516001600160a01b038b16925087915033907fe50fc3942f8a2d7e5a7c8fb9488499eba5255b41e18bc3f1b4791402976d1d0b90600090a450505050505050919050565b826001600160a01b03163b600003620007a8576040516302f3d00b60e01b815260040160405180910390fd5b816001600160a01b03163b600003620007d4576040516302f3d00b60e01b815260040160405180910390fd5b806001600160a01b03163b60000362000800576040516302f3d00b60e01b815260040160405180910390fd5b600080516020620042fb83398151915280546001600160a01b039485166001600160a01b0319918216179091557f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d018054938516938216939093179092557f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d028054919093169116179055565b60008060006200089c858562001036565b91509150620008ac8282620011d3565b95945050505050565b60008060405180602001620008ca9062001273565b601f1982820381018352601f9091011660408190526001600160a01b0385166024820152859060440160408051601f19818403018152918152602080830180516001600160e01b031663189acdbd60e31b17905290516200092e9392910162001d14565b60408051601f19818403018152908290526200094e929160200162001d3a565b60405160208183030381529060405290506200096a816200120e565b949350505050565b604080516001808252818301909252600091829190816020015b60608152602001906001900390816200098c579050509050604051806040016040528060098152602001684a6f696e537061636560b81b81525081600081518110620009dc57620009dc62001caf565b6020026020010181905250856001600160a01b0316638fcd793d6040518060400160405280600681526020016526b4b73a32b960d11b8152508360006001600160401b0381111562000a325762000a32620012a9565b60405190808252806020026020018201604052801562000a7a57816020015b60408051808201909152600081526060602082015281526020019060019003908162000a515790505b506040518463ffffffff1660e01b815260040162000a9b9392919062001d96565b6020604051808303816000875af115801562000abb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ae1919062001bd7565b83519092501562000bef576040805160018082528183019092526000916020808301908036833701905050905060018160008151811062000b265762000b2662001caf565b60200260200101906001600160a01b031690816001600160a01b031681525050866001600160a01b031663ba201ba88460405180604001604052808a6001600160a01b031681526020018560405160200162000b83919062001cc5565b6040516020818303038152906040528152506040518363ffffffff1660e01b815260040162000bb492919062001e68565b600060405180830381600087803b15801562000bcf57600080fd5b505af115801562000be4573d6000803e3d6000fd5b505050505062000d9c565b6020830151511562000ce85760005b83602001515181101562000c405762000c378460200151828151811062000c295762000c2962001caf565b602002602001015162001248565b60010162000bfe565b50856001600160a01b031663ba201ba8836040518060400160405280896001600160a01b03168152602001876020015160405160200162000c82919062001cc5565b6040516020818303038152906040528152506040518363ffffffff1660e01b815260040162000cb392919062001e68565b600060405180830381600087803b15801562000cce57600080fd5b505af115801562000ce3573d6000803e3d6000fd5b505050505b604083015151511562000d9c57856001600160a01b031663ba201ba8836040518060400160405280886001600160a01b03168152602001876040015160405160200162000d36919062001f80565b6040516020818303038152906040528152506040518363ffffffff1660e01b815260040162000d6792919062001e68565b600060405180830381600087803b15801562000d8257600080fd5b505af115801562000d97573d6000803e3d6000fd5b505050505b50949350505050565b6040805160018082528183019092526000918291906020808301908036833701905050905060018160008151811062000de25762000de262001caf565b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252600091816020015b60408051808201909152600081526060602082015281526020019060019003908162000e12579050509050838160008151811062000e545762000e5462001caf565b6020908102919091018101516001600160a01b0390921690915260405162000e7f9184910162001cc5565b6040516020818303038152906040528160008151811062000ea45762000ea462001caf565b6020908102919091018101510152604051638fcd793d60e01b81526001600160a01b03881690638fcd793d9062000ee49089908990869060040162001d96565b6020604051808303816000875af115801562000f04573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f2a919062001bd7565b979650505050505050565b60408051600180825281830190925260009160208083019080368337019050509050828160008151811062000f6e5762000f6e62001caf565b602090810291909101810191909152604051600160fd1b918101919091526bffffffffffffffffffffffff19606086901b16602182015260009060350160405160208183030381529060405262000fc5906200202b565b835160405163921f717560e01b81529192506001600160a01b0387169163921f71759162000ffb91859190879060040162002053565b600060405180830381600087803b1580156200101657600080fd5b505af11580156200102b573d6000803e3d6000fd5b505050505050505050565b6060600080600080516020620042fb8339815191526040805133602082015290810187905242606082015290915060800160405160208183030381529060405280519060200120915060405180602001620010919062001281565b601f19828203810183526040601f90920116818101825263dc9cc64560e01b8152306020828101919091528251808401845285546001600160a01b0390811682528183018b90528451610120810186528a515181528a518401519381019390935289518501519483019490945288516060908101519083015288516080908101516001600160401b031690830152885160a090810151851690830152885160c09081015133959293929183019116156200115157895160c0015162001153565b335b6001600160a01b03168152602001896000015160e001518152602001896000015161010001516001600160a01b03168152506040516020016200119a9493929190620020b4565b60408051601f1981840301815290829052620011ba929160200162001d3a565b6040516020818303038152906040529250509250929050565b60008260200183518381836000f59250506001600160a01b0382169050620001fa5760405163ef35ca1960e01b815260040160405180910390fd5b600081602001825180826000f09250506001600160a01b0382169050620002ea5760405163ef35ca1960e01b815260040160405180910390fd5b6001600160a01b03811662001270576040516302e47d1560e41b815260040160405180910390fd5b50565b6103d480620021b083390190565b611d77806200258483390190565b600060208284031215620012a257600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620012e457620012e4620012a9565b60405290565b604051606081016001600160401b0381118282101715620012e457620012e4620012a9565b604080519081016001600160401b0381118282101715620012e457620012e4620012a9565b60405161012081016001600160401b0381118282101715620012e457620012e4620012a9565b604051601f8201601f191681016001600160401b0381118282101715620013855762001385620012a9565b604052919050565b600082601f8301126200139f57600080fd5b81356001600160401b03811115620013bb57620013bb620012a9565b620013d0601f8201601f19166020016200135a565b818152846020838601011115620013e657600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160401b0381168114620002ea57600080fd5b6001600160a01b03811681146200127057600080fd5b8035620002ea816200141b565b60006001600160401b038211156200145a576200145a620012a9565b5060051b60200190565b600381106200127057600080fd5b803560ff81168114620002ea57600080fd5b600082601f8301126200149657600080fd5b81356020620014af620014a9836200143e565b6200135a565b82815260079290921b84018101918181019086841115620014cf57600080fd5b8286015b84811015620015415760808189031215620014ee5760008081fd5b620014f8620012bf565b813560068110620015095760008081fd5b8152818501358582015260408083013562001524816200141b565b9082015260608281013590820152835291830191608001620014d3565b509695505050505050565b600082601f8301126200155e57600080fd5b8135602062001571620014a9836200143e565b828152606092830285018201928282019190878511156200159157600080fd5b8387015b85811015620015fa5781818a031215620015af5760008081fd5b620015b9620012ea565b8135620015c68162001464565b8152620015d582870162001472565b868201526040620015e881840162001472565b90820152845292840192810162001595565b5090979650505050505050565b6000606082840312156200161a57600080fd5b62001624620012ea565b905081356001600160401b03808211156200163e57600080fd5b818401915084601f8301126200165357600080fd5b8135602062001666620014a9836200143e565b82815260069290921b840181019181810190888411156200168657600080fd5b948201945b83861015620016e3576040868a031215620016a65760008081fd5b620016b06200130f565b8635620016bd8162001464565b8152620016cc87850162001472565b81850152825260409590950194908201906200168b565b86525085810135935082841115620016fa57600080fd5b620017088785880162001484565b908501525060408401359150808211156200172257600080fd5b5062001731848285016200154c565b60408301525092915050565b6000606082840312156200175057600080fd5b6200175a620012ea565b9050813580151581146200176d57600080fd5b81526020828101356001600160401b03808211156200178b57600080fd5b818501915085601f830112620017a057600080fd5b8135620017b1620014a9826200143e565b81815260059190911b83018401908481019088831115620017d157600080fd5b938501935b82851015620017fc578435620017ec816200141b565b82529385019390850190620017d6565b808688015250505060408501359250808311156200181957600080fd5b5050620017318482850162001607565b600082601f8301126200183b57600080fd5b813560206200184e620014a9836200143e565b82815260059290921b840181019181810190868411156200186e57600080fd5b8286015b84811015620015415780356001600160401b03811115620018935760008081fd5b620018a38986838b01016200138d565b84525091830191830162001872565b600060608284031215620018c557600080fd5b620018cf620012ea565b905081356001600160401b0380821115620018e957600080fd5b908301906101208286031215620018ff57600080fd5b6200190962001334565b8235828111156200191957600080fd5b62001927878286016200138d565b8252506020830135828111156200193d57600080fd5b6200194b878286016200138d565b6020830152506040830135604082015260608301356060820152620019736080840162001403565b60808201526200198660a0840162001431565b60a08201526200199960c0840162001431565b60c082015260e083013560e0820152610100620019b881850162001431565b9082015283526020840135915080821115620019d357600080fd5b620019e1858386016200173d565b60208401526040840135915080821115620019fb57600080fd5b50620017318482850162001829565b60006020828403121562001a1d57600080fd5b604051602081016001600160401b03828210818311171562001a435762001a43620012a9565b81604052829350843591508082111562001a5c57600080fd5b5062001a6b858286016200138d565b8252505092915050565b60006020828403121562001a8857600080fd5b81356001600160401b038082111562001aa057600080fd5b908301906080828603121562001ab557600080fd5b62001abf620012bf565b82358281111562001acf57600080fd5b62001add878286016200138d565b82525060208301358281111562001af357600080fd5b62001b01878286016200138d565b60208301525060408301358281111562001b1a57600080fd5b62001b2887828601620018b2565b60408301525060608301358281111562001b4157600080fd5b62001b4f8782860162001a0a565b60608301525095945050505050565b60008060006060848603121562001b7457600080fd5b833562001b81816200141b565b9250602084013562001b93816200141b565b9150604084013562001ba5816200141b565b809150509250925092565b60006020828403121562001bc357600080fd5b813562001bd0816200141b565b9392505050565b60006020828403121562001bea57600080fd5b5051919050565b60006001820162001c1257634e487b7160e01b600052601160045260246000fd5b5060010190565b60005b8381101562001c3657818101518382015260200162001c1c565b50506000910152565b6000815180845262001c5981602086016020860162001c19565b601f01601f19169290920160200192915050565b60608152600062001c82606083018662001c3f565b828103602084015262001c96818662001c3f565b91505060018060a01b0383166040830152949350505050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b8181101562001d085783516001600160a01b03168352928401929184019160010162001ce1565b50909695505050505050565b6001600160a01b03831681526040602082018190526000906200096a9083018462001c3f565b6000835162001d4e81846020880162001c19565b83519083019062001d6481836020880162001c19565b01949350505050565b60018060a01b03815116825260006020820151604060208501526200096a604085018262001c3f565b60608152600062001dab606083018662001c3f565b6020838203818501528186518084528284019150828160051b85010183890160005b8381101562001dff57601f1987840301855262001dec83835162001c3f565b9486019492509085019060010162001dcd565b50508681036040880152875180825284820195509250600583901b81018401915083880160005b8481101562001e5857601f1983850301875262001e4584835162001d6d565b9686019693509085019060010162001e26565b50919a9950505050505050505050565b8281526040602082015260006200096a604083018462001d6d565b634e487b7160e01b600052602160045260246000fd5b6003811062001270576200127062001e83565b60008151808452602080850194506020840160005b8381101562001f1b57815180516006811062001ee15762001ee162001e83565b885280840151848901526040808201516001600160a01b031690890152606090810151908801526080909601959082019060010162001ec1565b509495945050505050565b60008151808452602080850194506020840160005b8381101562001f1b578151805162001f538162001e99565b88528084015160ff908116858a015260409182015116908801526060909601959082019060010162001f3b565b6020808252825160608383015280516080840181905260009291820190839060a08601905b8083101562001fe0578351805162001fbd8162001e99565b835285015160ff1685830152928401926001929092019160409091019062001fa5565b50838701519350601f1992508286820301604087015262002002818562001eac565b9350505060408501518185840301606086015262002021838262001f26565b9695505050505050565b805160208083015191908110156200204d576000198160200360031b1b821691505b50919050565b838152600060206060602084015262002070606084018662001c3f565b83810360408501528451808252602080870192019060005b81811015620020a65783518352928401929184019160010162002088565b509098975050505050505050565b600060018060a01b03808716835263ffffffff60e01b8651166020840152806020870151166040840152808551166060840152506020840151608083015260c060a083015282516101208060c0850152620021146101e085018362001c3f565b9150602085015160bf198584030160e086015262002133838262001c3f565b92505060408501516101008181870152606087015183870152608087015192506200216a6101408701846001600160401b03169052565b60a08701516001600160a01b0390811661016088015260c0880151811661018088015260e08801516101a0880152908701519081166101c0870152915062001541905056fe60806040526040516103d43803806103d483398101604081905261002291610268565b61002c8282610033565b5050610352565b61003c82610092565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561008657610081828261010e565b505050565b61008e610185565b5050565b806001600160a01b03163b6000036100cd57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161012b9190610336565b600060405180830381855af49150503d8060008114610166576040519150601f19603f3d011682016040523d82523d6000602084013e61016b565b606091505b50909250905061017c8583836101a6565b95945050505050565b34156101a45760405163b398979f60e01b815260040160405180910390fd5b565b6060826101bb576101b682610205565b6101fe565b81511580156101d257506001600160a01b0384163b155b156101fb57604051639996b31560e01b81526001600160a01b03851660048201526024016100c4565b50805b9392505050565b8051156102155780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b60005b8381101561025f578181015183820152602001610247565b50506000910152565b6000806040838503121561027b57600080fd5b82516001600160a01b038116811461029257600080fd5b60208401519092506001600160401b03808211156102af57600080fd5b818501915085601f8301126102c357600080fd5b8151818111156102d5576102d561022e565b604051601f8201601f19908116603f011681019083821181831017156102fd576102fd61022e565b8160405282815288602084870101111561031657600080fd5b610327836020830160208801610244565b80955050505050509250929050565b60008251610348818460208701610244565b9190910192915050565b6074806103606000396000f3fe6080604052600a600c565b005b60186014601a565b6051565b565b6000604c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015606f573d6000f35b3d6000fd60806040523480156200001157600080fd5b5060405162001d7738038062001d77833981016040819052620000349162000dfe565b6200003e6200016a565b620000a58380517f9c16cba5b9f2fcbd952b38bec34079e93cbe107475c15fc20705f4e704198a0080546020909301516001600160a01b03166001600160a01b031960e09390931c600160a01b02929092166001600160c01b031990931692909217179055565b81517fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60080546001600160a01b0319166001600160a01b0390921691909117905560208201517fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60155805160208201516200011f91906200017e565b62000135818460200151620001d560201b60201c565b6200013f6200038b565b6200014c8460016200039a565b62000156620003c0565b6200016062000495565b5050505062001107565b6200017c6301ffc9a760e01b620004ea565b565b60008051602062001cf78339815191527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df02620001bb848262000f64565b5060038101620001cc838262000f64565b50600090555050565b60008051602062001d1783398151915280546001600160a01b038381166001600160a01b0319928316179092556101008401517fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb608805491909316908216179091557fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb604805490911673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee17905560608201517fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6035560e08201517fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60781905560008051602062001d578339815191529015620002eb5760e0830151620002eb90620005ca565b610100830151620002fc9062000678565b6040830151156200038657604083015162000317906200074a565b600881015460408085015190516391b7f5ed60e01b81526001600160a01b03909216916391b7f5ed91620003519160040190815260200190565b600060405180830381600087803b1580156200036c57600080fd5b505af115801562000381573d6000803e3d6000fd5b505050505b505050565b6200017c607b6103e8620007f5565b620003bc828260405180602001604052806000815250620008ee60201b60201c565b5050565b60007f9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009050600060008051602062001d5783398151915260060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa15801562000450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000476919062001030565b82546001600160a01b0319166001600160a01b03919091161790915550565b620004a76380ac58cd60e01b620004ea565b620004b9635b5e139f60e01b620004ea565b620004cb638c65f84d60e01b620004ea565b620004dd6307f5828d60e41b620004ea565b6200017c63421fb7a760e01b5b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff16151560011462000579576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff1916600117905562000592565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60008051602062001d178339815191525460408051632cbb9d1360e01b8152905160008051602062001d57833981519152926001600160a01b031691632cbb9d139160048083019260209291908290030181865afa15801562000631573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000657919062001055565b821115620003bc5760405163c3983b9160e01b815260040160405180910390fd5b6001600160a01b038116620006a057604051630e88bf4b60e01b815260040160405180910390fd5b60008051602062001d17833981519152546001600160a01b03166040516346fc05eb60e11b81526001600160a01b0383811660048301529190911690638df80bd690602401602060405180830381865afa15801562000703573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200072991906200106f565b6200074757604051630e88bf4b60e01b815260040160405180910390fd5b50565b60006200076d60008051602062001d17833981519152546001600160a01b031690565b6001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620007ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007d1919062001055565b905080821015620003bc57604051631a23d64760e11b815260040160405180910390fd5b8160000362000817576040516306c1cb6d60e51b815260040160405180910390fd5b6127108161ffff1611156200083f57604051634e7ee09d60e11b815260040160405180910390fd5b60008281527f3c2290b88407133303e904ceb4ee7d0d14164eda8a629372d8406216ceb57e00602081905260409091205461ffff16801562000894576040516306c1cb6d60e51b815260040160405180910390fd5b60008481526020838152604091829020805461ffff191661ffff8716908117909155915191825285917f674ed3e313f9254fbafb8a51fa62be8b5f0a767d64c64cfe6f099c80c779a528910160405180910390a250505050565b620008fa838362000980565b6001600160a01b0383163b15620003865760008051602062001cf7833981519152548281035b6001810190620009369060009087908662000aba565b62000954576040516368d2bf6b60e11b815260040160405180910390fd5b81811062000920578160008051602062001cf783398151915254146200097957600080fd5b5050505050565b60008051602062001cf7833981519152546000829003620009b45760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df056020908152604080832080546801000000000000000188020190558483527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0490915281206001851460e11b4260a01b1783179055828401908390839060008051602062001d378339815191528180a4600183015b81811462000a81578083600060008051602062001d37833981519152600080a460010162000a58565b508160000362000aa357604051622e076360e81b815260040160405180910390fd5b60008051602062001cf78339815191525550505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029062000af190339089908890889060040162001093565b6020604051808303816000875af192505050801562000b2f575060408051601f3d908101601f1916820190925262000b2c91810190620010e9565b60015b62000b91573d80801562000b60576040519150601f19603f3d011682016040523d82523d6000602084013e62000b65565b606091505b50805160000362000b89576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b80516001600160a01b038116811462000bc657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b038111828210171562000c075762000c0762000bcb565b60405290565b604080519081016001600160401b038111828210171562000c075762000c0762000bcb565b80516001600160e01b03198116811462000bc657600080fd5b60005b8381101562000c6857818101518382015260200162000c4e565b50506000910152565b600082601f83011262000c8357600080fd5b81516001600160401b038082111562000ca05762000ca062000bcb565b604051601f8301601f19908116603f0116810190828211818310171562000ccb5762000ccb62000bcb565b8160405283815286602085880101111562000ce557600080fd5b62000cf884602083016020890162000c4b565b9695505050505050565b80516001600160401b038116811462000bc657600080fd5b6000610120828403121562000d2e57600080fd5b62000d3862000be1565b82519091506001600160401b038082111562000d5357600080fd5b62000d618583860162000c71565b8352602084015191508082111562000d7857600080fd5b5062000d878482850162000c71565b602083015250604082015160408201526060820151606082015262000daf6080830162000d02565b608082015262000dc260a0830162000bae565b60a082015262000dd560c0830162000bae565b60c082015260e082015160e082015261010062000df481840162000bae565b9082015292915050565b60008060008084860360c081121562000e1657600080fd5b62000e218662000bae565b94506040601f198201121562000e3657600080fd5b62000e4062000c0d565b62000e4e6020880162000c32565b815262000e5e6040880162000bae565b602082015293506040605f198201121562000e7857600080fd5b5062000e8362000c0d565b62000e916060870162000bae565b81526080860151602082015260a08601519092506001600160401b0381111562000eba57600080fd5b62000ec88782880162000d1a565b91505092959194509250565b600181811c9082168062000ee957607f821691505b60208210810362000f0a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000386576000816000526020600020601f850160051c8101602086101562000f3b5750805b601f850160051c820191505b8181101562000f5c5782815560010162000f47565b505050505050565b81516001600160401b0381111562000f805762000f8062000bcb565b62000f988162000f91845462000ed4565b8462000f10565b602080601f83116001811462000fd0576000841562000fb75750858301515b600019600386901b1c1916600185901b17855562000f5c565b600085815260208120601f198616915b82811015620010015788860151825594840194600190910190840162000fe0565b5085821015620010205787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200104357600080fd5b6200104e8262000bae565b9392505050565b6000602082840312156200106857600080fd5b5051919050565b6000602082840312156200108257600080fd5b815180151581146200104e57600080fd5b600060018060a01b038087168352808616602084015250836040830152608060608301528251806080840152620010d28160a085016020870162000c4b565b601f01601f19169190910160a00195945050505050565b600060208284031215620010fc57600080fd5b6200104e8262000c32565b610be080620011176000396000f3fe6080604052600436106100a05760003560e01c80638934207f116100645780638934207f1461020d578063ac7ee62614610241578063ac9650d81461027e578063b3a5be6d146102ab578063d33d9345146102c0578063f9d5d22c146102e2576100a7565b80633ded10de146100b157806369d9346b146100e4578063702515631461014057806373fc5a051461019157806377460cd3146101d0576100a7565b366100a757005b6100af610302565b005b3480156100bd57600080fd5b506100d16100cc366004610918565b61035d565b6040519081526020015b60405180910390f35b3480156100f057600080fd5b506100af6100ff366004610949565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60880546001600160a01b0319166001600160a01b0392909216919091179055565b34801561014c57600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb604546001600160a01b03165b6040516001600160a01b0390911681526020016100db565b34801561019d57600080fd5b506100af6101ac366004610918565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60355565b3480156101dc57600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb606546001600160a01b0316610179565b34801561021957600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb603546100d1565b34801561024d57600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb608546001600160a01b0316610179565b34801561028a57600080fd5b5061029e61029936600461096d565b6104ef565b6040516100db9190610a32565b3480156102b757600080fd5b506100d161060c565b3480156102cc57600080fd5b506102d56106cd565b6040516100db9190610a96565b3480156102ee57600080fd5b506100af6102fd366004610918565b61076f565b600061030c6107d2565b9050806001600160a01b03163b600003610339576040516321f27f0d60e21b815260040160405180910390fd5b3660008037600080366000845af43d6000803e808015610358573d6000f35b3d6000fd5b6000600080516020610bc08339815191528161037761060c565b90508381111561038b575060009392505050565b6006820154604051639262b1b360e01b815230600482015285916001600160a01b031690639262b1b390602401602060405180830381865afa1580156103d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f99190610aa9565b1115610409575060009392505050565b60088201546001600160a01b03161561049a576008820154604051635cf4ee9160e01b815260048101839052602481018690526001600160a01b0390911690635cf4ee9190604401602060405180830381865afa15801561046e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104929190610aa9565b949350505050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046e573d6000803e3d6000fd5b6060818067ffffffffffffffff81111561050b5761050b610ac2565b60405190808252806020026020018201604052801561053e57816020015b60608152602001906001900390816105295790505b50915060005b81811015610604576000803087878581811061056257610562610ad8565b90506020028101906105749190610aee565b604051610582929190610b3c565b600060405180830381855af49150503d80600081146105bd576040519150601f19603f3d011682016040523d82523d6000602084013e6105c2565b606091505b509150915081156105f057808584815181106105e0576105e0610ad8565b60200260200101819052506105fa565b3d6000803e3d6000fd5b5050600101610544565b505092915050565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60754600090600080516020610bc083398151915290801561064d5792915050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c69190610aa9565b9250505090565b6060600080516020610bc0833981519152600c0180546106ec90610b4c565b80601f016020809104026020016040519081016040528092919081815260200182805461071890610b4c565b80156107655780601f1061073a57610100808354040283529160200191610765565b820191906000526020600020905b81548152906001019060200180831161074857829003601f168201915b5050505050905090565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb607819055604051600080516020610bc08339815191529082907fab14a23e88fb272313490d4f20d63098e64fd38304c0e07a377db98c2b39b92f90600090a25050565b7f9c16cba5b9f2fcbd952b38bec34079e93cbe107475c15fc20705f4e704198a0054600090600160a01b900460e01b81806108347f9c16cba5b9f2fcbd952b38bec34079e93cbe107475c15fc20705f4e704198a00546001600160a01b031690565b6040516001600160e01b03196000351660248201526001600160a01b039190911690849060440160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516108999190610b86565b600060405180830381855afa9150503d80600081146108d4576040519150601f19603f3d011682016040523d82523d6000602084013e6108d9565b606091505b5091509150816108fc5760405163391aa44560e01b815260040160405180910390fd5b808060200190518101906109109190610ba2565b935050505090565b60006020828403121561092a57600080fd5b5035919050565b6001600160a01b038116811461094657600080fd5b50565b60006020828403121561095b57600080fd5b813561096681610931565b9392505050565b6000806020838503121561098057600080fd5b823567ffffffffffffffff8082111561099857600080fd5b818501915085601f8301126109ac57600080fd5b8135818111156109bb57600080fd5b8660208260051b85010111156109d057600080fd5b60209290920196919550909350505050565b60005b838110156109fd5781810151838201526020016109e5565b50506000910152565b60008151808452610a1e8160208601602086016109e2565b601f01601f19169290920160200192915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015610a8957603f19888603018452610a77858351610a06565b94509285019290850190600101610a5b565b5092979650505050505050565b6020815260006109666020830184610a06565b600060208284031215610abb57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610b0557600080fd5b83018035915067ffffffffffffffff821115610b2057600080fd5b602001915036819003821315610b3557600080fd5b9250929050565b8183823760009101908152919050565b600181811c90821680610b6057607f821691505b602082108103610b8057634e487b7160e01b600052602260045260246000fd5b50919050565b60008251610b988184602087016109e2565b9190910192915050565b600060208284031215610bb457600080fd5b81516109668161093156fec21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df00c21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb606ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6009e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d00 \ No newline at end of file diff --git a/packages/generated/v3/abis/Architect.json b/packages/generated/v3/abis/Architect.json new file mode 100644 index 000000000..dd6941c98 --- /dev/null +++ b/packages/generated/v3/abis/Architect.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__Architect_init","inputs":[{"name":"ownerImplementation","type":"address","internalType":"contract ISpaceOwner"},{"name":"userEntitlementImplementation","type":"address","internalType":"contract IUserEntitlement"},{"name":"ruleEntitlementImplementation","type":"address","internalType":"contract IRuleEntitlement"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"createSpace","inputs":[{"name":"spaceInfo","type":"tuple","internalType":"struct IArchitectBase.SpaceInfo","components":[{"name":"name","type":"string","internalType":"string"},{"name":"uri","type":"string","internalType":"string"},{"name":"membership","type":"tuple","internalType":"struct IArchitectBase.Membership","components":[{"name":"settings","type":"tuple","internalType":"struct IMembershipBase.Membership","components":[{"name":"name","type":"string","internalType":"string"},{"name":"symbol","type":"string","internalType":"string"},{"name":"price","type":"uint256","internalType":"uint256"},{"name":"maxSupply","type":"uint256","internalType":"uint256"},{"name":"duration","type":"uint64","internalType":"uint64"},{"name":"currency","type":"address","internalType":"address"},{"name":"feeRecipient","type":"address","internalType":"address"},{"name":"freeAllocation","type":"uint256","internalType":"uint256"},{"name":"pricingModule","type":"address","internalType":"address"}]},{"name":"requirements","type":"tuple","internalType":"struct IArchitectBase.MembershipRequirements","components":[{"name":"everyone","type":"bool","internalType":"bool"},{"name":"users","type":"address[]","internalType":"address[]"},{"name":"ruleData","type":"tuple","internalType":"struct IRuleEntitlement.RuleData","components":[{"name":"operations","type":"tuple[]","internalType":"struct IRuleEntitlement.Operation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CombinedOperationType"},{"name":"index","type":"uint8","internalType":"uint8"}]},{"name":"checkOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.CheckOperation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CheckOperationType"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"contractAddress","type":"address","internalType":"address"},{"name":"threshold","type":"uint256","internalType":"uint256"}]},{"name":"logicalOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.LogicalOperation[]","components":[{"name":"logOpType","type":"uint8","internalType":"enum IRuleEntitlement.LogicalOperationType"},{"name":"leftOperationIndex","type":"uint8","internalType":"uint8"},{"name":"rightOperationIndex","type":"uint8","internalType":"uint8"}]}]}]},{"name":"permissions","type":"string[]","internalType":"string[]"}]},{"name":"channel","type":"tuple","internalType":"struct IArchitectBase.ChannelInfo","components":[{"name":"metadata","type":"string","internalType":"string"}]}]}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"getSpaceArchitectImplementations","inputs":[],"outputs":[{"name":"spaceToken","type":"address","internalType":"contract ISpaceOwner"},{"name":"userEntitlementImplementation","type":"address","internalType":"contract IUserEntitlement"},{"name":"ruleEntitlementImplementation","type":"address","internalType":"contract IRuleEntitlement"}],"stateMutability":"view"},{"type":"function","name":"getSpaceByTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getTokenIdBySpace","inputs":[{"name":"space","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"setSpaceArchitectImplementations","inputs":[{"name":"spaceToken","type":"address","internalType":"contract ISpaceOwner"},{"name":"userEntitlementImplementation","type":"address","internalType":"contract IUserEntitlement"},{"name":"ruleEntitlementImplementation","type":"address","internalType":"contract IRuleEntitlement"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"SpaceCreated","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"space","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"Architect__InvalidAddress","inputs":[]},{"type":"error","name":"Architect__InvalidNetworkId","inputs":[]},{"type":"error","name":"Architect__InvalidStringLength","inputs":[]},{"type":"error","name":"Architect__NotContract","inputs":[]},{"type":"error","name":"Factory__FailedDeployment","inputs":[]},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]},{"type":"error","name":"Pausable__NotPaused","inputs":[]},{"type":"error","name":"Pausable__Paused","inputs":[]},{"type":"error","name":"ReentrancyGuard__ReentrantCall","inputs":[]},{"type":"error","name":"Validator__InvalidAddress","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b61431b80620000d46000396000f3fe60806040523480156200001157600080fd5b50600436106200006a5760003560e01c8063545efb2d146200006f578063673f0dd514620000a85780637d8c452214620000d85780638bfc94b914620000ef578063c0bc67961462000108578063dc1b9f23146200012e575b600080fd5b6200007962000145565b604080516001600160a01b03948516815292841660208401529216918101919091526060015b60405180910390f35b620000bf620000b93660046200128f565b620001c2565b6040516001600160a01b0390911681526020016200009f565b620000bf620000e936600462001a75565b62000200565b620001066200010036600462001b5e565b620002ef565b005b6200011f6200011936600462001bb0565b62000352565b6040519081526020016200009f565b620001066200013f36600462001b5e565b62000390565b6000806000620001b7600080516020620042fb833981519152547f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d01547f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d02546001600160a01b0392831693918316921690565b925092509250909192565b60008181527f06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f000260205260408120546001600160a01b03165b92915050565b600060027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0054036200024557604051635db5c7cd60e11b815260040160405180910390fd5b6200026f60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b7fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff1615620002b3576040516302ca8ced60e11b815260040160405180910390fd5b620002be82620003db565b9050620002ea60017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b919050565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b0316331462000340576040516365f4906560e01b815233600482015260240160405180910390fd5b6200034d8383836200077c565b505050565b6001600160a01b03811660009081527f06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f00016020526040812054620001fa565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166200034057604051630ef4733760e31b815260040160405180910390fd5b600080516020620042fb833981519152805460408051631d5e528f60e21b815290516000937f06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f000093909285926001600160a01b03909216916375794a3c916004808201926020929091908290030181865afa1580156200045e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000484919062001bd7565b9050620004968186604001516200088b565b8354909450836000620004a98362001bf1565b90915550506000818152600284016020908152604080832080546001600160a01b0319166001600160a01b03898116918217909255845260018701835292819020849055845488519289015191516391de4a8360e01b81529316926391de4a83926200051c929091899060040162001c6d565b6020604051808303816000875af11580156200053c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000562919062001bd7565b50600182015460009062000580906001600160a01b031686620008b5565b6002840154909150600090620005a0906001600160a01b031687620008b5565b60408051600280825260608201835292935060009290916020830190803683370190505090508281600081518110620005dd57620005dd62001caf565b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811062000614576200061462001caf565b6001600160a01b039283166020918202929092010152604051638bfc820f60e01b815290881690638bfc820f906200065190849060040162001cc5565b600060405180830381600087803b1580156200066c57600080fd5b505af115801562000681573d6000803e3d6000fd5b505050506200069b8784848b604001516020015162000972565b50604080890151805151910151600091620006ba918a91908762000da5565b9050620006cd88828b6060015162000f35565b8554604051632142170760e11b8152306004820152336024820152604481018790526001600160a01b03909116906342842e0e90606401600060405180830381600087803b1580156200071f57600080fd5b505af115801562000734573d6000803e3d6000fd5b50506040516001600160a01b038b16925087915033907fe50fc3942f8a2d7e5a7c8fb9488499eba5255b41e18bc3f1b4791402976d1d0b90600090a450505050505050919050565b826001600160a01b03163b600003620007a8576040516302f3d00b60e01b815260040160405180910390fd5b816001600160a01b03163b600003620007d4576040516302f3d00b60e01b815260040160405180910390fd5b806001600160a01b03163b60000362000800576040516302f3d00b60e01b815260040160405180910390fd5b600080516020620042fb83398151915280546001600160a01b039485166001600160a01b0319918216179091557f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d018054938516938216939093179092557f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d028054919093169116179055565b60008060006200089c858562001036565b91509150620008ac8282620011d3565b95945050505050565b60008060405180602001620008ca9062001273565b601f1982820381018352601f9091011660408190526001600160a01b0385166024820152859060440160408051601f19818403018152918152602080830180516001600160e01b031663189acdbd60e31b17905290516200092e9392910162001d14565b60408051601f19818403018152908290526200094e929160200162001d3a565b60405160208183030381529060405290506200096a816200120e565b949350505050565b604080516001808252818301909252600091829190816020015b60608152602001906001900390816200098c579050509050604051806040016040528060098152602001684a6f696e537061636560b81b81525081600081518110620009dc57620009dc62001caf565b6020026020010181905250856001600160a01b0316638fcd793d6040518060400160405280600681526020016526b4b73a32b960d11b8152508360006001600160401b0381111562000a325762000a32620012a9565b60405190808252806020026020018201604052801562000a7a57816020015b60408051808201909152600081526060602082015281526020019060019003908162000a515790505b506040518463ffffffff1660e01b815260040162000a9b9392919062001d96565b6020604051808303816000875af115801562000abb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ae1919062001bd7565b83519092501562000bef576040805160018082528183019092526000916020808301908036833701905050905060018160008151811062000b265762000b2662001caf565b60200260200101906001600160a01b031690816001600160a01b031681525050866001600160a01b031663ba201ba88460405180604001604052808a6001600160a01b031681526020018560405160200162000b83919062001cc5565b6040516020818303038152906040528152506040518363ffffffff1660e01b815260040162000bb492919062001e68565b600060405180830381600087803b15801562000bcf57600080fd5b505af115801562000be4573d6000803e3d6000fd5b505050505062000d9c565b6020830151511562000ce85760005b83602001515181101562000c405762000c378460200151828151811062000c295762000c2962001caf565b602002602001015162001248565b60010162000bfe565b50856001600160a01b031663ba201ba8836040518060400160405280896001600160a01b03168152602001876020015160405160200162000c82919062001cc5565b6040516020818303038152906040528152506040518363ffffffff1660e01b815260040162000cb392919062001e68565b600060405180830381600087803b15801562000cce57600080fd5b505af115801562000ce3573d6000803e3d6000fd5b505050505b604083015151511562000d9c57856001600160a01b031663ba201ba8836040518060400160405280886001600160a01b03168152602001876040015160405160200162000d36919062001f80565b6040516020818303038152906040528152506040518363ffffffff1660e01b815260040162000d6792919062001e68565b600060405180830381600087803b15801562000d8257600080fd5b505af115801562000d97573d6000803e3d6000fd5b505050505b50949350505050565b6040805160018082528183019092526000918291906020808301908036833701905050905060018160008151811062000de25762000de262001caf565b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252600091816020015b60408051808201909152600081526060602082015281526020019060019003908162000e12579050509050838160008151811062000e545762000e5462001caf565b6020908102919091018101516001600160a01b0390921690915260405162000e7f9184910162001cc5565b6040516020818303038152906040528160008151811062000ea45762000ea462001caf565b6020908102919091018101510152604051638fcd793d60e01b81526001600160a01b03881690638fcd793d9062000ee49089908990869060040162001d96565b6020604051808303816000875af115801562000f04573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f2a919062001bd7565b979650505050505050565b60408051600180825281830190925260009160208083019080368337019050509050828160008151811062000f6e5762000f6e62001caf565b602090810291909101810191909152604051600160fd1b918101919091526bffffffffffffffffffffffff19606086901b16602182015260009060350160405160208183030381529060405262000fc5906200202b565b835160405163921f717560e01b81529192506001600160a01b0387169163921f71759162000ffb91859190879060040162002053565b600060405180830381600087803b1580156200101657600080fd5b505af11580156200102b573d6000803e3d6000fd5b505050505050505050565b6060600080600080516020620042fb8339815191526040805133602082015290810187905242606082015290915060800160405160208183030381529060405280519060200120915060405180602001620010919062001281565b601f19828203810183526040601f90920116818101825263dc9cc64560e01b8152306020828101919091528251808401845285546001600160a01b0390811682528183018b90528451610120810186528a515181528a518401519381019390935289518501519483019490945288516060908101519083015288516080908101516001600160401b031690830152885160a090810151851690830152885160c09081015133959293929183019116156200115157895160c0015162001153565b335b6001600160a01b03168152602001896000015160e001518152602001896000015161010001516001600160a01b03168152506040516020016200119a9493929190620020b4565b60408051601f1981840301815290829052620011ba929160200162001d3a565b6040516020818303038152906040529250509250929050565b60008260200183518381836000f59250506001600160a01b0382169050620001fa5760405163ef35ca1960e01b815260040160405180910390fd5b600081602001825180826000f09250506001600160a01b0382169050620002ea5760405163ef35ca1960e01b815260040160405180910390fd5b6001600160a01b03811662001270576040516302e47d1560e41b815260040160405180910390fd5b50565b6103d480620021b083390190565b611d77806200258483390190565b600060208284031215620012a257600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620012e457620012e4620012a9565b60405290565b604051606081016001600160401b0381118282101715620012e457620012e4620012a9565b604080519081016001600160401b0381118282101715620012e457620012e4620012a9565b60405161012081016001600160401b0381118282101715620012e457620012e4620012a9565b604051601f8201601f191681016001600160401b0381118282101715620013855762001385620012a9565b604052919050565b600082601f8301126200139f57600080fd5b81356001600160401b03811115620013bb57620013bb620012a9565b620013d0601f8201601f19166020016200135a565b818152846020838601011115620013e657600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160401b0381168114620002ea57600080fd5b6001600160a01b03811681146200127057600080fd5b8035620002ea816200141b565b60006001600160401b038211156200145a576200145a620012a9565b5060051b60200190565b600381106200127057600080fd5b803560ff81168114620002ea57600080fd5b600082601f8301126200149657600080fd5b81356020620014af620014a9836200143e565b6200135a565b82815260079290921b84018101918181019086841115620014cf57600080fd5b8286015b84811015620015415760808189031215620014ee5760008081fd5b620014f8620012bf565b813560068110620015095760008081fd5b8152818501358582015260408083013562001524816200141b565b9082015260608281013590820152835291830191608001620014d3565b509695505050505050565b600082601f8301126200155e57600080fd5b8135602062001571620014a9836200143e565b828152606092830285018201928282019190878511156200159157600080fd5b8387015b85811015620015fa5781818a031215620015af5760008081fd5b620015b9620012ea565b8135620015c68162001464565b8152620015d582870162001472565b868201526040620015e881840162001472565b90820152845292840192810162001595565b5090979650505050505050565b6000606082840312156200161a57600080fd5b62001624620012ea565b905081356001600160401b03808211156200163e57600080fd5b818401915084601f8301126200165357600080fd5b8135602062001666620014a9836200143e565b82815260069290921b840181019181810190888411156200168657600080fd5b948201945b83861015620016e3576040868a031215620016a65760008081fd5b620016b06200130f565b8635620016bd8162001464565b8152620016cc87850162001472565b81850152825260409590950194908201906200168b565b86525085810135935082841115620016fa57600080fd5b620017088785880162001484565b908501525060408401359150808211156200172257600080fd5b5062001731848285016200154c565b60408301525092915050565b6000606082840312156200175057600080fd5b6200175a620012ea565b9050813580151581146200176d57600080fd5b81526020828101356001600160401b03808211156200178b57600080fd5b818501915085601f830112620017a057600080fd5b8135620017b1620014a9826200143e565b81815260059190911b83018401908481019088831115620017d157600080fd5b938501935b82851015620017fc578435620017ec816200141b565b82529385019390850190620017d6565b808688015250505060408501359250808311156200181957600080fd5b5050620017318482850162001607565b600082601f8301126200183b57600080fd5b813560206200184e620014a9836200143e565b82815260059290921b840181019181810190868411156200186e57600080fd5b8286015b84811015620015415780356001600160401b03811115620018935760008081fd5b620018a38986838b01016200138d565b84525091830191830162001872565b600060608284031215620018c557600080fd5b620018cf620012ea565b905081356001600160401b0380821115620018e957600080fd5b908301906101208286031215620018ff57600080fd5b6200190962001334565b8235828111156200191957600080fd5b62001927878286016200138d565b8252506020830135828111156200193d57600080fd5b6200194b878286016200138d565b6020830152506040830135604082015260608301356060820152620019736080840162001403565b60808201526200198660a0840162001431565b60a08201526200199960c0840162001431565b60c082015260e083013560e0820152610100620019b881850162001431565b9082015283526020840135915080821115620019d357600080fd5b620019e1858386016200173d565b60208401526040840135915080821115620019fb57600080fd5b50620017318482850162001829565b60006020828403121562001a1d57600080fd5b604051602081016001600160401b03828210818311171562001a435762001a43620012a9565b81604052829350843591508082111562001a5c57600080fd5b5062001a6b858286016200138d565b8252505092915050565b60006020828403121562001a8857600080fd5b81356001600160401b038082111562001aa057600080fd5b908301906080828603121562001ab557600080fd5b62001abf620012bf565b82358281111562001acf57600080fd5b62001add878286016200138d565b82525060208301358281111562001af357600080fd5b62001b01878286016200138d565b60208301525060408301358281111562001b1a57600080fd5b62001b2887828601620018b2565b60408301525060608301358281111562001b4157600080fd5b62001b4f8782860162001a0a565b60608301525095945050505050565b60008060006060848603121562001b7457600080fd5b833562001b81816200141b565b9250602084013562001b93816200141b565b9150604084013562001ba5816200141b565b809150509250925092565b60006020828403121562001bc357600080fd5b813562001bd0816200141b565b9392505050565b60006020828403121562001bea57600080fd5b5051919050565b60006001820162001c1257634e487b7160e01b600052601160045260246000fd5b5060010190565b60005b8381101562001c3657818101518382015260200162001c1c565b50506000910152565b6000815180845262001c5981602086016020860162001c19565b601f01601f19169290920160200192915050565b60608152600062001c82606083018662001c3f565b828103602084015262001c96818662001c3f565b91505060018060a01b0383166040830152949350505050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b8181101562001d085783516001600160a01b03168352928401929184019160010162001ce1565b50909695505050505050565b6001600160a01b03831681526040602082018190526000906200096a9083018462001c3f565b6000835162001d4e81846020880162001c19565b83519083019062001d6481836020880162001c19565b01949350505050565b60018060a01b03815116825260006020820151604060208501526200096a604085018262001c3f565b60608152600062001dab606083018662001c3f565b6020838203818501528186518084528284019150828160051b85010183890160005b8381101562001dff57601f1987840301855262001dec83835162001c3f565b9486019492509085019060010162001dcd565b50508681036040880152875180825284820195509250600583901b81018401915083880160005b8481101562001e5857601f1983850301875262001e4584835162001d6d565b9686019693509085019060010162001e26565b50919a9950505050505050505050565b8281526040602082015260006200096a604083018462001d6d565b634e487b7160e01b600052602160045260246000fd5b6003811062001270576200127062001e83565b60008151808452602080850194506020840160005b8381101562001f1b57815180516006811062001ee15762001ee162001e83565b885280840151848901526040808201516001600160a01b031690890152606090810151908801526080909601959082019060010162001ec1565b509495945050505050565b60008151808452602080850194506020840160005b8381101562001f1b578151805162001f538162001e99565b88528084015160ff908116858a015260409182015116908801526060909601959082019060010162001f3b565b6020808252825160608383015280516080840181905260009291820190839060a08601905b8083101562001fe0578351805162001fbd8162001e99565b835285015160ff1685830152928401926001929092019160409091019062001fa5565b50838701519350601f1992508286820301604087015262002002818562001eac565b9350505060408501518185840301606086015262002021838262001f26565b9695505050505050565b805160208083015191908110156200204d576000198160200360031b1b821691505b50919050565b838152600060206060602084015262002070606084018662001c3f565b83810360408501528451808252602080870192019060005b81811015620020a65783518352928401929184019160010162002088565b509098975050505050505050565b600060018060a01b03808716835263ffffffff60e01b8651166020840152806020870151166040840152808551166060840152506020840151608083015260c060a083015282516101208060c0850152620021146101e085018362001c3f565b9150602085015160bf198584030160e086015262002133838262001c3f565b92505060408501516101008181870152606087015183870152608087015192506200216a6101408701846001600160401b03169052565b60a08701516001600160a01b0390811661016088015260c0880151811661018088015260e08801516101a0880152908701519081166101c0870152915062001541905056fe60806040526040516103d43803806103d483398101604081905261002291610268565b61002c8282610033565b5050610352565b61003c82610092565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561008657610081828261010e565b505050565b61008e610185565b5050565b806001600160a01b03163b6000036100cd57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161012b9190610336565b600060405180830381855af49150503d8060008114610166576040519150601f19603f3d011682016040523d82523d6000602084013e61016b565b606091505b50909250905061017c8583836101a6565b95945050505050565b34156101a45760405163b398979f60e01b815260040160405180910390fd5b565b6060826101bb576101b682610205565b6101fe565b81511580156101d257506001600160a01b0384163b155b156101fb57604051639996b31560e01b81526001600160a01b03851660048201526024016100c4565b50805b9392505050565b8051156102155780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b60005b8381101561025f578181015183820152602001610247565b50506000910152565b6000806040838503121561027b57600080fd5b82516001600160a01b038116811461029257600080fd5b60208401519092506001600160401b03808211156102af57600080fd5b818501915085601f8301126102c357600080fd5b8151818111156102d5576102d561022e565b604051601f8201601f19908116603f011681019083821181831017156102fd576102fd61022e565b8160405282815288602084870101111561031657600080fd5b610327836020830160208801610244565b80955050505050509250929050565b60008251610348818460208701610244565b9190910192915050565b6074806103606000396000f3fe6080604052600a600c565b005b60186014601a565b6051565b565b6000604c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015606f573d6000f35b3d6000fd60806040523480156200001157600080fd5b5060405162001d7738038062001d77833981016040819052620000349162000dfe565b6200003e6200016a565b620000a58380517f9c16cba5b9f2fcbd952b38bec34079e93cbe107475c15fc20705f4e704198a0080546020909301516001600160a01b03166001600160a01b031960e09390931c600160a01b02929092166001600160c01b031990931692909217179055565b81517fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60080546001600160a01b0319166001600160a01b0390921691909117905560208201517fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60155805160208201516200011f91906200017e565b62000135818460200151620001d560201b60201c565b6200013f6200038b565b6200014c8460016200039a565b62000156620003c0565b6200016062000495565b5050505062001107565b6200017c6301ffc9a760e01b620004ea565b565b60008051602062001cf78339815191527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df02620001bb848262000f64565b5060038101620001cc838262000f64565b50600090555050565b60008051602062001d1783398151915280546001600160a01b038381166001600160a01b0319928316179092556101008401517fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb608805491909316908216179091557fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb604805490911673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee17905560608201517fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6035560e08201517fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60781905560008051602062001d578339815191529015620002eb5760e0830151620002eb90620005ca565b610100830151620002fc9062000678565b6040830151156200038657604083015162000317906200074a565b600881015460408085015190516391b7f5ed60e01b81526001600160a01b03909216916391b7f5ed91620003519160040190815260200190565b600060405180830381600087803b1580156200036c57600080fd5b505af115801562000381573d6000803e3d6000fd5b505050505b505050565b6200017c607b6103e8620007f5565b620003bc828260405180602001604052806000815250620008ee60201b60201c565b5050565b60007f9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009050600060008051602062001d5783398151915260060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa15801562000450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000476919062001030565b82546001600160a01b0319166001600160a01b03919091161790915550565b620004a76380ac58cd60e01b620004ea565b620004b9635b5e139f60e01b620004ea565b620004cb638c65f84d60e01b620004ea565b620004dd6307f5828d60e41b620004ea565b6200017c63421fb7a760e01b5b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff16151560011462000579576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff1916600117905562000592565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60008051602062001d178339815191525460408051632cbb9d1360e01b8152905160008051602062001d57833981519152926001600160a01b031691632cbb9d139160048083019260209291908290030181865afa15801562000631573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000657919062001055565b821115620003bc5760405163c3983b9160e01b815260040160405180910390fd5b6001600160a01b038116620006a057604051630e88bf4b60e01b815260040160405180910390fd5b60008051602062001d17833981519152546001600160a01b03166040516346fc05eb60e11b81526001600160a01b0383811660048301529190911690638df80bd690602401602060405180830381865afa15801562000703573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200072991906200106f565b6200074757604051630e88bf4b60e01b815260040160405180910390fd5b50565b60006200076d60008051602062001d17833981519152546001600160a01b031690565b6001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620007ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007d1919062001055565b905080821015620003bc57604051631a23d64760e11b815260040160405180910390fd5b8160000362000817576040516306c1cb6d60e51b815260040160405180910390fd5b6127108161ffff1611156200083f57604051634e7ee09d60e11b815260040160405180910390fd5b60008281527f3c2290b88407133303e904ceb4ee7d0d14164eda8a629372d8406216ceb57e00602081905260409091205461ffff16801562000894576040516306c1cb6d60e51b815260040160405180910390fd5b60008481526020838152604091829020805461ffff191661ffff8716908117909155915191825285917f674ed3e313f9254fbafb8a51fa62be8b5f0a767d64c64cfe6f099c80c779a528910160405180910390a250505050565b620008fa838362000980565b6001600160a01b0383163b15620003865760008051602062001cf7833981519152548281035b6001810190620009369060009087908662000aba565b62000954576040516368d2bf6b60e11b815260040160405180910390fd5b81811062000920578160008051602062001cf783398151915254146200097957600080fd5b5050505050565b60008051602062001cf7833981519152546000829003620009b45760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df056020908152604080832080546801000000000000000188020190558483527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0490915281206001851460e11b4260a01b1783179055828401908390839060008051602062001d378339815191528180a4600183015b81811462000a81578083600060008051602062001d37833981519152600080a460010162000a58565b508160000362000aa357604051622e076360e81b815260040160405180910390fd5b60008051602062001cf78339815191525550505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029062000af190339089908890889060040162001093565b6020604051808303816000875af192505050801562000b2f575060408051601f3d908101601f1916820190925262000b2c91810190620010e9565b60015b62000b91573d80801562000b60576040519150601f19603f3d011682016040523d82523d6000602084013e62000b65565b606091505b50805160000362000b89576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b80516001600160a01b038116811462000bc657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b038111828210171562000c075762000c0762000bcb565b60405290565b604080519081016001600160401b038111828210171562000c075762000c0762000bcb565b80516001600160e01b03198116811462000bc657600080fd5b60005b8381101562000c6857818101518382015260200162000c4e565b50506000910152565b600082601f83011262000c8357600080fd5b81516001600160401b038082111562000ca05762000ca062000bcb565b604051601f8301601f19908116603f0116810190828211818310171562000ccb5762000ccb62000bcb565b8160405283815286602085880101111562000ce557600080fd5b62000cf884602083016020890162000c4b565b9695505050505050565b80516001600160401b038116811462000bc657600080fd5b6000610120828403121562000d2e57600080fd5b62000d3862000be1565b82519091506001600160401b038082111562000d5357600080fd5b62000d618583860162000c71565b8352602084015191508082111562000d7857600080fd5b5062000d878482850162000c71565b602083015250604082015160408201526060820151606082015262000daf6080830162000d02565b608082015262000dc260a0830162000bae565b60a082015262000dd560c0830162000bae565b60c082015260e082015160e082015261010062000df481840162000bae565b9082015292915050565b60008060008084860360c081121562000e1657600080fd5b62000e218662000bae565b94506040601f198201121562000e3657600080fd5b62000e4062000c0d565b62000e4e6020880162000c32565b815262000e5e6040880162000bae565b602082015293506040605f198201121562000e7857600080fd5b5062000e8362000c0d565b62000e916060870162000bae565b81526080860151602082015260a08601519092506001600160401b0381111562000eba57600080fd5b62000ec88782880162000d1a565b91505092959194509250565b600181811c9082168062000ee957607f821691505b60208210810362000f0a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000386576000816000526020600020601f850160051c8101602086101562000f3b5750805b601f850160051c820191505b8181101562000f5c5782815560010162000f47565b505050505050565b81516001600160401b0381111562000f805762000f8062000bcb565b62000f988162000f91845462000ed4565b8462000f10565b602080601f83116001811462000fd0576000841562000fb75750858301515b600019600386901b1c1916600185901b17855562000f5c565b600085815260208120601f198616915b82811015620010015788860151825594840194600190910190840162000fe0565b5085821015620010205787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200104357600080fd5b6200104e8262000bae565b9392505050565b6000602082840312156200106857600080fd5b5051919050565b6000602082840312156200108257600080fd5b815180151581146200104e57600080fd5b600060018060a01b038087168352808616602084015250836040830152608060608301528251806080840152620010d28160a085016020870162000c4b565b601f01601f19169190910160a00195945050505050565b600060208284031215620010fc57600080fd5b6200104e8262000c32565b610be080620011176000396000f3fe6080604052600436106100a05760003560e01c80638934207f116100645780638934207f1461020d578063ac7ee62614610241578063ac9650d81461027e578063b3a5be6d146102ab578063d33d9345146102c0578063f9d5d22c146102e2576100a7565b80633ded10de146100b157806369d9346b146100e4578063702515631461014057806373fc5a051461019157806377460cd3146101d0576100a7565b366100a757005b6100af610302565b005b3480156100bd57600080fd5b506100d16100cc366004610918565b61035d565b6040519081526020015b60405180910390f35b3480156100f057600080fd5b506100af6100ff366004610949565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60880546001600160a01b0319166001600160a01b0392909216919091179055565b34801561014c57600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb604546001600160a01b03165b6040516001600160a01b0390911681526020016100db565b34801561019d57600080fd5b506100af6101ac366004610918565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60355565b3480156101dc57600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb606546001600160a01b0316610179565b34801561021957600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb603546100d1565b34801561024d57600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb608546001600160a01b0316610179565b34801561028a57600080fd5b5061029e61029936600461096d565b6104ef565b6040516100db9190610a32565b3480156102b757600080fd5b506100d161060c565b3480156102cc57600080fd5b506102d56106cd565b6040516100db9190610a96565b3480156102ee57600080fd5b506100af6102fd366004610918565b61076f565b600061030c6107d2565b9050806001600160a01b03163b600003610339576040516321f27f0d60e21b815260040160405180910390fd5b3660008037600080366000845af43d6000803e808015610358573d6000f35b3d6000fd5b6000600080516020610bc08339815191528161037761060c565b90508381111561038b575060009392505050565b6006820154604051639262b1b360e01b815230600482015285916001600160a01b031690639262b1b390602401602060405180830381865afa1580156103d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f99190610aa9565b1115610409575060009392505050565b60088201546001600160a01b03161561049a576008820154604051635cf4ee9160e01b815260048101839052602481018690526001600160a01b0390911690635cf4ee9190604401602060405180830381865afa15801561046e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104929190610aa9565b949350505050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046e573d6000803e3d6000fd5b6060818067ffffffffffffffff81111561050b5761050b610ac2565b60405190808252806020026020018201604052801561053e57816020015b60608152602001906001900390816105295790505b50915060005b81811015610604576000803087878581811061056257610562610ad8565b90506020028101906105749190610aee565b604051610582929190610b3c565b600060405180830381855af49150503d80600081146105bd576040519150601f19603f3d011682016040523d82523d6000602084013e6105c2565b606091505b509150915081156105f057808584815181106105e0576105e0610ad8565b60200260200101819052506105fa565b3d6000803e3d6000fd5b5050600101610544565b505092915050565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60754600090600080516020610bc083398151915290801561064d5792915050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c69190610aa9565b9250505090565b6060600080516020610bc0833981519152600c0180546106ec90610b4c565b80601f016020809104026020016040519081016040528092919081815260200182805461071890610b4c565b80156107655780601f1061073a57610100808354040283529160200191610765565b820191906000526020600020905b81548152906001019060200180831161074857829003601f168201915b5050505050905090565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb607819055604051600080516020610bc08339815191529082907fab14a23e88fb272313490d4f20d63098e64fd38304c0e07a377db98c2b39b92f90600090a25050565b7f9c16cba5b9f2fcbd952b38bec34079e93cbe107475c15fc20705f4e704198a0054600090600160a01b900460e01b81806108347f9c16cba5b9f2fcbd952b38bec34079e93cbe107475c15fc20705f4e704198a00546001600160a01b031690565b6040516001600160e01b03196000351660248201526001600160a01b039190911690849060440160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516108999190610b86565b600060405180830381855afa9150503d80600081146108d4576040519150601f19603f3d011682016040523d82523d6000602084013e6108d9565b606091505b5091509150816108fc5760405163391aa44560e01b815260040160405180910390fd5b808060200190518101906109109190610ba2565b935050505090565b60006020828403121561092a57600080fd5b5035919050565b6001600160a01b038116811461094657600080fd5b50565b60006020828403121561095b57600080fd5b813561096681610931565b9392505050565b6000806020838503121561098057600080fd5b823567ffffffffffffffff8082111561099857600080fd5b818501915085601f8301126109ac57600080fd5b8135818111156109bb57600080fd5b8660208260051b85010111156109d057600080fd5b60209290920196919550909350505050565b60005b838110156109fd5781810151838201526020016109e5565b50506000910152565b60008151808452610a1e8160208601602086016109e2565b601f01601f19169290920160200192915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015610a8957603f19888603018452610a77858351610a06565b94509285019290850190600101610a5b565b5092979650505050505050565b6020815260006109666020830184610a06565b600060208284031215610abb57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610b0557600080fd5b83018035915067ffffffffffffffff821115610b2057600080fd5b602001915036819003821315610b3557600080fd5b9250929050565b8183823760009101908152919050565b600181811c90821680610b6057607f821691505b602082108103610b8057634e487b7160e01b600052602260045260246000fd5b50919050565b60008251610b988184602087016109e2565b9190910192915050565b600060208284031215610bb457600080fd5b81516109668161093156fec21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df00c21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb606ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6009e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d00","sourceMap":"830:1802:127:-:0;;;;;;;;;;;;-1:-1:-1;385:22:49;:20;:22::i;:::-;830:1802:127;;1653:314:63;303:66:64;1779:14:63;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:63;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:63;1898:16;1886:28;;;;;1927:29;;158:42:375;;;1927:29:63;;146:2:375;131:18;1927:29:63;;;;;;;1844:119;1694:273;1653:314::o;14:192:375:-;830:1802:127;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040523480156200001157600080fd5b50600436106200006a5760003560e01c8063545efb2d146200006f578063673f0dd514620000a85780637d8c452214620000d85780638bfc94b914620000ef578063c0bc67961462000108578063dc1b9f23146200012e575b600080fd5b6200007962000145565b604080516001600160a01b03948516815292841660208401529216918101919091526060015b60405180910390f35b620000bf620000b93660046200128f565b620001c2565b6040516001600160a01b0390911681526020016200009f565b620000bf620000e936600462001a75565b62000200565b620001066200010036600462001b5e565b620002ef565b005b6200011f6200011936600462001bb0565b62000352565b6040519081526020016200009f565b620001066200013f36600462001b5e565b62000390565b6000806000620001b7600080516020620042fb833981519152547f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d01547f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d02546001600160a01b0392831693918316921690565b925092509250909192565b60008181527f06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f000260205260408120546001600160a01b03165b92915050565b600060027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0054036200024557604051635db5c7cd60e11b815260040160405180910390fd5b6200026f60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b7fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff1615620002b3576040516302ca8ced60e11b815260040160405180910390fd5b620002be82620003db565b9050620002ea60017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b919050565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b0316331462000340576040516365f4906560e01b815233600482015260240160405180910390fd5b6200034d8383836200077c565b505050565b6001600160a01b03811660009081527f06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f00016020526040812054620001fa565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166200034057604051630ef4733760e31b815260040160405180910390fd5b600080516020620042fb833981519152805460408051631d5e528f60e21b815290516000937f06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f000093909285926001600160a01b03909216916375794a3c916004808201926020929091908290030181865afa1580156200045e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000484919062001bd7565b9050620004968186604001516200088b565b8354909450836000620004a98362001bf1565b90915550506000818152600284016020908152604080832080546001600160a01b0319166001600160a01b03898116918217909255845260018701835292819020849055845488519289015191516391de4a8360e01b81529316926391de4a83926200051c929091899060040162001c6d565b6020604051808303816000875af11580156200053c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000562919062001bd7565b50600182015460009062000580906001600160a01b031686620008b5565b6002840154909150600090620005a0906001600160a01b031687620008b5565b60408051600280825260608201835292935060009290916020830190803683370190505090508281600081518110620005dd57620005dd62001caf565b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811062000614576200061462001caf565b6001600160a01b039283166020918202929092010152604051638bfc820f60e01b815290881690638bfc820f906200065190849060040162001cc5565b600060405180830381600087803b1580156200066c57600080fd5b505af115801562000681573d6000803e3d6000fd5b505050506200069b8784848b604001516020015162000972565b50604080890151805151910151600091620006ba918a91908762000da5565b9050620006cd88828b6060015162000f35565b8554604051632142170760e11b8152306004820152336024820152604481018790526001600160a01b03909116906342842e0e90606401600060405180830381600087803b1580156200071f57600080fd5b505af115801562000734573d6000803e3d6000fd5b50506040516001600160a01b038b16925087915033907fe50fc3942f8a2d7e5a7c8fb9488499eba5255b41e18bc3f1b4791402976d1d0b90600090a450505050505050919050565b826001600160a01b03163b600003620007a8576040516302f3d00b60e01b815260040160405180910390fd5b816001600160a01b03163b600003620007d4576040516302f3d00b60e01b815260040160405180910390fd5b806001600160a01b03163b60000362000800576040516302f3d00b60e01b815260040160405180910390fd5b600080516020620042fb83398151915280546001600160a01b039485166001600160a01b0319918216179091557f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d018054938516938216939093179092557f9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d028054919093169116179055565b60008060006200089c858562001036565b91509150620008ac8282620011d3565b95945050505050565b60008060405180602001620008ca9062001273565b601f1982820381018352601f9091011660408190526001600160a01b0385166024820152859060440160408051601f19818403018152918152602080830180516001600160e01b031663189acdbd60e31b17905290516200092e9392910162001d14565b60408051601f19818403018152908290526200094e929160200162001d3a565b60405160208183030381529060405290506200096a816200120e565b949350505050565b604080516001808252818301909252600091829190816020015b60608152602001906001900390816200098c579050509050604051806040016040528060098152602001684a6f696e537061636560b81b81525081600081518110620009dc57620009dc62001caf565b6020026020010181905250856001600160a01b0316638fcd793d6040518060400160405280600681526020016526b4b73a32b960d11b8152508360006001600160401b0381111562000a325762000a32620012a9565b60405190808252806020026020018201604052801562000a7a57816020015b60408051808201909152600081526060602082015281526020019060019003908162000a515790505b506040518463ffffffff1660e01b815260040162000a9b9392919062001d96565b6020604051808303816000875af115801562000abb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ae1919062001bd7565b83519092501562000bef576040805160018082528183019092526000916020808301908036833701905050905060018160008151811062000b265762000b2662001caf565b60200260200101906001600160a01b031690816001600160a01b031681525050866001600160a01b031663ba201ba88460405180604001604052808a6001600160a01b031681526020018560405160200162000b83919062001cc5565b6040516020818303038152906040528152506040518363ffffffff1660e01b815260040162000bb492919062001e68565b600060405180830381600087803b15801562000bcf57600080fd5b505af115801562000be4573d6000803e3d6000fd5b505050505062000d9c565b6020830151511562000ce85760005b83602001515181101562000c405762000c378460200151828151811062000c295762000c2962001caf565b602002602001015162001248565b60010162000bfe565b50856001600160a01b031663ba201ba8836040518060400160405280896001600160a01b03168152602001876020015160405160200162000c82919062001cc5565b6040516020818303038152906040528152506040518363ffffffff1660e01b815260040162000cb392919062001e68565b600060405180830381600087803b15801562000cce57600080fd5b505af115801562000ce3573d6000803e3d6000fd5b505050505b604083015151511562000d9c57856001600160a01b031663ba201ba8836040518060400160405280886001600160a01b03168152602001876040015160405160200162000d36919062001f80565b6040516020818303038152906040528152506040518363ffffffff1660e01b815260040162000d6792919062001e68565b600060405180830381600087803b15801562000d8257600080fd5b505af115801562000d97573d6000803e3d6000fd5b505050505b50949350505050565b6040805160018082528183019092526000918291906020808301908036833701905050905060018160008151811062000de25762000de262001caf565b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252600091816020015b60408051808201909152600081526060602082015281526020019060019003908162000e12579050509050838160008151811062000e545762000e5462001caf565b6020908102919091018101516001600160a01b0390921690915260405162000e7f9184910162001cc5565b6040516020818303038152906040528160008151811062000ea45762000ea462001caf565b6020908102919091018101510152604051638fcd793d60e01b81526001600160a01b03881690638fcd793d9062000ee49089908990869060040162001d96565b6020604051808303816000875af115801562000f04573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f2a919062001bd7565b979650505050505050565b60408051600180825281830190925260009160208083019080368337019050509050828160008151811062000f6e5762000f6e62001caf565b602090810291909101810191909152604051600160fd1b918101919091526bffffffffffffffffffffffff19606086901b16602182015260009060350160405160208183030381529060405262000fc5906200202b565b835160405163921f717560e01b81529192506001600160a01b0387169163921f71759162000ffb91859190879060040162002053565b600060405180830381600087803b1580156200101657600080fd5b505af11580156200102b573d6000803e3d6000fd5b505050505050505050565b6060600080600080516020620042fb8339815191526040805133602082015290810187905242606082015290915060800160405160208183030381529060405280519060200120915060405180602001620010919062001281565b601f19828203810183526040601f90920116818101825263dc9cc64560e01b8152306020828101919091528251808401845285546001600160a01b0390811682528183018b90528451610120810186528a515181528a518401519381019390935289518501519483019490945288516060908101519083015288516080908101516001600160401b031690830152885160a090810151851690830152885160c09081015133959293929183019116156200115157895160c0015162001153565b335b6001600160a01b03168152602001896000015160e001518152602001896000015161010001516001600160a01b03168152506040516020016200119a9493929190620020b4565b60408051601f1981840301815290829052620011ba929160200162001d3a565b6040516020818303038152906040529250509250929050565b60008260200183518381836000f59250506001600160a01b0382169050620001fa5760405163ef35ca1960e01b815260040160405180910390fd5b600081602001825180826000f09250506001600160a01b0382169050620002ea5760405163ef35ca1960e01b815260040160405180910390fd5b6001600160a01b03811662001270576040516302e47d1560e41b815260040160405180910390fd5b50565b6103d480620021b083390190565b611d77806200258483390190565b600060208284031215620012a257600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620012e457620012e4620012a9565b60405290565b604051606081016001600160401b0381118282101715620012e457620012e4620012a9565b604080519081016001600160401b0381118282101715620012e457620012e4620012a9565b60405161012081016001600160401b0381118282101715620012e457620012e4620012a9565b604051601f8201601f191681016001600160401b0381118282101715620013855762001385620012a9565b604052919050565b600082601f8301126200139f57600080fd5b81356001600160401b03811115620013bb57620013bb620012a9565b620013d0601f8201601f19166020016200135a565b818152846020838601011115620013e657600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160401b0381168114620002ea57600080fd5b6001600160a01b03811681146200127057600080fd5b8035620002ea816200141b565b60006001600160401b038211156200145a576200145a620012a9565b5060051b60200190565b600381106200127057600080fd5b803560ff81168114620002ea57600080fd5b600082601f8301126200149657600080fd5b81356020620014af620014a9836200143e565b6200135a565b82815260079290921b84018101918181019086841115620014cf57600080fd5b8286015b84811015620015415760808189031215620014ee5760008081fd5b620014f8620012bf565b813560068110620015095760008081fd5b8152818501358582015260408083013562001524816200141b565b9082015260608281013590820152835291830191608001620014d3565b509695505050505050565b600082601f8301126200155e57600080fd5b8135602062001571620014a9836200143e565b828152606092830285018201928282019190878511156200159157600080fd5b8387015b85811015620015fa5781818a031215620015af5760008081fd5b620015b9620012ea565b8135620015c68162001464565b8152620015d582870162001472565b868201526040620015e881840162001472565b90820152845292840192810162001595565b5090979650505050505050565b6000606082840312156200161a57600080fd5b62001624620012ea565b905081356001600160401b03808211156200163e57600080fd5b818401915084601f8301126200165357600080fd5b8135602062001666620014a9836200143e565b82815260069290921b840181019181810190888411156200168657600080fd5b948201945b83861015620016e3576040868a031215620016a65760008081fd5b620016b06200130f565b8635620016bd8162001464565b8152620016cc87850162001472565b81850152825260409590950194908201906200168b565b86525085810135935082841115620016fa57600080fd5b620017088785880162001484565b908501525060408401359150808211156200172257600080fd5b5062001731848285016200154c565b60408301525092915050565b6000606082840312156200175057600080fd5b6200175a620012ea565b9050813580151581146200176d57600080fd5b81526020828101356001600160401b03808211156200178b57600080fd5b818501915085601f830112620017a057600080fd5b8135620017b1620014a9826200143e565b81815260059190911b83018401908481019088831115620017d157600080fd5b938501935b82851015620017fc578435620017ec816200141b565b82529385019390850190620017d6565b808688015250505060408501359250808311156200181957600080fd5b5050620017318482850162001607565b600082601f8301126200183b57600080fd5b813560206200184e620014a9836200143e565b82815260059290921b840181019181810190868411156200186e57600080fd5b8286015b84811015620015415780356001600160401b03811115620018935760008081fd5b620018a38986838b01016200138d565b84525091830191830162001872565b600060608284031215620018c557600080fd5b620018cf620012ea565b905081356001600160401b0380821115620018e957600080fd5b908301906101208286031215620018ff57600080fd5b6200190962001334565b8235828111156200191957600080fd5b62001927878286016200138d565b8252506020830135828111156200193d57600080fd5b6200194b878286016200138d565b6020830152506040830135604082015260608301356060820152620019736080840162001403565b60808201526200198660a0840162001431565b60a08201526200199960c0840162001431565b60c082015260e083013560e0820152610100620019b881850162001431565b9082015283526020840135915080821115620019d357600080fd5b620019e1858386016200173d565b60208401526040840135915080821115620019fb57600080fd5b50620017318482850162001829565b60006020828403121562001a1d57600080fd5b604051602081016001600160401b03828210818311171562001a435762001a43620012a9565b81604052829350843591508082111562001a5c57600080fd5b5062001a6b858286016200138d565b8252505092915050565b60006020828403121562001a8857600080fd5b81356001600160401b038082111562001aa057600080fd5b908301906080828603121562001ab557600080fd5b62001abf620012bf565b82358281111562001acf57600080fd5b62001add878286016200138d565b82525060208301358281111562001af357600080fd5b62001b01878286016200138d565b60208301525060408301358281111562001b1a57600080fd5b62001b2887828601620018b2565b60408301525060608301358281111562001b4157600080fd5b62001b4f8782860162001a0a565b60608301525095945050505050565b60008060006060848603121562001b7457600080fd5b833562001b81816200141b565b9250602084013562001b93816200141b565b9150604084013562001ba5816200141b565b809150509250925092565b60006020828403121562001bc357600080fd5b813562001bd0816200141b565b9392505050565b60006020828403121562001bea57600080fd5b5051919050565b60006001820162001c1257634e487b7160e01b600052601160045260246000fd5b5060010190565b60005b8381101562001c3657818101518382015260200162001c1c565b50506000910152565b6000815180845262001c5981602086016020860162001c19565b601f01601f19169290920160200192915050565b60608152600062001c82606083018662001c3f565b828103602084015262001c96818662001c3f565b91505060018060a01b0383166040830152949350505050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b8181101562001d085783516001600160a01b03168352928401929184019160010162001ce1565b50909695505050505050565b6001600160a01b03831681526040602082018190526000906200096a9083018462001c3f565b6000835162001d4e81846020880162001c19565b83519083019062001d6481836020880162001c19565b01949350505050565b60018060a01b03815116825260006020820151604060208501526200096a604085018262001c3f565b60608152600062001dab606083018662001c3f565b6020838203818501528186518084528284019150828160051b85010183890160005b8381101562001dff57601f1987840301855262001dec83835162001c3f565b9486019492509085019060010162001dcd565b50508681036040880152875180825284820195509250600583901b81018401915083880160005b8481101562001e5857601f1983850301875262001e4584835162001d6d565b9686019693509085019060010162001e26565b50919a9950505050505050505050565b8281526040602082015260006200096a604083018462001d6d565b634e487b7160e01b600052602160045260246000fd5b6003811062001270576200127062001e83565b60008151808452602080850194506020840160005b8381101562001f1b57815180516006811062001ee15762001ee162001e83565b885280840151848901526040808201516001600160a01b031690890152606090810151908801526080909601959082019060010162001ec1565b509495945050505050565b60008151808452602080850194506020840160005b8381101562001f1b578151805162001f538162001e99565b88528084015160ff908116858a015260409182015116908801526060909601959082019060010162001f3b565b6020808252825160608383015280516080840181905260009291820190839060a08601905b8083101562001fe0578351805162001fbd8162001e99565b835285015160ff1685830152928401926001929092019160409091019062001fa5565b50838701519350601f1992508286820301604087015262002002818562001eac565b9350505060408501518185840301606086015262002021838262001f26565b9695505050505050565b805160208083015191908110156200204d576000198160200360031b1b821691505b50919050565b838152600060206060602084015262002070606084018662001c3f565b83810360408501528451808252602080870192019060005b81811015620020a65783518352928401929184019160010162002088565b509098975050505050505050565b600060018060a01b03808716835263ffffffff60e01b8651166020840152806020870151166040840152808551166060840152506020840151608083015260c060a083015282516101208060c0850152620021146101e085018362001c3f565b9150602085015160bf198584030160e086015262002133838262001c3f565b92505060408501516101008181870152606087015183870152608087015192506200216a6101408701846001600160401b03169052565b60a08701516001600160a01b0390811661016088015260c0880151811661018088015260e08801516101a0880152908701519081166101c0870152915062001541905056fe60806040526040516103d43803806103d483398101604081905261002291610268565b61002c8282610033565b5050610352565b61003c82610092565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561008657610081828261010e565b505050565b61008e610185565b5050565b806001600160a01b03163b6000036100cd57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161012b9190610336565b600060405180830381855af49150503d8060008114610166576040519150601f19603f3d011682016040523d82523d6000602084013e61016b565b606091505b50909250905061017c8583836101a6565b95945050505050565b34156101a45760405163b398979f60e01b815260040160405180910390fd5b565b6060826101bb576101b682610205565b6101fe565b81511580156101d257506001600160a01b0384163b155b156101fb57604051639996b31560e01b81526001600160a01b03851660048201526024016100c4565b50805b9392505050565b8051156102155780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b60005b8381101561025f578181015183820152602001610247565b50506000910152565b6000806040838503121561027b57600080fd5b82516001600160a01b038116811461029257600080fd5b60208401519092506001600160401b03808211156102af57600080fd5b818501915085601f8301126102c357600080fd5b8151818111156102d5576102d561022e565b604051601f8201601f19908116603f011681019083821181831017156102fd576102fd61022e565b8160405282815288602084870101111561031657600080fd5b610327836020830160208801610244565b80955050505050509250929050565b60008251610348818460208701610244565b9190910192915050565b6074806103606000396000f3fe6080604052600a600c565b005b60186014601a565b6051565b565b6000604c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015606f573d6000f35b3d6000fd60806040523480156200001157600080fd5b5060405162001d7738038062001d77833981016040819052620000349162000dfe565b6200003e6200016a565b620000a58380517f9c16cba5b9f2fcbd952b38bec34079e93cbe107475c15fc20705f4e704198a0080546020909301516001600160a01b03166001600160a01b031960e09390931c600160a01b02929092166001600160c01b031990931692909217179055565b81517fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60080546001600160a01b0319166001600160a01b0390921691909117905560208201517fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60155805160208201516200011f91906200017e565b62000135818460200151620001d560201b60201c565b6200013f6200038b565b6200014c8460016200039a565b62000156620003c0565b6200016062000495565b5050505062001107565b6200017c6301ffc9a760e01b620004ea565b565b60008051602062001cf78339815191527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df02620001bb848262000f64565b5060038101620001cc838262000f64565b50600090555050565b60008051602062001d1783398151915280546001600160a01b038381166001600160a01b0319928316179092556101008401517fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb608805491909316908216179091557fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb604805490911673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee17905560608201517fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6035560e08201517fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60781905560008051602062001d578339815191529015620002eb5760e0830151620002eb90620005ca565b610100830151620002fc9062000678565b6040830151156200038657604083015162000317906200074a565b600881015460408085015190516391b7f5ed60e01b81526001600160a01b03909216916391b7f5ed91620003519160040190815260200190565b600060405180830381600087803b1580156200036c57600080fd5b505af115801562000381573d6000803e3d6000fd5b505050505b505050565b6200017c607b6103e8620007f5565b620003bc828260405180602001604052806000815250620008ee60201b60201c565b5050565b60007f9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009050600060008051602062001d5783398151915260060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa15801562000450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000476919062001030565b82546001600160a01b0319166001600160a01b03919091161790915550565b620004a76380ac58cd60e01b620004ea565b620004b9635b5e139f60e01b620004ea565b620004cb638c65f84d60e01b620004ea565b620004dd6307f5828d60e41b620004ea565b6200017c63421fb7a760e01b5b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff16151560011462000579576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff1916600117905562000592565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60008051602062001d178339815191525460408051632cbb9d1360e01b8152905160008051602062001d57833981519152926001600160a01b031691632cbb9d139160048083019260209291908290030181865afa15801562000631573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000657919062001055565b821115620003bc5760405163c3983b9160e01b815260040160405180910390fd5b6001600160a01b038116620006a057604051630e88bf4b60e01b815260040160405180910390fd5b60008051602062001d17833981519152546001600160a01b03166040516346fc05eb60e11b81526001600160a01b0383811660048301529190911690638df80bd690602401602060405180830381865afa15801562000703573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200072991906200106f565b6200074757604051630e88bf4b60e01b815260040160405180910390fd5b50565b60006200076d60008051602062001d17833981519152546001600160a01b031690565b6001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620007ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007d1919062001055565b905080821015620003bc57604051631a23d64760e11b815260040160405180910390fd5b8160000362000817576040516306c1cb6d60e51b815260040160405180910390fd5b6127108161ffff1611156200083f57604051634e7ee09d60e11b815260040160405180910390fd5b60008281527f3c2290b88407133303e904ceb4ee7d0d14164eda8a629372d8406216ceb57e00602081905260409091205461ffff16801562000894576040516306c1cb6d60e51b815260040160405180910390fd5b60008481526020838152604091829020805461ffff191661ffff8716908117909155915191825285917f674ed3e313f9254fbafb8a51fa62be8b5f0a767d64c64cfe6f099c80c779a528910160405180910390a250505050565b620008fa838362000980565b6001600160a01b0383163b15620003865760008051602062001cf7833981519152548281035b6001810190620009369060009087908662000aba565b62000954576040516368d2bf6b60e11b815260040160405180910390fd5b81811062000920578160008051602062001cf783398151915254146200097957600080fd5b5050505050565b60008051602062001cf7833981519152546000829003620009b45760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df056020908152604080832080546801000000000000000188020190558483527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0490915281206001851460e11b4260a01b1783179055828401908390839060008051602062001d378339815191528180a4600183015b81811462000a81578083600060008051602062001d37833981519152600080a460010162000a58565b508160000362000aa357604051622e076360e81b815260040160405180910390fd5b60008051602062001cf78339815191525550505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029062000af190339089908890889060040162001093565b6020604051808303816000875af192505050801562000b2f575060408051601f3d908101601f1916820190925262000b2c91810190620010e9565b60015b62000b91573d80801562000b60576040519150601f19603f3d011682016040523d82523d6000602084013e62000b65565b606091505b50805160000362000b89576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b80516001600160a01b038116811462000bc657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b038111828210171562000c075762000c0762000bcb565b60405290565b604080519081016001600160401b038111828210171562000c075762000c0762000bcb565b80516001600160e01b03198116811462000bc657600080fd5b60005b8381101562000c6857818101518382015260200162000c4e565b50506000910152565b600082601f83011262000c8357600080fd5b81516001600160401b038082111562000ca05762000ca062000bcb565b604051601f8301601f19908116603f0116810190828211818310171562000ccb5762000ccb62000bcb565b8160405283815286602085880101111562000ce557600080fd5b62000cf884602083016020890162000c4b565b9695505050505050565b80516001600160401b038116811462000bc657600080fd5b6000610120828403121562000d2e57600080fd5b62000d3862000be1565b82519091506001600160401b038082111562000d5357600080fd5b62000d618583860162000c71565b8352602084015191508082111562000d7857600080fd5b5062000d878482850162000c71565b602083015250604082015160408201526060820151606082015262000daf6080830162000d02565b608082015262000dc260a0830162000bae565b60a082015262000dd560c0830162000bae565b60c082015260e082015160e082015261010062000df481840162000bae565b9082015292915050565b60008060008084860360c081121562000e1657600080fd5b62000e218662000bae565b94506040601f198201121562000e3657600080fd5b62000e4062000c0d565b62000e4e6020880162000c32565b815262000e5e6040880162000bae565b602082015293506040605f198201121562000e7857600080fd5b5062000e8362000c0d565b62000e916060870162000bae565b81526080860151602082015260a08601519092506001600160401b0381111562000eba57600080fd5b62000ec88782880162000d1a565b91505092959194509250565b600181811c9082168062000ee957607f821691505b60208210810362000f0a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000386576000816000526020600020601f850160051c8101602086101562000f3b5750805b601f850160051c820191505b8181101562000f5c5782815560010162000f47565b505050505050565b81516001600160401b0381111562000f805762000f8062000bcb565b62000f988162000f91845462000ed4565b8462000f10565b602080601f83116001811462000fd0576000841562000fb75750858301515b600019600386901b1c1916600185901b17855562000f5c565b600085815260208120601f198616915b82811015620010015788860151825594840194600190910190840162000fe0565b5085821015620010205787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200104357600080fd5b6200104e8262000bae565b9392505050565b6000602082840312156200106857600080fd5b5051919050565b6000602082840312156200108257600080fd5b815180151581146200104e57600080fd5b600060018060a01b038087168352808616602084015250836040830152608060608301528251806080840152620010d28160a085016020870162000c4b565b601f01601f19169190910160a00195945050505050565b600060208284031215620010fc57600080fd5b6200104e8262000c32565b610be080620011176000396000f3fe6080604052600436106100a05760003560e01c80638934207f116100645780638934207f1461020d578063ac7ee62614610241578063ac9650d81461027e578063b3a5be6d146102ab578063d33d9345146102c0578063f9d5d22c146102e2576100a7565b80633ded10de146100b157806369d9346b146100e4578063702515631461014057806373fc5a051461019157806377460cd3146101d0576100a7565b366100a757005b6100af610302565b005b3480156100bd57600080fd5b506100d16100cc366004610918565b61035d565b6040519081526020015b60405180910390f35b3480156100f057600080fd5b506100af6100ff366004610949565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60880546001600160a01b0319166001600160a01b0392909216919091179055565b34801561014c57600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb604546001600160a01b03165b6040516001600160a01b0390911681526020016100db565b34801561019d57600080fd5b506100af6101ac366004610918565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60355565b3480156101dc57600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb606546001600160a01b0316610179565b34801561021957600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb603546100d1565b34801561024d57600080fd5b507fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb608546001600160a01b0316610179565b34801561028a57600080fd5b5061029e61029936600461096d565b6104ef565b6040516100db9190610a32565b3480156102b757600080fd5b506100d161060c565b3480156102cc57600080fd5b506102d56106cd565b6040516100db9190610a96565b3480156102ee57600080fd5b506100af6102fd366004610918565b61076f565b600061030c6107d2565b9050806001600160a01b03163b600003610339576040516321f27f0d60e21b815260040160405180910390fd5b3660008037600080366000845af43d6000803e808015610358573d6000f35b3d6000fd5b6000600080516020610bc08339815191528161037761060c565b90508381111561038b575060009392505050565b6006820154604051639262b1b360e01b815230600482015285916001600160a01b031690639262b1b390602401602060405180830381865afa1580156103d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f99190610aa9565b1115610409575060009392505050565b60088201546001600160a01b03161561049a576008820154604051635cf4ee9160e01b815260048101839052602481018690526001600160a01b0390911690635cf4ee9190604401602060405180830381865afa15801561046e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104929190610aa9565b949350505050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046e573d6000803e3d6000fd5b6060818067ffffffffffffffff81111561050b5761050b610ac2565b60405190808252806020026020018201604052801561053e57816020015b60608152602001906001900390816105295790505b50915060005b81811015610604576000803087878581811061056257610562610ad8565b90506020028101906105749190610aee565b604051610582929190610b3c565b600060405180830381855af49150503d80600081146105bd576040519150601f19603f3d011682016040523d82523d6000602084013e6105c2565b606091505b509150915081156105f057808584815181106105e0576105e0610ad8565b60200260200101819052506105fa565b3d6000803e3d6000fd5b5050600101610544565b505092915050565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60754600090600080516020610bc083398151915290801561064d5792915050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c69190610aa9565b9250505090565b6060600080516020610bc0833981519152600c0180546106ec90610b4c565b80601f016020809104026020016040519081016040528092919081815260200182805461071890610b4c565b80156107655780601f1061073a57610100808354040283529160200191610765565b820191906000526020600020905b81548152906001019060200180831161074857829003601f168201915b5050505050905090565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb607819055604051600080516020610bc08339815191529082907fab14a23e88fb272313490d4f20d63098e64fd38304c0e07a377db98c2b39b92f90600090a25050565b7f9c16cba5b9f2fcbd952b38bec34079e93cbe107475c15fc20705f4e704198a0054600090600160a01b900460e01b81806108347f9c16cba5b9f2fcbd952b38bec34079e93cbe107475c15fc20705f4e704198a00546001600160a01b031690565b6040516001600160e01b03196000351660248201526001600160a01b039190911690849060440160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516108999190610b86565b600060405180830381855afa9150503d80600081146108d4576040519150601f19603f3d011682016040523d82523d6000602084013e6108d9565b606091505b5091509150816108fc5760405163391aa44560e01b815260040160405180910390fd5b808060200190518101906109109190610ba2565b935050505090565b60006020828403121561092a57600080fd5b5035919050565b6001600160a01b038116811461094657600080fd5b50565b60006020828403121561095b57600080fd5b813561096681610931565b9392505050565b6000806020838503121561098057600080fd5b823567ffffffffffffffff8082111561099857600080fd5b818501915085601f8301126109ac57600080fd5b8135818111156109bb57600080fd5b8660208260051b85010111156109d057600080fd5b60209290920196919550909350505050565b60005b838110156109fd5781810151838201526020016109e5565b50506000910152565b60008151808452610a1e8160208601602086016109e2565b601f01601f19169290920160200192915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015610a8957603f19888603018452610a77858351610a06565b94509285019290850190600101610a5b565b5092979650505050505050565b6020815260006109666020830184610a06565b600060208284031215610abb57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610b0557600080fd5b83018035915067ffffffffffffffff821115610b2057600080fd5b602001915036819003821315610b3557600080fd5b9250929050565b8183823760009101908152919050565b600181811c90821680610b6057607f821691505b602082108103610b8057634e487b7160e01b600052602260045260246000fd5b50919050565b60008251610b988184602087016109e2565b9190910192915050565b600060208284031215610bb457600080fd5b81516109668161093156fec21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df00c21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb606ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6009e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d00","sourceMap":"830:1802:127:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2366:264;;;:::i;:::-;;;;-1:-1:-1;;;;;345:15:375;;;327:34;;397:15;;;392:2;377:18;;370:43;449:15;;429:18;;;422:43;;;;277:2;262:18;2366:264:127;;;;;;;;1611:121;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;934:32:375;;;916:51;;904:2;889:18;1611:121:127;770:203:375;1455:152:127;;;;;;:::i;:::-;;:::i;2037:325::-;;;;;;:::i;:::-;;:::i;:::-;;1736:117;;;;;;:::i;:::-;;:::i;:::-;;;14824:25:375;;;14812:2;14797:18;1736:117:127;14678:177:375;945:334:127;;;;;;:::i;:::-;;:::i;2366:264::-;2452:22;2482:46;2536;2604:21;-1:-1:-1;;;;;;;;;;;5890:13:128;5905:18;;5925;;-1:-1:-1;;;;;5890:13:128;;;;5905:18;;;;5925;;5585:364;2604:21:127;2597:28;;;;;;2366:264;;;:::o;1611:121::-;1678:7;2630:49:128;;;:40;:49;;;;;;-1:-1:-1;;;;;2630:49:128;1700:27:127;1693:34;1611:121;-1:-1:-1;;1611:121:127:o;1455:152::-;1557:7;415:1:92;302:66:93;515:38:92;:66;511:117;;596:32;;-1:-1:-1;;;596:32:92;;;;;;;;;;;511:117;634:22;415:1;302:66:93;832:65:92;777:125;634:22;293:66:89;526:31:87;;;293:55:::1;;;323:18;;-1:-1:-1::0;;;323:18:87::1;;;;;;;;;;;293:55;1579:23:127::2;1592:9;1579:12;:23::i;:::-;1572:30;;669:24:92::0;475:1;302:66:93;832:65:92;777:125;669:24;1455:152:127;;;:::o;2037:325::-;291:66:77;445:29:75;-1:-1:-1;;;;;445:29:75;286:10;:22;282:79;;325:29;;-1:-1:-1;;;325:29:75;;343:10;325:29;;;916:51:375;889:18;;325:29:75;;;;;;;282:79;2240:117:127::1;2267:10;2285:29;2322;2240:19;:117::i;:::-;2037:325:::0;;;:::o;1736:117::-;-1:-1:-1;;;;;2484:47:128;;1801:7:127;2484:47:128;;;:40;:47;;;;;;1823:25:127;2396:140:128;945:334:127;303:66:64;1263:42:63;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:63;;;;;;;;;;;2688:2102:128;-1:-1:-1;;;;;;;;;;;3005:14:128;;:28;;;-1:-1:-1;;;3005:28:128;;;;2764:20;;281:66:129;;772::131;;2764:20:128;;-1:-1:-1;;;;;3005:14:128;;;;:26;;:28;;;;;;;;;;;;;;;:14;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2982:51;;3075:48;3088:12;3102:9;:20;;;3075:12;:48::i;:::-;3164:15;;3060:63;;-1:-1:-1;3164:2:128;:13;:15;;;:::i;:::-;;;;-1:-1:-1;;3210:31:128;;;;:17;;;:31;;;;;;;;:46;;-1:-1:-1;;;;;;3210:46:128;-1:-1:-1;;;;;3210:46:128;;;;;;;;;3262:31;;-1:-1:-1;3262:17:128;;:31;;;;;;:46;;;3362:14;;3387;;3403:13;;;;3362:69;;-1:-1:-1;;;3362:69:128;;:14;;;:24;;:69;;3387:14;;3210:46;;3362:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;3547:19:128;;;;3469:32;;3528:53;;-1:-1:-1;;;;;3547:19:128;3568:12;3528:18;:53::i;:::-;3704:19;;;;3469:118;;-1:-1:-1;3626:32:128;;3685:53;;-1:-1:-1;;;;;3704:19:128;3725:12;3685:18;:53::i;:::-;3783:16;;;3797:1;3783:16;;;;;;;;3626:118;;-1:-1:-1;3751:29:128;;3783:16;;;;;;;;;;;;-1:-1:-1;3783:16:128;3751:48;;3831:15;3805:12;3818:1;3805:15;;;;;;;;:::i;:::-;;;;;;:42;-1:-1:-1;;;;;3805:42:128;;;-1:-1:-1;;;;;3805:42:128;;;;;3879:15;3853:12;3866:1;3853:15;;;;;;;;:::i;:::-;-1:-1:-1;;;;;3853:42:128;;;:15;;;;;;;;;:42;3939:73;;-1:-1:-1;;;3939:73:128;;:59;;;;;;:73;;3999:12;;3939:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4063:137;4095:12;4115:15;4138;4161:9;:20;;;:33;;;4063:24;:137::i;:::-;-1:-1:-1;4343:20:128;;;;;:29;;:34;4385:32;;;4268:20;;4291:155;;4323:12;;4343:34;4425:15;4291:24;:155::i;:::-;4268:178;;4483:68;4505:12;4519;4533:9;:17;;;4483:21;:68::i;:::-;4605:14;;4588:115;;-1:-1:-1;;;4588:115:128;;4654:4;4588:115;;;17337:34:375;4667:10:128;17387:18:375;;;17380:43;17439:18;;;17432:34;;;-1:-1:-1;;;;;4605:14:128;;;;4588:50;;17272:18:375;;4588:115:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4733:52:128;;-1:-1:-1;;;;;4733:52:128;;;-1:-1:-1;4758:12:128;;-1:-1:-1;4746:10:128;;4733:52;;;;;2786:2004;;;;;;;2688:2102;;;:::o;4976:605::-;5140:10;-1:-1:-1;;;;;5132:31:128;;5167:1;5132:36;5128:73;;5177:24;;-1:-1:-1;;;5177:24:128;;;;;;;;;;;5128:73;5219:15;-1:-1:-1;;;;;5211:36:128;;5251:1;5211:41;5207:84;;5267:24;;-1:-1:-1;;;5267:24:128;;;;;;;;;;;5207:84;5309:15;-1:-1:-1;;;;;5301:36:128;;5341:1;5301:41;5297:84;;5357:24;;-1:-1:-1;;;5357:24:128;;;;;;;;;;;5297:84;-1:-1:-1;;;;;;;;;;;5466:26:128;;-1:-1:-1;;;;;5466:26:128;;;-1:-1:-1;;;;;;5466:26:128;;;;;;;5498:18;:36;;;;;;;;;;;;;;;5540:18;:36;;;;;;;;;;;4976:605::o;9109:300::-;9213:13;9262:21;9285:12;9301:67;9332:12;9352:10;9301:23;:67::i;:::-;9261:107;;;;9381:23;9389:8;9399:4;9381:7;:23::i;:::-;9374:30;9109:300;-1:-1:-1;;;;;9109:300:128:o;9413:381::-;9519:7;9561:21;9609:31;;;;;;;;:::i;:::-;-1:-1:-1;;9609:31:128;;;;;;;;;;;;;;;;-1:-1:-1;;;;;934:32:375;;9689:55:128;;;916:51:375;9668:11:128;;889:18:375;;9689:55:128;;;-1:-1:-1;;9689:55:128;;;;;;;;;;;;;;;-1:-1:-1;;;;;9689:55:128;-1:-1:-1;;;9689:55:128;;;9648:104;;;;;9689:55;9648:104;;:::i;:::-;;;;-1:-1:-1;;9648:104:128;;;;;;;;;;9585:173;;;9648:104;9585:173;;:::i;:::-;;;;;;;;;;;;;9561:197;;9772:17;9780:8;9772:7;:17::i;:::-;9765:24;9413:381;-1:-1:-1;;;;9413:381:128:o;6731:1589::-;6993:15;;;7006:1;6993:15;;;;;;;;;6937:14;;;;6993:15;;;;;;;;;;;;;;;;;;;;;6959:49;;7035:21;;;;;;;;;;;;;-1:-1:-1;;;7035:21:128;;;7014:15;7030:1;7014:18;;;;;;;;:::i;:::-;;;;;;:42;;;;7079:12;-1:-1:-1;;;;;7072:31:128;;7111:11;;;;;;;;;;;;;-1:-1:-1;;;7111:11:128;;;7130:15;7188:1;-1:-1:-1;;;;;7153:37:128;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;7153:37:128;;;;;;;;;;;;;;;;7072:124;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7207:21;;7063:133;;-1:-1:-1;7203:1094:128;;;7263:16;;;7277:1;7263:16;;;;;;;;;7238:22;;7263:16;;;;;;;;;;;-1:-1:-1;7263:16:128;7238:41;;2116:1;7287:5;7293:1;7287:8;;;;;;;;:::i;:::-;;;;;;:27;-1:-1:-1;;;;;7287:27:128;;;-1:-1:-1;;;;;7287:27:128;;;;;7330:12;-1:-1:-1;;;;;7323:41:128;;7374:6;7390:110;;;;;;;;7439:15;-1:-1:-1;;;;;7390:110:128;;;;;7483:5;7472:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;7390:110;;;7323:185;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7230:285;7203:1094;;;7533:18;;;;:25;:30;7529:473;;7606:9;7601:172;7625:12;:18;;;:25;7621:1;:29;7601:172;;;7666:45;7689:12;:18;;;7708:1;7689:21;;;;;;;;:::i;:::-;;;;;;;7666:22;:45::i;:::-;7747:3;;7601:172;;;;7790:12;-1:-1:-1;;;;;7783:41:128;;7836:6;7854:129;;;;;;;;7905:15;-1:-1:-1;;;;;7854:129:128;;;;;7951:12;:18;;;7940:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;7854:129;;;7783:210;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7529:473;8014:21;;;;:32;:39;:43;8010:281;;8076:12;-1:-1:-1;;;;;8069:41:128;;8122:6;8140:132;;;;;;;;8191:15;-1:-1:-1;;;;;8140:132:128;;;;;8237:12;:21;;;8226:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;8140:132;;;8069:213;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8010:281;8302:13;6731:1589;;;;;;:::o;8324:601::-;8560:16;;;8574:1;8560:16;;;;;;;;;8513:14;;;;8560:16;;;;;;;;;;;;-1:-1:-1;8560:16:128;8535:41;;2116:1;8582:5;8588:1;8582:8;;;;;;;;:::i;:::-;-1:-1:-1;;;;;8582:27:128;;;;:8;;;;;;;;;;;:27;8675:37;;;8710:1;8675:37;;;;;;;;;8616:56;;8675:37;;;;-1:-1:-1;;;;;;;;;;;;;;;;;8675:37:128;;;;;;;;;;;;;;;8616:96;;8743:15;8718:12;8731:1;8718:15;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;8718:40:128;;;;;;8787:17;;;;8798:5;;8787:17;;:::i;:::-;;;;;;;;;;;;;8764:12;8777:1;8764:15;;;;;;;;:::i;:::-;;;;;;;;;;;;:20;:40;8820:100;;-1:-1:-1;;;8820:100:128;;-1:-1:-1;;;;;8820:31:128;;;;;:100;;8859:10;;8877:17;;8902:12;;8820:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8811:109;8324:601;-1:-1:-1;;;;;;;8324:601:128:o;6135:406::-;6287:16;;;6301:1;6287:16;;;;;;;;;6260:24;;6287:16;;;;;;;;;;;-1:-1:-1;6287:16:128;6260:43;;6322:6;6309:7;6317:1;6309:10;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;;6377:44;;-1:-1:-1;;;6377:44:128;;;24044:39:375;;;;-1:-1:-1;;6406:14:128;;;;24112:44:375;24099:11;;;24092:65;6335:24:128;;24173:12:375;;6377:44:128;;;;;;;;;;;;6362:65;;;:::i;:::-;6495:20;;6434:102;;-1:-1:-1;;;6434:102:128;;6335:92;;-1:-1:-1;;;;;;6434:29:128;;;;;:102;;6335:92;;6495:20;6523:7;;6434:102;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6254:287;;6135:406;;;:::o;9798:1374::-;9918:21;9941:12;;-1:-1:-1;;;;;;;;;;;10079:53:128;;;10090:10;10079:53;;;25539:51:375;25606:18;;;25599:34;;;10116:15:128;25649:18:375;;;25642:34;9961:72:128;;-1:-1:-1;25512:18:375;;10079:53:128;;;;;;;;;;;;10069:64;;;;;;10062:71;;10202:29;;;;;;;;:::i;:::-;-1:-1:-1;;10202:29:128;;;;;;;;;;;;;10279:145;;;;;-1:-1:-1;;;10279:145:128;;10408:4;10202:29;10279:145;;;;;;;10434:121;;;;;;;10497:13;;-1:-1:-1;;;;;10497:13:128;;;10434:121;;;;;;;;10565:588;;;;;;;10610:19;;:24;10565:588;;10654:19;;:26;;;10565:588;;;;;;;10699:19;;:25;;;10565:588;;;;;;;10747:19;;10565:588;10747:29;;;;10565:588;;;;10798:19;;10565:588;10798:28;;;;-1:-1:-1;;;;;10565:588:128;;;;;10848:19;;10565:588;10848:28;;;;10565:588;;;;;;10902:19;;10565:588;10902:32;;;;10259:10;;10434:121;;10565:588;;;;;10902:46;;:118;;10988:19;;:32;;;10902:118;;;10963:10;10902:118;-1:-1:-1;;;;;10565:588:128;;;;;11048:10;:19;;;:34;;;10565:588;;;;11109:10;:19;;;:33;;;-1:-1:-1;;;;;10565:588:128;;;;10239:922;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;10239:922:128;;;;;;;;;;10178:989;;;10239:922;10178:989;;:::i;:::-;;;;;;;;;;;;;10167:1000;;9955:1217;9798:1374;;;;;:::o;1061:354:220:-;1145:18;1218:8;1212:4;1208:19;1260:8;1254:15;1329:4;1315:12;1301;1298:1;1290:44;1276:58;-1:-1:-1;;;;;;;1350:24:220;;;-1:-1:-1;1346:64:220;;1383:27;;-1:-1:-1;;;1383:27:220;;;;;;;;;;;401:329;467:18;540:8;534:4;530:19;582:8;576:15;636:12;622;619:1;612:37;598:51;-1:-1:-1;;;;;;;665:24:220;;;-1:-1:-1;661:64:220;;698:27;;-1:-1:-1;;;698:27:220;;;;;;;;;;;744:119:222;-1:-1:-1;;;;;804:18:222;;800:58;;831:27;;-1:-1:-1;;;831:27:222;;;;;;;;;;;800:58;744:119;:::o;-1:-1:-1:-;;;;;;;;:::o;:::-;;;;;;;;:::o;476:180:375:-;535:6;588:2;576:9;567:7;563:23;559:32;556:52;;;604:1;601;594:12;556:52;-1:-1:-1;627:23:375;;476:180;-1:-1:-1;476:180:375:o;978:127::-;1039:10;1034:3;1030:20;1027:1;1020:31;1070:4;1067:1;1060:15;1094:4;1091:1;1084:15;1110:253;1182:2;1176:9;1224:4;1212:17;;-1:-1:-1;;;;;1244:34:375;;1280:22;;;1241:62;1238:88;;;1306:18;;:::i;:::-;1342:2;1335:22;1110:253;:::o;1368:::-;1440:2;1434:9;1482:4;1470:17;;-1:-1:-1;;;;;1502:34:375;;1538:22;;;1499:62;1496:88;;;1564:18;;:::i;1626:257::-;1698:4;1692:11;;;1730:17;;-1:-1:-1;;;;;1762:34:375;;1798:22;;;1759:62;1756:88;;;1824:18;;:::i;1888:255::-;1960:2;1954:9;2002:6;1990:19;;-1:-1:-1;;;;;2024:34:375;;2060:22;;;2021:62;2018:88;;;2086:18;;:::i;2148:275::-;2219:2;2213:9;2284:2;2265:13;;-1:-1:-1;;2261:27:375;2249:40;;-1:-1:-1;;;;;2304:34:375;;2340:22;;;2301:62;2298:88;;;2366:18;;:::i;:::-;2402:2;2395:22;2148:275;;-1:-1:-1;2148:275:375:o;2428:531::-;2471:5;2524:3;2517:4;2509:6;2505:17;2501:27;2491:55;;2542:1;2539;2532:12;2491:55;2578:6;2565:20;-1:-1:-1;;;;;2600:2:375;2597:26;2594:52;;;2626:18;;:::i;:::-;2670:55;2713:2;2694:13;;-1:-1:-1;;2690:27:375;2719:4;2686:38;2670:55;:::i;:::-;2750:2;2741:7;2734:19;2796:3;2789:4;2784:2;2776:6;2772:15;2768:26;2765:35;2762:55;;;2813:1;2810;2803:12;2762:55;2878:2;2871:4;2863:6;2859:17;2852:4;2843:7;2839:18;2826:55;2926:1;2901:16;;;2919:4;2897:27;2890:38;;;;2905:7;2428:531;-1:-1:-1;;;2428:531:375:o;2964:171::-;3031:20;;-1:-1:-1;;;;;3080:30:375;;3070:41;;3060:69;;3125:1;3122;3115:12;3140:131;-1:-1:-1;;;;;3215:31:375;;3205:42;;3195:70;;3261:1;3258;3251:12;3276:134;3344:20;;3373:31;3344:20;3373:31;:::i;3415:183::-;3475:4;-1:-1:-1;;;;;3500:6:375;3497:30;3494:56;;;3530:18;;:::i;:::-;-1:-1:-1;3575:1:375;3571:14;3587:4;3567:25;;3415:183::o;3603:120::-;3697:1;3690:5;3687:12;3677:40;;3713:1;3710;3703:12;3728:156;3794:20;;3854:4;3843:16;;3833:27;;3823:55;;3874:1;3871;3864:12;3889:1366;3957:5;4010:3;4003:4;3995:6;3991:17;3987:27;3977:55;;4028:1;4025;4018:12;3977:55;4064:6;4051:20;4090:4;4114:60;4130:43;4170:2;4130:43;:::i;:::-;4114:60;:::i;:::-;4208:15;;;4294:1;4290:10;;;;4278:23;;4274:32;;;4239:12;;;;4318:15;;;4315:35;;;4346:1;4343;4336:12;4315:35;4382:2;4374:6;4370:15;4394:832;4410:6;4405:3;4402:15;4394:832;;;4488:4;4482:3;4477;4473:13;4469:24;4466:114;;;4534:1;4563:2;4559;4552:14;4466:114;4606:22;;:::i;:::-;4669:3;4656:17;4708:1;4699:7;4696:14;4686:112;;4752:1;4781:2;4777;4770:14;4686:112;4811:22;;4882:12;;;4869:26;4853:14;;;4846:50;4919:2;4962:12;;;4949:26;4988:33;4949:26;4988:33;:::i;:::-;5041:14;;;5034:31;5088:2;5139:12;;;5126:26;5110:14;;;5103:50;5166:18;;5204:12;;;;4436:4;4427:14;4394:832;;;-1:-1:-1;5244:5:375;3889:1366;-1:-1:-1;;;;;;3889:1366:375:o;5260:1169::-;5330:5;5383:3;5376:4;5368:6;5364:17;5360:27;5350:55;;5401:1;5398;5391:12;5350:55;5437:6;5424:20;5463:4;5487:60;5503:43;5543:2;5503:43;:::i;5487:60::-;5581:15;;;5643:4;5686:13;;;5674:26;;5670:35;;;5612:12;;;;5569:3;5717:15;;;5714:35;;;5745:1;5742;5735:12;5714:35;5781:2;5773:6;5769:15;5793:607;5809:6;5804:3;5801:15;5793:607;;;5885:2;5879:3;5874;5870:13;5866:22;5863:112;;;5929:1;5958:2;5954;5947:14;5863:112;6001:22;;:::i;:::-;6064:3;6051:17;6081:52;6125:7;6081:52;:::i;:::-;6146:22;;6204:30;6221:12;;;6204:30;:::i;:::-;6199:2;6192:5;6188:14;6181:54;6258:2;6296:30;6322:2;6317:3;6313:12;6296:30;:::i;:::-;6280:14;;;6273:54;6340:18;;6378:12;;;;5826;;5793:607;;;-1:-1:-1;6418:5:375;;5260:1169;-1:-1:-1;;;;;;;5260:1169:375:o;6434:1726::-;6489:5;6537:4;6525:9;6520:3;6516:19;6512:30;6509:50;;;6555:1;6552;6545:12;6509:50;6577:22;;:::i;:::-;6568:31;;6635:9;6622:23;-1:-1:-1;;;;;6705:2:375;6697:6;6694:14;6691:34;;;6721:1;6718;6711:12;6691:34;6759:6;6748:9;6744:22;6734:32;;6804:3;6797:4;6793:2;6789:13;6785:23;6775:51;;6822:1;6819;6812:12;6775:51;6858:2;6845:16;6880:4;6904:60;6920:43;6960:2;6920:43;:::i;6904:60::-;6998:15;;;7080:1;7076:10;;;;7068:19;;7064:28;;;7029:12;;;;7104:15;;;7101:35;;;7132:1;7129;7122:12;7101:35;7156:11;;;;7176:527;7192:6;7187:3;7184:15;7176:527;;;7270:4;7264:3;7259;7255:13;7251:24;7248:114;;;7316:1;7345:2;7341;7334:14;7248:114;7390:22;;:::i;:::-;7453:3;7440:17;7470:52;7514:7;7470:52;:::i;:::-;7535:24;;7597:30;7614:12;;;7597:30;:::i;:::-;7579:16;;;7572:56;7641:20;;7218:4;7209:14;;;;;7681:12;;;;7176:527;;;7712:20;;-1:-1:-1;7770:18:375;;;7757:32;;-1:-1:-1;7801:16:375;;;7798:36;;;7830:1;7827;7820:12;7798:36;7866:73;7935:3;7924:8;7913:9;7909:24;7866:73;:::i;:::-;7850:14;;;7843:97;-1:-1:-1;7993:4:375;7978:20;;7965:34;;-1:-1:-1;8011:16:375;;;8008:36;;;8040:1;8037;8030:12;8008:36;;8078:75;8149:3;8138:8;8127:9;8123:24;8078:75;:::i;:::-;8071:4;8064:5;8060:16;8053:101;;6434:1726;;;;:::o;8165:1373::-;8234:5;8282:4;8270:9;8265:3;8261:19;8257:30;8254:50;;;8300:1;8297;8290:12;8254:50;8322:22;;:::i;:::-;8313:31;;8381:9;8368:23;8436:7;8429:15;8422:23;8413:7;8410:36;8400:64;;8460:1;8457;8450:12;8400:64;8473:22;;8514:2;8552:18;;;8539:32;-1:-1:-1;;;;;8620:14:375;;;8617:34;;;8647:1;8644;8637:12;8617:34;8685:6;8674:9;8670:22;8660:32;;8730:3;8723:4;8719:2;8715:13;8711:23;8701:51;;8748:1;8745;8738:12;8701:51;8784:2;8771:16;8807:60;8823:43;8863:2;8823:43;:::i;8807:60::-;8901:15;;;8983:1;8979:10;;;;8971:19;;8967:28;;;8932:12;;;;9007:15;;;9004:35;;;9035:1;9032;9025:12;9004:35;9059:11;;;;9079:223;9095:6;9090:3;9087:15;9079:223;;;9177:3;9164:17;9194:33;9219:7;9194:33;:::i;:::-;9240:20;;9112:12;;;;9280;;;;9079:223;;;9334:5;9329:2;9322:5;9318:14;9311:29;;;;9393:2;9382:9;9378:18;9365:32;9349:48;;9422:2;9412:8;9409:16;9406:36;;;9438:1;9435;9428:12;9406:36;;;9474:57;9527:3;9516:8;9505:9;9501:24;9474:57;:::i;9543:888::-;9596:5;9649:3;9642:4;9634:6;9630:17;9626:27;9616:55;;9667:1;9664;9657:12;9616:55;9703:6;9690:20;9729:4;9753:60;9769:43;9809:2;9769:43;:::i;9753:60::-;9847:15;;;9933:1;9929:10;;;;9917:23;;9913:32;;;9878:12;;;;9957:15;;;9954:35;;;9985:1;9982;9975:12;9954:35;10021:2;10013:6;10009:15;10033:369;10049:6;10044:3;10041:15;10033:369;;;10135:3;10122:17;-1:-1:-1;;;;;10158:11:375;10155:35;10152:125;;;10231:1;10260:2;10256;10249:14;10152:125;10302:57;10355:3;10350:2;10336:11;10328:6;10324:24;10320:33;10302:57;:::i;:::-;10290:70;;-1:-1:-1;10380:12:375;;;;10066;;10033:369;;10436:1671;10493:5;10541:4;10529:9;10524:3;10520:19;10516:30;10513:50;;;10559:1;10556;10549:12;10513:50;10581:22;;:::i;:::-;10572:31;;10639:9;10626:23;-1:-1:-1;;;;;10709:2:375;10701:6;10698:14;10695:34;;;10725:1;10722;10715:12;10695:34;10748:22;;;;10800:6;10786:12;;;10782:25;10779:45;;;10820:1;10817;10810:12;10779:45;10848:22;;:::i;:::-;10908:2;10895:16;10936:2;10926:8;10923:16;10920:36;;;10952:1;10949;10942:12;10920:36;10981:41;11018:3;11007:8;11003:2;10999:17;10981:41;:::i;:::-;10972:7;10965:58;;11069:2;11065;11061:11;11048:25;11098:2;11088:8;11085:16;11082:36;;;11114:1;11111;11104:12;11082:36;11152:41;11189:3;11178:8;11174:2;11170:17;11152:41;:::i;:::-;11147:2;11138:7;11134:16;11127:67;;11249:2;11245;11241:11;11228:25;11223:2;11214:7;11210:16;11203:51;11311:4;11307:2;11303:13;11290:27;11283:4;11274:7;11270:18;11263:55;11353:31;11379:3;11375:2;11371:12;11353:31;:::i;:::-;11347:3;11338:7;11334:17;11327:58;11420:32;11447:3;11443:2;11439:12;11420:32;:::i;:::-;11414:3;11405:7;11401:17;11394:59;11488:32;11515:3;11511:2;11507:12;11488:32;:::i;:::-;11482:3;11473:7;11469:17;11462:59;11577:3;11573:2;11569:12;11556:26;11550:3;11541:7;11537:17;11530:53;11602:3;11639:31;11666:2;11662;11658:11;11639:31;:::i;:::-;11621:16;;;11614:57;11680:22;;11755:2;11740:18;;11727:32;;-1:-1:-1;11771:16:375;;;11768:36;;;11800:1;11797;11790:12;11768:36;11836:71;11903:3;11892:8;11881:9;11877:24;11836:71;:::i;:::-;11831:2;11824:5;11820:14;11813:95;11961:2;11950:9;11946:18;11933:32;11917:48;;11990:2;11980:8;11977:16;11974:36;;;12006:1;12003;11996:12;11974:36;;12042:58;12096:3;12085:8;12074:9;12070:24;12042:58;:::i;12112:543::-;12170:5;12218:4;12206:9;12201:3;12197:19;12193:30;12190:50;;;12236:1;12233;12226:12;12190:50;12269:2;12263:9;12311:4;12303:6;12299:17;-1:-1:-1;;;;;12403:6:375;12391:10;12388:22;12383:2;12371:10;12368:18;12365:46;12362:72;;;12414:18;;:::i;:::-;12454:10;12450:2;12443:22;12483:6;12474:15;;12525:9;12512:23;12498:37;;12558:2;12550:6;12547:14;12544:34;;;12574:1;12571;12564:12;12544:34;;12602:46;12644:3;12635:6;12624:9;12620:22;12602:46;:::i;:::-;12594:6;12587:62;;;12112:543;;;;:::o;12660:1154::-;12747:6;12800:2;12788:9;12779:7;12775:23;12771:32;12768:52;;;12816:1;12813;12806:12;12768:52;12856:9;12843:23;-1:-1:-1;;;;;12926:2:375;12918:6;12915:14;12912:34;;;12942:1;12939;12932:12;12912:34;12965:22;;;;13021:4;13003:16;;;12999:27;12996:47;;;13039:1;13036;13029:12;12996:47;13065:22;;:::i;:::-;13125:2;13112:16;13153:2;13143:8;13140:16;13137:36;;;13169:1;13166;13159:12;13137:36;13196:45;13233:7;13222:8;13218:2;13214:17;13196:45;:::i;:::-;13189:5;13182:60;;13288:2;13284;13280:11;13267:25;13317:2;13307:8;13304:16;13301:36;;;13333:1;13330;13323:12;13301:36;13369:45;13406:7;13395:8;13391:2;13387:17;13369:45;:::i;:::-;13364:2;13357:5;13353:14;13346:69;;13461:2;13457;13453:11;13440:25;13490:2;13480:8;13477:16;13474:36;;;13506:1;13503;13496:12;13474:36;13542:56;13590:7;13579:8;13575:2;13571:17;13542:56;:::i;:::-;13537:2;13530:5;13526:14;13519:80;;13645:2;13641;13637:11;13624:25;13674:2;13664:8;13661:16;13658:36;;;13690:1;13687;13680:12;13658:36;13726:57;13775:7;13764:8;13760:2;13756:17;13726:57;:::i;:::-;13721:2;13710:14;;13703:81;-1:-1:-1;13714:5:375;12660:1154;-1:-1:-1;;;;;12660:1154:375:o;13819:602::-;13969:6;13977;13985;14038:2;14026:9;14017:7;14013:23;14009:32;14006:52;;;14054:1;14051;14044:12;14006:52;14093:9;14080:23;14112:31;14137:5;14112:31;:::i;:::-;14162:5;-1:-1:-1;14219:2:375;14204:18;;14191:32;14232:33;14191:32;14232:33;:::i;:::-;14284:7;-1:-1:-1;14343:2:375;14328:18;;14315:32;14356:33;14315:32;14356:33;:::i;:::-;14408:7;14398:17;;;13819:602;;;;;:::o;14426:247::-;14485:6;14538:2;14526:9;14517:7;14513:23;14509:32;14506:52;;;14554:1;14551;14544:12;14506:52;14593:9;14580:23;14612:31;14637:5;14612:31;:::i;:::-;14662:5;14426:247;-1:-1:-1;;;14426:247:375:o;14860:184::-;14930:6;14983:2;14971:9;14962:7;14958:23;14954:32;14951:52;;;14999:1;14996;14989:12;14951:52;-1:-1:-1;15022:16:375;;14860:184;-1:-1:-1;14860:184:375:o;15049:232::-;15088:3;15109:17;;;15106:140;;15168:10;15163:3;15159:20;15156:1;15149:31;15203:4;15200:1;15193:15;15231:4;15228:1;15221:15;15106:140;-1:-1:-1;15273:1:375;15262:13;;15049:232::o;15286:250::-;15371:1;15381:113;15395:6;15392:1;15389:13;15381:113;;;15471:11;;;15465:18;15452:11;;;15445:39;15417:2;15410:10;15381:113;;;-1:-1:-1;;15528:1:375;15510:16;;15503:27;15286:250::o;15541:271::-;15583:3;15621:5;15615:12;15648:6;15643:3;15636:19;15664:76;15733:6;15726:4;15721:3;15717:14;15710:4;15703:5;15699:16;15664:76;:::i;:::-;15794:2;15773:15;-1:-1:-1;;15769:29:375;15760:39;;;;15801:4;15756:50;;15541:271;-1:-1:-1;;15541:271:375:o;15817:480::-;16042:2;16031:9;16024:21;16005:4;16068:45;16109:2;16098:9;16094:18;16086:6;16068:45;:::i;:::-;16161:9;16153:6;16149:22;16144:2;16133:9;16129:18;16122:50;16189:33;16215:6;16207;16189:33;:::i;:::-;16181:41;;;16287:1;16283;16278:3;16274:11;16270:19;16262:6;16258:32;16253:2;16242:9;16238:18;16231:60;15817:480;;;;;;:::o;16302:127::-;16363:10;16358:3;16354:20;16351:1;16344:31;16394:4;16391:1;16384:15;16418:4;16415:1;16408:15;16434:658;16605:2;16657:21;;;16727:13;;16630:18;;;16749:22;;;16576:4;;16605:2;16828:15;;;;16802:2;16787:18;;;16576:4;16871:195;16885:6;16882:1;16879:13;16871:195;;;16950:13;;-1:-1:-1;;;;;16946:39:375;16934:52;;17041:15;;;;17006:12;;;;16982:1;16900:9;16871:195;;;-1:-1:-1;17083:3:375;;16434:658;-1:-1:-1;;;;;;16434:658:375:o;17477:337::-;-1:-1:-1;;;;;17674:32:375;;17656:51;;17743:2;17738;17723:18;;17716:30;;;-1:-1:-1;;17763:45:375;;17789:18;;17781:6;17763:45;:::i;17819:492::-;17994:3;18032:6;18026:13;18048:66;18107:6;18102:3;18095:4;18087:6;18083:17;18048:66;:::i;:::-;18177:13;;18136:16;;;;18199:70;18177:13;18136:16;18246:4;18234:17;;18199:70;:::i;:::-;18285:20;;17819:492;-1:-1:-1;;;;17819:492:375:o;18316:287::-;18441:1;18437;18432:3;18428:11;18424:19;18416:5;18410:12;18406:38;18401:3;18394:51;18376:3;18491:4;18484:5;18480:16;18474:23;18529:4;18522;18517:3;18513:14;18506:28;18550:47;18591:4;18586:3;18582:14;18568:12;18550:47;:::i;18608:1690::-;19005:2;18994:9;18987:21;18968:4;19031:45;19072:2;19061:9;19057:18;19049:6;19031:45;:::i;:::-;19095:2;19145:9;19137:6;19133:22;19128:2;19117:9;19113:18;19106:50;19176:6;19211;19205:13;19242:6;19234;19227:22;19277:2;19269:6;19265:15;19258:22;;19336:2;19326:6;19323:1;19319:14;19311:6;19307:27;19303:36;19374:2;19366:6;19362:15;19395:1;19405:252;19419:6;19416:1;19413:13;19405:252;;;19509:2;19505:7;19496:6;19488;19484:19;19480:33;19475:3;19468:46;19537:40;19570:6;19561;19555:13;19537:40;:::i;:::-;19635:12;;;;19527:50;-1:-1:-1;19600:15:375;;;;19441:1;19434:9;19405:252;;;-1:-1:-1;;19693:22:375;;;19688:2;19673:18;;19666:50;19769:13;;19791:24;;;19833:15;;;;-1:-1:-1;19769:13:375;-1:-1:-1;19891:1:375;19887:16;;;19875:29;;19871:38;;;-1:-1:-1;19934:15:375;;;19969:1;19979:290;19995:8;19990:3;19987:17;19979:290;;;20093:2;20089:7;20080:6;20072;20068:19;20064:33;20057:5;20050:48;20121:60;20174:6;20163:8;20157:15;20121:60;:::i;:::-;20245:14;;;;20111:70;-1:-1:-1;20206:17:375;;;;20023:1;20014:11;19979:290;;;-1:-1:-1;20286:6:375;;18608:1690;-1:-1:-1;;;;;;;;;;18608:1690:375:o;20303:361::-;20532:6;20521:9;20514:25;20575:2;20570;20559:9;20555:18;20548:30;20495:4;20595:63;20654:2;20643:9;20639:18;20631:6;20595:63;:::i;20669:127::-;20730:10;20725:3;20721:20;20718:1;20711:31;20761:4;20758:1;20751:15;20785:4;20782:1;20775:15;20801:126;20895:1;20888:5;20885:12;20875:46;;20901:18;;:::i;20932:807::-;20999:3;21037:5;21031:12;21064:6;21059:3;21052:19;21090:4;21119;21114:3;21110:14;21103:21;;21158:4;21151:5;21147:16;21181:1;21191:523;21205:6;21202:1;21199:13;21191:523;;;21270:6;21264:13;21306:2;21300:9;21339:1;21335:2;21332:9;21322:43;;21345:18;;:::i;:::-;21378:15;;21433:11;;;21427:18;21413:12;;;21406:40;21469:4;21517:11;;;21511:18;-1:-1:-1;;;;;21507:44:375;21493:12;;;21486:66;21575:4;21619:11;;;21613:18;21599:12;;;21592:40;21661:4;21652:14;;;;21689:15;;;;21548:1;21220:9;21191:523;;;-1:-1:-1;21730:3:375;;20932:807;-1:-1:-1;;;;;20932:807:375:o;21744:797::-;21813:3;21851:5;21845:12;21878:6;21873:3;21866:19;21904:4;21933;21928:3;21924:14;21917:21;;21972:4;21965:5;21961:16;21995:1;22005:511;22019:6;22016:1;22013:13;22005:511;;;22084:6;22078:13;22120:2;22114:9;22136:47;22180:2;22136:47;:::i;:::-;22196:15;;22250:11;;;22244:18;22285:4;22323:21;;;22309:12;;;22302:43;22368:4;22416:11;;;22410:18;22406:27;22392:12;;;22385:49;22463:4;22454:14;;;;22491:15;;;;22041:1;22034:9;22005:511;;22546:1338;22721:2;22732:21;;;22824:13;;22873:4;22853:18;;;22846:32;22927:19;;22791:3;22776:19;;22955:22;;;22692:4;;22721:2;23035:21;;;22692:4;;23008:3;22993:19;;;23084:352;23098:6;23095:1;23092:13;23084:352;;;23163:6;23157:13;23199:2;23193:9;23215:47;23259:2;23215:47;:::i;:::-;23275:15;;23334:11;;23328:18;23348:4;23324:29;23310:12;;;23303:51;23411:15;;;;23120:1;23113:9;;;;;23383:4;23374:14;;;;23084:352;;;23088:3;23485:2;23477:6;23473:15;23467:22;23445:44;;23512:2;23508:7;23498:17;;23578:2;23566:9;23561:3;23557:19;23553:28;23546:4;23535:9;23531:20;23524:58;23605:63;23664:3;23648:14;23605:63;:::i;:::-;23591:77;;;;23717:4;23709:6;23705:17;23699:24;23789:2;23777:9;23769:6;23765:22;23761:31;23754:4;23743:9;23739:20;23732:61;23810:68;23871:6;23855:14;23810:68;:::i;:::-;23802:76;22546:1338;-1:-1:-1;;;;;;22546:1338:375:o;24196:297::-;24314:12;;24361:4;24350:16;;;24344:23;;24314:12;24379:16;;24376:111;;;24473:1;24469:6;24459;24453:4;24449:17;24446:1;24442:25;24438:38;24431:5;24427:50;24418:59;;24376:111;;24196:297;;;:::o;24498:834::-;24753:6;24742:9;24735:25;24716:4;24779:2;24817;24812;24801:9;24797:18;24790:30;24843:45;24884:2;24873:9;24869:18;24861:6;24843:45;:::i;:::-;24924:22;;;24919:2;24904:18;;24897:50;24996:13;;25018:22;;;25068:2;25094:15;;;;25056;;25127:1;25137:169;25151:6;25148:1;25145:13;25137:169;;;25212:13;;25200:26;;25281:15;;;;25246:12;;;;25173:1;25166:9;25137:169;;;-1:-1:-1;25323:3:375;;24498:834;-1:-1:-1;;;;;;;;24498:834:375:o;25794:1849::-;26152:4;26198:1;26194;26189:3;26185:11;26181:19;26239:2;26231:6;26227:15;26216:9;26209:34;26307:10;26302:3;26298:20;26289:6;26283:13;26279:40;26274:2;26263:9;26259:18;26252:68;26384:2;26378;26370:6;26366:15;26360:22;26356:31;26351:2;26340:9;26336:18;26329:59;26443:2;26434:6;26428:13;26424:22;26419:2;26408:9;26404:18;26397:50;;26502:2;26494:6;26490:15;26484:22;26478:3;26467:9;26463:19;26456:51;26544:3;26538;26527:9;26523:19;26516:32;26583:6;26577:13;26609:6;26652:2;26646:3;26635:9;26631:19;26624:31;26678:52;26725:3;26714:9;26710:19;26696:12;26678:52;:::i;:::-;26664:66;;26779:2;26771:6;26767:15;26761:22;26852:3;26848:8;26836:9;26828:6;26824:22;26820:37;26814:3;26803:9;26799:19;26792:66;26881:41;26915:6;26899:14;26881:41;:::i;:::-;26867:55;;;26959:2;26951:6;26947:15;26941:22;26982:3;27021:2;27016;27005:9;27001:18;26994:30;27078:2;27070:6;27066:15;27060:22;27055:2;27044:9;27040:18;27033:50;27132:3;27124:6;27120:16;27114:23;27092:45;;27146:54;27195:3;27184:9;27180:19;27164:14;-1:-1:-1;;;;;25752:30:375;25740:43;;25687:102;27146:54;27249:3;27237:16;;27231:23;-1:-1:-1;;;;;727:31:375;;;27313:3;27298:19;;715:44;27367:3;27355:16;;27349:23;727:31;;27431:3;27416:19;;715:44;27491:3;27479:16;;27473:23;27467:3;27452:19;;27445:52;27534:15;;;27528:22;727:31;;;27609:3;27594:19;;715:44;27528:22;-1:-1:-1;27559:55:375;;-1:-1:-1;661:104:375","linkReferences":{}},"methodIdentifiers":{"__Architect_init(address,address,address)":"dc1b9f23","createSpace((string,string,((string,string,uint256,uint256,uint64,address,address,uint256,address),(bool,address[],((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])),string[]),(string)))":"7d8c4522","getSpaceArchitectImplementations()":"545efb2d","getSpaceByTokenId(uint256)":"673f0dd5","getTokenIdBySpace(address)":"c0bc6796","setSpaceArchitectImplementations(address,address,address)":"8bfc94b9"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"Architect__InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Architect__InvalidNetworkId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Architect__InvalidStringLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Architect__NotContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Factory__FailedDeployment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__Paused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuard__ReentrantCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Validator__InvalidAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"space\",\"type\":\"address\"}],\"name\":\"SpaceCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"contract ISpaceOwner\",\"name\":\"ownerImplementation\",\"type\":\"address\"},{\"internalType\":\"contract IUserEntitlement\",\"name\":\"userEntitlementImplementation\",\"type\":\"address\"},{\"internalType\":\"contract IRuleEntitlement\",\"name\":\"ruleEntitlementImplementation\",\"type\":\"address\"}],\"name\":\"__Architect_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"},{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"duration\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"currency\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeRecipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"freeAllocation\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"pricingModule\",\"type\":\"address\"}],\"internalType\":\"struct IMembershipBase.Membership\",\"name\":\"settings\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"everyone\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"users\",\"type\":\"address[]\"},{\"components\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CombinedOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.Operation[]\",\"name\":\"operations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CheckOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"internalType\":\"struct IRuleEntitlement.CheckOperation[]\",\"name\":\"checkOperations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.LogicalOperationType\",\"name\":\"logOpType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"leftOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"rightOperationIndex\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.LogicalOperation[]\",\"name\":\"logicalOperations\",\"type\":\"tuple[]\"}],\"internalType\":\"struct IRuleEntitlement.RuleData\",\"name\":\"ruleData\",\"type\":\"tuple\"}],\"internalType\":\"struct IArchitectBase.MembershipRequirements\",\"name\":\"requirements\",\"type\":\"tuple\"},{\"internalType\":\"string[]\",\"name\":\"permissions\",\"type\":\"string[]\"}],\"internalType\":\"struct IArchitectBase.Membership\",\"name\":\"membership\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"internalType\":\"struct IArchitectBase.ChannelInfo\",\"name\":\"channel\",\"type\":\"tuple\"}],\"internalType\":\"struct IArchitectBase.SpaceInfo\",\"name\":\"spaceInfo\",\"type\":\"tuple\"}],\"name\":\"createSpace\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSpaceArchitectImplementations\",\"outputs\":[{\"internalType\":\"contract ISpaceOwner\",\"name\":\"spaceToken\",\"type\":\"address\"},{\"internalType\":\"contract IUserEntitlement\",\"name\":\"userEntitlementImplementation\",\"type\":\"address\"},{\"internalType\":\"contract IRuleEntitlement\",\"name\":\"ruleEntitlementImplementation\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getSpaceByTokenId\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"space\",\"type\":\"address\"}],\"name\":\"getTokenIdBySpace\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ISpaceOwner\",\"name\":\"spaceToken\",\"type\":\"address\"},{\"internalType\":\"contract IUserEntitlement\",\"name\":\"userEntitlementImplementation\",\"type\":\"address\"},{\"internalType\":\"contract IRuleEntitlement\",\"name\":\"ruleEntitlementImplementation\",\"type\":\"address\"}],\"name\":\"setSpaceArchitectImplementations\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/factory/facets/architect/Architect.sol\":\"Architect\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/base/registry/facets/checker/IEntitlementChecker.sol\":{\"keccak256\":\"0x5c9a99c94e95a0c89b3d3310e252cd98aeafe34d87ffc0058f9b001af6f28bd1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7983b17a371e76c8681756dc10abe26f8fffd35d3d6d8773c2023f06c8600ba3\",\"dweb:/ipfs/QmSDkTctKCTaMGYF2LZ1N9YWwDTZD75XegpPyLrP694JFf\"]},\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/OwnableBase.sol\":{\"keccak256\":\"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4\",\"dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa\"]},\"contracts/src/diamond/facets/ownable/OwnableStorage.sol\":{\"keccak256\":\"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105\",\"dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ\"]},\"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol\":{\"keccak256\":\"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f\",\"dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol\":{\"keccak256\":\"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5\",\"dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol\":{\"keccak256\":\"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc\",\"dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf\"]},\"contracts/src/diamond/facets/pausable/IPausable.sol\":{\"keccak256\":\"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6\",\"dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM\"]},\"contracts/src/diamond/facets/pausable/PausableBase.sol\":{\"keccak256\":\"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c\",\"dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1\"]},\"contracts/src/diamond/facets/pausable/PausableStorage.sol\":{\"keccak256\":\"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b\",\"dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL\"]},\"contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol\":{\"keccak256\":\"0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b\",\"dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq\"]},\"contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol\":{\"keccak256\":\"0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c\",\"dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T\"]},\"contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol\":{\"keccak256\":\"0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6\",\"dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC\"]},\"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol\":{\"keccak256\":\"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f\",\"dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol\":{\"keccak256\":\"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa\",\"dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol\":{\"keccak256\":\"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c\",\"dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu\"]},\"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol\":{\"keccak256\":\"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e\",\"dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM\"]},\"contracts/src/diamond/proxy/IProxy.sol\":{\"keccak256\":\"0xb3cc38cae21021aec88e128eaec4994e926e4961d166c7e6e3a40a41c69aa105\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6da721f34f1359068ebe71ce01472403940b4e8fe87c38ff5be2d77e673520e5\",\"dweb:/ipfs/QmfNgDv5eQsLzc9bKi1EGWdxDX84Vhr2SARa7zm4pcCdpy\"]},\"contracts/src/diamond/proxy/Proxy.sol\":{\"keccak256\":\"0xae6d6933073274683d2684fc806cffbdc157d56b181d7ea0c962c3cd7746b78d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://43378c060da21e547d10282839ff3dc690615c8993949f6a072f9ed4693ba548\",\"dweb:/ipfs/QmaT7GdtDpNBRJPLRnGEoGmZJSFNPkqHUzPde5LSYXc1q1\"]},\"contracts/src/diamond/proxy/managed/IManagedProxy.sol\":{\"keccak256\":\"0x50761de44dd190dd8e5b01080c073c1190fa393406c12621ecb51f7bf6131929\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://afccbdf66bb1bda60a91c481f0770b4409841efd2e7198693b025e2ed06f66d5\",\"dweb:/ipfs/QmTvoHQAv5LvyT5UVqrsgSaS7QpywxAVZMxNRevuSeLo7p\"]},\"contracts/src/diamond/proxy/managed/ManagedProxyBase.sol\":{\"keccak256\":\"0x709b83c1c463f07fea33d7b315087e35087be1ebce59a9659bad36cb25b68f2a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a258b4cb33c4595b31216316b3b0a37364dabbc1bcd076de8efb1433850d38bf\",\"dweb:/ipfs/QmR54ko5NH1p1WdfUSVaRhJtTtnGcBPndS7xTJ1MbQ398v\"]},\"contracts/src/diamond/proxy/managed/ManagedProxyStorage.sol\":{\"keccak256\":\"0x3b9124d97b9f84a56a37c8e1cafb741756b11e76c7b98fab034c009fa990a761\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2958827286beb633f06ac9f2eeebec7fdbf612da520cca93646f1f02e24048fa\",\"dweb:/ipfs/QmaUHopT1SWHsZQEy7J5CH2ZmpwY7xh4ujfNW8mPUYAuFY\"]},\"contracts/src/diamond/proxy/manager/IProxyManager.sol\":{\"keccak256\":\"0xde8f6048e58e36541aebff781fb013334e8ea2fa824d9790e629d3733944929a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c79d9ac525a370f6f56b229506cf2d2ffeacafbeb02d417ed34c86c75fe01650\",\"dweb:/ipfs/QmT9CReyEvK2UkcwnzwierQdWw2T7NVZPtVDLcwhyNBhSC\"]},\"contracts/src/diamond/utils/multicall/IMulticall.sol\":{\"keccak256\":\"0x0f1a1884b290dc829323fa6d01e0dedc785ff582e9dbffd52e44e6f2fc7beff6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1ce824d7f2b31f53a807bf6d6d7e9d0eaaf2d81b75fa316cda616e29cb4669a9\",\"dweb:/ipfs/QmWyiRtGKtX6Kfng8Az2ujKDZdqjnfwxMuD1rQEZz6aki5\"]},\"contracts/src/diamond/utils/multicall/Multicall.sol\":{\"keccak256\":\"0x52c952ab050b3eb1dbb3c9cbaad900eaf83ba2ce42a47f204f9aa9e460126701\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://442e5db41748e2a5b7c028b55ad6a680960c1819c3b576a162edea85f623aa44\",\"dweb:/ipfs/Qmb3mNdPBLFh6wgj8ih2EXs8rTcTniKpxk8eZHiY1ahaud\"]},\"contracts/src/factory/facets/architect/Architect.sol\":{\"keccak256\":\"0xcaed43dc30dbfe658129da749a082195539cf8c5d6c221b198e324c613ee49b7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6f703d4315ab0c9217fc8a3b387be8ef812fafac75111fe48fbc8d005778f119\",\"dweb:/ipfs/QmdGLpqs5oLnVN4en8Z8exNdjh3NTaMUV4S7YrjzukgSmD\"]},\"contracts/src/factory/facets/architect/ArchitectBase.sol\":{\"keccak256\":\"0x6513727490f0258589a8c0060041c099392f286e86fe26d632006992fc24b408\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://24f5c44f47d880b23d25b4ae76e6b6488d284123f3a8f530bd674d42c774542f\",\"dweb:/ipfs/QmaCnjKQMUGiQ1UwCwCuBWsxYVx4UuJe3i3gc8qtLKCcfR\"]},\"contracts/src/factory/facets/architect/ArchitectStorage.sol\":{\"keccak256\":\"0x6a11f25a21155e73624631305407602e8ac0e1f11c53936ffaab820263f51d1e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3c88b9f38fba7ca69b355fdce609e898857c2bfc69ca62365138bbda9aa6b74b\",\"dweb:/ipfs/QmVfoXqJ1WDnxtRzKiynzkduXbizL4H9WVVDFDVNH7aNxq\"]},\"contracts/src/factory/facets/architect/IArchitect.sol\":{\"keccak256\":\"0x08eec3f16ce7bf98d68cefb0bd103329616dc260d9c34e5a8e0de68bcd8fb2fe\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c6e9607219790d046c451e58e84f2794d0f461521de05569aa5e74c5a61a79b8\",\"dweb:/ipfs/QmamxpUEceWUMKc8i2d2q7fnLdDM1611yPMX6QiQpbJDzz\"]},\"contracts/src/factory/facets/architect/ImplementationStorage.sol\":{\"keccak256\":\"0x7115f015df0678057d03a9bb6614c0c960c9c2334cec9919da3b1c73c65268e1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dcafc368c1a3f230851f981861bac731e9bdb2e48b78d7679978b3d2a4eaab85\",\"dweb:/ipfs/QmTJ72YsxYZHdGqkF4G6KsmH2GVGVad295xvbvdZ2Yq7s9\"]},\"contracts/src/factory/facets/architect/pricing/IPricingModules.sol\":{\"keccak256\":\"0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716\",\"dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU\"]},\"contracts/src/factory/facets/platform/requirements/IPlatformRequirements.sol\":{\"keccak256\":\"0xc0b22b0caa2336e0c3f6b6813432643053785c39531d30e5851eeb613a0a7991\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8a7ceb199e92f484efcc444fffd54fbabaf332c210dda0ef46d89a66f4cb47c7\",\"dweb:/ipfs/QmRJVrZiZpbGsLngz4J3NVgapKXLErdLc7BPyEyTNKdijg\"]},\"contracts/src/factory/facets/prepay/IPrepay.sol\":{\"keccak256\":\"0x0c5c097dd77471d041cdbb84011ac789147af937d275329d857d1a4b257635e9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://baca271a5a66856f3144a4bf0ed6a484b0c981539d6bf0c57ffade9e4986eb49\",\"dweb:/ipfs/QmVgPWMEL5q2J5kmZQZFRadWjuVQeFLaa9K2gCHdhjLUa9\"]},\"contracts/src/factory/facets/registry/IImplementationRegistry.sol\":{\"keccak256\":\"0x2409b9eb86a4dc5849050d06409fd7548ac21f9bf6e7419b91dfb9226db0a3d5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://613195fc78a1a496820c5934f315c586ad33edf7608022d2ae0ea44f52529e61\",\"dweb:/ipfs/QmR8Gn11UNq2rKC5Qp7Prdk61oWhNg3UVc8KeyWCRfrEqV\"]},\"contracts/src/factory/facets/wallet-link/IWalletLink.sol\":{\"keccak256\":\"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13\",\"dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR\"]},\"contracts/src/spaces/entitlements/IEntitlement.sol\":{\"keccak256\":\"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3\",\"dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf\"]},\"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol\":{\"keccak256\":\"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1\",\"dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97\"]},\"contracts/src/spaces/entitlements/user/IUserEntitlement.sol\":{\"keccak256\":\"0x96fef5ebaa7e9e79c77c887d9053ae06dc91cf1301f33db652e6ac811b3b5cc5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6cff649b95f65c9e3ecfa7dfa3b1c7b524ec7244eb5223c55674a4679eb8e7bf\",\"dweb:/ipfs/QmQy5sXRywRWB3aM58TCp5Xw5b258Y5PfDM8RasDznAPzA\"]},\"contracts/src/spaces/facets/Permissions.sol\":{\"keccak256\":\"0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721\",\"dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp\"]},\"contracts/src/spaces/facets/channels/IChannel.sol\":{\"keccak256\":\"0x4a62ec6410779121880a21ae1a42bab2480f672c683f79c7f2e11bf2bfe1bd6e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://61b4142a55418d8e15e4db77bf6614a830489dc6aa191afe3dadc9ef16534b2c\",\"dweb:/ipfs/Qmbuc8VBmoFrbWZGinbCQaCrBRw3DznYhZNLzqk2FXABUx\"]},\"contracts/src/spaces/facets/entitlements/IEntitlementsManager.sol\":{\"keccak256\":\"0x1c3cff6f7a35610df492abc39a62ba704e408d43477ba2e34833197c2956e9d3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c5d5f08c5bc196e6166678b39d415da12c285d9bee3584d5e200bbf0c5ea911d\",\"dweb:/ipfs/QmdYkU6kzHFw7KFYAdvxiwHK7hWCrz3E3pwiCjWZ97PVGx\"]},\"contracts/src/spaces/facets/gated/EntitlementGatedBase.sol\":{\"keccak256\":\"0x0aa9887cf58dd68d0270c85e2d7610080f35410b845c2227e4bd84356b7a2cb7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6dbdbed895fc2a53bffa3dbc1cfd4c992a096f153e6bbb7aeb9894485e7fc1a6\",\"dweb:/ipfs/QmZp76Gd8aL9pWbiTvLaiHv1w12yjN59PtYdMvoUCbfbH5\"]},\"contracts/src/spaces/facets/gated/EntitlementGatedStorage.sol\":{\"keccak256\":\"0xe997c0dd62f6ceb300729d3f56a3f25a47b40ed5946d68c5210c38941cb37eaa\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://63fcfd9f667538e8e9339534d2ddc6f7899e4179a54f3c6595e2598babb5bb9c\",\"dweb:/ipfs/QmUfKtfgW1uskEWkhhGqTjcbCqMANQoKKfTgV2ZvdAZpvJ\"]},\"contracts/src/spaces/facets/gated/IEntitlementGated.sol\":{\"keccak256\":\"0x948de1018f7f78366263a40e0f8269e10941216bd03a9996edb24a6230959e74\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://dc985539ce639f39fd68723acca6424a78deac6cec3693c9d8e1084a487c83ec\",\"dweb:/ipfs/QmQujX5rmDwhJZurp11FTiPLb7ev9swLTtdkagA8wydZiT\"]},\"contracts/src/spaces/facets/membership/IMembership.sol\":{\"keccak256\":\"0x233066dd470121818082ba6a4c868f90feafc3be29942aae2c7a5c25543b7485\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://30d976a1882102493e7cee87b75ab04c662626d71aca51c9334ed2f60402bb59\",\"dweb:/ipfs/QmerPfizrjueQSgG8SkSoi44fkyaqrN2ZCFTnaxnM3UqF7\"]},\"contracts/src/spaces/facets/membership/MembershipBase.sol\":{\"keccak256\":\"0x82b3314afcd1fe84a5261c38627c2537c09271372504af10549558c0fd608791\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dadc28ee124081ea64228b8a12e0fcc93c7256535597ea9e29d58140bb599fc5\",\"dweb:/ipfs/QmYNZjhBJnPf9kMt2J6pL2d746AB3EHrXVAj5Ce3ibZpBh\"]},\"contracts/src/spaces/facets/membership/MembershipStorage.sol\":{\"keccak256\":\"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee\",\"dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5\"]},\"contracts/src/spaces/facets/membership/pricing/IMembershipPricing.sol\":{\"keccak256\":\"0xb68faf2b90536ea53110ebb1d4456f2e9a261b5fac4515df47076da73e0cbd77\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://063fca54f8210be704b5d9f54efac08017266fafc9d287a6ece7866b25174448\",\"dweb:/ipfs/QmbXUgKgh36CmNRA5NrtRrVcgfrKYEzZprAcjTVWhHmXBF\"]},\"contracts/src/spaces/facets/membership/referral/IMembershipReferral.sol\":{\"keccak256\":\"0xeb2feee4b1f3e83509bc1425c0ecd60eaf168fa7686c14dc2bd636e5a691bc6a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ec9bcb8c4106639ec9e0d37fa59385c1e853fb07f9ebedcd9f2bc1198979a807\",\"dweb:/ipfs/QmcAdwQKn2jMo7grzXNGSPr9PvQBxdKURF6xxLPorCDrFt\"]},\"contracts/src/spaces/facets/membership/referral/MembershipReferralBase.sol\":{\"keccak256\":\"0x6f29e73b113fce75e54a41f248621b1adaa5ac4a3b189ef0903308bfa69165ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://abc7b25a74097434912f4940bfcd6cf9e312b0989279cb31a9a74d7ae6c09636\",\"dweb:/ipfs/QmPdttVeMBDBb8SMrga6YnKz3aiGDKMqo2MofCXtag4w4E\"]},\"contracts/src/spaces/facets/membership/referral/MembershipReferralStorage.sol\":{\"keccak256\":\"0x607aabf7ae45b7f112165c1028e0fa2d18b86c6db78f4df4bdf39dd0f20973ea\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4d61919ebf0ba0d3706cf2c3755b9d9920312c82bb1b83d0023f1cb09c2fc31d\",\"dweb:/ipfs/QmSQ1G7rRMf6tAuzdU6M5ydKetaSZXdN3UV33wNjvDrqAL\"]},\"contracts/src/spaces/facets/owner/ISpaceOwner.sol\":{\"keccak256\":\"0xf68eb1b3aceeacc0c4162304f74d89890e8c641a9c0778c1786db850a79cfb3f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8a345161f4d34be281c5f4d165dac958ed3a5e7d2888924d498555871906e6ea\",\"dweb:/ipfs/QmQcWfQ6k54UPr9eMA2KnXCJAc4NR24LhzbmyA5NUKBVN3\"]},\"contracts/src/spaces/facets/proxy/SpaceProxy.sol\":{\"keccak256\":\"0x31a5bc85ec005c60e58c94948b159806b14c7cd0466cc8d3ef32844e4564412d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4935d5100b48c5f7ad3adc068ea70701ad5e22963c4698aa6e42a61d54227984\",\"dweb:/ipfs/QmXopMyXerTvJFV1xwLnVv2GdhBCwDAE2oNtWywVPbxKRf\"]},\"contracts/src/spaces/facets/roles/IRoles.sol\":{\"keccak256\":\"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8\",\"dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N\"]},\"contracts/src/utils/Factory.sol\":{\"keccak256\":\"0xc5c6a4043577ffe33f61680b5bb12eb7267c68851339890831f37a85c823e7b4\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://81eec744d4993f4184010b16490a546d84a0ed1d4f3f9f84553cb374268ef8b3\",\"dweb:/ipfs/QmNX3gotr3ycE2XnVS48iatZh97uoeuVvoRRGiQh68Jij3\"]},\"contracts/src/utils/StringSet.sol\":{\"keccak256\":\"0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6\",\"dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK\"]},\"contracts/src/utils/Validator.sol\":{\"keccak256\":\"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64\",\"dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72\"]},\"contracts/src/utils/interfaces/IWETH.sol\":{\"keccak256\":\"0xd274612ab96215dcdb6e3717a63e7a0f76c7facadff93b2b23ed278f6e7b3b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://12444da1f06a0fbe6d2d564d73d6d6bc58c09496af3aeea6988c3d3f9ee81c73\",\"dweb:/ipfs/QmTkpQ6cZmRYgvLUS4mqzLvFg5nabgQjpMnVK8JENboiA3\"]},\"contracts/src/utils/libraries/BasisPoints.sol\":{\"keccak256\":\"0x797b0a1d3da51f4256c83b5d5c885b034df5bdff69c8dfa0fac9777cfa2f1d26\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://52ba0c85e5de8a7d76e2e4bcbccdaffa68e29281191ae1f889430a496ce5cf1c\",\"dweb:/ipfs/Qmd5bYypjF6gcJKKagdRpvAgV4LCs4iyn7KYdaLBWjjuHr\"]},\"contracts/src/utils/libraries/CurrencyTransfer.sol\":{\"keccak256\":\"0x1c6b5b33831f8c5c02c49dff5ceac3ad1a6cdb74c988ebba72c36329ca704750\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://78122f27b67a5d3ebe95c4260dc972ab7be5c04b277cbd71a833dd74fbd23fa4\",\"dweb:/ipfs/QmU78EApEim92KMVtW69coFPZdhvbkhmYn6dW2zwqJKPBp\"]},\"lib/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\":{\"keccak256\":\"0xbfb6695731de677140fbf76c772ab08c4233a122fb51ac28ac120fc49bbbc4ec\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://68f8fded7cc318efa15874b7c6a983fe17a4a955d72d240353a9a4ca1e1b824c\",\"dweb:/ipfs/QmdcmBL9Qo4Tk3Dby4wFYabGyot9JNeLPxpSXZUgUm92BV\"]},\"lib/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\":{\"keccak256\":\"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a\",\"dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE\"]},\"lib/@openzeppelin/contracts/proxy/Proxy.sol\":{\"keccak256\":\"0xc3f2ec76a3de8ed7a7007c46166f5550c72c7709e3fc7e8bb3111a7191cdedbd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e73efb4c2ca655882dc237c6b4f234a9bd36d97159d8fcaa837eb01171f726ac\",\"dweb:/ipfs/QmTNnnv7Gu5fs5G1ZMh7Fexp8N4XUs3XrNAngjcxgiss3e\"]},\"lib/@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa\",\"dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM\"]},\"lib/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c\",\"dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq\"]},\"lib/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d\",\"dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi\"]},\"lib/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0\",\"dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3\"]},\"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c\",\"dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"Architect__InvalidAddress"},{"inputs":[],"type":"error","name":"Architect__InvalidNetworkId"},{"inputs":[],"type":"error","name":"Architect__InvalidStringLength"},{"inputs":[],"type":"error","name":"Architect__NotContract"},{"inputs":[],"type":"error","name":"Factory__FailedDeployment"},{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[],"type":"error","name":"Pausable__NotPaused"},{"inputs":[],"type":"error","name":"Pausable__Paused"},{"inputs":[],"type":"error","name":"ReentrancyGuard__ReentrantCall"},{"inputs":[],"type":"error","name":"Validator__InvalidAddress"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true},{"internalType":"address","name":"space","type":"address","indexed":true}],"type":"event","name":"SpaceCreated","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[{"internalType":"contract ISpaceOwner","name":"ownerImplementation","type":"address"},{"internalType":"contract IUserEntitlement","name":"userEntitlementImplementation","type":"address"},{"internalType":"contract IRuleEntitlement","name":"ruleEntitlementImplementation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"__Architect_init"},{"inputs":[{"internalType":"struct IArchitectBase.SpaceInfo","name":"spaceInfo","type":"tuple","components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"struct IArchitectBase.Membership","name":"membership","type":"tuple","components":[{"internalType":"struct IMembershipBase.Membership","name":"settings","type":"tuple","components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint64","name":"duration","type":"uint64"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"address","name":"feeRecipient","type":"address"},{"internalType":"uint256","name":"freeAllocation","type":"uint256"},{"internalType":"address","name":"pricingModule","type":"address"}]},{"internalType":"struct IArchitectBase.MembershipRequirements","name":"requirements","type":"tuple","components":[{"internalType":"bool","name":"everyone","type":"bool"},{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"struct IRuleEntitlement.RuleData","name":"ruleData","type":"tuple","components":[{"internalType":"struct IRuleEntitlement.Operation[]","name":"operations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CombinedOperationType","name":"opType","type":"uint8"},{"internalType":"uint8","name":"index","type":"uint8"}]},{"internalType":"struct IRuleEntitlement.CheckOperation[]","name":"checkOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CheckOperationType","name":"opType","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"threshold","type":"uint256"}]},{"internalType":"struct IRuleEntitlement.LogicalOperation[]","name":"logicalOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.LogicalOperationType","name":"logOpType","type":"uint8"},{"internalType":"uint8","name":"leftOperationIndex","type":"uint8"},{"internalType":"uint8","name":"rightOperationIndex","type":"uint8"}]}]}]},{"internalType":"string[]","name":"permissions","type":"string[]"}]},{"internalType":"struct IArchitectBase.ChannelInfo","name":"channel","type":"tuple","components":[{"internalType":"string","name":"metadata","type":"string"}]}]}],"stateMutability":"nonpayable","type":"function","name":"createSpace","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getSpaceArchitectImplementations","outputs":[{"internalType":"contract ISpaceOwner","name":"spaceToken","type":"address"},{"internalType":"contract IUserEntitlement","name":"userEntitlementImplementation","type":"address"},{"internalType":"contract IRuleEntitlement","name":"ruleEntitlementImplementation","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getSpaceByTokenId","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"space","type":"address"}],"stateMutability":"view","type":"function","name":"getTokenIdBySpace","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"contract ISpaceOwner","name":"spaceToken","type":"address"},{"internalType":"contract IUserEntitlement","name":"userEntitlementImplementation","type":"address"},{"internalType":"contract IRuleEntitlement","name":"ruleEntitlementImplementation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setSpaceArchitectImplementations"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/factory/facets/architect/Architect.sol":"Architect"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/base/registry/facets/checker/IEntitlementChecker.sol":{"keccak256":"0x5c9a99c94e95a0c89b3d3310e252cd98aeafe34d87ffc0058f9b001af6f28bd1","urls":["bzz-raw://7983b17a371e76c8681756dc10abe26f8fffd35d3d6d8773c2023f06c8600ba3","dweb:/ipfs/QmSDkTctKCTaMGYF2LZ1N9YWwDTZD75XegpPyLrP694JFf"],"license":"MIT"},"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableBase.sol":{"keccak256":"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762","urls":["bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4","dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableStorage.sol":{"keccak256":"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64","urls":["bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105","dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol":{"keccak256":"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d","urls":["bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f","dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol":{"keccak256":"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a","urls":["bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5","dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol":{"keccak256":"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0","urls":["bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc","dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/IPausable.sol":{"keccak256":"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261","urls":["bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6","dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableBase.sol":{"keccak256":"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438","urls":["bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c","dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableStorage.sol":{"keccak256":"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07","urls":["bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b","dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol":{"keccak256":"0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a","urls":["bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b","dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol":{"keccak256":"0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f","urls":["bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c","dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol":{"keccak256":"0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c","urls":["bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6","dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol":{"keccak256":"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218","urls":["bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f","dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol":{"keccak256":"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334","urls":["bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa","dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol":{"keccak256":"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1","urls":["bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c","dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9","urls":["bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e","dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/IProxy.sol":{"keccak256":"0xb3cc38cae21021aec88e128eaec4994e926e4961d166c7e6e3a40a41c69aa105","urls":["bzz-raw://6da721f34f1359068ebe71ce01472403940b4e8fe87c38ff5be2d77e673520e5","dweb:/ipfs/QmfNgDv5eQsLzc9bKi1EGWdxDX84Vhr2SARa7zm4pcCdpy"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/Proxy.sol":{"keccak256":"0xae6d6933073274683d2684fc806cffbdc157d56b181d7ea0c962c3cd7746b78d","urls":["bzz-raw://43378c060da21e547d10282839ff3dc690615c8993949f6a072f9ed4693ba548","dweb:/ipfs/QmaT7GdtDpNBRJPLRnGEoGmZJSFNPkqHUzPde5LSYXc1q1"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/managed/IManagedProxy.sol":{"keccak256":"0x50761de44dd190dd8e5b01080c073c1190fa393406c12621ecb51f7bf6131929","urls":["bzz-raw://afccbdf66bb1bda60a91c481f0770b4409841efd2e7198693b025e2ed06f66d5","dweb:/ipfs/QmTvoHQAv5LvyT5UVqrsgSaS7QpywxAVZMxNRevuSeLo7p"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/managed/ManagedProxyBase.sol":{"keccak256":"0x709b83c1c463f07fea33d7b315087e35087be1ebce59a9659bad36cb25b68f2a","urls":["bzz-raw://a258b4cb33c4595b31216316b3b0a37364dabbc1bcd076de8efb1433850d38bf","dweb:/ipfs/QmR54ko5NH1p1WdfUSVaRhJtTtnGcBPndS7xTJ1MbQ398v"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/managed/ManagedProxyStorage.sol":{"keccak256":"0x3b9124d97b9f84a56a37c8e1cafb741756b11e76c7b98fab034c009fa990a761","urls":["bzz-raw://2958827286beb633f06ac9f2eeebec7fdbf612da520cca93646f1f02e24048fa","dweb:/ipfs/QmaUHopT1SWHsZQEy7J5CH2ZmpwY7xh4ujfNW8mPUYAuFY"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/manager/IProxyManager.sol":{"keccak256":"0xde8f6048e58e36541aebff781fb013334e8ea2fa824d9790e629d3733944929a","urls":["bzz-raw://c79d9ac525a370f6f56b229506cf2d2ffeacafbeb02d417ed34c86c75fe01650","dweb:/ipfs/QmT9CReyEvK2UkcwnzwierQdWw2T7NVZPtVDLcwhyNBhSC"],"license":"Apache-2.0"},"contracts/src/diamond/utils/multicall/IMulticall.sol":{"keccak256":"0x0f1a1884b290dc829323fa6d01e0dedc785ff582e9dbffd52e44e6f2fc7beff6","urls":["bzz-raw://1ce824d7f2b31f53a807bf6d6d7e9d0eaaf2d81b75fa316cda616e29cb4669a9","dweb:/ipfs/QmWyiRtGKtX6Kfng8Az2ujKDZdqjnfwxMuD1rQEZz6aki5"],"license":"Apache-2.0"},"contracts/src/diamond/utils/multicall/Multicall.sol":{"keccak256":"0x52c952ab050b3eb1dbb3c9cbaad900eaf83ba2ce42a47f204f9aa9e460126701","urls":["bzz-raw://442e5db41748e2a5b7c028b55ad6a680960c1819c3b576a162edea85f623aa44","dweb:/ipfs/Qmb3mNdPBLFh6wgj8ih2EXs8rTcTniKpxk8eZHiY1ahaud"],"license":"Apache-2.0"},"contracts/src/factory/facets/architect/Architect.sol":{"keccak256":"0xcaed43dc30dbfe658129da749a082195539cf8c5d6c221b198e324c613ee49b7","urls":["bzz-raw://6f703d4315ab0c9217fc8a3b387be8ef812fafac75111fe48fbc8d005778f119","dweb:/ipfs/QmdGLpqs5oLnVN4en8Z8exNdjh3NTaMUV4S7YrjzukgSmD"],"license":"Apache-2.0"},"contracts/src/factory/facets/architect/ArchitectBase.sol":{"keccak256":"0x6513727490f0258589a8c0060041c099392f286e86fe26d632006992fc24b408","urls":["bzz-raw://24f5c44f47d880b23d25b4ae76e6b6488d284123f3a8f530bd674d42c774542f","dweb:/ipfs/QmaCnjKQMUGiQ1UwCwCuBWsxYVx4UuJe3i3gc8qtLKCcfR"],"license":"Apache-2.0"},"contracts/src/factory/facets/architect/ArchitectStorage.sol":{"keccak256":"0x6a11f25a21155e73624631305407602e8ac0e1f11c53936ffaab820263f51d1e","urls":["bzz-raw://3c88b9f38fba7ca69b355fdce609e898857c2bfc69ca62365138bbda9aa6b74b","dweb:/ipfs/QmVfoXqJ1WDnxtRzKiynzkduXbizL4H9WVVDFDVNH7aNxq"],"license":"Apache-2.0"},"contracts/src/factory/facets/architect/IArchitect.sol":{"keccak256":"0x08eec3f16ce7bf98d68cefb0bd103329616dc260d9c34e5a8e0de68bcd8fb2fe","urls":["bzz-raw://c6e9607219790d046c451e58e84f2794d0f461521de05569aa5e74c5a61a79b8","dweb:/ipfs/QmamxpUEceWUMKc8i2d2q7fnLdDM1611yPMX6QiQpbJDzz"],"license":"Apache-2.0"},"contracts/src/factory/facets/architect/ImplementationStorage.sol":{"keccak256":"0x7115f015df0678057d03a9bb6614c0c960c9c2334cec9919da3b1c73c65268e1","urls":["bzz-raw://dcafc368c1a3f230851f981861bac731e9bdb2e48b78d7679978b3d2a4eaab85","dweb:/ipfs/QmTJ72YsxYZHdGqkF4G6KsmH2GVGVad295xvbvdZ2Yq7s9"],"license":"Apache-2.0"},"contracts/src/factory/facets/architect/pricing/IPricingModules.sol":{"keccak256":"0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e","urls":["bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716","dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU"],"license":"Apache-2.0"},"contracts/src/factory/facets/platform/requirements/IPlatformRequirements.sol":{"keccak256":"0xc0b22b0caa2336e0c3f6b6813432643053785c39531d30e5851eeb613a0a7991","urls":["bzz-raw://8a7ceb199e92f484efcc444fffd54fbabaf332c210dda0ef46d89a66f4cb47c7","dweb:/ipfs/QmRJVrZiZpbGsLngz4J3NVgapKXLErdLc7BPyEyTNKdijg"],"license":"Apache-2.0"},"contracts/src/factory/facets/prepay/IPrepay.sol":{"keccak256":"0x0c5c097dd77471d041cdbb84011ac789147af937d275329d857d1a4b257635e9","urls":["bzz-raw://baca271a5a66856f3144a4bf0ed6a484b0c981539d6bf0c57ffade9e4986eb49","dweb:/ipfs/QmVgPWMEL5q2J5kmZQZFRadWjuVQeFLaa9K2gCHdhjLUa9"],"license":"Apache-2.0"},"contracts/src/factory/facets/registry/IImplementationRegistry.sol":{"keccak256":"0x2409b9eb86a4dc5849050d06409fd7548ac21f9bf6e7419b91dfb9226db0a3d5","urls":["bzz-raw://613195fc78a1a496820c5934f315c586ad33edf7608022d2ae0ea44f52529e61","dweb:/ipfs/QmR8Gn11UNq2rKC5Qp7Prdk61oWhNg3UVc8KeyWCRfrEqV"],"license":"Apache-2.0"},"contracts/src/factory/facets/wallet-link/IWalletLink.sol":{"keccak256":"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b","urls":["bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13","dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/IEntitlement.sol":{"keccak256":"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca","urls":["bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3","dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol":{"keccak256":"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf","urls":["bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1","dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97"],"license":"MIT"},"contracts/src/spaces/entitlements/user/IUserEntitlement.sol":{"keccak256":"0x96fef5ebaa7e9e79c77c887d9053ae06dc91cf1301f33db652e6ac811b3b5cc5","urls":["bzz-raw://6cff649b95f65c9e3ecfa7dfa3b1c7b524ec7244eb5223c55674a4679eb8e7bf","dweb:/ipfs/QmQy5sXRywRWB3aM58TCp5Xw5b258Y5PfDM8RasDznAPzA"],"license":"Apache-2.0"},"contracts/src/spaces/facets/Permissions.sol":{"keccak256":"0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5","urls":["bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721","dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/IChannel.sol":{"keccak256":"0x4a62ec6410779121880a21ae1a42bab2480f672c683f79c7f2e11bf2bfe1bd6e","urls":["bzz-raw://61b4142a55418d8e15e4db77bf6614a830489dc6aa191afe3dadc9ef16534b2c","dweb:/ipfs/Qmbuc8VBmoFrbWZGinbCQaCrBRw3DznYhZNLzqk2FXABUx"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/IEntitlementsManager.sol":{"keccak256":"0x1c3cff6f7a35610df492abc39a62ba704e408d43477ba2e34833197c2956e9d3","urls":["bzz-raw://c5d5f08c5bc196e6166678b39d415da12c285d9bee3584d5e200bbf0c5ea911d","dweb:/ipfs/QmdYkU6kzHFw7KFYAdvxiwHK7hWCrz3E3pwiCjWZ97PVGx"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/EntitlementGatedBase.sol":{"keccak256":"0x0aa9887cf58dd68d0270c85e2d7610080f35410b845c2227e4bd84356b7a2cb7","urls":["bzz-raw://6dbdbed895fc2a53bffa3dbc1cfd4c992a096f153e6bbb7aeb9894485e7fc1a6","dweb:/ipfs/QmZp76Gd8aL9pWbiTvLaiHv1w12yjN59PtYdMvoUCbfbH5"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/EntitlementGatedStorage.sol":{"keccak256":"0xe997c0dd62f6ceb300729d3f56a3f25a47b40ed5946d68c5210c38941cb37eaa","urls":["bzz-raw://63fcfd9f667538e8e9339534d2ddc6f7899e4179a54f3c6595e2598babb5bb9c","dweb:/ipfs/QmUfKtfgW1uskEWkhhGqTjcbCqMANQoKKfTgV2ZvdAZpvJ"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/IEntitlementGated.sol":{"keccak256":"0x948de1018f7f78366263a40e0f8269e10941216bd03a9996edb24a6230959e74","urls":["bzz-raw://dc985539ce639f39fd68723acca6424a78deac6cec3693c9d8e1084a487c83ec","dweb:/ipfs/QmQujX5rmDwhJZurp11FTiPLb7ev9swLTtdkagA8wydZiT"],"license":"MIT"},"contracts/src/spaces/facets/membership/IMembership.sol":{"keccak256":"0x233066dd470121818082ba6a4c868f90feafc3be29942aae2c7a5c25543b7485","urls":["bzz-raw://30d976a1882102493e7cee87b75ab04c662626d71aca51c9334ed2f60402bb59","dweb:/ipfs/QmerPfizrjueQSgG8SkSoi44fkyaqrN2ZCFTnaxnM3UqF7"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/MembershipBase.sol":{"keccak256":"0x82b3314afcd1fe84a5261c38627c2537c09271372504af10549558c0fd608791","urls":["bzz-raw://dadc28ee124081ea64228b8a12e0fcc93c7256535597ea9e29d58140bb599fc5","dweb:/ipfs/QmYNZjhBJnPf9kMt2J6pL2d746AB3EHrXVAj5Ce3ibZpBh"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/MembershipStorage.sol":{"keccak256":"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3","urls":["bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee","dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/pricing/IMembershipPricing.sol":{"keccak256":"0xb68faf2b90536ea53110ebb1d4456f2e9a261b5fac4515df47076da73e0cbd77","urls":["bzz-raw://063fca54f8210be704b5d9f54efac08017266fafc9d287a6ece7866b25174448","dweb:/ipfs/QmbXUgKgh36CmNRA5NrtRrVcgfrKYEzZprAcjTVWhHmXBF"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/referral/IMembershipReferral.sol":{"keccak256":"0xeb2feee4b1f3e83509bc1425c0ecd60eaf168fa7686c14dc2bd636e5a691bc6a","urls":["bzz-raw://ec9bcb8c4106639ec9e0d37fa59385c1e853fb07f9ebedcd9f2bc1198979a807","dweb:/ipfs/QmcAdwQKn2jMo7grzXNGSPr9PvQBxdKURF6xxLPorCDrFt"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/referral/MembershipReferralBase.sol":{"keccak256":"0x6f29e73b113fce75e54a41f248621b1adaa5ac4a3b189ef0903308bfa69165ca","urls":["bzz-raw://abc7b25a74097434912f4940bfcd6cf9e312b0989279cb31a9a74d7ae6c09636","dweb:/ipfs/QmPdttVeMBDBb8SMrga6YnKz3aiGDKMqo2MofCXtag4w4E"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/referral/MembershipReferralStorage.sol":{"keccak256":"0x607aabf7ae45b7f112165c1028e0fa2d18b86c6db78f4df4bdf39dd0f20973ea","urls":["bzz-raw://4d61919ebf0ba0d3706cf2c3755b9d9920312c82bb1b83d0023f1cb09c2fc31d","dweb:/ipfs/QmSQ1G7rRMf6tAuzdU6M5ydKetaSZXdN3UV33wNjvDrqAL"],"license":"Apache-2.0"},"contracts/src/spaces/facets/owner/ISpaceOwner.sol":{"keccak256":"0xf68eb1b3aceeacc0c4162304f74d89890e8c641a9c0778c1786db850a79cfb3f","urls":["bzz-raw://8a345161f4d34be281c5f4d165dac958ed3a5e7d2888924d498555871906e6ea","dweb:/ipfs/QmQcWfQ6k54UPr9eMA2KnXCJAc4NR24LhzbmyA5NUKBVN3"],"license":"Apache-2.0"},"contracts/src/spaces/facets/proxy/SpaceProxy.sol":{"keccak256":"0x31a5bc85ec005c60e58c94948b159806b14c7cd0466cc8d3ef32844e4564412d","urls":["bzz-raw://4935d5100b48c5f7ad3adc068ea70701ad5e22963c4698aa6e42a61d54227984","dweb:/ipfs/QmXopMyXerTvJFV1xwLnVv2GdhBCwDAE2oNtWywVPbxKRf"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/IRoles.sol":{"keccak256":"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d","urls":["bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8","dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N"],"license":"Apache-2.0"},"contracts/src/utils/Factory.sol":{"keccak256":"0xc5c6a4043577ffe33f61680b5bb12eb7267c68851339890831f37a85c823e7b4","urls":["bzz-raw://81eec744d4993f4184010b16490a546d84a0ed1d4f3f9f84553cb374268ef8b3","dweb:/ipfs/QmNX3gotr3ycE2XnVS48iatZh97uoeuVvoRRGiQh68Jij3"],"license":"Apache-2.0"},"contracts/src/utils/StringSet.sol":{"keccak256":"0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319","urls":["bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6","dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK"],"license":"Apache-2.0"},"contracts/src/utils/Validator.sol":{"keccak256":"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50","urls":["bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64","dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72"],"license":"Apache-2.0"},"contracts/src/utils/interfaces/IWETH.sol":{"keccak256":"0xd274612ab96215dcdb6e3717a63e7a0f76c7facadff93b2b23ed278f6e7b3b00","urls":["bzz-raw://12444da1f06a0fbe6d2d564d73d6d6bc58c09496af3aeea6988c3d3f9ee81c73","dweb:/ipfs/QmTkpQ6cZmRYgvLUS4mqzLvFg5nabgQjpMnVK8JENboiA3"],"license":"Apache-2.0"},"contracts/src/utils/libraries/BasisPoints.sol":{"keccak256":"0x797b0a1d3da51f4256c83b5d5c885b034df5bdff69c8dfa0fac9777cfa2f1d26","urls":["bzz-raw://52ba0c85e5de8a7d76e2e4bcbccdaffa68e29281191ae1f889430a496ce5cf1c","dweb:/ipfs/Qmd5bYypjF6gcJKKagdRpvAgV4LCs4iyn7KYdaLBWjjuHr"],"license":"Apache-2.0"},"contracts/src/utils/libraries/CurrencyTransfer.sol":{"keccak256":"0x1c6b5b33831f8c5c02c49dff5ceac3ad1a6cdb74c988ebba72c36329ca704750","urls":["bzz-raw://78122f27b67a5d3ebe95c4260dc972ab7be5c04b277cbd71a833dd74fbd23fa4","dweb:/ipfs/QmU78EApEim92KMVtW69coFPZdhvbkhmYn6dW2zwqJKPBp"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol":{"keccak256":"0xbfb6695731de677140fbf76c772ab08c4233a122fb51ac28ac120fc49bbbc4ec","urls":["bzz-raw://68f8fded7cc318efa15874b7c6a983fe17a4a955d72d240353a9a4ca1e1b824c","dweb:/ipfs/QmdcmBL9Qo4Tk3Dby4wFYabGyot9JNeLPxpSXZUgUm92BV"],"license":"MIT"},"lib/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"],"license":"MIT"},"lib/@openzeppelin/contracts/proxy/Proxy.sol":{"keccak256":"0xc3f2ec76a3de8ed7a7007c46166f5550c72c7709e3fc7e8bb3111a7191cdedbd","urls":["bzz-raw://e73efb4c2ca655882dc237c6b4f234a9bd36d97159d8fcaa837eb01171f726ac","dweb:/ipfs/QmTNnnv7Gu5fs5G1ZMh7Fexp8N4XUs3XrNAngjcxgiss3e"],"license":"MIT"},"lib/@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"keccak256":"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4","urls":["bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7","dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":127} \ No newline at end of file diff --git a/packages/generated/v3/abis/Architect.metadata.json b/packages/generated/v3/abis/Architect.metadata.json new file mode 100644 index 000000000..68810e457 --- /dev/null +++ b/packages/generated/v3/abis/Architect.metadata.json @@ -0,0 +1,1164 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "Architect__InvalidAddress" + }, + { + "inputs": [], + "type": "error", + "name": "Architect__InvalidNetworkId" + }, + { + "inputs": [], + "type": "error", + "name": "Architect__InvalidStringLength" + }, + { + "inputs": [], + "type": "error", + "name": "Architect__NotContract" + }, + { + "inputs": [], + "type": "error", + "name": "Factory__FailedDeployment" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__NotPaused" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__Paused" + }, + { + "inputs": [], + "type": "error", + "name": "ReentrancyGuard__ReentrantCall" + }, + { + "inputs": [], + "type": "error", + "name": "Validator__InvalidAddress" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Paused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "address", + "name": "space", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "SpaceCreated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Unpaused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "contract ISpaceOwner", + "name": "ownerImplementation", + "type": "address" + }, + { + "internalType": "contract IUserEntitlement", + "name": "userEntitlementImplementation", + "type": "address" + }, + { + "internalType": "contract IRuleEntitlement", + "name": "ruleEntitlementImplementation", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__Architect_init" + }, + { + "inputs": [ + { + "internalType": "struct IArchitectBase.SpaceInfo", + "name": "spaceInfo", + "type": "tuple", + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "uri", + "type": "string" + }, + { + "internalType": "struct IArchitectBase.Membership", + "name": "membership", + "type": "tuple", + "components": [ + { + "internalType": "struct IMembershipBase.Membership", + "name": "settings", + "type": "tuple", + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxSupply", + "type": "uint256" + }, + { + "internalType": "uint64", + "name": "duration", + "type": "uint64" + }, + { + "internalType": "address", + "name": "currency", + "type": "address" + }, + { + "internalType": "address", + "name": "feeRecipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "freeAllocation", + "type": "uint256" + }, + { + "internalType": "address", + "name": "pricingModule", + "type": "address" + } + ] + }, + { + "internalType": "struct IArchitectBase.MembershipRequirements", + "name": "requirements", + "type": "tuple", + "components": [ + { + "internalType": "bool", + "name": "everyone", + "type": "bool" + }, + { + "internalType": "address[]", + "name": "users", + "type": "address[]" + }, + { + "internalType": "struct IRuleEntitlement.RuleData", + "name": "ruleData", + "type": "tuple", + "components": [ + { + "internalType": "struct IRuleEntitlement.Operation[]", + "name": "operations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CombinedOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "index", + "type": "uint8" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "name": "checkOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CheckOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "name": "logicalOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.LogicalOperationType", + "name": "logOpType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "leftOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "rightOperationIndex", + "type": "uint8" + } + ] + } + ] + } + ] + }, + { + "internalType": "string[]", + "name": "permissions", + "type": "string[]" + } + ] + }, + { + "internalType": "struct IArchitectBase.ChannelInfo", + "name": "channel", + "type": "tuple", + "components": [ + { + "internalType": "string", + "name": "metadata", + "type": "string" + } + ] + } + ] + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "createSpace", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getSpaceArchitectImplementations", + "outputs": [ + { + "internalType": "contract ISpaceOwner", + "name": "spaceToken", + "type": "address" + }, + { + "internalType": "contract IUserEntitlement", + "name": "userEntitlementImplementation", + "type": "address" + }, + { + "internalType": "contract IRuleEntitlement", + "name": "ruleEntitlementImplementation", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getSpaceByTokenId", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "space", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getTokenIdBySpace", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "contract ISpaceOwner", + "name": "spaceToken", + "type": "address" + }, + { + "internalType": "contract IUserEntitlement", + "name": "userEntitlementImplementation", + "type": "address" + }, + { + "internalType": "contract IRuleEntitlement", + "name": "ruleEntitlementImplementation", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setSpaceArchitectImplementations" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/factory/facets/architect/Architect.sol": "Architect" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/base/registry/facets/checker/IEntitlementChecker.sol": { + "keccak256": "0x5c9a99c94e95a0c89b3d3310e252cd98aeafe34d87ffc0058f9b001af6f28bd1", + "urls": [ + "bzz-raw://7983b17a371e76c8681756dc10abe26f8fffd35d3d6d8773c2023f06c8600ba3", + "dweb:/ipfs/QmSDkTctKCTaMGYF2LZ1N9YWwDTZD75XegpPyLrP694JFf" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableBase.sol": { + "keccak256": "0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762", + "urls": [ + "bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4", + "dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableStorage.sol": { + "keccak256": "0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64", + "urls": [ + "bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105", + "dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol": { + "keccak256": "0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d", + "urls": [ + "bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f", + "dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol": { + "keccak256": "0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a", + "urls": [ + "bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5", + "dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol": { + "keccak256": "0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0", + "urls": [ + "bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc", + "dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/IPausable.sol": { + "keccak256": "0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261", + "urls": [ + "bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6", + "dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableBase.sol": { + "keccak256": "0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438", + "urls": [ + "bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c", + "dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableStorage.sol": { + "keccak256": "0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07", + "urls": [ + "bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b", + "dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol": { + "keccak256": "0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a", + "urls": [ + "bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b", + "dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol": { + "keccak256": "0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f", + "urls": [ + "bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c", + "dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol": { + "keccak256": "0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c", + "urls": [ + "bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6", + "dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/IERC5643.sol": { + "keccak256": "0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218", + "urls": [ + "bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f", + "dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol": { + "keccak256": "0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334", + "urls": [ + "bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa", + "dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol": { + "keccak256": "0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1", + "urls": [ + "bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c", + "dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/IERC721A.sol": { + "keccak256": "0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9", + "urls": [ + "bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e", + "dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/IProxy.sol": { + "keccak256": "0xb3cc38cae21021aec88e128eaec4994e926e4961d166c7e6e3a40a41c69aa105", + "urls": [ + "bzz-raw://6da721f34f1359068ebe71ce01472403940b4e8fe87c38ff5be2d77e673520e5", + "dweb:/ipfs/QmfNgDv5eQsLzc9bKi1EGWdxDX84Vhr2SARa7zm4pcCdpy" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/Proxy.sol": { + "keccak256": "0xae6d6933073274683d2684fc806cffbdc157d56b181d7ea0c962c3cd7746b78d", + "urls": [ + "bzz-raw://43378c060da21e547d10282839ff3dc690615c8993949f6a072f9ed4693ba548", + "dweb:/ipfs/QmaT7GdtDpNBRJPLRnGEoGmZJSFNPkqHUzPde5LSYXc1q1" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/managed/IManagedProxy.sol": { + "keccak256": "0x50761de44dd190dd8e5b01080c073c1190fa393406c12621ecb51f7bf6131929", + "urls": [ + "bzz-raw://afccbdf66bb1bda60a91c481f0770b4409841efd2e7198693b025e2ed06f66d5", + "dweb:/ipfs/QmTvoHQAv5LvyT5UVqrsgSaS7QpywxAVZMxNRevuSeLo7p" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/managed/ManagedProxyBase.sol": { + "keccak256": "0x709b83c1c463f07fea33d7b315087e35087be1ebce59a9659bad36cb25b68f2a", + "urls": [ + "bzz-raw://a258b4cb33c4595b31216316b3b0a37364dabbc1bcd076de8efb1433850d38bf", + "dweb:/ipfs/QmR54ko5NH1p1WdfUSVaRhJtTtnGcBPndS7xTJ1MbQ398v" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/managed/ManagedProxyStorage.sol": { + "keccak256": "0x3b9124d97b9f84a56a37c8e1cafb741756b11e76c7b98fab034c009fa990a761", + "urls": [ + "bzz-raw://2958827286beb633f06ac9f2eeebec7fdbf612da520cca93646f1f02e24048fa", + "dweb:/ipfs/QmaUHopT1SWHsZQEy7J5CH2ZmpwY7xh4ujfNW8mPUYAuFY" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/manager/IProxyManager.sol": { + "keccak256": "0xde8f6048e58e36541aebff781fb013334e8ea2fa824d9790e629d3733944929a", + "urls": [ + "bzz-raw://c79d9ac525a370f6f56b229506cf2d2ffeacafbeb02d417ed34c86c75fe01650", + "dweb:/ipfs/QmT9CReyEvK2UkcwnzwierQdWw2T7NVZPtVDLcwhyNBhSC" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/utils/multicall/IMulticall.sol": { + "keccak256": "0x0f1a1884b290dc829323fa6d01e0dedc785ff582e9dbffd52e44e6f2fc7beff6", + "urls": [ + "bzz-raw://1ce824d7f2b31f53a807bf6d6d7e9d0eaaf2d81b75fa316cda616e29cb4669a9", + "dweb:/ipfs/QmWyiRtGKtX6Kfng8Az2ujKDZdqjnfwxMuD1rQEZz6aki5" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/utils/multicall/Multicall.sol": { + "keccak256": "0x52c952ab050b3eb1dbb3c9cbaad900eaf83ba2ce42a47f204f9aa9e460126701", + "urls": [ + "bzz-raw://442e5db41748e2a5b7c028b55ad6a680960c1819c3b576a162edea85f623aa44", + "dweb:/ipfs/Qmb3mNdPBLFh6wgj8ih2EXs8rTcTniKpxk8eZHiY1ahaud" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/architect/Architect.sol": { + "keccak256": "0xcaed43dc30dbfe658129da749a082195539cf8c5d6c221b198e324c613ee49b7", + "urls": [ + "bzz-raw://6f703d4315ab0c9217fc8a3b387be8ef812fafac75111fe48fbc8d005778f119", + "dweb:/ipfs/QmdGLpqs5oLnVN4en8Z8exNdjh3NTaMUV4S7YrjzukgSmD" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/architect/ArchitectBase.sol": { + "keccak256": "0x6513727490f0258589a8c0060041c099392f286e86fe26d632006992fc24b408", + "urls": [ + "bzz-raw://24f5c44f47d880b23d25b4ae76e6b6488d284123f3a8f530bd674d42c774542f", + "dweb:/ipfs/QmaCnjKQMUGiQ1UwCwCuBWsxYVx4UuJe3i3gc8qtLKCcfR" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/architect/ArchitectStorage.sol": { + "keccak256": "0x6a11f25a21155e73624631305407602e8ac0e1f11c53936ffaab820263f51d1e", + "urls": [ + "bzz-raw://3c88b9f38fba7ca69b355fdce609e898857c2bfc69ca62365138bbda9aa6b74b", + "dweb:/ipfs/QmVfoXqJ1WDnxtRzKiynzkduXbizL4H9WVVDFDVNH7aNxq" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/architect/IArchitect.sol": { + "keccak256": "0x08eec3f16ce7bf98d68cefb0bd103329616dc260d9c34e5a8e0de68bcd8fb2fe", + "urls": [ + "bzz-raw://c6e9607219790d046c451e58e84f2794d0f461521de05569aa5e74c5a61a79b8", + "dweb:/ipfs/QmamxpUEceWUMKc8i2d2q7fnLdDM1611yPMX6QiQpbJDzz" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/architect/ImplementationStorage.sol": { + "keccak256": "0x7115f015df0678057d03a9bb6614c0c960c9c2334cec9919da3b1c73c65268e1", + "urls": [ + "bzz-raw://dcafc368c1a3f230851f981861bac731e9bdb2e48b78d7679978b3d2a4eaab85", + "dweb:/ipfs/QmTJ72YsxYZHdGqkF4G6KsmH2GVGVad295xvbvdZ2Yq7s9" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/architect/pricing/IPricingModules.sol": { + "keccak256": "0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e", + "urls": [ + "bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716", + "dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/platform/requirements/IPlatformRequirements.sol": { + "keccak256": "0xc0b22b0caa2336e0c3f6b6813432643053785c39531d30e5851eeb613a0a7991", + "urls": [ + "bzz-raw://8a7ceb199e92f484efcc444fffd54fbabaf332c210dda0ef46d89a66f4cb47c7", + "dweb:/ipfs/QmRJVrZiZpbGsLngz4J3NVgapKXLErdLc7BPyEyTNKdijg" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/prepay/IPrepay.sol": { + "keccak256": "0x0c5c097dd77471d041cdbb84011ac789147af937d275329d857d1a4b257635e9", + "urls": [ + "bzz-raw://baca271a5a66856f3144a4bf0ed6a484b0c981539d6bf0c57ffade9e4986eb49", + "dweb:/ipfs/QmVgPWMEL5q2J5kmZQZFRadWjuVQeFLaa9K2gCHdhjLUa9" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/registry/IImplementationRegistry.sol": { + "keccak256": "0x2409b9eb86a4dc5849050d06409fd7548ac21f9bf6e7419b91dfb9226db0a3d5", + "urls": [ + "bzz-raw://613195fc78a1a496820c5934f315c586ad33edf7608022d2ae0ea44f52529e61", + "dweb:/ipfs/QmR8Gn11UNq2rKC5Qp7Prdk61oWhNg3UVc8KeyWCRfrEqV" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/wallet-link/IWalletLink.sol": { + "keccak256": "0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b", + "urls": [ + "bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13", + "dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/IEntitlement.sol": { + "keccak256": "0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca", + "urls": [ + "bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3", + "dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol": { + "keccak256": "0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf", + "urls": [ + "bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1", + "dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97" + ], + "license": "MIT" + }, + "contracts/src/spaces/entitlements/user/IUserEntitlement.sol": { + "keccak256": "0x96fef5ebaa7e9e79c77c887d9053ae06dc91cf1301f33db652e6ac811b3b5cc5", + "urls": [ + "bzz-raw://6cff649b95f65c9e3ecfa7dfa3b1c7b524ec7244eb5223c55674a4679eb8e7bf", + "dweb:/ipfs/QmQy5sXRywRWB3aM58TCp5Xw5b258Y5PfDM8RasDznAPzA" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/Permissions.sol": { + "keccak256": "0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5", + "urls": [ + "bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721", + "dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/IChannel.sol": { + "keccak256": "0x4a62ec6410779121880a21ae1a42bab2480f672c683f79c7f2e11bf2bfe1bd6e", + "urls": [ + "bzz-raw://61b4142a55418d8e15e4db77bf6614a830489dc6aa191afe3dadc9ef16534b2c", + "dweb:/ipfs/Qmbuc8VBmoFrbWZGinbCQaCrBRw3DznYhZNLzqk2FXABUx" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/IEntitlementsManager.sol": { + "keccak256": "0x1c3cff6f7a35610df492abc39a62ba704e408d43477ba2e34833197c2956e9d3", + "urls": [ + "bzz-raw://c5d5f08c5bc196e6166678b39d415da12c285d9bee3584d5e200bbf0c5ea911d", + "dweb:/ipfs/QmdYkU6kzHFw7KFYAdvxiwHK7hWCrz3E3pwiCjWZ97PVGx" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/EntitlementGatedBase.sol": { + "keccak256": "0x0aa9887cf58dd68d0270c85e2d7610080f35410b845c2227e4bd84356b7a2cb7", + "urls": [ + "bzz-raw://6dbdbed895fc2a53bffa3dbc1cfd4c992a096f153e6bbb7aeb9894485e7fc1a6", + "dweb:/ipfs/QmZp76Gd8aL9pWbiTvLaiHv1w12yjN59PtYdMvoUCbfbH5" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/EntitlementGatedStorage.sol": { + "keccak256": "0xe997c0dd62f6ceb300729d3f56a3f25a47b40ed5946d68c5210c38941cb37eaa", + "urls": [ + "bzz-raw://63fcfd9f667538e8e9339534d2ddc6f7899e4179a54f3c6595e2598babb5bb9c", + "dweb:/ipfs/QmUfKtfgW1uskEWkhhGqTjcbCqMANQoKKfTgV2ZvdAZpvJ" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/IEntitlementGated.sol": { + "keccak256": "0x948de1018f7f78366263a40e0f8269e10941216bd03a9996edb24a6230959e74", + "urls": [ + "bzz-raw://dc985539ce639f39fd68723acca6424a78deac6cec3693c9d8e1084a487c83ec", + "dweb:/ipfs/QmQujX5rmDwhJZurp11FTiPLb7ev9swLTtdkagA8wydZiT" + ], + "license": "MIT" + }, + "contracts/src/spaces/facets/membership/IMembership.sol": { + "keccak256": "0x233066dd470121818082ba6a4c868f90feafc3be29942aae2c7a5c25543b7485", + "urls": [ + "bzz-raw://30d976a1882102493e7cee87b75ab04c662626d71aca51c9334ed2f60402bb59", + "dweb:/ipfs/QmerPfizrjueQSgG8SkSoi44fkyaqrN2ZCFTnaxnM3UqF7" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/MembershipBase.sol": { + "keccak256": "0x82b3314afcd1fe84a5261c38627c2537c09271372504af10549558c0fd608791", + "urls": [ + "bzz-raw://dadc28ee124081ea64228b8a12e0fcc93c7256535597ea9e29d58140bb599fc5", + "dweb:/ipfs/QmYNZjhBJnPf9kMt2J6pL2d746AB3EHrXVAj5Ce3ibZpBh" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/MembershipStorage.sol": { + "keccak256": "0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3", + "urls": [ + "bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee", + "dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/pricing/IMembershipPricing.sol": { + "keccak256": "0xb68faf2b90536ea53110ebb1d4456f2e9a261b5fac4515df47076da73e0cbd77", + "urls": [ + "bzz-raw://063fca54f8210be704b5d9f54efac08017266fafc9d287a6ece7866b25174448", + "dweb:/ipfs/QmbXUgKgh36CmNRA5NrtRrVcgfrKYEzZprAcjTVWhHmXBF" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/referral/IMembershipReferral.sol": { + "keccak256": "0xeb2feee4b1f3e83509bc1425c0ecd60eaf168fa7686c14dc2bd636e5a691bc6a", + "urls": [ + "bzz-raw://ec9bcb8c4106639ec9e0d37fa59385c1e853fb07f9ebedcd9f2bc1198979a807", + "dweb:/ipfs/QmcAdwQKn2jMo7grzXNGSPr9PvQBxdKURF6xxLPorCDrFt" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/referral/MembershipReferralBase.sol": { + "keccak256": "0x6f29e73b113fce75e54a41f248621b1adaa5ac4a3b189ef0903308bfa69165ca", + "urls": [ + "bzz-raw://abc7b25a74097434912f4940bfcd6cf9e312b0989279cb31a9a74d7ae6c09636", + "dweb:/ipfs/QmPdttVeMBDBb8SMrga6YnKz3aiGDKMqo2MofCXtag4w4E" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/referral/MembershipReferralStorage.sol": { + "keccak256": "0x607aabf7ae45b7f112165c1028e0fa2d18b86c6db78f4df4bdf39dd0f20973ea", + "urls": [ + "bzz-raw://4d61919ebf0ba0d3706cf2c3755b9d9920312c82bb1b83d0023f1cb09c2fc31d", + "dweb:/ipfs/QmSQ1G7rRMf6tAuzdU6M5ydKetaSZXdN3UV33wNjvDrqAL" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/owner/ISpaceOwner.sol": { + "keccak256": "0xf68eb1b3aceeacc0c4162304f74d89890e8c641a9c0778c1786db850a79cfb3f", + "urls": [ + "bzz-raw://8a345161f4d34be281c5f4d165dac958ed3a5e7d2888924d498555871906e6ea", + "dweb:/ipfs/QmQcWfQ6k54UPr9eMA2KnXCJAc4NR24LhzbmyA5NUKBVN3" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/proxy/SpaceProxy.sol": { + "keccak256": "0x31a5bc85ec005c60e58c94948b159806b14c7cd0466cc8d3ef32844e4564412d", + "urls": [ + "bzz-raw://4935d5100b48c5f7ad3adc068ea70701ad5e22963c4698aa6e42a61d54227984", + "dweb:/ipfs/QmXopMyXerTvJFV1xwLnVv2GdhBCwDAE2oNtWywVPbxKRf" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/IRoles.sol": { + "keccak256": "0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d", + "urls": [ + "bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8", + "dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/Factory.sol": { + "keccak256": "0xc5c6a4043577ffe33f61680b5bb12eb7267c68851339890831f37a85c823e7b4", + "urls": [ + "bzz-raw://81eec744d4993f4184010b16490a546d84a0ed1d4f3f9f84553cb374268ef8b3", + "dweb:/ipfs/QmNX3gotr3ycE2XnVS48iatZh97uoeuVvoRRGiQh68Jij3" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/StringSet.sol": { + "keccak256": "0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319", + "urls": [ + "bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6", + "dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/Validator.sol": { + "keccak256": "0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50", + "urls": [ + "bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64", + "dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/interfaces/IWETH.sol": { + "keccak256": "0xd274612ab96215dcdb6e3717a63e7a0f76c7facadff93b2b23ed278f6e7b3b00", + "urls": [ + "bzz-raw://12444da1f06a0fbe6d2d564d73d6d6bc58c09496af3aeea6988c3d3f9ee81c73", + "dweb:/ipfs/QmTkpQ6cZmRYgvLUS4mqzLvFg5nabgQjpMnVK8JENboiA3" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/libraries/BasisPoints.sol": { + "keccak256": "0x797b0a1d3da51f4256c83b5d5c885b034df5bdff69c8dfa0fac9777cfa2f1d26", + "urls": [ + "bzz-raw://52ba0c85e5de8a7d76e2e4bcbccdaffa68e29281191ae1f889430a496ce5cf1c", + "dweb:/ipfs/Qmd5bYypjF6gcJKKagdRpvAgV4LCs4iyn7KYdaLBWjjuHr" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/libraries/CurrencyTransfer.sol": { + "keccak256": "0x1c6b5b33831f8c5c02c49dff5ceac3ad1a6cdb74c988ebba72c36329ca704750", + "urls": [ + "bzz-raw://78122f27b67a5d3ebe95c4260dc972ab7be5c04b277cbd71a833dd74fbd23fa4", + "dweb:/ipfs/QmU78EApEim92KMVtW69coFPZdhvbkhmYn6dW2zwqJKPBp" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol": { + "keccak256": "0xbfb6695731de677140fbf76c772ab08c4233a122fb51ac28ac120fc49bbbc4ec", + "urls": [ + "bzz-raw://68f8fded7cc318efa15874b7c6a983fe17a4a955d72d240353a9a4ca1e1b824c", + "dweb:/ipfs/QmdcmBL9Qo4Tk3Dby4wFYabGyot9JNeLPxpSXZUgUm92BV" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol": { + "keccak256": "0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65", + "urls": [ + "bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a", + "dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/proxy/Proxy.sol": { + "keccak256": "0xc3f2ec76a3de8ed7a7007c46166f5550c72c7709e3fc7e8bb3111a7191cdedbd", + "urls": [ + "bzz-raw://e73efb4c2ca655882dc237c6b4f234a9bd36d97159d8fcaa837eb01171f726ac", + "dweb:/ipfs/QmTNnnv7Gu5fs5G1ZMh7Fexp8N4XUs3XrNAngjcxgiss3e" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/proxy/beacon/IBeacon.sol": { + "keccak256": "0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c", + "urls": [ + "bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa", + "dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70", + "urls": [ + "bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c", + "dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { + "keccak256": "0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff", + "urls": [ + "bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d", + "dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { + "keccak256": "0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386", + "urls": [ + "bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0", + "dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4", + "urls": [ + "bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7", + "dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/StorageSlot.sol": { + "keccak256": "0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418", + "urls": [ + "bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c", + "dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/Channels.abi.json b/packages/generated/v3/abis/Channels.abi.json new file mode 100644 index 000000000..5610d468a --- /dev/null +++ b/packages/generated/v3/abis/Channels.abi.json @@ -0,0 +1,772 @@ +[ + { + "type": "function", + "name": "addRoleToChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "createChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "metadata", + "type": "string", + "internalType": "string" + }, + { + "name": "roleIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "channel", + "type": "tuple", + "internalType": "struct IChannelBase.Channel", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + }, + { + "name": "metadata", + "type": "string", + "internalType": "string" + }, + { + "name": "roleIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getChannels", + "inputs": [], + "outputs": [ + { + "name": "channels", + "type": "tuple[]", + "internalType": "struct IChannelBase.Channel[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + }, + { + "name": "metadata", + "type": "string", + "internalType": "string" + }, + { + "name": "roleIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRolesByChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "roleIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeRoleFromChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "metadata", + "type": "string", + "internalType": "string" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelCreated", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelRemoved", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelRoleAdded", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelRoleRemoved", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelUpdated", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SubscriptionUpdate", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "expiration", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ChannelService__ChannelAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__ChannelDisabled", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__ChannelDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__RoleAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__DurationZero", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__NotApprovedOrOwner", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidStringLength", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/Channels.abi.ts b/packages/generated/v3/abis/Channels.abi.ts new file mode 100644 index 000000000..c9e64e828 --- /dev/null +++ b/packages/generated/v3/abis/Channels.abi.ts @@ -0,0 +1,772 @@ +export default [ + { + "type": "function", + "name": "addRoleToChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "createChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "metadata", + "type": "string", + "internalType": "string" + }, + { + "name": "roleIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "channel", + "type": "tuple", + "internalType": "struct IChannelBase.Channel", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + }, + { + "name": "metadata", + "type": "string", + "internalType": "string" + }, + { + "name": "roleIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getChannels", + "inputs": [], + "outputs": [ + { + "name": "channels", + "type": "tuple[]", + "internalType": "struct IChannelBase.Channel[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + }, + { + "name": "metadata", + "type": "string", + "internalType": "string" + }, + { + "name": "roleIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRolesByChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "roleIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeRoleFromChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "metadata", + "type": "string", + "internalType": "string" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelCreated", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelRemoved", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelRoleAdded", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelRoleRemoved", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ChannelUpdated", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "channelId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SubscriptionUpdate", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "expiration", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ChannelService__ChannelAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__ChannelDisabled", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__ChannelDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__RoleAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__DurationZero", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__NotApprovedOrOwner", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidStringLength", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/Channels.bin b/packages/generated/v3/abis/Channels.bin new file mode 100644 index 000000000..c21da1426 --- /dev/null +++ b/packages/generated/v3/abis/Channels.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b611d27806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80639575f6ac1161005b5780639575f6ac146100f15780639935218314610106578063b9de615914610126578063ef86d6961461013957600080fd5b806302da0e511461008d57806337644cf7146100a2578063831c2b82146100b5578063921f7175146100de575b600080fd5b6100a061009b366004611597565b61014c565b005b6100a06100b03660046115b0565b61018a565b6100c86100c3366004611597565b6101cb565b6040516100d5919061168f565b60405180910390f35b6100a06100ec36600461177d565b6101fd565b6100f961023f565b6040516100d59190611845565b610119610114366004611597565b61024e565b6040516100d591906118a9565b6100a06101343660046115b0565b610259565b6100a06101473660046118fb565b610296565b61017e6040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b610187816102fb565b50565b6101bd826040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b81525061033c565b6101c78282610363565b5050565b60408051608081018252600080825260208201526060918101829052818101919091526101f7826103ad565b92915050565b61022f6040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b61023a838383610414565b505050565b6060610249610465565b905090565b60606101f78261059d565b61028c826040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b81525061033c565b6101c782826105a8565b6102c86040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b61023a8383836105ea565b6102de600082610627565b61018757604051630ce39a4b60e21b815260040160405180910390fd5b610304816106ab565b60405181815233907f3a3f387aa42656bc1732adfc7aea5cde9ccc05a59f9af9c29ebfa68e66383e939060200160405180910390a250565b6103468282610627565b6101c757604051630ce39a4b60e21b815260040160405180910390fd5b61036d82826107a2565b604080518381526020810183905233917f2b10481523b59a7978f8ab73b237349b0f38c801f6094bdc8994d379c067d71391015b60405180910390a25050565b60408051608081018252600080825260208201526060918101829052818101919091526000806103dc84610833565b925092505060006103ec85610953565b6040805160808101825296875292151560208701529185019290925260608401525090919050565b61041f8260006109ab565b61042a8383836109cf565b60405183815233907fdd6c5b83be3557f8b2674712946f9f05dcd882b82bfd58b9539b9706efd35d8c906020015b60405180910390a2505050565b60606000610471610b09565b90506000815167ffffffffffffffff81111561048f5761048f6116a2565b6040519080825280602002602001820160405280156104e357816020015b60408051608081018252600080825260208201526060918101829052818101919091528152602001906001900390816104ad5790505b50905060005b825181101561059657600080600061051986858151811061050c5761050c611956565b6020026020010151610833565b925092509250600061054387868151811061053657610536611956565b6020026020010151610953565b9050604051806080016040528085815260200183151581526020018481526020018281525086868151811061057a5761057a611956565b60200260200101819052505050505080806001019150506104e9565b5092915050565b60606101f782610953565b6105b28282610b29565b604080518381526020810183905233917faee688d80dbf97230e5d2b4b06aa7074bfe38ddd8abf856551177db30395612991016103a1565b6105f5838383610bb9565b60405183815233907f94af4a611b3fb1eaa653a6b29f82b71bcea25ca378171c5f059010fa18e0716e90602001610458565b60003380610633610c6e565b6001600160a01b031614806106a357507fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff161580156106a357506106a3848285604051602001610686919061196c565b60405160208183030381529060405261069e90611988565b610d32565b949350505050565b6106b481610fdf565b600080516020611d078339815191526106cd8183611016565b5060408051602080820183526000808352858152600280860190925292909220909101906106fb9082611a30565b50600082815260028083016020526040822060018101805460ff19169055828155919061072a90830182611549565b50506000828152600382016020526040812061074590611022565b905060005b815181101561079c5761079382828151811061076857610768611956565b602002602001015184600301600087815260200190815260200160002061101690919063ffffffff16565b5060010161074a565b50505050565b6107ab82610fdf565b6107b48261102f565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d07833981519152906107fb9083611091565b15610819576040516302369ff360e41b815260040160405180910390fd5b6000838152600382016020526040902061079c90836110a9565b60006060600061084284610fdf565b60008481527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430260209081526040808320815160608101835281548152600182015460ff16151593810193909352600281018054600080516020611d07833981519152959493840191906108b4906119ac565b80601f01602080910402602001604051908101604052809291908181526020018280546108e0906119ac565b801561092d5780601f106109025761010080835404028352916020019161092d565b820191906000526020600020905b81548152906001019060200180831161091057829003601f168201915b505050919092525050815160408301516020909301519099929850965090945050505050565b606061095e82610fdf565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d07833981519152906109a490611022565b9392505050565b8151829082111561023a576040516374eb20a760e01b815260040160405180910390fd5b6109d8836110b5565b600080516020611d078339815191526109f181856110a9565b50604080516060810182528581526000602080830182815283850188815289845260028781019093529490922083518155915160018301805460ff191691151591909117905592519192909190820190610a4b9082611a30565b5090505060005b8251811015610b0257610a9b838281518110610a7057610a70611956565b602002602001015183600301600088815260200190815260200160002061109190919063ffffffff16565b15610ab9576040516302369ff360e41b815260040160405180910390fd5b610af9838281518110610ace57610ace611956565b60200260200101518360030160008881526020019081526020016000206110a990919063ffffffff16565b50600101610a52565b5050505050565b6060600080516020611d07833981519152610b2381611022565b91505090565b610b3282610fdf565b610b3b8261102f565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d0783398151915290610b829083611091565b610b9f576040516333cb039f60e11b815260040160405180910390fd5b6000838152600382016020526040902061079c9083611016565b610bc283610fdf565b60008381527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504302602052604090208251600080516020611d07833981519152919015801590610c2f575080600201604051610c1c9190611af0565b6040518091039020848051906020012014155b15610c445760028101610c428582611a30565b505b600181015460ff16151583151514610b0257600101805460ff191692151592909217909155505050565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190611b82565b600080610d3d610c6e565b90506000610d4a856110eb565b80519091506000610d5961126a565b805190915060005b83811015610e18576000858281518110610d7d57610d7d611956565b60200260200101519050866001600160a01b0316816001600160a01b031603610db05760019750505050505050506109a4565b60005b83811015610e0e57816001600160a01b0316610de7868381518110610dda57610dda611956565b6020026020010151611295565b6001600160a01b031603610e06576000985050505050505050506109a4565b600101610db3565b5050600101610d61565b507fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006000610e657fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931016112a0565b905060005b81811015610fcd5760008381610e8360018301856112aa565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015610f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f309190611b9d565b158015610fad575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401610f6c93929190611bba565b602060405180830381865afa158015610f89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fad9190611b9d565b15610fc457600199505050505050505050506109a4565b50600101610e6a565b5060009b9a5050505050505050505050565b610ff981600080516020611d078339815191525b90611091565b6101875760405163560b4b4160e11b815260040160405180910390fd5b60006109a483836112b6565b606060006109a4836113a9565b60008181527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af5185043026020526040902060010154600080516020611d078339815191529060ff16156101c757604051636ce0028960e11b815260040160405180910390fd5b600081815260018301602052604081205415156109a4565b60006109a48383611405565b6110cd81600080516020611d07833981519152610ff3565b1561018757604051632324f7d960e21b815260040160405180910390fd5b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa158015611160573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111889190810190611c1c565b8051909150600061119a826001611cca565b67ffffffffffffffff8111156111b2576111b26116a2565b6040519080825280602002602001820160405280156111db578160200160208202803683370190505b50905060005b82811015611235578381815181106111fb576111fb611956565b602002602001015182828151811061121557611215611956565b6001600160a01b03909216602092830291909101909101526001016111e1565b508581838151811061124957611249611956565b6001600160a01b039092166020928302919091019091015295945050505050565b60606102497f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611022565b60006101f782611454565b60006101f7825490565b60006109a4838361151f565b6000818152600183016020526040812054801561139f5760006112da600183611cdd565b85549091506000906112ee90600190611cdd565b905080821461135357600086600001828154811061130e5761130e611956565b906000526020600020015490508087600001848154811061133157611331611956565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061136457611364611cf0565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506101f7565b60009150506101f7565b6060816000018054806020026020016040519081016040528092919081815260200182805480156113f957602002820191906000526020600020905b8154815260200190600101908083116113e5575b50505050509050919050565b600081815260018301602052604081205461144c575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556101f7565b5060006101f7565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b8316900361150557816000036114ff57805483106114db57604051636f96cda160e11b815260040160405180910390fd5b5b6000199092016000818152600484016020526040902054909290915081156114dc575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b600082600001828154811061153657611536611956565b9060005260206000200154905092915050565b508054611555906119ac565b6000825580601f10611565575050565b601f01602090049060005260206000209081019061018791905b80821115611593576000815560010161157f565b5090565b6000602082840312156115a957600080fd5b5035919050565b600080604083850312156115c357600080fd5b50508035926020909101359150565b60005b838110156115ed5781810151838201526020016115d5565b50506000910152565b805182526000602080830151151581850152604083015160806040860152805180608087015261162c8160a088018585016115d2565b601f19601f820116860191505060a08101606085015160a087840301606088015281815180845260c0850191508583019450600093505b808410156116835784518252938501936001939093019290850190611663565b50979650505050505050565b6020815260006109a460208301846115f6565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156116e1576116e16116a2565b604052919050565b600082601f8301126116fa57600080fd5b813567ffffffffffffffff811115611714576117146116a2565b611727601f8201601f19166020016116b8565b81815284602083860101111561173c57600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff821115611773576117736116a2565b5060051b60200190565b60008060006060848603121561179257600080fd5b8335925060208085013567ffffffffffffffff808211156117b257600080fd5b6117be888389016116e9565b945060408701359150808211156117d457600080fd5b508501601f810187136117e657600080fd5b80356117f96117f482611759565b6116b8565b81815260059190911b8201830190838101908983111561181857600080fd5b928401925b828410156118365783358252928401929084019061181d565b80955050505050509250925092565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561189c57603f1988860301845261188a8583516115f6565b9450928501929085019060010161186e565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156118e1578351835292840192918401916001016118c5565b50909695505050505050565b801515811461018757600080fd5b60008060006060848603121561191057600080fd5b83359250602084013567ffffffffffffffff81111561192e57600080fd5b61193a868287016116e9565b925050604084013561194b816118ed565b809150509250925092565b634e487b7160e01b600052603260045260246000fd5b6000825161197e8184602087016115d2565b9190910192915050565b805160208083015191908110156114ff5760001960209190910360031b1b16919050565b600181811c908216806119c057607f821691505b6020821081036114ff57634e487b7160e01b600052602260045260246000fd5b601f82111561023a576000816000526020600020601f850160051c81016020861015611a095750805b601f850160051c820191505b81811015611a2857828155600101611a15565b505050505050565b815167ffffffffffffffff811115611a4a57611a4a6116a2565b611a5e81611a5884546119ac565b846119e0565b602080601f831160018114611a935760008415611a7b5750858301515b600019600386901b1c1916600185901b178555611a28565b600085815260208120601f198616915b82811015611ac257888601518255948401946001909101908401611aa3565b5085821015611ae05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354611afe816119ac565b60018281168015611b165760018114611b2b57611b5a565b60ff1984168752821515830287019450611b5a565b8760005260208060002060005b85811015611b515781548a820152908401908201611b38565b50505082870194505b50929695505050505050565b80516001600160a01b0381168114611b7d57600080fd5b919050565b600060208284031215611b9457600080fd5b6109a482611b66565b600060208284031215611baf57600080fd5b81516109a4816118ed565b60006060820185835260206060602085015281865180845260808601915060208801935060005b81811015611c065784516001600160a01b031683529383019391830191600101611be1565b5050809350505050826040830152949350505050565b60006020808385031215611c2f57600080fd5b825167ffffffffffffffff811115611c4657600080fd5b8301601f81018513611c5757600080fd5b8051611c656117f482611759565b81815260059190911b82018301908381019087831115611c8457600080fd5b928401925b82841015611ca957611c9a84611b66565b82529284019290840190611c89565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156101f7576101f7611cb4565b818103818111156101f7576101f7611cb4565b634e487b7160e01b600052603160045260246000fdfe804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504300 \ No newline at end of file diff --git a/packages/generated/v3/abis/Channels.json b/packages/generated/v3/abis/Channels.json new file mode 100644 index 000000000..188f5f841 --- /dev/null +++ b/packages/generated/v3/abis/Channels.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"addRoleToChannel","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"},{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"createChannel","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"},{"name":"metadata","type":"string","internalType":"string"},{"name":"roleIds","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getChannel","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"channel","type":"tuple","internalType":"struct IChannelBase.Channel","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"disabled","type":"bool","internalType":"bool"},{"name":"metadata","type":"string","internalType":"string"},{"name":"roleIds","type":"uint256[]","internalType":"uint256[]"}]}],"stateMutability":"view"},{"type":"function","name":"getChannels","inputs":[],"outputs":[{"name":"channels","type":"tuple[]","internalType":"struct IChannelBase.Channel[]","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"disabled","type":"bool","internalType":"bool"},{"name":"metadata","type":"string","internalType":"string"},{"name":"roleIds","type":"uint256[]","internalType":"uint256[]"}]}],"stateMutability":"view"},{"type":"function","name":"getRolesByChannel","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"roleIds","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"removeChannel","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeRoleFromChannel","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"},{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateChannel","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"},{"name":"metadata","type":"string","internalType":"string"},{"name":"disabled","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"Banned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ChannelCreated","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"channelId","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"ChannelRemoved","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"channelId","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"ChannelRoleAdded","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"channelId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"roleId","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ChannelRoleRemoved","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"channelId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"roleId","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ChannelUpdated","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"channelId","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"ConsecutiveTransfer","inputs":[{"name":"fromTokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"toTokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"SubscriptionUpdate","inputs":[{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"expiration","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unbanned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"ApprovalCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"ApprovalQueryForNonexistentToken","inputs":[]},{"type":"error","name":"BalanceQueryForZeroAddress","inputs":[]},{"type":"error","name":"Banning__AlreadyBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__CannotBanSelf","inputs":[]},{"type":"error","name":"Banning__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__NotBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ChannelService__ChannelAlreadyExists","inputs":[]},{"type":"error","name":"ChannelService__ChannelDisabled","inputs":[]},{"type":"error","name":"ChannelService__ChannelDoesNotExist","inputs":[]},{"type":"error","name":"ChannelService__RoleAlreadyExists","inputs":[]},{"type":"error","name":"ChannelService__RoleDoesNotExist","inputs":[]},{"type":"error","name":"ERC5643__DurationZero","inputs":[]},{"type":"error","name":"ERC5643__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC5643__NotApprovedOrOwner","inputs":[]},{"type":"error","name":"ERC5643__SubscriptionNotRenewable","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Entitlement__InvalidValue","inputs":[]},{"type":"error","name":"Entitlement__NotAllowed","inputs":[]},{"type":"error","name":"Entitlement__NotMember","inputs":[]},{"type":"error","name":"Entitlement__ValueAlreadyExists","inputs":[]},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"MintERC2309QuantityExceedsLimit","inputs":[]},{"type":"error","name":"MintToZeroAddress","inputs":[]},{"type":"error","name":"MintZeroQuantity","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]},{"type":"error","name":"OwnerQueryForNonexistentToken","inputs":[]},{"type":"error","name":"OwnershipNotInitializedForExtraData","inputs":[]},{"type":"error","name":"Pausable__NotPaused","inputs":[]},{"type":"error","name":"Pausable__Paused","inputs":[]},{"type":"error","name":"TransferCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"TransferFromIncorrectOwner","inputs":[]},{"type":"error","name":"TransferToNonERC721ReceiverImplementer","inputs":[]},{"type":"error","name":"TransferToZeroAddress","inputs":[]},{"type":"error","name":"URIQueryForNonexistentToken","inputs":[]},{"type":"error","name":"Validator__InvalidStringLength","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b611d27806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80639575f6ac1161005b5780639575f6ac146100f15780639935218314610106578063b9de615914610126578063ef86d6961461013957600080fd5b806302da0e511461008d57806337644cf7146100a2578063831c2b82146100b5578063921f7175146100de575b600080fd5b6100a061009b366004611597565b61014c565b005b6100a06100b03660046115b0565b61018a565b6100c86100c3366004611597565b6101cb565b6040516100d5919061168f565b60405180910390f35b6100a06100ec36600461177d565b6101fd565b6100f961023f565b6040516100d59190611845565b610119610114366004611597565b61024e565b6040516100d591906118a9565b6100a06101343660046115b0565b610259565b6100a06101473660046118fb565b610296565b61017e6040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b610187816102fb565b50565b6101bd826040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b81525061033c565b6101c78282610363565b5050565b60408051608081018252600080825260208201526060918101829052818101919091526101f7826103ad565b92915050565b61022f6040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b61023a838383610414565b505050565b6060610249610465565b905090565b60606101f78261059d565b61028c826040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b81525061033c565b6101c782826105a8565b6102c86040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b61023a8383836105ea565b6102de600082610627565b61018757604051630ce39a4b60e21b815260040160405180910390fd5b610304816106ab565b60405181815233907f3a3f387aa42656bc1732adfc7aea5cde9ccc05a59f9af9c29ebfa68e66383e939060200160405180910390a250565b6103468282610627565b6101c757604051630ce39a4b60e21b815260040160405180910390fd5b61036d82826107a2565b604080518381526020810183905233917f2b10481523b59a7978f8ab73b237349b0f38c801f6094bdc8994d379c067d71391015b60405180910390a25050565b60408051608081018252600080825260208201526060918101829052818101919091526000806103dc84610833565b925092505060006103ec85610953565b6040805160808101825296875292151560208701529185019290925260608401525090919050565b61041f8260006109ab565b61042a8383836109cf565b60405183815233907fdd6c5b83be3557f8b2674712946f9f05dcd882b82bfd58b9539b9706efd35d8c906020015b60405180910390a2505050565b60606000610471610b09565b90506000815167ffffffffffffffff81111561048f5761048f6116a2565b6040519080825280602002602001820160405280156104e357816020015b60408051608081018252600080825260208201526060918101829052818101919091528152602001906001900390816104ad5790505b50905060005b825181101561059657600080600061051986858151811061050c5761050c611956565b6020026020010151610833565b925092509250600061054387868151811061053657610536611956565b6020026020010151610953565b9050604051806080016040528085815260200183151581526020018481526020018281525086868151811061057a5761057a611956565b60200260200101819052505050505080806001019150506104e9565b5092915050565b60606101f782610953565b6105b28282610b29565b604080518381526020810183905233917faee688d80dbf97230e5d2b4b06aa7074bfe38ddd8abf856551177db30395612991016103a1565b6105f5838383610bb9565b60405183815233907f94af4a611b3fb1eaa653a6b29f82b71bcea25ca378171c5f059010fa18e0716e90602001610458565b60003380610633610c6e565b6001600160a01b031614806106a357507fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff161580156106a357506106a3848285604051602001610686919061196c565b60405160208183030381529060405261069e90611988565b610d32565b949350505050565b6106b481610fdf565b600080516020611d078339815191526106cd8183611016565b5060408051602080820183526000808352858152600280860190925292909220909101906106fb9082611a30565b50600082815260028083016020526040822060018101805460ff19169055828155919061072a90830182611549565b50506000828152600382016020526040812061074590611022565b905060005b815181101561079c5761079382828151811061076857610768611956565b602002602001015184600301600087815260200190815260200160002061101690919063ffffffff16565b5060010161074a565b50505050565b6107ab82610fdf565b6107b48261102f565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d07833981519152906107fb9083611091565b15610819576040516302369ff360e41b815260040160405180910390fd5b6000838152600382016020526040902061079c90836110a9565b60006060600061084284610fdf565b60008481527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430260209081526040808320815160608101835281548152600182015460ff16151593810193909352600281018054600080516020611d07833981519152959493840191906108b4906119ac565b80601f01602080910402602001604051908101604052809291908181526020018280546108e0906119ac565b801561092d5780601f106109025761010080835404028352916020019161092d565b820191906000526020600020905b81548152906001019060200180831161091057829003601f168201915b505050919092525050815160408301516020909301519099929850965090945050505050565b606061095e82610fdf565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d07833981519152906109a490611022565b9392505050565b8151829082111561023a576040516374eb20a760e01b815260040160405180910390fd5b6109d8836110b5565b600080516020611d078339815191526109f181856110a9565b50604080516060810182528581526000602080830182815283850188815289845260028781019093529490922083518155915160018301805460ff191691151591909117905592519192909190820190610a4b9082611a30565b5090505060005b8251811015610b0257610a9b838281518110610a7057610a70611956565b602002602001015183600301600088815260200190815260200160002061109190919063ffffffff16565b15610ab9576040516302369ff360e41b815260040160405180910390fd5b610af9838281518110610ace57610ace611956565b60200260200101518360030160008881526020019081526020016000206110a990919063ffffffff16565b50600101610a52565b5050505050565b6060600080516020611d07833981519152610b2381611022565b91505090565b610b3282610fdf565b610b3b8261102f565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d0783398151915290610b829083611091565b610b9f576040516333cb039f60e11b815260040160405180910390fd5b6000838152600382016020526040902061079c9083611016565b610bc283610fdf565b60008381527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504302602052604090208251600080516020611d07833981519152919015801590610c2f575080600201604051610c1c9190611af0565b6040518091039020848051906020012014155b15610c445760028101610c428582611a30565b505b600181015460ff16151583151514610b0257600101805460ff191692151592909217909155505050565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190611b82565b600080610d3d610c6e565b90506000610d4a856110eb565b80519091506000610d5961126a565b805190915060005b83811015610e18576000858281518110610d7d57610d7d611956565b60200260200101519050866001600160a01b0316816001600160a01b031603610db05760019750505050505050506109a4565b60005b83811015610e0e57816001600160a01b0316610de7868381518110610dda57610dda611956565b6020026020010151611295565b6001600160a01b031603610e06576000985050505050505050506109a4565b600101610db3565b5050600101610d61565b507fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006000610e657fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931016112a0565b905060005b81811015610fcd5760008381610e8360018301856112aa565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015610f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f309190611b9d565b158015610fad575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401610f6c93929190611bba565b602060405180830381865afa158015610f89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fad9190611b9d565b15610fc457600199505050505050505050506109a4565b50600101610e6a565b5060009b9a5050505050505050505050565b610ff981600080516020611d078339815191525b90611091565b6101875760405163560b4b4160e11b815260040160405180910390fd5b60006109a483836112b6565b606060006109a4836113a9565b60008181527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af5185043026020526040902060010154600080516020611d078339815191529060ff16156101c757604051636ce0028960e11b815260040160405180910390fd5b600081815260018301602052604081205415156109a4565b60006109a48383611405565b6110cd81600080516020611d07833981519152610ff3565b1561018757604051632324f7d960e21b815260040160405180910390fd5b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa158015611160573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111889190810190611c1c565b8051909150600061119a826001611cca565b67ffffffffffffffff8111156111b2576111b26116a2565b6040519080825280602002602001820160405280156111db578160200160208202803683370190505b50905060005b82811015611235578381815181106111fb576111fb611956565b602002602001015182828151811061121557611215611956565b6001600160a01b03909216602092830291909101909101526001016111e1565b508581838151811061124957611249611956565b6001600160a01b039092166020928302919091019091015295945050505050565b60606102497f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611022565b60006101f782611454565b60006101f7825490565b60006109a4838361151f565b6000818152600183016020526040812054801561139f5760006112da600183611cdd565b85549091506000906112ee90600190611cdd565b905080821461135357600086600001828154811061130e5761130e611956565b906000526020600020015490508087600001848154811061133157611331611956565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061136457611364611cf0565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506101f7565b60009150506101f7565b6060816000018054806020026020016040519081016040528092919081815260200182805480156113f957602002820191906000526020600020905b8154815260200190600101908083116113e5575b50505050509050919050565b600081815260018301602052604081205461144c575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556101f7565b5060006101f7565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b8316900361150557816000036114ff57805483106114db57604051636f96cda160e11b815260040160405180910390fd5b5b6000199092016000818152600484016020526040902054909290915081156114dc575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b600082600001828154811061153657611536611956565b9060005260206000200154905092915050565b508054611555906119ac565b6000825580601f10611565575050565b601f01602090049060005260206000209081019061018791905b80821115611593576000815560010161157f565b5090565b6000602082840312156115a957600080fd5b5035919050565b600080604083850312156115c357600080fd5b50508035926020909101359150565b60005b838110156115ed5781810151838201526020016115d5565b50506000910152565b805182526000602080830151151581850152604083015160806040860152805180608087015261162c8160a088018585016115d2565b601f19601f820116860191505060a08101606085015160a087840301606088015281815180845260c0850191508583019450600093505b808410156116835784518252938501936001939093019290850190611663565b50979650505050505050565b6020815260006109a460208301846115f6565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156116e1576116e16116a2565b604052919050565b600082601f8301126116fa57600080fd5b813567ffffffffffffffff811115611714576117146116a2565b611727601f8201601f19166020016116b8565b81815284602083860101111561173c57600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff821115611773576117736116a2565b5060051b60200190565b60008060006060848603121561179257600080fd5b8335925060208085013567ffffffffffffffff808211156117b257600080fd5b6117be888389016116e9565b945060408701359150808211156117d457600080fd5b508501601f810187136117e657600080fd5b80356117f96117f482611759565b6116b8565b81815260059190911b8201830190838101908983111561181857600080fd5b928401925b828410156118365783358252928401929084019061181d565b80955050505050509250925092565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561189c57603f1988860301845261188a8583516115f6565b9450928501929085019060010161186e565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156118e1578351835292840192918401916001016118c5565b50909695505050505050565b801515811461018757600080fd5b60008060006060848603121561191057600080fd5b83359250602084013567ffffffffffffffff81111561192e57600080fd5b61193a868287016116e9565b925050604084013561194b816118ed565b809150509250925092565b634e487b7160e01b600052603260045260246000fd5b6000825161197e8184602087016115d2565b9190910192915050565b805160208083015191908110156114ff5760001960209190910360031b1b16919050565b600181811c908216806119c057607f821691505b6020821081036114ff57634e487b7160e01b600052602260045260246000fd5b601f82111561023a576000816000526020600020601f850160051c81016020861015611a095750805b601f850160051c820191505b81811015611a2857828155600101611a15565b505050505050565b815167ffffffffffffffff811115611a4a57611a4a6116a2565b611a5e81611a5884546119ac565b846119e0565b602080601f831160018114611a935760008415611a7b5750858301515b600019600386901b1c1916600185901b178555611a28565b600085815260208120601f198616915b82811015611ac257888601518255948401946001909101908401611aa3565b5085821015611ae05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354611afe816119ac565b60018281168015611b165760018114611b2b57611b5a565b60ff1984168752821515830287019450611b5a565b8760005260208060002060005b85811015611b515781548a820152908401908201611b38565b50505082870194505b50929695505050505050565b80516001600160a01b0381168114611b7d57600080fd5b919050565b600060208284031215611b9457600080fd5b6109a482611b66565b600060208284031215611baf57600080fd5b81516109a4816118ed565b60006060820185835260206060602085015281865180845260808601915060208801935060005b81811015611c065784516001600160a01b031683529383019391830191600101611be1565b5050809350505050826040830152949350505050565b60006020808385031215611c2f57600080fd5b825167ffffffffffffffff811115611c4657600080fd5b8301601f81018513611c5757600080fd5b8051611c656117f482611759565b81815260059190911b82018301908381019087831115611c8457600080fd5b928401925b82841015611ca957611c9a84611b66565b82529284019290840190611c89565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156101f7576101f7611cb4565b818103818111156101f7576101f7611cb4565b634e487b7160e01b600052603160045260246000fdfe804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504300","sourceMap":"398:1449:165:-:0;;;;;;;;;;;;-1:-1:-1;385:22:49;:20;:22::i;:::-;398:1449:165;;1653:314:63;303:66:64;1779:14:63;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:63;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:63;1898:16;1886:28;;;;;1927:29;;158:42:375;;;1927:29:63;;146:2:375;131:18;1927:29:63;;;;;;;1844:119;1694:273;1653:314::o;14:192:375:-;398:1449:165;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100885760003560e01c80639575f6ac1161005b5780639575f6ac146100f15780639935218314610106578063b9de615914610126578063ef86d6961461013957600080fd5b806302da0e511461008d57806337644cf7146100a2578063831c2b82146100b5578063921f7175146100de575b600080fd5b6100a061009b366004611597565b61014c565b005b6100a06100b03660046115b0565b61018a565b6100c86100c3366004611597565b6101cb565b6040516100d5919061168f565b60405180910390f35b6100a06100ec36600461177d565b6101fd565b6100f961023f565b6040516100d59190611845565b610119610114366004611597565b61024e565b6040516100d591906118a9565b6100a06101343660046115b0565b610259565b6100a06101473660046118fb565b610296565b61017e6040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b610187816102fb565b50565b6101bd826040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b81525061033c565b6101c78282610363565b5050565b60408051608081018252600080825260208201526060918101829052818101919091526101f7826103ad565b92915050565b61022f6040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b61023a838383610414565b505050565b6060610249610465565b905090565b60606101f78261059d565b61028c826040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b81525061033c565b6101c782826105a8565b6102c86040518060400160405280601181526020017041646452656d6f76654368616e6e656c7360781b8152506102d3565b61023a8383836105ea565b6102de600082610627565b61018757604051630ce39a4b60e21b815260040160405180910390fd5b610304816106ab565b60405181815233907f3a3f387aa42656bc1732adfc7aea5cde9ccc05a59f9af9c29ebfa68e66383e939060200160405180910390a250565b6103468282610627565b6101c757604051630ce39a4b60e21b815260040160405180910390fd5b61036d82826107a2565b604080518381526020810183905233917f2b10481523b59a7978f8ab73b237349b0f38c801f6094bdc8994d379c067d71391015b60405180910390a25050565b60408051608081018252600080825260208201526060918101829052818101919091526000806103dc84610833565b925092505060006103ec85610953565b6040805160808101825296875292151560208701529185019290925260608401525090919050565b61041f8260006109ab565b61042a8383836109cf565b60405183815233907fdd6c5b83be3557f8b2674712946f9f05dcd882b82bfd58b9539b9706efd35d8c906020015b60405180910390a2505050565b60606000610471610b09565b90506000815167ffffffffffffffff81111561048f5761048f6116a2565b6040519080825280602002602001820160405280156104e357816020015b60408051608081018252600080825260208201526060918101829052818101919091528152602001906001900390816104ad5790505b50905060005b825181101561059657600080600061051986858151811061050c5761050c611956565b6020026020010151610833565b925092509250600061054387868151811061053657610536611956565b6020026020010151610953565b9050604051806080016040528085815260200183151581526020018481526020018281525086868151811061057a5761057a611956565b60200260200101819052505050505080806001019150506104e9565b5092915050565b60606101f782610953565b6105b28282610b29565b604080518381526020810183905233917faee688d80dbf97230e5d2b4b06aa7074bfe38ddd8abf856551177db30395612991016103a1565b6105f5838383610bb9565b60405183815233907f94af4a611b3fb1eaa653a6b29f82b71bcea25ca378171c5f059010fa18e0716e90602001610458565b60003380610633610c6e565b6001600160a01b031614806106a357507fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff161580156106a357506106a3848285604051602001610686919061196c565b60405160208183030381529060405261069e90611988565b610d32565b949350505050565b6106b481610fdf565b600080516020611d078339815191526106cd8183611016565b5060408051602080820183526000808352858152600280860190925292909220909101906106fb9082611a30565b50600082815260028083016020526040822060018101805460ff19169055828155919061072a90830182611549565b50506000828152600382016020526040812061074590611022565b905060005b815181101561079c5761079382828151811061076857610768611956565b602002602001015184600301600087815260200190815260200160002061101690919063ffffffff16565b5060010161074a565b50505050565b6107ab82610fdf565b6107b48261102f565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d07833981519152906107fb9083611091565b15610819576040516302369ff360e41b815260040160405180910390fd5b6000838152600382016020526040902061079c90836110a9565b60006060600061084284610fdf565b60008481527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430260209081526040808320815160608101835281548152600182015460ff16151593810193909352600281018054600080516020611d07833981519152959493840191906108b4906119ac565b80601f01602080910402602001604051908101604052809291908181526020018280546108e0906119ac565b801561092d5780601f106109025761010080835404028352916020019161092d565b820191906000526020600020905b81548152906001019060200180831161091057829003601f168201915b505050919092525050815160408301516020909301519099929850965090945050505050565b606061095e82610fdf565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d07833981519152906109a490611022565b9392505050565b8151829082111561023a576040516374eb20a760e01b815260040160405180910390fd5b6109d8836110b5565b600080516020611d078339815191526109f181856110a9565b50604080516060810182528581526000602080830182815283850188815289845260028781019093529490922083518155915160018301805460ff191691151591909117905592519192909190820190610a4b9082611a30565b5090505060005b8251811015610b0257610a9b838281518110610a7057610a70611956565b602002602001015183600301600088815260200190815260200160002061109190919063ffffffff16565b15610ab9576040516302369ff360e41b815260040160405180910390fd5b610af9838281518110610ace57610ace611956565b60200260200101518360030160008881526020019081526020016000206110a990919063ffffffff16565b50600101610a52565b5050505050565b6060600080516020611d07833981519152610b2381611022565b91505090565b610b3282610fdf565b610b3b8261102f565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430360205260409020600080516020611d0783398151915290610b829083611091565b610b9f576040516333cb039f60e11b815260040160405180910390fd5b6000838152600382016020526040902061079c9083611016565b610bc283610fdf565b60008381527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504302602052604090208251600080516020611d07833981519152919015801590610c2f575080600201604051610c1c9190611af0565b6040518091039020848051906020012014155b15610c445760028101610c428582611a30565b505b600181015460ff16151583151514610b0257600101805460ff191692151592909217909155505050565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190611b82565b600080610d3d610c6e565b90506000610d4a856110eb565b80519091506000610d5961126a565b805190915060005b83811015610e18576000858281518110610d7d57610d7d611956565b60200260200101519050866001600160a01b0316816001600160a01b031603610db05760019750505050505050506109a4565b60005b83811015610e0e57816001600160a01b0316610de7868381518110610dda57610dda611956565b6020026020010151611295565b6001600160a01b031603610e06576000985050505050505050506109a4565b600101610db3565b5050600101610d61565b507fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006000610e657fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931016112a0565b905060005b81811015610fcd5760008381610e8360018301856112aa565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015610f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f309190611b9d565b158015610fad575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401610f6c93929190611bba565b602060405180830381865afa158015610f89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fad9190611b9d565b15610fc457600199505050505050505050506109a4565b50600101610e6a565b5060009b9a5050505050505050505050565b610ff981600080516020611d078339815191525b90611091565b6101875760405163560b4b4160e11b815260040160405180910390fd5b60006109a483836112b6565b606060006109a4836113a9565b60008181527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af5185043026020526040902060010154600080516020611d078339815191529060ff16156101c757604051636ce0028960e11b815260040160405180910390fd5b600081815260018301602052604081205415156109a4565b60006109a48383611405565b6110cd81600080516020611d07833981519152610ff3565b1561018757604051632324f7d960e21b815260040160405180910390fd5b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa158015611160573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111889190810190611c1c565b8051909150600061119a826001611cca565b67ffffffffffffffff8111156111b2576111b26116a2565b6040519080825280602002602001820160405280156111db578160200160208202803683370190505b50905060005b82811015611235578381815181106111fb576111fb611956565b602002602001015182828151811061121557611215611956565b6001600160a01b03909216602092830291909101909101526001016111e1565b508581838151811061124957611249611956565b6001600160a01b039092166020928302919091019091015295945050505050565b60606102497f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611022565b60006101f782611454565b60006101f7825490565b60006109a4838361151f565b6000818152600183016020526040812054801561139f5760006112da600183611cdd565b85549091506000906112ee90600190611cdd565b905080821461135357600086600001828154811061130e5761130e611956565b906000526020600020015490508087600001848154811061133157611331611956565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061136457611364611cf0565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506101f7565b60009150506101f7565b6060816000018054806020026020016040519081016040528092919081815260200182805480156113f957602002820191906000526020600020905b8154815260200190600101908083116113e5575b50505050509050919050565b600081815260018301602052604081205461144c575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556101f7565b5060006101f7565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b8316900361150557816000036114ff57805483106114db57604051636f96cda160e11b815260040160405180910390fd5b5b6000199092016000818152600484016020526040902054909290915081156114dc575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b600082600001828154811061153657611536611956565b9060005260206000200154905092915050565b508054611555906119ac565b6000825580601f10611565575050565b601f01602090049060005260206000209081019061018791905b80821115611593576000815560010161157f565b5090565b6000602082840312156115a957600080fd5b5035919050565b600080604083850312156115c357600080fd5b50508035926020909101359150565b60005b838110156115ed5781810151838201526020016115d5565b50506000910152565b805182526000602080830151151581850152604083015160806040860152805180608087015261162c8160a088018585016115d2565b601f19601f820116860191505060a08101606085015160a087840301606088015281815180845260c0850191508583019450600093505b808410156116835784518252938501936001939093019290850190611663565b50979650505050505050565b6020815260006109a460208301846115f6565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156116e1576116e16116a2565b604052919050565b600082601f8301126116fa57600080fd5b813567ffffffffffffffff811115611714576117146116a2565b611727601f8201601f19166020016116b8565b81815284602083860101111561173c57600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff821115611773576117736116a2565b5060051b60200190565b60008060006060848603121561179257600080fd5b8335925060208085013567ffffffffffffffff808211156117b257600080fd5b6117be888389016116e9565b945060408701359150808211156117d457600080fd5b508501601f810187136117e657600080fd5b80356117f96117f482611759565b6116b8565b81815260059190911b8201830190838101908983111561181857600080fd5b928401925b828410156118365783358252928401929084019061181d565b80955050505050509250925092565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561189c57603f1988860301845261188a8583516115f6565b9450928501929085019060010161186e565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156118e1578351835292840192918401916001016118c5565b50909695505050505050565b801515811461018757600080fd5b60008060006060848603121561191057600080fd5b83359250602084013567ffffffffffffffff81111561192e57600080fd5b61193a868287016116e9565b925050604084013561194b816118ed565b809150509250925092565b634e487b7160e01b600052603260045260246000fd5b6000825161197e8184602087016115d2565b9190910192915050565b805160208083015191908110156114ff5760001960209190910360031b1b16919050565b600181811c908216806119c057607f821691505b6020821081036114ff57634e487b7160e01b600052602260045260246000fd5b601f82111561023a576000816000526020600020601f850160051c81016020861015611a095750805b601f850160051c820191505b81811015611a2857828155600101611a15565b505050505050565b815167ffffffffffffffff811115611a4a57611a4a6116a2565b611a5e81611a5884546119ac565b846119e0565b602080601f831160018114611a935760008415611a7b5750858301515b600019600386901b1c1916600185901b178555611a28565b600085815260208120601f198616915b82811015611ac257888601518255948401946001909101908401611aa3565b5085821015611ae05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354611afe816119ac565b60018281168015611b165760018114611b2b57611b5a565b60ff1984168752821515830287019450611b5a565b8760005260208060002060005b85811015611b515781548a820152908401908201611b38565b50505082870194505b50929695505050505050565b80516001600160a01b0381168114611b7d57600080fd5b919050565b600060208284031215611b9457600080fd5b6109a482611b66565b600060208284031215611baf57600080fd5b81516109a4816118ed565b60006060820185835260206060602085015281865180845260808601915060208801935060005b81811015611c065784516001600160a01b031683529383019391830191600101611be1565b5050809350505050826040830152949350505050565b60006020808385031215611c2f57600080fd5b825167ffffffffffffffff811115611c4657600080fd5b8301601f81018513611c5757600080fd5b8051611c656117f482611759565b81815260059190911b82018301908381019087831115611c8457600080fd5b928401925b82841015611ca957611c9a84611b66565b82529284019290840190611c89565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156101f7576101f7611cb4565b818103818111156101f7576101f7611cb4565b634e487b7160e01b600052603160045260246000fdfe804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504300","sourceMap":"398:1449:165:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1157:140;;;;;;:::i;:::-;;:::i;:::-;;1301:188;;;;;;:::i;:::-;;:::i;691:134::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;462:225;;;;;;:::i;:::-;;:::i;829:105::-;;;:::i;:::-;;;;;;;:::i;1493:150::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1647:198::-;;;;;;:::i;:::-;;:::i;938:215::-;;;;;;:::i;:::-;;:::i;1157:140::-;1214:47;1234:26;;;;;;;;;;;;;-1:-1:-1;;;1234:26:165;;;1214:19;:47::i;:::-;1267:25;1282:9;1267:14;:25::i;:::-;1157:140;:::o;1301:188::-;1377:65;1404:9;1415:26;;;;;;;;;;;;;-1:-1:-1;;;1415:26:165;;;1377;:65::i;:::-;1448:36;1466:9;1477:6;1448:17;:36::i;:::-;1301:188;;:::o;691:134::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;798:22:165;810:9;798:11;:22::i;:::-;791:29;691:134;-1:-1:-1;;691:134:165:o;462:225::-;585:47;605:26;;;;;;;;;;;;;-1:-1:-1;;;605:26:165;;;585:19;:47::i;:::-;638:44;653:9;664:8;674:7;638:14;:44::i;:::-;462:225;;;:::o;829:105::-;875:25;915:14;:12;:14::i;:::-;908:21;;829:105;:::o;1493:150::-;1570:24;1609:29;1628:9;1609:18;:29::i;1647:198::-;1728:65;1755:9;1766:26;;;;;;;;;;;;;-1:-1:-1;;;1766:26:165;;;1728;:65::i;:::-;1799:41;1822:9;1833:6;1799:22;:41::i;938:215::-;1050:47;1070:26;;;;;;;;;;;;;-1:-1:-1;;;1070:26:165;;;1050:19;:47::i;:::-;1103:45;1118:9;1129:8;1139;1103:14;:45::i;3809:164:156:-;3889:31;1445:3;3909:10;3889;:31::i;:::-;3884:85;;3937:25;;-1:-1:-1;;;3937:25:156;;;;;;;;;;;1883:150:162;1941:39;1970:9;1941:28;:39::i;:::-;1991:37;;6633:25:375;;;2006:10:162;;1991:37;;6621:2:375;6606:18;1991:37:162;;;;;;;1883:150;:::o;4340:204:156:-;4458:33;4469:9;4480:10;4458;:33::i;:::-;4453:87;;4508:25;;-1:-1:-1;;;4508:25:156;;;;;;;;;;;2198:190:162;2275:50;2307:9;2318:6;2275:31;:50::i;:::-;2336:47;;;6843:25:375;;;6899:2;6884:18;;6877:34;;;2353:10:162;;2336:47;;6816:18:375;2336:47:162;;;;;;;;2198:190;;:::o;595:417::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;699:22:162;723:13;740:48;773:9;740:25;:48::i;:::-;696:92;;;;;795:24;822:43;855:9;822:32;:43::i;:::-;885:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;885:122:162;;595:417;-1:-1:-1;595:417:162:o;316:275::-;440:34;462:8;472:1;440:21;:34::i;:::-;480:58;509:9;520:8;530:7;480:28;:58::i;:::-;549:37;;6633:25:375;;;564:10:162;;549:37;;6621:2:375;6606:18;549:37:162;;;;;;;;316:275;;;:::o;1016:634::-;1063:16;1087:27;1117:30;:28;:30::i;:::-;1087:60;;1154:25;1196:10;:17;1182:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1182:32:162;;;;;;;;;;;;;;;;1154:60;;1226:9;1221:403;1245:10;:17;1241:1;:21;1221:403;;;1278:10;1290:22;1314:13;1331:49;1366:10;1377:1;1366:13;;;;;;;;:::i;:::-;;;;;;;1331:34;:49::i;:::-;1277:103;;;;;;1389:24;1416:63;1458:10;1469:1;1458:13;;;;;;;;:::i;:::-;;;;;;;1416:32;:63::i;:::-;1389:90;;1502:115;;;;;;;;1524:2;1502:115;;;;1546:8;1502:115;;;;;;1574:8;1502:115;;;;1601:7;1502:115;;;1488:8;1497:1;1488:11;;;;;;;;:::i;:::-;;;;;;:129;;;;1269:355;;;;1264:3;;;;;;;1221:403;;;-1:-1:-1;1637:8:162;1016:634;-1:-1:-1;;1016:634:162:o;2037:157::-;2115:16;2146:43;2179:9;2146:32;:43::i;2392:202::-;2474:55;2511:9;2522:6;2474:36;:55::i;:::-;2540:49;;;6843:25:375;;;6899:2;6884:18;;6877:34;;;2559:10:162;;2540:49;;6816:18:375;2540:49:162;6669:248:375;1654:225:162;1767:59;1796:9;1807:8;1817;1767:28;:59::i;:::-;1837:37;;6633:25:375;;;1852:10:162;;1837:37;;6621:2:375;6606:18;1837:37:162;6487:177:375;3520:285:156;3620:4;3649:10;;3679:8;:6;:8::i;:::-;-1:-1:-1;;;;;3679:18:156;;:121;;;-1:-1:-1;293:66:89;526:31:87;;;3708:10:156;:91;;;;;3730:69;3742:9;3753:6;3786:10;3769:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;3761:37;;;:::i;:::-;3730:11;:69::i;:::-;3666:134;3520:285;-1:-1:-1;;;;3520:285:156:o;2492:579:163:-;2549:29;2568:9;2549:18;:29::i;:::-;-1:-1:-1;;;;;;;;;;;2655:36:163;377:66:164;2681:9:163;2655:25;:36::i;:::-;-1:-1:-1;2697:44:163;;;;;;;;;-1:-1:-1;2697:44:163;;;:30;;;:19;;;;:30;;;;;;;:39;;;;:44;;:39;:44;:::i;:::-;-1:-1:-1;2789:5:163;2747:30;;;:19;;;;:30;;;;;:39;;;:47;;-1:-1:-1;;2747:47:163;;;2800:37;;;2747:30;2789:5;2800:37;;;;2789:5;2800:37;:::i;:::-;-1:-1:-1;;2881:22:163;2906:35;;;:24;;;:35;;;;;:44;;:42;:44::i;:::-;2881:69;;2962:9;2957:110;2981:5;:12;2977:1;:16;2957:110;;;3008:52;3051:5;3057:1;3051:8;;;;;;;;:::i;:::-;;;;;;;3008:7;:24;;:35;3033:9;3008:35;;;;;;;;;;;:42;;:52;;;;:::i;:::-;-1:-1:-1;2995:3:163;;2957:110;;;;2543:528;;2492:579;:::o;4059:438::-;4135:29;4154:9;4135:18;:29::i;:::-;4170:34;4194:9;4170:23;:34::i;:::-;4211:37;4328:35;;;:24;:35;;;;;-1:-1:-1;;;;;;;;;;;377:66:164;4328:52:163;;4373:6;4328:44;:52::i;:::-;4324:115;;;4397:35;;-1:-1:-1;;;4397:35:163;;;;;;;;;;;4324:115;4445:35;;;;:24;;;:35;;;;;:47;;4485:6;4445:39;:47::i;1511:411::-;1581:10;1593:22;1617:13;1638:29;1657:9;1638:18;:29::i;:::-;1674:37;1787:30;;;:19;:30;;;;;;;;1743:74;;;;;;;;;;;;;;;;;;;;;;;;;;1787:19;1743:74;;;;-1:-1:-1;;;;;;;;;;;377:66:164;1674:37:163;1743:74;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1743:74:163;;;;-1:-1:-1;;1829:14:163;;1860:20;;;;1897;;;;;1829:14;;1860:20;;-1:-1:-1;1897:20:163;-1:-1:-1;1511:411:163;;-1:-1:-1;;;;;1511:411:163:o;4943:262::-;5020:16;5044:29;5063:9;5044:18;:29::i;:::-;5080:37;5156:35;;;:24;:35;;;;;-1:-1:-1;;;;;;;;;;;377:66:164;5156:44:163;;:42;:44::i;:::-;5149:51;4943:262;-1:-1:-1;;;4943:262:163:o;425:183:222:-;541:15;;526:4;;541:21;-1:-1:-1;537:66:222;;;571:32;;-1:-1:-1;;;571:32:222;;;;;;;;;;;821:686:163;944:23;957:9;944:12;:23::i;:::-;-1:-1:-1;;;;;;;;;;;1044:33:163;377:66:164;1067:9:163;1044:22;:33::i;:::-;-1:-1:-1;1116:100:163;;;;;;;;;;;-1:-1:-1;1116:100:163;;;;;;;;;;;;;1083:30;;;:19;;;;:30;;;;;;;:133;;;;;;1116:100;1083:133;;;;-1:-1:-1;;1083:133:163;;;;;;;;;;;;1116:100;;1083:30;;:133;;;;;;;;:::i;:::-;;;;;1228:9;1223:280;1247:7;:14;1243:1;:18;1223:280;;;1329:56;1374:7;1382:1;1374:10;;;;;;;;:::i;:::-;;;;;;;1329:7;:24;;:35;1354:9;1329:35;;;;;;;;;;;:44;;:56;;;;:::i;:::-;1325:112;;;1402:35;;-1:-1:-1;;;1402:35:163;;;;;;;;;;;1325:112;1445:51;1485:7;1493:1;1485:10;;;;;;;;:::i;:::-;;;;;;;1445:7;:24;;:35;1470:9;1445:35;;;;;;;;;;;:39;;:51;;;;:::i;:::-;-1:-1:-1;1263:3:163;;1223:280;;;;938:569;821:686;;;:::o;3075:180::-;3123:16;-1:-1:-1;;;;;;;;;;;3223:27:163;377:66:164;3223:25:163;:27::i;:::-;3216:34;;;3075:180;:::o;4501:438::-;4582:29;4601:9;4582:18;:29::i;:::-;4617:34;4641:9;4617:23;:34::i;:::-;4657:37;4768:35;;;:24;:35;;;;;-1:-1:-1;;;;;;;;;;;377:66:164;4768:52:163;;4813:6;4768:44;:52::i;:::-;4763:115;;4837:34;;-1:-1:-1;;;4837:34:163;;;;;;;;;;;4763:115;4884:35;;;;:24;;;:35;;;;;:50;;4927:6;4884:42;:50::i;1926:562::-;2038:29;2057:9;2038:18;:29::i;:::-;2074:37;2189:30;;;:19;:30;;;;;2237:22;;-1:-1:-1;;;;;;;;;;;377:66:164;2189:30:163;2237:26;;;;:104;;;2319:11;:20;;2303:38;;;;;;:::i;:::-;;;;;;;;2289:8;2273:26;;;;;;:68;;2237:104;2226:168;;;2356:20;;;:31;2379:8;2356:20;:31;:::i;:::-;;2226:168;2404:20;;;;;;:32;;;;;;2400:84;;2446:20;;:31;;-1:-1:-1;;2446:31:163;;;;;;;;;;;-1:-1:-1;;;1926:562:163:o;724:189:83:-;786:67;;;;;;;;302:66:85;786:67:83;-1:-1:-1;;;;;786:67:83;;;;;;;;;;;;;866:42;;-1:-1:-1;;;866:42:83;;;;;6633:25:375;;;;866:42:83;;765:13;;866:30;;6606:18:375;;;;;866:42:83;;;;;;786:67;866:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1566:1252:156:-;1679:4;1691:13;1707:8;:6;:8::i;:::-;1691:24;;1722;1749:31;1775:4;1749:25;:31::i;:::-;1816:14;;1722:58;;-1:-1:-1;1786:27:156;1869:17;:15;:17::i;:::-;1918:19;;1837:49;;-1:-1:-1;1892:23:156;1944:320;1968:19;1964:1;:23;1944:320;;;2002:14;2019:7;2027:1;2019:10;;;;;;;;:::i;:::-;;;;;;;2002:27;;2052:5;-1:-1:-1;;;;;2042:15:156;:6;-1:-1:-1;;;;;2042:15:156;;2038:51;;2076:4;2069:11;;;;;;;;;;;2038:51;2127:9;2122:136;2142:15;2138:1;:19;2122:136;;;2207:6;-1:-1:-1;;;;;2178:35:156;:25;2187:12;2200:1;2187:15;;;;;;;;:::i;:::-;;;;;;;2178:8;:25::i;:::-;-1:-1:-1;;;;;2178:35:156;;2174:76;;2234:5;2227:12;;;;;;;;;;;;2174:76;2159:3;;2122:136;;;-1:-1:-1;;1989:3:156;;1944:320;;;-1:-1:-1;483:66:175;2308:44:156;2432:24;:15;:22;:24::i;:::-;2403:53;;2468:9;2463:332;2487:18;2483:1;:22;2463:332;;;2520:47;2570:2;2520:47;2603:21;:15;;;2622:1;2603:18;:21::i;:::-;-1:-1:-1;;;;;2570:62:156;;;;;;;;;;;;;;;;;-1:-1:-1;2570:62:156;2520:112;;;;;;;;;;;;;;;;-1:-1:-1;;;2520:112:156;;;;;;;;;;-1:-1:-1;;;2520:112:156;;;;;;;;;;;;2654:28;;-1:-1:-1;;;2654:28:156;;;;2520:112;;-1:-1:-1;2520:112:156;;2654:26;;:28;;;;;;;;;;;2520:112;2654:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2653:29;:97;;;;;2694:1;:13;;;-1:-1:-1;;;;;2694:24:156;;2719:9;2730:7;2739:10;2694:56;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2640:149;;;2776:4;2769:11;;;;;;;;;;;;;2640:149;-1:-1:-1;2507:3:156;;2463:332;;;-1:-1:-1;2808:5:156;;1566:1252;-1:-1:-1;;;;;;;;;;;1566:1252:156:o;5855:224:163:-;5960:54;6004:9;-1:-1:-1;;;;;;;;;;;5960:23:163;:34;:43;:54::i;:::-;5955:120;;6031:37;;-1:-1:-1;;;6031:37:163;;;;;;;;;;;6221:129:327;6294:4;6317:26;6325:3;6337:5;6317:7;:26::i;12671:297::-;12731:16;12759:22;12784:19;12792:3;12784:7;:19::i;5383:246:163:-;5455:37;5529:30;;;:19;:30;;;;;:39;;;-1:-1:-1;;;;;;;;;;;377:66:164;5529:39:163;;5525:100;;;5585:33;;-1:-1:-1;;;5585:33:163;;;;;;;;;;;11317:144:327;11394:4;4360:21;;;:14;;;:21;;;;;;:26;;11417:37;4264:129;10804;10871:4;10894:32;10899:3;10919:5;10894:4;:32::i;5633:218:163:-;5731:54;5775:9;-1:-1:-1;;;;;;;;;;;5731:23:163;721:141:164;5731:54:163;5727:120;;;5802:38;;-1:-1:-1;;;5802:38:163;;;;;;;;;;;4548:533:156;4628:16;4652:14;294:66:188;4681:39:156;;;4760:28;;-1:-1:-1;;;4760:28:156;;-1:-1:-1;;;;;12877:32:375;;;4760:28:156;;;12859:51:375;4681:39:156;;;;-1:-1:-1;4681:39:156;;;;4760:22;;12832:18:375;;4760:28:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4760:28:156;;;;;;;;;;;;:::i;:::-;4824:20;;4727:61;;-1:-1:-1;4794:27:156;4892:23;4824:20;4914:1;4892:23;:::i;:::-;4878:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4878:38:156;;4851:65;;4927:9;4922:94;4946:19;4942:1;:23;4922:94;;;4993:13;5007:1;4993:16;;;;;;;;:::i;:::-;;;;;;;4980:7;4988:1;4980:10;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4980:29:156;;;:10;;;;;;;;;;;:29;4967:3;;4922:94;;;;5052:4;5021:7;5029:19;5021:28;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5021:35:156;;;:28;;;;;;;;;;;:35;5069:7;4548:533;-1:-1:-1;;;;;4548:533:156:o;1228:128:159:-;1278:16;1309:42;377:66:160;1309:40:159;:42::i;22045:138:105:-;22111:7;22149:27;22168:7;22149:18;:27::i;9117:115:327:-;9180:7;9206:19;9214:3;4556:18;;4474:107;9574:156;9648:7;9698:22;9702:3;9714:5;9698:3;:22::i;2815:1368::-;2881:4;3010:21;;;:14;;;:21;;;;;;3046:13;;3042:1135;;3413:18;3434:12;3445:1;3434:8;:12;:::i;:::-;3480:18;;3413:33;;-1:-1:-1;3460:17:327;;3480:22;;3501:1;;3480:22;:::i;:::-;3460:42;;3535:9;3521:10;:23;3517:378;;3564:17;3584:3;:11;;3596:9;3584:22;;;;;;;;:::i;:::-;;;;;;;;;3564:42;;3731:9;3705:3;:11;;3717:10;3705:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;3844:25;;;:14;;;:25;;;;;:36;;;3517:378;3973:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4076:3;:14;;:21;4091:5;4076:21;;;;;;;;;;;4069:28;;;4119:4;4112:11;;;;;;;3042:1135;4161:5;4154:12;;;;;5581:109;5637:16;5672:3;:11;;5665:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5581:109;;;:::o;2241:406::-;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:327;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:327;2618:12;;7836:1501:105;7974:32;8050:29;;;:20;:29;;;;;;;300:66:107;;-1:-1:-1;;;8115:24:105;;:29;;8111:1172;;8236:6;8246:1;8236:11;8232:791;;8276:16;;8265:27;;8261:83;;8313:31;;-1:-1:-1;;;8313:31:105;;;;;;;;;;;8261:83;8831:182;-1:-1:-1;;8910:9:105;;;8889:31;;;;:20;;;:31;;;;;;8910:9;;8889:31;;-1:-1:-1;8948:25:105;;8831:182;8948:25;;8987:13;7836:1501;;;:::o;8111:1172::-;7966:1323;9301:31;;-1:-1:-1;;;9301:31:105;;;;;;;;;;;4923:118:327;4990:7;5016:3;:11;;5028:5;5016:18;;;;;;;;:::i;:::-;;;;;;;;;5009:25;;4923:118;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:180:375:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:375;;14:180;-1:-1:-1;14:180:375:o;199:248::-;267:6;275;328:2;316:9;307:7;303:23;299:32;296:52;;;344:1;341;334:12;296:52;-1:-1:-1;;367:23:375;;;437:2;422:18;;;409:32;;-1:-1:-1;199:248:375:o;452:250::-;537:1;547:113;561:6;558:1;555:13;547:113;;;637:11;;;631:18;618:11;;;611:39;583:2;576:10;547:113;;;-1:-1:-1;;694:1:375;676:16;;669:27;452:250::o;707:1057::-;793:5;787:12;782:3;775:25;757:3;819:4;884:2;877:5;873:14;867:21;860:29;853:37;848:2;843:3;839:12;832:59;937:4;930:5;926:16;920:23;975:4;968;963:3;959:14;952:28;1009:12;1003:19;1054:6;1047:4;1042:3;1038:14;1031:30;1070:80;1143:6;1137:3;1132;1128:13;1123:2;1109:12;1105:21;1070:80;:::i;:::-;1203:2;1199:7;1194:2;1186:6;1182:15;1178:29;1173:3;1169:39;1159:49;;;1238:3;1234:2;1230:12;1290:4;1283:5;1279:16;1273:23;1346:3;1340;1336:2;1332:12;1328:22;1321:4;1316:3;1312:14;1305:46;1373:5;1409:14;1403:21;1447:8;1440:5;1433:23;1482:3;1478:2;1474:12;1465:21;;1529:2;1513:14;1509:23;1495:37;;1550:1;1541:10;;1560:177;1574:8;1571:1;1568:15;1560:177;;;1639:13;;1625:28;;1712:15;;;;1598:1;1591:9;;;;;1675:14;;;;1560:177;;;-1:-1:-1;1753:5:375;707:1057;-1:-1:-1;;;;;;;707:1057:375:o;1769:260::-;1950:2;1939:9;1932:21;1913:4;1970:53;2019:2;2008:9;2004:18;1996:6;1970:53;:::i;2034:127::-;2095:10;2090:3;2086:20;2083:1;2076:31;2126:4;2123:1;2116:15;2150:4;2147:1;2140:15;2166:275;2237:2;2231:9;2302:2;2283:13;;-1:-1:-1;;2279:27:375;2267:40;;2337:18;2322:34;;2358:22;;;2319:62;2316:88;;;2384:18;;:::i;:::-;2420:2;2413:22;2166:275;;-1:-1:-1;2166:275:375:o;2446:531::-;2489:5;2542:3;2535:4;2527:6;2523:17;2519:27;2509:55;;2560:1;2557;2550:12;2509:55;2596:6;2583:20;2622:18;2618:2;2615:26;2612:52;;;2644:18;;:::i;:::-;2688:55;2731:2;2712:13;;-1:-1:-1;;2708:27:375;2737:4;2704:38;2688:55;:::i;:::-;2768:2;2759:7;2752:19;2814:3;2807:4;2802:2;2794:6;2790:15;2786:26;2783:35;2780:55;;;2831:1;2828;2821:12;2780:55;2896:2;2889:4;2881:6;2877:17;2870:4;2861:7;2857:18;2844:55;2944:1;2919:16;;;2937:4;2915:27;2908:38;;;;2923:7;2446:531;-1:-1:-1;;;2446:531:375:o;2982:183::-;3042:4;3075:18;3067:6;3064:30;3061:56;;;3097:18;;:::i;:::-;-1:-1:-1;3142:1:375;3138:14;3154:4;3134:25;;2982:183::o;3170:1180::-;3282:6;3290;3298;3351:2;3339:9;3330:7;3326:23;3322:32;3319:52;;;3367:1;3364;3357:12;3319:52;3403:9;3390:23;3380:33;;3432:2;3485;3474:9;3470:18;3457:32;3508:18;3549:2;3541:6;3538:14;3535:34;;;3565:1;3562;3555:12;3535:34;3588:50;3630:7;3621:6;3610:9;3606:22;3588:50;:::i;:::-;3578:60;;3691:2;3680:9;3676:18;3663:32;3647:48;;3720:2;3710:8;3707:16;3704:36;;;3736:1;3733;3726:12;3704:36;-1:-1:-1;3759:24:375;;3814:4;3806:13;;3802:27;-1:-1:-1;3792:55:375;;3843:1;3840;3833:12;3792:55;3879:2;3866:16;3902:60;3918:43;3958:2;3918:43;:::i;:::-;3902:60;:::i;:::-;3996:15;;;4078:1;4074:10;;;;4066:19;;4062:28;;;4027:12;;;;4102:19;;;4099:39;;;4134:1;4131;4124:12;4099:39;4158:11;;;;4178:142;4194:6;4189:3;4186:15;4178:142;;;4260:17;;4248:30;;4211:12;;;;4298;;;;4178:142;;;4339:5;4329:15;;;;;;;3170:1180;;;;;:::o;4355:843::-;4549:4;4578:2;4618;4607:9;4603:18;4648:2;4637:9;4630:21;4671:6;4706;4700:13;4737:6;4729;4722:22;4775:2;4764:9;4760:18;4753:25;;4837:2;4827:6;4824:1;4820:14;4809:9;4805:30;4801:39;4787:53;;4875:2;4867:6;4863:15;4896:1;4906:263;4920:6;4917:1;4914:13;4906:263;;;5013:2;5009:7;4997:9;4989:6;4985:22;4981:36;4976:3;4969:49;5041:48;5082:6;5073;5067:13;5041:48;:::i;:::-;5031:58;-1:-1:-1;5147:12:375;;;;5112:15;;;;4942:1;4935:9;4906:263;;;-1:-1:-1;5186:6:375;;4355:843;-1:-1:-1;;;;;;;4355:843:375:o;5203:632::-;5374:2;5426:21;;;5496:13;;5399:18;;;5518:22;;;5345:4;;5374:2;5597:15;;;;5571:2;5556:18;;;5345:4;5640:169;5654:6;5651:1;5648:13;5640:169;;;5715:13;;5703:26;;5784:15;;;;5749:12;;;;5676:1;5669:9;5640:169;;;-1:-1:-1;5826:3:375;;5203:632;-1:-1:-1;;;;;;5203:632:375:o;5840:118::-;5926:5;5919:13;5912:21;5905:5;5902:32;5892:60;;5948:1;5945;5938:12;5963:519;6047:6;6055;6063;6116:2;6104:9;6095:7;6091:23;6087:32;6084:52;;;6132:1;6129;6122:12;6084:52;6168:9;6155:23;6145:33;;6229:2;6218:9;6214:18;6201:32;6256:18;6248:6;6245:30;6242:50;;;6288:1;6285;6278:12;6242:50;6311;6353:7;6344:6;6333:9;6329:22;6311:50;:::i;:::-;6301:60;;;6411:2;6400:9;6396:18;6383:32;6424:28;6446:5;6424:28;:::i;:::-;6471:5;6461:15;;;5963:519;;;;;:::o;6922:127::-;6983:10;6978:3;6974:20;6971:1;6964:31;7014:4;7011:1;7004:15;7038:4;7035:1;7028:15;7054:289;7185:3;7223:6;7217:13;7239:66;7298:6;7293:3;7286:4;7278:6;7274:17;7239:66;:::i;:::-;7321:16;;;;;7054:289;-1:-1:-1;;7054:289:375:o;7348:297::-;7466:12;;7513:4;7502:16;;;7496:23;;7466:12;7531:16;;7528:111;;;-1:-1:-1;;7605:4:375;7601:17;;;;7598:1;7594:25;7590:38;7579:50;;7348:297;-1:-1:-1;7348:297:375:o;7650:380::-;7729:1;7725:12;;;;7772;;;7793:61;;7847:4;7839:6;7835:17;7825:27;;7793:61;7900:2;7892:6;7889:14;7869:18;7866:38;7863:161;;7946:10;7941:3;7937:20;7934:1;7927:31;7981:4;7978:1;7971:15;8009:4;8006:1;7999:15;8161:543;8263:2;8258:3;8255:11;8252:446;;;8299:1;8323:5;8320:1;8313:16;8367:4;8364:1;8354:18;8437:2;8425:10;8421:19;8418:1;8414:27;8408:4;8404:38;8473:4;8461:10;8458:20;8455:47;;;-1:-1:-1;8496:4:375;8455:47;8551:2;8546:3;8542:12;8539:1;8535:20;8529:4;8525:31;8515:41;;8606:82;8624:2;8617:5;8614:13;8606:82;;;8669:17;;;8650:1;8639:13;8606:82;;;8610:3;;;8161:543;;;:::o;8880:1345::-;9006:3;9000:10;9033:18;9025:6;9022:30;9019:56;;;9055:18;;:::i;:::-;9084:97;9174:6;9134:38;9166:4;9160:11;9134:38;:::i;:::-;9128:4;9084:97;:::i;:::-;9236:4;;9293:2;9282:14;;9310:1;9305:663;;;;10012:1;10029:6;10026:89;;;-1:-1:-1;10081:19:375;;;10075:26;10026:89;-1:-1:-1;;8837:1:375;8833:11;;;8829:24;8825:29;8815:40;8861:1;8857:11;;;8812:57;10128:81;;9275:944;;9305:663;8108:1;8101:14;;;8145:4;8132:18;;-1:-1:-1;;9341:20:375;;;9459:236;9473:7;9470:1;9467:14;9459:236;;;9562:19;;;9556:26;9541:42;;9654:27;;;;9622:1;9610:14;;;;9489:19;;9459:236;;;9463:3;9723:6;9714:7;9711:19;9708:201;;;9784:19;;;9778:26;-1:-1:-1;;9867:1:375;9863:14;;;9879:3;9859:24;9855:37;9851:42;9836:58;9821:74;;9708:201;-1:-1:-1;;;;;9955:1:375;9939:14;;;9935:22;9922:36;;-1:-1:-1;8880:1345:375:o;10230:845::-;10360:3;10389:1;10422:6;10416:13;10452:36;10478:9;10452:36;:::i;:::-;10507:1;10524:17;;;10550:133;;;;10697:1;10692:358;;;;10517:533;;10550:133;-1:-1:-1;;10583:24:375;;10571:37;;10656:14;;10649:22;10637:35;;10628:45;;;-1:-1:-1;10550:133:375;;10692:358;10723:6;10720:1;10713:17;10753:4;10798;10795:1;10785:18;10825:1;10839:165;10853:6;10850:1;10847:13;10839:165;;;10931:14;;10918:11;;;10911:35;10974:16;;;;10868:10;;10839:165;;;10843:3;;;11033:6;11028:3;11024:16;11017:23;;10517:533;-1:-1:-1;11066:3:375;;10230:845;-1:-1:-1;;;;;;10230:845:375:o;11262:177::-;11341:13;;-1:-1:-1;;;;;11383:31:375;;11373:42;;11363:70;;11429:1;11426;11419:12;11363:70;11262:177;;;:::o;11444:208::-;11514:6;11567:2;11555:9;11546:7;11542:23;11538:32;11535:52;;;11583:1;11580;11573:12;11535:52;11606:40;11636:9;11606:40;:::i;11657:245::-;11724:6;11777:2;11765:9;11756:7;11752:23;11748:32;11745:52;;;11793:1;11790;11783:12;11745:52;11825:9;11819:16;11844:28;11866:5;11844:28;:::i;11907:801::-;12105:4;12153:2;12142:9;12138:18;12183:6;12172:9;12165:25;12209:2;12247;12242;12231:9;12227:18;12220:30;12270:6;12305;12299:13;12336:6;12328;12321:22;12374:3;12363:9;12359:19;12352:26;;12413:2;12405:6;12401:15;12387:29;;12434:1;12444:195;12458:6;12455:1;12452:13;12444:195;;;12523:13;;-1:-1:-1;;;;;12519:39:375;12507:52;;12614:15;;;;12579:12;;;;12555:1;12473:9;12444:195;;;12448:3;;12656;12648:11;;;;;12695:6;12690:2;12679:9;12675:18;12668:34;11907:801;;;;;;:::o;12921:905::-;13016:6;13047:2;13090;13078:9;13069:7;13065:23;13061:32;13058:52;;;13106:1;13103;13096:12;13058:52;13139:9;13133:16;13172:18;13164:6;13161:30;13158:50;;;13204:1;13201;13194:12;13158:50;13227:22;;13280:4;13272:13;;13268:27;-1:-1:-1;13258:55:375;;13309:1;13306;13299:12;13258:55;13338:2;13332:9;13361:60;13377:43;13417:2;13377:43;:::i;13361:60::-;13455:15;;;13537:1;13533:10;;;;13525:19;;13521:28;;;13486:12;;;;13561:19;;;13558:39;;;13593:1;13590;13583:12;13558:39;13617:11;;;;13637:159;13653:6;13648:3;13645:15;13637:159;;;13719:34;13749:3;13719:34;:::i;:::-;13707:47;;13670:12;;;;13774;;;;13637:159;;;13815:5;12921:905;-1:-1:-1;;;;;;;12921:905:375:o;13831:127::-;13892:10;13887:3;13883:20;13880:1;13873:31;13923:4;13920:1;13913:15;13947:4;13944:1;13937:15;13963:125;14028:9;;;14049:10;;;14046:36;;;14062:18;;:::i;14093:128::-;14160:9;;;14181:11;;;14178:37;;;14195:18;;:::i;14226:127::-;14287:10;14282:3;14278:20;14275:1;14268:31;14318:4;14315:1;14308:15;14342:4;14339:1;14332:15","linkReferences":{}},"methodIdentifiers":{"addRoleToChannel(bytes32,uint256)":"37644cf7","createChannel(bytes32,string,uint256[])":"921f7175","getChannel(bytes32)":"831c2b82","getChannels()":"9575f6ac","getRolesByChannel(bytes32)":"99352183","removeChannel(bytes32)":"02da0e51","removeRoleFromChannel(bytes32,uint256)":"b9de6159","updateChannel(bytes32,string,bool)":"ef86d696"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ApprovalCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BalanceQueryForZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__AlreadyBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Banning__CannotBanSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__NotBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChannelService__ChannelAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChannelService__ChannelDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChannelService__ChannelDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChannelService__RoleAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChannelService__RoleDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC5643__DurationZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC5643__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC5643__NotApprovedOrOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC5643__SubscriptionNotRenewable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__ValueAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintERC2309QuantityExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintZeroQuantity\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnershipNotInitializedForExtraData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__Paused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFromIncorrectOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC721ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"URIQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Validator__InvalidStringLength\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"}],\"name\":\"ChannelCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"}],\"name\":\"ChannelRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"ChannelRoleAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"ChannelRoleRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"}],\"name\":\"ChannelUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"toTokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"ConsecutiveTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"expiration\",\"type\":\"uint64\"}],\"name\":\"SubscriptionUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Unbanned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"addRoleToChannel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"uint256[]\",\"name\":\"roleIds\",\"type\":\"uint256[]\"}],\"name\":\"createChannel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"}],\"name\":\"getChannel\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"uint256[]\",\"name\":\"roleIds\",\"type\":\"uint256[]\"}],\"internalType\":\"struct IChannelBase.Channel\",\"name\":\"channel\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChannels\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"uint256[]\",\"name\":\"roleIds\",\"type\":\"uint256[]\"}],\"internalType\":\"struct IChannelBase.Channel[]\",\"name\":\"channels\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"}],\"name\":\"getRolesByChannel\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"roleIds\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"}],\"name\":\"removeChannel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"removeRoleFromChannel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"}],\"name\":\"updateChannel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"ConsecutiveTransfer(uint256,uint256,address,address)\":{\"details\":\"Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, as defined in the [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. See {_mintERC2309} for more details.\"},\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"},\"SubscriptionUpdate(uint256,uint64)\":{\"details\":\"When a subscription is canceled, the expiration value should also be 0.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"addRoleToChannel(bytes32,uint256)\":{\"params\":{\"channelId\":\"the channelId to add the role to\",\"roleId\":\"the roleId to add to the channel\"}},\"createChannel(bytes32,string,uint256[])\":{\"params\":{\"channelId\":\"the channelId of the channel\",\"metadata\":\"the metadata of the channel\",\"roleIds\":\"the roleIds to add to the channel\"}},\"getChannel(bytes32)\":{\"params\":{\"channelId\":\"the channelId to get\"},\"returns\":{\"channel\":\"the channel\"}},\"getChannels()\":{\"returns\":{\"channels\":\"an array of all channels\"}},\"getRolesByChannel(bytes32)\":{\"params\":{\"channelId\":\"the channelId to get the roles for\"},\"returns\":{\"roleIds\":\"an array of roleIds for the channel\"}},\"removeChannel(bytes32)\":{\"params\":{\"channelId\":\"the channelId to remove\"}},\"removeRoleFromChannel(bytes32,uint256)\":{\"params\":{\"channelId\":\"the channelId to remove the role from\",\"roleId\":\"the roleId to remove from the channel\"}},\"updateChannel(bytes32,string,bool)\":{\"params\":{\"channelId\":\"the channelId to update\",\"disabled\":\"whether or not the channel is disabled\",\"metadata\":\"the new metadata of the channel\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ApprovalCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"ApprovalQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"BalanceQueryForZeroAddress()\":[{\"notice\":\"Cannot query the balance for the zero address.\"}],\"MintERC2309QuantityExceedsLimit()\":[{\"notice\":\"The `quantity` minted with ERC2309 exceeds the safety limit.\"}],\"MintToZeroAddress()\":[{\"notice\":\"Cannot mint to the zero address.\"}],\"MintZeroQuantity()\":[{\"notice\":\"The quantity of tokens minted must be more than zero.\"}],\"OwnerQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"OwnershipNotInitializedForExtraData()\":[{\"notice\":\"The `extraData` cannot be set on an unintialized ownership slot.\"}],\"TransferCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"TransferFromIncorrectOwner()\":[{\"notice\":\"The token must be owned by `from`.\"}],\"TransferToNonERC721ReceiverImplementer()\":[{\"notice\":\"Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"notice\":\"Cannot transfer to the zero address.\"}],\"URIQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}]},\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"},\"SubscriptionUpdate(uint256,uint64)\":{\"notice\":\"Emitted when a subscription expiration changes\"}},\"kind\":\"user\",\"methods\":{\"addRoleToChannel(bytes32,uint256)\":{\"notice\":\"adds a role to a channel\"},\"createChannel(bytes32,string,uint256[])\":{\"notice\":\"creates a channel\"},\"getChannel(bytes32)\":{\"notice\":\"gets a channel\"},\"getChannels()\":{\"notice\":\"gets all channels\"},\"getRolesByChannel(bytes32)\":{\"notice\":\"gets all roles for a channel\"},\"removeChannel(bytes32)\":{\"notice\":\"removes a channel\"},\"removeRoleFromChannel(bytes32,uint256)\":{\"notice\":\"removes a role from a channel\"},\"updateChannel(bytes32,string,bool)\":{\"notice\":\"updates a channel\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/facets/channels/Channels.sol\":\"Channels\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol\":{\"keccak256\":\"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f\",\"dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol\":{\"keccak256\":\"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5\",\"dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol\":{\"keccak256\":\"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc\",\"dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf\"]},\"contracts/src/diamond/facets/pausable/IPausable.sol\":{\"keccak256\":\"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6\",\"dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM\"]},\"contracts/src/diamond/facets/pausable/PausableBase.sol\":{\"keccak256\":\"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c\",\"dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1\"]},\"contracts/src/diamond/facets/pausable/PausableStorage.sol\":{\"keccak256\":\"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b\",\"dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL\"]},\"contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol\":{\"keccak256\":\"0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714\",\"dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8\"]},\"contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol\":{\"keccak256\":\"0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7\",\"dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7\"]},\"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol\":{\"keccak256\":\"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f\",\"dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol\":{\"keccak256\":\"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa\",\"dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol\":{\"keccak256\":\"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c\",\"dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu\"]},\"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol\":{\"keccak256\":\"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e\",\"dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM\"]},\"contracts/src/factory/facets/wallet-link/IWalletLink.sol\":{\"keccak256\":\"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13\",\"dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR\"]},\"contracts/src/spaces/entitlements/IEntitlement.sol\":{\"keccak256\":\"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3\",\"dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf\"]},\"contracts/src/spaces/facets/Entitled.sol\":{\"keccak256\":\"0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7\",\"dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc\"]},\"contracts/src/spaces/facets/Permissions.sol\":{\"keccak256\":\"0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721\",\"dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp\"]},\"contracts/src/spaces/facets/banning/BanningBase.sol\":{\"keccak256\":\"0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d\",\"dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN\"]},\"contracts/src/spaces/facets/banning/BanningStorage.sol\":{\"keccak256\":\"0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0\",\"dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1\"]},\"contracts/src/spaces/facets/banning/IBanning.sol\":{\"keccak256\":\"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419\",\"dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6\"]},\"contracts/src/spaces/facets/channels/ChannelBase.sol\":{\"keccak256\":\"0x51d5d8335e585b052a43afc3b5018429c2dd22f67e4b60b3f8f659d9d0b0ec08\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b6d5953dfa9b5e857aaf153df1c1d04ece5fb9d7250c78a87edaef84d3b053d7\",\"dweb:/ipfs/QmYrKaVH2ftMJBWfUJGdQYV3LBoYuxTsXj1erndYrEE4Jp\"]},\"contracts/src/spaces/facets/channels/ChannelService.sol\":{\"keccak256\":\"0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9\",\"dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi\"]},\"contracts/src/spaces/facets/channels/ChannelStorage.sol\":{\"keccak256\":\"0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7\",\"dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS\"]},\"contracts/src/spaces/facets/channels/Channels.sol\":{\"keccak256\":\"0xeb1a27c173aa374fb10e7864b10926b2207b344099f35c36ceaa61f737c29580\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dc8606c41a52c9c41dfe5fd26c306b6eae730618b1a074e6e862f46e6deeec82\",\"dweb:/ipfs/QmfVXU1NQkxKSYH3tApnHKEzatmHjmJnKzM1Vo6n9QaH7S\"]},\"contracts/src/spaces/facets/channels/IChannel.sol\":{\"keccak256\":\"0x4a62ec6410779121880a21ae1a42bab2480f672c683f79c7f2e11bf2bfe1bd6e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://61b4142a55418d8e15e4db77bf6614a830489dc6aa191afe3dadc9ef16534b2c\",\"dweb:/ipfs/Qmbuc8VBmoFrbWZGinbCQaCrBRw3DznYhZNLzqk2FXABUx\"]},\"contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol\":{\"keccak256\":\"0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5\",\"dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9\"]},\"contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol\":{\"keccak256\":\"0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07\",\"dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek\"]},\"contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol\":{\"keccak256\":\"0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583\",\"dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK\"]},\"contracts/src/spaces/facets/membership/MembershipStorage.sol\":{\"keccak256\":\"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee\",\"dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5\"]},\"contracts/src/utils/Validator.sol\":{\"keccak256\":\"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64\",\"dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72\"]},\"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"ApprovalCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"ApprovalQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"BalanceQueryForZeroAddress"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__AlreadyBanned"},{"inputs":[],"type":"error","name":"Banning__CannotBanSelf"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__InvalidTokenId"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__NotBanned"},{"inputs":[],"type":"error","name":"ChannelService__ChannelAlreadyExists"},{"inputs":[],"type":"error","name":"ChannelService__ChannelDisabled"},{"inputs":[],"type":"error","name":"ChannelService__ChannelDoesNotExist"},{"inputs":[],"type":"error","name":"ChannelService__RoleAlreadyExists"},{"inputs":[],"type":"error","name":"ChannelService__RoleDoesNotExist"},{"inputs":[],"type":"error","name":"ERC5643__DurationZero"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC5643__InvalidTokenId"},{"inputs":[],"type":"error","name":"ERC5643__NotApprovedOrOwner"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC5643__SubscriptionNotRenewable"},{"inputs":[],"type":"error","name":"Entitlement__InvalidValue"},{"inputs":[],"type":"error","name":"Entitlement__NotAllowed"},{"inputs":[],"type":"error","name":"Entitlement__NotMember"},{"inputs":[],"type":"error","name":"Entitlement__ValueAlreadyExists"},{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[],"type":"error","name":"MintERC2309QuantityExceedsLimit"},{"inputs":[],"type":"error","name":"MintToZeroAddress"},{"inputs":[],"type":"error","name":"MintZeroQuantity"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[],"type":"error","name":"OwnerQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"OwnershipNotInitializedForExtraData"},{"inputs":[],"type":"error","name":"Pausable__NotPaused"},{"inputs":[],"type":"error","name":"Pausable__Paused"},{"inputs":[],"type":"error","name":"TransferCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"TransferFromIncorrectOwner"},{"inputs":[],"type":"error","name":"TransferToNonERC721ReceiverImplementer"},{"inputs":[],"type":"error","name":"TransferToZeroAddress"},{"inputs":[],"type":"error","name":"URIQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"Validator__InvalidStringLength"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"approved","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bool","name":"approved","type":"bool","indexed":false}],"type":"event","name":"ApprovalForAll","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Banned","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"bytes32","name":"channelId","type":"bytes32","indexed":false}],"type":"event","name":"ChannelCreated","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"bytes32","name":"channelId","type":"bytes32","indexed":false}],"type":"event","name":"ChannelRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"bytes32","name":"channelId","type":"bytes32","indexed":false},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":false}],"type":"event","name":"ChannelRoleAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"bytes32","name":"channelId","type":"bytes32","indexed":false},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":false}],"type":"event","name":"ChannelRoleRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"bytes32","name":"channelId","type":"bytes32","indexed":false}],"type":"event","name":"ChannelUpdated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"fromTokenId","type":"uint256","indexed":true},{"internalType":"uint256","name":"toTokenId","type":"uint256","indexed":false},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true}],"type":"event","name":"ConsecutiveTransfer","anonymous":false},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true},{"internalType":"uint64","name":"expiration","type":"uint64","indexed":false}],"type":"event","name":"SubscriptionUpdate","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Unbanned","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"},{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"addRoleToChannel"},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"},{"internalType":"string","name":"metadata","type":"string"},{"internalType":"uint256[]","name":"roleIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function","name":"createChannel"},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getChannel","outputs":[{"internalType":"struct IChannelBase.Channel","name":"channel","type":"tuple","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"bool","name":"disabled","type":"bool"},{"internalType":"string","name":"metadata","type":"string"},{"internalType":"uint256[]","name":"roleIds","type":"uint256[]"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getChannels","outputs":[{"internalType":"struct IChannelBase.Channel[]","name":"channels","type":"tuple[]","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"bool","name":"disabled","type":"bool"},{"internalType":"string","name":"metadata","type":"string"},{"internalType":"uint256[]","name":"roleIds","type":"uint256[]"}]}]},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRolesByChannel","outputs":[{"internalType":"uint256[]","name":"roleIds","type":"uint256[]"}]},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"removeChannel"},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"},{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"removeRoleFromChannel"},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"},{"internalType":"string","name":"metadata","type":"string"},{"internalType":"bool","name":"disabled","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"updateChannel"}],"devdoc":{"kind":"dev","methods":{"addRoleToChannel(bytes32,uint256)":{"params":{"channelId":"the channelId to add the role to","roleId":"the roleId to add to the channel"}},"createChannel(bytes32,string,uint256[])":{"params":{"channelId":"the channelId of the channel","metadata":"the metadata of the channel","roleIds":"the roleIds to add to the channel"}},"getChannel(bytes32)":{"params":{"channelId":"the channelId to get"},"returns":{"channel":"the channel"}},"getChannels()":{"returns":{"channels":"an array of all channels"}},"getRolesByChannel(bytes32)":{"params":{"channelId":"the channelId to get the roles for"},"returns":{"roleIds":"an array of roleIds for the channel"}},"removeChannel(bytes32)":{"params":{"channelId":"the channelId to remove"}},"removeRoleFromChannel(bytes32,uint256)":{"params":{"channelId":"the channelId to remove the role from","roleId":"the roleId to remove from the channel"}},"updateChannel(bytes32,string,bool)":{"params":{"channelId":"the channelId to update","disabled":"whether or not the channel is disabled","metadata":"the new metadata of the channel"}}},"version":1},"userdoc":{"kind":"user","methods":{"addRoleToChannel(bytes32,uint256)":{"notice":"adds a role to a channel"},"createChannel(bytes32,string,uint256[])":{"notice":"creates a channel"},"getChannel(bytes32)":{"notice":"gets a channel"},"getChannels()":{"notice":"gets all channels"},"getRolesByChannel(bytes32)":{"notice":"gets all roles for a channel"},"removeChannel(bytes32)":{"notice":"removes a channel"},"removeRoleFromChannel(bytes32,uint256)":{"notice":"removes a role from a channel"},"updateChannel(bytes32,string,bool)":{"notice":"updates a channel"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/facets/channels/Channels.sol":"Channels"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol":{"keccak256":"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d","urls":["bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f","dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol":{"keccak256":"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a","urls":["bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5","dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol":{"keccak256":"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0","urls":["bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc","dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/IPausable.sol":{"keccak256":"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261","urls":["bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6","dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableBase.sol":{"keccak256":"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438","urls":["bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c","dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableStorage.sol":{"keccak256":"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07","urls":["bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b","dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol":{"keccak256":"0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3","urls":["bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714","dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol":{"keccak256":"0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e","urls":["bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7","dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol":{"keccak256":"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218","urls":["bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f","dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol":{"keccak256":"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334","urls":["bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa","dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol":{"keccak256":"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1","urls":["bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c","dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9","urls":["bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e","dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM"],"license":"Apache-2.0"},"contracts/src/factory/facets/wallet-link/IWalletLink.sol":{"keccak256":"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b","urls":["bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13","dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/IEntitlement.sol":{"keccak256":"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca","urls":["bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3","dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf"],"license":"Apache-2.0"},"contracts/src/spaces/facets/Entitled.sol":{"keccak256":"0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c","urls":["bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7","dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc"],"license":"Apache-2.0"},"contracts/src/spaces/facets/Permissions.sol":{"keccak256":"0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5","urls":["bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721","dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/BanningBase.sol":{"keccak256":"0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270","urls":["bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d","dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/BanningStorage.sol":{"keccak256":"0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492","urls":["bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0","dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/IBanning.sol":{"keccak256":"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505","urls":["bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419","dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/ChannelBase.sol":{"keccak256":"0x51d5d8335e585b052a43afc3b5018429c2dd22f67e4b60b3f8f659d9d0b0ec08","urls":["bzz-raw://b6d5953dfa9b5e857aaf153df1c1d04ece5fb9d7250c78a87edaef84d3b053d7","dweb:/ipfs/QmYrKaVH2ftMJBWfUJGdQYV3LBoYuxTsXj1erndYrEE4Jp"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/ChannelService.sol":{"keccak256":"0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7","urls":["bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9","dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/ChannelStorage.sol":{"keccak256":"0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f","urls":["bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7","dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/Channels.sol":{"keccak256":"0xeb1a27c173aa374fb10e7864b10926b2207b344099f35c36ceaa61f737c29580","urls":["bzz-raw://dc8606c41a52c9c41dfe5fd26c306b6eae730618b1a074e6e862f46e6deeec82","dweb:/ipfs/QmfVXU1NQkxKSYH3tApnHKEzatmHjmJnKzM1Vo6n9QaH7S"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/IChannel.sol":{"keccak256":"0x4a62ec6410779121880a21ae1a42bab2480f672c683f79c7f2e11bf2bfe1bd6e","urls":["bzz-raw://61b4142a55418d8e15e4db77bf6614a830489dc6aa191afe3dadc9ef16534b2c","dweb:/ipfs/Qmbuc8VBmoFrbWZGinbCQaCrBRw3DznYhZNLzqk2FXABUx"],"license":"Apache-2.0"},"contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol":{"keccak256":"0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2","urls":["bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5","dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9"],"license":"Apache-2.0"},"contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol":{"keccak256":"0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef","urls":["bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07","dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol":{"keccak256":"0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8","urls":["bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583","dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/MembershipStorage.sol":{"keccak256":"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3","urls":["bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee","dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5"],"license":"Apache-2.0"},"contracts/src/utils/Validator.sol":{"keccak256":"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50","urls":["bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64","dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"keccak256":"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4","urls":["bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7","dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":165} \ No newline at end of file diff --git a/packages/generated/v3/abis/Channels.metadata.json b/packages/generated/v3/abis/Channels.metadata.json new file mode 100644 index 000000000..1b7bcdfc4 --- /dev/null +++ b/packages/generated/v3/abis/Channels.metadata.json @@ -0,0 +1,1211 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "ApprovalQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "BalanceQueryForZeroAddress" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__AlreadyBanned" + }, + { + "inputs": [], + "type": "error", + "name": "Banning__CannotBanSelf" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__InvalidTokenId" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__NotBanned" + }, + { + "inputs": [], + "type": "error", + "name": "ChannelService__ChannelAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "ChannelService__ChannelDisabled" + }, + { + "inputs": [], + "type": "error", + "name": "ChannelService__ChannelDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "ChannelService__RoleAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "ChannelService__RoleDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "ERC5643__DurationZero" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC5643__InvalidTokenId" + }, + { + "inputs": [], + "type": "error", + "name": "ERC5643__NotApprovedOrOwner" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__InvalidValue" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotAllowed" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotMember" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__ValueAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [], + "type": "error", + "name": "MintERC2309QuantityExceedsLimit" + }, + { + "inputs": [], + "type": "error", + "name": "MintToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "MintZeroQuantity" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "OwnerQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "OwnershipNotInitializedForExtraData" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__NotPaused" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__Paused" + }, + { + "inputs": [], + "type": "error", + "name": "TransferCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "TransferFromIncorrectOwner" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "URIQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "Validator__InvalidStringLength" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "approved", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Approval", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "operator", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ApprovalForAll", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Banned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address", + "indexed": true + }, + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32", + "indexed": false + } + ], + "type": "event", + "name": "ChannelCreated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address", + "indexed": true + }, + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32", + "indexed": false + } + ], + "type": "event", + "name": "ChannelRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address", + "indexed": true + }, + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "ChannelRoleAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address", + "indexed": true + }, + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "ChannelRoleRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address", + "indexed": true + }, + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32", + "indexed": false + } + ], + "type": "event", + "name": "ChannelUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fromTokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint256", + "name": "toTokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConsecutiveTransfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Paused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint64", + "name": "expiration", + "type": "uint64", + "indexed": false + } + ], + "type": "event", + "name": "SubscriptionUpdate", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Transfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Unbanned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Unpaused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "addRoleToChannel" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "metadata", + "type": "string" + }, + { + "internalType": "uint256[]", + "name": "roleIds", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "createChannel" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getChannel", + "outputs": [ + { + "internalType": "struct IChannelBase.Channel", + "name": "channel", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "disabled", + "type": "bool" + }, + { + "internalType": "string", + "name": "metadata", + "type": "string" + }, + { + "internalType": "uint256[]", + "name": "roleIds", + "type": "uint256[]" + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getChannels", + "outputs": [ + { + "internalType": "struct IChannelBase.Channel[]", + "name": "channels", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "disabled", + "type": "bool" + }, + { + "internalType": "string", + "name": "metadata", + "type": "string" + }, + { + "internalType": "uint256[]", + "name": "roleIds", + "type": "uint256[]" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getRolesByChannel", + "outputs": [ + { + "internalType": "uint256[]", + "name": "roleIds", + "type": "uint256[]" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeChannel" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeRoleFromChannel" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "metadata", + "type": "string" + }, + { + "internalType": "bool", + "name": "disabled", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "updateChannel" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "addRoleToChannel(bytes32,uint256)": { + "params": { + "channelId": "the channelId to add the role to", + "roleId": "the roleId to add to the channel" + } + }, + "createChannel(bytes32,string,uint256[])": { + "params": { + "channelId": "the channelId of the channel", + "metadata": "the metadata of the channel", + "roleIds": "the roleIds to add to the channel" + } + }, + "getChannel(bytes32)": { + "params": { + "channelId": "the channelId to get" + }, + "returns": { + "channel": "the channel" + } + }, + "getChannels()": { + "returns": { + "channels": "an array of all channels" + } + }, + "getRolesByChannel(bytes32)": { + "params": { + "channelId": "the channelId to get the roles for" + }, + "returns": { + "roleIds": "an array of roleIds for the channel" + } + }, + "removeChannel(bytes32)": { + "params": { + "channelId": "the channelId to remove" + } + }, + "removeRoleFromChannel(bytes32,uint256)": { + "params": { + "channelId": "the channelId to remove the role from", + "roleId": "the roleId to remove from the channel" + } + }, + "updateChannel(bytes32,string,bool)": { + "params": { + "channelId": "the channelId to update", + "disabled": "whether or not the channel is disabled", + "metadata": "the new metadata of the channel" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "addRoleToChannel(bytes32,uint256)": { + "notice": "adds a role to a channel" + }, + "createChannel(bytes32,string,uint256[])": { + "notice": "creates a channel" + }, + "getChannel(bytes32)": { + "notice": "gets a channel" + }, + "getChannels()": { + "notice": "gets all channels" + }, + "getRolesByChannel(bytes32)": { + "notice": "gets all roles for a channel" + }, + "removeChannel(bytes32)": { + "notice": "removes a channel" + }, + "removeRoleFromChannel(bytes32,uint256)": { + "notice": "removes a role from a channel" + }, + "updateChannel(bytes32,string,bool)": { + "notice": "updates a channel" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/facets/channels/Channels.sol": "Channels" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol": { + "keccak256": "0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d", + "urls": [ + "bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f", + "dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol": { + "keccak256": "0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a", + "urls": [ + "bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5", + "dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol": { + "keccak256": "0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0", + "urls": [ + "bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc", + "dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/IPausable.sol": { + "keccak256": "0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261", + "urls": [ + "bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6", + "dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableBase.sol": { + "keccak256": "0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438", + "urls": [ + "bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c", + "dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableStorage.sol": { + "keccak256": "0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07", + "urls": [ + "bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b", + "dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol": { + "keccak256": "0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3", + "urls": [ + "bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714", + "dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol": { + "keccak256": "0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e", + "urls": [ + "bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7", + "dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/IERC5643.sol": { + "keccak256": "0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218", + "urls": [ + "bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f", + "dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol": { + "keccak256": "0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334", + "urls": [ + "bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa", + "dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol": { + "keccak256": "0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1", + "urls": [ + "bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c", + "dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/IERC721A.sol": { + "keccak256": "0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9", + "urls": [ + "bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e", + "dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/wallet-link/IWalletLink.sol": { + "keccak256": "0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b", + "urls": [ + "bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13", + "dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/IEntitlement.sol": { + "keccak256": "0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca", + "urls": [ + "bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3", + "dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/Entitled.sol": { + "keccak256": "0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c", + "urls": [ + "bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7", + "dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/Permissions.sol": { + "keccak256": "0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5", + "urls": [ + "bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721", + "dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/BanningBase.sol": { + "keccak256": "0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270", + "urls": [ + "bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d", + "dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/BanningStorage.sol": { + "keccak256": "0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492", + "urls": [ + "bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0", + "dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/IBanning.sol": { + "keccak256": "0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505", + "urls": [ + "bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419", + "dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/ChannelBase.sol": { + "keccak256": "0x51d5d8335e585b052a43afc3b5018429c2dd22f67e4b60b3f8f659d9d0b0ec08", + "urls": [ + "bzz-raw://b6d5953dfa9b5e857aaf153df1c1d04ece5fb9d7250c78a87edaef84d3b053d7", + "dweb:/ipfs/QmYrKaVH2ftMJBWfUJGdQYV3LBoYuxTsXj1erndYrEE4Jp" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/ChannelService.sol": { + "keccak256": "0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7", + "urls": [ + "bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9", + "dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/ChannelStorage.sol": { + "keccak256": "0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f", + "urls": [ + "bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7", + "dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/Channels.sol": { + "keccak256": "0xeb1a27c173aa374fb10e7864b10926b2207b344099f35c36ceaa61f737c29580", + "urls": [ + "bzz-raw://dc8606c41a52c9c41dfe5fd26c306b6eae730618b1a074e6e862f46e6deeec82", + "dweb:/ipfs/QmfVXU1NQkxKSYH3tApnHKEzatmHjmJnKzM1Vo6n9QaH7S" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/IChannel.sol": { + "keccak256": "0x4a62ec6410779121880a21ae1a42bab2480f672c683f79c7f2e11bf2bfe1bd6e", + "urls": [ + "bzz-raw://61b4142a55418d8e15e4db77bf6614a830489dc6aa191afe3dadc9ef16534b2c", + "dweb:/ipfs/Qmbuc8VBmoFrbWZGinbCQaCrBRw3DznYhZNLzqk2FXABUx" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol": { + "keccak256": "0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2", + "urls": [ + "bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5", + "dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol": { + "keccak256": "0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef", + "urls": [ + "bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07", + "dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol": { + "keccak256": "0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8", + "urls": [ + "bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583", + "dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/MembershipStorage.sol": { + "keccak256": "0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3", + "urls": [ + "bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee", + "dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/Validator.sol": { + "keccak256": "0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50", + "urls": [ + "bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64", + "dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4", + "urls": [ + "bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7", + "dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/Diamond.abi.json b/packages/generated/v3/abis/Diamond.abi.json new file mode 100644 index 000000000..4772f6d49 --- /dev/null +++ b/packages/generated/v3/abis/Diamond.abi.json @@ -0,0 +1,249 @@ +[ + { + "type": "constructor", + "inputs": [ + { + "name": "initDiamondCut", + "type": "tuple", + "internalType": "struct Diamond.InitParams", + "components": [ + { + "name": "baseFacets", + "type": "tuple[]", + "internalType": "struct IDiamond.FacetCut[]", + "components": [ + { + "name": "facetAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "action", + "type": "uint8", + "internalType": "enum IDiamond.FacetCutAction" + }, + { + "name": "functionSelectors", + "type": "bytes4[]", + "internalType": "bytes4[]" + } + ] + }, + { + "name": "init", + "type": "address", + "internalType": "address" + }, + { + "name": "initData", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "fallback", + "stateMutability": "payable" + }, + { + "type": "receive", + "stateMutability": "payable" + }, + { + "type": "event", + "name": "DiamondCut", + "inputs": [ + { + "name": "facetCuts", + "type": "tuple[]", + "indexed": false, + "internalType": "struct IDiamond.FacetCut[]", + "components": [ + { + "name": "facetAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "action", + "type": "uint8", + "internalType": "enum IDiamond.FacetCutAction" + }, + { + "name": "functionSelectors", + "type": "bytes4[]", + "internalType": "bytes4[]" + } + ] + }, + { + "name": "init", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "initPayload", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionAlreadyExists", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionDoesNotExist", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionFromSameFacetAlreadyExists", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_ImmutableFacet", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidContract", + "inputs": [ + { + "name": "init", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacet", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetCutAction", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetCutLength", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetRemoval", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + }, + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetSelectors", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidSelector", + "inputs": [] + }, + { + "type": "error", + "name": "Diamond_UnsupportedFunction", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_AlreadyInitialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "internalType": "uint32" + } + ] + }, + { + "type": "error", + "name": "Proxy__ImplementationIsNotContract", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/Diamond.abi.ts b/packages/generated/v3/abis/Diamond.abi.ts new file mode 100644 index 000000000..eaa6960cc --- /dev/null +++ b/packages/generated/v3/abis/Diamond.abi.ts @@ -0,0 +1,249 @@ +export default [ + { + "type": "constructor", + "inputs": [ + { + "name": "initDiamondCut", + "type": "tuple", + "internalType": "struct Diamond.InitParams", + "components": [ + { + "name": "baseFacets", + "type": "tuple[]", + "internalType": "struct IDiamond.FacetCut[]", + "components": [ + { + "name": "facetAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "action", + "type": "uint8", + "internalType": "enum IDiamond.FacetCutAction" + }, + { + "name": "functionSelectors", + "type": "bytes4[]", + "internalType": "bytes4[]" + } + ] + }, + { + "name": "init", + "type": "address", + "internalType": "address" + }, + { + "name": "initData", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "fallback", + "stateMutability": "payable" + }, + { + "type": "receive", + "stateMutability": "payable" + }, + { + "type": "event", + "name": "DiamondCut", + "inputs": [ + { + "name": "facetCuts", + "type": "tuple[]", + "indexed": false, + "internalType": "struct IDiamond.FacetCut[]", + "components": [ + { + "name": "facetAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "action", + "type": "uint8", + "internalType": "enum IDiamond.FacetCutAction" + }, + { + "name": "functionSelectors", + "type": "bytes4[]", + "internalType": "bytes4[]" + } + ] + }, + { + "name": "init", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "initPayload", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionAlreadyExists", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionDoesNotExist", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionFromSameFacetAlreadyExists", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_ImmutableFacet", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidContract", + "inputs": [ + { + "name": "init", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacet", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetCutAction", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetCutLength", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetRemoval", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + }, + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetSelectors", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidSelector", + "inputs": [] + }, + { + "type": "error", + "name": "Diamond_UnsupportedFunction", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_AlreadyInitialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "internalType": "uint32" + } + ] + }, + { + "type": "error", + "name": "Proxy__ImplementationIsNotContract", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/Diamond.bin b/packages/generated/v3/abis/Diamond.bin new file mode 100644 index 000000000..772199895 --- /dev/null +++ b/packages/generated/v3/abis/Diamond.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b506040516110fa3803806110fa83398101604081905261002f91610c6e565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16158061006c57303b151561007b565b8154600163ffffffff90911610155b156100a9578154604051630a8ef77f60e31b815263ffffffff90911660048201526024015b60405180910390fd5b815463ffffffff1916600117825580156100d057815460ff60201b19166401000000001782555b8251602084015160408501516100e7929190610135565b801561012d57815460ff60201b19168255604051600181527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b505050611001565b825160000361015757604051632795bfe160e11b815260040160405180910390fd5b60005b835181101561022857600084828151811061017757610177610e53565b602002602001015190506101908161027460201b60201c565b6000816020015160028111156101a8576101a8610e69565b036101c357805160408201516101be9190610330565b61021f565b6001816020015160028111156101db576101db610e69565b036101f157805160408201516101be919061045d565b60028160200151600281111561020957610209610e69565b0361021f578051604082015161021f919061067c565b5060010161015a565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67383838360405161025c93929190610eab565b60405180910390a161026f83838361082b565b505050565b80516001600160a01b03166102aa5780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b80516001600160a01b031630148015906102cd575080516001600160a01b03163b155b156102f95780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b80604001515160000361032d5780516040516305fb96cb60e41b81526001600160a01b0390911660048201526024016100a0565b50565b6000805160206110da833981519152610349818461087e565b6103595761035781846108a5565b505b815160005b8181101561045657600084828151811061037a5761037a610e53565b602090810291909101015190506001600160e01b031981166103af576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b0316156103fe57604051630e6c4db160e41b81526001600160e01b0319821660048201526024016100a0565b6001600160e01b031981166000818152600286016020908152604080832080546001600160a01b0319166001600160a01b038c16908117909155835260038801909152902061044c916108ba565b505060010161035e565b5050505050565b6000805160206110da833981519152306001600160a01b0384160361049557604051630e7ce30960e11b815260040160405180910390fd5b61049f818461087e565b6104af576104ad81846108a5565b505b815160005b818110156104565760008482815181106104d0576104d0610e53565b602090810291909101015190506001600160e01b03198116610505576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b031630810361054a57604051630e7ce30960e11b815260040160405180910390fd5b6001600160a01b03811661057c5760405163126f174360e11b81526001600160a01b03881660048201526024016100a0565b866001600160a01b0316816001600160a01b0316036105ba57604051631403eec360e21b81526001600160e01b0319831660048201526024016100a0565b6001600160e01b031982166000818152600287016020908152604080832080546001600160a01b0319166001600160a01b038d8116919091179091558516835260038901909152902061060c916108c6565b506001600160a01b0387166000908152600386016020526040902061063b906001600160e01b031984166108ba565b506001600160a01b0381166000908152600386016020526040902061065f906108d2565b6000036106725761067085826108dc565b505b50506001016104b4565b6000805160206110da833981519152306001600160a01b038416036106b457604051630e7ce30960e11b815260040160405180910390fd5b6106be818461087e565b6106e6576040516344ae58e160e01b81526001600160a01b03841660048201526024016100a0565b60005b82518110156107f057600083828151811061070657610706610e53565b602090810291909101015190506001600160e01b0319811661073b576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002840160205260409020546001600160a01b0386811691161461079c5760405162062efb60e51b81526001600160a01b03861660048201526001600160e01b0319821660248201526044016100a0565b6001600160e01b031981166000818152600285016020908152604080832080546001600160a01b03191690556001600160a01b03891683526003870190915290206107e6916108c6565b50506001016106e9565b506001600160a01b03831660009081526003820160205260409020610814906108d2565b60000361026f5761082581846108dc565b50505050565b6001600160a01b03821661083e57505050565b816001600160a01b03163b60000361087457604051633b367e1560e21b81526001600160a01b03831660048201526024016100a0565b61082582826108f1565b6001600160a01b038116600090815260018301602052604081205415155b90505b92915050565b600061089c836001600160a01b038416610968565b600061089c8383610968565b600061089c83836109b7565b600061089f825490565b600061089c836001600160a01b0384166109b7565b6060600080846001600160a01b03168460405161090e9190610fae565b600060405180830381855af49150503d8060008114610949576040519150601f19603f3d011682016040523d82523d6000602084013e61094e565b606091505b50909250905061095f858383610aaa565b95945050505050565b60008181526001830160205260408120546109af5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561089f565b50600061089f565b60008181526001830160205260408120548015610aa05760006109db600183610fca565b85549091506000906109ef90600190610fca565b9050808214610a54576000866000018281548110610a0f57610a0f610e53565b9060005260206000200154905080876000018481548110610a3257610a32610e53565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610a6557610a65610feb565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061089f565b600091505061089f565b606082610abf57610aba82610b09565b610b02565b8151158015610ad657506001600160a01b0384163b155b15610aff57604051639996b31560e01b81526001600160a01b03851660048201526024016100a0565b50805b9392505050565b805115610b195780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715610b6a57610b6a610b32565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610b9857610b98610b32565b604052919050565b60006001600160401b03821115610bb957610bb9610b32565b5060051b60200190565b80516001600160a01b0381168114610bda57600080fd5b919050565b60005b83811015610bfa578181015183820152602001610be2565b50506000910152565b600082601f830112610c1457600080fd5b81516001600160401b03811115610c2d57610c2d610b32565b610c40601f8201601f1916602001610b70565b818152846020838601011115610c5557600080fd5b610c66826020830160208701610bdf565b949350505050565b600060208284031215610c8057600080fd5b81516001600160401b0380821115610c9757600080fd5b9083019060608286031215610cab57600080fd5b610cb3610b48565b825182811115610cc257600080fd5b8301601f81018713610cd357600080fd5b8051610ce6610ce182610ba0565b610b70565b8082825260208201915060208360051b850101925089831115610d0857600080fd5b602084015b83811015610e0e57805187811115610d2457600080fd5b85016060818d03601f19011215610d3a57600080fd5b610d42610b48565b610d4e60208301610bc3565b8152604082015160038110610d6257600080fd5b6020820152606082015189811115610d7957600080fd5b8083019250508c603f830112610d8e57600080fd5b6020820151610d9f610ce182610ba0565b81815260059190911b83016040019060208101908f831115610dc057600080fd5b6040850194505b82851015610df85784516001600160e01b031981168114610de757600080fd5b825260209485019490910190610dc7565b6040840152505084525060209283019201610d0d565b50845250610e2191505060208401610bc3565b6020820152604083015182811115610e3857600080fd5b610e4487828601610c03565b60408301525095945050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b60008151808452610e97816020860160208601610bdf565b601f01601f19169290920160200192915050565b60006060808301606084528087518083526080925060808601915060808160051b8701016020808b0160005b84811015610f7e57898403607f19018652815180516001600160a01b03168552838101518986019060038110610f1d57634e487b7160e01b600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b80831015610f695783516001600160e01b0319168252928601926001929092019190860190610f3f565b50978501979550505090820190600101610ed7565b50506001600160a01b038a16908801528681036040880152610fa08189610e7f565b9a9950505050505050505050565b60008251610fc0818460208701610bdf565b9190910192915050565b8181038181111561089f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60cb8061100f6000396000f3fe608060405236600a57005b60106012565b005b6000601a6069565b9050806001600160a01b03163b6000036046576040516321f27f0d60e21b815260040160405180910390fd5b3660008037600080366000845af43d6000803e8080156064573d6000f35b3d6000fd5b600080356001600160e01b03191681527fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc90260205260409020546001600160a01b03168060c857604051630ff409c160e11b815260040160405180910390fd5b9056c6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc900 \ No newline at end of file diff --git a/packages/generated/v3/abis/Diamond.json b/packages/generated/v3/abis/Diamond.json new file mode 100644 index 000000000..ca6ed8ff4 --- /dev/null +++ b/packages/generated/v3/abis/Diamond.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"initDiamondCut","type":"tuple","internalType":"struct Diamond.InitParams","components":[{"name":"baseFacets","type":"tuple[]","internalType":"struct IDiamond.FacetCut[]","components":[{"name":"facetAddress","type":"address","internalType":"address"},{"name":"action","type":"uint8","internalType":"enum IDiamond.FacetCutAction"},{"name":"functionSelectors","type":"bytes4[]","internalType":"bytes4[]"}]},{"name":"init","type":"address","internalType":"address"},{"name":"initData","type":"bytes","internalType":"bytes"}]}],"stateMutability":"nonpayable"},{"type":"fallback","stateMutability":"payable"},{"type":"receive","stateMutability":"payable"},{"type":"event","name":"DiamondCut","inputs":[{"name":"facetCuts","type":"tuple[]","indexed":false,"internalType":"struct IDiamond.FacetCut[]","components":[{"name":"facetAddress","type":"address","internalType":"address"},{"name":"action","type":"uint8","internalType":"enum IDiamond.FacetCutAction"},{"name":"functionSelectors","type":"bytes4[]","internalType":"bytes4[]"}]},{"name":"init","type":"address","indexed":false,"internalType":"address"},{"name":"initPayload","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_FunctionAlreadyExists","inputs":[{"name":"selector","type":"bytes4","internalType":"bytes4"}]},{"type":"error","name":"DiamondCut_FunctionDoesNotExist","inputs":[{"name":"facet","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_FunctionFromSameFacetAlreadyExists","inputs":[{"name":"selector","type":"bytes4","internalType":"bytes4"}]},{"type":"error","name":"DiamondCut_ImmutableFacet","inputs":[]},{"type":"error","name":"DiamondCut_InvalidContract","inputs":[{"name":"init","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_InvalidFacet","inputs":[{"name":"facet","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_InvalidFacetCutAction","inputs":[]},{"type":"error","name":"DiamondCut_InvalidFacetCutLength","inputs":[]},{"type":"error","name":"DiamondCut_InvalidFacetRemoval","inputs":[{"name":"facet","type":"address","internalType":"address"},{"name":"selector","type":"bytes4","internalType":"bytes4"}]},{"type":"error","name":"DiamondCut_InvalidFacetSelectors","inputs":[{"name":"facet","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_InvalidSelector","inputs":[]},{"type":"error","name":"Diamond_UnsupportedFunction","inputs":[]},{"type":"error","name":"FailedInnerCall","inputs":[]},{"type":"error","name":"Initializable_AlreadyInitialized","inputs":[{"name":"version","type":"uint32","internalType":"uint32"}]},{"type":"error","name":"Proxy__ImplementationIsNotContract","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b506040516110fa3803806110fa83398101604081905261002f91610c6e565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16158061006c57303b151561007b565b8154600163ffffffff90911610155b156100a9578154604051630a8ef77f60e31b815263ffffffff90911660048201526024015b60405180910390fd5b815463ffffffff1916600117825580156100d057815460ff60201b19166401000000001782555b8251602084015160408501516100e7929190610135565b801561012d57815460ff60201b19168255604051600181527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b505050611001565b825160000361015757604051632795bfe160e11b815260040160405180910390fd5b60005b835181101561022857600084828151811061017757610177610e53565b602002602001015190506101908161027460201b60201c565b6000816020015160028111156101a8576101a8610e69565b036101c357805160408201516101be9190610330565b61021f565b6001816020015160028111156101db576101db610e69565b036101f157805160408201516101be919061045d565b60028160200151600281111561020957610209610e69565b0361021f578051604082015161021f919061067c565b5060010161015a565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67383838360405161025c93929190610eab565b60405180910390a161026f83838361082b565b505050565b80516001600160a01b03166102aa5780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b80516001600160a01b031630148015906102cd575080516001600160a01b03163b155b156102f95780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b80604001515160000361032d5780516040516305fb96cb60e41b81526001600160a01b0390911660048201526024016100a0565b50565b6000805160206110da833981519152610349818461087e565b6103595761035781846108a5565b505b815160005b8181101561045657600084828151811061037a5761037a610e53565b602090810291909101015190506001600160e01b031981166103af576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b0316156103fe57604051630e6c4db160e41b81526001600160e01b0319821660048201526024016100a0565b6001600160e01b031981166000818152600286016020908152604080832080546001600160a01b0319166001600160a01b038c16908117909155835260038801909152902061044c916108ba565b505060010161035e565b5050505050565b6000805160206110da833981519152306001600160a01b0384160361049557604051630e7ce30960e11b815260040160405180910390fd5b61049f818461087e565b6104af576104ad81846108a5565b505b815160005b818110156104565760008482815181106104d0576104d0610e53565b602090810291909101015190506001600160e01b03198116610505576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b031630810361054a57604051630e7ce30960e11b815260040160405180910390fd5b6001600160a01b03811661057c5760405163126f174360e11b81526001600160a01b03881660048201526024016100a0565b866001600160a01b0316816001600160a01b0316036105ba57604051631403eec360e21b81526001600160e01b0319831660048201526024016100a0565b6001600160e01b031982166000818152600287016020908152604080832080546001600160a01b0319166001600160a01b038d8116919091179091558516835260038901909152902061060c916108c6565b506001600160a01b0387166000908152600386016020526040902061063b906001600160e01b031984166108ba565b506001600160a01b0381166000908152600386016020526040902061065f906108d2565b6000036106725761067085826108dc565b505b50506001016104b4565b6000805160206110da833981519152306001600160a01b038416036106b457604051630e7ce30960e11b815260040160405180910390fd5b6106be818461087e565b6106e6576040516344ae58e160e01b81526001600160a01b03841660048201526024016100a0565b60005b82518110156107f057600083828151811061070657610706610e53565b602090810291909101015190506001600160e01b0319811661073b576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002840160205260409020546001600160a01b0386811691161461079c5760405162062efb60e51b81526001600160a01b03861660048201526001600160e01b0319821660248201526044016100a0565b6001600160e01b031981166000818152600285016020908152604080832080546001600160a01b03191690556001600160a01b03891683526003870190915290206107e6916108c6565b50506001016106e9565b506001600160a01b03831660009081526003820160205260409020610814906108d2565b60000361026f5761082581846108dc565b50505050565b6001600160a01b03821661083e57505050565b816001600160a01b03163b60000361087457604051633b367e1560e21b81526001600160a01b03831660048201526024016100a0565b61082582826108f1565b6001600160a01b038116600090815260018301602052604081205415155b90505b92915050565b600061089c836001600160a01b038416610968565b600061089c8383610968565b600061089c83836109b7565b600061089f825490565b600061089c836001600160a01b0384166109b7565b6060600080846001600160a01b03168460405161090e9190610fae565b600060405180830381855af49150503d8060008114610949576040519150601f19603f3d011682016040523d82523d6000602084013e61094e565b606091505b50909250905061095f858383610aaa565b95945050505050565b60008181526001830160205260408120546109af5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561089f565b50600061089f565b60008181526001830160205260408120548015610aa05760006109db600183610fca565b85549091506000906109ef90600190610fca565b9050808214610a54576000866000018281548110610a0f57610a0f610e53565b9060005260206000200154905080876000018481548110610a3257610a32610e53565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610a6557610a65610feb565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061089f565b600091505061089f565b606082610abf57610aba82610b09565b610b02565b8151158015610ad657506001600160a01b0384163b155b15610aff57604051639996b31560e01b81526001600160a01b03851660048201526024016100a0565b50805b9392505050565b805115610b195780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715610b6a57610b6a610b32565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610b9857610b98610b32565b604052919050565b60006001600160401b03821115610bb957610bb9610b32565b5060051b60200190565b80516001600160a01b0381168114610bda57600080fd5b919050565b60005b83811015610bfa578181015183820152602001610be2565b50506000910152565b600082601f830112610c1457600080fd5b81516001600160401b03811115610c2d57610c2d610b32565b610c40601f8201601f1916602001610b70565b818152846020838601011115610c5557600080fd5b610c66826020830160208701610bdf565b949350505050565b600060208284031215610c8057600080fd5b81516001600160401b0380821115610c9757600080fd5b9083019060608286031215610cab57600080fd5b610cb3610b48565b825182811115610cc257600080fd5b8301601f81018713610cd357600080fd5b8051610ce6610ce182610ba0565b610b70565b8082825260208201915060208360051b850101925089831115610d0857600080fd5b602084015b83811015610e0e57805187811115610d2457600080fd5b85016060818d03601f19011215610d3a57600080fd5b610d42610b48565b610d4e60208301610bc3565b8152604082015160038110610d6257600080fd5b6020820152606082015189811115610d7957600080fd5b8083019250508c603f830112610d8e57600080fd5b6020820151610d9f610ce182610ba0565b81815260059190911b83016040019060208101908f831115610dc057600080fd5b6040850194505b82851015610df85784516001600160e01b031981168114610de757600080fd5b825260209485019490910190610dc7565b6040840152505084525060209283019201610d0d565b50845250610e2191505060208401610bc3565b6020820152604083015182811115610e3857600080fd5b610e4487828601610c03565b60408301525095945050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b60008151808452610e97816020860160208601610bdf565b601f01601f19169290920160200192915050565b60006060808301606084528087518083526080925060808601915060808160051b8701016020808b0160005b84811015610f7e57898403607f19018652815180516001600160a01b03168552838101518986019060038110610f1d57634e487b7160e01b600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b80831015610f695783516001600160e01b0319168252928601926001929092019190860190610f3f565b50978501979550505090820190600101610ed7565b50506001600160a01b038a16908801528681036040880152610fa08189610e7f565b9a9950505050505050505050565b60008251610fc0818460208701610bdf565b9190910192915050565b8181038181111561089f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60cb8061100f6000396000f3fe608060405236600a57005b60106012565b005b6000601a6069565b9050806001600160a01b03163b6000036046576040516321f27f0d60e21b815260040160405180910390fd5b3660008037600080366000845af43d6000803e8080156064573d6000f35b3d6000fd5b600080356001600160e01b03191681527fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc90260205260409020546001600160a01b03168060c857604051630ff409c160e11b815260040160405180910390fd5b9056c6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc900","sourceMap":"396:796:68:-:0;;;587:177;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;303:66:85;540:14:84;;;;;;;539:15;;564:53;;2049:4;2041:25;:30;;564:53;;;581:9;;594:1;581:9;;;;:14;;564:53;560:124;;;667:9;;634:43;;-1:-1:-1;;;634:43:84;;667:9;;;;634:43;;;4784:42:514;4757:18;;634:43:84;;;;;;;;560:124;689:13;;-1:-1:-1;;689:13:84;701:1;689:13;;;708:56;;;;736:21;;-1:-1:-1;;;;736:21:84;;;;;708:56;670:25:68;;703:19:::1;::::0;::::1;::::0;730:23:::1;::::0;::::1;::::0;651:108:::1;::::0;670:25;703:19;651:11:::1;:108::i;:::-;780:14:84::0;776:84;;;804:22;;-1:-1:-1;;;;804:22:84;;;839:14;;-1:-1:-1;4784:42:514;;839:14:84;;4772:2:514;4757:18;839:14:84;;;;;;;776:84;435:429;;587:177:68;396:796;;646:888:71;780:9;:16;800:1;780:21;776:68;;810:34;;-1:-1:-1;;;810:34:71;;;;;;;;;;;776:68;856:9;851:569;871:9;:16;867:1;:20;851:569;;;902:33;938:9;948:1;938:12;;;;;;;;:::i;:::-;;;;;;;902:48;;959:27;977:8;959:17;;;:27;;:::i;:::-;1018;999:8;:15;;;:46;;;;;;;;:::i;:::-;;995:419;;1067:21;;1090:26;;;;1057:60;;1067:21;1057:9;:60::i;:::-;995:419;;;1155:31;1136:8;:15;;;:50;;;;;;;;:::i;:::-;;1132:282;;1212:21;;1235:26;;;;1198:64;;1212:21;1198:13;:64::i;1132:282::-;1300:30;1281:8;:15;;;:49;;;;;;;;:::i;:::-;;1277:137;;1355:21;;1378:26;;;;1342:63;;1355:21;1342:12;:63::i;:::-;-1:-1:-1;889:3:71;;851:569;;;;1431:40;1442:9;1453:4;1459:11;1431:40;;;;;;;;:::i;:::-;;;;;;;;1478:51;1500:9;1511:4;1517:11;1478:21;:51::i;:::-;646:888;;;:::o;4746:500::-;4832:21;;-1:-1:-1;;;;;4832:35:71;4828:109;;4908:21;;4884:46;;-1:-1:-1;;;4884:46:71;;-1:-1:-1;;;;;7954:32:514;;;4884:46:71;;;7936:51:514;7909:18;;4884:46:71;7790:203:514;4828:109:71;4954:21;;-1:-1:-1;;;;;4954:38:71;4987:4;4954:38;;;;:86;;-1:-1:-1;5002:21:71;;-1:-1:-1;;;;;5002:33:71;;:38;4954:86;4943:172;;;5086:21;;5062:46;;-1:-1:-1;;;5062:46:71;;-1:-1:-1;;;;;7954:32:514;;;5062:46:71;;;7936:51:514;7909:18;;5062:46:71;7790:203:514;4943:172:71;5125:8;:26;;;:33;5162:1;5125:38;5121:121;;5213:21;;5180:55;;-1:-1:-1;;;5180:55:71;;-1:-1:-1;;;;;7954:32:514;;;5180:55:71;;;7936:51:514;7909:18;;5180:55:71;7790:203:514;5121:121:71;4746:500;:::o;1667:761::-;-1:-1:-1;;;;;;;;;;;1855:25:71;377:66:73;1874:5:71;1855:18;:25::i;:::-;1850:52;;1882:20;:2;1896:5;1882:13;:20::i;:::-;;1850:52;1933:16;;1909:21;1996:428;2016:13;2012:1;:17;1996:428;;;2041:15;2059:9;2069:1;2059:12;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;;;2084:21:71;;2080:81;;2124:28;;-1:-1:-1;;;2124:28:71;;;;;;;;;;;2080:81;-1:-1:-1;;;;;;2173:28:71;;2213:1;2173:28;;;:18;;;:28;;;;;;-1:-1:-1;;;;;2173:28:71;:42;2169:116;;2234:42;;-1:-1:-1;;;2234:42:71;;-1:-1:-1;;;;;;8160:33:514;;2234:42:71;;;8142:52:514;8115:18;;2234:42:71;7998:202:514;2169:116:71;-1:-1:-1;;;;;;2293:28:71;;;;;;:18;;;:28;;;;;;;;:36;;-1:-1:-1;;;;;;2293:36:71;-1:-1:-1;;;;;2293:36:71;;;;;;;;2337:26;;:19;;;:26;;;;;:40;;:30;:40::i;:::-;-1:-1:-1;;2406:3:71;;1996:428;;;;1737:691;;1667:761;;:::o;3484:1175::-;-1:-1:-1;;;;;;;;;;;3656:4:71;-1:-1:-1;;;;;3639:22:71;;;3635:62;;3670:27;;-1:-1:-1;;;3670:27:71;;;;;;;;;;;3635:62;3709:25;:2;3728:5;3709:18;:25::i;:::-;3704:52;;3736:20;:2;3750:5;3736:13;:20::i;:::-;;3704:52;3787:16;;3763:21;3810:845;3830:13;3826:1;:17;3810:845;;;3855:15;3873:9;3883:1;3873:12;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;;;3898:21:71;;3894:81;;3938:28;;-1:-1:-1;;;3938:28:71;;;;;;;;;;;3894:81;-1:-1:-1;;;;;;4002:28:71;;3983:16;4002:28;;;:18;;;:28;;;;;;-1:-1:-1;;;;;4002:28:71;4063:4;4043:25;;4039:65;;4077:27;;-1:-1:-1;;;4077:27:71;;;;;;;;;;;4039:65;-1:-1:-1;;;;;4117:22:71;;4113:92;;4158:38;;-1:-1:-1;;;4158:38:71;;-1:-1:-1;;;;;7954:32:514;;4158:38:71;;;7936:51:514;7909:18;;4158:38:71;7790:203:514;4113:92:71;4229:5;-1:-1:-1;;;;;4217:17:71;:8;-1:-1:-1;;;;;4217:17:71;;4213:104;;4253:55;;-1:-1:-1;;;4253:55:71;;-1:-1:-1;;;;;;8160:33:514;;4253:55:71;;;8142:52:514;8115:18;;4253:55:71;7998:202:514;4213:104:71;-1:-1:-1;;;;;;4366:28:71;;;;;;:18;;;:28;;;;;;;;:36;;-1:-1:-1;;;;;;4366:36:71;-1:-1:-1;;;;;4366:36:71;;;;;;;;;;4411:29;;;;:19;;;:29;;;;;:46;;:36;:46::i;:::-;-1:-1:-1;;;;;;4466:26:71;;;;;;:19;;;:26;;;;;:40;;-1:-1:-1;;;;;;4466:40:71;;:30;:40::i;:::-;-1:-1:-1;;;;;;4519:29:71;;;;;;:19;;;:29;;;;;:38;;:36;:38::i;:::-;4561:1;4519:43;4515:94;;4574:26;:2;4591:8;4574:16;:26::i;:::-;;4515:94;-1:-1:-1;;4637:3:71;;3810:845;;2565:786;-1:-1:-1;;;;;;;;;;;2736:4:71;-1:-1:-1;;;;;2719:22:71;;;2715:62;;2750:27;;-1:-1:-1;;;2750:27:71;;;;;;;;;;;2715:62;2789:25;:2;2808:5;2789:18;:25::i;:::-;2784:69;;2823:30;;-1:-1:-1;;;2823:30:71;;-1:-1:-1;;;;;7954:32:514;;2823:30:71;;;7936:51:514;7909:18;;2823:30:71;7790:203:514;2784:69:71;2865:9;2860:397;2880:9;:16;2876:1;:20;2860:397;;;2911:15;2929:9;2939:1;2929:12;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;;;2954:21:71;;2950:81;;2994:28;;-1:-1:-1;;;2994:28:71;;;;;;;;;;;2950:81;-1:-1:-1;;;;;;3043:28:71;;;;;;:18;;;:28;;;;;;-1:-1:-1;;;;;3043:37:71;;;:28;;:37;3039:116;;3099:47;;-1:-1:-1;;;3099:47:71;;-1:-1:-1;;;;;8395:32:514;;3099:47:71;;;8377:51:514;-1:-1:-1;;;;;;8464:33:514;;8444:18;;;8437:61;8350:18;;3099:47:71;8205:299:514;3039:116:71;-1:-1:-1;;;;;;3170:28:71;;;;;;:18;;;:28;;;;;;;;3163:35;;-1:-1:-1;;;;;;3163:35:71;;;-1:-1:-1;;;;;3207:26:71;;;;:19;;;:26;;;;;:43;;:33;:43::i;:::-;-1:-1:-1;;2898:3:71;;2860:397;;;-1:-1:-1;;;;;;3267:26:71;;;;;;:19;;;:26;;;;;:35;;:33;:35::i;:::-;3306:1;3267:40;3263:84;;3317:23;:2;3334:5;3317:16;:23::i;:::-;;2638:713;2565:786;;:::o;5372:306::-;-1:-1:-1;;;;;5506:18:71;;5502:31;;5372:306;;;:::o;5502:31::-;5543:4;-1:-1:-1;;;;;5543:16:71;;5563:1;5543:21;5539:81;;5581:32;;-1:-1:-1;;;5581:32:71;;-1:-1:-1;;;;;7954:32:514;;5581::71;;;7936:51:514;7909:18;;5581:32:71;7790:203:514;5539:81:71;5626:47;5655:4;5661:11;5626:28;:47::i;8871:165:447:-;-1:-1:-1;;;;;9004:23:447;;8951:4;4360:21;;;:14;;;:21;;;;;;:26;;8974:55;8967:62;;8871:165;;;;;:::o;8316:150::-;8386:4;8409:50;8414:3;-1:-1:-1;;;;;8434:23:447;;8409:4;:50::i;5930:123::-;6000:4;6023:23;6028:3;6040:5;6023:4;:23::i;6221:129::-;6294:4;6317:26;6325:3;6337:5;6317:7;:26::i;6650:115::-;6713:7;6739:19;6747:3;4556:18;;4474:107;8634:156;8707:4;8730:53;8738:3;-1:-1:-1;;;;;8758:23:447;;8730:7;:53::i;4106:253:428:-;4189:12;4214;4228:23;4255:6;-1:-1:-1;;;;;4255:19:428;4275:4;4255:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4213:67:428;;-1:-1:-1;4213:67:428;-1:-1:-1;4297:55:428;4324:6;4213:67;;4297:26;:55::i;:::-;4290:62;4106:253;-1:-1:-1;;;;;4106:253:428:o;2241:406:447:-;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:447;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:447;2618:12;;2815:1368;2881:4;3010:21;;;:14;;;:21;;;;;;3046:13;;3042:1135;;3413:18;3434:12;3445:1;3434:8;:12;:::i;:::-;3480:18;;3413:33;;-1:-1:-1;3460:17:447;;3480:22;;3501:1;;3480:22;:::i;:::-;3460:42;;3535:9;3521:10;:23;3517:378;;3564:17;3584:3;:11;;3596:9;3584:22;;;;;;;;:::i;:::-;;;;;;;;;3564:42;;3731:9;3705:3;:11;;3717:10;3705:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;3844:25;;;:14;;;:25;;;;;:36;;;3517:378;3973:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4076:3;:14;;:21;4091:5;4076:21;;;;;;;;;;;4069:28;;;4119:4;4112:11;;;;;;;3042:1135;4161:5;4154:12;;;;;4625:582:428;4769:12;4798:7;4793:408;;4821:19;4829:10;4821:7;:19::i;:::-;4793:408;;;5045:17;;:22;:49;;;;-1:-1:-1;;;;;;5071:18:428;;;:23;5045:49;5041:119;;;5121:24;;-1:-1:-1;;;5121:24:428;;-1:-1:-1;;;;;7954:32:514;;5121:24:428;;;7936:51:514;7909:18;;5121:24:428;7790:203:514;5041:119:428;-1:-1:-1;5180:10:428;4793:408;4625:582;;;;;:::o;5743:516::-;5874:17;;:21;5870:383;;6102:10;6096:17;6158:15;6145:10;6141:2;6137:19;6130:44;5870:383;6225:17;;-1:-1:-1;;;6225:17:428;;;;;;;;;;;14:127:514;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:253;218:2;212:9;260:4;248:17;;-1:-1:-1;;;;;280:34:514;;316:22;;;277:62;274:88;;;342:18;;:::i;:::-;378:2;371:22;146:253;:::o;404:275::-;475:2;469:9;540:2;521:13;;-1:-1:-1;;517:27:514;505:40;;-1:-1:-1;;;;;560:34:514;;596:22;;;557:62;554:88;;;622:18;;:::i;:::-;658:2;651:22;404:275;;-1:-1:-1;404:275:514:o;684:191::-;752:4;-1:-1:-1;;;;;774:30:514;;771:56;;;807:18;;:::i;:::-;-1:-1:-1;852:1:514;848:14;864:4;844:25;;684:191::o;880:177::-;959:13;;-1:-1:-1;;;;;1001:31:514;;991:42;;981:70;;1047:1;1044;1037:12;981:70;880:177;;;:::o;1062:250::-;1147:1;1157:113;1171:6;1168:1;1165:13;1157:113;;;1247:11;;;1241:18;1228:11;;;1221:39;1193:2;1186:10;1157:113;;;-1:-1:-1;;1304:1:514;1286:16;;1279:27;1062:250::o;1317:509::-;1370:5;1423:3;1416:4;1408:6;1404:17;1400:27;1390:55;;1441:1;1438;1431:12;1390:55;1464:13;;-1:-1:-1;;;;;1489:26:514;;1486:52;;;1518:18;;:::i;:::-;1562:55;1605:2;1586:13;;-1:-1:-1;;1582:27:514;1611:4;1578:38;1562:55;:::i;:::-;1642:2;1633:7;1626:19;1688:3;1681:4;1676:2;1668:6;1664:15;1660:26;1657:35;1654:55;;;1705:1;1702;1695:12;1654:55;1718:77;1792:2;1785:4;1776:7;1772:18;1765:4;1757:6;1753:17;1718:77;:::i;:::-;1813:7;1317:509;-1:-1:-1;;;;1317:509:514:o;1831:2804::-;1930:6;1983:2;1971:9;1962:7;1958:23;1954:32;1951:52;;;1999:1;1996;1989:12;1951:52;2026:16;;-1:-1:-1;;;;;2091:14:514;;;2088:34;;;2118:1;2115;2108:12;2088:34;2141:22;;;;2197:4;2179:16;;;2175:27;2172:47;;;2215:1;2212;2205:12;2172:47;2241:22;;:::i;:::-;2294:2;2288:9;2322:2;2312:8;2309:16;2306:36;;;2338:1;2335;2328:12;2306:36;2361:17;;2409:4;2401:13;;2397:27;-1:-1:-1;2387:55:514;;2438:1;2435;2428:12;2387:55;2467:2;2461:9;2490:68;2506:51;2554:2;2506:51;:::i;:::-;2490:68;:::i;:::-;2580:3;2604:2;2599:3;2592:15;2632:2;2627:3;2623:12;2616:19;;2683:2;2677;2674:1;2670:10;2666:2;2662:19;2658:28;2644:42;;2709:7;2701:6;2698:19;2695:39;;;2730:1;2727;2720:12;2695:39;2762:2;2758;2754:11;2774:1551;2790:6;2785:3;2782:15;2774:1551;;;2869:3;2863:10;2905:2;2892:11;2889:19;2886:39;;;2921:1;2918;2911:12;2886:39;2948:20;;3020:4;2992:16;;;-1:-1:-1;;2988:30:514;2984:41;2981:61;;;3038:1;3035;3028:12;2981:61;3070:22;;:::i;:::-;3121:42;3159:2;3155;3151:11;3121:42;:::i;:::-;3112:7;3105:59;3206:2;3202;3198:11;3192:18;3245:1;3236:7;3233:14;3223:42;;3261:1;3258;3251:12;3223:42;3298:2;3285:16;;3278:33;3354:4;3346:13;;3340:20;3376:16;;;3373:36;;;3405:1;3402;3395:12;3373:36;3440:8;3436:2;3432:17;3422:27;;;3489:7;3484:2;3480;3476:11;3472:25;3462:53;;3511:1;3508;3501:12;3462:53;3552:2;3548;3544:11;3538:18;3582:68;3598:51;3646:2;3598:51;:::i;3582:68::-;3694:17;;;3792:1;3788:10;;;;3780:19;;3801:2;3776:28;;3744:2;3733:14;;;3820:21;;;3817:41;;;3854:1;3851;3844:12;3817:41;3892:2;3888;3884:11;3871:24;;3908:298;3926:8;3919:5;3916:19;3908:298;;;4009:12;;-1:-1:-1;;;;;;4060:34:514;;4048:47;;4038:75;;4109:1;4106;4099:12;4038:75;4130:22;;4189:2;3947:14;;;;4178;;;;3908:298;;;4239:2;4226:16;;4219:31;-1:-1:-1;;4263:20:514;;-1:-1:-1;4312:2:514;4303:12;;;;2807;2774:1551;;;-1:-1:-1;4334:20:514;;-1:-1:-1;4386:42:514;;-1:-1:-1;;4424:2:514;4416:11;;4386:42;:::i;:::-;4381:2;4374:5;4370:14;4363:66;4468:2;4464;4460:11;4454:18;4497:2;4487:8;4484:16;4481:36;;;4513:1;4510;4503:12;4481:36;4549:55;4596:7;4585:8;4581:2;4577:17;4549:55;:::i;:::-;4544:2;4533:14;;4526:79;-1:-1:-1;4537:5:514;1831:2804;-1:-1:-1;;;;;1831:2804:514:o;5043:127::-;5104:10;5099:3;5095:20;5092:1;5085:31;5135:4;5132:1;5125:15;5159:4;5156:1;5149:15;5175:127;5236:10;5231:3;5227:20;5224:1;5217:31;5267:4;5264:1;5257:15;5291:4;5288:1;5281:15;5416:270;5457:3;5495:5;5489:12;5522:6;5517:3;5510:19;5538:76;5607:6;5600:4;5595:3;5591:14;5584:4;5577:5;5573:16;5538:76;:::i;:::-;5668:2;5647:15;-1:-1:-1;;5643:29:514;5634:39;;;;5675:4;5630:50;;5416:270;-1:-1:-1;;5416:270:514:o;5691:2094::-;5961:4;5990:2;6030;6019:9;6015:18;6060:2;6049:9;6042:21;6083:6;6118;6112:13;6149:6;6141;6134:22;6175:3;6165:13;;6209:3;6198:9;6194:19;6187:26;;6272:3;6262:6;6259:1;6255:14;6244:9;6240:30;6236:40;6295:4;6334:2;6326:6;6322:15;6355:1;6365:1249;6379:6;6376:1;6373:13;6365:1249;;;6444:22;;;-1:-1:-1;;6440:37:514;6428:50;;6501:13;;6588:9;;-1:-1:-1;;;;;6584:35:514;6569:51;;6659:11;;;6653:18;6541:15;;;;6711:1;6694:19;;6684:170;;6764:10;6759:3;6755:20;6752:1;6745:31;6803:4;6800:1;6793:15;6835:4;6832:1;6825:15;6684:170;6874:15;;;6867:37;6927:4;6972:11;;;6966:18;7004:15;;;6997:27;;;7085:21;;7119:24;;;;7209:23;;;;-1:-1:-1;;7165:15:514;;;;7270:236;7286:8;7281:3;7278:17;7270:236;;;7367:15;;-1:-1:-1;;;;;;7363:42:514;7349:57;;7475:17;;;;7314:1;7305:11;;;;;7432:14;;;;7270:236;;;-1:-1:-1;7592:12:514;;;;7529:5;-1:-1:-1;;;7557:15:514;;;;6401:1;6394:9;6365:1249;;;-1:-1:-1;;;;;;;5373:31:514;;7650:18;;;5361:44;7707:22;;;7700:4;7685:20;;7678:52;7747:32;7711:6;7764;7747:32;:::i;:::-;7739:40;5691:2094;-1:-1:-1;;;;;;;;;;5691:2094:514:o;8509:287::-;8638:3;8676:6;8670:13;8692:66;8751:6;8746:3;8739:4;8731:6;8727:17;8692:66;:::i;:::-;8774:16;;;;;8509:287;-1:-1:-1;;8509:287:514:o;8801:225::-;8868:9;;;8889:11;;;8886:134;;;8942:10;8937:3;8933:20;8930:1;8923:31;8977:4;8974:1;8967:15;9005:4;9002:1;8995:15;9031:127;9092:10;9087:3;9083:20;9080:1;9073:31;9123:4;9120:1;9113:15;9147:4;9144:1;9137:15;9031:127;396:796:68;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405236600a57005b60106012565b005b6000601a6069565b9050806001600160a01b03163b6000036046576040516321f27f0d60e21b815260040160405180910390fd5b3660008037600080366000845af43d6000803e8080156064573d6000f35b3d6000fd5b600080356001600160e01b03191681527fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc90260205260409020546001600160a01b03168060c857604051630ff409c160e11b815260040160405180910390fd5b9056","sourceMap":"396:796:68:-:0;;;;;;;;284:11:136;:9;:11::i;:::-;396:796:68;304:527:136;340:13;356:20;:18;:20::i;:::-;340:36;;387:5;-1:-1:-1;;;;;387:17:136;;408:1;387:22;383:71;;418:36;;-1:-1:-1;;;418:36:136;;;;;;;;;;;383:71;549:14;546:1;543;530:34;634:1;631;615:14;612:1;605:5;598;585:51;664:16;661:1;658;643:38;696:6;709:52;;;;796:16;793:1;786:27;709:52;736:16;733:1;726:27;975:215:68;1065:13;1110:7;;-1:-1:-1;;;;;;1110:7:68;1186:52:90;;:42;:52;;;;;;-1:-1:-1;;;;;1186:52:90;;1124:61:68;;1156:29;;-1:-1:-1;;;1156:29:68;;;;;;;;;;;1124:61;975:215;:::o","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facetAddress\",\"type\":\"address\"},{\"internalType\":\"enum IDiamond.FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"functionSelectors\",\"type\":\"bytes4[]\"}],\"internalType\":\"struct IDiamond.FacetCut[]\",\"name\":\"baseFacets\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"init\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initData\",\"type\":\"bytes\"}],\"internalType\":\"struct Diamond.InitParams\",\"name\":\"initDiamondCut\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"DiamondCut_FunctionAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"DiamondCut_FunctionDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"DiamondCut_FunctionFromSameFacetAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DiamondCut_ImmutableFacet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"init\",\"type\":\"address\"}],\"name\":\"DiamondCut_InvalidContract\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"DiamondCut_InvalidFacet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DiamondCut_InvalidFacetCutAction\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DiamondCut_InvalidFacetCutLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"DiamondCut_InvalidFacetRemoval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"DiamondCut_InvalidFacetSelectors\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DiamondCut_InvalidSelector\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Diamond_UnsupportedFunction\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initializable_AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Proxy__ImplementationIsNotContract\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facetAddress\",\"type\":\"address\"},{\"internalType\":\"enum IDiamond.FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"functionSelectors\",\"type\":\"bytes4[]\"}],\"indexed\":false,\"internalType\":\"struct IDiamond.FacetCut[]\",\"name\":\"facetCuts\",\"type\":\"tuple[]\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"init\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"initPayload\",\"type\":\"bytes\"}],\"name\":\"DiamondCut\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"FailedInnerCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}]},\"events\":{\"DiamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"params\":{\"facetCuts\":\"Facet addresses and function selectors.\",\"init\":\"Address of contract or facet to execute initPayload.\",\"initPayload\":\"A function call, including function selector and arguments.\"}}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"errors\":{\"Diamond_UnsupportedFunction()\":[{\"notice\":\"Thrown when calling a function that was not registered in the diamond.\"}]},\"events\":{\"DiamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"notice\":\"Event emitted when facets are added/removed/replaced\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/diamond/Diamond.sol\":\"Diamond\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/Diamond.sol\":{\"keccak256\":\"0x9e4da6928d58a8f0f62062cd4070dbcebdb716539e7a9d5cdb24588f5e20b84b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c1db36481f741516e8bf5b6ce4eccbc8f91b6a5ee4351cb629e5c5f9b04c19f2\",\"dweb:/ipfs/QmUVbZLWr9evtBpD3q9z9V1EJrchujUUxbS4SFKTEj5pU5\"]},\"contracts/src/diamond/IDiamond.sol\":{\"keccak256\":\"0xd4907618ad3b9847c656008815820f23a89a587e408712b450cff075625e1553\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://652645a543f65b0415327a8a88398fc7835b1d6ee01df8c898f9e43867d02714\",\"dweb:/ipfs/QmPXt4Kks2o5CJKbT8U1mCryQJP6EMzzP5kdcqUFvXX7y5\"]},\"contracts/src/diamond/facets/cut/DiamondCutBase.sol\":{\"keccak256\":\"0x45ed391ae6aa52996ce3fc3095b0d420457fa5f58a2c5a2f9939e2b55dc8e7a6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f6a5e87525d3c98c10ceb838124d48fdf7e687ffddbdb1647b93dc5882d91339\",\"dweb:/ipfs/Qmf137S5255pVWXpfFnrU3fdE3G6Di2VuJQueBn8SC8cpd\"]},\"contracts/src/diamond/facets/cut/DiamondCutStorage.sol\":{\"keccak256\":\"0xf47d0ca88515dc8714c89931c5a91c402bac3fad08388d780a0873e962386071\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://04d4023a5be5140892c547bb5df4eb5906120d1eca3bf29fc562da991639c894\",\"dweb:/ipfs/QmVf28LUpAVeCz5Aiewbjt7ZzM6bixZn166aS1PVJGzSSX\"]},\"contracts/src/diamond/facets/cut/IDiamondCut.sol\":{\"keccak256\":\"0xa5985f00fabb7f6e5925542c9d0c955d4e7ec4f9ffe59d0fa81d75bed7ecdd55\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2ebbb450aac3c12f690d7457d04d6fc53736b36cc60dcd757e11840335103688\",\"dweb:/ipfs/QmbcjTgejYrj3m2Lj9hHpCe2wt63fmLhhN6aY8XFoScitw\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/loupe/DiamondLoupeBase.sol\":{\"keccak256\":\"0xad4a6b5803d9ba9cc7aba2d52a1f5129049f05102a202522550641877e348436\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b2ea927748e41a3a6c5ac7cd255a64b8d0eaddec1153e2bfa81b80bbdcffb4e\",\"dweb:/ipfs/QmW4hBGMrER8DFGeC8M7nGyomcazy3k8rDTUDMcRaZEs7G\"]},\"contracts/src/diamond/facets/loupe/IDiamondLoupe.sol\":{\"keccak256\":\"0xafbe8346e6043ac3f6977e9ca43603ca3bbbfc2c2962b47024cf9aa0dcb23f7f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7b0fd31aeddde2f351471e0fd1f5a5da20570491d5604420b283a4749838514c\",\"dweb:/ipfs/QmbuKxmTX8HC9SHNUPsraBTc6NWECwsbgmXsrpXjPqkLLi\"]},\"contracts/src/diamond/proxy/IProxy.sol\":{\"keccak256\":\"0xb3cc38cae21021aec88e128eaec4994e926e4961d166c7e6e3a40a41c69aa105\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6da721f34f1359068ebe71ce01472403940b4e8fe87c38ff5be2d77e673520e5\",\"dweb:/ipfs/QmfNgDv5eQsLzc9bKi1EGWdxDX84Vhr2SARa7zm4pcCdpy\"]},\"contracts/src/diamond/proxy/Proxy.sol\":{\"keccak256\":\"0xae6d6933073274683d2684fc806cffbdc157d56b181d7ea0c962c3cd7746b78d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://43378c060da21e547d10282839ff3dc690615c8993949f6a072f9ed4693ba548\",\"dweb:/ipfs/QmaT7GdtDpNBRJPLRnGEoGmZJSFNPkqHUzPde5LSYXc1q1\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"struct Diamond.InitParams","name":"initDiamondCut","type":"tuple","components":[{"internalType":"struct IDiamond.FacetCut[]","name":"baseFacets","type":"tuple[]","components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamond.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}]},{"internalType":"address","name":"init","type":"address"},{"internalType":"bytes","name":"initData","type":"bytes"}]}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"type":"error","name":"DiamondCut_FunctionAlreadyExists"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"type":"error","name":"DiamondCut_FunctionDoesNotExist"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"type":"error","name":"DiamondCut_FunctionFromSameFacetAlreadyExists"},{"inputs":[],"type":"error","name":"DiamondCut_ImmutableFacet"},{"inputs":[{"internalType":"address","name":"init","type":"address"}],"type":"error","name":"DiamondCut_InvalidContract"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"type":"error","name":"DiamondCut_InvalidFacet"},{"inputs":[],"type":"error","name":"DiamondCut_InvalidFacetCutAction"},{"inputs":[],"type":"error","name":"DiamondCut_InvalidFacetCutLength"},{"inputs":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"type":"error","name":"DiamondCut_InvalidFacetRemoval"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"type":"error","name":"DiamondCut_InvalidFacetSelectors"},{"inputs":[],"type":"error","name":"DiamondCut_InvalidSelector"},{"inputs":[],"type":"error","name":"Diamond_UnsupportedFunction"},{"inputs":[],"type":"error","name":"FailedInnerCall"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32"}],"type":"error","name":"Initializable_AlreadyInitialized"},{"inputs":[],"type":"error","name":"Proxy__ImplementationIsNotContract"},{"inputs":[{"internalType":"struct IDiamond.FacetCut[]","name":"facetCuts","type":"tuple[]","components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamond.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"indexed":false},{"internalType":"address","name":"init","type":"address","indexed":false},{"internalType":"bytes","name":"initPayload","type":"bytes","indexed":false}],"type":"event","name":"DiamondCut","anonymous":false},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[],"stateMutability":"payable","type":"fallback"},{"inputs":[],"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/diamond/Diamond.sol":"Diamond"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/Diamond.sol":{"keccak256":"0x9e4da6928d58a8f0f62062cd4070dbcebdb716539e7a9d5cdb24588f5e20b84b","urls":["bzz-raw://c1db36481f741516e8bf5b6ce4eccbc8f91b6a5ee4351cb629e5c5f9b04c19f2","dweb:/ipfs/QmUVbZLWr9evtBpD3q9z9V1EJrchujUUxbS4SFKTEj5pU5"],"license":"Apache-2.0"},"contracts/src/diamond/IDiamond.sol":{"keccak256":"0xd4907618ad3b9847c656008815820f23a89a587e408712b450cff075625e1553","urls":["bzz-raw://652645a543f65b0415327a8a88398fc7835b1d6ee01df8c898f9e43867d02714","dweb:/ipfs/QmPXt4Kks2o5CJKbT8U1mCryQJP6EMzzP5kdcqUFvXX7y5"],"license":"Apache-2.0"},"contracts/src/diamond/facets/cut/DiamondCutBase.sol":{"keccak256":"0x45ed391ae6aa52996ce3fc3095b0d420457fa5f58a2c5a2f9939e2b55dc8e7a6","urls":["bzz-raw://f6a5e87525d3c98c10ceb838124d48fdf7e687ffddbdb1647b93dc5882d91339","dweb:/ipfs/Qmf137S5255pVWXpfFnrU3fdE3G6Di2VuJQueBn8SC8cpd"],"license":"Apache-2.0"},"contracts/src/diamond/facets/cut/DiamondCutStorage.sol":{"keccak256":"0xf47d0ca88515dc8714c89931c5a91c402bac3fad08388d780a0873e962386071","urls":["bzz-raw://04d4023a5be5140892c547bb5df4eb5906120d1eca3bf29fc562da991639c894","dweb:/ipfs/QmVf28LUpAVeCz5Aiewbjt7ZzM6bixZn166aS1PVJGzSSX"],"license":"Apache-2.0"},"contracts/src/diamond/facets/cut/IDiamondCut.sol":{"keccak256":"0xa5985f00fabb7f6e5925542c9d0c955d4e7ec4f9ffe59d0fa81d75bed7ecdd55","urls":["bzz-raw://2ebbb450aac3c12f690d7457d04d6fc53736b36cc60dcd757e11840335103688","dweb:/ipfs/QmbcjTgejYrj3m2Lj9hHpCe2wt63fmLhhN6aY8XFoScitw"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/loupe/DiamondLoupeBase.sol":{"keccak256":"0xad4a6b5803d9ba9cc7aba2d52a1f5129049f05102a202522550641877e348436","urls":["bzz-raw://1b2ea927748e41a3a6c5ac7cd255a64b8d0eaddec1153e2bfa81b80bbdcffb4e","dweb:/ipfs/QmW4hBGMrER8DFGeC8M7nGyomcazy3k8rDTUDMcRaZEs7G"],"license":"Apache-2.0"},"contracts/src/diamond/facets/loupe/IDiamondLoupe.sol":{"keccak256":"0xafbe8346e6043ac3f6977e9ca43603ca3bbbfc2c2962b47024cf9aa0dcb23f7f","urls":["bzz-raw://7b0fd31aeddde2f351471e0fd1f5a5da20570491d5604420b283a4749838514c","dweb:/ipfs/QmbuKxmTX8HC9SHNUPsraBTc6NWECwsbgmXsrpXjPqkLLi"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/IProxy.sol":{"keccak256":"0xb3cc38cae21021aec88e128eaec4994e926e4961d166c7e6e3a40a41c69aa105","urls":["bzz-raw://6da721f34f1359068ebe71ce01472403940b4e8fe87c38ff5be2d77e673520e5","dweb:/ipfs/QmfNgDv5eQsLzc9bKi1EGWdxDX84Vhr2SARa7zm4pcCdpy"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/Proxy.sol":{"keccak256":"0xae6d6933073274683d2684fc806cffbdc157d56b181d7ea0c962c3cd7746b78d","urls":["bzz-raw://43378c060da21e547d10282839ff3dc690615c8993949f6a072f9ed4693ba548","dweb:/ipfs/QmaT7GdtDpNBRJPLRnGEoGmZJSFNPkqHUzPde5LSYXc1q1"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":68} \ No newline at end of file diff --git a/packages/generated/v3/abis/Diamond.metadata.json b/packages/generated/v3/abis/Diamond.metadata.json new file mode 100644 index 000000000..870c27a90 --- /dev/null +++ b/packages/generated/v3/abis/Diamond.metadata.json @@ -0,0 +1,401 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "struct Diamond.InitParams", + "name": "initDiamondCut", + "type": "tuple", + "components": [ + { + "internalType": "struct IDiamond.FacetCut[]", + "name": "baseFacets", + "type": "tuple[]", + "components": [ + { + "internalType": "address", + "name": "facetAddress", + "type": "address" + }, + { + "internalType": "enum IDiamond.FacetCutAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "bytes4[]", + "name": "functionSelectors", + "type": "bytes4[]" + } + ] + }, + { + "internalType": "address", + "name": "init", + "type": "address" + }, + { + "internalType": "bytes", + "name": "initData", + "type": "bytes" + } + ] + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "type": "error", + "name": "AddressEmptyCode" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "type": "error", + "name": "DiamondCut_FunctionAlreadyExists" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "facet", + "type": "address" + } + ], + "type": "error", + "name": "DiamondCut_FunctionDoesNotExist" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "type": "error", + "name": "DiamondCut_FunctionFromSameFacetAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "DiamondCut_ImmutableFacet" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "init", + "type": "address" + } + ], + "type": "error", + "name": "DiamondCut_InvalidContract" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "facet", + "type": "address" + } + ], + "type": "error", + "name": "DiamondCut_InvalidFacet" + }, + { + "inputs": [], + "type": "error", + "name": "DiamondCut_InvalidFacetCutAction" + }, + { + "inputs": [], + "type": "error", + "name": "DiamondCut_InvalidFacetCutLength" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "facet", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "type": "error", + "name": "DiamondCut_InvalidFacetRemoval" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "facet", + "type": "address" + } + ], + "type": "error", + "name": "DiamondCut_InvalidFacetSelectors" + }, + { + "inputs": [], + "type": "error", + "name": "DiamondCut_InvalidSelector" + }, + { + "inputs": [], + "type": "error", + "name": "Diamond_UnsupportedFunction" + }, + { + "inputs": [], + "type": "error", + "name": "FailedInnerCall" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32" + } + ], + "type": "error", + "name": "Initializable_AlreadyInitialized" + }, + { + "inputs": [], + "type": "error", + "name": "Proxy__ImplementationIsNotContract" + }, + { + "inputs": [ + { + "internalType": "struct IDiamond.FacetCut[]", + "name": "facetCuts", + "type": "tuple[]", + "components": [ + { + "internalType": "address", + "name": "facetAddress", + "type": "address" + }, + { + "internalType": "enum IDiamond.FacetCutAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "bytes4[]", + "name": "functionSelectors", + "type": "bytes4[]" + } + ], + "indexed": false + }, + { + "internalType": "address", + "name": "init", + "type": "address", + "indexed": false + }, + { + "internalType": "bytes", + "name": "initPayload", + "type": "bytes", + "indexed": false + } + ], + "type": "event", + "name": "DiamondCut", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "stateMutability": "payable", + "type": "receive" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/diamond/Diamond.sol": "Diamond" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/Diamond.sol": { + "keccak256": "0x9e4da6928d58a8f0f62062cd4070dbcebdb716539e7a9d5cdb24588f5e20b84b", + "urls": [ + "bzz-raw://c1db36481f741516e8bf5b6ce4eccbc8f91b6a5ee4351cb629e5c5f9b04c19f2", + "dweb:/ipfs/QmUVbZLWr9evtBpD3q9z9V1EJrchujUUxbS4SFKTEj5pU5" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/IDiamond.sol": { + "keccak256": "0xd4907618ad3b9847c656008815820f23a89a587e408712b450cff075625e1553", + "urls": [ + "bzz-raw://652645a543f65b0415327a8a88398fc7835b1d6ee01df8c898f9e43867d02714", + "dweb:/ipfs/QmPXt4Kks2o5CJKbT8U1mCryQJP6EMzzP5kdcqUFvXX7y5" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/cut/DiamondCutBase.sol": { + "keccak256": "0x45ed391ae6aa52996ce3fc3095b0d420457fa5f58a2c5a2f9939e2b55dc8e7a6", + "urls": [ + "bzz-raw://f6a5e87525d3c98c10ceb838124d48fdf7e687ffddbdb1647b93dc5882d91339", + "dweb:/ipfs/Qmf137S5255pVWXpfFnrU3fdE3G6Di2VuJQueBn8SC8cpd" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/cut/DiamondCutStorage.sol": { + "keccak256": "0xf47d0ca88515dc8714c89931c5a91c402bac3fad08388d780a0873e962386071", + "urls": [ + "bzz-raw://04d4023a5be5140892c547bb5df4eb5906120d1eca3bf29fc562da991639c894", + "dweb:/ipfs/QmVf28LUpAVeCz5Aiewbjt7ZzM6bixZn166aS1PVJGzSSX" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/cut/IDiamondCut.sol": { + "keccak256": "0xa5985f00fabb7f6e5925542c9d0c955d4e7ec4f9ffe59d0fa81d75bed7ecdd55", + "urls": [ + "bzz-raw://2ebbb450aac3c12f690d7457d04d6fc53736b36cc60dcd757e11840335103688", + "dweb:/ipfs/QmbcjTgejYrj3m2Lj9hHpCe2wt63fmLhhN6aY8XFoScitw" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/loupe/DiamondLoupeBase.sol": { + "keccak256": "0xad4a6b5803d9ba9cc7aba2d52a1f5129049f05102a202522550641877e348436", + "urls": [ + "bzz-raw://1b2ea927748e41a3a6c5ac7cd255a64b8d0eaddec1153e2bfa81b80bbdcffb4e", + "dweb:/ipfs/QmW4hBGMrER8DFGeC8M7nGyomcazy3k8rDTUDMcRaZEs7G" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/loupe/IDiamondLoupe.sol": { + "keccak256": "0xafbe8346e6043ac3f6977e9ca43603ca3bbbfc2c2962b47024cf9aa0dcb23f7f", + "urls": [ + "bzz-raw://7b0fd31aeddde2f351471e0fd1f5a5da20570491d5604420b283a4749838514c", + "dweb:/ipfs/QmbuKxmTX8HC9SHNUPsraBTc6NWECwsbgmXsrpXjPqkLLi" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/IProxy.sol": { + "keccak256": "0xb3cc38cae21021aec88e128eaec4994e926e4961d166c7e6e3a40a41c69aa105", + "urls": [ + "bzz-raw://6da721f34f1359068ebe71ce01472403940b4e8fe87c38ff5be2d77e673520e5", + "dweb:/ipfs/QmfNgDv5eQsLzc9bKi1EGWdxDX84Vhr2SARa7zm4pcCdpy" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/Proxy.sol": { + "keccak256": "0xae6d6933073274683d2684fc806cffbdc157d56b181d7ea0c962c3cd7746b78d", + "urls": [ + "bzz-raw://43378c060da21e547d10282839ff3dc690615c8993949f6a072f9ed4693ba548", + "dweb:/ipfs/QmaT7GdtDpNBRJPLRnGEoGmZJSFNPkqHUzPde5LSYXc1q1" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/DiamondCutFacet.abi.json b/packages/generated/v3/abis/DiamondCutFacet.abi.json new file mode 100644 index 000000000..401d3b4fb --- /dev/null +++ b/packages/generated/v3/abis/DiamondCutFacet.abi.json @@ -0,0 +1,314 @@ +[ + { + "type": "function", + "name": "__DiamondCut_init", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "diamondCut", + "inputs": [ + { + "name": "facetCuts", + "type": "tuple[]", + "internalType": "struct IDiamond.FacetCut[]", + "components": [ + { + "name": "facetAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "action", + "type": "uint8", + "internalType": "enum IDiamond.FacetCutAction" + }, + { + "name": "functionSelectors", + "type": "bytes4[]", + "internalType": "bytes4[]" + } + ] + }, + { + "name": "init", + "type": "address", + "internalType": "address" + }, + { + "name": "initPayload", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "DiamondCut", + "inputs": [ + { + "name": "facetCuts", + "type": "tuple[]", + "indexed": false, + "internalType": "struct IDiamond.FacetCut[]", + "components": [ + { + "name": "facetAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "action", + "type": "uint8", + "internalType": "enum IDiamond.FacetCutAction" + }, + { + "name": "functionSelectors", + "type": "bytes4[]", + "internalType": "bytes4[]" + } + ] + }, + { + "name": "init", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "initPayload", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionAlreadyExists", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionDoesNotExist", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionFromSameFacetAlreadyExists", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_ImmutableFacet", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidContract", + "inputs": [ + { + "name": "init", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacet", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetCutAction", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetCutLength", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetRemoval", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + }, + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetSelectors", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidSelector", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_AlreadyInitialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "internalType": "uint32" + } + ] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/DiamondCutFacet.abi.ts b/packages/generated/v3/abis/DiamondCutFacet.abi.ts new file mode 100644 index 000000000..3bbc0f0c2 --- /dev/null +++ b/packages/generated/v3/abis/DiamondCutFacet.abi.ts @@ -0,0 +1,314 @@ +export default [ + { + "type": "function", + "name": "__DiamondCut_init", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "diamondCut", + "inputs": [ + { + "name": "facetCuts", + "type": "tuple[]", + "internalType": "struct IDiamond.FacetCut[]", + "components": [ + { + "name": "facetAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "action", + "type": "uint8", + "internalType": "enum IDiamond.FacetCutAction" + }, + { + "name": "functionSelectors", + "type": "bytes4[]", + "internalType": "bytes4[]" + } + ] + }, + { + "name": "init", + "type": "address", + "internalType": "address" + }, + { + "name": "initPayload", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "DiamondCut", + "inputs": [ + { + "name": "facetCuts", + "type": "tuple[]", + "indexed": false, + "internalType": "struct IDiamond.FacetCut[]", + "components": [ + { + "name": "facetAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "action", + "type": "uint8", + "internalType": "enum IDiamond.FacetCutAction" + }, + { + "name": "functionSelectors", + "type": "bytes4[]", + "internalType": "bytes4[]" + } + ] + }, + { + "name": "init", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "initPayload", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionAlreadyExists", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionDoesNotExist", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_FunctionFromSameFacetAlreadyExists", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_ImmutableFacet", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidContract", + "inputs": [ + { + "name": "init", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacet", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetCutAction", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetCutLength", + "inputs": [] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetRemoval", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + }, + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidFacetSelectors", + "inputs": [ + { + "name": "facet", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DiamondCut_InvalidSelector", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_AlreadyInitialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "internalType": "uint32" + } + ] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/DiamondCutFacet.bin b/packages/generated/v3/abis/DiamondCutFacet.bin new file mode 100644 index 000000000..2956331ff --- /dev/null +++ b/packages/generated/v3/abis/DiamondCutFacet.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b611207806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80631f931c1c1461003b5780634f4bb5d614610050575b600080fd5b61004e610049366004610e59565b610058565b005b61004e61018f565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031633146100a9576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6100b16101eb565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16806100f45750805463ffffffff808416911610155b1561011d578054604051630a8ef77f60e31b815263ffffffff90911660048201526024016100a0565b805464ffffffffff191663ffffffff831617640100000000178155610143858585610225565b805464ff000000001916815560405163ffffffff831681527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15050505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166101d957604051630ef4733760e31b815260040160405180910390fd5b6101e96307e4c70760e21b610361565b565b60007f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef52000546102209063ffffffff166001611026565b905090565b825160000361024757604051632795bfe160e11b815260040160405180910390fd5b60005b835181101561031557600084828151811061026757610267611043565b6020026020010151905061027a8161043f565b60008160200151600281111561029257610292611059565b036102ae576102a9816000015182604001516104fb565b61030c565b6001816020015160028111156102c6576102c6611059565b036102dd576102a98160000151826040015161063a565b6002816020015160028111156102f5576102f5611059565b0361030c5761030c8160000151826040015161086b565b5060010161024a565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673838383604051610349939291906110bf565b60405180910390a161035c838383610a2c565b505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146103ee576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610407565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b80516001600160a01b03166104755780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b80516001600160a01b03163014801590610498575080516001600160a01b03163b155b156104c45780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b8060400151516000036104f85780516040516305fb96cb60e41b81526001600160a01b0390911660048201526024016100a0565b50565b7fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc9006105268184610a7f565b610536576105348184610aa6565b505b815160005b8181101561063357600084828151811061055757610557611043565b602090810291909101015190506001600160e01b0319811661058c576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b0316156105db57604051630e6c4db160e41b81526001600160e01b0319821660048201526024016100a0565b6001600160e01b031981166000818152600286016020908152604080832080546001600160a01b0319166001600160a01b038c16908117909155835260038801909152902061062991610abb565b505060010161053b565b5050505050565b7fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc900306001600160a01b0384160361068457604051630e7ce30960e11b815260040160405180910390fd5b61068e8184610a7f565b61069e5761069c8184610aa6565b505b815160005b818110156106335760008482815181106106bf576106bf611043565b602090810291909101015190506001600160e01b031981166106f4576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b031630810361073957604051630e7ce30960e11b815260040160405180910390fd5b6001600160a01b03811661076b5760405163126f174360e11b81526001600160a01b03881660048201526024016100a0565b866001600160a01b0316816001600160a01b0316036107a957604051631403eec360e21b81526001600160e01b0319831660048201526024016100a0565b6001600160e01b031982166000818152600287016020908152604080832080546001600160a01b0319166001600160a01b038d811691909117909155851683526003890190915290206107fb91610ac7565b506001600160a01b0387166000908152600386016020526040902061082a906001600160e01b03198416610abb565b506001600160a01b0381166000908152600386016020526040902061084e90610ad3565b6000036108615761085f8582610add565b505b50506001016106a3565b7fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc900306001600160a01b038416036108b557604051630e7ce30960e11b815260040160405180910390fd5b6108bf8184610a7f565b6108e7576040516344ae58e160e01b81526001600160a01b03841660048201526024016100a0565b60005b82518110156109f157600083828151811061090757610907611043565b602090810291909101015190506001600160e01b0319811661093c576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002840160205260409020546001600160a01b0386811691161461099d5760405162062efb60e51b81526001600160a01b03861660048201526001600160e01b0319821660248201526044016100a0565b6001600160e01b031981166000818152600285016020908152604080832080546001600160a01b03191690556001600160a01b03891683526003870190915290206109e791610ac7565b50506001016108ea565b506001600160a01b03831660009081526003820160205260409020610a1590610ad3565b60000361035c57610a268184610add565b50505050565b6001600160a01b038216610a3f57505050565b816001600160a01b03163b600003610a7557604051633b367e1560e21b81526001600160a01b03831660048201526024016100a0565b610a268282610af2565b6001600160a01b038116600090815260018301602052604081205415155b90505b92915050565b6000610a9d836001600160a01b038416610b68565b6000610a9d8383610b68565b6000610a9d8383610bb7565b6000610aa0825490565b6000610a9d836001600160a01b038416610bb7565b6060600080846001600160a01b031684604051610b0f91906111c2565b600060405180830381855af49150503d8060008114610b4a576040519150601f19603f3d011682016040523d82523d6000602084013e610b4f565b606091505b5091509150610b5f858383610cb1565b95945050505050565b6000818152600183016020526040812054610baf57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610aa0565b506000610aa0565b60008181526001830160205260408120548015610ca0576000610bdb6001836111de565b8554909150600090610bef906001906111de565b9050808214610c54576000866000018281548110610c0f57610c0f611043565b9060005260206000200154905080876000018481548110610c3257610c32611043565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610c6557610c656111f1565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610aa0565b6000915050610aa0565b5092915050565b606082610cc657610cc182610d10565b610d09565b8151158015610cdd57506001600160a01b0384163b155b15610d0657604051639996b31560e01b81526001600160a01b03851660048201526024016100a0565b50805b9392505050565b805115610d205780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715610d7257610d72610d39565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610da157610da1610d39565b604052919050565b600067ffffffffffffffff821115610dc357610dc3610d39565b5060051b60200190565b80356001600160a01b0381168114610de457600080fd5b919050565b600082601f830112610dfa57600080fd5b813567ffffffffffffffff811115610e1457610e14610d39565b610e27601f8201601f1916602001610d78565b818152846020838601011115610e3c57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215610e6e57600080fd5b67ffffffffffffffff8085351115610e8557600080fd5b8435850186601f820112610e9857600080fd5b610eaa610ea58235610da9565b610d78565b81358082526020808301929160051b84010189811115610ec957600080fd5b602084015b81811015610fd1578581351115610ee457600080fd5b803585016060818d03601f19011215610efc57600080fd5b610f04610d4f565b610f1060208301610dcd565b8152604082013560038110610f2457600080fd5b6020820152606082013588811115610f3b57600080fd5b8083019250508c603f830112610f5057600080fd5b6020820135610f61610ea582610da9565b81815260059190911b83016040019060208101908f831115610f8257600080fd5b6040850194505b82851015610fbb5784356001600160e01b0319811614610fa857600080fd5b8435825260209485019490910190610f89565b6040840152505085525060209384019301610ece565b5050809650505050610fe560208601610dcd565b9250604085013581811115610ff957600080fd5b61100587828801610de9565b925050509250925092565b634e487b7160e01b600052601160045260246000fd5b63ffffffff818116838216019080821115610caa57610caa611010565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b60005b8381101561108a578181015183820152602001611072565b50506000910152565b600081518084526110ab81602086016020860161106f565b601f01601f19169290920160200192915050565b60006060808301606084528087518083526080925060808601915060808160051b8701016020808b0160005b8481101561119257898403607f19018652815180516001600160a01b0316855283810151898601906003811061113157634e487b7160e01b600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b8083101561117d5783516001600160e01b0319168252928601926001929092019190860190611153565b509785019795505050908201906001016110eb565b50506001600160a01b038a169088015286810360408801526111b48189611093565b9a9950505050505050505050565b600082516111d481846020870161106f565b9190910192915050565b81810381811115610aa057610aa0611010565b634e487b7160e01b600052603160045260246000fd \ No newline at end of file diff --git a/packages/generated/v3/abis/DiamondCutFacet.json b/packages/generated/v3/abis/DiamondCutFacet.json new file mode 100644 index 000000000..8693c5380 --- /dev/null +++ b/packages/generated/v3/abis/DiamondCutFacet.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__DiamondCut_init","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"diamondCut","inputs":[{"name":"facetCuts","type":"tuple[]","internalType":"struct IDiamond.FacetCut[]","components":[{"name":"facetAddress","type":"address","internalType":"address"},{"name":"action","type":"uint8","internalType":"enum IDiamond.FacetCutAction"},{"name":"functionSelectors","type":"bytes4[]","internalType":"bytes4[]"}]},{"name":"init","type":"address","internalType":"address"},{"name":"initPayload","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"DiamondCut","inputs":[{"name":"facetCuts","type":"tuple[]","indexed":false,"internalType":"struct IDiamond.FacetCut[]","components":[{"name":"facetAddress","type":"address","internalType":"address"},{"name":"action","type":"uint8","internalType":"enum IDiamond.FacetCutAction"},{"name":"functionSelectors","type":"bytes4[]","internalType":"bytes4[]"}]},{"name":"init","type":"address","indexed":false,"internalType":"address"},{"name":"initPayload","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_FunctionAlreadyExists","inputs":[{"name":"selector","type":"bytes4","internalType":"bytes4"}]},{"type":"error","name":"DiamondCut_FunctionDoesNotExist","inputs":[{"name":"facet","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_FunctionFromSameFacetAlreadyExists","inputs":[{"name":"selector","type":"bytes4","internalType":"bytes4"}]},{"type":"error","name":"DiamondCut_ImmutableFacet","inputs":[]},{"type":"error","name":"DiamondCut_InvalidContract","inputs":[{"name":"init","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_InvalidFacet","inputs":[{"name":"facet","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_InvalidFacetCutAction","inputs":[]},{"type":"error","name":"DiamondCut_InvalidFacetCutLength","inputs":[]},{"type":"error","name":"DiamondCut_InvalidFacetRemoval","inputs":[{"name":"facet","type":"address","internalType":"address"},{"name":"selector","type":"bytes4","internalType":"bytes4"}]},{"type":"error","name":"DiamondCut_InvalidFacetSelectors","inputs":[{"name":"facet","type":"address","internalType":"address"}]},{"type":"error","name":"DiamondCut_InvalidSelector","inputs":[]},{"type":"error","name":"FailedInnerCall","inputs":[]},{"type":"error","name":"Initializable_AlreadyInitialized","inputs":[{"name":"version","type":"uint32","internalType":"uint32"}]},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b611207806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80631f931c1c1461003b5780634f4bb5d614610050575b600080fd5b61004e610049366004610e59565b610058565b005b61004e61018f565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031633146100a9576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6100b16101eb565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16806100f45750805463ffffffff808416911610155b1561011d578054604051630a8ef77f60e31b815263ffffffff90911660048201526024016100a0565b805464ffffffffff191663ffffffff831617640100000000178155610143858585610225565b805464ff000000001916815560405163ffffffff831681527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15050505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166101d957604051630ef4733760e31b815260040160405180910390fd5b6101e96307e4c70760e21b610361565b565b60007f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef52000546102209063ffffffff166001611026565b905090565b825160000361024757604051632795bfe160e11b815260040160405180910390fd5b60005b835181101561031557600084828151811061026757610267611043565b6020026020010151905061027a8161043f565b60008160200151600281111561029257610292611059565b036102ae576102a9816000015182604001516104fb565b61030c565b6001816020015160028111156102c6576102c6611059565b036102dd576102a98160000151826040015161063a565b6002816020015160028111156102f5576102f5611059565b0361030c5761030c8160000151826040015161086b565b5060010161024a565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673838383604051610349939291906110bf565b60405180910390a161035c838383610a2c565b505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146103ee576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610407565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b80516001600160a01b03166104755780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b80516001600160a01b03163014801590610498575080516001600160a01b03163b155b156104c45780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b8060400151516000036104f85780516040516305fb96cb60e41b81526001600160a01b0390911660048201526024016100a0565b50565b7fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc9006105268184610a7f565b610536576105348184610aa6565b505b815160005b8181101561063357600084828151811061055757610557611043565b602090810291909101015190506001600160e01b0319811661058c576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b0316156105db57604051630e6c4db160e41b81526001600160e01b0319821660048201526024016100a0565b6001600160e01b031981166000818152600286016020908152604080832080546001600160a01b0319166001600160a01b038c16908117909155835260038801909152902061062991610abb565b505060010161053b565b5050505050565b7fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc900306001600160a01b0384160361068457604051630e7ce30960e11b815260040160405180910390fd5b61068e8184610a7f565b61069e5761069c8184610aa6565b505b815160005b818110156106335760008482815181106106bf576106bf611043565b602090810291909101015190506001600160e01b031981166106f4576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b031630810361073957604051630e7ce30960e11b815260040160405180910390fd5b6001600160a01b03811661076b5760405163126f174360e11b81526001600160a01b03881660048201526024016100a0565b866001600160a01b0316816001600160a01b0316036107a957604051631403eec360e21b81526001600160e01b0319831660048201526024016100a0565b6001600160e01b031982166000818152600287016020908152604080832080546001600160a01b0319166001600160a01b038d811691909117909155851683526003890190915290206107fb91610ac7565b506001600160a01b0387166000908152600386016020526040902061082a906001600160e01b03198416610abb565b506001600160a01b0381166000908152600386016020526040902061084e90610ad3565b6000036108615761085f8582610add565b505b50506001016106a3565b7fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc900306001600160a01b038416036108b557604051630e7ce30960e11b815260040160405180910390fd5b6108bf8184610a7f565b6108e7576040516344ae58e160e01b81526001600160a01b03841660048201526024016100a0565b60005b82518110156109f157600083828151811061090757610907611043565b602090810291909101015190506001600160e01b0319811661093c576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002840160205260409020546001600160a01b0386811691161461099d5760405162062efb60e51b81526001600160a01b03861660048201526001600160e01b0319821660248201526044016100a0565b6001600160e01b031981166000818152600285016020908152604080832080546001600160a01b03191690556001600160a01b03891683526003870190915290206109e791610ac7565b50506001016108ea565b506001600160a01b03831660009081526003820160205260409020610a1590610ad3565b60000361035c57610a268184610add565b50505050565b6001600160a01b038216610a3f57505050565b816001600160a01b03163b600003610a7557604051633b367e1560e21b81526001600160a01b03831660048201526024016100a0565b610a268282610af2565b6001600160a01b038116600090815260018301602052604081205415155b90505b92915050565b6000610a9d836001600160a01b038416610b68565b6000610a9d8383610b68565b6000610a9d8383610bb7565b6000610aa0825490565b6000610a9d836001600160a01b038416610bb7565b6060600080846001600160a01b031684604051610b0f91906111c2565b600060405180830381855af49150503d8060008114610b4a576040519150601f19603f3d011682016040523d82523d6000602084013e610b4f565b606091505b5091509150610b5f858383610cb1565b95945050505050565b6000818152600183016020526040812054610baf57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610aa0565b506000610aa0565b60008181526001830160205260408120548015610ca0576000610bdb6001836111de565b8554909150600090610bef906001906111de565b9050808214610c54576000866000018281548110610c0f57610c0f611043565b9060005260206000200154905080876000018481548110610c3257610c32611043565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610c6557610c656111f1565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610aa0565b6000915050610aa0565b5092915050565b606082610cc657610cc182610d10565b610d09565b8151158015610cdd57506001600160a01b0384163b155b15610d0657604051639996b31560e01b81526001600160a01b03851660048201526024016100a0565b50805b9392505050565b805115610d205780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715610d7257610d72610d39565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610da157610da1610d39565b604052919050565b600067ffffffffffffffff821115610dc357610dc3610d39565b5060051b60200190565b80356001600160a01b0381168114610de457600080fd5b919050565b600082601f830112610dfa57600080fd5b813567ffffffffffffffff811115610e1457610e14610d39565b610e27601f8201601f1916602001610d78565b818152846020838601011115610e3c57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215610e6e57600080fd5b67ffffffffffffffff8085351115610e8557600080fd5b8435850186601f820112610e9857600080fd5b610eaa610ea58235610da9565b610d78565b81358082526020808301929160051b84010189811115610ec957600080fd5b602084015b81811015610fd1578581351115610ee457600080fd5b803585016060818d03601f19011215610efc57600080fd5b610f04610d4f565b610f1060208301610dcd565b8152604082013560038110610f2457600080fd5b6020820152606082013588811115610f3b57600080fd5b8083019250508c603f830112610f5057600080fd5b6020820135610f61610ea582610da9565b81815260059190911b83016040019060208101908f831115610f8257600080fd5b6040850194505b82851015610fbb5784356001600160e01b0319811614610fa857600080fd5b8435825260209485019490910190610f89565b6040840152505085525060209384019301610ece565b5050809650505050610fe560208601610dcd565b9250604085013581811115610ff957600080fd5b61100587828801610de9565b925050509250925092565b634e487b7160e01b600052601160045260246000fd5b63ffffffff818116838216019080821115610caa57610caa611010565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b60005b8381101561108a578181015183820152602001611072565b50506000910152565b600081518084526110ab81602086016020860161106f565b601f01601f19169290920160200192915050565b60006060808301606084528087518083526080925060808601915060808160051b8701016020808b0160005b8481101561119257898403607f19018652815180516001600160a01b0316855283810151898601906003811061113157634e487b7160e01b600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b8083101561117d5783516001600160e01b0319168252928601926001929092019190860190611153565b509785019795505050908201906001016110eb565b50506001600160a01b038a169088015286810360408801526111b48189611093565b9a9950505050505050505050565b600082516111d481846020870161106f565b9190910192915050565b81810381811115610aa057610aa0611010565b634e487b7160e01b600052603160045260246000fd","sourceMap":"413:441:72:-:0;;;;;;;;;;;;-1:-1:-1;385:22:70;:20;:22::i;:::-;413:441:72;;1653:314:84;303:66:85;1779:14:84;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:84;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:84;1898:16;1886:28;;;;;1927:29;;158:42:514;;;1927:29:84;;146:2:514;131:18;1927:29:84;;;;;;;1844:119;1694:273;1653:314::o;14:192:514:-;413:441:72;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100365760003560e01c80631f931c1c1461003b5780634f4bb5d614610050575b600080fd5b61004e610049366004610e59565b610058565b005b61004e61018f565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031633146100a9576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6100b16101eb565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16806100f45750805463ffffffff808416911610155b1561011d578054604051630a8ef77f60e31b815263ffffffff90911660048201526024016100a0565b805464ffffffffff191663ffffffff831617640100000000178155610143858585610225565b805464ff000000001916815560405163ffffffff831681527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15050505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166101d957604051630ef4733760e31b815260040160405180910390fd5b6101e96307e4c70760e21b610361565b565b60007f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef52000546102209063ffffffff166001611026565b905090565b825160000361024757604051632795bfe160e11b815260040160405180910390fd5b60005b835181101561031557600084828151811061026757610267611043565b6020026020010151905061027a8161043f565b60008160200151600281111561029257610292611059565b036102ae576102a9816000015182604001516104fb565b61030c565b6001816020015160028111156102c6576102c6611059565b036102dd576102a98160000151826040015161063a565b6002816020015160028111156102f5576102f5611059565b0361030c5761030c8160000151826040015161086b565b5060010161024a565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673838383604051610349939291906110bf565b60405180910390a161035c838383610a2c565b505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146103ee576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610407565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b80516001600160a01b03166104755780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b80516001600160a01b03163014801590610498575080516001600160a01b03163b155b156104c45780516040516344ae58e160e01b81526001600160a01b0390911660048201526024016100a0565b8060400151516000036104f85780516040516305fb96cb60e41b81526001600160a01b0390911660048201526024016100a0565b50565b7fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc9006105268184610a7f565b610536576105348184610aa6565b505b815160005b8181101561063357600084828151811061055757610557611043565b602090810291909101015190506001600160e01b0319811661058c576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b0316156105db57604051630e6c4db160e41b81526001600160e01b0319821660048201526024016100a0565b6001600160e01b031981166000818152600286016020908152604080832080546001600160a01b0319166001600160a01b038c16908117909155835260038801909152902061062991610abb565b505060010161053b565b5050505050565b7fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc900306001600160a01b0384160361068457604051630e7ce30960e11b815260040160405180910390fd5b61068e8184610a7f565b61069e5761069c8184610aa6565b505b815160005b818110156106335760008482815181106106bf576106bf611043565b602090810291909101015190506001600160e01b031981166106f4576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002850160205260409020546001600160a01b031630810361073957604051630e7ce30960e11b815260040160405180910390fd5b6001600160a01b03811661076b5760405163126f174360e11b81526001600160a01b03881660048201526024016100a0565b866001600160a01b0316816001600160a01b0316036107a957604051631403eec360e21b81526001600160e01b0319831660048201526024016100a0565b6001600160e01b031982166000818152600287016020908152604080832080546001600160a01b0319166001600160a01b038d811691909117909155851683526003890190915290206107fb91610ac7565b506001600160a01b0387166000908152600386016020526040902061082a906001600160e01b03198416610abb565b506001600160a01b0381166000908152600386016020526040902061084e90610ad3565b6000036108615761085f8582610add565b505b50506001016106a3565b7fc6b63261e9313602f31108199c5a3f80ebd1f09ec3eaeb70561a2265ce2fc900306001600160a01b038416036108b557604051630e7ce30960e11b815260040160405180910390fd5b6108bf8184610a7f565b6108e7576040516344ae58e160e01b81526001600160a01b03841660048201526024016100a0565b60005b82518110156109f157600083828151811061090757610907611043565b602090810291909101015190506001600160e01b0319811661093c576040516347518c8160e01b815260040160405180910390fd5b6001600160e01b0319811660009081526002840160205260409020546001600160a01b0386811691161461099d5760405162062efb60e51b81526001600160a01b03861660048201526001600160e01b0319821660248201526044016100a0565b6001600160e01b031981166000818152600285016020908152604080832080546001600160a01b03191690556001600160a01b03891683526003870190915290206109e791610ac7565b50506001016108ea565b506001600160a01b03831660009081526003820160205260409020610a1590610ad3565b60000361035c57610a268184610add565b50505050565b6001600160a01b038216610a3f57505050565b816001600160a01b03163b600003610a7557604051633b367e1560e21b81526001600160a01b03831660048201526024016100a0565b610a268282610af2565b6001600160a01b038116600090815260018301602052604081205415155b90505b92915050565b6000610a9d836001600160a01b038416610b68565b6000610a9d8383610b68565b6000610a9d8383610bb7565b6000610aa0825490565b6000610a9d836001600160a01b038416610bb7565b6060600080846001600160a01b031684604051610b0f91906111c2565b600060405180830381855af49150503d8060008114610b4a576040519150601f19603f3d011682016040523d82523d6000602084013e610b4f565b606091505b5091509150610b5f858383610cb1565b95945050505050565b6000818152600183016020526040812054610baf57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610aa0565b506000610aa0565b60008181526001830160205260408120548015610ca0576000610bdb6001836111de565b8554909150600090610bef906001906111de565b9050808214610c54576000866000018281548110610c0f57610c0f611043565b9060005260206000200154905080876000018481548110610c3257610c32611043565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610c6557610c656111f1565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610aa0565b6000915050610aa0565b5092915050565b606082610cc657610cc182610d10565b610d09565b8151158015610cdd57506001600160a01b0384163b155b15610d0657604051639996b31560e01b81526001600160a01b03851660048201526024016100a0565b50805b9392505050565b805115610d205780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715610d7257610d72610d39565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610da157610da1610d39565b604052919050565b600067ffffffffffffffff821115610dc357610dc3610d39565b5060051b60200190565b80356001600160a01b0381168114610de457600080fd5b919050565b600082601f830112610dfa57600080fd5b813567ffffffffffffffff811115610e1457610e14610d39565b610e27601f8201601f1916602001610d78565b818152846020838601011115610e3c57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215610e6e57600080fd5b67ffffffffffffffff8085351115610e8557600080fd5b8435850186601f820112610e9857600080fd5b610eaa610ea58235610da9565b610d78565b81358082526020808301929160051b84010189811115610ec957600080fd5b602084015b81811015610fd1578581351115610ee457600080fd5b803585016060818d03601f19011215610efc57600080fd5b610f04610d4f565b610f1060208301610dcd565b8152604082013560038110610f2457600080fd5b6020820152606082013588811115610f3b57600080fd5b8083019250508c603f830112610f5057600080fd5b6020820135610f61610ea582610da9565b81815260059190911b83016040019060208101908f831115610f8257600080fd5b6040850194505b82851015610fbb5784356001600160e01b0319811614610fa857600080fd5b8435825260209485019490910190610f89565b6040840152505085525060209384019301610ece565b5050809650505050610fe560208601610dcd565b9250604085013581811115610ff957600080fd5b61100587828801610de9565b925050509250925092565b634e487b7160e01b600052601160045260246000fd5b63ffffffff818116838216019080821115610caa57610caa611010565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b60005b8381101561108a578181015183820152602001611072565b50506000910152565b600081518084526110ab81602086016020860161106f565b601f01601f19169290920160200192915050565b60006060808301606084528087518083526080925060808601915060808160051b8701016020808b0160005b8481101561119257898403607f19018652815180516001600160a01b0316855283810151898601906003811061113157634e487b7160e01b600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b8083101561117d5783516001600160e01b0319168252928601926001929092019190860190611153565b509785019795505050908201906001016110eb565b50506001600160a01b038a169088015286810360408801526111b48189611093565b9a9950505050505050505050565b600082516111d481846020870161106f565b9190910192915050565b81810381811115610aa057610aa0611010565b634e487b7160e01b600052603160045260246000fd","sourceMap":"413:441:72:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;637:215;;;;;;:::i;:::-;;:::i;:::-;;493:110;;;:::i;637:215::-;291:66:98;445:29:96;-1:-1:-1;;;;;445:29:96;286:10;:22;282:79;;325:29;;-1:-1:-1;;;325:29:96;;343:10;325:29;;;4429:51:514;4402:18;;325:29:96;;;;;;;;282:79;784:14:72::1;:12;:14::i;:::-;303:66:85::0;993:14:84;;;;::::1;;;::::0;:38:::1;;-1:-1:-1::0;1011:9:84;;:20:::1;::::0;;::::1;:9:::0;::::1;:20;;993:38;989:109;;;1081:9:::0;;1048:43:::1;::::0;-1:-1:-1;;;1048:43:84;;1081:9:::1;::::0;;::::1;1048:43;::::0;::::1;4635:42:514::0;4608:18;;1048:43:84::1;4491:192:514::0;989:109:84::1;1103:19:::0;;-1:-1:-1;;1128:21:84;1103:19:::1;::::0;::::1;1128:21:::0;;::::1;::::0;;806:41:72::2;818:9:::0;829:4;835:11;806::::2;:41::i;:::-;1162:22:84::0;;-1:-1:-1;;1162:22:84::1;::::0;;1195:20:::1;::::0;4665:10:514;4653:23;;4635:42;;1195:20:84::1;::::0;4623:2:514;4608:18;1195:20:84::1;;;;;;;907:313;366:1:96;637:215:72::0;;;:::o;493:110::-;303:66:85;1263:42:84;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:84;;;;;;;;;;;1258:100;554:44:72::1;-1:-1:-1::0;;;554:13:72::1;:44::i;:::-;493:110::o:0;1535:114:84:-;1582:6;303:66:85;1603:37:84;:41;;:37;;;:41;:::i;:::-;1596:48;;1535:114;:::o;646:888:71:-;780:9;:16;800:1;780:21;776:68;;810:34;;-1:-1:-1;;;810:34:71;;;;;;;;;;;776:68;856:9;851:569;871:9;:16;867:1;:20;851:569;;;902:33;938:9;948:1;938:12;;;;;;;;:::i;:::-;;;;;;;902:48;;959:27;977:8;959:17;:27::i;:::-;1018;999:8;:15;;;:46;;;;;;;;:::i;:::-;;995:419;;1057:60;1067:8;:21;;;1090:8;:26;;;1057:9;:60::i;:::-;995:419;;;1155:31;1136:8;:15;;;:50;;;;;;;;:::i;:::-;;1132:282;;1198:64;1212:8;:21;;;1235:8;:26;;;1198:13;:64::i;1132:282::-;1300:30;1281:8;:15;;;:49;;;;;;;;:::i;:::-;;1277:137;;1342:63;1355:8;:21;;;1378:8;:26;;;1342:12;:63::i;:::-;-1:-1:-1;889:3:71;;851:569;;;;1431:40;1442:9;1453:4;1459:11;1431:40;;;;;;;;:::i;:::-;;;;;;;;1478:51;1500:9;1511:4;1517:11;1478:21;:51::i;:::-;646:888;;;:::o;452:282:87:-;-1:-1:-1;;;;;;1121:62:87;;1096:4;1121:62;;;303:66:89;1121:62:87;;;;;;;;:70;;:62;:70;510:182;;-1:-1:-1;;;;;;556:62:87;;:49;:62;;;303:66:89;556:62:87;;;;;:69;;-1:-1:-1;;556:69:87;621:4;556:69;;;510:182;;;653:32;;-1:-1:-1;;;653:32:87;;;;;;;;;;;510:182;702:27;;-1:-1:-1;;;;;;702:27:87;;;;;;;;452:282;:::o;4746:500:71:-;4832:21;;-1:-1:-1;;;;;4832:35:71;4828:109;;4908:21;;4884:46;;-1:-1:-1;;;4884:46:71;;-1:-1:-1;;;;;4447:32:514;;;4884:46:71;;;4429:51:514;4402:18;;4884:46:71;4283:203:514;4828:109:71;4954:21;;-1:-1:-1;;;;;4954:38:71;4987:4;4954:38;;;;:86;;-1:-1:-1;5002:21:71;;-1:-1:-1;;;;;5002:33:71;;:38;4954:86;4943:172;;;5086:21;;5062:46;;-1:-1:-1;;;5062:46:71;;-1:-1:-1;;;;;4447:32:514;;;5062:46:71;;;4429:51:514;4402:18;;5062:46:71;4283:203:514;4943:172:71;5125:8;:26;;;:33;5162:1;5125:38;5121:121;;5213:21;;5180:55;;-1:-1:-1;;;5180:55:71;;-1:-1:-1;;;;;4447:32:514;;;5180:55:71;;;4429:51:514;4402:18;;5180:55:71;4283:203:514;5121:121:71;4746:500;:::o;1667:761::-;377:66:73;1855:25:71;377:66:73;1874:5:71;1855:18;:25::i;:::-;1850:52;;1882:20;:2;1896:5;1882:13;:20::i;:::-;;1850:52;1933:16;;1909:21;1996:428;2016:13;2012:1;:17;1996:428;;;2041:15;2059:9;2069:1;2059:12;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;;;2084:21:71;;2080:81;;2124:28;;-1:-1:-1;;;2124:28:71;;;;;;;;;;;2080:81;-1:-1:-1;;;;;;2173:28:71;;2213:1;2173:28;;;:18;;;:28;;;;;;-1:-1:-1;;;;;2173:28:71;:42;2169:116;;2234:42;;-1:-1:-1;;;2234:42:71;;-1:-1:-1;;;;;;8052:33:514;;2234:42:71;;;8034:52:514;8007:18;;2234:42:71;7890:202:514;2169:116:71;-1:-1:-1;;;;;;2293:28:71;;;;;;:18;;;:28;;;;;;;;:36;;-1:-1:-1;;;;;;2293:36:71;-1:-1:-1;;;;;2293:36:71;;;;;;;;2337:26;;:19;;;:26;;;;;:40;;:30;:40::i;:::-;-1:-1:-1;;2406:3:71;;1996:428;;;;1737:691;;1667:761;;:::o;3484:1175::-;377:66:73;3656:4:71;-1:-1:-1;;;;;3639:22:71;;;3635:62;;3670:27;;-1:-1:-1;;;3670:27:71;;;;;;;;;;;3635:62;3709:25;:2;3728:5;3709:18;:25::i;:::-;3704:52;;3736:20;:2;3750:5;3736:13;:20::i;:::-;;3704:52;3787:16;;3763:21;3810:845;3830:13;3826:1;:17;3810:845;;;3855:15;3873:9;3883:1;3873:12;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;;;3898:21:71;;3894:81;;3938:28;;-1:-1:-1;;;3938:28:71;;;;;;;;;;;3894:81;-1:-1:-1;;;;;;4002:28:71;;3983:16;4002:28;;;:18;;;:28;;;;;;-1:-1:-1;;;;;4002:28:71;4063:4;4043:25;;4039:65;;4077:27;;-1:-1:-1;;;4077:27:71;;;;;;;;;;;4039:65;-1:-1:-1;;;;;4117:22:71;;4113:92;;4158:38;;-1:-1:-1;;;4158:38:71;;-1:-1:-1;;;;;4447:32:514;;4158:38:71;;;4429:51:514;4402:18;;4158:38:71;4283:203:514;4113:92:71;4229:5;-1:-1:-1;;;;;4217:17:71;:8;-1:-1:-1;;;;;4217:17:71;;4213:104;;4253:55;;-1:-1:-1;;;4253:55:71;;-1:-1:-1;;;;;;8052:33:514;;4253:55:71;;;8034:52:514;8007:18;;4253:55:71;7890:202:514;4213:104:71;-1:-1:-1;;;;;;4366:28:71;;;;;;:18;;;:28;;;;;;;;:36;;-1:-1:-1;;;;;;4366:36:71;-1:-1:-1;;;;;4366:36:71;;;;;;;;;;4411:29;;;;:19;;;:29;;;;;:46;;:36;:46::i;:::-;-1:-1:-1;;;;;;4466:26:71;;;;;;:19;;;:26;;;;;:40;;-1:-1:-1;;;;;;4466:40:71;;:30;:40::i;:::-;-1:-1:-1;;;;;;4519:29:71;;;;;;:19;;;:29;;;;;:38;;:36;:38::i;:::-;4561:1;4519:43;4515:94;;4574:26;:2;4591:8;4574:16;:26::i;:::-;;4515:94;-1:-1:-1;;4637:3:71;;3810:845;;2565:786;377:66:73;2736:4:71;-1:-1:-1;;;;;2719:22:71;;;2715:62;;2750:27;;-1:-1:-1;;;2750:27:71;;;;;;;;;;;2715:62;2789:25;:2;2808:5;2789:18;:25::i;:::-;2784:69;;2823:30;;-1:-1:-1;;;2823:30:71;;-1:-1:-1;;;;;4447:32:514;;2823:30:71;;;4429:51:514;4402:18;;2823:30:71;4283:203:514;2784:69:71;2865:9;2860:397;2880:9;:16;2876:1;:20;2860:397;;;2911:15;2929:9;2939:1;2929:12;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;;;2954:21:71;;2950:81;;2994:28;;-1:-1:-1;;;2994:28:71;;;;;;;;;;;2950:81;-1:-1:-1;;;;;;3043:28:71;;;;;;:18;;;:28;;;;;;-1:-1:-1;;;;;3043:37:71;;;:28;;:37;3039:116;;3099:47;;-1:-1:-1;;;3099:47:71;;-1:-1:-1;;;;;8287:32:514;;3099:47:71;;;8269:51:514;-1:-1:-1;;;;;;8356:33:514;;8336:18;;;8329:61;8242:18;;3099:47:71;8097:299:514;3039:116:71;-1:-1:-1;;;;;;3170:28:71;;;;;;:18;;;:28;;;;;;;;3163:35;;-1:-1:-1;;;;;;3163:35:71;;;-1:-1:-1;;;;;3207:26:71;;;;:19;;;:26;;;;;:43;;:33;:43::i;:::-;-1:-1:-1;;2898:3:71;;2860:397;;;-1:-1:-1;;;;;;3267:26:71;;;;;;:19;;;:26;;;;;:35;;:33;:35::i;:::-;3306:1;3267:40;3263:84;;3317:23;:2;3334:5;3317:16;:23::i;:::-;;2638:713;2565:786;;:::o;5372:306::-;-1:-1:-1;;;;;5506:18:71;;5502:31;;5372:306;;;:::o;5502:31::-;5543:4;-1:-1:-1;;;;;5543:16:71;;5563:1;5543:21;5539:81;;5581:32;;-1:-1:-1;;;5581:32:71;;-1:-1:-1;;;;;4447:32:514;;5581::71;;;4429:51:514;4402:18;;5581:32:71;4283:203:514;5539:81:71;5626:47;5655:4;5661:11;5626:28;:47::i;8871:165:447:-;-1:-1:-1;;;;;9004:23:447;;8951:4;4360:21;;;:14;;;:21;;;;;;:26;;8974:55;8967:62;;8871:165;;;;;:::o;8316:150::-;8386:4;8409:50;8414:3;-1:-1:-1;;;;;8434:23:447;;8409:4;:50::i;5930:123::-;6000:4;6023:23;6028:3;6040:5;6023:4;:23::i;6221:129::-;6294:4;6317:26;6325:3;6337:5;6317:7;:26::i;6650:115::-;6713:7;6739:19;6747:3;4556:18;;4474:107;8634:156;8707:4;8730:53;8738:3;-1:-1:-1;;;;;8758:23:447;;8730:7;:53::i;4106:253:428:-;4189:12;4214;4228:23;4255:6;-1:-1:-1;;;;;4255:19:428;4275:4;4255:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4213:67;;;;4297:55;4324:6;4332:7;4341:10;4297:26;:55::i;:::-;4290:62;4106:253;-1:-1:-1;;;;;4106:253:428:o;2241:406:447:-;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:447;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:447;2618:12;;2815:1368;2881:4;3010:21;;;:14;;;:21;;;;;;3046:13;;3042:1135;;3413:18;3434:12;3445:1;3434:8;:12;:::i;:::-;3480:18;;3413:33;;-1:-1:-1;3460:17:447;;3480:22;;3501:1;;3480:22;:::i;:::-;3460:42;;3535:9;3521:10;:23;3517:378;;3564:17;3584:3;:11;;3596:9;3584:22;;;;;;;;:::i;:::-;;;;;;;;;3564:42;;3731:9;3705:3;:11;;3717:10;3705:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;3844:25;;;:14;;;:25;;;;;:36;;;3517:378;3973:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4076:3;:14;;:21;4091:5;4076:21;;;;;;;;;;;4069:28;;;4119:4;4112:11;;;;;;;3042:1135;4161:5;4154:12;;;;;3042:1135;2887:1296;2815:1368;;;;:::o;4625:582:428:-;4769:12;4798:7;4793:408;;4821:19;4829:10;4821:7;:19::i;:::-;4793:408;;;5045:17;;:22;:49;;;;-1:-1:-1;;;;;;5071:18:428;;;:23;5045:49;5041:119;;;5121:24;;-1:-1:-1;;;5121:24:428;;-1:-1:-1;;;;;4447:32:514;;5121:24:428;;;4429:51:514;4402:18;;5121:24:428;4283:203:514;5041:119:428;-1:-1:-1;5180:10:428;4793:408;4625:582;;;;;:::o;5743:516::-;5874:17;;:21;5870:383;;6102:10;6096:17;6158:15;6145:10;6141:2;6137:19;6130:44;5870:383;6225:17;;-1:-1:-1;;;6225:17:428;;;;;;;;;;;14:127:514;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:251;218:2;212:9;260:2;248:15;;293:18;278:34;;314:22;;;275:62;272:88;;;340:18;;:::i;:::-;376:2;369:22;146:251;:::o;402:275::-;473:2;467:9;538:2;519:13;;-1:-1:-1;;515:27:514;503:40;;573:18;558:34;;594:22;;;555:62;552:88;;;620:18;;:::i;:::-;656:2;649:22;402:275;;-1:-1:-1;402:275:514:o;682:191::-;750:4;783:18;775:6;772:30;769:56;;;805:18;;:::i;:::-;-1:-1:-1;850:1:514;846:14;862:4;842:25;;682:191::o;878:173::-;946:20;;-1:-1:-1;;;;;995:31:514;;985:42;;975:70;;1041:1;1038;1031:12;975:70;878:173;;;:::o;1056:530::-;1098:5;1151:3;1144:4;1136:6;1132:17;1128:27;1118:55;;1169:1;1166;1159:12;1118:55;1205:6;1192:20;1231:18;1227:2;1224:26;1221:52;;;1253:18;;:::i;:::-;1297:55;1340:2;1321:13;;-1:-1:-1;;1317:27:514;1346:4;1313:38;1297:55;:::i;:::-;1377:2;1368:7;1361:19;1423:3;1416:4;1411:2;1403:6;1399:15;1395:26;1392:35;1389:55;;;1440:1;1437;1430:12;1389:55;1505:2;1498:4;1490:6;1486:17;1479:4;1470:7;1466:18;1453:55;1553:1;1528:16;;;1546:4;1524:27;1517:38;;;;1532:7;1056:530;-1:-1:-1;;;1056:530:514:o;1591:2578::-;1729:6;1737;1745;1798:2;1786:9;1777:7;1773:23;1769:32;1766:52;;;1814:1;1811;1804:12;1766:52;1837:18;1895:2;1883:9;1870:23;1867:31;1864:51;;;1911:1;1908;1901:12;1864:51;1962:9;1949:23;1938:9;1934:39;2011:7;2004:4;2000:2;1996:13;1992:27;1982:55;;2033:1;2030;2023:12;1982:55;2057:82;2073:65;2134:2;2121:16;2073:65;:::i;:::-;2057:82;:::i;:::-;2185:16;;2173:29;;;2227:4;2218:14;;;;2161:3;2271:1;2267:24;2259:33;;2255:44;2311:19;;;2308:39;;;2343:1;2340;2333:12;2308:39;2375:4;2371:2;2367:13;2389:1519;2405:6;2400:3;2397:15;2389:1519;;;2486:2;2480:3;2467:17;2464:25;2461:45;;;2502:1;2499;2492:12;2461:45;2537:17;;2529:26;;2607:2;2579:16;;;-1:-1:-1;;2575:30:514;2571:39;2568:59;;;2623:1;2620;2613:12;2568:59;2653:22;;:::i;:::-;2702:33;2729:4;2725:2;2721:13;2702:33;:::i;:::-;2695:5;2688:48;2785:2;2781;2777:11;2764:25;2824:1;2815:7;2812:14;2802:42;;2840:1;2837;2830:12;2802:42;2875:4;2864:16;;2857:33;2938:2;2930:11;;2917:25;2958:14;;;2955:34;;;2985:1;2982;2975:12;2955:34;3020:6;3016:2;3012:15;3002:25;;;3067:7;3062:2;3058;3054:11;3050:25;3040:53;;3089:1;3086;3079:12;3040:53;3137:4;3133:2;3129:13;3116:27;3169:68;3185:51;3233:2;3185:51;:::i;3169:68::-;3281:17;;;3381:1;3377:10;;;;3369:19;;3390:2;3365:28;;3331:4;3320:16;;;3409:21;;;3406:41;;;3443:1;3440;3433:12;3406:41;3481:2;3477;3473:11;3460:24;;3497:294;3515:8;3508:5;3505:19;3497:294;;;3623:19;;-1:-1:-1;;;;;;3619:46:514;;3595:71;3585:99;;3680:1;3677;3670:12;3585:99;3715:19;;3701:34;;3772:4;3536:16;;;;3761;;;;3497:294;;;3822:2;3811:14;;3804:29;-1:-1:-1;;3846:18:514;;-1:-1:-1;3893:4:514;3884:14;;;;2422;2389:1519;;;2393:3;;3927:5;3917:15;;;;;3951:40;3985:4;3974:9;3970:20;3951:40;:::i;:::-;3941:50;;4044:2;4033:9;4029:18;4016:32;4073:2;4063:8;4060:16;4057:36;;;4089:1;4086;4079:12;4057:36;4112:51;4155:7;4144:8;4133:9;4129:24;4112:51;:::i;:::-;4102:61;;;;1591:2578;;;;;:::o;4688:127::-;4749:10;4744:3;4740:20;4737:1;4730:31;4780:4;4777:1;4770:15;4804:4;4801:1;4794:15;4820:172;4887:10;4917;;;4929;;;4913:27;;4952:11;;;4949:37;;;4966:18;;:::i;4997:127::-;5058:10;5053:3;5049:20;5046:1;5039:31;5089:4;5086:1;5079:15;5113:4;5110:1;5103:15;5129:127;5190:10;5185:3;5181:20;5178:1;5171:31;5221:4;5218:1;5211:15;5245:4;5242:1;5235:15;5261:250;5346:1;5356:113;5370:6;5367:1;5364:13;5356:113;;;5446:11;;;5440:18;5427:11;;;5420:39;5392:2;5385:10;5356:113;;;-1:-1:-1;;5503:1:514;5485:16;;5478:27;5261:250::o;5516:270::-;5557:3;5595:5;5589:12;5622:6;5617:3;5610:19;5638:76;5707:6;5700:4;5695:3;5691:14;5684:4;5677:5;5673:16;5638:76;:::i;:::-;5768:2;5747:15;-1:-1:-1;;5743:29:514;5734:39;;;;5775:4;5730:50;;5516:270;-1:-1:-1;;5516:270:514:o;5791:2094::-;6061:4;6090:2;6130;6119:9;6115:18;6160:2;6149:9;6142:21;6183:6;6218;6212:13;6249:6;6241;6234:22;6275:3;6265:13;;6309:3;6298:9;6294:19;6287:26;;6372:3;6362:6;6359:1;6355:14;6344:9;6340:30;6336:40;6395:4;6434:2;6426:6;6422:15;6455:1;6465:1249;6479:6;6476:1;6473:13;6465:1249;;;6544:22;;;-1:-1:-1;;6540:37:514;6528:50;;6601:13;;6688:9;;-1:-1:-1;;;;;6684:35:514;6669:51;;6759:11;;;6753:18;6641:15;;;;6811:1;6794:19;;6784:170;;6864:10;6859:3;6855:20;6852:1;6845:31;6903:4;6900:1;6893:15;6935:4;6932:1;6925:15;6784:170;6974:15;;;6967:37;7027:4;7072:11;;;7066:18;7104:15;;;7097:27;;;7185:21;;7219:24;;;;7309:23;;;;-1:-1:-1;;7265:15:514;;;;7370:236;7386:8;7381:3;7378:17;7370:236;;;7467:15;;-1:-1:-1;;;;;;7463:42:514;7449:57;;7575:17;;;;7414:1;7405:11;;;;;7532:14;;;;7370:236;;;-1:-1:-1;7692:12:514;;;;7629:5;-1:-1:-1;;;7657:15:514;;;;6501:1;6494:9;6465:1249;;;-1:-1:-1;;;;;;;4240:31:514;;7750:18;;;4228:44;7807:22;;;7800:4;7785:20;;7778:52;7847:32;7811:6;7864;7847:32;:::i;:::-;7839:40;5791:2094;-1:-1:-1;;;;;;;;;;5791:2094:514:o;8401:287::-;8530:3;8568:6;8562:13;8584:66;8643:6;8638:3;8631:4;8623:6;8619:17;8584:66;:::i;:::-;8666:16;;;;;8401:287;-1:-1:-1;;8401:287:514:o;8693:128::-;8760:9;;;8781:11;;;8778:37;;;8795:18;;:::i;8826:127::-;8887:10;8882:3;8878:20;8875:1;8868:31;8918:4;8915:1;8908:15;8942:4;8939:1;8932:15","linkReferences":{}},"methodIdentifiers":{"__DiamondCut_init()":"4f4bb5d6","diamondCut((address,uint8,bytes4[])[],address,bytes)":"1f931c1c"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"DiamondCut_FunctionAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"DiamondCut_FunctionDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"DiamondCut_FunctionFromSameFacetAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DiamondCut_ImmutableFacet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"init\",\"type\":\"address\"}],\"name\":\"DiamondCut_InvalidContract\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"DiamondCut_InvalidFacet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DiamondCut_InvalidFacetCutAction\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DiamondCut_InvalidFacetCutLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"DiamondCut_InvalidFacetRemoval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"DiamondCut_InvalidFacetSelectors\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DiamondCut_InvalidSelector\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initializable_AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facetAddress\",\"type\":\"address\"},{\"internalType\":\"enum IDiamond.FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"functionSelectors\",\"type\":\"bytes4[]\"}],\"indexed\":false,\"internalType\":\"struct IDiamond.FacetCut[]\",\"name\":\"facetCuts\",\"type\":\"tuple[]\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"init\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"initPayload\",\"type\":\"bytes\"}],\"name\":\"DiamondCut\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__DiamondCut_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facetAddress\",\"type\":\"address\"},{\"internalType\":\"enum IDiamond.FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"functionSelectors\",\"type\":\"bytes4[]\"}],\"internalType\":\"struct IDiamond.FacetCut[]\",\"name\":\"facetCuts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"init\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initPayload\",\"type\":\"bytes\"}],\"name\":\"diamondCut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"FailedInnerCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}]},\"events\":{\"DiamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"params\":{\"facetCuts\":\"Facet addresses and function selectors.\",\"init\":\"Address of contract or facet to execute initPayload.\",\"initPayload\":\"A function call, including function selector and arguments.\"}},\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"}},\"kind\":\"dev\",\"methods\":{\"diamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"params\":{\"facetCuts\":\"Facet addresses and function selectors.\",\"init\":\"Address of contract or facet to execute initPayload.\",\"initPayload\":\"A function call, including function selector and arguments. Executed with delegatecall on init address.\"}}},\"version\":1},\"userdoc\":{\"events\":{\"DiamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"notice\":\"Event emitted when facets are added/removed/replaced\"},\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{\"diamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"notice\":\"Add/replace/remove any number of functions and optionally execute a function with delegatecall\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/diamond/facets/cut/DiamondCutFacet.sol\":\"DiamondCutFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/IDiamond.sol\":{\"keccak256\":\"0xd4907618ad3b9847c656008815820f23a89a587e408712b450cff075625e1553\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://652645a543f65b0415327a8a88398fc7835b1d6ee01df8c898f9e43867d02714\",\"dweb:/ipfs/QmPXt4Kks2o5CJKbT8U1mCryQJP6EMzzP5kdcqUFvXX7y5\"]},\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/cut/DiamondCutBase.sol\":{\"keccak256\":\"0x45ed391ae6aa52996ce3fc3095b0d420457fa5f58a2c5a2f9939e2b55dc8e7a6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f6a5e87525d3c98c10ceb838124d48fdf7e687ffddbdb1647b93dc5882d91339\",\"dweb:/ipfs/Qmf137S5255pVWXpfFnrU3fdE3G6Di2VuJQueBn8SC8cpd\"]},\"contracts/src/diamond/facets/cut/DiamondCutFacet.sol\":{\"keccak256\":\"0xfa7c216c41e95f675c5763e97622c61349a94510d45d9c08c24282d85f24a2c5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dbc5de1ab9212db8c38baf5560453bb9edcda5054335c2d29f5a7d8d7a1ca6de\",\"dweb:/ipfs/QmW6juTkWA8J2CsiLWSehNYPs3j32NDNi7sKcmA1fobbX7\"]},\"contracts/src/diamond/facets/cut/DiamondCutStorage.sol\":{\"keccak256\":\"0xf47d0ca88515dc8714c89931c5a91c402bac3fad08388d780a0873e962386071\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://04d4023a5be5140892c547bb5df4eb5906120d1eca3bf29fc562da991639c894\",\"dweb:/ipfs/QmVf28LUpAVeCz5Aiewbjt7ZzM6bixZn166aS1PVJGzSSX\"]},\"contracts/src/diamond/facets/cut/IDiamondCut.sol\":{\"keccak256\":\"0xa5985f00fabb7f6e5925542c9d0c955d4e7ec4f9ffe59d0fa81d75bed7ecdd55\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2ebbb450aac3c12f690d7457d04d6fc53736b36cc60dcd757e11840335103688\",\"dweb:/ipfs/QmbcjTgejYrj3m2Lj9hHpCe2wt63fmLhhN6aY8XFoScitw\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/OwnableBase.sol\":{\"keccak256\":\"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4\",\"dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa\"]},\"contracts/src/diamond/facets/ownable/OwnableStorage.sol\":{\"keccak256\":\"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105\",\"dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"type":"error","name":"DiamondCut_FunctionAlreadyExists"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"type":"error","name":"DiamondCut_FunctionDoesNotExist"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"type":"error","name":"DiamondCut_FunctionFromSameFacetAlreadyExists"},{"inputs":[],"type":"error","name":"DiamondCut_ImmutableFacet"},{"inputs":[{"internalType":"address","name":"init","type":"address"}],"type":"error","name":"DiamondCut_InvalidContract"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"type":"error","name":"DiamondCut_InvalidFacet"},{"inputs":[],"type":"error","name":"DiamondCut_InvalidFacetCutAction"},{"inputs":[],"type":"error","name":"DiamondCut_InvalidFacetCutLength"},{"inputs":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"type":"error","name":"DiamondCut_InvalidFacetRemoval"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"type":"error","name":"DiamondCut_InvalidFacetSelectors"},{"inputs":[],"type":"error","name":"DiamondCut_InvalidSelector"},{"inputs":[],"type":"error","name":"FailedInnerCall"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32"}],"type":"error","name":"Initializable_AlreadyInitialized"},{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[{"internalType":"struct IDiamond.FacetCut[]","name":"facetCuts","type":"tuple[]","components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamond.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"indexed":false},{"internalType":"address","name":"init","type":"address","indexed":false},{"internalType":"bytes","name":"initPayload","type":"bytes","indexed":false}],"type":"event","name":"DiamondCut","anonymous":false},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"__DiamondCut_init"},{"inputs":[{"internalType":"struct IDiamond.FacetCut[]","name":"facetCuts","type":"tuple[]","components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamond.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}]},{"internalType":"address","name":"init","type":"address"},{"internalType":"bytes","name":"initPayload","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"diamondCut"}],"devdoc":{"kind":"dev","methods":{"diamondCut((address,uint8,bytes4[])[],address,bytes)":{"params":{"facetCuts":"Facet addresses and function selectors.","init":"Address of contract or facet to execute initPayload.","initPayload":"A function call, including function selector and arguments. Executed with delegatecall on init address."}}},"version":1},"userdoc":{"kind":"user","methods":{"diamondCut((address,uint8,bytes4[])[],address,bytes)":{"notice":"Add/replace/remove any number of functions and optionally execute a function with delegatecall"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/diamond/facets/cut/DiamondCutFacet.sol":"DiamondCutFacet"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/IDiamond.sol":{"keccak256":"0xd4907618ad3b9847c656008815820f23a89a587e408712b450cff075625e1553","urls":["bzz-raw://652645a543f65b0415327a8a88398fc7835b1d6ee01df8c898f9e43867d02714","dweb:/ipfs/QmPXt4Kks2o5CJKbT8U1mCryQJP6EMzzP5kdcqUFvXX7y5"],"license":"Apache-2.0"},"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/cut/DiamondCutBase.sol":{"keccak256":"0x45ed391ae6aa52996ce3fc3095b0d420457fa5f58a2c5a2f9939e2b55dc8e7a6","urls":["bzz-raw://f6a5e87525d3c98c10ceb838124d48fdf7e687ffddbdb1647b93dc5882d91339","dweb:/ipfs/Qmf137S5255pVWXpfFnrU3fdE3G6Di2VuJQueBn8SC8cpd"],"license":"Apache-2.0"},"contracts/src/diamond/facets/cut/DiamondCutFacet.sol":{"keccak256":"0xfa7c216c41e95f675c5763e97622c61349a94510d45d9c08c24282d85f24a2c5","urls":["bzz-raw://dbc5de1ab9212db8c38baf5560453bb9edcda5054335c2d29f5a7d8d7a1ca6de","dweb:/ipfs/QmW6juTkWA8J2CsiLWSehNYPs3j32NDNi7sKcmA1fobbX7"],"license":"Apache-2.0"},"contracts/src/diamond/facets/cut/DiamondCutStorage.sol":{"keccak256":"0xf47d0ca88515dc8714c89931c5a91c402bac3fad08388d780a0873e962386071","urls":["bzz-raw://04d4023a5be5140892c547bb5df4eb5906120d1eca3bf29fc562da991639c894","dweb:/ipfs/QmVf28LUpAVeCz5Aiewbjt7ZzM6bixZn166aS1PVJGzSSX"],"license":"Apache-2.0"},"contracts/src/diamond/facets/cut/IDiamondCut.sol":{"keccak256":"0xa5985f00fabb7f6e5925542c9d0c955d4e7ec4f9ffe59d0fa81d75bed7ecdd55","urls":["bzz-raw://2ebbb450aac3c12f690d7457d04d6fc53736b36cc60dcd757e11840335103688","dweb:/ipfs/QmbcjTgejYrj3m2Lj9hHpCe2wt63fmLhhN6aY8XFoScitw"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableBase.sol":{"keccak256":"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762","urls":["bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4","dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableStorage.sol":{"keccak256":"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64","urls":["bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105","dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":72} \ No newline at end of file diff --git a/packages/generated/v3/abis/DiamondCutFacet.metadata.json b/packages/generated/v3/abis/DiamondCutFacet.metadata.json new file mode 100644 index 000000000..aa25c5e05 --- /dev/null +++ b/packages/generated/v3/abis/DiamondCutFacet.metadata.json @@ -0,0 +1,506 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "type": "error", + "name": "AddressEmptyCode" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "type": "error", + "name": "DiamondCut_FunctionAlreadyExists" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "facet", + "type": "address" + } + ], + "type": "error", + "name": "DiamondCut_FunctionDoesNotExist" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "type": "error", + "name": "DiamondCut_FunctionFromSameFacetAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "DiamondCut_ImmutableFacet" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "init", + "type": "address" + } + ], + "type": "error", + "name": "DiamondCut_InvalidContract" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "facet", + "type": "address" + } + ], + "type": "error", + "name": "DiamondCut_InvalidFacet" + }, + { + "inputs": [], + "type": "error", + "name": "DiamondCut_InvalidFacetCutAction" + }, + { + "inputs": [], + "type": "error", + "name": "DiamondCut_InvalidFacetCutLength" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "facet", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "type": "error", + "name": "DiamondCut_InvalidFacetRemoval" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "facet", + "type": "address" + } + ], + "type": "error", + "name": "DiamondCut_InvalidFacetSelectors" + }, + { + "inputs": [], + "type": "error", + "name": "DiamondCut_InvalidSelector" + }, + { + "inputs": [], + "type": "error", + "name": "FailedInnerCall" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32" + } + ], + "type": "error", + "name": "Initializable_AlreadyInitialized" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [ + { + "internalType": "struct IDiamond.FacetCut[]", + "name": "facetCuts", + "type": "tuple[]", + "components": [ + { + "internalType": "address", + "name": "facetAddress", + "type": "address" + }, + { + "internalType": "enum IDiamond.FacetCutAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "bytes4[]", + "name": "functionSelectors", + "type": "bytes4[]" + } + ], + "indexed": false + }, + { + "internalType": "address", + "name": "init", + "type": "address", + "indexed": false + }, + { + "internalType": "bytes", + "name": "initPayload", + "type": "bytes", + "indexed": false + } + ], + "type": "event", + "name": "DiamondCut", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "__DiamondCut_init" + }, + { + "inputs": [ + { + "internalType": "struct IDiamond.FacetCut[]", + "name": "facetCuts", + "type": "tuple[]", + "components": [ + { + "internalType": "address", + "name": "facetAddress", + "type": "address" + }, + { + "internalType": "enum IDiamond.FacetCutAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "bytes4[]", + "name": "functionSelectors", + "type": "bytes4[]" + } + ] + }, + { + "internalType": "address", + "name": "init", + "type": "address" + }, + { + "internalType": "bytes", + "name": "initPayload", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "diamondCut" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "diamondCut((address,uint8,bytes4[])[],address,bytes)": { + "params": { + "facetCuts": "Facet addresses and function selectors.", + "init": "Address of contract or facet to execute initPayload.", + "initPayload": "A function call, including function selector and arguments. Executed with delegatecall on init address." + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "diamondCut((address,uint8,bytes4[])[],address,bytes)": { + "notice": "Add/replace/remove any number of functions and optionally execute a function with delegatecall" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/diamond/facets/cut/DiamondCutFacet.sol": "DiamondCutFacet" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/IDiamond.sol": { + "keccak256": "0xd4907618ad3b9847c656008815820f23a89a587e408712b450cff075625e1553", + "urls": [ + "bzz-raw://652645a543f65b0415327a8a88398fc7835b1d6ee01df8c898f9e43867d02714", + "dweb:/ipfs/QmPXt4Kks2o5CJKbT8U1mCryQJP6EMzzP5kdcqUFvXX7y5" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/cut/DiamondCutBase.sol": { + "keccak256": "0x45ed391ae6aa52996ce3fc3095b0d420457fa5f58a2c5a2f9939e2b55dc8e7a6", + "urls": [ + "bzz-raw://f6a5e87525d3c98c10ceb838124d48fdf7e687ffddbdb1647b93dc5882d91339", + "dweb:/ipfs/Qmf137S5255pVWXpfFnrU3fdE3G6Di2VuJQueBn8SC8cpd" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/cut/DiamondCutFacet.sol": { + "keccak256": "0xfa7c216c41e95f675c5763e97622c61349a94510d45d9c08c24282d85f24a2c5", + "urls": [ + "bzz-raw://dbc5de1ab9212db8c38baf5560453bb9edcda5054335c2d29f5a7d8d7a1ca6de", + "dweb:/ipfs/QmW6juTkWA8J2CsiLWSehNYPs3j32NDNi7sKcmA1fobbX7" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/cut/DiamondCutStorage.sol": { + "keccak256": "0xf47d0ca88515dc8714c89931c5a91c402bac3fad08388d780a0873e962386071", + "urls": [ + "bzz-raw://04d4023a5be5140892c547bb5df4eb5906120d1eca3bf29fc562da991639c894", + "dweb:/ipfs/QmVf28LUpAVeCz5Aiewbjt7ZzM6bixZn166aS1PVJGzSSX" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/cut/IDiamondCut.sol": { + "keccak256": "0xa5985f00fabb7f6e5925542c9d0c955d4e7ec4f9ffe59d0fa81d75bed7ecdd55", + "urls": [ + "bzz-raw://2ebbb450aac3c12f690d7457d04d6fc53736b36cc60dcd757e11840335103688", + "dweb:/ipfs/QmbcjTgejYrj3m2Lj9hHpCe2wt63fmLhhN6aY8XFoScitw" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableBase.sol": { + "keccak256": "0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762", + "urls": [ + "bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4", + "dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableStorage.sol": { + "keccak256": "0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64", + "urls": [ + "bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105", + "dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/EntitlementsManager.abi.json b/packages/generated/v3/abis/EntitlementsManager.abi.json new file mode 100644 index 000000000..d19fb3ed9 --- /dev/null +++ b/packages/generated/v3/abis/EntitlementsManager.abi.json @@ -0,0 +1,745 @@ +[ + { + "type": "function", + "name": "addEntitlementModule", + "inputs": [ + { + "name": "entitlement", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "addImmutableEntitlements", + "inputs": [ + { + "name": "entitlements", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getEntitlement", + "inputs": [ + { + "name": "entitlement", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IEntitlementsManagerBase.Entitlement", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "moduleAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "moduleType", + "type": "string", + "internalType": "string" + }, + { + "name": "isImmutable", + "type": "bool", + "internalType": "bool" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEntitlementDataByPermission", + "inputs": [ + { + "name": "permission", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IEntitlementsManager.EntitlementData[]", + "components": [ + { + "name": "entitlementType", + "type": "string", + "internalType": "string" + }, + { + "name": "entitlementData", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEntitlements", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IEntitlementsManagerBase.Entitlement[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "moduleAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "moduleType", + "type": "string", + "internalType": "string" + }, + { + "name": "isImmutable", + "type": "bool", + "internalType": "bool" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isEntitledToChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "user", + "type": "address", + "internalType": "address" + }, + { + "name": "permission", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isEntitledToSpace", + "inputs": [ + { + "name": "user", + "type": "address", + "internalType": "address" + }, + { + "name": "permission", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeEntitlementModule", + "inputs": [ + { + "name": "entitlement", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EntitlementModuleAdded", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "entitlement", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EntitlementModuleRemoved", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "entitlement", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleCreated", + "inputs": [ + { + "name": "creator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRemoved", + "inputs": [ + { + "name": "remover", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleUpdated", + "inputs": [ + { + "name": "updater", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SubscriptionUpdate", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "expiration", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__DurationZero", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__NotApprovedOrOwner", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__EntitlementAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__ImmutableEntitlement", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__InvalidEntitlementInterface", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidPermission", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/EntitlementsManager.abi.ts b/packages/generated/v3/abis/EntitlementsManager.abi.ts new file mode 100644 index 000000000..25150c28e --- /dev/null +++ b/packages/generated/v3/abis/EntitlementsManager.abi.ts @@ -0,0 +1,745 @@ +export default [ + { + "type": "function", + "name": "addEntitlementModule", + "inputs": [ + { + "name": "entitlement", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "addImmutableEntitlements", + "inputs": [ + { + "name": "entitlements", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getEntitlement", + "inputs": [ + { + "name": "entitlement", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IEntitlementsManagerBase.Entitlement", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "moduleAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "moduleType", + "type": "string", + "internalType": "string" + }, + { + "name": "isImmutable", + "type": "bool", + "internalType": "bool" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEntitlementDataByPermission", + "inputs": [ + { + "name": "permission", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IEntitlementsManager.EntitlementData[]", + "components": [ + { + "name": "entitlementType", + "type": "string", + "internalType": "string" + }, + { + "name": "entitlementData", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEntitlements", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IEntitlementsManagerBase.Entitlement[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "moduleAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "moduleType", + "type": "string", + "internalType": "string" + }, + { + "name": "isImmutable", + "type": "bool", + "internalType": "bool" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isEntitledToChannel", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "user", + "type": "address", + "internalType": "address" + }, + { + "name": "permission", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isEntitledToSpace", + "inputs": [ + { + "name": "user", + "type": "address", + "internalType": "address" + }, + { + "name": "permission", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeEntitlementModule", + "inputs": [ + { + "name": "entitlement", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EntitlementModuleAdded", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "entitlement", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EntitlementModuleRemoved", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "entitlement", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleCreated", + "inputs": [ + { + "name": "creator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRemoved", + "inputs": [ + { + "name": "remover", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleUpdated", + "inputs": [ + { + "name": "updater", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SubscriptionUpdate", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "expiration", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__DurationZero", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__NotApprovedOrOwner", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__EntitlementAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__ImmutableEntitlement", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__InvalidEntitlementInterface", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidPermission", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/EntitlementsManager.bin b/packages/generated/v3/abis/EntitlementsManager.bin new file mode 100644 index 000000000..20331ecc3 --- /dev/null +++ b/packages/generated/v3/abis/EntitlementsManager.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b50612284806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80638bfc820f1161005b5780638bfc820f146100f2578063be24138d14610105578063db0a69a814610118578063fba4ff9d1461013857600080fd5b8063070b9c3f1461008d57806320759f9e146100a2578063367287e3146100ca578063487dc38c146100dd575b600080fd5b6100a061009b366004611b6a565b610158565b005b6100b56100b0366004611bcf565b6101a4565b60405190151581526020015b60405180910390f35b6100b56100d8366004611c23565b6101bb565b6100e56101d2565b6040516100c19190611d27565b6100a0610100366004611df4565b6101e1565b6100a0610113366004611b6a565b610225565b61012b610126366004611e92565b610269565b6040516100c19190611ed3565b61014b610146366004611b6a565b610681565b6040516100c19190611f5a565b610160610692565b6001600160a01b0316336001600160a01b031614610198576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6101a18161075c565b50565b60006101b18484846107b2565b90505b9392505050565b60006101c9858585856107ec565b95945050505050565b60606101dc610806565b905090565b6101e9610692565b6001600160a01b0316336001600160a01b03161461021c576040516365f4906560e01b815233600482015260240161018f565b6101a181610904565b61022d610692565b6001600160a01b0316336001600160a01b031614610260576040516365f4906560e01b815233600482015260240161018f565b6101a181610962565b606060006102ac84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506109af92505050565b90506000805b82518110156102fe5760008382815181106102cf576102cf611f6d565b6020026020010151905080604001516102f5576080810151516102f29084611f99565b92505b506001016102b2565b506000816001600160401b0381111561031957610319611d8b565b60405190808252806020026020018201604052801561035e57816020015b60408051808201909152606080825260208201528152602001906001900390816103375790505b5090506000915060005b835181101561067557600084828151811061038557610385611f6d565b60200260200101519050806040015161066c5760005b81608001515181101561066a576000826080015182815181106103c0576103c0611f6d565b60200260200101519050806001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042c9190611fac565b6105445760008190506040518060400160405280826001600160a01b0316636465e69f6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561047e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104a6919081019061201c565b81528551604051630f7703d960e11b815260048101919091526020909101906001600160a01b03841690631eee07b290602401600060405180830381865afa1580156104f6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261051e919081019061201c565b81525086888151811061053357610533611f6d565b602002602001018190525050610654565b60008190506040518060400160405280826001600160a01b0316636465e69f6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610592573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105ba919081019061201c565b81528551604051630f7703d960e11b815260048101919091526020909101906001600160a01b03841690631eee07b290602401600060405180830381865afa15801561060a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610632919081019061201c565b81525086888151811061064757610647611f6d565b6020026020010181905250505b8561065e8161206c565b9650505060010161039b565b505b50600101610368565b50925050505b92915050565b610689611b22565b61067b82610bf9565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015610732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107569190612085565b91505090565b61076581610c4b565b610770816000610d14565b6040516001600160a01b038216815233907f055c4c0e6f85afe96beaac6c9d650859c001e6ef93103856624cce6ceba811b4906020015b60405180910390a250565b60006101b16000801b8585856040516020016107cf9291906120a2565b6040516020818303038152906040526107e7906120b2565b610e53565b60006101c9858585856040516020016107cf9291906120a2565b606060006108126110dc565b905080516001600160401b0381111561082d5761082d611d8b565b60405190808252806020026020018201604052801561086657816020015b610853611b22565b81526020019060019003908161084b5790505b50915060005b81518110156108ff5760008060008061089d86868151811061089057610890611f6d565b60200260200101516110f9565b93509350935093506040518060800160405280858152602001846001600160a01b031681526020018381526020018215158152508786815181106108e3576108e3611f6d565b602002602001018190525050505050808060010191505061086c565b505090565b60005b815181101561095e5761093282828151811061092557610925611f6d565b6020026020010151610c4b565b61095682828151811061094757610947611f6d565b60200260200101516001610d14565b600101610907565b5050565b61096b81610c4b565b6109748161126d565b6040516001600160a01b038216815233907fa8e3e13a35b592afaa9d213d12c7ea06384518ada9733585d20883cfafcf249b906020016107a7565b606060006109bb61132a565b80519091506000816001600160401b038111156109da576109da611d8b565b604051908082528060200260200182016040528015610a03578160200160208202803683370190505b5085516020870120909150600090815b84811015610ad2576000610a3f878381518110610a3257610a32611f6d565b6020026020010151611355565b509250505060005b8151811015610ac85783828281518110610a6357610a63611f6d565b60200260200101518051906020012003610ac057878381518110610a8957610a89611f6d565b6020026020010151868681518110610aa357610aa3611f6d565b602090810291909101015284610ab88161206c565b955050610ac8565b600101610a47565b5050600101610a13565b506000826001600160401b03811115610aed57610aed611d8b565b604051908082528060200260200182016040528015610b5257816020015b610b3f6040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b815260200190600190039081610b0b5790505b50905060005b83811015610bed576000858281518110610b7457610b74611f6d565b60200260200101519050600080600080610b8d85611355565b93509350935093506040518060a00160405280868152602001858152602001841515815260200183815260200182815250878781518110610bd057610bd0611f6d565b602002602001018190525050505050508080600101915050610b58565b50979650505050505050565b610c01611b22565b610c0a82610c4b565b600080600080610c19866110f9565b604080516080810182529485526001600160a01b03909316602085015291830152151560608201529695505050505050565b6001600160a01b038116610c7257604051630706e15760e51b815260040160405180910390fd5b6040516301ffc9a760e01b8152637bc2cb4560e11b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa925050508015610cd9575060408051601f3d908101601f19168201909252610cd691810190611fac565b60015b610cf65760405163f58a5f2760e01b815260040160405180910390fd5b8061095e5760405163f58a5f2760e01b815260040160405180910390fd5b81600080516020612264833981519152610d3c60008051602061224483398151915283611480565b15610d5a57604051632406020960e01b815260040160405180910390fd5b610d6760018201856114a2565b506040518060600160405280856001600160a01b031681526020018415158152602001836001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dec9190611fac565b151590526001600160a01b0394851660009081526020928352604090819020825181549484015193909201511515600160a81b0260ff60a81b19931515600160a01b026001600160a81b031990951692909716919091179290921716939093179092555050565b600080610e5e610692565b90506000610e6b856114b7565b80519091506000610e7a611635565b805190915060005b83811015610f39576000858281518110610e9e57610e9e611f6d565b60200260200101519050866001600160a01b0316816001600160a01b031603610ed15760019750505050505050506101b4565b60005b83811015610f2f57816001600160a01b0316610f08868381518110610efb57610efb611f6d565b6020026020010151611660565b6001600160a01b031603610f27576000985050505050505050506101b4565b600101610ed4565b5050600101610e82565b506000805160206122648339815191526000610f6260008051602061224483398151915261166b565b905060005b818110156110ca5760008381610f806001830185611675565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015611009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102d9190611fac565b1580156110aa575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401611069939291906120d6565b602060405180830381865afa158015611086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110aa9190611fac565b156110c157600199505050505050505050506101b4565b50600101610f67565b5060009b9a5050505050505050505050565b60606101dc6000805160206122648339815191525b600101611681565b60606000818160008051602061226483398151915261112660008051602061224483398151915287611480565b6111435760405163017ab33760e71b815260040160405180910390fd5b60008690506000816001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611188573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111b0919081019061201c565b6001600160a01b03808a16600090815260208690526040808220548151636465e69f60e01b815291519495508316939192861691636465e69f9160048082019286929091908290030181865afa15801561120e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611236919081019061201c565b6001600160a01b039a909a16600090815260209590955250604090932054909892979650600160a01b900460ff1694509092505050565b60008051602061226483398151915261129460008051602061224483398151915283611480565b6112b15760405163017ab33760e71b815260040160405180910390fd5b6001600160a01b038216600090815260208290526040902054600160a01b900460ff16156112f257604051636045809760e11b815260040160405180910390fd5b6112ff600182018361168e565b506001600160a01b0390911660009081526020919091526040902080546001600160b01b0319169055565b60606101dc7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd006110f1565b600081815260008051602061222483398151915260205260408120805460609291839182919061138490612138565b80601f01602080910402602001604051908101604052809291908181526020018280546113b090612138565b80156113fd5780601f106113d2576101008083540402835291602001916113fd565b820191906000526020600020905b8154815290600101906020018083116113e057829003601f168201915b5050505050935061142b7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0090565b6000868152600391909101602090815260408083206001015460008051602061222483398151915290925290912060ff909116935061146c906002016116a3565b9150611477856116ae565b90509193509193565b6001600160a01b038116600090815260018301602052604081205415156101b4565b60006101b4836001600160a01b0384166117b2565b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa15801561152c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611554919081019061216c565b80519091506000611566826001611f99565b6001600160401b0381111561157d5761157d611d8b565b6040519080825280602002602001820160405280156115a6578160200160208202803683370190505b50905060005b82811015611600578381815181106115c6576115c6611f6d565b60200260200101518282815181106115e0576115e0611f6d565b6001600160a01b03909216602092830291909101909101526001016115ac565b508581838151811061161457611614611f6d565b6001600160a01b039092166020928302919091019091015295945050505050565b60606101dc7f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611681565b600061067b82611801565b600061067b825490565b60006101b483836118cc565b606060006101b4836118f6565b60006101b4836001600160a01b038416611952565b606061067b82611a45565b600081815260008051602061222483398151915260205260408120606091906116d99060040161166b565b6001600160401b038111156116f0576116f0611d8b565b604051908082528060200260200182016040528015611719578160200160208202803683370190505b50905060005b6000848152600080516020612224833981519152602052604090206117469060040161166b565b8110156117ab576000848152600080516020612224833981519152602052604081206117759060040183611675565b90508083838151811061178a5761178a611f6d565b6001600160a01b03909216602092830291909101909101525060010161171f565b5092915050565b60008181526001830160205260408120546117f95750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561067b565b50600061067b565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b831690036118b257816000036118ac578054831061188857604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115611889575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b60008260000182815481106118e3576118e3611f6d565b9060005260206000200154905092915050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561194657602002820191906000526020600020905b815481526020019060010190808311611932575b50505050509050919050565b60008181526001830160205260408120548015611a3b5760006119766001836121fa565b855490915060009061198a906001906121fa565b90508082146119ef5760008660000182815481106119aa576119aa611f6d565b90600052602060002001549050808760000184815481106119cd576119cd611f6d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611a0057611a0061220d565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061067b565b600091505061067b565b606081600001805480602002602001604051908101604052809291908181526020016000905b82821015611b17578382906000526020600020018054611a8a90612138565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab690612138565b8015611b035780601f10611ad857610100808354040283529160200191611b03565b820191906000526020600020905b815481529060010190602001808311611ae657829003601f168201915b505050505081526020019060010190611a6b565b505050509050919050565b60405180608001604052806060815260200160006001600160a01b03168152602001606081526020016000151581525090565b6001600160a01b03811681146101a157600080fd5b600060208284031215611b7c57600080fd5b81356101b481611b55565b60008083601f840112611b9957600080fd5b5081356001600160401b03811115611bb057600080fd5b602083019150836020828501011115611bc857600080fd5b9250929050565b600080600060408486031215611be457600080fd5b8335611bef81611b55565b925060208401356001600160401b03811115611c0a57600080fd5b611c1686828701611b87565b9497909650939450505050565b60008060008060608587031215611c3957600080fd5b843593506020850135611c4b81611b55565b925060408501356001600160401b03811115611c6657600080fd5b611c7287828801611b87565b95989497509550505050565b60005b83811015611c99578181015183820152602001611c81565b50506000910152565b60008151808452611cba816020860160208601611c7e565b601f01601f19169290920160200192915050565b6000815160808452611ce36080850182611ca2565b905060018060a01b03602084015116602085015260408301518482036040860152611d0e8282611ca2565b9150506060830151151560608501528091505092915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015611d7e57603f19888603018452611d6c858351611cce565b94509285019290850190600101611d50565b5092979650505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611dc957611dc9611d8b565b604052919050565b60006001600160401b03821115611dea57611dea611d8b565b5060051b60200190565b60006020808385031215611e0757600080fd5b82356001600160401b03811115611e1d57600080fd5b8301601f81018513611e2e57600080fd5b8035611e41611e3c82611dd1565b611da1565b81815260059190911b82018301908381019087831115611e6057600080fd5b928401925b82841015611e87578335611e7881611b55565b82529284019290840190611e65565b979650505050505050565b60008060208385031215611ea557600080fd5b82356001600160401b03811115611ebb57600080fd5b611ec785828601611b87565b90969095509350505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015611f4c57888303603f1901855281518051878552611f2088860182611ca2565b91890151858303868b0152919050611f388183611ca2565b968901969450505090860190600101611efc565b509098975050505050505050565b6020815260006101b46020830184611cce565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561067b5761067b611f83565b600060208284031215611fbe57600080fd5b815180151581146101b457600080fd5b60006001600160401b03831115611fe757611fe7611d8b565b611ffa601f8401601f1916602001611da1565b905082815283838301111561200e57600080fd5b6101b4836020830184611c7e565b60006020828403121561202e57600080fd5b81516001600160401b0381111561204457600080fd5b8201601f8101841361205557600080fd5b61206484825160208401611fce565b949350505050565b60006001820161207e5761207e611f83565b5060010190565b60006020828403121561209757600080fd5b81516101b481611b55565b8183823760009101908152919050565b805160208083015191908110156118ac5760001960209190910360031b1b16919050565b60006060820185835260206060602085015281865180845260808601915060208801935060005b818110156121225784516001600160a01b0316835293830193918301916001016120fd565b5050809350505050826040830152949350505050565b600181811c9082168061214c57607f821691505b6020821081036118ac57634e487b7160e01b600052602260045260246000fd5b6000602080838503121561217f57600080fd5b82516001600160401b0381111561219557600080fd5b8301601f810185136121a657600080fd5b80516121b4611e3c82611dd1565b81815260059190911b820183019083810190878311156121d357600080fd5b928401925b82841015611e875783516121eb81611b55565b825292840192908401906121d8565b8181038181111561067b5761067b611f83565b634e487b7160e01b600052603160045260246000fdfe672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd03a558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c93101a558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c93100 \ No newline at end of file diff --git a/packages/generated/v3/abis/EntitlementsManager.json b/packages/generated/v3/abis/EntitlementsManager.json new file mode 100644 index 000000000..4fbaf2dd1 --- /dev/null +++ b/packages/generated/v3/abis/EntitlementsManager.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"addEntitlementModule","inputs":[{"name":"entitlement","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addImmutableEntitlements","inputs":[{"name":"entitlements","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getEntitlement","inputs":[{"name":"entitlement","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IEntitlementsManagerBase.Entitlement","components":[{"name":"name","type":"string","internalType":"string"},{"name":"moduleAddress","type":"address","internalType":"address"},{"name":"moduleType","type":"string","internalType":"string"},{"name":"isImmutable","type":"bool","internalType":"bool"}]}],"stateMutability":"view"},{"type":"function","name":"getEntitlementDataByPermission","inputs":[{"name":"permission","type":"string","internalType":"string"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IEntitlementsManager.EntitlementData[]","components":[{"name":"entitlementType","type":"string","internalType":"string"},{"name":"entitlementData","type":"bytes","internalType":"bytes"}]}],"stateMutability":"view"},{"type":"function","name":"getEntitlements","inputs":[],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IEntitlementsManagerBase.Entitlement[]","components":[{"name":"name","type":"string","internalType":"string"},{"name":"moduleAddress","type":"address","internalType":"address"},{"name":"moduleType","type":"string","internalType":"string"},{"name":"isImmutable","type":"bool","internalType":"bool"}]}],"stateMutability":"view"},{"type":"function","name":"isEntitledToChannel","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"},{"name":"user","type":"address","internalType":"address"},{"name":"permission","type":"string","internalType":"string"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isEntitledToSpace","inputs":[{"name":"user","type":"address","internalType":"address"},{"name":"permission","type":"string","internalType":"string"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"removeEntitlementModule","inputs":[{"name":"entitlement","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"Banned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ConsecutiveTransfer","inputs":[{"name":"fromTokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"toTokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EntitlementModuleAdded","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"entitlement","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EntitlementModuleRemoved","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"entitlement","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleCreated","inputs":[{"name":"creator","type":"address","indexed":true,"internalType":"address"},{"name":"roleId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"RoleRemoved","inputs":[{"name":"remover","type":"address","indexed":true,"internalType":"address"},{"name":"roleId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"RoleUpdated","inputs":[{"name":"updater","type":"address","indexed":true,"internalType":"address"},{"name":"roleId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"SubscriptionUpdate","inputs":[{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"expiration","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unbanned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"ApprovalCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"ApprovalQueryForNonexistentToken","inputs":[]},{"type":"error","name":"BalanceQueryForZeroAddress","inputs":[]},{"type":"error","name":"Banning__AlreadyBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__CannotBanSelf","inputs":[]},{"type":"error","name":"Banning__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__NotBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC5643__DurationZero","inputs":[]},{"type":"error","name":"ERC5643__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC5643__NotApprovedOrOwner","inputs":[]},{"type":"error","name":"ERC5643__SubscriptionNotRenewable","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Entitlement__InvalidValue","inputs":[]},{"type":"error","name":"Entitlement__NotAllowed","inputs":[]},{"type":"error","name":"Entitlement__NotMember","inputs":[]},{"type":"error","name":"Entitlement__ValueAlreadyExists","inputs":[]},{"type":"error","name":"EntitlementsService__EntitlementAlreadyExists","inputs":[]},{"type":"error","name":"EntitlementsService__EntitlementDoesNotExist","inputs":[]},{"type":"error","name":"EntitlementsService__ImmutableEntitlement","inputs":[]},{"type":"error","name":"EntitlementsService__InvalidEntitlementAddress","inputs":[]},{"type":"error","name":"EntitlementsService__InvalidEntitlementInterface","inputs":[]},{"type":"error","name":"MintERC2309QuantityExceedsLimit","inputs":[]},{"type":"error","name":"MintToZeroAddress","inputs":[]},{"type":"error","name":"MintZeroQuantity","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]},{"type":"error","name":"OwnerQueryForNonexistentToken","inputs":[]},{"type":"error","name":"OwnershipNotInitializedForExtraData","inputs":[]},{"type":"error","name":"Pausable__NotPaused","inputs":[]},{"type":"error","name":"Pausable__Paused","inputs":[]},{"type":"error","name":"Roles__EntitlementAlreadyExists","inputs":[]},{"type":"error","name":"Roles__EntitlementDoesNotExist","inputs":[]},{"type":"error","name":"Roles__InvalidEntitlementAddress","inputs":[]},{"type":"error","name":"Roles__InvalidPermission","inputs":[]},{"type":"error","name":"Roles__PermissionAlreadyExists","inputs":[]},{"type":"error","name":"Roles__PermissionDoesNotExist","inputs":[]},{"type":"error","name":"Roles__RoleDoesNotExist","inputs":[]},{"type":"error","name":"TransferCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"TransferFromIncorrectOwner","inputs":[]},{"type":"error","name":"TransferToNonERC721ReceiverImplementer","inputs":[]},{"type":"error","name":"TransferToZeroAddress","inputs":[]},{"type":"error","name":"URIQueryForNonexistentToken","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b50612284806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80638bfc820f1161005b5780638bfc820f146100f2578063be24138d14610105578063db0a69a814610118578063fba4ff9d1461013857600080fd5b8063070b9c3f1461008d57806320759f9e146100a2578063367287e3146100ca578063487dc38c146100dd575b600080fd5b6100a061009b366004611b6a565b610158565b005b6100b56100b0366004611bcf565b6101a4565b60405190151581526020015b60405180910390f35b6100b56100d8366004611c23565b6101bb565b6100e56101d2565b6040516100c19190611d27565b6100a0610100366004611df4565b6101e1565b6100a0610113366004611b6a565b610225565b61012b610126366004611e92565b610269565b6040516100c19190611ed3565b61014b610146366004611b6a565b610681565b6040516100c19190611f5a565b610160610692565b6001600160a01b0316336001600160a01b031614610198576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6101a18161075c565b50565b60006101b18484846107b2565b90505b9392505050565b60006101c9858585856107ec565b95945050505050565b60606101dc610806565b905090565b6101e9610692565b6001600160a01b0316336001600160a01b03161461021c576040516365f4906560e01b815233600482015260240161018f565b6101a181610904565b61022d610692565b6001600160a01b0316336001600160a01b031614610260576040516365f4906560e01b815233600482015260240161018f565b6101a181610962565b606060006102ac84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506109af92505050565b90506000805b82518110156102fe5760008382815181106102cf576102cf611f6d565b6020026020010151905080604001516102f5576080810151516102f29084611f99565b92505b506001016102b2565b506000816001600160401b0381111561031957610319611d8b565b60405190808252806020026020018201604052801561035e57816020015b60408051808201909152606080825260208201528152602001906001900390816103375790505b5090506000915060005b835181101561067557600084828151811061038557610385611f6d565b60200260200101519050806040015161066c5760005b81608001515181101561066a576000826080015182815181106103c0576103c0611f6d565b60200260200101519050806001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042c9190611fac565b6105445760008190506040518060400160405280826001600160a01b0316636465e69f6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561047e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104a6919081019061201c565b81528551604051630f7703d960e11b815260048101919091526020909101906001600160a01b03841690631eee07b290602401600060405180830381865afa1580156104f6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261051e919081019061201c565b81525086888151811061053357610533611f6d565b602002602001018190525050610654565b60008190506040518060400160405280826001600160a01b0316636465e69f6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610592573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105ba919081019061201c565b81528551604051630f7703d960e11b815260048101919091526020909101906001600160a01b03841690631eee07b290602401600060405180830381865afa15801561060a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610632919081019061201c565b81525086888151811061064757610647611f6d565b6020026020010181905250505b8561065e8161206c565b9650505060010161039b565b505b50600101610368565b50925050505b92915050565b610689611b22565b61067b82610bf9565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015610732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107569190612085565b91505090565b61076581610c4b565b610770816000610d14565b6040516001600160a01b038216815233907f055c4c0e6f85afe96beaac6c9d650859c001e6ef93103856624cce6ceba811b4906020015b60405180910390a250565b60006101b16000801b8585856040516020016107cf9291906120a2565b6040516020818303038152906040526107e7906120b2565b610e53565b60006101c9858585856040516020016107cf9291906120a2565b606060006108126110dc565b905080516001600160401b0381111561082d5761082d611d8b565b60405190808252806020026020018201604052801561086657816020015b610853611b22565b81526020019060019003908161084b5790505b50915060005b81518110156108ff5760008060008061089d86868151811061089057610890611f6d565b60200260200101516110f9565b93509350935093506040518060800160405280858152602001846001600160a01b031681526020018381526020018215158152508786815181106108e3576108e3611f6d565b602002602001018190525050505050808060010191505061086c565b505090565b60005b815181101561095e5761093282828151811061092557610925611f6d565b6020026020010151610c4b565b61095682828151811061094757610947611f6d565b60200260200101516001610d14565b600101610907565b5050565b61096b81610c4b565b6109748161126d565b6040516001600160a01b038216815233907fa8e3e13a35b592afaa9d213d12c7ea06384518ada9733585d20883cfafcf249b906020016107a7565b606060006109bb61132a565b80519091506000816001600160401b038111156109da576109da611d8b565b604051908082528060200260200182016040528015610a03578160200160208202803683370190505b5085516020870120909150600090815b84811015610ad2576000610a3f878381518110610a3257610a32611f6d565b6020026020010151611355565b509250505060005b8151811015610ac85783828281518110610a6357610a63611f6d565b60200260200101518051906020012003610ac057878381518110610a8957610a89611f6d565b6020026020010151868681518110610aa357610aa3611f6d565b602090810291909101015284610ab88161206c565b955050610ac8565b600101610a47565b5050600101610a13565b506000826001600160401b03811115610aed57610aed611d8b565b604051908082528060200260200182016040528015610b5257816020015b610b3f6040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b815260200190600190039081610b0b5790505b50905060005b83811015610bed576000858281518110610b7457610b74611f6d565b60200260200101519050600080600080610b8d85611355565b93509350935093506040518060a00160405280868152602001858152602001841515815260200183815260200182815250878781518110610bd057610bd0611f6d565b602002602001018190525050505050508080600101915050610b58565b50979650505050505050565b610c01611b22565b610c0a82610c4b565b600080600080610c19866110f9565b604080516080810182529485526001600160a01b03909316602085015291830152151560608201529695505050505050565b6001600160a01b038116610c7257604051630706e15760e51b815260040160405180910390fd5b6040516301ffc9a760e01b8152637bc2cb4560e11b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa925050508015610cd9575060408051601f3d908101601f19168201909252610cd691810190611fac565b60015b610cf65760405163f58a5f2760e01b815260040160405180910390fd5b8061095e5760405163f58a5f2760e01b815260040160405180910390fd5b81600080516020612264833981519152610d3c60008051602061224483398151915283611480565b15610d5a57604051632406020960e01b815260040160405180910390fd5b610d6760018201856114a2565b506040518060600160405280856001600160a01b031681526020018415158152602001836001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dec9190611fac565b151590526001600160a01b0394851660009081526020928352604090819020825181549484015193909201511515600160a81b0260ff60a81b19931515600160a01b026001600160a81b031990951692909716919091179290921716939093179092555050565b600080610e5e610692565b90506000610e6b856114b7565b80519091506000610e7a611635565b805190915060005b83811015610f39576000858281518110610e9e57610e9e611f6d565b60200260200101519050866001600160a01b0316816001600160a01b031603610ed15760019750505050505050506101b4565b60005b83811015610f2f57816001600160a01b0316610f08868381518110610efb57610efb611f6d565b6020026020010151611660565b6001600160a01b031603610f27576000985050505050505050506101b4565b600101610ed4565b5050600101610e82565b506000805160206122648339815191526000610f6260008051602061224483398151915261166b565b905060005b818110156110ca5760008381610f806001830185611675565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015611009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102d9190611fac565b1580156110aa575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401611069939291906120d6565b602060405180830381865afa158015611086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110aa9190611fac565b156110c157600199505050505050505050506101b4565b50600101610f67565b5060009b9a5050505050505050505050565b60606101dc6000805160206122648339815191525b600101611681565b60606000818160008051602061226483398151915261112660008051602061224483398151915287611480565b6111435760405163017ab33760e71b815260040160405180910390fd5b60008690506000816001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611188573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111b0919081019061201c565b6001600160a01b03808a16600090815260208690526040808220548151636465e69f60e01b815291519495508316939192861691636465e69f9160048082019286929091908290030181865afa15801561120e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611236919081019061201c565b6001600160a01b039a909a16600090815260209590955250604090932054909892979650600160a01b900460ff1694509092505050565b60008051602061226483398151915261129460008051602061224483398151915283611480565b6112b15760405163017ab33760e71b815260040160405180910390fd5b6001600160a01b038216600090815260208290526040902054600160a01b900460ff16156112f257604051636045809760e11b815260040160405180910390fd5b6112ff600182018361168e565b506001600160a01b0390911660009081526020919091526040902080546001600160b01b0319169055565b60606101dc7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd006110f1565b600081815260008051602061222483398151915260205260408120805460609291839182919061138490612138565b80601f01602080910402602001604051908101604052809291908181526020018280546113b090612138565b80156113fd5780601f106113d2576101008083540402835291602001916113fd565b820191906000526020600020905b8154815290600101906020018083116113e057829003601f168201915b5050505050935061142b7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0090565b6000868152600391909101602090815260408083206001015460008051602061222483398151915290925290912060ff909116935061146c906002016116a3565b9150611477856116ae565b90509193509193565b6001600160a01b038116600090815260018301602052604081205415156101b4565b60006101b4836001600160a01b0384166117b2565b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa15801561152c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611554919081019061216c565b80519091506000611566826001611f99565b6001600160401b0381111561157d5761157d611d8b565b6040519080825280602002602001820160405280156115a6578160200160208202803683370190505b50905060005b82811015611600578381815181106115c6576115c6611f6d565b60200260200101518282815181106115e0576115e0611f6d565b6001600160a01b03909216602092830291909101909101526001016115ac565b508581838151811061161457611614611f6d565b6001600160a01b039092166020928302919091019091015295945050505050565b60606101dc7f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611681565b600061067b82611801565b600061067b825490565b60006101b483836118cc565b606060006101b4836118f6565b60006101b4836001600160a01b038416611952565b606061067b82611a45565b600081815260008051602061222483398151915260205260408120606091906116d99060040161166b565b6001600160401b038111156116f0576116f0611d8b565b604051908082528060200260200182016040528015611719578160200160208202803683370190505b50905060005b6000848152600080516020612224833981519152602052604090206117469060040161166b565b8110156117ab576000848152600080516020612224833981519152602052604081206117759060040183611675565b90508083838151811061178a5761178a611f6d565b6001600160a01b03909216602092830291909101909101525060010161171f565b5092915050565b60008181526001830160205260408120546117f95750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561067b565b50600061067b565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b831690036118b257816000036118ac578054831061188857604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115611889575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b60008260000182815481106118e3576118e3611f6d565b9060005260206000200154905092915050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561194657602002820191906000526020600020905b815481526020019060010190808311611932575b50505050509050919050565b60008181526001830160205260408120548015611a3b5760006119766001836121fa565b855490915060009061198a906001906121fa565b90508082146119ef5760008660000182815481106119aa576119aa611f6d565b90600052602060002001549050808760000184815481106119cd576119cd611f6d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611a0057611a0061220d565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061067b565b600091505061067b565b606081600001805480602002602001604051908101604052809291908181526020016000905b82821015611b17578382906000526020600020018054611a8a90612138565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab690612138565b8015611b035780601f10611ad857610100808354040283529160200191611b03565b820191906000526020600020905b815481529060010190602001808311611ae657829003601f168201915b505050505081526020019060010190611a6b565b505050509050919050565b60405180608001604052806060815260200160006001600160a01b03168152602001606081526020016000151581525090565b6001600160a01b03811681146101a157600080fd5b600060208284031215611b7c57600080fd5b81356101b481611b55565b60008083601f840112611b9957600080fd5b5081356001600160401b03811115611bb057600080fd5b602083019150836020828501011115611bc857600080fd5b9250929050565b600080600060408486031215611be457600080fd5b8335611bef81611b55565b925060208401356001600160401b03811115611c0a57600080fd5b611c1686828701611b87565b9497909650939450505050565b60008060008060608587031215611c3957600080fd5b843593506020850135611c4b81611b55565b925060408501356001600160401b03811115611c6657600080fd5b611c7287828801611b87565b95989497509550505050565b60005b83811015611c99578181015183820152602001611c81565b50506000910152565b60008151808452611cba816020860160208601611c7e565b601f01601f19169290920160200192915050565b6000815160808452611ce36080850182611ca2565b905060018060a01b03602084015116602085015260408301518482036040860152611d0e8282611ca2565b9150506060830151151560608501528091505092915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015611d7e57603f19888603018452611d6c858351611cce565b94509285019290850190600101611d50565b5092979650505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611dc957611dc9611d8b565b604052919050565b60006001600160401b03821115611dea57611dea611d8b565b5060051b60200190565b60006020808385031215611e0757600080fd5b82356001600160401b03811115611e1d57600080fd5b8301601f81018513611e2e57600080fd5b8035611e41611e3c82611dd1565b611da1565b81815260059190911b82018301908381019087831115611e6057600080fd5b928401925b82841015611e87578335611e7881611b55565b82529284019290840190611e65565b979650505050505050565b60008060208385031215611ea557600080fd5b82356001600160401b03811115611ebb57600080fd5b611ec785828601611b87565b90969095509350505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015611f4c57888303603f1901855281518051878552611f2088860182611ca2565b91890151858303868b0152919050611f388183611ca2565b968901969450505090860190600101611efc565b509098975050505050505050565b6020815260006101b46020830184611cce565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561067b5761067b611f83565b600060208284031215611fbe57600080fd5b815180151581146101b457600080fd5b60006001600160401b03831115611fe757611fe7611d8b565b611ffa601f8401601f1916602001611da1565b905082815283838301111561200e57600080fd5b6101b4836020830184611c7e565b60006020828403121561202e57600080fd5b81516001600160401b0381111561204457600080fd5b8201601f8101841361205557600080fd5b61206484825160208401611fce565b949350505050565b60006001820161207e5761207e611f83565b5060010190565b60006020828403121561209757600080fd5b81516101b481611b55565b8183823760009101908152919050565b805160208083015191908110156118ac5760001960209190910360031b1b16919050565b60006060820185835260206060602085015281865180845260808601915060208801935060005b818110156121225784516001600160a01b0316835293830193918301916001016120fd565b5050809350505050826040830152949350505050565b600181811c9082168061214c57607f821691505b6020821081036118ac57634e487b7160e01b600052602260045260246000fd5b6000602080838503121561217f57600080fd5b82516001600160401b0381111561219557600080fd5b8301601f810185136121a657600080fd5b80516121b4611e3c82611dd1565b81815260059190911b820183019083810190878311156121d357600080fd5b928401925b82841015611e875783516121eb81611b55565b825292840192908401906121d8565b8181038181111561067b5761067b611f83565b634e487b7160e01b600052603160045260246000fdfe672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd03a558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c93101a558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c93100","sourceMap":"634:2588:172:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100885760003560e01c80638bfc820f1161005b5780638bfc820f146100f2578063be24138d14610105578063db0a69a814610118578063fba4ff9d1461013857600080fd5b8063070b9c3f1461008d57806320759f9e146100a2578063367287e3146100ca578063487dc38c146100dd575b600080fd5b6100a061009b366004611b6a565b610158565b005b6100b56100b0366004611bcf565b6101a4565b60405190151581526020015b60405180910390f35b6100b56100d8366004611c23565b6101bb565b6100e56101d2565b6040516100c19190611d27565b6100a0610100366004611df4565b6101e1565b6100a0610113366004611b6a565b610225565b61012b610126366004611e92565b610269565b6040516100c19190611ed3565b61014b610146366004611b6a565b610681565b6040516100c19190611f5a565b610160610692565b6001600160a01b0316336001600160a01b031614610198576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6101a18161075c565b50565b60006101b18484846107b2565b90505b9392505050565b60006101c9858585856107ec565b95945050505050565b60606101dc610806565b905090565b6101e9610692565b6001600160a01b0316336001600160a01b03161461021c576040516365f4906560e01b815233600482015260240161018f565b6101a181610904565b61022d610692565b6001600160a01b0316336001600160a01b031614610260576040516365f4906560e01b815233600482015260240161018f565b6101a181610962565b606060006102ac84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506109af92505050565b90506000805b82518110156102fe5760008382815181106102cf576102cf611f6d565b6020026020010151905080604001516102f5576080810151516102f29084611f99565b92505b506001016102b2565b506000816001600160401b0381111561031957610319611d8b565b60405190808252806020026020018201604052801561035e57816020015b60408051808201909152606080825260208201528152602001906001900390816103375790505b5090506000915060005b835181101561067557600084828151811061038557610385611f6d565b60200260200101519050806040015161066c5760005b81608001515181101561066a576000826080015182815181106103c0576103c0611f6d565b60200260200101519050806001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042c9190611fac565b6105445760008190506040518060400160405280826001600160a01b0316636465e69f6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561047e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104a6919081019061201c565b81528551604051630f7703d960e11b815260048101919091526020909101906001600160a01b03841690631eee07b290602401600060405180830381865afa1580156104f6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261051e919081019061201c565b81525086888151811061053357610533611f6d565b602002602001018190525050610654565b60008190506040518060400160405280826001600160a01b0316636465e69f6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610592573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105ba919081019061201c565b81528551604051630f7703d960e11b815260048101919091526020909101906001600160a01b03841690631eee07b290602401600060405180830381865afa15801561060a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610632919081019061201c565b81525086888151811061064757610647611f6d565b6020026020010181905250505b8561065e8161206c565b9650505060010161039b565b505b50600101610368565b50925050505b92915050565b610689611b22565b61067b82610bf9565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015610732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107569190612085565b91505090565b61076581610c4b565b610770816000610d14565b6040516001600160a01b038216815233907f055c4c0e6f85afe96beaac6c9d650859c001e6ef93103856624cce6ceba811b4906020015b60405180910390a250565b60006101b16000801b8585856040516020016107cf9291906120a2565b6040516020818303038152906040526107e7906120b2565b610e53565b60006101c9858585856040516020016107cf9291906120a2565b606060006108126110dc565b905080516001600160401b0381111561082d5761082d611d8b565b60405190808252806020026020018201604052801561086657816020015b610853611b22565b81526020019060019003908161084b5790505b50915060005b81518110156108ff5760008060008061089d86868151811061089057610890611f6d565b60200260200101516110f9565b93509350935093506040518060800160405280858152602001846001600160a01b031681526020018381526020018215158152508786815181106108e3576108e3611f6d565b602002602001018190525050505050808060010191505061086c565b505090565b60005b815181101561095e5761093282828151811061092557610925611f6d565b6020026020010151610c4b565b61095682828151811061094757610947611f6d565b60200260200101516001610d14565b600101610907565b5050565b61096b81610c4b565b6109748161126d565b6040516001600160a01b038216815233907fa8e3e13a35b592afaa9d213d12c7ea06384518ada9733585d20883cfafcf249b906020016107a7565b606060006109bb61132a565b80519091506000816001600160401b038111156109da576109da611d8b565b604051908082528060200260200182016040528015610a03578160200160208202803683370190505b5085516020870120909150600090815b84811015610ad2576000610a3f878381518110610a3257610a32611f6d565b6020026020010151611355565b509250505060005b8151811015610ac85783828281518110610a6357610a63611f6d565b60200260200101518051906020012003610ac057878381518110610a8957610a89611f6d565b6020026020010151868681518110610aa357610aa3611f6d565b602090810291909101015284610ab88161206c565b955050610ac8565b600101610a47565b5050600101610a13565b506000826001600160401b03811115610aed57610aed611d8b565b604051908082528060200260200182016040528015610b5257816020015b610b3f6040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b815260200190600190039081610b0b5790505b50905060005b83811015610bed576000858281518110610b7457610b74611f6d565b60200260200101519050600080600080610b8d85611355565b93509350935093506040518060a00160405280868152602001858152602001841515815260200183815260200182815250878781518110610bd057610bd0611f6d565b602002602001018190525050505050508080600101915050610b58565b50979650505050505050565b610c01611b22565b610c0a82610c4b565b600080600080610c19866110f9565b604080516080810182529485526001600160a01b03909316602085015291830152151560608201529695505050505050565b6001600160a01b038116610c7257604051630706e15760e51b815260040160405180910390fd5b6040516301ffc9a760e01b8152637bc2cb4560e11b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa925050508015610cd9575060408051601f3d908101601f19168201909252610cd691810190611fac565b60015b610cf65760405163f58a5f2760e01b815260040160405180910390fd5b8061095e5760405163f58a5f2760e01b815260040160405180910390fd5b81600080516020612264833981519152610d3c60008051602061224483398151915283611480565b15610d5a57604051632406020960e01b815260040160405180910390fd5b610d6760018201856114a2565b506040518060600160405280856001600160a01b031681526020018415158152602001836001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dec9190611fac565b151590526001600160a01b0394851660009081526020928352604090819020825181549484015193909201511515600160a81b0260ff60a81b19931515600160a01b026001600160a81b031990951692909716919091179290921716939093179092555050565b600080610e5e610692565b90506000610e6b856114b7565b80519091506000610e7a611635565b805190915060005b83811015610f39576000858281518110610e9e57610e9e611f6d565b60200260200101519050866001600160a01b0316816001600160a01b031603610ed15760019750505050505050506101b4565b60005b83811015610f2f57816001600160a01b0316610f08868381518110610efb57610efb611f6d565b6020026020010151611660565b6001600160a01b031603610f27576000985050505050505050506101b4565b600101610ed4565b5050600101610e82565b506000805160206122648339815191526000610f6260008051602061224483398151915261166b565b905060005b818110156110ca5760008381610f806001830185611675565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015611009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102d9190611fac565b1580156110aa575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401611069939291906120d6565b602060405180830381865afa158015611086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110aa9190611fac565b156110c157600199505050505050505050506101b4565b50600101610f67565b5060009b9a5050505050505050505050565b60606101dc6000805160206122648339815191525b600101611681565b60606000818160008051602061226483398151915261112660008051602061224483398151915287611480565b6111435760405163017ab33760e71b815260040160405180910390fd5b60008690506000816001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611188573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111b0919081019061201c565b6001600160a01b03808a16600090815260208690526040808220548151636465e69f60e01b815291519495508316939192861691636465e69f9160048082019286929091908290030181865afa15801561120e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611236919081019061201c565b6001600160a01b039a909a16600090815260209590955250604090932054909892979650600160a01b900460ff1694509092505050565b60008051602061226483398151915261129460008051602061224483398151915283611480565b6112b15760405163017ab33760e71b815260040160405180910390fd5b6001600160a01b038216600090815260208290526040902054600160a01b900460ff16156112f257604051636045809760e11b815260040160405180910390fd5b6112ff600182018361168e565b506001600160a01b0390911660009081526020919091526040902080546001600160b01b0319169055565b60606101dc7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd006110f1565b600081815260008051602061222483398151915260205260408120805460609291839182919061138490612138565b80601f01602080910402602001604051908101604052809291908181526020018280546113b090612138565b80156113fd5780601f106113d2576101008083540402835291602001916113fd565b820191906000526020600020905b8154815290600101906020018083116113e057829003601f168201915b5050505050935061142b7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0090565b6000868152600391909101602090815260408083206001015460008051602061222483398151915290925290912060ff909116935061146c906002016116a3565b9150611477856116ae565b90509193509193565b6001600160a01b038116600090815260018301602052604081205415156101b4565b60006101b4836001600160a01b0384166117b2565b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa15801561152c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611554919081019061216c565b80519091506000611566826001611f99565b6001600160401b0381111561157d5761157d611d8b565b6040519080825280602002602001820160405280156115a6578160200160208202803683370190505b50905060005b82811015611600578381815181106115c6576115c6611f6d565b60200260200101518282815181106115e0576115e0611f6d565b6001600160a01b03909216602092830291909101909101526001016115ac565b508581838151811061161457611614611f6d565b6001600160a01b039092166020928302919091019091015295945050505050565b60606101dc7f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611681565b600061067b82611801565b600061067b825490565b60006101b483836118cc565b606060006101b4836118f6565b60006101b4836001600160a01b038416611952565b606061067b82611a45565b600081815260008051602061222483398151915260205260408120606091906116d99060040161166b565b6001600160401b038111156116f0576116f0611d8b565b604051908082528060200260200182016040528015611719578160200160208202803683370190505b50905060005b6000848152600080516020612224833981519152602052604090206117469060040161166b565b8110156117ab576000848152600080516020612224833981519152602052604081206117759060040183611675565b90508083838151811061178a5761178a611f6d565b6001600160a01b03909216602092830291909101909101525060010161171f565b5092915050565b60008181526001830160205260408120546117f95750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561067b565b50600061067b565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b831690036118b257816000036118ac578054831061188857604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115611889575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b60008260000182815481106118e3576118e3611f6d565b9060005260206000200154905092915050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561194657602002820191906000526020600020905b815481526020019060010190808311611932575b50505050509050919050565b60008181526001830160205260408120548015611a3b5760006119766001836121fa565b855490915060009061198a906001906121fa565b90508082146119ef5760008660000182815481106119aa576119aa611f6d565b90600052602060002001549050808760000184815481106119cd576119cd611f6d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611a0057611a0061220d565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061067b565b600091505061067b565b606081600001805480602002602001604051908101604052809291908181526020016000905b82821015611b17578382906000526020600020018054611a8a90612138565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab690612138565b8015611b035780601f10611ad857610100808354040283529160200191611b03565b820191906000526020600020905b815481529060010190602001808311611ae657829003601f168201915b505050505081526020019060010190611a6b565b505050509050919050565b60405180608001604052806060815260200160006001600160a01b03168152602001606081526020016000151581525090565b6001600160a01b03811681146101a157600080fd5b600060208284031215611b7c57600080fd5b81356101b481611b55565b60008083601f840112611b9957600080fd5b5081356001600160401b03811115611bb057600080fd5b602083019150836020828501011115611bc857600080fd5b9250929050565b600080600060408486031215611be457600080fd5b8335611bef81611b55565b925060208401356001600160401b03811115611c0a57600080fd5b611c1686828701611b87565b9497909650939450505050565b60008060008060608587031215611c3957600080fd5b843593506020850135611c4b81611b55565b925060408501356001600160401b03811115611c6657600080fd5b611c7287828801611b87565b95989497509550505050565b60005b83811015611c99578181015183820152602001611c81565b50506000910152565b60008151808452611cba816020860160208601611c7e565b601f01601f19169290920160200192915050565b6000815160808452611ce36080850182611ca2565b905060018060a01b03602084015116602085015260408301518482036040860152611d0e8282611ca2565b9150506060830151151560608501528091505092915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015611d7e57603f19888603018452611d6c858351611cce565b94509285019290850190600101611d50565b5092979650505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611dc957611dc9611d8b565b604052919050565b60006001600160401b03821115611dea57611dea611d8b565b5060051b60200190565b60006020808385031215611e0757600080fd5b82356001600160401b03811115611e1d57600080fd5b8301601f81018513611e2e57600080fd5b8035611e41611e3c82611dd1565b611da1565b81815260059190911b82018301908381019087831115611e6057600080fd5b928401925b82841015611e87578335611e7881611b55565b82529284019290840190611e65565b979650505050505050565b60008060208385031215611ea557600080fd5b82356001600160401b03811115611ebb57600080fd5b611ec785828601611b87565b90969095509350505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015611f4c57888303603f1901855281518051878552611f2088860182611ca2565b91890151858303868b0152919050611f388183611ca2565b968901969450505090860190600101611efc565b509098975050505050505050565b6020815260006101b46020830184611cce565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561067b5761067b611f83565b600060208284031215611fbe57600080fd5b815180151581146101b457600080fd5b60006001600160401b03831115611fe757611fe7611d8b565b611ffa601f8401601f1916602001611da1565b905082815283838301111561200e57600080fd5b6101b4836020830184611c7e565b60006020828403121561202e57600080fd5b81516001600160401b0381111561204457600080fd5b8201601f8101841361205557600080fd5b61206484825160208401611fce565b949350505050565b60006001820161207e5761207e611f83565b5060010190565b60006020828403121561209757600080fd5b81516101b481611b55565b8183823760009101908152919050565b805160208083015191908110156118ac5760001960209190910360031b1b16919050565b60006060820185835260206060602085015281865180845260808601915060208801935060005b818110156121225784516001600160a01b0316835293830193918301916001016120fd565b5050809350505050826040830152949350505050565b600181811c9082168061214c57607f821691505b6020821081036118ac57634e487b7160e01b600052602260045260246000fd5b6000602080838503121561217f57600080fd5b82516001600160401b0381111561219557600080fd5b8301601f810185136121a657600080fd5b80516121b4611e3c82611dd1565b81815260059190911b820183019083810190878311156121d357600080fd5b928401925b82841015611e875783516121eb81611b55565b825292840192908401906121d8565b8181038181111561067b5761067b611f83565b634e487b7160e01b600052603160045260246000fdfe672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd03a558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c93101a558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c93100","sourceMap":"634:2588:172:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;891:115;;;;;;:::i;:::-;;:::i;:::-;;1393:164;;;;;;:::i;:::-;;:::i;:::-;;;1471:14:375;;1464:22;1446:41;;1434:2;1419:18;1393:164:172;;;;;;;;1561:202;;;;;;:::i;:::-;;:::i;1135:108::-;;;:::i;:::-;;;;;;;:::i;745:142::-;;;;;;:::i;:::-;;:::i;1010:121::-;;;;;;:::i;:::-;;:::i;1767:1453::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1247:142::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;891:115::-;648:8:83;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:83;:10;-1:-1:-1;;;;;634:22:83;;630:79;;673:29;;-1:-1:-1;;;673:29:83;;691:10;673:29;;;7638:51:375;7611:18;;673:29:83;;;;;;;;630:79;967:34:172::1;989:11;967:21;:34::i;:::-;891:115:::0;:::o;1393:164::-;1497:4;1516:36;1535:4;1541:10;;1516:18;:36::i;:::-;1509:43;;1393:164;;;;;;:::o;1561:202::-;1690:4;1709:49;1730:9;1741:4;1747:10;;1709:20;:49::i;:::-;1702:56;1561:202;-1:-1:-1;;;;;1561:202:172:o;1135:108::-;1185:20;1220:18;:16;:18::i;:::-;1213:25;;1135:108;:::o;745:142::-;648:8:83;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:83;:10;-1:-1:-1;;;;;634:22:83;;630:79;;673:29;;-1:-1:-1;;;673:29:83;;691:10;673:29;;;7638:51:375;7611:18;;673:29:83;7492:203:375;630:79:83;843:39:172::1;869:12;843:25;:39::i;1010:121::-:0;648:8:83;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:83;:10;-1:-1:-1;;;;;634:22:83;;630:79;;673:29;;-1:-1:-1;;;673:29:83;;691:10;673:29;;;7638:51:375;7611:18;;673:29:83;7492:203:375;630:79:83;1089:37:172::1;1114:11;1089:24;:37::i;1767:1453::-:0;1866:24;1898:30;1931:35;1955:10;;1931:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1931:23:172;;-1:-1:-1;;;1931:35:172:i;:::-;1898:68;;1972:24;2011:9;2006:186;2030:5;:12;2026:1;:16;2006:186;;;2057:27;2087:5;2093:1;2087:8;;;;;;;;:::i;:::-;;;;;;;2057:38;;2108:4;:13;;;2103:83;;2153:17;;;;:24;2133:44;;;;:::i;:::-;;;2103:83;-1:-1:-1;2044:3:172;;2006:186;;;;2198:40;2270:16;-1:-1:-1;;;;;2241:51:172;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;2241:51:172;;;;;;;;;;;;;;;;2198:94;;2318:1;2299:20;;2331:9;2326:862;2350:5;:12;2346:1;:16;2326:862;;;2377:27;2407:5;2413:1;2407:8;;;;;;;;:::i;:::-;;;;;;;2377:38;;2428:4;:13;;;2423:759;;2458:9;2453:721;2477:4;:17;;;:24;2473:1;:28;2453:721;;;2520:24;2560:4;:17;;;2578:1;2560:20;;;;;;;;:::i;:::-;;;;;;;2520:61;;2598:11;-1:-1:-1;;;;;2598:24:172;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2593:541;;2640:19;2687:11;2640:60;;2750:114;;;;;;;;2781:2;-1:-1:-1;;;;;2781:13:172;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2781:15:172;;;;;;;;;;;;:::i;:::-;2750:114;;2842:7;;2812:38;;-1:-1:-1;;;2812:38:172;;;;;9382:25:375;;;;2750:114:172;;;;;-1:-1:-1;;;;;2812:29:172;;;;;9355:18:375;;2812:38:172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2812:38:172;;;;;;;;;;;;:::i;:::-;2750:114;;;2714:15;2730:16;2714:33;;;;;;;;:::i;:::-;;;;;;:150;;;;2626:251;2593:541;;;2897:19;2944:11;2897:60;;3007:114;;;;;;;;3038:2;-1:-1:-1;;;;;3038:13:172;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3038:15:172;;;;;;;;;;;;:::i;:::-;3007:114;;3099:7;;3069:38;;-1:-1:-1;;;3069:38:172;;;;;9382:25:375;;;;3007:114:172;;;;;-1:-1:-1;;;;;3069:29:172;;;;;9355:18:375;;3069:38:172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3069:38:172;;;;;;;;;;;;:::i;:::-;3007:114;;;2971:15;2987:16;2971:33;;;;;;;;:::i;:::-;;;;;;:150;;;;2883:251;2593:541;3145:18;;;;:::i;:::-;;-1:-1:-1;;;2503:3:172;;2453:721;;;;2423:759;-1:-1:-1;2364:3:172;;2326:862;;;-1:-1:-1;3200:15:172;-1:-1:-1;;;1767:1453:172;;;;;:::o;1247:142::-;1323:18;;:::i;:::-;1356:28;1372:11;1356:15;:28::i;724:189:83:-;786:67;;;;;;;;302:66:85;786:67:83;-1:-1:-1;;;;;786:67:83;;;;;;;;;;;;;866:42;;-1:-1:-1;;;866:42:83;;;;;9382:25:375;;;;866:42:83;;765:13;;866:30;;9355:18:375;;;;;866:42:83;;;;;;786:67;866:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;859:49;;;724:189;:::o;647:355:173:-;770:59;817:11;770:46;:59::i;:::-;859:61;901:11;914:5;859:41;:61::i;:::-;950:47;;-1:-1:-1;;;;;7656:32:375;;7638:51;;973:10:173;;950:47;;7626:2:375;7611:18;950:47:173;;;;;;;;647:355;:::o;2822:194:156:-;2927:4;2946:65;1445:3;2958:7;;2967:4;2998:10;;2981:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2973:37;;;:::i;:::-;2946:11;:65::i;3020:221::-;3150:4;3169:67;3181:9;3192:4;3223:10;;3206:28;;;;;;;;;:::i;1886:680:173:-;1949:28;1987:29;2019:51;:49;:51::i;:::-;1987:83;;2105:12;:19;-1:-1:-1;;;;;2087:38:173;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2077:48;;2137:9;2132:430;2156:12;:19;2152:1;:23;2132:430;;;2200:18;2228:26;2264:24;2298:16;2325:58;2367:12;2380:1;2367:15;;;;;;;;:::i;:::-;;;;;;;2325:41;:58::i;:::-;2190:193;;;;;;;;2405:150;;;;;;;;2433:4;2405:150;;;;2462:18;-1:-1:-1;;;;;2405:150:173;;;;;2502:10;2405:150;;;;2535:11;2405:150;;;;;2392:7;2400:1;2392:10;;;;;;;;:::i;:::-;;;;;;:163;;;;2182:380;;;;2177:3;;;;;;;2132:430;;;;1981:585;1886:680;:::o;358:285::-;444:9;439:200;463:12;:19;459:1;:23;439:200;;;497:63;544:12;557:1;544:15;;;;;;;;:::i;:::-;;;;;;;497:46;:63::i;:::-;568:64;610:12;623:1;610:15;;;;;;;;:::i;:::-;;;;;;;627:4;568:41;:64::i;:::-;484:3;;439:200;;;;358:285;:::o;1006:356::-;1132:59;1179:11;1132:46;:59::i;:::-;1221:57;1266:11;1221:44;:57::i;:::-;1308:49;;-1:-1:-1;;;;;7656:32:375;;7638:51;;1333:10:173;;1308:49;;7626:2:375;7611:18;1308:49:173;7492:203:375;2762:1424:206;2852:13;2873:24;2900:13;:11;:13::i;:::-;2939:14;;2873:40;;-1:-1:-1;2919:17:206;2939:14;-1:-1:-1;;;;;2993:24:206;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2993:24:206;-1:-1:-1;3077:28:206;;;;;;2959:58;;-1:-1:-1;3023:13:206;;;3186:341;3210:9;3206:1;:13;3186:341;;;3239:27;3272:20;3281:7;3289:1;3281:10;;;;;;;;:::i;:::-;;;;;;;3272:8;:20::i;:::-;3234:58;;;;;3305:9;3300:221;3324:11;:18;3320:1;:22;3300:221;;;3399:19;3379:11;3391:1;3379:14;;;;;;;;:::i;:::-;;;;;;;3363:32;;;;;;:55;3359:154;;3456:7;3464:1;3456:10;;;;;;;;:::i;:::-;;;;;;;3432:14;3447:5;3432:21;;;;;;;;:::i;:::-;;;;;;;;;;:34;3478:7;;;;:::i;:::-;;;;3497:5;;3359:154;3344:3;;3300:221;;;-1:-1:-1;;3221:3:206;;3186:341;;;;3592:33;3639:5;-1:-1:-1;;;;;3628:17:206;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3628:17:206;;;;;;;;;;;;;;;;;3592:53;;3711:9;3706:443;3730:5;3726:1;:9;3706:443;;;3750:14;3767;3782:1;3767:17;;;;;;;;:::i;:::-;;;;;;;3750:34;;3802:18;3830:16;3856:27;3893:34;3938:16;3947:6;3938:8;:16::i;:::-;3792:162;;;;;;;;3987:155;;;;;;;;4006:6;3987:155;;;;4028:4;3987:155;;;;4052:11;3987:155;;;;;;4086:11;3987:155;;;;4121:12;3987:155;;;3962:19;3982:1;3962:22;;;;;;;;:::i;:::-;;;;;;:180;;;;3742:407;;;;;3737:3;;;;;;;3706:443;;;-1:-1:-1;4162:19:206;2762:1424;-1:-1:-1;;;;;;;2762:1424:206:o;1366:516:173:-;1443:25;;:::i;:::-;1476:59;1523:11;1476:46;:59::i;:::-;1550:18;1576:26;1610:24;1642:16;1667:54;1709:11;1667:41;:54::i;:::-;1737:140;;;;;;;;;;;-1:-1:-1;;;;;1737:140:173;;;;;;;;;;;;;;;;;;1366:516;-1:-1:-1;;;;;;1366:516:173:o;3437:476:174:-;-1:-1:-1;;;;;3511:25:174;;3507:101;;3553:48;;-1:-1:-1;;;3553:48:174;;;;;;;;;;;3507:101;3624:70;;-1:-1:-1;;;3624:70:174;;-1:-1:-1;;;3624:70:174;;;11001:52:375;-1:-1:-1;;;;;3624:38:174;;;;;10974:18:375;;3624:70:174;;;;;;;;;;;;;;;;;;-1:-1:-1;3624:70:174;;;;;;;;-1:-1:-1;;3624:70:174;;;;;;;;;;;;:::i;:::-;;;3614:295;;3852:50;;-1:-1:-1;;;3852:50:174;;;;;;;;;;;3614:295;3737:9;3732:92;;3765:50;;-1:-1:-1;;;3765:50:174;;;;;;;;;;;1239:601;1348:11;-1:-1:-1;;;;;;;;;;;1466:37:174;-1:-1:-1;;;;;;;;;;;1348:11:174;1466:24;:37::i;:::-;1462:112;;;1520:47;;-1:-1:-1;;;1520:47:174;;;;;;;;;;;1462:112;1580:32;:15;;;1600:11;1580:19;:32::i;:::-;;1657:178;;;;;;;;1739:11;-1:-1:-1;;;;;1657:178:174;;;;;1774:11;1657:178;;;;;;1809:2;-1:-1:-1;;;;;1809:15:174;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1657:178;;;;-1:-1:-1;;;;;1618:36:174;;;:23;:36;;;;;;;;;;;;:217;;;;;;;;;;;;;;;-1:-1:-1;;;1618:217:174;-1:-1:-1;;;;1618:217:174;;;-1:-1:-1;;;1618:217:174;-1:-1:-1;;;;;;1618:217:174;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1239:601:174:o;1566:1252:156:-;1679:4;1691:13;1707:8;:6;:8::i;:::-;1691:24;;1722;1749:31;1775:4;1749:25;:31::i;:::-;1816:14;;1722:58;;-1:-1:-1;1786:27:156;1869:17;:15;:17::i;:::-;1918:19;;1837:49;;-1:-1:-1;1892:23:156;1944:320;1968:19;1964:1;:23;1944:320;;;2002:14;2019:7;2027:1;2019:10;;;;;;;;:::i;:::-;;;;;;;2002:27;;2052:5;-1:-1:-1;;;;;2042:15:156;:6;-1:-1:-1;;;;;2042:15:156;;2038:51;;2076:4;2069:11;;;;;;;;;;;2038:51;2127:9;2122:136;2142:15;2138:1;:19;2122:136;;;2207:6;-1:-1:-1;;;;;2178:35:156;:25;2187:12;2200:1;2187:15;;;;;;;;:::i;:::-;;;;;;;2178:8;:25::i;:::-;-1:-1:-1;;;;;2178:35:156;;2174:76;;2234:5;2227:12;;;;;;;;;;;;2174:76;2159:3;;2122:136;;;-1:-1:-1;;1989:3:156;;1944:320;;;-1:-1:-1;;;;;;;;;;;;2308:44:156;2432:24;-1:-1:-1;;;;;;;;;;;2432:22:156;:24::i;:::-;2403:53;;2468:9;2463:332;2487:18;2483:1;:22;2463:332;;;2520:47;2570:2;2520:47;2603:21;:15;;;2622:1;2603:18;:21::i;:::-;-1:-1:-1;;;;;2570:62:156;;;;;;;;;;;;;;;;;-1:-1:-1;2570:62:156;2520:112;;;;;;;;;;;;;;;;-1:-1:-1;;;2520:112:156;;;;;;;;;;-1:-1:-1;;;2520:112:156;;;;;;;;;;;;2654:28;;-1:-1:-1;;;2654:28:156;;;;2520:112;;-1:-1:-1;2520:112:156;;2654:26;;:28;;;;;;;;;;;2520:112;2654:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2653:29;:97;;;;;2694:1;:13;;;-1:-1:-1;;;;;2694:24:156;;2719:9;2730:7;2739:10;2694:56;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2640:149;;;2776:4;2769:11;;;;;;;;;;;;;2640:149;-1:-1:-1;2507:3:156;;2463:332;;;-1:-1:-1;2808:5:156;;1566:1252;-1:-1:-1;;;;;;;;;;;1566:1252:156:o;3086:170:174:-;3148:29;3194:57;-1:-1:-1;;;;;;;;;;;3194:35:174;:48;;:55;:57::i;2339:743::-;2434:18;2460:21;2434:18;2460:21;-1:-1:-1;;;;;;;;;;;2653:37:174;-1:-1:-1;;;;;;;;;;;2678:11:174;2653:24;:37::i;:::-;2648:112;;2707:46;;-1:-1:-1;;;2707:46:174;;;;;;;;;;;2648:112;2766:15;2797:11;2766:43;;2815:19;2837:2;-1:-1:-1;;;;;2837:7:174;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2837:9:174;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2876:36:174;;;2852:13;2876:36;;;;;;;;;;;:48;2953:15;;-1:-1:-1;;;2953:15:174;;;;2815:31;;-1:-1:-1;2876:48:174;;;2852:13;;2953;;;;;:15;;;;;2852:13;;2953:15;;;;;;;;:13;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2953:15:174;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2987:36:174;;;;2974:10;2987:36;;;;;;;;-1:-1:-1;2987:36:174;;;;:48;3050:5;;3057;;2987:36;-1:-1:-1;;;;2987:48:174;;;;;-1:-1:-1;2339:743:174;;-1:-1:-1;;;2339:743:174:o;1844:491::-;-1:-1:-1;;;;;;;;;;;2008:37:174;-1:-1:-1;;;;;;;;;;;2033:11:174;2008:24;:37::i;:::-;2003:112;;2062:46;;-1:-1:-1;;;2062:46:174;;;;;;;;;;;2003:112;-1:-1:-1;;;;;2125:36:174;;:23;:36;;;;;;;;;;:48;-1:-1:-1;;;2125:48:174;;;;2121:119;;;2190:43;;-1:-1:-1;;;2190:43:174;;;;;;;;;;;2121:119;2246:35;:15;;;2269:11;2246:22;:35::i;:::-;-1:-1:-1;;;;;;2294:36:174;;;:23;:36;;;;;;;;;;;2287:43;;-1:-1:-1;;;;;;2287:43:174;;;1844:491::o;9970:126:206:-;10016:24;10055:36;434:66:207;10055:21:206;764:141:207;9493:473:206;9603:16;9718:38;;;-1:-1:-1;;;;;;;;;;;9718:38:206;;;;;9711:50;;9577:18;;9603:16;9577:18;;;;9718:38;9711:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9781:21;434:66:207;;764:141;9781:21:206;:38;;;;:30;;;;;:38;;;;;;;;:50;;;-1:-1:-1;;;;;;;;;;;9851:38:206;;;;;;9781:50;;;;;-1:-1:-1;9851:59:206;;:50;;:57;:59::i;:::-;9837:73;;9931:30;9954:6;9931:22;:30::i;:::-;9916:45;;9493:473;;;;;:::o;8871:165:327:-;-1:-1:-1;;;;;9004:23:327;;8951:4;4360:21;;;:14;;;:21;;;;;;:26;;8974:55;4264:129;8316:150;8386:4;8409:50;8414:3;-1:-1:-1;;;;;8434:23:327;;8409:4;:50::i;4548:533:156:-;4628:16;4652:14;294:66:188;4681:39:156;;;4760:28;;-1:-1:-1;;;4760:28:156;;-1:-1:-1;;;;;7656:32:375;;;4760:28:156;;;7638:51:375;4681:39:156;;;;-1:-1:-1;4681:39:156;;;;4760:22;;7611:18:375;;4760:28:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4760:28:156;;;;;;;;;;;;:::i;:::-;4824:20;;4727:61;;-1:-1:-1;4794:27:156;4892:23;4824:20;4914:1;4892:23;:::i;:::-;-1:-1:-1;;;;;4878:38:156;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4878:38:156;;4851:65;;4927:9;4922:94;4946:19;4942:1;:23;4922:94;;;4993:13;5007:1;4993:16;;;;;;;;:::i;:::-;;;;;;;4980:7;4988:1;4980:10;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4980:29:156;;;:10;;;;;;;;;;;:29;4967:3;;4922:94;;;;5052:4;5021:7;5029:19;5021:28;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5021:35:156;;;:28;;;;;;;;;;;:35;5069:7;4548:533;-1:-1:-1;;;;;4548:533:156:o;1228:128:159:-;1278:16;1309:42;377:66:160;1309:40:159;:42::i;22045:138:105:-;22111:7;22149:27;22168:7;22149:18;:27::i;9117:115:327:-;9180:7;9206:19;9214:3;4556:18;;4474:107;9574:156;9648:7;9698:22;9702:3;9714:5;9698:3;:22::i;10270:300::-;10333:16;10361:22;10386:19;10394:3;10386:7;:19::i;8634:156::-;8707:4;8730:53;8738:3;-1:-1:-1;;;;;8758:23:327;;8730:7;:53::i;5598:103:221:-;5654:15;5684:12;5692:3;5684:7;:12::i;10100:599:206:-;10208:39;10276:38;;;-1:-1:-1;;;;;;;;;;;10276:38:206;;;;;10179:21;;10208:39;10276:60;;:51;;:58;:60::i;:::-;-1:-1:-1;;;;;10250:92:206;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10250:92:206;;10208:134;;10361:9;10349:315;10386:38;;;;-1:-1:-1;;;;;;;;;;;10386:38:206;;;;;:60;;:51;;:58;:60::i;:::-;10382:1;:64;10349:315;;;10472:26;10501:56;;;-1:-1:-1;;;;;;;;;;;10501:56:206;;;;;:93;;:78;;10592:1;10501:90;:93::i;:::-;10472:122;;10638:18;10602:17;10620:1;10602:20;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10602:55:206;;;:20;;;;;;;;;;;:55;-1:-1:-1;10454:3:206;;10349:315;;;-1:-1:-1;10677:17:206;10100:599;-1:-1:-1;;10100:599:206:o;2241:406:327:-;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:327;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:327;2618:12;;7836:1501:105;7974:32;8050:29;;;:20;:29;;;;;;;300:66:107;;-1:-1:-1;;;8115:24:105;;:29;;8111:1172;;8236:6;8246:1;8236:11;8232:791;;8276:16;;8265:27;;8261:83;;8313:31;;-1:-1:-1;;;8313:31:105;;;;;;;;;;;8261:83;8831:182;-1:-1:-1;;8910:9:105;;;8889:31;;;;:20;;;:31;;;;;;8910:9;;8889:31;;-1:-1:-1;8948:25:105;;8831:182;8948:25;;8987:13;7836:1501;;;:::o;8111:1172::-;7966:1323;9301:31;;-1:-1:-1;;;9301:31:105;;;;;;;;;;;4923:118:327;4990:7;5016:3;:11;;5028:5;5016:18;;;;;;;;:::i;:::-;;;;;;;;;5009:25;;4923:118;;;;:::o;5581:109::-;5637:16;5672:3;:11;;5665:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5581:109;;;:::o;2815:1368::-;2881:4;3010:21;;;:14;;;:21;;;;;;3046:13;;3042:1135;;3413:18;3434:12;3445:1;3434:8;:12;:::i;:::-;3480:18;;3413:33;;-1:-1:-1;3460:17:327;;3480:22;;3501:1;;3480:22;:::i;:::-;3460:42;;3535:9;3521:10;:23;3517:378;;3564:17;3584:3;:11;;3596:9;3584:22;;;;;;;;:::i;:::-;;;;;;;;;3564:42;;3731:9;3705:3;:11;;3717:10;3705:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;3844:25;;;:14;;;:25;;;;;:36;;;3517:378;3973:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4076:3;:14;;:21;4091:5;4076:21;;;;;;;;;;;4069:28;;;4119:4;4112:11;;;;;;;3042:1135;4161:5;4154:12;;;;;3604:102:221;3660:15;3690:3;:11;;3683:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3604:102;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:375:-;-1:-1:-1;;;;;89:31:375;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;402:348::-;454:8;464:6;518:3;511:4;503:6;499:17;495:27;485:55;;536:1;533;526:12;485:55;-1:-1:-1;559:20:375;;-1:-1:-1;;;;;591:30:375;;588:50;;;634:1;631;624:12;588:50;671:4;663:6;659:17;647:29;;723:3;716:4;707:6;699;695:19;691:30;688:39;685:59;;;740:1;737;730:12;685:59;402:348;;;;;:::o;755:546::-;835:6;843;851;904:2;892:9;883:7;879:23;875:32;872:52;;;920:1;917;910:12;872:52;959:9;946:23;978:31;1003:5;978:31;:::i;:::-;1028:5;-1:-1:-1;1084:2:375;1069:18;;1056:32;-1:-1:-1;;;;;1100:30:375;;1097:50;;;1143:1;1140;1133:12;1097:50;1182:59;1233:7;1224:6;1213:9;1209:22;1182:59;:::i;:::-;755:546;;1260:8;;-1:-1:-1;1156:85:375;;-1:-1:-1;;;;755:546:375:o;1498:614::-;1587:6;1595;1603;1611;1664:2;1652:9;1643:7;1639:23;1635:32;1632:52;;;1680:1;1677;1670:12;1632:52;1716:9;1703:23;1693:33;;1776:2;1765:9;1761:18;1748:32;1789:31;1814:5;1789:31;:::i;:::-;1839:5;-1:-1:-1;1895:2:375;1880:18;;1867:32;-1:-1:-1;;;;;1911:30:375;;1908:50;;;1954:1;1951;1944:12;1908:50;1993:59;2044:7;2035:6;2024:9;2020:22;1993:59;:::i;:::-;1498:614;;;;-1:-1:-1;2071:8:375;-1:-1:-1;;;;1498:614:375:o;2117:250::-;2202:1;2212:113;2226:6;2223:1;2220:13;2212:113;;;2302:11;;;2296:18;2283:11;;;2276:39;2248:2;2241:10;2212:113;;;-1:-1:-1;;2359:1:375;2341:16;;2334:27;2117:250::o;2372:271::-;2414:3;2452:5;2446:12;2479:6;2474:3;2467:19;2495:76;2564:6;2557:4;2552:3;2548:14;2541:4;2534:5;2530:16;2495:76;:::i;:::-;2625:2;2604:15;-1:-1:-1;;2600:29:375;2591:39;;;;2632:4;2587:50;;2372:271;-1:-1:-1;;2372:271:375:o;2648:543::-;2702:3;2746:5;2740:12;2773:4;2768:3;2761:17;2799:47;2840:4;2835:3;2831:14;2817:12;2799:47;:::i;:::-;2787:59;;2924:1;2920;2915:3;2911:11;2907:19;2899:4;2892:5;2888:16;2882:23;2878:49;2871:4;2866:3;2862:14;2855:73;2976:4;2969:5;2965:16;2959:23;3024:3;3018:4;3014:14;3007:4;3002:3;2998:14;2991:38;3052:39;3086:4;3070:14;3052:39;:::i;:::-;3038:53;;;3154:4;3147:5;3143:16;3137:23;3130:31;3123:39;3116:4;3111:3;3107:14;3100:63;3179:6;3172:13;;;2648:543;;;;:::o;3196:855::-;3398:4;3427:2;3467;3456:9;3452:18;3497:2;3486:9;3479:21;3520:6;3555;3549:13;3586:6;3578;3571:22;3624:2;3613:9;3609:18;3602:25;;3686:2;3676:6;3673:1;3669:14;3658:9;3654:30;3650:39;3636:53;;3724:2;3716:6;3712:15;3745:1;3755:267;3769:6;3766:1;3763:13;3755:267;;;3862:2;3858:7;3846:9;3838:6;3834:22;3830:36;3825:3;3818:49;3890:52;3935:6;3926;3920:13;3890:52;:::i;:::-;3880:62;-1:-1:-1;4000:12:375;;;;3965:15;;;;3791:1;3784:9;3755:267;;;-1:-1:-1;4039:6:375;;3196:855;-1:-1:-1;;;;;;;3196:855:375:o;4056:127::-;4117:10;4112:3;4108:20;4105:1;4098:31;4148:4;4145:1;4138:15;4172:4;4169:1;4162:15;4188:275;4259:2;4253:9;4324:2;4305:13;;-1:-1:-1;;4301:27:375;4289:40;;-1:-1:-1;;;;;4344:34:375;;4380:22;;;4341:62;4338:88;;;4406:18;;:::i;:::-;4442:2;4435:22;4188:275;;-1:-1:-1;4188:275:375:o;4468:183::-;4528:4;-1:-1:-1;;;;;4553:6:375;4550:30;4547:56;;;4583:18;;:::i;:::-;-1:-1:-1;4628:1:375;4624:14;4640:4;4620:25;;4468:183::o;4656:966::-;4740:6;4771:2;4814;4802:9;4793:7;4789:23;4785:32;4782:52;;;4830:1;4827;4820:12;4782:52;4870:9;4857:23;-1:-1:-1;;;;;4895:6:375;4892:30;4889:50;;;4935:1;4932;4925:12;4889:50;4958:22;;5011:4;5003:13;;4999:27;-1:-1:-1;4989:55:375;;5040:1;5037;5030:12;4989:55;5076:2;5063:16;5099:60;5115:43;5155:2;5115:43;:::i;:::-;5099:60;:::i;:::-;5193:15;;;5275:1;5271:10;;;;5263:19;;5259:28;;;5224:12;;;;5299:19;;;5296:39;;;5331:1;5328;5321:12;5296:39;5355:11;;;;5375:217;5391:6;5386:3;5383:15;5375:217;;;5471:3;5458:17;5488:31;5513:5;5488:31;:::i;:::-;5532:18;;5408:12;;;;5570;;;;5375:217;;;5611:5;4656:966;-1:-1:-1;;;;;;;4656:966:375:o;5627:411::-;5698:6;5706;5759:2;5747:9;5738:7;5734:23;5730:32;5727:52;;;5775:1;5772;5765:12;5727:52;5815:9;5802:23;-1:-1:-1;;;;;5840:6:375;5837:30;5834:50;;;5880:1;5877;5870:12;5834:50;5919:59;5970:7;5961:6;5950:9;5946:22;5919:59;:::i;:::-;5997:8;;5893:85;;-1:-1:-1;5627:411:375;-1:-1:-1;;;;5627:411:375:o;6043:1167::-;6253:4;6282:2;6322;6311:9;6307:18;6352:2;6341:9;6334:21;6375:6;6410;6404:13;6441:6;6433;6426:22;6467:2;6457:12;;6500:2;6489:9;6485:18;6478:25;;6562:2;6552:6;6549:1;6545:14;6534:9;6530:30;6526:39;6600:2;6592:6;6588:15;6621:1;6631:550;6645:6;6642:1;6639:13;6631:550;;;6710:22;;;-1:-1:-1;;6706:36:375;6694:49;;6766:13;;6812:9;;6834:18;;;6879:48;6911:15;;;6812:9;6879:48;:::i;:::-;6968:11;;;6962:18;7017:19;;;7000:15;;;6993:44;6962:18;6865:62;-1:-1:-1;7060:41:375;6865:62;6962:18;7060:41;:::i;:::-;7159:12;;;;7050:51;-1:-1:-1;;;7124:15:375;;;;6667:1;6660:9;6631:550;;;-1:-1:-1;7198:6:375;;6043:1167;-1:-1:-1;;;;;;;;6043:1167:375:o;7215:272::-;7404:2;7393:9;7386:21;7367:4;7424:57;7477:2;7466:9;7462:18;7454:6;7424:57;:::i;7700:127::-;7761:10;7756:3;7752:20;7749:1;7742:31;7792:4;7789:1;7782:15;7816:4;7813:1;7806:15;7832:127;7893:10;7888:3;7884:20;7881:1;7874:31;7924:4;7921:1;7914:15;7948:4;7945:1;7938:15;7964:125;8029:9;;;8050:10;;;8047:36;;;8063:18;;:::i;8094:277::-;8161:6;8214:2;8202:9;8193:7;8189:23;8185:32;8182:52;;;8230:1;8227;8220:12;8182:52;8262:9;8256:16;8315:5;8308:13;8301:21;8294:5;8291:32;8281:60;;8337:1;8334;8327:12;8376:391;8452:5;-1:-1:-1;;;;;8478:6:375;8475:30;8472:56;;;8508:18;;:::i;:::-;8546:57;8591:2;8570:15;;-1:-1:-1;;8566:29:375;8597:4;8562:40;8546:57;:::i;:::-;8537:66;;8626:6;8619:5;8612:21;8666:3;8657:6;8652:3;8648:16;8645:25;8642:45;;;8683:1;8680;8673:12;8642:45;8696:65;8754:6;8747:4;8740:5;8736:16;8731:3;8696:65;:::i;8772:459::-;8852:6;8905:2;8893:9;8884:7;8880:23;8876:32;8873:52;;;8921:1;8918;8911:12;8873:52;8954:9;8948:16;-1:-1:-1;;;;;8979:6:375;8976:30;8973:50;;;9019:1;9016;9009:12;8973:50;9042:22;;9095:4;9087:13;;9083:27;-1:-1:-1;9073:55:375;;9124:1;9121;9114:12;9073:55;9147:78;9217:7;9212:2;9206:9;9201:2;9197;9193:11;9147:78;:::i;:::-;9137:88;8772:459;-1:-1:-1;;;;8772:459:375:o;9881:135::-;9920:3;9941:17;;;9938:43;;9961:18;;:::i;:::-;-1:-1:-1;10008:1:375;9997:13;;9881:135::o;10021:251::-;10091:6;10144:2;10132:9;10123:7;10119:23;10115:32;10112:52;;;10160:1;10157;10150:12;10112:52;10192:9;10186:16;10211:31;10236:5;10211:31;:::i;10277:273::-;10462:6;10454;10449:3;10436:33;10418:3;10488:16;;10513:13;;;10488:16;10277:273;-1:-1:-1;10277:273:375:o;10555:297::-;10673:12;;10720:4;10709:16;;;10703:23;;10673:12;10738:16;;10735:111;;;-1:-1:-1;;10812:4:375;10808:17;;;;10805:1;10801:25;10797:38;10786:50;;10555:297;-1:-1:-1;10555:297:375:o;11064:801::-;11262:4;11310:2;11299:9;11295:18;11340:6;11329:9;11322:25;11366:2;11404;11399;11388:9;11384:18;11377:30;11427:6;11462;11456:13;11493:6;11485;11478:22;11531:3;11520:9;11516:19;11509:26;;11570:2;11562:6;11558:15;11544:29;;11591:1;11601:195;11615:6;11612:1;11609:13;11601:195;;;11680:13;;-1:-1:-1;;;;;11676:39:375;11664:52;;11771:15;;;;11736:12;;;;11712:1;11630:9;11601:195;;;11605:3;;11813;11805:11;;;;;11852:6;11847:2;11836:9;11832:18;11825:34;11064:801;;;;;;:::o;11870:380::-;11949:1;11945:12;;;;11992;;;12013:61;;12067:4;12059:6;12055:17;12045:27;;12013:61;12120:2;12112:6;12109:14;12089:18;12086:38;12083:161;;12166:10;12161:3;12157:20;12154:1;12147:31;12201:4;12198:1;12191:15;12229:4;12226:1;12219:15;12255:956;12350:6;12381:2;12424;12412:9;12403:7;12399:23;12395:32;12392:52;;;12440:1;12437;12430:12;12392:52;12473:9;12467:16;-1:-1:-1;;;;;12498:6:375;12495:30;12492:50;;;12538:1;12535;12528:12;12492:50;12561:22;;12614:4;12606:13;;12602:27;-1:-1:-1;12592:55:375;;12643:1;12640;12633:12;12592:55;12672:2;12666:9;12695:60;12711:43;12751:2;12711:43;:::i;12695:60::-;12789:15;;;12871:1;12867:10;;;;12859:19;;12855:28;;;12820:12;;;;12895:19;;;12892:39;;;12927:1;12924;12917:12;12892:39;12951:11;;;;12971:210;12987:6;12982:3;12979:15;12971:210;;;13060:3;13054:10;13077:31;13102:5;13077:31;:::i;:::-;13121:18;;13004:12;;;;13159;;;;12971:210;;13216:128;13283:9;;;13304:11;;;13301:37;;;13318:18;;:::i;13349:127::-;13410:10;13405:3;13401:20;13398:1;13391:31;13441:4;13438:1;13431:15;13465:4;13462:1;13455:15","linkReferences":{}},"methodIdentifiers":{"addEntitlementModule(address)":"070b9c3f","addImmutableEntitlements(address[])":"8bfc820f","getEntitlement(address)":"fba4ff9d","getEntitlementDataByPermission(string)":"db0a69a8","getEntitlements()":"487dc38c","isEntitledToChannel(bytes32,address,string)":"367287e3","isEntitledToSpace(address,string)":"20759f9e","removeEntitlementModule(address)":"be24138d"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ApprovalCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BalanceQueryForZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__AlreadyBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Banning__CannotBanSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__NotBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC5643__DurationZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC5643__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC5643__NotApprovedOrOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC5643__SubscriptionNotRenewable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__ValueAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementsService__EntitlementAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementsService__EntitlementDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementsService__ImmutableEntitlement\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementsService__InvalidEntitlementAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementsService__InvalidEntitlementInterface\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintERC2309QuantityExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintZeroQuantity\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnershipNotInitializedForExtraData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__Paused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__EntitlementAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__EntitlementDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__InvalidEntitlementAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__InvalidPermission\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__PermissionAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__PermissionDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__RoleDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFromIncorrectOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC721ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"URIQueryForNonexistentToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"toTokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"ConsecutiveTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"entitlement\",\"type\":\"address\"}],\"name\":\"EntitlementModuleAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"entitlement\",\"type\":\"address\"}],\"name\":\"EntitlementModuleRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"RoleCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remover\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"RoleRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"updater\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"RoleUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"expiration\",\"type\":\"uint64\"}],\"name\":\"SubscriptionUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Unbanned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"entitlement\",\"type\":\"address\"}],\"name\":\"addEntitlementModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"entitlements\",\"type\":\"address[]\"}],\"name\":\"addImmutableEntitlements\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"entitlement\",\"type\":\"address\"}],\"name\":\"getEntitlement\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"moduleAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"moduleType\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isImmutable\",\"type\":\"bool\"}],\"internalType\":\"struct IEntitlementsManagerBase.Entitlement\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"permission\",\"type\":\"string\"}],\"name\":\"getEntitlementDataByPermission\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"entitlementType\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"entitlementData\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntitlementsManager.EntitlementData[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEntitlements\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"moduleAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"moduleType\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isImmutable\",\"type\":\"bool\"}],\"internalType\":\"struct IEntitlementsManagerBase.Entitlement[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"permission\",\"type\":\"string\"}],\"name\":\"isEntitledToChannel\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"permission\",\"type\":\"string\"}],\"name\":\"isEntitledToSpace\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"entitlement\",\"type\":\"address\"}],\"name\":\"removeEntitlementModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"ConsecutiveTransfer(uint256,uint256,address,address)\":{\"details\":\"Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, as defined in the [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. See {_mintERC2309} for more details.\"},\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"},\"SubscriptionUpdate(uint256,uint64)\":{\"details\":\"When a subscription is canceled, the expiration value should also be 0.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"addEntitlementModule(address)\":{\"params\":{\"entitlement\":\"The entitlement to add\"}},\"addImmutableEntitlements(address[])\":{\"params\":{\"entitlements\":\"The entitlements to add\"}},\"getEntitlement(address)\":{\"params\":{\"entitlement\":\"The entitlement to get\"},\"returns\":{\"_0\":\"The entitlement module address\"}},\"getEntitlements()\":{\"returns\":{\"_0\":\"The entitlement modules\"}},\"isEntitledToChannel(bytes32,address,string)\":{\"params\":{\"channelId\":\"The channel to check\",\"permission\":\"The permission to check\",\"user\":\"The user to check\"},\"returns\":{\"_0\":\"True if the user is entitled to the permission, false otherwise\"}},\"isEntitledToSpace(address,string)\":{\"params\":{\"permission\":\"The permission to check\",\"user\":\"The user to check\"},\"returns\":{\"_0\":\"True if the user is entitled to the permission, false otherwise\"}},\"removeEntitlementModule(address)\":{\"params\":{\"entitlement\":\"The entitlement to remove\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ApprovalCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"ApprovalQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"BalanceQueryForZeroAddress()\":[{\"notice\":\"Cannot query the balance for the zero address.\"}],\"MintERC2309QuantityExceedsLimit()\":[{\"notice\":\"The `quantity` minted with ERC2309 exceeds the safety limit.\"}],\"MintToZeroAddress()\":[{\"notice\":\"Cannot mint to the zero address.\"}],\"MintZeroQuantity()\":[{\"notice\":\"The quantity of tokens minted must be more than zero.\"}],\"OwnerQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"OwnershipNotInitializedForExtraData()\":[{\"notice\":\"The `extraData` cannot be set on an unintialized ownership slot.\"}],\"TransferCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"TransferFromIncorrectOwner()\":[{\"notice\":\"The token must be owned by `from`.\"}],\"TransferToNonERC721ReceiverImplementer()\":[{\"notice\":\"Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"notice\":\"Cannot transfer to the zero address.\"}],\"URIQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}]},\"events\":{\"SubscriptionUpdate(uint256,uint64)\":{\"notice\":\"Emitted when a subscription expiration changes\"}},\"kind\":\"user\",\"methods\":{\"addEntitlementModule(address)\":{\"notice\":\"Adds an entitlement to the space\"},\"addImmutableEntitlements(address[])\":{\"notice\":\"Allows the space owner to add immutable entitlements to the space\"},\"getEntitlement(address)\":{\"notice\":\"Gets an entitlement from the space\"},\"getEntitlements()\":{\"notice\":\"Gets all entitlements from the space\"},\"isEntitledToChannel(bytes32,address,string)\":{\"notice\":\"Checks if a user is entitled to a permission in a channel\"},\"isEntitledToSpace(address,string)\":{\"notice\":\"Checks if a user is entitled to a permission in the space\"},\"removeEntitlementModule(address)\":{\"notice\":\"Removes an entitlement from the space\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/facets/entitlements/EntitlementsManager.sol\":\"EntitlementsManager\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol\":{\"keccak256\":\"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f\",\"dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol\":{\"keccak256\":\"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5\",\"dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol\":{\"keccak256\":\"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc\",\"dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf\"]},\"contracts/src/diamond/facets/pausable/IPausable.sol\":{\"keccak256\":\"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6\",\"dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM\"]},\"contracts/src/diamond/facets/pausable/PausableBase.sol\":{\"keccak256\":\"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c\",\"dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1\"]},\"contracts/src/diamond/facets/pausable/PausableStorage.sol\":{\"keccak256\":\"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b\",\"dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL\"]},\"contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol\":{\"keccak256\":\"0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714\",\"dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8\"]},\"contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol\":{\"keccak256\":\"0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7\",\"dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7\"]},\"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol\":{\"keccak256\":\"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f\",\"dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol\":{\"keccak256\":\"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa\",\"dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol\":{\"keccak256\":\"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c\",\"dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu\"]},\"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol\":{\"keccak256\":\"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e\",\"dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM\"]},\"contracts/src/factory/facets/wallet-link/IWalletLink.sol\":{\"keccak256\":\"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13\",\"dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR\"]},\"contracts/src/spaces/entitlements/IEntitlement.sol\":{\"keccak256\":\"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3\",\"dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf\"]},\"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol\":{\"keccak256\":\"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1\",\"dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97\"]},\"contracts/src/spaces/entitlements/user/IUserEntitlement.sol\":{\"keccak256\":\"0x96fef5ebaa7e9e79c77c887d9053ae06dc91cf1301f33db652e6ac811b3b5cc5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6cff649b95f65c9e3ecfa7dfa3b1c7b524ec7244eb5223c55674a4679eb8e7bf\",\"dweb:/ipfs/QmQy5sXRywRWB3aM58TCp5Xw5b258Y5PfDM8RasDznAPzA\"]},\"contracts/src/spaces/facets/Entitled.sol\":{\"keccak256\":\"0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7\",\"dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc\"]},\"contracts/src/spaces/facets/banning/BanningBase.sol\":{\"keccak256\":\"0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d\",\"dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN\"]},\"contracts/src/spaces/facets/banning/BanningStorage.sol\":{\"keccak256\":\"0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0\",\"dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1\"]},\"contracts/src/spaces/facets/banning/IBanning.sol\":{\"keccak256\":\"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419\",\"dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6\"]},\"contracts/src/spaces/facets/channels/ChannelService.sol\":{\"keccak256\":\"0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9\",\"dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi\"]},\"contracts/src/spaces/facets/channels/ChannelStorage.sol\":{\"keccak256\":\"0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7\",\"dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS\"]},\"contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol\":{\"keccak256\":\"0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5\",\"dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9\"]},\"contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol\":{\"keccak256\":\"0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07\",\"dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek\"]},\"contracts/src/spaces/facets/entitlements/EntitlementsManager.sol\":{\"keccak256\":\"0x5121b9ebb57a7c98594a52360044b5a5105d3ffbc86d717e25f8e5957f6b221a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dd65322faa757c44c93eeb7dd68fc208d11b4a2068d8c1241d657d447d98be92\",\"dweb:/ipfs/Qmeu61gEnz8o26AwnpWnTKhoM2mBDygyimYpbuSjDbsDyb\"]},\"contracts/src/spaces/facets/entitlements/EntitlementsManagerBase.sol\":{\"keccak256\":\"0x043ba820a71407d23bb2f14f4809f8c6024c90de44e403130a0e3c2998b53cd6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a161f6aea0bf6796f5b87abe51192796fe4926515ffa927aa3bd3c01d657b951\",\"dweb:/ipfs/QmTZF7rCKaCQ4YRdGSsm1f6T8HCSX2KPzcEFqpvkF3riMi\"]},\"contracts/src/spaces/facets/entitlements/EntitlementsManagerService.sol\":{\"keccak256\":\"0x6f40f5b41ad702ea55bf10f987b3e2b6d02ac527a66be523f06f025cead1867d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://da2012c616b833c5b491735c230be707e4f9b7657b3a71d7bdf52e7c2ba128b9\",\"dweb:/ipfs/Qme4864V46rozVDRWtfYqtpyzE1SzBnqYQQf3iD2rrqiPg\"]},\"contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol\":{\"keccak256\":\"0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583\",\"dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK\"]},\"contracts/src/spaces/facets/entitlements/IEntitlementsManager.sol\":{\"keccak256\":\"0x1c3cff6f7a35610df492abc39a62ba704e408d43477ba2e34833197c2956e9d3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c5d5f08c5bc196e6166678b39d415da12c285d9bee3584d5e200bbf0c5ea911d\",\"dweb:/ipfs/QmdYkU6kzHFw7KFYAdvxiwHK7hWCrz3E3pwiCjWZ97PVGx\"]},\"contracts/src/spaces/facets/membership/MembershipStorage.sol\":{\"keccak256\":\"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee\",\"dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5\"]},\"contracts/src/spaces/facets/roles/IRoles.sol\":{\"keccak256\":\"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8\",\"dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N\"]},\"contracts/src/spaces/facets/roles/RolesBase.sol\":{\"keccak256\":\"0x2ef137dec4a5390009fd931e34fdbb4a742c96b68b40f5c152cec8cf2809ed6f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3cb29b4a780742a30ba3af5719f77a4a65ea55ebbdc3ccd9c93c86573f20c7df\",\"dweb:/ipfs/QmdvPJydLCcEwCB3xk5VpET8X2GfrxC3NBUD5G6C8a9aW8\"]},\"contracts/src/spaces/facets/roles/RolesStorage.sol\":{\"keccak256\":\"0x40f288a613e35cbc02aceb1d23f89af888f65538853f61cc1fcd25901b9bc4af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://396b5e157c9a29adc94edc5d234f416a44e6e7c4588b1aaa0587bb04018705e9\",\"dweb:/ipfs/QmWDCQz555WbvZw7XxfkybE5dPfouc6rKxU5Zu1Gsuz1Zr\"]},\"contracts/src/utils/StringSet.sol\":{\"keccak256\":\"0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6\",\"dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK\"]},\"contracts/src/utils/Validator.sol\":{\"keccak256\":\"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64\",\"dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72\"]},\"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"ApprovalCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"ApprovalQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"BalanceQueryForZeroAddress"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__AlreadyBanned"},{"inputs":[],"type":"error","name":"Banning__CannotBanSelf"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__InvalidTokenId"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__NotBanned"},{"inputs":[],"type":"error","name":"ERC5643__DurationZero"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC5643__InvalidTokenId"},{"inputs":[],"type":"error","name":"ERC5643__NotApprovedOrOwner"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC5643__SubscriptionNotRenewable"},{"inputs":[],"type":"error","name":"Entitlement__InvalidValue"},{"inputs":[],"type":"error","name":"Entitlement__NotAllowed"},{"inputs":[],"type":"error","name":"Entitlement__NotMember"},{"inputs":[],"type":"error","name":"Entitlement__ValueAlreadyExists"},{"inputs":[],"type":"error","name":"EntitlementsService__EntitlementAlreadyExists"},{"inputs":[],"type":"error","name":"EntitlementsService__EntitlementDoesNotExist"},{"inputs":[],"type":"error","name":"EntitlementsService__ImmutableEntitlement"},{"inputs":[],"type":"error","name":"EntitlementsService__InvalidEntitlementAddress"},{"inputs":[],"type":"error","name":"EntitlementsService__InvalidEntitlementInterface"},{"inputs":[],"type":"error","name":"MintERC2309QuantityExceedsLimit"},{"inputs":[],"type":"error","name":"MintToZeroAddress"},{"inputs":[],"type":"error","name":"MintZeroQuantity"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[],"type":"error","name":"OwnerQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"OwnershipNotInitializedForExtraData"},{"inputs":[],"type":"error","name":"Pausable__NotPaused"},{"inputs":[],"type":"error","name":"Pausable__Paused"},{"inputs":[],"type":"error","name":"Roles__EntitlementAlreadyExists"},{"inputs":[],"type":"error","name":"Roles__EntitlementDoesNotExist"},{"inputs":[],"type":"error","name":"Roles__InvalidEntitlementAddress"},{"inputs":[],"type":"error","name":"Roles__InvalidPermission"},{"inputs":[],"type":"error","name":"Roles__PermissionAlreadyExists"},{"inputs":[],"type":"error","name":"Roles__PermissionDoesNotExist"},{"inputs":[],"type":"error","name":"Roles__RoleDoesNotExist"},{"inputs":[],"type":"error","name":"TransferCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"TransferFromIncorrectOwner"},{"inputs":[],"type":"error","name":"TransferToNonERC721ReceiverImplementer"},{"inputs":[],"type":"error","name":"TransferToZeroAddress"},{"inputs":[],"type":"error","name":"URIQueryForNonexistentToken"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"approved","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bool","name":"approved","type":"bool","indexed":false}],"type":"event","name":"ApprovalForAll","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Banned","anonymous":false},{"inputs":[{"internalType":"uint256","name":"fromTokenId","type":"uint256","indexed":true},{"internalType":"uint256","name":"toTokenId","type":"uint256","indexed":false},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true}],"type":"event","name":"ConsecutiveTransfer","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"address","name":"entitlement","type":"address","indexed":false}],"type":"event","name":"EntitlementModuleAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"address","name":"entitlement","type":"address","indexed":false}],"type":"event","name":"EntitlementModuleRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"address","name":"creator","type":"address","indexed":true},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":true}],"type":"event","name":"RoleCreated","anonymous":false},{"inputs":[{"internalType":"address","name":"remover","type":"address","indexed":true},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":true}],"type":"event","name":"RoleRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"updater","type":"address","indexed":true},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":true}],"type":"event","name":"RoleUpdated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true},{"internalType":"uint64","name":"expiration","type":"uint64","indexed":false}],"type":"event","name":"SubscriptionUpdate","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Unbanned","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[{"internalType":"address","name":"entitlement","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"addEntitlementModule"},{"inputs":[{"internalType":"address[]","name":"entitlements","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"addImmutableEntitlements"},{"inputs":[{"internalType":"address","name":"entitlement","type":"address"}],"stateMutability":"view","type":"function","name":"getEntitlement","outputs":[{"internalType":"struct IEntitlementsManagerBase.Entitlement","name":"","type":"tuple","components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"moduleAddress","type":"address"},{"internalType":"string","name":"moduleType","type":"string"},{"internalType":"bool","name":"isImmutable","type":"bool"}]}]},{"inputs":[{"internalType":"string","name":"permission","type":"string"}],"stateMutability":"view","type":"function","name":"getEntitlementDataByPermission","outputs":[{"internalType":"struct IEntitlementsManager.EntitlementData[]","name":"","type":"tuple[]","components":[{"internalType":"string","name":"entitlementType","type":"string"},{"internalType":"bytes","name":"entitlementData","type":"bytes"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getEntitlements","outputs":[{"internalType":"struct IEntitlementsManagerBase.Entitlement[]","name":"","type":"tuple[]","components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"moduleAddress","type":"address"},{"internalType":"string","name":"moduleType","type":"string"},{"internalType":"bool","name":"isImmutable","type":"bool"}]}]},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"},{"internalType":"address","name":"user","type":"address"},{"internalType":"string","name":"permission","type":"string"}],"stateMutability":"view","type":"function","name":"isEntitledToChannel","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"string","name":"permission","type":"string"}],"stateMutability":"view","type":"function","name":"isEntitledToSpace","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"entitlement","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeEntitlementModule"}],"devdoc":{"kind":"dev","methods":{"addEntitlementModule(address)":{"params":{"entitlement":"The entitlement to add"}},"addImmutableEntitlements(address[])":{"params":{"entitlements":"The entitlements to add"}},"getEntitlement(address)":{"params":{"entitlement":"The entitlement to get"},"returns":{"_0":"The entitlement module address"}},"getEntitlements()":{"returns":{"_0":"The entitlement modules"}},"isEntitledToChannel(bytes32,address,string)":{"params":{"channelId":"The channel to check","permission":"The permission to check","user":"The user to check"},"returns":{"_0":"True if the user is entitled to the permission, false otherwise"}},"isEntitledToSpace(address,string)":{"params":{"permission":"The permission to check","user":"The user to check"},"returns":{"_0":"True if the user is entitled to the permission, false otherwise"}},"removeEntitlementModule(address)":{"params":{"entitlement":"The entitlement to remove"}}},"version":1},"userdoc":{"kind":"user","methods":{"addEntitlementModule(address)":{"notice":"Adds an entitlement to the space"},"addImmutableEntitlements(address[])":{"notice":"Allows the space owner to add immutable entitlements to the space"},"getEntitlement(address)":{"notice":"Gets an entitlement from the space"},"getEntitlements()":{"notice":"Gets all entitlements from the space"},"isEntitledToChannel(bytes32,address,string)":{"notice":"Checks if a user is entitled to a permission in a channel"},"isEntitledToSpace(address,string)":{"notice":"Checks if a user is entitled to a permission in the space"},"removeEntitlementModule(address)":{"notice":"Removes an entitlement from the space"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/facets/entitlements/EntitlementsManager.sol":"EntitlementsManager"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol":{"keccak256":"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d","urls":["bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f","dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol":{"keccak256":"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a","urls":["bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5","dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol":{"keccak256":"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0","urls":["bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc","dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/IPausable.sol":{"keccak256":"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261","urls":["bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6","dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableBase.sol":{"keccak256":"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438","urls":["bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c","dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableStorage.sol":{"keccak256":"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07","urls":["bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b","dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol":{"keccak256":"0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3","urls":["bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714","dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol":{"keccak256":"0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e","urls":["bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7","dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol":{"keccak256":"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218","urls":["bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f","dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol":{"keccak256":"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334","urls":["bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa","dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol":{"keccak256":"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1","urls":["bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c","dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9","urls":["bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e","dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM"],"license":"Apache-2.0"},"contracts/src/factory/facets/wallet-link/IWalletLink.sol":{"keccak256":"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b","urls":["bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13","dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/IEntitlement.sol":{"keccak256":"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca","urls":["bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3","dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol":{"keccak256":"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf","urls":["bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1","dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97"],"license":"MIT"},"contracts/src/spaces/entitlements/user/IUserEntitlement.sol":{"keccak256":"0x96fef5ebaa7e9e79c77c887d9053ae06dc91cf1301f33db652e6ac811b3b5cc5","urls":["bzz-raw://6cff649b95f65c9e3ecfa7dfa3b1c7b524ec7244eb5223c55674a4679eb8e7bf","dweb:/ipfs/QmQy5sXRywRWB3aM58TCp5Xw5b258Y5PfDM8RasDznAPzA"],"license":"Apache-2.0"},"contracts/src/spaces/facets/Entitled.sol":{"keccak256":"0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c","urls":["bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7","dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/BanningBase.sol":{"keccak256":"0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270","urls":["bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d","dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/BanningStorage.sol":{"keccak256":"0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492","urls":["bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0","dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/IBanning.sol":{"keccak256":"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505","urls":["bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419","dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/ChannelService.sol":{"keccak256":"0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7","urls":["bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9","dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/ChannelStorage.sol":{"keccak256":"0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f","urls":["bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7","dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS"],"license":"Apache-2.0"},"contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol":{"keccak256":"0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2","urls":["bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5","dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9"],"license":"Apache-2.0"},"contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol":{"keccak256":"0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef","urls":["bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07","dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/EntitlementsManager.sol":{"keccak256":"0x5121b9ebb57a7c98594a52360044b5a5105d3ffbc86d717e25f8e5957f6b221a","urls":["bzz-raw://dd65322faa757c44c93eeb7dd68fc208d11b4a2068d8c1241d657d447d98be92","dweb:/ipfs/Qmeu61gEnz8o26AwnpWnTKhoM2mBDygyimYpbuSjDbsDyb"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/EntitlementsManagerBase.sol":{"keccak256":"0x043ba820a71407d23bb2f14f4809f8c6024c90de44e403130a0e3c2998b53cd6","urls":["bzz-raw://a161f6aea0bf6796f5b87abe51192796fe4926515ffa927aa3bd3c01d657b951","dweb:/ipfs/QmTZF7rCKaCQ4YRdGSsm1f6T8HCSX2KPzcEFqpvkF3riMi"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/EntitlementsManagerService.sol":{"keccak256":"0x6f40f5b41ad702ea55bf10f987b3e2b6d02ac527a66be523f06f025cead1867d","urls":["bzz-raw://da2012c616b833c5b491735c230be707e4f9b7657b3a71d7bdf52e7c2ba128b9","dweb:/ipfs/Qme4864V46rozVDRWtfYqtpyzE1SzBnqYQQf3iD2rrqiPg"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol":{"keccak256":"0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8","urls":["bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583","dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/IEntitlementsManager.sol":{"keccak256":"0x1c3cff6f7a35610df492abc39a62ba704e408d43477ba2e34833197c2956e9d3","urls":["bzz-raw://c5d5f08c5bc196e6166678b39d415da12c285d9bee3584d5e200bbf0c5ea911d","dweb:/ipfs/QmdYkU6kzHFw7KFYAdvxiwHK7hWCrz3E3pwiCjWZ97PVGx"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/MembershipStorage.sol":{"keccak256":"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3","urls":["bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee","dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/IRoles.sol":{"keccak256":"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d","urls":["bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8","dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/RolesBase.sol":{"keccak256":"0x2ef137dec4a5390009fd931e34fdbb4a742c96b68b40f5c152cec8cf2809ed6f","urls":["bzz-raw://3cb29b4a780742a30ba3af5719f77a4a65ea55ebbdc3ccd9c93c86573f20c7df","dweb:/ipfs/QmdvPJydLCcEwCB3xk5VpET8X2GfrxC3NBUD5G6C8a9aW8"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/RolesStorage.sol":{"keccak256":"0x40f288a613e35cbc02aceb1d23f89af888f65538853f61cc1fcd25901b9bc4af","urls":["bzz-raw://396b5e157c9a29adc94edc5d234f416a44e6e7c4588b1aaa0587bb04018705e9","dweb:/ipfs/QmWDCQz555WbvZw7XxfkybE5dPfouc6rKxU5Zu1Gsuz1Zr"],"license":"Apache-2.0"},"contracts/src/utils/StringSet.sol":{"keccak256":"0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319","urls":["bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6","dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK"],"license":"Apache-2.0"},"contracts/src/utils/Validator.sol":{"keccak256":"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50","urls":["bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64","dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"keccak256":"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4","urls":["bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7","dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":172} \ No newline at end of file diff --git a/packages/generated/v3/abis/EntitlementsManager.metadata.json b/packages/generated/v3/abis/EntitlementsManager.metadata.json new file mode 100644 index 000000000..513be091f --- /dev/null +++ b/packages/generated/v3/abis/EntitlementsManager.metadata.json @@ -0,0 +1,1178 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "ApprovalQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "BalanceQueryForZeroAddress" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__AlreadyBanned" + }, + { + "inputs": [], + "type": "error", + "name": "Banning__CannotBanSelf" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__InvalidTokenId" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__NotBanned" + }, + { + "inputs": [], + "type": "error", + "name": "ERC5643__DurationZero" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC5643__InvalidTokenId" + }, + { + "inputs": [], + "type": "error", + "name": "ERC5643__NotApprovedOrOwner" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__InvalidValue" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotAllowed" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotMember" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__ValueAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementsService__EntitlementAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementsService__EntitlementDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementsService__ImmutableEntitlement" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementsService__InvalidEntitlementAddress" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementsService__InvalidEntitlementInterface" + }, + { + "inputs": [], + "type": "error", + "name": "MintERC2309QuantityExceedsLimit" + }, + { + "inputs": [], + "type": "error", + "name": "MintToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "MintZeroQuantity" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "OwnerQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "OwnershipNotInitializedForExtraData" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__NotPaused" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__Paused" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__EntitlementAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__EntitlementDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__InvalidEntitlementAddress" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__InvalidPermission" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__PermissionAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__PermissionDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__RoleDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "TransferCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "TransferFromIncorrectOwner" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "URIQueryForNonexistentToken" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "approved", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Approval", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "operator", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ApprovalForAll", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Banned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fromTokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint256", + "name": "toTokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConsecutiveTransfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "entitlement", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "EntitlementModuleAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "entitlement", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "EntitlementModuleRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Paused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "creator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RoleCreated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "remover", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RoleRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "updater", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RoleUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint64", + "name": "expiration", + "type": "uint64", + "indexed": false + } + ], + "type": "event", + "name": "SubscriptionUpdate", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Transfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Unbanned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Unpaused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "entitlement", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "addEntitlementModule" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "entitlements", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "addImmutableEntitlements" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "entitlement", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getEntitlement", + "outputs": [ + { + "internalType": "struct IEntitlementsManagerBase.Entitlement", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "address", + "name": "moduleAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "moduleType", + "type": "string" + }, + { + "internalType": "bool", + "name": "isImmutable", + "type": "bool" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "string", + "name": "permission", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getEntitlementDataByPermission", + "outputs": [ + { + "internalType": "struct IEntitlementsManager.EntitlementData[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "string", + "name": "entitlementType", + "type": "string" + }, + { + "internalType": "bytes", + "name": "entitlementData", + "type": "bytes" + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getEntitlements", + "outputs": [ + { + "internalType": "struct IEntitlementsManagerBase.Entitlement[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "address", + "name": "moduleAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "moduleType", + "type": "string" + }, + { + "internalType": "bool", + "name": "isImmutable", + "type": "bool" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "string", + "name": "permission", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isEntitledToChannel", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "string", + "name": "permission", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isEntitledToSpace", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "entitlement", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeEntitlementModule" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "addEntitlementModule(address)": { + "params": { + "entitlement": "The entitlement to add" + } + }, + "addImmutableEntitlements(address[])": { + "params": { + "entitlements": "The entitlements to add" + } + }, + "getEntitlement(address)": { + "params": { + "entitlement": "The entitlement to get" + }, + "returns": { + "_0": "The entitlement module address" + } + }, + "getEntitlements()": { + "returns": { + "_0": "The entitlement modules" + } + }, + "isEntitledToChannel(bytes32,address,string)": { + "params": { + "channelId": "The channel to check", + "permission": "The permission to check", + "user": "The user to check" + }, + "returns": { + "_0": "True if the user is entitled to the permission, false otherwise" + } + }, + "isEntitledToSpace(address,string)": { + "params": { + "permission": "The permission to check", + "user": "The user to check" + }, + "returns": { + "_0": "True if the user is entitled to the permission, false otherwise" + } + }, + "removeEntitlementModule(address)": { + "params": { + "entitlement": "The entitlement to remove" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "addEntitlementModule(address)": { + "notice": "Adds an entitlement to the space" + }, + "addImmutableEntitlements(address[])": { + "notice": "Allows the space owner to add immutable entitlements to the space" + }, + "getEntitlement(address)": { + "notice": "Gets an entitlement from the space" + }, + "getEntitlements()": { + "notice": "Gets all entitlements from the space" + }, + "isEntitledToChannel(bytes32,address,string)": { + "notice": "Checks if a user is entitled to a permission in a channel" + }, + "isEntitledToSpace(address,string)": { + "notice": "Checks if a user is entitled to a permission in the space" + }, + "removeEntitlementModule(address)": { + "notice": "Removes an entitlement from the space" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/facets/entitlements/EntitlementsManager.sol": "EntitlementsManager" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol": { + "keccak256": "0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d", + "urls": [ + "bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f", + "dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol": { + "keccak256": "0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a", + "urls": [ + "bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5", + "dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol": { + "keccak256": "0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0", + "urls": [ + "bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc", + "dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/IPausable.sol": { + "keccak256": "0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261", + "urls": [ + "bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6", + "dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableBase.sol": { + "keccak256": "0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438", + "urls": [ + "bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c", + "dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableStorage.sol": { + "keccak256": "0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07", + "urls": [ + "bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b", + "dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol": { + "keccak256": "0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3", + "urls": [ + "bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714", + "dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol": { + "keccak256": "0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e", + "urls": [ + "bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7", + "dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/IERC5643.sol": { + "keccak256": "0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218", + "urls": [ + "bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f", + "dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol": { + "keccak256": "0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334", + "urls": [ + "bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa", + "dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol": { + "keccak256": "0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1", + "urls": [ + "bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c", + "dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/IERC721A.sol": { + "keccak256": "0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9", + "urls": [ + "bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e", + "dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/wallet-link/IWalletLink.sol": { + "keccak256": "0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b", + "urls": [ + "bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13", + "dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/IEntitlement.sol": { + "keccak256": "0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca", + "urls": [ + "bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3", + "dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol": { + "keccak256": "0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf", + "urls": [ + "bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1", + "dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97" + ], + "license": "MIT" + }, + "contracts/src/spaces/entitlements/user/IUserEntitlement.sol": { + "keccak256": "0x96fef5ebaa7e9e79c77c887d9053ae06dc91cf1301f33db652e6ac811b3b5cc5", + "urls": [ + "bzz-raw://6cff649b95f65c9e3ecfa7dfa3b1c7b524ec7244eb5223c55674a4679eb8e7bf", + "dweb:/ipfs/QmQy5sXRywRWB3aM58TCp5Xw5b258Y5PfDM8RasDznAPzA" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/Entitled.sol": { + "keccak256": "0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c", + "urls": [ + "bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7", + "dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/BanningBase.sol": { + "keccak256": "0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270", + "urls": [ + "bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d", + "dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/BanningStorage.sol": { + "keccak256": "0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492", + "urls": [ + "bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0", + "dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/IBanning.sol": { + "keccak256": "0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505", + "urls": [ + "bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419", + "dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/ChannelService.sol": { + "keccak256": "0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7", + "urls": [ + "bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9", + "dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/ChannelStorage.sol": { + "keccak256": "0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f", + "urls": [ + "bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7", + "dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol": { + "keccak256": "0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2", + "urls": [ + "bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5", + "dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol": { + "keccak256": "0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef", + "urls": [ + "bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07", + "dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/EntitlementsManager.sol": { + "keccak256": "0x5121b9ebb57a7c98594a52360044b5a5105d3ffbc86d717e25f8e5957f6b221a", + "urls": [ + "bzz-raw://dd65322faa757c44c93eeb7dd68fc208d11b4a2068d8c1241d657d447d98be92", + "dweb:/ipfs/Qmeu61gEnz8o26AwnpWnTKhoM2mBDygyimYpbuSjDbsDyb" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/EntitlementsManagerBase.sol": { + "keccak256": "0x043ba820a71407d23bb2f14f4809f8c6024c90de44e403130a0e3c2998b53cd6", + "urls": [ + "bzz-raw://a161f6aea0bf6796f5b87abe51192796fe4926515ffa927aa3bd3c01d657b951", + "dweb:/ipfs/QmTZF7rCKaCQ4YRdGSsm1f6T8HCSX2KPzcEFqpvkF3riMi" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/EntitlementsManagerService.sol": { + "keccak256": "0x6f40f5b41ad702ea55bf10f987b3e2b6d02ac527a66be523f06f025cead1867d", + "urls": [ + "bzz-raw://da2012c616b833c5b491735c230be707e4f9b7657b3a71d7bdf52e7c2ba128b9", + "dweb:/ipfs/Qme4864V46rozVDRWtfYqtpyzE1SzBnqYQQf3iD2rrqiPg" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol": { + "keccak256": "0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8", + "urls": [ + "bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583", + "dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/IEntitlementsManager.sol": { + "keccak256": "0x1c3cff6f7a35610df492abc39a62ba704e408d43477ba2e34833197c2956e9d3", + "urls": [ + "bzz-raw://c5d5f08c5bc196e6166678b39d415da12c285d9bee3584d5e200bbf0c5ea911d", + "dweb:/ipfs/QmdYkU6kzHFw7KFYAdvxiwHK7hWCrz3E3pwiCjWZ97PVGx" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/MembershipStorage.sol": { + "keccak256": "0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3", + "urls": [ + "bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee", + "dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/IRoles.sol": { + "keccak256": "0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d", + "urls": [ + "bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8", + "dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/RolesBase.sol": { + "keccak256": "0x2ef137dec4a5390009fd931e34fdbb4a742c96b68b40f5c152cec8cf2809ed6f", + "urls": [ + "bzz-raw://3cb29b4a780742a30ba3af5719f77a4a65ea55ebbdc3ccd9c93c86573f20c7df", + "dweb:/ipfs/QmdvPJydLCcEwCB3xk5VpET8X2GfrxC3NBUD5G6C8a9aW8" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/RolesStorage.sol": { + "keccak256": "0x40f288a613e35cbc02aceb1d23f89af888f65538853f61cc1fcd25901b9bc4af", + "urls": [ + "bzz-raw://396b5e157c9a29adc94edc5d234f416a44e6e7c4588b1aaa0587bb04018705e9", + "dweb:/ipfs/QmWDCQz555WbvZw7XxfkybE5dPfouc6rKxU5Zu1Gsuz1Zr" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/StringSet.sol": { + "keccak256": "0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319", + "urls": [ + "bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6", + "dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/Validator.sol": { + "keccak256": "0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50", + "urls": [ + "bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64", + "dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4", + "urls": [ + "bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7", + "dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/IBanning.abi.json b/packages/generated/v3/abis/IBanning.abi.json new file mode 100644 index 000000000..cdff8b414 --- /dev/null +++ b/packages/generated/v3/abis/IBanning.abi.json @@ -0,0 +1,136 @@ +[ + { + "type": "function", + "name": "ban", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "banned", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "unban", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/IBanning.abi.ts b/packages/generated/v3/abis/IBanning.abi.ts new file mode 100644 index 000000000..1ace53d43 --- /dev/null +++ b/packages/generated/v3/abis/IBanning.abi.ts @@ -0,0 +1,136 @@ +export default [ + { + "type": "function", + "name": "ban", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "banned", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "unban", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + } +] as const diff --git a/packages/generated/v3/abis/IBanning.bin b/packages/generated/v3/abis/IBanning.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/v3/abis/IBanning.json b/packages/generated/v3/abis/IBanning.json new file mode 100644 index 000000000..edeb4e68e --- /dev/null +++ b/packages/generated/v3/abis/IBanning.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"ban","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"banned","inputs":[],"outputs":[{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"isBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"unban","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Banned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unbanned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"Banning__AlreadyBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__CannotBanSelf","inputs":[]},{"type":"error","name":"Banning__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__NotBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"ban(uint256)":"6b6ece26","banned()":"158fba8f","isBanned(uint256)":"c57a9c56","unban(uint256)":"1519ff4c"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__AlreadyBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Banning__CannotBanSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__NotBanned\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Unbanned\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ban\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"banned\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"isBanned\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"unban\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/facets/banning/IBanning.sol\":\"IBanning\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/spaces/facets/banning/IBanning.sol\":{\"keccak256\":\"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419\",\"dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__AlreadyBanned"},{"inputs":[],"type":"error","name":"Banning__CannotBanSelf"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__InvalidTokenId"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__NotBanned"},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Banned","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Unbanned","anonymous":false},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"ban"},{"inputs":[],"stateMutability":"view","type":"function","name":"banned","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"isBanned","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"unban"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/facets/banning/IBanning.sol":"IBanning"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/spaces/facets/banning/IBanning.sol":{"keccak256":"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505","urls":["bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419","dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6"],"license":"Apache-2.0"}},"version":1},"id":196} \ No newline at end of file diff --git a/packages/generated/v3/abis/IBanning.metadata.json b/packages/generated/v3/abis/IBanning.metadata.json new file mode 100644 index 000000000..58b725256 --- /dev/null +++ b/packages/generated/v3/abis/IBanning.metadata.json @@ -0,0 +1,188 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__AlreadyBanned" + }, + { + "inputs": [], + "type": "error", + "name": "Banning__CannotBanSelf" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__InvalidTokenId" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__NotBanned" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Banned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Unbanned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "ban" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "banned", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isBanned", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "unban" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/facets/banning/IBanning.sol": "IBanning" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/spaces/facets/banning/IBanning.sol": { + "keccak256": "0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505", + "urls": [ + "bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419", + "dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/IBanningBase.abi.json b/packages/generated/v3/abis/IBanningBase.abi.json new file mode 100644 index 000000000..6419f38ac --- /dev/null +++ b/packages/generated/v3/abis/IBanningBase.abi.json @@ -0,0 +1,78 @@ +[ + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/IBanningBase.abi.ts b/packages/generated/v3/abis/IBanningBase.abi.ts new file mode 100644 index 000000000..4250368dc --- /dev/null +++ b/packages/generated/v3/abis/IBanningBase.abi.ts @@ -0,0 +1,78 @@ +export default [ + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + } +] as const diff --git a/packages/generated/v3/abis/IBanningBase.bin b/packages/generated/v3/abis/IBanningBase.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/v3/abis/IBanningBase.json b/packages/generated/v3/abis/IBanningBase.json new file mode 100644 index 000000000..60164e295 --- /dev/null +++ b/packages/generated/v3/abis/IBanningBase.json @@ -0,0 +1 @@ +{"abi":[{"type":"event","name":"Banned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unbanned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"Banning__AlreadyBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__CannotBanSelf","inputs":[]},{"type":"error","name":"Banning__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__NotBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__AlreadyBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Banning__CannotBanSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__NotBanned\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Unbanned\",\"type\":\"event\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/facets/banning/IBanning.sol\":\"IBanningBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/spaces/facets/banning/IBanning.sol\":{\"keccak256\":\"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419\",\"dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__AlreadyBanned"},{"inputs":[],"type":"error","name":"Banning__CannotBanSelf"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__InvalidTokenId"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__NotBanned"},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Banned","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Unbanned","anonymous":false}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/facets/banning/IBanning.sol":"IBanningBase"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/spaces/facets/banning/IBanning.sol":{"keccak256":"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505","urls":["bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419","dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6"],"license":"Apache-2.0"}},"version":1},"id":196} \ No newline at end of file diff --git a/packages/generated/v3/abis/IBanningBase.metadata.json b/packages/generated/v3/abis/IBanningBase.metadata.json new file mode 100644 index 000000000..fd38c3681 --- /dev/null +++ b/packages/generated/v3/abis/IBanningBase.metadata.json @@ -0,0 +1,132 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__AlreadyBanned" + }, + { + "inputs": [], + "type": "error", + "name": "Banning__CannotBanSelf" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__InvalidTokenId" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__NotBanned" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Banned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Unbanned", + "anonymous": false + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/facets/banning/IBanning.sol": "IBanningBase" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/spaces/facets/banning/IBanning.sol": { + "keccak256": "0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505", + "urls": [ + "bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419", + "dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/ICustomEntitlement.abi.json b/packages/generated/v3/abis/ICustomEntitlement.abi.json new file mode 100644 index 000000000..43ed6b85c --- /dev/null +++ b/packages/generated/v3/abis/ICustomEntitlement.abi.json @@ -0,0 +1,21 @@ +[ + { + "type": "function", + "name": "isEntitled", + "inputs": [ + { + "name": "user", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/ICustomEntitlement.abi.ts b/packages/generated/v3/abis/ICustomEntitlement.abi.ts new file mode 100644 index 000000000..52b8e1f42 --- /dev/null +++ b/packages/generated/v3/abis/ICustomEntitlement.abi.ts @@ -0,0 +1,21 @@ +export default [ + { + "type": "function", + "name": "isEntitled", + "inputs": [ + { + "name": "user", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + } +] as const diff --git a/packages/generated/v3/abis/ICustomEntitlement.bin b/packages/generated/v3/abis/ICustomEntitlement.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/v3/abis/ICustomEntitlement.json b/packages/generated/v3/abis/ICustomEntitlement.json new file mode 100644 index 000000000..385abac4b --- /dev/null +++ b/packages/generated/v3/abis/ICustomEntitlement.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"isEntitled","inputs":[{"name":"user","type":"address[]","internalType":"address[]"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"isEntitled(address[])":"ddc6e68e"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"user\",\"type\":\"address[]\"}],\"name\":\"isEntitled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"isEntitled(address[])\":{\"params\":{\"user\":\"address of the user to check\"},\"returns\":{\"_0\":\"whether the user is entitled to the permission\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isEntitled(address[])\":{\"notice\":\"checks whether a user is has a given permission for a channel or a space\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/entitlements/ICustomEntitlement.sol\":\"ICustomEntitlement\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/spaces/entitlements/ICustomEntitlement.sol\":{\"keccak256\":\"0xbb879f5fd547f6f93c898ae5d4fc5c6a738123ddac530b6a7267da9307f3e08d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://39e90fc649d84e0ccb48b067ea61d0a5564051d69b0f1dd59d13689625632e05\",\"dweb:/ipfs/QmQAB6ASqGYURyoQuPqf1SaahZtfnAEyr9me3cM3iCLT1K\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address[]","name":"user","type":"address[]"}],"stateMutability":"view","type":"function","name":"isEntitled","outputs":[{"internalType":"bool","name":"","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{"isEntitled(address[])":{"params":{"user":"address of the user to check"},"returns":{"_0":"whether the user is entitled to the permission"}}},"version":1},"userdoc":{"kind":"user","methods":{"isEntitled(address[])":{"notice":"checks whether a user is has a given permission for a channel or a space"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/entitlements/ICustomEntitlement.sol":"ICustomEntitlement"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/spaces/entitlements/ICustomEntitlement.sol":{"keccak256":"0xbb879f5fd547f6f93c898ae5d4fc5c6a738123ddac530b6a7267da9307f3e08d","urls":["bzz-raw://39e90fc649d84e0ccb48b067ea61d0a5564051d69b0f1dd59d13689625632e05","dweb:/ipfs/QmQAB6ASqGYURyoQuPqf1SaahZtfnAEyr9me3cM3iCLT1K"],"license":"Apache-2.0"}},"version":1},"id":185} \ No newline at end of file diff --git a/packages/generated/v3/abis/ICustomEntitlement.metadata.json b/packages/generated/v3/abis/ICustomEntitlement.metadata.json new file mode 100644 index 000000000..2fbb17d4b --- /dev/null +++ b/packages/generated/v3/abis/ICustomEntitlement.metadata.json @@ -0,0 +1,88 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address[]", + "name": "user", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isEntitled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "isEntitled(address[])": { + "params": { + "user": "address of the user to check" + }, + "returns": { + "_0": "whether the user is entitled to the permission" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "isEntitled(address[])": { + "notice": "checks whether a user is has a given permission for a channel or a space" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/entitlements/ICustomEntitlement.sol": "ICustomEntitlement" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/spaces/entitlements/ICustomEntitlement.sol": { + "keccak256": "0xbb879f5fd547f6f93c898ae5d4fc5c6a738123ddac530b6a7267da9307f3e08d", + "urls": [ + "bzz-raw://39e90fc649d84e0ccb48b067ea61d0a5564051d69b0f1dd59d13689625632e05", + "dweb:/ipfs/QmQAB6ASqGYURyoQuPqf1SaahZtfnAEyr9me3cM3iCLT1K" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/IERC721AQueryable.abi.json b/packages/generated/v3/abis/IERC721AQueryable.abi.json new file mode 100644 index 000000000..f01d3f780 --- /dev/null +++ b/packages/generated/v3/abis/IERC721AQueryable.abi.json @@ -0,0 +1,308 @@ +[ + { + "type": "function", + "name": "explicitOwnershipOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IERC721ABase.TokenOwnership", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "startTimestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "burned", + "type": "bool", + "internalType": "bool" + }, + { + "name": "extraData", + "type": "uint24", + "internalType": "uint24" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "explicitOwnershipsOf", + "inputs": [ + { + "name": "tokenIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IERC721ABase.TokenOwnership[]", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "startTimestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "burned", + "type": "bool", + "internalType": "bool" + }, + { + "name": "extraData", + "type": "uint24", + "internalType": "uint24" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokensOfOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokensOfOwnerIn", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "start", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "stop", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidQueryRange", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/IERC721AQueryable.abi.ts b/packages/generated/v3/abis/IERC721AQueryable.abi.ts new file mode 100644 index 000000000..ef2f22d68 --- /dev/null +++ b/packages/generated/v3/abis/IERC721AQueryable.abi.ts @@ -0,0 +1,308 @@ +export default [ + { + "type": "function", + "name": "explicitOwnershipOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IERC721ABase.TokenOwnership", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "startTimestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "burned", + "type": "bool", + "internalType": "bool" + }, + { + "name": "extraData", + "type": "uint24", + "internalType": "uint24" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "explicitOwnershipsOf", + "inputs": [ + { + "name": "tokenIds", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IERC721ABase.TokenOwnership[]", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "startTimestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "burned", + "type": "bool", + "internalType": "bool" + }, + { + "name": "extraData", + "type": "uint24", + "internalType": "uint24" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokensOfOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokensOfOwnerIn", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "start", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "stop", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidQueryRange", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/IERC721AQueryable.bin b/packages/generated/v3/abis/IERC721AQueryable.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/v3/abis/IERC721AQueryable.json b/packages/generated/v3/abis/IERC721AQueryable.json new file mode 100644 index 000000000..6222d153d --- /dev/null +++ b/packages/generated/v3/abis/IERC721AQueryable.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"explicitOwnershipOf","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IERC721ABase.TokenOwnership","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"startTimestamp","type":"uint64","internalType":"uint64"},{"name":"burned","type":"bool","internalType":"bool"},{"name":"extraData","type":"uint24","internalType":"uint24"}]}],"stateMutability":"view"},{"type":"function","name":"explicitOwnershipsOf","inputs":[{"name":"tokenIds","type":"uint256[]","internalType":"uint256[]"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IERC721ABase.TokenOwnership[]","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"startTimestamp","type":"uint64","internalType":"uint64"},{"name":"burned","type":"bool","internalType":"bool"},{"name":"extraData","type":"uint24","internalType":"uint24"}]}],"stateMutability":"view"},{"type":"function","name":"tokensOfOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"tokensOfOwnerIn","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"start","type":"uint256","internalType":"uint256"},{"name":"stop","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"ConsecutiveTransfer","inputs":[{"name":"fromTokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"toTokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"ApprovalCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"ApprovalQueryForNonexistentToken","inputs":[]},{"type":"error","name":"BalanceQueryForZeroAddress","inputs":[]},{"type":"error","name":"InvalidQueryRange","inputs":[]},{"type":"error","name":"MintERC2309QuantityExceedsLimit","inputs":[]},{"type":"error","name":"MintToZeroAddress","inputs":[]},{"type":"error","name":"MintZeroQuantity","inputs":[]},{"type":"error","name":"OwnerQueryForNonexistentToken","inputs":[]},{"type":"error","name":"OwnershipNotInitializedForExtraData","inputs":[]},{"type":"error","name":"TransferCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"TransferFromIncorrectOwner","inputs":[]},{"type":"error","name":"TransferToNonERC721ReceiverImplementer","inputs":[]},{"type":"error","name":"TransferToZeroAddress","inputs":[]},{"type":"error","name":"URIQueryForNonexistentToken","inputs":[]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"explicitOwnershipOf(uint256)":"c23dc68f","explicitOwnershipsOf(uint256[])":"5bbb2177","tokensOfOwner(address)":"8462151c","tokensOfOwnerIn(address,uint256,uint256)":"99a2557a"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ApprovalCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BalanceQueryForZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidQueryRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintERC2309QuantityExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintZeroQuantity\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnershipNotInitializedForExtraData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFromIncorrectOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC721ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"URIQueryForNonexistentToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"toTokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"ConsecutiveTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"explicitOwnershipOf\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"startTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"burned\",\"type\":\"bool\"},{\"internalType\":\"uint24\",\"name\":\"extraData\",\"type\":\"uint24\"}],\"internalType\":\"struct IERC721ABase.TokenOwnership\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"explicitOwnershipsOf\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"startTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"burned\",\"type\":\"bool\"},{\"internalType\":\"uint24\",\"name\":\"extraData\",\"type\":\"uint24\"}],\"internalType\":\"struct IERC721ABase.TokenOwnership[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"tokensOfOwner\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"start\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stop\",\"type\":\"uint256\"}],\"name\":\"tokensOfOwnerIn\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of ERC721AQueryable.\",\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"ConsecutiveTransfer(uint256,uint256,address,address)\":{\"details\":\"Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, as defined in the [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. See {_mintERC2309} for more details.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"explicitOwnershipOf(uint256)\":{\"details\":\"Returns the `TokenOwnership` struct at `tokenId` without reverting. If the `tokenId` is out of bounds: - `addr = address(0)` - `startTimestamp = 0` - `burned = false` - `extraData = 0` If the `tokenId` is burned: - `addr =
` - `startTimestamp = ` - `burned = true` - `extraData = ` Otherwise: - `addr =
` - `startTimestamp = ` - `burned = false` - `extraData = `\"},\"explicitOwnershipsOf(uint256[])\":{\"details\":\"Returns an array of `TokenOwnership` structs at `tokenIds` in order. See {ERC721AQueryable-explicitOwnershipOf}\"},\"tokensOfOwner(address)\":{\"details\":\"Returns an array of token IDs owned by `owner`. This function scans the ownership mapping and is O(`totalSupply`) in complexity. It is meant to be called off-chain. See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into multiple smaller scans if the collection is large enough to cause an out-of-gas error (10K collections should be fine).\"},\"tokensOfOwnerIn(address,uint256,uint256)\":{\"details\":\"Returns an array of token IDs owned by `owner`, in the range [`start`, `stop`) (i.e. `start <= tokenId < stop`). This function allows for tokens to be queried if the collection grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. Requirements: - `start < stop`\"}},\"version\":1},\"userdoc\":{\"errors\":{\"ApprovalCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"ApprovalQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"BalanceQueryForZeroAddress()\":[{\"notice\":\"Cannot query the balance for the zero address.\"}],\"InvalidQueryRange()\":[{\"notice\":\"Invalid query range (`start` >= `stop`).\"}],\"MintERC2309QuantityExceedsLimit()\":[{\"notice\":\"The `quantity` minted with ERC2309 exceeds the safety limit.\"}],\"MintToZeroAddress()\":[{\"notice\":\"Cannot mint to the zero address.\"}],\"MintZeroQuantity()\":[{\"notice\":\"The quantity of tokens minted must be more than zero.\"}],\"OwnerQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"OwnershipNotInitializedForExtraData()\":[{\"notice\":\"The `extraData` cannot be set on an unintialized ownership slot.\"}],\"TransferCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"TransferFromIncorrectOwner()\":[{\"notice\":\"The token must be owned by `from`.\"}],\"TransferToNonERC721ReceiverImplementer()\":[{\"notice\":\"Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"notice\":\"Cannot transfer to the zero address.\"}],\"URIQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}]},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/diamond/facets/token/ERC721A/extensions/IERC721AQueryable.sol\":\"IERC721AQueryable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol\":{\"keccak256\":\"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e\",\"dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM\"]},\"contracts/src/diamond/facets/token/ERC721A/extensions/IERC721AQueryable.sol\":{\"keccak256\":\"0x4f771b745db219765ea57142179c383c3650e70d117e6aaedda07faeab0a2174\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ae401ba6b212057bb5ccaa749cd19b8f3adf81b8f8394d0b73b2b2c138da21c2\",\"dweb:/ipfs/QmSPd32GxN6L1K157yuRXvRBXPeNLa7TiKE93ouH8ccR6V\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"ApprovalCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"ApprovalQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"BalanceQueryForZeroAddress"},{"inputs":[],"type":"error","name":"InvalidQueryRange"},{"inputs":[],"type":"error","name":"MintERC2309QuantityExceedsLimit"},{"inputs":[],"type":"error","name":"MintToZeroAddress"},{"inputs":[],"type":"error","name":"MintZeroQuantity"},{"inputs":[],"type":"error","name":"OwnerQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"OwnershipNotInitializedForExtraData"},{"inputs":[],"type":"error","name":"TransferCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"TransferFromIncorrectOwner"},{"inputs":[],"type":"error","name":"TransferToNonERC721ReceiverImplementer"},{"inputs":[],"type":"error","name":"TransferToZeroAddress"},{"inputs":[],"type":"error","name":"URIQueryForNonexistentToken"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"approved","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bool","name":"approved","type":"bool","indexed":false}],"type":"event","name":"ApprovalForAll","anonymous":false},{"inputs":[{"internalType":"uint256","name":"fromTokenId","type":"uint256","indexed":true},{"internalType":"uint256","name":"toTokenId","type":"uint256","indexed":false},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true}],"type":"event","name":"ConsecutiveTransfer","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"explicitOwnershipOf","outputs":[{"internalType":"struct IERC721ABase.TokenOwnership","name":"","type":"tuple","components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}]}]},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"view","type":"function","name":"explicitOwnershipsOf","outputs":[{"internalType":"struct IERC721ABase.TokenOwnership[]","name":"","type":"tuple[]","components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}]}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function","name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"stateMutability":"view","type":"function","name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}]}],"devdoc":{"kind":"dev","methods":{"explicitOwnershipOf(uint256)":{"details":"Returns the `TokenOwnership` struct at `tokenId` without reverting. If the `tokenId` is out of bounds: - `addr = address(0)` - `startTimestamp = 0` - `burned = false` - `extraData = 0` If the `tokenId` is burned: - `addr =
` - `startTimestamp = ` - `burned = true` - `extraData = ` Otherwise: - `addr =
` - `startTimestamp = ` - `burned = false` - `extraData = `"},"explicitOwnershipsOf(uint256[])":{"details":"Returns an array of `TokenOwnership` structs at `tokenIds` in order. See {ERC721AQueryable-explicitOwnershipOf}"},"tokensOfOwner(address)":{"details":"Returns an array of token IDs owned by `owner`. This function scans the ownership mapping and is O(`totalSupply`) in complexity. It is meant to be called off-chain. See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into multiple smaller scans if the collection is large enough to cause an out-of-gas error (10K collections should be fine)."},"tokensOfOwnerIn(address,uint256,uint256)":{"details":"Returns an array of token IDs owned by `owner`, in the range [`start`, `stop`) (i.e. `start <= tokenId < stop`). This function allows for tokens to be queried if the collection grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. Requirements: - `start < stop`"}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/diamond/facets/token/ERC721A/extensions/IERC721AQueryable.sol":"IERC721AQueryable"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9","urls":["bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e","dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/extensions/IERC721AQueryable.sol":{"keccak256":"0x4f771b745db219765ea57142179c383c3650e70d117e6aaedda07faeab0a2174","urls":["bzz-raw://ae401ba6b212057bb5ccaa749cd19b8f3adf81b8f8394d0b73b2b2c138da21c2","dweb:/ipfs/QmSPd32GxN6L1K157yuRXvRBXPeNLa7TiKE93ouH8ccR6V"],"license":"Apache-2.0"}},"version":1},"id":133} \ No newline at end of file diff --git a/packages/generated/v3/abis/IERC721AQueryable.metadata.json b/packages/generated/v3/abis/IERC721AQueryable.metadata.json new file mode 100644 index 000000000..ac5dd32e5 --- /dev/null +++ b/packages/generated/v3/abis/IERC721AQueryable.metadata.json @@ -0,0 +1,383 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "ApprovalQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "BalanceQueryForZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "InvalidQueryRange" + }, + { + "inputs": [], + "type": "error", + "name": "MintERC2309QuantityExceedsLimit" + }, + { + "inputs": [], + "type": "error", + "name": "MintToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "MintZeroQuantity" + }, + { + "inputs": [], + "type": "error", + "name": "OwnerQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "OwnershipNotInitializedForExtraData" + }, + { + "inputs": [], + "type": "error", + "name": "TransferCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "TransferFromIncorrectOwner" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "URIQueryForNonexistentToken" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "approved", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Approval", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "operator", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ApprovalForAll", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fromTokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint256", + "name": "toTokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConsecutiveTransfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Transfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "explicitOwnershipOf", + "outputs": [ + { + "internalType": "struct IERC721ABase.TokenOwnership", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "uint64", + "name": "startTimestamp", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "burned", + "type": "bool" + }, + { + "internalType": "uint24", + "name": "extraData", + "type": "uint24" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function", + "name": "explicitOwnershipsOf", + "outputs": [ + { + "internalType": "struct IERC721ABase.TokenOwnership[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "uint64", + "name": "startTimestamp", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "burned", + "type": "bool" + }, + { + "internalType": "uint24", + "name": "extraData", + "type": "uint24" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "tokensOfOwner", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stop", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "tokensOfOwnerIn", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ] + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "explicitOwnershipOf(uint256)": { + "details": "Returns the `TokenOwnership` struct at `tokenId` without reverting. If the `tokenId` is out of bounds: - `addr = address(0)` - `startTimestamp = 0` - `burned = false` - `extraData = 0` If the `tokenId` is burned: - `addr =
` - `startTimestamp = ` - `burned = true` - `extraData = ` Otherwise: - `addr =
` - `startTimestamp = ` - `burned = false` - `extraData = `" + }, + "explicitOwnershipsOf(uint256[])": { + "details": "Returns an array of `TokenOwnership` structs at `tokenIds` in order. See {ERC721AQueryable-explicitOwnershipOf}" + }, + "tokensOfOwner(address)": { + "details": "Returns an array of token IDs owned by `owner`. This function scans the ownership mapping and is O(`totalSupply`) in complexity. It is meant to be called off-chain. See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into multiple smaller scans if the collection is large enough to cause an out-of-gas error (10K collections should be fine)." + }, + "tokensOfOwnerIn(address,uint256,uint256)": { + "details": "Returns an array of token IDs owned by `owner`, in the range [`start`, `stop`) (i.e. `start <= tokenId < stop`). This function allows for tokens to be queried if the collection grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. Requirements: - `start < stop`" + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/diamond/facets/token/ERC721A/extensions/IERC721AQueryable.sol": "IERC721AQueryable" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/token/ERC721A/IERC721A.sol": { + "keccak256": "0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9", + "urls": [ + "bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e", + "dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/extensions/IERC721AQueryable.sol": { + "keccak256": "0x4f771b745db219765ea57142179c383c3650e70d117e6aaedda07faeab0a2174", + "urls": [ + "bzz-raw://ae401ba6b212057bb5ccaa749cd19b8f3adf81b8f8394d0b73b2b2c138da21c2", + "dweb:/ipfs/QmSPd32GxN6L1K157yuRXvRBXPeNLa7TiKE93ouH8ccR6V" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/IMulticall.abi.json b/packages/generated/v3/abis/IMulticall.abi.json new file mode 100644 index 000000000..a24b4e01e --- /dev/null +++ b/packages/generated/v3/abis/IMulticall.abi.json @@ -0,0 +1,21 @@ +[ + { + "type": "function", + "name": "multicall", + "inputs": [ + { + "name": "data", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "outputs": [ + { + "name": "results", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "stateMutability": "nonpayable" + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/IMulticall.abi.ts b/packages/generated/v3/abis/IMulticall.abi.ts new file mode 100644 index 000000000..673261ec8 --- /dev/null +++ b/packages/generated/v3/abis/IMulticall.abi.ts @@ -0,0 +1,21 @@ +export default [ + { + "type": "function", + "name": "multicall", + "inputs": [ + { + "name": "data", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "outputs": [ + { + "name": "results", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "stateMutability": "nonpayable" + } +] as const diff --git a/packages/generated/v3/abis/IMulticall.bin b/packages/generated/v3/abis/IMulticall.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/v3/abis/IMulticall.json b/packages/generated/v3/abis/IMulticall.json new file mode 100644 index 000000000..f3d51c34a --- /dev/null +++ b/packages/generated/v3/abis/IMulticall.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"multicall","inputs":[{"name":"data","type":"bytes[]","internalType":"bytes[]"}],"outputs":[{"name":"results","type":"bytes[]","internalType":"bytes[]"}],"stateMutability":"nonpayable"}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"multicall(bytes[])":"ac9650d8"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"multicall(bytes[])\":{\"params\":{\"data\":\"array of function call data payloads\"},\"returns\":{\"results\":\"array of function call results\"}}},\"title\":\"Interface for the Multicall utility contract\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"multicall(bytes[])\":{\"notice\":\"batch function calls to the contract and return the results of each\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/diamond/utils/multicall/IMulticall.sol\":\"IMulticall\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/utils/multicall/IMulticall.sol\":{\"keccak256\":\"0x0f1a1884b290dc829323fa6d01e0dedc785ff582e9dbffd52e44e6f2fc7beff6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1ce824d7f2b31f53a807bf6d6d7e9d0eaaf2d81b75fa316cda616e29cb4669a9\",\"dweb:/ipfs/QmWyiRtGKtX6Kfng8Az2ujKDZdqjnfwxMuD1rQEZz6aki5\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function","name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}]}],"devdoc":{"kind":"dev","methods":{"multicall(bytes[])":{"params":{"data":"array of function call data payloads"},"returns":{"results":"array of function call results"}}},"version":1},"userdoc":{"kind":"user","methods":{"multicall(bytes[])":{"notice":"batch function calls to the contract and return the results of each"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/diamond/utils/multicall/IMulticall.sol":"IMulticall"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/utils/multicall/IMulticall.sol":{"keccak256":"0x0f1a1884b290dc829323fa6d01e0dedc785ff582e9dbffd52e44e6f2fc7beff6","urls":["bzz-raw://1ce824d7f2b31f53a807bf6d6d7e9d0eaaf2d81b75fa316cda616e29cb4669a9","dweb:/ipfs/QmWyiRtGKtX6Kfng8Az2ujKDZdqjnfwxMuD1rQEZz6aki5"],"license":"Apache-2.0"}},"version":1},"id":149} \ No newline at end of file diff --git a/packages/generated/v3/abis/IMulticall.metadata.json b/packages/generated/v3/abis/IMulticall.metadata.json new file mode 100644 index 000000000..ed8dbd558 --- /dev/null +++ b/packages/generated/v3/abis/IMulticall.metadata.json @@ -0,0 +1,88 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ] + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "multicall(bytes[])": { + "params": { + "data": "array of function call data payloads" + }, + "returns": { + "results": "array of function call results" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "multicall(bytes[])": { + "notice": "batch function calls to the contract and return the results of each" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/diamond/utils/multicall/IMulticall.sol": "IMulticall" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/utils/multicall/IMulticall.sol": { + "keccak256": "0x0f1a1884b290dc829323fa6d01e0dedc785ff582e9dbffd52e44e6f2fc7beff6", + "urls": [ + "bzz-raw://1ce824d7f2b31f53a807bf6d6d7e9d0eaaf2d81b75fa316cda616e29cb4669a9", + "dweb:/ipfs/QmWyiRtGKtX6Kfng8Az2ujKDZdqjnfwxMuD1rQEZz6aki5" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/IPausable.abi.json b/packages/generated/v3/abis/IPausable.abi.json new file mode 100644 index 000000000..1f2168a61 --- /dev/null +++ b/packages/generated/v3/abis/IPausable.abi.json @@ -0,0 +1,65 @@ +[ + { + "type": "function", + "name": "pause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "paused", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "unpause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/IPausable.abi.ts b/packages/generated/v3/abis/IPausable.abi.ts new file mode 100644 index 000000000..0237ecea0 --- /dev/null +++ b/packages/generated/v3/abis/IPausable.abi.ts @@ -0,0 +1,65 @@ +export default [ + { + "type": "function", + "name": "pause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "paused", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "unpause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/IPausable.bin b/packages/generated/v3/abis/IPausable.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/v3/abis/IPausable.json b/packages/generated/v3/abis/IPausable.json new file mode 100644 index 000000000..3e9c3071d --- /dev/null +++ b/packages/generated/v3/abis/IPausable.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"pause","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"unpause","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"Pausable__NotPaused","inputs":[]},{"type":"error","name":"Pausable__Paused","inputs":[]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"pause()":"8456cb59","paused()":"5c975abb","unpause()":"3f4ba83a"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"Pausable__NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__Paused\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/diamond/facets/pausable/IPausable.sol\":\"IPausable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/pausable/IPausable.sol\":{\"keccak256\":\"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6\",\"dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"Pausable__NotPaused"},{"inputs":[],"type":"error","name":"Pausable__Paused"},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"pause"},{"inputs":[],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"unpause"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/diamond/facets/pausable/IPausable.sol":"IPausable"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/pausable/IPausable.sol":{"keccak256":"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261","urls":["bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6","dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM"],"license":"Apache-2.0"}},"version":1},"id":107} \ No newline at end of file diff --git a/packages/generated/v3/abis/IPausable.metadata.json b/packages/generated/v3/abis/IPausable.metadata.json new file mode 100644 index 000000000..3336ee94b --- /dev/null +++ b/packages/generated/v3/abis/IPausable.metadata.json @@ -0,0 +1,117 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "Pausable__NotPaused" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__Paused" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Paused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Unpaused", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "pause" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "unpause" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/diamond/facets/pausable/IPausable.sol": "IPausable" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/pausable/IPausable.sol": { + "keccak256": "0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261", + "urls": [ + "bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6", + "dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/IPausableBase.abi.json b/packages/generated/v3/abis/IPausableBase.abi.json new file mode 100644 index 000000000..b55c603c4 --- /dev/null +++ b/packages/generated/v3/abis/IPausableBase.abi.json @@ -0,0 +1,38 @@ +[ + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/IPausableBase.abi.ts b/packages/generated/v3/abis/IPausableBase.abi.ts new file mode 100644 index 000000000..22c668d52 --- /dev/null +++ b/packages/generated/v3/abis/IPausableBase.abi.ts @@ -0,0 +1,38 @@ +export default [ + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/IPausableBase.bin b/packages/generated/v3/abis/IPausableBase.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/v3/abis/IPausableBase.json b/packages/generated/v3/abis/IPausableBase.json new file mode 100644 index 000000000..18d3fdbb8 --- /dev/null +++ b/packages/generated/v3/abis/IPausableBase.json @@ -0,0 +1 @@ +{"abi":[{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"Pausable__NotPaused","inputs":[]},{"type":"error","name":"Pausable__Paused","inputs":[]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"Pausable__NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__Paused\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/diamond/facets/pausable/IPausable.sol\":\"IPausableBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/pausable/IPausable.sol\":{\"keccak256\":\"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6\",\"dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"Pausable__NotPaused"},{"inputs":[],"type":"error","name":"Pausable__Paused"},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/diamond/facets/pausable/IPausable.sol":"IPausableBase"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/pausable/IPausable.sol":{"keccak256":"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261","urls":["bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6","dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM"],"license":"Apache-2.0"}},"version":1},"id":107} \ No newline at end of file diff --git a/packages/generated/v3/abis/IPausableBase.metadata.json b/packages/generated/v3/abis/IPausableBase.metadata.json new file mode 100644 index 000000000..2fe025189 --- /dev/null +++ b/packages/generated/v3/abis/IPausableBase.metadata.json @@ -0,0 +1,92 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "Pausable__NotPaused" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__Paused" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Paused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Unpaused", + "anonymous": false + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/diamond/facets/pausable/IPausable.sol": "IPausableBase" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/pausable/IPausable.sol": { + "keccak256": "0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261", + "urls": [ + "bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6", + "dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/IPricingModules.abi.json b/packages/generated/v3/abis/IPricingModules.abi.json new file mode 100644 index 000000000..d1fffafd7 --- /dev/null +++ b/packages/generated/v3/abis/IPricingModules.abi.json @@ -0,0 +1,127 @@ +[ + { + "type": "function", + "name": "addPricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isPricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "listPricingModules", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IPricingModulesBase.PricingModule[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "module", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removePricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "PricingModuleAdded", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PricingModuleRemoved", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PricingModuleUpdated", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "InvalidPricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/IPricingModules.abi.ts b/packages/generated/v3/abis/IPricingModules.abi.ts new file mode 100644 index 000000000..8ffc82bc7 --- /dev/null +++ b/packages/generated/v3/abis/IPricingModules.abi.ts @@ -0,0 +1,127 @@ +export default [ + { + "type": "function", + "name": "addPricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isPricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "listPricingModules", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IPricingModulesBase.PricingModule[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "module", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removePricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "PricingModuleAdded", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PricingModuleRemoved", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PricingModuleUpdated", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "InvalidPricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ] + } +] as const diff --git a/packages/generated/v3/abis/IPricingModules.bin b/packages/generated/v3/abis/IPricingModules.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/v3/abis/IPricingModules.json b/packages/generated/v3/abis/IPricingModules.json new file mode 100644 index 000000000..9ed08fe05 --- /dev/null +++ b/packages/generated/v3/abis/IPricingModules.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"addPricingModule","inputs":[{"name":"module","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isPricingModule","inputs":[{"name":"module","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"listPricingModules","inputs":[],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IPricingModulesBase.PricingModule[]","components":[{"name":"name","type":"string","internalType":"string"},{"name":"description","type":"string","internalType":"string"},{"name":"module","type":"address","internalType":"address"}]}],"stateMutability":"view"},{"type":"function","name":"removePricingModule","inputs":[{"name":"module","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"PricingModuleAdded","inputs":[{"name":"module","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"PricingModuleRemoved","inputs":[{"name":"module","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"PricingModuleUpdated","inputs":[{"name":"module","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"InvalidPricingModule","inputs":[{"name":"module","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"addPricingModule(address)":"804d898e","isPricingModule(address)":"8df80bd6","listPricingModules()":"4066cb90","removePricingModule(address)":"31655db1"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"InvalidPricingModule\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"PricingModuleAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"PricingModuleRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"PricingModuleUpdated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"addPricingModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"isPricingModule\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"listPricingModules\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"internalType\":\"struct IPricingModulesBase.PricingModule[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"removePricingModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/factory/facets/architect/pricing/IPricingModules.sol\":\"IPricingModules\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/factory/facets/architect/pricing/IPricingModules.sol\":{\"keccak256\":\"0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716\",\"dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"module","type":"address"}],"type":"error","name":"InvalidPricingModule"},{"inputs":[{"internalType":"address","name":"module","type":"address","indexed":true}],"type":"event","name":"PricingModuleAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"module","type":"address","indexed":true}],"type":"event","name":"PricingModuleRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"module","type":"address","indexed":true}],"type":"event","name":"PricingModuleUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"addPricingModule"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"stateMutability":"view","type":"function","name":"isPricingModule","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"listPricingModules","outputs":[{"internalType":"struct IPricingModulesBase.PricingModule[]","name":"","type":"tuple[]","components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"address","name":"module","type":"address"}]}]},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removePricingModule"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/factory/facets/architect/pricing/IPricingModules.sol":"IPricingModules"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/factory/facets/architect/pricing/IPricingModules.sol":{"keccak256":"0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e","urls":["bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716","dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU"],"license":"Apache-2.0"}},"version":1},"id":156} \ No newline at end of file diff --git a/packages/generated/v3/abis/IPricingModules.metadata.json b/packages/generated/v3/abis/IPricingModules.metadata.json new file mode 100644 index 000000000..d8792ef3f --- /dev/null +++ b/packages/generated/v3/abis/IPricingModules.metadata.json @@ -0,0 +1,179 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "type": "error", + "name": "InvalidPricingModule" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "PricingModuleAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "PricingModuleRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "PricingModuleUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "addPricingModule" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isPricingModule", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "listPricingModules", + "outputs": [ + { + "internalType": "struct IPricingModulesBase.PricingModule[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + }, + { + "internalType": "address", + "name": "module", + "type": "address" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removePricingModule" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/factory/facets/architect/pricing/IPricingModules.sol": "IPricingModules" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/factory/facets/architect/pricing/IPricingModules.sol": { + "keccak256": "0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e", + "urls": [ + "bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716", + "dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/IPricingModulesBase.abi.json b/packages/generated/v3/abis/IPricingModulesBase.abi.json new file mode 100644 index 000000000..8993b726e --- /dev/null +++ b/packages/generated/v3/abis/IPricingModulesBase.abi.json @@ -0,0 +1,52 @@ +[ + { + "type": "event", + "name": "PricingModuleAdded", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PricingModuleRemoved", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PricingModuleUpdated", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "InvalidPricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/IPricingModulesBase.abi.ts b/packages/generated/v3/abis/IPricingModulesBase.abi.ts new file mode 100644 index 000000000..d49583cab --- /dev/null +++ b/packages/generated/v3/abis/IPricingModulesBase.abi.ts @@ -0,0 +1,52 @@ +export default [ + { + "type": "event", + "name": "PricingModuleAdded", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PricingModuleRemoved", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PricingModuleUpdated", + "inputs": [ + { + "name": "module", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "InvalidPricingModule", + "inputs": [ + { + "name": "module", + "type": "address", + "internalType": "address" + } + ] + } +] as const diff --git a/packages/generated/v3/abis/IPricingModulesBase.bin b/packages/generated/v3/abis/IPricingModulesBase.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/v3/abis/IPricingModulesBase.json b/packages/generated/v3/abis/IPricingModulesBase.json new file mode 100644 index 000000000..ef9cd820b --- /dev/null +++ b/packages/generated/v3/abis/IPricingModulesBase.json @@ -0,0 +1 @@ +{"abi":[{"type":"event","name":"PricingModuleAdded","inputs":[{"name":"module","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"PricingModuleRemoved","inputs":[{"name":"module","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"PricingModuleUpdated","inputs":[{"name":"module","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"InvalidPricingModule","inputs":[{"name":"module","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"InvalidPricingModule\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"PricingModuleAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"PricingModuleRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"PricingModuleUpdated\",\"type\":\"event\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/factory/facets/architect/pricing/IPricingModules.sol\":\"IPricingModulesBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/factory/facets/architect/pricing/IPricingModules.sol\":{\"keccak256\":\"0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716\",\"dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"module","type":"address"}],"type":"error","name":"InvalidPricingModule"},{"inputs":[{"internalType":"address","name":"module","type":"address","indexed":true}],"type":"event","name":"PricingModuleAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"module","type":"address","indexed":true}],"type":"event","name":"PricingModuleRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"module","type":"address","indexed":true}],"type":"event","name":"PricingModuleUpdated","anonymous":false}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/factory/facets/architect/pricing/IPricingModules.sol":"IPricingModulesBase"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/factory/facets/architect/pricing/IPricingModules.sol":{"keccak256":"0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e","urls":["bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716","dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU"],"license":"Apache-2.0"}},"version":1},"id":156} \ No newline at end of file diff --git a/packages/generated/v3/abis/IPricingModulesBase.metadata.json b/packages/generated/v3/abis/IPricingModulesBase.metadata.json new file mode 100644 index 000000000..067f73da5 --- /dev/null +++ b/packages/generated/v3/abis/IPricingModulesBase.metadata.json @@ -0,0 +1,106 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "type": "error", + "name": "InvalidPricingModule" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "PricingModuleAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "PricingModuleRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "PricingModuleUpdated", + "anonymous": false + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/factory/facets/architect/pricing/IPricingModules.sol": "IPricingModulesBase" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/factory/facets/architect/pricing/IPricingModules.sol": { + "keccak256": "0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e", + "urls": [ + "bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716", + "dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/IRuleEntitlement.abi.json b/packages/generated/v3/abis/IRuleEntitlement.abi.json new file mode 100644 index 000000000..fda3fe91a --- /dev/null +++ b/packages/generated/v3/abis/IRuleEntitlement.abi.json @@ -0,0 +1,556 @@ +[ + { + "type": "function", + "name": "description", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "encodeRuleData", + "inputs": [ + { + "name": "data", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "getCheckOperations", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEntitlementDataByRoleId", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getLogicalOperations", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getOperations", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRuleData", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "data", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isCrosschain", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isEntitled", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "user", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "permission", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "moduleType", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "entitlementData", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "error", + "name": "CheckOperationsLimitReaced", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidCheckOperationIndex", + "inputs": [ + { + "name": "operationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "checkOperationsLength", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "type": "error", + "name": "InvalidLeftOperationIndex", + "inputs": [ + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "currentOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "type": "error", + "name": "InvalidLogicalOperationIndex", + "inputs": [ + { + "name": "operationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "logicalOperationsLength", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "type": "error", + "name": "InvalidOperationType", + "inputs": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + } + ] + }, + { + "type": "error", + "name": "InvalidRightOperationIndex", + "inputs": [ + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "currentOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "type": "error", + "name": "LogicalOperationLimitReached", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "OperationsLimitReached", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/IRuleEntitlement.abi.ts b/packages/generated/v3/abis/IRuleEntitlement.abi.ts new file mode 100644 index 000000000..d593061ba --- /dev/null +++ b/packages/generated/v3/abis/IRuleEntitlement.abi.ts @@ -0,0 +1,556 @@ +export default [ + { + "type": "function", + "name": "description", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "encodeRuleData", + "inputs": [ + { + "name": "data", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "getCheckOperations", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEntitlementDataByRoleId", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getLogicalOperations", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getOperations", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRuleData", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "data", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isCrosschain", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isEntitled", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "user", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "permission", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "moduleType", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "entitlementData", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "error", + "name": "CheckOperationsLimitReaced", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidCheckOperationIndex", + "inputs": [ + { + "name": "operationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "checkOperationsLength", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "type": "error", + "name": "InvalidLeftOperationIndex", + "inputs": [ + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "currentOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "type": "error", + "name": "InvalidLogicalOperationIndex", + "inputs": [ + { + "name": "operationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "logicalOperationsLength", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "type": "error", + "name": "InvalidOperationType", + "inputs": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + } + ] + }, + { + "type": "error", + "name": "InvalidRightOperationIndex", + "inputs": [ + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "currentOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "type": "error", + "name": "LogicalOperationLimitReached", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "OperationsLimitReached", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ] + } +] as const diff --git a/packages/generated/v3/abis/IRuleEntitlement.bin b/packages/generated/v3/abis/IRuleEntitlement.bin new file mode 100644 index 000000000..e69de29bb diff --git a/packages/generated/v3/abis/IRuleEntitlement.json b/packages/generated/v3/abis/IRuleEntitlement.json new file mode 100644 index 000000000..93e230cf2 --- /dev/null +++ b/packages/generated/v3/abis/IRuleEntitlement.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"description","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"encodeRuleData","inputs":[{"name":"data","type":"tuple","internalType":"struct IRuleEntitlement.RuleData","components":[{"name":"operations","type":"tuple[]","internalType":"struct IRuleEntitlement.Operation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CombinedOperationType"},{"name":"index","type":"uint8","internalType":"uint8"}]},{"name":"checkOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.CheckOperation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CheckOperationType"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"contractAddress","type":"address","internalType":"address"},{"name":"threshold","type":"uint256","internalType":"uint256"}]},{"name":"logicalOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.LogicalOperation[]","components":[{"name":"logOpType","type":"uint8","internalType":"enum IRuleEntitlement.LogicalOperationType"},{"name":"leftOperationIndex","type":"uint8","internalType":"uint8"},{"name":"rightOperationIndex","type":"uint8","internalType":"uint8"}]}]}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"pure"},{"type":"function","name":"getCheckOperations","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IRuleEntitlement.CheckOperation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CheckOperationType"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"contractAddress","type":"address","internalType":"address"},{"name":"threshold","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"getEntitlementDataByRoleId","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getLogicalOperations","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IRuleEntitlement.LogicalOperation[]","components":[{"name":"logOpType","type":"uint8","internalType":"enum IRuleEntitlement.LogicalOperationType"},{"name":"leftOperationIndex","type":"uint8","internalType":"uint8"},{"name":"rightOperationIndex","type":"uint8","internalType":"uint8"}]}],"stateMutability":"view"},{"type":"function","name":"getOperations","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IRuleEntitlement.Operation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CombinedOperationType"},{"name":"index","type":"uint8","internalType":"uint8"}]}],"stateMutability":"view"},{"type":"function","name":"getRuleData","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"data","type":"tuple","internalType":"struct IRuleEntitlement.RuleData","components":[{"name":"operations","type":"tuple[]","internalType":"struct IRuleEntitlement.Operation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CombinedOperationType"},{"name":"index","type":"uint8","internalType":"uint8"}]},{"name":"checkOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.CheckOperation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CheckOperationType"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"contractAddress","type":"address","internalType":"address"},{"name":"threshold","type":"uint256","internalType":"uint256"}]},{"name":"logicalOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.LogicalOperation[]","components":[{"name":"logOpType","type":"uint8","internalType":"enum IRuleEntitlement.LogicalOperationType"},{"name":"leftOperationIndex","type":"uint8","internalType":"uint8"},{"name":"rightOperationIndex","type":"uint8","internalType":"uint8"}]}]}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"space","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isCrosschain","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isEntitled","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"},{"name":"user","type":"address[]","internalType":"address[]"},{"name":"permission","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"moduleType","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"removeEntitlement","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setEntitlement","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"entitlementData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"error","name":"CheckOperationsLimitReaced","inputs":[{"name":"limit","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Entitlement__InvalidValue","inputs":[]},{"type":"error","name":"Entitlement__NotAllowed","inputs":[]},{"type":"error","name":"Entitlement__NotMember","inputs":[]},{"type":"error","name":"Entitlement__ValueAlreadyExists","inputs":[]},{"type":"error","name":"InvalidCheckOperationIndex","inputs":[{"name":"operationIndex","type":"uint8","internalType":"uint8"},{"name":"checkOperationsLength","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"InvalidLeftOperationIndex","inputs":[{"name":"leftOperationIndex","type":"uint8","internalType":"uint8"},{"name":"currentOperationIndex","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"InvalidLogicalOperationIndex","inputs":[{"name":"operationIndex","type":"uint8","internalType":"uint8"},{"name":"logicalOperationsLength","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"InvalidOperationType","inputs":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CombinedOperationType"}]},{"type":"error","name":"InvalidRightOperationIndex","inputs":[{"name":"rightOperationIndex","type":"uint8","internalType":"uint8"},{"name":"currentOperationIndex","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"LogicalOperationLimitReached","inputs":[{"name":"limit","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"OperationsLimitReached","inputs":[{"name":"limit","type":"uint256","internalType":"uint256"}]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"description()":"7284e416","encodeRuleData(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]))":"5d115072","getCheckOperations(uint256)":"e3eeace1","getEntitlementDataByRoleId(uint256)":"1eee07b2","getLogicalOperations(uint256)":"545f09d3","getOperations(uint256)":"5ad4d49e","getRuleData(uint256)":"069a3ee9","initialize(address)":"c4d66de8","isCrosschain()":"2e1b61e4","isEntitled(bytes32,address[],bytes32)":"0cf0b533","moduleType()":"6465e69f","name()":"06fdde03","removeEntitlement(uint256)":"f0c111f9","setEntitlement(uint256,bytes)":"ef8be574"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"CheckOperationsLimitReaced\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__ValueAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"operationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"checkOperationsLength\",\"type\":\"uint8\"}],\"name\":\"InvalidCheckOperationIndex\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"leftOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"currentOperationIndex\",\"type\":\"uint8\"}],\"name\":\"InvalidLeftOperationIndex\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"operationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"logicalOperationsLength\",\"type\":\"uint8\"}],\"name\":\"InvalidLogicalOperationIndex\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enum IRuleEntitlement.CombinedOperationType\",\"name\":\"opType\",\"type\":\"uint8\"}],\"name\":\"InvalidOperationType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"rightOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"currentOperationIndex\",\"type\":\"uint8\"}],\"name\":\"InvalidRightOperationIndex\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"LogicalOperationLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"OperationsLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"description\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CombinedOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.Operation[]\",\"name\":\"operations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CheckOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"internalType\":\"struct IRuleEntitlement.CheckOperation[]\",\"name\":\"checkOperations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.LogicalOperationType\",\"name\":\"logOpType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"leftOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"rightOperationIndex\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.LogicalOperation[]\",\"name\":\"logicalOperations\",\"type\":\"tuple[]\"}],\"internalType\":\"struct IRuleEntitlement.RuleData\",\"name\":\"data\",\"type\":\"tuple\"}],\"name\":\"encodeRuleData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getCheckOperations\",\"outputs\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CheckOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"internalType\":\"struct IRuleEntitlement.CheckOperation[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getEntitlementDataByRoleId\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getLogicalOperations\",\"outputs\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.LogicalOperationType\",\"name\":\"logOpType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"leftOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"rightOperationIndex\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.LogicalOperation[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getOperations\",\"outputs\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CombinedOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.Operation[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getRuleData\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CombinedOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.Operation[]\",\"name\":\"operations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CheckOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"internalType\":\"struct IRuleEntitlement.CheckOperation[]\",\"name\":\"checkOperations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.LogicalOperationType\",\"name\":\"logOpType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"leftOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"rightOperationIndex\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.LogicalOperation[]\",\"name\":\"logicalOperations\",\"type\":\"tuple[]\"}],\"internalType\":\"struct IRuleEntitlement.RuleData\",\"name\":\"data\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"space\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isCrosschain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"user\",\"type\":\"address[]\"},{\"internalType\":\"bytes32\",\"name\":\"permission\",\"type\":\"bytes32\"}],\"name\":\"isEntitled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"moduleType\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"removeEntitlement\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"entitlementData\",\"type\":\"bytes\"}],\"name\":\"setEntitlement\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getEntitlementDataByRoleId(uint256)\":{\"params\":{\"roleId\":\"the roleId to fetch the entitlement data for\"},\"returns\":{\"_0\":\"entitlementData array for the role\"}},\"isCrosschain()\":{\"returns\":{\"_0\":\"whether this entitlement will require crosschain evaluation\"}},\"isEntitled(bytes32,address[],bytes32)\":{\"params\":{\"channelId\":\"id of the channel to check, if empty, checks space\",\"permission\":\"the permission to check\",\"user\":\"address of the user to check\"},\"returns\":{\"_0\":\"whether the user is entitled to the permission\"}},\"removeEntitlement(uint256)\":{\"params\":{\"roleId\":\"id of the role to remove\"}},\"setEntitlement(uint256,bytes)\":{\"params\":{\"entitlementData\":\"abi encoded array of data necessary to set the entitlement\",\"roleId\":\"id of the role to gate\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"description()\":{\"notice\":\"The description of the entitlement module\"},\"getEntitlementDataByRoleId(uint256)\":{\"notice\":\"fetches the entitlement data for a roleId\"},\"initialize(address)\":{\"notice\":\"initializes the entitlement module\"},\"isCrosschain()\":{\"notice\":\"some entitlements require cross chain evaluation and may not be executed directly from other contracts\"},\"isEntitled(bytes32,address[],bytes32)\":{\"notice\":\"checks whether a user is has a given permission for a channel or a space\"},\"moduleType()\":{\"notice\":\"The type of the entitlement module\"},\"name()\":{\"notice\":\"The name of the entitlement module\"},\"removeEntitlement(uint256)\":{\"notice\":\"removes an entitlement\"},\"setEntitlement(uint256,bytes)\":{\"notice\":\"sets a new entitlement\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol\":\"IRuleEntitlement\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/spaces/entitlements/IEntitlement.sol\":{\"keccak256\":\"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3\",\"dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf\"]},\"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol\":{\"keccak256\":\"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1\",\"dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"type":"error","name":"CheckOperationsLimitReaced"},{"inputs":[],"type":"error","name":"Entitlement__InvalidValue"},{"inputs":[],"type":"error","name":"Entitlement__NotAllowed"},{"inputs":[],"type":"error","name":"Entitlement__NotMember"},{"inputs":[],"type":"error","name":"Entitlement__ValueAlreadyExists"},{"inputs":[{"internalType":"uint8","name":"operationIndex","type":"uint8"},{"internalType":"uint8","name":"checkOperationsLength","type":"uint8"}],"type":"error","name":"InvalidCheckOperationIndex"},{"inputs":[{"internalType":"uint8","name":"leftOperationIndex","type":"uint8"},{"internalType":"uint8","name":"currentOperationIndex","type":"uint8"}],"type":"error","name":"InvalidLeftOperationIndex"},{"inputs":[{"internalType":"uint8","name":"operationIndex","type":"uint8"},{"internalType":"uint8","name":"logicalOperationsLength","type":"uint8"}],"type":"error","name":"InvalidLogicalOperationIndex"},{"inputs":[{"internalType":"enum IRuleEntitlement.CombinedOperationType","name":"opType","type":"uint8"}],"type":"error","name":"InvalidOperationType"},{"inputs":[{"internalType":"uint8","name":"rightOperationIndex","type":"uint8"},{"internalType":"uint8","name":"currentOperationIndex","type":"uint8"}],"type":"error","name":"InvalidRightOperationIndex"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"type":"error","name":"LogicalOperationLimitReached"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"type":"error","name":"OperationsLimitReached"},{"inputs":[],"stateMutability":"view","type":"function","name":"description","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"struct IRuleEntitlement.RuleData","name":"data","type":"tuple","components":[{"internalType":"struct IRuleEntitlement.Operation[]","name":"operations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CombinedOperationType","name":"opType","type":"uint8"},{"internalType":"uint8","name":"index","type":"uint8"}]},{"internalType":"struct IRuleEntitlement.CheckOperation[]","name":"checkOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CheckOperationType","name":"opType","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"threshold","type":"uint256"}]},{"internalType":"struct IRuleEntitlement.LogicalOperation[]","name":"logicalOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.LogicalOperationType","name":"logOpType","type":"uint8"},{"internalType":"uint8","name":"leftOperationIndex","type":"uint8"},{"internalType":"uint8","name":"rightOperationIndex","type":"uint8"}]}]}],"stateMutability":"pure","type":"function","name":"encodeRuleData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getCheckOperations","outputs":[{"internalType":"struct IRuleEntitlement.CheckOperation[]","name":"","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CheckOperationType","name":"opType","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"threshold","type":"uint256"}]}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getEntitlementDataByRoleId","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getLogicalOperations","outputs":[{"internalType":"struct IRuleEntitlement.LogicalOperation[]","name":"","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.LogicalOperationType","name":"logOpType","type":"uint8"},{"internalType":"uint8","name":"leftOperationIndex","type":"uint8"},{"internalType":"uint8","name":"rightOperationIndex","type":"uint8"}]}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getOperations","outputs":[{"internalType":"struct IRuleEntitlement.Operation[]","name":"","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CombinedOperationType","name":"opType","type":"uint8"},{"internalType":"uint8","name":"index","type":"uint8"}]}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getRuleData","outputs":[{"internalType":"struct IRuleEntitlement.RuleData","name":"data","type":"tuple","components":[{"internalType":"struct IRuleEntitlement.Operation[]","name":"operations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CombinedOperationType","name":"opType","type":"uint8"},{"internalType":"uint8","name":"index","type":"uint8"}]},{"internalType":"struct IRuleEntitlement.CheckOperation[]","name":"checkOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CheckOperationType","name":"opType","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"threshold","type":"uint256"}]},{"internalType":"struct IRuleEntitlement.LogicalOperation[]","name":"logicalOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.LogicalOperationType","name":"logOpType","type":"uint8"},{"internalType":"uint8","name":"leftOperationIndex","type":"uint8"},{"internalType":"uint8","name":"rightOperationIndex","type":"uint8"}]}]}]},{"inputs":[{"internalType":"address","name":"space","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"view","type":"function","name":"isCrosschain","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"},{"internalType":"address[]","name":"user","type":"address[]"},{"internalType":"bytes32","name":"permission","type":"bytes32"}],"stateMutability":"view","type":"function","name":"isEntitled","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"moduleType","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"removeEntitlement"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"bytes","name":"entitlementData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"setEntitlement"}],"devdoc":{"kind":"dev","methods":{"getEntitlementDataByRoleId(uint256)":{"params":{"roleId":"the roleId to fetch the entitlement data for"},"returns":{"_0":"entitlementData array for the role"}},"isCrosschain()":{"returns":{"_0":"whether this entitlement will require crosschain evaluation"}},"isEntitled(bytes32,address[],bytes32)":{"params":{"channelId":"id of the channel to check, if empty, checks space","permission":"the permission to check","user":"address of the user to check"},"returns":{"_0":"whether the user is entitled to the permission"}},"removeEntitlement(uint256)":{"params":{"roleId":"id of the role to remove"}},"setEntitlement(uint256,bytes)":{"params":{"entitlementData":"abi encoded array of data necessary to set the entitlement","roleId":"id of the role to gate"}}},"version":1},"userdoc":{"kind":"user","methods":{"description()":{"notice":"The description of the entitlement module"},"getEntitlementDataByRoleId(uint256)":{"notice":"fetches the entitlement data for a roleId"},"initialize(address)":{"notice":"initializes the entitlement module"},"isCrosschain()":{"notice":"some entitlements require cross chain evaluation and may not be executed directly from other contracts"},"isEntitled(bytes32,address[],bytes32)":{"notice":"checks whether a user is has a given permission for a channel or a space"},"moduleType()":{"notice":"The type of the entitlement module"},"name()":{"notice":"The name of the entitlement module"},"removeEntitlement(uint256)":{"notice":"removes an entitlement"},"setEntitlement(uint256,bytes)":{"notice":"sets a new entitlement"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol":"IRuleEntitlement"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/spaces/entitlements/IEntitlement.sol":{"keccak256":"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca","urls":["bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3","dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol":{"keccak256":"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf","urls":["bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1","dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97"],"license":"MIT"}},"version":1},"id":187} \ No newline at end of file diff --git a/packages/generated/v3/abis/IRuleEntitlement.metadata.json b/packages/generated/v3/abis/IRuleEntitlement.metadata.json new file mode 100644 index 000000000..4ea790861 --- /dev/null +++ b/packages/generated/v3/abis/IRuleEntitlement.metadata.json @@ -0,0 +1,678 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + } + ], + "type": "error", + "name": "CheckOperationsLimitReaced" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__InvalidValue" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotAllowed" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotMember" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__ValueAlreadyExists" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "operationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "checkOperationsLength", + "type": "uint8" + } + ], + "type": "error", + "name": "InvalidCheckOperationIndex" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "leftOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "currentOperationIndex", + "type": "uint8" + } + ], + "type": "error", + "name": "InvalidLeftOperationIndex" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "operationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "logicalOperationsLength", + "type": "uint8" + } + ], + "type": "error", + "name": "InvalidLogicalOperationIndex" + }, + { + "inputs": [ + { + "internalType": "enum IRuleEntitlement.CombinedOperationType", + "name": "opType", + "type": "uint8" + } + ], + "type": "error", + "name": "InvalidOperationType" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "rightOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "currentOperationIndex", + "type": "uint8" + } + ], + "type": "error", + "name": "InvalidRightOperationIndex" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + } + ], + "type": "error", + "name": "LogicalOperationLimitReached" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + } + ], + "type": "error", + "name": "OperationsLimitReached" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "description", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "struct IRuleEntitlement.RuleData", + "name": "data", + "type": "tuple", + "components": [ + { + "internalType": "struct IRuleEntitlement.Operation[]", + "name": "operations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CombinedOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "index", + "type": "uint8" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "name": "checkOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CheckOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "name": "logicalOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.LogicalOperationType", + "name": "logOpType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "leftOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "rightOperationIndex", + "type": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "pure", + "type": "function", + "name": "encodeRuleData", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getCheckOperations", + "outputs": [ + { + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CheckOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getEntitlementDataByRoleId", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getLogicalOperations", + "outputs": [ + { + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.LogicalOperationType", + "name": "logOpType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "leftOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "rightOperationIndex", + "type": "uint8" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getOperations", + "outputs": [ + { + "internalType": "struct IRuleEntitlement.Operation[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CombinedOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "index", + "type": "uint8" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getRuleData", + "outputs": [ + { + "internalType": "struct IRuleEntitlement.RuleData", + "name": "data", + "type": "tuple", + "components": [ + { + "internalType": "struct IRuleEntitlement.Operation[]", + "name": "operations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CombinedOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "index", + "type": "uint8" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "name": "checkOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CheckOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "name": "logicalOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.LogicalOperationType", + "name": "logOpType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "leftOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "rightOperationIndex", + "type": "uint8" + } + ] + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "space", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "initialize" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "isCrosschain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "user", + "type": "address[]" + }, + { + "internalType": "bytes32", + "name": "permission", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isEntitled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "moduleType", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeEntitlement" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "entitlementData", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setEntitlement" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "getEntitlementDataByRoleId(uint256)": { + "params": { + "roleId": "the roleId to fetch the entitlement data for" + }, + "returns": { + "_0": "entitlementData array for the role" + } + }, + "isCrosschain()": { + "returns": { + "_0": "whether this entitlement will require crosschain evaluation" + } + }, + "isEntitled(bytes32,address[],bytes32)": { + "params": { + "channelId": "id of the channel to check, if empty, checks space", + "permission": "the permission to check", + "user": "address of the user to check" + }, + "returns": { + "_0": "whether the user is entitled to the permission" + } + }, + "removeEntitlement(uint256)": { + "params": { + "roleId": "id of the role to remove" + } + }, + "setEntitlement(uint256,bytes)": { + "params": { + "entitlementData": "abi encoded array of data necessary to set the entitlement", + "roleId": "id of the role to gate" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "description()": { + "notice": "The description of the entitlement module" + }, + "getEntitlementDataByRoleId(uint256)": { + "notice": "fetches the entitlement data for a roleId" + }, + "initialize(address)": { + "notice": "initializes the entitlement module" + }, + "isCrosschain()": { + "notice": "some entitlements require cross chain evaluation and may not be executed directly from other contracts" + }, + "isEntitled(bytes32,address[],bytes32)": { + "notice": "checks whether a user is has a given permission for a channel or a space" + }, + "moduleType()": { + "notice": "The type of the entitlement module" + }, + "name()": { + "notice": "The name of the entitlement module" + }, + "removeEntitlement(uint256)": { + "notice": "removes an entitlement" + }, + "setEntitlement(uint256,bytes)": { + "notice": "sets a new entitlement" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol": "IRuleEntitlement" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/spaces/entitlements/IEntitlement.sol": { + "keccak256": "0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca", + "urls": [ + "bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3", + "dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol": { + "keccak256": "0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf", + "urls": [ + "bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1", + "dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/Member.abi.json b/packages/generated/v3/abis/Member.abi.json new file mode 100644 index 000000000..ee2e9072f --- /dev/null +++ b/packages/generated/v3/abis/Member.abi.json @@ -0,0 +1,795 @@ +[ + { + "type": "constructor", + "inputs": [ + { + "name": "name_", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol_", + "type": "string", + "internalType": "string" + }, + { + "name": "baseURI_", + "type": "string", + "internalType": "string" + }, + { + "name": "merkleRoot_", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "MINT_PRICE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "TOTAL_SUPPLY", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_hasMinted", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "baseURI", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "currentTokenId", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getApproved", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isApprovedForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ownerOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "privateMint", + "inputs": [ + { + "name": "recipient", + "type": "address", + "internalType": "address" + }, + { + "name": "allowance", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "proof", + "type": "bytes32[]", + "internalType": "bytes32[]" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "publicMint", + "inputs": [ + { + "name": "recipient", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setApprovalForAll", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setBaseURI", + "inputs": [ + { + "name": "baseURI_", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "startPublicMint", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "startWaitlistMint", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "supportsInterface", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenURI", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "withdrawPayments", + "inputs": [ + { + "name": "payee", + "type": "address", + "internalType": "address payable" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MintStateChanged", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "prevState", + "type": "uint8", + "indexed": true, + "internalType": "enum Member.MintState" + }, + { + "name": "newState", + "type": "uint8", + "indexed": true, + "internalType": "enum Member.MintState" + }, + { + "name": "timestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Minted", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "timestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AlreadyMinted", + "inputs": [] + }, + { + "type": "error", + "name": "ERC721IncorrectOwner", + "inputs": [ + { + "name": "sender", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InsufficientApproval", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidApprover", + "inputs": [ + { + "name": "approver", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidReceiver", + "inputs": [ + { + "name": "receiver", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidSender", + "inputs": [ + { + "name": "sender", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721NonexistentToken", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidMintState", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidProof", + "inputs": [] + }, + { + "type": "error", + "name": "MaxSupplyReached", + "inputs": [] + }, + { + "type": "error", + "name": "MintPriceNotPaid", + "inputs": [] + }, + { + "type": "error", + "name": "NonExistentTokenURI", + "inputs": [] + }, + { + "type": "error", + "name": "NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "OwnableInvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "OwnableUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "WithdrawTransfer", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/Member.abi.ts b/packages/generated/v3/abis/Member.abi.ts new file mode 100644 index 000000000..725a2f5f3 --- /dev/null +++ b/packages/generated/v3/abis/Member.abi.ts @@ -0,0 +1,795 @@ +export default [ + { + "type": "constructor", + "inputs": [ + { + "name": "name_", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol_", + "type": "string", + "internalType": "string" + }, + { + "name": "baseURI_", + "type": "string", + "internalType": "string" + }, + { + "name": "merkleRoot_", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "MINT_PRICE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "TOTAL_SUPPLY", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_hasMinted", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "baseURI", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "currentTokenId", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getApproved", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isApprovedForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ownerOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "privateMint", + "inputs": [ + { + "name": "recipient", + "type": "address", + "internalType": "address" + }, + { + "name": "allowance", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "proof", + "type": "bytes32[]", + "internalType": "bytes32[]" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "publicMint", + "inputs": [ + { + "name": "recipient", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setApprovalForAll", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setBaseURI", + "inputs": [ + { + "name": "baseURI_", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "startPublicMint", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "startWaitlistMint", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "supportsInterface", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenURI", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "withdrawPayments", + "inputs": [ + { + "name": "payee", + "type": "address", + "internalType": "address payable" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MintStateChanged", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "prevState", + "type": "uint8", + "indexed": true, + "internalType": "enum Member.MintState" + }, + { + "name": "newState", + "type": "uint8", + "indexed": true, + "internalType": "enum Member.MintState" + }, + { + "name": "timestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Minted", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "timestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AlreadyMinted", + "inputs": [] + }, + { + "type": "error", + "name": "ERC721IncorrectOwner", + "inputs": [ + { + "name": "sender", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InsufficientApproval", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidApprover", + "inputs": [ + { + "name": "approver", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidReceiver", + "inputs": [ + { + "name": "receiver", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721InvalidSender", + "inputs": [ + { + "name": "sender", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC721NonexistentToken", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidMintState", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidProof", + "inputs": [] + }, + { + "type": "error", + "name": "MaxSupplyReached", + "inputs": [] + }, + { + "type": "error", + "name": "MintPriceNotPaid", + "inputs": [] + }, + { + "type": "error", + "name": "NonExistentTokenURI", + "inputs": [] + }, + { + "type": "error", + "name": "NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "OwnableInvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "OwnableUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "WithdrawTransfer", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/Member.bin b/packages/generated/v3/abis/Member.bin new file mode 100644 index 000000000..2d7a6db63 --- /dev/null +++ b/packages/generated/v3/abis/Member.bin @@ -0,0 +1 @@ +60a06040523480156200001157600080fd5b5060405162001d7438038062001d748339810160408190526200003491620001d1565b3384846000620000458382620002fb565b506001620000548282620002fb565b5050506001600160a01b0381166200008657604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6200009181620000b7565b506007620000a08382620002fb565b5060805250506009805460ff1916905550620003c7565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200013157600080fd5b81516001600160401b03808211156200014e576200014e62000109565b604051601f8301601f19908116603f0116810190828211818310171562000179576200017962000109565b81604052838152602092508660208588010111156200019757600080fd5b600091505b83821015620001bb57858201830151818301840152908201906200019c565b6000602085830101528094505050505092915050565b60008060008060808587031215620001e857600080fd5b84516001600160401b03808211156200020057600080fd5b6200020e888389016200011f565b955060208701519150808211156200022557600080fd5b62000233888389016200011f565b945060408701519150808211156200024a57600080fd5b5062000259878288016200011f565b606096909601519497939650505050565b600181811c908216806200027f57607f821691505b602082108103620002a057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002f6576000816000526020600020601f850160051c81016020861015620002d15750805b601f850160051c820191505b81811015620002f257828155600101620002dd565b5050505b505050565b81516001600160401b0381111562000317576200031762000109565b6200032f816200032884546200026a565b84620002a6565b602080601f8311600181146200036757600084156200034e5750858301515b600019600386901b1c1916600185901b178555620002f2565b600085815260208120601f198616915b82811015620003985788860151825594840194600190910190840162000377565b5085821015620003b75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b608051611991620003e3600039600061093a01526119916000f3fe60806040526004361061019b5760003560e01c8063715018a6116100ec578063a839e5011161008a578063c87b56dd11610064578063c87b56dd14610454578063d92d1bd614610474578063e985e9c5146104a4578063f2fde38b146104c457600080fd5b8063a839e50114610403578063b88d4fde14610418578063c002d23d1461043857600080fd5b8063902d55a5116100c6578063902d55a5146103a557806395d89b41146103bb5780639886a902146103d0578063a22cb465146103e357600080fd5b8063715018a61461035d57806376c64c62146103725780638da5cb5b1461038757600080fd5b806331b3eb941161015957806355f804b31161013357806355f804b3146102e85780636352211e146103085780636c0360eb1461032857806370a082311461033d57600080fd5b806331b3eb941461029557806332a93a3a146102b557806342842e0e146102c857600080fd5b80629a9b7b146101a057806301ffc9a7146101c957806306fdde03146101f9578063081812fc1461021b578063095ea7b31461025357806323b872dd14610275575b600080fd5b3480156101ac57600080fd5b506101b6600a5481565b6040519081526020015b60405180910390f35b3480156101d557600080fd5b506101e96101e436600461139c565b6104e4565b60405190151581526020016101c0565b34801561020557600080fd5b5061020e610536565b6040516101c091906113ff565b34801561022757600080fd5b5061023b610236366004611412565b6105c8565b6040516001600160a01b0390911681526020016101c0565b34801561025f57600080fd5b5061027361026e366004611440565b6105f1565b005b34801561028157600080fd5b5061027361029036600461146c565b610600565b3480156102a157600080fd5b506102736102b03660046114ad565b610690565b6101b66102c33660046114ad565b610711565b3480156102d457600080fd5b506102736102e336600461146c565b610748565b3480156102f457600080fd5b50610273610303366004611556565b610763565b34801561031457600080fd5b5061023b610323366004611412565b610777565b34801561033457600080fd5b5061020e610782565b34801561034957600080fd5b506101b66103583660046114ad565b610810565b34801561036957600080fd5b50610273610858565b34801561037e57600080fd5b5061027361086c565b34801561039357600080fd5b506006546001600160a01b031661023b565b3480156103b157600080fd5b506101b66109c481565b3480156103c757600080fd5b5061020e610888565b6101b66103de36600461159f565b610897565b3480156103ef57600080fd5b506102736103fe36600461162b565b610995565b34801561040f57600080fd5b506102736109a0565b34801561042457600080fd5b50610273610433366004611669565b6109bc565b34801561044457600080fd5b506101b667011c37937e08000081565b34801561046057600080fd5b5061020e61046f366004611412565b6109d3565b34801561048057600080fd5b506101e961048f3660046114ad565b60086020526000908152604090205460ff1681565b3480156104b057600080fd5b506101e96104bf3660046116e9565b610a59565b3480156104d057600080fd5b506102736104df3660046114ad565b610a87565b60006001600160e01b031982166380ac58cd60e01b148061051557506001600160e01b03198216635b5e139f60e01b145b8061053057506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461054590611717565b80601f016020809104026020016040519081016040528092919081815260200182805461057190611717565b80156105be5780601f10610593576101008083540402835291602001916105be565b820191906000526020600020905b8154815290600101906020018083116105a157829003601f168201915b5050505050905090565b60006105d382610ac5565b506000828152600460205260409020546001600160a01b0316610530565b6105fc828233610afe565b5050565b6001600160a01b03821661062f57604051633250574960e11b8152600060048201526024015b60405180910390fd5b600061063c838333610b0b565b9050836001600160a01b0316816001600160a01b03161461068a576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610626565b50505050565b610698610c04565b60405147906000906001600160a01b0384169083908381818185875af1925050503d80600081146106e5576040519150601f19603f3d011682016040523d82523d6000602084013e6106ea565b606091505b505090508061070c5760405163d23a9e8960e01b815260040160405180910390fd5b505050565b600061071c82610c31565b610724610c58565b61072c610c80565b61073582610ca4565b61073f6002610cde565b61053082610d25565b61070c838383604051806020016040528060008152506109bc565b61076b610c04565b60076105fc82826117a1565b600061053082610ac5565b6007805461078f90611717565b80601f01602080910402602001604051908101604052809291908181526020018280546107bb90611717565b80156108085780601f106107dd57610100808354040283529160200191610808565b820191906000526020600020905b8154815290600101906020018083116107eb57829003601f168201915b505050505081565b60006001600160a01b03821661083c576040516322718ad960e21b815260006004820152602401610626565b506001600160a01b031660009081526003602052604090205490565b610860610c04565b61086a6000610db1565b565b610874610c04565b61087e6001610cde565b61086a6002610e03565b60606001805461054590611717565b60006108a285610c31565b6108aa610c58565b6108b2610c80565b6108bb85610ca4565b6108c484610e88565b6040516bffffffffffffffffffffffff19606087901b166020820152603481018590526000906054016040516020818303038152906040528051906020012090506109658484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f00000000000000000000000000000000000000000000000000000000000000009250859150610ecd9050565b610982576040516309bde33960e01b815260040160405180910390fd5b61098b86610d25565b9695505050505050565b6105fc338383610ee3565b6109a8610c04565b6109b26000610cde565b61086a6001610e03565b6109c7848484610600565b61068a84848484610f82565b606060006109e083610777565b6001600160a01b031603610a075760405163d872946b60e01b815260040160405180910390fd5b600060078054610a1690611717565b905011610a325760405180602001604052806000815250610530565b6007604051602001610a449190611861565b60405160208183030381529060405292915050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610a8f610c04565b6001600160a01b038116610ab957604051631e4fbdf760e01b815260006004820152602401610626565b610ac281610db1565b50565b6000818152600260205260408120546001600160a01b03168061053057604051637e27328960e01b815260048101849052602401610626565b61070c83838360016110ab565b6000828152600260205260408120546001600160a01b0390811690831615610b3857610b388184866111b1565b6001600160a01b03811615610b7657610b556000856000806110ab565b6001600160a01b038116600090815260036020526040902080546000190190555b6001600160a01b03851615610ba5576001600160a01b0385166000908152600360205260409020805460010190555b60008481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6006546001600160a01b0316331461086a5760405163118cdaa760e01b8152336004820152602401610626565b6001600160a01b038116610ac25760405163e6c4247b60e01b815260040160405180910390fd5b67011c37937e080000341461086a576040516310f0c8f160e11b815260040160405180910390fd5b6109c4600a541061086a5760405163d05cb60960e01b815260040160405180910390fd5b6001600160a01b03811660009081526008602052604090205460ff1615610ac257604051631bbdf5c560e31b815260040160405180910390fd5b806002811115610cf057610cf06118ee565b60095460ff166002811115610d0757610d076118ee565b14610ac25760405163a1f6623960e01b815260040160405180910390fd5b6001600160a01b0381166000908152600860205260408120805460ff19166001179055600a805490819083610d5983611904565b9190505550610d688382611215565b604080518281524260208201526001600160a01b038516917f25b428dfde728ccfaddad7e29e4ac23c24ed7fd1a6e3e3f91894a9a073f5dfff910160405180910390a292915050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6009805460ff811691839160ff19166001836002811115610e2657610e266118ee565b0217905550816002811115610e3d57610e3d6118ee565b816002811115610e4f57610e4f6118ee565b60405142815233907f7a5907205f46c7df4a68b33c1da8921886b57f025f0ec67a42c38d2c2013a7849060200160405180910390a45050565b600060095460ff166002811115610ea157610ea16118ee565b148015610eaf575080600114155b15610ac257604051631eb49d6d60e11b815260040160405180910390fd5b600082610eda858461122f565b14949350505050565b6001600160a01b038216610f1557604051630b61174360e31b81526001600160a01b0383166004820152602401610626565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561068a57604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290610fc490339088908790879060040161192b565b6020604051808303816000875af1925050508015610fff575060408051601f3d908101601f19168201909252610ffc9181019061195e565b60015b611068573d80801561102d576040519150601f19603f3d011682016040523d82523d6000602084013e611032565b606091505b50805160000361106057604051633250574960e11b81526001600160a01b0385166004820152602401610626565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146110a457604051633250574960e11b81526001600160a01b0385166004820152602401610626565b5050505050565b80806110bf57506001600160a01b03821615155b156111815760006110cf84610ac5565b90506001600160a01b038316158015906110fb5750826001600160a01b0316816001600160a01b031614155b801561110e575061110c8184610a59565b155b156111375760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610626565b811561117f5783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6111bc838383611272565b61070c576001600160a01b0383166111ea57604051637e27328960e01b815260048101829052602401610626565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610626565b6105fc8282604051806020016040528060008152506112d8565b600081815b845181101561126a57611260828683815181106112535761125361197b565b60200260200101516112ef565b9150600101611234565b509392505050565b60006001600160a01b038316158015906112d05750826001600160a01b0316846001600160a01b031614806112ac57506112ac8484610a59565b806112d057506000828152600460205260409020546001600160a01b038481169116145b949350505050565b6112e28383611321565b61070c6000848484610f82565b600081831061130b57600082815260208490526040902061131a565b60008381526020839052604090205b9392505050565b6001600160a01b03821661134b57604051633250574960e11b815260006004820152602401610626565b600061135983836000610b0b565b90506001600160a01b0381161561070c576040516339e3563760e11b815260006004820152602401610626565b6001600160e01b031981168114610ac257600080fd5b6000602082840312156113ae57600080fd5b813561131a81611386565b6000815180845260005b818110156113df576020818501810151868301820152016113c3565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061131a60208301846113b9565b60006020828403121561142457600080fd5b5035919050565b6001600160a01b0381168114610ac257600080fd5b6000806040838503121561145357600080fd5b823561145e8161142b565b946020939093013593505050565b60008060006060848603121561148157600080fd5b833561148c8161142b565b9250602084013561149c8161142b565b929592945050506040919091013590565b6000602082840312156114bf57600080fd5b813561131a8161142b565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156114fb576114fb6114ca565b604051601f8501601f19908116603f01168101908282118183101715611523576115236114ca565b8160405280935085815286868601111561153c57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561156857600080fd5b813567ffffffffffffffff81111561157f57600080fd5b8201601f8101841361159057600080fd5b6112d0848235602084016114e0565b600080600080606085870312156115b557600080fd5b84356115c08161142b565b935060208501359250604085013567ffffffffffffffff808211156115e457600080fd5b818701915087601f8301126115f857600080fd5b81358181111561160757600080fd5b8860208260051b850101111561161c57600080fd5b95989497505060200194505050565b6000806040838503121561163e57600080fd5b82356116498161142b565b91506020830135801515811461165e57600080fd5b809150509250929050565b6000806000806080858703121561167f57600080fd5b843561168a8161142b565b9350602085013561169a8161142b565b925060408501359150606085013567ffffffffffffffff8111156116bd57600080fd5b8501601f810187136116ce57600080fd5b6116dd878235602084016114e0565b91505092959194509250565b600080604083850312156116fc57600080fd5b82356117078161142b565b9150602083013561165e8161142b565b600181811c9082168061172b57607f821691505b60208210810361174b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561070c576000816000526020600020601f850160051c8101602086101561177a5750805b601f850160051c820191505b8181101561179957828155600101611786565b505050505050565b815167ffffffffffffffff8111156117bb576117bb6114ca565b6117cf816117c98454611717565b84611751565b602080601f83116001811461180457600084156117ec5750858301515b600019600386901b1c1916600185901b178555611799565b600085815260208120601f198616915b8281101561183357888601518255948401946001909101908401611814565b50858210156118515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600080835461186f81611717565b60018281168015611887576001811461189c576118cb565b60ff19841687528215158302870194506118cb565b8760005260208060002060005b858110156118c25781548a8201529084019082016118a9565b50505082870194505b50506e636f756e63696c6d6574616461746160881b83525050600f019392505050565b634e487b7160e01b600052602160045260246000fd5b60006001820161192457634e487b7160e01b600052601160045260246000fd5b5060010190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061098b908301846113b9565b60006020828403121561197057600080fd5b815161131a81611386565b634e487b7160e01b600052603260045260246000fd \ No newline at end of file diff --git a/packages/generated/v3/abis/Member.json b/packages/generated/v3/abis/Member.json new file mode 100644 index 000000000..7ef7de2d0 --- /dev/null +++ b/packages/generated/v3/abis/Member.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"name_","type":"string","internalType":"string"},{"name":"symbol_","type":"string","internalType":"string"},{"name":"baseURI_","type":"string","internalType":"string"},{"name":"merkleRoot_","type":"bytes32","internalType":"bytes32"}],"stateMutability":"nonpayable"},{"type":"function","name":"MINT_PRICE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"TOTAL_SUPPLY","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"_hasMinted","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"approve","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"balanceOf","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"baseURI","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"currentTokenId","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getApproved","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"isApprovedForAll","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"ownerOf","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"privateMint","inputs":[{"name":"recipient","type":"address","internalType":"address"},{"name":"allowance","type":"uint256","internalType":"uint256"},{"name":"proof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"type":"function","name":"publicMint","inputs":[{"name":"recipient","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setApprovalForAll","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setBaseURI","inputs":[{"name":"baseURI_","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"startPublicMint","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"startWaitlistMint","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"tokenURI","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"withdrawPayments","inputs":[{"name":"payee","type":"address","internalType":"address payable"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"MintStateChanged","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"prevState","type":"uint8","indexed":true,"internalType":"enum Member.MintState"},{"name":"newState","type":"uint8","indexed":true,"internalType":"enum Member.MintState"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Minted","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"AlreadyMinted","inputs":[]},{"type":"error","name":"ERC721IncorrectOwner","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"ERC721InsufficientApproval","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC721InvalidApprover","inputs":[{"name":"approver","type":"address","internalType":"address"}]},{"type":"error","name":"ERC721InvalidOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}]},{"type":"error","name":"ERC721InvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"ERC721InvalidReceiver","inputs":[{"name":"receiver","type":"address","internalType":"address"}]},{"type":"error","name":"ERC721InvalidSender","inputs":[{"name":"sender","type":"address","internalType":"address"}]},{"type":"error","name":"ERC721NonexistentToken","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidAddress","inputs":[]},{"type":"error","name":"InvalidMintState","inputs":[]},{"type":"error","name":"InvalidProof","inputs":[]},{"type":"error","name":"MaxSupplyReached","inputs":[]},{"type":"error","name":"MintPriceNotPaid","inputs":[]},{"type":"error","name":"NonExistentTokenURI","inputs":[]},{"type":"error","name":"NotAllowed","inputs":[]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"WithdrawTransfer","inputs":[]}],"bytecode":{"object":"0x60a06040523480156200001157600080fd5b5060405162001d7438038062001d748339810160408190526200003491620001d1565b3384846000620000458382620002fb565b506001620000548282620002fb565b5050506001600160a01b0381166200008657604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6200009181620000b7565b506007620000a08382620002fb565b5060805250506009805460ff1916905550620003c7565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200013157600080fd5b81516001600160401b03808211156200014e576200014e62000109565b604051601f8301601f19908116603f0116810190828211818310171562000179576200017962000109565b81604052838152602092508660208588010111156200019757600080fd5b600091505b83821015620001bb57858201830151818301840152908201906200019c565b6000602085830101528094505050505092915050565b60008060008060808587031215620001e857600080fd5b84516001600160401b03808211156200020057600080fd5b6200020e888389016200011f565b955060208701519150808211156200022557600080fd5b62000233888389016200011f565b945060408701519150808211156200024a57600080fd5b5062000259878288016200011f565b606096909601519497939650505050565b600181811c908216806200027f57607f821691505b602082108103620002a057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002f6576000816000526020600020601f850160051c81016020861015620002d15750805b601f850160051c820191505b81811015620002f257828155600101620002dd565b5050505b505050565b81516001600160401b0381111562000317576200031762000109565b6200032f816200032884546200026a565b84620002a6565b602080601f8311600181146200036757600084156200034e5750858301515b600019600386901b1c1916600185901b178555620002f2565b600085815260208120601f198616915b82811015620003985788860151825594840194600190910190840162000377565b5085821015620003b75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b608051611991620003e3600039600061093a01526119916000f3fe60806040526004361061019b5760003560e01c8063715018a6116100ec578063a839e5011161008a578063c87b56dd11610064578063c87b56dd14610454578063d92d1bd614610474578063e985e9c5146104a4578063f2fde38b146104c457600080fd5b8063a839e50114610403578063b88d4fde14610418578063c002d23d1461043857600080fd5b8063902d55a5116100c6578063902d55a5146103a557806395d89b41146103bb5780639886a902146103d0578063a22cb465146103e357600080fd5b8063715018a61461035d57806376c64c62146103725780638da5cb5b1461038757600080fd5b806331b3eb941161015957806355f804b31161013357806355f804b3146102e85780636352211e146103085780636c0360eb1461032857806370a082311461033d57600080fd5b806331b3eb941461029557806332a93a3a146102b557806342842e0e146102c857600080fd5b80629a9b7b146101a057806301ffc9a7146101c957806306fdde03146101f9578063081812fc1461021b578063095ea7b31461025357806323b872dd14610275575b600080fd5b3480156101ac57600080fd5b506101b6600a5481565b6040519081526020015b60405180910390f35b3480156101d557600080fd5b506101e96101e436600461139c565b6104e4565b60405190151581526020016101c0565b34801561020557600080fd5b5061020e610536565b6040516101c091906113ff565b34801561022757600080fd5b5061023b610236366004611412565b6105c8565b6040516001600160a01b0390911681526020016101c0565b34801561025f57600080fd5b5061027361026e366004611440565b6105f1565b005b34801561028157600080fd5b5061027361029036600461146c565b610600565b3480156102a157600080fd5b506102736102b03660046114ad565b610690565b6101b66102c33660046114ad565b610711565b3480156102d457600080fd5b506102736102e336600461146c565b610748565b3480156102f457600080fd5b50610273610303366004611556565b610763565b34801561031457600080fd5b5061023b610323366004611412565b610777565b34801561033457600080fd5b5061020e610782565b34801561034957600080fd5b506101b66103583660046114ad565b610810565b34801561036957600080fd5b50610273610858565b34801561037e57600080fd5b5061027361086c565b34801561039357600080fd5b506006546001600160a01b031661023b565b3480156103b157600080fd5b506101b66109c481565b3480156103c757600080fd5b5061020e610888565b6101b66103de36600461159f565b610897565b3480156103ef57600080fd5b506102736103fe36600461162b565b610995565b34801561040f57600080fd5b506102736109a0565b34801561042457600080fd5b50610273610433366004611669565b6109bc565b34801561044457600080fd5b506101b667011c37937e08000081565b34801561046057600080fd5b5061020e61046f366004611412565b6109d3565b34801561048057600080fd5b506101e961048f3660046114ad565b60086020526000908152604090205460ff1681565b3480156104b057600080fd5b506101e96104bf3660046116e9565b610a59565b3480156104d057600080fd5b506102736104df3660046114ad565b610a87565b60006001600160e01b031982166380ac58cd60e01b148061051557506001600160e01b03198216635b5e139f60e01b145b8061053057506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461054590611717565b80601f016020809104026020016040519081016040528092919081815260200182805461057190611717565b80156105be5780601f10610593576101008083540402835291602001916105be565b820191906000526020600020905b8154815290600101906020018083116105a157829003601f168201915b5050505050905090565b60006105d382610ac5565b506000828152600460205260409020546001600160a01b0316610530565b6105fc828233610afe565b5050565b6001600160a01b03821661062f57604051633250574960e11b8152600060048201526024015b60405180910390fd5b600061063c838333610b0b565b9050836001600160a01b0316816001600160a01b03161461068a576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610626565b50505050565b610698610c04565b60405147906000906001600160a01b0384169083908381818185875af1925050503d80600081146106e5576040519150601f19603f3d011682016040523d82523d6000602084013e6106ea565b606091505b505090508061070c5760405163d23a9e8960e01b815260040160405180910390fd5b505050565b600061071c82610c31565b610724610c58565b61072c610c80565b61073582610ca4565b61073f6002610cde565b61053082610d25565b61070c838383604051806020016040528060008152506109bc565b61076b610c04565b60076105fc82826117a1565b600061053082610ac5565b6007805461078f90611717565b80601f01602080910402602001604051908101604052809291908181526020018280546107bb90611717565b80156108085780601f106107dd57610100808354040283529160200191610808565b820191906000526020600020905b8154815290600101906020018083116107eb57829003601f168201915b505050505081565b60006001600160a01b03821661083c576040516322718ad960e21b815260006004820152602401610626565b506001600160a01b031660009081526003602052604090205490565b610860610c04565b61086a6000610db1565b565b610874610c04565b61087e6001610cde565b61086a6002610e03565b60606001805461054590611717565b60006108a285610c31565b6108aa610c58565b6108b2610c80565b6108bb85610ca4565b6108c484610e88565b6040516bffffffffffffffffffffffff19606087901b166020820152603481018590526000906054016040516020818303038152906040528051906020012090506109658484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f00000000000000000000000000000000000000000000000000000000000000009250859150610ecd9050565b610982576040516309bde33960e01b815260040160405180910390fd5b61098b86610d25565b9695505050505050565b6105fc338383610ee3565b6109a8610c04565b6109b26000610cde565b61086a6001610e03565b6109c7848484610600565b61068a84848484610f82565b606060006109e083610777565b6001600160a01b031603610a075760405163d872946b60e01b815260040160405180910390fd5b600060078054610a1690611717565b905011610a325760405180602001604052806000815250610530565b6007604051602001610a449190611861565b60405160208183030381529060405292915050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610a8f610c04565b6001600160a01b038116610ab957604051631e4fbdf760e01b815260006004820152602401610626565b610ac281610db1565b50565b6000818152600260205260408120546001600160a01b03168061053057604051637e27328960e01b815260048101849052602401610626565b61070c83838360016110ab565b6000828152600260205260408120546001600160a01b0390811690831615610b3857610b388184866111b1565b6001600160a01b03811615610b7657610b556000856000806110ab565b6001600160a01b038116600090815260036020526040902080546000190190555b6001600160a01b03851615610ba5576001600160a01b0385166000908152600360205260409020805460010190555b60008481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6006546001600160a01b0316331461086a5760405163118cdaa760e01b8152336004820152602401610626565b6001600160a01b038116610ac25760405163e6c4247b60e01b815260040160405180910390fd5b67011c37937e080000341461086a576040516310f0c8f160e11b815260040160405180910390fd5b6109c4600a541061086a5760405163d05cb60960e01b815260040160405180910390fd5b6001600160a01b03811660009081526008602052604090205460ff1615610ac257604051631bbdf5c560e31b815260040160405180910390fd5b806002811115610cf057610cf06118ee565b60095460ff166002811115610d0757610d076118ee565b14610ac25760405163a1f6623960e01b815260040160405180910390fd5b6001600160a01b0381166000908152600860205260408120805460ff19166001179055600a805490819083610d5983611904565b9190505550610d688382611215565b604080518281524260208201526001600160a01b038516917f25b428dfde728ccfaddad7e29e4ac23c24ed7fd1a6e3e3f91894a9a073f5dfff910160405180910390a292915050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6009805460ff811691839160ff19166001836002811115610e2657610e266118ee565b0217905550816002811115610e3d57610e3d6118ee565b816002811115610e4f57610e4f6118ee565b60405142815233907f7a5907205f46c7df4a68b33c1da8921886b57f025f0ec67a42c38d2c2013a7849060200160405180910390a45050565b600060095460ff166002811115610ea157610ea16118ee565b148015610eaf575080600114155b15610ac257604051631eb49d6d60e11b815260040160405180910390fd5b600082610eda858461122f565b14949350505050565b6001600160a01b038216610f1557604051630b61174360e31b81526001600160a01b0383166004820152602401610626565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561068a57604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290610fc490339088908790879060040161192b565b6020604051808303816000875af1925050508015610fff575060408051601f3d908101601f19168201909252610ffc9181019061195e565b60015b611068573d80801561102d576040519150601f19603f3d011682016040523d82523d6000602084013e611032565b606091505b50805160000361106057604051633250574960e11b81526001600160a01b0385166004820152602401610626565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146110a457604051633250574960e11b81526001600160a01b0385166004820152602401610626565b5050505050565b80806110bf57506001600160a01b03821615155b156111815760006110cf84610ac5565b90506001600160a01b038316158015906110fb5750826001600160a01b0316816001600160a01b031614155b801561110e575061110c8184610a59565b155b156111375760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610626565b811561117f5783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6111bc838383611272565b61070c576001600160a01b0383166111ea57604051637e27328960e01b815260048101829052602401610626565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610626565b6105fc8282604051806020016040528060008152506112d8565b600081815b845181101561126a57611260828683815181106112535761125361197b565b60200260200101516112ef565b9150600101611234565b509392505050565b60006001600160a01b038316158015906112d05750826001600160a01b0316846001600160a01b031614806112ac57506112ac8484610a59565b806112d057506000828152600460205260409020546001600160a01b038481169116145b949350505050565b6112e28383611321565b61070c6000848484610f82565b600081831061130b57600082815260208490526040902061131a565b60008381526020839052604090205b9392505050565b6001600160a01b03821661134b57604051633250574960e11b815260006004820152602401610626565b600061135983836000610b0b565b90506001600160a01b0381161561070c576040516339e3563760e11b815260006004820152602401610626565b6001600160e01b031981168114610ac257600080fd5b6000602082840312156113ae57600080fd5b813561131a81611386565b6000815180845260005b818110156113df576020818501810151868301820152016113c3565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061131a60208301846113b9565b60006020828403121561142457600080fd5b5035919050565b6001600160a01b0381168114610ac257600080fd5b6000806040838503121561145357600080fd5b823561145e8161142b565b946020939093013593505050565b60008060006060848603121561148157600080fd5b833561148c8161142b565b9250602084013561149c8161142b565b929592945050506040919091013590565b6000602082840312156114bf57600080fd5b813561131a8161142b565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156114fb576114fb6114ca565b604051601f8501601f19908116603f01168101908282118183101715611523576115236114ca565b8160405280935085815286868601111561153c57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561156857600080fd5b813567ffffffffffffffff81111561157f57600080fd5b8201601f8101841361159057600080fd5b6112d0848235602084016114e0565b600080600080606085870312156115b557600080fd5b84356115c08161142b565b935060208501359250604085013567ffffffffffffffff808211156115e457600080fd5b818701915087601f8301126115f857600080fd5b81358181111561160757600080fd5b8860208260051b850101111561161c57600080fd5b95989497505060200194505050565b6000806040838503121561163e57600080fd5b82356116498161142b565b91506020830135801515811461165e57600080fd5b809150509250929050565b6000806000806080858703121561167f57600080fd5b843561168a8161142b565b9350602085013561169a8161142b565b925060408501359150606085013567ffffffffffffffff8111156116bd57600080fd5b8501601f810187136116ce57600080fd5b6116dd878235602084016114e0565b91505092959194509250565b600080604083850312156116fc57600080fd5b82356117078161142b565b9150602083013561165e8161142b565b600181811c9082168061172b57607f821691505b60208210810361174b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561070c576000816000526020600020601f850160051c8101602086101561177a5750805b601f850160051c820191505b8181101561179957828155600101611786565b505050505050565b815167ffffffffffffffff8111156117bb576117bb6114ca565b6117cf816117c98454611717565b84611751565b602080601f83116001811461180457600084156117ec5750858301515b600019600386901b1c1916600185901b178555611799565b600085815260208120601f198616915b8281101561183357888601518255948401946001909101908401611814565b50858210156118515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600080835461186f81611717565b60018281168015611887576001811461189c576118cb565b60ff19841687528215158302870194506118cb565b8760005260208060002060005b858110156118c25781548a8201529084019082016118a9565b50505082870194505b50506e636f756e63696c6d6574616461746160881b83525050600f019392505050565b634e487b7160e01b600052602160045260246000fd5b60006001820161192457634e487b7160e01b600052601160045260246000fd5b5060010190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061098b908301846113b9565b60006020828403121561197057600080fd5b815161131a81611386565b634e487b7160e01b600052603260045260246000fd","sourceMap":"384:7219:242:-:0;;;3045:262;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3197:10;3173:5;3180:7;1447:5:424;:13;3173:5:242;1447::424;:13;:::i;:::-;-1:-1:-1;1470:7:424;:17;1480:7;1470;:17;:::i;:::-;-1:-1:-1;;;;;;;;1273:26:398;;1269:95;;1322:31;;-1:-1:-1;;;1322:31:398;;1350:1;1322:31;;;4554:51:514;4527:18;;1322:31:398;;;;;;;1269:95;1373:32;1392:12;1373:18;:32::i;:::-;-1:-1:-1;3215:7:242::2;:18;3225:8:::0;3215:7;:18:::2;:::i;:::-;-1:-1:-1::0;3239:25:242::2;::::0;-1:-1:-1;;3270:10:242::2;:32:::0;;-1:-1:-1;;3270:32:242::2;::::0;;-1:-1:-1;384:7219:242;;2912:187:398;3004:6;;;-1:-1:-1;;;;;3020:17:398;;;-1:-1:-1;;;;;;3020:17:398;;;;;;;3052:40;;3004:6;;;3020:17;3004:6;;3052:40;;2985:16;;3052:40;2975:124;2912:187;:::o;14:127:514:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:844;200:5;253:3;246:4;238:6;234:17;230:27;220:55;;271:1;268;261:12;220:55;294:13;;-1:-1:-1;;;;;356:10:514;;;353:36;;;369:18;;:::i;:::-;444:2;438:9;412:2;498:13;;-1:-1:-1;;494:22:514;;;518:2;490:31;486:40;474:53;;;542:18;;;562:22;;;539:46;536:72;;;588:18;;:::i;:::-;628:10;624:2;617:22;663:2;655:6;648:18;685:4;675:14;;732:3;725:4;720:2;712:6;708:15;704:26;701:35;698:55;;;749:1;746;739:12;698:55;771:1;762:10;;781:133;795:2;792:1;789:9;781:133;;;883:14;;;879:23;;873:30;852:14;;;848:23;;841:63;806:10;;;;781:133;;;958:1;951:4;946:2;938:6;934:15;930:26;923:37;978:6;969:15;;;;;;146:844;;;;:::o;995:828::-;1122:6;1130;1138;1146;1199:3;1187:9;1178:7;1174:23;1170:33;1167:53;;;1216:1;1213;1206:12;1167:53;1243:16;;-1:-1:-1;;;;;1308:14:514;;;1305:34;;;1335:1;1332;1325:12;1305:34;1358:61;1411:7;1402:6;1391:9;1387:22;1358:61;:::i;:::-;1348:71;;1465:2;1454:9;1450:18;1444:25;1428:41;;1494:2;1484:8;1481:16;1478:36;;;1510:1;1507;1500:12;1478:36;1533:63;1588:7;1577:8;1566:9;1562:24;1533:63;:::i;:::-;1523:73;;1642:2;1631:9;1627:18;1621:25;1605:41;;1671:2;1661:8;1658:16;1655:36;;;1687:1;1684;1677:12;1655:36;;1710:63;1765:7;1754:8;1743:9;1739:24;1710:63;:::i;:::-;1813:2;1798:18;;;;1792:25;995:828;;;;-1:-1:-1;;;;995:828:514:o;1828:380::-;1907:1;1903:12;;;;1950;;;1971:61;;2025:4;2017:6;2013:17;2003:27;;1971:61;2078:2;2070:6;2067:14;2047:18;2044:38;2041:161;;2124:10;2119:3;2115:20;2112:1;2105:31;2159:4;2156:1;2149:15;2187:4;2184:1;2177:15;2041:161;;1828:380;;;:::o;2339:543::-;2441:2;2436:3;2433:11;2430:446;;;2477:1;2501:5;2498:1;2491:16;2545:4;2542:1;2532:18;2615:2;2603:10;2599:19;2596:1;2592:27;2586:4;2582:38;2651:4;2639:10;2636:20;2633:47;;;-1:-1:-1;2674:4:514;2633:47;2729:2;2724:3;2720:12;2717:1;2713:20;2707:4;2703:31;2693:41;;2784:82;2802:2;2795:5;2792:13;2784:82;;;2847:17;;;2828:1;2817:13;2784:82;;;2788:3;;;2430:446;2339:543;;;:::o;3058:1345::-;3178:10;;-1:-1:-1;;;;;3200:30:514;;3197:56;;;3233:18;;:::i;:::-;3262:97;3352:6;3312:38;3344:4;3338:11;3312:38;:::i;:::-;3306:4;3262:97;:::i;:::-;3414:4;;3471:2;3460:14;;3488:1;3483:663;;;;4190:1;4207:6;4204:89;;;-1:-1:-1;4259:19:514;;;4253:26;4204:89;-1:-1:-1;;3015:1:514;3011:11;;;3007:24;3003:29;2993:40;3039:1;3035:11;;;2990:57;4306:81;;3453:944;;3483:663;2286:1;2279:14;;;2323:4;2310:18;;-1:-1:-1;;3519:20:514;;;3637:236;3651:7;3648:1;3645:14;3637:236;;;3740:19;;;3734:26;3719:42;;3832:27;;;;3800:1;3788:14;;;;3667:19;;3637:236;;;3641:3;3901:6;3892:7;3889:19;3886:201;;;3962:19;;;3956:26;-1:-1:-1;;4045:1:514;4041:14;;;4057:3;4037:24;4033:37;4029:42;4014:58;3999:74;;3886:201;-1:-1:-1;;;;;4133:1:514;4117:14;;;4113:22;4100:36;;-1:-1:-1;3058:1345:514:o;4616:127::-;384:7219:242;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361061019b5760003560e01c8063715018a6116100ec578063a839e5011161008a578063c87b56dd11610064578063c87b56dd14610454578063d92d1bd614610474578063e985e9c5146104a4578063f2fde38b146104c457600080fd5b8063a839e50114610403578063b88d4fde14610418578063c002d23d1461043857600080fd5b8063902d55a5116100c6578063902d55a5146103a557806395d89b41146103bb5780639886a902146103d0578063a22cb465146103e357600080fd5b8063715018a61461035d57806376c64c62146103725780638da5cb5b1461038757600080fd5b806331b3eb941161015957806355f804b31161013357806355f804b3146102e85780636352211e146103085780636c0360eb1461032857806370a082311461033d57600080fd5b806331b3eb941461029557806332a93a3a146102b557806342842e0e146102c857600080fd5b80629a9b7b146101a057806301ffc9a7146101c957806306fdde03146101f9578063081812fc1461021b578063095ea7b31461025357806323b872dd14610275575b600080fd5b3480156101ac57600080fd5b506101b6600a5481565b6040519081526020015b60405180910390f35b3480156101d557600080fd5b506101e96101e436600461139c565b6104e4565b60405190151581526020016101c0565b34801561020557600080fd5b5061020e610536565b6040516101c091906113ff565b34801561022757600080fd5b5061023b610236366004611412565b6105c8565b6040516001600160a01b0390911681526020016101c0565b34801561025f57600080fd5b5061027361026e366004611440565b6105f1565b005b34801561028157600080fd5b5061027361029036600461146c565b610600565b3480156102a157600080fd5b506102736102b03660046114ad565b610690565b6101b66102c33660046114ad565b610711565b3480156102d457600080fd5b506102736102e336600461146c565b610748565b3480156102f457600080fd5b50610273610303366004611556565b610763565b34801561031457600080fd5b5061023b610323366004611412565b610777565b34801561033457600080fd5b5061020e610782565b34801561034957600080fd5b506101b66103583660046114ad565b610810565b34801561036957600080fd5b50610273610858565b34801561037e57600080fd5b5061027361086c565b34801561039357600080fd5b506006546001600160a01b031661023b565b3480156103b157600080fd5b506101b66109c481565b3480156103c757600080fd5b5061020e610888565b6101b66103de36600461159f565b610897565b3480156103ef57600080fd5b506102736103fe36600461162b565b610995565b34801561040f57600080fd5b506102736109a0565b34801561042457600080fd5b50610273610433366004611669565b6109bc565b34801561044457600080fd5b506101b667011c37937e08000081565b34801561046057600080fd5b5061020e61046f366004611412565b6109d3565b34801561048057600080fd5b506101e961048f3660046114ad565b60086020526000908152604090205460ff1681565b3480156104b057600080fd5b506101e96104bf3660046116e9565b610a59565b3480156104d057600080fd5b506102736104df3660046114ad565b610a87565b60006001600160e01b031982166380ac58cd60e01b148061051557506001600160e01b03198216635b5e139f60e01b145b8061053057506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461054590611717565b80601f016020809104026020016040519081016040528092919081815260200182805461057190611717565b80156105be5780601f10610593576101008083540402835291602001916105be565b820191906000526020600020905b8154815290600101906020018083116105a157829003601f168201915b5050505050905090565b60006105d382610ac5565b506000828152600460205260409020546001600160a01b0316610530565b6105fc828233610afe565b5050565b6001600160a01b03821661062f57604051633250574960e11b8152600060048201526024015b60405180910390fd5b600061063c838333610b0b565b9050836001600160a01b0316816001600160a01b03161461068a576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610626565b50505050565b610698610c04565b60405147906000906001600160a01b0384169083908381818185875af1925050503d80600081146106e5576040519150601f19603f3d011682016040523d82523d6000602084013e6106ea565b606091505b505090508061070c5760405163d23a9e8960e01b815260040160405180910390fd5b505050565b600061071c82610c31565b610724610c58565b61072c610c80565b61073582610ca4565b61073f6002610cde565b61053082610d25565b61070c838383604051806020016040528060008152506109bc565b61076b610c04565b60076105fc82826117a1565b600061053082610ac5565b6007805461078f90611717565b80601f01602080910402602001604051908101604052809291908181526020018280546107bb90611717565b80156108085780601f106107dd57610100808354040283529160200191610808565b820191906000526020600020905b8154815290600101906020018083116107eb57829003601f168201915b505050505081565b60006001600160a01b03821661083c576040516322718ad960e21b815260006004820152602401610626565b506001600160a01b031660009081526003602052604090205490565b610860610c04565b61086a6000610db1565b565b610874610c04565b61087e6001610cde565b61086a6002610e03565b60606001805461054590611717565b60006108a285610c31565b6108aa610c58565b6108b2610c80565b6108bb85610ca4565b6108c484610e88565b6040516bffffffffffffffffffffffff19606087901b166020820152603481018590526000906054016040516020818303038152906040528051906020012090506109658484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f00000000000000000000000000000000000000000000000000000000000000009250859150610ecd9050565b610982576040516309bde33960e01b815260040160405180910390fd5b61098b86610d25565b9695505050505050565b6105fc338383610ee3565b6109a8610c04565b6109b26000610cde565b61086a6001610e03565b6109c7848484610600565b61068a84848484610f82565b606060006109e083610777565b6001600160a01b031603610a075760405163d872946b60e01b815260040160405180910390fd5b600060078054610a1690611717565b905011610a325760405180602001604052806000815250610530565b6007604051602001610a449190611861565b60405160208183030381529060405292915050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610a8f610c04565b6001600160a01b038116610ab957604051631e4fbdf760e01b815260006004820152602401610626565b610ac281610db1565b50565b6000818152600260205260408120546001600160a01b03168061053057604051637e27328960e01b815260048101849052602401610626565b61070c83838360016110ab565b6000828152600260205260408120546001600160a01b0390811690831615610b3857610b388184866111b1565b6001600160a01b03811615610b7657610b556000856000806110ab565b6001600160a01b038116600090815260036020526040902080546000190190555b6001600160a01b03851615610ba5576001600160a01b0385166000908152600360205260409020805460010190555b60008481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6006546001600160a01b0316331461086a5760405163118cdaa760e01b8152336004820152602401610626565b6001600160a01b038116610ac25760405163e6c4247b60e01b815260040160405180910390fd5b67011c37937e080000341461086a576040516310f0c8f160e11b815260040160405180910390fd5b6109c4600a541061086a5760405163d05cb60960e01b815260040160405180910390fd5b6001600160a01b03811660009081526008602052604090205460ff1615610ac257604051631bbdf5c560e31b815260040160405180910390fd5b806002811115610cf057610cf06118ee565b60095460ff166002811115610d0757610d076118ee565b14610ac25760405163a1f6623960e01b815260040160405180910390fd5b6001600160a01b0381166000908152600860205260408120805460ff19166001179055600a805490819083610d5983611904565b9190505550610d688382611215565b604080518281524260208201526001600160a01b038516917f25b428dfde728ccfaddad7e29e4ac23c24ed7fd1a6e3e3f91894a9a073f5dfff910160405180910390a292915050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6009805460ff811691839160ff19166001836002811115610e2657610e266118ee565b0217905550816002811115610e3d57610e3d6118ee565b816002811115610e4f57610e4f6118ee565b60405142815233907f7a5907205f46c7df4a68b33c1da8921886b57f025f0ec67a42c38d2c2013a7849060200160405180910390a45050565b600060095460ff166002811115610ea157610ea16118ee565b148015610eaf575080600114155b15610ac257604051631eb49d6d60e11b815260040160405180910390fd5b600082610eda858461122f565b14949350505050565b6001600160a01b038216610f1557604051630b61174360e31b81526001600160a01b0383166004820152602401610626565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561068a57604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290610fc490339088908790879060040161192b565b6020604051808303816000875af1925050508015610fff575060408051601f3d908101601f19168201909252610ffc9181019061195e565b60015b611068573d80801561102d576040519150601f19603f3d011682016040523d82523d6000602084013e611032565b606091505b50805160000361106057604051633250574960e11b81526001600160a01b0385166004820152602401610626565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146110a457604051633250574960e11b81526001600160a01b0385166004820152602401610626565b5050505050565b80806110bf57506001600160a01b03821615155b156111815760006110cf84610ac5565b90506001600160a01b038316158015906110fb5750826001600160a01b0316816001600160a01b031614155b801561110e575061110c8184610a59565b155b156111375760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610626565b811561117f5783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6111bc838383611272565b61070c576001600160a01b0383166111ea57604051637e27328960e01b815260048101829052602401610626565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610626565b6105fc8282604051806020016040528060008152506112d8565b600081815b845181101561126a57611260828683815181106112535761125361197b565b60200260200101516112ef565b9150600101611234565b509392505050565b60006001600160a01b038316158015906112d05750826001600160a01b0316846001600160a01b031614806112ac57506112ac8484610a59565b806112d057506000828152600460205260409020546001600160a01b038481169116145b949350505050565b6112e28383611321565b61070c6000848484610f82565b600081831061130b57600082815260208490526040902061131a565b60008381526020839052604090205b9392505050565b6001600160a01b03821661134b57604051633250574960e11b815260006004820152602401610626565b600061135983836000610b0b565b90506001600160a01b0381161561070c576040516339e3563760e11b815260006004820152602401610626565b6001600160e01b031981168114610ac257600080fd5b6000602082840312156113ae57600080fd5b813561131a81611386565b6000815180845260005b818110156113df576020818501810151868301820152016113c3565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061131a60208301846113b9565b60006020828403121561142457600080fd5b5035919050565b6001600160a01b0381168114610ac257600080fd5b6000806040838503121561145357600080fd5b823561145e8161142b565b946020939093013593505050565b60008060006060848603121561148157600080fd5b833561148c8161142b565b9250602084013561149c8161142b565b929592945050506040919091013590565b6000602082840312156114bf57600080fd5b813561131a8161142b565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156114fb576114fb6114ca565b604051601f8501601f19908116603f01168101908282118183101715611523576115236114ca565b8160405280935085815286868601111561153c57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561156857600080fd5b813567ffffffffffffffff81111561157f57600080fd5b8201601f8101841361159057600080fd5b6112d0848235602084016114e0565b600080600080606085870312156115b557600080fd5b84356115c08161142b565b935060208501359250604085013567ffffffffffffffff808211156115e457600080fd5b818701915087601f8301126115f857600080fd5b81358181111561160757600080fd5b8860208260051b850101111561161c57600080fd5b95989497505060200194505050565b6000806040838503121561163e57600080fd5b82356116498161142b565b91506020830135801515811461165e57600080fd5b809150509250929050565b6000806000806080858703121561167f57600080fd5b843561168a8161142b565b9350602085013561169a8161142b565b925060408501359150606085013567ffffffffffffffff8111156116bd57600080fd5b8501601f810187136116ce57600080fd5b6116dd878235602084016114e0565b91505092959194509250565b600080604083850312156116fc57600080fd5b82356117078161142b565b9150602083013561165e8161142b565b600181811c9082168061172b57607f821691505b60208210810361174b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561070c576000816000526020600020601f850160051c8101602086101561177a5750805b601f850160051c820191505b8181101561179957828155600101611786565b505050505050565b815167ffffffffffffffff8111156117bb576117bb6114ca565b6117cf816117c98454611717565b84611751565b602080601f83116001811461180457600084156117ec5750858301515b600019600386901b1c1916600185901b178555611799565b600085815260208120601f198616915b8281101561183357888601518255948401946001909101908401611814565b50858210156118515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600080835461186f81611717565b60018281168015611887576001811461189c576118cb565b60ff19841687528215158302870194506118cb565b8760005260208060002060005b858110156118c25781548a8201529084019082016118a9565b50505082870194505b50506e636f756e63696c6d6574616461746160881b83525050600f019392505050565b634e487b7160e01b600052602160045260246000fd5b60006001820161192457634e487b7160e01b600052601160045260246000fd5b5060010190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061098b908301846113b9565b60006020828403121561197057600080fd5b815161131a81611386565b634e487b7160e01b600052603260045260246000fd","sourceMap":"384:7219:242:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2834:29;;;;;;;;;;;;;;;;;;;160:25:514;;;148:2;133:18;2834:29:242;;;;;;;;1561:300:424;;;;;;;;;;-1:-1:-1;1561:300:424;;;;;:::i;:::-;;:::i;:::-;;;747:14:514;;740:22;722:41;;710:2;695:18;1561:300:424;582:187:514;2365:89:424;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3497:154::-;;;;;;;;;;-1:-1:-1;3497:154:424;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1776:32:514;;;1758:51;;1746:2;1731:18;3497:154:424;1612:203:514;3323:113:424;;;;;;;;;;-1:-1:-1;3323:113:424;;;;;:::i;:::-;;:::i;:::-;;4143:578;;;;;;;;;;-1:-1:-1;4143:578:424;;;;;:::i;:::-;;:::i;5868:238:242:-;;;;;;;;;;-1:-1:-1;5868:238:242;;;;;:::i;:::-;;:::i;3995:272::-;;;;;;:::i;:::-;;:::i;4787:132:424:-;;;;;;;;;;-1:-1:-1;4787:132:424;;;;;:::i;:::-;;:::i;4454:92:242:-;;;;;;;;;;-1:-1:-1;4454:92:242;;;;;:::i;:::-;;:::i;2185:118:424:-;;;;;;;;;;-1:-1:-1;2185:118:424;;;;;:::i;:::-;;:::i;2470:21:242:-;;;;;;;;;;;;;:::i;1920:208:424:-;;;;;;;;;;-1:-1:-1;1920:208:424;;;;;:::i;:::-;;:::i;2293:101:398:-;;;;;;;;;;;;;:::i;5439:124:242:-;;;;;;;;;;;;;:::i;1638:85:398:-;;;;;;;;;;-1:-1:-1;1710:6:398;;-1:-1:-1;;;;;1710:6:398;1638:85;;2118:43:242;;;;;;;;;;;;2157:4;2118:43;;2518:93:424;;;;;;;;;;;;;:::i;3489:502:242:-;;;;;;:::i;:::-;;:::i;3718:144:424:-;;;;;;;;;;-1:-1:-1;3718:144:424;;;;;:::i;:::-;;:::i;5306:129:242:-;;;;;;;;;;;;;:::i;4985:208:424:-;;;;;;;;;;-1:-1:-1;4985:208:424;;;;;:::i;:::-;;:::i;2217:47:242:-;;;;;;;;;;;;2254:10;2217:47;;4813:305;;;;;;;;;;-1:-1:-1;4813:305:242;;;;;:::i;:::-;;:::i;2558:42::-;;;;;;;;;;-1:-1:-1;2558:42:242;;;;;:::i;:::-;;;;;;;;;;;;;;;;3928:153:424;;;;;;;;;;-1:-1:-1;3928:153:424;;;;;:::i;:::-;;:::i;2543:215:398:-;;;;;;;;;;-1:-1:-1;2543:215:398;;;;;:::i;:::-;;:::i;1561:300:424:-;1663:4;-1:-1:-1;;;;;;1698:40:424;;-1:-1:-1;;;1698:40:424;;:104;;-1:-1:-1;;;;;;;1754:48:424;;-1:-1:-1;;;1754:48:424;1698:104;:156;;;-1:-1:-1;;;;;;;;;;861:40:441;;;1818:36:424;1679:175;1561:300;-1:-1:-1;;1561:300:424:o;2365:89::-;2410:13;2442:5;2435:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2365:89;:::o;3497:154::-;3564:7;3583:22;3597:7;3583:13;:22::i;:::-;-1:-1:-1;6008:7:424;6034:24;;;:15;:24;;;;;;-1:-1:-1;;;;;6034:24:424;3623:21;5938:127;3323:113;3394:35;3403:2;3407:7;735:10:430;3394:8:424;:35::i;:::-;3323:113;;:::o;4143:578::-;-1:-1:-1;;;;;4237:16:424;;4233:87;;4276:33;;-1:-1:-1;;;4276:33:424;;4306:1;4276:33;;;1758:51:514;1731:18;;4276:33:424;;;;;;;;4233:87;4538:21;4562:34;4570:2;4574:7;735:10:430;4562:7:424;:34::i;:::-;4538:58;;4627:4;-1:-1:-1;;;;;4610:21:424;:13;-1:-1:-1;;;;;4610:21:424;;4606:109;;4654:50;;-1:-1:-1;;;4654:50:424;;-1:-1:-1;;;;;7554:15:514;;;4654:50:424;;;7536:34:514;7586:18;;;7579:34;;;7649:15;;7629:18;;;7622:43;7471:18;;4654:50:424;7296:375:514;4606:109:424;4223:498;4143:578;;;:::o;5868:238:242:-;1531:13:398;:11;:13::i;:::-;6009:30:242::1;::::0;5960:21:::1;::::0;5942:15:::1;::::0;-1:-1:-1;;;;;6009:10:242;::::1;::::0;5960:21;;5942:15;6009:30;5942:15;6009:30;5960:21;6009:10;:30:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5987:52;;;6050:10;6045:57;;6077:18;;-1:-1:-1::0;;;6077:18:242::1;;;;;;;;;;;6045:57;5936:170;;5868:238:::0;:::o;3995:272::-;4060:7;4075:34;4099:9;4075:23;:34::i;:::-;4115:20;:18;:20::i;:::-;4141;:18;:20::i;:::-;4167:26;4183:9;4167:15;:26::i;:::-;4199:32;4214:16;4199:14;:32::i;:::-;4244:18;4252:9;4244:7;:18::i;4787:132:424:-;4873:39;4890:4;4896:2;4900:7;4873:39;;;;;;;;;;;;:16;:39::i;4454:92:242:-;1531:13:398;:11;:13::i;:::-;4523:7:242::1;:18;4533:8:::0;4523:7;:18:::1;:::i;2185:118:424:-:0;2248:7;2274:22;2288:7;2274:13;:22::i;2470:21:242:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1920:208:424:-;1983:7;-1:-1:-1;;;;;2006:19:424;;2002:87;;2048:30;;-1:-1:-1;;;2048:30:424;;2075:1;2048:30;;;1758:51:514;1731:18;;2048:30:424;1612:203:514;2002:87:424;-1:-1:-1;;;;;;2105:16:424;;;;;:9;:16;;;;;;;1920:208::o;2293:101:398:-;1531:13;:11;:13::i;:::-;2357:30:::1;2384:1;2357:18;:30::i;:::-;2293:101::o:0;5439:124:242:-;1531:13:398;:11;:13::i;:::-;5491:34:242::1;5506:18;5491:14;:34::i;:::-;5531:27;5541:16;5531:9;:27::i;2518:93:424:-:0;2565:13;2597:7;2590:14;;;;;:::i;3489:502:242:-;3616:7;3631:34;3655:9;3631:23;:34::i;:::-;3671:20;:18;:20::i;:::-;3697;:18;:20::i;:::-;3723:26;3739:9;3723:15;:26::i;:::-;3755:29;3774:9;3755:18;:29::i;:::-;3819:38;;-1:-1:-1;;10258:2:514;10254:15;;;10250:53;3819:38:242;;;10238:66:514;10320:12;;;10313:28;;;3791:15:242;;10357:12:514;;3819:38:242;;;;;;;;;;;;3809:49;;;;;;3791:67;;3870:47;3889:5;;3870:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3896:11:242;;-1:-1:-1;3909:7:242;;-1:-1:-1;3870:18:242;;-1:-1:-1;3870:47:242:i;:::-;3865:90;;3934:14;;-1:-1:-1;;;3934:14:242;;;;;;;;;;;3865:90;3968:18;3976:9;3968:7;:18::i;:::-;3961:25;3489:502;-1:-1:-1;;;;;;3489:502:242:o;3718:144:424:-;3803:52;735:10:430;3836:8:424;3846;3803:18;:52::i;5306:129:242:-;1531:13:398;:11;:13::i;:::-;5360:35:242::1;5375:19;5360:14;:35::i;:::-;5401:29;5411:18;5401:9;:29::i;4985:208:424:-:0;5098:31;5111:4;5117:2;5121:7;5098:12;:31::i;:::-;5139:47;5162:4;5168:2;5172:7;5181:4;5139:22;:47::i;4813:305:242:-;4894:13;4947:1;4919:16;4927:7;4919;:16::i;:::-;-1:-1:-1;;;;;4919:30:242;;4915:79;;4966:21;;-1:-1:-1;;;4966:21:242;;;;;;;;;;;4915:79;5036:1;5018:7;5012:21;;;;;:::i;:::-;;;:25;:101;;;;;;;;;;;;;;;;;5072:7;5055:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;4999:114;4813:305;-1:-1:-1;;4813:305:242:o;3928:153:424:-;-1:-1:-1;;;;;4039:25:424;;;4016:4;4039:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;3928:153::o;2543:215:398:-;1531:13;:11;:13::i;:::-;-1:-1:-1;;;;;2627:22:398;::::1;2623:91;;2672:31;::::0;-1:-1:-1;;;2672:31:398;;2700:1:::1;2672:31;::::0;::::1;1758:51:514::0;1731:18;;2672:31:398::1;1612:203:514::0;2623:91:398::1;2723:28;2742:8;2723:18;:28::i;:::-;2543:215:::0;:::o;16138:241:424:-;16201:7;5799:16;;;:7;:16;;;;;;-1:-1:-1;;;;;5799:16:424;;16263:88;;16309:31;;-1:-1:-1;;;16309:31:424;;;;;160:25:514;;;133:18;;16309:31:424;14:177:514;14418:120:424;14498:33;14507:2;14511:7;14520:4;14526;14498:8;:33::i;8838:795::-;8924:7;5799:16;;;:7;:16;;;;;;-1:-1:-1;;;;;5799:16:424;;;;9035:18;;;9031:86;;9069:37;9086:4;9092;9098:7;9069:16;:37::i;:::-;-1:-1:-1;;;;;9161:18:424;;;9157:256;;9277:48;9294:1;9298:7;9315:1;9319:5;9277:8;:48::i;:::-;-1:-1:-1;;;;;9368:15:424;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;9368:20:424;;;9157:256;-1:-1:-1;;;;;9427:16:424;;;9423:107;;-1:-1:-1;;;;;9487:13:424;;;;;;:9;:13;;;;;:18;;9504:1;9487:18;;;9423:107;9540:16;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9540:21:424;-1:-1:-1;;;;;9540:21:424;;;;;;;;;9577:27;;9540:16;;9577:27;;;;;;;9622:4;8838:795;-1:-1:-1;;;;8838:795:424:o;1796:162:398:-;1710:6;;-1:-1:-1;;;;;1710:6:398;735:10:430;1855:23:398;1851:101;;1901:40;;-1:-1:-1;;;1901:40:398;;735:10:430;1901:40:398;;;1758:51:514;1731:18;;1901:40:398;1612:203:514;6759:143:242;-1:-1:-1;;;;;6835:23:242;;6831:67;;6875:16;;-1:-1:-1;;;6875:16:242;;;;;;;;;;;7478:123;2254:10;7532:9;:23;7528:69;;7572:18;;-1:-1:-1;;;7572:18:242;;;;;;;;;;;6906:130;2157:4;6960:14;;:30;6956:76;;7007:18;;-1:-1:-1;;;7007:18:242;;;;;;;;;;;7342:132;-1:-1:-1;;;;;7410:21:242;;;;;;:10;:21;;;;;;;;7406:64;;;7448:15;;-1:-1:-1;;;7448:15:242;;;;;;;;;;;7040:132;7120:6;7106:20;;;;;;;;:::i;:::-;:10;;;;:20;;;;;;;;:::i;:::-;;7102:66;;7143:18;;-1:-1:-1;;;7143:18:242;;;;;;;;;;;6291:271;-1:-1:-1;;;;;6360:21:242;;6345:7;6360:21;;;:10;:21;;;;;:28;;-1:-1:-1;;6360:28:242;6384:4;6360:28;;;6412:14;;;;;;6345:7;6432:16;6412:14;6432:16;:::i;:::-;;;;;;6454:29;6464:9;6475:7;6454:9;:29::i;:::-;6494:43;;;11920:25:514;;;6521:15:242;11976:2:514;11961:18;;11954:34;-1:-1:-1;;;;;6494:43:242;;;;;11893:18:514;6494:43:242;;;;;;;6550:7;6291:271;-1:-1:-1;;6291:271:242:o;2912:187:398:-;3004:6;;;-1:-1:-1;;;;;3020:17:398;;;-1:-1:-1;;;;;;3020:17:398;;;;;;;3052:40;;3004:6;;;3020:17;3004:6;;3052:40;;2985:16;;3052:40;2975:124;2912:187;:::o;6566:189:242:-;6640:10;;;;;;;6669:6;;-1:-1:-1;;6656:19:242;6640:10;6669:6;6656:19;;;;;;;;:::i;:::-;;;;;;6726:6;6686:64;;;;;;;;:::i;:::-;6715:9;6686:64;;;;;;;;:::i;:::-;;;6734:15;160:25:514;;6703:10:242;;6686:64;;148:2:514;133:18;6686:64:242;;;;;;;6612:143;6566:189;:::o;7176:162::-;7261:19;7247:10;;;;:33;;;;;;;;:::i;:::-;;:51;;;;;7284:9;7297:1;7284:14;;7247:51;7243:91;;;7315:12;;-1:-1:-1;;;7315:12:242;;;;;;;;;;;1265:154:439;1356:4;1408;1379:25;1392:5;1399:4;1379:12;:25::i;:::-;:33;;1265:154;-1:-1:-1;;;;1265:154:439:o;15591:312:424:-;-1:-1:-1;;;;;15698:22:424;;15694:91;;15743:31;;-1:-1:-1;;;15743:31:424;;-1:-1:-1;;;;;1776:32:514;;15743:31:424;;;1758:51:514;1731:18;;15743:31:424;1612:203:514;15694:91:424;-1:-1:-1;;;;;15794:25:424;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;15794:46:424;;;;;;;;;;15855:41;;722::514;;;15855::424;;695:18:514;15855:41:424;;;;;;;15591:312;;;:::o;16918:782::-;-1:-1:-1;;;;;17034:14:424;;;:18;17030:664;;17072:71;;-1:-1:-1;;;17072:71:424;;-1:-1:-1;;;;;17072:36:424;;;;;:71;;735:10:430;;17123:4:424;;17129:7;;17138:4;;17072:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17072:71:424;;;;;;;;-1:-1:-1;;17072:71:424;;;;;;;;;;;;:::i;:::-;;;17068:616;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17381:6;:13;17398:1;17381:18;17377:293;;17430:25;;-1:-1:-1;;;17430:25:424;;-1:-1:-1;;;;;1776:32:514;;17430:25:424;;;1758:51:514;1731:18;;17430:25:424;1612:203:514;17377:293:424;17622:6;17616:13;17607:6;17603:2;17599:15;17592:38;17068:616;-1:-1:-1;;;;;;17190:51:424;;-1:-1:-1;;;17190:51:424;17186:130;;17272:25;;-1:-1:-1;;;17272:25:424;;-1:-1:-1;;;;;1776:32:514;;17272:25:424;;;1758:51:514;1731:18;;17272:25:424;1612:203:514;17186:130:424;17144:186;16918:782;;;;:::o;14720:662::-;14880:9;:31;;;-1:-1:-1;;;;;;14893:18:424;;;;14880:31;14876:460;;;14927:13;14943:22;14957:7;14943:13;:22::i;:::-;14927:38;-1:-1:-1;;;;;;15093:18:424;;;;;;:35;;;15124:4;-1:-1:-1;;;;;15115:13:424;:5;-1:-1:-1;;;;;15115:13:424;;;15093:35;:69;;;;;15133:29;15150:5;15157:4;15133:16;:29::i;:::-;15132:30;15093:69;15089:142;;;15189:27;;-1:-1:-1;;;15189:27:424;;-1:-1:-1;;;;;1776:32:514;;15189:27:424;;;1758:51:514;1731:18;;15189:27:424;1612:203:514;15089:142:424;15249:9;15245:81;;;15303:7;15299:2;-1:-1:-1;;;;;15283:28:424;15292:5;-1:-1:-1;;;;;15283:28:424;;;;;;;;;;;15245:81;14913:423;14876:460;-1:-1:-1;;15346:24:424;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;15346:29:424;-1:-1:-1;;;;;15346:29:424;;;;;;;;;;14720:662::o;7082:368::-;7194:38;7208:5;7215:7;7224;7194:13;:38::i;:::-;7189:255;;-1:-1:-1;;;;;7252:19:424;;7248:186;;7298:31;;-1:-1:-1;;;7298:31:424;;;;;160:25:514;;;133:18;;7298:31:424;14:177:514;7248:186:424;7375:44;;-1:-1:-1;;;7375:44:424;;-1:-1:-1;;;;;12939:32:514;;7375:44:424;;;12921:51:514;12988:18;;;12981:34;;;12894:18;;7375:44:424;12747:274:514;10633:100:424;10700:26;10710:2;10714:7;10700:26;;;;;;;;;;;;:9;:26::i;1967:290:439:-;2050:7;2092:4;2050:7;2106:116;2130:5;:12;2126:1;:16;2106:116;;;2178:33;2188:12;2202:5;2208:1;2202:8;;;;;;;;:::i;:::-;;;;;;;2178:9;:33::i;:::-;2163:48;-1:-1:-1;2144:3:439;;2106:116;;;-1:-1:-1;2238:12:439;1967:290;-1:-1:-1;;;1967:290:439:o;6376:272:424:-;6479:4;-1:-1:-1;;;;;6514:21:424;;;;;;:127;;;6561:7;-1:-1:-1;;;;;6552:16:424;:5;-1:-1:-1;;;;;6552:16:424;;:52;;;;6572:32;6589:5;6596:7;6572:16;:32::i;:::-;6552:88;;;-1:-1:-1;6008:7:424;6034:24;;;:15;:24;;;;;;-1:-1:-1;;;;;6608:32:424;;;6034:24;;6608:32;6552:88;6495:146;6376:272;-1:-1:-1;;;;6376:272:424:o;10954:182::-;11048:18;11054:2;11058:7;11048:5;:18::i;:::-;11076:53;11107:1;11111:2;11115:7;11124:4;11076:22;:53::i;9229:147:439:-;9292:7;9322:1;9318;:5;:51;;9564:13;9655:15;;;9690:4;9683:15;;;9736:4;9720:21;;9318:51;;;9564:13;9655:15;;;9690:4;9683:15;;;9736:4;9720:21;;9326:20;9311:58;9229:147;-1:-1:-1;;;9229:147:439:o;9955:327:424:-;-1:-1:-1;;;;;10022:16:424;;10018:87;;10061:33;;-1:-1:-1;;;10061:33:424;;10091:1;10061:33;;;1758:51:514;1731:18;;10061:33:424;1612:203:514;10018:87:424;10114:21;10138:32;10146:2;10150:7;10167:1;10138:7;:32::i;:::-;10114:56;-1:-1:-1;;;;;;10184:27:424;;;10180:96;;10234:31;;-1:-1:-1;;;10234:31:424;;10262:1;10234:31;;;1758:51:514;1731:18;;10234:31:424;1612:203:514;196:131;-1:-1:-1;;;;;;270:32:514;;260:43;;250:71;;317:1;314;307:12;332:245;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;498:9;485:23;517:30;541:5;517:30;:::i;774:423::-;816:3;854:5;848:12;881:6;876:3;869:19;906:1;916:162;930:6;927:1;924:13;916:162;;;992:4;1048:13;;;1044:22;;1038:29;1020:11;;;1016:20;;1009:59;945:12;916:162;;;920:3;1123:1;1116:4;1107:6;1102:3;1098:16;1094:27;1087:38;1186:4;1179:2;1175:7;1170:2;1162:6;1158:15;1154:29;1149:3;1145:39;1141:50;1134:57;;;774:423;;;;:::o;1202:220::-;1351:2;1340:9;1333:21;1314:4;1371:45;1412:2;1401:9;1397:18;1389:6;1371:45;:::i;1427:180::-;1486:6;1539:2;1527:9;1518:7;1514:23;1510:32;1507:52;;;1555:1;1552;1545:12;1507:52;-1:-1:-1;1578:23:514;;1427:180;-1:-1:-1;1427:180:514:o;1820:131::-;-1:-1:-1;;;;;1895:31:514;;1885:42;;1875:70;;1941:1;1938;1931:12;1956:315;2024:6;2032;2085:2;2073:9;2064:7;2060:23;2056:32;2053:52;;;2101:1;2098;2091:12;2053:52;2140:9;2127:23;2159:31;2184:5;2159:31;:::i;:::-;2209:5;2261:2;2246:18;;;;2233:32;;-1:-1:-1;;;1956:315:514:o;2276:456::-;2353:6;2361;2369;2422:2;2410:9;2401:7;2397:23;2393:32;2390:52;;;2438:1;2435;2428:12;2390:52;2477:9;2464:23;2496:31;2521:5;2496:31;:::i;:::-;2546:5;-1:-1:-1;2603:2:514;2588:18;;2575:32;2616:33;2575:32;2616:33;:::i;:::-;2276:456;;2668:7;;-1:-1:-1;;;2722:2:514;2707:18;;;;2694:32;;2276:456::o;2737:255::-;2804:6;2857:2;2845:9;2836:7;2832:23;2828:32;2825:52;;;2873:1;2870;2863:12;2825:52;2912:9;2899:23;2931:31;2956:5;2931:31;:::i;3249:127::-;3310:10;3305:3;3301:20;3298:1;3291:31;3341:4;3338:1;3331:15;3365:4;3362:1;3355:15;3381:632;3446:5;3476:18;3517:2;3509:6;3506:14;3503:40;;;3523:18;;:::i;:::-;3598:2;3592:9;3566:2;3652:15;;-1:-1:-1;;3648:24:514;;;3674:2;3644:33;3640:42;3628:55;;;3698:18;;;3718:22;;;3695:46;3692:72;;;3744:18;;:::i;:::-;3784:10;3780:2;3773:22;3813:6;3804:15;;3843:6;3835;3828:22;3883:3;3874:6;3869:3;3865:16;3862:25;3859:45;;;3900:1;3897;3890:12;3859:45;3950:6;3945:3;3938:4;3930:6;3926:17;3913:44;4005:1;3998:4;3989:6;3981;3977:19;3973:30;3966:41;;;;3381:632;;;;;:::o;4018:451::-;4087:6;4140:2;4128:9;4119:7;4115:23;4111:32;4108:52;;;4156:1;4153;4146:12;4108:52;4196:9;4183:23;4229:18;4221:6;4218:30;4215:50;;;4261:1;4258;4251:12;4215:50;4284:22;;4337:4;4329:13;;4325:27;-1:-1:-1;4315:55:514;;4366:1;4363;4356:12;4315:55;4389:74;4455:7;4450:2;4437:16;4432:2;4428;4424:11;4389:74;:::i;4474:818::-;4578:6;4586;4594;4602;4655:2;4643:9;4634:7;4630:23;4626:32;4623:52;;;4671:1;4668;4661:12;4623:52;4710:9;4697:23;4729:31;4754:5;4729:31;:::i;:::-;4779:5;-1:-1:-1;4831:2:514;4816:18;;4803:32;;-1:-1:-1;4886:2:514;4871:18;;4858:32;4909:18;4939:14;;;4936:34;;;4966:1;4963;4956:12;4936:34;5004:6;4993:9;4989:22;4979:32;;5049:7;5042:4;5038:2;5034:13;5030:27;5020:55;;5071:1;5068;5061:12;5020:55;5111:2;5098:16;5137:2;5129:6;5126:14;5123:34;;;5153:1;5150;5143:12;5123:34;5206:7;5201:2;5191:6;5188:1;5184:14;5180:2;5176:23;5172:32;5169:45;5166:65;;;5227:1;5224;5217:12;5166:65;4474:818;;;;-1:-1:-1;;5258:2:514;5250:11;;-1:-1:-1;;;4474:818:514:o;5297:416::-;5362:6;5370;5423:2;5411:9;5402:7;5398:23;5394:32;5391:52;;;5439:1;5436;5429:12;5391:52;5478:9;5465:23;5497:31;5522:5;5497:31;:::i;:::-;5547:5;-1:-1:-1;5604:2:514;5589:18;;5576:32;5646:15;;5639:23;5627:36;;5617:64;;5677:1;5674;5667:12;5617:64;5700:7;5690:17;;;5297:416;;;;;:::o;5718:795::-;5813:6;5821;5829;5837;5890:3;5878:9;5869:7;5865:23;5861:33;5858:53;;;5907:1;5904;5897:12;5858:53;5946:9;5933:23;5965:31;5990:5;5965:31;:::i;:::-;6015:5;-1:-1:-1;6072:2:514;6057:18;;6044:32;6085:33;6044:32;6085:33;:::i;:::-;6137:7;-1:-1:-1;6191:2:514;6176:18;;6163:32;;-1:-1:-1;6246:2:514;6231:18;;6218:32;6273:18;6262:30;;6259:50;;;6305:1;6302;6295:12;6259:50;6328:22;;6381:4;6373:13;;6369:27;-1:-1:-1;6359:55:514;;6410:1;6407;6400:12;6359:55;6433:74;6499:7;6494:2;6481:16;6476:2;6472;6468:11;6433:74;:::i;:::-;6423:84;;;5718:795;;;;;;;:::o;6518:388::-;6586:6;6594;6647:2;6635:9;6626:7;6622:23;6618:32;6615:52;;;6663:1;6660;6653:12;6615:52;6702:9;6689:23;6721:31;6746:5;6721:31;:::i;:::-;6771:5;-1:-1:-1;6828:2:514;6813:18;;6800:32;6841:33;6800:32;6841:33;:::i;6911:380::-;6990:1;6986:12;;;;7033;;;7054:61;;7108:4;7100:6;7096:17;7086:27;;7054:61;7161:2;7153:6;7150:14;7130:18;7127:38;7124:161;;7207:10;7202:3;7198:20;7195:1;7188:31;7242:4;7239:1;7232:15;7270:4;7267:1;7260:15;7124:161;;6911:380;;;:::o;8012:543::-;8114:2;8109:3;8106:11;8103:446;;;8150:1;8174:5;8171:1;8164:16;8218:4;8215:1;8205:18;8288:2;8276:10;8272:19;8269:1;8265:27;8259:4;8255:38;8324:4;8312:10;8309:20;8306:47;;;-1:-1:-1;8347:4:514;8306:47;8402:2;8397:3;8393:12;8390:1;8386:20;8380:4;8376:31;8366:41;;8457:82;8475:2;8468:5;8465:13;8457:82;;;8520:17;;;8501:1;8490:13;8457:82;;;8461:3;;;8012:543;;;:::o;8731:1345::-;8857:3;8851:10;8884:18;8876:6;8873:30;8870:56;;;8906:18;;:::i;:::-;8935:97;9025:6;8985:38;9017:4;9011:11;8985:38;:::i;:::-;8979:4;8935:97;:::i;:::-;9087:4;;9144:2;9133:14;;9161:1;9156:663;;;;9863:1;9880:6;9877:89;;;-1:-1:-1;9932:19:514;;;9926:26;9877:89;-1:-1:-1;;8688:1:514;8684:11;;;8680:24;8676:29;8666:40;8712:1;8708:11;;;8663:57;9979:81;;9126:944;;9156:663;7959:1;7952:14;;;7996:4;7983:18;;-1:-1:-1;;9192:20:514;;;9310:236;9324:7;9321:1;9318:14;9310:236;;;9413:19;;;9407:26;9392:42;;9505:27;;;;9473:1;9461:14;;;;9340:19;;9310:236;;;9314:3;9574:6;9565:7;9562:19;9559:201;;;9635:19;;;9629:26;-1:-1:-1;;9718:1:514;9714:14;;;9730:3;9710:24;9706:37;9702:42;9687:58;9672:74;;9559:201;-1:-1:-1;;;;;9806:1:514;9790:14;;;9786:22;9773:36;;-1:-1:-1;8731:1345:514:o;10380:992::-;10609:3;10638:1;10671:6;10665:13;10701:36;10727:9;10701:36;:::i;:::-;10756:1;10773:17;;;10799:133;;;;10946:1;10941:358;;;;10766:533;;10799:133;-1:-1:-1;;10832:24:514;;10820:37;;10905:14;;10898:22;10886:35;;10877:45;;;-1:-1:-1;10799:133:514;;10941:358;10972:6;10969:1;10962:17;11002:4;11047;11044:1;11034:18;11074:1;11088:165;11102:6;11099:1;11096:13;11088:165;;;11180:14;;11167:11;;;11160:35;11223:16;;;;11117:10;;11088:165;;;11092:3;;;11282:6;11277:3;11273:16;11266:23;;10766:533;-1:-1:-1;;;;;11308:30:514;;-1:-1:-1;;11363:2:514;11354:12;;10380:992;-1:-1:-1;;;10380:992:514:o;11377:127::-;11438:10;11433:3;11429:20;11426:1;11419:31;11469:4;11466:1;11459:15;11493:4;11490:1;11483:15;11509:232;11548:3;11569:17;;;11566:140;;11628:10;11623:3;11619:20;11616:1;11609:31;11663:4;11660:1;11653:15;11691:4;11688:1;11681:15;11566:140;-1:-1:-1;11733:1:514;11722:13;;11509:232::o;11999:489::-;-1:-1:-1;;;;;12268:15:514;;;12250:34;;12320:15;;12315:2;12300:18;;12293:43;12367:2;12352:18;;12345:34;;;12415:3;12410:2;12395:18;;12388:31;;;12193:4;;12436:46;;12462:19;;12454:6;12436:46;:::i;12493:249::-;12562:6;12615:2;12603:9;12594:7;12590:23;12586:32;12583:52;;;12631:1;12628;12621:12;12583:52;12663:9;12657:16;12682:30;12706:5;12682:30;:::i;13026:127::-;13087:10;13082:3;13078:20;13075:1;13068:31;13118:4;13115:1;13108:15;13142:4;13139:1;13132:15","linkReferences":{},"immutableReferences":{"38984":[{"start":2362,"length":32}]}},"methodIdentifiers":{"MINT_PRICE()":"c002d23d","TOTAL_SUPPLY()":"902d55a5","_hasMinted(address)":"d92d1bd6","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","baseURI()":"6c0360eb","currentTokenId()":"009a9b7b","getApproved(uint256)":"081812fc","isApprovedForAll(address,address)":"e985e9c5","name()":"06fdde03","owner()":"8da5cb5b","ownerOf(uint256)":"6352211e","privateMint(address,uint256,bytes32[])":"9886a902","publicMint(address)":"32a93a3a","renounceOwnership()":"715018a6","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setBaseURI(string)":"55f804b3","startPublicMint()":"76c64c62","startWaitlistMint()":"a839e501","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b","withdrawPayments(address)":"31b3eb94"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"baseURI_\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot_\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyMinted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721IncorrectOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721InsufficientApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC721InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMintState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxSupplyReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintPriceNotPaid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonExistentTokenURI\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WithdrawTransfer\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"enum Member.MintState\",\"name\":\"prevState\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"enum Member.MintState\",\"name\":\"newState\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"MintStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINT_PRICE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOTAL_SUPPLY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"_hasMinted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentTokenId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"proof\",\"type\":\"bytes32[]\"}],\"name\":\"privateMint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"publicMint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"baseURI_\",\"type\":\"string\"}],\"name\":\"setBaseURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPublicMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startWaitlistMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"payee\",\"type\":\"address\"}],\"name\":\"withdrawPayments\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC721IncorrectOwner(address,uint256,address)\":[{\"details\":\"Indicates an error related to the ownership over a particular token. Used in transfers.\",\"params\":{\"owner\":\"Address of the current owner of a token.\",\"sender\":\"Address whose tokens are being transferred.\",\"tokenId\":\"Identifier number of a token.\"}}],\"ERC721InsufficientApproval(address,uint256)\":[{\"details\":\"Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\",\"params\":{\"operator\":\"Address that may be allowed to operate on tokens without being their owner.\",\"tokenId\":\"Identifier number of a token.\"}}],\"ERC721InvalidApprover(address)\":[{\"details\":\"Indicates a failure with the `approver` of a token to be approved. Used in approvals.\",\"params\":{\"approver\":\"Address initiating an approval operation.\"}}],\"ERC721InvalidOperator(address)\":[{\"details\":\"Indicates a failure with the `operator` to be approved. Used in approvals.\",\"params\":{\"operator\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC721InvalidOwner(address)\":[{\"details\":\"Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. Used in balance queries.\",\"params\":{\"owner\":\"Address of the current owner of a token.\"}}],\"ERC721InvalidReceiver(address)\":[{\"details\":\"Indicates a failure with the token `receiver`. Used in transfers.\",\"params\":{\"receiver\":\"Address to which tokens are being transferred.\"}}],\"ERC721InvalidSender(address)\":[{\"details\":\"Indicates a failure with the token `sender`. Used in transfers.\",\"params\":{\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC721NonexistentToken(uint256)\":[{\"details\":\"Indicates a `tokenId` whose `owner` is the zero address.\",\"params\":{\"tokenId\":\"Identifier number of a token.\"}}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"MintStateChanged(address,uint8,uint8,uint256)\":{\"params\":{\"caller\":\"the address that called the function\",\"newState\":\"the new mint state\",\"prevState\":\"the previous mint state\",\"timestamp\":\"the timestamp of the state change\"}},\"Minted(address,uint256,uint256)\":{\"params\":{\"recipient\":\"the address that receives the NFT\"}},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"params\":{\"tokenId\":\"the id of the token to get the tokenURI for\"},\"returns\":{\"_0\":\"the tokenURI for the given tokenId\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawPayments(address)\":{\"params\":{\"payee\":\"the address that will receive the withdrawn ether\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"AlreadyMinted()\":[{\"notice\":\"thrown when user tries to mint more than 1 token with same wallet\"}],\"InvalidAddress()\":[{\"notice\":\"thrown when the address is invalid\"}],\"InvalidMintState()\":[{\"notice\":\"thrown when the mint state is invalid\"}],\"InvalidProof()\":[{\"notice\":\"thrown when the proof is invalid\"}],\"MaxSupplyReached()\":[{\"notice\":\"thrown when the max supply is reached\"}],\"MintPriceNotPaid()\":[{\"notice\":\"thrown when an incorrect amount of ETH is sent to mint\"}],\"NonExistentTokenURI()\":[{\"notice\":\"thrown when a token is not minted\"}],\"NotAllowed()\":[{\"notice\":\"thrown when the user is not allowed to perform the action\"}],\"WithdrawTransfer()\":[{\"notice\":\"thrown when the withdraw payment transaction fails\"}]},\"events\":{\"MintStateChanged(address,uint8,uint8,uint256)\":{\"notice\":\"emitted when the mint state is changed\"},\"Minted(address,uint256,uint256)\":{\"notice\":\"emitted when an NFT is minted\"}},\"kind\":\"user\",\"methods\":{\"MINT_PRICE()\":{\"notice\":\"the mint price for an individual nft\"},\"TOTAL_SUPPLY()\":{\"notice\":\"the total supply of the collection\"},\"_hasMinted(address)\":{\"notice\":\"mapping to track if a wallet has already minted\"},\"baseURI()\":{\"notice\":\"the base uri\"},\"tokenURI(uint256)\":{\"notice\":\"Get the tokenURI for the given tokenId\"},\"withdrawPayments(address)\":{\"notice\":\"withdraw the balance from the contract\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/tokens/Member.sol\":\"Member\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/tokens/Member.sol\":{\"keccak256\":\"0x6ab0be5b468d6392088351134a124c49fc7d7a8935d623b1e7ff791eba990c40\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://23c9bba8929a167e27ec1e7e01c7eb60bc4add047125f1a23b16eabcdb798c43\",\"dweb:/ipfs/Qmf5K6F7tg7xczvqGnb2bdXdBUDamwXHpYP8d45CSF2owA\"]},\"lib/@openzeppelin/contracts/access/Ownable.sol\":{\"keccak256\":\"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6\",\"dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a\"]},\"lib/@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"keccak256\":\"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f\",\"dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt\"]},\"lib/@openzeppelin/contracts/token/ERC721/ERC721.sol\":{\"keccak256\":\"0x13dd061770956c8489b80cfc89d9cdfc8ea2783d953691ea037a380731d52784\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ed37f0f86e7fe31659e48c3a2a5920a92dd7f13c85cf8991fb79fe5f01e08efd\",\"dweb:/ipfs/QmUtm9bQGvjr9hHGwkPWrbgFmVqzaJcxjkaYDex2oGsonS\"]},\"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"]},\"lib/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"keccak256\":\"0x7f7a26306c79a65fb8b3b6c757cd74660c532cd8a02e165488e30027dd34ca49\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d01e0b2b837ee2f628545e54d8715b49c7ef2befd08356c2e7f6c50dde8a1c22\",\"dweb:/ipfs/QmWBAn6y2D1xgftci97Z3qR9tQnkvwQpYwFwkTvDMvqU4i\"]},\"lib/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol\":{\"keccak256\":\"0x37d1aaaa5a2908a09e9dcf56a26ddf762ecf295afb5964695937344fc6802ce1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ed0bfc1b92153c5000e50f4021367b931bbe96372ac6facec3c4961b72053d02\",\"dweb:/ipfs/Qmbwp8VDerjS5SV1quwHH1oMXxPQ93fzfLVqJ2RCqbowGE\"]},\"lib/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453\",\"dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i\"]},\"lib/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol\":{\"keccak256\":\"0x6400c4bee15052e043e5d10315135972529bd1c8012f43da494dc6b4f4661058\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da5d3d47d35af4373743a559ea4b9b7ecfe4bab6f0703f410c1e59959b7966ac\",\"dweb:/ipfs/QmTHdoghh4WLu4yURjGEgRk162pcwwdsG52MPGa12GqnGR\"]},\"lib/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875\",\"dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L\"]},\"lib/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc\",\"dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AlreadyMinted"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"type":"error","name":"ERC721IncorrectOwner"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC721InsufficientApproval"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"type":"error","name":"ERC721InvalidApprover"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"type":"error","name":"ERC721InvalidOperator"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"type":"error","name":"ERC721InvalidOwner"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"type":"error","name":"ERC721InvalidReceiver"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"type":"error","name":"ERC721InvalidSender"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC721NonexistentToken"},{"inputs":[],"type":"error","name":"InvalidAddress"},{"inputs":[],"type":"error","name":"InvalidMintState"},{"inputs":[],"type":"error","name":"InvalidProof"},{"inputs":[],"type":"error","name":"MaxSupplyReached"},{"inputs":[],"type":"error","name":"MintPriceNotPaid"},{"inputs":[],"type":"error","name":"NonExistentTokenURI"},{"inputs":[],"type":"error","name":"NotAllowed"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"type":"error","name":"OwnableInvalidOwner"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"OwnableUnauthorizedAccount"},{"inputs":[],"type":"error","name":"WithdrawTransfer"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"approved","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bool","name":"approved","type":"bool","indexed":false}],"type":"event","name":"ApprovalForAll","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"enum Member.MintState","name":"prevState","type":"uint8","indexed":true},{"internalType":"enum Member.MintState","name":"newState","type":"uint8","indexed":true},{"internalType":"uint256","name":"timestamp","type":"uint256","indexed":false}],"type":"event","name":"MintStateChanged","anonymous":false},{"inputs":[{"internalType":"address","name":"recipient","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":false},{"internalType":"uint256","name":"timestamp","type":"uint256","indexed":false}],"type":"event","name":"Minted","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"_hasMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"approve"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function","name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"stateMutability":"payable","type":"function","name":"privateMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"stateMutability":"payable","type":"function","name":"publicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setApprovalForAll"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"setBaseURI"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"startPublicMint"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"startWaitlistMint"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transferFrom"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"address payable","name":"payee","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"withdrawPayments"}],"devdoc":{"kind":"dev","methods":{"approve(address,uint256)":{"details":"See {IERC721-approve}."},"balanceOf(address)":{"details":"See {IERC721-balanceOf}."},"getApproved(uint256)":{"details":"See {IERC721-getApproved}."},"isApprovedForAll(address,address)":{"details":"See {IERC721-isApprovedForAll}."},"name()":{"details":"See {IERC721Metadata-name}."},"owner()":{"details":"Returns the address of the current owner."},"ownerOf(uint256)":{"details":"See {IERC721-ownerOf}."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"safeTransferFrom(address,address,uint256)":{"details":"See {IERC721-safeTransferFrom}."},"safeTransferFrom(address,address,uint256,bytes)":{"details":"See {IERC721-safeTransferFrom}."},"setApprovalForAll(address,bool)":{"details":"See {IERC721-setApprovalForAll}."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"symbol()":{"details":"See {IERC721Metadata-symbol}."},"tokenURI(uint256)":{"params":{"tokenId":"the id of the token to get the tokenURI for"},"returns":{"_0":"the tokenURI for the given tokenId"}},"transferFrom(address,address,uint256)":{"details":"See {IERC721-transferFrom}."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"withdrawPayments(address)":{"params":{"payee":"the address that will receive the withdrawn ether"}}},"version":1},"userdoc":{"kind":"user","methods":{"MINT_PRICE()":{"notice":"the mint price for an individual nft"},"TOTAL_SUPPLY()":{"notice":"the total supply of the collection"},"_hasMinted(address)":{"notice":"mapping to track if a wallet has already minted"},"baseURI()":{"notice":"the base uri"},"tokenURI(uint256)":{"notice":"Get the tokenURI for the given tokenId"},"withdrawPayments(address)":{"notice":"withdraw the balance from the contract"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/tokens/Member.sol":"Member"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/tokens/Member.sol":{"keccak256":"0x6ab0be5b468d6392088351134a124c49fc7d7a8935d623b1e7ff791eba990c40","urls":["bzz-raw://23c9bba8929a167e27ec1e7e01c7eb60bc4add047125f1a23b16eabcdb798c43","dweb:/ipfs/Qmf5K6F7tg7xczvqGnb2bdXdBUDamwXHpYP8d45CSF2owA"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"],"license":"MIT"},"lib/@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC721/ERC721.sol":{"keccak256":"0x13dd061770956c8489b80cfc89d9cdfc8ea2783d953691ea037a380731d52784","urls":["bzz-raw://ed37f0f86e7fe31659e48c3a2a5920a92dd7f13c85cf8991fb79fe5f01e08efd","dweb:/ipfs/QmUtm9bQGvjr9hHGwkPWrbgFmVqzaJcxjkaYDex2oGsonS"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"keccak256":"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4","urls":["bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7","dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol":{"keccak256":"0x7f7a26306c79a65fb8b3b6c757cd74660c532cd8a02e165488e30027dd34ca49","urls":["bzz-raw://d01e0b2b837ee2f628545e54d8715b49c7ef2befd08356c2e7f6c50dde8a1c22","dweb:/ipfs/QmWBAn6y2D1xgftci97Z3qR9tQnkvwQpYwFwkTvDMvqU4i"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol":{"keccak256":"0x37d1aaaa5a2908a09e9dcf56a26ddf762ecf295afb5964695937344fc6802ce1","urls":["bzz-raw://ed0bfc1b92153c5000e50f4021367b931bbe96372ac6facec3c4961b72053d02","dweb:/ipfs/Qmbwp8VDerjS5SV1quwHH1oMXxPQ93fzfLVqJ2RCqbowGE"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol":{"keccak256":"0x6400c4bee15052e043e5d10315135972529bd1c8012f43da494dc6b4f4661058","urls":["bzz-raw://da5d3d47d35af4373743a559ea4b9b7ecfe4bab6f0703f410c1e59959b7966ac","dweb:/ipfs/QmTHdoghh4WLu4yURjGEgRk162pcwwdsG52MPGa12GqnGR"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"],"license":"MIT"}},"version":1},"id":242} \ No newline at end of file diff --git a/packages/generated/v3/abis/Member.metadata.json b/packages/generated/v3/abis/Member.metadata.json new file mode 100644 index 000000000..803760fbf --- /dev/null +++ b/packages/generated/v3/abis/Member.metadata.json @@ -0,0 +1,1020 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "name_", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol_", + "type": "string" + }, + { + "internalType": "string", + "name": "baseURI_", + "type": "string" + }, + { + "internalType": "bytes32", + "name": "merkleRoot_", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "type": "error", + "name": "AlreadyMinted" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "type": "error", + "name": "ERC721IncorrectOwner" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC721InsufficientApproval" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "approver", + "type": "address" + } + ], + "type": "error", + "name": "ERC721InvalidApprover" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "type": "error", + "name": "ERC721InvalidOperator" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "type": "error", + "name": "ERC721InvalidOwner" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "type": "error", + "name": "ERC721InvalidReceiver" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "type": "error", + "name": "ERC721InvalidSender" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC721NonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "InvalidAddress" + }, + { + "inputs": [], + "type": "error", + "name": "InvalidMintState" + }, + { + "inputs": [], + "type": "error", + "name": "InvalidProof" + }, + { + "inputs": [], + "type": "error", + "name": "MaxSupplyReached" + }, + { + "inputs": [], + "type": "error", + "name": "MintPriceNotPaid" + }, + { + "inputs": [], + "type": "error", + "name": "NonExistentTokenURI" + }, + { + "inputs": [], + "type": "error", + "name": "NotAllowed" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "type": "error", + "name": "OwnableInvalidOwner" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "OwnableUnauthorizedAccount" + }, + { + "inputs": [], + "type": "error", + "name": "WithdrawTransfer" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "approved", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Approval", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "operator", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ApprovalForAll", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address", + "indexed": true + }, + { + "internalType": "enum Member.MintState", + "name": "prevState", + "type": "uint8", + "indexed": true + }, + { + "internalType": "enum Member.MintState", + "name": "newState", + "type": "uint8", + "indexed": true + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "MintStateChanged", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "Minted", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Transfer", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "MINT_PRICE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "TOTAL_SUPPLY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "_hasMinted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "approve" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "baseURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "currentTokenId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "allowance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "privateMint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "publicMint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "renounceOwnership" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "safeTransferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "safeTransferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setApprovalForAll" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "baseURI_", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setBaseURI" + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "startPublicMint" + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "startWaitlistMint" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function", + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "transferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "transferOwnership" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "payee", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "withdrawPayments" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "approve(address,uint256)": { + "details": "See {IERC721-approve}." + }, + "balanceOf(address)": { + "details": "See {IERC721-balanceOf}." + }, + "getApproved(uint256)": { + "details": "See {IERC721-getApproved}." + }, + "isApprovedForAll(address,address)": { + "details": "See {IERC721-isApprovedForAll}." + }, + "name()": { + "details": "See {IERC721Metadata-name}." + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "ownerOf(uint256)": { + "details": "See {IERC721-ownerOf}." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner." + }, + "safeTransferFrom(address,address,uint256)": { + "details": "See {IERC721-safeTransferFrom}." + }, + "safeTransferFrom(address,address,uint256,bytes)": { + "details": "See {IERC721-safeTransferFrom}." + }, + "setApprovalForAll(address,bool)": { + "details": "See {IERC721-setApprovalForAll}." + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + }, + "symbol()": { + "details": "See {IERC721Metadata-symbol}." + }, + "tokenURI(uint256)": { + "params": { + "tokenId": "the id of the token to get the tokenURI for" + }, + "returns": { + "_0": "the tokenURI for the given tokenId" + } + }, + "transferFrom(address,address,uint256)": { + "details": "See {IERC721-transferFrom}." + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + }, + "withdrawPayments(address)": { + "params": { + "payee": "the address that will receive the withdrawn ether" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "MINT_PRICE()": { + "notice": "the mint price for an individual nft" + }, + "TOTAL_SUPPLY()": { + "notice": "the total supply of the collection" + }, + "_hasMinted(address)": { + "notice": "mapping to track if a wallet has already minted" + }, + "baseURI()": { + "notice": "the base uri" + }, + "tokenURI(uint256)": { + "notice": "Get the tokenURI for the given tokenId" + }, + "withdrawPayments(address)": { + "notice": "withdraw the balance from the contract" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/tokens/Member.sol": "Member" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/tokens/Member.sol": { + "keccak256": "0x6ab0be5b468d6392088351134a124c49fc7d7a8935d623b1e7ff791eba990c40", + "urls": [ + "bzz-raw://23c9bba8929a167e27ec1e7e01c7eb60bc4add047125f1a23b16eabcdb798c43", + "dweb:/ipfs/Qmf5K6F7tg7xczvqGnb2bdXdBUDamwXHpYP8d45CSF2owA" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/access/Ownable.sol": { + "keccak256": "0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb", + "urls": [ + "bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6", + "dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/interfaces/draft-IERC6093.sol": { + "keccak256": "0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7", + "urls": [ + "bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f", + "dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC721/ERC721.sol": { + "keccak256": "0x13dd061770956c8489b80cfc89d9cdfc8ea2783d953691ea037a380731d52784", + "urls": [ + "bzz-raw://ed37f0f86e7fe31659e48c3a2a5920a92dd7f13c85cf8991fb79fe5f01e08efd", + "dweb:/ipfs/QmUtm9bQGvjr9hHGwkPWrbgFmVqzaJcxjkaYDex2oGsonS" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4", + "urls": [ + "bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7", + "dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { + "keccak256": "0x7f7a26306c79a65fb8b3b6c757cd74660c532cd8a02e165488e30027dd34ca49", + "urls": [ + "bzz-raw://d01e0b2b837ee2f628545e54d8715b49c7ef2befd08356c2e7f6c50dde8a1c22", + "dweb:/ipfs/QmWBAn6y2D1xgftci97Z3qR9tQnkvwQpYwFwkTvDMvqU4i" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol": { + "keccak256": "0x37d1aaaa5a2908a09e9dcf56a26ddf762ecf295afb5964695937344fc6802ce1", + "urls": [ + "bzz-raw://ed0bfc1b92153c5000e50f4021367b931bbe96372ac6facec3c4961b72053d02", + "dweb:/ipfs/Qmbwp8VDerjS5SV1quwHH1oMXxPQ93fzfLVqJ2RCqbowGE" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Context.sol": { + "keccak256": "0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2", + "urls": [ + "bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12", + "dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Strings.sol": { + "keccak256": "0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792", + "urls": [ + "bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453", + "dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol": { + "keccak256": "0x6400c4bee15052e043e5d10315135972529bd1c8012f43da494dc6b4f4661058", + "urls": [ + "bzz-raw://da5d3d47d35af4373743a559ea4b9b7ecfe4bab6f0703f410c1e59959b7966ac", + "dweb:/ipfs/QmTHdoghh4WLu4yURjGEgRk162pcwwdsG52MPGa12GqnGR" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/ERC165.sol": { + "keccak256": "0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133", + "urls": [ + "bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8", + "dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/math/Math.sol": { + "keccak256": "0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d", + "urls": [ + "bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875", + "dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/math/SignedMath.sol": { + "keccak256": "0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72", + "urls": [ + "bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc", + "dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/MembershipFacet.abi.json b/packages/generated/v3/abis/MembershipFacet.abi.json new file mode 100644 index 000000000..0d9ec6fb2 --- /dev/null +++ b/packages/generated/v3/abis/MembershipFacet.abi.json @@ -0,0 +1,1783 @@ +[ + { + "type": "function", + "name": "__ERC721A_init", + "inputs": [ + { + "name": "name_", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol_", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__EntitlementGated_init", + "inputs": [ + { + "name": "entitlementChecker", + "type": "address", + "internalType": "contract IEntitlementChecker" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__Membership_init", + "inputs": [ + { + "name": "info", + "type": "tuple", + "internalType": "struct IMembershipBase.Membership", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol", + "type": "string", + "internalType": "string" + }, + { + "name": "price", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maxSupply", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "duration", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "currency", + "type": "address", + "internalType": "address" + }, + { + "name": "feeRecipient", + "type": "address", + "internalType": "address" + }, + { + "name": "freeAllocation", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "pricingModule", + "type": "address", + "internalType": "address" + } + ] + }, + { + "name": "spaceFactory", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "_getMembershipCurrency", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getMembershipFreeAllocation", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getMembershipImage", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getMembershipPrice", + "inputs": [ + { + "name": "totalSupply", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getMembershipSupplyLimit", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getPricingModule", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getSpaceFactory", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_setMembershipFreeAllocation", + "inputs": [ + { + "name": "newAllocation", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "_setMembershipSupplyLimit", + "inputs": [ + { + "name": "newLimit", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "_setPricingModule", + "inputs": [ + { + "name": "newPricingModule", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "expiresAt", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getApproved", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipCurrency", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipDuration", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint64", + "internalType": "uint64" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipFreeAllocation", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipImage", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipLimit", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipPrice", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipPricingModule", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipRenewalPrice", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRuleData", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getSpaceFactory", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isApprovedForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "joinSpace", + "inputs": [ + { + "name": "receiver", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "joinSpaceWithReferral", + "inputs": [ + { + "name": "receiver", + "type": "address", + "internalType": "address" + }, + { + "name": "referrer", + "type": "address", + "internalType": "address" + }, + { + "name": "referralCode", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ownerOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "postEntitlementCheckResult", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "result", + "type": "uint8", + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renewMembership", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "setApprovalForAll", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipFreeAllocation", + "inputs": [ + { + "name": "newAllocation", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipImage", + "inputs": [ + { + "name": "newImage", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipLimit", + "inputs": [ + { + "name": "newLimit", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipPrice", + "inputs": [ + { + "name": "newPrice", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipPricingModule", + "inputs": [ + { + "name": "pricingModule", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenURI", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "withdraw", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EntitlementCheckResultPosted", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "result", + "type": "uint8", + "indexed": false, + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipCurrencyUpdated", + "inputs": [ + { + "name": "currency", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipFeeRecipientUpdated", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipFreeAllocationUpdated", + "inputs": [ + { + "name": "allocation", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipLimitUpdated", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipPriceUpdated", + "inputs": [ + { + "name": "price", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipTokenIssued", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipTokenRejected", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipWithdrawal", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Membership__ReferralCreated", + "inputs": [ + { + "name": "code", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "bps", + "type": "uint16", + "indexed": false, + "internalType": "uint16" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Membership__ReferralRemoved", + "inputs": [ + { + "name": "code", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Membership__ReferralTimeCreated", + "inputs": [ + { + "name": "code", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "bps", + "type": "uint16", + "indexed": false, + "internalType": "uint16" + }, + { + "name": "startTime", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "endTime", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleCreated", + "inputs": [ + { + "name": "creator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRemoved", + "inputs": [ + { + "name": "remover", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleUpdated", + "inputs": [ + { + "name": "updater", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SubscriptionUpdate", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "expiration", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "AddressInsufficientBalance", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Dispatcher__InvalidCaller", + "inputs": [] + }, + { + "type": "error", + "name": "Dispatcher__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__DurationZero", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__NotApprovedOrOwner", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "EntitlementGated_InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_NodeAlreadyVoted", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_NodeNotFound", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyCompleted", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyRegistered", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionNotRegistered", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__AlreadyMember", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InsufficientAllowance", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InsufficientPayment", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidCurrency", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidDuration", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidFeeRecipient", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidFreeAllocation", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidLimit", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidMaxSupply", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidPrice", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidPricingModule", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidReferralBps", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidReferralCode", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidReferralTime", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidTokenId", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__MaxSupplyReached", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__NotExpired", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__PriceTooLow", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "ReentrancyGuard__ReentrantCall", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidPermission", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "SafeERC20FailedOperation", + "inputs": [ + { + "name": "token", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/MembershipFacet.abi.ts b/packages/generated/v3/abis/MembershipFacet.abi.ts new file mode 100644 index 000000000..d23aaa7dd --- /dev/null +++ b/packages/generated/v3/abis/MembershipFacet.abi.ts @@ -0,0 +1,1783 @@ +export default [ + { + "type": "function", + "name": "__ERC721A_init", + "inputs": [ + { + "name": "name_", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol_", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__EntitlementGated_init", + "inputs": [ + { + "name": "entitlementChecker", + "type": "address", + "internalType": "contract IEntitlementChecker" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__Membership_init", + "inputs": [ + { + "name": "info", + "type": "tuple", + "internalType": "struct IMembershipBase.Membership", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol", + "type": "string", + "internalType": "string" + }, + { + "name": "price", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maxSupply", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "duration", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "currency", + "type": "address", + "internalType": "address" + }, + { + "name": "feeRecipient", + "type": "address", + "internalType": "address" + }, + { + "name": "freeAllocation", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "pricingModule", + "type": "address", + "internalType": "address" + } + ] + }, + { + "name": "spaceFactory", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "_getMembershipCurrency", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getMembershipFreeAllocation", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getMembershipImage", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getMembershipPrice", + "inputs": [ + { + "name": "totalSupply", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getMembershipSupplyLimit", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getPricingModule", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_getSpaceFactory", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_setMembershipFreeAllocation", + "inputs": [ + { + "name": "newAllocation", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "_setMembershipSupplyLimit", + "inputs": [ + { + "name": "newLimit", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "_setPricingModule", + "inputs": [ + { + "name": "newPricingModule", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "expiresAt", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getApproved", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipCurrency", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipDuration", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint64", + "internalType": "uint64" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipFreeAllocation", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipImage", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipLimit", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipPrice", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipPricingModule", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMembershipRenewalPrice", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRuleData", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getSpaceFactory", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isApprovedForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "joinSpace", + "inputs": [ + { + "name": "receiver", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "joinSpaceWithReferral", + "inputs": [ + { + "name": "receiver", + "type": "address", + "internalType": "address" + }, + { + "name": "referrer", + "type": "address", + "internalType": "address" + }, + { + "name": "referralCode", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ownerOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "postEntitlementCheckResult", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "result", + "type": "uint8", + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renewMembership", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "setApprovalForAll", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipFreeAllocation", + "inputs": [ + { + "name": "newAllocation", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipImage", + "inputs": [ + { + "name": "newImage", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipLimit", + "inputs": [ + { + "name": "newLimit", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipPrice", + "inputs": [ + { + "name": "newPrice", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMembershipPricingModule", + "inputs": [ + { + "name": "pricingModule", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenURI", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "withdraw", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EntitlementCheckResultPosted", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "result", + "type": "uint8", + "indexed": false, + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipCurrencyUpdated", + "inputs": [ + { + "name": "currency", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipFeeRecipientUpdated", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipFreeAllocationUpdated", + "inputs": [ + { + "name": "allocation", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipLimitUpdated", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipPriceUpdated", + "inputs": [ + { + "name": "price", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipTokenIssued", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipTokenRejected", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MembershipWithdrawal", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Membership__ReferralCreated", + "inputs": [ + { + "name": "code", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "bps", + "type": "uint16", + "indexed": false, + "internalType": "uint16" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Membership__ReferralRemoved", + "inputs": [ + { + "name": "code", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Membership__ReferralTimeCreated", + "inputs": [ + { + "name": "code", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "bps", + "type": "uint16", + "indexed": false, + "internalType": "uint16" + }, + { + "name": "startTime", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "endTime", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleCreated", + "inputs": [ + { + "name": "creator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRemoved", + "inputs": [ + { + "name": "remover", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleUpdated", + "inputs": [ + { + "name": "updater", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SubscriptionUpdate", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "expiration", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "AddressInsufficientBalance", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Dispatcher__InvalidCaller", + "inputs": [] + }, + { + "type": "error", + "name": "Dispatcher__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__DurationZero", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__NotApprovedOrOwner", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "EntitlementGated_InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_NodeAlreadyVoted", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_NodeNotFound", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyCompleted", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyRegistered", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionNotRegistered", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__AlreadyMember", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InsufficientAllowance", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InsufficientPayment", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidCurrency", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidDuration", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidFeeRecipient", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidFreeAllocation", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidLimit", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidMaxSupply", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidPrice", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidPricingModule", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidReferralBps", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidReferralCode", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidReferralTime", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__InvalidTokenId", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__MaxSupplyReached", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__NotExpired", + "inputs": [] + }, + { + "type": "error", + "name": "Membership__PriceTooLow", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "ReentrancyGuard__ReentrantCall", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidPermission", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "SafeERC20FailedOperation", + "inputs": [ + { + "name": "token", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/MembershipFacet.bin b/packages/generated/v3/abis/MembershipFacet.bin new file mode 100644 index 000000000..75db1fd03 --- /dev/null +++ b/packages/generated/v3/abis/MembershipFacet.bin @@ -0,0 +1 @@ +60806040523480156200001157600080fd5b506200001c62000022565b620000ca565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16156200006f576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff9081161015620000c757805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6152c880620000da6000396000f3fe6080604052600436106102885760003560e01c806377460cd31161015a578063a22cb465116100c1578063d2f01f191161007a578063d2f01f1914610745578063d33d934514610765578063df9a9fe61461077a578063e847abdd1461079a578063e985e9c5146107af578063f9d5d22c146107df57600080fd5b8063a22cb465146106b5578063ac7ee626146106d5578063b3a5be6d146106ea578063b88d4fde146106ff578063c87b56dd14610712578063c9f7c8331461073257600080fd5b80638c625b06116101135780638c625b061461061657806392c399ff1461062957806393b13cb71461065657806395d600c81461066b57806395d89b411461068057806397fb7c1e1461069557600080fd5b806377460cd31461057757806379dda5851461058c5780637adc9cbe146105a15780637c9669ac146105c15780638120f0ba146105d45780638934207f1461060157600080fd5b80634c2abfbe116101fe57806369d5f38a116101b757806369d5f38a146104cd57806369d9346b146104ed578063702515631461050d578063706b8e091461052257806370a082311461053757806373fc5a051461055757600080fd5b80634c2abfbe1461041857806351cff8d9146104385780635803909f146104585780635becd24a146104785780636352211e14610498578063657e45e8146104b857600080fd5b806317c957091161025057806317c957091461034857806318160ddd1461039d57806323b872dd146103b25780633ded10de146103c557806342842e0e146103e55780634739e805146103f857600080fd5b806306fdde031461028d578063081812fc146102b8578063095ea7b3146102f05780630ef1be5f146103055780631278076a14610325575b600080fd5b34801561029957600080fd5b506102a26107ff565b6040516102af9190614348565b60405180910390f35b3480156102c457600080fd5b506102d86102d336600461435b565b61089a565b6040516001600160a01b0390911681526020016102af565b6103036102fe366004614399565b6108ab565b005b34801561031157600080fd5b506103036103203660046143c5565b6108bb565b34801561033157600080fd5b5061033a61093a565b6040519081526020016102af565b34801561035457600080fd5b5061033a61036336600461435b565b60009081527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce0060205260409020546001600160401b031690565b3480156103a957600080fd5b5061033a61094c565b6103036103c0366004614436565b610956565b3480156103d157600080fd5b5061033a6103e036600461435b565b610b4d565b6103036103f3366004614436565b610cdc565b34801561040457600080fd5b50610303610413366004614484565b610cfc565b34801561042457600080fd5b50610303610433366004614629565b610d65565b34801561044457600080fd5b50610303610453366004614732565b610dc9565b34801561046457600080fd5b5061033a61047336600461435b565b610e6b565b34801561048457600080fd5b5061030361049336600461435b565b610e7e565b3480156104a457600080fd5b506102d86104b336600461435b565b610f03565b3480156104c457600080fd5b506102d8610f0e565b3480156104d957600080fd5b506103036104e836600461435b565b610f18565b3480156104f957600080fd5b50610303610508366004614732565b610fc6565b34801561051957600080fd5b506102d8610ff3565b34801561052e57600080fd5b5061033a61100f565b34801561054357600080fd5b5061033a610552366004614732565b611019565b34801561056357600080fd5b5061030361057236600461435b565b611024565b34801561058357600080fd5b506102d8611034565b34801561059857600080fd5b506102d8611050565b3480156105ad57600080fd5b506103036105bc366004614732565b61105a565b6103036105cf36600461435b565b61109e565b3480156105e057600080fd5b506105e96111fb565b6040516001600160401b0390911681526020016102af565b34801561060d57600080fd5b5061033a611205565b610303610624366004614732565b611218565b34801561063557600080fd5b5061064961064436600461474f565b61162a565b6040516102af9190614862565b34801561066257600080fd5b506102a261165f565b34801561067757600080fd5b5061033a611669565b34801561068c57600080fd5b506102a2611673565b3480156106a157600080fd5b506103036106b036600461435b565b61168b565b3480156106c157600080fd5b506103036106d0366004614909565b6116e0565b3480156106e157600080fd5b506102d861175d565b3480156106f657600080fd5b5061033a611779565b61030361070d366004614942565b611818565b34801561071e57600080fd5b506102a261072d36600461435b565b611862565b610303610740366004614436565b6118f2565b34801561075157600080fd5b506103036107603660046149c1565b611a0c565b34801561077157600080fd5b506102a2611a4e565b34801561078657600080fd5b50610303610795366004614732565b611a66565b3480156107a657600080fd5b506102d8611ab3565b3480156107bb57600080fd5b506107cf6107ca366004614a24565b611abd565b60405190151581526020016102af565b3480156107eb57600080fd5b506103036107fa36600461435b565b611ac9565b6060610809611b0c565b600201805461081790614a52565b80601f016020809104026020016040519081016040528092919081815260200182805461084390614a52565b80156108905780601f1061086557610100808354040283529160200191610890565b820191906000526020600020905b81548152906001019060200180831161087357829003601f168201915b5050505050905090565b60006108a582611b30565b92915050565b6108b782826001611b7d565b5050565b6108c3611c32565b6001600160a01b0316336001600160a01b0316146108fb576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6108b782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611cfc92505050565b60006109476103e0611d13565b905090565b6000610947611d13565b600061096182611d32565b9050836001600160a01b0316816001600160a01b0316146109945760405162a1148160e81b815260040160405180910390fd5b6000806109a084611dcd565b915091506109c581876109b03390565b6001600160a01b039081169116811491141790565b6109f0576109d38633611abd565b6109f057604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610a1757604051633a954ecd60e21b815260040160405180910390fd5b8015610a2257600082555b610a2a611b0c565b6001600160a01b0387166000908152600591909101602052604090208054600019019055610a56611b0c565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b17610a8d611b0c565b60008681526004919091016020526040812091909155600160e11b84169003610b035760018401610abc611b0c565b600082815260049190910160205260408120549003610b0157610add611b0c565b548114610b015783610aed611b0c565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600080610b58611df5565b90506000610b64611779565b905083811115610b78575060009392505050565b6006820154604051639262b1b360e01b815230600482015285916001600160a01b031690639262b1b390602401602060405180830381865afa158015610bc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be69190614a86565b1115610bf6575060009392505050565b60088201546001600160a01b031615610c87576008820154604051635cf4ee9160e01b815260048101839052602481018690526001600160a01b0390911690635cf4ee9190604401602060405180830381865afa158015610c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7f9190614a86565b949350505050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c5b573d6000803e3d6000fd5b610cf783838360405180602001604052806000815250611818565b505050565b60026000805160206152288339815191525403610d2c57604051635db5c7cd60e11b815260040160405180910390fd5b610d43600260008051602061522883398151915255565b610d4e838383611e19565b610cf7600160008051602061522883398151915255565b60008051602061528883398151915254640100000000900460ff16610d9d57604051630ef4733760e31b815260040160405180910390fd5b610dad63421fb7a760e01b6120bc565b610db7828261219a565b6108b7826000015183602001516122bd565b610dd1611c32565b6001600160a01b0316336001600160a01b031614610e04576040516365f4906560e01b81523360048201526024016108f2565b6001600160a01b038116610e2b57604051635fbd571760e01b815260040160405180910390fd5b6000610e3561231f565b905080600003610e5857604051635894b54560e11b815260040160405180910390fd5b6108b7610e63610ff3565b308484612332565b60006108a582610e79611d13565b612378565b610e86611c32565b6001600160a01b0316336001600160a01b031614610eb9576040516365f4906560e01b81523360048201526024016108f2565b6000610ec3611205565b90508015801590610ed357508082115b15610ef15760405163c3983b9160e01b815260040160405180910390fd5b610efa826123be565b6108b782611ac9565b60006108a582611d32565b6000610947610ff3565b610f20611c32565b6001600160a01b0316336001600160a01b031614610f53576040516365f4906560e01b81523360048201526024016108f2565b610f5c81612463565b610f6461175d565b6001600160a01b03166391b7f5ed826040518263ffffffff1660e01b8152600401610f9191815260200190565b600060405180830381600087803b158015610fab57600080fd5b505af1158015610fbf573d6000803e3d6000fd5b5050505050565b80610fcf611df5565b60080180546001600160a01b0319166001600160a01b039290921691909117905550565b6000610ffd611df5565b600401546001600160a01b0316919050565b6000610947611779565b60006108a5826124f1565b8061102d611df5565b6003015550565b600061103e611df5565b600601546001600160a01b0316919050565b6000610947611034565b60008051602061528883398151915254640100000000900460ff1661109257604051630ef4733760e31b815260040160405180910390fd5b61109b81612559565b50565b600260008051602061522883398151915254036110ce57604051635db5c7cd60e11b815260040160405180910390fd5b6110e5600260008051602061522883398151915255565b60006110f082610f03565b90506001600160a01b03811661111957604051635fbd571760e01b815260040160405180910390fd5b60008281527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce0060205260409020546001600160401b0316611158612594565b6001600160401b031661116b4283614ab5565b106111895760405163dce9a1d360e01b815260040160405180910390fd5b600061119784610e79611d13565b905080156111d05760006111ab848361261a565b905060006111b98284614ab5565b905080156111cd576111cb8582612732565b505b50505b6111e1846111dc612594565b6128d0565b50505061109b600160008051602061522883398151915255565b6000610947612594565b600061120f611df5565b60030154905090565b6002600080516020615228833981519152540361124857604051635db5c7cd60e11b815260040160405180910390fd5b61125f600260008051602061522883398151915255565b61126881612999565b60405133606081901b6bffffffffffffffffffffffff191660208301524360348301526000918290605401604051602081830303815290604052805190602001209050600061132b826112ff84866112bf87612a02565b604080516020808201959095526001600160a01b039390931683820152606080840192909252805180840390920182526080909201909152805191012090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905061136d8184876040516020016113599291906001600160a01b0392831681529116602082015260400190565b604051602081830303815290604052612a37565b341561137d5761137d8134612a7e565b60006113a9604051806040016040528060098152602001684a6f696e537061636560b81b815250612b04565b905060005b81518110156115d25760008282815181106113cb576113cb614ac8565b6020026020010151905080604001516115c95760005b8160800151518110156115c75760008260800151828151811061140657611406614ac8565b60200260200101519050806001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561144e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114729190614ade565b6115aa576040805160018082528183019092526000916020808301908036833701905050905088816000815181106114ac576114ac614ac8565b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b0316630cf0b533600083604051806040016040528060098152602001684a6f696e537061636560b81b8152506040516020016115109190614afb565b60405160208183030381529060405261152890614b17565b6040518463ffffffff1660e01b815260040161154693929190614b75565b602060405180830381865afa158015611563573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115879190614ade565b156115a45761159587612d4e565b50505050505050505050611613565b506115be565b6115b986828560000151612ea3565b600198505b506001016113e1565b505b506001016113ae565b508461160d576040516001600160a01b038716907f86fd446d5c04e892d58b448a924dcd9c3ece3a5e0d2960b8c35cd475a5595a1f90600090a25b50505050505b61109b600160008051602061522883398151915255565b61164e60405180606001604052806060815260200160608152602001606081525090565b6116588383613152565b9392505050565b6060610947611a4e565b6000610947611205565b606061167d611b0c565b600301805461081790614a52565b611693611c32565b6001600160a01b0316336001600160a01b0316146116c6576040516365f4906560e01b81523360048201526024016108f2565b6116d7816116d2611d13565b61324c565b61109b81611024565b806116e9611b0c565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000611767611df5565b600801546001600160a01b0316919050565b600080611784611df5565b600781015490915080156117985792915050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118119190614a86565b9250505090565b611823848484610956565b6001600160a01b0383163b1561185c5761183f8484848461326d565b61185c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061186d82613358565b61188a57604051630a14c4b560e41b815260040160405180910390fd5b60006118a160408051602081019091526000815290565b905080516000036118c15760405180602001604052806000815250611658565b806118cb84613394565b6040516020016118dc929190614b9e565b6040516020818303038152906040529392505050565b6002600080516020615228833981519152540361192257604051635db5c7cd60e11b815260040160405180910390fd5b611939600260008051602061522883398151915255565b61194283612999565b600061194c6133d8565b9050600061195b6103e0611d13565b905080156119dc5761196d82826133e8565b6000611979868361261a565b905060006119878284614ab5565b90506000611993610ff3565b905081156119d85760006119a78388613408565b90506119b5828a8a84612332565b60006119c18285614ab5565b905080156119d5576119d38a82612732565b505b50505b5050505b6119e78560016134bb565b6119f3826111dc612594565b5050610cf7600160008051602061522883398151915255565b60008051602061528883398151915254640100000000900460ff16611a4457604051630ef4733760e31b815260040160405180910390fd5b6108b782826122bd565b6060611a58611df5565b600c01805461081790614a52565b611a6e611c32565b6001600160a01b0316336001600160a01b031614611aa1576040516365f4906560e01b81523360048201526024016108f2565b611aaa816134d5565b61109b81610fc6565b600061094761175d565b6000611658838361358d565b6000611ad3611df5565b6007810183905560405190915082907fab14a23e88fb272313490d4f20d63098e64fd38304c0e07a377db98c2b39b92f90600090a25050565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b6000611b3b82613358565b611b58576040516333d1c03960e21b815260040160405180910390fd5b611b60611b0c565b60009283526006016020525060409020546001600160a01b031690565b6000611b8883610f03565b90508115611bc757336001600160a01b03821614611bc757611baa813361358d565b611bc7576040516367d9dca160e11b815260040160405180910390fd5b83611bd0611b0c565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015611cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190614bcd565b91505090565b80611d05611df5565b600c01906108b79082614c32565b600080611d1e611b0c565b60010154611d2a611b0c565b540303919050565b600080611d3d611b0c565b60008481526004820160205260408120549350909150600160e01b83169003611db35781600003611dad5780548310611d8957604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115611d8a575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b6000806000611dda611b0c565b60009485526006016020525050604090912080549092909150565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60090565b60008381526000805160206152088339815191526020526040902080546000805160206151e8833981519152919061010090046001600160a01b03161580611e635750805460ff16155b15611e8157604051637ad5a43960e11b815260040160405180910390fd5b600084815260028201602052604090205460ff1615611eb357604051637912b73960e01b815260040160405180910390fd5b600084815260018201602052604081205481908190815b81811015611ff15760008981526001870160205260408120805483908110611ef457611ef4614ac8565b60009182526020909120018054909150336001600160a01b0390911603611f805760008154600160a01b900460ff166002811115611f3457611f34614771565b14611f52576040516347592a4d60e01b815260040160405180910390fd5b80548990829060ff60a01b1916600160a01b836002811115611f7657611f76614771565b0217905550600195505b60018154600160a01b900460ff166002811115611f9f57611f9f614771565b03611fb65784611fae81614cf1565b955050611fe8565b60028154600160a01b900460ff166002811115611fd557611fd5614771565b03611fe85783611fe481614cf1565b9450505b50600101611eca565b508361201057604051638223a7e960e01b815260040160405180910390fd5b61201b600282614d0a565b831180612031575061202e600282614d0a565b82115b156120b15760008881526002860160205260408120805460ff1916600117905582841161205f576002612062565b60015b905061206e8a826135ca565b897fb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c6338260405161209e9190614d2c565b60405180910390a26120af8a6136a2565b505b505050505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114612149576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055612162565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006121a4611df5565b6006810180546001600160a01b038086166001600160a01b031992831617909255610100860151600884018054919093169082161790915560048201805490911673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1790556060840151600382015560e08401516007820181905590915015612228576122288360e001516123be565b6122368361010001516134d5565b604083015115610cf75761224d8360400151612463565b600881015460408085015190516391b7f5ed60e01b81526001600160a01b03909216916391b7f5ed916122869160040190815260200190565b600060405180830381600087803b1580156122a057600080fd5b505af11580156122b4573d6000803e3d6000fd5b50505050505050565b60008051602061528883398151915254640100000000900460ff166122f557604051630ef4733760e31b815260040160405180910390fd5b6123056380ac58cd60e01b6120bc565b612315635b5e139f60e01b6120bc565b6108b7828261376f565b6000612329611df5565b600a0154905090565b801561185c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b0385160161236c5761236782826137a1565b61185c565b61185c84848484613844565b600080612383611df5565b6000858152600982016020526040902054909150156123b55760008481526009909101602052604090205490506108a5565b610c7f83610b4d565b60006123c8611df5565b90508060060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa15801561241f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124439190614a86565b8211156108b75760405163c3983b9160e01b815260040160405180910390fd5b600061246d611034565b6001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ce9190614a86565b9050808210156108b757604051631a23d64760e11b815260040160405180910390fd5b60006001600160a01b03821661251a576040516323d3ad8160e21b815260040160405180910390fd5b6001600160401b0361252a611b0c565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b612569636afd38fd60e11b6120bc565b6000805160206151e883398151915280546001600160a01b0319166001600160a01b03831617905550565b60008061259f611df5565b90508060060160009054906101000a90046001600160a01b03166001600160a01b0316638120f0ba6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190614d3f565b600080612625611df5565b6006810154600480830154604080516301332c8360e61b815290519495506001600160a01b039384169493909116926000928592634ccb20c092818301926020928290030181865afa15801561267f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a39190614bcd565b90506000836001600160a01b0316639f6542aa6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127099190614d5c565b9050612719878261ffff16613897565b955061272783898489612332565b505050505092915050565b60008061273d611df5565b90506000612749610ff3565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03821601612794578382600a0160008282546127849190614d80565b909155508493506108a592505050565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156127dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128019190614a86565b905061280f83883089612332565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015612856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287a9190614a86565b905060006128888383614ab5565b90508781146128aa57604051635894b54560e11b815260040160405180910390fd5b8086600a0160008282546128be9190614d80565b90915550909998505050505050505050565b60008281527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce006020819052604082205490916001600160401b03909116908181036129265761291f8442614d93565b9050612933565b6129308483614d93565b90505b60008581526020848152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825286917f2ec2be2c4b90c2cf13ecb6751a24daed6bb741ae5ed3f7371aabf9402f6d62e8910160405180910390a25050505050565b6001600160a01b0381166129c057604051635fbd571760e01b815260040160405180910390fd5b6129c8611205565b158015906129e457506129d9611205565b6129e1611d13565b10155b1561109b57604051637efcdb4960e01b815260040160405180910390fd5b600081815260008051602061524883398151915260208190526040822080549083612a2c83614cf1565b909155509392505050565b60008281527f34516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e02602052604090206000805160206152488339815191529061185c8382614c32565b80600003612a9f5760405163acdc0d4960e01b815260040160405180910390fd5b803414612abf5760405163acdc0d4960e01b815260040160405180910390fd5b60008281526000805160206152a883398151915260205260408120805460008051602061524883398151915292849291612afa908490614d80565b9091555050505050565b60606000612b1061390c565b80519091506000816001600160401b03811115612b2f57612b2f6144bd565b604051908082528060200260200182016040528015612b58578160200160208202803683370190505b5085516020870120909150600090815b84811015612c27576000612b94878381518110612b8757612b87614ac8565b6020026020010151613937565b509250505060005b8151811015612c1d5783828281518110612bb857612bb8614ac8565b60200260200101518051906020012003612c1557878381518110612bde57612bde614ac8565b6020026020010151868681518110612bf857612bf8614ac8565b602090810291909101015284612c0d81614cf1565b955050612c1d565b600101612b9c565b5050600101612b68565b506000826001600160401b03811115612c4257612c426144bd565b604051908082528060200260200182016040528015612ca757816020015b612c946040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b815260200190600190039081612c605790505b50905060005b83811015612d42576000858281518110612cc957612cc9614ac8565b60200260200101519050600080600080612ce285613937565b93509350935093506040518060a00160405280868152602001858152602001841515815260200183815260200182815250878781518110612d2557612d25614ac8565b602002602001018190525050505050508080600101915050612cad565b50979650505050505050565b600080612d5a83613a62565b806020019051810190612d6d9190614db3565b915091506000612d7e6103e0611d13565b90506000612d8a6133d8565b90508115612e4f5760008581526000805160206152a8833981519152602052604081205490819003612dcf57604051635894b54560e11b815260040160405180910390fd5b80831115612df057604051635894b54560e11b815260040160405180910390fd5b612dfa82846133e8565b6000612e06868561261a565b90506000612e148286614ab5565b90508015612e2857612e268782612732565b505b612e328886613b33565b612e4b8860405180602001604052806000815250612a37565b5050505b612e5a8360016134bb565b612e66816111dc612594565b60405181906001600160a01b038516907f2f40b0474996b72a4251e00fb9170cdd960deea1dc749772cbbab61395b9b57690600090a35050505050565b60008381526000805160206152088339815191526020526040902080546000805160206151e8833981519152919060ff161515600103612f355760005b6004820154811015612f335783826004018281548110612f0257612f02614ac8565b906000526020600020015403612f2b576040516301ab53df60e31b815260040160405180910390fd5b600101612ee0565b505b81546001600160a01b0316612f4c57612f4c613b6e565b8154604051634f84544560e01b8152600560048201526000916001600160a01b031690634f84544590602401600060405180830381865afa158015612f95573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612fbd9190810190614e05565b825490915060ff16612ffe5781546003830180546001600160a01b0319166001600160a01b0388161790556001600160a81b03191661010033021760011782555b600482018054600181018255600091825260208220018590555b81518110156130ee57826001016000868152602001908152602001600020604051806040016040528084848151811061305357613053614ac8565b60200260200101516001600160a01b031681526020016000600281111561307c5761307c614771565b9052815460018101835560009283526020928390208251910180546001600160a01b031981166001600160a01b03909316928317825593830151929390929183916001600160a81b03191617600160a01b8360028111156130df576130df614771565b02179055505050600101613018565b50825460405163541da4e560e01b81526001600160a01b039091169063541da4e5906131249033908a9089908790600401614e98565b600060405180830381600087803b15801561313e57600080fd5b505af11580156120af573d6000803e3d6000fd5b61317660405180606001604052806060815260200160608152602001606081525090565b60008381526000805160206152088339815191526020526040812080546000805160206151e88339815191529260ff909116151590036131c957604051637ad5a43960e11b815260040160405180910390fd5b600381015460405163069a3ee960e01b8152600481018690526001600160a01b0390911690600090829063069a3ee990602401600060405180830381865afa158015613219573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132419190810190615036565b979650505050505050565b808210156108b757604051636664d51760e11b815260040160405180910390fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906132a2903390899088908890600401615173565b6020604051808303816000875af19250505080156132dd575060408051601f3d908101601f191682019092526132da918101906151a6565b60015b61333b573d80801561330b576040519150601f19603f3d011682016040523d82523d6000602084013e613310565b606091505b508051600003613333576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000613362611b0c565b54821080156108a55750600160e01b613379611b0c565b60008481526004919091016020526040902054161592915050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806133ae5750819003601f19909101908152919050565b60006133e2611b0c565b54919050565b806133f1611df5565b600093845260090160205260409092209190915550565b60008181527f3c2290b88407133303e904ceb4ee7d0d14164eda8a629372d8406216ceb57e006020819052604082205461ffff1680830361344e576000925050506108a5565b600084815260018084016020908152604092839020835180850190945280548085529201549083015215801590613492575080514210806134925750806020015142115b156134a357600093505050506108a5565b6134b1868361ffff16613897565b9695505050505050565b6108b7828260405180602001604052806000815250613c22565b6001600160a01b0381166134fc57604051630e88bf4b60e01b815260040160405180910390fd5b613504611034565b6040516346fc05eb60e11b81526001600160a01b0383811660048301529190911690638df80bd690602401602060405180830381865afa15801561354c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135709190614ade565b61109b57604051630e88bf4b60e01b815260040160405180910390fd5b6000613597611b0c565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b60018160028111156135de576135de614771565b036135ec576108b782612d4e565b6000806135f884613a62565b80602001905181019061360b9190614db3565b915091506136288460405180602001604052806000815250612a37565b60008481526000805160206152a883398151915260205260409020548015613667576136548582613b33565b61366761365f610ff3565b308584612332565b6040516001600160a01b038316907f86fd446d5c04e892d58b448a924dcd9c3ece3a5e0d2960b8c35cd475a5595a1f90600090a25050505050565b6000818152600080516020615208833981519152602052604081206000805160206151e8833981519152915b6004820154811015613722578160010160008360040183815481106136f5576136f5614ac8565b90600052602060002001548152602001908152602001600020600061371a9190614284565b6001016136ce565b506137316004820160006142a2565b6000838152600183016020526040812080546001600160a81b03191681556003810180546001600160a01b031916905590610fbf60048301826142a2565b6000613779611b0c565b9050600281016137898482614c32565b50600381016137988382614c32565b50600090555050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146137ee576040519150601f19603f3d011682016040523d82523d6000602084013e6137f3565b606091505b5050905080610cf75760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c65640000000060448201526064016108f2565b816001600160a01b0316836001600160a01b0316031561185c57306001600160a01b03841603613882576123676001600160a01b0385168383613c98565b61185c6001600160a01b038516848484613cf7565b60006127108211156138f55760405162461bcd60e51b815260206004820152602160248201527f426173697320706f696e74732063616e6e6f74206578636565642031305f30306044820152600360fc1b60648201526084016108f2565b61271061390283856151d0565b6116589190614d0a565b60606109477f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01613d30565b600081815260008051602061526883398151915260205260408120805460609291839182919061396690614a52565b80601f016020809104026020016040519081016040528092919081815260200182805461399290614a52565b80156139df5780601f106139b4576101008083540402835291602001916139df565b820191906000526020600020905b8154815290600101906020018083116139c257829003601f168201915b50505050509350613a0d7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0090565b6000868152600391909101602090815260408083206001015460008051602061526883398151915290925290912060ff9091169350613a4e90600201613d3d565b9150613a5985613d48565b90509193509193565b60008181527f34516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e0260205260409020805460609160008051602061524883398151915291613aad90614a52565b80601f0160208091040260200160405190810160405280929190818152602001828054613ad990614a52565b8015613b265780601f10613afb57610100808354040283529160200191613b26565b820191906000526020600020905b815481529060010190602001808311613b0957829003601f168201915b5050505050915050919050565b60008281526000805160206152a883398151915260205260408120805460008051602061524883398151915292849291612afa908490614ab5565b6000805160206151e88339815191526000613b87611df5565b60060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa158015613bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c039190614bcd565b82546001600160a01b0319166001600160a01b03919091161790915550565b613c2c8383613e4c565b6001600160a01b0383163b15610cf7576000613c46611b0c565b5490508281035b613c60600086838060010194508661326d565b613c7d576040516368d2bf6b60e11b815260040160405180910390fd5b818110613c4d5781613c8d611b0c565b5414610fbf57600080fd5b6040516001600160a01b03838116602483015260448201839052610cf791859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613f87565b6040516001600160a01b03848116602483015283811660448301526064820183905261185c9186918216906323b872dd90608401613cc5565b6060600061165883613fea565b60606108a582614046565b60008181526000805160206152688339815191526020526040812060609190613d7390600401614123565b6001600160401b03811115613d8a57613d8a6144bd565b604051908082528060200260200182016040528015613db3578160200160208202803683370190505b50905060005b600084815260008051602061526883398151915260205260409020613de090600401614123565b811015613e4557600084815260008051602061526883398151915260205260408120613e0f906004018361412d565b905080838381518110613e2457613e24614ac8565b6001600160a01b039092166020928302919091019091015250600101613db9565b5092915050565b6000613e56611b0c565b5490506000829003613e7b5760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202613e8f611b0c565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717613eca611b0c565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114613f5457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101613f1c565b5081600003613f7557604051622e076360e81b815260040160405180910390fd5b80613f7e611b0c565b5550610cf79050565b6000613f9c6001600160a01b03841683614139565b90508051600014158015613fc1575080806020019051810190613fbf9190614ade565b155b15610cf757604051635274afe760e01b81526001600160a01b03841660048201526024016108f2565b60608160000180548060200260200160405190810160405280929190818152602001828054801561403a57602002820191906000526020600020905b815481526020019060010190808311614026575b50505050509050919050565b606081600001805480602002602001604051908101604052809291908181526020016000905b8282101561411857838290600052602060002001805461408b90614a52565b80601f01602080910402602001604051908101604052809291908181526020018280546140b790614a52565b80156141045780601f106140d957610100808354040283529160200191614104565b820191906000526020600020905b8154815290600101906020018083116140e757829003601f168201915b50505050508152602001906001019061406c565b505050509050919050565b60006108a5825490565b60006116588383614147565b606061165883836000614171565b600082600001828154811061415e5761415e614ac8565b9060005260206000200154905092915050565b6060814710156141965760405163cd78605960e01b81523060048201526024016108f2565b600080856001600160a01b031684866040516141b29190614afb565b60006040518083038185875af1925050503d80600081146141ef576040519150601f19603f3d011682016040523d82523d6000602084013e6141f4565b606091505b50915091506134b18683836060826142145761420f8261425b565b611658565b815115801561422b57506001600160a01b0384163b155b1561425457604051639996b31560e01b81526001600160a01b03851660048201526024016108f2565b5080611658565b80511561426b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054600082559060005260206000209081019061109b91906142c0565b508054600082559060005260206000209081019061109b91906142e3565b5b808211156142df5780546001600160a81b03191681556001016142c1565b5090565b5b808211156142df57600081556001016142e4565b60005b838110156143135781810151838201526020016142fb565b50506000910152565b600081518084526143348160208601602086016142f8565b601f01601f19169290920160200192915050565b602081526000611658602083018461431c565b60006020828403121561436d57600080fd5b5035919050565b6001600160a01b038116811461109b57600080fd5b803561439481614374565b919050565b600080604083850312156143ac57600080fd5b82356143b781614374565b946020939093013593505050565b600080602083850312156143d857600080fd5b82356001600160401b03808211156143ef57600080fd5b818501915085601f83011261440357600080fd5b81358181111561441257600080fd5b86602082850101111561442457600080fd5b60209290920196919550909350505050565b60008060006060848603121561444b57600080fd5b833561445681614374565b9250602084013561446681614374565b929592945050506040919091013590565b6003811061109b57600080fd5b60008060006060848603121561449957600080fd5b833592506020840135915060408401356144b281614477565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b03811182821017156144f6576144f66144bd565b60405290565b604051608081016001600160401b03811182821017156144f6576144f66144bd565b604051606081016001600160401b03811182821017156144f6576144f66144bd565b604080519081016001600160401b03811182821017156144f6576144f66144bd565b604051601f8201601f191681016001600160401b038111828210171561458a5761458a6144bd565b604052919050565b60006001600160401b038311156145ab576145ab6144bd565b6145be601f8401601f1916602001614562565b90508281528383830111156145d257600080fd5b828260208301376000602084830101529392505050565b600082601f8301126145fa57600080fd5b61165883833560208501614592565b6001600160401b038116811461109b57600080fd5b803561439481614609565b6000806040838503121561463c57600080fd5b82356001600160401b038082111561465357600080fd5b90840190610120828703121561466857600080fd5b6146706144d3565b82358281111561467f57600080fd5b61468b888286016145e9565b8252506020830135828111156146a057600080fd5b6146ac888286016145e9565b60208301525060408301356040820152606083013560608201526146d26080840161461e565b60808201526146e360a08401614389565b60a08201526146f460c08401614389565b60c082015260e083013560e08201526101009150614713828401614389565b8282015280945050505061472960208401614389565b90509250929050565b60006020828403121561474457600080fd5b813561165881614374565b6000806040838503121561476257600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b6003811061109b5761109b614771565b60008151808452602080850194506020840160005b838110156148015781518051600681106147c8576147c8614771565b885280840151848901526040808201516001600160a01b03169089015260609081015190880152608090960195908201906001016147ac565b509495945050505050565b60008151808452602080850194506020840160005b83811015614801578151805161483681614787565b88528084015160ff908116858a0152604091820151169088015260609096019590820190600101614821565b6020808252825160608383015280516080840181905260009291820190839060a08601905b808310156148be578351805161489c81614787565b835285015160ff16858301529284019260019290920191604090910190614887565b50838701519350601f199250828682030160408701526148de8185614797565b935050506040850151818584030160608601526134b1838261480c565b801515811461109b57600080fd5b6000806040838503121561491c57600080fd5b823561492781614374565b91506020830135614937816148fb565b809150509250929050565b6000806000806080858703121561495857600080fd5b843561496381614374565b9350602085013561497381614374565b92506040850135915060608501356001600160401b0381111561499557600080fd5b8501601f810187136149a657600080fd5b6149b587823560208401614592565b91505092959194509250565b600080604083850312156149d457600080fd5b82356001600160401b03808211156149eb57600080fd5b6149f7868387016145e9565b93506020850135915080821115614a0d57600080fd5b50614a1a858286016145e9565b9150509250929050565b60008060408385031215614a3757600080fd5b8235614a4281614374565b9150602083013561493781614374565b600181811c90821680614a6657607f821691505b602082108103611dad57634e487b7160e01b600052602260045260246000fd5b600060208284031215614a9857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108a5576108a5614a9f565b634e487b7160e01b600052603260045260246000fd5b600060208284031215614af057600080fd5b8151611658816148fb565b60008251614b0d8184602087016142f8565b9190910192915050565b80516020808301519190811015611dad5760001960209190910360031b1b16919050565b60008151808452602080850194506020840160005b838110156148015781516001600160a01b031687529582019590820190600101614b50565b838152606060208201526000614b8e6060830185614b3b565b9050826040830152949350505050565b60008351614bb08184602088016142f8565b835190830190614bc48183602088016142f8565b01949350505050565b600060208284031215614bdf57600080fd5b815161165881614374565b601f821115610cf7576000816000526020600020601f850160051c81016020861015614c135750805b601f850160051c820191505b81811015610b4557828155600101614c1f565b81516001600160401b03811115614c4b57614c4b6144bd565b614c5f81614c598454614a52565b84614bea565b602080601f831160018114614c945760008415614c7c5750858301515b600019600386901b1c1916600185901b178555610b45565b600085815260208120601f198616915b82811015614cc357888601518255948401946001909101908401614ca4565b5085821015614ce15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201614d0357614d03614a9f565b5060010190565b600082614d2757634e487b7160e01b600052601260045260246000fd5b500490565b60208101614d3983614787565b91905290565b600060208284031215614d5157600080fd5b815161165881614609565b600060208284031215614d6e57600080fd5b815161ffff8116811461165857600080fd5b808201808211156108a5576108a5614a9f565b6001600160401b03818116838216019080821115613e4557613e45614a9f565b60008060408385031215614dc657600080fd5b8251614dd181614374565b602084015190925061493781614374565b60006001600160401b03821115614dfb57614dfb6144bd565b5060051b60200190565b60006020808385031215614e1857600080fd5b82516001600160401b03811115614e2e57600080fd5b8301601f81018513614e3f57600080fd5b8051614e52614e4d82614de2565b614562565b81815260059190911b82018301908381019087831115614e7157600080fd5b928401925b82841015613241578351614e8981614374565b82529284019290840190614e76565b60018060a01b03851681528360208201528260408201526080606082015260006134b16080830184614b3b565b805160ff8116811461439457600080fd5b600082601f830112614ee757600080fd5b81516020614ef7614e4d83614de2565b82815260079290921b84018101918181019086841115614f1657600080fd5b8286015b84811015614f805760808189031215614f335760008081fd5b614f3b6144fc565b815160068110614f4b5760008081fd5b81528185015185820152604080830151614f6481614374565b9082015260608281015190820152835291830191608001614f1a565b509695505050505050565b600082601f830112614f9c57600080fd5b81516020614fac614e4d83614de2565b82815260609283028501820192828201919087851115614fcb57600080fd5b8387015b858110156150295781818a031215614fe75760008081fd5b614fef61451e565b8151614ffa81614477565b8152615007828701614ec5565b868201526040615018818401614ec5565b908201528452928401928101614fcf565b5090979650505050505050565b6000602080838503121561504957600080fd5b82516001600160401b038082111561506057600080fd5b908401906060828703121561507457600080fd5b61507c61451e565b82518281111561508b57600080fd5b8301601f8101881361509c57600080fd5b80516150aa614e4d82614de2565b81815260069190911b8201860190868101908a8311156150c957600080fd5b928701925b8284101561511d576040848c0312156150e75760008081fd5b6150ef614540565b84516150fa81614477565b8152615107858a01614ec5565b818a0152825260409390930192908701906150ce565b8452505050828401518281111561513357600080fd5b61513f88828601614ed6565b8583015250604083015193508184111561515857600080fd5b61516487858501614f8b565b60408201529695505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134b19083018461431c565b6000602082840312156151b857600080fd5b81516001600160e01b03198116811461165857600080fd5b80820281158282048414176108a5576108a5614a9f56fe9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e0154f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0034516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e00672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0359b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200034516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e01 \ No newline at end of file diff --git a/packages/generated/v3/abis/MembershipFacet.json b/packages/generated/v3/abis/MembershipFacet.json new file mode 100644 index 000000000..1816390b1 --- /dev/null +++ b/packages/generated/v3/abis/MembershipFacet.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__ERC721A_init","inputs":[{"name":"name_","type":"string","internalType":"string"},{"name":"symbol_","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"__EntitlementGated_init","inputs":[{"name":"entitlementChecker","type":"address","internalType":"contract IEntitlementChecker"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"__Membership_init","inputs":[{"name":"info","type":"tuple","internalType":"struct IMembershipBase.Membership","components":[{"name":"name","type":"string","internalType":"string"},{"name":"symbol","type":"string","internalType":"string"},{"name":"price","type":"uint256","internalType":"uint256"},{"name":"maxSupply","type":"uint256","internalType":"uint256"},{"name":"duration","type":"uint64","internalType":"uint64"},{"name":"currency","type":"address","internalType":"address"},{"name":"feeRecipient","type":"address","internalType":"address"},{"name":"freeAllocation","type":"uint256","internalType":"uint256"},{"name":"pricingModule","type":"address","internalType":"address"}]},{"name":"spaceFactory","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"_getMembershipCurrency","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"_getMembershipFreeAllocation","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"_getMembershipImage","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"_getMembershipPrice","inputs":[{"name":"totalSupply","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"_getMembershipSupplyLimit","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"_getPricingModule","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"_getSpaceFactory","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"_setMembershipFreeAllocation","inputs":[{"name":"newAllocation","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"_setMembershipSupplyLimit","inputs":[{"name":"newLimit","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"_setPricingModule","inputs":[{"name":"newPricingModule","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"approve","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"balanceOf","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expiresAt","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getApproved","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getMembershipCurrency","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getMembershipDuration","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"getMembershipFreeAllocation","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getMembershipImage","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"getMembershipLimit","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getMembershipPrice","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getMembershipPricingModule","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getMembershipRenewalPrice","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRuleData","inputs":[{"name":"transactionId","type":"bytes32","internalType":"bytes32"},{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IRuleEntitlement.RuleData","components":[{"name":"operations","type":"tuple[]","internalType":"struct IRuleEntitlement.Operation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CombinedOperationType"},{"name":"index","type":"uint8","internalType":"uint8"}]},{"name":"checkOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.CheckOperation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CheckOperationType"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"contractAddress","type":"address","internalType":"address"},{"name":"threshold","type":"uint256","internalType":"uint256"}]},{"name":"logicalOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.LogicalOperation[]","components":[{"name":"logOpType","type":"uint8","internalType":"enum IRuleEntitlement.LogicalOperationType"},{"name":"leftOperationIndex","type":"uint8","internalType":"uint8"},{"name":"rightOperationIndex","type":"uint8","internalType":"uint8"}]}]}],"stateMutability":"view"},{"type":"function","name":"getSpaceFactory","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"isApprovedForAll","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"joinSpace","inputs":[{"name":"receiver","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"joinSpaceWithReferral","inputs":[{"name":"receiver","type":"address","internalType":"address"},{"name":"referrer","type":"address","internalType":"address"},{"name":"referralCode","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"ownerOf","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"postEntitlementCheckResult","inputs":[{"name":"transactionId","type":"bytes32","internalType":"bytes32"},{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"result","type":"uint8","internalType":"enum IEntitlementGatedBase.NodeVoteStatus"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renewMembership","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"setApprovalForAll","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMembershipFreeAllocation","inputs":[{"name":"newAllocation","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMembershipImage","inputs":[{"name":"newImage","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMembershipLimit","inputs":[{"name":"newLimit","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMembershipPrice","inputs":[{"name":"newPrice","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMembershipPricingModule","inputs":[{"name":"pricingModule","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"tokenURI","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"withdraw","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"Banned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ConsecutiveTransfer","inputs":[{"name":"fromTokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"toTokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EntitlementCheckResultPosted","inputs":[{"name":"transactionId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"result","type":"uint8","indexed":false,"internalType":"enum IEntitlementGatedBase.NodeVoteStatus"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"MembershipCurrencyUpdated","inputs":[{"name":"currency","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"MembershipFeeRecipientUpdated","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"MembershipFreeAllocationUpdated","inputs":[{"name":"allocation","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"MembershipLimitUpdated","inputs":[{"name":"limit","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"MembershipPriceUpdated","inputs":[{"name":"price","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"MembershipTokenIssued","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"MembershipTokenRejected","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"MembershipWithdrawal","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Membership__ReferralCreated","inputs":[{"name":"code","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"bps","type":"uint16","indexed":false,"internalType":"uint16"}],"anonymous":false},{"type":"event","name":"Membership__ReferralRemoved","inputs":[{"name":"code","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Membership__ReferralTimeCreated","inputs":[{"name":"code","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"bps","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"startTime","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"endTime","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleCreated","inputs":[{"name":"creator","type":"address","indexed":true,"internalType":"address"},{"name":"roleId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"RoleRemoved","inputs":[{"name":"remover","type":"address","indexed":true,"internalType":"address"},{"name":"roleId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"RoleUpdated","inputs":[{"name":"updater","type":"address","indexed":true,"internalType":"address"},{"name":"roleId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"SubscriptionUpdate","inputs":[{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"expiration","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unbanned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"AddressInsufficientBalance","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"ApprovalCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"ApprovalQueryForNonexistentToken","inputs":[]},{"type":"error","name":"BalanceQueryForZeroAddress","inputs":[]},{"type":"error","name":"Banning__AlreadyBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__CannotBanSelf","inputs":[]},{"type":"error","name":"Banning__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__NotBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Dispatcher__InvalidCaller","inputs":[]},{"type":"error","name":"Dispatcher__InvalidValue","inputs":[]},{"type":"error","name":"ERC5643__DurationZero","inputs":[]},{"type":"error","name":"ERC5643__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC5643__NotApprovedOrOwner","inputs":[]},{"type":"error","name":"ERC5643__SubscriptionNotRenewable","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"EntitlementGated_InvalidAddress","inputs":[]},{"type":"error","name":"EntitlementGated_NodeAlreadyVoted","inputs":[]},{"type":"error","name":"EntitlementGated_NodeNotFound","inputs":[]},{"type":"error","name":"EntitlementGated_TransactionCheckAlreadyCompleted","inputs":[]},{"type":"error","name":"EntitlementGated_TransactionCheckAlreadyRegistered","inputs":[]},{"type":"error","name":"EntitlementGated_TransactionNotRegistered","inputs":[]},{"type":"error","name":"Entitlement__InvalidValue","inputs":[]},{"type":"error","name":"Entitlement__NotAllowed","inputs":[]},{"type":"error","name":"Entitlement__NotMember","inputs":[]},{"type":"error","name":"Entitlement__ValueAlreadyExists","inputs":[]},{"type":"error","name":"FailedInnerCall","inputs":[]},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"Membership__AlreadyMember","inputs":[]},{"type":"error","name":"Membership__InsufficientAllowance","inputs":[]},{"type":"error","name":"Membership__InsufficientPayment","inputs":[]},{"type":"error","name":"Membership__InvalidAddress","inputs":[]},{"type":"error","name":"Membership__InvalidCurrency","inputs":[]},{"type":"error","name":"Membership__InvalidDuration","inputs":[]},{"type":"error","name":"Membership__InvalidFeeRecipient","inputs":[]},{"type":"error","name":"Membership__InvalidFreeAllocation","inputs":[]},{"type":"error","name":"Membership__InvalidLimit","inputs":[]},{"type":"error","name":"Membership__InvalidMaxSupply","inputs":[]},{"type":"error","name":"Membership__InvalidPrice","inputs":[]},{"type":"error","name":"Membership__InvalidPricingModule","inputs":[]},{"type":"error","name":"Membership__InvalidReferralBps","inputs":[]},{"type":"error","name":"Membership__InvalidReferralCode","inputs":[]},{"type":"error","name":"Membership__InvalidReferralTime","inputs":[]},{"type":"error","name":"Membership__InvalidTokenId","inputs":[]},{"type":"error","name":"Membership__MaxSupplyReached","inputs":[]},{"type":"error","name":"Membership__NotExpired","inputs":[]},{"type":"error","name":"Membership__PriceTooLow","inputs":[]},{"type":"error","name":"MintERC2309QuantityExceedsLimit","inputs":[]},{"type":"error","name":"MintToZeroAddress","inputs":[]},{"type":"error","name":"MintZeroQuantity","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]},{"type":"error","name":"OwnerQueryForNonexistentToken","inputs":[]},{"type":"error","name":"OwnershipNotInitializedForExtraData","inputs":[]},{"type":"error","name":"Pausable__NotPaused","inputs":[]},{"type":"error","name":"Pausable__Paused","inputs":[]},{"type":"error","name":"ReentrancyGuard__ReentrantCall","inputs":[]},{"type":"error","name":"Roles__EntitlementAlreadyExists","inputs":[]},{"type":"error","name":"Roles__EntitlementDoesNotExist","inputs":[]},{"type":"error","name":"Roles__InvalidEntitlementAddress","inputs":[]},{"type":"error","name":"Roles__InvalidPermission","inputs":[]},{"type":"error","name":"Roles__PermissionAlreadyExists","inputs":[]},{"type":"error","name":"Roles__PermissionDoesNotExist","inputs":[]},{"type":"error","name":"Roles__RoleDoesNotExist","inputs":[]},{"type":"error","name":"SafeERC20FailedOperation","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"type":"error","name":"TransferCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"TransferFromIncorrectOwner","inputs":[]},{"type":"error","name":"TransferToNonERC721ReceiverImplementer","inputs":[]},{"type":"error","name":"TransferToZeroAddress","inputs":[]},{"type":"error","name":"URIQueryForNonexistentToken","inputs":[]}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b506200001c62000022565b620000ca565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16156200006f576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff9081161015620000c757805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6152c880620000da6000396000f3fe6080604052600436106102885760003560e01c806377460cd31161015a578063a22cb465116100c1578063d2f01f191161007a578063d2f01f1914610745578063d33d934514610765578063df9a9fe61461077a578063e847abdd1461079a578063e985e9c5146107af578063f9d5d22c146107df57600080fd5b8063a22cb465146106b5578063ac7ee626146106d5578063b3a5be6d146106ea578063b88d4fde146106ff578063c87b56dd14610712578063c9f7c8331461073257600080fd5b80638c625b06116101135780638c625b061461061657806392c399ff1461062957806393b13cb71461065657806395d600c81461066b57806395d89b411461068057806397fb7c1e1461069557600080fd5b806377460cd31461057757806379dda5851461058c5780637adc9cbe146105a15780637c9669ac146105c15780638120f0ba146105d45780638934207f1461060157600080fd5b80634c2abfbe116101fe57806369d5f38a116101b757806369d5f38a146104cd57806369d9346b146104ed578063702515631461050d578063706b8e091461052257806370a082311461053757806373fc5a051461055757600080fd5b80634c2abfbe1461041857806351cff8d9146104385780635803909f146104585780635becd24a146104785780636352211e14610498578063657e45e8146104b857600080fd5b806317c957091161025057806317c957091461034857806318160ddd1461039d57806323b872dd146103b25780633ded10de146103c557806342842e0e146103e55780634739e805146103f857600080fd5b806306fdde031461028d578063081812fc146102b8578063095ea7b3146102f05780630ef1be5f146103055780631278076a14610325575b600080fd5b34801561029957600080fd5b506102a26107ff565b6040516102af9190614348565b60405180910390f35b3480156102c457600080fd5b506102d86102d336600461435b565b61089a565b6040516001600160a01b0390911681526020016102af565b6103036102fe366004614399565b6108ab565b005b34801561031157600080fd5b506103036103203660046143c5565b6108bb565b34801561033157600080fd5b5061033a61093a565b6040519081526020016102af565b34801561035457600080fd5b5061033a61036336600461435b565b60009081527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce0060205260409020546001600160401b031690565b3480156103a957600080fd5b5061033a61094c565b6103036103c0366004614436565b610956565b3480156103d157600080fd5b5061033a6103e036600461435b565b610b4d565b6103036103f3366004614436565b610cdc565b34801561040457600080fd5b50610303610413366004614484565b610cfc565b34801561042457600080fd5b50610303610433366004614629565b610d65565b34801561044457600080fd5b50610303610453366004614732565b610dc9565b34801561046457600080fd5b5061033a61047336600461435b565b610e6b565b34801561048457600080fd5b5061030361049336600461435b565b610e7e565b3480156104a457600080fd5b506102d86104b336600461435b565b610f03565b3480156104c457600080fd5b506102d8610f0e565b3480156104d957600080fd5b506103036104e836600461435b565b610f18565b3480156104f957600080fd5b50610303610508366004614732565b610fc6565b34801561051957600080fd5b506102d8610ff3565b34801561052e57600080fd5b5061033a61100f565b34801561054357600080fd5b5061033a610552366004614732565b611019565b34801561056357600080fd5b5061030361057236600461435b565b611024565b34801561058357600080fd5b506102d8611034565b34801561059857600080fd5b506102d8611050565b3480156105ad57600080fd5b506103036105bc366004614732565b61105a565b6103036105cf36600461435b565b61109e565b3480156105e057600080fd5b506105e96111fb565b6040516001600160401b0390911681526020016102af565b34801561060d57600080fd5b5061033a611205565b610303610624366004614732565b611218565b34801561063557600080fd5b5061064961064436600461474f565b61162a565b6040516102af9190614862565b34801561066257600080fd5b506102a261165f565b34801561067757600080fd5b5061033a611669565b34801561068c57600080fd5b506102a2611673565b3480156106a157600080fd5b506103036106b036600461435b565b61168b565b3480156106c157600080fd5b506103036106d0366004614909565b6116e0565b3480156106e157600080fd5b506102d861175d565b3480156106f657600080fd5b5061033a611779565b61030361070d366004614942565b611818565b34801561071e57600080fd5b506102a261072d36600461435b565b611862565b610303610740366004614436565b6118f2565b34801561075157600080fd5b506103036107603660046149c1565b611a0c565b34801561077157600080fd5b506102a2611a4e565b34801561078657600080fd5b50610303610795366004614732565b611a66565b3480156107a657600080fd5b506102d8611ab3565b3480156107bb57600080fd5b506107cf6107ca366004614a24565b611abd565b60405190151581526020016102af565b3480156107eb57600080fd5b506103036107fa36600461435b565b611ac9565b6060610809611b0c565b600201805461081790614a52565b80601f016020809104026020016040519081016040528092919081815260200182805461084390614a52565b80156108905780601f1061086557610100808354040283529160200191610890565b820191906000526020600020905b81548152906001019060200180831161087357829003601f168201915b5050505050905090565b60006108a582611b30565b92915050565b6108b782826001611b7d565b5050565b6108c3611c32565b6001600160a01b0316336001600160a01b0316146108fb576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6108b782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611cfc92505050565b60006109476103e0611d13565b905090565b6000610947611d13565b600061096182611d32565b9050836001600160a01b0316816001600160a01b0316146109945760405162a1148160e81b815260040160405180910390fd5b6000806109a084611dcd565b915091506109c581876109b03390565b6001600160a01b039081169116811491141790565b6109f0576109d38633611abd565b6109f057604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610a1757604051633a954ecd60e21b815260040160405180910390fd5b8015610a2257600082555b610a2a611b0c565b6001600160a01b0387166000908152600591909101602052604090208054600019019055610a56611b0c565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b17610a8d611b0c565b60008681526004919091016020526040812091909155600160e11b84169003610b035760018401610abc611b0c565b600082815260049190910160205260408120549003610b0157610add611b0c565b548114610b015783610aed611b0c565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600080610b58611df5565b90506000610b64611779565b905083811115610b78575060009392505050565b6006820154604051639262b1b360e01b815230600482015285916001600160a01b031690639262b1b390602401602060405180830381865afa158015610bc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be69190614a86565b1115610bf6575060009392505050565b60088201546001600160a01b031615610c87576008820154604051635cf4ee9160e01b815260048101839052602481018690526001600160a01b0390911690635cf4ee9190604401602060405180830381865afa158015610c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7f9190614a86565b949350505050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c5b573d6000803e3d6000fd5b610cf783838360405180602001604052806000815250611818565b505050565b60026000805160206152288339815191525403610d2c57604051635db5c7cd60e11b815260040160405180910390fd5b610d43600260008051602061522883398151915255565b610d4e838383611e19565b610cf7600160008051602061522883398151915255565b60008051602061528883398151915254640100000000900460ff16610d9d57604051630ef4733760e31b815260040160405180910390fd5b610dad63421fb7a760e01b6120bc565b610db7828261219a565b6108b7826000015183602001516122bd565b610dd1611c32565b6001600160a01b0316336001600160a01b031614610e04576040516365f4906560e01b81523360048201526024016108f2565b6001600160a01b038116610e2b57604051635fbd571760e01b815260040160405180910390fd5b6000610e3561231f565b905080600003610e5857604051635894b54560e11b815260040160405180910390fd5b6108b7610e63610ff3565b308484612332565b60006108a582610e79611d13565b612378565b610e86611c32565b6001600160a01b0316336001600160a01b031614610eb9576040516365f4906560e01b81523360048201526024016108f2565b6000610ec3611205565b90508015801590610ed357508082115b15610ef15760405163c3983b9160e01b815260040160405180910390fd5b610efa826123be565b6108b782611ac9565b60006108a582611d32565b6000610947610ff3565b610f20611c32565b6001600160a01b0316336001600160a01b031614610f53576040516365f4906560e01b81523360048201526024016108f2565b610f5c81612463565b610f6461175d565b6001600160a01b03166391b7f5ed826040518263ffffffff1660e01b8152600401610f9191815260200190565b600060405180830381600087803b158015610fab57600080fd5b505af1158015610fbf573d6000803e3d6000fd5b5050505050565b80610fcf611df5565b60080180546001600160a01b0319166001600160a01b039290921691909117905550565b6000610ffd611df5565b600401546001600160a01b0316919050565b6000610947611779565b60006108a5826124f1565b8061102d611df5565b6003015550565b600061103e611df5565b600601546001600160a01b0316919050565b6000610947611034565b60008051602061528883398151915254640100000000900460ff1661109257604051630ef4733760e31b815260040160405180910390fd5b61109b81612559565b50565b600260008051602061522883398151915254036110ce57604051635db5c7cd60e11b815260040160405180910390fd5b6110e5600260008051602061522883398151915255565b60006110f082610f03565b90506001600160a01b03811661111957604051635fbd571760e01b815260040160405180910390fd5b60008281527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce0060205260409020546001600160401b0316611158612594565b6001600160401b031661116b4283614ab5565b106111895760405163dce9a1d360e01b815260040160405180910390fd5b600061119784610e79611d13565b905080156111d05760006111ab848361261a565b905060006111b98284614ab5565b905080156111cd576111cb8582612732565b505b50505b6111e1846111dc612594565b6128d0565b50505061109b600160008051602061522883398151915255565b6000610947612594565b600061120f611df5565b60030154905090565b6002600080516020615228833981519152540361124857604051635db5c7cd60e11b815260040160405180910390fd5b61125f600260008051602061522883398151915255565b61126881612999565b60405133606081901b6bffffffffffffffffffffffff191660208301524360348301526000918290605401604051602081830303815290604052805190602001209050600061132b826112ff84866112bf87612a02565b604080516020808201959095526001600160a01b039390931683820152606080840192909252805180840390920182526080909201909152805191012090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905061136d8184876040516020016113599291906001600160a01b0392831681529116602082015260400190565b604051602081830303815290604052612a37565b341561137d5761137d8134612a7e565b60006113a9604051806040016040528060098152602001684a6f696e537061636560b81b815250612b04565b905060005b81518110156115d25760008282815181106113cb576113cb614ac8565b6020026020010151905080604001516115c95760005b8160800151518110156115c75760008260800151828151811061140657611406614ac8565b60200260200101519050806001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561144e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114729190614ade565b6115aa576040805160018082528183019092526000916020808301908036833701905050905088816000815181106114ac576114ac614ac8565b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b0316630cf0b533600083604051806040016040528060098152602001684a6f696e537061636560b81b8152506040516020016115109190614afb565b60405160208183030381529060405261152890614b17565b6040518463ffffffff1660e01b815260040161154693929190614b75565b602060405180830381865afa158015611563573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115879190614ade565b156115a45761159587612d4e565b50505050505050505050611613565b506115be565b6115b986828560000151612ea3565b600198505b506001016113e1565b505b506001016113ae565b508461160d576040516001600160a01b038716907f86fd446d5c04e892d58b448a924dcd9c3ece3a5e0d2960b8c35cd475a5595a1f90600090a25b50505050505b61109b600160008051602061522883398151915255565b61164e60405180606001604052806060815260200160608152602001606081525090565b6116588383613152565b9392505050565b6060610947611a4e565b6000610947611205565b606061167d611b0c565b600301805461081790614a52565b611693611c32565b6001600160a01b0316336001600160a01b0316146116c6576040516365f4906560e01b81523360048201526024016108f2565b6116d7816116d2611d13565b61324c565b61109b81611024565b806116e9611b0c565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000611767611df5565b600801546001600160a01b0316919050565b600080611784611df5565b600781015490915080156117985792915050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118119190614a86565b9250505090565b611823848484610956565b6001600160a01b0383163b1561185c5761183f8484848461326d565b61185c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061186d82613358565b61188a57604051630a14c4b560e41b815260040160405180910390fd5b60006118a160408051602081019091526000815290565b905080516000036118c15760405180602001604052806000815250611658565b806118cb84613394565b6040516020016118dc929190614b9e565b6040516020818303038152906040529392505050565b6002600080516020615228833981519152540361192257604051635db5c7cd60e11b815260040160405180910390fd5b611939600260008051602061522883398151915255565b61194283612999565b600061194c6133d8565b9050600061195b6103e0611d13565b905080156119dc5761196d82826133e8565b6000611979868361261a565b905060006119878284614ab5565b90506000611993610ff3565b905081156119d85760006119a78388613408565b90506119b5828a8a84612332565b60006119c18285614ab5565b905080156119d5576119d38a82612732565b505b50505b5050505b6119e78560016134bb565b6119f3826111dc612594565b5050610cf7600160008051602061522883398151915255565b60008051602061528883398151915254640100000000900460ff16611a4457604051630ef4733760e31b815260040160405180910390fd5b6108b782826122bd565b6060611a58611df5565b600c01805461081790614a52565b611a6e611c32565b6001600160a01b0316336001600160a01b031614611aa1576040516365f4906560e01b81523360048201526024016108f2565b611aaa816134d5565b61109b81610fc6565b600061094761175d565b6000611658838361358d565b6000611ad3611df5565b6007810183905560405190915082907fab14a23e88fb272313490d4f20d63098e64fd38304c0e07a377db98c2b39b92f90600090a25050565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b6000611b3b82613358565b611b58576040516333d1c03960e21b815260040160405180910390fd5b611b60611b0c565b60009283526006016020525060409020546001600160a01b031690565b6000611b8883610f03565b90508115611bc757336001600160a01b03821614611bc757611baa813361358d565b611bc7576040516367d9dca160e11b815260040160405180910390fd5b83611bd0611b0c565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015611cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190614bcd565b91505090565b80611d05611df5565b600c01906108b79082614c32565b600080611d1e611b0c565b60010154611d2a611b0c565b540303919050565b600080611d3d611b0c565b60008481526004820160205260408120549350909150600160e01b83169003611db35781600003611dad5780548310611d8957604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115611d8a575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b6000806000611dda611b0c565b60009485526006016020525050604090912080549092909150565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60090565b60008381526000805160206152088339815191526020526040902080546000805160206151e8833981519152919061010090046001600160a01b03161580611e635750805460ff16155b15611e8157604051637ad5a43960e11b815260040160405180910390fd5b600084815260028201602052604090205460ff1615611eb357604051637912b73960e01b815260040160405180910390fd5b600084815260018201602052604081205481908190815b81811015611ff15760008981526001870160205260408120805483908110611ef457611ef4614ac8565b60009182526020909120018054909150336001600160a01b0390911603611f805760008154600160a01b900460ff166002811115611f3457611f34614771565b14611f52576040516347592a4d60e01b815260040160405180910390fd5b80548990829060ff60a01b1916600160a01b836002811115611f7657611f76614771565b0217905550600195505b60018154600160a01b900460ff166002811115611f9f57611f9f614771565b03611fb65784611fae81614cf1565b955050611fe8565b60028154600160a01b900460ff166002811115611fd557611fd5614771565b03611fe85783611fe481614cf1565b9450505b50600101611eca565b508361201057604051638223a7e960e01b815260040160405180910390fd5b61201b600282614d0a565b831180612031575061202e600282614d0a565b82115b156120b15760008881526002860160205260408120805460ff1916600117905582841161205f576002612062565b60015b905061206e8a826135ca565b897fb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c6338260405161209e9190614d2c565b60405180910390a26120af8a6136a2565b505b505050505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114612149576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055612162565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006121a4611df5565b6006810180546001600160a01b038086166001600160a01b031992831617909255610100860151600884018054919093169082161790915560048201805490911673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1790556060840151600382015560e08401516007820181905590915015612228576122288360e001516123be565b6122368361010001516134d5565b604083015115610cf75761224d8360400151612463565b600881015460408085015190516391b7f5ed60e01b81526001600160a01b03909216916391b7f5ed916122869160040190815260200190565b600060405180830381600087803b1580156122a057600080fd5b505af11580156122b4573d6000803e3d6000fd5b50505050505050565b60008051602061528883398151915254640100000000900460ff166122f557604051630ef4733760e31b815260040160405180910390fd5b6123056380ac58cd60e01b6120bc565b612315635b5e139f60e01b6120bc565b6108b7828261376f565b6000612329611df5565b600a0154905090565b801561185c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b0385160161236c5761236782826137a1565b61185c565b61185c84848484613844565b600080612383611df5565b6000858152600982016020526040902054909150156123b55760008481526009909101602052604090205490506108a5565b610c7f83610b4d565b60006123c8611df5565b90508060060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa15801561241f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124439190614a86565b8211156108b75760405163c3983b9160e01b815260040160405180910390fd5b600061246d611034565b6001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ce9190614a86565b9050808210156108b757604051631a23d64760e11b815260040160405180910390fd5b60006001600160a01b03821661251a576040516323d3ad8160e21b815260040160405180910390fd5b6001600160401b0361252a611b0c565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b612569636afd38fd60e11b6120bc565b6000805160206151e883398151915280546001600160a01b0319166001600160a01b03831617905550565b60008061259f611df5565b90508060060160009054906101000a90046001600160a01b03166001600160a01b0316638120f0ba6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190614d3f565b600080612625611df5565b6006810154600480830154604080516301332c8360e61b815290519495506001600160a01b039384169493909116926000928592634ccb20c092818301926020928290030181865afa15801561267f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a39190614bcd565b90506000836001600160a01b0316639f6542aa6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127099190614d5c565b9050612719878261ffff16613897565b955061272783898489612332565b505050505092915050565b60008061273d611df5565b90506000612749610ff3565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03821601612794578382600a0160008282546127849190614d80565b909155508493506108a592505050565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156127dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128019190614a86565b905061280f83883089612332565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015612856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287a9190614a86565b905060006128888383614ab5565b90508781146128aa57604051635894b54560e11b815260040160405180910390fd5b8086600a0160008282546128be9190614d80565b90915550909998505050505050505050565b60008281527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce006020819052604082205490916001600160401b03909116908181036129265761291f8442614d93565b9050612933565b6129308483614d93565b90505b60008581526020848152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825286917f2ec2be2c4b90c2cf13ecb6751a24daed6bb741ae5ed3f7371aabf9402f6d62e8910160405180910390a25050505050565b6001600160a01b0381166129c057604051635fbd571760e01b815260040160405180910390fd5b6129c8611205565b158015906129e457506129d9611205565b6129e1611d13565b10155b1561109b57604051637efcdb4960e01b815260040160405180910390fd5b600081815260008051602061524883398151915260208190526040822080549083612a2c83614cf1565b909155509392505050565b60008281527f34516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e02602052604090206000805160206152488339815191529061185c8382614c32565b80600003612a9f5760405163acdc0d4960e01b815260040160405180910390fd5b803414612abf5760405163acdc0d4960e01b815260040160405180910390fd5b60008281526000805160206152a883398151915260205260408120805460008051602061524883398151915292849291612afa908490614d80565b9091555050505050565b60606000612b1061390c565b80519091506000816001600160401b03811115612b2f57612b2f6144bd565b604051908082528060200260200182016040528015612b58578160200160208202803683370190505b5085516020870120909150600090815b84811015612c27576000612b94878381518110612b8757612b87614ac8565b6020026020010151613937565b509250505060005b8151811015612c1d5783828281518110612bb857612bb8614ac8565b60200260200101518051906020012003612c1557878381518110612bde57612bde614ac8565b6020026020010151868681518110612bf857612bf8614ac8565b602090810291909101015284612c0d81614cf1565b955050612c1d565b600101612b9c565b5050600101612b68565b506000826001600160401b03811115612c4257612c426144bd565b604051908082528060200260200182016040528015612ca757816020015b612c946040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b815260200190600190039081612c605790505b50905060005b83811015612d42576000858281518110612cc957612cc9614ac8565b60200260200101519050600080600080612ce285613937565b93509350935093506040518060a00160405280868152602001858152602001841515815260200183815260200182815250878781518110612d2557612d25614ac8565b602002602001018190525050505050508080600101915050612cad565b50979650505050505050565b600080612d5a83613a62565b806020019051810190612d6d9190614db3565b915091506000612d7e6103e0611d13565b90506000612d8a6133d8565b90508115612e4f5760008581526000805160206152a8833981519152602052604081205490819003612dcf57604051635894b54560e11b815260040160405180910390fd5b80831115612df057604051635894b54560e11b815260040160405180910390fd5b612dfa82846133e8565b6000612e06868561261a565b90506000612e148286614ab5565b90508015612e2857612e268782612732565b505b612e328886613b33565b612e4b8860405180602001604052806000815250612a37565b5050505b612e5a8360016134bb565b612e66816111dc612594565b60405181906001600160a01b038516907f2f40b0474996b72a4251e00fb9170cdd960deea1dc749772cbbab61395b9b57690600090a35050505050565b60008381526000805160206152088339815191526020526040902080546000805160206151e8833981519152919060ff161515600103612f355760005b6004820154811015612f335783826004018281548110612f0257612f02614ac8565b906000526020600020015403612f2b576040516301ab53df60e31b815260040160405180910390fd5b600101612ee0565b505b81546001600160a01b0316612f4c57612f4c613b6e565b8154604051634f84544560e01b8152600560048201526000916001600160a01b031690634f84544590602401600060405180830381865afa158015612f95573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612fbd9190810190614e05565b825490915060ff16612ffe5781546003830180546001600160a01b0319166001600160a01b0388161790556001600160a81b03191661010033021760011782555b600482018054600181018255600091825260208220018590555b81518110156130ee57826001016000868152602001908152602001600020604051806040016040528084848151811061305357613053614ac8565b60200260200101516001600160a01b031681526020016000600281111561307c5761307c614771565b9052815460018101835560009283526020928390208251910180546001600160a01b031981166001600160a01b03909316928317825593830151929390929183916001600160a81b03191617600160a01b8360028111156130df576130df614771565b02179055505050600101613018565b50825460405163541da4e560e01b81526001600160a01b039091169063541da4e5906131249033908a9089908790600401614e98565b600060405180830381600087803b15801561313e57600080fd5b505af11580156120af573d6000803e3d6000fd5b61317660405180606001604052806060815260200160608152602001606081525090565b60008381526000805160206152088339815191526020526040812080546000805160206151e88339815191529260ff909116151590036131c957604051637ad5a43960e11b815260040160405180910390fd5b600381015460405163069a3ee960e01b8152600481018690526001600160a01b0390911690600090829063069a3ee990602401600060405180830381865afa158015613219573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132419190810190615036565b979650505050505050565b808210156108b757604051636664d51760e11b815260040160405180910390fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906132a2903390899088908890600401615173565b6020604051808303816000875af19250505080156132dd575060408051601f3d908101601f191682019092526132da918101906151a6565b60015b61333b573d80801561330b576040519150601f19603f3d011682016040523d82523d6000602084013e613310565b606091505b508051600003613333576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000613362611b0c565b54821080156108a55750600160e01b613379611b0c565b60008481526004919091016020526040902054161592915050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806133ae5750819003601f19909101908152919050565b60006133e2611b0c565b54919050565b806133f1611df5565b600093845260090160205260409092209190915550565b60008181527f3c2290b88407133303e904ceb4ee7d0d14164eda8a629372d8406216ceb57e006020819052604082205461ffff1680830361344e576000925050506108a5565b600084815260018084016020908152604092839020835180850190945280548085529201549083015215801590613492575080514210806134925750806020015142115b156134a357600093505050506108a5565b6134b1868361ffff16613897565b9695505050505050565b6108b7828260405180602001604052806000815250613c22565b6001600160a01b0381166134fc57604051630e88bf4b60e01b815260040160405180910390fd5b613504611034565b6040516346fc05eb60e11b81526001600160a01b0383811660048301529190911690638df80bd690602401602060405180830381865afa15801561354c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135709190614ade565b61109b57604051630e88bf4b60e01b815260040160405180910390fd5b6000613597611b0c565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b60018160028111156135de576135de614771565b036135ec576108b782612d4e565b6000806135f884613a62565b80602001905181019061360b9190614db3565b915091506136288460405180602001604052806000815250612a37565b60008481526000805160206152a883398151915260205260409020548015613667576136548582613b33565b61366761365f610ff3565b308584612332565b6040516001600160a01b038316907f86fd446d5c04e892d58b448a924dcd9c3ece3a5e0d2960b8c35cd475a5595a1f90600090a25050505050565b6000818152600080516020615208833981519152602052604081206000805160206151e8833981519152915b6004820154811015613722578160010160008360040183815481106136f5576136f5614ac8565b90600052602060002001548152602001908152602001600020600061371a9190614284565b6001016136ce565b506137316004820160006142a2565b6000838152600183016020526040812080546001600160a81b03191681556003810180546001600160a01b031916905590610fbf60048301826142a2565b6000613779611b0c565b9050600281016137898482614c32565b50600381016137988382614c32565b50600090555050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146137ee576040519150601f19603f3d011682016040523d82523d6000602084013e6137f3565b606091505b5050905080610cf75760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c65640000000060448201526064016108f2565b816001600160a01b0316836001600160a01b0316031561185c57306001600160a01b03841603613882576123676001600160a01b0385168383613c98565b61185c6001600160a01b038516848484613cf7565b60006127108211156138f55760405162461bcd60e51b815260206004820152602160248201527f426173697320706f696e74732063616e6e6f74206578636565642031305f30306044820152600360fc1b60648201526084016108f2565b61271061390283856151d0565b6116589190614d0a565b60606109477f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01613d30565b600081815260008051602061526883398151915260205260408120805460609291839182919061396690614a52565b80601f016020809104026020016040519081016040528092919081815260200182805461399290614a52565b80156139df5780601f106139b4576101008083540402835291602001916139df565b820191906000526020600020905b8154815290600101906020018083116139c257829003601f168201915b50505050509350613a0d7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0090565b6000868152600391909101602090815260408083206001015460008051602061526883398151915290925290912060ff9091169350613a4e90600201613d3d565b9150613a5985613d48565b90509193509193565b60008181527f34516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e0260205260409020805460609160008051602061524883398151915291613aad90614a52565b80601f0160208091040260200160405190810160405280929190818152602001828054613ad990614a52565b8015613b265780601f10613afb57610100808354040283529160200191613b26565b820191906000526020600020905b815481529060010190602001808311613b0957829003601f168201915b5050505050915050919050565b60008281526000805160206152a883398151915260205260408120805460008051602061524883398151915292849291612afa908490614ab5565b6000805160206151e88339815191526000613b87611df5565b60060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa158015613bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c039190614bcd565b82546001600160a01b0319166001600160a01b03919091161790915550565b613c2c8383613e4c565b6001600160a01b0383163b15610cf7576000613c46611b0c565b5490508281035b613c60600086838060010194508661326d565b613c7d576040516368d2bf6b60e11b815260040160405180910390fd5b818110613c4d5781613c8d611b0c565b5414610fbf57600080fd5b6040516001600160a01b03838116602483015260448201839052610cf791859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613f87565b6040516001600160a01b03848116602483015283811660448301526064820183905261185c9186918216906323b872dd90608401613cc5565b6060600061165883613fea565b60606108a582614046565b60008181526000805160206152688339815191526020526040812060609190613d7390600401614123565b6001600160401b03811115613d8a57613d8a6144bd565b604051908082528060200260200182016040528015613db3578160200160208202803683370190505b50905060005b600084815260008051602061526883398151915260205260409020613de090600401614123565b811015613e4557600084815260008051602061526883398151915260205260408120613e0f906004018361412d565b905080838381518110613e2457613e24614ac8565b6001600160a01b039092166020928302919091019091015250600101613db9565b5092915050565b6000613e56611b0c565b5490506000829003613e7b5760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202613e8f611b0c565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717613eca611b0c565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114613f5457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101613f1c565b5081600003613f7557604051622e076360e81b815260040160405180910390fd5b80613f7e611b0c565b5550610cf79050565b6000613f9c6001600160a01b03841683614139565b90508051600014158015613fc1575080806020019051810190613fbf9190614ade565b155b15610cf757604051635274afe760e01b81526001600160a01b03841660048201526024016108f2565b60608160000180548060200260200160405190810160405280929190818152602001828054801561403a57602002820191906000526020600020905b815481526020019060010190808311614026575b50505050509050919050565b606081600001805480602002602001604051908101604052809291908181526020016000905b8282101561411857838290600052602060002001805461408b90614a52565b80601f01602080910402602001604051908101604052809291908181526020018280546140b790614a52565b80156141045780601f106140d957610100808354040283529160200191614104565b820191906000526020600020905b8154815290600101906020018083116140e757829003601f168201915b50505050508152602001906001019061406c565b505050509050919050565b60006108a5825490565b60006116588383614147565b606061165883836000614171565b600082600001828154811061415e5761415e614ac8565b9060005260206000200154905092915050565b6060814710156141965760405163cd78605960e01b81523060048201526024016108f2565b600080856001600160a01b031684866040516141b29190614afb565b60006040518083038185875af1925050503d80600081146141ef576040519150601f19603f3d011682016040523d82523d6000602084013e6141f4565b606091505b50915091506134b18683836060826142145761420f8261425b565b611658565b815115801561422b57506001600160a01b0384163b155b1561425457604051639996b31560e01b81526001600160a01b03851660048201526024016108f2565b5080611658565b80511561426b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054600082559060005260206000209081019061109b91906142c0565b508054600082559060005260206000209081019061109b91906142e3565b5b808211156142df5780546001600160a81b03191681556001016142c1565b5090565b5b808211156142df57600081556001016142e4565b60005b838110156143135781810151838201526020016142fb565b50506000910152565b600081518084526143348160208601602086016142f8565b601f01601f19169290920160200192915050565b602081526000611658602083018461431c565b60006020828403121561436d57600080fd5b5035919050565b6001600160a01b038116811461109b57600080fd5b803561439481614374565b919050565b600080604083850312156143ac57600080fd5b82356143b781614374565b946020939093013593505050565b600080602083850312156143d857600080fd5b82356001600160401b03808211156143ef57600080fd5b818501915085601f83011261440357600080fd5b81358181111561441257600080fd5b86602082850101111561442457600080fd5b60209290920196919550909350505050565b60008060006060848603121561444b57600080fd5b833561445681614374565b9250602084013561446681614374565b929592945050506040919091013590565b6003811061109b57600080fd5b60008060006060848603121561449957600080fd5b833592506020840135915060408401356144b281614477565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b03811182821017156144f6576144f66144bd565b60405290565b604051608081016001600160401b03811182821017156144f6576144f66144bd565b604051606081016001600160401b03811182821017156144f6576144f66144bd565b604080519081016001600160401b03811182821017156144f6576144f66144bd565b604051601f8201601f191681016001600160401b038111828210171561458a5761458a6144bd565b604052919050565b60006001600160401b038311156145ab576145ab6144bd565b6145be601f8401601f1916602001614562565b90508281528383830111156145d257600080fd5b828260208301376000602084830101529392505050565b600082601f8301126145fa57600080fd5b61165883833560208501614592565b6001600160401b038116811461109b57600080fd5b803561439481614609565b6000806040838503121561463c57600080fd5b82356001600160401b038082111561465357600080fd5b90840190610120828703121561466857600080fd5b6146706144d3565b82358281111561467f57600080fd5b61468b888286016145e9565b8252506020830135828111156146a057600080fd5b6146ac888286016145e9565b60208301525060408301356040820152606083013560608201526146d26080840161461e565b60808201526146e360a08401614389565b60a08201526146f460c08401614389565b60c082015260e083013560e08201526101009150614713828401614389565b8282015280945050505061472960208401614389565b90509250929050565b60006020828403121561474457600080fd5b813561165881614374565b6000806040838503121561476257600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b6003811061109b5761109b614771565b60008151808452602080850194506020840160005b838110156148015781518051600681106147c8576147c8614771565b885280840151848901526040808201516001600160a01b03169089015260609081015190880152608090960195908201906001016147ac565b509495945050505050565b60008151808452602080850194506020840160005b83811015614801578151805161483681614787565b88528084015160ff908116858a0152604091820151169088015260609096019590820190600101614821565b6020808252825160608383015280516080840181905260009291820190839060a08601905b808310156148be578351805161489c81614787565b835285015160ff16858301529284019260019290920191604090910190614887565b50838701519350601f199250828682030160408701526148de8185614797565b935050506040850151818584030160608601526134b1838261480c565b801515811461109b57600080fd5b6000806040838503121561491c57600080fd5b823561492781614374565b91506020830135614937816148fb565b809150509250929050565b6000806000806080858703121561495857600080fd5b843561496381614374565b9350602085013561497381614374565b92506040850135915060608501356001600160401b0381111561499557600080fd5b8501601f810187136149a657600080fd5b6149b587823560208401614592565b91505092959194509250565b600080604083850312156149d457600080fd5b82356001600160401b03808211156149eb57600080fd5b6149f7868387016145e9565b93506020850135915080821115614a0d57600080fd5b50614a1a858286016145e9565b9150509250929050565b60008060408385031215614a3757600080fd5b8235614a4281614374565b9150602083013561493781614374565b600181811c90821680614a6657607f821691505b602082108103611dad57634e487b7160e01b600052602260045260246000fd5b600060208284031215614a9857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108a5576108a5614a9f565b634e487b7160e01b600052603260045260246000fd5b600060208284031215614af057600080fd5b8151611658816148fb565b60008251614b0d8184602087016142f8565b9190910192915050565b80516020808301519190811015611dad5760001960209190910360031b1b16919050565b60008151808452602080850194506020840160005b838110156148015781516001600160a01b031687529582019590820190600101614b50565b838152606060208201526000614b8e6060830185614b3b565b9050826040830152949350505050565b60008351614bb08184602088016142f8565b835190830190614bc48183602088016142f8565b01949350505050565b600060208284031215614bdf57600080fd5b815161165881614374565b601f821115610cf7576000816000526020600020601f850160051c81016020861015614c135750805b601f850160051c820191505b81811015610b4557828155600101614c1f565b81516001600160401b03811115614c4b57614c4b6144bd565b614c5f81614c598454614a52565b84614bea565b602080601f831160018114614c945760008415614c7c5750858301515b600019600386901b1c1916600185901b178555610b45565b600085815260208120601f198616915b82811015614cc357888601518255948401946001909101908401614ca4565b5085821015614ce15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201614d0357614d03614a9f565b5060010190565b600082614d2757634e487b7160e01b600052601260045260246000fd5b500490565b60208101614d3983614787565b91905290565b600060208284031215614d5157600080fd5b815161165881614609565b600060208284031215614d6e57600080fd5b815161ffff8116811461165857600080fd5b808201808211156108a5576108a5614a9f565b6001600160401b03818116838216019080821115613e4557613e45614a9f565b60008060408385031215614dc657600080fd5b8251614dd181614374565b602084015190925061493781614374565b60006001600160401b03821115614dfb57614dfb6144bd565b5060051b60200190565b60006020808385031215614e1857600080fd5b82516001600160401b03811115614e2e57600080fd5b8301601f81018513614e3f57600080fd5b8051614e52614e4d82614de2565b614562565b81815260059190911b82018301908381019087831115614e7157600080fd5b928401925b82841015613241578351614e8981614374565b82529284019290840190614e76565b60018060a01b03851681528360208201528260408201526080606082015260006134b16080830184614b3b565b805160ff8116811461439457600080fd5b600082601f830112614ee757600080fd5b81516020614ef7614e4d83614de2565b82815260079290921b84018101918181019086841115614f1657600080fd5b8286015b84811015614f805760808189031215614f335760008081fd5b614f3b6144fc565b815160068110614f4b5760008081fd5b81528185015185820152604080830151614f6481614374565b9082015260608281015190820152835291830191608001614f1a565b509695505050505050565b600082601f830112614f9c57600080fd5b81516020614fac614e4d83614de2565b82815260609283028501820192828201919087851115614fcb57600080fd5b8387015b858110156150295781818a031215614fe75760008081fd5b614fef61451e565b8151614ffa81614477565b8152615007828701614ec5565b868201526040615018818401614ec5565b908201528452928401928101614fcf565b5090979650505050505050565b6000602080838503121561504957600080fd5b82516001600160401b038082111561506057600080fd5b908401906060828703121561507457600080fd5b61507c61451e565b82518281111561508b57600080fd5b8301601f8101881361509c57600080fd5b80516150aa614e4d82614de2565b81815260069190911b8201860190868101908a8311156150c957600080fd5b928701925b8284101561511d576040848c0312156150e75760008081fd5b6150ef614540565b84516150fa81614477565b8152615107858a01614ec5565b818a0152825260409390930192908701906150ce565b8452505050828401518281111561513357600080fd5b61513f88828601614ed6565b8583015250604083015193508184111561515857600080fd5b61516487858501614f8b565b60408201529695505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134b19083018461431c565b6000602082840312156151b857600080fd5b81516001600160e01b03198116811461165857600080fd5b80820281158282048414176108a5576108a5614a9f56fe9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e0154f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0034516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e00672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0359b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200034516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e01","sourceMap":"1438:12584:187:-:0;;;;;;;;;;;;-1:-1:-1;385:22:49;:20;:22::i;:::-;1438:12584:187;;1653:314:63;303:66:64;1779:14:63;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:63;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:63;1898:16;1886:28;;;;;1927:29;;158:42:375;;;1927:29:63;;146:2:375;131:18;1927:29:63;;;;;;;1844:119;1694:273;1653:314::o;14:192:375:-;1438:12584:187;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106102885760003560e01c806377460cd31161015a578063a22cb465116100c1578063d2f01f191161007a578063d2f01f1914610745578063d33d934514610765578063df9a9fe61461077a578063e847abdd1461079a578063e985e9c5146107af578063f9d5d22c146107df57600080fd5b8063a22cb465146106b5578063ac7ee626146106d5578063b3a5be6d146106ea578063b88d4fde146106ff578063c87b56dd14610712578063c9f7c8331461073257600080fd5b80638c625b06116101135780638c625b061461061657806392c399ff1461062957806393b13cb71461065657806395d600c81461066b57806395d89b411461068057806397fb7c1e1461069557600080fd5b806377460cd31461057757806379dda5851461058c5780637adc9cbe146105a15780637c9669ac146105c15780638120f0ba146105d45780638934207f1461060157600080fd5b80634c2abfbe116101fe57806369d5f38a116101b757806369d5f38a146104cd57806369d9346b146104ed578063702515631461050d578063706b8e091461052257806370a082311461053757806373fc5a051461055757600080fd5b80634c2abfbe1461041857806351cff8d9146104385780635803909f146104585780635becd24a146104785780636352211e14610498578063657e45e8146104b857600080fd5b806317c957091161025057806317c957091461034857806318160ddd1461039d57806323b872dd146103b25780633ded10de146103c557806342842e0e146103e55780634739e805146103f857600080fd5b806306fdde031461028d578063081812fc146102b8578063095ea7b3146102f05780630ef1be5f146103055780631278076a14610325575b600080fd5b34801561029957600080fd5b506102a26107ff565b6040516102af9190614348565b60405180910390f35b3480156102c457600080fd5b506102d86102d336600461435b565b61089a565b6040516001600160a01b0390911681526020016102af565b6103036102fe366004614399565b6108ab565b005b34801561031157600080fd5b506103036103203660046143c5565b6108bb565b34801561033157600080fd5b5061033a61093a565b6040519081526020016102af565b34801561035457600080fd5b5061033a61036336600461435b565b60009081527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce0060205260409020546001600160401b031690565b3480156103a957600080fd5b5061033a61094c565b6103036103c0366004614436565b610956565b3480156103d157600080fd5b5061033a6103e036600461435b565b610b4d565b6103036103f3366004614436565b610cdc565b34801561040457600080fd5b50610303610413366004614484565b610cfc565b34801561042457600080fd5b50610303610433366004614629565b610d65565b34801561044457600080fd5b50610303610453366004614732565b610dc9565b34801561046457600080fd5b5061033a61047336600461435b565b610e6b565b34801561048457600080fd5b5061030361049336600461435b565b610e7e565b3480156104a457600080fd5b506102d86104b336600461435b565b610f03565b3480156104c457600080fd5b506102d8610f0e565b3480156104d957600080fd5b506103036104e836600461435b565b610f18565b3480156104f957600080fd5b50610303610508366004614732565b610fc6565b34801561051957600080fd5b506102d8610ff3565b34801561052e57600080fd5b5061033a61100f565b34801561054357600080fd5b5061033a610552366004614732565b611019565b34801561056357600080fd5b5061030361057236600461435b565b611024565b34801561058357600080fd5b506102d8611034565b34801561059857600080fd5b506102d8611050565b3480156105ad57600080fd5b506103036105bc366004614732565b61105a565b6103036105cf36600461435b565b61109e565b3480156105e057600080fd5b506105e96111fb565b6040516001600160401b0390911681526020016102af565b34801561060d57600080fd5b5061033a611205565b610303610624366004614732565b611218565b34801561063557600080fd5b5061064961064436600461474f565b61162a565b6040516102af9190614862565b34801561066257600080fd5b506102a261165f565b34801561067757600080fd5b5061033a611669565b34801561068c57600080fd5b506102a2611673565b3480156106a157600080fd5b506103036106b036600461435b565b61168b565b3480156106c157600080fd5b506103036106d0366004614909565b6116e0565b3480156106e157600080fd5b506102d861175d565b3480156106f657600080fd5b5061033a611779565b61030361070d366004614942565b611818565b34801561071e57600080fd5b506102a261072d36600461435b565b611862565b610303610740366004614436565b6118f2565b34801561075157600080fd5b506103036107603660046149c1565b611a0c565b34801561077157600080fd5b506102a2611a4e565b34801561078657600080fd5b50610303610795366004614732565b611a66565b3480156107a657600080fd5b506102d8611ab3565b3480156107bb57600080fd5b506107cf6107ca366004614a24565b611abd565b60405190151581526020016102af565b3480156107eb57600080fd5b506103036107fa36600461435b565b611ac9565b6060610809611b0c565b600201805461081790614a52565b80601f016020809104026020016040519081016040528092919081815260200182805461084390614a52565b80156108905780601f1061086557610100808354040283529160200191610890565b820191906000526020600020905b81548152906001019060200180831161087357829003601f168201915b5050505050905090565b60006108a582611b30565b92915050565b6108b782826001611b7d565b5050565b6108c3611c32565b6001600160a01b0316336001600160a01b0316146108fb576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6108b782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611cfc92505050565b60006109476103e0611d13565b905090565b6000610947611d13565b600061096182611d32565b9050836001600160a01b0316816001600160a01b0316146109945760405162a1148160e81b815260040160405180910390fd5b6000806109a084611dcd565b915091506109c581876109b03390565b6001600160a01b039081169116811491141790565b6109f0576109d38633611abd565b6109f057604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610a1757604051633a954ecd60e21b815260040160405180910390fd5b8015610a2257600082555b610a2a611b0c565b6001600160a01b0387166000908152600591909101602052604090208054600019019055610a56611b0c565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b17610a8d611b0c565b60008681526004919091016020526040812091909155600160e11b84169003610b035760018401610abc611b0c565b600082815260049190910160205260408120549003610b0157610add611b0c565b548114610b015783610aed611b0c565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600080610b58611df5565b90506000610b64611779565b905083811115610b78575060009392505050565b6006820154604051639262b1b360e01b815230600482015285916001600160a01b031690639262b1b390602401602060405180830381865afa158015610bc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be69190614a86565b1115610bf6575060009392505050565b60088201546001600160a01b031615610c87576008820154604051635cf4ee9160e01b815260048101839052602481018690526001600160a01b0390911690635cf4ee9190604401602060405180830381865afa158015610c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7f9190614a86565b949350505050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c5b573d6000803e3d6000fd5b610cf783838360405180602001604052806000815250611818565b505050565b60026000805160206152288339815191525403610d2c57604051635db5c7cd60e11b815260040160405180910390fd5b610d43600260008051602061522883398151915255565b610d4e838383611e19565b610cf7600160008051602061522883398151915255565b60008051602061528883398151915254640100000000900460ff16610d9d57604051630ef4733760e31b815260040160405180910390fd5b610dad63421fb7a760e01b6120bc565b610db7828261219a565b6108b7826000015183602001516122bd565b610dd1611c32565b6001600160a01b0316336001600160a01b031614610e04576040516365f4906560e01b81523360048201526024016108f2565b6001600160a01b038116610e2b57604051635fbd571760e01b815260040160405180910390fd5b6000610e3561231f565b905080600003610e5857604051635894b54560e11b815260040160405180910390fd5b6108b7610e63610ff3565b308484612332565b60006108a582610e79611d13565b612378565b610e86611c32565b6001600160a01b0316336001600160a01b031614610eb9576040516365f4906560e01b81523360048201526024016108f2565b6000610ec3611205565b90508015801590610ed357508082115b15610ef15760405163c3983b9160e01b815260040160405180910390fd5b610efa826123be565b6108b782611ac9565b60006108a582611d32565b6000610947610ff3565b610f20611c32565b6001600160a01b0316336001600160a01b031614610f53576040516365f4906560e01b81523360048201526024016108f2565b610f5c81612463565b610f6461175d565b6001600160a01b03166391b7f5ed826040518263ffffffff1660e01b8152600401610f9191815260200190565b600060405180830381600087803b158015610fab57600080fd5b505af1158015610fbf573d6000803e3d6000fd5b5050505050565b80610fcf611df5565b60080180546001600160a01b0319166001600160a01b039290921691909117905550565b6000610ffd611df5565b600401546001600160a01b0316919050565b6000610947611779565b60006108a5826124f1565b8061102d611df5565b6003015550565b600061103e611df5565b600601546001600160a01b0316919050565b6000610947611034565b60008051602061528883398151915254640100000000900460ff1661109257604051630ef4733760e31b815260040160405180910390fd5b61109b81612559565b50565b600260008051602061522883398151915254036110ce57604051635db5c7cd60e11b815260040160405180910390fd5b6110e5600260008051602061522883398151915255565b60006110f082610f03565b90506001600160a01b03811661111957604051635fbd571760e01b815260040160405180910390fd5b60008281527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce0060205260409020546001600160401b0316611158612594565b6001600160401b031661116b4283614ab5565b106111895760405163dce9a1d360e01b815260040160405180910390fd5b600061119784610e79611d13565b905080156111d05760006111ab848361261a565b905060006111b98284614ab5565b905080156111cd576111cb8582612732565b505b50505b6111e1846111dc612594565b6128d0565b50505061109b600160008051602061522883398151915255565b6000610947612594565b600061120f611df5565b60030154905090565b6002600080516020615228833981519152540361124857604051635db5c7cd60e11b815260040160405180910390fd5b61125f600260008051602061522883398151915255565b61126881612999565b60405133606081901b6bffffffffffffffffffffffff191660208301524360348301526000918290605401604051602081830303815290604052805190602001209050600061132b826112ff84866112bf87612a02565b604080516020808201959095526001600160a01b039390931683820152606080840192909252805180840390920182526080909201909152805191012090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905061136d8184876040516020016113599291906001600160a01b0392831681529116602082015260400190565b604051602081830303815290604052612a37565b341561137d5761137d8134612a7e565b60006113a9604051806040016040528060098152602001684a6f696e537061636560b81b815250612b04565b905060005b81518110156115d25760008282815181106113cb576113cb614ac8565b6020026020010151905080604001516115c95760005b8160800151518110156115c75760008260800151828151811061140657611406614ac8565b60200260200101519050806001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561144e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114729190614ade565b6115aa576040805160018082528183019092526000916020808301908036833701905050905088816000815181106114ac576114ac614ac8565b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b0316630cf0b533600083604051806040016040528060098152602001684a6f696e537061636560b81b8152506040516020016115109190614afb565b60405160208183030381529060405261152890614b17565b6040518463ffffffff1660e01b815260040161154693929190614b75565b602060405180830381865afa158015611563573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115879190614ade565b156115a45761159587612d4e565b50505050505050505050611613565b506115be565b6115b986828560000151612ea3565b600198505b506001016113e1565b505b506001016113ae565b508461160d576040516001600160a01b038716907f86fd446d5c04e892d58b448a924dcd9c3ece3a5e0d2960b8c35cd475a5595a1f90600090a25b50505050505b61109b600160008051602061522883398151915255565b61164e60405180606001604052806060815260200160608152602001606081525090565b6116588383613152565b9392505050565b6060610947611a4e565b6000610947611205565b606061167d611b0c565b600301805461081790614a52565b611693611c32565b6001600160a01b0316336001600160a01b0316146116c6576040516365f4906560e01b81523360048201526024016108f2565b6116d7816116d2611d13565b61324c565b61109b81611024565b806116e9611b0c565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000611767611df5565b600801546001600160a01b0316919050565b600080611784611df5565b600781015490915080156117985792915050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118119190614a86565b9250505090565b611823848484610956565b6001600160a01b0383163b1561185c5761183f8484848461326d565b61185c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061186d82613358565b61188a57604051630a14c4b560e41b815260040160405180910390fd5b60006118a160408051602081019091526000815290565b905080516000036118c15760405180602001604052806000815250611658565b806118cb84613394565b6040516020016118dc929190614b9e565b6040516020818303038152906040529392505050565b6002600080516020615228833981519152540361192257604051635db5c7cd60e11b815260040160405180910390fd5b611939600260008051602061522883398151915255565b61194283612999565b600061194c6133d8565b9050600061195b6103e0611d13565b905080156119dc5761196d82826133e8565b6000611979868361261a565b905060006119878284614ab5565b90506000611993610ff3565b905081156119d85760006119a78388613408565b90506119b5828a8a84612332565b60006119c18285614ab5565b905080156119d5576119d38a82612732565b505b50505b5050505b6119e78560016134bb565b6119f3826111dc612594565b5050610cf7600160008051602061522883398151915255565b60008051602061528883398151915254640100000000900460ff16611a4457604051630ef4733760e31b815260040160405180910390fd5b6108b782826122bd565b6060611a58611df5565b600c01805461081790614a52565b611a6e611c32565b6001600160a01b0316336001600160a01b031614611aa1576040516365f4906560e01b81523360048201526024016108f2565b611aaa816134d5565b61109b81610fc6565b600061094761175d565b6000611658838361358d565b6000611ad3611df5565b6007810183905560405190915082907fab14a23e88fb272313490d4f20d63098e64fd38304c0e07a377db98c2b39b92f90600090a25050565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b6000611b3b82613358565b611b58576040516333d1c03960e21b815260040160405180910390fd5b611b60611b0c565b60009283526006016020525060409020546001600160a01b031690565b6000611b8883610f03565b90508115611bc757336001600160a01b03821614611bc757611baa813361358d565b611bc7576040516367d9dca160e11b815260040160405180910390fd5b83611bd0611b0c565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015611cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190614bcd565b91505090565b80611d05611df5565b600c01906108b79082614c32565b600080611d1e611b0c565b60010154611d2a611b0c565b540303919050565b600080611d3d611b0c565b60008481526004820160205260408120549350909150600160e01b83169003611db35781600003611dad5780548310611d8957604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115611d8a575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b6000806000611dda611b0c565b60009485526006016020525050604090912080549092909150565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60090565b60008381526000805160206152088339815191526020526040902080546000805160206151e8833981519152919061010090046001600160a01b03161580611e635750805460ff16155b15611e8157604051637ad5a43960e11b815260040160405180910390fd5b600084815260028201602052604090205460ff1615611eb357604051637912b73960e01b815260040160405180910390fd5b600084815260018201602052604081205481908190815b81811015611ff15760008981526001870160205260408120805483908110611ef457611ef4614ac8565b60009182526020909120018054909150336001600160a01b0390911603611f805760008154600160a01b900460ff166002811115611f3457611f34614771565b14611f52576040516347592a4d60e01b815260040160405180910390fd5b80548990829060ff60a01b1916600160a01b836002811115611f7657611f76614771565b0217905550600195505b60018154600160a01b900460ff166002811115611f9f57611f9f614771565b03611fb65784611fae81614cf1565b955050611fe8565b60028154600160a01b900460ff166002811115611fd557611fd5614771565b03611fe85783611fe481614cf1565b9450505b50600101611eca565b508361201057604051638223a7e960e01b815260040160405180910390fd5b61201b600282614d0a565b831180612031575061202e600282614d0a565b82115b156120b15760008881526002860160205260408120805460ff1916600117905582841161205f576002612062565b60015b905061206e8a826135ca565b897fb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c6338260405161209e9190614d2c565b60405180910390a26120af8a6136a2565b505b505050505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114612149576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055612162565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006121a4611df5565b6006810180546001600160a01b038086166001600160a01b031992831617909255610100860151600884018054919093169082161790915560048201805490911673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1790556060840151600382015560e08401516007820181905590915015612228576122288360e001516123be565b6122368361010001516134d5565b604083015115610cf75761224d8360400151612463565b600881015460408085015190516391b7f5ed60e01b81526001600160a01b03909216916391b7f5ed916122869160040190815260200190565b600060405180830381600087803b1580156122a057600080fd5b505af11580156122b4573d6000803e3d6000fd5b50505050505050565b60008051602061528883398151915254640100000000900460ff166122f557604051630ef4733760e31b815260040160405180910390fd5b6123056380ac58cd60e01b6120bc565b612315635b5e139f60e01b6120bc565b6108b7828261376f565b6000612329611df5565b600a0154905090565b801561185c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b0385160161236c5761236782826137a1565b61185c565b61185c84848484613844565b600080612383611df5565b6000858152600982016020526040902054909150156123b55760008481526009909101602052604090205490506108a5565b610c7f83610b4d565b60006123c8611df5565b90508060060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa15801561241f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124439190614a86565b8211156108b75760405163c3983b9160e01b815260040160405180910390fd5b600061246d611034565b6001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ce9190614a86565b9050808210156108b757604051631a23d64760e11b815260040160405180910390fd5b60006001600160a01b03821661251a576040516323d3ad8160e21b815260040160405180910390fd5b6001600160401b0361252a611b0c565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b612569636afd38fd60e11b6120bc565b6000805160206151e883398151915280546001600160a01b0319166001600160a01b03831617905550565b60008061259f611df5565b90508060060160009054906101000a90046001600160a01b03166001600160a01b0316638120f0ba6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190614d3f565b600080612625611df5565b6006810154600480830154604080516301332c8360e61b815290519495506001600160a01b039384169493909116926000928592634ccb20c092818301926020928290030181865afa15801561267f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a39190614bcd565b90506000836001600160a01b0316639f6542aa6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127099190614d5c565b9050612719878261ffff16613897565b955061272783898489612332565b505050505092915050565b60008061273d611df5565b90506000612749610ff3565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03821601612794578382600a0160008282546127849190614d80565b909155508493506108a592505050565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156127dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128019190614a86565b905061280f83883089612332565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015612856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287a9190614a86565b905060006128888383614ab5565b90508781146128aa57604051635894b54560e11b815260040160405180910390fd5b8086600a0160008282546128be9190614d80565b90915550909998505050505050505050565b60008281527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce006020819052604082205490916001600160401b03909116908181036129265761291f8442614d93565b9050612933565b6129308483614d93565b90505b60008581526020848152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825286917f2ec2be2c4b90c2cf13ecb6751a24daed6bb741ae5ed3f7371aabf9402f6d62e8910160405180910390a25050505050565b6001600160a01b0381166129c057604051635fbd571760e01b815260040160405180910390fd5b6129c8611205565b158015906129e457506129d9611205565b6129e1611d13565b10155b1561109b57604051637efcdb4960e01b815260040160405180910390fd5b600081815260008051602061524883398151915260208190526040822080549083612a2c83614cf1565b909155509392505050565b60008281527f34516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e02602052604090206000805160206152488339815191529061185c8382614c32565b80600003612a9f5760405163acdc0d4960e01b815260040160405180910390fd5b803414612abf5760405163acdc0d4960e01b815260040160405180910390fd5b60008281526000805160206152a883398151915260205260408120805460008051602061524883398151915292849291612afa908490614d80565b9091555050505050565b60606000612b1061390c565b80519091506000816001600160401b03811115612b2f57612b2f6144bd565b604051908082528060200260200182016040528015612b58578160200160208202803683370190505b5085516020870120909150600090815b84811015612c27576000612b94878381518110612b8757612b87614ac8565b6020026020010151613937565b509250505060005b8151811015612c1d5783828281518110612bb857612bb8614ac8565b60200260200101518051906020012003612c1557878381518110612bde57612bde614ac8565b6020026020010151868681518110612bf857612bf8614ac8565b602090810291909101015284612c0d81614cf1565b955050612c1d565b600101612b9c565b5050600101612b68565b506000826001600160401b03811115612c4257612c426144bd565b604051908082528060200260200182016040528015612ca757816020015b612c946040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b815260200190600190039081612c605790505b50905060005b83811015612d42576000858281518110612cc957612cc9614ac8565b60200260200101519050600080600080612ce285613937565b93509350935093506040518060a00160405280868152602001858152602001841515815260200183815260200182815250878781518110612d2557612d25614ac8565b602002602001018190525050505050508080600101915050612cad565b50979650505050505050565b600080612d5a83613a62565b806020019051810190612d6d9190614db3565b915091506000612d7e6103e0611d13565b90506000612d8a6133d8565b90508115612e4f5760008581526000805160206152a8833981519152602052604081205490819003612dcf57604051635894b54560e11b815260040160405180910390fd5b80831115612df057604051635894b54560e11b815260040160405180910390fd5b612dfa82846133e8565b6000612e06868561261a565b90506000612e148286614ab5565b90508015612e2857612e268782612732565b505b612e328886613b33565b612e4b8860405180602001604052806000815250612a37565b5050505b612e5a8360016134bb565b612e66816111dc612594565b60405181906001600160a01b038516907f2f40b0474996b72a4251e00fb9170cdd960deea1dc749772cbbab61395b9b57690600090a35050505050565b60008381526000805160206152088339815191526020526040902080546000805160206151e8833981519152919060ff161515600103612f355760005b6004820154811015612f335783826004018281548110612f0257612f02614ac8565b906000526020600020015403612f2b576040516301ab53df60e31b815260040160405180910390fd5b600101612ee0565b505b81546001600160a01b0316612f4c57612f4c613b6e565b8154604051634f84544560e01b8152600560048201526000916001600160a01b031690634f84544590602401600060405180830381865afa158015612f95573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612fbd9190810190614e05565b825490915060ff16612ffe5781546003830180546001600160a01b0319166001600160a01b0388161790556001600160a81b03191661010033021760011782555b600482018054600181018255600091825260208220018590555b81518110156130ee57826001016000868152602001908152602001600020604051806040016040528084848151811061305357613053614ac8565b60200260200101516001600160a01b031681526020016000600281111561307c5761307c614771565b9052815460018101835560009283526020928390208251910180546001600160a01b031981166001600160a01b03909316928317825593830151929390929183916001600160a81b03191617600160a01b8360028111156130df576130df614771565b02179055505050600101613018565b50825460405163541da4e560e01b81526001600160a01b039091169063541da4e5906131249033908a9089908790600401614e98565b600060405180830381600087803b15801561313e57600080fd5b505af11580156120af573d6000803e3d6000fd5b61317660405180606001604052806060815260200160608152602001606081525090565b60008381526000805160206152088339815191526020526040812080546000805160206151e88339815191529260ff909116151590036131c957604051637ad5a43960e11b815260040160405180910390fd5b600381015460405163069a3ee960e01b8152600481018690526001600160a01b0390911690600090829063069a3ee990602401600060405180830381865afa158015613219573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132419190810190615036565b979650505050505050565b808210156108b757604051636664d51760e11b815260040160405180910390fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906132a2903390899088908890600401615173565b6020604051808303816000875af19250505080156132dd575060408051601f3d908101601f191682019092526132da918101906151a6565b60015b61333b573d80801561330b576040519150601f19603f3d011682016040523d82523d6000602084013e613310565b606091505b508051600003613333576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000613362611b0c565b54821080156108a55750600160e01b613379611b0c565b60008481526004919091016020526040902054161592915050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806133ae5750819003601f19909101908152919050565b60006133e2611b0c565b54919050565b806133f1611df5565b600093845260090160205260409092209190915550565b60008181527f3c2290b88407133303e904ceb4ee7d0d14164eda8a629372d8406216ceb57e006020819052604082205461ffff1680830361344e576000925050506108a5565b600084815260018084016020908152604092839020835180850190945280548085529201549083015215801590613492575080514210806134925750806020015142115b156134a357600093505050506108a5565b6134b1868361ffff16613897565b9695505050505050565b6108b7828260405180602001604052806000815250613c22565b6001600160a01b0381166134fc57604051630e88bf4b60e01b815260040160405180910390fd5b613504611034565b6040516346fc05eb60e11b81526001600160a01b0383811660048301529190911690638df80bd690602401602060405180830381865afa15801561354c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135709190614ade565b61109b57604051630e88bf4b60e01b815260040160405180910390fd5b6000613597611b0c565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b60018160028111156135de576135de614771565b036135ec576108b782612d4e565b6000806135f884613a62565b80602001905181019061360b9190614db3565b915091506136288460405180602001604052806000815250612a37565b60008481526000805160206152a883398151915260205260409020548015613667576136548582613b33565b61366761365f610ff3565b308584612332565b6040516001600160a01b038316907f86fd446d5c04e892d58b448a924dcd9c3ece3a5e0d2960b8c35cd475a5595a1f90600090a25050505050565b6000818152600080516020615208833981519152602052604081206000805160206151e8833981519152915b6004820154811015613722578160010160008360040183815481106136f5576136f5614ac8565b90600052602060002001548152602001908152602001600020600061371a9190614284565b6001016136ce565b506137316004820160006142a2565b6000838152600183016020526040812080546001600160a81b03191681556003810180546001600160a01b031916905590610fbf60048301826142a2565b6000613779611b0c565b9050600281016137898482614c32565b50600381016137988382614c32565b50600090555050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146137ee576040519150601f19603f3d011682016040523d82523d6000602084013e6137f3565b606091505b5050905080610cf75760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c65640000000060448201526064016108f2565b816001600160a01b0316836001600160a01b0316031561185c57306001600160a01b03841603613882576123676001600160a01b0385168383613c98565b61185c6001600160a01b038516848484613cf7565b60006127108211156138f55760405162461bcd60e51b815260206004820152602160248201527f426173697320706f696e74732063616e6e6f74206578636565642031305f30306044820152600360fc1b60648201526084016108f2565b61271061390283856151d0565b6116589190614d0a565b60606109477f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01613d30565b600081815260008051602061526883398151915260205260408120805460609291839182919061396690614a52565b80601f016020809104026020016040519081016040528092919081815260200182805461399290614a52565b80156139df5780601f106139b4576101008083540402835291602001916139df565b820191906000526020600020905b8154815290600101906020018083116139c257829003601f168201915b50505050509350613a0d7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0090565b6000868152600391909101602090815260408083206001015460008051602061526883398151915290925290912060ff9091169350613a4e90600201613d3d565b9150613a5985613d48565b90509193509193565b60008181527f34516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e0260205260409020805460609160008051602061524883398151915291613aad90614a52565b80601f0160208091040260200160405190810160405280929190818152602001828054613ad990614a52565b8015613b265780601f10613afb57610100808354040283529160200191613b26565b820191906000526020600020905b815481529060010190602001808311613b0957829003601f168201915b5050505050915050919050565b60008281526000805160206152a883398151915260205260408120805460008051602061524883398151915292849291612afa908490614ab5565b6000805160206151e88339815191526000613b87611df5565b60060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa158015613bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c039190614bcd565b82546001600160a01b0319166001600160a01b03919091161790915550565b613c2c8383613e4c565b6001600160a01b0383163b15610cf7576000613c46611b0c565b5490508281035b613c60600086838060010194508661326d565b613c7d576040516368d2bf6b60e11b815260040160405180910390fd5b818110613c4d5781613c8d611b0c565b5414610fbf57600080fd5b6040516001600160a01b03838116602483015260448201839052610cf791859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613f87565b6040516001600160a01b03848116602483015283811660448301526064820183905261185c9186918216906323b872dd90608401613cc5565b6060600061165883613fea565b60606108a582614046565b60008181526000805160206152688339815191526020526040812060609190613d7390600401614123565b6001600160401b03811115613d8a57613d8a6144bd565b604051908082528060200260200182016040528015613db3578160200160208202803683370190505b50905060005b600084815260008051602061526883398151915260205260409020613de090600401614123565b811015613e4557600084815260008051602061526883398151915260205260408120613e0f906004018361412d565b905080838381518110613e2457613e24614ac8565b6001600160a01b039092166020928302919091019091015250600101613db9565b5092915050565b6000613e56611b0c565b5490506000829003613e7b5760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202613e8f611b0c565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717613eca611b0c565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114613f5457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101613f1c565b5081600003613f7557604051622e076360e81b815260040160405180910390fd5b80613f7e611b0c565b5550610cf79050565b6000613f9c6001600160a01b03841683614139565b90508051600014158015613fc1575080806020019051810190613fbf9190614ade565b155b15610cf757604051635274afe760e01b81526001600160a01b03841660048201526024016108f2565b60608160000180548060200260200160405190810160405280929190818152602001828054801561403a57602002820191906000526020600020905b815481526020019060010190808311614026575b50505050509050919050565b606081600001805480602002602001604051908101604052809291908181526020016000905b8282101561411857838290600052602060002001805461408b90614a52565b80601f01602080910402602001604051908101604052809291908181526020018280546140b790614a52565b80156141045780601f106140d957610100808354040283529160200191614104565b820191906000526020600020905b8154815290600101906020018083116140e757829003601f168201915b50505050508152602001906001019061406c565b505050509050919050565b60006108a5825490565b60006116588383614147565b606061165883836000614171565b600082600001828154811061415e5761415e614ac8565b9060005260206000200154905092915050565b6060814710156141965760405163cd78605960e01b81523060048201526024016108f2565b600080856001600160a01b031684866040516141b29190614afb565b60006040518083038185875af1925050503d80600081146141ef576040519150601f19603f3d011682016040523d82523d6000602084013e6141f4565b606091505b50915091506134b18683836060826142145761420f8261425b565b611658565b815115801561422b57506001600160a01b0384163b155b1561425457604051639996b31560e01b81526001600160a01b03851660048201526024016108f2565b5080611658565b80511561426b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054600082559060005260206000209081019061109b91906142c0565b508054600082559060005260206000209081019061109b91906142e3565b5b808211156142df5780546001600160a81b03191681556001016142c1565b5090565b5b808211156142df57600081556001016142e4565b60005b838110156143135781810151838201526020016142fb565b50506000910152565b600081518084526143348160208601602086016142f8565b601f01601f19169290920160200192915050565b602081526000611658602083018461431c565b60006020828403121561436d57600080fd5b5035919050565b6001600160a01b038116811461109b57600080fd5b803561439481614374565b919050565b600080604083850312156143ac57600080fd5b82356143b781614374565b946020939093013593505050565b600080602083850312156143d857600080fd5b82356001600160401b03808211156143ef57600080fd5b818501915085601f83011261440357600080fd5b81358181111561441257600080fd5b86602082850101111561442457600080fd5b60209290920196919550909350505050565b60008060006060848603121561444b57600080fd5b833561445681614374565b9250602084013561446681614374565b929592945050506040919091013590565b6003811061109b57600080fd5b60008060006060848603121561449957600080fd5b833592506020840135915060408401356144b281614477565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b03811182821017156144f6576144f66144bd565b60405290565b604051608081016001600160401b03811182821017156144f6576144f66144bd565b604051606081016001600160401b03811182821017156144f6576144f66144bd565b604080519081016001600160401b03811182821017156144f6576144f66144bd565b604051601f8201601f191681016001600160401b038111828210171561458a5761458a6144bd565b604052919050565b60006001600160401b038311156145ab576145ab6144bd565b6145be601f8401601f1916602001614562565b90508281528383830111156145d257600080fd5b828260208301376000602084830101529392505050565b600082601f8301126145fa57600080fd5b61165883833560208501614592565b6001600160401b038116811461109b57600080fd5b803561439481614609565b6000806040838503121561463c57600080fd5b82356001600160401b038082111561465357600080fd5b90840190610120828703121561466857600080fd5b6146706144d3565b82358281111561467f57600080fd5b61468b888286016145e9565b8252506020830135828111156146a057600080fd5b6146ac888286016145e9565b60208301525060408301356040820152606083013560608201526146d26080840161461e565b60808201526146e360a08401614389565b60a08201526146f460c08401614389565b60c082015260e083013560e08201526101009150614713828401614389565b8282015280945050505061472960208401614389565b90509250929050565b60006020828403121561474457600080fd5b813561165881614374565b6000806040838503121561476257600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b6003811061109b5761109b614771565b60008151808452602080850194506020840160005b838110156148015781518051600681106147c8576147c8614771565b885280840151848901526040808201516001600160a01b03169089015260609081015190880152608090960195908201906001016147ac565b509495945050505050565b60008151808452602080850194506020840160005b83811015614801578151805161483681614787565b88528084015160ff908116858a0152604091820151169088015260609096019590820190600101614821565b6020808252825160608383015280516080840181905260009291820190839060a08601905b808310156148be578351805161489c81614787565b835285015160ff16858301529284019260019290920191604090910190614887565b50838701519350601f199250828682030160408701526148de8185614797565b935050506040850151818584030160608601526134b1838261480c565b801515811461109b57600080fd5b6000806040838503121561491c57600080fd5b823561492781614374565b91506020830135614937816148fb565b809150509250929050565b6000806000806080858703121561495857600080fd5b843561496381614374565b9350602085013561497381614374565b92506040850135915060608501356001600160401b0381111561499557600080fd5b8501601f810187136149a657600080fd5b6149b587823560208401614592565b91505092959194509250565b600080604083850312156149d457600080fd5b82356001600160401b03808211156149eb57600080fd5b6149f7868387016145e9565b93506020850135915080821115614a0d57600080fd5b50614a1a858286016145e9565b9150509250929050565b60008060408385031215614a3757600080fd5b8235614a4281614374565b9150602083013561493781614374565b600181811c90821680614a6657607f821691505b602082108103611dad57634e487b7160e01b600052602260045260246000fd5b600060208284031215614a9857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108a5576108a5614a9f565b634e487b7160e01b600052603260045260246000fd5b600060208284031215614af057600080fd5b8151611658816148fb565b60008251614b0d8184602087016142f8565b9190910192915050565b80516020808301519190811015611dad5760001960209190910360031b1b16919050565b60008151808452602080850194506020840160005b838110156148015781516001600160a01b031687529582019590820190600101614b50565b838152606060208201526000614b8e6060830185614b3b565b9050826040830152949350505050565b60008351614bb08184602088016142f8565b835190830190614bc48183602088016142f8565b01949350505050565b600060208284031215614bdf57600080fd5b815161165881614374565b601f821115610cf7576000816000526020600020601f850160051c81016020861015614c135750805b601f850160051c820191505b81811015610b4557828155600101614c1f565b81516001600160401b03811115614c4b57614c4b6144bd565b614c5f81614c598454614a52565b84614bea565b602080601f831160018114614c945760008415614c7c5750858301515b600019600386901b1c1916600185901b178555610b45565b600085815260208120601f198616915b82811015614cc357888601518255948401946001909101908401614ca4565b5085821015614ce15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201614d0357614d03614a9f565b5060010190565b600082614d2757634e487b7160e01b600052601260045260246000fd5b500490565b60208101614d3983614787565b91905290565b600060208284031215614d5157600080fd5b815161165881614609565b600060208284031215614d6e57600080fd5b815161ffff8116811461165857600080fd5b808201808211156108a5576108a5614a9f565b6001600160401b03818116838216019080821115613e4557613e45614a9f565b60008060408385031215614dc657600080fd5b8251614dd181614374565b602084015190925061493781614374565b60006001600160401b03821115614dfb57614dfb6144bd565b5060051b60200190565b60006020808385031215614e1857600080fd5b82516001600160401b03811115614e2e57600080fd5b8301601f81018513614e3f57600080fd5b8051614e52614e4d82614de2565b614562565b81815260059190911b82018301908381019087831115614e7157600080fd5b928401925b82841015613241578351614e8981614374565b82529284019290840190614e76565b60018060a01b03851681528360208201528260408201526080606082015260006134b16080830184614b3b565b805160ff8116811461439457600080fd5b600082601f830112614ee757600080fd5b81516020614ef7614e4d83614de2565b82815260079290921b84018101918181019086841115614f1657600080fd5b8286015b84811015614f805760808189031215614f335760008081fd5b614f3b6144fc565b815160068110614f4b5760008081fd5b81528185015185820152604080830151614f6481614374565b9082015260608281015190820152835291830191608001614f1a565b509695505050505050565b600082601f830112614f9c57600080fd5b81516020614fac614e4d83614de2565b82815260609283028501820192828201919087851115614fcb57600080fd5b8387015b858110156150295781818a031215614fe75760008081fd5b614fef61451e565b8151614ffa81614477565b8152615007828701614ec5565b868201526040615018818401614ec5565b908201528452928401928101614fcf565b5090979650505050505050565b6000602080838503121561504957600080fd5b82516001600160401b038082111561506057600080fd5b908401906060828703121561507457600080fd5b61507c61451e565b82518281111561508b57600080fd5b8301601f8101881361509c57600080fd5b80516150aa614e4d82614de2565b81815260069190911b8201860190868101908a8311156150c957600080fd5b928701925b8284101561511d576040848c0312156150e75760008081fd5b6150ef614540565b84516150fa81614477565b8152615107858a01614ec5565b818a0152825260409390930192908701906150ce565b8452505050828401518281111561513357600080fd5b61513f88828601614ed6565b8583015250604083015193508184111561515857600080fd5b61516487858501614f8b565b60408201529695505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134b19083018461431c565b6000602082840312156151b857600080fd5b81516001600160e01b03198116811461165857600080fd5b80820281158282048414176108a5576108a5614a9f56fe9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e0154f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0034516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e00672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0359b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200034516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e01","sourceMap":"1438:12584:187:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2044:116:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3522:132;;;;;;;;;;-1:-1:-1;3522:132:104;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1119:32:375;;;1101:51;;1089:2;1074:18;3522:132:104;955:203:375;3260:128:104;;;;;;:::i;:::-;;:::i;:::-;;12481:113:187;;;;;;;;;;-1:-1:-1;12481:113:187;;;;;:::i;:::-;;:::i;10273:115::-;;;;;;;;;;;;;:::i;:::-;;;2501:25:375;;;2489:2;2474:18;10273:115:187;2355:177:375;8927:105:187;;;;;;;;;;-1:-1:-1;8927:105:187;;;;;:::i;:::-;8986:7;1090:43:101;;;297:66:102;1090:43:101;;;;;;-1:-1:-1;;;;;1090:43:101;;8927:105:187;1527:93:104;;;;;;;;;;;;;:::i;4917:2680::-;;;;;;:::i;:::-;;:::i;5023:841:186:-;;;;;;;;;;-1:-1:-1;5023:841:186;;;;;:::i;:::-;;:::i;7680:167:104:-;;;;;;:::i;:::-;;:::i;1223:205:177:-;;;;;;;;;;-1:-1:-1;1223:205:177;;;;;:::i;:::-;;:::i;1786:267:187:-;;;;;;;;;;-1:-1:-1;1786:267:187;;;;;:::i;:::-;;:::i;2233:363::-;;;;;;;;;;-1:-1:-1;2233:363:187;;;;;:::i;:::-;;:::i;10422:161::-;;;;;;;;;;-1:-1:-1;10422:161:187;;;;;:::i;:::-;;:::i;10793:528::-;;;;;;;;;;-1:-1:-1;10793:528:187;;;;;:::i;:::-;;:::i;2891:152:104:-;;;;;;;;;;-1:-1:-1;2891:152:104;;;;;:::i;:::-;;:::i;12199:107:187:-;;;;;;;;;;;;;:::i;10077:162::-;;;;;;;;;;-1:-1:-1;10077:162:187;;;;;:::i;:::-;;:::i;4315:130:186:-;;;;;;;;;;-1:-1:-1;4315:130:186;;;;;:::i;:::-;;:::i;8358:127::-;;;;;;;;;;;;;:::i;11355:119:187:-;;;;;;;;;;;;;:::i;1697:107:104:-;;;;;;;;;;-1:-1:-1;1697:107:104;;;;;:::i;:::-;;:::i;7917:128:186:-;;;;;;;;;;-1:-1:-1;7917:128:186;;;;;:::i;:::-;;:::i;8662:115::-;;;;;;;;;;;;;:::i;12913:95:187:-;;;;;;;;;;;;;:::i;690:171:177:-;;;;;;;;;;-1:-1:-1;690:171:177;;;;;:::i;:::-;;:::i;8064:829:187:-;;;;;;:::i;:::-;;:::i;9241:106::-;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;7916:31:375;;;7898:50;;7886:2;7871:18;9241:106:187;7754:200:375;8049:131:186;;;;;;;;;;;;;:::i;3260:2054:187:-;;;;;;:::i;:::-;;:::i;1432:182:177:-;;;;;;;;;;-1:-1:-1;1432:182:177;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;12598:107:187:-;;;;;;;;;;;;;:::i;11883:::-;;;;;;;;;;;;;:::i;2223:120:104:-;;;;;;;;;;;;;:::i;11690:159:187:-;;;;;;;;;;-1:-1:-1;11690:159:187;;;;;:::i;:::-;;:::i;3957:269:104:-;;;;;;;;;;-1:-1:-1;3957:269:104;;;;;:::i;:::-;;:::i;4449:117:186:-;;;;;;;;;;;;;:::i;7169:322::-;;;;;;;;;;;;;:::i;8396:348:104:-;;;;;;:::i;:::-;;:::i;2436:329::-;;;;;;;;;;-1:-1:-1;2436:329:104;;;;;:::i;:::-;;:::i;6546:1310:187:-;;;;;;:::i;:::-;;:::i;876:157:104:-;;;;;;;;;;-1:-1:-1;876:157:104;;;;;:::i;:::-;;:::i;8952:127:186:-;;;;;;;;;;;;;:::i;9558:170:187:-;;;;;;;;;;-1:-1:-1;9558:170:187;;;;;:::i;:::-;;:::i;9762:107::-;;;;;;;;;;;;;:::i;4364:167:104:-;;;;;;;;;;-1:-1:-1;4364:167:104;;;;;:::i;:::-;;:::i;:::-;;;13848:14:375;;13841:22;13823:41;;13811:2;13796:18;4364:167:104;13683:187:375;6926:239:186;;;;;;;;;;-1:-1:-1;6926:239:186;;;;;:::i;:::-;;:::i;2044:116:104:-;2098:13;2126:23;:21;:23::i;:::-;:29;;2119:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2044:116;:::o;3522:132::-;3606:7;3628:21;3641:7;3628:12;:21::i;:::-;3621:28;3522:132;-1:-1:-1;;3522:132:104:o;3260:128::-;3356:27;3365:2;3369:7;3378:4;3356:8;:27::i;:::-;3260:128;;:::o;12481:113:187:-;648:8:83;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:83;:10;-1:-1:-1;;;;;634:22:83;;630:79;;673:29;;-1:-1:-1;;;673:29:83;;691:10;673:29;;;1101:51:375;1074:18;;673:29:83;;;;;;;;630:79;12560:29:187::1;12580:8;;12560:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;12560:19:187::1;::::0;-1:-1:-1;;;12560:29:187:i:1;10273:115::-:0;10326:7;10348:35;10368:14;:12;:14::i;10348:35::-;10341:42;;10273:115;:::o;1527:93:104:-;1579:7;1601:14;:12;:14::i;4917:2680::-;5036:27;5066;5085:7;5066:18;:27::i;:::-;5036:57;;5145:4;-1:-1:-1;;;;;5104:45:104;5120:19;-1:-1:-1;;;;;5104:45:104;;5100:92;;5164:28;;-1:-1:-1;;;5164:28:104;;;;;;;;;;;5100:92;5207:27;5242:23;5274:35;5301:7;5274:26;:35::i;:::-;5199:110;;;;5398:68;5423:15;5440:4;5446:19;29371:10:105;;29289:97;5446:19:104;-1:-1:-1;;;;;11877:32:105;;;11735:28;;11992:20;;12014:30;;11989:56;;11468:587;5398:68:104;5393:181;;5479:43;5496:4;29371:10:105;4364:167:104;:::i;5479:43::-;5474:100;;5539:35;;-1:-1:-1;;;5539:35:104;;;;;;;;;;;5474:100;-1:-1:-1;;;;;5585:16:104;;5581:52;;5610:23;;-1:-1:-1;;;5610:23:104;;;;;;;;;;;5581:52;5758:15;5755:135;;;5880:1;5859:19;5852:30;5755:135;6230:23;:21;:23::i;:::-;-1:-1:-1;;;;;6230:48:104;;;;;;:42;;;;;:48;;;;;6228:50;;-1:-1:-1;;6228:50:104;;;6316:23;:21;:23::i;:::-;-1:-1:-1;;;;;6316:46:104;;;;;;:42;;;;;:46;;;;;;6314:48;;;;;;10236:11:105;10211:23;10207:41;10194:63;-1:-1:-1;;;10194:63:105;6590:23:104;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;:184;;;;-1:-1:-1;;;6879:47:104;;:52;;6875:625;;6975:1;6965:11;;7080:23;:21;:23::i;:::-;:54;;;;:41;;;;;:54;;;;;;:59;;7076:416;;7220:23;:21;:23::i;:::-;:37;7205:52;;7201:281;;7450:19;7365:23;:21;:23::i;:::-;:82;;;;:41;;;;;:82;;;;;:104;7201:281;6933:567;6875:625;7536:7;7532:2;-1:-1:-1;;;;;7517:27:104;7526:4;-1:-1:-1;;;;;7517:27:104;;;;;;;;;;;7550:42;5030:2567;;;4917:2680;;;:::o;5023:841:186:-;5110:7;5125:35;5163:26;:24;:26::i;:::-;5125:64;;5223:22;5248:30;:28;:30::i;:::-;5223:55;;5379:11;5362:14;:28;5358:42;;;-1:-1:-1;5399:1:186;;5023:841;-1:-1:-1;;;5023:841:186:o;5358:42::-;5530:15;;;;5522:63;;-1:-1:-1;;;5522:63:186;;5579:4;5522:63;;;1101:51:375;5594:11:186;;-1:-1:-1;;;;;5530:15:186;;5522:48;;1074:18:375;;5522:63:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:83;5511:109;;;-1:-1:-1;5619:1:186;;5023:841;-1:-1:-1;;;5023:841:186:o;5511:109::-;5631:16;;;;-1:-1:-1;;;;;5631:16:186;:30;5627:161;;5703:16;;;;5684:104;;-1:-1:-1;;;5684:104:186;;;;;14623:25:375;;;14664:18;;;14657:34;;;-1:-1:-1;;;;;5703:16:186;;;;5684:45;;14596:18:375;;5684:104:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5669:119;5023:841;-1:-1:-1;;;;5023:841:186:o;5627:161::-;5824:2;:15;;;;;;;;;;-1:-1:-1;;;;;5824:15:186;-1:-1:-1;;;;;5802:55:186;;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7680:167:104;7803:39;7820:4;7826:2;7830:7;7803:39;;;;;;;;;;;;:16;:39::i;:::-;7680:167;;;:::o;1223:205:177:-;415:1:92;-1:-1:-1;;;;;;;;;;;515:38:92;:66;511:117;;596:32;;-1:-1:-1;;;596:32:92;;;;;;;;;;;511:117;634:22;415:1;-1:-1:-1;;;;;;;;;;;832:65:92;777:125;634:22;1365:58:177::1;1393:13;1408:6;1416;1365:27;:58::i;:::-;669:24:92::0;475:1;-1:-1:-1;;;;;;;;;;;832:65:92;777:125;1786:267:187;-1:-1:-1;;;;;;;;;;;1263:42:63;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:63;;;;;;;;;;;1258:100;1903:44:187::1;-1:-1:-1::0;;;1903:13:187::1;:44::i;:::-;1953:41;1975:4;1981:12;1953:21;:41::i;:::-;2000:48;2025:4;:9;;;2036:4;:11;;;2000:24;:48::i;2233:363::-:0;648:8:83;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:83;:10;-1:-1:-1;;;;;634:22:83;;630:79;;673:29;;-1:-1:-1;;;673:29:83;;691:10;673:29;;;1101:51:375;1074:18;;673:29:83;955:203:375;630:79:83;-1:-1:-1;;;;;2297:21:187;::::1;2293:62;;2327:28;;-1:-1:-1::0;;;2327:28:187::1;;;;;;;;;;;2293:62;2361:15;2379:20;:18;:20::i;:::-;2361:38;;2409:7;2420:1;2409:12:::0;2405:58:::1;;2430:33;;-1:-1:-1::0;;;2430:33:187::1;;;;;;;;;;;2405:58;2469:122;2510:24;:22;:24::i;:::-;2550:4;2563:7;2578;2469:33;:122::i;10422:161::-:0;10505:7;10527:51;10554:7;10563:14;:12;:14::i;:::-;10527:26;:51::i;10793:528::-;648:8:83;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:83;:10;-1:-1:-1;;;;;634:22:83;;630:79;;673:29;;-1:-1:-1;;;673:29:83;;691:10;673:29;;;1101:51:375;1074:18;;673:29:83;955:203:375;630:79:83;10918:26:187::1;10947:27;:25;:27::i;:::-;10918:56:::0;-1:-1:-1;11046:23:187;;;::::1;::::0;:61:::1;;;11089:18;11073:13;:34;11046:61;11042:115;;;11122:35;;-1:-1:-1::0;;;11122:35:187::1;;;;;;;;;;;11042:115;11231:36;11253:13;11231:21;:36::i;:::-;11273:43;11302:13;11273:28;:43::i;2891:152:104:-:0;2971:7;3009:27;3028:7;3009:18;:27::i;12199:107:187:-;12255:7;12277:24;:22;:24::i;10077:162::-;648:8:83;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:83;:10;-1:-1:-1;;;;;634:22:83;;630:79;;673:29;;-1:-1:-1;;;673:29:83;;691:10;673:29;;;1101:51:375;1074:18;;673:29:83;955:203:375;630:79:83;10148:22:187::1;10161:8;10148:12;:22::i;:::-;10195:19;:17;:19::i;:::-;-1:-1:-1::0;;;;;10176:48:187::1;;10225:8;10176:58;;;;;;;;;;;;;2501:25:375::0;;2489:2;2474:18;;2355:177;10176:58:187::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10077:162:::0;:::o;4315:130:186:-;4424:16;4381:26;:24;:26::i;:::-;:40;;:59;;-1:-1:-1;;;;;;4381:59:186;-1:-1:-1;;;;;4381:59:186;;;;;;;;;;-1:-1:-1;4315:130:186:o;8358:127::-;8413:7;8435:26;:24;:26::i;:::-;:45;;;-1:-1:-1;;;;;8435:45:186;;8358:127;-1:-1:-1;8358:127:186:o;11355:119:187:-;11417:7;11439:30;:28;:30::i;1697:107:104:-;1760:7;1782:17;1793:5;1782:10;:17::i;7917:128:186:-;8032:8;7983:26;:24;:26::i;:::-;:46;;:57;-1:-1:-1;7917:128:186:o;8662:115::-;8711:7;8733:26;:24;:26::i;:::-;:39;;;-1:-1:-1;;;;;8733:39:186;;8662:115;-1:-1:-1;8662:115:186:o;12913:95:187:-;12963:7;12985:18;:16;:18::i;690:171:177:-;-1:-1:-1;;;;;;;;;;;1263:42:63;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:63;;;;;;;;;;;1258:100;803:53:177::1;837:18;803:33;:53::i;:::-;690:171:::0;:::o;8064:829:187:-;415:1:92;-1:-1:-1;;;;;;;;;;;515:38:92;:66;511:117;;596:32;;-1:-1:-1;;;596:32:92;;;;;;;;;;;511:117;634:22;415:1;-1:-1:-1;;;;;;;;;;;832:65:92;777:125;634:22;8142:16:187::1;8161:17;8170:7;8161:8;:17::i;:::-;8142:36:::0;-1:-1:-1;;;;;;8189:22:187;::::1;8185:63;;8220:28;;-1:-1:-1::0;;;8220:28:187::1;;;;;;;;;;;8185:63;8312:18;1090:43:101::0;;;297:66:102;1090:43:101;;;;;;-1:-1:-1;;;;;1090:43:101;8394:24:187::1;:22;:24::i;:::-;-1:-1:-1::0;;;;;8362:56:187::1;:28;8375:15;8362:10:::0;:28:::1;:::i;:::-;:56;8358:99;;8433:24;;-1:-1:-1::0;;;8433:24:187::1;;;;;;;;;;;8358:99;8509:23;8535:69;8569:7;8584:14;:12;:14::i;8535:69::-;8509:95:::0;-1:-1:-1;8615:19:187;;8611:218:::1;;8644:19;8666:46;8686:8;8696:15;8666:19;:46::i;:::-;8644:68:::0;-1:-1:-1;8720:15:187::1;8738:29;8644:68:::0;8738:15;:29:::1;:::i;:::-;8720:47:::0;-1:-1:-1;8779:11:187;;8775:47:::1;;8792:30;8804:8;8814:7;8792:11;:30::i;:::-;;8775:47;8636:193;;8611:218;8835:53;8854:7;8863:24;:22;:24::i;:::-;8835:18;:53::i;:::-;8136:757;;;669:24:92::0;475:1;-1:-1:-1;;;;;;;;;;;832:65:92;777:125;9241:106:187;9297:6;9318:24;:22;:24::i;8049:131:186:-;8107:7;8129:26;:24;:26::i;:::-;:46;;;8122:53;;8049:131;:::o;3260:2054:187:-;415:1:92;-1:-1:-1;;;;;;;;;;;515:38:92;:66;511:117;;596:32;;-1:-1:-1;;;596:32:92;;;;;;;;;;;511:117;634:22;415:1;-1:-1:-1;;;;;;;;;;;832:65:92;777:125;634:22;3333:28:187::1;3352:8;3333:18;:28::i;:::-;3460:38;::::0;3415:10:::1;15144:2:375::0;15140:15;;;-1:-1:-1;;15136:53:375;3460:38:187::1;::::0;::::1;15124:66:375::0;3485:12:187::1;15206::375::0;;;15199:28;-1:-1:-1;;;;15243:12:375;;3460:38:187::1;;;;;;;;;;;;3450:49;;;;;;3432:67;;3505:21;3529:111;3552:7;3567:67;3590:7;3599:6;3607:26;3625:7;3607:17;:26::i;:::-;1996:37:169::0;;;;;;;22065:25:375;;;;-1:-1:-1;;;;;22126:32:375;;;;22106:18;;;22099:60;22175:18;;;;22168:34;;;;1996:37:169;;;;;;;;;;22038:18:375;;;;1996:37:169;;;1986:48;;;;;;1834:206;3567:67:187::1;2172:36:169::0;;;;;;;22370:19:375;;;;22405:12;;;22398:28;;;;2172:36:169;;;;;;;;;22442:12:375;;;;2172:36:169;;2162:47;;;;;;2044:170;3529:111:187::1;3505:135;;3647:57;3660:13;3686:6;3694:8;3675:28;;;;;;;;-1:-1:-1::0;;;;;15496:15:375;;;15478:34;;15548:15;;15543:2;15528:18;;15521:43;15428:2;15413:18;;15266:304;3675:28:187::1;;;;;;;;;;;;;3647:12;:57::i;:::-;3714:9;:13:::0;3710:58:::1;;3729:39;3743:13;3758:9;3729:13;:39::i;:::-;3775:30;3808:58;3839:21;;;;;;;;;;;;;-1:-1:-1::0;;;3839:21:187::1;;::::0;3808:23:::1;:58::i;:::-;3775:91;;3878:9;3873:1353;3897:5;:12;3893:1;:16;3873:1353;;;3924:27;3954:5;3960:1;3954:8;;;;;;;;:::i;:::-;;;;;;;3924:38;;3976:4;:13;;;3971:1249;;4006:9;4001:1211;4025:4;:17;;;:24;4021:1;:28;4001:1211;;;4068:24;4108:4;:17;;;4126:1;4108:20;;;;;;;;:::i;:::-;;;;;;;4068:61;;4146:11;-1:-1:-1::0;;;;;4146:24:187::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4141:1061;;4213:16;::::0;;4227:1:::1;4213:16:::0;;;;;::::1;::::0;;;4188:22:::1;::::0;4213:16:::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;4213:16:187::1;4188:41;;4254:6;4243:5;4249:1;4243:8;;;;;;;;:::i;:::-;;;;;;:17;-1:-1:-1::0;;;;;4243:17:187::1;;;-1:-1:-1::0;;;;;4243:17:187::1;;;::::0;::::1;4846:11;-1:-1:-1::0;;;;;4846:22:187::1;;4869:3;4874:5;1695:21;;;;;;;;;;;;;-1:-1:-1::0;;;1695:21:187::1;;::::0;1678:39:::1;;;;;;;;:::i;:::-;;;;;;;;;;;;;1670:48;;;:::i;:::-;4846:46;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4842:131;;;4910:26;4922:13;4910:11;:26::i;:::-;4952:7;;;;;;;;;;;;4842:131;4174:811;4141:1061;;;5005:144;5045:13;5099:11;5128:4;:7;;;5005:24;:144::i;:::-;5185:4;5163:26;;4141:1061;-1:-1:-1::0;4051:3:187::1;;4001:1211;;;;3971:1249;-1:-1:-1::0;3911:3:187::1;;3873:1353;;;;5236:19;5231:79;;5270:33;::::0;-1:-1:-1;;;;;5270:33:187;::::1;::::0;::::1;::::0;;;::::1;5231:79;3327:1987;;;;;662:1:92;669:24:::0;475:1;-1:-1:-1;;;;;;;;;;;832:65:92;777:125;1432:182:177;1527:32;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;1527:32:177;1574:35;1587:13;1602:6;1574:12;:35::i;:::-;1567:42;1432:182;-1:-1:-1;;;1432:182:177:o;12598:107:187:-;12651:13;12679:21;:19;:21::i;11883:107::-;11936:7;11958:27;:25;:27::i;2223:120:104:-;2279:13;2307:23;:21;:23::i;:::-;:31;;2300:38;;;;;:::i;11690:159:187:-;648:8:83;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:83;:10;-1:-1:-1;;;;;634:22:83;;630:79;;673:29;;-1:-1:-1;;;673:29:83;;691:10;673:29;;;1101:51:375;1074:18;;673:29:83;955:203:375;630:79:83;11761:42:187::1;11778:8;11788:14;:12;:14::i;:::-;11761:16;:42::i;:::-;11809:35;11835:8;11809:25;:35::i;3957:269:104:-:0;4147:8;4059:23;:21;:23::i;:::-;29371:10:105;4059:63:104;;;;:42;;;;;:63;;;;;;;;-1:-1:-1;;;;;4059:85:104;;;;;;;;;;;;:96;;-1:-1:-1;;4059:96:104;;;;;;;;;;;4166:55;;13848:14:375;;13841:22;13823:41;;4059:85:104;;29371:10:105;;4166:55:104;;13796:18:375;4166:55:104;;;;;;;3957:269;;:::o;4449:117:186:-;4499:7;4521:26;:24;:26::i;:::-;:40;;;-1:-1:-1;;;;;4521:40:186;;4449:117;-1:-1:-1;4449:117:186:o;7169:322::-;7230:7;7245:35;7283:26;:24;:26::i;:::-;7341:17;;;;7245:64;;-1:-1:-1;7369:18:186;;7365:45;;7396:14;7169:322;-1:-1:-1;;7169:322:186:o;7365:45::-;7445:2;:15;;;;;;;;;;-1:-1:-1;;;;;7445:15:186;-1:-1:-1;;;;;7423:61:186;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7416:70;;;;7169:322;:::o;8396:348:104:-;8543:31;8556:4;8562:2;8566:7;8543:12;:31::i;:::-;-1:-1:-1;;;;;8584:14:104;;;:19;8580:160;;8616:56;8647:4;8653:2;8657:7;8666:5;8616:30;:56::i;:::-;8611:129;;8691:40;;-1:-1:-1;;;8691:40:104;;;;;;;;;;;8611:129;8396:348;;;;:::o;2436:329::-;2517:13;2543:16;2551:7;2543;:16::i;:::-;2538:59;;2568:29;;-1:-1:-1;;;2568:29:104;;;;;;;;;;;2538:59;2604:21;2628:10;6624:9:105;;;;;;;;;-1:-1:-1;6624:9:105;;;6552:86;2628:10:104;2604:34;;2663:7;2657:21;2682:1;2657:26;:103;;;;;;;;;;;;;;;;;2718:7;2727:18;2737:7;2727:9;:18::i;:::-;2701:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2644:116;2436:329;-1:-1:-1;;;2436:329:104:o;6546:1310:187:-;415:1:92;-1:-1:-1;;;;;;;;;;;515:38:92;:66;511:117;;596:32;;-1:-1:-1;;;596:32:92;;;;;;;;;;;511:117;634:22;415:1;-1:-1:-1;;;;;;;;;;;832:65:92;777:125;634:22;6687:28:187::1;6706:8;6687:18;:28::i;:::-;6742:15;6760:14;:12;:14::i;:::-;6742:32;;6836:23;6862:35;6882:14;:12;:14::i;6862:35::-;6836:61:::0;-1:-1:-1;6908:19:187;;6904:800:::1;;6977:52;7004:7;7013:15;6977:26;:52::i;:::-;7038:19;7060:46;7080:8;7090:15;7060:19;:46::i;:::-;7038:68:::0;-1:-1:-1;7114:15:187::1;7132:29;7038:68:::0;7132:15;:29:::1;:::i;:::-;7114:47;;7169:16;7188:24;:22;:24::i;:::-;7169:43:::0;-1:-1:-1;7225:11:187;;7221:477:::1;;7308:19;7330:47;7355:7;7364:12;7330:24;:47::i;:::-;7308:69;;7387:126;7432:8;7452;7472;7492:11;7387:33;:126::i;:::-;7578:20;7601:21;7611:11:::0;7601:7;:21:::1;:::i;:::-;7578:44:::0;-1:-1:-1;7636:16:187;;7632:57:::1;;7654:35;7666:8;7676:12;7654:11;:35::i;:::-;;7632:57;7238:460;;7221:477;6929:775;;;6904:800;7733:22;7743:8;7753:1;7733:9;:22::i;:::-;7798:53;7817:7;7826:24;:22;:24::i;7798:53::-;6681:1175;;669:24:92::0;475:1;-1:-1:-1;;;;;;;;;;;832:65:92;777:125;876:157:104;-1:-1:-1;;;;;;;;;;;1263:42:63;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:63;;;;;;;;;;;1258:100;988:40:104::1;1013:5;1020:7;988:24;:40::i;8952:127:186:-:0;9004:13;9032:26;:24;:26::i;:::-;:42;;9025:49;;;;;:::i;9558:170:187:-;648:8:83;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:83;:10;-1:-1:-1;;;;;634:22:83;;630:79;;673:29;;-1:-1:-1;;;673:29:83;;691:10;673:29;;;1101:51:375;1074:18;;673:29:83;955:203:375;630:79:83;9650:35:187::1;9671:13;9650:20;:35::i;:::-;9691:32;9709:13;9691:17;:32::i;9762:107::-:0;9823:7;9845:19;:17;:19::i;4364:167:104:-;4473:4;4492:34;4510:5;4517:8;4492:17;:34::i;6926:239:186:-;7000:35;7038:26;:24;:26::i;:::-;7070:17;;;:33;;;7114:46;;7000:64;;-1:-1:-1;7090:13:186;;7114:46;;;;;6994:171;6926:239;:::o;1696:139:107:-;300:66;;1696:139::o;22511:230:105:-;22589:7;22609:16;22617:7;22609;:16::i;:::-;22604:64;;22634:34;;-1:-1:-1;;;22634:34:105;;;;;;;;;;;22604:64;22682:23;:21;:23::i;:::-;:48;;;;:39;;:48;;-1:-1:-1;22682:48:105;;;:54;-1:-1:-1;;;;;22682:54:105;;22511:230::o;23291:439::-;23397:13;23413:17;23422:7;23413:8;:17::i;:::-;23397:33;;23441:13;23437:184;;;29371:10;-1:-1:-1;;;;;23466:28:105;;;23462:159;;23509:45;23527:5;29371:10;23509:17;:45::i;:::-;23504:117;;23575:35;;-1:-1:-1;;;23575:35:105;;;;;;;;;;;23504:117;23684:2;23627:23;:21;:23::i;:::-;:48;;;;:39;;;;;:48;;;;;;:59;;-1:-1:-1;;;;;;23627:59:105;-1:-1:-1;;;;;23627:59:105;;;;;;23697:28;23627:48;;23697:28;;;;;;;;;;23627:48;23697:28;23391:339;23291:439;;;:::o;724:189:83:-;786:67;;;;;;;;302:66:85;786:67:83;-1:-1:-1;;;;;786:67:83;;;;;;;;;;;;;866:42;;-1:-1:-1;;;866:42:83;;;;;2501:25:375;;;;866:42:83;;765:13;;866:30;;2474:18:375;;;;;866:42:83;;;;;;786:67;866:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;859:49;;;724:189;:::o;9083:120:186:-;9193:5;9148:26;:24;:26::i;:::-;:42;;;:50;;:42;:50;:::i;2985:351:105:-;3032:7;;3263:23;:21;:23::i;:::-;:36;;;3215:23;:21;:23::i;:::-;:37;:84;:110;;2985:351;-1:-1:-1;2985:351:105:o;7836:1501::-;7912:14;7974:32;8009:23;:21;:23::i;:::-;8050:29;;;;:20;;;:29;;;;;;;-1:-1:-1;7974:58:105;;-1:-1:-1;;;;8115:24:105;;:29;;8111:1172;;8236:6;8246:1;8236:11;8232:791;;8276:16;;8265:27;;8261:83;;8313:31;;-1:-1:-1;;;8313:31:105;;;;;;;;;;;8261:83;8831:182;-1:-1:-1;;8910:9:105;;;8889:31;;;;:20;;;:31;;;;;;8910:9;;8889:31;;-1:-1:-1;8948:25:105;;8831:182;8948:25;;8987:13;7836:1501;;;:::o;8111:1172::-;7966:1323;9301:31;;-1:-1:-1;;;9301:31:105;;;;;;;;;;;12155:478;12251:27;12280:23;12313:38;12354:30;:28;:30::i;:::-;:62;;;;:53;;:62;;-1:-1:-1;;12354:62:105;;;;12597:26;;12354:62;;12597:26;;-1:-1:-1;12155:478:105:o;910:139:188:-;294:66;;910:139::o;2771:1911:178:-;2901:41;3024:30;;;-1:-1:-1;;;;;;;;;;;3024:30:178;;;;;3072:25;;-1:-1:-1;;;;;;;;;;;469:66:179;3024:30:178;3072:25;;;-1:-1:-1;;;;;3072:25:178;:39;;:73;;-1:-1:-1;3115:21:178;;;;:30;3072:73;3061:156;;;3167:43;;-1:-1:-1;;;3167:43:178;;;;;;;;;;;3061:156;3227:31;;;;:23;;;:31;;;;;;;;3223:110;;;3275:51;;-1:-1:-1;;;3275:51:178;;;;;;;;;;;3223:110;3420:10;3542:34;;;:26;;;:34;;;;;:41;3420:10;;;;;3590:573;3614:22;3610:1;:26;3590:573;;;3651:25;3679:34;;;:26;;;:34;;;;;:37;;3714:1;;3679:37;;;;;;:::i;:::-;;;;;;;;;;3767:13;;3679:37;;-1:-1:-1;3784:10:178;-1:-1:-1;;;;;3767:13:178;;;:27;3763:217;;3827:24;3810:13;;-1:-1:-1;;;3810:13:178;;;;:41;;;;;;;;:::i;:::-;;3806:112;;3872:35;;-1:-1:-1;;;3872:35:178;;;;;;;;;;;3806:112;3927:22;;3943:6;;3927:8;;-1:-1:-1;;;;3927:22:178;-1:-1:-1;;;3943:6:178;3927:22;;;;;;;;:::i;:::-;;;;;;3967:4;3959:12;;3763:217;4030:21;4013:13;;-1:-1:-1;;;4013:13:178;;;;:38;;;;;;;;:::i;:::-;;4009:148;;4063:8;;;;:::i;:::-;;;;4009:148;;;4107:21;4090:13;;-1:-1:-1;;;4090:13:178;;;;:38;;;;;;;;:::i;:::-;;4086:71;;4140:8;;;;:::i;:::-;;;;4086:71;-1:-1:-1;3638:3:178;;3590:573;;;;4174:5;4169:65;;4196:31;;-1:-1:-1;;;4196:31:178;;;;;;;;;;;4169:65;4260:26;4285:1;4260:22;:26;:::i;:::-;4251:6;:35;:74;;;-1:-1:-1;4299:26:178;4324:1;4299:22;:26;:::i;:::-;4290:6;:35;4251:74;4240:438;;;4340:31;;;;:23;;;:31;;;;;:38;;-1:-1:-1;;4340:38:178;4374:4;4340:38;;;4415:15;;;:79;;4473:21;4415:79;;;4441:21;4415:79;4386:108;;4502:59;4534:13;4549:11;4502:31;:59::i;:::-;4603:13;4574:56;4618:11;4574:56;;;;;;:::i;:::-;;;;;;;;4638:33;4657:13;4638:18;:33::i;:::-;4332:346;4240:438;2895:1787;;;;;;2771:1911;;;:::o;452:282:66:-;-1:-1:-1;;;;;;1121:62:66;;1096:4;1121:62;;;303:66:68;1121:62:66;;;;;;;;:70;;:62;:70;510:182;;-1:-1:-1;;;;;;556:62:66;;:49;:62;;;303:66:68;556:62:66;;;;;:69;;-1:-1:-1;;556:69:66;621:4;556:69;;;510:182;;;653:32;;-1:-1:-1;;;653:32:66;;;;;;;;;;;510:182;702:27;;-1:-1:-1;;;;;;702:27:66;;;;;;;;452:282;:::o;899:671:186:-;1003:35;1041:26;:24;:26::i;:::-;1074:15;;;:30;;-1:-1:-1;;;;;1074:30:186;;;-1:-1:-1;;;;;;1074:30:186;;;;;;;;1129:18;;;1110:16;;;:37;;;;;;;;;;;;;1153:21;;;:53;;;;;439:42:226;1153:53:186;;;1237:14;;;;1212:22;;;:39;1277:19;;;;1257:17;;;:39;;;1003:64;;-1:-1:-1;1307:23:186;1303:86;;1340:42;1362:4;:19;;;1340:21;:42::i;:::-;1395:40;1416:4;:18;;;1395:20;:40::i;:::-;1446:10;;;;:14;1442:124;;1470:24;1483:4;:10;;;1470:12;:24::i;:::-;1521:16;;;;1548:10;;;;;1502:57;;-1:-1:-1;;;1502:57:186;;-1:-1:-1;;;;;1521:16:186;;;;1502:45;;:57;;;;2501:25:375;;;2489:2;2474:18;;2355:177;1502:57:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;997:573;899:671;;:::o;1037:299:104:-;-1:-1:-1;;;;;;;;;;;1263:42:63;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:63;;;;;;;;;;;1258:100;1159:25:104::1;-1:-1:-1::0;;;1159:13:104::1;:25::i;:::-;1224;-1:-1:-1::0;;;1224:13:104::1;:25::i;:::-;1297:34;1316:5;1323:7;1297:18;:34::i;3339:119:186:-:0;3392:7;3414:26;:24;:26::i;:::-;:39;;;3407:46;;3339:119;:::o;720:315:226:-;841:38;;866:7;841:38;-1:-1:-1;;;;;;;889:24:226;;;885:146;;923:35;947:2;951:6;923:23;:35::i;:::-;885:146;;;979:45;997:8;1007:4;1013:2;1017:6;979:17;:45::i;6045:335:186:-;6154:7;6169:35;6207:26;:24;:26::i;:::-;6280:1;6244:33;;;:24;;;:33;;;;;;6169:64;;-1:-1:-1;6244:37:186;6240:89;;6296:33;;;;:24;;;;:33;;;;;;;-1:-1:-1;6289:40:186;;6240:89;6343:32;6363:11;6343:19;:32::i;6560:362::-;6634:35;6672:26;:24;:26::i;:::-;6634:64;;6827:2;:15;;;;;;;;;;-1:-1:-1;;;;;6827:15:186;-1:-1:-1;;;;;6805:61:186;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6783:13;:85;6772:145;;;6882:35;;-1:-1:-1;;;6882:35:186;;;;;;;;;;;4743:214;4803:16;4844:18;:16;:18::i;:::-;-1:-1:-1;;;;;4822:65:186;;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4803:86;;4910:8;4899;:19;4895:57;;;4927:25;;-1:-1:-1;;;4927:25:186;;;;;;;;;;;3340:242:105;3398:7;-1:-1:-1;;;;;3417:19:105;;3413:60;;3445:28;;-1:-1:-1;;;3445:28:105;;;;;;;;;;;3413:60;-1:-1:-1;;;;;3492:23:105;:21;:23::i;:::-;:42;;:49;3535:5;-1:-1:-1;;;;;3492:49:105;-1:-1:-1;;;;;3492:49:105;;;;;;;;;;;;;:85;3479:98;;3340:242;;;:::o;865:209:177:-;971:50;-1:-1:-1;;;971:13:177;:50::i;:::-;-1:-1:-1;;;;;;;;;;;1368:72:178;;-1:-1:-1;;;;;;1368:72:178;-1:-1:-1;;;;;1368:72:178;;;;;690:171:177;:::o;3636:215:186:-;3693:6;3707:35;3745:26;:24;:26::i;:::-;3707:64;;3806:2;:15;;;;;;;;;;-1:-1:-1;;;;;3806:15:186;-1:-1:-1;;;;;3784:60:186;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1751:698::-;1850:22;1880:35;1918:26;:24;:26::i;:::-;2005:15;;;;2047:21;;;;;2102:26;;;-1:-1:-1;;;2102:26:186;;;;2005:15;;-1:-1:-1;;;;;;2005:15:186;;;;2047:21;;;;;1950:30;;2005:15;;2102:24;;:26;;;;;;;;;;;2005:15;2102:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2074:54;;2134:13;2150:8;-1:-1:-1;;;;;2150:25:186;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2134:43;;2200:46;2222:15;2239:6;2200:46;;:21;:46::i;:::-;2183:63;;2315:129;2356:8;2372:5;2393:17;2424:14;2315:33;:129::i;:::-;1874:575;;;;;1751:698;;;;:::o;2453:882::-;2534:7;2549:35;2587:26;:24;:26::i;:::-;2549:64;;2670:16;2689:24;:22;:24::i;:::-;2670:43;-1:-1:-1;;;;;;;;2724:41:186;;;2720:108;;2794:6;2775:2;:15;;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;2815:6:186;;-1:-1:-1;2808:13:186;;-1:-1:-1;;;2808:13:186;2720:108;2922:30;;-1:-1:-1;;;2922:30:186;;2946:4;2922:30;;;1101:51:375;2883:8:186;;2861:12;;-1:-1:-1;;;;;2922:15:186;;;;;1074:18:375;;2922:30:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2898:54;;2958:72;2992:8;3002:4;3016;3023:6;2958:33;:72::i;:::-;3059:30;;-1:-1:-1;;;3059:30:186;;3083:4;3059:30;;;1101:51:375;3036:20:186;;-1:-1:-1;;;;;3059:15:186;;;;;1074:18:375;;3059:30:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3036:53;-1:-1:-1;3146:19:186;3168:28;3183:13;3036:53;3168:28;:::i;:::-;3146:50;;3221:6;3206:11;:21;3202:67;;3236:33;;-1:-1:-1;;;3236:33:186;;;;;;;;;;;3202:67;3295:11;3276:2;:15;;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;3319:11:186;;2453:882;-1:-1:-1;;;;;;;;;2453:882:186:o;256:588:101:-;333:32;425:22;;;297:66:102;425:22:101;;;;;;;;297:66:102;;-1:-1:-1;;;;;425:22:101;;;;484;;;480:261;;532:34;558:8;539:15;532:34;:::i;:::-;516:50;;480:261;;;706:28;726:8;706:17;:28;:::i;:::-;690:44;;480:261;747:13;:22;;;;;;;;;;;;:38;;-1:-1:-1;;747:38:101;-1:-1:-1;;;;;747:38:101;;;;;;;;797:42;;7898:50:375;;;747:22:101;;797:42;;7871:18:375;797:42:101;;;;;;;327:517;;;256:588;;:::o;2773:282:187:-;-1:-1:-1;;;;;2843:22:187;;2839:63;;2874:28;;-1:-1:-1;;;2874:28:187;;;;;;;;;;;2839:63;2919:27;:25;:27::i;:::-;:32;;;;:87;;;2979:27;:25;:27::i;:::-;2961:14;:12;:14::i;:::-;:45;;2919:87;2908:142;;;3020:30;;-1:-1:-1;;;3020:30:187;;;;;;;;;;;1641:189:169;1703:7;1795:28;;;-1:-1:-1;;;;;;;;;;;1795:28:169;;;;;;;:30;;;1703:7;1795:30;;;:::i;:::-;;;;-1:-1:-1;1788:37:169;1641:189;-1:-1:-1;;;1641:189:169:o;274:194::-;353:35;423:33;;;:18;:33;;;;;-1:-1:-1;;;;;;;;;;;296:66:170;423:40:169;459:4;423:33;:40;:::i;691:315::-;771:5;780:1;771:10;767:49;;790:26;;-1:-1:-1;;;790:26:169;;;;;;;;;;;767:49;839:5;826:9;:18;822:57;;853:26;;-1:-1:-1;;;853:26:169;;;;;;;;;;;822:57;886:35;956:36;;;-1:-1:-1;;;;;;;;;;;956:36:169;;;;;:45;;-1:-1:-1;;;;;;;;;;;296:66:170;996:5:169;;956:36;:45;;996:5;;956:45;:::i;:::-;;;;-1:-1:-1;;;;;691:315:169:o;2762:1424:206:-;2852:13;2873:24;2900:13;:11;:13::i;:::-;2939:14;;2873:40;;-1:-1:-1;2919:17:206;2939:14;-1:-1:-1;;;;;2993:24:206;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2993:24:206;-1:-1:-1;3077:28:206;;;;;;2959:58;;-1:-1:-1;3023:13:206;;;3186:341;3210:9;3206:1;:13;3186:341;;;3239:27;3272:20;3281:7;3289:1;3281:10;;;;;;;;:::i;:::-;;;;;;;3272:8;:20::i;:::-;3234:58;;;;;3305:9;3300:221;3324:11;:18;3320:1;:22;3300:221;;;3399:19;3379:11;3391:1;3379:14;;;;;;;;:::i;:::-;;;;;;;3363:32;;;;;;:55;3359:154;;3456:7;3464:1;3456:10;;;;;;;;:::i;:::-;;;;;;;3432:14;3447:5;3432:21;;;;;;;;:::i;:::-;;;;;;;;;;:34;3478:7;;;;:::i;:::-;;;;3497:5;;3359:154;3344:3;;3300:221;;;-1:-1:-1;;3221:3:206;;3186:341;;;;3592:33;3639:5;-1:-1:-1;;;;;3628:17:206;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3628:17:206;;;;;;;;;;;;;;;;;3592:53;;3711:9;3706:443;3730:5;3726:1;:9;3706:443;;;3750:14;3767;3782:1;3767:17;;;;;;;;:::i;:::-;;;;;;;3750:34;;3802:18;3830:16;3856:27;3893:34;3938:16;3947:6;3938:8;:16::i;:::-;3792:162;;;;;;;;3987:155;;;;;;;;4006:6;3987:155;;;;4028:4;3987:155;;;;4052:11;3987:155;;;;;;4086:11;3987:155;;;;4121:12;3987:155;;;3962:19;3982:1;3962:22;;;;;;;;:::i;:::-;;;;;;:180;;;;3742:407;;;;;3737:3;;;;;;;3706:443;;;-1:-1:-1;4162:19:206;2762:1424;-1:-1:-1;;;;;;;2762:1424:206:o;5318:1194:187:-;5378:14;5394:16;5432:31;5449:13;5432:16;:31::i;:::-;5414:81;;;;;;;;;;;;:::i;:::-;5377:118;;;;5547:23;5573:35;5593:14;:12;:14::i;5573:35::-;5547:61;;5614:15;5632:14;:12;:14::i;:::-;5614:32;-1:-1:-1;5657:19:187;;5653:656;;5686:17;1403:36:169;;;-1:-1:-1;;;;;;;;;;;1403:36:169;;;;;;;5751:14:187;;;5747:60;;5774:33;;-1:-1:-1;;;5774:33:187;;;;;;;;;;;5747:60;5837:9;5819:15;:27;5815:73;;;5855:33;;-1:-1:-1;;;5855:33:187;;;;;;;;;;;5815:73;5934:52;5961:7;5970:15;5934:26;:52::i;:::-;5994:19;6016:44;6036:6;6044:15;6016:19;:44::i;:::-;5994:66;-1:-1:-1;6069:15:187;6087:29;5994:66;6087:15;:29;:::i;:::-;6069:47;-1:-1:-1;6128:11:187;;6124:45;;6141:28;6153:6;6161:7;6141:11;:28::i;:::-;;6124:45;6210:53;6232:13;6247:15;6210:21;:53::i;:::-;6271:31;6284:13;6271:31;;;;;;;;;;;;:12;:31::i;:::-;5678:631;;;5653:656;6338:22;6348:8;6358:1;6338:9;:22::i;:::-;6403:53;6422:7;6431:24;:22;:24::i;6403:53::-;6467:40;;6499:7;;-1:-1:-1;;;;;6467:40:187;;;;;;;;5371:1141;;;;5318:1194;:::o;1449:1318:178:-;1583:41;1707:30;;;-1:-1:-1;;;;;;;;;;;1707:30:178;;;;;1748:21;;-1:-1:-1;;;;;;;;;;;469:66:179;1707:30:178;1748:21;;:29;;1707:15;1748:29;1744:244;;1792:9;1787:195;1811:19;;;:26;1807:30;;1787:195;;;1884:6;1858:11;:19;;1878:1;1858:22;;;;;;;;:::i;:::-;;;;;;;;;:32;1854:120;;1911:52;;-1:-1:-1;;;1911:52:178;;;;;;;;;;;1854:120;1839:3;;1787:195;;;;1744:244;2065:21;;-1:-1:-1;;;;;2065:21:178;2053:97;;2111:32;:30;:32::i;:::-;2189:21;;:39;;-1:-1:-1;;;2189:39:178;;2226:1;2189:39;;;2501:25:375;2156:30:178;;-1:-1:-1;;;;;2189:21:178;;:36;;2474:18:375;;2189:39:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2189:39:178;;;;;;;;;;;;:::i;:::-;2240:21;;2156:72;;-1:-1:-1;2240:21:178;;2235:162;;2271:28;;2307:23;;;:37;;-1:-1:-1;;;;;;2307:37:178;-1:-1:-1;;;;;2307:37:178;;;;;-1:-1:-1;;;;;;2352:38:178;2271:28;2380:10;2352:38;;-1:-1:-1;2352:38:178;;;2235:162;2403:19;;;:32;;;;;;;-1:-1:-1;2403:32:178;;;;;;;;;;2442:189;2466:13;:20;2462:1;:24;2442:189;;;2501:11;:26;;:34;2528:6;2501:34;;;;;;;;;;;2550:66;;;;;;;;2566:13;2580:1;2566:16;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;2550:66:178;;;;;2590:24;2550:66;;;;;;;;:::i;:::-;;;2501:123;;;;;;;-1:-1:-1;2501:123:178;;;;;;;;;;;;;;-1:-1:-1;;;;;;2501:123:178;;-1:-1:-1;;;;;2501:123:178;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2501:123:178;;-1:-1:-1;;;2501:123:178;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;2488:3:178;;2442:189;;;-1:-1:-1;2637:21:178;;:125;;-1:-1:-1;;;2637:125:178;;-1:-1:-1;;;;;2637:21:178;;;;:45;;:125;;2690:10;;2708:13;;2729:6;;2743:13;;2637:125;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5124:575;5220:32;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;5220:32:178;5260:41;5384:30;;;-1:-1:-1;;;;;;;;;;;5384:30:178;;;;;5425:21;;-1:-1:-1;;;;;;;;;;;469:66:179;5425:21:178;;;;:30;;;;5421:101;;5472:43;;-1:-1:-1;;;5472:43:178;;;;;;;;;;;5421:101;5575:23;;;;5650:22;;-1:-1:-1;;;5650:22:178;;;;;2501:25:375;;;-1:-1:-1;;;;;5575:23:178;;;;5528:19;;5575:23;;5650:14;;2474:18:375;;5650:22:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5650:22:178;;;;;;;;;;;;:::i;:::-;5606:66;5124:575;-1:-1:-1;;;;;;;5124:575:178:o;7676:237:186:-;7858:11;7847:8;:22;7843:65;;;7878:30;;-1:-1:-1;;;7878:30:186;;;;;;;;;;;14714:674:105;14877:139;;-1:-1:-1;;;14877:139:105;;14855:4;;-1:-1:-1;;;;;14877:56:105;;;;;:139;;29371:10;;14972:4;;14986:7;;15003:5;;14877:139;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14877:139:105;;;;;;;;-1:-1:-1;;14877:139:105;;;;;;;;;;;;:::i;:::-;;;14867:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15199:6;:13;15216:1;15199:18;15195:183;;15236:40;;-1:-1:-1;;;15236:40:105;;;;;;;;;;;15195:183;15352:6;15346:13;15337:6;15333:2;15329:15;15322:38;14867:517;-1:-1:-1;;;;;;15068:83:105;-1:-1:-1;;;15068:83:105;;-1:-1:-1;14714:674:105;;;;;;:::o;11071:301::-;11136:4;11207:23;:21;:23::i;:::-;:37;11197:47;;11161:187;;;;;-1:-1:-1;;;11275:23:105;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;;:68;:73;11148:200;11071:301;-1:-1:-1;;11071:301:105:o;29475:1574::-;29548:17;29942:4;29935;29929:11;29925:22;30020:1;30014:4;30007:15;30081:4;30078:1;30074:12;30067:19;;;30149:1;30144:3;30137:14;30238:3;30448:5;30430:419;30495:1;30490:3;30486:11;30479:18;;30663:2;30657:4;30653:13;30649:2;30645:22;30640:3;30632:36;30755:2;30745:13;;30810:25;30430:419;30810:25;-1:-1:-1;30871:13:105;;;-1:-1:-1;;30972:14:105;;;31020:19;;;30972:14;29475:1574;-1:-1:-1;29475:1574:105:o;4042:119::-;4097:7;4119:23;:21;:23::i;:::-;:37;;4042:119;-1:-1:-1;4042:119:105:o;5868:173:186:-;6027:9;5967:26;:24;:26::i;:::-;:57;;;;:48;;:57;;;;;;:69;;;;-1:-1:-1;5868:173:186:o;2776:601:195:-;2892:7;3022:30;;;380:66:197;3022:30:195;;;;;;;;;;3063:16;;;3059:30;;3088:1;3081:8;;;;;;3059:30;3096:24;3123:34;;;:20;;;;:34;;;;;;;;;3096:61;;;;;;;;;;;;;;;;;;;;3175:23;;;;:117;;-1:-1:-1;3227:18:195;;3209:15;:36;;:82;;;3275:8;:16;;;3257:15;:34;3209:82;3164:143;;;3306:1;3299:8;;;;;;;3164:143;3321:51;3343:15;3360:11;3321:51;;:21;:51::i;:::-;3314:58;2776:601;-1:-1:-1;;;;;;2776:601:195:o;21756:104:105:-;21828:27;21838:2;21842:8;21828:27;;;;;;;;;;;;:9;:27::i;4032:279:186:-;-1:-1:-1;;;;;4109:27:186;;4105:74;;4145:34;;-1:-1:-1;;;4145:34:186;;;;;;;;;;;4105:74;4207:18;:16;:18::i;:::-;4191:66;;-1:-1:-1;;;4191:66:186;;-1:-1:-1;;;;;1119:32:375;;;4191:66:186;;;1101:51:375;4191::186;;;;;;;1074:18:375;;4191:66:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4186:120;;4272:34;;-1:-1:-1;;;4272:34:186;;;;;;;;;;;22321:186:105;22424:4;22443:23;:21;:23::i;:::-;-1:-1:-1;;;;;22443:49:105;;;;;;;:42;;;;;:49;;;;;;;;:59;;;;;;;;;;-1:-1:-1;22443:59:105;;;;;22321:186::o;13270:750:187:-;13429:21;13419:6;:31;;;;;;;;:::i;:::-;;13415:601;;13460:26;13472:13;13460:11;:26::i;13415:601::-;13508:14;13524:16;13564:31;13581:13;13564:16;:31::i;:::-;13544:87;;;;;;;;;;;;:::i;:::-;13507:124;;;;13640:31;13653:13;13640:31;;;;;;;;;;;;:12;:31::i;:::-;13680:13;1403:36:169;;;-1:-1:-1;;;;;;;;;;;1403:36:169;;;;;;13741:9:187;;13737:226;;13762:43;13784:13;13799:5;13762:21;:43::i;:::-;13815:139;13860:24;:22;:24::i;:::-;13904:4;13921:6;13939:5;13815:33;:139::i;:::-;13976:33;;-1:-1:-1;;;;;13976:33:187;;;;;;;;13499:517;;;13270:750;;:::o;4686:434:178:-;4752:41;4876:30;;;-1:-1:-1;;;;;;;;;;;4876:30:178;;;;;-1:-1:-1;;;;;;;;;;;469:66:179;4912:129:178;4936:19;;;:26;4932:30;;4912:129;;;4984:11;:26;;:50;5011:11;:19;;5031:1;5011:22;;;;;;;;:::i;:::-;;;;;;;;;4984:50;;;;;;;;;;;;4977:57;;;;:::i;:::-;4964:3;;4912:129;;;-1:-1:-1;5046:26:178;5053:19;;;;5046:26;:::i;:::-;5085:30;;;;:15;;;:30;;;;;5078:37;;-1:-1:-1;;;;;;5078:37:178;;;;;;;;-1:-1:-1;;;;;;5078:37:178;;;5085:30;5078:37;;;;5085:30;5078:37;:::i;2560:247:105:-;2657:32;2692:23;:21;:23::i;:::-;2657:58;-1:-1:-1;2722:8:105;;;:15;2733:4;2722:8;:15;:::i;:::-;-1:-1:-1;2743:10:105;;;:19;2756:6;2743:10;:19;:::i;:::-;-1:-1:-1;3948:7:105;2768:34;;-1:-1:-1;;2560:247:105:o;2561:178:226:-;2637:12;2655:2;-1:-1:-1;;;;;2655:7:226;2670:5;2655:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2636:44;;;2694:7;2686:48;;;;-1:-1:-1;;;2686:48:226;;31920:2:375;2686:48:226;;;31902:21:375;31959:2;31939:18;;;31932:30;31998;31978:18;;;31971:58;32046:18;;2686:48:226;31718:352:375;2187:315:226;2318:2;-1:-1:-1;;;;;2310:10:226;:4;-1:-1:-1;;;;;2310:10:226;;2306:37;2330:7;2306:37;2369:4;-1:-1:-1;;;;;2353:21:226;;;2349:149;;2384:38;-1:-1:-1;;;;;2384:26:226;;2411:2;2415:6;2384:26;:38::i;2349:149::-;2443:48;-1:-1:-1;;;;;2443:30:226;;2474:4;2480:2;2484:6;2443:30;:48::i;368:224:225:-;459:7;123:6;482:11;:22;;474:68;;;;-1:-1:-1;;;474:68:225;;32277:2:375;474:68:225;;;32259:21:375;32316:2;32296:18;;;32289:30;32355:34;32335:18;;;32328:62;-1:-1:-1;;;32406:18:375;;;32399:31;32447:19;;474:68:225;32075:397:375;474:68:225;123:6;556:20;565:11;556:6;:20;:::i;:::-;555:32;;;;:::i;9970:126:206:-;10016:24;10055:36;:27;:34;:36::i;9493:473::-;9603:16;9718:38;;;-1:-1:-1;;;;;;;;;;;9718:38:206;;;;;9711:50;;9577:18;;9603:16;9577:18;;;;9718:38;9711:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9781:21;434:66:207;;764:141;9781:21:206;:38;;;;:30;;;;;:38;;;;;;;;:50;;;-1:-1:-1;;;;;;;;;;;9851:38:206;;;;;;9781:50;;;;;-1:-1:-1;9851:59:206;;:50;;:57;:59::i;:::-;9837:73;;9931:30;9954:6;9931:22;:30::i;:::-;9916:45;;9493:473;;;;;:::o;472:215:169:-;572:35;649:33;;;:18;:33;;;;;642:40;;552:12;;-1:-1:-1;;;;;;;;;;;296:66:170;642:40:169;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;472:215;;;:::o;1010:216::-;1106:35;1176:36;;;-1:-1:-1;;;;;;;;;;;1176:36:169;;;;;:45;;-1:-1:-1;;;;;;;;;;;296:66:170;1216:5:169;;1176:36;:45;;1216:5;;1176:45;:::i;5891:366:178:-;-1:-1:-1;;;;;;;;;;;5948:41:178;6097:26;:24;:26::i;:::-;:39;;;6066:117;;-1:-1:-1;;;6066:117:178;;-1:-1:-1;;;6066:117:178;;;32859:34:375;-1:-1:-1;;;;;6097:39:178;;;;6066:100;;32832:18:375;;6066:117:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6189:63;;-1:-1:-1;;;;;;6189:63:178;-1:-1:-1;;;;;6189:63:178;;;;;;;;-1:-1:-1;5891:366:178:o;21088:597:105:-;21196:19;21202:2;21206:8;21196:5;:19::i;:::-;-1:-1:-1;;;;;21244:14:105;;;:19;21240:435;;21275:11;21289:23;:21;:23::i;:::-;:37;;-1:-1:-1;21352:14:105;;;21376:189;21396:62;21435:1;21439:2;21443:7;;;;;;21452:5;21396:30;:62::i;:::-;21391:143;;21481:40;;-1:-1:-1;;;21481:40:105;;;;;;;;;;;21391:143;21560:3;21552:5;:11;21376:189;;21653:3;21612:23;:21;:23::i;:::-;:37;:44;21608:58;;21658:8;;;1303:160:307;1412:43;;-1:-1:-1;;;;;33096:32:375;;;1412:43:307;;;33078:51:375;33145:18;;;33138:34;;;1385:71:307;;1405:5;;1427:14;;;;;33051:18:375;;1412:43:307;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1412:43:307;;;;;;;;;;;1385:19;:71::i;1702:188::-;1829:53;;-1:-1:-1;;;;;33441:15:375;;;1829:53:307;;;33423:34:375;33493:15;;;33473:18;;;33466:43;33525:18;;;33518:34;;;1802:81:307;;1822:5;;1844:18;;;;;33358::375;;1829:53:307;33183:375:375;12671:297:327;12731:16;12759:22;12784:19;12792:3;12784:7;:19::i;5598:103:221:-;5654:15;5684:12;5692:3;5684:7;:12::i;10100:599:206:-;10208:39;10276:38;;;-1:-1:-1;;;;;;;;;;;10276:38:206;;;;;10179:21;;10208:39;10276:60;;:51;;:58;:60::i;:::-;-1:-1:-1;;;;;10250:92:206;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10250:92:206;;10208:134;;10361:9;10349:315;10386:38;;;;-1:-1:-1;;;;;;;;;;;10386:38:206;;;;;:60;;:51;;:58;:60::i;:::-;10382:1;:64;10349:315;;;10472:26;10501:56;;;-1:-1:-1;;;;;;;;;;;10501:56:206;;;;;:93;;:78;;10592:1;10501:90;:93::i;:::-;10472:122;;10638:18;10602:17;10620:1;10602:20;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10602:55:206;;;:20;;;;;;;;;;;:55;-1:-1:-1;10454:3:206;;10349:315;;;-1:-1:-1;10677:17:206;10100:599;-1:-1:-1;;10100:599:206:o;15806:2642:105:-;15874:20;15897:23;:21;:23::i;:::-;:37;;-1:-1:-1;15897:37:105;15944:13;;;15940:44;;15966:18;;-1:-1:-1;;;15966:18:105;;;;;;;;;;;15940:44;16481:32;16461:53;;16403:23;:21;:23::i;:::-;-1:-1:-1;;;;;16403:46:105;;;;;;:42;;;;;:46;;;;;;:111;;;;;;;;;10236:11;10211:23;10207:41;-1:-1:-1;10631:15:105;;10605:24;10601:46;10204:52;10194:63;16714:23;:21;:23::i;:::-;:71;;;;:41;;;;;:71;;;;;:188;;;;-1:-1:-1;;;;;17423:25:105;;;16949:23;;;;16765:12;;17423:25;;17609;16714:71;;17495:260;18033:1;18019:12;18015:20;17984:275;18065:3;18056:7;18053:16;17984:275;;18241:7;18231:8;18228:1;18201:25;18198:1;18195;18190:59;18107:1;18094:15;17984:275;;;17988:57;18278:8;18290:1;18278:13;18274:45;;18300:19;;-1:-1:-1;;;18300:19:105;;;;;;;;;;;18274:45;18368:3;18328:23;:21;:23::i;:::-;:43;-1:-1:-1;18383:60:105;;-1:-1:-1;8396:348:104;4059:629:307;4478:23;4504:33;-1:-1:-1;;;;;4504:27:307;;4532:4;4504:27;:33::i;:::-;4478:59;;4551:10;:17;4572:1;4551:22;;:57;;;;;4589:10;4578:30;;;;;;;;;;;;:::i;:::-;4577:31;4551:57;4547:135;;;4631:40;;-1:-1:-1;;;4631:40:307;;-1:-1:-1;;;;;1119:32:375;;4631:40:307;;;1101:51:375;1074:18;;4631:40:307;955:203:375;5581:109:327;5637:16;5672:3;:11;;5665:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5581:109;;;:::o;3604:102:221:-;3660:15;3690:3;:11;;3683:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3604:102;;;:::o;9117:115:327:-;9180:7;9206:19;9214:3;4556:18;;4474:107;9574:156;9648:7;9698:22;9702:3;9714:5;9698:3;:22::i;2705:151:312:-;2780:12;2811:38;2833:6;2841:4;2847:1;2811:21;:38::i;4923:118:327:-;4990:7;5016:3;:11;;5028:5;5016:18;;;;;;;;:::i;:::-;;;;;;;;;5009:25;;4923:118;;;;:::o;3180:392:312:-;3279:12;3331:5;3307:21;:29;3303:108;;;3359:41;;-1:-1:-1;;;3359:41:312;;3394:4;3359:41;;;1101:51:375;1074:18;;3359:41:312;955:203:375;3303:108:312;3421:12;3435:23;3462:6;-1:-1:-1;;;;;3462:11:312;3481:5;3488:4;3462:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3420:73;;;;3510:55;3537:6;3545:7;3554:10;4769:12;4798:7;4793:408;;4821:19;4829:10;4821:7;:19::i;:::-;4793:408;;;5045:17;;:22;:49;;;;-1:-1:-1;;;;;;5071:18:312;;;:23;5045:49;5041:119;;;5121:24;;-1:-1:-1;;;5121:24:312;;-1:-1:-1;;;;;1119:32:375;;5121:24:312;;;1101:51:375;1074:18;;5121:24:312;955:203:375;5041:119:312;-1:-1:-1;5180:10:312;5173:17;;5743:516;5874:17;;:21;5870:383;;6102:10;6096:17;6158:15;6145:10;6141:2;6137:19;6130:44;5870:383;6225:17;;-1:-1:-1;;;6225:17:312;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:250:375;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:375;238:16;;231:27;14:250::o;269:271::-;311:3;349:5;343:12;376:6;371:3;364:19;392:76;461:6;454:4;449:3;445:14;438:4;431:5;427:16;392:76;:::i;:::-;522:2;501:15;-1:-1:-1;;497:29:375;488:39;;;;529:4;484:50;;269:271;-1:-1:-1;;269:271:375:o;545:220::-;694:2;683:9;676:21;657:4;714:45;755:2;744:9;740:18;732:6;714:45;:::i;770:180::-;829:6;882:2;870:9;861:7;857:23;853:32;850:52;;;898:1;895;888:12;850:52;-1:-1:-1;921:23:375;;770:180;-1:-1:-1;770:180:375:o;1163:131::-;-1:-1:-1;;;;;1238:31:375;;1228:42;;1218:70;;1284:1;1281;1274:12;1299:134;1367:20;;1396:31;1367:20;1396:31;:::i;:::-;1299:134;;;:::o;1438:315::-;1506:6;1514;1567:2;1555:9;1546:7;1542:23;1538:32;1535:52;;;1583:1;1580;1573:12;1535:52;1622:9;1609:23;1641:31;1666:5;1641:31;:::i;:::-;1691:5;1743:2;1728:18;;;;1715:32;;-1:-1:-1;;;1438:315:375:o;1758:592::-;1829:6;1837;1890:2;1878:9;1869:7;1865:23;1861:32;1858:52;;;1906:1;1903;1896:12;1858:52;1946:9;1933:23;-1:-1:-1;;;;;2016:2:375;2008:6;2005:14;2002:34;;;2032:1;2029;2022:12;2002:34;2070:6;2059:9;2055:22;2045:32;;2115:7;2108:4;2104:2;2100:13;2096:27;2086:55;;2137:1;2134;2127:12;2086:55;2177:2;2164:16;2203:2;2195:6;2192:14;2189:34;;;2219:1;2216;2209:12;2189:34;2264:7;2259:2;2250:6;2246:2;2242:15;2238:24;2235:37;2232:57;;;2285:1;2282;2275:12;2232:57;2316:2;2308:11;;;;;2338:6;;-1:-1:-1;1758:592:375;;-1:-1:-1;;;;1758:592:375:o;2537:456::-;2614:6;2622;2630;2683:2;2671:9;2662:7;2658:23;2654:32;2651:52;;;2699:1;2696;2689:12;2651:52;2738:9;2725:23;2757:31;2782:5;2757:31;:::i;:::-;2807:5;-1:-1:-1;2864:2:375;2849:18;;2836:32;2877:33;2836:32;2877:33;:::i;:::-;2537:456;;2929:7;;-1:-1:-1;;;2983:2:375;2968:18;;;;2955:32;;2537:456::o;2998:113::-;3085:1;3078:5;3075:12;3065:40;;3101:1;3098;3091:12;3116:415;3213:6;3221;3229;3282:2;3270:9;3261:7;3257:23;3253:32;3250:52;;;3298:1;3295;3288:12;3250:52;3334:9;3321:23;3311:33;;3391:2;3380:9;3376:18;3363:32;3353:42;;3445:2;3434:9;3430:18;3417:32;3458:43;3495:5;3458:43;:::i;:::-;3520:5;3510:15;;;3116:415;;;;;:::o;3536:127::-;3597:10;3592:3;3588:20;3585:1;3578:31;3628:4;3625:1;3618:15;3652:4;3649:1;3642:15;3668:255;3740:2;3734:9;3782:6;3770:19;;-1:-1:-1;;;;;3804:34:375;;3840:22;;;3801:62;3798:88;;;3866:18;;:::i;:::-;3902:2;3895:22;3668:255;:::o;3928:253::-;4000:2;3994:9;4042:4;4030:17;;-1:-1:-1;;;;;4062:34:375;;4098:22;;;4059:62;4056:88;;;4124:18;;:::i;4186:253::-;4258:2;4252:9;4300:4;4288:17;;-1:-1:-1;;;;;4320:34:375;;4356:22;;;4317:62;4314:88;;;4382:18;;:::i;4444:257::-;4516:4;4510:11;;;4548:17;;-1:-1:-1;;;;;4580:34:375;;4616:22;;;4577:62;4574:88;;;4642:18;;:::i;4706:275::-;4777:2;4771:9;4842:2;4823:13;;-1:-1:-1;;4819:27:375;4807:40;;-1:-1:-1;;;;;4862:34:375;;4898:22;;;4859:62;4856:88;;;4924:18;;:::i;:::-;4960:2;4953:22;4706:275;;-1:-1:-1;4706:275:375:o;4986:407::-;5051:5;-1:-1:-1;;;;;5077:6:375;5074:30;5071:56;;;5107:18;;:::i;:::-;5145:57;5190:2;5169:15;;-1:-1:-1;;5165:29:375;5196:4;5161:40;5145:57;:::i;:::-;5136:66;;5225:6;5218:5;5211:21;5265:3;5256:6;5251:3;5247:16;5244:25;5241:45;;;5282:1;5279;5272:12;5241:45;5331:6;5326:3;5319:4;5312:5;5308:16;5295:43;5385:1;5378:4;5369:6;5362:5;5358:18;5354:29;5347:40;4986:407;;;;;:::o;5398:222::-;5441:5;5494:3;5487:4;5479:6;5475:17;5471:27;5461:55;;5512:1;5509;5502:12;5461:55;5534:80;5610:3;5601:6;5588:20;5581:4;5573:6;5569:17;5534:80;:::i;5625:129::-;-1:-1:-1;;;;;5703:5:375;5699:30;5692:5;5689:41;5679:69;;5744:1;5741;5734:12;5759:132;5826:20;;5855:30;5826:20;5855:30;:::i;5896:1321::-;5993:6;6001;6054:2;6042:9;6033:7;6029:23;6025:32;6022:52;;;6070:1;6067;6060:12;6022:52;6110:9;6097:23;-1:-1:-1;;;;;6180:2:375;6172:6;6169:14;6166:34;;;6196:1;6193;6186:12;6166:34;6219:22;;;;6275:6;6257:16;;;6253:29;6250:49;;;6295:1;6292;6285:12;6250:49;6321:22;;:::i;:::-;6381:2;6368:16;6409:2;6399:8;6396:16;6393:36;;;6425:1;6422;6415:12;6393:36;6452:45;6489:7;6478:8;6474:2;6470:17;6452:45;:::i;:::-;6445:5;6438:60;;6544:2;6540;6536:11;6523:25;6573:2;6563:8;6560:16;6557:36;;;6589:1;6586;6579:12;6557:36;6625:45;6662:7;6651:8;6647:2;6643:17;6625:45;:::i;:::-;6620:2;6613:5;6609:14;6602:69;;6724:2;6720;6716:11;6703:25;6698:2;6691:5;6687:14;6680:49;6782:2;6778;6774:11;6761:25;6756:2;6749:5;6745:14;6738:49;6820:31;6846:3;6842:2;6838:12;6820:31;:::i;:::-;6814:3;6807:5;6803:15;6796:56;6885:32;6912:3;6908:2;6904:12;6885:32;:::i;:::-;6879:3;6872:5;6868:15;6861:57;6951:32;6978:3;6974:2;6970:12;6951:32;:::i;:::-;6945:3;6938:5;6934:15;6927:57;7038:3;7034:2;7030:12;7017:26;7011:3;7004:5;7000:15;6993:51;7063:3;7053:13;;7098:31;7125:2;7121;7117:11;7098:31;:::i;:::-;7093:2;7086:5;7082:14;7075:55;7149:5;7139:15;;;;;7173:38;7207:2;7196:9;7192:18;7173:38;:::i;:::-;7163:48;;5896:1321;;;;;:::o;7222:247::-;7281:6;7334:2;7322:9;7313:7;7309:23;7305:32;7302:52;;;7350:1;7347;7340:12;7302:52;7389:9;7376:23;7408:31;7433:5;7408:31;:::i;7959:248::-;8027:6;8035;8088:2;8076:9;8067:7;8063:23;8059:32;8056:52;;;8104:1;8101;8094:12;8056:52;-1:-1:-1;;8127:23:375;;;8197:2;8182:18;;;8169:32;;-1:-1:-1;7959:248:375:o;8212:127::-;8273:10;8268:3;8264:20;8261:1;8254:31;8304:4;8301:1;8294:15;8328:4;8325:1;8318:15;8344:126;8438:1;8431:5;8428:12;8418:46;;8444:18;;:::i;8475:807::-;8542:3;8580:5;8574:12;8607:6;8602:3;8595:19;8633:4;8662;8657:3;8653:14;8646:21;;8701:4;8694:5;8690:16;8724:1;8734:523;8748:6;8745:1;8742:13;8734:523;;;8813:6;8807:13;8849:2;8843:9;8882:1;8878:2;8875:9;8865:43;;8888:18;;:::i;:::-;8921:15;;8976:11;;;8970:18;8956:12;;;8949:40;9012:4;9060:11;;;9054:18;-1:-1:-1;;;;;9050:44:375;9036:12;;;9029:66;9118:4;9162:11;;;9156:18;9142:12;;;9135:40;9204:4;9195:14;;;;9232:15;;;;9091:1;8763:9;8734:523;;;-1:-1:-1;9273:3:375;;8475:807;-1:-1:-1;;;;;8475:807:375:o;9287:797::-;9356:3;9394:5;9388:12;9421:6;9416:3;9409:19;9447:4;9476;9471:3;9467:14;9460:21;;9515:4;9508:5;9504:16;9538:1;9548:511;9562:6;9559:1;9556:13;9548:511;;;9627:6;9621:13;9663:2;9657:9;9679:47;9723:2;9679:47;:::i;:::-;9739:15;;9793:11;;;9787:18;9828:4;9866:21;;;9852:12;;;9845:43;9911:4;9959:11;;;9953:18;9949:27;9935:12;;;9928:49;10006:4;9997:14;;;;10034:15;;;;9584:1;9577:9;9548:511;;10089:1338;10264:2;10275:21;;;10367:13;;10416:4;10396:18;;;10389:32;10470:19;;10334:3;10319:19;;10498:22;;;10235:4;;10264:2;10578:21;;;10235:4;;10551:3;10536:19;;;10627:352;10641:6;10638:1;10635:13;10627:352;;;10706:6;10700:13;10742:2;10736:9;10758:47;10802:2;10758:47;:::i;:::-;10818:15;;10877:11;;10871:18;10891:4;10867:29;10853:12;;;10846:51;10954:15;;;;10663:1;10656:9;;;;;10926:4;10917:14;;;;10627:352;;;10631:3;11028:2;11020:6;11016:15;11010:22;10988:44;;11055:2;11051:7;11041:17;;11121:2;11109:9;11104:3;11100:19;11096:28;11089:4;11078:9;11074:20;11067:58;11148:63;11207:3;11191:14;11148:63;:::i;:::-;11134:77;;;;11260:4;11252:6;11248:17;11242:24;11332:2;11320:9;11312:6;11308:22;11304:31;11297:4;11286:9;11282:20;11275:61;11353:68;11414:6;11398:14;11353:68;:::i;11432:118::-;11518:5;11511:13;11504:21;11497:5;11494:32;11484:60;;11540:1;11537;11530:12;11555:382;11620:6;11628;11681:2;11669:9;11660:7;11656:23;11652:32;11649:52;;;11697:1;11694;11687:12;11649:52;11736:9;11723:23;11755:31;11780:5;11755:31;:::i;:::-;11805:5;-1:-1:-1;11862:2:375;11847:18;;11834:32;11875:30;11834:32;11875:30;:::i;:::-;11924:7;11914:17;;;11555:382;;;;;:::o;11942:795::-;12037:6;12045;12053;12061;12114:3;12102:9;12093:7;12089:23;12085:33;12082:53;;;12131:1;12128;12121:12;12082:53;12170:9;12157:23;12189:31;12214:5;12189:31;:::i;:::-;12239:5;-1:-1:-1;12296:2:375;12281:18;;12268:32;12309:33;12268:32;12309:33;:::i;:::-;12361:7;-1:-1:-1;12415:2:375;12400:18;;12387:32;;-1:-1:-1;12470:2:375;12455:18;;12442:32;-1:-1:-1;;;;;12486:30:375;;12483:50;;;12529:1;12526;12519:12;12483:50;12552:22;;12605:4;12597:13;;12593:27;-1:-1:-1;12583:55:375;;12634:1;12631;12624:12;12583:55;12657:74;12723:7;12718:2;12705:16;12700:2;12696;12692:11;12657:74;:::i;:::-;12647:84;;;11942:795;;;;;;;:::o;12742:543::-;12830:6;12838;12891:2;12879:9;12870:7;12866:23;12862:32;12859:52;;;12907:1;12904;12897:12;12859:52;12947:9;12934:23;-1:-1:-1;;;;;13017:2:375;13009:6;13006:14;13003:34;;;13033:1;13030;13023:12;13003:34;13056:50;13098:7;13089:6;13078:9;13074:22;13056:50;:::i;:::-;13046:60;;13159:2;13148:9;13144:18;13131:32;13115:48;;13188:2;13178:8;13175:16;13172:36;;;13204:1;13201;13194:12;13172:36;;13227:52;13271:7;13260:8;13249:9;13245:24;13227:52;:::i;:::-;13217:62;;;12742:543;;;;;:::o;13290:388::-;13358:6;13366;13419:2;13407:9;13398:7;13394:23;13390:32;13387:52;;;13435:1;13432;13425:12;13387:52;13474:9;13461:23;13493:31;13518:5;13493:31;:::i;:::-;13543:5;-1:-1:-1;13600:2:375;13585:18;;13572:32;13613:33;13572:32;13613:33;:::i;13875:380::-;13954:1;13950:12;;;;13997;;;14018:61;;14072:4;14064:6;14060:17;14050:27;;14018:61;14125:2;14117:6;14114:14;14094:18;14091:38;14088:161;;14171:10;14166:3;14162:20;14159:1;14152:31;14206:4;14203:1;14196:15;14234:4;14231:1;14224:15;14260:184;14330:6;14383:2;14371:9;14362:7;14358:23;14354:32;14351:52;;;14399:1;14396;14389:12;14351:52;-1:-1:-1;14422:16:375;;14260:184;-1:-1:-1;14260:184:375:o;14702:127::-;14763:10;14758:3;14754:20;14751:1;14744:31;14794:4;14791:1;14784:15;14818:4;14815:1;14808:15;14834:128;14901:9;;;14922:11;;;14919:37;;;14936:18;;:::i;15575:127::-;15636:10;15631:3;15627:20;15624:1;15617:31;15667:4;15664:1;15657:15;15691:4;15688:1;15681:15;15707:245;15774:6;15827:2;15815:9;15806:7;15802:23;15798:32;15795:52;;;15843:1;15840;15833:12;15795:52;15875:9;15869:16;15894:28;15916:5;15894:28;:::i;15957:289::-;16088:3;16126:6;16120:13;16142:66;16201:6;16196:3;16189:4;16181:6;16177:17;16142:66;:::i;:::-;16224:16;;;;;15957:289;-1:-1:-1;;15957:289:375:o;16251:297::-;16369:12;;16416:4;16405:16;;;16399:23;;16369:12;16434:16;;16431:111;;;-1:-1:-1;;16508:4:375;16504:17;;;;16501:1;16497:25;16493:38;16482:50;;16251:297;-1:-1:-1;16251:297:375:o;16553:465::-;16606:3;16644:5;16638:12;16671:6;16666:3;16659:19;16697:4;16726;16721:3;16717:14;16710:21;;16765:4;16758:5;16754:16;16788:1;16798:195;16812:6;16809:1;16806:13;16798:195;;;16877:13;;-1:-1:-1;;;;;16873:39:375;16861:52;;16933:12;;;;16968:15;;;;16909:1;16827:9;16798:195;;17023:411;17266:6;17255:9;17248:25;17309:2;17304;17293:9;17289:18;17282:30;17229:4;17329:56;17381:2;17370:9;17366:18;17358:6;17329:56;:::i;:::-;17321:64;;17421:6;17416:2;17405:9;17401:18;17394:34;17023:411;;;;;;:::o;17439:496::-;17618:3;17656:6;17650:13;17672:66;17731:6;17726:3;17719:4;17711:6;17707:17;17672:66;:::i;:::-;17801:13;;17760:16;;;;17823:70;17801:13;17760:16;17870:4;17858:17;;17823:70;:::i;:::-;17909:20;;17439:496;-1:-1:-1;;;;17439:496:375:o;17940:251::-;18010:6;18063:2;18051:9;18042:7;18038:23;18034:32;18031:52;;;18079:1;18076;18069:12;18031:52;18111:9;18105:16;18130:31;18155:5;18130:31;:::i;18322:543::-;18424:2;18419:3;18416:11;18413:446;;;18460:1;18484:5;18481:1;18474:16;18528:4;18525:1;18515:18;18598:2;18586:10;18582:19;18579:1;18575:27;18569:4;18565:38;18634:4;18622:10;18619:20;18616:47;;;-1:-1:-1;18657:4:375;18616:47;18712:2;18707:3;18703:12;18700:1;18696:20;18690:4;18686:31;18676:41;;18767:82;18785:2;18778:5;18775:13;18767:82;;;18830:17;;;18811:1;18800:13;18767:82;;19041:1345;19167:3;19161:10;-1:-1:-1;;;;;19186:6:375;19183:30;19180:56;;;19216:18;;:::i;:::-;19245:97;19335:6;19295:38;19327:4;19321:11;19295:38;:::i;:::-;19289:4;19245:97;:::i;:::-;19397:4;;19454:2;19443:14;;19471:1;19466:663;;;;20173:1;20190:6;20187:89;;;-1:-1:-1;20242:19:375;;;20236:26;20187:89;-1:-1:-1;;18998:1:375;18994:11;;;18990:24;18986:29;18976:40;19022:1;19018:11;;;18973:57;20289:81;;19436:944;;19466:663;18269:1;18262:14;;;18306:4;18293:18;;-1:-1:-1;;19502:20:375;;;19620:236;19634:7;19631:1;19628:14;19620:236;;;19723:19;;;19717:26;19702:42;;19815:27;;;;19783:1;19771:14;;;;19650:19;;19620:236;;;19624:3;19884:6;19875:7;19872:19;19869:201;;;19945:19;;;19939:26;-1:-1:-1;;20028:1:375;20024:14;;;20040:3;20020:24;20016:37;20012:42;19997:58;19982:74;;19869:201;-1:-1:-1;;;;;20116:1:375;20100:14;;;20096:22;20083:36;;-1:-1:-1;19041:1345:375:o;20391:135::-;20430:3;20451:17;;;20448:43;;20471:18;;:::i;:::-;-1:-1:-1;20518:1:375;20507:13;;20391:135::o;20531:217::-;20571:1;20597;20587:132;;20641:10;20636:3;20632:20;20629:1;20622:31;20676:4;20673:1;20666:15;20704:4;20701:1;20694:15;20587:132;-1:-1:-1;20733:9:375;;20531:217::o;20753:255::-;20905:2;20890:18;;20917:51;20961:6;20917:51;:::i;:::-;20977:25;;;20753:255;:::o;21013:249::-;21082:6;21135:2;21123:9;21114:7;21110:23;21106:32;21103:52;;;21151:1;21148;21141:12;21103:52;21183:9;21177:16;21202:30;21226:5;21202:30;:::i;21267:276::-;21336:6;21389:2;21377:9;21368:7;21364:23;21360:32;21357:52;;;21405:1;21402;21395:12;21357:52;21437:9;21431:16;21487:6;21480:5;21476:18;21469:5;21466:29;21456:57;;21509:1;21506;21499:12;21548:125;21613:9;;;21634:10;;;21631:36;;;21647:18;;:::i;21678:180::-;-1:-1:-1;;;;;21783:10:375;;;21795;;;21779:27;;21818:11;;;21815:37;;;21832:18;;:::i;23813:401::-;23908:6;23916;23969:2;23957:9;23948:7;23944:23;23940:32;23937:52;;;23985:1;23982;23975:12;23937:52;24017:9;24011:16;24036:31;24061:5;24036:31;:::i;:::-;24136:2;24121:18;;24115:25;24086:5;;-1:-1:-1;24149:33:375;24115:25;24149:33;:::i;24409:183::-;24469:4;-1:-1:-1;;;;;24494:6:375;24491:30;24488:56;;;24524:18;;:::i;:::-;-1:-1:-1;24569:1:375;24565:14;24581:4;24561:25;;24409:183::o;24597:956::-;24692:6;24723:2;24766;24754:9;24745:7;24741:23;24737:32;24734:52;;;24782:1;24779;24772:12;24734:52;24815:9;24809:16;-1:-1:-1;;;;;24840:6:375;24837:30;24834:50;;;24880:1;24877;24870:12;24834:50;24903:22;;24956:4;24948:13;;24944:27;-1:-1:-1;24934:55:375;;24985:1;24982;24975:12;24934:55;25014:2;25008:9;25037:60;25053:43;25093:2;25053:43;:::i;:::-;25037:60;:::i;:::-;25131:15;;;25213:1;25209:10;;;;25201:19;;25197:28;;;25162:12;;;;25237:19;;;25234:39;;;25269:1;25266;25259:12;25234:39;25293:11;;;;25313:210;25329:6;25324:3;25321:15;25313:210;;;25402:3;25396:10;25419:31;25444:5;25419:31;:::i;:::-;25463:18;;25346:12;;;;25501;;;;25313:210;;25558:502;25850:1;25846;25841:3;25837:11;25833:19;25825:6;25821:32;25810:9;25803:51;25890:6;25885:2;25874:9;25870:18;25863:34;25933:6;25928:2;25917:9;25913:18;25906:34;25976:3;25971:2;25960:9;25956:18;25949:31;25784:4;25997:57;26049:3;26038:9;26034:19;26026:6;25997:57;:::i;26065:160::-;26142:13;;26195:4;26184:16;;26174:27;;26164:55;;26215:1;26212;26205:12;26230:1342;26309:5;26362:3;26355:4;26347:6;26343:17;26339:27;26329:55;;26380:1;26377;26370:12;26329:55;26409:6;26403:13;26435:4;26459:60;26475:43;26515:2;26475:43;:::i;26459:60::-;26553:15;;;26639:1;26635:10;;;;26623:23;;26619:32;;;26584:12;;;;26663:15;;;26660:35;;;26691:1;26688;26681:12;26660:35;26727:2;26719:6;26715:15;26739:804;26755:6;26750:3;26747:15;26739:804;;;26833:4;26827:3;26822;26818:13;26814:24;26811:114;;;26879:1;26908:2;26904;26897:14;26811:114;26951:22;;:::i;:::-;27007:3;27001:10;27046:1;27037:7;27034:14;27024:112;;27090:1;27119:2;27115;27108:14;27024:112;27149:22;;27213:12;;;27207:19;27191:14;;;27184:43;27250:2;27286:12;;;27280:19;27312:33;27280:19;27312:33;:::i;:::-;27365:14;;;27358:31;27412:2;27456:12;;;27450:19;27434:14;;;27427:43;27483:18;;27521:12;;;;26781:4;26772:14;26739:804;;;-1:-1:-1;27561:5:375;26230:1342;-1:-1:-1;;;;;;26230:1342:375:o;27577:1181::-;27658:5;27711:3;27704:4;27696:6;27692:17;27688:27;27678:55;;27729:1;27726;27719:12;27678:55;27758:6;27752:13;27784:4;27808:60;27824:43;27864:2;27824:43;:::i;27808:60::-;27902:15;;;27964:4;28007:13;;;27995:26;;27991:35;;;27933:12;;;;27890:3;28038:15;;;28035:35;;;28066:1;28063;28056:12;28035:35;28102:2;28094:6;28090:15;28114:615;28130:6;28125:3;28122:15;28114:615;;;28206:2;28200:3;28195;28191:13;28187:22;28184:112;;;28250:1;28279:2;28275;28268:14;28184:112;28322:22;;:::i;:::-;28378:3;28372:10;28395:45;28432:7;28395:45;:::i;:::-;28453:22;;28511:41;28539:12;;;28511:41;:::i;:::-;28506:2;28499:5;28495:14;28488:65;28576:2;28614:41;28651:2;28646:3;28642:12;28614:41;:::i;:::-;28598:14;;;28591:65;28669:18;;28707:12;;;;28147;;28114:615;;;-1:-1:-1;28747:5:375;;27577:1181;-1:-1:-1;;;;;;;27577:1181:375:o;28763:1951::-;28860:6;28891:2;28934;28922:9;28913:7;28909:23;28905:32;28902:52;;;28950:1;28947;28940:12;28902:52;28983:9;28977:16;-1:-1:-1;;;;;29053:2:375;29045:6;29042:14;29039:34;;;29069:1;29066;29059:12;29039:34;29092:22;;;;29148:4;29130:16;;;29126:27;29123:47;;;29166:1;29163;29156:12;29123:47;29192:22;;:::i;:::-;29245:2;29239:9;29273:2;29263:8;29260:16;29257:36;;;29289:1;29286;29279:12;29257:36;29312:17;;29360:4;29352:13;;29348:27;-1:-1:-1;29338:55:375;;29389:1;29386;29379:12;29338:55;29418:2;29412:9;29441:60;29457:43;29497:2;29457:43;:::i;29441:60::-;29535:15;;;29617:1;29613:10;;;;29605:19;;29601:28;;;29566:12;;;;29641:19;;;29638:39;;;29673:1;29670;29663:12;29638:39;29697:11;;;;29717:528;29733:6;29728:3;29725:15;29717:528;;;29815:4;29809:3;29800:7;29796:17;29792:28;29789:118;;;29861:1;29890:2;29886;29879:14;29789:118;29935:22;;:::i;:::-;29991:3;29985:10;30008:45;30045:7;30008:45;:::i;:::-;30066:24;;30128:41;30156:12;;;30128:41;:::i;:::-;30110:16;;;30103:67;30183:20;;29759:4;29750:14;;;;;30223:12;;;;29717:528;;;30254:20;;-1:-1:-1;;;30305:11:375;;;30299:18;30329:16;;;30326:36;;;30358:1;30355;30348:12;30326:36;30394:81;30467:7;30456:8;30452:2;30448:17;30394:81;:::i;:::-;30389:2;30382:5;30378:14;30371:105;;30515:4;30511:2;30507:13;30501:20;30485:36;;30546:2;30536:8;30533:16;30530:36;;;30562:1;30559;30552:12;30530:36;30600:83;30675:7;30664:8;30660:2;30656:17;30600:83;:::i;:::-;30593:4;30582:16;;30575:109;30586:5;28763:1951;-1:-1:-1;;;;;;28763:1951:375:o;30719:489::-;-1:-1:-1;;;;;30988:15:375;;;30970:34;;31040:15;;31035:2;31020:18;;31013:43;31087:2;31072:18;;31065:34;;;31135:3;31130:2;31115:18;;31108:31;;;30913:4;;31156:46;;31182:19;;31174:6;31156:46;:::i;31213:290::-;31282:6;31335:2;31323:9;31314:7;31310:23;31306:32;31303:52;;;31351:1;31348;31341:12;31303:52;31377:16;;-1:-1:-1;;;;;;31422:32:375;;31412:43;;31402:71;;31469:1;31466;31459:12;32477:168;32550:9;;;32581;;32598:15;;;32592:22;;32578:37;32568:71;;32619:18;;:::i","linkReferences":{}},"methodIdentifiers":{"__ERC721A_init(string,string)":"d2f01f19","__EntitlementGated_init(address)":"7adc9cbe","__Membership_init((string,string,uint256,uint256,uint64,address,address,uint256,address),address)":"4c2abfbe","_getMembershipCurrency()":"70251563","_getMembershipFreeAllocation()":"b3a5be6d","_getMembershipImage()":"d33d9345","_getMembershipPrice(uint256)":"3ded10de","_getMembershipSupplyLimit()":"8934207f","_getPricingModule()":"ac7ee626","_getSpaceFactory()":"77460cd3","_setMembershipFreeAllocation(uint256)":"f9d5d22c","_setMembershipSupplyLimit(uint256)":"73fc5a05","_setPricingModule(address)":"69d9346b","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","expiresAt(uint256)":"17c95709","getApproved(uint256)":"081812fc","getMembershipCurrency()":"657e45e8","getMembershipDuration()":"8120f0ba","getMembershipFreeAllocation()":"706b8e09","getMembershipImage()":"93b13cb7","getMembershipLimit()":"95d600c8","getMembershipPrice()":"1278076a","getMembershipPricingModule()":"e847abdd","getMembershipRenewalPrice(uint256)":"5803909f","getRuleData(bytes32,uint256)":"92c399ff","getSpaceFactory()":"79dda585","isApprovedForAll(address,address)":"e985e9c5","joinSpace(address)":"8c625b06","joinSpaceWithReferral(address,address,uint256)":"c9f7c833","name()":"06fdde03","ownerOf(uint256)":"6352211e","postEntitlementCheckResult(bytes32,uint256,uint8)":"4739e805","renewMembership(uint256)":"7c9669ac","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setMembershipFreeAllocation(uint256)":"5becd24a","setMembershipImage(string)":"0ef1be5f","setMembershipLimit(uint256)":"97fb7c1e","setMembershipPrice(uint256)":"69d5f38a","setMembershipPricingModule(address)":"df9a9fe6","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","totalSupply()":"18160ddd","transferFrom(address,address,uint256)":"23b872dd","withdraw(address)":"51cff8d9"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BalanceQueryForZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__AlreadyBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Banning__CannotBanSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__NotBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Dispatcher__InvalidCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Dispatcher__InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC5643__DurationZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC5643__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC5643__NotApprovedOrOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC5643__SubscriptionNotRenewable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_NodeAlreadyVoted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_NodeNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_TransactionCheckAlreadyCompleted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_TransactionCheckAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_TransactionNotRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__ValueAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__AlreadyMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InsufficientPayment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidCurrency\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidDuration\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidFeeRecipient\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidFreeAllocation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidMaxSupply\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidPrice\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidPricingModule\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidReferralBps\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidReferralCode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidReferralTime\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__MaxSupplyReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__NotExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Membership__PriceTooLow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintERC2309QuantityExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintZeroQuantity\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnershipNotInitializedForExtraData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__Paused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuard__ReentrantCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__EntitlementAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__EntitlementDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__InvalidEntitlementAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__InvalidPermission\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__PermissionAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__PermissionDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__RoleDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFromIncorrectOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC721ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"URIQueryForNonexistentToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"toTokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"ConsecutiveTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"transactionId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enum IEntitlementGatedBase.NodeVoteStatus\",\"name\":\"result\",\"type\":\"uint8\"}],\"name\":\"EntitlementCheckResultPosted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"currency\",\"type\":\"address\"}],\"name\":\"MembershipCurrencyUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"MembershipFeeRecipientUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"allocation\",\"type\":\"uint256\"}],\"name\":\"MembershipFreeAllocationUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"MembershipLimitUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"MembershipPriceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"MembershipTokenIssued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"MembershipTokenRejected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"MembershipWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"code\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"bps\",\"type\":\"uint16\"}],\"name\":\"Membership__ReferralCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"code\",\"type\":\"uint256\"}],\"name\":\"Membership__ReferralRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"code\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"bps\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"Membership__ReferralTimeCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"RoleCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remover\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"RoleRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"updater\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"RoleUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"expiration\",\"type\":\"uint64\"}],\"name\":\"SubscriptionUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Unbanned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"name\":\"__ERC721A_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IEntitlementChecker\",\"name\":\"entitlementChecker\",\"type\":\"address\"}],\"name\":\"__EntitlementGated_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"duration\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"currency\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeRecipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"freeAllocation\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"pricingModule\",\"type\":\"address\"}],\"internalType\":\"struct IMembershipBase.Membership\",\"name\":\"info\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"spaceFactory\",\"type\":\"address\"}],\"name\":\"__Membership_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"_getMembershipCurrency\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"_getMembershipFreeAllocation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"_getMembershipImage\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"}],\"name\":\"_getMembershipPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"_getMembershipSupplyLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"_getPricingModule\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"_getSpaceFactory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newAllocation\",\"type\":\"uint256\"}],\"name\":\"_setMembershipFreeAllocation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"_setMembershipSupplyLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newPricingModule\",\"type\":\"address\"}],\"name\":\"_setPricingModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"expiresAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMembershipCurrency\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMembershipDuration\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMembershipFreeAllocation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMembershipImage\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMembershipLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMembershipPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMembershipPricingModule\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getMembershipRenewalPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"transactionId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getRuleData\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CombinedOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.Operation[]\",\"name\":\"operations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CheckOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"internalType\":\"struct IRuleEntitlement.CheckOperation[]\",\"name\":\"checkOperations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.LogicalOperationType\",\"name\":\"logOpType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"leftOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"rightOperationIndex\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.LogicalOperation[]\",\"name\":\"logicalOperations\",\"type\":\"tuple[]\"}],\"internalType\":\"struct IRuleEntitlement.RuleData\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSpaceFactory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"joinSpace\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"referralCode\",\"type\":\"uint256\"}],\"name\":\"joinSpaceWithReferral\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"transactionId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"internalType\":\"enum IEntitlementGatedBase.NodeVoteStatus\",\"name\":\"result\",\"type\":\"uint8\"}],\"name\":\"postEntitlementCheckResult\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"renewMembership\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newAllocation\",\"type\":\"uint256\"}],\"name\":\"setMembershipFreeAllocation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"newImage\",\"type\":\"string\"}],\"name\":\"setMembershipImage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"setMembershipLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newPrice\",\"type\":\"uint256\"}],\"name\":\"setMembershipPrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"pricingModule\",\"type\":\"address\"}],\"name\":\"setMembershipPricingModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"AddressInsufficientBalance(address)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"FailedInnerCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"ConsecutiveTransfer(uint256,uint256,address,address)\":{\"details\":\"Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, as defined in the [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. See {_mintERC2309} for more details.\"},\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"},\"SubscriptionUpdate(uint256,uint64)\":{\"details\":\"When a subscription is canceled, the expiration value should also be 0.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"__Membership_init((string,string,uint256,uint256,uint64,address,address,uint256,address),address)\":{\"details\":\"Initialization logic when facet is added to diamond\"},\"_getMembershipPrice(uint256)\":{\"details\":\"Makes it virtual to allow other pricing strategies\"},\"approve(address,uint256)\":{\"details\":\"Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator.\"},\"balanceOf(address)\":{\"details\":\"Returns the number of tokens in `owner`'s account.\"},\"expiresAt(uint256)\":{\"params\":{\"tokenId\":\"The token id of the membership\"}},\"getApproved(uint256)\":{\"details\":\"Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist.\"},\"getMembershipCurrency()\":{\"returns\":{\"_0\":\"The membership currency\"}},\"getMembershipDuration()\":{\"returns\":{\"_0\":\"The membership duration\"}},\"getMembershipFreeAllocation()\":{\"returns\":{\"_0\":\"The membership free allocation\"}},\"getMembershipImage()\":{\"returns\":{\"_0\":\"The membership image\"}},\"getMembershipLimit()\":{\"returns\":{\"_0\":\"The membership limit\"}},\"getMembershipPrice()\":{\"returns\":{\"_0\":\"The membership price\"}},\"getMembershipPricingModule()\":{\"returns\":{\"_0\":\"The membership pricing module\"}},\"getMembershipRenewalPrice(uint256)\":{\"params\":{\"tokenId\":\"The token id of the membership\"},\"returns\":{\"_0\":\"The membership renewal price\"}},\"getSpaceFactory()\":{\"returns\":{\"_0\":\"The space factory\"}},\"isApprovedForAll(address,address)\":{\"details\":\"Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}.\"},\"joinSpace(address)\":{\"params\":{\"receiver\":\"The address of the receiver\"}},\"joinSpaceWithReferral(address,address,uint256)\":{\"params\":{\"receiver\":\"The address of the receiver\",\"referralCode\":\"The referral code\",\"referrer\":\"The address of the referrer\"}},\"name()\":{\"details\":\"Returns the token collection name.\"},\"ownerOf(uint256)\":{\"details\":\"Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist.\"},\"renewMembership(uint256)\":{\"params\":{\"tokenId\":\"The token id of the membership\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Equivalent to `safeTransferFrom(from, to, tokenId, '')`.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event.\"},\"setMembershipFreeAllocation(uint256)\":{\"params\":{\"newAllocation\":\"The new membership free allocation\"}},\"setMembershipLimit(uint256)\":{\"params\":{\"newLimit\":\"The new membership limit\"}},\"setMembershipPrice(uint256)\":{\"params\":{\"newPrice\":\"The new membership price\"}},\"setMembershipPricingModule(address)\":{\"params\":{\"pricingModule\":\"The new pricing module\"}},\"symbol()\":{\"details\":\"Returns the token collection symbol.\"},\"tokenURI(uint256)\":{\"details\":\"Returns the Uniform Resource Identifier (URI) for `tokenId` token.\"},\"totalSupply()\":{\"details\":\"Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"errors\":{\"ApprovalCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"ApprovalQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"BalanceQueryForZeroAddress()\":[{\"notice\":\"Cannot query the balance for the zero address.\"}],\"MintERC2309QuantityExceedsLimit()\":[{\"notice\":\"The `quantity` minted with ERC2309 exceeds the safety limit.\"}],\"MintToZeroAddress()\":[{\"notice\":\"Cannot mint to the zero address.\"}],\"MintZeroQuantity()\":[{\"notice\":\"The quantity of tokens minted must be more than zero.\"}],\"OwnerQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"OwnershipNotInitializedForExtraData()\":[{\"notice\":\"The `extraData` cannot be set on an unintialized ownership slot.\"}],\"TransferCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"TransferFromIncorrectOwner()\":[{\"notice\":\"The token must be owned by `from`.\"}],\"TransferToNonERC721ReceiverImplementer()\":[{\"notice\":\"Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"notice\":\"Cannot transfer to the zero address.\"}],\"URIQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}]},\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"},\"SubscriptionUpdate(uint256,uint64)\":{\"notice\":\"Emitted when a subscription expiration changes\"}},\"kind\":\"user\",\"methods\":{\"expiresAt(uint256)\":{\"notice\":\"Return the expiration date of a membership\"},\"getMembershipCurrency()\":{\"notice\":\"Get the membership currency\"},\"getMembershipDuration()\":{\"notice\":\"Get the membership duration\"},\"getMembershipFreeAllocation()\":{\"notice\":\"Get the membership free allocation\"},\"getMembershipImage()\":{\"notice\":\"Get the membership image\"},\"getMembershipLimit()\":{\"notice\":\"Get the membership limit\"},\"getMembershipPrice()\":{\"notice\":\"Get the membership price\"},\"getMembershipPricingModule()\":{\"notice\":\"Get the membership pricing module\"},\"getMembershipRenewalPrice(uint256)\":{\"notice\":\"Get the membership renewal price\"},\"getSpaceFactory()\":{\"notice\":\"Get the space factory\"},\"joinSpace(address)\":{\"notice\":\"Join a space\"},\"joinSpaceWithReferral(address,address,uint256)\":{\"notice\":\"Join a space with a referral\"},\"renewMembership(uint256)\":{\"notice\":\"Renew a space membership\"},\"setMembershipFreeAllocation(uint256)\":{\"notice\":\"Set the membership free allocation\"},\"setMembershipLimit(uint256)\":{\"notice\":\"Set the membership limit\"},\"setMembershipPrice(uint256)\":{\"notice\":\"Set the membership price\"},\"setMembershipPricingModule(address)\":{\"notice\":\"Set the membership pricing module\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/facets/membership/MembershipFacet.sol\":\"MembershipFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/base/registry/facets/checker/IEntitlementChecker.sol\":{\"keccak256\":\"0x5c9a99c94e95a0c89b3d3310e252cd98aeafe34d87ffc0058f9b001af6f28bd1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7983b17a371e76c8681756dc10abe26f8fffd35d3d6d8773c2023f06c8600ba3\",\"dweb:/ipfs/QmSDkTctKCTaMGYF2LZ1N9YWwDTZD75XegpPyLrP694JFf\"]},\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol\":{\"keccak256\":\"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f\",\"dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol\":{\"keccak256\":\"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5\",\"dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol\":{\"keccak256\":\"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc\",\"dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf\"]},\"contracts/src/diamond/facets/pausable/IPausable.sol\":{\"keccak256\":\"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6\",\"dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM\"]},\"contracts/src/diamond/facets/pausable/PausableBase.sol\":{\"keccak256\":\"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c\",\"dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1\"]},\"contracts/src/diamond/facets/pausable/PausableStorage.sol\":{\"keccak256\":\"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b\",\"dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL\"]},\"contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol\":{\"keccak256\":\"0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b\",\"dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq\"]},\"contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol\":{\"keccak256\":\"0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c\",\"dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T\"]},\"contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol\":{\"keccak256\":\"0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6\",\"dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC\"]},\"contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol\":{\"keccak256\":\"0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714\",\"dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8\"]},\"contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol\":{\"keccak256\":\"0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7\",\"dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7\"]},\"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol\":{\"keccak256\":\"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f\",\"dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721A.sol\":{\"keccak256\":\"0xc8fab662d9a0c4e697c8dcaad72dd2a190331b01476649a742b6f317266ac5a1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://9c84047a6d47a901f45f90f12f713432289ae6d88fea95a383900906005cf70b\",\"dweb:/ipfs/QmVdLUVdtjTQn2fCG85Uv2ZAzCSfNbWYcAg5eXthunnigc\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol\":{\"keccak256\":\"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa\",\"dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol\":{\"keccak256\":\"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c\",\"dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu\"]},\"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol\":{\"keccak256\":\"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e\",\"dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM\"]},\"contracts/src/factory/facets/architect/pricing/IPricingModules.sol\":{\"keccak256\":\"0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716\",\"dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU\"]},\"contracts/src/factory/facets/platform/requirements/IPlatformRequirements.sol\":{\"keccak256\":\"0xc0b22b0caa2336e0c3f6b6813432643053785c39531d30e5851eeb613a0a7991\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8a7ceb199e92f484efcc444fffd54fbabaf332c210dda0ef46d89a66f4cb47c7\",\"dweb:/ipfs/QmRJVrZiZpbGsLngz4J3NVgapKXLErdLc7BPyEyTNKdijg\"]},\"contracts/src/factory/facets/prepay/IPrepay.sol\":{\"keccak256\":\"0x0c5c097dd77471d041cdbb84011ac789147af937d275329d857d1a4b257635e9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://baca271a5a66856f3144a4bf0ed6a484b0c981539d6bf0c57ffade9e4986eb49\",\"dweb:/ipfs/QmVgPWMEL5q2J5kmZQZFRadWjuVQeFLaa9K2gCHdhjLUa9\"]},\"contracts/src/factory/facets/registry/IImplementationRegistry.sol\":{\"keccak256\":\"0x2409b9eb86a4dc5849050d06409fd7548ac21f9bf6e7419b91dfb9226db0a3d5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://613195fc78a1a496820c5934f315c586ad33edf7608022d2ae0ea44f52529e61\",\"dweb:/ipfs/QmR8Gn11UNq2rKC5Qp7Prdk61oWhNg3UVc8KeyWCRfrEqV\"]},\"contracts/src/factory/facets/wallet-link/IWalletLink.sol\":{\"keccak256\":\"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13\",\"dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR\"]},\"contracts/src/spaces/entitlements/IEntitlement.sol\":{\"keccak256\":\"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3\",\"dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf\"]},\"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol\":{\"keccak256\":\"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1\",\"dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97\"]},\"contracts/src/spaces/facets/Entitled.sol\":{\"keccak256\":\"0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7\",\"dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc\"]},\"contracts/src/spaces/facets/Permissions.sol\":{\"keccak256\":\"0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721\",\"dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp\"]},\"contracts/src/spaces/facets/banning/BanningBase.sol\":{\"keccak256\":\"0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d\",\"dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN\"]},\"contracts/src/spaces/facets/banning/BanningStorage.sol\":{\"keccak256\":\"0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0\",\"dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1\"]},\"contracts/src/spaces/facets/banning/IBanning.sol\":{\"keccak256\":\"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419\",\"dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6\"]},\"contracts/src/spaces/facets/channels/ChannelService.sol\":{\"keccak256\":\"0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9\",\"dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi\"]},\"contracts/src/spaces/facets/channels/ChannelStorage.sol\":{\"keccak256\":\"0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7\",\"dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS\"]},\"contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol\":{\"keccak256\":\"0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5\",\"dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9\"]},\"contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol\":{\"keccak256\":\"0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07\",\"dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek\"]},\"contracts/src/spaces/facets/dispatcher/DispatcherBase.sol\":{\"keccak256\":\"0x903020fbe095e548604af198fd56798a1cc7ebd875294f247e38b5c2c25b4b27\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4b9778b31d1fb831115edf4502f6b0166dd0dc5c255bd4bf081d58a40effe675\",\"dweb:/ipfs/QmZ8X9YRtXaPVhxmjY9g6dUTKJb2LxxtCYELm1buoe9UEU\"]},\"contracts/src/spaces/facets/dispatcher/DispatcherStorage.sol\":{\"keccak256\":\"0x72ce4a1e04daeb7732b3559ef699a921d20d0056ad73b1a013ccc131957f9a5b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1053eb5b1f78f5ead722e36fc6a33100534f9bdf065bfb511677c3a5bf8e91b6\",\"dweb:/ipfs/QmeKcC2E8ym4nJ7f84HgjojFDcoghDWyZyKNjQ32ca1RXA\"]},\"contracts/src/spaces/facets/dispatcher/IDispatcher.sol\":{\"keccak256\":\"0x9542fdb04a005a1d923bd266f539db381275f2c5de9de06807eca7d043648308\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://64ebd4899ff63689607fa3014987b953b2ec7d2314667eedceabb868cb042c43\",\"dweb:/ipfs/QmdP8qNW5g1rnFK1Czogvp6JDAvUsPoUavxiJbdci6s6zo\"]},\"contracts/src/spaces/facets/entitlements/EntitlementsManagerService.sol\":{\"keccak256\":\"0x6f40f5b41ad702ea55bf10f987b3e2b6d02ac527a66be523f06f025cead1867d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://da2012c616b833c5b491735c230be707e4f9b7657b3a71d7bdf52e7c2ba128b9\",\"dweb:/ipfs/Qme4864V46rozVDRWtfYqtpyzE1SzBnqYQQf3iD2rrqiPg\"]},\"contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol\":{\"keccak256\":\"0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583\",\"dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK\"]},\"contracts/src/spaces/facets/gated/EntitlementGated.sol\":{\"keccak256\":\"0x69b525c004a345b89f3c784df334780a2d399b3f2058183daf65862f2d095820\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e927c722387563b909fd26cbd09cff0b5bc905a3c0c5c00b9c40c4d66bf19e70\",\"dweb:/ipfs/Qmbk5XXjzLaZJSaSSjhpEm2pyB2GSj1cDPChYdJup9wStk\"]},\"contracts/src/spaces/facets/gated/EntitlementGatedBase.sol\":{\"keccak256\":\"0x0aa9887cf58dd68d0270c85e2d7610080f35410b845c2227e4bd84356b7a2cb7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6dbdbed895fc2a53bffa3dbc1cfd4c992a096f153e6bbb7aeb9894485e7fc1a6\",\"dweb:/ipfs/QmZp76Gd8aL9pWbiTvLaiHv1w12yjN59PtYdMvoUCbfbH5\"]},\"contracts/src/spaces/facets/gated/EntitlementGatedStorage.sol\":{\"keccak256\":\"0xe997c0dd62f6ceb300729d3f56a3f25a47b40ed5946d68c5210c38941cb37eaa\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://63fcfd9f667538e8e9339534d2ddc6f7899e4179a54f3c6595e2598babb5bb9c\",\"dweb:/ipfs/QmUfKtfgW1uskEWkhhGqTjcbCqMANQoKKfTgV2ZvdAZpvJ\"]},\"contracts/src/spaces/facets/gated/IEntitlementGated.sol\":{\"keccak256\":\"0x948de1018f7f78366263a40e0f8269e10941216bd03a9996edb24a6230959e74\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://dc985539ce639f39fd68723acca6424a78deac6cec3693c9d8e1084a487c83ec\",\"dweb:/ipfs/QmQujX5rmDwhJZurp11FTiPLb7ev9swLTtdkagA8wydZiT\"]},\"contracts/src/spaces/facets/membership/IMembership.sol\":{\"keccak256\":\"0x233066dd470121818082ba6a4c868f90feafc3be29942aae2c7a5c25543b7485\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://30d976a1882102493e7cee87b75ab04c662626d71aca51c9334ed2f60402bb59\",\"dweb:/ipfs/QmerPfizrjueQSgG8SkSoi44fkyaqrN2ZCFTnaxnM3UqF7\"]},\"contracts/src/spaces/facets/membership/MembershipBase.sol\":{\"keccak256\":\"0x82b3314afcd1fe84a5261c38627c2537c09271372504af10549558c0fd608791\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dadc28ee124081ea64228b8a12e0fcc93c7256535597ea9e29d58140bb599fc5\",\"dweb:/ipfs/QmYNZjhBJnPf9kMt2J6pL2d746AB3EHrXVAj5Ce3ibZpBh\"]},\"contracts/src/spaces/facets/membership/MembershipFacet.sol\":{\"keccak256\":\"0xdc782a29cb2a6a7f136c6e4a65186112cbc9eb517dc234ac391ce7f437cc0dcf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7df5a5738f97cae15e9a1d59ca3dd7efb5ab860848e0205aae9c6e6bb066464c\",\"dweb:/ipfs/QmQ61dYiibSaKrjzPvn9npQn7b83dM8tkwF48HxtaW6gwg\"]},\"contracts/src/spaces/facets/membership/MembershipStorage.sol\":{\"keccak256\":\"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee\",\"dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5\"]},\"contracts/src/spaces/facets/membership/pricing/IMembershipPricing.sol\":{\"keccak256\":\"0xb68faf2b90536ea53110ebb1d4456f2e9a261b5fac4515df47076da73e0cbd77\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://063fca54f8210be704b5d9f54efac08017266fafc9d287a6ece7866b25174448\",\"dweb:/ipfs/QmbXUgKgh36CmNRA5NrtRrVcgfrKYEzZprAcjTVWhHmXBF\"]},\"contracts/src/spaces/facets/membership/referral/IMembershipReferral.sol\":{\"keccak256\":\"0xeb2feee4b1f3e83509bc1425c0ecd60eaf168fa7686c14dc2bd636e5a691bc6a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ec9bcb8c4106639ec9e0d37fa59385c1e853fb07f9ebedcd9f2bc1198979a807\",\"dweb:/ipfs/QmcAdwQKn2jMo7grzXNGSPr9PvQBxdKURF6xxLPorCDrFt\"]},\"contracts/src/spaces/facets/membership/referral/MembershipReferralBase.sol\":{\"keccak256\":\"0x6f29e73b113fce75e54a41f248621b1adaa5ac4a3b189ef0903308bfa69165ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://abc7b25a74097434912f4940bfcd6cf9e312b0989279cb31a9a74d7ae6c09636\",\"dweb:/ipfs/QmPdttVeMBDBb8SMrga6YnKz3aiGDKMqo2MofCXtag4w4E\"]},\"contracts/src/spaces/facets/membership/referral/MembershipReferralStorage.sol\":{\"keccak256\":\"0x607aabf7ae45b7f112165c1028e0fa2d18b86c6db78f4df4bdf39dd0f20973ea\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4d61919ebf0ba0d3706cf2c3755b9d9920312c82bb1b83d0023f1cb09c2fc31d\",\"dweb:/ipfs/QmSQ1G7rRMf6tAuzdU6M5ydKetaSZXdN3UV33wNjvDrqAL\"]},\"contracts/src/spaces/facets/roles/IRoles.sol\":{\"keccak256\":\"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8\",\"dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N\"]},\"contracts/src/spaces/facets/roles/RolesBase.sol\":{\"keccak256\":\"0x2ef137dec4a5390009fd931e34fdbb4a742c96b68b40f5c152cec8cf2809ed6f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3cb29b4a780742a30ba3af5719f77a4a65ea55ebbdc3ccd9c93c86573f20c7df\",\"dweb:/ipfs/QmdvPJydLCcEwCB3xk5VpET8X2GfrxC3NBUD5G6C8a9aW8\"]},\"contracts/src/spaces/facets/roles/RolesStorage.sol\":{\"keccak256\":\"0x40f288a613e35cbc02aceb1d23f89af888f65538853f61cc1fcd25901b9bc4af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://396b5e157c9a29adc94edc5d234f416a44e6e7c4588b1aaa0587bb04018705e9\",\"dweb:/ipfs/QmWDCQz555WbvZw7XxfkybE5dPfouc6rKxU5Zu1Gsuz1Zr\"]},\"contracts/src/utils/StringSet.sol\":{\"keccak256\":\"0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6\",\"dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK\"]},\"contracts/src/utils/Validator.sol\":{\"keccak256\":\"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64\",\"dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72\"]},\"contracts/src/utils/interfaces/IWETH.sol\":{\"keccak256\":\"0xd274612ab96215dcdb6e3717a63e7a0f76c7facadff93b2b23ed278f6e7b3b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://12444da1f06a0fbe6d2d564d73d6d6bc58c09496af3aeea6988c3d3f9ee81c73\",\"dweb:/ipfs/QmTkpQ6cZmRYgvLUS4mqzLvFg5nabgQjpMnVK8JENboiA3\"]},\"contracts/src/utils/libraries/BasisPoints.sol\":{\"keccak256\":\"0x797b0a1d3da51f4256c83b5d5c885b034df5bdff69c8dfa0fac9777cfa2f1d26\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://52ba0c85e5de8a7d76e2e4bcbccdaffa68e29281191ae1f889430a496ce5cf1c\",\"dweb:/ipfs/Qmd5bYypjF6gcJKKagdRpvAgV4LCs4iyn7KYdaLBWjjuHr\"]},\"contracts/src/utils/libraries/CurrencyTransfer.sol\":{\"keccak256\":\"0x1c6b5b33831f8c5c02c49dff5ceac3ad1a6cdb74c988ebba72c36329ca704750\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://78122f27b67a5d3ebe95c4260dc972ab7be5c04b277cbd71a833dd74fbd23fa4\",\"dweb:/ipfs/QmU78EApEim92KMVtW69coFPZdhvbkhmYn6dW2zwqJKPBp\"]},\"lib/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c\",\"dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq\"]},\"lib/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d\",\"dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi\"]},\"lib/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0\",\"dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3\"]},\"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"AddressInsufficientBalance"},{"inputs":[],"type":"error","name":"ApprovalCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"ApprovalQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"BalanceQueryForZeroAddress"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__AlreadyBanned"},{"inputs":[],"type":"error","name":"Banning__CannotBanSelf"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__InvalidTokenId"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__NotBanned"},{"inputs":[],"type":"error","name":"Dispatcher__InvalidCaller"},{"inputs":[],"type":"error","name":"Dispatcher__InvalidValue"},{"inputs":[],"type":"error","name":"ERC5643__DurationZero"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC5643__InvalidTokenId"},{"inputs":[],"type":"error","name":"ERC5643__NotApprovedOrOwner"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC5643__SubscriptionNotRenewable"},{"inputs":[],"type":"error","name":"EntitlementGated_InvalidAddress"},{"inputs":[],"type":"error","name":"EntitlementGated_NodeAlreadyVoted"},{"inputs":[],"type":"error","name":"EntitlementGated_NodeNotFound"},{"inputs":[],"type":"error","name":"EntitlementGated_TransactionCheckAlreadyCompleted"},{"inputs":[],"type":"error","name":"EntitlementGated_TransactionCheckAlreadyRegistered"},{"inputs":[],"type":"error","name":"EntitlementGated_TransactionNotRegistered"},{"inputs":[],"type":"error","name":"Entitlement__InvalidValue"},{"inputs":[],"type":"error","name":"Entitlement__NotAllowed"},{"inputs":[],"type":"error","name":"Entitlement__NotMember"},{"inputs":[],"type":"error","name":"Entitlement__ValueAlreadyExists"},{"inputs":[],"type":"error","name":"FailedInnerCall"},{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[],"type":"error","name":"Membership__AlreadyMember"},{"inputs":[],"type":"error","name":"Membership__InsufficientAllowance"},{"inputs":[],"type":"error","name":"Membership__InsufficientPayment"},{"inputs":[],"type":"error","name":"Membership__InvalidAddress"},{"inputs":[],"type":"error","name":"Membership__InvalidCurrency"},{"inputs":[],"type":"error","name":"Membership__InvalidDuration"},{"inputs":[],"type":"error","name":"Membership__InvalidFeeRecipient"},{"inputs":[],"type":"error","name":"Membership__InvalidFreeAllocation"},{"inputs":[],"type":"error","name":"Membership__InvalidLimit"},{"inputs":[],"type":"error","name":"Membership__InvalidMaxSupply"},{"inputs":[],"type":"error","name":"Membership__InvalidPrice"},{"inputs":[],"type":"error","name":"Membership__InvalidPricingModule"},{"inputs":[],"type":"error","name":"Membership__InvalidReferralBps"},{"inputs":[],"type":"error","name":"Membership__InvalidReferralCode"},{"inputs":[],"type":"error","name":"Membership__InvalidReferralTime"},{"inputs":[],"type":"error","name":"Membership__InvalidTokenId"},{"inputs":[],"type":"error","name":"Membership__MaxSupplyReached"},{"inputs":[],"type":"error","name":"Membership__NotExpired"},{"inputs":[],"type":"error","name":"Membership__PriceTooLow"},{"inputs":[],"type":"error","name":"MintERC2309QuantityExceedsLimit"},{"inputs":[],"type":"error","name":"MintToZeroAddress"},{"inputs":[],"type":"error","name":"MintZeroQuantity"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[],"type":"error","name":"OwnerQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"OwnershipNotInitializedForExtraData"},{"inputs":[],"type":"error","name":"Pausable__NotPaused"},{"inputs":[],"type":"error","name":"Pausable__Paused"},{"inputs":[],"type":"error","name":"ReentrancyGuard__ReentrantCall"},{"inputs":[],"type":"error","name":"Roles__EntitlementAlreadyExists"},{"inputs":[],"type":"error","name":"Roles__EntitlementDoesNotExist"},{"inputs":[],"type":"error","name":"Roles__InvalidEntitlementAddress"},{"inputs":[],"type":"error","name":"Roles__InvalidPermission"},{"inputs":[],"type":"error","name":"Roles__PermissionAlreadyExists"},{"inputs":[],"type":"error","name":"Roles__PermissionDoesNotExist"},{"inputs":[],"type":"error","name":"Roles__RoleDoesNotExist"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"type":"error","name":"SafeERC20FailedOperation"},{"inputs":[],"type":"error","name":"TransferCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"TransferFromIncorrectOwner"},{"inputs":[],"type":"error","name":"TransferToNonERC721ReceiverImplementer"},{"inputs":[],"type":"error","name":"TransferToZeroAddress"},{"inputs":[],"type":"error","name":"URIQueryForNonexistentToken"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"approved","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bool","name":"approved","type":"bool","indexed":false}],"type":"event","name":"ApprovalForAll","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Banned","anonymous":false},{"inputs":[{"internalType":"uint256","name":"fromTokenId","type":"uint256","indexed":true},{"internalType":"uint256","name":"toTokenId","type":"uint256","indexed":false},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true}],"type":"event","name":"ConsecutiveTransfer","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"transactionId","type":"bytes32","indexed":true},{"internalType":"enum IEntitlementGatedBase.NodeVoteStatus","name":"result","type":"uint8","indexed":false}],"type":"event","name":"EntitlementCheckResultPosted","anonymous":false},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"currency","type":"address","indexed":true}],"type":"event","name":"MembershipCurrencyUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"recipient","type":"address","indexed":true}],"type":"event","name":"MembershipFeeRecipientUpdated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"allocation","type":"uint256","indexed":true}],"type":"event","name":"MembershipFreeAllocationUpdated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256","indexed":true}],"type":"event","name":"MembershipLimitUpdated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256","indexed":true}],"type":"event","name":"MembershipPriceUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"recipient","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"MembershipTokenIssued","anonymous":false},{"inputs":[{"internalType":"address","name":"recipient","type":"address","indexed":true}],"type":"event","name":"MembershipTokenRejected","anonymous":false},{"inputs":[{"internalType":"address","name":"recipient","type":"address","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false}],"type":"event","name":"MembershipWithdrawal","anonymous":false},{"inputs":[{"internalType":"uint256","name":"code","type":"uint256","indexed":true},{"internalType":"uint16","name":"bps","type":"uint16","indexed":false}],"type":"event","name":"Membership__ReferralCreated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"code","type":"uint256","indexed":true}],"type":"event","name":"Membership__ReferralRemoved","anonymous":false},{"inputs":[{"internalType":"uint256","name":"code","type":"uint256","indexed":true},{"internalType":"uint16","name":"bps","type":"uint16","indexed":false},{"internalType":"uint256","name":"startTime","type":"uint256","indexed":false},{"internalType":"uint256","name":"endTime","type":"uint256","indexed":false}],"type":"event","name":"Membership__ReferralTimeCreated","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"address","name":"creator","type":"address","indexed":true},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":true}],"type":"event","name":"RoleCreated","anonymous":false},{"inputs":[{"internalType":"address","name":"remover","type":"address","indexed":true},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":true}],"type":"event","name":"RoleRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"updater","type":"address","indexed":true},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":true}],"type":"event","name":"RoleUpdated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true},{"internalType":"uint64","name":"expiration","type":"uint64","indexed":false}],"type":"event","name":"SubscriptionUpdate","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Unbanned","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"__ERC721A_init"},{"inputs":[{"internalType":"contract IEntitlementChecker","name":"entitlementChecker","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"__EntitlementGated_init"},{"inputs":[{"internalType":"struct IMembershipBase.Membership","name":"info","type":"tuple","components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint64","name":"duration","type":"uint64"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"address","name":"feeRecipient","type":"address"},{"internalType":"uint256","name":"freeAllocation","type":"uint256"},{"internalType":"address","name":"pricingModule","type":"address"}]},{"internalType":"address","name":"spaceFactory","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"__Membership_init"},{"inputs":[],"stateMutability":"view","type":"function","name":"_getMembershipCurrency","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"_getMembershipFreeAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"_getMembershipImage","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"stateMutability":"view","type":"function","name":"_getMembershipPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"_getMembershipSupplyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"_getPricingModule","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"_getSpaceFactory","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"newAllocation","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"_setMembershipFreeAllocation"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"_setMembershipSupplyLimit"},{"inputs":[{"internalType":"address","name":"newPricingModule","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"_setPricingModule"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"approve"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function","name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"expiresAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getMembershipCurrency","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getMembershipDuration","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getMembershipFreeAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getMembershipImage","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getMembershipLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getMembershipPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getMembershipPricingModule","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getMembershipRenewalPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes32","name":"transactionId","type":"bytes32"},{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getRuleData","outputs":[{"internalType":"struct IRuleEntitlement.RuleData","name":"","type":"tuple","components":[{"internalType":"struct IRuleEntitlement.Operation[]","name":"operations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CombinedOperationType","name":"opType","type":"uint8"},{"internalType":"uint8","name":"index","type":"uint8"}]},{"internalType":"struct IRuleEntitlement.CheckOperation[]","name":"checkOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CheckOperationType","name":"opType","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"threshold","type":"uint256"}]},{"internalType":"struct IRuleEntitlement.LogicalOperation[]","name":"logicalOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.LogicalOperationType","name":"logOpType","type":"uint8"},{"internalType":"uint8","name":"leftOperationIndex","type":"uint8"},{"internalType":"uint8","name":"rightOperationIndex","type":"uint8"}]}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getSpaceFactory","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"stateMutability":"payable","type":"function","name":"joinSpace"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"referrer","type":"address"},{"internalType":"uint256","name":"referralCode","type":"uint256"}],"stateMutability":"payable","type":"function","name":"joinSpaceWithReferral"},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"bytes32","name":"transactionId","type":"bytes32"},{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"enum IEntitlementGatedBase.NodeVoteStatus","name":"result","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"postEntitlementCheckResult"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"renewMembership"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setApprovalForAll"},{"inputs":[{"internalType":"uint256","name":"newAllocation","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"setMembershipFreeAllocation"},{"inputs":[{"internalType":"string","name":"newImage","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"setMembershipImage"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"setMembershipLimit"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"setMembershipPrice"},{"inputs":[{"internalType":"address","name":"pricingModule","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setMembershipPricingModule"},{"inputs":[],"stateMutability":"view","type":"function","name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"transferFrom"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"withdraw"}],"devdoc":{"kind":"dev","methods":{"__Membership_init((string,string,uint256,uint256,uint64,address,address,uint256,address),address)":{"details":"Initialization logic when facet is added to diamond"},"_getMembershipPrice(uint256)":{"details":"Makes it virtual to allow other pricing strategies"},"approve(address,uint256)":{"details":"Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator."},"balanceOf(address)":{"details":"Returns the number of tokens in `owner`'s account."},"expiresAt(uint256)":{"params":{"tokenId":"The token id of the membership"}},"getApproved(uint256)":{"details":"Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist."},"getMembershipCurrency()":{"returns":{"_0":"The membership currency"}},"getMembershipDuration()":{"returns":{"_0":"The membership duration"}},"getMembershipFreeAllocation()":{"returns":{"_0":"The membership free allocation"}},"getMembershipImage()":{"returns":{"_0":"The membership image"}},"getMembershipLimit()":{"returns":{"_0":"The membership limit"}},"getMembershipPrice()":{"returns":{"_0":"The membership price"}},"getMembershipPricingModule()":{"returns":{"_0":"The membership pricing module"}},"getMembershipRenewalPrice(uint256)":{"params":{"tokenId":"The token id of the membership"},"returns":{"_0":"The membership renewal price"}},"getSpaceFactory()":{"returns":{"_0":"The space factory"}},"isApprovedForAll(address,address)":{"details":"Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}."},"joinSpace(address)":{"params":{"receiver":"The address of the receiver"}},"joinSpaceWithReferral(address,address,uint256)":{"params":{"receiver":"The address of the receiver","referralCode":"The referral code","referrer":"The address of the referrer"}},"name()":{"details":"Returns the token collection name."},"ownerOf(uint256)":{"details":"Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist."},"renewMembership(uint256)":{"params":{"tokenId":"The token id of the membership"}},"safeTransferFrom(address,address,uint256)":{"details":"Equivalent to `safeTransferFrom(from, to, tokenId, '')`."},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event."},"setApprovalForAll(address,bool)":{"details":"Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event."},"setMembershipFreeAllocation(uint256)":{"params":{"newAllocation":"The new membership free allocation"}},"setMembershipLimit(uint256)":{"params":{"newLimit":"The new membership limit"}},"setMembershipPrice(uint256)":{"params":{"newPrice":"The new membership price"}},"setMembershipPricingModule(address)":{"params":{"pricingModule":"The new pricing module"}},"symbol()":{"details":"Returns the token collection symbol."},"tokenURI(uint256)":{"details":"Returns the Uniform Resource Identifier (URI) for `tokenId` token."},"totalSupply()":{"details":"Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}."},"transferFrom(address,address,uint256)":{"details":"Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event."}},"version":1},"userdoc":{"kind":"user","methods":{"expiresAt(uint256)":{"notice":"Return the expiration date of a membership"},"getMembershipCurrency()":{"notice":"Get the membership currency"},"getMembershipDuration()":{"notice":"Get the membership duration"},"getMembershipFreeAllocation()":{"notice":"Get the membership free allocation"},"getMembershipImage()":{"notice":"Get the membership image"},"getMembershipLimit()":{"notice":"Get the membership limit"},"getMembershipPrice()":{"notice":"Get the membership price"},"getMembershipPricingModule()":{"notice":"Get the membership pricing module"},"getMembershipRenewalPrice(uint256)":{"notice":"Get the membership renewal price"},"getSpaceFactory()":{"notice":"Get the space factory"},"joinSpace(address)":{"notice":"Join a space"},"joinSpaceWithReferral(address,address,uint256)":{"notice":"Join a space with a referral"},"renewMembership(uint256)":{"notice":"Renew a space membership"},"setMembershipFreeAllocation(uint256)":{"notice":"Set the membership free allocation"},"setMembershipLimit(uint256)":{"notice":"Set the membership limit"},"setMembershipPrice(uint256)":{"notice":"Set the membership price"},"setMembershipPricingModule(address)":{"notice":"Set the membership pricing module"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/facets/membership/MembershipFacet.sol":"MembershipFacet"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/base/registry/facets/checker/IEntitlementChecker.sol":{"keccak256":"0x5c9a99c94e95a0c89b3d3310e252cd98aeafe34d87ffc0058f9b001af6f28bd1","urls":["bzz-raw://7983b17a371e76c8681756dc10abe26f8fffd35d3d6d8773c2023f06c8600ba3","dweb:/ipfs/QmSDkTctKCTaMGYF2LZ1N9YWwDTZD75XegpPyLrP694JFf"],"license":"MIT"},"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol":{"keccak256":"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d","urls":["bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f","dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol":{"keccak256":"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a","urls":["bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5","dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol":{"keccak256":"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0","urls":["bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc","dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/IPausable.sol":{"keccak256":"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261","urls":["bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6","dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableBase.sol":{"keccak256":"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438","urls":["bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c","dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableStorage.sol":{"keccak256":"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07","urls":["bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b","dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol":{"keccak256":"0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a","urls":["bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b","dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol":{"keccak256":"0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f","urls":["bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c","dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol":{"keccak256":"0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c","urls":["bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6","dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol":{"keccak256":"0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3","urls":["bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714","dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol":{"keccak256":"0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e","urls":["bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7","dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol":{"keccak256":"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218","urls":["bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f","dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721A.sol":{"keccak256":"0xc8fab662d9a0c4e697c8dcaad72dd2a190331b01476649a742b6f317266ac5a1","urls":["bzz-raw://9c84047a6d47a901f45f90f12f713432289ae6d88fea95a383900906005cf70b","dweb:/ipfs/QmVdLUVdtjTQn2fCG85Uv2ZAzCSfNbWYcAg5eXthunnigc"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol":{"keccak256":"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334","urls":["bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa","dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol":{"keccak256":"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1","urls":["bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c","dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9","urls":["bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e","dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM"],"license":"Apache-2.0"},"contracts/src/factory/facets/architect/pricing/IPricingModules.sol":{"keccak256":"0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e","urls":["bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716","dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU"],"license":"Apache-2.0"},"contracts/src/factory/facets/platform/requirements/IPlatformRequirements.sol":{"keccak256":"0xc0b22b0caa2336e0c3f6b6813432643053785c39531d30e5851eeb613a0a7991","urls":["bzz-raw://8a7ceb199e92f484efcc444fffd54fbabaf332c210dda0ef46d89a66f4cb47c7","dweb:/ipfs/QmRJVrZiZpbGsLngz4J3NVgapKXLErdLc7BPyEyTNKdijg"],"license":"Apache-2.0"},"contracts/src/factory/facets/prepay/IPrepay.sol":{"keccak256":"0x0c5c097dd77471d041cdbb84011ac789147af937d275329d857d1a4b257635e9","urls":["bzz-raw://baca271a5a66856f3144a4bf0ed6a484b0c981539d6bf0c57ffade9e4986eb49","dweb:/ipfs/QmVgPWMEL5q2J5kmZQZFRadWjuVQeFLaa9K2gCHdhjLUa9"],"license":"Apache-2.0"},"contracts/src/factory/facets/registry/IImplementationRegistry.sol":{"keccak256":"0x2409b9eb86a4dc5849050d06409fd7548ac21f9bf6e7419b91dfb9226db0a3d5","urls":["bzz-raw://613195fc78a1a496820c5934f315c586ad33edf7608022d2ae0ea44f52529e61","dweb:/ipfs/QmR8Gn11UNq2rKC5Qp7Prdk61oWhNg3UVc8KeyWCRfrEqV"],"license":"Apache-2.0"},"contracts/src/factory/facets/wallet-link/IWalletLink.sol":{"keccak256":"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b","urls":["bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13","dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/IEntitlement.sol":{"keccak256":"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca","urls":["bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3","dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol":{"keccak256":"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf","urls":["bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1","dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97"],"license":"MIT"},"contracts/src/spaces/facets/Entitled.sol":{"keccak256":"0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c","urls":["bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7","dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc"],"license":"Apache-2.0"},"contracts/src/spaces/facets/Permissions.sol":{"keccak256":"0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5","urls":["bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721","dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/BanningBase.sol":{"keccak256":"0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270","urls":["bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d","dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/BanningStorage.sol":{"keccak256":"0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492","urls":["bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0","dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/IBanning.sol":{"keccak256":"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505","urls":["bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419","dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/ChannelService.sol":{"keccak256":"0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7","urls":["bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9","dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/ChannelStorage.sol":{"keccak256":"0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f","urls":["bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7","dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS"],"license":"Apache-2.0"},"contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol":{"keccak256":"0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2","urls":["bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5","dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9"],"license":"Apache-2.0"},"contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol":{"keccak256":"0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef","urls":["bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07","dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek"],"license":"Apache-2.0"},"contracts/src/spaces/facets/dispatcher/DispatcherBase.sol":{"keccak256":"0x903020fbe095e548604af198fd56798a1cc7ebd875294f247e38b5c2c25b4b27","urls":["bzz-raw://4b9778b31d1fb831115edf4502f6b0166dd0dc5c255bd4bf081d58a40effe675","dweb:/ipfs/QmZ8X9YRtXaPVhxmjY9g6dUTKJb2LxxtCYELm1buoe9UEU"],"license":"Apache-2.0"},"contracts/src/spaces/facets/dispatcher/DispatcherStorage.sol":{"keccak256":"0x72ce4a1e04daeb7732b3559ef699a921d20d0056ad73b1a013ccc131957f9a5b","urls":["bzz-raw://1053eb5b1f78f5ead722e36fc6a33100534f9bdf065bfb511677c3a5bf8e91b6","dweb:/ipfs/QmeKcC2E8ym4nJ7f84HgjojFDcoghDWyZyKNjQ32ca1RXA"],"license":"Apache-2.0"},"contracts/src/spaces/facets/dispatcher/IDispatcher.sol":{"keccak256":"0x9542fdb04a005a1d923bd266f539db381275f2c5de9de06807eca7d043648308","urls":["bzz-raw://64ebd4899ff63689607fa3014987b953b2ec7d2314667eedceabb868cb042c43","dweb:/ipfs/QmdP8qNW5g1rnFK1Czogvp6JDAvUsPoUavxiJbdci6s6zo"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/EntitlementsManagerService.sol":{"keccak256":"0x6f40f5b41ad702ea55bf10f987b3e2b6d02ac527a66be523f06f025cead1867d","urls":["bzz-raw://da2012c616b833c5b491735c230be707e4f9b7657b3a71d7bdf52e7c2ba128b9","dweb:/ipfs/Qme4864V46rozVDRWtfYqtpyzE1SzBnqYQQf3iD2rrqiPg"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol":{"keccak256":"0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8","urls":["bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583","dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/EntitlementGated.sol":{"keccak256":"0x69b525c004a345b89f3c784df334780a2d399b3f2058183daf65862f2d095820","urls":["bzz-raw://e927c722387563b909fd26cbd09cff0b5bc905a3c0c5c00b9c40c4d66bf19e70","dweb:/ipfs/Qmbk5XXjzLaZJSaSSjhpEm2pyB2GSj1cDPChYdJup9wStk"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/EntitlementGatedBase.sol":{"keccak256":"0x0aa9887cf58dd68d0270c85e2d7610080f35410b845c2227e4bd84356b7a2cb7","urls":["bzz-raw://6dbdbed895fc2a53bffa3dbc1cfd4c992a096f153e6bbb7aeb9894485e7fc1a6","dweb:/ipfs/QmZp76Gd8aL9pWbiTvLaiHv1w12yjN59PtYdMvoUCbfbH5"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/EntitlementGatedStorage.sol":{"keccak256":"0xe997c0dd62f6ceb300729d3f56a3f25a47b40ed5946d68c5210c38941cb37eaa","urls":["bzz-raw://63fcfd9f667538e8e9339534d2ddc6f7899e4179a54f3c6595e2598babb5bb9c","dweb:/ipfs/QmUfKtfgW1uskEWkhhGqTjcbCqMANQoKKfTgV2ZvdAZpvJ"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/IEntitlementGated.sol":{"keccak256":"0x948de1018f7f78366263a40e0f8269e10941216bd03a9996edb24a6230959e74","urls":["bzz-raw://dc985539ce639f39fd68723acca6424a78deac6cec3693c9d8e1084a487c83ec","dweb:/ipfs/QmQujX5rmDwhJZurp11FTiPLb7ev9swLTtdkagA8wydZiT"],"license":"MIT"},"contracts/src/spaces/facets/membership/IMembership.sol":{"keccak256":"0x233066dd470121818082ba6a4c868f90feafc3be29942aae2c7a5c25543b7485","urls":["bzz-raw://30d976a1882102493e7cee87b75ab04c662626d71aca51c9334ed2f60402bb59","dweb:/ipfs/QmerPfizrjueQSgG8SkSoi44fkyaqrN2ZCFTnaxnM3UqF7"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/MembershipBase.sol":{"keccak256":"0x82b3314afcd1fe84a5261c38627c2537c09271372504af10549558c0fd608791","urls":["bzz-raw://dadc28ee124081ea64228b8a12e0fcc93c7256535597ea9e29d58140bb599fc5","dweb:/ipfs/QmYNZjhBJnPf9kMt2J6pL2d746AB3EHrXVAj5Ce3ibZpBh"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/MembershipFacet.sol":{"keccak256":"0xdc782a29cb2a6a7f136c6e4a65186112cbc9eb517dc234ac391ce7f437cc0dcf","urls":["bzz-raw://7df5a5738f97cae15e9a1d59ca3dd7efb5ab860848e0205aae9c6e6bb066464c","dweb:/ipfs/QmQ61dYiibSaKrjzPvn9npQn7b83dM8tkwF48HxtaW6gwg"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/MembershipStorage.sol":{"keccak256":"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3","urls":["bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee","dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/pricing/IMembershipPricing.sol":{"keccak256":"0xb68faf2b90536ea53110ebb1d4456f2e9a261b5fac4515df47076da73e0cbd77","urls":["bzz-raw://063fca54f8210be704b5d9f54efac08017266fafc9d287a6ece7866b25174448","dweb:/ipfs/QmbXUgKgh36CmNRA5NrtRrVcgfrKYEzZprAcjTVWhHmXBF"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/referral/IMembershipReferral.sol":{"keccak256":"0xeb2feee4b1f3e83509bc1425c0ecd60eaf168fa7686c14dc2bd636e5a691bc6a","urls":["bzz-raw://ec9bcb8c4106639ec9e0d37fa59385c1e853fb07f9ebedcd9f2bc1198979a807","dweb:/ipfs/QmcAdwQKn2jMo7grzXNGSPr9PvQBxdKURF6xxLPorCDrFt"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/referral/MembershipReferralBase.sol":{"keccak256":"0x6f29e73b113fce75e54a41f248621b1adaa5ac4a3b189ef0903308bfa69165ca","urls":["bzz-raw://abc7b25a74097434912f4940bfcd6cf9e312b0989279cb31a9a74d7ae6c09636","dweb:/ipfs/QmPdttVeMBDBb8SMrga6YnKz3aiGDKMqo2MofCXtag4w4E"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/referral/MembershipReferralStorage.sol":{"keccak256":"0x607aabf7ae45b7f112165c1028e0fa2d18b86c6db78f4df4bdf39dd0f20973ea","urls":["bzz-raw://4d61919ebf0ba0d3706cf2c3755b9d9920312c82bb1b83d0023f1cb09c2fc31d","dweb:/ipfs/QmSQ1G7rRMf6tAuzdU6M5ydKetaSZXdN3UV33wNjvDrqAL"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/IRoles.sol":{"keccak256":"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d","urls":["bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8","dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/RolesBase.sol":{"keccak256":"0x2ef137dec4a5390009fd931e34fdbb4a742c96b68b40f5c152cec8cf2809ed6f","urls":["bzz-raw://3cb29b4a780742a30ba3af5719f77a4a65ea55ebbdc3ccd9c93c86573f20c7df","dweb:/ipfs/QmdvPJydLCcEwCB3xk5VpET8X2GfrxC3NBUD5G6C8a9aW8"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/RolesStorage.sol":{"keccak256":"0x40f288a613e35cbc02aceb1d23f89af888f65538853f61cc1fcd25901b9bc4af","urls":["bzz-raw://396b5e157c9a29adc94edc5d234f416a44e6e7c4588b1aaa0587bb04018705e9","dweb:/ipfs/QmWDCQz555WbvZw7XxfkybE5dPfouc6rKxU5Zu1Gsuz1Zr"],"license":"Apache-2.0"},"contracts/src/utils/StringSet.sol":{"keccak256":"0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319","urls":["bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6","dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK"],"license":"Apache-2.0"},"contracts/src/utils/Validator.sol":{"keccak256":"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50","urls":["bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64","dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72"],"license":"Apache-2.0"},"contracts/src/utils/interfaces/IWETH.sol":{"keccak256":"0xd274612ab96215dcdb6e3717a63e7a0f76c7facadff93b2b23ed278f6e7b3b00","urls":["bzz-raw://12444da1f06a0fbe6d2d564d73d6d6bc58c09496af3aeea6988c3d3f9ee81c73","dweb:/ipfs/QmTkpQ6cZmRYgvLUS4mqzLvFg5nabgQjpMnVK8JENboiA3"],"license":"Apache-2.0"},"contracts/src/utils/libraries/BasisPoints.sol":{"keccak256":"0x797b0a1d3da51f4256c83b5d5c885b034df5bdff69c8dfa0fac9777cfa2f1d26","urls":["bzz-raw://52ba0c85e5de8a7d76e2e4bcbccdaffa68e29281191ae1f889430a496ce5cf1c","dweb:/ipfs/Qmd5bYypjF6gcJKKagdRpvAgV4LCs4iyn7KYdaLBWjjuHr"],"license":"Apache-2.0"},"contracts/src/utils/libraries/CurrencyTransfer.sol":{"keccak256":"0x1c6b5b33831f8c5c02c49dff5ceac3ad1a6cdb74c988ebba72c36329ca704750","urls":["bzz-raw://78122f27b67a5d3ebe95c4260dc972ab7be5c04b277cbd71a833dd74fbd23fa4","dweb:/ipfs/QmU78EApEim92KMVtW69coFPZdhvbkhmYn6dW2zwqJKPBp"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"keccak256":"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4","urls":["bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7","dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":187} \ No newline at end of file diff --git a/packages/generated/v3/abis/MembershipFacet.metadata.json b/packages/generated/v3/abis/MembershipFacet.metadata.json new file mode 100644 index 000000000..398143660 --- /dev/null +++ b/packages/generated/v3/abis/MembershipFacet.metadata.json @@ -0,0 +1,2572 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "type": "error", + "name": "AddressEmptyCode" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "AddressInsufficientBalance" + }, + { + "inputs": [], + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "ApprovalQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "BalanceQueryForZeroAddress" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__AlreadyBanned" + }, + { + "inputs": [], + "type": "error", + "name": "Banning__CannotBanSelf" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__InvalidTokenId" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__NotBanned" + }, + { + "inputs": [], + "type": "error", + "name": "Dispatcher__InvalidCaller" + }, + { + "inputs": [], + "type": "error", + "name": "Dispatcher__InvalidValue" + }, + { + "inputs": [], + "type": "error", + "name": "ERC5643__DurationZero" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC5643__InvalidTokenId" + }, + { + "inputs": [], + "type": "error", + "name": "ERC5643__NotApprovedOrOwner" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_InvalidAddress" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_NodeAlreadyVoted" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_NodeNotFound" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyCompleted" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyRegistered" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_TransactionNotRegistered" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__InvalidValue" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotAllowed" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotMember" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__ValueAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "FailedInnerCall" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__AlreadyMember" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InsufficientAllowance" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InsufficientPayment" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidAddress" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidCurrency" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidDuration" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidFeeRecipient" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidFreeAllocation" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidLimit" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidMaxSupply" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidPrice" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidPricingModule" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidReferralBps" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidReferralCode" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidReferralTime" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__InvalidTokenId" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__MaxSupplyReached" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__NotExpired" + }, + { + "inputs": [], + "type": "error", + "name": "Membership__PriceTooLow" + }, + { + "inputs": [], + "type": "error", + "name": "MintERC2309QuantityExceedsLimit" + }, + { + "inputs": [], + "type": "error", + "name": "MintToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "MintZeroQuantity" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "OwnerQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "OwnershipNotInitializedForExtraData" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__NotPaused" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__Paused" + }, + { + "inputs": [], + "type": "error", + "name": "ReentrancyGuard__ReentrantCall" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__EntitlementAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__EntitlementDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__InvalidEntitlementAddress" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__InvalidPermission" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__PermissionAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__PermissionDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__RoleDoesNotExist" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "type": "error", + "name": "SafeERC20FailedOperation" + }, + { + "inputs": [], + "type": "error", + "name": "TransferCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "TransferFromIncorrectOwner" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "URIQueryForNonexistentToken" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "approved", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Approval", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "operator", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ApprovalForAll", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Banned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fromTokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint256", + "name": "toTokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConsecutiveTransfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "transactionId", + "type": "bytes32", + "indexed": true + }, + { + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus", + "name": "result", + "type": "uint8", + "indexed": false + } + ], + "type": "event", + "name": "EntitlementCheckResultPosted", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "currency", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "MembershipCurrencyUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "MembershipFeeRecipientUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "allocation", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "MembershipFreeAllocationUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "limit", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "MembershipLimitUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "MembershipPriceUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "MembershipTokenIssued", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "MembershipTokenRejected", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "MembershipWithdrawal", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "code", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint16", + "name": "bps", + "type": "uint16", + "indexed": false + } + ], + "type": "event", + "name": "Membership__ReferralCreated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "code", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Membership__ReferralRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "code", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint16", + "name": "bps", + "type": "uint16", + "indexed": false + }, + { + "internalType": "uint256", + "name": "startTime", + "type": "uint256", + "indexed": false + }, + { + "internalType": "uint256", + "name": "endTime", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "Membership__ReferralTimeCreated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Paused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "creator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RoleCreated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "remover", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RoleRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "updater", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RoleUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint64", + "name": "expiration", + "type": "uint64", + "indexed": false + } + ], + "type": "event", + "name": "SubscriptionUpdate", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Transfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Unbanned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Unpaused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name_", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol_", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__ERC721A_init" + }, + { + "inputs": [ + { + "internalType": "contract IEntitlementChecker", + "name": "entitlementChecker", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__EntitlementGated_init" + }, + { + "inputs": [ + { + "internalType": "struct IMembershipBase.Membership", + "name": "info", + "type": "tuple", + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxSupply", + "type": "uint256" + }, + { + "internalType": "uint64", + "name": "duration", + "type": "uint64" + }, + { + "internalType": "address", + "name": "currency", + "type": "address" + }, + { + "internalType": "address", + "name": "feeRecipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "freeAllocation", + "type": "uint256" + }, + { + "internalType": "address", + "name": "pricingModule", + "type": "address" + } + ] + }, + { + "internalType": "address", + "name": "spaceFactory", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__Membership_init" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "_getMembershipCurrency", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "_getMembershipFreeAllocation", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "_getMembershipImage", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "totalSupply", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "_getMembershipPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "_getMembershipSupplyLimit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "_getPricingModule", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "_getSpaceFactory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newAllocation", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "_setMembershipFreeAllocation" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newLimit", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "_setMembershipSupplyLimit" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newPricingModule", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "_setPricingModule" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "approve" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "expiresAt", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getMembershipCurrency", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getMembershipDuration", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getMembershipFreeAllocation", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getMembershipImage", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getMembershipLimit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getMembershipPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getMembershipPricingModule", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getMembershipRenewalPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "transactionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getRuleData", + "outputs": [ + { + "internalType": "struct IRuleEntitlement.RuleData", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "struct IRuleEntitlement.Operation[]", + "name": "operations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CombinedOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "index", + "type": "uint8" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "name": "checkOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CheckOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "name": "logicalOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.LogicalOperationType", + "name": "logOpType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "leftOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "rightOperationIndex", + "type": "uint8" + } + ] + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getSpaceFactory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "joinSpace" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "address", + "name": "referrer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "referralCode", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "joinSpaceWithReferral" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "transactionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus", + "name": "result", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "postEntitlementCheckResult" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "renewMembership" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "safeTransferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "safeTransferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setApprovalForAll" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newAllocation", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setMembershipFreeAllocation" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "newImage", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setMembershipImage" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newLimit", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setMembershipLimit" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setMembershipPrice" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pricingModule", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setMembershipPricingModule" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "transferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "withdraw" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "__Membership_init((string,string,uint256,uint256,uint64,address,address,uint256,address),address)": { + "details": "Initialization logic when facet is added to diamond" + }, + "_getMembershipPrice(uint256)": { + "details": "Makes it virtual to allow other pricing strategies" + }, + "approve(address,uint256)": { + "details": "Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator." + }, + "balanceOf(address)": { + "details": "Returns the number of tokens in `owner`'s account." + }, + "expiresAt(uint256)": { + "params": { + "tokenId": "The token id of the membership" + } + }, + "getApproved(uint256)": { + "details": "Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist." + }, + "getMembershipCurrency()": { + "returns": { + "_0": "The membership currency" + } + }, + "getMembershipDuration()": { + "returns": { + "_0": "The membership duration" + } + }, + "getMembershipFreeAllocation()": { + "returns": { + "_0": "The membership free allocation" + } + }, + "getMembershipImage()": { + "returns": { + "_0": "The membership image" + } + }, + "getMembershipLimit()": { + "returns": { + "_0": "The membership limit" + } + }, + "getMembershipPrice()": { + "returns": { + "_0": "The membership price" + } + }, + "getMembershipPricingModule()": { + "returns": { + "_0": "The membership pricing module" + } + }, + "getMembershipRenewalPrice(uint256)": { + "params": { + "tokenId": "The token id of the membership" + }, + "returns": { + "_0": "The membership renewal price" + } + }, + "getSpaceFactory()": { + "returns": { + "_0": "The space factory" + } + }, + "isApprovedForAll(address,address)": { + "details": "Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}." + }, + "joinSpace(address)": { + "params": { + "receiver": "The address of the receiver" + } + }, + "joinSpaceWithReferral(address,address,uint256)": { + "params": { + "receiver": "The address of the receiver", + "referralCode": "The referral code", + "referrer": "The address of the referrer" + } + }, + "name()": { + "details": "Returns the token collection name." + }, + "ownerOf(uint256)": { + "details": "Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist." + }, + "renewMembership(uint256)": { + "params": { + "tokenId": "The token id of the membership" + } + }, + "safeTransferFrom(address,address,uint256)": { + "details": "Equivalent to `safeTransferFrom(from, to, tokenId, '')`." + }, + "safeTransferFrom(address,address,uint256,bytes)": { + "details": "Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event." + }, + "setApprovalForAll(address,bool)": { + "details": "Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event." + }, + "setMembershipFreeAllocation(uint256)": { + "params": { + "newAllocation": "The new membership free allocation" + } + }, + "setMembershipLimit(uint256)": { + "params": { + "newLimit": "The new membership limit" + } + }, + "setMembershipPrice(uint256)": { + "params": { + "newPrice": "The new membership price" + } + }, + "setMembershipPricingModule(address)": { + "params": { + "pricingModule": "The new pricing module" + } + }, + "symbol()": { + "details": "Returns the token collection symbol." + }, + "tokenURI(uint256)": { + "details": "Returns the Uniform Resource Identifier (URI) for `tokenId` token." + }, + "totalSupply()": { + "details": "Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}." + }, + "transferFrom(address,address,uint256)": { + "details": "Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "expiresAt(uint256)": { + "notice": "Return the expiration date of a membership" + }, + "getMembershipCurrency()": { + "notice": "Get the membership currency" + }, + "getMembershipDuration()": { + "notice": "Get the membership duration" + }, + "getMembershipFreeAllocation()": { + "notice": "Get the membership free allocation" + }, + "getMembershipImage()": { + "notice": "Get the membership image" + }, + "getMembershipLimit()": { + "notice": "Get the membership limit" + }, + "getMembershipPrice()": { + "notice": "Get the membership price" + }, + "getMembershipPricingModule()": { + "notice": "Get the membership pricing module" + }, + "getMembershipRenewalPrice(uint256)": { + "notice": "Get the membership renewal price" + }, + "getSpaceFactory()": { + "notice": "Get the space factory" + }, + "joinSpace(address)": { + "notice": "Join a space" + }, + "joinSpaceWithReferral(address,address,uint256)": { + "notice": "Join a space with a referral" + }, + "renewMembership(uint256)": { + "notice": "Renew a space membership" + }, + "setMembershipFreeAllocation(uint256)": { + "notice": "Set the membership free allocation" + }, + "setMembershipLimit(uint256)": { + "notice": "Set the membership limit" + }, + "setMembershipPrice(uint256)": { + "notice": "Set the membership price" + }, + "setMembershipPricingModule(address)": { + "notice": "Set the membership pricing module" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/facets/membership/MembershipFacet.sol": "MembershipFacet" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/base/registry/facets/checker/IEntitlementChecker.sol": { + "keccak256": "0x5c9a99c94e95a0c89b3d3310e252cd98aeafe34d87ffc0058f9b001af6f28bd1", + "urls": [ + "bzz-raw://7983b17a371e76c8681756dc10abe26f8fffd35d3d6d8773c2023f06c8600ba3", + "dweb:/ipfs/QmSDkTctKCTaMGYF2LZ1N9YWwDTZD75XegpPyLrP694JFf" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol": { + "keccak256": "0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d", + "urls": [ + "bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f", + "dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol": { + "keccak256": "0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a", + "urls": [ + "bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5", + "dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol": { + "keccak256": "0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0", + "urls": [ + "bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc", + "dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/IPausable.sol": { + "keccak256": "0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261", + "urls": [ + "bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6", + "dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableBase.sol": { + "keccak256": "0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438", + "urls": [ + "bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c", + "dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableStorage.sol": { + "keccak256": "0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07", + "urls": [ + "bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b", + "dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol": { + "keccak256": "0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a", + "urls": [ + "bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b", + "dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol": { + "keccak256": "0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f", + "urls": [ + "bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c", + "dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol": { + "keccak256": "0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c", + "urls": [ + "bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6", + "dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol": { + "keccak256": "0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3", + "urls": [ + "bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714", + "dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol": { + "keccak256": "0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e", + "urls": [ + "bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7", + "dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/IERC5643.sol": { + "keccak256": "0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218", + "urls": [ + "bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f", + "dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721A.sol": { + "keccak256": "0xc8fab662d9a0c4e697c8dcaad72dd2a190331b01476649a742b6f317266ac5a1", + "urls": [ + "bzz-raw://9c84047a6d47a901f45f90f12f713432289ae6d88fea95a383900906005cf70b", + "dweb:/ipfs/QmVdLUVdtjTQn2fCG85Uv2ZAzCSfNbWYcAg5eXthunnigc" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol": { + "keccak256": "0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334", + "urls": [ + "bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa", + "dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol": { + "keccak256": "0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1", + "urls": [ + "bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c", + "dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/IERC721A.sol": { + "keccak256": "0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9", + "urls": [ + "bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e", + "dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/architect/pricing/IPricingModules.sol": { + "keccak256": "0xbfe90223b87a2fa178024ec2b94dc45a8950b707d76dc54e6743439e8fc0d73e", + "urls": [ + "bzz-raw://73bfdc19b81b36d3c8d7aaa0c6d2701d54b8eeb0613e4c0f6184d1d9e2189716", + "dweb:/ipfs/QmSqZaPpb4A3AtjqE4cRXXjre9fQ87fv8P7ycsKmpC4NHU" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/platform/requirements/IPlatformRequirements.sol": { + "keccak256": "0xc0b22b0caa2336e0c3f6b6813432643053785c39531d30e5851eeb613a0a7991", + "urls": [ + "bzz-raw://8a7ceb199e92f484efcc444fffd54fbabaf332c210dda0ef46d89a66f4cb47c7", + "dweb:/ipfs/QmRJVrZiZpbGsLngz4J3NVgapKXLErdLc7BPyEyTNKdijg" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/prepay/IPrepay.sol": { + "keccak256": "0x0c5c097dd77471d041cdbb84011ac789147af937d275329d857d1a4b257635e9", + "urls": [ + "bzz-raw://baca271a5a66856f3144a4bf0ed6a484b0c981539d6bf0c57ffade9e4986eb49", + "dweb:/ipfs/QmVgPWMEL5q2J5kmZQZFRadWjuVQeFLaa9K2gCHdhjLUa9" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/registry/IImplementationRegistry.sol": { + "keccak256": "0x2409b9eb86a4dc5849050d06409fd7548ac21f9bf6e7419b91dfb9226db0a3d5", + "urls": [ + "bzz-raw://613195fc78a1a496820c5934f315c586ad33edf7608022d2ae0ea44f52529e61", + "dweb:/ipfs/QmR8Gn11UNq2rKC5Qp7Prdk61oWhNg3UVc8KeyWCRfrEqV" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/wallet-link/IWalletLink.sol": { + "keccak256": "0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b", + "urls": [ + "bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13", + "dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/IEntitlement.sol": { + "keccak256": "0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca", + "urls": [ + "bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3", + "dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol": { + "keccak256": "0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf", + "urls": [ + "bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1", + "dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97" + ], + "license": "MIT" + }, + "contracts/src/spaces/facets/Entitled.sol": { + "keccak256": "0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c", + "urls": [ + "bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7", + "dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/Permissions.sol": { + "keccak256": "0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5", + "urls": [ + "bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721", + "dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/BanningBase.sol": { + "keccak256": "0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270", + "urls": [ + "bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d", + "dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/BanningStorage.sol": { + "keccak256": "0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492", + "urls": [ + "bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0", + "dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/IBanning.sol": { + "keccak256": "0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505", + "urls": [ + "bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419", + "dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/ChannelService.sol": { + "keccak256": "0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7", + "urls": [ + "bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9", + "dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/ChannelStorage.sol": { + "keccak256": "0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f", + "urls": [ + "bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7", + "dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol": { + "keccak256": "0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2", + "urls": [ + "bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5", + "dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol": { + "keccak256": "0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef", + "urls": [ + "bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07", + "dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/dispatcher/DispatcherBase.sol": { + "keccak256": "0x903020fbe095e548604af198fd56798a1cc7ebd875294f247e38b5c2c25b4b27", + "urls": [ + "bzz-raw://4b9778b31d1fb831115edf4502f6b0166dd0dc5c255bd4bf081d58a40effe675", + "dweb:/ipfs/QmZ8X9YRtXaPVhxmjY9g6dUTKJb2LxxtCYELm1buoe9UEU" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/dispatcher/DispatcherStorage.sol": { + "keccak256": "0x72ce4a1e04daeb7732b3559ef699a921d20d0056ad73b1a013ccc131957f9a5b", + "urls": [ + "bzz-raw://1053eb5b1f78f5ead722e36fc6a33100534f9bdf065bfb511677c3a5bf8e91b6", + "dweb:/ipfs/QmeKcC2E8ym4nJ7f84HgjojFDcoghDWyZyKNjQ32ca1RXA" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/dispatcher/IDispatcher.sol": { + "keccak256": "0x9542fdb04a005a1d923bd266f539db381275f2c5de9de06807eca7d043648308", + "urls": [ + "bzz-raw://64ebd4899ff63689607fa3014987b953b2ec7d2314667eedceabb868cb042c43", + "dweb:/ipfs/QmdP8qNW5g1rnFK1Czogvp6JDAvUsPoUavxiJbdci6s6zo" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/EntitlementsManagerService.sol": { + "keccak256": "0x6f40f5b41ad702ea55bf10f987b3e2b6d02ac527a66be523f06f025cead1867d", + "urls": [ + "bzz-raw://da2012c616b833c5b491735c230be707e4f9b7657b3a71d7bdf52e7c2ba128b9", + "dweb:/ipfs/Qme4864V46rozVDRWtfYqtpyzE1SzBnqYQQf3iD2rrqiPg" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol": { + "keccak256": "0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8", + "urls": [ + "bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583", + "dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/EntitlementGated.sol": { + "keccak256": "0x69b525c004a345b89f3c784df334780a2d399b3f2058183daf65862f2d095820", + "urls": [ + "bzz-raw://e927c722387563b909fd26cbd09cff0b5bc905a3c0c5c00b9c40c4d66bf19e70", + "dweb:/ipfs/Qmbk5XXjzLaZJSaSSjhpEm2pyB2GSj1cDPChYdJup9wStk" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/EntitlementGatedBase.sol": { + "keccak256": "0x0aa9887cf58dd68d0270c85e2d7610080f35410b845c2227e4bd84356b7a2cb7", + "urls": [ + "bzz-raw://6dbdbed895fc2a53bffa3dbc1cfd4c992a096f153e6bbb7aeb9894485e7fc1a6", + "dweb:/ipfs/QmZp76Gd8aL9pWbiTvLaiHv1w12yjN59PtYdMvoUCbfbH5" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/EntitlementGatedStorage.sol": { + "keccak256": "0xe997c0dd62f6ceb300729d3f56a3f25a47b40ed5946d68c5210c38941cb37eaa", + "urls": [ + "bzz-raw://63fcfd9f667538e8e9339534d2ddc6f7899e4179a54f3c6595e2598babb5bb9c", + "dweb:/ipfs/QmUfKtfgW1uskEWkhhGqTjcbCqMANQoKKfTgV2ZvdAZpvJ" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/IEntitlementGated.sol": { + "keccak256": "0x948de1018f7f78366263a40e0f8269e10941216bd03a9996edb24a6230959e74", + "urls": [ + "bzz-raw://dc985539ce639f39fd68723acca6424a78deac6cec3693c9d8e1084a487c83ec", + "dweb:/ipfs/QmQujX5rmDwhJZurp11FTiPLb7ev9swLTtdkagA8wydZiT" + ], + "license": "MIT" + }, + "contracts/src/spaces/facets/membership/IMembership.sol": { + "keccak256": "0x233066dd470121818082ba6a4c868f90feafc3be29942aae2c7a5c25543b7485", + "urls": [ + "bzz-raw://30d976a1882102493e7cee87b75ab04c662626d71aca51c9334ed2f60402bb59", + "dweb:/ipfs/QmerPfizrjueQSgG8SkSoi44fkyaqrN2ZCFTnaxnM3UqF7" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/MembershipBase.sol": { + "keccak256": "0x82b3314afcd1fe84a5261c38627c2537c09271372504af10549558c0fd608791", + "urls": [ + "bzz-raw://dadc28ee124081ea64228b8a12e0fcc93c7256535597ea9e29d58140bb599fc5", + "dweb:/ipfs/QmYNZjhBJnPf9kMt2J6pL2d746AB3EHrXVAj5Ce3ibZpBh" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/MembershipFacet.sol": { + "keccak256": "0xdc782a29cb2a6a7f136c6e4a65186112cbc9eb517dc234ac391ce7f437cc0dcf", + "urls": [ + "bzz-raw://7df5a5738f97cae15e9a1d59ca3dd7efb5ab860848e0205aae9c6e6bb066464c", + "dweb:/ipfs/QmQ61dYiibSaKrjzPvn9npQn7b83dM8tkwF48HxtaW6gwg" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/MembershipStorage.sol": { + "keccak256": "0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3", + "urls": [ + "bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee", + "dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/pricing/IMembershipPricing.sol": { + "keccak256": "0xb68faf2b90536ea53110ebb1d4456f2e9a261b5fac4515df47076da73e0cbd77", + "urls": [ + "bzz-raw://063fca54f8210be704b5d9f54efac08017266fafc9d287a6ece7866b25174448", + "dweb:/ipfs/QmbXUgKgh36CmNRA5NrtRrVcgfrKYEzZprAcjTVWhHmXBF" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/referral/IMembershipReferral.sol": { + "keccak256": "0xeb2feee4b1f3e83509bc1425c0ecd60eaf168fa7686c14dc2bd636e5a691bc6a", + "urls": [ + "bzz-raw://ec9bcb8c4106639ec9e0d37fa59385c1e853fb07f9ebedcd9f2bc1198979a807", + "dweb:/ipfs/QmcAdwQKn2jMo7grzXNGSPr9PvQBxdKURF6xxLPorCDrFt" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/referral/MembershipReferralBase.sol": { + "keccak256": "0x6f29e73b113fce75e54a41f248621b1adaa5ac4a3b189ef0903308bfa69165ca", + "urls": [ + "bzz-raw://abc7b25a74097434912f4940bfcd6cf9e312b0989279cb31a9a74d7ae6c09636", + "dweb:/ipfs/QmPdttVeMBDBb8SMrga6YnKz3aiGDKMqo2MofCXtag4w4E" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/referral/MembershipReferralStorage.sol": { + "keccak256": "0x607aabf7ae45b7f112165c1028e0fa2d18b86c6db78f4df4bdf39dd0f20973ea", + "urls": [ + "bzz-raw://4d61919ebf0ba0d3706cf2c3755b9d9920312c82bb1b83d0023f1cb09c2fc31d", + "dweb:/ipfs/QmSQ1G7rRMf6tAuzdU6M5ydKetaSZXdN3UV33wNjvDrqAL" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/IRoles.sol": { + "keccak256": "0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d", + "urls": [ + "bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8", + "dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/RolesBase.sol": { + "keccak256": "0x2ef137dec4a5390009fd931e34fdbb4a742c96b68b40f5c152cec8cf2809ed6f", + "urls": [ + "bzz-raw://3cb29b4a780742a30ba3af5719f77a4a65ea55ebbdc3ccd9c93c86573f20c7df", + "dweb:/ipfs/QmdvPJydLCcEwCB3xk5VpET8X2GfrxC3NBUD5G6C8a9aW8" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/RolesStorage.sol": { + "keccak256": "0x40f288a613e35cbc02aceb1d23f89af888f65538853f61cc1fcd25901b9bc4af", + "urls": [ + "bzz-raw://396b5e157c9a29adc94edc5d234f416a44e6e7c4588b1aaa0587bb04018705e9", + "dweb:/ipfs/QmWDCQz555WbvZw7XxfkybE5dPfouc6rKxU5Zu1Gsuz1Zr" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/StringSet.sol": { + "keccak256": "0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319", + "urls": [ + "bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6", + "dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/Validator.sol": { + "keccak256": "0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50", + "urls": [ + "bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64", + "dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/interfaces/IWETH.sol": { + "keccak256": "0xd274612ab96215dcdb6e3717a63e7a0f76c7facadff93b2b23ed278f6e7b3b00", + "urls": [ + "bzz-raw://12444da1f06a0fbe6d2d564d73d6d6bc58c09496af3aeea6988c3d3f9ee81c73", + "dweb:/ipfs/QmTkpQ6cZmRYgvLUS4mqzLvFg5nabgQjpMnVK8JENboiA3" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/libraries/BasisPoints.sol": { + "keccak256": "0x797b0a1d3da51f4256c83b5d5c885b034df5bdff69c8dfa0fac9777cfa2f1d26", + "urls": [ + "bzz-raw://52ba0c85e5de8a7d76e2e4bcbccdaffa68e29281191ae1f889430a496ce5cf1c", + "dweb:/ipfs/Qmd5bYypjF6gcJKKagdRpvAgV4LCs4iyn7KYdaLBWjjuHr" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/libraries/CurrencyTransfer.sol": { + "keccak256": "0x1c6b5b33831f8c5c02c49dff5ceac3ad1a6cdb74c988ebba72c36329ca704750", + "urls": [ + "bzz-raw://78122f27b67a5d3ebe95c4260dc972ab7be5c04b277cbd71a833dd74fbd23fa4", + "dweb:/ipfs/QmU78EApEim92KMVtW69coFPZdhvbkhmYn6dW2zwqJKPBp" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70", + "urls": [ + "bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c", + "dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { + "keccak256": "0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff", + "urls": [ + "bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d", + "dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { + "keccak256": "0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386", + "urls": [ + "bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0", + "dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4", + "urls": [ + "bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7", + "dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/MockCustomEntitlement.abi.json b/packages/generated/v3/abis/MockCustomEntitlement.abi.json new file mode 100644 index 000000000..bf21b011f --- /dev/null +++ b/packages/generated/v3/abis/MockCustomEntitlement.abi.json @@ -0,0 +1,44 @@ +[ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isEntitled", + "inputs": [ + { + "name": "user", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "setEntitled", + "inputs": [ + { + "name": "user", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "userIsEntitled", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/MockCustomEntitlement.abi.ts b/packages/generated/v3/abis/MockCustomEntitlement.abi.ts new file mode 100644 index 000000000..69711dacb --- /dev/null +++ b/packages/generated/v3/abis/MockCustomEntitlement.abi.ts @@ -0,0 +1,44 @@ +export default [ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isEntitled", + "inputs": [ + { + "name": "user", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "setEntitled", + "inputs": [ + { + "name": "user", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "userIsEntitled", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + } +] as const diff --git a/packages/generated/v3/abis/MockCustomEntitlement.bin b/packages/generated/v3/abis/MockCustomEntitlement.bin new file mode 100644 index 000000000..cfd3d50d1 --- /dev/null +++ b/packages/generated/v3/abis/MockCustomEntitlement.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b506102c1806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80633f4c4d831461003b578063ddc6e68e14610050575b600080fd5b61004e6100493660046101e0565b610077565b005b61006361005e366004610237565b6100c4565b604051901515815260200160405180910390f35b806000808460405160200161008c9190610274565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff19169115159190911790555050565b6000806000836040516020016100da9190610274565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1692915050565b634e487b7160e01b600052604160045260246000fd5b80356001600160a01b038116811461013657600080fd5b919050565b600082601f83011261014c57600080fd5b8135602067ffffffffffffffff8083111561016957610169610109565b8260051b604051601f19603f8301168101818110848211171561018e5761018e610109565b60405293845260208187018101949081019250878511156101ae57600080fd5b6020870191505b848210156101d5576101c68261011f565b835291830191908301906101b5565b979650505050505050565b600080604083850312156101f357600080fd5b823567ffffffffffffffff81111561020a57600080fd5b6102168582860161013b565b9250506020830135801515811461022c57600080fd5b809150509250929050565b60006020828403121561024957600080fd5b813567ffffffffffffffff81111561026057600080fd5b61026c8482850161013b565b949350505050565b6020808252825182820181905260009190848201906040850190845b818110156102b55783516001600160a01b031683529284019291840191600101610290565b5090969550505050505056 \ No newline at end of file diff --git a/packages/generated/v3/abis/MockCustomEntitlement.json b/packages/generated/v3/abis/MockCustomEntitlement.json new file mode 100644 index 000000000..2f910b9af --- /dev/null +++ b/packages/generated/v3/abis/MockCustomEntitlement.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isEntitled","inputs":[{"name":"user","type":"address[]","internalType":"address[]"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"setEntitled","inputs":[{"name":"user","type":"address[]","internalType":"address[]"},{"name":"userIsEntitled","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"}],"bytecode":{"object":"0x608060405234801561001057600080fd5b506102c1806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80633f4c4d831461003b578063ddc6e68e14610050575b600080fd5b61004e6100493660046101e0565b610077565b005b61006361005e366004610237565b6100c4565b604051901515815260200160405180910390f35b806000808460405160200161008c9190610274565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff19169115159190911790555050565b6000806000836040516020016100da9190610274565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1692915050565b634e487b7160e01b600052604160045260246000fd5b80356001600160a01b038116811461013657600080fd5b919050565b600082601f83011261014c57600080fd5b8135602067ffffffffffffffff8083111561016957610169610109565b8260051b604051601f19603f8301168101818110848211171561018e5761018e610109565b60405293845260208187018101949081019250878511156101ae57600080fd5b6020870191505b848210156101d5576101c68261011f565b835291830191908301906101b5565b979650505050505050565b600080604083850312156101f357600080fd5b823567ffffffffffffffff81111561020a57600080fd5b6102168582860161013b565b9250506020830135801515811461022c57600080fd5b809150509250929050565b60006020828403121561024957600080fd5b813567ffffffffffffffff81111561026057600080fd5b61026c8482850161013b565b949350505050565b6020808252825182820181905260009190848201906040850190845b818110156102b55783516001600160a01b031683529284019291840191600101610290565b5090969550505050505056","sourceMap":"159:404:320:-:0;;;254:16;;;;;;;;;;159:404;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100365760003560e01c80633f4c4d831461003b578063ddc6e68e14610050575b600080fd5b61004e6100493660046101e0565b610077565b005b61006361005e366004610237565b6100c4565b604051901515815260200160405180910390f35b806000808460405160200161008c9190610274565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff19169115159190911790555050565b6000806000836040516020016100da9190610274565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1692915050565b634e487b7160e01b600052604160045260246000fd5b80356001600160a01b038116811461013657600080fd5b919050565b600082601f83011261014c57600080fd5b8135602067ffffffffffffffff8083111561016957610169610109565b8260051b604051601f19603f8301168101818110848211171561018e5761018e610109565b60405293845260208187018101949081019250878511156101ae57600080fd5b6020870191505b848210156101d5576101c68261011f565b835291830191908301906101b5565b979650505050505050565b600080604083850312156101f357600080fd5b823567ffffffffffffffff81111561020a57600080fd5b6102168582860161013b565b9250506020830135801515811461022c57600080fd5b809150509250929050565b60006020828403121561024957600080fd5b813567ffffffffffffffff81111561026057600080fd5b61026c8482850161013b565b949350505050565b6020808252825182820181905260009190848201906040850190845b818110156102b55783516001600160a01b031683529284019291840191600101610290565b5090969550505050505056","sourceMap":"159:404:320:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;274:139;;;;;;:::i;:::-;;:::i;:::-;;417:144;;;;;;:::i;:::-;;:::i;:::-;;;2275:14:514;;2268:22;2250:41;;2238:2;2223:18;417:144:320;;;;;;;274:139;394:14;354:8;:37;384:4;373:16;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;373:16:320;;;;;;363:27;;373:16;363:27;;;;354:37;;;;;;;;;;-1:-1:-1;354:37:320;:54;;-1:-1:-1;;354:54:320;;;;;;;;;;-1:-1:-1;;274:139:320:o;417:144::-;500:4;519:8;:37;549:4;538:16;;;;;;;;:::i;:::-;;;;-1:-1:-1;;538:16:320;;;;;;;;;528:27;;538:16;528:27;;;;519:37;;;;;;;;;;-1:-1:-1;519:37:320;;;;;417:144;-1:-1:-1;;417:144:320:o;14:127:514:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:173;214:20;;-1:-1:-1;;;;;263:31:514;;253:42;;243:70;;309:1;306;299:12;243:70;146:173;;;:::o;324:914::-;378:5;431:3;424:4;416:6;412:17;408:27;398:55;;449:1;446;439:12;398:55;485:6;472:20;511:4;534:18;571:2;567;564:10;561:36;;;577:18;;:::i;:::-;623:2;620:1;616:10;655:2;649:9;718:2;714:7;709:2;705;701:11;697:25;689:6;685:38;773:6;761:10;758:22;753:2;741:10;738:18;735:46;732:72;;;784:18;;:::i;:::-;820:2;813:22;870:18;;;916:4;948:15;;;944:26;;;904:17;;;;-1:-1:-1;982:15:514;;;979:35;;;1010:1;1007;1000:12;979:35;1046:4;1038:6;1034:17;1023:28;;1060:148;1076:6;1071:3;1068:15;1060:148;;;1142:23;1161:3;1142:23;:::i;:::-;1130:36;;1186:12;;;;1093;;;;1060:148;;;1226:6;324:914;-1:-1:-1;;;;;;;324:914:514:o;1243:509::-;1333:6;1341;1394:2;1382:9;1373:7;1369:23;1365:32;1362:52;;;1410:1;1407;1400:12;1362:52;1450:9;1437:23;1483:18;1475:6;1472:30;1469:50;;;1515:1;1512;1505:12;1469:50;1538:61;1591:7;1582:6;1571:9;1567:22;1538:61;:::i;:::-;1528:71;;;1649:2;1638:9;1634:18;1621:32;1696:5;1689:13;1682:21;1675:5;1672:32;1662:60;;1718:1;1715;1708:12;1662:60;1741:5;1731:15;;;1243:509;;;;;:::o;1757:348::-;1841:6;1894:2;1882:9;1873:7;1869:23;1865:32;1862:52;;;1910:1;1907;1900:12;1862:52;1950:9;1937:23;1983:18;1975:6;1972:30;1969:50;;;2015:1;2012;2005:12;1969:50;2038:61;2091:7;2082:6;2071:9;2067:22;2038:61;:::i;:::-;2028:71;1757:348;-1:-1:-1;;;;1757:348:514:o;2302:658::-;2473:2;2525:21;;;2595:13;;2498:18;;;2617:22;;;2444:4;;2473:2;2696:15;;;;2670:2;2655:18;;;2444:4;2739:195;2753:6;2750:1;2747:13;2739:195;;;2818:13;;-1:-1:-1;;;;;2814:39:514;2802:52;;2909:15;;;;2874:12;;;;2850:1;2768:9;2739:195;;;-1:-1:-1;2951:3:514;;2302:658;-1:-1:-1;;;;;;2302:658:514:o","linkReferences":{}},"methodIdentifiers":{"isEntitled(address[])":"ddc6e68e","setEntitled(address[],bool)":"3f4c4d83"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"user\",\"type\":\"address[]\"}],\"name\":\"isEntitled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"user\",\"type\":\"address[]\"},{\"internalType\":\"bool\",\"name\":\"userIsEntitled\",\"type\":\"bool\"}],\"name\":\"setEntitled\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"isEntitled(address[])\":{\"params\":{\"user\":\"address of the user to check\"},\"returns\":{\"_0\":\"whether the user is entitled to the permission\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isEntitled(address[])\":{\"notice\":\"checks whether a user is has a given permission for a channel or a space\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/mocks/MockCustomEntitlement.sol\":\"MockCustomEntitlement\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/spaces/entitlements/ICustomEntitlement.sol\":{\"keccak256\":\"0xbb879f5fd547f6f93c898ae5d4fc5c6a738123ddac530b6a7267da9307f3e08d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://39e90fc649d84e0ccb48b067ea61d0a5564051d69b0f1dd59d13689625632e05\",\"dweb:/ipfs/QmQAB6ASqGYURyoQuPqf1SaahZtfnAEyr9me3cM3iCLT1K\"]},\"contracts/test/mocks/MockCustomEntitlement.sol\":{\"keccak256\":\"0x58f8e47c0a04408aa3704e92a04711e19a943f0c9d404cb15458e09292d31025\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f39f963d26cb282f9491cb0ab4c7708d320427dbd74953b8abf455318f3ee8b8\",\"dweb:/ipfs/QmQyi2udFz4fpBvpuUSNmgpArs9KED5aMuu9H78ZWpUULB\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address[]","name":"user","type":"address[]"}],"stateMutability":"view","type":"function","name":"isEntitled","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address[]","name":"user","type":"address[]"},{"internalType":"bool","name":"userIsEntitled","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setEntitled"}],"devdoc":{"kind":"dev","methods":{"isEntitled(address[])":{"params":{"user":"address of the user to check"},"returns":{"_0":"whether the user is entitled to the permission"}}},"version":1},"userdoc":{"kind":"user","methods":{"isEntitled(address[])":{"notice":"checks whether a user is has a given permission for a channel or a space"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/test/mocks/MockCustomEntitlement.sol":"MockCustomEntitlement"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/spaces/entitlements/ICustomEntitlement.sol":{"keccak256":"0xbb879f5fd547f6f93c898ae5d4fc5c6a738123ddac530b6a7267da9307f3e08d","urls":["bzz-raw://39e90fc649d84e0ccb48b067ea61d0a5564051d69b0f1dd59d13689625632e05","dweb:/ipfs/QmQAB6ASqGYURyoQuPqf1SaahZtfnAEyr9me3cM3iCLT1K"],"license":"Apache-2.0"},"contracts/test/mocks/MockCustomEntitlement.sol":{"keccak256":"0x58f8e47c0a04408aa3704e92a04711e19a943f0c9d404cb15458e09292d31025","urls":["bzz-raw://f39f963d26cb282f9491cb0ab4c7708d320427dbd74953b8abf455318f3ee8b8","dweb:/ipfs/QmQyi2udFz4fpBvpuUSNmgpArs9KED5aMuu9H78ZWpUULB"],"license":"Apache-2.0"}},"version":1},"id":320} \ No newline at end of file diff --git a/packages/generated/v3/abis/MockCustomEntitlement.metadata.json b/packages/generated/v3/abis/MockCustomEntitlement.metadata.json new file mode 100644 index 000000000..e0b7cbbc0 --- /dev/null +++ b/packages/generated/v3/abis/MockCustomEntitlement.metadata.json @@ -0,0 +1,118 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "user", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isEntitled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "user", + "type": "address[]" + }, + { + "internalType": "bool", + "name": "userIsEntitled", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setEntitled" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "isEntitled(address[])": { + "params": { + "user": "address of the user to check" + }, + "returns": { + "_0": "whether the user is entitled to the permission" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "isEntitled(address[])": { + "notice": "checks whether a user is has a given permission for a channel or a space" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/test/mocks/MockCustomEntitlement.sol": "MockCustomEntitlement" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/spaces/entitlements/ICustomEntitlement.sol": { + "keccak256": "0xbb879f5fd547f6f93c898ae5d4fc5c6a738123ddac530b6a7267da9307f3e08d", + "urls": [ + "bzz-raw://39e90fc649d84e0ccb48b067ea61d0a5564051d69b0f1dd59d13689625632e05", + "dweb:/ipfs/QmQAB6ASqGYURyoQuPqf1SaahZtfnAEyr9me3cM3iCLT1K" + ], + "license": "Apache-2.0" + }, + "contracts/test/mocks/MockCustomEntitlement.sol": { + "keccak256": "0x58f8e47c0a04408aa3704e92a04711e19a943f0c9d404cb15458e09292d31025", + "urls": [ + "bzz-raw://f39f963d26cb282f9491cb0ab4c7708d320427dbd74953b8abf455318f3ee8b8", + "dweb:/ipfs/QmQyi2udFz4fpBvpuUSNmgpArs9KED5aMuu9H78ZWpUULB" + ], + "license": "Apache-2.0" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/MockERC721A.abi.json b/packages/generated/v3/abis/MockERC721A.abi.json new file mode 100644 index 000000000..bd984ceb2 --- /dev/null +++ b/packages/generated/v3/abis/MockERC721A.abi.json @@ -0,0 +1,549 @@ +[ + { + "type": "function", + "name": "__ERC721A_init", + "inputs": [ + { + "name": "name_", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol_", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "burn", + "inputs": [ + { + "name": "token", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getApproved", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isApprovedForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "mint", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "mintTo", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ownerOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "setApprovalForAll", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenURI", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/MockERC721A.abi.ts b/packages/generated/v3/abis/MockERC721A.abi.ts new file mode 100644 index 000000000..cd3920491 --- /dev/null +++ b/packages/generated/v3/abis/MockERC721A.abi.ts @@ -0,0 +1,549 @@ +export default [ + { + "type": "function", + "name": "__ERC721A_init", + "inputs": [ + { + "name": "name_", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol_", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "burn", + "inputs": [ + { + "name": "token", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getApproved", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isApprovedForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "mint", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "mintTo", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ownerOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "setApprovalForAll", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenURI", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/MockERC721A.bin b/packages/generated/v3/abis/MockERC721A.bin new file mode 100644 index 000000000..fec7a38a1 --- /dev/null +++ b/packages/generated/v3/abis/MockERC721A.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b611516806100d36000396000f3fe6080604052600436106100fe5760003560e01c80636352211e11610095578063a22cb46511610064578063a22cb46514610279578063b88d4fde14610299578063c87b56dd146102ac578063d2f01f19146102cc578063e985e9c5146102ec57600080fd5b80636352211e1461020457806370a0823114610224578063755edd171461024457806395d89b411461026457600080fd5b806323b872dd116100d157806323b872dd1461019e57806340c10f19146101b157806342842e0e146101d157806342966c68146101e457600080fd5b806306fdde0314610103578063081812fc1461012e578063095ea7b31461016657806318160ddd1461017b575b600080fd5b34801561010f57600080fd5b5061011861031c565b6040516101259190611064565b60405180910390f35b34801561013a57600080fd5b5061014e610149366004611077565b6103b7565b6040516001600160a01b039091168152602001610125565b6101796101743660046110a7565b6103c8565b005b34801561018757600080fd5b506101906103d8565b604051908152602001610125565b6101796101ac3660046110d1565b6103e7565b3480156101bd57600080fd5b506101796101cc3660046110a7565b6105cc565b6101796101df3660046110d1565b6105d6565b3480156101f057600080fd5b506101796101ff366004611077565b6105f6565b34801561021057600080fd5b5061014e61021f366004611077565b610602565b34801561023057600080fd5b5061019061023f36600461110d565b61060d565b34801561025057600080fd5b5061019061025f36600461110d565b610618565b34801561027057600080fd5b50610118610634565b34801561028557600080fd5b50610179610294366004611128565b61064c565b6101796102a73660046111f0565b6106c9565b3480156102b857600080fd5b506101186102c7366004611077565b610713565b3480156102d857600080fd5b506101796102e736600461128c565b6107a4565b3480156102f857600080fd5b5061030c6103073660046112f0565b6107f8565b6040519015158152602001610125565b6060610326610804565b600201805461033490611323565b80601f016020809104026020016040519081016040528092919081815260200182805461036090611323565b80156103ad5780601f10610382576101008083540402835291602001916103ad565b820191906000526020600020905b81548152906001019060200180831161039057829003601f168201915b5050505050905090565b60006103c282610828565b92915050565b6103d482826001610875565b5050565b60006103e261092a565b905090565b60006103f282610949565b9050836001600160a01b0316816001600160a01b0316146104255760405162a1148160e81b815260040160405180910390fd5b600080610431846109e4565b9150915061045681876104413390565b6001600160a01b039081169116811491141790565b6104815761046486336107f8565b61048157604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166104a857604051633a954ecd60e21b815260040160405180910390fd5b80156104b357600082555b6104bb610804565b6001600160a01b03871660009081526005919091016020526040902080546000190190556104e7610804565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b1761051e610804565b60008681526004919091016020526040812091909155600160e11b84169003610594576001840161054d610804565b6000828152600491909101602052604081205490036105925761056e610804565b548114610592578361057e610804565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03166000805160206114f683398151915260405160405180910390a45b505050505050565b6103d48282610a0c565b6105f1838383604051806020016040528060008152506106c9565b505050565b6105ff81610b23565b50565b60006103c282610949565b60006103c282610b2e565b6000610622610b97565b905061062f826001610a0c565b919050565b606061063e610804565b600301805461033490611323565b80610655610804565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6106d48484846103e7565b6001600160a01b0383163b1561070d576106f084848484610ba7565b61070d576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061071e82610c92565b61073b57604051630a14c4b560e41b815260040160405180910390fd5b600061075260408051602081019091526000815290565b90508051600003610772576040518060200160405280600081525061079d565b8061077c84610cce565b60405160200161078d929190611357565b6040516020818303038152906040525b9392505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166107ee57604051630ef4733760e31b815260040160405180910390fd5b6103d48282610d12565b600061079d8383610d86565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b600061083382610c92565b610850576040516333d1c03960e21b815260040160405180910390fd5b610858610804565b60009283526006016020525060409020546001600160a01b031690565b600061088083610602565b905081156108bf57336001600160a01b038216146108bf576108a28133610d86565b6108bf576040516367d9dca160e11b815260040160405180910390fd5b836108c8610804565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b600080610935610804565b60010154610941610804565b540303919050565b600080610954610804565b60008481526004820160205260408120549350909150600160e01b831690036109ca57816000036109c457805483106109a057604051636f96cda160e11b815260040160405180910390fd5b5b6000199092016000818152600484016020526040902054909290915081156109a1575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b60008060006109f1610804565b60009485526006016020525050604090912080549092909150565b6000610a16610804565b5490506000829003610a3b5760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202610a4f610804565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717610a8a610804565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083906000805160206114f68339815191528180a4600183015b818114610af057808360006000805160206114f6833981519152600080a4600101610aca565b5081600003610b1157604051622e076360e81b815260040160405180910390fd5b80610b1a610804565b55506105f19050565b6105ff816000610dc3565b60006001600160a01b038216610b57576040516323d3ad8160e21b815260040160405180910390fd5b67ffffffffffffffff610b68610804565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6000610ba1610804565b54919050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290610bdc903390899088908890600401611386565b6020604051808303816000875af1925050508015610c17575060408051601f3d908101601f19168201909252610c14918101906113c3565b60015b610c75573d808015610c45576040519150601f19603f3d011682016040523d82523d6000602084013e610c4a565b606091505b508051600003610c6d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000610c9c610804565b54821080156103c25750600160e01b610cb3610804565b60008481526004919091016020526040902054161592915050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480610ce85750819003601f19909101908152919050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff16610d5c57604051630ef4733760e31b815260040160405180910390fd5b610d6c6380ac58cd60e01b610f04565b610d7c635b5e139f60e01b610f04565b6103d48282610fe2565b6000610d90610804565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b6000610dce83610949565b905080600080610ddd866109e4565b915091508415610e1d57610df2818433610441565b610e1d57610e008333610d86565b610e1d57604051632ce44b5f60e11b815260040160405180910390fd5b8015610e2857600082555b6000610e32610804565b6001600160a01b0385166000818152600583016020526040902080546fffffffffffffffffffffffffffffffff0190559091504260a01b17600360e01b176000888152600483016020526040812091909155600160e11b86169003610eca576001870160008181526004830160205260408120549003610ec85781548114610ec857600081815260048301602052604090208690555b505b60405187906000906001600160a01b038716906000805160206114f6833981519152908390a4600190810180549091019055505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610f91576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610faa565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6000610fec610804565b905060028101610ffc8482611435565b506003810161100b8382611435565b50600090555050565b60005b8381101561102f578181015183820152602001611017565b50506000910152565b60008151808452611050816020860160208601611014565b601f01601f19169290920160200192915050565b60208152600061079d6020830184611038565b60006020828403121561108957600080fd5b5035919050565b80356001600160a01b038116811461062f57600080fd5b600080604083850312156110ba57600080fd5b6110c383611090565b946020939093013593505050565b6000806000606084860312156110e657600080fd5b6110ef84611090565b92506110fd60208501611090565b9150604084013590509250925092565b60006020828403121561111f57600080fd5b61079d82611090565b6000806040838503121561113b57600080fd5b61114483611090565b91506020830135801515811461115957600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561119557611195611164565b604051601f8501601f19908116603f011681019082821181831017156111bd576111bd611164565b816040528093508581528686860111156111d657600080fd5b858560208301376000602087830101525050509392505050565b6000806000806080858703121561120657600080fd5b61120f85611090565b935061121d60208601611090565b925060408501359150606085013567ffffffffffffffff81111561124057600080fd5b8501601f8101871361125157600080fd5b6112608782356020840161117a565b91505092959194509250565b600082601f83011261127d57600080fd5b61079d8383356020850161117a565b6000806040838503121561129f57600080fd5b823567ffffffffffffffff808211156112b757600080fd5b6112c38683870161126c565b935060208501359150808211156112d957600080fd5b506112e68582860161126c565b9150509250929050565b6000806040838503121561130357600080fd5b61130c83611090565b915061131a60208401611090565b90509250929050565b600181811c9082168061133757607f821691505b6020821081036109c457634e487b7160e01b600052602260045260246000fd5b60008351611369818460208801611014565b83519083019061137d818360208801611014565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906113b990830184611038565b9695505050505050565b6000602082840312156113d557600080fd5b81516001600160e01b03198116811461079d57600080fd5b601f8211156105f1576000816000526020600020601f850160051c810160208610156114165750805b601f850160051c820191505b818110156105c457828155600101611422565b815167ffffffffffffffff81111561144f5761144f611164565b6114638161145d8454611323565b846113ed565b602080601f83116001811461149857600084156114805750858301515b600019600386901b1c1916600185901b1785556105c4565b600085815260208120601f198616915b828110156114c7578886015182559484019460019091019084016114a8565b50858210156114e55787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef \ No newline at end of file diff --git a/packages/generated/v3/abis/MockERC721A.json b/packages/generated/v3/abis/MockERC721A.json new file mode 100644 index 000000000..e105f86d7 --- /dev/null +++ b/packages/generated/v3/abis/MockERC721A.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__ERC721A_init","inputs":[{"name":"name_","type":"string","internalType":"string"},{"name":"symbol_","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"approve","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"balanceOf","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"burn","inputs":[{"name":"token","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getApproved","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"isApprovedForAll","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"mint","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"mintTo","inputs":[{"name":"to","type":"address","internalType":"address"}],"outputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"ownerOf","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"setApprovalForAll","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"tokenURI","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"ConsecutiveTransfer","inputs":[{"name":"fromTokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"toTokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"ApprovalCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"ApprovalQueryForNonexistentToken","inputs":[]},{"type":"error","name":"BalanceQueryForZeroAddress","inputs":[]},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"MintERC2309QuantityExceedsLimit","inputs":[]},{"type":"error","name":"MintToZeroAddress","inputs":[]},{"type":"error","name":"MintZeroQuantity","inputs":[]},{"type":"error","name":"OwnerQueryForNonexistentToken","inputs":[]},{"type":"error","name":"OwnershipNotInitializedForExtraData","inputs":[]},{"type":"error","name":"TransferCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"TransferFromIncorrectOwner","inputs":[]},{"type":"error","name":"TransferToNonERC721ReceiverImplementer","inputs":[]},{"type":"error","name":"TransferToZeroAddress","inputs":[]},{"type":"error","name":"URIQueryForNonexistentToken","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b611516806100d36000396000f3fe6080604052600436106100fe5760003560e01c80636352211e11610095578063a22cb46511610064578063a22cb46514610279578063b88d4fde14610299578063c87b56dd146102ac578063d2f01f19146102cc578063e985e9c5146102ec57600080fd5b80636352211e1461020457806370a0823114610224578063755edd171461024457806395d89b411461026457600080fd5b806323b872dd116100d157806323b872dd1461019e57806340c10f19146101b157806342842e0e146101d157806342966c68146101e457600080fd5b806306fdde0314610103578063081812fc1461012e578063095ea7b31461016657806318160ddd1461017b575b600080fd5b34801561010f57600080fd5b5061011861031c565b6040516101259190611064565b60405180910390f35b34801561013a57600080fd5b5061014e610149366004611077565b6103b7565b6040516001600160a01b039091168152602001610125565b6101796101743660046110a7565b6103c8565b005b34801561018757600080fd5b506101906103d8565b604051908152602001610125565b6101796101ac3660046110d1565b6103e7565b3480156101bd57600080fd5b506101796101cc3660046110a7565b6105cc565b6101796101df3660046110d1565b6105d6565b3480156101f057600080fd5b506101796101ff366004611077565b6105f6565b34801561021057600080fd5b5061014e61021f366004611077565b610602565b34801561023057600080fd5b5061019061023f36600461110d565b61060d565b34801561025057600080fd5b5061019061025f36600461110d565b610618565b34801561027057600080fd5b50610118610634565b34801561028557600080fd5b50610179610294366004611128565b61064c565b6101796102a73660046111f0565b6106c9565b3480156102b857600080fd5b506101186102c7366004611077565b610713565b3480156102d857600080fd5b506101796102e736600461128c565b6107a4565b3480156102f857600080fd5b5061030c6103073660046112f0565b6107f8565b6040519015158152602001610125565b6060610326610804565b600201805461033490611323565b80601f016020809104026020016040519081016040528092919081815260200182805461036090611323565b80156103ad5780601f10610382576101008083540402835291602001916103ad565b820191906000526020600020905b81548152906001019060200180831161039057829003601f168201915b5050505050905090565b60006103c282610828565b92915050565b6103d482826001610875565b5050565b60006103e261092a565b905090565b60006103f282610949565b9050836001600160a01b0316816001600160a01b0316146104255760405162a1148160e81b815260040160405180910390fd5b600080610431846109e4565b9150915061045681876104413390565b6001600160a01b039081169116811491141790565b6104815761046486336107f8565b61048157604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166104a857604051633a954ecd60e21b815260040160405180910390fd5b80156104b357600082555b6104bb610804565b6001600160a01b03871660009081526005919091016020526040902080546000190190556104e7610804565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b1761051e610804565b60008681526004919091016020526040812091909155600160e11b84169003610594576001840161054d610804565b6000828152600491909101602052604081205490036105925761056e610804565b548114610592578361057e610804565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03166000805160206114f683398151915260405160405180910390a45b505050505050565b6103d48282610a0c565b6105f1838383604051806020016040528060008152506106c9565b505050565b6105ff81610b23565b50565b60006103c282610949565b60006103c282610b2e565b6000610622610b97565b905061062f826001610a0c565b919050565b606061063e610804565b600301805461033490611323565b80610655610804565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6106d48484846103e7565b6001600160a01b0383163b1561070d576106f084848484610ba7565b61070d576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061071e82610c92565b61073b57604051630a14c4b560e41b815260040160405180910390fd5b600061075260408051602081019091526000815290565b90508051600003610772576040518060200160405280600081525061079d565b8061077c84610cce565b60405160200161078d929190611357565b6040516020818303038152906040525b9392505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166107ee57604051630ef4733760e31b815260040160405180910390fd5b6103d48282610d12565b600061079d8383610d86565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b600061083382610c92565b610850576040516333d1c03960e21b815260040160405180910390fd5b610858610804565b60009283526006016020525060409020546001600160a01b031690565b600061088083610602565b905081156108bf57336001600160a01b038216146108bf576108a28133610d86565b6108bf576040516367d9dca160e11b815260040160405180910390fd5b836108c8610804565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b600080610935610804565b60010154610941610804565b540303919050565b600080610954610804565b60008481526004820160205260408120549350909150600160e01b831690036109ca57816000036109c457805483106109a057604051636f96cda160e11b815260040160405180910390fd5b5b6000199092016000818152600484016020526040902054909290915081156109a1575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b60008060006109f1610804565b60009485526006016020525050604090912080549092909150565b6000610a16610804565b5490506000829003610a3b5760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202610a4f610804565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717610a8a610804565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083906000805160206114f68339815191528180a4600183015b818114610af057808360006000805160206114f6833981519152600080a4600101610aca565b5081600003610b1157604051622e076360e81b815260040160405180910390fd5b80610b1a610804565b55506105f19050565b6105ff816000610dc3565b60006001600160a01b038216610b57576040516323d3ad8160e21b815260040160405180910390fd5b67ffffffffffffffff610b68610804565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6000610ba1610804565b54919050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290610bdc903390899088908890600401611386565b6020604051808303816000875af1925050508015610c17575060408051601f3d908101601f19168201909252610c14918101906113c3565b60015b610c75573d808015610c45576040519150601f19603f3d011682016040523d82523d6000602084013e610c4a565b606091505b508051600003610c6d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000610c9c610804565b54821080156103c25750600160e01b610cb3610804565b60008481526004919091016020526040902054161592915050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480610ce85750819003601f19909101908152919050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff16610d5c57604051630ef4733760e31b815260040160405180910390fd5b610d6c6380ac58cd60e01b610f04565b610d7c635b5e139f60e01b610f04565b6103d48282610fe2565b6000610d90610804565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b6000610dce83610949565b905080600080610ddd866109e4565b915091508415610e1d57610df2818433610441565b610e1d57610e008333610d86565b610e1d57604051632ce44b5f60e11b815260040160405180910390fd5b8015610e2857600082555b6000610e32610804565b6001600160a01b0385166000818152600583016020526040902080546fffffffffffffffffffffffffffffffff0190559091504260a01b17600360e01b176000888152600483016020526040812091909155600160e11b86169003610eca576001870160008181526004830160205260408120549003610ec85781548114610ec857600081815260048301602052604090208690555b505b60405187906000906001600160a01b038716906000805160206114f6833981519152908390a4600190810180549091019055505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610f91576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610faa565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6000610fec610804565b905060028101610ffc8482611435565b506003810161100b8382611435565b50600090555050565b60005b8381101561102f578181015183820152602001611017565b50506000910152565b60008151808452611050816020860160208601611014565b601f01601f19169290920160200192915050565b60208152600061079d6020830184611038565b60006020828403121561108957600080fd5b5035919050565b80356001600160a01b038116811461062f57600080fd5b600080604083850312156110ba57600080fd5b6110c383611090565b946020939093013593505050565b6000806000606084860312156110e657600080fd5b6110ef84611090565b92506110fd60208501611090565b9150604084013590509250925092565b60006020828403121561111f57600080fd5b61079d82611090565b6000806040838503121561113b57600080fd5b61114483611090565b91506020830135801515811461115957600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561119557611195611164565b604051601f8501601f19908116603f011681019082821181831017156111bd576111bd611164565b816040528093508581528686860111156111d657600080fd5b858560208301376000602087830101525050509392505050565b6000806000806080858703121561120657600080fd5b61120f85611090565b935061121d60208601611090565b925060408501359150606085013567ffffffffffffffff81111561124057600080fd5b8501601f8101871361125157600080fd5b6112608782356020840161117a565b91505092959194509250565b600082601f83011261127d57600080fd5b61079d8383356020850161117a565b6000806040838503121561129f57600080fd5b823567ffffffffffffffff808211156112b757600080fd5b6112c38683870161126c565b935060208501359150808211156112d957600080fd5b506112e68582860161126c565b9150509250929050565b6000806040838503121561130357600080fd5b61130c83611090565b915061131a60208401611090565b90509250929050565b600181811c9082168061133757607f821691505b6020821081036109c457634e487b7160e01b600052602260045260246000fd5b60008351611369818460208801611014565b83519083019061137d818360208801611014565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906113b990830184611038565b9695505050505050565b6000602082840312156113d557600080fd5b81516001600160e01b03198116811461079d57600080fd5b601f8211156105f1576000816000526020600020601f850160051c810160208610156114165750805b601f850160051c820191505b818110156105c457828155600101611422565b815167ffffffffffffffff81111561144f5761144f611164565b6114638161145d8454611323565b846113ed565b602080601f83116001811461149857600084156114805750858301515b600019600386901b1c1916600185901b1785556105c4565b600085815260208120601f198616915b828110156114c7578886015182559484019460019091019084016114a8565b50858210156114e55787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","sourceMap":"188:302:327:-:0;;;;;;;;;;;;-1:-1:-1;385:22:70;:20;:22::i;:::-;188:302:327;;1653:314:84;303:66:85;1779:14:84;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:84;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:84;1898:16;1886:28;;;;;1927:29;;158:42:514;;;1927:29:84;;146:2:514;131:18;1927:29:84;;;;;;;1844:119;1694:273;1653:314::o;14:192:514:-;188:302:327;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106100fe5760003560e01c80636352211e11610095578063a22cb46511610064578063a22cb46514610279578063b88d4fde14610299578063c87b56dd146102ac578063d2f01f19146102cc578063e985e9c5146102ec57600080fd5b80636352211e1461020457806370a0823114610224578063755edd171461024457806395d89b411461026457600080fd5b806323b872dd116100d157806323b872dd1461019e57806340c10f19146101b157806342842e0e146101d157806342966c68146101e457600080fd5b806306fdde0314610103578063081812fc1461012e578063095ea7b31461016657806318160ddd1461017b575b600080fd5b34801561010f57600080fd5b5061011861031c565b6040516101259190611064565b60405180910390f35b34801561013a57600080fd5b5061014e610149366004611077565b6103b7565b6040516001600160a01b039091168152602001610125565b6101796101743660046110a7565b6103c8565b005b34801561018757600080fd5b506101906103d8565b604051908152602001610125565b6101796101ac3660046110d1565b6103e7565b3480156101bd57600080fd5b506101796101cc3660046110a7565b6105cc565b6101796101df3660046110d1565b6105d6565b3480156101f057600080fd5b506101796101ff366004611077565b6105f6565b34801561021057600080fd5b5061014e61021f366004611077565b610602565b34801561023057600080fd5b5061019061023f36600461110d565b61060d565b34801561025057600080fd5b5061019061025f36600461110d565b610618565b34801561027057600080fd5b50610118610634565b34801561028557600080fd5b50610179610294366004611128565b61064c565b6101796102a73660046111f0565b6106c9565b3480156102b857600080fd5b506101186102c7366004611077565b610713565b3480156102d857600080fd5b506101796102e736600461128c565b6107a4565b3480156102f857600080fd5b5061030c6103073660046112f0565b6107f8565b6040519015158152602001610125565b6060610326610804565b600201805461033490611323565b80601f016020809104026020016040519081016040528092919081815260200182805461036090611323565b80156103ad5780601f10610382576101008083540402835291602001916103ad565b820191906000526020600020905b81548152906001019060200180831161039057829003601f168201915b5050505050905090565b60006103c282610828565b92915050565b6103d482826001610875565b5050565b60006103e261092a565b905090565b60006103f282610949565b9050836001600160a01b0316816001600160a01b0316146104255760405162a1148160e81b815260040160405180910390fd5b600080610431846109e4565b9150915061045681876104413390565b6001600160a01b039081169116811491141790565b6104815761046486336107f8565b61048157604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166104a857604051633a954ecd60e21b815260040160405180910390fd5b80156104b357600082555b6104bb610804565b6001600160a01b03871660009081526005919091016020526040902080546000190190556104e7610804565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b1761051e610804565b60008681526004919091016020526040812091909155600160e11b84169003610594576001840161054d610804565b6000828152600491909101602052604081205490036105925761056e610804565b548114610592578361057e610804565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03166000805160206114f683398151915260405160405180910390a45b505050505050565b6103d48282610a0c565b6105f1838383604051806020016040528060008152506106c9565b505050565b6105ff81610b23565b50565b60006103c282610949565b60006103c282610b2e565b6000610622610b97565b905061062f826001610a0c565b919050565b606061063e610804565b600301805461033490611323565b80610655610804565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6106d48484846103e7565b6001600160a01b0383163b1561070d576106f084848484610ba7565b61070d576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061071e82610c92565b61073b57604051630a14c4b560e41b815260040160405180910390fd5b600061075260408051602081019091526000815290565b90508051600003610772576040518060200160405280600081525061079d565b8061077c84610cce565b60405160200161078d929190611357565b6040516020818303038152906040525b9392505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166107ee57604051630ef4733760e31b815260040160405180910390fd5b6103d48282610d12565b600061079d8383610d86565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b600061083382610c92565b610850576040516333d1c03960e21b815260040160405180910390fd5b610858610804565b60009283526006016020525060409020546001600160a01b031690565b600061088083610602565b905081156108bf57336001600160a01b038216146108bf576108a28133610d86565b6108bf576040516367d9dca160e11b815260040160405180910390fd5b836108c8610804565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b600080610935610804565b60010154610941610804565b540303919050565b600080610954610804565b60008481526004820160205260408120549350909150600160e01b831690036109ca57816000036109c457805483106109a057604051636f96cda160e11b815260040160405180910390fd5b5b6000199092016000818152600484016020526040902054909290915081156109a1575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b60008060006109f1610804565b60009485526006016020525050604090912080549092909150565b6000610a16610804565b5490506000829003610a3b5760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202610a4f610804565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717610a8a610804565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083906000805160206114f68339815191528180a4600183015b818114610af057808360006000805160206114f6833981519152600080a4600101610aca565b5081600003610b1157604051622e076360e81b815260040160405180910390fd5b80610b1a610804565b55506105f19050565b6105ff816000610dc3565b60006001600160a01b038216610b57576040516323d3ad8160e21b815260040160405180910390fd5b67ffffffffffffffff610b68610804565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6000610ba1610804565b54919050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290610bdc903390899088908890600401611386565b6020604051808303816000875af1925050508015610c17575060408051601f3d908101601f19168201909252610c14918101906113c3565b60015b610c75573d808015610c45576040519150601f19603f3d011682016040523d82523d6000602084013e610c4a565b606091505b508051600003610c6d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000610c9c610804565b54821080156103c25750600160e01b610cb3610804565b60008481526004919091016020526040902054161592915050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480610ce85750819003601f19909101908152919050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff16610d5c57604051630ef4733760e31b815260040160405180910390fd5b610d6c6380ac58cd60e01b610f04565b610d7c635b5e139f60e01b610f04565b6103d48282610fe2565b6000610d90610804565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b6000610dce83610949565b905080600080610ddd866109e4565b915091508415610e1d57610df2818433610441565b610e1d57610e008333610d86565b610e1d57604051632ce44b5f60e11b815260040160405180910390fd5b8015610e2857600082555b6000610e32610804565b6001600160a01b0385166000818152600583016020526040902080546fffffffffffffffffffffffffffffffff0190559091504260a01b17600360e01b176000888152600483016020526040812091909155600160e11b86169003610eca576001870160008181526004830160205260408120549003610ec85781548114610ec857600081815260048301602052604090208690555b505b60405187906000906001600160a01b038716906000805160206114f6833981519152908390a4600190810180549091019055505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610f91576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610faa565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6000610fec610804565b905060028101610ffc8482611435565b506003810161100b8382611435565b50600090555050565b60005b8381101561102f578181015183820152602001611017565b50506000910152565b60008151808452611050816020860160208601611014565b601f01601f19169290920160200192915050565b60208152600061079d6020830184611038565b60006020828403121561108957600080fd5b5035919050565b80356001600160a01b038116811461062f57600080fd5b600080604083850312156110ba57600080fd5b6110c383611090565b946020939093013593505050565b6000806000606084860312156110e657600080fd5b6110ef84611090565b92506110fd60208501611090565b9150604084013590509250925092565b60006020828403121561111f57600080fd5b61079d82611090565b6000806040838503121561113b57600080fd5b61114483611090565b91506020830135801515811461115957600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561119557611195611164565b604051601f8501601f19908116603f011681019082821181831017156111bd576111bd611164565b816040528093508581528686860111156111d657600080fd5b858560208301376000602087830101525050509392505050565b6000806000806080858703121561120657600080fd5b61120f85611090565b935061121d60208601611090565b925060408501359150606085013567ffffffffffffffff81111561124057600080fd5b8501601f8101871361125157600080fd5b6112608782356020840161117a565b91505092959194509250565b600082601f83011261127d57600080fd5b61079d8383356020850161117a565b6000806040838503121561129f57600080fd5b823567ffffffffffffffff808211156112b757600080fd5b6112c38683870161126c565b935060208501359150808211156112d957600080fd5b506112e68582860161126c565b9150509250929050565b6000806040838503121561130357600080fd5b61130c83611090565b915061131a60208401611090565b90509250929050565b600181811c9082168061133757607f821691505b6020821081036109c457634e487b7160e01b600052602260045260246000fd5b60008351611369818460208801611014565b83519083019061137d818360208801611014565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906113b990830184611038565b9695505050505050565b6000602082840312156113d557600080fd5b81516001600160e01b03198116811461079d57600080fd5b601f8211156105f1576000816000526020600020601f850160051c810160208610156114165750805b601f850160051c820191505b818110156105c457828155600101611422565b815167ffffffffffffffff81111561144f5761144f611164565b6114638161145d8454611323565b846113ed565b602080601f83116001811461149857600084156114805750858301515b600019600386901b1c1916600185901b1785556105c4565b600085815260208120601f198616915b828110156114c7578886015182559484019460019091019084016114a8565b50858210156114e55787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","sourceMap":"188:302:327:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2044:116:127;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3522:132;;;;;;;;;;-1:-1:-1;3522:132:127;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1119:32:514;;;1101:51;;1089:2;1074:18;3522:132:127;955:203:514;3260:128:127;;;;;;:::i;:::-;;:::i;:::-;;1527:93;;;;;;;;;;;;;:::i;:::-;;;1746:25:514;;;1734:2;1719:18;1527:93:127;1600:177:514;4917:2680:127;;;;;;:::i;:::-;;:::i;344:79:327:-;;;;;;;;;;-1:-1:-1;344:79:327;;;;;:::i;:::-;;:::i;7680:167:127:-;;;;;;:::i;:::-;;:::i;427:61:327:-;;;;;;;;;;-1:-1:-1;427:61:327;;;;;:::i;:::-;;:::i;2891:152:127:-;;;;;;;;;;-1:-1:-1;2891:152:127;;;;;:::i;:::-;;:::i;1697:107::-;;;;;;;;;;-1:-1:-1;1697:107:127;;;;;:::i;:::-;;:::i;224:116:327:-;;;;;;;;;;-1:-1:-1;224:116:327;;;;;:::i;:::-;;:::i;2223:120:127:-;;;;;;;;;;;;;:::i;3957:269::-;;;;;;;;;;-1:-1:-1;3957:269:127;;;;;:::i;:::-;;:::i;8396:348::-;;;;;;:::i;:::-;;:::i;2436:329::-;;;;;;;;;;-1:-1:-1;2436:329:127;;;;;:::i;:::-;;:::i;876:157::-;;;;;;;;;;-1:-1:-1;876:157:127;;;;;:::i;:::-;;:::i;4364:167::-;;;;;;;;;;-1:-1:-1;4364:167:127;;;;;:::i;:::-;;:::i;:::-;;;5301:14:514;;5294:22;5276:41;;5264:2;5249:18;4364:167:127;5136:187:514;2044:116:127;2098:13;2126:23;:21;:23::i;:::-;:29;;2119:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2044:116;:::o;3522:132::-;3606:7;3628:21;3641:7;3628:12;:21::i;:::-;3621:28;3522:132;-1:-1:-1;;3522:132:127:o;3260:128::-;3356:27;3365:2;3369:7;3378:4;3356:8;:27::i;:::-;3260:128;;:::o;1527:93::-;1579:7;1601:14;:12;:14::i;:::-;1594:21;;1527:93;:::o;4917:2680::-;5036:27;5066;5085:7;5066:18;:27::i;:::-;5036:57;;5145:4;-1:-1:-1;;;;;5104:45:127;5120:19;-1:-1:-1;;;;;5104:45:127;;5100:92;;5164:28;;-1:-1:-1;;;5164:28:127;;;;;;;;;;;5100:92;5207:27;5242:23;5274:35;5301:7;5274:26;:35::i;:::-;5199:110;;;;5398:68;5423:15;5440:4;5446:19;29371:10:128;;29289:97;5446:19:127;-1:-1:-1;;;;;11877:32:128;;;11735:28;;11992:20;;12014:30;;11989:56;;11468:587;5398:68:127;5393:181;;5479:43;5496:4;29371:10:128;4364:167:127;:::i;5479:43::-;5474:100;;5539:35;;-1:-1:-1;;;5539:35:127;;;;;;;;;;;5474:100;-1:-1:-1;;;;;5585:16:127;;5581:52;;5610:23;;-1:-1:-1;;;5610:23:127;;;;;;;;;;;5581:52;5758:15;5755:135;;;5880:1;5859:19;5852:30;5755:135;6230:23;:21;:23::i;:::-;-1:-1:-1;;;;;6230:48:127;;;;;;:42;;;;;:48;;;;;6228:50;;-1:-1:-1;;6228:50:127;;;6316:23;:21;:23::i;:::-;-1:-1:-1;;;;;6316:46:127;;;;;;:42;;;;;:46;;;;;;6314:48;;;;;;10236:11:128;10211:23;10207:41;10194:63;-1:-1:-1;;;10194:63:128;6590:23:127;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;:184;;;;-1:-1:-1;;;6879:47:127;;:52;;6875:625;;6975:1;6965:11;;7080:23;:21;:23::i;:::-;:54;;;;:41;;;;;:54;;;;;;:59;;7076:416;;7220:23;:21;:23::i;:::-;:37;7205:52;;7201:281;;7450:19;7365:23;:21;:23::i;:::-;:82;;;;:41;;;;;:82;;;;;:104;7201:281;6933:567;6875:625;7536:7;7532:2;-1:-1:-1;;;;;7517:27:127;7526:4;-1:-1:-1;;;;;7517:27:127;-1:-1:-1;;;;;;;;;;;7517:27:127;;;;;;;;;7550:42;5030:2567;;;4917:2680;;;:::o;344:79:327:-;401:17;407:2;411:6;401:5;:17::i;7680:167:127:-;7803:39;7820:4;7826:2;7830:7;7803:39;;;;;;;;;;;;:16;:39::i;:::-;7680:167;;;:::o;427:61:327:-;471:12;477:5;471;:12::i;:::-;427:61;:::o;2891:152:127:-;2971:7;3009:27;3028:7;3009:18;:27::i;1697:107::-;1760:7;1782:17;1793:5;1782:10;:17::i;224:116:327:-;270:15;303:14;:12;:14::i;:::-;293:24;;323:12;329:2;333:1;323:5;:12::i;:::-;224:116;;;:::o;2223:120:127:-;2279:13;2307:23;:21;:23::i;:::-;:31;;2300:38;;;;;:::i;3957:269::-;4147:8;4059:23;:21;:23::i;:::-;29371:10:128;4059:63:127;;;;:42;;;;;:63;;;;;;;;-1:-1:-1;;;;;4059:85:127;;;;;;;;;;;;:96;;-1:-1:-1;;4059:96:127;;;;;;;;;;;4166:55;;5301:14:514;;5294:22;5276:41;;4059:85:127;;29371:10:128;;4166:55:127;;5249:18:514;4166:55:127;;;;;;;3957:269;;:::o;8396:348::-;8543:31;8556:4;8562:2;8566:7;8543:12;:31::i;:::-;-1:-1:-1;;;;;8584:14:127;;;:19;8580:160;;8616:56;8647:4;8653:2;8657:7;8666:5;8616:30;:56::i;:::-;8611:129;;8691:40;;-1:-1:-1;;;8691:40:127;;;;;;;;;;;8611:129;8396:348;;;;:::o;2436:329::-;2517:13;2543:16;2551:7;2543;:16::i;:::-;2538:59;;2568:29;;-1:-1:-1;;;2568:29:127;;;;;;;;;;;2538:59;2604:21;2628:10;6624:9:128;;;;;;;;;-1:-1:-1;6624:9:128;;;6552:86;2628:10:127;2604:34;;2663:7;2657:21;2682:1;2657:26;:103;;;;;;;;;;;;;;;;;2718:7;2727:18;2737:7;2727:9;:18::i;:::-;2701:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2657:103;2644:116;2436:329;-1:-1:-1;;;2436:329:127:o;876:157::-;303:66:85;1263:42:84;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:84;;;;;;;;;;;1258:100;988:40:127::1;1013:5;1020:7;988:24;:40::i;4364:167::-:0;4473:4;4492:34;4510:5;4517:8;4492:17;:34::i;1696:139:130:-;300:66;;1696:139::o;22511:230:128:-;22589:7;22609:16;22617:7;22609;:16::i;:::-;22604:64;;22634:34;;-1:-1:-1;;;22634:34:128;;;;;;;;;;;22604:64;22682:23;:21;:23::i;:::-;:48;;;;:39;;:48;;-1:-1:-1;22682:48:128;;;:54;-1:-1:-1;;;;;22682:54:128;;22511:230::o;23291:439::-;23397:13;23413:17;23422:7;23413:8;:17::i;:::-;23397:33;;23441:13;23437:184;;;29371:10;-1:-1:-1;;;;;23466:28:128;;;23462:159;;23509:45;23527:5;29371:10;23509:17;:45::i;:::-;23504:117;;23575:35;;-1:-1:-1;;;23575:35:128;;;;;;;;;;;23504:117;23684:2;23627:23;:21;:23::i;:::-;:48;;;;:39;;;;;:48;;;;;;:59;;-1:-1:-1;;;;;;23627:59:128;-1:-1:-1;;;;;23627:59:128;;;;;;23697:28;23627:48;;23697:28;;;;;;;;;;23627:48;23697:28;23391:339;23291:439;;;:::o;2985:351::-;3032:7;;3263:23;:21;:23::i;:::-;:36;;;3215:23;:21;:23::i;:::-;:37;:84;:110;;2985:351;-1:-1:-1;2985:351:128:o;7836:1501::-;7912:14;7974:32;8009:23;:21;:23::i;:::-;8050:29;;;;:20;;;:29;;;;;;;-1:-1:-1;7974:58:128;;-1:-1:-1;;;;8115:24:128;;:29;;8111:1172;;8236:6;8246:1;8236:11;8232:791;;8276:16;;8265:27;;8261:83;;8313:31;;-1:-1:-1;;;8313:31:128;;;;;;;;;;;8261:83;8831:182;-1:-1:-1;;8910:9:128;;;8889:31;;;;:20;;;:31;;;;;;8910:9;;8889:31;;-1:-1:-1;8948:25:128;;8831:182;8948:25;;8987:13;7836:1501;;;:::o;8111:1172::-;7966:1323;9301:31;;-1:-1:-1;;;9301:31:128;;;;;;;;;;;12155:478;12251:27;12280:23;12313:38;12354:30;:28;:30::i;:::-;:62;;;;:53;;:62;;-1:-1:-1;;12354:62:128;;;;12597:26;;12354:62;;12597:26;;-1:-1:-1;12155:478:128:o;15806:2642::-;15874:20;15897:23;:21;:23::i;:::-;:37;;-1:-1:-1;15897:37:128;15944:13;;;15940:44;;15966:18;;-1:-1:-1;;;15966:18:128;;;;;;;;;;;15940:44;16481:32;16461:53;;16403:23;:21;:23::i;:::-;-1:-1:-1;;;;;16403:46:128;;;;;;:42;;;;;:46;;;;;;:111;;;;;;;;;10236:11;10211:23;10207:41;-1:-1:-1;10631:15:128;;10605:24;10601:46;10204:52;10194:63;16714:23;:21;:23::i;:::-;:71;;;;:41;;;;;:71;;;;;:188;;;;-1:-1:-1;;;;;17423:25:128;;;16949:23;;;;16765:12;;17423:25;;-1:-1:-1;;;;;;;;;;;16714:71:128;;17495:260;18033:1;18019:12;18015:20;17984:275;18065:3;18056:7;18053:16;17984:275;;18241:7;18231:8;18228:1;-1:-1:-1;;;;;;;;;;;18198:1:128;18195;18190:59;18107:1;18094:15;17984:275;;;17988:57;18278:8;18290:1;18278:13;18274:45;;18300:19;;-1:-1:-1;;;18300:19:128;;;;;;;;;;;18274:45;18368:3;18328:23;:21;:23::i;:::-;:43;-1:-1:-1;18383:60:128;;-1:-1:-1;8396:348:127;23974:81:128;24029:21;24035:7;24044:5;24029;:21::i;3340:242::-;3398:7;-1:-1:-1;;;;;3417:19:128;;3413:60;;3445:28;;-1:-1:-1;;;3445:28:128;;;;;;;;;;;3413:60;571:13;3492:23;:21;:23::i;:::-;:42;;:49;3535:5;-1:-1:-1;;;;;3492:49:128;-1:-1:-1;;;;;3492:49:128;;;;;;;;;;;;;:85;3479:98;;3340:242;;;:::o;4042:119::-;4097:7;4119:23;:21;:23::i;:::-;:37;;4042:119;-1:-1:-1;4042:119:128:o;14714:674::-;14877:139;;-1:-1:-1;;;14877:139:128;;14855:4;;-1:-1:-1;;;;;14877:56:128;;;;;:139;;29371:10;;14972:4;;14986:7;;15003:5;;14877:139;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14877:139:128;;;;;;;;-1:-1:-1;;14877:139:128;;;;;;;;;;;;:::i;:::-;;;14867:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15199:6;:13;15216:1;15199:18;15195:183;;15236:40;;-1:-1:-1;;;15236:40:128;;;;;;;;;;;15195:183;15352:6;15346:13;15337:6;15333:2;15329:15;15322:38;14867:517;-1:-1:-1;;;;;;15068:83:128;-1:-1:-1;;;15068:83:128;;-1:-1:-1;14714:674:128;;;;;;:::o;11071:301::-;11136:4;11207:23;:21;:23::i;:::-;:37;11197:47;;11161:187;;;;;-1:-1:-1;;;11275:23:128;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;;:68;:73;11148:200;11071:301;-1:-1:-1;;11071:301:128:o;29475:1574::-;29548:17;29942:4;29935;29929:11;29925:22;30020:1;30014:4;30007:15;30081:4;30078:1;30074:12;30067:19;;;30149:1;30144:3;30137:14;30238:3;30448:5;30430:419;30495:1;30490:3;30486:11;30479:18;;30663:2;30657:4;30653:13;30649:2;30645:22;30640:3;30632:36;30755:2;30745:13;;30810:25;30430:419;30810:25;-1:-1:-1;30871:13:128;;;-1:-1:-1;;30972:14:128;;;31020:19;;;30972:14;29475:1574;-1:-1:-1;29475:1574:128:o;1037:299:127:-;303:66:85;1263:42:84;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:84;;;;;;;;;;;1258:100;1159:25:127::1;-1:-1:-1::0;;;1159:13:127::1;:25::i;:::-;1224;-1:-1:-1::0;;;1224:13:127::1;:25::i;:::-;1297:34;1316:5;1323:7;1297:18;:34::i;22321:186:128:-:0;22424:4;22443:23;:21;:23::i;:::-;-1:-1:-1;;;;;22443:49:128;;;;;;;:42;;;;;:49;;;;;;;;:59;;;;;;;;;;-1:-1:-1;22443:59:128;;;;;22321:186::o;24250:2801::-;24325:27;24355;24374:7;24355:18;:27::i;:::-;24325:57;-1:-1:-1;24325:57:128;24389:12;;24523:35;24550:7;24523:26;:35::i;:::-;24448:110;;;;24569:13;24565:299;;;24676:68;24701:15;24718:4;29371:10;24724:19;29289:97;24676:68;24671:186;;24759:44;24777:4;29371:10;23509:17;:45::i;24759:44::-;24754:103;;24822:35;;-1:-1:-1;;;24822:35:128;;;;;;;;;;;24754:103;24996:15;24993:135;;;25118:1;25097:19;25090:30;24993:135;25140:32;25175:23;:21;:23::i;:::-;-1:-1:-1;;;;;25720:27:128;;;;;;:21;;;:27;;;;;:63;;25751:32;25720:63;;;:21;;-1:-1:-1;10236:11:128;10211:23;10207:41;10194:63;-1:-1:-1;;;10194:63:128;25978:29;;;;:20;;;:29;;;;;:193;;;;-1:-1:-1;;;26276:47:128;;:52;;26272:534;;26372:1;26362:11;;26340:19;26477:33;;;:20;;;:33;;;;;;:38;;26473:325;;26596:16;;26581:31;;26577:211;;26720:33;;;;:20;;;:33;;;;;:55;;;26577:211;26330:476;26272:534;26823:35;;26850:7;;26846:1;;-1:-1:-1;;;;;26823:35:128;;;-1:-1:-1;;;;;;;;;;;26823:35:128;26846:1;;26823:35;27023:15;;;;:17;;;;;;;-1:-1:-1;;;;;;24250:2801:128:o;452:282:87:-;-1:-1:-1;;;;;;1121:62:87;;1096:4;1121:62;;;303:66:89;1121:62:87;;;;;;;;:70;;:62;:70;510:182;;-1:-1:-1;;;;;;556:62:87;;:49;:62;;;303:66:89;556:62:87;;;;;:69;;-1:-1:-1;;556:69:87;621:4;556:69;;;510:182;;;653:32;;-1:-1:-1;;;653:32:87;;;;;;;;;;;510:182;702:27;;-1:-1:-1;;;;;;702:27:87;;;;;;;;452:282;:::o;2560:247:128:-;2657:32;2692:23;:21;:23::i;:::-;2657:58;-1:-1:-1;2722:8:128;;;:15;2733:4;2722:8;:15;:::i;:::-;-1:-1:-1;2743:10:128;;;:19;2756:6;2743:10;:19;:::i;:::-;-1:-1:-1;3948:7:128;2768:34;;-1:-1:-1;;2560:247:128:o;14:250:514:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:514;238:16;;231:27;14:250::o;269:271::-;311:3;349:5;343:12;376:6;371:3;364:19;392:76;461:6;454:4;449:3;445:14;438:4;431:5;427:16;392:76;:::i;:::-;522:2;501:15;-1:-1:-1;;497:29:514;488:39;;;;529:4;484:50;;269:271;-1:-1:-1;;269:271:514:o;545:220::-;694:2;683:9;676:21;657:4;714:45;755:2;744:9;740:18;732:6;714:45;:::i;770:180::-;829:6;882:2;870:9;861:7;857:23;853:32;850:52;;;898:1;895;888:12;850:52;-1:-1:-1;921:23:514;;770:180;-1:-1:-1;770:180:514:o;1163:173::-;1231:20;;-1:-1:-1;;;;;1280:31:514;;1270:42;;1260:70;;1326:1;1323;1316:12;1341:254;1409:6;1417;1470:2;1458:9;1449:7;1445:23;1441:32;1438:52;;;1486:1;1483;1476:12;1438:52;1509:29;1528:9;1509:29;:::i;:::-;1499:39;1585:2;1570:18;;;;1557:32;;-1:-1:-1;;;1341:254:514:o;1782:328::-;1859:6;1867;1875;1928:2;1916:9;1907:7;1903:23;1899:32;1896:52;;;1944:1;1941;1934:12;1896:52;1967:29;1986:9;1967:29;:::i;:::-;1957:39;;2015:38;2049:2;2038:9;2034:18;2015:38;:::i;:::-;2005:48;;2100:2;2089:9;2085:18;2072:32;2062:42;;1782:328;;;;;:::o;2115:186::-;2174:6;2227:2;2215:9;2206:7;2202:23;2198:32;2195:52;;;2243:1;2240;2233:12;2195:52;2266:29;2285:9;2266:29;:::i;2306:347::-;2371:6;2379;2432:2;2420:9;2411:7;2407:23;2403:32;2400:52;;;2448:1;2445;2438:12;2400:52;2471:29;2490:9;2471:29;:::i;:::-;2461:39;;2550:2;2539:9;2535:18;2522:32;2597:5;2590:13;2583:21;2576:5;2573:32;2563:60;;2619:1;2616;2609:12;2563:60;2642:5;2632:15;;;2306:347;;;;;:::o;2658:127::-;2719:10;2714:3;2710:20;2707:1;2700:31;2750:4;2747:1;2740:15;2774:4;2771:1;2764:15;2790:631;2854:5;2884:18;2925:2;2917:6;2914:14;2911:40;;;2931:18;;:::i;:::-;3006:2;3000:9;2974:2;3060:15;;-1:-1:-1;;3056:24:514;;;3082:2;3052:33;3048:42;3036:55;;;3106:18;;;3126:22;;;3103:46;3100:72;;;3152:18;;:::i;:::-;3192:10;3188:2;3181:22;3221:6;3212:15;;3251:6;3243;3236:22;3291:3;3282:6;3277:3;3273:16;3270:25;3267:45;;;3308:1;3305;3298:12;3267:45;3358:6;3353:3;3346:4;3338:6;3334:17;3321:44;3413:1;3406:4;3397:6;3389;3385:19;3381:30;3374:41;;;;2790:631;;;;;:::o;3426:666::-;3521:6;3529;3537;3545;3598:3;3586:9;3577:7;3573:23;3569:33;3566:53;;;3615:1;3612;3605:12;3566:53;3638:29;3657:9;3638:29;:::i;:::-;3628:39;;3686:38;3720:2;3709:9;3705:18;3686:38;:::i;:::-;3676:48;;3771:2;3760:9;3756:18;3743:32;3733:42;;3826:2;3815:9;3811:18;3798:32;3853:18;3845:6;3842:30;3839:50;;;3885:1;3882;3875:12;3839:50;3908:22;;3961:4;3953:13;;3949:27;-1:-1:-1;3939:55:514;;3990:1;3987;3980:12;3939:55;4013:73;4078:7;4073:2;4060:16;4055:2;4051;4047:11;4013:73;:::i;:::-;4003:83;;;3426:666;;;;;;;:::o;4097:221::-;4140:5;4193:3;4186:4;4178:6;4174:17;4170:27;4160:55;;4211:1;4208;4201:12;4160:55;4233:79;4308:3;4299:6;4286:20;4279:4;4271:6;4267:17;4233:79;:::i;4323:543::-;4411:6;4419;4472:2;4460:9;4451:7;4447:23;4443:32;4440:52;;;4488:1;4485;4478:12;4440:52;4528:9;4515:23;4557:18;4598:2;4590:6;4587:14;4584:34;;;4614:1;4611;4604:12;4584:34;4637:50;4679:7;4670:6;4659:9;4655:22;4637:50;:::i;:::-;4627:60;;4740:2;4729:9;4725:18;4712:32;4696:48;;4769:2;4759:8;4756:16;4753:36;;;4785:1;4782;4775:12;4753:36;;4808:52;4852:7;4841:8;4830:9;4826:24;4808:52;:::i;:::-;4798:62;;;4323:543;;;;;:::o;4871:260::-;4939:6;4947;5000:2;4988:9;4979:7;4975:23;4971:32;4968:52;;;5016:1;5013;5006:12;4968:52;5039:29;5058:9;5039:29;:::i;:::-;5029:39;;5087:38;5121:2;5110:9;5106:18;5087:38;:::i;:::-;5077:48;;4871:260;;;;;:::o;5328:380::-;5407:1;5403:12;;;;5450;;;5471:61;;5525:4;5517:6;5513:17;5503:27;;5471:61;5578:2;5570:6;5567:14;5547:18;5544:38;5541:161;;5624:10;5619:3;5615:20;5612:1;5605:31;5659:4;5656:1;5649:15;5687:4;5684:1;5677:15;5713:496;5892:3;5930:6;5924:13;5946:66;6005:6;6000:3;5993:4;5985:6;5981:17;5946:66;:::i;:::-;6075:13;;6034:16;;;;6097:70;6075:13;6034:16;6144:4;6132:17;;6097:70;:::i;:::-;6183:20;;5713:496;-1:-1:-1;;;;5713:496:514:o;6214:489::-;-1:-1:-1;;;;;6483:15:514;;;6465:34;;6535:15;;6530:2;6515:18;;6508:43;6582:2;6567:18;;6560:34;;;6630:3;6625:2;6610:18;;6603:31;;;6408:4;;6651:46;;6677:19;;6669:6;6651:46;:::i;:::-;6643:54;6214:489;-1:-1:-1;;;;;;6214:489:514:o;6708:290::-;6777:6;6830:2;6818:9;6809:7;6805:23;6801:32;6798:52;;;6846:1;6843;6836:12;6798:52;6872:16;;-1:-1:-1;;;;;;6917:32:514;;6907:43;;6897:71;;6964:1;6961;6954:12;7129:543;7231:2;7226:3;7223:11;7220:446;;;7267:1;7291:5;7288:1;7281:16;7335:4;7332:1;7322:18;7405:2;7393:10;7389:19;7386:1;7382:27;7376:4;7372:38;7441:4;7429:10;7426:20;7423:47;;;-1:-1:-1;7464:4:514;7423:47;7519:2;7514:3;7510:12;7507:1;7503:20;7497:4;7493:31;7483:41;;7574:82;7592:2;7585:5;7582:13;7574:82;;;7637:17;;;7618:1;7607:13;7574:82;;7848:1345;7974:3;7968:10;8001:18;7993:6;7990:30;7987:56;;;8023:18;;:::i;:::-;8052:97;8142:6;8102:38;8134:4;8128:11;8102:38;:::i;:::-;8096:4;8052:97;:::i;:::-;8204:4;;8261:2;8250:14;;8278:1;8273:663;;;;8980:1;8997:6;8994:89;;;-1:-1:-1;9049:19:514;;;9043:26;8994:89;-1:-1:-1;;7805:1:514;7801:11;;;7797:24;7793:29;7783:40;7829:1;7825:11;;;7780:57;9096:81;;8243:944;;8273:663;7076:1;7069:14;;;7113:4;7100:18;;-1:-1:-1;;8309:20:514;;;8427:236;8441:7;8438:1;8435:14;8427:236;;;8530:19;;;8524:26;8509:42;;8622:27;;;;8590:1;8578:14;;;;8457:19;;8427:236;;;8431:3;8691:6;8682:7;8679:19;8676:201;;;8752:19;;;8746:26;-1:-1:-1;;8835:1:514;8831:14;;;8847:3;8827:24;8823:37;8819:42;8804:58;8789:74;;8676:201;-1:-1:-1;;;;;8923:1:514;8907:14;;;8903:22;8890:36;;-1:-1:-1;7848:1345:514:o","linkReferences":{}},"methodIdentifiers":{"__ERC721A_init(string,string)":"d2f01f19","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","burn(uint256)":"42966c68","getApproved(uint256)":"081812fc","isApprovedForAll(address,address)":"e985e9c5","mint(address,uint256)":"40c10f19","mintTo(address)":"755edd17","name()":"06fdde03","ownerOf(uint256)":"6352211e","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","totalSupply()":"18160ddd","transferFrom(address,address,uint256)":"23b872dd"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ApprovalCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BalanceQueryForZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintERC2309QuantityExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintZeroQuantity\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnershipNotInitializedForExtraData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFromIncorrectOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC721ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"URIQueryForNonexistentToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"toTokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"ConsecutiveTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"name\":\"__ERC721A_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"token\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"mintTo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"ConsecutiveTransfer(uint256,uint256,address,address)\":{\"details\":\"Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, as defined in the [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. See {_mintERC2309} for more details.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator.\"},\"balanceOf(address)\":{\"details\":\"Returns the number of tokens in `owner`'s account.\"},\"getApproved(uint256)\":{\"details\":\"Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist.\"},\"isApprovedForAll(address,address)\":{\"details\":\"Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}.\"},\"name()\":{\"details\":\"Returns the token collection name.\"},\"ownerOf(uint256)\":{\"details\":\"Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Equivalent to `safeTransferFrom(from, to, tokenId, '')`.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event.\"},\"symbol()\":{\"details\":\"Returns the token collection symbol.\"},\"tokenURI(uint256)\":{\"details\":\"Returns the Uniform Resource Identifier (URI) for `tokenId` token.\"},\"totalSupply()\":{\"details\":\"Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"errors\":{\"ApprovalCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"ApprovalQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"BalanceQueryForZeroAddress()\":[{\"notice\":\"Cannot query the balance for the zero address.\"}],\"MintERC2309QuantityExceedsLimit()\":[{\"notice\":\"The `quantity` minted with ERC2309 exceeds the safety limit.\"}],\"MintToZeroAddress()\":[{\"notice\":\"Cannot mint to the zero address.\"}],\"MintZeroQuantity()\":[{\"notice\":\"The quantity of tokens minted must be more than zero.\"}],\"OwnerQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"OwnershipNotInitializedForExtraData()\":[{\"notice\":\"The `extraData` cannot be set on an unintialized ownership slot.\"}],\"TransferCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"TransferFromIncorrectOwner()\":[{\"notice\":\"The token must be owned by `from`.\"}],\"TransferToNonERC721ReceiverImplementer()\":[{\"notice\":\"Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"notice\":\"Cannot transfer to the zero address.\"}],\"URIQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}]},\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/mocks/MockERC721A.sol\":\"MockERC721A\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721A.sol\":{\"keccak256\":\"0xc8fab662d9a0c4e697c8dcaad72dd2a190331b01476649a742b6f317266ac5a1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://9c84047a6d47a901f45f90f12f713432289ae6d88fea95a383900906005cf70b\",\"dweb:/ipfs/QmVdLUVdtjTQn2fCG85Uv2ZAzCSfNbWYcAg5eXthunnigc\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol\":{\"keccak256\":\"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa\",\"dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol\":{\"keccak256\":\"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c\",\"dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu\"]},\"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol\":{\"keccak256\":\"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e\",\"dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM\"]},\"contracts/test/mocks/MockERC721A.sol\":{\"keccak256\":\"0xc82f921539b1b78768b8b86d98a05194bf32af4b512537f6d9eaab0ad496f0eb\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://934b78d502b0f8e8609c9576724e1a3038377c04ef46dadde97956ce3974a07a\",\"dweb:/ipfs/QmfTwkrXXW7gGJYeJyVKDKKzEU9P831pwYRnYajt8TLiYt\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"ApprovalCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"ApprovalQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"BalanceQueryForZeroAddress"},{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[],"type":"error","name":"MintERC2309QuantityExceedsLimit"},{"inputs":[],"type":"error","name":"MintToZeroAddress"},{"inputs":[],"type":"error","name":"MintZeroQuantity"},{"inputs":[],"type":"error","name":"OwnerQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"OwnershipNotInitializedForExtraData"},{"inputs":[],"type":"error","name":"TransferCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"TransferFromIncorrectOwner"},{"inputs":[],"type":"error","name":"TransferToNonERC721ReceiverImplementer"},{"inputs":[],"type":"error","name":"TransferToZeroAddress"},{"inputs":[],"type":"error","name":"URIQueryForNonexistentToken"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"approved","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bool","name":"approved","type":"bool","indexed":false}],"type":"event","name":"ApprovalForAll","anonymous":false},{"inputs":[{"internalType":"uint256","name":"fromTokenId","type":"uint256","indexed":true},{"internalType":"uint256","name":"toTokenId","type":"uint256","indexed":false},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true}],"type":"event","name":"ConsecutiveTransfer","anonymous":false},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"__ERC721A_init"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"approve"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function","name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"burn"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"mint"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"mintTo","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setApprovalForAll"},{"inputs":[],"stateMutability":"view","type":"function","name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"transferFrom"}],"devdoc":{"kind":"dev","methods":{"approve(address,uint256)":{"details":"Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator."},"balanceOf(address)":{"details":"Returns the number of tokens in `owner`'s account."},"getApproved(uint256)":{"details":"Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist."},"isApprovedForAll(address,address)":{"details":"Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}."},"name()":{"details":"Returns the token collection name."},"ownerOf(uint256)":{"details":"Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist."},"safeTransferFrom(address,address,uint256)":{"details":"Equivalent to `safeTransferFrom(from, to, tokenId, '')`."},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event."},"setApprovalForAll(address,bool)":{"details":"Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event."},"symbol()":{"details":"Returns the token collection symbol."},"tokenURI(uint256)":{"details":"Returns the Uniform Resource Identifier (URI) for `tokenId` token."},"totalSupply()":{"details":"Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}."},"transferFrom(address,address,uint256)":{"details":"Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/test/mocks/MockERC721A.sol":"MockERC721A"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721A.sol":{"keccak256":"0xc8fab662d9a0c4e697c8dcaad72dd2a190331b01476649a742b6f317266ac5a1","urls":["bzz-raw://9c84047a6d47a901f45f90f12f713432289ae6d88fea95a383900906005cf70b","dweb:/ipfs/QmVdLUVdtjTQn2fCG85Uv2ZAzCSfNbWYcAg5eXthunnigc"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol":{"keccak256":"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334","urls":["bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa","dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol":{"keccak256":"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1","urls":["bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c","dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9","urls":["bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e","dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM"],"license":"Apache-2.0"},"contracts/test/mocks/MockERC721A.sol":{"keccak256":"0xc82f921539b1b78768b8b86d98a05194bf32af4b512537f6d9eaab0ad496f0eb","urls":["bzz-raw://934b78d502b0f8e8609c9576724e1a3038377c04ef46dadde97956ce3974a07a","dweb:/ipfs/QmfTwkrXXW7gGJYeJyVKDKKzEU9P831pwYRnYajt8TLiYt"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"}},"version":1},"id":327} \ No newline at end of file diff --git a/packages/generated/v3/abis/MockERC721A.metadata.json b/packages/generated/v3/abis/MockERC721A.metadata.json new file mode 100644 index 000000000..5b2cad10a --- /dev/null +++ b/packages/generated/v3/abis/MockERC721A.metadata.json @@ -0,0 +1,731 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "ApprovalQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "BalanceQueryForZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [], + "type": "error", + "name": "MintERC2309QuantityExceedsLimit" + }, + { + "inputs": [], + "type": "error", + "name": "MintToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "MintZeroQuantity" + }, + { + "inputs": [], + "type": "error", + "name": "OwnerQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "OwnershipNotInitializedForExtraData" + }, + { + "inputs": [], + "type": "error", + "name": "TransferCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "TransferFromIncorrectOwner" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "URIQueryForNonexistentToken" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "approved", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Approval", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "operator", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ApprovalForAll", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fromTokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint256", + "name": "toTokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConsecutiveTransfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Transfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name_", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol_", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__ERC721A_init" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "approve" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "token", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "burn" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "mint" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "mintTo", + "outputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "safeTransferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "safeTransferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setApprovalForAll" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "transferFrom" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "approve(address,uint256)": { + "details": "Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator." + }, + "balanceOf(address)": { + "details": "Returns the number of tokens in `owner`'s account." + }, + "getApproved(uint256)": { + "details": "Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist." + }, + "isApprovedForAll(address,address)": { + "details": "Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}." + }, + "name()": { + "details": "Returns the token collection name." + }, + "ownerOf(uint256)": { + "details": "Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist." + }, + "safeTransferFrom(address,address,uint256)": { + "details": "Equivalent to `safeTransferFrom(from, to, tokenId, '')`." + }, + "safeTransferFrom(address,address,uint256,bytes)": { + "details": "Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event." + }, + "setApprovalForAll(address,bool)": { + "details": "Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event." + }, + "symbol()": { + "details": "Returns the token collection symbol." + }, + "tokenURI(uint256)": { + "details": "Returns the Uniform Resource Identifier (URI) for `tokenId` token." + }, + "totalSupply()": { + "details": "Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}." + }, + "transferFrom(address,address,uint256)": { + "details": "Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/test/mocks/MockERC721A.sol": "MockERC721A" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721A.sol": { + "keccak256": "0xc8fab662d9a0c4e697c8dcaad72dd2a190331b01476649a742b6f317266ac5a1", + "urls": [ + "bzz-raw://9c84047a6d47a901f45f90f12f713432289ae6d88fea95a383900906005cf70b", + "dweb:/ipfs/QmVdLUVdtjTQn2fCG85Uv2ZAzCSfNbWYcAg5eXthunnigc" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol": { + "keccak256": "0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334", + "urls": [ + "bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa", + "dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol": { + "keccak256": "0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1", + "urls": [ + "bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c", + "dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/IERC721A.sol": { + "keccak256": "0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9", + "urls": [ + "bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e", + "dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM" + ], + "license": "Apache-2.0" + }, + "contracts/test/mocks/MockERC721A.sol": { + "keccak256": "0xc82f921539b1b78768b8b86d98a05194bf32af4b512537f6d9eaab0ad496f0eb", + "urls": [ + "bzz-raw://934b78d502b0f8e8609c9576724e1a3038377c04ef46dadde97956ce3974a07a", + "dweb:/ipfs/QmfTwkrXXW7gGJYeJyVKDKKzEU9P831pwYRnYajt8TLiYt" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/MockEntitlementGated.abi.json b/packages/generated/v3/abis/MockEntitlementGated.abi.json new file mode 100644 index 000000000..d5bffedf8 --- /dev/null +++ b/packages/generated/v3/abis/MockEntitlementGated.abi.json @@ -0,0 +1,433 @@ +[ + { + "type": "constructor", + "inputs": [ + { + "name": "checker", + "type": "address", + "internalType": "contract IEntitlementChecker" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__EntitlementGated_init", + "inputs": [ + { + "name": "entitlementChecker", + "type": "address", + "internalType": "contract IEntitlementChecker" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getRuleData", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRuleData", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "postEntitlementCheckResult", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "result", + "type": "uint8", + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "requestEntitlementCheck", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "ruleData", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "EntitlementCheckResultPosted", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "result", + "type": "uint8", + "indexed": false, + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "EntitlementGated_InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_NodeAlreadyVoted", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_NodeNotFound", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyCompleted", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyRegistered", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionNotRegistered", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "ReentrancyGuard__ReentrantCall", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/MockEntitlementGated.abi.ts b/packages/generated/v3/abis/MockEntitlementGated.abi.ts new file mode 100644 index 000000000..0d6db77c2 --- /dev/null +++ b/packages/generated/v3/abis/MockEntitlementGated.abi.ts @@ -0,0 +1,433 @@ +export default [ + { + "type": "constructor", + "inputs": [ + { + "name": "checker", + "type": "address", + "internalType": "contract IEntitlementChecker" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__EntitlementGated_init", + "inputs": [ + { + "name": "entitlementChecker", + "type": "address", + "internalType": "contract IEntitlementChecker" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getRuleData", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRuleData", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "postEntitlementCheckResult", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "result", + "type": "uint8", + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "requestEntitlementCheck", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "ruleData", + "type": "tuple", + "internalType": "struct IRuleEntitlement.RuleData", + "components": [ + { + "name": "operations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.Operation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CombinedOperationType" + }, + { + "name": "index", + "type": "uint8", + "internalType": "uint8" + } + ] + }, + { + "name": "checkOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "components": [ + { + "name": "opType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.CheckOperationType" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contractAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "logicalOperations", + "type": "tuple[]", + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "components": [ + { + "name": "logOpType", + "type": "uint8", + "internalType": "enum IRuleEntitlement.LogicalOperationType" + }, + { + "name": "leftOperationIndex", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "rightOperationIndex", + "type": "uint8", + "internalType": "uint8" + } + ] + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "EntitlementCheckResultPosted", + "inputs": [ + { + "name": "transactionId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "result", + "type": "uint8", + "indexed": false, + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "EntitlementGated_InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_NodeAlreadyVoted", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_NodeNotFound", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyCompleted", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyRegistered", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementGated_TransactionNotRegistered", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "ReentrancyGuard__ReentrantCall", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/MockEntitlementGated.bin b/packages/generated/v3/abis/MockEntitlementGated.bin new file mode 100644 index 000000000..1cd6217be --- /dev/null +++ b/packages/generated/v3/abis/MockEntitlementGated.bin @@ -0,0 +1 @@ +60806040523480156200001157600080fd5b5060405162001b9a38038062001b9a833981016040819052620000349162000127565b6200003e6200007f565b7f9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e0080546001600160a01b0319166001600160a01b0383161790555062000159565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff1615620000cc576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156200012457805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6000602082840312156200013a57600080fd5b81516001600160a01b03811681146200015257600080fd5b9392505050565b611a3180620001696000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063069a3ee91461005c5780634739e8051461008557806357e700271461009a5780637adc9cbe146100bb57806392c399ff146100ce575b600080fd5b61006f61006a366004610e1e565b6100e1565b60405161007c9190610f28565b60405180910390f35b610098610093366004610fd8565b610314565b005b6100ad6100a8366004611011565b6103b8565b60405190815260200161007c565b6100986100c9366004611074565b610426565b61006f6100dc366004611091565b61047c565b61010560405180606001604052806060815260200160608152602001606081525090565b6000828152602081815260408083208151815460809481028201850190935260608101838152909491938593919285929185015b828210156101a257600084815260209020604080518082019091529083018054829060ff16600281111561016f5761016f610e37565b600281111561018057610180610e37565b81529054610100900460ff166020918201529082526001929092019101610139565b50505050815260200160018201805480602002602001604051908101604052809291908181526020016000905b8282101561025a576000848152602090206040805160808101909152600484029091018054829060ff16600581111561020a5761020a610e37565b600581111561021b5761021b610e37565b815260018281015460208084019190915260028401546001600160a01b03166040840152600390930154606090920191909152918352920191016101cf565b50505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156103065760008481526020902060408051606081019091529083018054829060ff1660028111156102be576102be610e37565b60028111156102cf576102cf610e37565b8152905460ff6101008204811660208085019190915262010000909204166040909201919091529082526001929092019101610287565b505050915250909392505050565b60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a00540361035657604051635db5c7cd60e11b815260040160405180910390fd5b61037f60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b61038a8383836104aa565b6103b360017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b505050565b600082815260208190526040812082906103d2828261140a565b50506040516bffffffffffffffffffffffff193260601b16602082015243603482015260009060540160405160208183030381529060405280519060200120905061041f81306000610743565b9392505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661047057604051630ef4733760e31b815260040160405180910390fd5b610479816109f2565b50565b6104a060405180606001604052806060815260200160608152602001606081525090565b61041f8383610a2d565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919061010090046001600160a01b031615806104f45750805460ff16155b1561051257604051637ad5a43960e11b815260040160405180910390fd5b600084815260028201602052604090205460ff161561054457604051637912b73960e01b815260040160405180910390fd5b600084815260018201602052604081205481908190815b8181101561068257600089815260018701602052604081208054839081106105855761058561150e565b60009182526020909120018054909150336001600160a01b03909116036106115760008154600160a01b900460ff1660028111156105c5576105c5610e37565b146105e3576040516347592a4d60e01b815260040160405180910390fd5b80548990829060ff60a01b1916600160a01b83600281111561060757610607610e37565b0217905550600195505b60018154600160a01b900460ff16600281111561063057610630610e37565b03610647578461063f81611524565b955050610679565b60028154600160a01b900460ff16600281111561066657610666610e37565b03610679578361067581611524565b9450505b5060010161055b565b50836106a157604051638223a7e960e01b815260040160405180910390fd5b6106ac60028261153d565b8311806106c257506106bf60028261153d565b82115b156107385760008881526002860160205260408120805460ff191660011790558284116106f05760026106f3565b60015b9050897fb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c63382604051610725919061155f565b60405180910390a26107368a610b27565b505b505050505050505050565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919060ff1615156001036107d55760005b60048201548110156107d357838260040182815481106107a2576107a261150e565b9060005260206000200154036107cb576040516301ab53df60e31b815260040160405180910390fd5b600101610780565b505b81546001600160a01b03166107ec576107ec610bfb565b8154604051634f84544560e01b8152600560048201526000916001600160a01b031690634f84544590602401600060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085d9190810190611636565b825490915060ff1661089e5781546003830180546001600160a01b0319166001600160a01b0388161790556001600160a81b03191661010033021760011782555b600482018054600181018255600091825260208220018590555b815181101561098e5782600101600086815260200190815260200160002060405180604001604052808484815181106108f3576108f361150e565b60200260200101516001600160a01b031681526020016000600281111561091c5761091c610e37565b9052815460018101835560009283526020928390208251910180546001600160a01b031981166001600160a01b03909316928317825593830151929390929183916001600160a81b03191617600160a01b83600281111561097f5761097f610e37565b021790555050506001016108b8565b50825460405163541da4e560e01b81526001600160a01b039091169063541da4e5906109c49033908a90899087906004016116ca565b600060405180830381600087803b1580156109de57600080fd5b505af1158015610736573d6000803e3d6000fd5b610a02636afd38fd60e11b610ccc565b6000805160206119f183398151915280546001600160a01b0319166001600160a01b03831617905550565b610a5160405180606001604052806060815260200160608152602001606081525090565b6000838152600080516020611a118339815191526020526040812080546000805160206119f18339815191529260ff90911615159003610aa457604051637ad5a43960e11b815260040160405180910390fd5b600381015460405163069a3ee960e01b8152600481018690526001600160a01b0390911690600090829063069a3ee990602401600060405180830381865afa158015610af4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b1c9190810190611893565b979650505050505050565b6000818152600080516020611a11833981519152602052604081206000805160206119f1833981519152915b6004820154811015610ba757816001016000836004018381548110610b7a57610b7a61150e565b906000526020600020015481526020019081526020016000206000610b9f9190610daa565b600101610b53565b50610bb6600482016000610dc8565b6000838152600183016020526040812080546001600160a81b03191681556003810180546001600160a01b031916905590610bf46004830182610dc8565b5050505050565b60006000805160206119f1833981519152905060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60060060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad91906119d3565b82546001600160a01b0319166001600160a01b03919091161790915550565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610d59576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610d72565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b50805460008255906000526020600020908101906104799190610de6565b50805460008255906000526020600020908101906104799190610e09565b5b80821115610e055780546001600160a81b0319168155600101610de7565b5090565b5b80821115610e055760008155600101610e0a565b600060208284031215610e3057600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b6003811061047957610479610e37565b60008151808452602080850194506020840160005b83811015610ec7578151805160068110610e8e57610e8e610e37565b885280840151848901526040808201516001600160a01b0316908901526060908101519088015260809096019590820190600101610e72565b509495945050505050565b60008151808452602080850194506020840160005b83811015610ec75781518051610efc81610e4d565b88528084015160ff908116858a0152604091820151169088015260609096019590820190600101610ee7565b6020808252825160608383015280516080840181905260009291820190839060a08601905b80831015610f845783518051610f6281610e4d565b835285015160ff16858301529284019260019290920191604090910190610f4d565b50838701519350601f19925082868203016040870152610fa48185610e5d565b93505050604085015181858403016060860152610fc18382610ed2565b9695505050505050565b6003811061047957600080fd5b600080600060608486031215610fed57600080fd5b8335925060208401359150604084013561100681610fcb565b809150509250925092565b6000806040838503121561102457600080fd5b82359150602083013567ffffffffffffffff81111561104257600080fd5b83016060818603121561105457600080fd5b809150509250929050565b6001600160a01b038116811461047957600080fd5b60006020828403121561108657600080fd5b813561041f8161105f565b600080604083850312156110a457600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60ff8116811461047957600080fd5b81356110f981610fcb565b61110281610e4d565b60ff1982541660ff82168117835550506020820135611120816110df565b815461ff001916600882901b61ff0016178255505050565b6000808335601e1984360301811261114f57600080fd5b83018035915067ffffffffffffffff82111561116a57600080fd5b6020019150600781901b360382131561118257600080fd5b9250929050565b6006811061047957600080fd5b81356111a181611189565b600681106111b1576111b1610e37565b60ff1982541660ff8216811783555050602082013560018201556002810160408301356111dd8161105f565b81546001600160a01b0319166001600160a01b03919091161790556060919091013560039190910155565b600160401b83111561121c5761121c6110b3565b80548382558084101561129a5760026001600160fe1b038281168314611244576112446110c9565b8086168614611255576112556110c9565b506000838152602081208360021b81018760021b820191505b8082101561129557828255826001830155828483015582600383015560048201915061126e565b505050505b5060008181526020812083915b858110156112cf576112b98383611196565b60809290920191600491909101906001016112a7565b505050505050565b6000808335601e198436030181126112ee57600080fd5b83018035915067ffffffffffffffff82111561130957600080fd5b602001915060608102360382131561118257600080fd5b813561132b81610fcb565b61133481610e4d565b60ff1982541660ff82168117835550506020820135611352816110df565b815461ff001916600882901b61ff0016178255506040820135611374816110df565b815462ff0000191660109190911b62ff00001617905550565b600160401b8311156113a1576113a16110b3565b8054838255808410156113d8576000828152602081208581019083015b808210156113d4578282556001820191506113be565b5050505b5060008181526020812083915b858110156112cf576113f78383611320565b60609290920191600191820191016113e5565b8135601e1983360301811261141e57600080fd5b8201803567ffffffffffffffff81111561143757600080fd5b6020820191508060061b360382131561144f57600080fd5b600160401b811115611463576114636110b3565b82548184558082101561149a576000848152602081208381019083015b8082101561149657828255600182019150611480565b5050505b5060008381526020902060005b828110156114cc576114b984836110ee565b60409390930192600191820191016114a7565b505050506114dd6020830183611138565b6114eb818360018601611208565b50506114fa60408301836112d7565b61150881836002860161138d565b50505050565b634e487b7160e01b600052603260045260246000fd5b600060018201611536576115366110c9565b5060010190565b60008261155a57634e487b7160e01b600052601260045260246000fd5b500490565b6020810161156c83610e4d565b91905290565b6040516080810167ffffffffffffffff81118282101715611595576115956110b3565b60405290565b6040516060810167ffffffffffffffff81118282101715611595576115956110b3565b6040805190810167ffffffffffffffff81118282101715611595576115956110b3565b604051601f8201601f1916810167ffffffffffffffff8111828210171561160a5761160a6110b3565b604052919050565b600067ffffffffffffffff82111561162c5761162c6110b3565b5060051b60200190565b6000602080838503121561164957600080fd5b825167ffffffffffffffff81111561166057600080fd5b8301601f8101851361167157600080fd5b805161168461167f82611612565b6115e1565b81815260059190911b820183019083810190878311156116a357600080fd5b928401925b82841015610b1c5783516116bb8161105f565b825292840192908401906116a8565b60006080820160018060a01b03808816845260208760208601528660408601526080606086015282865180855260a08701915060208801945060005b81811015611724578551851683529483019491830191600101611706565b50909a9950505050505050505050565b600082601f83011261174557600080fd5b8151602061175561167f83611612565b82815260079290921b8401810191818101908684111561177457600080fd5b8286015b848110156117d957608081890312156117915760008081fd5b611799611572565b81516117a481611189565b815281850151858201526040808301516117bd8161105f565b9082015260608281015190820152835291830191608001611778565b509695505050505050565b600082601f8301126117f557600080fd5b8151602061180561167f83611612565b8281526060928302850182019282820191908785111561182457600080fd5b8387015b858110156118865781818a0312156118405760008081fd5b61184861159b565b815161185381610fcb565b815281860151611862816110df565b81870152604082810151611875816110df565b908201528452928401928101611828565b5090979650505050505050565b600060208083850312156118a657600080fd5b825167ffffffffffffffff808211156118be57600080fd5b90840190606082870312156118d257600080fd5b6118da61159b565b8251828111156118e957600080fd5b8301601f810188136118fa57600080fd5b805161190861167f82611612565b81815260069190911b8201860190868101908a83111561192757600080fd5b928701925b8284101561197d576040848c0312156119455760008081fd5b61194d6115be565b845161195881610fcb565b815284890151611967816110df565b818a01528252604093909301929087019061192c565b8452505050828401518281111561199357600080fd5b61199f88828601611734565b858301525060408301519350818411156119b857600080fd5b6119c4878585016117e4565b60408201529695505050505050565b6000602082840312156119e557600080fd5b815161041f8161105f56fe9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e01 \ No newline at end of file diff --git a/packages/generated/v3/abis/MockEntitlementGated.json b/packages/generated/v3/abis/MockEntitlementGated.json new file mode 100644 index 000000000..3035ec7f9 --- /dev/null +++ b/packages/generated/v3/abis/MockEntitlementGated.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"checker","type":"address","internalType":"contract IEntitlementChecker"}],"stateMutability":"nonpayable"},{"type":"function","name":"__EntitlementGated_init","inputs":[{"name":"entitlementChecker","type":"address","internalType":"contract IEntitlementChecker"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getRuleData","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IRuleEntitlement.RuleData","components":[{"name":"operations","type":"tuple[]","internalType":"struct IRuleEntitlement.Operation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CombinedOperationType"},{"name":"index","type":"uint8","internalType":"uint8"}]},{"name":"checkOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.CheckOperation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CheckOperationType"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"contractAddress","type":"address","internalType":"address"},{"name":"threshold","type":"uint256","internalType":"uint256"}]},{"name":"logicalOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.LogicalOperation[]","components":[{"name":"logOpType","type":"uint8","internalType":"enum IRuleEntitlement.LogicalOperationType"},{"name":"leftOperationIndex","type":"uint8","internalType":"uint8"},{"name":"rightOperationIndex","type":"uint8","internalType":"uint8"}]}]}],"stateMutability":"view"},{"type":"function","name":"getRuleData","inputs":[{"name":"transactionId","type":"bytes32","internalType":"bytes32"},{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IRuleEntitlement.RuleData","components":[{"name":"operations","type":"tuple[]","internalType":"struct IRuleEntitlement.Operation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CombinedOperationType"},{"name":"index","type":"uint8","internalType":"uint8"}]},{"name":"checkOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.CheckOperation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CheckOperationType"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"contractAddress","type":"address","internalType":"address"},{"name":"threshold","type":"uint256","internalType":"uint256"}]},{"name":"logicalOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.LogicalOperation[]","components":[{"name":"logOpType","type":"uint8","internalType":"enum IRuleEntitlement.LogicalOperationType"},{"name":"leftOperationIndex","type":"uint8","internalType":"uint8"},{"name":"rightOperationIndex","type":"uint8","internalType":"uint8"}]}]}],"stateMutability":"view"},{"type":"function","name":"postEntitlementCheckResult","inputs":[{"name":"transactionId","type":"bytes32","internalType":"bytes32"},{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"result","type":"uint8","internalType":"enum IEntitlementGatedBase.NodeVoteStatus"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"requestEntitlementCheck","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"ruleData","type":"tuple","internalType":"struct IRuleEntitlement.RuleData","components":[{"name":"operations","type":"tuple[]","internalType":"struct IRuleEntitlement.Operation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CombinedOperationType"},{"name":"index","type":"uint8","internalType":"uint8"}]},{"name":"checkOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.CheckOperation[]","components":[{"name":"opType","type":"uint8","internalType":"enum IRuleEntitlement.CheckOperationType"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"contractAddress","type":"address","internalType":"address"},{"name":"threshold","type":"uint256","internalType":"uint256"}]},{"name":"logicalOperations","type":"tuple[]","internalType":"struct IRuleEntitlement.LogicalOperation[]","components":[{"name":"logOpType","type":"uint8","internalType":"enum IRuleEntitlement.LogicalOperationType"},{"name":"leftOperationIndex","type":"uint8","internalType":"uint8"},{"name":"rightOperationIndex","type":"uint8","internalType":"uint8"}]}]}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"nonpayable"},{"type":"event","name":"EntitlementCheckResultPosted","inputs":[{"name":"transactionId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"result","type":"uint8","indexed":false,"internalType":"enum IEntitlementGatedBase.NodeVoteStatus"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"error","name":"EntitlementGated_InvalidAddress","inputs":[]},{"type":"error","name":"EntitlementGated_NodeAlreadyVoted","inputs":[]},{"type":"error","name":"EntitlementGated_NodeNotFound","inputs":[]},{"type":"error","name":"EntitlementGated_TransactionCheckAlreadyCompleted","inputs":[]},{"type":"error","name":"EntitlementGated_TransactionCheckAlreadyRegistered","inputs":[]},{"type":"error","name":"EntitlementGated_TransactionNotRegistered","inputs":[]},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"ReentrancyGuard__ReentrantCall","inputs":[]}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b5060405162001b9a38038062001b9a833981016040819052620000349162000127565b6200003e6200007f565b7f9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e0080546001600160a01b0319166001600160a01b0383161790555062000159565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff1615620000cc576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156200012457805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6000602082840312156200013a57600080fd5b81516001600160a01b03811681146200015257600080fd5b9392505050565b611a3180620001696000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063069a3ee91461005c5780634739e8051461008557806357e700271461009a5780637adc9cbe146100bb57806392c399ff146100ce575b600080fd5b61006f61006a366004610e1e565b6100e1565b60405161007c9190610f28565b60405180910390f35b610098610093366004610fd8565b610314565b005b6100ad6100a8366004611011565b6103b8565b60405190815260200161007c565b6100986100c9366004611074565b610426565b61006f6100dc366004611091565b61047c565b61010560405180606001604052806060815260200160608152602001606081525090565b6000828152602081815260408083208151815460809481028201850190935260608101838152909491938593919285929185015b828210156101a257600084815260209020604080518082019091529083018054829060ff16600281111561016f5761016f610e37565b600281111561018057610180610e37565b81529054610100900460ff166020918201529082526001929092019101610139565b50505050815260200160018201805480602002602001604051908101604052809291908181526020016000905b8282101561025a576000848152602090206040805160808101909152600484029091018054829060ff16600581111561020a5761020a610e37565b600581111561021b5761021b610e37565b815260018281015460208084019190915260028401546001600160a01b03166040840152600390930154606090920191909152918352920191016101cf565b50505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156103065760008481526020902060408051606081019091529083018054829060ff1660028111156102be576102be610e37565b60028111156102cf576102cf610e37565b8152905460ff6101008204811660208085019190915262010000909204166040909201919091529082526001929092019101610287565b505050915250909392505050565b60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a00540361035657604051635db5c7cd60e11b815260040160405180910390fd5b61037f60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b61038a8383836104aa565b6103b360017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b505050565b600082815260208190526040812082906103d2828261140a565b50506040516bffffffffffffffffffffffff193260601b16602082015243603482015260009060540160405160208183030381529060405280519060200120905061041f81306000610743565b9392505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661047057604051630ef4733760e31b815260040160405180910390fd5b610479816109f2565b50565b6104a060405180606001604052806060815260200160608152602001606081525090565b61041f8383610a2d565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919061010090046001600160a01b031615806104f45750805460ff16155b1561051257604051637ad5a43960e11b815260040160405180910390fd5b600084815260028201602052604090205460ff161561054457604051637912b73960e01b815260040160405180910390fd5b600084815260018201602052604081205481908190815b8181101561068257600089815260018701602052604081208054839081106105855761058561150e565b60009182526020909120018054909150336001600160a01b03909116036106115760008154600160a01b900460ff1660028111156105c5576105c5610e37565b146105e3576040516347592a4d60e01b815260040160405180910390fd5b80548990829060ff60a01b1916600160a01b83600281111561060757610607610e37565b0217905550600195505b60018154600160a01b900460ff16600281111561063057610630610e37565b03610647578461063f81611524565b955050610679565b60028154600160a01b900460ff16600281111561066657610666610e37565b03610679578361067581611524565b9450505b5060010161055b565b50836106a157604051638223a7e960e01b815260040160405180910390fd5b6106ac60028261153d565b8311806106c257506106bf60028261153d565b82115b156107385760008881526002860160205260408120805460ff191660011790558284116106f05760026106f3565b60015b9050897fb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c63382604051610725919061155f565b60405180910390a26107368a610b27565b505b505050505050505050565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919060ff1615156001036107d55760005b60048201548110156107d357838260040182815481106107a2576107a261150e565b9060005260206000200154036107cb576040516301ab53df60e31b815260040160405180910390fd5b600101610780565b505b81546001600160a01b03166107ec576107ec610bfb565b8154604051634f84544560e01b8152600560048201526000916001600160a01b031690634f84544590602401600060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085d9190810190611636565b825490915060ff1661089e5781546003830180546001600160a01b0319166001600160a01b0388161790556001600160a81b03191661010033021760011782555b600482018054600181018255600091825260208220018590555b815181101561098e5782600101600086815260200190815260200160002060405180604001604052808484815181106108f3576108f361150e565b60200260200101516001600160a01b031681526020016000600281111561091c5761091c610e37565b9052815460018101835560009283526020928390208251910180546001600160a01b031981166001600160a01b03909316928317825593830151929390929183916001600160a81b03191617600160a01b83600281111561097f5761097f610e37565b021790555050506001016108b8565b50825460405163541da4e560e01b81526001600160a01b039091169063541da4e5906109c49033908a90899087906004016116ca565b600060405180830381600087803b1580156109de57600080fd5b505af1158015610736573d6000803e3d6000fd5b610a02636afd38fd60e11b610ccc565b6000805160206119f183398151915280546001600160a01b0319166001600160a01b03831617905550565b610a5160405180606001604052806060815260200160608152602001606081525090565b6000838152600080516020611a118339815191526020526040812080546000805160206119f18339815191529260ff90911615159003610aa457604051637ad5a43960e11b815260040160405180910390fd5b600381015460405163069a3ee960e01b8152600481018690526001600160a01b0390911690600090829063069a3ee990602401600060405180830381865afa158015610af4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b1c9190810190611893565b979650505050505050565b6000818152600080516020611a11833981519152602052604081206000805160206119f1833981519152915b6004820154811015610ba757816001016000836004018381548110610b7a57610b7a61150e565b906000526020600020015481526020019081526020016000206000610b9f9190610daa565b600101610b53565b50610bb6600482016000610dc8565b6000838152600183016020526040812080546001600160a81b03191681556003810180546001600160a01b031916905590610bf46004830182610dc8565b5050505050565b60006000805160206119f1833981519152905060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60060060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad91906119d3565b82546001600160a01b0319166001600160a01b03919091161790915550565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610d59576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610d72565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b50805460008255906000526020600020908101906104799190610de6565b50805460008255906000526020600020908101906104799190610e09565b5b80821115610e055780546001600160a81b0319168155600101610de7565b5090565b5b80821115610e055760008155600101610e0a565b600060208284031215610e3057600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b6003811061047957610479610e37565b60008151808452602080850194506020840160005b83811015610ec7578151805160068110610e8e57610e8e610e37565b885280840151848901526040808201516001600160a01b0316908901526060908101519088015260809096019590820190600101610e72565b509495945050505050565b60008151808452602080850194506020840160005b83811015610ec75781518051610efc81610e4d565b88528084015160ff908116858a0152604091820151169088015260609096019590820190600101610ee7565b6020808252825160608383015280516080840181905260009291820190839060a08601905b80831015610f845783518051610f6281610e4d565b835285015160ff16858301529284019260019290920191604090910190610f4d565b50838701519350601f19925082868203016040870152610fa48185610e5d565b93505050604085015181858403016060860152610fc18382610ed2565b9695505050505050565b6003811061047957600080fd5b600080600060608486031215610fed57600080fd5b8335925060208401359150604084013561100681610fcb565b809150509250925092565b6000806040838503121561102457600080fd5b82359150602083013567ffffffffffffffff81111561104257600080fd5b83016060818603121561105457600080fd5b809150509250929050565b6001600160a01b038116811461047957600080fd5b60006020828403121561108657600080fd5b813561041f8161105f565b600080604083850312156110a457600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60ff8116811461047957600080fd5b81356110f981610fcb565b61110281610e4d565b60ff1982541660ff82168117835550506020820135611120816110df565b815461ff001916600882901b61ff0016178255505050565b6000808335601e1984360301811261114f57600080fd5b83018035915067ffffffffffffffff82111561116a57600080fd5b6020019150600781901b360382131561118257600080fd5b9250929050565b6006811061047957600080fd5b81356111a181611189565b600681106111b1576111b1610e37565b60ff1982541660ff8216811783555050602082013560018201556002810160408301356111dd8161105f565b81546001600160a01b0319166001600160a01b03919091161790556060919091013560039190910155565b600160401b83111561121c5761121c6110b3565b80548382558084101561129a5760026001600160fe1b038281168314611244576112446110c9565b8086168614611255576112556110c9565b506000838152602081208360021b81018760021b820191505b8082101561129557828255826001830155828483015582600383015560048201915061126e565b505050505b5060008181526020812083915b858110156112cf576112b98383611196565b60809290920191600491909101906001016112a7565b505050505050565b6000808335601e198436030181126112ee57600080fd5b83018035915067ffffffffffffffff82111561130957600080fd5b602001915060608102360382131561118257600080fd5b813561132b81610fcb565b61133481610e4d565b60ff1982541660ff82168117835550506020820135611352816110df565b815461ff001916600882901b61ff0016178255506040820135611374816110df565b815462ff0000191660109190911b62ff00001617905550565b600160401b8311156113a1576113a16110b3565b8054838255808410156113d8576000828152602081208581019083015b808210156113d4578282556001820191506113be565b5050505b5060008181526020812083915b858110156112cf576113f78383611320565b60609290920191600191820191016113e5565b8135601e1983360301811261141e57600080fd5b8201803567ffffffffffffffff81111561143757600080fd5b6020820191508060061b360382131561144f57600080fd5b600160401b811115611463576114636110b3565b82548184558082101561149a576000848152602081208381019083015b8082101561149657828255600182019150611480565b5050505b5060008381526020902060005b828110156114cc576114b984836110ee565b60409390930192600191820191016114a7565b505050506114dd6020830183611138565b6114eb818360018601611208565b50506114fa60408301836112d7565b61150881836002860161138d565b50505050565b634e487b7160e01b600052603260045260246000fd5b600060018201611536576115366110c9565b5060010190565b60008261155a57634e487b7160e01b600052601260045260246000fd5b500490565b6020810161156c83610e4d565b91905290565b6040516080810167ffffffffffffffff81118282101715611595576115956110b3565b60405290565b6040516060810167ffffffffffffffff81118282101715611595576115956110b3565b6040805190810167ffffffffffffffff81118282101715611595576115956110b3565b604051601f8201601f1916810167ffffffffffffffff8111828210171561160a5761160a6110b3565b604052919050565b600067ffffffffffffffff82111561162c5761162c6110b3565b5060051b60200190565b6000602080838503121561164957600080fd5b825167ffffffffffffffff81111561166057600080fd5b8301601f8101851361167157600080fd5b805161168461167f82611612565b6115e1565b81815260059190911b820183019083810190878311156116a357600080fd5b928401925b82841015610b1c5783516116bb8161105f565b825292840192908401906116a8565b60006080820160018060a01b03808816845260208760208601528660408601526080606086015282865180855260a08701915060208801945060005b81811015611724578551851683529483019491830191600101611706565b50909a9950505050505050505050565b600082601f83011261174557600080fd5b8151602061175561167f83611612565b82815260079290921b8401810191818101908684111561177457600080fd5b8286015b848110156117d957608081890312156117915760008081fd5b611799611572565b81516117a481611189565b815281850151858201526040808301516117bd8161105f565b9082015260608281015190820152835291830191608001611778565b509695505050505050565b600082601f8301126117f557600080fd5b8151602061180561167f83611612565b8281526060928302850182019282820191908785111561182457600080fd5b8387015b858110156118865781818a0312156118405760008081fd5b61184861159b565b815161185381610fcb565b815281860151611862816110df565b81870152604082810151611875816110df565b908201528452928401928101611828565b5090979650505050505050565b600060208083850312156118a657600080fd5b825167ffffffffffffffff808211156118be57600080fd5b90840190606082870312156118d257600080fd5b6118da61159b565b8251828111156118e957600080fd5b8301601f810188136118fa57600080fd5b805161190861167f82611612565b81815260069190911b8201860190868101908a83111561192757600080fd5b928701925b8284101561197d576040848c0312156119455760008081fd5b61194d6115be565b845161195881610fcb565b815284890151611967816110df565b818a01528252604093909301929087019061192c565b8452505050828401518281111561199357600080fd5b61199f88828601611734565b858301525060408301519350818411156119b857600080fd5b6119c4878585016117e4565b60408201529695505050505050565b6000602082840312156119e557600080fd5b815161041f8161105f56fe9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e01","sourceMap":"353:932:246:-:0;;;520:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;385:22:49;:20;:22::i;:::-;469:66:179;1368:72:178;;-1:-1:-1;;;;;;1368:72:178;-1:-1:-1;;;;;1368:72:178;;;;;520:83:246;353:932;;1653:314:63;303:66:64;1779:14:63;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:63;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:63;1898:16;1886:28;;;;;1927:29;;481:42:375;;;1927:29:63;;469:2:375;454:18;1927:29:63;;;;;;;1844:119;1694:273;1653:314::o;14:318:375:-;112:6;165:2;153:9;144:7;140:23;136:32;133:52;;;181:1;178;171:12;133:52;207:16;;-1:-1:-1;;;;;252:31:375;;242:42;;232:70;;298:1;295;288:12;232:70;321:5;14:318;-1:-1:-1;;;14:318:375:o;337:192::-;353:932:246;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063069a3ee91461005c5780634739e8051461008557806357e700271461009a5780637adc9cbe146100bb57806392c399ff146100ce575b600080fd5b61006f61006a366004610e1e565b6100e1565b60405161007c9190610f28565b60405180910390f35b610098610093366004610fd8565b610314565b005b6100ad6100a8366004611011565b6103b8565b60405190815260200161007c565b6100986100c9366004611074565b610426565b61006f6100dc366004611091565b61047c565b61010560405180606001604052806060815260200160608152602001606081525090565b6000828152602081815260408083208151815460809481028201850190935260608101838152909491938593919285929185015b828210156101a257600084815260209020604080518082019091529083018054829060ff16600281111561016f5761016f610e37565b600281111561018057610180610e37565b81529054610100900460ff166020918201529082526001929092019101610139565b50505050815260200160018201805480602002602001604051908101604052809291908181526020016000905b8282101561025a576000848152602090206040805160808101909152600484029091018054829060ff16600581111561020a5761020a610e37565b600581111561021b5761021b610e37565b815260018281015460208084019190915260028401546001600160a01b03166040840152600390930154606090920191909152918352920191016101cf565b50505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156103065760008481526020902060408051606081019091529083018054829060ff1660028111156102be576102be610e37565b60028111156102cf576102cf610e37565b8152905460ff6101008204811660208085019190915262010000909204166040909201919091529082526001929092019101610287565b505050915250909392505050565b60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a00540361035657604051635db5c7cd60e11b815260040160405180910390fd5b61037f60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b61038a8383836104aa565b6103b360017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b505050565b600082815260208190526040812082906103d2828261140a565b50506040516bffffffffffffffffffffffff193260601b16602082015243603482015260009060540160405160208183030381529060405280519060200120905061041f81306000610743565b9392505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661047057604051630ef4733760e31b815260040160405180910390fd5b610479816109f2565b50565b6104a060405180606001604052806060815260200160608152602001606081525090565b61041f8383610a2d565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919061010090046001600160a01b031615806104f45750805460ff16155b1561051257604051637ad5a43960e11b815260040160405180910390fd5b600084815260028201602052604090205460ff161561054457604051637912b73960e01b815260040160405180910390fd5b600084815260018201602052604081205481908190815b8181101561068257600089815260018701602052604081208054839081106105855761058561150e565b60009182526020909120018054909150336001600160a01b03909116036106115760008154600160a01b900460ff1660028111156105c5576105c5610e37565b146105e3576040516347592a4d60e01b815260040160405180910390fd5b80548990829060ff60a01b1916600160a01b83600281111561060757610607610e37565b0217905550600195505b60018154600160a01b900460ff16600281111561063057610630610e37565b03610647578461063f81611524565b955050610679565b60028154600160a01b900460ff16600281111561066657610666610e37565b03610679578361067581611524565b9450505b5060010161055b565b50836106a157604051638223a7e960e01b815260040160405180910390fd5b6106ac60028261153d565b8311806106c257506106bf60028261153d565b82115b156107385760008881526002860160205260408120805460ff191660011790558284116106f05760026106f3565b60015b9050897fb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c63382604051610725919061155f565b60405180910390a26107368a610b27565b505b505050505050505050565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919060ff1615156001036107d55760005b60048201548110156107d357838260040182815481106107a2576107a261150e565b9060005260206000200154036107cb576040516301ab53df60e31b815260040160405180910390fd5b600101610780565b505b81546001600160a01b03166107ec576107ec610bfb565b8154604051634f84544560e01b8152600560048201526000916001600160a01b031690634f84544590602401600060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085d9190810190611636565b825490915060ff1661089e5781546003830180546001600160a01b0319166001600160a01b0388161790556001600160a81b03191661010033021760011782555b600482018054600181018255600091825260208220018590555b815181101561098e5782600101600086815260200190815260200160002060405180604001604052808484815181106108f3576108f361150e565b60200260200101516001600160a01b031681526020016000600281111561091c5761091c610e37565b9052815460018101835560009283526020928390208251910180546001600160a01b031981166001600160a01b03909316928317825593830151929390929183916001600160a81b03191617600160a01b83600281111561097f5761097f610e37565b021790555050506001016108b8565b50825460405163541da4e560e01b81526001600160a01b039091169063541da4e5906109c49033908a90899087906004016116ca565b600060405180830381600087803b1580156109de57600080fd5b505af1158015610736573d6000803e3d6000fd5b610a02636afd38fd60e11b610ccc565b6000805160206119f183398151915280546001600160a01b0319166001600160a01b03831617905550565b610a5160405180606001604052806060815260200160608152602001606081525090565b6000838152600080516020611a118339815191526020526040812080546000805160206119f18339815191529260ff90911615159003610aa457604051637ad5a43960e11b815260040160405180910390fd5b600381015460405163069a3ee960e01b8152600481018690526001600160a01b0390911690600090829063069a3ee990602401600060405180830381865afa158015610af4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b1c9190810190611893565b979650505050505050565b6000818152600080516020611a11833981519152602052604081206000805160206119f1833981519152915b6004820154811015610ba757816001016000836004018381548110610b7a57610b7a61150e565b906000526020600020015481526020019081526020016000206000610b9f9190610daa565b600101610b53565b50610bb6600482016000610dc8565b6000838152600183016020526040812080546001600160a81b03191681556003810180546001600160a01b031916905590610bf46004830182610dc8565b5050505050565b60006000805160206119f1833981519152905060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60060060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad91906119d3565b82546001600160a01b0319166001600160a01b03919091161790915550565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610d59576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610d72565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b50805460008255906000526020600020908101906104799190610de6565b50805460008255906000526020600020908101906104799190610e09565b5b80821115610e055780546001600160a81b0319168155600101610de7565b5090565b5b80821115610e055760008155600101610e0a565b600060208284031215610e3057600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b6003811061047957610479610e37565b60008151808452602080850194506020840160005b83811015610ec7578151805160068110610e8e57610e8e610e37565b885280840151848901526040808201516001600160a01b0316908901526060908101519088015260809096019590820190600101610e72565b509495945050505050565b60008151808452602080850194506020840160005b83811015610ec75781518051610efc81610e4d565b88528084015160ff908116858a0152604091820151169088015260609096019590820190600101610ee7565b6020808252825160608383015280516080840181905260009291820190839060a08601905b80831015610f845783518051610f6281610e4d565b835285015160ff16858301529284019260019290920191604090910190610f4d565b50838701519350601f19925082868203016040870152610fa48185610e5d565b93505050604085015181858403016060860152610fc18382610ed2565b9695505050505050565b6003811061047957600080fd5b600080600060608486031215610fed57600080fd5b8335925060208401359150604084013561100681610fcb565b809150509250925092565b6000806040838503121561102457600080fd5b82359150602083013567ffffffffffffffff81111561104257600080fd5b83016060818603121561105457600080fd5b809150509250929050565b6001600160a01b038116811461047957600080fd5b60006020828403121561108657600080fd5b813561041f8161105f565b600080604083850312156110a457600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60ff8116811461047957600080fd5b81356110f981610fcb565b61110281610e4d565b60ff1982541660ff82168117835550506020820135611120816110df565b815461ff001916600882901b61ff0016178255505050565b6000808335601e1984360301811261114f57600080fd5b83018035915067ffffffffffffffff82111561116a57600080fd5b6020019150600781901b360382131561118257600080fd5b9250929050565b6006811061047957600080fd5b81356111a181611189565b600681106111b1576111b1610e37565b60ff1982541660ff8216811783555050602082013560018201556002810160408301356111dd8161105f565b81546001600160a01b0319166001600160a01b03919091161790556060919091013560039190910155565b600160401b83111561121c5761121c6110b3565b80548382558084101561129a5760026001600160fe1b038281168314611244576112446110c9565b8086168614611255576112556110c9565b506000838152602081208360021b81018760021b820191505b8082101561129557828255826001830155828483015582600383015560048201915061126e565b505050505b5060008181526020812083915b858110156112cf576112b98383611196565b60809290920191600491909101906001016112a7565b505050505050565b6000808335601e198436030181126112ee57600080fd5b83018035915067ffffffffffffffff82111561130957600080fd5b602001915060608102360382131561118257600080fd5b813561132b81610fcb565b61133481610e4d565b60ff1982541660ff82168117835550506020820135611352816110df565b815461ff001916600882901b61ff0016178255506040820135611374816110df565b815462ff0000191660109190911b62ff00001617905550565b600160401b8311156113a1576113a16110b3565b8054838255808410156113d8576000828152602081208581019083015b808210156113d4578282556001820191506113be565b5050505b5060008181526020812083915b858110156112cf576113f78383611320565b60609290920191600191820191016113e5565b8135601e1983360301811261141e57600080fd5b8201803567ffffffffffffffff81111561143757600080fd5b6020820191508060061b360382131561144f57600080fd5b600160401b811115611463576114636110b3565b82548184558082101561149a576000848152602081208381019083015b8082101561149657828255600182019150611480565b5050505b5060008381526020902060005b828110156114cc576114b984836110ee565b60409390930192600191820191016114a7565b505050506114dd6020830183611138565b6114eb818360018601611208565b50506114fa60408301836112d7565b61150881836002860161138d565b50505050565b634e487b7160e01b600052603260045260246000fd5b600060018201611536576115366110c9565b5060010190565b60008261155a57634e487b7160e01b600052601260045260246000fd5b500490565b6020810161156c83610e4d565b91905290565b6040516080810167ffffffffffffffff81118282101715611595576115956110b3565b60405290565b6040516060810167ffffffffffffffff81118282101715611595576115956110b3565b6040805190810167ffffffffffffffff81118282101715611595576115956110b3565b604051601f8201601f1916810167ffffffffffffffff8111828210171561160a5761160a6110b3565b604052919050565b600067ffffffffffffffff82111561162c5761162c6110b3565b5060051b60200190565b6000602080838503121561164957600080fd5b825167ffffffffffffffff81111561166057600080fd5b8301601f8101851361167157600080fd5b805161168461167f82611612565b6115e1565b81815260059190911b820183019083810190878311156116a357600080fd5b928401925b82841015610b1c5783516116bb8161105f565b825292840192908401906116a8565b60006080820160018060a01b03808816845260208760208601528660408601526080606086015282865180855260a08701915060208801945060005b81811015611724578551851683529483019491830191600101611706565b50909a9950505050505050505050565b600082601f83011261174557600080fd5b8151602061175561167f83611612565b82815260079290921b8401810191818101908684111561177457600080fd5b8286015b848110156117d957608081890312156117915760008081fd5b611799611572565b81516117a481611189565b815281850151858201526040808301516117bd8161105f565b9082015260608281015190820152835291830191608001611778565b509695505050505050565b600082601f8301126117f557600080fd5b8151602061180561167f83611612565b8281526060928302850182019282820191908785111561182457600080fd5b8387015b858110156118865781818a0312156118405760008081fd5b61184861159b565b815161185381610fcb565b815281860151611862816110df565b81870152604082810151611875816110df565b908201528452928401928101611828565b5090979650505050505050565b600060208083850312156118a657600080fd5b825167ffffffffffffffff808211156118be57600080fd5b90840190606082870312156118d257600080fd5b6118da61159b565b8251828111156118e957600080fd5b8301601f810188136118fa57600080fd5b805161190861167f82611612565b81815260069190911b8201860190868101908a83111561192757600080fd5b928701925b8284101561197d576040848c0312156119455760008081fd5b61194d6115be565b845161195881610fcb565b815284890151611967816110df565b818a01528252604093909301929087019061192c565b8452505050828401518281111561199357600080fd5b61199f88828601611734565b858301525060408301519350818411156119b857600080fd5b6119c4878585016117e4565b60408201529695505050505050565b6000602082840312156119e557600080fd5b815161041f8161105f56fe9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e01","sourceMap":"353:932:246:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;753:145;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1223:205:177;;;;;;:::i;:::-;;:::i;:::-;;902:381:246;;;;;;:::i;:::-;;:::i;:::-;;;4564:25:375;;;4552:2;4537:18;902:381:246;4418:177:375;690:171:177;;;;;;:::i;:::-;;:::i;1432:182::-;;;;;;:::i;:::-;;:::i;753:145:246:-;821:32;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;821:32:246;868:17;:25;;;;;;;;;;;861:32;;;;;;;;;;;;;;;;;;;;;;;868:25;;861:32;;;;868:25;;861:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;861:32:246;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;861:32:246;;-1:-1:-1;861:32:246;;753:145;-1:-1:-1;;;753:145:246:o;1223:205:177:-;415:1:92;302:66:93;515:38:92;:66;511:117;;596:32;;-1:-1:-1;;;596:32:92;;;;;;;;;;;511:117;634:22;415:1;302:66:93;832:65:92;777:125;634:22;1365:58:177::1;1393:13;1408:6;1416;1365:27;:58::i;:::-;669:24:92::0;475:1;302:66:93;832:65:92;777:125;669:24;1223:205:177;;;:::o;902:381:246:-;1026:7;1041:25;;;;;;;;;;1069:8;;1041:36;1069:8;1041:25;:36;:::i;:::-;-1:-1:-1;;1124:41:246;;-1:-1:-1;;1141:9:246;13920:2:375;13916:15;13912:53;1124:41:246;;;13900:66:375;1152:12:246;13982::375;;;13975:28;1083:21:246;;14019:12:375;;1124:41:246;;;;;;;;;;;;1107:64;;;;;;1083:88;;1177:75;1202:13;1242:4;1250:1;1177:24;:75::i;:::-;1265:13;902:381;-1:-1:-1;;;902:381:246:o;690:171:177:-;303:66:64;1263:42:63;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:63;;;;;;;;;;;1258:100;803:53:177::1;837:18;803:33;:53::i;:::-;690:171:::0;:::o;1432:182::-;1527:32;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;1527:32:177;1574:35;1587:13;1602:6;1574:12;:35::i;2771:1911:178:-;2901:41;3024:30;;;-1:-1:-1;;;;;;;;;;;3024:30:178;;;;;3072:25;;-1:-1:-1;;;;;;;;;;;469:66:179;3024:30:178;3072:25;;;-1:-1:-1;;;;;3072:25:178;:39;;:73;;-1:-1:-1;3115:21:178;;;;:30;3072:73;3061:156;;;3167:43;;-1:-1:-1;;;3167:43:178;;;;;;;;;;;3061:156;3227:31;;;;:23;;;:31;;;;;;;;3223:110;;;3275:51;;-1:-1:-1;;;3275:51:178;;;;;;;;;;;3223:110;3420:10;3542:34;;;:26;;;:34;;;;;:41;3420:10;;;;;3590:573;3614:22;3610:1;:26;3590:573;;;3651:25;3679:34;;;:26;;;:34;;;;;:37;;3714:1;;3679:37;;;;;;:::i;:::-;;;;;;;;;;3767:13;;3679:37;;-1:-1:-1;3784:10:178;-1:-1:-1;;;;;3767:13:178;;;:27;3763:217;;3827:24;3810:13;;-1:-1:-1;;;3810:13:178;;;;:41;;;;;;;;:::i;:::-;;3806:112;;3872:35;;-1:-1:-1;;;3872:35:178;;;;;;;;;;;3806:112;3927:22;;3943:6;;3927:8;;-1:-1:-1;;;;3927:22:178;-1:-1:-1;;;3943:6:178;3927:22;;;;;;;;:::i;:::-;;;;;;3967:4;3959:12;;3763:217;4030:21;4013:13;;-1:-1:-1;;;4013:13:178;;;;:38;;;;;;;;:::i;:::-;;4009:148;;4063:8;;;;:::i;:::-;;;;4009:148;;;4107:21;4090:13;;-1:-1:-1;;;4090:13:178;;;;:38;;;;;;;;:::i;:::-;;4086:71;;4140:8;;;;:::i;:::-;;;;4086:71;-1:-1:-1;3638:3:178;;3590:573;;;;4174:5;4169:65;;4196:31;;-1:-1:-1;;;4196:31:178;;;;;;;;;;;4169:65;4260:26;4285:1;4260:22;:26;:::i;:::-;4251:6;:35;:74;;;-1:-1:-1;4299:26:178;4324:1;4299:22;:26;:::i;:::-;4290:6;:35;4251:74;4240:438;;;4340:31;;;;:23;;;:31;;;;;:38;;-1:-1:-1;;4340:38:178;4374:4;4340:38;;;4415:15;;;:79;;4473:21;4415:79;;;4441:21;4415:79;4386:108;;4603:13;4574:56;4618:11;4574:56;;;;;;:::i;:::-;;;;;;;;4638:33;4657:13;4638:18;:33::i;:::-;4332:346;4240:438;2895:1787;;;;;;2771:1911;;;:::o;1449:1318::-;1583:41;1707:30;;;-1:-1:-1;;;;;;;;;;;1707:30:178;;;;;1748:21;;-1:-1:-1;;;;;;;;;;;469:66:179;1707:30:178;1748:21;;:29;;1707:15;1748:29;1744:244;;1792:9;1787:195;1811:19;;;:26;1807:30;;1787:195;;;1884:6;1858:11;:19;;1878:1;1858:22;;;;;;;;:::i;:::-;;;;;;;;;:32;1854:120;;1911:52;;-1:-1:-1;;;1911:52:178;;;;;;;;;;;1854:120;1839:3;;1787:195;;;;1744:244;2065:21;;-1:-1:-1;;;;;2065:21:178;2053:97;;2111:32;:30;:32::i;:::-;2189:21;;:39;;-1:-1:-1;;;2189:39:178;;2226:1;2189:39;;;4564:25:375;2156:30:178;;-1:-1:-1;;;;;2189:21:178;;:36;;4537:18:375;;2189:39:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2189:39:178;;;;;;;;;;;;:::i;:::-;2240:21;;2156:72;;-1:-1:-1;2240:21:178;;2235:162;;2271:28;;2307:23;;;:37;;-1:-1:-1;;;;;;2307:37:178;-1:-1:-1;;;;;2307:37:178;;;;;-1:-1:-1;;;;;;2352:38:178;2271:28;2380:10;2352:38;;-1:-1:-1;2352:38:178;;;2235:162;2403:19;;;:32;;;;;;;-1:-1:-1;2403:32:178;;;;;;;;;;2442:189;2466:13;:20;2462:1;:24;2442:189;;;2501:11;:26;;:34;2528:6;2501:34;;;;;;;;;;;2550:66;;;;;;;;2566:13;2580:1;2566:16;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;2550:66:178;;;;;2590:24;2550:66;;;;;;;;:::i;:::-;;;2501:123;;;;;;;-1:-1:-1;2501:123:178;;;;;;;;;;;;;;-1:-1:-1;;;;;;2501:123:178;;-1:-1:-1;;;;;2501:123:178;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2501:123:178;;-1:-1:-1;;;2501:123:178;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;2488:3:178;;2442:189;;;-1:-1:-1;2637:21:178;;:125;;-1:-1:-1;;;2637:125:178;;-1:-1:-1;;;;;2637:21:178;;;;:45;;:125;;2690:10;;2708:13;;2729:6;;2743:13;;2637:125;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;865:209:177;971:50;-1:-1:-1;;;971:13:177;:50::i;:::-;-1:-1:-1;;;;;;;;;;;1368:72:178;;-1:-1:-1;;;;;;1368:72:178;-1:-1:-1;;;;;1368:72:178;;;;;690:171:177;:::o;5124:575:178:-;5220:32;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;5220:32:178;5260:41;5384:30;;;-1:-1:-1;;;;;;;;;;;5384:30:178;;;;;5425:21;;-1:-1:-1;;;;;;;;;;;469:66:179;5425:21:178;;;;:30;;;;5421:101;;5472:43;;-1:-1:-1;;;5472:43:178;;;;;;;;;;;5421:101;5575:23;;;;5650:22;;-1:-1:-1;;;5650:22:178;;;;;4564:25:375;;;-1:-1:-1;;;;;5575:23:178;;;;5528:19;;5575:23;;5650:14;;4537:18:375;;5650:22:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5650:22:178;;;;;;;;;;;;:::i;:::-;5606:66;5124:575;-1:-1:-1;;;;;;;5124:575:178:o;4686:434::-;4752:41;4876:30;;;-1:-1:-1;;;;;;;;;;;4876:30:178;;;;;-1:-1:-1;;;;;;;;;;;469:66:179;4912:129:178;4936:19;;;:26;4932:30;;4912:129;;;4984:11;:26;;:50;5011:11;:19;;5031:1;5011:22;;;;;;;;:::i;:::-;;;;;;;;;4984:50;;;;;;;;;;;;4977:57;;;;:::i;:::-;4964:3;;4912:129;;;-1:-1:-1;5046:26:178;5053:19;;;;5046:26;:::i;:::-;5085:30;;;;:15;;;:30;;;;;5078:37;;-1:-1:-1;;;;;;5078:37:178;;;;;;;;-1:-1:-1;;;;;;5078:37:178;;;5085:30;5078:37;;;;5085:30;5078:37;:::i;:::-;;;4746:374;;4686:434;:::o;5891:366::-;5948:41;-1:-1:-1;;;;;;;;;;;5948:83:178;-1:-1:-1;6037:26:178;294:66:188;6097:39:178;;;6066:117;;-1:-1:-1;;;6066:117:178;;-1:-1:-1;;;6066:117:178;;;23132:34:375;-1:-1:-1;;;;;6097:39:178;;;;6066:100;;23105:18:375;;6066:117:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6189:63;;-1:-1:-1;;;;;;6189:63:178;-1:-1:-1;;;;;6189:63:178;;;;;;;;-1:-1:-1;5891:366:178:o;452:282:66:-;-1:-1:-1;;;;;;1121:62:66;;1096:4;1121:62;;;303:66:68;1121:62:66;;;;;;;;:70;;:62;:70;510:182;;-1:-1:-1;;;;;;556:62:66;;:49;:62;;;303:66:68;556:62:66;;;;;:69;;-1:-1:-1;;556:69:66;621:4;556:69;;;510:182;;;653:32;;-1:-1:-1;;;653:32:66;;;;;;;;;;;510:182;702:27;;-1:-1:-1;;;;;;702:27:66;;;;;;;;452:282;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:180:375;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:375;;14:180;-1:-1:-1;14:180:375:o;199:127::-;260:10;255:3;251:20;248:1;241:31;291:4;288:1;281:15;315:4;312:1;305:15;331:126;425:1;418:5;415:12;405:46;;431:18;;:::i;462:807::-;529:3;567:5;561:12;594:6;589:3;582:19;620:4;649;644:3;640:14;633:21;;688:4;681:5;677:16;711:1;721:523;735:6;732:1;729:13;721:523;;;800:6;794:13;836:2;830:9;869:1;865:2;862:9;852:43;;875:18;;:::i;:::-;908:15;;963:11;;;957:18;943:12;;;936:40;999:4;1047:11;;;1041:18;-1:-1:-1;;;;;1037:44:375;1023:12;;;1016:66;1105:4;1149:11;;;1143:18;1129:12;;;1122:40;1191:4;1182:14;;;;1219:15;;;;1078:1;750:9;721:523;;;-1:-1:-1;1260:3:375;;462:807;-1:-1:-1;;;;;462:807:375:o;1274:797::-;1343:3;1381:5;1375:12;1408:6;1403:3;1396:19;1434:4;1463;1458:3;1454:14;1447:21;;1502:4;1495:5;1491:16;1525:1;1535:511;1549:6;1546:1;1543:13;1535:511;;;1614:6;1608:13;1650:2;1644:9;1666:47;1710:2;1666:47;:::i;:::-;1726:15;;1780:11;;;1774:18;1815:4;1853:21;;;1839:12;;;1832:43;1898:4;1946:11;;;1940:18;1936:27;1922:12;;;1915:49;1993:4;1984:14;;;;2021:15;;;;1571:1;1564:9;1535:511;;2076:1338;2251:2;2262:21;;;2354:13;;2403:4;2383:18;;;2376:32;2457:19;;2321:3;2306:19;;2485:22;;;2222:4;;2251:2;2565:21;;;2222:4;;2538:3;2523:19;;;2614:352;2628:6;2625:1;2622:13;2614:352;;;2693:6;2687:13;2729:2;2723:9;2745:47;2789:2;2745:47;:::i;:::-;2805:15;;2864:11;;2858:18;2878:4;2854:29;2840:12;;;2833:51;2941:15;;;;2650:1;2643:9;;;;;2913:4;2904:14;;;;2614:352;;;2618:3;3015:2;3007:6;3003:15;2997:22;2975:44;;3042:2;3038:7;3028:17;;3108:2;3096:9;3091:3;3087:19;3083:28;3076:4;3065:9;3061:20;3054:58;3135:63;3194:3;3178:14;3135:63;:::i;:::-;3121:77;;;;3247:4;3239:6;3235:17;3229:24;3319:2;3307:9;3299:6;3295:22;3291:31;3284:4;3273:9;3269:20;3262:61;3340:68;3401:6;3385:14;3340:68;:::i;:::-;3332:76;2076:1338;-1:-1:-1;;;;;;2076:1338:375:o;3419:113::-;3506:1;3499:5;3496:12;3486:40;;3522:1;3519;3512:12;3537:415;3634:6;3642;3650;3703:2;3691:9;3682:7;3678:23;3674:32;3671:52;;;3719:1;3716;3709:12;3671:52;3755:9;3742:23;3732:33;;3812:2;3801:9;3797:18;3784:32;3774:42;;3866:2;3855:9;3851:18;3838:32;3879:43;3916:5;3879:43;:::i;:::-;3941:5;3931:15;;;3537:415;;;;;:::o;3957:456::-;4054:6;4062;4115:2;4103:9;4094:7;4090:23;4086:32;4083:52;;;4131:1;4128;4121:12;4083:52;4167:9;4154:23;4144:33;;4228:2;4217:9;4213:18;4200:32;4255:18;4247:6;4244:30;4241:50;;;4287:1;4284;4277:12;4241:50;4310:22;;4366:2;4348:16;;;4344:25;4341:45;;;4382:1;4379;4372:12;4341:45;4405:2;4395:12;;;3957:456;;;;;:::o;4600:152::-;-1:-1:-1;;;;;4696:31:375;;4686:42;;4676:70;;4742:1;4739;4732:12;4757:296;4844:6;4897:2;4885:9;4876:7;4872:23;4868:32;4865:52;;;4913:1;4910;4903:12;4865:52;4952:9;4939:23;4971:52;5017:5;4971:52;:::i;5058:248::-;5126:6;5134;5187:2;5175:9;5166:7;5162:23;5158:32;5155:52;;;5203:1;5200;5193:12;5155:52;-1:-1:-1;;5226:23:375;;;5296:2;5281:18;;;5268:32;;-1:-1:-1;5058:248:375:o;5311:127::-;5372:10;5367:3;5363:20;5360:1;5353:31;5403:4;5400:1;5393:15;5427:4;5424:1;5417:15;5443:127;5504:10;5499:3;5495:20;5492:1;5485:31;5535:4;5532:1;5525:15;5559:4;5556:1;5549:15;5721:114;5805:4;5798:5;5794:16;5787:5;5784:27;5774:55;;5825:1;5822;5815:12;6025:527;6163:5;6150:19;6178:45;6215:7;6178:45;:::i;:::-;6232:52;6276:7;6232:52;:::i;:::-;6329:3;6325:8;6318:4;6312:11;6308:26;6381:3;6372:7;6368:17;6359:7;6356:30;6350:4;6343:44;;;6435:2;6428:5;6424:14;6411:28;6448:31;6471:7;6448:31;:::i;:::-;5930:11;;-1:-1:-1;;5966:19:375;5995:1;5991:13;;;6006:5;5987:25;5963:50;5950:64;;1223:205:177;;;:::o;6557:558:375:-;6663:4;6669:6;6729:11;6716:25;6823:2;6819:7;6808:8;6792:14;6788:29;6784:43;6764:18;6760:68;6750:96;;6842:1;6839;6832:12;6750:96;6869:33;;6921:20;;;-1:-1:-1;6964:18:375;6953:30;;6950:50;;;6996:1;6993;6986:12;6950:50;7029:4;7017:17;;-1:-1:-1;7080:1:375;7076:14;;;7060;7056:35;7046:46;;7043:66;;;7105:1;7102;7095:12;7043:66;6557:558;;;;;:::o;7120:117::-;7211:1;7204:5;7201:12;7191:40;;7227:1;7224;7217:12;7242:778;7390:5;7377:19;7405:49;7446:7;7405:49;:::i;:::-;7485:1;7476:7;7473:14;7463:48;;7491:18;;:::i;:::-;7556:3;7552:8;7545:4;7539:11;7535:26;7608:3;7599:7;7595:17;7586:7;7583:30;7577:4;7570:44;;;7668:2;7661:5;7657:14;7644:28;7640:1;7634:4;7630:12;7623:50;7710:1;7704:4;7700:12;7760:2;7753:5;7749:14;7736:28;7773:54;7819:7;7773:54;:::i;:::-;7862:17;;-1:-1:-1;;;;;;7858:60:375;-1:-1:-1;;;;;7920:33:375;;;;7855:99;7836:119;;8009:2;7998:14;;;;7985:28;7981:1;7971:12;;;;7964:50;7242:778::o;8025:1372::-;-1:-1:-1;;;8185:3:375;8182:29;8179:55;;;8214:18;;:::i;:::-;8263:4;8257:11;8290:3;8284:4;8277:17;8314:6;8309:3;8306:15;8303:689;;;8354:1;-1:-1:-1;;;;;8431:15:375;;;8420:27;;8410:61;;8451:18;;:::i;:::-;8511:2;8506:3;8502:12;8497:3;8494:21;8484:55;;8519:18;;:::i;:::-;8484:55;8562:1;8587:4;8583:2;8576:16;8631:4;8627:2;8617:19;8676:6;8673:1;8669:14;8663:4;8659:25;8727:3;8724:1;8720:11;8714:4;8710:22;8697:35;;8745:237;8763:2;8756:5;8753:13;8745:237;;;8838:2;8831:5;8824:17;8880:2;8876:1;8869:5;8865:13;8858:25;8923:2;8918;8911:5;8907:14;8900:26;8965:2;8961:1;8954:5;8950:13;8943:25;8789:1;8782:5;8778:13;8769:22;;8745:237;;;8749:3;;;;8303:689;-1:-1:-1;5668:1:375;5661:14;;;5705:4;5692:18;;9015:5;;9131:260;9145:3;9142:1;9139:10;9131:260;;;9191:104;9288:6;9275:11;9191:104;:::i;:::-;9330:3;9318:16;;;;;9379:1;9362:19;;;;;9164:1;9157:9;9131:260;;;9135:3;;;8025:1372;;;:::o;9402:563::-;9510:4;9516:6;9576:11;9563:25;9670:2;9666:7;9655:8;9639:14;9635:29;9631:43;9611:18;9607:68;9597:96;;9689:1;9686;9679:12;9597:96;9716:33;;9768:20;;;-1:-1:-1;9811:18:375;9800:30;;9797:50;;;9843:1;9840;9833:12;9797:50;9876:4;9864:17;;-1:-1:-1;9935:4:375;9923:17;;9907:14;9903:38;9893:49;;9890:69;;;9955:1;9952;9945:12;9970:745;10122:5;10109:19;10137:45;10174:7;10137:45;:::i;:::-;10191:52;10235:7;10191:52;:::i;:::-;10288:3;10284:8;10277:4;10271:11;10267:26;10340:3;10331:7;10327:17;10318:7;10315:30;10309:4;10302:44;;;10394:2;10387:5;10383:14;10370:28;10407:31;10430:7;10407:31;:::i;:::-;5930:11;;-1:-1:-1;;5966:19:375;5995:1;5991:13;;;6006:5;5987:25;5963:50;5950:64;;10447:58;10553:2;10546:5;10542:14;10529:28;10566:31;10589:7;10566:31;:::i;:::-;10616:11;;-1:-1:-1;;10652:22:375;10684:2;10680:16;;;;10698:8;10676:31;10649:59;10636:73;;-1:-1:-1;9970:745:375:o;10720:998::-;-1:-1:-1;;;10884:3:375;10881:29;10878:55;;;10913:18;;:::i;:::-;10962:4;10956:11;10989:3;10983:4;10976:17;11013:6;11008:3;11005:15;11002:308;;;11053:1;11067:15;;;11120:4;11107:18;;11191:14;;;;11148:17;;11218:82;11236:2;11229:5;11226:13;11218:82;;;11295:2;11288:5;11281:17;11262:1;11255:5;11251:13;11242:22;;11218:82;;;11222:3;;;11002:308;-1:-1:-1;5668:1:375;5661:14;;;5705:4;5692:18;;11333:5;;11449:263;11463:3;11460:1;11457:10;11449:263;;;11509:108;11610:6;11597:11;11509:108;:::i;:::-;11652:2;11640:15;;;;;11700:1;11683:19;;;;11475:9;11449:263;;11723:2015;11903:5;11890:19;11988:2;11984:7;11976:5;11960:14;11956:26;11952:40;11932:18;11928:65;11918:93;;12007:1;12004;11997:12;11918:93;12032:30;;12085:18;;12126;12115:30;;12112:50;;;12158:1;12155;12148:12;12112:50;12195:4;12189;12185:15;12171:29;;12251:6;12248:1;12244:14;12228;12224:35;12216:6;12212:48;12209:68;;;12273:1;12270;12263:12;12209:68;-1:-1:-1;;;12292:6:375;12289:32;12286:58;;;12324:18;;:::i;:::-;12373:4;12367:11;12400:6;12394:4;12387:20;12430:6;12422;12419:18;12416:314;;;12470:1;12484:15;;;12537:4;12524:18;;12608:17;;;;12565;;12638:82;12656:2;12649:5;12646:13;12638:82;;;12715:2;12708:5;12701:17;12682:1;12675:5;12671:13;12662:22;;12638:82;;;12642:3;;;12416:314;-1:-1:-1;5668:1:375;5661:14;;;5705:4;5692:18;;12860:1;12870:252;12884:6;12881:1;12878:13;12870:252;;;12933:94;13020:6;13007:11;12933:94;:::i;:::-;13062:2;13050:15;;;;;13110:1;13093:19;;;;12899:9;12870:252;;;12874:3;;;;13165:95;13254:4;13247:5;13243:16;13236:5;13165:95;:::i;:::-;13269:154;13409:13;13396:11;13392:1;13386:4;13382:12;13269:154;:::i;:::-;;;13468:95;13559:2;13552:5;13548:14;13541:5;13468:95;:::i;:::-;13572:160;13718:13;13703;13699:1;13693:4;13689:12;13572:160;:::i;:::-;;;11723:2015;;:::o;14042:127::-;14103:10;14098:3;14094:20;14091:1;14084:31;14134:4;14131:1;14124:15;14158:4;14155:1;14148:15;14174:135;14213:3;14234:17;;;14231:43;;14254:18;;:::i;:::-;-1:-1:-1;14301:1:375;14290:13;;14174:135::o;14314:217::-;14354:1;14380;14370:132;;14424:10;14419:3;14415:20;14412:1;14405:31;14459:4;14456:1;14449:15;14487:4;14484:1;14477:15;14370:132;-1:-1:-1;14516:9:375;;14314:217::o;14536:255::-;14688:2;14673:18;;14700:51;14744:6;14700:51;:::i;:::-;14760:25;;;14536:255;:::o;14986:253::-;15058:2;15052:9;15100:4;15088:17;;15135:18;15120:34;;15156:22;;;15117:62;15114:88;;;15182:18;;:::i;:::-;15218:2;15211:22;14986:253;:::o;15244:::-;15316:2;15310:9;15358:4;15346:17;;15393:18;15378:34;;15414:22;;;15375:62;15372:88;;;15440:18;;:::i;15502:257::-;15574:4;15568:11;;;15606:17;;15653:18;15638:34;;15674:22;;;15635:62;15632:88;;;15700:18;;:::i;15764:275::-;15835:2;15829:9;15900:2;15881:13;;-1:-1:-1;;15877:27:375;15865:40;;15935:18;15920:34;;15956:22;;;15917:62;15914:88;;;15982:18;;:::i;:::-;16018:2;16011:22;15764:275;;-1:-1:-1;15764:275:375:o;16044:183::-;16104:4;16137:18;16129:6;16126:30;16123:56;;;16159:18;;:::i;:::-;-1:-1:-1;16204:1:375;16200:14;16216:4;16196:25;;16044:183::o;16232:977::-;16327:6;16358:2;16401;16389:9;16380:7;16376:23;16372:32;16369:52;;;16417:1;16414;16407:12;16369:52;16450:9;16444:16;16483:18;16475:6;16472:30;16469:50;;;16515:1;16512;16505:12;16469:50;16538:22;;16591:4;16583:13;;16579:27;-1:-1:-1;16569:55:375;;16620:1;16617;16610:12;16569:55;16649:2;16643:9;16672:60;16688:43;16728:2;16688:43;:::i;:::-;16672:60;:::i;:::-;16766:15;;;16848:1;16844:10;;;;16836:19;;16832:28;;;16797:12;;;;16872:19;;;16869:39;;;16904:1;16901;16894:12;16869:39;16928:11;;;;16948:231;16964:6;16959:3;16956:15;16948:231;;;17037:3;17031:10;17054:52;17100:5;17054:52;:::i;:::-;17119:18;;16981:12;;;;17157;;;;16948:231;;17214:904;17440:4;17488:3;17477:9;17473:19;17528:1;17524;17519:3;17515:11;17511:19;17569:2;17561:6;17557:15;17546:9;17539:34;17592:2;17630:6;17625:2;17614:9;17610:18;17603:34;17673:6;17668:2;17657:9;17653:18;17646:34;17716:3;17711:2;17700:9;17696:18;17689:31;17740:6;17775;17769:13;17806:6;17798;17791:22;17844:3;17833:9;17829:19;17822:26;;17883:2;17875:6;17871:15;17857:29;;17904:1;17914:178;17928:6;17925:1;17922:13;17914:178;;;17993:13;;17989:22;;17977:35;;18067:15;;;;18032:12;;;;17950:1;17943:9;17914:178;;;-1:-1:-1;18109:3:375;;17214:904;-1:-1:-1;;;;;;;;;;17214:904:375:o;18305:1300::-;18384:5;18437:3;18430:4;18422:6;18418:17;18414:27;18404:55;;18455:1;18452;18445:12;18404:55;18484:6;18478:13;18510:4;18534:60;18550:43;18590:2;18550:43;:::i;18534:60::-;18628:15;;;18714:1;18710:10;;;;18698:23;;18694:32;;;18659:12;;;;18738:15;;;18735:35;;;18766:1;18763;18756:12;18735:35;18802:2;18794:6;18790:15;18814:762;18830:6;18825:3;18822:15;18814:762;;;18908:4;18902:3;18897;18893:13;18889:24;18886:114;;;18954:1;18983:2;18979;18972:14;18886:114;19026:22;;:::i;:::-;19082:3;19076:10;19099:49;19140:7;19099:49;:::i;:::-;19161:22;;19225:12;;;19219:19;19203:14;;;19196:43;19262:2;19298:12;;;19292:19;19324:54;19292:19;19324:54;:::i;:::-;19398:14;;;19391:31;19445:2;19489:12;;;19483:19;19467:14;;;19460:43;19516:18;;19554:12;;;;18856:4;18847:14;18814:762;;;-1:-1:-1;19594:5:375;18305:1300;-1:-1:-1;;;;;;18305:1300:375:o;19610:1295::-;19691:5;19744:3;19737:4;19729:6;19725:17;19721:27;19711:55;;19762:1;19759;19752:12;19711:55;19791:6;19785:13;19817:4;19841:60;19857:43;19897:2;19857:43;:::i;19841:60::-;19935:15;;;19997:4;20040:13;;;20028:26;;20024:35;;;19966:12;;;;19923:3;20071:15;;;20068:35;;;20099:1;20096;20089:12;20068:35;20135:2;20127:6;20123:15;20147:729;20163:6;20158:3;20155:15;20147:729;;;20239:2;20233:3;20228;20224:13;20220:22;20217:112;;;20283:1;20312:2;20308;20301:14;20217:112;20355:22;;:::i;:::-;20411:3;20405:10;20428:45;20465:7;20428:45;:::i;:::-;20486:22;;20542:12;;;20536:19;20568:31;20536:19;20568:31;:::i;:::-;20619:14;;;20612:31;20666:2;20702:12;;;20696:19;20728:31;20696:19;20728:31;:::i;:::-;20779:14;;;20772:31;20816:18;;20854:12;;;;20180;;20147:729;;;-1:-1:-1;20894:5:375;;19610:1295;-1:-1:-1;;;;;;;19610:1295:375:o;20910:2008::-;21007:6;21038:2;21081;21069:9;21060:7;21056:23;21052:32;21049:52;;;21097:1;21094;21087:12;21049:52;21130:9;21124:16;21159:18;21200:2;21192:6;21189:14;21186:34;;;21216:1;21213;21206:12;21186:34;21239:22;;;;21295:4;21277:16;;;21273:27;21270:47;;;21313:1;21310;21303:12;21270:47;21339:22;;:::i;:::-;21392:2;21386:9;21420:2;21410:8;21407:16;21404:36;;;21436:1;21433;21426:12;21404:36;21459:17;;21507:4;21499:13;;21495:27;-1:-1:-1;21485:55:375;;21536:1;21533;21526:12;21485:55;21565:2;21559:9;21588:60;21604:43;21644:2;21604:43;:::i;21588:60::-;21682:15;;;21764:1;21760:10;;;;21752:19;;21748:28;;;21713:12;;;;21788:19;;;21785:39;;;21820:1;21817;21810:12;21785:39;21844:11;;;;21864:585;21880:6;21875:3;21872:15;21864:585;;;21962:4;21956:3;21947:7;21943:17;21939:28;21936:118;;;22008:1;22037:2;22033;22026:14;21936:118;22082:22;;:::i;:::-;22138:3;22132:10;22155:45;22192:7;22155:45;:::i;:::-;22213:24;;22271:12;;;22265:19;22297:31;22265:19;22297:31;:::i;:::-;22348:16;;;22341:33;22387:20;;21906:4;21897:14;;;;;22427:12;;;;21864:585;;;22458:20;;-1:-1:-1;;;22509:11:375;;;22503:18;22533:16;;;22530:36;;;22562:1;22559;22552:12;22530:36;22598:81;22671:7;22660:8;22656:2;22652:17;22598:81;:::i;:::-;22593:2;22586:5;22582:14;22575:105;;22719:4;22715:2;22711:13;22705:20;22689:36;;22750:2;22740:8;22737:16;22734:36;;;22766:1;22763;22756:12;22734:36;22804:83;22879:7;22868:8;22864:2;22860:17;22804:83;:::i;:::-;22797:4;22786:16;;22779:109;22790:5;20910:2008;-1:-1:-1;;;;;;20910:2008:375:o;23177:272::-;23247:6;23300:2;23288:9;23279:7;23275:23;23271:32;23268:52;;;23316:1;23313;23306:12;23268:52;23348:9;23342:16;23367:52;23413:5;23367:52;:::i","linkReferences":{}},"methodIdentifiers":{"__EntitlementGated_init(address)":"7adc9cbe","getRuleData(bytes32,uint256)":"92c399ff","getRuleData(uint256)":"069a3ee9","postEntitlementCheckResult(bytes32,uint256,uint8)":"4739e805","requestEntitlementCheck(uint256,((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]))":"57e70027"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntitlementChecker\",\"name\":\"checker\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"EntitlementGated_InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_NodeAlreadyVoted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_NodeNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_TransactionCheckAlreadyCompleted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_TransactionCheckAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementGated_TransactionNotRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuard__ReentrantCall\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"transactionId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enum IEntitlementGatedBase.NodeVoteStatus\",\"name\":\"result\",\"type\":\"uint8\"}],\"name\":\"EntitlementCheckResultPosted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"contract IEntitlementChecker\",\"name\":\"entitlementChecker\",\"type\":\"address\"}],\"name\":\"__EntitlementGated_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getRuleData\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CombinedOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.Operation[]\",\"name\":\"operations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CheckOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"internalType\":\"struct IRuleEntitlement.CheckOperation[]\",\"name\":\"checkOperations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.LogicalOperationType\",\"name\":\"logOpType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"leftOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"rightOperationIndex\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.LogicalOperation[]\",\"name\":\"logicalOperations\",\"type\":\"tuple[]\"}],\"internalType\":\"struct IRuleEntitlement.RuleData\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"transactionId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getRuleData\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CombinedOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.Operation[]\",\"name\":\"operations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CheckOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"internalType\":\"struct IRuleEntitlement.CheckOperation[]\",\"name\":\"checkOperations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.LogicalOperationType\",\"name\":\"logOpType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"leftOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"rightOperationIndex\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.LogicalOperation[]\",\"name\":\"logicalOperations\",\"type\":\"tuple[]\"}],\"internalType\":\"struct IRuleEntitlement.RuleData\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"transactionId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"internalType\":\"enum IEntitlementGatedBase.NodeVoteStatus\",\"name\":\"result\",\"type\":\"uint8\"}],\"name\":\"postEntitlementCheckResult\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"components\":[{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CombinedOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.Operation[]\",\"name\":\"operations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.CheckOperationType\",\"name\":\"opType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"internalType\":\"struct IRuleEntitlement.CheckOperation[]\",\"name\":\"checkOperations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"enum IRuleEntitlement.LogicalOperationType\",\"name\":\"logOpType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"leftOperationIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"rightOperationIndex\",\"type\":\"uint8\"}],\"internalType\":\"struct IRuleEntitlement.LogicalOperation[]\",\"name\":\"logicalOperations\",\"type\":\"tuple[]\"}],\"internalType\":\"struct IRuleEntitlement.RuleData\",\"name\":\"ruleData\",\"type\":\"tuple\"}],\"name\":\"requestEntitlementCheck\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/mocks/MockEntitlementGated.sol\":\"MockEntitlementGated\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/base/registry/facets/checker/IEntitlementChecker.sol\":{\"keccak256\":\"0x5c9a99c94e95a0c89b3d3310e252cd98aeafe34d87ffc0058f9b001af6f28bd1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7983b17a371e76c8681756dc10abe26f8fffd35d3d6d8773c2023f06c8600ba3\",\"dweb:/ipfs/QmSDkTctKCTaMGYF2LZ1N9YWwDTZD75XegpPyLrP694JFf\"]},\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol\":{\"keccak256\":\"0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b\",\"dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq\"]},\"contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol\":{\"keccak256\":\"0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c\",\"dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T\"]},\"contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol\":{\"keccak256\":\"0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6\",\"dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC\"]},\"contracts/src/factory/facets/registry/IImplementationRegistry.sol\":{\"keccak256\":\"0x2409b9eb86a4dc5849050d06409fd7548ac21f9bf6e7419b91dfb9226db0a3d5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://613195fc78a1a496820c5934f315c586ad33edf7608022d2ae0ea44f52529e61\",\"dweb:/ipfs/QmR8Gn11UNq2rKC5Qp7Prdk61oWhNg3UVc8KeyWCRfrEqV\"]},\"contracts/src/spaces/entitlements/IEntitlement.sol\":{\"keccak256\":\"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3\",\"dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf\"]},\"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol\":{\"keccak256\":\"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1\",\"dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97\"]},\"contracts/src/spaces/facets/gated/EntitlementGated.sol\":{\"keccak256\":\"0x69b525c004a345b89f3c784df334780a2d399b3f2058183daf65862f2d095820\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e927c722387563b909fd26cbd09cff0b5bc905a3c0c5c00b9c40c4d66bf19e70\",\"dweb:/ipfs/Qmbk5XXjzLaZJSaSSjhpEm2pyB2GSj1cDPChYdJup9wStk\"]},\"contracts/src/spaces/facets/gated/EntitlementGatedBase.sol\":{\"keccak256\":\"0x0aa9887cf58dd68d0270c85e2d7610080f35410b845c2227e4bd84356b7a2cb7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6dbdbed895fc2a53bffa3dbc1cfd4c992a096f153e6bbb7aeb9894485e7fc1a6\",\"dweb:/ipfs/QmZp76Gd8aL9pWbiTvLaiHv1w12yjN59PtYdMvoUCbfbH5\"]},\"contracts/src/spaces/facets/gated/EntitlementGatedStorage.sol\":{\"keccak256\":\"0xe997c0dd62f6ceb300729d3f56a3f25a47b40ed5946d68c5210c38941cb37eaa\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://63fcfd9f667538e8e9339534d2ddc6f7899e4179a54f3c6595e2598babb5bb9c\",\"dweb:/ipfs/QmUfKtfgW1uskEWkhhGqTjcbCqMANQoKKfTgV2ZvdAZpvJ\"]},\"contracts/src/spaces/facets/gated/IEntitlementGated.sol\":{\"keccak256\":\"0x948de1018f7f78366263a40e0f8269e10941216bd03a9996edb24a6230959e74\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://dc985539ce639f39fd68723acca6424a78deac6cec3693c9d8e1084a487c83ec\",\"dweb:/ipfs/QmQujX5rmDwhJZurp11FTiPLb7ev9swLTtdkagA8wydZiT\"]},\"contracts/src/spaces/facets/membership/MembershipStorage.sol\":{\"keccak256\":\"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee\",\"dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5\"]},\"contracts/test/mocks/MockEntitlementGated.sol\":{\"keccak256\":\"0x6150ce1c80ac5a5a06b512f794eb412446e6ba9b21b9746e06d2114fd1dcac4f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f303850697a14ea243ec90c2a514a028e9d1c319756e85d7a5985fc259b2c37a\",\"dweb:/ipfs/QmNuLXg5x4L8rEGMyfGdjVDQYoLKoVSZPQi2FGA7YJJSWv\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"contract IEntitlementChecker","name":"checker","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"EntitlementGated_InvalidAddress"},{"inputs":[],"type":"error","name":"EntitlementGated_NodeAlreadyVoted"},{"inputs":[],"type":"error","name":"EntitlementGated_NodeNotFound"},{"inputs":[],"type":"error","name":"EntitlementGated_TransactionCheckAlreadyCompleted"},{"inputs":[],"type":"error","name":"EntitlementGated_TransactionCheckAlreadyRegistered"},{"inputs":[],"type":"error","name":"EntitlementGated_TransactionNotRegistered"},{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[],"type":"error","name":"ReentrancyGuard__ReentrantCall"},{"inputs":[{"internalType":"bytes32","name":"transactionId","type":"bytes32","indexed":true},{"internalType":"enum IEntitlementGatedBase.NodeVoteStatus","name":"result","type":"uint8","indexed":false}],"type":"event","name":"EntitlementCheckResultPosted","anonymous":false},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"contract IEntitlementChecker","name":"entitlementChecker","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"__EntitlementGated_init"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getRuleData","outputs":[{"internalType":"struct IRuleEntitlement.RuleData","name":"","type":"tuple","components":[{"internalType":"struct IRuleEntitlement.Operation[]","name":"operations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CombinedOperationType","name":"opType","type":"uint8"},{"internalType":"uint8","name":"index","type":"uint8"}]},{"internalType":"struct IRuleEntitlement.CheckOperation[]","name":"checkOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CheckOperationType","name":"opType","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"threshold","type":"uint256"}]},{"internalType":"struct IRuleEntitlement.LogicalOperation[]","name":"logicalOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.LogicalOperationType","name":"logOpType","type":"uint8"},{"internalType":"uint8","name":"leftOperationIndex","type":"uint8"},{"internalType":"uint8","name":"rightOperationIndex","type":"uint8"}]}]}]},{"inputs":[{"internalType":"bytes32","name":"transactionId","type":"bytes32"},{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getRuleData","outputs":[{"internalType":"struct IRuleEntitlement.RuleData","name":"","type":"tuple","components":[{"internalType":"struct IRuleEntitlement.Operation[]","name":"operations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CombinedOperationType","name":"opType","type":"uint8"},{"internalType":"uint8","name":"index","type":"uint8"}]},{"internalType":"struct IRuleEntitlement.CheckOperation[]","name":"checkOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CheckOperationType","name":"opType","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"threshold","type":"uint256"}]},{"internalType":"struct IRuleEntitlement.LogicalOperation[]","name":"logicalOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.LogicalOperationType","name":"logOpType","type":"uint8"},{"internalType":"uint8","name":"leftOperationIndex","type":"uint8"},{"internalType":"uint8","name":"rightOperationIndex","type":"uint8"}]}]}]},{"inputs":[{"internalType":"bytes32","name":"transactionId","type":"bytes32"},{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"enum IEntitlementGatedBase.NodeVoteStatus","name":"result","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"postEntitlementCheckResult"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"struct IRuleEntitlement.RuleData","name":"ruleData","type":"tuple","components":[{"internalType":"struct IRuleEntitlement.Operation[]","name":"operations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CombinedOperationType","name":"opType","type":"uint8"},{"internalType":"uint8","name":"index","type":"uint8"}]},{"internalType":"struct IRuleEntitlement.CheckOperation[]","name":"checkOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.CheckOperationType","name":"opType","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"threshold","type":"uint256"}]},{"internalType":"struct IRuleEntitlement.LogicalOperation[]","name":"logicalOperations","type":"tuple[]","components":[{"internalType":"enum IRuleEntitlement.LogicalOperationType","name":"logOpType","type":"uint8"},{"internalType":"uint8","name":"leftOperationIndex","type":"uint8"},{"internalType":"uint8","name":"rightOperationIndex","type":"uint8"}]}]}],"stateMutability":"nonpayable","type":"function","name":"requestEntitlementCheck","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/test/mocks/MockEntitlementGated.sol":"MockEntitlementGated"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/base/registry/facets/checker/IEntitlementChecker.sol":{"keccak256":"0x5c9a99c94e95a0c89b3d3310e252cd98aeafe34d87ffc0058f9b001af6f28bd1","urls":["bzz-raw://7983b17a371e76c8681756dc10abe26f8fffd35d3d6d8773c2023f06c8600ba3","dweb:/ipfs/QmSDkTctKCTaMGYF2LZ1N9YWwDTZD75XegpPyLrP694JFf"],"license":"MIT"},"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol":{"keccak256":"0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a","urls":["bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b","dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol":{"keccak256":"0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f","urls":["bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c","dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol":{"keccak256":"0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c","urls":["bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6","dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC"],"license":"Apache-2.0"},"contracts/src/factory/facets/registry/IImplementationRegistry.sol":{"keccak256":"0x2409b9eb86a4dc5849050d06409fd7548ac21f9bf6e7419b91dfb9226db0a3d5","urls":["bzz-raw://613195fc78a1a496820c5934f315c586ad33edf7608022d2ae0ea44f52529e61","dweb:/ipfs/QmR8Gn11UNq2rKC5Qp7Prdk61oWhNg3UVc8KeyWCRfrEqV"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/IEntitlement.sol":{"keccak256":"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca","urls":["bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3","dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol":{"keccak256":"0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf","urls":["bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1","dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97"],"license":"MIT"},"contracts/src/spaces/facets/gated/EntitlementGated.sol":{"keccak256":"0x69b525c004a345b89f3c784df334780a2d399b3f2058183daf65862f2d095820","urls":["bzz-raw://e927c722387563b909fd26cbd09cff0b5bc905a3c0c5c00b9c40c4d66bf19e70","dweb:/ipfs/Qmbk5XXjzLaZJSaSSjhpEm2pyB2GSj1cDPChYdJup9wStk"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/EntitlementGatedBase.sol":{"keccak256":"0x0aa9887cf58dd68d0270c85e2d7610080f35410b845c2227e4bd84356b7a2cb7","urls":["bzz-raw://6dbdbed895fc2a53bffa3dbc1cfd4c992a096f153e6bbb7aeb9894485e7fc1a6","dweb:/ipfs/QmZp76Gd8aL9pWbiTvLaiHv1w12yjN59PtYdMvoUCbfbH5"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/EntitlementGatedStorage.sol":{"keccak256":"0xe997c0dd62f6ceb300729d3f56a3f25a47b40ed5946d68c5210c38941cb37eaa","urls":["bzz-raw://63fcfd9f667538e8e9339534d2ddc6f7899e4179a54f3c6595e2598babb5bb9c","dweb:/ipfs/QmUfKtfgW1uskEWkhhGqTjcbCqMANQoKKfTgV2ZvdAZpvJ"],"license":"Apache-2.0"},"contracts/src/spaces/facets/gated/IEntitlementGated.sol":{"keccak256":"0x948de1018f7f78366263a40e0f8269e10941216bd03a9996edb24a6230959e74","urls":["bzz-raw://dc985539ce639f39fd68723acca6424a78deac6cec3693c9d8e1084a487c83ec","dweb:/ipfs/QmQujX5rmDwhJZurp11FTiPLb7ev9swLTtdkagA8wydZiT"],"license":"MIT"},"contracts/src/spaces/facets/membership/MembershipStorage.sol":{"keccak256":"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3","urls":["bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee","dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5"],"license":"Apache-2.0"},"contracts/test/mocks/MockEntitlementGated.sol":{"keccak256":"0x6150ce1c80ac5a5a06b512f794eb412446e6ba9b21b9746e06d2114fd1dcac4f","urls":["bzz-raw://f303850697a14ea243ec90c2a514a028e9d1c319756e85d7a5985fc259b2c37a","dweb:/ipfs/QmNuLXg5x4L8rEGMyfGdjVDQYoLKoVSZPQi2FGA7YJJSWv"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"}},"version":1},"id":246} \ No newline at end of file diff --git a/packages/generated/v3/abis/MockEntitlementGated.metadata.json b/packages/generated/v3/abis/MockEntitlementGated.metadata.json new file mode 100644 index 000000000..226834f6a --- /dev/null +++ b/packages/generated/v3/abis/MockEntitlementGated.metadata.json @@ -0,0 +1,645 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "contract IEntitlementChecker", + "name": "checker", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_InvalidAddress" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_NodeAlreadyVoted" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_NodeNotFound" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyCompleted" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_TransactionCheckAlreadyRegistered" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementGated_TransactionNotRegistered" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [], + "type": "error", + "name": "ReentrancyGuard__ReentrantCall" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "transactionId", + "type": "bytes32", + "indexed": true + }, + { + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus", + "name": "result", + "type": "uint8", + "indexed": false + } + ], + "type": "event", + "name": "EntitlementCheckResultPosted", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "contract IEntitlementChecker", + "name": "entitlementChecker", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__EntitlementGated_init" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getRuleData", + "outputs": [ + { + "internalType": "struct IRuleEntitlement.RuleData", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "struct IRuleEntitlement.Operation[]", + "name": "operations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CombinedOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "index", + "type": "uint8" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "name": "checkOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CheckOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "name": "logicalOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.LogicalOperationType", + "name": "logOpType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "leftOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "rightOperationIndex", + "type": "uint8" + } + ] + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "transactionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getRuleData", + "outputs": [ + { + "internalType": "struct IRuleEntitlement.RuleData", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "struct IRuleEntitlement.Operation[]", + "name": "operations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CombinedOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "index", + "type": "uint8" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "name": "checkOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CheckOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "name": "logicalOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.LogicalOperationType", + "name": "logOpType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "leftOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "rightOperationIndex", + "type": "uint8" + } + ] + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "transactionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "enum IEntitlementGatedBase.NodeVoteStatus", + "name": "result", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "postEntitlementCheckResult" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "struct IRuleEntitlement.RuleData", + "name": "ruleData", + "type": "tuple", + "components": [ + { + "internalType": "struct IRuleEntitlement.Operation[]", + "name": "operations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CombinedOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "index", + "type": "uint8" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.CheckOperation[]", + "name": "checkOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.CheckOperationType", + "name": "opType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ] + }, + { + "internalType": "struct IRuleEntitlement.LogicalOperation[]", + "name": "logicalOperations", + "type": "tuple[]", + "components": [ + { + "internalType": "enum IRuleEntitlement.LogicalOperationType", + "name": "logOpType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "leftOperationIndex", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "rightOperationIndex", + "type": "uint8" + } + ] + } + ] + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "requestEntitlementCheck", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ] + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/test/mocks/MockEntitlementGated.sol": "MockEntitlementGated" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/base/registry/facets/checker/IEntitlementChecker.sol": { + "keccak256": "0x5c9a99c94e95a0c89b3d3310e252cd98aeafe34d87ffc0058f9b001af6f28bd1", + "urls": [ + "bzz-raw://7983b17a371e76c8681756dc10abe26f8fffd35d3d6d8773c2023f06c8600ba3", + "dweb:/ipfs/QmSDkTctKCTaMGYF2LZ1N9YWwDTZD75XegpPyLrP694JFf" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol": { + "keccak256": "0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a", + "urls": [ + "bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b", + "dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol": { + "keccak256": "0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f", + "urls": [ + "bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c", + "dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol": { + "keccak256": "0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c", + "urls": [ + "bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6", + "dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/registry/IImplementationRegistry.sol": { + "keccak256": "0x2409b9eb86a4dc5849050d06409fd7548ac21f9bf6e7419b91dfb9226db0a3d5", + "urls": [ + "bzz-raw://613195fc78a1a496820c5934f315c586ad33edf7608022d2ae0ea44f52529e61", + "dweb:/ipfs/QmR8Gn11UNq2rKC5Qp7Prdk61oWhNg3UVc8KeyWCRfrEqV" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/IEntitlement.sol": { + "keccak256": "0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca", + "urls": [ + "bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3", + "dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/rule/IRuleEntitlement.sol": { + "keccak256": "0x795b58a2ed6205d814e01e58a4a5e88ff69401ee7540d01c4881b7b28f04cfcf", + "urls": [ + "bzz-raw://684e395bce3abedfb499ba8b2708a4f0ca9d1b1f73eb0ebc647d4cead0b8fdd1", + "dweb:/ipfs/QmWz2Eu8UGXYskoBFtFXLBuwDrxUfYDLeQuTCeApALdf97" + ], + "license": "MIT" + }, + "contracts/src/spaces/facets/gated/EntitlementGated.sol": { + "keccak256": "0x69b525c004a345b89f3c784df334780a2d399b3f2058183daf65862f2d095820", + "urls": [ + "bzz-raw://e927c722387563b909fd26cbd09cff0b5bc905a3c0c5c00b9c40c4d66bf19e70", + "dweb:/ipfs/Qmbk5XXjzLaZJSaSSjhpEm2pyB2GSj1cDPChYdJup9wStk" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/EntitlementGatedBase.sol": { + "keccak256": "0x0aa9887cf58dd68d0270c85e2d7610080f35410b845c2227e4bd84356b7a2cb7", + "urls": [ + "bzz-raw://6dbdbed895fc2a53bffa3dbc1cfd4c992a096f153e6bbb7aeb9894485e7fc1a6", + "dweb:/ipfs/QmZp76Gd8aL9pWbiTvLaiHv1w12yjN59PtYdMvoUCbfbH5" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/EntitlementGatedStorage.sol": { + "keccak256": "0xe997c0dd62f6ceb300729d3f56a3f25a47b40ed5946d68c5210c38941cb37eaa", + "urls": [ + "bzz-raw://63fcfd9f667538e8e9339534d2ddc6f7899e4179a54f3c6595e2598babb5bb9c", + "dweb:/ipfs/QmUfKtfgW1uskEWkhhGqTjcbCqMANQoKKfTgV2ZvdAZpvJ" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/gated/IEntitlementGated.sol": { + "keccak256": "0x948de1018f7f78366263a40e0f8269e10941216bd03a9996edb24a6230959e74", + "urls": [ + "bzz-raw://dc985539ce639f39fd68723acca6424a78deac6cec3693c9d8e1084a487c83ec", + "dweb:/ipfs/QmQujX5rmDwhJZurp11FTiPLb7ev9swLTtdkagA8wydZiT" + ], + "license": "MIT" + }, + "contracts/src/spaces/facets/membership/MembershipStorage.sol": { + "keccak256": "0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3", + "urls": [ + "bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee", + "dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5" + ], + "license": "Apache-2.0" + }, + "contracts/test/mocks/MockEntitlementGated.sol": { + "keccak256": "0x6150ce1c80ac5a5a06b512f794eb412446e6ba9b21b9746e06d2114fd1dcac4f", + "urls": [ + "bzz-raw://f303850697a14ea243ec90c2a514a028e9d1c319756e85d7a5985fc259b2c37a", + "dweb:/ipfs/QmNuLXg5x4L8rEGMyfGdjVDQYoLKoVSZPQi2FGA7YJJSWv" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/MockRiverRegistry.abi.json b/packages/generated/v3/abis/MockRiverRegistry.abi.json new file mode 100644 index 000000000..060c40c2b --- /dev/null +++ b/packages/generated/v3/abis/MockRiverRegistry.abi.json @@ -0,0 +1,1243 @@ +[ + { + "type": "constructor", + "inputs": [ + { + "name": "approvedOperators", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__OperatorRegistry_init", + "inputs": [ + { + "name": "initialOperators", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__RiverConfig_init", + "inputs": [ + { + "name": "configManagers", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "allocateStream", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "genesisMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "genesisMiniblock", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approveConfigurationManager", + "inputs": [ + { + "name": "manager", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approveOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "configurationExists", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "deleteConfiguration", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "deleteConfigurationOnBlock", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "blockNumber", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getAllConfiguration", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct Setting[]", + "components": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "blockNumber", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllNodeAddresses", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllNodes", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct Node[]", + "components": [ + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllStreamIds", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32[]", + "internalType": "bytes32[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllStreams", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getConfiguration", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct Setting[]", + "components": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "blockNumber", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Node", + "components": [ + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNodeCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPaginatedStreams", + "inputs": [ + { + "name": "start", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "stop", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + }, + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStream", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamByIndex", + "inputs": [ + { + "name": "i", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct StreamWithId", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamWithGenesis", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + }, + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamsOnNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isConfigurationManager", + "inputs": [ + { + "name": "manager", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "placeStreamOnNode", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "registerNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeConfigurationManager", + "inputs": [ + { + "name": "manager", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeStreamFromNode", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setConfiguration", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "blockNumber", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setStreamLastMiniblock", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateNodeStatus", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateNodeUrl", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "ConfigurationChanged", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "block", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + }, + { + "name": "value", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + }, + { + "name": "deleted", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConfigurationManagerAdded", + "inputs": [ + { + "name": "manager", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConfigurationManagerRemoved", + "inputs": [ + { + "name": "manager", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeAdded", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "status", + "type": "uint8", + "indexed": false, + "internalType": "enum NodeStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeRemoved", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeStatusUpdated", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "status", + "type": "uint8", + "indexed": false, + "internalType": "enum NodeStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeUrlUpdated", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "indexed": false, + "internalType": "string" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorAdded", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorRemoved", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamAllocated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "nodes", + "type": "address[]", + "indexed": false, + "internalType": "address[]" + }, + { + "name": "genesisMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "genesisMiniblock", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamLastMiniblockUpdated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamPlacementUpdated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "isAdded", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/MockRiverRegistry.abi.ts b/packages/generated/v3/abis/MockRiverRegistry.abi.ts new file mode 100644 index 000000000..dbc7e2019 --- /dev/null +++ b/packages/generated/v3/abis/MockRiverRegistry.abi.ts @@ -0,0 +1,1243 @@ +export default [ + { + "type": "constructor", + "inputs": [ + { + "name": "approvedOperators", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__OperatorRegistry_init", + "inputs": [ + { + "name": "initialOperators", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__RiverConfig_init", + "inputs": [ + { + "name": "configManagers", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "allocateStream", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "genesisMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "genesisMiniblock", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approveConfigurationManager", + "inputs": [ + { + "name": "manager", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approveOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "configurationExists", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "deleteConfiguration", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "deleteConfigurationOnBlock", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "blockNumber", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getAllConfiguration", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct Setting[]", + "components": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "blockNumber", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllNodeAddresses", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllNodes", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct Node[]", + "components": [ + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllStreamIds", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32[]", + "internalType": "bytes32[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllStreams", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getConfiguration", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct Setting[]", + "components": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "blockNumber", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Node", + "components": [ + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNodeCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPaginatedStreams", + "inputs": [ + { + "name": "start", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "stop", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + }, + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStream", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamByIndex", + "inputs": [ + { + "name": "i", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct StreamWithId", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamWithGenesis", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + }, + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamsOnNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isConfigurationManager", + "inputs": [ + { + "name": "manager", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "placeStreamOnNode", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "registerNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeConfigurationManager", + "inputs": [ + { + "name": "manager", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeStreamFromNode", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setConfiguration", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "blockNumber", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setStreamLastMiniblock", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateNodeStatus", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateNodeUrl", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "ConfigurationChanged", + "inputs": [ + { + "name": "key", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "block", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + }, + { + "name": "value", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + }, + { + "name": "deleted", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConfigurationManagerAdded", + "inputs": [ + { + "name": "manager", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConfigurationManagerRemoved", + "inputs": [ + { + "name": "manager", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeAdded", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "status", + "type": "uint8", + "indexed": false, + "internalType": "enum NodeStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeRemoved", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeStatusUpdated", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "status", + "type": "uint8", + "indexed": false, + "internalType": "enum NodeStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeUrlUpdated", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "indexed": false, + "internalType": "string" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorAdded", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorRemoved", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamAllocated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "nodes", + "type": "address[]", + "indexed": false, + "internalType": "address[]" + }, + { + "name": "genesisMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "genesisMiniblock", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamLastMiniblockUpdated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamPlacementUpdated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "isAdded", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/MockRiverRegistry.bin b/packages/generated/v3/abis/MockRiverRegistry.bin new file mode 100644 index 000000000..8aa098976 --- /dev/null +++ b/packages/generated/v3/abis/MockRiverRegistry.bin @@ -0,0 +1 @@ +60806040523480156200001157600080fd5b5060405162004ad638038062004ad68339810160408190526200003491620004a6565b6200003e620000c1565b620000493362000169565b60005b8151811015620000b957620000838282815181106200006f576200006f62000578565b60200260200101516200023760201b60201c565b620000b08282815181106200009c576200009c62000578565b60200260200101516200031c60201b60201c565b6001016200004c565b5050620005df565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16156200010e576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156200016657805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b60006200019d7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b90506001600160a01b038216620001c757604051634e3ef82560e01b815260040160405180910390fd5b817f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae30080546001600160a01b0319166001600160a01b03928316179055604051838216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038116620002865760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526200027d91906004016200058e565b60405180910390fd5b62000293600882620003e9565b15620002d757604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526200027d91906004016200058e565b620002e460088262000410565b506040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b6001600160a01b038116620003625760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526200027d91906004016200058e565b6200036f600d8262000410565b620003b257604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526200027d91906004016200058e565b6040516001600160a01b038216907f7afd798379ae2d2e5035438544cea2b60eb1dde6a8128e6d447fd2a25f8825a290600090a250565b6001600160a01b038116600090815260018301602052604081205415155b90505b92915050565b600062000407836001600160a01b03841660008181526001830160205260408120546200046a575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200040a565b5060006200040a565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b0381168114620004a157600080fd5b919050565b60006020808385031215620004ba57600080fd5b82516001600160401b0380821115620004d257600080fd5b818501915085601f830112620004e757600080fd5b815181811115620004fc57620004fc62000473565b8060051b604051601f19603f8301168101818110858211171562000524576200052462000473565b6040529182528482019250838101850191888311156200054357600080fd5b938501935b828510156200056c576200055c8562000489565b8452938501939285019262000548565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020808352835180602085015260005b81811015620005be57858101830151858201604001528201620005a0565b506000604082860101526040601f19601f8301168501019250505092915050565b6144e780620005ef6000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80639d2090481161011a578063c0f22084116100ad578063d4bd44a01161007c578063d4bd44a014610493578063d7a3158a146104a6578063ee885b12146104b9578063eecc66f4146104cc578063fc207c01146104df57600080fd5b8063c0f2208414610442578063c179b85f1461044a578063c8fe3a011461045d578063ca78c41a1461047257600080fd5b8063ac8a584a116100e9578063ac8a584a146103f6578063b2b99ec914610409578063b7f227ee1461041c578063ba428b1a1461042f57600080fd5b80639d2090481461039b5780639ee86d38146103bb578063a09449a6146103ce578063a1174e7d146103e157600080fd5b80633c2544d11161019d5780636d70f7ae1161016c5780636d70f7ae1461032a5780637e4465e71461034d578063813049ec1461036057806386789fc6146103735780639283ae3a1461038857600080fd5b80633c2544d1146102c2578063581f8b9b146102e457806368b454df146102f75780636b883c391461031757600080fd5b806331374511116101d9578063313745111461027157806332705ac41461028457806339bf397e146102a45780633bd84c0c146102ba57600080fd5b8063035759e11461020b578063081814db146102205780631290abe81461023e578063242cae9f1461025e575b600080fd5b61021e610219366004613727565b6104f2565b005b61022861065f565b6040516102359190613790565b60405180910390f35b61025161024c366004613727565b6108ca565b60405161023591906138ab565b61021e61026c3660046138da565b6109ec565b61021e61027f3660046138f5565b610a33565b6102976102923660046138da565b610ac4565b60405161023591906139ea565b6102ac610d74565b604051908152602001610235565b610297610d85565b6102d56102d0366004613727565b610ef6565b604051610235939291906139fd565b61021e6102f2366004613a41565b6110c7565b61030a610305366004613727565b611267565b6040516102359190613a74565b61021e610325366004613b3c565b61138e565b61033d6103383660046138da565b6115f3565b6040519015158152602001610235565b61021e61035b366004613c1f565b611606565b61021e61036e3660046138da565b6117fe565b61037b6118f9565b6040516102359190613c6c565b610228610396366004613727565b611905565b6103ae6103a93660046138da565b611a67565b6040516102359190613d3c565b61021e6103c9366004613d4f565b611be8565b61021e6103dc366004613d89565b611da5565b6103e9612026565b6040516102359190613e0f565b61021e6104043660046138da565b6121fa565b61021e6104173660046138da565b61235d565b61021e61042a366004613e73565b612526565b61021e61043d3660046138f5565b612775565b6102ac612801565b61021e6104583660046138da565b61280c565b610465612850565b6040516102359190613edb565b610485610480366004613eee565b61285c565b604051610235929190613f10565b61033d6104a13660046138da565b612a55565b61021e6104b4366004613f34565b612a62565b61021e6104c7366004613d4f565b612bed565b61021e6104da366004613f8d565b612e39565b61033d6104ed366004613727565b613003565b336104fe600d82613010565b6105415760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b60405180910390fd5b8161054d600a82613035565b6105885760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b6000838152600c6020526040902054156105fb576000838152600c602052604090208054806105b9576105b9613ffd565b60008281526020812060036000199093019283020181815560018101805467ffffffffffffffff19169055906105f260028301826135d2565b50509055610588565b6000838152600c602052604081206106129161360c565b61061d600a8461304d565b506040805184815260006020820181905260808284018190528201526001606082015290516000805160206144c78339815191529181900360a00190a1505050565b606060008061066e600a613059565b905060005b818110156106af576000610688600a83613063565b6000818152600c60205260409020549091506106a49085614029565b935050600101610673565b506000826001600160401b038111156106ca576106ca613a87565b60405190808252806020026020018201604052801561071757816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816106e85790505b5090506000610726600a613059565b90506000805b828110156108bf576000610741600a83613063565b6000818152600c6020908152604080832080548251818502810185019093528083529495509293909291849084015b8282101561085457600084815260209081902060408051606081018252600386029092018054835260018101546001600160401b031693830193909352600283018054929392918401916107c39061403c565b80601f01602080910402602001604051908101604052809291908181526020018280546107ef9061403c565b801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b50505050508152505081526020019060010190610770565b50505050905060005b81518110156108b15781818151811061087857610878614070565b602002602001015187868061088c90614086565b97508151811061089e5761089e614070565b602090810291909101015260010161085d565b50505080600101905061072c565b509195945050505050565b6040805160a08101825260008082526020820181905291810182905260608082018390526080820152906108fe9083613035565b6109395760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b600082815260026020818152604092839020835160a0810185528154815260018201546001600160401b0380821683860152600160401b8204811683880152600160801b90910416606082015292810180548551818502810185019096528086529394919360808601938301828280156109dc57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109be575b5050505050815250509050919050565b6109f461306f565b6001600160a01b0316336001600160a01b031614610a27576040516365f4906560e01b8152336004820152602401610538565b610a308161309d565b50565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff16610a7d57604051630ef4733760e31b815260040160405180910390fd5b60005b81811015610abf57610ab7838383818110610a9d57610a9d614070565b9050602002016020810190610ab291906138da565b61316f565b600101610a80565b505050565b60606000610ad181613059565b6001600160401b03811115610ae857610ae8613a87565b604051908082528060200260200182016040528015610b11578160200160208202803683370190505b5090506000805b610b226000613059565b811015610bd7576000610b358183613063565b60008181526002602052604081209192505b6002820154811015610bc957876001600160a01b0316826002018281548110610b7257610b72614070565b6000918252602090912001546001600160a01b031603610bc157828686610b988161409f565b975063ffffffff1681518110610bb057610bb0614070565b602002602001018181525050610bc9565b600101610b47565b505050806001019050610b18565b5060008163ffffffff166001600160401b03811115610bf857610bf8613a87565b604051908082528060200260200182016040528015610c3157816020015b610c1e61362d565b815260200190600190039081610c165790505b50905060005b8263ffffffff16811015610d6b576040518060400160405280858381518110610c6257610c62614070565b6020026020010151815260200160006002016000878581518110610c8857610c88614070565b6020908102919091018101518252818101929092526040908101600020815160a0810183528154815260018201546001600160401b0380821683870152600160401b8204811683860152600160801b909104166060820152600282018054845181870281018701909552808552919492936080860193909290830182828015610d3a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d1c575b505050505081525050815250828281518110610d5857610d58614070565b6020908102919091010152600101610c37565b50949350505050565b6000610d806005613059565b905090565b60606000610d9281613059565b6001600160401b03811115610da957610da9613a87565b604051908082528060200260200182016040528015610de257816020015b610dcf61362d565b815260200190600190039081610dc75790505b50905060005b610df26000613059565b811015610ef0576000610e058183613063565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015610ebe57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ea0575b505050505081525050815250838381518110610edc57610edc614070565b602090810291909101015250600101610de8565b50919050565b6040805160a081018252600080825260208201819052918101829052606080820183905260808201819052909190610f2e8285613035565b610f695760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b600084815260026020818152604080842060048352818520546003845294829020825160a0810184528254815260018301546001600160401b0380821683880152600160401b8204811683870152600160801b9091041660608201529482018054845181870281018701909552808552929695919491938793608086019391929183018282801561102357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611005575b505050505081525050925080805461103a9061403c565b80601f01602080910402602001604051908101604052809291908181526020018280546110669061403c565b80156110b35780601f10611088576101008083540402835291602001916110b3565b820191906000526020600020905b81548152906001019060200180831161109657829003601f168201915b505050505090509250925092509193909250565b6001600160a01b0380831660009081526007602052604090206002015483911661112757604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b33611133600882613010565b61116d5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b03808516600090815260076020526040902060030154859133911681146111cb5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b038616600090815260076020526040902080546111f29060ff1687613234565b80548690829060ff1916600183600581111561121057611210613cb0565b021790555060028101546040516001600160a01b03909116907f20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0906112569089906140c2565b60405180910390a250505050505050565b61126f61362d565b6112796000613059565b82106112b65760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b60006112c28184613063565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b909104166060820152918101805486518186028101860190975280875296975093958387019592949193608086019392919083018282801561137b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161135d575b5050509190925250505090529392505050565b336000818152600760205260409020600201546001600160a01b03166113ea57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b6113f5600086613035565b1561143657604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526105389190600401613fea565b60005b84518110156114ba5761147285828151811061145757611457614070565b6020026020010151600060050161301090919063ffffffff16565b6114b257604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b600101611439565b506040805160a0810182528481526000602082018190529181018290526060810182905260808101869052906114f090876133c7565b5060008681526002602081815260409283902084518155818501516001820180549587015160608801516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026fffffffffffffffffffffffffffffffff1990991691909416179690961795909516179093556080840151805185949361158093908501920190613677565b505050600086815260036020526040902061159b8482614135565b5060008681526004602052604090819020859055517f55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb906115e39088908890889088906141ee565b60405180910390a1505050505050565b6000611600600883613010565b92915050565b33611612600882613010565b61164c5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b038084166000908152600760205260409020600201548491166116ac57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b038085166000908152600760205260409020600301548591339116811461170a5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b03861660009081526007602090815260409182902091516117349188910161422a565b604051602081830303815290604052805190602001208160010160405160200161175e9190614246565b60405160208183030381529060405280519060200120036117ae5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526105389190600401613fea565b600181016117bc8782614135565b5060028101546040516001600160a01b03909116907f4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac90611256908990613fea565b61180661306f565b6001600160a01b0316336001600160a01b031614611839576040516365f4906560e01b8152336004820152602401610538565b6001600160a01b03811661187c5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526105389190600401613fea565b611887600d826133d3565b6118c25760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b6040516001600160a01b038216907ff9889c857e5356066b564327caa757c325ecbc001b2b47d72edf8cf9aedb1be590600090a250565b6060610d8060006133e8565b606081611913600a82613035565b61194e5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b6000838152600c6020908152604080832080548251818502810185019093528083529193909284015b82821015611a5b57600084815260209081902060408051606081018252600386029092018054835260018101546001600160401b031693830193909352600283018054929392918401916119ca9061403c565b80601f01602080910402602001604051908101604052809291908181526020018280546119f69061403c565b8015611a435780601f10611a1857610100808354040283529160200191611a43565b820191906000526020600020905b815481529060010190602001808311611a2657829003601f168201915b50505050508152505081526020019060010190611977565b50505050915050919050565b611a926040805160808101909152806000815260606020820181905260006040830181905291015290565b611a9d600583613010565b611add57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b038216600090815260076020526040908190208151608081019092528054829060ff166005811115611b1857611b18613cb0565b6005811115611b2957611b29613cb0565b8152602001600182018054611b3d9061403c565b80601f0160208091040260200160405190810160405280929190818152602001828054611b699061403c565b8015611bb65780601f10611b8b57610100808354040283529160200191611bb6565b820191906000526020600020905b815481529060010190602001808311611b9957829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015292915050565b81611bf4600082613035565b611c2f5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b03808316600090815260076020526040902060020154839116611c8f57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b6000848152600260205260408120905b6002820154811015611d2857846001600160a01b0316826002018281548110611cca57611cca614070565b6000918252602090912001546001600160a01b031603611d2057604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526105389190600401613fea565b600101611c9f565b5060028101805460018082018355600092835260209283902090910180546001600160a01b0319166001600160a01b03881690811790915560408051898152938401919091528201527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f9060600160405180910390a15050505050565b33611db1600d82613010565b611deb5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6000829003611e295760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526105389190600401613fea565b611e34600a86613035565b611e4557611e43600a866133c7565b505b6000858152600c6020526040812054905b81811015611f2c576000878152600c6020526040902080546001600160401b038816919083908110611e8a57611e8a614070565b60009182526020909120600160039092020101546001600160401b031603611f24576000878152600c6020526040902080548691869184908110611ed057611ed0614070565b90600052602060002090600302016002019182611eee9291906142bc565b506000805160206144c7833981519152878787876000604051611f15959493929190614375565b60405180910390a1505061201f565b600101611e56565b506000600c0160008781526020019081526020016000206040518060600160405280888152602001876001600160401b0316815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050835460018082018655948252602091829020845160039092020190815590830151938101805467ffffffffffffffff19166001600160401b03909516949094179093555060408101519091906002820190611ff69082614135565b5050506000805160206144c78339815191528686868660006040516115e3959493929190614375565b5050505050565b606060006120346005613059565b6001600160401b0381111561204b5761204b613a87565b6040519080825280602002602001820160405280156120a757816020015b6120946040805160808101909152806000815260606020820181905260006040830181905291015290565b8152602001906001900390816120695790505b50905060005b6120b76005613059565b811015610ef057600760006120cd600584613063565b6001600160a01b03168152602081019190915260409081016000208151608081019092528054829060ff16600581111561210957612109613cb0565b600581111561211a5761211a613cb0565b815260200160018201805461212e9061403c565b80601f016020809104026020016040519081016040528092919081815260200182805461215a9061403c565b80156121a75780601f1061217c576101008083540402835291602001916121a7565b820191906000526020600020905b81548152906001019060200180831161218a57829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015282518390839081106121e7576121e7614070565b60209081029190910101526001016120ad565b61220261306f565b6001600160a01b0316336001600160a01b031614612235576040516365f4906560e01b8152336004820152602401610538565b612240600882613010565b61228457604080518082018252601281527113d41154905513d497d393d517d193d5539160721b6020820152905162461bcd60e51b81526105389190600401613fea565b60005b6122916005613059565b811015612319576001600160a01b038216600760006122b1600585613063565b6001600160a01b039081168252602082019290925260400160002060030154160361231157604080518082018252600d81526c4f55545f4f465f424f554e445360981b6020820152905162461bcd60e51b81526105389190600401613fea565b600101612287565b506123256008826133d3565b506040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b6001600160a01b03808216600090815260076020526040902060030154829133911681146123bb5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b038381166000908152600760205260409020600201541661241957604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b60056001600160a01b03841660009081526007602052604090205460ff16600581111561244857612448613cb0565b146124915760408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b81526105389190600401613fea565b61249c6005846133d3565b506001600160a01b0383166000908152600760205260408120805460ff19168155906124cb60018301826135d2565b506002810180546001600160a01b03199081169091556003909101805490911690556040516001600160a01b038416907fcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b90600090a2505050565b33612532600d82613010565b61256c5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6000805b6000858152600c60205260409020548110156126ed576000858152600c6020526040902080546001600160401b0386169190839081106125b2576125b2614070565b60009182526020909120600160039092020101546001600160401b0316036126e5576000858152600c6020526040902080546125f0906001906143c5565b8154811061260057612600614070565b90600052602060002090600302016000600c016000878152602001908152602001600020828154811061263557612635614070565b600091825260209091208254600390920201908155600180830154908201805467ffffffffffffffff19166001600160401b03909216919091179055600280820190612683908401826143d8565b5050506000858152600c602052604090208054806126a3576126a3613ffd565b60008281526020812060036000199093019283020181815560018101805467ffffffffffffffff19169055906126dc60028301826135d2565b50509055600191505b600101612570565b508061272a5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b604080518581526001600160401b038516602082015260808183018190526000908201526001606082015290516000805160206144c78339815191529181900360a00190a150505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166127bf57604051630ef4733760e31b815260040160405180910390fd5b60005b81811015610abf576127f98383838181106127df576127df614070565b90506020020160208101906127f491906138da565b61309d565b6001016127c2565b6000610d8081613059565b61281461306f565b6001600160a01b0316336001600160a01b031614612847576040516365f4906560e01b8152336004820152602401610538565b610a308161316f565b6060610d8060056133e8565b60606000828410604051806040016040528060078152602001664241445f41524760c81b815250906128a15760405162461bcd60e51b81526004016105389190613fea565b5060006128ae85856143c5565b6001600160401b038111156128c5576128c5613a87565b6040519080825280602002602001820160405280156128fe57816020015b6128eb61362d565b8152602001906001900390816128e35790505b50905060005b61290e6000613059565b6129188288614029565b10801561292d57508461292b8288614029565b105b15612a3d5760006129496129418389614029565b600090613063565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015612a0257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116129e4575b505050505081525050815250838381518110612a2057612a20614070565b60200260200101819052505080612a3690614086565b9050612904565b5080612a496000613059565b90969410159450505050565b6000611600600d83613010565b336000818152600760205260409020600201546001600160a01b0316612abe57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b612ac9600087613035565b612b045760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b600086815260026020526040902084815560018101805467ffffffffffffffff19166001600160401b0386161790558215612b6c576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b836001600160401b0316600103612b94576000878152600360205260408120612b94916135d2565b60408051888152602081018790526001600160401b03861681830152841515606082015290517fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b9181900360800190a150505050505050565b81612bf9600082613035565b612c345760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b03808316600090815260076020526040902060020154839116612c9457604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b600084815260026020526040812090805b6002830154811015612dae57856001600160a01b0316836002018281548110612cd057612cd0614070565b6000918252602090912001546001600160a01b031603612da657600283018054612cfc906001906143c5565b81548110612d0c57612d0c614070565b6000918252602090912001546002840180546001600160a01b039092169183908110612d3a57612d3a614070565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082600201805480612d7b57612d7b613ffd565b600082815260209020810160001990810180546001600160a01b031916905501905560019150612dae565b600101612ca5565b5080612df057604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b604080518781526001600160a01b03871660208201526000918101919091527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f906060016115e3565b33612e45600882613010565b612e7f5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b038481166000908152600760205260409020600201541615612ede57604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526105389190600401613fea565b60006040518060800160405280846005811115612efd57612efd613cb0565b8152602081018690526001600160a01b0387166040820152336060909101529050612f296005866133f5565b506001600160a01b03851660009081526007602052604090208151815483929190829060ff19166001836005811115612f6457612f64613cb0565b021790555060208201516001820190612f7d9082614135565b506040828101516002830180546001600160a01b03199081166001600160a01b039384161790915560609094015160039093018054909416928116929092179092559051908616907fd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e56190612ff490879087906144a4565b60405180910390a25050505050565b6000611600600a83613035565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b6000818152600183016020526040812054151561302e565b600061302e838361340a565b6000611600825490565b600061302e83836134fd565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b6001600160a01b0381166130e05760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526105389190600401613fea565b6130eb600882613010565b1561312c57604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526105389190600401613fea565b6131376008826133f5565b506040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b6001600160a01b0381166131b25760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526105389190600401613fea565b6131bd600d826133f5565b6131fd57604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526105389190600401613fea565b6040516001600160a01b038216907f7afd798379ae2d2e5035438544cea2b60eb1dde6a8128e6d447fd2a25f8825a290600090a250565b600082600581111561324857613248613cb0565b148061329c5750600182600581111561326357613263613cb0565b14801561329c5750600381600581111561327f5761327f613cb0565b148061329c5750600481600581111561329a5761329a613cb0565b145b806132ef575060028260058111156132b6576132b6613cb0565b1480156132ef575060038160058111156132d2576132d2613cb0565b14806132ef575060048160058111156132ed576132ed613cb0565b145b806133425750600482600581111561330957613309613cb0565b1480156133425750600381600581111561332557613325613cb0565b14806133425750600581600581111561334057613340613cb0565b145b8061337a5750600382600581111561335c5761335c613cb0565b14801561337a5750600581600581111561337857613378613cb0565b145b15613383575050565b60408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b81526105389190600401613fea565b600061302e8383613527565b600061302e836001600160a01b03841661340a565b6060600061302e83613576565b600061302e836001600160a01b038416613527565b600081815260018301602052604081205480156134f357600061342e6001836143c5565b8554909150600090613442906001906143c5565b90508082146134a757600086600001828154811061346257613462614070565b906000526020600020015490508087600001848154811061348557613485614070565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806134b8576134b8613ffd565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611600565b6000915050611600565b600082600001828154811061351457613514614070565b9060005260206000200154905092915050565b600081815260018301602052604081205461356e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611600565b506000611600565b6060816000018054806020026020016040519081016040528092919081815260200182805480156135c657602002820191906000526020600020905b8154815260200190600101908083116135b2575b50505050509050919050565b5080546135de9061403c565b6000825580601f106135ee575050565b601f016020900490600052602060002090810190610a3091906136dc565b5080546000825560030290600052602060002090810190610a3091906136f1565b6040805180820190915260008152602081016136726040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b905290565b8280548282559060005260206000209081019282156136cc579160200282015b828111156136cc57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613697565b506136d89291506136dc565b5090565b5b808211156136d857600081556001016136dd565b808211156136d857600080825560018201805467ffffffffffffffff1916905561371e60028301826135d2565b506003016136f1565b60006020828403121561373957600080fd5b5035919050565b60005b8381101561375b578181015183820152602001613743565b50506000910152565b6000815180845261377c816020860160208601613740565b601f01601f19169290920160200192915050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b8381101561380c57888303603f19018552815180518452878101516001600160401b03168885015286015160608785018190526137f881860183613764565b9689019694505050908601906001016137b9565b509098975050505050505050565b600060a08301825184526020808401516001600160401b0380821660208801528060408701511660408801528060608701511660608801525050608084015160a0608087015282815180855260c088019150602083019450600092505b808310156138a05784516001600160a01b03168252938301936001929092019190830190613877565b509695505050505050565b60208152600061302e602083018461381a565b80356001600160a01b03811681146138d557600080fd5b919050565b6000602082840312156138ec57600080fd5b61302e826138be565b6000806020838503121561390857600080fd5b82356001600160401b038082111561391f57600080fd5b818501915085601f83011261393357600080fd5b81358181111561394257600080fd5b8660208260051b850101111561395757600080fd5b60209290920196919550909350505050565b805182526000602082015160406020850152613988604085018261381a565b949350505050565b60008282518085526020808601955060208260051b8401016020860160005b848110156139dd57601f198684030189526139cb838351613969565b988401989250908301906001016139af565b5090979650505050505050565b60208152600061302e6020830184613990565b606081526000613a10606083018661381a565b8460208401528281036040840152613a288185613764565b9695505050505050565b8035600681106138d557600080fd5b60008060408385031215613a5457600080fd5b613a5d836138be565b9150613a6b60208401613a32565b90509250929050565b60208152600061302e6020830184613969565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613ac557613ac5613a87565b604052919050565b600082601f830112613ade57600080fd5b81356001600160401b03811115613af757613af7613a87565b613b0a601f8201601f1916602001613a9d565b818152846020838601011115613b1f57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215613b5257600080fd5b843593506020808601356001600160401b0380821115613b7157600080fd5b818801915088601f830112613b8557600080fd5b813581811115613b9757613b97613a87565b8060051b613ba6858201613a9d565b918252838101850191858101908c841115613bc057600080fd5b948601945b83861015613be557613bd6866138be565b82529486019490860190613bc5565b9850505050604088013594506060880135925080831115613c0557600080fd5b5050613c1387828801613acd565b91505092959194509250565b60008060408385031215613c3257600080fd5b613c3b836138be565b915060208301356001600160401b03811115613c5657600080fd5b613c6285828601613acd565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015613ca457835183529284019291840191600101613c88565b50909695505050505050565b634e487b7160e01b600052602160045260246000fd5b60068110613ce457634e487b7160e01b600052602160045260246000fd5b9052565b613cf3828251613cc6565b6000602082015160806020850152613d0e6080850182613764565b6040848101516001600160a01b03908116918701919091526060948501511693909401929092525090919050565b60208152600061302e6020830184613ce8565b60008060408385031215613d6257600080fd5b82359150613a6b602084016138be565b80356001600160401b03811681146138d557600080fd5b60008060008060608587031215613d9f57600080fd5b84359350613daf60208601613d72565b925060408501356001600160401b0380821115613dcb57600080fd5b818701915087601f830112613ddf57600080fd5b813581811115613dee57600080fd5b886020828501011115613e0057600080fd5b95989497505060200194505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015613e6657603f19888603018452613e54858351613ce8565b94509285019290850190600101613e38565b5092979650505050505050565b60008060408385031215613e8657600080fd5b82359150613a6b60208401613d72565b60008151808452602080850194506020840160005b83811015613ed05781516001600160a01b031687529582019590820190600101613eab565b509495945050505050565b60208152600061302e6020830184613e96565b60008060408385031215613f0157600080fd5b50508035926020909101359150565b604081526000613f236040830185613990565b905082151560208301529392505050565b600080600080600060a08688031215613f4c57600080fd5b853594506020860135935060408601359250613f6a60608701613d72565b915060808601358015158114613f7f57600080fd5b809150509295509295909350565b600080600060608486031215613fa257600080fd5b613fab846138be565b925060208401356001600160401b03811115613fc657600080fd5b613fd286828701613acd565b925050613fe160408501613a32565b90509250925092565b60208152600061302e6020830184613764565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561160057611600614013565b600181811c9082168061405057607f821691505b602082108103610ef057634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60006001820161409857614098614013565b5060010190565b600063ffffffff8083168181036140b8576140b8614013565b6001019392505050565b602081016116008284613cc6565b601f821115610abf576000816000526020600020601f850160051c810160208610156140f95750805b601f850160051c820191505b8181101561411857828155600101614105565b505050505050565b600019600383901b1c191660019190911b1790565b81516001600160401b0381111561414e5761414e613a87565b6141628161415c845461403c565b846140d0565b602080601f831160018114614191576000841561417f5750858301515b6141898582614120565b865550614118565b600085815260208120601f198616915b828110156141c0578886015182559484019460019091019084016141a1565b50858210156141de5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8481526080602082015260006142076080830186613e96565b846040840152828103606084015261421f8185613764565b979650505050505050565b6000825161423c818460208701613740565b9190910192915050565b60008083546142548161403c565b6001828116801561426c5760018114614281576142b0565b60ff19841687528215158302870194506142b0565b8760005260208060002060005b858110156142a75781548a82015290840190820161428e565b50505082870194505b50929695505050505050565b6001600160401b038311156142d3576142d3613a87565b6142e7836142e1835461403c565b836140d0565b6000601f84116001811461431557600085156143035750838201355b61430d8682614120565b84555061201f565b600083815260209020601f19861690835b828110156143465786850135825560209485019460019092019101614326565b50868210156143635760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8581526001600160401b038516602082015260806040820152826080820152828460a0830137600081840160a0908101919091529115156060820152601f909201601f1916909101019392505050565b8181038181111561160057611600614013565b8181036143e3575050565b6143ed825461403c565b6001600160401b0381111561440457614404613a87565b6144128161415c845461403c565b6000601f821160018114614440576000831561442e5750848201545b6144388482614120565b85555061201f565b600085815260209020601f19841690600086815260209020845b8381101561447a578286015482556001958601959091019060200161445a565b50858310156141de5793015460001960f8600387901b161c19169092555050600190811b01905550565b6040815260006144b76040830185613764565b905061302e6020830184613cc656fec01483261a841a868b99cb8802faed4ea44a1a816651c4f7ee061a96a205fe98 \ No newline at end of file diff --git a/packages/generated/v3/abis/MockRiverRegistry.json b/packages/generated/v3/abis/MockRiverRegistry.json new file mode 100644 index 000000000..c86d70825 --- /dev/null +++ b/packages/generated/v3/abis/MockRiverRegistry.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"approvedOperators","type":"address[]","internalType":"address[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"__OperatorRegistry_init","inputs":[{"name":"initialOperators","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"__RiverConfig_init","inputs":[{"name":"configManagers","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"allocateStream","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"},{"name":"nodes","type":"address[]","internalType":"address[]"},{"name":"genesisMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"genesisMiniblock","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"approveConfigurationManager","inputs":[{"name":"manager","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"approveOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"configurationExists","inputs":[{"name":"key","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"deleteConfiguration","inputs":[{"name":"key","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"deleteConfigurationOnBlock","inputs":[{"name":"key","type":"bytes32","internalType":"bytes32"},{"name":"blockNumber","type":"uint64","internalType":"uint64"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getAllConfiguration","inputs":[],"outputs":[{"name":"","type":"tuple[]","internalType":"struct Setting[]","components":[{"name":"key","type":"bytes32","internalType":"bytes32"},{"name":"blockNumber","type":"uint64","internalType":"uint64"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"stateMutability":"view"},{"type":"function","name":"getAllNodeAddresses","inputs":[],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"getAllNodes","inputs":[],"outputs":[{"name":"","type":"tuple[]","internalType":"struct Node[]","components":[{"name":"status","type":"uint8","internalType":"enum NodeStatus"},{"name":"url","type":"string","internalType":"string"},{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}]}],"stateMutability":"view"},{"type":"function","name":"getAllStreamIds","inputs":[],"outputs":[{"name":"","type":"bytes32[]","internalType":"bytes32[]"}],"stateMutability":"view"},{"type":"function","name":"getAllStreams","inputs":[],"outputs":[{"name":"","type":"tuple[]","internalType":"struct StreamWithId[]","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"stream","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}]}],"stateMutability":"view"},{"type":"function","name":"getConfiguration","inputs":[{"name":"key","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct Setting[]","components":[{"name":"key","type":"bytes32","internalType":"bytes32"},{"name":"blockNumber","type":"uint64","internalType":"uint64"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"stateMutability":"view"},{"type":"function","name":"getNode","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","internalType":"struct Node","components":[{"name":"status","type":"uint8","internalType":"enum NodeStatus"},{"name":"url","type":"string","internalType":"string"},{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}]}],"stateMutability":"view"},{"type":"function","name":"getNodeCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getPaginatedStreams","inputs":[{"name":"start","type":"uint256","internalType":"uint256"},{"name":"stop","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct StreamWithId[]","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"stream","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}]},{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getStream","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}],"stateMutability":"view"},{"type":"function","name":"getStreamByIndex","inputs":[{"name":"i","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct StreamWithId","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"stream","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}]}],"stateMutability":"view"},{"type":"function","name":"getStreamCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getStreamWithGenesis","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]},{"name":"","type":"bytes32","internalType":"bytes32"},{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getStreamsOnNode","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct StreamWithId[]","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"stream","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}]}],"stateMutability":"view"},{"type":"function","name":"isConfigurationManager","inputs":[{"name":"manager","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"placeStreamOnNode","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"},{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"registerNode","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"url","type":"string","internalType":"string"},{"name":"status","type":"uint8","internalType":"enum NodeStatus"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeConfigurationManager","inputs":[{"name":"manager","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeNode","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeStreamFromNode","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"},{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setConfiguration","inputs":[{"name":"key","type":"bytes32","internalType":"bytes32"},{"name":"blockNumber","type":"uint64","internalType":"uint64"},{"name":"value","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setStreamLastMiniblock","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"},{"name":"","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"isSealed","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateNodeStatus","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"status","type":"uint8","internalType":"enum NodeStatus"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateNodeUrl","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"url","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"ConfigurationChanged","inputs":[{"name":"key","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"block","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"value","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"deleted","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"ConfigurationManagerAdded","inputs":[{"name":"manager","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ConfigurationManagerRemoved","inputs":[{"name":"manager","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"NodeAdded","inputs":[{"name":"nodeAddress","type":"address","indexed":true,"internalType":"address"},{"name":"url","type":"string","indexed":false,"internalType":"string"},{"name":"status","type":"uint8","indexed":false,"internalType":"enum NodeStatus"}],"anonymous":false},{"type":"event","name":"NodeRemoved","inputs":[{"name":"nodeAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"NodeStatusUpdated","inputs":[{"name":"nodeAddress","type":"address","indexed":true,"internalType":"address"},{"name":"status","type":"uint8","indexed":false,"internalType":"enum NodeStatus"}],"anonymous":false},{"type":"event","name":"NodeUrlUpdated","inputs":[{"name":"nodeAddress","type":"address","indexed":true,"internalType":"address"},{"name":"url","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"OperatorAdded","inputs":[{"name":"operatorAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OperatorRemoved","inputs":[{"name":"operatorAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"StreamAllocated","inputs":[{"name":"streamId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"nodes","type":"address[]","indexed":false,"internalType":"address[]"},{"name":"genesisMiniblockHash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"genesisMiniblock","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"StreamLastMiniblockUpdated","inputs":[{"name":"streamId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"lastMiniblockHash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"isSealed","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"StreamPlacementUpdated","inputs":[{"name":"streamId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"nodeAddress","type":"address","indexed":false,"internalType":"address"},{"name":"isAdded","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b5060405162004ad638038062004ad68339810160408190526200003491620004a6565b6200003e620000c1565b620000493362000169565b60005b8151811015620000b957620000838282815181106200006f576200006f62000578565b60200260200101516200023760201b60201c565b620000b08282815181106200009c576200009c62000578565b60200260200101516200031c60201b60201c565b6001016200004c565b5050620005df565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16156200010e576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156200016657805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b60006200019d7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b90506001600160a01b038216620001c757604051634e3ef82560e01b815260040160405180910390fd5b817f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae30080546001600160a01b0319166001600160a01b03928316179055604051838216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038116620002865760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526200027d91906004016200058e565b60405180910390fd5b62000293600882620003e9565b15620002d757604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526200027d91906004016200058e565b620002e460088262000410565b506040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b6001600160a01b038116620003625760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526200027d91906004016200058e565b6200036f600d8262000410565b620003b257604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526200027d91906004016200058e565b6040516001600160a01b038216907f7afd798379ae2d2e5035438544cea2b60eb1dde6a8128e6d447fd2a25f8825a290600090a250565b6001600160a01b038116600090815260018301602052604081205415155b90505b92915050565b600062000407836001600160a01b03841660008181526001830160205260408120546200046a575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200040a565b5060006200040a565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b0381168114620004a157600080fd5b919050565b60006020808385031215620004ba57600080fd5b82516001600160401b0380821115620004d257600080fd5b818501915085601f830112620004e757600080fd5b815181811115620004fc57620004fc62000473565b8060051b604051601f19603f8301168101818110858211171562000524576200052462000473565b6040529182528482019250838101850191888311156200054357600080fd5b938501935b828510156200056c576200055c8562000489565b8452938501939285019262000548565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020808352835180602085015260005b81811015620005be57858101830151858201604001528201620005a0565b506000604082860101526040601f19601f8301168501019250505092915050565b6144e780620005ef6000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80639d2090481161011a578063c0f22084116100ad578063d4bd44a01161007c578063d4bd44a014610493578063d7a3158a146104a6578063ee885b12146104b9578063eecc66f4146104cc578063fc207c01146104df57600080fd5b8063c0f2208414610442578063c179b85f1461044a578063c8fe3a011461045d578063ca78c41a1461047257600080fd5b8063ac8a584a116100e9578063ac8a584a146103f6578063b2b99ec914610409578063b7f227ee1461041c578063ba428b1a1461042f57600080fd5b80639d2090481461039b5780639ee86d38146103bb578063a09449a6146103ce578063a1174e7d146103e157600080fd5b80633c2544d11161019d5780636d70f7ae1161016c5780636d70f7ae1461032a5780637e4465e71461034d578063813049ec1461036057806386789fc6146103735780639283ae3a1461038857600080fd5b80633c2544d1146102c2578063581f8b9b146102e457806368b454df146102f75780636b883c391461031757600080fd5b806331374511116101d9578063313745111461027157806332705ac41461028457806339bf397e146102a45780633bd84c0c146102ba57600080fd5b8063035759e11461020b578063081814db146102205780631290abe81461023e578063242cae9f1461025e575b600080fd5b61021e610219366004613727565b6104f2565b005b61022861065f565b6040516102359190613790565b60405180910390f35b61025161024c366004613727565b6108ca565b60405161023591906138ab565b61021e61026c3660046138da565b6109ec565b61021e61027f3660046138f5565b610a33565b6102976102923660046138da565b610ac4565b60405161023591906139ea565b6102ac610d74565b604051908152602001610235565b610297610d85565b6102d56102d0366004613727565b610ef6565b604051610235939291906139fd565b61021e6102f2366004613a41565b6110c7565b61030a610305366004613727565b611267565b6040516102359190613a74565b61021e610325366004613b3c565b61138e565b61033d6103383660046138da565b6115f3565b6040519015158152602001610235565b61021e61035b366004613c1f565b611606565b61021e61036e3660046138da565b6117fe565b61037b6118f9565b6040516102359190613c6c565b610228610396366004613727565b611905565b6103ae6103a93660046138da565b611a67565b6040516102359190613d3c565b61021e6103c9366004613d4f565b611be8565b61021e6103dc366004613d89565b611da5565b6103e9612026565b6040516102359190613e0f565b61021e6104043660046138da565b6121fa565b61021e6104173660046138da565b61235d565b61021e61042a366004613e73565b612526565b61021e61043d3660046138f5565b612775565b6102ac612801565b61021e6104583660046138da565b61280c565b610465612850565b6040516102359190613edb565b610485610480366004613eee565b61285c565b604051610235929190613f10565b61033d6104a13660046138da565b612a55565b61021e6104b4366004613f34565b612a62565b61021e6104c7366004613d4f565b612bed565b61021e6104da366004613f8d565b612e39565b61033d6104ed366004613727565b613003565b336104fe600d82613010565b6105415760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b60405180910390fd5b8161054d600a82613035565b6105885760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b6000838152600c6020526040902054156105fb576000838152600c602052604090208054806105b9576105b9613ffd565b60008281526020812060036000199093019283020181815560018101805467ffffffffffffffff19169055906105f260028301826135d2565b50509055610588565b6000838152600c602052604081206106129161360c565b61061d600a8461304d565b506040805184815260006020820181905260808284018190528201526001606082015290516000805160206144c78339815191529181900360a00190a1505050565b606060008061066e600a613059565b905060005b818110156106af576000610688600a83613063565b6000818152600c60205260409020549091506106a49085614029565b935050600101610673565b506000826001600160401b038111156106ca576106ca613a87565b60405190808252806020026020018201604052801561071757816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816106e85790505b5090506000610726600a613059565b90506000805b828110156108bf576000610741600a83613063565b6000818152600c6020908152604080832080548251818502810185019093528083529495509293909291849084015b8282101561085457600084815260209081902060408051606081018252600386029092018054835260018101546001600160401b031693830193909352600283018054929392918401916107c39061403c565b80601f01602080910402602001604051908101604052809291908181526020018280546107ef9061403c565b801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b50505050508152505081526020019060010190610770565b50505050905060005b81518110156108b15781818151811061087857610878614070565b602002602001015187868061088c90614086565b97508151811061089e5761089e614070565b602090810291909101015260010161085d565b50505080600101905061072c565b509195945050505050565b6040805160a08101825260008082526020820181905291810182905260608082018390526080820152906108fe9083613035565b6109395760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b600082815260026020818152604092839020835160a0810185528154815260018201546001600160401b0380821683860152600160401b8204811683880152600160801b90910416606082015292810180548551818502810185019096528086529394919360808601938301828280156109dc57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109be575b5050505050815250509050919050565b6109f461306f565b6001600160a01b0316336001600160a01b031614610a27576040516365f4906560e01b8152336004820152602401610538565b610a308161309d565b50565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff16610a7d57604051630ef4733760e31b815260040160405180910390fd5b60005b81811015610abf57610ab7838383818110610a9d57610a9d614070565b9050602002016020810190610ab291906138da565b61316f565b600101610a80565b505050565b60606000610ad181613059565b6001600160401b03811115610ae857610ae8613a87565b604051908082528060200260200182016040528015610b11578160200160208202803683370190505b5090506000805b610b226000613059565b811015610bd7576000610b358183613063565b60008181526002602052604081209192505b6002820154811015610bc957876001600160a01b0316826002018281548110610b7257610b72614070565b6000918252602090912001546001600160a01b031603610bc157828686610b988161409f565b975063ffffffff1681518110610bb057610bb0614070565b602002602001018181525050610bc9565b600101610b47565b505050806001019050610b18565b5060008163ffffffff166001600160401b03811115610bf857610bf8613a87565b604051908082528060200260200182016040528015610c3157816020015b610c1e61362d565b815260200190600190039081610c165790505b50905060005b8263ffffffff16811015610d6b576040518060400160405280858381518110610c6257610c62614070565b6020026020010151815260200160006002016000878581518110610c8857610c88614070565b6020908102919091018101518252818101929092526040908101600020815160a0810183528154815260018201546001600160401b0380821683870152600160401b8204811683860152600160801b909104166060820152600282018054845181870281018701909552808552919492936080860193909290830182828015610d3a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d1c575b505050505081525050815250828281518110610d5857610d58614070565b6020908102919091010152600101610c37565b50949350505050565b6000610d806005613059565b905090565b60606000610d9281613059565b6001600160401b03811115610da957610da9613a87565b604051908082528060200260200182016040528015610de257816020015b610dcf61362d565b815260200190600190039081610dc75790505b50905060005b610df26000613059565b811015610ef0576000610e058183613063565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015610ebe57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ea0575b505050505081525050815250838381518110610edc57610edc614070565b602090810291909101015250600101610de8565b50919050565b6040805160a081018252600080825260208201819052918101829052606080820183905260808201819052909190610f2e8285613035565b610f695760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b600084815260026020818152604080842060048352818520546003845294829020825160a0810184528254815260018301546001600160401b0380821683880152600160401b8204811683870152600160801b9091041660608201529482018054845181870281018701909552808552929695919491938793608086019391929183018282801561102357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611005575b505050505081525050925080805461103a9061403c565b80601f01602080910402602001604051908101604052809291908181526020018280546110669061403c565b80156110b35780601f10611088576101008083540402835291602001916110b3565b820191906000526020600020905b81548152906001019060200180831161109657829003601f168201915b505050505090509250925092509193909250565b6001600160a01b0380831660009081526007602052604090206002015483911661112757604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b33611133600882613010565b61116d5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b03808516600090815260076020526040902060030154859133911681146111cb5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b038616600090815260076020526040902080546111f29060ff1687613234565b80548690829060ff1916600183600581111561121057611210613cb0565b021790555060028101546040516001600160a01b03909116907f20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0906112569089906140c2565b60405180910390a250505050505050565b61126f61362d565b6112796000613059565b82106112b65760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b60006112c28184613063565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b909104166060820152918101805486518186028101860190975280875296975093958387019592949193608086019392919083018282801561137b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161135d575b5050509190925250505090529392505050565b336000818152600760205260409020600201546001600160a01b03166113ea57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b6113f5600086613035565b1561143657604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526105389190600401613fea565b60005b84518110156114ba5761147285828151811061145757611457614070565b6020026020010151600060050161301090919063ffffffff16565b6114b257604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b600101611439565b506040805160a0810182528481526000602082018190529181018290526060810182905260808101869052906114f090876133c7565b5060008681526002602081815260409283902084518155818501516001820180549587015160608801516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026fffffffffffffffffffffffffffffffff1990991691909416179690961795909516179093556080840151805185949361158093908501920190613677565b505050600086815260036020526040902061159b8482614135565b5060008681526004602052604090819020859055517f55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb906115e39088908890889088906141ee565b60405180910390a1505050505050565b6000611600600883613010565b92915050565b33611612600882613010565b61164c5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b038084166000908152600760205260409020600201548491166116ac57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b038085166000908152600760205260409020600301548591339116811461170a5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b03861660009081526007602090815260409182902091516117349188910161422a565b604051602081830303815290604052805190602001208160010160405160200161175e9190614246565b60405160208183030381529060405280519060200120036117ae5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526105389190600401613fea565b600181016117bc8782614135565b5060028101546040516001600160a01b03909116907f4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac90611256908990613fea565b61180661306f565b6001600160a01b0316336001600160a01b031614611839576040516365f4906560e01b8152336004820152602401610538565b6001600160a01b03811661187c5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526105389190600401613fea565b611887600d826133d3565b6118c25760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b6040516001600160a01b038216907ff9889c857e5356066b564327caa757c325ecbc001b2b47d72edf8cf9aedb1be590600090a250565b6060610d8060006133e8565b606081611913600a82613035565b61194e5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b6000838152600c6020908152604080832080548251818502810185019093528083529193909284015b82821015611a5b57600084815260209081902060408051606081018252600386029092018054835260018101546001600160401b031693830193909352600283018054929392918401916119ca9061403c565b80601f01602080910402602001604051908101604052809291908181526020018280546119f69061403c565b8015611a435780601f10611a1857610100808354040283529160200191611a43565b820191906000526020600020905b815481529060010190602001808311611a2657829003601f168201915b50505050508152505081526020019060010190611977565b50505050915050919050565b611a926040805160808101909152806000815260606020820181905260006040830181905291015290565b611a9d600583613010565b611add57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b038216600090815260076020526040908190208151608081019092528054829060ff166005811115611b1857611b18613cb0565b6005811115611b2957611b29613cb0565b8152602001600182018054611b3d9061403c565b80601f0160208091040260200160405190810160405280929190818152602001828054611b699061403c565b8015611bb65780601f10611b8b57610100808354040283529160200191611bb6565b820191906000526020600020905b815481529060010190602001808311611b9957829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015292915050565b81611bf4600082613035565b611c2f5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b03808316600090815260076020526040902060020154839116611c8f57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b6000848152600260205260408120905b6002820154811015611d2857846001600160a01b0316826002018281548110611cca57611cca614070565b6000918252602090912001546001600160a01b031603611d2057604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526105389190600401613fea565b600101611c9f565b5060028101805460018082018355600092835260209283902090910180546001600160a01b0319166001600160a01b03881690811790915560408051898152938401919091528201527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f9060600160405180910390a15050505050565b33611db1600d82613010565b611deb5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6000829003611e295760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526105389190600401613fea565b611e34600a86613035565b611e4557611e43600a866133c7565b505b6000858152600c6020526040812054905b81811015611f2c576000878152600c6020526040902080546001600160401b038816919083908110611e8a57611e8a614070565b60009182526020909120600160039092020101546001600160401b031603611f24576000878152600c6020526040902080548691869184908110611ed057611ed0614070565b90600052602060002090600302016002019182611eee9291906142bc565b506000805160206144c7833981519152878787876000604051611f15959493929190614375565b60405180910390a1505061201f565b600101611e56565b506000600c0160008781526020019081526020016000206040518060600160405280888152602001876001600160401b0316815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050835460018082018655948252602091829020845160039092020190815590830151938101805467ffffffffffffffff19166001600160401b03909516949094179093555060408101519091906002820190611ff69082614135565b5050506000805160206144c78339815191528686868660006040516115e3959493929190614375565b5050505050565b606060006120346005613059565b6001600160401b0381111561204b5761204b613a87565b6040519080825280602002602001820160405280156120a757816020015b6120946040805160808101909152806000815260606020820181905260006040830181905291015290565b8152602001906001900390816120695790505b50905060005b6120b76005613059565b811015610ef057600760006120cd600584613063565b6001600160a01b03168152602081019190915260409081016000208151608081019092528054829060ff16600581111561210957612109613cb0565b600581111561211a5761211a613cb0565b815260200160018201805461212e9061403c565b80601f016020809104026020016040519081016040528092919081815260200182805461215a9061403c565b80156121a75780601f1061217c576101008083540402835291602001916121a7565b820191906000526020600020905b81548152906001019060200180831161218a57829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015282518390839081106121e7576121e7614070565b60209081029190910101526001016120ad565b61220261306f565b6001600160a01b0316336001600160a01b031614612235576040516365f4906560e01b8152336004820152602401610538565b612240600882613010565b61228457604080518082018252601281527113d41154905513d497d393d517d193d5539160721b6020820152905162461bcd60e51b81526105389190600401613fea565b60005b6122916005613059565b811015612319576001600160a01b038216600760006122b1600585613063565b6001600160a01b039081168252602082019290925260400160002060030154160361231157604080518082018252600d81526c4f55545f4f465f424f554e445360981b6020820152905162461bcd60e51b81526105389190600401613fea565b600101612287565b506123256008826133d3565b506040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b6001600160a01b03808216600090815260076020526040902060030154829133911681146123bb5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b038381166000908152600760205260409020600201541661241957604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b60056001600160a01b03841660009081526007602052604090205460ff16600581111561244857612448613cb0565b146124915760408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b81526105389190600401613fea565b61249c6005846133d3565b506001600160a01b0383166000908152600760205260408120805460ff19168155906124cb60018301826135d2565b506002810180546001600160a01b03199081169091556003909101805490911690556040516001600160a01b038416907fcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b90600090a2505050565b33612532600d82613010565b61256c5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6000805b6000858152600c60205260409020548110156126ed576000858152600c6020526040902080546001600160401b0386169190839081106125b2576125b2614070565b60009182526020909120600160039092020101546001600160401b0316036126e5576000858152600c6020526040902080546125f0906001906143c5565b8154811061260057612600614070565b90600052602060002090600302016000600c016000878152602001908152602001600020828154811061263557612635614070565b600091825260209091208254600390920201908155600180830154908201805467ffffffffffffffff19166001600160401b03909216919091179055600280820190612683908401826143d8565b5050506000858152600c602052604090208054806126a3576126a3613ffd565b60008281526020812060036000199093019283020181815560018101805467ffffffffffffffff19169055906126dc60028301826135d2565b50509055600191505b600101612570565b508061272a5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b604080518581526001600160401b038516602082015260808183018190526000908201526001606082015290516000805160206144c78339815191529181900360a00190a150505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166127bf57604051630ef4733760e31b815260040160405180910390fd5b60005b81811015610abf576127f98383838181106127df576127df614070565b90506020020160208101906127f491906138da565b61309d565b6001016127c2565b6000610d8081613059565b61281461306f565b6001600160a01b0316336001600160a01b031614612847576040516365f4906560e01b8152336004820152602401610538565b610a308161316f565b6060610d8060056133e8565b60606000828410604051806040016040528060078152602001664241445f41524760c81b815250906128a15760405162461bcd60e51b81526004016105389190613fea565b5060006128ae85856143c5565b6001600160401b038111156128c5576128c5613a87565b6040519080825280602002602001820160405280156128fe57816020015b6128eb61362d565b8152602001906001900390816128e35790505b50905060005b61290e6000613059565b6129188288614029565b10801561292d57508461292b8288614029565b105b15612a3d5760006129496129418389614029565b600090613063565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015612a0257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116129e4575b505050505081525050815250838381518110612a2057612a20614070565b60200260200101819052505080612a3690614086565b9050612904565b5080612a496000613059565b90969410159450505050565b6000611600600d83613010565b336000818152600760205260409020600201546001600160a01b0316612abe57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b612ac9600087613035565b612b045760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b600086815260026020526040902084815560018101805467ffffffffffffffff19166001600160401b0386161790558215612b6c576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b836001600160401b0316600103612b94576000878152600360205260408120612b94916135d2565b60408051888152602081018790526001600160401b03861681830152841515606082015290517fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b9181900360800190a150505050505050565b81612bf9600082613035565b612c345760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b03808316600090815260076020526040902060020154839116612c9457604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b600084815260026020526040812090805b6002830154811015612dae57856001600160a01b0316836002018281548110612cd057612cd0614070565b6000918252602090912001546001600160a01b031603612da657600283018054612cfc906001906143c5565b81548110612d0c57612d0c614070565b6000918252602090912001546002840180546001600160a01b039092169183908110612d3a57612d3a614070565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082600201805480612d7b57612d7b613ffd565b600082815260209020810160001990810180546001600160a01b031916905501905560019150612dae565b600101612ca5565b5080612df057604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b604080518781526001600160a01b03871660208201526000918101919091527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f906060016115e3565b33612e45600882613010565b612e7f5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b038481166000908152600760205260409020600201541615612ede57604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526105389190600401613fea565b60006040518060800160405280846005811115612efd57612efd613cb0565b8152602081018690526001600160a01b0387166040820152336060909101529050612f296005866133f5565b506001600160a01b03851660009081526007602052604090208151815483929190829060ff19166001836005811115612f6457612f64613cb0565b021790555060208201516001820190612f7d9082614135565b506040828101516002830180546001600160a01b03199081166001600160a01b039384161790915560609094015160039093018054909416928116929092179092559051908616907fd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e56190612ff490879087906144a4565b60405180910390a25050505050565b6000611600600a83613035565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b6000818152600183016020526040812054151561302e565b600061302e838361340a565b6000611600825490565b600061302e83836134fd565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b6001600160a01b0381166130e05760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526105389190600401613fea565b6130eb600882613010565b1561312c57604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526105389190600401613fea565b6131376008826133f5565b506040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b6001600160a01b0381166131b25760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526105389190600401613fea565b6131bd600d826133f5565b6131fd57604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526105389190600401613fea565b6040516001600160a01b038216907f7afd798379ae2d2e5035438544cea2b60eb1dde6a8128e6d447fd2a25f8825a290600090a250565b600082600581111561324857613248613cb0565b148061329c5750600182600581111561326357613263613cb0565b14801561329c5750600381600581111561327f5761327f613cb0565b148061329c5750600481600581111561329a5761329a613cb0565b145b806132ef575060028260058111156132b6576132b6613cb0565b1480156132ef575060038160058111156132d2576132d2613cb0565b14806132ef575060048160058111156132ed576132ed613cb0565b145b806133425750600482600581111561330957613309613cb0565b1480156133425750600381600581111561332557613325613cb0565b14806133425750600581600581111561334057613340613cb0565b145b8061337a5750600382600581111561335c5761335c613cb0565b14801561337a5750600581600581111561337857613378613cb0565b145b15613383575050565b60408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b81526105389190600401613fea565b600061302e8383613527565b600061302e836001600160a01b03841661340a565b6060600061302e83613576565b600061302e836001600160a01b038416613527565b600081815260018301602052604081205480156134f357600061342e6001836143c5565b8554909150600090613442906001906143c5565b90508082146134a757600086600001828154811061346257613462614070565b906000526020600020015490508087600001848154811061348557613485614070565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806134b8576134b8613ffd565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611600565b6000915050611600565b600082600001828154811061351457613514614070565b9060005260206000200154905092915050565b600081815260018301602052604081205461356e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611600565b506000611600565b6060816000018054806020026020016040519081016040528092919081815260200182805480156135c657602002820191906000526020600020905b8154815260200190600101908083116135b2575b50505050509050919050565b5080546135de9061403c565b6000825580601f106135ee575050565b601f016020900490600052602060002090810190610a3091906136dc565b5080546000825560030290600052602060002090810190610a3091906136f1565b6040805180820190915260008152602081016136726040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b905290565b8280548282559060005260206000209081019282156136cc579160200282015b828111156136cc57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613697565b506136d89291506136dc565b5090565b5b808211156136d857600081556001016136dd565b808211156136d857600080825560018201805467ffffffffffffffff1916905561371e60028301826135d2565b506003016136f1565b60006020828403121561373957600080fd5b5035919050565b60005b8381101561375b578181015183820152602001613743565b50506000910152565b6000815180845261377c816020860160208601613740565b601f01601f19169290920160200192915050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b8381101561380c57888303603f19018552815180518452878101516001600160401b03168885015286015160608785018190526137f881860183613764565b9689019694505050908601906001016137b9565b509098975050505050505050565b600060a08301825184526020808401516001600160401b0380821660208801528060408701511660408801528060608701511660608801525050608084015160a0608087015282815180855260c088019150602083019450600092505b808310156138a05784516001600160a01b03168252938301936001929092019190830190613877565b509695505050505050565b60208152600061302e602083018461381a565b80356001600160a01b03811681146138d557600080fd5b919050565b6000602082840312156138ec57600080fd5b61302e826138be565b6000806020838503121561390857600080fd5b82356001600160401b038082111561391f57600080fd5b818501915085601f83011261393357600080fd5b81358181111561394257600080fd5b8660208260051b850101111561395757600080fd5b60209290920196919550909350505050565b805182526000602082015160406020850152613988604085018261381a565b949350505050565b60008282518085526020808601955060208260051b8401016020860160005b848110156139dd57601f198684030189526139cb838351613969565b988401989250908301906001016139af565b5090979650505050505050565b60208152600061302e6020830184613990565b606081526000613a10606083018661381a565b8460208401528281036040840152613a288185613764565b9695505050505050565b8035600681106138d557600080fd5b60008060408385031215613a5457600080fd5b613a5d836138be565b9150613a6b60208401613a32565b90509250929050565b60208152600061302e6020830184613969565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613ac557613ac5613a87565b604052919050565b600082601f830112613ade57600080fd5b81356001600160401b03811115613af757613af7613a87565b613b0a601f8201601f1916602001613a9d565b818152846020838601011115613b1f57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215613b5257600080fd5b843593506020808601356001600160401b0380821115613b7157600080fd5b818801915088601f830112613b8557600080fd5b813581811115613b9757613b97613a87565b8060051b613ba6858201613a9d565b918252838101850191858101908c841115613bc057600080fd5b948601945b83861015613be557613bd6866138be565b82529486019490860190613bc5565b9850505050604088013594506060880135925080831115613c0557600080fd5b5050613c1387828801613acd565b91505092959194509250565b60008060408385031215613c3257600080fd5b613c3b836138be565b915060208301356001600160401b03811115613c5657600080fd5b613c6285828601613acd565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015613ca457835183529284019291840191600101613c88565b50909695505050505050565b634e487b7160e01b600052602160045260246000fd5b60068110613ce457634e487b7160e01b600052602160045260246000fd5b9052565b613cf3828251613cc6565b6000602082015160806020850152613d0e6080850182613764565b6040848101516001600160a01b03908116918701919091526060948501511693909401929092525090919050565b60208152600061302e6020830184613ce8565b60008060408385031215613d6257600080fd5b82359150613a6b602084016138be565b80356001600160401b03811681146138d557600080fd5b60008060008060608587031215613d9f57600080fd5b84359350613daf60208601613d72565b925060408501356001600160401b0380821115613dcb57600080fd5b818701915087601f830112613ddf57600080fd5b813581811115613dee57600080fd5b886020828501011115613e0057600080fd5b95989497505060200194505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015613e6657603f19888603018452613e54858351613ce8565b94509285019290850190600101613e38565b5092979650505050505050565b60008060408385031215613e8657600080fd5b82359150613a6b60208401613d72565b60008151808452602080850194506020840160005b83811015613ed05781516001600160a01b031687529582019590820190600101613eab565b509495945050505050565b60208152600061302e6020830184613e96565b60008060408385031215613f0157600080fd5b50508035926020909101359150565b604081526000613f236040830185613990565b905082151560208301529392505050565b600080600080600060a08688031215613f4c57600080fd5b853594506020860135935060408601359250613f6a60608701613d72565b915060808601358015158114613f7f57600080fd5b809150509295509295909350565b600080600060608486031215613fa257600080fd5b613fab846138be565b925060208401356001600160401b03811115613fc657600080fd5b613fd286828701613acd565b925050613fe160408501613a32565b90509250925092565b60208152600061302e6020830184613764565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561160057611600614013565b600181811c9082168061405057607f821691505b602082108103610ef057634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60006001820161409857614098614013565b5060010190565b600063ffffffff8083168181036140b8576140b8614013565b6001019392505050565b602081016116008284613cc6565b601f821115610abf576000816000526020600020601f850160051c810160208610156140f95750805b601f850160051c820191505b8181101561411857828155600101614105565b505050505050565b600019600383901b1c191660019190911b1790565b81516001600160401b0381111561414e5761414e613a87565b6141628161415c845461403c565b846140d0565b602080601f831160018114614191576000841561417f5750858301515b6141898582614120565b865550614118565b600085815260208120601f198616915b828110156141c0578886015182559484019460019091019084016141a1565b50858210156141de5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8481526080602082015260006142076080830186613e96565b846040840152828103606084015261421f8185613764565b979650505050505050565b6000825161423c818460208701613740565b9190910192915050565b60008083546142548161403c565b6001828116801561426c5760018114614281576142b0565b60ff19841687528215158302870194506142b0565b8760005260208060002060005b858110156142a75781548a82015290840190820161428e565b50505082870194505b50929695505050505050565b6001600160401b038311156142d3576142d3613a87565b6142e7836142e1835461403c565b836140d0565b6000601f84116001811461431557600085156143035750838201355b61430d8682614120565b84555061201f565b600083815260209020601f19861690835b828110156143465786850135825560209485019460019092019101614326565b50868210156143635760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8581526001600160401b038516602082015260806040820152826080820152828460a0830137600081840160a0908101919091529115156060820152601f909201601f1916909101019392505050565b8181038181111561160057611600614013565b8181036143e3575050565b6143ed825461403c565b6001600160401b0381111561440457614404613a87565b6144128161415c845461403c565b6000601f821160018114614440576000831561442e5750848201545b6144388482614120565b85555061201f565b600085815260209020601f19841690600086815260209020845b8381101561447a578286015482556001958601959091019060200161445a565b50858310156141de5793015460001960f8600387901b161c19169092555050600190811b01905550565b6040815260006144b76040830185613764565b905061302e6020830184613cc656fec01483261a841a868b99cb8802faed4ea44a1a816651c4f7ee061a96a205fe98","sourceMap":"560:732:335:-:0;;;1030:260;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;385:22:70;:20;:22::i;:::-;1084:30:335;1103:10;1084:18;:30::i;:::-;1125:9;1120:166;1144:17;:24;1140:1;:28;1120:166;;;1183:38;1200:17;1218:1;1200:20;;;;;;;;:::i;:::-;;;;;;;1183:16;;;:38;;:::i;:::-;1229:50;1258:17;1276:1;1258:20;;;;;;;;:::i;:::-;;;;;;;1229:28;;;:50;;:::i;:::-;1170:3;;1120:166;;;;1030:260;560:732;;1653:314:84;303:66:85;1779:14:84;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:84;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:84;1898:16;1886:28;;;;;1927:29;;1738:42:514;;;1927:29:84;;1726:2:514;1711:18;1927:29:84;;;;;;;1844:119;1694:273;1653:314::o;483:253:96:-;544:16;563:8;291:66:98;445:29:96;-1:-1:-1;;;;;445:29:96;;376:103;563:8;544:27;-1:-1:-1;;;;;;581:22:96;;577:57;;612:22;;-1:-1:-1;;;612:22:96;;;;;;;;;;;577:57;672:8;291:66:98;640:40:96;;-1:-1:-1;;;;;;640:40:96;-1:-1:-1;;;;;640:40:96;;;;;;691;;;;;;;;;;;-1:-1:-1;;691:40:96;538:198;483:253;:::o;2005:320:180:-;-1:-1:-1;;;;;2101:22:180;;2097:63;;2132:27;;;;;;;;;;;-1:-1:-1;;;2132:27:180;;;;2125:35;;-1:-1:-1;;;2125:35:180;;;;2132:27;2125:35;;;:::i;:::-;;;;;;;;2097:63;2171:31;:12;2193:8;2171:21;:31::i;:::-;2167:85;;;2217:34;;;;;;;;;;;-1:-1:-1;;;2217:34:180;;;;2210:42;;-1:-1:-1;;;2210:42:180;;;;2217:34;2210:42;;;:::i;2167:85::-;2259:26;:12;2276:8;2259:16;:26::i;:::-;-1:-1:-1;2297:23:180;;-1:-1:-1;;;;;2297:23:180;;;;;;;;2005:320;:::o;5944:282:176:-;-1:-1:-1;;;;;6018:21:176;;6014:62;;6048:27;;;;;;;;;;;-1:-1:-1;;;6048:27:176;;;;6041:35;;-1:-1:-1;;;6041:35:176;;;;6048:27;6041:35;;;:::i;6014:62::-;6088:37;:24;6117:7;6088:28;:37::i;:::-;6083:92;;6140:34;;;;;;;;;;;-1:-1:-1;;;6140:34:176;;;;6133:42;;-1:-1:-1;;;6133:42:176;;;;6140:34;6133:42;;;:::i;6083:92::-;6187:34;;-1:-1:-1;;;;;6187:34:176;;;;;;;;5944:282;:::o;8871:165:447:-;-1:-1:-1;;;;;9004:23:447;;8951:4;4360:21;;;:14;;;:21;;;;;;:26;;8974:55;8967:62;;8871:165;;;;;:::o;8316:150::-;8386:4;8409:50;8414:3;-1:-1:-1;;;;;8434:23:447;;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:447;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:447;2618:12;;14:127:514;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:177;225:13;;-1:-1:-1;;;;;267:31:514;;257:42;;247:70;;313:1;310;303:12;247:70;146:177;;;:::o;328:1129::-;423:6;454:2;497;485:9;476:7;472:23;468:32;465:52;;;513:1;510;503:12;465:52;540:16;;-1:-1:-1;;;;;605:14:514;;;602:34;;;632:1;629;622:12;602:34;670:6;659:9;655:22;645:32;;715:7;708:4;704:2;700:13;696:27;686:55;;737:1;734;727:12;686:55;766:2;760:9;788:2;784;781:10;778:36;;;794:18;;:::i;:::-;840:2;837:1;833:10;872:2;866:9;935:2;931:7;926:2;922;918:11;914:25;906:6;902:38;990:6;978:10;975:22;970:2;958:10;955:18;952:46;949:72;;;1001:18;;:::i;:::-;1037:2;1030:22;1087:18;;;1121:15;;;;-1:-1:-1;1163:11:514;;;1159:20;;;1191:19;;;1188:39;;;1223:1;1220;1213:12;1188:39;1247:11;;;;1267:159;1283:6;1278:3;1275:15;1267:159;;;1349:34;1379:3;1349:34;:::i;:::-;1337:47;;1300:12;;;;1404;;;;1267:159;;;1445:6;328:1129;-1:-1:-1;;;;;;;;328:1129:514:o;1462:127::-;1523:10;1518:3;1514:20;1511:1;1504:31;1554:4;1551:1;1544:15;1578:4;1575:1;1568:15;1791:548;1903:4;1932:2;1961;1950:9;1943:21;1993:6;1987:13;2036:6;2031:2;2020:9;2016:18;2009:34;2061:1;2071:140;2085:6;2082:1;2079:13;2071:140;;;2180:14;;;2176:23;;2170:30;2146:17;;;2165:2;2142:26;2135:66;2100:10;;2071:140;;;2075:3;2260:1;2255:2;2246:6;2235:9;2231:22;2227:31;2220:42;2330:2;2323;2319:7;2314:2;2306:6;2302:15;2298:29;2287:9;2283:45;2279:54;2271:62;;;;1791:548;;;;:::o;:::-;560:732:335;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106102065760003560e01c80639d2090481161011a578063c0f22084116100ad578063d4bd44a01161007c578063d4bd44a014610493578063d7a3158a146104a6578063ee885b12146104b9578063eecc66f4146104cc578063fc207c01146104df57600080fd5b8063c0f2208414610442578063c179b85f1461044a578063c8fe3a011461045d578063ca78c41a1461047257600080fd5b8063ac8a584a116100e9578063ac8a584a146103f6578063b2b99ec914610409578063b7f227ee1461041c578063ba428b1a1461042f57600080fd5b80639d2090481461039b5780639ee86d38146103bb578063a09449a6146103ce578063a1174e7d146103e157600080fd5b80633c2544d11161019d5780636d70f7ae1161016c5780636d70f7ae1461032a5780637e4465e71461034d578063813049ec1461036057806386789fc6146103735780639283ae3a1461038857600080fd5b80633c2544d1146102c2578063581f8b9b146102e457806368b454df146102f75780636b883c391461031757600080fd5b806331374511116101d9578063313745111461027157806332705ac41461028457806339bf397e146102a45780633bd84c0c146102ba57600080fd5b8063035759e11461020b578063081814db146102205780631290abe81461023e578063242cae9f1461025e575b600080fd5b61021e610219366004613727565b6104f2565b005b61022861065f565b6040516102359190613790565b60405180910390f35b61025161024c366004613727565b6108ca565b60405161023591906138ab565b61021e61026c3660046138da565b6109ec565b61021e61027f3660046138f5565b610a33565b6102976102923660046138da565b610ac4565b60405161023591906139ea565b6102ac610d74565b604051908152602001610235565b610297610d85565b6102d56102d0366004613727565b610ef6565b604051610235939291906139fd565b61021e6102f2366004613a41565b6110c7565b61030a610305366004613727565b611267565b6040516102359190613a74565b61021e610325366004613b3c565b61138e565b61033d6103383660046138da565b6115f3565b6040519015158152602001610235565b61021e61035b366004613c1f565b611606565b61021e61036e3660046138da565b6117fe565b61037b6118f9565b6040516102359190613c6c565b610228610396366004613727565b611905565b6103ae6103a93660046138da565b611a67565b6040516102359190613d3c565b61021e6103c9366004613d4f565b611be8565b61021e6103dc366004613d89565b611da5565b6103e9612026565b6040516102359190613e0f565b61021e6104043660046138da565b6121fa565b61021e6104173660046138da565b61235d565b61021e61042a366004613e73565b612526565b61021e61043d3660046138f5565b612775565b6102ac612801565b61021e6104583660046138da565b61280c565b610465612850565b6040516102359190613edb565b610485610480366004613eee565b61285c565b604051610235929190613f10565b61033d6104a13660046138da565b612a55565b61021e6104b4366004613f34565b612a62565b61021e6104c7366004613d4f565b612bed565b61021e6104da366004613f8d565b612e39565b61033d6104ed366004613727565b613003565b336104fe600d82613010565b6105415760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b60405180910390fd5b8161054d600a82613035565b6105885760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b6000838152600c6020526040902054156105fb576000838152600c602052604090208054806105b9576105b9613ffd565b60008281526020812060036000199093019283020181815560018101805467ffffffffffffffff19169055906105f260028301826135d2565b50509055610588565b6000838152600c602052604081206106129161360c565b61061d600a8461304d565b506040805184815260006020820181905260808284018190528201526001606082015290516000805160206144c78339815191529181900360a00190a1505050565b606060008061066e600a613059565b905060005b818110156106af576000610688600a83613063565b6000818152600c60205260409020549091506106a49085614029565b935050600101610673565b506000826001600160401b038111156106ca576106ca613a87565b60405190808252806020026020018201604052801561071757816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816106e85790505b5090506000610726600a613059565b90506000805b828110156108bf576000610741600a83613063565b6000818152600c6020908152604080832080548251818502810185019093528083529495509293909291849084015b8282101561085457600084815260209081902060408051606081018252600386029092018054835260018101546001600160401b031693830193909352600283018054929392918401916107c39061403c565b80601f01602080910402602001604051908101604052809291908181526020018280546107ef9061403c565b801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b50505050508152505081526020019060010190610770565b50505050905060005b81518110156108b15781818151811061087857610878614070565b602002602001015187868061088c90614086565b97508151811061089e5761089e614070565b602090810291909101015260010161085d565b50505080600101905061072c565b509195945050505050565b6040805160a08101825260008082526020820181905291810182905260608082018390526080820152906108fe9083613035565b6109395760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b600082815260026020818152604092839020835160a0810185528154815260018201546001600160401b0380821683860152600160401b8204811683880152600160801b90910416606082015292810180548551818502810185019096528086529394919360808601938301828280156109dc57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109be575b5050505050815250509050919050565b6109f461306f565b6001600160a01b0316336001600160a01b031614610a27576040516365f4906560e01b8152336004820152602401610538565b610a308161309d565b50565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff16610a7d57604051630ef4733760e31b815260040160405180910390fd5b60005b81811015610abf57610ab7838383818110610a9d57610a9d614070565b9050602002016020810190610ab291906138da565b61316f565b600101610a80565b505050565b60606000610ad181613059565b6001600160401b03811115610ae857610ae8613a87565b604051908082528060200260200182016040528015610b11578160200160208202803683370190505b5090506000805b610b226000613059565b811015610bd7576000610b358183613063565b60008181526002602052604081209192505b6002820154811015610bc957876001600160a01b0316826002018281548110610b7257610b72614070565b6000918252602090912001546001600160a01b031603610bc157828686610b988161409f565b975063ffffffff1681518110610bb057610bb0614070565b602002602001018181525050610bc9565b600101610b47565b505050806001019050610b18565b5060008163ffffffff166001600160401b03811115610bf857610bf8613a87565b604051908082528060200260200182016040528015610c3157816020015b610c1e61362d565b815260200190600190039081610c165790505b50905060005b8263ffffffff16811015610d6b576040518060400160405280858381518110610c6257610c62614070565b6020026020010151815260200160006002016000878581518110610c8857610c88614070565b6020908102919091018101518252818101929092526040908101600020815160a0810183528154815260018201546001600160401b0380821683870152600160401b8204811683860152600160801b909104166060820152600282018054845181870281018701909552808552919492936080860193909290830182828015610d3a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d1c575b505050505081525050815250828281518110610d5857610d58614070565b6020908102919091010152600101610c37565b50949350505050565b6000610d806005613059565b905090565b60606000610d9281613059565b6001600160401b03811115610da957610da9613a87565b604051908082528060200260200182016040528015610de257816020015b610dcf61362d565b815260200190600190039081610dc75790505b50905060005b610df26000613059565b811015610ef0576000610e058183613063565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015610ebe57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ea0575b505050505081525050815250838381518110610edc57610edc614070565b602090810291909101015250600101610de8565b50919050565b6040805160a081018252600080825260208201819052918101829052606080820183905260808201819052909190610f2e8285613035565b610f695760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b600084815260026020818152604080842060048352818520546003845294829020825160a0810184528254815260018301546001600160401b0380821683880152600160401b8204811683870152600160801b9091041660608201529482018054845181870281018701909552808552929695919491938793608086019391929183018282801561102357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611005575b505050505081525050925080805461103a9061403c565b80601f01602080910402602001604051908101604052809291908181526020018280546110669061403c565b80156110b35780601f10611088576101008083540402835291602001916110b3565b820191906000526020600020905b81548152906001019060200180831161109657829003601f168201915b505050505090509250925092509193909250565b6001600160a01b0380831660009081526007602052604090206002015483911661112757604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b33611133600882613010565b61116d5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b03808516600090815260076020526040902060030154859133911681146111cb5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b038616600090815260076020526040902080546111f29060ff1687613234565b80548690829060ff1916600183600581111561121057611210613cb0565b021790555060028101546040516001600160a01b03909116907f20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0906112569089906140c2565b60405180910390a250505050505050565b61126f61362d565b6112796000613059565b82106112b65760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b60006112c28184613063565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b909104166060820152918101805486518186028101860190975280875296975093958387019592949193608086019392919083018282801561137b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161135d575b5050509190925250505090529392505050565b336000818152600760205260409020600201546001600160a01b03166113ea57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b6113f5600086613035565b1561143657604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526105389190600401613fea565b60005b84518110156114ba5761147285828151811061145757611457614070565b6020026020010151600060050161301090919063ffffffff16565b6114b257604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b600101611439565b506040805160a0810182528481526000602082018190529181018290526060810182905260808101869052906114f090876133c7565b5060008681526002602081815260409283902084518155818501516001820180549587015160608801516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026fffffffffffffffffffffffffffffffff1990991691909416179690961795909516179093556080840151805185949361158093908501920190613677565b505050600086815260036020526040902061159b8482614135565b5060008681526004602052604090819020859055517f55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb906115e39088908890889088906141ee565b60405180910390a1505050505050565b6000611600600883613010565b92915050565b33611612600882613010565b61164c5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b038084166000908152600760205260409020600201548491166116ac57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b038085166000908152600760205260409020600301548591339116811461170a5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b03861660009081526007602090815260409182902091516117349188910161422a565b604051602081830303815290604052805190602001208160010160405160200161175e9190614246565b60405160208183030381529060405280519060200120036117ae5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526105389190600401613fea565b600181016117bc8782614135565b5060028101546040516001600160a01b03909116907f4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac90611256908990613fea565b61180661306f565b6001600160a01b0316336001600160a01b031614611839576040516365f4906560e01b8152336004820152602401610538565b6001600160a01b03811661187c5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526105389190600401613fea565b611887600d826133d3565b6118c25760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b6040516001600160a01b038216907ff9889c857e5356066b564327caa757c325ecbc001b2b47d72edf8cf9aedb1be590600090a250565b6060610d8060006133e8565b606081611913600a82613035565b61194e5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b6000838152600c6020908152604080832080548251818502810185019093528083529193909284015b82821015611a5b57600084815260209081902060408051606081018252600386029092018054835260018101546001600160401b031693830193909352600283018054929392918401916119ca9061403c565b80601f01602080910402602001604051908101604052809291908181526020018280546119f69061403c565b8015611a435780601f10611a1857610100808354040283529160200191611a43565b820191906000526020600020905b815481529060010190602001808311611a2657829003601f168201915b50505050508152505081526020019060010190611977565b50505050915050919050565b611a926040805160808101909152806000815260606020820181905260006040830181905291015290565b611a9d600583613010565b611add57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b038216600090815260076020526040908190208151608081019092528054829060ff166005811115611b1857611b18613cb0565b6005811115611b2957611b29613cb0565b8152602001600182018054611b3d9061403c565b80601f0160208091040260200160405190810160405280929190818152602001828054611b699061403c565b8015611bb65780601f10611b8b57610100808354040283529160200191611bb6565b820191906000526020600020905b815481529060010190602001808311611b9957829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015292915050565b81611bf4600082613035565b611c2f5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b03808316600090815260076020526040902060020154839116611c8f57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b6000848152600260205260408120905b6002820154811015611d2857846001600160a01b0316826002018281548110611cca57611cca614070565b6000918252602090912001546001600160a01b031603611d2057604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526105389190600401613fea565b600101611c9f565b5060028101805460018082018355600092835260209283902090910180546001600160a01b0319166001600160a01b03881690811790915560408051898152938401919091528201527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f9060600160405180910390a15050505050565b33611db1600d82613010565b611deb5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6000829003611e295760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526105389190600401613fea565b611e34600a86613035565b611e4557611e43600a866133c7565b505b6000858152600c6020526040812054905b81811015611f2c576000878152600c6020526040902080546001600160401b038816919083908110611e8a57611e8a614070565b60009182526020909120600160039092020101546001600160401b031603611f24576000878152600c6020526040902080548691869184908110611ed057611ed0614070565b90600052602060002090600302016002019182611eee9291906142bc565b506000805160206144c7833981519152878787876000604051611f15959493929190614375565b60405180910390a1505061201f565b600101611e56565b506000600c0160008781526020019081526020016000206040518060600160405280888152602001876001600160401b0316815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050835460018082018655948252602091829020845160039092020190815590830151938101805467ffffffffffffffff19166001600160401b03909516949094179093555060408101519091906002820190611ff69082614135565b5050506000805160206144c78339815191528686868660006040516115e3959493929190614375565b5050505050565b606060006120346005613059565b6001600160401b0381111561204b5761204b613a87565b6040519080825280602002602001820160405280156120a757816020015b6120946040805160808101909152806000815260606020820181905260006040830181905291015290565b8152602001906001900390816120695790505b50905060005b6120b76005613059565b811015610ef057600760006120cd600584613063565b6001600160a01b03168152602081019190915260409081016000208151608081019092528054829060ff16600581111561210957612109613cb0565b600581111561211a5761211a613cb0565b815260200160018201805461212e9061403c565b80601f016020809104026020016040519081016040528092919081815260200182805461215a9061403c565b80156121a75780601f1061217c576101008083540402835291602001916121a7565b820191906000526020600020905b81548152906001019060200180831161218a57829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015282518390839081106121e7576121e7614070565b60209081029190910101526001016120ad565b61220261306f565b6001600160a01b0316336001600160a01b031614612235576040516365f4906560e01b8152336004820152602401610538565b612240600882613010565b61228457604080518082018252601281527113d41154905513d497d393d517d193d5539160721b6020820152905162461bcd60e51b81526105389190600401613fea565b60005b6122916005613059565b811015612319576001600160a01b038216600760006122b1600585613063565b6001600160a01b039081168252602082019290925260400160002060030154160361231157604080518082018252600d81526c4f55545f4f465f424f554e445360981b6020820152905162461bcd60e51b81526105389190600401613fea565b600101612287565b506123256008826133d3565b506040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b6001600160a01b03808216600090815260076020526040902060030154829133911681146123bb5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b038381166000908152600760205260409020600201541661241957604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b60056001600160a01b03841660009081526007602052604090205460ff16600581111561244857612448613cb0565b146124915760408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b81526105389190600401613fea565b61249c6005846133d3565b506001600160a01b0383166000908152600760205260408120805460ff19168155906124cb60018301826135d2565b506002810180546001600160a01b03199081169091556003909101805490911690556040516001600160a01b038416907fcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b90600090a2505050565b33612532600d82613010565b61256c5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6000805b6000858152600c60205260409020548110156126ed576000858152600c6020526040902080546001600160401b0386169190839081106125b2576125b2614070565b60009182526020909120600160039092020101546001600160401b0316036126e5576000858152600c6020526040902080546125f0906001906143c5565b8154811061260057612600614070565b90600052602060002090600302016000600c016000878152602001908152602001600020828154811061263557612635614070565b600091825260209091208254600390920201908155600180830154908201805467ffffffffffffffff19166001600160401b03909216919091179055600280820190612683908401826143d8565b5050506000858152600c602052604090208054806126a3576126a3613ffd565b60008281526020812060036000199093019283020181815560018101805467ffffffffffffffff19169055906126dc60028301826135d2565b50509055600191505b600101612570565b508061272a5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b604080518581526001600160401b038516602082015260808183018190526000908201526001606082015290516000805160206144c78339815191529181900360a00190a150505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166127bf57604051630ef4733760e31b815260040160405180910390fd5b60005b81811015610abf576127f98383838181106127df576127df614070565b90506020020160208101906127f491906138da565b61309d565b6001016127c2565b6000610d8081613059565b61281461306f565b6001600160a01b0316336001600160a01b031614612847576040516365f4906560e01b8152336004820152602401610538565b610a308161316f565b6060610d8060056133e8565b60606000828410604051806040016040528060078152602001664241445f41524760c81b815250906128a15760405162461bcd60e51b81526004016105389190613fea565b5060006128ae85856143c5565b6001600160401b038111156128c5576128c5613a87565b6040519080825280602002602001820160405280156128fe57816020015b6128eb61362d565b8152602001906001900390816128e35790505b50905060005b61290e6000613059565b6129188288614029565b10801561292d57508461292b8288614029565b105b15612a3d5760006129496129418389614029565b600090613063565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015612a0257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116129e4575b505050505081525050815250838381518110612a2057612a20614070565b60200260200101819052505080612a3690614086565b9050612904565b5080612a496000613059565b90969410159450505050565b6000611600600d83613010565b336000818152600760205260409020600201546001600160a01b0316612abe57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b612ac9600087613035565b612b045760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b600086815260026020526040902084815560018101805467ffffffffffffffff19166001600160401b0386161790558215612b6c576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b836001600160401b0316600103612b94576000878152600360205260408120612b94916135d2565b60408051888152602081018790526001600160401b03861681830152841515606082015290517fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b9181900360800190a150505050505050565b81612bf9600082613035565b612c345760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b03808316600090815260076020526040902060020154839116612c9457604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b600084815260026020526040812090805b6002830154811015612dae57856001600160a01b0316836002018281548110612cd057612cd0614070565b6000918252602090912001546001600160a01b031603612da657600283018054612cfc906001906143c5565b81548110612d0c57612d0c614070565b6000918252602090912001546002840180546001600160a01b039092169183908110612d3a57612d3a614070565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082600201805480612d7b57612d7b613ffd565b600082815260209020810160001990810180546001600160a01b031916905501905560019150612dae565b600101612ca5565b5080612df057604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526105389190600401613fea565b604080518781526001600160a01b03871660208201526000918101919091527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f906060016115e3565b33612e45600882613010565b612e7f5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526105389190600401613fea565b6001600160a01b038481166000908152600760205260409020600201541615612ede57604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526105389190600401613fea565b60006040518060800160405280846005811115612efd57612efd613cb0565b8152602081018690526001600160a01b0387166040820152336060909101529050612f296005866133f5565b506001600160a01b03851660009081526007602052604090208151815483929190829060ff19166001836005811115612f6457612f64613cb0565b021790555060208201516001820190612f7d9082614135565b506040828101516002830180546001600160a01b03199081166001600160a01b039384161790915560609094015160039093018054909416928116929092179092559051908616907fd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e56190612ff490879087906144a4565b60405180910390a25050505050565b6000611600600a83613035565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b6000818152600183016020526040812054151561302e565b600061302e838361340a565b6000611600825490565b600061302e83836134fd565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b6001600160a01b0381166130e05760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526105389190600401613fea565b6130eb600882613010565b1561312c57604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526105389190600401613fea565b6131376008826133f5565b506040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b6001600160a01b0381166131b25760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526105389190600401613fea565b6131bd600d826133f5565b6131fd57604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526105389190600401613fea565b6040516001600160a01b038216907f7afd798379ae2d2e5035438544cea2b60eb1dde6a8128e6d447fd2a25f8825a290600090a250565b600082600581111561324857613248613cb0565b148061329c5750600182600581111561326357613263613cb0565b14801561329c5750600381600581111561327f5761327f613cb0565b148061329c5750600481600581111561329a5761329a613cb0565b145b806132ef575060028260058111156132b6576132b6613cb0565b1480156132ef575060038160058111156132d2576132d2613cb0565b14806132ef575060048160058111156132ed576132ed613cb0565b145b806133425750600482600581111561330957613309613cb0565b1480156133425750600381600581111561332557613325613cb0565b14806133425750600581600581111561334057613340613cb0565b145b8061337a5750600382600581111561335c5761335c613cb0565b14801561337a5750600581600581111561337857613378613cb0565b145b15613383575050565b60408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b81526105389190600401613fea565b600061302e8383613527565b600061302e836001600160a01b03841661340a565b6060600061302e83613576565b600061302e836001600160a01b038416613527565b600081815260018301602052604081205480156134f357600061342e6001836143c5565b8554909150600090613442906001906143c5565b90508082146134a757600086600001828154811061346257613462614070565b906000526020600020015490508087600001848154811061348557613485614070565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806134b8576134b8613ffd565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611600565b6000915050611600565b600082600001828154811061351457613514614070565b9060005260206000200154905092915050565b600081815260018301602052604081205461356e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611600565b506000611600565b6060816000018054806020026020016040519081016040528092919081815260200182805480156135c657602002820191906000526020600020905b8154815260200190600101908083116135b2575b50505050509050919050565b5080546135de9061403c565b6000825580601f106135ee575050565b601f016020900490600052602060002090810190610a3091906136dc565b5080546000825560030290600052602060002090810190610a3091906136f1565b6040805180820190915260008152602081016136726040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b905290565b8280548282559060005260206000209081019282156136cc579160200282015b828111156136cc57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613697565b506136d89291506136dc565b5090565b5b808211156136d857600081556001016136dd565b808211156136d857600080825560018201805467ffffffffffffffff1916905561371e60028301826135d2565b506003016136f1565b60006020828403121561373957600080fd5b5035919050565b60005b8381101561375b578181015183820152602001613743565b50506000910152565b6000815180845261377c816020860160208601613740565b601f01601f19169290920160200192915050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b8381101561380c57888303603f19018552815180518452878101516001600160401b03168885015286015160608785018190526137f881860183613764565b9689019694505050908601906001016137b9565b509098975050505050505050565b600060a08301825184526020808401516001600160401b0380821660208801528060408701511660408801528060608701511660608801525050608084015160a0608087015282815180855260c088019150602083019450600092505b808310156138a05784516001600160a01b03168252938301936001929092019190830190613877565b509695505050505050565b60208152600061302e602083018461381a565b80356001600160a01b03811681146138d557600080fd5b919050565b6000602082840312156138ec57600080fd5b61302e826138be565b6000806020838503121561390857600080fd5b82356001600160401b038082111561391f57600080fd5b818501915085601f83011261393357600080fd5b81358181111561394257600080fd5b8660208260051b850101111561395757600080fd5b60209290920196919550909350505050565b805182526000602082015160406020850152613988604085018261381a565b949350505050565b60008282518085526020808601955060208260051b8401016020860160005b848110156139dd57601f198684030189526139cb838351613969565b988401989250908301906001016139af565b5090979650505050505050565b60208152600061302e6020830184613990565b606081526000613a10606083018661381a565b8460208401528281036040840152613a288185613764565b9695505050505050565b8035600681106138d557600080fd5b60008060408385031215613a5457600080fd5b613a5d836138be565b9150613a6b60208401613a32565b90509250929050565b60208152600061302e6020830184613969565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613ac557613ac5613a87565b604052919050565b600082601f830112613ade57600080fd5b81356001600160401b03811115613af757613af7613a87565b613b0a601f8201601f1916602001613a9d565b818152846020838601011115613b1f57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215613b5257600080fd5b843593506020808601356001600160401b0380821115613b7157600080fd5b818801915088601f830112613b8557600080fd5b813581811115613b9757613b97613a87565b8060051b613ba6858201613a9d565b918252838101850191858101908c841115613bc057600080fd5b948601945b83861015613be557613bd6866138be565b82529486019490860190613bc5565b9850505050604088013594506060880135925080831115613c0557600080fd5b5050613c1387828801613acd565b91505092959194509250565b60008060408385031215613c3257600080fd5b613c3b836138be565b915060208301356001600160401b03811115613c5657600080fd5b613c6285828601613acd565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015613ca457835183529284019291840191600101613c88565b50909695505050505050565b634e487b7160e01b600052602160045260246000fd5b60068110613ce457634e487b7160e01b600052602160045260246000fd5b9052565b613cf3828251613cc6565b6000602082015160806020850152613d0e6080850182613764565b6040848101516001600160a01b03908116918701919091526060948501511693909401929092525090919050565b60208152600061302e6020830184613ce8565b60008060408385031215613d6257600080fd5b82359150613a6b602084016138be565b80356001600160401b03811681146138d557600080fd5b60008060008060608587031215613d9f57600080fd5b84359350613daf60208601613d72565b925060408501356001600160401b0380821115613dcb57600080fd5b818701915087601f830112613ddf57600080fd5b813581811115613dee57600080fd5b886020828501011115613e0057600080fd5b95989497505060200194505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015613e6657603f19888603018452613e54858351613ce8565b94509285019290850190600101613e38565b5092979650505050505050565b60008060408385031215613e8657600080fd5b82359150613a6b60208401613d72565b60008151808452602080850194506020840160005b83811015613ed05781516001600160a01b031687529582019590820190600101613eab565b509495945050505050565b60208152600061302e6020830184613e96565b60008060408385031215613f0157600080fd5b50508035926020909101359150565b604081526000613f236040830185613990565b905082151560208301529392505050565b600080600080600060a08688031215613f4c57600080fd5b853594506020860135935060408601359250613f6a60608701613d72565b915060808601358015158114613f7f57600080fd5b809150509295509295909350565b600080600060608486031215613fa257600080fd5b613fab846138be565b925060208401356001600160401b03811115613fc657600080fd5b613fd286828701613acd565b925050613fe160408501613a32565b90509250925092565b60208152600061302e6020830184613764565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561160057611600614013565b600181811c9082168061405057607f821691505b602082108103610ef057634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60006001820161409857614098614013565b5060010190565b600063ffffffff8083168181036140b8576140b8614013565b6001019392505050565b602081016116008284613cc6565b601f821115610abf576000816000526020600020601f850160051c810160208610156140f95750805b601f850160051c820191505b8181101561411857828155600101614105565b505050505050565b600019600383901b1c191660019190911b1790565b81516001600160401b0381111561414e5761414e613a87565b6141628161415c845461403c565b846140d0565b602080601f831160018114614191576000841561417f5750858301515b6141898582614120565b865550614118565b600085815260208120601f198616915b828110156141c0578886015182559484019460019091019084016141a1565b50858210156141de5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8481526080602082015260006142076080830186613e96565b846040840152828103606084015261421f8185613764565b979650505050505050565b6000825161423c818460208701613740565b9190910192915050565b60008083546142548161403c565b6001828116801561426c5760018114614281576142b0565b60ff19841687528215158302870194506142b0565b8760005260208060002060005b858110156142a75781548a82015290840190820161428e565b50505082870194505b50929695505050505050565b6001600160401b038311156142d3576142d3613a87565b6142e7836142e1835461403c565b836140d0565b6000601f84116001811461431557600085156143035750838201355b61430d8682614120565b84555061201f565b600083815260209020601f19861690835b828110156143465786850135825560209485019460019092019101614326565b50868210156143635760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8581526001600160401b038516602082015260806040820152826080820152828460a0830137600081840160a0908101919091529115156060820152601f909201601f1916909101019392505050565b8181038181111561160057611600614013565b8181036143e3575050565b6143ed825461403c565b6001600160401b0381111561440457614404613a87565b6144128161415c845461403c565b6000601f821160018114614440576000831561442e5750848201545b6144388482614120565b85555061201f565b600085815260209020601f19841690600086815260209020845b8381101561447a578286015482556001958601959091019060200161445a565b50858310156141de5793015460001960f8600387901b161c19169092555050600190811b01905550565b6040815260006144b76040830185613764565b905061302e6020830184613cc656fec01483261a841a868b99cb8802faed4ea44a1a816651c4f7ee061a96a205fe98","sourceMap":"560:732:335:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2631:336:176;;;;;;:::i;:::-;;:::i;:::-;;3952:747;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1848:196:182;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1137:99:180:-;;;;;;:::i;:::-;;:::i;1024:221:176:-;;;;;;:::i;:::-;;:::i;6663:855:182:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2849:91:178:-;;;:::i;:::-;;;5457:25:514;;;5445:2;5430:18;2849:91:178;5311:177:514;5767:344:182;;;:::i;2409:350::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;1728:394:178:-;;;;;;:::i;:::-;;:::i;2048:296:182:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;762:1082::-;;;;;;:::i;:::-;;:::i;1240:116:180:-;;;;;;:::i;:::-;;:::i;:::-;;;9300:14:514;;9293:22;9275:41;;9263:2;9248:18;1240:116:180;9135:187:514;2126:453:178;;;;;;:::i;:::-;;:::i;5383:290:176:-;;;;;;:::i;:::-;;:::i;5658:105:182:-;;;:::i;:::-;;;;;;;:::i;3724:148:176:-;;;;;;:::i;:::-;;:::i;2583:262:178:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4463:504:182:-;;;;;;:::i;:::-;;:::i;1712:826:176:-;;;;;;:::i;:::-;;:::i;3055:254:178:-;;;:::i;:::-;;;;;;;:::i;1360:466:180:-;;;;;;:::i;:::-;;:::i;1248:476:178:-;;;;;;:::i;:::-;;:::i;3065:587:176:-;;;;;;:::i;:::-;;:::i;738:220:180:-;;;;;;:::i;:::-;;:::i;5559:95:182:-;;;:::i;5190:121:176:-;;;;;;:::i;:::-;;:::i;2944:107:178:-;;;:::i;:::-;;;;;;;:::i;6115:544:182:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;4975:146:176:-;;;;;;:::i;:::-;;:::i;2763:1696:182:-;;;;;;:::i;:::-;;:::i;4971:584::-;;;;;;:::i;:::-;;:::i;643:601:178:-;;;;;;:::i;:::-;;:::i;1510:123:176:-;;;;;;:::i;:::-;;:::i;2631:336::-;2715:10;3659:42:184;:24;2715:10:176;3659:33:184;:42::i;:::-;3654:91;;3716:28;;;;;;;;;;;-1:-1:-1;;;3716:28:184;;;;3709:36;;-1:-1:-1;;;3709:36:184;;;;3716:28;3709:36;;;:::i;:::-;;;;;;;;3654:91;2743:3:176;3502:34:184::1;:20;2743:3:176::0;3502:29:184::1;:34::i;:::-;3497:84;;3551:29;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3551:29:184::1;::::0;::::1;::::0;3544:37;;-1:-1:-1;;;3544:37:184;;::::1;::::0;3551:29;3544:37:::1;;;:::i;3497:84::-;2761:2:176::2;:21:::0;;;:16:::2;:21;::::0;;;;:28;:33;2754:84:::2;;2804:2;:21:::0;;;:16:::2;:21;::::0;;;;:27;;;::::2;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;-1:-1:-1::0;;2804:27:176;;;;;::::2;;::::0;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;2804:27:176::2;::::0;;;::::2;;::::0;::::2;::::0;::::2;:::i;:::-;;;;;2754:84;;;2851:2;:21:::0;;;:16:::2;:21;::::0;;;;2843:30:::2;::::0;::::2;:::i;:::-;2880:32;:20;2908:3:::0;2880:27:::2;:32::i;:::-;-1:-1:-1::0;2924:38:176::2;::::0;;16860:25:514;;;2950:1:176::2;16916:2:514::0;16901:18;;16894:59;;;16989:3;16969:18;;;16962:31;;;17009:19;;17002:30;2957:4:176::2;17099:2:514::0;17084:18;;17077:50;2924:38:176;;-1:-1:-1;;;;;;;;;;;2924:38:176;;;;17064:3:514;2924:38:176;;::::2;3751:1:184::1;2631:336:176::0;;:::o;3952:747::-;4006:16;4030:20;;4088:29;:20;:27;:29::i;:::-;4061:56;;4128:9;4123:154;4147:16;4143:1;:20;4123:154;;;4178:11;4192:26;:20;4216:1;4192:23;:26::i;:::-;4242:2;:21;;;:16;:21;;;;;:28;4178:40;;-1:-1:-1;4226:44:176;;;;:::i;:::-;;-1:-1:-1;;4165:3:176;;4123:154;;;;4283:25;4325:12;-1:-1:-1;;;;;4311:27:176;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;4311:27:176;;;;;;;;;;;;;;;-1:-1:-1;4283:55:176;-1:-1:-1;4345:14:176;4362:29;:20;:27;:29::i;:::-;4345:46;;4397:9;4421;4416:257;4440:6;4436:1;:10;4416:257;;;4461:11;4475:26;:20;4499:1;4475:23;:26::i;:::-;4509:28;4540:21;;;:16;:21;;;;;;;;4509:52;;;;;;;;;;;;;;;;;4461:40;;-1:-1:-1;4509:28:176;;:52;;4540:21;4509:28;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4509:52:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4574:9;4569:98;4593:11;:18;4589:1;:22;4569:98;;;4644:11;4656:1;4644:14;;;;;;;;:::i;:::-;;;;;;;4628:8;4637:3;;;;;:::i;:::-;;;4628:13;;;;;;;;:::i;:::-;;;;;;;;;;:30;4613:3;;4569:98;;;;4453:220;;4448:3;;;;;4416:257;;;-1:-1:-1;4686:8:176;;3952:747;-1:-1:-1;;;;;3952:747:176:o;1848:196:182:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1934:29:182;;1954:8;1934:19;:29::i;:::-;1929:73;;1972:29;;;;;;;;;;;-1:-1:-1;;;1972:29:182;;;;1965:37;;-1:-1:-1;;;1965:37:182;;;;1972:29;1965:37;;;:::i;1929:73::-;2016:2;:23;;;:13;:23;;;;;;;;;2009:30;;;;;;;;;;;;;;;-1:-1:-1;;;;;2009:30:182;;;;;;;-1:-1:-1;;;2009:30:182;;;;;;;;-1:-1:-1;;;2009:30:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2016:23;;2009:30;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2009:30:182;;;;;;;;;;;;;;;;;;;;;;;;;;;1848:196;;;:::o;1137:99:180:-;300:8:96;:6;:8::i;:::-;-1:-1:-1;;;;;286:22:96;:10;-1:-1:-1;;;;;286:22:96;;282:79;;325:29;;-1:-1:-1;;;325:29:96;;343:10;325:29;;;18203:51:514;18176:18;;325:29:96;18057:203:514;282:79:96;1205:26:180::1;1222:8;1205:16;:26::i;:::-;1137:99:::0;:::o;1024:221:176:-;303:66:85;1263:42:84;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:84;;;;;;;;;;;1258:100;1132:9:176::1;1127:114;1147:25:::0;;::::1;1127:114;;;1187:47;1216:14;;1231:1;1216:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;1187:28;:47::i;:::-;1174:3;;1127:114;;;;1024:221:::0;;:::o;6663:855:182:-;6741:21;6827:29;6873:19;6827:29;6873:17;:19::i;:::-;-1:-1:-1;;;;;6859:34:182;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6859:34:182;-1:-1:-1;6827:66:182;-1:-1:-1;6899:18:182;;6923:326;6947:19;:2;:17;:19::i;:::-;6943:1;:23;6923:326;;;6981:10;6994:16;6981:10;7008:1;6994:13;:16::i;:::-;7018:21;7042:17;;;:13;:17;;;;;6981:29;;-1:-1:-1;7067:176:182;7091:12;;;:19;7087:23;;7067:176;;;7150:11;-1:-1:-1;;;;;7131:30:182;:6;:12;;7144:1;7131:15;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;7131:15:182;:30;7127:108;;7205:2;7175:12;7188:13;;;;:::i;:::-;;;7175:27;;;;;;;;;;:::i;:::-;;;;;;:32;;;;;7219:5;;7127:108;7112:3;;7067:176;;;;6973:276;;6968:3;;;;;6923:326;;;;7255:29;7306:11;7287:31;;-1:-1:-1;;;;;7287:31:182;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;7255:63;;7329:9;7324:169;7348:11;7344:15;;:1;:15;7324:169;;;7387:99;;;;;;;;7414:12;7427:1;7414:15;;;;;;;;:::i;:::-;;;;;;;7387:99;;;;7447:2;:13;;:30;7461:12;7474:1;7461:15;;;;;;;;:::i;:::-;;;;;;;;;;;;7447:30;;;;;;;;;;;;;-1:-1:-1;7447:30:182;7387:99;;;;;;;;;;;;;;;-1:-1:-1;;;;;7387:99:182;;;;;;;-1:-1:-1;;;7387:99:182;;;;;;;;-1:-1:-1;;;7387:99:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7447:30;;7387:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7387:99:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;7374:7;7382:1;7374:10;;;;;;;;:::i;:::-;;;;;;;;;;:112;7361:3;;7324:169;;;-1:-1:-1;7506:7:182;6663:855;-1:-1:-1;;;;6663:855:182:o;2849:91:178:-;2896:7;2918:17;:8;:15;:17::i;:::-;2911:24;;2849:91;:::o;5767:344:182:-;5815:21;5844:29;5895:19;5844:29;5895:17;:19::i;:::-;-1:-1:-1;;;;;5876:39:182;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;5844:71;;5927:9;5922:164;5946:19;:2;:17;:19::i;:::-;5942:1;:23;5922:164;;;5980:10;5993:16;5980:10;6007:1;5993:13;:16::i;:::-;6030:49;;;;;;;;;;;-1:-1:-1;6060:17:182;;;:13;6030:49;6060:17;;;;;;;6030:49;;;;;;;;;;;;;;;-1:-1:-1;;;;;6030:49:182;;;;;;;-1:-1:-1;;;6030:49:182;;;;;;;;-1:-1:-1;;;6030:49:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;5980:29;;-1:-1:-1;6030:49:182;;;;;;;;6060:17;;6030:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6030:49:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;6017:7;6025:1;6017:10;;;;;;;;:::i;:::-;;;;;;;;;;:62;-1:-1:-1;5967:3:182;;5922:164;;;-1:-1:-1;6099:7:182;5767:344;-1:-1:-1;5767:344:182:o;2409:350::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2537:29:182;-1:-1:-1;2557:8:182;2537:19;:29::i;:::-;2532:73;;2575:29;;;;;;;;;;;-1:-1:-1;;;2575:29:182;;;;2568:37;;-1:-1:-1;;;2568:37:182;;;;2575:29;2568:37;;;:::i;2532:73::-;2627:2;:23;;;:13;:23;;;;;;;;2658:33;:43;;;;;;2709:29;:39;;;;;;2612:142;;;;;;;;;;;;;;;-1:-1:-1;;;;;2612:142:182;;;;;;;-1:-1:-1;;;2612:142:182;;;;;;;;-1:-1:-1;;;2612:142:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;2627:23;;2658:43;2709:39;;2612:142;;2627:23;;2612:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2612:142:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2409:350;;;;;:::o;1728:394:178:-;-1:-1:-1;;;;;2899:22:184;;;2945:1;2899:22;;;:16;:22;;;;;:34;;;1832:11:178;;2899:34:184;2895:102;;2962:34;;;;;;;;;;;-1:-1:-1;;;2962:34:184;;;;2955:42;;-1:-1:-1;;;2955:42:184;;;;2962:34;2955:42;;;:::i;2895:102::-;1862:10:178::1;3064:31:184;:12;1862:10:178::0;3064:21:184::1;:31::i;:::-;3059:74;;3104:28;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3104:28:184::1;::::0;::::1;::::0;3097:36;;-1:-1:-1;;;3097:36:184;;::::1;::::0;3104:28;3097:36:::1;;;:::i;3059:74::-;-1:-1:-1::0;;;;;3350:22:184;;::::2;:2;:22:::0;;;:16:::2;:22;::::0;;;;:31:::2;;::::0;1895:11:178;;1908:10:::2;::::0;3350:31:184::2;:43:::0;::::2;3346:91;;3408:28;::::0;;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;3408:28:184::2;::::0;::::2;::::0;3401:36;;-1:-1:-1;;;3401:36:184;;::::2;::::0;3408:28;3401:36:::2;;;:::i;3346:91::-;-1:-1:-1::0;;;;;1948:29:178;::::3;1928:17;1948:29:::0;;;:16:::3;:29;::::0;;;;2016:11;;1984:52:::3;::::0;2016:11:::3;;2029:6:::0;1984:31:::3;:52::i;:::-;2043:20:::0;;2057:6;;2043:4;;-1:-1:-1;;2043:20:178::3;::::0;2057:6;2043:20:::3;::::0;::::3;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;2092:16:178::3;::::0;::::3;::::0;2074:43:::3;::::0;-1:-1:-1;;;;;2092:16:178;;::::3;::::0;2074:43:::3;::::0;::::3;::::0;2110:6;;2074:43:::3;:::i;:::-;;;;;;;;1922:200;3139:1:184::2;;3003::::1;1728:394:178::0;;;:::o;2048:296:182:-;2116:19;;:::i;:::-;2152;:2;:17;:19::i;:::-;2147:1;:24;2143:82;;2188:29;;;;;;;;;;;-1:-1:-1;;;2188:29:182;;;;2181:37;;-1:-1:-1;;;2181:37:182;;;;2188:29;2181:37;;;:::i;2143:82::-;2230:16;2249;2230;2263:1;2249:13;:16::i;:::-;2278:61;;;;;;;;;;;-1:-1:-1;2314:23:182;;;:13;2278:61;2314:23;;;;;;;2278:61;;;;;;;;;;;;;;;-1:-1:-1;;;;;2278:61:182;;;;;;;-1:-1:-1;;;2278:61:182;;;;;;;;-1:-1:-1;;;2278:61:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;2230:35;;-1:-1:-1;2278:61:182;;;;;;;;2314:23;;2278:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2278:61:182;;;;;;;;;;;;;;;;-1:-1:-1;;;2278:61:182;;;;-1:-1:-1;;;2278:61:182;;2271:68;2048:296;-1:-1:-1;;;2048:296:182:o;762:1082::-;927:10;2945:1:184;2899:22;;;:16;:22;;;;;:34;;;-1:-1:-1;;;;;2899:34:184;2895:102;;2962:34;;;;;;;;;;;-1:-1:-1;;;2962:34:184;;;;2955:42;;-1:-1:-1;;;2955:42:184;;;;2962:34;2955:42;;;:::i;2895:102::-;1012:29:182::1;:2;1032:8:::0;1012:19:::1;:29::i;:::-;1008:83;;;1056:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1056:34:182::1;::::0;::::1;::::0;1049:42;;-1:-1:-1;;;1049:42:182;;::::1;::::0;1056:34;1049:42:::1;;;:::i;1008:83::-;1172:9;1167:142;1191:5;:12;1187:1;:16;1167:142;;;1223:27;1241:5;1247:1;1241:8;;;;;;;;:::i;:::-;;;;;;;1223:2;:8;;:17;;:27;;;;:::i;:::-;1218:84;;1267:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1267:34:182::1;::::0;::::1;::::0;1260:42;;-1:-1:-1;;;1260:42:182;;::::1;::::0;1267:34;1260:42:::1;;;:::i;1218:84::-;1205:3;;1167:142;;;-1:-1:-1::0;1376:144:182::1;::::0;;::::1;::::0;::::1;::::0;;;;;1353:20:::1;1376:144;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;1527:24:::1;::::0;1542:8;1527:14:::1;:24::i;:::-;-1:-1:-1::0;1557:2:182::1;:23:::0;;;:13:::1;:23;::::0;;;;;;;;:32;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;1557:32:182;;::::1;-1:-1:-1::0;;;1557:32:182::1;-1:-1:-1::0;;;;1557:32:182;;::::1;-1:-1:-1::0;;;1557:32:182::1;-1:-1:-1::0;;1557:32:182;;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;1583:6;;1557:23;:32:::1;::::0;;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;1595:2:182::1;:39:::0;;;:29:::1;:39;::::0;;;;:58:::1;1637:16:::0;1595:39;:58:::1;:::i;:::-;-1:-1:-1::0;1659:2:182::1;:43:::0;;;:33:::1;:43;::::0;;;;;;:66;;;1737:102;::::1;::::0;::::1;::::0;1693:8;;1776:5;;1705:20;;1817:16;;1737:102:::1;:::i;:::-;;;;;;;;939:905;762:1082:::0;;;;;:::o;1240:116:180:-;1301:4;1320:31;:12;1342:8;1320:21;:31::i;:::-;1313:38;1240:116;-1:-1:-1;;1240:116:180:o;2126:453:178:-;2231:10;3064:31:184;:12;2231:10:178;3064:21:184;:31::i;:::-;3059:74;;3104:28;;;;;;;;;;;-1:-1:-1;;;3104:28:184;;;;3097:36;;-1:-1:-1;;;3097:36:184;;;;3104:28;3097:36;;;:::i;3059:74::-;-1:-1:-1;;;;;2899:22:184;;::::1;2945:1;2899:22:::0;;;:16:::1;:22;::::0;;;;:34:::1;;::::0;2256:11:178;;2899:34:184::1;2895:102;;2962:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;2962:34:184::1;::::0;::::1;::::0;2955:42;;-1:-1:-1;;;2955:42:184;;::::1;::::0;2962:34;2955:42:::1;;;:::i;2895:102::-;-1:-1:-1::0;;;;;3350:22:184;;::::2;:2;:22:::0;;;:16:::2;:22;::::0;;;;:31:::2;;::::0;2290:11:178;;2303:10:::2;::::0;3350:31:184::2;:43:::0;::::2;3346:91;;3408:28;::::0;;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;3408:28:184::2;::::0;::::2;::::0;3401:36;;-1:-1:-1;;;3401:36:184;;::::2;::::0;3408:28;3401:36:::2;;;:::i;3346:91::-;-1:-1:-1::0;;;;;2343:29:178;::::3;2323:17;2343:29:::0;;;:16:::3;:29;::::0;;;;;;;;2441:21;;::::3;::::0;2458:3;;2441:21:::3;;:::i;:::-;;;;;;;;;;;;;2431:32;;;;;;2417:4;:8;;2400:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;2390:37;;;;;;:73:::0;2379:126:::3;;2477:27;::::0;;;;::::3;::::0;;::::3;::::0;;-1:-1:-1;;;2477:27:178::3;::::0;::::3;::::0;2470:35;;-1:-1:-1;;;2470:35:178;;::::3;::::0;2477:27;2470:35:::3;;;:::i;2379:126::-;2512:8;::::0;::::3;:14;2523:3:::0;2512:8;:14:::3;:::i;:::-;-1:-1:-1::0;2552:16:178::3;::::0;::::3;::::0;2537:37:::3;::::0;-1:-1:-1;;;;;2552:16:178;;::::3;::::0;2537:37:::3;::::0;::::3;::::0;2570:3;;2537:37:::3;:::i;5383:290:176:-:0;300:8:96;:6;:8::i;:::-;-1:-1:-1;;;;;286:22:96;:10;-1:-1:-1;;;;;286:22:96;;282:79;;325:29;;-1:-1:-1;;;325:29:96;;343:10;325:29;;;18203:51:514;18176:18;;325:29:96;18057:203:514;282:79:96;-1:-1:-1;;;;;5465:21:176;::::1;5461:62;;5495:27;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;5495:27:176::1;::::0;::::1;::::0;5488:35;;-1:-1:-1;;;5488:35:176;;::::1;::::0;5495:27;5488:35:::1;;;:::i;5461:62::-;5535:40;:24;5567:7:::0;5535:31:::1;:40::i;:::-;5530:90;;5590:29;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;5590:29:176::1;::::0;::::1;::::0;5583:37;;-1:-1:-1;;;5583:37:176;;::::1;::::0;5590:29;5583:37:::1;;;:::i;5530:90::-;5632:36;::::0;-1:-1:-1;;;;;5632:36:176;::::1;::::0;::::1;::::0;;;::::1;5383:290:::0;:::o;5658:105:182:-;5708:16;5739:19;:2;:17;:19::i;3724:148:176:-;3815:16;3801:3;3502:34:184;:20;3801:3:176;3502:29:184;:34::i;:::-;3497:84;;3551:29;;;;;;;;;;;-1:-1:-1;;;3551:29:184;;;;3544:37;;-1:-1:-1;;;3544:37:184;;;;3551:29;3544:37;;;:::i;3497:84::-;3846:2:176::1;:21:::0;;;:16:::1;:21;::::0;;;;;;;3839:28;;;;;;::::1;::::0;;;;;;;;;;;;3846:21;;3839:28;::::1;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;3839:28:176::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;3724:148:::0;;;;:::o;2583:262:178:-;2644:11;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2644:11:178;2717:30;:8;2735:11;2717:17;:30::i;:::-;2712:85;;2762:34;;;;;;;;;;;-1:-1:-1;;;2762:34:178;;;;2755:42;;-1:-1:-1;;;2755:42:178;;;;2762:34;2755:42;;;:::i;2712:85::-;-1:-1:-1;;;;;2811:29:178;;:2;:29;;;:16;:29;;;;;;;2804:36;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2804:36:178;;;-1:-1:-1;;2804:36:178;;;;-1:-1:-1;;;;;2804:36:178;;;;;;;;;;;;;;;;;;;;;2583:262;-1:-1:-1;;2583:262:178:o;4463:504:182:-;4561:8;3198:29:184;:2;4561:8:182;3198:19:184;:29::i;:::-;3193:73;;3236:29;;;;;;;;;;;-1:-1:-1;;;3236:29:184;;;;3229:37;;-1:-1:-1;;;3229:37:184;;;;3236:29;3229:37;;;:::i;3193:73::-;-1:-1:-1;;;;;2899:22:184;;::::1;2945:1;2899:22:::0;;;:16:::1;:22;::::0;;;;:34:::1;;::::0;4580:11:182;;2899:34:184::1;2895:102;;2962:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;2962:34:184::1;::::0;::::1;::::0;2955:42;;-1:-1:-1;;;2955:42:184;;::::1;::::0;2962:34;2955:42:::1;;;:::i;2895:102::-;4599:21:182::2;4623:23:::0;;;:13:::2;:23;::::0;;;;;4712:151:::2;4736:12;::::0;::::2;:19:::0;4732:23;::::2;4712:151;;;4793:11;-1:-1:-1::0;;;;;4774:30:182::2;:6;:12;;4787:1;4774:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;4774:15:182::2;:30:::0;4770:86:::2;;4821:34;::::0;;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;4821:34:182::2;::::0;::::2;::::0;4814:42;;-1:-1:-1;;;4814:42:182;;::::2;::::0;4821:34;4814:42:::2;;;:::i;4770:86::-;4757:3;;4712:151;;;-1:-1:-1::0;4869:12:182::2;::::0;::::2;:30:::0;;::::2;::::0;;::::2;::::0;;-1:-1:-1;4869:30:182;;;::::2;::::0;;;;;;::::2;::::0;;-1:-1:-1;;;;;;4869:30:182::2;-1:-1:-1::0;;;;;4869:30:182;::::2;::::0;;::::2;::::0;;;4911:51:::2;::::0;;24132:25:514;;;24173:18;;;24166:60;;;;24242:18;;24235:50;4911:51:182::2;::::0;24120:2:514;24105:18;4911:51:182::2;;;;;;;4593:374;3272:1:184::1;4463:504:182::0;;;:::o;1712:826:176:-;1843:10;3659:42:184;:24;1843:10:176;3659:33:184;:42::i;:::-;3654:91;;3716:28;;;;;;;;;;;-1:-1:-1;;;3716:28:184;;;;3709:36;;-1:-1:-1;;;3709:36:184;;;;3716:28;3709:36;;;:::i;3654:91::-;1881:1:176::1;1865:17:::0;;;1861:58:::1;;1891:27;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1891:27:176::1;::::0;::::1;::::0;1884:35;;-1:-1:-1;;;1884:35:176;;::::1;::::0;1891:27;1884:35:::1;;;:::i;1861:58::-;1931:34;:20;1961:3:::0;1931:29:::1;:34::i;:::-;1926:85;;1975:29;:20;2000:3:::0;1975:24:::1;:29::i;:::-;;1926:85;2085:24;2112:21:::0;;;:16:::1;:21;::::0;;;;:28;;2146:258:::1;2170:16;2166:1;:20;2146:258;;;2205:2;:21:::0;;;:16:::1;:21;::::0;;;;:24;;-1:-1:-1;;;;;2205:51:176;::::1;::::0;:21;2227:1;;2205:24;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:36:::1;:24;::::0;;::::1;;:36;::::0;-1:-1:-1;;;;;2205:36:176::1;:51:::0;2201:197:::1;;2268:2;:21:::0;;;:16:::1;:21;::::0;;;;:24;;2301:5;;;;2290:1;;2268:24;::::1;;;;;:::i;:::-;;;;;;;;;;;:30;;:38;;;;;;;:::i;:::-;;-1:-1:-1::0;;;;;;;;;;;2342:3:176::1;2347:11;2360:5;;2367;2321:52;;;;;;;;;;:::i;:::-;;;;;;;;2383:7;;;;2201:197;2188:3;;2146:258;;;;2410:2;:16;;:21;2427:3;2410:21;;;;;;;;;;;2437:32;;;;;;;;2445:3;2437:32;;;;2450:11;-1:-1:-1::0;;;;;2437:32:176::1;;;;;2463:5;;2437:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;2437:32:176;;;;-1:-1:-1;;2410:60:176;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;2410:60:176::1;-1:-1:-1::0;;;;;2410:60:176;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;2410:60:176::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;;;;-1:-1:-1::0;;;;;;;;;;;2502:3:176::1;2507:11;2520:5;;2527;2481:52;;;;;;;;;;:::i;3751:1:184:-;1712:826:176::0;;;;;:::o;3055:254:178:-;3101:13;3122:19;3155:17;:8;:15;:17::i;:::-;-1:-1:-1;;;;;3144:29:178;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3144:29:178;;;;;;;;;;;;;;;;;3122:51;;3185:9;3180:106;3204:17;:8;:15;:17::i;:::-;3200:1;:21;3180:106;;;3247:16;:2;3264:14;:8;3276:1;3264:11;:14::i;:::-;-1:-1:-1;;;;;3247:32:178;;;;;;;;;;;;;;-1:-1:-1;3247:32:178;3236:43;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3236:43:178;;;-1:-1:-1;;3236:43:178;;;;-1:-1:-1;;;;;3236:43:178;;;;;;;;;;;;;;;;;;;;:8;;:5;;3242:1;;3236:8;;;;;;:::i;:::-;;;;;;;;;;:43;3223:3;;3180:106;;1360:466:180;300:8:96;:6;:8::i;:::-;-1:-1:-1;;;;;286:22:96;:10;-1:-1:-1;;;;;286:22:96;;282:79;;325:29;;-1:-1:-1;;;325:29:96;;343:10;325:29;;;18203:51:514;18176:18;;325:29:96;18057:203:514;282:79:96;1432:31:180::1;:12;1454:8:::0;1432:21:::1;:31::i;:::-;1427:90;;1478:38;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1478:38:180::1;::::0;::::1;::::0;1471:46;;-1:-1:-1;;;1471:46:180;;::::1;::::0;1478:38;1471:46:::1;;;:::i;1427:90::-;1583:9;1578:171;1602:17;:8;:15;:17::i;:::-;1598:1;:21;1578:171;;;-1:-1:-1::0;;;;;1638:53:180;::::1;:16;:2;1655:14;:8;1667:1:::0;1655:11:::1;:14::i;:::-;-1:-1:-1::0;;;;;1638:32:180;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;1638:32:180;:41:::1;;::::0;::::1;:53:::0;1634:108:::1;;1708:33;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1708:33:180::1;::::0;::::1;::::0;1701:41;;-1:-1:-1;;;1701:41:180;;::::1;::::0;1708:33;1701:41:::1;;;:::i;1634:108::-;1621:3;;1578:171;;;-1:-1:-1::0;1755:29:180::1;:12;1775:8:::0;1755:19:::1;:29::i;:::-;-1:-1:-1::0;1796:25:180::1;::::0;-1:-1:-1;;;;;1796:25:180;::::1;::::0;::::1;::::0;;;::::1;1360:466:::0;:::o;1248:476:178:-;-1:-1:-1;;;;;3350:22:184;;;:2;:22;;;:16;:22;;;;;:31;;;1323:11:178;;1336:10;;3350:31:184;:43;;3346:91;;3408:28;;;;;;;;;;;-1:-1:-1;;;3408:28:184;;;;3401:36;;-1:-1:-1;;;3401:36:184;;;;3408:28;3401:36;;;:::i;3346:91::-;-1:-1:-1;;;;;1358:29:178;;::::1;1411:1;1358:29:::0;;;:16:::1;:29;::::0;;;;:41:::1;;::::0;::::1;1354:118;;1430:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1430:34:178::1;::::0;::::1;::::0;1423:42;;-1:-1:-1;;;1423:42:178;;::::1;::::0;1430:34;1423:42:::1;;;:::i;1354:118::-;1522:18;-1:-1:-1::0;;;;;1482:29:178;::::1;:2;:29:::0;;;:16:::1;:29;::::0;;;;:36;::::1;;:58;::::0;::::1;;;;;;:::i;:::-;;1478:129;;1557:42;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1557:42:178::1;::::0;::::1;::::0;1550:50;;-1:-1:-1;;;1550:50:178;;::::1;::::0;1557:42;1550:50:::1;;;:::i;1478:129::-;1613:28;:8;1629:11:::0;1613:15:::1;:28::i;:::-;-1:-1:-1::0;;;;;;1654:29:178;::::1;:2;:29:::0;;;:16:::1;:29;::::0;;;;1647:36;;-1:-1:-1;;1647:36:178::1;::::0;;1654:29;1647:36:::1;::::0;;::::1;1654:2:::0;1647:36:::1;:::i;:::-;-1:-1:-1::0;1647:36:178::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;1647:36:178;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;1695:24:::1;::::0;-1:-1:-1;;;;;1695:24:178;::::1;::::0;::::1;::::0;1647:36:::1;::::0;1695:24:::1;1248:476:::0;;;:::o;3065:587:176:-;3180:10;3659:42:184;:24;3180:10:176;3659:33:184;:42::i;:::-;3654:91;;3716:28;;;;;;;;;;;-1:-1:-1;;;3716:28:184;;;;3709:36;;-1:-1:-1;;;3709:36:184;;;;3716:28;3709:36;;;:::i;3654:91::-;3198:10:176::1;3227:9:::0;3222:310:::1;3246:2;:21:::0;;;:16:::1;:21;::::0;;;;:28;3242:32;::::1;3222:310;;;3293:2;:21:::0;;;:16:::1;:21;::::0;;;;:24;;-1:-1:-1;;;;;3293:51:176;::::1;::::0;:21;3315:1;;3293:24;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:36:::1;:24;::::0;;::::1;;:36;::::0;-1:-1:-1;;;;;3293:36:176::1;:51:::0;3289:237:::1;;3383:2;:21:::0;;;:16:::1;:21;::::0;;;;3416:28;;:32:::1;::::0;3447:1:::1;::::0;3416:32:::1;:::i;:::-;3383:75;;;;;;;;:::i;:::-;;;;;;;;;;;3356:2;:16;;:21;3373:3;3356:21;;;;;;;;;;;3378:1;3356:24;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:102;;:24:::1;::::0;;::::1;;:102:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;3356:102:176::1;-1:-1:-1::0;;;;;3356:102:176;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;3468:2:176::1;:21:::0;;;:16:::1;:21;::::0;;;;:27;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;3468:27:176;;;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;3468:27:176::1;::::0;;;::::1;;::::0;::::1;::::0;::::1;:::i;:::-;;;;;3513:4;3505:12;;3289:237;3276:3;;3222:310;;;;3543:5;3538:49;;3557:29;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3557:29:176::1;::::0;::::1;::::0;3550:37;;-1:-1:-1;;;3550:37:176;;::::1;::::0;3557:29;3550:37:::1;;;:::i;3538:49::-;3599:48;::::0;;16860:25:514;;;-1:-1:-1;;;;;16921:31:514;;16916:2;16901:18;;16894:59;16989:3;16969:18;;;16962:31;;;-1:-1:-1;17009:19:514;;;17002:30;3642:4:176::1;17099:2:514::0;17084:18;;17077:50;3599:48:176;;-1:-1:-1;;;;;;;;;;;3599:48:176;;;;17064:3:514;3599:48:176;;::::1;3192:460;3065:587:::0;;;:::o;738:220:180:-;303:66:85;1263:42:84;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:84;;;;;;;;;;;1258:100;853:9:180::1;848:106;868:27:::0;;::::1;848:106;;;910:37;927:16;;944:1;927:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;910:16;:37::i;:::-;897:3;;848:106;;5559:95:182::0;5608:7;5630:19;5608:7;5630:17;:19::i;5190:121:176:-;300:8:96;:6;:8::i;:::-;-1:-1:-1;;;;;286:22:96;:10;-1:-1:-1;;;;;286:22:96;;282:79;;325:29;;-1:-1:-1;;;325:29:96;;343:10;325:29;;;18203:51:514;18176:18;;325:29:96;18057:203:514;282:79:96;5269:37:176::1;5298:7;5269:28;:37::i;2944:107:178:-:0;2998:16;3029:17;:8;:15;:17::i;6115:544:182:-;6208:21;6231:4;6259;6251:5;:12;6265:27;;;;;;;;;;;;;-1:-1:-1;;;6265:27:182;;;6243:50;;;;;-1:-1:-1;;;6243:50:182;;;;;;;;:::i;:::-;-1:-1:-1;6300:29:182;6351:12;6358:5;6351:4;:12;:::i;:::-;-1:-1:-1;;;;;6332:32:182;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;6300:64;;6383:9;6371:232;6419:19;:2;:17;:19::i;:::-;6406:9;6414:1;6406:5;:9;:::i;:::-;6405:33;6404:59;;;;-1:-1:-1;6458:4:182;6445:9;6453:1;6445:5;:9;:::i;:::-;6444:18;6404:59;6371:232;;;6489:10;6502:24;6516:9;6524:1;6516:5;:9;:::i;:::-;6502:2;;:13;:24::i;:::-;6547:49;;;;;;;;;;;-1:-1:-1;6577:17:182;;;:13;6547:49;6577:17;;;;;;;6547:49;;;;;;;;;;;;;;;-1:-1:-1;;;;;6547:49:182;;;;;;;-1:-1:-1;;;6547:49:182;;;;;;;;-1:-1:-1;;;6547:49:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;6489:37;;-1:-1:-1;6547:49:182;;;;;;;;6577:17;;6547:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6547:49:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;6534:7;6542:1;6534:10;;;;;;;;:::i;:::-;;;;;;:62;;;;6481:122;6471:3;;;;:::i;:::-;;;6371:232;;;-1:-1:-1;6617:7:182;6634:19;:2;:17;:19::i;:::-;6609:45;;6626:27;;;;-1:-1:-1;;;;6115:544:182:o;4975:146:176:-;5055:4;5074:42;:24;5108:7;5074:33;:42::i;2763:1696:182:-;2953:10;2945:1:184;2899:22;;;:16;:22;;;;;:34;;;-1:-1:-1;;;;;2899:34:184;2895:102;;2962:34;;;;;;;;;;;-1:-1:-1;;;2962:34:184;;;;2955:42;;-1:-1:-1;;;2955:42:184;;;;2962:34;2955:42;;;:::i;2895:102::-;3029:29:182::1;:2;3049:8:::0;3029:19:::1;:29::i;:::-;3024:88;;3075:29;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3075:29:182::1;::::0;::::1;::::0;3068:37;;-1:-1:-1;;;3068:37:182;;::::1;::::0;3075:29;3068:37:::1;;;:::i;3024:88::-;3118:21;3142:23:::0;;;:13:::1;:23;::::0;;;;3957:44;;;4007:23:::1;::::0;::::1;:42:::0;;-1:-1:-1;;4007:42:182::1;-1:-1:-1::0;;;;;4007:42:182;::::1;;::::0;;4096:63;::::1;;;585:1;4118:12:::0;;::::1;:34:::0;;-1:-1:-1;;;;4118:34:182;::::1;-1:-1:-1::0;;;4118:34:182;;;::::1;-1:-1:-1::0;;;;;4118:34:182::1;::::0;;::::1;;::::0;;;::::1;::::0;;4096:63:::1;4246:16;-1:-1:-1::0;;;;;4246:21:182::1;4266:1;4246:21:::0;4242:88:::1;;4284:2;:39:::0;;;:29:::1;:39;::::0;;;;4277:46:::1;::::0;::::1;:::i;:::-;4341:113;::::0;;28471:25:514;;;28527:2;28512:18;;28505:34;;;-1:-1:-1;;;;;28575:31:514;;28555:18;;;28548:59;28650:14;;28643:22;28638:2;28623:18;;28616:50;4341:113:182;;::::1;::::0;;;;28458:3:514;4341:113:182;;::::1;2965:1494;2763:1696:::0;;;;;;:::o;4971:584::-;5072:8;3198:29:184;:2;5072:8:182;3198:19:184;:29::i;:::-;3193:73;;3236:29;;;;;;;;;;;-1:-1:-1;;;3236:29:184;;;;3229:37;;-1:-1:-1;;;3229:37:184;;;;3236:29;3229:37;;;:::i;3193:73::-;-1:-1:-1;;;;;2899:22:184;;::::1;2945:1;2899:22:::0;;;:16:::1;:22;::::0;;;;:34:::1;;::::0;5091:11:182;;2899:34:184::1;2895:102;;2962:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;2962:34:184::1;::::0;::::1;::::0;2955:42;;-1:-1:-1;;;2955:42:184;;::::1;::::0;2962:34;2955:42:::1;;;:::i;2895:102::-;5110:21:182::2;5134:23:::0;;;:13:::2;:23;::::0;;;;;5110:21;5188:239:::2;5212:12;::::0;::::2;:19:::0;5208:23;::::2;5188:239;;;5269:11;-1:-1:-1::0;;;;;5250:30:182::2;:6;:12;;5263:1;5250:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;5250:15:182::2;:30:::0;5246:175:::2;;5310:12;::::0;::::2;5323:19:::0;;:23:::2;::::0;5345:1:::2;::::0;5323:23:::2;:::i;:::-;5310:37;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;5292:12:::2;::::0;::::2;:15:::0;;-1:-1:-1;;;;;5310:37:182;;::::2;::::0;5305:1;;5292:15;::::2;;;;;:::i;:::-;;;;;;;;;:55;;;;;-1:-1:-1::0;;;;;5292:55:182::2;;;;;-1:-1:-1::0;;;;;5292:55:182::2;;;;;;5357:6;:12;;:18;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;-1:-1:-1;;5357:18:182;;;;;-1:-1:-1;;;;;;5357:18:182::2;::::0;;;;;::::2;::::0;-1:-1:-1;5407:5:182::2;;5246:175;5233:3;;5188:239;;;;5437:5;5432:54;;5451:34;::::0;;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;5451:34:182::2;::::0;::::2;::::0;5444:42;;-1:-1:-1;;;5444:42:182;;::::2;::::0;5451:34;5444:42:::2;;;:::i;5432:54::-;5498:52;::::0;;24132:25:514;;;-1:-1:-1;;;;;24193:32:514;;24188:2;24173:18;;24166:60;5544:5:182::2;24242:18:514::0;;;24235:50;;;;5498:52:182::2;::::0;24120:2:514;24105:18;5498:52:182::2;23936:355:514::0;643:601:178;762:10;3064:31:184;:12;762:10:178;3064:21:184;:31::i;:::-;3059:74;;3104:28;;;;;;;;;;;-1:-1:-1;;;3104:28:184;;;;3097:36;;-1:-1:-1;;;3097:36:184;;;;3104:28;3097:36;;;:::i;3059:74::-;-1:-1:-1;;;;;845:29:178;;::::1;898:1;845:29:::0;;;:16:::1;:29;::::0;;;;:41:::1;;::::0;::::1;:55:::0;841:109:::1;;915:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;915:34:178::1;::::0;::::1;::::0;908:42;;-1:-1:-1;;;908:42:178;;::::1;::::0;915:34;908:42:::1;;;:::i;841:109::-;957:19;979:110;;;;;;;;1048:6;979:110;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;979:110:178;::::1;::::0;;;;1072:10:::1;979:110:::0;;;;;957:132;-1:-1:-1;1096:25:178::1;:8;1005:11:::0;1096:12:::1;:25::i;:::-;-1:-1:-1::0;;;;;;1153:29:178;::::1;:2;:29:::0;;;:16:::1;:29;::::0;;;;:39;;;;1185:7;;1153:29;:39;:29;;-1:-1:-1;;1153:39:178::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;1153:39:178::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;1153:39:178::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;1153:39:178;;::::1;-1:-1:-1::0;;;;;1153:39:178;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;1204:35;;;;::::1;::::0;::::1;::::0;::::1;::::0;1227:3;;1232:6;;1204:35:::1;:::i;:::-;;;;;;;;774:470;643:601:::0;;;;:::o;1510:123:176:-;1575:4;1594:34;:20;1624:3;1594:29;:34::i;8871:165:447:-;-1:-1:-1;;;;;9004:23:447;;8951:4;4360:21;;;:14;;;:21;;;;;;:26;;8974:55;8967:62;8871:165;-1:-1:-1;;;8871:165:447:o;6431:138::-;6511:4;4360:21;;;:14;;;:21;;;;;;:26;;6534:28;4264:129;6221;6294:4;6317:26;6325:3;6337:5;6317:7;:26::i;6650:115::-;6713:7;6739:19;6747:3;4556:18;;4474:107;7107:129;7181:7;7207:22;7211:3;7223:5;7207:3;:22::i;376:103:96:-;291:66:98;445:29:96;-1:-1:-1;;;;;445:29:96;;376:103::o;2005:320:180:-;-1:-1:-1;;;;;2101:22:180;;2097:63;;2132:27;;;;;;;;;;;-1:-1:-1;;;2132:27:180;;;;2125:35;;-1:-1:-1;;;2125:35:180;;;;2132:27;2125:35;;;:::i;2097:63::-;2171:31;:12;2193:8;2171:21;:31::i;:::-;2167:85;;;2217:34;;;;;;;;;;;-1:-1:-1;;;2217:34:180;;;;2210:42;;-1:-1:-1;;;2210:42:180;;;;2217:34;2210:42;;;:::i;2167:85::-;2259:26;:12;2276:8;2259:16;:26::i;:::-;-1:-1:-1;2297:23:180;;-1:-1:-1;;;;;2297:23:180;;;;;;;;2005:320;:::o;5944:282:176:-;-1:-1:-1;;;;;6018:21:176;;6014:62;;6048:27;;;;;;;;;;;-1:-1:-1;;;6048:27:176;;;;6041:35;;-1:-1:-1;;;6041:35:176;;;;6048:27;6041:35;;;:::i;6014:62::-;6088:37;:24;6117:7;6088:28;:37::i;:::-;6083:92;;6140:34;;;;;;;;;;;-1:-1:-1;;;6140:34:176;;;;6133:42;;-1:-1:-1;;;6133:42:176;;;;6140:34;6133:42;;;:::i;6083:92::-;6187:34;;-1:-1:-1;;;;;6187:34:176;;;;;;;;5944:282;:::o;3313:624:178:-;3437:25;3429:4;:33;;;;;;;;:::i;:::-;;:141;;;-1:-1:-1;3481:21:178;3473:4;:29;;;;;;;;:::i;:::-;;:96;;;;-1:-1:-1;3521:17:178;3515:2;:23;;;;;;;;:::i;:::-;;:53;;;-1:-1:-1;3548:20:178;3542:2;:26;;;;;;;;:::i;:::-;;3515:53;3429:250;;;-1:-1:-1;3589:22:178;3581:4;:30;;;;;;;;:::i;:::-;;:97;;;;-1:-1:-1;3630:17:178;3624:2;:23;;;;;;;;:::i;:::-;;:53;;;-1:-1:-1;3657:20:178;3651:2;:26;;;;;;;;:::i;:::-;;3624:53;3429:355;;;-1:-1:-1;3698:20:178;3690:4;:28;;;;;;;;:::i;:::-;;:93;;;;-1:-1:-1;3737:17:178;3731:2;:23;;;;;;;;:::i;:::-;;:51;;;-1:-1:-1;3764:18:178;3758:2;:24;;;;;;;;:::i;:::-;;3731:51;3429:420;;;-1:-1:-1;3803:17:178;3795:4;:25;;;;;;;;:::i;:::-;;:53;;;;-1:-1:-1;3830:18:178;3824:2;:24;;;;;;;;:::i;:::-;;3795:53;3418:459;;;3313:624;;:::o;3418:459::-;3889:42;;;;;;;;;;;-1:-1:-1;;;3889:42:178;;;;3882:50;;-1:-1:-1;;;3882:50:178;;;;3889:42;3882:50;;;:::i;5930:123:447:-;6000:4;6023:23;6028:3;6040:5;6023:4;:23::i;8634:156::-;8707:4;8730:53;8738:3;-1:-1:-1;;;;;8758:23:447;;8730:7;:53::i;7776:300::-;7839:16;7867:22;7892:19;7900:3;7892:7;:19::i;8316:150::-;8386:4;8409:50;8414:3;-1:-1:-1;;;;;8434:23:447;;8409:4;:50::i;2815:1368::-;2881:4;3010:21;;;:14;;;:21;;;;;;3046:13;;3042:1135;;3413:18;3434:12;3445:1;3434:8;:12;:::i;:::-;3480:18;;3413:33;;-1:-1:-1;3460:17:447;;3480:22;;3501:1;;3480:22;:::i;:::-;3460:42;;3535:9;3521:10;:23;3517:378;;3564:17;3584:3;:11;;3596:9;3584:22;;;;;;;;:::i;:::-;;;;;;;;;3564:42;;3731:9;3705:3;:11;;3717:10;3705:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;3844:25;;;:14;;;:25;;;;;:36;;;3517:378;3973:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4076:3;:14;;:21;4091:5;4076:21;;;;;;;;;;;4069:28;;;4119:4;4112:11;;;;;;;3042:1135;4161:5;4154:12;;;;;4923:118;4990:7;5016:3;:11;;5028:5;5016:18;;;;;;;;:::i;:::-;;;;;;;;;5009:25;;4923:118;;;;:::o;2241:406::-;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:447;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:447;2618:12;;5581:109;5637:16;5672:3;:11;;5665:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5581:109;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;14:180:514;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:514;;14:180;-1:-1:-1;14:180:514:o;199:250::-;284:1;294:113;308:6;305:1;302:13;294:113;;;384:11;;;378:18;365:11;;;358:39;330:2;323:10;294:113;;;-1:-1:-1;;441:1:514;423:16;;416:27;199:250::o;454:270::-;495:3;533:5;527:12;560:6;555:3;548:19;576:76;645:6;638:4;633:3;629:14;622:4;615:5;611:16;576:76;:::i;:::-;706:2;685:15;-1:-1:-1;;681:29:514;672:39;;;;713:4;668:50;;454:270;-1:-1:-1;;454:270:514:o;729:1136::-;923:4;952:2;992;981:9;977:18;1022:2;1011:9;1004:21;1045:6;1080;1074:13;1111:6;1103;1096:22;1137:2;1127:12;;1170:2;1159:9;1155:18;1148:25;;1232:2;1222:6;1219:1;1215:14;1204:9;1200:30;1196:39;1270:2;1262:6;1258:15;1291:1;1301:535;1315:6;1312:1;1309:13;1301:535;;;1380:22;;;-1:-1:-1;;1376:36:514;1364:49;;1436:13;;1504:9;;1489:25;;1561:11;;;1555:18;-1:-1:-1;;;;;1551:43:514;1534:15;;;1527:68;1634:11;;1628:18;1472:4;1666:15;;;1659:27;;;1709:47;1740:15;;;1628:18;1709:47;:::i;:::-;1814:12;;;;1699:57;-1:-1:-1;;;1779:15:514;;;;1337:1;1330:9;1301:535;;;-1:-1:-1;1853:6:514;;729:1136;-1:-1:-1;;;;;;;;729:1136:514:o;1870:948::-;1919:3;1958:4;1953:3;1949:14;1990:5;1984:12;1979:3;1972:25;2016:4;2066;2059:5;2055:16;2049:23;-1:-1:-1;;;;;2159:2:514;2145:12;2141:21;2134:4;2129:3;2125:14;2118:45;2224:2;2216:4;2209:5;2205:16;2199:23;2195:32;2188:4;2183:3;2179:14;2172:56;2289:2;2281:4;2274:5;2270:16;2264:23;2260:32;2253:4;2248:3;2244:14;2237:56;;;2341:4;2334:5;2330:16;2324:23;2379:4;2372;2367:3;2363:14;2356:28;2406:4;2439:14;2433:21;2476:6;2470:4;2463:20;2510:3;2505;2501:13;2492:22;;2557:4;2541:14;2537:25;2523:39;;2580:1;2571:10;;2590:201;2604:6;2601:1;2598:13;2590:201;;;2671:13;;-1:-1:-1;;;;;2667:39:514;2653:54;;2766:15;;;;2703:1;2619:9;;;;;2729:14;;;;2590:201;;;-1:-1:-1;2807:5:514;1870:948;-1:-1:-1;;;;;;1870:948:514:o;2823:257::-;3002:2;2991:9;2984:21;2965:4;3022:52;3070:2;3059:9;3055:18;3047:6;3022:52;:::i;3085:173::-;3153:20;;-1:-1:-1;;;;;3202:31:514;;3192:42;;3182:70;;3248:1;3245;3238:12;3182:70;3085:173;;;:::o;3263:186::-;3322:6;3375:2;3363:9;3354:7;3350:23;3346:32;3343:52;;;3391:1;3388;3381:12;3343:52;3414:29;3433:9;3414:29;:::i;3454:615::-;3540:6;3548;3601:2;3589:9;3580:7;3576:23;3572:32;3569:52;;;3617:1;3614;3607:12;3569:52;3657:9;3644:23;-1:-1:-1;;;;;3727:2:514;3719:6;3716:14;3713:34;;;3743:1;3740;3733:12;3713:34;3781:6;3770:9;3766:22;3756:32;;3826:7;3819:4;3815:2;3811:13;3807:27;3797:55;;3848:1;3845;3838:12;3797:55;3888:2;3875:16;3914:2;3906:6;3903:14;3900:34;;;3930:1;3927;3920:12;3900:34;3983:7;3978:2;3968:6;3965:1;3961:14;3957:2;3953:23;3949:32;3946:45;3943:65;;;4004:1;4001;3994:12;3943:65;4035:2;4027:11;;;;;4057:6;;-1:-1:-1;3454:615:514;;-1:-1:-1;;;;3454:615:514:o;4074:263::-;4165:5;4159:12;4154:3;4147:25;4129:3;4218:4;4211:5;4207:16;4201:23;4256:4;4249;4244:3;4240:14;4233:28;4277:54;4325:4;4320:3;4316:14;4302:12;4277:54;:::i;:::-;4270:61;4074:263;-1:-1:-1;;;;4074:263:514:o;4342:624::-;4407:3;4438;4470:5;4464:12;4497:6;4492:3;4485:19;4523:4;4552;4547:3;4543:14;4536:21;;4610:4;4600:6;4597:1;4593:14;4586:5;4582:26;4578:37;4649:4;4642:5;4638:16;4672:1;4682:258;4696:6;4693:1;4690:13;4682:258;;;4783:2;4779:7;4771:5;4765:4;4761:16;4757:30;4752:3;4745:43;4809:51;4855:4;4846:6;4840:13;4809:51;:::i;:::-;4918:12;;;;4801:59;-1:-1:-1;4883:15:514;;;;4718:1;4711:9;4682:258;;;-1:-1:-1;4956:4:514;;4342:624;-1:-1:-1;;;;;;;4342:624:514:o;4971:335::-;5212:2;5201:9;5194:21;5175:4;5232:68;5296:2;5285:9;5281:18;5273:6;5232:68;:::i;5493:488::-;5746:2;5735:9;5728:21;5709:4;5772:52;5820:2;5809:9;5805:18;5797:6;5772:52;:::i;:::-;5860:6;5855:2;5844:9;5840:18;5833:34;5915:9;5907:6;5903:22;5898:2;5887:9;5883:18;5876:50;5943:32;5968:6;5960;5943:32;:::i;:::-;5935:40;5493:488;-1:-1:-1;;;;;;5493:488:514:o;5986:151::-;6062:20;;6111:1;6101:12;;6091:40;;6127:1;6124;6117:12;6142:284;6226:6;6234;6287:2;6275:9;6266:7;6262:23;6258:32;6255:52;;;6303:1;6300;6293:12;6255:52;6326:29;6345:9;6326:29;:::i;:::-;6316:39;;6374:46;6416:2;6405:9;6401:18;6374:46;:::i;:::-;6364:56;;6142:284;;;;;:::o;6616:275::-;6807:2;6796:9;6789:21;6770:4;6827:58;6881:2;6870:9;6866:18;6858:6;6827:58;:::i;6896:127::-;6957:10;6952:3;6948:20;6945:1;6938:31;6988:4;6985:1;6978:15;7012:4;7009:1;7002:15;7028:275;7099:2;7093:9;7164:2;7145:13;;-1:-1:-1;;7141:27:514;7129:40;;-1:-1:-1;;;;;7184:34:514;;7220:22;;;7181:62;7178:88;;;7246:18;;:::i;:::-;7282:2;7275:22;7028:275;;-1:-1:-1;7028:275:514:o;7308:530::-;7350:5;7403:3;7396:4;7388:6;7384:17;7380:27;7370:55;;7421:1;7418;7411:12;7370:55;7457:6;7444:20;-1:-1:-1;;;;;7479:2:514;7476:26;7473:52;;;7505:18;;:::i;:::-;7549:55;7592:2;7573:13;;-1:-1:-1;;7569:27:514;7598:4;7565:38;7549:55;:::i;:::-;7629:2;7620:7;7613:19;7675:3;7668:4;7663:2;7655:6;7651:15;7647:26;7644:35;7641:55;;;7692:1;7689;7682:12;7641:55;7757:2;7750:4;7742:6;7738:17;7731:4;7722:7;7718:18;7705:55;7805:1;7780:16;;;7798:4;7776:27;7769:38;;;;7784:7;7308:530;-1:-1:-1;;;7308:530:514:o;7843:1287::-;7963:6;7971;7979;7987;8040:3;8028:9;8019:7;8015:23;8011:33;8008:53;;;8057:1;8054;8047:12;8008:53;8093:9;8080:23;8070:33;;8122:2;8175;8164:9;8160:18;8147:32;-1:-1:-1;;;;;8239:2:514;8231:6;8228:14;8225:34;;;8255:1;8252;8245:12;8225:34;8293:6;8282:9;8278:22;8268:32;;8338:7;8331:4;8327:2;8323:13;8319:27;8309:55;;8360:1;8357;8350:12;8309:55;8396:2;8383:16;8418:2;8414;8411:10;8408:36;;;8424:18;;:::i;:::-;8470:2;8467:1;8463:10;8493:28;8517:2;8513;8509:11;8493:28;:::i;:::-;8555:15;;;8625:11;;;8621:20;;;8586:12;;;;8653:19;;;8650:39;;;8685:1;8682;8675:12;8650:39;8709:11;;;;8729:148;8745:6;8740:3;8737:15;8729:148;;;8811:23;8830:3;8811:23;:::i;:::-;8799:36;;8762:12;;;;8855;;;;8729:148;;;8896:5;-1:-1:-1;;;;8948:2:514;8933:18;;8920:32;;-1:-1:-1;9005:2:514;8990:18;;8977:32;;-1:-1:-1;9021:16:514;;;9018:36;;;9050:1;9047;9040:12;9018:36;;;9073:51;9116:7;9105:8;9094:9;9090:24;9073:51;:::i;:::-;9063:61;;;7843:1287;;;;;;;:::o;9327:395::-;9405:6;9413;9466:2;9454:9;9445:7;9441:23;9437:32;9434:52;;;9482:1;9479;9472:12;9434:52;9505:29;9524:9;9505:29;:::i;:::-;9495:39;;9585:2;9574:9;9570:18;9557:32;-1:-1:-1;;;;;9604:6:514;9601:30;9598:50;;;9644:1;9641;9634:12;9598:50;9667:49;9708:7;9699:6;9688:9;9684:22;9667:49;:::i;:::-;9657:59;;;9327:395;;;;;:::o;9727:632::-;9898:2;9950:21;;;10020:13;;9923:18;;;10042:22;;;9869:4;;9898:2;10121:15;;;;10095:2;10080:18;;;9869:4;10164:169;10178:6;10175:1;10172:13;10164:169;;;10239:13;;10227:26;;10308:15;;;;10273:12;;;;10200:1;10193:9;10164:169;;;-1:-1:-1;10350:3:514;;9727:632;-1:-1:-1;;;;;;9727:632:514:o;10364:127::-;10425:10;10420:3;10416:20;10413:1;10406:31;10456:4;10453:1;10446:15;10480:4;10477:1;10470:15;10496:238;10578:1;10571:5;10568:12;10558:143;;10623:10;10618:3;10614:20;10611:1;10604:31;10658:4;10655:1;10648:15;10686:4;10683:1;10676:15;10558:143;10710:18;;10496:238::o;10739:505::-;10804:45;10845:3;10837:5;10831:12;10804:45;:::i;:::-;10786:3;10895:4;10888:5;10884:16;10878:23;10933:4;10926;10921:3;10917:14;10910:28;10959:46;10999:4;10994:3;10990:14;10976:12;10959:46;:::i;:::-;11053:4;11042:16;;;11036:23;-1:-1:-1;;;;;11129:23:514;;;11113:14;;;11106:47;;;;11206:4;11195:16;;;11189:23;11185:32;11169:14;;;;11162:56;;;;-1:-1:-1;10947:58:514;;10739:505;-1:-1:-1;10739:505:514:o;11249:251::-;11424:2;11413:9;11406:21;11387:4;11444:50;11490:2;11479:9;11475:18;11467:6;11444:50;:::i;11505:254::-;11573:6;11581;11634:2;11622:9;11613:7;11609:23;11605:32;11602:52;;;11650:1;11647;11640:12;11602:52;11686:9;11673:23;11663:33;;11715:38;11749:2;11738:9;11734:18;11715:38;:::i;11764:171::-;11831:20;;-1:-1:-1;;;;;11880:30:514;;11870:41;;11860:69;;11925:1;11922;11915:12;11940:731;12027:6;12035;12043;12051;12104:2;12092:9;12083:7;12079:23;12075:32;12072:52;;;12120:1;12117;12110:12;12072:52;12156:9;12143:23;12133:33;;12185:37;12218:2;12207:9;12203:18;12185:37;:::i;:::-;12175:47;;12273:2;12262:9;12258:18;12245:32;-1:-1:-1;;;;;12337:2:514;12329:6;12326:14;12323:34;;;12353:1;12350;12343:12;12323:34;12391:6;12380:9;12376:22;12366:32;;12436:7;12429:4;12425:2;12421:13;12417:27;12407:55;;12458:1;12455;12448:12;12407:55;12498:2;12485:16;12524:2;12516:6;12513:14;12510:34;;;12540:1;12537;12530:12;12510:34;12585:7;12580:2;12571:6;12567:2;12563:15;12559:24;12556:37;12553:57;;;12606:1;12603;12596:12;12553:57;11940:731;;;;-1:-1:-1;;12637:2:514;12629:11;;-1:-1:-1;;;11940:731:514:o;12676:834::-;12864:4;12893:2;12933;12922:9;12918:18;12963:2;12952:9;12945:21;12986:6;13021;13015:13;13052:6;13044;13037:22;13090:2;13079:9;13075:18;13068:25;;13152:2;13142:6;13139:1;13135:14;13124:9;13120:30;13116:39;13102:53;;13190:2;13182:6;13178:15;13211:1;13221:260;13235:6;13232:1;13229:13;13221:260;;;13328:2;13324:7;13312:9;13304:6;13300:22;13296:36;13291:3;13284:49;13356:45;13394:6;13385;13379:13;13356:45;:::i;:::-;13346:55;-1:-1:-1;13459:12:514;;;;13424:15;;;;13257:1;13250:9;13221:260;;;-1:-1:-1;13498:6:514;;12676:834;-1:-1:-1;;;;;;;12676:834:514:o;13515:252::-;13582:6;13590;13643:2;13631:9;13622:7;13618:23;13614:32;13611:52;;;13659:1;13656;13649:12;13611:52;13695:9;13682:23;13672:33;;13724:37;13757:2;13746:9;13742:18;13724:37;:::i;13772:465::-;13825:3;13863:5;13857:12;13890:6;13885:3;13878:19;13916:4;13945;13940:3;13936:14;13929:21;;13984:4;13977:5;13973:16;14007:1;14017:195;14031:6;14028:1;14025:13;14017:195;;;14096:13;;-1:-1:-1;;;;;14092:39:514;14080:52;;14152:12;;;;14187:15;;;;14128:1;14046:9;14017:195;;;-1:-1:-1;14228:3:514;;13772:465;-1:-1:-1;;;;;13772:465:514:o;14242:261::-;14421:2;14410:9;14403:21;14384:4;14441:56;14493:2;14482:9;14478:18;14470:6;14441:56;:::i;14508:248::-;14576:6;14584;14637:2;14625:9;14616:7;14612:23;14608:32;14605:52;;;14653:1;14650;14643:12;14605:52;-1:-1:-1;;14676:23:514;;;14746:2;14731:18;;;14718:32;;-1:-1:-1;14508:248:514:o;14761:416::-;15024:2;15013:9;15006:21;14987:4;15044:68;15108:2;15097:9;15093:18;15085:6;15044:68;:::i;:::-;15036:76;;15162:6;15155:14;15148:22;15143:2;15132:9;15128:18;15121:50;14761:416;;;;;:::o;15182:551::-;15273:6;15281;15289;15297;15305;15358:3;15346:9;15337:7;15333:23;15329:33;15326:53;;;15375:1;15372;15365:12;15326:53;15411:9;15398:23;15388:33;;15468:2;15457:9;15453:18;15440:32;15430:42;;15519:2;15508:9;15504:18;15491:32;15481:42;;15542:37;15575:2;15564:9;15560:18;15542:37;:::i;:::-;15532:47;;15629:3;15618:9;15614:19;15601:33;15677:5;15670:13;15663:21;15656:5;15653:32;15643:60;;15699:1;15696;15689:12;15643:60;15722:5;15712:15;;;15182:551;;;;;;;;:::o;15738:493::-;15841:6;15849;15857;15910:2;15898:9;15889:7;15885:23;15881:32;15878:52;;;15926:1;15923;15916:12;15878:52;15949:29;15968:9;15949:29;:::i;:::-;15939:39;;16029:2;16018:9;16014:18;16001:32;-1:-1:-1;;;;;16048:6:514;16045:30;16042:50;;;16088:1;16085;16078:12;16042:50;16111:49;16152:7;16143:6;16132:9;16128:22;16111:49;:::i;:::-;16101:59;;;16179:46;16221:2;16210:9;16206:18;16179:46;:::i;:::-;16169:56;;15738:493;;;;;:::o;16236:219::-;16385:2;16374:9;16367:21;16348:4;16405:44;16445:2;16434:9;16430:18;16422:6;16405:44;:::i;16460:127::-;16521:10;16516:3;16512:20;16509:1;16502:31;16552:4;16549:1;16542:15;16576:4;16573:1;16566:15;17138:127;17199:10;17194:3;17190:20;17187:1;17180:31;17230:4;17227:1;17220:15;17254:4;17251:1;17244:15;17270:125;17335:9;;;17356:10;;;17353:36;;;17369:18;;:::i;17400:380::-;17479:1;17475:12;;;;17522;;;17543:61;;17597:4;17589:6;17585:17;17575:27;;17543:61;17650:2;17642:6;17639:14;17619:18;17616:38;17613:161;;17696:10;17691:3;17687:20;17684:1;17677:31;17731:4;17728:1;17721:15;17759:4;17756:1;17749:15;17785:127;17846:10;17841:3;17837:20;17834:1;17827:31;17877:4;17874:1;17867:15;17901:4;17898:1;17891:15;17917:135;17956:3;17977:17;;;17974:43;;17997:18;;:::i;:::-;-1:-1:-1;18044:1:514;18033:13;;17917:135::o;18265:201::-;18303:3;18331:10;18376:2;18369:5;18365:14;18403:2;18394:7;18391:15;18388:41;;18409:18;;:::i;:::-;18458:1;18445:15;;18265:201;-1:-1:-1;;;18265:201:514:o;18471:211::-;18619:2;18604:18;;18631:45;18608:9;18658:6;18631:45;:::i;18812:542::-;18913:2;18908:3;18905:11;18902:446;;;18949:1;18973:5;18970:1;18963:16;19017:4;19014:1;19004:18;19087:2;19075:10;19071:19;19068:1;19064:27;19058:4;19054:38;19123:4;19111:10;19108:20;19105:47;;;-1:-1:-1;19146:4:514;19105:47;19201:2;19196:3;19192:12;19189:1;19185:20;19179:4;19175:31;19165:41;;19256:82;19274:2;19267:5;19264:13;19256:82;;;19319:17;;;19300:1;19289:13;19256:82;;;19260:3;;;18812:542;;;:::o;19359:166::-;-1:-1:-1;;19487:1:514;19483:11;;;19479:24;19475:29;19465:40;19511:1;19507:11;;;;19462:57;;19359:166::o;19530:1341::-;19654:3;19648:10;-1:-1:-1;;;;;19673:6:514;19670:30;19667:56;;;19703:18;;:::i;:::-;19732:96;19821:6;19781:38;19813:4;19807:11;19781:38;:::i;:::-;19775:4;19732:96;:::i;:::-;19883:4;;19940:2;19929:14;;19957:1;19952:662;;;;20658:1;20675:6;20672:89;;;-1:-1:-1;20727:19:514;;;20721:26;20672:89;20787:67;20847:6;20840:5;20787:67;:::i;:::-;20781:4;20774:81;;19922:943;;19952:662;18759:1;18752:14;;;18796:4;18783:18;;-1:-1:-1;;19988:20:514;;;20105:236;20119:7;20116:1;20113:14;20105:236;;;20208:19;;;20202:26;20187:42;;20300:27;;;;20268:1;20256:14;;;;20135:19;;20105:236;;;20109:3;20369:6;20360:7;20357:19;20354:201;;;20430:19;;;20424:26;-1:-1:-1;;20513:1:514;20509:14;;;20525:3;20505:24;20501:37;20497:42;20482:58;20467:74;;20354:201;-1:-1:-1;;;;;20601:1:514;20585:14;;;20581:22;20568:36;;-1:-1:-1;19530:1341:514:o;20876:565::-;21157:6;21146:9;21139:25;21200:3;21195:2;21184:9;21180:18;21173:31;21120:4;21227:57;21279:3;21268:9;21264:19;21256:6;21227:57;:::i;:::-;21320:6;21315:2;21304:9;21300:18;21293:34;21375:9;21367:6;21363:22;21358:2;21347:9;21343:18;21336:50;21403:32;21428:6;21420;21403:32;:::i;:::-;21395:40;20876:565;-1:-1:-1;;;;;;;20876:565:514:o;21446:289::-;21577:3;21615:6;21609:13;21631:66;21690:6;21685:3;21678:4;21670:6;21666:17;21631:66;:::i;:::-;21713:16;;;;;21446:289;-1:-1:-1;;21446:289:514:o;21740:843::-;21868:3;21897:1;21930:6;21924:13;21960:36;21986:9;21960:36;:::i;:::-;22015:1;22032:17;;;22058:133;;;;22205:1;22200:358;;;;22025:533;;22058:133;-1:-1:-1;;22091:24:514;;22079:37;;22164:14;;22157:22;22145:35;;22136:45;;;-1:-1:-1;22058:133:514;;22200:358;22231:6;22228:1;22221:17;22261:4;22306;22303:1;22293:18;22333:1;22347:165;22361:6;22358:1;22355:13;22347:165;;;22439:14;;22426:11;;;22419:35;22482:16;;;;22376:10;;22347:165;;;22351:3;;;22541:6;22536:3;22532:16;22525:23;;22025:533;-1:-1:-1;22574:3:514;;21740:843;-1:-1:-1;;;;;;21740:843:514:o;24296:1202::-;-1:-1:-1;;;;;24413:3:514;24410:27;24407:53;;;24440:18;;:::i;:::-;24469:93;24558:3;24518:38;24550:4;24544:11;24518:38;:::i;:::-;24512:4;24469:93;:::i;:::-;24588:1;24613:2;24608:3;24605:11;24630:1;24625:615;;;;25284:1;25301:3;25298:93;;;-1:-1:-1;25357:19:514;;;25344:33;25298:93;25417:64;25477:3;25470:5;25417:64;:::i;:::-;25411:4;25404:78;;24598:894;;24625:615;18759:1;18752:14;;;18796:4;18783:18;;-1:-1:-1;;24661:17:514;;;24761:9;24783:229;24797:7;24794:1;24791:14;24783:229;;;24886:19;;;24873:33;24858:49;;24993:4;24978:20;;;;24946:1;24934:14;;;;24813:12;24783:229;;;24787:3;25040;25031:7;25028:16;25025:159;;;25164:1;25160:6;25154:3;25148;25145:1;25141:11;25137:21;25133:34;25129:39;25116:9;25111:3;25107:19;25094:33;25090:79;25082:6;25075:95;25025:159;;;25227:1;25221:3;25218:1;25214:11;25210:19;25204:4;25197:33;24598:894;;24296:1202;;;:::o;25503:639::-;25736:6;25725:9;25718:25;-1:-1:-1;;;;;25783:6:514;25779:31;25774:2;25763:9;25759:18;25752:59;25847:3;25842:2;25831:9;25827:18;25820:31;25888:6;25882:3;25871:9;25867:19;25860:35;25946:6;25938;25932:3;25921:9;25917:19;25904:49;26003:1;25973:22;;;25997:3;25969:32;;;25962:43;;;;26120:14;;26113:22;26108:2;26093:18;;26086:50;26066:2;26045:15;;;-1:-1:-1;;26041:29:514;26026:45;;;26022:55;;25503:639;-1:-1:-1;;;25503:639:514:o;26147:128::-;26214:9;;;26235:11;;;26232:37;;;26249:18;;:::i;26280:1426::-;26393:3;26387:4;26384:13;26381:26;;26400:5;;26280:1426::o;26381:26::-;26430:37;26462:3;26456:10;26430:37;:::i;:::-;-1:-1:-1;;;;;26482:6:514;26479:30;26476:56;;;26512:18;;:::i;:::-;26541:96;26630:6;26590:38;26622:4;26616:11;26590:38;:::i;26541:96::-;26663:1;26691:2;26683:6;26680:14;26708:1;26703:746;;;;27493:1;27510:6;27507:89;;;-1:-1:-1;27562:19:514;;;27556:26;27507:89;27622:67;27682:6;27675:5;27622:67;:::i;:::-;27616:4;27609:81;;26673:1027;;26703:746;18759:1;18752:14;;;18796:4;18783:18;;-1:-1:-1;;26739:20:514;;;18759:1;18752:14;;;18796:4;18783:18;;26901:9;26923:251;26937:7;26934:1;26931:14;26923:251;;;27019:21;;;27013:28;26998:44;;27069:1;27142:18;;;;27097:15;;;;26960:4;26953:12;26923:251;;;26927:3;27202:6;27193:7;27190:19;27187:203;;;27263:21;;27257:28;-1:-1:-1;;27360:3:514;27348:1;27344:14;;;27340:24;27336:37;27332:42;27317:58;27302:74;;;-1:-1:-1;;27436:1:514;27420:14;;;27416:22;27403:36;;-1:-1:-1;26280:1426:514:o;28677:324::-;28868:2;28857:9;28850:21;28831:4;28888:44;28928:2;28917:9;28913:18;28905:6;28888:44;:::i;:::-;28880:52;;28941:54;28991:2;28980:9;28976:18;28968:6;28941:54;:::i","linkReferences":{}},"methodIdentifiers":{"__OperatorRegistry_init(address[])":"ba428b1a","__RiverConfig_init(address[])":"31374511","allocateStream(bytes32,address[],bytes32,bytes)":"6b883c39","approveConfigurationManager(address)":"c179b85f","approveOperator(address)":"242cae9f","configurationExists(bytes32)":"fc207c01","deleteConfiguration(bytes32)":"035759e1","deleteConfigurationOnBlock(bytes32,uint64)":"b7f227ee","getAllConfiguration()":"081814db","getAllNodeAddresses()":"c8fe3a01","getAllNodes()":"a1174e7d","getAllStreamIds()":"86789fc6","getAllStreams()":"3bd84c0c","getConfiguration(bytes32)":"9283ae3a","getNode(address)":"9d209048","getNodeCount()":"39bf397e","getPaginatedStreams(uint256,uint256)":"ca78c41a","getStream(bytes32)":"1290abe8","getStreamByIndex(uint256)":"68b454df","getStreamCount()":"c0f22084","getStreamWithGenesis(bytes32)":"3c2544d1","getStreamsOnNode(address)":"32705ac4","isConfigurationManager(address)":"d4bd44a0","isOperator(address)":"6d70f7ae","placeStreamOnNode(bytes32,address)":"9ee86d38","registerNode(address,string,uint8)":"eecc66f4","removeConfigurationManager(address)":"813049ec","removeNode(address)":"b2b99ec9","removeOperator(address)":"ac8a584a","removeStreamFromNode(bytes32,address)":"ee885b12","setConfiguration(bytes32,uint64,bytes)":"a09449a6","setStreamLastMiniblock(bytes32,bytes32,bytes32,uint64,bool)":"d7a3158a","updateNodeStatus(address,uint8)":"581f8b9b","updateNodeUrl(address,string)":"7e4465e7"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"approvedOperators\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"block\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"deleted\",\"type\":\"bool\"}],\"name\":\"ConfigurationChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"manager\",\"type\":\"address\"}],\"name\":\"ConfigurationManagerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"manager\",\"type\":\"address\"}],\"name\":\"ConfigurationManagerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"NodeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"NodeRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"NodeStatusUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"}],\"name\":\"NodeUrlUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operatorAddress\",\"type\":\"address\"}],\"name\":\"OperatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operatorAddress\",\"type\":\"address\"}],\"name\":\"OperatorRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"genesisMiniblockHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"genesisMiniblock\",\"type\":\"bytes\"}],\"name\":\"StreamAllocated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isSealed\",\"type\":\"bool\"}],\"name\":\"StreamLastMiniblockUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isAdded\",\"type\":\"bool\"}],\"name\":\"StreamPlacementUpdated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"initialOperators\",\"type\":\"address[]\"}],\"name\":\"__OperatorRegistry_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"configManagers\",\"type\":\"address[]\"}],\"name\":\"__RiverConfig_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"},{\"internalType\":\"bytes32\",\"name\":\"genesisMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"genesisMiniblock\",\"type\":\"bytes\"}],\"name\":\"allocateStream\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"manager\",\"type\":\"address\"}],\"name\":\"approveConfigurationManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"approveOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"configurationExists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"deleteConfiguration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"blockNumber\",\"type\":\"uint64\"}],\"name\":\"deleteConfigurationOnBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllConfiguration\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"blockNumber\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct Setting[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllNodeAddresses\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllNodes\",\"outputs\":[{\"components\":[{\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"internalType\":\"struct Node[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllStreamIds\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllStreams\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"stream\",\"type\":\"tuple\"}],\"internalType\":\"struct StreamWithId[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"getConfiguration\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"blockNumber\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct Setting[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"getNode\",\"outputs\":[{\"components\":[{\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"internalType\":\"struct Node\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodeCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"start\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stop\",\"type\":\"uint256\"}],\"name\":\"getPaginatedStreams\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"stream\",\"type\":\"tuple\"}],\"internalType\":\"struct StreamWithId[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"}],\"name\":\"getStream\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"i\",\"type\":\"uint256\"}],\"name\":\"getStreamByIndex\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"stream\",\"type\":\"tuple\"}],\"internalType\":\"struct StreamWithId\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStreamCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"}],\"name\":\"getStreamWithGenesis\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"getStreamsOnNode\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"stream\",\"type\":\"tuple\"}],\"internalType\":\"struct StreamWithId[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"manager\",\"type\":\"address\"}],\"name\":\"isConfigurationManager\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isOperator\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"placeStreamOnNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"registerNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"manager\",\"type\":\"address\"}],\"name\":\"removeConfigurationManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"removeNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"removeOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"removeStreamFromNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"blockNumber\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"name\":\"setConfiguration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isSealed\",\"type\":\"bool\"}],\"name\":\"setStreamLastMiniblock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"updateNodeStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"}],\"name\":\"updateNodeUrl\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"ConfigurationChanged(bytes32,uint64,bytes,bool)\":{\"params\":{\"block\":\"The block number on which the setting becomes active\",\"deleted\":\"True if the setting is deleted (value is empty in this case)\",\"key\":\"The setting key that is changed\",\"value\":\"The new setting value\"}},\"ConfigurationManagerAdded(address)\":{\"params\":{\"manager\":\"The configuration manager address\"}},\"ConfigurationManagerRemoved(address)\":{\"params\":{\"manager\":\"The configuration manager address\"}},\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"}},\"kind\":\"dev\",\"methods\":{\"approveConfigurationManager(address)\":{\"params\":{\"manager\":\"The address to add\"}},\"configurationExists(bytes32)\":{\"params\":{\"key\":\"The setting key\"},\"returns\":{\"_0\":\"True if the setting exists\"}},\"deleteConfiguration(bytes32)\":{\"params\":{\"key\":\"The setting key\"}},\"deleteConfigurationOnBlock(bytes32,uint64)\":{\"params\":{\"blockNumber\":\"The block number on which the setting becomes active\",\"key\":\"The setting key\"}},\"getAllConfiguration()\":{\"details\":\"Note that the returned list is ordered on key but NOT on block number\",\"returns\":{\"_0\":\"List will all stored settings\"}},\"getAllNodeAddresses()\":{\"details\":\"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.\"},\"getAllNodes()\":{\"details\":\"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.\"},\"getAllStreamIds()\":{\"details\":\"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.\"},\"getAllStreams()\":{\"details\":\"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.\"},\"getConfiguration(bytes32)\":{\"details\":\"Note that the returned list isn't ordered by block number\",\"params\":{\"key\":\"The setting key\"},\"returns\":{\"_0\":\"The setting value\"}},\"getPaginatedStreams(uint256,uint256)\":{\"details\":\"Recommended range is 5000 streams, returns true if on the last page.\"},\"getStreamWithGenesis(bytes32)\":{\"returns\":{\"_0\":\"stream, genesisMiniblockHash, genesisMiniblock\"}},\"isConfigurationManager(address)\":{\"params\":{\"manager\":\"The address to check\"},\"returns\":{\"_0\":\"True if the address is a configuration manager\"}},\"removeConfigurationManager(address)\":{\"params\":{\"manager\":\"The address to remove\"}},\"setConfiguration(bytes32,uint64,bytes)\":{\"params\":{\"blockNumber\":\"The block number on which the setting becomes active\",\"key\":\"The setting key\",\"value\":\"The setting value (value must be its ABI representation)\"}}},\"version\":1},\"userdoc\":{\"events\":{\"ConfigurationChanged(bytes32,uint64,bytes,bool)\":{\"notice\":\"Emitted when a setting is changed\"},\"ConfigurationManagerAdded(address)\":{\"notice\":\"Emitted when a configuration manager is added\"},\"ConfigurationManagerRemoved(address)\":{\"notice\":\"Emitted when a configuration manager is removed\"},\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{\"approveConfigurationManager(address)\":{\"notice\":\"Add a configuration manager\"},\"configurationExists(bytes32)\":{\"notice\":\"Indication if there is a setting for the given key\"},\"deleteConfiguration(bytes32)\":{\"notice\":\"Deletes the setting for the given key on all blocks\"},\"deleteConfigurationOnBlock(bytes32,uint64)\":{\"notice\":\"Deletes the setting for the given key at the given block\"},\"getAllConfiguration()\":{\"notice\":\"Get all settings store in the registry\"},\"getAllNodeAddresses()\":{\"notice\":\"Return array containing all node addresses\"},\"getAllNodes()\":{\"notice\":\"Return array containing all nodes\"},\"getAllStreamIds()\":{\"notice\":\"Return array containing all stream ids\"},\"getAllStreams()\":{\"notice\":\"Return array containing all streams\"},\"getConfiguration(bytes32)\":{\"notice\":\"Get settings for the given key\"},\"isConfigurationManager(address)\":{\"notice\":\"Check if the given address is a configuration manager\"},\"removeConfigurationManager(address)\":{\"notice\":\"Remove a configuration manager\"},\"setConfiguration(bytes32,uint64,bytes)\":{\"notice\":\"Set a bytes setting for the given key\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/mocks/MockRiverRegistry.sol\":\"MockRiverRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/OwnableBase.sol\":{\"keccak256\":\"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4\",\"dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa\"]},\"contracts/src/diamond/facets/ownable/OwnableStorage.sol\":{\"keccak256\":\"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105\",\"dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ\"]},\"contracts/src/river/registry/facets/config/IRiverConfig.sol\":{\"keccak256\":\"0xb60d58699681871a89edca7a16fa75bc0ae10f1c211f5f04ff554b9b8f65d359\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://9bb986017b16eb242adc1f04922b075fcbb80e643d5e3c6db28ba2f9ef312279\",\"dweb:/ipfs/QmYB4em4ZYPm3xSRZtG23y9XHQpNB1JnnDTwgj66ad8g2i\"]},\"contracts/src/river/registry/facets/config/RiverConfig.sol\":{\"keccak256\":\"0x74e51e8ba684604b253c428eaa51f6c48b71efcd024ac76a71e494efe1fed719\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5e303ad9653c11487e42cb5d2ae86cf778a8cf54f0ca655ca2dbd7bdb683f321\",\"dweb:/ipfs/QmdL5XdYWCW3QeS53mu2moBP2ZYR8pT4FJAHsD74oTWhcK\"]},\"contracts/src/river/registry/facets/node/INodeRegistry.sol\":{\"keccak256\":\"0x1f64f644ca9a6bfa00f2b4fe5242d7bf4a2410a3b0619e5f31813bf84d51f30a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://879e826a7772b560cfa439f2a352fbe378900ec4e8ab636b3f023e36f43b7fb5\",\"dweb:/ipfs/QmeVW4Kuji8B3p8D8NaruxBzQPutPMYiXxcMpfrvGFwjhZ\"]},\"contracts/src/river/registry/facets/node/NodeRegistry.sol\":{\"keccak256\":\"0x36153c58edd2ec86b4b5476955e7a4ab0f19332112179a8a28fdd10512b68a39\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6ef08c0ea25f34ed52a506be080bee1d260a2493f2762929032e6cce56d478d2\",\"dweb:/ipfs/QmZqXgxo5Vhi3E1SnWwXrGPPG83V4ggjH7eMbo687kkX4r\"]},\"contracts/src/river/registry/facets/operator/IOperatorRegistry.sol\":{\"keccak256\":\"0xf0dbf037e3ebc65945ce4e24e16ff8126e96dbc30174059b693a75e9b8213672\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://44c0fa0d32854421ba0d1a9041b0124504d3c9cb4da4d8c4bb77a69645350b10\",\"dweb:/ipfs/QmNUtMBujetyWHo87mSAvkgLRBjEgQwsrpoMdST8LPm6Zb\"]},\"contracts/src/river/registry/facets/operator/OperatorRegistry.sol\":{\"keccak256\":\"0xe4b80ab4faaaf470a46907bbbe9a02783eff94492c4ba9a9d5f681af54bbadff\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b9aa3f826f53fdb824e9f686486efdbcdc9231ca67da5954a33bdbf0f1bc123\",\"dweb:/ipfs/QmaLSPnRmeJPaNSd8RdTA5uyxUfxa8owNnRe2cZvw4W5YP\"]},\"contracts/src/river/registry/facets/stream/IStreamRegistry.sol\":{\"keccak256\":\"0x47337d9108adb07ab81e4c71666f916e96234e9837edde35866116c6627d2ff7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d7d8a5ad98688de306264be8e7bd41edc3f141d8e852b6545c07748a13879ac9\",\"dweb:/ipfs/QmPgYxzhakDsbnxPTFvMKKMKh2JmGtvq3nFukdcL4bQCZz\"]},\"contracts/src/river/registry/facets/stream/StreamRegistry.sol\":{\"keccak256\":\"0xc422b363ffefaf16dafdfa5983a37b5cf7a306ee9c291ebe510212e91159f934\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://965d4bc6045c85fa2fdd3ae4b6f7ef4aba5f3b98d00f0603ddde204c6c5555ac\",\"dweb:/ipfs/Qmah6HuHF1HvGG1D8SD18g3FG1wxuKAMYTdMNUnFaERn8M\"]},\"contracts/src/river/registry/libraries/RegistryErrors.sol\":{\"keccak256\":\"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3\",\"dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy\"]},\"contracts/src/river/registry/libraries/RegistryStorage.sol\":{\"keccak256\":\"0xb365ca80cf19bebeee5c5512b1982e660d0d31043f8bb4864f26e02ec70a117b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f2ddea5237c67ec769cf0da7f8da4131979ed34f9c2ad0495c87b65b1ea88e01\",\"dweb:/ipfs/QmQBy2AnbwwTopyCrdcW9cSYPaLpmXRqswxUv5dWYbza1q\"]},\"contracts/test/mocks/MockRiverRegistry.sol\":{\"keccak256\":\"0xa08a296baf3f059c6b580141b0603034a0addbb6037347ac020073cb2a29e9af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7091b951140ecabb2073630fc59a81510c6f5282f1ad1c7074765ec859dd0f70\",\"dweb:/ipfs/Qmf3krporaQr22C52bgk5WLpWZvrfH7K3xAzckWYsA5yLZ\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address[]","name":"approvedOperators","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32","indexed":false},{"internalType":"uint64","name":"block","type":"uint64","indexed":false},{"internalType":"bytes","name":"value","type":"bytes","indexed":false},{"internalType":"bool","name":"deleted","type":"bool","indexed":false}],"type":"event","name":"ConfigurationChanged","anonymous":false},{"inputs":[{"internalType":"address","name":"manager","type":"address","indexed":true}],"type":"event","name":"ConfigurationManagerAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"manager","type":"address","indexed":true}],"type":"event","name":"ConfigurationManagerRemoved","anonymous":false},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address","indexed":true},{"internalType":"string","name":"url","type":"string","indexed":false},{"internalType":"enum NodeStatus","name":"status","type":"uint8","indexed":false}],"type":"event","name":"NodeAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address","indexed":true}],"type":"event","name":"NodeRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address","indexed":true},{"internalType":"enum NodeStatus","name":"status","type":"uint8","indexed":false}],"type":"event","name":"NodeStatusUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address","indexed":true},{"internalType":"string","name":"url","type":"string","indexed":false}],"type":"event","name":"NodeUrlUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"operatorAddress","type":"address","indexed":true}],"type":"event","name":"OperatorAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"operatorAddress","type":"address","indexed":true}],"type":"event","name":"OperatorRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32","indexed":false},{"internalType":"address[]","name":"nodes","type":"address[]","indexed":false},{"internalType":"bytes32","name":"genesisMiniblockHash","type":"bytes32","indexed":false},{"internalType":"bytes","name":"genesisMiniblock","type":"bytes","indexed":false}],"type":"event","name":"StreamAllocated","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32","indexed":false},{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32","indexed":false},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64","indexed":false},{"internalType":"bool","name":"isSealed","type":"bool","indexed":false}],"type":"event","name":"StreamLastMiniblockUpdated","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32","indexed":false},{"internalType":"address","name":"nodeAddress","type":"address","indexed":false},{"internalType":"bool","name":"isAdded","type":"bool","indexed":false}],"type":"event","name":"StreamPlacementUpdated","anonymous":false},{"inputs":[{"internalType":"address[]","name":"initialOperators","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"__OperatorRegistry_init"},{"inputs":[{"internalType":"address[]","name":"configManagers","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"__RiverConfig_init"},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"},{"internalType":"address[]","name":"nodes","type":"address[]"},{"internalType":"bytes32","name":"genesisMiniblockHash","type":"bytes32"},{"internalType":"bytes","name":"genesisMiniblock","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"allocateStream"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"approveConfigurationManager"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"approveOperator"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"stateMutability":"view","type":"function","name":"configurationExists","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"deleteConfiguration"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint64","name":"blockNumber","type":"uint64"}],"stateMutability":"nonpayable","type":"function","name":"deleteConfigurationOnBlock"},{"inputs":[],"stateMutability":"view","type":"function","name":"getAllConfiguration","outputs":[{"internalType":"struct Setting[]","name":"","type":"tuple[]","components":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint64","name":"blockNumber","type":"uint64"},{"internalType":"bytes","name":"value","type":"bytes"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getAllNodeAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getAllNodes","outputs":[{"internalType":"struct Node[]","name":"","type":"tuple[]","components":[{"internalType":"enum NodeStatus","name":"status","type":"uint8"},{"internalType":"string","name":"url","type":"string"},{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"address","name":"operator","type":"address"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getAllStreamIds","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getAllStreams","outputs":[{"internalType":"struct StreamWithId[]","name":"","type":"tuple[]","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"struct Stream","name":"stream","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]}]},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getConfiguration","outputs":[{"internalType":"struct Setting[]","name":"","type":"tuple[]","components":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint64","name":"blockNumber","type":"uint64"},{"internalType":"bytes","name":"value","type":"bytes"}]}]},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"view","type":"function","name":"getNode","outputs":[{"internalType":"struct Node","name":"","type":"tuple","components":[{"internalType":"enum NodeStatus","name":"status","type":"uint8"},{"internalType":"string","name":"url","type":"string"},{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"address","name":"operator","type":"address"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getNodeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"stateMutability":"view","type":"function","name":"getPaginatedStreams","outputs":[{"internalType":"struct StreamWithId[]","name":"","type":"tuple[]","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"struct Stream","name":"stream","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]},{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getStream","outputs":[{"internalType":"struct Stream","name":"","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"stateMutability":"view","type":"function","name":"getStreamByIndex","outputs":[{"internalType":"struct StreamWithId","name":"","type":"tuple","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"struct Stream","name":"stream","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getStreamCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getStreamWithGenesis","outputs":[{"internalType":"struct Stream","name":"","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"view","type":"function","name":"getStreamsOnNode","outputs":[{"internalType":"struct StreamWithId[]","name":"","type":"tuple[]","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"struct Stream","name":"stream","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]}]},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"stateMutability":"view","type":"function","name":"isConfigurationManager","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"},{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"placeStreamOnNode"},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"string","name":"url","type":"string"},{"internalType":"enum NodeStatus","name":"status","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"registerNode"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeConfigurationManager"},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeNode"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeOperator"},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"},{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeStreamFromNode"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint64","name":"blockNumber","type":"uint64"},{"internalType":"bytes","name":"value","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"setConfiguration"},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"bool","name":"isSealed","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setStreamLastMiniblock"},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"enum NodeStatus","name":"status","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"updateNodeStatus"},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"string","name":"url","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"updateNodeUrl"}],"devdoc":{"kind":"dev","methods":{"approveConfigurationManager(address)":{"params":{"manager":"The address to add"}},"configurationExists(bytes32)":{"params":{"key":"The setting key"},"returns":{"_0":"True if the setting exists"}},"deleteConfiguration(bytes32)":{"params":{"key":"The setting key"}},"deleteConfigurationOnBlock(bytes32,uint64)":{"params":{"blockNumber":"The block number on which the setting becomes active","key":"The setting key"}},"getAllConfiguration()":{"details":"Note that the returned list is ordered on key but NOT on block number","returns":{"_0":"List will all stored settings"}},"getAllNodeAddresses()":{"details":"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block."},"getAllNodes()":{"details":"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block."},"getAllStreamIds()":{"details":"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block."},"getAllStreams()":{"details":"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block."},"getConfiguration(bytes32)":{"details":"Note that the returned list isn't ordered by block number","params":{"key":"The setting key"},"returns":{"_0":"The setting value"}},"getPaginatedStreams(uint256,uint256)":{"details":"Recommended range is 5000 streams, returns true if on the last page."},"getStreamWithGenesis(bytes32)":{"returns":{"_0":"stream, genesisMiniblockHash, genesisMiniblock"}},"isConfigurationManager(address)":{"params":{"manager":"The address to check"},"returns":{"_0":"True if the address is a configuration manager"}},"removeConfigurationManager(address)":{"params":{"manager":"The address to remove"}},"setConfiguration(bytes32,uint64,bytes)":{"params":{"blockNumber":"The block number on which the setting becomes active","key":"The setting key","value":"The setting value (value must be its ABI representation)"}}},"version":1},"userdoc":{"kind":"user","methods":{"approveConfigurationManager(address)":{"notice":"Add a configuration manager"},"configurationExists(bytes32)":{"notice":"Indication if there is a setting for the given key"},"deleteConfiguration(bytes32)":{"notice":"Deletes the setting for the given key on all blocks"},"deleteConfigurationOnBlock(bytes32,uint64)":{"notice":"Deletes the setting for the given key at the given block"},"getAllConfiguration()":{"notice":"Get all settings store in the registry"},"getAllNodeAddresses()":{"notice":"Return array containing all node addresses"},"getAllNodes()":{"notice":"Return array containing all nodes"},"getAllStreamIds()":{"notice":"Return array containing all stream ids"},"getAllStreams()":{"notice":"Return array containing all streams"},"getConfiguration(bytes32)":{"notice":"Get settings for the given key"},"isConfigurationManager(address)":{"notice":"Check if the given address is a configuration manager"},"removeConfigurationManager(address)":{"notice":"Remove a configuration manager"},"setConfiguration(bytes32,uint64,bytes)":{"notice":"Set a bytes setting for the given key"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/test/mocks/MockRiverRegistry.sol":"MockRiverRegistry"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableBase.sol":{"keccak256":"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762","urls":["bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4","dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableStorage.sol":{"keccak256":"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64","urls":["bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105","dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/config/IRiverConfig.sol":{"keccak256":"0xb60d58699681871a89edca7a16fa75bc0ae10f1c211f5f04ff554b9b8f65d359","urls":["bzz-raw://9bb986017b16eb242adc1f04922b075fcbb80e643d5e3c6db28ba2f9ef312279","dweb:/ipfs/QmYB4em4ZYPm3xSRZtG23y9XHQpNB1JnnDTwgj66ad8g2i"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/config/RiverConfig.sol":{"keccak256":"0x74e51e8ba684604b253c428eaa51f6c48b71efcd024ac76a71e494efe1fed719","urls":["bzz-raw://5e303ad9653c11487e42cb5d2ae86cf778a8cf54f0ca655ca2dbd7bdb683f321","dweb:/ipfs/QmdL5XdYWCW3QeS53mu2moBP2ZYR8pT4FJAHsD74oTWhcK"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/node/INodeRegistry.sol":{"keccak256":"0x1f64f644ca9a6bfa00f2b4fe5242d7bf4a2410a3b0619e5f31813bf84d51f30a","urls":["bzz-raw://879e826a7772b560cfa439f2a352fbe378900ec4e8ab636b3f023e36f43b7fb5","dweb:/ipfs/QmeVW4Kuji8B3p8D8NaruxBzQPutPMYiXxcMpfrvGFwjhZ"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/node/NodeRegistry.sol":{"keccak256":"0x36153c58edd2ec86b4b5476955e7a4ab0f19332112179a8a28fdd10512b68a39","urls":["bzz-raw://6ef08c0ea25f34ed52a506be080bee1d260a2493f2762929032e6cce56d478d2","dweb:/ipfs/QmZqXgxo5Vhi3E1SnWwXrGPPG83V4ggjH7eMbo687kkX4r"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/operator/IOperatorRegistry.sol":{"keccak256":"0xf0dbf037e3ebc65945ce4e24e16ff8126e96dbc30174059b693a75e9b8213672","urls":["bzz-raw://44c0fa0d32854421ba0d1a9041b0124504d3c9cb4da4d8c4bb77a69645350b10","dweb:/ipfs/QmNUtMBujetyWHo87mSAvkgLRBjEgQwsrpoMdST8LPm6Zb"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/operator/OperatorRegistry.sol":{"keccak256":"0xe4b80ab4faaaf470a46907bbbe9a02783eff94492c4ba9a9d5f681af54bbadff","urls":["bzz-raw://1b9aa3f826f53fdb824e9f686486efdbcdc9231ca67da5954a33bdbf0f1bc123","dweb:/ipfs/QmaLSPnRmeJPaNSd8RdTA5uyxUfxa8owNnRe2cZvw4W5YP"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/stream/IStreamRegistry.sol":{"keccak256":"0x47337d9108adb07ab81e4c71666f916e96234e9837edde35866116c6627d2ff7","urls":["bzz-raw://d7d8a5ad98688de306264be8e7bd41edc3f141d8e852b6545c07748a13879ac9","dweb:/ipfs/QmPgYxzhakDsbnxPTFvMKKMKh2JmGtvq3nFukdcL4bQCZz"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/stream/StreamRegistry.sol":{"keccak256":"0xc422b363ffefaf16dafdfa5983a37b5cf7a306ee9c291ebe510212e91159f934","urls":["bzz-raw://965d4bc6045c85fa2fdd3ae4b6f7ef4aba5f3b98d00f0603ddde204c6c5555ac","dweb:/ipfs/Qmah6HuHF1HvGG1D8SD18g3FG1wxuKAMYTdMNUnFaERn8M"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryErrors.sol":{"keccak256":"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc","urls":["bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3","dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryStorage.sol":{"keccak256":"0xb365ca80cf19bebeee5c5512b1982e660d0d31043f8bb4864f26e02ec70a117b","urls":["bzz-raw://f2ddea5237c67ec769cf0da7f8da4131979ed34f9c2ad0495c87b65b1ea88e01","dweb:/ipfs/QmQBy2AnbwwTopyCrdcW9cSYPaLpmXRqswxUv5dWYbza1q"],"license":"Apache-2.0"},"contracts/test/mocks/MockRiverRegistry.sol":{"keccak256":"0xa08a296baf3f059c6b580141b0603034a0addbb6037347ac020073cb2a29e9af","urls":["bzz-raw://7091b951140ecabb2073630fc59a81510c6f5282f1ad1c7074765ec859dd0f70","dweb:/ipfs/Qmf3krporaQr22C52bgk5WLpWZvrfH7K3xAzckWYsA5yLZ"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":335} \ No newline at end of file diff --git a/packages/generated/v3/abis/MockRiverRegistry.metadata.json b/packages/generated/v3/abis/MockRiverRegistry.metadata.json new file mode 100644 index 000000000..2fdc647f8 --- /dev/null +++ b/packages/generated/v3/abis/MockRiverRegistry.metadata.json @@ -0,0 +1,1576 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address[]", + "name": "approvedOperators", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "uint64", + "name": "block", + "type": "uint64", + "indexed": false + }, + { + "internalType": "bytes", + "name": "value", + "type": "bytes", + "indexed": false + }, + { + "internalType": "bool", + "name": "deleted", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ConfigurationChanged", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "manager", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConfigurationManagerAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "manager", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConfigurationManagerRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "string", + "name": "url", + "type": "string", + "indexed": false + }, + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8", + "indexed": false + } + ], + "type": "event", + "name": "NodeAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "NodeRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8", + "indexed": false + } + ], + "type": "event", + "name": "NodeStatusUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "string", + "name": "url", + "type": "string", + "indexed": false + } + ], + "type": "event", + "name": "NodeUrlUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operatorAddress", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OperatorAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operatorAddress", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OperatorRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]", + "indexed": false + }, + { + "internalType": "bytes32", + "name": "genesisMiniblockHash", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "bytes", + "name": "genesisMiniblock", + "type": "bytes", + "indexed": false + } + ], + "type": "event", + "name": "StreamAllocated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64", + "indexed": false + }, + { + "internalType": "bool", + "name": "isSealed", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "StreamLastMiniblockUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": false + }, + { + "internalType": "bool", + "name": "isAdded", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "StreamPlacementUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "initialOperators", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__OperatorRegistry_init" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "configManagers", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__RiverConfig_init" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + }, + { + "internalType": "bytes32", + "name": "genesisMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "genesisMiniblock", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "allocateStream" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "manager", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "approveConfigurationManager" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "approveOperator" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "configurationExists", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "deleteConfiguration" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "blockNumber", + "type": "uint64" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "deleteConfigurationOnBlock" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllConfiguration", + "outputs": [ + { + "internalType": "struct Setting[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "blockNumber", + "type": "uint64" + }, + { + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllNodeAddresses", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllNodes", + "outputs": [ + { + "internalType": "struct Node[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllStreamIds", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllStreams", + "outputs": [ + { + "internalType": "struct StreamWithId[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "struct Stream", + "name": "stream", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getConfiguration", + "outputs": [ + { + "internalType": "struct Setting[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "blockNumber", + "type": "uint64" + }, + { + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getNode", + "outputs": [ + { + "internalType": "struct Node", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getNodeCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stop", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getPaginatedStreams", + "outputs": [ + { + "internalType": "struct StreamWithId[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "struct Stream", + "name": "stream", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + }, + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getStream", + "outputs": [ + { + "internalType": "struct Stream", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "i", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getStreamByIndex", + "outputs": [ + { + "internalType": "struct StreamWithId", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "struct Stream", + "name": "stream", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getStreamCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getStreamWithGenesis", + "outputs": [ + { + "internalType": "struct Stream", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getStreamsOnNode", + "outputs": [ + { + "internalType": "struct StreamWithId[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "struct Stream", + "name": "stream", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "manager", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isConfigurationManager", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isOperator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "placeStreamOnNode" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + }, + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "registerNode" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "manager", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeConfigurationManager" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeNode" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeOperator" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeStreamFromNode" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "blockNumber", + "type": "uint64" + }, + { + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setConfiguration" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "isSealed", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setStreamLastMiniblock" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "updateNodeStatus" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "updateNodeUrl" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "approveConfigurationManager(address)": { + "params": { + "manager": "The address to add" + } + }, + "configurationExists(bytes32)": { + "params": { + "key": "The setting key" + }, + "returns": { + "_0": "True if the setting exists" + } + }, + "deleteConfiguration(bytes32)": { + "params": { + "key": "The setting key" + } + }, + "deleteConfigurationOnBlock(bytes32,uint64)": { + "params": { + "blockNumber": "The block number on which the setting becomes active", + "key": "The setting key" + } + }, + "getAllConfiguration()": { + "details": "Note that the returned list is ordered on key but NOT on block number", + "returns": { + "_0": "List will all stored settings" + } + }, + "getAllNodeAddresses()": { + "details": "WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block." + }, + "getAllNodes()": { + "details": "WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block." + }, + "getAllStreamIds()": { + "details": "WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block." + }, + "getAllStreams()": { + "details": "WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block." + }, + "getConfiguration(bytes32)": { + "details": "Note that the returned list isn't ordered by block number", + "params": { + "key": "The setting key" + }, + "returns": { + "_0": "The setting value" + } + }, + "getPaginatedStreams(uint256,uint256)": { + "details": "Recommended range is 5000 streams, returns true if on the last page." + }, + "getStreamWithGenesis(bytes32)": { + "returns": { + "_0": "stream, genesisMiniblockHash, genesisMiniblock" + } + }, + "isConfigurationManager(address)": { + "params": { + "manager": "The address to check" + }, + "returns": { + "_0": "True if the address is a configuration manager" + } + }, + "removeConfigurationManager(address)": { + "params": { + "manager": "The address to remove" + } + }, + "setConfiguration(bytes32,uint64,bytes)": { + "params": { + "blockNumber": "The block number on which the setting becomes active", + "key": "The setting key", + "value": "The setting value (value must be its ABI representation)" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "approveConfigurationManager(address)": { + "notice": "Add a configuration manager" + }, + "configurationExists(bytes32)": { + "notice": "Indication if there is a setting for the given key" + }, + "deleteConfiguration(bytes32)": { + "notice": "Deletes the setting for the given key on all blocks" + }, + "deleteConfigurationOnBlock(bytes32,uint64)": { + "notice": "Deletes the setting for the given key at the given block" + }, + "getAllConfiguration()": { + "notice": "Get all settings store in the registry" + }, + "getAllNodeAddresses()": { + "notice": "Return array containing all node addresses" + }, + "getAllNodes()": { + "notice": "Return array containing all nodes" + }, + "getAllStreamIds()": { + "notice": "Return array containing all stream ids" + }, + "getAllStreams()": { + "notice": "Return array containing all streams" + }, + "getConfiguration(bytes32)": { + "notice": "Get settings for the given key" + }, + "isConfigurationManager(address)": { + "notice": "Check if the given address is a configuration manager" + }, + "removeConfigurationManager(address)": { + "notice": "Remove a configuration manager" + }, + "setConfiguration(bytes32,uint64,bytes)": { + "notice": "Set a bytes setting for the given key" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/test/mocks/MockRiverRegistry.sol": "MockRiverRegistry" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableBase.sol": { + "keccak256": "0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762", + "urls": [ + "bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4", + "dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableStorage.sol": { + "keccak256": "0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64", + "urls": [ + "bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105", + "dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/config/IRiverConfig.sol": { + "keccak256": "0xb60d58699681871a89edca7a16fa75bc0ae10f1c211f5f04ff554b9b8f65d359", + "urls": [ + "bzz-raw://9bb986017b16eb242adc1f04922b075fcbb80e643d5e3c6db28ba2f9ef312279", + "dweb:/ipfs/QmYB4em4ZYPm3xSRZtG23y9XHQpNB1JnnDTwgj66ad8g2i" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/config/RiverConfig.sol": { + "keccak256": "0x74e51e8ba684604b253c428eaa51f6c48b71efcd024ac76a71e494efe1fed719", + "urls": [ + "bzz-raw://5e303ad9653c11487e42cb5d2ae86cf778a8cf54f0ca655ca2dbd7bdb683f321", + "dweb:/ipfs/QmdL5XdYWCW3QeS53mu2moBP2ZYR8pT4FJAHsD74oTWhcK" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/node/INodeRegistry.sol": { + "keccak256": "0x1f64f644ca9a6bfa00f2b4fe5242d7bf4a2410a3b0619e5f31813bf84d51f30a", + "urls": [ + "bzz-raw://879e826a7772b560cfa439f2a352fbe378900ec4e8ab636b3f023e36f43b7fb5", + "dweb:/ipfs/QmeVW4Kuji8B3p8D8NaruxBzQPutPMYiXxcMpfrvGFwjhZ" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/node/NodeRegistry.sol": { + "keccak256": "0x36153c58edd2ec86b4b5476955e7a4ab0f19332112179a8a28fdd10512b68a39", + "urls": [ + "bzz-raw://6ef08c0ea25f34ed52a506be080bee1d260a2493f2762929032e6cce56d478d2", + "dweb:/ipfs/QmZqXgxo5Vhi3E1SnWwXrGPPG83V4ggjH7eMbo687kkX4r" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/operator/IOperatorRegistry.sol": { + "keccak256": "0xf0dbf037e3ebc65945ce4e24e16ff8126e96dbc30174059b693a75e9b8213672", + "urls": [ + "bzz-raw://44c0fa0d32854421ba0d1a9041b0124504d3c9cb4da4d8c4bb77a69645350b10", + "dweb:/ipfs/QmNUtMBujetyWHo87mSAvkgLRBjEgQwsrpoMdST8LPm6Zb" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/operator/OperatorRegistry.sol": { + "keccak256": "0xe4b80ab4faaaf470a46907bbbe9a02783eff94492c4ba9a9d5f681af54bbadff", + "urls": [ + "bzz-raw://1b9aa3f826f53fdb824e9f686486efdbcdc9231ca67da5954a33bdbf0f1bc123", + "dweb:/ipfs/QmaLSPnRmeJPaNSd8RdTA5uyxUfxa8owNnRe2cZvw4W5YP" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/stream/IStreamRegistry.sol": { + "keccak256": "0x47337d9108adb07ab81e4c71666f916e96234e9837edde35866116c6627d2ff7", + "urls": [ + "bzz-raw://d7d8a5ad98688de306264be8e7bd41edc3f141d8e852b6545c07748a13879ac9", + "dweb:/ipfs/QmPgYxzhakDsbnxPTFvMKKMKh2JmGtvq3nFukdcL4bQCZz" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/stream/StreamRegistry.sol": { + "keccak256": "0xc422b363ffefaf16dafdfa5983a37b5cf7a306ee9c291ebe510212e91159f934", + "urls": [ + "bzz-raw://965d4bc6045c85fa2fdd3ae4b6f7ef4aba5f3b98d00f0603ddde204c6c5555ac", + "dweb:/ipfs/Qmah6HuHF1HvGG1D8SD18g3FG1wxuKAMYTdMNUnFaERn8M" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryErrors.sol": { + "keccak256": "0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc", + "urls": [ + "bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3", + "dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryStorage.sol": { + "keccak256": "0xb365ca80cf19bebeee5c5512b1982e660d0d31043f8bb4864f26e02ec70a117b", + "urls": [ + "bzz-raw://f2ddea5237c67ec769cf0da7f8da4131979ed34f9c2ad0495c87b65b1ea88e01", + "dweb:/ipfs/QmQBy2AnbwwTopyCrdcW9cSYPaLpmXRqswxUv5dWYbza1q" + ], + "license": "Apache-2.0" + }, + "contracts/test/mocks/MockRiverRegistry.sol": { + "keccak256": "0xa08a296baf3f059c6b580141b0603034a0addbb6037347ac020073cb2a29e9af", + "urls": [ + "bzz-raw://7091b951140ecabb2073630fc59a81510c6f5282f1ad1c7074765ec859dd0f70", + "dweb:/ipfs/Qmf3krporaQr22C52bgk5WLpWZvrfH7K3xAzckWYsA5yLZ" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/NodeRegistry.abi.json b/packages/generated/v3/abis/NodeRegistry.abi.json new file mode 100644 index 000000000..1a4147bd8 --- /dev/null +++ b/packages/generated/v3/abis/NodeRegistry.abi.json @@ -0,0 +1,252 @@ +[ + { + "type": "function", + "name": "getAllNodeAddresses", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllNodes", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct Node[]", + "components": [ + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Node", + "components": [ + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNodeCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "registerNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateNodeStatus", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateNodeUrl", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "NodeAdded", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "status", + "type": "uint8", + "indexed": false, + "internalType": "enum NodeStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeRemoved", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeStatusUpdated", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "status", + "type": "uint8", + "indexed": false, + "internalType": "enum NodeStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeUrlUpdated", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "indexed": false, + "internalType": "string" + } + ], + "anonymous": false + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/NodeRegistry.abi.ts b/packages/generated/v3/abis/NodeRegistry.abi.ts new file mode 100644 index 000000000..1e9d6ae02 --- /dev/null +++ b/packages/generated/v3/abis/NodeRegistry.abi.ts @@ -0,0 +1,252 @@ +export default [ + { + "type": "function", + "name": "getAllNodeAddresses", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllNodes", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct Node[]", + "components": [ + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Node", + "components": [ + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNodeCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "registerNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateNodeStatus", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum NodeStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateNodeUrl", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "NodeAdded", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "status", + "type": "uint8", + "indexed": false, + "internalType": "enum NodeStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeRemoved", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeStatusUpdated", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "status", + "type": "uint8", + "indexed": false, + "internalType": "enum NodeStatus" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NodeUrlUpdated", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "url", + "type": "string", + "indexed": false, + "internalType": "string" + } + ], + "anonymous": false + } +] as const diff --git a/packages/generated/v3/abis/NodeRegistry.bin b/packages/generated/v3/abis/NodeRegistry.bin new file mode 100644 index 000000000..fa1f88a2c --- /dev/null +++ b/packages/generated/v3/abis/NodeRegistry.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b506115e5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063a1174e7d1161005b578063a1174e7d146100f0578063b2b99ec914610105578063c8fe3a0114610118578063eecc66f41461012d57600080fd5b806339bf397e1461008d578063581f8b9b146100a85780637e4465e7146100bd5780639d209048146100d0575b600080fd5b610095610140565b6040519081526020015b60405180910390f35b6100bb6100b6366004611041565b610151565b005b6100bb6100cb366004611117565b6102fa565b6100e36100de366004611165565b6104f2565b60405161009f919061125c565b6100f8610673565b60405161009f919061126f565b6100bb610113366004611165565b61084e565b610120610a17565b60405161009f91906112d3565b6100bb61013b366004611320565b610a23565b600061014c6005610bed565b905090565b6001600160a01b038083166000908152600760205260409020600201548391166101ba57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b60405180910390fd5b336101c6600882610bfd565b6102005760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038085166000908152600760205260409020600301548591339116811461025e5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038616600090815260076020526040902080546102859060ff1687610c22565b80548690829060ff191660018360058111156102a3576102a3611180565b021790555060028101546040516001600160a01b03909116907f20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0906102e9908990611391565b60405180910390a250505050505050565b33610306600882610bfd565b6103405760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038084166000908152600760205260409020600201548491166103a057604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b03808516600090815260076020526040902060030154859133911681146103fe5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b03861660009081526007602090815260409182902091516104289188910161139f565b604051602081830303815290604052805190602001208160010160405160200161045291906113ef565b60405160208183030381529060405280519060200120036104a25760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526101b1919060040161137e565b600181016104b087826114b6565b5060028101546040516001600160a01b03909116907f4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac906102e990899061137e565b61051d6040805160808101909152806000815260606020820181905260006040830181905291015290565b610528600583610bfd565b61056857604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038216600090815260076020526040908190208151608081019092528054829060ff1660058111156105a3576105a3611180565b60058111156105b4576105b4611180565b81526020016001820180546105c8906113bb565b80601f01602080910402602001604051908101604052809291908181526020018280546105f4906113bb565b80156106415780601f1061061657610100808354040283529160200191610641565b820191906000526020600020905b81548152906001019060200180831161062457829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015292915050565b606060006106816005610bed565b67ffffffffffffffff81111561069957610699611074565b6040519080825280602002602001820160405280156106f557816020015b6106e26040805160808101909152806000815260606020820181905260006040830181905291015290565b8152602001906001900390816106b75790505b50905060005b6107056005610bed565b811015610848576007600061071b600584610db5565b6001600160a01b03168152602081019190915260409081016000208151608081019092528054829060ff16600581111561075757610757611180565b600581111561076857610768611180565b815260200160018201805461077c906113bb565b80601f01602080910402602001604051908101604052809291908181526020018280546107a8906113bb565b80156107f55780601f106107ca576101008083540402835291602001916107f5565b820191906000526020600020905b8154815290600101906020018083116107d857829003601f168201915b505050918352505060028201546001600160a01b039081166020830152600390920154909116604090910152825183908390811061083557610835611576565b60209081029190910101526001016106fb565b50919050565b6001600160a01b03808216600090815260076020526040902060030154829133911681146108ac5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038381166000908152600760205260409020600201541661090a57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b60056001600160a01b03841660009081526007602052604090205460ff16600581111561093957610939611180565b146109825760408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b81526101b1919060040161137e565b61098d600584610dc1565b506001600160a01b0383166000908152600760205260408120805460ff19168155906109bc6001830182610fc0565b506002810180546001600160a01b03199081169091556003909101805490911690556040516001600160a01b038416907fcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b90600090a2505050565b606061014c6005610dd6565b33610a2f600882610bfd565b610a695760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038481166000908152600760205260409020600201541615610ac857604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526101b1919060040161137e565b60006040518060800160405280846005811115610ae757610ae7611180565b8152602081018690526001600160a01b0387166040820152336060909101529050610b13600586610de3565b506001600160a01b03851660009081526007602052604090208151815483929190829060ff19166001836005811115610b4e57610b4e611180565b021790555060208201516001820190610b6790826114b6565b506040828101516002830180546001600160a01b03199081166001600160a01b039384161790915560609094015160039093018054909416928116929092179092559051908616907fd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e56190610bde908790879061158c565b60405180910390a25050505050565b6000610bf7825490565b92915050565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b6000826005811115610c3657610c36611180565b1480610c8a57506001826005811115610c5157610c51611180565b148015610c8a57506003816005811115610c6d57610c6d611180565b1480610c8a57506004816005811115610c8857610c88611180565b145b80610cdd57506002826005811115610ca457610ca4611180565b148015610cdd57506003816005811115610cc057610cc0611180565b1480610cdd57506004816005811115610cdb57610cdb611180565b145b80610d3057506004826005811115610cf757610cf7611180565b148015610d3057506003816005811115610d1357610d13611180565b1480610d3057506005816005811115610d2e57610d2e611180565b145b80610d6857506003826005811115610d4a57610d4a611180565b148015610d6857506005816005811115610d6657610d66611180565b145b15610d71575050565b60408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b81526101b1919060040161137e565b6000610c1b8383610df8565b6000610c1b836001600160a01b038416610e22565b60606000610c1b83610f15565b6000610c1b836001600160a01b038416610f71565b6000826000018281548110610e0f57610e0f611576565b9060005260206000200154905092915050565b60008181526001830160205260408120548015610f0b576000610e466001836115ae565b8554909150600090610e5a906001906115ae565b9050808214610ebf576000866000018281548110610e7a57610e7a611576565b9060005260206000200154905080876000018481548110610e9d57610e9d611576565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610ed057610ed06115cf565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610bf7565b6000915050610bf7565b606081600001805480602002602001604051908101604052809291908181526020018280548015610f6557602002820191906000526020600020905b815481526020019060010190808311610f51575b50505050509050919050565b6000818152600183016020526040812054610fb857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bf7565b506000610bf7565b508054610fcc906113bb565b6000825580601f10610fdc575050565b601f016020900490600052602060002090810190610ffa9190610ffd565b50565b5b808211156110125760008155600101610ffe565b5090565b80356001600160a01b038116811461102d57600080fd5b919050565b80356006811061102d57600080fd5b6000806040838503121561105457600080fd5b61105d83611016565b915061106b60208401611032565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261109b57600080fd5b813567ffffffffffffffff808211156110b6576110b6611074565b604051601f8301601f19908116603f011681019082821181831017156110de576110de611074565b816040528381528660208588010111156110f757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561112a57600080fd5b61113383611016565b9150602083013567ffffffffffffffff81111561114f57600080fd5b61115b8582860161108a565b9150509250929050565b60006020828403121561117757600080fd5b610c1b82611016565b634e487b7160e01b600052602160045260246000fd5b600681106111b457634e487b7160e01b600052602160045260246000fd5b9052565b60005b838110156111d35781810151838201526020016111bb565b50506000910152565b600081518084526111f48160208601602086016111b8565b601f01601f19169290920160200192915050565b611213828251611196565b600060208201516080602085015261122e60808501826111dc565b6040848101516001600160a01b03908116918701919091526060948501511693909401929092525090919050565b602081526000610c1b6020830184611208565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156112c657603f198886030184526112b4858351611208565b94509285019290850190600101611298565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156113145783516001600160a01b0316835292840192918401916001016112ef565b50909695505050505050565b60008060006060848603121561133557600080fd5b61133e84611016565b9250602084013567ffffffffffffffff81111561135a57600080fd5b6113668682870161108a565b92505061137560408501611032565b90509250925092565b602081526000610c1b60208301846111dc565b60208101610bf78284611196565b600082516113b18184602087016111b8565b9190910192915050565b600181811c908216806113cf57607f821691505b60208210810361084857634e487b7160e01b600052602260045260246000fd5b60008083546113fd816113bb565b60018281168015611415576001811461142a57611459565b60ff1984168752821515830287019450611459565b8760005260208060002060005b858110156114505781548a820152908401908201611437565b50505082870194505b50929695505050505050565b601f8211156114b1576000816000526020600020601f850160051c8101602086101561148e5750805b601f850160051c820191505b818110156114ad5782815560010161149a565b5050505b505050565b815167ffffffffffffffff8111156114d0576114d0611074565b6114e4816114de84546113bb565b84611465565b602080601f83116001811461151957600084156115015750858301515b600019600386901b1c1916600185901b1785556114ad565b600085815260208120601f198616915b8281101561154857888601518255948401946001909101908401611529565b50858210156115665787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b60408152600061159f60408301856111dc565b9050610c1b6020830184611196565b81810381811115610bf757634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd \ No newline at end of file diff --git a/packages/generated/v3/abis/NodeRegistry.json b/packages/generated/v3/abis/NodeRegistry.json new file mode 100644 index 000000000..c787513e8 --- /dev/null +++ b/packages/generated/v3/abis/NodeRegistry.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"getAllNodeAddresses","inputs":[],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"getAllNodes","inputs":[],"outputs":[{"name":"","type":"tuple[]","internalType":"struct Node[]","components":[{"name":"status","type":"uint8","internalType":"enum NodeStatus"},{"name":"url","type":"string","internalType":"string"},{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}]}],"stateMutability":"view"},{"type":"function","name":"getNode","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","internalType":"struct Node","components":[{"name":"status","type":"uint8","internalType":"enum NodeStatus"},{"name":"url","type":"string","internalType":"string"},{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}]}],"stateMutability":"view"},{"type":"function","name":"getNodeCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"registerNode","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"url","type":"string","internalType":"string"},{"name":"status","type":"uint8","internalType":"enum NodeStatus"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeNode","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateNodeStatus","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"status","type":"uint8","internalType":"enum NodeStatus"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateNodeUrl","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"},{"name":"url","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"NodeAdded","inputs":[{"name":"nodeAddress","type":"address","indexed":true,"internalType":"address"},{"name":"url","type":"string","indexed":false,"internalType":"string"},{"name":"status","type":"uint8","indexed":false,"internalType":"enum NodeStatus"}],"anonymous":false},{"type":"event","name":"NodeRemoved","inputs":[{"name":"nodeAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"NodeStatusUpdated","inputs":[{"name":"nodeAddress","type":"address","indexed":true,"internalType":"address"},{"name":"status","type":"uint8","indexed":false,"internalType":"enum NodeStatus"}],"anonymous":false},{"type":"event","name":"NodeUrlUpdated","inputs":[{"name":"nodeAddress","type":"address","indexed":true,"internalType":"address"},{"name":"url","type":"string","indexed":false,"internalType":"string"}],"anonymous":false}],"bytecode":{"object":"0x608060405234801561001057600080fd5b506115e5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063a1174e7d1161005b578063a1174e7d146100f0578063b2b99ec914610105578063c8fe3a0114610118578063eecc66f41461012d57600080fd5b806339bf397e1461008d578063581f8b9b146100a85780637e4465e7146100bd5780639d209048146100d0575b600080fd5b610095610140565b6040519081526020015b60405180910390f35b6100bb6100b6366004611041565b610151565b005b6100bb6100cb366004611117565b6102fa565b6100e36100de366004611165565b6104f2565b60405161009f919061125c565b6100f8610673565b60405161009f919061126f565b6100bb610113366004611165565b61084e565b610120610a17565b60405161009f91906112d3565b6100bb61013b366004611320565b610a23565b600061014c6005610bed565b905090565b6001600160a01b038083166000908152600760205260409020600201548391166101ba57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b60405180910390fd5b336101c6600882610bfd565b6102005760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038085166000908152600760205260409020600301548591339116811461025e5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038616600090815260076020526040902080546102859060ff1687610c22565b80548690829060ff191660018360058111156102a3576102a3611180565b021790555060028101546040516001600160a01b03909116907f20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0906102e9908990611391565b60405180910390a250505050505050565b33610306600882610bfd565b6103405760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038084166000908152600760205260409020600201548491166103a057604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b03808516600090815260076020526040902060030154859133911681146103fe5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b03861660009081526007602090815260409182902091516104289188910161139f565b604051602081830303815290604052805190602001208160010160405160200161045291906113ef565b60405160208183030381529060405280519060200120036104a25760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526101b1919060040161137e565b600181016104b087826114b6565b5060028101546040516001600160a01b03909116907f4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac906102e990899061137e565b61051d6040805160808101909152806000815260606020820181905260006040830181905291015290565b610528600583610bfd565b61056857604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038216600090815260076020526040908190208151608081019092528054829060ff1660058111156105a3576105a3611180565b60058111156105b4576105b4611180565b81526020016001820180546105c8906113bb565b80601f01602080910402602001604051908101604052809291908181526020018280546105f4906113bb565b80156106415780601f1061061657610100808354040283529160200191610641565b820191906000526020600020905b81548152906001019060200180831161062457829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015292915050565b606060006106816005610bed565b67ffffffffffffffff81111561069957610699611074565b6040519080825280602002602001820160405280156106f557816020015b6106e26040805160808101909152806000815260606020820181905260006040830181905291015290565b8152602001906001900390816106b75790505b50905060005b6107056005610bed565b811015610848576007600061071b600584610db5565b6001600160a01b03168152602081019190915260409081016000208151608081019092528054829060ff16600581111561075757610757611180565b600581111561076857610768611180565b815260200160018201805461077c906113bb565b80601f01602080910402602001604051908101604052809291908181526020018280546107a8906113bb565b80156107f55780601f106107ca576101008083540402835291602001916107f5565b820191906000526020600020905b8154815290600101906020018083116107d857829003601f168201915b505050918352505060028201546001600160a01b039081166020830152600390920154909116604090910152825183908390811061083557610835611576565b60209081029190910101526001016106fb565b50919050565b6001600160a01b03808216600090815260076020526040902060030154829133911681146108ac5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038381166000908152600760205260409020600201541661090a57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b60056001600160a01b03841660009081526007602052604090205460ff16600581111561093957610939611180565b146109825760408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b81526101b1919060040161137e565b61098d600584610dc1565b506001600160a01b0383166000908152600760205260408120805460ff19168155906109bc6001830182610fc0565b506002810180546001600160a01b03199081169091556003909101805490911690556040516001600160a01b038416907fcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b90600090a2505050565b606061014c6005610dd6565b33610a2f600882610bfd565b610a695760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038481166000908152600760205260409020600201541615610ac857604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526101b1919060040161137e565b60006040518060800160405280846005811115610ae757610ae7611180565b8152602081018690526001600160a01b0387166040820152336060909101529050610b13600586610de3565b506001600160a01b03851660009081526007602052604090208151815483929190829060ff19166001836005811115610b4e57610b4e611180565b021790555060208201516001820190610b6790826114b6565b506040828101516002830180546001600160a01b03199081166001600160a01b039384161790915560609094015160039093018054909416928116929092179092559051908616907fd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e56190610bde908790879061158c565b60405180910390a25050505050565b6000610bf7825490565b92915050565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b6000826005811115610c3657610c36611180565b1480610c8a57506001826005811115610c5157610c51611180565b148015610c8a57506003816005811115610c6d57610c6d611180565b1480610c8a57506004816005811115610c8857610c88611180565b145b80610cdd57506002826005811115610ca457610ca4611180565b148015610cdd57506003816005811115610cc057610cc0611180565b1480610cdd57506004816005811115610cdb57610cdb611180565b145b80610d3057506004826005811115610cf757610cf7611180565b148015610d3057506003816005811115610d1357610d13611180565b1480610d3057506005816005811115610d2e57610d2e611180565b145b80610d6857506003826005811115610d4a57610d4a611180565b148015610d6857506005816005811115610d6657610d66611180565b145b15610d71575050565b60408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b81526101b1919060040161137e565b6000610c1b8383610df8565b6000610c1b836001600160a01b038416610e22565b60606000610c1b83610f15565b6000610c1b836001600160a01b038416610f71565b6000826000018281548110610e0f57610e0f611576565b9060005260206000200154905092915050565b60008181526001830160205260408120548015610f0b576000610e466001836115ae565b8554909150600090610e5a906001906115ae565b9050808214610ebf576000866000018281548110610e7a57610e7a611576565b9060005260206000200154905080876000018481548110610e9d57610e9d611576565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610ed057610ed06115cf565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610bf7565b6000915050610bf7565b606081600001805480602002602001604051908101604052809291908181526020018280548015610f6557602002820191906000526020600020905b815481526020019060010190808311610f51575b50505050509050919050565b6000818152600183016020526040812054610fb857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bf7565b506000610bf7565b508054610fcc906113bb565b6000825580601f10610fdc575050565b601f016020900490600052602060002090810190610ffa9190610ffd565b50565b5b808211156110125760008155600101610ffe565b5090565b80356001600160a01b038116811461102d57600080fd5b919050565b80356006811061102d57600080fd5b6000806040838503121561105457600080fd5b61105d83611016565b915061106b60208401611032565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261109b57600080fd5b813567ffffffffffffffff808211156110b6576110b6611074565b604051601f8301601f19908116603f011681019082821181831017156110de576110de611074565b816040528381528660208588010111156110f757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561112a57600080fd5b61113383611016565b9150602083013567ffffffffffffffff81111561114f57600080fd5b61115b8582860161108a565b9150509250929050565b60006020828403121561117757600080fd5b610c1b82611016565b634e487b7160e01b600052602160045260246000fd5b600681106111b457634e487b7160e01b600052602160045260246000fd5b9052565b60005b838110156111d35781810151838201526020016111bb565b50506000910152565b600081518084526111f48160208601602086016111b8565b601f01601f19169290920160200192915050565b611213828251611196565b600060208201516080602085015261122e60808501826111dc565b6040848101516001600160a01b03908116918701919091526060948501511693909401929092525090919050565b602081526000610c1b6020830184611208565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156112c657603f198886030184526112b4858351611208565b94509285019290850190600101611298565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156113145783516001600160a01b0316835292840192918401916001016112ef565b50909695505050505050565b60008060006060848603121561133557600080fd5b61133e84611016565b9250602084013567ffffffffffffffff81111561135a57600080fd5b6113668682870161108a565b92505061137560408501611032565b90509250925092565b602081526000610c1b60208301846111dc565b60208101610bf78284611196565b600082516113b18184602087016111b8565b9190910192915050565b600181811c908216806113cf57607f821691505b60208210810361084857634e487b7160e01b600052602260045260246000fd5b60008083546113fd816113bb565b60018281168015611415576001811461142a57611459565b60ff1984168752821515830287019450611459565b8760005260208060002060005b858110156114505781548a820152908401908201611437565b50505082870194505b50929695505050505050565b601f8211156114b1576000816000526020600020601f850160051c8101602086101561148e5750805b601f850160051c820191505b818110156114ad5782815560010161149a565b5050505b505050565b815167ffffffffffffffff8111156114d0576114d0611074565b6114e4816114de84546113bb565b84611465565b602080601f83116001811461151957600084156115015750858301515b600019600386901b1c1916600185901b1785556114ad565b600085815260208120601f198616915b8281101561154857888601518255948401946001909101908401611529565b50858210156115665787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b60408152600061159f60408301856111dc565b9050610c1b6020830184611196565b81810381811115610bf757634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd","sourceMap":"528:3411:178:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063a1174e7d1161005b578063a1174e7d146100f0578063b2b99ec914610105578063c8fe3a0114610118578063eecc66f41461012d57600080fd5b806339bf397e1461008d578063581f8b9b146100a85780637e4465e7146100bd5780639d209048146100d0575b600080fd5b610095610140565b6040519081526020015b60405180910390f35b6100bb6100b6366004611041565b610151565b005b6100bb6100cb366004611117565b6102fa565b6100e36100de366004611165565b6104f2565b60405161009f919061125c565b6100f8610673565b60405161009f919061126f565b6100bb610113366004611165565b61084e565b610120610a17565b60405161009f91906112d3565b6100bb61013b366004611320565b610a23565b600061014c6005610bed565b905090565b6001600160a01b038083166000908152600760205260409020600201548391166101ba57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b60405180910390fd5b336101c6600882610bfd565b6102005760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038085166000908152600760205260409020600301548591339116811461025e5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038616600090815260076020526040902080546102859060ff1687610c22565b80548690829060ff191660018360058111156102a3576102a3611180565b021790555060028101546040516001600160a01b03909116907f20891cc7622c7951cbd8c70c61a5201eb45625b8c00e8f6c986cfca78f3dbfa0906102e9908990611391565b60405180910390a250505050505050565b33610306600882610bfd565b6103405760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038084166000908152600760205260409020600201548491166103a057604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b03808516600090815260076020526040902060030154859133911681146103fe5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b03861660009081526007602090815260409182902091516104289188910161139f565b604051602081830303815290604052805190602001208160010160405160200161045291906113ef565b60405160208183030381529060405280519060200120036104a25760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526101b1919060040161137e565b600181016104b087826114b6565b5060028101546040516001600160a01b03909116907f4505168a8705a16fd4d0575197fd0f510db69df93a065e158ad2c0957ba12bac906102e990899061137e565b61051d6040805160808101909152806000815260606020820181905260006040830181905291015290565b610528600583610bfd565b61056857604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038216600090815260076020526040908190208151608081019092528054829060ff1660058111156105a3576105a3611180565b60058111156105b4576105b4611180565b81526020016001820180546105c8906113bb565b80601f01602080910402602001604051908101604052809291908181526020018280546105f4906113bb565b80156106415780601f1061061657610100808354040283529160200191610641565b820191906000526020600020905b81548152906001019060200180831161062457829003601f168201915b505050918352505060028201546001600160a01b03908116602083015260039092015490911660409091015292915050565b606060006106816005610bed565b67ffffffffffffffff81111561069957610699611074565b6040519080825280602002602001820160405280156106f557816020015b6106e26040805160808101909152806000815260606020820181905260006040830181905291015290565b8152602001906001900390816106b75790505b50905060005b6107056005610bed565b811015610848576007600061071b600584610db5565b6001600160a01b03168152602081019190915260409081016000208151608081019092528054829060ff16600581111561075757610757611180565b600581111561076857610768611180565b815260200160018201805461077c906113bb565b80601f01602080910402602001604051908101604052809291908181526020018280546107a8906113bb565b80156107f55780601f106107ca576101008083540402835291602001916107f5565b820191906000526020600020905b8154815290600101906020018083116107d857829003601f168201915b505050918352505060028201546001600160a01b039081166020830152600390920154909116604090910152825183908390811061083557610835611576565b60209081029190910101526001016106fb565b50919050565b6001600160a01b03808216600090815260076020526040902060030154829133911681146108ac5760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038381166000908152600760205260409020600201541661090a57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526101b1919060040161137e565b60056001600160a01b03841660009081526007602052604090205460ff16600581111561093957610939611180565b146109825760408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b81526101b1919060040161137e565b61098d600584610dc1565b506001600160a01b0383166000908152600760205260408120805460ff19168155906109bc6001830182610fc0565b506002810180546001600160a01b03199081169091556003909101805490911690556040516001600160a01b038416907fcfc24166db4bb677e857cacabd1541fb2b30645021b27c5130419589b84db52b90600090a2505050565b606061014c6005610dd6565b33610a2f600882610bfd565b610a695760408051808201825260088152670848288be82aaa8960c31b6020820152905162461bcd60e51b81526101b1919060040161137e565b6001600160a01b038481166000908152600760205260409020600201541615610ac857604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526101b1919060040161137e565b60006040518060800160405280846005811115610ae757610ae7611180565b8152602081018690526001600160a01b0387166040820152336060909101529050610b13600586610de3565b506001600160a01b03851660009081526007602052604090208151815483929190829060ff19166001836005811115610b4e57610b4e611180565b021790555060208201516001820190610b6790826114b6565b506040828101516002830180546001600160a01b03199081166001600160a01b039384161790915560609094015160039093018054909416928116929092179092559051908616907fd6f3629b08191adb8308c3a65d5f8803b7f8f3e359c433fa7ae623276635e56190610bde908790879061158c565b60405180910390a25050505050565b6000610bf7825490565b92915050565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b6000826005811115610c3657610c36611180565b1480610c8a57506001826005811115610c5157610c51611180565b148015610c8a57506003816005811115610c6d57610c6d611180565b1480610c8a57506004816005811115610c8857610c88611180565b145b80610cdd57506002826005811115610ca457610ca4611180565b148015610cdd57506003816005811115610cc057610cc0611180565b1480610cdd57506004816005811115610cdb57610cdb611180565b145b80610d3057506004826005811115610cf757610cf7611180565b148015610d3057506003816005811115610d1357610d13611180565b1480610d3057506005816005811115610d2e57610d2e611180565b145b80610d6857506003826005811115610d4a57610d4a611180565b148015610d6857506005816005811115610d6657610d66611180565b145b15610d71575050565b60408051808201825260168152751393d11157d4d510551157d393d517d0531313d5d15160521b6020820152905162461bcd60e51b81526101b1919060040161137e565b6000610c1b8383610df8565b6000610c1b836001600160a01b038416610e22565b60606000610c1b83610f15565b6000610c1b836001600160a01b038416610f71565b6000826000018281548110610e0f57610e0f611576565b9060005260206000200154905092915050565b60008181526001830160205260408120548015610f0b576000610e466001836115ae565b8554909150600090610e5a906001906115ae565b9050808214610ebf576000866000018281548110610e7a57610e7a611576565b9060005260206000200154905080876000018481548110610e9d57610e9d611576565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610ed057610ed06115cf565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610bf7565b6000915050610bf7565b606081600001805480602002602001604051908101604052809291908181526020018280548015610f6557602002820191906000526020600020905b815481526020019060010190808311610f51575b50505050509050919050565b6000818152600183016020526040812054610fb857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bf7565b506000610bf7565b508054610fcc906113bb565b6000825580601f10610fdc575050565b601f016020900490600052602060002090810190610ffa9190610ffd565b50565b5b808211156110125760008155600101610ffe565b5090565b80356001600160a01b038116811461102d57600080fd5b919050565b80356006811061102d57600080fd5b6000806040838503121561105457600080fd5b61105d83611016565b915061106b60208401611032565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261109b57600080fd5b813567ffffffffffffffff808211156110b6576110b6611074565b604051601f8301601f19908116603f011681019082821181831017156110de576110de611074565b816040528381528660208588010111156110f757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561112a57600080fd5b61113383611016565b9150602083013567ffffffffffffffff81111561114f57600080fd5b61115b8582860161108a565b9150509250929050565b60006020828403121561117757600080fd5b610c1b82611016565b634e487b7160e01b600052602160045260246000fd5b600681106111b457634e487b7160e01b600052602160045260246000fd5b9052565b60005b838110156111d35781810151838201526020016111bb565b50506000910152565b600081518084526111f48160208601602086016111b8565b601f01601f19169290920160200192915050565b611213828251611196565b600060208201516080602085015261122e60808501826111dc565b6040848101516001600160a01b03908116918701919091526060948501511693909401929092525090919050565b602081526000610c1b6020830184611208565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156112c657603f198886030184526112b4858351611208565b94509285019290850190600101611298565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156113145783516001600160a01b0316835292840192918401916001016112ef565b50909695505050505050565b60008060006060848603121561133557600080fd5b61133e84611016565b9250602084013567ffffffffffffffff81111561135a57600080fd5b6113668682870161108a565b92505061137560408501611032565b90509250925092565b602081526000610c1b60208301846111dc565b60208101610bf78284611196565b600082516113b18184602087016111b8565b9190910192915050565b600181811c908216806113cf57607f821691505b60208210810361084857634e487b7160e01b600052602260045260246000fd5b60008083546113fd816113bb565b60018281168015611415576001811461142a57611459565b60ff1984168752821515830287019450611459565b8760005260208060002060005b858110156114505781548a820152908401908201611437565b50505082870194505b50929695505050505050565b601f8211156114b1576000816000526020600020601f850160051c8101602086101561148e5750805b601f850160051c820191505b818110156114ad5782815560010161149a565b5050505b505050565b815167ffffffffffffffff8111156114d0576114d0611074565b6114e4816114de84546113bb565b84611465565b602080601f83116001811461151957600084156115015750858301515b600019600386901b1c1916600185901b1785556114ad565b600085815260208120601f198616915b8281101561154857888601518255948401946001909101908401611529565b50858210156115665787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b60408152600061159f60408301856111dc565b9050610c1b6020830184611196565b81810381811115610bf757634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd","sourceMap":"528:3411:178:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2849:91;;;:::i;:::-;;;160:25:514;;;148:2;133:18;2849:91:178;;;;;;;;1728:394;;;;;;:::i;:::-;;:::i;:::-;;2126:453;;;;;;:::i;:::-;;:::i;2583:262::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3055:254::-;;;:::i;:::-;;;;;;;:::i;1248:476::-;;;;;;:::i;:::-;;:::i;2944:107::-;;;:::i;:::-;;;;;;;:::i;643:601::-;;;;;;:::i;:::-;;:::i;2849:91::-;2896:7;2918:17;:8;:15;:17::i;:::-;2911:24;;2849:91;:::o;1728:394::-;-1:-1:-1;;;;;2899:22:184;;;2945:1;2899:22;;;:16;:22;;;;;:34;;;1832:11:178;;2899:34:184;2895:102;;2962:34;;;;;;;;;;;-1:-1:-1;;;2962:34:184;;;;2955:42;;-1:-1:-1;;;2955:42:184;;;;2962:34;2955:42;;;:::i;:::-;;;;;;;;2895:102;1862:10:178::1;3064:31:184;:12;1862:10:178::0;3064:21:184::1;:31::i;:::-;3059:74;;3104:28;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3104:28:184::1;::::0;::::1;::::0;3097:36;;-1:-1:-1;;;3097:36:184;;::::1;::::0;3104:28;3097:36:::1;;;:::i;3059:74::-;-1:-1:-1::0;;;;;3350:22:184;;::::2;:2;:22:::0;;;:16:::2;:22;::::0;;;;:31:::2;;::::0;1895:11:178;;1908:10:::2;::::0;3350:31:184::2;:43:::0;::::2;3346:91;;3408:28;::::0;;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;3408:28:184::2;::::0;::::2;::::0;3401:36;;-1:-1:-1;;;3401:36:184;;::::2;::::0;3408:28;3401:36:::2;;;:::i;3346:91::-;-1:-1:-1::0;;;;;1948:29:178;::::3;1928:17;1948:29:::0;;;:16:::3;:29;::::0;;;;2016:11;;1984:52:::3;::::0;2016:11:::3;;2029:6:::0;1984:31:::3;:52::i;:::-;2043:20:::0;;2057:6;;2043:4;;-1:-1:-1;;2043:20:178::3;::::0;2057:6;2043:20:::3;::::0;::::3;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;2092:16:178::3;::::0;::::3;::::0;2074:43:::3;::::0;-1:-1:-1;;;;;2092:16:178;;::::3;::::0;2074:43:::3;::::0;::::3;::::0;2110:6;;2074:43:::3;:::i;:::-;;;;;;;;1922:200;3139:1:184::2;;3003::::1;1728:394:178::0;;;:::o;2126:453::-;2231:10;3064:31:184;:12;2231:10:178;3064:21:184;:31::i;:::-;3059:74;;3104:28;;;;;;;;;;;-1:-1:-1;;;3104:28:184;;;;3097:36;;-1:-1:-1;;;3097:36:184;;;;3104:28;3097:36;;;:::i;3059:74::-;-1:-1:-1;;;;;2899:22:184;;::::1;2945:1;2899:22:::0;;;:16:::1;:22;::::0;;;;:34:::1;;::::0;2256:11:178;;2899:34:184::1;2895:102;;2962:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;2962:34:184::1;::::0;::::1;::::0;2955:42;;-1:-1:-1;;;2955:42:184;;::::1;::::0;2962:34;2955:42:::1;;;:::i;2895:102::-;-1:-1:-1::0;;;;;3350:22:184;;::::2;:2;:22:::0;;;:16:::2;:22;::::0;;;;:31:::2;;::::0;2290:11:178;;2303:10:::2;::::0;3350:31:184::2;:43:::0;::::2;3346:91;;3408:28;::::0;;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;3408:28:184::2;::::0;::::2;::::0;3401:36;;-1:-1:-1;;;3401:36:184;;::::2;::::0;3408:28;3401:36:::2;;;:::i;3346:91::-;-1:-1:-1::0;;;;;2343:29:178;::::3;2323:17;2343:29:::0;;;:16:::3;:29;::::0;;;;;;;;2441:21;;::::3;::::0;2458:3;;2441:21:::3;;:::i;:::-;;;;;;;;;;;;;2431:32;;;;;;2417:4;:8;;2400:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;2390:37;;;;;;:73:::0;2379:126:::3;;2477:27;::::0;;;;::::3;::::0;;::::3;::::0;;-1:-1:-1;;;2477:27:178::3;::::0;::::3;::::0;2470:35;;-1:-1:-1;;;2470:35:178;;::::3;::::0;2477:27;2470:35:::3;;;:::i;2379:126::-;2512:8;::::0;::::3;:14;2523:3:::0;2512:8;:14:::3;:::i;:::-;-1:-1:-1::0;2552:16:178::3;::::0;::::3;::::0;2537:37:::3;::::0;-1:-1:-1;;;;;2552:16:178;;::::3;::::0;2537:37:::3;::::0;::::3;::::0;2570:3;;2537:37:::3;:::i;2583:262::-:0;2644:11;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2644:11:178;2717:30;:8;2735:11;2717:17;:30::i;:::-;2712:85;;2762:34;;;;;;;;;;;-1:-1:-1;;;2762:34:178;;;;2755:42;;-1:-1:-1;;;2755:42:178;;;;2762:34;2755:42;;;:::i;2712:85::-;-1:-1:-1;;;;;2811:29:178;;:2;:29;;;:16;:29;;;;;;;2804:36;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2804:36:178;;;-1:-1:-1;;2804:36:178;;;;-1:-1:-1;;;;;2804:36:178;;;;;;;;;;;;;;;;;;;;;2583:262;-1:-1:-1;;2583:262:178:o;3055:254::-;3101:13;3122:19;3155:17;:8;:15;:17::i;:::-;3144:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3144:29:178;;;;;;;;;;;;;;;;;3122:51;;3185:9;3180:106;3204:17;:8;:15;:17::i;:::-;3200:1;:21;3180:106;;;3247:16;:2;3264:14;:8;3276:1;3264:11;:14::i;:::-;-1:-1:-1;;;;;3247:32:178;;;;;;;;;;;;;;-1:-1:-1;3247:32:178;3236:43;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3236:43:178;;;-1:-1:-1;;3236:43:178;;;;-1:-1:-1;;;;;3236:43:178;;;;;;;;;;;;;;;;;;;;:8;;:5;;3242:1;;3236:8;;;;;;:::i;:::-;;;;;;;;;;:43;3223:3;;3180:106;;;-1:-1:-1;3299:5:178;3055:254;-1:-1:-1;3055:254:178:o;1248:476::-;-1:-1:-1;;;;;3350:22:184;;;:2;:22;;;:16;:22;;;;;:31;;;1323:11:178;;1336:10;;3350:31:184;:43;;3346:91;;3408:28;;;;;;;;;;;-1:-1:-1;;;3408:28:184;;;;3401:36;;-1:-1:-1;;;3401:36:184;;;;3408:28;3401:36;;;:::i;3346:91::-;-1:-1:-1;;;;;1358:29:178;;::::1;1411:1;1358:29:::0;;;:16:::1;:29;::::0;;;;:41:::1;;::::0;::::1;1354:118;;1430:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1430:34:178::1;::::0;::::1;::::0;1423:42;;-1:-1:-1;;;1423:42:178;;::::1;::::0;1430:34;1423:42:::1;;;:::i;1354:118::-;1522:18;-1:-1:-1::0;;;;;1482:29:178;::::1;:2;:29:::0;;;:16:::1;:29;::::0;;;;:36;::::1;;:58;::::0;::::1;;;;;;:::i;:::-;;1478:129;;1557:42;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1557:42:178::1;::::0;::::1;::::0;1550:50;;-1:-1:-1;;;1550:50:178;;::::1;::::0;1557:42;1550:50:::1;;;:::i;1478:129::-;1613:28;:8;1629:11:::0;1613:15:::1;:28::i;:::-;-1:-1:-1::0;;;;;;1654:29:178;::::1;:2;:29:::0;;;:16:::1;:29;::::0;;;;1647:36;;-1:-1:-1;;1647:36:178::1;::::0;;1654:29;1647:36:::1;::::0;;::::1;1654:2:::0;1647:36:::1;:::i;:::-;-1:-1:-1::0;1647:36:178::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;1647:36:178;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;1695:24:::1;::::0;-1:-1:-1;;;;;1695:24:178;::::1;::::0;::::1;::::0;1647:36:::1;::::0;1695:24:::1;1248:476:::0;;;:::o;2944:107::-;2998:16;3029:17;:8;:15;:17::i;643:601::-;762:10;3064:31:184;:12;762:10:178;3064:21:184;:31::i;:::-;3059:74;;3104:28;;;;;;;;;;;-1:-1:-1;;;3104:28:184;;;;3097:36;;-1:-1:-1;;;3097:36:184;;;;3104:28;3097:36;;;:::i;3059:74::-;-1:-1:-1;;;;;845:29:178;;::::1;898:1;845:29:::0;;;:16:::1;:29;::::0;;;;:41:::1;;::::0;::::1;:55:::0;841:109:::1;;915:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;915:34:178::1;::::0;::::1;::::0;908:42;;-1:-1:-1;;;908:42:178;;::::1;::::0;915:34;908:42:::1;;;:::i;841:109::-;957:19;979:110;;;;;;;;1048:6;979:110;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;979:110:178;::::1;::::0;;;;1072:10:::1;979:110:::0;;;;;957:132;-1:-1:-1;1096:25:178::1;:8;1005:11:::0;1096:12:::1;:25::i;:::-;-1:-1:-1::0;;;;;;1153:29:178;::::1;:2;:29:::0;;;:16:::1;:29;::::0;;;;:39;;;;1185:7;;1153:29;:39;:29;;-1:-1:-1;;1153:39:178::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;1153:39:178::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;1153:39:178::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;1153:39:178;;::::1;-1:-1:-1::0;;;;;1153:39:178;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;1204:35;;;;::::1;::::0;::::1;::::0;::::1;::::0;1227:3;;1232:6;;1204:35:::1;:::i;:::-;;;;;;;;774:470;643:601:::0;;;;:::o;9117:115:447:-;9180:7;9206:19;9214:3;4556:18;;4474:107;9206:19;9199:26;9117:115;-1:-1:-1;;9117:115:447:o;8871:165::-;-1:-1:-1;;;;;9004:23:447;;8951:4;4360:21;;;:14;;;:21;;;;;;:26;;8974:55;8967:62;8871:165;-1:-1:-1;;;8871:165:447:o;3313:624:178:-;3437:25;3429:4;:33;;;;;;;;:::i;:::-;;:141;;;-1:-1:-1;3481:21:178;3473:4;:29;;;;;;;;:::i;:::-;;:96;;;;-1:-1:-1;3521:17:178;3515:2;:23;;;;;;;;:::i;:::-;;:53;;;-1:-1:-1;3548:20:178;3542:2;:26;;;;;;;;:::i;:::-;;3515:53;3429:250;;;-1:-1:-1;3589:22:178;3581:4;:30;;;;;;;;:::i;:::-;;:97;;;;-1:-1:-1;3630:17:178;3624:2;:23;;;;;;;;:::i;:::-;;:53;;;-1:-1:-1;3657:20:178;3651:2;:26;;;;;;;;:::i;:::-;;3624:53;3429:355;;;-1:-1:-1;3698:20:178;3690:4;:28;;;;;;;;:::i;:::-;;:93;;;;-1:-1:-1;3737:17:178;3731:2;:23;;;;;;;;:::i;:::-;;:51;;;-1:-1:-1;3764:18:178;3758:2;:24;;;;;;;;:::i;:::-;;3731:51;3429:420;;;-1:-1:-1;3803:17:178;3795:4;:25;;;;;;;;:::i;:::-;;:53;;;;-1:-1:-1;3830:18:178;3824:2;:24;;;;;;;;:::i;:::-;;3795:53;3418:459;;;3313:624;;:::o;3418:459::-;3889:42;;;;;;;;;;;-1:-1:-1;;;3889:42:178;;;;3882:50;;-1:-1:-1;;;3882:50:178;;;;3889:42;3882:50;;;:::i;9574:156:447:-;9648:7;9698:22;9702:3;9714:5;9698:3;:22::i;8634:156::-;8707:4;8730:53;8738:3;-1:-1:-1;;;;;8758:23:447;;8730:7;:53::i;10270:300::-;10333:16;10361:22;10386:19;10394:3;10386:7;:19::i;8316:150::-;8386:4;8409:50;8414:3;-1:-1:-1;;;;;8434:23:447;;8409:4;:50::i;4923:118::-;4990:7;5016:3;:11;;5028:5;5016:18;;;;;;;;:::i;:::-;;;;;;;;;5009:25;;4923:118;;;;:::o;2815:1368::-;2881:4;3010:21;;;:14;;;:21;;;;;;3046:13;;3042:1135;;3413:18;3434:12;3445:1;3434:8;:12;:::i;:::-;3480:18;;3413:33;;-1:-1:-1;3460:17:447;;3480:22;;3501:1;;3480:22;:::i;:::-;3460:42;;3535:9;3521:10;:23;3517:378;;3564:17;3584:3;:11;;3596:9;3584:22;;;;;;;;:::i;:::-;;;;;;;;;3564:42;;3731:9;3705:3;:11;;3717:10;3705:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;3844:25;;;:14;;;:25;;;;;:36;;;3517:378;3973:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4076:3;:14;;:21;4091:5;4076:21;;;;;;;;;;;4069:28;;;4119:4;4112:11;;;;;;;3042:1135;4161:5;4154:12;;;;;5581:109;5637:16;5672:3;:11;;5665:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5581:109;;;:::o;2241:406::-;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:447;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:447;2618:12;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;196:173:514:-;264:20;;-1:-1:-1;;;;;313:31:514;;303:42;;293:70;;359:1;356;349:12;293:70;196:173;;;:::o;374:151::-;450:20;;499:1;489:12;;479:40;;515:1;512;505:12;530:284;614:6;622;675:2;663:9;654:7;650:23;646:32;643:52;;;691:1;688;681:12;643:52;714:29;733:9;714:29;:::i;:::-;704:39;;762:46;804:2;793:9;789:18;762:46;:::i;:::-;752:56;;530:284;;;;;:::o;819:127::-;880:10;875:3;871:20;868:1;861:31;911:4;908:1;901:15;935:4;932:1;925:15;951:719;994:5;1047:3;1040:4;1032:6;1028:17;1024:27;1014:55;;1065:1;1062;1055:12;1014:55;1101:6;1088:20;1127:18;1164:2;1160;1157:10;1154:36;;;1170:18;;:::i;:::-;1245:2;1239:9;1213:2;1299:13;;-1:-1:-1;;1295:22:514;;;1319:2;1291:31;1287:40;1275:53;;;1343:18;;;1363:22;;;1340:46;1337:72;;;1389:18;;:::i;:::-;1429:10;1425:2;1418:22;1464:2;1456:6;1449:18;1510:3;1503:4;1498:2;1490:6;1486:15;1482:26;1479:35;1476:55;;;1527:1;1524;1517:12;1476:55;1591:2;1584:4;1576:6;1572:17;1565:4;1557:6;1553:17;1540:54;1638:1;1631:4;1626:2;1618:6;1614:15;1610:26;1603:37;1658:6;1649:15;;;;;;951:719;;;;:::o;1675:396::-;1753:6;1761;1814:2;1802:9;1793:7;1789:23;1785:32;1782:52;;;1830:1;1827;1820:12;1782:52;1853:29;1872:9;1853:29;:::i;:::-;1843:39;;1933:2;1922:9;1918:18;1905:32;1960:18;1952:6;1949:30;1946:50;;;1992:1;1989;1982:12;1946:50;2015;2057:7;2048:6;2037:9;2033:22;2015:50;:::i;:::-;2005:60;;;1675:396;;;;;:::o;2076:186::-;2135:6;2188:2;2176:9;2167:7;2163:23;2159:32;2156:52;;;2204:1;2201;2194:12;2156:52;2227:29;2246:9;2227:29;:::i;2267:127::-;2328:10;2323:3;2319:20;2316:1;2309:31;2359:4;2356:1;2349:15;2383:4;2380:1;2373:15;2399:238;2481:1;2474:5;2471:12;2461:143;;2526:10;2521:3;2517:20;2514:1;2507:31;2561:4;2558:1;2551:15;2589:4;2586:1;2579:15;2461:143;2613:18;;2399:238::o;2642:250::-;2727:1;2737:113;2751:6;2748:1;2745:13;2737:113;;;2827:11;;;2821:18;2808:11;;;2801:39;2773:2;2766:10;2737:113;;;-1:-1:-1;;2884:1:514;2866:16;;2859:27;2642:250::o;2897:271::-;2939:3;2977:5;2971:12;3004:6;2999:3;2992:19;3020:76;3089:6;3082:4;3077:3;3073:14;3066:4;3059:5;3055:16;3020:76;:::i;:::-;3150:2;3129:15;-1:-1:-1;;3125:29:514;3116:39;;;;3157:4;3112:50;;2897:271;-1:-1:-1;;2897:271:514:o;3173:506::-;3238:45;3279:3;3271:5;3265:12;3238:45;:::i;:::-;3220:3;3329:4;3322:5;3318:16;3312:23;3367:4;3360;3355:3;3351:14;3344:28;3393:47;3434:4;3429:3;3425:14;3411:12;3393:47;:::i;:::-;3488:4;3477:16;;;3471:23;-1:-1:-1;;;;;3564:23:514;;;3548:14;;;3541:47;;;;3641:4;3630:16;;;3624:23;3620:32;3604:14;;;;3597:56;;;;-1:-1:-1;3381:59:514;;3173:506;-1:-1:-1;3173:506:514:o;3684:251::-;3859:2;3848:9;3841:21;3822:4;3879:50;3925:2;3914:9;3910:18;3902:6;3879:50;:::i;3940:834::-;4128:4;4157:2;4197;4186:9;4182:18;4227:2;4216:9;4209:21;4250:6;4285;4279:13;4316:6;4308;4301:22;4354:2;4343:9;4339:18;4332:25;;4416:2;4406:6;4403:1;4399:14;4388:9;4384:30;4380:39;4366:53;;4454:2;4446:6;4442:15;4475:1;4485:260;4499:6;4496:1;4493:13;4485:260;;;4592:2;4588:7;4576:9;4568:6;4564:22;4560:36;4555:3;4548:49;4620:45;4658:6;4649;4643:13;4620:45;:::i;:::-;4610:55;-1:-1:-1;4723:12:514;;;;4688:15;;;;4521:1;4514:9;4485:260;;;-1:-1:-1;4762:6:514;;3940:834;-1:-1:-1;;;;;;;3940:834:514:o;4779:658::-;4950:2;5002:21;;;5072:13;;4975:18;;;5094:22;;;4921:4;;4950:2;5173:15;;;;5147:2;5132:18;;;4921:4;5216:195;5230:6;5227:1;5224:13;5216:195;;;5295:13;;-1:-1:-1;;;;;5291:39:514;5279:52;;5386:15;;;;5351:12;;;;5327:1;5245:9;5216:195;;;-1:-1:-1;5428:3:514;;4779:658;-1:-1:-1;;;;;;4779:658:514:o;5442:494::-;5545:6;5553;5561;5614:2;5602:9;5593:7;5589:23;5585:32;5582:52;;;5630:1;5627;5620:12;5582:52;5653:29;5672:9;5653:29;:::i;:::-;5643:39;;5733:2;5722:9;5718:18;5705:32;5760:18;5752:6;5749:30;5746:50;;;5792:1;5789;5782:12;5746:50;5815;5857:7;5848:6;5837:9;5833:22;5815:50;:::i;:::-;5805:60;;;5884:46;5926:2;5915:9;5911:18;5884:46;:::i;:::-;5874:56;;5442:494;;;;;:::o;5941:220::-;6090:2;6079:9;6072:21;6053:4;6110:45;6151:2;6140:9;6136:18;6128:6;6110:45;:::i;6166:211::-;6314:2;6299:18;;6326:45;6303:9;6353:6;6326:45;:::i;6382:289::-;6513:3;6551:6;6545:13;6567:66;6626:6;6621:3;6614:4;6606:6;6602:17;6567:66;:::i;:::-;6649:16;;;;;6382:289;-1:-1:-1;;6382:289:514:o;6676:380::-;6755:1;6751:12;;;;6798;;;6819:61;;6873:4;6865:6;6861:17;6851:27;;6819:61;6926:2;6918:6;6915:14;6895:18;6892:38;6889:161;;6972:10;6967:3;6963:20;6960:1;6953:31;7007:4;7004:1;6997:15;7035:4;7032:1;7025:15;7187:843;7315:3;7344:1;7377:6;7371:13;7407:36;7433:9;7407:36;:::i;:::-;7462:1;7479:17;;;7505:133;;;;7652:1;7647:358;;;;7472:533;;7505:133;-1:-1:-1;;7538:24:514;;7526:37;;7611:14;;7604:22;7592:35;;7583:45;;;-1:-1:-1;7505:133:514;;7647:358;7678:6;7675:1;7668:17;7708:4;7753;7750:1;7740:18;7780:1;7794:165;7808:6;7805:1;7802:13;7794:165;;;7886:14;;7873:11;;;7866:35;7929:16;;;;7823:10;;7794:165;;;7798:3;;;7988:6;7983:3;7979:16;7972:23;;7472:533;-1:-1:-1;8021:3:514;;7187:843;-1:-1:-1;;;;;;7187:843:514:o;8035:543::-;8137:2;8132:3;8129:11;8126:446;;;8173:1;8197:5;8194:1;8187:16;8241:4;8238:1;8228:18;8311:2;8299:10;8295:19;8292:1;8288:27;8282:4;8278:38;8347:4;8335:10;8332:20;8329:47;;;-1:-1:-1;8370:4:514;8329:47;8425:2;8420:3;8416:12;8413:1;8409:20;8403:4;8399:31;8389:41;;8480:82;8498:2;8491:5;8488:13;8480:82;;;8543:17;;;8524:1;8513:13;8480:82;;;8484:3;;;8126:446;8035:543;;;:::o;8754:1345::-;8880:3;8874:10;8907:18;8899:6;8896:30;8893:56;;;8929:18;;:::i;:::-;8958:97;9048:6;9008:38;9040:4;9034:11;9008:38;:::i;:::-;9002:4;8958:97;:::i;:::-;9110:4;;9167:2;9156:14;;9184:1;9179:663;;;;9886:1;9903:6;9900:89;;;-1:-1:-1;9955:19:514;;;9949:26;9900:89;-1:-1:-1;;8711:1:514;8707:11;;;8703:24;8699:29;8689:40;8735:1;8731:11;;;8686:57;10002:81;;9149:944;;9179:663;7134:1;7127:14;;;7171:4;7158:18;;-1:-1:-1;;9215:20:514;;;9333:236;9347:7;9344:1;9341:14;9333:236;;;9436:19;;;9430:26;9415:42;;9528:27;;;;9496:1;9484:14;;;;9363:19;;9333:236;;;9337:3;9597:6;9588:7;9585:19;9582:201;;;9658:19;;;9652:26;-1:-1:-1;;9741:1:514;9737:14;;;9753:3;9733:24;9729:37;9725:42;9710:58;9695:74;;9582:201;-1:-1:-1;;;;;9829:1:514;9813:14;;;9809:22;9796:36;;-1:-1:-1;8754:1345:514:o;10104:127::-;10165:10;10160:3;10156:20;10153:1;10146:31;10196:4;10193:1;10186:15;10220:4;10217:1;10210:15;10236:325;10427:2;10416:9;10409:21;10390:4;10447:45;10488:2;10477:9;10473:18;10465:6;10447:45;:::i;:::-;10439:53;;10501:54;10551:2;10540:9;10536:18;10528:6;10501:54;:::i;10566:225::-;10633:9;;;10654:11;;;10651:134;;;10707:10;10702:3;10698:20;10695:1;10688:31;10742:4;10739:1;10732:15;10770:4;10767:1;10760:15;10796:127;10857:10;10852:3;10848:20;10845:1;10838:31;10888:4;10885:1;10878:15;10912:4;10909:1;10902:15","linkReferences":{}},"methodIdentifiers":{"getAllNodeAddresses()":"c8fe3a01","getAllNodes()":"a1174e7d","getNode(address)":"9d209048","getNodeCount()":"39bf397e","registerNode(address,string,uint8)":"eecc66f4","removeNode(address)":"b2b99ec9","updateNodeStatus(address,uint8)":"581f8b9b","updateNodeUrl(address,string)":"7e4465e7"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"NodeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"NodeRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"NodeStatusUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"}],\"name\":\"NodeUrlUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"getAllNodeAddresses\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllNodes\",\"outputs\":[{\"components\":[{\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"internalType\":\"struct Node[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"getNode\",\"outputs\":[{\"components\":[{\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"internalType\":\"struct Node\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodeCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"registerNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"removeNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"enum NodeStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"updateNodeStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"}],\"name\":\"updateNodeUrl\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAllNodeAddresses()\":{\"details\":\"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.\"},\"getAllNodes()\":{\"details\":\"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAllNodeAddresses()\":{\"notice\":\"Return array containing all node addresses\"},\"getAllNodes()\":{\"notice\":\"Return array containing all nodes\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/river/registry/facets/node/NodeRegistry.sol\":\"NodeRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/river/registry/facets/node/INodeRegistry.sol\":{\"keccak256\":\"0x1f64f644ca9a6bfa00f2b4fe5242d7bf4a2410a3b0619e5f31813bf84d51f30a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://879e826a7772b560cfa439f2a352fbe378900ec4e8ab636b3f023e36f43b7fb5\",\"dweb:/ipfs/QmeVW4Kuji8B3p8D8NaruxBzQPutPMYiXxcMpfrvGFwjhZ\"]},\"contracts/src/river/registry/facets/node/NodeRegistry.sol\":{\"keccak256\":\"0x36153c58edd2ec86b4b5476955e7a4ab0f19332112179a8a28fdd10512b68a39\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6ef08c0ea25f34ed52a506be080bee1d260a2493f2762929032e6cce56d478d2\",\"dweb:/ipfs/QmZqXgxo5Vhi3E1SnWwXrGPPG83V4ggjH7eMbo687kkX4r\"]},\"contracts/src/river/registry/libraries/RegistryErrors.sol\":{\"keccak256\":\"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3\",\"dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy\"]},\"contracts/src/river/registry/libraries/RegistryStorage.sol\":{\"keccak256\":\"0xb365ca80cf19bebeee5c5512b1982e660d0d31043f8bb4864f26e02ec70a117b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f2ddea5237c67ec769cf0da7f8da4131979ed34f9c2ad0495c87b65b1ea88e01\",\"dweb:/ipfs/QmQBy2AnbwwTopyCrdcW9cSYPaLpmXRqswxUv5dWYbza1q\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address","indexed":true},{"internalType":"string","name":"url","type":"string","indexed":false},{"internalType":"enum NodeStatus","name":"status","type":"uint8","indexed":false}],"type":"event","name":"NodeAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address","indexed":true}],"type":"event","name":"NodeRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address","indexed":true},{"internalType":"enum NodeStatus","name":"status","type":"uint8","indexed":false}],"type":"event","name":"NodeStatusUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address","indexed":true},{"internalType":"string","name":"url","type":"string","indexed":false}],"type":"event","name":"NodeUrlUpdated","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"getAllNodeAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getAllNodes","outputs":[{"internalType":"struct Node[]","name":"","type":"tuple[]","components":[{"internalType":"enum NodeStatus","name":"status","type":"uint8"},{"internalType":"string","name":"url","type":"string"},{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"address","name":"operator","type":"address"}]}]},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"view","type":"function","name":"getNode","outputs":[{"internalType":"struct Node","name":"","type":"tuple","components":[{"internalType":"enum NodeStatus","name":"status","type":"uint8"},{"internalType":"string","name":"url","type":"string"},{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"address","name":"operator","type":"address"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getNodeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"string","name":"url","type":"string"},{"internalType":"enum NodeStatus","name":"status","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"registerNode"},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeNode"},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"enum NodeStatus","name":"status","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"updateNodeStatus"},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"},{"internalType":"string","name":"url","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"updateNodeUrl"}],"devdoc":{"kind":"dev","methods":{"getAllNodeAddresses()":{"details":"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block."},"getAllNodes()":{"details":"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block."}},"version":1},"userdoc":{"kind":"user","methods":{"getAllNodeAddresses()":{"notice":"Return array containing all node addresses"},"getAllNodes()":{"notice":"Return array containing all nodes"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/river/registry/facets/node/NodeRegistry.sol":"NodeRegistry"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/river/registry/facets/node/INodeRegistry.sol":{"keccak256":"0x1f64f644ca9a6bfa00f2b4fe5242d7bf4a2410a3b0619e5f31813bf84d51f30a","urls":["bzz-raw://879e826a7772b560cfa439f2a352fbe378900ec4e8ab636b3f023e36f43b7fb5","dweb:/ipfs/QmeVW4Kuji8B3p8D8NaruxBzQPutPMYiXxcMpfrvGFwjhZ"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/node/NodeRegistry.sol":{"keccak256":"0x36153c58edd2ec86b4b5476955e7a4ab0f19332112179a8a28fdd10512b68a39","urls":["bzz-raw://6ef08c0ea25f34ed52a506be080bee1d260a2493f2762929032e6cce56d478d2","dweb:/ipfs/QmZqXgxo5Vhi3E1SnWwXrGPPG83V4ggjH7eMbo687kkX4r"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryErrors.sol":{"keccak256":"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc","urls":["bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3","dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryStorage.sol":{"keccak256":"0xb365ca80cf19bebeee5c5512b1982e660d0d31043f8bb4864f26e02ec70a117b","urls":["bzz-raw://f2ddea5237c67ec769cf0da7f8da4131979ed34f9c2ad0495c87b65b1ea88e01","dweb:/ipfs/QmQBy2AnbwwTopyCrdcW9cSYPaLpmXRqswxUv5dWYbza1q"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":178} \ No newline at end of file diff --git a/packages/generated/v3/abis/NodeRegistry.metadata.json b/packages/generated/v3/abis/NodeRegistry.metadata.json new file mode 100644 index 000000000..828b3190d --- /dev/null +++ b/packages/generated/v3/abis/NodeRegistry.metadata.json @@ -0,0 +1,348 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "string", + "name": "url", + "type": "string", + "indexed": false + }, + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8", + "indexed": false + } + ], + "type": "event", + "name": "NodeAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "NodeRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8", + "indexed": false + } + ], + "type": "event", + "name": "NodeStatusUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "string", + "name": "url", + "type": "string", + "indexed": false + } + ], + "type": "event", + "name": "NodeUrlUpdated", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllNodeAddresses", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllNodes", + "outputs": [ + { + "internalType": "struct Node[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getNode", + "outputs": [ + { + "internalType": "struct Node", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getNodeCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + }, + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "registerNode" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeNode" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "enum NodeStatus", + "name": "status", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "updateNodeStatus" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "updateNodeUrl" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "getAllNodeAddresses()": { + "details": "WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block." + }, + "getAllNodes()": { + "details": "WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getAllNodeAddresses()": { + "notice": "Return array containing all node addresses" + }, + "getAllNodes()": { + "notice": "Return array containing all nodes" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/river/registry/facets/node/NodeRegistry.sol": "NodeRegistry" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/river/registry/facets/node/INodeRegistry.sol": { + "keccak256": "0x1f64f644ca9a6bfa00f2b4fe5242d7bf4a2410a3b0619e5f31813bf84d51f30a", + "urls": [ + "bzz-raw://879e826a7772b560cfa439f2a352fbe378900ec4e8ab636b3f023e36f43b7fb5", + "dweb:/ipfs/QmeVW4Kuji8B3p8D8NaruxBzQPutPMYiXxcMpfrvGFwjhZ" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/node/NodeRegistry.sol": { + "keccak256": "0x36153c58edd2ec86b4b5476955e7a4ab0f19332112179a8a28fdd10512b68a39", + "urls": [ + "bzz-raw://6ef08c0ea25f34ed52a506be080bee1d260a2493f2762929032e6cce56d478d2", + "dweb:/ipfs/QmZqXgxo5Vhi3E1SnWwXrGPPG83V4ggjH7eMbo687kkX4r" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryErrors.sol": { + "keccak256": "0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc", + "urls": [ + "bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3", + "dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryStorage.sol": { + "keccak256": "0xb365ca80cf19bebeee5c5512b1982e660d0d31043f8bb4864f26e02ec70a117b", + "urls": [ + "bzz-raw://f2ddea5237c67ec769cf0da7f8da4131979ed34f9c2ad0495c87b65b1ea88e01", + "dweb:/ipfs/QmQBy2AnbwwTopyCrdcW9cSYPaLpmXRqswxUv5dWYbza1q" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/OperatorRegistry.abi.json b/packages/generated/v3/abis/OperatorRegistry.abi.json new file mode 100644 index 000000000..a42bd18fa --- /dev/null +++ b/packages/generated/v3/abis/OperatorRegistry.abi.json @@ -0,0 +1,180 @@ +[ + { + "type": "function", + "name": "__OperatorRegistry_init", + "inputs": [ + { + "name": "initialOperators", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approveOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorAdded", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorRemoved", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/OperatorRegistry.abi.ts b/packages/generated/v3/abis/OperatorRegistry.abi.ts new file mode 100644 index 000000000..35c946f60 --- /dev/null +++ b/packages/generated/v3/abis/OperatorRegistry.abi.ts @@ -0,0 +1,180 @@ +export default [ + { + "type": "function", + "name": "__OperatorRegistry_init", + "inputs": [ + { + "name": "initialOperators", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approveOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorAdded", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorRemoved", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/OperatorRegistry.bin b/packages/generated/v3/abis/OperatorRegistry.bin new file mode 100644 index 000000000..5e8c37798 --- /dev/null +++ b/packages/generated/v3/abis/OperatorRegistry.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b610705806100d36000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063242cae9f146100515780636d70f7ae14610066578063ac8a584a1461008d578063ba428b1a146100a0575b600080fd5b61006461005f3660046105cb565b6100b3565b005b6100796100743660046105cb565b610110565b604051901515815260200160405180910390f35b61006461009b3660046105cb565b610123565b6100646100ae3660046105f4565b610297565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b03163314610104576040516365f4906560e01b81523360048201526024015b60405180910390fd5b61010d81610328565b50565b600061011d6008836103fa565b92915050565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b0316331461016f576040516365f4906560e01b81523360048201526024016100fb565b61017a6008826103fa565b6101be57604080518082018252601281527113d41154905513d497d393d517d193d5539160721b6020820152905162461bcd60e51b81526100fb9190600401610669565b60005b6101cb600561041f565b811015610253576001600160a01b038216600760006101eb600585610429565b6001600160a01b039081168252602082019290925260400160002060030154160361024b57604080518082018252600d81526c4f55545f4f465f424f554e445360981b6020820152905162461bcd60e51b81526100fb9190600401610669565b6001016101c1565b5061025f600882610435565b506040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166102e157604051630ef4733760e31b815260040160405180910390fd5b60005b818110156103235761031b838383818110610301576103016106b8565b905060200201602081019061031691906105cb565b610328565b6001016102e4565b505050565b6001600160a01b03811661036b5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526100fb9190600401610669565b6103766008826103fa565b156103b757604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526100fb9190600401610669565b6103c260088261044a565b506040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b600061011d825490565b6000610418838361045f565b6000610418836001600160a01b038416610489565b6000610418836001600160a01b03841661057c565b6000826000018281548110610476576104766106b8565b9060005260206000200154905092915050565b600081815260018301602052604081205480156105725760006104ad6001836106ce565b85549091506000906104c1906001906106ce565b90508082146105265760008660000182815481106104e1576104e16106b8565b9060005260206000200154905080876000018481548110610504576105046106b8565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610537576105376106ef565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061011d565b600091505061011d565b60008181526001830160205260408120546105c35750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561011d565b50600061011d565b6000602082840312156105dd57600080fd5b81356001600160a01b038116811461041857600080fd5b6000806020838503121561060757600080fd5b823567ffffffffffffffff8082111561061f57600080fd5b818501915085601f83011261063357600080fd5b81358181111561064257600080fd5b8660208260051b850101111561065757600080fd5b60209290920196919550909350505050565b60006020808352835180602085015260005b818110156106975785810183015185820160400152820161067b565b506000604082860101526040601f19601f8301168501019250505092915050565b634e487b7160e01b600052603260045260246000fd5b8181038181111561011d57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd \ No newline at end of file diff --git a/packages/generated/v3/abis/OperatorRegistry.json b/packages/generated/v3/abis/OperatorRegistry.json new file mode 100644 index 000000000..5e02b0de8 --- /dev/null +++ b/packages/generated/v3/abis/OperatorRegistry.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__OperatorRegistry_init","inputs":[{"name":"initialOperators","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"approveOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"removeOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"OperatorAdded","inputs":[{"name":"operatorAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OperatorRemoved","inputs":[{"name":"operatorAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b610705806100d36000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063242cae9f146100515780636d70f7ae14610066578063ac8a584a1461008d578063ba428b1a146100a0575b600080fd5b61006461005f3660046105cb565b6100b3565b005b6100796100743660046105cb565b610110565b604051901515815260200160405180910390f35b61006461009b3660046105cb565b610123565b6100646100ae3660046105f4565b610297565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b03163314610104576040516365f4906560e01b81523360048201526024015b60405180910390fd5b61010d81610328565b50565b600061011d6008836103fa565b92915050565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b0316331461016f576040516365f4906560e01b81523360048201526024016100fb565b61017a6008826103fa565b6101be57604080518082018252601281527113d41154905513d497d393d517d193d5539160721b6020820152905162461bcd60e51b81526100fb9190600401610669565b60005b6101cb600561041f565b811015610253576001600160a01b038216600760006101eb600585610429565b6001600160a01b039081168252602082019290925260400160002060030154160361024b57604080518082018252600d81526c4f55545f4f465f424f554e445360981b6020820152905162461bcd60e51b81526100fb9190600401610669565b6001016101c1565b5061025f600882610435565b506040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166102e157604051630ef4733760e31b815260040160405180910390fd5b60005b818110156103235761031b838383818110610301576103016106b8565b905060200201602081019061031691906105cb565b610328565b6001016102e4565b505050565b6001600160a01b03811661036b5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526100fb9190600401610669565b6103766008826103fa565b156103b757604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526100fb9190600401610669565b6103c260088261044a565b506040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b600061011d825490565b6000610418838361045f565b6000610418836001600160a01b038416610489565b6000610418836001600160a01b03841661057c565b6000826000018281548110610476576104766106b8565b9060005260206000200154905092915050565b600081815260018301602052604081205480156105725760006104ad6001836106ce565b85549091506000906104c1906001906106ce565b90508082146105265760008660000182815481106104e1576104e16106b8565b9060005260206000200154905080876000018481548110610504576105046106b8565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610537576105376106ef565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061011d565b600091505061011d565b60008181526001830160205260408120546105c35750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561011d565b50600061011d565b6000602082840312156105dd57600080fd5b81356001600160a01b038116811461041857600080fd5b6000806020838503121561060757600080fd5b823567ffffffffffffffff8082111561061f57600080fd5b818501915085601f83011261063357600080fd5b81358181111561064257600080fd5b8660208260051b850101111561065757600080fd5b60209290920196919550909350505050565b60006020808352835180602085015260005b818110156106975785810183015185820160400152820161067b565b506000604082860101526040601f19601f8301168501019250505092915050565b634e487b7160e01b600052603260045260246000fd5b8181038181111561011d57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd","sourceMap":"587:1740:180:-:0;;;;;;;;;;;;-1:-1:-1;385:22:70;:20;:22::i;:::-;587:1740:180;;1653:314:84;303:66:85;1779:14:84;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:84;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:84;1898:16;1886:28;;;;;1927:29;;158:42:514;;;1927:29:84;;146:2:514;131:18;1927:29:84;;;;;;;1844:119;1694:273;1653:314::o;14:192:514:-;587:1740:180;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063242cae9f146100515780636d70f7ae14610066578063ac8a584a1461008d578063ba428b1a146100a0575b600080fd5b61006461005f3660046105cb565b6100b3565b005b6100796100743660046105cb565b610110565b604051901515815260200160405180910390f35b61006461009b3660046105cb565b610123565b6100646100ae3660046105f4565b610297565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b03163314610104576040516365f4906560e01b81523360048201526024015b60405180910390fd5b61010d81610328565b50565b600061011d6008836103fa565b92915050565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b0316331461016f576040516365f4906560e01b81523360048201526024016100fb565b61017a6008826103fa565b6101be57604080518082018252601281527113d41154905513d497d393d517d193d5539160721b6020820152905162461bcd60e51b81526100fb9190600401610669565b60005b6101cb600561041f565b811015610253576001600160a01b038216600760006101eb600585610429565b6001600160a01b039081168252602082019290925260400160002060030154160361024b57604080518082018252600d81526c4f55545f4f465f424f554e445360981b6020820152905162461bcd60e51b81526100fb9190600401610669565b6001016101c1565b5061025f600882610435565b506040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166102e157604051630ef4733760e31b815260040160405180910390fd5b60005b818110156103235761031b838383818110610301576103016106b8565b905060200201602081019061031691906105cb565b610328565b6001016102e4565b505050565b6001600160a01b03811661036b5760408051808201825260078152664241445f41524760c81b6020820152905162461bcd60e51b81526100fb9190600401610669565b6103766008826103fa565b156103b757604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526100fb9190600401610669565b6103c260088261044a565b506040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b600061011d825490565b6000610418838361045f565b6000610418836001600160a01b038416610489565b6000610418836001600160a01b03841661057c565b6000826000018281548110610476576104766106b8565b9060005260206000200154905092915050565b600081815260018301602052604081205480156105725760006104ad6001836106ce565b85549091506000906104c1906001906106ce565b90508082146105265760008660000182815481106104e1576104e16106b8565b9060005260206000200154905080876000018481548110610504576105046106b8565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610537576105376106ef565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061011d565b600091505061011d565b60008181526001830160205260408120546105c35750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561011d565b50600061011d565b6000602082840312156105dd57600080fd5b81356001600160a01b038116811461041857600080fd5b6000806020838503121561060757600080fd5b823567ffffffffffffffff8082111561061f57600080fd5b818501915085601f83011261063357600080fd5b81358181111561064257600080fd5b8660208260051b850101111561065757600080fd5b60209290920196919550909350505050565b60006020808352835180602085015260005b818110156106975785810183015185820160400152820161067b565b506000604082860101526040601f19601f8301168501019250505092915050565b634e487b7160e01b600052603260045260246000fd5b8181038181111561011d57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd","sourceMap":"587:1740:180:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1137:99;;;;;;:::i;:::-;;:::i;:::-;;1240:116;;;;;;:::i;:::-;;:::i;:::-;;;470:14:514;;463:22;445:41;;433:2;418:18;1240:116:180;;;;;;;1360:466;;;;;;:::i;:::-;;:::i;738:220::-;;;;;;:::i;:::-;;:::i;1137:99::-;291:66:98;445:29:96;-1:-1:-1;;;;;445:29:96;286:10;:22;282:79;;325:29;;-1:-1:-1;;;325:29:96;;343:10;325:29;;;1263:51:514;1236:18;;325:29:96;;;;;;;;282:79;1205:26:180::1;1222:8;1205:16;:26::i;:::-;1137:99:::0;:::o;1240:116::-;1301:4;1320:31;:12;1342:8;1320:21;:31::i;:::-;1313:38;1240:116;-1:-1:-1;;1240:116:180:o;1360:466::-;291:66:98;445:29:96;-1:-1:-1;;;;;445:29:96;286:10;:22;282:79;;325:29;;-1:-1:-1;;;325:29:96;;343:10;325:29;;;1263:51:514;1236:18;;325:29:96;1117:203:514;282:79:96;1432:31:180::1;:12;1454:8:::0;1432:21:::1;:31::i;:::-;1427:90;;1478:38;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1478:38:180::1;::::0;::::1;::::0;1471:46;;-1:-1:-1;;;1471:46:180;;::::1;::::0;1478:38;1471:46:::1;;;:::i;1427:90::-;1583:9;1578:171;1602:17;:8;:15;:17::i;:::-;1598:1;:21;1578:171;;;-1:-1:-1::0;;;;;1638:53:180;::::1;:16;:2;1655:14;:8;1667:1:::0;1655:11:::1;:14::i;:::-;-1:-1:-1::0;;;;;1638:32:180;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;1638:32:180;:41:::1;;::::0;::::1;:53:::0;1634:108:::1;;1708:33;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1708:33:180::1;::::0;::::1;::::0;1701:41;;-1:-1:-1;;;1701:41:180;;::::1;::::0;1708:33;1701:41:::1;;;:::i;1634:108::-;1621:3;;1578:171;;;-1:-1:-1::0;1755:29:180::1;:12;1775:8:::0;1755:19:::1;:29::i;:::-;-1:-1:-1::0;1796:25:180::1;::::0;-1:-1:-1;;;;;1796:25:180;::::1;::::0;::::1;::::0;;;::::1;1360:466:::0;:::o;738:220::-;303:66:85;1263:42:84;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:84;;;;;;;;;;;1258:100;853:9:180::1;848:106;868:27:::0;;::::1;848:106;;;910:37;927:16;;944:1;927:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;910:16;:37::i;:::-;897:3;;848:106;;;;738:220:::0;;:::o;2005:320::-;-1:-1:-1;;;;;2101:22:180;;2097:63;;2132:27;;;;;;;;;;;-1:-1:-1;;;2132:27:180;;;;2125:35;;-1:-1:-1;;;2125:35:180;;;;2132:27;2125:35;;;:::i;2097:63::-;2171:31;:12;2193:8;2171:21;:31::i;:::-;2167:85;;;2217:34;;;;;;;;;;;-1:-1:-1;;;2217:34:180;;;;2210:42;;-1:-1:-1;;;2210:42:180;;;;2217:34;2210:42;;;:::i;2167:85::-;2259:26;:12;2276:8;2259:16;:26::i;:::-;-1:-1:-1;2297:23:180;;-1:-1:-1;;;;;2297:23:180;;;;;;;;2005:320;:::o;8871:165:447:-;-1:-1:-1;;;;;9004:23:447;;8951:4;4360:21;;;:14;;;:21;;;;;;:26;;8974:55;8967:62;8871:165;-1:-1:-1;;;8871:165:447:o;9117:115::-;9180:7;9206:19;9214:3;4556:18;;4474:107;9574:156;9648:7;9698:22;9702:3;9714:5;9698:3;:22::i;8634:156::-;8707:4;8730:53;8738:3;-1:-1:-1;;;;;8758:23:447;;8730:7;:53::i;8316:150::-;8386:4;8409:50;8414:3;-1:-1:-1;;;;;8434:23:447;;8409:4;:50::i;4923:118::-;4990:7;5016:3;:11;;5028:5;5016:18;;;;;;;;:::i;:::-;;;;;;;;;5009:25;;4923:118;;;;:::o;2815:1368::-;2881:4;3010:21;;;:14;;;:21;;;;;;3046:13;;3042:1135;;3413:18;3434:12;3445:1;3434:8;:12;:::i;:::-;3480:18;;3413:33;;-1:-1:-1;3460:17:447;;3480:22;;3501:1;;3480:22;:::i;:::-;3460:42;;3535:9;3521:10;:23;3517:378;;3564:17;3584:3;:11;;3596:9;3584:22;;;;;;;;:::i;:::-;;;;;;;;;3564:42;;3731:9;3705:3;:11;;3717:10;3705:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;3844:25;;;:14;;;:25;;;;;:36;;;3517:378;3973:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4076:3;:14;;:21;4091:5;4076:21;;;;;;;;;;;4069:28;;;4119:4;4112:11;;;;;;;3042:1135;4161:5;4154:12;;;;;2241:406;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:447;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:447;2618:12;;14:286:514;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;168:23;;-1:-1:-1;;;;;220:31:514;;210:42;;200:70;;266:1;263;256:12;497:615;583:6;591;644:2;632:9;623:7;619:23;615:32;612:52;;;660:1;657;650:12;612:52;700:9;687:23;729:18;770:2;762:6;759:14;756:34;;;786:1;783;776:12;756:34;824:6;813:9;809:22;799:32;;869:7;862:4;858:2;854:13;850:27;840:55;;891:1;888;881:12;840:55;931:2;918:16;957:2;949:6;946:14;943:34;;;973:1;970;963:12;943:34;1026:7;1021:2;1011:6;1008:1;1004:14;1000:2;996:23;992:32;989:45;986:65;;;1047:1;1044;1037:12;986:65;1078:2;1070:11;;;;;1100:6;;-1:-1:-1;497:615:514;;-1:-1:-1;;;;497:615:514:o;1325:548::-;1437:4;1466:2;1495;1484:9;1477:21;1527:6;1521:13;1570:6;1565:2;1554:9;1550:18;1543:34;1595:1;1605:140;1619:6;1616:1;1613:13;1605:140;;;1714:14;;;1710:23;;1704:30;1680:17;;;1699:2;1676:26;1669:66;1634:10;;1605:140;;;1609:3;1794:1;1789:2;1780:6;1769:9;1765:22;1761:31;1754:42;1864:2;1857;1853:7;1848:2;1840:6;1836:15;1832:29;1821:9;1817:45;1813:54;1805:62;;;;1325:548;;;;:::o;1878:127::-;1939:10;1934:3;1930:20;1927:1;1920:31;1970:4;1967:1;1960:15;1994:4;1991:1;1984:15;2010:225;2077:9;;;2098:11;;;2095:134;;;2151:10;2146:3;2142:20;2139:1;2132:31;2186:4;2183:1;2176:15;2214:4;2211:1;2204:15;2240:127;2301:10;2296:3;2292:20;2289:1;2282:31;2332:4;2329:1;2322:15;2356:4;2353:1;2346:15","linkReferences":{}},"methodIdentifiers":{"__OperatorRegistry_init(address[])":"ba428b1a","approveOperator(address)":"242cae9f","isOperator(address)":"6d70f7ae","removeOperator(address)":"ac8a584a"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operatorAddress\",\"type\":\"address\"}],\"name\":\"OperatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operatorAddress\",\"type\":\"address\"}],\"name\":\"OperatorRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"initialOperators\",\"type\":\"address[]\"}],\"name\":\"__OperatorRegistry_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"approveOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isOperator\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"removeOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/river/registry/facets/operator/OperatorRegistry.sol\":\"OperatorRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/OwnableBase.sol\":{\"keccak256\":\"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4\",\"dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa\"]},\"contracts/src/diamond/facets/ownable/OwnableStorage.sol\":{\"keccak256\":\"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105\",\"dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ\"]},\"contracts/src/river/registry/facets/operator/IOperatorRegistry.sol\":{\"keccak256\":\"0xf0dbf037e3ebc65945ce4e24e16ff8126e96dbc30174059b693a75e9b8213672\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://44c0fa0d32854421ba0d1a9041b0124504d3c9cb4da4d8c4bb77a69645350b10\",\"dweb:/ipfs/QmNUtMBujetyWHo87mSAvkgLRBjEgQwsrpoMdST8LPm6Zb\"]},\"contracts/src/river/registry/facets/operator/OperatorRegistry.sol\":{\"keccak256\":\"0xe4b80ab4faaaf470a46907bbbe9a02783eff94492c4ba9a9d5f681af54bbadff\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b9aa3f826f53fdb824e9f686486efdbcdc9231ca67da5954a33bdbf0f1bc123\",\"dweb:/ipfs/QmaLSPnRmeJPaNSd8RdTA5uyxUfxa8owNnRe2cZvw4W5YP\"]},\"contracts/src/river/registry/libraries/RegistryErrors.sol\":{\"keccak256\":\"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3\",\"dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy\"]},\"contracts/src/river/registry/libraries/RegistryStorage.sol\":{\"keccak256\":\"0xb365ca80cf19bebeee5c5512b1982e660d0d31043f8bb4864f26e02ec70a117b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f2ddea5237c67ec769cf0da7f8da4131979ed34f9c2ad0495c87b65b1ea88e01\",\"dweb:/ipfs/QmQBy2AnbwwTopyCrdcW9cSYPaLpmXRqswxUv5dWYbza1q\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"operatorAddress","type":"address","indexed":true}],"type":"event","name":"OperatorAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"operatorAddress","type":"address","indexed":true}],"type":"event","name":"OperatorRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address[]","name":"initialOperators","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"__OperatorRegistry_init"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"approveOperator"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeOperator"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/river/registry/facets/operator/OperatorRegistry.sol":"OperatorRegistry"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableBase.sol":{"keccak256":"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762","urls":["bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4","dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableStorage.sol":{"keccak256":"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64","urls":["bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105","dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/operator/IOperatorRegistry.sol":{"keccak256":"0xf0dbf037e3ebc65945ce4e24e16ff8126e96dbc30174059b693a75e9b8213672","urls":["bzz-raw://44c0fa0d32854421ba0d1a9041b0124504d3c9cb4da4d8c4bb77a69645350b10","dweb:/ipfs/QmNUtMBujetyWHo87mSAvkgLRBjEgQwsrpoMdST8LPm6Zb"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/operator/OperatorRegistry.sol":{"keccak256":"0xe4b80ab4faaaf470a46907bbbe9a02783eff94492c4ba9a9d5f681af54bbadff","urls":["bzz-raw://1b9aa3f826f53fdb824e9f686486efdbcdc9231ca67da5954a33bdbf0f1bc123","dweb:/ipfs/QmaLSPnRmeJPaNSd8RdTA5uyxUfxa8owNnRe2cZvw4W5YP"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryErrors.sol":{"keccak256":"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc","urls":["bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3","dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryStorage.sol":{"keccak256":"0xb365ca80cf19bebeee5c5512b1982e660d0d31043f8bb4864f26e02ec70a117b","urls":["bzz-raw://f2ddea5237c67ec769cf0da7f8da4131979ed34f9c2ad0495c87b65b1ea88e01","dweb:/ipfs/QmQBy2AnbwwTopyCrdcW9cSYPaLpmXRqswxUv5dWYbza1q"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":180} \ No newline at end of file diff --git a/packages/generated/v3/abis/OperatorRegistry.metadata.json b/packages/generated/v3/abis/OperatorRegistry.metadata.json new file mode 100644 index 000000000..5e91bc560 --- /dev/null +++ b/packages/generated/v3/abis/OperatorRegistry.metadata.json @@ -0,0 +1,351 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operatorAddress", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OperatorAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operatorAddress", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OperatorRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "initialOperators", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__OperatorRegistry_init" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "approveOperator" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isOperator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeOperator" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/river/registry/facets/operator/OperatorRegistry.sol": "OperatorRegistry" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableBase.sol": { + "keccak256": "0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762", + "urls": [ + "bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4", + "dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableStorage.sol": { + "keccak256": "0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64", + "urls": [ + "bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105", + "dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/operator/IOperatorRegistry.sol": { + "keccak256": "0xf0dbf037e3ebc65945ce4e24e16ff8126e96dbc30174059b693a75e9b8213672", + "urls": [ + "bzz-raw://44c0fa0d32854421ba0d1a9041b0124504d3c9cb4da4d8c4bb77a69645350b10", + "dweb:/ipfs/QmNUtMBujetyWHo87mSAvkgLRBjEgQwsrpoMdST8LPm6Zb" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/operator/OperatorRegistry.sol": { + "keccak256": "0xe4b80ab4faaaf470a46907bbbe9a02783eff94492c4ba9a9d5f681af54bbadff", + "urls": [ + "bzz-raw://1b9aa3f826f53fdb824e9f686486efdbcdc9231ca67da5954a33bdbf0f1bc123", + "dweb:/ipfs/QmaLSPnRmeJPaNSd8RdTA5uyxUfxa8owNnRe2cZvw4W5YP" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryErrors.sol": { + "keccak256": "0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc", + "urls": [ + "bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3", + "dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryStorage.sol": { + "keccak256": "0xb365ca80cf19bebeee5c5512b1982e660d0d31043f8bb4864f26e02ec70a117b", + "urls": [ + "bzz-raw://f2ddea5237c67ec769cf0da7f8da4131979ed34f9c2ad0495c87b65b1ea88e01", + "dweb:/ipfs/QmQBy2AnbwwTopyCrdcW9cSYPaLpmXRqswxUv5dWYbza1q" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/OwnableFacet.abi.json b/packages/generated/v3/abis/OwnableFacet.abi.json new file mode 100644 index 000000000..0cf44446d --- /dev/null +++ b/packages/generated/v3/abis/OwnableFacet.abi.json @@ -0,0 +1,135 @@ +[ + { + "type": "function", + "name": "__Ownable_init", + "inputs": [ + { + "name": "owner_", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/OwnableFacet.abi.ts b/packages/generated/v3/abis/OwnableFacet.abi.ts new file mode 100644 index 000000000..6e2c5e89c --- /dev/null +++ b/packages/generated/v3/abis/OwnableFacet.abi.ts @@ -0,0 +1,135 @@ +export default [ + { + "type": "function", + "name": "__Ownable_init", + "inputs": [ + { + "name": "owner_", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/OwnableFacet.bin b/packages/generated/v3/abis/OwnableFacet.bin new file mode 100644 index 000000000..209c6398b --- /dev/null +++ b/packages/generated/v3/abis/OwnableFacet.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b610337806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80638da5cb5b14610046578063d78f00211461006a578063f2fde38b1461007f575b600080fd5b61004e610092565b6040516001600160a01b03909116815260200160405180910390f35b61007d610078366004610307565b6100a1565b005b61007d61008d366004610307565b6100f7565b600061009c61013f565b905090565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166100eb57604051630ef4733760e31b815260040160405180910390fd5b6100f48161016d565b50565b6100ff61013f565b6001600160a01b0316336001600160a01b031614610136576040516365f4906560e01b815233600482015260240160405180910390fd5b6100f481610186565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b61017681610186565b6100f46307f5828d60e41b610229565b600061019061013f565b90506001600160a01b0382166101b957604051634e3ef82560e01b815260040160405180910390fd5b817f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae30080546001600160a01b0319166001600160a01b03928316179055604051838216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146102b6576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff191660011790556102cf565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006020828403121561031957600080fd5b81356001600160a01b038116811461033057600080fd5b939250505056 \ No newline at end of file diff --git a/packages/generated/v3/abis/OwnableFacet.json b/packages/generated/v3/abis/OwnableFacet.json new file mode 100644 index 000000000..c02e9842a --- /dev/null +++ b/packages/generated/v3/abis/OwnableFacet.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__Ownable_init","inputs":[{"name":"owner_","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b610337806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80638da5cb5b14610046578063d78f00211461006a578063f2fde38b1461007f575b600080fd5b61004e610092565b6040516001600160a01b03909116815260200160405180910390f35b61007d610078366004610307565b6100a1565b005b61007d61008d366004610307565b6100f7565b600061009c61013f565b905090565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166100eb57604051630ef4733760e31b815260040160405180910390fd5b6100f48161016d565b50565b6100ff61013f565b6001600160a01b0316336001600160a01b031614610136576040516365f4906560e01b815233600482015260240160405180910390fd5b6100f481610186565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b61017681610186565b6100f46307f5828d60e41b610229565b600061019061013f565b90506001600160a01b0382166101b957604051634e3ef82560e01b815260040160405180910390fd5b817f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae30080546001600160a01b0319166001600160a01b03928316179055604051838216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146102b6576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff191660011790556102cf565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006020828403121561031957600080fd5b81356001600160a01b038116811461033057600080fd5b939250505056","sourceMap":"291:552:97:-:0;;;;;;;;;;;;-1:-1:-1;385:22:70;:20;:22::i;:::-;291:552:97;;1653:314:84;303:66:85;1779:14:84;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:84;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:84;1898:16;1886:28;;;;;1927:29;;158:42:514;;;1927:29:84;;146:2:514;131:18;1927:29:84;;;;;;;1844:119;1694:273;1653:314::o;14:192:514:-;291:552:97;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100415760003560e01c80638da5cb5b14610046578063d78f00211461006a578063f2fde38b1461007f575b600080fd5b61004e610092565b6040516001600160a01b03909116815260200160405180910390f35b61007d610078366004610307565b6100a1565b005b61007d61008d366004610307565b6100f7565b600061009c61013f565b905090565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166100eb57604051630ef4733760e31b815260040160405180910390fd5b6100f48161016d565b50565b6100ff61013f565b6001600160a01b0316336001600160a01b031614610136576040516365f4906560e01b815233600482015260240160405180910390fd5b6100f481610186565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b61017681610186565b6100f46307f5828d60e41b610229565b600061019061013f565b90506001600160a01b0382166101b957604051634e3ef82560e01b815260040160405180910390fd5b817f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae30080546001600160a01b0319166001600160a01b03928316179055604051838216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146102b6576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff191660011790556102cf565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006020828403121561031957600080fd5b81356001600160a01b038116811461033057600080fd5b939250505056","sourceMap":"291:552:97:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;633:75;;;:::i;:::-;;;-1:-1:-1;;;;;178:32:514;;;160:51;;148:2;133:18;633:75:97;;;;;;;348:109;;;;;;:::i;:::-;;:::i;:::-;;738:103;;;;;;:::i;:::-;;:::i;633:75::-;673:7;695:8;:6;:8::i;:::-;688:15;;633:75;:::o;348:109::-;303:66:85;1263:42:84;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:84;;;;;;;;;;;1258:100;420:32:97::1;445:6;420:24;:32::i;:::-;348:109:::0;:::o;738:103::-;300:8:96;:6;:8::i;:::-;-1:-1:-1;;;;;286:22:96;:10;-1:-1:-1;;;;;286:22:96;;282:79;;325:29;;-1:-1:-1;;;325:29:96;;343:10;325:29;;;160:51:514;133:18;;325:29:96;;;;;;;282:79;808:28:97::1;827:8;808:18;:28::i;376:103:96:-:0;291:66:98;445:29:96;-1:-1:-1;;;;;445:29:96;;376:103::o;461:142:97:-;526:26;545:6;526:18;:26::i;:::-;558:40;-1:-1:-1;;;558:13:97;:40::i;483:253:96:-;544:16;563:8;:6;:8::i;:::-;544:27;-1:-1:-1;;;;;;581:22:96;;577:57;;612:22;;-1:-1:-1;;;612:22:96;;;;;;;;;;;577:57;672:8;291:66:98;640:40:96;;-1:-1:-1;;;;;;640:40:96;-1:-1:-1;;;;;640:40:96;;;;;;691;;;;;;;;;;;-1:-1:-1;;691:40:96;538:198;483:253;:::o;452:282:87:-;-1:-1:-1;;;;;;1121:62:87;;1096:4;1121:62;;;303:66:89;1121:62:87;;;;;;;;:70;;:62;:70;510:182;;-1:-1:-1;;;;;;556:62:87;;:49;:62;;;303:66:89;556:62:87;;;;;:69;;-1:-1:-1;;556:69:87;621:4;556:69;;;510:182;;;653:32;;-1:-1:-1;;;653:32:87;;;;;;;;;;;510:182;702:27;;-1:-1:-1;;;;;;702:27:87;;;;;;;;452:282;:::o;222:286:514:-;281:6;334:2;322:9;313:7;309:23;305:32;302:52;;;350:1;347;340:12;302:52;376:23;;-1:-1:-1;;;;;428:31:514;;418:42;;408:70;;474:1;471;464:12;408:70;497:5;222:286;-1:-1:-1;;;222:286:514:o","linkReferences":{}},"methodIdentifiers":{"__Ownable_init(address)":"d78f0021","owner()":"8da5cb5b","transferOwnership(address)":"f2fde38b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner_\",\"type\":\"address\"}],\"name\":\"__Ownable_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"}},\"kind\":\"dev\",\"methods\":{\"owner()\":{\"returns\":{\"_0\":\"The address of the owner.\"}},\"transferOwnership(address)\":{\"details\":\"Set _newOwner to address(0) to renounce any ownership.\",\"params\":{\"_newOwner\":\"The address of the new owner of the contract\"}}},\"version\":1},\"userdoc\":{\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{\"owner()\":{\"notice\":\"Get the address of the owner\"},\"transferOwnership(address)\":{\"notice\":\"Set the address of the new owner of the contract\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/diamond/facets/ownable/OwnableFacet.sol\":\"OwnableFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/OwnableBase.sol\":{\"keccak256\":\"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4\",\"dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa\"]},\"contracts/src/diamond/facets/ownable/OwnableFacet.sol\":{\"keccak256\":\"0x0ee318837fcec7bd0fb366b83076a4f8982c0085f10a3a554ccd688e608e124c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3d8321720036af122a01b085289e3a74f4c5970bc041d746fa8784da82978278\",\"dweb:/ipfs/QmWVkNkhm4UyD3yC4sT3MxECi3NzG7jouxSaXoSveEEKyF\"]},\"contracts/src/diamond/facets/ownable/OwnableStorage.sol\":{\"keccak256\":\"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105\",\"dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"__Ownable_init"},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"}],"devdoc":{"kind":"dev","methods":{"owner()":{"returns":{"_0":"The address of the owner."}},"transferOwnership(address)":{"details":"Set _newOwner to address(0) to renounce any ownership.","params":{"_newOwner":"The address of the new owner of the contract"}}},"version":1},"userdoc":{"kind":"user","methods":{"owner()":{"notice":"Get the address of the owner"},"transferOwnership(address)":{"notice":"Set the address of the new owner of the contract"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/diamond/facets/ownable/OwnableFacet.sol":"OwnableFacet"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableBase.sol":{"keccak256":"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762","urls":["bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4","dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableFacet.sol":{"keccak256":"0x0ee318837fcec7bd0fb366b83076a4f8982c0085f10a3a554ccd688e608e124c","urls":["bzz-raw://3d8321720036af122a01b085289e3a74f4c5970bc041d746fa8784da82978278","dweb:/ipfs/QmWVkNkhm4UyD3yC4sT3MxECi3NzG7jouxSaXoSveEEKyF"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableStorage.sol":{"keccak256":"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64","urls":["bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105","dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"}},"version":1},"id":97} \ No newline at end of file diff --git a/packages/generated/v3/abis/OwnableFacet.metadata.json b/packages/generated/v3/abis/OwnableFacet.metadata.json new file mode 100644 index 000000000..f73404987 --- /dev/null +++ b/packages/generated/v3/abis/OwnableFacet.metadata.json @@ -0,0 +1,294 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__Ownable_init" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "transferOwnership" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "owner()": { + "returns": { + "_0": "The address of the owner." + } + }, + "transferOwnership(address)": { + "details": "Set _newOwner to address(0) to renounce any ownership.", + "params": { + "_newOwner": "The address of the new owner of the contract" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "owner()": { + "notice": "Get the address of the owner" + }, + "transferOwnership(address)": { + "notice": "Set the address of the new owner of the contract" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/diamond/facets/ownable/OwnableFacet.sol": "OwnableFacet" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableBase.sol": { + "keccak256": "0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762", + "urls": [ + "bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4", + "dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableFacet.sol": { + "keccak256": "0x0ee318837fcec7bd0fb366b83076a4f8982c0085f10a3a554ccd688e608e124c", + "urls": [ + "bzz-raw://3d8321720036af122a01b085289e3a74f4c5970bc041d746fa8784da82978278", + "dweb:/ipfs/QmWVkNkhm4UyD3yC4sT3MxECi3NzG7jouxSaXoSveEEKyF" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableStorage.sol": { + "keccak256": "0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64", + "urls": [ + "bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105", + "dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/PrepayFacet.abi.json b/packages/generated/v3/abis/PrepayFacet.abi.json new file mode 100644 index 000000000..fc7ba5cdc --- /dev/null +++ b/packages/generated/v3/abis/PrepayFacet.abi.json @@ -0,0 +1,248 @@ +[ + { + "type": "function", + "name": "__PrepayFacet_init", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "calculateMembershipPrepayFee", + "inputs": [ + { + "name": "supply", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "prepaidMembershipSupply", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "prepayMembership", + "inputs": [ + { + "name": "membership", + "type": "address", + "internalType": "address" + }, + { + "name": "supply", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformFeeRecipientSet", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformMembershipBpsSet", + "inputs": [ + { + "name": "bps", + "type": "uint16", + "indexed": false, + "internalType": "uint16" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformMembershipDurationSet", + "inputs": [ + { + "name": "duration", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformMembershipFeeSet", + "inputs": [ + { + "name": "fee", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformMembershipMintLimitSet", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PrepayBase__Prepaid", + "inputs": [ + { + "name": "membership", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "supply", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Platform__InvalidFeeRecipient", + "inputs": [] + }, + { + "type": "error", + "name": "Platform__InvalidMembershipBps", + "inputs": [] + }, + { + "type": "error", + "name": "Platform__InvalidMembershipDuration", + "inputs": [] + }, + { + "type": "error", + "name": "Platform__InvalidMembershipMintLimit", + "inputs": [] + }, + { + "type": "error", + "name": "PrepayBase__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "PrepayBase__InvalidAmount", + "inputs": [] + }, + { + "type": "error", + "name": "PrepayBase__InvalidMembership", + "inputs": [] + }, + { + "type": "error", + "name": "ReentrancyGuard__ReentrantCall", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/PrepayFacet.abi.ts b/packages/generated/v3/abis/PrepayFacet.abi.ts new file mode 100644 index 000000000..3220f54fb --- /dev/null +++ b/packages/generated/v3/abis/PrepayFacet.abi.ts @@ -0,0 +1,248 @@ +export default [ + { + "type": "function", + "name": "__PrepayFacet_init", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "calculateMembershipPrepayFee", + "inputs": [ + { + "name": "supply", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "prepaidMembershipSupply", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "prepayMembership", + "inputs": [ + { + "name": "membership", + "type": "address", + "internalType": "address" + }, + { + "name": "supply", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformFeeRecipientSet", + "inputs": [ + { + "name": "recipient", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformMembershipBpsSet", + "inputs": [ + { + "name": "bps", + "type": "uint16", + "indexed": false, + "internalType": "uint16" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformMembershipDurationSet", + "inputs": [ + { + "name": "duration", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformMembershipFeeSet", + "inputs": [ + { + "name": "fee", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PlatformMembershipMintLimitSet", + "inputs": [ + { + "name": "limit", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PrepayBase__Prepaid", + "inputs": [ + { + "name": "membership", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "supply", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Platform__InvalidFeeRecipient", + "inputs": [] + }, + { + "type": "error", + "name": "Platform__InvalidMembershipBps", + "inputs": [] + }, + { + "type": "error", + "name": "Platform__InvalidMembershipDuration", + "inputs": [] + }, + { + "type": "error", + "name": "Platform__InvalidMembershipMintLimit", + "inputs": [] + }, + { + "type": "error", + "name": "PrepayBase__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "PrepayBase__InvalidAmount", + "inputs": [] + }, + { + "type": "error", + "name": "PrepayBase__InvalidMembership", + "inputs": [] + }, + { + "type": "error", + "name": "ReentrancyGuard__ReentrantCall", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/PrepayFacet.bin b/packages/generated/v3/abis/PrepayFacet.bin new file mode 100644 index 000000000..5853c8e22 --- /dev/null +++ b/packages/generated/v3/abis/PrepayFacet.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6107a5806100d36000396000f3fe60806040526004361061003f5760003560e01c806327bc79f11461004457806386272406146100765780639262b1b31461008b578063aabe967d146100ab575b600080fd5b34801561005057600080fd5b5061006461005f36600461068c565b6100c0565b60405190815260200160405180910390f35b6100896100843660046106bd565b6100d1565b005b34801561009757600080fd5b506100646100a63660046106e9565b6103bb565b3480156100b757600080fd5b506100896103f8565b60006100cb82610454565b92915050565b60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a00540361011357604051635db5c7cd60e11b815260040160405180910390fd5b61013c60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b8060000361015d57604051632484b54d60e01b815260040160405180910390fd5b6001600160a01b03821661018457604051631ea9dac160e21b815260040160405180910390fd5b6040516301ffc9a760e01b815263421fb7a760e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa1580156101cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f3919061070d565b6102105760405163b2c5c0f360e01b815260040160405180910390fd5b336001600160a01b0316826001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610258573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027c919061072f565b6001600160a01b0316146102a357604051631ea9dac160e21b815260040160405180910390fd5b60006102d67fb29a817dd0719f30ad87abc8dff26e6354077e5b46bf38f34d5ac48732860d02546001600160a01b031690565b905060006102e383610454565b90508034101561030657604051632484b54d60e01b815260040160405180910390fd5b600083856001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036b919061074c565b610375919061077b565b90506103818582610488565b61038b8383610502565b5050506103b760017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b5050565b6001600160a01b03811660009081527f097b4f25b64e012d0cf55f67e9b34fe5d57f15b11b95baa4ddd136b424967c0060205260408120546100cb565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661044257604051630ef4733760e31b815260040160405180910390fd5b610452630cfe7b1160e21b6105ae565b565b600061047e7fb29a817dd0719f30ad87abc8dff26e6354077e5b46bf38f34d5ac48732860d005490565b6100cb908361078e565b60007f097b4f25b64e012d0cf55f67e9b34fe5d57f15b11b95baa4ddd136b424967c006001600160a01b03841660008181526020838152604091829020869055905185815292935090917f884527d8d797310d66e571e2a24daeddc15ae52474ef2c763ab29b60c5678369910160405180910390a2505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461054f576040519150601f19603f3d011682016040523d82523d6000602084013e610554565b606091505b50509050806105a95760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c656400000000604482015260640160405180910390fd5b505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff16151560011461063b576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610654565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006020828403121561069e57600080fd5b5035919050565b6001600160a01b03811681146106ba57600080fd5b50565b600080604083850312156106d057600080fd5b82356106db816106a5565b946020939093013593505050565b6000602082840312156106fb57600080fd5b8135610706816106a5565b9392505050565b60006020828403121561071f57600080fd5b8151801515811461070657600080fd5b60006020828403121561074157600080fd5b8151610706816106a5565b60006020828403121561075e57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156100cb576100cb610765565b80820281158282048414176100cb576100cb61076556 \ No newline at end of file diff --git a/packages/generated/v3/abis/PrepayFacet.json b/packages/generated/v3/abis/PrepayFacet.json new file mode 100644 index 000000000..e117298f3 --- /dev/null +++ b/packages/generated/v3/abis/PrepayFacet.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__PrepayFacet_init","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"calculateMembershipPrepayFee","inputs":[{"name":"supply","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"prepaidMembershipSupply","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"prepayMembership","inputs":[{"name":"membership","type":"address","internalType":"address"},{"name":"supply","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"PlatformFeeRecipientSet","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"PlatformMembershipBpsSet","inputs":[{"name":"bps","type":"uint16","indexed":false,"internalType":"uint16"}],"anonymous":false},{"type":"event","name":"PlatformMembershipDurationSet","inputs":[{"name":"duration","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"PlatformMembershipFeeSet","inputs":[{"name":"fee","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"PlatformMembershipMintLimitSet","inputs":[{"name":"limit","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"PrepayBase__Prepaid","inputs":[{"name":"membership","type":"address","indexed":true,"internalType":"address"},{"name":"supply","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"Platform__InvalidFeeRecipient","inputs":[]},{"type":"error","name":"Platform__InvalidMembershipBps","inputs":[]},{"type":"error","name":"Platform__InvalidMembershipDuration","inputs":[]},{"type":"error","name":"Platform__InvalidMembershipMintLimit","inputs":[]},{"type":"error","name":"PrepayBase__InvalidAddress","inputs":[]},{"type":"error","name":"PrepayBase__InvalidAmount","inputs":[]},{"type":"error","name":"PrepayBase__InvalidMembership","inputs":[]},{"type":"error","name":"ReentrancyGuard__ReentrantCall","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6107a5806100d36000396000f3fe60806040526004361061003f5760003560e01c806327bc79f11461004457806386272406146100765780639262b1b31461008b578063aabe967d146100ab575b600080fd5b34801561005057600080fd5b5061006461005f36600461068c565b6100c0565b60405190815260200160405180910390f35b6100896100843660046106bd565b6100d1565b005b34801561009757600080fd5b506100646100a63660046106e9565b6103bb565b3480156100b757600080fd5b506100896103f8565b60006100cb82610454565b92915050565b60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a00540361011357604051635db5c7cd60e11b815260040160405180910390fd5b61013c60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b8060000361015d57604051632484b54d60e01b815260040160405180910390fd5b6001600160a01b03821661018457604051631ea9dac160e21b815260040160405180910390fd5b6040516301ffc9a760e01b815263421fb7a760e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa1580156101cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f3919061070d565b6102105760405163b2c5c0f360e01b815260040160405180910390fd5b336001600160a01b0316826001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610258573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027c919061072f565b6001600160a01b0316146102a357604051631ea9dac160e21b815260040160405180910390fd5b60006102d67fb29a817dd0719f30ad87abc8dff26e6354077e5b46bf38f34d5ac48732860d02546001600160a01b031690565b905060006102e383610454565b90508034101561030657604051632484b54d60e01b815260040160405180910390fd5b600083856001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036b919061074c565b610375919061077b565b90506103818582610488565b61038b8383610502565b5050506103b760017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b5050565b6001600160a01b03811660009081527f097b4f25b64e012d0cf55f67e9b34fe5d57f15b11b95baa4ddd136b424967c0060205260408120546100cb565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661044257604051630ef4733760e31b815260040160405180910390fd5b610452630cfe7b1160e21b6105ae565b565b600061047e7fb29a817dd0719f30ad87abc8dff26e6354077e5b46bf38f34d5ac48732860d005490565b6100cb908361078e565b60007f097b4f25b64e012d0cf55f67e9b34fe5d57f15b11b95baa4ddd136b424967c006001600160a01b03841660008181526020838152604091829020869055905185815292935090917f884527d8d797310d66e571e2a24daeddc15ae52474ef2c763ab29b60c5678369910160405180910390a2505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461054f576040519150601f19603f3d011682016040523d82523d6000602084013e610554565b606091505b50509050806105a95760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c656400000000604482015260640160405180910390fd5b505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff16151560011461063b576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610654565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006020828403121561069e57600080fd5b5035919050565b6001600160a01b03811681146106ba57600080fd5b50565b600080604083850312156106d057600080fd5b82356106db816106a5565b946020939093013593505050565b6000602082840312156106fb57600080fd5b8135610706816106a5565b9392505050565b60006020828403121561071f57600080fd5b8151801515811461070657600080fd5b60006020828403121561074157600080fd5b8151610706816106a5565b60006020828403121561075e57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156100cb576100cb610765565b80820281158282048414176100cb576100cb61076556","sourceMap":"908:1601:142:-:0;;;;;;;;;;;;-1:-1:-1;385:22:49;:20;:22::i;:::-;908:1601:142;;1653:314:63;303:66:64;1779:14:63;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:63;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:63;1898:16;1886:28;;;;;1927:29;;158:42:375;;;1927:29:63;;146:2:375;131:18;1927:29:63;;;;;;;1844:119;1694:273;1653:314::o;14:192:375:-;908:1601:142;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361061003f5760003560e01c806327bc79f11461004457806386272406146100765780639262b1b31461008b578063aabe967d146100ab575b600080fd5b34801561005057600080fd5b5061006461005f36600461068c565b6100c0565b60405190815260200160405180910390f35b6100896100843660046106bd565b6100d1565b005b34801561009757600080fd5b506100646100a63660046106e9565b6103bb565b3480156100b757600080fd5b506100896103f8565b60006100cb82610454565b92915050565b60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a00540361011357604051635db5c7cd60e11b815260040160405180910390fd5b61013c60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b8060000361015d57604051632484b54d60e01b815260040160405180910390fd5b6001600160a01b03821661018457604051631ea9dac160e21b815260040160405180910390fd5b6040516301ffc9a760e01b815263421fb7a760e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa1580156101cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f3919061070d565b6102105760405163b2c5c0f360e01b815260040160405180910390fd5b336001600160a01b0316826001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610258573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027c919061072f565b6001600160a01b0316146102a357604051631ea9dac160e21b815260040160405180910390fd5b60006102d67fb29a817dd0719f30ad87abc8dff26e6354077e5b46bf38f34d5ac48732860d02546001600160a01b031690565b905060006102e383610454565b90508034101561030657604051632484b54d60e01b815260040160405180910390fd5b600083856001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036b919061074c565b610375919061077b565b90506103818582610488565b61038b8383610502565b5050506103b760017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b5050565b6001600160a01b03811660009081527f097b4f25b64e012d0cf55f67e9b34fe5d57f15b11b95baa4ddd136b424967c0060205260408120546100cb565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661044257604051630ef4733760e31b815260040160405180910390fd5b610452630cfe7b1160e21b6105ae565b565b600061047e7fb29a817dd0719f30ad87abc8dff26e6354077e5b46bf38f34d5ac48732860d005490565b6100cb908361078e565b60007f097b4f25b64e012d0cf55f67e9b34fe5d57f15b11b95baa4ddd136b424967c006001600160a01b03841660008181526020838152604091829020869055905185815292935090917f884527d8d797310d66e571e2a24daeddc15ae52474ef2c763ab29b60c5678369910160405180910390a2505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461054f576040519150601f19603f3d011682016040523d82523d6000602084013e610554565b606091505b50509050806105a95760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c656400000000604482015260640160405180910390fd5b505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff16151560011461063b576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610654565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006020828403121561069e57600080fd5b5035919050565b6001600160a01b03811681146106ba57600080fd5b50565b600080604083850312156106d057600080fd5b82356106db816106a5565b946020939093013593505050565b6000602082840312156106fb57600080fd5b8135610706816106a5565b9392505050565b60006020828403121561071f57600080fd5b8151801515811461070657600080fd5b60006020828403121561074157600080fd5b8151610706816106a5565b60006020828403121561075e57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156100cb576100cb610765565b80820281158282048414176100cb576100cb61076556","sourceMap":"908:1601:142:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2253:133;;;;;;;;;;-1:-1:-1;2253:133:142;;;;;:::i;:::-;;:::i;:::-;;;345:25:375;;;333:2;318:18;2253:133:142;;;;;;;1127:984;;;;;;:::i;:::-;;:::i;:::-;;2115:134;;;;;;;;;;-1:-1:-1;2115:134:142;;;;;:::i;:::-;;:::i;1016:107::-;;;;;;;;;;;;;:::i;2253:133::-;2338:7;2360:21;2374:6;2360:13;:21::i;:::-;2353:28;2253:133;-1:-1:-1;;2253:133:142:o;1127:984::-;415:1:92;302:66:93;515:38:92;:66;511:117;;596:32;;-1:-1:-1;;;596:32:92;;;;;;;;;;;511:117;634:22;415:1;302:66:93;832:65:92;777:125;634:22;1241:6:142::1;1251:1;1241:11:::0;1237:51:::1;;1261:27;;-1:-1:-1::0;;;1261:27:142::1;;;;;;;;;;;1237:51;-1:-1:-1::0;;;;;1298:24:142;::::1;1294:65;;1331:28;;-1:-1:-1::0;;;1331:28:142::1;;;;;;;;;;;1294:65;1415:68;::::0;-1:-1:-1;;;1415:68:142;;-1:-1:-1;;;1415:68:142::1;::::0;::::1;1233:52:375::0;-1:-1:-1;;;;;1415:37:142;::::1;::::0;::::1;::::0;1206:18:375;;1415:68:142::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1410:128;;1500:31;;-1:-1:-1::0;;;1500:31:142::1;;;;;;;;;;;1410:128;1611:10;-1:-1:-1::0;;;;;1580:41:142::1;1588:10;-1:-1:-1::0;;;;;1580:25:142::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;1580:41:142::1;;1576:97;;1638:28;;-1:-1:-1::0;;;1638:28:142::1;;;;;;;;;;;1576:97;1679:20;1702:18;864:49:137::0;;-1:-1:-1;;;;;864:49:137;;791:127;1702:18:142::1;1679:41;;1726:12;1741:21;1755:6;1741:13;:21::i;:::-;1726:36;;1831:4;1819:9;:16;1815:56;;;1844:27;;-1:-1:-1::0;;;1844:27:142::1;;;;;;;;;;;1815:56;1912:17;1969:6;1941:10;-1:-1:-1::0;;;;;1932:32:142::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;;:::i;:::-;1912:63;;1982:30;1990:10;2002:9;1982:7;:30::i;:::-;2046:60;2087:12;2101:4;2046:40;:60::i;:::-;1231:880;;;669:24:92::0;475:1;302:66:93;832:65:92;777:125;669:24;1127:984:142;;:::o;2115:134::-;-1:-1:-1;;;;;578:50:141;;2196:7:142;578:50:141;;;279:66:143;578:50:141;;;;;;2218:26:142;478:155:141;1016:107:142;303:66:64;1263:42:63;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:63;;;;;;;;;;;1258:100;1078:40:142::1;-1:-1:-1::0;;;1078:13:142::1;:40::i;:::-;1016:107::o:0;2390:117::-;2452:7;2483:19;317:66:139;1563:50:137;;1489:129;2483:19:142;2474:28;;:6;:28;:::i;250:224:141:-;318:31;279:66:143;-1:-1:-1;;;;;380:30:141;;:18;:30;;;;;;;;;;;;:39;;;430;;345:25:375;;;380:30:141;;-1:-1:-1;380:30:141;;430:39;;318:18:375;430:39:141;;;;;;;312:162;250:224;;:::o;2561:178:226:-;2637:12;2655:2;-1:-1:-1;;;;;2655:7:226;2670:5;2655:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2636:44;;;2694:7;2686:48;;;;-1:-1:-1;;;2686:48:226;;2870:2:375;2686:48:226;;;2852:21:375;2909:2;2889:18;;;2882:30;2948;2928:18;;;2921:58;2996:18;;2686:48:226;;;;;;;;2630:109;2561:178;;:::o;452:282:66:-;-1:-1:-1;;;;;;1121:62:66;;1096:4;1121:62;;;303:66:68;1121:62:66;;;;;;;;:70;;:62;:70;510:182;;-1:-1:-1;;;;;;556:62:66;;:49;:62;;;303:66:68;556:62:66;;;;;:69;;-1:-1:-1;;556:69:66;621:4;556:69;;;510:182;;;653:32;;-1:-1:-1;;;653:32:66;;;;;;;;;;;510:182;702:27;;-1:-1:-1;;;;;;702:27:66;;;;;;;;452:282;:::o;14:180:375:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:375;;14:180;-1:-1:-1;14:180:375:o;381:131::-;-1:-1:-1;;;;;456:31:375;;446:42;;436:70;;502:1;499;492:12;436:70;381:131;:::o;517:315::-;585:6;593;646:2;634:9;625:7;621:23;617:32;614:52;;;662:1;659;652:12;614:52;701:9;688:23;720:31;745:5;720:31;:::i;:::-;770:5;822:2;807:18;;;;794:32;;-1:-1:-1;;;517:315:375:o;837:247::-;896:6;949:2;937:9;928:7;924:23;920:32;917:52;;;965:1;962;955:12;917:52;1004:9;991:23;1023:31;1048:5;1023:31;:::i;:::-;1073:5;837:247;-1:-1:-1;;;837:247:375:o;1296:277::-;1363:6;1416:2;1404:9;1395:7;1391:23;1387:32;1384:52;;;1432:1;1429;1422:12;1384:52;1464:9;1458:16;1517:5;1510:13;1503:21;1496:5;1493:32;1483:60;;1539:1;1536;1529:12;1578:251;1648:6;1701:2;1689:9;1680:7;1676:23;1672:32;1669:52;;;1717:1;1714;1707:12;1669:52;1749:9;1743:16;1768:31;1793:5;1768:31;:::i;1834:184::-;1904:6;1957:2;1945:9;1936:7;1932:23;1928:32;1925:52;;;1973:1;1970;1963:12;1925:52;-1:-1:-1;1996:16:375;;1834:184;-1:-1:-1;1834:184:375:o;2023:127::-;2084:10;2079:3;2075:20;2072:1;2065:31;2115:4;2112:1;2105:15;2139:4;2136:1;2129:15;2155:125;2220:9;;;2241:10;;;2238:36;;;2254:18;;:::i;2285:168::-;2358:9;;;2389;;2406:15;;;2400:22;;2386:37;2376:71;;2427:18;;:::i","linkReferences":{}},"methodIdentifiers":{"__PrepayFacet_init()":"aabe967d","calculateMembershipPrepayFee(uint256)":"27bc79f1","prepaidMembershipSupply(address)":"9262b1b3","prepayMembership(address,uint256)":"86272406"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Platform__InvalidFeeRecipient\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Platform__InvalidMembershipBps\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Platform__InvalidMembershipDuration\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Platform__InvalidMembershipMintLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PrepayBase__InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PrepayBase__InvalidAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PrepayBase__InvalidMembership\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuard__ReentrantCall\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"PlatformFeeRecipientSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"bps\",\"type\":\"uint16\"}],\"name\":\"PlatformMembershipBpsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"PlatformMembershipDurationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"name\":\"PlatformMembershipFeeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"PlatformMembershipMintLimitSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"membership\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"name\":\"PrepayBase__Prepaid\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__PrepayFacet_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"name\":\"calculateMembershipPrepayFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"prepaidMembershipSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"membership\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"name\":\"prepayMembership\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"calculateMembershipPrepayFee(uint256)\":{\"params\":{\"supply\":\"The supply to calculate the fee for\"},\"returns\":{\"_0\":\"The fee\"}},\"prepaidMembershipSupply(address)\":{\"params\":{\"account\":\"The account to get the prepaid supply for\"},\"returns\":{\"_0\":\"The prepaid supply\"}},\"prepayMembership(address,uint256)\":{\"params\":{\"membership\":\"The membership contract address\",\"supply\":\"The amount of memberships to prepay\"}}},\"version\":1},\"userdoc\":{\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{\"calculateMembershipPrepayFee(uint256)\":{\"notice\":\"Calculate the prepay fee for a given supply\"},\"prepaidMembershipSupply(address)\":{\"notice\":\"Get the prepaid supply for an account\"},\"prepayMembership(address,uint256)\":{\"notice\":\"Prepay a membership\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/factory/facets/prepay/PrepayFacet.sol\":\"PrepayFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol\":{\"keccak256\":\"0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b\",\"dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq\"]},\"contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol\":{\"keccak256\":\"0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c\",\"dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T\"]},\"contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol\":{\"keccak256\":\"0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6\",\"dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC\"]},\"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol\":{\"keccak256\":\"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e\",\"dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM\"]},\"contracts/src/factory/facets/platform/requirements/IPlatformRequirements.sol\":{\"keccak256\":\"0xc0b22b0caa2336e0c3f6b6813432643053785c39531d30e5851eeb613a0a7991\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8a7ceb199e92f484efcc444fffd54fbabaf332c210dda0ef46d89a66f4cb47c7\",\"dweb:/ipfs/QmRJVrZiZpbGsLngz4J3NVgapKXLErdLc7BPyEyTNKdijg\"]},\"contracts/src/factory/facets/platform/requirements/PlatformRequirementsBase.sol\":{\"keccak256\":\"0x158587dabf0ee4b1c3d0871feb4cdd661de24fc27746bea3e9781d8410a1d987\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6e3a3faf324ace9cd621f0579f665f1fdd13c700b7a0983f3fb88fa3ed21b877\",\"dweb:/ipfs/QmYzUNVXABjw4Av39mYXwdTLrCeGdq4qBHqCUDnw7N9vYv\"]},\"contracts/src/factory/facets/platform/requirements/PlatformRequirementsStorage.sol\":{\"keccak256\":\"0xbfe5f3eb736f32a6b32ce92ac245b50b35e2b09c83da83675825faa118ce7985\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f3070ff80c5066fc5239efdcf7eb764223bae7db941e8ebbc6124ad273d873e7\",\"dweb:/ipfs/QmSDqnPShWVwrG66A4LoNMgQ2q1MfRBebRUctWhjKpb5Y1\"]},\"contracts/src/factory/facets/prepay/IPrepay.sol\":{\"keccak256\":\"0x0c5c097dd77471d041cdbb84011ac789147af937d275329d857d1a4b257635e9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://baca271a5a66856f3144a4bf0ed6a484b0c981539d6bf0c57ffade9e4986eb49\",\"dweb:/ipfs/QmVgPWMEL5q2J5kmZQZFRadWjuVQeFLaa9K2gCHdhjLUa9\"]},\"contracts/src/factory/facets/prepay/PrepayBase.sol\":{\"keccak256\":\"0xfebe9ae4138390535139e73b23d1e32af042114beea5ef4d013c57b49069c210\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://57588fd465f1ee19fbe06dcc017b7de5b242f3bf35633b2373744263b61c11c4\",\"dweb:/ipfs/QmXktbrFSheqQ6AFQkwBpyNcaA13xK5gcEY3nLCi79Qpd8\"]},\"contracts/src/factory/facets/prepay/PrepayFacet.sol\":{\"keccak256\":\"0x9bf79ae0025eaa4136fcf9425de17ac7a37278d3177a4727271b1ce7766b3345\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5abffb1af0022309f8bed4f41b2d4fa11f33eac4f2dc1599751e85d62092fa9f\",\"dweb:/ipfs/QmceRDb3dH9MGYn8cWLoZmfTDWy8o7aSf8xKLyi99ZQtkU\"]},\"contracts/src/factory/facets/prepay/PrepayStorage.sol\":{\"keccak256\":\"0x78dc307810bb9021b19fc2793fe744e0e5b980441b4a98c457011eac402faa6a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://72a3727192e0b4f4c560ec0c0fd9d02b8fdd1e176d288684306f1bf3788ce8ab\",\"dweb:/ipfs/QmTxpmnY7wtmdX3k4GSepHLLxm3KBvqDBeRreMyDPMg8E4\"]},\"contracts/src/spaces/facets/membership/IMembership.sol\":{\"keccak256\":\"0x233066dd470121818082ba6a4c868f90feafc3be29942aae2c7a5c25543b7485\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://30d976a1882102493e7cee87b75ab04c662626d71aca51c9334ed2f60402bb59\",\"dweb:/ipfs/QmerPfizrjueQSgG8SkSoi44fkyaqrN2ZCFTnaxnM3UqF7\"]},\"contracts/src/utils/interfaces/IWETH.sol\":{\"keccak256\":\"0xd274612ab96215dcdb6e3717a63e7a0f76c7facadff93b2b23ed278f6e7b3b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://12444da1f06a0fbe6d2d564d73d6d6bc58c09496af3aeea6988c3d3f9ee81c73\",\"dweb:/ipfs/QmTkpQ6cZmRYgvLUS4mqzLvFg5nabgQjpMnVK8JENboiA3\"]},\"contracts/src/utils/libraries/BasisPoints.sol\":{\"keccak256\":\"0x797b0a1d3da51f4256c83b5d5c885b034df5bdff69c8dfa0fac9777cfa2f1d26\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://52ba0c85e5de8a7d76e2e4bcbccdaffa68e29281191ae1f889430a496ce5cf1c\",\"dweb:/ipfs/Qmd5bYypjF6gcJKKagdRpvAgV4LCs4iyn7KYdaLBWjjuHr\"]},\"contracts/src/utils/libraries/CurrencyTransfer.sol\":{\"keccak256\":\"0x1c6b5b33831f8c5c02c49dff5ceac3ad1a6cdb74c988ebba72c36329ca704750\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://78122f27b67a5d3ebe95c4260dc972ab7be5c04b277cbd71a833dd74fbd23fa4\",\"dweb:/ipfs/QmU78EApEim92KMVtW69coFPZdhvbkhmYn6dW2zwqJKPBp\"]},\"lib/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c\",\"dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq\"]},\"lib/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d\",\"dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi\"]},\"lib/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0\",\"dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[],"type":"error","name":"Platform__InvalidFeeRecipient"},{"inputs":[],"type":"error","name":"Platform__InvalidMembershipBps"},{"inputs":[],"type":"error","name":"Platform__InvalidMembershipDuration"},{"inputs":[],"type":"error","name":"Platform__InvalidMembershipMintLimit"},{"inputs":[],"type":"error","name":"PrepayBase__InvalidAddress"},{"inputs":[],"type":"error","name":"PrepayBase__InvalidAmount"},{"inputs":[],"type":"error","name":"PrepayBase__InvalidMembership"},{"inputs":[],"type":"error","name":"ReentrancyGuard__ReentrantCall"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"recipient","type":"address","indexed":true}],"type":"event","name":"PlatformFeeRecipientSet","anonymous":false},{"inputs":[{"internalType":"uint16","name":"bps","type":"uint16","indexed":false}],"type":"event","name":"PlatformMembershipBpsSet","anonymous":false},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256","indexed":false}],"type":"event","name":"PlatformMembershipDurationSet","anonymous":false},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256","indexed":false}],"type":"event","name":"PlatformMembershipFeeSet","anonymous":false},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256","indexed":false}],"type":"event","name":"PlatformMembershipMintLimitSet","anonymous":false},{"inputs":[{"internalType":"address","name":"membership","type":"address","indexed":true},{"internalType":"uint256","name":"supply","type":"uint256","indexed":false}],"type":"event","name":"PrepayBase__Prepaid","anonymous":false},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"__PrepayFacet_init"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function","name":"calculateMembershipPrepayFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"prepaidMembershipSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"membership","type":"address"},{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"payable","type":"function","name":"prepayMembership"}],"devdoc":{"kind":"dev","methods":{"calculateMembershipPrepayFee(uint256)":{"params":{"supply":"The supply to calculate the fee for"},"returns":{"_0":"The fee"}},"prepaidMembershipSupply(address)":{"params":{"account":"The account to get the prepaid supply for"},"returns":{"_0":"The prepaid supply"}},"prepayMembership(address,uint256)":{"params":{"membership":"The membership contract address","supply":"The amount of memberships to prepay"}}},"version":1},"userdoc":{"kind":"user","methods":{"calculateMembershipPrepayFee(uint256)":{"notice":"Calculate the prepay fee for a given supply"},"prepaidMembershipSupply(address)":{"notice":"Get the prepaid supply for an account"},"prepayMembership(address,uint256)":{"notice":"Prepay a membership"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/factory/facets/prepay/PrepayFacet.sol":"PrepayFacet"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol":{"keccak256":"0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a","urls":["bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b","dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol":{"keccak256":"0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f","urls":["bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c","dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol":{"keccak256":"0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c","urls":["bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6","dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9","urls":["bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e","dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM"],"license":"Apache-2.0"},"contracts/src/factory/facets/platform/requirements/IPlatformRequirements.sol":{"keccak256":"0xc0b22b0caa2336e0c3f6b6813432643053785c39531d30e5851eeb613a0a7991","urls":["bzz-raw://8a7ceb199e92f484efcc444fffd54fbabaf332c210dda0ef46d89a66f4cb47c7","dweb:/ipfs/QmRJVrZiZpbGsLngz4J3NVgapKXLErdLc7BPyEyTNKdijg"],"license":"Apache-2.0"},"contracts/src/factory/facets/platform/requirements/PlatformRequirementsBase.sol":{"keccak256":"0x158587dabf0ee4b1c3d0871feb4cdd661de24fc27746bea3e9781d8410a1d987","urls":["bzz-raw://6e3a3faf324ace9cd621f0579f665f1fdd13c700b7a0983f3fb88fa3ed21b877","dweb:/ipfs/QmYzUNVXABjw4Av39mYXwdTLrCeGdq4qBHqCUDnw7N9vYv"],"license":"Apache-2.0"},"contracts/src/factory/facets/platform/requirements/PlatformRequirementsStorage.sol":{"keccak256":"0xbfe5f3eb736f32a6b32ce92ac245b50b35e2b09c83da83675825faa118ce7985","urls":["bzz-raw://f3070ff80c5066fc5239efdcf7eb764223bae7db941e8ebbc6124ad273d873e7","dweb:/ipfs/QmSDqnPShWVwrG66A4LoNMgQ2q1MfRBebRUctWhjKpb5Y1"],"license":"Apache-2.0"},"contracts/src/factory/facets/prepay/IPrepay.sol":{"keccak256":"0x0c5c097dd77471d041cdbb84011ac789147af937d275329d857d1a4b257635e9","urls":["bzz-raw://baca271a5a66856f3144a4bf0ed6a484b0c981539d6bf0c57ffade9e4986eb49","dweb:/ipfs/QmVgPWMEL5q2J5kmZQZFRadWjuVQeFLaa9K2gCHdhjLUa9"],"license":"Apache-2.0"},"contracts/src/factory/facets/prepay/PrepayBase.sol":{"keccak256":"0xfebe9ae4138390535139e73b23d1e32af042114beea5ef4d013c57b49069c210","urls":["bzz-raw://57588fd465f1ee19fbe06dcc017b7de5b242f3bf35633b2373744263b61c11c4","dweb:/ipfs/QmXktbrFSheqQ6AFQkwBpyNcaA13xK5gcEY3nLCi79Qpd8"],"license":"Apache-2.0"},"contracts/src/factory/facets/prepay/PrepayFacet.sol":{"keccak256":"0x9bf79ae0025eaa4136fcf9425de17ac7a37278d3177a4727271b1ce7766b3345","urls":["bzz-raw://5abffb1af0022309f8bed4f41b2d4fa11f33eac4f2dc1599751e85d62092fa9f","dweb:/ipfs/QmceRDb3dH9MGYn8cWLoZmfTDWy8o7aSf8xKLyi99ZQtkU"],"license":"Apache-2.0"},"contracts/src/factory/facets/prepay/PrepayStorage.sol":{"keccak256":"0x78dc307810bb9021b19fc2793fe744e0e5b980441b4a98c457011eac402faa6a","urls":["bzz-raw://72a3727192e0b4f4c560ec0c0fd9d02b8fdd1e176d288684306f1bf3788ce8ab","dweb:/ipfs/QmTxpmnY7wtmdX3k4GSepHLLxm3KBvqDBeRreMyDPMg8E4"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/IMembership.sol":{"keccak256":"0x233066dd470121818082ba6a4c868f90feafc3be29942aae2c7a5c25543b7485","urls":["bzz-raw://30d976a1882102493e7cee87b75ab04c662626d71aca51c9334ed2f60402bb59","dweb:/ipfs/QmerPfizrjueQSgG8SkSoi44fkyaqrN2ZCFTnaxnM3UqF7"],"license":"Apache-2.0"},"contracts/src/utils/interfaces/IWETH.sol":{"keccak256":"0xd274612ab96215dcdb6e3717a63e7a0f76c7facadff93b2b23ed278f6e7b3b00","urls":["bzz-raw://12444da1f06a0fbe6d2d564d73d6d6bc58c09496af3aeea6988c3d3f9ee81c73","dweb:/ipfs/QmTkpQ6cZmRYgvLUS4mqzLvFg5nabgQjpMnVK8JENboiA3"],"license":"Apache-2.0"},"contracts/src/utils/libraries/BasisPoints.sol":{"keccak256":"0x797b0a1d3da51f4256c83b5d5c885b034df5bdff69c8dfa0fac9777cfa2f1d26","urls":["bzz-raw://52ba0c85e5de8a7d76e2e4bcbccdaffa68e29281191ae1f889430a496ce5cf1c","dweb:/ipfs/Qmd5bYypjF6gcJKKagdRpvAgV4LCs4iyn7KYdaLBWjjuHr"],"license":"Apache-2.0"},"contracts/src/utils/libraries/CurrencyTransfer.sol":{"keccak256":"0x1c6b5b33831f8c5c02c49dff5ceac3ad1a6cdb74c988ebba72c36329ca704750","urls":["bzz-raw://78122f27b67a5d3ebe95c4260dc972ab7be5c04b277cbd71a833dd74fbd23fa4","dweb:/ipfs/QmU78EApEim92KMVtW69coFPZdhvbkhmYn6dW2zwqJKPBp"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"keccak256":"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff","urls":["bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d","dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi"],"license":"MIT"},"lib/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386","urls":["bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0","dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"}},"version":1},"id":142} \ No newline at end of file diff --git a/packages/generated/v3/abis/PrepayFacet.metadata.json b/packages/generated/v3/abis/PrepayFacet.metadata.json new file mode 100644 index 000000000..a27fb20b7 --- /dev/null +++ b/packages/generated/v3/abis/PrepayFacet.metadata.json @@ -0,0 +1,541 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [], + "type": "error", + "name": "Platform__InvalidFeeRecipient" + }, + { + "inputs": [], + "type": "error", + "name": "Platform__InvalidMembershipBps" + }, + { + "inputs": [], + "type": "error", + "name": "Platform__InvalidMembershipDuration" + }, + { + "inputs": [], + "type": "error", + "name": "Platform__InvalidMembershipMintLimit" + }, + { + "inputs": [], + "type": "error", + "name": "PrepayBase__InvalidAddress" + }, + { + "inputs": [], + "type": "error", + "name": "PrepayBase__InvalidAmount" + }, + { + "inputs": [], + "type": "error", + "name": "PrepayBase__InvalidMembership" + }, + { + "inputs": [], + "type": "error", + "name": "ReentrancyGuard__ReentrantCall" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "PlatformFeeRecipientSet", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "bps", + "type": "uint16", + "indexed": false + } + ], + "type": "event", + "name": "PlatformMembershipBpsSet", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "duration", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "PlatformMembershipDurationSet", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fee", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "PlatformMembershipFeeSet", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "limit", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "PlatformMembershipMintLimitSet", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "membership", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "supply", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "PrepayBase__Prepaid", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "__PrepayFacet_init" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "supply", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "calculateMembershipPrepayFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "prepaidMembershipSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "membership", + "type": "address" + }, + { + "internalType": "uint256", + "name": "supply", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "prepayMembership" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "calculateMembershipPrepayFee(uint256)": { + "params": { + "supply": "The supply to calculate the fee for" + }, + "returns": { + "_0": "The fee" + } + }, + "prepaidMembershipSupply(address)": { + "params": { + "account": "The account to get the prepaid supply for" + }, + "returns": { + "_0": "The prepaid supply" + } + }, + "prepayMembership(address,uint256)": { + "params": { + "membership": "The membership contract address", + "supply": "The amount of memberships to prepay" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "calculateMembershipPrepayFee(uint256)": { + "notice": "Calculate the prepay fee for a given supply" + }, + "prepaidMembershipSupply(address)": { + "notice": "Get the prepaid supply for an account" + }, + "prepayMembership(address,uint256)": { + "notice": "Prepay a membership" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/factory/facets/prepay/PrepayFacet.sol": "PrepayFacet" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/IReentrancyGuard.sol": { + "keccak256": "0xcf0384936029c121c827aca432891d18f7c7db3d234dfbdad69373726d41003a", + "urls": [ + "bzz-raw://6c7127aa6cc24cb43dac1bea76e16b09c2ce26421baf08792f767d6b204ba39b", + "dweb:/ipfs/QmSziExRUyaUEVteBXtsxkNMgcdXS9PPaDdCNdLvivcFJq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/ReentrancyGuard.sol": { + "keccak256": "0x96999935d243afdc7370154431fef7de13cd74b892949070d8488d5ad83dfa4f", + "urls": [ + "bzz-raw://e5978c51e1bab72ec8d3a8e5bb80c7e2bcac60c08d04b3406b6863efb585100c", + "dweb:/ipfs/QmUDtXQHEx1kgQeEQ5Sui9xdDQgf931ts2ZCKpwfH88U4T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/reentrancy/ReentrancyGuardStorage.sol": { + "keccak256": "0xbfd5548227b70eec020b03bdec1ae0ef0b51c5e3380147153a93c0f03c5e630c", + "urls": [ + "bzz-raw://dab049fa3dd63981697ccffab59be2e6d531a77692c80c857ce54ee8484bd6a6", + "dweb:/ipfs/QmYVE2qptk62RDXSFJMYUYSUzjksxbHEVtG3pBP8m3s9VC" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/IERC721A.sol": { + "keccak256": "0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9", + "urls": [ + "bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e", + "dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/platform/requirements/IPlatformRequirements.sol": { + "keccak256": "0xc0b22b0caa2336e0c3f6b6813432643053785c39531d30e5851eeb613a0a7991", + "urls": [ + "bzz-raw://8a7ceb199e92f484efcc444fffd54fbabaf332c210dda0ef46d89a66f4cb47c7", + "dweb:/ipfs/QmRJVrZiZpbGsLngz4J3NVgapKXLErdLc7BPyEyTNKdijg" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/platform/requirements/PlatformRequirementsBase.sol": { + "keccak256": "0x158587dabf0ee4b1c3d0871feb4cdd661de24fc27746bea3e9781d8410a1d987", + "urls": [ + "bzz-raw://6e3a3faf324ace9cd621f0579f665f1fdd13c700b7a0983f3fb88fa3ed21b877", + "dweb:/ipfs/QmYzUNVXABjw4Av39mYXwdTLrCeGdq4qBHqCUDnw7N9vYv" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/platform/requirements/PlatformRequirementsStorage.sol": { + "keccak256": "0xbfe5f3eb736f32a6b32ce92ac245b50b35e2b09c83da83675825faa118ce7985", + "urls": [ + "bzz-raw://f3070ff80c5066fc5239efdcf7eb764223bae7db941e8ebbc6124ad273d873e7", + "dweb:/ipfs/QmSDqnPShWVwrG66A4LoNMgQ2q1MfRBebRUctWhjKpb5Y1" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/prepay/IPrepay.sol": { + "keccak256": "0x0c5c097dd77471d041cdbb84011ac789147af937d275329d857d1a4b257635e9", + "urls": [ + "bzz-raw://baca271a5a66856f3144a4bf0ed6a484b0c981539d6bf0c57ffade9e4986eb49", + "dweb:/ipfs/QmVgPWMEL5q2J5kmZQZFRadWjuVQeFLaa9K2gCHdhjLUa9" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/prepay/PrepayBase.sol": { + "keccak256": "0xfebe9ae4138390535139e73b23d1e32af042114beea5ef4d013c57b49069c210", + "urls": [ + "bzz-raw://57588fd465f1ee19fbe06dcc017b7de5b242f3bf35633b2373744263b61c11c4", + "dweb:/ipfs/QmXktbrFSheqQ6AFQkwBpyNcaA13xK5gcEY3nLCi79Qpd8" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/prepay/PrepayFacet.sol": { + "keccak256": "0x9bf79ae0025eaa4136fcf9425de17ac7a37278d3177a4727271b1ce7766b3345", + "urls": [ + "bzz-raw://5abffb1af0022309f8bed4f41b2d4fa11f33eac4f2dc1599751e85d62092fa9f", + "dweb:/ipfs/QmceRDb3dH9MGYn8cWLoZmfTDWy8o7aSf8xKLyi99ZQtkU" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/prepay/PrepayStorage.sol": { + "keccak256": "0x78dc307810bb9021b19fc2793fe744e0e5b980441b4a98c457011eac402faa6a", + "urls": [ + "bzz-raw://72a3727192e0b4f4c560ec0c0fd9d02b8fdd1e176d288684306f1bf3788ce8ab", + "dweb:/ipfs/QmTxpmnY7wtmdX3k4GSepHLLxm3KBvqDBeRreMyDPMg8E4" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/IMembership.sol": { + "keccak256": "0x233066dd470121818082ba6a4c868f90feafc3be29942aae2c7a5c25543b7485", + "urls": [ + "bzz-raw://30d976a1882102493e7cee87b75ab04c662626d71aca51c9334ed2f60402bb59", + "dweb:/ipfs/QmerPfizrjueQSgG8SkSoi44fkyaqrN2ZCFTnaxnM3UqF7" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/interfaces/IWETH.sol": { + "keccak256": "0xd274612ab96215dcdb6e3717a63e7a0f76c7facadff93b2b23ed278f6e7b3b00", + "urls": [ + "bzz-raw://12444da1f06a0fbe6d2d564d73d6d6bc58c09496af3aeea6988c3d3f9ee81c73", + "dweb:/ipfs/QmTkpQ6cZmRYgvLUS4mqzLvFg5nabgQjpMnVK8JENboiA3" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/libraries/BasisPoints.sol": { + "keccak256": "0x797b0a1d3da51f4256c83b5d5c885b034df5bdff69c8dfa0fac9777cfa2f1d26", + "urls": [ + "bzz-raw://52ba0c85e5de8a7d76e2e4bcbccdaffa68e29281191ae1f889430a496ce5cf1c", + "dweb:/ipfs/Qmd5bYypjF6gcJKKagdRpvAgV4LCs4iyn7KYdaLBWjjuHr" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/libraries/CurrencyTransfer.sol": { + "keccak256": "0x1c6b5b33831f8c5c02c49dff5ceac3ad1a6cdb74c988ebba72c36329ca704750", + "urls": [ + "bzz-raw://78122f27b67a5d3ebe95c4260dc972ab7be5c04b277cbd71a833dd74fbd23fa4", + "dweb:/ipfs/QmU78EApEim92KMVtW69coFPZdhvbkhmYn6dW2zwqJKPBp" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70", + "urls": [ + "bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c", + "dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { + "keccak256": "0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff", + "urls": [ + "bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d", + "dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { + "keccak256": "0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386", + "urls": [ + "bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0", + "dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/ProxyManager.abi.json b/packages/generated/v3/abis/ProxyManager.abi.json new file mode 100644 index 000000000..2412776ad --- /dev/null +++ b/packages/generated/v3/abis/ProxyManager.abi.json @@ -0,0 +1,165 @@ +[ + { + "type": "function", + "name": "__ProxyManager_init", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getImplementation", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "setImplementation", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ProxyManager__ImplementationSet", + "inputs": [ + { + "name": "implementation", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "ProxyManager__NotContract", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/ProxyManager.abi.ts b/packages/generated/v3/abis/ProxyManager.abi.ts new file mode 100644 index 000000000..9ecab7d60 --- /dev/null +++ b/packages/generated/v3/abis/ProxyManager.abi.ts @@ -0,0 +1,165 @@ +export default [ + { + "type": "function", + "name": "__ProxyManager_init", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getImplementation", + "inputs": [ + { + "name": "selector", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "setImplementation", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ProxyManager__ImplementationSet", + "inputs": [ + { + "name": "implementation", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "ProxyManager__NotContract", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ] + } +] as const diff --git a/packages/generated/v3/abis/ProxyManager.bin b/packages/generated/v3/abis/ProxyManager.bin new file mode 100644 index 000000000..a01ecd846 --- /dev/null +++ b/packages/generated/v3/abis/ProxyManager.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b61042b806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063d784d42614610046578063dc9cc6451461005b578063eb4ab8081461008a575b600080fd5b6100596100543660046103c7565b61009d565b005b61006e6100693660046103e4565b6100fa565b6040516001600160a01b03909116815260200160405180910390f35b6100596100983660046103c7565b61010b565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031633146100ee576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6100f78161016e565b50565b600061010582610218565b92915050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661015557604051630ef4733760e31b815260040160405180910390fd5b61015e8161016e565b6100f7630b18126360e01b6102d4565b806001600160a01b03163b6000036101a4576040516301804d6f60e31b81526001600160a01b03821660048201526024016100e5565b807f249d779ca269721f3d722925685859148db22a7b52f28bf3e74c7625696a0a0080546001600160a01b0319166001600160a01b0392831617905560405190821681527f8295fd24d168fe40d442afbd8648e2883f184648dd815a08f516f38fab1ed3489060200160405180910390a150565b6000807f249d779ca269721f3d722925685859148db22a7b52f28bf3e74c7625696a0a00546040516366ffd66360e11b81526001600160e01b0319851660048201526001600160a01b039091169150600090829063cdffacc690602401602060405180830381865afa158015610292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b6919061040e565b90506001600160a01b0381166102cd575092915050565b9392505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610361576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff1916600117905561037a565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6001600160a01b03811681146100f757600080fd5b6000602082840312156103d957600080fd5b81356102cd816103b2565b6000602082840312156103f657600080fd5b81356001600160e01b0319811681146102cd57600080fd5b60006020828403121561042057600080fd5b81516102cd816103b256 \ No newline at end of file diff --git a/packages/generated/v3/abis/ProxyManager.json b/packages/generated/v3/abis/ProxyManager.json new file mode 100644 index 000000000..5cba09eea --- /dev/null +++ b/packages/generated/v3/abis/ProxyManager.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__ProxyManager_init","inputs":[{"name":"implementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getImplementation","inputs":[{"name":"selector","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"setImplementation","inputs":[{"name":"implementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ProxyManager__ImplementationSet","inputs":[{"name":"implementation","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]},{"type":"error","name":"ProxyManager__NotContract","inputs":[{"name":"implementation","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b61042b806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063d784d42614610046578063dc9cc6451461005b578063eb4ab8081461008a575b600080fd5b6100596100543660046103c7565b61009d565b005b61006e6100693660046103e4565b6100fa565b6040516001600160a01b03909116815260200160405180910390f35b6100596100983660046103c7565b61010b565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031633146100ee576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6100f78161016e565b50565b600061010582610218565b92915050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661015557604051630ef4733760e31b815260040160405180910390fd5b61015e8161016e565b6100f7630b18126360e01b6102d4565b806001600160a01b03163b6000036101a4576040516301804d6f60e31b81526001600160a01b03821660048201526024016100e5565b807f249d779ca269721f3d722925685859148db22a7b52f28bf3e74c7625696a0a0080546001600160a01b0319166001600160a01b0392831617905560405190821681527f8295fd24d168fe40d442afbd8648e2883f184648dd815a08f516f38fab1ed3489060200160405180910390a150565b6000807f249d779ca269721f3d722925685859148db22a7b52f28bf3e74c7625696a0a00546040516366ffd66360e11b81526001600160e01b0319851660048201526001600160a01b039091169150600090829063cdffacc690602401602060405180830381865afa158015610292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b6919061040e565b90506001600160a01b0381166102cd575092915050565b9392505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610361576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff1916600117905561037a565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6001600160a01b03811681146100f757600080fd5b6000602082840312156103d957600080fd5b81356102cd816103b2565b6000602082840312156103f657600080fd5b81356001600160e01b0319811681146102cd57600080fd5b60006020828403121561042057600080fd5b81516102cd816103b256","sourceMap":"648:544:142:-:0;;;;;;;;;;;;-1:-1:-1;385:22:70;:20;:22::i;:::-;648:544:142;;1653:314:84;303:66:85;1779:14:84;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:84;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:84;1898:16;1886:28;;;;;1927:29;;158:42:514;;;1927:29:84;;146:2:514;131:18;1927:29:84;;;;;;;1844:119;1694:273;1653:314::o;14:192:514:-;648:544:142;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063d784d42614610046578063dc9cc6451461005b578063eb4ab8081461008a575b600080fd5b6100596100543660046103c7565b61009d565b005b61006e6100693660046103e4565b6100fa565b6040516001600160a01b03909116815260200160405180910390f35b6100596100983660046103c7565b61010b565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031633146100ee576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6100f78161016e565b50565b600061010582610218565b92915050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661015557604051630ef4733760e31b815260040160405180910390fd5b61015e8161016e565b6100f7630b18126360e01b6102d4565b806001600160a01b03163b6000036101a4576040516301804d6f60e31b81526001600160a01b03821660048201526024016100e5565b807f249d779ca269721f3d722925685859148db22a7b52f28bf3e74c7625696a0a0080546001600160a01b0319166001600160a01b0392831617905560405190821681527f8295fd24d168fe40d442afbd8648e2883f184648dd815a08f516f38fab1ed3489060200160405180910390a150565b6000807f249d779ca269721f3d722925685859148db22a7b52f28bf3e74c7625696a0a00546040516366ffd66360e11b81526001600160e01b0319851660048201526001600160a01b039091169150600090829063cdffacc690602401602060405180830381865afa158015610292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b6919061040e565b90506001600160a01b0381166102cd575092915050565b9392505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610361576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff1916600117905561037a565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6001600160a01b03811681146100f757600080fd5b6000602082840312156103d957600080fd5b81356102cd816103b2565b6000602082840312156103f657600080fd5b81356001600160e01b0319811681146102cd57600080fd5b60006020828403121561042057600080fd5b81516102cd816103b256","sourceMap":"648:544:142:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1059:131;;;;;;:::i;:::-;;:::i;:::-;;917:138;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;857:32:514;;;839:51;;827:2;812:18;917:138:142;;;;;;;729:184;;;;;;:::i;:::-;;:::i;1059:131::-;291:66:98;445:29:96;-1:-1:-1;;;;;445:29:96;286:10;:22;282:79;;325:29;;-1:-1:-1;;;325:29:96;;343:10;325:29;;;839:51:514;812:18;;325:29:96;;;;;;;;282:79;1151:34:142::1;1170:14;1151:18;:34::i;:::-;1059:131:::0;:::o;917:138::-;1000:7;1022:28;1041:8;1022:18;:28::i;:::-;1015:35;917:138;-1:-1:-1;;917:138:142:o;729:184::-;303:66:85;1263:42:84;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:84;;;;;;;;;;;1258:100;822:34:142::1;841:14;822:18;:34::i;:::-;862:46;-1:-1:-1::0;;;862:13:142::1;:46::i;758:297:143:-:0;829:14;-1:-1:-1;;;;;829:26:143;;859:1;829:31;825:100;;877:41;;-1:-1:-1;;;877:41:143;;-1:-1:-1;;;;;857:32:514;;877:41:143;;;839:51:514;812:18;;877:41:143;693:203:514;825:100:143;977:14;295:66:144;931:60:143;;-1:-1:-1;;;;;;931:60:143;-1:-1:-1;;;;;931:60:143;;;;;;1003:47;;857:32:514;;;839:51;;1003:47:143;;827:2:514;812:18;1003:47:143;;;;;;;758:297;:::o;437:317::-;521:7;;295:66:144;561:43:143;627:52;;-1:-1:-1;;;627:52:143;;-1:-1:-1;;;;;;1063:33:514;;627:52:143;;;1045::514;-1:-1:-1;;;;;561:43:143;;;;-1:-1:-1;561:43:143;;;;627:42;;1018:18:514;;627:52:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;611:68;-1:-1:-1;;;;;;689:19:143;;685:46;;-1:-1:-1;717:14:143;437:317;-1:-1:-1;;437:317:143:o;685:46::-;744:5;437:317;-1:-1:-1;;;437:317:143:o;452:282:87:-;-1:-1:-1;;;;;;1121:62:87;;1096:4;1121:62;;;303:66:89;1121:62:87;;;;;;;;:70;;:62;:70;510:182;;-1:-1:-1;;;;;;556:62:87;;:49;:62;;;303:66:89;556:62:87;;;;;:69;;-1:-1:-1;;556:69:87;621:4;556:69;;;510:182;;;653:32;;-1:-1:-1;;;653:32:87;;;;;;;;;;;510:182;702:27;;-1:-1:-1;;;;;;702:27:87;;;;;;;;452:282;:::o;14:131:514:-;-1:-1:-1;;;;;89:31:514;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;402:286::-;460:6;513:2;501:9;492:7;488:23;484:32;481:52;;;529:1;526;519:12;481:52;555:23;;-1:-1:-1;;;;;;607:32:514;;597:43;;587:71;;654:1;651;644:12;1108:251;1178:6;1231:2;1219:9;1210:7;1206:23;1202:32;1199:52;;;1247:1;1244;1237:12;1199:52;1279:9;1273:16;1298:31;1323:5;1298:31;:::i","linkReferences":{}},"methodIdentifiers":{"__ProxyManager_init(address)":"eb4ab808","getImplementation(bytes4)":"dc9cc645","setImplementation(address)":"d784d426"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ProxyManager__NotContract\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ProxyManager__ImplementationSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"__ProxyManager_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"setImplementation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The flow of calls goes as follows ManagedProxy -> ProxyManager -> Implementation\",\"events\":{\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"}},\"kind\":\"dev\",\"methods\":{\"getImplementation(bytes4)\":{\"params\":{\"selector\":\"The selector to get the implementation for\"},\"returns\":{\"_0\":\"The implementation address\"}},\"setImplementation(address)\":{\"params\":{\"implementation\":\"The implementation address\"}}},\"title\":\"ProxyManager\",\"version\":1},\"userdoc\":{\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{\"getImplementation(bytes4)\":{\"notice\":\"Get the implementation for a given selector\"},\"setImplementation(address)\":{\"notice\":\"Set the implementation\"}},\"notice\":\"In charge of directing calls to the correct implementation contract, in use by the ManagedProxy contract to correctly direct calls to the correct implementation contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/diamond/proxy/manager/ProxyManager.sol\":\"ProxyManager\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/loupe/IDiamondLoupe.sol\":{\"keccak256\":\"0xafbe8346e6043ac3f6977e9ca43603ca3bbbfc2c2962b47024cf9aa0dcb23f7f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7b0fd31aeddde2f351471e0fd1f5a5da20570491d5604420b283a4749838514c\",\"dweb:/ipfs/QmbuKxmTX8HC9SHNUPsraBTc6NWECwsbgmXsrpXjPqkLLi\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/OwnableBase.sol\":{\"keccak256\":\"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4\",\"dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa\"]},\"contracts/src/diamond/facets/ownable/OwnableStorage.sol\":{\"keccak256\":\"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105\",\"dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ\"]},\"contracts/src/diamond/proxy/manager/IProxyManager.sol\":{\"keccak256\":\"0xde8f6048e58e36541aebff781fb013334e8ea2fa824d9790e629d3733944929a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c79d9ac525a370f6f56b229506cf2d2ffeacafbeb02d417ed34c86c75fe01650\",\"dweb:/ipfs/QmT9CReyEvK2UkcwnzwierQdWw2T7NVZPtVDLcwhyNBhSC\"]},\"contracts/src/diamond/proxy/manager/ProxyManager.sol\":{\"keccak256\":\"0x63c7b73579e0781bec91f6fe7c0475f6d15f4ce6c08f177bcdfd3ac2d8db91c2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://451e530fb61dac8b54ba043c18305b8ef0f902e19952401322bf053afa242613\",\"dweb:/ipfs/QmQeD5nQJZRoPhyKJE6RvzgBYpJB6FGY7tnueqo2dTvLtq\"]},\"contracts/src/diamond/proxy/manager/ProxyManagerBase.sol\":{\"keccak256\":\"0xac5ab92217043d81e01353a8f60242880d18292ed90493161461ab3fd9b0c0c5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2e8933873ed8549a6568129bee694b9213fbb8c8ffa0fed50491f2d1a8f9ca0d\",\"dweb:/ipfs/QmSBUHdcCemYyk9L5WJduW4WvvMPjDS5FCzfbbhydJnGi7\"]},\"contracts/src/diamond/proxy/manager/ProxyManagerStorage.sol\":{\"keccak256\":\"0xf6636a2d69631c053de5784815e9474722f371cf5466fd469071a1a206759616\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://57d9cce006c55697bd4a6a202e6b4d2da25f311287a2e8928502e75212c0a265\",\"dweb:/ipfs/QmQ2fmatavgTHJMKVaDW4THzmAaXaGGWVUexvGkBEatac4\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"type":"error","name":"ProxyManager__NotContract"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"implementation","type":"address","indexed":false}],"type":"event","name":"ProxyManager__ImplementationSet","anonymous":false},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"__ProxyManager_init"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"stateMutability":"view","type":"function","name":"getImplementation","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setImplementation"}],"devdoc":{"kind":"dev","methods":{"getImplementation(bytes4)":{"params":{"selector":"The selector to get the implementation for"},"returns":{"_0":"The implementation address"}},"setImplementation(address)":{"params":{"implementation":"The implementation address"}}},"version":1},"userdoc":{"kind":"user","methods":{"getImplementation(bytes4)":{"notice":"Get the implementation for a given selector"},"setImplementation(address)":{"notice":"Set the implementation"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/diamond/proxy/manager/ProxyManager.sol":"ProxyManager"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/loupe/IDiamondLoupe.sol":{"keccak256":"0xafbe8346e6043ac3f6977e9ca43603ca3bbbfc2c2962b47024cf9aa0dcb23f7f","urls":["bzz-raw://7b0fd31aeddde2f351471e0fd1f5a5da20570491d5604420b283a4749838514c","dweb:/ipfs/QmbuKxmTX8HC9SHNUPsraBTc6NWECwsbgmXsrpXjPqkLLi"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableBase.sol":{"keccak256":"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762","urls":["bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4","dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableStorage.sol":{"keccak256":"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64","urls":["bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105","dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/manager/IProxyManager.sol":{"keccak256":"0xde8f6048e58e36541aebff781fb013334e8ea2fa824d9790e629d3733944929a","urls":["bzz-raw://c79d9ac525a370f6f56b229506cf2d2ffeacafbeb02d417ed34c86c75fe01650","dweb:/ipfs/QmT9CReyEvK2UkcwnzwierQdWw2T7NVZPtVDLcwhyNBhSC"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/manager/ProxyManager.sol":{"keccak256":"0x63c7b73579e0781bec91f6fe7c0475f6d15f4ce6c08f177bcdfd3ac2d8db91c2","urls":["bzz-raw://451e530fb61dac8b54ba043c18305b8ef0f902e19952401322bf053afa242613","dweb:/ipfs/QmQeD5nQJZRoPhyKJE6RvzgBYpJB6FGY7tnueqo2dTvLtq"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/manager/ProxyManagerBase.sol":{"keccak256":"0xac5ab92217043d81e01353a8f60242880d18292ed90493161461ab3fd9b0c0c5","urls":["bzz-raw://2e8933873ed8549a6568129bee694b9213fbb8c8ffa0fed50491f2d1a8f9ca0d","dweb:/ipfs/QmSBUHdcCemYyk9L5WJduW4WvvMPjDS5FCzfbbhydJnGi7"],"license":"Apache-2.0"},"contracts/src/diamond/proxy/manager/ProxyManagerStorage.sol":{"keccak256":"0xf6636a2d69631c053de5784815e9474722f371cf5466fd469071a1a206759616","urls":["bzz-raw://57d9cce006c55697bd4a6a202e6b4d2da25f311287a2e8928502e75212c0a265","dweb:/ipfs/QmQ2fmatavgTHJMKVaDW4THzmAaXaGGWVUexvGkBEatac4"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"}},"version":1},"id":142} \ No newline at end of file diff --git a/packages/generated/v3/abis/ProxyManager.metadata.json b/packages/generated/v3/abis/ProxyManager.metadata.json new file mode 100644 index 000000000..403e97dec --- /dev/null +++ b/packages/generated/v3/abis/ProxyManager.metadata.json @@ -0,0 +1,358 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "type": "error", + "name": "ProxyManager__NotContract" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "ProxyManager__ImplementationSet", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__ProxyManager_init" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setImplementation" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "getImplementation(bytes4)": { + "params": { + "selector": "The selector to get the implementation for" + }, + "returns": { + "_0": "The implementation address" + } + }, + "setImplementation(address)": { + "params": { + "implementation": "The implementation address" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getImplementation(bytes4)": { + "notice": "Get the implementation for a given selector" + }, + "setImplementation(address)": { + "notice": "Set the implementation" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/diamond/proxy/manager/ProxyManager.sol": "ProxyManager" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/loupe/IDiamondLoupe.sol": { + "keccak256": "0xafbe8346e6043ac3f6977e9ca43603ca3bbbfc2c2962b47024cf9aa0dcb23f7f", + "urls": [ + "bzz-raw://7b0fd31aeddde2f351471e0fd1f5a5da20570491d5604420b283a4749838514c", + "dweb:/ipfs/QmbuKxmTX8HC9SHNUPsraBTc6NWECwsbgmXsrpXjPqkLLi" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableBase.sol": { + "keccak256": "0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762", + "urls": [ + "bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4", + "dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableStorage.sol": { + "keccak256": "0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64", + "urls": [ + "bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105", + "dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/manager/IProxyManager.sol": { + "keccak256": "0xde8f6048e58e36541aebff781fb013334e8ea2fa824d9790e629d3733944929a", + "urls": [ + "bzz-raw://c79d9ac525a370f6f56b229506cf2d2ffeacafbeb02d417ed34c86c75fe01650", + "dweb:/ipfs/QmT9CReyEvK2UkcwnzwierQdWw2T7NVZPtVDLcwhyNBhSC" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/manager/ProxyManager.sol": { + "keccak256": "0x63c7b73579e0781bec91f6fe7c0475f6d15f4ce6c08f177bcdfd3ac2d8db91c2", + "urls": [ + "bzz-raw://451e530fb61dac8b54ba043c18305b8ef0f902e19952401322bf053afa242613", + "dweb:/ipfs/QmQeD5nQJZRoPhyKJE6RvzgBYpJB6FGY7tnueqo2dTvLtq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/manager/ProxyManagerBase.sol": { + "keccak256": "0xac5ab92217043d81e01353a8f60242880d18292ed90493161461ab3fd9b0c0c5", + "urls": [ + "bzz-raw://2e8933873ed8549a6568129bee694b9213fbb8c8ffa0fed50491f2d1a8f9ca0d", + "dweb:/ipfs/QmSBUHdcCemYyk9L5WJduW4WvvMPjDS5FCzfbbhydJnGi7" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/proxy/manager/ProxyManagerStorage.sol": { + "keccak256": "0xf6636a2d69631c053de5784815e9474722f371cf5466fd469071a1a206759616", + "urls": [ + "bzz-raw://57d9cce006c55697bd4a6a202e6b4d2da25f311287a2e8928502e75212c0a265", + "dweb:/ipfs/QmQ2fmatavgTHJMKVaDW4THzmAaXaGGWVUexvGkBEatac4" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/Roles.abi.json b/packages/generated/v3/abis/Roles.abi.json new file mode 100644 index 000000000..47c6d8fef --- /dev/null +++ b/packages/generated/v3/abis/Roles.abi.json @@ -0,0 +1,818 @@ +[ + { + "type": "function", + "name": "addPermissionsToRole", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "addRoleToEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "entitlement", + "type": "tuple", + "internalType": "struct IRolesBase.CreateEntitlement", + "components": [ + { + "name": "module", + "type": "address", + "internalType": "contract IEntitlement" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "createRole", + "inputs": [ + { + "name": "roleName", + "type": "string", + "internalType": "string" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "entitlements", + "type": "tuple[]", + "internalType": "struct IRolesBase.CreateEntitlement[]", + "components": [ + { + "name": "module", + "type": "address", + "internalType": "contract IEntitlement" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getPermissionsByRoleId", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoleById", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IRolesBase.Role", + "components": [ + { + "name": "id", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "entitlements", + "type": "address[]", + "internalType": "contract IEntitlement[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoles", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IRolesBase.Role[]", + "components": [ + { + "name": "id", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "entitlements", + "type": "address[]", + "internalType": "contract IEntitlement[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removePermissionsFromRole", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeRole", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeRoleFromEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "entitlement", + "type": "tuple", + "internalType": "struct IRolesBase.CreateEntitlement", + "components": [ + { + "name": "module", + "type": "address", + "internalType": "contract IEntitlement" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateRole", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "roleName", + "type": "string", + "internalType": "string" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "entitlements", + "type": "tuple[]", + "internalType": "struct IRolesBase.CreateEntitlement[]", + "components": [ + { + "name": "module", + "type": "address", + "internalType": "contract IEntitlement" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleCreated", + "inputs": [ + { + "name": "creator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRemoved", + "inputs": [ + { + "name": "remover", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleUpdated", + "inputs": [ + { + "name": "updater", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SubscriptionUpdate", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "expiration", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ChannelService__ChannelDisabled", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__ChannelDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__DurationZero", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__NotApprovedOrOwner", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__InvalidEntitlementInterface", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidPermission", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidByteLength", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidStringLength", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/Roles.abi.ts b/packages/generated/v3/abis/Roles.abi.ts new file mode 100644 index 000000000..f81519fca --- /dev/null +++ b/packages/generated/v3/abis/Roles.abi.ts @@ -0,0 +1,818 @@ +export default [ + { + "type": "function", + "name": "addPermissionsToRole", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "addRoleToEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "entitlement", + "type": "tuple", + "internalType": "struct IRolesBase.CreateEntitlement", + "components": [ + { + "name": "module", + "type": "address", + "internalType": "contract IEntitlement" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "createRole", + "inputs": [ + { + "name": "roleName", + "type": "string", + "internalType": "string" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "entitlements", + "type": "tuple[]", + "internalType": "struct IRolesBase.CreateEntitlement[]", + "components": [ + { + "name": "module", + "type": "address", + "internalType": "contract IEntitlement" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getPermissionsByRoleId", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoleById", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IRolesBase.Role", + "components": [ + { + "name": "id", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "entitlements", + "type": "address[]", + "internalType": "contract IEntitlement[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoles", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct IRolesBase.Role[]", + "components": [ + { + "name": "id", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "disabled", + "type": "bool", + "internalType": "bool" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "entitlements", + "type": "address[]", + "internalType": "contract IEntitlement[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removePermissionsFromRole", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeRole", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeRoleFromEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "entitlement", + "type": "tuple", + "internalType": "struct IRolesBase.CreateEntitlement", + "components": [ + { + "name": "module", + "type": "address", + "internalType": "contract IEntitlement" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateRole", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "roleName", + "type": "string", + "internalType": "string" + }, + { + "name": "permissions", + "type": "string[]", + "internalType": "string[]" + }, + { + "name": "entitlements", + "type": "tuple[]", + "internalType": "struct IRolesBase.CreateEntitlement[]", + "components": [ + { + "name": "module", + "type": "address", + "internalType": "contract IEntitlement" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Banned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleCreated", + "inputs": [ + { + "name": "creator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRemoved", + "inputs": [ + { + "name": "remover", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleUpdated", + "inputs": [ + { + "name": "updater", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "roleId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SubscriptionUpdate", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "expiration", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unbanned", + "inputs": [ + { + "name": "moderator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__AlreadyBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__CannotBanSelf", + "inputs": [] + }, + { + "type": "error", + "name": "Banning__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Banning__NotBanned", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ChannelService__ChannelDisabled", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__ChannelDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "ChannelService__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__DurationZero", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__InvalidTokenId", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ERC5643__NotApprovedOrOwner", + "inputs": [] + }, + { + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "EntitlementsService__InvalidEntitlementInterface", + "inputs": [] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__EntitlementDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidEntitlementAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__InvalidPermission", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__PermissionDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "Roles__RoleDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidByteLength", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidStringLength", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/Roles.bin b/packages/generated/v3/abis/Roles.bin new file mode 100644 index 000000000..2c81d86c0 --- /dev/null +++ b/packages/generated/v3/abis/Roles.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b50613114806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80639a8e4c3e116100665780639a8e4c3e1461012a578063b42642331461013d578063b75157611461015d578063ba201ba814610170578063dba818641461018357600080fd5b80634d8b50a2146100a357806371061398146100b8578063784c872b146100d65780638fcd793d146100f65780639269182114610117575b600080fd5b6100b66100b13660046128d9565b610196565b005b6100c06101e7565b6040516100cd9190612aaf565b60405180910390f35b6100e96100e4366004612b13565b6101f6565b6040516100cd9190612b2c565b610109610104366004612b3f565b610242565b6040519081526020016100cd565b6100b6610125366004612b13565b61028d565b6100b6610138366004612bcc565b6102d6565b61015061014b366004612b13565b610321565b6040516100cd9190612c12565b6100b661016b366004612bcc565b61032c565b6100b661017e366004612c69565b610373565b6100b6610191366004612c69565b6103ba565b6101ca604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6101d385610429565b6101e08585858585610470565b5050505050565b60606101f161076d565b905090565b61022a6040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b61023382610429565b61023c826108af565b92915050565b6000610278604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b61028485858585610928565b95945050505050565b6102c1604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6102ca81610429565b6102d381610b0b565b50565b61030a604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b61031382610429565b61031d8282610d6f565b5050565b606061023c82610e5a565b610360604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b61036982610429565b61031d8282610e6e565b6103a7604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6103b082610429565b61031d8282610f1f565b6103ee604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6103f782610429565b61031d8282610f54565b61040c600082610f79565b6102d357604051630ce39a4b60e21b815260040160405180910390fd5b6104537f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0182610ffd565b6102d35760405163a3f70f7b60e01b815260040160405180910390fd5b600061047b86611018565b80518351919250906000816001600160401b0381111561049d5761049d612654565b6040519080825280602002602001820160405280156104c6578160200160208202803683370190505b50905060005b828110156105595760008682815181106104e8576104e8612ca5565b60200260200101516000015190506104ff8161111c565b610508816111e5565b86828151811061051a5761051a612ca5565b60200260200101516000015183838151811061053857610538612ca5565b6001600160a01b0390921660209283029190910190910152506001016104cc565b5086156105885760008981526000805160206130f483398151915260205260409020610586888a83612d37565b505b8551156105ce5760008981526000805160206130f4833981519152602052604081206105b69060020161124d565b90506105c28a82610d6f565b6105cc8a88610e6e565b505b816000036105df57505050506101e0565b80511561065857805160005b8481101561061e576106168b87838151811061060957610609612ca5565b6020026020010151611258565b6001016105eb565b5060005b818110156106555761064d8b84838151811061064057610640612ca5565b60200260200101516112d0565b600101610622565b50505b60005b8381101561068e5761068685828151811061067857610678612ca5565b60200260200101518b611343565b60010161065b565b5060005b828110156107345760008682815181106106ae576106ae612ca5565b60200260200101516020015151111561072c576106e78682815181106106d6576106d6612ca5565b6020026020010151602001516113aa565b61072c8682815181106106fc576106fc612ca5565b6020026020010151600001518b88848151811061071b5761071b612ca5565b6020026020010151602001516113cc565b600101610692565b50604051899033907f1aff41ff8e9139aae6bb355cc69107cda7e1d1dcd25511da436f3171bdbf77e690600090a3505050505050505050565b6060600061077961143a565b8051909150806001600160401b0381111561079657610796612654565b6040519080825280602002602001820160405280156107fb57816020015b6107e86040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b8152602001906001900390816107b45790505b50925060005b818110156108a95760008060008061083187868151811061082457610824612ca5565b6020026020010151611465565b93509350935093506040518060a0016040528088878151811061085657610856612ca5565b6020026020010151815260200185815260200184151581526020018381526020018281525088868151811061088d5761088d612ca5565b6020026020010181905250848060010195505050505050610801565b50505090565b6108e36040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b6000806000806108f286611465565b6040805160a0810182529a8b5260208b019490945291151592890192909252606088019190915260808701525093949350505050565b600061096c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506002925061157e915050565b81516000816001600160401b0381111561098857610988612654565b6040519080825280602002602001820160405280156109b1578160200160208202803683370190505b5090506109bc6115a7565b925060005b82811015610a90576109ef8582815181106109de576109de612ca5565b60200260200101516000015161111c565b848181518110610a0157610a01612ca5565b602002602001015160000151828281518110610a1f57610a1f612ca5565b60200260200101906001600160a01b031690816001600160a01b031681525050610a548582815181106106d6576106d6612ca5565b610a88858281518110610a6957610a69612ca5565b6020026020010151600001518587848151811061071b5761071b612ca5565b6001016109c1565b50610ad387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525092508991508590506115cd565b50604051839033907f20a7a288530dd94b1eccaa691a582ecfd7550c9dfcee78ddf50a97f774a2b14790600090a35050949350505050565b6000610b1682611018565b80519091506000805160206130d4833981519152610b547f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01856116f6565b506000848152600382016020526040812090610b708282612564565b60018201805460ff19169055600282016000610b8c828261259e565b50506004820160008181610ba082826125bc565b5050604080516020808201835260008083528b815260038901909152919091209450610bd193509150839050612df6565b506000848152600382016020526040812060018101805460ff19169055610bfa90600201611702565b6000868152600384016020526040812091925090610c1a90600401611702565b905060005b82811015610c6a5760008781526003850160205260409020610c6190610c48906002018361170c565b6000898152600387016020526040902060020190611718565b50600101610c1f565b5060005b81811015610cb95760008781526003850160205260409020610cb090610c979060040183611724565b6000898152600387016020526040902060040190611730565b50600101610c6e565b506000610cc587611745565b805190915060005b81811015610d0057610cf8838281518110610cea57610cea612ca5565b60200260200101518a611831565b600101610ccd565b5060005b86811015610d3757610d2f888281518110610d2157610d21612ca5565b60200260200101518a611343565b600101610d04565b50604051889033907f268a6f1b90f6f5ddf50cc736d36513e80cdc5fd56326bff71f335e8b4b61d05590600090a35050505050505050565b80516000805160206130d48339815191529060005b818110156101e057610dae848281518110610da157610da1612ca5565b60200260200101516118c1565b610df1848281518110610dc357610dc3612ca5565b60200260200101518460030160008881526020019081526020016000206002016118e290919063ffffffff16565b610e0e57604051633e2b026160e01b815260040160405180910390fd5b610e51848281518110610e2357610e23612ca5565b602002602001015184600301600088815260200190815260200160002060020161171890919063ffffffff16565b50600101610d84565b6060610e6582611465565b50949350505050565b80516000805160206130d48339815191529060005b818110156101e057610ea0848281518110610da157610da1612ca5565b610eb5848281518110610dc357610dc3612ca5565b15610ed35760405163b0ab682160e01b815260040160405180910390fd5b610f16848281518110610ee857610ee8612ca5565b60200260200101518460030160008881526020019081526020016000206002016118ee90919063ffffffff16565b50600101610e83565b610f2882610429565b8051610f33906111e5565b610f418282600001516112d0565b61031d81600001518383602001516113cc565b8051610f5f906111e5565b610f6d828260000151611258565b805161031d9083611343565b60003380610f856118fa565b6001600160a01b03161480610ff557507fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff16158015610ff55750610ff5848285604051602001610fd89190612eb5565b604051602081830303815290604052610ff090612ed1565b6119be565b949350505050565b600081815260018301602052604081205415155b9392505050565b60008181526000805160206130f4833981519152602052604081206060919061104390600401611702565b6001600160401b0381111561105a5761105a612654565b604051908082528060200260200182016040528015611083578160200160208202803683370190505b50905060005b60008481526000805160206130f4833981519152602052604090206110b090600401611702565b8110156111155760008481526000805160206130f4833981519152602052604081206110df9060040183611724565b9050808383815181106110f4576110f4612ca5565b6001600160a01b039092166020928302919091019091015250600101611089565b5092915050565b6001600160a01b03811661114357604051630706e15760e51b815260040160405180910390fd5b6040516301ffc9a760e01b8152637bc2cb4560e11b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa9250505080156111aa575060408051601f3d908101601f191682019092526111a791810190612ef5565b60015b6111c75760405163f58a5f2760e01b815260040160405180910390fd5b8061031d5760405163f58a5f2760e01b815260040160405180910390fd5b7fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006112307fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c9310183611c6b565b61031d5760405163017ab33760e71b815260040160405180910390fd5b606061023c82611c8d565b60008281526000805160206130f4833981519152602052604090206000805160206130d4833981519152906112909060040183611c6b565b6112ad57604051632405297d60e11b815260040160405180910390fd5b600083815260038201602052604090206112ca9060040183611730565b50505050565b60008281526000805160206130f4833981519152602052604090206000805160206130d4833981519152906113089060040183611c6b565b156113265760405163fb5584f160e01b815260040160405180910390fd5b600083815260038201602052604090206112ca9060040183611d6a565b61134c826111e5565b60405163f0c111f960e01b8152600481018290526001600160a01b0383169063f0c111f990602401600060405180830381600087803b15801561138e57600080fd5b505af11580156113a2573d6000803e3d6000fd5b505050505050565b80516000036102d3576040516319c6193b60e31b815260040160405180910390fd5b6113d5836111e5565b604051633be2f95d60e21b81526001600160a01b0384169063ef8be574906114039085908590600401612f17565b600060405180830381600087803b15801561141d57600080fd5b505af1158015611431573d6000803e3d6000fd5b50505050505050565b60606101f17f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01611d7f565b60008181526000805160206130f483398151915260205260408120805460609291839182919061149490612cbb565b80601f01602080910402602001604051908101604052809291908181526020018280546114c090612cbb565b801561150d5780601f106114e25761010080835404028352916020019161150d565b820191906000526020600020905b8154815290600101906020018083116114f057829003601f168201915b505050505093506115296000805160206130d483398151915290565b600086815260039190910160209081526040808320600101546000805160206130f483398151915290925290912060ff909116935061156a9060020161124d565b915061157585611018565b90509193509193565b815182908211156115a2576040516374eb20a760e01b815260040160405180910390fd5b505050565b6000805160206130d48339815191528054600091906115c7906001612f46565b91505090565b6000805160206130d4833981519152805460009190819083906115ef90612f59565b918290555091506116036001820183611d8c565b506000828152600382016020526040902061161e8782612df6565b5060008281526003820160205260409020600101805460ff19168615151790556116488285610e6e565b60005b83518110156116ec5760006001600160a01b031684828151811061167157611671612ca5565b60200260200101516001600160a01b0316036116a057604051637442429b60e01b815260040160405180910390fd5b6116e38482815181106116b5576116b5612ca5565b6020026020010151836003016000868152602001908152602001600020600401611d6a90919063ffffffff16565b5060010161164b565b5050949350505050565b60006110118383611d98565b600061023c825490565b60606110118383611e8b565b60006110118383611f3d565b600061101183836120f2565b6000611011836001600160a01b038416611d98565b60606000805160206130b4833981519152600061176182611702565b90506000816001600160401b0381111561177d5761177d612654565b6040519080825280602002602001820160405280156117a6578160200160208202803683370190505b50935060005b828110156118165760006117c08583611724565b600081815260038701602052604090209091506117dd9088610ffd565b1561180d578086846117ee81612f59565b95508151811061180057611800612ca5565b6020026020010181815250505b506001016117ac565b5080821115611829578351818303900384525b505050919050565b61183a8261211c565b61184382612151565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504303602052604090206000805160206130b48339815191529061188a9083610ffd565b6118a7576040516333cb039f60e11b815260040160405180910390fd5b600083815260038201602052604090206112ca90836116f6565b80516000036102d35760405162ce76c160e41b815260040160405180910390fd5b600061101183836121b3565b600061101183836121e0565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa15801561199a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c79190612f72565b6000806119c96118fa565b905060006119d685612242565b805190915060006119e56123c0565b805190915060005b83811015611aa4576000858281518110611a0957611a09612ca5565b60200260200101519050866001600160a01b0316816001600160a01b031603611a3c576001975050505050505050611011565b60005b83811015611a9a57816001600160a01b0316611a73868381518110611a6657611a66612ca5565b60200260200101516123eb565b6001600160a01b031603611a9257600098505050505050505050611011565b600101611a3f565b50506001016119ed565b507fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006000611af17fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c93101611702565b905060005b81811015611c595760008381611b0f6001830185611724565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015611b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbc9190612ef5565b158015611c39575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401611bf893929190612f8f565b602060405180830381865afa158015611c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c399190612ef5565b15611c505760019950505050505050505050611011565b50600101611af6565b5060009b9a5050505050505050505050565b6001600160a01b03811660009081526001830160205260408120541515611011565b606081600001805480602002602001604051908101604052809291908181526020016000905b82821015611d5f578382906000526020600020018054611cd290612cbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611cfe90612cbb565b8015611d4b5780601f10611d2057610100808354040283529160200191611d4b565b820191906000526020600020905b815481529060010190602001808311611d2e57829003601f168201915b505050505081526020019060010190611cb3565b505050509050919050565b6000611011836001600160a01b0384166123f6565b606060006110118361243d565b600061101183836123f6565b60008181526001830160205260408120548015611e81576000611dbc600183612ff1565b8554909150600090611dd090600190612ff1565b9050808214611e35576000866000018281548110611df057611df0612ca5565b9060005260206000200154905080876000018481548110611e1357611e13612ca5565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611e4657611e46613004565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061023c565b600091505061023c565b6060826000018281548110611ea257611ea2612ca5565b906000526020600020018054611eb790612cbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee390612cbb565b8015611f305780601f10611f0557610100808354040283529160200191611f30565b820191906000526020600020905b815481529060010190602001808311611f1357829003601f168201915b5050505050905092915050565b6000808360010183604051611f529190612eb5565b908152602001604051809103902054905080600014611e81576000611f78600183612ff1565b8554909150600090611f8c90600190612ff1565b9050818114612093576000866000018281548110611fac57611fac612ca5565b906000526020600020018054611fc190612cbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611fed90612cbb565b801561203a5780601f1061200f5761010080835404028352916020019161203a565b820191906000526020600020905b81548152906001019060200180831161201d57829003601f168201915b505050505090508087600001848154811061205757612057612ca5565b90600052602060002001908161206d9190612df6565b508387600101826040516120819190612eb5565b90815260405190819003602001902055505b85548690806120a4576120a4613004565b6001900381819060005260206000200160006120c09190612564565b905585600101856040516120d49190612eb5565b9081526020016040518091039020600090556001935050505061023c565b600082600001828154811061210957612109612ca5565b9060005260206000200154905092915050565b6121346000805160206130b483398151915282610ffd565b6102d35760405163560b4b4160e11b815260040160405180910390fd5b60008181527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430260205260409020600101546000805160206130b48339815191529060ff161561031d57604051636ce0028960e11b815260040160405180910390fd5b600082600101826040516121c79190612eb5565b9081526040519081900360200190205415159392505050565b60006121ec83836121b3565b61223a5782546001810184556000848152602090200161220c8382612df6565b5082546040516001850190612222908590612eb5565b9081526040519081900360200190205550600161023c565b50600061023c565b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa1580156122b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122df919081019061301a565b805190915060006122f1826001612f46565b6001600160401b0381111561230857612308612654565b604051908082528060200260200182016040528015612331578160200160208202803683370190505b50905060005b8281101561238b5783818151811061235157612351612ca5565b602002602001015182828151811061236b5761236b612ca5565b6001600160a01b0390921660209283029190910190910152600101612337565b508581838151811061239f5761239f612ca5565b6001600160a01b039092166020928302919091019091015295945050505050565b60606101f17f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611d7f565b600061023c82612499565b600081815260018301602052604081205461223a5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561023c565b60608160000180548060200260200160405190810160405280929190818152602001828054801561248d57602002820191906000526020600020905b815481526020019060010190808311612479575b50505050509050919050565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b8316900361254a5781600003612544578054831061252057604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115612521575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b50805461257090612cbb565b6000825580601f10612580575050565b601f0160209004906000526020600020908101906102d391906125d6565b50805460008255906000526020600020908101906102d391906125ef565b50805460008255906000526020600020908101906102d391905b5b808211156125eb57600081556001016125d7565b5090565b808211156125eb5760006126038282612564565b506001016125ef565b60008083601f84011261261e57600080fd5b5081356001600160401b0381111561263557600080fd5b60208301915083602082850101111561264d57600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561269257612692612654565b604052919050565b60006001600160401b038211156126b3576126b3612654565b5060051b60200190565b60006001600160401b038311156126d6576126d6612654565b6126e9601f8401601f191660200161266a565b90508281528383830111156126fd57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261272557600080fd5b8135602061273a6127358361269a565b61266a565b82815260059290921b8401810191818101908684111561275957600080fd5b8286015b848110156127ad5780356001600160401b0381111561277c5760008081fd5b8701603f8101891361278e5760008081fd5b61279f8986830135604084016126bd565b84525091830191830161275d565b509695505050505050565b6001600160a01b03811681146102d357600080fd5b6000604082840312156127df57600080fd5b604051604081016001600160401b03828210818311171561280257612802612654565b8160405282935084359150612816826127b8565b9082526020840135908082111561282c57600080fd5b508301601f8101851361283e57600080fd5b61284d858235602084016126bd565b6020830152505092915050565b600082601f83011261286b57600080fd5b8135602061287b6127358361269a565b82815260059290921b8401810191818101908684111561289a57600080fd5b8286015b848110156127ad5780356001600160401b038111156128bd5760008081fd5b6128cb8986838b01016127cd565b84525091830191830161289e565b6000806000806000608086880312156128f157600080fd5b8535945060208601356001600160401b038082111561290f57600080fd5b61291b89838a0161260c565b9096509450604088013591508082111561293457600080fd5b61294089838a01612714565b9350606088013591508082111561295657600080fd5b506129638882890161285a565b9150509295509295909350565b60005b8381101561298b578181015183820152602001612973565b50506000910152565b600081518084526129ac816020860160208601612970565b601f01601f19169290920160200192915050565b60008151808452602080850194506020840160005b838110156129fa5781516001600160a01b0316875295820195908201906001016129d5565b509495945050505050565b80518252600060208083015160a082860152612a2460a0860182612994565b9050604084015115156040860152606084015185820360608701528181518084528484019150848160051b850101858401935060005b82811015612a8857601f19868303018452612a76828651612994565b94870194938701939150600101612a5a565b506080880151955088810360808a0152612aa281876129c0565b9998505050505050505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015612b0657603f19888603018452612af4858351612a05565b94509285019290850190600101612ad8565b5092979650505050505050565b600060208284031215612b2557600080fd5b5035919050565b6020815260006110116020830184612a05565b60008060008060608587031215612b5557600080fd5b84356001600160401b0380821115612b6c57600080fd5b612b788883890161260c565b90965094506020870135915080821115612b9157600080fd5b612b9d88838901612714565b93506040870135915080821115612bb357600080fd5b50612bc08782880161285a565b91505092959194509250565b60008060408385031215612bdf57600080fd5b8235915060208301356001600160401b03811115612bfc57600080fd5b612c0885828601612714565b9150509250929050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015612b0657603f19888603018452612c57858351612994565b94509285019290850190600101612c3b565b60008060408385031215612c7c57600080fd5b8235915060208301356001600160401b03811115612c9957600080fd5b612c08858286016127cd565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680612ccf57607f821691505b60208210810361254457634e487b7160e01b600052602260045260246000fd5b601f8211156115a2576000816000526020600020601f850160051c81016020861015612d185750805b601f850160051c820191505b818110156113a257828155600101612d24565b6001600160401b03831115612d4e57612d4e612654565b612d6283612d5c8354612cbb565b83612cef565b6000601f841160018114612d965760008515612d7e5750838201355b600019600387901b1c1916600186901b1783556101e0565b600083815260209020601f19861690835b82811015612dc75786850135825560209485019460019092019101612da7565b5086821015612de45760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81516001600160401b03811115612e0f57612e0f612654565b612e2381612e1d8454612cbb565b84612cef565b602080601f831160018114612e585760008415612e405750858301515b600019600386901b1c1916600185901b1785556113a2565b600085815260208120601f198616915b82811015612e8757888601518255948401946001909101908401612e68565b5085821015612ea55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251612ec7818460208701612970565b9190910192915050565b805160208083015191908110156125445760001960209190910360031b1b16919050565b600060208284031215612f0757600080fd5b8151801515811461101157600080fd5b828152604060208201526000610ff56040830184612994565b634e487b7160e01b600052601160045260246000fd5b8082018082111561023c5761023c612f30565b600060018201612f6b57612f6b612f30565b5060010190565b600060208284031215612f8457600080fd5b8151611011816127b8565b60006060820185835260206060602085015281865180845260808601915060208801935060005b81811015612fdb5784516001600160a01b031683529383019391830191600101612fb6565b5050809350505050826040830152949350505050565b8181038181111561023c5761023c612f30565b634e487b7160e01b600052603160045260246000fd5b6000602080838503121561302d57600080fd5b82516001600160401b0381111561304357600080fd5b8301601f8101851361305457600080fd5b80516130626127358261269a565b81815260059190911b8201830190838101908783111561308157600080fd5b928401925b828410156130a8578351613099816127b8565b82529284019290840190613086565b97965050505050505056fe804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504300672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd00672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd03 \ No newline at end of file diff --git a/packages/generated/v3/abis/Roles.json b/packages/generated/v3/abis/Roles.json new file mode 100644 index 000000000..391b66566 --- /dev/null +++ b/packages/generated/v3/abis/Roles.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"addPermissionsToRole","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"permissions","type":"string[]","internalType":"string[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addRoleToEntitlement","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"entitlement","type":"tuple","internalType":"struct IRolesBase.CreateEntitlement","components":[{"name":"module","type":"address","internalType":"contract IEntitlement"},{"name":"data","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"createRole","inputs":[{"name":"roleName","type":"string","internalType":"string"},{"name":"permissions","type":"string[]","internalType":"string[]"},{"name":"entitlements","type":"tuple[]","internalType":"struct IRolesBase.CreateEntitlement[]","components":[{"name":"module","type":"address","internalType":"contract IEntitlement"},{"name":"data","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"getPermissionsByRoleId","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"permissions","type":"string[]","internalType":"string[]"}],"stateMutability":"view"},{"type":"function","name":"getRoleById","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IRolesBase.Role","components":[{"name":"id","type":"uint256","internalType":"uint256"},{"name":"name","type":"string","internalType":"string"},{"name":"disabled","type":"bool","internalType":"bool"},{"name":"permissions","type":"string[]","internalType":"string[]"},{"name":"entitlements","type":"address[]","internalType":"contract IEntitlement[]"}]}],"stateMutability":"view"},{"type":"function","name":"getRoles","inputs":[],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IRolesBase.Role[]","components":[{"name":"id","type":"uint256","internalType":"uint256"},{"name":"name","type":"string","internalType":"string"},{"name":"disabled","type":"bool","internalType":"bool"},{"name":"permissions","type":"string[]","internalType":"string[]"},{"name":"entitlements","type":"address[]","internalType":"contract IEntitlement[]"}]}],"stateMutability":"view"},{"type":"function","name":"removePermissionsFromRole","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"permissions","type":"string[]","internalType":"string[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeRole","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeRoleFromEntitlement","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"entitlement","type":"tuple","internalType":"struct IRolesBase.CreateEntitlement","components":[{"name":"module","type":"address","internalType":"contract IEntitlement"},{"name":"data","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateRole","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"roleName","type":"string","internalType":"string"},{"name":"permissions","type":"string[]","internalType":"string[]"},{"name":"entitlements","type":"tuple[]","internalType":"struct IRolesBase.CreateEntitlement[]","components":[{"name":"module","type":"address","internalType":"contract IEntitlement"},{"name":"data","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"Banned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ConsecutiveTransfer","inputs":[{"name":"fromTokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"toTokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleCreated","inputs":[{"name":"creator","type":"address","indexed":true,"internalType":"address"},{"name":"roleId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"RoleRemoved","inputs":[{"name":"remover","type":"address","indexed":true,"internalType":"address"},{"name":"roleId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"RoleUpdated","inputs":[{"name":"updater","type":"address","indexed":true,"internalType":"address"},{"name":"roleId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"SubscriptionUpdate","inputs":[{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"expiration","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unbanned","inputs":[{"name":"moderator","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"ApprovalCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"ApprovalQueryForNonexistentToken","inputs":[]},{"type":"error","name":"BalanceQueryForZeroAddress","inputs":[]},{"type":"error","name":"Banning__AlreadyBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__CannotBanSelf","inputs":[]},{"type":"error","name":"Banning__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Banning__NotBanned","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ChannelService__ChannelDisabled","inputs":[]},{"type":"error","name":"ChannelService__ChannelDoesNotExist","inputs":[]},{"type":"error","name":"ChannelService__RoleDoesNotExist","inputs":[]},{"type":"error","name":"ERC5643__DurationZero","inputs":[]},{"type":"error","name":"ERC5643__InvalidTokenId","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC5643__NotApprovedOrOwner","inputs":[]},{"type":"error","name":"ERC5643__SubscriptionNotRenewable","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Entitlement__InvalidValue","inputs":[]},{"type":"error","name":"Entitlement__NotAllowed","inputs":[]},{"type":"error","name":"Entitlement__NotMember","inputs":[]},{"type":"error","name":"Entitlement__ValueAlreadyExists","inputs":[]},{"type":"error","name":"EntitlementsService__EntitlementDoesNotExist","inputs":[]},{"type":"error","name":"EntitlementsService__InvalidEntitlementAddress","inputs":[]},{"type":"error","name":"EntitlementsService__InvalidEntitlementInterface","inputs":[]},{"type":"error","name":"MintERC2309QuantityExceedsLimit","inputs":[]},{"type":"error","name":"MintToZeroAddress","inputs":[]},{"type":"error","name":"MintZeroQuantity","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]},{"type":"error","name":"OwnerQueryForNonexistentToken","inputs":[]},{"type":"error","name":"OwnershipNotInitializedForExtraData","inputs":[]},{"type":"error","name":"Pausable__NotPaused","inputs":[]},{"type":"error","name":"Pausable__Paused","inputs":[]},{"type":"error","name":"Roles__EntitlementAlreadyExists","inputs":[]},{"type":"error","name":"Roles__EntitlementDoesNotExist","inputs":[]},{"type":"error","name":"Roles__InvalidEntitlementAddress","inputs":[]},{"type":"error","name":"Roles__InvalidPermission","inputs":[]},{"type":"error","name":"Roles__PermissionAlreadyExists","inputs":[]},{"type":"error","name":"Roles__PermissionDoesNotExist","inputs":[]},{"type":"error","name":"Roles__RoleDoesNotExist","inputs":[]},{"type":"error","name":"TransferCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"TransferFromIncorrectOwner","inputs":[]},{"type":"error","name":"TransferToNonERC721ReceiverImplementer","inputs":[]},{"type":"error","name":"TransferToZeroAddress","inputs":[]},{"type":"error","name":"URIQueryForNonexistentToken","inputs":[]},{"type":"error","name":"Validator__InvalidByteLength","inputs":[]},{"type":"error","name":"Validator__InvalidStringLength","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b50613114806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80639a8e4c3e116100665780639a8e4c3e1461012a578063b42642331461013d578063b75157611461015d578063ba201ba814610170578063dba818641461018357600080fd5b80634d8b50a2146100a357806371061398146100b8578063784c872b146100d65780638fcd793d146100f65780639269182114610117575b600080fd5b6100b66100b13660046128d9565b610196565b005b6100c06101e7565b6040516100cd9190612aaf565b60405180910390f35b6100e96100e4366004612b13565b6101f6565b6040516100cd9190612b2c565b610109610104366004612b3f565b610242565b6040519081526020016100cd565b6100b6610125366004612b13565b61028d565b6100b6610138366004612bcc565b6102d6565b61015061014b366004612b13565b610321565b6040516100cd9190612c12565b6100b661016b366004612bcc565b61032c565b6100b661017e366004612c69565b610373565b6100b6610191366004612c69565b6103ba565b6101ca604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6101d385610429565b6101e08585858585610470565b5050505050565b60606101f161076d565b905090565b61022a6040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b61023382610429565b61023c826108af565b92915050565b6000610278604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b61028485858585610928565b95945050505050565b6102c1604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6102ca81610429565b6102d381610b0b565b50565b61030a604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b61031382610429565b61031d8282610d6f565b5050565b606061023c82610e5a565b610360604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b61036982610429565b61031d8282610e6e565b6103a7604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6103b082610429565b61031d8282610f1f565b6103ee604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6103f782610429565b61031d8282610f54565b61040c600082610f79565b6102d357604051630ce39a4b60e21b815260040160405180910390fd5b6104537f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0182610ffd565b6102d35760405163a3f70f7b60e01b815260040160405180910390fd5b600061047b86611018565b80518351919250906000816001600160401b0381111561049d5761049d612654565b6040519080825280602002602001820160405280156104c6578160200160208202803683370190505b50905060005b828110156105595760008682815181106104e8576104e8612ca5565b60200260200101516000015190506104ff8161111c565b610508816111e5565b86828151811061051a5761051a612ca5565b60200260200101516000015183838151811061053857610538612ca5565b6001600160a01b0390921660209283029190910190910152506001016104cc565b5086156105885760008981526000805160206130f483398151915260205260409020610586888a83612d37565b505b8551156105ce5760008981526000805160206130f4833981519152602052604081206105b69060020161124d565b90506105c28a82610d6f565b6105cc8a88610e6e565b505b816000036105df57505050506101e0565b80511561065857805160005b8481101561061e576106168b87838151811061060957610609612ca5565b6020026020010151611258565b6001016105eb565b5060005b818110156106555761064d8b84838151811061064057610640612ca5565b60200260200101516112d0565b600101610622565b50505b60005b8381101561068e5761068685828151811061067857610678612ca5565b60200260200101518b611343565b60010161065b565b5060005b828110156107345760008682815181106106ae576106ae612ca5565b60200260200101516020015151111561072c576106e78682815181106106d6576106d6612ca5565b6020026020010151602001516113aa565b61072c8682815181106106fc576106fc612ca5565b6020026020010151600001518b88848151811061071b5761071b612ca5565b6020026020010151602001516113cc565b600101610692565b50604051899033907f1aff41ff8e9139aae6bb355cc69107cda7e1d1dcd25511da436f3171bdbf77e690600090a3505050505050505050565b6060600061077961143a565b8051909150806001600160401b0381111561079657610796612654565b6040519080825280602002602001820160405280156107fb57816020015b6107e86040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b8152602001906001900390816107b45790505b50925060005b818110156108a95760008060008061083187868151811061082457610824612ca5565b6020026020010151611465565b93509350935093506040518060a0016040528088878151811061085657610856612ca5565b6020026020010151815260200185815260200184151581526020018381526020018281525088868151811061088d5761088d612ca5565b6020026020010181905250848060010195505050505050610801565b50505090565b6108e36040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b6000806000806108f286611465565b6040805160a0810182529a8b5260208b019490945291151592890192909252606088019190915260808701525093949350505050565b600061096c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506002925061157e915050565b81516000816001600160401b0381111561098857610988612654565b6040519080825280602002602001820160405280156109b1578160200160208202803683370190505b5090506109bc6115a7565b925060005b82811015610a90576109ef8582815181106109de576109de612ca5565b60200260200101516000015161111c565b848181518110610a0157610a01612ca5565b602002602001015160000151828281518110610a1f57610a1f612ca5565b60200260200101906001600160a01b031690816001600160a01b031681525050610a548582815181106106d6576106d6612ca5565b610a88858281518110610a6957610a69612ca5565b6020026020010151600001518587848151811061071b5761071b612ca5565b6001016109c1565b50610ad387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525092508991508590506115cd565b50604051839033907f20a7a288530dd94b1eccaa691a582ecfd7550c9dfcee78ddf50a97f774a2b14790600090a35050949350505050565b6000610b1682611018565b80519091506000805160206130d4833981519152610b547f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01856116f6565b506000848152600382016020526040812090610b708282612564565b60018201805460ff19169055600282016000610b8c828261259e565b50506004820160008181610ba082826125bc565b5050604080516020808201835260008083528b815260038901909152919091209450610bd193509150839050612df6565b506000848152600382016020526040812060018101805460ff19169055610bfa90600201611702565b6000868152600384016020526040812091925090610c1a90600401611702565b905060005b82811015610c6a5760008781526003850160205260409020610c6190610c48906002018361170c565b6000898152600387016020526040902060020190611718565b50600101610c1f565b5060005b81811015610cb95760008781526003850160205260409020610cb090610c979060040183611724565b6000898152600387016020526040902060040190611730565b50600101610c6e565b506000610cc587611745565b805190915060005b81811015610d0057610cf8838281518110610cea57610cea612ca5565b60200260200101518a611831565b600101610ccd565b5060005b86811015610d3757610d2f888281518110610d2157610d21612ca5565b60200260200101518a611343565b600101610d04565b50604051889033907f268a6f1b90f6f5ddf50cc736d36513e80cdc5fd56326bff71f335e8b4b61d05590600090a35050505050505050565b80516000805160206130d48339815191529060005b818110156101e057610dae848281518110610da157610da1612ca5565b60200260200101516118c1565b610df1848281518110610dc357610dc3612ca5565b60200260200101518460030160008881526020019081526020016000206002016118e290919063ffffffff16565b610e0e57604051633e2b026160e01b815260040160405180910390fd5b610e51848281518110610e2357610e23612ca5565b602002602001015184600301600088815260200190815260200160002060020161171890919063ffffffff16565b50600101610d84565b6060610e6582611465565b50949350505050565b80516000805160206130d48339815191529060005b818110156101e057610ea0848281518110610da157610da1612ca5565b610eb5848281518110610dc357610dc3612ca5565b15610ed35760405163b0ab682160e01b815260040160405180910390fd5b610f16848281518110610ee857610ee8612ca5565b60200260200101518460030160008881526020019081526020016000206002016118ee90919063ffffffff16565b50600101610e83565b610f2882610429565b8051610f33906111e5565b610f418282600001516112d0565b61031d81600001518383602001516113cc565b8051610f5f906111e5565b610f6d828260000151611258565b805161031d9083611343565b60003380610f856118fa565b6001600160a01b03161480610ff557507fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff16158015610ff55750610ff5848285604051602001610fd89190612eb5565b604051602081830303815290604052610ff090612ed1565b6119be565b949350505050565b600081815260018301602052604081205415155b9392505050565b60008181526000805160206130f4833981519152602052604081206060919061104390600401611702565b6001600160401b0381111561105a5761105a612654565b604051908082528060200260200182016040528015611083578160200160208202803683370190505b50905060005b60008481526000805160206130f4833981519152602052604090206110b090600401611702565b8110156111155760008481526000805160206130f4833981519152602052604081206110df9060040183611724565b9050808383815181106110f4576110f4612ca5565b6001600160a01b039092166020928302919091019091015250600101611089565b5092915050565b6001600160a01b03811661114357604051630706e15760e51b815260040160405180910390fd5b6040516301ffc9a760e01b8152637bc2cb4560e11b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa9250505080156111aa575060408051601f3d908101601f191682019092526111a791810190612ef5565b60015b6111c75760405163f58a5f2760e01b815260040160405180910390fd5b8061031d5760405163f58a5f2760e01b815260040160405180910390fd5b7fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006112307fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c9310183611c6b565b61031d5760405163017ab33760e71b815260040160405180910390fd5b606061023c82611c8d565b60008281526000805160206130f4833981519152602052604090206000805160206130d4833981519152906112909060040183611c6b565b6112ad57604051632405297d60e11b815260040160405180910390fd5b600083815260038201602052604090206112ca9060040183611730565b50505050565b60008281526000805160206130f4833981519152602052604090206000805160206130d4833981519152906113089060040183611c6b565b156113265760405163fb5584f160e01b815260040160405180910390fd5b600083815260038201602052604090206112ca9060040183611d6a565b61134c826111e5565b60405163f0c111f960e01b8152600481018290526001600160a01b0383169063f0c111f990602401600060405180830381600087803b15801561138e57600080fd5b505af11580156113a2573d6000803e3d6000fd5b505050505050565b80516000036102d3576040516319c6193b60e31b815260040160405180910390fd5b6113d5836111e5565b604051633be2f95d60e21b81526001600160a01b0384169063ef8be574906114039085908590600401612f17565b600060405180830381600087803b15801561141d57600080fd5b505af1158015611431573d6000803e3d6000fd5b50505050505050565b60606101f17f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01611d7f565b60008181526000805160206130f483398151915260205260408120805460609291839182919061149490612cbb565b80601f01602080910402602001604051908101604052809291908181526020018280546114c090612cbb565b801561150d5780601f106114e25761010080835404028352916020019161150d565b820191906000526020600020905b8154815290600101906020018083116114f057829003601f168201915b505050505093506115296000805160206130d483398151915290565b600086815260039190910160209081526040808320600101546000805160206130f483398151915290925290912060ff909116935061156a9060020161124d565b915061157585611018565b90509193509193565b815182908211156115a2576040516374eb20a760e01b815260040160405180910390fd5b505050565b6000805160206130d48339815191528054600091906115c7906001612f46565b91505090565b6000805160206130d4833981519152805460009190819083906115ef90612f59565b918290555091506116036001820183611d8c565b506000828152600382016020526040902061161e8782612df6565b5060008281526003820160205260409020600101805460ff19168615151790556116488285610e6e565b60005b83518110156116ec5760006001600160a01b031684828151811061167157611671612ca5565b60200260200101516001600160a01b0316036116a057604051637442429b60e01b815260040160405180910390fd5b6116e38482815181106116b5576116b5612ca5565b6020026020010151836003016000868152602001908152602001600020600401611d6a90919063ffffffff16565b5060010161164b565b5050949350505050565b60006110118383611d98565b600061023c825490565b60606110118383611e8b565b60006110118383611f3d565b600061101183836120f2565b6000611011836001600160a01b038416611d98565b60606000805160206130b4833981519152600061176182611702565b90506000816001600160401b0381111561177d5761177d612654565b6040519080825280602002602001820160405280156117a6578160200160208202803683370190505b50935060005b828110156118165760006117c08583611724565b600081815260038701602052604090209091506117dd9088610ffd565b1561180d578086846117ee81612f59565b95508151811061180057611800612ca5565b6020026020010181815250505b506001016117ac565b5080821115611829578351818303900384525b505050919050565b61183a8261211c565b61184382612151565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504303602052604090206000805160206130b48339815191529061188a9083610ffd565b6118a7576040516333cb039f60e11b815260040160405180910390fd5b600083815260038201602052604090206112ca90836116f6565b80516000036102d35760405162ce76c160e41b815260040160405180910390fd5b600061101183836121b3565b600061101183836121e0565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa15801561199a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c79190612f72565b6000806119c96118fa565b905060006119d685612242565b805190915060006119e56123c0565b805190915060005b83811015611aa4576000858281518110611a0957611a09612ca5565b60200260200101519050866001600160a01b0316816001600160a01b031603611a3c576001975050505050505050611011565b60005b83811015611a9a57816001600160a01b0316611a73868381518110611a6657611a66612ca5565b60200260200101516123eb565b6001600160a01b031603611a9257600098505050505050505050611011565b600101611a3f565b50506001016119ed565b507fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006000611af17fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c93101611702565b905060005b81811015611c595760008381611b0f6001830185611724565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015611b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbc9190612ef5565b158015611c39575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401611bf893929190612f8f565b602060405180830381865afa158015611c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c399190612ef5565b15611c505760019950505050505050505050611011565b50600101611af6565b5060009b9a5050505050505050505050565b6001600160a01b03811660009081526001830160205260408120541515611011565b606081600001805480602002602001604051908101604052809291908181526020016000905b82821015611d5f578382906000526020600020018054611cd290612cbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611cfe90612cbb565b8015611d4b5780601f10611d2057610100808354040283529160200191611d4b565b820191906000526020600020905b815481529060010190602001808311611d2e57829003601f168201915b505050505081526020019060010190611cb3565b505050509050919050565b6000611011836001600160a01b0384166123f6565b606060006110118361243d565b600061101183836123f6565b60008181526001830160205260408120548015611e81576000611dbc600183612ff1565b8554909150600090611dd090600190612ff1565b9050808214611e35576000866000018281548110611df057611df0612ca5565b9060005260206000200154905080876000018481548110611e1357611e13612ca5565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611e4657611e46613004565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061023c565b600091505061023c565b6060826000018281548110611ea257611ea2612ca5565b906000526020600020018054611eb790612cbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee390612cbb565b8015611f305780601f10611f0557610100808354040283529160200191611f30565b820191906000526020600020905b815481529060010190602001808311611f1357829003601f168201915b5050505050905092915050565b6000808360010183604051611f529190612eb5565b908152602001604051809103902054905080600014611e81576000611f78600183612ff1565b8554909150600090611f8c90600190612ff1565b9050818114612093576000866000018281548110611fac57611fac612ca5565b906000526020600020018054611fc190612cbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611fed90612cbb565b801561203a5780601f1061200f5761010080835404028352916020019161203a565b820191906000526020600020905b81548152906001019060200180831161201d57829003601f168201915b505050505090508087600001848154811061205757612057612ca5565b90600052602060002001908161206d9190612df6565b508387600101826040516120819190612eb5565b90815260405190819003602001902055505b85548690806120a4576120a4613004565b6001900381819060005260206000200160006120c09190612564565b905585600101856040516120d49190612eb5565b9081526020016040518091039020600090556001935050505061023c565b600082600001828154811061210957612109612ca5565b9060005260206000200154905092915050565b6121346000805160206130b483398151915282610ffd565b6102d35760405163560b4b4160e11b815260040160405180910390fd5b60008181527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430260205260409020600101546000805160206130b48339815191529060ff161561031d57604051636ce0028960e11b815260040160405180910390fd5b600082600101826040516121c79190612eb5565b9081526040519081900360200190205415159392505050565b60006121ec83836121b3565b61223a5782546001810184556000848152602090200161220c8382612df6565b5082546040516001850190612222908590612eb5565b9081526040519081900360200190205550600161023c565b50600061023c565b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa1580156122b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122df919081019061301a565b805190915060006122f1826001612f46565b6001600160401b0381111561230857612308612654565b604051908082528060200260200182016040528015612331578160200160208202803683370190505b50905060005b8281101561238b5783818151811061235157612351612ca5565b602002602001015182828151811061236b5761236b612ca5565b6001600160a01b0390921660209283029190910190910152600101612337565b508581838151811061239f5761239f612ca5565b6001600160a01b039092166020928302919091019091015295945050505050565b60606101f17f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611d7f565b600061023c82612499565b600081815260018301602052604081205461223a5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561023c565b60608160000180548060200260200160405190810160405280929190818152602001828054801561248d57602002820191906000526020600020905b815481526020019060010190808311612479575b50505050509050919050565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b8316900361254a5781600003612544578054831061252057604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115612521575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b50805461257090612cbb565b6000825580601f10612580575050565b601f0160209004906000526020600020908101906102d391906125d6565b50805460008255906000526020600020908101906102d391906125ef565b50805460008255906000526020600020908101906102d391905b5b808211156125eb57600081556001016125d7565b5090565b808211156125eb5760006126038282612564565b506001016125ef565b60008083601f84011261261e57600080fd5b5081356001600160401b0381111561263557600080fd5b60208301915083602082850101111561264d57600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561269257612692612654565b604052919050565b60006001600160401b038211156126b3576126b3612654565b5060051b60200190565b60006001600160401b038311156126d6576126d6612654565b6126e9601f8401601f191660200161266a565b90508281528383830111156126fd57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261272557600080fd5b8135602061273a6127358361269a565b61266a565b82815260059290921b8401810191818101908684111561275957600080fd5b8286015b848110156127ad5780356001600160401b0381111561277c5760008081fd5b8701603f8101891361278e5760008081fd5b61279f8986830135604084016126bd565b84525091830191830161275d565b509695505050505050565b6001600160a01b03811681146102d357600080fd5b6000604082840312156127df57600080fd5b604051604081016001600160401b03828210818311171561280257612802612654565b8160405282935084359150612816826127b8565b9082526020840135908082111561282c57600080fd5b508301601f8101851361283e57600080fd5b61284d858235602084016126bd565b6020830152505092915050565b600082601f83011261286b57600080fd5b8135602061287b6127358361269a565b82815260059290921b8401810191818101908684111561289a57600080fd5b8286015b848110156127ad5780356001600160401b038111156128bd5760008081fd5b6128cb8986838b01016127cd565b84525091830191830161289e565b6000806000806000608086880312156128f157600080fd5b8535945060208601356001600160401b038082111561290f57600080fd5b61291b89838a0161260c565b9096509450604088013591508082111561293457600080fd5b61294089838a01612714565b9350606088013591508082111561295657600080fd5b506129638882890161285a565b9150509295509295909350565b60005b8381101561298b578181015183820152602001612973565b50506000910152565b600081518084526129ac816020860160208601612970565b601f01601f19169290920160200192915050565b60008151808452602080850194506020840160005b838110156129fa5781516001600160a01b0316875295820195908201906001016129d5565b509495945050505050565b80518252600060208083015160a082860152612a2460a0860182612994565b9050604084015115156040860152606084015185820360608701528181518084528484019150848160051b850101858401935060005b82811015612a8857601f19868303018452612a76828651612994565b94870194938701939150600101612a5a565b506080880151955088810360808a0152612aa281876129c0565b9998505050505050505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015612b0657603f19888603018452612af4858351612a05565b94509285019290850190600101612ad8565b5092979650505050505050565b600060208284031215612b2557600080fd5b5035919050565b6020815260006110116020830184612a05565b60008060008060608587031215612b5557600080fd5b84356001600160401b0380821115612b6c57600080fd5b612b788883890161260c565b90965094506020870135915080821115612b9157600080fd5b612b9d88838901612714565b93506040870135915080821115612bb357600080fd5b50612bc08782880161285a565b91505092959194509250565b60008060408385031215612bdf57600080fd5b8235915060208301356001600160401b03811115612bfc57600080fd5b612c0885828601612714565b9150509250929050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015612b0657603f19888603018452612c57858351612994565b94509285019290850190600101612c3b565b60008060408385031215612c7c57600080fd5b8235915060208301356001600160401b03811115612c9957600080fd5b612c08858286016127cd565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680612ccf57607f821691505b60208210810361254457634e487b7160e01b600052602260045260246000fd5b601f8211156115a2576000816000526020600020601f850160051c81016020861015612d185750805b601f850160051c820191505b818110156113a257828155600101612d24565b6001600160401b03831115612d4e57612d4e612654565b612d6283612d5c8354612cbb565b83612cef565b6000601f841160018114612d965760008515612d7e5750838201355b600019600387901b1c1916600186901b1783556101e0565b600083815260209020601f19861690835b82811015612dc75786850135825560209485019460019092019101612da7565b5086821015612de45760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81516001600160401b03811115612e0f57612e0f612654565b612e2381612e1d8454612cbb565b84612cef565b602080601f831160018114612e585760008415612e405750858301515b600019600386901b1c1916600185901b1785556113a2565b600085815260208120601f198616915b82811015612e8757888601518255948401946001909101908401612e68565b5085821015612ea55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251612ec7818460208701612970565b9190910192915050565b805160208083015191908110156125445760001960209190910360031b1b16919050565b600060208284031215612f0757600080fd5b8151801515811461101157600080fd5b828152604060208201526000610ff56040830184612994565b634e487b7160e01b600052601160045260246000fd5b8082018082111561023c5761023c612f30565b600060018201612f6b57612f6b612f30565b5060010190565b600060208284031215612f8457600080fd5b8151611011816127b8565b60006060820185835260206060602085015281865180845260808601915060208801935060005b81811015612fdb5784516001600160a01b031683529383019391830191600101612fb6565b5050809350505050826040830152949350505050565b8181038181111561023c5761023c612f30565b634e487b7160e01b600052603160045260246000fd5b6000602080838503121561302d57600080fd5b82516001600160401b0381111561304357600080fd5b8301601f8101851361305457600080fd5b80516130626127358261269a565b81815260059190911b8201830190838101908783111561308157600080fd5b928401925b828410156130a8578351613099816127b8565b82529284019290840190613086565b97965050505050505056fe804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504300672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd00672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd03","sourceMap":"303:2281:205:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b506004361061009e5760003560e01c80639a8e4c3e116100665780639a8e4c3e1461012a578063b42642331461013d578063b75157611461015d578063ba201ba814610170578063dba818641461018357600080fd5b80634d8b50a2146100a357806371061398146100b8578063784c872b146100d65780638fcd793d146100f65780639269182114610117575b600080fd5b6100b66100b13660046128d9565b610196565b005b6100c06101e7565b6040516100cd9190612aaf565b60405180910390f35b6100e96100e4366004612b13565b6101f6565b6040516100cd9190612b2c565b610109610104366004612b3f565b610242565b6040519081526020016100cd565b6100b6610125366004612b13565b61028d565b6100b6610138366004612bcc565b6102d6565b61015061014b366004612b13565b610321565b6040516100cd9190612c12565b6100b661016b366004612bcc565b61032c565b6100b661017e366004612c69565b610373565b6100b6610191366004612c69565b6103ba565b6101ca604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6101d385610429565b6101e08585858585610470565b5050505050565b60606101f161076d565b905090565b61022a6040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b61023382610429565b61023c826108af565b92915050565b6000610278604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b61028485858585610928565b95945050505050565b6102c1604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6102ca81610429565b6102d381610b0b565b50565b61030a604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b61031382610429565b61031d8282610d6f565b5050565b606061023c82610e5a565b610360604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b61036982610429565b61031d8282610e6e565b6103a7604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6103b082610429565b61031d8282610f1f565b6103ee604051806040016040528060138152602001724d6f64696679537061636553657474696e677360681b815250610401565b6103f782610429565b61031d8282610f54565b61040c600082610f79565b6102d357604051630ce39a4b60e21b815260040160405180910390fd5b6104537f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0182610ffd565b6102d35760405163a3f70f7b60e01b815260040160405180910390fd5b600061047b86611018565b80518351919250906000816001600160401b0381111561049d5761049d612654565b6040519080825280602002602001820160405280156104c6578160200160208202803683370190505b50905060005b828110156105595760008682815181106104e8576104e8612ca5565b60200260200101516000015190506104ff8161111c565b610508816111e5565b86828151811061051a5761051a612ca5565b60200260200101516000015183838151811061053857610538612ca5565b6001600160a01b0390921660209283029190910190910152506001016104cc565b5086156105885760008981526000805160206130f483398151915260205260409020610586888a83612d37565b505b8551156105ce5760008981526000805160206130f4833981519152602052604081206105b69060020161124d565b90506105c28a82610d6f565b6105cc8a88610e6e565b505b816000036105df57505050506101e0565b80511561065857805160005b8481101561061e576106168b87838151811061060957610609612ca5565b6020026020010151611258565b6001016105eb565b5060005b818110156106555761064d8b84838151811061064057610640612ca5565b60200260200101516112d0565b600101610622565b50505b60005b8381101561068e5761068685828151811061067857610678612ca5565b60200260200101518b611343565b60010161065b565b5060005b828110156107345760008682815181106106ae576106ae612ca5565b60200260200101516020015151111561072c576106e78682815181106106d6576106d6612ca5565b6020026020010151602001516113aa565b61072c8682815181106106fc576106fc612ca5565b6020026020010151600001518b88848151811061071b5761071b612ca5565b6020026020010151602001516113cc565b600101610692565b50604051899033907f1aff41ff8e9139aae6bb355cc69107cda7e1d1dcd25511da436f3171bdbf77e690600090a3505050505050505050565b6060600061077961143a565b8051909150806001600160401b0381111561079657610796612654565b6040519080825280602002602001820160405280156107fb57816020015b6107e86040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b8152602001906001900390816107b45790505b50925060005b818110156108a95760008060008061083187868151811061082457610824612ca5565b6020026020010151611465565b93509350935093506040518060a0016040528088878151811061085657610856612ca5565b6020026020010151815260200185815260200184151581526020018381526020018281525088868151811061088d5761088d612ca5565b6020026020010181905250848060010195505050505050610801565b50505090565b6108e36040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b6000806000806108f286611465565b6040805160a0810182529a8b5260208b019490945291151592890192909252606088019190915260808701525093949350505050565b600061096c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506002925061157e915050565b81516000816001600160401b0381111561098857610988612654565b6040519080825280602002602001820160405280156109b1578160200160208202803683370190505b5090506109bc6115a7565b925060005b82811015610a90576109ef8582815181106109de576109de612ca5565b60200260200101516000015161111c565b848181518110610a0157610a01612ca5565b602002602001015160000151828281518110610a1f57610a1f612ca5565b60200260200101906001600160a01b031690816001600160a01b031681525050610a548582815181106106d6576106d6612ca5565b610a88858281518110610a6957610a69612ca5565b6020026020010151600001518587848151811061071b5761071b612ca5565b6001016109c1565b50610ad387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525092508991508590506115cd565b50604051839033907f20a7a288530dd94b1eccaa691a582ecfd7550c9dfcee78ddf50a97f774a2b14790600090a35050949350505050565b6000610b1682611018565b80519091506000805160206130d4833981519152610b547f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01856116f6565b506000848152600382016020526040812090610b708282612564565b60018201805460ff19169055600282016000610b8c828261259e565b50506004820160008181610ba082826125bc565b5050604080516020808201835260008083528b815260038901909152919091209450610bd193509150839050612df6565b506000848152600382016020526040812060018101805460ff19169055610bfa90600201611702565b6000868152600384016020526040812091925090610c1a90600401611702565b905060005b82811015610c6a5760008781526003850160205260409020610c6190610c48906002018361170c565b6000898152600387016020526040902060020190611718565b50600101610c1f565b5060005b81811015610cb95760008781526003850160205260409020610cb090610c979060040183611724565b6000898152600387016020526040902060040190611730565b50600101610c6e565b506000610cc587611745565b805190915060005b81811015610d0057610cf8838281518110610cea57610cea612ca5565b60200260200101518a611831565b600101610ccd565b5060005b86811015610d3757610d2f888281518110610d2157610d21612ca5565b60200260200101518a611343565b600101610d04565b50604051889033907f268a6f1b90f6f5ddf50cc736d36513e80cdc5fd56326bff71f335e8b4b61d05590600090a35050505050505050565b80516000805160206130d48339815191529060005b818110156101e057610dae848281518110610da157610da1612ca5565b60200260200101516118c1565b610df1848281518110610dc357610dc3612ca5565b60200260200101518460030160008881526020019081526020016000206002016118e290919063ffffffff16565b610e0e57604051633e2b026160e01b815260040160405180910390fd5b610e51848281518110610e2357610e23612ca5565b602002602001015184600301600088815260200190815260200160002060020161171890919063ffffffff16565b50600101610d84565b6060610e6582611465565b50949350505050565b80516000805160206130d48339815191529060005b818110156101e057610ea0848281518110610da157610da1612ca5565b610eb5848281518110610dc357610dc3612ca5565b15610ed35760405163b0ab682160e01b815260040160405180910390fd5b610f16848281518110610ee857610ee8612ca5565b60200260200101518460030160008881526020019081526020016000206002016118ee90919063ffffffff16565b50600101610e83565b610f2882610429565b8051610f33906111e5565b610f418282600001516112d0565b61031d81600001518383602001516113cc565b8051610f5f906111e5565b610f6d828260000151611258565b805161031d9083611343565b60003380610f856118fa565b6001600160a01b03161480610ff557507fe17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb005460ff16158015610ff55750610ff5848285604051602001610fd89190612eb5565b604051602081830303815290604052610ff090612ed1565b6119be565b949350505050565b600081815260018301602052604081205415155b9392505050565b60008181526000805160206130f4833981519152602052604081206060919061104390600401611702565b6001600160401b0381111561105a5761105a612654565b604051908082528060200260200182016040528015611083578160200160208202803683370190505b50905060005b60008481526000805160206130f4833981519152602052604090206110b090600401611702565b8110156111155760008481526000805160206130f4833981519152602052604081206110df9060040183611724565b9050808383815181106110f4576110f4612ca5565b6001600160a01b039092166020928302919091019091015250600101611089565b5092915050565b6001600160a01b03811661114357604051630706e15760e51b815260040160405180910390fd5b6040516301ffc9a760e01b8152637bc2cb4560e11b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa9250505080156111aa575060408051601f3d908101601f191682019092526111a791810190612ef5565b60015b6111c75760405163f58a5f2760e01b815260040160405180910390fd5b8061031d5760405163f58a5f2760e01b815260040160405180910390fd5b7fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006112307fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c9310183611c6b565b61031d5760405163017ab33760e71b815260040160405180910390fd5b606061023c82611c8d565b60008281526000805160206130f4833981519152602052604090206000805160206130d4833981519152906112909060040183611c6b565b6112ad57604051632405297d60e11b815260040160405180910390fd5b600083815260038201602052604090206112ca9060040183611730565b50505050565b60008281526000805160206130f4833981519152602052604090206000805160206130d4833981519152906113089060040183611c6b565b156113265760405163fb5584f160e01b815260040160405180910390fd5b600083815260038201602052604090206112ca9060040183611d6a565b61134c826111e5565b60405163f0c111f960e01b8152600481018290526001600160a01b0383169063f0c111f990602401600060405180830381600087803b15801561138e57600080fd5b505af11580156113a2573d6000803e3d6000fd5b505050505050565b80516000036102d3576040516319c6193b60e31b815260040160405180910390fd5b6113d5836111e5565b604051633be2f95d60e21b81526001600160a01b0384169063ef8be574906114039085908590600401612f17565b600060405180830381600087803b15801561141d57600080fd5b505af1158015611431573d6000803e3d6000fd5b50505050505050565b60606101f17f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01611d7f565b60008181526000805160206130f483398151915260205260408120805460609291839182919061149490612cbb565b80601f01602080910402602001604051908101604052809291908181526020018280546114c090612cbb565b801561150d5780601f106114e25761010080835404028352916020019161150d565b820191906000526020600020905b8154815290600101906020018083116114f057829003601f168201915b505050505093506115296000805160206130d483398151915290565b600086815260039190910160209081526040808320600101546000805160206130f483398151915290925290912060ff909116935061156a9060020161124d565b915061157585611018565b90509193509193565b815182908211156115a2576040516374eb20a760e01b815260040160405180910390fd5b505050565b6000805160206130d48339815191528054600091906115c7906001612f46565b91505090565b6000805160206130d4833981519152805460009190819083906115ef90612f59565b918290555091506116036001820183611d8c565b506000828152600382016020526040902061161e8782612df6565b5060008281526003820160205260409020600101805460ff19168615151790556116488285610e6e565b60005b83518110156116ec5760006001600160a01b031684828151811061167157611671612ca5565b60200260200101516001600160a01b0316036116a057604051637442429b60e01b815260040160405180910390fd5b6116e38482815181106116b5576116b5612ca5565b6020026020010151836003016000868152602001908152602001600020600401611d6a90919063ffffffff16565b5060010161164b565b5050949350505050565b60006110118383611d98565b600061023c825490565b60606110118383611e8b565b60006110118383611f3d565b600061101183836120f2565b6000611011836001600160a01b038416611d98565b60606000805160206130b4833981519152600061176182611702565b90506000816001600160401b0381111561177d5761177d612654565b6040519080825280602002602001820160405280156117a6578160200160208202803683370190505b50935060005b828110156118165760006117c08583611724565b600081815260038701602052604090209091506117dd9088610ffd565b1561180d578086846117ee81612f59565b95508151811061180057611800612ca5565b6020026020010181815250505b506001016117ac565b5080821115611829578351818303900384525b505050919050565b61183a8261211c565b61184382612151565b60008281527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504303602052604090206000805160206130b48339815191529061188a9083610ffd565b6118a7576040516333cb039f60e11b815260040160405180910390fd5b600083815260038201602052604090206112ca90836116f6565b80516000036102d35760405162ce76c160e41b815260040160405180910390fd5b600061101183836121b3565b600061101183836121e0565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa15801561199a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c79190612f72565b6000806119c96118fa565b905060006119d685612242565b805190915060006119e56123c0565b805190915060005b83811015611aa4576000858281518110611a0957611a09612ca5565b60200260200101519050866001600160a01b0316816001600160a01b031603611a3c576001975050505050505050611011565b60005b83811015611a9a57816001600160a01b0316611a73868381518110611a6657611a66612ca5565b60200260200101516123eb565b6001600160a01b031603611a9257600098505050505050505050611011565b600101611a3f565b50506001016119ed565b507fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c931006000611af17fa558e822bd359dacbe30f0da89cbfde5f95895b441e13a4864caec1423c93101611702565b905060005b81811015611c595760008381611b0f6001830185611724565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452905491821680825260ff600160a01b84048116151583870152600160a81b9093049092161515818401528251630b86d87960e21b815292519094509092632e1b61e492600480820193918290030181865afa158015611b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbc9190612ef5565b158015611c39575080600001516001600160a01b0316630cf0b5338e8a8e6040518463ffffffff1660e01b8152600401611bf893929190612f8f565b602060405180830381865afa158015611c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c399190612ef5565b15611c505760019950505050505050505050611011565b50600101611af6565b5060009b9a5050505050505050505050565b6001600160a01b03811660009081526001830160205260408120541515611011565b606081600001805480602002602001604051908101604052809291908181526020016000905b82821015611d5f578382906000526020600020018054611cd290612cbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611cfe90612cbb565b8015611d4b5780601f10611d2057610100808354040283529160200191611d4b565b820191906000526020600020905b815481529060010190602001808311611d2e57829003601f168201915b505050505081526020019060010190611cb3565b505050509050919050565b6000611011836001600160a01b0384166123f6565b606060006110118361243d565b600061101183836123f6565b60008181526001830160205260408120548015611e81576000611dbc600183612ff1565b8554909150600090611dd090600190612ff1565b9050808214611e35576000866000018281548110611df057611df0612ca5565b9060005260206000200154905080876000018481548110611e1357611e13612ca5565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611e4657611e46613004565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061023c565b600091505061023c565b6060826000018281548110611ea257611ea2612ca5565b906000526020600020018054611eb790612cbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee390612cbb565b8015611f305780601f10611f0557610100808354040283529160200191611f30565b820191906000526020600020905b815481529060010190602001808311611f1357829003601f168201915b5050505050905092915050565b6000808360010183604051611f529190612eb5565b908152602001604051809103902054905080600014611e81576000611f78600183612ff1565b8554909150600090611f8c90600190612ff1565b9050818114612093576000866000018281548110611fac57611fac612ca5565b906000526020600020018054611fc190612cbb565b80601f0160208091040260200160405190810160405280929190818152602001828054611fed90612cbb565b801561203a5780601f1061200f5761010080835404028352916020019161203a565b820191906000526020600020905b81548152906001019060200180831161201d57829003601f168201915b505050505090508087600001848154811061205757612057612ca5565b90600052602060002001908161206d9190612df6565b508387600101826040516120819190612eb5565b90815260405190819003602001902055505b85548690806120a4576120a4613004565b6001900381819060005260206000200160006120c09190612564565b905585600101856040516120d49190612eb5565b9081526020016040518091039020600090556001935050505061023c565b600082600001828154811061210957612109612ca5565b9060005260206000200154905092915050565b6121346000805160206130b483398151915282610ffd565b6102d35760405163560b4b4160e11b815260040160405180910390fd5b60008181527f804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af51850430260205260409020600101546000805160206130b48339815191529060ff161561031d57604051636ce0028960e11b815260040160405180910390fd5b600082600101826040516121c79190612eb5565b9081526040519081900360200190205415159392505050565b60006121ec83836121b3565b61223a5782546001810184556000848152602090200161220c8382612df6565b5082546040516001850190612222908590612eb5565b9081526040519081900360200190205550600161023c565b50600061023c565b606060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb6006006015460405162468b7360e31b81526001600160a01b038581166004830152909116915060009082906302345b9890602401600060405180830381865afa1580156122b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122df919081019061301a565b805190915060006122f1826001612f46565b6001600160401b0381111561230857612308612654565b604051908082528060200260200182016040528015612331578160200160208202803683370190505b50905060005b8281101561238b5783818151811061235157612351612ca5565b602002602001015182828151811061236b5761236b612ca5565b6001600160a01b0390921660209283029190910190910152600101612337565b508581838151811061239f5761239f612ca5565b6001600160a01b039092166020928302919091019091015295945050505050565b60606101f17f49daf035076c43671ca9f9fb568d931e51ab7f9098a5a694781b45341112cf00611d7f565b600061023c82612499565b600081815260018301602052604081205461223a5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561023c565b60608160000180548060200260200160405190810160405280929190818152602001828054801561248d57602002820191906000526020600020905b815481526020019060010190808311612479575b50505050509050919050565b60008181527f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df046020526040812054907f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090600160e01b8316900361254a5781600003612544578054831061252057604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115612521575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b50805461257090612cbb565b6000825580601f10612580575050565b601f0160209004906000526020600020908101906102d391906125d6565b50805460008255906000526020600020908101906102d391906125ef565b50805460008255906000526020600020908101906102d391905b5b808211156125eb57600081556001016125d7565b5090565b808211156125eb5760006126038282612564565b506001016125ef565b60008083601f84011261261e57600080fd5b5081356001600160401b0381111561263557600080fd5b60208301915083602082850101111561264d57600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561269257612692612654565b604052919050565b60006001600160401b038211156126b3576126b3612654565b5060051b60200190565b60006001600160401b038311156126d6576126d6612654565b6126e9601f8401601f191660200161266a565b90508281528383830111156126fd57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261272557600080fd5b8135602061273a6127358361269a565b61266a565b82815260059290921b8401810191818101908684111561275957600080fd5b8286015b848110156127ad5780356001600160401b0381111561277c5760008081fd5b8701603f8101891361278e5760008081fd5b61279f8986830135604084016126bd565b84525091830191830161275d565b509695505050505050565b6001600160a01b03811681146102d357600080fd5b6000604082840312156127df57600080fd5b604051604081016001600160401b03828210818311171561280257612802612654565b8160405282935084359150612816826127b8565b9082526020840135908082111561282c57600080fd5b508301601f8101851361283e57600080fd5b61284d858235602084016126bd565b6020830152505092915050565b600082601f83011261286b57600080fd5b8135602061287b6127358361269a565b82815260059290921b8401810191818101908684111561289a57600080fd5b8286015b848110156127ad5780356001600160401b038111156128bd5760008081fd5b6128cb8986838b01016127cd565b84525091830191830161289e565b6000806000806000608086880312156128f157600080fd5b8535945060208601356001600160401b038082111561290f57600080fd5b61291b89838a0161260c565b9096509450604088013591508082111561293457600080fd5b61294089838a01612714565b9350606088013591508082111561295657600080fd5b506129638882890161285a565b9150509295509295909350565b60005b8381101561298b578181015183820152602001612973565b50506000910152565b600081518084526129ac816020860160208601612970565b601f01601f19169290920160200192915050565b60008151808452602080850194506020840160005b838110156129fa5781516001600160a01b0316875295820195908201906001016129d5565b509495945050505050565b80518252600060208083015160a082860152612a2460a0860182612994565b9050604084015115156040860152606084015185820360608701528181518084528484019150848160051b850101858401935060005b82811015612a8857601f19868303018452612a76828651612994565b94870194938701939150600101612a5a565b506080880151955088810360808a0152612aa281876129c0565b9998505050505050505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015612b0657603f19888603018452612af4858351612a05565b94509285019290850190600101612ad8565b5092979650505050505050565b600060208284031215612b2557600080fd5b5035919050565b6020815260006110116020830184612a05565b60008060008060608587031215612b5557600080fd5b84356001600160401b0380821115612b6c57600080fd5b612b788883890161260c565b90965094506020870135915080821115612b9157600080fd5b612b9d88838901612714565b93506040870135915080821115612bb357600080fd5b50612bc08782880161285a565b91505092959194509250565b60008060408385031215612bdf57600080fd5b8235915060208301356001600160401b03811115612bfc57600080fd5b612c0885828601612714565b9150509250929050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015612b0657603f19888603018452612c57858351612994565b94509285019290850190600101612c3b565b60008060408385031215612c7c57600080fd5b8235915060208301356001600160401b03811115612c9957600080fd5b612c08858286016127cd565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680612ccf57607f821691505b60208210810361254457634e487b7160e01b600052602260045260246000fd5b601f8211156115a2576000816000526020600020601f850160051c81016020861015612d185750805b601f850160051c820191505b818110156113a257828155600101612d24565b6001600160401b03831115612d4e57612d4e612654565b612d6283612d5c8354612cbb565b83612cef565b6000601f841160018114612d965760008515612d7e5750838201355b600019600387901b1c1916600186901b1783556101e0565b600083815260209020601f19861690835b82811015612dc75786850135825560209485019460019092019101612da7565b5086821015612de45760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81516001600160401b03811115612e0f57612e0f612654565b612e2381612e1d8454612cbb565b84612cef565b602080601f831160018114612e585760008415612e405750858301515b600019600386901b1c1916600185901b1785556113a2565b600085815260208120601f198616915b82811015612e8757888601518255948401946001909101908401612e68565b5085821015612ea55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251612ec7818460208701612970565b9190910192915050565b805160208083015191908110156125445760001960209190910360031b1b16919050565b600060208284031215612f0757600080fd5b8151801515811461101157600080fd5b828152604060208201526000610ff56040830184612994565b634e487b7160e01b600052601160045260246000fd5b8082018082111561023c5761023c612f30565b600060018201612f6b57612f6b612f30565b5060010190565b600060208284031215612f8457600080fd5b8151611011816127b8565b60006060820185835260206060602085015281865180845260808601915060208801935060005b81811015612fdb5784516001600160a01b031683529383019391830191600101612fb6565b5050809350505050826040830152949350505050565b8181038181111561023c5761023c612f30565b634e487b7160e01b600052603160045260246000fd5b6000602080838503121561302d57600080fd5b82516001600160401b0381111561304357600080fd5b8301601f8101851361305457600080fd5b80516130626127358261269a565b81815260059190911b8201830190838101908783111561308157600080fd5b928401925b828410156130a8578351613099816127b8565b82529284019290840190613086565b97965050505050505056fe804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504300672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd00672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd03","sourceMap":"303:2281:205:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;903:317;;;;;;:::i;:::-;;:::i;:::-;;641:96;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;741:158;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;353:284::-;;;;;;:::i;:::-;;:::i;:::-;;;9949:25:375;;;9937:2;9922:18;353:284:205;9803:177:375;1224:164:205;;;;;;:::i;:::-;;:::i;1652:248::-;;;;;;:::i;:::-;;:::i;1904:166::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1410:238::-;;;;;;:::i;:::-;;:::i;2092:::-;;;;;;:::i;:::-;;:::i;2334:248::-;;;;;;:::i;:::-;;:::i;903:317::-;1079:44;1099:23;;;;;;;;;;;;;-1:-1:-1;;;1099:23:205;;;1079:19;:44::i;:::-;1129:24;1146:6;1129:16;:24::i;:::-;1159:56;1171:6;1179:8;;1189:11;1202:12;1159:11;:56::i;:::-;903:317;;;;;:::o;641:96::-;693:13;721:11;:9;:11::i;:::-;714:18;;641:96;:::o;741:158::-;818:11;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;818:11:205;837:24;854:6;837:16;:24::i;:::-;874:20;887:6;874:12;:20::i;:::-;867:27;741:158;-1:-1:-1;;741:158:205:o;353:284::-;512:7;527:44;547:23;;;;;;;;;;;;;-1:-1:-1;;;547:23:205;;;527:19;:44::i;:::-;584:48;596:8;;606:11;619:12;584:11;:48::i;:::-;577:55;353:284;-1:-1:-1;;;;;353:284:205:o;1224:164::-;1284:44;1304:23;;;;;;;;;;;;;-1:-1:-1;;;1304:23:205;;;1284:19;:44::i;:::-;1334:24;1351:6;1334:16;:24::i;:::-;1364:19;1376:6;1364:11;:19::i;:::-;1224:164;:::o;1652:248::-;1768:44;1788:23;;;;;;;;;;;;;-1:-1:-1;;;1788:23:205;;;1768:19;:44::i;:::-;1818:24;1835:6;1818:16;:24::i;:::-;1848:47;1875:6;1883:11;1848:26;:47::i;:::-;1652:248;;:::o;1904:166::-;1992:27;2034:31;2058:6;2034:23;:31::i;1410:238::-;1521:44;1541:23;;;;;;;;;;;;;-1:-1:-1;;;1541:23:205;;;1521:19;:44::i;:::-;1571:24;1588:6;1571:16;:24::i;:::-;1601:42;1623:6;1631:11;1601:21;:42::i;2092:238::-;2203:44;2223:23;;;;;;;;;;;;;-1:-1:-1;;;2223:23:205;;;2203:19;:44::i;:::-;2253:24;2270:6;2253:16;:24::i;:::-;2283:42;2305:6;2313:11;2283:21;:42::i;2334:248::-;2450:44;2470:23;;;;;;;;;;;;;-1:-1:-1;;;2470:23:205;;;2450:19;:44::i;:::-;2500:24;2517:6;2500:16;:24::i;:::-;2530:47;2557:6;2565:11;2530:26;:47::i;3809:164:156:-;3889:31;1445:3;3909:10;3889;:31::i;:::-;3884:85;;3937:25;;-1:-1:-1;;;3937:25:156;;;;;;;;;;;9295:194:206;9392:44;:27;9429:6;9392:36;:44::i;:::-;9387:98;;9453:25;;-1:-1:-1;;;9453:25:206;;;;;;;;;;;4642:2709;4863:41;4907:30;4930:6;4907:22;:30::i;:::-;4976:26;;5035:19;;4863:74;;-1:-1:-1;4976:26:206;4943:30;5035:19;-1:-1:-1;;;;;5105:47:206;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5105:47:206;;5060:92;;5164:9;5159:322;5183:15;5179:1;:19;5159:322;;;5210:14;5235:12;5248:1;5235:15;;;;;;;;:::i;:::-;;;;;;;:22;;;5210:48;;5266:54;5313:6;5266:46;:54::i;:::-;5328:51;5372:6;5328:43;:51::i;:::-;5413:12;5426:1;5413:15;;;;;;;;:::i;:::-;;;;;;;:22;;;5387:20;5408:1;5387:23;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5387:48:206;;;:23;;;;;;;;;;;:48;-1:-1:-1;5463:3:206;;5159:322;;;-1:-1:-1;5519:26:206;;5515:101;;5555:38;;;;-1:-1:-1;;;;;;;;;;;5555:38:206;;;;;:54;5601:8;;5555:38;:54;:::i;:::-;;5515:101;5652:18;;:22;5648:370;;5684:34;5721:56;;;-1:-1:-1;;;;;;;;;;;5721:56:206;;;;;:95;;:77;;:93;:95::i;:::-;5684:132;;5869:54;5896:6;5904:18;5869:26;:54::i;:::-;5969:42;5991:6;5999:11;5969:21;:42::i;:::-;5676:342;5648:370;6028:15;6047:1;6028:20;6024:47;;6058:7;;;;;;6024:47;6081:27;;:31;6077:526;;6156:27;;6122:31;6192:181;6216:22;6212:1;:26;6192:181;;;6252:67;6279:6;6295:19;6315:1;6295:22;;;;;;;;:::i;:::-;;;;;;;6252:26;:67::i;:::-;6351:3;;6192:181;;;;6424:9;6419:178;6443:23;6439:1;:27;6419:178;;;6480:63;6502:6;6518:20;6539:1;6518:23;;;;;;;;:::i;:::-;;;;;;;6480:21;:63::i;:::-;6575:3;;6419:178;;;;6114:489;6077:526;6667:9;6662:227;6686:22;6682:1;:26;6662:227;;;6720:122;6795:19;6815:1;6795:22;;;;;;;;:::i;:::-;;;;;;;6828:6;6720:57;:122::i;:::-;6871:3;;6662:227;;;;6900:9;6895:409;6919:15;6915:1;:19;6895:409;;;6980:1;6950:12;6963:1;6950:15;;;;;;;;:::i;:::-;;;;;;;:20;;;:27;:31;6946:312;;;7036:47;7062:12;7075:1;7062:15;;;;;;;;:::i;:::-;;;;;;;:20;;;7036:25;:47::i;:::-;7094:155;7166:12;7179:1;7166:15;;;;;;;;:::i;:::-;;;;;;;:22;;;7201:6;7219:12;7232:1;7219:15;;;;;;;;:::i;:::-;;;;;;;:20;;;7094:52;:155::i;:::-;7286:3;;6895:409;;;-1:-1:-1;7315:31:206;;7339:6;;7327:10;;7315:31;;;;;4804:2547;;;;4642:2709;;;;;:::o;2123:635::-;2167:19;2194:24;2221:13;:11;:13::i;:::-;2260:14;;2194:40;;-1:-1:-1;2260:14:206;-1:-1:-1;;;;;2289:21:206;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2289:21:206;;;;;;;;;;;;;;;;;2281:29;;2322:9;2317:437;2341:9;2337:1;:13;2317:437;;;2372:18;2400:16;2426:27;2463:34;2508:20;2517:7;2525:1;2517:10;;;;;;;;:::i;:::-;;;;;;;2508:8;:20::i;:::-;2362:166;;;;;;;;2548:159;;;;;;;;2567:7;2575:1;2567:10;;;;;;;;:::i;:::-;;;;;;;2548:159;;;;2593:4;2548:159;;;;2617:11;2548:159;;;;;;2651:11;2548:159;;;;2686:12;2548:159;;;2537:5;2543:1;2537:8;;;;;;;;:::i;:::-;;;;;;:170;;;;2736:3;;;;;;;2354:400;;;;2317:437;;;;2188:570;;2123:635;:::o;4190:425::-;4259:16;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4259:16:206;4291:18;4317:16;4341:27;4376:34;4419:16;4428:6;4419:8;:16::i;:::-;4455:155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4455:155:206;;4190:425;-1:-1:-1;;;;4190:425:206:o;1106:1013::-;1257:14;1279:34;1301:8;;1279:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1311:1:206;;-1:-1:-1;1279:21:206;;-1:-1:-1;;1279:34:206:i;:::-;1346:19;;1320:23;1346:19;-1:-1:-1;;;;;1417:47:206;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1417:47:206;;1372:92;;1480:16;:14;:16::i;:::-;1471:25;;1508:9;1503:502;1527:15;1523:1;:19;1503:502;;;1554:95;1618:12;1631:1;1618:15;;;;;;;;:::i;:::-;;;;;;;:22;;;1554:46;:95::i;:::-;1683:12;1696:1;1683:15;;;;;;;;:::i;:::-;;;;;;;:22;;;1657:20;1678:1;1657:23;;;;;;;;:::i;:::-;;;;;;:48;-1:-1:-1;;;;;1657:48:206;;;-1:-1:-1;;;;;1657:48:206;;;;;1755:47;1781:12;1794:1;1781:15;;;;;;;;:::i;1755:47::-;1811:147;1881:12;1894:1;1881:15;;;;;;;;:::i;:::-;;;;;;;:22;;;1914:6;1930:12;1943:1;1930:15;;;;;;;;:::i;1811:147::-;1987:3;;1503:502;;;;2011:60;2020:8;;2011:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2011:60:206;-1:-1:-1;2037:11:206;;-1:-1:-1;2050:20:206;;-1:-1:-1;2011:8:206;:60::i;:::-;-1:-1:-1;2083:31:206;;2107:6;;2095:10;;2083:31;;;;;1273:846;;1106:1013;;;;;;:::o;7355:1598::-;7439:41;7483:30;7506:6;7483:22;:30::i;:::-;7552:26;;;;-1:-1:-1;;;;;;;;;;;;7646:23:206;:8;7662:6;7646:15;:23::i;:::-;-1:-1:-1;7682:19:206;;;;:11;;;:19;;;;;;7675:26;7682:19;;7675:26;:::i;:::-;;;;;;-1:-1:-1;;7675:26:206;;;;;;;;;;;:::i;:::-;-1:-1:-1;;7675:26:206;;;;;;;;;;:::i;:::-;-1:-1:-1;;7707:29:206;;;;;;;;;-1:-1:-1;7707:29:206;;;:19;;;:11;;;:19;;;;;;;;-1:-1:-1;7707:29:206;;-1:-1:-1;7707:29:206;-1:-1:-1;7707:19:206;;-1:-1:-1;7707:29:206;:::i;:::-;-1:-1:-1;7776:5:206;7742:19;;;:11;;;:19;;;;;:31;;;:39;;-1:-1:-1;;7742:39:206;;;7812:40;;:31;;:38;:40::i;:::-;7858:22;7883:19;;;:11;;;:19;;;;;7788:64;;-1:-1:-1;7858:22:206;7883:41;;:32;;:39;:41::i;:::-;7858:66;;7936:9;7931:188;7955:13;7951:1;:17;7931:188;;;8028:19;;;;:11;;;:19;;;;;7980:93;;8028:37;;:31;;8063:1;8028:34;:37::i;:::-;7980:19;;;;:11;;;:19;;;;;:31;;;:38;:93::i;:::-;-1:-1:-1;8101:3:206;;7931:188;;;;8130:9;8125:191;8149:14;8145:1;:18;8125:191;;;8224:19;;;;:11;;;:19;;;;;8175:95;;8224:38;;:32;;8260:1;8224:35;:38::i;:::-;8175:19;;;;:11;;;:19;;;;;:32;;;:39;:95::i;:::-;-1:-1:-1;8298:3:206;;8125:191;;;;8322:27;8352:42;8387:6;8352:34;:42::i;:::-;8424:17;;8322:72;;-1:-1:-1;8400:21:206;8481:155;8505:13;8501:1;:17;8481:155;;;8530:59;8567:10;8578:1;8567:13;;;;;;;;:::i;:::-;;;;;;;8582:6;8530:36;:59::i;:::-;8618:3;;8481:155;;;;8684:9;8679:227;8703:22;8699:1;:26;8679:227;;;8737:122;8812:19;8832:1;8812:22;;;;;;;;:::i;:::-;;;;;;;8845:6;8737:57;:122::i;:::-;8888:3;;8679:227;;;-1:-1:-1;8917:31:206;;8941:6;;8929:10;;8917:31;;;;;7401:1552;;;;;;;7355:1598;:::o;12238:607::-;12456:18;;-1:-1:-1;;;;;;;;;;;434:66:207;12371:30:206;12481:360;12505:13;12501:1;:17;12481:360;;;12570:33;12588:11;12600:1;12588:14;;;;;;;;:::i;:::-;;;;;;;12570:17;:33::i;:::-;12617:56;12658:11;12670:1;12658:14;;;;;;;;:::i;:::-;;;;;;;12617:2;:11;;:19;12629:6;12617:19;;;;;;;;;;;:31;;:40;;:56;;;;:::i;:::-;12612:120;;12692:31;;-1:-1:-1;;;12692:31:206;;;;;;;;;;;12612:120;12740:54;12779:11;12791:1;12779:14;;;;;;;;:::i;:::-;;;;;;;12740:2;:11;;:19;12752:6;12740:19;;;;;;;;;;;:31;;:38;;:54;;;;:::i;:::-;-1:-1:-1;12823:3:206;;12481:360;;12849:158;12929:27;12986:16;12995:6;12986:8;:16::i;:::-;-1:-1:-1;12964:38:206;12849:158;-1:-1:-1;;;;12849:158:206:o;11614:620::-;11802:18;;-1:-1:-1;;;;;;;;;;;434:66:207;11717:30:206;11827:403;11851:13;11847:1;:17;11827:403;;;11916:33;11934:11;11946:1;11934:14;;;;;;;;:::i;11916:33::-;12008:56;12049:11;12061:1;12049:14;;;;;;;;:::i;12008:56::-;12004:120;;;12083:32;;-1:-1:-1;;;12083:32:206;;;;;;;;;;;12004:120;12132:51;12168:11;12180:1;12168:14;;;;;;;;:::i;:::-;;;;;;;12132:2;:11;;:19;12144:6;12132:19;;;;;;;;;;;:31;;:35;;:51;;;;:::i;:::-;-1:-1:-1;12212:3:206;;11827:403;;13198:543;13335:24;13352:6;13335:16;:24::i;:::-;13451:18;;13399:72;;:43;:72::i;:::-;13509:58;13531:6;13547:11;:18;;;13509:21;:58::i;:::-;13605:131;13673:11;:18;;;13700:6;13714:11;:16;;;13605:52;:131::i;13745:483::-;13947:18;;13895:72;;:43;:72::i;:::-;14010:63;14037:6;14053:11;:18;;;14010:26;:63::i;:::-;14184:18;;14111:112;;14211:6;14111:57;:112::i;3520:285:156:-;3620:4;3649:10;;3679:8;:6;:8::i;:::-;-1:-1:-1;;;;;3679:18:156;;:121;;;-1:-1:-1;293:66:89;526:31:87;;;3708:10:156;:91;;;;;3730:69;3742:9;3753:6;3786:10;3769:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;3761:37;;;:::i;:::-;3730:11;:69::i;:::-;3666:134;3520:285;-1:-1:-1;;;;3520:285:156:o;11317:144:327:-;11394:4;4360:21;;;:14;;;:21;;;;;;:26;;11417:37;11410:44;11317:144;-1:-1:-1;;;11317:144:327:o;10100:599:206:-;10208:39;10276:38;;;-1:-1:-1;;;;;;;;;;;10276:38:206;;;;;10179:21;;10208:39;10276:60;;:51;;:58;:60::i;:::-;-1:-1:-1;;;;;10250:92:206;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10250:92:206;;10208:134;;10361:9;10349:315;10386:38;;;;-1:-1:-1;;;;;;;;;;;10386:38:206;;;;;:60;;:51;;:58;:60::i;:::-;10382:1;:64;10349:315;;;10472:26;10501:56;;;-1:-1:-1;;;;;;;;;;;10501:56:206;;;;;:93;;:78;;10592:1;10501:90;:93::i;:::-;10472:122;;10638:18;10602:17;10620:1;10602:20;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10602:55:206;;;:20;;;;;;;;;;;:55;-1:-1:-1;10454:3:206;;10349:315;;;-1:-1:-1;10677:17:206;10100:599;-1:-1:-1;;10100:599:206:o;3437:476:174:-;-1:-1:-1;;;;;3511:25:174;;3507:101;;3553:48;;-1:-1:-1;;;3553:48:174;;;;;;;;;;;3507:101;3624:70;;-1:-1:-1;;;3624:70:174;;-1:-1:-1;;;3624:70:174;;;16325:52:375;-1:-1:-1;;;;;3624:38:174;;;;;16298:18:375;;3624:70:174;;;;;;;;;;;;;;;;;;-1:-1:-1;3624:70:174;;;;;;;;-1:-1:-1;;3624:70:174;;;;;;;;;;;;:::i;:::-;;;3614:295;;3852:50;;-1:-1:-1;;;3852:50:174;;;;;;;;;;;3614:295;3737:9;3732:92;;3765:50;;-1:-1:-1;;;3765:50:174;;;;;;;;;;;916:279;483:66:175;1084:37:174;:15;1109:11;1084:24;:37::i;:::-;1079:112;;1138:46;;-1:-1:-1;;;1138:46:174;;;;;;;;;;;5598:103:221;5654:15;5684:12;5692:3;5684:7;:12::i;14382:339:206:-;14482:30;14548:19;;;-1:-1:-1;;;;;;;;;;;14548:19:206;;;;;-1:-1:-1;;;;;;;;;;;434:66:207;14548:54:206;;:32;;14590:11;14548:41;:54::i;:::-;14543:115;;14619:32;;-1:-1:-1;;;14619:32:206;;;;;;;;;;;14543:115;14664:19;;;;:11;;;:19;;;;;:52;;:32;;14704:11;14664:39;:52::i;:::-;;14476:245;14382:339;;:::o;14725:319::-;14808:30;14873:19;;;-1:-1:-1;;;;;;;;;;;14873:19:206;;;;;-1:-1:-1;;;;;;;;;;;434:66:207;14873:54:206;;:32;;14915:11;14873:41;:54::i;:::-;14869:115;;;14944:33;;-1:-1:-1;;;14944:33:206;;;;;;;;;;;14869:115;14990:19;;;;:11;;;:19;;;;;:49;;:32;;15027:11;14990:36;:49::i;4569:191:174:-;4671:29;4688:11;4671:16;:29::i;:::-;4706:49;;-1:-1:-1;;;4706:49:174;;;;;9949:25:375;;;-1:-1:-1;;;;;4706:43:174;;;;;9922:18:375;;4706:49:174;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4569:191;;:::o;612:128:222:-;680:4;:11;695:1;680:16;676:59;;705:30;;-1:-1:-1;;;705:30:222;;;;;;;;;;;4331:234:174;4462:29;4479:11;4462:16;:29::i;:::-;4497:63;;-1:-1:-1;;;4497:63:174;;-1:-1:-1;;;;;4497:40:174;;;;;:63;;4538:4;;4544:15;;4497:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4331:234;;;:::o;9970:126:206:-;10016:24;10055:36;:27;:34;:36::i;9493:473::-;9603:16;9718:38;;;-1:-1:-1;;;;;;;;;;;9718:38:206;;;;;9711:50;;9577:18;;9603:16;9577:18;;;;9718:38;9711:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9781:21;-1:-1:-1;;;;;;;;;;;434:66:207;764:141;9781:21:206;:38;;;;:30;;;;;:38;;;;;;;;:50;;;-1:-1:-1;;;;;;;;;;;9851:38:206;;;;;;9781:50;;;;;-1:-1:-1;9851:59:206;;:50;;:57;:59::i;:::-;9837:73;;9931:30;9954:6;9931:22;:30::i;:::-;9916:45;;9493:473;;;;;:::o;425:183:222:-;541:15;;526:4;;541:21;-1:-1:-1;537:66:222;;;571:32;;-1:-1:-1;;;571:32:222;;;;;;;;;;;537:66;490:118;425:183;;:::o;9132:159:206:-;-1:-1:-1;;;;;;;;;;;9270:12:206;;9181:14;;434:66:207;9270:16:206;;9285:1;9270:16;:::i;:::-;9263:23;;;9132:159;:::o;10703:726::-;-1:-1:-1;;;;;;;;;;;10958:14:206;;10866;;434:66:207;;;10866:14:206;;10958;;;:::i;:::-;;;;;-1:-1:-1;10958:14:206;-1:-1:-1;10979:20:206;:8;;;10958:14;10979:12;:20::i;:::-;-1:-1:-1;11005:19:206;;;;:11;;;:19;;;;;:35;11032:8;11005:19;:35;:::i;:::-;-1:-1:-1;11046:19:206;;;;:11;;;:19;;;;;:31;;:45;;-1:-1:-1;;11046:45:206;;;;;;;11098:42;11046:19;11128:11;11098:21;:42::i;:::-;11152:9;11147:278;11171:12;:19;11167:1;:23;11147:278;;;11284:1;-1:-1:-1;;;;;11248:38:206;11256:12;11269:1;11256:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;11248:38:206;;11244:104;;11305:34;;-1:-1:-1;;;11305:34:206;;;;;;;;;;;11244:104;11356:62;11401:12;11414:1;11401:15;;;;;;;;:::i;:::-;;;;;;;11356:2;:11;;:19;11368:6;11356:19;;;;;;;;;;;:32;;:36;;:62;;;;:::i;:::-;-1:-1:-1;11192:3:206;;11147:278;;;;10882:547;10703:726;;;;;;:::o;11101:135:327:-;11171:4;11194:35;11202:3;11222:5;11194:7;:35::i;4534:95:221:-;4590:7;4612:12;4620:3;2609:18;;2531:101;4949:127;5028:13;5056:15;5060:3;5065:5;5056:3;:15::i;4125:127::-;4209:4;4228:19;4236:3;4241:5;4228:7;:19::i;9574:156:327:-;9648:7;9698:22;9702:3;9714:5;9698:3;:22::i;8634:156::-;8707:4;8730:53;8738:3;-1:-1:-1;;;;;8758:23:327;;8730:7;:53::i;3259:796:163:-;3335:27;-1:-1:-1;;;;;;;;;;;3370:37:163;3474:27;377:66:164;3474:25:163;:27::i;:::-;3440:61;;3507:13;3558:23;-1:-1:-1;;;;;3544:38:163;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3544:38:163;;3531:51;;3594:9;3589:266;3613:23;3609:1;:27;3589:266;;;3648:17;3668:24;:7;3690:1;3668:21;:24::i;:::-;3705:35;;;;:24;;;:35;;;;;3648:44;;-1:-1:-1;3705:52:163;;3750:6;3705:44;:52::i;:::-;3701:108;;;3791:9;3769:10;3780:7;;;;:::i;:::-;;;3769:19;;;;;;;;:::i;:::-;;;;;;:31;;;;;3701:108;-1:-1:-1;3837:3:163;;3589:266;;;;3891:5;3865:23;:31;3861:190;;;4008:17;;3941:35;;;4004:32;;3985:52;;3861:190;3364:691;;;3259:796;;;:::o;4501:438::-;4582:29;4601:9;4582:18;:29::i;:::-;4617:34;4641:9;4617:23;:34::i;:::-;4657:37;4768:35;;;:24;:35;;;;;-1:-1:-1;;;;;;;;;;;377:66:164;4768:52:163;;4813:6;4768:44;:52::i;:::-;4763:115;;4837:34;;-1:-1:-1;;;4837:34:163;;;;;;;;;;;4763:115;4884:35;;;;:24;;;:35;;;;;:50;;4927:6;4884:42;:50::i;14232:146:206:-;14308:3;14302:17;14323:1;14302:22;14298:76;;14341:26;;-1:-1:-1;;;14341:26:206;;;;;;;;;;;4325:136:221;4416:4;4435:21;4445:3;4450:5;4435:9;:21::i;3862:109::-;3931:4;3950:16;3955:3;3960:5;3950:4;:16::i;724:189:83:-;786:67;;;;;;;;302:66:85;786:67:83;-1:-1:-1;;;;;786:67:83;;;;;;;;;;;;;866:42;;-1:-1:-1;;;866:42:83;;;;;9949:25:375;;;;866:42:83;;765:13;;866:30;;9922:18:375;;;;;866:42:83;;;;;;786:67;866:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1566:1252:156:-;1679:4;1691:13;1707:8;:6;:8::i;:::-;1691:24;;1722;1749:31;1775:4;1749:25;:31::i;:::-;1816:14;;1722:58;;-1:-1:-1;1786:27:156;1869:17;:15;:17::i;:::-;1918:19;;1837:49;;-1:-1:-1;1892:23:156;1944:320;1968:19;1964:1;:23;1944:320;;;2002:14;2019:7;2027:1;2019:10;;;;;;;;:::i;:::-;;;;;;;2002:27;;2052:5;-1:-1:-1;;;;;2042:15:156;:6;-1:-1:-1;;;;;2042:15:156;;2038:51;;2076:4;2069:11;;;;;;;;;;;2038:51;2127:9;2122:136;2142:15;2138:1;:19;2122:136;;;2207:6;-1:-1:-1;;;;;2178:35:156;:25;2187:12;2200:1;2187:15;;;;;;;;:::i;:::-;;;;;;;2178:8;:25::i;:::-;-1:-1:-1;;;;;2178:35:156;;2174:76;;2234:5;2227:12;;;;;;;;;;;;2174:76;2159:3;;2122:136;;;-1:-1:-1;;1989:3:156;;1944:320;;;-1:-1:-1;483:66:175;2308:44:156;2432:24;:15;:22;:24::i;:::-;2403:53;;2468:9;2463:332;2487:18;2483:1;:22;2463:332;;;2520:47;2570:2;2520:47;2603:21;:15;;;2622:1;2603:18;:21::i;:::-;-1:-1:-1;;;;;2570:62:156;;;;;;;;;;;;;;;;;-1:-1:-1;2570:62:156;2520:112;;;;;;;;;;;;;;;;-1:-1:-1;;;2520:112:156;;;;;;;;;;-1:-1:-1;;;2520:112:156;;;;;;;;;;;;2654:28;;-1:-1:-1;;;2654:28:156;;;;2520:112;;-1:-1:-1;2520:112:156;;2654:26;;:28;;;;;;;;;;;2520:112;2654:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2653:29;:97;;;;;2694:1;:13;;;-1:-1:-1;;;;;2694:24:156;;2719:9;2730:7;2739:10;2694:56;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2640:149;;;2776:4;2769:11;;;;;;;;;;;;;2640:149;-1:-1:-1;2507:3:156;;2463:332;;;-1:-1:-1;2808:5:156;;1566:1252;-1:-1:-1;;;;;;;;;;;1566:1252:156:o;8871:165:327:-;-1:-1:-1;;;;;9004:23:327;;8951:4;4360:21;;;:14;;;:21;;;;;;:26;;8974:55;4264:129;3604:102:221;3660:15;3690:3;:11;;3683:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3604:102;;;:::o;8316:150:327:-;8386:4;8409:50;8414:3;-1:-1:-1;;;;;8434:23:327;;8409:4;:50::i;12671:297::-;12731:16;12759:22;12784:19;12792:3;12784:7;:19::i;10804:129::-;10871:4;10894:32;10899:3;10919:5;10894:4;:32::i;2815:1368::-;2881:4;3010:21;;;:14;;;:21;;;;;;3046:13;;3042:1135;;3413:18;3434:12;3445:1;3434:8;:12;:::i;:::-;3480:18;;3413:33;;-1:-1:-1;3460:17:327;;3480:22;;3501:1;;3480:22;:::i;:::-;3460:42;;3535:9;3521:10;:23;3517:378;;3564:17;3584:3;:11;;3596:9;3584:22;;;;;;;;:::i;:::-;;;;;;;;;3564:42;;3731:9;3705:3;:11;;3717:10;3705:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;3844:25;;;:14;;;:25;;;;;:36;;;3517:378;3973:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4076:3;:14;;:21;4091:5;4076:21;;;;;;;;;;;4069:28;;;4119:4;4112:11;;;;;;;3042:1135;4161:5;4154:12;;;;;2952:130:221;3031:13;3059:3;:11;;3071:5;3059:18;;;;;;;;:::i;:::-;;;;;;;;3052:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2952:130;;;;:::o;980:1266::-;1064:4;1172:18;1193:3;:12;;1206:5;1193:19;;;;;;:::i;:::-;;;;;;;;;;;;;;1172:40;;1223:10;1237:1;1223:15;1219:1023;;1562:21;1586:14;1599:1;1586:10;:14;:::i;:::-;1628:18;;1562:38;;-1:-1:-1;1608:17:221;;1628:22;;1649:1;;1628:22;:::i;:::-;1608:42;;1676:13;1663:9;:26;1659:358;;1701:23;1727:3;:11;;1739:9;1727:22;;;;;;;;:::i;:::-;;;;;;;;1701:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1862:9;1833:3;:11;;1845:13;1833:26;;;;;;;;:::i;:::-;;;;;;;;:38;;;;;;:::i;:::-;;1955:10;1929:3;:12;;1942:9;1929:23;;;;;;:::i;:::-;;;;;;;;;;;;;;:36;-1:-1:-1;1659:358:221;2083:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;2163:3;:12;;2176:5;2163:19;;;;;;:::i;:::-;;;;;;;;;;;;;2156:26;;;2198:4;2191:11;;;;;;;4923:118:327;4990:7;5016:3;:11;;5028:5;5016:18;;;;;;;;:::i;:::-;;;;;;;;;5009:25;;4923:118;;;;:::o;5855:224:163:-;5960:54;-1:-1:-1;;;;;;;;;;;6004:9:163;5960:43;:54::i;:::-;5955:120;;6031:37;;-1:-1:-1;;;6031:37:163;;;;;;;;;;;5383:246;5455:37;5529:30;;;:19;:30;;;;;:39;;;-1:-1:-1;;;;;;;;;;;377:66:164;5529:39:163;;5525:100;;;5585:33;;-1:-1:-1;;;5585:33:163;;;;;;;;;;;2319:139:221;2410:4;2429:3;:12;;2442:5;2429:19;;;;;;:::i;:::-;;;;;;;;;;;;;;;:24;;;2319:139;-1:-1:-1;;;2319:139:221:o;466:360::-;535:4;552:21;562:3;567:5;552:9;:21::i;:::-;547:275;;583:23;;;;;;;:11;:23;;;;;;;;600:5;583:23;;:::i;:::-;-1:-1:-1;745:18:221;;723:19;;:12;;;;:19;;736:5;;723:19;:::i;:::-;;;;;;;;;;;;;;:40;-1:-1:-1;778:4:221;771:11;;547:275;-1:-1:-1;810:5:221;803:12;;4548:533:156;4628:16;4652:14;294:66:188;4681:39:156;;;4760:28;;-1:-1:-1;;;4760:28:156;;-1:-1:-1;;;;;18871:32:375;;;4760:28:156;;;18853:51:375;4681:39:156;;;;-1:-1:-1;4681:39:156;;;;4760:22;;18826:18:375;;4760:28:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4760:28:156;;;;;;;;;;;;:::i;:::-;4824:20;;4727:61;;-1:-1:-1;4794:27:156;4892:23;4824:20;4914:1;4892:23;:::i;:::-;-1:-1:-1;;;;;4878:38:156;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4878:38:156;;4851:65;;4927:9;4922:94;4946:19;4942:1;:23;4922:94;;;4993:13;5007:1;4993:16;;;;;;;;:::i;:::-;;;;;;;4980:7;4988:1;4980:10;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4980:29:156;;;:10;;;;;;;;;;;:29;4967:3;;4922:94;;;;5052:4;5021:7;5029:19;5021:28;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5021:35:156;;;:28;;;;;;;;;;;:35;5069:7;4548:533;-1:-1:-1;;;;;4548:533:156:o;1228:128:159:-;1278:16;1309:42;377:66:160;1309:40:159;:42::i;22045:138:105:-;22111:7;22149:27;22168:7;22149:18;:27::i;2241:406:327:-;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:327;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;5581:109;5637:16;5672:3;:11;;5665:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5581:109;;;:::o;7836:1501:105:-;7974:32;8050:29;;;:20;:29;;;;;;;300:66:107;;-1:-1:-1;;;8115:24:105;;:29;;8111:1172;;8236:6;8246:1;8236:11;8232:791;;8276:16;;8265:27;;8261:83;;8313:31;;-1:-1:-1;;;8313:31:105;;;;;;;;;;;8261:83;8831:182;-1:-1:-1;;8910:9:105;;;8889:31;;;;:20;;;:31;;;;;;8910:9;;8889:31;;-1:-1:-1;8948:25:105;;8831:182;8948:25;;8987:13;7836:1501;;;:::o;8111:1172::-;7966:1323;9301:31;;-1:-1:-1;;;9301:31:105;;;;;;;;;;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;14:348:375;66:8;76:6;130:3;123:4;115:6;111:17;107:27;97:55;;148:1;145;138:12;97:55;-1:-1:-1;171:20:375;;-1:-1:-1;;;;;203:30:375;;200:50;;;246:1;243;236:12;200:50;283:4;275:6;271:17;259:29;;335:3;328:4;319:6;311;307:19;303:30;300:39;297:59;;;352:1;349;342:12;297:59;14:348;;;;;:::o;367:127::-;428:10;423:3;419:20;416:1;409:31;459:4;456:1;449:15;483:4;480:1;473:15;499:275;570:2;564:9;635:2;616:13;;-1:-1:-1;;612:27:375;600:40;;-1:-1:-1;;;;;655:34:375;;691:22;;;652:62;649:88;;;717:18;;:::i;:::-;753:2;746:22;499:275;;-1:-1:-1;499:275:375:o;779:182::-;838:4;-1:-1:-1;;;;;863:6:375;860:30;857:56;;;893:18;;:::i;:::-;-1:-1:-1;938:1:375;934:14;950:4;930:25;;779:182::o;966:407::-;1031:5;-1:-1:-1;;;;;1057:6:375;1054:30;1051:56;;;1087:18;;:::i;:::-;1125:57;1170:2;1149:15;;-1:-1:-1;;1145:29:375;1176:4;1141:40;1125:57;:::i;:::-;1116:66;;1205:6;1198:5;1191:21;1245:3;1236:6;1231:3;1227:16;1224:25;1221:45;;;1262:1;1259;1252:12;1221:45;1311:6;1306:3;1299:4;1292:5;1288:16;1275:43;1365:1;1358:4;1349:6;1342:5;1338:18;1334:29;1327:40;966:407;;;;;:::o;1378:1088::-;1431:5;1484:3;1477:4;1469:6;1465:17;1461:27;1451:55;;1502:1;1499;1492:12;1451:55;1538:6;1525:20;1564:4;1588:59;1604:42;1643:2;1604:42;:::i;:::-;1588:59;:::i;:::-;1681:15;;;1767:1;1763:10;;;;1751:23;;1747:32;;;1712:12;;;;1791:15;;;1788:35;;;1819:1;1816;1809:12;1788:35;1855:2;1847:6;1843:15;1867:570;1883:6;1878:3;1875:15;1867:570;;;1969:3;1956:17;-1:-1:-1;;;;;1992:11:375;1989:35;1986:125;;;2065:1;2094:2;2090;2083:14;1986:125;2134:24;;2193:2;2185:11;;2181:21;-1:-1:-1;2171:119:375;;2244:1;2273:2;2269;2262:14;2171:119;2315:79;2390:3;2384:2;2380;2376:11;2363:25;2358:2;2354;2350:11;2315:79;:::i;:::-;2303:92;;-1:-1:-1;2415:12:375;;;;1900;;1867:570;;;-1:-1:-1;2455:5:375;1378:1088;-1:-1:-1;;;;;;1378:1088:375:o;2471:145::-;-1:-1:-1;;;;;2560:31:375;;2550:42;;2540:70;;2606:1;2603;2596:12;2621:831;2685:5;2733:4;2721:9;2716:3;2712:19;2708:30;2705:50;;;2751:1;2748;2741:12;2705:50;2784:4;2778:11;2828:4;2820:6;2816:17;-1:-1:-1;;;;;2920:6:375;2908:10;2905:22;2900:2;2888:10;2885:18;2882:46;2879:72;;;2931:18;;:::i;:::-;2973:10;2967:4;2960:24;3002:6;2993:15;;3045:9;3032:23;3017:38;;3064:47;3103:7;3064:47;:::i;:::-;3120:23;;;3194:2;3179:18;;3166:32;;3210:14;;;3207:34;;;3237:1;3234;3227:12;3207:34;-1:-1:-1;3260:22:375;;3313:4;3305:13;;3301:23;-1:-1:-1;3291:51:375;;3338:1;3335;3328:12;3291:51;3375:70;3441:3;3436:2;3423:16;3418:2;3414;3410:11;3375:70;:::i;:::-;3370:2;3362:6;3358:15;3351:95;;;2621:831;;;;:::o;3457:923::-;3528:5;3581:3;3574:4;3566:6;3562:17;3558:27;3548:55;;3599:1;3596;3589:12;3548:55;3635:6;3622:20;3661:4;3685:59;3701:42;3740:2;3701:42;:::i;3685:59::-;3778:15;;;3864:1;3860:10;;;;3848:23;;3844:32;;;3809:12;;;;3888:15;;;3885:35;;;3916:1;3913;3906:12;3885:35;3952:2;3944:6;3940:15;3964:387;3980:6;3975:3;3972:15;3964:387;;;4066:3;4053:17;-1:-1:-1;;;;;4089:11:375;4086:35;4083:125;;;4162:1;4191:2;4187;4180:14;4083:125;4233:75;4304:3;4299:2;4285:11;4277:6;4273:24;4269:33;4233:75;:::i;:::-;4221:88;;-1:-1:-1;4329:12:375;;;;3997;;3964:387;;4385:1015;4579:6;4587;4595;4603;4611;4664:3;4652:9;4643:7;4639:23;4635:33;4632:53;;;4681:1;4678;4671:12;4632:53;4717:9;4704:23;4694:33;;4778:2;4767:9;4763:18;4750:32;-1:-1:-1;;;;;4842:2:375;4834:6;4831:14;4828:34;;;4858:1;4855;4848:12;4828:34;4897:59;4948:7;4939:6;4928:9;4924:22;4897:59;:::i;:::-;4975:8;;-1:-1:-1;4871:85:375;-1:-1:-1;5063:2:375;5048:18;;5035:32;;-1:-1:-1;5079:16:375;;;5076:36;;;5108:1;5105;5098:12;5076:36;5131:62;5185:7;5174:8;5163:9;5159:24;5131:62;:::i;:::-;5121:72;;5246:2;5235:9;5231:18;5218:32;5202:48;;5275:2;5265:8;5262:16;5259:36;;;5291:1;5288;5281:12;5259:36;;5314:80;5386:7;5375:8;5364:9;5360:24;5314:80;:::i;:::-;5304:90;;;4385:1015;;;;;;;;:::o;5405:250::-;5490:1;5500:113;5514:6;5511:1;5508:13;5500:113;;;5590:11;;;5584:18;5571:11;;;5564:39;5536:2;5529:10;5500:113;;;-1:-1:-1;;5647:1:375;5629:16;;5622:27;5405:250::o;5660:271::-;5702:3;5740:5;5734:12;5767:6;5762:3;5755:19;5783:76;5852:6;5845:4;5840:3;5836:14;5829:4;5822:5;5818:16;5783:76;:::i;:::-;5913:2;5892:15;-1:-1:-1;;5888:29:375;5879:39;;;;5920:4;5875:50;;5660:271;-1:-1:-1;;5660:271:375:o;5936:479::-;6003:3;6041:5;6035:12;6068:6;6063:3;6056:19;6094:4;6123;6118:3;6114:14;6107:21;;6162:4;6155:5;6151:16;6185:1;6195:195;6209:6;6206:1;6203:13;6195:195;;;6274:13;;-1:-1:-1;;;;;6270:39:375;6258:52;;6330:12;;;;6365:15;;;;6306:1;6224:9;6195:195;;;-1:-1:-1;6406:3:375;;5936:479;-1:-1:-1;;;;;5936:479:375:o;6420:1147::-;6503:5;6497:12;6492:3;6485:25;6467:3;6529:4;6579:2;6572:5;6568:14;6562:21;6613:4;6608:2;6603:3;6599:12;6592:26;6639:47;6680:4;6675:3;6671:14;6657:12;6639:47;:::i;:::-;6627:59;;6749:4;6742:5;6738:16;6732:23;6725:31;6718:39;6711:4;6706:3;6702:14;6695:63;6806:4;6799:5;6795:16;6789:23;6854:3;6848:4;6844:14;6837:4;6832:3;6828:14;6821:38;6881:4;6914:14;6908:21;6951:6;6945:4;6938:20;6986:2;6980:4;6976:13;6967:22;;7043:2;7033:6;7030:1;7026:14;7020:4;7016:25;7012:34;7089:2;7073:14;7069:23;7055:37;;7110:1;7120:256;7134:6;7131:1;7128:13;7120:256;;;7224:2;7220:7;7213:4;7205:6;7201:17;7197:31;7190:5;7183:46;7252:40;7285:6;7276;7270:13;7252:40;:::i;:::-;7315:15;;;;7352:14;;;;7242:50;-1:-1:-1;7156:1:375;7149:9;7120:256;;;7124:3;7424:4;7417:5;7413:16;7407:23;7385:45;;7474:3;7466:6;7462:16;7455:4;7450:3;7446:14;7439:40;7495:66;7554:6;7538:14;7495:66;:::i;:::-;7488:73;6420:1147;-1:-1:-1;;;;;;;;;6420:1147:375:o;7572:834::-;7760:4;7789:2;7829;7818:9;7814:18;7859:2;7848:9;7841:21;7882:6;7917;7911:13;7948:6;7940;7933:22;7986:2;7975:9;7971:18;7964:25;;8048:2;8038:6;8035:1;8031:14;8020:9;8016:30;8012:39;7998:53;;8086:2;8078:6;8074:15;8107:1;8117:260;8131:6;8128:1;8125:13;8117:260;;;8224:2;8220:7;8208:9;8200:6;8196:22;8192:36;8187:3;8180:49;8252:45;8290:6;8281;8275:13;8252:45;:::i;:::-;8242:55;-1:-1:-1;8355:12:375;;;;8320:15;;;;8153:1;8146:9;8117:260;;;-1:-1:-1;8394:6:375;;7572:834;-1:-1:-1;;;;;;;7572:834:375:o;8411:180::-;8470:6;8523:2;8511:9;8502:7;8498:23;8494:32;8491:52;;;8539:1;8536;8529:12;8491:52;-1:-1:-1;8562:23:375;;8411:180;-1:-1:-1;8411:180:375:o;8596:251::-;8771:2;8760:9;8753:21;8734:4;8791:50;8837:2;8826:9;8822:18;8814:6;8791:50;:::i;8852:946::-;9037:6;9045;9053;9061;9114:2;9102:9;9093:7;9089:23;9085:32;9082:52;;;9130:1;9127;9120:12;9082:52;9170:9;9157:23;-1:-1:-1;;;;;9240:2:375;9232:6;9229:14;9226:34;;;9256:1;9253;9246:12;9226:34;9295:59;9346:7;9337:6;9326:9;9322:22;9295:59;:::i;:::-;9373:8;;-1:-1:-1;9269:85:375;-1:-1:-1;9461:2:375;9446:18;;9433:32;;-1:-1:-1;9477:16:375;;;9474:36;;;9506:1;9503;9496:12;9474:36;9529:62;9583:7;9572:8;9561:9;9557:24;9529:62;:::i;:::-;9519:72;;9644:2;9633:9;9629:18;9616:32;9600:48;;9673:2;9663:8;9660:16;9657:36;;;9689:1;9686;9679:12;9657:36;;9712:80;9784:7;9773:8;9762:9;9758:24;9712:80;:::i;:::-;9702:90;;;8852:946;;;;;;;:::o;9985:425::-;10088:6;10096;10149:2;10137:9;10128:7;10124:23;10120:32;10117:52;;;10165:1;10162;10155:12;10117:52;10201:9;10188:23;10178:33;;10262:2;10251:9;10247:18;10234:32;-1:-1:-1;;;;;10281:6:375;10278:30;10275:50;;;10321:1;10318;10311:12;10275:50;10344:60;10396:7;10387:6;10376:9;10372:22;10344:60;:::i;:::-;10334:70;;;9985:425;;;;;:::o;10415:803::-;10577:4;10606:2;10646;10635:9;10631:18;10676:2;10665:9;10658:21;10699:6;10734;10728:13;10765:6;10757;10750:22;10803:2;10792:9;10788:18;10781:25;;10865:2;10855:6;10852:1;10848:14;10837:9;10833:30;10829:39;10815:53;;10903:2;10895:6;10891:15;10924:1;10934:255;10948:6;10945:1;10942:13;10934:255;;;11041:2;11037:7;11025:9;11017:6;11013:22;11009:36;11004:3;10997:49;11069:40;11102:6;11093;11087:13;11069:40;:::i;:::-;11059:50;-1:-1:-1;11167:12:375;;;;11132:15;;;;10970:1;10963:9;10934:255;;11223:434;11327:6;11335;11388:2;11376:9;11367:7;11363:23;11359:32;11356:52;;;11404:1;11401;11394:12;11356:52;11440:9;11427:23;11417:33;;11501:2;11490:9;11486:18;11473:32;-1:-1:-1;;;;;11520:6:375;11517:30;11514:50;;;11560:1;11557;11550:12;11514:50;11583:68;11643:7;11634:6;11623:9;11619:22;11583:68;:::i;11662:127::-;11723:10;11718:3;11714:20;11711:1;11704:31;11754:4;11751:1;11744:15;11778:4;11775:1;11768:15;11794:380;11873:1;11869:12;;;;11916;;;11937:61;;11991:4;11983:6;11979:17;11969:27;;11937:61;12044:2;12036:6;12033:14;12013:18;12010:38;12007:161;;12090:10;12085:3;12081:20;12078:1;12071:31;12125:4;12122:1;12115:15;12153:4;12150:1;12143:15;12305:543;12407:2;12402:3;12399:11;12396:446;;;12443:1;12467:5;12464:1;12457:16;12511:4;12508:1;12498:18;12581:2;12569:10;12565:19;12562:1;12558:27;12552:4;12548:38;12617:4;12605:10;12602:20;12599:47;;;-1:-1:-1;12640:4:375;12599:47;12695:2;12690:3;12686:12;12683:1;12679:20;12673:4;12669:31;12659:41;;12750:82;12768:2;12761:5;12758:13;12750:82;;;12813:17;;;12794:1;12783:13;12750:82;;13024:1206;-1:-1:-1;;;;;13143:3:375;13140:27;13137:53;;;13170:18;;:::i;:::-;13199:94;13289:3;13249:38;13281:4;13275:11;13249:38;:::i;:::-;13243:4;13199:94;:::i;:::-;13319:1;13344:2;13339:3;13336:11;13361:1;13356:616;;;;14016:1;14033:3;14030:93;;;-1:-1:-1;14089:19:375;;;14076:33;14030:93;-1:-1:-1;;12981:1:375;12977:11;;;12973:24;12969:29;12959:40;13005:1;13001:11;;;12956:57;14136:78;;13329:895;;13356:616;12252:1;12245:14;;;12289:4;12276:18;;-1:-1:-1;;13392:17:375;;;13493:9;13515:229;13529:7;13526:1;13523:14;13515:229;;;13618:19;;;13605:33;13590:49;;13725:4;13710:20;;;;13678:1;13666:14;;;;13545:12;13515:229;;;13519:3;13772;13763:7;13760:16;13757:159;;;13896:1;13892:6;13886:3;13880;13877:1;13873:11;13869:21;13865:34;13861:39;13848:9;13843:3;13839:19;13826:33;13822:79;13814:6;13807:95;13757:159;;;13959:1;13953:3;13950:1;13946:11;13942:19;13936:4;13929:33;13329:895;;13024:1206;;;:::o;14235:1345::-;14361:3;14355:10;-1:-1:-1;;;;;14380:6:375;14377:30;14374:56;;;14410:18;;:::i;:::-;14439:97;14529:6;14489:38;14521:4;14515:11;14489:38;:::i;:::-;14483:4;14439:97;:::i;:::-;14591:4;;14648:2;14637:14;;14665:1;14660:663;;;;15367:1;15384:6;15381:89;;;-1:-1:-1;15436:19:375;;;15430:26;15381:89;-1:-1:-1;;12981:1:375;12977:11;;;12973:24;12969:29;12959:40;13005:1;13001:11;;;12956:57;15483:81;;14630:944;;14660:663;12252:1;12245:14;;;12289:4;12276:18;;-1:-1:-1;;14696:20:375;;;14814:236;14828:7;14825:1;14822:14;14814:236;;;14917:19;;;14911:26;14896:42;;15009:27;;;;14977:1;14965:14;;;;14844:19;;14814:236;;;14818:3;15078:6;15069:7;15066:19;15063:201;;;15139:19;;;15133:26;-1:-1:-1;;15222:1:375;15218:14;;;15234:3;15214:24;15210:37;15206:42;15191:58;15176:74;;15063:201;-1:-1:-1;;;;;15310:1:375;15294:14;;;15290:22;15277:36;;-1:-1:-1;14235:1345:375:o;15585:289::-;15716:3;15754:6;15748:13;15770:66;15829:6;15824:3;15817:4;15809:6;15805:17;15770:66;:::i;:::-;15852:16;;;;;15585:289;-1:-1:-1;;15585:289:375:o;15879:297::-;15997:12;;16044:4;16033:16;;;16027:23;;15997:12;16062:16;;16059:111;;;-1:-1:-1;;16136:4:375;16132:17;;;;16129:1;16125:25;16121:38;16110:50;;15879:297;-1:-1:-1;15879:297:375:o;16388:277::-;16455:6;16508:2;16496:9;16487:7;16483:23;16479:32;16476:52;;;16524:1;16521;16514:12;16476:52;16556:9;16550:16;16609:5;16602:13;16595:21;16588:5;16585:32;16575:60;;16631:1;16628;16621:12;16670:289;16845:6;16834:9;16827:25;16888:2;16883;16872:9;16868:18;16861:30;16808:4;16908:45;16949:2;16938:9;16934:18;16926:6;16908:45;:::i;16964:127::-;17025:10;17020:3;17016:20;17013:1;17006:31;17056:4;17053:1;17046:15;17080:4;17077:1;17070:15;17096:125;17161:9;;;17182:10;;;17179:36;;;17195:18;;:::i;17226:135::-;17265:3;17286:17;;;17283:43;;17306:18;;:::i;:::-;-1:-1:-1;17353:1:375;17342:13;;17226:135::o;17366:265::-;17436:6;17489:2;17477:9;17468:7;17464:23;17460:32;17457:52;;;17505:1;17502;17495:12;17457:52;17537:9;17531:16;17556:45;17595:5;17556:45;:::i;17636:801::-;17834:4;17882:2;17871:9;17867:18;17912:6;17901:9;17894:25;17938:2;17976;17971;17960:9;17956:18;17949:30;17999:6;18034;18028:13;18065:6;18057;18050:22;18103:3;18092:9;18088:19;18081:26;;18142:2;18134:6;18130:15;18116:29;;18163:1;18173:195;18187:6;18184:1;18181:13;18173:195;;;18252:13;;-1:-1:-1;;;;;18248:39:375;18236:52;;18343:15;;;;18308:12;;;;18284:1;18202:9;18173:195;;;18177:3;;18385;18377:11;;;;;18424:6;18419:2;18408:9;18404:18;18397:34;17636:801;;;;;;:::o;18442:128::-;18509:9;;;18530:11;;;18527:37;;;18544:18;;:::i;18575:127::-;18636:10;18631:3;18627:20;18624:1;18617:31;18667:4;18664:1;18657:15;18691:4;18688:1;18681:15;18915:969;19010:6;19041:2;19084;19072:9;19063:7;19059:23;19055:32;19052:52;;;19100:1;19097;19090:12;19052:52;19133:9;19127:16;-1:-1:-1;;;;;19158:6:375;19155:30;19152:50;;;19198:1;19195;19188:12;19152:50;19221:22;;19274:4;19266:13;;19262:27;-1:-1:-1;19252:55:375;;19303:1;19300;19293:12;19252:55;19332:2;19326:9;19355:59;19371:42;19410:2;19371:42;:::i;19355:59::-;19448:15;;;19530:1;19526:10;;;;19518:19;;19514:28;;;19479:12;;;;19554:19;;;19551:39;;;19586:1;19583;19576:12;19551:39;19610:11;;;;19630:224;19646:6;19641:3;19638:15;19630:224;;;19719:3;19713:10;19736:45;19775:5;19736:45;:::i;:::-;19794:18;;19663:12;;;;19832;;;;19630:224;;;19873:5;18915:969;-1:-1:-1;;;;;;;18915:969:375:o","linkReferences":{}},"methodIdentifiers":{"addPermissionsToRole(uint256,string[])":"b7515761","addRoleToEntitlement(uint256,(address,bytes))":"ba201ba8","createRole(string,string[],(address,bytes)[])":"8fcd793d","getPermissionsByRoleId(uint256)":"b4264233","getRoleById(uint256)":"784c872b","getRoles()":"71061398","removePermissionsFromRole(uint256,string[])":"9a8e4c3e","removeRole(uint256)":"92691821","removeRoleFromEntitlement(uint256,(address,bytes))":"dba81864","updateRole(uint256,string,string[],(address,bytes)[])":"4d8b50a2"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ApprovalCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BalanceQueryForZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__AlreadyBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Banning__CannotBanSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banning__NotBanned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChannelService__ChannelDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChannelService__ChannelDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChannelService__RoleDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC5643__DurationZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC5643__InvalidTokenId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC5643__NotApprovedOrOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC5643__SubscriptionNotRenewable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__ValueAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementsService__EntitlementDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementsService__InvalidEntitlementAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EntitlementsService__InvalidEntitlementInterface\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintERC2309QuantityExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintZeroQuantity\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnershipNotInitializedForExtraData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__Paused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__EntitlementAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__EntitlementDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__InvalidEntitlementAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__InvalidPermission\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__PermissionAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__PermissionDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Roles__RoleDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFromIncorrectOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC721ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"URIQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Validator__InvalidByteLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Validator__InvalidStringLength\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Banned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"toTokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"ConsecutiveTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"RoleCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remover\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"RoleRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"updater\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"RoleUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"expiration\",\"type\":\"uint64\"}],\"name\":\"SubscriptionUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"moderator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Unbanned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"internalType\":\"string[]\",\"name\":\"permissions\",\"type\":\"string[]\"}],\"name\":\"addPermissionsToRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"contract IEntitlement\",\"name\":\"module\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IRolesBase.CreateEntitlement\",\"name\":\"entitlement\",\"type\":\"tuple\"}],\"name\":\"addRoleToEntitlement\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"roleName\",\"type\":\"string\"},{\"internalType\":\"string[]\",\"name\":\"permissions\",\"type\":\"string[]\"},{\"components\":[{\"internalType\":\"contract IEntitlement\",\"name\":\"module\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IRolesBase.CreateEntitlement[]\",\"name\":\"entitlements\",\"type\":\"tuple[]\"}],\"name\":\"createRole\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getPermissionsByRoleId\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"permissions\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getRoleById\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"string[]\",\"name\":\"permissions\",\"type\":\"string[]\"},{\"internalType\":\"contract IEntitlement[]\",\"name\":\"entitlements\",\"type\":\"address[]\"}],\"internalType\":\"struct IRolesBase.Role\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRoles\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"string[]\",\"name\":\"permissions\",\"type\":\"string[]\"},{\"internalType\":\"contract IEntitlement[]\",\"name\":\"entitlements\",\"type\":\"address[]\"}],\"internalType\":\"struct IRolesBase.Role[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"internalType\":\"string[]\",\"name\":\"permissions\",\"type\":\"string[]\"}],\"name\":\"removePermissionsFromRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"removeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"contract IEntitlement\",\"name\":\"module\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IRolesBase.CreateEntitlement\",\"name\":\"entitlement\",\"type\":\"tuple\"}],\"name\":\"removeRoleFromEntitlement\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"roleName\",\"type\":\"string\"},{\"internalType\":\"string[]\",\"name\":\"permissions\",\"type\":\"string[]\"},{\"components\":[{\"internalType\":\"contract IEntitlement\",\"name\":\"module\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IRolesBase.CreateEntitlement[]\",\"name\":\"entitlements\",\"type\":\"tuple[]\"}],\"name\":\"updateRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"ConsecutiveTransfer(uint256,uint256,address,address)\":{\"details\":\"Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, as defined in the [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. See {_mintERC2309} for more details.\"},\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"},\"SubscriptionUpdate(uint256,uint64)\":{\"details\":\"When a subscription is canceled, the expiration value should also be 0.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"errors\":{\"ApprovalCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"ApprovalQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"BalanceQueryForZeroAddress()\":[{\"notice\":\"Cannot query the balance for the zero address.\"}],\"MintERC2309QuantityExceedsLimit()\":[{\"notice\":\"The `quantity` minted with ERC2309 exceeds the safety limit.\"}],\"MintToZeroAddress()\":[{\"notice\":\"Cannot mint to the zero address.\"}],\"MintZeroQuantity()\":[{\"notice\":\"The quantity of tokens minted must be more than zero.\"}],\"OwnerQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"OwnershipNotInitializedForExtraData()\":[{\"notice\":\"The `extraData` cannot be set on an unintialized ownership slot.\"}],\"TransferCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"TransferFromIncorrectOwner()\":[{\"notice\":\"The token must be owned by `from`.\"}],\"TransferToNonERC721ReceiverImplementer()\":[{\"notice\":\"Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"notice\":\"Cannot transfer to the zero address.\"}],\"URIQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}]},\"events\":{\"SubscriptionUpdate(uint256,uint64)\":{\"notice\":\"Emitted when a subscription expiration changes\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/facets/roles/Roles.sol\":\"Roles\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol\":{\"keccak256\":\"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f\",\"dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol\":{\"keccak256\":\"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5\",\"dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol\":{\"keccak256\":\"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc\",\"dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf\"]},\"contracts/src/diamond/facets/pausable/IPausable.sol\":{\"keccak256\":\"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6\",\"dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM\"]},\"contracts/src/diamond/facets/pausable/PausableBase.sol\":{\"keccak256\":\"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c\",\"dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1\"]},\"contracts/src/diamond/facets/pausable/PausableStorage.sol\":{\"keccak256\":\"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b\",\"dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL\"]},\"contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol\":{\"keccak256\":\"0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714\",\"dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8\"]},\"contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol\":{\"keccak256\":\"0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7\",\"dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7\"]},\"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol\":{\"keccak256\":\"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f\",\"dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol\":{\"keccak256\":\"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa\",\"dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol\":{\"keccak256\":\"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c\",\"dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu\"]},\"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol\":{\"keccak256\":\"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e\",\"dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM\"]},\"contracts/src/factory/facets/wallet-link/IWalletLink.sol\":{\"keccak256\":\"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13\",\"dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR\"]},\"contracts/src/spaces/entitlements/IEntitlement.sol\":{\"keccak256\":\"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3\",\"dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf\"]},\"contracts/src/spaces/facets/Entitled.sol\":{\"keccak256\":\"0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7\",\"dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc\"]},\"contracts/src/spaces/facets/Permissions.sol\":{\"keccak256\":\"0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721\",\"dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp\"]},\"contracts/src/spaces/facets/banning/BanningBase.sol\":{\"keccak256\":\"0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d\",\"dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN\"]},\"contracts/src/spaces/facets/banning/BanningStorage.sol\":{\"keccak256\":\"0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0\",\"dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1\"]},\"contracts/src/spaces/facets/banning/IBanning.sol\":{\"keccak256\":\"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419\",\"dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6\"]},\"contracts/src/spaces/facets/channels/ChannelService.sol\":{\"keccak256\":\"0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9\",\"dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi\"]},\"contracts/src/spaces/facets/channels/ChannelStorage.sol\":{\"keccak256\":\"0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7\",\"dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS\"]},\"contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol\":{\"keccak256\":\"0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5\",\"dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9\"]},\"contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol\":{\"keccak256\":\"0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07\",\"dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek\"]},\"contracts/src/spaces/facets/entitlements/EntitlementsManagerService.sol\":{\"keccak256\":\"0x6f40f5b41ad702ea55bf10f987b3e2b6d02ac527a66be523f06f025cead1867d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://da2012c616b833c5b491735c230be707e4f9b7657b3a71d7bdf52e7c2ba128b9\",\"dweb:/ipfs/Qme4864V46rozVDRWtfYqtpyzE1SzBnqYQQf3iD2rrqiPg\"]},\"contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol\":{\"keccak256\":\"0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583\",\"dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK\"]},\"contracts/src/spaces/facets/membership/MembershipStorage.sol\":{\"keccak256\":\"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee\",\"dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5\"]},\"contracts/src/spaces/facets/roles/IRoles.sol\":{\"keccak256\":\"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8\",\"dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N\"]},\"contracts/src/spaces/facets/roles/Roles.sol\":{\"keccak256\":\"0xc941bcf9a296c108389b1c0916ca05643a89c5f466e6b3f955bbd9dde64df762\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d86c333a63ffb52d23b7aa7af3711abb7501a0bddae059e5744d9ffcb1dee00b\",\"dweb:/ipfs/QmZMhHACX9gD7CGrHnMZNJM8CWzfndT3rihUWQm8PYy8XD\"]},\"contracts/src/spaces/facets/roles/RolesBase.sol\":{\"keccak256\":\"0x2ef137dec4a5390009fd931e34fdbb4a742c96b68b40f5c152cec8cf2809ed6f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3cb29b4a780742a30ba3af5719f77a4a65ea55ebbdc3ccd9c93c86573f20c7df\",\"dweb:/ipfs/QmdvPJydLCcEwCB3xk5VpET8X2GfrxC3NBUD5G6C8a9aW8\"]},\"contracts/src/spaces/facets/roles/RolesStorage.sol\":{\"keccak256\":\"0x40f288a613e35cbc02aceb1d23f89af888f65538853f61cc1fcd25901b9bc4af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://396b5e157c9a29adc94edc5d234f416a44e6e7c4588b1aaa0587bb04018705e9\",\"dweb:/ipfs/QmWDCQz555WbvZw7XxfkybE5dPfouc6rKxU5Zu1Gsuz1Zr\"]},\"contracts/src/utils/StringSet.sol\":{\"keccak256\":\"0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6\",\"dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK\"]},\"contracts/src/utils/Validator.sol\":{\"keccak256\":\"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64\",\"dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72\"]},\"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"ApprovalCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"ApprovalQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"BalanceQueryForZeroAddress"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__AlreadyBanned"},{"inputs":[],"type":"error","name":"Banning__CannotBanSelf"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__InvalidTokenId"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"Banning__NotBanned"},{"inputs":[],"type":"error","name":"ChannelService__ChannelDisabled"},{"inputs":[],"type":"error","name":"ChannelService__ChannelDoesNotExist"},{"inputs":[],"type":"error","name":"ChannelService__RoleDoesNotExist"},{"inputs":[],"type":"error","name":"ERC5643__DurationZero"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC5643__InvalidTokenId"},{"inputs":[],"type":"error","name":"ERC5643__NotApprovedOrOwner"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"type":"error","name":"ERC5643__SubscriptionNotRenewable"},{"inputs":[],"type":"error","name":"Entitlement__InvalidValue"},{"inputs":[],"type":"error","name":"Entitlement__NotAllowed"},{"inputs":[],"type":"error","name":"Entitlement__NotMember"},{"inputs":[],"type":"error","name":"Entitlement__ValueAlreadyExists"},{"inputs":[],"type":"error","name":"EntitlementsService__EntitlementDoesNotExist"},{"inputs":[],"type":"error","name":"EntitlementsService__InvalidEntitlementAddress"},{"inputs":[],"type":"error","name":"EntitlementsService__InvalidEntitlementInterface"},{"inputs":[],"type":"error","name":"MintERC2309QuantityExceedsLimit"},{"inputs":[],"type":"error","name":"MintToZeroAddress"},{"inputs":[],"type":"error","name":"MintZeroQuantity"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[],"type":"error","name":"OwnerQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"OwnershipNotInitializedForExtraData"},{"inputs":[],"type":"error","name":"Pausable__NotPaused"},{"inputs":[],"type":"error","name":"Pausable__Paused"},{"inputs":[],"type":"error","name":"Roles__EntitlementAlreadyExists"},{"inputs":[],"type":"error","name":"Roles__EntitlementDoesNotExist"},{"inputs":[],"type":"error","name":"Roles__InvalidEntitlementAddress"},{"inputs":[],"type":"error","name":"Roles__InvalidPermission"},{"inputs":[],"type":"error","name":"Roles__PermissionAlreadyExists"},{"inputs":[],"type":"error","name":"Roles__PermissionDoesNotExist"},{"inputs":[],"type":"error","name":"Roles__RoleDoesNotExist"},{"inputs":[],"type":"error","name":"TransferCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"TransferFromIncorrectOwner"},{"inputs":[],"type":"error","name":"TransferToNonERC721ReceiverImplementer"},{"inputs":[],"type":"error","name":"TransferToZeroAddress"},{"inputs":[],"type":"error","name":"URIQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"Validator__InvalidByteLength"},{"inputs":[],"type":"error","name":"Validator__InvalidStringLength"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"approved","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bool","name":"approved","type":"bool","indexed":false}],"type":"event","name":"ApprovalForAll","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Banned","anonymous":false},{"inputs":[{"internalType":"uint256","name":"fromTokenId","type":"uint256","indexed":true},{"internalType":"uint256","name":"toTokenId","type":"uint256","indexed":false},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true}],"type":"event","name":"ConsecutiveTransfer","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"address","name":"creator","type":"address","indexed":true},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":true}],"type":"event","name":"RoleCreated","anonymous":false},{"inputs":[{"internalType":"address","name":"remover","type":"address","indexed":true},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":true}],"type":"event","name":"RoleRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"updater","type":"address","indexed":true},{"internalType":"uint256","name":"roleId","type":"uint256","indexed":true}],"type":"event","name":"RoleUpdated","anonymous":false},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true},{"internalType":"uint64","name":"expiration","type":"uint64","indexed":false}],"type":"event","name":"SubscriptionUpdate","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"address","name":"moderator","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Unbanned","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"string[]","name":"permissions","type":"string[]"}],"stateMutability":"nonpayable","type":"function","name":"addPermissionsToRole"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"struct IRolesBase.CreateEntitlement","name":"entitlement","type":"tuple","components":[{"internalType":"contract IEntitlement","name":"module","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"addRoleToEntitlement"},{"inputs":[{"internalType":"string","name":"roleName","type":"string"},{"internalType":"string[]","name":"permissions","type":"string[]"},{"internalType":"struct IRolesBase.CreateEntitlement[]","name":"entitlements","type":"tuple[]","components":[{"internalType":"contract IEntitlement","name":"module","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"createRole","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getPermissionsByRoleId","outputs":[{"internalType":"string[]","name":"permissions","type":"string[]"}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getRoleById","outputs":[{"internalType":"struct IRolesBase.Role","name":"","type":"tuple","components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"bool","name":"disabled","type":"bool"},{"internalType":"string[]","name":"permissions","type":"string[]"},{"internalType":"contract IEntitlement[]","name":"entitlements","type":"address[]"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getRoles","outputs":[{"internalType":"struct IRolesBase.Role[]","name":"","type":"tuple[]","components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"bool","name":"disabled","type":"bool"},{"internalType":"string[]","name":"permissions","type":"string[]"},{"internalType":"contract IEntitlement[]","name":"entitlements","type":"address[]"}]}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"string[]","name":"permissions","type":"string[]"}],"stateMutability":"nonpayable","type":"function","name":"removePermissionsFromRole"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"removeRole"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"struct IRolesBase.CreateEntitlement","name":"entitlement","type":"tuple","components":[{"internalType":"contract IEntitlement","name":"module","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"removeRoleFromEntitlement"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"string","name":"roleName","type":"string"},{"internalType":"string[]","name":"permissions","type":"string[]"},{"internalType":"struct IRolesBase.CreateEntitlement[]","name":"entitlements","type":"tuple[]","components":[{"internalType":"contract IEntitlement","name":"module","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"updateRole"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/facets/roles/Roles.sol":"Roles"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol":{"keccak256":"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d","urls":["bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f","dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol":{"keccak256":"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a","urls":["bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5","dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol":{"keccak256":"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0","urls":["bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc","dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/IPausable.sol":{"keccak256":"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261","urls":["bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6","dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableBase.sol":{"keccak256":"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438","urls":["bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c","dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableStorage.sol":{"keccak256":"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07","urls":["bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b","dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol":{"keccak256":"0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3","urls":["bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714","dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol":{"keccak256":"0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e","urls":["bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7","dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC5643/IERC5643.sol":{"keccak256":"0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218","urls":["bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f","dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol":{"keccak256":"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334","urls":["bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa","dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol":{"keccak256":"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1","urls":["bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c","dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9","urls":["bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e","dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM"],"license":"Apache-2.0"},"contracts/src/factory/facets/wallet-link/IWalletLink.sol":{"keccak256":"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b","urls":["bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13","dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/IEntitlement.sol":{"keccak256":"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca","urls":["bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3","dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf"],"license":"Apache-2.0"},"contracts/src/spaces/facets/Entitled.sol":{"keccak256":"0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c","urls":["bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7","dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc"],"license":"Apache-2.0"},"contracts/src/spaces/facets/Permissions.sol":{"keccak256":"0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5","urls":["bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721","dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/BanningBase.sol":{"keccak256":"0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270","urls":["bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d","dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/BanningStorage.sol":{"keccak256":"0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492","urls":["bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0","dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1"],"license":"Apache-2.0"},"contracts/src/spaces/facets/banning/IBanning.sol":{"keccak256":"0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505","urls":["bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419","dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/ChannelService.sol":{"keccak256":"0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7","urls":["bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9","dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/ChannelStorage.sol":{"keccak256":"0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f","urls":["bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7","dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS"],"license":"Apache-2.0"},"contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol":{"keccak256":"0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2","urls":["bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5","dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9"],"license":"Apache-2.0"},"contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol":{"keccak256":"0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef","urls":["bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07","dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/EntitlementsManagerService.sol":{"keccak256":"0x6f40f5b41ad702ea55bf10f987b3e2b6d02ac527a66be523f06f025cead1867d","urls":["bzz-raw://da2012c616b833c5b491735c230be707e4f9b7657b3a71d7bdf52e7c2ba128b9","dweb:/ipfs/Qme4864V46rozVDRWtfYqtpyzE1SzBnqYQQf3iD2rrqiPg"],"license":"Apache-2.0"},"contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol":{"keccak256":"0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8","urls":["bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583","dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK"],"license":"Apache-2.0"},"contracts/src/spaces/facets/membership/MembershipStorage.sol":{"keccak256":"0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3","urls":["bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee","dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/IRoles.sol":{"keccak256":"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d","urls":["bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8","dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/Roles.sol":{"keccak256":"0xc941bcf9a296c108389b1c0916ca05643a89c5f466e6b3f955bbd9dde64df762","urls":["bzz-raw://d86c333a63ffb52d23b7aa7af3711abb7501a0bddae059e5744d9ffcb1dee00b","dweb:/ipfs/QmZMhHACX9gD7CGrHnMZNJM8CWzfndT3rihUWQm8PYy8XD"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/RolesBase.sol":{"keccak256":"0x2ef137dec4a5390009fd931e34fdbb4a742c96b68b40f5c152cec8cf2809ed6f","urls":["bzz-raw://3cb29b4a780742a30ba3af5719f77a4a65ea55ebbdc3ccd9c93c86573f20c7df","dweb:/ipfs/QmdvPJydLCcEwCB3xk5VpET8X2GfrxC3NBUD5G6C8a9aW8"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/RolesStorage.sol":{"keccak256":"0x40f288a613e35cbc02aceb1d23f89af888f65538853f61cc1fcd25901b9bc4af","urls":["bzz-raw://396b5e157c9a29adc94edc5d234f416a44e6e7c4588b1aaa0587bb04018705e9","dweb:/ipfs/QmWDCQz555WbvZw7XxfkybE5dPfouc6rKxU5Zu1Gsuz1Zr"],"license":"Apache-2.0"},"contracts/src/utils/StringSet.sol":{"keccak256":"0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319","urls":["bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6","dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK"],"license":"Apache-2.0"},"contracts/src/utils/Validator.sol":{"keccak256":"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50","urls":["bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64","dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"keccak256":"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4","urls":["bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7","dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":205} \ No newline at end of file diff --git a/packages/generated/v3/abis/Roles.metadata.json b/packages/generated/v3/abis/Roles.metadata.json new file mode 100644 index 000000000..e524aad75 --- /dev/null +++ b/packages/generated/v3/abis/Roles.metadata.json @@ -0,0 +1,1154 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "ApprovalQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "BalanceQueryForZeroAddress" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__AlreadyBanned" + }, + { + "inputs": [], + "type": "error", + "name": "Banning__CannotBanSelf" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__InvalidTokenId" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "Banning__NotBanned" + }, + { + "inputs": [], + "type": "error", + "name": "ChannelService__ChannelDisabled" + }, + { + "inputs": [], + "type": "error", + "name": "ChannelService__ChannelDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "ChannelService__RoleDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "ERC5643__DurationZero" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC5643__InvalidTokenId" + }, + { + "inputs": [], + "type": "error", + "name": "ERC5643__NotApprovedOrOwner" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "type": "error", + "name": "ERC5643__SubscriptionNotRenewable" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__InvalidValue" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotAllowed" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotMember" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__ValueAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementsService__EntitlementDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementsService__InvalidEntitlementAddress" + }, + { + "inputs": [], + "type": "error", + "name": "EntitlementsService__InvalidEntitlementInterface" + }, + { + "inputs": [], + "type": "error", + "name": "MintERC2309QuantityExceedsLimit" + }, + { + "inputs": [], + "type": "error", + "name": "MintToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "MintZeroQuantity" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "OwnerQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "OwnershipNotInitializedForExtraData" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__NotPaused" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__Paused" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__EntitlementAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__EntitlementDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__InvalidEntitlementAddress" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__InvalidPermission" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__PermissionAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__PermissionDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "Roles__RoleDoesNotExist" + }, + { + "inputs": [], + "type": "error", + "name": "TransferCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "TransferFromIncorrectOwner" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "URIQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "Validator__InvalidByteLength" + }, + { + "inputs": [], + "type": "error", + "name": "Validator__InvalidStringLength" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "approved", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Approval", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "operator", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ApprovalForAll", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Banned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fromTokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint256", + "name": "toTokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConsecutiveTransfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Paused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "creator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RoleCreated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "remover", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RoleRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "updater", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RoleUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint64", + "name": "expiration", + "type": "uint64", + "indexed": false + } + ], + "type": "event", + "name": "SubscriptionUpdate", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Transfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "moderator", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Unbanned", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Unpaused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "permissions", + "type": "string[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "addPermissionsToRole" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "struct IRolesBase.CreateEntitlement", + "name": "entitlement", + "type": "tuple", + "components": [ + { + "internalType": "contract IEntitlement", + "name": "module", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ] + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "addRoleToEntitlement" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "roleName", + "type": "string" + }, + { + "internalType": "string[]", + "name": "permissions", + "type": "string[]" + }, + { + "internalType": "struct IRolesBase.CreateEntitlement[]", + "name": "entitlements", + "type": "tuple[]", + "components": [ + { + "internalType": "contract IEntitlement", + "name": "module", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ] + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "createRole", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getPermissionsByRoleId", + "outputs": [ + { + "internalType": "string[]", + "name": "permissions", + "type": "string[]" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getRoleById", + "outputs": [ + { + "internalType": "struct IRolesBase.Role", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "bool", + "name": "disabled", + "type": "bool" + }, + { + "internalType": "string[]", + "name": "permissions", + "type": "string[]" + }, + { + "internalType": "contract IEntitlement[]", + "name": "entitlements", + "type": "address[]" + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getRoles", + "outputs": [ + { + "internalType": "struct IRolesBase.Role[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "bool", + "name": "disabled", + "type": "bool" + }, + { + "internalType": "string[]", + "name": "permissions", + "type": "string[]" + }, + { + "internalType": "contract IEntitlement[]", + "name": "entitlements", + "type": "address[]" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "permissions", + "type": "string[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removePermissionsFromRole" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeRole" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "struct IRolesBase.CreateEntitlement", + "name": "entitlement", + "type": "tuple", + "components": [ + { + "internalType": "contract IEntitlement", + "name": "module", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ] + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeRoleFromEntitlement" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "roleName", + "type": "string" + }, + { + "internalType": "string[]", + "name": "permissions", + "type": "string[]" + }, + { + "internalType": "struct IRolesBase.CreateEntitlement[]", + "name": "entitlements", + "type": "tuple[]", + "components": [ + { + "internalType": "contract IEntitlement", + "name": "module", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ] + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "updateRole" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/facets/roles/Roles.sol": "Roles" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol": { + "keccak256": "0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d", + "urls": [ + "bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f", + "dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol": { + "keccak256": "0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a", + "urls": [ + "bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5", + "dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol": { + "keccak256": "0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0", + "urls": [ + "bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc", + "dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/IPausable.sol": { + "keccak256": "0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261", + "urls": [ + "bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6", + "dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableBase.sol": { + "keccak256": "0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438", + "urls": [ + "bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c", + "dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableStorage.sol": { + "keccak256": "0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07", + "urls": [ + "bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b", + "dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/ERC5643Base.sol": { + "keccak256": "0x08a5e803cae11a5ca3cb43e3243b4af0339cf044fe8a8f33c02eeac6a89771a3", + "urls": [ + "bzz-raw://1b9dffbbd0c961d87eeaa10665ed93a3a919dc53db0e684b76d66b0f7e2a0714", + "dweb:/ipfs/QmbgTB2swkeRsc7Dc1Wf28cLcKTExw2pzDY66zy5kFLeE8" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/ERC5643Storage.sol": { + "keccak256": "0x5d560d4d09c521bd463e6ea41eb6451a76f815222d9b3a9b15aff5ce56a2e15e", + "urls": [ + "bzz-raw://395630900bc5b43af14ba8b2b9a97357d9b36ed2debfb72b4fab1999294645c7", + "dweb:/ipfs/QmNa6GUiCLSnL3jRKewzpC5TU5TtYxdNNUhPHTqoZ4sGC7" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC5643/IERC5643.sol": { + "keccak256": "0x3d75267c3894bc9b201b30af94a4587cca8dc3363593a47ee4cc3b9ff27a7218", + "urls": [ + "bzz-raw://3e50378e2ca909177555139f16db11f2fc7f3e97acbc40fc6eea5848bbd61b3f", + "dweb:/ipfs/Qmdi2FBhdWAAFE8Kr5DFu9qoESLcH1STb7bm7kXxEjrsJB" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol": { + "keccak256": "0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334", + "urls": [ + "bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa", + "dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol": { + "keccak256": "0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1", + "urls": [ + "bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c", + "dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/IERC721A.sol": { + "keccak256": "0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9", + "urls": [ + "bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e", + "dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/wallet-link/IWalletLink.sol": { + "keccak256": "0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b", + "urls": [ + "bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13", + "dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/IEntitlement.sol": { + "keccak256": "0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca", + "urls": [ + "bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3", + "dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/Entitled.sol": { + "keccak256": "0x60df2d441d103a23e8ff1fa5815399bf58dc25b19030de56c15cf9a84393c62c", + "urls": [ + "bzz-raw://d13b2b6464b4a820ff88aae2a59bf003bc7d61a1e630ac69e0849d54446539b7", + "dweb:/ipfs/QmZe187XqCCNxmwj3BKGRtyNyEoEga22oqGQe8iao7LQCc" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/Permissions.sol": { + "keccak256": "0xd168f6402ce23a1bbc0503c1287e94096ef7c7b35733a8d835a8747f79df77f5", + "urls": [ + "bzz-raw://2d805a55d9e2050d763bc1cf3f0a5d40ca8066bdcdc3c920908f6f63cfa1a721", + "dweb:/ipfs/QmPSieLU3W9f8FrDu918KPPSQQKBMfRUetRq5fdEsTBFxp" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/BanningBase.sol": { + "keccak256": "0xa78695942b8e0415e7177d20dd06f596566a649e68c89d1ed15ec90e74a95270", + "urls": [ + "bzz-raw://07c4a45a6d0e3d03752be2a31a07282a39c8f72536e3ad834fd4d183052a879d", + "dweb:/ipfs/QmP7ww27otUvq2wKy7rewxEAu2JzD5ALwRgJhRBPNKr8EN" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/BanningStorage.sol": { + "keccak256": "0xd48969bfaf9c8bfc980981818ed96101e858652f5516567c08236ce525487492", + "urls": [ + "bzz-raw://95f1b33fb46ea8d8ed6145d4f646dca4f670712dca81ec75cab5db2dbff6e0f0", + "dweb:/ipfs/QmPfCAZF3S5ehqKoL2SBg2TEB22TKFuytDNcG8PBa7qVe1" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/banning/IBanning.sol": { + "keccak256": "0x1983a3e375f4dd8a21be759a637b85ed5e416ca8fc7109153986eb2d4b08a505", + "urls": [ + "bzz-raw://1f5f5a54e4cbaca9e10cc174ba73f5f80b0875d097084a9ebc6b259b2c4c1419", + "dweb:/ipfs/QmQSfNhhRNkiHeG1XXWVYhQtvuPRyrv72gxuARgsgupjn6" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/ChannelService.sol": { + "keccak256": "0x5459092e3b26770de949b6ce3021e3582b62602cf3a419a695da19aa1810eab7", + "urls": [ + "bzz-raw://d80a0bc5adf516cfda380ac0bc966e2f430b395b78b5aa756adc3ef0a28ae1b9", + "dweb:/ipfs/QmW2RvEFxrhFt5gxBK2Ay5BS1BgXAv37sipBPSxYBt1vfi" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/ChannelStorage.sol": { + "keccak256": "0x2c56c47bf36e703f0703ea1f2a27db2406b17d2a173d24bde6efbbfc4bab301f", + "urls": [ + "bzz-raw://0030cd42de4b20ddb33284bec5065fa4d1edb817ac7f667f845881cb66a2a3b7", + "dweb:/ipfs/QmNg6DmtqbHn4QMiMzu4yAr8G5G19HZSJ6dRteeGArsnzS" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/delegation/WalletLinkProxyBase.sol": { + "keccak256": "0xac57b39cf710166b1c2dc1f0c7bf58fb813ceb047312b346a01e31df615c14f2", + "urls": [ + "bzz-raw://e3a22fb662252a0d23980b5a8700084f1a314b60a2f537243c9a5d202105a3a5", + "dweb:/ipfs/QmXd6ibShjPAtPsyFuo7Wmai8fcbKkfbS48sAhTtXU7Yk9" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/delegation/WalletLinkProxyStorage.sol": { + "keccak256": "0xe4469f1cf8e5814c8b19b4ac664b904aa786590ece22ae7197abebe9b1bcb9ef", + "urls": [ + "bzz-raw://5a7dea70d2ebaf427c44a4934c18578ab6bdc797a2a7abd4768b86e1a63fce07", + "dweb:/ipfs/QmYqnqHFfyMdHVsM8XuAttJWeMuGePfmYL9NZx8f8bw8Ek" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/EntitlementsManagerService.sol": { + "keccak256": "0x6f40f5b41ad702ea55bf10f987b3e2b6d02ac527a66be523f06f025cead1867d", + "urls": [ + "bzz-raw://da2012c616b833c5b491735c230be707e4f9b7657b3a71d7bdf52e7c2ba128b9", + "dweb:/ipfs/Qme4864V46rozVDRWtfYqtpyzE1SzBnqYQQf3iD2rrqiPg" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol": { + "keccak256": "0xc8e97604a9fb7e2f90de70eed0299ad59bbede47563103fc4cdae8b5a90088f8", + "urls": [ + "bzz-raw://01194896393f0e77f617f02bed7da7cee5ec7a2d810a058f9c1be8c2ad99f583", + "dweb:/ipfs/QmbPtkGzBPHYKwvsM3d26MYJKLbFZ7p253pXJCe8aDzUfK" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/membership/MembershipStorage.sol": { + "keccak256": "0x026bba72193ded7f74f3f2b7c622d0b5a553f81cb85bbb6c83d5922caefb71d3", + "urls": [ + "bzz-raw://db45fd461b1779362a58059bfa92f215f6e7df5f360aeb6319ac0e14433469ee", + "dweb:/ipfs/QmQfk5dXU8xL9PGPZcgNAtMQxitVT76X176e4PWJCej4v5" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/IRoles.sol": { + "keccak256": "0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d", + "urls": [ + "bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8", + "dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/Roles.sol": { + "keccak256": "0xc941bcf9a296c108389b1c0916ca05643a89c5f466e6b3f955bbd9dde64df762", + "urls": [ + "bzz-raw://d86c333a63ffb52d23b7aa7af3711abb7501a0bddae059e5744d9ffcb1dee00b", + "dweb:/ipfs/QmZMhHACX9gD7CGrHnMZNJM8CWzfndT3rihUWQm8PYy8XD" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/RolesBase.sol": { + "keccak256": "0x2ef137dec4a5390009fd931e34fdbb4a742c96b68b40f5c152cec8cf2809ed6f", + "urls": [ + "bzz-raw://3cb29b4a780742a30ba3af5719f77a4a65ea55ebbdc3ccd9c93c86573f20c7df", + "dweb:/ipfs/QmdvPJydLCcEwCB3xk5VpET8X2GfrxC3NBUD5G6C8a9aW8" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/RolesStorage.sol": { + "keccak256": "0x40f288a613e35cbc02aceb1d23f89af888f65538853f61cc1fcd25901b9bc4af", + "urls": [ + "bzz-raw://396b5e157c9a29adc94edc5d234f416a44e6e7c4588b1aaa0587bb04018705e9", + "dweb:/ipfs/QmWDCQz555WbvZw7XxfkybE5dPfouc6rKxU5Zu1Gsuz1Zr" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/StringSet.sol": { + "keccak256": "0x3c9d29fdec8d96b627600dc69aa8e164c992162028d877df89c062da32b6e319", + "urls": [ + "bzz-raw://ab4f8ad17edac234b55f2c5b5a45a2956d82d0b64f70e04350edd879d2f0d1e6", + "dweb:/ipfs/QmeqwedjAGMjfgizTjspVi5eEojEe8S1ezJFLFafPcfAjK" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/Validator.sol": { + "keccak256": "0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50", + "urls": [ + "bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64", + "dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4", + "urls": [ + "bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7", + "dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/SpaceOwner.abi.json b/packages/generated/v3/abis/SpaceOwner.abi.json new file mode 100644 index 000000000..93524dc8b --- /dev/null +++ b/packages/generated/v3/abis/SpaceOwner.abi.json @@ -0,0 +1,1145 @@ +[ + { + "type": "function", + "name": "CLOCK_MODE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "DOMAIN_SEPARATOR", + "inputs": [], + "outputs": [ + { + "name": "result", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "__ERC721A_init", + "inputs": [ + { + "name": "name_", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol_", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__SpaceOwner_init", + "inputs": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "clock", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint48", + "internalType": "uint48" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "delegate", + "inputs": [ + { + "name": "delegatee", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegateBySig", + "inputs": [ + { + "name": "delegatee", + "type": "address", + "internalType": "address" + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "expiry", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "v", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "r", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegates", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "eip712Domain", + "inputs": [], + "outputs": [ + { + "name": "fields", + "type": "bytes1", + "internalType": "bytes1" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "verifyingContract", + "type": "address", + "internalType": "address" + }, + { + "name": "salt", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "extensions", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getApproved", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getFactory", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPastTotalSupply", + "inputs": [ + { + "name": "timepoint", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPastVotes", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "timepoint", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getSpaceInfo", + "inputs": [ + { + "name": "space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct ISpaceOwnerBase.Space", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "uri", + "type": "string", + "internalType": "string" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "createdAt", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getVotes", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isApprovedForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "mintSpace", + "inputs": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "uri", + "type": "string", + "internalType": "string" + }, + { + "name": "space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "nextTokenId", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "nonces", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "result", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ownerOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "setApprovalForAll", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setFactory", + "inputs": [ + { + "name": "factory", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenURI", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "updateSpaceInfo", + "inputs": [ + { + "name": "space", + "type": "address", + "internalType": "address" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "uri", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DelegateChanged", + "inputs": [ + { + "name": "delegator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "fromDelegate", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "toDelegate", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DelegateVotesChanged", + "inputs": [ + { + "name": "delegate", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "previousBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "newBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EIP712DomainChanged", + "inputs": [], + "anonymous": false + }, + { + "type": "event", + "name": "GuardianUpdated", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "enabled", + "type": "bool", + "indexed": true, + "internalType": "bool" + }, + { + "name": "cooldown", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "timestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SpaceOwner__SetFactory", + "inputs": [ + { + "name": "factory", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SpaceOwner__UpdateSpace", + "inputs": [ + { + "name": "space", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AlreadyDisabled", + "inputs": [] + }, + { + "type": "error", + "name": "AlreadyEnabled", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "ECDSAInvalidSignature", + "inputs": [] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureLength", + "inputs": [ + { + "name": "length", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureS", + "inputs": [ + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "GuardianEnabled", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_AlreadyInitialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "internalType": "uint32" + } + ] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidAccountNonce", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "currentNonce", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "NotExternalAccount", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "SafeCastOverflowedUintDowncast", + "inputs": [ + { + "name": "bits", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "SpaceOwner__OnlyFactoryAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "SpaceOwner__OnlySpaceOwnerAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidStringLength", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/SpaceOwner.abi.ts b/packages/generated/v3/abis/SpaceOwner.abi.ts new file mode 100644 index 000000000..765e69084 --- /dev/null +++ b/packages/generated/v3/abis/SpaceOwner.abi.ts @@ -0,0 +1,1145 @@ +export default [ + { + "type": "function", + "name": "CLOCK_MODE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "DOMAIN_SEPARATOR", + "inputs": [], + "outputs": [ + { + "name": "result", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "__ERC721A_init", + "inputs": [ + { + "name": "name_", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol_", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "__SpaceOwner_init", + "inputs": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "symbol", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "clock", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint48", + "internalType": "uint48" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "delegate", + "inputs": [ + { + "name": "delegatee", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegateBySig", + "inputs": [ + { + "name": "delegatee", + "type": "address", + "internalType": "address" + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "expiry", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "v", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "r", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegates", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "eip712Domain", + "inputs": [], + "outputs": [ + { + "name": "fields", + "type": "bytes1", + "internalType": "bytes1" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "verifyingContract", + "type": "address", + "internalType": "address" + }, + { + "name": "salt", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "extensions", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getApproved", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getFactory", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPastTotalSupply", + "inputs": [ + { + "name": "timepoint", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPastVotes", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "timepoint", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getSpaceInfo", + "inputs": [ + { + "name": "space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct ISpaceOwnerBase.Space", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "uri", + "type": "string", + "internalType": "string" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "createdAt", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getVotes", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isApprovedForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "mintSpace", + "inputs": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "uri", + "type": "string", + "internalType": "string" + }, + { + "name": "space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "nextTokenId", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "nonces", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "result", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ownerOf", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "setApprovalForAll", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setFactory", + "inputs": [ + { + "name": "factory", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenURI", + "inputs": [ + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "updateSpaceInfo", + "inputs": [ + { + "name": "space", + "type": "address", + "internalType": "address" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "uri", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ApprovalForAll", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "approved", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsecutiveTransfer", + "inputs": [ + { + "name": "fromTokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "toTokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DelegateChanged", + "inputs": [ + { + "name": "delegator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "fromDelegate", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "toDelegate", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DelegateVotesChanged", + "inputs": [ + { + "name": "delegate", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "previousBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "newBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EIP712DomainChanged", + "inputs": [], + "anonymous": false + }, + { + "type": "event", + "name": "GuardianUpdated", + "inputs": [ + { + "name": "caller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "enabled", + "type": "bool", + "indexed": true, + "internalType": "bool" + }, + { + "name": "cooldown", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "timestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SpaceOwner__SetFactory", + "inputs": [ + { + "name": "factory", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SpaceOwner__UpdateSpace", + "inputs": [ + { + "name": "space", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AlreadyDisabled", + "inputs": [] + }, + { + "type": "error", + "name": "AlreadyEnabled", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "ApprovalQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "BalanceQueryForZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "ECDSAInvalidSignature", + "inputs": [] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureLength", + "inputs": [ + { + "name": "length", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureS", + "inputs": [ + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "GuardianEnabled", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_AlreadyInitialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "internalType": "uint32" + } + ] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidAccountNonce", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "currentNonce", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "MintERC2309QuantityExceedsLimit", + "inputs": [] + }, + { + "type": "error", + "name": "MintToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "MintZeroQuantity", + "inputs": [] + }, + { + "type": "error", + "name": "NotExternalAccount", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "OwnerQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "OwnershipNotInitializedForExtraData", + "inputs": [] + }, + { + "type": "error", + "name": "SafeCastOverflowedUintDowncast", + "inputs": [ + { + "name": "bits", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "SpaceOwner__OnlyFactoryAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "SpaceOwner__OnlySpaceOwnerAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "TransferCallerNotOwnerNorApproved", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFromIncorrectOwner", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer", + "inputs": [] + }, + { + "type": "error", + "name": "TransferToZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "URIQueryForNonexistentToken", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Validator__InvalidStringLength", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/SpaceOwner.bin b/packages/generated/v3/abis/SpaceOwner.bin new file mode 100644 index 000000000..1f3dc3072 --- /dev/null +++ b/packages/generated/v3/abis/SpaceOwner.bin @@ -0,0 +1 @@ +60806040523480156200001157600080fd5b506200001c62000022565b620000ca565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16156200006f576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff9081161015620000c757805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b61394780620000da6000396000f3fe6080604052600436106101e35760003560e01c806375794a3c116101025780639ab24eb011610095578063c87b56dd11610064578063c87b56dd14610546578063d2f01f1914610566578063d7a901d314610586578063e985e9c5146105a657600080fd5b80639ab24eb0146104d3578063a22cb465146104f3578063b88d4fde14610513578063c3cda5201461052657600080fd5b80638e539e8c116100d15780638e539e8c1461045257806391ddadf41461047257806391de4a831461049e57806395d89b41146104be57600080fd5b806375794a3c146103e05780637ecebe00146103f557806384b0196e1461041557806388cc58e41461043d57600080fd5b806342842e0e1161017a5780635c19a95c116101495780635c19a95c146103535780636352211e146103735780636a9a38e61461039357806370a08231146103c057600080fd5b806342842e0e146102eb5780634bf5d7e9146102fe578063587cde1e146103135780635bb478081461033357600080fd5b806323b872dd116101b657806323b872dd146102835780633644e515146102965780633953801b146102ab5780633a46b1a8146102cb57600080fd5b806306fdde03146101e8578063081812fc14610213578063095ea7b31461024b57806318160ddd14610260575b600080fd5b3480156101f457600080fd5b506101fd6105d6565b60405161020a9190612f86565b60405180910390f35b34801561021f57600080fd5b5061023361022e366004612f99565b610671565b6040516001600160a01b03909116815260200161020a565b61025e610259366004612fce565b610682565b005b34801561026c57600080fd5b506102756106ca565b60405190815260200161020a565b61025e610291366004612ff8565b6106d9565b3480156102a257600080fd5b506102756108e9565b3480156102b757600080fd5b5061025e6102c63660046130e0565b6108f3565b3480156102d757600080fd5b506102756102e6366004612fce565b61090c565b61025e6102f9366004612ff8565b61091f565b34801561030a57600080fd5b506101fd61093a565b34801561031f57600080fd5b5061023361032e366004613154565b610944565b34801561033f57600080fd5b5061025e61034e366004613154565b61094f565b34801561035f57600080fd5b5061025e61036e366004613154565b6109ac565b34801561037f57600080fd5b5061023361038e366004612f99565b6109b6565b34801561039f57600080fd5b506103b36103ae366004613154565b6109c1565b60405161020a919061316f565b3480156103cc57600080fd5b506102756103db366004613154565b6109f5565b3480156103ec57600080fd5b50610275610a00565b34801561040157600080fd5b50610275610410366004613154565b610a0a565b34801561042157600080fd5b5061042a610a47565b60405161020a97969594939291906131c9565b34801561044957600080fd5b50610233610b0a565b34801561045e57600080fd5b5061027561046d366004612f99565b610b2b565b34801561047e57600080fd5b50610487610b36565b60405165ffffffffffff909116815260200161020a565b3480156104aa57600080fd5b506102756104b9366004613262565b610b40565b3480156104ca57600080fd5b506101fd610ba8565b3480156104df57600080fd5b506102756104ee366004613154565b610bc0565b3480156104ff57600080fd5b5061025e61050e3660046132d6565b610bcb565b61025e610521366004613312565b610c04565b34801561053257600080fd5b5061025e61054136600461338e565b610c4e565b34801561055257600080fd5b506101fd610561366004612f99565b610c5c565b34801561057257600080fd5b5061025e6105813660046133ee565b610c8d565b34801561059257600080fd5b5061025e6105a1366004613452565b610cce565b3480156105b257600080fd5b506105c66105c13660046134a1565b610db9565b604051901515815260200161020a565b60606105e0610dc5565b60020180546105ee906134d4565b80601f016020809104026020016040519081016040528092919081815260200182805461061a906134d4565b80156106675780601f1061063c57610100808354040283529160200191610667565b820191906000526020600020905b81548152906001019060200180831161064a57829003601f168201915b5050505050905090565b600061067c82610de9565b92915050565b6001600160a01b0382161580159061069e575061069e33610e36565b156106bc57604051638043dfaf60e01b815260040160405180910390fd5b6106c68282610eb2565b5050565b60006106d4610ebe565b905090565b60006106e482610edd565b9050836001600160a01b0316816001600160a01b0316146107175760405162a1148160e81b815260040160405180910390fd5b60008061072384610f78565b9150915061074881876107333390565b6001600160a01b039081169116811491141790565b610773576107568633610db9565b61077357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661079a57604051633a954ecd60e21b815260040160405180910390fd5b6107a78686866001610fa0565b80156107b257600082555b6107ba610dc5565b6001600160a01b03871660009081526005919091016020526040902080546000190190556107e6610dc5565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b1761081d610dc5565b60008681526004919091016020526040812091909155600160e11b84169003610893576001840161084c610dc5565b6000828152600491909101602052604081205490036108915761086d610dc5565b548114610891578361087d610dc5565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46108e18686866001610fdf565b505050505050565b60006106d4610fea565b6108fc83610ff4565b610907838383611031565b505050565b600061091883836110e4565b9392505050565b61090783838360405180602001604052806000815250610c04565b60606106d4611182565b600061067c8261121a565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031633146109a0576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6109a981611257565b50565b6109a933826112c1565b600061067c82610edd565b6109ec6040518060800160405280606081526020016060815260200160008152602001600081525090565b61067c8261135b565b600061067c82611519565b60006106d4611582565b6001600160a01b03811660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c00602052604081205461067c565b6000606080828080836000805160206138a783398151915254158015610a8c57507f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d54155b610ad05760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610997565b610ad8611592565b610ae06115a8565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60006106d4600080516020613887833981519152546001600160a01b031690565b600061067c826115be565b60006106d4611657565b60008060008051602061388783398151915280549091506001600160a01b03163314610b7f5760405163443e750b60e11b815260040160405180910390fd5b610b87611582565b9150610b9585858486611662565b610ba0336001611767565b509392505050565b6060610bb2610dc5565b60030180546105ee906134d4565b600061067c826118b7565b808015610bdc5750610bdc33610e36565b15610bfa57604051638043dfaf60e01b815260040160405180910390fd5b6106c682826118e5565b610c0f8484846106d9565b6001600160a01b0383163b15610c4857610c2b84848484611962565b610c48576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6108e1868686868686611a4d565b6060610c6782611b36565b610c8457604051630a14c4b560e41b815260040160405180910390fd5b61067c82611b72565b60008051602061390783398151915254600160201b900460ff16610cc457604051630ef4733760e31b815260040160405180910390fd5b6106c68282611d9e565b6000805160206139078339815191528054600160201b900460ff161580610cf857303b1515610d07565b8154600163ffffffff90911610155b15610d30578154604051630a8ef77f60e31b815263ffffffff9091166004820152602401610997565b815463ffffffff191660011782558015610d5757815464ff000000001916600160201b1782555b610d618585611d9e565b610d6b8584611dff565b8015610db257815464ff0000000019168255604051600181527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b5050505050565b60006109188383611e40565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b6000610df482611b36565b610e11576040516333d1c03960e21b815260040160405180910390fd5b610e19610dc5565b60009283526006016020525060409020546001600160a01b031690565b60007f0c89d3aad1b583c77a2e9f9fffa651b386c9c29e300bf2a8e2f3de1bb0100a006001600160a01b0383163b15801561091857506001600160a01b0383166000908152600182016020526040902054158061091857506001600160a01b038316600090815260018201602052604090205442109392505050565b6106c682826001611e7d565b600080610ec9610dc5565b60010154610ed5610dc5565b540303919050565b600080610ee8610dc5565b60008481526004820160205260408120549350909150600160e01b83169003610f5e5781600003610f585780548310610f3457604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115610f35575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b6000806000610f85610dc5565b60009485526006016020525050604090912080549092909150565b6001600160a01b03841615801590610fbc5750610fbc84610e36565b15610fda57604051638043dfaf60e01b815260040160405180910390fd5b610c48565b610fda848483611f32565b60006106d4611fd4565b3361100a6110018361135b565b604001516109b6565b6001600160a01b0316146109a95760405163dbfcf17d60e01b815260040160405180910390fd5b61103c826002612048565b611047816001612048565b6001600160a01b03831660009081527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477026020526040902060008051602061388783398151915290806110998582613550565b50600181016110a88482613550565b506040516001600160a01b038616907f66da702131703ee5e745ecf2f5b98311caa00729edd55541baad49289fc42ed890600090a25050505050565b60006110ee611657565b65ffffffffffff16821061113b5760405162461bcd60e51b81526020600482015260146024820152730566f7465733a20667574757265206c6f6f6b75760641b6044820152606401610997565b6111726111478361206c565b6001600160a01b038516600090815260008051602061392783398151915260205260409020906120a1565b6001600160e01b03169392505050565b60604361118d611657565b65ffffffffffff16146111e25760405162461bcd60e51b815260206004820152601860248201527f566f7465733a2062726f6b656e20636c6f636b206d6f646500000000000000006044820152606401610997565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6001600160a01b0390811660009081527f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f6560205260409020541690565b61126081612155565b60008051602061388783398151915280546001600160a01b0383166001600160a01b03199091168117825560408051918252517f64c14256e532eac2ec90ddc4973ed2d3f5623faf7951d90eec38f9b7812f99a79181900360200190a15050565b60006112cc8361121a565b6001600160a01b0384811660008181527f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f65602052604080822080546001600160a01b031916888616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461090781836113568661217c565b612187565b6113866040518060800160405280606081526020016060815260200160008152602001600081525090565b6001600160a01b03821660009081527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477026020526040908190208151608081019092528054600080516020613887833981519152929190829082906113e9906134d4565b80601f0160208091040260200160405190810160405280929190818152602001828054611415906134d4565b80156114625780601f1061143757610100808354040283529160200191611462565b820191906000526020600020905b81548152906001019060200180831161144557829003601f168201915b5050505050815260200160018201805461147b906134d4565b80601f01602080910402602001604051908101604052809291908181526020018280546114a7906134d4565b80156114f45780601f106114c9576101008083540402835291602001916114f4565b820191906000526020600020905b8154815290600101906020018083116114d757829003601f168201915b5050505050815260200160028201548152602001600382015481525050915050919050565b60006001600160a01b038216611542576040516323d3ad8160e21b815260040160405180910390fd5b67ffffffffffffffff611553610dc5565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b600061158c610dc5565b54919050565b60606000805160206138a78339815191526105e0565b60606000805160206138a7833981519152610bb2565b60006115c8611657565b65ffffffffffff1682106116155760405162461bcd60e51b81526020600482015260146024820152730566f7465733a20667574757265206c6f6f6b75760641b6044820152606401610997565b6116486116218361206c565b7f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f67906120a1565b6001600160e01b031692915050565b60006106d443612308565b61166d846002612048565b611678836000612048565b61168181612155565b60008281527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477016020908152604080832080546001600160a01b0319166001600160a01b03861690811790915581516080810183528881528084018890528083018790524260608201529084527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe5747702909252909120815160008051602061388783398151915292919081906117349082613550565b50602082015160018201906117499082613550565b50604082015160028201556060909101516003909101555050505050565b6000611771610dc5565b54905060008290036117965760405163b562e8dd60e01b815260040160405180910390fd5b6117a36000848385610fa0565b6801000000000000000182026117b7610dc5565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b17176117f2610dc5565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461187c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611844565b508160000361189d57604051622e076360e81b815260040160405180910390fd5b806118a6610dc5565b555061090790506000848385610fdf565b6001600160a01b0381166000908152600080516020613927833981519152602052604081206116489061233b565b806118ee610dc5565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611997903390899088908890600401613610565b6020604051808303816000875af19250505080156119d2575060408051601f3d908101601f191682019092526119cf9181019061364d565b60015b611a30573d808015611a00576040519150601f19603f3d011682016040523d82523d6000602084013e611a05565b606091505b508051600003611a28576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b83421115611a9d5760405162461bcd60e51b815260206004820152601860248201527f566f7465733a207369676e6174757265206578706972656400000000000000006044820152606401610997565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090611b1790611b0f9060a00160405160208183030381529060405280519060200120612374565b8585856123a1565b9050611b2381876123cf565b611b2d81886112c1565b50505050505050565b6000611b40610dc5565b548210801561067c5750600160e01b611b57610dc5565b60008481526004919091016020526040902054161592915050565b60008181527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477016020526040902054606090600080516020613887833981519152906001600160a01b031680611bd857505060408051602081019091526000815292915050565b6001600160a01b0381166000908152600283016020526040808220815160808101909252805482908290611c0b906134d4565b80601f0160208091040260200160405190810160405280929190818152602001828054611c37906134d4565b8015611c845780601f10611c5957610100808354040283529160200191611c84565b820191906000526020600020905b815481529060010190602001808311611c6757829003601f168201915b50505050508152602001600182018054611c9d906134d4565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc9906134d4565b8015611d165780601f10611ceb57610100808354040283529160200191611d16565b820191906000526020600020905b815481529060010190602001808311611cf957829003601f168201915b50505050508152602001600282015481526020016003820154815250509050611d7581600001518260200151611d4f8460600151612441565b604051602001611d6193929190613677565b6040516020818303038152906040526124d4565b604051602001611d859190613759565b6040516020818303038152906040529350505050919050565b60008051602061390783398151915254600160201b900460ff16611dd557604051630ef4733760e31b815260040160405180910390fd5b611de56380ac58cd60e01b612639565b611df5635b5e139f60e01b612639565b6106c68282612717565b60008051602061390783398151915254600160201b900460ff16611e3657604051630ef4733760e31b815260040160405180910390fd5b6106c68282612749565b6000611e4a610dc5565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b6000611e88836109b6565b90508115611ec757336001600160a01b03821614611ec757611eaa8133611e40565b611ec7576040516367d9dca160e11b815260040160405180910390fd5b83611ed0610dc5565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b6001600160a01b038316611f7857611f757f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f676127db611f70846127e7565b61281b565b50505b6001600160a01b038216611fb957611fb67f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f67612864611f70846127e7565b50505b610907611fc58461121a565b611fce8461121a565b83612187565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611fff612870565b6120076128d6565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b81518290821115610907576040516374eb20a760e01b815260040160405180910390fd5b600063ffffffff82111561209d576040516306dfcc6560e41b81526020600482015260248101839052604401610997565b5090565b8154600090818160058111156120fe5760006120bc84612926565b6120c690856137b4565b60008881526020902090915081015463ffffffff90811690871610156120ee578091506120fc565b6120f98160016137c7565b92505b505b600061210c87878585612a0e565b9050801561214757612131876121236001846137b4565b600091825260209091200190565b54600160201b90046001600160e01b031661214a565b60005b979650505050505050565b6001600160a01b0381166109a9576040516302e47d1560e41b815260040160405180910390fd5b600061067c826109f5565b816001600160a01b0316836001600160a01b0316141580156121a95750600081115b15610907576001600160a01b03831615612259576001600160a01b03831660009081526000805160206139278339815191526020526040812081906121f490612864611f70866127e7565b6001600160e01b031691506001600160e01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161224e929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610907576001600160a01b038216600090815260008051602061392783398151915260205260408120819061229f906127db611f70866127e7565b6001600160e01b031691506001600160e01b03169150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516122f9929190918252602082015260400190565b60405180910390a25050505050565b600065ffffffffffff82111561209d576040516306dfcc6560e41b81526030600482015260248101839052604401610997565b8054600090801561236b57612355836121236001846137b4565b54600160201b90046001600160e01b0316610918565b60009392505050565b600061067c612381610fea565b8360405161190160f01b8152600281019290925260228201526042902090565b6000806000806123b388888888612a64565b9250925092506123c38282612b33565b50909695505050505050565b6001600160a01b03821660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c0060205260409020805460018101909155818114610907576040516301d4b62360e61b81526001600160a01b038416600482015260248101829052604401610997565b6060600061244e83612bec565b600101905060008167ffffffffffffffff81111561246e5761246e613034565b6040519080825280601f01601f191660200182016040528015612498576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846124a257509392505050565b606081516000036124f357505060408051602081019091526000815290565b60006040518060600160405280604081526020016138c7604091399050600060038451600261252291906137c7565b61252c91906137f0565b612537906004613812565b905060006125468260206137c7565b67ffffffffffffffff81111561255e5761255e613034565b6040519080825280601f01601f191660200182016040528015612588576020820181803683370190505b509050818152600183018586518101602084015b818310156125f4576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182535060010161259c565b60038951066001811461260e576002811461261f5761262b565b613d3d60f01b60011983015261262b565b603d60f81b6000198301525b509398975050505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146126c6576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff191660011790556126df565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6000612721610dc5565b9050600281016127318482613550565b50600381016127408382613550565b50600090555050565b7f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336e6127748382613550565b507f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336f6127a08282613550565b505060006000805160206138a78339815191528190557f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d5550565b60006109188284613829565b60006001600160e01b0382111561209d576040516306dfcc6560e41b815260e0600482015260248101839052604401610997565b60008061285761283961282c611657565b65ffffffffffff1661206c565b61284f6128458861233b565b868863ffffffff16565b879190612cc4565b915091505b935093915050565b60006109188284613850565b60008061287b611592565b805190915015612892578051602090910120919050565b6000805160206138a78339815191525480156128ae5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b6000806128e16115a8565b8051909150156128f8578051602090910120919050565b7f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d5480156128ae5792915050565b60008160000361293857506000919050565b6000600161294584612cd2565b901c6001901b9050600181848161295e5761295e6137da565b048201901c90506001818481612976576129766137da565b048201901c9050600181848161298e5761298e6137da565b048201901c905060018184816129a6576129a66137da565b048201901c905060018184816129be576129be6137da565b048201901c905060018184816129d6576129d66137da565b048201901c905060018184816129ee576129ee6137da565b048201901c905061091881828581612a0857612a086137da565b04612d66565b60005b81831015610ba0576000612a258484612d7c565b60008781526020902090915063ffffffff86169082015463ffffffff161115612a5057809250612a5e565b612a5b8160016137c7565b93505b50612a11565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612a9f5750600091506003905082612b29565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612af3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612b1f57506000925060019150829050612b29565b9250600091508190505b9450945094915050565b6000826003811115612b4757612b47613870565b03612b50575050565b6001826003811115612b6457612b64613870565b03612b825760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115612b9657612b96613870565b03612bb75760405163fce698f760e01b815260048101829052602401610997565b6003826003811115612bcb57612bcb613870565b036106c6576040516335e2f38360e21b815260048101829052602401610997565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612c2b5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612c57576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612c7557662386f26fc10000830492506010015b6305f5e1008310612c8d576305f5e100830492506008015b6127108310612ca157612710830492506004015b60648310612cb3576064830492506002015b600a831061067c5760010192915050565b600080612857858585612d97565b600080608083901c15612ce757608092831c92015b604083901c15612cf957604092831c92015b602083901c15612d0b57602092831c92015b601083901c15612d1d57601092831c92015b600883901c15612d2f57600892831c92015b600483901c15612d4157600492831c92015b600283901c15612d5357600292831c92015b600183901c1561067c5760010192915050565b6000818310612d755781610918565b5090919050565b6000612d8b60028484186137f0565b610918908484166137c7565b825460009081908015612edd576000612db5876121236001856137b4565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b031660208401529192509087161015612e365760405162461bcd60e51b815260206004820152601b60248201527f436865636b706f696e743a2064656372656173696e67206b65797300000000006044820152606401610997565b805163ffffffff808816911603612e7e5784612e57886121236001866137b4565b80546001600160e01b0392909216600160201b0263ffffffff909216919091179055612ecd565b6040805180820190915263ffffffff80881682526001600160e01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216600160201b029216919091179101555b60200151925083915061285c9050565b50506040805180820190915263ffffffff80851682526001600160e01b0380851660208085019182528854600181018a5560008a815291822095519251909316600160201b02919093161792019190915590508161285c565b60005b83811015612f51578181015183820152602001612f39565b50506000910152565b60008151808452612f72816020860160208601612f36565b601f01601f19169290920160200192915050565b6020815260006109186020830184612f5a565b600060208284031215612fab57600080fd5b5035919050565b80356001600160a01b0381168114612fc957600080fd5b919050565b60008060408385031215612fe157600080fd5b612fea83612fb2565b946020939093013593505050565b60008060006060848603121561300d57600080fd5b61301684612fb2565b925061302460208501612fb2565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561306557613065613034565b604051601f8501601f19908116603f0116810190828211818310171561308d5761308d613034565b816040528093508581528686860111156130a657600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126130d157600080fd5b6109188383356020850161304a565b6000806000606084860312156130f557600080fd5b6130fe84612fb2565b9250602084013567ffffffffffffffff8082111561311b57600080fd5b613127878388016130c0565b9350604086013591508082111561313d57600080fd5b5061314a868287016130c0565b9150509250925092565b60006020828403121561316657600080fd5b61091882612fb2565b60208152600082516080602084015261318b60a0840182612f5a565b90506020840151601f198483030160408501526131a88282612f5a565b91505060408401516060840152606084015160808401528091505092915050565b60ff60f81b881681526000602060e060208401526131ea60e084018a612f5a565b83810360408501526131fc818a612f5a565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b8181101561325057835183529284019291840191600101613234565b50909c9b505050505050505050505050565b60008060006060848603121561327757600080fd5b833567ffffffffffffffff8082111561328f57600080fd5b61329b878388016130c0565b945060208601359150808211156132b157600080fd5b506132be868287016130c0565b9250506132cd60408501612fb2565b90509250925092565b600080604083850312156132e957600080fd5b6132f283612fb2565b91506020830135801515811461330757600080fd5b809150509250929050565b6000806000806080858703121561332857600080fd5b61333185612fb2565b935061333f60208601612fb2565b925060408501359150606085013567ffffffffffffffff81111561336257600080fd5b8501601f8101871361337357600080fd5b6133828782356020840161304a565b91505092959194509250565b60008060008060008060c087890312156133a757600080fd5b6133b087612fb2565b95506020870135945060408701359350606087013560ff811681146133d457600080fd5b9598949750929560808101359460a0909101359350915050565b6000806040838503121561340157600080fd5b823567ffffffffffffffff8082111561341957600080fd5b613425868387016130c0565b9350602085013591508082111561343b57600080fd5b50613448858286016130c0565b9150509250929050565b60008060006060848603121561346757600080fd5b833567ffffffffffffffff8082111561347f57600080fd5b61348b878388016130c0565b9450602086013591508082111561311b57600080fd5b600080604083850312156134b457600080fd5b6134bd83612fb2565b91506134cb60208401612fb2565b90509250929050565b600181811c908216806134e857607f821691505b602082108103610f5857634e487b7160e01b600052602260045260246000fd5b601f821115610907576000816000526020600020601f850160051c810160208610156135315750805b601f850160051c820191505b818110156108e15782815560010161353d565b815167ffffffffffffffff81111561356a5761356a613034565b61357e8161357884546134d4565b84613508565b602080601f8311600181146135b3576000841561359b5750858301515b600019600386901b1c1916600185901b1785556108e1565b600085815260208120601f198616915b828110156135e2578886015182559484019460019091019084016135c3565b50858210156136005787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061364390830184612f5a565b9695505050505050565b60006020828403121561365f57600080fd5b81516001600160e01b03198116811461091857600080fd5b683d913730b6b2911d1160b91b8152835160009061369c816009850160208901612f36565b6a11161134b6b0b3b2911d1160a91b60099184019182015284516136c7816014840160208901612f36565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a2243601492909101918201527f726561746564222c22646973706c61795f74797065223a202264617465222c20603482015267113b30b63ab2911d60c11b6054820152835161373c81605c840160208801612f36565b627d5d7d60e81b605c9290910191820152605f0195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161379181601d850160208701612f36565b91909101601d0192915050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561067c5761067c61379e565b8082018082111561067c5761067c61379e565b634e487b7160e01b600052601260045260246000fd5b60008261380d57634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761067c5761067c61379e565b6001600160e01b038181168382160190808211156138495761384961379e565b5092915050565b6001600160e01b038281168282160390808211156138495761384961379e565b634e487b7160e01b600052602160045260246000fdfe7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477003a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336c4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef52000423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f66 \ No newline at end of file diff --git a/packages/generated/v3/abis/SpaceOwner.json b/packages/generated/v3/abis/SpaceOwner.json new file mode 100644 index 000000000..66afc57f6 --- /dev/null +++ b/packages/generated/v3/abis/SpaceOwner.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"CLOCK_MODE","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"DOMAIN_SEPARATOR","inputs":[],"outputs":[{"name":"result","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"__ERC721A_init","inputs":[{"name":"name_","type":"string","internalType":"string"},{"name":"symbol_","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"__SpaceOwner_init","inputs":[{"name":"name","type":"string","internalType":"string"},{"name":"symbol","type":"string","internalType":"string"},{"name":"version","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"approve","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"balanceOf","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"clock","inputs":[],"outputs":[{"name":"","type":"uint48","internalType":"uint48"}],"stateMutability":"view"},{"type":"function","name":"delegate","inputs":[{"name":"delegatee","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"delegateBySig","inputs":[{"name":"delegatee","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"expiry","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"delegates","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"eip712Domain","inputs":[],"outputs":[{"name":"fields","type":"bytes1","internalType":"bytes1"},{"name":"name","type":"string","internalType":"string"},{"name":"version","type":"string","internalType":"string"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"verifyingContract","type":"address","internalType":"address"},{"name":"salt","type":"bytes32","internalType":"bytes32"},{"name":"extensions","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"getApproved","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getFactory","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getPastTotalSupply","inputs":[{"name":"timepoint","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getPastVotes","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"timepoint","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getSpaceInfo","inputs":[{"name":"space","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","internalType":"struct ISpaceOwnerBase.Space","components":[{"name":"name","type":"string","internalType":"string"},{"name":"uri","type":"string","internalType":"string"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"createdAt","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"getVotes","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"isApprovedForAll","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"mintSpace","inputs":[{"name":"name","type":"string","internalType":"string"},{"name":"uri","type":"string","internalType":"string"},{"name":"space","type":"address","internalType":"address"}],"outputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"nextTokenId","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"nonces","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"result","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"ownerOf","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"safeTransferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"setApprovalForAll","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setFactory","inputs":[{"name":"factory","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"tokenURI","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"updateSpaceInfo","inputs":[{"name":"space","type":"address","internalType":"address"},{"name":"name","type":"string","internalType":"string"},{"name":"uri","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"ConsecutiveTransfer","inputs":[{"name":"fromTokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"toTokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"DelegateChanged","inputs":[{"name":"delegator","type":"address","indexed":true,"internalType":"address"},{"name":"fromDelegate","type":"address","indexed":true,"internalType":"address"},{"name":"toDelegate","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"DelegateVotesChanged","inputs":[{"name":"delegate","type":"address","indexed":true,"internalType":"address"},{"name":"previousBalance","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newBalance","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"EIP712DomainChanged","inputs":[],"anonymous":false},{"type":"event","name":"GuardianUpdated","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"enabled","type":"bool","indexed":true,"internalType":"bool"},{"name":"cooldown","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"SpaceOwner__SetFactory","inputs":[{"name":"factory","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"SpaceOwner__UpdateSpace","inputs":[{"name":"space","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"AlreadyDisabled","inputs":[]},{"type":"error","name":"AlreadyEnabled","inputs":[]},{"type":"error","name":"ApprovalCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"ApprovalQueryForNonexistentToken","inputs":[]},{"type":"error","name":"BalanceQueryForZeroAddress","inputs":[]},{"type":"error","name":"ECDSAInvalidSignature","inputs":[]},{"type":"error","name":"ECDSAInvalidSignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ECDSAInvalidSignatureS","inputs":[{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"GuardianEnabled","inputs":[]},{"type":"error","name":"Initializable_AlreadyInitialized","inputs":[{"name":"version","type":"uint32","internalType":"uint32"}]},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"InvalidAccountNonce","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"currentNonce","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"MintERC2309QuantityExceedsLimit","inputs":[]},{"type":"error","name":"MintToZeroAddress","inputs":[]},{"type":"error","name":"MintZeroQuantity","inputs":[]},{"type":"error","name":"NotExternalAccount","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]},{"type":"error","name":"OwnerQueryForNonexistentToken","inputs":[]},{"type":"error","name":"OwnershipNotInitializedForExtraData","inputs":[]},{"type":"error","name":"SafeCastOverflowedUintDowncast","inputs":[{"name":"bits","type":"uint8","internalType":"uint8"},{"name":"value","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"SpaceOwner__OnlyFactoryAllowed","inputs":[]},{"type":"error","name":"SpaceOwner__OnlySpaceOwnerAllowed","inputs":[]},{"type":"error","name":"TransferCallerNotOwnerNorApproved","inputs":[]},{"type":"error","name":"TransferFromIncorrectOwner","inputs":[]},{"type":"error","name":"TransferToNonERC721ReceiverImplementer","inputs":[]},{"type":"error","name":"TransferToZeroAddress","inputs":[]},{"type":"error","name":"URIQueryForNonexistentToken","inputs":[]},{"type":"error","name":"Validator__InvalidAddress","inputs":[]},{"type":"error","name":"Validator__InvalidStringLength","inputs":[]}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b506200001c62000022565b620000ca565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16156200006f576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff9081161015620000c757805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b61394780620000da6000396000f3fe6080604052600436106101e35760003560e01c806375794a3c116101025780639ab24eb011610095578063c87b56dd11610064578063c87b56dd14610546578063d2f01f1914610566578063d7a901d314610586578063e985e9c5146105a657600080fd5b80639ab24eb0146104d3578063a22cb465146104f3578063b88d4fde14610513578063c3cda5201461052657600080fd5b80638e539e8c116100d15780638e539e8c1461045257806391ddadf41461047257806391de4a831461049e57806395d89b41146104be57600080fd5b806375794a3c146103e05780637ecebe00146103f557806384b0196e1461041557806388cc58e41461043d57600080fd5b806342842e0e1161017a5780635c19a95c116101495780635c19a95c146103535780636352211e146103735780636a9a38e61461039357806370a08231146103c057600080fd5b806342842e0e146102eb5780634bf5d7e9146102fe578063587cde1e146103135780635bb478081461033357600080fd5b806323b872dd116101b657806323b872dd146102835780633644e515146102965780633953801b146102ab5780633a46b1a8146102cb57600080fd5b806306fdde03146101e8578063081812fc14610213578063095ea7b31461024b57806318160ddd14610260575b600080fd5b3480156101f457600080fd5b506101fd6105d6565b60405161020a9190612f86565b60405180910390f35b34801561021f57600080fd5b5061023361022e366004612f99565b610671565b6040516001600160a01b03909116815260200161020a565b61025e610259366004612fce565b610682565b005b34801561026c57600080fd5b506102756106ca565b60405190815260200161020a565b61025e610291366004612ff8565b6106d9565b3480156102a257600080fd5b506102756108e9565b3480156102b757600080fd5b5061025e6102c63660046130e0565b6108f3565b3480156102d757600080fd5b506102756102e6366004612fce565b61090c565b61025e6102f9366004612ff8565b61091f565b34801561030a57600080fd5b506101fd61093a565b34801561031f57600080fd5b5061023361032e366004613154565b610944565b34801561033f57600080fd5b5061025e61034e366004613154565b61094f565b34801561035f57600080fd5b5061025e61036e366004613154565b6109ac565b34801561037f57600080fd5b5061023361038e366004612f99565b6109b6565b34801561039f57600080fd5b506103b36103ae366004613154565b6109c1565b60405161020a919061316f565b3480156103cc57600080fd5b506102756103db366004613154565b6109f5565b3480156103ec57600080fd5b50610275610a00565b34801561040157600080fd5b50610275610410366004613154565b610a0a565b34801561042157600080fd5b5061042a610a47565b60405161020a97969594939291906131c9565b34801561044957600080fd5b50610233610b0a565b34801561045e57600080fd5b5061027561046d366004612f99565b610b2b565b34801561047e57600080fd5b50610487610b36565b60405165ffffffffffff909116815260200161020a565b3480156104aa57600080fd5b506102756104b9366004613262565b610b40565b3480156104ca57600080fd5b506101fd610ba8565b3480156104df57600080fd5b506102756104ee366004613154565b610bc0565b3480156104ff57600080fd5b5061025e61050e3660046132d6565b610bcb565b61025e610521366004613312565b610c04565b34801561053257600080fd5b5061025e61054136600461338e565b610c4e565b34801561055257600080fd5b506101fd610561366004612f99565b610c5c565b34801561057257600080fd5b5061025e6105813660046133ee565b610c8d565b34801561059257600080fd5b5061025e6105a1366004613452565b610cce565b3480156105b257600080fd5b506105c66105c13660046134a1565b610db9565b604051901515815260200161020a565b60606105e0610dc5565b60020180546105ee906134d4565b80601f016020809104026020016040519081016040528092919081815260200182805461061a906134d4565b80156106675780601f1061063c57610100808354040283529160200191610667565b820191906000526020600020905b81548152906001019060200180831161064a57829003601f168201915b5050505050905090565b600061067c82610de9565b92915050565b6001600160a01b0382161580159061069e575061069e33610e36565b156106bc57604051638043dfaf60e01b815260040160405180910390fd5b6106c68282610eb2565b5050565b60006106d4610ebe565b905090565b60006106e482610edd565b9050836001600160a01b0316816001600160a01b0316146107175760405162a1148160e81b815260040160405180910390fd5b60008061072384610f78565b9150915061074881876107333390565b6001600160a01b039081169116811491141790565b610773576107568633610db9565b61077357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661079a57604051633a954ecd60e21b815260040160405180910390fd5b6107a78686866001610fa0565b80156107b257600082555b6107ba610dc5565b6001600160a01b03871660009081526005919091016020526040902080546000190190556107e6610dc5565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b1761081d610dc5565b60008681526004919091016020526040812091909155600160e11b84169003610893576001840161084c610dc5565b6000828152600491909101602052604081205490036108915761086d610dc5565b548114610891578361087d610dc5565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46108e18686866001610fdf565b505050505050565b60006106d4610fea565b6108fc83610ff4565b610907838383611031565b505050565b600061091883836110e4565b9392505050565b61090783838360405180602001604052806000815250610c04565b60606106d4611182565b600061067c8261121a565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031633146109a0576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6109a981611257565b50565b6109a933826112c1565b600061067c82610edd565b6109ec6040518060800160405280606081526020016060815260200160008152602001600081525090565b61067c8261135b565b600061067c82611519565b60006106d4611582565b6001600160a01b03811660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c00602052604081205461067c565b6000606080828080836000805160206138a783398151915254158015610a8c57507f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d54155b610ad05760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610997565b610ad8611592565b610ae06115a8565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60006106d4600080516020613887833981519152546001600160a01b031690565b600061067c826115be565b60006106d4611657565b60008060008051602061388783398151915280549091506001600160a01b03163314610b7f5760405163443e750b60e11b815260040160405180910390fd5b610b87611582565b9150610b9585858486611662565b610ba0336001611767565b509392505050565b6060610bb2610dc5565b60030180546105ee906134d4565b600061067c826118b7565b808015610bdc5750610bdc33610e36565b15610bfa57604051638043dfaf60e01b815260040160405180910390fd5b6106c682826118e5565b610c0f8484846106d9565b6001600160a01b0383163b15610c4857610c2b84848484611962565b610c48576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6108e1868686868686611a4d565b6060610c6782611b36565b610c8457604051630a14c4b560e41b815260040160405180910390fd5b61067c82611b72565b60008051602061390783398151915254600160201b900460ff16610cc457604051630ef4733760e31b815260040160405180910390fd5b6106c68282611d9e565b6000805160206139078339815191528054600160201b900460ff161580610cf857303b1515610d07565b8154600163ffffffff90911610155b15610d30578154604051630a8ef77f60e31b815263ffffffff9091166004820152602401610997565b815463ffffffff191660011782558015610d5757815464ff000000001916600160201b1782555b610d618585611d9e565b610d6b8584611dff565b8015610db257815464ff0000000019168255604051600181527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b5050505050565b60006109188383611e40565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b6000610df482611b36565b610e11576040516333d1c03960e21b815260040160405180910390fd5b610e19610dc5565b60009283526006016020525060409020546001600160a01b031690565b60007f0c89d3aad1b583c77a2e9f9fffa651b386c9c29e300bf2a8e2f3de1bb0100a006001600160a01b0383163b15801561091857506001600160a01b0383166000908152600182016020526040902054158061091857506001600160a01b038316600090815260018201602052604090205442109392505050565b6106c682826001611e7d565b600080610ec9610dc5565b60010154610ed5610dc5565b540303919050565b600080610ee8610dc5565b60008481526004820160205260408120549350909150600160e01b83169003610f5e5781600003610f585780548310610f3457604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115610f35575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b6000806000610f85610dc5565b60009485526006016020525050604090912080549092909150565b6001600160a01b03841615801590610fbc5750610fbc84610e36565b15610fda57604051638043dfaf60e01b815260040160405180910390fd5b610c48565b610fda848483611f32565b60006106d4611fd4565b3361100a6110018361135b565b604001516109b6565b6001600160a01b0316146109a95760405163dbfcf17d60e01b815260040160405180910390fd5b61103c826002612048565b611047816001612048565b6001600160a01b03831660009081527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477026020526040902060008051602061388783398151915290806110998582613550565b50600181016110a88482613550565b506040516001600160a01b038616907f66da702131703ee5e745ecf2f5b98311caa00729edd55541baad49289fc42ed890600090a25050505050565b60006110ee611657565b65ffffffffffff16821061113b5760405162461bcd60e51b81526020600482015260146024820152730566f7465733a20667574757265206c6f6f6b75760641b6044820152606401610997565b6111726111478361206c565b6001600160a01b038516600090815260008051602061392783398151915260205260409020906120a1565b6001600160e01b03169392505050565b60604361118d611657565b65ffffffffffff16146111e25760405162461bcd60e51b815260206004820152601860248201527f566f7465733a2062726f6b656e20636c6f636b206d6f646500000000000000006044820152606401610997565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6001600160a01b0390811660009081527f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f6560205260409020541690565b61126081612155565b60008051602061388783398151915280546001600160a01b0383166001600160a01b03199091168117825560408051918252517f64c14256e532eac2ec90ddc4973ed2d3f5623faf7951d90eec38f9b7812f99a79181900360200190a15050565b60006112cc8361121a565b6001600160a01b0384811660008181527f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f65602052604080822080546001600160a01b031916888616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461090781836113568661217c565b612187565b6113866040518060800160405280606081526020016060815260200160008152602001600081525090565b6001600160a01b03821660009081527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477026020526040908190208151608081019092528054600080516020613887833981519152929190829082906113e9906134d4565b80601f0160208091040260200160405190810160405280929190818152602001828054611415906134d4565b80156114625780601f1061143757610100808354040283529160200191611462565b820191906000526020600020905b81548152906001019060200180831161144557829003601f168201915b5050505050815260200160018201805461147b906134d4565b80601f01602080910402602001604051908101604052809291908181526020018280546114a7906134d4565b80156114f45780601f106114c9576101008083540402835291602001916114f4565b820191906000526020600020905b8154815290600101906020018083116114d757829003601f168201915b5050505050815260200160028201548152602001600382015481525050915050919050565b60006001600160a01b038216611542576040516323d3ad8160e21b815260040160405180910390fd5b67ffffffffffffffff611553610dc5565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b600061158c610dc5565b54919050565b60606000805160206138a78339815191526105e0565b60606000805160206138a7833981519152610bb2565b60006115c8611657565b65ffffffffffff1682106116155760405162461bcd60e51b81526020600482015260146024820152730566f7465733a20667574757265206c6f6f6b75760641b6044820152606401610997565b6116486116218361206c565b7f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f67906120a1565b6001600160e01b031692915050565b60006106d443612308565b61166d846002612048565b611678836000612048565b61168181612155565b60008281527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477016020908152604080832080546001600160a01b0319166001600160a01b03861690811790915581516080810183528881528084018890528083018790524260608201529084527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe5747702909252909120815160008051602061388783398151915292919081906117349082613550565b50602082015160018201906117499082613550565b50604082015160028201556060909101516003909101555050505050565b6000611771610dc5565b54905060008290036117965760405163b562e8dd60e01b815260040160405180910390fd5b6117a36000848385610fa0565b6801000000000000000182026117b7610dc5565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b17176117f2610dc5565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461187c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611844565b508160000361189d57604051622e076360e81b815260040160405180910390fd5b806118a6610dc5565b555061090790506000848385610fdf565b6001600160a01b0381166000908152600080516020613927833981519152602052604081206116489061233b565b806118ee610dc5565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611997903390899088908890600401613610565b6020604051808303816000875af19250505080156119d2575060408051601f3d908101601f191682019092526119cf9181019061364d565b60015b611a30573d808015611a00576040519150601f19603f3d011682016040523d82523d6000602084013e611a05565b606091505b508051600003611a28576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b83421115611a9d5760405162461bcd60e51b815260206004820152601860248201527f566f7465733a207369676e6174757265206578706972656400000000000000006044820152606401610997565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090611b1790611b0f9060a00160405160208183030381529060405280519060200120612374565b8585856123a1565b9050611b2381876123cf565b611b2d81886112c1565b50505050505050565b6000611b40610dc5565b548210801561067c5750600160e01b611b57610dc5565b60008481526004919091016020526040902054161592915050565b60008181527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477016020526040902054606090600080516020613887833981519152906001600160a01b031680611bd857505060408051602081019091526000815292915050565b6001600160a01b0381166000908152600283016020526040808220815160808101909252805482908290611c0b906134d4565b80601f0160208091040260200160405190810160405280929190818152602001828054611c37906134d4565b8015611c845780601f10611c5957610100808354040283529160200191611c84565b820191906000526020600020905b815481529060010190602001808311611c6757829003601f168201915b50505050508152602001600182018054611c9d906134d4565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc9906134d4565b8015611d165780601f10611ceb57610100808354040283529160200191611d16565b820191906000526020600020905b815481529060010190602001808311611cf957829003601f168201915b50505050508152602001600282015481526020016003820154815250509050611d7581600001518260200151611d4f8460600151612441565b604051602001611d6193929190613677565b6040516020818303038152906040526124d4565b604051602001611d859190613759565b6040516020818303038152906040529350505050919050565b60008051602061390783398151915254600160201b900460ff16611dd557604051630ef4733760e31b815260040160405180910390fd5b611de56380ac58cd60e01b612639565b611df5635b5e139f60e01b612639565b6106c68282612717565b60008051602061390783398151915254600160201b900460ff16611e3657604051630ef4733760e31b815260040160405180910390fd5b6106c68282612749565b6000611e4a610dc5565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b6000611e88836109b6565b90508115611ec757336001600160a01b03821614611ec757611eaa8133611e40565b611ec7576040516367d9dca160e11b815260040160405180910390fd5b83611ed0610dc5565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b6001600160a01b038316611f7857611f757f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f676127db611f70846127e7565b61281b565b50505b6001600160a01b038216611fb957611fb67f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f67612864611f70846127e7565b50505b610907611fc58461121a565b611fce8461121a565b83612187565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611fff612870565b6120076128d6565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b81518290821115610907576040516374eb20a760e01b815260040160405180910390fd5b600063ffffffff82111561209d576040516306dfcc6560e41b81526020600482015260248101839052604401610997565b5090565b8154600090818160058111156120fe5760006120bc84612926565b6120c690856137b4565b60008881526020902090915081015463ffffffff90811690871610156120ee578091506120fc565b6120f98160016137c7565b92505b505b600061210c87878585612a0e565b9050801561214757612131876121236001846137b4565b600091825260209091200190565b54600160201b90046001600160e01b031661214a565b60005b979650505050505050565b6001600160a01b0381166109a9576040516302e47d1560e41b815260040160405180910390fd5b600061067c826109f5565b816001600160a01b0316836001600160a01b0316141580156121a95750600081115b15610907576001600160a01b03831615612259576001600160a01b03831660009081526000805160206139278339815191526020526040812081906121f490612864611f70866127e7565b6001600160e01b031691506001600160e01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161224e929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610907576001600160a01b038216600090815260008051602061392783398151915260205260408120819061229f906127db611f70866127e7565b6001600160e01b031691506001600160e01b03169150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516122f9929190918252602082015260400190565b60405180910390a25050505050565b600065ffffffffffff82111561209d576040516306dfcc6560e41b81526030600482015260248101839052604401610997565b8054600090801561236b57612355836121236001846137b4565b54600160201b90046001600160e01b0316610918565b60009392505050565b600061067c612381610fea565b8360405161190160f01b8152600281019290925260228201526042902090565b6000806000806123b388888888612a64565b9250925092506123c38282612b33565b50909695505050505050565b6001600160a01b03821660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c0060205260409020805460018101909155818114610907576040516301d4b62360e61b81526001600160a01b038416600482015260248101829052604401610997565b6060600061244e83612bec565b600101905060008167ffffffffffffffff81111561246e5761246e613034565b6040519080825280601f01601f191660200182016040528015612498576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846124a257509392505050565b606081516000036124f357505060408051602081019091526000815290565b60006040518060600160405280604081526020016138c7604091399050600060038451600261252291906137c7565b61252c91906137f0565b612537906004613812565b905060006125468260206137c7565b67ffffffffffffffff81111561255e5761255e613034565b6040519080825280601f01601f191660200182016040528015612588576020820181803683370190505b509050818152600183018586518101602084015b818310156125f4576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182535060010161259c565b60038951066001811461260e576002811461261f5761262b565b613d3d60f01b60011983015261262b565b603d60f81b6000198301525b509398975050505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146126c6576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff191660011790556126df565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6000612721610dc5565b9050600281016127318482613550565b50600381016127408382613550565b50600090555050565b7f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336e6127748382613550565b507f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336f6127a08282613550565b505060006000805160206138a78339815191528190557f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d5550565b60006109188284613829565b60006001600160e01b0382111561209d576040516306dfcc6560e41b815260e0600482015260248101839052604401610997565b60008061285761283961282c611657565b65ffffffffffff1661206c565b61284f6128458861233b565b868863ffffffff16565b879190612cc4565b915091505b935093915050565b60006109188284613850565b60008061287b611592565b805190915015612892578051602090910120919050565b6000805160206138a78339815191525480156128ae5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b6000806128e16115a8565b8051909150156128f8578051602090910120919050565b7f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d5480156128ae5792915050565b60008160000361293857506000919050565b6000600161294584612cd2565b901c6001901b9050600181848161295e5761295e6137da565b048201901c90506001818481612976576129766137da565b048201901c9050600181848161298e5761298e6137da565b048201901c905060018184816129a6576129a66137da565b048201901c905060018184816129be576129be6137da565b048201901c905060018184816129d6576129d66137da565b048201901c905060018184816129ee576129ee6137da565b048201901c905061091881828581612a0857612a086137da565b04612d66565b60005b81831015610ba0576000612a258484612d7c565b60008781526020902090915063ffffffff86169082015463ffffffff161115612a5057809250612a5e565b612a5b8160016137c7565b93505b50612a11565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612a9f5750600091506003905082612b29565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612af3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612b1f57506000925060019150829050612b29565b9250600091508190505b9450945094915050565b6000826003811115612b4757612b47613870565b03612b50575050565b6001826003811115612b6457612b64613870565b03612b825760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115612b9657612b96613870565b03612bb75760405163fce698f760e01b815260048101829052602401610997565b6003826003811115612bcb57612bcb613870565b036106c6576040516335e2f38360e21b815260048101829052602401610997565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612c2b5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612c57576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612c7557662386f26fc10000830492506010015b6305f5e1008310612c8d576305f5e100830492506008015b6127108310612ca157612710830492506004015b60648310612cb3576064830492506002015b600a831061067c5760010192915050565b600080612857858585612d97565b600080608083901c15612ce757608092831c92015b604083901c15612cf957604092831c92015b602083901c15612d0b57602092831c92015b601083901c15612d1d57601092831c92015b600883901c15612d2f57600892831c92015b600483901c15612d4157600492831c92015b600283901c15612d5357600292831c92015b600183901c1561067c5760010192915050565b6000818310612d755781610918565b5090919050565b6000612d8b60028484186137f0565b610918908484166137c7565b825460009081908015612edd576000612db5876121236001856137b4565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b031660208401529192509087161015612e365760405162461bcd60e51b815260206004820152601b60248201527f436865636b706f696e743a2064656372656173696e67206b65797300000000006044820152606401610997565b805163ffffffff808816911603612e7e5784612e57886121236001866137b4565b80546001600160e01b0392909216600160201b0263ffffffff909216919091179055612ecd565b6040805180820190915263ffffffff80881682526001600160e01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216600160201b029216919091179101555b60200151925083915061285c9050565b50506040805180820190915263ffffffff80851682526001600160e01b0380851660208085019182528854600181018a5560008a815291822095519251909316600160201b02919093161792019190915590508161285c565b60005b83811015612f51578181015183820152602001612f39565b50506000910152565b60008151808452612f72816020860160208601612f36565b601f01601f19169290920160200192915050565b6020815260006109186020830184612f5a565b600060208284031215612fab57600080fd5b5035919050565b80356001600160a01b0381168114612fc957600080fd5b919050565b60008060408385031215612fe157600080fd5b612fea83612fb2565b946020939093013593505050565b60008060006060848603121561300d57600080fd5b61301684612fb2565b925061302460208501612fb2565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561306557613065613034565b604051601f8501601f19908116603f0116810190828211818310171561308d5761308d613034565b816040528093508581528686860111156130a657600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126130d157600080fd5b6109188383356020850161304a565b6000806000606084860312156130f557600080fd5b6130fe84612fb2565b9250602084013567ffffffffffffffff8082111561311b57600080fd5b613127878388016130c0565b9350604086013591508082111561313d57600080fd5b5061314a868287016130c0565b9150509250925092565b60006020828403121561316657600080fd5b61091882612fb2565b60208152600082516080602084015261318b60a0840182612f5a565b90506020840151601f198483030160408501526131a88282612f5a565b91505060408401516060840152606084015160808401528091505092915050565b60ff60f81b881681526000602060e060208401526131ea60e084018a612f5a565b83810360408501526131fc818a612f5a565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b8181101561325057835183529284019291840191600101613234565b50909c9b505050505050505050505050565b60008060006060848603121561327757600080fd5b833567ffffffffffffffff8082111561328f57600080fd5b61329b878388016130c0565b945060208601359150808211156132b157600080fd5b506132be868287016130c0565b9250506132cd60408501612fb2565b90509250925092565b600080604083850312156132e957600080fd5b6132f283612fb2565b91506020830135801515811461330757600080fd5b809150509250929050565b6000806000806080858703121561332857600080fd5b61333185612fb2565b935061333f60208601612fb2565b925060408501359150606085013567ffffffffffffffff81111561336257600080fd5b8501601f8101871361337357600080fd5b6133828782356020840161304a565b91505092959194509250565b60008060008060008060c087890312156133a757600080fd5b6133b087612fb2565b95506020870135945060408701359350606087013560ff811681146133d457600080fd5b9598949750929560808101359460a0909101359350915050565b6000806040838503121561340157600080fd5b823567ffffffffffffffff8082111561341957600080fd5b613425868387016130c0565b9350602085013591508082111561343b57600080fd5b50613448858286016130c0565b9150509250929050565b60008060006060848603121561346757600080fd5b833567ffffffffffffffff8082111561347f57600080fd5b61348b878388016130c0565b9450602086013591508082111561311b57600080fd5b600080604083850312156134b457600080fd5b6134bd83612fb2565b91506134cb60208401612fb2565b90509250929050565b600181811c908216806134e857607f821691505b602082108103610f5857634e487b7160e01b600052602260045260246000fd5b601f821115610907576000816000526020600020601f850160051c810160208610156135315750805b601f850160051c820191505b818110156108e15782815560010161353d565b815167ffffffffffffffff81111561356a5761356a613034565b61357e8161357884546134d4565b84613508565b602080601f8311600181146135b3576000841561359b5750858301515b600019600386901b1c1916600185901b1785556108e1565b600085815260208120601f198616915b828110156135e2578886015182559484019460019091019084016135c3565b50858210156136005787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061364390830184612f5a565b9695505050505050565b60006020828403121561365f57600080fd5b81516001600160e01b03198116811461091857600080fd5b683d913730b6b2911d1160b91b8152835160009061369c816009850160208901612f36565b6a11161134b6b0b3b2911d1160a91b60099184019182015284516136c7816014840160208901612f36565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a2243601492909101918201527f726561746564222c22646973706c61795f74797065223a202264617465222c20603482015267113b30b63ab2911d60c11b6054820152835161373c81605c840160208801612f36565b627d5d7d60e81b605c9290910191820152605f0195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161379181601d850160208701612f36565b91909101601d0192915050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561067c5761067c61379e565b8082018082111561067c5761067c61379e565b634e487b7160e01b600052601260045260246000fd5b60008261380d57634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761067c5761067c61379e565b6001600160e01b038181168382160190808211156138495761384961379e565b5092915050565b6001600160e01b038281168282160390808211156138495761384961379e565b634e487b7160e01b600052602160045260246000fdfe7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477003a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336c4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef52000423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f66","sourceMap":"593:3939:233:-:0;;;;;;;;;;;;-1:-1:-1;385:22:70;:20;:22::i;:::-;593:3939:233;;1653:314:84;303:66:85;1779:14:84;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:84;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:84;1898:16;1886:28;;;;;1927:29;;158:42:514;;;1927:29:84;;146:2:514;131:18;1927:29:84;;;;;;;1844:119;1694:273;1653:314::o;14:192:514:-;593:3939:233;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106101e35760003560e01c806375794a3c116101025780639ab24eb011610095578063c87b56dd11610064578063c87b56dd14610546578063d2f01f1914610566578063d7a901d314610586578063e985e9c5146105a657600080fd5b80639ab24eb0146104d3578063a22cb465146104f3578063b88d4fde14610513578063c3cda5201461052657600080fd5b80638e539e8c116100d15780638e539e8c1461045257806391ddadf41461047257806391de4a831461049e57806395d89b41146104be57600080fd5b806375794a3c146103e05780637ecebe00146103f557806384b0196e1461041557806388cc58e41461043d57600080fd5b806342842e0e1161017a5780635c19a95c116101495780635c19a95c146103535780636352211e146103735780636a9a38e61461039357806370a08231146103c057600080fd5b806342842e0e146102eb5780634bf5d7e9146102fe578063587cde1e146103135780635bb478081461033357600080fd5b806323b872dd116101b657806323b872dd146102835780633644e515146102965780633953801b146102ab5780633a46b1a8146102cb57600080fd5b806306fdde03146101e8578063081812fc14610213578063095ea7b31461024b57806318160ddd14610260575b600080fd5b3480156101f457600080fd5b506101fd6105d6565b60405161020a9190612f86565b60405180910390f35b34801561021f57600080fd5b5061023361022e366004612f99565b610671565b6040516001600160a01b03909116815260200161020a565b61025e610259366004612fce565b610682565b005b34801561026c57600080fd5b506102756106ca565b60405190815260200161020a565b61025e610291366004612ff8565b6106d9565b3480156102a257600080fd5b506102756108e9565b3480156102b757600080fd5b5061025e6102c63660046130e0565b6108f3565b3480156102d757600080fd5b506102756102e6366004612fce565b61090c565b61025e6102f9366004612ff8565b61091f565b34801561030a57600080fd5b506101fd61093a565b34801561031f57600080fd5b5061023361032e366004613154565b610944565b34801561033f57600080fd5b5061025e61034e366004613154565b61094f565b34801561035f57600080fd5b5061025e61036e366004613154565b6109ac565b34801561037f57600080fd5b5061023361038e366004612f99565b6109b6565b34801561039f57600080fd5b506103b36103ae366004613154565b6109c1565b60405161020a919061316f565b3480156103cc57600080fd5b506102756103db366004613154565b6109f5565b3480156103ec57600080fd5b50610275610a00565b34801561040157600080fd5b50610275610410366004613154565b610a0a565b34801561042157600080fd5b5061042a610a47565b60405161020a97969594939291906131c9565b34801561044957600080fd5b50610233610b0a565b34801561045e57600080fd5b5061027561046d366004612f99565b610b2b565b34801561047e57600080fd5b50610487610b36565b60405165ffffffffffff909116815260200161020a565b3480156104aa57600080fd5b506102756104b9366004613262565b610b40565b3480156104ca57600080fd5b506101fd610ba8565b3480156104df57600080fd5b506102756104ee366004613154565b610bc0565b3480156104ff57600080fd5b5061025e61050e3660046132d6565b610bcb565b61025e610521366004613312565b610c04565b34801561053257600080fd5b5061025e61054136600461338e565b610c4e565b34801561055257600080fd5b506101fd610561366004612f99565b610c5c565b34801561057257600080fd5b5061025e6105813660046133ee565b610c8d565b34801561059257600080fd5b5061025e6105a1366004613452565b610cce565b3480156105b257600080fd5b506105c66105c13660046134a1565b610db9565b604051901515815260200161020a565b60606105e0610dc5565b60020180546105ee906134d4565b80601f016020809104026020016040519081016040528092919081815260200182805461061a906134d4565b80156106675780601f1061063c57610100808354040283529160200191610667565b820191906000526020600020905b81548152906001019060200180831161064a57829003601f168201915b5050505050905090565b600061067c82610de9565b92915050565b6001600160a01b0382161580159061069e575061069e33610e36565b156106bc57604051638043dfaf60e01b815260040160405180910390fd5b6106c68282610eb2565b5050565b60006106d4610ebe565b905090565b60006106e482610edd565b9050836001600160a01b0316816001600160a01b0316146107175760405162a1148160e81b815260040160405180910390fd5b60008061072384610f78565b9150915061074881876107333390565b6001600160a01b039081169116811491141790565b610773576107568633610db9565b61077357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661079a57604051633a954ecd60e21b815260040160405180910390fd5b6107a78686866001610fa0565b80156107b257600082555b6107ba610dc5565b6001600160a01b03871660009081526005919091016020526040902080546000190190556107e6610dc5565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b1761081d610dc5565b60008681526004919091016020526040812091909155600160e11b84169003610893576001840161084c610dc5565b6000828152600491909101602052604081205490036108915761086d610dc5565b548114610891578361087d610dc5565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46108e18686866001610fdf565b505050505050565b60006106d4610fea565b6108fc83610ff4565b610907838383611031565b505050565b600061091883836110e4565b9392505050565b61090783838360405180602001604052806000815250610c04565b60606106d4611182565b600061067c8261121a565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031633146109a0576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6109a981611257565b50565b6109a933826112c1565b600061067c82610edd565b6109ec6040518060800160405280606081526020016060815260200160008152602001600081525090565b61067c8261135b565b600061067c82611519565b60006106d4611582565b6001600160a01b03811660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c00602052604081205461067c565b6000606080828080836000805160206138a783398151915254158015610a8c57507f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d54155b610ad05760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610997565b610ad8611592565b610ae06115a8565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60006106d4600080516020613887833981519152546001600160a01b031690565b600061067c826115be565b60006106d4611657565b60008060008051602061388783398151915280549091506001600160a01b03163314610b7f5760405163443e750b60e11b815260040160405180910390fd5b610b87611582565b9150610b9585858486611662565b610ba0336001611767565b509392505050565b6060610bb2610dc5565b60030180546105ee906134d4565b600061067c826118b7565b808015610bdc5750610bdc33610e36565b15610bfa57604051638043dfaf60e01b815260040160405180910390fd5b6106c682826118e5565b610c0f8484846106d9565b6001600160a01b0383163b15610c4857610c2b84848484611962565b610c48576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6108e1868686868686611a4d565b6060610c6782611b36565b610c8457604051630a14c4b560e41b815260040160405180910390fd5b61067c82611b72565b60008051602061390783398151915254600160201b900460ff16610cc457604051630ef4733760e31b815260040160405180910390fd5b6106c68282611d9e565b6000805160206139078339815191528054600160201b900460ff161580610cf857303b1515610d07565b8154600163ffffffff90911610155b15610d30578154604051630a8ef77f60e31b815263ffffffff9091166004820152602401610997565b815463ffffffff191660011782558015610d5757815464ff000000001916600160201b1782555b610d618585611d9e565b610d6b8584611dff565b8015610db257815464ff0000000019168255604051600181527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b5050505050565b60006109188383611e40565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b6000610df482611b36565b610e11576040516333d1c03960e21b815260040160405180910390fd5b610e19610dc5565b60009283526006016020525060409020546001600160a01b031690565b60007f0c89d3aad1b583c77a2e9f9fffa651b386c9c29e300bf2a8e2f3de1bb0100a006001600160a01b0383163b15801561091857506001600160a01b0383166000908152600182016020526040902054158061091857506001600160a01b038316600090815260018201602052604090205442109392505050565b6106c682826001611e7d565b600080610ec9610dc5565b60010154610ed5610dc5565b540303919050565b600080610ee8610dc5565b60008481526004820160205260408120549350909150600160e01b83169003610f5e5781600003610f585780548310610f3457604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115610f35575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b6000806000610f85610dc5565b60009485526006016020525050604090912080549092909150565b6001600160a01b03841615801590610fbc5750610fbc84610e36565b15610fda57604051638043dfaf60e01b815260040160405180910390fd5b610c48565b610fda848483611f32565b60006106d4611fd4565b3361100a6110018361135b565b604001516109b6565b6001600160a01b0316146109a95760405163dbfcf17d60e01b815260040160405180910390fd5b61103c826002612048565b611047816001612048565b6001600160a01b03831660009081527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477026020526040902060008051602061388783398151915290806110998582613550565b50600181016110a88482613550565b506040516001600160a01b038616907f66da702131703ee5e745ecf2f5b98311caa00729edd55541baad49289fc42ed890600090a25050505050565b60006110ee611657565b65ffffffffffff16821061113b5760405162461bcd60e51b81526020600482015260146024820152730566f7465733a20667574757265206c6f6f6b75760641b6044820152606401610997565b6111726111478361206c565b6001600160a01b038516600090815260008051602061392783398151915260205260409020906120a1565b6001600160e01b03169392505050565b60604361118d611657565b65ffffffffffff16146111e25760405162461bcd60e51b815260206004820152601860248201527f566f7465733a2062726f6b656e20636c6f636b206d6f646500000000000000006044820152606401610997565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6001600160a01b0390811660009081527f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f6560205260409020541690565b61126081612155565b60008051602061388783398151915280546001600160a01b0383166001600160a01b03199091168117825560408051918252517f64c14256e532eac2ec90ddc4973ed2d3f5623faf7951d90eec38f9b7812f99a79181900360200190a15050565b60006112cc8361121a565b6001600160a01b0384811660008181527f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f65602052604080822080546001600160a01b031916888616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461090781836113568661217c565b612187565b6113866040518060800160405280606081526020016060815260200160008152602001600081525090565b6001600160a01b03821660009081527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477026020526040908190208151608081019092528054600080516020613887833981519152929190829082906113e9906134d4565b80601f0160208091040260200160405190810160405280929190818152602001828054611415906134d4565b80156114625780601f1061143757610100808354040283529160200191611462565b820191906000526020600020905b81548152906001019060200180831161144557829003601f168201915b5050505050815260200160018201805461147b906134d4565b80601f01602080910402602001604051908101604052809291908181526020018280546114a7906134d4565b80156114f45780601f106114c9576101008083540402835291602001916114f4565b820191906000526020600020905b8154815290600101906020018083116114d757829003601f168201915b5050505050815260200160028201548152602001600382015481525050915050919050565b60006001600160a01b038216611542576040516323d3ad8160e21b815260040160405180910390fd5b67ffffffffffffffff611553610dc5565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b600061158c610dc5565b54919050565b60606000805160206138a78339815191526105e0565b60606000805160206138a7833981519152610bb2565b60006115c8611657565b65ffffffffffff1682106116155760405162461bcd60e51b81526020600482015260146024820152730566f7465733a20667574757265206c6f6f6b75760641b6044820152606401610997565b6116486116218361206c565b7f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f67906120a1565b6001600160e01b031692915050565b60006106d443612308565b61166d846002612048565b611678836000612048565b61168181612155565b60008281527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477016020908152604080832080546001600160a01b0319166001600160a01b03861690811790915581516080810183528881528084018890528083018790524260608201529084527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe5747702909252909120815160008051602061388783398151915292919081906117349082613550565b50602082015160018201906117499082613550565b50604082015160028201556060909101516003909101555050505050565b6000611771610dc5565b54905060008290036117965760405163b562e8dd60e01b815260040160405180910390fd5b6117a36000848385610fa0565b6801000000000000000182026117b7610dc5565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b17176117f2610dc5565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461187c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611844565b508160000361189d57604051622e076360e81b815260040160405180910390fd5b806118a6610dc5565b555061090790506000848385610fdf565b6001600160a01b0381166000908152600080516020613927833981519152602052604081206116489061233b565b806118ee610dc5565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611997903390899088908890600401613610565b6020604051808303816000875af19250505080156119d2575060408051601f3d908101601f191682019092526119cf9181019061364d565b60015b611a30573d808015611a00576040519150601f19603f3d011682016040523d82523d6000602084013e611a05565b606091505b508051600003611a28576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b83421115611a9d5760405162461bcd60e51b815260206004820152601860248201527f566f7465733a207369676e6174757265206578706972656400000000000000006044820152606401610997565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090611b1790611b0f9060a00160405160208183030381529060405280519060200120612374565b8585856123a1565b9050611b2381876123cf565b611b2d81886112c1565b50505050505050565b6000611b40610dc5565b548210801561067c5750600160e01b611b57610dc5565b60008481526004919091016020526040902054161592915050565b60008181527f7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477016020526040902054606090600080516020613887833981519152906001600160a01b031680611bd857505060408051602081019091526000815292915050565b6001600160a01b0381166000908152600283016020526040808220815160808101909252805482908290611c0b906134d4565b80601f0160208091040260200160405190810160405280929190818152602001828054611c37906134d4565b8015611c845780601f10611c5957610100808354040283529160200191611c84565b820191906000526020600020905b815481529060010190602001808311611c6757829003601f168201915b50505050508152602001600182018054611c9d906134d4565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc9906134d4565b8015611d165780601f10611ceb57610100808354040283529160200191611d16565b820191906000526020600020905b815481529060010190602001808311611cf957829003601f168201915b50505050508152602001600282015481526020016003820154815250509050611d7581600001518260200151611d4f8460600151612441565b604051602001611d6193929190613677565b6040516020818303038152906040526124d4565b604051602001611d859190613759565b6040516020818303038152906040529350505050919050565b60008051602061390783398151915254600160201b900460ff16611dd557604051630ef4733760e31b815260040160405180910390fd5b611de56380ac58cd60e01b612639565b611df5635b5e139f60e01b612639565b6106c68282612717565b60008051602061390783398151915254600160201b900460ff16611e3657604051630ef4733760e31b815260040160405180910390fd5b6106c68282612749565b6000611e4a610dc5565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b6000611e88836109b6565b90508115611ec757336001600160a01b03821614611ec757611eaa8133611e40565b611ec7576040516367d9dca160e11b815260040160405180910390fd5b83611ed0610dc5565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b6001600160a01b038316611f7857611f757f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f676127db611f70846127e7565b61281b565b50505b6001600160a01b038216611fb957611fb67f423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f67612864611f70846127e7565b50505b610907611fc58461121a565b611fce8461121a565b83612187565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611fff612870565b6120076128d6565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b81518290821115610907576040516374eb20a760e01b815260040160405180910390fd5b600063ffffffff82111561209d576040516306dfcc6560e41b81526020600482015260248101839052604401610997565b5090565b8154600090818160058111156120fe5760006120bc84612926565b6120c690856137b4565b60008881526020902090915081015463ffffffff90811690871610156120ee578091506120fc565b6120f98160016137c7565b92505b505b600061210c87878585612a0e565b9050801561214757612131876121236001846137b4565b600091825260209091200190565b54600160201b90046001600160e01b031661214a565b60005b979650505050505050565b6001600160a01b0381166109a9576040516302e47d1560e41b815260040160405180910390fd5b600061067c826109f5565b816001600160a01b0316836001600160a01b0316141580156121a95750600081115b15610907576001600160a01b03831615612259576001600160a01b03831660009081526000805160206139278339815191526020526040812081906121f490612864611f70866127e7565b6001600160e01b031691506001600160e01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161224e929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610907576001600160a01b038216600090815260008051602061392783398151915260205260408120819061229f906127db611f70866127e7565b6001600160e01b031691506001600160e01b03169150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516122f9929190918252602082015260400190565b60405180910390a25050505050565b600065ffffffffffff82111561209d576040516306dfcc6560e41b81526030600482015260248101839052604401610997565b8054600090801561236b57612355836121236001846137b4565b54600160201b90046001600160e01b0316610918565b60009392505050565b600061067c612381610fea565b8360405161190160f01b8152600281019290925260228201526042902090565b6000806000806123b388888888612a64565b9250925092506123c38282612b33565b50909695505050505050565b6001600160a01b03821660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c0060205260409020805460018101909155818114610907576040516301d4b62360e61b81526001600160a01b038416600482015260248101829052604401610997565b6060600061244e83612bec565b600101905060008167ffffffffffffffff81111561246e5761246e613034565b6040519080825280601f01601f191660200182016040528015612498576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846124a257509392505050565b606081516000036124f357505060408051602081019091526000815290565b60006040518060600160405280604081526020016138c7604091399050600060038451600261252291906137c7565b61252c91906137f0565b612537906004613812565b905060006125468260206137c7565b67ffffffffffffffff81111561255e5761255e613034565b6040519080825280601f01601f191660200182016040528015612588576020820181803683370190505b509050818152600183018586518101602084015b818310156125f4576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182535060010161259c565b60038951066001811461260e576002811461261f5761262b565b613d3d60f01b60011983015261262b565b603d60f81b6000198301525b509398975050505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146126c6576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff191660011790556126df565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6000612721610dc5565b9050600281016127318482613550565b50600381016127408382613550565b50600090555050565b7f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336e6127748382613550565b507f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336f6127a08282613550565b505060006000805160206138a78339815191528190557f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d5550565b60006109188284613829565b60006001600160e01b0382111561209d576040516306dfcc6560e41b815260e0600482015260248101839052604401610997565b60008061285761283961282c611657565b65ffffffffffff1661206c565b61284f6128458861233b565b868863ffffffff16565b879190612cc4565b915091505b935093915050565b60006109188284613850565b60008061287b611592565b805190915015612892578051602090910120919050565b6000805160206138a78339815191525480156128ae5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b6000806128e16115a8565b8051909150156128f8578051602090910120919050565b7f3a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336d5480156128ae5792915050565b60008160000361293857506000919050565b6000600161294584612cd2565b901c6001901b9050600181848161295e5761295e6137da565b048201901c90506001818481612976576129766137da565b048201901c9050600181848161298e5761298e6137da565b048201901c905060018184816129a6576129a66137da565b048201901c905060018184816129be576129be6137da565b048201901c905060018184816129d6576129d66137da565b048201901c905060018184816129ee576129ee6137da565b048201901c905061091881828581612a0857612a086137da565b04612d66565b60005b81831015610ba0576000612a258484612d7c565b60008781526020902090915063ffffffff86169082015463ffffffff161115612a5057809250612a5e565b612a5b8160016137c7565b93505b50612a11565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612a9f5750600091506003905082612b29565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612af3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612b1f57506000925060019150829050612b29565b9250600091508190505b9450945094915050565b6000826003811115612b4757612b47613870565b03612b50575050565b6001826003811115612b6457612b64613870565b03612b825760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115612b9657612b96613870565b03612bb75760405163fce698f760e01b815260048101829052602401610997565b6003826003811115612bcb57612bcb613870565b036106c6576040516335e2f38360e21b815260048101829052602401610997565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612c2b5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612c57576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612c7557662386f26fc10000830492506010015b6305f5e1008310612c8d576305f5e100830492506008015b6127108310612ca157612710830492506004015b60648310612cb3576064830492506002015b600a831061067c5760010192915050565b600080612857858585612d97565b600080608083901c15612ce757608092831c92015b604083901c15612cf957604092831c92015b602083901c15612d0b57602092831c92015b601083901c15612d1d57601092831c92015b600883901c15612d2f57600892831c92015b600483901c15612d4157600492831c92015b600283901c15612d5357600292831c92015b600183901c1561067c5760010192915050565b6000818310612d755781610918565b5090919050565b6000612d8b60028484186137f0565b610918908484166137c7565b825460009081908015612edd576000612db5876121236001856137b4565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b031660208401529192509087161015612e365760405162461bcd60e51b815260206004820152601b60248201527f436865636b706f696e743a2064656372656173696e67206b65797300000000006044820152606401610997565b805163ffffffff808816911603612e7e5784612e57886121236001866137b4565b80546001600160e01b0392909216600160201b0263ffffffff909216919091179055612ecd565b6040805180820190915263ffffffff80881682526001600160e01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216600160201b029216919091179101555b60200151925083915061285c9050565b50506040805180820190915263ffffffff80851682526001600160e01b0380851660208085019182528854600181018a5560008a815291822095519251909316600160201b02919093161792019190915590508161285c565b60005b83811015612f51578181015183820152602001612f39565b50506000910152565b60008151808452612f72816020860160208601612f36565b601f01601f19169290920160200192915050565b6020815260006109186020830184612f5a565b600060208284031215612fab57600080fd5b5035919050565b80356001600160a01b0381168114612fc957600080fd5b919050565b60008060408385031215612fe157600080fd5b612fea83612fb2565b946020939093013593505050565b60008060006060848603121561300d57600080fd5b61301684612fb2565b925061302460208501612fb2565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561306557613065613034565b604051601f8501601f19908116603f0116810190828211818310171561308d5761308d613034565b816040528093508581528686860111156130a657600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126130d157600080fd5b6109188383356020850161304a565b6000806000606084860312156130f557600080fd5b6130fe84612fb2565b9250602084013567ffffffffffffffff8082111561311b57600080fd5b613127878388016130c0565b9350604086013591508082111561313d57600080fd5b5061314a868287016130c0565b9150509250925092565b60006020828403121561316657600080fd5b61091882612fb2565b60208152600082516080602084015261318b60a0840182612f5a565b90506020840151601f198483030160408501526131a88282612f5a565b91505060408401516060840152606084015160808401528091505092915050565b60ff60f81b881681526000602060e060208401526131ea60e084018a612f5a565b83810360408501526131fc818a612f5a565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b8181101561325057835183529284019291840191600101613234565b50909c9b505050505050505050505050565b60008060006060848603121561327757600080fd5b833567ffffffffffffffff8082111561328f57600080fd5b61329b878388016130c0565b945060208601359150808211156132b157600080fd5b506132be868287016130c0565b9250506132cd60408501612fb2565b90509250925092565b600080604083850312156132e957600080fd5b6132f283612fb2565b91506020830135801515811461330757600080fd5b809150509250929050565b6000806000806080858703121561332857600080fd5b61333185612fb2565b935061333f60208601612fb2565b925060408501359150606085013567ffffffffffffffff81111561336257600080fd5b8501601f8101871361337357600080fd5b6133828782356020840161304a565b91505092959194509250565b60008060008060008060c087890312156133a757600080fd5b6133b087612fb2565b95506020870135945060408701359350606087013560ff811681146133d457600080fd5b9598949750929560808101359460a0909101359350915050565b6000806040838503121561340157600080fd5b823567ffffffffffffffff8082111561341957600080fd5b613425868387016130c0565b9350602085013591508082111561343b57600080fd5b50613448858286016130c0565b9150509250929050565b60008060006060848603121561346757600080fd5b833567ffffffffffffffff8082111561347f57600080fd5b61348b878388016130c0565b9450602086013591508082111561311b57600080fd5b600080604083850312156134b457600080fd5b6134bd83612fb2565b91506134cb60208401612fb2565b90509250929050565b600181811c908216806134e857607f821691505b602082108103610f5857634e487b7160e01b600052602260045260246000fd5b601f821115610907576000816000526020600020601f850160051c810160208610156135315750805b601f850160051c820191505b818110156108e15782815560010161353d565b815167ffffffffffffffff81111561356a5761356a613034565b61357e8161357884546134d4565b84613508565b602080601f8311600181146135b3576000841561359b5750858301515b600019600386901b1c1916600185901b1785556108e1565b600085815260208120601f198616915b828110156135e2578886015182559484019460019091019084016135c3565b50858210156136005787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061364390830184612f5a565b9695505050505050565b60006020828403121561365f57600080fd5b81516001600160e01b03198116811461091857600080fd5b683d913730b6b2911d1160b91b8152835160009061369c816009850160208901612f36565b6a11161134b6b0b3b2911d1160a91b60099184019182015284516136c7816014840160208901612f36565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a2243601492909101918201527f726561746564222c22646973706c61795f74797065223a202264617465222c20603482015267113b30b63ab2911d60c11b6054820152835161373c81605c840160208801612f36565b627d5d7d60e81b605c9290910191820152605f0195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161379181601d850160208701612f36565b91909101601d0192915050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561067c5761067c61379e565b8082018082111561067c5761067c61379e565b634e487b7160e01b600052601260045260246000fd5b60008261380d57634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761067c5761067c61379e565b6001600160e01b038181168382160190808211156138495761384961379e565b5092915050565b6001600160e01b038281168282160390808211156138495761384961379e565b634e487b7160e01b600052602160045260246000fdfe7fc24c9500f4388b797f8975c0991ad4ffd0338c2cbf5335b2bf5b7fe57477003a497e775dc7c283402f0d3c39c5f0ea53870eb15ab2dddfde5a1162a84c336c4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef52000423fcc3514229d79a30fb79b40a232f70b3fabdf664a75db0859c67848497f66","sourceMap":"593:3939:233:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2044:116:127;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3522:132;;;;;;;;;;-1:-1:-1;3522:132:127;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1119:32:514;;;1101:51;;1089:2;1074:18;3522:132:127;955:203:514;2665:266:233;;;;;;:::i;:::-;;:::i;:::-;;1527:93:127;;;;;;;;;;;;;:::i;:::-;;;1746:25:514;;;1734:2;1719:18;1527:93:127;1600:177:514;4917:2680:127;;;;;;:::i;:::-;;:::i;2381:105:233:-;;;;;;;;;;;;;:::i;2093:173::-;;;;;;;;;;-1:-1:-1;2093:173:233;;;;;:::i;:::-;;:::i;657:159:79:-;;;;;;;;;;-1:-1:-1;657:159:79;;;;;:::i;:::-;;:::i;7680:167:127:-;;;;;;:::i;:::-;;:::i;394:96:79:-;;;;;;;;;;;;;:::i;1015:111::-;;;;;;;;;;-1:-1:-1;1015:111:79;;;;;:::i;:::-;;:::i;1144:87:233:-;;;;;;;;;;-1:-1:-1;1144:87:233;;;;;:::i;:::-;;:::i;1155:95:79:-;;;;;;;;;;-1:-1:-1;1155:95:79;;;;;:::i;:::-;;:::i;2891:152:127:-;;;;;;;;;;-1:-1:-1;2891:152:127;;;;;:::i;:::-;;:::i;1951:108:233:-;;;;;;;;;;-1:-1:-1;1951:108:233;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1697:107:127:-;;;;;;;;;;-1:-1:-1;1697:107:127;;;;;:::i;:::-;;:::i;1556:87:233:-;;;;;;;;;;;;;:::i;2270:107::-;;;;;;;;;;-1:-1:-1;2270:107:233;;;;;:::i;:::-;;:::i;4521:801:147:-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;1265:85:233:-;;;;;;;;;;;;;:::i;845:141:79:-;;;;;;;;;;-1:-1:-1;845:141:79;;;;;:::i;:::-;;:::i;283:80::-;;;;;;;;;;;;;:::i;:::-;;;6226:14:514;6214:27;;;6196:46;;6184:2;6169:18;283:80:79;6052:196:514;1677:240:233;;;;;;;;;;-1:-1:-1;1677:240:233;;;;;:::i;:::-;;:::i;2223:120:127:-;;;;;;;;;;;;;:::i;519:109:79:-;;;;;;;;;;-1:-1:-1;519:109:79;;;;;:::i;:::-;;:::i;2935:281:233:-;;;;;;;;;;-1:-1:-1;2935:281:233;;;;;:::i;:::-;;:::i;8396:348:127:-;;;;;;:::i;:::-;;:::i;1279:214:79:-;;;;;;;;;;-1:-1:-1;1279:214:79;;;;;:::i;:::-;;:::i;3220:196:233:-;;;;;;;;;;-1:-1:-1;3220:196:233;;;;;:::i;:::-;;:::i;876:157:127:-;;;;;;;;;;-1:-1:-1;876:157:127;;;;;:::i;:::-;;:::i;724:212:233:-;;;;;;;;;;-1:-1:-1;724:212:233;;;;;:::i;:::-;;:::i;4364:167:127:-;;;;;;;;;;-1:-1:-1;4364:167:127;;;;;:::i;:::-;;:::i;:::-;;;10248:14:514;;10241:22;10223:41;;10211:2;10196:18;4364:167:127;10083:187:514;2044:116:127;2098:13;2126:23;:21;:23::i;:::-;:29;;2119:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2044:116;:::o;3522:132::-;3606:7;3628:21;3641:7;3628:12;:21::i;:::-;3621:28;3522:132;-1:-1:-1;;3522:132:127:o;2665:266:233:-;-1:-1:-1;;;;;2805:16:233;;;;;;:48;;;2825:28;2842:10;2825:16;:28::i;:::-;2801:93;;;2870:17;;-1:-1:-1;;;2870:17:233;;;;;;;;;;;2801:93;2900:26;2914:2;2918:7;2900:13;:26::i;:::-;2665:266;;:::o;1527:93:127:-;1579:7;1601:14;:12;:14::i;:::-;1594:21;;1527:93;:::o;4917:2680::-;5036:27;5066;5085:7;5066:18;:27::i;:::-;5036:57;;5145:4;-1:-1:-1;;;;;5104:45:127;5120:19;-1:-1:-1;;;;;5104:45:127;;5100:92;;5164:28;;-1:-1:-1;;;5164:28:127;;;;;;;;;;;5100:92;5207:27;5242:23;5274:35;5301:7;5274:26;:35::i;:::-;5199:110;;;;5398:68;5423:15;5440:4;5446:19;29371:10:128;;29289:97;5446:19:127;-1:-1:-1;;;;;11877:32:128;;;11735:28;;11992:20;;12014:30;;11989:56;;11468:587;5398:68:127;5393:181;;5479:43;5496:4;29371:10:128;4364:167:127;:::i;5479:43::-;5474:100;;5539:35;;-1:-1:-1;;;5539:35:127;;;;;;;;;;;5474:100;-1:-1:-1;;;;;5585:16:127;;5581:52;;5610:23;;-1:-1:-1;;;5610:23:127;;;;;;;;;;;5581:52;5640:43;5662:4;5668:2;5672:7;5681:1;5640:21;:43::i;:::-;5758:15;5755:135;;;5880:1;5859:19;5852:30;5755:135;6230:23;:21;:23::i;:::-;-1:-1:-1;;;;;6230:48:127;;;;;;:42;;;;;:48;;;;;6228:50;;-1:-1:-1;;6228:50:127;;;6316:23;:21;:23::i;:::-;-1:-1:-1;;;;;6316:46:127;;;;;;:42;;;;;:46;;;;;;6314:48;;;;;;10236:11:128;10211:23;10207:41;10194:63;-1:-1:-1;;;10194:63:128;6590:23:127;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;:184;;;;-1:-1:-1;;;6879:47:127;;:52;;6875:625;;6975:1;6965:11;;7080:23;:21;:23::i;:::-;:54;;;;:41;;;;;:54;;;;;;:59;;7076:416;;7220:23;:21;:23::i;:::-;:37;7205:52;;7201:281;;7450:19;7365:23;:21;:23::i;:::-;:82;;;;:41;;;;;:82;;;;;:104;7201:281;6933:567;6875:625;7536:7;7532:2;-1:-1:-1;;;;;7517:27:127;7526:4;-1:-1:-1;;;;;7517:27:127;;;;;;;;;;;7550:42;7571:4;7577:2;7581:7;7590:1;7550:20;:42::i;:::-;5030:2567;;;4917:2680;;;:::o;2381:105:233:-;2432:14;2461:20;:18;:20::i;2093:173::-;2203:22;2219:5;2203:15;:22::i;:::-;2231:30;2244:5;2251:4;2257:3;2231:12;:30::i;:::-;2093:173;;;:::o;657:159:79:-;756:7;778:33;792:7;801:9;778:13;:33::i;:::-;771:40;657:159;-1:-1:-1;;;657:159:79:o;7680:167:127:-;7803:39;7820:4;7826:2;7830:7;7803:39;;;;;;;;;;;;:16;:39::i;394:96:79:-;445:13;473:12;:10;:12::i;1015:111::-;1080:7;1102:19;1113:7;1102:10;:19::i;1144:87:233:-;291:66:98;445:29:96;-1:-1:-1;;;;;445:29:96;286:10;:22;282:79;;325:29;;-1:-1:-1;;;325:29:96;;343:10;325:29;;;1101:51:514;1074:18;;325:29:96;;;;;;;;282:79;1206:20:233::1;1218:7;1206:11;:20::i;:::-;1144:87:::0;:::o;1155:95:79:-;1213:32;1223:10;1235:9;1213;:32::i;2891:152:127:-;2971:7;3009:27;3028:7;3009:18;:27::i;1951:108:233:-;2011:12;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2011:12:233;2038:16;2048:5;2038:9;:16::i;1697:107:127:-;1760:7;1782:17;1793:5;1782:10;:17::i;1556:87:233:-;1602:7;1624:14;:12;:14::i;2270:107::-;-1:-1:-1;;;;;533:37:146;;2324:14:233;533:37:146;;;1561:66;533:37;;;;;;2353:19:233;443:132:146;4521:801:147;4610:13;4631:18;;4610:13;;;4631:18;-1:-1:-1;;;;;;;;;;;5014:34:147;:39;:93;;;;-1:-1:-1;5065:37:147;;:42;5014:93;4999:145;;;;-1:-1:-1;;;4999:145:147;;10862:2:514;4999:145:147;;;10844:21:514;10901:2;10881:18;;;10874:30;-1:-1:-1;;;10920:18:514;;;10913:51;10981:18;;4999:145:147;10660:345:514;4999:145:147;5190:13;:11;:13::i;:::-;5211:16;:14;:16::i;:::-;5295;;;5285:1;5295:16;;;;;;;;;-1:-1:-1;;;5151:166:147;;;-1:-1:-1;5151:166:147;;-1:-1:-1;5235:13:147;;-1:-1:-1;5264:4:147;;-1:-1:-1;5285:1:147;-1:-1:-1;5295:16:147;-1:-1:-1;5151:166:147;-1:-1:-1;4521:801:147:o;1265:85:233:-;1310:7;1332:13;-1:-1:-1;;;;;;;;;;;1076:10:234;-1:-1:-1;;;;;1076:10:234;;938:153;845:141:79;929:7;951:30;971:9;951:19;:30::i;283:80::-;329:6;350:8;:6;:8::i;1677:240:233:-;1796:15;;-1:-1:-1;;;;;;;;;;;625:10:234;;;;-1:-1:-1;;;;;;625:10:234;611;:24;607:84;;652:32;;-1:-1:-1;;;652:32:234;;;;;;;;;;;607:84;1829:14:233::1;:12;:14::i;:::-;1819:24;;1849:37;1860:4;1866:3;1871:7;1880:5;1849:10;:37::i;:::-;1892:20;1898:10;1910:1;1892:5;:20::i;:::-;531:171:234::0;1677:240:233;;;;;:::o;2223:120:127:-;2279:13;2307:23;:21;:23::i;:::-;:31;;2300:38;;;;;:::i;519:109:79:-;583:7;605:18;615:7;605:9;:18::i;2935:281:233:-;3081:8;:40;;;;;3093:28;3110:10;3093:16;:28::i;:::-;3077:85;;;3138:17;;-1:-1:-1;;;3138:17:233;;;;;;;;;;;3077:85;3168:43;3192:8;3202;3168:23;:43::i;8396:348:127:-;8543:31;8556:4;8562:2;8566:7;8543:12;:31::i;:::-;-1:-1:-1;;;;;8584:14:127;;;:19;8580:160;;8616:56;8647:4;8653:2;8657:7;8666:5;8616:30;:56::i;:::-;8611:129;;8691:40;;-1:-1:-1;;;8691:40:127;;;;;;;;;;;8611:129;8396:348;;;;:::o;1279:214:79:-;1439:49;1454:9;1465:5;1472:6;1480:1;1483;1486;1439:14;:49::i;3220:196:233:-;3301:13;3327:16;3335:7;3327;:16::i;:::-;3322:59;;3352:29;;-1:-1:-1;;;3352:29:233;;;;;;;;;;;3322:59;3395:16;3403:7;3395;:16::i;876:157:127:-;-1:-1:-1;;;;;;;;;;;1263:42:84;-1:-1:-1;;;1263:42:84;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:84;;;;;;;;;;;1258:100;988:40:127::1;1013:5;1020:7;988:24;:40::i;724:212:233:-:0;-1:-1:-1;;;;;;;;;;;540:14:84;;-1:-1:-1;;;540:14:84;;;;539:15;;564:53;;2049:4;2041:25;:30;;564:53;;;581:9;;594:1;581:9;;;;:14;;564:53;560:124;;;667:9;;634:43;;-1:-1:-1;;;634:43:84;;667:9;;;;634:43;;;11154:42:514;11127:18;;634:43:84;11010:192:514;560:124:84;689:13;;-1:-1:-1;;689:13:84;701:1;689:13;;;708:56;;;;736:21;;-1:-1:-1;;736:21:84;-1:-1:-1;;;736:21:84;;;708:56;859:38:233::1;884:4;890:6;859:24;:38::i;:::-;903:28;917:4;923:7;903:13;:28::i;:::-;780:14:84::0;776:84;;;804:22;;-1:-1:-1;;804:22:84;;;839:14;;-1:-1:-1;11154:42:514;;839:14:84;;11142:2:514;11127:18;839:14:84;;;;;;;776:84;435:429;;724:212:233;;;:::o;4364:167:127:-;4473:4;4492:34;4510:5;4517:8;4492:17;:34::i;1696:139:130:-;300:66;;1696:139::o;22511:230:128:-;22589:7;22609:16;22617:7;22609;:16::i;:::-;22604:64;;22634:34;;-1:-1:-1;;;22634:34:128;;;;;;;;;;;22604:64;22682:23;:21;:23::i;:::-;:48;;;;:39;;:48;;-1:-1:-1;22682:48:128;;;:54;-1:-1:-1;;;;;22682:54:128;;22511:230::o;1762:435:216:-;1829:4;287:66:218;-1:-1:-1;;;;;2060:20:216;;;:25;:132;;;;-1:-1:-1;;;;;;2096:30:216;;;;;;:20;;;:30;;;;;;:35;;:95;;-1:-1:-1;;;;;;2161:30:216;;;;;;:20;;;:30;;;;;;2143:15;:48;2047:145;1762:435;-1:-1:-1;;;1762:435:216:o;3260:128:127:-;3356:27;3365:2;3369:7;3378:4;3356:8;:27::i;2985:351:128:-;3032:7;;3263:23;:21;:23::i;:::-;:36;;;3215:23;:21;:23::i;:::-;:37;:84;:110;;2985:351;-1:-1:-1;2985:351:128:o;7836:1501::-;7912:14;7974:32;8009:23;:21;:23::i;:::-;8050:29;;;;:20;;;:29;;;;;;;-1:-1:-1;7974:58:128;;-1:-1:-1;;;;8115:24:128;;:29;;8111:1172;;8236:6;8246:1;8236:11;8232:791;;8276:16;;8265:27;;8261:83;;8313:31;;-1:-1:-1;;;8313:31:128;;;;;;;;;;;8261:83;8831:182;-1:-1:-1;;8910:9:128;;;8889:31;;;;:20;;;:31;;;;;;8910:9;;8889:31;;-1:-1:-1;8948:25:128;;8831:182;8948:25;;8987:13;7836:1501;;;:::o;8111:1172::-;7966:1323;9301:31;;-1:-1:-1;;;9301:31:128;;;;;;;;;;;12155:478;12251:27;12280:23;12313:38;12354:30;:28;:30::i;:::-;:62;;;;:53;;:62;;-1:-1:-1;;12354:62:128;;;;12597:26;;12354:62;;12597:26;;-1:-1:-1;12155:478:128:o;3420:352:233:-;-1:-1:-1;;;;;3565:18:233;;;;;;:44;;;3587:22;3604:4;3587:16;:22::i;:::-;3561:139;;;3676:17;;-1:-1:-1;;;3676:17:233;;;;;;;;;;;3561:139;3706:61;8396:348:127;3776:262:233;3925:41;3946:4;3952:2;3956:9;3925:20;:41::i;3299:103:147:-;3352:7;3374:23;:21;:23::i;4355:175:233:-;4457:10;4419:34;4428:16;4438:5;4428:9;:16::i;:::-;:24;;;4419:8;:34::i;:::-;-1:-1:-1;;;;;4419:48:233;;4415:111;;4484:35;;-1:-1:-1;;;4484:35:233;;;;;;;;;;;1752:399:234;1859:30;1881:4;1887:1;1859:21;:30::i;:::-;1895:29;1917:3;1922:1;1895:21;:29::i;:::-;-1:-1:-1;;;;;2028:24:234;;1931:35;2028:24;;;:17;:24;;;;;-1:-1:-1;;;;;;;;;;;342:66:235;2028:24:234;2058:21;2075:4;2028:24;2058:21;:::i;:::-;-1:-1:-1;2085:13:234;;;:19;2101:3;2085:13;:19;:::i;:::-;-1:-1:-1;2116:30:234;;-1:-1:-1;;;;;2116:30:234;;;;;;;;1853:298;;1752:399;;;:::o;4002:301:80:-;4096:7;4131:8;:6;:8::i;:::-;4119:20;;:9;:20;4111:53;;;;-1:-1:-1;;;4111:53:80;;13810:2:514;4111:53:80;;;13792:21:514;13849:2;13829:18;;;13822:30;-1:-1:-1;;;13868:18:514;;;13861:50;13928:18;;4111:53:80;13608:344:514;4111:53:80;4183:115;4262:28;4280:9;4262:17;:28::i;:::-;-1:-1:-1;;;;;4183:51:80;;;;;;-1:-1:-1;;;;;;;;;;;4183:51:80;;;;;;:69;:115::i;:::-;-1:-1:-1;;;;;4170:128:80;;4002:301;-1:-1:-1;;;4002:301:80:o;3014:221::-;3059:13;3145:12;3133:8;:6;:8::i;:::-;:24;;;3125:61;;;;-1:-1:-1;;;3125:61:80;;14159:2:514;3125:61:80;;;14141:21:514;14198:2;14178:18;;;14171:30;14237:26;14217:18;;;14210:54;14281:18;;3125:61:80;13957:348:514;3125:61:80;-1:-1:-1;3192:38:80;;;;;;;;;;;;;;;;;;3014:221::o;5261:129::-;-1:-1:-1;;;;;5343:42:80;;;5321:7;5343:42;;;226:52:81;5343:42:80;;;;;;;;5261:129::o;706:228:234:-;759:31;782:7;759:22;:31::i;:::-;-1:-1:-1;;;;;;;;;;;867:20:234;;-1:-1:-1;;;;;867:20:234;;-1:-1:-1;;;;;;867:20:234;;;;;;;898:31;;;1101:51:514;;;898:31:234;;;;;;1089:2:514;898:31:234;;;753:181;706:228;:::o;6619:401:80:-;6739:19;6761;6772:7;6761:10;:19::i;:::-;-1:-1:-1;;;;;6786:42:80;;;:33;:42;;;226:52:81;6786:42:80;;;;;;:54;;-1:-1:-1;;;;;;6786:54:80;;;;;;;;;;6852:48;;6739:41;;-1:-1:-1;6786:54:80;6852:48;;;;;;6786:33;6852:48;6906:68;6925:11;6938:9;6949:24;6965:7;6949:15;:24::i;:::-;6906:18;:68::i;2155:183:234:-;2212:12;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2212:12:234;-1:-1:-1;;;;;2309:24:234;;2232:35;2309:24;;;:17;:24;;;;;;;2302:31;;;;;;;;;;-1:-1:-1;;;;;;;;;;;342:66:235;2302:31:234;2309:24;2302:31;;2309:24;;2302:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2155:183;;;:::o;3340:242:128:-;3398:7;-1:-1:-1;;;;;3417:19:128;;3413:60;;3445:28;;-1:-1:-1;;;3445:28:128;;;;;;;;;;;3413:60;571:13;3492:23;:21;:23::i;:::-;:42;;:49;3535:5;-1:-1:-1;;;;;3492:49:128;-1:-1:-1;;;;;3492:49:128;;;;;;;;;;;;;:85;3479:98;;3340:242;;;:::o;4042:119::-;4097:7;4119:23;:21;:23::i;:::-;:37;;4042:119;-1:-1:-1;4042:119:128:o;5532:115:147:-;5586:13;-1:-1:-1;;;;;;;;;;;5614:22:147;7831:139;5860:121;5917:13;-1:-1:-1;;;;;;;;;;;5945:22:147;7831:139;4913:274:80;4992:7;5027:8;:6;:8::i;:::-;5015:20;;:9;:20;5007:53;;;;-1:-1:-1;;;5007:53:80;;13810:2:514;5007:53:80;;;13792:21:514;13849:2;13829:18;;;13822:30;-1:-1:-1;;;13868:18:514;;;13861:50;13928:18;;5007:53:80;13608:344:514;5007:53:80;5079:103;5146:28;5164:9;5146:17;:28::i;:::-;5079:39;;:57;:103::i;:::-;-1:-1:-1;;;;;5066:116:80;;4913:274;-1:-1:-1;;4913:274:80:o;2771:98::-;2812:6;2833:31;2851:12;2833:17;:31::i;1267:481:234:-;1393:30;1415:4;1421:1;1393:21;:30::i;:::-;1429:29;1451:3;1456:1;1429:21;:29::i;:::-;1464;1487:5;1464:22;:29::i;:::-;1500:35;1571:26;;;:17;:26;;;;;;;;:34;;-1:-1:-1;;;;;;1571:34:234;-1:-1:-1;;;;;1571:34:234;;;;;;;;1638:105;;;;;;;;;;;;;;;;;;;;;;1721:15;1638:105;;;;1611:24;;;:17;:24;;;;;;:132;;-1:-1:-1;;;;;;;;;;;342:66:235;1638:105:234;1611:24;;;:132;;:24;:132;:::i;:::-;-1:-1:-1;1611:132:234;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1611:132:234;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1267:481:234:o;15806:2642:128:-;15874:20;15897:23;:21;:23::i;:::-;:37;;-1:-1:-1;15897:37:128;15944:13;;;15940:44;;15966:18;;-1:-1:-1;;;15966:18:128;;;;;;;;;;;15940:44;15991:61;16021:1;16025:2;16029:12;16043:8;15991:21;:61::i;:::-;16481:32;16461:53;;16403:23;:21;:23::i;:::-;-1:-1:-1;;;;;16403:46:128;;;;;;:42;;;;;:46;;;;;;:111;;;;;;;;;10236:11;10211:23;10207:41;-1:-1:-1;10631:15:128;;10605:24;10601:46;10204:52;10194:63;16714:23;:21;:23::i;:::-;:71;;;;:41;;;;;:71;;;;;:188;;;;-1:-1:-1;;;;;17423:25:128;;;16949:23;;;;16765:12;;17423:25;;17609;16714:71;;17495:260;18033:1;18019:12;18015:20;17984:275;18065:3;18056:7;18053:16;17984:275;;18241:7;18231:8;18228:1;18201:25;18198:1;18195;18190:59;18107:1;18094:15;17984:275;;;17988:57;18278:8;18290:1;18278:13;18274:45;;18300:19;;-1:-1:-1;;;18300:19:128;;;;;;;;;;;18274:45;18368:3;18328:23;:21;:23::i;:::-;:43;-1:-1:-1;18383:60:128;;-1:-1:-1;18328:37:128;18416:2;18420:12;18434:8;18383:20;:60::i;3489:146:80:-;-1:-1:-1;;;;;3570:51:80;;3548:7;3570:51;;;-1:-1:-1;;;;;;;;;;;3570:51:80;;;;;:60;;:58;:60::i;3957:269:127:-;4147:8;4059:23;:21;:23::i;:::-;29371:10:128;4059:63:127;;;;:42;;;;;:63;;;;;;;;-1:-1:-1;;;;;4059:85:127;;;;;;;;;;;;:96;;-1:-1:-1;;4059:96:127;;;;;;;;;;;4166:55;;10248:14:514;;10241:22;10223:41;;4059:85:127;;29371:10:128;;4166:55:127;;10196:18:514;4166:55:127;;;;;;;3957:269;;:::o;14714:674:128:-;14877:139;;-1:-1:-1;;;14877:139:128;;14855:4;;-1:-1:-1;;;;;14877:56:128;;;;;:139;;29371:10;;14972:4;;14986:7;;15003:5;;14877:139;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14877:139:128;;;;;;;;-1:-1:-1;;14877:139:128;;;;;;;;;;;;:::i;:::-;;;14867:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15199:6;:13;15216:1;15199:18;15195:183;;15236:40;;-1:-1:-1;;;15236:40:128;;;;;;;;;;;15195:183;15352:6;15346:13;15337:6;15333:2;15329:15;15322:38;14867:517;-1:-1:-1;;;;;;15068:83:128;-1:-1:-1;;;15068:83:128;;-1:-1:-1;14714:674:128;;;;;;:::o;5460:467:80:-;5635:6;5616:15;:25;;5608:62;;;;-1:-1:-1;;;5608:62:80;;15301:2:514;5608:62:80;;;15283:21:514;15340:2;15320:18;;;15313:30;15379:26;15359:18;;;15352:54;15423:18;;5608:62:80;15099:348:514;5608:62:80;5750:58;;;2317:71;5750:58;;;15683:25:514;-1:-1:-1;;;;;15744:32:514;;15724:18;;;15717:60;;;;15793:18;;;15786:34;;;15836:18;;;15829:34;;;5676:14:80;;5693:157;;5714:103;;15655:19:514;;5750:58:80;;;;;;;;;;;;5740:69;;;;;;5714:16;:103::i;:::-;5825:1;5834;5843;5693:13;:157::i;:::-;5676:174;;5857:31;5874:6;5882:5;5857:16;:31::i;:::-;5894:28;5904:6;5912:9;5894;:28::i;:::-;5602:325;5460:467;;;;;;:::o;11071:301:128:-;11136:4;11207:23;:21;:23::i;:::-;:37;11197:47;;11161:187;;;;;-1:-1:-1;;;11275:23:128;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;;:68;:73;11148:200;11071:301;-1:-1:-1;;11071:301:128:o;450:786:236:-;544:35;637:26;;;:17;:26;;;;;;523:13;;-1:-1:-1;;;;;;;;;;;342:66:235;-1:-1:-1;;;;;637:26:236;;670:41;;-1:-1:-1;;702:9:236;;;;;;;;;-1:-1:-1;702:9:236;;;450:786;-1:-1:-1;;450:786:236:o;670:41::-;-1:-1:-1;;;;;739:31:236;;718:18;739:31;;;:17;;;:31;;;;;;718:52;;;;;;;;;;;;739:31;;718:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;877:336;963:5;:10;;;1018:5;:9;;;1133:33;1150:5;:15;;;1133:16;:33::i;:::-;904:297;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;877:13;:336::i;:::-;806:417;;;;;;;;:::i;:::-;;;;;;;;;;;;;777:454;;;;;450:786;;;:::o;1037:299:127:-;-1:-1:-1;;;;;;;;;;;1263:42:84;-1:-1:-1;;;1263:42:84;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:84;;;;;;;;;;;1258:100;1159:25:127::1;-1:-1:-1::0;;;1159:13:127::1;:25::i;:::-;1224;-1:-1:-1::0;;;1224:13:127::1;:25::i;:::-;1297:34;1316:5;1323:7;1297:18;:34::i;2732:153:147:-:0;-1:-1:-1;;;;;;;;;;;1263:42:84;-1:-1:-1;;;1263:42:84;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:84;;;;;;;;;;;1258:100;2842:38:147::1;2866:4;2872:7;2842:23;:38::i;22321:186:128:-:0;22424:4;22443:23;:21;:23::i;:::-;-1:-1:-1;;;;;22443:49:128;;;;;;;:42;;;;;:49;;;;;;;;:59;;;;;;;;;;-1:-1:-1;22443:59:128;;;;;22321:186::o;23291:439::-;23397:13;23413:17;23422:7;23413:8;:17::i;:::-;23397:33;;23441:13;23437:184;;;29371:10;-1:-1:-1;;;;;23466:28:128;;;23462:159;;23509:45;23527:5;29371:10;23509:17;:45::i;:::-;23504:117;;23575:35;;-1:-1:-1;;;23575:35:128;;;;;;;;;;;23504:117;23684:2;23627:23;:21;:23::i;:::-;:48;;;;:39;;;;;:48;;;;;;:59;;-1:-1:-1;;;;;;23627:59:128;-1:-1:-1;;;;;23627:59:128;;;;;;23697:28;23627:48;;23697:28;;;;;;;;;;23627:48;23697:28;23391:339;23291:439;;;:::o;7244:491:80:-;-1:-1:-1;;;;;7359:18:80;;7355:151;;7387:112;7402:39;7451:4;7465:26;7484:6;7465:18;:26::i;:::-;7387:5;:112::i;:::-;;;7355:151;-1:-1:-1;;;;;7515:16:80;;7511:154;;7541:117;7556:39;7605:9;7624:26;7643:6;7624:18;:26::i;7541:117::-;;;7511:154;7670:60;7689:16;7700:4;7689:10;:16::i;:::-;7707:14;7718:2;7707:10;:14::i;:::-;7723:6;7670:18;:60::i;3406:268:147:-;3461:7;2080:107;3552:17;:15;:17::i;:::-;3581:20;:18;:20::i;:::-;3508:153;;;;;;18149:25:514;;;;18190:18;;18183:34;;;;18233:18;;;18226:34;3613:13:147;18276:18:514;;;18269:34;3646:4:147;18319:19:514;;;18312:61;18121:19;;3508:153:147;;;;;;;;;;;;3489:180;;;;;;3476:193;;3406:268;:::o;425:183:271:-;541:15;;526:4;;541:21;-1:-1:-1;537:66:271;;;571:32;;-1:-1:-1;;;571:32:271;;;;;;;;;;;15291:213:444;15347:6;15377:16;15369:24;;15365:103;;;15416:41;;-1:-1:-1;;;15416:41:444;;15447:2;15416:41;;;18565:36:514;18617:18;;;18610:34;;;18538:18;;15416:41:444;18384:266:514;15365:103:444;-1:-1:-1;15491:5:444;15291:213::o;8964:548:75:-;9090:24;;9061:7;;;9090:24;9177:1;9171:7;;9167:190;;;9188:11;9208:14;9218:3;9208:9;:14::i;:::-;9202:20;;:3;:20;:::i;:::-;13062:28;13115:20;;;13174:4;13161:18;;9188:34;;-1:-1:-1;13157:28:75;;9240:42;;;;;9234:48;;;;9230:121;;;9301:3;9294:10;;9230:121;;;9335:7;:3;9341:1;9335:7;:::i;:::-;9329:13;;9230:121;9180:177;9167:190;9363:11;9377:53;9396:4;9415:3;9420;9425:4;9377:18;:53::i;:::-;9363:67;-1:-1:-1;9444:8:75;;:63;;9459:41;9473:4;9492:7;9498:1;9492:3;:7;:::i;:::-;13062:28;13115:20;;;13174:4;13161:18;;;13157:28;;12962:233;9459:41;:48;-1:-1:-1;;;9459:48:75;;-1:-1:-1;;;;;9459:48:75;9444:63;;;9455:1;9444:63;9437:70;8964:548;-1:-1:-1;;;;;;;8964:548:75:o;744:119:271:-;-1:-1:-1;;;;;804:18:271;;800:58;;831:27;;-1:-1:-1;;;831:27:271;;;;;;;;;;;4042:135:233;4132:7;4154:18;4164:7;4154:9;:18::i;7813:698:80:-;7925:2;-1:-1:-1;;;;;7917:10:80;:4;-1:-1:-1;;;;;7917:10:80;;;:24;;;;;7940:1;7931:6;:10;7917:24;7913:594;;;-1:-1:-1;;;;;7955:18:80;;;7951:277;;-1:-1:-1;;;;;8041:48:80;;7986:16;8041:48;;;-1:-1:-1;;;;;;;;;;;8041:48:80;;;;;7986:16;;8024:134;;8101:9;8122:26;8141:6;8122:18;:26::i;8024:134::-;-1:-1:-1;;;;;7985:173:80;;;-1:-1:-1;;;;;7985:173:80;;;8194:4;-1:-1:-1;;;;;8173:46:80;;8200:8;8210;8173:46;;;;;;19224:25:514;;;19280:2;19265:18;;19258:34;19212:2;19197:18;;19050:248;8173:46:80;;;;;;;;7975:253;;7951:277;-1:-1:-1;;;;;8239:16:80;;;8235:266;;-1:-1:-1;;;;;8323:46:80;;8268:16;8323:46;;;-1:-1:-1;;;;;;;;;;;8323:46:80;;;;;8268:16;;8306:127;;8381:4;8397:26;8416:6;8397:18;:26::i;8306:127::-;-1:-1:-1;;;;;8267:166:80;;;-1:-1:-1;;;;;8267:166:80;;;8469:2;-1:-1:-1;;;;;8448:44:80;;8473:8;8483;8448:44;;;;;;19224:25:514;;;19280:2;19265:18;;19258:34;19212:2;19197:18;;19050:248;8448:44:80;;;;;;;;8257:244;;7813:698;;;:::o;14291:213:444:-;14347:6;14377:16;14369:24;;14365:103;;;14416:41;;-1:-1:-1;;;14416:41:444;;14447:2;14416:41;;;18565:36:514;18617:18;;;18610:34;;;18538:18;;14416:41:444;18384:266:514;9624:196:75;9715:24;;9686:7;;9752:8;;:63;;9767:41;9781:4;9800:7;9806:1;9800:3;:7;:::i;9767:41::-;:48;-1:-1:-1;;;9767:48:75;;-1:-1:-1;;;;;9767:48:75;9752:63;;;9763:1;9745:70;9624:196;-1:-1:-1;;;9624:196:75:o;4267:178:147:-;4352:7;4374:66;4407:20;:18;:20::i;:::-;4429:10;3555:4:440;3549:11;-1:-1:-1;;;3573:23:440;;3625:4;3616:14;;3609:39;;;;3677:4;3668:14;;3661:34;3733:4;3718:20;;;3353:401;6803:260:437;6888:7;6908:17;6927:18;6947:16;6967:25;6978:4;6984:1;6987;6990;6967:10;:25::i;:::-;6907:85;;;;;;7002:28;7014:5;7021:8;7002:11;:28::i;:::-;-1:-1:-1;7047:9:437;;6803:260;-1:-1:-1;;;;;;6803:260:437:o;1168:202:146:-;-1:-1:-1;;;;;1015:37:146;;1247:15;1015:37;;;1561:66;1015:37;;;;;:39;;;;;;;;1291:16;;;1287:79;;1324:35;;-1:-1:-1;;;1324:35:146;;-1:-1:-1;;;;;19766:32:514;;1324:35:146;;;19748:51:514;19815:18;;;19808:34;;;19721:18;;1324:35:146;19574:274:514;637:698:436;693:13;742:14;759:17;770:5;759:10;:17::i;:::-;779:1;759:21;742:38;;794:20;828:6;817:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:18:436;-1:-1:-1;794:41:436;-1:-1:-1;955:28:436;;;971:2;955:28;1010:282;-1:-1:-1;;1041:5:436;-1:-1:-1;;;1175:2:436;1164:14;;1159:32;1041:5;1146:46;1236:2;1227:11;;;-1:-1:-1;1256:21:436;1010:282;1256:21;-1:-1:-1;1312:6:436;637:698;-1:-1:-1;;;637:698:436:o;777:1861:492:-;835:13;864:4;:11;879:1;864:16;860:31;;-1:-1:-1;;882:9:492;;;;;;;;;-1:-1:-1;882:9:492;;;777:1861::o;860:31::-;940:19;962:12;;;;;;;;;;;;;;;;;940:34;;1023:18;1069:1;1050:4;:11;1064:1;1050:15;;;;:::i;:::-;1049:21;;;;:::i;:::-;1044:27;;:1;:27;:::i;:::-;1023:48;-1:-1:-1;1151:20:492;1185:15;1023:48;1198:2;1185:15;:::i;:::-;1174:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1174:27:492;;1151:50;;1294:10;1286:6;1279:26;1386:1;1379:5;1375:13;1442:4;1492;1486:11;1477:7;1473:25;1585:2;1577:6;1573:15;1655:739;1674:6;1665:7;1662:19;1655:739;;;1771:1;1762:7;1758:15;1747:26;;1809:7;1803:14;1932:4;1924:5;1920:2;1916:14;1912:25;1902:8;1898:40;1892:47;1881:9;1873:67;1985:1;1974:9;1970:17;1957:30;;2063:4;2055:5;2051:2;2047:14;2043:25;2033:8;2029:40;2023:47;2012:9;2004:67;2116:1;2105:9;2101:17;2088:30;;2194:4;2186:5;2183:1;2178:14;2174:25;2164:8;2160:40;2154:47;2143:9;2135:67;2247:1;2236:9;2232:17;2219:30;;2325:4;2317:5;2305:25;2295:8;2291:40;2285:47;2274:9;2266:67;-1:-1:-1;2378:1:492;2363:17;1655:739;;;2464:1;2457:4;2451:11;2447:19;2484:1;2479:54;;;;2551:1;2546:52;;;;2440:158;;2479:54;-1:-1:-1;;;;;2495:17:492;;2488:43;2479:54;;2546:52;-1:-1:-1;;;;;2562:17:492;;2555:41;2440:158;-1:-1:-1;2625:6:492;;777:1861;-1:-1:-1;;;;;;;;777:1861:492:o;452:282:87:-;-1:-1:-1;;;;;;1121:62:87;;1096:4;1121:62;;;303:66:89;1121:62:87;;;;;;;;:70;;:62;:70;510:182;;-1:-1:-1;;;;;;556:62:87;;:49;:62;;;303:66:89;556:62:87;;;;;:69;;-1:-1:-1;;556:69:87;621:4;556:69;;;510:182;;;653:32;;-1:-1:-1;;;653:32:87;;;;;;;;;;;510:182;702:27;;-1:-1:-1;;;;;;702:27:87;;;;;;;;452:282;:::o;2560:247:128:-;2657:32;2692:23;:21;:23::i;:::-;2657:58;-1:-1:-1;2722:8:128;;;:15;2733:4;2722:8;:15;:::i;:::-;-1:-1:-1;2743:10:128;;;:19;2756:6;2743:10;:19;:::i;:::-;-1:-1:-1;3948:7:128;2768:34;;-1:-1:-1;;2560:247:128:o;2889:332:147:-;2992:28;:35;3023:4;2992:28;:35;:::i;:::-;-1:-1:-1;3033:31:147;:41;3067:7;3033:31;:41;:::i;:::-;-1:-1:-1;;3168:1:147;-1:-1:-1;;;;;;;;;;;3131:38:147;;;3175:37;:41;-1:-1:-1;2889:332:147:o;8774:90:80:-;8832:7;8854:5;8858:1;8854;:5;:::i;3151:218:444:-;3208:7;-1:-1:-1;;;;;3231:25:444;;3227:105;;;3279:42;;-1:-1:-1;;;3279:42:444;;3310:3;3279:42;;;18565:36:514;18617:18;;;18610:34;;;18538:18;;3279:42:444;18384:266:514;8515:255:80;8668:7;8677;8699:66;8710:27;8728:8;:6;:8::i;:::-;8710:27;;:17;:27::i;:::-;8739:25;8742:14;:5;:12;:14::i;:::-;8758:5;8739:2;:25;;:::i;:::-;8699:5;;:66;:10;:66::i;:::-;8692:73;;;;8515:255;;;;;;;:::o;8868:95::-;8931:7;8953:5;8957:1;8953;:5;:::i;6184:577:147:-;6234:7;6249:18;6270:13;:11;:13::i;:::-;6293:18;;6249:34;;-1:-1:-1;6293:22:147;6289:468;;6332:22;;;;;;;;6184:577;-1:-1:-1;6184:577:147:o;6289:468::-;-1:-1:-1;;;;;;;;;;;6607:34:147;6653:15;;6649:102;;6687:10;6184:577;-1:-1:-1;;6184:577:147:o;6649:102::-;6729:13;6722:20;;;;6184:577;:::o;6970:613::-;7023:7;7038:21;7062:16;:14;:16::i;:::-;7088:21;;7038:40;;-1:-1:-1;7088:25:147;7084:495;;7130:25;;;;;;;;6970:613;-1:-1:-1;6970:613:147:o;7084:495::-;7420:37;;7469:18;;7465:108;;7506:13;6970:613;-1:-1:-1;;6970:613:147:o;8587:1642:443:-;8635:7;8658:1;8663;8658:6;8654:45;;-1:-1:-1;8687:1:443;;8587:1642;-1:-1:-1;8587:1642:443:o;8654:45::-;9378:14;9412:1;9401:7;9406:1;9401:4;:7::i;:::-;:12;;9395:1;:19;;9378:36;;9873:1;9862:6;9858:1;:10;;;;;:::i;:::-;;9849:6;:19;9848:26;;9839:35;;9922:1;9911:6;9907:1;:10;;;;;:::i;:::-;;9898:6;:19;9897:26;;9888:35;;9971:1;9960:6;9956:1;:10;;;;;:::i;:::-;;9947:6;:19;9946:26;;9937:35;;10020:1;10009:6;10005:1;:10;;;;;:::i;:::-;;9996:6;:19;9995:26;;9986:35;;10069:1;10058:6;10054:1;:10;;;;;:::i;:::-;;10045:6;:19;10044:26;;10035:35;;10118:1;10107:6;10103:1;:10;;;;;:::i;:::-;;10094:6;:19;10093:26;;10084:35;;10167:1;10156:6;10152:1;:10;;;;;:::i;:::-;;10143:6;:19;10142:26;;10133:35;;10189:23;10193:6;10205;10201:1;:10;;;;;:::i;:::-;;10189:3;:23::i;11772:361:75:-;11911:7;11926:186;11939:4;11933:3;:10;11926:186;;;11953:11;11967:23;11980:3;11985:4;11967:12;:23::i;:::-;13062:28;13115:20;;;13174:4;13161:18;;11953:37;;-1:-1:-1;12002:35:75;;;;13157:28;;12002:29;;;:35;11998:108;;;12056:3;12049:10;;11998:108;;;12090:7;:3;12096:1;12090:7;:::i;:::-;12084:13;;11998:108;11945:167;11926:186;;5140:1530:437;5266:7;;;6199:66;6186:79;;6182:164;;;-1:-1:-1;6297:1:437;;-1:-1:-1;6301:30:437;;-1:-1:-1;6333:1:437;6281:54;;6182:164;6457:24;;;6440:14;6457:24;;;;;;;;;21256:25:514;;;21329:4;21317:17;;21297:18;;;21290:45;;;;21351:18;;;21344:34;;;21394:18;;;21387:34;;;6457:24:437;;21228:19:514;;6457:24:437;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6457:24:437;;-1:-1:-1;;6457:24:437;;;-1:-1:-1;;;;;;;6495:20:437;;6491:113;;-1:-1:-1;6547:1:437;;-1:-1:-1;6551:29:437;;-1:-1:-1;6547:1:437;;-1:-1:-1;6531:62:437;;6491:113;6622:6;-1:-1:-1;6630:20:437;;-1:-1:-1;6630:20:437;;-1:-1:-1;5140:1530:437;;;;;;;;;:::o;7196:532::-;7291:20;7282:5;:29;;;;;;;;:::i;:::-;;7278:444;;7196:532;;:::o;7278:444::-;7387:29;7378:5;:38;;;;;;;;:::i;:::-;;7374:348;;7439:23;;-1:-1:-1;;;7439:23:437;;;;;;;;;;;7374:348;7492:35;7483:5;:44;;;;;;;;:::i;:::-;;7479:243;;7550:46;;-1:-1:-1;;;7550:46:437;;;;;1746:25:514;;;1719:18;;7550:46:437;1600:177:514;7479:243:437;7626:30;7617:5;:39;;;;;;;;:::i;:::-;;7613:109;;7679:32;;-1:-1:-1;;;7679:32:437;;;;;1746:25:514;;;1719:18;;7679:32:437;1600:177:514;12214:916:443;12267:7;;-1:-1:-1;;;12342:17:443;;12338:103;;-1:-1:-1;;;12379:17:443;;;-1:-1:-1;12424:2:443;12414:12;12338:103;12467:8;12458:5;:17;12454:103;;12504:8;12495:17;;;-1:-1:-1;12540:2:443;12530:12;12454:103;12583:8;12574:5;:17;12570:103;;12620:8;12611:17;;;-1:-1:-1;12656:2:443;12646:12;12570:103;12699:7;12690:5;:16;12686:100;;12735:7;12726:16;;;-1:-1:-1;12770:1:443;12760:11;12686:100;12812:7;12803:5;:16;12799:100;;12848:7;12839:16;;;-1:-1:-1;12883:1:443;12873:11;12799:100;12925:7;12916:5;:16;12912:100;;12961:7;12952:16;;;-1:-1:-1;12996:1:443;12986:11;12912:100;13038:7;13029:5;:16;13025:66;;13075:1;13065:11;13117:6;12214:916;-1:-1:-1;;12214:916:443:o;7623:172:75:-;7721:7;;7752:38;7760:4;7779:3;7784:5;7752:7;:38::i;10699:983:443:-;10751:7;;10835:3;10826:12;;;:16;10822:99;;10872:3;10862:13;;;;10893;10822:99;10947:2;10938:11;;;:15;10934:96;;10983:2;10973:12;;;;11003;10934:96;11056:2;11047:11;;;:15;11043:96;;11092:2;11082:12;;;;11112;11043:96;11165:2;11156:11;;;:15;11152:96;;11201:2;11191:12;;;;11221;11152:96;11274:1;11265:10;;;:14;11261:93;;11309:1;11299:11;;;;11328;11261:93;11380:1;11371:10;;;:14;11367:93;;11415:1;11405:11;;;;11434;11367:93;11486:1;11477:10;;;:14;11473:93;;11521:1;11511:11;;;;11540;11473:93;11592:1;11583:10;;;:14;11579:64;;11627:1;11617:11;11669:6;10699:983;-1:-1:-1;;10699:983:443:o;2557:104::-;2615:7;2645:1;2641;:5;:13;;2653:1;2641:13;;;-1:-1:-1;2649:1:443;;2557:104;-1:-1:-1;2557:104:443:o;2774:153::-;2836:7;2909:11;2919:1;2910:5;;;2909:11;:::i;:::-;2899:21;;2900:5;;;2899:21;:::i;10688:752:75:-;10833:11;;10795:7;;;;10855;;10851:585;;10918:25;10946:28;10960:4;10966:7;10972:1;10966:3;:7;:::i;10946:28::-;10918:56;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10918:56:75;;;-1:-1:-1;;;;;10918:56:75;;;;;;;-1:-1:-1;11040:16:75;;;-1:-1:-1;11040:16:75;11032:56;;;;-1:-1:-1;;;11032:56:75;;21766:2:514;11032:56:75;;;21748:21:514;21805:2;21785:18;;;21778:30;21844:29;21824:18;;;21817:57;21891:18;;11032:56:75;21564:351:514;11032:56:75;11140:9;;:16;;;;;;;11136:161;;11206:5;11168:28;11182:4;11188:7;11194:1;11188:3;:7;:::i;11168:28::-;:43;;-1:-1:-1;;;;;11168:43:75;;;;-1:-1:-1;;;11168:43:75;;;;;;;;;;;11136:161;;;11246:41;;;;;;;;;;;;;;;-1:-1:-1;;;;;11246:41:75;;;;;;;;;;11236:52;;;;;;;-1:-1:-1;11236:52:75;;;;;;;;;;;;;;-1:-1:-1;;;11236:52:75;;;;;;;;;;11136:161;11312:11;;;;-1:-1:-1;11325:5:75;;-1:-1:-1;11304:27:75;;-1:-1:-1;11304:27:75;10851:585;-1:-1:-1;;11362:41:75;;;;;;;;;;;;;;;-1:-1:-1;;;;;11362:41:75;;;;;;;;;;11352:52;;;;;;;-1:-1:-1;11352:52:75;;;;;;;;;;;;;-1:-1:-1;;;11352:52:75;;;;;;;;;;;;-1:-1:-1;;11396:5:75;11412:17;;14:250:514;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:514;238:16;;231:27;14:250::o;269:271::-;311:3;349:5;343:12;376:6;371:3;364:19;392:76;461:6;454:4;449:3;445:14;438:4;431:5;427:16;392:76;:::i;:::-;522:2;501:15;-1:-1:-1;;497:29:514;488:39;;;;529:4;484:50;;269:271;-1:-1:-1;;269:271:514:o;545:220::-;694:2;683:9;676:21;657:4;714:45;755:2;744:9;740:18;732:6;714:45;:::i;770:180::-;829:6;882:2;870:9;861:7;857:23;853:32;850:52;;;898:1;895;888:12;850:52;-1:-1:-1;921:23:514;;770:180;-1:-1:-1;770:180:514:o;1163:173::-;1231:20;;-1:-1:-1;;;;;1280:31:514;;1270:42;;1260:70;;1326:1;1323;1316:12;1260:70;1163:173;;;:::o;1341:254::-;1409:6;1417;1470:2;1458:9;1449:7;1445:23;1441:32;1438:52;;;1486:1;1483;1476:12;1438:52;1509:29;1528:9;1509:29;:::i;:::-;1499:39;1585:2;1570:18;;;;1557:32;;-1:-1:-1;;;1341:254:514:o;1782:328::-;1859:6;1867;1875;1928:2;1916:9;1907:7;1903:23;1899:32;1896:52;;;1944:1;1941;1934:12;1896:52;1967:29;1986:9;1967:29;:::i;:::-;1957:39;;2015:38;2049:2;2038:9;2034:18;2015:38;:::i;:::-;2005:48;;2100:2;2089:9;2085:18;2072:32;2062:42;;1782:328;;;;;:::o;2297:127::-;2358:10;2353:3;2349:20;2346:1;2339:31;2389:4;2386:1;2379:15;2413:4;2410:1;2403:15;2429:632;2494:5;2524:18;2565:2;2557:6;2554:14;2551:40;;;2571:18;;:::i;:::-;2646:2;2640:9;2614:2;2700:15;;-1:-1:-1;;2696:24:514;;;2722:2;2692:33;2688:42;2676:55;;;2746:18;;;2766:22;;;2743:46;2740:72;;;2792:18;;:::i;:::-;2832:10;2828:2;2821:22;2861:6;2852:15;;2891:6;2883;2876:22;2931:3;2922:6;2917:3;2913:16;2910:25;2907:45;;;2948:1;2945;2938:12;2907:45;2998:6;2993:3;2986:4;2978:6;2974:17;2961:44;3053:1;3046:4;3037:6;3029;3025:19;3021:30;3014:41;;;;2429:632;;;;;:::o;3066:222::-;3109:5;3162:3;3155:4;3147:6;3143:17;3139:27;3129:55;;3180:1;3177;3170:12;3129:55;3202:80;3278:3;3269:6;3256:20;3249:4;3241:6;3237:17;3202:80;:::i;3293:617::-;3390:6;3398;3406;3459:2;3447:9;3438:7;3434:23;3430:32;3427:52;;;3475:1;3472;3465:12;3427:52;3498:29;3517:9;3498:29;:::i;:::-;3488:39;;3578:2;3567:9;3563:18;3550:32;3601:18;3642:2;3634:6;3631:14;3628:34;;;3658:1;3655;3648:12;3628:34;3681:50;3723:7;3714:6;3703:9;3699:22;3681:50;:::i;:::-;3671:60;;3784:2;3773:9;3769:18;3756:32;3740:48;;3813:2;3803:8;3800:16;3797:36;;;3829:1;3826;3819:12;3797:36;;3852:52;3896:7;3885:8;3874:9;3870:24;3852:52;:::i;:::-;3842:62;;;3293:617;;;;;:::o;3915:186::-;3974:6;4027:2;4015:9;4006:7;4002:23;3998:32;3995:52;;;4043:1;4040;4033:12;3995:52;4066:29;4085:9;4066:29;:::i;4106:677::-;4283:2;4272:9;4265:21;4246:4;4321:6;4315:13;4364:4;4359:2;4348:9;4344:18;4337:32;4392:52;4439:3;4428:9;4424:19;4410:12;4392:52;:::i;:::-;4378:66;;4493:2;4485:6;4481:15;4475:22;4565:2;4561:7;4549:9;4541:6;4537:22;4533:36;4528:2;4517:9;4513:18;4506:64;4593:41;4627:6;4611:14;4593:41;:::i;:::-;4579:55;;;4688:2;4680:6;4676:15;4670:22;4665:2;4654:9;4650:18;4643:50;4749:2;4741:6;4737:15;4731:22;4724:4;4713:9;4709:20;4702:52;4771:6;4763:14;;;4106:677;;;;:::o;4788:1259::-;5194:3;5189;5185:13;5177:6;5173:26;5162:9;5155:45;5136:4;5219:2;5257:3;5252:2;5241:9;5237:18;5230:31;5284:46;5325:3;5314:9;5310:19;5302:6;5284:46;:::i;:::-;5378:9;5370:6;5366:22;5361:2;5350:9;5346:18;5339:50;5412:33;5438:6;5430;5412:33;:::i;:::-;5476:2;5461:18;;5454:34;;;-1:-1:-1;;;;;5525:32:514;;5519:3;5504:19;;5497:61;5545:3;5574:19;;5567:35;;;5639:22;;;5633:3;5618:19;;5611:51;5711:13;;5733:22;;;5783:2;5809:15;;;;-1:-1:-1;5771:15:514;;;;-1:-1:-1;5852:169:514;5866:6;5863:1;5860:13;5852:169;;;5927:13;;5915:26;;5996:15;;;;5961:12;;;;5888:1;5881:9;5852:169;;;-1:-1:-1;6038:3:514;;4788:1259;-1:-1:-1;;;;;;;;;;;;4788:1259:514:o;6253:617::-;6350:6;6358;6366;6419:2;6407:9;6398:7;6394:23;6390:32;6387:52;;;6435:1;6432;6425:12;6387:52;6475:9;6462:23;6504:18;6545:2;6537:6;6534:14;6531:34;;;6561:1;6558;6551:12;6531:34;6584:50;6626:7;6617:6;6606:9;6602:22;6584:50;:::i;:::-;6574:60;;6687:2;6676:9;6672:18;6659:32;6643:48;;6716:2;6706:8;6703:16;6700:36;;;6732:1;6729;6722:12;6700:36;;6755:52;6799:7;6788:8;6777:9;6773:24;6755:52;:::i;:::-;6745:62;;;6826:38;6860:2;6849:9;6845:18;6826:38;:::i;:::-;6816:48;;6253:617;;;;;:::o;6875:347::-;6940:6;6948;7001:2;6989:9;6980:7;6976:23;6972:32;6969:52;;;7017:1;7014;7007:12;6969:52;7040:29;7059:9;7040:29;:::i;:::-;7030:39;;7119:2;7108:9;7104:18;7091:32;7166:5;7159:13;7152:21;7145:5;7142:32;7132:60;;7188:1;7185;7178:12;7132:60;7211:5;7201:15;;;6875:347;;;;;:::o;7227:667::-;7322:6;7330;7338;7346;7399:3;7387:9;7378:7;7374:23;7370:33;7367:53;;;7416:1;7413;7406:12;7367:53;7439:29;7458:9;7439:29;:::i;:::-;7429:39;;7487:38;7521:2;7510:9;7506:18;7487:38;:::i;:::-;7477:48;;7572:2;7561:9;7557:18;7544:32;7534:42;;7627:2;7616:9;7612:18;7599:32;7654:18;7646:6;7643:30;7640:50;;;7686:1;7683;7676:12;7640:50;7709:22;;7762:4;7754:13;;7750:27;-1:-1:-1;7740:55:514;;7791:1;7788;7781:12;7740:55;7814:74;7880:7;7875:2;7862:16;7857:2;7853;7849:11;7814:74;:::i;:::-;7804:84;;;7227:667;;;;;;;:::o;7899:618::-;8001:6;8009;8017;8025;8033;8041;8094:3;8082:9;8073:7;8069:23;8065:33;8062:53;;;8111:1;8108;8101:12;8062:53;8134:29;8153:9;8134:29;:::i;:::-;8124:39;;8210:2;8199:9;8195:18;8182:32;8172:42;;8261:2;8250:9;8246:18;8233:32;8223:42;;8315:2;8304:9;8300:18;8287:32;8359:4;8352:5;8348:16;8341:5;8338:27;8328:55;;8379:1;8376;8369:12;8328:55;7899:618;;;;-1:-1:-1;7899:618:514;;8454:3;8439:19;;8426:33;;8506:3;8491:19;;;8478:33;;-1:-1:-1;7899:618:514;-1:-1:-1;;7899:618:514:o;8522:543::-;8610:6;8618;8671:2;8659:9;8650:7;8646:23;8642:32;8639:52;;;8687:1;8684;8677:12;8639:52;8727:9;8714:23;8756:18;8797:2;8789:6;8786:14;8783:34;;;8813:1;8810;8803:12;8783:34;8836:50;8878:7;8869:6;8858:9;8854:22;8836:50;:::i;:::-;8826:60;;8939:2;8928:9;8924:18;8911:32;8895:48;;8968:2;8958:8;8955:16;8952:36;;;8984:1;8981;8974:12;8952:36;;9007:52;9051:7;9040:8;9029:9;9025:24;9007:52;:::i;:::-;8997:62;;;8522:543;;;;;:::o;9070:743::-;9177:6;9185;9193;9246:2;9234:9;9225:7;9221:23;9217:32;9214:52;;;9262:1;9259;9252:12;9214:52;9302:9;9289:23;9331:18;9372:2;9364:6;9361:14;9358:34;;;9388:1;9385;9378:12;9358:34;9411:50;9453:7;9444:6;9433:9;9429:22;9411:50;:::i;:::-;9401:60;;9514:2;9503:9;9499:18;9486:32;9470:48;;9543:2;9533:8;9530:16;9527:36;;;9559:1;9556;9549:12;9818:260;9886:6;9894;9947:2;9935:9;9926:7;9922:23;9918:32;9915:52;;;9963:1;9960;9953:12;9915:52;9986:29;10005:9;9986:29;:::i;:::-;9976:39;;10034:38;10068:2;10057:9;10053:18;10034:38;:::i;:::-;10024:48;;9818:260;;;;;:::o;10275:380::-;10354:1;10350:12;;;;10397;;;10418:61;;10472:4;10464:6;10460:17;10450:27;;10418:61;10525:2;10517:6;10514:14;10494:18;10491:38;10488:161;;10571:10;10566:3;10562:20;10559:1;10552:31;10606:4;10603:1;10596:15;10634:4;10631:1;10624:15;11539:543;11641:2;11636:3;11633:11;11630:446;;;11677:1;11701:5;11698:1;11691:16;11745:4;11742:1;11732:18;11815:2;11803:10;11799:19;11796:1;11792:27;11786:4;11782:38;11851:4;11839:10;11836:20;11833:47;;;-1:-1:-1;11874:4:514;11833:47;11929:2;11924:3;11920:12;11917:1;11913:20;11907:4;11903:31;11893:41;;11984:82;12002:2;11995:5;11992:13;11984:82;;;12047:17;;;12028:1;12017:13;11984:82;;12258:1345;12384:3;12378:10;12411:18;12403:6;12400:30;12397:56;;;12433:18;;:::i;:::-;12462:97;12552:6;12512:38;12544:4;12538:11;12512:38;:::i;:::-;12506:4;12462:97;:::i;:::-;12614:4;;12671:2;12660:14;;12688:1;12683:663;;;;13390:1;13407:6;13404:89;;;-1:-1:-1;13459:19:514;;;13453:26;13404:89;-1:-1:-1;;12215:1:514;12211:11;;;12207:24;12203:29;12193:40;12239:1;12235:11;;;12190:57;13506:81;;12653:944;;12683:663;11486:1;11479:14;;;11523:4;11510:18;;-1:-1:-1;;12719:20:514;;;12837:236;12851:7;12848:1;12845:14;12837:236;;;12940:19;;;12934:26;12919:42;;13032:27;;;;13000:1;12988:14;;;;12867:19;;12837:236;;;12841:3;13101:6;13092:7;13089:19;13086:201;;;13162:19;;;13156:26;-1:-1:-1;;13245:1:514;13241:14;;;13257:3;13237:24;13233:37;13229:42;13214:58;13199:74;;13086:201;-1:-1:-1;;;;;13333:1:514;13317:14;;;13313:22;13300:36;;-1:-1:-1;12258:1345:514:o;14310:489::-;-1:-1:-1;;;;;14579:15:514;;;14561:34;;14631:15;;14626:2;14611:18;;14604:43;14678:2;14663:18;;14656:34;;;14726:3;14721:2;14706:18;;14699:31;;;14504:4;;14747:46;;14773:19;;14765:6;14747:46;:::i;:::-;14739:54;14310:489;-1:-1:-1;;;;;;14310:489:514:o;14804:290::-;14873:6;14926:2;14914:9;14905:7;14901:23;14897:32;14894:52;;;14942:1;14939;14932:12;14894:52;14968:16;;-1:-1:-1;;;;;;15013:32:514;;15003:43;;14993:71;;15060:1;15057;15050:12;15874:1545;-1:-1:-1;;;16523:43:514;;16589:13;;16505:3;;16611:74;16589:13;16674:1;16665:11;;16658:4;16646:17;;16611:74;:::i;:::-;-1:-1:-1;;;16744:1:514;16704:16;;;16736:10;;;16729:54;16808:13;;16830:76;16808:13;16892:2;16884:11;;16877:4;16865:17;;16830:76;:::i;:::-;16971:66;16966:2;16925:17;;;;16958:11;;;16951:87;17067:66;17062:2;17054:11;;17047:87;-1:-1:-1;;;17158:2:514;17150:11;;17143:49;17217:13;;17239:76;17217:13;17301:2;17293:11;;17286:4;17274:17;;17239:76;:::i;:::-;-1:-1:-1;;;17375:2:514;17334:17;;;;17367:11;;;17360:26;17410:2;17402:11;;15874:1545;-1:-1:-1;;;;;15874:1545:514:o;17424:461::-;17686:31;17681:3;17674:44;17656:3;17747:6;17741:13;17763:75;17831:6;17826:2;17821:3;17817:12;17810:4;17802:6;17798:17;17763:75;:::i;:::-;17858:16;;;;17876:2;17854:25;;17424:461;-1:-1:-1;;17424:461:514:o;18655:127::-;18716:10;18711:3;18707:20;18704:1;18697:31;18747:4;18744:1;18737:15;18771:4;18768:1;18761:15;18787:128;18854:9;;;18875:11;;;18872:37;;;18889:18;;:::i;18920:125::-;18985:9;;;19006:10;;;19003:36;;;19019:18;;:::i;19853:127::-;19914:10;19909:3;19905:20;19902:1;19895:31;19945:4;19942:1;19935:15;19969:4;19966:1;19959:15;19985:217;20025:1;20051;20041:132;;20095:10;20090:3;20086:20;20083:1;20076:31;20130:4;20127:1;20120:15;20158:4;20155:1;20148:15;20041:132;-1:-1:-1;20187:9:514;;19985:217::o;20207:168::-;20280:9;;;20311;;20328:15;;;20322:22;;20308:37;20298:71;;20349:18;;:::i;20380:182::-;-1:-1:-1;;;;;20487:10:514;;;20499;;;20483:27;;20522:11;;;20519:37;;;20536:18;;:::i;:::-;20519:37;20380:182;;;;:::o;20839:185::-;-1:-1:-1;;;;;20960:10:514;;;20948;;;20944:27;;20983:12;;;20980:38;;;20998:18;;:::i;21432:127::-;21493:10;21488:3;21484:20;21481:1;21474:31;21524:4;21521:1;21514:15;21548:4;21545:1;21538:15","linkReferences":{}},"methodIdentifiers":{"CLOCK_MODE()":"4bf5d7e9","DOMAIN_SEPARATOR()":"3644e515","__ERC721A_init(string,string)":"d2f01f19","__SpaceOwner_init(string,string,string)":"d7a901d3","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","clock()":"91ddadf4","delegate(address)":"5c19a95c","delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)":"c3cda520","delegates(address)":"587cde1e","eip712Domain()":"84b0196e","getApproved(uint256)":"081812fc","getFactory()":"88cc58e4","getPastTotalSupply(uint256)":"8e539e8c","getPastVotes(address,uint256)":"3a46b1a8","getSpaceInfo(address)":"6a9a38e6","getVotes(address)":"9ab24eb0","isApprovedForAll(address,address)":"e985e9c5","mintSpace(string,string,address)":"91de4a83","name()":"06fdde03","nextTokenId()":"75794a3c","nonces(address)":"7ecebe00","ownerOf(uint256)":"6352211e","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setFactory(address)":"5bb47808","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","totalSupply()":"18160ddd","transferFrom(address,address,uint256)":"23b872dd","updateSpaceInfo(address,string,string)":"3953801b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AlreadyDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlreadyEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BalanceQueryForZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GuardianEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initializable_AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"currentNonce\",\"type\":\"uint256\"}],\"name\":\"InvalidAccountNonce\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintERC2309QuantityExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintZeroQuantity\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotExternalAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnershipNotInitializedForExtraData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"bits\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SafeCastOverflowedUintDowncast\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SpaceOwner__OnlyFactoryAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SpaceOwner__OnlySpaceOwnerAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFromIncorrectOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC721ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"URIQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Validator__InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Validator__InvalidStringLength\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"toTokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"ConsecutiveTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"cooldown\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"GuardianUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"}],\"name\":\"SpaceOwner__SetFactory\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"space\",\"type\":\"address\"}],\"name\":\"SpaceOwner__UpdateSpace\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CLOCK_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"result\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"name\":\"__ERC721A_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"}],\"name\":\"__SpaceOwner_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clock\",\"outputs\":[{\"internalType\":\"uint48\",\"name\":\"\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFactory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timepoint\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"timepoint\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"space\",\"type\":\"address\"}],\"name\":\"getSpaceInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"}],\"internalType\":\"struct ISpaceOwnerBase.Space\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"space\",\"type\":\"address\"}],\"name\":\"mintSpace\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextTokenId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"result\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"}],\"name\":\"setFactory\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"space\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"name\":\"updateSpaceInfo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ECDSAInvalidSignature()\":[{\"details\":\"The signature derives the `address(0)`.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}],\"InvalidAccountNonce(address,uint256)\":[{\"details\":\"The nonce used for an `account` is not the expected current nonce.\"}],\"SafeCastOverflowedUintDowncast(uint8,uint256)\":[{\"details\":\"Value doesn't fit in an uint of `bits` size.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"ConsecutiveTransfer(uint256,uint256,address,address)\":{\"details\":\"Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, as defined in the [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. See {_mintERC2309} for more details.\"},\"DelegateChanged(address,address,address)\":{\"details\":\"Emitted when an account changes their delegate.\"},\"DelegateVotesChanged(address,uint256,uint256)\":{\"details\":\"Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\"},\"EIP712DomainChanged()\":{\"details\":\"MAY be emitted to signal that the domain could have changed.\"},\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"CLOCK_MODE()\":{\"details\":\"Description of the clock\"},\"approve(address,uint256)\":{\"details\":\"Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator.\"},\"balanceOf(address)\":{\"details\":\"Returns the number of tokens in `owner`'s account.\"},\"clock()\":{\"details\":\"Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\"},\"delegate(address)\":{\"details\":\"Delegates votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`.\"},\"delegates(address)\":{\"details\":\"Returns the delegate that `account` has chosen.\"},\"eip712Domain()\":{\"details\":\"See {EIP-5267}. _Available since v4.9._\"},\"getApproved(uint256)\":{\"details\":\"Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist.\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Returns the total supply of votes available at a specific moment in the past. If the `clock()` is configured to use block numbers, this will return the value at the end of the corresponding block. NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. Votes that have not been delegated are still part of total supply, even though they would not participate in a vote.\"},\"getPastVotes(address,uint256)\":{\"details\":\"Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is configured to use block numbers, this will return the value at the end of the corresponding block.\"},\"getSpaceInfo(address)\":{\"params\":{\"space\":\"The address of the space\"},\"returns\":{\"_0\":\"space The space info\"}},\"getVotes(address)\":{\"details\":\"Returns the current amount of votes that `account` has.\"},\"isApprovedForAll(address,address)\":{\"details\":\"Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}.\"},\"mintSpace(string,string,address)\":{\"details\":\"Only the factory is allowed to mint spaces\",\"params\":{\"name\":\"The name of the space\",\"space\":\"The address of the space\",\"uri\":\"The URI of the space\"},\"returns\":{\"tokenId\":\"The token id of the minted space\"}},\"name()\":{\"details\":\"Returns the token collection name.\"},\"ownerOf(uint256)\":{\"details\":\"Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Equivalent to `safeTransferFrom(from, to, tokenId, '')`.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event.\"},\"symbol()\":{\"details\":\"Returns the token collection symbol.\"},\"tokenURI(uint256)\":{\"details\":\"Returns the Uniform Resource Identifier (URI) for `tokenId` token.\"},\"totalSupply()\":{\"details\":\"Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event.\"},\"updateSpaceInfo(address,string,string)\":{\"details\":\"Only the space owner is allowed to update the space info\",\"params\":{\"name\":\"The name of the space\",\"space\":\"The address of the space\",\"uri\":\"The URI of the space\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ApprovalCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"ApprovalQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"BalanceQueryForZeroAddress()\":[{\"notice\":\"Cannot query the balance for the zero address.\"}],\"MintERC2309QuantityExceedsLimit()\":[{\"notice\":\"The `quantity` minted with ERC2309 exceeds the safety limit.\"}],\"MintToZeroAddress()\":[{\"notice\":\"Cannot mint to the zero address.\"}],\"MintZeroQuantity()\":[{\"notice\":\"The quantity of tokens minted must be more than zero.\"}],\"OwnerQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}],\"OwnershipNotInitializedForExtraData()\":[{\"notice\":\"The `extraData` cannot be set on an unintialized ownership slot.\"}],\"TransferCallerNotOwnerNorApproved()\":[{\"notice\":\"The caller must own the token or be an approved operator.\"}],\"TransferFromIncorrectOwner()\":[{\"notice\":\"The token must be owned by `from`.\"}],\"TransferToNonERC721ReceiverImplementer()\":[{\"notice\":\"Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"notice\":\"Cannot transfer to the zero address.\"}],\"URIQueryForNonexistentToken()\":[{\"notice\":\"The token does not exist.\"}]},\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{\"getFactory()\":{\"notice\":\"Get the factory address\"},\"getSpaceInfo(address)\":{\"notice\":\"Get the space info\"},\"mintSpace(string,string,address)\":{\"notice\":\"Mint a space\"},\"nextTokenId()\":{\"notice\":\"Get the next token id that will be used to mint a space\"},\"setFactory(address)\":{\"notice\":\"Set the factory address that is allowed to mint spaces\"},\"updateSpaceInfo(address,string,string)\":{\"notice\":\"Update the space info\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/facets/owner/SpaceOwner.sol\":\"SpaceOwner\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/governance/votes/Checkpoints.sol\":{\"keccak256\":\"0x4b98db2e67e47ec59caa78fade51e9ec6fa33ee2592e46fed09d9167ebe76c8a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://72ec6949ee33fb9c137bba362b94af699762fadd66334128d1dd0dbcd4301bc6\",\"dweb:/ipfs/QmQybe6k5K3gss4zzCPqoba6ZBZE5p8KJRoQ2RzkE91JRV\"]},\"contracts/src/diamond/facets/governance/votes/IERC5805.sol\":{\"keccak256\":\"0x8b3b84026610f99bcac6139359305a46c537edf377e44771b904c2bd35719ee3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://49a8e7af9b47b6bbd794ccb50380b8f9e9b84561d62bcbf16843dde55bab86e6\",\"dweb:/ipfs/QmdBdYxvhwCwtqW9DfPa6Bw5PrYdzhuKQyJv4vcLsttqrV\"]},\"contracts/src/diamond/facets/governance/votes/IERC6372.sol\":{\"keccak256\":\"0xc3fa5c25bdd3db6126e04897496889e68a65749b050ae8fede0ff80e322aca86\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bcf56ae1474c9a3032f8b15b1bbbeeb50ac21c574047f846673d4aca9bf82db4\",\"dweb:/ipfs/Qmcce1zD6TBWiMLXMDsFF6bUrwtVtharjwvAbtkMmoYRgd\"]},\"contracts/src/diamond/facets/governance/votes/IVotes.sol\":{\"keccak256\":\"0xe84a920ea7070bafd35afb05c057801a466ba5d9a0db10be3e31720a1db1f2e6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://72415e259038afac01a7e76dd74d31243518514e58fe01fd7a6a38f93dd8247b\",\"dweb:/ipfs/QmdS8GkX9Ze4rHp2JQ8Va1DMWHaqxQLCjGD8hVVR5KyMVS\"]},\"contracts/src/diamond/facets/governance/votes/Votes.sol\":{\"keccak256\":\"0x36ca9d8aa95a21f2812aa1f2a3712d4acecd78476d8e50900566cc233a54eefa\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0d910d09517696658fe1cb4291fca5f66cc0b7fd4605f2a4ad70f9c7c494206c\",\"dweb:/ipfs/QmVrcYUZPgbxfQkqXkEdnUFJ81XenXt8hbmDvXBnVyTpDS\"]},\"contracts/src/diamond/facets/governance/votes/VotesBase.sol\":{\"keccak256\":\"0x3234078063b2070a77f1b03e1d96e8c5a958450a70373df02cc0bdb51b69ccb8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6d66c3f430cf100ff52dbc614f6982e405996957b60b8de49f6e59bca7dc566f\",\"dweb:/ipfs/QmRKp88BWBr4Pzf4CnW2wWBkERVLMPEnVeZhxizc8tJXBN\"]},\"contracts/src/diamond/facets/governance/votes/VotesStorage.sol\":{\"keccak256\":\"0x2e1a1db6e37ca9a1552edfd2be03d6069e9858996ea1fe0387dd4f35d58455be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://723c3880d012108f1f442d89f972de200ef9033f1c3179bfa56054740e028fa6\",\"dweb:/ipfs/QmNxcE6H6Db93XzPepQ2xdPrgZkusCrV9LEq9rPvSPq3UT\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/OwnableBase.sol\":{\"keccak256\":\"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4\",\"dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa\"]},\"contracts/src/diamond/facets/ownable/OwnableStorage.sol\":{\"keccak256\":\"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105\",\"dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721A.sol\":{\"keccak256\":\"0xc8fab662d9a0c4e697c8dcaad72dd2a190331b01476649a742b6f317266ac5a1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://9c84047a6d47a901f45f90f12f713432289ae6d88fea95a383900906005cf70b\",\"dweb:/ipfs/QmVdLUVdtjTQn2fCG85Uv2ZAzCSfNbWYcAg5eXthunnigc\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol\":{\"keccak256\":\"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa\",\"dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W\"]},\"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol\":{\"keccak256\":\"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c\",\"dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu\"]},\"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol\":{\"keccak256\":\"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e\",\"dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM\"]},\"contracts/src/diamond/utils/Context.sol\":{\"keccak256\":\"0xbace3785343657020bee8dc579fec3a7f18741e5ddfaea001903f7ed087c5b8a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://df02a2fa496a45ceecd157bfed9d8e093b4ff236d3f83e89453cf0656b5c018d\",\"dweb:/ipfs/QmarCnWB7CNimfnNr51p2QBzdwpqbRAkgQncnA2c8kz7KR\"]},\"contracts/src/diamond/utils/Nonces.sol\":{\"keccak256\":\"0xce0cce96c8f30e4052523e2c67c7b08ed9defa8c2e3858d4534b359be9ee9ee3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://caae09675d571304907f51e64c255981c5fbfbd60bf26d0117c00ecd7ed7a7fb\",\"dweb:/ipfs/QmPNReTvJDZ242duATLyDDt1JUUd2ACg472E1vftw5zgXB\"]},\"contracts/src/diamond/utils/cryptography/EIP712.sol\":{\"keccak256\":\"0x4bc6ac914b47d64b899510e901545369b2b1c292fb392500c3fcc09bb13fbf21\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e7bd2f9bf25d82ff5f45c8075254dba48bcff67b1d6f1b5ab91d1b17a1d9f624\",\"dweb:/ipfs/QmegqbdjZy6DfKNzZHQ1rGJ67w4SaXUz6w3ZL8mrWkwQ5d\"]},\"contracts/src/diamond/utils/cryptography/IERC5267.sol\":{\"keccak256\":\"0x1369ee10d9df0a2700fdf659db717f7c6beae8b2e7173212ec4ed70909f86d50\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f43717adb31aaac44770deac2c689bc45472b9f752614ae32c9efe2013b2d42f\",\"dweb:/ipfs/Qmba5h3jR9Lenn5LRFwxfeEEiZMHqp8wnbX4FTfTtMxqHt\"]},\"contracts/src/spaces/facets/guardian/GuardianBase.sol\":{\"keccak256\":\"0x380bbefb6d29266ce37efcc247b355a714485e21e2c3a6789f81226c36d8ac41\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7c9512890c4dd3dddc10ac94bdd747c4e49d6e9eb6ebf808eb017eda1733221a\",\"dweb:/ipfs/QmWwocwLuRiKzqJoNdLPmxpEH34H2sBfMTH7iU4aFkW8Kj\"]},\"contracts/src/spaces/facets/guardian/GuardianStorage.sol\":{\"keccak256\":\"0xd8af0e2ff9c26165cd30e16eb881b2a58acff8f7f61bfac1b90dc6362f14dd63\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e06464b1498f896ad0c62ca19aed21f7667e36ebd0f77cb1831e0a60fb373688\",\"dweb:/ipfs/QmTFenitEo2y4UE3F4qtX1DfoBoEMs1pmtL1AmoeohTpw8\"]},\"contracts/src/spaces/facets/guardian/IGuardian.sol\":{\"keccak256\":\"0x9898180a058f5d922141026a1266008c9d7883a9863549ab76d8218123be6c19\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3481a5ced56b71d2b5e8bbc6bce46d80eb8161fb9195fb232272a442d015323b\",\"dweb:/ipfs/QmV6LvhxezH6PJw1gfV7DgAyHUpGd2GN56w6G9n83vGxa3\"]},\"contracts/src/spaces/facets/owner/ISpaceOwner.sol\":{\"keccak256\":\"0xf68eb1b3aceeacc0c4162304f74d89890e8c641a9c0778c1786db850a79cfb3f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8a345161f4d34be281c5f4d165dac958ed3a5e7d2888924d498555871906e6ea\",\"dweb:/ipfs/QmQcWfQ6k54UPr9eMA2KnXCJAc4NR24LhzbmyA5NUKBVN3\"]},\"contracts/src/spaces/facets/owner/SpaceOwner.sol\":{\"keccak256\":\"0x8a644478b3bcfb18fda9c887838d710e59c7c5a2ed7003dcda5ab479f2fefe9c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://640e9b7eebba29735acc6b96ebe107a58db8af60ffb84c1b580a1b7e041e9393\",\"dweb:/ipfs/QmVeuTQ87BVjzZc7FaVwrbz82PVCWkXNjz1sYBzeYRi3h7\"]},\"contracts/src/spaces/facets/owner/SpaceOwnerBase.sol\":{\"keccak256\":\"0xd4eda8665f05e74b37a99b21157baa102660d9143e6b45cc6800bbf795299ad2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://74c3e6034a8f74c315d6790c423b1083c8a9a468f76e3d9b93e86afc8143e7c1\",\"dweb:/ipfs/QmcZ8TV2rAmwQx2aRSvhRQmcevZYCWWxD4KUnyYteN2Qax\"]},\"contracts/src/spaces/facets/owner/SpaceOwnerStorage.sol\":{\"keccak256\":\"0xae80a53a918d9bd4b064aaeac74a8697a12f669e815f2fbd00385d3b82f39026\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://497ae2aeb902efd34779b277320544f2c194889b2df926614e19f3cbfc1e787f\",\"dweb:/ipfs/QmPNLznGfzdidEhCokiEFppJa6faPNNnFGt1Y43X3qrs6B\"]},\"contracts/src/spaces/facets/owner/SpaceOwnerUriBase.sol\":{\"keccak256\":\"0xf24d932787ab9862d27eba5d8b687644a95319aaa33141cc76f167f38d2bebf4\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8abc2878482017106e2cde6fa036ce74b8e8c434ea6ebc1915b2bbade66cfcde\",\"dweb:/ipfs/QmXEzY6CXnLZndoM6i27ewqCseR2sdArjCjyZXvg5y1TZy\"]},\"contracts/src/utils/Validator.sol\":{\"keccak256\":\"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64\",\"dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453\",\"dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i\"]},\"lib/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c\",\"dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF\"]},\"lib/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\":{\"keccak256\":\"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c\",\"dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875\",\"dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L\"]},\"lib/@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0xe19a4d5f31d2861e7344e8e535e2feafb913d806d3e2b5fe7782741a2a7094fe\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4aed79c0fa6f0546ed02f2f683e8f77f0fd2ed7eb34d8bbf3d373c9a6d95b13c\",\"dweb:/ipfs/QmWqVz6UAVqmnWU5pqYPt1o6iDEZyPaBraAA3rKfTTSfYj\"]},\"lib/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc\",\"dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT\"]},\"lib/base64/base64.sol\":{\"keccak256\":\"0xa73959e6ef0b693e4423a562e612370160b934a75e618361ddd8c9c4b8ddbaaf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://17c12e16d8d66f3af15d8787920bd41ca6c1e7517a212a6b9cebd4b6d38f36fe\",\"dweb:/ipfs/QmcXMnZUXEz6LRKsm3CSvqdPboAzmezavi8bTg2dRxM2yE\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"AlreadyDisabled"},{"inputs":[],"type":"error","name":"AlreadyEnabled"},{"inputs":[],"type":"error","name":"ApprovalCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"ApprovalQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"BalanceQueryForZeroAddress"},{"inputs":[],"type":"error","name":"ECDSAInvalidSignature"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"ECDSAInvalidSignatureLength"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"type":"error","name":"ECDSAInvalidSignatureS"},{"inputs":[],"type":"error","name":"GuardianEnabled"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32"}],"type":"error","name":"Initializable_AlreadyInitialized"},{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"currentNonce","type":"uint256"}],"type":"error","name":"InvalidAccountNonce"},{"inputs":[],"type":"error","name":"MintERC2309QuantityExceedsLimit"},{"inputs":[],"type":"error","name":"MintToZeroAddress"},{"inputs":[],"type":"error","name":"MintZeroQuantity"},{"inputs":[],"type":"error","name":"NotExternalAccount"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[],"type":"error","name":"OwnerQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"OwnershipNotInitializedForExtraData"},{"inputs":[{"internalType":"uint8","name":"bits","type":"uint8"},{"internalType":"uint256","name":"value","type":"uint256"}],"type":"error","name":"SafeCastOverflowedUintDowncast"},{"inputs":[],"type":"error","name":"SpaceOwner__OnlyFactoryAllowed"},{"inputs":[],"type":"error","name":"SpaceOwner__OnlySpaceOwnerAllowed"},{"inputs":[],"type":"error","name":"TransferCallerNotOwnerNorApproved"},{"inputs":[],"type":"error","name":"TransferFromIncorrectOwner"},{"inputs":[],"type":"error","name":"TransferToNonERC721ReceiverImplementer"},{"inputs":[],"type":"error","name":"TransferToZeroAddress"},{"inputs":[],"type":"error","name":"URIQueryForNonexistentToken"},{"inputs":[],"type":"error","name":"Validator__InvalidAddress"},{"inputs":[],"type":"error","name":"Validator__InvalidStringLength"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"approved","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bool","name":"approved","type":"bool","indexed":false}],"type":"event","name":"ApprovalForAll","anonymous":false},{"inputs":[{"internalType":"uint256","name":"fromTokenId","type":"uint256","indexed":true},{"internalType":"uint256","name":"toTokenId","type":"uint256","indexed":false},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true}],"type":"event","name":"ConsecutiveTransfer","anonymous":false},{"inputs":[{"internalType":"address","name":"delegator","type":"address","indexed":true},{"internalType":"address","name":"fromDelegate","type":"address","indexed":true},{"internalType":"address","name":"toDelegate","type":"address","indexed":true}],"type":"event","name":"DelegateChanged","anonymous":false},{"inputs":[{"internalType":"address","name":"delegate","type":"address","indexed":true},{"internalType":"uint256","name":"previousBalance","type":"uint256","indexed":false},{"internalType":"uint256","name":"newBalance","type":"uint256","indexed":false}],"type":"event","name":"DelegateVotesChanged","anonymous":false},{"inputs":[],"type":"event","name":"EIP712DomainChanged","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"bool","name":"enabled","type":"bool","indexed":true},{"internalType":"uint256","name":"cooldown","type":"uint256","indexed":false},{"internalType":"uint256","name":"timestamp","type":"uint256","indexed":false}],"type":"event","name":"GuardianUpdated","anonymous":false},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"factory","type":"address","indexed":false}],"type":"event","name":"SpaceOwner__SetFactory","anonymous":false},{"inputs":[{"internalType":"address","name":"space","type":"address","indexed":true}],"type":"event","name":"SpaceOwner__UpdateSpace","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":true}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"CLOCK_MODE","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"result","type":"bytes32"}]},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"__ERC721A_init"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"version","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"__SpaceOwner_init"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"approve"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function","name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"clock","outputs":[{"internalType":"uint48","name":"","type":"uint48"}]},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"delegate"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"delegateBySig"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getFactory","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"timepoint","type":"uint256"}],"stateMutability":"view","type":"function","name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"timepoint","type":"uint256"}],"stateMutability":"view","type":"function","name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"space","type":"address"}],"stateMutability":"view","type":"function","name":"getSpaceInfo","outputs":[{"internalType":"struct ISpaceOwnerBase.Space","name":"","type":"tuple","components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"createdAt","type":"uint256"}]}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"address","name":"space","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"mintSpace","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"nextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function","name":"nonces","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"safeTransferFrom"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setApprovalForAll"},{"inputs":[{"internalType":"address","name":"factory","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setFactory"},{"inputs":[],"stateMutability":"view","type":"function","name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function","name":"transferFrom"},{"inputs":[{"internalType":"address","name":"space","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"updateSpaceInfo"}],"devdoc":{"kind":"dev","methods":{"CLOCK_MODE()":{"details":"Description of the clock"},"approve(address,uint256)":{"details":"Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator."},"balanceOf(address)":{"details":"Returns the number of tokens in `owner`'s account."},"clock()":{"details":"Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting)."},"delegate(address)":{"details":"Delegates votes from the sender to `delegatee`."},"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Delegates votes from signer to `delegatee`."},"delegates(address)":{"details":"Returns the delegate that `account` has chosen."},"eip712Domain()":{"details":"See {EIP-5267}. _Available since v4.9._"},"getApproved(uint256)":{"details":"Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist."},"getPastTotalSupply(uint256)":{"details":"Returns the total supply of votes available at a specific moment in the past. If the `clock()` is configured to use block numbers, this will return the value at the end of the corresponding block. NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. Votes that have not been delegated are still part of total supply, even though they would not participate in a vote."},"getPastVotes(address,uint256)":{"details":"Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is configured to use block numbers, this will return the value at the end of the corresponding block."},"getSpaceInfo(address)":{"params":{"space":"The address of the space"},"returns":{"_0":"space The space info"}},"getVotes(address)":{"details":"Returns the current amount of votes that `account` has."},"isApprovedForAll(address,address)":{"details":"Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}."},"mintSpace(string,string,address)":{"details":"Only the factory is allowed to mint spaces","params":{"name":"The name of the space","space":"The address of the space","uri":"The URI of the space"},"returns":{"tokenId":"The token id of the minted space"}},"name()":{"details":"Returns the token collection name."},"ownerOf(uint256)":{"details":"Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist."},"safeTransferFrom(address,address,uint256)":{"details":"Equivalent to `safeTransferFrom(from, to, tokenId, '')`."},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event."},"setApprovalForAll(address,bool)":{"details":"Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event."},"symbol()":{"details":"Returns the token collection symbol."},"tokenURI(uint256)":{"details":"Returns the Uniform Resource Identifier (URI) for `tokenId` token."},"totalSupply()":{"details":"Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}."},"transferFrom(address,address,uint256)":{"details":"Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event."},"updateSpaceInfo(address,string,string)":{"details":"Only the space owner is allowed to update the space info","params":{"name":"The name of the space","space":"The address of the space","uri":"The URI of the space"}}},"version":1},"userdoc":{"kind":"user","methods":{"getFactory()":{"notice":"Get the factory address"},"getSpaceInfo(address)":{"notice":"Get the space info"},"mintSpace(string,string,address)":{"notice":"Mint a space"},"nextTokenId()":{"notice":"Get the next token id that will be used to mint a space"},"setFactory(address)":{"notice":"Set the factory address that is allowed to mint spaces"},"updateSpaceInfo(address,string,string)":{"notice":"Update the space info"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/facets/owner/SpaceOwner.sol":"SpaceOwner"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/governance/votes/Checkpoints.sol":{"keccak256":"0x4b98db2e67e47ec59caa78fade51e9ec6fa33ee2592e46fed09d9167ebe76c8a","urls":["bzz-raw://72ec6949ee33fb9c137bba362b94af699762fadd66334128d1dd0dbcd4301bc6","dweb:/ipfs/QmQybe6k5K3gss4zzCPqoba6ZBZE5p8KJRoQ2RzkE91JRV"],"license":"MIT"},"contracts/src/diamond/facets/governance/votes/IERC5805.sol":{"keccak256":"0x8b3b84026610f99bcac6139359305a46c537edf377e44771b904c2bd35719ee3","urls":["bzz-raw://49a8e7af9b47b6bbd794ccb50380b8f9e9b84561d62bcbf16843dde55bab86e6","dweb:/ipfs/QmdBdYxvhwCwtqW9DfPa6Bw5PrYdzhuKQyJv4vcLsttqrV"],"license":"MIT"},"contracts/src/diamond/facets/governance/votes/IERC6372.sol":{"keccak256":"0xc3fa5c25bdd3db6126e04897496889e68a65749b050ae8fede0ff80e322aca86","urls":["bzz-raw://bcf56ae1474c9a3032f8b15b1bbbeeb50ac21c574047f846673d4aca9bf82db4","dweb:/ipfs/Qmcce1zD6TBWiMLXMDsFF6bUrwtVtharjwvAbtkMmoYRgd"],"license":"MIT"},"contracts/src/diamond/facets/governance/votes/IVotes.sol":{"keccak256":"0xe84a920ea7070bafd35afb05c057801a466ba5d9a0db10be3e31720a1db1f2e6","urls":["bzz-raw://72415e259038afac01a7e76dd74d31243518514e58fe01fd7a6a38f93dd8247b","dweb:/ipfs/QmdS8GkX9Ze4rHp2JQ8Va1DMWHaqxQLCjGD8hVVR5KyMVS"],"license":"Apache-2.0"},"contracts/src/diamond/facets/governance/votes/Votes.sol":{"keccak256":"0x36ca9d8aa95a21f2812aa1f2a3712d4acecd78476d8e50900566cc233a54eefa","urls":["bzz-raw://0d910d09517696658fe1cb4291fca5f66cc0b7fd4605f2a4ad70f9c7c494206c","dweb:/ipfs/QmVrcYUZPgbxfQkqXkEdnUFJ81XenXt8hbmDvXBnVyTpDS"],"license":"Apache-2.0"},"contracts/src/diamond/facets/governance/votes/VotesBase.sol":{"keccak256":"0x3234078063b2070a77f1b03e1d96e8c5a958450a70373df02cc0bdb51b69ccb8","urls":["bzz-raw://6d66c3f430cf100ff52dbc614f6982e405996957b60b8de49f6e59bca7dc566f","dweb:/ipfs/QmRKp88BWBr4Pzf4CnW2wWBkERVLMPEnVeZhxizc8tJXBN"],"license":"Apache-2.0"},"contracts/src/diamond/facets/governance/votes/VotesStorage.sol":{"keccak256":"0x2e1a1db6e37ca9a1552edfd2be03d6069e9858996ea1fe0387dd4f35d58455be","urls":["bzz-raw://723c3880d012108f1f442d89f972de200ef9033f1c3179bfa56054740e028fa6","dweb:/ipfs/QmNxcE6H6Db93XzPepQ2xdPrgZkusCrV9LEq9rPvSPq3UT"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableBase.sol":{"keccak256":"0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762","urls":["bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4","dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/OwnableStorage.sol":{"keccak256":"0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64","urls":["bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105","dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721A.sol":{"keccak256":"0xc8fab662d9a0c4e697c8dcaad72dd2a190331b01476649a742b6f317266ac5a1","urls":["bzz-raw://9c84047a6d47a901f45f90f12f713432289ae6d88fea95a383900906005cf70b","dweb:/ipfs/QmVdLUVdtjTQn2fCG85Uv2ZAzCSfNbWYcAg5eXthunnigc"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol":{"keccak256":"0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334","urls":["bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa","dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol":{"keccak256":"0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1","urls":["bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c","dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu"],"license":"Apache-2.0"},"contracts/src/diamond/facets/token/ERC721A/IERC721A.sol":{"keccak256":"0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9","urls":["bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e","dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM"],"license":"Apache-2.0"},"contracts/src/diamond/utils/Context.sol":{"keccak256":"0xbace3785343657020bee8dc579fec3a7f18741e5ddfaea001903f7ed087c5b8a","urls":["bzz-raw://df02a2fa496a45ceecd157bfed9d8e093b4ff236d3f83e89453cf0656b5c018d","dweb:/ipfs/QmarCnWB7CNimfnNr51p2QBzdwpqbRAkgQncnA2c8kz7KR"],"license":"Apache-2.0"},"contracts/src/diamond/utils/Nonces.sol":{"keccak256":"0xce0cce96c8f30e4052523e2c67c7b08ed9defa8c2e3858d4534b359be9ee9ee3","urls":["bzz-raw://caae09675d571304907f51e64c255981c5fbfbd60bf26d0117c00ecd7ed7a7fb","dweb:/ipfs/QmPNReTvJDZ242duATLyDDt1JUUd2ACg472E1vftw5zgXB"],"license":"Apache-2.0"},"contracts/src/diamond/utils/cryptography/EIP712.sol":{"keccak256":"0x4bc6ac914b47d64b899510e901545369b2b1c292fb392500c3fcc09bb13fbf21","urls":["bzz-raw://e7bd2f9bf25d82ff5f45c8075254dba48bcff67b1d6f1b5ab91d1b17a1d9f624","dweb:/ipfs/QmegqbdjZy6DfKNzZHQ1rGJ67w4SaXUz6w3ZL8mrWkwQ5d"],"license":"Apache-2.0"},"contracts/src/diamond/utils/cryptography/IERC5267.sol":{"keccak256":"0x1369ee10d9df0a2700fdf659db717f7c6beae8b2e7173212ec4ed70909f86d50","urls":["bzz-raw://f43717adb31aaac44770deac2c689bc45472b9f752614ae32c9efe2013b2d42f","dweb:/ipfs/Qmba5h3jR9Lenn5LRFwxfeEEiZMHqp8wnbX4FTfTtMxqHt"],"license":"Apache-2.0"},"contracts/src/spaces/facets/guardian/GuardianBase.sol":{"keccak256":"0x380bbefb6d29266ce37efcc247b355a714485e21e2c3a6789f81226c36d8ac41","urls":["bzz-raw://7c9512890c4dd3dddc10ac94bdd747c4e49d6e9eb6ebf808eb017eda1733221a","dweb:/ipfs/QmWwocwLuRiKzqJoNdLPmxpEH34H2sBfMTH7iU4aFkW8Kj"],"license":"Apache-2.0"},"contracts/src/spaces/facets/guardian/GuardianStorage.sol":{"keccak256":"0xd8af0e2ff9c26165cd30e16eb881b2a58acff8f7f61bfac1b90dc6362f14dd63","urls":["bzz-raw://e06464b1498f896ad0c62ca19aed21f7667e36ebd0f77cb1831e0a60fb373688","dweb:/ipfs/QmTFenitEo2y4UE3F4qtX1DfoBoEMs1pmtL1AmoeohTpw8"],"license":"Apache-2.0"},"contracts/src/spaces/facets/guardian/IGuardian.sol":{"keccak256":"0x9898180a058f5d922141026a1266008c9d7883a9863549ab76d8218123be6c19","urls":["bzz-raw://3481a5ced56b71d2b5e8bbc6bce46d80eb8161fb9195fb232272a442d015323b","dweb:/ipfs/QmV6LvhxezH6PJw1gfV7DgAyHUpGd2GN56w6G9n83vGxa3"],"license":"Apache-2.0"},"contracts/src/spaces/facets/owner/ISpaceOwner.sol":{"keccak256":"0xf68eb1b3aceeacc0c4162304f74d89890e8c641a9c0778c1786db850a79cfb3f","urls":["bzz-raw://8a345161f4d34be281c5f4d165dac958ed3a5e7d2888924d498555871906e6ea","dweb:/ipfs/QmQcWfQ6k54UPr9eMA2KnXCJAc4NR24LhzbmyA5NUKBVN3"],"license":"Apache-2.0"},"contracts/src/spaces/facets/owner/SpaceOwner.sol":{"keccak256":"0x8a644478b3bcfb18fda9c887838d710e59c7c5a2ed7003dcda5ab479f2fefe9c","urls":["bzz-raw://640e9b7eebba29735acc6b96ebe107a58db8af60ffb84c1b580a1b7e041e9393","dweb:/ipfs/QmVeuTQ87BVjzZc7FaVwrbz82PVCWkXNjz1sYBzeYRi3h7"],"license":"Apache-2.0"},"contracts/src/spaces/facets/owner/SpaceOwnerBase.sol":{"keccak256":"0xd4eda8665f05e74b37a99b21157baa102660d9143e6b45cc6800bbf795299ad2","urls":["bzz-raw://74c3e6034a8f74c315d6790c423b1083c8a9a468f76e3d9b93e86afc8143e7c1","dweb:/ipfs/QmcZ8TV2rAmwQx2aRSvhRQmcevZYCWWxD4KUnyYteN2Qax"],"license":"Apache-2.0"},"contracts/src/spaces/facets/owner/SpaceOwnerStorage.sol":{"keccak256":"0xae80a53a918d9bd4b064aaeac74a8697a12f669e815f2fbd00385d3b82f39026","urls":["bzz-raw://497ae2aeb902efd34779b277320544f2c194889b2df926614e19f3cbfc1e787f","dweb:/ipfs/QmPNLznGfzdidEhCokiEFppJa6faPNNnFGt1Y43X3qrs6B"],"license":"Apache-2.0"},"contracts/src/spaces/facets/owner/SpaceOwnerUriBase.sol":{"keccak256":"0xf24d932787ab9862d27eba5d8b687644a95319aaa33141cc76f167f38d2bebf4","urls":["bzz-raw://8abc2878482017106e2cde6fa036ce74b8e8c434ea6ebc1915b2bbade66cfcde","dweb:/ipfs/QmXEzY6CXnLZndoM6i27ewqCseR2sdArjCjyZXvg5y1TZy"],"license":"Apache-2.0"},"contracts/src/utils/Validator.sol":{"keccak256":"0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50","urls":["bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64","dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf","urls":["bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c","dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435","urls":["bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c","dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/math/SafeCast.sol":{"keccak256":"0xe19a4d5f31d2861e7344e8e535e2feafb913d806d3e2b5fe7782741a2a7094fe","urls":["bzz-raw://4aed79c0fa6f0546ed02f2f683e8f77f0fd2ed7eb34d8bbf3d373c9a6d95b13c","dweb:/ipfs/QmWqVz6UAVqmnWU5pqYPt1o6iDEZyPaBraAA3rKfTTSfYj"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"],"license":"MIT"},"lib/base64/base64.sol":{"keccak256":"0xa73959e6ef0b693e4423a562e612370160b934a75e618361ddd8c9c4b8ddbaaf","urls":["bzz-raw://17c12e16d8d66f3af15d8787920bd41ca6c1e7517a212a6b9cebd4b6d38f36fe","dweb:/ipfs/QmcXMnZUXEz6LRKsm3CSvqdPboAzmezavi8bTg2dRxM2yE"],"license":"MIT"}},"version":1},"id":233} \ No newline at end of file diff --git a/packages/generated/v3/abis/SpaceOwner.metadata.json b/packages/generated/v3/abis/SpaceOwner.metadata.json new file mode 100644 index 000000000..58fa4ddc4 --- /dev/null +++ b/packages/generated/v3/abis/SpaceOwner.metadata.json @@ -0,0 +1,1629 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "AlreadyDisabled" + }, + { + "inputs": [], + "type": "error", + "name": "AlreadyEnabled" + }, + { + "inputs": [], + "type": "error", + "name": "ApprovalCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "ApprovalQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "BalanceQueryForZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "ECDSAInvalidSignature" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "type": "error", + "name": "ECDSAInvalidSignatureLength" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "type": "error", + "name": "ECDSAInvalidSignatureS" + }, + { + "inputs": [], + "type": "error", + "name": "GuardianEnabled" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32" + } + ], + "type": "error", + "name": "Initializable_AlreadyInitialized" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "currentNonce", + "type": "uint256" + } + ], + "type": "error", + "name": "InvalidAccountNonce" + }, + { + "inputs": [], + "type": "error", + "name": "MintERC2309QuantityExceedsLimit" + }, + { + "inputs": [], + "type": "error", + "name": "MintToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "MintZeroQuantity" + }, + { + "inputs": [], + "type": "error", + "name": "NotExternalAccount" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "OwnerQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "OwnershipNotInitializedForExtraData" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "bits", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "type": "error", + "name": "SafeCastOverflowedUintDowncast" + }, + { + "inputs": [], + "type": "error", + "name": "SpaceOwner__OnlyFactoryAllowed" + }, + { + "inputs": [], + "type": "error", + "name": "SpaceOwner__OnlySpaceOwnerAllowed" + }, + { + "inputs": [], + "type": "error", + "name": "TransferCallerNotOwnerNorApproved" + }, + { + "inputs": [], + "type": "error", + "name": "TransferFromIncorrectOwner" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToNonERC721ReceiverImplementer" + }, + { + "inputs": [], + "type": "error", + "name": "TransferToZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "URIQueryForNonexistentToken" + }, + { + "inputs": [], + "type": "error", + "name": "Validator__InvalidAddress" + }, + { + "inputs": [], + "type": "error", + "name": "Validator__InvalidStringLength" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "approved", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Approval", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "operator", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "ApprovalForAll", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fromTokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint256", + "name": "toTokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConsecutiveTransfer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegator", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "fromDelegate", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "toDelegate", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "DelegateChanged", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegate", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "previousBalance", + "type": "uint256", + "indexed": false + }, + { + "internalType": "uint256", + "name": "newBalance", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "DelegateVotesChanged", + "anonymous": false + }, + { + "inputs": [], + "type": "event", + "name": "EIP712DomainChanged", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address", + "indexed": true + }, + { + "internalType": "bool", + "name": "enabled", + "type": "bool", + "indexed": true + }, + { + "internalType": "uint256", + "name": "cooldown", + "type": "uint256", + "indexed": false + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "GuardianUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "factory", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "SpaceOwner__SetFactory", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "space", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "SpaceOwner__UpdateSpace", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "to", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "Transfer", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "CLOCK_MODE", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "result", + "type": "bytes32" + } + ] + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name_", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol_", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__ERC721A_init" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "__SpaceOwner_init" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "approve" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "clock", + "outputs": [ + { + "internalType": "uint48", + "name": "", + "type": "uint48" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatee", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "delegate" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatee", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "delegateBySig" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "delegates", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getFactory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getPastTotalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getPastVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "space", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getSpaceInfo", + "outputs": [ + { + "internalType": "struct ISpaceOwnerBase.Space", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "uri", + "type": "string" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "uri", + "type": "string" + }, + { + "internalType": "address", + "name": "space", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "mintSpace", + "outputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "nextTokenId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "safeTransferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "safeTransferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setApprovalForAll" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "factory", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setFactory" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "transferFrom" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "space", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "uri", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "updateSpaceInfo" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "CLOCK_MODE()": { + "details": "Description of the clock" + }, + "approve(address,uint256)": { + "details": "Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. Requirements: - The caller must own the token or be an approved operator." + }, + "balanceOf(address)": { + "details": "Returns the number of tokens in `owner`'s account." + }, + "clock()": { + "details": "Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting)." + }, + "delegate(address)": { + "details": "Delegates votes from the sender to `delegatee`." + }, + "delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)": { + "details": "Delegates votes from signer to `delegatee`." + }, + "delegates(address)": { + "details": "Returns the delegate that `account` has chosen." + }, + "eip712Domain()": { + "details": "See {EIP-5267}. _Available since v4.9._" + }, + "getApproved(uint256)": { + "details": "Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist." + }, + "getPastTotalSupply(uint256)": { + "details": "Returns the total supply of votes available at a specific moment in the past. If the `clock()` is configured to use block numbers, this will return the value at the end of the corresponding block. NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. Votes that have not been delegated are still part of total supply, even though they would not participate in a vote." + }, + "getPastVotes(address,uint256)": { + "details": "Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is configured to use block numbers, this will return the value at the end of the corresponding block." + }, + "getSpaceInfo(address)": { + "params": { + "space": "The address of the space" + }, + "returns": { + "_0": "space The space info" + } + }, + "getVotes(address)": { + "details": "Returns the current amount of votes that `account` has." + }, + "isApprovedForAll(address,address)": { + "details": "Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}." + }, + "mintSpace(string,string,address)": { + "details": "Only the factory is allowed to mint spaces", + "params": { + "name": "The name of the space", + "space": "The address of the space", + "uri": "The URI of the space" + }, + "returns": { + "tokenId": "The token id of the minted space" + } + }, + "name()": { + "details": "Returns the token collection name." + }, + "ownerOf(uint256)": { + "details": "Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist." + }, + "safeTransferFrom(address,address,uint256)": { + "details": "Equivalent to `safeTransferFrom(from, to, tokenId, '')`." + }, + "safeTransferFrom(address,address,uint256,bytes)": { + "details": "Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event." + }, + "setApprovalForAll(address,bool)": { + "details": "Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event." + }, + "symbol()": { + "details": "Returns the token collection symbol." + }, + "tokenURI(uint256)": { + "details": "Returns the Uniform Resource Identifier (URI) for `tokenId` token." + }, + "totalSupply()": { + "details": "Returns the total number of tokens in existence. Burned tokens will reduce the count. To get the total number of tokens minted, please see {_totalMinted}." + }, + "transferFrom(address,address,uint256)": { + "details": "Transfers `tokenId` from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event." + }, + "updateSpaceInfo(address,string,string)": { + "details": "Only the space owner is allowed to update the space info", + "params": { + "name": "The name of the space", + "space": "The address of the space", + "uri": "The URI of the space" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getFactory()": { + "notice": "Get the factory address" + }, + "getSpaceInfo(address)": { + "notice": "Get the space info" + }, + "mintSpace(string,string,address)": { + "notice": "Mint a space" + }, + "nextTokenId()": { + "notice": "Get the next token id that will be used to mint a space" + }, + "setFactory(address)": { + "notice": "Set the factory address that is allowed to mint spaces" + }, + "updateSpaceInfo(address,string,string)": { + "notice": "Update the space info" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/facets/owner/SpaceOwner.sol": "SpaceOwner" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/governance/votes/Checkpoints.sol": { + "keccak256": "0x4b98db2e67e47ec59caa78fade51e9ec6fa33ee2592e46fed09d9167ebe76c8a", + "urls": [ + "bzz-raw://72ec6949ee33fb9c137bba362b94af699762fadd66334128d1dd0dbcd4301bc6", + "dweb:/ipfs/QmQybe6k5K3gss4zzCPqoba6ZBZE5p8KJRoQ2RzkE91JRV" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/governance/votes/IERC5805.sol": { + "keccak256": "0x8b3b84026610f99bcac6139359305a46c537edf377e44771b904c2bd35719ee3", + "urls": [ + "bzz-raw://49a8e7af9b47b6bbd794ccb50380b8f9e9b84561d62bcbf16843dde55bab86e6", + "dweb:/ipfs/QmdBdYxvhwCwtqW9DfPa6Bw5PrYdzhuKQyJv4vcLsttqrV" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/governance/votes/IERC6372.sol": { + "keccak256": "0xc3fa5c25bdd3db6126e04897496889e68a65749b050ae8fede0ff80e322aca86", + "urls": [ + "bzz-raw://bcf56ae1474c9a3032f8b15b1bbbeeb50ac21c574047f846673d4aca9bf82db4", + "dweb:/ipfs/Qmcce1zD6TBWiMLXMDsFF6bUrwtVtharjwvAbtkMmoYRgd" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/governance/votes/IVotes.sol": { + "keccak256": "0xe84a920ea7070bafd35afb05c057801a466ba5d9a0db10be3e31720a1db1f2e6", + "urls": [ + "bzz-raw://72415e259038afac01a7e76dd74d31243518514e58fe01fd7a6a38f93dd8247b", + "dweb:/ipfs/QmdS8GkX9Ze4rHp2JQ8Va1DMWHaqxQLCjGD8hVVR5KyMVS" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/governance/votes/Votes.sol": { + "keccak256": "0x36ca9d8aa95a21f2812aa1f2a3712d4acecd78476d8e50900566cc233a54eefa", + "urls": [ + "bzz-raw://0d910d09517696658fe1cb4291fca5f66cc0b7fd4605f2a4ad70f9c7c494206c", + "dweb:/ipfs/QmVrcYUZPgbxfQkqXkEdnUFJ81XenXt8hbmDvXBnVyTpDS" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/governance/votes/VotesBase.sol": { + "keccak256": "0x3234078063b2070a77f1b03e1d96e8c5a958450a70373df02cc0bdb51b69ccb8", + "urls": [ + "bzz-raw://6d66c3f430cf100ff52dbc614f6982e405996957b60b8de49f6e59bca7dc566f", + "dweb:/ipfs/QmRKp88BWBr4Pzf4CnW2wWBkERVLMPEnVeZhxizc8tJXBN" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/governance/votes/VotesStorage.sol": { + "keccak256": "0x2e1a1db6e37ca9a1552edfd2be03d6069e9858996ea1fe0387dd4f35d58455be", + "urls": [ + "bzz-raw://723c3880d012108f1f442d89f972de200ef9033f1c3179bfa56054740e028fa6", + "dweb:/ipfs/QmNxcE6H6Db93XzPepQ2xdPrgZkusCrV9LEq9rPvSPq3UT" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableBase.sol": { + "keccak256": "0x6dd67541350d05fa7980a6497c1e372290e363c40c765a0ce4b7795c38510762", + "urls": [ + "bzz-raw://3eadd97e12aff7228d28e5f9cb27dcddcf7764296d2a72ad703c3765376d50c4", + "dweb:/ipfs/QmP5hGb6Nj64XCpG4s3sdoYR3sEt85AwDy4hcjoigNxYDa" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/OwnableStorage.sol": { + "keccak256": "0xd66cdbb7083d80cc567449a7eb4f7272c16e0ceb9f20667d8b17cf2a8432aa64", + "urls": [ + "bzz-raw://946997262ab993790ce79eafa7d628ae9a1123192ad5c0d85624957ce8058105", + "dweb:/ipfs/QmdSZ7BwGZvXvt9pt8AweDqnLt61eYqVg3QfK9renfGJHZ" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721A.sol": { + "keccak256": "0xc8fab662d9a0c4e697c8dcaad72dd2a190331b01476649a742b6f317266ac5a1", + "urls": [ + "bzz-raw://9c84047a6d47a901f45f90f12f713432289ae6d88fea95a383900906005cf70b", + "dweb:/ipfs/QmVdLUVdtjTQn2fCG85Uv2ZAzCSfNbWYcAg5eXthunnigc" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721ABase.sol": { + "keccak256": "0x8e6c8700603a5f50982462009bf0bd6d9167937d75d5d5b4ecaf2be25e48f334", + "urls": [ + "bzz-raw://4003c6a7b68ba9d38baa8a338a747c70048f6ce862b34bd5b8da390a888b73fa", + "dweb:/ipfs/QmSGRHzFkquMpe6zdDnRBG6e5ngr7QNDHD8ovb4RDACB7W" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/ERC721AStorage.sol": { + "keccak256": "0x8be3fa58d9bb445d169eda30dd35f34e149947eb0572cdb2ced99ed854b8cdc1", + "urls": [ + "bzz-raw://1b3d9b6c0aef7519ce60c08880a551a0579ae1625e16f89a728700f2eb7e075c", + "dweb:/ipfs/QmZfS4Lt9mZBPpYxehPb5p9VAGGVdKGkHpZyhoKTP2rSUu" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/token/ERC721A/IERC721A.sol": { + "keccak256": "0xfce3dc8955c337c405c27c7741b7beff81685ed89f2e102fbad517043e20edf9", + "urls": [ + "bzz-raw://6c0ef999aaa971921ba4a4d2190ce5fae92fe15a34a87aac02fd081773fdbe9e", + "dweb:/ipfs/QmUFD83GFhupZo2d3PafyK5fjqrzFRDnJHEsTGYhHakzUM" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/utils/Context.sol": { + "keccak256": "0xbace3785343657020bee8dc579fec3a7f18741e5ddfaea001903f7ed087c5b8a", + "urls": [ + "bzz-raw://df02a2fa496a45ceecd157bfed9d8e093b4ff236d3f83e89453cf0656b5c018d", + "dweb:/ipfs/QmarCnWB7CNimfnNr51p2QBzdwpqbRAkgQncnA2c8kz7KR" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/utils/Nonces.sol": { + "keccak256": "0xce0cce96c8f30e4052523e2c67c7b08ed9defa8c2e3858d4534b359be9ee9ee3", + "urls": [ + "bzz-raw://caae09675d571304907f51e64c255981c5fbfbd60bf26d0117c00ecd7ed7a7fb", + "dweb:/ipfs/QmPNReTvJDZ242duATLyDDt1JUUd2ACg472E1vftw5zgXB" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/utils/cryptography/EIP712.sol": { + "keccak256": "0x4bc6ac914b47d64b899510e901545369b2b1c292fb392500c3fcc09bb13fbf21", + "urls": [ + "bzz-raw://e7bd2f9bf25d82ff5f45c8075254dba48bcff67b1d6f1b5ab91d1b17a1d9f624", + "dweb:/ipfs/QmegqbdjZy6DfKNzZHQ1rGJ67w4SaXUz6w3ZL8mrWkwQ5d" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/utils/cryptography/IERC5267.sol": { + "keccak256": "0x1369ee10d9df0a2700fdf659db717f7c6beae8b2e7173212ec4ed70909f86d50", + "urls": [ + "bzz-raw://f43717adb31aaac44770deac2c689bc45472b9f752614ae32c9efe2013b2d42f", + "dweb:/ipfs/Qmba5h3jR9Lenn5LRFwxfeEEiZMHqp8wnbX4FTfTtMxqHt" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/guardian/GuardianBase.sol": { + "keccak256": "0x380bbefb6d29266ce37efcc247b355a714485e21e2c3a6789f81226c36d8ac41", + "urls": [ + "bzz-raw://7c9512890c4dd3dddc10ac94bdd747c4e49d6e9eb6ebf808eb017eda1733221a", + "dweb:/ipfs/QmWwocwLuRiKzqJoNdLPmxpEH34H2sBfMTH7iU4aFkW8Kj" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/guardian/GuardianStorage.sol": { + "keccak256": "0xd8af0e2ff9c26165cd30e16eb881b2a58acff8f7f61bfac1b90dc6362f14dd63", + "urls": [ + "bzz-raw://e06464b1498f896ad0c62ca19aed21f7667e36ebd0f77cb1831e0a60fb373688", + "dweb:/ipfs/QmTFenitEo2y4UE3F4qtX1DfoBoEMs1pmtL1AmoeohTpw8" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/guardian/IGuardian.sol": { + "keccak256": "0x9898180a058f5d922141026a1266008c9d7883a9863549ab76d8218123be6c19", + "urls": [ + "bzz-raw://3481a5ced56b71d2b5e8bbc6bce46d80eb8161fb9195fb232272a442d015323b", + "dweb:/ipfs/QmV6LvhxezH6PJw1gfV7DgAyHUpGd2GN56w6G9n83vGxa3" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/owner/ISpaceOwner.sol": { + "keccak256": "0xf68eb1b3aceeacc0c4162304f74d89890e8c641a9c0778c1786db850a79cfb3f", + "urls": [ + "bzz-raw://8a345161f4d34be281c5f4d165dac958ed3a5e7d2888924d498555871906e6ea", + "dweb:/ipfs/QmQcWfQ6k54UPr9eMA2KnXCJAc4NR24LhzbmyA5NUKBVN3" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/owner/SpaceOwner.sol": { + "keccak256": "0x8a644478b3bcfb18fda9c887838d710e59c7c5a2ed7003dcda5ab479f2fefe9c", + "urls": [ + "bzz-raw://640e9b7eebba29735acc6b96ebe107a58db8af60ffb84c1b580a1b7e041e9393", + "dweb:/ipfs/QmVeuTQ87BVjzZc7FaVwrbz82PVCWkXNjz1sYBzeYRi3h7" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/owner/SpaceOwnerBase.sol": { + "keccak256": "0xd4eda8665f05e74b37a99b21157baa102660d9143e6b45cc6800bbf795299ad2", + "urls": [ + "bzz-raw://74c3e6034a8f74c315d6790c423b1083c8a9a468f76e3d9b93e86afc8143e7c1", + "dweb:/ipfs/QmcZ8TV2rAmwQx2aRSvhRQmcevZYCWWxD4KUnyYteN2Qax" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/owner/SpaceOwnerStorage.sol": { + "keccak256": "0xae80a53a918d9bd4b064aaeac74a8697a12f669e815f2fbd00385d3b82f39026", + "urls": [ + "bzz-raw://497ae2aeb902efd34779b277320544f2c194889b2df926614e19f3cbfc1e787f", + "dweb:/ipfs/QmPNLznGfzdidEhCokiEFppJa6faPNNnFGt1Y43X3qrs6B" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/owner/SpaceOwnerUriBase.sol": { + "keccak256": "0xf24d932787ab9862d27eba5d8b687644a95319aaa33141cc76f167f38d2bebf4", + "urls": [ + "bzz-raw://8abc2878482017106e2cde6fa036ce74b8e8c434ea6ebc1915b2bbade66cfcde", + "dweb:/ipfs/QmXEzY6CXnLZndoM6i27ewqCseR2sdArjCjyZXvg5y1TZy" + ], + "license": "Apache-2.0" + }, + "contracts/src/utils/Validator.sol": { + "keccak256": "0xb8d6d023395c2611e308cb09606dc9e49dce0d985a75f20572aeed590d738f50", + "urls": [ + "bzz-raw://144807c8826c643f74c48e3589243ac4b05dffd0a00b861b75ce46451224be64", + "dweb:/ipfs/QmazGzxM9owCyKTV1cY46PiMHXdApYJR221Lm9YMcn7J72" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Strings.sol": { + "keccak256": "0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792", + "urls": [ + "bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453", + "dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "keccak256": "0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf", + "urls": [ + "bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c", + "dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol": { + "keccak256": "0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435", + "urls": [ + "bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c", + "dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/math/Math.sol": { + "keccak256": "0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d", + "urls": [ + "bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875", + "dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/math/SafeCast.sol": { + "keccak256": "0xe19a4d5f31d2861e7344e8e535e2feafb913d806d3e2b5fe7782741a2a7094fe", + "urls": [ + "bzz-raw://4aed79c0fa6f0546ed02f2f683e8f77f0fd2ed7eb34d8bbf3d373c9a6d95b13c", + "dweb:/ipfs/QmWqVz6UAVqmnWU5pqYPt1o6iDEZyPaBraAA3rKfTTSfYj" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/math/SignedMath.sol": { + "keccak256": "0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72", + "urls": [ + "bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc", + "dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT" + ], + "license": "MIT" + }, + "lib/base64/base64.sol": { + "keccak256": "0xa73959e6ef0b693e4423a562e612370160b934a75e618361ddd8c9c4b8ddbaaf", + "urls": [ + "bzz-raw://17c12e16d8d66f3af15d8787920bd41ca6c1e7517a212a6b9cebd4b6d38f36fe", + "dweb:/ipfs/QmcXMnZUXEz6LRKsm3CSvqdPboAzmezavi8bTg2dRxM2yE" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/StreamFlags.abi.json b/packages/generated/v3/abis/StreamFlags.abi.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/packages/generated/v3/abis/StreamFlags.abi.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/packages/generated/v3/abis/StreamFlags.abi.ts b/packages/generated/v3/abis/StreamFlags.abi.ts new file mode 100644 index 000000000..257b9d513 --- /dev/null +++ b/packages/generated/v3/abis/StreamFlags.abi.ts @@ -0,0 +1 @@ +export default [] as const diff --git a/packages/generated/v3/abis/StreamFlags.bin b/packages/generated/v3/abis/StreamFlags.bin new file mode 100644 index 000000000..8957d3281 --- /dev/null +++ b/packages/generated/v3/abis/StreamFlags.bin @@ -0,0 +1 @@ +60206037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fd \ No newline at end of file diff --git a/packages/generated/v3/abis/StreamFlags.json b/packages/generated/v3/abis/StreamFlags.json new file mode 100644 index 000000000..decba0e46 --- /dev/null +++ b/packages/generated/v3/abis/StreamFlags.json @@ -0,0 +1 @@ +{"abi":[],"bytecode":{"object":"0x60206037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fd","sourceMap":"536:53:182:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;536:53:182;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x73000000000000000000000000000000000000000030146080604052600080fd","sourceMap":"536:53:182:-:0;;;;;;;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/river/registry/facets/stream/StreamRegistry.sol\":\"StreamFlags\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/river/registry/facets/stream/IStreamRegistry.sol\":{\"keccak256\":\"0x47337d9108adb07ab81e4c71666f916e96234e9837edde35866116c6627d2ff7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d7d8a5ad98688de306264be8e7bd41edc3f141d8e852b6545c07748a13879ac9\",\"dweb:/ipfs/QmPgYxzhakDsbnxPTFvMKKMKh2JmGtvq3nFukdcL4bQCZz\"]},\"contracts/src/river/registry/facets/stream/StreamRegistry.sol\":{\"keccak256\":\"0xc422b363ffefaf16dafdfa5983a37b5cf7a306ee9c291ebe510212e91159f934\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://965d4bc6045c85fa2fdd3ae4b6f7ef4aba5f3b98d00f0603ddde204c6c5555ac\",\"dweb:/ipfs/Qmah6HuHF1HvGG1D8SD18g3FG1wxuKAMYTdMNUnFaERn8M\"]},\"contracts/src/river/registry/libraries/RegistryErrors.sol\":{\"keccak256\":\"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3\",\"dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy\"]},\"contracts/src/river/registry/libraries/RegistryStorage.sol\":{\"keccak256\":\"0xb365ca80cf19bebeee5c5512b1982e660d0d31043f8bb4864f26e02ec70a117b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f2ddea5237c67ec769cf0da7f8da4131979ed34f9c2ad0495c87b65b1ea88e01\",\"dweb:/ipfs/QmQBy2AnbwwTopyCrdcW9cSYPaLpmXRqswxUv5dWYbza1q\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/river/registry/facets/stream/StreamRegistry.sol":"StreamFlags"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/river/registry/facets/stream/IStreamRegistry.sol":{"keccak256":"0x47337d9108adb07ab81e4c71666f916e96234e9837edde35866116c6627d2ff7","urls":["bzz-raw://d7d8a5ad98688de306264be8e7bd41edc3f141d8e852b6545c07748a13879ac9","dweb:/ipfs/QmPgYxzhakDsbnxPTFvMKKMKh2JmGtvq3nFukdcL4bQCZz"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/stream/StreamRegistry.sol":{"keccak256":"0xc422b363ffefaf16dafdfa5983a37b5cf7a306ee9c291ebe510212e91159f934","urls":["bzz-raw://965d4bc6045c85fa2fdd3ae4b6f7ef4aba5f3b98d00f0603ddde204c6c5555ac","dweb:/ipfs/Qmah6HuHF1HvGG1D8SD18g3FG1wxuKAMYTdMNUnFaERn8M"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryErrors.sol":{"keccak256":"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc","urls":["bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3","dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryStorage.sol":{"keccak256":"0xb365ca80cf19bebeee5c5512b1982e660d0d31043f8bb4864f26e02ec70a117b","urls":["bzz-raw://f2ddea5237c67ec769cf0da7f8da4131979ed34f9c2ad0495c87b65b1ea88e01","dweb:/ipfs/QmQBy2AnbwwTopyCrdcW9cSYPaLpmXRqswxUv5dWYbza1q"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":182} \ No newline at end of file diff --git a/packages/generated/v3/abis/StreamFlags.metadata.json b/packages/generated/v3/abis/StreamFlags.metadata.json new file mode 100644 index 000000000..2fe306184 --- /dev/null +++ b/packages/generated/v3/abis/StreamFlags.metadata.json @@ -0,0 +1,87 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/river/registry/facets/stream/StreamRegistry.sol": "StreamFlags" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/river/registry/facets/stream/IStreamRegistry.sol": { + "keccak256": "0x47337d9108adb07ab81e4c71666f916e96234e9837edde35866116c6627d2ff7", + "urls": [ + "bzz-raw://d7d8a5ad98688de306264be8e7bd41edc3f141d8e852b6545c07748a13879ac9", + "dweb:/ipfs/QmPgYxzhakDsbnxPTFvMKKMKh2JmGtvq3nFukdcL4bQCZz" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/stream/StreamRegistry.sol": { + "keccak256": "0xc422b363ffefaf16dafdfa5983a37b5cf7a306ee9c291ebe510212e91159f934", + "urls": [ + "bzz-raw://965d4bc6045c85fa2fdd3ae4b6f7ef4aba5f3b98d00f0603ddde204c6c5555ac", + "dweb:/ipfs/Qmah6HuHF1HvGG1D8SD18g3FG1wxuKAMYTdMNUnFaERn8M" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryErrors.sol": { + "keccak256": "0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc", + "urls": [ + "bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3", + "dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryStorage.sol": { + "keccak256": "0xb365ca80cf19bebeee5c5512b1982e660d0d31043f8bb4864f26e02ec70a117b", + "urls": [ + "bzz-raw://f2ddea5237c67ec769cf0da7f8da4131979ed34f9c2ad0495c87b65b1ea88e01", + "dweb:/ipfs/QmQBy2AnbwwTopyCrdcW9cSYPaLpmXRqswxUv5dWYbza1q" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/StreamRegistry.abi.json b/packages/generated/v3/abis/StreamRegistry.abi.json new file mode 100644 index 000000000..a32f2e932 --- /dev/null +++ b/packages/generated/v3/abis/StreamRegistry.abi.json @@ -0,0 +1,550 @@ +[ + { + "type": "function", + "name": "allocateStream", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "genesisMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "genesisMiniblock", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getAllStreamIds", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32[]", + "internalType": "bytes32[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllStreams", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPaginatedStreams", + "inputs": [ + { + "name": "start", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "stop", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + }, + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStream", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamByIndex", + "inputs": [ + { + "name": "i", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct StreamWithId", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamWithGenesis", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + }, + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamsOnNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "placeStreamOnNode", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeStreamFromNode", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setStreamLastMiniblock", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "StreamAllocated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "nodes", + "type": "address[]", + "indexed": false, + "internalType": "address[]" + }, + { + "name": "genesisMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "genesisMiniblock", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamLastMiniblockUpdated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamPlacementUpdated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "isAdded", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/StreamRegistry.abi.ts b/packages/generated/v3/abis/StreamRegistry.abi.ts new file mode 100644 index 000000000..f2a5cf541 --- /dev/null +++ b/packages/generated/v3/abis/StreamRegistry.abi.ts @@ -0,0 +1,550 @@ +export default [ + { + "type": "function", + "name": "allocateStream", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "genesisMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "genesisMiniblock", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getAllStreamIds", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32[]", + "internalType": "bytes32[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllStreams", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPaginatedStreams", + "inputs": [ + { + "name": "start", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "stop", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + }, + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStream", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamByIndex", + "inputs": [ + { + "name": "i", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct StreamWithId", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamWithGenesis", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + }, + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getStreamsOnNode", + "inputs": [ + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct StreamWithId[]", + "components": [ + { + "name": "id", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "stream", + "type": "tuple", + "internalType": "struct Stream", + "components": [ + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "reserved0", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "flags", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nodes", + "type": "address[]", + "internalType": "address[]" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "placeStreamOnNode", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeStreamFromNode", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setStreamLastMiniblock", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "StreamAllocated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "nodes", + "type": "address[]", + "indexed": false, + "internalType": "address[]" + }, + { + "name": "genesisMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "genesisMiniblock", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamLastMiniblockUpdated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "lastMiniblockNum", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + }, + { + "name": "isSealed", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StreamPlacementUpdated", + "inputs": [ + { + "name": "streamId", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, + { + "name": "nodeAddress", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "isAdded", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + } +] as const diff --git a/packages/generated/v3/abis/StreamRegistry.bin b/packages/generated/v3/abis/StreamRegistry.bin new file mode 100644 index 000000000..23b731588 --- /dev/null +++ b/packages/generated/v3/abis/StreamRegistry.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b50611dbc806100206000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c806386789fc61161007157806386789fc6146101615780639ee86d3814610176578063c0f2208414610189578063ca78c41a1461019f578063d7a3158a146101c0578063ee885b12146101d357600080fd5b80631290abe8146100b957806332705ac4146100e25780633bd84c0c146101025780633c2544d11461010a57806368b454df1461012c5780636b883c391461014c575b600080fd5b6100cc6100c7366004611683565b6101e6565b6040516100d9919061172d565b60405180910390f35b6100f56100f036600461175c565b610311565b6040516100d991906117f8565b6100f56105c1565b61011d610118366004611683565b610732565b6040516100d993929190611851565b61013f61013a366004611683565b610903565b6040516100d99190611886565b61015f61015a36600461194e565b610a2a565b005b610169610c8f565b6040516100d99190611a31565b61015f610184366004611a75565b610ca0565b610191610e5d565b6040519081526020016100d9565b6101b26101ad366004611aa1565b610e68565b6040516100d9929190611ac3565b61015f6101ce366004611ae7565b611061565b61015f6101e1366004611a75565b6111ec565b6040805160a081018252600080825260208201819052918101829052606080820183905260808201529061021a9083611438565b61025e5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102559190600401611b4e565b60405180910390fd5b600082815260026020818152604092839020835160a0810185528154815260018201546001600160401b0380821683860152600160401b8204811683880152600160801b909104166060820152928101805485518185028101850190965280865293949193608086019383018282801561030157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116102e3575b5050505050815250509050919050565b6060600061031e81611455565b6001600160401b0381111561033557610335611899565b60405190808252806020026020018201604052801561035e578160200160208202803683370190505b5090506000805b61036f6000611455565b811015610424576000610382818361145f565b60008181526002602052604081209192505b600282015481101561041657876001600160a01b03168260020182815481106103bf576103bf611b61565b6000918252602090912001546001600160a01b03160361040e578286866103e581611b8d565b975063ffffffff16815181106103fd576103fd611b61565b602002602001018181525050610416565b600101610394565b505050806001019050610365565b5060008163ffffffff166001600160401b0381111561044557610445611899565b60405190808252806020026020018201604052801561047e57816020015b61046b611582565b8152602001906001900390816104635790505b50905060005b8263ffffffff168110156105b85760405180604001604052808583815181106104af576104af611b61565b60200260200101518152602001600060020160008785815181106104d5576104d5611b61565b6020908102919091018101518252818101929092526040908101600020815160a0810183528154815260018201546001600160401b0380821683870152600160401b8204811683860152600160801b90910416606082015260028201805484518187028101870190955280855291949293608086019390929083018282801561058757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610569575b5050505050815250508152508282815181106105a5576105a5611b61565b6020908102919091010152600101610484565b50949350505050565b606060006105ce81611455565b6001600160401b038111156105e5576105e5611899565b60405190808252806020026020018201604052801561061e57816020015b61060b611582565b8152602001906001900390816106035790505b50905060005b61062e6000611455565b81101561072c576000610641818361145f565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b90910416606082015291810180548651818602810186019097528087529697509395838701959294919360808601939291908301828280156106fa57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116106dc575b50505050508152505081525083838151811061071857610718611b61565b602090810291909101015250600101610624565b50919050565b6040805160a08101825260008082526020820181905291810182905260608082018390526080820181905290919061076a8285611438565b6107a55760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102559190600401611b4e565b600084815260026020818152604080842060048352818520546003845294829020825160a0810184528254815260018301546001600160401b0380821683880152600160401b8204811683870152600160801b9091041660608201529482018054845181870281018701909552808552929695919491938793608086019391929183018282801561085f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610841575b505050505081525050925080805461087690611bb0565b80601f01602080910402602001604051908101604052809291908181526020018280546108a290611bb0565b80156108ef5780601f106108c4576101008083540402835291602001916108ef565b820191906000526020600020905b8154815290600101906020018083116108d257829003601f168201915b505050505090509250925092509193909250565b61090b611582565b6109156000611455565b82106109525760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102559190600401611b4e565b600061095e818461145f565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015610a1757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f9575b5050509190925250505090529392505050565b336000818152600760205260409020600201546001600160a01b0316610a8657604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102559190600401611b4e565b610a91600086611438565b15610ad257604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526102559190600401611b4e565b60005b8451811015610b5657610b0e858281518110610af357610af3611b61565b6020026020010151600060050161146b90919063ffffffff16565b610b4e57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102559190600401611b4e565b600101610ad5565b506040805160a081018252848152600060208201819052918101829052606081018290526080810186905290610b8c908761148d565b5060008681526002602081815260409283902084518155818501516001820180549587015160608801516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026fffffffffffffffffffffffffffffffff19909916919094161796909617959095161790935560808401518051859493610c1c939085019201906115cc565b5050506000868152600360205260409020610c378482611c35565b5060008681526004602052604090819020859055517f55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb90610c7f908890889088908890611cf4565b60405180910390a1505050505050565b6060610c9b6000611499565b905090565b81610cac600082611438565b610ce75760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102559190600401611b4e565b6001600160a01b03808316600090815260076020526040902060020154839116610d4757604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102559190600401611b4e565b6000848152600260205260408120905b6002820154811015610de057846001600160a01b0316826002018281548110610d8257610d82611b61565b6000918252602090912001546001600160a01b031603610dd857604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526102559190600401611b4e565b600101610d57565b5060028101805460018082018355600092835260209283902090910180546001600160a01b0319166001600160a01b03881690811790915560408051898152938401919091528201527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f9060600160405180910390a15050505050565b6000610c9b81611455565b60606000828410604051806040016040528060078152602001664241445f41524760c81b81525090610ead5760405162461bcd60e51b81526004016102559190611b4e565b506000610eba8585611d67565b6001600160401b03811115610ed157610ed1611899565b604051908082528060200260200182016040528015610f0a57816020015b610ef7611582565b815260200190600190039081610eef5790505b50905060005b610f1a6000611455565b610f248288611d7a565b108015610f39575084610f378288611d7a565b105b15611049576000610f55610f4d8389611d7a565b60009061145f565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b909104166060820152918101805486518186028101860190975280875296975093958387019592949193608086019392919083018282801561100e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ff0575b50505050508152505081525083838151811061102c5761102c611b61565b6020026020010181905250508061104290611d8d565b9050610f10565b50806110556000611455565b90969410159450505050565b336000818152600760205260409020600201546001600160a01b03166110bd57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102559190600401611b4e565b6110c8600087611438565b6111035760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102559190600401611b4e565b600086815260026020526040902084815560018101805467ffffffffffffffff19166001600160401b038616179055821561116b576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b836001600160401b031660010361119357600087815260036020526040812061119391611631565b60408051888152602081018790526001600160401b03861681830152841515606082015290517fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b9181900360800190a150505050505050565b816111f8600082611438565b6112335760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102559190600401611b4e565b6001600160a01b0380831660009081526007602052604090206002015483911661129357604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102559190600401611b4e565b600084815260026020526040812090805b60028301548110156113ad57856001600160a01b03168360020182815481106112cf576112cf611b61565b6000918252602090912001546001600160a01b0316036113a5576002830180546112fb90600190611d67565b8154811061130b5761130b611b61565b6000918252602090912001546002840180546001600160a01b03909216918390811061133957611339611b61565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508260020180548061137a5761137a611da6565b600082815260209020810160001990810180546001600160a01b0319169055019055600191506113ad565b6001016112a4565b50806113ef57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102559190600401611b4e565b604080518781526001600160a01b03871660208201526000918101919091527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f90606001610c7f565b600081815260018301602052604081205415155b90505b92915050565b600061144f825490565b600061144c83836114ad565b6001600160a01b0381166000908152600183016020526040812054151561144c565b600061144c83836114d7565b606060006114a683611526565b9392505050565b60008260000182815481106114c4576114c4611b61565b9060005260206000200154905092915050565b600081815260018301602052604081205461151e5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561144f565b50600061144f565b60608160000180548060200260200160405190810160405280929190818152602001828054801561157657602002820191906000526020600020905b815481526020019060010190808311611562575b50505050509050919050565b6040805180820190915260008152602081016115c76040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b905290565b828054828255906000526020600020908101928215611621579160200282015b8281111561162157825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906115ec565b5061162d92915061166e565b5090565b50805461163d90611bb0565b6000825580601f1061164d575050565b601f01602090049060005260206000209081019061166b919061166e565b50565b5b8082111561162d576000815560010161166f565b60006020828403121561169557600080fd5b5035919050565b600060a08301825184526020808401516001600160401b0380821660208801528060408701511660408801528060608701511660608801525050608084015160a0608087015282815180855260c088019150602083019450600092505b808310156117225784516001600160a01b031682529383019360019290920191908301906116f9565b509695505050505050565b60208152600061144c602083018461169c565b80356001600160a01b038116811461175757600080fd5b919050565b60006020828403121561176e57600080fd5b61144c82611740565b805182526000602082015160406020850152611796604085018261169c565b949350505050565b60008282518085526020808601955060208260051b8401016020860160005b848110156117eb57601f198684030189526117d9838351611777565b988401989250908301906001016117bd565b5090979650505050505050565b60208152600061144c602083018461179e565b6000815180845260005b8181101561183157602081850181015186830182015201611815565b506000602082860101526020601f19601f83011685010191505092915050565b606081526000611864606083018661169c565b846020840152828103604084015261187c818561180b565b9695505050505050565b60208152600061144c6020830184611777565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156118d7576118d7611899565b604052919050565b600082601f8301126118f057600080fd5b81356001600160401b0381111561190957611909611899565b61191c601f8201601f19166020016118af565b81815284602083860101111561193157600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561196457600080fd5b843593506020808601356001600160401b038082111561198357600080fd5b818801915088601f83011261199757600080fd5b8135818111156119a9576119a9611899565b8060051b6119b88582016118af565b918252838101850191858101908c8411156119d257600080fd5b948601945b838610156119f7576119e886611740565b825294860194908601906119d7565b9850505050604088013594506060880135925080831115611a1757600080fd5b5050611a25878288016118df565b91505092959194509250565b6020808252825182820181905260009190848201906040850190845b81811015611a6957835183529284019291840191600101611a4d565b50909695505050505050565b60008060408385031215611a8857600080fd5b82359150611a9860208401611740565b90509250929050565b60008060408385031215611ab457600080fd5b50508035926020909101359150565b604081526000611ad6604083018561179e565b905082151560208301529392505050565b600080600080600060a08688031215611aff57600080fd5b85359450602086013593506040860135925060608601356001600160401b0381168114611b2b57600080fd5b915060808601358015158114611b4057600080fd5b809150509295509295909350565b60208152600061144c602083018461180b565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff808316818103611ba657611ba6611b77565b6001019392505050565b600181811c90821680611bc457607f821691505b60208210810361072c57634e487b7160e01b600052602260045260246000fd5b601f821115611c30576000816000526020600020601f850160051c81016020861015611c0d5750805b601f850160051c820191505b81811015611c2c57828155600101611c19565b5050505b505050565b81516001600160401b03811115611c4e57611c4e611899565b611c6281611c5c8454611bb0565b84611be4565b602080601f831160018114611c975760008415611c7f5750858301515b600019600386901b1c1916600185901b178555611c2c565b600085815260208120601f198616915b82811015611cc657888601518255948401946001909101908401611ca7565b5085821015611ce45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006080820186835260206080602085015281875180845260a08601915060208901935060005b81811015611d405784516001600160a01b031683529383019391830191600101611d1b565b50508660408601528481036060860152611d5a818761180b565b9998505050505050505050565b8181038181111561144f5761144f611b77565b8082018082111561144f5761144f611b77565b600060018201611d9f57611d9f611b77565b5060010190565b634e487b7160e01b600052603160045260246000fd \ No newline at end of file diff --git a/packages/generated/v3/abis/StreamRegistry.json b/packages/generated/v3/abis/StreamRegistry.json new file mode 100644 index 000000000..a31ea9dc2 --- /dev/null +++ b/packages/generated/v3/abis/StreamRegistry.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"allocateStream","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"},{"name":"nodes","type":"address[]","internalType":"address[]"},{"name":"genesisMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"genesisMiniblock","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getAllStreamIds","inputs":[],"outputs":[{"name":"","type":"bytes32[]","internalType":"bytes32[]"}],"stateMutability":"view"},{"type":"function","name":"getAllStreams","inputs":[],"outputs":[{"name":"","type":"tuple[]","internalType":"struct StreamWithId[]","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"stream","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}]}],"stateMutability":"view"},{"type":"function","name":"getPaginatedStreams","inputs":[{"name":"start","type":"uint256","internalType":"uint256"},{"name":"stop","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct StreamWithId[]","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"stream","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}]},{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getStream","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}],"stateMutability":"view"},{"type":"function","name":"getStreamByIndex","inputs":[{"name":"i","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct StreamWithId","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"stream","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}]}],"stateMutability":"view"},{"type":"function","name":"getStreamCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getStreamWithGenesis","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]},{"name":"","type":"bytes32","internalType":"bytes32"},{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getStreamsOnNode","inputs":[{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct StreamWithId[]","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"stream","type":"tuple","internalType":"struct Stream","components":[{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"reserved0","type":"uint64","internalType":"uint64"},{"name":"flags","type":"uint64","internalType":"uint64"},{"name":"nodes","type":"address[]","internalType":"address[]"}]}]}],"stateMutability":"view"},{"type":"function","name":"placeStreamOnNode","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"},{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeStreamFromNode","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"},{"name":"nodeAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setStreamLastMiniblock","inputs":[{"name":"streamId","type":"bytes32","internalType":"bytes32"},{"name":"","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockHash","type":"bytes32","internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","internalType":"uint64"},{"name":"isSealed","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"StreamAllocated","inputs":[{"name":"streamId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"nodes","type":"address[]","indexed":false,"internalType":"address[]"},{"name":"genesisMiniblockHash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"genesisMiniblock","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"StreamLastMiniblockUpdated","inputs":[{"name":"streamId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"lastMiniblockHash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"lastMiniblockNum","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"isSealed","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"StreamPlacementUpdated","inputs":[{"name":"streamId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"nodeAddress","type":"address","indexed":false,"internalType":"address"},{"name":"isAdded","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false}],"bytecode":{"object":"0x608060405234801561001057600080fd5b50611dbc806100206000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c806386789fc61161007157806386789fc6146101615780639ee86d3814610176578063c0f2208414610189578063ca78c41a1461019f578063d7a3158a146101c0578063ee885b12146101d357600080fd5b80631290abe8146100b957806332705ac4146100e25780633bd84c0c146101025780633c2544d11461010a57806368b454df1461012c5780636b883c391461014c575b600080fd5b6100cc6100c7366004611683565b6101e6565b6040516100d9919061172d565b60405180910390f35b6100f56100f036600461175c565b610311565b6040516100d991906117f8565b6100f56105c1565b61011d610118366004611683565b610732565b6040516100d993929190611851565b61013f61013a366004611683565b610903565b6040516100d99190611886565b61015f61015a36600461194e565b610a2a565b005b610169610c8f565b6040516100d99190611a31565b61015f610184366004611a75565b610ca0565b610191610e5d565b6040519081526020016100d9565b6101b26101ad366004611aa1565b610e68565b6040516100d9929190611ac3565b61015f6101ce366004611ae7565b611061565b61015f6101e1366004611a75565b6111ec565b6040805160a081018252600080825260208201819052918101829052606080820183905260808201529061021a9083611438565b61025e5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102559190600401611b4e565b60405180910390fd5b600082815260026020818152604092839020835160a0810185528154815260018201546001600160401b0380821683860152600160401b8204811683880152600160801b909104166060820152928101805485518185028101850190965280865293949193608086019383018282801561030157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116102e3575b5050505050815250509050919050565b6060600061031e81611455565b6001600160401b0381111561033557610335611899565b60405190808252806020026020018201604052801561035e578160200160208202803683370190505b5090506000805b61036f6000611455565b811015610424576000610382818361145f565b60008181526002602052604081209192505b600282015481101561041657876001600160a01b03168260020182815481106103bf576103bf611b61565b6000918252602090912001546001600160a01b03160361040e578286866103e581611b8d565b975063ffffffff16815181106103fd576103fd611b61565b602002602001018181525050610416565b600101610394565b505050806001019050610365565b5060008163ffffffff166001600160401b0381111561044557610445611899565b60405190808252806020026020018201604052801561047e57816020015b61046b611582565b8152602001906001900390816104635790505b50905060005b8263ffffffff168110156105b85760405180604001604052808583815181106104af576104af611b61565b60200260200101518152602001600060020160008785815181106104d5576104d5611b61565b6020908102919091018101518252818101929092526040908101600020815160a0810183528154815260018201546001600160401b0380821683870152600160401b8204811683860152600160801b90910416606082015260028201805484518187028101870190955280855291949293608086019390929083018282801561058757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610569575b5050505050815250508152508282815181106105a5576105a5611b61565b6020908102919091010152600101610484565b50949350505050565b606060006105ce81611455565b6001600160401b038111156105e5576105e5611899565b60405190808252806020026020018201604052801561061e57816020015b61060b611582565b8152602001906001900390816106035790505b50905060005b61062e6000611455565b81101561072c576000610641818361145f565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b90910416606082015291810180548651818602810186019097528087529697509395838701959294919360808601939291908301828280156106fa57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116106dc575b50505050508152505081525083838151811061071857610718611b61565b602090810291909101015250600101610624565b50919050565b6040805160a08101825260008082526020820181905291810182905260608082018390526080820181905290919061076a8285611438565b6107a55760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102559190600401611b4e565b600084815260026020818152604080842060048352818520546003845294829020825160a0810184528254815260018301546001600160401b0380821683880152600160401b8204811683870152600160801b9091041660608201529482018054845181870281018701909552808552929695919491938793608086019391929183018282801561085f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610841575b505050505081525050925080805461087690611bb0565b80601f01602080910402602001604051908101604052809291908181526020018280546108a290611bb0565b80156108ef5780601f106108c4576101008083540402835291602001916108ef565b820191906000526020600020905b8154815290600101906020018083116108d257829003601f168201915b505050505090509250925092509193909250565b61090b611582565b6109156000611455565b82106109525760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102559190600401611b4e565b600061095e818461145f565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015610a1757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f9575b5050509190925250505090529392505050565b336000818152600760205260409020600201546001600160a01b0316610a8657604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102559190600401611b4e565b610a91600086611438565b15610ad257604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526102559190600401611b4e565b60005b8451811015610b5657610b0e858281518110610af357610af3611b61565b6020026020010151600060050161146b90919063ffffffff16565b610b4e57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102559190600401611b4e565b600101610ad5565b506040805160a081018252848152600060208201819052918101829052606081018290526080810186905290610b8c908761148d565b5060008681526002602081815260409283902084518155818501516001820180549587015160608801516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026fffffffffffffffffffffffffffffffff19909916919094161796909617959095161790935560808401518051859493610c1c939085019201906115cc565b5050506000868152600360205260409020610c378482611c35565b5060008681526004602052604090819020859055517f55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb90610c7f908890889088908890611cf4565b60405180910390a1505050505050565b6060610c9b6000611499565b905090565b81610cac600082611438565b610ce75760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102559190600401611b4e565b6001600160a01b03808316600090815260076020526040902060020154839116610d4757604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102559190600401611b4e565b6000848152600260205260408120905b6002820154811015610de057846001600160a01b0316826002018281548110610d8257610d82611b61565b6000918252602090912001546001600160a01b031603610dd857604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526102559190600401611b4e565b600101610d57565b5060028101805460018082018355600092835260209283902090910180546001600160a01b0319166001600160a01b03881690811790915560408051898152938401919091528201527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f9060600160405180910390a15050505050565b6000610c9b81611455565b60606000828410604051806040016040528060078152602001664241445f41524760c81b81525090610ead5760405162461bcd60e51b81526004016102559190611b4e565b506000610eba8585611d67565b6001600160401b03811115610ed157610ed1611899565b604051908082528060200260200182016040528015610f0a57816020015b610ef7611582565b815260200190600190039081610eef5790505b50905060005b610f1a6000611455565b610f248288611d7a565b108015610f39575084610f378288611d7a565b105b15611049576000610f55610f4d8389611d7a565b60009061145f565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b909104166060820152918101805486518186028101860190975280875296975093958387019592949193608086019392919083018282801561100e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ff0575b50505050508152505081525083838151811061102c5761102c611b61565b6020026020010181905250508061104290611d8d565b9050610f10565b50806110556000611455565b90969410159450505050565b336000818152600760205260409020600201546001600160a01b03166110bd57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102559190600401611b4e565b6110c8600087611438565b6111035760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102559190600401611b4e565b600086815260026020526040902084815560018101805467ffffffffffffffff19166001600160401b038616179055821561116b576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b836001600160401b031660010361119357600087815260036020526040812061119391611631565b60408051888152602081018790526001600160401b03861681830152841515606082015290517fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b9181900360800190a150505050505050565b816111f8600082611438565b6112335760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102559190600401611b4e565b6001600160a01b0380831660009081526007602052604090206002015483911661129357604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102559190600401611b4e565b600084815260026020526040812090805b60028301548110156113ad57856001600160a01b03168360020182815481106112cf576112cf611b61565b6000918252602090912001546001600160a01b0316036113a5576002830180546112fb90600190611d67565b8154811061130b5761130b611b61565b6000918252602090912001546002840180546001600160a01b03909216918390811061133957611339611b61565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508260020180548061137a5761137a611da6565b600082815260209020810160001990810180546001600160a01b0319169055019055600191506113ad565b6001016112a4565b50806113ef57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102559190600401611b4e565b604080518781526001600160a01b03871660208201526000918101919091527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f90606001610c7f565b600081815260018301602052604081205415155b90505b92915050565b600061144f825490565b600061144c83836114ad565b6001600160a01b0381166000908152600183016020526040812054151561144c565b600061144c83836114d7565b606060006114a683611526565b9392505050565b60008260000182815481106114c4576114c4611b61565b9060005260206000200154905092915050565b600081815260018301602052604081205461151e5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561144f565b50600061144f565b60608160000180548060200260200160405190810160405280929190818152602001828054801561157657602002820191906000526020600020905b815481526020019060010190808311611562575b50505050509050919050565b6040805180820190915260008152602081016115c76040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b905290565b828054828255906000526020600020908101928215611621579160200282015b8281111561162157825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906115ec565b5061162d92915061166e565b5090565b50805461163d90611bb0565b6000825580601f1061164d575050565b601f01602090049060005260206000209081019061166b919061166e565b50565b5b8082111561162d576000815560010161166f565b60006020828403121561169557600080fd5b5035919050565b600060a08301825184526020808401516001600160401b0380821660208801528060408701511660408801528060608701511660608801525050608084015160a0608087015282815180855260c088019150602083019450600092505b808310156117225784516001600160a01b031682529383019360019290920191908301906116f9565b509695505050505050565b60208152600061144c602083018461169c565b80356001600160a01b038116811461175757600080fd5b919050565b60006020828403121561176e57600080fd5b61144c82611740565b805182526000602082015160406020850152611796604085018261169c565b949350505050565b60008282518085526020808601955060208260051b8401016020860160005b848110156117eb57601f198684030189526117d9838351611777565b988401989250908301906001016117bd565b5090979650505050505050565b60208152600061144c602083018461179e565b6000815180845260005b8181101561183157602081850181015186830182015201611815565b506000602082860101526020601f19601f83011685010191505092915050565b606081526000611864606083018661169c565b846020840152828103604084015261187c818561180b565b9695505050505050565b60208152600061144c6020830184611777565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156118d7576118d7611899565b604052919050565b600082601f8301126118f057600080fd5b81356001600160401b0381111561190957611909611899565b61191c601f8201601f19166020016118af565b81815284602083860101111561193157600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561196457600080fd5b843593506020808601356001600160401b038082111561198357600080fd5b818801915088601f83011261199757600080fd5b8135818111156119a9576119a9611899565b8060051b6119b88582016118af565b918252838101850191858101908c8411156119d257600080fd5b948601945b838610156119f7576119e886611740565b825294860194908601906119d7565b9850505050604088013594506060880135925080831115611a1757600080fd5b5050611a25878288016118df565b91505092959194509250565b6020808252825182820181905260009190848201906040850190845b81811015611a6957835183529284019291840191600101611a4d565b50909695505050505050565b60008060408385031215611a8857600080fd5b82359150611a9860208401611740565b90509250929050565b60008060408385031215611ab457600080fd5b50508035926020909101359150565b604081526000611ad6604083018561179e565b905082151560208301529392505050565b600080600080600060a08688031215611aff57600080fd5b85359450602086013593506040860135925060608601356001600160401b0381168114611b2b57600080fd5b915060808601358015158114611b4057600080fd5b809150509295509295909350565b60208152600061144c602083018461180b565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff808316818103611ba657611ba6611b77565b6001019392505050565b600181811c90821680611bc457607f821691505b60208210810361072c57634e487b7160e01b600052602260045260246000fd5b601f821115611c30576000816000526020600020601f850160051c81016020861015611c0d5750805b601f850160051c820191505b81811015611c2c57828155600101611c19565b5050505b505050565b81516001600160401b03811115611c4e57611c4e611899565b611c6281611c5c8454611bb0565b84611be4565b602080601f831160018114611c975760008415611c7f5750858301515b600019600386901b1c1916600185901b178555611c2c565b600085815260208120601f198616915b82811015611cc657888601518255948401946001909101908401611ca7565b5085821015611ce45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006080820186835260206080602085015281875180845260a08601915060208901935060005b81811015611d405784516001600160a01b031683529383019391830191600101611d1b565b50508660408601528481036060860152611d5a818761180b565b9998505050505050505050565b8181038181111561144f5761144f611b77565b8082018082111561144f5761144f611b77565b600060018201611d9f57611d9f611b77565b5060010190565b634e487b7160e01b600052603160045260246000fd","sourceMap":"591:6929:182:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806386789fc61161007157806386789fc6146101615780639ee86d3814610176578063c0f2208414610189578063ca78c41a1461019f578063d7a3158a146101c0578063ee885b12146101d357600080fd5b80631290abe8146100b957806332705ac4146100e25780633bd84c0c146101025780633c2544d11461010a57806368b454df1461012c5780636b883c391461014c575b600080fd5b6100cc6100c7366004611683565b6101e6565b6040516100d9919061172d565b60405180910390f35b6100f56100f036600461175c565b610311565b6040516100d991906117f8565b6100f56105c1565b61011d610118366004611683565b610732565b6040516100d993929190611851565b61013f61013a366004611683565b610903565b6040516100d99190611886565b61015f61015a36600461194e565b610a2a565b005b610169610c8f565b6040516100d99190611a31565b61015f610184366004611a75565b610ca0565b610191610e5d565b6040519081526020016100d9565b6101b26101ad366004611aa1565b610e68565b6040516100d9929190611ac3565b61015f6101ce366004611ae7565b611061565b61015f6101e1366004611a75565b6111ec565b6040805160a081018252600080825260208201819052918101829052606080820183905260808201529061021a9083611438565b61025e5760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102559190600401611b4e565b60405180910390fd5b600082815260026020818152604092839020835160a0810185528154815260018201546001600160401b0380821683860152600160401b8204811683880152600160801b909104166060820152928101805485518185028101850190965280865293949193608086019383018282801561030157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116102e3575b5050505050815250509050919050565b6060600061031e81611455565b6001600160401b0381111561033557610335611899565b60405190808252806020026020018201604052801561035e578160200160208202803683370190505b5090506000805b61036f6000611455565b811015610424576000610382818361145f565b60008181526002602052604081209192505b600282015481101561041657876001600160a01b03168260020182815481106103bf576103bf611b61565b6000918252602090912001546001600160a01b03160361040e578286866103e581611b8d565b975063ffffffff16815181106103fd576103fd611b61565b602002602001018181525050610416565b600101610394565b505050806001019050610365565b5060008163ffffffff166001600160401b0381111561044557610445611899565b60405190808252806020026020018201604052801561047e57816020015b61046b611582565b8152602001906001900390816104635790505b50905060005b8263ffffffff168110156105b85760405180604001604052808583815181106104af576104af611b61565b60200260200101518152602001600060020160008785815181106104d5576104d5611b61565b6020908102919091018101518252818101929092526040908101600020815160a0810183528154815260018201546001600160401b0380821683870152600160401b8204811683860152600160801b90910416606082015260028201805484518187028101870190955280855291949293608086019390929083018282801561058757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610569575b5050505050815250508152508282815181106105a5576105a5611b61565b6020908102919091010152600101610484565b50949350505050565b606060006105ce81611455565b6001600160401b038111156105e5576105e5611899565b60405190808252806020026020018201604052801561061e57816020015b61060b611582565b8152602001906001900390816106035790505b50905060005b61062e6000611455565b81101561072c576000610641818361145f565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b90910416606082015291810180548651818602810186019097528087529697509395838701959294919360808601939291908301828280156106fa57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116106dc575b50505050508152505081525083838151811061071857610718611b61565b602090810291909101015250600101610624565b50919050565b6040805160a08101825260008082526020820181905291810182905260608082018390526080820181905290919061076a8285611438565b6107a55760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102559190600401611b4e565b600084815260026020818152604080842060048352818520546003845294829020825160a0810184528254815260018301546001600160401b0380821683880152600160401b8204811683870152600160801b9091041660608201529482018054845181870281018701909552808552929695919491938793608086019391929183018282801561085f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610841575b505050505081525050925080805461087690611bb0565b80601f01602080910402602001604051908101604052809291908181526020018280546108a290611bb0565b80156108ef5780601f106108c4576101008083540402835291602001916108ef565b820191906000526020600020905b8154815290600101906020018083116108d257829003601f168201915b505050505090509250925092509193909250565b61090b611582565b6109156000611455565b82106109525760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102559190600401611b4e565b600061095e818461145f565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b9091041660608201529181018054865181860281018601909752808752969750939583870195929491936080860193929190830182828015610a1757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f9575b5050509190925250505090529392505050565b336000818152600760205260409020600201546001600160a01b0316610a8657604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102559190600401611b4e565b610a91600086611438565b15610ad257604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526102559190600401611b4e565b60005b8451811015610b5657610b0e858281518110610af357610af3611b61565b6020026020010151600060050161146b90919063ffffffff16565b610b4e57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102559190600401611b4e565b600101610ad5565b506040805160a081018252848152600060208201819052918101829052606081018290526080810186905290610b8c908761148d565b5060008681526002602081815260409283902084518155818501516001820180549587015160608801516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026fffffffffffffffffffffffffffffffff19909916919094161796909617959095161790935560808401518051859493610c1c939085019201906115cc565b5050506000868152600360205260409020610c378482611c35565b5060008681526004602052604090819020859055517f55ef7efc60ef99743e54209752c9a8e047e013917ec91572db75875069dd65bb90610c7f908890889088908890611cf4565b60405180910390a1505050505050565b6060610c9b6000611499565b905090565b81610cac600082611438565b610ce75760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102559190600401611b4e565b6001600160a01b03808316600090815260076020526040902060020154839116610d4757604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102559190600401611b4e565b6000848152600260205260408120905b6002820154811015610de057846001600160a01b0316826002018281548110610d8257610d82611b61565b6000918252602090912001546001600160a01b031603610dd857604080518082018252600e81526d414c52454144595f45584953545360901b6020820152905162461bcd60e51b81526102559190600401611b4e565b600101610d57565b5060028101805460018082018355600092835260209283902090910180546001600160a01b0319166001600160a01b03881690811790915560408051898152938401919091528201527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f9060600160405180910390a15050505050565b6000610c9b81611455565b60606000828410604051806040016040528060078152602001664241445f41524760c81b81525090610ead5760405162461bcd60e51b81526004016102559190611b4e565b506000610eba8585611d67565b6001600160401b03811115610ed157610ed1611899565b604051908082528060200260200182016040528015610f0a57816020015b610ef7611582565b815260200190600190039081610eef5790505b50905060005b610f1a6000611455565b610f248288611d7a565b108015610f39575084610f378288611d7a565b105b15611049576000610f55610f4d8389611d7a565b60009061145f565b60408051808201825282815260008381526002602081815291849020845160a0810186528154815260018201546001600160401b0380821683870152600160401b8204811683890152600160801b909104166060820152918101805486518186028101860190975280875296975093958387019592949193608086019392919083018282801561100e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ff0575b50505050508152505081525083838151811061102c5761102c611b61565b6020026020010181905250508061104290611d8d565b9050610f10565b50806110556000611455565b90969410159450505050565b336000818152600760205260409020600201546001600160a01b03166110bd57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102559190600401611b4e565b6110c8600087611438565b6111035760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102559190600401611b4e565b600086815260026020526040902084815560018101805467ffffffffffffffff19166001600160401b038616179055821561116b576001818101805467ffffffffffffffff60801b198116600160801b918290046001600160401b0316909317029190911790555b836001600160401b031660010361119357600087815260036020526040812061119391611631565b60408051888152602081018790526001600160401b03861681830152841515606082015290517fccc26bbb6dd655ea0bb8a40a3c30e35c6bdf42f8faf0d71bbea897af768cda8b9181900360800190a150505050505050565b816111f8600082611438565b6112335760408051808201825260098152681393d517d193d5539160ba1b6020820152905162461bcd60e51b81526102559190600401611b4e565b6001600160a01b0380831660009081526007602052604090206002015483911661129357604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102559190600401611b4e565b600084815260026020526040812090805b60028301548110156113ad57856001600160a01b03168360020182815481106112cf576112cf611b61565b6000918252602090912001546001600160a01b0316036113a5576002830180546112fb90600190611d67565b8154811061130b5761130b611b61565b6000918252602090912001546002840180546001600160a01b03909216918390811061133957611339611b61565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508260020180548061137a5761137a611da6565b600082815260209020810160001990810180546001600160a01b0319169055019055600191506113ad565b6001016112a4565b50806113ef57604080518082018252600e81526d1393d11157d393d517d193d5539160921b6020820152905162461bcd60e51b81526102559190600401611b4e565b604080518781526001600160a01b03871660208201526000918101919091527faaa473c28a5fe04b6a7ecd795826e462f9d0c23f00ef9f51ec02fa6ea418806f90606001610c7f565b600081815260018301602052604081205415155b90505b92915050565b600061144f825490565b600061144c83836114ad565b6001600160a01b0381166000908152600183016020526040812054151561144c565b600061144c83836114d7565b606060006114a683611526565b9392505050565b60008260000182815481106114c4576114c4611b61565b9060005260206000200154905092915050565b600081815260018301602052604081205461151e5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561144f565b50600061144f565b60608160000180548060200260200160405190810160405280929190818152602001828054801561157657602002820191906000526020600020905b815481526020019060010190808311611562575b50505050509050919050565b6040805180820190915260008152602081016115c76040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b905290565b828054828255906000526020600020908101928215611621579160200282015b8281111561162157825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906115ec565b5061162d92915061166e565b5090565b50805461163d90611bb0565b6000825580601f1061164d575050565b601f01602090049060005260206000209081019061166b919061166e565b50565b5b8082111561162d576000815560010161166f565b60006020828403121561169557600080fd5b5035919050565b600060a08301825184526020808401516001600160401b0380821660208801528060408701511660408801528060608701511660608801525050608084015160a0608087015282815180855260c088019150602083019450600092505b808310156117225784516001600160a01b031682529383019360019290920191908301906116f9565b509695505050505050565b60208152600061144c602083018461169c565b80356001600160a01b038116811461175757600080fd5b919050565b60006020828403121561176e57600080fd5b61144c82611740565b805182526000602082015160406020850152611796604085018261169c565b949350505050565b60008282518085526020808601955060208260051b8401016020860160005b848110156117eb57601f198684030189526117d9838351611777565b988401989250908301906001016117bd565b5090979650505050505050565b60208152600061144c602083018461179e565b6000815180845260005b8181101561183157602081850181015186830182015201611815565b506000602082860101526020601f19601f83011685010191505092915050565b606081526000611864606083018661169c565b846020840152828103604084015261187c818561180b565b9695505050505050565b60208152600061144c6020830184611777565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156118d7576118d7611899565b604052919050565b600082601f8301126118f057600080fd5b81356001600160401b0381111561190957611909611899565b61191c601f8201601f19166020016118af565b81815284602083860101111561193157600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561196457600080fd5b843593506020808601356001600160401b038082111561198357600080fd5b818801915088601f83011261199757600080fd5b8135818111156119a9576119a9611899565b8060051b6119b88582016118af565b918252838101850191858101908c8411156119d257600080fd5b948601945b838610156119f7576119e886611740565b825294860194908601906119d7565b9850505050604088013594506060880135925080831115611a1757600080fd5b5050611a25878288016118df565b91505092959194509250565b6020808252825182820181905260009190848201906040850190845b81811015611a6957835183529284019291840191600101611a4d565b50909695505050505050565b60008060408385031215611a8857600080fd5b82359150611a9860208401611740565b90509250929050565b60008060408385031215611ab457600080fd5b50508035926020909101359150565b604081526000611ad6604083018561179e565b905082151560208301529392505050565b600080600080600060a08688031215611aff57600080fd5b85359450602086013593506040860135925060608601356001600160401b0381168114611b2b57600080fd5b915060808601358015158114611b4057600080fd5b809150509295509295909350565b60208152600061144c602083018461180b565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff808316818103611ba657611ba6611b77565b6001019392505050565b600181811c90821680611bc457607f821691505b60208210810361072c57634e487b7160e01b600052602260045260246000fd5b601f821115611c30576000816000526020600020601f850160051c81016020861015611c0d5750805b601f850160051c820191505b81811015611c2c57828155600101611c19565b5050505b505050565b81516001600160401b03811115611c4e57611c4e611899565b611c6281611c5c8454611bb0565b84611be4565b602080601f831160018114611c975760008415611c7f5750858301515b600019600386901b1c1916600185901b178555611c2c565b600085815260208120601f198616915b82811015611cc657888601518255948401946001909101908401611ca7565b5085821015611ce45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006080820186835260206080602085015281875180845260a08601915060208901935060005b81811015611d405784516001600160a01b031683529383019391830191600101611d1b565b50508660408601528481036060860152611d5a818761180b565b9998505050505050505050565b8181038181111561144f5761144f611b77565b8082018082111561144f5761144f611b77565b600060018201611d9f57611d9f611b77565b5060010190565b634e487b7160e01b600052603160045260246000fd","sourceMap":"591:6929:182:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1848:196;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6663:855;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5767:344::-;;;:::i;2409:350::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;2048:296::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;762:1082::-;;;;;;:::i;:::-;;:::i;:::-;;5658:105;;;:::i;:::-;;;;;;;:::i;4463:504::-;;;;;;:::i;:::-;;:::i;5559:95::-;;;:::i;:::-;;;7686:25:514;;;7674:2;7659:18;5559:95:182;7540:177:514;6115:544:182;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;2763:1696::-;;;;;;:::i;:::-;;:::i;4971:584::-;;;;;;:::i;:::-;;:::i;1848:196::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1934:29:182;;1954:8;1934:19;:29::i;:::-;1929:73;;1972:29;;;;;;;;;;;-1:-1:-1;;;1972:29:182;;;;1965:37;;-1:-1:-1;;;1965:37:182;;;;1972:29;1965:37;;;:::i;:::-;;;;;;;;1929:73;2016:2;:23;;;:13;:23;;;;;;;;;2009:30;;;;;;;;;;;;;;;-1:-1:-1;;;;;2009:30:182;;;;;;;-1:-1:-1;;;2009:30:182;;;;;;;;-1:-1:-1;;;2009:30:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2016:23;;2009:30;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2009:30:182;;;;;;;;;;;;;;;;;;;;;;;;;;;1848:196;;;:::o;6663:855::-;6741:21;6827:29;6873:19;6827:29;6873:17;:19::i;:::-;-1:-1:-1;;;;;6859:34:182;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6859:34:182;-1:-1:-1;6827:66:182;-1:-1:-1;6899:18:182;;6923:326;6947:19;:2;:17;:19::i;:::-;6943:1;:23;6923:326;;;6981:10;6994:16;6981:10;7008:1;6994:13;:16::i;:::-;7018:21;7042:17;;;:13;:17;;;;;6981:29;;-1:-1:-1;7067:176:182;7091:12;;;:19;7087:23;;7067:176;;;7150:11;-1:-1:-1;;;;;7131:30:182;:6;:12;;7144:1;7131:15;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;7131:15:182;:30;7127:108;;7205:2;7175:12;7188:13;;;;:::i;:::-;;;7175:27;;;;;;;;;;:::i;:::-;;;;;;:32;;;;;7219:5;;7127:108;7112:3;;7067:176;;;;6973:276;;6968:3;;;;;6923:326;;;;7255:29;7306:11;7287:31;;-1:-1:-1;;;;;7287:31:182;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;7255:63;;7329:9;7324:169;7348:11;7344:15;;:1;:15;7324:169;;;7387:99;;;;;;;;7414:12;7427:1;7414:15;;;;;;;;:::i;:::-;;;;;;;7387:99;;;;7447:2;:13;;:30;7461:12;7474:1;7461:15;;;;;;;;:::i;:::-;;;;;;;;;;;;7447:30;;;;;;;;;;;;;-1:-1:-1;7447:30:182;7387:99;;;;;;;;;;;;;;;-1:-1:-1;;;;;7387:99:182;;;;;;;-1:-1:-1;;;7387:99:182;;;;;;;;-1:-1:-1;;;7387:99:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7447:30;;7387:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7387:99:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;7374:7;7382:1;7374:10;;;;;;;;:::i;:::-;;;;;;;;;;:112;7361:3;;7324:169;;;-1:-1:-1;7506:7:182;6663:855;-1:-1:-1;;;;6663:855:182:o;5767:344::-;5815:21;5844:29;5895:19;5844:29;5895:17;:19::i;:::-;-1:-1:-1;;;;;5876:39:182;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;5844:71;;5927:9;5922:164;5946:19;:2;:17;:19::i;:::-;5942:1;:23;5922:164;;;5980:10;5993:16;5980:10;6007:1;5993:13;:16::i;:::-;6030:49;;;;;;;;;;;-1:-1:-1;6060:17:182;;;:13;6030:49;6060:17;;;;;;;6030:49;;;;;;;;;;;;;;;-1:-1:-1;;;;;6030:49:182;;;;;;;-1:-1:-1;;;6030:49:182;;;;;;;;-1:-1:-1;;;6030:49:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;5980:29;;-1:-1:-1;6030:49:182;;;;;;;;6060:17;;6030:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6030:49:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;6017:7;6025:1;6017:10;;;;;;;;:::i;:::-;;;;;;;;;;:62;-1:-1:-1;5967:3:182;;5922:164;;;-1:-1:-1;6099:7:182;5767:344;-1:-1:-1;5767:344:182:o;2409:350::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2537:29:182;-1:-1:-1;2557:8:182;2537:19;:29::i;:::-;2532:73;;2575:29;;;;;;;;;;;-1:-1:-1;;;2575:29:182;;;;2568:37;;-1:-1:-1;;;2568:37:182;;;;2575:29;2568:37;;;:::i;2532:73::-;2627:2;:23;;;:13;:23;;;;;;;;2658:33;:43;;;;;;2709:29;:39;;;;;;2612:142;;;;;;;;;;;;;;;-1:-1:-1;;;;;2612:142:182;;;;;;;-1:-1:-1;;;2612:142:182;;;;;;;;-1:-1:-1;;;2612:142:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;2627:23;;2658:43;2709:39;;2612:142;;2627:23;;2612:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2612:142:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2409:350;;;;;:::o;2048:296::-;2116:19;;:::i;:::-;2152;:2;:17;:19::i;:::-;2147:1;:24;2143:82;;2188:29;;;;;;;;;;;-1:-1:-1;;;2188:29:182;;;;2181:37;;-1:-1:-1;;;2181:37:182;;;;2188:29;2181:37;;;:::i;2143:82::-;2230:16;2249;2230;2263:1;2249:13;:16::i;:::-;2278:61;;;;;;;;;;;-1:-1:-1;2314:23:182;;;:13;2278:61;2314:23;;;;;;;2278:61;;;;;;;;;;;;;;;-1:-1:-1;;;;;2278:61:182;;;;;;;-1:-1:-1;;;2278:61:182;;;;;;;;-1:-1:-1;;;2278:61:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;2230:35;;-1:-1:-1;2278:61:182;;;;;;;;2314:23;;2278:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2278:61:182;;;;;;;;;;;;;;;;-1:-1:-1;;;2278:61:182;;;;-1:-1:-1;;;2278:61:182;;2271:68;2048:296;-1:-1:-1;;;2048:296:182:o;762:1082::-;927:10;2945:1:184;2899:22;;;:16;:22;;;;;:34;;;-1:-1:-1;;;;;2899:34:184;2895:102;;2962:34;;;;;;;;;;;-1:-1:-1;;;2962:34:184;;;;2955:42;;-1:-1:-1;;;2955:42:184;;;;2962:34;2955:42;;;:::i;2895:102::-;1012:29:182::1;:2;1032:8:::0;1012:19:::1;:29::i;:::-;1008:83;;;1056:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1056:34:182::1;::::0;::::1;::::0;1049:42;;-1:-1:-1;;;1049:42:182;;::::1;::::0;1056:34;1049:42:::1;;;:::i;1008:83::-;1172:9;1167:142;1191:5;:12;1187:1;:16;1167:142;;;1223:27;1241:5;1247:1;1241:8;;;;;;;;:::i;:::-;;;;;;;1223:2;:8;;:17;;:27;;;;:::i;:::-;1218:84;;1267:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1267:34:182::1;::::0;::::1;::::0;1260:42;;-1:-1:-1;;;1260:42:182;;::::1;::::0;1267:34;1260:42:::1;;;:::i;1218:84::-;1205:3;;1167:142;;;-1:-1:-1::0;1376:144:182::1;::::0;;::::1;::::0;::::1;::::0;;;;;1353:20:::1;1376:144;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;1527:24:::1;::::0;1542:8;1527:14:::1;:24::i;:::-;-1:-1:-1::0;1557:2:182::1;:23:::0;;;:13:::1;:23;::::0;;;;;;;;:32;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;1557:32:182;;::::1;-1:-1:-1::0;;;1557:32:182::1;-1:-1:-1::0;;;;1557:32:182;;::::1;-1:-1:-1::0;;;1557:32:182::1;-1:-1:-1::0;;1557:32:182;;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;1583:6;;1557:23;:32:::1;::::0;;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;1595:2:182::1;:39:::0;;;:29:::1;:39;::::0;;;;:58:::1;1637:16:::0;1595:39;:58:::1;:::i;:::-;-1:-1:-1::0;1659:2:182::1;:43:::0;;;:33:::1;:43;::::0;;;;;;:66;;;1737:102;::::1;::::0;::::1;::::0;1693:8;;1776:5;;1705:20;;1817:16;;1737:102:::1;:::i;:::-;;;;;;;;939:905;762:1082:::0;;;;;:::o;5658:105::-;5708:16;5739:19;:2;:17;:19::i;:::-;5732:26;;5658:105;:::o;4463:504::-;4561:8;3198:29:184;:2;4561:8:182;3198:19:184;:29::i;:::-;3193:73;;3236:29;;;;;;;;;;;-1:-1:-1;;;3236:29:184;;;;3229:37;;-1:-1:-1;;;3229:37:184;;;;3236:29;3229:37;;;:::i;3193:73::-;-1:-1:-1;;;;;2899:22:184;;::::1;2945:1;2899:22:::0;;;:16:::1;:22;::::0;;;;:34:::1;;::::0;4580:11:182;;2899:34:184::1;2895:102;;2962:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;2962:34:184::1;::::0;::::1;::::0;2955:42;;-1:-1:-1;;;2955:42:184;;::::1;::::0;2962:34;2955:42:::1;;;:::i;2895:102::-;4599:21:182::2;4623:23:::0;;;:13:::2;:23;::::0;;;;;4712:151:::2;4736:12;::::0;::::2;:19:::0;4732:23;::::2;4712:151;;;4793:11;-1:-1:-1::0;;;;;4774:30:182::2;:6;:12;;4787:1;4774:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;4774:15:182::2;:30:::0;4770:86:::2;;4821:34;::::0;;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;4821:34:182::2;::::0;::::2;::::0;4814:42;;-1:-1:-1;;;4814:42:182;;::::2;::::0;4821:34;4814:42:::2;;;:::i;4770:86::-;4757:3;;4712:151;;;-1:-1:-1::0;4869:12:182::2;::::0;::::2;:30:::0;;::::2;::::0;;::::2;::::0;;-1:-1:-1;4869:30:182;;;::::2;::::0;;;;;;::::2;::::0;;-1:-1:-1;;;;;;4869:30:182::2;-1:-1:-1::0;;;;;4869:30:182;::::2;::::0;;::::2;::::0;;;4911:51:::2;::::0;;13460:25:514;;;13501:18;;;13494:60;;;;13570:18;;13563:50;4911:51:182::2;::::0;13448:2:514;13433:18;4911:51:182::2;;;;;;;4593:374;3272:1:184::1;4463:504:182::0;;;:::o;5559:95::-;5608:7;5630:19;5608:7;5630:17;:19::i;6115:544::-;6208:21;6231:4;6259;6251:5;:12;6265:27;;;;;;;;;;;;;-1:-1:-1;;;6265:27:182;;;6243:50;;;;;-1:-1:-1;;;6243:50:182;;;;;;;;:::i;:::-;-1:-1:-1;6300:29:182;6351:12;6358:5;6351:4;:12;:::i;:::-;-1:-1:-1;;;;;6332:32:182;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;6300:64;;6383:9;6371:232;6419:19;:2;:17;:19::i;:::-;6406:9;6414:1;6406:5;:9;:::i;:::-;6405:33;6404:59;;;;-1:-1:-1;6458:4:182;6445:9;6453:1;6445:5;:9;:::i;:::-;6444:18;6404:59;6371:232;;;6489:10;6502:24;6516:9;6524:1;6516:5;:9;:::i;:::-;6502:2;;:13;:24::i;:::-;6547:49;;;;;;;;;;;-1:-1:-1;6577:17:182;;;:13;6547:49;6577:17;;;;;;;6547:49;;;;;;;;;;;;;;;-1:-1:-1;;;;;6547:49:182;;;;;;;-1:-1:-1;;;6547:49:182;;;;;;;;-1:-1:-1;;;6547:49:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;6489:37;;-1:-1:-1;6547:49:182;;;;;;;;6577:17;;6547:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6547:49:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;6534:7;6542:1;6534:10;;;;;;;;:::i;:::-;;;;;;:62;;;;6481:122;6471:3;;;;:::i;:::-;;;6371:232;;;-1:-1:-1;6617:7:182;6634:19;:2;:17;:19::i;:::-;6609:45;;6626:27;;;;-1:-1:-1;;;;6115:544:182:o;2763:1696::-;2953:10;2945:1:184;2899:22;;;:16;:22;;;;;:34;;;-1:-1:-1;;;;;2899:34:184;2895:102;;2962:34;;;;;;;;;;;-1:-1:-1;;;2962:34:184;;;;2955:42;;-1:-1:-1;;;2955:42:184;;;;2962:34;2955:42;;;:::i;2895:102::-;3029:29:182::1;:2;3049:8:::0;3029:19:::1;:29::i;:::-;3024:88;;3075:29;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3075:29:182::1;::::0;::::1;::::0;3068:37;;-1:-1:-1;;;3068:37:182;;::::1;::::0;3075:29;3068:37:::1;;;:::i;3024:88::-;3118:21;3142:23:::0;;;:13:::1;:23;::::0;;;;3957:44;;;4007:23:::1;::::0;::::1;:42:::0;;-1:-1:-1;;4007:42:182::1;-1:-1:-1::0;;;;;4007:42:182;::::1;;::::0;;4096:63;::::1;;;585:1;4118:12:::0;;::::1;:34:::0;;-1:-1:-1;;;;4118:34:182;::::1;-1:-1:-1::0;;;4118:34:182;;;::::1;-1:-1:-1::0;;;;;4118:34:182::1;::::0;;::::1;;::::0;;;::::1;::::0;;4096:63:::1;4246:16;-1:-1:-1::0;;;;;4246:21:182::1;4266:1;4246:21:::0;4242:88:::1;;4284:2;:39:::0;;;:29:::1;:39;::::0;;;;4277:46:::1;::::0;::::1;:::i;:::-;4341:113;::::0;;14250:25:514;;;14306:2;14291:18;;14284:34;;;-1:-1:-1;;;;;14354:31:514;;14334:18;;;14327:59;14429:14;;14422:22;14417:2;14402:18;;14395:50;4341:113:182;;::::1;::::0;;;;14237:3:514;4341:113:182;;::::1;2965:1494;2763:1696:::0;;;;;;:::o;4971:584::-;5072:8;3198:29:184;:2;5072:8:182;3198:19:184;:29::i;:::-;3193:73;;3236:29;;;;;;;;;;;-1:-1:-1;;;3236:29:184;;;;3229:37;;-1:-1:-1;;;3229:37:184;;;;3236:29;3229:37;;;:::i;3193:73::-;-1:-1:-1;;;;;2899:22:184;;::::1;2945:1;2899:22:::0;;;:16:::1;:22;::::0;;;;:34:::1;;::::0;5091:11:182;;2899:34:184::1;2895:102;;2962:34;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;2962:34:184::1;::::0;::::1;::::0;2955:42;;-1:-1:-1;;;2955:42:184;;::::1;::::0;2962:34;2955:42:::1;;;:::i;2895:102::-;5110:21:182::2;5134:23:::0;;;:13:::2;:23;::::0;;;;;5110:21;5188:239:::2;5212:12;::::0;::::2;:19:::0;5208:23;::::2;5188:239;;;5269:11;-1:-1:-1::0;;;;;5250:30:182::2;:6;:12;;5263:1;5250:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;5250:15:182::2;:30:::0;5246:175:::2;;5310:12;::::0;::::2;5323:19:::0;;:23:::2;::::0;5345:1:::2;::::0;5323:23:::2;:::i;:::-;5310:37;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;5292:12:::2;::::0;::::2;:15:::0;;-1:-1:-1;;;;;5310:37:182;;::::2;::::0;5305:1;;5292:15;::::2;;;;;:::i;:::-;;;;;;;;;:55;;;;;-1:-1:-1::0;;;;;5292:55:182::2;;;;;-1:-1:-1::0;;;;;5292:55:182::2;;;;;;5357:6;:12;;:18;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;-1:-1:-1;;5357:18:182;;;;;-1:-1:-1;;;;;;5357:18:182::2;::::0;;;;;::::2;::::0;-1:-1:-1;5407:5:182::2;;5246:175;5233:3;;5188:239;;;;5437:5;5432:54;;5451:34;::::0;;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;5451:34:182::2;::::0;::::2;::::0;5444:42;;-1:-1:-1;;;5444:42:182;;::::2;::::0;5451:34;5444:42:::2;;;:::i;5432:54::-;5498:52;::::0;;13460:25:514;;;-1:-1:-1;;;;;13521:32:514;;13516:2;13501:18;;13494:60;5544:5:182::2;13570:18:514::0;;;13563:50;;;;5498:52:182::2;::::0;13448:2:514;13433:18;5498:52:182::2;13264:355:514::0;6431:138:447;6511:4;4360:21;;;:14;;;:21;;;;;;:26;;6534:28;6527:35;;6431:138;;;;;:::o;6650:115::-;6713:7;6739:19;6747:3;4556:18;;4474:107;7107:129;7181:7;7207:22;7211:3;7223:5;7207:3;:22::i;8871:165::-;-1:-1:-1;;;;;9004:23:447;;8951:4;4360:21;;;:14;;;:21;;;;;;:26;;8974:55;4264:129;5930:123;6000:4;6023:23;6028:3;6040:5;6023:4;:23::i;7776:300::-;7839:16;7867:22;7892:19;7900:3;7892:7;:19::i;:::-;7867:44;7776:300;-1:-1:-1;;;7776:300:447:o;4923:118::-;4990:7;5016:3;:11;;5028:5;5016:18;;;;;;;;:::i;:::-;;;;;;;;;5009:25;;4923:118;;;;:::o;2241:406::-;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:447;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:447;2618:12;;5581:109;5637:16;5672:3;:11;;5665:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5581:109;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;14:180:514;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:514;;14:180;-1:-1:-1;14:180:514:o;199:948::-;248:3;287:4;282:3;278:14;319:5;313:12;308:3;301:25;345:4;395;388:5;384:16;378:23;-1:-1:-1;;;;;488:2:514;474:12;470:21;463:4;458:3;454:14;447:45;553:2;545:4;538:5;534:16;528:23;524:32;517:4;512:3;508:14;501:56;618:2;610:4;603:5;599:16;593:23;589:32;582:4;577:3;573:14;566:56;;;670:4;663:5;659:16;653:23;708:4;701;696:3;692:14;685:28;735:4;768:14;762:21;805:6;799:4;792:20;839:3;834;830:13;821:22;;886:4;870:14;866:25;852:39;;909:1;900:10;;919:201;933:6;930:1;927:13;919:201;;;1000:13;;-1:-1:-1;;;;;996:39:514;982:54;;1095:15;;;;1032:1;948:9;;;;;1058:14;;;;919:201;;;-1:-1:-1;1136:5:514;199:948;-1:-1:-1;;;;;;199:948:514:o;1152:257::-;1331:2;1320:9;1313:21;1294:4;1351:52;1399:2;1388:9;1384:18;1376:6;1351:52;:::i;1414:173::-;1482:20;;-1:-1:-1;;;;;1531:31:514;;1521:42;;1511:70;;1577:1;1574;1567:12;1511:70;1414:173;;;:::o;1592:186::-;1651:6;1704:2;1692:9;1683:7;1679:23;1675:32;1672:52;;;1720:1;1717;1710:12;1672:52;1743:29;1762:9;1743:29;:::i;1783:263::-;1874:5;1868:12;1863:3;1856:25;1838:3;1927:4;1920:5;1916:16;1910:23;1965:4;1958;1953:3;1949:14;1942:28;1986:54;2034:4;2029:3;2025:14;2011:12;1986:54;:::i;:::-;1979:61;1783:263;-1:-1:-1;;;;1783:263:514:o;2051:624::-;2116:3;2147;2179:5;2173:12;2206:6;2201:3;2194:19;2232:4;2261;2256:3;2252:14;2245:21;;2319:4;2309:6;2306:1;2302:14;2295:5;2291:26;2287:37;2358:4;2351:5;2347:16;2381:1;2391:258;2405:6;2402:1;2399:13;2391:258;;;2492:2;2488:7;2480:5;2474:4;2470:16;2466:30;2461:3;2454:43;2518:51;2564:4;2555:6;2549:13;2518:51;:::i;:::-;2627:12;;;;2510:59;-1:-1:-1;2592:15:514;;;;2427:1;2420:9;2391:258;;;-1:-1:-1;2665:4:514;;2051:624;-1:-1:-1;;;;;;;2051:624:514:o;2680:335::-;2921:2;2910:9;2903:21;2884:4;2941:68;3005:2;2994:9;2990:18;2982:6;2941:68;:::i;3020:422::-;3061:3;3099:5;3093:12;3126:6;3121:3;3114:19;3151:1;3161:162;3175:6;3172:1;3169:13;3161:162;;;3237:4;3293:13;;;3289:22;;3283:29;3265:11;;;3261:20;;3254:59;3190:12;3161:162;;;3165:3;3368:1;3361:4;3352:6;3347:3;3343:16;3339:27;3332:38;3431:4;3424:2;3420:7;3415:2;3407:6;3403:15;3399:29;3394:3;3390:39;3386:50;3379:57;;;3020:422;;;;:::o;3447:488::-;3700:2;3689:9;3682:21;3663:4;3726:52;3774:2;3763:9;3759:18;3751:6;3726:52;:::i;:::-;3814:6;3809:2;3798:9;3794:18;3787:34;3869:9;3861:6;3857:22;3852:2;3841:9;3837:18;3830:50;3897:32;3922:6;3914;3897:32;:::i;:::-;3889:40;3447:488;-1:-1:-1;;;;;;3447:488:514:o;4125:275::-;4316:2;4305:9;4298:21;4279:4;4336:58;4390:2;4379:9;4375:18;4367:6;4336:58;:::i;4405:127::-;4466:10;4461:3;4457:20;4454:1;4447:31;4497:4;4494:1;4487:15;4521:4;4518:1;4511:15;4537:275;4608:2;4602:9;4673:2;4654:13;;-1:-1:-1;;4650:27:514;4638:40;;-1:-1:-1;;;;;4693:34:514;;4729:22;;;4690:62;4687:88;;;4755:18;;:::i;:::-;4791:2;4784:22;4537:275;;-1:-1:-1;4537:275:514:o;4817:530::-;4859:5;4912:3;4905:4;4897:6;4893:17;4889:27;4879:55;;4930:1;4927;4920:12;4879:55;4966:6;4953:20;-1:-1:-1;;;;;4988:2:514;4985:26;4982:52;;;5014:18;;:::i;:::-;5058:55;5101:2;5082:13;;-1:-1:-1;;5078:27:514;5107:4;5074:38;5058:55;:::i;:::-;5138:2;5129:7;5122:19;5184:3;5177:4;5172:2;5164:6;5160:15;5156:26;5153:35;5150:55;;;5201:1;5198;5191:12;5150:55;5266:2;5259:4;5251:6;5247:17;5240:4;5231:7;5227:18;5214:55;5314:1;5289:16;;;5307:4;5285:27;5278:38;;;;5293:7;4817:530;-1:-1:-1;;;4817:530:514:o;5352:1287::-;5472:6;5480;5488;5496;5549:3;5537:9;5528:7;5524:23;5520:33;5517:53;;;5566:1;5563;5556:12;5517:53;5602:9;5589:23;5579:33;;5631:2;5684;5673:9;5669:18;5656:32;-1:-1:-1;;;;;5748:2:514;5740:6;5737:14;5734:34;;;5764:1;5761;5754:12;5734:34;5802:6;5791:9;5787:22;5777:32;;5847:7;5840:4;5836:2;5832:13;5828:27;5818:55;;5869:1;5866;5859:12;5818:55;5905:2;5892:16;5927:2;5923;5920:10;5917:36;;;5933:18;;:::i;:::-;5979:2;5976:1;5972:10;6002:28;6026:2;6022;6018:11;6002:28;:::i;:::-;6064:15;;;6134:11;;;6130:20;;;6095:12;;;;6162:19;;;6159:39;;;6194:1;6191;6184:12;6159:39;6218:11;;;;6238:148;6254:6;6249:3;6246:15;6238:148;;;6320:23;6339:3;6320:23;:::i;:::-;6308:36;;6271:12;;;;6364;;;;6238:148;;;6405:5;-1:-1:-1;;;;6457:2:514;6442:18;;6429:32;;-1:-1:-1;6514:2:514;6499:18;;6486:32;;-1:-1:-1;6530:16:514;;;6527:36;;;6559:1;6556;6549:12;6527:36;;;6582:51;6625:7;6614:8;6603:9;6599:24;6582:51;:::i;:::-;6572:61;;;5352:1287;;;;;;;:::o;6644:632::-;6815:2;6867:21;;;6937:13;;6840:18;;;6959:22;;;6786:4;;6815:2;7038:15;;;;7012:2;6997:18;;;6786:4;7081:169;7095:6;7092:1;7089:13;7081:169;;;7156:13;;7144:26;;7225:15;;;;7190:12;;;;7117:1;7110:9;7081:169;;;-1:-1:-1;7267:3:514;;6644:632;-1:-1:-1;;;;;;6644:632:514:o;7281:254::-;7349:6;7357;7410:2;7398:9;7389:7;7385:23;7381:32;7378:52;;;7426:1;7423;7416:12;7378:52;7462:9;7449:23;7439:33;;7491:38;7525:2;7514:9;7510:18;7491:38;:::i;:::-;7481:48;;7281:254;;;;;:::o;7722:248::-;7790:6;7798;7851:2;7839:9;7830:7;7826:23;7822:32;7819:52;;;7867:1;7864;7857:12;7819:52;-1:-1:-1;;7890:23:514;;;7960:2;7945:18;;;7932:32;;-1:-1:-1;7722:248:514:o;7975:416::-;8238:2;8227:9;8220:21;8201:4;8258:68;8322:2;8311:9;8307:18;8299:6;8258:68;:::i;:::-;8250:76;;8376:6;8369:14;8362:22;8357:2;8346:9;8342:18;8335:50;7975:416;;;;;:::o;8396:659::-;8487:6;8495;8503;8511;8519;8572:3;8560:9;8551:7;8547:23;8543:33;8540:53;;;8589:1;8586;8579:12;8540:53;8625:9;8612:23;8602:33;;8682:2;8671:9;8667:18;8654:32;8644:42;;8733:2;8722:9;8718:18;8705:32;8695:42;;8787:2;8776:9;8772:18;8759:32;-1:-1:-1;;;;;8824:5:514;8820:30;8813:5;8810:41;8800:69;;8865:1;8862;8855:12;8800:69;8888:5;-1:-1:-1;8945:3:514;8930:19;;8917:33;8988:15;;8981:23;8969:36;;8959:64;;9019:1;9016;9009:12;8959:64;9042:7;9032:17;;;8396:659;;;;;;;;:::o;9060:219::-;9209:2;9198:9;9191:21;9172:4;9229:44;9269:2;9258:9;9254:18;9246:6;9229:44;:::i;9284:127::-;9345:10;9340:3;9336:20;9333:1;9326:31;9376:4;9373:1;9366:15;9400:4;9397:1;9390:15;9416:127;9477:10;9472:3;9468:20;9465:1;9458:31;9508:4;9505:1;9498:15;9532:4;9529:1;9522:15;9548:201;9586:3;9614:10;9659:2;9652:5;9648:14;9686:2;9677:7;9674:15;9671:41;;9692:18;;:::i;:::-;9741:1;9728:15;;9548:201;-1:-1:-1;;;9548:201:514:o;9754:380::-;9833:1;9829:12;;;;9876;;;9897:61;;9951:4;9943:6;9939:17;9929:27;;9897:61;10004:2;9996:6;9993:14;9973:18;9970:38;9967:161;;10050:10;10045:3;10041:20;10038:1;10031:31;10085:4;10082:1;10075:15;10113:4;10110:1;10103:15;10264:542;10365:2;10360:3;10357:11;10354:446;;;10401:1;10425:5;10422:1;10415:16;10469:4;10466:1;10456:18;10539:2;10527:10;10523:19;10520:1;10516:27;10510:4;10506:38;10575:4;10563:10;10560:20;10557:47;;;-1:-1:-1;10598:4:514;10557:47;10653:2;10648:3;10644:12;10641:1;10637:20;10631:4;10627:31;10617:41;;10708:82;10726:2;10719:5;10716:13;10708:82;;;10771:17;;;10752:1;10741:13;10708:82;;;10712:3;;;10354:446;10264:542;;;:::o;10982:1341::-;11106:3;11100:10;-1:-1:-1;;;;;11125:6:514;11122:30;11119:56;;;11155:18;;:::i;:::-;11184:96;11273:6;11233:38;11265:4;11259:11;11233:38;:::i;:::-;11227:4;11184:96;:::i;:::-;11335:4;;11392:2;11381:14;;11409:1;11404:662;;;;12110:1;12127:6;12124:89;;;-1:-1:-1;12179:19:514;;;12173:26;12124:89;-1:-1:-1;;10939:1:514;10935:11;;;10931:24;10927:29;10917:40;10963:1;10959:11;;;10914:57;12226:81;;11374:943;;11404:662;10211:1;10204:14;;;10248:4;10235:18;;-1:-1:-1;;11440:20:514;;;11557:236;11571:7;11568:1;11565:14;11557:236;;;11660:19;;;11654:26;11639:42;;11752:27;;;;11720:1;11708:14;;;;11587:19;;11557:236;;;11561:3;11821:6;11812:7;11809:19;11806:201;;;11882:19;;;11876:26;-1:-1:-1;;11965:1:514;11961:14;;;11977:3;11957:24;11953:37;11949:42;11934:58;11919:74;;11806:201;-1:-1:-1;;;;;12053:1:514;12037:14;;;12033:22;12020:36;;-1:-1:-1;10982:1341:514:o;12328:931::-;12572:4;12620:3;12609:9;12605:19;12651:6;12640:9;12633:25;12677:2;12715:3;12710:2;12699:9;12695:18;12688:31;12739:6;12774;12768:13;12805:6;12797;12790:22;12843:3;12832:9;12828:19;12821:26;;12882:2;12874:6;12870:15;12856:29;;12903:1;12913:195;12927:6;12924:1;12921:13;12913:195;;;12992:13;;-1:-1:-1;;;;;12988:39:514;12976:52;;13083:15;;;;13048:12;;;;13024:1;12942:9;12913:195;;;12917:3;;13144:6;13139:2;13128:9;13124:18;13117:34;13196:9;13191:3;13187:19;13182:2;13171:9;13167:18;13160:47;13224:29;13249:3;13241:6;13224:29;:::i;:::-;13216:37;12328:931;-1:-1:-1;;;;;;;;;12328:931:514:o;13624:128::-;13691:9;;;13712:11;;;13709:37;;;13726:18;;:::i;13757:125::-;13822:9;;;13843:10;;;13840:36;;;13856:18;;:::i;13887:135::-;13926:3;13947:17;;;13944:43;;13967:18;;:::i;:::-;-1:-1:-1;14014:1:514;14003:13;;13887:135::o;14456:127::-;14517:10;14512:3;14508:20;14505:1;14498:31;14548:4;14545:1;14538:15;14572:4;14569:1;14562:15","linkReferences":{}},"methodIdentifiers":{"allocateStream(bytes32,address[],bytes32,bytes)":"6b883c39","getAllStreamIds()":"86789fc6","getAllStreams()":"3bd84c0c","getPaginatedStreams(uint256,uint256)":"ca78c41a","getStream(bytes32)":"1290abe8","getStreamByIndex(uint256)":"68b454df","getStreamCount()":"c0f22084","getStreamWithGenesis(bytes32)":"3c2544d1","getStreamsOnNode(address)":"32705ac4","placeStreamOnNode(bytes32,address)":"9ee86d38","removeStreamFromNode(bytes32,address)":"ee885b12","setStreamLastMiniblock(bytes32,bytes32,bytes32,uint64,bool)":"d7a3158a"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"genesisMiniblockHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"genesisMiniblock\",\"type\":\"bytes\"}],\"name\":\"StreamAllocated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isSealed\",\"type\":\"bool\"}],\"name\":\"StreamLastMiniblockUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isAdded\",\"type\":\"bool\"}],\"name\":\"StreamPlacementUpdated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"},{\"internalType\":\"bytes32\",\"name\":\"genesisMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"genesisMiniblock\",\"type\":\"bytes\"}],\"name\":\"allocateStream\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllStreamIds\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllStreams\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"stream\",\"type\":\"tuple\"}],\"internalType\":\"struct StreamWithId[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"start\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stop\",\"type\":\"uint256\"}],\"name\":\"getPaginatedStreams\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"stream\",\"type\":\"tuple\"}],\"internalType\":\"struct StreamWithId[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"}],\"name\":\"getStream\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"i\",\"type\":\"uint256\"}],\"name\":\"getStreamByIndex\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"stream\",\"type\":\"tuple\"}],\"internalType\":\"struct StreamWithId\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStreamCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"}],\"name\":\"getStreamWithGenesis\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"getStreamsOnNode\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"reserved0\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"flags\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"nodes\",\"type\":\"address[]\"}],\"internalType\":\"struct Stream\",\"name\":\"stream\",\"type\":\"tuple\"}],\"internalType\":\"struct StreamWithId[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"placeStreamOnNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"nodeAddress\",\"type\":\"address\"}],\"name\":\"removeStreamFromNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"streamId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"lastMiniblockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastMiniblockNum\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isSealed\",\"type\":\"bool\"}],\"name\":\"setStreamLastMiniblock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAllStreamIds()\":{\"details\":\"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.\"},\"getAllStreams()\":{\"details\":\"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.\"},\"getPaginatedStreams(uint256,uint256)\":{\"details\":\"Recommended range is 5000 streams, returns true if on the last page.\"},\"getStreamWithGenesis(bytes32)\":{\"returns\":{\"_0\":\"stream, genesisMiniblockHash, genesisMiniblock\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAllStreamIds()\":{\"notice\":\"Return array containing all stream ids\"},\"getAllStreams()\":{\"notice\":\"Return array containing all streams\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/river/registry/facets/stream/StreamRegistry.sol\":\"StreamRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/river/registry/facets/stream/IStreamRegistry.sol\":{\"keccak256\":\"0x47337d9108adb07ab81e4c71666f916e96234e9837edde35866116c6627d2ff7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d7d8a5ad98688de306264be8e7bd41edc3f141d8e852b6545c07748a13879ac9\",\"dweb:/ipfs/QmPgYxzhakDsbnxPTFvMKKMKh2JmGtvq3nFukdcL4bQCZz\"]},\"contracts/src/river/registry/facets/stream/StreamRegistry.sol\":{\"keccak256\":\"0xc422b363ffefaf16dafdfa5983a37b5cf7a306ee9c291ebe510212e91159f934\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://965d4bc6045c85fa2fdd3ae4b6f7ef4aba5f3b98d00f0603ddde204c6c5555ac\",\"dweb:/ipfs/Qmah6HuHF1HvGG1D8SD18g3FG1wxuKAMYTdMNUnFaERn8M\"]},\"contracts/src/river/registry/libraries/RegistryErrors.sol\":{\"keccak256\":\"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3\",\"dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy\"]},\"contracts/src/river/registry/libraries/RegistryStorage.sol\":{\"keccak256\":\"0xb365ca80cf19bebeee5c5512b1982e660d0d31043f8bb4864f26e02ec70a117b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f2ddea5237c67ec769cf0da7f8da4131979ed34f9c2ad0495c87b65b1ea88e01\",\"dweb:/ipfs/QmQBy2AnbwwTopyCrdcW9cSYPaLpmXRqswxUv5dWYbza1q\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32","indexed":false},{"internalType":"address[]","name":"nodes","type":"address[]","indexed":false},{"internalType":"bytes32","name":"genesisMiniblockHash","type":"bytes32","indexed":false},{"internalType":"bytes","name":"genesisMiniblock","type":"bytes","indexed":false}],"type":"event","name":"StreamAllocated","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32","indexed":false},{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32","indexed":false},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64","indexed":false},{"internalType":"bool","name":"isSealed","type":"bool","indexed":false}],"type":"event","name":"StreamLastMiniblockUpdated","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32","indexed":false},{"internalType":"address","name":"nodeAddress","type":"address","indexed":false},{"internalType":"bool","name":"isAdded","type":"bool","indexed":false}],"type":"event","name":"StreamPlacementUpdated","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"},{"internalType":"address[]","name":"nodes","type":"address[]"},{"internalType":"bytes32","name":"genesisMiniblockHash","type":"bytes32"},{"internalType":"bytes","name":"genesisMiniblock","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"allocateStream"},{"inputs":[],"stateMutability":"view","type":"function","name":"getAllStreamIds","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getAllStreams","outputs":[{"internalType":"struct StreamWithId[]","name":"","type":"tuple[]","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"struct Stream","name":"stream","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]}]},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"stateMutability":"view","type":"function","name":"getPaginatedStreams","outputs":[{"internalType":"struct StreamWithId[]","name":"","type":"tuple[]","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"struct Stream","name":"stream","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]},{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getStream","outputs":[{"internalType":"struct Stream","name":"","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"stateMutability":"view","type":"function","name":"getStreamByIndex","outputs":[{"internalType":"struct StreamWithId","name":"","type":"tuple","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"struct Stream","name":"stream","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getStreamCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getStreamWithGenesis","outputs":[{"internalType":"struct Stream","name":"","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"view","type":"function","name":"getStreamsOnNode","outputs":[{"internalType":"struct StreamWithId[]","name":"","type":"tuple[]","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"struct Stream","name":"stream","type":"tuple","components":[{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"uint64","name":"reserved0","type":"uint64"},{"internalType":"uint64","name":"flags","type":"uint64"},{"internalType":"address[]","name":"nodes","type":"address[]"}]}]}]},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"},{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"placeStreamOnNode"},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"},{"internalType":"address","name":"nodeAddress","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeStreamFromNode"},{"inputs":[{"internalType":"bytes32","name":"streamId","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"lastMiniblockHash","type":"bytes32"},{"internalType":"uint64","name":"lastMiniblockNum","type":"uint64"},{"internalType":"bool","name":"isSealed","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setStreamLastMiniblock"}],"devdoc":{"kind":"dev","methods":{"getAllStreamIds()":{"details":"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block."},"getAllStreams()":{"details":"WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block."},"getPaginatedStreams(uint256,uint256)":{"details":"Recommended range is 5000 streams, returns true if on the last page."},"getStreamWithGenesis(bytes32)":{"returns":{"_0":"stream, genesisMiniblockHash, genesisMiniblock"}}},"version":1},"userdoc":{"kind":"user","methods":{"getAllStreamIds()":{"notice":"Return array containing all stream ids"},"getAllStreams()":{"notice":"Return array containing all streams"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/river/registry/facets/stream/StreamRegistry.sol":"StreamRegistry"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/river/registry/facets/stream/IStreamRegistry.sol":{"keccak256":"0x47337d9108adb07ab81e4c71666f916e96234e9837edde35866116c6627d2ff7","urls":["bzz-raw://d7d8a5ad98688de306264be8e7bd41edc3f141d8e852b6545c07748a13879ac9","dweb:/ipfs/QmPgYxzhakDsbnxPTFvMKKMKh2JmGtvq3nFukdcL4bQCZz"],"license":"Apache-2.0"},"contracts/src/river/registry/facets/stream/StreamRegistry.sol":{"keccak256":"0xc422b363ffefaf16dafdfa5983a37b5cf7a306ee9c291ebe510212e91159f934","urls":["bzz-raw://965d4bc6045c85fa2fdd3ae4b6f7ef4aba5f3b98d00f0603ddde204c6c5555ac","dweb:/ipfs/Qmah6HuHF1HvGG1D8SD18g3FG1wxuKAMYTdMNUnFaERn8M"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryErrors.sol":{"keccak256":"0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc","urls":["bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3","dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy"],"license":"Apache-2.0"},"contracts/src/river/registry/libraries/RegistryStorage.sol":{"keccak256":"0xb365ca80cf19bebeee5c5512b1982e660d0d31043f8bb4864f26e02ec70a117b","urls":["bzz-raw://f2ddea5237c67ec769cf0da7f8da4131979ed34f9c2ad0495c87b65b1ea88e01","dweb:/ipfs/QmQBy2AnbwwTopyCrdcW9cSYPaLpmXRqswxUv5dWYbza1q"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":182} \ No newline at end of file diff --git a/packages/generated/v3/abis/StreamRegistry.metadata.json b/packages/generated/v3/abis/StreamRegistry.metadata.json new file mode 100644 index 000000000..fdc83a132 --- /dev/null +++ b/packages/generated/v3/abis/StreamRegistry.metadata.json @@ -0,0 +1,654 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]", + "indexed": false + }, + { + "internalType": "bytes32", + "name": "genesisMiniblockHash", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "bytes", + "name": "genesisMiniblock", + "type": "bytes", + "indexed": false + } + ], + "type": "event", + "name": "StreamAllocated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64", + "indexed": false + }, + { + "internalType": "bool", + "name": "isSealed", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "StreamLastMiniblockUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32", + "indexed": false + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address", + "indexed": false + }, + { + "internalType": "bool", + "name": "isAdded", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "StreamPlacementUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + }, + { + "internalType": "bytes32", + "name": "genesisMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "genesisMiniblock", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "allocateStream" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllStreamIds", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllStreams", + "outputs": [ + { + "internalType": "struct StreamWithId[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "struct Stream", + "name": "stream", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stop", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getPaginatedStreams", + "outputs": [ + { + "internalType": "struct StreamWithId[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "struct Stream", + "name": "stream", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + }, + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getStream", + "outputs": [ + { + "internalType": "struct Stream", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "i", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getStreamByIndex", + "outputs": [ + { + "internalType": "struct StreamWithId", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "struct Stream", + "name": "stream", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getStreamCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getStreamWithGenesis", + "outputs": [ + { + "internalType": "struct Stream", + "name": "", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getStreamsOnNode", + "outputs": [ + { + "internalType": "struct StreamWithId[]", + "name": "", + "type": "tuple[]", + "components": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "internalType": "struct Stream", + "name": "stream", + "type": "tuple", + "components": [ + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "reserved0", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "flags", + "type": "uint64" + }, + { + "internalType": "address[]", + "name": "nodes", + "type": "address[]" + } + ] + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "placeStreamOnNode" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeStreamFromNode" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "streamId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "lastMiniblockHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastMiniblockNum", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "isSealed", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setStreamLastMiniblock" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "getAllStreamIds()": { + "details": "WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block." + }, + "getAllStreams()": { + "details": "WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that this function has an unbounded cost, and using it as part of a state-changing function may render the function uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block." + }, + "getPaginatedStreams(uint256,uint256)": { + "details": "Recommended range is 5000 streams, returns true if on the last page." + }, + "getStreamWithGenesis(bytes32)": { + "returns": { + "_0": "stream, genesisMiniblockHash, genesisMiniblock" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getAllStreamIds()": { + "notice": "Return array containing all stream ids" + }, + "getAllStreams()": { + "notice": "Return array containing all streams" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/river/registry/facets/stream/StreamRegistry.sol": "StreamRegistry" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/river/registry/facets/stream/IStreamRegistry.sol": { + "keccak256": "0x47337d9108adb07ab81e4c71666f916e96234e9837edde35866116c6627d2ff7", + "urls": [ + "bzz-raw://d7d8a5ad98688de306264be8e7bd41edc3f141d8e852b6545c07748a13879ac9", + "dweb:/ipfs/QmPgYxzhakDsbnxPTFvMKKMKh2JmGtvq3nFukdcL4bQCZz" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/facets/stream/StreamRegistry.sol": { + "keccak256": "0xc422b363ffefaf16dafdfa5983a37b5cf7a306ee9c291ebe510212e91159f934", + "urls": [ + "bzz-raw://965d4bc6045c85fa2fdd3ae4b6f7ef4aba5f3b98d00f0603ddde204c6c5555ac", + "dweb:/ipfs/Qmah6HuHF1HvGG1D8SD18g3FG1wxuKAMYTdMNUnFaERn8M" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryErrors.sol": { + "keccak256": "0x073c3ff0f1206824f3722e2ba22fd7174f9ded4a6111e48e0641e21ed90aabfc", + "urls": [ + "bzz-raw://62d60cd3958fdb3762972e41aefa899e6b6ac0dac7c94689025f6ba5dc241be3", + "dweb:/ipfs/QmRRhiC1KXDh5aPPNBEgwbg8wZ9BKWYLJ7jGD9vFzm1kWy" + ], + "license": "Apache-2.0" + }, + "contracts/src/river/registry/libraries/RegistryStorage.sol": { + "keccak256": "0xb365ca80cf19bebeee5c5512b1982e660d0d31043f8bb4864f26e02ec70a117b", + "urls": [ + "bzz-raw://f2ddea5237c67ec769cf0da7f8da4131979ed34f9c2ad0495c87b65b1ea88e01", + "dweb:/ipfs/QmQBy2AnbwwTopyCrdcW9cSYPaLpmXRqswxUv5dWYbza1q" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/TokenPausableFacet.abi.json b/packages/generated/v3/abis/TokenPausableFacet.abi.json new file mode 100644 index 000000000..e20082f02 --- /dev/null +++ b/packages/generated/v3/abis/TokenPausableFacet.abi.json @@ -0,0 +1,166 @@ +[ + { + "type": "function", + "name": "__Pausable_init", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "pause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "paused", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "unpause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/TokenPausableFacet.abi.ts b/packages/generated/v3/abis/TokenPausableFacet.abi.ts new file mode 100644 index 000000000..198ce6401 --- /dev/null +++ b/packages/generated/v3/abis/TokenPausableFacet.abi.ts @@ -0,0 +1,166 @@ +export default [ + { + "type": "function", + "name": "__Pausable_init", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "pause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "paused", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "unpause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "Ownable__NotOwner", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Ownable__ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "Pausable__Paused", + "inputs": [] + } +] as const diff --git a/packages/generated/v3/abis/TokenPausableFacet.bin b/packages/generated/v3/abis/TokenPausableFacet.bin new file mode 100644 index 000000000..d3e43377e --- /dev/null +++ b/packages/generated/v3/abis/TokenPausableFacet.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b610391806100d36000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80633f4ba83a146100515780635c975abb1461005b5780638456cb591461007757806384d2023a1461007f575b600080fd5b610059610087565b005b610063610101565b604051901515815260200160405180910390f35b610059610121565b610059610195565b61008f6101df565b6001600160a01b0316336001600160a01b0316146100c7576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6000805160206103718339815191525460ff166100f757604051632ca4452d60e11b815260040160405180910390fd5b6100ff6102a9565b565b600061011c6000805160206103718339815191525460ff1690565b905090565b6101296101df565b6001600160a01b0316336001600160a01b03161461015c576040516365f4906560e01b81523360048201526024016100be565b6000805160206103718339815191525460ff161561018d576040516302ca8ced60e11b815260040160405180910390fd5b6100ff6102f6565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166100f757604051630ef4733760e31b815260040160405180910390fd5b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa15801561027f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102a39190610340565b91505090565b600080516020610371833981519152805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b600080516020610371833981519152805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016102ec565b60006020828403121561035257600080fd5b81516001600160a01b038116811461036957600080fd5b939250505056fee17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb00 \ No newline at end of file diff --git a/packages/generated/v3/abis/TokenPausableFacet.json b/packages/generated/v3/abis/TokenPausableFacet.json new file mode 100644 index 000000000..b445f499f --- /dev/null +++ b/packages/generated/v3/abis/TokenPausableFacet.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__Pausable_init","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"pause","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"unpause","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"Ownable__NotOwner","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"Ownable__ZeroAddress","inputs":[]},{"type":"error","name":"Pausable__NotPaused","inputs":[]},{"type":"error","name":"Pausable__Paused","inputs":[]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b610391806100d36000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80633f4ba83a146100515780635c975abb1461005b5780638456cb591461007757806384d2023a1461007f575b600080fd5b610059610087565b005b610063610101565b604051901515815260200160405180910390f35b610059610121565b610059610195565b61008f6101df565b6001600160a01b0316336001600160a01b0316146100c7576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6000805160206103718339815191525460ff166100f757604051632ca4452d60e11b815260040160405180910390fd5b6100ff6102a9565b565b600061011c6000805160206103718339815191525460ff1690565b905090565b6101296101df565b6001600160a01b0316336001600160a01b03161461015c576040516365f4906560e01b81523360048201526024016100be565b6000805160206103718339815191525460ff161561018d576040516302ca8ced60e11b815260040160405180910390fd5b6100ff6102f6565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166100f757604051630ef4733760e31b815260040160405180910390fd5b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa15801561027f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102a39190610340565b91505090565b600080516020610371833981519152805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b600080516020610371833981519152805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016102ec565b60006020828403121561035257600080fd5b81516001600160a01b038116811461036957600080fd5b939250505056fee17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb00","sourceMap":"432:393:111:-:0;;;;;;;;;;;;-1:-1:-1;385:22:70;:20;:22::i;:::-;432:393:111;;1653:314:84;303:66:85;1779:14:84;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:84;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:84;1898:16;1886:28;;;;;1927:29;;158:42:514;;;1927:29:84;;146:2:514;131:18;1927:29:84;;;;;;;1844:119;1694:273;1653:314::o;14:192:514:-;432:393:111;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80633f4ba83a146100515780635c975abb1461005b5780638456cb591461007757806384d2023a1461007f575b600080fd5b610059610087565b005b610063610101565b604051901515815260200160405180910390f35b610059610121565b610059610195565b61008f6101df565b6001600160a01b0316336001600160a01b0316146100c7576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6000805160206103718339815191525460ff166100f757604051632ca4452d60e11b815260040160405180910390fd5b6100ff6102a9565b565b600061011c6000805160206103718339815191525460ff1690565b905090565b6101296101df565b6001600160a01b0316336001600160a01b03161461015c576040516365f4906560e01b81523360048201526024016100be565b6000805160206103718339815191525460ff161561018d576040516302ca8ced60e11b815260040160405180910390fd5b6100ff6102f6565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166100f757604051630ef4733760e31b815260040160405180910390fd5b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa15801561027f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102a39190610340565b91505090565b600080516020610371833981519152805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b600080516020610371833981519152805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016102ec565b60006020828403121561035257600080fd5b81516001600160a01b038116811461036957600080fd5b939250505056fee17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb00","sourceMap":"432:393:111:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;753:70;;;:::i;:::-;;602:74;;;:::i;:::-;;;179:14:514;;172:22;154:41;;142:2;127:18;602:74:111;;;;;;;680:69;;;:::i;524:74::-;;;:::i;753:70::-;648:8:104;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:104;:10;-1:-1:-1;;;;;634:22:104;;630:79;;673:29;;-1:-1:-1;;;673:29:104;;691:10;673:29;;;352:51:514;325:18;;673:29:104;;;;;;;;630:79;-1:-1:-1;;;;;;;;;;;526:31:108;;;391:59:::1;;422:21;;-1:-1:-1::0;;;422:21:108::1;;;;;;;;;;;391:59;808:10:111::2;:8;:10::i;:::-;753:70::o:0;602:74::-;643:4;662:9;-1:-1:-1;;;;;;;;;;;526:31:108;;;;465:97;662:9:111;655:16;;602:74;:::o;680:69::-;648:8:104;:6;:8::i;:::-;-1:-1:-1;;;;;634:22:104;:10;-1:-1:-1;;;;;634:22:104;;630:79;;673:29;;-1:-1:-1;;;673:29:104;;691:10;673:29;;;352:51:514;325:18;;673:29:104;206:203:514;630:79:104;-1:-1:-1;;;;;;;;;;;526:31:108;;;293:55:::1;;;323:18;;-1:-1:-1::0;;;323:18:108::1;;;;;;;;;;;293:55;736:8:111::2;:6;:8::i;524:74::-:0;303:66:85;1263:42:84;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:84;;;;;;;;;;;724:189:104;786:67;;;;;;;;302:66:106;786:67:104;-1:-1:-1;;;;;786:67:104;;;;;;;;;;;;;866:42;;-1:-1:-1;;;866:42:104;;;;;560:25:514;;;;866:42:104;;765:13;;866:30;;533:18:514;;;;;866:42:104;;;;;;786:67;866:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;859:49;;;724:189;:::o;675:110:108:-;-1:-1:-1;;;;;;;;;;;710:39:108;;-1:-1:-1;;710:39:108;;;760:20;;769:10;352:51:514;;760:20:108;;340:2:514;325:18;760:20:108;;;;;;;;675:110::o;566:105::-;-1:-1:-1;;;;;;;;;;;599:38:108;;-1:-1:-1;;599:38:108;633:4;599:38;;;648:18;;655:10;352:51:514;;648:18:108;;340:2:514;325:18;648::108;206:203:514;596:290;666:6;719:2;707:9;698:7;694:23;690:32;687:52;;;735:1;732;725:12;687:52;761:16;;-1:-1:-1;;;;;806:31:514;;796:42;;786:70;;852:1;849;842:12;786:70;875:5;596:290;-1:-1:-1;;;596:290:514:o","linkReferences":{}},"methodIdentifiers":{"__Pausable_init()":"84d2023a","pause()":"8456cb59","paused()":"5c975abb","unpause()":"3f4ba83a"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Ownable__NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__Paused\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__Pausable_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"OwnershipTransferred(address,address)\":{\"details\":\"This emits when ownership of a contract changes.\"}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/diamond/facets/pausable/token/TokenPausableFacet.sol\":\"TokenPausableFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/facets/ownable/IERC173.sol\":{\"keccak256\":\"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872\",\"dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx\"]},\"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol\":{\"keccak256\":\"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f\",\"dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol\":{\"keccak256\":\"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5\",\"dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW\"]},\"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol\":{\"keccak256\":\"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc\",\"dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf\"]},\"contracts/src/diamond/facets/pausable/IPausable.sol\":{\"keccak256\":\"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6\",\"dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM\"]},\"contracts/src/diamond/facets/pausable/PausableBase.sol\":{\"keccak256\":\"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c\",\"dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1\"]},\"contracts/src/diamond/facets/pausable/PausableStorage.sol\":{\"keccak256\":\"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b\",\"dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL\"]},\"contracts/src/diamond/facets/pausable/token/TokenPausableFacet.sol\":{\"keccak256\":\"0xffb85d866efe6f2ce412c5b69807a50a1a54ae87b9dbe0781d2fcf5bd8974afd\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://529f7b9557969a32fafe9d97d1ac61391f11a3d2272117dd8b979ca50ba5d366\",\"dweb:/ipfs/QmZbTjaJb5j8Bnn4KJ73sq72S6Qe8WhxpFD8Bdf8kw826V\"]},\"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"Ownable__NotOwner"},{"inputs":[],"type":"error","name":"Ownable__ZeroAddress"},{"inputs":[],"type":"error","name":"Pausable__NotPaused"},{"inputs":[],"type":"error","name":"Pausable__Paused"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"__Pausable_init"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"pause"},{"inputs":[],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"unpause"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/diamond/facets/pausable/token/TokenPausableFacet.sol":"TokenPausableFacet"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/IERC173.sol":{"keccak256":"0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae","urls":["bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872","dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol":{"keccak256":"0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d","urls":["bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f","dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol":{"keccak256":"0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a","urls":["bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5","dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW"],"license":"Apache-2.0"},"contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol":{"keccak256":"0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0","urls":["bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc","dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/IPausable.sol":{"keccak256":"0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261","urls":["bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6","dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableBase.sol":{"keccak256":"0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438","urls":["bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c","dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/PausableStorage.sol":{"keccak256":"0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07","urls":["bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b","dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL"],"license":"Apache-2.0"},"contracts/src/diamond/facets/pausable/token/TokenPausableFacet.sol":{"keccak256":"0xffb85d866efe6f2ce412c5b69807a50a1a54ae87b9dbe0781d2fcf5bd8974afd","urls":["bzz-raw://529f7b9557969a32fafe9d97d1ac61391f11a3d2272117dd8b979ca50ba5d366","dweb:/ipfs/QmZbTjaJb5j8Bnn4KJ73sq72S6Qe8WhxpFD8Bdf8kw826V"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"keccak256":"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4","urls":["bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7","dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"}},"version":1},"id":111} \ No newline at end of file diff --git a/packages/generated/v3/abis/TokenPausableFacet.metadata.json b/packages/generated/v3/abis/TokenPausableFacet.metadata.json new file mode 100644 index 000000000..a81a8a8df --- /dev/null +++ b/packages/generated/v3/abis/TokenPausableFacet.metadata.json @@ -0,0 +1,345 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "type": "error", + "name": "Ownable__NotOwner" + }, + { + "inputs": [], + "type": "error", + "name": "Ownable__ZeroAddress" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__NotPaused" + }, + { + "inputs": [], + "type": "error", + "name": "Pausable__Paused" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Paused", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "Unpaused", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "__Pausable_init" + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "pause" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "unpause" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/diamond/facets/pausable/token/TokenPausableFacet.sol": "TokenPausableFacet" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/IERC173.sol": { + "keccak256": "0xec6475a73e1229430edadb6fd3e32f1599ebb8af78dbbc762d54ded196e534ae", + "urls": [ + "bzz-raw://46e9fef226666c827f408b5d2c9061600fa5233ddf5fcbc3a2b8956d89e8a872", + "dweb:/ipfs/Qmd6L6wtehyrD8XwKqFD7gG5hJxsBZ1ja6hGSf2dtN4XEx" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/ITokenOwnable.sol": { + "keccak256": "0x3035bb5eb69a7c939aa038f27eb216b117727beba7d89aa84657c3f24c98b32d", + "urls": [ + "bzz-raw://c1a6860c8105dad4d1b193883ecd700c223ea9b81c096ed86b3d25bd6c9eed7f", + "dweb:/ipfs/QmVEDbbF6eyZfmqcM1FfedAuCQqiUYpagDmZMhHM4Ap7n9" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableBase.sol": { + "keccak256": "0xc5ef68652f692a56131badcf0adb92893d822fd5e0d97dda49a4520d1859a00a", + "urls": [ + "bzz-raw://bf38ee4ec154de7ef7de263241454d98392d6e61caf4582e2145325258bb8fa5", + "dweb:/ipfs/QmcZGn5KeSPwsTVominE537CDPbTMGoVDgko51onHZoGyW" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/ownable/token/TokenOwnableStorage.sol": { + "keccak256": "0xb348f08d762f1b4ccda363a361eb6d635b50501e93821fe9911296f86f4374f0", + "urls": [ + "bzz-raw://4416ee362b1485fb1cbae83087f7da85d34fec41a39146bd1fb9f877094df0fc", + "dweb:/ipfs/QmPiCdrarzwS1YLYLPpcPMFxhkqE5rT9EFLYsVCV2N5Qkf" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/IPausable.sol": { + "keccak256": "0xd5cc8d743bd12bbd23526178c11808634527c87e2f6da29dfb6aec75dab56261", + "urls": [ + "bzz-raw://c893da163481570ae2e00e5deae732404261cc0e7143fdc0448145810448c6b6", + "dweb:/ipfs/QmbyUkcew8vmUXPVLDJ7GjvxMkmTqjhKZWLDYtWEPzZ2SM" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableBase.sol": { + "keccak256": "0xa278c9cdc622351a088d6d96759a51972b1720ef72424f1f98e5822dd9fd6438", + "urls": [ + "bzz-raw://379dabb0f68319e89d4b7447c31d5a3d0d2b4ecbce92b07f6e096974f2541c6c", + "dweb:/ipfs/QmPQPKBYtuNiFDNh9nGCJGtLXP2AqPLkZ7BBTKgQZeaVH1" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/PausableStorage.sol": { + "keccak256": "0x54ca45de7b414be27767111aa11f06e9d5deeb3241bb4c9476edda7febd92c07", + "urls": [ + "bzz-raw://0e573c53f32ec5c9c89e68ca9e2153635fcb2694ba261e93389dc360ef98226b", + "dweb:/ipfs/QmQUfuRRg8zRFzrqfYaay7RyR2L4D4d4vb4c2TtUqb2GhL" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/pausable/token/TokenPausableFacet.sol": { + "keccak256": "0xffb85d866efe6f2ce412c5b69807a50a1a54ae87b9dbe0781d2fcf5bd8974afd", + "urls": [ + "bzz-raw://529f7b9557969a32fafe9d97d1ac61391f11a3d2272117dd8b979ca50ba5d366", + "dweb:/ipfs/QmZbTjaJb5j8Bnn4KJ73sq72S6Qe8WhxpFD8Bdf8kw826V" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4", + "urls": [ + "bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7", + "dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/UserEntitlement.abi.json b/packages/generated/v3/abis/UserEntitlement.abi.json new file mode 100644 index 000000000..01f1074f2 --- /dev/null +++ b/packages/generated/v3/abis/UserEntitlement.abi.json @@ -0,0 +1,331 @@ +[ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "SPACE_ADDRESS", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "UPGRADE_INTERFACE_VERSION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "description", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEntitlementDataByRoleId", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "_space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isCrosschain", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "isEntitled", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "wallets", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "permission", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "moduleType", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "proxiableUUID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "entitlementData", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "supportsInterface", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "upgradeToAndCall", + "inputs": [ + { + "name": "newImplementation", + "type": "address", + "internalType": "address" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Upgraded", + "inputs": [ + { + "name": "implementation", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967InvalidImplementation", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967NonPayable", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidInitialization", + "inputs": [] + }, + { + "type": "error", + "name": "NotInitializing", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnauthorizedCallContext", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnsupportedProxiableUUID", + "inputs": [ + { + "name": "slot", + "type": "bytes32", + "internalType": "bytes32" + } + ] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/UserEntitlement.abi.ts b/packages/generated/v3/abis/UserEntitlement.abi.ts new file mode 100644 index 000000000..b205f05e7 --- /dev/null +++ b/packages/generated/v3/abis/UserEntitlement.abi.ts @@ -0,0 +1,331 @@ +export default [ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "SPACE_ADDRESS", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "UPGRADE_INTERFACE_VERSION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "description", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEntitlementDataByRoleId", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "_space", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isCrosschain", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "isEntitled", + "inputs": [ + { + "name": "channelId", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "wallets", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "permission", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "moduleType", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "proxiableUUID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setEntitlement", + "inputs": [ + { + "name": "roleId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "entitlementData", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "supportsInterface", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "upgradeToAndCall", + "inputs": [ + { + "name": "newImplementation", + "type": "address", + "internalType": "address" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Upgraded", + "inputs": [ + { + "name": "implementation", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967InvalidImplementation", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967NonPayable", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__InvalidValue", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__NotMember", + "inputs": [] + }, + { + "type": "error", + "name": "Entitlement__ValueAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidInitialization", + "inputs": [] + }, + { + "type": "error", + "name": "NotInitializing", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnauthorizedCallContext", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnsupportedProxiableUUID", + "inputs": [ + { + "name": "slot", + "type": "bytes32", + "internalType": "bytes32" + } + ] + } +] as const diff --git a/packages/generated/v3/abis/UserEntitlement.bin b/packages/generated/v3/abis/UserEntitlement.bin new file mode 100644 index 000000000..168c94bcb --- /dev/null +++ b/packages/generated/v3/abis/UserEntitlement.bin @@ -0,0 +1 @@ +60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051611ae36100fd60003960008181610aa101528181610aca0152610c410152611ae36000f3fe6080604052600436106100dd5760003560e01c806352d1902d1161007f578063ad3cb1cc11610059578063ad3cb1cc146102a0578063c4d66de8146102d1578063ef8be574146102f1578063f0c111f91461031157600080fd5b806352d1902d146102015780636465e69f146102245780637284e4161461025f57600080fd5b80631eee07b2116100bb5780631eee07b2146101805780632e1b61e4146101a057806334322eff146101b45780634f1ef286146101ec57600080fd5b806301ffc9a7146100e257806306fdde03146101175780630cf0b53314610160575b600080fd5b3480156100ee57600080fd5b506101026100fd3660046113fc565b610331565b60405190151581526020015b60405180910390f35b34801561012357600080fd5b506101536040518060400160405280601081526020016f155cd95c88115b9d1a5d1b195b595b9d60821b81525081565b60405161010e9190611476565b34801561016c57600080fd5b5061010261017b3660046115ac565b610368565b34801561018c57600080fd5b5061015361019b3660046115fb565b610393565b3480156101ac57600080fd5b506000610102565b3480156101c057600080fd5b506000546101d4906001600160a01b031681565b6040516001600160a01b03909116815260200161010e565b6101ff6101fa36600461163b565b6103d1565b005b34801561020d57600080fd5b506102166103f0565b60405190815260200161010e565b34801561023057600080fd5b506101536040518060400160405280600f81526020016e155cd95c915b9d1a5d1b195b595b9d608a1b81525081565b34801561026b57600080fd5b5061015360405180604001604052806015815260200174456e7469746c656d656e7420666f7220757365727360581b81525081565b3480156102ac57600080fd5b50610153604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156102dd57600080fd5b506101ff6102ec3660046116c6565b61040d565b3480156102fd57600080fd5b506101ff61030c3660046116e1565b610545565b34801561031d57600080fd5b506101ff61032c3660046115fb565b6107bb565b60006001600160e01b03198216637bc2cb4560e11b148061036257506301ffc9a760e01b6001600160e01b03198316145b92915050565b600083156103825761037b84848461090b565b905061038c565b61037b8383610a36565b9392505050565b6060600160008381526020019081526020016000206002016040516020016103bb919061175c565b6040516020818303038152906040529050919050565b6103d9610a96565b6103e282610b3d565b6103ec8282610b74565b5050565b60006103fa610c36565b50600080516020611ac383398151915290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156104525750825b90506000826001600160401b0316600114801561046e5750303b155b90508115801561047c575080155b1561049a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156104c457845460ff60401b1916600160401b1785555b6104cc610c7f565b6104d4610c7f565b6104dc610c7f565b600080546001600160a01b0319166001600160a01b038816179055831561053d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b6000546001600160a01b0316336001600160a01b03161461057957604051630ce39a4b60e21b815260040160405180910390fd5b6000610587828401846117ac565b905060005b81518110156105ef5760008282815181106105a9576105a96117e8565b6020026020010151905060006001600160a01b0316816001600160a01b0316036105e6576040516372bbc80f60e11b815260040160405180910390fd5b5060010161058c565b505b600084815260016020526040902060020154156106a157600084815260016020819052604082206002018054909161062891611814565b81548110610638576106386117e8565b6000918252602090912001546001600160a01b031690506106598186610c87565b600085815260016020526040902060020180548061067957610679611827565b600082815260209020810160001990810180546001600160a01b0319169055019055506105f1565b6000848152600160208190526040822080546001600160a01b0319168155908101829055906106d36002830182611364565b505060405180606001604052806106e73390565b6001600160a01b0390811682524260208084019190915260409283018590526000888152600180835290849020855181546001600160a01b03191694169390931783558482015190830155918301518051919261074c92600285019290910190611382565b5090505060005b81518110156107b45760026000838381518110610772576107726117e8565b6020908102919091018101516001600160a01b031682528181019290925260400160009081208054600181810183559183529290912090910186905501610753565b5050505050565b6000546001600160a01b0316336001600160a01b0316146107ef57604051630ce39a4b60e21b815260040160405180910390fd5b6000818152600160205260409020546001600160a01b0316610824576040516372bbc80f60e11b815260040160405180910390fd5b600081815260016020526040902060020154156108d457600081815260016020819052604082206002018054909161085b91611814565b8154811061086b5761086b6117e8565b6000918252602090912001546001600160a01b0316905061088c8183610c87565b60008281526001602052604090206002018054806108ac576108ac611827565b600082815260209020810160001990810180546001600160a01b031916905501905550610824565b6000818152600160208190526040822080546001600160a01b0319168155908101829055906109066002830182611364565b505050565b6000805460405163418e15c160e11b81526004810186905282916001600160a01b03169063831c2b8290602401600060405180830381865afa158015610955573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261097d9190810190611882565b9050600061098a85610d95565b905060005b826060015151811015610a2c576000836060015182815181106109b4576109b46117e8565b6020026020010151905060005b8351811015610a2257818482815181106109dd576109dd6117e8565b6020026020010151148015610a105750610a10848281518110610a0257610a026117e8565b602002602001015188611055565b15610a1a57600195505b6001016109c1565b505060010161098f565b5050509392505050565b600080610a4284610d95565b905060005b8151811015610a8b57610a73828281518110610a6557610a656117e8565b602002602001015185611055565b15610a8357600192505050610362565b600101610a47565b506000949350505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610b1d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b11600080516020611ac3833981519152546001600160a01b031690565b6001600160a01b031614155b15610b3b5760405163703e46dd60e11b815260040160405180910390fd5b565b6000546001600160a01b0316336001600160a01b031614610b7157604051630ce39a4b60e21b815260040160405180910390fd5b50565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610bce575060408051601f3d908101601f19168201909252610bcb9181019061198a565b60015b610bfb57604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b600080516020611ac38339815191528114610c2c57604051632a87526960e21b815260048101829052602401610bf2565b6109068383611146565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3b5760405163703e46dd60e11b815260040160405180910390fd5b610b3b61119c565b6001600160a01b0382166000908152600260205260408120905b8154811015610d4c5782828281548110610cbd57610cbd6117e8565b906000526020600020015403610d445781548290610cdd90600190611814565b81548110610ced57610ced6117e8565b9060005260206000200154828281548110610d0a57610d0a6117e8565b906000526020600020018190555081805480610d2857610d28611827565b6001900381819060005260206000200160009055905550505050565b600101610ca1565b5060405162461bcd60e51b815260206004820152601e60248201527f526f6c65204944206e6f7420666f756e6420666f7220746865207573657200006044820152606401610bf2565b60606000805b8351811015610dfb5760026000858381518110610dba57610dba6117e8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905082610df191906119a3565b9150600101610d9b565b50600160005260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e054610e3290826119a3565b90506000816001600160401b03811115610e4e57610e4e611489565b604051908082528060200260200182016040528015610e77578160200160208202803683370190505b5090506000805b8551811015610f7957600060026000888481518110610e9f57610e9f6117e8565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f1157602002820191906000526020600020905b815481526020019060010190808311610efd575b5050505050905060005b8151811015610f6f57818181518110610f3657610f366117e8565b6020026020010151858580610f4a906119b6565b965081518110610f5c57610f5c6117e8565b6020908102919091010152600101610f1b565b5050600101610e7e565b5060016000908152600260209081527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e08054604080518285028101850190915281815292830182828015610fec57602002820191906000526020600020905b815481526020019060010190808311610fd8575b5050505050905060005b815181101561104a57818181518110611011576110116117e8565b6020026020010151848480611025906119b6565b955081518110611037576110376117e8565b6020908102919091010152600101610ff6565b509195945050505050565b6000805460405163b426423360e01b81526004810185905282916001600160a01b03169063b426423390602401600060405180830381865afa15801561109f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110c791908101906119cf565b805190915060005b8181101561113a5760008382815181106110eb576110eb6117e8565b60200260200101516040516020016111039190611a7f565b60405160208183030381529060405261111b90611a9b565b9050858103611131576001945050505050610362565b506001016110cf565b50600095945050505050565b61114f826111e5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561119457610906828261124a565b6103ec6112c0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b3b57604051631afcd79f60e31b815260040160405180910390fd5b806001600160a01b03163b60000361121b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610bf2565b600080516020611ac383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516112679190611a7f565b600060405180830381855af49150503d80600081146112a2576040519150601f19603f3d011682016040523d82523d6000602084013e6112a7565b606091505b50915091506112b78583836112df565b95945050505050565b3415610b3b5760405163b398979f60e01b815260040160405180910390fd5b6060826112f4576112ef8261133b565b61038c565b815115801561130b57506001600160a01b0384163b155b1561133457604051639996b31560e01b81526001600160a01b0385166004820152602401610bf2565b508061038c565b80511561134b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610b7191906113e7565b8280548282559060005260206000209081019282156113d7579160200282015b828111156113d757825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906113a2565b506113e39291506113e7565b5090565b5b808211156113e357600081556001016113e8565b60006020828403121561140e57600080fd5b81356001600160e01b03198116811461038c57600080fd5b60005b83811015611441578181015183820152602001611429565b50506000910152565b60008151808452611462816020860160208601611426565b601f01601f19169290920160200192915050565b60208152600061038c602083018461144a565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156114c1576114c1611489565b60405290565b604051601f8201601f191681016001600160401b03811182821017156114ef576114ef611489565b604052919050565b60006001600160401b0382111561151057611510611489565b5060051b60200190565b80356001600160a01b038116811461153157600080fd5b919050565b600082601f83011261154757600080fd5b8135602061155c611557836114f7565b6114c7565b8083825260208201915060208460051b87010193508684111561157e57600080fd5b602086015b848110156115a1576115948161151a565b8352918301918301611583565b509695505050505050565b6000806000606084860312156115c157600080fd5b8335925060208401356001600160401b038111156115de57600080fd5b6115ea86828701611536565b925050604084013590509250925092565b60006020828403121561160d57600080fd5b5035919050565b60006001600160401b0382111561162d5761162d611489565b50601f01601f191660200190565b6000806040838503121561164e57600080fd5b6116578361151a565b915060208301356001600160401b0381111561167257600080fd5b8301601f8101851361168357600080fd5b803561169161155782611614565b8181528660208385010111156116a657600080fd5b816020840160208301376000602083830101528093505050509250929050565b6000602082840312156116d857600080fd5b61038c8261151a565b6000806000604084860312156116f657600080fd5b8335925060208401356001600160401b038082111561171457600080fd5b818601915086601f83011261172857600080fd5b81358181111561173757600080fd5b87602082850101111561174957600080fd5b6020830194508093505050509250925092565b6020808252825482820181905260008481528281209092916040850190845b818110156117a05783546001600160a01b03168352600193840193928501920161177b565b50909695505050505050565b6000602082840312156117be57600080fd5b81356001600160401b038111156117d457600080fd5b6117e084828501611536565b949350505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610362576103626117fe565b634e487b7160e01b600052603160045260246000fd5b600082601f83011261184e57600080fd5b815161185c61155782611614565b81815284602083860101111561187157600080fd5b6117e0826020830160208701611426565b6000602080838503121561189557600080fd5b82516001600160401b03808211156118ac57600080fd5b90840190608082870312156118c057600080fd5b6118c861149f565b825181528383015180151581146118de57600080fd5b818501526040830151828111156118f457600080fd5b6119008882860161183d565b60408301525060608301518281111561191857600080fd5b80840193505086601f84011261192d57600080fd5b8251915061193d611557836114f7565b82815260059290921b8301840191848101908884111561195c57600080fd5b938501935b8385101561197a57845182529385019390850190611961565b6060830152509695505050505050565b60006020828403121561199c57600080fd5b5051919050565b80820180821115610362576103626117fe565b6000600182016119c8576119c86117fe565b5060010190565b600060208083850312156119e257600080fd5b82516001600160401b03808211156119f957600080fd5b818501915085601f830112611a0d57600080fd5b8151611a1b611557826114f7565b81815260059190911b83018401908481019088831115611a3a57600080fd5b8585015b83811015611a7257805185811115611a565760008081fd5b611a648b89838a010161183d565b845250918601918601611a3e565b5098975050505050505050565b60008251611a91818460208701611426565b9190910192915050565b80516020808301519190811015611abc576000198160200360031b1b821691505b5091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc \ No newline at end of file diff --git a/packages/generated/v3/abis/UserEntitlement.json b/packages/generated/v3/abis/UserEntitlement.json new file mode 100644 index 000000000..bd99be8cf --- /dev/null +++ b/packages/generated/v3/abis/UserEntitlement.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"SPACE_ADDRESS","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"UPGRADE_INTERFACE_VERSION","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"description","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"getEntitlementDataByRoleId","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"_space","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isCrosschain","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"type":"function","name":"isEntitled","inputs":[{"name":"channelId","type":"bytes32","internalType":"bytes32"},{"name":"wallets","type":"address[]","internalType":"address[]"},{"name":"permission","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"moduleType","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"removeEntitlement","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setEntitlement","inputs":[{"name":"roleId","type":"uint256","internalType":"uint256"},{"name":"entitlementData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967InvalidImplementation","inputs":[{"name":"implementation","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967NonPayable","inputs":[]},{"type":"error","name":"Entitlement__InvalidValue","inputs":[]},{"type":"error","name":"Entitlement__NotAllowed","inputs":[]},{"type":"error","name":"Entitlement__NotMember","inputs":[]},{"type":"error","name":"Entitlement__ValueAlreadyExists","inputs":[]},{"type":"error","name":"FailedInnerCall","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"UUPSUnauthorizedCallContext","inputs":[]},{"type":"error","name":"UUPSUnsupportedProxiableUUID","inputs":[{"name":"slot","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051611ae36100fd60003960008181610aa101528181610aca0152610c410152611ae36000f3fe6080604052600436106100dd5760003560e01c806352d1902d1161007f578063ad3cb1cc11610059578063ad3cb1cc146102a0578063c4d66de8146102d1578063ef8be574146102f1578063f0c111f91461031157600080fd5b806352d1902d146102015780636465e69f146102245780637284e4161461025f57600080fd5b80631eee07b2116100bb5780631eee07b2146101805780632e1b61e4146101a057806334322eff146101b45780634f1ef286146101ec57600080fd5b806301ffc9a7146100e257806306fdde03146101175780630cf0b53314610160575b600080fd5b3480156100ee57600080fd5b506101026100fd3660046113fc565b610331565b60405190151581526020015b60405180910390f35b34801561012357600080fd5b506101536040518060400160405280601081526020016f155cd95c88115b9d1a5d1b195b595b9d60821b81525081565b60405161010e9190611476565b34801561016c57600080fd5b5061010261017b3660046115ac565b610368565b34801561018c57600080fd5b5061015361019b3660046115fb565b610393565b3480156101ac57600080fd5b506000610102565b3480156101c057600080fd5b506000546101d4906001600160a01b031681565b6040516001600160a01b03909116815260200161010e565b6101ff6101fa36600461163b565b6103d1565b005b34801561020d57600080fd5b506102166103f0565b60405190815260200161010e565b34801561023057600080fd5b506101536040518060400160405280600f81526020016e155cd95c915b9d1a5d1b195b595b9d608a1b81525081565b34801561026b57600080fd5b5061015360405180604001604052806015815260200174456e7469746c656d656e7420666f7220757365727360581b81525081565b3480156102ac57600080fd5b50610153604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156102dd57600080fd5b506101ff6102ec3660046116c6565b61040d565b3480156102fd57600080fd5b506101ff61030c3660046116e1565b610545565b34801561031d57600080fd5b506101ff61032c3660046115fb565b6107bb565b60006001600160e01b03198216637bc2cb4560e11b148061036257506301ffc9a760e01b6001600160e01b03198316145b92915050565b600083156103825761037b84848461090b565b905061038c565b61037b8383610a36565b9392505050565b6060600160008381526020019081526020016000206002016040516020016103bb919061175c565b6040516020818303038152906040529050919050565b6103d9610a96565b6103e282610b3d565b6103ec8282610b74565b5050565b60006103fa610c36565b50600080516020611ac383398151915290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156104525750825b90506000826001600160401b0316600114801561046e5750303b155b90508115801561047c575080155b1561049a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156104c457845460ff60401b1916600160401b1785555b6104cc610c7f565b6104d4610c7f565b6104dc610c7f565b600080546001600160a01b0319166001600160a01b038816179055831561053d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b6000546001600160a01b0316336001600160a01b03161461057957604051630ce39a4b60e21b815260040160405180910390fd5b6000610587828401846117ac565b905060005b81518110156105ef5760008282815181106105a9576105a96117e8565b6020026020010151905060006001600160a01b0316816001600160a01b0316036105e6576040516372bbc80f60e11b815260040160405180910390fd5b5060010161058c565b505b600084815260016020526040902060020154156106a157600084815260016020819052604082206002018054909161062891611814565b81548110610638576106386117e8565b6000918252602090912001546001600160a01b031690506106598186610c87565b600085815260016020526040902060020180548061067957610679611827565b600082815260209020810160001990810180546001600160a01b0319169055019055506105f1565b6000848152600160208190526040822080546001600160a01b0319168155908101829055906106d36002830182611364565b505060405180606001604052806106e73390565b6001600160a01b0390811682524260208084019190915260409283018590526000888152600180835290849020855181546001600160a01b03191694169390931783558482015190830155918301518051919261074c92600285019290910190611382565b5090505060005b81518110156107b45760026000838381518110610772576107726117e8565b6020908102919091018101516001600160a01b031682528181019290925260400160009081208054600181810183559183529290912090910186905501610753565b5050505050565b6000546001600160a01b0316336001600160a01b0316146107ef57604051630ce39a4b60e21b815260040160405180910390fd5b6000818152600160205260409020546001600160a01b0316610824576040516372bbc80f60e11b815260040160405180910390fd5b600081815260016020526040902060020154156108d457600081815260016020819052604082206002018054909161085b91611814565b8154811061086b5761086b6117e8565b6000918252602090912001546001600160a01b0316905061088c8183610c87565b60008281526001602052604090206002018054806108ac576108ac611827565b600082815260209020810160001990810180546001600160a01b031916905501905550610824565b6000818152600160208190526040822080546001600160a01b0319168155908101829055906109066002830182611364565b505050565b6000805460405163418e15c160e11b81526004810186905282916001600160a01b03169063831c2b8290602401600060405180830381865afa158015610955573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261097d9190810190611882565b9050600061098a85610d95565b905060005b826060015151811015610a2c576000836060015182815181106109b4576109b46117e8565b6020026020010151905060005b8351811015610a2257818482815181106109dd576109dd6117e8565b6020026020010151148015610a105750610a10848281518110610a0257610a026117e8565b602002602001015188611055565b15610a1a57600195505b6001016109c1565b505060010161098f565b5050509392505050565b600080610a4284610d95565b905060005b8151811015610a8b57610a73828281518110610a6557610a656117e8565b602002602001015185611055565b15610a8357600192505050610362565b600101610a47565b506000949350505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610b1d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b11600080516020611ac3833981519152546001600160a01b031690565b6001600160a01b031614155b15610b3b5760405163703e46dd60e11b815260040160405180910390fd5b565b6000546001600160a01b0316336001600160a01b031614610b7157604051630ce39a4b60e21b815260040160405180910390fd5b50565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610bce575060408051601f3d908101601f19168201909252610bcb9181019061198a565b60015b610bfb57604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b600080516020611ac38339815191528114610c2c57604051632a87526960e21b815260048101829052602401610bf2565b6109068383611146565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3b5760405163703e46dd60e11b815260040160405180910390fd5b610b3b61119c565b6001600160a01b0382166000908152600260205260408120905b8154811015610d4c5782828281548110610cbd57610cbd6117e8565b906000526020600020015403610d445781548290610cdd90600190611814565b81548110610ced57610ced6117e8565b9060005260206000200154828281548110610d0a57610d0a6117e8565b906000526020600020018190555081805480610d2857610d28611827565b6001900381819060005260206000200160009055905550505050565b600101610ca1565b5060405162461bcd60e51b815260206004820152601e60248201527f526f6c65204944206e6f7420666f756e6420666f7220746865207573657200006044820152606401610bf2565b60606000805b8351811015610dfb5760026000858381518110610dba57610dba6117e8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905082610df191906119a3565b9150600101610d9b565b50600160005260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e054610e3290826119a3565b90506000816001600160401b03811115610e4e57610e4e611489565b604051908082528060200260200182016040528015610e77578160200160208202803683370190505b5090506000805b8551811015610f7957600060026000888481518110610e9f57610e9f6117e8565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f1157602002820191906000526020600020905b815481526020019060010190808311610efd575b5050505050905060005b8151811015610f6f57818181518110610f3657610f366117e8565b6020026020010151858580610f4a906119b6565b965081518110610f5c57610f5c6117e8565b6020908102919091010152600101610f1b565b5050600101610e7e565b5060016000908152600260209081527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e08054604080518285028101850190915281815292830182828015610fec57602002820191906000526020600020905b815481526020019060010190808311610fd8575b5050505050905060005b815181101561104a57818181518110611011576110116117e8565b6020026020010151848480611025906119b6565b955081518110611037576110376117e8565b6020908102919091010152600101610ff6565b509195945050505050565b6000805460405163b426423360e01b81526004810185905282916001600160a01b03169063b426423390602401600060405180830381865afa15801561109f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110c791908101906119cf565b805190915060005b8181101561113a5760008382815181106110eb576110eb6117e8565b60200260200101516040516020016111039190611a7f565b60405160208183030381529060405261111b90611a9b565b9050858103611131576001945050505050610362565b506001016110cf565b50600095945050505050565b61114f826111e5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561119457610906828261124a565b6103ec6112c0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b3b57604051631afcd79f60e31b815260040160405180910390fd5b806001600160a01b03163b60000361121b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610bf2565b600080516020611ac383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516112679190611a7f565b600060405180830381855af49150503d80600081146112a2576040519150601f19603f3d011682016040523d82523d6000602084013e6112a7565b606091505b50915091506112b78583836112df565b95945050505050565b3415610b3b5760405163b398979f60e01b815260040160405180910390fd5b6060826112f4576112ef8261133b565b61038c565b815115801561130b57506001600160a01b0384163b155b1561133457604051639996b31560e01b81526001600160a01b0385166004820152602401610bf2565b508061038c565b80511561134b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610b7191906113e7565b8280548282559060005260206000209081019282156113d7579160200282015b828111156113d757825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906113a2565b506113e39291506113e7565b5090565b5b808211156113e357600081556001016113e8565b60006020828403121561140e57600080fd5b81356001600160e01b03198116811461038c57600080fd5b60005b83811015611441578181015183820152602001611429565b50506000910152565b60008151808452611462816020860160208601611426565b601f01601f19169290920160200192915050565b60208152600061038c602083018461144a565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156114c1576114c1611489565b60405290565b604051601f8201601f191681016001600160401b03811182821017156114ef576114ef611489565b604052919050565b60006001600160401b0382111561151057611510611489565b5060051b60200190565b80356001600160a01b038116811461153157600080fd5b919050565b600082601f83011261154757600080fd5b8135602061155c611557836114f7565b6114c7565b8083825260208201915060208460051b87010193508684111561157e57600080fd5b602086015b848110156115a1576115948161151a565b8352918301918301611583565b509695505050505050565b6000806000606084860312156115c157600080fd5b8335925060208401356001600160401b038111156115de57600080fd5b6115ea86828701611536565b925050604084013590509250925092565b60006020828403121561160d57600080fd5b5035919050565b60006001600160401b0382111561162d5761162d611489565b50601f01601f191660200190565b6000806040838503121561164e57600080fd5b6116578361151a565b915060208301356001600160401b0381111561167257600080fd5b8301601f8101851361168357600080fd5b803561169161155782611614565b8181528660208385010111156116a657600080fd5b816020840160208301376000602083830101528093505050509250929050565b6000602082840312156116d857600080fd5b61038c8261151a565b6000806000604084860312156116f657600080fd5b8335925060208401356001600160401b038082111561171457600080fd5b818601915086601f83011261172857600080fd5b81358181111561173757600080fd5b87602082850101111561174957600080fd5b6020830194508093505050509250925092565b6020808252825482820181905260008481528281209092916040850190845b818110156117a05783546001600160a01b03168352600193840193928501920161177b565b50909695505050505050565b6000602082840312156117be57600080fd5b81356001600160401b038111156117d457600080fd5b6117e084828501611536565b949350505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610362576103626117fe565b634e487b7160e01b600052603160045260246000fd5b600082601f83011261184e57600080fd5b815161185c61155782611614565b81815284602083860101111561187157600080fd5b6117e0826020830160208701611426565b6000602080838503121561189557600080fd5b82516001600160401b03808211156118ac57600080fd5b90840190608082870312156118c057600080fd5b6118c861149f565b825181528383015180151581146118de57600080fd5b818501526040830151828111156118f457600080fd5b6119008882860161183d565b60408301525060608301518281111561191857600080fd5b80840193505086601f84011261192d57600080fd5b8251915061193d611557836114f7565b82815260059290921b8301840191848101908884111561195c57600080fd5b938501935b8385101561197a57845182529385019390850190611961565b6060830152509695505050505050565b60006020828403121561199c57600080fd5b5051919050565b80820180821115610362576103626117fe565b6000600182016119c8576119c86117fe565b5060010190565b600060208083850312156119e257600080fd5b82516001600160401b03808211156119f957600080fd5b818501915085601f830112611a0d57600080fd5b8151611a1b611557826114f7565b81815260059190911b83018401908481019088831115611a3a57600080fd5b8585015b83811015611a7257805185811115611a565760008081fd5b611a648b89838a010161183d565b845250918601918601611a3e565b5098975050505050505050565b60008251611a91818460208701611426565b9190910192915050565b80516020808301519190811015611abc576000198160200360031b1b821691505b5091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","sourceMap":"859:8747:190:-:0;;;1171:4:395;1128:48;;1819:47:190;;;;;;;;;-1:-1:-1;1839:22:190;:20;:22::i;:::-;859:8747;;7711:422:394;8870:21;7900:15;;;;;;;7896:76;;;7938:23;;-1:-1:-1;;;7938:23:394;;;;;;;;;;;7896:76;7985:14;;-1:-1:-1;;;;;7985:14:394;;;:34;7981:146;;8035:33;;-1:-1:-1;;;;;;8035:33:394;-1:-1:-1;;;;;8035:33:394;;;;;8087:29;;158:50:514;;;8087:29:394;;146:2:514;131:18;8087:29:394;;;;;;;7981:146;7760:373;7711:422::o;14:200:514:-;859:8747:190;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106100dd5760003560e01c806352d1902d1161007f578063ad3cb1cc11610059578063ad3cb1cc146102a0578063c4d66de8146102d1578063ef8be574146102f1578063f0c111f91461031157600080fd5b806352d1902d146102015780636465e69f146102245780637284e4161461025f57600080fd5b80631eee07b2116100bb5780631eee07b2146101805780632e1b61e4146101a057806334322eff146101b45780634f1ef286146101ec57600080fd5b806301ffc9a7146100e257806306fdde03146101175780630cf0b53314610160575b600080fd5b3480156100ee57600080fd5b506101026100fd3660046113fc565b610331565b60405190151581526020015b60405180910390f35b34801561012357600080fd5b506101536040518060400160405280601081526020016f155cd95c88115b9d1a5d1b195b595b9d60821b81525081565b60405161010e9190611476565b34801561016c57600080fd5b5061010261017b3660046115ac565b610368565b34801561018c57600080fd5b5061015361019b3660046115fb565b610393565b3480156101ac57600080fd5b506000610102565b3480156101c057600080fd5b506000546101d4906001600160a01b031681565b6040516001600160a01b03909116815260200161010e565b6101ff6101fa36600461163b565b6103d1565b005b34801561020d57600080fd5b506102166103f0565b60405190815260200161010e565b34801561023057600080fd5b506101536040518060400160405280600f81526020016e155cd95c915b9d1a5d1b195b595b9d608a1b81525081565b34801561026b57600080fd5b5061015360405180604001604052806015815260200174456e7469746c656d656e7420666f7220757365727360581b81525081565b3480156102ac57600080fd5b50610153604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156102dd57600080fd5b506101ff6102ec3660046116c6565b61040d565b3480156102fd57600080fd5b506101ff61030c3660046116e1565b610545565b34801561031d57600080fd5b506101ff61032c3660046115fb565b6107bb565b60006001600160e01b03198216637bc2cb4560e11b148061036257506301ffc9a760e01b6001600160e01b03198316145b92915050565b600083156103825761037b84848461090b565b905061038c565b61037b8383610a36565b9392505050565b6060600160008381526020019081526020016000206002016040516020016103bb919061175c565b6040516020818303038152906040529050919050565b6103d9610a96565b6103e282610b3d565b6103ec8282610b74565b5050565b60006103fa610c36565b50600080516020611ac383398151915290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156104525750825b90506000826001600160401b0316600114801561046e5750303b155b90508115801561047c575080155b1561049a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156104c457845460ff60401b1916600160401b1785555b6104cc610c7f565b6104d4610c7f565b6104dc610c7f565b600080546001600160a01b0319166001600160a01b038816179055831561053d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b6000546001600160a01b0316336001600160a01b03161461057957604051630ce39a4b60e21b815260040160405180910390fd5b6000610587828401846117ac565b905060005b81518110156105ef5760008282815181106105a9576105a96117e8565b6020026020010151905060006001600160a01b0316816001600160a01b0316036105e6576040516372bbc80f60e11b815260040160405180910390fd5b5060010161058c565b505b600084815260016020526040902060020154156106a157600084815260016020819052604082206002018054909161062891611814565b81548110610638576106386117e8565b6000918252602090912001546001600160a01b031690506106598186610c87565b600085815260016020526040902060020180548061067957610679611827565b600082815260209020810160001990810180546001600160a01b0319169055019055506105f1565b6000848152600160208190526040822080546001600160a01b0319168155908101829055906106d36002830182611364565b505060405180606001604052806106e73390565b6001600160a01b0390811682524260208084019190915260409283018590526000888152600180835290849020855181546001600160a01b03191694169390931783558482015190830155918301518051919261074c92600285019290910190611382565b5090505060005b81518110156107b45760026000838381518110610772576107726117e8565b6020908102919091018101516001600160a01b031682528181019290925260400160009081208054600181810183559183529290912090910186905501610753565b5050505050565b6000546001600160a01b0316336001600160a01b0316146107ef57604051630ce39a4b60e21b815260040160405180910390fd5b6000818152600160205260409020546001600160a01b0316610824576040516372bbc80f60e11b815260040160405180910390fd5b600081815260016020526040902060020154156108d457600081815260016020819052604082206002018054909161085b91611814565b8154811061086b5761086b6117e8565b6000918252602090912001546001600160a01b0316905061088c8183610c87565b60008281526001602052604090206002018054806108ac576108ac611827565b600082815260209020810160001990810180546001600160a01b031916905501905550610824565b6000818152600160208190526040822080546001600160a01b0319168155908101829055906109066002830182611364565b505050565b6000805460405163418e15c160e11b81526004810186905282916001600160a01b03169063831c2b8290602401600060405180830381865afa158015610955573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261097d9190810190611882565b9050600061098a85610d95565b905060005b826060015151811015610a2c576000836060015182815181106109b4576109b46117e8565b6020026020010151905060005b8351811015610a2257818482815181106109dd576109dd6117e8565b6020026020010151148015610a105750610a10848281518110610a0257610a026117e8565b602002602001015188611055565b15610a1a57600195505b6001016109c1565b505060010161098f565b5050509392505050565b600080610a4284610d95565b905060005b8151811015610a8b57610a73828281518110610a6557610a656117e8565b602002602001015185611055565b15610a8357600192505050610362565b600101610a47565b506000949350505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610b1d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b11600080516020611ac3833981519152546001600160a01b031690565b6001600160a01b031614155b15610b3b5760405163703e46dd60e11b815260040160405180910390fd5b565b6000546001600160a01b0316336001600160a01b031614610b7157604051630ce39a4b60e21b815260040160405180910390fd5b50565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610bce575060408051601f3d908101601f19168201909252610bcb9181019061198a565b60015b610bfb57604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b600080516020611ac38339815191528114610c2c57604051632a87526960e21b815260048101829052602401610bf2565b6109068383611146565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3b5760405163703e46dd60e11b815260040160405180910390fd5b610b3b61119c565b6001600160a01b0382166000908152600260205260408120905b8154811015610d4c5782828281548110610cbd57610cbd6117e8565b906000526020600020015403610d445781548290610cdd90600190611814565b81548110610ced57610ced6117e8565b9060005260206000200154828281548110610d0a57610d0a6117e8565b906000526020600020018190555081805480610d2857610d28611827565b6001900381819060005260206000200160009055905550505050565b600101610ca1565b5060405162461bcd60e51b815260206004820152601e60248201527f526f6c65204944206e6f7420666f756e6420666f7220746865207573657200006044820152606401610bf2565b60606000805b8351811015610dfb5760026000858381518110610dba57610dba6117e8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905082610df191906119a3565b9150600101610d9b565b50600160005260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e054610e3290826119a3565b90506000816001600160401b03811115610e4e57610e4e611489565b604051908082528060200260200182016040528015610e77578160200160208202803683370190505b5090506000805b8551811015610f7957600060026000888481518110610e9f57610e9f6117e8565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f1157602002820191906000526020600020905b815481526020019060010190808311610efd575b5050505050905060005b8151811015610f6f57818181518110610f3657610f366117e8565b6020026020010151858580610f4a906119b6565b965081518110610f5c57610f5c6117e8565b6020908102919091010152600101610f1b565b5050600101610e7e565b5060016000908152600260209081527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e08054604080518285028101850190915281815292830182828015610fec57602002820191906000526020600020905b815481526020019060010190808311610fd8575b5050505050905060005b815181101561104a57818181518110611011576110116117e8565b6020026020010151848480611025906119b6565b955081518110611037576110376117e8565b6020908102919091010152600101610ff6565b509195945050505050565b6000805460405163b426423360e01b81526004810185905282916001600160a01b03169063b426423390602401600060405180830381865afa15801561109f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110c791908101906119cf565b805190915060005b8181101561113a5760008382815181106110eb576110eb6117e8565b60200260200101516040516020016111039190611a7f565b60405160208183030381529060405261111b90611a9b565b9050858103611131576001945050505050610362565b506001016110cf565b50600095945050505050565b61114f826111e5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561119457610906828261124a565b6103ec6112c0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b3b57604051631afcd79f60e31b815260040160405180910390fd5b806001600160a01b03163b60000361121b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610bf2565b600080516020611ac383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516112679190611a7f565b600060405180830381855af49150503d80600081146112a2576040519150601f19603f3d011682016040523d82523d6000602084013e6112a7565b606091505b50915091506112b78583836112df565b95945050505050565b3415610b3b5760405163b398979f60e01b815260040160405180910390fd5b6060826112f4576112ef8261133b565b61038c565b815115801561130b57506001600160a01b0384163b155b1561133457604051639996b31560e01b81526001600160a01b0385166004820152602401610bf2565b508061038c565b80511561134b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610b7191906113e7565b8280548282559060005260206000209081019282156113d7579160200282015b828111156113d757825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906113a2565b506113e39291506113e7565b5090565b5b808211156113e357600081556001016113e8565b60006020828403121561140e57600080fd5b81356001600160e01b03198116811461038c57600080fd5b60005b83811015611441578181015183820152602001611429565b50506000910152565b60008151808452611462816020860160208601611426565b601f01601f19169290920160200192915050565b60208152600061038c602083018461144a565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156114c1576114c1611489565b60405290565b604051601f8201601f191681016001600160401b03811182821017156114ef576114ef611489565b604052919050565b60006001600160401b0382111561151057611510611489565b5060051b60200190565b80356001600160a01b038116811461153157600080fd5b919050565b600082601f83011261154757600080fd5b8135602061155c611557836114f7565b6114c7565b8083825260208201915060208460051b87010193508684111561157e57600080fd5b602086015b848110156115a1576115948161151a565b8352918301918301611583565b509695505050505050565b6000806000606084860312156115c157600080fd5b8335925060208401356001600160401b038111156115de57600080fd5b6115ea86828701611536565b925050604084013590509250925092565b60006020828403121561160d57600080fd5b5035919050565b60006001600160401b0382111561162d5761162d611489565b50601f01601f191660200190565b6000806040838503121561164e57600080fd5b6116578361151a565b915060208301356001600160401b0381111561167257600080fd5b8301601f8101851361168357600080fd5b803561169161155782611614565b8181528660208385010111156116a657600080fd5b816020840160208301376000602083830101528093505050509250929050565b6000602082840312156116d857600080fd5b61038c8261151a565b6000806000604084860312156116f657600080fd5b8335925060208401356001600160401b038082111561171457600080fd5b818601915086601f83011261172857600080fd5b81358181111561173757600080fd5b87602082850101111561174957600080fd5b6020830194508093505050509250925092565b6020808252825482820181905260008481528281209092916040850190845b818110156117a05783546001600160a01b03168352600193840193928501920161177b565b50909695505050505050565b6000602082840312156117be57600080fd5b81356001600160401b038111156117d457600080fd5b6117e084828501611536565b949350505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610362576103626117fe565b634e487b7160e01b600052603160045260246000fd5b600082601f83011261184e57600080fd5b815161185c61155782611614565b81815284602083860101111561187157600080fd5b6117e0826020830160208701611426565b6000602080838503121561189557600080fd5b82516001600160401b03808211156118ac57600080fd5b90840190608082870312156118c057600080fd5b6118c861149f565b825181528383015180151581146118de57600080fd5b818501526040830151828111156118f457600080fd5b6119008882860161183d565b60408301525060608301518281111561191857600080fd5b80840193505086601f84011261192d57600080fd5b8251915061193d611557836114f7565b82815260059290921b8301840191848101908884111561195c57600080fd5b938501935b8385101561197a57845182529385019390850190611961565b6060830152509695505050505050565b60006020828403121561199c57600080fd5b5051919050565b80820180821115610362576103626117fe565b6000600182016119c8576119c86117fe565b5060010190565b600060208083850312156119e257600080fd5b82516001600160401b03808211156119f957600080fd5b818501915085601f830112611a0d57600080fd5b8151611a1b611557826114f7565b81815260059190911b83018401908481019088831115611a3a57600080fd5b8585015b83811015611a7257805185811115611a565760008081fd5b611a648b89838a010161183d565b845250918601918601611a3e565b5098975050505050505050565b60008251611a91818460208701611426565b9190910192915050565b80516020808301519190811015611abc576000198160200360031b1b821691505b5091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","sourceMap":"859:8747:190:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2267:214;;;;;;;;;;-1:-1:-1;2267:214:190;;;;;:::i;:::-;;:::i;:::-;;;470:14:514;;463:22;445:41;;433:2;418:18;2267:214:190;;;;;;;;1470:48;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1470:48:190;;;;;;;;;;;;:::i;2634:379::-;;;;;;;;;;-1:-1:-1;2634:379:190;;;;;:::i;:::-;;:::i;4599:161::-;;;;;;;;;;-1:-1:-1;4599:161:190;;;;;:::i;:::-;;:::i;2515:85::-;;;;;;;;;;-1:-1:-1;2571:4:190;2515:85;;1089:28;;;;;;;;;;-1:-1:-1;1089:28:190;;;;-1:-1:-1;;;;;1089:28:190;;;;;;-1:-1:-1;;;;;4029:32:514;;;4011:51;;3999:2;3984:18;1089:28:190;3865:203:514;4158:214:395;;;;;;:::i;:::-;;:::i;:::-;;3705:134;;;;;;;;;;;;;:::i;:::-;;;5160:25:514;;;5148:2;5133:18;3705:134:395;5014:177:514;1586:53:190;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1586:53:190;;;;;1522:60;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1522:60:190;;;;;1819:58:395;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1819:58:395;;;;;1870:162:190;;;;;;;;;;-1:-1:-1;1870:162:190;;;;;:::i;:::-;;:::i;3047:949::-;;;;;;;;;;-1:-1:-1;3047:949:190;;;;;:::i;:::-;;:::i;4030:535::-;;;;;;;;;;-1:-1:-1;4030:535:190;;;;;:::i;:::-;;:::i;2267:214::-;2360:4;-1:-1:-1;;;;;;2385:45:190;;-1:-1:-1;;;2385:45:190;;:91;;-1:-1:-1;;;;;;;;;;1133:40:397;;;2440:36:190;2372:104;2267:214;-1:-1:-1;;2267:214:190:o;2634:379::-;2758:4;2843:23;;2839:170;;2883:52;2904:9;2915:7;2924:10;2883:20;:52::i;:::-;2876:59;;;;2839:170;2963:39;2982:7;2991:10;2963:18;:39::i;2839:170::-;2634:379;;;;;:::o;4599:161::-;4682:12;4720:20;:28;4741:6;4720:28;;;;;;;;;;;:34;;4709:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;4702:53;;4599:161;;;:::o;4158:214:395:-;2653:13;:11;:13::i;:::-;4273:36:::1;4291:17;4273;:36::i;:::-;4319:46;4341:17;4360:4;4319:21;:46::i;:::-;4158:214:::0;;:::o;3705:134::-;3774:7;2924:20;:18;:20::i;:::-;-1:-1:-1;;;;;;;;;;;;3705:134:395;:::o;1870:162:190:-;8870:21:394;4302:15;;-1:-1:-1;;;4302:15:394;;;;4301:16;;-1:-1:-1;;;;;4348:14:394;4158:30;4726:16;;:34;;;;;4746:14;4726:34;4706:54;;4770:17;4790:11;-1:-1:-1;;;;;4790:16:394;4805:1;4790:16;:50;;;;-1:-1:-1;4818:4:394;4810:25;:30;4790:50;4770:70;;4856:12;4855:13;:30;;;;;4873:12;4872:13;4855:30;4851:91;;;4908:23;;-1:-1:-1;;;4908:23:394;;;;;;;;;;;4851:91;4951:18;;-1:-1:-1;;4951:18:394;4968:1;4951:18;;;4979:67;;;;5013:22;;-1:-1:-1;;;;5013:22:394;-1:-1:-1;;;5013:22:394;;;4979:67;1931:24:190::1;:22;:24::i;:::-;1961:15;:13;:15::i;:::-;1982:16;:14;:16::i;:::-;2005:13;:22:::0;;-1:-1:-1;;;;;;2005:22:190::1;-1:-1:-1::0;;;;;2005:22:190;::::1;;::::0;;5066:101:394;;;;5100:23;;-1:-1:-1;;;;5100:23:394;;;5142:14;;-1:-1:-1;6890:50:514;;5142:14:394;;6878:2:514;6863:18;5142:14:394;;;;;;;5066:101;4092:1081;;;;;1870:162:190;:::o;3047:949::-;1691:13;;-1:-1:-1;;;;;1691:13:190;966:10:396;-1:-1:-1;;;;;1675:29:190;;1671:82;;1721:25;;-1:-1:-1;;;1721:25:190;;;;;;;;;;;1671:82;3156:22:::1;3181:40;::::0;;::::1;3192:15:::0;3181:40:::1;:::i;:::-;3156:65;;3233:9;3228:165;3252:5;:12;3248:1;:16;3228:165;;;3279:12;3294:5;3300:1;3294:8;;;;;;;;:::i;:::-;;;;;;;3279:23;;3330:1;-1:-1:-1::0;;;;;3314:18:190::1;:4;-1:-1:-1::0;;;;;3314:18:190::1;::::0;3310:77:::1;;3351:27;;-1:-1:-1::0;;;3351:27:190::1;;;;;;;;;;;3310:77;-1:-1:-1::0;3266:3:190::1;;3228:165;;;;3436:272;3487:1;3443:28:::0;;;:20:::1;:28;::::0;;;;:34:::1;;:41:::0;:45;3436:272:::1;;3498:12;3513:28:::0;;;:20:::1;:28;::::0;;;;;;:34:::1;;3557:41:::0;;3513:34;;3557:45:::1;::::0;::::1;:::i;:::-;3513:97;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;3513:97:190::1;::::0;-1:-1:-1;3618:35:190::1;3513:97:::0;3646:6;3618:21:::1;:35::i;:::-;3661:28;::::0;;;:20:::1;:28;::::0;;;;:34:::1;;:40:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;3661:40:190;;;;;-1:-1:-1;;;;;;3661:40:190::1;::::0;;;;;-1:-1:-1;3436:272:190::1;;;3720:28;::::0;;;:20:::1;:28;::::0;;;;;;3713:35;;-1:-1:-1;;;;;;3713:35:190::1;::::0;;;;::::1;::::0;;;3720:28;3713:35:::1;;::::0;::::1;3720:28:::0;3713:35:::1;:::i;:::-;;;3786:106;;;;;;;;3817:12;966:10:396::0;;887:96;3817:12:190::1;-1:-1:-1::0;;;;;3786:106:190;;::::1;::::0;;3850:15:::1;3786:106;::::0;;::::1;::::0;;;;;;;;;;;-1:-1:-1;3755:28:190;;;:20:::1;:28:::0;;;;;;;:137;;;;-1:-1:-1;;;;;;3755:137:190::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;:28;;:137:::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;;;;;3903:9;3898:94;3922:5;:12;3918:1;:16;3898:94;;;3949:13;:23;3963:5;3969:1;3963:8;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;3949:23:190::1;::::0;;;;::::1;::::0;;;;;;-1:-1:-1;3949:23:190;;;:36;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;;;3936:3:::1;3898:94;;;;3150:846;3047:949:::0;;;:::o;4030:535::-;1691:13;;-1:-1:-1;;;;;1691:13:190;966:10:396;-1:-1:-1;;;;;1675:29:190;;1671:82;;1721:25;;-1:-1:-1;;;1721:25:190;;;;;;;;;;;1671:82;4152:1:::1;4102:28:::0;;;:20:::1;:28;::::0;;;;:38;-1:-1:-1;;;;;4102:38:190::1;4098:107;;4171:27;;-1:-1:-1::0;;;4171:27:190::1;;;;;;;;;;;4098:107;4299:1;4255:28:::0;;;:20:::1;:28;::::0;;;;:34:::1;;:41:::0;:45;4248:272:::1;;4310:12;4325:28:::0;;;:20:::1;:28;::::0;;;;;;:34:::1;;4369:41:::0;;4325:34;;4369:45:::1;::::0;::::1;:::i;:::-;4325:97;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;4325:97:190::1;::::0;-1:-1:-1;4430:35:190::1;4325:97:::0;4458:6;4430:21:::1;:35::i;:::-;4473:28;::::0;;;:20:::1;:28;::::0;;;;:34:::1;;:40:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;4473:40:190;;;;;-1:-1:-1;;;;;;4473:40:190::1;::::0;;;;;-1:-1:-1;4248:272:190::1;;;4532:28;::::0;;;:20:::1;:28;::::0;;;;;;4525:35;;-1:-1:-1;;;;;;4525:35:190::1;::::0;;;;::::1;::::0;;;4532:28;4525:35:::1;;::::0;::::1;4532:28:::0;4525:35:::1;:::i;:::-;;;4030:535:::0;:::o;5056:939::-;5190:14;5255:13;;5246:57;;-1:-1:-1;;;5246:57:190;;;;;5160:25:514;;;5190:14:190;;-1:-1:-1;;;;;5255:13:190;;5246:34;;5133:18:514;;5246:57:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5246:57:190;;;;;;;;;;;;:::i;:::-;5212:91;;5350:25;5378:26;5396:7;5378:17;:26::i;:::-;5350:54;;5459:9;5454:537;5478:7;:15;;;:22;5474:1;:26;5454:537;;;5541:14;5558:7;:15;;;5574:1;5558:18;;;;;;;;:::i;:::-;;;;;;;5541:35;;5636:9;5631:354;5655:8;:15;5651:1;:19;5631:354;;;5859:6;5844:8;5853:1;5844:11;;;;;;;;:::i;:::-;;;;;;;:21;:83;;;;;5879:48;5903:8;5912:1;5903:11;;;;;;;;:::i;:::-;;;;;;;5916:10;5879:23;:48::i;:::-;5829:148;;;5962:4;5950:16;;5829:148;5672:3;;5631:354;;;-1:-1:-1;;5502:3:190;;5454:537;;;;5206:789;;5056:939;;;;;:::o;7369:389::-;7478:4;7530:25;7558:26;7576:7;7558:17;:26::i;:::-;7530:54;;7596:9;7591:144;7615:8;:15;7611:1;:19;7591:144;;;7649:48;7673:8;7682:1;7673:11;;;;;;;;:::i;:::-;;;;;;;7686:10;7649:23;:48::i;:::-;7645:84;;;7716:4;7709:11;;;;;;7645:84;7632:3;;7591:144;;;-1:-1:-1;7748:5:190;;7369:389;-1:-1:-1;;;;7369:389:190:o;4599:312:395:-;4679:4;-1:-1:-1;;;;;4688:6:395;4671:23;;;:120;;;4785:6;-1:-1:-1;;;;;4749:42:395;:32;-1:-1:-1;;;;;;;;;;;2035:53:408;-1:-1:-1;;;;;2035:53:408;;1957:138;4749:32:395;-1:-1:-1;;;;;4749:42:395;;;4671:120;4654:251;;;4865:29;;-1:-1:-1;;;4865:29:395;;;;;;;;;;;4654:251;4599:312::o;2171:92:190:-;1691:13;;-1:-1:-1;;;;;1691:13:190;966:10:396;-1:-1:-1;;;;;1675:29:190;;1671:82;;1721:25;;-1:-1:-1;;;1721:25:190;;;;;;;;;;;1671:82;2171:92;:::o;6052:538:395:-;6169:17;-1:-1:-1;;;;;6151:50:395;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6151:52:395;;;;;;;;-1:-1:-1;;6151:52:395;;;;;;;;;;;;:::i;:::-;;;6147:437;;6513:60;;-1:-1:-1;;;6513:60:395;;-1:-1:-1;;;;;4029:32:514;;6513:60:395;;;4011:51:514;3984:18;;6513:60:395;;;;;;;;6147:437;-1:-1:-1;;;;;;;;;;;6245:40:395;;6241:120;;6312:34;;-1:-1:-1;;;6312:34:395;;;;;5160:25:514;;;5133:18;;6312:34:395;5014:177:514;6241:120:395;6374:54;6404:17;6423:4;6374:29;:54::i;5028:213::-;5102:4;-1:-1:-1;;;;;5111:6:395;5094:23;;5090:145;;5195:29;;-1:-1:-1;;;5195:29:395;;;;;;;;;;;2968:67;6931:20:394;:18;:20::i;8976:400:190:-;-1:-1:-1;;;;;9078:19:190;;9052:23;9078:19;;;:13;:19;;;;;;9103:171;9127:12;;9123:16;;9103:171;;;9170:6;9158:5;9164:1;9158:8;;;;;;;;:::i;:::-;;;;;;;;;:18;9154:114;;9205:12;;9199:5;;9205:16;;9220:1;;9205:16;:::i;:::-;9199:23;;;;;;;;:::i;:::-;;;;;;;;;9188:5;9194:1;9188:8;;;;;;;;:::i;:::-;;;;;;;;:34;;;;9232:5;:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;9253:7;;8976:400;;:::o;9154:114::-;9141:3;;9103:171;;;-1:-1:-1;9331:40:190;;-1:-1:-1;;;9331:40:190;;10206:2:514;9331:40:190;;;10188:21:514;10245:2;10225:18;;;10218:30;10284:32;10264:18;;;10257:60;10334:18;;9331:40:190;10004:354:514;6185:954:190;6269:16;6293:19;6358:9;6353:107;6377:7;:14;6373:1;:18;6353:107;;;6421:13;:25;6435:7;6443:1;6435:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;6421:25:190;-1:-1:-1;;;;;6421:25:190;;;;;;;;;;;;:32;;;;6406:47;;;;;:::i;:::-;;-1:-1:-1;6393:3:190;;6353:107;;;-1:-1:-1;1083:1:190;6481:31;;:13;:31;;;:38;6466:53;;;;:::i;:::-;;;6567:22;6606:11;-1:-1:-1;;;;;6592:26:190;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6592:26:190;;6567:51;;6624:20;6692:9;6687:238;6711:7;:14;6707:1;:18;6687:238;;;6740:31;6774:13;:25;6788:7;6796:1;6788:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;6774:25:190;-1:-1:-1;;;;;6774:25:190;;;;;;;;;;;;6740:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6812:9;6807:112;6831:14;:21;6827:1;:25;6807:112;;;6893:14;6908:1;6893:17;;;;;;;;:::i;:::-;;;;;;;6869:5;6875:14;;;;;:::i;:::-;;;6869:21;;;;;;;;:::i;:::-;;;;;;;;;;:41;6854:3;;6807:112;;;-1:-1:-1;;6727:3:190;;6687:238;;;-1:-1:-1;1083:1:190;6931:33;6967:31;;;:13;:31;;;;;6931:67;;6967:31;6931:67;;;;;;;;;;;;;;;;;;6967:31;6931:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7009:9;7004:112;7028:16;:23;7024:1;:27;7004:112;;;7090:16;7107:1;7090:19;;;;;;;;:::i;:::-;;;;;;;7066:5;7072:14;;;;;:::i;:::-;;;7066:21;;;;;;;;:::i;:::-;;;;;;;;;;:43;7053:3;;7004:112;;;-1:-1:-1;7129:5:190;;6185:954;-1:-1:-1;;;;;6185:954:190:o;7975:486::-;8079:4;8128:13;;8121:64;;-1:-1:-1;;;8121:64:190;;;;;5160:25:514;;;8079:4:190;;-1:-1:-1;;;;;8128:13:190;;8121:44;;5133:18:514;;8121:64:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8121:64:190;;;;;;;;;;;;:::i;:::-;8215:18;;8091:94;;-1:-1:-1;8191:21:190;8240:198;8264:13;8260:1;:17;8240:198;;;8292:23;8343:11;8355:1;8343:14;;;;;;;;:::i;:::-;;;;;;;8326:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;8318:41;;;:::i;:::-;8292:67;;8390:10;8371:15;:29;8367:65;;8419:4;8412:11;;;;;;;;8367:65;-1:-1:-1;8279:3:190;;8240:198;;;-1:-1:-1;8451:5:190;;7975:486;-1:-1:-1;;;;;7975:486:190:o;2779:335:408:-;2870:37;2889:17;2870:18;:37::i;:::-;2922:27;;-1:-1:-1;;;;;2922:27:408;;;;;;;;2964:11;;:15;2960:148;;2995:53;3024:17;3043:4;2995:28;:53::i;2960:148::-;3079:18;:16;:18::i;7084:141:394:-;8870:21;8560:40;-1:-1:-1;;;8560:40:394;;;;7146:73;;7191:17;;-1:-1:-1;;;7191:17:394;;;;;;;;;;;2186:281:408;2263:17;-1:-1:-1;;;;;2263:29:408;;2296:1;2263:34;2259:119;;2320:47;;-1:-1:-1;;;2320:47:408;;-1:-1:-1;;;;;4029:32:514;;2320:47:408;;;4011:51:514;3984:18;;2320:47:408;3865:203:514;2259:119:408;-1:-1:-1;;;;;;;;;;;2387:73:408;;-1:-1:-1;;;;;;2387:73:408;-1:-1:-1;;;;;2387:73:408;;;;;;;;;;2186:281::o;4106:253:428:-;4189:12;4214;4228:23;4255:6;-1:-1:-1;;;;;4255:19:428;4275:4;4255:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4213:67;;;;4297:55;4324:6;4332:7;4341:10;4297:26;:55::i;:::-;4290:62;4106:253;-1:-1:-1;;;;;4106:253:428:o;6598:122:408:-;6648:9;:13;6644:70;;6684:19;;-1:-1:-1;;;6684:19:408;;;;;;;;;;;4625:582:428;4769:12;4798:7;4793:408;;4821:19;4829:10;4821:7;:19::i;:::-;4793:408;;;5045:17;;:22;:49;;;;-1:-1:-1;;;;;;5071:18:428;;;:23;5045:49;5041:119;;;5121:24;;-1:-1:-1;;;5121:24:428;;-1:-1:-1;;;;;4029:32:514;;5121:24:428;;;4011:51:514;3984:18;;5121:24:428;3865:203:514;5041:119:428;-1:-1:-1;5180:10:428;5173:17;;5743:516;5874:17;;:21;5870:383;;6102:10;6096:17;6158:15;6145:10;6141:2;6137:19;6130:44;5870:383;6225:17;;-1:-1:-1;;;6225:17:428;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:286:514;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:514;;209:43;;199:71;;266:1;263;256:12;497:250;582:1;592:113;606:6;603:1;600:13;592:113;;;682:11;;;676:18;663:11;;;656:39;628:2;621:10;592:113;;;-1:-1:-1;;739:1:514;721:16;;714:27;497:250::o;752:271::-;794:3;832:5;826:12;859:6;854:3;847:19;875:76;944:6;937:4;932:3;928:14;921:4;914:5;910:16;875:76;:::i;:::-;1005:2;984:15;-1:-1:-1;;980:29:514;971:39;;;;1012:4;967:50;;752:271;-1:-1:-1;;752:271:514:o;1028:220::-;1177:2;1166:9;1159:21;1140:4;1197:45;1238:2;1227:9;1223:18;1215:6;1197:45;:::i;1253:127::-;1314:10;1309:3;1305:20;1302:1;1295:31;1345:4;1342:1;1335:15;1369:4;1366:1;1359:15;1385:253;1457:2;1451:9;1499:4;1487:17;;-1:-1:-1;;;;;1519:34:514;;1555:22;;;1516:62;1513:88;;;1581:18;;:::i;:::-;1617:2;1610:22;1385:253;:::o;1643:275::-;1714:2;1708:9;1779:2;1760:13;;-1:-1:-1;;1756:27:514;1744:40;;-1:-1:-1;;;;;1799:34:514;;1835:22;;;1796:62;1793:88;;;1861:18;;:::i;:::-;1897:2;1890:22;1643:275;;-1:-1:-1;1643:275:514:o;1923:183::-;1983:4;-1:-1:-1;;;;;2008:6:514;2005:30;2002:56;;;2038:18;;:::i;:::-;-1:-1:-1;2083:1:514;2079:14;2095:4;2075:25;;1923:183::o;2111:173::-;2179:20;;-1:-1:-1;;;;;2228:31:514;;2218:42;;2208:70;;2274:1;2271;2264:12;2208:70;2111:173;;;:::o;2289:674::-;2343:5;2396:3;2389:4;2381:6;2377:17;2373:27;2363:55;;2414:1;2411;2404:12;2363:55;2450:6;2437:20;2476:4;2500:60;2516:43;2556:2;2516:43;:::i;:::-;2500:60;:::i;:::-;2582:3;2606:2;2601:3;2594:15;2634:4;2629:3;2625:14;2618:21;;2691:4;2685:2;2682:1;2678:10;2670:6;2666:23;2662:34;2648:48;;2719:3;2711:6;2708:15;2705:35;;;2736:1;2733;2726:12;2705:35;2772:4;2764:6;2760:17;2786:148;2802:6;2797:3;2794:15;2786:148;;;2868:23;2887:3;2868:23;:::i;:::-;2856:36;;2912:12;;;;2819;;2786:148;;;-1:-1:-1;2952:5:514;2289:674;-1:-1:-1;;;;;;2289:674:514:o;2968:484::-;3070:6;3078;3086;3139:2;3127:9;3118:7;3114:23;3110:32;3107:52;;;3155:1;3152;3145:12;3107:52;3191:9;3178:23;3168:33;;3252:2;3241:9;3237:18;3224:32;-1:-1:-1;;;;;3271:6:514;3268:30;3265:50;;;3311:1;3308;3301:12;3265:50;3334:61;3387:7;3378:6;3367:9;3363:22;3334:61;:::i;:::-;3324:71;;;3442:2;3431:9;3427:18;3414:32;3404:42;;2968:484;;;;;:::o;3457:180::-;3516:6;3569:2;3557:9;3548:7;3544:23;3540:32;3537:52;;;3585:1;3582;3575:12;3537:52;-1:-1:-1;3608:23:514;;3457:180;-1:-1:-1;3457:180:514:o;4073:186::-;4121:4;-1:-1:-1;;;;;4146:6:514;4143:30;4140:56;;;4176:18;;:::i;:::-;-1:-1:-1;4242:2:514;4221:15;-1:-1:-1;;4217:29:514;4248:4;4213:40;;4073:186::o;4264:745::-;4341:6;4349;4402:2;4390:9;4381:7;4377:23;4373:32;4370:52;;;4418:1;4415;4408:12;4370:52;4441:29;4460:9;4441:29;:::i;:::-;4431:39;;4521:2;4510:9;4506:18;4493:32;-1:-1:-1;;;;;4540:6:514;4537:30;4534:50;;;4580:1;4577;4570:12;4534:50;4603:22;;4656:4;4648:13;;4644:27;-1:-1:-1;4634:55:514;;4685:1;4682;4675:12;4634:55;4721:2;4708:16;4746:48;4762:31;4790:2;4762:31;:::i;4746:48::-;4817:2;4810:5;4803:17;4857:7;4852:2;4847;4843;4839:11;4835:20;4832:33;4829:53;;;4878:1;4875;4868:12;4829:53;4933:2;4928;4924;4920:11;4915:2;4908:5;4904:14;4891:45;4977:1;4972:2;4967;4960:5;4956:14;4952:23;4945:34;4998:5;4988:15;;;;;4264:745;;;;;:::o;5196:186::-;5255:6;5308:2;5296:9;5287:7;5283:23;5279:32;5276:52;;;5324:1;5321;5314:12;5276:52;5347:29;5366:9;5347:29;:::i;5387:659::-;5466:6;5474;5482;5535:2;5523:9;5514:7;5510:23;5506:32;5503:52;;;5551:1;5548;5541:12;5503:52;5587:9;5574:23;5564:33;;5648:2;5637:9;5633:18;5620:32;-1:-1:-1;;;;;5712:2:514;5704:6;5701:14;5698:34;;;5728:1;5725;5718:12;5698:34;5766:6;5755:9;5751:22;5741:32;;5811:7;5804:4;5800:2;5796:13;5792:27;5782:55;;5833:1;5830;5823:12;5782:55;5873:2;5860:16;5899:2;5891:6;5888:14;5885:34;;;5915:1;5912;5905:12;5885:34;5960:7;5955:2;5946:6;5942:2;5938:15;5934:24;5931:37;5928:57;;;5981:1;5978;5971:12;5928:57;6012:2;6008;6004:11;5994:21;;6034:6;6024:16;;;;;5387:659;;;;;:::o;6051:681::-;6219:2;6271:21;;;6341:13;;6244:18;;;6363:22;;;6190:4;6428:17;;;6468:16;;;6190:4;;6219:2;6416;6401:18;;;6190:4;6512:194;6526:6;6523:1;6520:13;6512:194;;;6591:13;;-1:-1:-1;;;;;6587:39:514;6575:52;;6623:1;6682:14;;;;6647:12;;;;6541:9;6512:194;;;-1:-1:-1;6723:3:514;;6051:681;-1:-1:-1;;;;;;6051:681:514:o;6951:348::-;7035:6;7088:2;7076:9;7067:7;7063:23;7059:32;7056:52;;;7104:1;7101;7094:12;7056:52;7144:9;7131:23;-1:-1:-1;;;;;7169:6:514;7166:30;7163:50;;;7209:1;7206;7199:12;7163:50;7232:61;7285:7;7276:6;7265:9;7261:22;7232:61;:::i;:::-;7222:71;6951:348;-1:-1:-1;;;;6951:348:514:o;7304:127::-;7365:10;7360:3;7356:20;7353:1;7346:31;7396:4;7393:1;7386:15;7420:4;7417:1;7410:15;7436:127;7497:10;7492:3;7488:20;7485:1;7478:31;7528:4;7525:1;7518:15;7552:4;7549:1;7542:15;7568:128;7635:9;;;7656:11;;;7653:37;;;7670:18;;:::i;7701:127::-;7762:10;7757:3;7753:20;7750:1;7743:31;7793:4;7790:1;7783:15;7817:4;7814:1;7807:15;7833:442;7887:5;7940:3;7933:4;7925:6;7921:17;7917:27;7907:55;;7958:1;7955;7948:12;7907:55;7987:6;7981:13;8018:48;8034:31;8062:2;8034:31;:::i;8018:48::-;8091:2;8082:7;8075:19;8137:3;8130:4;8125:2;8117:6;8113:15;8109:26;8106:35;8103:55;;;8154:1;8151;8144:12;8103:55;8167:77;8241:2;8234:4;8225:7;8221:18;8214:4;8206:6;8202:17;8167:77;:::i;8280:1530::-;8376:6;8407:2;8450;8438:9;8429:7;8425:23;8421:32;8418:52;;;8466:1;8463;8456:12;8418:52;8499:9;8493:16;-1:-1:-1;;;;;8569:2:514;8561:6;8558:14;8555:34;;;8585:1;8582;8575:12;8555:34;8608:22;;;;8664:4;8646:16;;;8642:27;8639:47;;;8682:1;8679;8672:12;8639:47;8708:22;;:::i;:::-;8759:2;8753:9;8746:5;8739:24;8801:2;8797;8793:11;8787:18;8850:7;8843:15;8836:23;8827:7;8824:36;8814:64;;8874:1;8871;8864:12;8814:64;8894:14;;;8887:31;8957:2;8949:11;;8943:18;8973:16;;;8970:36;;;9002:1;8999;8992:12;8970:36;9038:56;9086:7;9075:8;9071:2;9067:17;9038:56;:::i;:::-;9033:2;9026:5;9022:14;9015:80;;9134:2;9130;9126:11;9120:18;9163:2;9153:8;9150:16;9147:36;;;9179:1;9176;9169:12;9147:36;9210:8;9206:2;9202:17;9192:27;;;9257:7;9250:4;9246:2;9242:13;9238:27;9228:55;;9279:1;9276;9269:12;9228:55;9308:2;9302:9;9292:19;;9331:60;9347:43;9387:2;9347:43;:::i;9331:60::-;9425:15;;;9507:1;9503:10;;;;9495:19;;9491:28;;;9456:12;;;;9531:19;;;9528:39;;;9563:1;9560;9553:12;9528:39;9587:11;;;;9607:135;9623:6;9618:3;9615:15;9607:135;;;9689:10;;9677:23;;9640:12;;;;9720;;;;9607:135;;;9769:2;9758:14;;9751:29;-1:-1:-1;9762:5:514;8280:1530;-1:-1:-1;;;;;;8280:1530:514:o;9815:184::-;9885:6;9938:2;9926:9;9917:7;9913:23;9909:32;9906:52;;;9954:1;9951;9944:12;9906:52;-1:-1:-1;9977:16:514;;9815:184;-1:-1:-1;9815:184:514:o;10363:125::-;10428:9;;;10449:10;;;10446:36;;;10462:18;;:::i;10493:135::-;10532:3;10553:17;;;10550:43;;10573:18;;:::i;:::-;-1:-1:-1;10620:1:514;10609:13;;10493:135::o;10815:1134::-;10920:6;10951:2;10994;10982:9;10973:7;10969:23;10965:32;10962:52;;;11010:1;11007;11000:12;10962:52;11043:9;11037:16;-1:-1:-1;;;;;11113:2:514;11105:6;11102:14;11099:34;;;11129:1;11126;11119:12;11099:34;11167:6;11156:9;11152:22;11142:32;;11212:7;11205:4;11201:2;11197:13;11193:27;11183:55;;11234:1;11231;11224:12;11183:55;11263:2;11257:9;11286:60;11302:43;11342:2;11302:43;:::i;11286:60::-;11380:15;;;11462:1;11458:10;;;;11450:19;;11446:28;;;11411:12;;;;11486:19;;;11483:39;;;11518:1;11515;11508:12;11483:39;11550:2;11546;11542:11;11562:357;11578:6;11573:3;11570:15;11562:357;;;11657:3;11651:10;11693:2;11680:11;11677:19;11674:109;;;11737:1;11766:2;11762;11755:14;11674:109;11808:68;11868:7;11863:2;11849:11;11845:2;11841:20;11837:29;11808:68;:::i;:::-;11796:81;;-1:-1:-1;11897:12:514;;;;11595;;11562:357;;;-1:-1:-1;11938:5:514;10815:1134;-1:-1:-1;;;;;;;;10815:1134:514:o;11954:289::-;12085:3;12123:6;12117:13;12139:66;12198:6;12193:3;12186:4;12178:6;12174:17;12139:66;:::i;:::-;12221:16;;;;;11954:289;-1:-1:-1;;11954:289:514:o;12248:297::-;12366:12;;12413:4;12402:16;;;12396:23;;12366:12;12431:16;;12428:111;;;12525:1;12521:6;12511;12505:4;12501:17;12498:1;12494:25;12490:38;12483:5;12479:50;12470:59;;12428:111;;12248:297;;;:::o","linkReferences":{},"immutableReferences":{"78998":[{"start":2721,"length":32},{"start":2762,"length":32},{"start":3137,"length":32}]}},"methodIdentifiers":{"SPACE_ADDRESS()":"34322eff","UPGRADE_INTERFACE_VERSION()":"ad3cb1cc","description()":"7284e416","getEntitlementDataByRoleId(uint256)":"1eee07b2","initialize(address)":"c4d66de8","isCrosschain()":"2e1b61e4","isEntitled(bytes32,address[],bytes32)":"0cf0b533","moduleType()":"6465e69f","name()":"06fdde03","proxiableUUID()":"52d1902d","removeEntitlement(uint256)":"f0c111f9","setEntitlement(uint256,bytes)":"ef8be574","supportsInterface(bytes4)":"01ffc9a7","upgradeToAndCall(address,bytes)":"4f1ef286"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ERC1967InvalidImplementation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1967NonPayable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__NotMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Entitlement__ValueAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UUPSUnauthorizedCallContext\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"slot\",\"type\":\"bytes32\"}],\"name\":\"UUPSUnsupportedProxiableUUID\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SPACE_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPGRADE_INTERFACE_VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"description\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"getEntitlementDataByRoleId\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_space\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isCrosschain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"channelId\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"wallets\",\"type\":\"address[]\"},{\"internalType\":\"bytes32\",\"name\":\"permission\",\"type\":\"bytes32\"}],\"name\":\"isEntitled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"moduleType\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"}],\"name\":\"removeEntitlement\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roleId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"entitlementData\",\"type\":\"bytes\"}],\"name\":\"setEntitlement\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"ERC1967InvalidImplementation(address)\":[{\"details\":\"The `implementation` of the proxy is invalid.\"}],\"ERC1967NonPayable()\":[{\"details\":\"An upgrade function sees `msg.value > 0` that may be lost.\"}],\"FailedInnerCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"UUPSUnauthorizedCallContext()\":[{\"details\":\"The call is from an unauthorized context.\"}],\"UUPSUnsupportedProxiableUUID(bytes32)\":[{\"details\":\"The storage `slot` is unsupported as a UUID.\"}]},\"events\":{\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\"},\"getEntitlementDataByRoleId(uint256)\":{\"params\":{\"roleId\":\"the roleId to fetch the entitlement data for\"},\"returns\":{\"_0\":\"entitlementData array for the role\"}},\"isCrosschain()\":{\"returns\":{\"_0\":\"whether this entitlement will require crosschain evaluation\"}},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"removeEntitlement(uint256)\":{\"params\":{\"roleId\":\"id of the role to remove\"}},\"setEntitlement(uint256,bytes)\":{\"params\":{\"entitlementData\":\"abi encoded array of data necessary to set the entitlement\",\"roleId\":\"id of the role to gate\"}},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"stateVariables\":{\"__gap\":{\"details\":\"Added to allow future versions to add new variables in case this contract becomes inherited. See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"description()\":{\"notice\":\"The description of the entitlement module\"},\"getEntitlementDataByRoleId(uint256)\":{\"notice\":\"fetches the entitlement data for a roleId\"},\"isCrosschain()\":{\"notice\":\"some entitlements require cross chain evaluation and may not be executed directly from other contracts\"},\"moduleType()\":{\"notice\":\"The type of the entitlement module\"},\"name()\":{\"notice\":\"The name of the entitlement module\"},\"removeEntitlement(uint256)\":{\"notice\":\"removes an entitlement\"},\"setEntitlement(uint256,bytes)\":{\"notice\":\"sets a new entitlement\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/spaces/entitlements/user/UserEntitlement.sol\":\"UserEntitlement\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/spaces/entitlements/IEntitlement.sol\":{\"keccak256\":\"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3\",\"dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf\"]},\"contracts/src/spaces/entitlements/user/IUserEntitlement.sol\":{\"keccak256\":\"0x96fef5ebaa7e9e79c77c887d9053ae06dc91cf1301f33db652e6ac811b3b5cc5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6cff649b95f65c9e3ecfa7dfa3b1c7b524ec7244eb5223c55674a4679eb8e7bf\",\"dweb:/ipfs/QmQy5sXRywRWB3aM58TCp5Xw5b258Y5PfDM8RasDznAPzA\"]},\"contracts/src/spaces/entitlements/user/UserEntitlement.sol\":{\"keccak256\":\"0xfddbdc0f0f5d94d2c50b8d45fc6e5187d723b6ca62b18675a888d4cdc7229281\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://52edc150c9fc04c1d75702122629612a9d452fc039d880e430e1281a7dad3e37\",\"dweb:/ipfs/QmRHzGQn5UhiL3xUiSmEVt5pqxexm4sD3iMRZgMHkKUmo9\"]},\"contracts/src/spaces/facets/channels/IChannel.sol\":{\"keccak256\":\"0x4a62ec6410779121880a21ae1a42bab2480f672c683f79c7f2e11bf2bfe1bd6e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://61b4142a55418d8e15e4db77bf6614a830489dc6aa191afe3dadc9ef16534b2c\",\"dweb:/ipfs/Qmbuc8VBmoFrbWZGinbCQaCrBRw3DznYhZNLzqk2FXABUx\"]},\"contracts/src/spaces/facets/roles/IRoles.sol\":{\"keccak256\":\"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8\",\"dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N\"]},\"lib/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609\",\"dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM\"]},\"lib/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0x3f13b947637c4969c0644cab4ef399cdc4b67f101463b8775c5a43b118558e53\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6683e6ade6985d394d32baaef5eea0d8b9ff0b3eca86ae413d6cdde114a9930\",\"dweb:/ipfs/QmdBE8T1BTddZxpdECMsb3KiCFyjNWmxcCddYrWFTXmWPj\"]},\"lib/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"lib/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"keccak256\":\"0xdaba3f7c42c55b2896353f32bd27d4d5f8bae741b3b05d4c53f67abc4dc47ce8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fa2e61141c602510bcd2cd936ed9561922ac8772a9b9c9a9db091a74e354a45\",\"dweb:/ipfs/QmcHQDDoEBwJmwUbzoVkytvJsBx3KVHYFFnDkvRGWh9Wmh\"]},\"lib/@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9\",\"dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v\"]},\"lib/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\":{\"keccak256\":\"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a\",\"dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE\"]},\"lib/@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa\",\"dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c\",\"dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"type":"error","name":"ERC1967InvalidImplementation"},{"inputs":[],"type":"error","name":"ERC1967NonPayable"},{"inputs":[],"type":"error","name":"Entitlement__InvalidValue"},{"inputs":[],"type":"error","name":"Entitlement__NotAllowed"},{"inputs":[],"type":"error","name":"Entitlement__NotMember"},{"inputs":[],"type":"error","name":"Entitlement__ValueAlreadyExists"},{"inputs":[],"type":"error","name":"FailedInnerCall"},{"inputs":[],"type":"error","name":"InvalidInitialization"},{"inputs":[],"type":"error","name":"NotInitializing"},{"inputs":[],"type":"error","name":"UUPSUnauthorizedCallContext"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"type":"error","name":"UUPSUnsupportedProxiableUUID"},{"inputs":[{"internalType":"uint64","name":"version","type":"uint64","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"address","name":"implementation","type":"address","indexed":true}],"type":"event","name":"Upgraded","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"SPACE_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"description","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getEntitlementDataByRoleId","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"address","name":"_space","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"pure","type":"function","name":"isCrosschain","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes32","name":"channelId","type":"bytes32"},{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"bytes32","name":"permission","type":"bytes32"}],"stateMutability":"view","type":"function","name":"isEntitled","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"moduleType","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"removeEntitlement"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"bytes","name":"entitlementData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"setEntitlement"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"upgradeToAndCall"}],"devdoc":{"kind":"dev","methods":{"constructor":{"custom:oz-upgrades-unsafe-allow":"constructor"},"getEntitlementDataByRoleId(uint256)":{"params":{"roleId":"the roleId to fetch the entitlement data for"},"returns":{"_0":"entitlementData array for the role"}},"isCrosschain()":{"returns":{"_0":"whether this entitlement will require crosschain evaluation"}},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"removeEntitlement(uint256)":{"params":{"roleId":"id of the role to remove"}},"setEntitlement(uint256,bytes)":{"params":{"entitlementData":"abi encoded array of data necessary to set the entitlement","roleId":"id of the role to gate"}},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"version":1},"userdoc":{"kind":"user","methods":{"description()":{"notice":"The description of the entitlement module"},"getEntitlementDataByRoleId(uint256)":{"notice":"fetches the entitlement data for a roleId"},"isCrosschain()":{"notice":"some entitlements require cross chain evaluation and may not be executed directly from other contracts"},"moduleType()":{"notice":"The type of the entitlement module"},"name()":{"notice":"The name of the entitlement module"},"removeEntitlement(uint256)":{"notice":"removes an entitlement"},"setEntitlement(uint256,bytes)":{"notice":"sets a new entitlement"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/spaces/entitlements/user/UserEntitlement.sol":"UserEntitlement"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/spaces/entitlements/IEntitlement.sol":{"keccak256":"0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca","urls":["bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3","dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/user/IUserEntitlement.sol":{"keccak256":"0x96fef5ebaa7e9e79c77c887d9053ae06dc91cf1301f33db652e6ac811b3b5cc5","urls":["bzz-raw://6cff649b95f65c9e3ecfa7dfa3b1c7b524ec7244eb5223c55674a4679eb8e7bf","dweb:/ipfs/QmQy5sXRywRWB3aM58TCp5Xw5b258Y5PfDM8RasDznAPzA"],"license":"Apache-2.0"},"contracts/src/spaces/entitlements/user/UserEntitlement.sol":{"keccak256":"0xfddbdc0f0f5d94d2c50b8d45fc6e5187d723b6ca62b18675a888d4cdc7229281","urls":["bzz-raw://52edc150c9fc04c1d75702122629612a9d452fc039d880e430e1281a7dad3e37","dweb:/ipfs/QmRHzGQn5UhiL3xUiSmEVt5pqxexm4sD3iMRZgMHkKUmo9"],"license":"Apache-2.0"},"contracts/src/spaces/facets/channels/IChannel.sol":{"keccak256":"0x4a62ec6410779121880a21ae1a42bab2480f672c683f79c7f2e11bf2bfe1bd6e","urls":["bzz-raw://61b4142a55418d8e15e4db77bf6614a830489dc6aa191afe3dadc9ef16534b2c","dweb:/ipfs/Qmbuc8VBmoFrbWZGinbCQaCrBRw3DznYhZNLzqk2FXABUx"],"license":"Apache-2.0"},"contracts/src/spaces/facets/roles/IRoles.sol":{"keccak256":"0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d","urls":["bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8","dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"],"license":"MIT"},"lib/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3f13b947637c4969c0644cab4ef399cdc4b67f101463b8775c5a43b118558e53","urls":["bzz-raw://c6683e6ade6985d394d32baaef5eea0d8b9ff0b3eca86ae413d6cdde114a9930","dweb:/ipfs/QmdBE8T1BTddZxpdECMsb3KiCFyjNWmxcCddYrWFTXmWPj"],"license":"MIT"},"lib/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397","urls":["bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9","dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV"],"license":"MIT"},"lib/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"keccak256":"0xdaba3f7c42c55b2896353f32bd27d4d5f8bae741b3b05d4c53f67abc4dc47ce8","urls":["bzz-raw://1fa2e61141c602510bcd2cd936ed9561922ac8772a9b9c9a9db091a74e354a45","dweb:/ipfs/QmcHQDDoEBwJmwUbzoVkytvJsBx3KVHYFFnDkvRGWh9Wmh"],"license":"MIT"},"lib/@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"],"license":"MIT"},"lib/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"],"license":"MIT"},"lib/@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":190} \ No newline at end of file diff --git a/packages/generated/v3/abis/UserEntitlement.metadata.json b/packages/generated/v3/abis/UserEntitlement.metadata.json new file mode 100644 index 000000000..99eec99da --- /dev/null +++ b/packages/generated/v3/abis/UserEntitlement.metadata.json @@ -0,0 +1,561 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "type": "error", + "name": "AddressEmptyCode" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "type": "error", + "name": "ERC1967InvalidImplementation" + }, + { + "inputs": [], + "type": "error", + "name": "ERC1967NonPayable" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__InvalidValue" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotAllowed" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__NotMember" + }, + { + "inputs": [], + "type": "error", + "name": "Entitlement__ValueAlreadyExists" + }, + { + "inputs": [], + "type": "error", + "name": "FailedInnerCall" + }, + { + "inputs": [], + "type": "error", + "name": "InvalidInitialization" + }, + { + "inputs": [], + "type": "error", + "name": "NotInitializing" + }, + { + "inputs": [], + "type": "error", + "name": "UUPSUnauthorizedCallContext" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "slot", + "type": "bytes32" + } + ], + "type": "error", + "name": "UUPSUnsupportedProxiableUUID" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "version", + "type": "uint64", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "Upgraded", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "SPACE_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "UPGRADE_INTERFACE_VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "description", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getEntitlementDataByRoleId", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_space", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "initialize" + }, + { + "inputs": [], + "stateMutability": "pure", + "type": "function", + "name": "isCrosschain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "channelId", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "wallets", + "type": "address[]" + }, + { + "internalType": "bytes32", + "name": "permission", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isEntitled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "moduleType", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeEntitlement" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roleId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "entitlementData", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setEntitlement" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function", + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "upgradeToAndCall" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "constructor": { + "custom:oz-upgrades-unsafe-allow": "constructor" + }, + "getEntitlementDataByRoleId(uint256)": { + "params": { + "roleId": "the roleId to fetch the entitlement data for" + }, + "returns": { + "_0": "entitlementData array for the role" + } + }, + "isCrosschain()": { + "returns": { + "_0": "whether this entitlement will require crosschain evaluation" + } + }, + "proxiableUUID()": { + "details": "Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier." + }, + "removeEntitlement(uint256)": { + "params": { + "roleId": "id of the role to remove" + } + }, + "setEntitlement(uint256,bytes)": { + "params": { + "entitlementData": "abi encoded array of data necessary to set the entitlement", + "roleId": "id of the role to gate" + } + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + }, + "upgradeToAndCall(address,bytes)": { + "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", + "details": "Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "description()": { + "notice": "The description of the entitlement module" + }, + "getEntitlementDataByRoleId(uint256)": { + "notice": "fetches the entitlement data for a roleId" + }, + "isCrosschain()": { + "notice": "some entitlements require cross chain evaluation and may not be executed directly from other contracts" + }, + "moduleType()": { + "notice": "The type of the entitlement module" + }, + "name()": { + "notice": "The name of the entitlement module" + }, + "removeEntitlement(uint256)": { + "notice": "removes an entitlement" + }, + "setEntitlement(uint256,bytes)": { + "notice": "sets a new entitlement" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/spaces/entitlements/user/UserEntitlement.sol": "UserEntitlement" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/spaces/entitlements/IEntitlement.sol": { + "keccak256": "0x84f059cb6d594cbe0a70ed4a10c9b96f82d530c9dba39a5d84e466f5b046b9ca", + "urls": [ + "bzz-raw://68fdceef136a16c8a11e1b354119d39697029ea41db4ae4edc9ea9d68e9c12a3", + "dweb:/ipfs/QmbCmoo6nMDou5m77JzFBPc2GBJkET5F2eWDEZaXQ5taHf" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/user/IUserEntitlement.sol": { + "keccak256": "0x96fef5ebaa7e9e79c77c887d9053ae06dc91cf1301f33db652e6ac811b3b5cc5", + "urls": [ + "bzz-raw://6cff649b95f65c9e3ecfa7dfa3b1c7b524ec7244eb5223c55674a4679eb8e7bf", + "dweb:/ipfs/QmQy5sXRywRWB3aM58TCp5Xw5b258Y5PfDM8RasDznAPzA" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/entitlements/user/UserEntitlement.sol": { + "keccak256": "0xfddbdc0f0f5d94d2c50b8d45fc6e5187d723b6ca62b18675a888d4cdc7229281", + "urls": [ + "bzz-raw://52edc150c9fc04c1d75702122629612a9d452fc039d880e430e1281a7dad3e37", + "dweb:/ipfs/QmRHzGQn5UhiL3xUiSmEVt5pqxexm4sD3iMRZgMHkKUmo9" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/channels/IChannel.sol": { + "keccak256": "0x4a62ec6410779121880a21ae1a42bab2480f672c683f79c7f2e11bf2bfe1bd6e", + "urls": [ + "bzz-raw://61b4142a55418d8e15e4db77bf6614a830489dc6aa191afe3dadc9ef16534b2c", + "dweb:/ipfs/Qmbuc8VBmoFrbWZGinbCQaCrBRw3DznYhZNLzqk2FXABUx" + ], + "license": "Apache-2.0" + }, + "contracts/src/spaces/facets/roles/IRoles.sol": { + "keccak256": "0x1c1c7dba102545ff4d555c1f6aa677cd75b089869d6ea3a7c1f447ffeaca3b1d", + "urls": [ + "bzz-raw://923b68b8b6eb7711d91c602d7c43861aef6ee67d5198ba27d41790b4f2753ab8", + "dweb:/ipfs/QmdzeevayVP8ZRT85sbWCVi2QUuBKiNmZHQjGRWC43Rx6N" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "keccak256": "0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b", + "urls": [ + "bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609", + "dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol": { + "keccak256": "0x3f13b947637c4969c0644cab4ef399cdc4b67f101463b8775c5a43b118558e53", + "urls": [ + "bzz-raw://c6683e6ade6985d394d32baaef5eea0d8b9ff0b3eca86ae413d6cdde114a9930", + "dweb:/ipfs/QmdBE8T1BTddZxpdECMsb3KiCFyjNWmxcCddYrWFTXmWPj" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "keccak256": "0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397", + "urls": [ + "bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9", + "dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol": { + "keccak256": "0xdaba3f7c42c55b2896353f32bd27d4d5f8bae741b3b05d4c53f67abc4dc47ce8", + "urls": [ + "bzz-raw://1fa2e61141c602510bcd2cd936ed9561922ac8772a9b9c9a9db091a74e354a45", + "dweb:/ipfs/QmcHQDDoEBwJmwUbzoVkytvJsBx3KVHYFFnDkvRGWh9Wmh" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/interfaces/draft-IERC1822.sol": { + "keccak256": "0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c", + "urls": [ + "bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9", + "dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol": { + "keccak256": "0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65", + "urls": [ + "bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a", + "dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/proxy/beacon/IBeacon.sol": { + "keccak256": "0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c", + "urls": [ + "bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa", + "dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/StorageSlot.sol": { + "keccak256": "0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418", + "urls": [ + "bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c", + "dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/abis/WalletLink.abi.json b/packages/generated/v3/abis/WalletLink.abi.json new file mode 100644 index 000000000..888b38544 --- /dev/null +++ b/packages/generated/v3/abis/WalletLink.abi.json @@ -0,0 +1,426 @@ +[ + { + "type": "function", + "name": "__WalletLink_init", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "checkIfLinked", + "inputs": [ + { + "name": "rootKey", + "type": "address", + "internalType": "address" + }, + { + "name": "wallet", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getLatestNonceForRootKey", + "inputs": [ + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRootKeyForWallet", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getWalletsByRootKey", + "inputs": [ + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "wallets", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "linkCallerToRootKey", + "inputs": [ + { + "name": "rootWallet", + "type": "tuple", + "internalType": "struct IWalletLinkBase.LinkedWallet", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "linkWalletToRootKey", + "inputs": [ + { + "name": "wallet", + "type": "tuple", + "internalType": "struct IWalletLinkBase.LinkedWallet", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "rootWallet", + "type": "tuple", + "internalType": "struct IWalletLinkBase.LinkedWallet", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeLink", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootWallet", + "type": "tuple", + "internalType": "struct IWalletLinkBase.LinkedWallet", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "LinkWalletToRootKey", + "inputs": [ + { + "name": "wallet", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RemoveLink", + "inputs": [ + { + "name": "wallet", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "secondWallet", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ECDSAInvalidSignature", + "inputs": [] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureLength", + "inputs": [ + { + "name": "length", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureS", + "inputs": [ + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidAccountNonce", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "currentNonce", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "WalletLink__CannotLinkToRootWallet", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "WalletLink__CannotLinkToSelf", + "inputs": [] + }, + { + "type": "error", + "name": "WalletLink__CannotRemoveRootWallet", + "inputs": [] + }, + { + "type": "error", + "name": "WalletLink__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "WalletLink__InvalidSignature", + "inputs": [] + }, + { + "type": "error", + "name": "WalletLink__LinkAlreadyExists", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "WalletLink__LinkedToAnotherRootKey", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "WalletLink__NotLinked", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ] + } +] \ No newline at end of file diff --git a/packages/generated/v3/abis/WalletLink.abi.ts b/packages/generated/v3/abis/WalletLink.abi.ts new file mode 100644 index 000000000..b22b2a39f --- /dev/null +++ b/packages/generated/v3/abis/WalletLink.abi.ts @@ -0,0 +1,426 @@ +export default [ + { + "type": "function", + "name": "__WalletLink_init", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "checkIfLinked", + "inputs": [ + { + "name": "rootKey", + "type": "address", + "internalType": "address" + }, + { + "name": "wallet", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getLatestNonceForRootKey", + "inputs": [ + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRootKeyForWallet", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getWalletsByRootKey", + "inputs": [ + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "wallets", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "linkCallerToRootKey", + "inputs": [ + { + "name": "rootWallet", + "type": "tuple", + "internalType": "struct IWalletLinkBase.LinkedWallet", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "linkWalletToRootKey", + "inputs": [ + { + "name": "wallet", + "type": "tuple", + "internalType": "struct IWalletLinkBase.LinkedWallet", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "rootWallet", + "type": "tuple", + "internalType": "struct IWalletLinkBase.LinkedWallet", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeLink", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootWallet", + "type": "tuple", + "internalType": "struct IWalletLinkBase.LinkedWallet", + "components": [ + { + "name": "addr", + "type": "address", + "internalType": "address" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceAdded", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InterfaceRemoved", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "indexed": true, + "internalType": "bytes4" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "LinkWalletToRootKey", + "inputs": [ + { + "name": "wallet", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RemoveLink", + "inputs": [ + { + "name": "wallet", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "secondWallet", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ECDSAInvalidSignature", + "inputs": [] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureLength", + "inputs": [ + { + "name": "length", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureS", + "inputs": [ + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "Initializable_InInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Initializable_NotInInitializingState", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_AlreadySupported", + "inputs": [] + }, + { + "type": "error", + "name": "Introspection_NotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidAccountNonce", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "currentNonce", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "WalletLink__CannotLinkToRootWallet", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "WalletLink__CannotLinkToSelf", + "inputs": [] + }, + { + "type": "error", + "name": "WalletLink__CannotRemoveRootWallet", + "inputs": [] + }, + { + "type": "error", + "name": "WalletLink__InvalidAddress", + "inputs": [] + }, + { + "type": "error", + "name": "WalletLink__InvalidSignature", + "inputs": [] + }, + { + "type": "error", + "name": "WalletLink__LinkAlreadyExists", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "WalletLink__LinkedToAnotherRootKey", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "WalletLink__NotLinked", + "inputs": [ + { + "name": "wallet", + "type": "address", + "internalType": "address" + }, + { + "name": "rootKey", + "type": "address", + "internalType": "address" + } + ] + } +] as const diff --git a/packages/generated/v3/abis/WalletLink.bin b/packages/generated/v3/abis/WalletLink.bin new file mode 100644 index 000000000..7fa2e5253 --- /dev/null +++ b/packages/generated/v3/abis/WalletLink.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6111ba806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063912b97581161005b578063912b9758146100f4578063d80bd3b914610117578063e65dfe9d1461012a578063f82103981461013d57600080fd5b806302345b981461008d5780631a31fc8d146100b657806320a00ac8146100cb578063260a409d146100ec575b600080fd5b6100a061009b366004610e84565b610168565b6040516100ad9190610e9f565b60405180910390f35b6100c96100c436600461100b565b610179565b005b6100de6100d9366004610e84565b610189565b6040519081526020016100ad565b6100c96101c6565b610107610102366004611078565b610222565b60405190151581526020016100ad565b6100c96101253660046110ab565b61026b565b6100c96101383660046110f1565b610276565b61015061014b366004610e84565b610284565b6040516001600160a01b0390911681526020016100ad565b6060610173826102c5565b92915050565b6101848383836102f6565b505050565b6001600160a01b03811660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c006020526040812054610173565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661021057604051630ef4733760e31b815260040160405180910390fd5b610220636ff9143960e01b6104da565b565b6001600160a01b0381811660009081527f19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc01602052604081205490918481169116145b9392505050565b6101848383836105b8565b6102808282610780565b5050565b6001600160a01b0380821660009081527f19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc016020526040812054909116610173565b6001600160a01b038116600090815260008051602061119a83398151915260205260409020606090610173906108a7565b8251825160008051602061119a83398151915291610316918391906108b4565b8351604080516001600160a01b0390921660208301528101839052600090610385906060015b604051602081830303815290604052805190602001207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b905083600001516001600160a01b03166103a3828660200151610a25565b6001600160a01b0316146103ca57604051632af0041d60e11b815260040160405180910390fd5b8351604080516001600160a01b03909216602083015281018490526000906103f49060600161033c565b905085600001516001600160a01b0316610412828860200151610a25565b6001600160a01b03161461043957604051632af0041d60e11b815260040160405180910390fd5b84516104459085610a4f565b855185516001600160a01b0316600090815260208590526040902061046991610ac1565b50845186516001600160a01b03908116600090815260018601602052604080822080546001600160a01b0319169484169490941790935587518951935190831693909216917f64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b57219190a3505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610567576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610580565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60008051602061119a8339815191526001600160a01b03841615806105e5575082516001600160a01b0316155b1561060357604051636df3f5c360e01b815260040160405180910390fd5b82600001516001600160a01b0316846001600160a01b031603610639576040516333976e3b60e11b815260040160405180910390fd5b82516001600160a01b0385811660009081526001840160205260409020548116911614610694578251604051635e300c8360e01b81526001600160a01b03808716600483015290911660248201526044015b60405180910390fd5b604080516001600160a01b03861660208201529081018390526000906106bc9060600161033c565b905083600001516001600160a01b03166106da828660200151610a25565b6001600160a01b03161461070157604051632af0041d60e11b815260040160405180910390fd5b6001600160a01b038086166000908152600184016020908152604080832080546001600160a01b031916905587519093168252849052206107429086610ad6565b5060405133906001600160a01b038716907f9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da290600090a35050505050565b815160008051602061119a8339815191529033906107a190839083906108b4565b604080516001600160a01b03831660208201529081018490526000906107c99060600161033c565b905084600001516001600160a01b03166107e7828760200151610a25565b6001600160a01b03161461080e57604051632af0041d60e11b815260040160405180910390fd5b845161081a9085610a4f565b84516001600160a01b0316600090815260208490526040902061083d9083610ac1565b5084516001600160a01b03838116600081815260018701602052604080822080546001600160a01b0319169585169590951790945588519351939092169290917f64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b572191a35050505050565b6060600061026483610aeb565b6001600160a01b03821615806108d157506001600160a01b038116155b156108ef57604051636df3f5c360e01b815260040160405180910390fd5b806001600160a01b0316826001600160a01b0316036109215760405163848ba26d60e01b815260040160405180910390fd5b6001600160a01b038281166000908152600185016020526040902054161561096f576040516314790b7f60e01b81526001600160a01b0380841660048301528216602482015260440161068b565b6001600160a01b03818116600090815260018501602052604090205416156109d2576001600160a01b038181166000908152600185016020526040908190205490516347227b5d60e01b815284831660048201529116602482015260440161068b565b6001600160a01b03821660009081526020849052604081206109f390610b47565b111561018457604051637b815eed60e11b81526001600160a01b0380841660048301528216602482015260440161068b565b600080600080610a358686610b51565b925092509250610a458282610b9e565b5090949350505050565b6001600160a01b03821660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c0060205260409020805460018101909155818114610184576040516301d4b62360e61b81526001600160a01b03841660048201526024810182905260440161068b565b6000610264836001600160a01b038416610c57565b6000610264836001600160a01b038416610ca6565b606081600001805480602002602001604051908101604052809291908181526020018280548015610b3b57602002820191906000526020600020905b815481526020019060010190808311610b27575b50505050509050919050565b6000610173825490565b60008060008351604103610b8b5760208401516040850151606086015160001a610b7d88828585610d99565b955095509550505050610b97565b50508151600091506002905b9250925092565b6000826003811115610bb257610bb2611136565b03610bbb575050565b6001826003811115610bcf57610bcf611136565b03610bed5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610c0157610c01611136565b03610c225760405163fce698f760e01b81526004810182905260240161068b565b6003826003811115610c3657610c36611136565b03610280576040516335e2f38360e21b81526004810182905260240161068b565b6000818152600183016020526040812054610c9e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610173565b506000610173565b60008181526001830160205260408120548015610d8f576000610cca60018361114c565b8554909150600090610cde9060019061114c565b9050808214610d43576000866000018281548110610cfe57610cfe61116d565b9060005260206000200154905080876000018481548110610d2157610d2161116d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610d5457610d54611183565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610173565b6000915050610173565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610dd45750600091506003905082610e5e565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610e28573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e5457506000925060019150829050610e5e565b9250600091508190505b9450945094915050565b80356001600160a01b0381168114610e7f57600080fd5b919050565b600060208284031215610e9657600080fd5b61026482610e68565b6020808252825182820181905260009190848201906040850190845b81811015610ee05783516001600160a01b031683529284019291840191600101610ebb565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610f2557610f25610eec565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610f5457610f54610eec565b604052919050565b600060408284031215610f6e57600080fd5b610f76610f02565b9050610f8182610e68565b815260208083013567ffffffffffffffff80821115610f9f57600080fd5b818501915085601f830112610fb357600080fd5b813581811115610fc557610fc5610eec565b610fd7601f8201601f19168501610f2b565b91508082528684828501011115610fed57600080fd5b80848401858401376000908201840152918301919091525092915050565b60008060006060848603121561102057600080fd5b833567ffffffffffffffff8082111561103857600080fd5b61104487838801610f5c565b9450602086013591508082111561105a57600080fd5b5061106786828701610f5c565b925050604084013590509250925092565b6000806040838503121561108b57600080fd5b61109483610e68565b91506110a260208401610e68565b90509250929050565b6000806000606084860312156110c057600080fd5b6110c984610e68565b9250602084013567ffffffffffffffff8111156110e557600080fd5b61106786828701610f5c565b6000806040838503121561110457600080fd5b823567ffffffffffffffff81111561111b57600080fd5b61112785828601610f5c565b95602094909401359450505050565b634e487b7160e01b600052602160045260246000fd5b8181038181111561017357634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfe19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc00 \ No newline at end of file diff --git a/packages/generated/v3/abis/WalletLink.json b/packages/generated/v3/abis/WalletLink.json new file mode 100644 index 000000000..9d464fedc --- /dev/null +++ b/packages/generated/v3/abis/WalletLink.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"__WalletLink_init","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"checkIfLinked","inputs":[{"name":"rootKey","type":"address","internalType":"address"},{"name":"wallet","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getLatestNonceForRootKey","inputs":[{"name":"rootKey","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRootKeyForWallet","inputs":[{"name":"wallet","type":"address","internalType":"address"}],"outputs":[{"name":"rootKey","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getWalletsByRootKey","inputs":[{"name":"rootKey","type":"address","internalType":"address"}],"outputs":[{"name":"wallets","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"linkCallerToRootKey","inputs":[{"name":"rootWallet","type":"tuple","internalType":"struct IWalletLinkBase.LinkedWallet","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"nonce","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"linkWalletToRootKey","inputs":[{"name":"wallet","type":"tuple","internalType":"struct IWalletLinkBase.LinkedWallet","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"rootWallet","type":"tuple","internalType":"struct IWalletLinkBase.LinkedWallet","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"nonce","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeLink","inputs":[{"name":"wallet","type":"address","internalType":"address"},{"name":"rootWallet","type":"tuple","internalType":"struct IWalletLinkBase.LinkedWallet","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"nonce","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"InterfaceAdded","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"InterfaceRemoved","inputs":[{"name":"interfaceId","type":"bytes4","indexed":true,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"LinkWalletToRootKey","inputs":[{"name":"wallet","type":"address","indexed":true,"internalType":"address"},{"name":"rootKey","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RemoveLink","inputs":[{"name":"wallet","type":"address","indexed":true,"internalType":"address"},{"name":"secondWallet","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"ECDSAInvalidSignature","inputs":[]},{"type":"error","name":"ECDSAInvalidSignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ECDSAInvalidSignatureS","inputs":[{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"Initializable_InInitializingState","inputs":[]},{"type":"error","name":"Initializable_NotInInitializingState","inputs":[]},{"type":"error","name":"Introspection_AlreadySupported","inputs":[]},{"type":"error","name":"Introspection_NotSupported","inputs":[]},{"type":"error","name":"InvalidAccountNonce","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"currentNonce","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"WalletLink__CannotLinkToRootWallet","inputs":[{"name":"wallet","type":"address","internalType":"address"},{"name":"rootKey","type":"address","internalType":"address"}]},{"type":"error","name":"WalletLink__CannotLinkToSelf","inputs":[]},{"type":"error","name":"WalletLink__CannotRemoveRootWallet","inputs":[]},{"type":"error","name":"WalletLink__InvalidAddress","inputs":[]},{"type":"error","name":"WalletLink__InvalidSignature","inputs":[]},{"type":"error","name":"WalletLink__LinkAlreadyExists","inputs":[{"name":"wallet","type":"address","internalType":"address"},{"name":"rootKey","type":"address","internalType":"address"}]},{"type":"error","name":"WalletLink__LinkedToAnotherRootKey","inputs":[{"name":"wallet","type":"address","internalType":"address"},{"name":"rootKey","type":"address","internalType":"address"}]},{"type":"error","name":"WalletLink__NotLinked","inputs":[{"name":"wallet","type":"address","internalType":"address"},{"name":"rootKey","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6111ba806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063912b97581161005b578063912b9758146100f4578063d80bd3b914610117578063e65dfe9d1461012a578063f82103981461013d57600080fd5b806302345b981461008d5780631a31fc8d146100b657806320a00ac8146100cb578063260a409d146100ec575b600080fd5b6100a061009b366004610e84565b610168565b6040516100ad9190610e9f565b60405180910390f35b6100c96100c436600461100b565b610179565b005b6100de6100d9366004610e84565b610189565b6040519081526020016100ad565b6100c96101c6565b610107610102366004611078565b610222565b60405190151581526020016100ad565b6100c96101253660046110ab565b61026b565b6100c96101383660046110f1565b610276565b61015061014b366004610e84565b610284565b6040516001600160a01b0390911681526020016100ad565b6060610173826102c5565b92915050565b6101848383836102f6565b505050565b6001600160a01b03811660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c006020526040812054610173565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661021057604051630ef4733760e31b815260040160405180910390fd5b610220636ff9143960e01b6104da565b565b6001600160a01b0381811660009081527f19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc01602052604081205490918481169116145b9392505050565b6101848383836105b8565b6102808282610780565b5050565b6001600160a01b0380821660009081527f19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc016020526040812054909116610173565b6001600160a01b038116600090815260008051602061119a83398151915260205260409020606090610173906108a7565b8251825160008051602061119a83398151915291610316918391906108b4565b8351604080516001600160a01b0390921660208301528101839052600090610385906060015b604051602081830303815290604052805190602001207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b905083600001516001600160a01b03166103a3828660200151610a25565b6001600160a01b0316146103ca57604051632af0041d60e11b815260040160405180910390fd5b8351604080516001600160a01b03909216602083015281018490526000906103f49060600161033c565b905085600001516001600160a01b0316610412828860200151610a25565b6001600160a01b03161461043957604051632af0041d60e11b815260040160405180910390fd5b84516104459085610a4f565b855185516001600160a01b0316600090815260208590526040902061046991610ac1565b50845186516001600160a01b03908116600090815260018601602052604080822080546001600160a01b0319169484169490941790935587518951935190831693909216917f64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b57219190a3505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610567576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610580565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60008051602061119a8339815191526001600160a01b03841615806105e5575082516001600160a01b0316155b1561060357604051636df3f5c360e01b815260040160405180910390fd5b82600001516001600160a01b0316846001600160a01b031603610639576040516333976e3b60e11b815260040160405180910390fd5b82516001600160a01b0385811660009081526001840160205260409020548116911614610694578251604051635e300c8360e01b81526001600160a01b03808716600483015290911660248201526044015b60405180910390fd5b604080516001600160a01b03861660208201529081018390526000906106bc9060600161033c565b905083600001516001600160a01b03166106da828660200151610a25565b6001600160a01b03161461070157604051632af0041d60e11b815260040160405180910390fd5b6001600160a01b038086166000908152600184016020908152604080832080546001600160a01b031916905587519093168252849052206107429086610ad6565b5060405133906001600160a01b038716907f9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da290600090a35050505050565b815160008051602061119a8339815191529033906107a190839083906108b4565b604080516001600160a01b03831660208201529081018490526000906107c99060600161033c565b905084600001516001600160a01b03166107e7828760200151610a25565b6001600160a01b03161461080e57604051632af0041d60e11b815260040160405180910390fd5b845161081a9085610a4f565b84516001600160a01b0316600090815260208490526040902061083d9083610ac1565b5084516001600160a01b03838116600081815260018701602052604080822080546001600160a01b0319169585169590951790945588519351939092169290917f64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b572191a35050505050565b6060600061026483610aeb565b6001600160a01b03821615806108d157506001600160a01b038116155b156108ef57604051636df3f5c360e01b815260040160405180910390fd5b806001600160a01b0316826001600160a01b0316036109215760405163848ba26d60e01b815260040160405180910390fd5b6001600160a01b038281166000908152600185016020526040902054161561096f576040516314790b7f60e01b81526001600160a01b0380841660048301528216602482015260440161068b565b6001600160a01b03818116600090815260018501602052604090205416156109d2576001600160a01b038181166000908152600185016020526040908190205490516347227b5d60e01b815284831660048201529116602482015260440161068b565b6001600160a01b03821660009081526020849052604081206109f390610b47565b111561018457604051637b815eed60e11b81526001600160a01b0380841660048301528216602482015260440161068b565b600080600080610a358686610b51565b925092509250610a458282610b9e565b5090949350505050565b6001600160a01b03821660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c0060205260409020805460018101909155818114610184576040516301d4b62360e61b81526001600160a01b03841660048201526024810182905260440161068b565b6000610264836001600160a01b038416610c57565b6000610264836001600160a01b038416610ca6565b606081600001805480602002602001604051908101604052809291908181526020018280548015610b3b57602002820191906000526020600020905b815481526020019060010190808311610b27575b50505050509050919050565b6000610173825490565b60008060008351604103610b8b5760208401516040850151606086015160001a610b7d88828585610d99565b955095509550505050610b97565b50508151600091506002905b9250925092565b6000826003811115610bb257610bb2611136565b03610bbb575050565b6001826003811115610bcf57610bcf611136565b03610bed5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610c0157610c01611136565b03610c225760405163fce698f760e01b81526004810182905260240161068b565b6003826003811115610c3657610c36611136565b03610280576040516335e2f38360e21b81526004810182905260240161068b565b6000818152600183016020526040812054610c9e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610173565b506000610173565b60008181526001830160205260408120548015610d8f576000610cca60018361114c565b8554909150600090610cde9060019061114c565b9050808214610d43576000866000018281548110610cfe57610cfe61116d565b9060005260206000200154905080876000018481548110610d2157610d2161116d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610d5457610d54611183565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610173565b6000915050610173565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610dd45750600091506003905082610e5e565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610e28573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e5457506000925060019150829050610e5e565b9250600091508190505b9450945094915050565b80356001600160a01b0381168114610e7f57600080fd5b919050565b600060208284031215610e9657600080fd5b61026482610e68565b6020808252825182820181905260009190848201906040850190845b81811015610ee05783516001600160a01b031683529284019291840191600101610ebb565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610f2557610f25610eec565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610f5457610f54610eec565b604052919050565b600060408284031215610f6e57600080fd5b610f76610f02565b9050610f8182610e68565b815260208083013567ffffffffffffffff80821115610f9f57600080fd5b818501915085601f830112610fb357600080fd5b813581811115610fc557610fc5610eec565b610fd7601f8201601f19168501610f2b565b91508082528684828501011115610fed57600080fd5b80848401858401376000908201840152918301919091525092915050565b60008060006060848603121561102057600080fd5b833567ffffffffffffffff8082111561103857600080fd5b61104487838801610f5c565b9450602086013591508082111561105a57600080fd5b5061106786828701610f5c565b925050604084013590509250925092565b6000806040838503121561108b57600080fd5b61109483610e68565b91506110a260208401610e68565b90509250929050565b6000806000606084860312156110c057600080fd5b6110c984610e68565b9250602084013567ffffffffffffffff8111156110e557600080fd5b61106786828701610f5c565b6000806040838503121561110457600080fd5b823567ffffffffffffffff81111561111b57600080fd5b61112785828601610f5c565b95602094909401359450505050565b634e487b7160e01b600052602160045260246000fd5b8181038181111561017357634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfe19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc00","sourceMap":"270:1475:172:-:0;;;;;;;;;;;;-1:-1:-1;385:22:70;:20;:22::i;:::-;270:1475:172;;1653:314:84;303:66:85;1779:14:84;;;;;;;1775:62;;;1802:35;;-1:-1:-1;;;1802:35:84;;;;;;;;;;;1775:62;1848:9;;1860:16;1848:9;;;:28;1844:119;;;1886:28;;-1:-1:-1;;1886:28:84;1898:16;1886:28;;;;;1927:29;;158:42:514;;;1927:29:84;;146:2:514;131:18;1927:29:84;;;;;;;1844:119;1694:273;1653:314::o;14:192:514:-;270:1475:172;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063912b97581161005b578063912b9758146100f4578063d80bd3b914610117578063e65dfe9d1461012a578063f82103981461013d57600080fd5b806302345b981461008d5780631a31fc8d146100b657806320a00ac8146100cb578063260a409d146100ec575b600080fd5b6100a061009b366004610e84565b610168565b6040516100ad9190610e9f565b60405180910390f35b6100c96100c436600461100b565b610179565b005b6100de6100d9366004610e84565b610189565b6040519081526020016100ad565b6100c96101c6565b610107610102366004611078565b610222565b60405190151581526020016100ad565b6100c96101253660046110ab565b61026b565b6100c96101383660046110f1565b610276565b61015061014b366004610e84565b610284565b6040516001600160a01b0390911681526020016100ad565b6060610173826102c5565b92915050565b6101848383836102f6565b505050565b6001600160a01b03811660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c006020526040812054610173565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661021057604051630ef4733760e31b815260040160405180910390fd5b610220636ff9143960e01b6104da565b565b6001600160a01b0381811660009081527f19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc01602052604081205490918481169116145b9392505050565b6101848383836105b8565b6102808282610780565b5050565b6001600160a01b0380821660009081527f19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc016020526040812054909116610173565b6001600160a01b038116600090815260008051602061119a83398151915260205260409020606090610173906108a7565b8251825160008051602061119a83398151915291610316918391906108b4565b8351604080516001600160a01b0390921660208301528101839052600090610385906060015b604051602081830303815290604052805190602001207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b905083600001516001600160a01b03166103a3828660200151610a25565b6001600160a01b0316146103ca57604051632af0041d60e11b815260040160405180910390fd5b8351604080516001600160a01b03909216602083015281018490526000906103f49060600161033c565b905085600001516001600160a01b0316610412828860200151610a25565b6001600160a01b03161461043957604051632af0041d60e11b815260040160405180910390fd5b84516104459085610a4f565b855185516001600160a01b0316600090815260208590526040902061046991610ac1565b50845186516001600160a01b03908116600090815260018601602052604080822080546001600160a01b0319169484169490941790935587518951935190831693909216917f64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b57219190a3505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610567576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610580565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60008051602061119a8339815191526001600160a01b03841615806105e5575082516001600160a01b0316155b1561060357604051636df3f5c360e01b815260040160405180910390fd5b82600001516001600160a01b0316846001600160a01b031603610639576040516333976e3b60e11b815260040160405180910390fd5b82516001600160a01b0385811660009081526001840160205260409020548116911614610694578251604051635e300c8360e01b81526001600160a01b03808716600483015290911660248201526044015b60405180910390fd5b604080516001600160a01b03861660208201529081018390526000906106bc9060600161033c565b905083600001516001600160a01b03166106da828660200151610a25565b6001600160a01b03161461070157604051632af0041d60e11b815260040160405180910390fd5b6001600160a01b038086166000908152600184016020908152604080832080546001600160a01b031916905587519093168252849052206107429086610ad6565b5060405133906001600160a01b038716907f9a9d98629b39adf596077fc95a0712ba55c38f40a354e99d366a10f9c3e27da290600090a35050505050565b815160008051602061119a8339815191529033906107a190839083906108b4565b604080516001600160a01b03831660208201529081018490526000906107c99060600161033c565b905084600001516001600160a01b03166107e7828760200151610a25565b6001600160a01b03161461080e57604051632af0041d60e11b815260040160405180910390fd5b845161081a9085610a4f565b84516001600160a01b0316600090815260208490526040902061083d9083610ac1565b5084516001600160a01b03838116600081815260018701602052604080822080546001600160a01b0319169585169590951790945588519351939092169290917f64126824352170c4025060d1f6e215159635e4b08e649830695f26ef6d2b572191a35050505050565b6060600061026483610aeb565b6001600160a01b03821615806108d157506001600160a01b038116155b156108ef57604051636df3f5c360e01b815260040160405180910390fd5b806001600160a01b0316826001600160a01b0316036109215760405163848ba26d60e01b815260040160405180910390fd5b6001600160a01b038281166000908152600185016020526040902054161561096f576040516314790b7f60e01b81526001600160a01b0380841660048301528216602482015260440161068b565b6001600160a01b03818116600090815260018501602052604090205416156109d2576001600160a01b038181166000908152600185016020526040908190205490516347227b5d60e01b815284831660048201529116602482015260440161068b565b6001600160a01b03821660009081526020849052604081206109f390610b47565b111561018457604051637b815eed60e11b81526001600160a01b0380841660048301528216602482015260440161068b565b600080600080610a358686610b51565b925092509250610a458282610b9e565b5090949350505050565b6001600160a01b03821660009081527fda5d6d87446d81938877f0ee239dac391146dd7466ea30567f72becf06773c0060205260409020805460018101909155818114610184576040516301d4b62360e61b81526001600160a01b03841660048201526024810182905260440161068b565b6000610264836001600160a01b038416610c57565b6000610264836001600160a01b038416610ca6565b606081600001805480602002602001604051908101604052809291908181526020018280548015610b3b57602002820191906000526020600020905b815481526020019060010190808311610b27575b50505050509050919050565b6000610173825490565b60008060008351604103610b8b5760208401516040850151606086015160001a610b7d88828585610d99565b955095509550505050610b97565b50508151600091506002905b9250925092565b6000826003811115610bb257610bb2611136565b03610bbb575050565b6001826003811115610bcf57610bcf611136565b03610bed5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610c0157610c01611136565b03610c225760405163fce698f760e01b81526004810182905260240161068b565b6003826003811115610c3657610c36611136565b03610280576040516335e2f38360e21b81526004810182905260240161068b565b6000818152600183016020526040812054610c9e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610173565b506000610173565b60008181526001830160205260408120548015610d8f576000610cca60018361114c565b8554909150600090610cde9060019061114c565b9050808214610d43576000866000018281548110610cfe57610cfe61116d565b9060005260206000200154905080876000018481548110610d2157610d2161116d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610d5457610d54611183565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610173565b6000915050610173565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610dd45750600091506003905082610e5e565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610e28573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e5457506000925060019150829050610e5e565b9250600091508190505b9450945094915050565b80356001600160a01b0381168114610e7f57600080fd5b919050565b600060208284031215610e9657600080fd5b61026482610e68565b6020808252825182820181905260009190848201906040850190845b81811015610ee05783516001600160a01b031683529284019291840191600101610ebb565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610f2557610f25610eec565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610f5457610f54610eec565b604052919050565b600060408284031215610f6e57600080fd5b610f76610f02565b9050610f8182610e68565b815260208083013567ffffffffffffffff80821115610f9f57600080fd5b818501915085601f830112610fb357600080fd5b813581811115610fc557610fc5610eec565b610fd7601f8201601f19168501610f2b565b91508082528684828501011115610fed57600080fd5b80848401858401376000908201840152918301919091525092915050565b60008060006060848603121561102057600080fd5b833567ffffffffffffffff8082111561103857600080fd5b61104487838801610f5c565b9450602086013591508082111561105a57600080fd5b5061106786828701610f5c565b925050604084013590509250925092565b6000806040838503121561108b57600080fd5b61109483610e68565b91506110a260208401610e68565b90509250929050565b6000806000606084860312156110c057600080fd5b6110c984610e68565b9250602084013567ffffffffffffffff8111156110e557600080fd5b61106786828701610f5c565b6000806040838503121561110457600080fd5b823567ffffffffffffffff81111561111b57600080fd5b61112785828601610f5c565b95602094909401359450505050565b634e487b7160e01b600052602160045260246000fd5b8181038181111561017357634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfe19511ce7944c192b1007be99b82019218d1decfc513f05239612743360a0dc00","sourceMap":"270:1475:172:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1085:150;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;660:190;;;;;;:::i;:::-;;:::i;:::-;;1613:130;;;;;;:::i;:::-;;:::i;:::-;;;3412:25:514;;;3400:2;3385:18;1613:130:172;3266:177:514;332:110:172;;;:::i;1463:146::-;;;;;;:::i;:::-;;:::i;:::-;;;3878:14:514;;3871:22;3853:41;;3841:2;3826:18;1463:146:172;3713:187:514;884:157:172;;;;;;:::i;:::-;;:::i;476:150::-;;;;;;:::i;:::-;;:::i;1280:138::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5001:32:514;;;4983:51;;4971:2;4956:18;1280:138:172;4837:203:514;1085:150:172;1162:24;1201:29;1222:7;1201:20;:29::i;:::-;1194:36;1085:150;-1:-1:-1;;1085:150:172:o;660:190::-;795:50;819:6;827:10;839:5;795:23;:50::i;:::-;660:190;;;:::o;1613:130::-;-1:-1:-1;;;;;533:37:146;;1695:7:172;533:37:146;;;1561:66;533:37;;;;;;1717:21:172;443:132:146;332:110:172;303:66:85;1263:42:84;;;;;;1258:100;;1320:38;;-1:-1:-1;;;1320:38:84;;;;;;;;;;;1258:100;393:44:172::1;-1:-1:-1::0;;;393:13:172::1;:44::i;:::-;332:110::o:0;1463:146::-;-1:-1:-1;;;;;6107:26:173;;;1554:4:172;6107:26:173;;;:18;:26;;;;;;1554:4:172;;6107:37:173;;;:26;;:37;1573:31:172;1566:38;1463:146;-1:-1:-1;;;1463:146:172:o;884:157::-;998:38;1010:6;1018:10;1030:5;998:11;:38::i;476:150::-;579:42;603:10;615:5;579:23;:42::i;:::-;476:150;;:::o;1280:138::-;-1:-1:-1;;;;;5867:50:173;;;1356:15:172;5867:50:173;;;:42;:50;;;;;;1356:15:172;;5867:50:173;1386:27:172;5761:161:173;5574:183;-1:-1:-1;;;;;5691:52:173;;:43;:52;;;-1:-1:-1;;;;;;;;;;;5691:52:173;;;;;5652:24;;5691:61;;:59;:61::i;2484:1403::-;2713:11;;2726:15;;-1:-1:-1;;;;;;;;;;;367:66:174;2694:48:173;;367:66:174;;2713:11:173;2694:14;:48::i;:::-;2940:11;;2929:30;;;-1:-1:-1;;;;;5237:32:514;;;2929:30:173;;;5219:51:514;5286:18;;5279:34;;;2843:26:173;;2872:94;;5192:18:514;;2929:30:173;;;;;;;;;;;;;2919:41;;;;;;1403:34:440;1298:14;1390:48;;;1499:4;1492:25;;;;1597:4;1581:21;;;1222:460;2872:94:173;2843:123;;3134:10;:15;;;-1:-1:-1;;;;;3075:74:173;:55;3089:18;3109:10;:20;;;3075:13;:55::i;:::-;-1:-1:-1;;;;;3075:74:173;;3064:144;;3171:30;;-1:-1:-1;;;3171:30:173;;;;;;;;;;;3064:144;3310:15;;3299:34;;;-1:-1:-1;;;;;5237:32:514;;;3299:34:173;;;5219:51:514;5286:18;;5279:34;;;3214:25:173;;3242:98;;5192:18:514;;3299:34:173;5045:274:514;3242:98:173;3214:126;;3496:6;:11;;;-1:-1:-1;;;;;3442:65:173;:50;3456:17;3475:6;:16;;;3442:13;:50::i;:::-;-1:-1:-1;;;;;3442:65:173;;3438:123;;3524:30;;-1:-1:-1;;;3524:30:173;;;;;;;;;;;3438:123;3657:15;;3640:40;;3674:5;3640:16;:40::i;:::-;3754:11;;3733:15;;-1:-1:-1;;;;;3713:36:173;3754:11;3713:36;;;;;;;;;;:53;;:40;:53::i;:::-;-1:-1:-1;3806:15:173;;3791:11;;-1:-1:-1;;;;;3772:31:173;;;3806:15;3772:31;;;:18;;;:31;;;;;;:49;;-1:-1:-1;;;;;;3772:49:173;;;;;;;;;;;3866:15;;3853:11;;3833:49;;;;;;;;;;;;3806:15;3833:49;2617:1270;;;2484:1403;;;:::o;452:282:87:-;-1:-1:-1;;;;;;1121:62:87;;1096:4;1121:62;;;303:66:89;1121:62:87;;;;;;;;:70;;:62;:70;510:182;;-1:-1:-1;;;;;;556:62:87;;:49;:62;;;303:66:89;556:62:87;;;;;:69;;-1:-1:-1;;556:69:87;621:4;556:69;;;510:182;;;653:32;;-1:-1:-1;;;653:32:87;;;;;;;;;;;510:182;702:27;;-1:-1:-1;;;;;;702:27:87;;;;;;;;452:282;:::o;4064:1339:173:-;-1:-1:-1;;;;;;;;;;;;;;;;4328:28:173;;;;:61;;-1:-1:-1;4360:15:173;;-1:-1:-1;;;;;4360:29:173;;4328:61;4324:117;;;4406:28;;-1:-1:-1;;;4406:28:173;;;;;;;;;;;4324:117;4520:10;:15;;;-1:-1:-1;;;;;4502:33:173;:14;-1:-1:-1;;;;;4502:33:173;;4498:97;;4552:36;;-1:-1:-1;;;4552:36:173;;;;;;;;;;;4498:97;4701:15;;-1:-1:-1;;;;;4663:34:173;;;4701:15;4663:34;;;:18;;;:34;;;;;;;;:53;;;4659:135;;4771:15;;4733:54;;-1:-1:-1;;;4733:54:173;;-1:-1:-1;;;;;5554:15:514;;;4733:54:173;;;5536:34:514;5606:15;;;5586:18;;;5579:43;5471:18;;4733:54:173;;;;;;;;4659:135;4886:33;;;-1:-1:-1;;;;;5237:32:514;;4886:33:173;;;5219:51:514;5286:18;;;5279:34;;;4800:26:173;;4829:97;;5192:18:514;;4886:33:173;5045:274:514;4829:97:173;4800:126;;5094:10;:15;;;-1:-1:-1;;;;;5035:74:173;:55;5049:18;5069:10;:20;;;5035:13;:55::i;:::-;-1:-1:-1;;;;;5035:74:173;;5024:144;;5131:30;;-1:-1:-1;;;5131:30:173;;;;;;;;;;;5024:144;-1:-1:-1;;;;;5236:34:173;;;5281:1;5236:34;;;:18;;;:34;;;;;;;;:47;;-1:-1:-1;;;;;;5236:47:173;;;5309:15;;5289:36;;;;;;;;;:59;;5255:14;5289:43;:59::i;:::-;-1:-1:-1;5360:38:173;;5387:10;;-1:-1:-1;;;;;5360:38:173;;;;;;;;4181:1222;;4064:1339;;;:::o;1065:1124::-;1382:15;;-1:-1:-1;;;;;;;;;;;367:66:174;1335:10:173;;1352:46;;367:66:174;;1335:10:173;;1352:14;:46::i;:::-;1592:28;;;-1:-1:-1;;;;;5237:32:514;;1592:28:173;;;5219:51:514;5286:18;;;5279:34;;;1506:26:173;;1535:92;;5192:18:514;;1592:28:173;5045:274:514;1535:92:173;1506:121;;1795:10;:15;;;-1:-1:-1;;;;;1736:74:173;:55;1750:18;1770:10;:20;;;1736:13;:55::i;:::-;-1:-1:-1;;;;;1736:74:173;;1725:144;;1832:30;;-1:-1:-1;;;1832:30:173;;;;;;;;;;;1725:144;1965:15;;1948:40;;1982:5;1948:16;:40::i;:::-;2041:15;;-1:-1:-1;;;;;2021:36:173;:19;:36;;;;;;;;;;:51;;2062:9;2021:40;:51::i;:::-;-1:-1:-1;2110:15:173;;-1:-1:-1;;;;;2078:29:173;;;2110:15;2078:29;;;:18;;;:29;;;;;;:47;;-1:-1:-1;;;;;;2078:47:173;;;;;;;;;;;2168:15;;2137:47;;;;;;;2078:29;;2137:47;;;1166:1023;;;1065:1124;;:::o;10270:300:447:-;10333:16;10361:22;10386:19;10394:3;10386:7;:19::i;6327:1058:173:-;-1:-1:-1;;;;;6522:20:173;;;;:48;;-1:-1:-1;;;;;;6546:24:173;;;6522:48;6518:104;;;6587:28;;-1:-1:-1;;;6587:28:173;;;;;;;;;;;6518:104;6684:10;-1:-1:-1;;;;;6674:20:173;:6;-1:-1:-1;;;;;6674:20:173;;6670:78;;6711:30;;-1:-1:-1;;;6711:30:173;;;;;;;;;;;6670:78;-1:-1:-1;;;;;6828:26:173;;;6866:1;6828:26;;;:18;;;:26;;;;;;;:40;6824:117;;6885:49;;-1:-1:-1;;;6885:49:173;;-1:-1:-1;;;;;5554:15:514;;;6885:49:173;;;5536:34:514;5606:15;;5586:18;;;5579:43;5471:18;;6885:49:173;5324:304:514;6824:117:173;-1:-1:-1;;;;;7030:30:173;;;7072:1;7030:30;;;:18;;;:30;;;;;;;:44;7026:170;;-1:-1:-1;;;;;7151:30:173;;;;;;;:18;;;:30;;;;;;;;7091:98;;-1:-1:-1;;;7091:98:173;;5554:15:514;;;7091:98:173;;;5536:34:514;7151:30:173;;5586:18:514;;;5579:43;5471:18;;7091:98:173;5324:304:514;7026:170:173;-1:-1:-1;;;;;7263:27:173;;7302:1;7263:27;;;;;;;;;;:36;;:34;:36::i;:::-;:40;7259:122;;;7320:54;;-1:-1:-1;;;7320:54:173;;-1:-1:-1;;;;;5554:15:514;;;7320:54:173;;;5536:34:514;5606:15;;5586:18;;;5579:43;5471:18;;7320:54:173;5324:304:514;3702:255:437;3780:7;3800:17;3819:18;3839:16;3859:27;3870:4;3876:9;3859:10;:27::i;:::-;3799:87;;;;;;3896:28;3908:5;3915:8;3896:11;:28::i;:::-;-1:-1:-1;3941:9:437;;3702:255;-1:-1:-1;;;;3702:255:437:o;1168:202:146:-;-1:-1:-1;;;;;1015:37:146;;1247:15;1015:37;;;1561:66;1015:37;;;;;:39;;;;;;;;1291:16;;;1287:79;;1324:35;;-1:-1:-1;;;1324:35:146;;-1:-1:-1;;;;;5237:32:514;;1324:35:146;;;5219:51:514;5286:18;;;5279:34;;;5192:18;;1324:35:146;5045:274:514;8316:150:447;8386:4;8409:50;8414:3;-1:-1:-1;;;;;8434:23:447;;8409:4;:50::i;8634:156::-;8707:4;8730:53;8738:3;-1:-1:-1;;;;;8758:23:447;;8730:7;:53::i;5581:109::-;5637:16;5672:3;:11;;5665:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5581:109;;;:::o;9117:115::-;9180:7;9206:19;9214:3;4556:18;;4474:107;2129:766:437;2210:7;2219:12;2233:7;2256:9;:16;2276:2;2256:22;2252:637;;2592:4;2577:20;;2571:27;2641:4;2626:20;;2620:27;2698:4;2683:20;;2677:27;2294:9;2669:36;2739:25;2750:4;2669:36;2571:27;2620;2739:10;:25::i;:::-;2732:32;;;;;;;;;;;2252:637;-1:-1:-1;;2860:16:437;;2811:1;;-1:-1:-1;2815:35:437;;2252:637;2129:766;;;;;:::o;7196:532::-;7291:20;7282:5;:29;;;;;;;;:::i;:::-;;7278:444;;7196:532;;:::o;7278:444::-;7387:29;7378:5;:38;;;;;;;;:::i;:::-;;7374:348;;7439:23;;-1:-1:-1;;;7439:23:437;;;;;;;;;;;7374:348;7492:35;7483:5;:44;;;;;;;;:::i;:::-;;7479:243;;7550:46;;-1:-1:-1;;;7550:46:437;;;;;3412:25:514;;;3385:18;;7550:46:437;3266:177:514;7479:243:437;7626:30;7617:5;:39;;;;;;;;:::i;:::-;;7613:109;;7679:32;;-1:-1:-1;;;7679:32:437;;;;;3412:25:514;;;3385:18;;7679:32:437;3266:177:514;2241:406:447;2304:4;4360:21;;;:14;;;:21;;;;;;2320:321;;-1:-1:-1;2362:23:447;;;;;;;;:11;:23;;;;;;;;;;;;;2544:18;;2520:21;;;:14;;;:21;;;;;;:42;;;;2576:11;;2320:321;-1:-1:-1;2625:5:447;2618:12;;2815:1368;2881:4;3010:21;;;:14;;;:21;;;;;;3046:13;;3042:1135;;3413:18;3434:12;3445:1;3434:8;:12;:::i;:::-;3480:18;;3413:33;;-1:-1:-1;3460:17:447;;3480:22;;3501:1;;3480:22;:::i;:::-;3460:42;;3535:9;3521:10;:23;3517:378;;3564:17;3584:3;:11;;3596:9;3584:22;;;;;;;;:::i;:::-;;;;;;;;;3564:42;;3731:9;3705:3;:11;;3717:10;3705:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;3844:25;;;:14;;;:25;;;;;:36;;;3517:378;3973:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4076:3;:14;;:21;4091:5;4076:21;;;;;;;;;;;4069:28;;;4119:4;4112:11;;;;;;;3042:1135;4161:5;4154:12;;;;;5140:1530:437;5266:7;;;6199:66;6186:79;;6182:164;;;-1:-1:-1;6297:1:437;;-1:-1:-1;6301:30:437;;-1:-1:-1;6333:1:437;6281:54;;6182:164;6457:24;;;6440:14;6457:24;;;;;;;;;6668:25:514;;;6741:4;6729:17;;6709:18;;;6702:45;;;;6763:18;;;6756:34;;;6806:18;;;6799:34;;;6457:24:437;;6640:19:514;;6457:24:437;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6457:24:437;;-1:-1:-1;;6457:24:437;;;-1:-1:-1;;;;;;;6495:20:437;;6491:113;;-1:-1:-1;6547:1:437;;-1:-1:-1;6551:29:437;;-1:-1:-1;6547:1:437;;-1:-1:-1;6531:62:437;;6491:113;6622:6;-1:-1:-1;6630:20:437;;-1:-1:-1;6630:20:437;;-1:-1:-1;5140:1530:437;;;;;;;;;:::o;14:173:514:-;82:20;;-1:-1:-1;;;;;131:31:514;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:658::-;554:2;606:21;;;676:13;;579:18;;;698:22;;;525:4;;554:2;777:15;;;;751:2;736:18;;;525:4;820:195;834:6;831:1;828:13;820:195;;;899:13;;-1:-1:-1;;;;;895:39:514;883:52;;990:15;;;;955:12;;;;931:1;849:9;820:195;;;-1:-1:-1;1032:3:514;;383:658;-1:-1:-1;;;;;;383:658:514:o;1046:127::-;1107:10;1102:3;1098:20;1095:1;1088:31;1138:4;1135:1;1128:15;1162:4;1159:1;1152:15;1178:256;1249:4;1243:11;;;1281:17;;1328:18;1313:34;;1349:22;;;1310:62;1307:88;;;1375:18;;:::i;:::-;1411:4;1404:24;1178:256;:::o;1439:275::-;1510:2;1504:9;1575:2;1556:13;;-1:-1:-1;;1552:27:514;1540:40;;1610:18;1595:34;;1631:22;;;1592:62;1589:88;;;1657:18;;:::i;:::-;1693:2;1686:22;1439:275;;-1:-1:-1;1439:275:514:o;1719:858::-;1778:5;1826:4;1814:9;1809:3;1805:19;1801:30;1798:50;;;1844:1;1841;1834:12;1798:50;1866:21;;:::i;:::-;1857:30;;1910:29;1929:9;1910:29;:::i;:::-;1903:5;1896:44;1959:2;2012;2001:9;1997:18;1984:32;2035:18;2076:2;2068:6;2065:14;2062:34;;;2092:1;2089;2082:12;2062:34;2130:6;2119:9;2115:22;2105:32;;2175:3;2168:4;2164:2;2160:13;2156:23;2146:51;;2193:1;2190;2183:12;2146:51;2229:2;2216:16;2251:2;2247;2244:10;2241:36;;;2257:18;;:::i;:::-;2299:53;2342:2;2323:13;;-1:-1:-1;;2319:27:514;2315:36;;2299:53;:::i;:::-;2286:66;;2375:2;2368:5;2361:17;2415:3;2410:2;2405;2401;2397:11;2393:20;2390:29;2387:49;;;2432:1;2429;2422:12;2387:49;2487:2;2482;2478;2474:11;2469:2;2462:5;2458:14;2445:45;2531:1;2510:14;;;2506:23;;2499:34;2549:14;;;2542:29;;;;-1:-1:-1;2553:5:514;1719:858;-1:-1:-1;;1719:858:514:o;2582:679::-;2721:6;2729;2737;2790:2;2778:9;2769:7;2765:23;2761:32;2758:52;;;2806:1;2803;2796:12;2758:52;2846:9;2833:23;2875:18;2916:2;2908:6;2905:14;2902:34;;;2932:1;2929;2922:12;2902:34;2955:63;3010:7;3001:6;2990:9;2986:22;2955:63;:::i;:::-;2945:73;;3071:2;3060:9;3056:18;3043:32;3027:48;;3100:2;3090:8;3087:16;3084:36;;;3116:1;3113;3106:12;3084:36;;3139:65;3196:7;3185:8;3174:9;3170:24;3139:65;:::i;:::-;3129:75;;;3251:2;3240:9;3236:18;3223:32;3213:42;;2582:679;;;;;:::o;3448:260::-;3516:6;3524;3577:2;3565:9;3556:7;3552:23;3548:32;3545:52;;;3593:1;3590;3583:12;3545:52;3616:29;3635:9;3616:29;:::i;:::-;3606:39;;3664:38;3698:2;3687:9;3683:18;3664:38;:::i;:::-;3654:48;;3448:260;;;;;:::o;3905:498::-;4013:6;4021;4029;4082:2;4070:9;4061:7;4057:23;4053:32;4050:52;;;4098:1;4095;4088:12;4050:52;4121:29;4140:9;4121:29;:::i;:::-;4111:39;;4201:2;4190:9;4186:18;4173:32;4228:18;4220:6;4217:30;4214:50;;;4260:1;4257;4250:12;4214:50;4283:63;4338:7;4329:6;4318:9;4314:22;4283:63;:::i;4408:424::-;4507:6;4515;4568:2;4556:9;4547:7;4543:23;4539:32;4536:52;;;4584:1;4581;4574:12;4536:52;4624:9;4611:23;4657:18;4649:6;4646:30;4643:50;;;4689:1;4686;4679:12;4643:50;4712:63;4767:7;4758:6;4747:9;4743:22;4712:63;:::i;:::-;4702:73;4822:2;4807:18;;;;4794:32;;-1:-1:-1;;;;4408:424:514:o;5633:127::-;5694:10;5689:3;5685:20;5682:1;5675:31;5725:4;5722:1;5715:15;5749:4;5746:1;5739:15;5947:225;6014:9;;;6035:11;;;6032:134;;;6088:10;6083:3;6079:20;6076:1;6069:31;6123:4;6120:1;6113:15;6151:4;6148:1;6141:15;6177:127;6238:10;6233:3;6229:20;6226:1;6219:31;6269:4;6266:1;6259:15;6293:4;6290:1;6283:15;6309:127;6370:10;6365:3;6361:20;6358:1;6351:31;6401:4;6398:1;6391:15;6425:4;6422:1;6415:15","linkReferences":{}},"methodIdentifiers":{"__WalletLink_init()":"260a409d","checkIfLinked(address,address)":"912b9758","getLatestNonceForRootKey(address)":"20a00ac8","getRootKeyForWallet(address)":"f8210398","getWalletsByRootKey(address)":"02345b98","linkCallerToRootKey((address,bytes),uint256)":"e65dfe9d","linkWalletToRootKey((address,bytes),(address,bytes),uint256)":"1a31fc8d","removeLink(address,(address,bytes),uint256)":"d80bd3b9"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_InInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Initializable_NotInInitializingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_AlreadySupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Introspection_NotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"currentNonce\",\"type\":\"uint256\"}],\"name\":\"InvalidAccountNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rootKey\",\"type\":\"address\"}],\"name\":\"WalletLink__CannotLinkToRootWallet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WalletLink__CannotLinkToSelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WalletLink__CannotRemoveRootWallet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WalletLink__InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WalletLink__InvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rootKey\",\"type\":\"address\"}],\"name\":\"WalletLink__LinkAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rootKey\",\"type\":\"address\"}],\"name\":\"WalletLink__LinkedToAnotherRootKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rootKey\",\"type\":\"address\"}],\"name\":\"WalletLink__NotLinked\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"InterfaceRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rootKey\",\"type\":\"address\"}],\"name\":\"LinkWalletToRootKey\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"secondWallet\",\"type\":\"address\"}],\"name\":\"RemoveLink\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__WalletLink_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rootKey\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"}],\"name\":\"checkIfLinked\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rootKey\",\"type\":\"address\"}],\"name\":\"getLatestNonceForRootKey\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"}],\"name\":\"getRootKeyForWallet\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rootKey\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rootKey\",\"type\":\"address\"}],\"name\":\"getWalletsByRootKey\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"wallets\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IWalletLinkBase.LinkedWallet\",\"name\":\"rootWallet\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"linkCallerToRootKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IWalletLinkBase.LinkedWallet\",\"name\":\"wallet\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IWalletLinkBase.LinkedWallet\",\"name\":\"rootWallet\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"linkWalletToRootKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IWalletLinkBase.LinkedWallet\",\"name\":\"rootWallet\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"removeLink\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ECDSAInvalidSignature()\":[{\"details\":\"The signature derives the `address(0)`.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}],\"InvalidAccountNonce(address,uint256)\":[{\"details\":\"The nonce used for an `account` is not the expected current nonce.\"}]},\"kind\":\"dev\",\"methods\":{\"checkIfLinked(address,address)\":{\"params\":{\"rootKey\":\"the public key of the users rootkey to check\",\"wallet\":\"the ethereum wallet to check\"},\"returns\":{\"_0\":\"areLinked boolean if they are linked together\"}},\"getLatestNonceForRootKey(address)\":{\"params\":{\"rootKey\":\"the public key of the users rootkey to check\"}},\"getRootKeyForWallet(address)\":{\"params\":{\"wallet\":\"the ethereum wallet to find associated root key for\"},\"returns\":{\"rootKey\":\"the rootkey that this wallet is linked to\"}},\"getWalletsByRootKey(address)\":{\"params\":{\"rootKey\":\"the public key of the users rootkey to find associated wallets for\"},\"returns\":{\"wallets\":\"an array of ethereum wallets linked to this root key\"}},\"linkCallerToRootKey((address,bytes),uint256)\":{\"params\":{\"nonce\":\"a nonce used to prevent replay attacks, nonce must always be higher than previous nonce\",\"rootWallet\":\"the root wallet that the caller is linking to\"}},\"linkWalletToRootKey((address,bytes),(address,bytes),uint256)\":{\"params\":{\"nonce\":\"a nonce used to prevent replay attacks, nonce must always be higher than previous nonce\",\"rootWallet\":\"the root wallet that the caller is linking to\",\"wallet\":\"the wallet being linked to the root wallet\"}},\"removeLink(address,(address,bytes),uint256)\":{\"params\":{\"wallet\":\"the wallet being unlinked from the sending wallet\"}}},\"version\":1},\"userdoc\":{\"events\":{\"InterfaceAdded(bytes4)\":{\"notice\":\"Emitted when an interface is added to the contract via `_addInterface`.\"},\"InterfaceRemoved(bytes4)\":{\"notice\":\"Emitted when an interface is removed from the contract via `_removeInterface`.\"},\"LinkWalletToRootKey(address,address)\":{\"notice\":\"Emitted when a user links their wallet to a rootKey\"},\"RemoveLink(address,address)\":{\"notice\":\"Emitted when two wallets are unlinked\"}},\"kind\":\"user\",\"methods\":{\"checkIfLinked(address,address)\":{\"notice\":\"checks if a root key and wallet are linked\"},\"getLatestNonceForRootKey(address)\":{\"notice\":\"gets the latest nonce for a rootkey to use a higher one for next link action\"},\"getRootKeyForWallet(address)\":{\"notice\":\"Returns the root key for a given wallet\"},\"getWalletsByRootKey(address)\":{\"notice\":\"Returns all wallets linked to a root key\"},\"linkCallerToRootKey((address,bytes),uint256)\":{\"notice\":\"Link caller wallet to a root wallet\"},\"linkWalletToRootKey((address,bytes),(address,bytes),uint256)\":{\"notice\":\"Link a wallet to a root wallet\"},\"removeLink(address,(address,bytes),uint256)\":{\"notice\":\"Called via the rootkey signing a message to a remove a wallet from itself\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/factory/facets/wallet-link/WalletLink.sol\":\"WalletLink\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/@openzeppelin/\",\":@prb/math/=lib/@prb/math/src/\",\":@prb/test/=lib/@prb/test/src/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":base64/=lib/base64/\",\":ds-test/=lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat-deploy/=lib/hardhat-deploy/\"]},\"sources\":{\"contracts/src/diamond/facets/Facet.sol\":{\"keccak256\":\"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7\",\"dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP\"]},\"contracts/src/diamond/facets/initializable/Initializable.sol\":{\"keccak256\":\"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552\",\"dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC\"]},\"contracts/src/diamond/facets/initializable/InitializableStorage.sol\":{\"keccak256\":\"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09\",\"dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep\"]},\"contracts/src/diamond/facets/introspection/IERC165.sol\":{\"keccak256\":\"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361\",\"dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T\"]},\"contracts/src/diamond/facets/introspection/IntrospectionBase.sol\":{\"keccak256\":\"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613\",\"dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq\"]},\"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol\":{\"keccak256\":\"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357\",\"dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj\"]},\"contracts/src/diamond/utils/Nonces.sol\":{\"keccak256\":\"0xce0cce96c8f30e4052523e2c67c7b08ed9defa8c2e3858d4534b359be9ee9ee3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://caae09675d571304907f51e64c255981c5fbfbd60bf26d0117c00ecd7ed7a7fb\",\"dweb:/ipfs/QmPNReTvJDZ242duATLyDDt1JUUd2ACg472E1vftw5zgXB\"]},\"contracts/src/factory/facets/wallet-link/IWalletLink.sol\":{\"keccak256\":\"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13\",\"dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR\"]},\"contracts/src/factory/facets/wallet-link/WalletLink.sol\":{\"keccak256\":\"0x0940bd508eeb3fcd0199c2a939bb7ff871b1b2929881f23cd346961a769fd807\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c8d144ca39586757c4d58a76489b4cef6c8d0ad5dfb5a77686b6e49d8b310c44\",\"dweb:/ipfs/QmQd9TQtCzeXSgn5xvBADXEs7kVB9o7hxo8Nvqz4u5nJTu\"]},\"contracts/src/factory/facets/wallet-link/WalletLinkBase.sol\":{\"keccak256\":\"0xfc27a5f7a57d45076dd4b4af704d6941f82d4ec825b262a0a144a00b3c83a0f0\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a79133d20a0ad20691c88dbfa3832c1f767273eb17aaf3f20ab1f128bb5a7b48\",\"dweb:/ipfs/QmcJbygpvz1tPifobw2SfgNvKRB4w9EZVqsM8kZKMtWf6e\"]},\"contracts/src/factory/facets/wallet-link/WalletLinkStorage.sol\":{\"keccak256\":\"0x2903de293c75c301de25bef504a0bb56b31158a2d5340bdf8103fa8f0c06bad1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3e8bdb8c34b2c3ef8fff3755dce77dea42bc5d605e030cca17791c0b697e64c4\",\"dweb:/ipfs/QmYhS5h3sja3dZaoaQ9jdhwsrNSbJ4oPU5VtCbotvedUXP\"]},\"lib/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453\",\"dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i\"]},\"lib/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c\",\"dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF\"]},\"lib/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\":{\"keccak256\":\"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c\",\"dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX\"]},\"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"lib/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875\",\"dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L\"]},\"lib/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc\",\"dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT\"]},\"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1\",\"dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"ECDSAInvalidSignature"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"ECDSAInvalidSignatureLength"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"type":"error","name":"ECDSAInvalidSignatureS"},{"inputs":[],"type":"error","name":"Initializable_InInitializingState"},{"inputs":[],"type":"error","name":"Initializable_NotInInitializingState"},{"inputs":[],"type":"error","name":"Introspection_AlreadySupported"},{"inputs":[],"type":"error","name":"Introspection_NotSupported"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"currentNonce","type":"uint256"}],"type":"error","name":"InvalidAccountNonce"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"address","name":"rootKey","type":"address"}],"type":"error","name":"WalletLink__CannotLinkToRootWallet"},{"inputs":[],"type":"error","name":"WalletLink__CannotLinkToSelf"},{"inputs":[],"type":"error","name":"WalletLink__CannotRemoveRootWallet"},{"inputs":[],"type":"error","name":"WalletLink__InvalidAddress"},{"inputs":[],"type":"error","name":"WalletLink__InvalidSignature"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"address","name":"rootKey","type":"address"}],"type":"error","name":"WalletLink__LinkAlreadyExists"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"address","name":"rootKey","type":"address"}],"type":"error","name":"WalletLink__LinkedToAnotherRootKey"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"address","name":"rootKey","type":"address"}],"type":"error","name":"WalletLink__NotLinked"},{"inputs":[{"internalType":"uint32","name":"version","type":"uint32","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceAdded","anonymous":false},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4","indexed":true}],"type":"event","name":"InterfaceRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"wallet","type":"address","indexed":true},{"internalType":"address","name":"rootKey","type":"address","indexed":true}],"type":"event","name":"LinkWalletToRootKey","anonymous":false},{"inputs":[{"internalType":"address","name":"wallet","type":"address","indexed":true},{"internalType":"address","name":"secondWallet","type":"address","indexed":true}],"type":"event","name":"RemoveLink","anonymous":false},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"__WalletLink_init"},{"inputs":[{"internalType":"address","name":"rootKey","type":"address"},{"internalType":"address","name":"wallet","type":"address"}],"stateMutability":"view","type":"function","name":"checkIfLinked","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"rootKey","type":"address"}],"stateMutability":"view","type":"function","name":"getLatestNonceForRootKey","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"stateMutability":"view","type":"function","name":"getRootKeyForWallet","outputs":[{"internalType":"address","name":"rootKey","type":"address"}]},{"inputs":[{"internalType":"address","name":"rootKey","type":"address"}],"stateMutability":"view","type":"function","name":"getWalletsByRootKey","outputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}]},{"inputs":[{"internalType":"struct IWalletLinkBase.LinkedWallet","name":"rootWallet","type":"tuple","components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}]},{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"linkCallerToRootKey"},{"inputs":[{"internalType":"struct IWalletLinkBase.LinkedWallet","name":"wallet","type":"tuple","components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}]},{"internalType":"struct IWalletLinkBase.LinkedWallet","name":"rootWallet","type":"tuple","components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}]},{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"linkWalletToRootKey"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"struct IWalletLinkBase.LinkedWallet","name":"rootWallet","type":"tuple","components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}]},{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"removeLink"}],"devdoc":{"kind":"dev","methods":{"checkIfLinked(address,address)":{"params":{"rootKey":"the public key of the users rootkey to check","wallet":"the ethereum wallet to check"},"returns":{"_0":"areLinked boolean if they are linked together"}},"getLatestNonceForRootKey(address)":{"params":{"rootKey":"the public key of the users rootkey to check"}},"getRootKeyForWallet(address)":{"params":{"wallet":"the ethereum wallet to find associated root key for"},"returns":{"rootKey":"the rootkey that this wallet is linked to"}},"getWalletsByRootKey(address)":{"params":{"rootKey":"the public key of the users rootkey to find associated wallets for"},"returns":{"wallets":"an array of ethereum wallets linked to this root key"}},"linkCallerToRootKey((address,bytes),uint256)":{"params":{"nonce":"a nonce used to prevent replay attacks, nonce must always be higher than previous nonce","rootWallet":"the root wallet that the caller is linking to"}},"linkWalletToRootKey((address,bytes),(address,bytes),uint256)":{"params":{"nonce":"a nonce used to prevent replay attacks, nonce must always be higher than previous nonce","rootWallet":"the root wallet that the caller is linking to","wallet":"the wallet being linked to the root wallet"}},"removeLink(address,(address,bytes),uint256)":{"params":{"wallet":"the wallet being unlinked from the sending wallet"}}},"version":1},"userdoc":{"kind":"user","methods":{"checkIfLinked(address,address)":{"notice":"checks if a root key and wallet are linked"},"getLatestNonceForRootKey(address)":{"notice":"gets the latest nonce for a rootkey to use a higher one for next link action"},"getRootKeyForWallet(address)":{"notice":"Returns the root key for a given wallet"},"getWalletsByRootKey(address)":{"notice":"Returns all wallets linked to a root key"},"linkCallerToRootKey((address,bytes),uint256)":{"notice":"Link caller wallet to a root wallet"},"linkWalletToRootKey((address,bytes),(address,bytes),uint256)":{"notice":"Link a wallet to a root wallet"},"removeLink(address,(address,bytes),uint256)":{"notice":"Called via the rootkey signing a message to a remove a wallet from itself"}},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/@openzeppelin/","@prb/math/=lib/@prb/math/src/","@prb/test/=lib/@prb/test/src/","account-abstraction/=lib/account-abstraction/contracts/","base64/=lib/base64/","ds-test/=lib/ds-test/src/","forge-std/=lib/forge-std/src/","hardhat-deploy/=lib/hardhat-deploy/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"contracts/src/factory/facets/wallet-link/WalletLink.sol":"WalletLink"},"evmVersion":"paris","libraries":{}},"sources":{"contracts/src/diamond/facets/Facet.sol":{"keccak256":"0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be","urls":["bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7","dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP"],"license":"Apache-2.0"},"contracts/src/diamond/facets/initializable/Initializable.sol":{"keccak256":"0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90","urls":["bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552","dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC"],"license":"MIT"},"contracts/src/diamond/facets/initializable/InitializableStorage.sol":{"keccak256":"0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01","urls":["bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09","dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IERC165.sol":{"keccak256":"0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00","urls":["bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361","dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionBase.sol":{"keccak256":"0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf","urls":["bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613","dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq"],"license":"Apache-2.0"},"contracts/src/diamond/facets/introspection/IntrospectionStorage.sol":{"keccak256":"0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758","urls":["bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357","dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj"],"license":"Apache-2.0"},"contracts/src/diamond/utils/Nonces.sol":{"keccak256":"0xce0cce96c8f30e4052523e2c67c7b08ed9defa8c2e3858d4534b359be9ee9ee3","urls":["bzz-raw://caae09675d571304907f51e64c255981c5fbfbd60bf26d0117c00ecd7ed7a7fb","dweb:/ipfs/QmPNReTvJDZ242duATLyDDt1JUUd2ACg472E1vftw5zgXB"],"license":"Apache-2.0"},"contracts/src/factory/facets/wallet-link/IWalletLink.sol":{"keccak256":"0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b","urls":["bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13","dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR"],"license":"Apache-2.0"},"contracts/src/factory/facets/wallet-link/WalletLink.sol":{"keccak256":"0x0940bd508eeb3fcd0199c2a939bb7ff871b1b2929881f23cd346961a769fd807","urls":["bzz-raw://c8d144ca39586757c4d58a76489b4cef6c8d0ad5dfb5a77686b6e49d8b310c44","dweb:/ipfs/QmQd9TQtCzeXSgn5xvBADXEs7kVB9o7hxo8Nvqz4u5nJTu"],"license":"Apache-2.0"},"contracts/src/factory/facets/wallet-link/WalletLinkBase.sol":{"keccak256":"0xfc27a5f7a57d45076dd4b4af704d6941f82d4ec825b262a0a144a00b3c83a0f0","urls":["bzz-raw://a79133d20a0ad20691c88dbfa3832c1f767273eb17aaf3f20ab1f128bb5a7b48","dweb:/ipfs/QmcJbygpvz1tPifobw2SfgNvKRB4w9EZVqsM8kZKMtWf6e"],"license":"Apache-2.0"},"contracts/src/factory/facets/wallet-link/WalletLinkStorage.sol":{"keccak256":"0x2903de293c75c301de25bef504a0bb56b31158a2d5340bdf8103fa8f0c06bad1","urls":["bzz-raw://3e8bdb8c34b2c3ef8fff3755dce77dea42bc5d605e030cca17791c0b697e64c4","dweb:/ipfs/QmYhS5h3sja3dZaoaQ9jdhwsrNSbJ4oPU5VtCbotvedUXP"],"license":"Apache-2.0"},"lib/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf","urls":["bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c","dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435","urls":["bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c","dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"],"license":"MIT"},"lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol":{"keccak256":"0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa","urls":["bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1","dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA"],"license":"MIT"}},"version":1},"id":172} \ No newline at end of file diff --git a/packages/generated/v3/abis/WalletLink.metadata.json b/packages/generated/v3/abis/WalletLink.metadata.json new file mode 100644 index 000000000..78f979d53 --- /dev/null +++ b/packages/generated/v3/abis/WalletLink.metadata.json @@ -0,0 +1,691 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "type": "error", + "name": "ECDSAInvalidSignature" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "type": "error", + "name": "ECDSAInvalidSignatureLength" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "type": "error", + "name": "ECDSAInvalidSignatureS" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_InInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Initializable_NotInInitializingState" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_AlreadySupported" + }, + { + "inputs": [], + "type": "error", + "name": "Introspection_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "currentNonce", + "type": "uint256" + } + ], + "type": "error", + "name": "InvalidAccountNonce" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "internalType": "address", + "name": "rootKey", + "type": "address" + } + ], + "type": "error", + "name": "WalletLink__CannotLinkToRootWallet" + }, + { + "inputs": [], + "type": "error", + "name": "WalletLink__CannotLinkToSelf" + }, + { + "inputs": [], + "type": "error", + "name": "WalletLink__CannotRemoveRootWallet" + }, + { + "inputs": [], + "type": "error", + "name": "WalletLink__InvalidAddress" + }, + { + "inputs": [], + "type": "error", + "name": "WalletLink__InvalidSignature" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "internalType": "address", + "name": "rootKey", + "type": "address" + } + ], + "type": "error", + "name": "WalletLink__LinkAlreadyExists" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "internalType": "address", + "name": "rootKey", + "type": "address" + } + ], + "type": "error", + "name": "WalletLink__LinkedToAnotherRootKey" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "internalType": "address", + "name": "rootKey", + "type": "address" + } + ], + "type": "error", + "name": "WalletLink__NotLinked" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "version", + "type": "uint32", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceAdded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4", + "indexed": true + } + ], + "type": "event", + "name": "InterfaceRemoved", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "rootKey", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "LinkWalletToRootKey", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "secondWallet", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "RemoveLink", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "__WalletLink_init" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rootKey", + "type": "address" + }, + { + "internalType": "address", + "name": "wallet", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "checkIfLinked", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rootKey", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getLatestNonceForRootKey", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getRootKeyForWallet", + "outputs": [ + { + "internalType": "address", + "name": "rootKey", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rootKey", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getWalletsByRootKey", + "outputs": [ + { + "internalType": "address[]", + "name": "wallets", + "type": "address[]" + } + ] + }, + { + "inputs": [ + { + "internalType": "struct IWalletLinkBase.LinkedWallet", + "name": "rootWallet", + "type": "tuple", + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ] + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "linkCallerToRootKey" + }, + { + "inputs": [ + { + "internalType": "struct IWalletLinkBase.LinkedWallet", + "name": "wallet", + "type": "tuple", + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ] + }, + { + "internalType": "struct IWalletLinkBase.LinkedWallet", + "name": "rootWallet", + "type": "tuple", + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ] + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "linkWalletToRootKey" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "internalType": "struct IWalletLinkBase.LinkedWallet", + "name": "rootWallet", + "type": "tuple", + "components": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ] + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeLink" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "checkIfLinked(address,address)": { + "params": { + "rootKey": "the public key of the users rootkey to check", + "wallet": "the ethereum wallet to check" + }, + "returns": { + "_0": "areLinked boolean if they are linked together" + } + }, + "getLatestNonceForRootKey(address)": { + "params": { + "rootKey": "the public key of the users rootkey to check" + } + }, + "getRootKeyForWallet(address)": { + "params": { + "wallet": "the ethereum wallet to find associated root key for" + }, + "returns": { + "rootKey": "the rootkey that this wallet is linked to" + } + }, + "getWalletsByRootKey(address)": { + "params": { + "rootKey": "the public key of the users rootkey to find associated wallets for" + }, + "returns": { + "wallets": "an array of ethereum wallets linked to this root key" + } + }, + "linkCallerToRootKey((address,bytes),uint256)": { + "params": { + "nonce": "a nonce used to prevent replay attacks, nonce must always be higher than previous nonce", + "rootWallet": "the root wallet that the caller is linking to" + } + }, + "linkWalletToRootKey((address,bytes),(address,bytes),uint256)": { + "params": { + "nonce": "a nonce used to prevent replay attacks, nonce must always be higher than previous nonce", + "rootWallet": "the root wallet that the caller is linking to", + "wallet": "the wallet being linked to the root wallet" + } + }, + "removeLink(address,(address,bytes),uint256)": { + "params": { + "wallet": "the wallet being unlinked from the sending wallet" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "checkIfLinked(address,address)": { + "notice": "checks if a root key and wallet are linked" + }, + "getLatestNonceForRootKey(address)": { + "notice": "gets the latest nonce for a rootkey to use a higher one for next link action" + }, + "getRootKeyForWallet(address)": { + "notice": "Returns the root key for a given wallet" + }, + "getWalletsByRootKey(address)": { + "notice": "Returns all wallets linked to a root key" + }, + "linkCallerToRootKey((address,bytes),uint256)": { + "notice": "Link caller wallet to a root wallet" + }, + "linkWalletToRootKey((address,bytes),(address,bytes),uint256)": { + "notice": "Link a wallet to a root wallet" + }, + "removeLink(address,(address,bytes),uint256)": { + "notice": "Called via the rootkey signing a message to a remove a wallet from itself" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/=lib/@openzeppelin/", + "@prb/math/=lib/@prb/math/src/", + "@prb/test/=lib/@prb/test/src/", + "account-abstraction/=lib/account-abstraction/contracts/", + "base64/=lib/base64/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat-deploy/=lib/hardhat-deploy/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + }, + "compilationTarget": { + "contracts/src/factory/facets/wallet-link/WalletLink.sol": "WalletLink" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "contracts/src/diamond/facets/Facet.sol": { + "keccak256": "0xecbb7e8de0dae5bdbcbda879436335abac6808bcc2e14f1f4e9efbdc77c4e8be", + "urls": [ + "bzz-raw://b7b5446461a1492f16c86137ce49a699d8a3452e2174c5568b97f8d2d4bc85a7", + "dweb:/ipfs/QmY74odf1qgTwBV3wjF12rV8TXs3DiNoMm9Pg9S8w2F4VP" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/initializable/Initializable.sol": { + "keccak256": "0xe02e99665b5acb22d5c508c3bda97c35acd2597ce0a58569a19cc12f0010da90", + "urls": [ + "bzz-raw://b586a51dbe63e8763ae0b2b3dadd5c8559f47bc8cbaa0e9fe52aaec4c3677552", + "dweb:/ipfs/QmRtaVikg6YDwzUAtY7WV793taZgT1ZxyMB4PLAEqGBeCC" + ], + "license": "MIT" + }, + "contracts/src/diamond/facets/initializable/InitializableStorage.sol": { + "keccak256": "0x5dbbdca0faf75680e1c0d425d92bdb5ce16951c0f8215a668c5144c0ffdb1b01", + "urls": [ + "bzz-raw://05e5ba4fcd6e3e1e819e786fce3473d5ef69763b127fe162b2e0906d6a904d09", + "dweb:/ipfs/QmYPN5xeMoMBVT2B2FwJrDpwocNNsCuVosgg7vdYrrWNep" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IERC165.sol": { + "keccak256": "0x243cfeefa64ba07bee887b0b03704147f9bd2f25571272a6ebca3ba684af1b00", + "urls": [ + "bzz-raw://1aed67ea7251fad9dbfb58a30f59f7edd81d48d7f6b193b98f957be359653361", + "dweb:/ipfs/QmQauJL4nFMN3QDutjWezRbBjLX5GsTWt5jeLfkX4JW64T" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionBase.sol": { + "keccak256": "0x5f458cf292b4b7b9d9c1efd110b3b65905c7bd7e47a48090af5eb9fb7d620ddf", + "urls": [ + "bzz-raw://84995121aafc9124ba3a1148835dcccc1061c25a5b074b4579a83c0dd213d613", + "dweb:/ipfs/QmPYSKEqYWasPxVRzv4TCpXVfpkahfFDEPkTLp7UAT9fKq" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/facets/introspection/IntrospectionStorage.sol": { + "keccak256": "0x2e047e5efa9df7f3d60a8a114da39343635578b7475fcd987860eb5b87e8c758", + "urls": [ + "bzz-raw://a071eda8331b690b689bbbc23e6a6c227324aad90d4101c36410a06b1ca3c357", + "dweb:/ipfs/QmTR76zN1durS5acgDZXixrkrheXvaaMqfwXrJsaGyAPkj" + ], + "license": "Apache-2.0" + }, + "contracts/src/diamond/utils/Nonces.sol": { + "keccak256": "0xce0cce96c8f30e4052523e2c67c7b08ed9defa8c2e3858d4534b359be9ee9ee3", + "urls": [ + "bzz-raw://caae09675d571304907f51e64c255981c5fbfbd60bf26d0117c00ecd7ed7a7fb", + "dweb:/ipfs/QmPNReTvJDZ242duATLyDDt1JUUd2ACg472E1vftw5zgXB" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/wallet-link/IWalletLink.sol": { + "keccak256": "0x548d2531215e1387f83265975af58947d37c01ae9ea75cce91147a2468fc653b", + "urls": [ + "bzz-raw://f2300ddc317d8f0e9f24dee7904de69a87325305d913f541a0dc877bba7e1f13", + "dweb:/ipfs/QmY6kMFdswJnVtkYu415QG5ePjUrS9W1QiXi9VXaLBeRJR" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/wallet-link/WalletLink.sol": { + "keccak256": "0x0940bd508eeb3fcd0199c2a939bb7ff871b1b2929881f23cd346961a769fd807", + "urls": [ + "bzz-raw://c8d144ca39586757c4d58a76489b4cef6c8d0ad5dfb5a77686b6e49d8b310c44", + "dweb:/ipfs/QmQd9TQtCzeXSgn5xvBADXEs7kVB9o7hxo8Nvqz4u5nJTu" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/wallet-link/WalletLinkBase.sol": { + "keccak256": "0xfc27a5f7a57d45076dd4b4af704d6941f82d4ec825b262a0a144a00b3c83a0f0", + "urls": [ + "bzz-raw://a79133d20a0ad20691c88dbfa3832c1f767273eb17aaf3f20ab1f128bb5a7b48", + "dweb:/ipfs/QmcJbygpvz1tPifobw2SfgNvKRB4w9EZVqsM8kZKMtWf6e" + ], + "license": "Apache-2.0" + }, + "contracts/src/factory/facets/wallet-link/WalletLinkStorage.sol": { + "keccak256": "0x2903de293c75c301de25bef504a0bb56b31158a2d5340bdf8103fa8f0c06bad1", + "urls": [ + "bzz-raw://3e8bdb8c34b2c3ef8fff3755dce77dea42bc5d605e030cca17791c0b697e64c4", + "dweb:/ipfs/QmYhS5h3sja3dZaoaQ9jdhwsrNSbJ4oPU5VtCbotvedUXP" + ], + "license": "Apache-2.0" + }, + "lib/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/Strings.sol": { + "keccak256": "0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792", + "urls": [ + "bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453", + "dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "keccak256": "0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf", + "urls": [ + "bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c", + "dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol": { + "keccak256": "0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435", + "urls": [ + "bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c", + "dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/math/Math.sol": { + "keccak256": "0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d", + "urls": [ + "bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875", + "dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/math/SignedMath.sol": { + "keccak256": "0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72", + "urls": [ + "bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc", + "dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT" + ], + "license": "MIT" + }, + "lib/@openzeppelin/contracts/utils/structs/EnumerableSet.sol": { + "keccak256": "0x86c1470cbfd878491e5de030072b647352d36bd27122cffb928970b1945282aa", + "urls": [ + "bzz-raw://ad85dd393ee0a1917c57046abc5155f51f77844b2c6a42c05c1b8dd26d6ff3c1", + "dweb:/ipfs/QmNqYc8To2NdnpP6E1tGz7t6A7beuENde5yovwov5pW1fA" + ], + "license": "MIT" + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/generated/v3/typings/IArchitect.ts b/packages/generated/v3/typings/IArchitect.ts new file mode 100644 index 000000000..9f7a22788 --- /dev/null +++ b/packages/generated/v3/typings/IArchitect.ts @@ -0,0 +1,459 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IMembershipBase { + export type MembershipStruct = { + name: PromiseOrValue; + symbol: PromiseOrValue; + price: PromiseOrValue; + maxSupply: PromiseOrValue; + duration: PromiseOrValue; + currency: PromiseOrValue; + feeRecipient: PromiseOrValue; + freeAllocation: PromiseOrValue; + pricingModule: PromiseOrValue; + }; + + export type MembershipStructOutput = [ + string, + string, + BigNumber, + BigNumber, + BigNumber, + string, + string, + BigNumber, + string + ] & { + name: string; + symbol: string; + price: BigNumber; + maxSupply: BigNumber; + duration: BigNumber; + currency: string; + feeRecipient: string; + freeAllocation: BigNumber; + pricingModule: string; + }; +} + +export declare namespace IRuleEntitlement { + export type OperationStruct = { + opType: PromiseOrValue; + index: PromiseOrValue; + }; + + export type OperationStructOutput = [number, number] & { + opType: number; + index: number; + }; + + export type CheckOperationStruct = { + opType: PromiseOrValue; + chainId: PromiseOrValue; + contractAddress: PromiseOrValue; + threshold: PromiseOrValue; + }; + + export type CheckOperationStructOutput = [ + number, + BigNumber, + string, + BigNumber + ] & { + opType: number; + chainId: BigNumber; + contractAddress: string; + threshold: BigNumber; + }; + + export type LogicalOperationStruct = { + logOpType: PromiseOrValue; + leftOperationIndex: PromiseOrValue; + rightOperationIndex: PromiseOrValue; + }; + + export type LogicalOperationStructOutput = [number, number, number] & { + logOpType: number; + leftOperationIndex: number; + rightOperationIndex: number; + }; + + export type RuleDataStruct = { + operations: IRuleEntitlement.OperationStruct[]; + checkOperations: IRuleEntitlement.CheckOperationStruct[]; + logicalOperations: IRuleEntitlement.LogicalOperationStruct[]; + }; + + export type RuleDataStructOutput = [ + IRuleEntitlement.OperationStructOutput[], + IRuleEntitlement.CheckOperationStructOutput[], + IRuleEntitlement.LogicalOperationStructOutput[] + ] & { + operations: IRuleEntitlement.OperationStructOutput[]; + checkOperations: IRuleEntitlement.CheckOperationStructOutput[]; + logicalOperations: IRuleEntitlement.LogicalOperationStructOutput[]; + }; +} + +export declare namespace IArchitectBase { + export type MembershipRequirementsStruct = { + everyone: PromiseOrValue; + users: PromiseOrValue[]; + ruleData: IRuleEntitlement.RuleDataStruct; + }; + + export type MembershipRequirementsStructOutput = [ + boolean, + string[], + IRuleEntitlement.RuleDataStructOutput + ] & { + everyone: boolean; + users: string[]; + ruleData: IRuleEntitlement.RuleDataStructOutput; + }; + + export type MembershipStruct = { + settings: IMembershipBase.MembershipStruct; + requirements: IArchitectBase.MembershipRequirementsStruct; + permissions: PromiseOrValue[]; + }; + + export type MembershipStructOutput = [ + IMembershipBase.MembershipStructOutput, + IArchitectBase.MembershipRequirementsStructOutput, + string[] + ] & { + settings: IMembershipBase.MembershipStructOutput; + requirements: IArchitectBase.MembershipRequirementsStructOutput; + permissions: string[]; + }; + + export type ChannelInfoStruct = { metadata: PromiseOrValue }; + + export type ChannelInfoStructOutput = [string] & { metadata: string }; + + export type SpaceInfoStruct = { + name: PromiseOrValue; + uri: PromiseOrValue; + membership: IArchitectBase.MembershipStruct; + channel: IArchitectBase.ChannelInfoStruct; + }; + + export type SpaceInfoStructOutput = [ + string, + string, + IArchitectBase.MembershipStructOutput, + IArchitectBase.ChannelInfoStructOutput + ] & { + name: string; + uri: string; + membership: IArchitectBase.MembershipStructOutput; + channel: IArchitectBase.ChannelInfoStructOutput; + }; +} + +export interface IArchitectInterface extends utils.Interface { + functions: { + "createSpace((string,string,((string,string,uint256,uint256,uint64,address,address,uint256,address),(bool,address[],((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[])),string[]),(string)))": FunctionFragment; + "getSpaceArchitectImplementations()": FunctionFragment; + "getSpaceByTokenId(uint256)": FunctionFragment; + "getTokenIdBySpace(address)": FunctionFragment; + "setSpaceArchitectImplementations(address,address,address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "createSpace" + | "getSpaceArchitectImplementations" + | "getSpaceByTokenId" + | "getTokenIdBySpace" + | "setSpaceArchitectImplementations" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "createSpace", + values: [IArchitectBase.SpaceInfoStruct] + ): string; + encodeFunctionData( + functionFragment: "getSpaceArchitectImplementations", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getSpaceByTokenId", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getTokenIdBySpace", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setSpaceArchitectImplementations", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + + decodeFunctionResult( + functionFragment: "createSpace", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getSpaceArchitectImplementations", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getSpaceByTokenId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getTokenIdBySpace", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setSpaceArchitectImplementations", + data: BytesLike + ): Result; + + events: { + "SpaceCreated(address,uint256,address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "SpaceCreated"): EventFragment; +} + +export interface SpaceCreatedEventObject { + owner: string; + tokenId: BigNumber; + space: string; +} +export type SpaceCreatedEvent = TypedEvent< + [string, BigNumber, string], + SpaceCreatedEventObject +>; + +export type SpaceCreatedEventFilter = TypedEventFilter; + +export interface IArchitect extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IArchitectInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + createSpace( + SpaceInfo: IArchitectBase.SpaceInfoStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getSpaceArchitectImplementations( + overrides?: CallOverrides + ): Promise< + [string, string, string] & { + ownerTokenImplementation: string; + userEntitlementImplementation: string; + ruleEntitlementImplementation: string; + } + >; + + getSpaceByTokenId( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string] & { space: string }>; + + getTokenIdBySpace( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + setSpaceArchitectImplementations( + ownerTokenImplementation: PromiseOrValue, + userEntitlementImplementation: PromiseOrValue, + ruleEntitlementImplementation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + createSpace( + SpaceInfo: IArchitectBase.SpaceInfoStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getSpaceArchitectImplementations( + overrides?: CallOverrides + ): Promise< + [string, string, string] & { + ownerTokenImplementation: string; + userEntitlementImplementation: string; + ruleEntitlementImplementation: string; + } + >; + + getSpaceByTokenId( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getTokenIdBySpace( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setSpaceArchitectImplementations( + ownerTokenImplementation: PromiseOrValue, + userEntitlementImplementation: PromiseOrValue, + ruleEntitlementImplementation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + createSpace( + SpaceInfo: IArchitectBase.SpaceInfoStruct, + overrides?: CallOverrides + ): Promise; + + getSpaceArchitectImplementations( + overrides?: CallOverrides + ): Promise< + [string, string, string] & { + ownerTokenImplementation: string; + userEntitlementImplementation: string; + ruleEntitlementImplementation: string; + } + >; + + getSpaceByTokenId( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getTokenIdBySpace( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setSpaceArchitectImplementations( + ownerTokenImplementation: PromiseOrValue, + userEntitlementImplementation: PromiseOrValue, + ruleEntitlementImplementation: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "SpaceCreated(address,uint256,address)"( + owner?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null, + space?: PromiseOrValue | null + ): SpaceCreatedEventFilter; + SpaceCreated( + owner?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null, + space?: PromiseOrValue | null + ): SpaceCreatedEventFilter; + }; + + estimateGas: { + createSpace( + SpaceInfo: IArchitectBase.SpaceInfoStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getSpaceArchitectImplementations( + overrides?: CallOverrides + ): Promise; + + getSpaceByTokenId( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getTokenIdBySpace( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setSpaceArchitectImplementations( + ownerTokenImplementation: PromiseOrValue, + userEntitlementImplementation: PromiseOrValue, + ruleEntitlementImplementation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + createSpace( + SpaceInfo: IArchitectBase.SpaceInfoStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getSpaceArchitectImplementations( + overrides?: CallOverrides + ): Promise; + + getSpaceByTokenId( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getTokenIdBySpace( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setSpaceArchitectImplementations( + ownerTokenImplementation: PromiseOrValue, + userEntitlementImplementation: PromiseOrValue, + ruleEntitlementImplementation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/IBanning.ts b/packages/generated/v3/typings/IBanning.ts new file mode 100644 index 000000000..bb25662f4 --- /dev/null +++ b/packages/generated/v3/typings/IBanning.ts @@ -0,0 +1,227 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface IBanningInterface extends utils.Interface { + functions: { + "ban(uint256)": FunctionFragment; + "banned()": FunctionFragment; + "isBanned(uint256)": FunctionFragment; + "unban(uint256)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: "ban" | "banned" | "isBanned" | "unban" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "ban", + values: [PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "banned", values?: undefined): string; + encodeFunctionData( + functionFragment: "isBanned", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "unban", + values: [PromiseOrValue] + ): string; + + decodeFunctionResult(functionFragment: "ban", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "banned", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "isBanned", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "unban", data: BytesLike): Result; + + events: { + "Banned(address,uint256)": EventFragment; + "Unbanned(address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Banned"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Unbanned"): EventFragment; +} + +export interface BannedEventObject { + moderator: string; + tokenId: BigNumber; +} +export type BannedEvent = TypedEvent<[string, BigNumber], BannedEventObject>; + +export type BannedEventFilter = TypedEventFilter; + +export interface UnbannedEventObject { + moderator: string; + tokenId: BigNumber; +} +export type UnbannedEvent = TypedEvent< + [string, BigNumber], + UnbannedEventObject +>; + +export type UnbannedEventFilter = TypedEventFilter; + +export interface IBanning extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IBanningInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + ban( + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + banned(overrides?: CallOverrides): Promise<[BigNumber[]]>; + + isBanned( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + unban( + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + ban( + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + banned(overrides?: CallOverrides): Promise; + + isBanned( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + unban( + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + ban( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + banned(overrides?: CallOverrides): Promise; + + isBanned( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + unban( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Banned(address,uint256)"( + moderator?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): BannedEventFilter; + Banned( + moderator?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): BannedEventFilter; + + "Unbanned(address,uint256)"( + moderator?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): UnbannedEventFilter; + Unbanned( + moderator?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): UnbannedEventFilter; + }; + + estimateGas: { + ban( + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + banned(overrides?: CallOverrides): Promise; + + isBanned( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + unban( + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + ban( + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + banned(overrides?: CallOverrides): Promise; + + isBanned( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + unban( + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/IChannel.ts b/packages/generated/v3/typings/IChannel.ts new file mode 100644 index 000000000..b95c6848e --- /dev/null +++ b/packages/generated/v3/typings/IChannel.ts @@ -0,0 +1,528 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IChannelBase { + export type ChannelStruct = { + id: PromiseOrValue; + disabled: PromiseOrValue; + metadata: PromiseOrValue; + roleIds: PromiseOrValue[]; + }; + + export type ChannelStructOutput = [string, boolean, string, BigNumber[]] & { + id: string; + disabled: boolean; + metadata: string; + roleIds: BigNumber[]; + }; +} + +export interface IChannelInterface extends utils.Interface { + functions: { + "addRoleToChannel(bytes32,uint256)": FunctionFragment; + "createChannel(bytes32,string,uint256[])": FunctionFragment; + "getChannel(bytes32)": FunctionFragment; + "getChannels()": FunctionFragment; + "getRolesByChannel(bytes32)": FunctionFragment; + "removeChannel(bytes32)": FunctionFragment; + "removeRoleFromChannel(bytes32,uint256)": FunctionFragment; + "updateChannel(bytes32,string,bool)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "addRoleToChannel" + | "createChannel" + | "getChannel" + | "getChannels" + | "getRolesByChannel" + | "removeChannel" + | "removeRoleFromChannel" + | "updateChannel" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "addRoleToChannel", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "createChannel", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue[] + ] + ): string; + encodeFunctionData( + functionFragment: "getChannel", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getChannels", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getRolesByChannel", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "removeChannel", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "removeRoleFromChannel", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "updateChannel", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + + decodeFunctionResult( + functionFragment: "addRoleToChannel", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "createChannel", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getChannel", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getChannels", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRolesByChannel", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removeChannel", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removeRoleFromChannel", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "updateChannel", + data: BytesLike + ): Result; + + events: { + "ChannelCreated(address,bytes32)": EventFragment; + "ChannelRemoved(address,bytes32)": EventFragment; + "ChannelRoleAdded(address,bytes32,uint256)": EventFragment; + "ChannelRoleRemoved(address,bytes32,uint256)": EventFragment; + "ChannelUpdated(address,bytes32)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "ChannelCreated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ChannelRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ChannelRoleAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ChannelRoleRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ChannelUpdated"): EventFragment; +} + +export interface ChannelCreatedEventObject { + caller: string; + channelId: string; +} +export type ChannelCreatedEvent = TypedEvent< + [string, string], + ChannelCreatedEventObject +>; + +export type ChannelCreatedEventFilter = TypedEventFilter; + +export interface ChannelRemovedEventObject { + caller: string; + channelId: string; +} +export type ChannelRemovedEvent = TypedEvent< + [string, string], + ChannelRemovedEventObject +>; + +export type ChannelRemovedEventFilter = TypedEventFilter; + +export interface ChannelRoleAddedEventObject { + caller: string; + channelId: string; + roleId: BigNumber; +} +export type ChannelRoleAddedEvent = TypedEvent< + [string, string, BigNumber], + ChannelRoleAddedEventObject +>; + +export type ChannelRoleAddedEventFilter = + TypedEventFilter; + +export interface ChannelRoleRemovedEventObject { + caller: string; + channelId: string; + roleId: BigNumber; +} +export type ChannelRoleRemovedEvent = TypedEvent< + [string, string, BigNumber], + ChannelRoleRemovedEventObject +>; + +export type ChannelRoleRemovedEventFilter = + TypedEventFilter; + +export interface ChannelUpdatedEventObject { + caller: string; + channelId: string; +} +export type ChannelUpdatedEvent = TypedEvent< + [string, string], + ChannelUpdatedEventObject +>; + +export type ChannelUpdatedEventFilter = TypedEventFilter; + +export interface IChannel extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IChannelInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + addRoleToChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + createChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + roleIds: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise< + [IChannelBase.ChannelStructOutput] & { + channel: IChannelBase.ChannelStructOutput; + } + >; + + getChannels( + overrides?: CallOverrides + ): Promise< + [IChannelBase.ChannelStructOutput[]] & { + channels: IChannelBase.ChannelStructOutput[]; + } + >; + + getRolesByChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber[]] & { roleIds: BigNumber[] }>; + + removeChannel( + channelId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRoleFromChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + disabled: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + addRoleToChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + createChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + roleIds: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getChannels( + overrides?: CallOverrides + ): Promise; + + getRolesByChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeChannel( + channelId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRoleFromChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + disabled: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + addRoleToChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + createChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + roleIds: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + getChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getChannels( + overrides?: CallOverrides + ): Promise; + + getRolesByChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeRoleFromChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + updateChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + disabled: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "ChannelCreated(address,bytes32)"( + caller?: PromiseOrValue | null, + channelId?: null + ): ChannelCreatedEventFilter; + ChannelCreated( + caller?: PromiseOrValue | null, + channelId?: null + ): ChannelCreatedEventFilter; + + "ChannelRemoved(address,bytes32)"( + caller?: PromiseOrValue | null, + channelId?: null + ): ChannelRemovedEventFilter; + ChannelRemoved( + caller?: PromiseOrValue | null, + channelId?: null + ): ChannelRemovedEventFilter; + + "ChannelRoleAdded(address,bytes32,uint256)"( + caller?: PromiseOrValue | null, + channelId?: null, + roleId?: null + ): ChannelRoleAddedEventFilter; + ChannelRoleAdded( + caller?: PromiseOrValue | null, + channelId?: null, + roleId?: null + ): ChannelRoleAddedEventFilter; + + "ChannelRoleRemoved(address,bytes32,uint256)"( + caller?: PromiseOrValue | null, + channelId?: null, + roleId?: null + ): ChannelRoleRemovedEventFilter; + ChannelRoleRemoved( + caller?: PromiseOrValue | null, + channelId?: null, + roleId?: null + ): ChannelRoleRemovedEventFilter; + + "ChannelUpdated(address,bytes32)"( + caller?: PromiseOrValue | null, + channelId?: null + ): ChannelUpdatedEventFilter; + ChannelUpdated( + caller?: PromiseOrValue | null, + channelId?: null + ): ChannelUpdatedEventFilter; + }; + + estimateGas: { + addRoleToChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + createChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + roleIds: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getChannels(overrides?: CallOverrides): Promise; + + getRolesByChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeChannel( + channelId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRoleFromChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + disabled: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + addRoleToChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + createChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + roleIds: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getChannels(overrides?: CallOverrides): Promise; + + getRolesByChannel( + channelId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeChannel( + channelId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRoleFromChannel( + channelId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateChannel( + channelId: PromiseOrValue, + metadata: PromiseOrValue, + disabled: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/ICustomEntitlement.ts b/packages/generated/v3/typings/ICustomEntitlement.ts new file mode 100644 index 000000000..ff001a752 --- /dev/null +++ b/packages/generated/v3/typings/ICustomEntitlement.ts @@ -0,0 +1,100 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { FunctionFragment, Result } from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface ICustomEntitlementInterface extends utils.Interface { + functions: { + "isEntitled(address[])": FunctionFragment; + }; + + getFunction(nameOrSignatureOrTopic: "isEntitled"): FunctionFragment; + + encodeFunctionData( + functionFragment: "isEntitled", + values: [PromiseOrValue[]] + ): string; + + decodeFunctionResult(functionFragment: "isEntitled", data: BytesLike): Result; + + events: {}; +} + +export interface ICustomEntitlement extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: ICustomEntitlementInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + isEntitled( + user: PromiseOrValue[], + overrides?: CallOverrides + ): Promise<[boolean]>; + }; + + isEntitled( + user: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + callStatic: { + isEntitled( + user: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + }; + + filters: {}; + + estimateGas: { + isEntitled( + user: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + }; + + populateTransaction: { + isEntitled( + user: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/IDiamond.ts b/packages/generated/v3/typings/IDiamond.ts new file mode 100644 index 000000000..35bafd983 --- /dev/null +++ b/packages/generated/v3/typings/IDiamond.ts @@ -0,0 +1,56 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { BaseContract, Signer, utils } from "ethers"; + +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface IDiamondInterface extends utils.Interface { + functions: {}; + + events: {}; +} + +export interface IDiamond extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IDiamondInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: {}; + + callStatic: {}; + + filters: {}; + + estimateGas: {}; + + populateTransaction: {}; +} diff --git a/packages/generated/v3/typings/IDiamondCut.ts b/packages/generated/v3/typings/IDiamondCut.ts new file mode 100644 index 000000000..429db2382 --- /dev/null +++ b/packages/generated/v3/typings/IDiamondCut.ts @@ -0,0 +1,162 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IDiamond { + export type FacetCutStruct = { + facetAddress: PromiseOrValue; + action: PromiseOrValue; + functionSelectors: PromiseOrValue[]; + }; + + export type FacetCutStructOutput = [string, number, string[]] & { + facetAddress: string; + action: number; + functionSelectors: string[]; + }; +} + +export interface IDiamondCutInterface extends utils.Interface { + functions: { + "diamondCut((address,uint8,bytes4[])[],address,bytes)": FunctionFragment; + }; + + getFunction(nameOrSignatureOrTopic: "diamondCut"): FunctionFragment; + + encodeFunctionData( + functionFragment: "diamondCut", + values: [ + IDiamond.FacetCutStruct[], + PromiseOrValue, + PromiseOrValue + ] + ): string; + + decodeFunctionResult(functionFragment: "diamondCut", data: BytesLike): Result; + + events: { + "DiamondCut(tuple[],address,bytes)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "DiamondCut"): EventFragment; +} + +export interface DiamondCutEventObject { + facetCuts: IDiamond.FacetCutStructOutput[]; + init: string; + initPayload: string; +} +export type DiamondCutEvent = TypedEvent< + [IDiamond.FacetCutStructOutput[], string, string], + DiamondCutEventObject +>; + +export type DiamondCutEventFilter = TypedEventFilter; + +export interface IDiamondCut extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IDiamondCutInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + diamondCut( + facetCuts: IDiamond.FacetCutStruct[], + init: PromiseOrValue, + initPayload: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + diamondCut( + facetCuts: IDiamond.FacetCutStruct[], + init: PromiseOrValue, + initPayload: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + diamondCut( + facetCuts: IDiamond.FacetCutStruct[], + init: PromiseOrValue, + initPayload: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "DiamondCut(tuple[],address,bytes)"( + facetCuts?: null, + init?: null, + initPayload?: null + ): DiamondCutEventFilter; + DiamondCut( + facetCuts?: null, + init?: null, + initPayload?: null + ): DiamondCutEventFilter; + }; + + estimateGas: { + diamondCut( + facetCuts: IDiamond.FacetCutStruct[], + init: PromiseOrValue, + initPayload: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + diamondCut( + facetCuts: IDiamond.FacetCutStruct[], + init: PromiseOrValue, + initPayload: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/IERC721AQueryable.ts b/packages/generated/v3/typings/IERC721AQueryable.ts new file mode 100644 index 000000000..dceeed525 --- /dev/null +++ b/packages/generated/v3/typings/IERC721AQueryable.ts @@ -0,0 +1,357 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IERC721ABase { + export type TokenOwnershipStruct = { + addr: PromiseOrValue; + startTimestamp: PromiseOrValue; + burned: PromiseOrValue; + extraData: PromiseOrValue; + }; + + export type TokenOwnershipStructOutput = [ + string, + BigNumber, + boolean, + number + ] & { + addr: string; + startTimestamp: BigNumber; + burned: boolean; + extraData: number; + }; +} + +export interface IERC721AQueryableInterface extends utils.Interface { + functions: { + "explicitOwnershipOf(uint256)": FunctionFragment; + "explicitOwnershipsOf(uint256[])": FunctionFragment; + "tokensOfOwner(address)": FunctionFragment; + "tokensOfOwnerIn(address,uint256,uint256)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "explicitOwnershipOf" + | "explicitOwnershipsOf" + | "tokensOfOwner" + | "tokensOfOwnerIn" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "explicitOwnershipOf", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "explicitOwnershipsOf", + values: [PromiseOrValue[]] + ): string; + encodeFunctionData( + functionFragment: "tokensOfOwner", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "tokensOfOwnerIn", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + + decodeFunctionResult( + functionFragment: "explicitOwnershipOf", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "explicitOwnershipsOf", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "tokensOfOwner", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "tokensOfOwnerIn", + data: BytesLike + ): Result; + + events: { + "Approval(address,address,uint256)": EventFragment; + "ApprovalForAll(address,address,bool)": EventFragment; + "ConsecutiveTransfer(uint256,uint256,address,address)": EventFragment; + "Transfer(address,address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ApprovalForAll"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ConsecutiveTransfer"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; +} + +export interface ApprovalEventObject { + owner: string; + approved: string; + tokenId: BigNumber; +} +export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], + ApprovalEventObject +>; + +export type ApprovalEventFilter = TypedEventFilter; + +export interface ApprovalForAllEventObject { + owner: string; + operator: string; + approved: boolean; +} +export type ApprovalForAllEvent = TypedEvent< + [string, string, boolean], + ApprovalForAllEventObject +>; + +export type ApprovalForAllEventFilter = TypedEventFilter; + +export interface ConsecutiveTransferEventObject { + fromTokenId: BigNumber; + toTokenId: BigNumber; + from: string; + to: string; +} +export type ConsecutiveTransferEvent = TypedEvent< + [BigNumber, BigNumber, string, string], + ConsecutiveTransferEventObject +>; + +export type ConsecutiveTransferEventFilter = + TypedEventFilter; + +export interface TransferEventObject { + from: string; + to: string; + tokenId: BigNumber; +} +export type TransferEvent = TypedEvent< + [string, string, BigNumber], + TransferEventObject +>; + +export type TransferEventFilter = TypedEventFilter; + +export interface IERC721AQueryable extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IERC721AQueryableInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + explicitOwnershipOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[IERC721ABase.TokenOwnershipStructOutput]>; + + explicitOwnershipsOf( + tokenIds: PromiseOrValue[], + overrides?: CallOverrides + ): Promise<[IERC721ABase.TokenOwnershipStructOutput[]]>; + + tokensOfOwner( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber[]]>; + + tokensOfOwnerIn( + owner: PromiseOrValue, + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber[]]>; + }; + + explicitOwnershipOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + explicitOwnershipsOf( + tokenIds: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + tokensOfOwner( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + tokensOfOwnerIn( + owner: PromiseOrValue, + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + callStatic: { + explicitOwnershipOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + explicitOwnershipsOf( + tokenIds: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + tokensOfOwner( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + tokensOfOwnerIn( + owner: PromiseOrValue, + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Approval(address,address,uint256)"( + owner?: PromiseOrValue | null, + approved?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): ApprovalEventFilter; + Approval( + owner?: PromiseOrValue | null, + approved?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): ApprovalEventFilter; + + "ApprovalForAll(address,address,bool)"( + owner?: PromiseOrValue | null, + operator?: PromiseOrValue | null, + approved?: null + ): ApprovalForAllEventFilter; + ApprovalForAll( + owner?: PromiseOrValue | null, + operator?: PromiseOrValue | null, + approved?: null + ): ApprovalForAllEventFilter; + + "ConsecutiveTransfer(uint256,uint256,address,address)"( + fromTokenId?: PromiseOrValue | null, + toTokenId?: null, + from?: PromiseOrValue | null, + to?: PromiseOrValue | null + ): ConsecutiveTransferEventFilter; + ConsecutiveTransfer( + fromTokenId?: PromiseOrValue | null, + toTokenId?: null, + from?: PromiseOrValue | null, + to?: PromiseOrValue | null + ): ConsecutiveTransferEventFilter; + + "Transfer(address,address,uint256)"( + from?: PromiseOrValue | null, + to?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): TransferEventFilter; + Transfer( + from?: PromiseOrValue | null, + to?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): TransferEventFilter; + }; + + estimateGas: { + explicitOwnershipOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + explicitOwnershipsOf( + tokenIds: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + tokensOfOwner( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + tokensOfOwnerIn( + owner: PromiseOrValue, + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + populateTransaction: { + explicitOwnershipOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + explicitOwnershipsOf( + tokenIds: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + tokensOfOwner( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + tokensOfOwnerIn( + owner: PromiseOrValue, + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/IEntitlementsManager.ts b/packages/generated/v3/typings/IEntitlementsManager.ts new file mode 100644 index 000000000..e0761627e --- /dev/null +++ b/packages/generated/v3/typings/IEntitlementsManager.ts @@ -0,0 +1,451 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IEntitlementsManagerBase { + export type EntitlementStruct = { + name: PromiseOrValue; + moduleAddress: PromiseOrValue; + moduleType: PromiseOrValue; + isImmutable: PromiseOrValue; + }; + + export type EntitlementStructOutput = [string, string, string, boolean] & { + name: string; + moduleAddress: string; + moduleType: string; + isImmutable: boolean; + }; +} + +export declare namespace IEntitlementsManager { + export type EntitlementDataStruct = { + entitlementType: PromiseOrValue; + entitlementData: PromiseOrValue; + }; + + export type EntitlementDataStructOutput = [string, string] & { + entitlementType: string; + entitlementData: string; + }; +} + +export interface IEntitlementsManagerInterface extends utils.Interface { + functions: { + "addEntitlementModule(address)": FunctionFragment; + "addImmutableEntitlements(address[])": FunctionFragment; + "getEntitlement(address)": FunctionFragment; + "getEntitlementDataByPermission(string)": FunctionFragment; + "getEntitlements()": FunctionFragment; + "isEntitledToChannel(bytes32,address,string)": FunctionFragment; + "isEntitledToSpace(address,string)": FunctionFragment; + "removeEntitlementModule(address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "addEntitlementModule" + | "addImmutableEntitlements" + | "getEntitlement" + | "getEntitlementDataByPermission" + | "getEntitlements" + | "isEntitledToChannel" + | "isEntitledToSpace" + | "removeEntitlementModule" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "addEntitlementModule", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "addImmutableEntitlements", + values: [PromiseOrValue[]] + ): string; + encodeFunctionData( + functionFragment: "getEntitlement", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getEntitlementDataByPermission", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getEntitlements", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "isEntitledToChannel", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "isEntitledToSpace", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "removeEntitlementModule", + values: [PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "addEntitlementModule", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "addImmutableEntitlements", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getEntitlement", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getEntitlementDataByPermission", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getEntitlements", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isEntitledToChannel", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isEntitledToSpace", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removeEntitlementModule", + data: BytesLike + ): Result; + + events: { + "EntitlementModuleAdded(address,address)": EventFragment; + "EntitlementModuleRemoved(address,address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "EntitlementModuleAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "EntitlementModuleRemoved"): EventFragment; +} + +export interface EntitlementModuleAddedEventObject { + caller: string; + entitlement: string; +} +export type EntitlementModuleAddedEvent = TypedEvent< + [string, string], + EntitlementModuleAddedEventObject +>; + +export type EntitlementModuleAddedEventFilter = + TypedEventFilter; + +export interface EntitlementModuleRemovedEventObject { + caller: string; + entitlement: string; +} +export type EntitlementModuleRemovedEvent = TypedEvent< + [string, string], + EntitlementModuleRemovedEventObject +>; + +export type EntitlementModuleRemovedEventFilter = + TypedEventFilter; + +export interface IEntitlementsManager extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IEntitlementsManagerInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + addEntitlementModule( + entitlement: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + addImmutableEntitlements( + entitlements: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getEntitlement( + entitlement: PromiseOrValue, + overrides?: CallOverrides + ): Promise< + [IEntitlementsManagerBase.EntitlementStructOutput] & { + entitlements: IEntitlementsManagerBase.EntitlementStructOutput; + } + >; + + getEntitlementDataByPermission( + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[IEntitlementsManager.EntitlementDataStructOutput[]]>; + + getEntitlements( + overrides?: CallOverrides + ): Promise< + [IEntitlementsManagerBase.EntitlementStructOutput[]] & { + entitlements: IEntitlementsManagerBase.EntitlementStructOutput[]; + } + >; + + isEntitledToChannel( + channelId: PromiseOrValue, + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isEntitledToSpace( + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + removeEntitlementModule( + entitlement: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + addEntitlementModule( + entitlement: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + addImmutableEntitlements( + entitlements: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getEntitlement( + entitlement: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlementDataByPermission( + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlements( + overrides?: CallOverrides + ): Promise; + + isEntitledToChannel( + channelId: PromiseOrValue, + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isEntitledToSpace( + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeEntitlementModule( + entitlement: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + addEntitlementModule( + entitlement: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + addImmutableEntitlements( + entitlements: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + getEntitlement( + entitlement: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlementDataByPermission( + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlements( + overrides?: CallOverrides + ): Promise; + + isEntitledToChannel( + channelId: PromiseOrValue, + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isEntitledToSpace( + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeEntitlementModule( + entitlement: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "EntitlementModuleAdded(address,address)"( + caller?: PromiseOrValue | null, + entitlement?: null + ): EntitlementModuleAddedEventFilter; + EntitlementModuleAdded( + caller?: PromiseOrValue | null, + entitlement?: null + ): EntitlementModuleAddedEventFilter; + + "EntitlementModuleRemoved(address,address)"( + caller?: PromiseOrValue | null, + entitlement?: null + ): EntitlementModuleRemovedEventFilter; + EntitlementModuleRemoved( + caller?: PromiseOrValue | null, + entitlement?: null + ): EntitlementModuleRemovedEventFilter; + }; + + estimateGas: { + addEntitlementModule( + entitlement: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + addImmutableEntitlements( + entitlements: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getEntitlement( + entitlement: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlementDataByPermission( + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlements(overrides?: CallOverrides): Promise; + + isEntitledToChannel( + channelId: PromiseOrValue, + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isEntitledToSpace( + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeEntitlementModule( + entitlement: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + addEntitlementModule( + entitlement: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + addImmutableEntitlements( + entitlements: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getEntitlement( + entitlement: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlementDataByPermission( + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlements(overrides?: CallOverrides): Promise; + + isEntitledToChannel( + channelId: PromiseOrValue, + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isEntitledToSpace( + user: PromiseOrValue, + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeEntitlementModule( + entitlement: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/IMulticall.ts b/packages/generated/v3/typings/IMulticall.ts new file mode 100644 index 000000000..feaf2667e --- /dev/null +++ b/packages/generated/v3/typings/IMulticall.ts @@ -0,0 +1,102 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { FunctionFragment, Result } from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface IMulticallInterface extends utils.Interface { + functions: { + "multicall(bytes[])": FunctionFragment; + }; + + getFunction(nameOrSignatureOrTopic: "multicall"): FunctionFragment; + + encodeFunctionData( + functionFragment: "multicall", + values: [PromiseOrValue[]] + ): string; + + decodeFunctionResult(functionFragment: "multicall", data: BytesLike): Result; + + events: {}; +} + +export interface IMulticall extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IMulticallInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + multicall( + data: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + multicall( + data: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + multicall( + data: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + }; + + filters: {}; + + estimateGas: { + multicall( + data: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + multicall( + data: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/INodeRegistry.ts b/packages/generated/v3/typings/INodeRegistry.ts new file mode 100644 index 000000000..9ccf7c79f --- /dev/null +++ b/packages/generated/v3/typings/INodeRegistry.ts @@ -0,0 +1,435 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export type NodeStruct = { + status: PromiseOrValue; + url: PromiseOrValue; + nodeAddress: PromiseOrValue; + operator: PromiseOrValue; +}; + +export type NodeStructOutput = [number, string, string, string] & { + status: number; + url: string; + nodeAddress: string; + operator: string; +}; + +export interface INodeRegistryInterface extends utils.Interface { + functions: { + "getAllNodeAddresses()": FunctionFragment; + "getAllNodes()": FunctionFragment; + "getNode(address)": FunctionFragment; + "getNodeCount()": FunctionFragment; + "registerNode(address,string,uint8)": FunctionFragment; + "removeNode(address)": FunctionFragment; + "updateNodeStatus(address,uint8)": FunctionFragment; + "updateNodeUrl(address,string)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "getAllNodeAddresses" + | "getAllNodes" + | "getNode" + | "getNodeCount" + | "registerNode" + | "removeNode" + | "updateNodeStatus" + | "updateNodeUrl" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getAllNodeAddresses", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getAllNodes", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getNode", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getNodeCount", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "registerNode", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "removeNode", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "updateNodeStatus", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "updateNodeUrl", + values: [PromiseOrValue, PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "getAllNodeAddresses", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getAllNodes", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getNode", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getNodeCount", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "registerNode", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "removeNode", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "updateNodeStatus", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "updateNodeUrl", + data: BytesLike + ): Result; + + events: { + "NodeAdded(address,string,uint8)": EventFragment; + "NodeRemoved(address)": EventFragment; + "NodeStatusUpdated(address,uint8)": EventFragment; + "NodeUrlUpdated(address,string)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "NodeAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "NodeRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "NodeStatusUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "NodeUrlUpdated"): EventFragment; +} + +export interface NodeAddedEventObject { + nodeAddress: string; + url: string; + status: number; +} +export type NodeAddedEvent = TypedEvent< + [string, string, number], + NodeAddedEventObject +>; + +export type NodeAddedEventFilter = TypedEventFilter; + +export interface NodeRemovedEventObject { + nodeAddress: string; +} +export type NodeRemovedEvent = TypedEvent<[string], NodeRemovedEventObject>; + +export type NodeRemovedEventFilter = TypedEventFilter; + +export interface NodeStatusUpdatedEventObject { + nodeAddress: string; + status: number; +} +export type NodeStatusUpdatedEvent = TypedEvent< + [string, number], + NodeStatusUpdatedEventObject +>; + +export type NodeStatusUpdatedEventFilter = + TypedEventFilter; + +export interface NodeUrlUpdatedEventObject { + nodeAddress: string; + url: string; +} +export type NodeUrlUpdatedEvent = TypedEvent< + [string, string], + NodeUrlUpdatedEventObject +>; + +export type NodeUrlUpdatedEventFilter = TypedEventFilter; + +export interface INodeRegistry extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: INodeRegistryInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + getAllNodeAddresses(overrides?: CallOverrides): Promise<[string[]]>; + + getAllNodes(overrides?: CallOverrides): Promise<[NodeStructOutput[]]>; + + getNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[NodeStructOutput]>; + + getNodeCount(overrides?: CallOverrides): Promise<[BigNumber]>; + + registerNode( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + status: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeNode( + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateNodeStatus( + nodeAddress: PromiseOrValue, + status: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateNodeUrl( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + getAllNodeAddresses(overrides?: CallOverrides): Promise; + + getAllNodes(overrides?: CallOverrides): Promise; + + getNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getNodeCount(overrides?: CallOverrides): Promise; + + registerNode( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + status: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeNode( + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateNodeStatus( + nodeAddress: PromiseOrValue, + status: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateNodeUrl( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + getAllNodeAddresses(overrides?: CallOverrides): Promise; + + getAllNodes(overrides?: CallOverrides): Promise; + + getNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getNodeCount(overrides?: CallOverrides): Promise; + + registerNode( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + status: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + updateNodeStatus( + nodeAddress: PromiseOrValue, + status: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + updateNodeUrl( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "NodeAdded(address,string,uint8)"( + nodeAddress?: PromiseOrValue | null, + url?: null, + status?: null + ): NodeAddedEventFilter; + NodeAdded( + nodeAddress?: PromiseOrValue | null, + url?: null, + status?: null + ): NodeAddedEventFilter; + + "NodeRemoved(address)"( + nodeAddress?: PromiseOrValue | null + ): NodeRemovedEventFilter; + NodeRemoved( + nodeAddress?: PromiseOrValue | null + ): NodeRemovedEventFilter; + + "NodeStatusUpdated(address,uint8)"( + nodeAddress?: PromiseOrValue | null, + status?: null + ): NodeStatusUpdatedEventFilter; + NodeStatusUpdated( + nodeAddress?: PromiseOrValue | null, + status?: null + ): NodeStatusUpdatedEventFilter; + + "NodeUrlUpdated(address,string)"( + nodeAddress?: PromiseOrValue | null, + url?: null + ): NodeUrlUpdatedEventFilter; + NodeUrlUpdated( + nodeAddress?: PromiseOrValue | null, + url?: null + ): NodeUrlUpdatedEventFilter; + }; + + estimateGas: { + getAllNodeAddresses(overrides?: CallOverrides): Promise; + + getAllNodes(overrides?: CallOverrides): Promise; + + getNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getNodeCount(overrides?: CallOverrides): Promise; + + registerNode( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + status: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeNode( + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateNodeStatus( + nodeAddress: PromiseOrValue, + status: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateNodeUrl( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + getAllNodeAddresses( + overrides?: CallOverrides + ): Promise; + + getAllNodes(overrides?: CallOverrides): Promise; + + getNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getNodeCount(overrides?: CallOverrides): Promise; + + registerNode( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + status: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeNode( + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateNodeStatus( + nodeAddress: PromiseOrValue, + status: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateNodeUrl( + nodeAddress: PromiseOrValue, + url: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/IOperatorRegistry.ts b/packages/generated/v3/typings/IOperatorRegistry.ts new file mode 100644 index 000000000..52ecb66e9 --- /dev/null +++ b/packages/generated/v3/typings/IOperatorRegistry.ts @@ -0,0 +1,213 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface IOperatorRegistryInterface extends utils.Interface { + functions: { + "approveOperator(address)": FunctionFragment; + "isOperator(address)": FunctionFragment; + "removeOperator(address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: "approveOperator" | "isOperator" | "removeOperator" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "approveOperator", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "isOperator", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "removeOperator", + values: [PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "approveOperator", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "isOperator", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "removeOperator", + data: BytesLike + ): Result; + + events: { + "OperatorAdded(address)": EventFragment; + "OperatorRemoved(address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "OperatorAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorRemoved"): EventFragment; +} + +export interface OperatorAddedEventObject { + operatorAddress: string; +} +export type OperatorAddedEvent = TypedEvent<[string], OperatorAddedEventObject>; + +export type OperatorAddedEventFilter = TypedEventFilter; + +export interface OperatorRemovedEventObject { + operatorAddress: string; +} +export type OperatorRemovedEvent = TypedEvent< + [string], + OperatorRemovedEventObject +>; + +export type OperatorRemovedEventFilter = TypedEventFilter; + +export interface IOperatorRegistry extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IOperatorRegistryInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + approveOperator( + operator: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isOperator( + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + removeOperator( + operator: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + approveOperator( + operator: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isOperator( + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeOperator( + operator: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + approveOperator( + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isOperator( + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeOperator( + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "OperatorAdded(address)"( + operatorAddress?: PromiseOrValue | null + ): OperatorAddedEventFilter; + OperatorAdded( + operatorAddress?: PromiseOrValue | null + ): OperatorAddedEventFilter; + + "OperatorRemoved(address)"( + operatorAddress?: PromiseOrValue | null + ): OperatorRemovedEventFilter; + OperatorRemoved( + operatorAddress?: PromiseOrValue | null + ): OperatorRemovedEventFilter; + }; + + estimateGas: { + approveOperator( + operator: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isOperator( + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeOperator( + operator: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + approveOperator( + operator: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isOperator( + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeOperator( + operator: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/IPausable.ts b/packages/generated/v3/typings/IPausable.ts new file mode 100644 index 000000000..a63c8c1a4 --- /dev/null +++ b/packages/generated/v3/typings/IPausable.ts @@ -0,0 +1,158 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface IPausableInterface extends utils.Interface { + functions: { + "pause()": FunctionFragment; + "paused()": FunctionFragment; + "unpause()": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: "pause" | "paused" | "unpause" + ): FunctionFragment; + + encodeFunctionData(functionFragment: "pause", values?: undefined): string; + encodeFunctionData(functionFragment: "paused", values?: undefined): string; + encodeFunctionData(functionFragment: "unpause", values?: undefined): string; + + decodeFunctionResult(functionFragment: "pause", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "paused", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "unpause", data: BytesLike): Result; + + events: { + "Paused(address)": EventFragment; + "Unpaused(address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; +} + +export interface PausedEventObject { + account: string; +} +export type PausedEvent = TypedEvent<[string], PausedEventObject>; + +export type PausedEventFilter = TypedEventFilter; + +export interface UnpausedEventObject { + account: string; +} +export type UnpausedEvent = TypedEvent<[string], UnpausedEventObject>; + +export type UnpausedEventFilter = TypedEventFilter; + +export interface IPausable extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IPausableInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + pause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + paused(overrides?: CallOverrides): Promise<[boolean]>; + + unpause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + pause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + paused(overrides?: CallOverrides): Promise; + + unpause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + pause(overrides?: CallOverrides): Promise; + + paused(overrides?: CallOverrides): Promise; + + unpause(overrides?: CallOverrides): Promise; + }; + + filters: { + "Paused(address)"(account?: null): PausedEventFilter; + Paused(account?: null): PausedEventFilter; + + "Unpaused(address)"(account?: null): UnpausedEventFilter; + Unpaused(account?: null): UnpausedEventFilter; + }; + + estimateGas: { + pause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + paused(overrides?: CallOverrides): Promise; + + unpause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + pause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + paused(overrides?: CallOverrides): Promise; + + unpause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/IPricingModules.ts b/packages/generated/v3/typings/IPricingModules.ts new file mode 100644 index 000000000..3a059a2f9 --- /dev/null +++ b/packages/generated/v3/typings/IPricingModules.ts @@ -0,0 +1,286 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IPricingModulesBase { + export type PricingModuleStruct = { + name: PromiseOrValue; + description: PromiseOrValue; + module: PromiseOrValue; + }; + + export type PricingModuleStructOutput = [string, string, string] & { + name: string; + description: string; + module: string; + }; +} + +export interface IPricingModulesInterface extends utils.Interface { + functions: { + "addPricingModule(address)": FunctionFragment; + "isPricingModule(address)": FunctionFragment; + "listPricingModules()": FunctionFragment; + "removePricingModule(address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "addPricingModule" + | "isPricingModule" + | "listPricingModules" + | "removePricingModule" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "addPricingModule", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "isPricingModule", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "listPricingModules", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "removePricingModule", + values: [PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "addPricingModule", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isPricingModule", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "listPricingModules", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removePricingModule", + data: BytesLike + ): Result; + + events: { + "PricingModuleAdded(address)": EventFragment; + "PricingModuleRemoved(address)": EventFragment; + "PricingModuleUpdated(address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "PricingModuleAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "PricingModuleRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "PricingModuleUpdated"): EventFragment; +} + +export interface PricingModuleAddedEventObject { + module: string; +} +export type PricingModuleAddedEvent = TypedEvent< + [string], + PricingModuleAddedEventObject +>; + +export type PricingModuleAddedEventFilter = + TypedEventFilter; + +export interface PricingModuleRemovedEventObject { + module: string; +} +export type PricingModuleRemovedEvent = TypedEvent< + [string], + PricingModuleRemovedEventObject +>; + +export type PricingModuleRemovedEventFilter = + TypedEventFilter; + +export interface PricingModuleUpdatedEventObject { + module: string; +} +export type PricingModuleUpdatedEvent = TypedEvent< + [string], + PricingModuleUpdatedEventObject +>; + +export type PricingModuleUpdatedEventFilter = + TypedEventFilter; + +export interface IPricingModules extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IPricingModulesInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + addPricingModule( + module: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isPricingModule( + module: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + listPricingModules( + overrides?: CallOverrides + ): Promise<[IPricingModulesBase.PricingModuleStructOutput[]]>; + + removePricingModule( + module: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + addPricingModule( + module: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isPricingModule( + module: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + listPricingModules( + overrides?: CallOverrides + ): Promise; + + removePricingModule( + module: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + addPricingModule( + module: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isPricingModule( + module: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + listPricingModules( + overrides?: CallOverrides + ): Promise; + + removePricingModule( + module: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "PricingModuleAdded(address)"( + module?: PromiseOrValue | null + ): PricingModuleAddedEventFilter; + PricingModuleAdded( + module?: PromiseOrValue | null + ): PricingModuleAddedEventFilter; + + "PricingModuleRemoved(address)"( + module?: PromiseOrValue | null + ): PricingModuleRemovedEventFilter; + PricingModuleRemoved( + module?: PromiseOrValue | null + ): PricingModuleRemovedEventFilter; + + "PricingModuleUpdated(address)"( + module?: PromiseOrValue | null + ): PricingModuleUpdatedEventFilter; + PricingModuleUpdated( + module?: PromiseOrValue | null + ): PricingModuleUpdatedEventFilter; + }; + + estimateGas: { + addPricingModule( + module: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isPricingModule( + module: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + listPricingModules(overrides?: CallOverrides): Promise; + + removePricingModule( + module: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + addPricingModule( + module: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isPricingModule( + module: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + listPricingModules( + overrides?: CallOverrides + ): Promise; + + removePricingModule( + module: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/IProxyManager.ts b/packages/generated/v3/typings/IProxyManager.ts new file mode 100644 index 000000000..11dcd6500 --- /dev/null +++ b/packages/generated/v3/typings/IProxyManager.ts @@ -0,0 +1,169 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface IProxyManagerInterface extends utils.Interface { + functions: { + "getImplementation(bytes4)": FunctionFragment; + "setImplementation(address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: "getImplementation" | "setImplementation" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getImplementation", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setImplementation", + values: [PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "getImplementation", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setImplementation", + data: BytesLike + ): Result; + + events: { + "ProxyManager__ImplementationSet(address)": EventFragment; + }; + + getEvent( + nameOrSignatureOrTopic: "ProxyManager__ImplementationSet" + ): EventFragment; +} + +export interface ProxyManager__ImplementationSetEventObject { + implementation: string; +} +export type ProxyManager__ImplementationSetEvent = TypedEvent< + [string], + ProxyManager__ImplementationSetEventObject +>; + +export type ProxyManager__ImplementationSetEventFilter = + TypedEventFilter; + +export interface IProxyManager extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IProxyManagerInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + getImplementation( + selector: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + setImplementation( + implementation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + getImplementation( + selector: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setImplementation( + implementation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + getImplementation( + selector: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setImplementation( + implementation: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "ProxyManager__ImplementationSet(address)"( + implementation?: null + ): ProxyManager__ImplementationSetEventFilter; + ProxyManager__ImplementationSet( + implementation?: null + ): ProxyManager__ImplementationSetEventFilter; + }; + + estimateGas: { + getImplementation( + selector: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setImplementation( + implementation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + getImplementation( + selector: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setImplementation( + implementation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/IRoles.ts b/packages/generated/v3/typings/IRoles.ts new file mode 100644 index 000000000..25699834e --- /dev/null +++ b/packages/generated/v3/typings/IRoles.ts @@ -0,0 +1,560 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IRolesBase { + export type CreateEntitlementStruct = { + module: PromiseOrValue; + data: PromiseOrValue; + }; + + export type CreateEntitlementStructOutput = [string, string] & { + module: string; + data: string; + }; + + export type RoleStruct = { + id: PromiseOrValue; + name: PromiseOrValue; + disabled: PromiseOrValue; + permissions: PromiseOrValue[]; + entitlements: PromiseOrValue[]; + }; + + export type RoleStructOutput = [ + BigNumber, + string, + boolean, + string[], + string[] + ] & { + id: BigNumber; + name: string; + disabled: boolean; + permissions: string[]; + entitlements: string[]; + }; +} + +export interface IRolesInterface extends utils.Interface { + functions: { + "addPermissionsToRole(uint256,string[])": FunctionFragment; + "addRoleToEntitlement(uint256,(address,bytes))": FunctionFragment; + "createRole(string,string[],(address,bytes)[])": FunctionFragment; + "getPermissionsByRoleId(uint256)": FunctionFragment; + "getRoleById(uint256)": FunctionFragment; + "getRoles()": FunctionFragment; + "removePermissionsFromRole(uint256,string[])": FunctionFragment; + "removeRole(uint256)": FunctionFragment; + "removeRoleFromEntitlement(uint256,(address,bytes))": FunctionFragment; + "updateRole(uint256,string,string[],(address,bytes)[])": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "addPermissionsToRole" + | "addRoleToEntitlement" + | "createRole" + | "getPermissionsByRoleId" + | "getRoleById" + | "getRoles" + | "removePermissionsFromRole" + | "removeRole" + | "removeRoleFromEntitlement" + | "updateRole" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "addPermissionsToRole", + values: [PromiseOrValue, PromiseOrValue[]] + ): string; + encodeFunctionData( + functionFragment: "addRoleToEntitlement", + values: [PromiseOrValue, IRolesBase.CreateEntitlementStruct] + ): string; + encodeFunctionData( + functionFragment: "createRole", + values: [ + PromiseOrValue, + PromiseOrValue[], + IRolesBase.CreateEntitlementStruct[] + ] + ): string; + encodeFunctionData( + functionFragment: "getPermissionsByRoleId", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getRoleById", + values: [PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "getRoles", values?: undefined): string; + encodeFunctionData( + functionFragment: "removePermissionsFromRole", + values: [PromiseOrValue, PromiseOrValue[]] + ): string; + encodeFunctionData( + functionFragment: "removeRole", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "removeRoleFromEntitlement", + values: [PromiseOrValue, IRolesBase.CreateEntitlementStruct] + ): string; + encodeFunctionData( + functionFragment: "updateRole", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue[], + IRolesBase.CreateEntitlementStruct[] + ] + ): string; + + decodeFunctionResult( + functionFragment: "addPermissionsToRole", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "addRoleToEntitlement", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "createRole", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getPermissionsByRoleId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRoleById", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getRoles", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "removePermissionsFromRole", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "removeRole", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "removeRoleFromEntitlement", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "updateRole", data: BytesLike): Result; + + events: { + "RoleCreated(address,uint256)": EventFragment; + "RoleRemoved(address,uint256)": EventFragment; + "RoleUpdated(address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "RoleCreated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleUpdated"): EventFragment; +} + +export interface RoleCreatedEventObject { + creator: string; + roleId: BigNumber; +} +export type RoleCreatedEvent = TypedEvent< + [string, BigNumber], + RoleCreatedEventObject +>; + +export type RoleCreatedEventFilter = TypedEventFilter; + +export interface RoleRemovedEventObject { + remover: string; + roleId: BigNumber; +} +export type RoleRemovedEvent = TypedEvent< + [string, BigNumber], + RoleRemovedEventObject +>; + +export type RoleRemovedEventFilter = TypedEventFilter; + +export interface RoleUpdatedEventObject { + updater: string; + roleId: BigNumber; +} +export type RoleUpdatedEvent = TypedEvent< + [string, BigNumber], + RoleUpdatedEventObject +>; + +export type RoleUpdatedEventFilter = TypedEventFilter; + +export interface IRoles extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IRolesInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + addPermissionsToRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + addRoleToEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + createRole( + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getPermissionsByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string[]] & { permissions: string[] }>; + + getRoleById( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise< + [IRolesBase.RoleStructOutput] & { role: IRolesBase.RoleStructOutput } + >; + + getRoles( + overrides?: CallOverrides + ): Promise< + [IRolesBase.RoleStructOutput[]] & { roles: IRolesBase.RoleStructOutput[] } + >; + + removePermissionsFromRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRole( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRoleFromEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateRole( + roleId: PromiseOrValue, + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + addPermissionsToRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + addRoleToEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + createRole( + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getPermissionsByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRoleById( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRoles(overrides?: CallOverrides): Promise; + + removePermissionsFromRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRole( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRoleFromEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateRole( + roleId: PromiseOrValue, + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + addPermissionsToRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + addRoleToEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: CallOverrides + ): Promise; + + createRole( + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: CallOverrides + ): Promise; + + getPermissionsByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRoleById( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRoles(overrides?: CallOverrides): Promise; + + removePermissionsFromRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + removeRole( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeRoleFromEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: CallOverrides + ): Promise; + + updateRole( + roleId: PromiseOrValue, + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "RoleCreated(address,uint256)"( + creator?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleCreatedEventFilter; + RoleCreated( + creator?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleCreatedEventFilter; + + "RoleRemoved(address,uint256)"( + remover?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleRemovedEventFilter; + RoleRemoved( + remover?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleRemovedEventFilter; + + "RoleUpdated(address,uint256)"( + updater?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleUpdatedEventFilter; + RoleUpdated( + updater?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleUpdatedEventFilter; + }; + + estimateGas: { + addPermissionsToRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + addRoleToEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + createRole( + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getPermissionsByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRoleById( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRoles(overrides?: CallOverrides): Promise; + + removePermissionsFromRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRole( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRoleFromEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateRole( + roleId: PromiseOrValue, + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + addPermissionsToRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + addRoleToEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + createRole( + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getPermissionsByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRoleById( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRoles(overrides?: CallOverrides): Promise; + + removePermissionsFromRole( + roleId: PromiseOrValue, + permissions: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRole( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeRoleFromEntitlement( + roleId: PromiseOrValue, + entitlement: IRolesBase.CreateEntitlementStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateRole( + roleId: PromiseOrValue, + roleName: PromiseOrValue, + permissions: PromiseOrValue[], + entitlements: IRolesBase.CreateEntitlementStruct[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/IRuleEntitlement.ts b/packages/generated/v3/typings/IRuleEntitlement.ts new file mode 100644 index 000000000..e6d177883 --- /dev/null +++ b/packages/generated/v3/typings/IRuleEntitlement.ts @@ -0,0 +1,571 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { FunctionFragment, Result } from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IRuleEntitlement { + export type OperationStruct = { + opType: PromiseOrValue; + index: PromiseOrValue; + }; + + export type OperationStructOutput = [number, number] & { + opType: number; + index: number; + }; + + export type CheckOperationStruct = { + opType: PromiseOrValue; + chainId: PromiseOrValue; + contractAddress: PromiseOrValue; + threshold: PromiseOrValue; + }; + + export type CheckOperationStructOutput = [ + number, + BigNumber, + string, + BigNumber + ] & { + opType: number; + chainId: BigNumber; + contractAddress: string; + threshold: BigNumber; + }; + + export type LogicalOperationStruct = { + logOpType: PromiseOrValue; + leftOperationIndex: PromiseOrValue; + rightOperationIndex: PromiseOrValue; + }; + + export type LogicalOperationStructOutput = [number, number, number] & { + logOpType: number; + leftOperationIndex: number; + rightOperationIndex: number; + }; + + export type RuleDataStruct = { + operations: IRuleEntitlement.OperationStruct[]; + checkOperations: IRuleEntitlement.CheckOperationStruct[]; + logicalOperations: IRuleEntitlement.LogicalOperationStruct[]; + }; + + export type RuleDataStructOutput = [ + IRuleEntitlement.OperationStructOutput[], + IRuleEntitlement.CheckOperationStructOutput[], + IRuleEntitlement.LogicalOperationStructOutput[] + ] & { + operations: IRuleEntitlement.OperationStructOutput[]; + checkOperations: IRuleEntitlement.CheckOperationStructOutput[]; + logicalOperations: IRuleEntitlement.LogicalOperationStructOutput[]; + }; +} + +export interface IRuleEntitlementInterface extends utils.Interface { + functions: { + "description()": FunctionFragment; + "encodeRuleData(((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]))": FunctionFragment; + "getCheckOperations(uint256)": FunctionFragment; + "getEntitlementDataByRoleId(uint256)": FunctionFragment; + "getLogicalOperations(uint256)": FunctionFragment; + "getOperations(uint256)": FunctionFragment; + "getRuleData(uint256)": FunctionFragment; + "initialize(address)": FunctionFragment; + "isCrosschain()": FunctionFragment; + "isEntitled(bytes32,address[],bytes32)": FunctionFragment; + "moduleType()": FunctionFragment; + "name()": FunctionFragment; + "removeEntitlement(uint256)": FunctionFragment; + "setEntitlement(uint256,bytes)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "description" + | "encodeRuleData" + | "getCheckOperations" + | "getEntitlementDataByRoleId" + | "getLogicalOperations" + | "getOperations" + | "getRuleData" + | "initialize" + | "isCrosschain" + | "isEntitled" + | "moduleType" + | "name" + | "removeEntitlement" + | "setEntitlement" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "description", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "encodeRuleData", + values: [IRuleEntitlement.RuleDataStruct] + ): string; + encodeFunctionData( + functionFragment: "getCheckOperations", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getEntitlementDataByRoleId", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getLogicalOperations", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getOperations", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getRuleData", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "isCrosschain", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "isEntitled", + values: [ + PromiseOrValue, + PromiseOrValue[], + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "moduleType", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData( + functionFragment: "removeEntitlement", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setEntitlement", + values: [PromiseOrValue, PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "description", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "encodeRuleData", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getCheckOperations", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getEntitlementDataByRoleId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getLogicalOperations", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getOperations", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRuleData", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "isCrosschain", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "isEntitled", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "moduleType", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "removeEntitlement", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setEntitlement", + data: BytesLike + ): Result; + + events: {}; +} + +export interface IRuleEntitlement extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IRuleEntitlementInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + description(overrides?: CallOverrides): Promise<[string]>; + + encodeRuleData( + data: IRuleEntitlement.RuleDataStruct, + overrides?: CallOverrides + ): Promise<[string]>; + + getCheckOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[IRuleEntitlement.CheckOperationStructOutput[]]>; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + getLogicalOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[IRuleEntitlement.LogicalOperationStructOutput[]]>; + + getOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[IRuleEntitlement.OperationStructOutput[]]>; + + getRuleData( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise< + [IRuleEntitlement.RuleDataStructOutput] & { + data: IRuleEntitlement.RuleDataStructOutput; + } + >; + + initialize( + space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise<[boolean]>; + + isEntitled( + channelId: PromiseOrValue, + user: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + moduleType(overrides?: CallOverrides): Promise<[string]>; + + name(overrides?: CallOverrides): Promise<[string]>; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + description(overrides?: CallOverrides): Promise; + + encodeRuleData( + data: IRuleEntitlement.RuleDataStruct, + overrides?: CallOverrides + ): Promise; + + getCheckOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getLogicalOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRuleData( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + initialize( + space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise; + + isEntitled( + channelId: PromiseOrValue, + user: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + moduleType(overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + description(overrides?: CallOverrides): Promise; + + encodeRuleData( + data: IRuleEntitlement.RuleDataStruct, + overrides?: CallOverrides + ): Promise; + + getCheckOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getLogicalOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRuleData( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + initialize( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise; + + isEntitled( + channelId: PromiseOrValue, + user: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + moduleType(overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: {}; + + estimateGas: { + description(overrides?: CallOverrides): Promise; + + encodeRuleData( + data: IRuleEntitlement.RuleDataStruct, + overrides?: CallOverrides + ): Promise; + + getCheckOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getLogicalOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRuleData( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + initialize( + space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise; + + isEntitled( + channelId: PromiseOrValue, + user: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + moduleType(overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + description(overrides?: CallOverrides): Promise; + + encodeRuleData( + data: IRuleEntitlement.RuleDataStruct, + overrides?: CallOverrides + ): Promise; + + getCheckOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getLogicalOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getOperations( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRuleData( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + initialize( + space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise; + + isEntitled( + channelId: PromiseOrValue, + user: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + moduleType(overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/ISpaceOwner.ts b/packages/generated/v3/typings/ISpaceOwner.ts new file mode 100644 index 000000000..718aedf00 --- /dev/null +++ b/packages/generated/v3/typings/ISpaceOwner.ts @@ -0,0 +1,333 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace ISpaceOwnerBase { + export type SpaceStruct = { + name: PromiseOrValue; + uri: PromiseOrValue; + tokenId: PromiseOrValue; + createdAt: PromiseOrValue; + }; + + export type SpaceStructOutput = [string, string, BigNumber, BigNumber] & { + name: string; + uri: string; + tokenId: BigNumber; + createdAt: BigNumber; + }; +} + +export interface ISpaceOwnerInterface extends utils.Interface { + functions: { + "getFactory()": FunctionFragment; + "getSpaceInfo(address)": FunctionFragment; + "mintSpace(string,string,address)": FunctionFragment; + "nextTokenId()": FunctionFragment; + "setFactory(address)": FunctionFragment; + "updateSpaceInfo(address,string,string)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "getFactory" + | "getSpaceInfo" + | "mintSpace" + | "nextTokenId" + | "setFactory" + | "updateSpaceInfo" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getFactory", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getSpaceInfo", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "mintSpace", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "nextTokenId", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "setFactory", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "updateSpaceInfo", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + + decodeFunctionResult(functionFragment: "getFactory", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getSpaceInfo", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "mintSpace", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "nextTokenId", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "setFactory", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "updateSpaceInfo", + data: BytesLike + ): Result; + + events: { + "SpaceOwner__SetFactory(address)": EventFragment; + "SpaceOwner__UpdateSpace(address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "SpaceOwner__SetFactory"): EventFragment; + getEvent(nameOrSignatureOrTopic: "SpaceOwner__UpdateSpace"): EventFragment; +} + +export interface SpaceOwner__SetFactoryEventObject { + factory: string; +} +export type SpaceOwner__SetFactoryEvent = TypedEvent< + [string], + SpaceOwner__SetFactoryEventObject +>; + +export type SpaceOwner__SetFactoryEventFilter = + TypedEventFilter; + +export interface SpaceOwner__UpdateSpaceEventObject { + space: string; +} +export type SpaceOwner__UpdateSpaceEvent = TypedEvent< + [string], + SpaceOwner__UpdateSpaceEventObject +>; + +export type SpaceOwner__UpdateSpaceEventFilter = + TypedEventFilter; + +export interface ISpaceOwner extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: ISpaceOwnerInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + getFactory(overrides?: CallOverrides): Promise<[string]>; + + getSpaceInfo( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[ISpaceOwnerBase.SpaceStructOutput]>; + + mintSpace( + name: PromiseOrValue, + uri: PromiseOrValue, + space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + nextTokenId(overrides?: CallOverrides): Promise<[BigNumber]>; + + setFactory( + factory: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateSpaceInfo( + space: PromiseOrValue, + name: PromiseOrValue, + uri: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + getFactory(overrides?: CallOverrides): Promise; + + getSpaceInfo( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + mintSpace( + name: PromiseOrValue, + uri: PromiseOrValue, + space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + nextTokenId(overrides?: CallOverrides): Promise; + + setFactory( + factory: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateSpaceInfo( + space: PromiseOrValue, + name: PromiseOrValue, + uri: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + getFactory(overrides?: CallOverrides): Promise; + + getSpaceInfo( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + mintSpace( + name: PromiseOrValue, + uri: PromiseOrValue, + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + nextTokenId(overrides?: CallOverrides): Promise; + + setFactory( + factory: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + updateSpaceInfo( + space: PromiseOrValue, + name: PromiseOrValue, + uri: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "SpaceOwner__SetFactory(address)"( + factory?: null + ): SpaceOwner__SetFactoryEventFilter; + SpaceOwner__SetFactory(factory?: null): SpaceOwner__SetFactoryEventFilter; + + "SpaceOwner__UpdateSpace(address)"( + space?: PromiseOrValue | null + ): SpaceOwner__UpdateSpaceEventFilter; + SpaceOwner__UpdateSpace( + space?: PromiseOrValue | null + ): SpaceOwner__UpdateSpaceEventFilter; + }; + + estimateGas: { + getFactory(overrides?: CallOverrides): Promise; + + getSpaceInfo( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + mintSpace( + name: PromiseOrValue, + uri: PromiseOrValue, + space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + nextTokenId(overrides?: CallOverrides): Promise; + + setFactory( + factory: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateSpaceInfo( + space: PromiseOrValue, + name: PromiseOrValue, + uri: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + getFactory(overrides?: CallOverrides): Promise; + + getSpaceInfo( + space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + mintSpace( + name: PromiseOrValue, + uri: PromiseOrValue, + space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + nextTokenId(overrides?: CallOverrides): Promise; + + setFactory( + factory: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + updateSpaceInfo( + space: PromiseOrValue, + name: PromiseOrValue, + uri: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/IStreamRegistry.ts b/packages/generated/v3/typings/IStreamRegistry.ts new file mode 100644 index 000000000..912ce805b --- /dev/null +++ b/packages/generated/v3/typings/IStreamRegistry.ts @@ -0,0 +1,632 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export type StreamStruct = { + lastMiniblockHash: PromiseOrValue; + lastMiniblockNum: PromiseOrValue; + reserved0: PromiseOrValue; + flags: PromiseOrValue; + nodes: PromiseOrValue[]; +}; + +export type StreamStructOutput = [ + string, + BigNumber, + BigNumber, + BigNumber, + string[] +] & { + lastMiniblockHash: string; + lastMiniblockNum: BigNumber; + reserved0: BigNumber; + flags: BigNumber; + nodes: string[]; +}; + +export type StreamWithIdStruct = { + id: PromiseOrValue; + stream: StreamStruct; +}; + +export type StreamWithIdStructOutput = [string, StreamStructOutput] & { + id: string; + stream: StreamStructOutput; +}; + +export interface IStreamRegistryInterface extends utils.Interface { + functions: { + "allocateStream(bytes32,address[],bytes32,bytes)": FunctionFragment; + "getAllStreamIds()": FunctionFragment; + "getAllStreams()": FunctionFragment; + "getPaginatedStreams(uint256,uint256)": FunctionFragment; + "getStream(bytes32)": FunctionFragment; + "getStreamByIndex(uint256)": FunctionFragment; + "getStreamCount()": FunctionFragment; + "getStreamWithGenesis(bytes32)": FunctionFragment; + "getStreamsOnNode(address)": FunctionFragment; + "placeStreamOnNode(bytes32,address)": FunctionFragment; + "removeStreamFromNode(bytes32,address)": FunctionFragment; + "setStreamLastMiniblock(bytes32,bytes32,bytes32,uint64,bool)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "allocateStream" + | "getAllStreamIds" + | "getAllStreams" + | "getPaginatedStreams" + | "getStream" + | "getStreamByIndex" + | "getStreamCount" + | "getStreamWithGenesis" + | "getStreamsOnNode" + | "placeStreamOnNode" + | "removeStreamFromNode" + | "setStreamLastMiniblock" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "allocateStream", + values: [ + PromiseOrValue, + PromiseOrValue[], + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "getAllStreamIds", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getAllStreams", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getPaginatedStreams", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getStream", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getStreamByIndex", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getStreamCount", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getStreamWithGenesis", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getStreamsOnNode", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "placeStreamOnNode", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "removeStreamFromNode", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setStreamLastMiniblock", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + + decodeFunctionResult( + functionFragment: "allocateStream", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getAllStreamIds", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getAllStreams", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getPaginatedStreams", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getStream", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getStreamByIndex", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getStreamCount", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getStreamWithGenesis", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getStreamsOnNode", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "placeStreamOnNode", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removeStreamFromNode", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setStreamLastMiniblock", + data: BytesLike + ): Result; + + events: { + "StreamAllocated(bytes32,address[],bytes32,bytes)": EventFragment; + "StreamLastMiniblockUpdated(bytes32,bytes32,uint64,bool)": EventFragment; + "StreamPlacementUpdated(bytes32,address,bool)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "StreamAllocated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "StreamLastMiniblockUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "StreamPlacementUpdated"): EventFragment; +} + +export interface StreamAllocatedEventObject { + streamId: string; + nodes: string[]; + genesisMiniblockHash: string; + genesisMiniblock: string; +} +export type StreamAllocatedEvent = TypedEvent< + [string, string[], string, string], + StreamAllocatedEventObject +>; + +export type StreamAllocatedEventFilter = TypedEventFilter; + +export interface StreamLastMiniblockUpdatedEventObject { + streamId: string; + lastMiniblockHash: string; + lastMiniblockNum: BigNumber; + isSealed: boolean; +} +export type StreamLastMiniblockUpdatedEvent = TypedEvent< + [string, string, BigNumber, boolean], + StreamLastMiniblockUpdatedEventObject +>; + +export type StreamLastMiniblockUpdatedEventFilter = + TypedEventFilter; + +export interface StreamPlacementUpdatedEventObject { + streamId: string; + nodeAddress: string; + isAdded: boolean; +} +export type StreamPlacementUpdatedEvent = TypedEvent< + [string, string, boolean], + StreamPlacementUpdatedEventObject +>; + +export type StreamPlacementUpdatedEventFilter = + TypedEventFilter; + +export interface IStreamRegistry extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IStreamRegistryInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + allocateStream( + streamId: PromiseOrValue, + nodes: PromiseOrValue[], + genesisMiniblockHash: PromiseOrValue, + genesisMiniblock: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getAllStreamIds(overrides?: CallOverrides): Promise<[string[]]>; + + getAllStreams( + overrides?: CallOverrides + ): Promise<[StreamWithIdStructOutput[]]>; + + getPaginatedStreams( + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[StreamWithIdStructOutput[], boolean]>; + + getStream( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[StreamStructOutput]>; + + getStreamByIndex( + i: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[StreamWithIdStructOutput]>; + + getStreamCount(overrides?: CallOverrides): Promise<[BigNumber]>; + + getStreamWithGenesis( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[StreamStructOutput, string, string]>; + + getStreamsOnNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[StreamWithIdStructOutput[]]>; + + placeStreamOnNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeStreamFromNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setStreamLastMiniblock( + streamId: PromiseOrValue, + prevMiniBlockHash: PromiseOrValue, + lastMiniblockHash: PromiseOrValue, + lastMiniblockNum: PromiseOrValue, + isSealed: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + allocateStream( + streamId: PromiseOrValue, + nodes: PromiseOrValue[], + genesisMiniblockHash: PromiseOrValue, + genesisMiniblock: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getAllStreamIds(overrides?: CallOverrides): Promise; + + getAllStreams(overrides?: CallOverrides): Promise; + + getPaginatedStreams( + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[StreamWithIdStructOutput[], boolean]>; + + getStream( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamByIndex( + i: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamCount(overrides?: CallOverrides): Promise; + + getStreamWithGenesis( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[StreamStructOutput, string, string]>; + + getStreamsOnNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + placeStreamOnNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeStreamFromNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setStreamLastMiniblock( + streamId: PromiseOrValue, + prevMiniBlockHash: PromiseOrValue, + lastMiniblockHash: PromiseOrValue, + lastMiniblockNum: PromiseOrValue, + isSealed: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + allocateStream( + streamId: PromiseOrValue, + nodes: PromiseOrValue[], + genesisMiniblockHash: PromiseOrValue, + genesisMiniblock: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getAllStreamIds(overrides?: CallOverrides): Promise; + + getAllStreams( + overrides?: CallOverrides + ): Promise; + + getPaginatedStreams( + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[StreamWithIdStructOutput[], boolean]>; + + getStream( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamByIndex( + i: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamCount(overrides?: CallOverrides): Promise; + + getStreamWithGenesis( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[StreamStructOutput, string, string]>; + + getStreamsOnNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + placeStreamOnNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeStreamFromNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setStreamLastMiniblock( + streamId: PromiseOrValue, + prevMiniBlockHash: PromiseOrValue, + lastMiniblockHash: PromiseOrValue, + lastMiniblockNum: PromiseOrValue, + isSealed: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "StreamAllocated(bytes32,address[],bytes32,bytes)"( + streamId?: null, + nodes?: null, + genesisMiniblockHash?: null, + genesisMiniblock?: null + ): StreamAllocatedEventFilter; + StreamAllocated( + streamId?: null, + nodes?: null, + genesisMiniblockHash?: null, + genesisMiniblock?: null + ): StreamAllocatedEventFilter; + + "StreamLastMiniblockUpdated(bytes32,bytes32,uint64,bool)"( + streamId?: null, + lastMiniblockHash?: null, + lastMiniblockNum?: null, + isSealed?: null + ): StreamLastMiniblockUpdatedEventFilter; + StreamLastMiniblockUpdated( + streamId?: null, + lastMiniblockHash?: null, + lastMiniblockNum?: null, + isSealed?: null + ): StreamLastMiniblockUpdatedEventFilter; + + "StreamPlacementUpdated(bytes32,address,bool)"( + streamId?: null, + nodeAddress?: null, + isAdded?: null + ): StreamPlacementUpdatedEventFilter; + StreamPlacementUpdated( + streamId?: null, + nodeAddress?: null, + isAdded?: null + ): StreamPlacementUpdatedEventFilter; + }; + + estimateGas: { + allocateStream( + streamId: PromiseOrValue, + nodes: PromiseOrValue[], + genesisMiniblockHash: PromiseOrValue, + genesisMiniblock: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getAllStreamIds(overrides?: CallOverrides): Promise; + + getAllStreams(overrides?: CallOverrides): Promise; + + getPaginatedStreams( + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStream( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamByIndex( + i: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamCount(overrides?: CallOverrides): Promise; + + getStreamWithGenesis( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamsOnNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + placeStreamOnNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeStreamFromNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setStreamLastMiniblock( + streamId: PromiseOrValue, + prevMiniBlockHash: PromiseOrValue, + lastMiniblockHash: PromiseOrValue, + lastMiniblockNum: PromiseOrValue, + isSealed: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + allocateStream( + streamId: PromiseOrValue, + nodes: PromiseOrValue[], + genesisMiniblockHash: PromiseOrValue, + genesisMiniblock: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getAllStreamIds(overrides?: CallOverrides): Promise; + + getAllStreams(overrides?: CallOverrides): Promise; + + getPaginatedStreams( + start: PromiseOrValue, + stop: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStream( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamByIndex( + i: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamCount(overrides?: CallOverrides): Promise; + + getStreamWithGenesis( + streamId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getStreamsOnNode( + nodeAddress: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + placeStreamOnNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeStreamFromNode( + streamId: PromiseOrValue, + nodeAddress: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setStreamLastMiniblock( + streamId: PromiseOrValue, + prevMiniBlockHash: PromiseOrValue, + lastMiniblockHash: PromiseOrValue, + lastMiniblockNum: PromiseOrValue, + isSealed: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/IWalletLink.ts b/packages/generated/v3/typings/IWalletLink.ts new file mode 100644 index 000000000..4662254ea --- /dev/null +++ b/packages/generated/v3/typings/IWalletLink.ts @@ -0,0 +1,417 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IWalletLinkBase { + export type LinkedWalletStruct = { + addr: PromiseOrValue; + signature: PromiseOrValue; + }; + + export type LinkedWalletStructOutput = [string, string] & { + addr: string; + signature: string; + }; +} + +export interface IWalletLinkInterface extends utils.Interface { + functions: { + "checkIfLinked(address,address)": FunctionFragment; + "getLatestNonceForRootKey(address)": FunctionFragment; + "getRootKeyForWallet(address)": FunctionFragment; + "getWalletsByRootKey(address)": FunctionFragment; + "linkCallerToRootKey((address,bytes),uint256)": FunctionFragment; + "linkWalletToRootKey((address,bytes),(address,bytes),uint256)": FunctionFragment; + "removeLink(address,(address,bytes),uint256)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "checkIfLinked" + | "getLatestNonceForRootKey" + | "getRootKeyForWallet" + | "getWalletsByRootKey" + | "linkCallerToRootKey" + | "linkWalletToRootKey" + | "removeLink" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "checkIfLinked", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getLatestNonceForRootKey", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getRootKeyForWallet", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getWalletsByRootKey", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "linkCallerToRootKey", + values: [IWalletLinkBase.LinkedWalletStruct, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "linkWalletToRootKey", + values: [ + IWalletLinkBase.LinkedWalletStruct, + IWalletLinkBase.LinkedWalletStruct, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "removeLink", + values: [ + PromiseOrValue, + IWalletLinkBase.LinkedWalletStruct, + PromiseOrValue + ] + ): string; + + decodeFunctionResult( + functionFragment: "checkIfLinked", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getLatestNonceForRootKey", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRootKeyForWallet", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getWalletsByRootKey", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "linkCallerToRootKey", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "linkWalletToRootKey", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "removeLink", data: BytesLike): Result; + + events: { + "LinkWalletToRootKey(address,address)": EventFragment; + "RemoveLink(address,address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "LinkWalletToRootKey"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RemoveLink"): EventFragment; +} + +export interface LinkWalletToRootKeyEventObject { + wallet: string; + rootKey: string; +} +export type LinkWalletToRootKeyEvent = TypedEvent< + [string, string], + LinkWalletToRootKeyEventObject +>; + +export type LinkWalletToRootKeyEventFilter = + TypedEventFilter; + +export interface RemoveLinkEventObject { + wallet: string; + secondWallet: string; +} +export type RemoveLinkEvent = TypedEvent< + [string, string], + RemoveLinkEventObject +>; + +export type RemoveLinkEventFilter = TypedEventFilter; + +export interface IWalletLink extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: IWalletLinkInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + checkIfLinked( + rootKey: PromiseOrValue, + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + getLatestNonceForRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getRootKeyForWallet( + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string] & { rootKey: string }>; + + getWalletsByRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string[]] & { wallets: string[] }>; + + linkCallerToRootKey( + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + linkWalletToRootKey( + wallet: IWalletLinkBase.LinkedWalletStruct, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeLink( + wallet: PromiseOrValue, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + checkIfLinked( + rootKey: PromiseOrValue, + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getLatestNonceForRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRootKeyForWallet( + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getWalletsByRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + linkCallerToRootKey( + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + linkWalletToRootKey( + wallet: IWalletLinkBase.LinkedWalletStruct, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeLink( + wallet: PromiseOrValue, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + checkIfLinked( + rootKey: PromiseOrValue, + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getLatestNonceForRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRootKeyForWallet( + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getWalletsByRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + linkCallerToRootKey( + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + linkWalletToRootKey( + wallet: IWalletLinkBase.LinkedWalletStruct, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + removeLink( + wallet: PromiseOrValue, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "LinkWalletToRootKey(address,address)"( + wallet?: PromiseOrValue | null, + rootKey?: PromiseOrValue | null + ): LinkWalletToRootKeyEventFilter; + LinkWalletToRootKey( + wallet?: PromiseOrValue | null, + rootKey?: PromiseOrValue | null + ): LinkWalletToRootKeyEventFilter; + + "RemoveLink(address,address)"( + wallet?: PromiseOrValue | null, + secondWallet?: PromiseOrValue | null + ): RemoveLinkEventFilter; + RemoveLink( + wallet?: PromiseOrValue | null, + secondWallet?: PromiseOrValue | null + ): RemoveLinkEventFilter; + }; + + estimateGas: { + checkIfLinked( + rootKey: PromiseOrValue, + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getLatestNonceForRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRootKeyForWallet( + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getWalletsByRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + linkCallerToRootKey( + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + linkWalletToRootKey( + wallet: IWalletLinkBase.LinkedWalletStruct, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeLink( + wallet: PromiseOrValue, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + checkIfLinked( + rootKey: PromiseOrValue, + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getLatestNonceForRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRootKeyForWallet( + wallet: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getWalletsByRootKey( + rootKey: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + linkCallerToRootKey( + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + linkWalletToRootKey( + wallet: IWalletLinkBase.LinkedWalletStruct, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + removeLink( + wallet: PromiseOrValue, + rootWallet: IWalletLinkBase.LinkedWalletStruct, + nonce: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/Member.ts b/packages/generated/v3/typings/Member.ts new file mode 100644 index 000000000..bb261af70 --- /dev/null +++ b/packages/generated/v3/typings/Member.ts @@ -0,0 +1,1081 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PayableOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface MemberInterface extends utils.Interface { + functions: { + "MINT_PRICE()": FunctionFragment; + "TOTAL_SUPPLY()": FunctionFragment; + "_hasMinted(address)": FunctionFragment; + "approve(address,uint256)": FunctionFragment; + "balanceOf(address)": FunctionFragment; + "baseURI()": FunctionFragment; + "currentTokenId()": FunctionFragment; + "getApproved(uint256)": FunctionFragment; + "isApprovedForAll(address,address)": FunctionFragment; + "name()": FunctionFragment; + "owner()": FunctionFragment; + "ownerOf(uint256)": FunctionFragment; + "privateMint(address,uint256,bytes32[])": FunctionFragment; + "publicMint(address)": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "safeTransferFrom(address,address,uint256)": FunctionFragment; + "safeTransferFrom(address,address,uint256,bytes)": FunctionFragment; + "setApprovalForAll(address,bool)": FunctionFragment; + "setBaseURI(string)": FunctionFragment; + "startPublicMint()": FunctionFragment; + "startWaitlistMint()": FunctionFragment; + "supportsInterface(bytes4)": FunctionFragment; + "symbol()": FunctionFragment; + "tokenURI(uint256)": FunctionFragment; + "transferFrom(address,address,uint256)": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + "withdrawPayments(address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "MINT_PRICE" + | "TOTAL_SUPPLY" + | "_hasMinted" + | "approve" + | "balanceOf" + | "baseURI" + | "currentTokenId" + | "getApproved" + | "isApprovedForAll" + | "name" + | "owner" + | "ownerOf" + | "privateMint" + | "publicMint" + | "renounceOwnership" + | "safeTransferFrom(address,address,uint256)" + | "safeTransferFrom(address,address,uint256,bytes)" + | "setApprovalForAll" + | "setBaseURI" + | "startPublicMint" + | "startWaitlistMint" + | "supportsInterface" + | "symbol" + | "tokenURI" + | "transferFrom" + | "transferOwnership" + | "withdrawPayments" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "MINT_PRICE", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "TOTAL_SUPPLY", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_hasMinted", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "approve", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "balanceOf", + values: [PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "baseURI", values?: undefined): string; + encodeFunctionData( + functionFragment: "currentTokenId", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getApproved", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "isApprovedForAll", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "ownerOf", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "privateMint", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue[] + ] + ): string; + encodeFunctionData( + functionFragment: "publicMint", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "safeTransferFrom(address,address,uint256)", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "safeTransferFrom(address,address,uint256,bytes)", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "setApprovalForAll", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setBaseURI", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "startPublicMint", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "startWaitlistMint", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "supportsInterface", + values: [PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "symbol", values?: undefined): string; + encodeFunctionData( + functionFragment: "tokenURI", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "transferFrom", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "withdrawPayments", + values: [PromiseOrValue] + ): string; + + decodeFunctionResult(functionFragment: "MINT_PRICE", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "TOTAL_SUPPLY", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "_hasMinted", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "baseURI", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "currentTokenId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getApproved", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isApprovedForAll", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "ownerOf", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "privateMint", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "publicMint", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "safeTransferFrom(address,address,uint256)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "safeTransferFrom(address,address,uint256,bytes)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setApprovalForAll", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "setBaseURI", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "startPublicMint", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "startWaitlistMint", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "supportsInterface", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "tokenURI", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "transferFrom", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "withdrawPayments", + data: BytesLike + ): Result; + + events: { + "Approval(address,address,uint256)": EventFragment; + "ApprovalForAll(address,address,bool)": EventFragment; + "MintStateChanged(address,uint8,uint8,uint256)": EventFragment; + "Minted(address,uint256,uint256)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "Transfer(address,address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ApprovalForAll"): EventFragment; + getEvent(nameOrSignatureOrTopic: "MintStateChanged"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Minted"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; +} + +export interface ApprovalEventObject { + owner: string; + approved: string; + tokenId: BigNumber; +} +export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], + ApprovalEventObject +>; + +export type ApprovalEventFilter = TypedEventFilter; + +export interface ApprovalForAllEventObject { + owner: string; + operator: string; + approved: boolean; +} +export type ApprovalForAllEvent = TypedEvent< + [string, string, boolean], + ApprovalForAllEventObject +>; + +export type ApprovalForAllEventFilter = TypedEventFilter; + +export interface MintStateChangedEventObject { + caller: string; + prevState: number; + newState: number; + timestamp: BigNumber; +} +export type MintStateChangedEvent = TypedEvent< + [string, number, number, BigNumber], + MintStateChangedEventObject +>; + +export type MintStateChangedEventFilter = + TypedEventFilter; + +export interface MintedEventObject { + recipient: string; + tokenId: BigNumber; + timestamp: BigNumber; +} +export type MintedEvent = TypedEvent< + [string, BigNumber, BigNumber], + MintedEventObject +>; + +export type MintedEventFilter = TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface TransferEventObject { + from: string; + to: string; + tokenId: BigNumber; +} +export type TransferEvent = TypedEvent< + [string, string, BigNumber], + TransferEventObject +>; + +export type TransferEventFilter = TypedEventFilter; + +export interface Member extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: MemberInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + MINT_PRICE(overrides?: CallOverrides): Promise<[BigNumber]>; + + TOTAL_SUPPLY(overrides?: CallOverrides): Promise<[BigNumber]>; + + _hasMinted( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + baseURI(overrides?: CallOverrides): Promise<[string]>; + + currentTokenId(overrides?: CallOverrides): Promise<[BigNumber]>; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + name(overrides?: CallOverrides): Promise<[string]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + privateMint( + recipient: PromiseOrValue, + allowance: PromiseOrValue, + proof: PromiseOrValue[], + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + publicMint( + recipient: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + data: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setBaseURI( + baseURI_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + startPublicMint( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + startWaitlistMint( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + symbol(overrides?: CallOverrides): Promise<[string]>; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + withdrawPayments( + payee: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + MINT_PRICE(overrides?: CallOverrides): Promise; + + TOTAL_SUPPLY(overrides?: CallOverrides): Promise; + + _hasMinted( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + baseURI(overrides?: CallOverrides): Promise; + + currentTokenId(overrides?: CallOverrides): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + name(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + privateMint( + recipient: PromiseOrValue, + allowance: PromiseOrValue, + proof: PromiseOrValue[], + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + publicMint( + recipient: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + data: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setBaseURI( + baseURI_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + startPublicMint( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + startWaitlistMint( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + withdrawPayments( + payee: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + MINT_PRICE(overrides?: CallOverrides): Promise; + + TOTAL_SUPPLY(overrides?: CallOverrides): Promise; + + _hasMinted( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + baseURI(overrides?: CallOverrides): Promise; + + currentTokenId(overrides?: CallOverrides): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + name(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + privateMint( + recipient: PromiseOrValue, + allowance: PromiseOrValue, + proof: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + + publicMint( + recipient: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setBaseURI( + baseURI_: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + startPublicMint(overrides?: CallOverrides): Promise; + + startWaitlistMint(overrides?: CallOverrides): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + withdrawPayments( + payee: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Approval(address,address,uint256)"( + owner?: PromiseOrValue | null, + approved?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): ApprovalEventFilter; + Approval( + owner?: PromiseOrValue | null, + approved?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): ApprovalEventFilter; + + "ApprovalForAll(address,address,bool)"( + owner?: PromiseOrValue | null, + operator?: PromiseOrValue | null, + approved?: null + ): ApprovalForAllEventFilter; + ApprovalForAll( + owner?: PromiseOrValue | null, + operator?: PromiseOrValue | null, + approved?: null + ): ApprovalForAllEventFilter; + + "MintStateChanged(address,uint8,uint8,uint256)"( + caller?: PromiseOrValue | null, + prevState?: PromiseOrValue | null, + newState?: PromiseOrValue | null, + timestamp?: null + ): MintStateChangedEventFilter; + MintStateChanged( + caller?: PromiseOrValue | null, + prevState?: PromiseOrValue | null, + newState?: PromiseOrValue | null, + timestamp?: null + ): MintStateChangedEventFilter; + + "Minted(address,uint256,uint256)"( + recipient?: PromiseOrValue | null, + tokenId?: null, + timestamp?: null + ): MintedEventFilter; + Minted( + recipient?: PromiseOrValue | null, + tokenId?: null, + timestamp?: null + ): MintedEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: PromiseOrValue | null, + newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: PromiseOrValue | null, + newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + + "Transfer(address,address,uint256)"( + from?: PromiseOrValue | null, + to?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): TransferEventFilter; + Transfer( + from?: PromiseOrValue | null, + to?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): TransferEventFilter; + }; + + estimateGas: { + MINT_PRICE(overrides?: CallOverrides): Promise; + + TOTAL_SUPPLY(overrides?: CallOverrides): Promise; + + _hasMinted( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + baseURI(overrides?: CallOverrides): Promise; + + currentTokenId(overrides?: CallOverrides): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + name(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + privateMint( + recipient: PromiseOrValue, + allowance: PromiseOrValue, + proof: PromiseOrValue[], + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + publicMint( + recipient: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + data: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setBaseURI( + baseURI_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + startPublicMint( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + startWaitlistMint( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + withdrawPayments( + payee: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + MINT_PRICE(overrides?: CallOverrides): Promise; + + TOTAL_SUPPLY(overrides?: CallOverrides): Promise; + + _hasMinted( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + baseURI(overrides?: CallOverrides): Promise; + + currentTokenId(overrides?: CallOverrides): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + name(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + privateMint( + recipient: PromiseOrValue, + allowance: PromiseOrValue, + proof: PromiseOrValue[], + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + publicMint( + recipient: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + data: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setBaseURI( + baseURI_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + startPublicMint( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + startWaitlistMint( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + withdrawPayments( + payee: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/MembershipFacet.ts b/packages/generated/v3/typings/MembershipFacet.ts new file mode 100644 index 000000000..87e8e3950 --- /dev/null +++ b/packages/generated/v3/typings/MembershipFacet.ts @@ -0,0 +1,2270 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PayableOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IMembershipBase { + export type MembershipStruct = { + name: PromiseOrValue; + symbol: PromiseOrValue; + price: PromiseOrValue; + maxSupply: PromiseOrValue; + duration: PromiseOrValue; + currency: PromiseOrValue; + feeRecipient: PromiseOrValue; + freeAllocation: PromiseOrValue; + pricingModule: PromiseOrValue; + }; + + export type MembershipStructOutput = [ + string, + string, + BigNumber, + BigNumber, + BigNumber, + string, + string, + BigNumber, + string + ] & { + name: string; + symbol: string; + price: BigNumber; + maxSupply: BigNumber; + duration: BigNumber; + currency: string; + feeRecipient: string; + freeAllocation: BigNumber; + pricingModule: string; + }; +} + +export declare namespace IRuleEntitlement { + export type OperationStruct = { + opType: PromiseOrValue; + index: PromiseOrValue; + }; + + export type OperationStructOutput = [number, number] & { + opType: number; + index: number; + }; + + export type CheckOperationStruct = { + opType: PromiseOrValue; + chainId: PromiseOrValue; + contractAddress: PromiseOrValue; + threshold: PromiseOrValue; + }; + + export type CheckOperationStructOutput = [ + number, + BigNumber, + string, + BigNumber + ] & { + opType: number; + chainId: BigNumber; + contractAddress: string; + threshold: BigNumber; + }; + + export type LogicalOperationStruct = { + logOpType: PromiseOrValue; + leftOperationIndex: PromiseOrValue; + rightOperationIndex: PromiseOrValue; + }; + + export type LogicalOperationStructOutput = [number, number, number] & { + logOpType: number; + leftOperationIndex: number; + rightOperationIndex: number; + }; + + export type RuleDataStruct = { + operations: IRuleEntitlement.OperationStruct[]; + checkOperations: IRuleEntitlement.CheckOperationStruct[]; + logicalOperations: IRuleEntitlement.LogicalOperationStruct[]; + }; + + export type RuleDataStructOutput = [ + IRuleEntitlement.OperationStructOutput[], + IRuleEntitlement.CheckOperationStructOutput[], + IRuleEntitlement.LogicalOperationStructOutput[] + ] & { + operations: IRuleEntitlement.OperationStructOutput[]; + checkOperations: IRuleEntitlement.CheckOperationStructOutput[]; + logicalOperations: IRuleEntitlement.LogicalOperationStructOutput[]; + }; +} + +export interface MembershipFacetInterface extends utils.Interface { + functions: { + "__ERC721A_init(string,string)": FunctionFragment; + "__EntitlementGated_init(address)": FunctionFragment; + "__Membership_init((string,string,uint256,uint256,uint64,address,address,uint256,address),address)": FunctionFragment; + "_getMembershipCurrency()": FunctionFragment; + "_getMembershipFreeAllocation()": FunctionFragment; + "_getMembershipImage()": FunctionFragment; + "_getMembershipPrice(uint256)": FunctionFragment; + "_getMembershipSupplyLimit()": FunctionFragment; + "_getPricingModule()": FunctionFragment; + "_getSpaceFactory()": FunctionFragment; + "_setMembershipFreeAllocation(uint256)": FunctionFragment; + "_setMembershipSupplyLimit(uint256)": FunctionFragment; + "_setPricingModule(address)": FunctionFragment; + "approve(address,uint256)": FunctionFragment; + "balanceOf(address)": FunctionFragment; + "expiresAt(uint256)": FunctionFragment; + "getApproved(uint256)": FunctionFragment; + "getMembershipCurrency()": FunctionFragment; + "getMembershipDuration()": FunctionFragment; + "getMembershipFreeAllocation()": FunctionFragment; + "getMembershipImage()": FunctionFragment; + "getMembershipLimit()": FunctionFragment; + "getMembershipPrice()": FunctionFragment; + "getMembershipPricingModule()": FunctionFragment; + "getMembershipRenewalPrice(uint256)": FunctionFragment; + "getRuleData(bytes32,uint256)": FunctionFragment; + "getSpaceFactory()": FunctionFragment; + "isApprovedForAll(address,address)": FunctionFragment; + "joinSpace(address)": FunctionFragment; + "joinSpaceWithReferral(address,address,uint256)": FunctionFragment; + "name()": FunctionFragment; + "ownerOf(uint256)": FunctionFragment; + "postEntitlementCheckResult(bytes32,uint256,uint8)": FunctionFragment; + "renewMembership(uint256)": FunctionFragment; + "safeTransferFrom(address,address,uint256)": FunctionFragment; + "safeTransferFrom(address,address,uint256,bytes)": FunctionFragment; + "setApprovalForAll(address,bool)": FunctionFragment; + "setMembershipFreeAllocation(uint256)": FunctionFragment; + "setMembershipImage(string)": FunctionFragment; + "setMembershipLimit(uint256)": FunctionFragment; + "setMembershipPrice(uint256)": FunctionFragment; + "setMembershipPricingModule(address)": FunctionFragment; + "symbol()": FunctionFragment; + "tokenURI(uint256)": FunctionFragment; + "totalSupply()": FunctionFragment; + "transferFrom(address,address,uint256)": FunctionFragment; + "withdraw(address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "__ERC721A_init" + | "__EntitlementGated_init" + | "__Membership_init" + | "_getMembershipCurrency" + | "_getMembershipFreeAllocation" + | "_getMembershipImage" + | "_getMembershipPrice" + | "_getMembershipSupplyLimit" + | "_getPricingModule" + | "_getSpaceFactory" + | "_setMembershipFreeAllocation" + | "_setMembershipSupplyLimit" + | "_setPricingModule" + | "approve" + | "balanceOf" + | "expiresAt" + | "getApproved" + | "getMembershipCurrency" + | "getMembershipDuration" + | "getMembershipFreeAllocation" + | "getMembershipImage" + | "getMembershipLimit" + | "getMembershipPrice" + | "getMembershipPricingModule" + | "getMembershipRenewalPrice" + | "getRuleData" + | "getSpaceFactory" + | "isApprovedForAll" + | "joinSpace" + | "joinSpaceWithReferral" + | "name" + | "ownerOf" + | "postEntitlementCheckResult" + | "renewMembership" + | "safeTransferFrom(address,address,uint256)" + | "safeTransferFrom(address,address,uint256,bytes)" + | "setApprovalForAll" + | "setMembershipFreeAllocation" + | "setMembershipImage" + | "setMembershipLimit" + | "setMembershipPrice" + | "setMembershipPricingModule" + | "symbol" + | "tokenURI" + | "totalSupply" + | "transferFrom" + | "withdraw" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "__ERC721A_init", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "__EntitlementGated_init", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "__Membership_init", + values: [IMembershipBase.MembershipStruct, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "_getMembershipCurrency", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_getMembershipFreeAllocation", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_getMembershipImage", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_getMembershipPrice", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "_getMembershipSupplyLimit", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_getPricingModule", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_getSpaceFactory", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_setMembershipFreeAllocation", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "_setMembershipSupplyLimit", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "_setPricingModule", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "approve", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "balanceOf", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "expiresAt", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getApproved", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getMembershipCurrency", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getMembershipDuration", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getMembershipFreeAllocation", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getMembershipImage", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getMembershipLimit", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getMembershipPrice", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getMembershipPricingModule", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getMembershipRenewalPrice", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getRuleData", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getSpaceFactory", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "isApprovedForAll", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "joinSpace", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "joinSpaceWithReferral", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData( + functionFragment: "ownerOf", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "postEntitlementCheckResult", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "renewMembership", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "safeTransferFrom(address,address,uint256)", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "safeTransferFrom(address,address,uint256,bytes)", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "setApprovalForAll", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setMembershipFreeAllocation", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setMembershipImage", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setMembershipLimit", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setMembershipPrice", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setMembershipPricingModule", + values: [PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "symbol", values?: undefined): string; + encodeFunctionData( + functionFragment: "tokenURI", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "totalSupply", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transferFrom", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "withdraw", + values: [PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "__ERC721A_init", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "__EntitlementGated_init", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "__Membership_init", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_getMembershipCurrency", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_getMembershipFreeAllocation", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_getMembershipImage", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_getMembershipPrice", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_getMembershipSupplyLimit", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_getPricingModule", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_getSpaceFactory", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_setMembershipFreeAllocation", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_setMembershipSupplyLimit", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_setPricingModule", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "expiresAt", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getApproved", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMembershipCurrency", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMembershipDuration", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMembershipFreeAllocation", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMembershipImage", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMembershipLimit", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMembershipPrice", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMembershipPricingModule", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMembershipRenewalPrice", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRuleData", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getSpaceFactory", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isApprovedForAll", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "joinSpace", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "joinSpaceWithReferral", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "ownerOf", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "postEntitlementCheckResult", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renewMembership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "safeTransferFrom(address,address,uint256)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "safeTransferFrom(address,address,uint256,bytes)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setApprovalForAll", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setMembershipFreeAllocation", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setMembershipImage", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setMembershipLimit", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setMembershipPrice", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setMembershipPricingModule", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "tokenURI", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "totalSupply", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferFrom", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result; + + events: { + "Approval(address,address,uint256)": EventFragment; + "ApprovalForAll(address,address,bool)": EventFragment; + "Banned(address,uint256)": EventFragment; + "ConsecutiveTransfer(uint256,uint256,address,address)": EventFragment; + "EntitlementCheckResultPosted(bytes32,uint8)": EventFragment; + "Initialized(uint32)": EventFragment; + "InterfaceAdded(bytes4)": EventFragment; + "InterfaceRemoved(bytes4)": EventFragment; + "MembershipCurrencyUpdated(address)": EventFragment; + "MembershipFeeRecipientUpdated(address)": EventFragment; + "MembershipFreeAllocationUpdated(uint256)": EventFragment; + "MembershipLimitUpdated(uint256)": EventFragment; + "MembershipPriceUpdated(uint256)": EventFragment; + "MembershipTokenIssued(address,uint256)": EventFragment; + "MembershipTokenRejected(address)": EventFragment; + "MembershipWithdrawal(address,uint256)": EventFragment; + "Membership__ReferralCreated(uint256,uint16)": EventFragment; + "Membership__ReferralRemoved(uint256)": EventFragment; + "Membership__ReferralTimeCreated(uint256,uint16,uint256,uint256)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "Paused(address)": EventFragment; + "RoleCreated(address,uint256)": EventFragment; + "RoleRemoved(address,uint256)": EventFragment; + "RoleUpdated(address,uint256)": EventFragment; + "SubscriptionUpdate(uint256,uint64)": EventFragment; + "Transfer(address,address,uint256)": EventFragment; + "Unbanned(address,uint256)": EventFragment; + "Unpaused(address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ApprovalForAll"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Banned"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ConsecutiveTransfer"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "EntitlementCheckResultPosted" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "MembershipCurrencyUpdated"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "MembershipFeeRecipientUpdated" + ): EventFragment; + getEvent( + nameOrSignatureOrTopic: "MembershipFreeAllocationUpdated" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "MembershipLimitUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "MembershipPriceUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "MembershipTokenIssued"): EventFragment; + getEvent(nameOrSignatureOrTopic: "MembershipTokenRejected"): EventFragment; + getEvent(nameOrSignatureOrTopic: "MembershipWithdrawal"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "Membership__ReferralCreated" + ): EventFragment; + getEvent( + nameOrSignatureOrTopic: "Membership__ReferralRemoved" + ): EventFragment; + getEvent( + nameOrSignatureOrTopic: "Membership__ReferralTimeCreated" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleCreated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "SubscriptionUpdate"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Unbanned"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; +} + +export interface ApprovalEventObject { + owner: string; + approved: string; + tokenId: BigNumber; +} +export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], + ApprovalEventObject +>; + +export type ApprovalEventFilter = TypedEventFilter; + +export interface ApprovalForAllEventObject { + owner: string; + operator: string; + approved: boolean; +} +export type ApprovalForAllEvent = TypedEvent< + [string, string, boolean], + ApprovalForAllEventObject +>; + +export type ApprovalForAllEventFilter = TypedEventFilter; + +export interface BannedEventObject { + moderator: string; + tokenId: BigNumber; +} +export type BannedEvent = TypedEvent<[string, BigNumber], BannedEventObject>; + +export type BannedEventFilter = TypedEventFilter; + +export interface ConsecutiveTransferEventObject { + fromTokenId: BigNumber; + toTokenId: BigNumber; + from: string; + to: string; +} +export type ConsecutiveTransferEvent = TypedEvent< + [BigNumber, BigNumber, string, string], + ConsecutiveTransferEventObject +>; + +export type ConsecutiveTransferEventFilter = + TypedEventFilter; + +export interface EntitlementCheckResultPostedEventObject { + transactionId: string; + result: number; +} +export type EntitlementCheckResultPostedEvent = TypedEvent< + [string, number], + EntitlementCheckResultPostedEventObject +>; + +export type EntitlementCheckResultPostedEventFilter = + TypedEventFilter; + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface InterfaceAddedEventObject { + interfaceId: string; +} +export type InterfaceAddedEvent = TypedEvent< + [string], + InterfaceAddedEventObject +>; + +export type InterfaceAddedEventFilter = TypedEventFilter; + +export interface InterfaceRemovedEventObject { + interfaceId: string; +} +export type InterfaceRemovedEvent = TypedEvent< + [string], + InterfaceRemovedEventObject +>; + +export type InterfaceRemovedEventFilter = + TypedEventFilter; + +export interface MembershipCurrencyUpdatedEventObject { + currency: string; +} +export type MembershipCurrencyUpdatedEvent = TypedEvent< + [string], + MembershipCurrencyUpdatedEventObject +>; + +export type MembershipCurrencyUpdatedEventFilter = + TypedEventFilter; + +export interface MembershipFeeRecipientUpdatedEventObject { + recipient: string; +} +export type MembershipFeeRecipientUpdatedEvent = TypedEvent< + [string], + MembershipFeeRecipientUpdatedEventObject +>; + +export type MembershipFeeRecipientUpdatedEventFilter = + TypedEventFilter; + +export interface MembershipFreeAllocationUpdatedEventObject { + allocation: BigNumber; +} +export type MembershipFreeAllocationUpdatedEvent = TypedEvent< + [BigNumber], + MembershipFreeAllocationUpdatedEventObject +>; + +export type MembershipFreeAllocationUpdatedEventFilter = + TypedEventFilter; + +export interface MembershipLimitUpdatedEventObject { + limit: BigNumber; +} +export type MembershipLimitUpdatedEvent = TypedEvent< + [BigNumber], + MembershipLimitUpdatedEventObject +>; + +export type MembershipLimitUpdatedEventFilter = + TypedEventFilter; + +export interface MembershipPriceUpdatedEventObject { + price: BigNumber; +} +export type MembershipPriceUpdatedEvent = TypedEvent< + [BigNumber], + MembershipPriceUpdatedEventObject +>; + +export type MembershipPriceUpdatedEventFilter = + TypedEventFilter; + +export interface MembershipTokenIssuedEventObject { + recipient: string; + tokenId: BigNumber; +} +export type MembershipTokenIssuedEvent = TypedEvent< + [string, BigNumber], + MembershipTokenIssuedEventObject +>; + +export type MembershipTokenIssuedEventFilter = + TypedEventFilter; + +export interface MembershipTokenRejectedEventObject { + recipient: string; +} +export type MembershipTokenRejectedEvent = TypedEvent< + [string], + MembershipTokenRejectedEventObject +>; + +export type MembershipTokenRejectedEventFilter = + TypedEventFilter; + +export interface MembershipWithdrawalEventObject { + recipient: string; + amount: BigNumber; +} +export type MembershipWithdrawalEvent = TypedEvent< + [string, BigNumber], + MembershipWithdrawalEventObject +>; + +export type MembershipWithdrawalEventFilter = + TypedEventFilter; + +export interface Membership__ReferralCreatedEventObject { + code: BigNumber; + bps: number; +} +export type Membership__ReferralCreatedEvent = TypedEvent< + [BigNumber, number], + Membership__ReferralCreatedEventObject +>; + +export type Membership__ReferralCreatedEventFilter = + TypedEventFilter; + +export interface Membership__ReferralRemovedEventObject { + code: BigNumber; +} +export type Membership__ReferralRemovedEvent = TypedEvent< + [BigNumber], + Membership__ReferralRemovedEventObject +>; + +export type Membership__ReferralRemovedEventFilter = + TypedEventFilter; + +export interface Membership__ReferralTimeCreatedEventObject { + code: BigNumber; + bps: number; + startTime: BigNumber; + endTime: BigNumber; +} +export type Membership__ReferralTimeCreatedEvent = TypedEvent< + [BigNumber, number, BigNumber, BigNumber], + Membership__ReferralTimeCreatedEventObject +>; + +export type Membership__ReferralTimeCreatedEventFilter = + TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface PausedEventObject { + account: string; +} +export type PausedEvent = TypedEvent<[string], PausedEventObject>; + +export type PausedEventFilter = TypedEventFilter; + +export interface RoleCreatedEventObject { + creator: string; + roleId: BigNumber; +} +export type RoleCreatedEvent = TypedEvent< + [string, BigNumber], + RoleCreatedEventObject +>; + +export type RoleCreatedEventFilter = TypedEventFilter; + +export interface RoleRemovedEventObject { + remover: string; + roleId: BigNumber; +} +export type RoleRemovedEvent = TypedEvent< + [string, BigNumber], + RoleRemovedEventObject +>; + +export type RoleRemovedEventFilter = TypedEventFilter; + +export interface RoleUpdatedEventObject { + updater: string; + roleId: BigNumber; +} +export type RoleUpdatedEvent = TypedEvent< + [string, BigNumber], + RoleUpdatedEventObject +>; + +export type RoleUpdatedEventFilter = TypedEventFilter; + +export interface SubscriptionUpdateEventObject { + tokenId: BigNumber; + expiration: BigNumber; +} +export type SubscriptionUpdateEvent = TypedEvent< + [BigNumber, BigNumber], + SubscriptionUpdateEventObject +>; + +export type SubscriptionUpdateEventFilter = + TypedEventFilter; + +export interface TransferEventObject { + from: string; + to: string; + tokenId: BigNumber; +} +export type TransferEvent = TypedEvent< + [string, string, BigNumber], + TransferEventObject +>; + +export type TransferEventFilter = TypedEventFilter; + +export interface UnbannedEventObject { + moderator: string; + tokenId: BigNumber; +} +export type UnbannedEvent = TypedEvent< + [string, BigNumber], + UnbannedEventObject +>; + +export type UnbannedEventFilter = TypedEventFilter; + +export interface UnpausedEventObject { + account: string; +} +export type UnpausedEvent = TypedEvent<[string], UnpausedEventObject>; + +export type UnpausedEventFilter = TypedEventFilter; + +export interface MembershipFacet extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: MembershipFacetInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + __Membership_init( + info: IMembershipBase.MembershipStruct, + spaceFactory: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _getMembershipCurrency(overrides?: CallOverrides): Promise<[string]>; + + _getMembershipFreeAllocation( + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + _getMembershipImage(overrides?: CallOverrides): Promise<[string]>; + + _getMembershipPrice( + totalSupply: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + _getMembershipSupplyLimit(overrides?: CallOverrides): Promise<[BigNumber]>; + + _getPricingModule(overrides?: CallOverrides): Promise<[string]>; + + _getSpaceFactory(overrides?: CallOverrides): Promise<[string]>; + + _setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _setMembershipSupplyLimit( + newLimit: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _setPricingModule( + newPricingModule: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + expiresAt( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + getMembershipCurrency(overrides?: CallOverrides): Promise<[string]>; + + getMembershipDuration(overrides?: CallOverrides): Promise<[BigNumber]>; + + getMembershipFreeAllocation( + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getMembershipImage(overrides?: CallOverrides): Promise<[string]>; + + getMembershipLimit(overrides?: CallOverrides): Promise<[BigNumber]>; + + getMembershipPrice(overrides?: CallOverrides): Promise<[BigNumber]>; + + getMembershipPricingModule(overrides?: CallOverrides): Promise<[string]>; + + getMembershipRenewalPrice( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getRuleData( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[IRuleEntitlement.RuleDataStructOutput]>; + + getSpaceFactory(overrides?: CallOverrides): Promise<[string]>; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + joinSpace( + receiver: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + joinSpaceWithReferral( + receiver: PromiseOrValue, + referrer: PromiseOrValue, + referralCode: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise<[string]>; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + renewMembership( + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipImage( + newImage: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipLimit( + newLimit: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipPrice( + newPrice: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipPricingModule( + pricingModule: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + symbol(overrides?: CallOverrides): Promise<[string]>; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + withdraw( + account: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + __Membership_init( + info: IMembershipBase.MembershipStruct, + spaceFactory: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _getMembershipCurrency(overrides?: CallOverrides): Promise; + + _getMembershipFreeAllocation(overrides?: CallOverrides): Promise; + + _getMembershipImage(overrides?: CallOverrides): Promise; + + _getMembershipPrice( + totalSupply: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + _getMembershipSupplyLimit(overrides?: CallOverrides): Promise; + + _getPricingModule(overrides?: CallOverrides): Promise; + + _getSpaceFactory(overrides?: CallOverrides): Promise; + + _setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _setMembershipSupplyLimit( + newLimit: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _setPricingModule( + newPricingModule: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + expiresAt( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getMembershipCurrency(overrides?: CallOverrides): Promise; + + getMembershipDuration(overrides?: CallOverrides): Promise; + + getMembershipFreeAllocation(overrides?: CallOverrides): Promise; + + getMembershipImage(overrides?: CallOverrides): Promise; + + getMembershipLimit(overrides?: CallOverrides): Promise; + + getMembershipPrice(overrides?: CallOverrides): Promise; + + getMembershipPricingModule(overrides?: CallOverrides): Promise; + + getMembershipRenewalPrice( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRuleData( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getSpaceFactory(overrides?: CallOverrides): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + joinSpace( + receiver: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + joinSpaceWithReferral( + receiver: PromiseOrValue, + referrer: PromiseOrValue, + referralCode: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + renewMembership( + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipImage( + newImage: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipLimit( + newLimit: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipPrice( + newPrice: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipPricingModule( + pricingModule: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + withdraw( + account: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + __Membership_init( + info: IMembershipBase.MembershipStruct, + spaceFactory: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + _getMembershipCurrency(overrides?: CallOverrides): Promise; + + _getMembershipFreeAllocation(overrides?: CallOverrides): Promise; + + _getMembershipImage(overrides?: CallOverrides): Promise; + + _getMembershipPrice( + totalSupply: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + _getMembershipSupplyLimit(overrides?: CallOverrides): Promise; + + _getPricingModule(overrides?: CallOverrides): Promise; + + _getSpaceFactory(overrides?: CallOverrides): Promise; + + _setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + _setMembershipSupplyLimit( + newLimit: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + _setPricingModule( + newPricingModule: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + expiresAt( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getMembershipCurrency(overrides?: CallOverrides): Promise; + + getMembershipDuration(overrides?: CallOverrides): Promise; + + getMembershipFreeAllocation(overrides?: CallOverrides): Promise; + + getMembershipImage(overrides?: CallOverrides): Promise; + + getMembershipLimit(overrides?: CallOverrides): Promise; + + getMembershipPrice(overrides?: CallOverrides): Promise; + + getMembershipPricingModule(overrides?: CallOverrides): Promise; + + getMembershipRenewalPrice( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRuleData( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getSpaceFactory(overrides?: CallOverrides): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + joinSpace( + receiver: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + joinSpaceWithReferral( + receiver: PromiseOrValue, + referrer: PromiseOrValue, + referralCode: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + name(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + renewMembership( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setMembershipImage( + newImage: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setMembershipLimit( + newLimit: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setMembershipPrice( + newPrice: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setMembershipPricingModule( + pricingModule: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + withdraw( + account: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Approval(address,address,uint256)"( + owner?: PromiseOrValue | null, + approved?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): ApprovalEventFilter; + Approval( + owner?: PromiseOrValue | null, + approved?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): ApprovalEventFilter; + + "ApprovalForAll(address,address,bool)"( + owner?: PromiseOrValue | null, + operator?: PromiseOrValue | null, + approved?: null + ): ApprovalForAllEventFilter; + ApprovalForAll( + owner?: PromiseOrValue | null, + operator?: PromiseOrValue | null, + approved?: null + ): ApprovalForAllEventFilter; + + "Banned(address,uint256)"( + moderator?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): BannedEventFilter; + Banned( + moderator?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): BannedEventFilter; + + "ConsecutiveTransfer(uint256,uint256,address,address)"( + fromTokenId?: PromiseOrValue | null, + toTokenId?: null, + from?: PromiseOrValue | null, + to?: PromiseOrValue | null + ): ConsecutiveTransferEventFilter; + ConsecutiveTransfer( + fromTokenId?: PromiseOrValue | null, + toTokenId?: null, + from?: PromiseOrValue | null, + to?: PromiseOrValue | null + ): ConsecutiveTransferEventFilter; + + "EntitlementCheckResultPosted(bytes32,uint8)"( + transactionId?: PromiseOrValue | null, + result?: null + ): EntitlementCheckResultPostedEventFilter; + EntitlementCheckResultPosted( + transactionId?: PromiseOrValue | null, + result?: null + ): EntitlementCheckResultPostedEventFilter; + + "Initialized(uint32)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "InterfaceAdded(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + InterfaceAdded( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + + "InterfaceRemoved(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + InterfaceRemoved( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + + "MembershipCurrencyUpdated(address)"( + currency?: PromiseOrValue | null + ): MembershipCurrencyUpdatedEventFilter; + MembershipCurrencyUpdated( + currency?: PromiseOrValue | null + ): MembershipCurrencyUpdatedEventFilter; + + "MembershipFeeRecipientUpdated(address)"( + recipient?: PromiseOrValue | null + ): MembershipFeeRecipientUpdatedEventFilter; + MembershipFeeRecipientUpdated( + recipient?: PromiseOrValue | null + ): MembershipFeeRecipientUpdatedEventFilter; + + "MembershipFreeAllocationUpdated(uint256)"( + allocation?: PromiseOrValue | null + ): MembershipFreeAllocationUpdatedEventFilter; + MembershipFreeAllocationUpdated( + allocation?: PromiseOrValue | null + ): MembershipFreeAllocationUpdatedEventFilter; + + "MembershipLimitUpdated(uint256)"( + limit?: PromiseOrValue | null + ): MembershipLimitUpdatedEventFilter; + MembershipLimitUpdated( + limit?: PromiseOrValue | null + ): MembershipLimitUpdatedEventFilter; + + "MembershipPriceUpdated(uint256)"( + price?: PromiseOrValue | null + ): MembershipPriceUpdatedEventFilter; + MembershipPriceUpdated( + price?: PromiseOrValue | null + ): MembershipPriceUpdatedEventFilter; + + "MembershipTokenIssued(address,uint256)"( + recipient?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): MembershipTokenIssuedEventFilter; + MembershipTokenIssued( + recipient?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): MembershipTokenIssuedEventFilter; + + "MembershipTokenRejected(address)"( + recipient?: PromiseOrValue | null + ): MembershipTokenRejectedEventFilter; + MembershipTokenRejected( + recipient?: PromiseOrValue | null + ): MembershipTokenRejectedEventFilter; + + "MembershipWithdrawal(address,uint256)"( + recipient?: PromiseOrValue | null, + amount?: null + ): MembershipWithdrawalEventFilter; + MembershipWithdrawal( + recipient?: PromiseOrValue | null, + amount?: null + ): MembershipWithdrawalEventFilter; + + "Membership__ReferralCreated(uint256,uint16)"( + code?: PromiseOrValue | null, + bps?: null + ): Membership__ReferralCreatedEventFilter; + Membership__ReferralCreated( + code?: PromiseOrValue | null, + bps?: null + ): Membership__ReferralCreatedEventFilter; + + "Membership__ReferralRemoved(uint256)"( + code?: PromiseOrValue | null + ): Membership__ReferralRemovedEventFilter; + Membership__ReferralRemoved( + code?: PromiseOrValue | null + ): Membership__ReferralRemovedEventFilter; + + "Membership__ReferralTimeCreated(uint256,uint16,uint256,uint256)"( + code?: PromiseOrValue | null, + bps?: null, + startTime?: null, + endTime?: null + ): Membership__ReferralTimeCreatedEventFilter; + Membership__ReferralTimeCreated( + code?: PromiseOrValue | null, + bps?: null, + startTime?: null, + endTime?: null + ): Membership__ReferralTimeCreatedEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: PromiseOrValue | null, + newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: PromiseOrValue | null, + newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + + "Paused(address)"(account?: null): PausedEventFilter; + Paused(account?: null): PausedEventFilter; + + "RoleCreated(address,uint256)"( + creator?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleCreatedEventFilter; + RoleCreated( + creator?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleCreatedEventFilter; + + "RoleRemoved(address,uint256)"( + remover?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleRemovedEventFilter; + RoleRemoved( + remover?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleRemovedEventFilter; + + "RoleUpdated(address,uint256)"( + updater?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleUpdatedEventFilter; + RoleUpdated( + updater?: PromiseOrValue | null, + roleId?: PromiseOrValue | null + ): RoleUpdatedEventFilter; + + "SubscriptionUpdate(uint256,uint64)"( + tokenId?: PromiseOrValue | null, + expiration?: null + ): SubscriptionUpdateEventFilter; + SubscriptionUpdate( + tokenId?: PromiseOrValue | null, + expiration?: null + ): SubscriptionUpdateEventFilter; + + "Transfer(address,address,uint256)"( + from?: PromiseOrValue | null, + to?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): TransferEventFilter; + Transfer( + from?: PromiseOrValue | null, + to?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): TransferEventFilter; + + "Unbanned(address,uint256)"( + moderator?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): UnbannedEventFilter; + Unbanned( + moderator?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): UnbannedEventFilter; + + "Unpaused(address)"(account?: null): UnpausedEventFilter; + Unpaused(account?: null): UnpausedEventFilter; + }; + + estimateGas: { + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + __Membership_init( + info: IMembershipBase.MembershipStruct, + spaceFactory: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _getMembershipCurrency(overrides?: CallOverrides): Promise; + + _getMembershipFreeAllocation(overrides?: CallOverrides): Promise; + + _getMembershipImage(overrides?: CallOverrides): Promise; + + _getMembershipPrice( + totalSupply: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + _getMembershipSupplyLimit(overrides?: CallOverrides): Promise; + + _getPricingModule(overrides?: CallOverrides): Promise; + + _getSpaceFactory(overrides?: CallOverrides): Promise; + + _setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _setMembershipSupplyLimit( + newLimit: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _setPricingModule( + newPricingModule: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + expiresAt( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getMembershipCurrency(overrides?: CallOverrides): Promise; + + getMembershipDuration(overrides?: CallOverrides): Promise; + + getMembershipFreeAllocation(overrides?: CallOverrides): Promise; + + getMembershipImage(overrides?: CallOverrides): Promise; + + getMembershipLimit(overrides?: CallOverrides): Promise; + + getMembershipPrice(overrides?: CallOverrides): Promise; + + getMembershipPricingModule(overrides?: CallOverrides): Promise; + + getMembershipRenewalPrice( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRuleData( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getSpaceFactory(overrides?: CallOverrides): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + joinSpace( + receiver: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + joinSpaceWithReferral( + receiver: PromiseOrValue, + referrer: PromiseOrValue, + referralCode: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + renewMembership( + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipImage( + newImage: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipLimit( + newLimit: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipPrice( + newPrice: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipPricingModule( + pricingModule: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + withdraw( + account: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + __Membership_init( + info: IMembershipBase.MembershipStruct, + spaceFactory: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _getMembershipCurrency( + overrides?: CallOverrides + ): Promise; + + _getMembershipFreeAllocation( + overrides?: CallOverrides + ): Promise; + + _getMembershipImage( + overrides?: CallOverrides + ): Promise; + + _getMembershipPrice( + totalSupply: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + _getMembershipSupplyLimit( + overrides?: CallOverrides + ): Promise; + + _getPricingModule(overrides?: CallOverrides): Promise; + + _getSpaceFactory(overrides?: CallOverrides): Promise; + + _setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _setMembershipSupplyLimit( + newLimit: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + _setPricingModule( + newPricingModule: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + expiresAt( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getMembershipCurrency( + overrides?: CallOverrides + ): Promise; + + getMembershipDuration( + overrides?: CallOverrides + ): Promise; + + getMembershipFreeAllocation( + overrides?: CallOverrides + ): Promise; + + getMembershipImage( + overrides?: CallOverrides + ): Promise; + + getMembershipLimit( + overrides?: CallOverrides + ): Promise; + + getMembershipPrice( + overrides?: CallOverrides + ): Promise; + + getMembershipPricingModule( + overrides?: CallOverrides + ): Promise; + + getMembershipRenewalPrice( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getRuleData( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getSpaceFactory(overrides?: CallOverrides): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + joinSpace( + receiver: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + joinSpaceWithReferral( + receiver: PromiseOrValue, + referrer: PromiseOrValue, + referralCode: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + renewMembership( + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipFreeAllocation( + newAllocation: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipImage( + newImage: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipLimit( + newLimit: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipPrice( + newPrice: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setMembershipPricingModule( + pricingModule: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + withdraw( + account: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/MockERC721A.ts b/packages/generated/v3/typings/MockERC721A.ts new file mode 100644 index 000000000..b26c62b5a --- /dev/null +++ b/packages/generated/v3/typings/MockERC721A.ts @@ -0,0 +1,826 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PayableOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface MockERC721AInterface extends utils.Interface { + functions: { + "__ERC721A_init(string,string)": FunctionFragment; + "approve(address,uint256)": FunctionFragment; + "balanceOf(address)": FunctionFragment; + "burn(uint256)": FunctionFragment; + "getApproved(uint256)": FunctionFragment; + "isApprovedForAll(address,address)": FunctionFragment; + "mint(address,uint256)": FunctionFragment; + "mintTo(address)": FunctionFragment; + "name()": FunctionFragment; + "ownerOf(uint256)": FunctionFragment; + "safeTransferFrom(address,address,uint256)": FunctionFragment; + "safeTransferFrom(address,address,uint256,bytes)": FunctionFragment; + "setApprovalForAll(address,bool)": FunctionFragment; + "symbol()": FunctionFragment; + "tokenURI(uint256)": FunctionFragment; + "totalSupply()": FunctionFragment; + "transferFrom(address,address,uint256)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "__ERC721A_init" + | "approve" + | "balanceOf" + | "burn" + | "getApproved" + | "isApprovedForAll" + | "mint" + | "mintTo" + | "name" + | "ownerOf" + | "safeTransferFrom(address,address,uint256)" + | "safeTransferFrom(address,address,uint256,bytes)" + | "setApprovalForAll" + | "symbol" + | "tokenURI" + | "totalSupply" + | "transferFrom" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "__ERC721A_init", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "approve", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "balanceOf", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "burn", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getApproved", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "isApprovedForAll", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "mint", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "mintTo", + values: [PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData( + functionFragment: "ownerOf", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "safeTransferFrom(address,address,uint256)", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "safeTransferFrom(address,address,uint256,bytes)", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "setApprovalForAll", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "symbol", values?: undefined): string; + encodeFunctionData( + functionFragment: "tokenURI", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "totalSupply", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transferFrom", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + + decodeFunctionResult( + functionFragment: "__ERC721A_init", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "burn", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getApproved", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isApprovedForAll", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "mint", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "mintTo", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "ownerOf", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "safeTransferFrom(address,address,uint256)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "safeTransferFrom(address,address,uint256,bytes)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setApprovalForAll", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "tokenURI", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "totalSupply", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferFrom", + data: BytesLike + ): Result; + + events: { + "Approval(address,address,uint256)": EventFragment; + "ApprovalForAll(address,address,bool)": EventFragment; + "ConsecutiveTransfer(uint256,uint256,address,address)": EventFragment; + "Initialized(uint32)": EventFragment; + "InterfaceAdded(bytes4)": EventFragment; + "InterfaceRemoved(bytes4)": EventFragment; + "Transfer(address,address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ApprovalForAll"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ConsecutiveTransfer"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; +} + +export interface ApprovalEventObject { + owner: string; + approved: string; + tokenId: BigNumber; +} +export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], + ApprovalEventObject +>; + +export type ApprovalEventFilter = TypedEventFilter; + +export interface ApprovalForAllEventObject { + owner: string; + operator: string; + approved: boolean; +} +export type ApprovalForAllEvent = TypedEvent< + [string, string, boolean], + ApprovalForAllEventObject +>; + +export type ApprovalForAllEventFilter = TypedEventFilter; + +export interface ConsecutiveTransferEventObject { + fromTokenId: BigNumber; + toTokenId: BigNumber; + from: string; + to: string; +} +export type ConsecutiveTransferEvent = TypedEvent< + [BigNumber, BigNumber, string, string], + ConsecutiveTransferEventObject +>; + +export type ConsecutiveTransferEventFilter = + TypedEventFilter; + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface InterfaceAddedEventObject { + interfaceId: string; +} +export type InterfaceAddedEvent = TypedEvent< + [string], + InterfaceAddedEventObject +>; + +export type InterfaceAddedEventFilter = TypedEventFilter; + +export interface InterfaceRemovedEventObject { + interfaceId: string; +} +export type InterfaceRemovedEvent = TypedEvent< + [string], + InterfaceRemovedEventObject +>; + +export type InterfaceRemovedEventFilter = + TypedEventFilter; + +export interface TransferEventObject { + from: string; + to: string; + tokenId: BigNumber; +} +export type TransferEvent = TypedEvent< + [string, string, BigNumber], + TransferEventObject +>; + +export type TransferEventFilter = TypedEventFilter; + +export interface MockERC721A extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: MockERC721AInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + burn( + token: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + mint( + to: PromiseOrValue, + amount: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + mintTo( + to: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise<[string]>; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + symbol(overrides?: CallOverrides): Promise<[string]>; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + }; + + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + burn( + token: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + mint( + to: PromiseOrValue, + amount: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + mintTo( + to: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + burn( + token: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + mint( + to: PromiseOrValue, + amount: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + mintTo( + to: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + name(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Approval(address,address,uint256)"( + owner?: PromiseOrValue | null, + approved?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): ApprovalEventFilter; + Approval( + owner?: PromiseOrValue | null, + approved?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): ApprovalEventFilter; + + "ApprovalForAll(address,address,bool)"( + owner?: PromiseOrValue | null, + operator?: PromiseOrValue | null, + approved?: null + ): ApprovalForAllEventFilter; + ApprovalForAll( + owner?: PromiseOrValue | null, + operator?: PromiseOrValue | null, + approved?: null + ): ApprovalForAllEventFilter; + + "ConsecutiveTransfer(uint256,uint256,address,address)"( + fromTokenId?: PromiseOrValue | null, + toTokenId?: null, + from?: PromiseOrValue | null, + to?: PromiseOrValue | null + ): ConsecutiveTransferEventFilter; + ConsecutiveTransfer( + fromTokenId?: PromiseOrValue | null, + toTokenId?: null, + from?: PromiseOrValue | null, + to?: PromiseOrValue | null + ): ConsecutiveTransferEventFilter; + + "Initialized(uint32)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "InterfaceAdded(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + InterfaceAdded( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + + "InterfaceRemoved(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + InterfaceRemoved( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + + "Transfer(address,address,uint256)"( + from?: PromiseOrValue | null, + to?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): TransferEventFilter; + Transfer( + from?: PromiseOrValue | null, + to?: PromiseOrValue | null, + tokenId?: PromiseOrValue | null + ): TransferEventFilter; + }; + + estimateGas: { + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + burn( + token: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + mint( + to: PromiseOrValue, + amount: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + mintTo( + to: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + __ERC721A_init( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + approve( + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + balanceOf( + owner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + burn( + token: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + getApproved( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: PromiseOrValue, + operator: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + mint( + to: PromiseOrValue, + amount: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + mintTo( + to: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + _data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + setApprovalForAll( + operator: PromiseOrValue, + approved: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenURI( + tokenId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: PromiseOrValue, + to: PromiseOrValue, + tokenId: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/MockEntitlementGated.ts b/packages/generated/v3/typings/MockEntitlementGated.ts new file mode 100644 index 000000000..88063bf5c --- /dev/null +++ b/packages/generated/v3/typings/MockEntitlementGated.ts @@ -0,0 +1,414 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export declare namespace IRuleEntitlement { + export type OperationStruct = { + opType: PromiseOrValue; + index: PromiseOrValue; + }; + + export type OperationStructOutput = [number, number] & { + opType: number; + index: number; + }; + + export type CheckOperationStruct = { + opType: PromiseOrValue; + chainId: PromiseOrValue; + contractAddress: PromiseOrValue; + threshold: PromiseOrValue; + }; + + export type CheckOperationStructOutput = [ + number, + BigNumber, + string, + BigNumber + ] & { + opType: number; + chainId: BigNumber; + contractAddress: string; + threshold: BigNumber; + }; + + export type LogicalOperationStruct = { + logOpType: PromiseOrValue; + leftOperationIndex: PromiseOrValue; + rightOperationIndex: PromiseOrValue; + }; + + export type LogicalOperationStructOutput = [number, number, number] & { + logOpType: number; + leftOperationIndex: number; + rightOperationIndex: number; + }; + + export type RuleDataStruct = { + operations: IRuleEntitlement.OperationStruct[]; + checkOperations: IRuleEntitlement.CheckOperationStruct[]; + logicalOperations: IRuleEntitlement.LogicalOperationStruct[]; + }; + + export type RuleDataStructOutput = [ + IRuleEntitlement.OperationStructOutput[], + IRuleEntitlement.CheckOperationStructOutput[], + IRuleEntitlement.LogicalOperationStructOutput[] + ] & { + operations: IRuleEntitlement.OperationStructOutput[]; + checkOperations: IRuleEntitlement.CheckOperationStructOutput[]; + logicalOperations: IRuleEntitlement.LogicalOperationStructOutput[]; + }; +} + +export interface MockEntitlementGatedInterface extends utils.Interface { + functions: { + "__EntitlementGated_init(address)": FunctionFragment; + "getRuleData(uint256)": FunctionFragment; + "getRuleData(bytes32,uint256)": FunctionFragment; + "postEntitlementCheckResult(bytes32,uint256,uint8)": FunctionFragment; + "requestEntitlementCheck(uint256,((uint8,uint8)[],(uint8,uint256,address,uint256)[],(uint8,uint8,uint8)[]))": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "__EntitlementGated_init" + | "getRuleData(uint256)" + | "getRuleData(bytes32,uint256)" + | "postEntitlementCheckResult" + | "requestEntitlementCheck" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "__EntitlementGated_init", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getRuleData(uint256)", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "getRuleData(bytes32,uint256)", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "postEntitlementCheckResult", + values: [ + PromiseOrValue, + PromiseOrValue, + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "requestEntitlementCheck", + values: [PromiseOrValue, IRuleEntitlement.RuleDataStruct] + ): string; + + decodeFunctionResult( + functionFragment: "__EntitlementGated_init", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRuleData(uint256)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRuleData(bytes32,uint256)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "postEntitlementCheckResult", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "requestEntitlementCheck", + data: BytesLike + ): Result; + + events: { + "EntitlementCheckResultPosted(bytes32,uint8)": EventFragment; + "Initialized(uint32)": EventFragment; + "InterfaceAdded(bytes4)": EventFragment; + "InterfaceRemoved(bytes4)": EventFragment; + }; + + getEvent( + nameOrSignatureOrTopic: "EntitlementCheckResultPosted" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceRemoved"): EventFragment; +} + +export interface EntitlementCheckResultPostedEventObject { + transactionId: string; + result: number; +} +export type EntitlementCheckResultPostedEvent = TypedEvent< + [string, number], + EntitlementCheckResultPostedEventObject +>; + +export type EntitlementCheckResultPostedEventFilter = + TypedEventFilter; + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface InterfaceAddedEventObject { + interfaceId: string; +} +export type InterfaceAddedEvent = TypedEvent< + [string], + InterfaceAddedEventObject +>; + +export type InterfaceAddedEventFilter = TypedEventFilter; + +export interface InterfaceRemovedEventObject { + interfaceId: string; +} +export type InterfaceRemovedEvent = TypedEvent< + [string], + InterfaceRemovedEventObject +>; + +export type InterfaceRemovedEventFilter = + TypedEventFilter; + +export interface MockEntitlementGated extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: MockEntitlementGatedInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "getRuleData(uint256)"( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[IRuleEntitlement.RuleDataStructOutput]>; + + "getRuleData(bytes32,uint256)"( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[IRuleEntitlement.RuleDataStructOutput]>; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + requestEntitlementCheck( + roleId: PromiseOrValue, + ruleData: IRuleEntitlement.RuleDataStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "getRuleData(uint256)"( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "getRuleData(bytes32,uint256)"( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + requestEntitlementCheck( + roleId: PromiseOrValue, + ruleData: IRuleEntitlement.RuleDataStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "getRuleData(uint256)"( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "getRuleData(bytes32,uint256)"( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + requestEntitlementCheck( + roleId: PromiseOrValue, + ruleData: IRuleEntitlement.RuleDataStruct, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "EntitlementCheckResultPosted(bytes32,uint8)"( + transactionId?: PromiseOrValue | null, + result?: null + ): EntitlementCheckResultPostedEventFilter; + EntitlementCheckResultPosted( + transactionId?: PromiseOrValue | null, + result?: null + ): EntitlementCheckResultPostedEventFilter; + + "Initialized(uint32)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "InterfaceAdded(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + InterfaceAdded( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + + "InterfaceRemoved(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + InterfaceRemoved( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + }; + + estimateGas: { + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "getRuleData(uint256)"( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "getRuleData(bytes32,uint256)"( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + requestEntitlementCheck( + roleId: PromiseOrValue, + ruleData: IRuleEntitlement.RuleDataStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + __EntitlementGated_init( + entitlementChecker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + "getRuleData(uint256)"( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + "getRuleData(bytes32,uint256)"( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + postEntitlementCheckResult( + transactionId: PromiseOrValue, + roleId: PromiseOrValue, + result: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + requestEntitlementCheck( + roleId: PromiseOrValue, + ruleData: IRuleEntitlement.RuleDataStruct, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/OwnableFacet.ts b/packages/generated/v3/typings/OwnableFacet.ts new file mode 100644 index 000000000..07f706d96 --- /dev/null +++ b/packages/generated/v3/typings/OwnableFacet.ts @@ -0,0 +1,234 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface OwnableFacetInterface extends utils.Interface { + functions: { + "__Ownable_init(address)": FunctionFragment; + "owner()": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: "__Ownable_init" | "owner" | "transferOwnership" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "__Ownable_init", + values: [PromiseOrValue] + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "__Ownable_init", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + + events: { + "Initialized(uint32)": EventFragment; + "InterfaceAdded(bytes4)": EventFragment; + "InterfaceRemoved(bytes4)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; +} + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface InterfaceAddedEventObject { + interfaceId: string; +} +export type InterfaceAddedEvent = TypedEvent< + [string], + InterfaceAddedEventObject +>; + +export type InterfaceAddedEventFilter = TypedEventFilter; + +export interface InterfaceRemovedEventObject { + interfaceId: string; +} +export type InterfaceRemovedEvent = TypedEvent< + [string], + InterfaceRemovedEventObject +>; + +export type InterfaceRemovedEventFilter = + TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface OwnableFacet extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: OwnableFacetInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + __Ownable_init( + owner_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + owner(overrides?: CallOverrides): Promise<[string]>; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + __Ownable_init( + owner_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + __Ownable_init( + owner_: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Initialized(uint32)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "InterfaceAdded(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + InterfaceAdded( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + + "InterfaceRemoved(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + InterfaceRemoved( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: PromiseOrValue | null, + newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: PromiseOrValue | null, + newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + }; + + estimateGas: { + __Ownable_init( + owner_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + __Ownable_init( + owner_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/PrepayFacet.ts b/packages/generated/v3/typings/PrepayFacet.ts new file mode 100644 index 000000000..fe1235994 --- /dev/null +++ b/packages/generated/v3/typings/PrepayFacet.ts @@ -0,0 +1,393 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PayableOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface PrepayFacetInterface extends utils.Interface { + functions: { + "__PrepayFacet_init()": FunctionFragment; + "calculateMembershipPrepayFee(uint256)": FunctionFragment; + "prepaidMembershipSupply(address)": FunctionFragment; + "prepayMembership(address,uint256)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "__PrepayFacet_init" + | "calculateMembershipPrepayFee" + | "prepaidMembershipSupply" + | "prepayMembership" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "__PrepayFacet_init", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "calculateMembershipPrepayFee", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "prepaidMembershipSupply", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "prepayMembership", + values: [PromiseOrValue, PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "__PrepayFacet_init", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "calculateMembershipPrepayFee", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "prepaidMembershipSupply", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "prepayMembership", + data: BytesLike + ): Result; + + events: { + "Initialized(uint32)": EventFragment; + "InterfaceAdded(bytes4)": EventFragment; + "InterfaceRemoved(bytes4)": EventFragment; + "PlatformFeeRecipientSet(address)": EventFragment; + "PlatformMembershipBpsSet(uint16)": EventFragment; + "PlatformMembershipDurationSet(uint256)": EventFragment; + "PlatformMembershipFeeSet(uint256)": EventFragment; + "PlatformMembershipMintLimitSet(uint256)": EventFragment; + "PrepayBase__Prepaid(address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "PlatformFeeRecipientSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "PlatformMembershipBpsSet"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "PlatformMembershipDurationSet" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "PlatformMembershipFeeSet"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "PlatformMembershipMintLimitSet" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "PrepayBase__Prepaid"): EventFragment; +} + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface InterfaceAddedEventObject { + interfaceId: string; +} +export type InterfaceAddedEvent = TypedEvent< + [string], + InterfaceAddedEventObject +>; + +export type InterfaceAddedEventFilter = TypedEventFilter; + +export interface InterfaceRemovedEventObject { + interfaceId: string; +} +export type InterfaceRemovedEvent = TypedEvent< + [string], + InterfaceRemovedEventObject +>; + +export type InterfaceRemovedEventFilter = + TypedEventFilter; + +export interface PlatformFeeRecipientSetEventObject { + recipient: string; +} +export type PlatformFeeRecipientSetEvent = TypedEvent< + [string], + PlatformFeeRecipientSetEventObject +>; + +export type PlatformFeeRecipientSetEventFilter = + TypedEventFilter; + +export interface PlatformMembershipBpsSetEventObject { + bps: number; +} +export type PlatformMembershipBpsSetEvent = TypedEvent< + [number], + PlatformMembershipBpsSetEventObject +>; + +export type PlatformMembershipBpsSetEventFilter = + TypedEventFilter; + +export interface PlatformMembershipDurationSetEventObject { + duration: BigNumber; +} +export type PlatformMembershipDurationSetEvent = TypedEvent< + [BigNumber], + PlatformMembershipDurationSetEventObject +>; + +export type PlatformMembershipDurationSetEventFilter = + TypedEventFilter; + +export interface PlatformMembershipFeeSetEventObject { + fee: BigNumber; +} +export type PlatformMembershipFeeSetEvent = TypedEvent< + [BigNumber], + PlatformMembershipFeeSetEventObject +>; + +export type PlatformMembershipFeeSetEventFilter = + TypedEventFilter; + +export interface PlatformMembershipMintLimitSetEventObject { + limit: BigNumber; +} +export type PlatformMembershipMintLimitSetEvent = TypedEvent< + [BigNumber], + PlatformMembershipMintLimitSetEventObject +>; + +export type PlatformMembershipMintLimitSetEventFilter = + TypedEventFilter; + +export interface PrepayBase__PrepaidEventObject { + membership: string; + supply: BigNumber; +} +export type PrepayBase__PrepaidEvent = TypedEvent< + [string, BigNumber], + PrepayBase__PrepaidEventObject +>; + +export type PrepayBase__PrepaidEventFilter = + TypedEventFilter; + +export interface PrepayFacet extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: PrepayFacetInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + __PrepayFacet_init( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + calculateMembershipPrepayFee( + supply: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + prepaidMembershipSupply( + account: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + prepayMembership( + membership: PromiseOrValue, + supply: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + }; + + __PrepayFacet_init( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + calculateMembershipPrepayFee( + supply: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + prepaidMembershipSupply( + account: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + prepayMembership( + membership: PromiseOrValue, + supply: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + __PrepayFacet_init(overrides?: CallOverrides): Promise; + + calculateMembershipPrepayFee( + supply: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + prepaidMembershipSupply( + account: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + prepayMembership( + membership: PromiseOrValue, + supply: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Initialized(uint32)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "InterfaceAdded(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + InterfaceAdded( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + + "InterfaceRemoved(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + InterfaceRemoved( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + + "PlatformFeeRecipientSet(address)"( + recipient?: PromiseOrValue | null + ): PlatformFeeRecipientSetEventFilter; + PlatformFeeRecipientSet( + recipient?: PromiseOrValue | null + ): PlatformFeeRecipientSetEventFilter; + + "PlatformMembershipBpsSet(uint16)"( + bps?: null + ): PlatformMembershipBpsSetEventFilter; + PlatformMembershipBpsSet(bps?: null): PlatformMembershipBpsSetEventFilter; + + "PlatformMembershipDurationSet(uint256)"( + duration?: null + ): PlatformMembershipDurationSetEventFilter; + PlatformMembershipDurationSet( + duration?: null + ): PlatformMembershipDurationSetEventFilter; + + "PlatformMembershipFeeSet(uint256)"( + fee?: null + ): PlatformMembershipFeeSetEventFilter; + PlatformMembershipFeeSet(fee?: null): PlatformMembershipFeeSetEventFilter; + + "PlatformMembershipMintLimitSet(uint256)"( + limit?: null + ): PlatformMembershipMintLimitSetEventFilter; + PlatformMembershipMintLimitSet( + limit?: null + ): PlatformMembershipMintLimitSetEventFilter; + + "PrepayBase__Prepaid(address,uint256)"( + membership?: PromiseOrValue | null, + supply?: null + ): PrepayBase__PrepaidEventFilter; + PrepayBase__Prepaid( + membership?: PromiseOrValue | null, + supply?: null + ): PrepayBase__PrepaidEventFilter; + }; + + estimateGas: { + __PrepayFacet_init( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + calculateMembershipPrepayFee( + supply: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + prepaidMembershipSupply( + account: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + prepayMembership( + membership: PromiseOrValue, + supply: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + __PrepayFacet_init( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + calculateMembershipPrepayFee( + supply: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + prepaidMembershipSupply( + account: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + prepayMembership( + membership: PromiseOrValue, + supply: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/TokenPausableFacet.ts b/packages/generated/v3/typings/TokenPausableFacet.ts new file mode 100644 index 000000000..8033d3fd3 --- /dev/null +++ b/packages/generated/v3/typings/TokenPausableFacet.ts @@ -0,0 +1,259 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface TokenPausableFacetInterface extends utils.Interface { + functions: { + "__Pausable_init()": FunctionFragment; + "pause()": FunctionFragment; + "paused()": FunctionFragment; + "unpause()": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: "__Pausable_init" | "pause" | "paused" | "unpause" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "__Pausable_init", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "pause", values?: undefined): string; + encodeFunctionData(functionFragment: "paused", values?: undefined): string; + encodeFunctionData(functionFragment: "unpause", values?: undefined): string; + + decodeFunctionResult( + functionFragment: "__Pausable_init", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "pause", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "paused", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "unpause", data: BytesLike): Result; + + events: { + "Initialized(uint32)": EventFragment; + "InterfaceAdded(bytes4)": EventFragment; + "InterfaceRemoved(bytes4)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "Paused(address)": EventFragment; + "Unpaused(address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "InterfaceRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; +} + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface InterfaceAddedEventObject { + interfaceId: string; +} +export type InterfaceAddedEvent = TypedEvent< + [string], + InterfaceAddedEventObject +>; + +export type InterfaceAddedEventFilter = TypedEventFilter; + +export interface InterfaceRemovedEventObject { + interfaceId: string; +} +export type InterfaceRemovedEvent = TypedEvent< + [string], + InterfaceRemovedEventObject +>; + +export type InterfaceRemovedEventFilter = + TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface PausedEventObject { + account: string; +} +export type PausedEvent = TypedEvent<[string], PausedEventObject>; + +export type PausedEventFilter = TypedEventFilter; + +export interface UnpausedEventObject { + account: string; +} +export type UnpausedEvent = TypedEvent<[string], UnpausedEventObject>; + +export type UnpausedEventFilter = TypedEventFilter; + +export interface TokenPausableFacet extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: TokenPausableFacetInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + __Pausable_init( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + pause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + paused(overrides?: CallOverrides): Promise<[boolean]>; + + unpause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + __Pausable_init( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + pause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + paused(overrides?: CallOverrides): Promise; + + unpause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + __Pausable_init(overrides?: CallOverrides): Promise; + + pause(overrides?: CallOverrides): Promise; + + paused(overrides?: CallOverrides): Promise; + + unpause(overrides?: CallOverrides): Promise; + }; + + filters: { + "Initialized(uint32)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "InterfaceAdded(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + InterfaceAdded( + interfaceId?: PromiseOrValue | null + ): InterfaceAddedEventFilter; + + "InterfaceRemoved(bytes4)"( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + InterfaceRemoved( + interfaceId?: PromiseOrValue | null + ): InterfaceRemovedEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: PromiseOrValue | null, + newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: PromiseOrValue | null, + newOwner?: PromiseOrValue | null + ): OwnershipTransferredEventFilter; + + "Paused(address)"(account?: null): PausedEventFilter; + Paused(account?: null): PausedEventFilter; + + "Unpaused(address)"(account?: null): UnpausedEventFilter; + Unpaused(account?: null): UnpausedEventFilter; + }; + + estimateGas: { + __Pausable_init( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + pause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + paused(overrides?: CallOverrides): Promise; + + unpause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + __Pausable_init( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + pause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + paused(overrides?: CallOverrides): Promise; + + unpause( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/UserEntitlement.ts b/packages/generated/v3/typings/UserEntitlement.ts new file mode 100644 index 000000000..6939e1d61 --- /dev/null +++ b/packages/generated/v3/typings/UserEntitlement.ts @@ -0,0 +1,505 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PayableOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "./common"; + +export interface UserEntitlementInterface extends utils.Interface { + functions: { + "SPACE_ADDRESS()": FunctionFragment; + "UPGRADE_INTERFACE_VERSION()": FunctionFragment; + "description()": FunctionFragment; + "getEntitlementDataByRoleId(uint256)": FunctionFragment; + "initialize(address)": FunctionFragment; + "isCrosschain()": FunctionFragment; + "isEntitled(bytes32,address[],bytes32)": FunctionFragment; + "moduleType()": FunctionFragment; + "name()": FunctionFragment; + "proxiableUUID()": FunctionFragment; + "removeEntitlement(uint256)": FunctionFragment; + "setEntitlement(uint256,bytes)": FunctionFragment; + "supportsInterface(bytes4)": FunctionFragment; + "upgradeToAndCall(address,bytes)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "SPACE_ADDRESS" + | "UPGRADE_INTERFACE_VERSION" + | "description" + | "getEntitlementDataByRoleId" + | "initialize" + | "isCrosschain" + | "isEntitled" + | "moduleType" + | "name" + | "proxiableUUID" + | "removeEntitlement" + | "setEntitlement" + | "supportsInterface" + | "upgradeToAndCall" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "SPACE_ADDRESS", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "UPGRADE_INTERFACE_VERSION", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "description", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getEntitlementDataByRoleId", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "isCrosschain", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "isEntitled", + values: [ + PromiseOrValue, + PromiseOrValue[], + PromiseOrValue + ] + ): string; + encodeFunctionData( + functionFragment: "moduleType", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData( + functionFragment: "proxiableUUID", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "removeEntitlement", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "setEntitlement", + values: [PromiseOrValue, PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "supportsInterface", + values: [PromiseOrValue] + ): string; + encodeFunctionData( + functionFragment: "upgradeToAndCall", + values: [PromiseOrValue, PromiseOrValue] + ): string; + + decodeFunctionResult( + functionFragment: "SPACE_ADDRESS", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "UPGRADE_INTERFACE_VERSION", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "description", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getEntitlementDataByRoleId", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "isCrosschain", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "isEntitled", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "moduleType", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "proxiableUUID", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removeEntitlement", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setEntitlement", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "supportsInterface", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "upgradeToAndCall", + data: BytesLike + ): Result; + + events: { + "Initialized(uint64)": EventFragment; + "Upgraded(address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Upgraded"): EventFragment; +} + +export interface InitializedEventObject { + version: BigNumber; +} +export type InitializedEvent = TypedEvent<[BigNumber], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface UpgradedEventObject { + implementation: string; +} +export type UpgradedEvent = TypedEvent<[string], UpgradedEventObject>; + +export type UpgradedEventFilter = TypedEventFilter; + +export interface UserEntitlement extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: UserEntitlementInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + SPACE_ADDRESS(overrides?: CallOverrides): Promise<[string]>; + + UPGRADE_INTERFACE_VERSION(overrides?: CallOverrides): Promise<[string]>; + + description(overrides?: CallOverrides): Promise<[string]>; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[string]>; + + initialize( + _space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise<[boolean]>; + + isEntitled( + channelId: PromiseOrValue, + wallets: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + moduleType(overrides?: CallOverrides): Promise<[string]>; + + name(overrides?: CallOverrides): Promise<[string]>; + + proxiableUUID(overrides?: CallOverrides): Promise<[string]>; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + + upgradeToAndCall( + newImplementation: PromiseOrValue, + data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + }; + + SPACE_ADDRESS(overrides?: CallOverrides): Promise; + + UPGRADE_INTERFACE_VERSION(overrides?: CallOverrides): Promise; + + description(overrides?: CallOverrides): Promise; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + initialize( + _space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise; + + isEntitled( + channelId: PromiseOrValue, + wallets: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + moduleType(overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + proxiableUUID(overrides?: CallOverrides): Promise; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + upgradeToAndCall( + newImplementation: PromiseOrValue, + data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + + callStatic: { + SPACE_ADDRESS(overrides?: CallOverrides): Promise; + + UPGRADE_INTERFACE_VERSION(overrides?: CallOverrides): Promise; + + description(overrides?: CallOverrides): Promise; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + initialize( + _space: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise; + + isEntitled( + channelId: PromiseOrValue, + wallets: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + moduleType(overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + proxiableUUID(overrides?: CallOverrides): Promise; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + upgradeToAndCall( + newImplementation: PromiseOrValue, + data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Initialized(uint64)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "Upgraded(address)"( + implementation?: PromiseOrValue | null + ): UpgradedEventFilter; + Upgraded( + implementation?: PromiseOrValue | null + ): UpgradedEventFilter; + }; + + estimateGas: { + SPACE_ADDRESS(overrides?: CallOverrides): Promise; + + UPGRADE_INTERFACE_VERSION(overrides?: CallOverrides): Promise; + + description(overrides?: CallOverrides): Promise; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + initialize( + _space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise; + + isEntitled( + channelId: PromiseOrValue, + wallets: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + moduleType(overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + proxiableUUID(overrides?: CallOverrides): Promise; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + upgradeToAndCall( + newImplementation: PromiseOrValue, + data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + }; + + populateTransaction: { + SPACE_ADDRESS(overrides?: CallOverrides): Promise; + + UPGRADE_INTERFACE_VERSION( + overrides?: CallOverrides + ): Promise; + + description(overrides?: CallOverrides): Promise; + + getEntitlementDataByRoleId( + roleId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + initialize( + _space: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + isCrosschain(overrides?: CallOverrides): Promise; + + isEntitled( + channelId: PromiseOrValue, + wallets: PromiseOrValue[], + permission: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + moduleType(overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + proxiableUUID(overrides?: CallOverrides): Promise; + + removeEntitlement( + roleId: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + setEntitlement( + roleId: PromiseOrValue, + entitlementData: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + + supportsInterface( + interfaceId: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + + upgradeToAndCall( + newImplementation: PromiseOrValue, + data: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise; + }; +} diff --git a/packages/generated/v3/typings/common.ts b/packages/generated/v3/typings/common.ts new file mode 100644 index 000000000..4c90b08bb --- /dev/null +++ b/packages/generated/v3/typings/common.ts @@ -0,0 +1,46 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { Listener } from "@ethersproject/providers"; +import type { Event, EventFilter } from "ethers"; + +export interface TypedEvent< + TArgsArray extends Array = any, + TArgsObject = any +> extends Event { + args: TArgsArray & TArgsObject; +} + +export interface TypedEventFilter<_TEvent extends TypedEvent> + extends EventFilter {} + +export interface TypedListener { + (...listenerArg: [...__TypechainArgsArray, TEvent]): void; +} + +type __TypechainArgsArray = T extends TypedEvent ? U : never; + +export interface OnEvent { + ( + eventFilter: TypedEventFilter, + listener: TypedListener + ): TRes; + (eventName: string, listener: Listener): TRes; +} + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise; +}; + +export type GetContractTypeFromFactory = F extends MinEthersFactory< + infer C, + any +> + ? C + : never; + +export type GetARGsTypeFromFactory = F extends MinEthersFactory + ? Parameters + : never; + +export type PromiseOrValue = T | Promise; diff --git a/packages/generated/v3/typings/factories/IArchitect__factory.ts b/packages/generated/v3/typings/factories/IArchitect__factory.ts new file mode 100644 index 000000000..6acd7e3eb --- /dev/null +++ b/packages/generated/v3/typings/factories/IArchitect__factory.ts @@ -0,0 +1,354 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IArchitect, IArchitectInterface } from "../IArchitect"; + +const _abi = [ + { + type: "function", + name: "createSpace", + inputs: [ + { + name: "SpaceInfo", + type: "tuple", + internalType: "struct IArchitectBase.SpaceInfo", + components: [ + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "uri", + type: "string", + internalType: "string", + }, + { + name: "membership", + type: "tuple", + internalType: "struct IArchitectBase.Membership", + components: [ + { + name: "settings", + type: "tuple", + internalType: "struct IMembershipBase.Membership", + components: [ + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "symbol", + type: "string", + internalType: "string", + }, + { + name: "price", + type: "uint256", + internalType: "uint256", + }, + { + name: "maxSupply", + type: "uint256", + internalType: "uint256", + }, + { + name: "duration", + type: "uint64", + internalType: "uint64", + }, + { + name: "currency", + type: "address", + internalType: "address", + }, + { + name: "feeRecipient", + type: "address", + internalType: "address", + }, + { + name: "freeAllocation", + type: "uint256", + internalType: "uint256", + }, + { + name: "pricingModule", + type: "address", + internalType: "address", + }, + ], + }, + { + name: "requirements", + type: "tuple", + internalType: "struct IArchitectBase.MembershipRequirements", + components: [ + { + name: "everyone", + type: "bool", + internalType: "bool", + }, + { + name: "users", + type: "address[]", + internalType: "address[]", + }, + { + name: "ruleData", + type: "tuple", + internalType: "struct IRuleEntitlement.RuleData", + components: [ + { + name: "operations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.Operation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: + "enum IRuleEntitlement.CombinedOperationType", + }, + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + name: "checkOperations", + type: "tuple[]", + internalType: + "struct IRuleEntitlement.CheckOperation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: + "enum IRuleEntitlement.CheckOperationType", + }, + { + name: "chainId", + type: "uint256", + internalType: "uint256", + }, + { + name: "contractAddress", + type: "address", + internalType: "address", + }, + { + name: "threshold", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "logicalOperations", + type: "tuple[]", + internalType: + "struct IRuleEntitlement.LogicalOperation[]", + components: [ + { + name: "logOpType", + type: "uint8", + internalType: + "enum IRuleEntitlement.LogicalOperationType", + }, + { + name: "leftOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "rightOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + ], + }, + ], + }, + { + name: "permissions", + type: "string[]", + internalType: "string[]", + }, + ], + }, + { + name: "channel", + type: "tuple", + internalType: "struct IArchitectBase.ChannelInfo", + components: [ + { + name: "metadata", + type: "string", + internalType: "string", + }, + ], + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "getSpaceArchitectImplementations", + inputs: [], + outputs: [ + { + name: "ownerTokenImplementation", + type: "address", + internalType: "contract ISpaceOwner", + }, + { + name: "userEntitlementImplementation", + type: "address", + internalType: "contract IUserEntitlement", + }, + { + name: "ruleEntitlementImplementation", + type: "address", + internalType: "contract IRuleEntitlement", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getSpaceByTokenId", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "space", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getTokenIdBySpace", + inputs: [ + { + name: "space", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "setSpaceArchitectImplementations", + inputs: [ + { + name: "ownerTokenImplementation", + type: "address", + internalType: "contract ISpaceOwner", + }, + { + name: "userEntitlementImplementation", + type: "address", + internalType: "contract IUserEntitlement", + }, + { + name: "ruleEntitlementImplementation", + type: "address", + internalType: "contract IRuleEntitlement", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "SpaceCreated", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + { + name: "space", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "Architect__InvalidAddress", + inputs: [], + }, + { + type: "error", + name: "Architect__InvalidNetworkId", + inputs: [], + }, + { + type: "error", + name: "Architect__InvalidStringLength", + inputs: [], + }, + { + type: "error", + name: "Architect__NotContract", + inputs: [], + }, +] as const; + +export class IArchitect__factory { + static readonly abi = _abi; + static createInterface(): IArchitectInterface { + return new utils.Interface(_abi) as IArchitectInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IArchitect { + return new Contract(address, _abi, signerOrProvider) as IArchitect; + } +} diff --git a/packages/generated/v3/typings/factories/IBanning__factory.ts b/packages/generated/v3/typings/factories/IBanning__factory.ts new file mode 100644 index 000000000..248fa2ac3 --- /dev/null +++ b/packages/generated/v3/typings/factories/IBanning__factory.ts @@ -0,0 +1,157 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IBanning, IBanningInterface } from "../IBanning"; + +const _abi = [ + { + type: "function", + name: "ban", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "banned", + inputs: [], + outputs: [ + { + name: "", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isBanned", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "unban", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "Banned", + inputs: [ + { + name: "moderator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Unbanned", + inputs: [ + { + name: "moderator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "Banning__AlreadyBanned", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "Banning__CannotBanSelf", + inputs: [], + }, + { + type: "error", + name: "Banning__InvalidTokenId", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "Banning__NotBanned", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, +] as const; + +export class IBanning__factory { + static readonly abi = _abi; + static createInterface(): IBanningInterface { + return new utils.Interface(_abi) as IBanningInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IBanning { + return new Contract(address, _abi, signerOrProvider) as IBanning; + } +} diff --git a/packages/generated/v3/typings/factories/IChannel__factory.ts b/packages/generated/v3/typings/factories/IChannel__factory.ts new file mode 100644 index 000000000..21431b351 --- /dev/null +++ b/packages/generated/v3/typings/factories/IChannel__factory.ts @@ -0,0 +1,320 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IChannel, IChannelInterface } from "../IChannel"; + +const _abi = [ + { + type: "function", + name: "addRoleToChannel", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "createChannel", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "metadata", + type: "string", + internalType: "string", + }, + { + name: "roleIds", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "getChannel", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "channel", + type: "tuple", + internalType: "struct IChannelBase.Channel", + components: [ + { + name: "id", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "disabled", + type: "bool", + internalType: "bool", + }, + { + name: "metadata", + type: "string", + internalType: "string", + }, + { + name: "roleIds", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getChannels", + inputs: [], + outputs: [ + { + name: "channels", + type: "tuple[]", + internalType: "struct IChannelBase.Channel[]", + components: [ + { + name: "id", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "disabled", + type: "bool", + internalType: "bool", + }, + { + name: "metadata", + type: "string", + internalType: "string", + }, + { + name: "roleIds", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getRolesByChannel", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "roleIds", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "removeChannel", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "removeRoleFromChannel", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateChannel", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "metadata", + type: "string", + internalType: "string", + }, + { + name: "disabled", + type: "bool", + internalType: "bool", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "ChannelCreated", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "channelId", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ChannelRemoved", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "channelId", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ChannelRoleAdded", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "channelId", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + { + name: "roleId", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ChannelRoleRemoved", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "channelId", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + { + name: "roleId", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ChannelUpdated", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "channelId", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + ], + anonymous: false, + }, +] as const; + +export class IChannel__factory { + static readonly abi = _abi; + static createInterface(): IChannelInterface { + return new utils.Interface(_abi) as IChannelInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IChannel { + return new Contract(address, _abi, signerOrProvider) as IChannel; + } +} diff --git a/packages/generated/v3/typings/factories/ICustomEntitlement__factory.ts b/packages/generated/v3/typings/factories/ICustomEntitlement__factory.ts new file mode 100644 index 000000000..0d18a3a07 --- /dev/null +++ b/packages/generated/v3/typings/factories/ICustomEntitlement__factory.ts @@ -0,0 +1,45 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { + ICustomEntitlement, + ICustomEntitlementInterface, +} from "../ICustomEntitlement"; + +const _abi = [ + { + type: "function", + name: "isEntitled", + inputs: [ + { + name: "user", + type: "address[]", + internalType: "address[]", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, +] as const; + +export class ICustomEntitlement__factory { + static readonly abi = _abi; + static createInterface(): ICustomEntitlementInterface { + return new utils.Interface(_abi) as ICustomEntitlementInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): ICustomEntitlement { + return new Contract(address, _abi, signerOrProvider) as ICustomEntitlement; + } +} diff --git a/packages/generated/v3/typings/factories/IDiamondCut__factory.ts b/packages/generated/v3/typings/factories/IDiamondCut__factory.ts new file mode 100644 index 000000000..5fec30b5f --- /dev/null +++ b/packages/generated/v3/typings/factories/IDiamondCut__factory.ts @@ -0,0 +1,207 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IDiamondCut, IDiamondCutInterface } from "../IDiamondCut"; + +const _abi = [ + { + type: "function", + name: "diamondCut", + inputs: [ + { + name: "facetCuts", + type: "tuple[]", + internalType: "struct IDiamond.FacetCut[]", + components: [ + { + name: "facetAddress", + type: "address", + internalType: "address", + }, + { + name: "action", + type: "uint8", + internalType: "enum IDiamond.FacetCutAction", + }, + { + name: "functionSelectors", + type: "bytes4[]", + internalType: "bytes4[]", + }, + ], + }, + { + name: "init", + type: "address", + internalType: "address", + }, + { + name: "initPayload", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "DiamondCut", + inputs: [ + { + name: "facetCuts", + type: "tuple[]", + indexed: false, + internalType: "struct IDiamond.FacetCut[]", + components: [ + { + name: "facetAddress", + type: "address", + internalType: "address", + }, + { + name: "action", + type: "uint8", + internalType: "enum IDiamond.FacetCutAction", + }, + { + name: "functionSelectors", + type: "bytes4[]", + internalType: "bytes4[]", + }, + ], + }, + { + name: "init", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "initPayload", + type: "bytes", + indexed: false, + internalType: "bytes", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "DiamondCut_FunctionAlreadyExists", + inputs: [ + { + name: "selector", + type: "bytes4", + internalType: "bytes4", + }, + ], + }, + { + type: "error", + name: "DiamondCut_FunctionDoesNotExist", + inputs: [ + { + name: "facet", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "DiamondCut_FunctionFromSameFacetAlreadyExists", + inputs: [ + { + name: "selector", + type: "bytes4", + internalType: "bytes4", + }, + ], + }, + { + type: "error", + name: "DiamondCut_ImmutableFacet", + inputs: [], + }, + { + type: "error", + name: "DiamondCut_InvalidContract", + inputs: [ + { + name: "init", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "DiamondCut_InvalidFacet", + inputs: [ + { + name: "facet", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "DiamondCut_InvalidFacetCutAction", + inputs: [], + }, + { + type: "error", + name: "DiamondCut_InvalidFacetCutLength", + inputs: [], + }, + { + type: "error", + name: "DiamondCut_InvalidFacetRemoval", + inputs: [ + { + name: "facet", + type: "address", + internalType: "address", + }, + { + name: "selector", + type: "bytes4", + internalType: "bytes4", + }, + ], + }, + { + type: "error", + name: "DiamondCut_InvalidFacetSelectors", + inputs: [ + { + name: "facet", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "DiamondCut_InvalidSelector", + inputs: [], + }, +] as const; + +export class IDiamondCut__factory { + static readonly abi = _abi; + static createInterface(): IDiamondCutInterface { + return new utils.Interface(_abi) as IDiamondCutInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IDiamondCut { + return new Contract(address, _abi, signerOrProvider) as IDiamondCut; + } +} diff --git a/packages/generated/v3/typings/factories/IDiamond__factory.ts b/packages/generated/v3/typings/factories/IDiamond__factory.ts new file mode 100644 index 000000000..33e89852b --- /dev/null +++ b/packages/generated/v3/typings/factories/IDiamond__factory.ts @@ -0,0 +1,28 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IDiamond, IDiamondInterface } from "../IDiamond"; + +const _abi = [ + { + type: "error", + name: "Diamond_UnsupportedFunction", + inputs: [], + }, +] as const; + +export class IDiamond__factory { + static readonly abi = _abi; + static createInterface(): IDiamondInterface { + return new utils.Interface(_abi) as IDiamondInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IDiamond { + return new Contract(address, _abi, signerOrProvider) as IDiamond; + } +} diff --git a/packages/generated/v3/typings/factories/IERC721AQueryable__factory.ts b/packages/generated/v3/typings/factories/IERC721AQueryable__factory.ts new file mode 100644 index 000000000..cdf857fa7 --- /dev/null +++ b/packages/generated/v3/typings/factories/IERC721AQueryable__factory.ts @@ -0,0 +1,332 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { + IERC721AQueryable, + IERC721AQueryableInterface, +} from "../IERC721AQueryable"; + +const _abi = [ + { + type: "function", + name: "explicitOwnershipOf", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct IERC721ABase.TokenOwnership", + components: [ + { + name: "addr", + type: "address", + internalType: "address", + }, + { + name: "startTimestamp", + type: "uint64", + internalType: "uint64", + }, + { + name: "burned", + type: "bool", + internalType: "bool", + }, + { + name: "extraData", + type: "uint24", + internalType: "uint24", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "explicitOwnershipsOf", + inputs: [ + { + name: "tokenIds", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct IERC721ABase.TokenOwnership[]", + components: [ + { + name: "addr", + type: "address", + internalType: "address", + }, + { + name: "startTimestamp", + type: "uint64", + internalType: "uint64", + }, + { + name: "burned", + type: "bool", + internalType: "bool", + }, + { + name: "extraData", + type: "uint24", + internalType: "uint24", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "tokensOfOwner", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "tokensOfOwnerIn", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + { + name: "start", + type: "uint256", + internalType: "uint256", + }, + { + name: "stop", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + stateMutability: "view", + }, + { + type: "event", + name: "Approval", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "approved", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ApprovalForAll", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "approved", + type: "bool", + indexed: false, + internalType: "bool", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ConsecutiveTransfer", + inputs: [ + { + name: "fromTokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + { + name: "toTokenId", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "from", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Transfer", + inputs: [ + { + name: "from", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "ApprovalCallerNotOwnerNorApproved", + inputs: [], + }, + { + type: "error", + name: "ApprovalQueryForNonexistentToken", + inputs: [], + }, + { + type: "error", + name: "BalanceQueryForZeroAddress", + inputs: [], + }, + { + type: "error", + name: "InvalidQueryRange", + inputs: [], + }, + { + type: "error", + name: "MintERC2309QuantityExceedsLimit", + inputs: [], + }, + { + type: "error", + name: "MintToZeroAddress", + inputs: [], + }, + { + type: "error", + name: "MintZeroQuantity", + inputs: [], + }, + { + type: "error", + name: "OwnerQueryForNonexistentToken", + inputs: [], + }, + { + type: "error", + name: "OwnershipNotInitializedForExtraData", + inputs: [], + }, + { + type: "error", + name: "TransferCallerNotOwnerNorApproved", + inputs: [], + }, + { + type: "error", + name: "TransferFromIncorrectOwner", + inputs: [], + }, + { + type: "error", + name: "TransferToNonERC721ReceiverImplementer", + inputs: [], + }, + { + type: "error", + name: "TransferToZeroAddress", + inputs: [], + }, + { + type: "error", + name: "URIQueryForNonexistentToken", + inputs: [], + }, +] as const; + +export class IERC721AQueryable__factory { + static readonly abi = _abi; + static createInterface(): IERC721AQueryableInterface { + return new utils.Interface(_abi) as IERC721AQueryableInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IERC721AQueryable { + return new Contract(address, _abi, signerOrProvider) as IERC721AQueryable; + } +} diff --git a/packages/generated/v3/typings/factories/IEntitlementsManager__factory.ts b/packages/generated/v3/typings/factories/IEntitlementsManager__factory.ts new file mode 100644 index 000000000..4000862eb --- /dev/null +++ b/packages/generated/v3/typings/factories/IEntitlementsManager__factory.ts @@ -0,0 +1,267 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { + IEntitlementsManager, + IEntitlementsManagerInterface, +} from "../IEntitlementsManager"; + +const _abi = [ + { + type: "function", + name: "addEntitlementModule", + inputs: [ + { + name: "entitlement", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "addImmutableEntitlements", + inputs: [ + { + name: "entitlements", + type: "address[]", + internalType: "address[]", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "getEntitlement", + inputs: [ + { + name: "entitlement", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "entitlements", + type: "tuple", + internalType: "struct IEntitlementsManagerBase.Entitlement", + components: [ + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "moduleAddress", + type: "address", + internalType: "address", + }, + { + name: "moduleType", + type: "string", + internalType: "string", + }, + { + name: "isImmutable", + type: "bool", + internalType: "bool", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getEntitlementDataByPermission", + inputs: [ + { + name: "permission", + type: "string", + internalType: "string", + }, + ], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct IEntitlementsManager.EntitlementData[]", + components: [ + { + name: "entitlementType", + type: "string", + internalType: "string", + }, + { + name: "entitlementData", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getEntitlements", + inputs: [], + outputs: [ + { + name: "entitlements", + type: "tuple[]", + internalType: "struct IEntitlementsManagerBase.Entitlement[]", + components: [ + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "moduleAddress", + type: "address", + internalType: "address", + }, + { + name: "moduleType", + type: "string", + internalType: "string", + }, + { + name: "isImmutable", + type: "bool", + internalType: "bool", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isEntitledToChannel", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "user", + type: "address", + internalType: "address", + }, + { + name: "permission", + type: "string", + internalType: "string", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isEntitledToSpace", + inputs: [ + { + name: "user", + type: "address", + internalType: "address", + }, + { + name: "permission", + type: "string", + internalType: "string", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "removeEntitlementModule", + inputs: [ + { + name: "entitlement", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "EntitlementModuleAdded", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "entitlement", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "EntitlementModuleRemoved", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "entitlement", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, +] as const; + +export class IEntitlementsManager__factory { + static readonly abi = _abi; + static createInterface(): IEntitlementsManagerInterface { + return new utils.Interface(_abi) as IEntitlementsManagerInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IEntitlementsManager { + return new Contract( + address, + _abi, + signerOrProvider + ) as IEntitlementsManager; + } +} diff --git a/packages/generated/v3/typings/factories/IMulticall__factory.ts b/packages/generated/v3/typings/factories/IMulticall__factory.ts new file mode 100644 index 000000000..0782e9fda --- /dev/null +++ b/packages/generated/v3/typings/factories/IMulticall__factory.ts @@ -0,0 +1,42 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IMulticall, IMulticallInterface } from "../IMulticall"; + +const _abi = [ + { + type: "function", + name: "multicall", + inputs: [ + { + name: "data", + type: "bytes[]", + internalType: "bytes[]", + }, + ], + outputs: [ + { + name: "results", + type: "bytes[]", + internalType: "bytes[]", + }, + ], + stateMutability: "nonpayable", + }, +] as const; + +export class IMulticall__factory { + static readonly abi = _abi; + static createInterface(): IMulticallInterface { + return new utils.Interface(_abi) as IMulticallInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IMulticall { + return new Contract(address, _abi, signerOrProvider) as IMulticall; + } +} diff --git a/packages/generated/v3/typings/factories/INodeRegistry__factory.ts b/packages/generated/v3/typings/factories/INodeRegistry__factory.ts new file mode 100644 index 000000000..f45e4dd09 --- /dev/null +++ b/packages/generated/v3/typings/factories/INodeRegistry__factory.ts @@ -0,0 +1,273 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { INodeRegistry, INodeRegistryInterface } from "../INodeRegistry"; + +const _abi = [ + { + type: "function", + name: "getAllNodeAddresses", + inputs: [], + outputs: [ + { + name: "", + type: "address[]", + internalType: "address[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getAllNodes", + inputs: [], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct Node[]", + components: [ + { + name: "status", + type: "uint8", + internalType: "enum NodeStatus", + }, + { + name: "url", + type: "string", + internalType: "string", + }, + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getNode", + inputs: [ + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct Node", + components: [ + { + name: "status", + type: "uint8", + internalType: "enum NodeStatus", + }, + { + name: "url", + type: "string", + internalType: "string", + }, + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getNodeCount", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "registerNode", + inputs: [ + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + { + name: "url", + type: "string", + internalType: "string", + }, + { + name: "status", + type: "uint8", + internalType: "enum NodeStatus", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "removeNode", + inputs: [ + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateNodeStatus", + inputs: [ + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + { + name: "status", + type: "uint8", + internalType: "enum NodeStatus", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateNodeUrl", + inputs: [ + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + { + name: "url", + type: "string", + internalType: "string", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "NodeAdded", + inputs: [ + { + name: "nodeAddress", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "url", + type: "string", + indexed: false, + internalType: "string", + }, + { + name: "status", + type: "uint8", + indexed: false, + internalType: "enum NodeStatus", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "NodeRemoved", + inputs: [ + { + name: "nodeAddress", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "NodeStatusUpdated", + inputs: [ + { + name: "nodeAddress", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "status", + type: "uint8", + indexed: false, + internalType: "enum NodeStatus", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "NodeUrlUpdated", + inputs: [ + { + name: "nodeAddress", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "url", + type: "string", + indexed: false, + internalType: "string", + }, + ], + anonymous: false, + }, +] as const; + +export class INodeRegistry__factory { + static readonly abi = _abi; + static createInterface(): INodeRegistryInterface { + return new utils.Interface(_abi) as INodeRegistryInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): INodeRegistry { + return new Contract(address, _abi, signerOrProvider) as INodeRegistry; + } +} diff --git a/packages/generated/v3/typings/factories/IOperatorRegistry__factory.ts b/packages/generated/v3/typings/factories/IOperatorRegistry__factory.ts new file mode 100644 index 000000000..901808656 --- /dev/null +++ b/packages/generated/v3/typings/factories/IOperatorRegistry__factory.ts @@ -0,0 +1,97 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { + IOperatorRegistry, + IOperatorRegistryInterface, +} from "../IOperatorRegistry"; + +const _abi = [ + { + type: "function", + name: "approveOperator", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "isOperator", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "removeOperator", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "OperatorAdded", + inputs: [ + { + name: "operatorAddress", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorRemoved", + inputs: [ + { + name: "operatorAddress", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, +] as const; + +export class IOperatorRegistry__factory { + static readonly abi = _abi; + static createInterface(): IOperatorRegistryInterface { + return new utils.Interface(_abi) as IOperatorRegistryInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IOperatorRegistry { + return new Contract(address, _abi, signerOrProvider) as IOperatorRegistry; + } +} diff --git a/packages/generated/v3/typings/factories/IPausable__factory.ts b/packages/generated/v3/typings/factories/IPausable__factory.ts new file mode 100644 index 000000000..2e779658e --- /dev/null +++ b/packages/generated/v3/typings/factories/IPausable__factory.ts @@ -0,0 +1,86 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IPausable, IPausableInterface } from "../IPausable"; + +const _abi = [ + { + type: "function", + name: "pause", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "paused", + inputs: [], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "unpause", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "Paused", + inputs: [ + { + name: "account", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Unpaused", + inputs: [ + { + name: "account", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "Pausable__NotPaused", + inputs: [], + }, + { + type: "error", + name: "Pausable__Paused", + inputs: [], + }, +] as const; + +export class IPausable__factory { + static readonly abi = _abi; + static createInterface(): IPausableInterface { + return new utils.Interface(_abi) as IPausableInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IPausable { + return new Contract(address, _abi, signerOrProvider) as IPausable; + } +} diff --git a/packages/generated/v3/typings/factories/IPricingModules__factory.ts b/packages/generated/v3/typings/factories/IPricingModules__factory.ts new file mode 100644 index 000000000..7ccfb3f8c --- /dev/null +++ b/packages/generated/v3/typings/factories/IPricingModules__factory.ts @@ -0,0 +1,151 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { + IPricingModules, + IPricingModulesInterface, +} from "../IPricingModules"; + +const _abi = [ + { + type: "function", + name: "addPricingModule", + inputs: [ + { + name: "module", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "isPricingModule", + inputs: [ + { + name: "module", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "listPricingModules", + inputs: [], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct IPricingModulesBase.PricingModule[]", + components: [ + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "description", + type: "string", + internalType: "string", + }, + { + name: "module", + type: "address", + internalType: "address", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "removePricingModule", + inputs: [ + { + name: "module", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "PricingModuleAdded", + inputs: [ + { + name: "module", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "PricingModuleRemoved", + inputs: [ + { + name: "module", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "PricingModuleUpdated", + inputs: [ + { + name: "module", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "InvalidPricingModule", + inputs: [ + { + name: "module", + type: "address", + internalType: "address", + }, + ], + }, +] as const; + +export class IPricingModules__factory { + static readonly abi = _abi; + static createInterface(): IPricingModulesInterface { + return new utils.Interface(_abi) as IPricingModulesInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IPricingModules { + return new Contract(address, _abi, signerOrProvider) as IPricingModules; + } +} diff --git a/packages/generated/v3/typings/factories/IProxyManager__factory.ts b/packages/generated/v3/typings/factories/IProxyManager__factory.ts new file mode 100644 index 000000000..e4a1843ce --- /dev/null +++ b/packages/generated/v3/typings/factories/IProxyManager__factory.ts @@ -0,0 +1,79 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IProxyManager, IProxyManagerInterface } from "../IProxyManager"; + +const _abi = [ + { + type: "function", + name: "getImplementation", + inputs: [ + { + name: "selector", + type: "bytes4", + internalType: "bytes4", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "setImplementation", + inputs: [ + { + name: "implementation", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "ProxyManager__ImplementationSet", + inputs: [ + { + name: "implementation", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "ProxyManager__NotContract", + inputs: [ + { + name: "implementation", + type: "address", + internalType: "address", + }, + ], + }, +] as const; + +export class IProxyManager__factory { + static readonly abi = _abi; + static createInterface(): IProxyManagerInterface { + return new utils.Interface(_abi) as IProxyManagerInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IProxyManager { + return new Contract(address, _abi, signerOrProvider) as IProxyManager; + } +} diff --git a/packages/generated/v3/typings/factories/IRoles__factory.ts b/packages/generated/v3/typings/factories/IRoles__factory.ts new file mode 100644 index 000000000..265f00671 --- /dev/null +++ b/packages/generated/v3/typings/factories/IRoles__factory.ts @@ -0,0 +1,407 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IRoles, IRolesInterface } from "../IRoles"; + +const _abi = [ + { + type: "function", + name: "addPermissionsToRole", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "permissions", + type: "string[]", + internalType: "string[]", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "addRoleToEntitlement", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "entitlement", + type: "tuple", + internalType: "struct IRolesBase.CreateEntitlement", + components: [ + { + name: "module", + type: "address", + internalType: "contract IEntitlement", + }, + { + name: "data", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "createRole", + inputs: [ + { + name: "roleName", + type: "string", + internalType: "string", + }, + { + name: "permissions", + type: "string[]", + internalType: "string[]", + }, + { + name: "entitlements", + type: "tuple[]", + internalType: "struct IRolesBase.CreateEntitlement[]", + components: [ + { + name: "module", + type: "address", + internalType: "contract IEntitlement", + }, + { + name: "data", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + outputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "getPermissionsByRoleId", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "permissions", + type: "string[]", + internalType: "string[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getRoleById", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "role", + type: "tuple", + internalType: "struct IRolesBase.Role", + components: [ + { + name: "id", + type: "uint256", + internalType: "uint256", + }, + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "disabled", + type: "bool", + internalType: "bool", + }, + { + name: "permissions", + type: "string[]", + internalType: "string[]", + }, + { + name: "entitlements", + type: "address[]", + internalType: "contract IEntitlement[]", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getRoles", + inputs: [], + outputs: [ + { + name: "roles", + type: "tuple[]", + internalType: "struct IRolesBase.Role[]", + components: [ + { + name: "id", + type: "uint256", + internalType: "uint256", + }, + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "disabled", + type: "bool", + internalType: "bool", + }, + { + name: "permissions", + type: "string[]", + internalType: "string[]", + }, + { + name: "entitlements", + type: "address[]", + internalType: "contract IEntitlement[]", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "removePermissionsFromRole", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "permissions", + type: "string[]", + internalType: "string[]", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "removeRole", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "removeRoleFromEntitlement", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "entitlement", + type: "tuple", + internalType: "struct IRolesBase.CreateEntitlement", + components: [ + { + name: "module", + type: "address", + internalType: "contract IEntitlement", + }, + { + name: "data", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateRole", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "roleName", + type: "string", + internalType: "string", + }, + { + name: "permissions", + type: "string[]", + internalType: "string[]", + }, + { + name: "entitlements", + type: "tuple[]", + internalType: "struct IRolesBase.CreateEntitlement[]", + components: [ + { + name: "module", + type: "address", + internalType: "contract IEntitlement", + }, + { + name: "data", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "RoleCreated", + inputs: [ + { + name: "creator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "roleId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "RoleRemoved", + inputs: [ + { + name: "remover", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "roleId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "RoleUpdated", + inputs: [ + { + name: "updater", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "roleId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "Roles__EntitlementAlreadyExists", + inputs: [], + }, + { + type: "error", + name: "Roles__EntitlementDoesNotExist", + inputs: [], + }, + { + type: "error", + name: "Roles__InvalidEntitlementAddress", + inputs: [], + }, + { + type: "error", + name: "Roles__InvalidPermission", + inputs: [], + }, + { + type: "error", + name: "Roles__PermissionAlreadyExists", + inputs: [], + }, + { + type: "error", + name: "Roles__PermissionDoesNotExist", + inputs: [], + }, + { + type: "error", + name: "Roles__RoleDoesNotExist", + inputs: [], + }, +] as const; + +export class IRoles__factory { + static readonly abi = _abi; + static createInterface(): IRolesInterface { + return new utils.Interface(_abi) as IRolesInterface; + } + static connect(address: string, signerOrProvider: Signer | Provider): IRoles { + return new Contract(address, _abi, signerOrProvider) as IRoles; + } +} diff --git a/packages/generated/v3/typings/factories/IRuleEntitlement__factory.ts b/packages/generated/v3/typings/factories/IRuleEntitlement__factory.ts new file mode 100644 index 000000000..3fea9c719 --- /dev/null +++ b/packages/generated/v3/typings/factories/IRuleEntitlement__factory.ts @@ -0,0 +1,580 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { + IRuleEntitlement, + IRuleEntitlementInterface, +} from "../IRuleEntitlement"; + +const _abi = [ + { + type: "function", + name: "description", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "encodeRuleData", + inputs: [ + { + name: "data", + type: "tuple", + internalType: "struct IRuleEntitlement.RuleData", + components: [ + { + name: "operations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.Operation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CombinedOperationType", + }, + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + name: "checkOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.CheckOperation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CheckOperationType", + }, + { + name: "chainId", + type: "uint256", + internalType: "uint256", + }, + { + name: "contractAddress", + type: "address", + internalType: "address", + }, + { + name: "threshold", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "logicalOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.LogicalOperation[]", + components: [ + { + name: "logOpType", + type: "uint8", + internalType: "enum IRuleEntitlement.LogicalOperationType", + }, + { + name: "leftOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "rightOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "bytes", + internalType: "bytes", + }, + ], + stateMutability: "pure", + }, + { + type: "function", + name: "getCheckOperations", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct IRuleEntitlement.CheckOperation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CheckOperationType", + }, + { + name: "chainId", + type: "uint256", + internalType: "uint256", + }, + { + name: "contractAddress", + type: "address", + internalType: "address", + }, + { + name: "threshold", + type: "uint256", + internalType: "uint256", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getEntitlementDataByRoleId", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "bytes", + internalType: "bytes", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getLogicalOperations", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct IRuleEntitlement.LogicalOperation[]", + components: [ + { + name: "logOpType", + type: "uint8", + internalType: "enum IRuleEntitlement.LogicalOperationType", + }, + { + name: "leftOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "rightOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperations", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct IRuleEntitlement.Operation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CombinedOperationType", + }, + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getRuleData", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "data", + type: "tuple", + internalType: "struct IRuleEntitlement.RuleData", + components: [ + { + name: "operations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.Operation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CombinedOperationType", + }, + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + name: "checkOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.CheckOperation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CheckOperationType", + }, + { + name: "chainId", + type: "uint256", + internalType: "uint256", + }, + { + name: "contractAddress", + type: "address", + internalType: "address", + }, + { + name: "threshold", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "logicalOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.LogicalOperation[]", + components: [ + { + name: "logOpType", + type: "uint8", + internalType: "enum IRuleEntitlement.LogicalOperationType", + }, + { + name: "leftOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "rightOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "initialize", + inputs: [ + { + name: "space", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "isCrosschain", + inputs: [], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isEntitled", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "user", + type: "address[]", + internalType: "address[]", + }, + { + name: "permission", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "moduleType", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "name", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "removeEntitlement", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setEntitlement", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "entitlementData", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "error", + name: "CheckOperationsLimitReaced", + inputs: [ + { + name: "limit", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "Entitlement__InvalidValue", + inputs: [], + }, + { + type: "error", + name: "Entitlement__NotAllowed", + inputs: [], + }, + { + type: "error", + name: "Entitlement__NotMember", + inputs: [], + }, + { + type: "error", + name: "Entitlement__ValueAlreadyExists", + inputs: [], + }, + { + type: "error", + name: "InvalidCheckOperationIndex", + inputs: [ + { + name: "operationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "checkOperationsLength", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + type: "error", + name: "InvalidLeftOperationIndex", + inputs: [ + { + name: "leftOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "currentOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + type: "error", + name: "InvalidLogicalOperationIndex", + inputs: [ + { + name: "operationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "logicalOperationsLength", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + type: "error", + name: "InvalidOperationType", + inputs: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CombinedOperationType", + }, + ], + }, + { + type: "error", + name: "InvalidRightOperationIndex", + inputs: [ + { + name: "rightOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "currentOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + type: "error", + name: "LogicalOperationLimitReached", + inputs: [ + { + name: "limit", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "OperationsLimitReached", + inputs: [ + { + name: "limit", + type: "uint256", + internalType: "uint256", + }, + ], + }, +] as const; + +export class IRuleEntitlement__factory { + static readonly abi = _abi; + static createInterface(): IRuleEntitlementInterface { + return new utils.Interface(_abi) as IRuleEntitlementInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IRuleEntitlement { + return new Contract(address, _abi, signerOrProvider) as IRuleEntitlement; + } +} diff --git a/packages/generated/v3/typings/factories/ISpaceOwner__factory.ts b/packages/generated/v3/typings/factories/ISpaceOwner__factory.ts new file mode 100644 index 000000000..d0c55e881 --- /dev/null +++ b/packages/generated/v3/typings/factories/ISpaceOwner__factory.ts @@ -0,0 +1,191 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { ISpaceOwner, ISpaceOwnerInterface } from "../ISpaceOwner"; + +const _abi = [ + { + type: "function", + name: "getFactory", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getSpaceInfo", + inputs: [ + { + name: "space", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct ISpaceOwnerBase.Space", + components: [ + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "uri", + type: "string", + internalType: "string", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + { + name: "createdAt", + type: "uint256", + internalType: "uint256", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "mintSpace", + inputs: [ + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "uri", + type: "string", + internalType: "string", + }, + { + name: "space", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "nextTokenId", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "setFactory", + inputs: [ + { + name: "factory", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateSpaceInfo", + inputs: [ + { + name: "space", + type: "address", + internalType: "address", + }, + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "uri", + type: "string", + internalType: "string", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "SpaceOwner__SetFactory", + inputs: [ + { + name: "factory", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "SpaceOwner__UpdateSpace", + inputs: [ + { + name: "space", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "SpaceOwner__OnlyFactoryAllowed", + inputs: [], + }, + { + type: "error", + name: "SpaceOwner__OnlySpaceOwnerAllowed", + inputs: [], + }, +] as const; + +export class ISpaceOwner__factory { + static readonly abi = _abi; + static createInterface(): ISpaceOwnerInterface { + return new utils.Interface(_abi) as ISpaceOwnerInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): ISpaceOwner { + return new Contract(address, _abi, signerOrProvider) as ISpaceOwner; + } +} diff --git a/packages/generated/v3/typings/factories/IStreamRegistry__factory.ts b/packages/generated/v3/typings/factories/IStreamRegistry__factory.ts new file mode 100644 index 000000000..6921eec42 --- /dev/null +++ b/packages/generated/v3/typings/factories/IStreamRegistry__factory.ts @@ -0,0 +1,574 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { + IStreamRegistry, + IStreamRegistryInterface, +} from "../IStreamRegistry"; + +const _abi = [ + { + type: "function", + name: "allocateStream", + inputs: [ + { + name: "streamId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "nodes", + type: "address[]", + internalType: "address[]", + }, + { + name: "genesisMiniblockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "genesisMiniblock", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "getAllStreamIds", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32[]", + internalType: "bytes32[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getAllStreams", + inputs: [], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct StreamWithId[]", + components: [ + { + name: "id", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "stream", + type: "tuple", + internalType: "struct Stream", + components: [ + { + name: "lastMiniblockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "lastMiniblockNum", + type: "uint64", + internalType: "uint64", + }, + { + name: "reserved0", + type: "uint64", + internalType: "uint64", + }, + { + name: "flags", + type: "uint64", + internalType: "uint64", + }, + { + name: "nodes", + type: "address[]", + internalType: "address[]", + }, + ], + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getPaginatedStreams", + inputs: [ + { + name: "start", + type: "uint256", + internalType: "uint256", + }, + { + name: "stop", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct StreamWithId[]", + components: [ + { + name: "id", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "stream", + type: "tuple", + internalType: "struct Stream", + components: [ + { + name: "lastMiniblockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "lastMiniblockNum", + type: "uint64", + internalType: "uint64", + }, + { + name: "reserved0", + type: "uint64", + internalType: "uint64", + }, + { + name: "flags", + type: "uint64", + internalType: "uint64", + }, + { + name: "nodes", + type: "address[]", + internalType: "address[]", + }, + ], + }, + ], + }, + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getStream", + inputs: [ + { + name: "streamId", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct Stream", + components: [ + { + name: "lastMiniblockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "lastMiniblockNum", + type: "uint64", + internalType: "uint64", + }, + { + name: "reserved0", + type: "uint64", + internalType: "uint64", + }, + { + name: "flags", + type: "uint64", + internalType: "uint64", + }, + { + name: "nodes", + type: "address[]", + internalType: "address[]", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getStreamByIndex", + inputs: [ + { + name: "i", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct StreamWithId", + components: [ + { + name: "id", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "stream", + type: "tuple", + internalType: "struct Stream", + components: [ + { + name: "lastMiniblockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "lastMiniblockNum", + type: "uint64", + internalType: "uint64", + }, + { + name: "reserved0", + type: "uint64", + internalType: "uint64", + }, + { + name: "flags", + type: "uint64", + internalType: "uint64", + }, + { + name: "nodes", + type: "address[]", + internalType: "address[]", + }, + ], + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getStreamCount", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getStreamWithGenesis", + inputs: [ + { + name: "streamId", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct Stream", + components: [ + { + name: "lastMiniblockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "lastMiniblockNum", + type: "uint64", + internalType: "uint64", + }, + { + name: "reserved0", + type: "uint64", + internalType: "uint64", + }, + { + name: "flags", + type: "uint64", + internalType: "uint64", + }, + { + name: "nodes", + type: "address[]", + internalType: "address[]", + }, + ], + }, + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "", + type: "bytes", + internalType: "bytes", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getStreamsOnNode", + inputs: [ + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct StreamWithId[]", + components: [ + { + name: "id", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "stream", + type: "tuple", + internalType: "struct Stream", + components: [ + { + name: "lastMiniblockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "lastMiniblockNum", + type: "uint64", + internalType: "uint64", + }, + { + name: "reserved0", + type: "uint64", + internalType: "uint64", + }, + { + name: "flags", + type: "uint64", + internalType: "uint64", + }, + { + name: "nodes", + type: "address[]", + internalType: "address[]", + }, + ], + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "placeStreamOnNode", + inputs: [ + { + name: "streamId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "removeStreamFromNode", + inputs: [ + { + name: "streamId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "nodeAddress", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setStreamLastMiniblock", + inputs: [ + { + name: "streamId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "prevMiniBlockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "lastMiniblockHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "lastMiniblockNum", + type: "uint64", + internalType: "uint64", + }, + { + name: "isSealed", + type: "bool", + internalType: "bool", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "StreamAllocated", + inputs: [ + { + name: "streamId", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + { + name: "nodes", + type: "address[]", + indexed: false, + internalType: "address[]", + }, + { + name: "genesisMiniblockHash", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + { + name: "genesisMiniblock", + type: "bytes", + indexed: false, + internalType: "bytes", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "StreamLastMiniblockUpdated", + inputs: [ + { + name: "streamId", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + { + name: "lastMiniblockHash", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + { + name: "lastMiniblockNum", + type: "uint64", + indexed: false, + internalType: "uint64", + }, + { + name: "isSealed", + type: "bool", + indexed: false, + internalType: "bool", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "StreamPlacementUpdated", + inputs: [ + { + name: "streamId", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + { + name: "nodeAddress", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "isAdded", + type: "bool", + indexed: false, + internalType: "bool", + }, + ], + anonymous: false, + }, +] as const; + +export class IStreamRegistry__factory { + static readonly abi = _abi; + static createInterface(): IStreamRegistryInterface { + return new utils.Interface(_abi) as IStreamRegistryInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IStreamRegistry { + return new Contract(address, _abi, signerOrProvider) as IStreamRegistry; + } +} diff --git a/packages/generated/v3/typings/factories/IWalletLink__factory.ts b/packages/generated/v3/typings/factories/IWalletLink__factory.ts new file mode 100644 index 000000000..4c9f56053 --- /dev/null +++ b/packages/generated/v3/typings/factories/IWalletLink__factory.ts @@ -0,0 +1,338 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { IWalletLink, IWalletLinkInterface } from "../IWalletLink"; + +const _abi = [ + { + type: "function", + name: "checkIfLinked", + inputs: [ + { + name: "rootKey", + type: "address", + internalType: "address", + }, + { + name: "wallet", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getLatestNonceForRootKey", + inputs: [ + { + name: "rootKey", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getRootKeyForWallet", + inputs: [ + { + name: "wallet", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "rootKey", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getWalletsByRootKey", + inputs: [ + { + name: "rootKey", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "wallets", + type: "address[]", + internalType: "address[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "linkCallerToRootKey", + inputs: [ + { + name: "rootWallet", + type: "tuple", + internalType: "struct IWalletLinkBase.LinkedWallet", + components: [ + { + name: "addr", + type: "address", + internalType: "address", + }, + { + name: "signature", + type: "bytes", + internalType: "bytes", + }, + ], + }, + { + name: "nonce", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "linkWalletToRootKey", + inputs: [ + { + name: "wallet", + type: "tuple", + internalType: "struct IWalletLinkBase.LinkedWallet", + components: [ + { + name: "addr", + type: "address", + internalType: "address", + }, + { + name: "signature", + type: "bytes", + internalType: "bytes", + }, + ], + }, + { + name: "rootWallet", + type: "tuple", + internalType: "struct IWalletLinkBase.LinkedWallet", + components: [ + { + name: "addr", + type: "address", + internalType: "address", + }, + { + name: "signature", + type: "bytes", + internalType: "bytes", + }, + ], + }, + { + name: "nonce", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "removeLink", + inputs: [ + { + name: "wallet", + type: "address", + internalType: "address", + }, + { + name: "rootWallet", + type: "tuple", + internalType: "struct IWalletLinkBase.LinkedWallet", + components: [ + { + name: "addr", + type: "address", + internalType: "address", + }, + { + name: "signature", + type: "bytes", + internalType: "bytes", + }, + ], + }, + { + name: "nonce", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "LinkWalletToRootKey", + inputs: [ + { + name: "wallet", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "rootKey", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "RemoveLink", + inputs: [ + { + name: "wallet", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "secondWallet", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "WalletLink__CannotLinkToRootWallet", + inputs: [ + { + name: "wallet", + type: "address", + internalType: "address", + }, + { + name: "rootKey", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "WalletLink__CannotLinkToSelf", + inputs: [], + }, + { + type: "error", + name: "WalletLink__CannotRemoveRootWallet", + inputs: [], + }, + { + type: "error", + name: "WalletLink__InvalidAddress", + inputs: [], + }, + { + type: "error", + name: "WalletLink__InvalidSignature", + inputs: [], + }, + { + type: "error", + name: "WalletLink__LinkAlreadyExists", + inputs: [ + { + name: "wallet", + type: "address", + internalType: "address", + }, + { + name: "rootKey", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "WalletLink__LinkedToAnotherRootKey", + inputs: [ + { + name: "wallet", + type: "address", + internalType: "address", + }, + { + name: "rootKey", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "WalletLink__NotLinked", + inputs: [ + { + name: "wallet", + type: "address", + internalType: "address", + }, + { + name: "rootKey", + type: "address", + internalType: "address", + }, + ], + }, +] as const; + +export class IWalletLink__factory { + static readonly abi = _abi; + static createInterface(): IWalletLinkInterface { + return new utils.Interface(_abi) as IWalletLinkInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): IWalletLink { + return new Contract(address, _abi, signerOrProvider) as IWalletLink; + } +} diff --git a/packages/generated/v3/typings/factories/Member__factory.ts b/packages/generated/v3/typings/factories/Member__factory.ts new file mode 100644 index 000000000..5def6f4a5 --- /dev/null +++ b/packages/generated/v3/typings/factories/Member__factory.ts @@ -0,0 +1,877 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Signer, + utils, + Contract, + ContractFactory, + BytesLike, + Overrides, +} from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../common"; +import type { Member, MemberInterface } from "../Member"; + +const _abi = [ + { + type: "constructor", + inputs: [ + { + name: "name_", + type: "string", + internalType: "string", + }, + { + name: "symbol_", + type: "string", + internalType: "string", + }, + { + name: "baseURI_", + type: "string", + internalType: "string", + }, + { + name: "merkleRoot_", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "MINT_PRICE", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "TOTAL_SUPPLY", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "_hasMinted", + inputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "approve", + inputs: [ + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "balanceOf", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "baseURI", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "currentTokenId", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getApproved", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isApprovedForAll", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "name", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "owner", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "ownerOf", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "privateMint", + inputs: [ + { + name: "recipient", + type: "address", + internalType: "address", + }, + { + name: "allowance", + type: "uint256", + internalType: "uint256", + }, + { + name: "proof", + type: "bytes32[]", + internalType: "bytes32[]", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "payable", + }, + { + type: "function", + name: "publicMint", + inputs: [ + { + name: "recipient", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "payable", + }, + { + type: "function", + name: "renounceOwnership", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "safeTransferFrom", + inputs: [ + { + name: "from", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "safeTransferFrom", + inputs: [ + { + name: "from", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + { + name: "data", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setApprovalForAll", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "approved", + type: "bool", + internalType: "bool", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setBaseURI", + inputs: [ + { + name: "baseURI_", + type: "string", + internalType: "string", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "startPublicMint", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "startWaitlistMint", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "supportsInterface", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + internalType: "bytes4", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "symbol", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "tokenURI", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "transferFrom", + inputs: [ + { + name: "from", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "transferOwnership", + inputs: [ + { + name: "newOwner", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "withdrawPayments", + inputs: [ + { + name: "payee", + type: "address", + internalType: "address payable", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "Approval", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "approved", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ApprovalForAll", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "approved", + type: "bool", + indexed: false, + internalType: "bool", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MintStateChanged", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "prevState", + type: "uint8", + indexed: true, + internalType: "enum Member.MintState", + }, + { + name: "newState", + type: "uint8", + indexed: true, + internalType: "enum Member.MintState", + }, + { + name: "timestamp", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Minted", + inputs: [ + { + name: "recipient", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "timestamp", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OwnershipTransferred", + inputs: [ + { + name: "previousOwner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newOwner", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Transfer", + inputs: [ + { + name: "from", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "AlreadyMinted", + inputs: [], + }, + { + type: "error", + name: "ERC721IncorrectOwner", + inputs: [ + { + name: "sender", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + { + name: "owner", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "ERC721InsufficientApproval", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "ERC721InvalidApprover", + inputs: [ + { + name: "approver", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "ERC721InvalidOperator", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "ERC721InvalidOwner", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "ERC721InvalidReceiver", + inputs: [ + { + name: "receiver", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "ERC721InvalidSender", + inputs: [ + { + name: "sender", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "ERC721NonexistentToken", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "InvalidAddress", + inputs: [], + }, + { + type: "error", + name: "InvalidMintState", + inputs: [], + }, + { + type: "error", + name: "InvalidProof", + inputs: [], + }, + { + type: "error", + name: "MaxSupplyReached", + inputs: [], + }, + { + type: "error", + name: "MintPriceNotPaid", + inputs: [], + }, + { + type: "error", + name: "NonExistentTokenURI", + inputs: [], + }, + { + type: "error", + name: "NotAllowed", + inputs: [], + }, + { + type: "error", + name: "OwnableInvalidOwner", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "OwnableUnauthorizedAccount", + inputs: [ + { + name: "account", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "WithdrawTransfer", + inputs: [], + }, +] as const; + +const _bytecode = + "0x60a06040523480156200001157600080fd5b5060405162001d7438038062001d748339810160408190526200003491620001d1565b3384846000620000458382620002fb565b506001620000548282620002fb565b5050506001600160a01b0381166200008657604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6200009181620000b7565b506007620000a08382620002fb565b5060805250506009805460ff1916905550620003c7565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200013157600080fd5b81516001600160401b03808211156200014e576200014e62000109565b604051601f8301601f19908116603f0116810190828211818310171562000179576200017962000109565b81604052838152602092508660208588010111156200019757600080fd5b600091505b83821015620001bb57858201830151818301840152908201906200019c565b6000602085830101528094505050505092915050565b60008060008060808587031215620001e857600080fd5b84516001600160401b03808211156200020057600080fd5b6200020e888389016200011f565b955060208701519150808211156200022557600080fd5b62000233888389016200011f565b945060408701519150808211156200024a57600080fd5b5062000259878288016200011f565b606096909601519497939650505050565b600181811c908216806200027f57607f821691505b602082108103620002a057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002f6576000816000526020600020601f850160051c81016020861015620002d15750805b601f850160051c820191505b81811015620002f257828155600101620002dd565b5050505b505050565b81516001600160401b0381111562000317576200031762000109565b6200032f816200032884546200026a565b84620002a6565b602080601f8311600181146200036757600084156200034e5750858301515b600019600386901b1c1916600185901b178555620002f2565b600085815260208120601f198616915b82811015620003985788860151825594840194600190910190840162000377565b5085821015620003b75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b608051611991620003e3600039600061093a01526119916000f3fe60806040526004361061019b5760003560e01c8063715018a6116100ec578063a839e5011161008a578063c87b56dd11610064578063c87b56dd14610454578063d92d1bd614610474578063e985e9c5146104a4578063f2fde38b146104c457600080fd5b8063a839e50114610403578063b88d4fde14610418578063c002d23d1461043857600080fd5b8063902d55a5116100c6578063902d55a5146103a557806395d89b41146103bb5780639886a902146103d0578063a22cb465146103e357600080fd5b8063715018a61461035d57806376c64c62146103725780638da5cb5b1461038757600080fd5b806331b3eb941161015957806355f804b31161013357806355f804b3146102e85780636352211e146103085780636c0360eb1461032857806370a082311461033d57600080fd5b806331b3eb941461029557806332a93a3a146102b557806342842e0e146102c857600080fd5b80629a9b7b146101a057806301ffc9a7146101c957806306fdde03146101f9578063081812fc1461021b578063095ea7b31461025357806323b872dd14610275575b600080fd5b3480156101ac57600080fd5b506101b6600a5481565b6040519081526020015b60405180910390f35b3480156101d557600080fd5b506101e96101e436600461139c565b6104e4565b60405190151581526020016101c0565b34801561020557600080fd5b5061020e610536565b6040516101c091906113ff565b34801561022757600080fd5b5061023b610236366004611412565b6105c8565b6040516001600160a01b0390911681526020016101c0565b34801561025f57600080fd5b5061027361026e366004611440565b6105f1565b005b34801561028157600080fd5b5061027361029036600461146c565b610600565b3480156102a157600080fd5b506102736102b03660046114ad565b610690565b6101b66102c33660046114ad565b610711565b3480156102d457600080fd5b506102736102e336600461146c565b610748565b3480156102f457600080fd5b50610273610303366004611556565b610763565b34801561031457600080fd5b5061023b610323366004611412565b610777565b34801561033457600080fd5b5061020e610782565b34801561034957600080fd5b506101b66103583660046114ad565b610810565b34801561036957600080fd5b50610273610858565b34801561037e57600080fd5b5061027361086c565b34801561039357600080fd5b506006546001600160a01b031661023b565b3480156103b157600080fd5b506101b66109c481565b3480156103c757600080fd5b5061020e610888565b6101b66103de36600461159f565b610897565b3480156103ef57600080fd5b506102736103fe36600461162b565b610995565b34801561040f57600080fd5b506102736109a0565b34801561042457600080fd5b50610273610433366004611669565b6109bc565b34801561044457600080fd5b506101b667011c37937e08000081565b34801561046057600080fd5b5061020e61046f366004611412565b6109d3565b34801561048057600080fd5b506101e961048f3660046114ad565b60086020526000908152604090205460ff1681565b3480156104b057600080fd5b506101e96104bf3660046116e9565b610a59565b3480156104d057600080fd5b506102736104df3660046114ad565b610a87565b60006001600160e01b031982166380ac58cd60e01b148061051557506001600160e01b03198216635b5e139f60e01b145b8061053057506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461054590611717565b80601f016020809104026020016040519081016040528092919081815260200182805461057190611717565b80156105be5780601f10610593576101008083540402835291602001916105be565b820191906000526020600020905b8154815290600101906020018083116105a157829003601f168201915b5050505050905090565b60006105d382610ac5565b506000828152600460205260409020546001600160a01b0316610530565b6105fc828233610afe565b5050565b6001600160a01b03821661062f57604051633250574960e11b8152600060048201526024015b60405180910390fd5b600061063c838333610b0b565b9050836001600160a01b0316816001600160a01b03161461068a576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610626565b50505050565b610698610c04565b60405147906000906001600160a01b0384169083908381818185875af1925050503d80600081146106e5576040519150601f19603f3d011682016040523d82523d6000602084013e6106ea565b606091505b505090508061070c5760405163d23a9e8960e01b815260040160405180910390fd5b505050565b600061071c82610c31565b610724610c58565b61072c610c80565b61073582610ca4565b61073f6002610cde565b61053082610d25565b61070c838383604051806020016040528060008152506109bc565b61076b610c04565b60076105fc82826117a1565b600061053082610ac5565b6007805461078f90611717565b80601f01602080910402602001604051908101604052809291908181526020018280546107bb90611717565b80156108085780601f106107dd57610100808354040283529160200191610808565b820191906000526020600020905b8154815290600101906020018083116107eb57829003601f168201915b505050505081565b60006001600160a01b03821661083c576040516322718ad960e21b815260006004820152602401610626565b506001600160a01b031660009081526003602052604090205490565b610860610c04565b61086a6000610db1565b565b610874610c04565b61087e6001610cde565b61086a6002610e03565b60606001805461054590611717565b60006108a285610c31565b6108aa610c58565b6108b2610c80565b6108bb85610ca4565b6108c484610e88565b6040516bffffffffffffffffffffffff19606087901b166020820152603481018590526000906054016040516020818303038152906040528051906020012090506109658484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f00000000000000000000000000000000000000000000000000000000000000009250859150610ecd9050565b610982576040516309bde33960e01b815260040160405180910390fd5b61098b86610d25565b9695505050505050565b6105fc338383610ee3565b6109a8610c04565b6109b26000610cde565b61086a6001610e03565b6109c7848484610600565b61068a84848484610f82565b606060006109e083610777565b6001600160a01b031603610a075760405163d872946b60e01b815260040160405180910390fd5b600060078054610a1690611717565b905011610a325760405180602001604052806000815250610530565b6007604051602001610a449190611861565b60405160208183030381529060405292915050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610a8f610c04565b6001600160a01b038116610ab957604051631e4fbdf760e01b815260006004820152602401610626565b610ac281610db1565b50565b6000818152600260205260408120546001600160a01b03168061053057604051637e27328960e01b815260048101849052602401610626565b61070c83838360016110ab565b6000828152600260205260408120546001600160a01b0390811690831615610b3857610b388184866111b1565b6001600160a01b03811615610b7657610b556000856000806110ab565b6001600160a01b038116600090815260036020526040902080546000190190555b6001600160a01b03851615610ba5576001600160a01b0385166000908152600360205260409020805460010190555b60008481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6006546001600160a01b0316331461086a5760405163118cdaa760e01b8152336004820152602401610626565b6001600160a01b038116610ac25760405163e6c4247b60e01b815260040160405180910390fd5b67011c37937e080000341461086a576040516310f0c8f160e11b815260040160405180910390fd5b6109c4600a541061086a5760405163d05cb60960e01b815260040160405180910390fd5b6001600160a01b03811660009081526008602052604090205460ff1615610ac257604051631bbdf5c560e31b815260040160405180910390fd5b806002811115610cf057610cf06118ee565b60095460ff166002811115610d0757610d076118ee565b14610ac25760405163a1f6623960e01b815260040160405180910390fd5b6001600160a01b0381166000908152600860205260408120805460ff19166001179055600a805490819083610d5983611904565b9190505550610d688382611215565b604080518281524260208201526001600160a01b038516917f25b428dfde728ccfaddad7e29e4ac23c24ed7fd1a6e3e3f91894a9a073f5dfff910160405180910390a292915050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6009805460ff811691839160ff19166001836002811115610e2657610e266118ee565b0217905550816002811115610e3d57610e3d6118ee565b816002811115610e4f57610e4f6118ee565b60405142815233907f7a5907205f46c7df4a68b33c1da8921886b57f025f0ec67a42c38d2c2013a7849060200160405180910390a45050565b600060095460ff166002811115610ea157610ea16118ee565b148015610eaf575080600114155b15610ac257604051631eb49d6d60e11b815260040160405180910390fd5b600082610eda858461122f565b14949350505050565b6001600160a01b038216610f1557604051630b61174360e31b81526001600160a01b0383166004820152602401610626565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561068a57604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290610fc490339088908790879060040161192b565b6020604051808303816000875af1925050508015610fff575060408051601f3d908101601f19168201909252610ffc9181019061195e565b60015b611068573d80801561102d576040519150601f19603f3d011682016040523d82523d6000602084013e611032565b606091505b50805160000361106057604051633250574960e11b81526001600160a01b0385166004820152602401610626565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146110a457604051633250574960e11b81526001600160a01b0385166004820152602401610626565b5050505050565b80806110bf57506001600160a01b03821615155b156111815760006110cf84610ac5565b90506001600160a01b038316158015906110fb5750826001600160a01b0316816001600160a01b031614155b801561110e575061110c8184610a59565b155b156111375760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610626565b811561117f5783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6111bc838383611272565b61070c576001600160a01b0383166111ea57604051637e27328960e01b815260048101829052602401610626565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610626565b6105fc8282604051806020016040528060008152506112d8565b600081815b845181101561126a57611260828683815181106112535761125361197b565b60200260200101516112ef565b9150600101611234565b509392505050565b60006001600160a01b038316158015906112d05750826001600160a01b0316846001600160a01b031614806112ac57506112ac8484610a59565b806112d057506000828152600460205260409020546001600160a01b038481169116145b949350505050565b6112e28383611321565b61070c6000848484610f82565b600081831061130b57600082815260208490526040902061131a565b60008381526020839052604090205b9392505050565b6001600160a01b03821661134b57604051633250574960e11b815260006004820152602401610626565b600061135983836000610b0b565b90506001600160a01b0381161561070c576040516339e3563760e11b815260006004820152602401610626565b6001600160e01b031981168114610ac257600080fd5b6000602082840312156113ae57600080fd5b813561131a81611386565b6000815180845260005b818110156113df576020818501810151868301820152016113c3565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061131a60208301846113b9565b60006020828403121561142457600080fd5b5035919050565b6001600160a01b0381168114610ac257600080fd5b6000806040838503121561145357600080fd5b823561145e8161142b565b946020939093013593505050565b60008060006060848603121561148157600080fd5b833561148c8161142b565b9250602084013561149c8161142b565b929592945050506040919091013590565b6000602082840312156114bf57600080fd5b813561131a8161142b565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156114fb576114fb6114ca565b604051601f8501601f19908116603f01168101908282118183101715611523576115236114ca565b8160405280935085815286868601111561153c57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561156857600080fd5b813567ffffffffffffffff81111561157f57600080fd5b8201601f8101841361159057600080fd5b6112d0848235602084016114e0565b600080600080606085870312156115b557600080fd5b84356115c08161142b565b935060208501359250604085013567ffffffffffffffff808211156115e457600080fd5b818701915087601f8301126115f857600080fd5b81358181111561160757600080fd5b8860208260051b850101111561161c57600080fd5b95989497505060200194505050565b6000806040838503121561163e57600080fd5b82356116498161142b565b91506020830135801515811461165e57600080fd5b809150509250929050565b6000806000806080858703121561167f57600080fd5b843561168a8161142b565b9350602085013561169a8161142b565b925060408501359150606085013567ffffffffffffffff8111156116bd57600080fd5b8501601f810187136116ce57600080fd5b6116dd878235602084016114e0565b91505092959194509250565b600080604083850312156116fc57600080fd5b82356117078161142b565b9150602083013561165e8161142b565b600181811c9082168061172b57607f821691505b60208210810361174b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561070c576000816000526020600020601f850160051c8101602086101561177a5750805b601f850160051c820191505b8181101561179957828155600101611786565b505050505050565b815167ffffffffffffffff8111156117bb576117bb6114ca565b6117cf816117c98454611717565b84611751565b602080601f83116001811461180457600084156117ec5750858301515b600019600386901b1c1916600185901b178555611799565b600085815260208120601f198616915b8281101561183357888601518255948401946001909101908401611814565b50858210156118515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600080835461186f81611717565b60018281168015611887576001811461189c576118cb565b60ff19841687528215158302870194506118cb565b8760005260208060002060005b858110156118c25781548a8201529084019082016118a9565b50505082870194505b50506e636f756e63696c6d6574616461746160881b83525050600f019392505050565b634e487b7160e01b600052602160045260246000fd5b60006001820161192457634e487b7160e01b600052601160045260246000fd5b5060010190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061098b908301846113b9565b60006020828403121561197057600080fd5b815161131a81611386565b634e487b7160e01b600052603260045260246000fd"; + +type MemberConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: MemberConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class Member__factory extends ContractFactory { + constructor(...args: MemberConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + baseURI_: PromiseOrValue, + merkleRoot_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy( + name_, + symbol_, + baseURI_, + merkleRoot_, + overrides || {} + ) as Promise; + } + override getDeployTransaction( + name_: PromiseOrValue, + symbol_: PromiseOrValue, + baseURI_: PromiseOrValue, + merkleRoot_: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction( + name_, + symbol_, + baseURI_, + merkleRoot_, + overrides || {} + ); + } + override attach(address: string): Member { + return super.attach(address) as Member; + } + override connect(signer: Signer): Member__factory { + return super.connect(signer) as Member__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): MemberInterface { + return new utils.Interface(_abi) as MemberInterface; + } + static connect(address: string, signerOrProvider: Signer | Provider): Member { + return new Contract(address, _abi, signerOrProvider) as Member; + } +} diff --git a/packages/generated/v3/typings/factories/MembershipFacet__factory.ts b/packages/generated/v3/typings/factories/MembershipFacet__factory.ts new file mode 100644 index 000000000..245698ca3 --- /dev/null +++ b/packages/generated/v3/typings/factories/MembershipFacet__factory.ts @@ -0,0 +1,1844 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../common"; +import type { + MembershipFacet, + MembershipFacetInterface, +} from "../MembershipFacet"; + +const _abi = [ + { + type: "function", + name: "__ERC721A_init", + inputs: [ + { + name: "name_", + type: "string", + internalType: "string", + }, + { + name: "symbol_", + type: "string", + internalType: "string", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "__EntitlementGated_init", + inputs: [ + { + name: "entitlementChecker", + type: "address", + internalType: "contract IEntitlementChecker", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "__Membership_init", + inputs: [ + { + name: "info", + type: "tuple", + internalType: "struct IMembershipBase.Membership", + components: [ + { + name: "name", + type: "string", + internalType: "string", + }, + { + name: "symbol", + type: "string", + internalType: "string", + }, + { + name: "price", + type: "uint256", + internalType: "uint256", + }, + { + name: "maxSupply", + type: "uint256", + internalType: "uint256", + }, + { + name: "duration", + type: "uint64", + internalType: "uint64", + }, + { + name: "currency", + type: "address", + internalType: "address", + }, + { + name: "feeRecipient", + type: "address", + internalType: "address", + }, + { + name: "freeAllocation", + type: "uint256", + internalType: "uint256", + }, + { + name: "pricingModule", + type: "address", + internalType: "address", + }, + ], + }, + { + name: "spaceFactory", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "_getMembershipCurrency", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "_getMembershipFreeAllocation", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "_getMembershipImage", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "_getMembershipPrice", + inputs: [ + { + name: "totalSupply", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "_getMembershipSupplyLimit", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "_getPricingModule", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "_getSpaceFactory", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "_setMembershipFreeAllocation", + inputs: [ + { + name: "newAllocation", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "_setMembershipSupplyLimit", + inputs: [ + { + name: "newLimit", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "_setPricingModule", + inputs: [ + { + name: "newPricingModule", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "approve", + inputs: [ + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "balanceOf", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "expiresAt", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getApproved", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMembershipCurrency", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMembershipDuration", + inputs: [], + outputs: [ + { + name: "", + type: "uint64", + internalType: "uint64", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMembershipFreeAllocation", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMembershipImage", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMembershipLimit", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMembershipPrice", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMembershipPricingModule", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMembershipRenewalPrice", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getRuleData", + inputs: [ + { + name: "transactionId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct IRuleEntitlement.RuleData", + components: [ + { + name: "operations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.Operation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CombinedOperationType", + }, + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + name: "checkOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.CheckOperation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CheckOperationType", + }, + { + name: "chainId", + type: "uint256", + internalType: "uint256", + }, + { + name: "contractAddress", + type: "address", + internalType: "address", + }, + { + name: "threshold", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "logicalOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.LogicalOperation[]", + components: [ + { + name: "logOpType", + type: "uint8", + internalType: "enum IRuleEntitlement.LogicalOperationType", + }, + { + name: "leftOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "rightOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getSpaceFactory", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isApprovedForAll", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "joinSpace", + inputs: [ + { + name: "receiver", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "joinSpaceWithReferral", + inputs: [ + { + name: "receiver", + type: "address", + internalType: "address", + }, + { + name: "referrer", + type: "address", + internalType: "address", + }, + { + name: "referralCode", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "name", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "ownerOf", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "postEntitlementCheckResult", + inputs: [ + { + name: "transactionId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "result", + type: "uint8", + internalType: "enum IEntitlementGatedBase.NodeVoteStatus", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "renewMembership", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "safeTransferFrom", + inputs: [ + { + name: "from", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "safeTransferFrom", + inputs: [ + { + name: "from", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + { + name: "_data", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "setApprovalForAll", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "approved", + type: "bool", + internalType: "bool", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setMembershipFreeAllocation", + inputs: [ + { + name: "newAllocation", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setMembershipImage", + inputs: [ + { + name: "newImage", + type: "string", + internalType: "string", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setMembershipLimit", + inputs: [ + { + name: "newLimit", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setMembershipPrice", + inputs: [ + { + name: "newPrice", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setMembershipPricingModule", + inputs: [ + { + name: "pricingModule", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "symbol", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "tokenURI", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "totalSupply", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "transferFrom", + inputs: [ + { + name: "from", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "withdraw", + inputs: [ + { + name: "account", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "Approval", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "approved", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ApprovalForAll", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "approved", + type: "bool", + indexed: false, + internalType: "bool", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Banned", + inputs: [ + { + name: "moderator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ConsecutiveTransfer", + inputs: [ + { + name: "fromTokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + { + name: "toTokenId", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "from", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "EntitlementCheckResultPosted", + inputs: [ + { + name: "transactionId", + type: "bytes32", + indexed: true, + internalType: "bytes32", + }, + { + name: "result", + type: "uint8", + indexed: false, + internalType: "enum IEntitlementGatedBase.NodeVoteStatus", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceAdded", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceRemoved", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MembershipCurrencyUpdated", + inputs: [ + { + name: "currency", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MembershipFeeRecipientUpdated", + inputs: [ + { + name: "recipient", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MembershipFreeAllocationUpdated", + inputs: [ + { + name: "allocation", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MembershipLimitUpdated", + inputs: [ + { + name: "limit", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MembershipPriceUpdated", + inputs: [ + { + name: "price", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MembershipTokenIssued", + inputs: [ + { + name: "recipient", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MembershipTokenRejected", + inputs: [ + { + name: "recipient", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MembershipWithdrawal", + inputs: [ + { + name: "recipient", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "amount", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Membership__ReferralCreated", + inputs: [ + { + name: "code", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + { + name: "bps", + type: "uint16", + indexed: false, + internalType: "uint16", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Membership__ReferralRemoved", + inputs: [ + { + name: "code", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Membership__ReferralTimeCreated", + inputs: [ + { + name: "code", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + { + name: "bps", + type: "uint16", + indexed: false, + internalType: "uint16", + }, + { + name: "startTime", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "endTime", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OwnershipTransferred", + inputs: [ + { + name: "previousOwner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newOwner", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Paused", + inputs: [ + { + name: "account", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "RoleCreated", + inputs: [ + { + name: "creator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "roleId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "RoleRemoved", + inputs: [ + { + name: "remover", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "roleId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "RoleUpdated", + inputs: [ + { + name: "updater", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "roleId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "SubscriptionUpdate", + inputs: [ + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + { + name: "expiration", + type: "uint64", + indexed: false, + internalType: "uint64", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Transfer", + inputs: [ + { + name: "from", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Unbanned", + inputs: [ + { + name: "moderator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Unpaused", + inputs: [ + { + name: "account", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "AddressEmptyCode", + inputs: [ + { + name: "target", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "AddressInsufficientBalance", + inputs: [ + { + name: "account", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "ApprovalCallerNotOwnerNorApproved", + inputs: [], + }, + { + type: "error", + name: "ApprovalQueryForNonexistentToken", + inputs: [], + }, + { + type: "error", + name: "BalanceQueryForZeroAddress", + inputs: [], + }, + { + type: "error", + name: "Banning__AlreadyBanned", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "Banning__CannotBanSelf", + inputs: [], + }, + { + type: "error", + name: "Banning__InvalidTokenId", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "Banning__NotBanned", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "Dispatcher__InvalidCaller", + inputs: [], + }, + { + type: "error", + name: "Dispatcher__InvalidValue", + inputs: [], + }, + { + type: "error", + name: "ERC5643__DurationZero", + inputs: [], + }, + { + type: "error", + name: "ERC5643__InvalidTokenId", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "ERC5643__NotApprovedOrOwner", + inputs: [], + }, + { + type: "error", + name: "ERC5643__SubscriptionNotRenewable", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + type: "error", + name: "EntitlementGated_InvalidAddress", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_NodeAlreadyVoted", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_NodeNotFound", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_TransactionCheckAlreadyCompleted", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_TransactionCheckAlreadyRegistered", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_TransactionNotRegistered", + inputs: [], + }, + { + type: "error", + name: "Entitlement__InvalidValue", + inputs: [], + }, + { + type: "error", + name: "Entitlement__NotAllowed", + inputs: [], + }, + { + type: "error", + name: "Entitlement__NotMember", + inputs: [], + }, + { + type: "error", + name: "Entitlement__ValueAlreadyExists", + inputs: [], + }, + { + type: "error", + name: "FailedInnerCall", + inputs: [], + }, + { + type: "error", + name: "Initializable_InInitializingState", + inputs: [], + }, + { + type: "error", + name: "Initializable_NotInInitializingState", + inputs: [], + }, + { + type: "error", + name: "Introspection_AlreadySupported", + inputs: [], + }, + { + type: "error", + name: "Introspection_NotSupported", + inputs: [], + }, + { + type: "error", + name: "Membership__AlreadyMember", + inputs: [], + }, + { + type: "error", + name: "Membership__InsufficientAllowance", + inputs: [], + }, + { + type: "error", + name: "Membership__InsufficientPayment", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidAddress", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidCurrency", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidDuration", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidFeeRecipient", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidFreeAllocation", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidLimit", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidMaxSupply", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidPrice", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidPricingModule", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidReferralBps", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidReferralCode", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidReferralTime", + inputs: [], + }, + { + type: "error", + name: "Membership__InvalidTokenId", + inputs: [], + }, + { + type: "error", + name: "Membership__MaxSupplyReached", + inputs: [], + }, + { + type: "error", + name: "Membership__NotExpired", + inputs: [], + }, + { + type: "error", + name: "Membership__PriceTooLow", + inputs: [], + }, + { + type: "error", + name: "MintERC2309QuantityExceedsLimit", + inputs: [], + }, + { + type: "error", + name: "MintToZeroAddress", + inputs: [], + }, + { + type: "error", + name: "MintZeroQuantity", + inputs: [], + }, + { + type: "error", + name: "Ownable__NotOwner", + inputs: [ + { + name: "account", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "Ownable__ZeroAddress", + inputs: [], + }, + { + type: "error", + name: "OwnerQueryForNonexistentToken", + inputs: [], + }, + { + type: "error", + name: "OwnershipNotInitializedForExtraData", + inputs: [], + }, + { + type: "error", + name: "Pausable__NotPaused", + inputs: [], + }, + { + type: "error", + name: "Pausable__Paused", + inputs: [], + }, + { + type: "error", + name: "ReentrancyGuard__ReentrantCall", + inputs: [], + }, + { + type: "error", + name: "Roles__EntitlementAlreadyExists", + inputs: [], + }, + { + type: "error", + name: "Roles__EntitlementDoesNotExist", + inputs: [], + }, + { + type: "error", + name: "Roles__InvalidEntitlementAddress", + inputs: [], + }, + { + type: "error", + name: "Roles__InvalidPermission", + inputs: [], + }, + { + type: "error", + name: "Roles__PermissionAlreadyExists", + inputs: [], + }, + { + type: "error", + name: "Roles__PermissionDoesNotExist", + inputs: [], + }, + { + type: "error", + name: "Roles__RoleDoesNotExist", + inputs: [], + }, + { + type: "error", + name: "SafeERC20FailedOperation", + inputs: [ + { + name: "token", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "TransferCallerNotOwnerNorApproved", + inputs: [], + }, + { + type: "error", + name: "TransferFromIncorrectOwner", + inputs: [], + }, + { + type: "error", + name: "TransferToNonERC721ReceiverImplementer", + inputs: [], + }, + { + type: "error", + name: "TransferToZeroAddress", + inputs: [], + }, + { + type: "error", + name: "URIQueryForNonexistentToken", + inputs: [], + }, +] as const; + +const _bytecode = + "0x60806040523480156200001157600080fd5b506200001c62000022565b620000ca565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff16156200006f576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff9081161015620000c757805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6152c880620000da6000396000f3fe6080604052600436106102885760003560e01c806377460cd31161015a578063a22cb465116100c1578063d2f01f191161007a578063d2f01f1914610745578063d33d934514610765578063df9a9fe61461077a578063e847abdd1461079a578063e985e9c5146107af578063f9d5d22c146107df57600080fd5b8063a22cb465146106b5578063ac7ee626146106d5578063b3a5be6d146106ea578063b88d4fde146106ff578063c87b56dd14610712578063c9f7c8331461073257600080fd5b80638c625b06116101135780638c625b061461061657806392c399ff1461062957806393b13cb71461065657806395d600c81461066b57806395d89b411461068057806397fb7c1e1461069557600080fd5b806377460cd31461057757806379dda5851461058c5780637adc9cbe146105a15780637c9669ac146105c15780638120f0ba146105d45780638934207f1461060157600080fd5b80634c2abfbe116101fe57806369d5f38a116101b757806369d5f38a146104cd57806369d9346b146104ed578063702515631461050d578063706b8e091461052257806370a082311461053757806373fc5a051461055757600080fd5b80634c2abfbe1461041857806351cff8d9146104385780635803909f146104585780635becd24a146104785780636352211e14610498578063657e45e8146104b857600080fd5b806317c957091161025057806317c957091461034857806318160ddd1461039d57806323b872dd146103b25780633ded10de146103c557806342842e0e146103e55780634739e805146103f857600080fd5b806306fdde031461028d578063081812fc146102b8578063095ea7b3146102f05780630ef1be5f146103055780631278076a14610325575b600080fd5b34801561029957600080fd5b506102a26107ff565b6040516102af9190614348565b60405180910390f35b3480156102c457600080fd5b506102d86102d336600461435b565b61089a565b6040516001600160a01b0390911681526020016102af565b6103036102fe366004614399565b6108ab565b005b34801561031157600080fd5b506103036103203660046143c5565b6108bb565b34801561033157600080fd5b5061033a61093a565b6040519081526020016102af565b34801561035457600080fd5b5061033a61036336600461435b565b60009081527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce0060205260409020546001600160401b031690565b3480156103a957600080fd5b5061033a61094c565b6103036103c0366004614436565b610956565b3480156103d157600080fd5b5061033a6103e036600461435b565b610b4d565b6103036103f3366004614436565b610cdc565b34801561040457600080fd5b50610303610413366004614484565b610cfc565b34801561042457600080fd5b50610303610433366004614629565b610d65565b34801561044457600080fd5b50610303610453366004614732565b610dc9565b34801561046457600080fd5b5061033a61047336600461435b565b610e6b565b34801561048457600080fd5b5061030361049336600461435b565b610e7e565b3480156104a457600080fd5b506102d86104b336600461435b565b610f03565b3480156104c457600080fd5b506102d8610f0e565b3480156104d957600080fd5b506103036104e836600461435b565b610f18565b3480156104f957600080fd5b50610303610508366004614732565b610fc6565b34801561051957600080fd5b506102d8610ff3565b34801561052e57600080fd5b5061033a61100f565b34801561054357600080fd5b5061033a610552366004614732565b611019565b34801561056357600080fd5b5061030361057236600461435b565b611024565b34801561058357600080fd5b506102d8611034565b34801561059857600080fd5b506102d8611050565b3480156105ad57600080fd5b506103036105bc366004614732565b61105a565b6103036105cf36600461435b565b61109e565b3480156105e057600080fd5b506105e96111fb565b6040516001600160401b0390911681526020016102af565b34801561060d57600080fd5b5061033a611205565b610303610624366004614732565b611218565b34801561063557600080fd5b5061064961064436600461474f565b61162a565b6040516102af9190614862565b34801561066257600080fd5b506102a261165f565b34801561067757600080fd5b5061033a611669565b34801561068c57600080fd5b506102a2611673565b3480156106a157600080fd5b506103036106b036600461435b565b61168b565b3480156106c157600080fd5b506103036106d0366004614909565b6116e0565b3480156106e157600080fd5b506102d861175d565b3480156106f657600080fd5b5061033a611779565b61030361070d366004614942565b611818565b34801561071e57600080fd5b506102a261072d36600461435b565b611862565b610303610740366004614436565b6118f2565b34801561075157600080fd5b506103036107603660046149c1565b611a0c565b34801561077157600080fd5b506102a2611a4e565b34801561078657600080fd5b50610303610795366004614732565b611a66565b3480156107a657600080fd5b506102d8611ab3565b3480156107bb57600080fd5b506107cf6107ca366004614a24565b611abd565b60405190151581526020016102af565b3480156107eb57600080fd5b506103036107fa36600461435b565b611ac9565b6060610809611b0c565b600201805461081790614a52565b80601f016020809104026020016040519081016040528092919081815260200182805461084390614a52565b80156108905780601f1061086557610100808354040283529160200191610890565b820191906000526020600020905b81548152906001019060200180831161087357829003601f168201915b5050505050905090565b60006108a582611b30565b92915050565b6108b782826001611b7d565b5050565b6108c3611c32565b6001600160a01b0316336001600160a01b0316146108fb576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6108b782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611cfc92505050565b60006109476103e0611d13565b905090565b6000610947611d13565b600061096182611d32565b9050836001600160a01b0316816001600160a01b0316146109945760405162a1148160e81b815260040160405180910390fd5b6000806109a084611dcd565b915091506109c581876109b03390565b6001600160a01b039081169116811491141790565b6109f0576109d38633611abd565b6109f057604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610a1757604051633a954ecd60e21b815260040160405180910390fd5b8015610a2257600082555b610a2a611b0c565b6001600160a01b0387166000908152600591909101602052604090208054600019019055610a56611b0c565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b17610a8d611b0c565b60008681526004919091016020526040812091909155600160e11b84169003610b035760018401610abc611b0c565b600082815260049190910160205260408120549003610b0157610add611b0c565b548114610b015783610aed611b0c565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600080610b58611df5565b90506000610b64611779565b905083811115610b78575060009392505050565b6006820154604051639262b1b360e01b815230600482015285916001600160a01b031690639262b1b390602401602060405180830381865afa158015610bc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be69190614a86565b1115610bf6575060009392505050565b60088201546001600160a01b031615610c87576008820154604051635cf4ee9160e01b815260048101839052602481018690526001600160a01b0390911690635cf4ee9190604401602060405180830381865afa158015610c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7f9190614a86565b949350505050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c5b573d6000803e3d6000fd5b610cf783838360405180602001604052806000815250611818565b505050565b60026000805160206152288339815191525403610d2c57604051635db5c7cd60e11b815260040160405180910390fd5b610d43600260008051602061522883398151915255565b610d4e838383611e19565b610cf7600160008051602061522883398151915255565b60008051602061528883398151915254640100000000900460ff16610d9d57604051630ef4733760e31b815260040160405180910390fd5b610dad63421fb7a760e01b6120bc565b610db7828261219a565b6108b7826000015183602001516122bd565b610dd1611c32565b6001600160a01b0316336001600160a01b031614610e04576040516365f4906560e01b81523360048201526024016108f2565b6001600160a01b038116610e2b57604051635fbd571760e01b815260040160405180910390fd5b6000610e3561231f565b905080600003610e5857604051635894b54560e11b815260040160405180910390fd5b6108b7610e63610ff3565b308484612332565b60006108a582610e79611d13565b612378565b610e86611c32565b6001600160a01b0316336001600160a01b031614610eb9576040516365f4906560e01b81523360048201526024016108f2565b6000610ec3611205565b90508015801590610ed357508082115b15610ef15760405163c3983b9160e01b815260040160405180910390fd5b610efa826123be565b6108b782611ac9565b60006108a582611d32565b6000610947610ff3565b610f20611c32565b6001600160a01b0316336001600160a01b031614610f53576040516365f4906560e01b81523360048201526024016108f2565b610f5c81612463565b610f6461175d565b6001600160a01b03166391b7f5ed826040518263ffffffff1660e01b8152600401610f9191815260200190565b600060405180830381600087803b158015610fab57600080fd5b505af1158015610fbf573d6000803e3d6000fd5b5050505050565b80610fcf611df5565b60080180546001600160a01b0319166001600160a01b039290921691909117905550565b6000610ffd611df5565b600401546001600160a01b0316919050565b6000610947611779565b60006108a5826124f1565b8061102d611df5565b6003015550565b600061103e611df5565b600601546001600160a01b0316919050565b6000610947611034565b60008051602061528883398151915254640100000000900460ff1661109257604051630ef4733760e31b815260040160405180910390fd5b61109b81612559565b50565b600260008051602061522883398151915254036110ce57604051635db5c7cd60e11b815260040160405180910390fd5b6110e5600260008051602061522883398151915255565b60006110f082610f03565b90506001600160a01b03811661111957604051635fbd571760e01b815260040160405180910390fd5b60008281527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce0060205260409020546001600160401b0316611158612594565b6001600160401b031661116b4283614ab5565b106111895760405163dce9a1d360e01b815260040160405180910390fd5b600061119784610e79611d13565b905080156111d05760006111ab848361261a565b905060006111b98284614ab5565b905080156111cd576111cb8582612732565b505b50505b6111e1846111dc612594565b6128d0565b50505061109b600160008051602061522883398151915255565b6000610947612594565b600061120f611df5565b60030154905090565b6002600080516020615228833981519152540361124857604051635db5c7cd60e11b815260040160405180910390fd5b61125f600260008051602061522883398151915255565b61126881612999565b60405133606081901b6bffffffffffffffffffffffff191660208301524360348301526000918290605401604051602081830303815290604052805190602001209050600061132b826112ff84866112bf87612a02565b604080516020808201959095526001600160a01b039390931683820152606080840192909252805180840390920182526080909201909152805191012090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905061136d8184876040516020016113599291906001600160a01b0392831681529116602082015260400190565b604051602081830303815290604052612a37565b341561137d5761137d8134612a7e565b60006113a9604051806040016040528060098152602001684a6f696e537061636560b81b815250612b04565b905060005b81518110156115d25760008282815181106113cb576113cb614ac8565b6020026020010151905080604001516115c95760005b8160800151518110156115c75760008260800151828151811061140657611406614ac8565b60200260200101519050806001600160a01b0316632e1b61e46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561144e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114729190614ade565b6115aa576040805160018082528183019092526000916020808301908036833701905050905088816000815181106114ac576114ac614ac8565b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b0316630cf0b533600083604051806040016040528060098152602001684a6f696e537061636560b81b8152506040516020016115109190614afb565b60405160208183030381529060405261152890614b17565b6040518463ffffffff1660e01b815260040161154693929190614b75565b602060405180830381865afa158015611563573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115879190614ade565b156115a45761159587612d4e565b50505050505050505050611613565b506115be565b6115b986828560000151612ea3565b600198505b506001016113e1565b505b506001016113ae565b508461160d576040516001600160a01b038716907f86fd446d5c04e892d58b448a924dcd9c3ece3a5e0d2960b8c35cd475a5595a1f90600090a25b50505050505b61109b600160008051602061522883398151915255565b61164e60405180606001604052806060815260200160608152602001606081525090565b6116588383613152565b9392505050565b6060610947611a4e565b6000610947611205565b606061167d611b0c565b600301805461081790614a52565b611693611c32565b6001600160a01b0316336001600160a01b0316146116c6576040516365f4906560e01b81523360048201526024016108f2565b6116d7816116d2611d13565b61324c565b61109b81611024565b806116e9611b0c565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000611767611df5565b600801546001600160a01b0316919050565b600080611784611df5565b600781015490915080156117985792915050565b8160060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118119190614a86565b9250505090565b611823848484610956565b6001600160a01b0383163b1561185c5761183f8484848461326d565b61185c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061186d82613358565b61188a57604051630a14c4b560e41b815260040160405180910390fd5b60006118a160408051602081019091526000815290565b905080516000036118c15760405180602001604052806000815250611658565b806118cb84613394565b6040516020016118dc929190614b9e565b6040516020818303038152906040529392505050565b6002600080516020615228833981519152540361192257604051635db5c7cd60e11b815260040160405180910390fd5b611939600260008051602061522883398151915255565b61194283612999565b600061194c6133d8565b9050600061195b6103e0611d13565b905080156119dc5761196d82826133e8565b6000611979868361261a565b905060006119878284614ab5565b90506000611993610ff3565b905081156119d85760006119a78388613408565b90506119b5828a8a84612332565b60006119c18285614ab5565b905080156119d5576119d38a82612732565b505b50505b5050505b6119e78560016134bb565b6119f3826111dc612594565b5050610cf7600160008051602061522883398151915255565b60008051602061528883398151915254640100000000900460ff16611a4457604051630ef4733760e31b815260040160405180910390fd5b6108b782826122bd565b6060611a58611df5565b600c01805461081790614a52565b611a6e611c32565b6001600160a01b0316336001600160a01b031614611aa1576040516365f4906560e01b81523360048201526024016108f2565b611aaa816134d5565b61109b81610fc6565b600061094761175d565b6000611658838361358d565b6000611ad3611df5565b6007810183905560405190915082907fab14a23e88fb272313490d4f20d63098e64fd38304c0e07a377db98c2b39b92f90600090a25050565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b6000611b3b82613358565b611b58576040516333d1c03960e21b815260040160405180910390fd5b611b60611b0c565b60009283526006016020525060409020546001600160a01b031690565b6000611b8883610f03565b90508115611bc757336001600160a01b03821614611bc757611baa813361358d565b611bc7576040516367d9dca160e11b815260040160405180910390fd5b83611bd0611b0c565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa158015611cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190614bcd565b91505090565b80611d05611df5565b600c01906108b79082614c32565b600080611d1e611b0c565b60010154611d2a611b0c565b540303919050565b600080611d3d611b0c565b60008481526004820160205260408120549350909150600160e01b83169003611db35781600003611dad5780548310611d8957604051636f96cda160e11b815260040160405180910390fd5b5b600019909201600081815260048401602052604090205490929091508115611d8a575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b6000806000611dda611b0c565b60009485526006016020525050604090912080549092909150565b7fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60090565b60008381526000805160206152088339815191526020526040902080546000805160206151e8833981519152919061010090046001600160a01b03161580611e635750805460ff16155b15611e8157604051637ad5a43960e11b815260040160405180910390fd5b600084815260028201602052604090205460ff1615611eb357604051637912b73960e01b815260040160405180910390fd5b600084815260018201602052604081205481908190815b81811015611ff15760008981526001870160205260408120805483908110611ef457611ef4614ac8565b60009182526020909120018054909150336001600160a01b0390911603611f805760008154600160a01b900460ff166002811115611f3457611f34614771565b14611f52576040516347592a4d60e01b815260040160405180910390fd5b80548990829060ff60a01b1916600160a01b836002811115611f7657611f76614771565b0217905550600195505b60018154600160a01b900460ff166002811115611f9f57611f9f614771565b03611fb65784611fae81614cf1565b955050611fe8565b60028154600160a01b900460ff166002811115611fd557611fd5614771565b03611fe85783611fe481614cf1565b9450505b50600101611eca565b508361201057604051638223a7e960e01b815260040160405180910390fd5b61201b600282614d0a565b831180612031575061202e600282614d0a565b82115b156120b15760008881526002860160205260408120805460ff1916600117905582841161205f576002612062565b60015b905061206e8a826135ca565b897fb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c6338260405161209e9190614d2c565b60405180910390a26120af8a6136a2565b505b505050505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114612149576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055612162565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006121a4611df5565b6006810180546001600160a01b038086166001600160a01b031992831617909255610100860151600884018054919093169082161790915560048201805490911673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1790556060840151600382015560e08401516007820181905590915015612228576122288360e001516123be565b6122368361010001516134d5565b604083015115610cf75761224d8360400151612463565b600881015460408085015190516391b7f5ed60e01b81526001600160a01b03909216916391b7f5ed916122869160040190815260200190565b600060405180830381600087803b1580156122a057600080fd5b505af11580156122b4573d6000803e3d6000fd5b50505050505050565b60008051602061528883398151915254640100000000900460ff166122f557604051630ef4733760e31b815260040160405180910390fd5b6123056380ac58cd60e01b6120bc565b612315635b5e139f60e01b6120bc565b6108b7828261376f565b6000612329611df5565b600a0154905090565b801561185c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b0385160161236c5761236782826137a1565b61185c565b61185c84848484613844565b600080612383611df5565b6000858152600982016020526040902054909150156123b55760008481526009909101602052604090205490506108a5565b610c7f83610b4d565b60006123c8611df5565b90508060060160009054906101000a90046001600160a01b03166001600160a01b0316632cbb9d136040518163ffffffff1660e01b8152600401602060405180830381865afa15801561241f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124439190614a86565b8211156108b75760405163c3983b9160e01b815260040160405180910390fd5b600061246d611034565b6001600160a01b0316630eac306d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ce9190614a86565b9050808210156108b757604051631a23d64760e11b815260040160405180910390fd5b60006001600160a01b03821661251a576040516323d3ad8160e21b815260040160405180910390fd5b6001600160401b0361252a611b0c565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b612569636afd38fd60e11b6120bc565b6000805160206151e883398151915280546001600160a01b0319166001600160a01b03831617905550565b60008061259f611df5565b90508060060160009054906101000a90046001600160a01b03166001600160a01b0316638120f0ba6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190614d3f565b600080612625611df5565b6006810154600480830154604080516301332c8360e61b815290519495506001600160a01b039384169493909116926000928592634ccb20c092818301926020928290030181865afa15801561267f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a39190614bcd565b90506000836001600160a01b0316639f6542aa6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127099190614d5c565b9050612719878261ffff16613897565b955061272783898489612332565b505050505092915050565b60008061273d611df5565b90506000612749610ff3565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03821601612794578382600a0160008282546127849190614d80565b909155508493506108a592505050565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156127dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128019190614a86565b905061280f83883089612332565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015612856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287a9190614a86565b905060006128888383614ab5565b90508781146128aa57604051635894b54560e11b815260040160405180910390fd5b8086600a0160008282546128be9190614d80565b90915550909998505050505050505050565b60008281527f4775a23600034fdd9f073b224f794d51a58b35ba663a9602623ba7a5c09cce006020819052604082205490916001600160401b03909116908181036129265761291f8442614d93565b9050612933565b6129308483614d93565b90505b60008581526020848152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825286917f2ec2be2c4b90c2cf13ecb6751a24daed6bb741ae5ed3f7371aabf9402f6d62e8910160405180910390a25050505050565b6001600160a01b0381166129c057604051635fbd571760e01b815260040160405180910390fd5b6129c8611205565b158015906129e457506129d9611205565b6129e1611d13565b10155b1561109b57604051637efcdb4960e01b815260040160405180910390fd5b600081815260008051602061524883398151915260208190526040822080549083612a2c83614cf1565b909155509392505050565b60008281527f34516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e02602052604090206000805160206152488339815191529061185c8382614c32565b80600003612a9f5760405163acdc0d4960e01b815260040160405180910390fd5b803414612abf5760405163acdc0d4960e01b815260040160405180910390fd5b60008281526000805160206152a883398151915260205260408120805460008051602061524883398151915292849291612afa908490614d80565b9091555050505050565b60606000612b1061390c565b80519091506000816001600160401b03811115612b2f57612b2f6144bd565b604051908082528060200260200182016040528015612b58578160200160208202803683370190505b5085516020870120909150600090815b84811015612c27576000612b94878381518110612b8757612b87614ac8565b6020026020010151613937565b509250505060005b8151811015612c1d5783828281518110612bb857612bb8614ac8565b60200260200101518051906020012003612c1557878381518110612bde57612bde614ac8565b6020026020010151868681518110612bf857612bf8614ac8565b602090810291909101015284612c0d81614cf1565b955050612c1d565b600101612b9c565b5050600101612b68565b506000826001600160401b03811115612c4257612c426144bd565b604051908082528060200260200182016040528015612ca757816020015b612c946040518060a00160405280600081526020016060815260200160001515815260200160608152602001606081525090565b815260200190600190039081612c605790505b50905060005b83811015612d42576000858281518110612cc957612cc9614ac8565b60200260200101519050600080600080612ce285613937565b93509350935093506040518060a00160405280868152602001858152602001841515815260200183815260200182815250878781518110612d2557612d25614ac8565b602002602001018190525050505050508080600101915050612cad565b50979650505050505050565b600080612d5a83613a62565b806020019051810190612d6d9190614db3565b915091506000612d7e6103e0611d13565b90506000612d8a6133d8565b90508115612e4f5760008581526000805160206152a8833981519152602052604081205490819003612dcf57604051635894b54560e11b815260040160405180910390fd5b80831115612df057604051635894b54560e11b815260040160405180910390fd5b612dfa82846133e8565b6000612e06868561261a565b90506000612e148286614ab5565b90508015612e2857612e268782612732565b505b612e328886613b33565b612e4b8860405180602001604052806000815250612a37565b5050505b612e5a8360016134bb565b612e66816111dc612594565b60405181906001600160a01b038516907f2f40b0474996b72a4251e00fb9170cdd960deea1dc749772cbbab61395b9b57690600090a35050505050565b60008381526000805160206152088339815191526020526040902080546000805160206151e8833981519152919060ff161515600103612f355760005b6004820154811015612f335783826004018281548110612f0257612f02614ac8565b906000526020600020015403612f2b576040516301ab53df60e31b815260040160405180910390fd5b600101612ee0565b505b81546001600160a01b0316612f4c57612f4c613b6e565b8154604051634f84544560e01b8152600560048201526000916001600160a01b031690634f84544590602401600060405180830381865afa158015612f95573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612fbd9190810190614e05565b825490915060ff16612ffe5781546003830180546001600160a01b0319166001600160a01b0388161790556001600160a81b03191661010033021760011782555b600482018054600181018255600091825260208220018590555b81518110156130ee57826001016000868152602001908152602001600020604051806040016040528084848151811061305357613053614ac8565b60200260200101516001600160a01b031681526020016000600281111561307c5761307c614771565b9052815460018101835560009283526020928390208251910180546001600160a01b031981166001600160a01b03909316928317825593830151929390929183916001600160a81b03191617600160a01b8360028111156130df576130df614771565b02179055505050600101613018565b50825460405163541da4e560e01b81526001600160a01b039091169063541da4e5906131249033908a9089908790600401614e98565b600060405180830381600087803b15801561313e57600080fd5b505af11580156120af573d6000803e3d6000fd5b61317660405180606001604052806060815260200160608152602001606081525090565b60008381526000805160206152088339815191526020526040812080546000805160206151e88339815191529260ff909116151590036131c957604051637ad5a43960e11b815260040160405180910390fd5b600381015460405163069a3ee960e01b8152600481018690526001600160a01b0390911690600090829063069a3ee990602401600060405180830381865afa158015613219573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132419190810190615036565b979650505050505050565b808210156108b757604051636664d51760e11b815260040160405180910390fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906132a2903390899088908890600401615173565b6020604051808303816000875af19250505080156132dd575060408051601f3d908101601f191682019092526132da918101906151a6565b60015b61333b573d80801561330b576040519150601f19603f3d011682016040523d82523d6000602084013e613310565b606091505b508051600003613333576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000613362611b0c565b54821080156108a55750600160e01b613379611b0c565b60008481526004919091016020526040902054161592915050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806133ae5750819003601f19909101908152919050565b60006133e2611b0c565b54919050565b806133f1611df5565b600093845260090160205260409092209190915550565b60008181527f3c2290b88407133303e904ceb4ee7d0d14164eda8a629372d8406216ceb57e006020819052604082205461ffff1680830361344e576000925050506108a5565b600084815260018084016020908152604092839020835180850190945280548085529201549083015215801590613492575080514210806134925750806020015142115b156134a357600093505050506108a5565b6134b1868361ffff16613897565b9695505050505050565b6108b7828260405180602001604052806000815250613c22565b6001600160a01b0381166134fc57604051630e88bf4b60e01b815260040160405180910390fd5b613504611034565b6040516346fc05eb60e11b81526001600160a01b0383811660048301529190911690638df80bd690602401602060405180830381865afa15801561354c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135709190614ade565b61109b57604051630e88bf4b60e01b815260040160405180910390fd5b6000613597611b0c565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b60018160028111156135de576135de614771565b036135ec576108b782612d4e565b6000806135f884613a62565b80602001905181019061360b9190614db3565b915091506136288460405180602001604052806000815250612a37565b60008481526000805160206152a883398151915260205260409020548015613667576136548582613b33565b61366761365f610ff3565b308584612332565b6040516001600160a01b038316907f86fd446d5c04e892d58b448a924dcd9c3ece3a5e0d2960b8c35cd475a5595a1f90600090a25050505050565b6000818152600080516020615208833981519152602052604081206000805160206151e8833981519152915b6004820154811015613722578160010160008360040183815481106136f5576136f5614ac8565b90600052602060002001548152602001908152602001600020600061371a9190614284565b6001016136ce565b506137316004820160006142a2565b6000838152600183016020526040812080546001600160a81b03191681556003810180546001600160a01b031916905590610fbf60048301826142a2565b6000613779611b0c565b9050600281016137898482614c32565b50600381016137988382614c32565b50600090555050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146137ee576040519150601f19603f3d011682016040523d82523d6000602084013e6137f3565b606091505b5050905080610cf75760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c65640000000060448201526064016108f2565b816001600160a01b0316836001600160a01b0316031561185c57306001600160a01b03841603613882576123676001600160a01b0385168383613c98565b61185c6001600160a01b038516848484613cf7565b60006127108211156138f55760405162461bcd60e51b815260206004820152602160248201527f426173697320706f696e74732063616e6e6f74206578636565642031305f30306044820152600360fc1b60648201526084016108f2565b61271061390283856151d0565b6116589190614d0a565b60606109477f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd01613d30565b600081815260008051602061526883398151915260205260408120805460609291839182919061396690614a52565b80601f016020809104026020016040519081016040528092919081815260200182805461399290614a52565b80156139df5780601f106139b4576101008083540402835291602001916139df565b820191906000526020600020905b8154815290600101906020018083116139c257829003601f168201915b50505050509350613a0d7f672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0090565b6000868152600391909101602090815260408083206001015460008051602061526883398151915290925290912060ff9091169350613a4e90600201613d3d565b9150613a5985613d48565b90509193509193565b60008181527f34516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e0260205260409020805460609160008051602061524883398151915291613aad90614a52565b80601f0160208091040260200160405190810160405280929190818152602001828054613ad990614a52565b8015613b265780601f10613afb57610100808354040283529160200191613b26565b820191906000526020600020905b815481529060010190602001808311613b0957829003601f168201915b5050505050915050919050565b60008281526000805160206152a883398151915260205260408120805460008051602061524883398151915292849291612afa908490614ab5565b6000805160206151e88339815191526000613b87611df5565b60060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa158015613bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c039190614bcd565b82546001600160a01b0319166001600160a01b03919091161790915550565b613c2c8383613e4c565b6001600160a01b0383163b15610cf7576000613c46611b0c565b5490508281035b613c60600086838060010194508661326d565b613c7d576040516368d2bf6b60e11b815260040160405180910390fd5b818110613c4d5781613c8d611b0c565b5414610fbf57600080fd5b6040516001600160a01b03838116602483015260448201839052610cf791859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613f87565b6040516001600160a01b03848116602483015283811660448301526064820183905261185c9186918216906323b872dd90608401613cc5565b6060600061165883613fea565b60606108a582614046565b60008181526000805160206152688339815191526020526040812060609190613d7390600401614123565b6001600160401b03811115613d8a57613d8a6144bd565b604051908082528060200260200182016040528015613db3578160200160208202803683370190505b50905060005b600084815260008051602061526883398151915260205260409020613de090600401614123565b811015613e4557600084815260008051602061526883398151915260205260408120613e0f906004018361412d565b905080838381518110613e2457613e24614ac8565b6001600160a01b039092166020928302919091019091015250600101613db9565b5092915050565b6000613e56611b0c565b5490506000829003613e7b5760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202613e8f611b0c565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717613eca611b0c565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114613f5457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101613f1c565b5081600003613f7557604051622e076360e81b815260040160405180910390fd5b80613f7e611b0c565b5550610cf79050565b6000613f9c6001600160a01b03841683614139565b90508051600014158015613fc1575080806020019051810190613fbf9190614ade565b155b15610cf757604051635274afe760e01b81526001600160a01b03841660048201526024016108f2565b60608160000180548060200260200160405190810160405280929190818152602001828054801561403a57602002820191906000526020600020905b815481526020019060010190808311614026575b50505050509050919050565b606081600001805480602002602001604051908101604052809291908181526020016000905b8282101561411857838290600052602060002001805461408b90614a52565b80601f01602080910402602001604051908101604052809291908181526020018280546140b790614a52565b80156141045780601f106140d957610100808354040283529160200191614104565b820191906000526020600020905b8154815290600101906020018083116140e757829003601f168201915b50505050508152602001906001019061406c565b505050509050919050565b60006108a5825490565b60006116588383614147565b606061165883836000614171565b600082600001828154811061415e5761415e614ac8565b9060005260206000200154905092915050565b6060814710156141965760405163cd78605960e01b81523060048201526024016108f2565b600080856001600160a01b031684866040516141b29190614afb565b60006040518083038185875af1925050503d80600081146141ef576040519150601f19603f3d011682016040523d82523d6000602084013e6141f4565b606091505b50915091506134b18683836060826142145761420f8261425b565b611658565b815115801561422b57506001600160a01b0384163b155b1561425457604051639996b31560e01b81526001600160a01b03851660048201526024016108f2565b5080611658565b80511561426b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054600082559060005260206000209081019061109b91906142c0565b508054600082559060005260206000209081019061109b91906142e3565b5b808211156142df5780546001600160a81b03191681556001016142c1565b5090565b5b808211156142df57600081556001016142e4565b60005b838110156143135781810151838201526020016142fb565b50506000910152565b600081518084526143348160208601602086016142f8565b601f01601f19169290920160200192915050565b602081526000611658602083018461431c565b60006020828403121561436d57600080fd5b5035919050565b6001600160a01b038116811461109b57600080fd5b803561439481614374565b919050565b600080604083850312156143ac57600080fd5b82356143b781614374565b946020939093013593505050565b600080602083850312156143d857600080fd5b82356001600160401b03808211156143ef57600080fd5b818501915085601f83011261440357600080fd5b81358181111561441257600080fd5b86602082850101111561442457600080fd5b60209290920196919550909350505050565b60008060006060848603121561444b57600080fd5b833561445681614374565b9250602084013561446681614374565b929592945050506040919091013590565b6003811061109b57600080fd5b60008060006060848603121561449957600080fd5b833592506020840135915060408401356144b281614477565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b03811182821017156144f6576144f66144bd565b60405290565b604051608081016001600160401b03811182821017156144f6576144f66144bd565b604051606081016001600160401b03811182821017156144f6576144f66144bd565b604080519081016001600160401b03811182821017156144f6576144f66144bd565b604051601f8201601f191681016001600160401b038111828210171561458a5761458a6144bd565b604052919050565b60006001600160401b038311156145ab576145ab6144bd565b6145be601f8401601f1916602001614562565b90508281528383830111156145d257600080fd5b828260208301376000602084830101529392505050565b600082601f8301126145fa57600080fd5b61165883833560208501614592565b6001600160401b038116811461109b57600080fd5b803561439481614609565b6000806040838503121561463c57600080fd5b82356001600160401b038082111561465357600080fd5b90840190610120828703121561466857600080fd5b6146706144d3565b82358281111561467f57600080fd5b61468b888286016145e9565b8252506020830135828111156146a057600080fd5b6146ac888286016145e9565b60208301525060408301356040820152606083013560608201526146d26080840161461e565b60808201526146e360a08401614389565b60a08201526146f460c08401614389565b60c082015260e083013560e08201526101009150614713828401614389565b8282015280945050505061472960208401614389565b90509250929050565b60006020828403121561474457600080fd5b813561165881614374565b6000806040838503121561476257600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b6003811061109b5761109b614771565b60008151808452602080850194506020840160005b838110156148015781518051600681106147c8576147c8614771565b885280840151848901526040808201516001600160a01b03169089015260609081015190880152608090960195908201906001016147ac565b509495945050505050565b60008151808452602080850194506020840160005b83811015614801578151805161483681614787565b88528084015160ff908116858a0152604091820151169088015260609096019590820190600101614821565b6020808252825160608383015280516080840181905260009291820190839060a08601905b808310156148be578351805161489c81614787565b835285015160ff16858301529284019260019290920191604090910190614887565b50838701519350601f199250828682030160408701526148de8185614797565b935050506040850151818584030160608601526134b1838261480c565b801515811461109b57600080fd5b6000806040838503121561491c57600080fd5b823561492781614374565b91506020830135614937816148fb565b809150509250929050565b6000806000806080858703121561495857600080fd5b843561496381614374565b9350602085013561497381614374565b92506040850135915060608501356001600160401b0381111561499557600080fd5b8501601f810187136149a657600080fd5b6149b587823560208401614592565b91505092959194509250565b600080604083850312156149d457600080fd5b82356001600160401b03808211156149eb57600080fd5b6149f7868387016145e9565b93506020850135915080821115614a0d57600080fd5b50614a1a858286016145e9565b9150509250929050565b60008060408385031215614a3757600080fd5b8235614a4281614374565b9150602083013561493781614374565b600181811c90821680614a6657607f821691505b602082108103611dad57634e487b7160e01b600052602260045260246000fd5b600060208284031215614a9857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108a5576108a5614a9f565b634e487b7160e01b600052603260045260246000fd5b600060208284031215614af057600080fd5b8151611658816148fb565b60008251614b0d8184602087016142f8565b9190910192915050565b80516020808301519190811015611dad5760001960209190910360031b1b16919050565b60008151808452602080850194506020840160005b838110156148015781516001600160a01b031687529582019590820190600101614b50565b838152606060208201526000614b8e6060830185614b3b565b9050826040830152949350505050565b60008351614bb08184602088016142f8565b835190830190614bc48183602088016142f8565b01949350505050565b600060208284031215614bdf57600080fd5b815161165881614374565b601f821115610cf7576000816000526020600020601f850160051c81016020861015614c135750805b601f850160051c820191505b81811015610b4557828155600101614c1f565b81516001600160401b03811115614c4b57614c4b6144bd565b614c5f81614c598454614a52565b84614bea565b602080601f831160018114614c945760008415614c7c5750858301515b600019600386901b1c1916600185901b178555610b45565b600085815260208120601f198616915b82811015614cc357888601518255948401946001909101908401614ca4565b5085821015614ce15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201614d0357614d03614a9f565b5060010190565b600082614d2757634e487b7160e01b600052601260045260246000fd5b500490565b60208101614d3983614787565b91905290565b600060208284031215614d5157600080fd5b815161165881614609565b600060208284031215614d6e57600080fd5b815161ffff8116811461165857600080fd5b808201808211156108a5576108a5614a9f565b6001600160401b03818116838216019080821115613e4557613e45614a9f565b60008060408385031215614dc657600080fd5b8251614dd181614374565b602084015190925061493781614374565b60006001600160401b03821115614dfb57614dfb6144bd565b5060051b60200190565b60006020808385031215614e1857600080fd5b82516001600160401b03811115614e2e57600080fd5b8301601f81018513614e3f57600080fd5b8051614e52614e4d82614de2565b614562565b81815260059190911b82018301908381019087831115614e7157600080fd5b928401925b82841015613241578351614e8981614374565b82529284019290840190614e76565b60018060a01b03851681528360208201528260408201526080606082015260006134b16080830184614b3b565b805160ff8116811461439457600080fd5b600082601f830112614ee757600080fd5b81516020614ef7614e4d83614de2565b82815260079290921b84018101918181019086841115614f1657600080fd5b8286015b84811015614f805760808189031215614f335760008081fd5b614f3b6144fc565b815160068110614f4b5760008081fd5b81528185015185820152604080830151614f6481614374565b9082015260608281015190820152835291830191608001614f1a565b509695505050505050565b600082601f830112614f9c57600080fd5b81516020614fac614e4d83614de2565b82815260609283028501820192828201919087851115614fcb57600080fd5b8387015b858110156150295781818a031215614fe75760008081fd5b614fef61451e565b8151614ffa81614477565b8152615007828701614ec5565b868201526040615018818401614ec5565b908201528452928401928101614fcf565b5090979650505050505050565b6000602080838503121561504957600080fd5b82516001600160401b038082111561506057600080fd5b908401906060828703121561507457600080fd5b61507c61451e565b82518281111561508b57600080fd5b8301601f8101881361509c57600080fd5b80516150aa614e4d82614de2565b81815260069190911b8201860190868101908a8311156150c957600080fd5b928701925b8284101561511d576040848c0312156150e75760008081fd5b6150ef614540565b84516150fa81614477565b8152615107858a01614ec5565b818a0152825260409390930192908701906150ce565b8452505050828401518281111561513357600080fd5b61513f88828601614ed6565b8583015250604083015193508184111561515857600080fd5b61516487858501614f8b565b60408201529695505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134b19083018461431c565b6000602082840312156151b857600080fd5b81516001600160e01b03198116811461165857600080fd5b80820281158282048414176108a5576108a5614a9f56fe9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e0154f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0034516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e00672ef851d5f92307da037116e23aa9e31af7e1f7e3ca62c4e6d540631df3fd0359b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200034516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e01"; + +type MembershipFacetConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: MembershipFacetConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class MembershipFacet__factory extends ContractFactory { + constructor(...args: MembershipFacetConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy(overrides || {}) as Promise; + } + override getDeployTransaction( + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction(overrides || {}); + } + override attach(address: string): MembershipFacet { + return super.attach(address) as MembershipFacet; + } + override connect(signer: Signer): MembershipFacet__factory { + return super.connect(signer) as MembershipFacet__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): MembershipFacetInterface { + return new utils.Interface(_abi) as MembershipFacetInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): MembershipFacet { + return new Contract(address, _abi, signerOrProvider) as MembershipFacet; + } +} diff --git a/packages/generated/v3/typings/factories/MockERC721A__factory.ts b/packages/generated/v3/typings/factories/MockERC721A__factory.ts new file mode 100644 index 000000000..ec7598128 --- /dev/null +++ b/packages/generated/v3/typings/factories/MockERC721A__factory.ts @@ -0,0 +1,607 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../common"; +import type { MockERC721A, MockERC721AInterface } from "../MockERC721A"; + +const _abi = [ + { + type: "function", + name: "__ERC721A_init", + inputs: [ + { + name: "name_", + type: "string", + internalType: "string", + }, + { + name: "symbol_", + type: "string", + internalType: "string", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "approve", + inputs: [ + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "balanceOf", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "burn", + inputs: [ + { + name: "token", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "getApproved", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isApprovedForAll", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "mint", + inputs: [ + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "mintTo", + inputs: [ + { + name: "to", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "name", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "ownerOf", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "safeTransferFrom", + inputs: [ + { + name: "from", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "safeTransferFrom", + inputs: [ + { + name: "from", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + { + name: "_data", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "function", + name: "setApprovalForAll", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "approved", + type: "bool", + internalType: "bool", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "symbol", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "tokenURI", + inputs: [ + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "totalSupply", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "transferFrom", + inputs: [ + { + name: "from", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "event", + name: "Approval", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "approved", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ApprovalForAll", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "approved", + type: "bool", + indexed: false, + internalType: "bool", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ConsecutiveTransfer", + inputs: [ + { + name: "fromTokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + { + name: "toTokenId", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "from", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceAdded", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceRemoved", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Transfer", + inputs: [ + { + name: "from", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "tokenId", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "ApprovalCallerNotOwnerNorApproved", + inputs: [], + }, + { + type: "error", + name: "ApprovalQueryForNonexistentToken", + inputs: [], + }, + { + type: "error", + name: "BalanceQueryForZeroAddress", + inputs: [], + }, + { + type: "error", + name: "Initializable_InInitializingState", + inputs: [], + }, + { + type: "error", + name: "Initializable_NotInInitializingState", + inputs: [], + }, + { + type: "error", + name: "Introspection_AlreadySupported", + inputs: [], + }, + { + type: "error", + name: "Introspection_NotSupported", + inputs: [], + }, + { + type: "error", + name: "MintERC2309QuantityExceedsLimit", + inputs: [], + }, + { + type: "error", + name: "MintToZeroAddress", + inputs: [], + }, + { + type: "error", + name: "MintZeroQuantity", + inputs: [], + }, + { + type: "error", + name: "OwnerQueryForNonexistentToken", + inputs: [], + }, + { + type: "error", + name: "OwnershipNotInitializedForExtraData", + inputs: [], + }, + { + type: "error", + name: "TransferCallerNotOwnerNorApproved", + inputs: [], + }, + { + type: "error", + name: "TransferFromIncorrectOwner", + inputs: [], + }, + { + type: "error", + name: "TransferToNonERC721ReceiverImplementer", + inputs: [], + }, + { + type: "error", + name: "TransferToZeroAddress", + inputs: [], + }, + { + type: "error", + name: "URIQueryForNonexistentToken", + inputs: [], + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b611516806100d36000396000f3fe6080604052600436106100fe5760003560e01c80636352211e11610095578063a22cb46511610064578063a22cb46514610279578063b88d4fde14610299578063c87b56dd146102ac578063d2f01f19146102cc578063e985e9c5146102ec57600080fd5b80636352211e1461020457806370a0823114610224578063755edd171461024457806395d89b411461026457600080fd5b806323b872dd116100d157806323b872dd1461019e57806340c10f19146101b157806342842e0e146101d157806342966c68146101e457600080fd5b806306fdde0314610103578063081812fc1461012e578063095ea7b31461016657806318160ddd1461017b575b600080fd5b34801561010f57600080fd5b5061011861031c565b6040516101259190611064565b60405180910390f35b34801561013a57600080fd5b5061014e610149366004611077565b6103b7565b6040516001600160a01b039091168152602001610125565b6101796101743660046110a7565b6103c8565b005b34801561018757600080fd5b506101906103d8565b604051908152602001610125565b6101796101ac3660046110d1565b6103e7565b3480156101bd57600080fd5b506101796101cc3660046110a7565b6105cc565b6101796101df3660046110d1565b6105d6565b3480156101f057600080fd5b506101796101ff366004611077565b6105f6565b34801561021057600080fd5b5061014e61021f366004611077565b610602565b34801561023057600080fd5b5061019061023f36600461110d565b61060d565b34801561025057600080fd5b5061019061025f36600461110d565b610618565b34801561027057600080fd5b50610118610634565b34801561028557600080fd5b50610179610294366004611128565b61064c565b6101796102a73660046111f0565b6106c9565b3480156102b857600080fd5b506101186102c7366004611077565b610713565b3480156102d857600080fd5b506101796102e736600461128c565b6107a4565b3480156102f857600080fd5b5061030c6103073660046112f0565b6107f8565b6040519015158152602001610125565b6060610326610804565b600201805461033490611323565b80601f016020809104026020016040519081016040528092919081815260200182805461036090611323565b80156103ad5780601f10610382576101008083540402835291602001916103ad565b820191906000526020600020905b81548152906001019060200180831161039057829003601f168201915b5050505050905090565b60006103c282610828565b92915050565b6103d482826001610875565b5050565b60006103e261092a565b905090565b60006103f282610949565b9050836001600160a01b0316816001600160a01b0316146104255760405162a1148160e81b815260040160405180910390fd5b600080610431846109e4565b9150915061045681876104413390565b6001600160a01b039081169116811491141790565b6104815761046486336107f8565b61048157604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166104a857604051633a954ecd60e21b815260040160405180910390fd5b80156104b357600082555b6104bb610804565b6001600160a01b03871660009081526005919091016020526040902080546000190190556104e7610804565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b1761051e610804565b60008681526004919091016020526040812091909155600160e11b84169003610594576001840161054d610804565b6000828152600491909101602052604081205490036105925761056e610804565b548114610592578361057e610804565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03166000805160206114f683398151915260405160405180910390a45b505050505050565b6103d48282610a0c565b6105f1838383604051806020016040528060008152506106c9565b505050565b6105ff81610b23565b50565b60006103c282610949565b60006103c282610b2e565b6000610622610b97565b905061062f826001610a0c565b919050565b606061063e610804565b600301805461033490611323565b80610655610804565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6106d48484846103e7565b6001600160a01b0383163b1561070d576106f084848484610ba7565b61070d576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061071e82610c92565b61073b57604051630a14c4b560e41b815260040160405180910390fd5b600061075260408051602081019091526000815290565b90508051600003610772576040518060200160405280600081525061079d565b8061077c84610cce565b60405160200161078d929190611357565b6040516020818303038152906040525b9392505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166107ee57604051630ef4733760e31b815260040160405180910390fd5b6103d48282610d12565b600061079d8383610d86565b7f6569bde4a160c636ea8b8d11acb83a60d7fec0b8f2e09389306cba0e1340df0090565b600061083382610c92565b610850576040516333d1c03960e21b815260040160405180910390fd5b610858610804565b60009283526006016020525060409020546001600160a01b031690565b600061088083610602565b905081156108bf57336001600160a01b038216146108bf576108a28133610d86565b6108bf576040516367d9dca160e11b815260040160405180910390fd5b836108c8610804565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b600080610935610804565b60010154610941610804565b540303919050565b600080610954610804565b60008481526004820160205260408120549350909150600160e01b831690036109ca57816000036109c457805483106109a057604051636f96cda160e11b815260040160405180910390fd5b5b6000199092016000818152600484016020526040902054909290915081156109a1575b50919050565b50604051636f96cda160e11b815260040160405180910390fd5b60008060006109f1610804565b60009485526006016020525050604090912080549092909150565b6000610a16610804565b5490506000829003610a3b5760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202610a4f610804565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717610a8a610804565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083906000805160206114f68339815191528180a4600183015b818114610af057808360006000805160206114f6833981519152600080a4600101610aca565b5081600003610b1157604051622e076360e81b815260040160405180910390fd5b80610b1a610804565b55506105f19050565b6105ff816000610dc3565b60006001600160a01b038216610b57576040516323d3ad8160e21b815260040160405180910390fd5b67ffffffffffffffff610b68610804565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6000610ba1610804565b54919050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290610bdc903390899088908890600401611386565b6020604051808303816000875af1925050508015610c17575060408051601f3d908101601f19168201909252610c14918101906113c3565b60015b610c75573d808015610c45576040519150601f19603f3d011682016040523d82523d6000602084013e610c4a565b606091505b508051600003610c6d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000610c9c610804565b54821080156103c25750600160e01b610cb3610804565b60008481526004919091016020526040902054161592915050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480610ce85750819003601f19909101908152919050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff16610d5c57604051630ef4733760e31b815260040160405180910390fd5b610d6c6380ac58cd60e01b610f04565b610d7c635b5e139f60e01b610f04565b6103d48282610fe2565b6000610d90610804565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b6000610dce83610949565b905080600080610ddd866109e4565b915091508415610e1d57610df2818433610441565b610e1d57610e008333610d86565b610e1d57604051632ce44b5f60e11b815260040160405180910390fd5b8015610e2857600082555b6000610e32610804565b6001600160a01b0385166000818152600583016020526040902080546fffffffffffffffffffffffffffffffff0190559091504260a01b17600360e01b176000888152600483016020526040812091909155600160e11b86169003610eca576001870160008181526004830160205260408120549003610ec85781548114610ec857600081815260048301602052604090208690555b505b60405187906000906001600160a01b038716906000805160206114f6833981519152908390a4600190810180549091019055505050505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610f91576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610faa565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b6000610fec610804565b905060028101610ffc8482611435565b506003810161100b8382611435565b50600090555050565b60005b8381101561102f578181015183820152602001611017565b50506000910152565b60008151808452611050816020860160208601611014565b601f01601f19169290920160200192915050565b60208152600061079d6020830184611038565b60006020828403121561108957600080fd5b5035919050565b80356001600160a01b038116811461062f57600080fd5b600080604083850312156110ba57600080fd5b6110c383611090565b946020939093013593505050565b6000806000606084860312156110e657600080fd5b6110ef84611090565b92506110fd60208501611090565b9150604084013590509250925092565b60006020828403121561111f57600080fd5b61079d82611090565b6000806040838503121561113b57600080fd5b61114483611090565b91506020830135801515811461115957600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561119557611195611164565b604051601f8501601f19908116603f011681019082821181831017156111bd576111bd611164565b816040528093508581528686860111156111d657600080fd5b858560208301376000602087830101525050509392505050565b6000806000806080858703121561120657600080fd5b61120f85611090565b935061121d60208601611090565b925060408501359150606085013567ffffffffffffffff81111561124057600080fd5b8501601f8101871361125157600080fd5b6112608782356020840161117a565b91505092959194509250565b600082601f83011261127d57600080fd5b61079d8383356020850161117a565b6000806040838503121561129f57600080fd5b823567ffffffffffffffff808211156112b757600080fd5b6112c38683870161126c565b935060208501359150808211156112d957600080fd5b506112e68582860161126c565b9150509250929050565b6000806040838503121561130357600080fd5b61130c83611090565b915061131a60208401611090565b90509250929050565b600181811c9082168061133757607f821691505b6020821081036109c457634e487b7160e01b600052602260045260246000fd5b60008351611369818460208801611014565b83519083019061137d818360208801611014565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906113b990830184611038565b9695505050505050565b6000602082840312156113d557600080fd5b81516001600160e01b03198116811461079d57600080fd5b601f8211156105f1576000816000526020600020601f850160051c810160208610156114165750805b601f850160051c820191505b818110156105c457828155600101611422565b815167ffffffffffffffff81111561144f5761144f611164565b6114638161145d8454611323565b846113ed565b602080601f83116001811461149857600084156114805750858301515b600019600386901b1c1916600185901b1785556105c4565b600085815260208120601f198616915b828110156114c7578886015182559484019460019091019084016114a8565b50858210156114e55787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"; + +type MockERC721AConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: MockERC721AConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class MockERC721A__factory extends ContractFactory { + constructor(...args: MockERC721AConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy(overrides || {}) as Promise; + } + override getDeployTransaction( + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction(overrides || {}); + } + override attach(address: string): MockERC721A { + return super.attach(address) as MockERC721A; + } + override connect(signer: Signer): MockERC721A__factory { + return super.connect(signer) as MockERC721A__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): MockERC721AInterface { + return new utils.Interface(_abi) as MockERC721AInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): MockERC721A { + return new Contract(address, _abi, signerOrProvider) as MockERC721A; + } +} diff --git a/packages/generated/v3/typings/factories/MockEntitlementGated__factory.ts b/packages/generated/v3/typings/factories/MockEntitlementGated__factory.ts new file mode 100644 index 000000000..7a0ffb346 --- /dev/null +++ b/packages/generated/v3/typings/factories/MockEntitlementGated__factory.ts @@ -0,0 +1,503 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../common"; +import type { + MockEntitlementGated, + MockEntitlementGatedInterface, +} from "../MockEntitlementGated"; + +const _abi = [ + { + type: "constructor", + inputs: [ + { + name: "checker", + type: "address", + internalType: "contract IEntitlementChecker", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "__EntitlementGated_init", + inputs: [ + { + name: "entitlementChecker", + type: "address", + internalType: "contract IEntitlementChecker", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "getRuleData", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct IRuleEntitlement.RuleData", + components: [ + { + name: "operations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.Operation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CombinedOperationType", + }, + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + name: "checkOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.CheckOperation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CheckOperationType", + }, + { + name: "chainId", + type: "uint256", + internalType: "uint256", + }, + { + name: "contractAddress", + type: "address", + internalType: "address", + }, + { + name: "threshold", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "logicalOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.LogicalOperation[]", + components: [ + { + name: "logOpType", + type: "uint8", + internalType: "enum IRuleEntitlement.LogicalOperationType", + }, + { + name: "leftOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "rightOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getRuleData", + inputs: [ + { + name: "transactionId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct IRuleEntitlement.RuleData", + components: [ + { + name: "operations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.Operation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CombinedOperationType", + }, + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + name: "checkOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.CheckOperation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CheckOperationType", + }, + { + name: "chainId", + type: "uint256", + internalType: "uint256", + }, + { + name: "contractAddress", + type: "address", + internalType: "address", + }, + { + name: "threshold", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "logicalOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.LogicalOperation[]", + components: [ + { + name: "logOpType", + type: "uint8", + internalType: "enum IRuleEntitlement.LogicalOperationType", + }, + { + name: "leftOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "rightOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "postEntitlementCheckResult", + inputs: [ + { + name: "transactionId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "result", + type: "uint8", + internalType: "enum IEntitlementGatedBase.NodeVoteStatus", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "requestEntitlementCheck", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "ruleData", + type: "tuple", + internalType: "struct IRuleEntitlement.RuleData", + components: [ + { + name: "operations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.Operation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CombinedOperationType", + }, + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + }, + { + name: "checkOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.CheckOperation[]", + components: [ + { + name: "opType", + type: "uint8", + internalType: "enum IRuleEntitlement.CheckOperationType", + }, + { + name: "chainId", + type: "uint256", + internalType: "uint256", + }, + { + name: "contractAddress", + type: "address", + internalType: "address", + }, + { + name: "threshold", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "logicalOperations", + type: "tuple[]", + internalType: "struct IRuleEntitlement.LogicalOperation[]", + components: [ + { + name: "logOpType", + type: "uint8", + internalType: "enum IRuleEntitlement.LogicalOperationType", + }, + { + name: "leftOperationIndex", + type: "uint8", + internalType: "uint8", + }, + { + name: "rightOperationIndex", + type: "uint8", + internalType: "uint8", + }, + ], + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "EntitlementCheckResultPosted", + inputs: [ + { + name: "transactionId", + type: "bytes32", + indexed: true, + internalType: "bytes32", + }, + { + name: "result", + type: "uint8", + indexed: false, + internalType: "enum IEntitlementGatedBase.NodeVoteStatus", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceAdded", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceRemoved", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "EntitlementGated_InvalidAddress", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_NodeAlreadyVoted", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_NodeNotFound", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_TransactionCheckAlreadyCompleted", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_TransactionCheckAlreadyRegistered", + inputs: [], + }, + { + type: "error", + name: "EntitlementGated_TransactionNotRegistered", + inputs: [], + }, + { + type: "error", + name: "Initializable_InInitializingState", + inputs: [], + }, + { + type: "error", + name: "Initializable_NotInInitializingState", + inputs: [], + }, + { + type: "error", + name: "Introspection_AlreadySupported", + inputs: [], + }, + { + type: "error", + name: "Introspection_NotSupported", + inputs: [], + }, + { + type: "error", + name: "ReentrancyGuard__ReentrantCall", + inputs: [], + }, +] as const; + +const _bytecode = + "0x60806040523480156200001157600080fd5b5060405162001b9a38038062001b9a833981016040819052620000349162000127565b6200003e6200007f565b7f9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e0080546001600160a01b0319166001600160a01b0383161790555062000159565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff1615620000cc576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156200012457805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6000602082840312156200013a57600080fd5b81516001600160a01b03811681146200015257600080fd5b9392505050565b611a3180620001696000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063069a3ee91461005c5780634739e8051461008557806357e700271461009a5780637adc9cbe146100bb57806392c399ff146100ce575b600080fd5b61006f61006a366004610e1e565b6100e1565b60405161007c9190610f28565b60405180910390f35b610098610093366004610fd8565b610314565b005b6100ad6100a8366004611011565b6103b8565b60405190815260200161007c565b6100986100c9366004611074565b610426565b61006f6100dc366004611091565b61047c565b61010560405180606001604052806060815260200160608152602001606081525090565b6000828152602081815260408083208151815460809481028201850190935260608101838152909491938593919285929185015b828210156101a257600084815260209020604080518082019091529083018054829060ff16600281111561016f5761016f610e37565b600281111561018057610180610e37565b81529054610100900460ff166020918201529082526001929092019101610139565b50505050815260200160018201805480602002602001604051908101604052809291908181526020016000905b8282101561025a576000848152602090206040805160808101909152600484029091018054829060ff16600581111561020a5761020a610e37565b600581111561021b5761021b610e37565b815260018281015460208084019190915260028401546001600160a01b03166040840152600390930154606090920191909152918352920191016101cf565b50505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156103065760008481526020902060408051606081019091529083018054829060ff1660028111156102be576102be610e37565b60028111156102cf576102cf610e37565b8152905460ff6101008204811660208085019190915262010000909204166040909201919091529082526001929092019101610287565b505050915250909392505050565b60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a00540361035657604051635db5c7cd60e11b815260040160405180910390fd5b61037f60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b61038a8383836104aa565b6103b360017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b505050565b600082815260208190526040812082906103d2828261140a565b50506040516bffffffffffffffffffffffff193260601b16602082015243603482015260009060540160405160208183030381529060405280519060200120905061041f81306000610743565b9392505050565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661047057604051630ef4733760e31b815260040160405180910390fd5b610479816109f2565b50565b6104a060405180606001604052806060815260200160608152602001606081525090565b61041f8383610a2d565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919061010090046001600160a01b031615806104f45750805460ff16155b1561051257604051637ad5a43960e11b815260040160405180910390fd5b600084815260028201602052604090205460ff161561054457604051637912b73960e01b815260040160405180910390fd5b600084815260018201602052604081205481908190815b8181101561068257600089815260018701602052604081208054839081106105855761058561150e565b60009182526020909120018054909150336001600160a01b03909116036106115760008154600160a01b900460ff1660028111156105c5576105c5610e37565b146105e3576040516347592a4d60e01b815260040160405180910390fd5b80548990829060ff60a01b1916600160a01b83600281111561060757610607610e37565b0217905550600195505b60018154600160a01b900460ff16600281111561063057610630610e37565b03610647578461063f81611524565b955050610679565b60028154600160a01b900460ff16600281111561066657610666610e37565b03610679578361067581611524565b9450505b5060010161055b565b50836106a157604051638223a7e960e01b815260040160405180910390fd5b6106ac60028261153d565b8311806106c257506106bf60028261153d565b82115b156107385760008881526002860160205260408120805460ff191660011790558284116106f05760026106f3565b60015b9050897fb9d6ce397e562841871d119aaf77469c60a3b5bf8b99a5d9851656015015c63382604051610725919061155f565b60405180910390a26107368a610b27565b505b505050505050505050565b6000838152600080516020611a118339815191526020526040902080546000805160206119f1833981519152919060ff1615156001036107d55760005b60048201548110156107d357838260040182815481106107a2576107a261150e565b9060005260206000200154036107cb576040516301ab53df60e31b815260040160405180910390fd5b600101610780565b505b81546001600160a01b03166107ec576107ec610bfb565b8154604051634f84544560e01b8152600560048201526000916001600160a01b031690634f84544590602401600060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085d9190810190611636565b825490915060ff1661089e5781546003830180546001600160a01b0319166001600160a01b0388161790556001600160a81b03191661010033021760011782555b600482018054600181018255600091825260208220018590555b815181101561098e5782600101600086815260200190815260200160002060405180604001604052808484815181106108f3576108f361150e565b60200260200101516001600160a01b031681526020016000600281111561091c5761091c610e37565b9052815460018101835560009283526020928390208251910180546001600160a01b031981166001600160a01b03909316928317825593830151929390929183916001600160a81b03191617600160a01b83600281111561097f5761097f610e37565b021790555050506001016108b8565b50825460405163541da4e560e01b81526001600160a01b039091169063541da4e5906109c49033908a90899087906004016116ca565b600060405180830381600087803b1580156109de57600080fd5b505af1158015610736573d6000803e3d6000fd5b610a02636afd38fd60e11b610ccc565b6000805160206119f183398151915280546001600160a01b0319166001600160a01b03831617905550565b610a5160405180606001604052806060815260200160608152602001606081525090565b6000838152600080516020611a118339815191526020526040812080546000805160206119f18339815191529260ff90911615159003610aa457604051637ad5a43960e11b815260040160405180910390fd5b600381015460405163069a3ee960e01b8152600481018690526001600160a01b0390911690600090829063069a3ee990602401600060405180830381865afa158015610af4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b1c9190810190611893565b979650505050505050565b6000818152600080516020611a11833981519152602052604081206000805160206119f1833981519152915b6004820154811015610ba757816001016000836004018381548110610b7a57610b7a61150e565b906000526020600020015481526020019081526020016000206000610b9f9190610daa565b600101610b53565b50610bb6600482016000610dc8565b6000838152600183016020526040812080546001600160a81b03191681556003810180546001600160a01b031916905590610bf46004830182610dc8565b5050505050565b60006000805160206119f1833981519152905060007fc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb60060060154604051628956cd60e71b81526c29b830b1b2a7b832b930ba37b960991b60048201526001600160a01b03909116906344ab668090602401602060405180830381865afa158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad91906119d3565b82546001600160a01b0319166001600160a01b03919091161790915550565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff161515600114610d59576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610d72565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b50805460008255906000526020600020908101906104799190610de6565b50805460008255906000526020600020908101906104799190610e09565b5b80821115610e055780546001600160a81b0319168155600101610de7565b5090565b5b80821115610e055760008155600101610e0a565b600060208284031215610e3057600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b6003811061047957610479610e37565b60008151808452602080850194506020840160005b83811015610ec7578151805160068110610e8e57610e8e610e37565b885280840151848901526040808201516001600160a01b0316908901526060908101519088015260809096019590820190600101610e72565b509495945050505050565b60008151808452602080850194506020840160005b83811015610ec75781518051610efc81610e4d565b88528084015160ff908116858a0152604091820151169088015260609096019590820190600101610ee7565b6020808252825160608383015280516080840181905260009291820190839060a08601905b80831015610f845783518051610f6281610e4d565b835285015160ff16858301529284019260019290920191604090910190610f4d565b50838701519350601f19925082868203016040870152610fa48185610e5d565b93505050604085015181858403016060860152610fc18382610ed2565b9695505050505050565b6003811061047957600080fd5b600080600060608486031215610fed57600080fd5b8335925060208401359150604084013561100681610fcb565b809150509250925092565b6000806040838503121561102457600080fd5b82359150602083013567ffffffffffffffff81111561104257600080fd5b83016060818603121561105457600080fd5b809150509250929050565b6001600160a01b038116811461047957600080fd5b60006020828403121561108657600080fd5b813561041f8161105f565b600080604083850312156110a457600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60ff8116811461047957600080fd5b81356110f981610fcb565b61110281610e4d565b60ff1982541660ff82168117835550506020820135611120816110df565b815461ff001916600882901b61ff0016178255505050565b6000808335601e1984360301811261114f57600080fd5b83018035915067ffffffffffffffff82111561116a57600080fd5b6020019150600781901b360382131561118257600080fd5b9250929050565b6006811061047957600080fd5b81356111a181611189565b600681106111b1576111b1610e37565b60ff1982541660ff8216811783555050602082013560018201556002810160408301356111dd8161105f565b81546001600160a01b0319166001600160a01b03919091161790556060919091013560039190910155565b600160401b83111561121c5761121c6110b3565b80548382558084101561129a5760026001600160fe1b038281168314611244576112446110c9565b8086168614611255576112556110c9565b506000838152602081208360021b81018760021b820191505b8082101561129557828255826001830155828483015582600383015560048201915061126e565b505050505b5060008181526020812083915b858110156112cf576112b98383611196565b60809290920191600491909101906001016112a7565b505050505050565b6000808335601e198436030181126112ee57600080fd5b83018035915067ffffffffffffffff82111561130957600080fd5b602001915060608102360382131561118257600080fd5b813561132b81610fcb565b61133481610e4d565b60ff1982541660ff82168117835550506020820135611352816110df565b815461ff001916600882901b61ff0016178255506040820135611374816110df565b815462ff0000191660109190911b62ff00001617905550565b600160401b8311156113a1576113a16110b3565b8054838255808410156113d8576000828152602081208581019083015b808210156113d4578282556001820191506113be565b5050505b5060008181526020812083915b858110156112cf576113f78383611320565b60609290920191600191820191016113e5565b8135601e1983360301811261141e57600080fd5b8201803567ffffffffffffffff81111561143757600080fd5b6020820191508060061b360382131561144f57600080fd5b600160401b811115611463576114636110b3565b82548184558082101561149a576000848152602081208381019083015b8082101561149657828255600182019150611480565b5050505b5060008381526020902060005b828110156114cc576114b984836110ee565b60409390930192600191820191016114a7565b505050506114dd6020830183611138565b6114eb818360018601611208565b50506114fa60408301836112d7565b61150881836002860161138d565b50505050565b634e487b7160e01b600052603260045260246000fd5b600060018201611536576115366110c9565b5060010190565b60008261155a57634e487b7160e01b600052601260045260246000fd5b500490565b6020810161156c83610e4d565b91905290565b6040516080810167ffffffffffffffff81118282101715611595576115956110b3565b60405290565b6040516060810167ffffffffffffffff81118282101715611595576115956110b3565b6040805190810167ffffffffffffffff81118282101715611595576115956110b3565b604051601f8201601f1916810167ffffffffffffffff8111828210171561160a5761160a6110b3565b604052919050565b600067ffffffffffffffff82111561162c5761162c6110b3565b5060051b60200190565b6000602080838503121561164957600080fd5b825167ffffffffffffffff81111561166057600080fd5b8301601f8101851361167157600080fd5b805161168461167f82611612565b6115e1565b81815260059190911b820183019083810190878311156116a357600080fd5b928401925b82841015610b1c5783516116bb8161105f565b825292840192908401906116a8565b60006080820160018060a01b03808816845260208760208601528660408601526080606086015282865180855260a08701915060208801945060005b81811015611724578551851683529483019491830191600101611706565b50909a9950505050505050505050565b600082601f83011261174557600080fd5b8151602061175561167f83611612565b82815260079290921b8401810191818101908684111561177457600080fd5b8286015b848110156117d957608081890312156117915760008081fd5b611799611572565b81516117a481611189565b815281850151858201526040808301516117bd8161105f565b9082015260608281015190820152835291830191608001611778565b509695505050505050565b600082601f8301126117f557600080fd5b8151602061180561167f83611612565b8281526060928302850182019282820191908785111561182457600080fd5b8387015b858110156118865781818a0312156118405760008081fd5b61184861159b565b815161185381610fcb565b815281860151611862816110df565b81870152604082810151611875816110df565b908201528452928401928101611828565b5090979650505050505050565b600060208083850312156118a657600080fd5b825167ffffffffffffffff808211156118be57600080fd5b90840190606082870312156118d257600080fd5b6118da61159b565b8251828111156118e957600080fd5b8301601f810188136118fa57600080fd5b805161190861167f82611612565b81815260069190911b8201860190868101908a83111561192757600080fd5b928701925b8284101561197d576040848c0312156119455760008081fd5b61194d6115be565b845161195881610fcb565b815284890151611967816110df565b818a01528252604093909301929087019061192c565b8452505050828401518281111561199357600080fd5b61199f88828601611734565b858301525060408301519350818411156119b857600080fd5b6119c4878585016117e4565b60408201529695505050505050565b6000602082840312156119e557600080fd5b815161041f8161105f56fe9075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e009075c515a635ba70c9696f31149324218d75cf00afe836c482e6473f38b19e01"; + +type MockEntitlementGatedConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: MockEntitlementGatedConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class MockEntitlementGated__factory extends ContractFactory { + constructor(...args: MockEntitlementGatedConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + checker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy( + checker, + overrides || {} + ) as Promise; + } + override getDeployTransaction( + checker: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction(checker, overrides || {}); + } + override attach(address: string): MockEntitlementGated { + return super.attach(address) as MockEntitlementGated; + } + override connect(signer: Signer): MockEntitlementGated__factory { + return super.connect(signer) as MockEntitlementGated__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): MockEntitlementGatedInterface { + return new utils.Interface(_abi) as MockEntitlementGatedInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): MockEntitlementGated { + return new Contract( + address, + _abi, + signerOrProvider + ) as MockEntitlementGated; + } +} diff --git a/packages/generated/v3/typings/factories/OwnableFacet__factory.ts b/packages/generated/v3/typings/factories/OwnableFacet__factory.ts new file mode 100644 index 000000000..1111c232e --- /dev/null +++ b/packages/generated/v3/typings/factories/OwnableFacet__factory.ts @@ -0,0 +1,193 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../common"; +import type { OwnableFacet, OwnableFacetInterface } from "../OwnableFacet"; + +const _abi = [ + { + type: "function", + name: "__Ownable_init", + inputs: [ + { + name: "owner_", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "owner", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "transferOwnership", + inputs: [ + { + name: "newOwner", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceAdded", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceRemoved", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OwnershipTransferred", + inputs: [ + { + name: "previousOwner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newOwner", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "Initializable_InInitializingState", + inputs: [], + }, + { + type: "error", + name: "Initializable_NotInInitializingState", + inputs: [], + }, + { + type: "error", + name: "Introspection_AlreadySupported", + inputs: [], + }, + { + type: "error", + name: "Introspection_NotSupported", + inputs: [], + }, + { + type: "error", + name: "Ownable__NotOwner", + inputs: [ + { + name: "account", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "Ownable__ZeroAddress", + inputs: [], + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b610337806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80638da5cb5b14610046578063d78f00211461006a578063f2fde38b1461007f575b600080fd5b61004e610092565b6040516001600160a01b03909116815260200160405180910390f35b61007d610078366004610307565b6100a1565b005b61007d61008d366004610307565b6100f7565b600061009c61013f565b905090565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166100eb57604051630ef4733760e31b815260040160405180910390fd5b6100f48161016d565b50565b6100ff61013f565b6001600160a01b0316336001600160a01b031614610136576040516365f4906560e01b815233600482015260240160405180910390fd5b6100f481610186565b7f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae300546001600160a01b031690565b61017681610186565b6100f46307f5828d60e41b610229565b600061019061013f565b90506001600160a01b0382166101b957604051634e3ef82560e01b815260040160405180910390fd5b817f4675fa8241f86f37157864d3d49b85ad4b164352c516da28e1678a90470ae30080546001600160a01b0319166001600160a01b03928316179055604051838216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff1615156001146102b6576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff191660011790556102cf565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006020828403121561031957600080fd5b81356001600160a01b038116811461033057600080fd5b939250505056"; + +type OwnableFacetConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: OwnableFacetConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class OwnableFacet__factory extends ContractFactory { + constructor(...args: OwnableFacetConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy(overrides || {}) as Promise; + } + override getDeployTransaction( + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction(overrides || {}); + } + override attach(address: string): OwnableFacet { + return super.attach(address) as OwnableFacet; + } + override connect(signer: Signer): OwnableFacet__factory { + return super.connect(signer) as OwnableFacet__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): OwnableFacetInterface { + return new utils.Interface(_abi) as OwnableFacetInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): OwnableFacet { + return new Contract(address, _abi, signerOrProvider) as OwnableFacet; + } +} diff --git a/packages/generated/v3/typings/factories/PrepayFacet__factory.ts b/packages/generated/v3/typings/factories/PrepayFacet__factory.ts new file mode 100644 index 000000000..dcd736118 --- /dev/null +++ b/packages/generated/v3/typings/factories/PrepayFacet__factory.ts @@ -0,0 +1,306 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../common"; +import type { PrepayFacet, PrepayFacetInterface } from "../PrepayFacet"; + +const _abi = [ + { + type: "function", + name: "__PrepayFacet_init", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "calculateMembershipPrepayFee", + inputs: [ + { + name: "supply", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "prepaidMembershipSupply", + inputs: [ + { + name: "account", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "prepayMembership", + inputs: [ + { + name: "membership", + type: "address", + internalType: "address", + }, + { + name: "supply", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceAdded", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceRemoved", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "PlatformFeeRecipientSet", + inputs: [ + { + name: "recipient", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "PlatformMembershipBpsSet", + inputs: [ + { + name: "bps", + type: "uint16", + indexed: false, + internalType: "uint16", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "PlatformMembershipDurationSet", + inputs: [ + { + name: "duration", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "PlatformMembershipFeeSet", + inputs: [ + { + name: "fee", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "PlatformMembershipMintLimitSet", + inputs: [ + { + name: "limit", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "PrepayBase__Prepaid", + inputs: [ + { + name: "membership", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "supply", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "Initializable_InInitializingState", + inputs: [], + }, + { + type: "error", + name: "Initializable_NotInInitializingState", + inputs: [], + }, + { + type: "error", + name: "Introspection_AlreadySupported", + inputs: [], + }, + { + type: "error", + name: "Introspection_NotSupported", + inputs: [], + }, + { + type: "error", + name: "Platform__InvalidFeeRecipient", + inputs: [], + }, + { + type: "error", + name: "Platform__InvalidMembershipBps", + inputs: [], + }, + { + type: "error", + name: "Platform__InvalidMembershipDuration", + inputs: [], + }, + { + type: "error", + name: "Platform__InvalidMembershipMintLimit", + inputs: [], + }, + { + type: "error", + name: "PrepayBase__InvalidAddress", + inputs: [], + }, + { + type: "error", + name: "PrepayBase__InvalidAmount", + inputs: [], + }, + { + type: "error", + name: "PrepayBase__InvalidMembership", + inputs: [], + }, + { + type: "error", + name: "ReentrancyGuard__ReentrantCall", + inputs: [], + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b6107a5806100d36000396000f3fe60806040526004361061003f5760003560e01c806327bc79f11461004457806386272406146100765780639262b1b31461008b578063aabe967d146100ab575b600080fd5b34801561005057600080fd5b5061006461005f36600461068c565b6100c0565b60405190815260200160405180910390f35b6100896100843660046106bd565b6100d1565b005b34801561009757600080fd5b506100646100a63660046106e9565b6103bb565b3480156100b757600080fd5b506100896103f8565b60006100cb82610454565b92915050565b60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a00540361011357604051635db5c7cd60e11b815260040160405180910390fd5b61013c60027f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b8060000361015d57604051632484b54d60e01b815260040160405180910390fd5b6001600160a01b03821661018457604051631ea9dac160e21b815260040160405180910390fd5b6040516301ffc9a760e01b815263421fb7a760e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa1580156101cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f3919061070d565b6102105760405163b2c5c0f360e01b815260040160405180910390fd5b336001600160a01b0316826001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610258573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027c919061072f565b6001600160a01b0316146102a357604051631ea9dac160e21b815260040160405180910390fd5b60006102d67fb29a817dd0719f30ad87abc8dff26e6354077e5b46bf38f34d5ac48732860d02546001600160a01b031690565b905060006102e383610454565b90508034101561030657604051632484b54d60e01b815260040160405180910390fd5b600083856001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036b919061074c565b610375919061077b565b90506103818582610488565b61038b8383610502565b5050506103b760017f54f22f54f370bd020e00ee80e1a5099a71652e2ccbcf6a75281e4c70a3e11a0055565b5050565b6001600160a01b03811660009081527f097b4f25b64e012d0cf55f67e9b34fe5d57f15b11b95baa4ddd136b424967c0060205260408120546100cb565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff1661044257604051630ef4733760e31b815260040160405180910390fd5b610452630cfe7b1160e21b6105ae565b565b600061047e7fb29a817dd0719f30ad87abc8dff26e6354077e5b46bf38f34d5ac48732860d005490565b6100cb908361078e565b60007f097b4f25b64e012d0cf55f67e9b34fe5d57f15b11b95baa4ddd136b424967c006001600160a01b03841660008181526020838152604091829020869055905185815292935090917f884527d8d797310d66e571e2a24daeddc15ae52474ef2c763ab29b60c5678369910160405180910390a2505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461054f576040519150601f19603f3d011682016040523d82523d6000602084013e610554565b606091505b50509050806105a95760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c656400000000604482015260640160405180910390fd5b505050565b6001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b00602052604090205460ff16151560011461063b576001600160e01b0319811660009081527f81088bbc801e045ea3e7620779ab349988f58afbdfba10dff983df3f33522b0060205260409020805460ff19166001179055610654565b604051637967f77d60e11b815260040160405180910390fd5b6040516001600160e01b03198216907f78f84e5b1c5c05be2b5ad3800781dd404d6d6c6302bc755c0fe20f58a33a7f2290600090a250565b60006020828403121561069e57600080fd5b5035919050565b6001600160a01b03811681146106ba57600080fd5b50565b600080604083850312156106d057600080fd5b82356106db816106a5565b946020939093013593505050565b6000602082840312156106fb57600080fd5b8135610706816106a5565b9392505050565b60006020828403121561071f57600080fd5b8151801515811461070657600080fd5b60006020828403121561074157600080fd5b8151610706816106a5565b60006020828403121561075e57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156100cb576100cb610765565b80820281158282048414176100cb576100cb61076556"; + +type PrepayFacetConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: PrepayFacetConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class PrepayFacet__factory extends ContractFactory { + constructor(...args: PrepayFacetConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy(overrides || {}) as Promise; + } + override getDeployTransaction( + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction(overrides || {}); + } + override attach(address: string): PrepayFacet { + return super.attach(address) as PrepayFacet; + } + override connect(signer: Signer): PrepayFacet__factory { + return super.connect(signer) as PrepayFacet__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): PrepayFacetInterface { + return new utils.Interface(_abi) as PrepayFacetInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): PrepayFacet { + return new Contract(address, _abi, signerOrProvider) as PrepayFacet; + } +} diff --git a/packages/generated/v3/typings/factories/TokenPausableFacet__factory.ts b/packages/generated/v3/typings/factories/TokenPausableFacet__factory.ts new file mode 100644 index 000000000..3276b8504 --- /dev/null +++ b/packages/generated/v3/typings/factories/TokenPausableFacet__factory.ts @@ -0,0 +1,227 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../common"; +import type { + TokenPausableFacet, + TokenPausableFacetInterface, +} from "../TokenPausableFacet"; + +const _abi = [ + { + type: "function", + name: "__Pausable_init", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "pause", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "paused", + inputs: [], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "unpause", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceAdded", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "InterfaceRemoved", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + indexed: true, + internalType: "bytes4", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OwnershipTransferred", + inputs: [ + { + name: "previousOwner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newOwner", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Paused", + inputs: [ + { + name: "account", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Unpaused", + inputs: [ + { + name: "account", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "Initializable_InInitializingState", + inputs: [], + }, + { + type: "error", + name: "Initializable_NotInInitializingState", + inputs: [], + }, + { + type: "error", + name: "Introspection_AlreadySupported", + inputs: [], + }, + { + type: "error", + name: "Introspection_NotSupported", + inputs: [], + }, + { + type: "error", + name: "Ownable__NotOwner", + inputs: [ + { + name: "account", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "Ownable__ZeroAddress", + inputs: [], + }, + { + type: "error", + name: "Pausable__NotPaused", + inputs: [], + }, + { + type: "error", + name: "Pausable__Paused", + inputs: [], + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b5061001961001e565b6100c4565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef520008054640100000000900460ff161561006a576040516366008a2d60e01b815260040160405180910390fd5b805463ffffffff90811610156100c157805463ffffffff191663ffffffff90811782556040519081527fe9c9b456cb2994b80aeef036cf59d26e9617df80f816a6ee5a5b4166e07e2f5c9060200160405180910390a15b50565b610391806100d36000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80633f4ba83a146100515780635c975abb1461005b5780638456cb591461007757806384d2023a1461007f575b600080fd5b610059610087565b005b610063610101565b604051901515815260200160405180910390f35b610059610121565b610059610195565b61008f6101df565b6001600160a01b0316336001600160a01b0316146100c7576040516365f4906560e01b81523360048201526024015b60405180910390fd5b6000805160206103718339815191525460ff166100f757604051632ca4452d60e11b815260040160405180910390fd5b6100ff6102a9565b565b600061011c6000805160206103718339815191525460ff1690565b905090565b6101296101df565b6001600160a01b0316336001600160a01b03161461015c576040516365f4906560e01b81523360048201526024016100be565b6000805160206103718339815191525460ff161561018d576040516302ca8ced60e11b815260040160405180910390fd5b6100ff6102f6565b7f59b501c3653afc186af7d48dda36cf6732bd21629a6295693664240a6ef5200054640100000000900460ff166100f757604051630ef4733760e31b815260040160405180910390fd5b6040805180820182527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b600546001600160a01b03168082527fd2f24d4f172e4e84e48e7c4125b6e904c29e5eba33ad4938fee51dd5dbd4b60154602080840182905284516331a9108f60e11b815260048101929092529351600094636352211e92602480820193918290030181865afa15801561027f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102a39190610340565b91505090565b600080516020610371833981519152805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b600080516020610371833981519152805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016102ec565b60006020828403121561035257600080fd5b81516001600160a01b038116811461036957600080fd5b939250505056fee17a067c7963a59b6dfd65d33b053fdbea1c56500e2aae4f976d9eda4da9eb00"; + +type TokenPausableFacetConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: TokenPausableFacetConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class TokenPausableFacet__factory extends ContractFactory { + constructor(...args: TokenPausableFacetConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy(overrides || {}) as Promise; + } + override getDeployTransaction( + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction(overrides || {}); + } + override attach(address: string): TokenPausableFacet { + return super.attach(address) as TokenPausableFacet; + } + override connect(signer: Signer): TokenPausableFacet__factory { + return super.connect(signer) as TokenPausableFacet__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): TokenPausableFacetInterface { + return new utils.Interface(_abi) as TokenPausableFacetInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): TokenPausableFacet { + return new Contract(address, _abi, signerOrProvider) as TokenPausableFacet; + } +} diff --git a/packages/generated/v3/typings/factories/UserEntitlement__factory.ts b/packages/generated/v3/typings/factories/UserEntitlement__factory.ts new file mode 100644 index 000000000..7c948249a --- /dev/null +++ b/packages/generated/v3/typings/factories/UserEntitlement__factory.ts @@ -0,0 +1,392 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../common"; +import type { + UserEntitlement, + UserEntitlementInterface, +} from "../UserEntitlement"; + +const _abi = [ + { + type: "constructor", + inputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "SPACE_ADDRESS", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "UPGRADE_INTERFACE_VERSION", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "description", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getEntitlementDataByRoleId", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "bytes", + internalType: "bytes", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "initialize", + inputs: [ + { + name: "_space", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "isCrosschain", + inputs: [], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "pure", + }, + { + type: "function", + name: "isEntitled", + inputs: [ + { + name: "channelId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "wallets", + type: "address[]", + internalType: "address[]", + }, + { + name: "permission", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "moduleType", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "name", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "proxiableUUID", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "removeEntitlement", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setEntitlement", + inputs: [ + { + name: "roleId", + type: "uint256", + internalType: "uint256", + }, + { + name: "entitlementData", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "supportsInterface", + inputs: [ + { + name: "interfaceId", + type: "bytes4", + internalType: "bytes4", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "upgradeToAndCall", + inputs: [ + { + name: "newImplementation", + type: "address", + internalType: "address", + }, + { + name: "data", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "payable", + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint64", + indexed: false, + internalType: "uint64", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Upgraded", + inputs: [ + { + name: "implementation", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "AddressEmptyCode", + inputs: [ + { + name: "target", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "ERC1967InvalidImplementation", + inputs: [ + { + name: "implementation", + type: "address", + internalType: "address", + }, + ], + }, + { + type: "error", + name: "ERC1967NonPayable", + inputs: [], + }, + { + type: "error", + name: "Entitlement__InvalidValue", + inputs: [], + }, + { + type: "error", + name: "Entitlement__NotAllowed", + inputs: [], + }, + { + type: "error", + name: "Entitlement__NotMember", + inputs: [], + }, + { + type: "error", + name: "Entitlement__ValueAlreadyExists", + inputs: [], + }, + { + type: "error", + name: "FailedInnerCall", + inputs: [], + }, + { + type: "error", + name: "InvalidInitialization", + inputs: [], + }, + { + type: "error", + name: "NotInitializing", + inputs: [], + }, + { + type: "error", + name: "UUPSUnauthorizedCallContext", + inputs: [], + }, + { + type: "error", + name: "UUPSUnsupportedProxiableUUID", + inputs: [ + { + name: "slot", + type: "bytes32", + internalType: "bytes32", + }, + ], + }, +] as const; + +const _bytecode = + "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051611ae36100fd60003960008181610aa101528181610aca0152610c410152611ae36000f3fe6080604052600436106100dd5760003560e01c806352d1902d1161007f578063ad3cb1cc11610059578063ad3cb1cc146102a0578063c4d66de8146102d1578063ef8be574146102f1578063f0c111f91461031157600080fd5b806352d1902d146102015780636465e69f146102245780637284e4161461025f57600080fd5b80631eee07b2116100bb5780631eee07b2146101805780632e1b61e4146101a057806334322eff146101b45780634f1ef286146101ec57600080fd5b806301ffc9a7146100e257806306fdde03146101175780630cf0b53314610160575b600080fd5b3480156100ee57600080fd5b506101026100fd3660046113fc565b610331565b60405190151581526020015b60405180910390f35b34801561012357600080fd5b506101536040518060400160405280601081526020016f155cd95c88115b9d1a5d1b195b595b9d60821b81525081565b60405161010e9190611476565b34801561016c57600080fd5b5061010261017b3660046115ac565b610368565b34801561018c57600080fd5b5061015361019b3660046115fb565b610393565b3480156101ac57600080fd5b506000610102565b3480156101c057600080fd5b506000546101d4906001600160a01b031681565b6040516001600160a01b03909116815260200161010e565b6101ff6101fa36600461163b565b6103d1565b005b34801561020d57600080fd5b506102166103f0565b60405190815260200161010e565b34801561023057600080fd5b506101536040518060400160405280600f81526020016e155cd95c915b9d1a5d1b195b595b9d608a1b81525081565b34801561026b57600080fd5b5061015360405180604001604052806015815260200174456e7469746c656d656e7420666f7220757365727360581b81525081565b3480156102ac57600080fd5b50610153604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156102dd57600080fd5b506101ff6102ec3660046116c6565b61040d565b3480156102fd57600080fd5b506101ff61030c3660046116e1565b610545565b34801561031d57600080fd5b506101ff61032c3660046115fb565b6107bb565b60006001600160e01b03198216637bc2cb4560e11b148061036257506301ffc9a760e01b6001600160e01b03198316145b92915050565b600083156103825761037b84848461090b565b905061038c565b61037b8383610a36565b9392505050565b6060600160008381526020019081526020016000206002016040516020016103bb919061175c565b6040516020818303038152906040529050919050565b6103d9610a96565b6103e282610b3d565b6103ec8282610b74565b5050565b60006103fa610c36565b50600080516020611ac383398151915290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156104525750825b90506000826001600160401b0316600114801561046e5750303b155b90508115801561047c575080155b1561049a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156104c457845460ff60401b1916600160401b1785555b6104cc610c7f565b6104d4610c7f565b6104dc610c7f565b600080546001600160a01b0319166001600160a01b038816179055831561053d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b6000546001600160a01b0316336001600160a01b03161461057957604051630ce39a4b60e21b815260040160405180910390fd5b6000610587828401846117ac565b905060005b81518110156105ef5760008282815181106105a9576105a96117e8565b6020026020010151905060006001600160a01b0316816001600160a01b0316036105e6576040516372bbc80f60e11b815260040160405180910390fd5b5060010161058c565b505b600084815260016020526040902060020154156106a157600084815260016020819052604082206002018054909161062891611814565b81548110610638576106386117e8565b6000918252602090912001546001600160a01b031690506106598186610c87565b600085815260016020526040902060020180548061067957610679611827565b600082815260209020810160001990810180546001600160a01b0319169055019055506105f1565b6000848152600160208190526040822080546001600160a01b0319168155908101829055906106d36002830182611364565b505060405180606001604052806106e73390565b6001600160a01b0390811682524260208084019190915260409283018590526000888152600180835290849020855181546001600160a01b03191694169390931783558482015190830155918301518051919261074c92600285019290910190611382565b5090505060005b81518110156107b45760026000838381518110610772576107726117e8565b6020908102919091018101516001600160a01b031682528181019290925260400160009081208054600181810183559183529290912090910186905501610753565b5050505050565b6000546001600160a01b0316336001600160a01b0316146107ef57604051630ce39a4b60e21b815260040160405180910390fd5b6000818152600160205260409020546001600160a01b0316610824576040516372bbc80f60e11b815260040160405180910390fd5b600081815260016020526040902060020154156108d457600081815260016020819052604082206002018054909161085b91611814565b8154811061086b5761086b6117e8565b6000918252602090912001546001600160a01b0316905061088c8183610c87565b60008281526001602052604090206002018054806108ac576108ac611827565b600082815260209020810160001990810180546001600160a01b031916905501905550610824565b6000818152600160208190526040822080546001600160a01b0319168155908101829055906109066002830182611364565b505050565b6000805460405163418e15c160e11b81526004810186905282916001600160a01b03169063831c2b8290602401600060405180830381865afa158015610955573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261097d9190810190611882565b9050600061098a85610d95565b905060005b826060015151811015610a2c576000836060015182815181106109b4576109b46117e8565b6020026020010151905060005b8351811015610a2257818482815181106109dd576109dd6117e8565b6020026020010151148015610a105750610a10848281518110610a0257610a026117e8565b602002602001015188611055565b15610a1a57600195505b6001016109c1565b505060010161098f565b5050509392505050565b600080610a4284610d95565b905060005b8151811015610a8b57610a73828281518110610a6557610a656117e8565b602002602001015185611055565b15610a8357600192505050610362565b600101610a47565b506000949350505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610b1d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b11600080516020611ac3833981519152546001600160a01b031690565b6001600160a01b031614155b15610b3b5760405163703e46dd60e11b815260040160405180910390fd5b565b6000546001600160a01b0316336001600160a01b031614610b7157604051630ce39a4b60e21b815260040160405180910390fd5b50565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610bce575060408051601f3d908101601f19168201909252610bcb9181019061198a565b60015b610bfb57604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b600080516020611ac38339815191528114610c2c57604051632a87526960e21b815260048101829052602401610bf2565b6109068383611146565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3b5760405163703e46dd60e11b815260040160405180910390fd5b610b3b61119c565b6001600160a01b0382166000908152600260205260408120905b8154811015610d4c5782828281548110610cbd57610cbd6117e8565b906000526020600020015403610d445781548290610cdd90600190611814565b81548110610ced57610ced6117e8565b9060005260206000200154828281548110610d0a57610d0a6117e8565b906000526020600020018190555081805480610d2857610d28611827565b6001900381819060005260206000200160009055905550505050565b600101610ca1565b5060405162461bcd60e51b815260206004820152601e60248201527f526f6c65204944206e6f7420666f756e6420666f7220746865207573657200006044820152606401610bf2565b60606000805b8351811015610dfb5760026000858381518110610dba57610dba6117e8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054905082610df191906119a3565b9150600101610d9b565b50600160005260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e054610e3290826119a3565b90506000816001600160401b03811115610e4e57610e4e611489565b604051908082528060200260200182016040528015610e77578160200160208202803683370190505b5090506000805b8551811015610f7957600060026000888481518110610e9f57610e9f6117e8565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f1157602002820191906000526020600020905b815481526020019060010190808311610efd575b5050505050905060005b8151811015610f6f57818181518110610f3657610f366117e8565b6020026020010151858580610f4a906119b6565b965081518110610f5c57610f5c6117e8565b6020908102919091010152600101610f1b565b5050600101610e7e565b5060016000908152600260209081527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e08054604080518285028101850190915281815292830182828015610fec57602002820191906000526020600020905b815481526020019060010190808311610fd8575b5050505050905060005b815181101561104a57818181518110611011576110116117e8565b6020026020010151848480611025906119b6565b955081518110611037576110376117e8565b6020908102919091010152600101610ff6565b509195945050505050565b6000805460405163b426423360e01b81526004810185905282916001600160a01b03169063b426423390602401600060405180830381865afa15801561109f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110c791908101906119cf565b805190915060005b8181101561113a5760008382815181106110eb576110eb6117e8565b60200260200101516040516020016111039190611a7f565b60405160208183030381529060405261111b90611a9b565b9050858103611131576001945050505050610362565b506001016110cf565b50600095945050505050565b61114f826111e5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561119457610906828261124a565b6103ec6112c0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b3b57604051631afcd79f60e31b815260040160405180910390fd5b806001600160a01b03163b60000361121b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610bf2565b600080516020611ac383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516112679190611a7f565b600060405180830381855af49150503d80600081146112a2576040519150601f19603f3d011682016040523d82523d6000602084013e6112a7565b606091505b50915091506112b78583836112df565b95945050505050565b3415610b3b5760405163b398979f60e01b815260040160405180910390fd5b6060826112f4576112ef8261133b565b61038c565b815115801561130b57506001600160a01b0384163b155b1561133457604051639996b31560e01b81526001600160a01b0385166004820152602401610bf2565b508061038c565b80511561134b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610b7191906113e7565b8280548282559060005260206000209081019282156113d7579160200282015b828111156113d757825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906113a2565b506113e39291506113e7565b5090565b5b808211156113e357600081556001016113e8565b60006020828403121561140e57600080fd5b81356001600160e01b03198116811461038c57600080fd5b60005b83811015611441578181015183820152602001611429565b50506000910152565b60008151808452611462816020860160208601611426565b601f01601f19169290920160200192915050565b60208152600061038c602083018461144a565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156114c1576114c1611489565b60405290565b604051601f8201601f191681016001600160401b03811182821017156114ef576114ef611489565b604052919050565b60006001600160401b0382111561151057611510611489565b5060051b60200190565b80356001600160a01b038116811461153157600080fd5b919050565b600082601f83011261154757600080fd5b8135602061155c611557836114f7565b6114c7565b8083825260208201915060208460051b87010193508684111561157e57600080fd5b602086015b848110156115a1576115948161151a565b8352918301918301611583565b509695505050505050565b6000806000606084860312156115c157600080fd5b8335925060208401356001600160401b038111156115de57600080fd5b6115ea86828701611536565b925050604084013590509250925092565b60006020828403121561160d57600080fd5b5035919050565b60006001600160401b0382111561162d5761162d611489565b50601f01601f191660200190565b6000806040838503121561164e57600080fd5b6116578361151a565b915060208301356001600160401b0381111561167257600080fd5b8301601f8101851361168357600080fd5b803561169161155782611614565b8181528660208385010111156116a657600080fd5b816020840160208301376000602083830101528093505050509250929050565b6000602082840312156116d857600080fd5b61038c8261151a565b6000806000604084860312156116f657600080fd5b8335925060208401356001600160401b038082111561171457600080fd5b818601915086601f83011261172857600080fd5b81358181111561173757600080fd5b87602082850101111561174957600080fd5b6020830194508093505050509250925092565b6020808252825482820181905260008481528281209092916040850190845b818110156117a05783546001600160a01b03168352600193840193928501920161177b565b50909695505050505050565b6000602082840312156117be57600080fd5b81356001600160401b038111156117d457600080fd5b6117e084828501611536565b949350505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610362576103626117fe565b634e487b7160e01b600052603160045260246000fd5b600082601f83011261184e57600080fd5b815161185c61155782611614565b81815284602083860101111561187157600080fd5b6117e0826020830160208701611426565b6000602080838503121561189557600080fd5b82516001600160401b03808211156118ac57600080fd5b90840190608082870312156118c057600080fd5b6118c861149f565b825181528383015180151581146118de57600080fd5b818501526040830151828111156118f457600080fd5b6119008882860161183d565b60408301525060608301518281111561191857600080fd5b80840193505086601f84011261192d57600080fd5b8251915061193d611557836114f7565b82815260059290921b8301840191848101908884111561195c57600080fd5b938501935b8385101561197a57845182529385019390850190611961565b6060830152509695505050505050565b60006020828403121561199c57600080fd5b5051919050565b80820180821115610362576103626117fe565b6000600182016119c8576119c86117fe565b5060010190565b600060208083850312156119e257600080fd5b82516001600160401b03808211156119f957600080fd5b818501915085601f830112611a0d57600080fd5b8151611a1b611557826114f7565b81815260059190911b83018401908481019088831115611a3a57600080fd5b8585015b83811015611a7257805185811115611a565760008081fd5b611a648b89838a010161183d565b845250918601918601611a3e565b5098975050505050505050565b60008251611a91818460208701611426565b9190910192915050565b80516020808301519190811015611abc576000198160200360031b1b821691505b5091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + +type UserEntitlementConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: UserEntitlementConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class UserEntitlement__factory extends ContractFactory { + constructor(...args: UserEntitlementConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy(overrides || {}) as Promise; + } + override getDeployTransaction( + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction(overrides || {}); + } + override attach(address: string): UserEntitlement { + return super.attach(address) as UserEntitlement; + } + override connect(signer: Signer): UserEntitlement__factory { + return super.connect(signer) as UserEntitlement__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): UserEntitlementInterface { + return new utils.Interface(_abi) as UserEntitlementInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): UserEntitlement { + return new Contract(address, _abi, signerOrProvider) as UserEntitlement; + } +} diff --git a/packages/generated/v3/typings/factories/index.ts b/packages/generated/v3/typings/factories/index.ts new file mode 100644 index 000000000..2dfa74ed8 --- /dev/null +++ b/packages/generated/v3/typings/factories/index.ts @@ -0,0 +1,30 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { IArchitect__factory } from "./IArchitect__factory"; +export { IBanning__factory } from "./IBanning__factory"; +export { IChannel__factory } from "./IChannel__factory"; +export { ICustomEntitlement__factory } from "./ICustomEntitlement__factory"; +export { IDiamond__factory } from "./IDiamond__factory"; +export { IDiamondCut__factory } from "./IDiamondCut__factory"; +export { IERC721AQueryable__factory } from "./IERC721AQueryable__factory"; +export { IEntitlementsManager__factory } from "./IEntitlementsManager__factory"; +export { IMulticall__factory } from "./IMulticall__factory"; +export { INodeRegistry__factory } from "./INodeRegistry__factory"; +export { IOperatorRegistry__factory } from "./IOperatorRegistry__factory"; +export { IPausable__factory } from "./IPausable__factory"; +export { IPricingModules__factory } from "./IPricingModules__factory"; +export { IProxyManager__factory } from "./IProxyManager__factory"; +export { IRoles__factory } from "./IRoles__factory"; +export { IRuleEntitlement__factory } from "./IRuleEntitlement__factory"; +export { ISpaceOwner__factory } from "./ISpaceOwner__factory"; +export { IStreamRegistry__factory } from "./IStreamRegistry__factory"; +export { IWalletLink__factory } from "./IWalletLink__factory"; +export { Member__factory } from "./Member__factory"; +export { MembershipFacet__factory } from "./MembershipFacet__factory"; +export { MockERC721A__factory } from "./MockERC721A__factory"; +export { MockEntitlementGated__factory } from "./MockEntitlementGated__factory"; +export { OwnableFacet__factory } from "./OwnableFacet__factory"; +export { PrepayFacet__factory } from "./PrepayFacet__factory"; +export { TokenPausableFacet__factory } from "./TokenPausableFacet__factory"; +export { UserEntitlement__factory } from "./UserEntitlement__factory"; diff --git a/packages/generated/v3/typings/index.ts b/packages/generated/v3/typings/index.ts new file mode 100644 index 000000000..95c0e3033 --- /dev/null +++ b/packages/generated/v3/typings/index.ts @@ -0,0 +1,58 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { IArchitect } from "./IArchitect"; +export type { IBanning } from "./IBanning"; +export type { IChannel } from "./IChannel"; +export type { ICustomEntitlement } from "./ICustomEntitlement"; +export type { IDiamond } from "./IDiamond"; +export type { IDiamondCut } from "./IDiamondCut"; +export type { IERC721AQueryable } from "./IERC721AQueryable"; +export type { IEntitlementsManager } from "./IEntitlementsManager"; +export type { IMulticall } from "./IMulticall"; +export type { INodeRegistry } from "./INodeRegistry"; +export type { IOperatorRegistry } from "./IOperatorRegistry"; +export type { IPausable } from "./IPausable"; +export type { IPricingModules } from "./IPricingModules"; +export type { IProxyManager } from "./IProxyManager"; +export type { IRoles } from "./IRoles"; +export type { IRuleEntitlement } from "./IRuleEntitlement"; +export type { ISpaceOwner } from "./ISpaceOwner"; +export type { IStreamRegistry } from "./IStreamRegistry"; +export type { IWalletLink } from "./IWalletLink"; +export type { Member } from "./Member"; +export type { MembershipFacet } from "./MembershipFacet"; +export type { MockERC721A } from "./MockERC721A"; +export type { MockEntitlementGated } from "./MockEntitlementGated"; +export type { OwnableFacet } from "./OwnableFacet"; +export type { PrepayFacet } from "./PrepayFacet"; +export type { TokenPausableFacet } from "./TokenPausableFacet"; +export type { UserEntitlement } from "./UserEntitlement"; +export * as factories from "./factories"; +export { IArchitect__factory } from "./factories/IArchitect__factory"; +export { IBanning__factory } from "./factories/IBanning__factory"; +export { IChannel__factory } from "./factories/IChannel__factory"; +export { ICustomEntitlement__factory } from "./factories/ICustomEntitlement__factory"; +export { IDiamond__factory } from "./factories/IDiamond__factory"; +export { IDiamondCut__factory } from "./factories/IDiamondCut__factory"; +export { IEntitlementsManager__factory } from "./factories/IEntitlementsManager__factory"; +export { IERC721AQueryable__factory } from "./factories/IERC721AQueryable__factory"; +export { IMulticall__factory } from "./factories/IMulticall__factory"; +export { INodeRegistry__factory } from "./factories/INodeRegistry__factory"; +export { IOperatorRegistry__factory } from "./factories/IOperatorRegistry__factory"; +export { IPausable__factory } from "./factories/IPausable__factory"; +export { IPricingModules__factory } from "./factories/IPricingModules__factory"; +export { IProxyManager__factory } from "./factories/IProxyManager__factory"; +export { IRoles__factory } from "./factories/IRoles__factory"; +export { IRuleEntitlement__factory } from "./factories/IRuleEntitlement__factory"; +export { ISpaceOwner__factory } from "./factories/ISpaceOwner__factory"; +export { IStreamRegistry__factory } from "./factories/IStreamRegistry__factory"; +export { IWalletLink__factory } from "./factories/IWalletLink__factory"; +export { Member__factory } from "./factories/Member__factory"; +export { MembershipFacet__factory } from "./factories/MembershipFacet__factory"; +export { MockEntitlementGated__factory } from "./factories/MockEntitlementGated__factory"; +export { MockERC721A__factory } from "./factories/MockERC721A__factory"; +export { OwnableFacet__factory } from "./factories/OwnableFacet__factory"; +export { PrepayFacet__factory } from "./factories/PrepayFacet__factory"; +export { TokenPausableFacet__factory } from "./factories/TokenPausableFacet__factory"; +export { UserEntitlement__factory } from "./factories/UserEntitlement__factory"; diff --git a/packages/prettier-config/README.md b/packages/prettier-config/README.md new file mode 100644 index 000000000..7c4ae3db8 --- /dev/null +++ b/packages/prettier-config/README.md @@ -0,0 +1,3 @@ +## @harmony/prettier-config + +A shared prettier configuration between packages diff --git a/packages/prettier-config/config.js b/packages/prettier-config/config.js new file mode 100644 index 000000000..b274731c0 --- /dev/null +++ b/packages/prettier-config/config.js @@ -0,0 +1,24 @@ +module.exports = { + arrowParens: 'always', + endOfLine: 'lf', + printWidth: 80, + semi: true, + singleQuote: false, + tabWidth: 2, + trailingComma: 'all', + + overrides: [ + { + files: ['*.js', '*.json', '*.ts', '*.tsx', '*.yml', '*.yaml'], + options: { + arrowParens: 'always', + endOfLine: 'lf', + printWidth: 100, + semi: false, + singleQuote: true, + tabWidth: 4, + trailingComma: 'all', + }, + }, + ], +} diff --git a/packages/prettier-config/package.json b/packages/prettier-config/package.json new file mode 100644 index 000000000..7120827b5 --- /dev/null +++ b/packages/prettier-config/package.json @@ -0,0 +1,9 @@ +{ + "name": "@harmony/prettier-config", + "version": "workspace:^", + "license": "MIT", + "main": "config.js", + "peerDependencies": { + "prettier": "^2.8.8" + } +} diff --git a/packages/stress-testing/.dockerignore b/packages/stress-testing/.dockerignore new file mode 100644 index 000000000..1b459d966 --- /dev/null +++ b/packages/stress-testing/.dockerignore @@ -0,0 +1,6 @@ +**/node_modules +node_modules +**/.git +**/temp +Dockerfile* +.dockerignore \ No newline at end of file diff --git a/packages/stress-testing/.env.example b/packages/stress-testing/.env.example new file mode 100644 index 000000000..e5fb7f5ad --- /dev/null +++ b/packages/stress-testing/.env.example @@ -0,0 +1,14 @@ +STRESS_MODE="chat" +RIVER_ENV= +SPACE_ID= +ANNOUNCE_CHANNEL_ID= +CHANNEL_IDS= +STRESS_DURATION="180" +CLIENTS_PER_PROCESS="2" +CLIENTS_COUNT="8" +MNEMONIC= # secret +BASE_CHAIN_RPC_URL= # local or get from alchemy +RIVER_CHAIN_RPC_URL= # local or devnet +CONTAINER_INDEX= # set programatically +CONTAINER_COUNT= # set programatically +SESSION_ID= # one id across all containers unique per run diff --git a/packages/stress-testing/.env.example.gamma b/packages/stress-testing/.env.example.gamma new file mode 100644 index 000000000..bc4e27d7b --- /dev/null +++ b/packages/stress-testing/.env.example.gamma @@ -0,0 +1,14 @@ +STRESS_MODE="chat" +RIVER_ENV="gamma" +SPACE_ID="10a38bcf15ab6b94d404c201dee9f67c6428c0ecb10000000000000000000000" +ANNOUNCE_CHANNEL_ID="20a38bcf15ab6b94d404c201dee9f67c6428c0ecb1a166f49d6787eb5dd4e1b1" +CHANNEL_IDS="20a38bcf15ab6b94d404c201dee9f67c6428c0ecb14c8601d7f529814cebe12c,20a38bcf15ab6b94d404c201dee9f67c6428c0ecb1826ef52f48e2e904844cff" +RIVER_CHAIN_RPC_URL="https://devnet.rpc.river.build" +STRESS_DURATION="180" +CLIENTS_PER_PROCESS="2" +CLIENTS_COUNT="8" +MNEMONIC= # get from the team +BASE_CHAIN_RPC_URL= # get from alchemy +CONTAINER_INDEX= # set programmatically +CONTAINER_COUNT= # set programmatically +SESSION_ID= # one id across all containers unique per run diff --git a/packages/stress-testing/Dockerfile b/packages/stress-testing/Dockerfile new file mode 100644 index 000000000..bca4a032e --- /dev/null +++ b/packages/stress-testing/Dockerfile @@ -0,0 +1,45 @@ +FROM docker.io/golang:1.22.2-bookworm + +# Install curl and software-properties-common, necessary for adding repositories +RUN apt-get update && apt-get install -y curl software-properties-common gnupg2 + +# Add the NodeSource Node.js 20.x repo for Debian-based distributions +RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - + +# Now install Node.js (which includes npm) and other dependencies +RUN apt-get update && apt-get install -y \ + nodejs \ + bash \ + git \ + curl \ + protobuf-compiler \ + python3 \ + python3-pip \ + make \ + uuid-runtime \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Python config +RUN pip3 install --break-system-packages --no-cache --upgrade pip setuptools + +# Install buf +RUN GO111MODULE=on GOBIN=/usr/local/bin go install \ + github.com/bufbuild/buf/cmd/buf@v1.28.1 + +# Install yarn +RUN npm install -g corepack@0.24.1 +RUN corepack enable +RUN yarn set version 3.5.1 + +# Copy files +COPY . /monorepo + +WORKDIR /monorepo + +RUN yarn +RUN yarn csb:build + +ENV MONOREPO_ROOT=/monorepo + +ENTRYPOINT [ "./packages/stress-testing/scripts/start-node.sh" ] diff --git a/packages/stress-testing/README.md b/packages/stress-testing/README.md new file mode 100644 index 000000000..aa355c150 --- /dev/null +++ b/packages/stress-testing/README.md @@ -0,0 +1,11 @@ +## Introduction + +This is a reference for the terraform implementation of the stress tests + +## Environment variables + + see variables in core/stress/scripts/start.sh + +## Local development + +From the root of the load-testing directory (/harmony/servers/load-testing), run `SESSION_ID=$(uuidgen) docker compose up --build`. This should bring up all the necessary components and run the load tests for you. If you ever make a change, you should run `SESSION_ID=$(uuidgen) docker compose` with the `--build` option. Otherwise it will use the cached version, which will exclude your recent changes. diff --git a/packages/stress-testing/docker-compose.yml b/packages/stress-testing/docker-compose.yml new file mode 100644 index 000000000..ca10a2748 --- /dev/null +++ b/packages/stress-testing/docker-compose.yml @@ -0,0 +1,29 @@ +version: '3' +services: + redis: + image: redis:latest + container_name: stress-testing-redis + ports: + - '6379:6379' + stress-00: + build: + context: ../../ + dockerfile: ./packages/stress-testing/Dockerfile + env_file: .env + environment: + - CONTAINER_COUNT=2 + - CONTAINER_INDEX=0 + - SESSION_ID=${SESSION_ID} + depends_on: + - redis + stress-01: + build: + context: ../../ + dockerfile: ./packages/stress-testing/Dockerfile + env_file: .env + environment: + - CONTAINER_COUNT=2 + - CONTAINER_INDEX=1 + - SESSION_ID=${SESSION_ID} + depends_on: + - redis diff --git a/packages/stress-testing/scripts/start-node.sh b/packages/stress-testing/scripts/start-node.sh new file mode 100755 index 000000000..b89dc50ba --- /dev/null +++ b/packages/stress-testing/scripts/start-node.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash + +set -eo pipefail + +function check_env() { + if [ -z "$MONOREPO_ROOT" ]; then + echo "MONOREPO ROOT is not set" + exit 1 + else + echo "MONOREPO ROOT is set to $MONOREPO_ROOT" + fi +} + +function check_dependencies() { + if ! command -v echo &> /dev/null + then + echo "echo was not found" + exit 1 + fi +} + +function cleanup() { + echo "cleaning up" + pkill -P $$ # kill all child processes +} + + +function main() { + ./core/stress/scripts/start.sh @ +} + +# trap cleanup on exit to ensure child processes are killed +trap cleanup EXIT + +check_dependencies +check_env +main \ No newline at end of file diff --git a/remappings.txt b/remappings.txt new file mode 100644 index 000000000..dbb4c97b1 --- /dev/null +++ b/remappings.txt @@ -0,0 +1,9 @@ +@openzeppelin/=lib/@openzeppelin/ +account-abstraction/=lib/account-abstraction/contracts/ +base64/=lib/base64/ +ds-test/=lib/ds-test/src +forge-std/=lib/forge-std/src +hardhat-deploy/=lib/hardhat-deploy/ +@prb/math/=lib/@prb/math/src +@prb/test/=lib/@prb/test/src + diff --git a/scripts/Makefile b/scripts/Makefile new file mode 100644 index 000000000..e5b0989c0 --- /dev/null +++ b/scripts/Makefile @@ -0,0 +1,20 @@ + +VITE_SENTRY_ORG ?= here-not-there +VITE_SENTRY_PROJECT ?= harmony-web +LOG_LEVEL ?= info + +VITE_APP_RELEASE_VERSION ?= $(shell git rev-parse --short HEAD) +AUTH_TOKEN=$(SENTRY_AUTH_TOKEN) + +setup_release: create_release upload_sourcemaps finalize_release + +create_release: + @echo "Creating release $(VITE_APP_RELEASE_VERSION)" + @../node_modules/.bin/sentry-cli releases --log-level $(LOG_LEVEL) --auth-token $(AUTH_TOKEN) -o $(VITE_SENTRY_ORG) new -p $(VITE_SENTRY_PROJECT) $(VITE_APP_RELEASE_VERSION) + +upload_sourcemaps: + @../node_modules/.bin/sentry-cli releases --log-level $(LOG_LEVEL) --auth-token $(AUTH_TOKEN) -o $(VITE_SENTRY_ORG) -p $(VITE_SENTRY_PROJECT) files $(VITE_APP_RELEASE_VERSION) \ + upload-sourcemaps ../clients + +finalize_release: + @../node_modules/.bin/sentry-cli releases --log-level $(LOG_LEVEL) --auth-token $(AUTH_TOKEN) -o $(VITE_SENTRY_ORG) -p $(VITE_SENTRY_PROJECT) finalize $(VITE_APP_RELEASE_VERSION) \ No newline at end of file diff --git a/scripts/bc-all-start.sh b/scripts/bc-all-start.sh new file mode 100755 index 000000000..60b12c403 --- /dev/null +++ b/scripts/bc-all-start.sh @@ -0,0 +1,22 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" +cd .. + +export RIVER_BLOCK_TIME="${RIVER_BLOCK_TIME:-1}" + +./scripts/bc-all-stop.sh + +# Function to wait for a process and exit if it fails +wait_for_process() { + local pid=$1 + local name=$2 + wait "$pid" || { echo "Error: $name (PID: $pid) failed." >&2; exit 1; } +} + +# Start chain in background +./scripts/start-local-basechain.sh & +./scripts/start-local-riverchain.sh & + + +echo "STARTED ALL CHAINS AND BUILT ALL CONTRACTS, BLOCK_TIME=${RIVER_BLOCK_TIME}" diff --git a/scripts/bc-all-stop.sh b/scripts/bc-all-stop.sh new file mode 100755 index 000000000..9f5236beb --- /dev/null +++ b/scripts/bc-all-stop.sh @@ -0,0 +1,17 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" +cd .. + +# Function to wait for a process and exit if it fails +wait_for_process() { + local pid=$1 + local name=$2 + wait "$pid" || { echo "Error: $name (PID: $pid) failed." >&2; exit 1; } +} + +./scripts/kill-on-port.sh 8545 & PID1=$! +./scripts/kill-on-port.sh 8546 & PID2=$! + +wait_for_process "$PID1" "stop_base_anvil" +wait_for_process "$PID2" "stop_river_anvil" diff --git a/scripts/build-artifacts.sh b/scripts/build-artifacts.sh new file mode 100755 index 000000000..08b70696e --- /dev/null +++ b/scripts/build-artifacts.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e +set -v + +forge build diff --git a/scripts/build-contract-coverage.sh b/scripts/build-contract-coverage.sh new file mode 100755 index 000000000..b68884c7d --- /dev/null +++ b/scripts/build-contract-coverage.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +forge coverage --report lcov +# https://github.com/foundry-rs/foundry/issues/2567 +lcov --remove lcov.info 'contracts/src/*Service.sol' 'contracts/src/*Storage.sol' 'contracts/test/*' 'contracts/scripts/*' 'contracts/src/governance/*' -o contracts/coverage/lcov.info --rc lcov_branch_coverage=1 +rm lcov.info +genhtml contracts/coverage/lcov.info -o contracts/coverage/reports --branch-coverage diff --git a/scripts/build-contract-types.sh b/scripts/build-contract-types.sh new file mode 100755 index 000000000..a9d36f4f8 --- /dev/null +++ b/scripts/build-contract-types.sh @@ -0,0 +1,44 @@ +#!/bin/bash +set -ueo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" +cd .. + +VERSION="${1:-localhost}" +if [ "$VERSION" = "localhost" ]; then + VERSION="dev" +elif [ "$VERSION" = "base_sepolia" ]; then + VERSION="v3" +fi +FROZEN="${2:-}" +ABI_DIR="packages/generated/${VERSION}/abis" + +forge build + +CONTRACT_INTERFACES="(IDiamond|IDiamondCut|IArchitect|IProxyManager|IPausable|IEntitlementsManager|IChannel|IRoles|IMulticall|IRuleEntitlement|IWalletLink|INodeRegistry|IOperatorRegistry|IStreamRegistry|OwnableFacet|TokenPausableFacet|UserEntitlement|ISpaceOwner|MockERC721A|MembershipFacet|Member|IBanning|IPricingModules|ICustomEntitlement|MockEntitlementGated|PrepayFacet|IERC721AQueryable)" + +yarn typechain --target=ethers-v5 "contracts/out/**/?${CONTRACT_INTERFACES}.json" --out-dir "packages/generated/${VERSION}/typings" + +mkdir -p $ABI_DIR && cp -a contracts/out/{Diamond,DiamondCutFacet,Architect,ProxyManager,IPausable,EntitlementsManager,Channels,Roles,IMulticall,OwnableFacet,WalletLink,NodeRegistry,OperatorRegistry,StreamRegistry,TokenPausableFacet,IRuleEntitlement,UserEntitlement,SpaceOwner,MockERC721A,MembershipFacet,Member,MockRiverRegistry,IBanning,IPricingModules,ICustomEntitlement,MockCustomEntitlement,MockEntitlementGated,PrepayFacet,IERC721AQueryable}.sol/* "$ABI_DIR" + +# Copy the json abis to TS files for type inference +for file in $ABI_DIR/*.abi.json; do + filename=$(basename "$file" .json) + echo "export default $(cat $file) as const" > $ABI_DIR/$filename.ts +done + +./scripts/gen-river-node-bindings.sh $VERSION +./scripts/gen-xchain-bindings.sh $VERSION + +DIFF_GLOB="$ABI_DIR/*.ts" + +# Using the $FROZEN flag and git diff, we can check if this script generates any new files +# under the $ABI_DIR directory. +if [ "$FROZEN" = "--frozen" ]; then + if git diff --quiet --exit-code -p $DIFF_GLOB; then + echo "No new types generated by build-contract-types.sh" + else + echo "$(git diff -p $DIFF_GLOB)" + echo "Error: build-contract-types.sh generated new types with the --frozen flag. Please re-run ./scripts/build-contract-types.sh to re-generate the files and commit the changes." + exit 1 + fi +fi diff --git a/scripts/build-contracts.sh b/scripts/build-contracts.sh new file mode 100755 index 000000000..d7818d736 --- /dev/null +++ b/scripts/build-contracts.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" +cd .. + +# Start contract build in background +pushd contracts +set -a +. .env.localhost +set +a +make build +popd diff --git a/scripts/build-protobufs.sh b/scripts/build-protobufs.sh new file mode 100755 index 000000000..34603dda9 --- /dev/null +++ b/scripts/build-protobufs.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + + +pushd "$(git rev-parse --show-toplevel)" +echo "building protobufs" + +# typescript: we need to build the protobufs and generate the river/proto package +yarn csb:build +popd + +# golang +cd ../core/node +go generate -v -x protocol/gen.go diff --git a/scripts/check-go-version.sh b/scripts/check-go-version.sh new file mode 100755 index 000000000..c2cae3bb8 --- /dev/null +++ b/scripts/check-go-version.sh @@ -0,0 +1,28 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" +cd .. + +#!/bin/bash +GO_VERSION_FILE="go.work" + +# Extract the Go version from go.mod +MOD_VERSION_FULL=$(grep "^go " $GO_VERSION_FILE | awk '{print $2}') +MOD_VERSION=$(grep "^go " $GO_VERSION_FILE | awk '{print $2}' | awk -F. '{print $1"."$2}') + +# Extract the current Go version +CURRENT_VERSION_FULL=$(go version | awk '{print $3}' | tr -d 'go') +CURRENT_VERSION=$(go version | awk '{print $3}' | tr -d 'go' | awk -F. '{print $1"."$2}') + +# Compare the versions +if [[ "$MOD_VERSION" == "$CURRENT_VERSION" ]]; then + echo + echo "Local Go version $CURRENT_VERSION_FULL matches with go.mod: $MOD_VERSION_FULL" + echo +else + echo + echo "Required Go version in go.mod: $(tput setaf 9)$MOD_VERSION_FULL$(tput sgr0) Locally installed Go major.minor version: $(tput setaf 9)$CURRENT_VERSION_FULL$(tput sgr0)" + echo "Please install the required Go version and restart VSCode." + echo + exit 1 +fi diff --git a/scripts/check-node-version.sh b/scripts/check-node-version.sh new file mode 100755 index 000000000..40d0fa117 --- /dev/null +++ b/scripts/check-node-version.sh @@ -0,0 +1,32 @@ +#!/bin/bash +cd "$(git rev-parse --show-toplevel)" + +# Check for the presence of a .nvmrc file +if [ -f .nvmrc ]; then + # Read the version from the .nvmrc file + NVM_VERSION=$(cat .nvmrc) + + # Get the current Node version + CURRENT_VERSION=$(node -v) + + CURRENT_VERSION_MAJOR=$(echo $CURRENT_VERSION | cut -d'.' -f1) + + # Compare the versions + if [ $NVM_VERSION != $CURRENT_VERSION_MAJOR ]; then + echo + echo "Required Node.js version is $(tput setaf 10)$NVM_VERSION$(tput sgr0), but currently $(tput setaf 9)$CURRENT_VERSION$(tput sgr0) is in use." + echo + echo "To switch to $(tput setaf 10)$NVM_VERSION$(tput sgr0) run the command $(tput setaf 11)nvm install $NVM_VERSION --lts & nvm alias default $NVM_VERSION & nvm use default$(tput sgr0) and $(tput setaf 10)restart VSCode $(tput sgr0)" + echo "Press any key to continue" + read -n 1 -s -r RESPONSE + echo + + exit 1 + else + echo + echo "Correct Node.js version ($NVM_VERSION) is in use." + echo + fi +else + echo ".nvmrc file does not exist!" +fi diff --git a/scripts/configure-nodes.sh b/scripts/configure-nodes.sh new file mode 100755 index 000000000..6b8ac7386 --- /dev/null +++ b/scripts/configure-nodes.sh @@ -0,0 +1,24 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" +cd .. + + +# check to see if the user passed a --single or --multi flag +# if not, default to --single +if [ "$1" == "--single" ]; then + ./core/node/run_single.sh -c +elif [ "$1" == "--single_ne" ]; then + ./core/node/run_single.sh -c --de +elif [ "$1" == "--multi" ]; then + ./core/node/run_multi.sh -c +elif [ "$1" == "--multi_ne" ]; then + ./core/node/run_multi.sh -c --de +else + echo "No flag passed" + exit 1 +fi + + + + diff --git a/scripts/copyLibs.js b/scripts/copyLibs.js new file mode 100644 index 000000000..e0291e1e7 --- /dev/null +++ b/scripts/copyLibs.js @@ -0,0 +1,36 @@ +const fs = require('fs-extra') +const path = require('path') + +const CONTRACT_LIBS = [ + '@openzeppelin', + 'account-abstraction/contracts', + 'base64', + 'ds-test', + 'forge-std/src', + 'hardhat-deploy', + '@prb/math/src', + '@prb/test/src', +] + +const findNodeModules = () => { + // go up until we find node_modules + let dir = __dirname + while (!fs.existsSync(path.join(dir, 'node_modules'))) { + dir = path.dirname(dir) + } + return `${dir}/node_modules` +} + +const NODE_MODULES_DIR = findNodeModules() + +const rootDirectory = path.dirname(__dirname) +for (const lib of CONTRACT_LIBS) { + const source = path.join(NODE_MODULES_DIR, lib) + const destination = path.join(rootDirectory, 'lib', lib) + fs.copy(source, destination, function (err) { + if (err) { + return console.error(err) + } + console.log(`Copy completed from ${source} to ${destination}`) + }) +} diff --git a/scripts/deploy-contracts.sh b/scripts/deploy-contracts.sh new file mode 100755 index 000000000..d568d774f --- /dev/null +++ b/scripts/deploy-contracts.sh @@ -0,0 +1,88 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" +cd .. + +: ${RIVER_ENV:?} +export BASE_CHAIN_ID="${BASE_CHAIN_ID:-31337}" +export BASE_CONTRACT_VERSION="${BASE_CONTRACT_VERSION:-dev}" +export RIVER_CHAIN_ID="${RIVER_CHAIN_ID:-31338}" +export RIVER_CONTRACT_VERSION="${RIVER_CONTRACT_VERSION:-dev}" + +SKIP_CHAIN_WAIT="${SKIP_CHAIN_WAIT:-false}" +BASE_ANVIL_SOURCE_DIR=${BASE_ANVIL_SOURCE_DIR:-"base_anvil"} +RIVER_ANVIL_SOURCE_DIR=${RIVER_ANVIL_SOURCE_DIR:-"river_anvil"} + +echo "Deploying contracts for ${RIVER_ENV} environment" + +# Wait for the chains to be ready +if [ "${SKIP_CHAIN_WAIT}" != "true" ]; then + ./scripts/wait-for-basechain.sh + ./scripts/wait-for-riverchain.sh +fi + +rm -rf contracts/deployments/* +rm -rf packages/generated/deployments/${RIVER_ENV} + + +pushd contracts + +set -a +. .env.localhost +set +a + + +if [ "${1-}" != "nobuild" ]; then + make build +fi + +# Account Abstraction is not supported on anvil +# make deploy-base-anvil type=contract contract=DeployEntrypoint +# make deploy-base-anvil type=contract contract=DeployAccountFactory +RIVER_BLOCK_TIME="${RIVER_BLOCK_TIME:-1}" + +cast rpc evm_setAutomine true --rpc-url $BASE_ANVIL_RPC_URL +cast rpc evm_setAutomine true --rpc-url $RIVER_ANVIL_RPC_URL + +# Space Architect +make clear-anvil-deployments +make deploy-base-anvil type=contract contract=DeployBaseRegistry +make deploy-base-anvil type=contract contract=DeployProxyDelegation +make deploy-base-anvil type=contract contract=DeployRiverBase +make deploy-base-anvil type=contract contract=DeploySpaceFactory +make interact-base-anvil type=contract contract=InteractPostDeploy + +# Utils +make deploy-base-anvil type=contract contract=DeployMember +make deploy-base-anvil type=contract contract=DeployMockNFT +make deploy-base-anvil type=contract contract=DeployEntitlementGatedExample +make deploy-base-anvil type=contract contract=DeployCustomEntitlementExample + +# River Registry +make deploy-river-anvil type=contract contract=DeployRiverRegistry + +cast rpc evm_setIntervalMining $RIVER_BLOCK_TIME --rpc-url $BASE_ANVIL_RPC_URL +cast rpc evm_setIntervalMining $RIVER_BLOCK_TIME --rpc-url $RIVER_ANVIL_RPC_URL + +popd + +mkdir -p packages/generated/deployments/${RIVER_ENV}/base/addresses +mkdir -p packages/generated/deployments/${RIVER_ENV}/river/addresses + +function copy_addresses() { + local SOURCE_DIR=$1 + local DEST_DIR=$2 + local CHAIN_ID=$3 + local CONTRACT_VERSION=$4 + cp contracts/deployments/${SOURCE_DIR}/* packages/generated/deployments/${RIVER_ENV}/${DEST_DIR}/addresses + echo "{\"id\": ${CHAIN_ID}}" > packages/generated/deployments/${RIVER_ENV}/${DEST_DIR}/chainId.json + echo "{\"version\": \"${CONTRACT_VERSION}\"}" > packages/generated/deployments/${RIVER_ENV}/${DEST_DIR}/contractVersion.json +} + +# copy base contracts +copy_addresses $BASE_ANVIL_SOURCE_DIR "base" "${BASE_CHAIN_ID}" "${BASE_CONTRACT_VERSION}" +# copy river contracts +copy_addresses $RIVER_ANVIL_SOURCE_DIR "river" "${RIVER_CHAIN_ID}" "${RIVER_CONTRACT_VERSION}" + +# Update the config +./packages/generated/scripts/make-config.sh diff --git a/scripts/foundry-up.sh b/scripts/foundry-up.sh new file mode 100755 index 000000000..d57ecf9b4 --- /dev/null +++ b/scripts/foundry-up.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +## +## Pin foundry to specific version to avoid breaking changes +## version is defined in the github ci workflow yml file +## + +CI_YML=.github/workflows/ci.yml +VERSION=$(awk -F': ' '/FOUNDRY_VERSION:/ {print $2}' $CI_YML) + +echo "Updating foundry to $VERSION" + +foundryup -v $VERSION \ No newline at end of file diff --git a/scripts/gen-bindings-remove-struct.go b/scripts/gen-bindings-remove-struct.go new file mode 100644 index 000000000..c6730210e --- /dev/null +++ b/scripts/gen-bindings-remove-struct.go @@ -0,0 +1,107 @@ +package main + +// This Go program is designed to manage the complexities that arise when +// multiple Ethereum smart contracts depend on a common struct. In such +// scenarios, duplications of struct definitions can occur, especially when +// the contract bindings for all contracts are placed within the same package. +// The program automates the removal of these duplicate struct definitions. +// +// The main functionality involves parsing a Go source file to identify and +// remove specified struct definitions. It takes two command line arguments: +// the path to the Go file and a comma-separated list of struct names to be removed. +// The program carefully scans the source file, filters out the specified structs, +// and their associated comments, thus ensuring the cleanliness and maintainability +// of the codebase when dealing with multiple contract bindings. + +import ( + "fmt" + "go/ast" + "go/parser" + "go/printer" + "go/token" + "os" + "strings" +) + +func main() { + // Check for command line arguments + if len(os.Args) < 3 { + fmt.Println("Usage: go run script.go ") + os.Exit(1) + } + + // Get the file path from the command line arguments + filePath := os.Args[1] + + // Parse the list of structs to remove from the command line + structNames := strings.Split(os.Args[2], ",") + structsToRemove := make(map[string]bool) + for _, name := range structNames { + structsToRemove[name] = true + } + + // Parse the Go file + fset := token.NewFileSet() + file, err := parser.ParseFile(fset, filePath, nil, parser.ParseComments) + if err != nil { + panic(err) + } + + // Filter out the structs and their associated comments + var newDecls []ast.Decl + for _, decl := range file.Decls { + genDecl, ok := decl.(*ast.GenDecl) + if !ok || genDecl.Tok != token.TYPE { + newDecls = append(newDecls, decl) + continue + } + + found := false + for _, spec := range genDecl.Specs { + typeSpec, ok := spec.(*ast.TypeSpec) + if ok { + if _, exists := structsToRemove[typeSpec.Name.Name]; exists { + found = true + break + } + } + } + + if !found { + newDecls = append(newDecls, genDecl) + } + } + file.Decls = newDecls + + // Remove comments containing struct names + var newComments []*ast.CommentGroup + for _, c := range file.Comments { + includeCommentGroup := true + for _, comment := range c.List { + for structName := range structsToRemove { + if strings.Contains(comment.Text, structName) { + includeCommentGroup = false + break + } + } + if !includeCommentGroup { + break + } + } + if includeCommentGroup { + newComments = append(newComments, c) + } + } + file.Comments = newComments + + // Write the modified AST back to a file + outputFile, err := os.Create(filePath) + if err != nil { + panic(err) + } + defer outputFile.Close() + err = printer.Fprint(outputFile, fset, file) + if err != nil { + panic(err) + } +} diff --git a/scripts/gen-river-node-bindings.sh b/scripts/gen-river-node-bindings.sh new file mode 100755 index 000000000..c4b5ddfff --- /dev/null +++ b/scripts/gen-river-node-bindings.sh @@ -0,0 +1,80 @@ +#!/bin/bash -ue +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" +cd .. + +if [ -z ${ABIGEN_VERSION+x} ]; then + ABIGEN_VERSION="v1.13.10" +fi + +generate_go() { + local DIR=$1 + local CONTRACT=$2 + local GO_NAME=$3 + + local OUT_DIR="core/node/contracts/${DIR}" + mkdir -p "${OUT_DIR}" + + go run github.com/ethereum/go-ethereum/cmd/abigen@${ABIGEN_VERSION} \ + --abi contracts/out/${CONTRACT}.sol/${CONTRACT}.abi.json \ + --bin contracts/out/${CONTRACT}.sol/${CONTRACT}.bin \ + --pkg "${DIR}" \ + --type "${GO_NAME}" \ + --out "${OUT_DIR}/${GO_NAME}.go" +} + +# For explicitely versioned interfaces +generate_go_nover() { + local CONTRACT=$1 + local GO_NAME=$2 + + local OUT_DIR="core/node/contracts" + mkdir -p "${OUT_DIR}" + go run github.com/ethereum/go-ethereum/cmd/abigen@${ABIGEN_VERSION} \ + --abi contracts/out/${CONTRACT}.sol/${CONTRACT}.abi.json \ + --bin contracts/out/${CONTRACT}.sol/${CONTRACT}.bin \ + --pkg "contracts" \ + --type "${GO_NAME}" \ + --out "${OUT_DIR}/${GO_NAME}.go" +} + +generate_go_deploy() { + local CONTRACT=$1 + local GO_NAME=$2 + + local OUT_DIR="core/node/contracts/deploy" + mkdir -p "${OUT_DIR}" + + go run github.com/ethereum/go-ethereum/cmd/abigen@${ABIGEN_VERSION} \ + --abi contracts/out/${CONTRACT}.sol/${CONTRACT}.abi.json \ + --bin contracts/out/${CONTRACT}.sol/${CONTRACT}.bin \ + --pkg "deploy" \ + --type "${GO_NAME}" \ + --out "${OUT_DIR}/${GO_NAME}.go" +} + + +generate_go base IArchitect architect +generate_go base Channels channels +generate_go base IEntitlementsManager entitlements_manager +generate_go base IPausable pausable +generate_go base IWalletLink wallet_link +generate_go base IRuleEntitlement rule_entitlement + + +# The follwing structs get included twice in the generated code, this utility removes them from a file +# +# "IRuleEntitlementCheckOperation": true, +# "IRuleEntitlementLogicalOperation": true, +# "IRuleEntitlementOperation": true, +# "IRuleEntitlementRuleData": true, + +mkdir -p bin +go build -o bin/gen-bindings-remove-struct scripts/gen-bindings-remove-struct.go +./bin/gen-bindings-remove-struct core/node/contracts/base/architect.go IRuleEntitlementCheckOperation,IRuleEntitlementLogicalOperation,IRuleEntitlementOperation,IRuleEntitlementRuleData +./bin/gen-bindings-remove-struct core/node/contracts/base/entitlements_manager.go IRuleEntitlementCheckOperation,IRuleEntitlementLogicalOperation,IRuleEntitlementOperation,IRuleEntitlementRuleData + +generate_go_nover INodeRegistry node_registry_v1 +generate_go_nover IStreamRegistry stream_registry_v1 +generate_go_nover IOperatorRegistry operator_registry_v1 +generate_go_nover IRiverConfig river_config_v1 +generate_go_deploy MockRiverRegistry mock_river_registry diff --git a/scripts/gen-xchain-bindings.sh b/scripts/gen-xchain-bindings.sh new file mode 100755 index 000000000..31e54f51f --- /dev/null +++ b/scripts/gen-xchain-bindings.sh @@ -0,0 +1,82 @@ +#!/bin/bash +set -ueo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" +cd .. + +VERSION="${1:-localhost}" +if [ "$VERSION" = "localhost" ]; then + VERSION="dev" +elif [ "$VERSION" = "base_sepolia" ]; then + VERSION="v3" +fi + +if [ -z ${ABIGEN_VERSION+x} ]; then + ABIGEN_VERSION="v1.13.10" +fi + +XCHAIN_DIR="core/xchain/contracts" +BINDING_DIR="core/xchain/bindings" + +mkdir -p "${XCHAIN_DIR}/${VERSION}" + +generate_go() { + local CONTRACT=$1 + local GO_NAME=$2 + + go run github.com/ethereum/go-ethereum/cmd/abigen@${ABIGEN_VERSION} \ + --abi contracts/out/${CONTRACT}.sol/${CONTRACT}.abi.json \ + --bin contracts/out/${CONTRACT}.sol/${CONTRACT}.bin \ + --pkg "${VERSION}" \ + --type "${GO_NAME}" \ + --out "${XCHAIN_DIR}/${VERSION}/${GO_NAME}.go" +} + +generate_test_binding() { + local CONTRACT=$1 + local GO_NAME=$2 + + go run github.com/ethereum/go-ethereum/cmd/abigen@${ABIGEN_VERSION} \ + --abi contracts/out/${CONTRACT}.sol/${CONTRACT}.abi.json \ + --bin contracts/out/${CONTRACT}.sol/${CONTRACT}.bin \ + --pkg "dev" \ + --type "${GO_NAME}" \ + --out "${XCHAIN_DIR}/test/${GO_NAME}.go" +} + +generate_go_deploy() { + local CONTRACT=$1 + local GO_NAME=$2 + + local OUT_DIR="core/node/contracts/deploy" + mkdir -p "${OUT_DIR}" + + go run github.com/ethereum/go-ethereum/cmd/abigen@${ABIGEN_VERSION} \ + --abi contracts/out/${CONTRACT}.sol/${CONTRACT}.abi.json \ + --bin contracts/out/${CONTRACT}.sol/${CONTRACT}.bin \ + --pkg "deploy" \ + --type "${GO_NAME}" \ + --out "${OUT_DIR}/${GO_NAME}.go" +} + + +# Interfaces +generate_go IEntitlementChecker i_entitlement_checker +generate_go IEntitlementGated i_entitlement_gated +generate_go IEntitlement i_entitlement +generate_go ICustomEntitlement i_custom_entitlement +generate_go IWalletLink i_wallet_link + +# Contracts +generate_go MockCustomEntitlement mock_custom_entitlement +generate_go MockEntitlementGated mock_entitlement_gated +generate_go EntitlementChecker entitlement_checker +generate_go WalletLink wallet_link + +# Unversion contracts +generate_test_binding MockERC20 mock_erc20 +generate_test_binding MockERC721 mock_erc721 + +mkdir -p bin +go build -o bin/gen-bindings-remove-struct scripts/gen-bindings-remove-struct.go +./bin/gen-bindings-remove-struct core/xchain/contracts/${VERSION}/mock_entitlement_gated.go IRuleEntitlementCheckOperation,IRuleEntitlementLogicalOperation,IRuleEntitlementOperation,IRuleEntitlementRuleData +./bin/gen-bindings-remove-struct core/xchain/contracts/${VERSION}/wallet_link.go IWalletLinkBaseLinkedWallet \ No newline at end of file diff --git a/scripts/install-deps.sh b/scripts/install-deps.sh new file mode 100755 index 000000000..07059403d --- /dev/null +++ b/scripts/install-deps.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -e + +# Make sure that the working directory is always the directory of the script +cd "$(dirname "$0")" +yarn diff --git a/scripts/install-protobuf-deps.sh b/scripts/install-protobuf-deps.sh new file mode 100755 index 000000000..02da4c623 --- /dev/null +++ b/scripts/install-protobuf-deps.sh @@ -0,0 +1,15 @@ +# +# TODO: rename this script +# install go deps required to work with protobufs, format and analyze go code +# run this script if your version doesn't match the checked in proto version +# note 7/2023 - At some point we should probaby freeze these and update them by hand? For now just get latest. +# + + +go install github.com/bufbuild/buf/cmd/buf@latest +go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest +go install google.golang.org/protobuf/cmd/protoc-gen-go@latest +go install connectrpc.com/connect/cmd/protoc-gen-connect-go@latest +go install honnef.co/go/tools/cmd/staticcheck@latest +go install mvdan.cc/gofumpt@latest +go install github.com/segmentio/golines@latest diff --git a/scripts/kill-all-local-dev.sh b/scripts/kill-all-local-dev.sh new file mode 100755 index 000000000..c8659f09f --- /dev/null +++ b/scripts/kill-all-local-dev.sh @@ -0,0 +1,114 @@ +#!/bin/bash + +## +## If visual studio crashes after running ~start local dev~ +## it will leave lots of things running in the background +## this script will kill all the processes that are running on your local machine. +## it will also clean up core/river docker containers +## +## usage: ./kill-all-local-dev.sh -y +## + + +# Argument parsing +while getopts "yf" arg; do + case $arg in + y) + skip_prompt=1 + ;; + f) + skip_prompt=1 + force_kill="-9" + ;; + *) + echo "Invalid argument" + exit 1 + ;; + esac +done + +# Function to handle user prompts +prompt() { + local message=$1 + + # Check if we should skip prompts + if [[ $skip_prompt -eq 1 ]] + then + echo "$message -y" + return 0 + else + read -p "$message" b_continue + if [[ "$b_continue" == "y" ]] + then + return 0 + else + return 1 + fi + fi +} + +function do_killl() { + echo "" + echo "finding processes containing $1" + echo "" + param="$1" + first="${param:0:1}" + rest="${param:1}" + term="[${first}]${rest}" + if [[ $(ps -ax | grep "$term") ]] + then + ps -ax | grep "$term" + echo "" + + if prompt 'Kill these processes?:y/n ' + then + kill $force_kill $(ps -ax | grep "$term" | awk '{print $1}') + fi + else + echo "no results found" + fi +} + +echo "" +if prompt 'Stop Casbablanca?:y/n ' +then + ./core/scripts/stop_node.sh + ./core/node/stop_multi.sh + + # just in case + do_killl './bin/river_node run' +fi + +if prompt 'Stop XChain?:y/n ' +then + RUN_ENV=single ./core/xchain/stop_multi.sh + RUN_ENV=single_ne ./core/xchain/stop_multi.sh + RUN_ENV=multi ./core/xchain/stop_multi.sh + RUN_ENV=multi_ne ./core/xchain/stop_multi.sh + + # that script doesn't always work + do_killl './bin/xchain_node run' +fi + +do_killl yarn "$1" +do_killl anvil "$1" +do_killl wrangler "$1" +do_killl mitmweb "$1" + +# Specify the name or ID of the Docker container you want to stop +container_name="bullmq-redis" + +# Check if the container is running +if docker ps --filter "name=$container_name" --format '{{.ID}}' | grep -qE "^[0-9a-f]+$"; then + # The container is running, so stop it + docker stop "$container_name" + echo "Container $container_name stopped." +else + echo "Container $container_name is not running." +fi + +echo "" +if prompt 'Remove Casbablanca Docker Containers?:y/n ' +then + ./core/scripts/stop_storage.sh +fi diff --git a/scripts/kill-on-port.sh b/scripts/kill-on-port.sh new file mode 100755 index 000000000..d8c7e2b9a --- /dev/null +++ b/scripts/kill-on-port.sh @@ -0,0 +1,42 @@ +#!/bin/bash +set -euo pipefail + +I_RPC_PORT=$1 + +WAIT_TIME=1 +MAX_ATTEMPTS=5 + +echo "Stopping instance on port $I_RPC_PORT" + +PID="$(lsof -t -i:${I_RPC_PORT} || true)" + +# Check if PID is empty +if [ -z "$PID" ]; then + echo "No process found for instance on port $I_RPC_PORT. Skipping..." + exit 0 +fi + +# Check if process exists before attempting to stop it +if ! kill -0 $PID 2>/dev/null; then + echo "Instance with PID $PID on port $I_RPC_PORT is not running. Skipping..." + exit 0 +fi + +# Send SIGTERM (Ctrl-C) +echo "Stopping instance with PID $PID on port $I_RPC_PORT" +kill -SIGTERM $PID + +# Loop to check if process stops +ATTEMPTS=0 +while kill -0 $PID 2>/dev/null && [ $ATTEMPTS -lt $MAX_ATTEMPTS ]; do + sleep $WAIT_TIME + ((ATTEMPTS++)) +done + +# Check if process is still running, and if so, send SIGKILL (-9) +if kill -0 $PID 2>/dev/null; then + echo "Instance with PID $PID on port $I_RPC_PORT did not stop; forcefully killing..." + kill -SIGKILL $PID +else + echo "Instance with PID $PID on port $I_RPC_PORT stopped successfully" +fi diff --git a/scripts/kill_dev.sh b/scripts/kill_dev.sh new file mode 100755 index 000000000..42655074e --- /dev/null +++ b/scripts/kill_dev.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -euo pipefail + +tmux list-windows -t River -F '#I' | xargs -I {} tmux kill-window -t River:{} diff --git a/scripts/lint-shell-scripts.sh b/scripts/lint-shell-scripts.sh new file mode 100755 index 000000000..748a63a73 --- /dev/null +++ b/scripts/lint-shell-scripts.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +## +## call with a directory or a file +## e.g. +## ./scripts/lint-shell-scripts.sh +## ./scripts/lint-shell-scripts.sh core/scripts +## ./scripts/lint-shell-scripts.sh scripts/lint-shell-scripts.sh +## + +# Check if a directory is provided, else use the current directory +DIR="${1:-.}" + +# Check if shellcheck is installed +if ! command -v shellcheck &> /dev/null; then + echo "Error: shellcheck is not installed. Please install it (perhaps with brew) and try again." + exit 1 +fi + +declare -a EXCLUDE_CODES=( + SC2164 # Use 'cd ... || exit' or 'cd ... || return' in case cd fails + SC2086 # Double quote to prevent globbing and word splitting. + # Add more codes and their descriptions as needed +) + +EXCLUDE_STRING=$(IFS=,; echo "${EXCLUDE_CODES[*]}") + +# If a single file is provided as an argument, just run shellcheck on that file +if [ "$#" -eq 1 ] && [ -f "$1" ]; then + FILE="$1" + echo "Running shellcheck on $FILE with exclusions: $EXCLUDE_STRING ..." + shellcheck --exclude="$EXCLUDE_STRING" "$FILE" +else + # Find and run shellcheck on shell script files checked into git + FILES=$(git -C "$DIR" ls-files | grep '\.sh$') + + if [ -z "$FILES" ]; then + echo "No shell script files found." + exit 0 + fi + pushd "$DIR" > /dev/null + shellcheck --exclude="$EXCLUDE_STRING" $FILES + popd > /dev/null +fi + diff --git a/scripts/node-no-warn.js b/scripts/node-no-warn.js new file mode 100644 index 000000000..219e9b69f --- /dev/null +++ b/scripts/node-no-warn.js @@ -0,0 +1,57 @@ +// Script to suppress unnecessary experimental and max listener warnings from node.js. +// Add with -r flag to node command line. For example: +// +// yarn node -r ../../../scripts/node-no-warn.js my-script.js +// + +var path = require('path') +var os = require('os') +var fs = require('fs') + +var localRiverCA = path.join(os.homedir(), 'river-ca-cert.pem') + +if (!fs.existsSync(localRiverCA)) { + console.log('CA does not exist, did you forget to run ../scripts/register-ca.sh') +} +process.env.NODE_EXTRA_CA_CERTS = localRiverCA + +// Increase max listeners from 10 to 100 to avoid warnings for legitimate use cases. +require('events').setMaxListeners(100) + +// Replace default warning printer with one that suppresses warnings we don't care about. +const listeners = process.listeners('warning') +if (listeners.length > 0) { + const prevListener = listeners[0] + process.removeListener('warning', prevListener) + process.on('warning', (...args) => { + if (args.length === 0) { + return + } + const warning = args[0] + if ( + warning?.name === 'ExperimentalWarning' && + ('' + warning?.message).startsWith('VM Modules') + ) { + return + } + if ( + warning?.name === 'ExperimentalWarning' && + ('' + warning?.message).startsWith('Custom ESM Loaders') + ) { + return + } + if ( + warning?.name === 'ExperimentalWarning' && + ('' + warning?.message).startsWith('Importing JSON') + ) { + return + } + if ( + warning?.name === 'ExperimentalWarning' && + ('' + warning?.message).startsWith('Import assertions') + ) { + return + } + prevListener(...args) + }) +} diff --git a/scripts/node-registration-lib.sh b/scripts/node-registration-lib.sh new file mode 100644 index 000000000..f7c344d41 --- /dev/null +++ b/scripts/node-registration-lib.sh @@ -0,0 +1,97 @@ +#!/bin/bash + +# Node registration library for River Registry + +# Environment variables needed: +# - RPC_URL +# - PRIVATE_KEY + +# Construct the relative path to the address file for the River Registry +JSON_FILE="packages/generated/addresses/river/riverRegistry.json" + +RIVER_REGISTRY_ADDRESS=$(jq -r '.address' "$JSON_FILE") + +# Export the variable if you want it available in subsequent commands +export RIVER_REGISTRY_ADDRESS + +echo "RIVER_REGISTRY_ADDRESS: $RIVER_REGISTRY_ADDRESS" + + +function register_node() { + local node_address=$1 # node wallet address + local node_url=$2 # node https url + + # uint8 is the NodeStatus enum + # and 2 corresponds to Operational + + cast send \ + --rpc-url $RPC_URL \ + --private-key $PRIVATE_KEY \ + $RIVER_REGISTRY_ADDRESS \ + "registerNode(address,string,uint8)" \ + $node_address \ + $node_url \ + 2 > /dev/null +} + +function update_node_url() { + local node_address=$1 + local node_url=$2 + + cast send \ + --rpc-url $RPC_URL \ + --private-key $PRIVATE_KEY \ + $RIVER_REGISTRY_ADDRESS \ + "updateNodeUrl(address nodeAddress, string url)" \ + $node_address \ + $node_url > /dev/null +} + +function update_node_status() { + local node_address=$1 + local node_status=$2 + + cast send \ + --rpc-url $RPC_URL \ + --private-key $PRIVATE_KEY \ + $RIVER_REGISTRY_ADDRESS \ + "updateNodeStatus(address,uint8)" \ + $node_address \ + $node_status > /dev/null +} + +function node_exists() { + local node_address=$1 + + # if the node doesnt exist, this will revert + # so detect that and return false + + cast call \ + --rpc-url $RPC_URL \ + $RIVER_REGISTRY_ADDRESS \ + "getNode(address)" \ + $node_address &>/dev/null + + # Check exit status of the cast call + if [ $? -eq 0 ]; then + echo "true" + else + # Reverted or other error + echo "false" + fi +} + +function register_or_update_node_url() { + local node_address=$1 + local node_url=$2 + + local exists=$(node_exists $node_address) + + if [ "$exists" == "true" ]; then + echo "Node exists at $node_address, updating node url" + update_node_url $node_address $node_url + else + echo "Node does not exist at $node_address, adding" + register_node $node_address $node_url + fi +} \ No newline at end of file diff --git a/scripts/print-versions.sh b/scripts/print-versions.sh new file mode 100755 index 000000000..9f70fee39 --- /dev/null +++ b/scripts/print-versions.sh @@ -0,0 +1,27 @@ +#!/bin/bash -ue + +# binary, version arg +function print_version() { + local binary=$1 + local version_arg=$2 + # Check if binary exists + if ! command -v $binary &> /dev/null + then + echo "$binary could not be found" + else + local version=$($binary $version_arg 2>/dev/null) + echo "$binary version:" + echo " $version" + fi +} + +print_version "go" "version" +print_version "node" "--version" +print_version "yarn" "--version" +print_version "anvil" "--version" +print_version "forge" "--version" +print_version "docker" "--version" +print_version "protoc" "--version" +print_version "buf" "--version" +print_version "rustc" "--version" +print_version "cargo" "--version" \ No newline at end of file diff --git a/scripts/start-load-testing-redis.sh b/scripts/start-load-testing-redis.sh new file mode 100755 index 000000000..f8b920173 --- /dev/null +++ b/scripts/start-load-testing-redis.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# Specify the name or ID of the Docker container you want to stop +container_name="bullmq-redis" + +# Check if the container is running +if docker ps --filter "name=$container_name" --format '{{.ID}}' | grep -qE "^[0-9a-f]+$"; then + # The container is running, so stop it + docker stop "$container_name" + echo "Container $container_name stopped." +else + echo "Container $container_name is not running." +fi + +docker-compose -p "load_testing" -f ./core/scripts/load-testing-docker-compose.yml up \ No newline at end of file diff --git a/scripts/start-local-basechain.sh b/scripts/start-local-basechain.sh new file mode 100755 index 000000000..c95febb62 --- /dev/null +++ b/scripts/start-local-basechain.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" +cd .. + +RIVER_BLOCK_TIME="${RIVER_BLOCK_TIME:-1}" + +# If RIVER_BLOCK_TIME is set assign "--block-time XX" to $OPTS +if [ -z ${RIVER_BLOCK_TIME+x} ]; then + OPTS="" +else + OPTS="--block-time $RIVER_BLOCK_TIME" +fi + +anvil --chain-id 31337 --port 8545 $OPTS diff --git a/scripts/start-local-blockscout.sh b/scripts/start-local-blockscout.sh new file mode 100755 index 000000000..4367a9c0b --- /dev/null +++ b/scripts/start-local-blockscout.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" +cd .. + +cd contracts/blockscout/docker-compose +docker-compose up --remove-orphans diff --git a/scripts/start-local-riverchain.sh b/scripts/start-local-riverchain.sh new file mode 100755 index 000000000..dbec0f5cc --- /dev/null +++ b/scripts/start-local-riverchain.sh @@ -0,0 +1,20 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" +cd .. + +echo "Starting local River chain..." + +RIVER_BLOCK_TIME="${RIVER_BLOCK_TIME:-1}" + +# If RIVER_BLOCK_TIME is set assign "--block-time XX" to $OPTS +if [ -z ${RIVER_BLOCK_TIME+x} ]; then + OPTS="" +else + OPTS="--block-time $RIVER_BLOCK_TIME" +fi + +echo "Block time: $RIVER_BLOCK_TIME" +echo "Options: $OPTS" + +anvil --chain-id 31338 --port 8546 $OPTS diff --git a/scripts/start_dev.sh b/scripts/start_dev.sh new file mode 100755 index 000000000..fa4c5aa2f --- /dev/null +++ b/scripts/start_dev.sh @@ -0,0 +1,164 @@ +#!/bin/bash +set -euo pipefail + +SESSION_NAME="River" + +# Function to wait for a process and exit if it fails +wait_for_process() { + local pid=$1 + local name=$2 + wait "$pid" || { echo "Error: $name (PID: $pid) failed." >&2; exit 1; } +} + +# Check if Homebrew is installed +if ! command -v brew &> /dev/null; then + echo "Homebrew is not installed. Installing Homebrew first..." + # Download and execute Homebrew installation script + # Handle potential failure in downloading the script + if ! /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"; then + echo "Failed to install Homebrew." + exit 1 + fi +fi + +# Install Tmux using Homebrew if not present +if ! command -v tmux &> /dev/null; then + echo "Tmux is not installed. Installing it using Homebrew..." + if ! brew install tmux; then + echo "Failed to install Tmux." + exit 1 + fi + echo "Tmux installed successfully." +fi + +# Install Netcat using Homebrew if not present +if ! command -v nc &> /dev/null; then + echo "Netcat is not installed. Installing it using Homebrew..." + if ! brew install netcat; then + echo "Failed to install Netcat." + exit 1 + fi + echo "Netcat installed successfully." +fi + +# Install yq using Homebrew if not present +if ! command -v yq &> /dev/null; then + echo "yq is not installed. Installing it using Homebrew..." + if ! brew install yq; then + echo "Failed to install yq." + exit 1 + fi + echo "yq installed successfully." +fi + +yarn install + +# Create a new tmux session +tmux new-session -d -s $SESSION_NAME + +# Start contract build in background +pushd contracts +set -a +. .env.localhost +set +a +make build & BUILD_PID=$! +popd + +./core/scripts/launch_storage.sh & + +# Start chains and Postgres in separate panes of the same window +tmux new-window -t $SESSION_NAME -n 'BlockChains_base' +tmux send-keys -t $SESSION_NAME:'BlockChains_base' "./scripts/start-local-basechain.sh &" C-m +tmux new-window -t $SESSION_NAME -n 'BlockChains_river' +tmux send-keys -t $SESSION_NAME:'BlockChains_river' "./scripts/start-local-riverchain.sh &" C-m + +# Function to wait for a specific port +wait_for_port() { + local port=$1 + echo "Waiting for process to listen on TCP $port..." + + while ! nc -z localhost $port; do + echo "Waiting for TCP $port..." + sleep 1 + done + + echo "TCP $port is now open." +} + +# Wait for both chains +wait_for_port 8545 +wait_for_port 8546 + +# Wait for Postgres +wait_for_port 5433 + +echo "Both Anvil chains and Postgres are now running, deploying contracts" + +# Wait for build to finish +wait_for_process "$BUILD_PID" "build" + + +echo "STARTED ALL CHAINS AND BUILT ALL CONTRACTS" + +# Now generate the core server config +./scripts/configure-nodes.sh --single +./scripts/configure-nodes.sh --single_ne +./scripts/configure-nodes.sh --multi +#./scripts/configure-nodes.sh --multi_ne + + +# Define the base directory for easier reference +CONFIGS_DIR="./core/node/run_files/" +PNW_URL="http://localhost:8787" +PNW_AUTH_TOKEN="Zm9v" + +# Loop over each config.yaml file in the run_files subdirectories +find "$CONFIGS_DIR" -type f -name "config.yaml" | while read -r YAML_FILE; do + yq eval ".pushNotification.url = \"$PNW_URL\"" -i $YAML_FILE + yq eval ".pushNotification.authToken = \"$PNW_AUTH_TOKEN\"" -i $YAML_FILE +done + +# Continue with rest of the script +echo "Continuing with the rest of the script..." + +yarn csb:build + +# Array of commands from the VS Code tasks +commands=( + "watch_sdk:cd core/sdk && yarn watch" + "watch_encryption:cd core/encryption && yarn watch" + "watch_dlog:cd core/dlog && yarn watch" + "watch_proto:cd core/proto && yarn watch" + "watch_web3:cd core/web3 && yarn watch" + "watch_go:cd core/proto && yarn watch:go" + "debug_app:cd core/debug-app && yarn dev" + "core_single:./core/node/run_single.sh -r" + "core_single_ne:./core/node/run_single.sh -r --de" + "core_multi:./core/node/run_multi.sh -r" + #"core_multi_ne:./core/node/run_multi.sh -r --de" + "xchain_single:RUN_ENV=single ./core/xchain/launch_multi.sh" + "xchain_multi:RUN_ENV=multi ./core/xchain/launch_multi.sh" +) + +# Create a Tmux window for each command +for cmd in "${commands[@]}"; do + window_name="${cmd%%:*}" + command="${cmd#*:}" + tmux new-window -t $SESSION_NAME -n "$window_name" -d + tmux send-keys -t $SESSION_NAME:"$window_name" "$command" C-m +done + +# Attach to the tmux session +tmux attach -t $SESSION_NAME + +# test if the session has windows +is_closed() { + n=$(tmux ls 2> /dev/null | grep "^$SESSION_NAME" | wc -l) + [[ $n -eq 0 ]] +} + +# Wait for the session to close +if is_closed ; then + echo "Session $SESSION_NAME has closed; delete core postgres container and volume" + ./core/scripts/stop_storage.sh +fi diff --git a/scripts/wait-for-basechain.sh b/scripts/wait-for-basechain.sh new file mode 100755 index 000000000..5b14061e7 --- /dev/null +++ b/scripts/wait-for-basechain.sh @@ -0,0 +1,5 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +./wait-for-port.sh 8545 "Base_Chain" diff --git a/scripts/wait-for-core.sh b/scripts/wait-for-core.sh new file mode 100755 index 000000000..a980af173 --- /dev/null +++ b/scripts/wait-for-core.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +echo "Waiting Casablanca to launch on 5157..." + +while ! nc -z localhost 5157; do + sleep 0.1 # wait for 1/10 of the second before check again +done + +echo "Casablanca launched" diff --git a/scripts/wait-for-port.sh b/scripts/wait-for-port.sh new file mode 100755 index 000000000..0c29dd8f3 --- /dev/null +++ b/scripts/wait-for-port.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -euo pipefail + +PORT=$1 +NAME=$2 +ITERATIONS=${3:-300} # Set ITERATIONS to the 3rd argument, or default to 300 to wait for 30 seconds + +echo "Waiting for ${NAME} to launch on ${PORT} port..." + +for ((i=0; i<$ITERATIONS; i++)); do + if nc -z 127.0.0.1 ${PORT}; then + echo "${NAME} on ${PORT} port ready" + exit 0 + fi + sleep 0.1 +done + +echo "Failed to detect launch ${NAME} on ${PORT} port." +exit 1 diff --git a/scripts/wait-for-riverchain.sh b/scripts/wait-for-riverchain.sh new file mode 100755 index 000000000..84369e186 --- /dev/null +++ b/scripts/wait-for-riverchain.sh @@ -0,0 +1,5 @@ +#!/bin/bash +set -euo pipefail +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +./wait-for-port.sh 8546 "River_Chain" diff --git a/scripts/yarn-clean.sh b/scripts/yarn-clean.sh new file mode 100755 index 000000000..5b681b5be --- /dev/null +++ b/scripts/yarn-clean.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +# very similar to running git clean -xd however, we don't want to remove +# .env.local files, etc +# if you want to clean everything temporary created by the build, but +# don't want a full reset on your dev environment, this is the script for you +# +# run git clean -d -x --dry-run to see what didn't get deleted + +pushd "$(git rev-parse --show-toplevel)" + +# Check for untracked files +UNTRACKED_FILES=$(git ls-files --others --exclude-standard) +if [ -n "$UNTRACKED_FILES" ]; then + echo + echo "There are untracked files. Please add or ignore them before running this script." + echo + echo "$(tput setaf 9)$UNTRACKED_FILES$(tput sgr0)" + echo + exit 1 +fi + +echo "cleaning node" + +yarn cache clean + +# remove large directories that we know we will rebuild. Git clean hangs if we try to remove these in one go +find . -name "node_modules" -type d -exec rm -r "{}" \; +find . -name "dist" -type d -exec rm -r "{}" \; +find . -name "coverage" -type d -exec rm -r "{}" \; +find . -name "out" -type d -exec rm -r "{}" \; +find . -name ".turbo" -type d -exec rm -r "{}" \; +find . -name "tsconfig.tsbuildinfo" -type f -exec rm -r "{}" \; +find . -name ".eslintcache" -type f -exec rm -r "{}" \; + +# remove run_files +pushd "core/node" > /dev/null +rm -rf run_files/* +popd > /dev/null +pushd "core/xchain" > /dev/null +rm -rf run_files/* +popd > /dev/null + +echo "" + +# remove files not tracked by git, but keep dev files +git clean -fdx -e .DS_Store -e '.env.*' -e '.env.*.*' -e '*.yaml' -e .vscode -e '*.pem' -e '*.crt' -e '*.key' -e .keys -e *_key -e *_address -e .wrangler -e .dev.* -e test-config.json + +# remove empty directories and directories that only contain .DS_Store files +find . -type d -not -path "./.git/*" -print0 | while IFS= read -r -d '' dir; do + content_count=$(find "$dir" -mindepth 1 -maxdepth 1 ! -name ".DS_Store" | wc -l) + if [ "$content_count" -eq 0 ]; then + echo "Deleting empty directory: $dir" + rm -r "$dir" + fi +done + +echo "removing anvil tmp files" # --prune-history should be the default when running anvil, but it doesn't work +rm -rf ~/.foundry/anvil/tmp + +popd diff --git a/turbo.json b/turbo.json new file mode 100644 index 000000000..94d16f0bb --- /dev/null +++ b/turbo.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://turborepo.org/schema.json", + "pipeline": { + "test": { + "dependsOn": ["build"] + }, + "test:ci": { + "dependsOn": ["build"] + }, + "test:unit": { + "dependsOn": ["build"] + }, + "build": { + // note: output globs are relative to each package's `package.json` + // (and not the monorepo root + "outputs": ["dist/**", "build/**", "out/**"], + "cache": true, + "dependsOn": ["^build"] + }, + "lint": {} + } +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..a85c4de33 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,14613 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 6 + cacheKey: 8 + +"@aashutoshrathi/word-wrap@npm:^1.2.3": + version: 1.2.6 + resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" + checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd + languageName: node + linkType: hard + +"@adobe/css-tools@npm:^4.0.1": + version: 4.3.3 + resolution: "@adobe/css-tools@npm:4.3.3" + checksum: d21f3786b84911fee59c995a146644a85c98692979097b26484ffa9e442fb1a92ccd68ce984e3e7cf8d5933c3560fbc0ad3e3cd1de50b9a723d1c012e793bbcb + languageName: node + linkType: hard + +"@adraffy/ens-normalize@npm:1.10.0": + version: 1.10.0 + resolution: "@adraffy/ens-normalize@npm:1.10.0" + checksum: af0540f963a2632da2bbc37e36ea6593dcfc607b937857133791781e246d47f870d5e3d21fa70d5cfe94e772c284588c81ea3f5b7f4ea8fbb824369444e4dbcb + languageName: node + linkType: hard + +"@ampproject/remapping@npm:^2.2.0": + version: 2.2.1 + resolution: "@ampproject/remapping@npm:2.2.1" + dependencies: + "@jridgewell/gen-mapping": ^0.3.0 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 03c04fd526acc64a1f4df22651186f3e5ef0a9d6d6530ce4482ec9841269cf7a11dbb8af79237c282d721c5312024ff17529cd72cc4768c11e999b58e2302079 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/code-frame@npm:7.23.5" + dependencies: + "@babel/highlight": ^7.23.4 + chalk: ^2.4.2 + checksum: d90981fdf56a2824a9b14d19a4c0e8db93633fd488c772624b4e83e0ceac6039a27cd298a247c3214faa952bf803ba23696172ae7e7235f3b97f43ba278c569a + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/compat-data@npm:7.23.5" + checksum: 06ce244cda5763295a0ea924728c09bae57d35713b675175227278896946f922a63edf803c322f855a3878323d48d0255a2a3023409d2a123483c8a69ebb4744 + languageName: node + linkType: hard + +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.5, @babel/core@npm:^7.23.9": + version: 7.24.0 + resolution: "@babel/core@npm:7.24.0" + dependencies: + "@ampproject/remapping": ^2.2.0 + "@babel/code-frame": ^7.23.5 + "@babel/generator": ^7.23.6 + "@babel/helper-compilation-targets": ^7.23.6 + "@babel/helper-module-transforms": ^7.23.3 + "@babel/helpers": ^7.24.0 + "@babel/parser": ^7.24.0 + "@babel/template": ^7.24.0 + "@babel/traverse": ^7.24.0 + "@babel/types": ^7.24.0 + convert-source-map: ^2.0.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.3 + semver: ^6.3.1 + checksum: 3124a8a1c550f3818a55dc6f621af9c580b4959bc780cce7220f671088c404830f41870573f5acf7f837878f8aa82e84675ea148a9852c1b053533cb899300d3 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.23.6, @babel/generator@npm:^7.7.2": + version: 7.23.6 + resolution: "@babel/generator@npm:7.23.6" + dependencies: + "@babel/types": ^7.23.6 + "@jridgewell/gen-mapping": ^0.3.2 + "@jridgewell/trace-mapping": ^0.3.17 + jsesc: ^2.5.1 + checksum: 1a1a1c4eac210f174cd108d479464d053930a812798e09fee069377de39a893422df5b5b146199ead7239ae6d3a04697b45fc9ac6e38e0f6b76374390f91fc6c + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.23.6": + version: 7.23.6 + resolution: "@babel/helper-compilation-targets@npm:7.23.6" + dependencies: + "@babel/compat-data": ^7.23.5 + "@babel/helper-validator-option": ^7.23.5 + browserslist: ^4.22.2 + lru-cache: ^5.1.1 + semver: ^6.3.1 + checksum: c630b98d4527ac8fe2c58d9a06e785dfb2b73ec71b7c4f2ddf90f814b5f75b547f3c015f110a010fd31f76e3864daaf09f3adcd2f6acdbfb18a8de3a48717590 + languageName: node + linkType: hard + +"@babel/helper-environment-visitor@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-environment-visitor@npm:7.22.20" + checksum: d80ee98ff66f41e233f36ca1921774c37e88a803b2f7dca3db7c057a5fea0473804db9fb6729e5dbfd07f4bed722d60f7852035c2c739382e84c335661590b69 + languageName: node + linkType: hard + +"@babel/helper-function-name@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/helper-function-name@npm:7.23.0" + dependencies: + "@babel/template": ^7.22.15 + "@babel/types": ^7.23.0 + checksum: e44542257b2d4634a1f979244eb2a4ad8e6d75eb6761b4cfceb56b562f7db150d134bc538c8e6adca3783e3bc31be949071527aa8e3aab7867d1ad2d84a26e10 + languageName: node + linkType: hard + +"@babel/helper-hoist-variables@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-hoist-variables@npm:7.22.5" + dependencies: + "@babel/types": ^7.22.5 + checksum: 394ca191b4ac908a76e7c50ab52102669efe3a1c277033e49467913c7ed6f7c64d7eacbeabf3bed39ea1f41731e22993f763b1edce0f74ff8563fd1f380d92cc + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/helper-module-imports@npm:7.22.15" + dependencies: + "@babel/types": ^7.22.15 + checksum: ecd7e457df0a46f889228f943ef9b4a47d485d82e030676767e6a2fdcbdaa63594d8124d4b55fd160b41c201025aec01fc27580352b1c87a37c9c6f33d116702 + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/helper-module-transforms@npm:7.23.3" + dependencies: + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-module-imports": ^7.22.15 + "@babel/helper-simple-access": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 + "@babel/helper-validator-identifier": ^7.22.20 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 5d0895cfba0e16ae16f3aa92fee108517023ad89a855289c4eb1d46f7aef4519adf8e6f971e1d55ac20c5461610e17213f1144097a8f932e768a9132e2278d71 + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.22.5 + resolution: "@babel/helper-plugin-utils@npm:7.22.5" + checksum: c0fc7227076b6041acd2f0e818145d2e8c41968cc52fb5ca70eed48e21b8fe6dd88a0a91cbddf4951e33647336eb5ae184747ca706817ca3bef5e9e905151ff5 + languageName: node + linkType: hard + +"@babel/helper-simple-access@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-simple-access@npm:7.22.5" + dependencies: + "@babel/types": ^7.22.5 + checksum: fe9686714caf7d70aedb46c3cce090f8b915b206e09225f1e4dbc416786c2fdbbee40b38b23c268b7ccef749dd2db35f255338fb4f2444429874d900dede5ad2 + languageName: node + linkType: hard + +"@babel/helper-split-export-declaration@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/helper-split-export-declaration@npm:7.22.6" + dependencies: + "@babel/types": ^7.22.5 + checksum: e141cace583b19d9195f9c2b8e17a3ae913b7ee9b8120246d0f9ca349ca6f03cb2c001fd5ec57488c544347c0bb584afec66c936511e447fd20a360e591ac921 + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/helper-string-parser@npm:7.23.4" + checksum: c0641144cf1a7e7dc93f3d5f16d5327465b6cf5d036b48be61ecba41e1eece161b48f46b7f960951b67f8c3533ce506b16dece576baef4d8b3b49f8c65410f90 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-validator-identifier@npm:7.22.20" + checksum: 136412784d9428266bcdd4d91c32bcf9ff0e8d25534a9d94b044f77fe76bc50f941a90319b05aafd1ec04f7d127cd57a179a3716009ff7f3412ef835ada95bdc + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/helper-validator-option@npm:7.23.5" + checksum: 537cde2330a8aede223552510e8a13e9c1c8798afee3757995a7d4acae564124fe2bf7e7c3d90d62d3657434a74340a274b3b3b1c6f17e9a2be1f48af29cb09e + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/helpers@npm:7.24.0" + dependencies: + "@babel/template": ^7.24.0 + "@babel/traverse": ^7.24.0 + "@babel/types": ^7.24.0 + checksum: 2c1d9547c7a6e5aa648d4f3959252f825d4176ee52ed5430d65e50e68a138776adfd87ff3c8f9719ea6cd36601e935936d006340770ad8282b8664770aca8e33 + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/highlight@npm:7.23.4" + dependencies: + "@babel/helper-validator-identifier": ^7.22.20 + chalk: ^2.4.2 + js-tokens: ^4.0.0 + checksum: 643acecdc235f87d925979a979b539a5d7d1f31ae7db8d89047269082694122d11aa85351304c9c978ceeb6d250591ccadb06c366f358ccee08bb9c122476b89 + languageName: node + linkType: hard + +"@babel/node@npm:^7.23.9": + version: 7.23.9 + resolution: "@babel/node@npm:7.23.9" + dependencies: + "@babel/register": ^7.23.7 + commander: ^4.0.1 + core-js: ^3.30.2 + node-environment-flags: ^1.0.5 + regenerator-runtime: ^0.14.0 + v8flags: ^3.1.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + bin: + babel-node: ./bin/babel-node.js + checksum: 24b0fdd6594d88f7cffcd58e771cda67dc535c1e27242e66095885801716f3a4a34ea230b4b075c7f8e227ccebd24b66eb6a7622ee34984db73c16efb735efbe + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/parser@npm:7.24.0" + bin: + parser: ./bin/babel-parser.js + checksum: 4a6afec49487a212e7a27345b0c090b56905efb62c0b3a1499b0a57a5b3bf43d9d1e99e31b137080eacc24dee659a29699740d0a6289999117c0d8c5a04bd68f + languageName: node + linkType: hard + +"@babel/plugin-syntax-async-generators@npm:^7.8.4": + version: 7.8.4 + resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 + languageName: node + linkType: hard + +"@babel/plugin-syntax-bigint@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3a10849d83e47aec50f367a9e56a6b22d662ddce643334b087f9828f4c3dd73bdc5909aaeabe123fed78515767f9ca43498a0e621c438d1cd2802d7fae3c9648 + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-properties@npm:^7.8.3": + version: 7.12.13 + resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" + dependencies: + "@babel/helper-plugin-utils": ^7.12.13 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-meta@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b + languageName: node + linkType: hard + +"@babel/plugin-syntax-json-strings@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a + languageName: node + linkType: hard + +"@babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.22.5 + resolution: "@babel/plugin-syntax-jsx@npm:7.22.5" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8829d30c2617ab31393d99cec2978e41f014f4ac6f01a1cecf4c4dd8320c3ec12fdc3ce121126b2d8d32f6887e99ca1a0bad53dedb1e6ad165640b92b24980ce + languageName: node + linkType: hard + +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 + languageName: node + linkType: hard + +"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 + languageName: node + linkType: hard + +"@babel/plugin-syntax-numeric-separator@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 + languageName: node + linkType: hard + +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 + languageName: node + linkType: hard + +"@babel/plugin-syntax-top-level-await@npm:^7.8.3": + version: 7.14.5 + resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": ^7.14.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e + languageName: node + linkType: hard + +"@babel/plugin-syntax-typescript@npm:^7.23.3, @babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.23.3 + resolution: "@babel/plugin-syntax-typescript@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: abfad3a19290d258b028e285a1f34c9b8a0cbe46ef79eafed4ed7ffce11b5d0720b5e536c82f91cbd8442cde35a3dd8e861fa70366d87ff06fdc0d4756e30876 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-jsx-self@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-react-jsx-self@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 882bf56bc932d015c2d83214133939ddcf342e5bcafa21f1a93b19f2e052145115e1e0351730897fd66e5f67cad7875b8a8d81ceb12b6e2a886ad0102cb4eb1f + languageName: node + linkType: hard + +"@babel/plugin-transform-react-jsx-source@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-react-jsx-source@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 92287fb797e522d99bdc77eaa573ce79ff0ad9f1cf4e7df374645e28e51dce0adad129f6f075430b129b5bac8dad843f65021970e12e992d6d6671f0d65bb1e0 + languageName: node + linkType: hard + +"@babel/register@npm:^7.23.7": + version: 7.23.7 + resolution: "@babel/register@npm:7.23.7" + dependencies: + clone-deep: ^4.0.1 + find-cache-dir: ^2.0.0 + make-dir: ^2.1.0 + pirates: ^4.0.6 + source-map-support: ^0.5.16 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: c72a6d4856ef04f13490370d805854d2d98a77786bfaec7d85e2c585e1217011c4f3df18197a890e14520906c9111bef95551ba1a9b59c88df4dfc2dfe2c8d1b + languageName: node + linkType: hard + +"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.9.2": + version: 7.24.0 + resolution: "@babel/runtime@npm:7.24.0" + dependencies: + regenerator-runtime: ^0.14.0 + checksum: 7a6a5d40fbdd68491ec183ba2e631c07415119960083b4fd76564cce3751e9acd2f12ab89575e38496fa389fa06d458732776e69ee1858e366cc3fbdb049f847 + languageName: node + linkType: hard + +"@babel/template@npm:^7.22.15, @babel/template@npm:^7.24.0, @babel/template@npm:^7.3.3": + version: 7.24.0 + resolution: "@babel/template@npm:7.24.0" + dependencies: + "@babel/code-frame": ^7.23.5 + "@babel/parser": ^7.24.0 + "@babel/types": ^7.24.0 + checksum: f257b003c071a0cecdbfceca74185f18fe62c055469ab5c1d481aab12abeebed328e67e0a19fd978a2a8de97b28953fa4bc3da6d038a7345fdf37923b9fcdec8 + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/traverse@npm:7.24.0" + dependencies: + "@babel/code-frame": ^7.23.5 + "@babel/generator": ^7.23.6 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-function-name": ^7.23.0 + "@babel/helper-hoist-variables": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 + "@babel/parser": ^7.24.0 + "@babel/types": ^7.24.0 + debug: ^4.3.1 + globals: ^11.1.0 + checksum: 790cf14a6452575ceef767285bad0dd96d14b3640ed4e6a4ddb5b592e4e66020424bac21e4a4b965ac0d2fe9ed504fe3644748b1922fb8ac37c681cb435c3995 + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.24.0, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": + version: 7.24.0 + resolution: "@babel/types@npm:7.24.0" + dependencies: + "@babel/helper-string-parser": ^7.23.4 + "@babel/helper-validator-identifier": ^7.22.20 + to-fast-properties: ^2.0.0 + checksum: 4b574a37d490f621470ff36a5afaac6deca5546edcb9b5e316d39acbb20998e9c2be42f3fc0bf2b55906fc49ff2a5a6a097e8f5a726ee3f708a0b0ca93aed807 + languageName: node + linkType: hard + +"@bcoe/v8-coverage@npm:^0.2.3": + version: 0.2.3 + resolution: "@bcoe/v8-coverage@npm:0.2.3" + checksum: 850f9305536d0f2bd13e9e0881cb5f02e4f93fad1189f7b2d4bebf694e3206924eadee1068130d43c11b750efcc9405f88a8e42ef098b6d75239c0f047de1a27 + languageName: node + linkType: hard + +"@bufbuild/buf-darwin-arm64@npm:1.27.2": + version: 1.27.2 + resolution: "@bufbuild/buf-darwin-arm64@npm:1.27.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@bufbuild/buf-darwin-x64@npm:1.27.2": + version: 1.27.2 + resolution: "@bufbuild/buf-darwin-x64@npm:1.27.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@bufbuild/buf-linux-aarch64@npm:1.27.2": + version: 1.27.2 + resolution: "@bufbuild/buf-linux-aarch64@npm:1.27.2" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@bufbuild/buf-linux-x64@npm:1.27.2": + version: 1.27.2 + resolution: "@bufbuild/buf-linux-x64@npm:1.27.2" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@bufbuild/buf-win32-arm64@npm:1.27.2": + version: 1.27.2 + resolution: "@bufbuild/buf-win32-arm64@npm:1.27.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@bufbuild/buf-win32-x64@npm:1.27.2": + version: 1.27.2 + resolution: "@bufbuild/buf-win32-x64@npm:1.27.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@bufbuild/buf@npm:^1.27.2": + version: 1.27.2 + resolution: "@bufbuild/buf@npm:1.27.2" + dependencies: + "@bufbuild/buf-darwin-arm64": 1.27.2 + "@bufbuild/buf-darwin-x64": 1.27.2 + "@bufbuild/buf-linux-aarch64": 1.27.2 + "@bufbuild/buf-linux-x64": 1.27.2 + "@bufbuild/buf-win32-arm64": 1.27.2 + "@bufbuild/buf-win32-x64": 1.27.2 + dependenciesMeta: + "@bufbuild/buf-darwin-arm64": + optional: true + "@bufbuild/buf-darwin-x64": + optional: true + "@bufbuild/buf-linux-aarch64": + optional: true + "@bufbuild/buf-linux-x64": + optional: true + "@bufbuild/buf-win32-arm64": + optional: true + "@bufbuild/buf-win32-x64": + optional: true + bin: + buf: bin/buf + protoc-gen-buf-breaking: bin/protoc-gen-buf-breaking + protoc-gen-buf-lint: bin/protoc-gen-buf-lint + checksum: f1eed0d0ca5b836f98e03d332a4e070988b69a7f51cc99c203aa583d82bd8012942e73941a0cde0be13f72dfe6f9aa29aaa5dc4e465599d1fd28e9a70e3f9b64 + languageName: node + linkType: hard + +"@bufbuild/protobuf@npm:1.4.1, @bufbuild/protobuf@npm:^1.3.3, @bufbuild/protobuf@npm:^1.4.1": + version: 1.4.1 + resolution: "@bufbuild/protobuf@npm:1.4.1" + checksum: c42c29dd70e580b19b32a94ab7cde9f86f2540554dd2fa7a8f9af9909534c3ad6c06980b16e5453530934f744076ab2870e2b0d31d3ed567b399b901ecf9fa51 + languageName: node + linkType: hard + +"@bufbuild/protoc-gen-es@npm:^1.4.1": + version: 1.4.1 + resolution: "@bufbuild/protoc-gen-es@npm:1.4.1" + dependencies: + "@bufbuild/protoplugin": 1.4.1 + peerDependencies: + "@bufbuild/protobuf": 1.4.1 + peerDependenciesMeta: + "@bufbuild/protobuf": + optional: true + bin: + protoc-gen-es: bin/protoc-gen-es + checksum: 712029aa3628bc5ebf3686565c22e409b43804f05774a3d4c4bbab4e14b164e927d79ce2695dd066c397651b72240ff67fd10b35437b06653498bdb3490cc4c9 + languageName: node + linkType: hard + +"@bufbuild/protoplugin@npm:1.4.1, @bufbuild/protoplugin@npm:^1.3.3": + version: 1.4.1 + resolution: "@bufbuild/protoplugin@npm:1.4.1" + dependencies: + "@bufbuild/protobuf": 1.4.1 + "@typescript/vfs": ^1.4.0 + typescript: 4.5.2 + checksum: 5104ed8b261788b05cd60c275df2d8bf5d9dc5b1f1847bef7adc4a18b3821d4e8a3f10d06149106c888844f41e49a202d7dfb2db0bc3399271b6a9eb8b542d4a + languageName: node + linkType: hard + +"@coinbase/wallet-sdk@npm:^3.6.6": + version: 3.9.2 + resolution: "@coinbase/wallet-sdk@npm:3.9.2" + dependencies: + bn.js: ^5.2.1 + buffer: ^6.0.3 + clsx: ^1.2.1 + eth-block-tracker: ^7.1.0 + eth-json-rpc-filters: ^6.0.0 + eventemitter3: ^5.0.1 + keccak: ^3.0.3 + preact: ^10.16.0 + sha.js: ^2.4.11 + checksum: 3698f2d831f1b5e9eafbe0aed4d265446f752bc92448045e75b5cc66e4462508a331c5f74fd5d2663d7efb1ce1c7a8782d2e774f5e0dfb989a3415f69a28aeee + languageName: node + linkType: hard + +"@connectrpc/connect-web@npm:^1.3.0": + version: 1.3.0 + resolution: "@connectrpc/connect-web@npm:1.3.0" + peerDependencies: + "@bufbuild/protobuf": ^1.4.2 + "@connectrpc/connect": 1.3.0 + checksum: 085dcf01cfe652849dd5c046acdeb9baa578add4a58d35643c162e8eccd5203021451b49bfb3d66c69d1e65759ef25727b6b64ee62ea017a040097c3535d214a + languageName: node + linkType: hard + +"@connectrpc/connect@npm:^1.3.0": + version: 1.3.0 + resolution: "@connectrpc/connect@npm:1.3.0" + peerDependencies: + "@bufbuild/protobuf": ^1.4.2 + checksum: a68bfffedd817a7db3563c00e5efc5eb510cc00a93c722d81fa1f52b71a96300d7175b0c0710a9d2ef2e8aaabee36921c90470a80343e7a9fbccffd3cc83f868 + languageName: node + linkType: hard + +"@connectrpc/protoc-gen-connect-es@npm:^1.1.2": + version: 1.1.3 + resolution: "@connectrpc/protoc-gen-connect-es@npm:1.1.3" + dependencies: + "@bufbuild/protobuf": ^1.3.3 + "@bufbuild/protoplugin": ^1.3.3 + peerDependencies: + "@bufbuild/protoc-gen-es": ^1.3.3 + "@connectrpc/connect": 1.1.3 + peerDependenciesMeta: + "@bufbuild/protoc-gen-es": + optional: true + "@connectrpc/connect": + optional: true + bin: + protoc-gen-connect-es: bin/protoc-gen-connect-es + checksum: 282aa1343459c20d21a5fc7dd885ee8c9b0865b918efc26e86795b304122dfea63eb35d51e0ea6d1893db769c830b00a51dff238fe5bbe43eeb46ae58e1c67fb + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": 0.3.9 + checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa + languageName: node + linkType: hard + +"@datadog/browser-core@npm:5.8.0": + version: 5.8.0 + resolution: "@datadog/browser-core@npm:5.8.0" + checksum: 3282c104976b7e151a3db5d67100b2b98714d092f3c8395cf8dbafd6db470a83ef54a61ffb1e2a171e147145a95a0a0af50918baa5a14251996b8c68788a5c0b + languageName: node + linkType: hard + +"@datadog/browser-rum-core@npm:5.8.0": + version: 5.8.0 + resolution: "@datadog/browser-rum-core@npm:5.8.0" + dependencies: + "@datadog/browser-core": 5.8.0 + checksum: b99d5dbe5dc2b9976362a5028cf97cd8f274b65729e92f3d8086e24c540ad987ae558e8f246a6b10ff41bf27c3679b8d43736b462411a3ad06cd9b9d9d72de80 + languageName: node + linkType: hard + +"@datadog/browser-rum@npm:^5.8.0": + version: 5.8.0 + resolution: "@datadog/browser-rum@npm:5.8.0" + dependencies: + "@datadog/browser-core": 5.8.0 + "@datadog/browser-rum-core": 5.8.0 + peerDependencies: + "@datadog/browser-logs": 5.8.0 + peerDependenciesMeta: + "@datadog/browser-logs": + optional: true + checksum: ca564c4a23c3b2d2343c048c74ca03774a90c32bac8aea29050ed286a3698d4a071fa00ea7a629543df6bcbc88595f9b78dd8fa032be623819100110dfbd996b + languageName: node + linkType: hard + +"@effect/data@npm:0.12.9": + version: 0.12.9 + resolution: "@effect/data@npm:0.12.9" + checksum: fb9a5bf28f6fceb7c405f4db3eb0f92f989d7763d5b0a08b1084e3352a14bcf95d06a73a59ca01335b363dfcd1dde12d3c95b88fff4cf43cb694dcb76afe0a06 + languageName: node + linkType: hard + +"@effect/data@npm:^0.12.7, @effect/data@npm:^0.12.9, @effect/data@npm:~0.12.6": + version: 0.12.10 + resolution: "@effect/data@npm:0.12.10" + checksum: 161fa83c2d315ea16e6078ded2d17b8ec0b4a5b7433a70fa7d603012cc788430c1ab5546816efadef5d3f6bae017705cde446ec7d8146baee1a1a3c1760d53da + languageName: node + linkType: hard + +"@effect/io@npm:0.27.0": + version: 0.27.0 + resolution: "@effect/io@npm:0.27.0" + dependencies: + "@effect/data": ~0.12.6 + checksum: 927bdc2ffc0e2f4bc23a4006f2effe59c40e82cb9b5ac8d409d5a18fbdcab64064eaee5da9d0a78db02eb5b1c503aa73b4fcc7554b07a48282e2539a7bcf0430 + languageName: node + linkType: hard + +"@effect/io@npm:^0.26.0": + version: 0.26.2 + resolution: "@effect/io@npm:0.26.2" + dependencies: + "@effect/data": ~0.12.6 + checksum: b30b879f3a8119a06a5ddff68a867ae784abf6cc653769da6c8e6a3e55e439b89177221b919ff2b9ff777ede645ff0d0c8291ad0468e8815b6a5875cfbd94b63 + languageName: node + linkType: hard + +"@effect/io@npm:^0.27.0": + version: 0.27.2 + resolution: "@effect/io@npm:0.27.2" + dependencies: + "@effect/data": ~0.12.6 + checksum: 9f3977e042ecc4f94b56599d337aaed5a077e65e2bd506a8bfb837825e1619ad88fe2c59c3447da96e1e839ca6fe5ff94c444da08673563a3f2a796e08d39457 + languageName: node + linkType: hard + +"@effect/match@npm:0.24.5": + version: 0.24.5 + resolution: "@effect/match@npm:0.24.5" + dependencies: + "@effect/data": ^0.12.9 + "@effect/schema": ^0.20.2 + checksum: f4d588685b73d1fc42615f91c1097d358458a61455d75505cf9dab3b6f283da3fdaa1ebd59773581fe00477386a308ab214bf44d295921df31ee7ad125981778 + languageName: node + linkType: hard + +"@effect/schema@npm:0.21.0": + version: 0.21.0 + resolution: "@effect/schema@npm:0.21.0" + dependencies: + "@effect/data": ^0.12.9 + "@effect/io": ^0.27.0 + fast-check: ^3.10.0 + checksum: 9d6a317272a2afb19c27edd772217f37404e185ed6da25fcf4ba380c600a155f3b44a7e2811333dd58de1e6aa9963fd20fe2c6ed5711586dc213ce649655e702 + languageName: node + linkType: hard + +"@effect/schema@npm:^0.20.2": + version: 0.20.3 + resolution: "@effect/schema@npm:0.20.3" + dependencies: + "@effect/data": ^0.12.7 + "@effect/io": ^0.26.0 + fast-check: ^3.10.0 + checksum: 811a3ab25097a5c1de4f1434fe9d74ff5fc90c98b549e87f0695e650e20e1b60a91aac53ecd9fc198b315d9e7088aac8b4fd7e5a651cc1090edf785dc33cffe4 + languageName: node + linkType: hard + +"@emotion/hash@npm:^0.9.0": + version: 0.9.1 + resolution: "@emotion/hash@npm:0.9.1" + checksum: 716e17e48bf9047bf9383982c071de49f2615310fb4e986738931776f5a823bc1f29c84501abe0d3df91a3803c80122d24e28b57351bca9e01356ebb33d89876 + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/aix-ppc64@npm:0.19.12" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/android-arm64@npm:0.19.12" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/android-arm@npm:0.19.12" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/android-x64@npm:0.19.12" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/darwin-arm64@npm:0.19.12" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/darwin-x64@npm:0.19.12" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/freebsd-arm64@npm:0.19.12" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/freebsd-x64@npm:0.19.12" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-arm64@npm:0.19.12" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-arm@npm:0.19.12" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-ia32@npm:0.19.12" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-loong64@npm:0.19.12" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-mips64el@npm:0.19.12" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-ppc64@npm:0.19.12" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-riscv64@npm:0.19.12" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-s390x@npm:0.19.12" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-x64@npm:0.19.12" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/netbsd-x64@npm:0.19.12" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/openbsd-x64@npm:0.19.12" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/sunos-x64@npm:0.19.12" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/win32-arm64@npm:0.19.12" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/win32-ia32@npm:0.19.12" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/win32-x64@npm:0.19.12" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.1.2, @eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": + version: 4.4.0 + resolution: "@eslint-community/eslint-utils@npm:4.4.0" + dependencies: + eslint-visitor-keys: ^3.3.0 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.5.0, @eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": + version: 4.10.0 + resolution: "@eslint-community/regexpp@npm:4.10.0" + checksum: 2a6e345429ea8382aaaf3a61f865cae16ed44d31ca917910033c02dc00d505d939f10b81e079fa14d43b51499c640138e153b7e40743c4c094d9df97d4e56f7b + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.1.3": + version: 2.1.3 + resolution: "@eslint/eslintrc@npm:2.1.3" + dependencies: + ajv: ^6.12.4 + debug: ^4.3.2 + espree: ^9.6.0 + globals: ^13.19.0 + ignore: ^5.2.0 + import-fresh: ^3.2.1 + js-yaml: ^4.1.0 + minimatch: ^3.1.2 + strip-json-comments: ^3.1.1 + checksum: 5c6c3878192fe0ddffa9aff08b4e2f3bcc8f1c10d6449b7295a5f58b662019896deabfc19890455ffd7e60a5bd28d25d0eaefb2f78b2d230aae3879af92b89e5 + languageName: node + linkType: hard + +"@eslint/js@npm:8.53.0": + version: 8.53.0 + resolution: "@eslint/js@npm:8.53.0" + checksum: e0d5cfb0000aaee237c8e6d6d6e366faa60b1ef7f928ce17778373aa44d3b886368f6d5e1f97f913f0f16801aad016db8b8df78418c9d18825c15590328028af + languageName: node + linkType: hard + +"@ethereumjs/common@npm:^3.2.0": + version: 3.2.0 + resolution: "@ethereumjs/common@npm:3.2.0" + dependencies: + "@ethereumjs/util": ^8.1.0 + crc-32: ^1.2.0 + checksum: cb9cc11f5c868cb577ba611cebf55046e509218bbb89b47ccce010776dafe8256d70f8f43fab238aec74cf71f62601cd5842bc03a83261200802de365732a14b + languageName: node + linkType: hard + +"@ethereumjs/rlp@npm:^4.0.1": + version: 4.0.1 + resolution: "@ethereumjs/rlp@npm:4.0.1" + bin: + rlp: bin/rlp + checksum: 30db19c78faa2b6ff27275ab767646929207bb207f903f09eb3e4c273ce2738b45f3c82169ddacd67468b4f063d8d96035f2bf36f02b6b7e4d928eefe2e3ecbc + languageName: node + linkType: hard + +"@ethereumjs/tx@npm:^4.1.2, @ethereumjs/tx@npm:^4.2.0": + version: 4.2.0 + resolution: "@ethereumjs/tx@npm:4.2.0" + dependencies: + "@ethereumjs/common": ^3.2.0 + "@ethereumjs/rlp": ^4.0.1 + "@ethereumjs/util": ^8.1.0 + ethereum-cryptography: ^2.0.0 + checksum: 87a3f5f2452cfbf6712f8847525a80c213210ed453c211c793c5df801fe35ecef28bae17fadd222fcbdd94277478a47e52d2b916a90a6b30cda21f1e0cdaee42 + languageName: node + linkType: hard + +"@ethereumjs/util@npm:^8.0.1, @ethereumjs/util@npm:^8.1.0": + version: 8.1.0 + resolution: "@ethereumjs/util@npm:8.1.0" + dependencies: + "@ethereumjs/rlp": ^4.0.1 + ethereum-cryptography: ^2.0.0 + micro-ftch: ^0.3.1 + checksum: 9ae5dee8f12b0faf81cd83f06a41560e79b0ba96a48262771d897a510ecae605eb6d84f687da001ab8ccffd50f612ae50f988ef76e6312c752897f462f3ac08d + languageName: node + linkType: hard + +"@ethersproject/abi@npm:5.7.0, @ethersproject/abi@npm:^5.0.9, @ethersproject/abi@npm:^5.1.2, @ethersproject/abi@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/abi@npm:5.7.0" + dependencies: + "@ethersproject/address": ^5.7.0 + "@ethersproject/bignumber": ^5.7.0 + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/constants": ^5.7.0 + "@ethersproject/hash": ^5.7.0 + "@ethersproject/keccak256": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + "@ethersproject/properties": ^5.7.0 + "@ethersproject/strings": ^5.7.0 + checksum: bc6962bb6cb854e4d2a4d65b2c49c716477675b131b1363312234bdbb7e19badb7d9ce66f4ca2a70ae2ea84f7123dbc4e300a1bfe5d58864a7eafabc1466627e + languageName: node + linkType: hard + +"@ethersproject/abstract-provider@npm:5.7.0, @ethersproject/abstract-provider@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/abstract-provider@npm:5.7.0" + dependencies: + "@ethersproject/bignumber": ^5.7.0 + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + "@ethersproject/networks": ^5.7.0 + "@ethersproject/properties": ^5.7.0 + "@ethersproject/transactions": ^5.7.0 + "@ethersproject/web": ^5.7.0 + checksum: 74cf4696245cf03bb7cc5b6cbf7b4b89dd9a79a1c4688126d214153a938126d4972d42c93182198653ce1de35f2a2cad68be40337d4774b3698a39b28f0228a8 + languageName: node + linkType: hard + +"@ethersproject/abstract-signer@npm:5.7.0, @ethersproject/abstract-signer@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/abstract-signer@npm:5.7.0" + dependencies: + "@ethersproject/abstract-provider": ^5.7.0 + "@ethersproject/bignumber": ^5.7.0 + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + "@ethersproject/properties": ^5.7.0 + checksum: a823dac9cfb761e009851050ebebd5b229d1b1cc4a75b125c2da130ff37e8218208f7f9d1386f77407705b889b23d4a230ad67185f8872f083143e0073cbfbe3 + languageName: node + linkType: hard + +"@ethersproject/address@npm:5.7.0, @ethersproject/address@npm:^5.0.2, @ethersproject/address@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/address@npm:5.7.0" + dependencies: + "@ethersproject/bignumber": ^5.7.0 + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/keccak256": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + "@ethersproject/rlp": ^5.7.0 + checksum: 64ea5ebea9cc0e845c413e6cb1e54e157dd9fc0dffb98e239d3a3efc8177f2ff798cd4e3206cf3660ee8faeb7bef1a47dc0ebef0d7b132c32e61e550c7d4c843 + languageName: node + linkType: hard + +"@ethersproject/base64@npm:5.7.0, @ethersproject/base64@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/base64@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + checksum: 7dd5d734d623582f08f665434f53685041a3d3b334a0e96c0c8afa8bbcaab934d50e5b6b980e826a8fde8d353e0b18f11e61faf17468177274b8e7c69cd9742b + languageName: node + linkType: hard + +"@ethersproject/basex@npm:5.7.0, @ethersproject/basex@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/basex@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/properties": ^5.7.0 + checksum: 326087b7e1f3787b5fe6cd1cf2b4b5abfafbc355a45e88e22e5e9d6c845b613ffc5301d629b28d5c4d5e2bfe9ec424e6782c804956dff79be05f0098cb5817de + languageName: node + linkType: hard + +"@ethersproject/bignumber@npm:5.7.0, @ethersproject/bignumber@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/bignumber@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + bn.js: ^5.2.1 + checksum: 8c9a134b76f3feb4ec26a5a27379efb4e156b8fb2de0678a67788a91c7f4e30abe9d948638458e4b20f2e42380da0adacc7c9389d05fce070692edc6ae9b4904 + languageName: node + linkType: hard + +"@ethersproject/bytes@npm:5.7.0, @ethersproject/bytes@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/bytes@npm:5.7.0" + dependencies: + "@ethersproject/logger": ^5.7.0 + checksum: 66ad365ceaab5da1b23b72225c71dce472cf37737af5118181fa8ab7447d696bea15ca22e3a0e8836fdd8cfac161afe321a7c67d0dde96f9f645ddd759676621 + languageName: node + linkType: hard + +"@ethersproject/constants@npm:5.7.0, @ethersproject/constants@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/constants@npm:5.7.0" + dependencies: + "@ethersproject/bignumber": ^5.7.0 + checksum: 6d4b1355747cce837b3e76ec3bde70e4732736f23b04f196f706ebfa5d4d9c2be50904a390d4d40ce77803b98d03d16a9b6898418e04ba63491933ce08c4ba8a + languageName: node + linkType: hard + +"@ethersproject/contracts@npm:5.7.0, @ethersproject/contracts@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/contracts@npm:5.7.0" + dependencies: + "@ethersproject/abi": ^5.7.0 + "@ethersproject/abstract-provider": ^5.7.0 + "@ethersproject/abstract-signer": ^5.7.0 + "@ethersproject/address": ^5.7.0 + "@ethersproject/bignumber": ^5.7.0 + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/constants": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + "@ethersproject/properties": ^5.7.0 + "@ethersproject/transactions": ^5.7.0 + checksum: 6ccf1121cba01b31e02f8c507cb971ab6bfed85706484a9ec09878ef1594a62215f43c4fdef8f4a4875b99c4a800bc95e3be69b1803f8ce479e07634b5a740c0 + languageName: node + linkType: hard + +"@ethersproject/hash@npm:5.7.0, @ethersproject/hash@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/hash@npm:5.7.0" + dependencies: + "@ethersproject/abstract-signer": ^5.7.0 + "@ethersproject/address": ^5.7.0 + "@ethersproject/base64": ^5.7.0 + "@ethersproject/bignumber": ^5.7.0 + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/keccak256": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + "@ethersproject/properties": ^5.7.0 + "@ethersproject/strings": ^5.7.0 + checksum: 6e9fa8d14eb08171cd32f17f98cc108ec2aeca74a427655f0d689c550fee0b22a83b3b400fad7fb3f41cf14d4111f87f170aa7905bcbcd1173a55f21b06262ef + languageName: node + linkType: hard + +"@ethersproject/hdnode@npm:5.7.0, @ethersproject/hdnode@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/hdnode@npm:5.7.0" + dependencies: + "@ethersproject/abstract-signer": ^5.7.0 + "@ethersproject/basex": ^5.7.0 + "@ethersproject/bignumber": ^5.7.0 + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + "@ethersproject/pbkdf2": ^5.7.0 + "@ethersproject/properties": ^5.7.0 + "@ethersproject/sha2": ^5.7.0 + "@ethersproject/signing-key": ^5.7.0 + "@ethersproject/strings": ^5.7.0 + "@ethersproject/transactions": ^5.7.0 + "@ethersproject/wordlists": ^5.7.0 + checksum: bfe5ca2d89a42de73655f853170ef4766b933c5f481cddad709b3aca18823275b096e572f92d1602a052f80b426edde44ad6b9d028799775a7dad4a5bbed2133 + languageName: node + linkType: hard + +"@ethersproject/json-wallets@npm:5.7.0, @ethersproject/json-wallets@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/json-wallets@npm:5.7.0" + dependencies: + "@ethersproject/abstract-signer": ^5.7.0 + "@ethersproject/address": ^5.7.0 + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/hdnode": ^5.7.0 + "@ethersproject/keccak256": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + "@ethersproject/pbkdf2": ^5.7.0 + "@ethersproject/properties": ^5.7.0 + "@ethersproject/random": ^5.7.0 + "@ethersproject/strings": ^5.7.0 + "@ethersproject/transactions": ^5.7.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + checksum: f583458d22db62efaaf94d38dd243482776a45bf90f9f3882fbad5aa0b8fd288b41eb7c1ff8ec0b99c9b751088e43d6173530db64dd33c59f9d8daa8d7ad5aa2 + languageName: node + linkType: hard + +"@ethersproject/keccak256@npm:5.7.0, @ethersproject/keccak256@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/keccak256@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + js-sha3: 0.8.0 + checksum: ff70950d82203aab29ccda2553422cbac2e7a0c15c986bd20a69b13606ed8bb6e4fdd7b67b8d3b27d4f841e8222cbaccd33ed34be29f866fec7308f96ed244c6 + languageName: node + linkType: hard + +"@ethersproject/logger@npm:5.7.0, @ethersproject/logger@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/logger@npm:5.7.0" + checksum: 075ab2f605f1fd0813f2e39c3308f77b44a67732b36e712d9bc085f22a84aac4da4f71b39bee50fe78da3e1c812673fadc41180c9970fe5e486e91ea17befe0d + languageName: node + linkType: hard + +"@ethersproject/networks@npm:5.7.1, @ethersproject/networks@npm:^5.7.0": + version: 5.7.1 + resolution: "@ethersproject/networks@npm:5.7.1" + dependencies: + "@ethersproject/logger": ^5.7.0 + checksum: 0339f312304c17d9a0adce550edb825d4d2c8c9468c1634c44172c67a9ed256f594da62c4cda5c3837a0f28b7fabc03aca9b492f68ff1fdad337ee861b27bd5d + languageName: node + linkType: hard + +"@ethersproject/pbkdf2@npm:5.7.0, @ethersproject/pbkdf2@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/pbkdf2@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/sha2": ^5.7.0 + checksum: b895adb9e35a8a127e794f7aadc31a2424ef355a70e51cde10d457e3e888bb8102373199a540cf61f2d6b9a32e47358f9c65b47d559f42bf8e596b5fd67901e9 + languageName: node + linkType: hard + +"@ethersproject/properties@npm:5.7.0, @ethersproject/properties@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/properties@npm:5.7.0" + dependencies: + "@ethersproject/logger": ^5.7.0 + checksum: 6ab0ccf0c3aadc9221e0cdc5306ce6cd0df7f89f77d77bccdd1277182c9ead0202cd7521329ba3acde130820bf8af299e17cf567d0d497c736ee918207bbf59f + languageName: node + linkType: hard + +"@ethersproject/providers@npm:5.7.2, @ethersproject/providers@npm:^5.7.2": + version: 5.7.2 + resolution: "@ethersproject/providers@npm:5.7.2" + dependencies: + "@ethersproject/abstract-provider": ^5.7.0 + "@ethersproject/abstract-signer": ^5.7.0 + "@ethersproject/address": ^5.7.0 + "@ethersproject/base64": ^5.7.0 + "@ethersproject/basex": ^5.7.0 + "@ethersproject/bignumber": ^5.7.0 + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/constants": ^5.7.0 + "@ethersproject/hash": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + "@ethersproject/networks": ^5.7.0 + "@ethersproject/properties": ^5.7.0 + "@ethersproject/random": ^5.7.0 + "@ethersproject/rlp": ^5.7.0 + "@ethersproject/sha2": ^5.7.0 + "@ethersproject/strings": ^5.7.0 + "@ethersproject/transactions": ^5.7.0 + "@ethersproject/web": ^5.7.0 + bech32: 1.1.4 + ws: 7.4.6 + checksum: 1754c731a5ca6782ae9677f4a9cd8b6246c4ef21a966c9a01b133750f3c578431ec43ec254e699969c4a0f87e84463ded50f96b415600aabd37d2056aee58c19 + languageName: node + linkType: hard + +"@ethersproject/random@npm:5.7.0, @ethersproject/random@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/random@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + checksum: 017829c91cff6c76470852855108115b0b52c611b6be817ed1948d56ba42d6677803ec2012aa5ae298a7660024156a64c11fcf544e235e239ab3f89f0fff7345 + languageName: node + linkType: hard + +"@ethersproject/rlp@npm:5.7.0, @ethersproject/rlp@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/rlp@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + checksum: bce165b0f7e68e4d091c9d3cf47b247cac33252df77a095ca4281d32d5eeaaa3695d9bc06b2b057c5015353a68df89f13a4a54a72e888e4beeabbe56b15dda6e + languageName: node + linkType: hard + +"@ethersproject/sha2@npm:5.7.0, @ethersproject/sha2@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/sha2@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + hash.js: 1.1.7 + checksum: 09321057c022effbff4cc2d9b9558228690b5dd916329d75c4b1ffe32ba3d24b480a367a7cc92d0f0c0b1c896814d03351ae4630e2f1f7160be2bcfbde435dbc + languageName: node + linkType: hard + +"@ethersproject/signing-key@npm:5.7.0, @ethersproject/signing-key@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/signing-key@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + "@ethersproject/properties": ^5.7.0 + bn.js: ^5.2.1 + elliptic: 6.5.4 + hash.js: 1.1.7 + checksum: 8f8de09b0aac709683bbb49339bc0a4cd2f95598f3546436c65d6f3c3a847ffa98e06d35e9ed2b17d8030bd2f02db9b7bd2e11c5cf8a71aad4537487ab4cf03a + languageName: node + linkType: hard + +"@ethersproject/solidity@npm:5.7.0, @ethersproject/solidity@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/solidity@npm:5.7.0" + dependencies: + "@ethersproject/bignumber": ^5.7.0 + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/keccak256": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + "@ethersproject/sha2": ^5.7.0 + "@ethersproject/strings": ^5.7.0 + checksum: 9a02f37f801c96068c3e7721f83719d060175bc4e80439fe060e92bd7acfcb6ac1330c7e71c49f4c2535ca1308f2acdcb01e00133129aac00581724c2d6293f3 + languageName: node + linkType: hard + +"@ethersproject/strings@npm:5.7.0, @ethersproject/strings@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/strings@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/constants": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + checksum: 5ff78693ae3fdf3cf23e1f6dc047a61e44c8197d2408c42719fef8cb7b7b3613a4eec88ac0ed1f9f5558c74fe0de7ae3195a29ca91a239c74b9f444d8e8b50df + languageName: node + linkType: hard + +"@ethersproject/transactions@npm:5.7.0, @ethersproject/transactions@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/transactions@npm:5.7.0" + dependencies: + "@ethersproject/address": ^5.7.0 + "@ethersproject/bignumber": ^5.7.0 + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/constants": ^5.7.0 + "@ethersproject/keccak256": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + "@ethersproject/properties": ^5.7.0 + "@ethersproject/rlp": ^5.7.0 + "@ethersproject/signing-key": ^5.7.0 + checksum: a31b71996d2b283f68486241bff0d3ea3f1ba0e8f1322a8fffc239ccc4f4a7eb2ea9994b8fd2f093283fd75f87bae68171e01b6265261f821369aca319884a79 + languageName: node + linkType: hard + +"@ethersproject/units@npm:5.7.0": + version: 5.7.0 + resolution: "@ethersproject/units@npm:5.7.0" + dependencies: + "@ethersproject/bignumber": ^5.7.0 + "@ethersproject/constants": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + checksum: 304714f848cd32e57df31bf545f7ad35c2a72adae957198b28cbc62166daa929322a07bff6e9c9ac4577ab6aa0de0546b065ed1b2d20b19e25748b7d475cb0fc + languageName: node + linkType: hard + +"@ethersproject/wallet@npm:5.7.0, @ethersproject/wallet@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/wallet@npm:5.7.0" + dependencies: + "@ethersproject/abstract-provider": ^5.7.0 + "@ethersproject/abstract-signer": ^5.7.0 + "@ethersproject/address": ^5.7.0 + "@ethersproject/bignumber": ^5.7.0 + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/hash": ^5.7.0 + "@ethersproject/hdnode": ^5.7.0 + "@ethersproject/json-wallets": ^5.7.0 + "@ethersproject/keccak256": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + "@ethersproject/properties": ^5.7.0 + "@ethersproject/random": ^5.7.0 + "@ethersproject/signing-key": ^5.7.0 + "@ethersproject/transactions": ^5.7.0 + "@ethersproject/wordlists": ^5.7.0 + checksum: a4009bf7331eddab38e3015b5e9101ef92de7f705b00a6196b997db0e5635b6d83561674d46c90c6f77b87c0500fe4a6b0183ba13749efc22db59c99deb82fbd + languageName: node + linkType: hard + +"@ethersproject/web@npm:5.7.1, @ethersproject/web@npm:^5.7.0": + version: 5.7.1 + resolution: "@ethersproject/web@npm:5.7.1" + dependencies: + "@ethersproject/base64": ^5.7.0 + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + "@ethersproject/properties": ^5.7.0 + "@ethersproject/strings": ^5.7.0 + checksum: 7028c47103f82fd2e2c197ce0eecfacaa9180ffeec7de7845b1f4f9b19d84081b7a48227aaddde05a4aaa526af574a9a0ce01cc0fc75e3e371f84b38b5b16b2b + languageName: node + linkType: hard + +"@ethersproject/wordlists@npm:5.7.0, @ethersproject/wordlists@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/wordlists@npm:5.7.0" + dependencies: + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/hash": ^5.7.0 + "@ethersproject/logger": ^5.7.0 + "@ethersproject/properties": ^5.7.0 + "@ethersproject/strings": ^5.7.0 + checksum: 30eb6eb0731f9ef5faa44bf9c0c6e950bcaaef61e4d2d9ce0ae6d341f4e2d6d1f4ab4f8880bfce03b7aac4b862fb740e1421170cfbf8e2aafc359277d49e6e97 + languageName: node + linkType: hard + +"@gar/promisify@npm:^1.1.3": + version: 1.1.3 + resolution: "@gar/promisify@npm:1.1.3" + checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 + languageName: node + linkType: hard + +"@hapi/hoek@npm:^9.0.0": + version: 9.3.0 + resolution: "@hapi/hoek@npm:9.3.0" + checksum: 4771c7a776242c3c022b168046af4e324d116a9d2e1d60631ee64f474c6e38d1bb07092d898bf95c7bc5d334c5582798a1456321b2e53ca817d4e7c88bc25b43 + languageName: node + linkType: hard + +"@hapi/topo@npm:^5.0.0": + version: 5.1.0 + resolution: "@hapi/topo@npm:5.1.0" + dependencies: + "@hapi/hoek": ^9.0.0 + checksum: 604dfd5dde76d5c334bd03f9001fce69c7ce529883acf92da96f4fe7e51221bf5e5110e964caca287a6a616ba027c071748ab636ff178ad750547fba611d6014 + languageName: node + linkType: hard + +"@harmony/eslint-config@workspace:packages/eslint-config": + version: 0.0.0-use.local + resolution: "@harmony/eslint-config@workspace:packages/eslint-config" + languageName: unknown + linkType: soft + +"@harmony/prettier-config@workspace:packages/prettier-config": + version: 0.0.0-use.local + resolution: "@harmony/prettier-config@workspace:packages/prettier-config" + peerDependencies: + prettier: ^2.8.8 + languageName: unknown + linkType: soft + +"@humanwhocodes/config-array@npm:^0.11.13": + version: 0.11.13 + resolution: "@humanwhocodes/config-array@npm:0.11.13" + dependencies: + "@humanwhocodes/object-schema": ^2.0.1 + debug: ^4.1.1 + minimatch: ^3.0.5 + checksum: f8ea57b0d7ed7f2d64cd3944654976829d9da91c04d9c860e18804729a33f7681f78166ef4c761850b8c324d362f7d53f14c5c44907a6b38b32c703ff85e4805 + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^2.0.1": + version: 2.0.1 + resolution: "@humanwhocodes/object-schema@npm:2.0.1" + checksum: 24929487b1ed48795d2f08346a0116cc5ee4634848bce64161fb947109352c562310fd159fc64dda0e8b853307f5794605191a9547f7341158559ca3c8262a45 + languageName: node + linkType: hard + +"@ioredis/commands@npm:^1.1.1": + version: 1.2.0 + resolution: "@ioredis/commands@npm:1.2.0" + checksum: 9b20225ba36ef3e5caf69b3c0720597c3016cc9b1e157f519ea388f621dd9037177f84cfe7e25c4c32dad7dd90c70ff9123cd411f747e053cf292193c9c461e2 + languageName: node + linkType: hard + +"@istanbuljs/load-nyc-config@npm:^1.0.0": + version: 1.1.0 + resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" + dependencies: + camelcase: ^5.3.1 + find-up: ^4.1.0 + get-package-type: ^0.1.0 + js-yaml: ^3.13.1 + resolve-from: ^5.0.0 + checksum: d578da5e2e804d5c93228450a1380e1a3c691de4953acc162f387b717258512a3e07b83510a936d9fab03eac90817473917e24f5d16297af3867f59328d58568 + languageName: node + linkType: hard + +"@istanbuljs/schema@npm:^0.1.2": + version: 0.1.3 + resolution: "@istanbuljs/schema@npm:0.1.3" + checksum: 5282759d961d61350f33d9118d16bcaed914ebf8061a52f4fa474b2cb08720c9c81d165e13b82f2e5a8a212cc5af482f0c6fc1ac27b9e067e5394c9a6ed186c9 + languageName: node + linkType: hard + +"@jest/console@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/console@npm:29.6.2" + dependencies: + "@jest/types": ^29.6.1 + "@types/node": "*" + chalk: ^4.0.0 + jest-message-util: ^29.6.2 + jest-util: ^29.6.2 + slash: ^3.0.0 + checksum: 1198667bda0430770c3e9b92681c0ee9f8346394574071c633f306192ac5f08e12972d6a5fdf03eb0d441051c8439bce0f6f9f355dc60d98777a35328331ba2e + languageName: node + linkType: hard + +"@jest/core@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/core@npm:29.6.2" + dependencies: + "@jest/console": ^29.6.2 + "@jest/reporters": ^29.6.2 + "@jest/test-result": ^29.6.2 + "@jest/transform": ^29.6.2 + "@jest/types": ^29.6.1 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + ci-info: ^3.2.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + jest-changed-files: ^29.5.0 + jest-config: ^29.6.2 + jest-haste-map: ^29.6.2 + jest-message-util: ^29.6.2 + jest-regex-util: ^29.4.3 + jest-resolve: ^29.6.2 + jest-resolve-dependencies: ^29.6.2 + jest-runner: ^29.6.2 + jest-runtime: ^29.6.2 + jest-snapshot: ^29.6.2 + jest-util: ^29.6.2 + jest-validate: ^29.6.2 + jest-watcher: ^29.6.2 + micromatch: ^4.0.4 + pretty-format: ^29.6.2 + slash: ^3.0.0 + strip-ansi: ^6.0.0 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 6bbb3886430248c0092f275b1b946a701406732f7442c04e63e4ee2297c2ec02d8ceeec508a202e08128197699b2bcddbae2c2f74adb2cf30f2f0d7d94a7c2dc + languageName: node + linkType: hard + +"@jest/environment@npm:^29.6.2, @jest/environment@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/environment@npm:29.7.0" + dependencies: + "@jest/fake-timers": ^29.7.0 + "@jest/types": ^29.6.3 + "@types/node": "*" + jest-mock: ^29.7.0 + checksum: 6fb398143b2543d4b9b8d1c6dbce83fa5247f84f550330604be744e24c2bd2178bb893657d62d1b97cf2f24baf85c450223f8237cccb71192c36a38ea2272934 + languageName: node + linkType: hard + +"@jest/expect-utils@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/expect-utils@npm:29.6.2" + dependencies: + jest-get-type: ^29.4.3 + checksum: 0decf2009aa3735f9df469e78ce1721c2815e4278439887e0cf0321ca8979541a22515d114a59b2445a6cd70a074b09dc9c00b5e7b3b3feac5174b9c4a78b2e1 + languageName: node + linkType: hard + +"@jest/expect@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/expect@npm:29.6.2" + dependencies: + expect: ^29.6.2 + jest-snapshot: ^29.6.2 + checksum: bd2d88a4e7c5420079c239afef341ec53dc7e353816cd13acbb42631a31fd321fe58677bb43a4dba851028f4c7e31da7980314e9094cd5b348896cb6cd3d42b2 + languageName: node + linkType: hard + +"@jest/fake-timers@npm:^29.6.2, @jest/fake-timers@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/fake-timers@npm:29.7.0" + dependencies: + "@jest/types": ^29.6.3 + "@sinonjs/fake-timers": ^10.0.2 + "@types/node": "*" + jest-message-util: ^29.7.0 + jest-mock: ^29.7.0 + jest-util: ^29.7.0 + checksum: caf2bbd11f71c9241b458d1b5a66cbe95debc5a15d96442444b5d5c7ba774f523c76627c6931cca5e10e76f0d08761f6f1f01a608898f4751a0eee54fc3d8d00 + languageName: node + linkType: hard + +"@jest/globals@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/globals@npm:29.6.2" + dependencies: + "@jest/environment": ^29.6.2 + "@jest/expect": ^29.6.2 + "@jest/types": ^29.6.1 + jest-mock: ^29.6.2 + checksum: aa4a54f19cc025205bc696546940e1fe9c752c2d4d825852088aa76d44677ebba1ec66fabb78e615480cff23a06a70b5a3f893ab5163d901cdfa0d2267870b10 + languageName: node + linkType: hard + +"@jest/reporters@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/reporters@npm:29.6.2" + dependencies: + "@bcoe/v8-coverage": ^0.2.3 + "@jest/console": ^29.6.2 + "@jest/test-result": ^29.6.2 + "@jest/transform": ^29.6.2 + "@jest/types": ^29.6.1 + "@jridgewell/trace-mapping": ^0.3.18 + "@types/node": "*" + chalk: ^4.0.0 + collect-v8-coverage: ^1.0.0 + exit: ^0.1.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + istanbul-lib-coverage: ^3.0.0 + istanbul-lib-instrument: ^5.1.0 + istanbul-lib-report: ^3.0.0 + istanbul-lib-source-maps: ^4.0.0 + istanbul-reports: ^3.1.3 + jest-message-util: ^29.6.2 + jest-util: ^29.6.2 + jest-worker: ^29.6.2 + slash: ^3.0.0 + string-length: ^4.0.1 + strip-ansi: ^6.0.0 + v8-to-istanbul: ^9.0.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 7cf880d0730cee7d24ee96928003ef6946bf93423b0ae9a2edb53cae2c231b8ac50ec264f48a73744e3f11ca319cd414edacf99b2e7bf37cd72fe0b362090dd1 + languageName: node + linkType: hard + +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" + dependencies: + "@sinclair/typebox": ^0.27.8 + checksum: 910040425f0fc93cd13e68c750b7885590b8839066dfa0cd78e7def07bbb708ad869381f725945d66f2284de5663bbecf63e8fdd856e2ae6e261ba30b1687e93 + languageName: node + linkType: hard + +"@jest/source-map@npm:^29.6.0": + version: 29.6.0 + resolution: "@jest/source-map@npm:29.6.0" + dependencies: + "@jridgewell/trace-mapping": ^0.3.18 + callsites: ^3.0.0 + graceful-fs: ^4.2.9 + checksum: 9c6c40387410bb70b2fae8124287fc28f6bdd1b2d7f24348e8611e1bb638b404518228a4ce64a582365b589c536ae8e7ebab0126cef59a87874b71061d19783b + languageName: node + linkType: hard + +"@jest/test-result@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/test-result@npm:29.6.2" + dependencies: + "@jest/console": ^29.6.2 + "@jest/types": ^29.6.1 + "@types/istanbul-lib-coverage": ^2.0.0 + collect-v8-coverage: ^1.0.0 + checksum: 8aff37f18c8d2df4d9f453d57ec018a6479eb697fabcf74b1ca06e34553da1d7a2b85580a290408ba0b02e58543263244a2cb065c7c7180c8d8180cc78444fbd + languageName: node + linkType: hard + +"@jest/test-sequencer@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/test-sequencer@npm:29.6.2" + dependencies: + "@jest/test-result": ^29.6.2 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.6.2 + slash: ^3.0.0 + checksum: 12dc2577e45eeb98b85d1769846b7d6effa536907986ad3c4cbd014df9e24431a564cc8cd94603332e4b1f9bfb421371883efc6a5085b361a52425ffc2a52dc6 + languageName: node + linkType: hard + +"@jest/transform@npm:^29.6.2": + version: 29.6.2 + resolution: "@jest/transform@npm:29.6.2" + dependencies: + "@babel/core": ^7.11.6 + "@jest/types": ^29.6.1 + "@jridgewell/trace-mapping": ^0.3.18 + babel-plugin-istanbul: ^6.1.1 + chalk: ^4.0.0 + convert-source-map: ^2.0.0 + fast-json-stable-stringify: ^2.1.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.6.2 + jest-regex-util: ^29.4.3 + jest-util: ^29.6.2 + micromatch: ^4.0.4 + pirates: ^4.0.4 + slash: ^3.0.0 + write-file-atomic: ^4.0.2 + checksum: ffb8c3c344cd48bedadec295d9c436737eccc39c1f0868aa9753b76397b33b2e5b121058af6f287ba6f2036181137e37df1212334bfa9d9a712986a4518cdc18 + languageName: node + linkType: hard + +"@jest/types@npm:^29.6.1, @jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" + dependencies: + "@jest/schemas": ^29.6.3 + "@types/istanbul-lib-coverage": ^2.0.0 + "@types/istanbul-reports": ^3.0.0 + "@types/node": "*" + "@types/yargs": ^17.0.8 + chalk: ^4.0.0 + checksum: a0bcf15dbb0eca6bdd8ce61a3fb055349d40268622a7670a3b2eb3c3dbafe9eb26af59938366d520b86907b9505b0f9b29b85cec11579a9e580694b87cd90fcc + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" + dependencies: + "@jridgewell/set-array": ^1.2.1 + "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: ff7a1764ebd76a5e129c8890aa3e2f46045109dabde62b0b6c6a250152227647178ff2069ea234753a690d8f3c4ac8b5e7b267bbee272bffb7f3b0a370ab6e52 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 83b85f72c59d1c080b4cbec0fef84528963a1b5db34e4370fa4bd1e3ff64a0d80e0cee7369d11d73c704e0286fb2865b530acac7a871088fbe92b5edf1000870 + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": ^3.0.3 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": ^3.1.0 + "@jridgewell/sourcemap-codec": ^1.4.14 + checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 + languageName: node + linkType: hard + +"@lit-labs/ssr-dom-shim@npm:^1.0.0, @lit-labs/ssr-dom-shim@npm:^1.1.0": + version: 1.2.0 + resolution: "@lit-labs/ssr-dom-shim@npm:1.2.0" + checksum: 704621c28df8d651e54a1b93f6ede8103db2dd3e7a1f02463fe5492bd28aa22de813314c7833260204fed5c8491a6bbd763f6051abc25690df537d812a508c35 + languageName: node + linkType: hard + +"@lit/reactive-element@npm:^1.3.0, @lit/reactive-element@npm:^1.6.0": + version: 1.6.3 + resolution: "@lit/reactive-element@npm:1.6.3" + dependencies: + "@lit-labs/ssr-dom-shim": ^1.0.0 + checksum: 79b58631c38effeabad090070324431da8a22cf0ff665f5e4de35e4d791f984742b3d340c9c7fce996d1124a8da95febc582471b4c237236c770b1300b56ef6e + languageName: node + linkType: hard + +"@matrix-org/olm@npm:^3.2.15": + version: 3.2.15 + resolution: "@matrix-org/olm@npm:3.2.15" + checksum: 1548d2d72db08e53056425b92bcf5a02d5fa5917dc34d519c6d89c4f80a31f4c36da11d957e9b55302d34595f67cac50efd4b6ff725de1dd448c645a42589f74 + languageName: node + linkType: hard + +"@metamask/eth-json-rpc-provider@npm:^1.0.0": + version: 1.0.1 + resolution: "@metamask/eth-json-rpc-provider@npm:1.0.1" + dependencies: + "@metamask/json-rpc-engine": ^7.0.0 + "@metamask/safe-event-emitter": ^3.0.0 + "@metamask/utils": ^5.0.1 + checksum: ff97648b002d2889bd020c03abc26137cf068df3280e46144b5333c1b294f35f5099361343825f900ef20b9dcb6819495830b7a99eb1cbfbd671e5b11c0dfde1 + languageName: node + linkType: hard + +"@metamask/json-rpc-engine@npm:^7.0.0": + version: 7.3.2 + resolution: "@metamask/json-rpc-engine@npm:7.3.2" + dependencies: + "@metamask/rpc-errors": ^6.1.0 + "@metamask/safe-event-emitter": ^3.0.0 + "@metamask/utils": ^8.3.0 + checksum: 396861afc72944af410d5b06c81806db2fd9812206dbf799438f42d974edac6931f6814133adf52d6aa233d5ea3f3629663ef4f54a0cf9ccb948ce9b527137fd + languageName: node + linkType: hard + +"@metamask/rpc-errors@npm:^6.1.0": + version: 6.2.1 + resolution: "@metamask/rpc-errors@npm:6.2.1" + dependencies: + "@metamask/utils": ^8.3.0 + fast-safe-stringify: ^2.0.6 + checksum: a9223c3cb9ab05734ea0dda990597f90a7cdb143efa0c026b1a970f2094fe5fa3c341ed39b1e7623be13a96b98fb2c697ef51a2e2b87d8f048114841d35ee0a9 + languageName: node + linkType: hard + +"@metamask/safe-event-emitter@npm:^2.0.0": + version: 2.0.0 + resolution: "@metamask/safe-event-emitter@npm:2.0.0" + checksum: 8b717ac5d53df0027c05509f03d0534700b5898dd1c3a53fb2dc4c0499ca5971b14aae67f522d09eb9f509e77f50afa95fdb3eda1afbff8b071c18a3d2905e93 + languageName: node + linkType: hard + +"@metamask/safe-event-emitter@npm:^3.0.0": + version: 3.0.0 + resolution: "@metamask/safe-event-emitter@npm:3.0.0" + checksum: 8dc58a76f9f75bf2405931465fc311c68043d851e6b8ebe9f82ae339073a08a83430dba9338f8e3adc4bfc8067607125074bcafa32baee3a5157f42343dc89e5 + languageName: node + linkType: hard + +"@metamask/utils@npm:^5.0.1": + version: 5.0.2 + resolution: "@metamask/utils@npm:5.0.2" + dependencies: + "@ethereumjs/tx": ^4.1.2 + "@types/debug": ^4.1.7 + debug: ^4.3.4 + semver: ^7.3.8 + superstruct: ^1.0.3 + checksum: eca82e42911b2840deb4f32f0f215c5ffd14d22d68afbbe92d3180e920e509e310777b15eab29def3448f3535b66596ceb4c23666ec846adacc8e1bb093ff882 + languageName: node + linkType: hard + +"@metamask/utils@npm:^8.3.0": + version: 8.3.0 + resolution: "@metamask/utils@npm:8.3.0" + dependencies: + "@ethereumjs/tx": ^4.2.0 + "@noble/hashes": ^1.3.1 + "@scure/base": ^1.1.3 + "@types/debug": ^4.1.7 + debug: ^4.3.4 + pony-cause: ^2.1.10 + semver: ^7.5.4 + superstruct: ^1.0.3 + checksum: cd60c49b4c0397fb31e6b38937a0d9346cbb8337cb8add59db8db0e0e2156fb063ff4df93a26410157f0cc02aa9a9b785fc1b53cfc4ab73204462893ed11cacb + languageName: node + linkType: hard + +"@morgan-stanley/ts-mocking-bird@npm:^0.6.2": + version: 0.6.4 + resolution: "@morgan-stanley/ts-mocking-bird@npm:0.6.4" + dependencies: + lodash: ^4.17.16 + uuid: ^7.0.3 + peerDependencies: + jasmine: 2.x || 3.x || 4.x + jest: 26.x || 27.x || 28.x + typescript: ">=4.2" + peerDependenciesMeta: + jasmine: + optional: true + jest: + optional: true + checksum: 7d788007c86b6b1455943105c71e5fe60c5087377f78cf6f8281d7f8978ed47322e4e8e6b21c137e5089389d141b0dd6f0e0b12dc53d440604abfa93a7463095 + languageName: node + linkType: hard + +"@motionone/animation@npm:^10.15.1, @motionone/animation@npm:^10.17.0": + version: 10.17.0 + resolution: "@motionone/animation@npm:10.17.0" + dependencies: + "@motionone/easing": ^10.17.0 + "@motionone/types": ^10.17.0 + "@motionone/utils": ^10.17.0 + tslib: ^2.3.1 + checksum: 8cab13cde7ccbe29bcaff1cb43ba39acdc51d9be4726628f4d0ba27898c59456887fd9ec56aceaa3d5b82993efbdfa9a7b9e99d4b96bc458f486208394027093 + languageName: node + linkType: hard + +"@motionone/dom@npm:^10.16.2, @motionone/dom@npm:^10.16.4": + version: 10.17.0 + resolution: "@motionone/dom@npm:10.17.0" + dependencies: + "@motionone/animation": ^10.17.0 + "@motionone/generators": ^10.17.0 + "@motionone/types": ^10.17.0 + "@motionone/utils": ^10.17.0 + hey-listen: ^1.0.8 + tslib: ^2.3.1 + checksum: 6415f17032136218dfa88b9b00fbab738e514544129edf6f5c01dbdacefe9be48efd2d06f3d0cb7f2f5d2d2d79c94362effc7d034332406fd4dec6a710e603a2 + languageName: node + linkType: hard + +"@motionone/easing@npm:^10.17.0": + version: 10.17.0 + resolution: "@motionone/easing@npm:10.17.0" + dependencies: + "@motionone/utils": ^10.17.0 + tslib: ^2.3.1 + checksum: 2870d9e94645cf4ed3a27309a858dccee26615291ec46b56e993ef3ac9f059a659b02a2115ed61d27250fc8800acc9640f0319aeb402de7fa0e15dffbebeb548 + languageName: node + linkType: hard + +"@motionone/generators@npm:^10.17.0": + version: 10.17.0 + resolution: "@motionone/generators@npm:10.17.0" + dependencies: + "@motionone/types": ^10.17.0 + "@motionone/utils": ^10.17.0 + tslib: ^2.3.1 + checksum: 6d048a0362692db3f450b97c1679a8d0265bff93106412bdcc33b9c48b9362a3e97f672f29a2932d5e393330750fdd55921c1c9b2bf20690922a37a0164e649f + languageName: node + linkType: hard + +"@motionone/svelte@npm:^10.16.2": + version: 10.16.4 + resolution: "@motionone/svelte@npm:10.16.4" + dependencies: + "@motionone/dom": ^10.16.4 + tslib: ^2.3.1 + checksum: 699e20955ea832bcf32d410ae9f88edf61a5c2cf2b56527119ab1df6fecbf2632b62d541743d0f6d278fd700a15a20b9eb7c8aa5266e7aed5e113b8f8f75b863 + languageName: node + linkType: hard + +"@motionone/types@npm:^10.15.1, @motionone/types@npm:^10.17.0": + version: 10.17.0 + resolution: "@motionone/types@npm:10.17.0" + checksum: 3996c84e1578b17146c14bd581ab682b7b2a06ca7fd5a7dc378a0f3b10539256d7b803a7df748f0c60d6df6b33950269a27ba2bb1839de779196bd024bee4b87 + languageName: node + linkType: hard + +"@motionone/utils@npm:^10.15.1, @motionone/utils@npm:^10.17.0": + version: 10.17.0 + resolution: "@motionone/utils@npm:10.17.0" + dependencies: + "@motionone/types": ^10.17.0 + hey-listen: ^1.0.8 + tslib: ^2.3.1 + checksum: 408e278c9051a221e528bb9ca0a773018b9953ecd53bb88715421afc009f4647417b0d9f163c8195467badd934f39ade24f57e007416988e4291242e749ea43d + languageName: node + linkType: hard + +"@motionone/vue@npm:^10.16.2": + version: 10.16.4 + resolution: "@motionone/vue@npm:10.16.4" + dependencies: + "@motionone/dom": ^10.16.4 + tslib: ^2.3.1 + checksum: 746e38d0ee831829bfac2ce471f3d98a9e37bd8cbdf2706fa3becce69c17f51180a1ee47582d97758d68aafdfc9a187ab47ff216c77254ac994287dabcf266c1 + languageName: node + linkType: hard + +"@msgpackr-extract/msgpackr-extract-darwin-arm64@npm:3.0.2": + version: 3.0.2 + resolution: "@msgpackr-extract/msgpackr-extract-darwin-arm64@npm:3.0.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@msgpackr-extract/msgpackr-extract-darwin-x64@npm:3.0.2": + version: 3.0.2 + resolution: "@msgpackr-extract/msgpackr-extract-darwin-x64@npm:3.0.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@msgpackr-extract/msgpackr-extract-linux-arm64@npm:3.0.2": + version: 3.0.2 + resolution: "@msgpackr-extract/msgpackr-extract-linux-arm64@npm:3.0.2" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@msgpackr-extract/msgpackr-extract-linux-arm@npm:3.0.2": + version: 3.0.2 + resolution: "@msgpackr-extract/msgpackr-extract-linux-arm@npm:3.0.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@msgpackr-extract/msgpackr-extract-linux-x64@npm:3.0.2": + version: 3.0.2 + resolution: "@msgpackr-extract/msgpackr-extract-linux-x64@npm:3.0.2" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@msgpackr-extract/msgpackr-extract-win32-x64@npm:3.0.2": + version: 3.0.2 + resolution: "@msgpackr-extract/msgpackr-extract-win32-x64@npm:3.0.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@noble/curves@npm:1.1.0, @noble/curves@npm:~1.1.0": + version: 1.1.0 + resolution: "@noble/curves@npm:1.1.0" + dependencies: + "@noble/hashes": 1.3.1 + checksum: 2658cdd3f84f71079b4e3516c47559d22cf4b55c23ac8ee9d2b1f8e5b72916d9689e59820e0f9d9cb4a46a8423af5b56dc6bb7782405c88be06a015180508db5 + languageName: node + linkType: hard + +"@noble/curves@npm:1.2.0, @noble/curves@npm:~1.2.0": + version: 1.2.0 + resolution: "@noble/curves@npm:1.2.0" + dependencies: + "@noble/hashes": 1.3.2 + checksum: bb798d7a66d8e43789e93bc3c2ddff91a1e19fdb79a99b86cd98f1e5eff0ee2024a2672902c2576ef3577b6f282f3b5c778bebd55761ddbb30e36bf275e83dd0 + languageName: node + linkType: hard + +"@noble/hashes@npm:1.2.0, @noble/hashes@npm:~1.2.0": + version: 1.2.0 + resolution: "@noble/hashes@npm:1.2.0" + checksum: 8ca080ce557b8f40fb2f78d3aedffd95825a415ac8e13d7ffe3643f8626a8c2d99a3e5975b555027ac24316d8b3c02a35b8358567c0c23af681e6573602aa434 + languageName: node + linkType: hard + +"@noble/hashes@npm:1.3.1": + version: 1.3.1 + resolution: "@noble/hashes@npm:1.3.1" + checksum: 7fdefc0f7a0c1ec27acc6ff88841793e3f93ec4ce6b8a6a12bfc0dd70ae6b7c4c82fe305fdfeda1735d5ad4a9eebe761e6693b3d355689c559e91242f4bc95b1 + languageName: node + linkType: hard + +"@noble/hashes@npm:1.3.2": + version: 1.3.2 + resolution: "@noble/hashes@npm:1.3.2" + checksum: fe23536b436539d13f90e4b9be843cc63b1b17666a07634a2b1259dded6f490be3d050249e6af98076ea8f2ea0d56f578773c2197f2aa0eeaa5fba5bc18ba474 + languageName: node + linkType: hard + +"@noble/hashes@npm:^1.3.1, @noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.1, @noble/hashes@npm:~1.3.2": + version: 1.3.3 + resolution: "@noble/hashes@npm:1.3.3" + checksum: 8a6496d1c0c64797339bc694ad06cdfaa0f9e56cd0c3f68ae3666cfb153a791a55deb0af9c653c7ed2db64d537aa3e3054629740d2f2338bb1dcb7ab60cd205b + languageName: node + linkType: hard + +"@noble/secp256k1@npm:1.7.1, @noble/secp256k1@npm:~1.7.0": + version: 1.7.1 + resolution: "@noble/secp256k1@npm:1.7.1" + checksum: d2301f1f7690368d8409a3152450458f27e54df47e3f917292de3de82c298770890c2de7c967d237eff9c95b70af485389a9695f73eb05a43e2bd562d18b18cb + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: ^1.1.9 + checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: ^1.6.0 + checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 + languageName: node + linkType: hard + +"@nomiclabs/hardhat-etherscan@npm:^2.1.6": + version: 2.1.8 + resolution: "@nomiclabs/hardhat-etherscan@npm:2.1.8" + dependencies: + "@ethersproject/abi": ^5.1.2 + "@ethersproject/address": ^5.0.2 + cbor: ^5.0.2 + debug: ^4.1.1 + fs-extra: ^7.0.1 + node-fetch: ^2.6.0 + semver: ^6.3.0 + peerDependencies: + hardhat: ^2.0.4 + checksum: 99a4c97908198a63b3cf68c330599e117a41ffe7e1aa5314eb6e915dd95a5fa677581c79a8b59c088b2d2e090465c95857f24cec9a9e47f0fc20c43119107cdd + languageName: node + linkType: hard + +"@npmcli/fs@npm:^2.1.0": + version: 2.1.2 + resolution: "@npmcli/fs@npm:2.1.2" + dependencies: + "@gar/promisify": ^1.1.3 + semver: ^7.3.5 + checksum: 405074965e72d4c9d728931b64d2d38e6ea12066d4fad651ac253d175e413c06fe4350970c783db0d749181da8fe49c42d3880bd1cbc12cd68e3a7964d820225 + languageName: node + linkType: hard + +"@npmcli/move-file@npm:^2.0.0": + version: 2.0.1 + resolution: "@npmcli/move-file@npm:2.0.1" + dependencies: + mkdirp: ^1.0.4 + rimraf: ^3.0.2 + checksum: 52dc02259d98da517fae4cb3a0a3850227bdae4939dda1980b788a7670636ca2b4a01b58df03dd5f65c1e3cb70c50fa8ce5762b582b3f499ec30ee5ce1fd9380 + languageName: node + linkType: hard + +"@openzeppelin/contracts-upgradeable@npm:^5.0.2": + version: 5.0.2 + resolution: "@openzeppelin/contracts-upgradeable@npm:5.0.2" + peerDependencies: + "@openzeppelin/contracts": 5.0.2 + checksum: 7d1dbd6bcb45fb6fccf2dc51253afd044b9f77b01d34e11f7cf4c3e17c860df31ddc2c831be7ac463e2955eaea9620cec1c38cdffed7fcf235eb1fdc7ceb3716 + languageName: node + linkType: hard + +"@openzeppelin/contracts@npm:^5.0.0, @openzeppelin/contracts@npm:^5.0.2": + version: 5.0.2 + resolution: "@openzeppelin/contracts@npm:5.0.2" + checksum: 0cce6fc284bd1d89e2a447027832a62f1356b44ee31088899453e10349a63a62df2f07da63d76e4c41aad9c86b96b650b2b6fc85439ef276850dda1170a047fd + languageName: node + linkType: hard + +"@parcel/watcher-android-arm64@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-android-arm64@npm:2.4.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-arm64@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-darwin-arm64@npm:2.4.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-x64@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-darwin-x64@npm:2.4.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-freebsd-x64@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-freebsd-x64@npm:2.4.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm-glibc@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-linux-arm-glibc@npm:2.4.1" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-glibc@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.4.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-musl@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-linux-arm64-musl@npm:2.4.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-glibc@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-linux-x64-glibc@npm:2.4.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-musl@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-linux-x64-musl@npm:2.4.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-wasm@npm:^2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-wasm@npm:2.4.1" + dependencies: + is-glob: ^4.0.3 + micromatch: ^4.0.5 + napi-wasm: ^1.1.0 + checksum: 8ac9585b5aac43d7125ea326482b733fbe4564ed68846624647a93899885290a5a3e26c71d16adfc43dec98a69ee73256aa714f53b430be1ef501b6c69973b2e + languageName: node + linkType: hard + +"@parcel/watcher-win32-arm64@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-win32-arm64@npm:2.4.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-win32-ia32@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-win32-ia32@npm:2.4.1" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@parcel/watcher-win32-x64@npm:2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-win32-x64@npm:2.4.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher@npm:^2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher@npm:2.4.1" + dependencies: + "@parcel/watcher-android-arm64": 2.4.1 + "@parcel/watcher-darwin-arm64": 2.4.1 + "@parcel/watcher-darwin-x64": 2.4.1 + "@parcel/watcher-freebsd-x64": 2.4.1 + "@parcel/watcher-linux-arm-glibc": 2.4.1 + "@parcel/watcher-linux-arm64-glibc": 2.4.1 + "@parcel/watcher-linux-arm64-musl": 2.4.1 + "@parcel/watcher-linux-x64-glibc": 2.4.1 + "@parcel/watcher-linux-x64-musl": 2.4.1 + "@parcel/watcher-win32-arm64": 2.4.1 + "@parcel/watcher-win32-ia32": 2.4.1 + "@parcel/watcher-win32-x64": 2.4.1 + detect-libc: ^1.0.3 + is-glob: ^4.0.3 + micromatch: ^4.0.5 + node-addon-api: ^7.0.0 + node-gyp: latest + dependenciesMeta: + "@parcel/watcher-android-arm64": + optional: true + "@parcel/watcher-darwin-arm64": + optional: true + "@parcel/watcher-darwin-x64": + optional: true + "@parcel/watcher-freebsd-x64": + optional: true + "@parcel/watcher-linux-arm-glibc": + optional: true + "@parcel/watcher-linux-arm64-glibc": + optional: true + "@parcel/watcher-linux-arm64-musl": + optional: true + "@parcel/watcher-linux-x64-glibc": + optional: true + "@parcel/watcher-linux-x64-musl": + optional: true + "@parcel/watcher-win32-arm64": + optional: true + "@parcel/watcher-win32-ia32": + optional: true + "@parcel/watcher-win32-x64": + optional: true + checksum: 4da70551da27e565c726b0bbd5ba5afcb2bca36dfd8619a649f0eaa41f693ddd1d630c36e53bc083895d71a3e28bc4199013e557cd13c7af6ccccab28ceecbff + languageName: node + linkType: hard + +"@pkgr/utils@npm:^2.3.1": + version: 2.3.1 + resolution: "@pkgr/utils@npm:2.3.1" + dependencies: + cross-spawn: ^7.0.3 + is-glob: ^4.0.3 + open: ^8.4.0 + picocolors: ^1.0.0 + tiny-glob: ^0.2.9 + tslib: ^2.4.0 + checksum: 118a1971120253740121a1db0a6658c21195b7da962acf9c124b507a3df707cfc97b0b84a16edcbd4352853b182e8337da9fc6e8e3d06c60d75ae4fb42321c75 + languageName: node + linkType: hard + +"@prb/math@npm:^4.0.2": + version: 4.0.2 + resolution: "@prb/math@npm:4.0.2" + checksum: a55126d03c8a9be8d5b9a0274de40b80018b3bdf877e249f891e04c555983b30fa948e42b9846594387bcc271967368e85f2434fd39de1bac17bf3bf7d3eb0ab + languageName: node + linkType: hard + +"@prb/test@npm:^0.6.4": + version: 0.6.5 + resolution: "@prb/test@npm:0.6.5" + checksum: 790366f5b2b4936ee1faee1c1c4867732e85dc30f99bb0cf5150bf79a42e9d02247ec11da52d689ffda0d9c57cf0ae81452c4650a0c43af27615eb9148dd64d3 + languageName: node + linkType: hard + +"@river-build/dlog@workspace:^, @river-build/dlog@workspace:core/dlog": + version: 0.0.0-use.local + resolution: "@river-build/dlog@workspace:core/dlog" + dependencies: + "@bufbuild/protobuf": ^1.4.1 + "@river-build/proto": "workspace:^" + "@types/jest": ^29.5.3 + "@typescript-eslint/eslint-plugin": ^6.10.0 + "@typescript-eslint/parser": ^6.10.0 + browser-or-node: ^2.1.1 + debug: ^4.3.4 + eslint: ^8.53.0 + eslint-import-resolver-typescript: ^3.5.5 + eslint-plugin-import: ^2.27.5 + eslint-plugin-jest: ^27.2.3 + ethereum-cryptography: ^1.2.0 + jest: ^29.6.2 + jest-extended: ^4.0.1 + ts-jest: ^29.1.1 + ts-node: ^10.9.1 + typescript: ^5.1.6 + languageName: unknown + linkType: soft + +"@river-build/encryption@workspace:^, @river-build/encryption@workspace:core/encryption": + version: 0.0.0-use.local + resolution: "@river-build/encryption@workspace:core/encryption" + dependencies: + "@bufbuild/protobuf": ^1.4.1 + "@ethereumjs/util": ^8.0.1 + "@matrix-org/olm": ^3.2.15 + "@river-build/dlog": "workspace:^" + "@river-build/proto": "workspace:^" + "@river-build/web3": "workspace:^" + "@types/jest": ^29.5.3 + "@types/lodash": ^4.14.186 + "@types/node": ^20.5.0 + "@typescript-eslint/eslint-plugin": ^6.10.0 + "@typescript-eslint/parser": ^6.10.0 + debug: ^4.3.4 + dexie: ^3.2.4 + eslint: ^8.53.0 + eslint-import-resolver-typescript: ^3.5.5 + eslint-plugin-import: ^2.27.5 + eslint-plugin-jest: ^27.2.3 + ethers: ^5.7.2 + fake-indexeddb: ^4.0.1 + jest: ^29.6.2 + jest-extended: ^4.0.1 + nanoid: ^4.0.0 + ts-jest: ^29.1.1 + ts-node: ^10.9.1 + typed-emitter: ^2.1.0 + typescript: ^5.1.6 + languageName: unknown + linkType: soft + +"@river-build/generated@workspace:^, @river-build/generated@workspace:packages/generated": + version: 0.0.0-use.local + resolution: "@river-build/generated@workspace:packages/generated" + languageName: unknown + linkType: soft + +"@river-build/proto@workspace:^, @river-build/proto@workspace:core/proto": + version: 0.0.0-use.local + resolution: "@river-build/proto@workspace:core/proto" + dependencies: + "@bufbuild/buf": ^1.27.2 + "@bufbuild/protobuf": ^1.4.1 + "@bufbuild/protoc-gen-es": ^1.4.1 + "@connectrpc/connect": ^1.3.0 + "@connectrpc/connect-web": ^1.3.0 + "@connectrpc/protoc-gen-connect-es": ^1.1.2 + "@types/jest": ^29.5.3 + jest: ^29.6.2 + jest-extended: ^4.0.1 + lodash.debounce: ^4.0.8 + ts-jest: ^29.1.1 + ts-node: ^10.9.1 + typescript: ^5.1.6 + languageName: unknown + linkType: soft + +"@river-build/stress@workspace:core/stress": + version: 0.0.0-use.local + resolution: "@river-build/stress@workspace:core/stress" + dependencies: + "@babel/node": ^7.23.9 + "@bufbuild/protobuf": ^1.4.1 + "@jest/globals": ^29.6.2 + "@river-build/dlog": "workspace:^" + "@river-build/encryption": "workspace:^" + "@river-build/proto": "workspace:^" + "@river-build/web3": "workspace:^" + "@river/sdk": "workspace:^" + "@testing-library/jest-dom": ^5.16.5 + "@testing-library/react": ^14.0.0 + "@types/debug": ^4.1.8 + "@types/jest": ^29.5.3 + "@types/lodash": ^4.14.186 + "@types/node": ^20.5.0 + "@typescript-eslint/eslint-plugin": ^6.10.0 + "@typescript-eslint/parser": ^6.10.0 + eslint: ^8.53.0 + eslint-import-resolver-typescript: ^3.5.5 + eslint-plugin-import: ^2.27.5 + eslint-plugin-jest: ^27.2.3 + ethers: ^5.7.2 + fake-indexeddb: ^4.0.1 + ioredis: ^5.3.2 + jest: ^29.6.2 + jest-environment-jsdom: ^29.6.2 + jest-extended: ^4.0.1 + jest-mock-extended: ^3.0.4 + jest-runner-groups: ^2.2.0 + msgpackr: ^1.10.1 + ts-jest: ^29.1.1 + ts-node: ^10.9.1 + typed-emitter: ^2.1.0 + typescript: ^5.1.6 + languageName: unknown + linkType: soft + +"@river-build/web3@workspace:^, @river-build/web3@workspace:core/web3": + version: 0.0.0-use.local + resolution: "@river-build/web3@workspace:core/web3" + dependencies: + "@river-build/dlog": "workspace:^" + "@river-build/generated": "workspace:^" + "@types/jest": ^29.5.3 + "@types/lodash": ^4.14.186 + "@types/node": ^20.5.0 + "@typescript-eslint/eslint-plugin": ^6.10.0 + "@typescript-eslint/parser": ^6.10.0 + abitype: ^0.9.10 + debug: ^4.3.4 + eslint: ^8.53.0 + eslint-import-resolver-typescript: ^3.5.5 + eslint-plugin-import: ^2.27.5 + eslint-plugin-jest: ^27.2.3 + ethers: ^5.7.2 + jest: ^29.6.2 + jest-extended: ^4.0.1 + lodash: ^4.17.21 + nanoid: ^4.0.0 + ts-jest: ^29.1.1 + ts-node: ^10.9.1 + typed-emitter: ^2.1.0 + typescript: ^5.1.6 + viem: ^1.18.2 + zod: ^3.21.4 + languageName: unknown + linkType: soft + +"@river/contracts@workspace:contracts": + version: 0.0.0-use.local + resolution: "@river/contracts@workspace:contracts" + dependencies: + "@openzeppelin/contracts": ^5.0.2 + "@openzeppelin/contracts-upgradeable": ^5.0.2 + "@prb/math": ^4.0.2 + "@prb/test": ^0.6.4 + account-abstraction: "github:eth-infinitism/account-abstraction" + base64: "github:Brechtpd/base64" + ds-test: "github:dapphub/ds-test" + forge-std: "github:foundry-rs/forge-std#v1" + prettier: ^2.8.8 + prettier-plugin-solidity: ^1.1.3 + solhint: ^3.4.1 + solhint-plugin-prettier: ^0.0.5 + languageName: unknown + linkType: soft + +"@river/debug-app@workspace:core/debug-app": + version: 0.0.0-use.local + resolution: "@river/debug-app@workspace:core/debug-app" + dependencies: + "@river/sdk": "workspace:^" + "@vanilla-extract/vite-plugin": ^4.0.4 + "@vitejs/plugin-react": ^4.2.1 + rollup-plugin-polyfill-node: ^0.12.0 + rollup-plugin-visualizer: ^5.12.0 + ts-node: ^10.9.1 + typescript: ^5.1.6 + vite: ^5.0.10 + vite-plugin-checker: ^0.6.4 + vite-tsconfig-paths: ^4.3.1 + languageName: unknown + linkType: soft + +"@river/sdk@workspace:^, @river/sdk@workspace:core/sdk": + version: 0.0.0-use.local + resolution: "@river/sdk@workspace:core/sdk" + dependencies: + "@bufbuild/protobuf": ^1.4.1 + "@connectrpc/connect": ^1.3.0 + "@connectrpc/connect-web": ^1.3.0 + "@datadog/browser-rum": ^5.8.0 + "@ethereumjs/util": ^8.0.1 + "@jest/globals": ^29.6.2 + "@river-build/dlog": "workspace:^" + "@river-build/encryption": "workspace:^" + "@river-build/proto": "workspace:^" + "@river-build/web3": "workspace:^" + "@testing-library/jest-dom": ^5.16.5 + "@testing-library/react": ^14.0.0 + "@types/debug": ^4.1.8 + "@types/jest": ^29.5.3 + "@types/lodash": ^4.14.186 + "@types/node": ^20.5.0 + "@types/seedrandom": ^3.0.4 + "@typescript-eslint/eslint-plugin": ^6.10.0 + "@typescript-eslint/parser": ^6.10.0 + axios: ^1.2.6 + browser-or-node: ^2.1.1 + bullmq: ^4.10.0 + debug: ^4.3.4 + dexie: ^3.2.4 + eslint: ^8.53.0 + eslint-import-resolver-typescript: ^3.5.5 + eslint-plugin-import: ^2.27.5 + eslint-plugin-jest: ^27.2.3 + ethereum-cryptography: ^1.2.0 + ethers: ^5.7.2 + fake-indexeddb: ^4.0.1 + ioredis: ^5.3.2 + jest: ^29.6.2 + jest-environment-jsdom: ^29.6.2 + jest-extended: ^4.0.1 + jest-mock-extended: ^3.0.4 + jest-runner-groups: ^2.2.0 + lodash: ^4.17.21 + msgpackr: ^1.10.1 + nanoid: ^4.0.0 + p-limit: ^5.0.0 + seedrandom: ^3.0.5 + supports-color: ^9.2.3 + ts-jest: ^29.1.1 + ts-node: ^10.9.1 + typed-emitter: ^2.1.0 + typescript: ^5.1.6 + wagmi: ^1.4.12 + languageName: unknown + linkType: soft + +"@rollup/plugin-inject@npm:^5.0.1": + version: 5.0.5 + resolution: "@rollup/plugin-inject@npm:5.0.5" + dependencies: + "@rollup/pluginutils": ^5.0.1 + estree-walker: ^2.0.2 + magic-string: ^0.30.3 + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 22cb772fd6f7178308b2ece95cdde5f8615f6257197832166294552a7e4c0d3976dc996cbfa6470af3151d8b86c00091aa93da5f4db6ec563f11b6db29fd1b63 + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^5.0.1": + version: 5.1.0 + resolution: "@rollup/pluginutils@npm:5.1.0" + dependencies: + "@types/estree": ^1.0.0 + estree-walker: ^2.0.2 + picomatch: ^2.3.1 + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 3cc5a6d91452a6eabbfd1ae79b4dd1f1e809d2eecda6e175deb784e75b0911f47e9ecce73f8dd315d6a8b3f362582c91d3c0f66908b6ced69345b3cbe28f8ce8 + languageName: node + linkType: hard + +"@rollup/rollup-android-arm-eabi@npm:4.3.0": + version: 4.3.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.3.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.3.0": + version: 4.3.0 + resolution: "@rollup/rollup-android-arm64@npm:4.3.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.3.0": + version: 4.3.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.3.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.3.0": + version: 4.3.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.3.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.3.0": + version: 4.3.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.3.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.3.0": + version: 4.3.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.3.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.3.0": + version: 4.3.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.3.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.3.0": + version: 4.3.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.3.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.3.0": + version: 4.3.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.3.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.3.0": + version: 4.3.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.3.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.3.0": + version: 4.3.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.3.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.3.0": + version: 4.3.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.3.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@safe-global/safe-apps-provider@npm:^0.18.1": + version: 0.18.2 + resolution: "@safe-global/safe-apps-provider@npm:0.18.2" + dependencies: + "@safe-global/safe-apps-sdk": ^9.0.0 + events: ^3.3.0 + checksum: 36fa3ab829328655053e84a3be394f2cf39c363b79034ff028306ae24badc7f707423dd0af39e4076b549c5ed8088cbe2c8aca3c23d373041400dcf0b13101c8 + languageName: node + linkType: hard + +"@safe-global/safe-apps-sdk@npm:^8.1.0": + version: 8.1.0 + resolution: "@safe-global/safe-apps-sdk@npm:8.1.0" + dependencies: + "@safe-global/safe-gateway-typescript-sdk": ^3.5.3 + viem: ^1.0.0 + checksum: e9d31ed6d9cd2cd9ed71ef5a0e1f6ecfca9f0c62acb9b86a0ddb1b65a609090f2297c4304591ac0518b266a1bcc88d1dad31b0d05e50c7732accccb65adab754 + languageName: node + linkType: hard + +"@safe-global/safe-apps-sdk@npm:^9.0.0": + version: 9.0.0 + resolution: "@safe-global/safe-apps-sdk@npm:9.0.0" + dependencies: + "@safe-global/safe-gateway-typescript-sdk": ^3.5.3 + viem: ^1.6.0 + checksum: 91d233d39d60574550a0455dc55e8cc58eb8b2324bf522e87ab0ed8b08eee702f60f71310790d0a892c5ad9cfc054ef5c7a05ef52f84ba2ecec7a1dcab689f7c + languageName: node + linkType: hard + +"@safe-global/safe-gateway-typescript-sdk@npm:^3.5.3": + version: 3.18.0 + resolution: "@safe-global/safe-gateway-typescript-sdk@npm:3.18.0" + checksum: f94e835ac06628c3e2d6ea326c1594dbf2bd83f0dfc69c487682f06625862454076dd7ea7834b1e86b5e6cb303537ace40b96756b7544777fb3cd635c0b9c516 + languageName: node + linkType: hard + +"@scure/base@npm:^1.1.3, @scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2": + version: 1.1.5 + resolution: "@scure/base@npm:1.1.5" + checksum: 9e9ee6088cb3aa0fb91f5a48497d26682c7829df3019b1251d088d166d7a8c0f941c68aaa8e7b96bbad20c71eb210397cb1099062cde3e29d4bad6b975c18519 + languageName: node + linkType: hard + +"@scure/bip32@npm:1.1.5": + version: 1.1.5 + resolution: "@scure/bip32@npm:1.1.5" + dependencies: + "@noble/hashes": ~1.2.0 + "@noble/secp256k1": ~1.7.0 + "@scure/base": ~1.1.0 + checksum: b08494ab0d2b1efee7226d1b5100db5157ebea22a78bb87126982a76a186cb3048413e8be0ba2622d00d048a20acbba527af730de86c132a77de616eb9907a3b + languageName: node + linkType: hard + +"@scure/bip32@npm:1.3.1": + version: 1.3.1 + resolution: "@scure/bip32@npm:1.3.1" + dependencies: + "@noble/curves": ~1.1.0 + "@noble/hashes": ~1.3.1 + "@scure/base": ~1.1.0 + checksum: 394d65f77a40651eba21a5096da0f4233c3b50d422864751d373fcf142eeedb94a1149f9ab1dbb078086dab2d0bc27e2b1afec8321bf22d4403c7df2fea5bfe2 + languageName: node + linkType: hard + +"@scure/bip32@npm:1.3.2": + version: 1.3.2 + resolution: "@scure/bip32@npm:1.3.2" + dependencies: + "@noble/curves": ~1.2.0 + "@noble/hashes": ~1.3.2 + "@scure/base": ~1.1.2 + checksum: c5ae84fae43490853693b481531132b89e056d45c945fc8b92b9d032577f753dfd79c5a7bbcbf0a7f035951006ff0311b6cf7a389e26c9ec6335e42b20c53157 + languageName: node + linkType: hard + +"@scure/bip39@npm:1.1.1": + version: 1.1.1 + resolution: "@scure/bip39@npm:1.1.1" + dependencies: + "@noble/hashes": ~1.2.0 + "@scure/base": ~1.1.0 + checksum: fbb594c50696fa9c14e891d872f382e50a3f919b6c96c55ef2fb10c7102c546dafb8f099a62bd114c12a00525b595dcf7381846f383f0ddcedeaa6e210747d2f + languageName: node + linkType: hard + +"@scure/bip39@npm:1.2.1": + version: 1.2.1 + resolution: "@scure/bip39@npm:1.2.1" + dependencies: + "@noble/hashes": ~1.3.0 + "@scure/base": ~1.1.0 + checksum: c5bd6f1328fdbeae2dcdd891825b1610225310e5e62a4942714db51066866e4f7bef242c7b06a1b9dcc8043a4a13412cf5c5df76d3b10aa9e36b82e9b6e3eeaa + languageName: node + linkType: hard + +"@sideway/address@npm:^4.1.3": + version: 4.1.4 + resolution: "@sideway/address@npm:4.1.4" + dependencies: + "@hapi/hoek": ^9.0.0 + checksum: b9fca2a93ac2c975ba12e0a6d97853832fb1f4fb02393015e012b47fa916a75ca95102d77214b2a29a2784740df2407951af8c5dde054824c65577fd293c4cdb + languageName: node + linkType: hard + +"@sideway/formula@npm:^3.0.1": + version: 3.0.1 + resolution: "@sideway/formula@npm:3.0.1" + checksum: e4beeebc9dbe2ff4ef0def15cec0165e00d1612e3d7cea0bc9ce5175c3263fc2c818b679bd558957f49400ee7be9d4e5ac90487e1625b4932e15c4aa7919c57a + languageName: node + linkType: hard + +"@sideway/pinpoint@npm:^2.0.0": + version: 2.0.0 + resolution: "@sideway/pinpoint@npm:2.0.0" + checksum: 0f4491e5897fcf5bf02c46f5c359c56a314e90ba243f42f0c100437935daa2488f20482f0f77186bd6bf43345095a95d8143ecf8b1f4d876a7bc0806aba9c3d2 + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: 00bd7362a3439021aa1ea51b0e0d0a0e8ca1351a3d54c606b115fdcc49b51b16db6e5f43b4fe7a28c38688523e22a94d49dd31168868b655f0d4d50f032d07a1 + languageName: node + linkType: hard + +"@sinonjs/commons@npm:^2.0.0": + version: 2.0.0 + resolution: "@sinonjs/commons@npm:2.0.0" + dependencies: + type-detect: 4.0.8 + checksum: 5023ba17edf2b85ed58262313b8e9b59e23c6860681a9af0200f239fe939e2b79736d04a260e8270ddd57196851dde3ba754d7230be5c5234e777ae2ca8af137 + languageName: node + linkType: hard + +"@sinonjs/fake-timers@npm:^10.0.2": + version: 10.0.2 + resolution: "@sinonjs/fake-timers@npm:10.0.2" + dependencies: + "@sinonjs/commons": ^2.0.0 + checksum: c62aa98e7cefda8dedc101ce227abc888dc46b8ff9706c5f0a8dfd9c3ada97d0a5611384738d9ba0b26b59f99c2ba24efece8e779bb08329e9e87358fa309824 + languageName: node + linkType: hard + +"@solidity-parser/parser@npm:^0.16.0": + version: 0.16.1 + resolution: "@solidity-parser/parser@npm:0.16.1" + dependencies: + antlr4ts: ^0.5.0-alpha.4 + checksum: d9e2f7042434fb850a97a2c3679f5fbf4997c7845278d0a436b3de30169e6758fe3818191694ece36dc39a40f55ae0384c4ae0ae912790b5b0806728a50466c2 + languageName: node + linkType: hard + +"@solidity-parser/parser@npm:^0.18.0": + version: 0.18.0 + resolution: "@solidity-parser/parser@npm:0.18.0" + checksum: 970d991529d632862fa88e107531339d84df35bf0374e31e8215ce301b19a01ede33fccf4d374402649814263f8bc278a8e6d62a0129bb877539fbdd16a604cc + languageName: node + linkType: hard + +"@stablelib/aead@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/aead@npm:1.0.1" + checksum: 1a6f68d138f105d17dd65349751515bd252ab0498c77255b8555478d28415600dde493f909eb718245047a993f838dfae546071e1687566ffb7b8c3e10c918d9 + languageName: node + linkType: hard + +"@stablelib/binary@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/binary@npm:1.0.1" + dependencies: + "@stablelib/int": ^1.0.1 + checksum: dca9b98eb1f56a4002b5b9e7351fbc49f3d8616af87007c01e833bd763ac89214eb5f3b7e18673c91ce59d4a0e4856a2eb661ace33d39f17fb1ad267271fccd8 + languageName: node + linkType: hard + +"@stablelib/bytes@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/bytes@npm:1.0.1" + checksum: 456267e08c3384abcb71d3ad3e97a6f99185ad754bac016f501ebea4e4886f37900589143b57e33bdbbf513a92fc89368c15dd4517e0540d0bdc79ecdf9dd087 + languageName: node + linkType: hard + +"@stablelib/chacha20poly1305@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/chacha20poly1305@npm:1.0.1" + dependencies: + "@stablelib/aead": ^1.0.1 + "@stablelib/binary": ^1.0.1 + "@stablelib/chacha": ^1.0.1 + "@stablelib/constant-time": ^1.0.1 + "@stablelib/poly1305": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: 81f1a32330838d31e4dc3144d76eba7244b56d9ea38c1f604f2c34d93ed8e67e9a6167d2cfd72254c13cc46dfc1f5ce5157b37939a575295d69d9144abb4e4fb + languageName: node + linkType: hard + +"@stablelib/chacha@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/chacha@npm:1.0.1" + dependencies: + "@stablelib/binary": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: f061f36c4ca4bf177dd7cac11e7c65ced164f141b6065885141ae5a55f32e16ba0209aefcdcc966aef013f1da616ce901a3a80653b4b6f833cf7e3397ae2d6bd + languageName: node + linkType: hard + +"@stablelib/constant-time@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/constant-time@npm:1.0.1" + checksum: dba4f4bf508de2ff15f7f0cbd875e70391aa3ba3698290fe1ed2feb151c243ba08a90fc6fb390ec2230e30fcc622318c591a7c0e35dcb8150afb50c797eac3d7 + languageName: node + linkType: hard + +"@stablelib/ed25519@npm:^1.0.2": + version: 1.0.3 + resolution: "@stablelib/ed25519@npm:1.0.3" + dependencies: + "@stablelib/random": ^1.0.2 + "@stablelib/sha512": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: e18279de078edac67396ba07dbb862dce0fe89efa8141c21a5b04108a29914bd51636019522323ca5097ec596a90b3028ed64e88ee009b0ac7de7c1ab6499ccb + languageName: node + linkType: hard + +"@stablelib/hash@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/hash@npm:1.0.1" + checksum: 3ff1f12d1a4082aaf4b6cdf40c2010aabe5c4209d3b40b97b5bbb0d9abc0ee94abdc545e57de0614afaea807ca0212ac870e247ec8f66cdce91ec39ce82948cf + languageName: node + linkType: hard + +"@stablelib/hkdf@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/hkdf@npm:1.0.1" + dependencies: + "@stablelib/hash": ^1.0.1 + "@stablelib/hmac": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: 9d45e303715a1835c8612b78e6c1b9d2b7463699b484241d8681fb5c17e0f2bbde5ce211c882134b64616a402e09177baeba80426995ff227b3654a155ab225d + languageName: node + linkType: hard + +"@stablelib/hmac@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/hmac@npm:1.0.1" + dependencies: + "@stablelib/constant-time": ^1.0.1 + "@stablelib/hash": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: e3b93f7144a5846a6e30213278f7570de6d3f9d09131b95ce76d5c5c8bf37bf5d1830f2ee8d847555707271dbfd6e2461221719fd4d8b27ff06b9dd689c0ec21 + languageName: node + linkType: hard + +"@stablelib/int@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/int@npm:1.0.1" + checksum: 65bfbf50a382eea70c68e05366bf379cfceff8fbc076f1c267ef2f2411d7aed64fd140c415cb6c29f19a3910d3b8b7805d4b32ad5721a5007a8e744a808c7ae3 + languageName: node + linkType: hard + +"@stablelib/keyagreement@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/keyagreement@npm:1.0.1" + dependencies: + "@stablelib/bytes": ^1.0.1 + checksum: 3c8ec904dd50f72f3162f5447a0fa8f1d9ca6e24cd272d3dbe84971267f3b47f9bd5dc4e4eeedf3fbac2fe01f2d9277053e57c8e60db8c5544bfb35c62d290dd + languageName: node + linkType: hard + +"@stablelib/poly1305@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/poly1305@npm:1.0.1" + dependencies: + "@stablelib/constant-time": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: 70b845bb0481c66b7ba3f3865d01e4c67a4dffc9616fc6de1d23efc5e828ec09de25f8e3be4e1f15a23b8e87e3036ee3d949c2fd4785047e6f7028bbec0ead18 + languageName: node + linkType: hard + +"@stablelib/random@npm:^1.0.1, @stablelib/random@npm:^1.0.2": + version: 1.0.2 + resolution: "@stablelib/random@npm:1.0.2" + dependencies: + "@stablelib/binary": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: f5ace0a588dc4c21f01cb85837892d4c872e994ae77a58a8eb7dd61aa0b26fb1e9b46b0445e71af57d963ef7d9f5965c64258fc0d04df7b2947bc48f2d3560c5 + languageName: node + linkType: hard + +"@stablelib/sha256@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/sha256@npm:1.0.1" + dependencies: + "@stablelib/binary": ^1.0.1 + "@stablelib/hash": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: 38669871e1bda72eb537629ebceac1c72da8890273a9fbe088f81f6d14c1ec04e78be8c5b455380a06c67f8e62b2508e11e9063fcc257dbaa1b5c27ac756ba77 + languageName: node + linkType: hard + +"@stablelib/sha512@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/sha512@npm:1.0.1" + dependencies: + "@stablelib/binary": ^1.0.1 + "@stablelib/hash": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: b7c82f7608a35948a2147a534c0c9afc80deab3fd5f72a2e27b2454e7c0c6944d39381be3abcb1b7fac5b824ba030ae3e98209d517a579c143d8ed63930b042f + languageName: node + linkType: hard + +"@stablelib/wipe@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/wipe@npm:1.0.1" + checksum: 287802eb146810a46ba72af70b82022caf83a8aeebde23605f5ee0decf64fe2b97a60c856e43b6617b5801287c30cfa863cfb0469e7fcde6f02d143cf0c6cbf4 + languageName: node + linkType: hard + +"@stablelib/x25519@npm:^1.0.3": + version: 1.0.3 + resolution: "@stablelib/x25519@npm:1.0.3" + dependencies: + "@stablelib/keyagreement": ^1.0.1 + "@stablelib/random": ^1.0.2 + "@stablelib/wipe": ^1.0.1 + checksum: f8537066b542b6770c1b5b2ae5ad0688d1b986e4bf818067c152c123a5471531987bbf024224f75f387f481ccc5b628e391e49e92102b8b1a3e2d449d6105402 + languageName: node + linkType: hard + +"@tanstack/query-core@npm:4.36.1": + version: 4.36.1 + resolution: "@tanstack/query-core@npm:4.36.1" + checksum: 47672094da20d89402d9fe03bb7b0462be73a76ff9ca715169738bc600a719d064d106d083a8eedae22a2c22de22f87d5eb5d31ef447aba771d9190f2117ed10 + languageName: node + linkType: hard + +"@tanstack/query-persist-client-core@npm:4.36.1": + version: 4.36.1 + resolution: "@tanstack/query-persist-client-core@npm:4.36.1" + dependencies: + "@tanstack/query-core": 4.36.1 + checksum: f67eab79cb6d9581716d1532c490d00452d8e2c5438874599fdd2d8d930445137ed9afa8199a569452bf3d5ec581c223750d5777b63b65cbc1baf5bdf6fe3322 + languageName: node + linkType: hard + +"@tanstack/query-sync-storage-persister@npm:^4.27.1": + version: 4.36.1 + resolution: "@tanstack/query-sync-storage-persister@npm:4.36.1" + dependencies: + "@tanstack/query-persist-client-core": 4.36.1 + checksum: 461467ab13b0434dd4647c1ea8969ed06db6dabf77e3a68d978bbeb78d3d491b242fb7cd13bd37512f787e6ef891113ce208fad6355fa7eb49987c6942ca196b + languageName: node + linkType: hard + +"@tanstack/react-query-persist-client@npm:^4.28.0": + version: 4.36.1 + resolution: "@tanstack/react-query-persist-client@npm:4.36.1" + dependencies: + "@tanstack/query-persist-client-core": 4.36.1 + peerDependencies: + "@tanstack/react-query": ^4.36.1 + checksum: d938449bd8395da0c6ff69c83218c7efe63832f4e588b75f4f0c4f4db8c20194cb1507a1d5d8dd76b193545df3d3c0d5a409c117cc5306847fc02df3d2d16d45 + languageName: node + linkType: hard + +"@tanstack/react-query@npm:^4.28.0": + version: 4.36.1 + resolution: "@tanstack/react-query@npm:4.36.1" + dependencies: + "@tanstack/query-core": 4.36.1 + use-sync-external-store: ^1.2.0 + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: "*" + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + checksum: 1aff0a476859386f8d32253fa0d0bde7b81769a6d4d4d9cbd78778f0f955459a3bdb7ee27a0d2ee7373090f12998b45df80db0b5b313bd0a7a39d36c6e8e51c5 + languageName: node + linkType: hard + +"@testing-library/dom@npm:^9.0.0": + version: 9.3.4 + resolution: "@testing-library/dom@npm:9.3.4" + dependencies: + "@babel/code-frame": ^7.10.4 + "@babel/runtime": ^7.12.5 + "@types/aria-query": ^5.0.1 + aria-query: 5.1.3 + chalk: ^4.1.0 + dom-accessibility-api: ^0.5.9 + lz-string: ^1.5.0 + pretty-format: ^27.0.2 + checksum: dfd6fb0d6c7b4dd716ba3c47309bc9541b4a55772cb61758b4f396b3785efe2dbc75dc63423545c039078c7ffcc5e4b8c67c2db1b6af4799580466036f70026f + languageName: node + linkType: hard + +"@testing-library/jest-dom@npm:^5.16.5": + version: 5.17.0 + resolution: "@testing-library/jest-dom@npm:5.17.0" + dependencies: + "@adobe/css-tools": ^4.0.1 + "@babel/runtime": ^7.9.2 + "@types/testing-library__jest-dom": ^5.9.1 + aria-query: ^5.0.0 + chalk: ^3.0.0 + css.escape: ^1.5.1 + dom-accessibility-api: ^0.5.6 + lodash: ^4.17.15 + redent: ^3.0.0 + checksum: 9f28dbca8b50d7c306aae40c3aa8e06f0e115f740360004bd87d57f95acf7ab4b4f4122a7399a76dbf2bdaaafb15c99cc137fdcb0ae457a92e2de0f3fbf9b03b + languageName: node + linkType: hard + +"@testing-library/react@npm:^14.0.0": + version: 14.2.1 + resolution: "@testing-library/react@npm:14.2.1" + dependencies: + "@babel/runtime": ^7.12.5 + "@testing-library/dom": ^9.0.0 + "@types/react-dom": ^18.0.0 + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 7054ae69a0e06c0777da8105fa08fac7e8dac570476a065285d7b993947acda5c948598764a203ebaac759c161c562d6712f19f5bd08be3f09a07e23baee5426 + languageName: node + linkType: hard + +"@thehubbleproject/bls@npm:^0.5.1": + version: 0.5.1 + resolution: "@thehubbleproject/bls@npm:0.5.1" + dependencies: + ethers: ^5.5.3 + mcl-wasm: ^1.0.0 + checksum: d073fa50debbfd53ae9da4d59793da5f80d18ec212bb972ecf2e3a32d79c1b6fffeee05c1ce659753fbd65340f0b9c071e5d7f04dd93dde07759f7d3c5af8d0f + languageName: node + linkType: hard + +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.9 + resolution: "@tsconfig/node10@npm:1.0.9" + checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.3 + resolution: "@tsconfig/node16@npm:1.0.3" + checksum: 3a8b657dd047495b7ad23437d6afd20297ce90380ff0bdee93fc7d39a900dbd8d9e26e53ff6b465e7967ce2adf0b218782590ce9013285121e6a5928fbd6819f + languageName: node + linkType: hard + +"@typechain/ethers-v5@npm:^10.1.1": + version: 10.2.0 + resolution: "@typechain/ethers-v5@npm:10.2.0" + dependencies: + lodash: ^4.17.15 + ts-essentials: ^7.0.1 + peerDependencies: + "@ethersproject/abi": ^5.0.0 + "@ethersproject/bytes": ^5.0.0 + "@ethersproject/providers": ^5.0.0 + ethers: ^5.1.3 + typechain: ^8.1.1 + typescript: ">=4.3.0" + checksum: 22f7109f22a6e2b459c45aaf5424143b6129455659aa132ab447ed14d24bb68a6b3b4021008244faca743d469208037a7766d3d9c3ab49db42d36f4e382887c4 + languageName: node + linkType: hard + +"@typechain/hardhat@npm:^2.3.0": + version: 2.3.1 + resolution: "@typechain/hardhat@npm:2.3.1" + dependencies: + fs-extra: ^9.1.0 + peerDependencies: + hardhat: ^2.0.10 + lodash: ^4.17.15 + typechain: ^5.1.2 + checksum: f6090b80e3c75e47bb02c9b2c669258e976ccf06502c168b851ad7ca20f53cb554dcb8104bc7ca608f2111baa047ee8e52ce6153eb80450edb9736ba5ebfb12f + languageName: node + linkType: hard + +"@types/aria-query@npm:^5.0.1": + version: 5.0.4 + resolution: "@types/aria-query@npm:5.0.4" + checksum: ad8b87e4ad64255db5f0a73bc2b4da9b146c38a3a8ab4d9306154334e0fc67ae64e76bfa298eebd1e71830591fb15987e5de7111bdb36a2221bdc379e3415fb0 + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.1.14, @types/babel__core@npm:^7.20.5": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" + dependencies: + "@babel/parser": ^7.20.7 + "@babel/types": ^7.20.7 + "@types/babel__generator": "*" + "@types/babel__template": "*" + "@types/babel__traverse": "*" + checksum: a3226f7930b635ee7a5e72c8d51a357e799d19cbf9d445710fa39ab13804f79ab1a54b72ea7d8e504659c7dfc50675db974b526142c754398d7413aa4bc30845 + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.6.4 + resolution: "@types/babel__generator@npm:7.6.4" + dependencies: + "@babel/types": ^7.0.0 + checksum: 20effbbb5f8a3a0211e95959d06ae70c097fb6191011b73b38fe86deebefad8e09ee014605e0fd3cdaedc73d158be555866810e9166e1f09e4cfd880b874dcb0 + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.4.1 + resolution: "@types/babel__template@npm:7.4.1" + dependencies: + "@babel/parser": ^7.1.0 + "@babel/types": ^7.0.0 + checksum: 649fe8b42c2876be1fd28c6ed9b276f78152d5904ec290b6c861d9ef324206e0a5c242e8305c421ac52ecf6358fa7e32ab7a692f55370484825c1df29b1596ee + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": + version: 7.18.3 + resolution: "@types/babel__traverse@npm:7.18.3" + dependencies: + "@babel/types": ^7.3.0 + checksum: d20953338b2f012ab7750932ece0a78e7d1645b0a6ff42d49be90f55e9998085da1374a9786a7da252df89555c6586695ba4d1d4b4e88ab2b9f306bcd35e00d3 + languageName: node + linkType: hard + +"@types/bn.js@npm:^5.1.0": + version: 5.1.5 + resolution: "@types/bn.js@npm:5.1.5" + dependencies: + "@types/node": "*" + checksum: c87b28c4af74545624f8a3dae5294b16aa190c222626e8d4b2e327b33b1a3f1eeb43e7a24d914a9774bca43d8cd6e1cb0325c1f4b3a244af6693a024e1d918e6 + languageName: node + linkType: hard + +"@types/debug@npm:^4.1.12, @types/debug@npm:^4.1.7, @types/debug@npm:^4.1.8": + version: 4.1.12 + resolution: "@types/debug@npm:4.1.12" + dependencies: + "@types/ms": "*" + checksum: 47876a852de8240bfdaf7481357af2b88cb660d30c72e73789abf00c499d6bc7cd5e52f41c915d1b9cd8ec9fef5b05688d7b7aef17f7f272c2d04679508d1053 + languageName: node + linkType: hard + +"@types/estree@npm:^1.0.0": + version: 1.0.5 + resolution: "@types/estree@npm:1.0.5" + checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a + languageName: node + linkType: hard + +"@types/glob@npm:^7.1.1": + version: 7.2.0 + resolution: "@types/glob@npm:7.2.0" + dependencies: + "@types/minimatch": "*" + "@types/node": "*" + checksum: 6ae717fedfdfdad25f3d5a568323926c64f52ef35897bcac8aca8e19bc50c0bd84630bbd063e5d52078b2137d8e7d3c26eabebd1a2f03ff350fff8a91e79fc19 + languageName: node + linkType: hard + +"@types/graceful-fs@npm:^4.1.3": + version: 4.1.6 + resolution: "@types/graceful-fs@npm:4.1.6" + dependencies: + "@types/node": "*" + checksum: c3070ccdc9ca0f40df747bced1c96c71a61992d6f7c767e8fd24bb6a3c2de26e8b84135ede000b7e79db530a23e7e88dcd9db60eee6395d0f4ce1dae91369dd4 + languageName: node + linkType: hard + +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": + version: 2.0.4 + resolution: "@types/istanbul-lib-coverage@npm:2.0.4" + checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7 + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 3.0.0 + resolution: "@types/istanbul-lib-report@npm:3.0.0" + dependencies: + "@types/istanbul-lib-coverage": "*" + checksum: 656398b62dc288e1b5226f8880af98087233cdb90100655c989a09f3052b5775bf98ba58a16c5ae642fb66c61aba402e07a9f2bff1d1569e3b306026c59f3f36 + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^3.0.0": + version: 3.0.1 + resolution: "@types/istanbul-reports@npm:3.0.1" + dependencies: + "@types/istanbul-lib-report": "*" + checksum: f1ad54bc68f37f60b30c7915886b92f86b847033e597f9b34f2415acdbe5ed742fa559a0a40050d74cdba3b6a63c342cac1f3a64dba5b68b66a6941f4abd7903 + languageName: node + linkType: hard + +"@types/jest@npm:*, @types/jest@npm:^29.5.3": + version: 29.5.12 + resolution: "@types/jest@npm:29.5.12" + dependencies: + expect: ^29.0.0 + pretty-format: ^29.0.0 + checksum: 19b1efdeed9d9a60a81edc8226cdeae5af7479e493eaed273e01243891c9651f7b8b4c08fc633a7d0d1d379b091c4179bbaa0807af62542325fd72f2dd17ce1c + languageName: node + linkType: hard + +"@types/jsdom@npm:^20.0.0": + version: 20.0.1 + resolution: "@types/jsdom@npm:20.0.1" + dependencies: + "@types/node": "*" + "@types/tough-cookie": "*" + parse5: ^7.0.0 + checksum: d55402c5256ef451f93a6e3d3881f98339fe73a5ac2030588df056d6835df8367b5a857b48d27528289057e26dcdd3f502edc00cb877c79174cb3a4c7f2198c1 + languageName: node + linkType: hard + +"@types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.9": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 + languageName: node + linkType: hard + +"@types/json5@npm:^0.0.29": + version: 0.0.29 + resolution: "@types/json5@npm:0.0.29" + checksum: e60b153664572116dfea673c5bda7778dbff150498f44f998e34b5886d8afc47f16799280e4b6e241c0472aef1bc36add771c569c68fc5125fc2ae519a3eb9ac + languageName: node + linkType: hard + +"@types/lodash@npm:^4.14.186": + version: 4.14.202 + resolution: "@types/lodash@npm:4.14.202" + checksum: a91acf3564a568c6f199912f3eb2c76c99c5a0d7e219394294213b3f2d54f672619f0fde4da22b29dc5d4c31457cd799acc2e5cb6bd90f9af04a1578483b6ff7 + languageName: node + linkType: hard + +"@types/minimatch@npm:*": + version: 5.1.2 + resolution: "@types/minimatch@npm:5.1.2" + checksum: 0391a282860c7cb6fe262c12b99564732401bdaa5e395bee9ca323c312c1a0f45efbf34dce974682036e857db59a5c9b1da522f3d6055aeead7097264c8705a8 + languageName: node + linkType: hard + +"@types/mocha@npm:^9.0.0": + version: 9.1.1 + resolution: "@types/mocha@npm:9.1.1" + checksum: 516077c0acd9806dc78317f88aaac0df5aaf0bdc2f63dfdadeabdf0b0137953b6ca65472e6ff7c30bc93ce4e0ae76eae70e8d46764b9a8eae4877a928b6ef49a + languageName: node + linkType: hard + +"@types/ms@npm:*": + version: 0.7.31 + resolution: "@types/ms@npm:0.7.31" + checksum: daadd354aedde024cce6f5aa873fefe7b71b22cd0e28632a69e8b677aeb48ae8caa1c60e5919bb781df040d116b01cb4316335167a3fc0ef6a63fa3614c0f6da + languageName: node + linkType: hard + +"@types/node@npm:*, @types/node@npm:^20.2.5, @types/node@npm:^20.5.0": + version: 20.11.24 + resolution: "@types/node@npm:20.11.24" + dependencies: + undici-types: ~5.26.4 + checksum: b11a650e09e254f4725c94f226752b69949a9ac4a5e004e98f109437ac50b02df3ab4d12b2086722fedf2cb62e68b9e723abd3f358a7d7d90d741a0d3bee90c2 + languageName: node + linkType: hard + +"@types/pbkdf2@npm:^3.0.0": + version: 3.1.2 + resolution: "@types/pbkdf2@npm:3.1.2" + dependencies: + "@types/node": "*" + checksum: bebe1e596cbbe5f7d2726a58859e61986c5a42459048e29cb7f2d4d764be6bbb0844572fd5d70ca8955a8a17e8b4ed80984fc4903e165d9efb8807a3fbb051aa + languageName: node + linkType: hard + +"@types/prettier@npm:^2.1.1": + version: 2.7.2 + resolution: "@types/prettier@npm:2.7.2" + checksum: b47d76a5252265f8d25dd2fe2a5a61dc43ba0e6a96ffdd00c594cb4fd74c1982c2e346497e3472805d97915407a09423804cc2110a0b8e1b22cffcab246479b7 + languageName: node + linkType: hard + +"@types/prop-types@npm:*": + version: 15.7.11 + resolution: "@types/prop-types@npm:15.7.11" + checksum: 7519ff11d06fbf6b275029fe03fff9ec377b4cb6e864cac34d87d7146c7f5a7560fd164bdc1d2dbe00b60c43713631251af1fd3d34d46c69cd354602bc0c7c54 + languageName: node + linkType: hard + +"@types/qs@npm:^6.9.7": + version: 6.9.12 + resolution: "@types/qs@npm:6.9.12" + checksum: 76be8068091058987bb49aca59e9714ff856661cdc2340499f9d502c78950ac08e7ecbca256c8a72c4c83714bce30e6aaad13f9f739e8c0c436c0eedb2a2627c + languageName: node + linkType: hard + +"@types/react-dom@npm:^18.0.0": + version: 18.2.19 + resolution: "@types/react-dom@npm:18.2.19" + dependencies: + "@types/react": "*" + checksum: 087a19d8e4c1c0900ec4ac5ddb749a811a38274b25683d233c11755d2895cc6e475e8bf9bea3dee36519769298e078d4c2feab9ab4bd13b26bc2a6170716437e + languageName: node + linkType: hard + +"@types/react@npm:*": + version: 18.2.61 + resolution: "@types/react@npm:18.2.61" + dependencies: + "@types/prop-types": "*" + "@types/scheduler": "*" + csstype: ^3.0.2 + checksum: a100c09bc0d6d1a0a42b3fa0944b71d209b5adea6515fc21109972ec3267185372cc416c0467b1998afce6b90fc80f4c0029b5d975afb0b3070d864c7a924a5e + languageName: node + linkType: hard + +"@types/scheduler@npm:*": + version: 0.16.8 + resolution: "@types/scheduler@npm:0.16.8" + checksum: 6c091b096daa490093bf30dd7947cd28e5b2cd612ec93448432b33f724b162587fed9309a0acc104d97b69b1d49a0f3fc755a62282054d62975d53d7fd13472d + languageName: node + linkType: hard + +"@types/secp256k1@npm:^4.0.1": + version: 4.0.6 + resolution: "@types/secp256k1@npm:4.0.6" + dependencies: + "@types/node": "*" + checksum: 984494caf49a4ce99fda2b9ea1840eb47af946b8c2737314108949bcc0c06b4880e871296bd49ed6ea4c8423e3a302ad79fec43abfc987330e7eb98f0c4e8ba4 + languageName: node + linkType: hard + +"@types/seedrandom@npm:^3.0.4": + version: 3.0.5 + resolution: "@types/seedrandom@npm:3.0.5" + checksum: d63d56ebc609203cf8cbe2ab7e7934237446bc2463ade664be130dcd4a3d74915d529909de2e1b18141cfabc9e42784998b7e5ff30c016919ac5b83911a700f0 + languageName: node + linkType: hard + +"@types/semver@npm:^7.3.12, @types/semver@npm:^7.5.0": + version: 7.5.5 + resolution: "@types/semver@npm:7.5.5" + checksum: 533e6c93d1262d65f449423d94a445f7f3db0672e7429f21b6a1636d6051dbab3a2989ddcda9b79c69bb37830931d09fc958a65305a891357f5cea3257c297f5 + languageName: node + linkType: hard + +"@types/stack-utils@npm:^2.0.0": + version: 2.0.1 + resolution: "@types/stack-utils@npm:2.0.1" + checksum: 205fdbe3326b7046d7eaf5e494d8084f2659086a266f3f9cf00bccc549c8e36e407f88168ad4383c8b07099957ad669f75f2532ed4bc70be2b037330f7bae019 + languageName: node + linkType: hard + +"@types/testing-library__jest-dom@npm:^5.9.1": + version: 5.14.9 + resolution: "@types/testing-library__jest-dom@npm:5.14.9" + dependencies: + "@types/jest": "*" + checksum: d364494fc2545316292e88861146146af1e3818792ca63b62a63758b2f737669b687f4aaddfcfbcb7d0e1ed7890a9bd05de23ff97f277d5e68de574497a9ee72 + languageName: node + linkType: hard + +"@types/tough-cookie@npm:*": + version: 4.0.5 + resolution: "@types/tough-cookie@npm:4.0.5" + checksum: f19409d0190b179331586365912920d192733112a195e870c7f18d20ac8adb7ad0b0ff69dad430dba8bc2be09593453a719cfea92dc3bda19748fd158fe1498d + languageName: node + linkType: hard + +"@types/trusted-types@npm:^2.0.2": + version: 2.0.7 + resolution: "@types/trusted-types@npm:2.0.7" + checksum: 8e4202766a65877efcf5d5a41b7dd458480b36195e580a3b1085ad21e948bc417d55d6f8af1fd2a7ad008015d4117d5fdfe432731157da3c68678487174e4ba3 + languageName: node + linkType: hard + +"@types/yargs-parser@npm:*": + version: 21.0.0 + resolution: "@types/yargs-parser@npm:21.0.0" + checksum: b2f4c8d12ac18a567440379909127cf2cec393daffb73f246d0a25df36ea983b93b7e9e824251f959e9f928cbc7c1aab6728d0a0ff15d6145f66cec2be67d9a2 + languageName: node + linkType: hard + +"@types/yargs@npm:^17.0.8": + version: 17.0.22 + resolution: "@types/yargs@npm:17.0.22" + dependencies: + "@types/yargs-parser": "*" + checksum: 0773523fda71bafdc52f13f5970039e535a353665a60ba9261149a5c9c2b908242e6e77fbb7a8c06931ec78ce889d64d09673c68ba23eb5f5742d5385d0d1982 + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^6.10.0": + version: 6.10.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.10.0" + dependencies: + "@eslint-community/regexpp": ^4.5.1 + "@typescript-eslint/scope-manager": 6.10.0 + "@typescript-eslint/type-utils": 6.10.0 + "@typescript-eslint/utils": 6.10.0 + "@typescript-eslint/visitor-keys": 6.10.0 + debug: ^4.3.4 + graphemer: ^1.4.0 + ignore: ^5.2.4 + natural-compare: ^1.4.0 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: eaf1f66ae1915426dad8d229c8cb80d2b320572a30c3fbc57d560d40edc2d17d004101a2fcbe331bc458df19a00f8b705f2442ee02e028bb595f4e9f9152e99d + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^6.10.0": + version: 6.10.0 + resolution: "@typescript-eslint/parser@npm:6.10.0" + dependencies: + "@typescript-eslint/scope-manager": 6.10.0 + "@typescript-eslint/types": 6.10.0 + "@typescript-eslint/typescript-estree": 6.10.0 + "@typescript-eslint/visitor-keys": 6.10.0 + debug: ^4.3.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: c4b140932d639b3f3eac892497aa700bcc9101ef268285020757dc9bee670d122de107e936320af99a5c06569e4eb93bccf87f14a9970ceab708c432e748423a + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:5.61.0": + version: 5.61.0 + resolution: "@typescript-eslint/scope-manager@npm:5.61.0" + dependencies: + "@typescript-eslint/types": 5.61.0 + "@typescript-eslint/visitor-keys": 5.61.0 + checksum: 6dfbb42c4b7d796ae3c395398bdfd2e5a4ae8aaf1448381278ecc39a1d1045af2cb452da5a00519d265bc1a5997523de22d5021acb4dbe1648502fe61512d3c6 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:6.10.0": + version: 6.10.0 + resolution: "@typescript-eslint/scope-manager@npm:6.10.0" + dependencies: + "@typescript-eslint/types": 6.10.0 + "@typescript-eslint/visitor-keys": 6.10.0 + checksum: c9b9483082ae853f10b888cf04d4a14f666ac55e749bfdb7b7f726fc51127a6340b5e2f50d93f134a8854ddcc41f7b116b214753251a8b033d0d84c600439c54 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:6.10.0": + version: 6.10.0 + resolution: "@typescript-eslint/type-utils@npm:6.10.0" + dependencies: + "@typescript-eslint/typescript-estree": 6.10.0 + "@typescript-eslint/utils": 6.10.0 + debug: ^4.3.4 + ts-api-utils: ^1.0.1 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: cfe9520cf0c0f50b115d2591acb2abf99ffe5789b3536268ca65b624c8498812d91f187e80c41bea7cf2cebad9c38f69ef27440f872a20fb53c59856d8f5df38 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:5.61.0": + version: 5.61.0 + resolution: "@typescript-eslint/types@npm:5.61.0" + checksum: d311ca2141f6bcb5f0f8f97ddbc218c9911e0735aaa30f0f2e64d518fb33568410754e1b04bf157175f8783504f8ec62a7ab53a66a18507f43edb1e21fe69e90 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:6.10.0": + version: 6.10.0 + resolution: "@typescript-eslint/types@npm:6.10.0" + checksum: e63a9e05eb3d736d02a09131627d5cb89394bf0d9d6b46fb4b620be902d89d73554720be65acbc194787bff9ffcd518c9a6cf88fd63e418232b4181e8d8438df + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:5.61.0": + version: 5.61.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.61.0" + dependencies: + "@typescript-eslint/types": 5.61.0 + "@typescript-eslint/visitor-keys": 5.61.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: efe25a1b2774939c02cb9b388cf72efa672811f1c39a87ddd617937f63c2320551ce459ba69c6d022e33322594d40b9f2d2c6bc9937387718adc40dc5e57ea8e + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:6.10.0": + version: 6.10.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.10.0" + dependencies: + "@typescript-eslint/types": 6.10.0 + "@typescript-eslint/visitor-keys": 6.10.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependenciesMeta: + typescript: + optional: true + checksum: 15bd8d9239a557071d6b03e7aa854b769fcc2dbdff587ed94be7ee8060dabdb05bcae4251df22432f625f82087e7f6986e9aab04f7eea35af694d4edd76a21af + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:6.10.0": + version: 6.10.0 + resolution: "@typescript-eslint/utils@npm:6.10.0" + dependencies: + "@eslint-community/eslint-utils": ^4.4.0 + "@types/json-schema": ^7.0.12 + "@types/semver": ^7.5.0 + "@typescript-eslint/scope-manager": 6.10.0 + "@typescript-eslint/types": 6.10.0 + "@typescript-eslint/typescript-estree": 6.10.0 + semver: ^7.5.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: b6bd4d68623fb8d616ae63a88f2954258411a0cc113029fba801d1e74b4c0319fdfbcac0070527afe5cc38c012c8718e4faecd1603000924d7b89e8fefc3f24d + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:^5.10.0": + version: 5.61.0 + resolution: "@typescript-eslint/utils@npm:5.61.0" + dependencies: + "@eslint-community/eslint-utils": ^4.2.0 + "@types/json-schema": ^7.0.9 + "@types/semver": ^7.3.12 + "@typescript-eslint/scope-manager": 5.61.0 + "@typescript-eslint/types": 5.61.0 + "@typescript-eslint/typescript-estree": 5.61.0 + eslint-scope: ^5.1.1 + semver: ^7.3.7 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 24efc1964e6c92db96fe0d9a390550e4f27e8f353e51a9b46bda03e6692ea5d40f398d539235a4ff0894e9e45dfcfb51df953ade2ae9d17a1421449625ce6f5a + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.61.0": + version: 5.61.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.61.0" + dependencies: + "@typescript-eslint/types": 5.61.0 + eslint-visitor-keys: ^3.3.0 + checksum: a8d589f61ddfc380787218da4d347e8f9aef0f82f4a93f1daee46786bda889a90961c7ec1b470db5e3261438a728fdfd956f5bda6ee2de22c4be2d2152d6e270 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:6.10.0": + version: 6.10.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.10.0" + dependencies: + "@typescript-eslint/types": 6.10.0 + eslint-visitor-keys: ^3.4.1 + checksum: 9640bfae41e6109ffba31e68b1720382de0538d021261e2fc9e514c83c703084393c0818ca77ed26b950273e45e593371120281e8d4bbd09cb8c2d46c9fe4f03 + languageName: node + linkType: hard + +"@typescript/vfs@npm:^1.4.0": + version: 1.4.0 + resolution: "@typescript/vfs@npm:1.4.0" + dependencies: + debug: ^4.1.1 + checksum: 67219c9354d142ef8259da172066db043133d8b6cc0a5d862b9867d5950c5f6c9b816e8b29f8901e8cd2572003282fbbec097e53932bc6da01d0fa2e40520014 + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 + languageName: node + linkType: hard + +"@vanilla-extract/babel-plugin-debug-ids@npm:^1.0.5": + version: 1.0.5 + resolution: "@vanilla-extract/babel-plugin-debug-ids@npm:1.0.5" + dependencies: + "@babel/core": ^7.23.9 + checksum: ae03622d2bd1411da6f538fe5092bd2bf4e7327c03d23f2522704f1998cf41f8831b18e635ea292a620b8d73498763eae62d1c8234d4794201c2c7e961e1b2ca + languageName: node + linkType: hard + +"@vanilla-extract/css@npm:^1.14.0": + version: 1.14.1 + resolution: "@vanilla-extract/css@npm:1.14.1" + dependencies: + "@emotion/hash": ^0.9.0 + "@vanilla-extract/private": ^1.0.3 + chalk: ^4.1.1 + css-what: ^6.1.0 + cssesc: ^3.0.0 + csstype: ^3.0.7 + deep-object-diff: ^1.1.9 + deepmerge: ^4.2.2 + media-query-parser: ^2.0.2 + modern-ahocorasick: ^1.0.0 + outdent: ^0.8.0 + checksum: d46afaf16ad0d487fe4ad83f6ca3a08aa0c566fcaa1360d045b30282eab8853005e9bac36c969d27a06185e15832674e5c5de281afe5b3e3dcf8416d137cc819 + languageName: node + linkType: hard + +"@vanilla-extract/integration@npm:^7.1.0": + version: 7.1.1 + resolution: "@vanilla-extract/integration@npm:7.1.1" + dependencies: + "@babel/core": ^7.23.9 + "@babel/plugin-syntax-typescript": ^7.23.3 + "@vanilla-extract/babel-plugin-debug-ids": ^1.0.5 + "@vanilla-extract/css": ^1.14.0 + esbuild: "npm:esbuild@~0.17.6 || ~0.18.0 || ~0.19.0" + eval: 0.1.8 + find-up: ^5.0.0 + javascript-stringify: ^2.0.1 + lodash: ^4.17.21 + mlly: ^1.4.2 + outdent: ^0.8.0 + vite: ^5.0.11 + vite-node: ^1.2.0 + checksum: 3014a6268e183df8ff90d98d6123f74c285d8464d1640398e9c8dd159c4be5e092486df081834609377079ab2007c5dfb6d641c8e98a15feeac91c048e1bde24 + languageName: node + linkType: hard + +"@vanilla-extract/private@npm:^1.0.3": + version: 1.0.3 + resolution: "@vanilla-extract/private@npm:1.0.3" + checksum: 866a71ba6804edeb0735684e7723ba78f5cf0bb40d4fb538fe6bf7d73928099e341312337b2a510ac0ce96ff8a4b39eb7f7a5fad0c842532353dd20e7278f29b + languageName: node + linkType: hard + +"@vanilla-extract/vite-plugin@npm:^4.0.4": + version: 4.0.4 + resolution: "@vanilla-extract/vite-plugin@npm:4.0.4" + dependencies: + "@vanilla-extract/integration": ^7.1.0 + peerDependencies: + vite: ^4.0.3 || ^5.0.0 + checksum: b640f519c4c49fe360db9dd5b116c6de35146030bf1939ae9f35a1de216a12c4edbe24ccc54d4688585d005503e8bdadbb2165388a4e93268318ff602d426e4e + languageName: node + linkType: hard + +"@vitejs/plugin-react@npm:^4.2.1": + version: 4.2.1 + resolution: "@vitejs/plugin-react@npm:4.2.1" + dependencies: + "@babel/core": ^7.23.5 + "@babel/plugin-transform-react-jsx-self": ^7.23.3 + "@babel/plugin-transform-react-jsx-source": ^7.23.3 + "@types/babel__core": ^7.20.5 + react-refresh: ^0.14.0 + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + checksum: 08d227d27ff2304e395e746bd2d4b5fee40587f69d7e2fcd6beb7d91163c1f1dc26d843bc48e2ffb8f38c6b8a1b9445fb07840e3dcc841f97b56bbb8205346aa + languageName: node + linkType: hard + +"@wagmi/connectors@npm:3.1.11": + version: 3.1.11 + resolution: "@wagmi/connectors@npm:3.1.11" + dependencies: + "@coinbase/wallet-sdk": ^3.6.6 + "@safe-global/safe-apps-provider": ^0.18.1 + "@safe-global/safe-apps-sdk": ^8.1.0 + "@walletconnect/ethereum-provider": 2.11.0 + "@walletconnect/legacy-provider": ^2.0.0 + "@walletconnect/modal": 2.6.2 + "@walletconnect/utils": 2.11.0 + abitype: 0.8.7 + eventemitter3: ^4.0.7 + peerDependencies: + typescript: ">=5.0.4" + viem: ">=0.3.35" + peerDependenciesMeta: + typescript: + optional: true + checksum: c198b04751df5e39c37e0a7077f7dcaad7a19b15a71538ee03d5cec066b1c82a3e4b7cc8882b671c49b57066ffd7887dbcad19ed411f98f20e6588455142e9d5 + languageName: node + linkType: hard + +"@wagmi/core@npm:1.4.13": + version: 1.4.13 + resolution: "@wagmi/core@npm:1.4.13" + dependencies: + "@wagmi/connectors": 3.1.11 + abitype: 0.8.7 + eventemitter3: ^4.0.7 + zustand: ^4.3.1 + peerDependencies: + typescript: ">=5.0.4" + viem: ">=0.3.35" + peerDependenciesMeta: + typescript: + optional: true + checksum: e35c5f8ec3ca066cab6affcb551c784e44bcce07742913ebb1285cc58648f5b2cab98d7a014cd6b8cfa1afb2eaa7047523f17d90519982458d2c9b3b6f7e2c9f + languageName: node + linkType: hard + +"@walletconnect/core@npm:2.11.0": + version: 2.11.0 + resolution: "@walletconnect/core@npm:2.11.0" + dependencies: + "@walletconnect/heartbeat": 1.2.1 + "@walletconnect/jsonrpc-provider": 1.0.13 + "@walletconnect/jsonrpc-types": 1.0.3 + "@walletconnect/jsonrpc-utils": 1.0.8 + "@walletconnect/jsonrpc-ws-connection": 1.0.14 + "@walletconnect/keyvaluestorage": ^1.1.1 + "@walletconnect/logger": ^2.0.1 + "@walletconnect/relay-api": ^1.0.9 + "@walletconnect/relay-auth": ^1.0.4 + "@walletconnect/safe-json": ^1.0.2 + "@walletconnect/time": ^1.0.2 + "@walletconnect/types": 2.11.0 + "@walletconnect/utils": 2.11.0 + events: ^3.3.0 + isomorphic-unfetch: 3.1.0 + lodash.isequal: 4.5.0 + uint8arrays: ^3.1.0 + checksum: 419eff78df347eb5d5c51c2dbf60e3246b5dda00afdd77279795a89627285839cb769e1115e751026756d37e26e6bd708452170ded08be074d64256afd8a8663 + languageName: node + linkType: hard + +"@walletconnect/crypto@npm:^1.0.3": + version: 1.0.3 + resolution: "@walletconnect/crypto@npm:1.0.3" + dependencies: + "@walletconnect/encoding": ^1.0.2 + "@walletconnect/environment": ^1.0.1 + "@walletconnect/randombytes": ^1.0.3 + aes-js: ^3.1.2 + hash.js: ^1.1.7 + tslib: 1.14.1 + checksum: 056c80451178d74be6237f24e53eb96951379ad2f556642b4f07231a9cac53512af182dfb58ee359d1d6803231030de747eb17b35a9a25577e20de3ef2d8fdec + languageName: node + linkType: hard + +"@walletconnect/encoding@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/encoding@npm:1.0.2" + dependencies: + is-typedarray: 1.0.0 + tslib: 1.14.1 + typedarray-to-buffer: 3.1.5 + checksum: 648029d6a04e0e3675e1220b87c982e5d69764873e30a45a7c57f18223cd7c13e6758138d4644fd05d8fa03bd438fafb0a0ebc6ae168ed6f4a9bf1f93de1b82f + languageName: node + linkType: hard + +"@walletconnect/environment@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/environment@npm:1.0.1" + dependencies: + tslib: 1.14.1 + checksum: a18731d857bdca73910147e59992cef3c6e292c37ab3d3013307bd706f06cb216aa804f0f48b25a78df6493ad8127e633629f4b50acb4f69d3765d6ac0524f68 + languageName: node + linkType: hard + +"@walletconnect/ethereum-provider@npm:2.11.0": + version: 2.11.0 + resolution: "@walletconnect/ethereum-provider@npm:2.11.0" + dependencies: + "@walletconnect/jsonrpc-http-connection": ^1.0.7 + "@walletconnect/jsonrpc-provider": ^1.0.13 + "@walletconnect/jsonrpc-types": ^1.0.3 + "@walletconnect/jsonrpc-utils": ^1.0.8 + "@walletconnect/modal": ^2.6.2 + "@walletconnect/sign-client": 2.11.0 + "@walletconnect/types": 2.11.0 + "@walletconnect/universal-provider": 2.11.0 + "@walletconnect/utils": 2.11.0 + events: ^3.3.0 + checksum: 8b45eb7e6679d340e6d976c6c10b10b4ce0435b959d35b627677d946b9f152f20fc242e581a16e9b6f7ed98c5352748213856e342f55f3dbd4cd9130965d542c + languageName: node + linkType: hard + +"@walletconnect/events@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/events@npm:1.0.1" + dependencies: + keyvaluestorage-interface: ^1.0.0 + tslib: 1.14.1 + checksum: d28aa4dcc981bdaf38f0aeed979731ca793cead7e7a4ee730a9146d99d89db09a86c8e3192ed860638283276961c0723ba00cf3b8776f0692b36ec7df6c01be4 + languageName: node + linkType: hard + +"@walletconnect/heartbeat@npm:1.2.1": + version: 1.2.1 + resolution: "@walletconnect/heartbeat@npm:1.2.1" + dependencies: + "@walletconnect/events": ^1.0.1 + "@walletconnect/time": ^1.0.2 + tslib: 1.14.1 + checksum: df4d492a2d336283f834bc205c09b795f85cd507a61b14745dc2124e510a250fefbd83d51216f93df2e0aa0cf8120134db2679de8019eddd63877e9928997952 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-http-connection@npm:^1.0.4, @walletconnect/jsonrpc-http-connection@npm:^1.0.7": + version: 1.0.7 + resolution: "@walletconnect/jsonrpc-http-connection@npm:1.0.7" + dependencies: + "@walletconnect/jsonrpc-utils": ^1.0.6 + "@walletconnect/safe-json": ^1.0.1 + cross-fetch: ^3.1.4 + tslib: 1.14.1 + checksum: c4efcd46d4b344727ca6879badca2c2f855499ac76c8dace5d118f4423167adce34e41a99f3dcab0febb945ce51c6ef0ac8556567d5e38d8dad864b131eb5b00 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-provider@npm:1.0.13, @walletconnect/jsonrpc-provider@npm:^1.0.13, @walletconnect/jsonrpc-provider@npm:^1.0.6": + version: 1.0.13 + resolution: "@walletconnect/jsonrpc-provider@npm:1.0.13" + dependencies: + "@walletconnect/jsonrpc-utils": ^1.0.8 + "@walletconnect/safe-json": ^1.0.2 + tslib: 1.14.1 + checksum: 497dfdd9f988432f171bc98336f3583c679059f0a166f95d6e51c8e1937c17abd9a5fd3aadfcebf6964bae14edd1e05fb0453e370d6e3bbc7ff4919fcad7c478 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-types@npm:1.0.3, @walletconnect/jsonrpc-types@npm:^1.0.2, @walletconnect/jsonrpc-types@npm:^1.0.3": + version: 1.0.3 + resolution: "@walletconnect/jsonrpc-types@npm:1.0.3" + dependencies: + keyvaluestorage-interface: ^1.0.0 + tslib: 1.14.1 + checksum: 26e6f1d8f4207328d3df465c36d0d67844772863dc8e9e78e6cfec417cfc359300eab049d99ea558982b3f0948f4ca26b75253bdf635ffd82ffe30a5276b790c + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-utils@npm:1.0.8, @walletconnect/jsonrpc-utils@npm:^1.0.4, @walletconnect/jsonrpc-utils@npm:^1.0.6, @walletconnect/jsonrpc-utils@npm:^1.0.7, @walletconnect/jsonrpc-utils@npm:^1.0.8": + version: 1.0.8 + resolution: "@walletconnect/jsonrpc-utils@npm:1.0.8" + dependencies: + "@walletconnect/environment": ^1.0.1 + "@walletconnect/jsonrpc-types": ^1.0.3 + tslib: 1.14.1 + checksum: f43a85dfce8150c3e3d1f009e8d8241ab8e10b026ea435f0918edf4db6b3a17586ba9d9c54a93cc61e4d3c685611e5bd5954fc377a581af503acd38e6d84c2ef + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-ws-connection@npm:1.0.14": + version: 1.0.14 + resolution: "@walletconnect/jsonrpc-ws-connection@npm:1.0.14" + dependencies: + "@walletconnect/jsonrpc-utils": ^1.0.6 + "@walletconnect/safe-json": ^1.0.2 + events: ^3.3.0 + ws: ^7.5.1 + checksum: a401e60b19390098183ef1b2a7b3e15c4dd3c64f9ac87fd2bbc0ae1f7fb31539ba542374ca021193efc4a2ae59fa3b04e588aed98cdf5c364f50524403d50f9f + languageName: node + linkType: hard + +"@walletconnect/keyvaluestorage@npm:^1.1.1": + version: 1.1.1 + resolution: "@walletconnect/keyvaluestorage@npm:1.1.1" + dependencies: + "@walletconnect/safe-json": ^1.0.1 + idb-keyval: ^6.2.1 + unstorage: ^1.9.0 + peerDependencies: + "@react-native-async-storage/async-storage": 1.x + peerDependenciesMeta: + "@react-native-async-storage/async-storage": + optional: true + checksum: 7f85cb83963153417745367742070ccb78e03bd62adb549de57a7d5fae7bcfbd9a8f42b2f445ca76a3817ffacacc69d85bbf67757c3616ee7b3525f2f8a0faea + languageName: node + linkType: hard + +"@walletconnect/legacy-client@npm:^2.0.0": + version: 2.0.0 + resolution: "@walletconnect/legacy-client@npm:2.0.0" + dependencies: + "@walletconnect/crypto": ^1.0.3 + "@walletconnect/encoding": ^1.0.2 + "@walletconnect/jsonrpc-utils": ^1.0.4 + "@walletconnect/legacy-types": ^2.0.0 + "@walletconnect/legacy-utils": ^2.0.0 + "@walletconnect/safe-json": ^1.0.1 + "@walletconnect/window-getters": ^1.0.1 + "@walletconnect/window-metadata": ^1.0.1 + detect-browser: ^5.3.0 + query-string: ^6.13.5 + checksum: 57de9e373b24766e937734989080eb6d476e40d5406d4f817c989b278f25a09aa8636dfbe34a33f4de80ef90aea9641fdb7841007ecdba8e5ad47cd11614ee94 + languageName: node + linkType: hard + +"@walletconnect/legacy-modal@npm:^2.0.0": + version: 2.0.0 + resolution: "@walletconnect/legacy-modal@npm:2.0.0" + dependencies: + "@walletconnect/legacy-types": ^2.0.0 + "@walletconnect/legacy-utils": ^2.0.0 + copy-to-clipboard: ^3.3.3 + preact: ^10.12.0 + qrcode: ^1.5.1 + checksum: 897a02c9f4129a8f0b8e37832bf49a408e7e6f2828e78bea90c3718471cb57558f5522dd69c19456b5cc54a4aa04a4f7942f262ad9b031d318a5498ca0ca4078 + languageName: node + linkType: hard + +"@walletconnect/legacy-provider@npm:^2.0.0": + version: 2.0.0 + resolution: "@walletconnect/legacy-provider@npm:2.0.0" + dependencies: + "@walletconnect/jsonrpc-http-connection": ^1.0.4 + "@walletconnect/jsonrpc-provider": ^1.0.6 + "@walletconnect/legacy-client": ^2.0.0 + "@walletconnect/legacy-modal": ^2.0.0 + "@walletconnect/legacy-types": ^2.0.0 + "@walletconnect/legacy-utils": ^2.0.0 + checksum: 48adf2d938d3580be1dbaa4c7005cdf715896a56d3f4ab500c301cd5b442343c7df11bfccbc8e32bf9a7ba4b9a379208846ad848d79b1b6b511c1c4121fc83cf + languageName: node + linkType: hard + +"@walletconnect/legacy-types@npm:^2.0.0": + version: 2.0.0 + resolution: "@walletconnect/legacy-types@npm:2.0.0" + dependencies: + "@walletconnect/jsonrpc-types": ^1.0.2 + checksum: 358d789f8a50e689edcfd8eb668fcdf8e1f03ab08757b12fad0e658ce7ef62268f8022502b476bce69e5165aa4454c4ad1ea41f17244ab8d0fcd9026bd94707c + languageName: node + linkType: hard + +"@walletconnect/legacy-utils@npm:^2.0.0": + version: 2.0.0 + resolution: "@walletconnect/legacy-utils@npm:2.0.0" + dependencies: + "@walletconnect/encoding": ^1.0.2 + "@walletconnect/jsonrpc-utils": ^1.0.4 + "@walletconnect/legacy-types": ^2.0.0 + "@walletconnect/safe-json": ^1.0.1 + "@walletconnect/window-getters": ^1.0.1 + "@walletconnect/window-metadata": ^1.0.1 + detect-browser: ^5.3.0 + query-string: ^6.13.5 + checksum: ea90e98c2f2f0a7f1d8801f7284bae909952979413b5d8e339004948199a2777af025195442a3c78a27aa3c16bb546ef54bf9c592e5622e1f003bef6d4b355ca + languageName: node + linkType: hard + +"@walletconnect/logger@npm:^2.0.1": + version: 2.0.1 + resolution: "@walletconnect/logger@npm:2.0.1" + dependencies: + pino: 7.11.0 + tslib: 1.14.1 + checksum: b686679d176d5d22a3441d93e71be2652e6c447682a6d6f014baf7c2d9dcd23b93e2f434d4410e33cc532d068333f6b3c1d899aeb0d6f60cc296ed17f57b0c2c + languageName: node + linkType: hard + +"@walletconnect/modal-core@npm:2.6.2": + version: 2.6.2 + resolution: "@walletconnect/modal-core@npm:2.6.2" + dependencies: + valtio: 1.11.2 + checksum: 94daceba50c323b06ecbeac2968d9f0972f327359c6118887c6526cd64006249b12f64322d71bc6c4a2b928436ecc89cf3d3af706511fcdc264c1f4b34a2dd5d + languageName: node + linkType: hard + +"@walletconnect/modal-ui@npm:2.6.2": + version: 2.6.2 + resolution: "@walletconnect/modal-ui@npm:2.6.2" + dependencies: + "@walletconnect/modal-core": 2.6.2 + lit: 2.8.0 + motion: 10.16.2 + qrcode: 1.5.3 + checksum: cd1ec0205eb491e529670599d3dd26f6782d7c5a99d5594bf6949a8c760c1c5f4eb6ed72b8662450774fe4e2dd47678f2c05145c8f2494bd7153446ddf4bd7ed + languageName: node + linkType: hard + +"@walletconnect/modal@npm:2.6.2, @walletconnect/modal@npm:^2.6.2": + version: 2.6.2 + resolution: "@walletconnect/modal@npm:2.6.2" + dependencies: + "@walletconnect/modal-core": 2.6.2 + "@walletconnect/modal-ui": 2.6.2 + checksum: 68b354d49960b96d22de0e47a3801df27c01a3e96ec5fbde3ca6df1344ca2b20668b0c4d58fe1803f5670ac7b7b4c6f5b7b405e354f5f9eaff5cca147c13de9c + languageName: node + linkType: hard + +"@walletconnect/randombytes@npm:^1.0.3": + version: 1.0.3 + resolution: "@walletconnect/randombytes@npm:1.0.3" + dependencies: + "@walletconnect/encoding": ^1.0.2 + "@walletconnect/environment": ^1.0.1 + randombytes: ^2.1.0 + tslib: 1.14.1 + checksum: 3ba1d5906299256c64affcd03348ec1397e2fadb1e60baaa13d4f46ba0267580fc354e67839d3fa4faa8abb375723f7ab96334b4e842f5814ce2080ed15f3578 + languageName: node + linkType: hard + +"@walletconnect/relay-api@npm:^1.0.9": + version: 1.0.9 + resolution: "@walletconnect/relay-api@npm:1.0.9" + dependencies: + "@walletconnect/jsonrpc-types": ^1.0.2 + tslib: 1.14.1 + checksum: 5870579b6552f1ce7351878f1acb8386b0c11288c64d39133c7cee5040feeb7ccf9114228d97a59749d60366ad107b097d656407d534567c24f5d3878ea6e246 + languageName: node + linkType: hard + +"@walletconnect/relay-auth@npm:^1.0.4": + version: 1.0.4 + resolution: "@walletconnect/relay-auth@npm:1.0.4" + dependencies: + "@stablelib/ed25519": ^1.0.2 + "@stablelib/random": ^1.0.1 + "@walletconnect/safe-json": ^1.0.1 + "@walletconnect/time": ^1.0.2 + tslib: 1.14.1 + uint8arrays: ^3.0.0 + checksum: 35b3229d7b57e74fdb8fe6827d8dd8291dc60bacda880a57b2acb47a34d38f12be46c971c9eff361eb4073e896648b550de7a7a3852ef3752f9619c08dfba891 + languageName: node + linkType: hard + +"@walletconnect/safe-json@npm:^1.0.1, @walletconnect/safe-json@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/safe-json@npm:1.0.2" + dependencies: + tslib: 1.14.1 + checksum: fee03fcc70adb5635ab9419ea6ec6555aa2467bef650ad3b9526451c3a5cf247836db0f3ae3bb435d2e585d99e50c2ebe7dc9c429cfa3df900cf3fe4bd06d37f + languageName: node + linkType: hard + +"@walletconnect/sign-client@npm:2.11.0": + version: 2.11.0 + resolution: "@walletconnect/sign-client@npm:2.11.0" + dependencies: + "@walletconnect/core": 2.11.0 + "@walletconnect/events": ^1.0.1 + "@walletconnect/heartbeat": 1.2.1 + "@walletconnect/jsonrpc-utils": 1.0.8 + "@walletconnect/logger": ^2.0.1 + "@walletconnect/time": ^1.0.2 + "@walletconnect/types": 2.11.0 + "@walletconnect/utils": 2.11.0 + events: ^3.3.0 + checksum: 89230cf4ca95f9feb06104cc8097340e345b2b21257d45acf16729342ddcf5248bbf05097343b21e4dbebfa4fbacb6fe067099ee6127169a6b464563985d4716 + languageName: node + linkType: hard + +"@walletconnect/time@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/time@npm:1.0.2" + dependencies: + tslib: 1.14.1 + checksum: e3fc0113ca9e7ecedfc65f9e1517196682d5ffcda60750f51073b8d704719a17fea75da8b242c804bfa5b994707723043892a2db3cc86988b190b7b8711fe3c0 + languageName: node + linkType: hard + +"@walletconnect/types@npm:2.11.0": + version: 2.11.0 + resolution: "@walletconnect/types@npm:2.11.0" + dependencies: + "@walletconnect/events": ^1.0.1 + "@walletconnect/heartbeat": 1.2.1 + "@walletconnect/jsonrpc-types": 1.0.3 + "@walletconnect/keyvaluestorage": ^1.1.1 + "@walletconnect/logger": ^2.0.1 + events: ^3.3.0 + checksum: 32d0d7972b90683467e47eabf92005c7c5d1ae76400eb221576ac0d32501b9f0a414d5921f0c881efe86f07485db807e3e9d370c6b9cc264771822916dc4cca5 + languageName: node + linkType: hard + +"@walletconnect/universal-provider@npm:2.11.0": + version: 2.11.0 + resolution: "@walletconnect/universal-provider@npm:2.11.0" + dependencies: + "@walletconnect/jsonrpc-http-connection": ^1.0.7 + "@walletconnect/jsonrpc-provider": 1.0.13 + "@walletconnect/jsonrpc-types": ^1.0.2 + "@walletconnect/jsonrpc-utils": ^1.0.7 + "@walletconnect/logger": ^2.0.1 + "@walletconnect/sign-client": 2.11.0 + "@walletconnect/types": 2.11.0 + "@walletconnect/utils": 2.11.0 + events: ^3.3.0 + checksum: 7f4f187cd9148dc2e262e4afecadf0d0e136ae4183a60779562fef142411b927a3305c90793ef98dc3ecc61e4e2d4cfc8ac5491b1b42054021cfc4383f7ab81e + languageName: node + linkType: hard + +"@walletconnect/utils@npm:2.11.0": + version: 2.11.0 + resolution: "@walletconnect/utils@npm:2.11.0" + dependencies: + "@stablelib/chacha20poly1305": 1.0.1 + "@stablelib/hkdf": 1.0.1 + "@stablelib/random": ^1.0.2 + "@stablelib/sha256": 1.0.1 + "@stablelib/x25519": ^1.0.3 + "@walletconnect/relay-api": ^1.0.9 + "@walletconnect/safe-json": ^1.0.2 + "@walletconnect/time": ^1.0.2 + "@walletconnect/types": 2.11.0 + "@walletconnect/window-getters": ^1.0.1 + "@walletconnect/window-metadata": ^1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: ^3.1.0 + checksum: 9d8259ea6a2850e620eb366b26fc3f17cf7bf75ae9c50fdfa3252b9dd152d1c10444009dfad1aa5a0a7d1ed844e5efd76581540e973315ec289fba7b51ebf7d7 + languageName: node + linkType: hard + +"@walletconnect/window-getters@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/window-getters@npm:1.0.1" + dependencies: + tslib: 1.14.1 + checksum: fae312c4e1be5574d97f071de58e6aa0d0296869761499caf9d4a9a5fd2643458af32233a2120521b00873a599ff88457d405bd82ced5fb5bd6dc3191c07a3e5 + languageName: node + linkType: hard + +"@walletconnect/window-metadata@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/window-metadata@npm:1.0.1" + dependencies: + "@walletconnect/window-getters": ^1.0.1 + tslib: 1.14.1 + checksum: e82aea7195c6fe95c00e87bb38051c5549838c2e8302da94f1afa48206f79f0b620166c9820f847494505d282d1568e2086a1561b0493d2d0a1fa115f9106aef + languageName: node + linkType: hard + +"abab@npm:^2.0.6": + version: 2.0.6 + resolution: "abab@npm:2.0.6" + checksum: 6ffc1af4ff315066c62600123990d87551ceb0aafa01e6539da77b0f5987ac7019466780bf480f1787576d4385e3690c81ccc37cfda12819bf510b8ab47e5a3e + languageName: node + linkType: hard + +"abbrev@npm:1, abbrev@npm:^1.0.0": + version: 1.1.1 + resolution: "abbrev@npm:1.1.1" + checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 + languageName: node + linkType: hard + +"abbrev@npm:1.0.x": + version: 1.0.9 + resolution: "abbrev@npm:1.0.9" + checksum: 46460c897b4ce62cd9b1bd4a853cc46e771a1f1d929f5443f3945a976f8be5388891bf9e5f8a9862baa29587349e16c48596b6a621404d46d3b184fe9bd9fb26 + languageName: node + linkType: hard + +"abitype@npm:0.8.7": + version: 0.8.7 + resolution: "abitype@npm:0.8.7" + peerDependencies: + typescript: ">=5.0.4" + zod: ^3 >=3.19.1 + peerDependenciesMeta: + zod: + optional: true + checksum: 4351466808969bcc73e5c535c3d96bb687ee2be0bccd48eba024c47e6cc248f0c8bd368f9e42dab35d39923e63b1349ade470f72812de27127968caf1a1426c9 + languageName: node + linkType: hard + +"abitype@npm:0.9.8": + version: 0.9.8 + resolution: "abitype@npm:0.9.8" + peerDependencies: + typescript: ">=5.0.4" + zod: ^3 >=3.19.1 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + checksum: d7d887f29d6821e3f7a400de9620511b80ead3f85c5c87308aaec97965d3493e6687ed816e88722b4f512249bd66dee9e69231b49af0e1db8f69400a62c87cf6 + languageName: node + linkType: hard + +"abitype@npm:^0.9.10": + version: 0.9.10 + resolution: "abitype@npm:0.9.10" + peerDependencies: + typescript: ">=5.0.4" + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + checksum: de703b58c221395f015c04a8512dde2cff2b9541c577a23cf205204604e624fbfd0e682e82f7954968d5e437cd0d7e630b1c159e73543881a4d0040238bfb13a + languageName: node + linkType: hard + +"account-abstraction@github:eth-infinitism/account-abstraction": + version: 0.7.0 + resolution: "account-abstraction@https://github.com/eth-infinitism/account-abstraction.git#commit=7af70c8993a6f42973f520ae0752386a5032abe7" + dependencies: + "@nomiclabs/hardhat-etherscan": ^2.1.6 + "@openzeppelin/contracts": ^5.0.0 + "@thehubbleproject/bls": ^0.5.1 + "@typechain/hardhat": ^2.3.0 + "@types/debug": ^4.1.12 + "@types/mocha": ^9.0.0 + debug: ^4.3.4 + ethereumjs-util: ^7.1.0 + ethereumjs-wallet: ^1.0.1 + hardhat-deploy: ^0.11.23 + hardhat-deploy-ethers: ^0.3.0-beta.11 + solidity-coverage: ^0.8.4 + source-map-support: ^0.5.19 + table: ^6.8.0 + typescript: ^4.3.5 + checksum: bdca754160deb9b34a6b668bbcb80477c1c596cdaa90ed4966e0b557f32d26f1d973033a468dca016ad8e5d909c68f15859408208b70602bdee0619c6208bd02 + languageName: node + linkType: hard + +"acorn-globals@npm:^7.0.0": + version: 7.0.1 + resolution: "acorn-globals@npm:7.0.1" + dependencies: + acorn: ^8.1.0 + acorn-walk: ^8.0.2 + checksum: 2a2998a547af6d0db5f0cdb90acaa7c3cbca6709010e02121fb8b8617c0fbd8bab0b869579903fde358ac78454356a14fadcc1a672ecb97b04b1c2ccba955ce8 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.1.1": + version: 8.3.2 + resolution: "acorn-walk@npm:8.3.2" + checksum: 3626b9d26a37b1b427796feaa5261faf712307a8920392c8dce9a5739fb31077667f4ad2ec71c7ac6aaf9f61f04a9d3d67ff56f459587206fc04aa31c27ef392 + languageName: node + linkType: hard + +"acorn@npm:^8.1.0, acorn@npm:^8.11.3, acorn@npm:^8.4.1, acorn@npm:^8.8.1, acorn@npm:^8.9.0": + version: 8.11.3 + resolution: "acorn@npm:8.11.3" + bin: + acorn: bin/acorn + checksum: 76d8e7d559512566b43ab4aadc374f11f563f0a9e21626dd59cb2888444e9445923ae9f3699972767f18af61df89cd89f5eaaf772d1327b055b45cb829b4a88c + languageName: node + linkType: hard + +"aes-js@npm:3.0.0": + version: 3.0.0 + resolution: "aes-js@npm:3.0.0" + checksum: 251e26d533cd1a915b44896b17d5ed68c24a02484cfdd2e74ec700a309267db96651ea4eb657bf20aac32a3baa61f6e34edf8e2fec2de440a655da9942d334b8 + languageName: node + linkType: hard + +"aes-js@npm:^3.1.2": + version: 3.1.2 + resolution: "aes-js@npm:3.1.2" + checksum: 062154d50b1e433cc8c3b8ca7879f3a6375d5e79c2a507b2b6c4ec920b4cd851bf2afa7f65c98761a9da89c0ab618cbe6529e8e9a1c71f93290b53128fb8f712 + languageName: node + linkType: hard + +"agent-base@npm:6, agent-base@npm:^6.0.2": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: 4 + checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d + languageName: node + linkType: hard + +"agentkeepalive@npm:^4.2.1": + version: 4.3.0 + resolution: "agentkeepalive@npm:4.3.0" + dependencies: + debug: ^4.1.0 + depd: ^2.0.0 + humanize-ms: ^1.2.1 + checksum: 982453aa44c11a06826c836025e5162c846e1200adb56f2d075400da7d32d87021b3b0a58768d949d824811f5654223d5a8a3dad120921a2439625eb847c6260 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: ^2.0.0 + indent-string: ^4.0.0 + checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4, ajv@npm:^6.12.6": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: ^3.1.1 + fast-json-stable-stringify: ^2.0.0 + json-schema-traverse: ^0.4.1 + uri-js: ^4.2.2 + checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 + languageName: node + linkType: hard + +"ajv@npm:^8.0.1": + version: 8.12.0 + resolution: "ajv@npm:8.12.0" + dependencies: + fast-deep-equal: ^3.1.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + uri-js: ^4.2.2 + checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 + languageName: node + linkType: hard + +"amdefine@npm:>=0.0.4": + version: 1.0.1 + resolution: "amdefine@npm:1.0.1" + checksum: 9d4e15b94641643a9385b2841b4cb2bcf4e8e2f741ea4bd475c93ad7bab261ad4ed827a32e9c549b38b98759c4526c173ae4e6dde8caeb75ee5cebedc9863762 + languageName: node + linkType: hard + +"ansi-colors@npm:4.1.1": + version: 4.1.1 + resolution: "ansi-colors@npm:4.1.1" + checksum: 138d04a51076cb085da0a7e2d000c5c0bb09f6e772ed5c65c53cb118d37f6c5f1637506d7155fb5f330f0abcf6f12fa2e489ac3f8cdab9da393bf1bb4f9a32b0 + languageName: node + linkType: hard + +"ansi-colors@npm:^4.1.1": + version: 4.1.3 + resolution: "ansi-colors@npm:4.1.3" + checksum: a9c2ec842038a1fabc7db9ece7d3177e2fe1c5dc6f0c51ecfbf5f39911427b89c00b5dc6b8bd95f82a26e9b16aaae2e83d45f060e98070ce4d1333038edceb0e + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: ^0.21.3 + checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: ^1.9.0 + checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: ^2.0.1 + checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 + languageName: node + linkType: hard + +"ansi-styles@npm:^5.0.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: d7f4e97ce0623aea6bc0d90dcd28881ee04cba06c570b97fd3391bd7a268eedfd9d5e2dd4fdcbdd82b8105df5faf6f24aaedc08eaf3da898e702db5948f63469 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.0.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + languageName: node + linkType: hard + +"antlr4@npm:^4.11.0": + version: 4.13.0 + resolution: "antlr4@npm:4.13.0" + checksum: 9fc5d8bf2d3be7e35e372ef70acd015e9e593ff7482dafd9780185eb63e156958b137a6e4af1792eda71adc7c3b09f9087d2d7794b903c1a65f58800907e7beb + languageName: node + linkType: hard + +"antlr4ts@npm:^0.5.0-alpha.4": + version: 0.5.0-dev + resolution: "antlr4ts@npm:0.5.0-dev" + dependencies: + source-map-support: ^0.5.16 + checksum: 640dae2229124372b0329315e9614ae983bb80b1af237d8c0b3e90a2d85fb534e851c51d65d1897c92b36d27851d041ad8d95aab44af19cf7355b3ad11a3ddbf + languageName: node + linkType: hard + +"anymatch@npm:^3.0.3, anymatch@npm:^3.1.3, anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: ^3.0.0 + picomatch: ^2.0.4 + checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 + languageName: node + linkType: hard + +"aproba@npm:^1.0.3 || ^2.0.0": + version: 2.0.0 + resolution: "aproba@npm:2.0.0" + checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 + languageName: node + linkType: hard + +"are-we-there-yet@npm:^3.0.0": + version: 3.0.1 + resolution: "are-we-there-yet@npm:3.0.1" + dependencies: + delegates: ^1.0.0 + readable-stream: ^3.6.0 + checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 + languageName: node + linkType: hard + +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: ~1.0.2 + checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced + languageName: node + linkType: hard + +"aria-query@npm:5.1.3": + version: 5.1.3 + resolution: "aria-query@npm:5.1.3" + dependencies: + deep-equal: ^2.0.5 + checksum: 929ff95f02857b650fb4cbcd2f41072eee2f46159a6605ea03bf63aa572e35ffdff43d69e815ddc462e16e07de8faba3978afc2813650b4448ee18c9895d982b + languageName: node + linkType: hard + +"aria-query@npm:^5.0.0": + version: 5.3.0 + resolution: "aria-query@npm:5.3.0" + dependencies: + dequal: ^2.0.3 + checksum: 305bd73c76756117b59aba121d08f413c7ff5e80fa1b98e217a3443fcddb9a232ee790e24e432b59ae7625aebcf4c47cb01c2cac872994f0b426f5bdfcd96ba9 + languageName: node + linkType: hard + +"array-back@npm:^3.0.1, array-back@npm:^3.1.0": + version: 3.1.0 + resolution: "array-back@npm:3.1.0" + checksum: 7205004fcd0f9edd926db921af901b083094608d5b265738d0290092f9822f73accb468e677db74c7c94ef432d39e5ed75a7b1786701e182efb25bbba9734209 + languageName: node + linkType: hard + +"array-back@npm:^4.0.1, array-back@npm:^4.0.2": + version: 4.0.2 + resolution: "array-back@npm:4.0.2" + checksum: f30603270771eeb54e5aad5f54604c62b3577a18b6db212a7272b2b6c32049121b49431f656654790ed1469411e45f387e7627c0de8fd0515995cc40df9b9294 + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "array-buffer-byte-length@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + is-array-buffer: ^3.0.1 + checksum: 044e101ce150f4804ad19c51d6c4d4cfa505c5b2577bd179256e4aa3f3f6a0a5e9874c78cd428ee566ac574c8a04d7ce21af9fe52e844abfdccb82b33035a7c3 + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "array-buffer-byte-length@npm:1.0.1" + dependencies: + call-bind: ^1.0.5 + is-array-buffer: ^3.0.4 + checksum: 53524e08f40867f6a9f35318fafe467c32e45e9c682ba67b11943e167344d2febc0f6977a17e699b05699e805c3e8f073d876f8bbf1b559ed494ad2cd0fae09e + languageName: node + linkType: hard + +"array-includes@npm:^3.1.6": + version: 3.1.6 + resolution: "array-includes@npm:3.1.6" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + get-intrinsic: ^1.1.3 + is-string: ^1.0.7 + checksum: f22f8cd8ba8a6448d91eebdc69f04e4e55085d09232b5216ee2d476dab3ef59984e8d1889e662c6a0ed939dcb1b57fd05b2c0209c3370942fc41b752c82a2ca5 + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d + languageName: node + linkType: hard + +"array.prototype.flat@npm:^1.3.1": + version: 1.3.1 + resolution: "array.prototype.flat@npm:1.3.1" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + es-shim-unscopables: ^1.0.0 + checksum: 5a8415949df79bf6e01afd7e8839bbde5a3581300e8ad5d8449dea52639e9e59b26a467665622783697917b43bf39940a6e621877c7dd9b3d1c1f97484b9b88b + languageName: node + linkType: hard + +"array.prototype.flatmap@npm:^1.3.1": + version: 1.3.1 + resolution: "array.prototype.flatmap@npm:1.3.1" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + es-shim-unscopables: ^1.0.0 + checksum: 8c1c43a4995f12cf12523436da28515184c753807b3f0bc2ca6c075f71c470b099e2090cc67dba8e5280958fea401c1d0c59e1db0143272aef6cd1103921a987 + languageName: node + linkType: hard + +"array.prototype.reduce@npm:^1.0.6": + version: 1.0.7 + resolution: "array.prototype.reduce@npm:1.0.7" + dependencies: + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-array-method-boxes-properly: ^1.0.0 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + is-string: ^1.0.7 + checksum: 90303617bd70c8e9a81ebff041d3e10fad1a97f163699cb015b7c84a3f9e6960d9bb161a30f1d0309d6e476f166af5668c1e24f7add3202213d25f7c7f15475d + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.3": + version: 1.0.3 + resolution: "arraybuffer.prototype.slice@npm:1.0.3" + dependencies: + array-buffer-byte-length: ^1.0.1 + call-bind: ^1.0.5 + define-properties: ^1.2.1 + es-abstract: ^1.22.3 + es-errors: ^1.2.1 + get-intrinsic: ^1.2.3 + is-array-buffer: ^3.0.4 + is-shared-array-buffer: ^1.0.2 + checksum: 352259cba534dcdd969c92ab002efd2ba5025b2e3b9bead3973150edbdf0696c629d7f4b3f061c5931511e8207bdc2306da614703c820b45dabce39e3daf7e3e + languageName: node + linkType: hard + +"ast-parents@npm:^0.0.1": + version: 0.0.1 + resolution: "ast-parents@npm:0.0.1" + checksum: 51360afb9f7b939eb0330fdd0d5d855d0242f273f63478d30d9053069120492173719fb3c03ba372bccf1a7c1a9041c3c6bf2ab700de8c0f8c14792b045c3b23 + languageName: node + linkType: hard + +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 + languageName: node + linkType: hard + +"async-mutex@npm:^0.2.6": + version: 0.2.6 + resolution: "async-mutex@npm:0.2.6" + dependencies: + tslib: ^2.0.0 + checksum: f50102e0c57f6a958528cff7dff13da070897f17107b42274417a7248905b927b6e51c3387f8aed1f5cd6005b0e692d64a83a0789be602e4e7e7da4afe08b889 + languageName: node + linkType: hard + +"async@npm:1.x": + version: 1.5.2 + resolution: "async@npm:1.5.2" + checksum: fe5d6214d8f15bd51eee5ae8ec5079b228b86d2d595f47b16369dec2e11b3ff75a567bb5f70d12d79006665fbbb7ee0a7ec0e388524eefd454ecbe651c124ebd + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be + languageName: node + linkType: hard + +"at-least-node@npm:^1.0.0": + version: 1.0.0 + resolution: "at-least-node@npm:1.0.0" + checksum: 463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e + languageName: node + linkType: hard + +"atomic-sleep@npm:^1.0.0": + version: 1.0.0 + resolution: "atomic-sleep@npm:1.0.0" + checksum: b95275afb2f80732f22f43a60178430c468906a415a7ff18bcd0feeebc8eec3930b51250aeda91a476062a90e07132b43a1794e8d8ffcf9b650e8139be75fa36 + languageName: node + linkType: hard + +"available-typed-arrays@npm:^1.0.5, available-typed-arrays@npm:^1.0.6, available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: ^1.0.0 + checksum: 1aa3ffbfe6578276996de660848b6e95669d9a95ad149e3dd0c0cda77db6ee1dbd9d1dd723b65b6d277b882dd0c4b91a654ae9d3cf9e1254b7e93e4908d78fd3 + languageName: node + linkType: hard + +"axios@npm:^0.21.1": + version: 0.21.4 + resolution: "axios@npm:0.21.4" + dependencies: + follow-redirects: ^1.14.0 + checksum: 44245f24ac971e7458f3120c92f9d66d1fc695e8b97019139de5b0cc65d9b8104647db01e5f46917728edfc0cfd88eb30fc4c55e6053eef4ace76768ce95ff3c + languageName: node + linkType: hard + +"axios@npm:^0.27.2": + version: 0.27.2 + resolution: "axios@npm:0.27.2" + dependencies: + follow-redirects: ^1.14.9 + form-data: ^4.0.0 + checksum: 38cb7540465fe8c4102850c4368053c21683af85c5fdf0ea619f9628abbcb59415d1e22ebc8a6390d2bbc9b58a9806c874f139767389c862ec9b772235f06854 + languageName: node + linkType: hard + +"axios@npm:^1.2.6": + version: 1.6.3 + resolution: "axios@npm:1.6.3" + dependencies: + follow-redirects: ^1.15.0 + form-data: ^4.0.0 + proxy-from-env: ^1.1.0 + checksum: 07ef3bb83fc2dacc1ae2c97f2bbd04ef7701f5655f9037789d79ee78b698ffa50eaa8465c2017d4d3e9ce7d94cb779f730acaab32ce9036d0a4933c1e89df4da + languageName: node + linkType: hard + +"babel-jest@npm:^29.6.2": + version: 29.6.2 + resolution: "babel-jest@npm:29.6.2" + dependencies: + "@jest/transform": ^29.6.2 + "@types/babel__core": ^7.1.14 + babel-plugin-istanbul: ^6.1.1 + babel-preset-jest: ^29.5.0 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + slash: ^3.0.0 + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 3936b5d6ed6f08670c830ed919e38a4a593d0643b8e30fdeb16f4588b262ea5255fb96fd1849c02fba0b082ecfa4e788ce9a128ad1b9e654d46aac09c3a55504 + languageName: node + linkType: hard + +"babel-plugin-istanbul@npm:^6.1.1": + version: 6.1.1 + resolution: "babel-plugin-istanbul@npm:6.1.1" + dependencies: + "@babel/helper-plugin-utils": ^7.0.0 + "@istanbuljs/load-nyc-config": ^1.0.0 + "@istanbuljs/schema": ^0.1.2 + istanbul-lib-instrument: ^5.0.4 + test-exclude: ^6.0.0 + checksum: cb4fd95738219f232f0aece1116628cccff16db891713c4ccb501cddbbf9272951a5df81f2f2658dfdf4b3e7b236a9d5cbcf04d5d8c07dd5077297339598061a + languageName: node + linkType: hard + +"babel-plugin-jest-hoist@npm:^29.5.0": + version: 29.5.0 + resolution: "babel-plugin-jest-hoist@npm:29.5.0" + dependencies: + "@babel/template": ^7.3.3 + "@babel/types": ^7.3.3 + "@types/babel__core": ^7.1.14 + "@types/babel__traverse": ^7.0.6 + checksum: 099b5254073b6bc985b6d2d045ad26fb8ed30ff8ae6404c4fe8ee7cd0e98a820f69e3dfb871c7c65aae0f4b65af77046244c07bb92d49ef9005c90eedf681539 + languageName: node + linkType: hard + +"babel-preset-current-node-syntax@npm:^1.0.0": + version: 1.0.1 + resolution: "babel-preset-current-node-syntax@npm:1.0.1" + dependencies: + "@babel/plugin-syntax-async-generators": ^7.8.4 + "@babel/plugin-syntax-bigint": ^7.8.3 + "@babel/plugin-syntax-class-properties": ^7.8.3 + "@babel/plugin-syntax-import-meta": ^7.8.3 + "@babel/plugin-syntax-json-strings": ^7.8.3 + "@babel/plugin-syntax-logical-assignment-operators": ^7.8.3 + "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 + "@babel/plugin-syntax-numeric-separator": ^7.8.3 + "@babel/plugin-syntax-object-rest-spread": ^7.8.3 + "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 + "@babel/plugin-syntax-optional-chaining": ^7.8.3 + "@babel/plugin-syntax-top-level-await": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: d118c2742498c5492c095bc8541f4076b253e705b5f1ad9a2e7d302d81a84866f0070346662355c8e25fc02caa28dc2da8d69bcd67794a0d60c4d6fab6913cc8 + languageName: node + linkType: hard + +"babel-preset-jest@npm:^29.5.0": + version: 29.5.0 + resolution: "babel-preset-jest@npm:29.5.0" + dependencies: + babel-plugin-jest-hoist: ^29.5.0 + babel-preset-current-node-syntax: ^1.0.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 5566ca2762766c9319b4973d018d2fa08c0fcf6415c72cc54f4c8e7199e851ea8f5e6c6730f03ed7ed44fc8beefa959dd15911f2647dee47c615ff4faeddb1ad + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + languageName: node + linkType: hard + +"base-x@npm:^3.0.2": + version: 3.0.9 + resolution: "base-x@npm:3.0.9" + dependencies: + safe-buffer: ^5.0.1 + checksum: 957101d6fd09e1903e846fd8f69fd7e5e3e50254383e61ab667c725866bec54e5ece5ba49ce385128ae48f9ec93a26567d1d5ebb91f4d56ef4a9cc0d5a5481e8 + languageName: node + linkType: hard + +"base64-arraybuffer-es6@npm:^0.7.0": + version: 0.7.0 + resolution: "base64-arraybuffer-es6@npm:0.7.0" + checksum: 6d2fd114df49201b476cea5d470504e5d4e8c4cd42544152b312c9bdcb824313086fe83f1ffc34262e9e276b82d46aefc6e63bb85553f016932061137b355cdf + languageName: node + linkType: hard + +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 + languageName: node + linkType: hard + +"base64@github:Brechtpd/base64": + version: 1.1.0 + resolution: "base64@https://github.com/Brechtpd/base64.git#commit=4d85607b18d981acff392d2e99ba654305552a97" + checksum: 833f768c1d8b2b9ebbeb05b869bc0d105624dd91f10fa9eb2975a174feb957b6d95cb343eeb6762a6874a5629f6cfdc49fc78fca1a1fbf8c75f80d559331ab35 + languageName: node + linkType: hard + +"bech32@npm:1.1.4": + version: 1.1.4 + resolution: "bech32@npm:1.1.4" + checksum: 0e98db619191548390d6f09ff68b0253ba7ae6a55db93dfdbb070ba234c1fd3308c0606fbcc95fad50437227b10011e2698b89f0181f6e7f845c499bd14d0f4b + languageName: node + linkType: hard + +"bignumber.js@npm:^9.0.1": + version: 9.1.2 + resolution: "bignumber.js@npm:9.1.2" + checksum: 582c03af77ec9cb0ebd682a373ee6c66475db94a4325f92299621d544aa4bd45cb45fd60001610e94aef8ae98a0905fa538241d9638d4422d57abbeeac6fadaf + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.2.0 + resolution: "binary-extensions@npm:2.2.0" + checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 + languageName: node + linkType: hard + +"bl@npm:^4.1.0": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: ^5.5.0 + inherits: ^2.0.4 + readable-stream: ^3.4.0 + checksum: 9e8521fa7e83aa9427c6f8ccdcba6e8167ef30cc9a22df26effcc5ab682ef91d2cbc23a239f945d099289e4bbcfae7a192e9c28c84c6202e710a0dfec3722662 + languageName: node + linkType: hard + +"blakejs@npm:^1.1.0": + version: 1.2.1 + resolution: "blakejs@npm:1.2.1" + checksum: d699ba116cfa21d0b01d12014a03e484dd76d483133e6dc9eb415aa70a119f08beb3bcefb8c71840106a00b542cba77383f8be60cd1f0d4589cb8afb922eefbe + languageName: node + linkType: hard + +"bn.js@npm:4.11.6": + version: 4.11.6 + resolution: "bn.js@npm:4.11.6" + checksum: db23047bf06fdf9cf74401c8e76bca9f55313c81df382247d2c753868b368562e69171716b81b7038ada8860af18346fd4bcd1cf9d4963f923fe8e54e61cb58a + languageName: node + linkType: hard + +"bn.js@npm:^4.11.9": + version: 4.12.0 + resolution: "bn.js@npm:4.12.0" + checksum: 39afb4f15f4ea537b55eaf1446c896af28ac948fdcf47171961475724d1bb65118cca49fa6e3d67706e4790955ec0e74de584e45c8f1ef89f46c812bee5b5a12 + languageName: node + linkType: hard + +"bn.js@npm:^5.1.2, bn.js@npm:^5.2.0, bn.js@npm:^5.2.1": + version: 5.2.1 + resolution: "bn.js@npm:5.2.1" + checksum: 3dd8c8d38055fedfa95c1d5fc3c99f8dd547b36287b37768db0abab3c239711f88ff58d18d155dd8ad902b0b0cee973747b7ae20ea12a09473272b0201c9edd3 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: ^1.0.0 + concat-map: 0.0.1 + checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: ^1.0.0 + checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + languageName: node + linkType: hard + +"braces@npm:^3.0.2, braces@npm:~3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" + dependencies: + fill-range: ^7.0.1 + checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 + languageName: node + linkType: hard + +"brorand@npm:^1.1.0": + version: 1.1.0 + resolution: "brorand@npm:1.1.0" + checksum: 8a05c9f3c4b46572dec6ef71012b1946db6cae8c7bb60ccd4b7dd5a84655db49fe043ecc6272e7ef1f69dc53d6730b9e2a3a03a8310509a3d797a618cbee52be + languageName: node + linkType: hard + +"browser-or-node@npm:^2.1.1": + version: 2.1.1 + resolution: "browser-or-node@npm:2.1.1" + checksum: b1650b579345574d2c1905c73d385915a032523066ef9589036cf129b23b27b85096b6713476dffb88feb83cda798ed0774363e699117aa2724a0409adea25aa + languageName: node + linkType: hard + +"browser-stdout@npm:1.3.1": + version: 1.3.1 + resolution: "browser-stdout@npm:1.3.1" + checksum: b717b19b25952dd6af483e368f9bcd6b14b87740c3d226c2977a65e84666ffd67000bddea7d911f111a9b6ddc822b234de42d52ab6507bce4119a4cc003ef7b3 + languageName: node + linkType: hard + +"browserify-aes@npm:^1.2.0": + version: 1.2.0 + resolution: "browserify-aes@npm:1.2.0" + dependencies: + buffer-xor: ^1.0.3 + cipher-base: ^1.0.0 + create-hash: ^1.1.0 + evp_bytestokey: ^1.0.3 + inherits: ^2.0.1 + safe-buffer: ^5.0.1 + checksum: 4a17c3eb55a2aa61c934c286f34921933086bf6d67f02d4adb09fcc6f2fc93977b47d9d884c25619144fccd47b3b3a399e1ad8b3ff5a346be47270114bcf7104 + languageName: node + linkType: hard + +"browserslist@npm:^4.22.2": + version: 4.23.0 + resolution: "browserslist@npm:4.23.0" + dependencies: + caniuse-lite: ^1.0.30001587 + electron-to-chromium: ^1.4.668 + node-releases: ^2.0.14 + update-browserslist-db: ^1.0.13 + bin: + browserslist: cli.js + checksum: 436f49e796782ca751ebab7edc010cfc9c29f68536f387666cd70ea22f7105563f04dd62c6ff89cb24cc3254d17cba385f979eeeb3484d43e012412ff7e75def + languageName: node + linkType: hard + +"bs-logger@npm:0.x": + version: 0.2.6 + resolution: "bs-logger@npm:0.2.6" + dependencies: + fast-json-stable-stringify: 2.x + checksum: d34bdaf68c64bd099ab97c3ea608c9ae7d3f5faa1178b3f3f345acd94e852e608b2d4f9103fb2e503f5e69780e98293df41691b84be909b41cf5045374d54606 + languageName: node + linkType: hard + +"bs58@npm:^4.0.0": + version: 4.0.1 + resolution: "bs58@npm:4.0.1" + dependencies: + base-x: ^3.0.2 + checksum: b3c5365bb9e0c561e1a82f1a2d809a1a692059fae016be233a6127ad2f50a6b986467c3a50669ce4c18929dcccb297c5909314dd347a25a68c21b68eb3e95ac2 + languageName: node + linkType: hard + +"bs58check@npm:^2.1.2": + version: 2.1.2 + resolution: "bs58check@npm:2.1.2" + dependencies: + bs58: ^4.0.0 + create-hash: ^1.1.0 + safe-buffer: ^5.1.2 + checksum: 43bdf08a5dd04581b78f040bc4169480e17008da482ffe2a6507327bbc4fc5c28de0501f7faf22901cfe57fbca79cbb202ca529003fedb4cb8dccd265b38e54d + languageName: node + linkType: hard + +"bser@npm:2.1.1": + version: 2.1.1 + resolution: "bser@npm:2.1.1" + dependencies: + node-int64: ^0.4.0 + checksum: 9ba4dc58ce86300c862bffc3ae91f00b2a03b01ee07f3564beeeaf82aa243b8b03ba53f123b0b842c190d4399b94697970c8e7cf7b1ea44b61aa28c3526a4449 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb + languageName: node + linkType: hard + +"buffer-xor@npm:^1.0.3": + version: 1.0.3 + resolution: "buffer-xor@npm:1.0.3" + checksum: 10c520df29d62fa6e785e2800e586a20fc4f6dfad84bcdbd12e1e8a83856de1cb75c7ebd7abe6d036bbfab738a6cf18a3ae9c8e5a2e2eb3167ca7399ce65373a + languageName: node + linkType: hard + +"buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: ^1.3.1 + ieee754: ^1.1.13 + checksum: e2cf8429e1c4c7b8cbd30834ac09bd61da46ce35f5c22a78e6c2f04497d6d25541b16881e30a019c6fd3154150650ccee27a308eff3e26229d788bbdeb08ab84 + languageName: node + linkType: hard + +"buffer@npm:^6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: ^1.3.1 + ieee754: ^1.2.1 + checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9 + languageName: node + linkType: hard + +"builtins@npm:^5.0.1": + version: 5.0.1 + resolution: "builtins@npm:5.0.1" + dependencies: + semver: ^7.0.0 + checksum: 66d204657fe36522822a95b288943ad11b58f5eaede235b11d8c4edaa28ce4800087d44a2681524c340494aadb120a0068011acabe99d30e8f11a7d826d83515 + languageName: node + linkType: hard + +"bullmq@npm:^4.10.0": + version: 4.10.0 + resolution: "bullmq@npm:4.10.0" + dependencies: + cron-parser: ^4.6.0 + glob: ^8.0.3 + ioredis: ^5.3.2 + lodash: ^4.17.21 + msgpackr: ^1.6.2 + node-abort-controller: ^3.1.1 + semver: ^7.5.4 + tslib: ^2.0.0 + uuid: ^9.0.0 + checksum: c154ae41cc1d5cf8fc9c36681901bac73c3c61666315b475584a9537e52d6e0323672b2c82c54fccba56725fa60adf6f7700486a2d8f9a9b4129b44882bfcca9 + languageName: node + linkType: hard + +"cac@npm:^6.7.14": + version: 6.7.14 + resolution: "cac@npm:6.7.14" + checksum: 45a2496a9443abbe7f52a49b22fbe51b1905eff46e03fd5e6c98e3f85077be3f8949685a1849b1a9cd2bc3e5567dfebcf64f01ce01847baf918f1b37c839791a + languageName: node + linkType: hard + +"cacache@npm:^16.1.0": + version: 16.1.3 + resolution: "cacache@npm:16.1.3" + dependencies: + "@npmcli/fs": ^2.1.0 + "@npmcli/move-file": ^2.0.0 + chownr: ^2.0.0 + fs-minipass: ^2.1.0 + glob: ^8.0.1 + infer-owner: ^1.0.4 + lru-cache: ^7.7.1 + minipass: ^3.1.6 + minipass-collect: ^1.0.2 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + mkdirp: ^1.0.4 + p-map: ^4.0.0 + promise-inflight: ^1.0.1 + rimraf: ^3.0.2 + ssri: ^9.0.0 + tar: ^6.1.11 + unique-filename: ^2.0.0 + checksum: d91409e6e57d7d9a3a25e5dcc589c84e75b178ae8ea7de05cbf6b783f77a5fae938f6e8fda6f5257ed70000be27a681e1e44829251bfffe4c10216002f8f14e6 + languageName: node + linkType: hard + +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" + dependencies: + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.4 + set-function-length: ^1.2.1 + checksum: 295c0c62b90dd6522e6db3b0ab1ce26bdf9e7404215bda13cfee25b626b5ff1a7761324d58d38b1ef1607fc65aca2d06e44d2e18d0dfc6c14b465b00d8660029 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 + languageName: node + linkType: hard + +"camelcase@npm:^5.0.0, camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b + languageName: node + linkType: hard + +"camelcase@npm:^6.0.0, camelcase@npm:^6.2.0": + version: 6.3.0 + resolution: "camelcase@npm:6.3.0" + checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001587": + version: 1.0.30001593 + resolution: "caniuse-lite@npm:1.0.30001593" + checksum: 3e2b19075563c3222101c8d5e6ab2f6e1ba99c3ad03b8d2449f9ee7ed03e9d3dac0b1fb24c129e9a5d89fdde4abb97392280c0abb113c0c60250a2b49f378c60 + languageName: node + linkType: hard + +"cbor@npm:^5.0.2": + version: 5.2.0 + resolution: "cbor@npm:5.2.0" + dependencies: + bignumber.js: ^9.0.1 + nofilter: ^1.0.4 + checksum: b3c39dae64370f361526dbec88f51d0f1b47027224cdd21dbd64c228f0fe7eaa945932d349ec5324068a6c6dcdbb1e3b46242852524fd53c526d14cb60514bdc + languageName: node + linkType: hard + +"chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + +"chalk@npm:5.2.0": + version: 5.2.0 + resolution: "chalk@npm:5.2.0" + checksum: 03d8060277de6cf2fd567dc25fcf770593eb5bb85f460ce443e49255a30ff1242edd0c90a06a03803b0466ff0687a939b41db1757bec987113e83de89a003caa + languageName: node + linkType: hard + +"chalk@npm:^2.4.2": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: ^3.2.1 + escape-string-regexp: ^1.0.5 + supports-color: ^5.3.0 + checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + languageName: node + linkType: hard + +"chalk@npm:^3.0.0": + version: 3.0.0 + resolution: "chalk@npm:3.0.0" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: 8e3ddf3981c4da405ddbd7d9c8d91944ddf6e33d6837756979f7840a29272a69a5189ecae0ff84006750d6d1e92368d413335eab4db5476db6e6703a1d1e0505 + languageName: node + linkType: hard + +"char-regex@npm:^1.0.2": + version: 1.0.2 + resolution: "char-regex@npm:1.0.2" + checksum: b563e4b6039b15213114626621e7a3d12f31008bdce20f9c741d69987f62aeaace7ec30f6018890ad77b2e9b4d95324c9f5acfca58a9441e3b1dcdd1e2525d17 + languageName: node + linkType: hard + +"chokidar@npm:3.5.3": + version: 3.5.3 + resolution: "chokidar@npm:3.5.3" + dependencies: + anymatch: ~3.1.2 + braces: ~3.0.2 + fsevents: ~2.3.2 + glob-parent: ~5.1.2 + is-binary-path: ~2.1.0 + is-glob: ~4.0.1 + normalize-path: ~3.0.0 + readdirp: ~3.6.0 + dependenciesMeta: + fsevents: + optional: true + checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c + languageName: node + linkType: hard + +"chokidar@npm:^3.5.1, chokidar@npm:^3.5.2, chokidar@npm:^3.5.3": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" + dependencies: + anymatch: ~3.1.2 + braces: ~3.0.2 + fsevents: ~2.3.2 + glob-parent: ~5.1.2 + is-binary-path: ~2.1.0 + is-glob: ~4.0.1 + normalize-path: ~3.0.0 + readdirp: ~3.6.0 + dependenciesMeta: + fsevents: + optional: true + checksum: d2f29f499705dcd4f6f3bbed79a9ce2388cf530460122eed3b9c48efeab7a4e28739c6551fd15bec9245c6b9eeca7a32baa64694d64d9b6faeb74ddb8c4a413d + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f + languageName: node + linkType: hard + +"ci-info@npm:^3.2.0": + version: 3.8.0 + resolution: "ci-info@npm:3.8.0" + checksum: d0a4d3160497cae54294974a7246202244fff031b0a6ea20dd57b10ec510aa17399c41a1b0982142c105f3255aff2173e5c0dd7302ee1b2f28ba3debda375098 + languageName: node + linkType: hard + +"cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": + version: 1.0.4 + resolution: "cipher-base@npm:1.0.4" + dependencies: + inherits: ^2.0.1 + safe-buffer: ^5.0.1 + checksum: 47d3568dbc17431a339bad1fe7dff83ac0891be8206911ace3d3b818fc695f376df809bea406e759cdea07fff4b454fa25f1013e648851bec790c1d75763032e + languageName: node + linkType: hard + +"citty@npm:^0.1.5, citty@npm:^0.1.6": + version: 0.1.6 + resolution: "citty@npm:0.1.6" + dependencies: + consola: ^3.2.3 + checksum: 3fbcaaea92d328deddb5aba7d629d9076d4f1aa0338f59db7ea647a8f51eedc14b7f6218c87ad03c9e3c126213ba87d13d7774f9c30d64209f4b074aa83bd6ab + languageName: node + linkType: hard + +"cjs-module-lexer@npm:^1.0.0": + version: 1.2.2 + resolution: "cjs-module-lexer@npm:1.2.2" + checksum: 977f3f042bd4f08e368c890d91eecfbc4f91da0bc009a3c557bc4dfbf32022ad1141244ac1178d44de70fc9f3dea7add7cd9a658a34b9fae98a55d8f92331ce5 + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 + languageName: node + linkType: hard + +"cli-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-cursor@npm:3.1.0" + dependencies: + restore-cursor: ^3.1.0 + checksum: 2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29 + languageName: node + linkType: hard + +"cli-spinners@npm:^2.5.0": + version: 2.7.0 + resolution: "cli-spinners@npm:2.7.0" + checksum: a9afaf73f58d1f951fb23742f503631b3cf513f43f4c7acb1b640100eb76bfa16efbcd1994d149ffc6603a6d75dd3d4a516a76f125f90dce437de9b16fd0ee6f + languageName: node + linkType: hard + +"cli-truncate@npm:^2.1.0": + version: 2.1.0 + resolution: "cli-truncate@npm:2.1.0" + dependencies: + slice-ansi: ^3.0.0 + string-width: ^4.2.0 + checksum: bf1e4e6195392dc718bf9cd71f317b6300dc4a9191d052f31046b8773230ece4fa09458813bf0e3455a5e68c0690d2ea2c197d14a8b85a7b5e01c97f4b5feb5d + languageName: node + linkType: hard + +"cli-truncate@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-truncate@npm:3.1.0" + dependencies: + slice-ansi: ^5.0.0 + string-width: ^5.0.0 + checksum: c3243e41974445691c63f8b405df1d5a24049dc33d324fe448dc572e561a7b772ae982692900b1a5960901cc4fc7def25a629b9c69a4208ee89d12ab3332617a + languageName: node + linkType: hard + +"clipboardy@npm:^4.0.0": + version: 4.0.0 + resolution: "clipboardy@npm:4.0.0" + dependencies: + execa: ^8.0.1 + is-wsl: ^3.1.0 + is64bit: ^2.0.0 + checksum: ac7fa4438451d4a509fd7163505c08be92087c1a0ab8f54f8063eb04a69191ded1b59333344e2fd60bad9688e2a3dd69e50a813bf05ebf8369fa8bf65a0f47a2 + languageName: node + linkType: hard + +"cliui@npm:^6.0.0": + version: 6.0.0 + resolution: "cliui@npm:6.0.0" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.0 + wrap-ansi: ^6.2.0 + checksum: 4fcfd26d292c9f00238117f39fc797608292ae36bac2168cfee4c85923817d0607fe21b3329a8621e01aedf512c99b7eaa60e363a671ffd378df6649fb48ae42 + languageName: node + linkType: hard + +"cliui@npm:^7.0.2": + version: 7.0.4 + resolution: "cliui@npm:7.0.4" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.0 + wrap-ansi: ^7.0.0 + checksum: ce2e8f578a4813806788ac399b9e866297740eecd4ad1823c27fd344d78b22c5f8597d548adbcc46f0573e43e21e751f39446c5a5e804a12aace402b7a315d7f + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.1 + wrap-ansi: ^7.0.0 + checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 + languageName: node + linkType: hard + +"clone-deep@npm:^4.0.1": + version: 4.0.1 + resolution: "clone-deep@npm:4.0.1" + dependencies: + is-plain-object: ^2.0.4 + kind-of: ^6.0.2 + shallow-clone: ^3.0.0 + checksum: 770f912fe4e6f21873c8e8fbb1e99134db3b93da32df271d00589ea4a29dbe83a9808a322c93f3bcaf8584b8b4fa6fc269fc8032efbaa6728e0c9886c74467d2 + languageName: node + linkType: hard + +"clone@npm:^1.0.2": + version: 1.0.4 + resolution: "clone@npm:1.0.4" + checksum: d06418b7335897209e77bdd430d04f882189582e67bd1f75a04565f3f07f5b3f119a9d670c943b6697d0afb100f03b866b3b8a1f91d4d02d72c4ecf2bb64b5dd + languageName: node + linkType: hard + +"clsx@npm:^1.2.1": + version: 1.2.1 + resolution: "clsx@npm:1.2.1" + checksum: 30befca8019b2eb7dbad38cff6266cf543091dae2825c856a62a8ccf2c3ab9c2907c4d12b288b73101196767f66812365400a227581484a05f968b0307cfaf12 + languageName: node + linkType: hard + +"cluster-key-slot@npm:^1.1.0": + version: 1.1.2 + resolution: "cluster-key-slot@npm:1.1.2" + checksum: be0ad2d262502adc998597e83f9ded1b80f827f0452127c5a37b22dfca36bab8edf393f7b25bb626006fb9fb2436106939ede6d2d6ecf4229b96a47f27edd681 + languageName: node + linkType: hard + +"co@npm:^4.6.0": + version: 4.6.0 + resolution: "co@npm:4.6.0" + checksum: 5210d9223010eb95b29df06a91116f2cf7c8e0748a9013ed853b53f362ea0e822f1e5bb054fb3cefc645239a4cf966af1f6133a3b43f40d591f3b68ed6cf0510 + languageName: node + linkType: hard + +"collect-v8-coverage@npm:^1.0.0": + version: 1.0.1 + resolution: "collect-v8-coverage@npm:1.0.1" + checksum: 4efe0a1fccd517b65478a2364b33dadd0a43fc92a56f59aaece9b6186fe5177b2de471253587de7c91516f07c7268c2f6770b6cbcffc0e0ece353b766ec87e55 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: 1.1.3 + checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: ~1.1.4 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + languageName: node + linkType: hard + +"color-support@npm:^1.1.3": + version: 1.1.3 + resolution: "color-support@npm:1.1.3" + bin: + color-support: bin.js + checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b + languageName: node + linkType: hard + +"colorette@npm:^2.0.19": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: ~1.0.0 + checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c + languageName: node + linkType: hard + +"command-line-args@npm:^5.1.1": + version: 5.2.1 + resolution: "command-line-args@npm:5.2.1" + dependencies: + array-back: ^3.1.0 + find-replace: ^3.0.0 + lodash.camelcase: ^4.3.0 + typical: ^4.0.0 + checksum: e759519087be3cf2e86af8b9a97d3058b4910cd11ee852495be881a067b72891f6a32718fb685ee6d41531ab76b2b7bfb6602f79f882cd4b7587ff1e827982c7 + languageName: node + linkType: hard + +"command-line-usage@npm:^6.1.0": + version: 6.1.3 + resolution: "command-line-usage@npm:6.1.3" + dependencies: + array-back: ^4.0.2 + chalk: ^2.4.2 + table-layout: ^1.0.2 + typical: ^5.2.0 + checksum: 8261d4e5536eb0bcddee0ec5e89c05bb2abd18e5760785c8078ede5020bc1c612cbe28eb6586f5ed4a3660689748e5aaad4a72f21566f4ef39393694e2fa1a0b + languageName: node + linkType: hard + +"commander@npm:11.0.0": + version: 11.0.0 + resolution: "commander@npm:11.0.0" + checksum: 6621954e1e1d078b4991c1f5bbd9439ad37aa7768d6ab4842de1dbd4d222c8a27e1b8e62108b3a92988614af45031d5bb2a2aaa92951f4d0c934d1a1ac564bb4 + languageName: node + linkType: hard + +"commander@npm:^10.0.0": + version: 10.0.0 + resolution: "commander@npm:10.0.0" + checksum: 9f6495651f878213005ac744dd87a85fa3d9f2b8b90d1c19d0866d666bda7f735adfd7c2f10dfff345782e2f80ea258f98bb4efcef58e4e502f25f883940acfd + languageName: node + linkType: hard + +"commander@npm:^4.0.1": + version: 4.1.1 + resolution: "commander@npm:4.1.1" + checksum: d7b9913ff92cae20cb577a4ac6fcc121bd6223319e54a40f51a14740a681ad5c574fd29a57da478a5f234a6fa6c52cbf0b7c641353e03c648b1ae85ba670b977 + languageName: node + linkType: hard + +"commander@npm:^8.0.0": + version: 8.3.0 + resolution: "commander@npm:8.3.0" + checksum: 0f82321821fc27b83bd409510bb9deeebcfa799ff0bf5d102128b500b7af22872c0c92cb6a0ebc5a4cf19c6b550fba9cedfa7329d18c6442a625f851377bacf0 + languageName: node + linkType: hard + +"commondir@npm:^1.0.1": + version: 1.0.1 + resolution: "commondir@npm:1.0.1" + checksum: 59715f2fc456a73f68826285718503340b9f0dd89bfffc42749906c5cf3d4277ef11ef1cca0350d0e79204f00f1f6d83851ececc9095dc88512a697ac0b9bdcb + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af + languageName: node + linkType: hard + +"consola@npm:^3.2.3": + version: 3.2.3 + resolution: "consola@npm:3.2.3" + checksum: 32ec70e177dd2385c42e38078958cc7397be91db21af90c6f9faa0b16168b49b1c61d689338604bbb2d64370b9347a35f42a9197663a913d3a405bb0ce728499 + languageName: node + linkType: hard + +"console-control-strings@npm:^1.1.0": + version: 1.1.0 + resolution: "console-control-strings@npm:1.1.0" + checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed + languageName: node + linkType: hard + +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 63ae9933be5a2b8d4509daca5124e20c14d023c820258e484e32dc324d34c2754e71297c94a05784064ad27615037ef677e3f0c00469fb55f409d2bb21261035 + languageName: node + linkType: hard + +"cookie-es@npm:^1.0.0": + version: 1.0.0 + resolution: "cookie-es@npm:1.0.0" + checksum: e8721cf4d38f3e44049c9118874b323f4f674b1c5cef84a2b888f5bf86ad720ad17b51b43150cad7535a375c24e2921da603801ad28aa6125c3d36c031b41468 + languageName: node + linkType: hard + +"copy-to-clipboard@npm:^3.3.3": + version: 3.3.3 + resolution: "copy-to-clipboard@npm:3.3.3" + dependencies: + toggle-selection: ^1.0.6 + checksum: e0a325e39b7615108e6c1c8ac110ae7b829cdc4ee3278b1df6a0e4228c490442cc86444cd643e2da344fbc424b3aab8909e2fec82f8bc75e7e5b190b7c24eecf + languageName: node + linkType: hard + +"core-js@npm:^3.30.2": + version: 3.36.1 + resolution: "core-js@npm:3.36.1" + checksum: 6f6c152179bd0673da34e67a82c6a5c37f31f9fbe908e9caf93749dc62a25b6e07fbff2411de3b74bb2d0661b7f9fb247115ba8efabf9904f5fef26edead515e + languageName: node + linkType: hard + +"cosmiconfig@npm:8.2.0, cosmiconfig@npm:^8.0.0": + version: 8.2.0 + resolution: "cosmiconfig@npm:8.2.0" + dependencies: + import-fresh: ^3.2.1 + js-yaml: ^4.1.0 + parse-json: ^5.0.0 + path-type: ^4.0.0 + checksum: 836d5d8efa750f3fb17b03d6ca74cd3154ed025dffd045304b3ef59637f662bde1e5dc88f8830080d180ec60841719cf4ea2ce73fb21ec694b16865c478ff297 + languageName: node + linkType: hard + +"crc-32@npm:^1.2.0": + version: 1.2.2 + resolution: "crc-32@npm:1.2.2" + bin: + crc32: bin/crc32.njs + checksum: ad2d0ad0cbd465b75dcaeeff0600f8195b686816ab5f3ba4c6e052a07f728c3e70df2e3ca9fd3d4484dc4ba70586e161ca5a2334ec8bf5a41bf022a6103ff243 + languageName: node + linkType: hard + +"create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0": + version: 1.2.0 + resolution: "create-hash@npm:1.2.0" + dependencies: + cipher-base: ^1.0.1 + inherits: ^2.0.1 + md5.js: ^1.3.4 + ripemd160: ^2.0.1 + sha.js: ^2.4.0 + checksum: 02a6ae3bb9cd4afee3fabd846c1d8426a0e6b495560a977ba46120c473cb283be6aa1cace76b5f927cf4e499c6146fb798253e48e83d522feba807d6b722eaa9 + languageName: node + linkType: hard + +"create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": + version: 1.1.7 + resolution: "create-hmac@npm:1.1.7" + dependencies: + cipher-base: ^1.0.3 + create-hash: ^1.1.0 + inherits: ^2.0.1 + ripemd160: ^2.0.0 + safe-buffer: ^5.0.1 + sha.js: ^2.4.8 + checksum: ba12bb2257b585a0396108c72830e85f882ab659c3320c83584b1037f8ab72415095167ced80dc4ce8e446a8ecc4b2acf36d87befe0707d73b26cf9dc77440ed + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff + languageName: node + linkType: hard + +"cron-parser@npm:^4.6.0": + version: 4.9.0 + resolution: "cron-parser@npm:4.9.0" + dependencies: + luxon: ^3.2.1 + checksum: 3cf248fc5cae6c19ec7124962b1cd84b76f02b9bc4f58976b3bd07624db3ef10aaf1548efcc2d2dcdab0dad4f12029d640a55ecce05ea5e1596af9db585502cf + languageName: node + linkType: hard + +"cross-fetch@npm:^3.1.4": + version: 3.1.8 + resolution: "cross-fetch@npm:3.1.8" + dependencies: + node-fetch: ^2.6.12 + checksum: 78f993fa099eaaa041122ab037fe9503ecbbcb9daef234d1d2e0b9230a983f64d645d088c464e21a247b825a08dc444a6e7064adfa93536d3a9454b4745b3632 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + languageName: node + linkType: hard + +"crossws@npm:^0.2.0, crossws@npm:^0.2.2": + version: 0.2.4 + resolution: "crossws@npm:0.2.4" + peerDependencies: + uWebSockets.js: "*" + peerDependenciesMeta: + uWebSockets.js: + optional: true + checksum: dcaf730a3af32cf081ab49fdb9c31192a738d7e0585585975e581e71a3d7d14df8d3b42ba183e13e34a1fc26645f695362abf30c40369d12652bcee372a484c3 + languageName: node + linkType: hard + +"css-what@npm:^6.1.0": + version: 6.1.0 + resolution: "css-what@npm:6.1.0" + checksum: b975e547e1e90b79625918f84e67db5d33d896e6de846c9b584094e529f0c63e2ab85ee33b9daffd05bff3a146a1916bec664e18bb76dd5f66cbff9fc13b2bbe + languageName: node + linkType: hard + +"css.escape@npm:^1.5.1": + version: 1.5.1 + resolution: "css.escape@npm:1.5.1" + checksum: f6d38088d870a961794a2580b2b2af1027731bb43261cfdce14f19238a88664b351cc8978abc20f06cc6bbde725699dec8deb6fe9816b139fc3f2af28719e774 + languageName: node + linkType: hard + +"cssesc@npm:^3.0.0": + version: 3.0.0 + resolution: "cssesc@npm:3.0.0" + bin: + cssesc: bin/cssesc + checksum: f8c4ababffbc5e2ddf2fa9957dda1ee4af6048e22aeda1869d0d00843223c1b13ad3f5d88b51caa46c994225eacb636b764eb807a8883e2fb6f99b4f4e8c48b2 + languageName: node + linkType: hard + +"cssom@npm:^0.5.0": + version: 0.5.0 + resolution: "cssom@npm:0.5.0" + checksum: 823471aa30091c59e0a305927c30e7768939b6af70405808f8d2ce1ca778cddcb24722717392438329d1691f9a87cb0183b64b8d779b56a961546d54854fde01 + languageName: node + linkType: hard + +"cssom@npm:~0.3.6": + version: 0.3.8 + resolution: "cssom@npm:0.3.8" + checksum: 24beb3087c76c0d52dd458be9ee1fbc80ac771478a9baef35dd258cdeb527c68eb43204dd439692bb2b1ae5272fa5f2946d10946edab0d04f1078f85e06bc7f6 + languageName: node + linkType: hard + +"cssstyle@npm:^2.3.0": + version: 2.3.0 + resolution: "cssstyle@npm:2.3.0" + dependencies: + cssom: ~0.3.6 + checksum: 5f05e6fd2e3df0b44695c2f08b9ef38b011862b274e320665176467c0725e44a53e341bc4959a41176e83b66064ab786262e7380fd1cabeae6efee0d255bb4e3 + languageName: node + linkType: hard + +"csstype@npm:^3.0.2, csstype@npm:^3.0.7": + version: 3.1.3 + resolution: "csstype@npm:3.1.3" + checksum: 8db785cc92d259102725b3c694ec0c823f5619a84741b5c7991b8ad135dfaa66093038a1cc63e03361a6cd28d122be48f2106ae72334e067dd619a51f49eddf7 + languageName: node + linkType: hard + +"data-urls@npm:^3.0.2": + version: 3.0.2 + resolution: "data-urls@npm:3.0.2" + dependencies: + abab: ^2.0.6 + whatwg-mimetype: ^3.0.0 + whatwg-url: ^11.0.0 + checksum: 033fc3dd0fba6d24bc9a024ddcf9923691dd24f90a3d26f6545d6a2f71ec6956f93462f2cdf2183cc46f10dc01ed3bcb36731a8208456eb1a08147e571fe2a76 + languageName: node + linkType: hard + +"data-view-buffer@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-buffer@npm:1.0.1" + dependencies: + call-bind: ^1.0.6 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: ce24348f3c6231223b216da92e7e6a57a12b4af81a23f27eff8feabdf06acfb16c00639c8b705ca4d167f761cfc756e27e5f065d0a1f840c10b907fdaf8b988c + languageName: node + linkType: hard + +"data-view-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-length@npm:1.0.1" + dependencies: + call-bind: ^1.0.7 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: dbb3200edcb7c1ef0d68979834f81d64fd8cab2f7691b3a4c6b97e67f22182f3ec2c8602efd7b76997b55af6ff8bce485829c1feda4fa2165a6b71fb7baa4269 + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.0": + version: 1.0.0 + resolution: "data-view-byte-offset@npm:1.0.0" + dependencies: + call-bind: ^1.0.6 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: 7f0bf8720b7414ca719eedf1846aeec392f2054d7af707c5dc9a753cc77eb8625f067fa901e0b5127e831f9da9056138d894b9c2be79c27a21f6db5824f009c2 + languageName: node + linkType: hard + +"death@npm:^1.1.0": + version: 1.1.0 + resolution: "death@npm:1.1.0" + checksum: 8010ba9a320752f9580eb474985ed214572c0595cf83e92859e3c5a014a01fc8e8f2f2908b80b5f8bca9cb3f94adb546cf55810df6b80e282452e355cdce5aaa + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: 2.1.2 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + languageName: node + linkType: hard + +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: ^2.1.1 + checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c + languageName: node + linkType: hard + +"decamelize@npm:^1.2.0": + version: 1.2.0 + resolution: "decamelize@npm:1.2.0" + checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa + languageName: node + linkType: hard + +"decamelize@npm:^4.0.0": + version: 4.0.0 + resolution: "decamelize@npm:4.0.0" + checksum: b7d09b82652c39eead4d6678bb578e3bebd848add894b76d0f6b395bc45b2d692fb88d977e7cfb93c4ed6c119b05a1347cef261174916c2e75c0a8ca57da1809 + languageName: node + linkType: hard + +"decimal.js@npm:^10.4.2": + version: 10.4.3 + resolution: "decimal.js@npm:10.4.3" + checksum: 796404dcfa9d1dbfdc48870229d57f788b48c21c603c3f6554a1c17c10195fc1024de338b0cf9e1efe0c7c167eeb18f04548979bcc5fdfabebb7cc0ae3287bae + languageName: node + linkType: hard + +"decode-uri-component@npm:^0.2.0, decode-uri-component@npm:^0.2.2": + version: 0.2.2 + resolution: "decode-uri-component@npm:0.2.2" + checksum: 95476a7d28f267292ce745eac3524a9079058bbb35767b76e3ee87d42e34cd0275d2eb19d9d08c3e167f97556e8a2872747f5e65cbebcac8b0c98d83e285f139 + languageName: node + linkType: hard + +"dedent@npm:^1.0.0": + version: 1.5.1 + resolution: "dedent@npm:1.5.1" + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + checksum: c3c300a14edf1bdf5a873f9e4b22e839d62490bc5c8d6169c1f15858a1a76733d06a9a56930e963d677a2ceeca4b6b0894cc5ea2f501aa382ca5b92af3413c2a + languageName: node + linkType: hard + +"deep-equal@npm:^2.0.5": + version: 2.2.3 + resolution: "deep-equal@npm:2.2.3" + dependencies: + array-buffer-byte-length: ^1.0.0 + call-bind: ^1.0.5 + es-get-iterator: ^1.1.3 + get-intrinsic: ^1.2.2 + is-arguments: ^1.1.1 + is-array-buffer: ^3.0.2 + is-date-object: ^1.0.5 + is-regex: ^1.1.4 + is-shared-array-buffer: ^1.0.2 + isarray: ^2.0.5 + object-is: ^1.1.5 + object-keys: ^1.1.1 + object.assign: ^4.1.4 + regexp.prototype.flags: ^1.5.1 + side-channel: ^1.0.4 + which-boxed-primitive: ^1.0.2 + which-collection: ^1.0.1 + which-typed-array: ^1.1.13 + checksum: ee8852f23e4d20a5626c13b02f415ba443a1b30b4b3d39eaf366d59c4a85e6545d7ec917db44d476a85ae5a86064f7e5f7af7479f38f113995ba869f3a1ddc53 + languageName: node + linkType: hard + +"deep-extend@npm:~0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3, deep-is@npm:~0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 + languageName: node + linkType: hard + +"deep-object-diff@npm:^1.1.9": + version: 1.1.9 + resolution: "deep-object-diff@npm:1.1.9" + checksum: ecd42455e4773f653595d28070295e7aaa8402db5f8ab21d0bec115a7cb4de5e207a5665514767da5f025c96597f1d3a0a4888aeb4dd49e03c996871a3aa05ef + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.0 + resolution: "deepmerge@npm:4.3.0" + checksum: c7980eb5c5be040b371f1df0d566473875cfabed9f672ccc177b81ba8eee5686ce2478de2f1d0076391621cbe729e5eacda397179a59ef0f68901849647db126 + languageName: node + linkType: hard + +"defaults@npm:^1.0.3": + version: 1.0.4 + resolution: "defaults@npm:1.0.4" + dependencies: + clone: ^1.0.2 + checksum: 3a88b7a587fc076b84e60affad8b85245c01f60f38fc1d259e7ac1d89eb9ce6abb19e27215de46b98568dd5bc48471730b327637e6f20b0f1bc85cf00440c80a + languageName: node + linkType: hard + +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.2, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + gopd: ^1.0.1 + checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b + languageName: node + linkType: hard + +"define-lazy-prop@npm:^2.0.0": + version: 2.0.0 + resolution: "define-lazy-prop@npm:2.0.0" + checksum: 0115fdb065e0490918ba271d7339c42453d209d4cb619dfe635870d906731eff3e1ade8028bb461ea27ce8264ec5e22c6980612d332895977e89c1bbc80fcee2 + languageName: node + linkType: hard + +"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: ^1.0.1 + has-property-descriptors: ^1.0.0 + object-keys: ^1.1.1 + checksum: b4ccd00597dd46cb2d4a379398f5b19fca84a16f3374e2249201992f36b30f6835949a9429669ee6b41b6e837205a163eadd745e472069e70dfc10f03e5fcc12 + languageName: node + linkType: hard + +"defu@npm:^6.1.3, defu@npm:^6.1.4": + version: 6.1.4 + resolution: "defu@npm:6.1.4" + checksum: 40e3af6338f195ac1564f53d1887fa2d0429ac7e8c081204bc4d29191180059d3952b5f4e08fe5df8d59eb873aa26e9c88b56d4fac699673d4a372c93620b229 + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 + languageName: node + linkType: hard + +"delegates@npm:^1.0.0": + version: 1.0.0 + resolution: "delegates@npm:1.0.0" + checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd + languageName: node + linkType: hard + +"denque@npm:^2.1.0": + version: 2.1.0 + resolution: "denque@npm:2.1.0" + checksum: 1d4ae1d05e59ac3a3481e7b478293f4b4c813819342273f3d5b826c7ffa9753c520919ba264f377e09108d24ec6cf0ec0ac729a5686cbb8f32d797126c5dae74 + languageName: node + linkType: hard + +"depd@npm:^2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a + languageName: node + linkType: hard + +"dequal@npm:^2.0.3": + version: 2.0.3 + resolution: "dequal@npm:2.0.3" + checksum: 8679b850e1a3d0ebbc46ee780d5df7b478c23f335887464023a631d1b9af051ad4a6595a44220f9ff8ff95a8ddccf019b5ad778a976fd7bbf77383d36f412f90 + languageName: node + linkType: hard + +"destr@npm:^2.0.1, destr@npm:^2.0.2, destr@npm:^2.0.3": + version: 2.0.3 + resolution: "destr@npm:2.0.3" + checksum: 4521b145ba6118919a561f7d979d623793695a516d1b9df704de81932601bf9cf21c47278e1cb93a309c88a14f4fd1f18680bb49ebef8b2546cc7f415e7ae48e + languageName: node + linkType: hard + +"detect-browser@npm:5.3.0, detect-browser@npm:^5.3.0": + version: 5.3.0 + resolution: "detect-browser@npm:5.3.0" + checksum: dd6e08d55da1d9e0f22510ac79872078ae03d9dfa13c5e66c96baedc1c86567345a88f96949161f6be8f3e0fafa93bf179bdb1cd311b14f5f163112fcc70ab49 + languageName: node + linkType: hard + +"detect-libc@npm:^1.0.3": + version: 1.0.3 + resolution: "detect-libc@npm:1.0.3" + bin: + detect-libc: ./bin/detect-libc.js + checksum: daaaed925ffa7889bd91d56e9624e6c8033911bb60f3a50a74a87500680652969dbaab9526d1e200a4c94acf80fc862a22131841145a0a8482d60a99c24f4a3e + languageName: node + linkType: hard + +"detect-newline@npm:^3.0.0": + version: 3.1.0 + resolution: "detect-newline@npm:3.1.0" + checksum: ae6cd429c41ad01b164c59ea36f264a2c479598e61cba7c99da24175a7ab80ddf066420f2bec9a1c57a6bead411b4655ff15ad7d281c000a89791f48cbe939e7 + languageName: node + linkType: hard + +"dexie@npm:^3.2.4": + version: 3.2.4 + resolution: "dexie@npm:3.2.4" + checksum: 4e5294a954118b6862c864b8c3970904a1733daebcd919488624520696411e2e81ed1bceeac3634c5c15a21e37ce4b8502ed41c4edfbc5ba3f5925c34d56497b + languageName: node + linkType: hard + +"diff-sequences@npm:^29.4.3": + version: 29.6.3 + resolution: "diff-sequences@npm:29.6.3" + checksum: f4914158e1f2276343d98ff5b31fc004e7304f5470bf0f1adb2ac6955d85a531a6458d33e87667f98f6ae52ebd3891bb47d420bb48a5bd8b7a27ee25b20e33aa + languageName: node + linkType: hard + +"diff@npm:5.0.0": + version: 5.0.0 + resolution: "diff@npm:5.0.0" + checksum: f19fe29284b633afdb2725c2a8bb7d25761ea54d321d8e67987ac851c5294be4afeab532bd84531e02583a3fe7f4014aa314a3eda84f5590e7a9e6b371ef3b46 + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d + languageName: node + linkType: hard + +"difflib@npm:^0.2.4": + version: 0.2.4 + resolution: "difflib@npm:0.2.4" + dependencies: + heap: ">= 0.2.0" + checksum: 4f4237b026263ce7471b77d9019b901c2f358a7da89401a80a84a8c3cdc1643a8e70b7495ccbe686cb4d95492eaf5dac119cd9ecbffe5f06bfc175fbe5c20a27 + languageName: node + linkType: hard + +"dijkstrajs@npm:^1.0.1": + version: 1.0.3 + resolution: "dijkstrajs@npm:1.0.3" + checksum: 82ff2c6633f235dd5e6bed04ec62cdfb1f327b4d7534557bd52f18991313f864ee50654543072fff4384a92b643ada4d5452f006b7098dbdfad6c8744a8c9e08 + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: ^4.0.0 + checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 + languageName: node + linkType: hard + +"doctrine@npm:^2.1.0": + version: 2.1.0 + resolution: "doctrine@npm:2.1.0" + dependencies: + esutils: ^2.0.2 + checksum: a45e277f7feaed309fe658ace1ff286c6e2002ac515af0aaf37145b8baa96e49899638c7cd47dccf84c3d32abfc113246625b3ac8f552d1046072adee13b0dc8 + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: ^2.0.2 + checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce + languageName: node + linkType: hard + +"dom-accessibility-api@npm:^0.5.6, dom-accessibility-api@npm:^0.5.9": + version: 0.5.16 + resolution: "dom-accessibility-api@npm:0.5.16" + checksum: 005eb283caef57fc1adec4d5df4dd49189b628f2f575af45decb210e04d634459e3f1ee64f18b41e2dcf200c844bc1d9279d80807e686a30d69a4756151ad248 + languageName: node + linkType: hard + +"domexception@npm:^1.0.1": + version: 1.0.1 + resolution: "domexception@npm:1.0.1" + dependencies: + webidl-conversions: ^4.0.2 + checksum: f564a9c0915dcb83ceefea49df14aaed106b1468fbe505119e8bcb0b77e242534f3aba861978537c0fc9dc6f35b176d0ffc77b3e342820fb27a8f215e7ae4d52 + languageName: node + linkType: hard + +"domexception@npm:^4.0.0": + version: 4.0.0 + resolution: "domexception@npm:4.0.0" + dependencies: + webidl-conversions: ^7.0.0 + checksum: ddbc1268edf33a8ba02ccc596735ede80375ee0cf124b30d2f05df5b464ba78ef4f49889b6391df4a04954e63d42d5631c7fcf8b1c4f12bc531252977a5f13d5 + languageName: node + linkType: hard + +"ds-test@github:dapphub/ds-test": + version: 1.0.0 + resolution: "ds-test@https://github.com/dapphub/ds-test.git#commit=e282159d5170298eb2455a6c05280ab5a73a4ef0" + checksum: 8f36e20dde868d062841c790fc43c9dd18b93d6180995f378bedaee1f24444950838843c0f2ffa5ac3b8a21b4c29fd97a60725e29e8ff71c9cf28f837614d96f + languageName: node + linkType: hard + +"duplexify@npm:^4.1.2": + version: 4.1.2 + resolution: "duplexify@npm:4.1.2" + dependencies: + end-of-stream: ^1.4.1 + inherits: ^2.0.3 + readable-stream: ^3.1.1 + stream-shift: ^1.0.0 + checksum: 964376c61c0e92f6ed0694b3ba97c84f199413dc40ab8dfdaef80b7a7f4982fcabf796214e28ed614a5bc1ec45488a29b81e7d46fa3f5ddf65bcb118c20145ad + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.4.668": + version: 1.4.692 + resolution: "electron-to-chromium@npm:1.4.692" + checksum: 687e8d3833a32499c157c1d96eb11b840b7de71fa81369934ea51df01448d6408c6eed5f45406768b062fa2a45002795682e8e324bfba70528afd3241f79c049 + languageName: node + linkType: hard + +"elliptic@npm:6.5.4, elliptic@npm:^6.5.4": + version: 6.5.4 + resolution: "elliptic@npm:6.5.4" + dependencies: + bn.js: ^4.11.9 + brorand: ^1.1.0 + hash.js: ^1.0.0 + hmac-drbg: ^1.0.1 + inherits: ^2.0.4 + minimalistic-assert: ^1.0.1 + minimalistic-crypto-utils: ^1.0.1 + checksum: d56d21fd04e97869f7ffcc92e18903b9f67f2d4637a23c860492fbbff5a3155fd9ca0184ce0c865dd6eb2487d234ce9551335c021c376cd2d3b7cb749c7d10f4 + languageName: node + linkType: hard + +"emittery@npm:^0.13.1": + version: 0.13.1 + resolution: "emittery@npm:0.13.1" + checksum: 2b089ab6306f38feaabf4f6f02792f9ec85fc054fda79f44f6790e61bbf6bc4e1616afb9b232e0c5ec5289a8a452f79bfa6d905a6fd64e94b49981f0934001c6 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + languageName: node + linkType: hard + +"encode-utf8@npm:^1.0.2, encode-utf8@npm:^1.0.3": + version: 1.0.3 + resolution: "encode-utf8@npm:1.0.3" + checksum: 550224bf2a104b1d355458c8a82e9b4ea07f9fc78387bc3a49c151b940ad26473de8dc9e121eefc4e84561cb0b46de1e4cd2bc766f72ee145e9ea9541482817f + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: ^0.6.2 + checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f + languageName: node + linkType: hard + +"end-of-stream@npm:^1.4.1": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: ^1.4.0 + checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.12.0": + version: 5.13.0 + resolution: "enhanced-resolve@npm:5.13.0" + dependencies: + graceful-fs: ^4.2.4 + tapable: ^2.2.0 + checksum: 76d6844c4393d76beed5b3ce6cf5a98dee3ad5c84a9887f49ccde1224e3b7af201dfbd5a57ebf2b49f623b74883df262d50ff480d3cc02fc2881fc58b84e1bbe + languageName: node + linkType: hard + +"enquirer@npm:2.3.6": + version: 2.3.6 + resolution: "enquirer@npm:2.3.6" + dependencies: + ansi-colors: ^4.1.1 + checksum: 1c0911e14a6f8d26721c91e01db06092a5f7675159f0261d69c403396a385afd13dd76825e7678f66daffa930cfaa8d45f506fb35f818a2788463d022af1b884 + languageName: node + linkType: hard + +"enquirer@npm:^2.3.6": + version: 2.4.1 + resolution: "enquirer@npm:2.4.1" + dependencies: + ansi-colors: ^4.1.1 + strip-ansi: ^6.0.1 + checksum: f080f11a74209647dbf347a7c6a83c8a47ae1ebf1e75073a808bc1088eb780aa54075bfecd1bcdb3e3c724520edb8e6ee05da031529436b421b71066fcc48cb5 + languageName: node + linkType: hard + +"entities@npm:^4.4.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 853f8ebd5b425d350bffa97dd6958143179a5938352ccae092c62d1267c4e392a039be1bae7d51b6e4ffad25f51f9617531fedf5237f15df302ccfb452cbf2d7 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: ^0.2.1 + checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 + languageName: node + linkType: hard + +"es-abstract@npm:^1.19.0, es-abstract@npm:^1.20.4": + version: 1.21.2 + resolution: "es-abstract@npm:1.21.2" + dependencies: + array-buffer-byte-length: ^1.0.0 + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + es-set-tostringtag: ^2.0.1 + es-to-primitive: ^1.2.1 + function.prototype.name: ^1.1.5 + get-intrinsic: ^1.2.0 + get-symbol-description: ^1.0.0 + globalthis: ^1.0.3 + gopd: ^1.0.1 + has: ^1.0.3 + has-property-descriptors: ^1.0.0 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + internal-slot: ^1.0.5 + is-array-buffer: ^3.0.2 + is-callable: ^1.2.7 + is-negative-zero: ^2.0.2 + is-regex: ^1.1.4 + is-shared-array-buffer: ^1.0.2 + is-string: ^1.0.7 + is-typed-array: ^1.1.10 + is-weakref: ^1.0.2 + object-inspect: ^1.12.3 + object-keys: ^1.1.1 + object.assign: ^4.1.4 + regexp.prototype.flags: ^1.4.3 + safe-regex-test: ^1.0.0 + string.prototype.trim: ^1.2.7 + string.prototype.trimend: ^1.0.6 + string.prototype.trimstart: ^1.0.6 + typed-array-length: ^1.0.4 + unbox-primitive: ^1.0.2 + which-typed-array: ^1.1.9 + checksum: 037f55ee5e1cdf2e5edbab5524095a4f97144d95b94ea29e3611b77d852fd8c8a40e7ae7101fa6a759a9b9b1405f188c3c70928f2d3cd88d543a07fc0d5ad41a + languageName: node + linkType: hard + +"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.2": + version: 1.23.3 + resolution: "es-abstract@npm:1.23.3" + dependencies: + array-buffer-byte-length: ^1.0.1 + arraybuffer.prototype.slice: ^1.0.3 + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.7 + data-view-buffer: ^1.0.1 + data-view-byte-length: ^1.0.1 + data-view-byte-offset: ^1.0.0 + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + es-set-tostringtag: ^2.0.3 + es-to-primitive: ^1.2.1 + function.prototype.name: ^1.1.6 + get-intrinsic: ^1.2.4 + get-symbol-description: ^1.0.2 + globalthis: ^1.0.3 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.2 + has-proto: ^1.0.3 + has-symbols: ^1.0.3 + hasown: ^2.0.2 + internal-slot: ^1.0.7 + is-array-buffer: ^3.0.4 + is-callable: ^1.2.7 + is-data-view: ^1.0.1 + is-negative-zero: ^2.0.3 + is-regex: ^1.1.4 + is-shared-array-buffer: ^1.0.3 + is-string: ^1.0.7 + is-typed-array: ^1.1.13 + is-weakref: ^1.0.2 + object-inspect: ^1.13.1 + object-keys: ^1.1.1 + object.assign: ^4.1.5 + regexp.prototype.flags: ^1.5.2 + safe-array-concat: ^1.1.2 + safe-regex-test: ^1.0.3 + string.prototype.trim: ^1.2.9 + string.prototype.trimend: ^1.0.8 + string.prototype.trimstart: ^1.0.8 + typed-array-buffer: ^1.0.2 + typed-array-byte-length: ^1.0.1 + typed-array-byte-offset: ^1.0.2 + typed-array-length: ^1.0.6 + unbox-primitive: ^1.0.2 + which-typed-array: ^1.1.15 + checksum: f840cf161224252512f9527306b57117192696571e07920f777cb893454e32999206198b4f075516112af6459daca282826d1735c450528470356d09eff3a9ae + languageName: node + linkType: hard + +"es-array-method-boxes-properly@npm:^1.0.0": + version: 1.0.0 + resolution: "es-array-method-boxes-properly@npm:1.0.0" + checksum: 2537fcd1cecf187083890bc6f5236d3a26bf39237433587e5bf63392e88faae929dbba78ff0120681a3f6f81c23fe3816122982c160d63b38c95c830b633b826 + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: ^1.2.4 + checksum: f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 + languageName: node + linkType: hard + +"es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 + languageName: node + linkType: hard + +"es-get-iterator@npm:^1.1.3": + version: 1.1.3 + resolution: "es-get-iterator@npm:1.1.3" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.3 + has-symbols: ^1.0.3 + is-arguments: ^1.1.1 + is-map: ^2.0.2 + is-set: ^2.0.2 + is-string: ^1.0.7 + isarray: ^2.0.5 + stop-iteration-iterator: ^1.0.0 + checksum: 8fa118da42667a01a7c7529f8a8cca514feeff243feec1ce0bb73baaa3514560bd09d2b3438873cf8a5aaec5d52da248131de153b28e2638a061b6e4df13267d + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0": + version: 1.0.0 + resolution: "es-object-atoms@npm:1.0.0" + dependencies: + es-errors: ^1.3.0 + checksum: 26f0ff78ab93b63394e8403c353842b2272836968de4eafe97656adfb8a7c84b9099bf0fe96ed58f4a4cddc860f6e34c77f91649a58a5daa4a9c40b902744e3c + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.1": + version: 2.0.1 + resolution: "es-set-tostringtag@npm:2.0.1" + dependencies: + get-intrinsic: ^1.1.3 + has: ^1.0.3 + has-tostringtag: ^1.0.0 + checksum: ec416a12948cefb4b2a5932e62093a7cf36ddc3efd58d6c58ca7ae7064475ace556434b869b0bbeb0c365f1032a8ccd577211101234b69837ad83ad204fff884 + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.3": + version: 2.0.3 + resolution: "es-set-tostringtag@npm:2.0.3" + dependencies: + get-intrinsic: ^1.2.4 + has-tostringtag: ^1.0.2 + hasown: ^2.0.1 + checksum: 7227fa48a41c0ce83e0377b11130d324ac797390688135b8da5c28994c0165be8b252e15cd1de41e1325e5a5412511586960213e88f9ab4a5e7d028895db5129 + languageName: node + linkType: hard + +"es-shim-unscopables@npm:^1.0.0": + version: 1.0.0 + resolution: "es-shim-unscopables@npm:1.0.0" + dependencies: + has: ^1.0.3 + checksum: 83e95cadbb6ee44d3644dfad60dcad7929edbc42c85e66c3e99aefd68a3a5c5665f2686885cddb47dfeabfd77bd5ea5a7060f2092a955a729bbd8834f0d86fa1 + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.2.1": + version: 1.2.1 + resolution: "es-to-primitive@npm:1.2.1" + dependencies: + is-callable: ^1.1.4 + is-date-object: ^1.0.1 + is-symbol: ^1.0.2 + checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed + languageName: node + linkType: hard + +"esbuild@npm:^0.19.3, esbuild@npm:esbuild@~0.17.6 || ~0.18.0 || ~0.19.0": + version: 0.19.12 + resolution: "esbuild@npm:0.19.12" + dependencies: + "@esbuild/aix-ppc64": 0.19.12 + "@esbuild/android-arm": 0.19.12 + "@esbuild/android-arm64": 0.19.12 + "@esbuild/android-x64": 0.19.12 + "@esbuild/darwin-arm64": 0.19.12 + "@esbuild/darwin-x64": 0.19.12 + "@esbuild/freebsd-arm64": 0.19.12 + "@esbuild/freebsd-x64": 0.19.12 + "@esbuild/linux-arm": 0.19.12 + "@esbuild/linux-arm64": 0.19.12 + "@esbuild/linux-ia32": 0.19.12 + "@esbuild/linux-loong64": 0.19.12 + "@esbuild/linux-mips64el": 0.19.12 + "@esbuild/linux-ppc64": 0.19.12 + "@esbuild/linux-riscv64": 0.19.12 + "@esbuild/linux-s390x": 0.19.12 + "@esbuild/linux-x64": 0.19.12 + "@esbuild/netbsd-x64": 0.19.12 + "@esbuild/openbsd-x64": 0.19.12 + "@esbuild/sunos-x64": 0.19.12 + "@esbuild/win32-arm64": 0.19.12 + "@esbuild/win32-ia32": 0.19.12 + "@esbuild/win32-x64": 0.19.12 + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 2936e29107b43e65a775b78b7bc66ddd7d76febd73840ac7e825fb22b65029422ff51038a08d19b05154f543584bd3afe7d1ef1c63900429475b17fbe61cb61f + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.1.1 + resolution: "escalade@npm:3.1.1" + checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 + languageName: node + linkType: hard + +"escape-string-regexp@npm:4.0.0, escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 + languageName: node + linkType: hard + +"escodegen@npm:1.8.x": + version: 1.8.1 + resolution: "escodegen@npm:1.8.1" + dependencies: + esprima: ^2.7.1 + estraverse: ^1.9.1 + esutils: ^2.0.2 + optionator: ^0.8.1 + source-map: ~0.2.0 + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: ./bin/escodegen.js + esgenerate: ./bin/esgenerate.js + checksum: 99f5579dbc309d8f95f8051cce2f85620c073ff1d4f7b58197addee7e81aeb5281dadfbd446a0885b8fb8c0c47ce5c2cdb5f97dbfddccb5126cca5eb9af73992 + languageName: node + linkType: hard + +"escodegen@npm:^2.0.0": + version: 2.1.0 + resolution: "escodegen@npm:2.1.0" + dependencies: + esprima: ^4.0.1 + estraverse: ^5.2.0 + esutils: ^2.0.2 + source-map: ~0.6.1 + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 096696407e161305cd05aebb95134ad176708bc5cb13d0dcc89a5fcbb959b8ed757e7f2591a5f8036f8f4952d4a724de0df14cd419e29212729fa6df5ce16bf6 + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^8.8.0": + version: 8.8.0 + resolution: "eslint-config-prettier@npm:8.8.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 1e94c3882c4d5e41e1dcfa2c368dbccbfe3134f6ac7d40101644d3bfbe3eb2f2ffac757f3145910b5eacf20c0e85e02b91293d3126d770cbf3dc390b3564681c + languageName: node + linkType: hard + +"eslint-import-resolver-node@npm:^0.3.7": + version: 0.3.7 + resolution: "eslint-import-resolver-node@npm:0.3.7" + dependencies: + debug: ^3.2.7 + is-core-module: ^2.11.0 + resolve: ^1.22.1 + checksum: 3379aacf1d2c6952c1b9666c6fa5982c3023df695430b0d391c0029f6403a7775414873d90f397e98ba6245372b6c8960e16e74d9e4a3b0c0a4582f3bdbe3d6e + languageName: node + linkType: hard + +"eslint-import-resolver-typescript@npm:^3.5.5": + version: 3.5.5 + resolution: "eslint-import-resolver-typescript@npm:3.5.5" + dependencies: + debug: ^4.3.4 + enhanced-resolve: ^5.12.0 + eslint-module-utils: ^2.7.4 + get-tsconfig: ^4.5.0 + globby: ^13.1.3 + is-core-module: ^2.11.0 + is-glob: ^4.0.3 + synckit: ^0.8.5 + peerDependencies: + eslint: "*" + eslint-plugin-import: "*" + checksum: 27e6276fdff5d377c9036362ff736ac29852106e883ff589ea9092dc57d4bc2a67a82d75134221124f05045f9a7e2114a159b2c827d1f9f64d091f7afeab0f58 + languageName: node + linkType: hard + +"eslint-module-utils@npm:^2.7.4": + version: 2.7.4 + resolution: "eslint-module-utils@npm:2.7.4" + dependencies: + debug: ^3.2.7 + peerDependenciesMeta: + eslint: + optional: true + checksum: 5da13645daff145a5c922896b258f8bba560722c3767254e458d894ff5fbb505d6dfd945bffa932a5b0ae06714da2379bd41011c4c20d2d59cc83e23895360f7 + languageName: node + linkType: hard + +"eslint-plugin-es-x@npm:^6.1.0": + version: 6.2.1 + resolution: "eslint-plugin-es-x@npm:6.2.1" + dependencies: + "@eslint-community/eslint-utils": ^4.1.2 + "@eslint-community/regexpp": ^4.5.0 + peerDependencies: + eslint: ">=8" + checksum: 6104f6575b137e4ac9a2036c521bc8c3519ef3459287c55615bea69ea89b95712f7233dbb66f4006f07bcaabb2ec628ef76c47a6c7d6b5ab6056ee3fa38fe04f + languageName: node + linkType: hard + +"eslint-plugin-import@npm:^2.27.5": + version: 2.27.5 + resolution: "eslint-plugin-import@npm:2.27.5" + dependencies: + array-includes: ^3.1.6 + array.prototype.flat: ^1.3.1 + array.prototype.flatmap: ^1.3.1 + debug: ^3.2.7 + doctrine: ^2.1.0 + eslint-import-resolver-node: ^0.3.7 + eslint-module-utils: ^2.7.4 + has: ^1.0.3 + is-core-module: ^2.11.0 + is-glob: ^4.0.3 + minimatch: ^3.1.2 + object.values: ^1.1.6 + resolve: ^1.22.1 + semver: ^6.3.0 + tsconfig-paths: ^3.14.1 + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + checksum: f500571a380167e25d72a4d925ef9a7aae8899eada57653e5f3051ec3d3c16d08271fcefe41a30a9a2f4fefc232f066253673ee4ea77b30dba65ae173dade85d + languageName: node + linkType: hard + +"eslint-plugin-jest@npm:^27.2.3": + version: 27.2.3 + resolution: "eslint-plugin-jest@npm:27.2.3" + dependencies: + "@typescript-eslint/utils": ^5.10.0 + peerDependencies: + "@typescript-eslint/eslint-plugin": ^5.0.0 || ^6.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: "*" + peerDependenciesMeta: + "@typescript-eslint/eslint-plugin": + optional: true + jest: + optional: true + checksum: 4c7e07f52f17749ac6fd0ff5fcd5ce30b88983ba31eeee322e4d48859f55eaa112f06172e586ad2031c00ff28bb2dfdc3d35c83895251b9c0e860fa47dfc5ff4 + languageName: node + linkType: hard + +"eslint-plugin-mocha@npm:^10.1.0": + version: 10.1.0 + resolution: "eslint-plugin-mocha@npm:10.1.0" + dependencies: + eslint-utils: ^3.0.0 + rambda: ^7.1.0 + peerDependencies: + eslint: ">=7.0.0" + checksum: 67c063ba190fe8ab3186baaf800a375e9f16a17f69deaac2ea0d1825f6e4260f9a56bd510ceb2ffbe6644d7090beda0efbd2ab7824e4852ce2abee53a1086179 + languageName: node + linkType: hard + +"eslint-plugin-n@npm:^16.0.0": + version: 16.0.0 + resolution: "eslint-plugin-n@npm:16.0.0" + dependencies: + "@eslint-community/eslint-utils": ^4.4.0 + builtins: ^5.0.1 + eslint-plugin-es-x: ^6.1.0 + ignore: ^5.1.1 + is-core-module: ^2.12.0 + minimatch: ^3.1.2 + resolve: ^1.22.2 + semver: ^7.5.0 + peerDependencies: + eslint: ">=7.0.0" + checksum: 77bb74747ee021cd33d6027a1e13620a910a05755e42e29b4f810ef52800ae62bd21057c5e7de66dc3b8cbc9bc8332eeea4c9e14ed889284e549278d1520fe3e + languageName: node + linkType: hard + +"eslint-plugin-prettier@npm:^4.2.1": + version: 4.2.1 + resolution: "eslint-plugin-prettier@npm:4.2.1" + dependencies: + prettier-linter-helpers: ^1.0.0 + peerDependencies: + eslint: ">=7.28.0" + prettier: ">=2.0.0" + peerDependenciesMeta: + eslint-config-prettier: + optional: true + checksum: b9e839d2334ad8ec7a5589c5cb0f219bded260839a857d7a486997f9870e95106aa59b8756ff3f37202085ebab658de382b0267cae44c3a7f0eb0bcc03a4f6d6 + languageName: node + linkType: hard + +"eslint-scope@npm:^5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^4.1.1 + checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^5.2.0 + checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e + languageName: node + linkType: hard + +"eslint-utils@npm:^3.0.0": + version: 3.0.0 + resolution: "eslint-utils@npm:3.0.0" + dependencies: + eslint-visitor-keys: ^2.0.0 + peerDependencies: + eslint: ">=5" + checksum: 0668fe02f5adab2e5a367eee5089f4c39033af20499df88fe4e6aba2015c20720404d8c3d6349b6f716b08fdf91b9da4e5d5481f265049278099c4c836ccb619 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^2.0.0": + version: 2.1.0 + resolution: "eslint-visitor-keys@npm:2.1.0" + checksum: e3081d7dd2611a35f0388bbdc2f5da60b3a3c5b8b6e928daffff7391146b434d691577aa95064c8b7faad0b8a680266bcda0a42439c18c717b80e6718d7e267d + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 + languageName: node + linkType: hard + +"eslint@npm:^8.53.0": + version: 8.53.0 + resolution: "eslint@npm:8.53.0" + dependencies: + "@eslint-community/eslint-utils": ^4.2.0 + "@eslint-community/regexpp": ^4.6.1 + "@eslint/eslintrc": ^2.1.3 + "@eslint/js": 8.53.0 + "@humanwhocodes/config-array": ^0.11.13 + "@humanwhocodes/module-importer": ^1.0.1 + "@nodelib/fs.walk": ^1.2.8 + "@ungap/structured-clone": ^1.2.0 + ajv: ^6.12.4 + chalk: ^4.0.0 + cross-spawn: ^7.0.2 + debug: ^4.3.2 + doctrine: ^3.0.0 + escape-string-regexp: ^4.0.0 + eslint-scope: ^7.2.2 + eslint-visitor-keys: ^3.4.3 + espree: ^9.6.1 + esquery: ^1.4.2 + esutils: ^2.0.2 + fast-deep-equal: ^3.1.3 + file-entry-cache: ^6.0.1 + find-up: ^5.0.0 + glob-parent: ^6.0.2 + globals: ^13.19.0 + graphemer: ^1.4.0 + ignore: ^5.2.0 + imurmurhash: ^0.1.4 + is-glob: ^4.0.0 + is-path-inside: ^3.0.3 + js-yaml: ^4.1.0 + json-stable-stringify-without-jsonify: ^1.0.1 + levn: ^0.4.1 + lodash.merge: ^4.6.2 + minimatch: ^3.1.2 + natural-compare: ^1.4.0 + optionator: ^0.9.3 + strip-ansi: ^6.0.1 + text-table: ^0.2.0 + bin: + eslint: bin/eslint.js + checksum: 2da808655c7aa4b33f8970ba30d96b453c3071cc4d6cd60d367163430677e32ff186b65270816b662d29139283138bff81f28dddeb2e73265495245a316ed02c + languageName: node + linkType: hard + +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: ^8.9.0 + acorn-jsx: ^5.3.2 + eslint-visitor-keys: ^3.4.1 + checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 + languageName: node + linkType: hard + +"esprima@npm:2.7.x, esprima@npm:^2.7.1": + version: 2.7.3 + resolution: "esprima@npm:2.7.3" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 55584508dca0551885e62c3369bc4a783bd948b43e2f034f05c2a37f3ca398db99f072ab228234e9cab09af8dc8c65d6ca7de3a975f2a296b34d1a3aba7e89f1 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0, esprima@npm:^4.0.1": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 + languageName: node + linkType: hard + +"esquery@npm:^1.4.2": + version: 1.5.0 + resolution: "esquery@npm:1.5.0" + dependencies: + estraverse: ^5.1.0 + checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: ^5.2.0 + checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 + languageName: node + linkType: hard + +"estraverse@npm:^1.9.1": + version: 1.9.3 + resolution: "estraverse@npm:1.9.3" + checksum: 78fa96317500e7783d48297dbd4c7f8735ddeb970be2981b485639ffa77578d05b8f781332622e436f2e9e533f32923c62c2e6463291e577ceeaf2776ac5e4b5 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b + languageName: node + linkType: hard + +"estree-walker@npm:^2.0.2": + version: 2.0.2 + resolution: "estree-walker@npm:2.0.2" + checksum: 6151e6f9828abe2259e57f5fd3761335bb0d2ebd76dc1a01048ccee22fabcfef3c0859300f6d83ff0d1927849368775ec5a6d265dde2f6de5a1be1721cd94efc + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 + languageName: node + linkType: hard + +"eth-block-tracker@npm:^7.1.0": + version: 7.1.0 + resolution: "eth-block-tracker@npm:7.1.0" + dependencies: + "@metamask/eth-json-rpc-provider": ^1.0.0 + "@metamask/safe-event-emitter": ^3.0.0 + "@metamask/utils": ^5.0.1 + json-rpc-random-id: ^1.0.1 + pify: ^3.0.0 + checksum: 1d019f261e0ef07387cd74538b160700caa35ba9859ab9d4e5137c48bf9c92822c3b4ade40f8a504f16cb813de4c317c5378d047625ddf04592e256be8842588 + languageName: node + linkType: hard + +"eth-json-rpc-filters@npm:^6.0.0": + version: 6.0.1 + resolution: "eth-json-rpc-filters@npm:6.0.1" + dependencies: + "@metamask/safe-event-emitter": ^3.0.0 + async-mutex: ^0.2.6 + eth-query: ^2.1.2 + json-rpc-engine: ^6.1.0 + pify: ^5.0.0 + checksum: 216f7417417599a48273b08fb2894581175276fe21cb1c9ffa66e98a9c2a67bc0ac821ad2ca163fdb8e8de0960aea0d9c5e53aee9d5dcfec355abf020e9458c5 + languageName: node + linkType: hard + +"eth-query@npm:^2.1.2": + version: 2.1.2 + resolution: "eth-query@npm:2.1.2" + dependencies: + json-rpc-random-id: ^1.0.0 + xtend: ^4.0.1 + checksum: 83daa0e28452c54722aec78cd24d036bad5b6e7c08035d98e10d4bea11f71662f12cab63ebd8a848d4df46ad316503d54ecccb41c9244d2ea8b29364b0a20201 + languageName: node + linkType: hard + +"eth-rpc-errors@npm:^4.0.2": + version: 4.0.3 + resolution: "eth-rpc-errors@npm:4.0.3" + dependencies: + fast-safe-stringify: ^2.0.6 + checksum: 5fa31d1a10fdb340733b9a55e38e7687222c501052ca20743cef4d0c911a9bbcc0cad54aa6bf3e4b428604c071ff519803060e1cbc79ddb7c9257c11d407d32a + languageName: node + linkType: hard + +"ethereum-bloom-filters@npm:^1.0.6": + version: 1.0.10 + resolution: "ethereum-bloom-filters@npm:1.0.10" + dependencies: + js-sha3: ^0.8.0 + checksum: 4019cc6f9274ae271a52959194a72f6e9b013366f168f922dc3b349319faf7426bf1010125ee0676b4f75714fe4a440edd4e7e62342c121a046409f4cd4c0af9 + languageName: node + linkType: hard + +"ethereum-cryptography@npm:^0.1.3": + version: 0.1.3 + resolution: "ethereum-cryptography@npm:0.1.3" + dependencies: + "@types/pbkdf2": ^3.0.0 + "@types/secp256k1": ^4.0.1 + blakejs: ^1.1.0 + browserify-aes: ^1.2.0 + bs58check: ^2.1.2 + create-hash: ^1.2.0 + create-hmac: ^1.1.7 + hash.js: ^1.1.7 + keccak: ^3.0.0 + pbkdf2: ^3.0.17 + randombytes: ^2.1.0 + safe-buffer: ^5.1.2 + scrypt-js: ^3.0.0 + secp256k1: ^4.0.1 + setimmediate: ^1.0.5 + checksum: 54bae7a4a96bd81398cdc35c91cfcc74339f71a95ed1b5b694663782e69e8e3afd21357de3b8bac9ff4877fd6f043601e200a7ad9133d94be6fd7d898ee0a449 + languageName: node + linkType: hard + +"ethereum-cryptography@npm:^1.2.0": + version: 1.2.0 + resolution: "ethereum-cryptography@npm:1.2.0" + dependencies: + "@noble/hashes": 1.2.0 + "@noble/secp256k1": 1.7.1 + "@scure/bip32": 1.1.5 + "@scure/bip39": 1.1.1 + checksum: 97e8e8253cb9f5a9271bd0201c37609c451c890eb85883b9c564f14743c3d7c673287406c93bf5604307593ee298ad9a03983388b85c11ca61461b9fc1a4f2c7 + languageName: node + linkType: hard + +"ethereum-cryptography@npm:^2.0.0, ethereum-cryptography@npm:^2.1.2": + version: 2.1.2 + resolution: "ethereum-cryptography@npm:2.1.2" + dependencies: + "@noble/curves": 1.1.0 + "@noble/hashes": 1.3.1 + "@scure/bip32": 1.3.1 + "@scure/bip39": 1.2.1 + checksum: 2e8f7b8cc90232ae838ab6a8167708e8362621404d26e79b5d9e762c7b53d699f7520aff358d9254de658fcd54d2d0af168ff909943259ed27dc4cef2736410c + languageName: node + linkType: hard + +"ethereumjs-util@npm:^7.1.0, ethereumjs-util@npm:^7.1.2": + version: 7.1.5 + resolution: "ethereumjs-util@npm:7.1.5" + dependencies: + "@types/bn.js": ^5.1.0 + bn.js: ^5.1.2 + create-hash: ^1.1.2 + ethereum-cryptography: ^0.1.3 + rlp: ^2.2.4 + checksum: 27a3c79d6e06b2df34b80d478ce465b371c8458b58f5afc14d91c8564c13363ad336e6e83f57eb0bd719fde94d10ee5697ceef78b5aa932087150c5287b286d1 + languageName: node + linkType: hard + +"ethereumjs-wallet@npm:^1.0.1": + version: 1.0.2 + resolution: "ethereumjs-wallet@npm:1.0.2" + dependencies: + aes-js: ^3.1.2 + bs58check: ^2.1.2 + ethereum-cryptography: ^0.1.3 + ethereumjs-util: ^7.1.2 + randombytes: ^2.1.0 + scrypt-js: ^3.0.1 + utf8: ^3.0.0 + uuid: ^8.3.2 + checksum: 555effe571c633ca9189e08639928e7bfcb601474f5a37653a3d028b06a10fb8577408c32d425ccecb3ac25d7165322cb9786239fa09ce276532d262206feb8c + languageName: node + linkType: hard + +"ethers@npm:^5.5.3, ethers@npm:^5.7.0, ethers@npm:^5.7.2": + version: 5.7.2 + resolution: "ethers@npm:5.7.2" + dependencies: + "@ethersproject/abi": 5.7.0 + "@ethersproject/abstract-provider": 5.7.0 + "@ethersproject/abstract-signer": 5.7.0 + "@ethersproject/address": 5.7.0 + "@ethersproject/base64": 5.7.0 + "@ethersproject/basex": 5.7.0 + "@ethersproject/bignumber": 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/constants": 5.7.0 + "@ethersproject/contracts": 5.7.0 + "@ethersproject/hash": 5.7.0 + "@ethersproject/hdnode": 5.7.0 + "@ethersproject/json-wallets": 5.7.0 + "@ethersproject/keccak256": 5.7.0 + "@ethersproject/logger": 5.7.0 + "@ethersproject/networks": 5.7.1 + "@ethersproject/pbkdf2": 5.7.0 + "@ethersproject/properties": 5.7.0 + "@ethersproject/providers": 5.7.2 + "@ethersproject/random": 5.7.0 + "@ethersproject/rlp": 5.7.0 + "@ethersproject/sha2": 5.7.0 + "@ethersproject/signing-key": 5.7.0 + "@ethersproject/solidity": 5.7.0 + "@ethersproject/strings": 5.7.0 + "@ethersproject/transactions": 5.7.0 + "@ethersproject/units": 5.7.0 + "@ethersproject/wallet": 5.7.0 + "@ethersproject/web": 5.7.1 + "@ethersproject/wordlists": 5.7.0 + checksum: b7c08cf3e257185a7946117dbbf764433b7ba0e77c27298dec6088b3bc871aff711462b0621930c56880ff0a7ceb8b1d3a361ffa259f93377b48e34107f62553 + languageName: node + linkType: hard + +"ethjs-unit@npm:0.1.6": + version: 0.1.6 + resolution: "ethjs-unit@npm:0.1.6" + dependencies: + bn.js: 4.11.6 + number-to-bn: 1.7.0 + checksum: df6b4752ff7461a59a20219f4b1684c631ea601241c39660e3f6c6bd63c950189723841c22b3c6c0ebeb3c9fc99e0e803e3c613101206132603705fcbcf4def5 + languageName: node + linkType: hard + +"eval@npm:0.1.8": + version: 0.1.8 + resolution: "eval@npm:0.1.8" + dependencies: + "@types/node": "*" + require-like: ">= 0.1.1" + checksum: d005567f394cfbe60948e34982e4637d2665030f9aa7dcac581ea6f9ec6eceb87133ed3dc0ae21764aa362485c242a731dbb6371f1f1a86807c58676431e9d1a + languageName: node + linkType: hard + +"eventemitter3@npm:^4.0.7": + version: 4.0.7 + resolution: "eventemitter3@npm:4.0.7" + checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374 + languageName: node + linkType: hard + +"eventemitter3@npm:^5.0.1": + version: 5.0.1 + resolution: "eventemitter3@npm:5.0.1" + checksum: 543d6c858ab699303c3c32e0f0f47fc64d360bf73c3daf0ac0b5079710e340d6fe9f15487f94e66c629f5f82cd1a8678d692f3dbb6f6fcd1190e1b97fcad36f8 + languageName: node + linkType: hard + +"events@npm:^3.3.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 + languageName: node + linkType: hard + +"evp_bytestokey@npm:^1.0.3": + version: 1.0.3 + resolution: "evp_bytestokey@npm:1.0.3" + dependencies: + md5.js: ^1.3.4 + node-gyp: latest + safe-buffer: ^5.1.1 + checksum: ad4e1577f1a6b721c7800dcc7c733fe01f6c310732bb5bf2240245c2a5b45a38518b91d8be2c610611623160b9d1c0e91f1ce96d639f8b53e8894625cf20fa45 + languageName: node + linkType: hard + +"execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: ^7.0.3 + get-stream: ^6.0.0 + human-signals: ^2.1.0 + is-stream: ^2.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^4.0.1 + onetime: ^5.1.2 + signal-exit: ^3.0.3 + strip-final-newline: ^2.0.0 + checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 + languageName: node + linkType: hard + +"execa@npm:^7.0.0": + version: 7.1.1 + resolution: "execa@npm:7.1.1" + dependencies: + cross-spawn: ^7.0.3 + get-stream: ^6.0.1 + human-signals: ^4.3.0 + is-stream: ^3.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^5.1.0 + onetime: ^6.0.0 + signal-exit: ^3.0.7 + strip-final-newline: ^3.0.0 + checksum: 21fa46fc69314ace4068cf820142bdde5b643a5d89831c2c9349479c1555bff137a291b8e749e7efca36535e4e0a8c772c11008ca2e84d2cbd6ca141a3c8f937 + languageName: node + linkType: hard + +"execa@npm:^8.0.1": + version: 8.0.1 + resolution: "execa@npm:8.0.1" + dependencies: + cross-spawn: ^7.0.3 + get-stream: ^8.0.1 + human-signals: ^5.0.0 + is-stream: ^3.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^5.1.0 + onetime: ^6.0.0 + signal-exit: ^4.1.0 + strip-final-newline: ^3.0.0 + checksum: cac1bf86589d1d9b73bdc5dda65c52012d1a9619c44c526891956745f7b366ca2603d29fe3f7460bacc2b48c6eab5d6a4f7afe0534b31473d3708d1265545e1f + languageName: node + linkType: hard + +"exit@npm:^0.1.2": + version: 0.1.2 + resolution: "exit@npm:0.1.2" + checksum: abc407f07a875c3961e4781dfcb743b58d6c93de9ab263f4f8c9d23bb6da5f9b7764fc773f86b43dd88030444d5ab8abcb611cb680fba8ca075362b77114bba3 + languageName: node + linkType: hard + +"expect@npm:^29.0.0, expect@npm:^29.6.2": + version: 29.6.2 + resolution: "expect@npm:29.6.2" + dependencies: + "@jest/expect-utils": ^29.6.2 + "@types/node": "*" + jest-get-type: ^29.4.3 + jest-matcher-utils: ^29.6.2 + jest-message-util: ^29.6.2 + jest-util: ^29.6.2 + checksum: 71f7b0c560e58bf6d27e0fded261d4bdb7ef81552a6bb4bd1ee09ce7a1f7dca67fbf83cf9b07a6645a88ef52e65085a0dcbe17f6c063b53ff7c2f0f3ea4ef69e + languageName: node + linkType: hard + +"fake-indexeddb@npm:^4.0.1": + version: 4.0.2 + resolution: "fake-indexeddb@npm:4.0.2" + dependencies: + realistic-structured-clone: ^3.0.0 + checksum: ad257e5cc6273d9ea667b4129d8b0798830d56a68c7c77ddba752b3fd0088cb33e34b9569b218d16dfc8a78733d360d325f89c2ce352b70a0587c1f46f6f881d + languageName: node + linkType: hard + +"fast-check@npm:^3.10.0": + version: 3.11.0 + resolution: "fast-check@npm:3.11.0" + dependencies: + pure-rand: ^6.0.0 + checksum: 6ec642fcfe69faa56a42785cb7b373905357db3c7373add4b84d97b8b0fa2a7efa0e119159d42e5fe5607f64cb3948a1986c45a0484156060ce168186bdbdb4a + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d + languageName: node + linkType: hard + +"fast-diff@npm:^1.1.2, fast-diff@npm:^1.2.0": + version: 1.2.0 + resolution: "fast-diff@npm:1.2.0" + checksum: 1b5306eaa9e826564d9e5ffcd6ebd881eb5f770b3f977fcbf38f05c824e42172b53c79920e8429c54eb742ce15a0caf268b0fdd5b38f6de52234c4a8368131ae + languageName: node + linkType: hard + +"fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" + dependencies: + "@nodelib/fs.stat": ^2.0.2 + "@nodelib/fs.walk": ^1.2.3 + glob-parent: ^5.1.2 + merge2: ^1.3.0 + micromatch: ^4.0.4 + checksum: 900e4979f4dbc3313840078419245621259f349950411ca2fa445a2f9a1a6d98c3b5e7e0660c5ccd563aa61abe133a21765c6c0dec8e57da1ba71d8000b05ec1 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6, fast-levenshtein@npm:~2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c + languageName: node + linkType: hard + +"fast-redact@npm:^3.0.0": + version: 3.3.0 + resolution: "fast-redact@npm:3.3.0" + checksum: 3f7becc70a5a2662a9cbfdc52a4291594f62ae998806ee00315af307f32d9559dbf512146259a22739ee34401950ef47598c1f4777d33b0ed5027203d67f549c + languageName: node + linkType: hard + +"fast-safe-stringify@npm:^2.0.6": + version: 2.1.1 + resolution: "fast-safe-stringify@npm:2.1.1" + checksum: a851cbddc451745662f8f00ddb622d6766f9bd97642dabfd9a405fb0d646d69fc0b9a1243cbf67f5f18a39f40f6fa821737651ff1bceeba06c9992ca2dc5bd3d + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.15.0 + resolution: "fastq@npm:1.15.0" + dependencies: + reusify: ^1.0.4 + checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a + languageName: node + linkType: hard + +"fb-watchman@npm:^2.0.0": + version: 2.0.2 + resolution: "fb-watchman@npm:2.0.2" + dependencies: + bser: 2.1.1 + checksum: b15a124cef28916fe07b400eb87cbc73ca082c142abf7ca8e8de6af43eca79ca7bd13eb4d4d48240b3bd3136eaac40d16e42d6edf87a8e5d1dd8070626860c78 + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: ^3.0.4 + checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + languageName: node + linkType: hard + +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" + dependencies: + to-regex-range: ^5.0.1 + checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 + languageName: node + linkType: hard + +"filter-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "filter-obj@npm:1.1.0" + checksum: cf2104a7c45ff48e7f505b78a3991c8f7f30f28bd8106ef582721f321f1c6277f7751aacd5d83026cb079d9d5091082f588d14a72e7c5d720ece79118fa61e10 + languageName: node + linkType: hard + +"find-cache-dir@npm:^2.0.0": + version: 2.1.0 + resolution: "find-cache-dir@npm:2.1.0" + dependencies: + commondir: ^1.0.1 + make-dir: ^2.0.0 + pkg-dir: ^3.0.0 + checksum: 60ad475a6da9f257df4e81900f78986ab367d4f65d33cf802c5b91e969c28a8762f098693d7a571b6e4dd4c15166c2da32ae2d18b6766a18e2071079448fdce4 + languageName: node + linkType: hard + +"find-replace@npm:^3.0.0": + version: 3.0.0 + resolution: "find-replace@npm:3.0.0" + dependencies: + array-back: ^3.0.1 + checksum: 6b04bcfd79027f5b84aa1dfe100e3295da989bdac4b4de6b277f4d063e78f5c9e92ebc8a1fec6dd3b448c924ba404ee051cc759e14a3ee3e825fa1361025df08 + languageName: node + linkType: hard + +"find-up@npm:5.0.0, find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: ^6.0.0 + path-exists: ^4.0.0 + checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 + languageName: node + linkType: hard + +"find-up@npm:^3.0.0": + version: 3.0.0 + resolution: "find-up@npm:3.0.0" + dependencies: + locate-path: ^3.0.0 + checksum: 38eba3fe7a66e4bc7f0f5a1366dc25508b7cfc349f852640e3678d26ad9a6d7e2c43eff0a472287de4a9753ef58f066a0ea892a256fa3636ad51b3fe1e17fae9 + languageName: node + linkType: hard + +"find-up@npm:^4.0.0, find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: ^5.0.0 + path-exists: ^4.0.0 + checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.0.4 + resolution: "flat-cache@npm:3.0.4" + dependencies: + flatted: ^3.1.0 + rimraf: ^3.0.2 + checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 + languageName: node + linkType: hard + +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: 12a1536ac746db74881316a181499a78ef953632ddd28050b7a3a43c62ef5462e3357c8c29d76072bb635f147f7a9a1f0c02efef6b4be28f8db62ceb3d5c7f5d + languageName: node + linkType: hard + +"flatted@npm:^3.1.0": + version: 3.2.7 + resolution: "flatted@npm:3.2.7" + checksum: 427633049d55bdb80201c68f7eb1cbd533e03eac541f97d3aecab8c5526f12a20ccecaeede08b57503e772c769e7f8680b37e8d482d1e5f8d7e2194687f9ea35 + languageName: node + linkType: hard + +"fmix@npm:^0.1.0": + version: 0.1.0 + resolution: "fmix@npm:0.1.0" + dependencies: + imul: ^1.0.0 + checksum: c465344d4f169eaf10d45c33949a1e7a633f09dba2ac7063ce8ae8be743df5979d708f7f24900163589f047f5194ac5fc2476177ce31175e8805adfa7b8fb7a4 + languageName: node + linkType: hard + +"follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.14.9, follow-redirects@npm:^1.15.0": + version: 1.15.5 + resolution: "follow-redirects@npm:1.15.5" + peerDependenciesMeta: + debug: + optional: true + checksum: 5ca49b5ce6f44338cbfc3546823357e7a70813cecc9b7b768158a1d32c1e62e7407c944402a918ea8c38ae2e78266312d617dc68783fac502cbb55e1047b34ec + languageName: node + linkType: hard + +"for-each@npm:^0.3.3": + version: 0.3.3 + resolution: "for-each@npm:0.3.3" + dependencies: + is-callable: ^1.1.3 + checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 + languageName: node + linkType: hard + +"forge-std@github:foundry-rs/forge-std#v1": + version: 1.7.6 + resolution: "forge-std@https://github.com/foundry-rs/forge-std.git#commit=ae570fec082bfe1c1f45b0acca4a2b4f84d345ce" + checksum: fa42ca0255b610bc3f0081d3d53b191fa9986ada1870efb0f18197f1e19c83c7b0d4ad50c8e073e3980e83b77d7a5841cbe09692a1e72b57b2e48f51c46e8398 + languageName: node + linkType: hard + +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c + languageName: node + linkType: hard + +"fs-extra@npm:11.1.1": + version: 11.1.1 + resolution: "fs-extra@npm:11.1.1" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: fb883c68245b2d777fbc1f2082c9efb084eaa2bbf9fddaa366130d196c03608eebef7fb490541276429ee1ca99f317e2d73e96f5ca0999eefedf5a624ae1edfd + languageName: node + linkType: hard + +"fs-extra@npm:^10.0.0": + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 + languageName: node + linkType: hard + +"fs-extra@npm:^11.1.0": + version: 11.2.0 + resolution: "fs-extra@npm:11.2.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: b12e42fa40ba47104202f57b8480dd098aa931c2724565e5e70779ab87605665594e76ee5fb00545f772ab9ace167fe06d2ab009c416dc8c842c5ae6df7aa7e8 + languageName: node + linkType: hard + +"fs-extra@npm:^7.0.0, fs-extra@npm:^7.0.1": + version: 7.0.1 + resolution: "fs-extra@npm:7.0.1" + dependencies: + graceful-fs: ^4.1.2 + jsonfile: ^4.0.0 + universalify: ^0.1.0 + checksum: 141b9dccb23b66a66cefdd81f4cda959ff89282b1d721b98cea19ba08db3dcbe6f862f28841f3cf24bb299e0b7e6c42303908f65093cb7e201708e86ea5a8dcf + languageName: node + linkType: hard + +"fs-extra@npm:^8.1.0": + version: 8.1.0 + resolution: "fs-extra@npm:8.1.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^4.0.0 + universalify: ^0.1.0 + checksum: bf44f0e6cea59d5ce071bba4c43ca76d216f89e402dc6285c128abc0902e9b8525135aa808adad72c9d5d218e9f4bcc63962815529ff2f684ad532172a284880 + languageName: node + linkType: hard + +"fs-extra@npm:^9.1.0": + version: 9.1.0 + resolution: "fs-extra@npm:9.1.0" + dependencies: + at-least-node: ^1.0.0 + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: ba71ba32e0faa74ab931b7a0031d1523c66a73e225de7426e275e238e312d07313d2da2d33e34a52aa406c8763ade5712eb3ec9ba4d9edce652bcacdc29e6b20 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: ^3.0.0 + checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 + languageName: node + linkType: hard + +"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: latest + checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin, fsevents@patch:fsevents@~2.3.3#~builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: latest + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.1, function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.5": + version: 1.1.5 + resolution: "function.prototype.name@npm:1.1.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.19.0 + functions-have-names: ^1.2.2 + checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.6": + version: 1.1.6 + resolution: "function.prototype.name@npm:1.1.6" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + functions-have-names: ^1.2.3 + checksum: 7a3f9bd98adab09a07f6e1f03da03d3f7c26abbdeaeee15223f6c04a9fb5674792bdf5e689dac19b97ac71de6aad2027ba3048a9b883aa1b3173eed6ab07f479 + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.2, functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 + languageName: node + linkType: hard + +"gauge@npm:^4.0.3": + version: 4.0.4 + resolution: "gauge@npm:4.0.4" + dependencies: + aproba: ^1.0.3 || ^2.0.0 + color-support: ^1.1.3 + console-control-strings: ^1.1.0 + has-unicode: ^2.0.1 + signal-exit: ^3.0.7 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + wide-align: ^1.1.5 + checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d + languageName: node + linkType: hard + +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: a7437e58c6be12aa6c90f7730eac7fa9833dc78872b4ad2963d2031b00a3367a93f98aec75f9aaac7220848e4026d67a8655e870b24f20a543d103c0d65952ec + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.1, get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" + dependencies: + es-errors: ^1.3.0 + function-bind: ^1.1.2 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + hasown: ^2.0.0 + checksum: 414e3cdf2c203d1b9d7d33111df746a4512a1aa622770b361dadddf8ed0b5aeb26c560f49ca077e24bfafb0acb55ca908d1f709216ccba33ffc548ec8a79a951 + languageName: node + linkType: hard + +"get-package-type@npm:^0.1.0": + version: 0.1.0 + resolution: "get-package-type@npm:0.1.0" + checksum: bba0811116d11e56d702682ddef7c73ba3481f114590e705fc549f4d868972263896af313c57a25c076e3c0d567e11d919a64ba1b30c879be985fc9d44f96148 + languageName: node + linkType: hard + +"get-port-please@npm:^3.1.2": + version: 3.1.2 + resolution: "get-port-please@npm:3.1.2" + checksum: 8e65b56459ead2f31c446d76bb8eb639c33e04e72b07a4dd5d8acc39738f12962591e90b2befecf10492844d0d11c2122c281f5204ee48692d4a8ba0ec68733a + languageName: node + linkType: hard + +"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad + languageName: node + linkType: hard + +"get-stream@npm:^8.0.1": + version: 8.0.1 + resolution: "get-stream@npm:8.0.1" + checksum: 01e3d3cf29e1393f05f44d2f00445c5f9ec3d1c49e8179b31795484b9c117f4c695e5e07b88b50785d5c8248a788c85d9913a79266fc77e3ef11f78f10f1b974 + languageName: node + linkType: hard + +"get-symbol-description@npm:^1.0.0": + version: 1.0.0 + resolution: "get-symbol-description@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.1 + checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 + languageName: node + linkType: hard + +"get-symbol-description@npm:^1.0.2": + version: 1.0.2 + resolution: "get-symbol-description@npm:1.0.2" + dependencies: + call-bind: ^1.0.5 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.4 + checksum: e1cb53bc211f9dbe9691a4f97a46837a553c4e7caadd0488dc24ac694db8a390b93edd412b48dcdd0b4bbb4c595de1709effc75fc87c0839deedc6968f5bd973 + languageName: node + linkType: hard + +"get-tsconfig@npm:^4.5.0": + version: 4.5.0 + resolution: "get-tsconfig@npm:4.5.0" + checksum: 687ee2bd69a5a07db2e2edeb4d6c41c3debb38f6281a66beb643e3f5b520252e27fcbbb5702bdd9a5f05dcf8c1d2e0150a4d8a960ad75cbdea74e06a51e91b02 + languageName: node + linkType: hard + +"ghost-testrpc@npm:^0.0.2": + version: 0.0.2 + resolution: "ghost-testrpc@npm:0.0.2" + dependencies: + chalk: ^2.4.2 + node-emoji: ^1.10.0 + bin: + testrpc-sc: ./index.js + checksum: 3f86326d32f5e96c9356381837edde7dd0f23dcb7223aa73e02816256b84703cb76ce922987054a05b65963326088e99a4aa142d4b467ddda7c28547ed915d6d + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: ^4.0.1 + checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: ^4.0.3 + checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 + languageName: node + linkType: hard + +"glob@npm:7.1.7": + version: 7.1.7 + resolution: "glob@npm:7.1.7" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.0.4 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: b61f48973bbdcf5159997b0874a2165db572b368b931135832599875919c237fc05c12984e38fe828e69aa8a921eb0e8a4997266211c517c9cfaae8a93988bb8 + languageName: node + linkType: hard + +"glob@npm:8.1.0, glob@npm:^8.0.1, glob@npm:^8.0.3": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^5.0.1 + once: ^1.3.0 + checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 + languageName: node + linkType: hard + +"glob@npm:^5.0.15": + version: 5.0.15 + resolution: "glob@npm:5.0.15" + dependencies: + inflight: ^1.0.4 + inherits: 2 + minimatch: 2 || 3 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: f9742448303460672607e569457f1b57e486a79a985e269b69465834d2075b243378225f65dc54c09fcd4b75e4fb34442aec88f33f8c65fa4abccc8ee2dc2f5d + languageName: node + linkType: hard + +"glob@npm:^7.0.0, glob@npm:^7.1.3, glob@npm:^7.1.4": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.1.1 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + languageName: node + linkType: hard + +"global-modules@npm:^2.0.0": + version: 2.0.0 + resolution: "global-modules@npm:2.0.0" + dependencies: + global-prefix: ^3.0.0 + checksum: d6197f25856c878c2fb5f038899f2dca7cbb2f7b7cf8999660c0104972d5cfa5c68b5a0a77fa8206bb536c3903a4615665acb9709b4d80846e1bb47eaef65430 + languageName: node + linkType: hard + +"global-prefix@npm:^3.0.0": + version: 3.0.0 + resolution: "global-prefix@npm:3.0.0" + dependencies: + ini: ^1.3.5 + kind-of: ^6.0.2 + which: ^1.3.1 + checksum: 8a82fc1d6f22c45484a4e34656cc91bf021a03e03213b0035098d605bfc612d7141f1e14a21097e8a0413b4884afd5b260df0b6a25605ce9d722e11f1df2881d + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e + languageName: node + linkType: hard + +"globals@npm:^13.19.0": + version: 13.20.0 + resolution: "globals@npm:13.20.0" + dependencies: + type-fest: ^0.20.2 + checksum: ad1ecf914bd051325faad281d02ea2c0b1df5d01bd94d368dcc5513340eac41d14b3c61af325768e3c7f8d44576e72780ec0b6f2d366121f8eec6e03c3a3b97a + languageName: node + linkType: hard + +"globalthis@npm:^1.0.3": + version: 1.0.3 + resolution: "globalthis@npm:1.0.3" + dependencies: + define-properties: ^1.1.3 + checksum: fbd7d760dc464c886d0196166d92e5ffb4c84d0730846d6621a39fbbc068aeeb9c8d1421ad330e94b7bca4bb4ea092f5f21f3d36077812af5d098b4dc006c998 + languageName: node + linkType: hard + +"globalyzer@npm:0.1.0": + version: 0.1.0 + resolution: "globalyzer@npm:0.1.0" + checksum: 419a0f95ba542534fac0842964d31b3dc2936a479b2b1a8a62bad7e8b61054faa9b0a06ad9f2e12593396b9b2621cac93358d9b3071d33723fb1778608d358a1 + languageName: node + linkType: hard + +"globby@npm:11.1.0, globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + dependencies: + array-union: ^2.1.0 + dir-glob: ^3.0.1 + fast-glob: ^3.2.9 + ignore: ^5.2.0 + merge2: ^1.4.1 + slash: ^3.0.0 + checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 + languageName: node + linkType: hard + +"globby@npm:^10.0.1": + version: 10.0.2 + resolution: "globby@npm:10.0.2" + dependencies: + "@types/glob": ^7.1.1 + array-union: ^2.1.0 + dir-glob: ^3.0.1 + fast-glob: ^3.0.3 + glob: ^7.1.3 + ignore: ^5.1.1 + merge2: ^1.2.3 + slash: ^3.0.0 + checksum: 167cd067f2cdc030db2ec43232a1e835fa06217577d545709dbf29fd21631b30ff8258705172069c855dc4d5766c3b2690834e35b936fbff01ad0329fb95a26f + languageName: node + linkType: hard + +"globby@npm:^13.1.3": + version: 13.1.4 + resolution: "globby@npm:13.1.4" + dependencies: + dir-glob: ^3.0.1 + fast-glob: ^3.2.11 + ignore: ^5.2.0 + merge2: ^1.4.1 + slash: ^4.0.0 + checksum: e8bc13879972082d590cd1b0e27080d90d2e12fff7eeb2cee9329c29115ace14cc5b9f899e3d6beb136ba826307a727016658919a6f383e1511d698acee81741 + languageName: node + linkType: hard + +"globrex@npm:^0.1.2": + version: 0.1.2 + resolution: "globrex@npm:0.1.2" + checksum: adca162494a176ce9ecf4dd232f7b802956bb1966b37f60c15e49d2e7d961b66c60826366dc2649093cad5a0d69970cfa8875bd1695b5a1a2f33dcd2aa88da3c + languageName: node + linkType: hard + +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: ^1.1.3 + checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 + languageName: node + linkType: hard + +"h3@npm:^1.10.2, h3@npm:^1.8.2": + version: 1.11.1 + resolution: "h3@npm:1.11.1" + dependencies: + cookie-es: ^1.0.0 + crossws: ^0.2.2 + defu: ^6.1.4 + destr: ^2.0.3 + iron-webcrypto: ^1.0.0 + ohash: ^1.1.3 + radix3: ^1.1.0 + ufo: ^1.4.0 + uncrypto: ^0.1.3 + unenv: ^1.9.0 + checksum: 505ef90cf095f5a6c1e7fb7f26e83b44477634c31eda4459b683e96837ba33d163e89599b3a883e645688b761ffa754ff1f77a432c4e229bf5ab916272e0bee5 + languageName: node + linkType: hard + +"handlebars@npm:^4.0.1, handlebars@npm:^4.7.7": + version: 4.7.8 + resolution: "handlebars@npm:4.7.8" + dependencies: + minimist: ^1.2.5 + neo-async: ^2.6.2 + source-map: ^0.6.1 + uglify-js: ^3.1.4 + wordwrap: ^1.0.0 + dependenciesMeta: + uglify-js: + optional: true + bin: + handlebars: bin/handlebars + checksum: 00e68bb5c183fd7b8b63322e6234b5ac8fbb960d712cb3f25587d559c2951d9642df83c04a1172c918c41bcfc81bfbd7a7718bbce93b893e0135fc99edea93ff + languageName: node + linkType: hard + +"hardhat-deploy-ethers@npm:^0.3.0-beta.11": + version: 0.3.0-beta.13 + resolution: "hardhat-deploy-ethers@npm:0.3.0-beta.13" + peerDependencies: + ethers: ^5.0.0 + hardhat: ^2.0.0 + checksum: 45206bf8d088cda08822ecf79d73e4027d8a4777cc23c3ef94568e316c45b8597130d72826fb2417edd32fe4b3dc54097161bef577663769b5c47b8262b983bb + languageName: node + linkType: hard + +"hardhat-deploy@npm:^0.11.23": + version: 0.11.45 + resolution: "hardhat-deploy@npm:0.11.45" + dependencies: + "@ethersproject/abi": ^5.7.0 + "@ethersproject/abstract-signer": ^5.7.0 + "@ethersproject/address": ^5.7.0 + "@ethersproject/bignumber": ^5.7.0 + "@ethersproject/bytes": ^5.7.0 + "@ethersproject/constants": ^5.7.0 + "@ethersproject/contracts": ^5.7.0 + "@ethersproject/providers": ^5.7.2 + "@ethersproject/solidity": ^5.7.0 + "@ethersproject/transactions": ^5.7.0 + "@ethersproject/wallet": ^5.7.0 + "@types/qs": ^6.9.7 + axios: ^0.21.1 + chalk: ^4.1.2 + chokidar: ^3.5.2 + debug: ^4.3.2 + enquirer: ^2.3.6 + ethers: ^5.7.0 + form-data: ^4.0.0 + fs-extra: ^10.0.0 + match-all: ^1.2.6 + murmur-128: ^0.2.1 + qs: ^6.9.4 + zksync-web3: ^0.14.3 + checksum: 7ecce33c3305857bdd1873a25d391e27ae9f581df75757035cb028ace7bb5fbb83f053435e843bc3d925e7fd8412c3dc582797fe5b4bbe1fef7f3dd989a7c878 + languageName: node + linkType: hard + +"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b + languageName: node + linkType: hard + +"has-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "has-flag@npm:1.0.0" + checksum: ce3f8ae978e70f16e4bbe17d3f0f6d6c0a3dd3b62a23f97c91d0fda9ed8e305e13baf95cc5bee4463b9f25ac9f5255de113165c5fb285e01b8065b2ac079b301 + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.1, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: ^1.0.0 + checksum: fcbb246ea2838058be39887935231c6d5788babed499d0e9d0cc5737494c48aba4fe17ba1449e0d0fbbb1e36175442faa37f9c427ae357d6ccb1d895fbcd3de3 + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "has-proto@npm:1.0.1" + checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e + languageName: node + linkType: hard + +"has-proto@npm:^1.0.3": + version: 1.0.3 + resolution: "has-proto@npm:1.0.3" + checksum: fe7c3d50b33f50f3933a04413ed1f69441d21d2d2944f81036276d30635cad9279f6b43bc8f32036c31ebdfcf6e731150f46c1907ad90c669ffe9b066c3ba5c4 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.1, has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: ^1.0.3 + checksum: 999d60bb753ad714356b2c6c87b7fb74f32463b8426e159397da4bde5bca7e598ab1073f4d8d4deafac297f2eb311484cd177af242776bf05f0d11565680468d + languageName: node + linkType: hard + +"has-unicode@npm:^2.0.1": + version: 2.0.1 + resolution: "has-unicode@npm:2.0.1" + checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 + languageName: node + linkType: hard + +"has@npm:^1.0.3": + version: 1.0.3 + resolution: "has@npm:1.0.3" + dependencies: + function-bind: ^1.1.1 + checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 + languageName: node + linkType: hard + +"hash-base@npm:^3.0.0": + version: 3.1.0 + resolution: "hash-base@npm:3.1.0" + dependencies: + inherits: ^2.0.4 + readable-stream: ^3.6.0 + safe-buffer: ^5.2.0 + checksum: 26b7e97ac3de13cb23fc3145e7e3450b0530274a9562144fc2bf5c1e2983afd0e09ed7cc3b20974ba66039fad316db463da80eb452e7373e780cbee9a0d2f2dc + languageName: node + linkType: hard + +"hash.js@npm:1.1.7, hash.js@npm:^1.0.0, hash.js@npm:^1.0.3, hash.js@npm:^1.1.7": + version: 1.1.7 + resolution: "hash.js@npm:1.1.7" + dependencies: + inherits: ^2.0.3 + minimalistic-assert: ^1.0.1 + checksum: e350096e659c62422b85fa508e4b3669017311aa4c49b74f19f8e1bc7f3a54a584fdfd45326d4964d6011f2b2d882e38bea775a96046f2a61b7779a979629d8f + languageName: node + linkType: hard + +"hasown@npm:^2.0.0": + version: 2.0.1 + resolution: "hasown@npm:2.0.1" + dependencies: + function-bind: ^1.1.2 + checksum: 9081c382a4fe8a62639a8da5c7d3322b203c319147e48783763dd741863d9f2dcaa743574fe2a1283871c445d8ba99ea45d5fff384e5ad27ca9dd7a367d79de0 + languageName: node + linkType: hard + +"hasown@npm:^2.0.1, hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: ^1.1.2 + checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db + languageName: node + linkType: hard + +"he@npm:1.2.0": + version: 1.2.0 + resolution: "he@npm:1.2.0" + bin: + he: bin/he + checksum: 3d4d6babccccd79c5c5a3f929a68af33360d6445587d628087f39a965079d84f18ce9c3d3f917ee1e3978916fc833bb8b29377c3b403f919426f91bc6965e7a7 + languageName: node + linkType: hard + +"heap@npm:>= 0.2.0": + version: 0.2.7 + resolution: "heap@npm:0.2.7" + checksum: b0f3963a799e02173f994c452921a777f2b895b710119df999736bfed7477235c2860c423d9aea18a9f3b3d065cb1114d605c208cfcb8d0ac550f97ec5d28cb0 + languageName: node + linkType: hard + +"hey-listen@npm:^1.0.8": + version: 1.0.8 + resolution: "hey-listen@npm:1.0.8" + checksum: 6bad60b367688f5348e25e7ca3276a74b59ac5a09b0455e6ff8ab7d4a9e38cd2116c708a7dcd8a954d27253ce1d8717ec891d175723ea739885b828cf44e4072 + languageName: node + linkType: hard + +"hmac-drbg@npm:^1.0.1": + version: 1.0.1 + resolution: "hmac-drbg@npm:1.0.1" + dependencies: + hash.js: ^1.0.3 + minimalistic-assert: ^1.0.0 + minimalistic-crypto-utils: ^1.0.1 + checksum: bd30b6a68d7f22d63f10e1888aee497d7c2c5c0bb469e66bbdac99f143904d1dfe95f8131f95b3e86c86dd239963c9d972fcbe147e7cffa00e55d18585c43fe0 + languageName: node + linkType: hard + +"homedir-polyfill@npm:^1.0.1": + version: 1.0.3 + resolution: "homedir-polyfill@npm:1.0.3" + dependencies: + parse-passwd: ^1.0.0 + checksum: 18dd4db87052c6a2179d1813adea0c4bfcfa4f9996f0e226fefb29eb3d548e564350fa28ec46b0bf1fbc0a1d2d6922ceceb80093115ea45ff8842a4990139250 + languageName: node + linkType: hard + +"html-encoding-sniffer@npm:^3.0.0": + version: 3.0.0 + resolution: "html-encoding-sniffer@npm:3.0.0" + dependencies: + whatwg-encoding: ^2.0.0 + checksum: 8d806aa00487e279e5ccb573366a951a9f68f65c90298eac9c3a2b440a7ffe46615aff2995a2f61c6746c639234e6179a97e18ca5ccbbf93d3725ef2099a4502 + languageName: node + linkType: hard + +"html-escaper@npm:^2.0.0": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: d2df2da3ad40ca9ee3a39c5cc6475ef67c8f83c234475f24d8e9ce0dc80a2c82df8e1d6fa78ddd1e9022a586ea1bd247a615e80a5cd9273d90111ddda7d9e974 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.0": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" + dependencies: + "@tootallnate/once": 2 + agent-base: 6 + debug: 4 + checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 + languageName: node + linkType: hard + +"http-shutdown@npm:^1.2.2": + version: 1.2.2 + resolution: "http-shutdown@npm:1.2.2" + checksum: 5dccd94f4fe4f51f9cbd7ec4586121160cd6470728e581662ea8032724440d891c4c92b8210b871ac468adadb3c99c40098ad0f752a781a550abae49dfa26206 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^5.0.0, https-proxy-agent@npm:^5.0.1": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: 6 + debug: 4 + checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 + languageName: node + linkType: hard + +"human-signals@npm:^2.1.0": + version: 2.1.0 + resolution: "human-signals@npm:2.1.0" + checksum: b87fd89fce72391625271454e70f67fe405277415b48bcc0117ca73d31fa23a4241787afdc8d67f5a116cf37258c052f59ea82daffa72364d61351423848e3b8 + languageName: node + linkType: hard + +"human-signals@npm:^4.3.0": + version: 4.3.0 + resolution: "human-signals@npm:4.3.0" + checksum: 662b976b1063a8afb8fd7fa50bde6975997e17ea6ceba2aad54aacf1dc239a2cd7d14d27b3ceca0c6288627f4b45c56c2c89618455ff52cd9377c02d6328cd7c + languageName: node + linkType: hard + +"human-signals@npm:^5.0.0": + version: 5.0.0 + resolution: "human-signals@npm:5.0.0" + checksum: 6504560d5ed91444f16bea3bd9dfc66110a339442084e56c3e7fa7bbdf3f406426d6563d662bdce67064b165eac31eeabfc0857ed170aaa612cf14ec9f9a464c + languageName: node + linkType: hard + +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" + dependencies: + ms: ^2.0.0 + checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 + languageName: node + linkType: hard + +"husky@npm:^8.0.1": + version: 8.0.3 + resolution: "husky@npm:8.0.3" + bin: + husky: lib/bin.js + checksum: 837bc7e4413e58c1f2946d38fb050f5d7324c6f16b0fd66411ffce5703b294bd21429e8ba58711cd331951ee86ed529c5be4f76805959ff668a337dbfa82a1b0 + languageName: node + linkType: hard + +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: ">= 2.1.2 < 3.0.0" + checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf + languageName: node + linkType: hard + +"idb-keyval@npm:^6.2.1": + version: 6.2.1 + resolution: "idb-keyval@npm:6.2.1" + checksum: 7c0836f832096086e99258167740181132a71dd2694c8b8454a4f5ec69114ba6d70983115153306f0b6de1c8d3bad04f67eed3dff8f50c96815b9985d6d78470 + languageName: node + linkType: hard + +"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e + languageName: node + linkType: hard + +"ignore@npm:^5.1.1, ignore@npm:^5.2.0, ignore@npm:^5.2.4": + version: 5.2.4 + resolution: "ignore@npm:5.2.4" + checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: ^1.0.0 + resolve-from: ^4.0.0 + checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + languageName: node + linkType: hard + +"import-local@npm:^3.0.2": + version: 3.1.0 + resolution: "import-local@npm:3.1.0" + dependencies: + pkg-dir: ^4.2.0 + resolve-cwd: ^3.0.0 + bin: + import-local-fixture: fixtures/cli.js + checksum: bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd + languageName: node + linkType: hard + +"imul@npm:^1.0.0": + version: 1.0.1 + resolution: "imul@npm:1.0.1" + checksum: 6c2af3d5f09e2135e14d565a2c108412b825b221eb2c881f9130467f2adccf7ae201773ae8bcf1be169e2d090567a1fdfa9cf20d3b7da7b9cecb95b920ff3e52 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 + languageName: node + linkType: hard + +"infer-owner@npm:^1.0.4": + version: 1.0.4 + resolution: "infer-owner@npm:1.0.4" + checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: ^1.3.0 + wrappy: 1 + checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 + languageName: node + linkType: hard + +"ini@npm:^1.3.5": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 + languageName: node + linkType: hard + +"internal-slot@npm:^1.0.4, internal-slot@npm:^1.0.5, internal-slot@npm:^1.0.7": + version: 1.0.7 + resolution: "internal-slot@npm:1.0.7" + dependencies: + es-errors: ^1.3.0 + hasown: ^2.0.0 + side-channel: ^1.0.4 + checksum: cadc5eea5d7d9bc2342e93aae9f31f04c196afebb11bde97448327049f492cd7081e18623ae71388aac9cd237b692ca3a105be9c68ac39c1dec679d7409e33eb + languageName: node + linkType: hard + +"interpret@npm:^1.0.0": + version: 1.4.0 + resolution: "interpret@npm:1.4.0" + checksum: 2e5f51268b5941e4a17e4ef0575bc91ed0ab5f8515e3cf77486f7c14d13f3010df9c0959f37063dcc96e78d12dc6b0bb1b9e111cdfe69771f4656d2993d36155 + languageName: node + linkType: hard + +"ioredis@npm:^5.3.2": + version: 5.3.2 + resolution: "ioredis@npm:5.3.2" + dependencies: + "@ioredis/commands": ^1.1.1 + cluster-key-slot: ^1.1.0 + debug: ^4.3.4 + denque: ^2.1.0 + lodash.defaults: ^4.2.0 + lodash.isarguments: ^3.1.0 + redis-errors: ^1.2.0 + redis-parser: ^3.0.0 + standard-as-callback: ^2.1.0 + checksum: 9a23559133e862a768778301efb68ae8c2af3c33562174b54a4c2d6574b976e85c75a4c34857991af733e35c48faf4c356e7daa8fb0a3543d85ff1768c8754bc + languageName: node + linkType: hard + +"ip@npm:^2.0.0": + version: 2.0.0 + resolution: "ip@npm:2.0.0" + checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 + languageName: node + linkType: hard + +"iron-webcrypto@npm:^1.0.0": + version: 1.0.0 + resolution: "iron-webcrypto@npm:1.0.0" + checksum: bbd96cbbfec7d072296bc7464763b96555bdadb12aca50f1f1c7e4fcdc6acb102bc3488333e924f94404dd50eda24f84b67ad28323b9138ec7255a023e8dc19e + languageName: node + linkType: hard + +"is-arguments@npm:^1.1.1": + version: 1.1.1 + resolution: "is-arguments@npm:1.1.1" + dependencies: + call-bind: ^1.0.2 + has-tostringtag: ^1.0.0 + checksum: 7f02700ec2171b691ef3e4d0e3e6c0ba408e8434368504bb593d0d7c891c0dbfda6d19d30808b904a6cb1929bca648c061ba438c39f296c2a8ca083229c49f27 + languageName: node + linkType: hard + +"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": + version: 3.0.2 + resolution: "is-array-buffer@npm:3.0.2" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.0 + is-typed-array: ^1.1.10 + checksum: dcac9dda66ff17df9cabdc58214172bf41082f956eab30bb0d86bc0fab1e44b690fc8e1f855cf2481245caf4e8a5a006a982a71ddccec84032ed41f9d8da8c14 + languageName: node + linkType: hard + +"is-array-buffer@npm:^3.0.4": + version: 3.0.4 + resolution: "is-array-buffer@npm:3.0.4" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.1 + checksum: e4e3e6ef0ff2239e75371d221f74bc3c26a03564a22efb39f6bb02609b598917ddeecef4e8c877df2a25888f247a98198959842a5e73236bc7f22cabdf6351a7 + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f + languageName: node + linkType: hard + +"is-bigint@npm:^1.0.1": + version: 1.0.4 + resolution: "is-bigint@npm:1.0.4" + dependencies: + has-bigints: ^1.0.1 + checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: ^2.0.0 + checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c + languageName: node + linkType: hard + +"is-boolean-object@npm:^1.1.0": + version: 1.1.2 + resolution: "is-boolean-object@npm:1.1.2" + dependencies: + call-bind: ^1.0.2 + has-tostringtag: ^1.0.0 + checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 + languageName: node + linkType: hard + +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac + languageName: node + linkType: hard + +"is-core-module@npm:^2.11.0, is-core-module@npm:^2.12.0, is-core-module@npm:^2.13.0": + version: 2.13.1 + resolution: "is-core-module@npm:2.13.1" + dependencies: + hasown: ^2.0.0 + checksum: 256559ee8a9488af90e4bad16f5583c6d59e92f0742e9e8bb4331e758521ee86b810b93bae44f390766ffbc518a0488b18d9dab7da9a5ff997d499efc9403f7c + languageName: node + linkType: hard + +"is-data-view@npm:^1.0.1": + version: 1.0.1 + resolution: "is-data-view@npm:1.0.1" + dependencies: + is-typed-array: ^1.1.13 + checksum: 4ba4562ac2b2ec005fefe48269d6bd0152785458cd253c746154ffb8a8ab506a29d0cfb3b74af87513843776a88e4981ae25c89457bf640a33748eab1a7216b5 + languageName: node + linkType: hard + +"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": + version: 1.0.5 + resolution: "is-date-object@npm:1.0.5" + dependencies: + has-tostringtag: ^1.0.0 + checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc + languageName: node + linkType: hard + +"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": + version: 2.2.1 + resolution: "is-docker@npm:2.2.1" + bin: + is-docker: cli.js + checksum: 3fef7ddbf0be25958e8991ad941901bf5922ab2753c46980b60b05c1bf9c9c2402d35e6dc32e4380b980ef5e1970a5d9d5e5aa2e02d77727c3b6b5e918474c56 + languageName: node + linkType: hard + +"is-docker@npm:^3.0.0": + version: 3.0.0 + resolution: "is-docker@npm:3.0.0" + bin: + is-docker: cli.js + checksum: b698118f04feb7eaf3338922bd79cba064ea54a1c3db6ec8c0c8d8ee7613e7e5854d802d3ef646812a8a3ace81182a085dfa0a71cc68b06f3fa794b9783b3c90 + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^4.0.0": + version: 4.0.0 + resolution: "is-fullwidth-code-point@npm:4.0.0" + checksum: 8ae89bf5057bdf4f57b346fb6c55e9c3dd2549983d54191d722d5c739397a903012cc41a04ee3403fd872e811243ef91a7c5196da7b5841dc6b6aae31a264a8d + languageName: node + linkType: hard + +"is-generator-fn@npm:^2.0.0": + version: 2.1.0 + resolution: "is-generator-fn@npm:2.1.0" + checksum: a6ad5492cf9d1746f73b6744e0c43c0020510b59d56ddcb78a91cbc173f09b5e6beff53d75c9c5a29feb618bfef2bf458e025ecf3a57ad2268e2fb2569f56215 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: ^2.1.1 + checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 + languageName: node + linkType: hard + +"is-hex-prefixed@npm:1.0.0": + version: 1.0.0 + resolution: "is-hex-prefixed@npm:1.0.0" + checksum: 5ac58e6e528fb029cc43140f6eeb380fad23d0041cc23154b87f7c9a1b728bcf05909974e47248fd0b7fcc11ba33cf7e58d64804883056fabd23e2b898be41de + languageName: node + linkType: hard + +"is-inside-container@npm:^1.0.0": + version: 1.0.0 + resolution: "is-inside-container@npm:1.0.0" + dependencies: + is-docker: ^3.0.0 + bin: + is-inside-container: cli.js + checksum: c50b75a2ab66ab3e8b92b3bc534e1ea72ca25766832c0623ac22d134116a98bcf012197d1caabe1d1c4bd5f84363d4aa5c36bb4b585fbcaf57be172cd10a1a03 + languageName: node + linkType: hard + +"is-interactive@npm:^1.0.0": + version: 1.0.0 + resolution: "is-interactive@npm:1.0.0" + checksum: 824808776e2d468b2916cdd6c16acacebce060d844c35ca6d82267da692e92c3a16fdba624c50b54a63f38bdc4016055b6f443ce57d7147240de4f8cdabaf6f9 + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 + languageName: node + linkType: hard + +"is-map@npm:^2.0.1, is-map@npm:^2.0.2": + version: 2.0.2 + resolution: "is-map@npm:2.0.2" + checksum: ace3d0ecd667bbdefdb1852de601268f67f2db725624b1958f279316e13fecb8fa7df91fd60f690d7417b4ec180712f5a7ee967008e27c65cfd475cc84337728 + languageName: node + linkType: hard + +"is-negative-zero@npm:^2.0.2": + version: 2.0.2 + resolution: "is-negative-zero@npm:2.0.2" + checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a + languageName: node + linkType: hard + +"is-negative-zero@npm:^2.0.3": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: c1e6b23d2070c0539d7b36022d5a94407132411d01aba39ec549af824231f3804b1aea90b5e4e58e807a65d23ceb538ed6e355ce76b267bdd86edb757ffcbdcd + languageName: node + linkType: hard + +"is-number-object@npm:^1.0.4": + version: 1.0.7 + resolution: "is-number-object@npm:1.0.7" + dependencies: + has-tostringtag: ^1.0.0 + checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 + languageName: node + linkType: hard + +"is-plain-obj@npm:^2.1.0": + version: 2.1.0 + resolution: "is-plain-obj@npm:2.1.0" + checksum: cec9100678b0a9fe0248a81743041ed990c2d4c99f893d935545cfbc42876cbe86d207f3b895700c690ad2fa520e568c44afc1605044b535a7820c1d40e38daa + languageName: node + linkType: hard + +"is-plain-object@npm:^2.0.4": + version: 2.0.4 + resolution: "is-plain-object@npm:2.0.4" + dependencies: + isobject: ^3.0.1 + checksum: 2a401140cfd86cabe25214956ae2cfee6fbd8186809555cd0e84574f88de7b17abacb2e477a6a658fa54c6083ecbda1e6ae404c7720244cd198903848fca70ca + languageName: node + linkType: hard + +"is-potential-custom-element-name@npm:^1.0.1": + version: 1.0.1 + resolution: "is-potential-custom-element-name@npm:1.0.1" + checksum: ced7bbbb6433a5b684af581872afe0e1767e2d1146b2207ca0068a648fb5cab9d898495d1ac0583524faaf24ca98176a7d9876363097c2d14fee6dd324f3a1ab + languageName: node + linkType: hard + +"is-regex@npm:^1.1.4": + version: 1.1.4 + resolution: "is-regex@npm:1.1.4" + dependencies: + call-bind: ^1.0.2 + has-tostringtag: ^1.0.0 + checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 + languageName: node + linkType: hard + +"is-set@npm:^2.0.1, is-set@npm:^2.0.2": + version: 2.0.2 + resolution: "is-set@npm:2.0.2" + checksum: b64343faf45e9387b97a6fd32be632ee7b269bd8183701f3b3f5b71a7cf00d04450ed8669d0bd08753e08b968beda96fca73a10fd0ff56a32603f64deba55a57 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "is-shared-array-buffer@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "is-shared-array-buffer@npm:1.0.3" + dependencies: + call-bind: ^1.0.7 + checksum: a4fff602c309e64ccaa83b859255a43bb011145a42d3f56f67d9268b55bc7e6d98a5981a1d834186ad3105d6739d21547083fe7259c76c0468483fc538e716d8 + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 + languageName: node + linkType: hard + +"is-stream@npm:^3.0.0": + version: 3.0.0 + resolution: "is-stream@npm:3.0.0" + checksum: 172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 + languageName: node + linkType: hard + +"is-string@npm:^1.0.5, is-string@npm:^1.0.7": + version: 1.0.7 + resolution: "is-string@npm:1.0.7" + dependencies: + has-tostringtag: ^1.0.0 + checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": + version: 1.0.4 + resolution: "is-symbol@npm:1.0.4" + dependencies: + has-symbols: ^1.0.2 + checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.9": + version: 1.1.10 + resolution: "is-typed-array@npm:1.1.10" + dependencies: + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-tostringtag: ^1.0.0 + checksum: aac6ecb59d4c56a1cdeb69b1f129154ef462bbffe434cb8a8235ca89b42f258b7ae94073c41b3cb7bce37f6a1733ad4499f07882d5d5093a7ba84dfc4ebb8017 + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.13": + version: 1.1.13 + resolution: "is-typed-array@npm:1.1.13" + dependencies: + which-typed-array: ^1.1.14 + checksum: 150f9ada183a61554c91e1c4290086d2c100b0dff45f60b028519be72a8db964da403c48760723bf5253979b8dffe7b544246e0e5351dcd05c5fdb1dcc1dc0f0 + languageName: node + linkType: hard + +"is-typedarray@npm:1.0.0, is-typedarray@npm:^1.0.0": + version: 1.0.0 + resolution: "is-typedarray@npm:1.0.0" + checksum: 3508c6cd0a9ee2e0df2fa2e9baabcdc89e911c7bd5cf64604586697212feec525aa21050e48affb5ffc3df20f0f5d2e2cf79b08caa64e1ccc9578e251763aef7 + languageName: node + linkType: hard + +"is-unicode-supported@npm:^0.1.0": + version: 0.1.0 + resolution: "is-unicode-supported@npm:0.1.0" + checksum: a2aab86ee7712f5c2f999180daaba5f361bdad1efadc9610ff5b8ab5495b86e4f627839d085c6530363c6d6d4ecbde340fb8e54bdb83da4ba8e0865ed5513c52 + languageName: node + linkType: hard + +"is-weakmap@npm:^2.0.1": + version: 2.0.1 + resolution: "is-weakmap@npm:2.0.1" + checksum: 1222bb7e90c32bdb949226e66d26cb7bce12e1e28e3e1b40bfa6b390ba3e08192a8664a703dff2a00a84825f4e022f9cd58c4599ff9981ab72b1d69479f4f7f6 + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2": + version: 1.0.2 + resolution: "is-weakref@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de + languageName: node + linkType: hard + +"is-weakset@npm:^2.0.1": + version: 2.0.2 + resolution: "is-weakset@npm:2.0.2" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.1 + checksum: 5d8698d1fa599a0635d7ca85be9c26d547b317ed8fd83fc75f03efbe75d50001b5eececb1e9971de85fcde84f69ae6f8346bc92d20d55d46201d328e4c74a367 + languageName: node + linkType: hard + +"is-wsl@npm:^2.2.0": + version: 2.2.0 + resolution: "is-wsl@npm:2.2.0" + dependencies: + is-docker: ^2.0.0 + checksum: 20849846ae414997d290b75e16868e5261e86ff5047f104027026fd61d8b5a9b0b3ade16239f35e1a067b3c7cc02f70183cb661010ed16f4b6c7c93dad1b19d8 + languageName: node + linkType: hard + +"is-wsl@npm:^3.1.0": + version: 3.1.0 + resolution: "is-wsl@npm:3.1.0" + dependencies: + is-inside-container: ^1.0.0 + checksum: f9734c81f2f9cf9877c5db8356bfe1ff61680f1f4c1011e91278a9c0564b395ae796addb4bf33956871041476ec82c3e5260ed57b22ac91794d4ae70a1d2f0a9 + languageName: node + linkType: hard + +"is64bit@npm:^2.0.0": + version: 2.0.0 + resolution: "is64bit@npm:2.0.0" + dependencies: + system-architecture: ^0.1.0 + checksum: 253079e64b6f9bb90295a63b73a046bea67364cdc104bc5abeffcf4cbc52b3e66b0e921cb14f686deb71b5cab628f9f490845c1194c6e94f84068d177c7f15cd + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 + languageName: node + linkType: hard + +"isobject@npm:^3.0.1": + version: 3.0.1 + resolution: "isobject@npm:3.0.1" + checksum: db85c4c970ce30693676487cca0e61da2ca34e8d4967c2e1309143ff910c207133a969f9e4ddb2dc6aba670aabce4e0e307146c310350b298e74a31f7d464703 + languageName: node + linkType: hard + +"isomorphic-unfetch@npm:3.1.0": + version: 3.1.0 + resolution: "isomorphic-unfetch@npm:3.1.0" + dependencies: + node-fetch: ^2.6.1 + unfetch: ^4.2.0 + checksum: 82b92fe4ec2823a81ab0fc0d11bd94d710e6f9a940d56b3cba31896d4345ec9ffc7949f4ff31ebcae84f6b95f7ebf3474c4c7452b834eb4078ea3f2c37e459c5 + languageName: node + linkType: hard + +"isows@npm:1.0.3": + version: 1.0.3 + resolution: "isows@npm:1.0.3" + peerDependencies: + ws: "*" + checksum: 9cacd5cf59f67deb51e825580cd445ab1725ecb05a67c704050383fb772856f3cd5e7da8ad08f5a3bd2823680d77d099459d0c6a7037972a74d6429af61af440 + languageName: node + linkType: hard + +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 2367407a8d13982d8f7a859a35e7f8dd5d8f75aae4bb5484ede3a9ea1b426dc245aff28b976a2af48ee759fdd9be374ce2bd2669b644f31e76c5f46a2e29a831 + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^5.0.4, istanbul-lib-instrument@npm:^5.1.0": + version: 5.2.1 + resolution: "istanbul-lib-instrument@npm:5.2.1" + dependencies: + "@babel/core": ^7.12.3 + "@babel/parser": ^7.14.7 + "@istanbuljs/schema": ^0.1.2 + istanbul-lib-coverage: ^3.2.0 + semver: ^6.3.0 + checksum: bf16f1803ba5e51b28bbd49ed955a736488381e09375d830e42ddeb403855b2006f850711d95ad726f2ba3f1ae8e7366de7e51d2b9ac67dc4d80191ef7ddf272 + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^3.0.0": + version: 3.0.1 + resolution: "istanbul-lib-report@npm:3.0.1" + dependencies: + istanbul-lib-coverage: ^3.0.0 + make-dir: ^4.0.0 + supports-color: ^7.1.0 + checksum: fd17a1b879e7faf9bb1dc8f80b2a16e9f5b7b8498fe6ed580a618c34df0bfe53d2abd35bf8a0a00e628fb7405462576427c7df20bbe4148d19c14b431c974b21 + languageName: node + linkType: hard + +"istanbul-lib-source-maps@npm:^4.0.0": + version: 4.0.1 + resolution: "istanbul-lib-source-maps@npm:4.0.1" + dependencies: + debug: ^4.1.1 + istanbul-lib-coverage: ^3.0.0 + source-map: ^0.6.1 + checksum: 21ad3df45db4b81852b662b8d4161f6446cd250c1ddc70ef96a585e2e85c26ed7cd9c2a396a71533cfb981d1a645508bc9618cae431e55d01a0628e7dec62ef2 + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.3": + version: 3.1.6 + resolution: "istanbul-reports@npm:3.1.6" + dependencies: + html-escaper: ^2.0.0 + istanbul-lib-report: ^3.0.0 + checksum: 44c4c0582f287f02341e9720997f9e82c071627e1e862895745d5f52ec72c9b9f38e1d12370015d2a71dcead794f34c7732aaef3fab80a24bc617a21c3d911d6 + languageName: node + linkType: hard + +"javascript-stringify@npm:^2.0.1": + version: 2.1.0 + resolution: "javascript-stringify@npm:2.1.0" + checksum: 009981ec84299da88795fc764221ed213e3d52251cc93a396430a7a02ae09f1163a9be36a36808689681a8e6113cf00fe97ec2eea2552df48111f79be59e9358 + languageName: node + linkType: hard + +"jest-changed-files@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-changed-files@npm:29.5.0" + dependencies: + execa: ^5.0.0 + p-limit: ^3.1.0 + checksum: a67a7cb3c11f8f92bd1b7c79e84f724cbd11a9ad51f3cdadafe3ce7ee3c79ee50dbea128f920f5fddc807e9e4e83f5462143094391feedd959a77dd20ab96cf3 + languageName: node + linkType: hard + +"jest-circus@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-circus@npm:29.6.2" + dependencies: + "@jest/environment": ^29.6.2 + "@jest/expect": ^29.6.2 + "@jest/test-result": ^29.6.2 + "@jest/types": ^29.6.1 + "@types/node": "*" + chalk: ^4.0.0 + co: ^4.6.0 + dedent: ^1.0.0 + is-generator-fn: ^2.0.0 + jest-each: ^29.6.2 + jest-matcher-utils: ^29.6.2 + jest-message-util: ^29.6.2 + jest-runtime: ^29.6.2 + jest-snapshot: ^29.6.2 + jest-util: ^29.6.2 + p-limit: ^3.1.0 + pretty-format: ^29.6.2 + pure-rand: ^6.0.0 + slash: ^3.0.0 + stack-utils: ^2.0.3 + checksum: 4f5a96a68c3c808c3d5a9279a2f39a2937386e2cebba5096971f267d79562ce2133a13bc05356a39f8f1ba68fcfe1eb39c4572b3fb0f91affbd932950e89c1e3 + languageName: node + linkType: hard + +"jest-cli@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-cli@npm:29.6.2" + dependencies: + "@jest/core": ^29.6.2 + "@jest/test-result": ^29.6.2 + "@jest/types": ^29.6.1 + chalk: ^4.0.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + import-local: ^3.0.2 + jest-config: ^29.6.2 + jest-util: ^29.6.2 + jest-validate: ^29.6.2 + prompts: ^2.0.1 + yargs: ^17.3.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 0b7b09ae4bd327caf1981eac5a14679ddda3c5c836c9f8ea0ecfe1e5e10e9a39a5ed783fa38d25383604c4d3405595e74b391d955e99aea7e51acb41a59ea108 + languageName: node + linkType: hard + +"jest-config@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-config@npm:29.6.2" + dependencies: + "@babel/core": ^7.11.6 + "@jest/test-sequencer": ^29.6.2 + "@jest/types": ^29.6.1 + babel-jest: ^29.6.2 + chalk: ^4.0.0 + ci-info: ^3.2.0 + deepmerge: ^4.2.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + jest-circus: ^29.6.2 + jest-environment-node: ^29.6.2 + jest-get-type: ^29.4.3 + jest-regex-util: ^29.4.3 + jest-resolve: ^29.6.2 + jest-runner: ^29.6.2 + jest-util: ^29.6.2 + jest-validate: ^29.6.2 + micromatch: ^4.0.4 + parse-json: ^5.2.0 + pretty-format: ^29.6.2 + slash: ^3.0.0 + strip-json-comments: ^3.1.1 + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: 3bd104a3ac2dd9d34986238142437606354169766dcf88359a7a12ac106d0dc17dcc6b627e4f20db97a58bac5b0502b5436c9cc4722b3629b2a114bba6da9128 + languageName: node + linkType: hard + +"jest-diff@npm:^29.0.0, jest-diff@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-diff@npm:29.6.2" + dependencies: + chalk: ^4.0.0 + diff-sequences: ^29.4.3 + jest-get-type: ^29.4.3 + pretty-format: ^29.6.2 + checksum: 0effd66a0c23f8c139ebf7ca99ed30b479b86fff66f19ad4869f130aaf7ae6a24ca1533f697b7e4930cbe2ddffc85387723fcca673501c653fb77a38f538e959 + languageName: node + linkType: hard + +"jest-docblock@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-docblock@npm:29.4.3" + dependencies: + detect-newline: ^3.0.0 + checksum: e0e9df1485bb8926e5b33478cdf84b3387d9caf3658e7dc1eaa6dc34cb93dea0d2d74797f6e940f0233a88f3dadd60957f2288eb8f95506361f85b84bf8661df + languageName: node + linkType: hard + +"jest-each@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-each@npm:29.6.2" + dependencies: + "@jest/types": ^29.6.1 + chalk: ^4.0.0 + jest-get-type: ^29.4.3 + jest-util: ^29.6.2 + pretty-format: ^29.6.2 + checksum: b64194f4ca27afc6070a42b7ecccbc68be0ded19a849f8cd8f91a2abb23fadae2d38d47559a315f4d1f576927761f3ea437a75ab6cf19206332abb8527d7c165 + languageName: node + linkType: hard + +"jest-environment-jsdom@npm:^29.6.2": + version: 29.7.0 + resolution: "jest-environment-jsdom@npm:29.7.0" + dependencies: + "@jest/environment": ^29.7.0 + "@jest/fake-timers": ^29.7.0 + "@jest/types": ^29.6.3 + "@types/jsdom": ^20.0.0 + "@types/node": "*" + jest-mock: ^29.7.0 + jest-util: ^29.7.0 + jsdom: ^20.0.0 + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 559aac134c196fccc1dfc794d8fc87377e9f78e894bb13012b0831d88dec0abd7ece99abec69da564b8073803be4f04a9eb4f4d1bb80e29eec0cb252c254deb8 + languageName: node + linkType: hard + +"jest-environment-node@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-environment-node@npm:29.6.2" + dependencies: + "@jest/environment": ^29.6.2 + "@jest/fake-timers": ^29.6.2 + "@jest/types": ^29.6.1 + "@types/node": "*" + jest-mock: ^29.6.2 + jest-util: ^29.6.2 + checksum: 0b754ac2d3bdb7ce5d6fc28595b9d1c64176f20506b6f773b18b0280ab0b396ed7d927c8519779d3c560fa2b13236ee7077092ccb19a13bea23d40dd30f06450 + languageName: node + linkType: hard + +"jest-extended@npm:^4.0.1": + version: 4.0.1 + resolution: "jest-extended@npm:4.0.1" + dependencies: + jest-diff: ^29.0.0 + jest-get-type: ^29.0.0 + peerDependencies: + jest: ">=27.2.5" + peerDependenciesMeta: + jest: + optional: true + checksum: a5d6a9153c7b7fe48602bb3381f46bbbbb034bc2722497d0fde6b0eac81b8fbda1e69fb59ca72ec545fea7959e065a96500620a1cf0aba77a719455ff5f93da8 + languageName: node + linkType: hard + +"jest-get-type@npm:^29.0.0, jest-get-type@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-get-type@npm:29.4.3" + checksum: 6ac7f2dde1c65e292e4355b6c63b3a4897d7e92cb4c8afcf6d397f2682f8080e094c8b0b68205a74d269882ec06bf696a9de6cd3e1b7333531e5ed7b112605ce + languageName: node + linkType: hard + +"jest-haste-map@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-haste-map@npm:29.6.2" + dependencies: + "@jest/types": ^29.6.1 + "@types/graceful-fs": ^4.1.3 + "@types/node": "*" + anymatch: ^3.0.3 + fb-watchman: ^2.0.0 + fsevents: ^2.3.2 + graceful-fs: ^4.2.9 + jest-regex-util: ^29.4.3 + jest-util: ^29.6.2 + jest-worker: ^29.6.2 + micromatch: ^4.0.4 + walker: ^1.0.8 + dependenciesMeta: + fsevents: + optional: true + checksum: 726233972030eb2e5bce6c9468e497310436b455c88b40e744bd053e20a6f3ff19aec340edcbd89537c629ed5cf8916506bc895d690cc39a0862c74dcd95b7b8 + languageName: node + linkType: hard + +"jest-leak-detector@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-leak-detector@npm:29.6.2" + dependencies: + jest-get-type: ^29.4.3 + pretty-format: ^29.6.2 + checksum: e00152acdba8aa8f9334775b77375947508051c34646fbeb702275da2b6ac6145f8cad6d5893112e76484d00fa8c0b4fd71b78ab0b4ef34950f5b6a84f37ae67 + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-matcher-utils@npm:29.6.2" + dependencies: + chalk: ^4.0.0 + jest-diff: ^29.6.2 + jest-get-type: ^29.4.3 + pretty-format: ^29.6.2 + checksum: 3e1b65dd30d05f75fe56dc45fbe4135aec2ff96a3d1e21afbf6a66f3a45a7e29cd0fd37cf80b9564e0381d6205833f77ccaf766c6f7e1aad6b7924d117be504e + languageName: node + linkType: hard + +"jest-message-util@npm:^29.6.2, jest-message-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-message-util@npm:29.7.0" + dependencies: + "@babel/code-frame": ^7.12.13 + "@jest/types": ^29.6.3 + "@types/stack-utils": ^2.0.0 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + micromatch: ^4.0.4 + pretty-format: ^29.7.0 + slash: ^3.0.0 + stack-utils: ^2.0.3 + checksum: a9d025b1c6726a2ff17d54cc694de088b0489456c69106be6b615db7a51b7beb66788bea7a59991a019d924fbf20f67d085a445aedb9a4d6760363f4d7d09930 + languageName: node + linkType: hard + +"jest-mock-extended@npm:^3.0.4": + version: 3.0.4 + resolution: "jest-mock-extended@npm:3.0.4" + dependencies: + ts-essentials: ^7.0.3 + peerDependencies: + jest: ^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0 || ^29.0.0 + typescript: ^3.0.0 || ^4.0.0 || ^5.0.0 + checksum: f861253c63508b30d971fbbbc1bf2911ff4406cd260d0e23483a1d4514898b18ba5efbd43fbdf6d94996dc09b20eb1aad1b46aeaea9c99244ba12dc99814fd3f + languageName: node + linkType: hard + +"jest-mock@npm:^29.6.2, jest-mock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-mock@npm:29.7.0" + dependencies: + "@jest/types": ^29.6.3 + "@types/node": "*" + jest-util: ^29.7.0 + checksum: 81ba9b68689a60be1482212878973700347cb72833c5e5af09895882b9eb5c4e02843a1bbdf23f94c52d42708bab53a30c45a3482952c9eec173d1eaac5b86c5 + languageName: node + linkType: hard + +"jest-pnp-resolver@npm:^1.2.2": + version: 1.2.3 + resolution: "jest-pnp-resolver@npm:1.2.3" + peerDependencies: + jest-resolve: "*" + peerDependenciesMeta: + jest-resolve: + optional: true + checksum: db1a8ab2cb97ca19c01b1cfa9a9c8c69a143fde833c14df1fab0766f411b1148ff0df878adea09007ac6a2085ec116ba9a996a6ad104b1e58c20adbf88eed9b2 + languageName: node + linkType: hard + +"jest-regex-util@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-regex-util@npm:29.4.3" + checksum: 96fc7fc28cd4dd73a63c13a526202c4bd8b351d4e5b68b1a2a2c88da3308c2a16e26feaa593083eb0bac38cca1aa9dd05025412e7de013ba963fb8e66af22b8a + languageName: node + linkType: hard + +"jest-resolve-dependencies@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-resolve-dependencies@npm:29.6.2" + dependencies: + jest-regex-util: ^29.4.3 + jest-snapshot: ^29.6.2 + checksum: d40ee11af2c9d2ef0dbbcf9a5b7dda37c2b86cf4e5de1705795919fd8927907569115c502116ab56de0dca576d5faa31ec9b636240333b6830a568a63004da17 + languageName: node + linkType: hard + +"jest-resolve@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-resolve@npm:29.6.2" + dependencies: + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.6.2 + jest-pnp-resolver: ^1.2.2 + jest-util: ^29.6.2 + jest-validate: ^29.6.2 + resolve: ^1.20.0 + resolve.exports: ^2.0.0 + slash: ^3.0.0 + checksum: 01721957e61821a576b2ded043eeab8b392166e0e6d8d680f75657737e2ea7481ff29c2716b866ccd12e743f3a8da465504b1028e78b6a3c68b9561303de7ec8 + languageName: node + linkType: hard + +"jest-runner-groups@npm:^2.2.0": + version: 2.2.0 + resolution: "jest-runner-groups@npm:2.2.0" + peerDependencies: + jest-docblock: ">= 24" + jest-runner: ">= 24" + checksum: 4cd69ba7c14b1988ca1e4b15194f5011d3ad3cbb554098afdee336d5c0a78bd27c2bde2a58ce0b68984a8d3d1781e15c020a0db64db059116721b47de1ba5287 + languageName: node + linkType: hard + +"jest-runner@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-runner@npm:29.6.2" + dependencies: + "@jest/console": ^29.6.2 + "@jest/environment": ^29.6.2 + "@jest/test-result": ^29.6.2 + "@jest/transform": ^29.6.2 + "@jest/types": ^29.6.1 + "@types/node": "*" + chalk: ^4.0.0 + emittery: ^0.13.1 + graceful-fs: ^4.2.9 + jest-docblock: ^29.4.3 + jest-environment-node: ^29.6.2 + jest-haste-map: ^29.6.2 + jest-leak-detector: ^29.6.2 + jest-message-util: ^29.6.2 + jest-resolve: ^29.6.2 + jest-runtime: ^29.6.2 + jest-util: ^29.6.2 + jest-watcher: ^29.6.2 + jest-worker: ^29.6.2 + p-limit: ^3.1.0 + source-map-support: 0.5.13 + checksum: 46bd506a08ddf79628a509aed4105ab74c0b03727a3e24c90bbc2915531860b3da99f7ace2fd9603194440553cffac9cfb1a3b7d0ce03d5fc9c5f2d5ffbb3d3f + languageName: node + linkType: hard + +"jest-runtime@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-runtime@npm:29.6.2" + dependencies: + "@jest/environment": ^29.6.2 + "@jest/fake-timers": ^29.6.2 + "@jest/globals": ^29.6.2 + "@jest/source-map": ^29.6.0 + "@jest/test-result": ^29.6.2 + "@jest/transform": ^29.6.2 + "@jest/types": ^29.6.1 + "@types/node": "*" + chalk: ^4.0.0 + cjs-module-lexer: ^1.0.0 + collect-v8-coverage: ^1.0.0 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.6.2 + jest-message-util: ^29.6.2 + jest-mock: ^29.6.2 + jest-regex-util: ^29.4.3 + jest-resolve: ^29.6.2 + jest-snapshot: ^29.6.2 + jest-util: ^29.6.2 + slash: ^3.0.0 + strip-bom: ^4.0.0 + checksum: 8e7e4486b23b01a9c407313681bed0def39680c2ae21cf01347f111983252ec3a024c56493c5411fed53633f02863eed0816099110cbe04b3889aa5babf1042d + languageName: node + linkType: hard + +"jest-snapshot@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-snapshot@npm:29.6.2" + dependencies: + "@babel/core": ^7.11.6 + "@babel/generator": ^7.7.2 + "@babel/plugin-syntax-jsx": ^7.7.2 + "@babel/plugin-syntax-typescript": ^7.7.2 + "@babel/types": ^7.3.3 + "@jest/expect-utils": ^29.6.2 + "@jest/transform": ^29.6.2 + "@jest/types": ^29.6.1 + babel-preset-current-node-syntax: ^1.0.0 + chalk: ^4.0.0 + expect: ^29.6.2 + graceful-fs: ^4.2.9 + jest-diff: ^29.6.2 + jest-get-type: ^29.4.3 + jest-matcher-utils: ^29.6.2 + jest-message-util: ^29.6.2 + jest-util: ^29.6.2 + natural-compare: ^1.4.0 + pretty-format: ^29.6.2 + semver: ^7.5.3 + checksum: c1c70a9dbce7fca62ed73ac38234b4ee643e8b667acf71b4417ab67776c1188bb08b8ad450e56a2889ad182903ffd416386fa8082a477724ccf8d8c29a4c6906 + languageName: node + linkType: hard + +"jest-util@npm:^29.0.0, jest-util@npm:^29.6.2, jest-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-util@npm:29.7.0" + dependencies: + "@jest/types": ^29.6.3 + "@types/node": "*" + chalk: ^4.0.0 + ci-info: ^3.2.0 + graceful-fs: ^4.2.9 + picomatch: ^2.2.3 + checksum: 042ab4980f4ccd4d50226e01e5c7376a8556b472442ca6091a8f102488c0f22e6e8b89ea874111d2328a2080083bf3225c86f3788c52af0bd0345a00eb57a3ca + languageName: node + linkType: hard + +"jest-validate@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-validate@npm:29.6.2" + dependencies: + "@jest/types": ^29.6.1 + camelcase: ^6.2.0 + chalk: ^4.0.0 + jest-get-type: ^29.4.3 + leven: ^3.1.0 + pretty-format: ^29.6.2 + checksum: 32648d002189c0ad8a958eace7c6b7d05ea1dc440a1b91e0f22dc1aef489899446ec80b2d527fd13713862d89dfb4606e24a3bf8a10c4ddac3c911e93b7f0374 + languageName: node + linkType: hard + +"jest-watcher@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-watcher@npm:29.6.2" + dependencies: + "@jest/test-result": ^29.6.2 + "@jest/types": ^29.6.1 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + emittery: ^0.13.1 + jest-util: ^29.6.2 + string-length: ^4.0.1 + checksum: 14624190fc8b5fbae466a2ec81458a88c15716d99f042bb4674d53e9623d305cb2905bc1dffeda05fd1a10a05c2a83efe5ac41942477e2b15eaebb08d0aaab32 + languageName: node + linkType: hard + +"jest-worker@npm:^29.6.2": + version: 29.6.2 + resolution: "jest-worker@npm:29.6.2" + dependencies: + "@types/node": "*" + jest-util: ^29.6.2 + merge-stream: ^2.0.0 + supports-color: ^8.0.0 + checksum: 11035564534bf181ead80b25be138c2d42372bd5626151a3e705200d47a74fd9da3ca79f8a7b15806cdc325ad73c3d21d23acceeed99d50941589ff02915ed38 + languageName: node + linkType: hard + +"jest@npm:^29.6.2": + version: 29.6.2 + resolution: "jest@npm:29.6.2" + dependencies: + "@jest/core": ^29.6.2 + "@jest/types": ^29.6.1 + import-local: ^3.0.2 + jest-cli: ^29.6.2 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: dd63facd4e6aefc35d2c42acd7e4c9fb0d8fe4705df4b3ccedd953605424d7aa89c88af8cf4c9951752709cac081d29c35b264e1794643d5688ea724ccc9a485 + languageName: node + linkType: hard + +"jiti@npm:^1.21.0": + version: 1.21.0 + resolution: "jiti@npm:1.21.0" + bin: + jiti: bin/jiti.js + checksum: a7bd5d63921c170eaec91eecd686388181c7828e1fa0657ab374b9372bfc1f383cf4b039e6b272383d5cb25607509880af814a39abdff967322459cca41f2961 + languageName: node + linkType: hard + +"joi@npm:^17.7.0": + version: 17.9.2 + resolution: "joi@npm:17.9.2" + dependencies: + "@hapi/hoek": ^9.0.0 + "@hapi/topo": ^5.0.0 + "@sideway/address": ^4.1.3 + "@sideway/formula": ^3.0.1 + "@sideway/pinpoint": ^2.0.0 + checksum: 8c3709849293411c524e5a679dba7b42598a29a663478941767b8d5b06288611dece58803c468a2c7320cc2429a3e71e3d94337fe47aefcf6c22174dbd90b601 + languageName: node + linkType: hard + +"js-sha3@npm:0.8.0, js-sha3@npm:^0.8.0": + version: 0.8.0 + resolution: "js-sha3@npm:0.8.0" + checksum: 75df77c1fc266973f06cce8309ce010e9e9f07ec35ab12022ed29b7f0d9c8757f5a73e1b35aa24840dced0dea7059085aa143d817aea9e188e2a80d569d9adce + languageName: node + linkType: hard + +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 + languageName: node + linkType: hard + +"js-yaml@npm:3.x, js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: ^1.0.7 + esprima: ^4.0.0 + bin: + js-yaml: bin/js-yaml.js + checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c + languageName: node + linkType: hard + +"js-yaml@npm:4.1.0, js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: ^2.0.1 + bin: + js-yaml: bin/js-yaml.js + checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a + languageName: node + linkType: hard + +"jsdom@npm:^20.0.0": + version: 20.0.3 + resolution: "jsdom@npm:20.0.3" + dependencies: + abab: ^2.0.6 + acorn: ^8.8.1 + acorn-globals: ^7.0.0 + cssom: ^0.5.0 + cssstyle: ^2.3.0 + data-urls: ^3.0.2 + decimal.js: ^10.4.2 + domexception: ^4.0.0 + escodegen: ^2.0.0 + form-data: ^4.0.0 + html-encoding-sniffer: ^3.0.0 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.1 + is-potential-custom-element-name: ^1.0.1 + nwsapi: ^2.2.2 + parse5: ^7.1.1 + saxes: ^6.0.0 + symbol-tree: ^3.2.4 + tough-cookie: ^4.1.2 + w3c-xmlserializer: ^4.0.0 + webidl-conversions: ^7.0.0 + whatwg-encoding: ^2.0.0 + whatwg-mimetype: ^3.0.0 + whatwg-url: ^11.0.0 + ws: ^8.11.0 + xml-name-validator: ^4.0.0 + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 6e2ae21db397133a061b270c26d2dbc0b9051733ea3b896a7ece78d79f475ff0974f766a413c1198a79c793159119169f2335ddb23150348fbfdcfa6f3105536 + languageName: node + linkType: hard + +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d + languageName: node + linkType: hard + +"json-parse-even-better-errors@npm:^2.3.0": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f + languageName: node + linkType: hard + +"json-rpc-engine@npm:^6.1.0": + version: 6.1.0 + resolution: "json-rpc-engine@npm:6.1.0" + dependencies: + "@metamask/safe-event-emitter": ^2.0.0 + eth-rpc-errors: ^4.0.2 + checksum: 33b6c9bbd81abf8e323a0281ee05871713203c40d34a4d0bda27706cd0a0935c7b51845238ba89b73027e44ebc8034bbd82db9f962e6c578eb922d9b95acc8bd + languageName: node + linkType: hard + +"json-rpc-random-id@npm:^1.0.0, json-rpc-random-id@npm:^1.0.1": + version: 1.0.1 + resolution: "json-rpc-random-id@npm:1.0.1" + checksum: fcd2e884193a129ace4002bd65a86e9cdb206733b4693baea77bd8b372cf8de3043fbea27716a2c9a716581a908ca8d978d9dfec4847eb2cf77edb4cf4b2252c + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 + languageName: node + linkType: hard + +"json5@npm:^1.0.2": + version: 1.0.2 + resolution: "json5@npm:1.0.2" + dependencies: + minimist: ^1.2.0 + bin: + json5: lib/cli.js + checksum: 866458a8c58a95a49bef3adba929c625e82532bcff1fe93f01d29cb02cac7c3fe1f4b79951b7792c2da9de0b32871a8401a6e3c5b36778ad852bf5b8a61165d7 + languageName: node + linkType: hard + +"json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 2a7436a93393830bce797d4626275152e37e877b265e94ca69c99e3d20c2b9dab021279146a39cdb700e71b2dd32a4cebd1514cd57cee102b1af906ce5040349 + languageName: node + linkType: hard + +"jsonc-parser@npm:^3.2.0": + version: 3.2.1 + resolution: "jsonc-parser@npm:3.2.1" + checksum: 656d9027b91de98d8ab91b3aa0d0a4cab7dc798a6830845ca664f3e76c82d46b973675bbe9b500fae1de37fd3e81aceacbaa2a57884bf2f8f29192150d2d1ef7 + languageName: node + linkType: hard + +"jsonfile@npm:^4.0.0": + version: 4.0.0 + resolution: "jsonfile@npm:4.0.0" + dependencies: + graceful-fs: ^4.1.6 + dependenciesMeta: + graceful-fs: + optional: true + checksum: 6447d6224f0d31623eef9b51185af03ac328a7553efcee30fa423d98a9e276ca08db87d71e17f2310b0263fd3ffa6c2a90a6308367f661dc21580f9469897c9e + languageName: node + linkType: hard + +"jsonfile@npm:^6.0.1": + version: 6.1.0 + resolution: "jsonfile@npm:6.1.0" + dependencies: + graceful-fs: ^4.1.6 + universalify: ^2.0.0 + dependenciesMeta: + graceful-fs: + optional: true + checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 + languageName: node + linkType: hard + +"jsonschema@npm:^1.2.4": + version: 1.4.1 + resolution: "jsonschema@npm:1.4.1" + checksum: 1ef02a6cd9bc32241ec86bbf1300bdbc3b5f2d8df6eb795517cf7d1cd9909e7beba1e54fdf73990fd66be98a182bda9add9607296b0cb00b1348212988e424b2 + languageName: node + linkType: hard + +"keccak@npm:^3.0.0, keccak@npm:^3.0.3": + version: 3.0.4 + resolution: "keccak@npm:3.0.4" + dependencies: + node-addon-api: ^2.0.0 + node-gyp: latest + node-gyp-build: ^4.2.0 + readable-stream: ^3.6.0 + checksum: 2bf27b97b2f24225b1b44027de62be547f5c7326d87d249605665abd0c8c599d774671c35504c62c9b922cae02758504c6f76a73a84234d23af8a2211afaaa11 + languageName: node + linkType: hard + +"keyvaluestorage-interface@npm:^1.0.0": + version: 1.0.0 + resolution: "keyvaluestorage-interface@npm:1.0.0" + checksum: e20530e71b738dc094ad170a91a98d4b9bdc772dd9044b23cdaaa102aafa8997b1ac867550a1e66ba1d64fcaa949214df31aed18413b4bac31e5fe1f2c76c9de + languageName: node + linkType: hard + +"kind-of@npm:^6.0.2": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b + languageName: node + linkType: hard + +"kleur@npm:^3.0.3": + version: 3.0.3 + resolution: "kleur@npm:3.0.3" + checksum: df82cd1e172f957bae9c536286265a5cdbd5eeca487cb0a3b2a7b41ef959fc61f8e7c0e9aeea9c114ccf2c166b6a8dd45a46fd619c1c569d210ecd2765ad5169 + languageName: node + linkType: hard + +"leven@npm:^3.1.0": + version: 3.1.0 + resolution: "leven@npm:3.1.0" + checksum: 638401d534585261b6003db9d99afd244dfe82d75ddb6db5c0df412842d5ab30b2ef18de471aaec70fe69a46f17b4ae3c7f01d8a4e6580ef7adb9f4273ad1e55 + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: ^1.2.1 + type-check: ~0.4.0 + checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 + languageName: node + linkType: hard + +"levn@npm:~0.3.0": + version: 0.3.0 + resolution: "levn@npm:0.3.0" + dependencies: + prelude-ls: ~1.1.2 + type-check: ~0.3.2 + checksum: 0d084a524231a8246bb10fec48cdbb35282099f6954838604f3c7fc66f2e16fa66fd9cc2f3f20a541a113c4dafdf181e822c887c8a319c9195444e6c64ac395e + languageName: node + linkType: hard + +"lilconfig@npm:2.1.0": + version: 2.1.0 + resolution: "lilconfig@npm:2.1.0" + checksum: 8549bb352b8192375fed4a74694cd61ad293904eee33f9d4866c2192865c44c4eb35d10782966242634e0cbc1e91fe62b1247f148dc5514918e3a966da7ea117 + languageName: node + linkType: hard + +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 + languageName: node + linkType: hard + +"lint-staged@npm:^13.1.2": + version: 13.2.0 + resolution: "lint-staged@npm:13.2.0" + dependencies: + chalk: 5.2.0 + cli-truncate: ^3.1.0 + commander: ^10.0.0 + debug: ^4.3.4 + execa: ^7.0.0 + lilconfig: 2.1.0 + listr2: ^5.0.7 + micromatch: ^4.0.5 + normalize-path: ^3.0.0 + object-inspect: ^1.12.3 + pidtree: ^0.6.0 + string-argv: ^0.3.1 + yaml: ^2.2.1 + bin: + lint-staged: bin/lint-staged.js + checksum: dcaa8fbbde567eb8ac27230a18b3a22f30c278c524c0e27cf7d4110d662d5d33ed68a585a2e1b05075ef1c262e853f557a5ae046188b723603246d63e6b9f07b + languageName: node + linkType: hard + +"listhen@npm:^1.5.5": + version: 1.7.2 + resolution: "listhen@npm:1.7.2" + dependencies: + "@parcel/watcher": ^2.4.1 + "@parcel/watcher-wasm": ^2.4.1 + citty: ^0.1.6 + clipboardy: ^4.0.0 + consola: ^3.2.3 + crossws: ^0.2.0 + defu: ^6.1.4 + get-port-please: ^3.1.2 + h3: ^1.10.2 + http-shutdown: ^1.2.2 + jiti: ^1.21.0 + mlly: ^1.6.1 + node-forge: ^1.3.1 + pathe: ^1.1.2 + std-env: ^3.7.0 + ufo: ^1.4.0 + untun: ^0.1.3 + uqr: ^0.1.2 + bin: + listen: bin/listhen.mjs + listhen: bin/listhen.mjs + checksum: 92b160ab493bbdb4941ba7fbfc7e0815b4c1da9ca01f792df2e77da13a6b726086d62d57cd2da51242c47a463d59a68798666fb8b64338510e2edf8dc2e7a1c3 + languageName: node + linkType: hard + +"listr2@npm:^5.0.7": + version: 5.0.8 + resolution: "listr2@npm:5.0.8" + dependencies: + cli-truncate: ^2.1.0 + colorette: ^2.0.19 + log-update: ^4.0.0 + p-map: ^4.0.0 + rfdc: ^1.3.0 + rxjs: ^7.8.0 + through: ^2.3.8 + wrap-ansi: ^7.0.0 + peerDependencies: + enquirer: ">= 2.3.0 < 3" + peerDependenciesMeta: + enquirer: + optional: true + checksum: 8be9f5632627c4df0dc33f452c98d415a49e5f1614650d3cab1b103c33e95f2a7a0e9f3e1e5de00d51bf0b4179acd8ff11b25be77dbe097cf3773c05e728d46c + languageName: node + linkType: hard + +"lit-element@npm:^3.3.0": + version: 3.3.3 + resolution: "lit-element@npm:3.3.3" + dependencies: + "@lit-labs/ssr-dom-shim": ^1.1.0 + "@lit/reactive-element": ^1.3.0 + lit-html: ^2.8.0 + checksum: 29a596fa556e231cce7246ca3e5687ad238f299b0cb374a0934d5e6fe9adf1436e031d4fbd21b280aabfc0e21a66e6c4b52da558a908df2566d09d960f3ca93d + languageName: node + linkType: hard + +"lit-html@npm:^2.8.0": + version: 2.8.0 + resolution: "lit-html@npm:2.8.0" + dependencies: + "@types/trusted-types": ^2.0.2 + checksum: 2d70df07248bcb2f502a3afb1e91d260735024fa669669ffb1417575aa39c3092779725ac1b90f5f39e4ce78c63f431f51176bc67f532389f0285a6991573255 + languageName: node + linkType: hard + +"lit@npm:2.8.0": + version: 2.8.0 + resolution: "lit@npm:2.8.0" + dependencies: + "@lit/reactive-element": ^1.6.0 + lit-element: ^3.3.0 + lit-html: ^2.8.0 + checksum: 2480e733f7d022d3ecba91abc58a20968f0ca8f5fa30b3341ecf4bcf4845e674ad27b721a5ae53529cafc6ca603c015b80d0979ceb7a711e268ef20bb6bc7527 + languageName: node + linkType: hard + +"locate-path@npm:^3.0.0": + version: 3.0.0 + resolution: "locate-path@npm:3.0.0" + dependencies: + p-locate: ^3.0.0 + path-exists: ^3.0.0 + checksum: 53db3996672f21f8b0bf2a2c645ae2c13ffdae1eeecfcd399a583bce8516c0b88dcb4222ca6efbbbeb6949df7e46860895be2c02e8d3219abd373ace3bfb4e11 + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: ^4.1.0 + checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: ^5.0.0 + checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a + languageName: node + linkType: hard + +"lodash.camelcase@npm:^4.3.0": + version: 4.3.0 + resolution: "lodash.camelcase@npm:4.3.0" + checksum: cb9227612f71b83e42de93eccf1232feeb25e705bdb19ba26c04f91e885bfd3dd5c517c4a97137658190581d3493ea3973072ca010aab7e301046d90740393d1 + languageName: node + linkType: hard + +"lodash.debounce@npm:^4.0.8": + version: 4.0.8 + resolution: "lodash.debounce@npm:4.0.8" + checksum: a3f527d22c548f43ae31c861ada88b2637eb48ac6aa3eb56e82d44917971b8aa96fbb37aa60efea674dc4ee8c42074f90f7b1f772e9db375435f6c83a19b3bc6 + languageName: node + linkType: hard + +"lodash.defaults@npm:^4.2.0": + version: 4.2.0 + resolution: "lodash.defaults@npm:4.2.0" + checksum: 84923258235592c8886e29de5491946ff8c2ae5c82a7ac5cddd2e3cb697e6fbdfbbb6efcca015795c86eec2bb953a5a2ee4016e3735a3f02720428a40efbb8f1 + languageName: node + linkType: hard + +"lodash.isarguments@npm:^3.1.0": + version: 3.1.0 + resolution: "lodash.isarguments@npm:3.1.0" + checksum: ae1526f3eb5c61c77944b101b1f655f846ecbedcb9e6b073526eba6890dc0f13f09f72e11ffbf6540b602caee319af9ac363d6cdd6be41f4ee453436f04f13b5 + languageName: node + linkType: hard + +"lodash.isequal@npm:4.5.0": + version: 4.5.0 + resolution: "lodash.isequal@npm:4.5.0" + checksum: da27515dc5230eb1140ba65ff8de3613649620e8656b19a6270afe4866b7bd461d9ba2ac8a48dcc57f7adac4ee80e1de9f965d89d4d81a0ad52bb3eec2609644 + languageName: node + linkType: hard + +"lodash.memoize@npm:4.x": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 9ff3942feeccffa4f1fafa88d32f0d24fdc62fd15ded5a74a5f950ff5f0c6f61916157246744c620173dddf38d37095a92327d5fd3861e2063e736a5c207d089 + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 + languageName: node + linkType: hard + +"lodash.truncate@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.truncate@npm:4.4.2" + checksum: b463d8a382cfb5f0e71c504dcb6f807a7bd379ff1ea216669aa42c52fc28c54e404bfbd96791aa09e6df0de2c1d7b8f1b7f4b1a61f324d38fe98bc535aeee4f5 + languageName: node + linkType: hard + +"lodash@npm:^4.17.15, lodash@npm:^4.17.16, lodash@npm:^4.17.21, lodash@npm:^4.7.0": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + languageName: node + linkType: hard + +"log-symbols@npm:4.1.0, log-symbols@npm:^4.1.0": + version: 4.1.0 + resolution: "log-symbols@npm:4.1.0" + dependencies: + chalk: ^4.1.0 + is-unicode-supported: ^0.1.0 + checksum: fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74 + languageName: node + linkType: hard + +"log-update@npm:^4.0.0": + version: 4.0.0 + resolution: "log-update@npm:4.0.0" + dependencies: + ansi-escapes: ^4.3.0 + cli-cursor: ^3.1.0 + slice-ansi: ^4.0.0 + wrap-ansi: ^6.2.0 + checksum: ae2f85bbabc1906034154fb7d4c4477c79b3e703d22d78adee8b3862fa913942772e7fa11713e3d96fb46de4e3cabefbf5d0a544344f03b58d3c4bff52aa9eb2 + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.2": + version: 10.2.0 + resolution: "lru-cache@npm:10.2.0" + checksum: eee7ddda4a7475deac51ac81d7dd78709095c6fa46e8350dc2d22462559a1faa3b81ed931d5464b13d48cbd7e08b46100b6f768c76833912bc444b99c37e25db + languageName: node + linkType: hard + +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: ^3.0.2 + checksum: c154ae1cbb0c2206d1501a0e94df349653c92c8cbb25236d7e85190bcaf4567a03ac6eb43166fabfa36fd35623694da7233e88d9601fbf411a9a481d85dbd2cb + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: ^4.0.0 + checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 + languageName: node + linkType: hard + +"lru-cache@npm:^7.7.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 + languageName: node + linkType: hard + +"luxon@npm:^3.2.1": + version: 3.4.3 + resolution: "luxon@npm:3.4.3" + checksum: 3eade81506224d038ed24035a0cd0dd4887848d7eba9361dce9ad8ef81380596a68153240be3988721f9690c624fb449fcf8fd8c3fc0681a6a8496faf48e92a3 + languageName: node + linkType: hard + +"lz-string@npm:^1.5.0": + version: 1.5.0 + resolution: "lz-string@npm:1.5.0" + bin: + lz-string: bin/bin.js + checksum: 1ee98b4580246fd90dd54da6e346fb1caefcf05f677c686d9af237a157fdea3fd7c83a4bc58f858cd5b10a34d27afe0fdcbd0505a47e0590726a873dc8b8f65d + languageName: node + linkType: hard + +"magic-string@npm:^0.30.3": + version: 0.30.8 + resolution: "magic-string@npm:0.30.8" + dependencies: + "@jridgewell/sourcemap-codec": ^1.4.15 + checksum: 79922f4500d3932bb587a04440d98d040170decf432edc0f91c0bf8d41db16d364189bf800e334170ac740918feda62cd39dcc170c337dc18050cfcf00a5f232 + languageName: node + linkType: hard + +"make-dir@npm:^2.0.0, make-dir@npm:^2.1.0": + version: 2.1.0 + resolution: "make-dir@npm:2.1.0" + dependencies: + pify: ^4.0.1 + semver: ^5.6.0 + checksum: 043548886bfaf1820323c6a2997e6d2fa51ccc2586ac14e6f14634f7458b4db2daf15f8c310e2a0abd3e0cddc64df1890d8fc7263033602c47bb12cbfcf86aab + languageName: node + linkType: hard + +"make-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "make-dir@npm:4.0.0" + dependencies: + semver: ^7.5.3 + checksum: bf0731a2dd3aab4db6f3de1585cea0b746bb73eb5a02e3d8d72757e376e64e6ada190b1eddcde5b2f24a81b688a9897efd5018737d05e02e2a671dda9cff8a8a + languageName: node + linkType: hard + +"make-error@npm:1.x, make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^10.0.3": + version: 10.2.1 + resolution: "make-fetch-happen@npm:10.2.1" + dependencies: + agentkeepalive: ^4.2.1 + cacache: ^16.1.0 + http-cache-semantics: ^4.1.0 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.0 + is-lambda: ^1.0.1 + lru-cache: ^7.7.1 + minipass: ^3.1.6 + minipass-collect: ^1.0.2 + minipass-fetch: ^2.0.3 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + negotiator: ^0.6.3 + promise-retry: ^2.0.1 + socks-proxy-agent: ^7.0.0 + ssri: ^9.0.0 + checksum: 2332eb9a8ec96f1ffeeea56ccefabcb4193693597b132cd110734d50f2928842e22b84cfa1508e921b8385cdfd06dda9ad68645fed62b50fff629a580f5fb72c + languageName: node + linkType: hard + +"makeerror@npm:1.0.12": + version: 1.0.12 + resolution: "makeerror@npm:1.0.12" + dependencies: + tmpl: 1.0.5 + checksum: b38a025a12c8146d6eeea5a7f2bf27d51d8ad6064da8ca9405fcf7bf9b54acd43e3b30ddd7abb9b1bfa4ddb266019133313482570ddb207de568f71ecfcf6060 + languageName: node + linkType: hard + +"match-all@npm:^1.2.6": + version: 1.2.6 + resolution: "match-all@npm:1.2.6" + checksum: 3d4f16b8fd082f2fd10e362f4a8b71c62f8a767591b3db831ca2bdcf726337e9a64e4abc30e2ef053dc2bcfb875a9ed80bd78e006ad5ef11380a7158d0cb00e1 + languageName: node + linkType: hard + +"mcl-wasm@npm:^1.0.0": + version: 1.4.0 + resolution: "mcl-wasm@npm:1.4.0" + dependencies: + "@types/node": ^20.2.5 + checksum: 4fe707b6b60d09341afaaab4f5aa7a6b5d2f2a927a8b55bf361ca1c2a7d65131d943544538fc61f5d44b09f9024806c94fe06640ce6cb4ea5abc68df05e44303 + languageName: node + linkType: hard + +"md5.js@npm:^1.3.4": + version: 1.3.5 + resolution: "md5.js@npm:1.3.5" + dependencies: + hash-base: ^3.0.0 + inherits: ^2.0.1 + safe-buffer: ^5.1.2 + checksum: 098494d885684bcc4f92294b18ba61b7bd353c23147fbc4688c75b45cb8590f5a95fd4584d742415dcc52487f7a1ef6ea611cfa1543b0dc4492fe026357f3f0c + languageName: node + linkType: hard + +"media-query-parser@npm:^2.0.2": + version: 2.0.2 + resolution: "media-query-parser@npm:2.0.2" + dependencies: + "@babel/runtime": ^7.12.5 + checksum: 8ef956d9e63fe6f4041988beda69843b3a6bb48228ea2923a066f6e7c8f7c5dba75fae357318c48a97ed5beae840b8425cb7e727fc1bb77acc65f2005f8945ab + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 + languageName: node + linkType: hard + +"merge2@npm:^1.2.3, merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + languageName: node + linkType: hard + +"micro-ftch@npm:^0.3.1": + version: 0.3.1 + resolution: "micro-ftch@npm:0.3.1" + checksum: 0e496547253a36e98a83fb00c628c53c3fb540fa5aaeaf718438873785afd193244988c09d219bb1802984ff227d04938d9571ef90fe82b48bd282262586aaff + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: ^3.0.2 + picomatch: ^2.3.1 + checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: 1.52.0 + checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 + languageName: node + linkType: hard + +"mime@npm:^3.0.0": + version: 3.0.0 + resolution: "mime@npm:3.0.0" + bin: + mime: cli.js + checksum: f43f9b7bfa64534e6b05bd6062961681aeb406a5b53673b53b683f27fcc4e739989941836a355eef831f4478923651ecc739f4a5f6e20a76487b432bfd4db928 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a + languageName: node + linkType: hard + +"mimic-fn@npm:^4.0.0": + version: 4.0.0 + resolution: "mimic-fn@npm:4.0.0" + checksum: 995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 + languageName: node + linkType: hard + +"min-indent@npm:^1.0.0": + version: 1.0.1 + resolution: "min-indent@npm:1.0.1" + checksum: bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 + languageName: node + linkType: hard + +"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: cc7974a9268fbf130fb055aff76700d7e2d8be5f761fb5c60318d0ed010d839ab3661a533ad29a5d37653133385204c503bfac995aaa4236f4e847461ea32ba7 + languageName: node + linkType: hard + +"minimalistic-crypto-utils@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-crypto-utils@npm:1.0.1" + checksum: 6e8a0422b30039406efd4c440829ea8f988845db02a3299f372fceba56ffa94994a9c0f2fd70c17f9969eedfbd72f34b5070ead9656a34d3f71c0bd72583a0ed + languageName: node + linkType: hard + +"minimatch@npm:2 || 3, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: ^1.1.7 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + languageName: node + linkType: hard + +"minimatch@npm:5.0.1": + version: 5.0.1 + resolution: "minimatch@npm:5.0.1" + dependencies: + brace-expansion: ^2.0.1 + checksum: b34b98463da4754bc526b244d680c69d4d6089451ebe512edaf6dd9eeed0279399cfa3edb19233513b8f830bf4bfcad911dddcdf125e75074100d52f724774f0 + languageName: node + linkType: hard + +"minimatch@npm:9.0.2": + version: 9.0.2 + resolution: "minimatch@npm:9.0.2" + dependencies: + brace-expansion: ^2.0.1 + checksum: 2eb12e2047a062fdb973fb51b9803f2455e3a00977858c038d66646d303a5a15bbcbc6ed5a2fc403bc869b1309f829ed3acd881d3246faf044ea7a494974b924 + languageName: node + linkType: hard + +"minimatch@npm:^5.0.1": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" + dependencies: + brace-expansion: ^2.0.1 + checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.7": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 + languageName: node + linkType: hard + +"minipass-collect@npm:^1.0.2": + version: 1.0.2 + resolution: "minipass-collect@npm:1.0.2" + dependencies: + minipass: ^3.0.0 + checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 + languageName: node + linkType: hard + +"minipass-fetch@npm:^2.0.3": + version: 2.1.2 + resolution: "minipass-fetch@npm:2.1.2" + dependencies: + encoding: ^0.1.13 + minipass: ^3.1.6 + minipass-sized: ^1.0.3 + minizlib: ^2.1.2 + dependenciesMeta: + encoding: + optional: true + checksum: 3f216be79164e915fc91210cea1850e488793c740534985da017a4cbc7a5ff50506956d0f73bb0cb60e4fe91be08b6b61ef35101706d3ef5da2c8709b5f08f91 + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: ^3.0.0 + checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: ^3.0.0 + checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: ^3.0.0 + checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 + languageName: node + linkType: hard + +"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: ^4.0.0 + checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 + languageName: node + linkType: hard + +"minipass@npm:^4.0.0": + version: 4.2.5 + resolution: "minipass@npm:4.2.5" + checksum: 4f9c19af23a5d4a9e7156feefc9110634b178a8cff8f8271af16ec5ebf7e221725a97429952c856f5b17b30c2065ebd24c81722d90c93d2122611d75b952b48f + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: ^3.0.0 + yallist: ^4.0.0 + checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 + languageName: node + linkType: hard + +"mkdirp@npm:0.5.x": + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" + dependencies: + minimist: ^1.2.6 + bin: + mkdirp: bin/cmd.js + checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f + languageName: node + linkType: hard + +"mlly@npm:^1.2.0, mlly@npm:^1.4.2, mlly@npm:^1.6.1": + version: 1.6.1 + resolution: "mlly@npm:1.6.1" + dependencies: + acorn: ^8.11.3 + pathe: ^1.1.2 + pkg-types: ^1.0.3 + ufo: ^1.3.2 + checksum: c40a547dba8f6b2a5a840899d49f4c9550c233d47fd7bd75f4ac27f388047bad655ad86684329809c1640df4373b45bec77304f73530ca4354bc1199700e2a46 + languageName: node + linkType: hard + +"mocha@npm:^10.2.0": + version: 10.3.0 + resolution: "mocha@npm:10.3.0" + dependencies: + ansi-colors: 4.1.1 + browser-stdout: 1.3.1 + chokidar: 3.5.3 + debug: 4.3.4 + diff: 5.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.0.1 + ms: 2.1.3 + serialize-javascript: 6.0.0 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.2.1 + yargs: 16.2.0 + yargs-parser: 20.2.4 + yargs-unparser: 2.0.0 + bin: + _mocha: bin/_mocha + mocha: bin/mocha.js + checksum: b5e95b9c270b2c33589e2f19d7ee37ac7577c0d471152d4e2692ebf4bc606a36040da4fbadc1e482b4cf5a0784daac7556bb962ad7b23143086b34a58e43e211 + languageName: node + linkType: hard + +"modern-ahocorasick@npm:^1.0.0": + version: 1.0.1 + resolution: "modern-ahocorasick@npm:1.0.1" + checksum: ec83479f406511f37a966d66ce1c2b1701bb4a2cc2aabbbc257001178c9fbc48ce748c88eb10dfe72ba8b7f991a0bc7f1fa14683f444685edd1a9eeb32ecbc1e + languageName: node + linkType: hard + +"motion@npm:10.16.2": + version: 10.16.2 + resolution: "motion@npm:10.16.2" + dependencies: + "@motionone/animation": ^10.15.1 + "@motionone/dom": ^10.16.2 + "@motionone/svelte": ^10.16.2 + "@motionone/types": ^10.15.1 + "@motionone/utils": ^10.15.1 + "@motionone/vue": ^10.16.2 + checksum: 0b91256808c2374d8b7f4ac5e7ed513f2ca8df2b7d1be4fbc00ec5baece5162ada648aedaa5bc1d60be9ad2e6c9bc1d3bb160333051c20ab79e241b8e02e3c92 + languageName: node + linkType: hard + +"mri@npm:^1.2.0": + version: 1.2.0 + resolution: "mri@npm:1.2.0" + checksum: 83f515abbcff60150873e424894a2f65d68037e5a7fcde8a9e2b285ee9c13ac581b63cfc1e6826c4732de3aeb84902f7c1e16b7aff46cd3f897a0f757a894e85 + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f + languageName: node + linkType: hard + +"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d + languageName: node + linkType: hard + +"msgpackr-extract@npm:^3.0.2": + version: 3.0.2 + resolution: "msgpackr-extract@npm:3.0.2" + dependencies: + "@msgpackr-extract/msgpackr-extract-darwin-arm64": 3.0.2 + "@msgpackr-extract/msgpackr-extract-darwin-x64": 3.0.2 + "@msgpackr-extract/msgpackr-extract-linux-arm": 3.0.2 + "@msgpackr-extract/msgpackr-extract-linux-arm64": 3.0.2 + "@msgpackr-extract/msgpackr-extract-linux-x64": 3.0.2 + "@msgpackr-extract/msgpackr-extract-win32-x64": 3.0.2 + node-gyp: latest + node-gyp-build-optional-packages: 5.0.7 + dependenciesMeta: + "@msgpackr-extract/msgpackr-extract-darwin-arm64": + optional: true + "@msgpackr-extract/msgpackr-extract-darwin-x64": + optional: true + "@msgpackr-extract/msgpackr-extract-linux-arm": + optional: true + "@msgpackr-extract/msgpackr-extract-linux-arm64": + optional: true + "@msgpackr-extract/msgpackr-extract-linux-x64": + optional: true + "@msgpackr-extract/msgpackr-extract-win32-x64": + optional: true + bin: + download-msgpackr-prebuilds: bin/download-prebuilds.js + checksum: 5adb809b965bac41c310e60373d54c955fe78e4d134ab036d0f9ee5b322cec0a739878d395e17c1ac82d840705896b2dafae6a8cc04ad34c14d2de4b06b58330 + languageName: node + linkType: hard + +"msgpackr@npm:^1.10.1, msgpackr@npm:^1.6.2": + version: 1.10.1 + resolution: "msgpackr@npm:1.10.1" + dependencies: + msgpackr-extract: ^3.0.2 + dependenciesMeta: + msgpackr-extract: + optional: true + checksum: e422d18b01051598b23701eebeb4b9e2c686b9c7826b20f564724837ba2b5cd4af74c91a549eaeaf8186645cc95e8196274a4a19442aa3286ac611b98069c194 + languageName: node + linkType: hard + +"multiformats@npm:^9.4.2": + version: 9.9.0 + resolution: "multiformats@npm:9.9.0" + checksum: d3e8c1be400c09a014f557ea02251a2710dbc9fca5aa32cc702ff29f636c5471e17979f30bdcb0a9cbb556f162a8591dc2e1219c24fc21394a56115b820bb84e + languageName: node + linkType: hard + +"murmur-128@npm:^0.2.1": + version: 0.2.1 + resolution: "murmur-128@npm:0.2.1" + dependencies: + encode-utf8: ^1.0.2 + fmix: ^0.1.0 + imul: ^1.0.0 + checksum: 94ff8b39bf1a1a7bde83b6d13f656bbe591e0a5b5ffe4384c39470120ab70e9eadf0af38557742a30d24421ddc63aea6bba1028a1d6b66553038ee86a660dd92 + languageName: node + linkType: hard + +"nanoid@npm:^3.3.7": + version: 3.3.7 + resolution: "nanoid@npm:3.3.7" + bin: + nanoid: bin/nanoid.cjs + checksum: d36c427e530713e4ac6567d488b489a36582ef89da1d6d4e3b87eded11eb10d7042a877958c6f104929809b2ab0bafa17652b076cdf84324aa75b30b722204f2 + languageName: node + linkType: hard + +"nanoid@npm:^4.0.0": + version: 4.0.1 + resolution: "nanoid@npm:4.0.1" + bin: + nanoid: bin/nanoid.js + checksum: 21022a7910aa690cb05872c07f0c4a317dfe2aa79cc2b5e4ab41d17476e23d973d24c683206d6fa7e1b56bf657cf5dfbc0f1cac7d596bcd2dea0f49635316628 + languageName: node + linkType: hard + +"napi-wasm@npm:^1.1.0": + version: 1.1.0 + resolution: "napi-wasm@npm:1.1.0" + checksum: 649a5d03477b89ee75cd8d7be5404daa5c889915640fd4ab042f2d38d265e961f86933e83982388d72c8b0a3952f36f099b96598ea88210205519ec2adc41d8d + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 + languageName: node + linkType: hard + +"neo-async@npm:^2.6.2": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 + languageName: node + linkType: hard + +"node-abort-controller@npm:^3.1.1": + version: 3.1.1 + resolution: "node-abort-controller@npm:3.1.1" + checksum: 2c340916af9710328b11c0828223fc65ba320e0d082214a211311bf64c2891028e42ef276b9799188c4ada9e6e1c54cf7a0b7c05dd9d59fcdc8cd633304c8047 + languageName: node + linkType: hard + +"node-addon-api@npm:^2.0.0": + version: 2.0.2 + resolution: "node-addon-api@npm:2.0.2" + dependencies: + node-gyp: latest + checksum: 31fb22d674648204f8dd94167eb5aac896c841b84a9210d614bf5d97c74ef059cc6326389cf0c54d2086e35312938401d4cc82e5fcd679202503eb8ac84814f8 + languageName: node + linkType: hard + +"node-addon-api@npm:^7.0.0": + version: 7.1.0 + resolution: "node-addon-api@npm:7.1.0" + dependencies: + node-gyp: latest + checksum: 26640c8d2ed7e2059e2ed65ee79e2a195306b3f1fc27ad11448943ba91d37767bd717a9a0453cc97e83a1109194dced8336a55f8650000458ef625c0b8b5e3df + languageName: node + linkType: hard + +"node-emoji@npm:^1.10.0": + version: 1.11.0 + resolution: "node-emoji@npm:1.11.0" + dependencies: + lodash: ^4.17.21 + checksum: e8c856c04a1645062112a72e59a98b203505ed5111ff84a3a5f40611afa229b578c7d50f1e6a7f17aa62baeea4a640d2e2f61f63afc05423aa267af10977fb2b + languageName: node + linkType: hard + +"node-environment-flags@npm:^1.0.5": + version: 1.0.6 + resolution: "node-environment-flags@npm:1.0.6" + dependencies: + object.getownpropertydescriptors: ^2.0.3 + semver: ^5.7.0 + checksum: 268139ed0f7fabdca346dcb26931300ec7a1dc54a58085a849e5c78a82b94967f55df40177a69d4e819da278d98686d5c4fd49ab0d7bcff16fda25b6fffc4ca3 + languageName: node + linkType: hard + +"node-fetch-native@npm:^1.4.0, node-fetch-native@npm:^1.4.1, node-fetch-native@npm:^1.6.1": + version: 1.6.2 + resolution: "node-fetch-native@npm:1.6.2" + checksum: a6e7b9bf2f671895421441177ebd1d12d2a6f18bc1afc29b8d413f65716faebb6c03adab332eff6392e538da8f40e862c67402bfb8a12c6b54b6a84a1a267377 + languageName: node + linkType: hard + +"node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" + dependencies: + whatwg-url: ^5.0.0 + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: d76d2f5edb451a3f05b15115ec89fc6be39de37c6089f1b6368df03b91e1633fd379a7e01b7ab05089a25034b2023d959b47e59759cb38d88341b2459e89d6e5 + languageName: node + linkType: hard + +"node-forge@npm:^1.3.1": + version: 1.3.1 + resolution: "node-forge@npm:1.3.1" + checksum: 08fb072d3d670599c89a1704b3e9c649ff1b998256737f0e06fbd1a5bf41cae4457ccaee32d95052d80bbafd9ffe01284e078c8071f0267dc9744e51c5ed42a9 + languageName: node + linkType: hard + +"node-gyp-build-optional-packages@npm:5.0.7": + version: 5.0.7 + resolution: "node-gyp-build-optional-packages@npm:5.0.7" + bin: + node-gyp-build-optional-packages: bin.js + node-gyp-build-optional-packages-optional: optional.js + node-gyp-build-optional-packages-test: build-test.js + checksum: bcb4537af15bcb3811914ea0db8f69284ca10db1cc7543a167a4c41ae4b9b5044b133f789fdadad0b7adc6931f6ae7def3c75b0bc7b05836881aae52400163e6 + languageName: node + linkType: hard + +"node-gyp-build@npm:^4.2.0": + version: 4.6.0 + resolution: "node-gyp-build@npm:4.6.0" + bin: + node-gyp-build: bin.js + node-gyp-build-optional: optional.js + node-gyp-build-test: build-test.js + checksum: 25d78c5ef1f8c24291f4a370c47ba52fcea14f39272041a90a7894cd50d766f7c8cb8fb06c0f42bf6f69b204b49d9be3c8fc344aac09714d5bdb95965499eb15 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 9.3.1 + resolution: "node-gyp@npm:9.3.1" + dependencies: + env-paths: ^2.2.0 + glob: ^7.1.4 + graceful-fs: ^4.2.6 + make-fetch-happen: ^10.0.3 + nopt: ^6.0.0 + npmlog: ^6.0.0 + rimraf: ^3.0.2 + semver: ^7.3.5 + tar: ^6.1.2 + which: ^2.0.2 + bin: + node-gyp: bin/node-gyp.js + checksum: b860e9976fa645ca0789c69e25387401b4396b93c8375489b5151a6c55cf2640a3b6183c212b38625ef7c508994930b72198338e3d09b9d7ade5acc4aaf51ea7 + languageName: node + linkType: hard + +"node-int64@npm:^0.4.0": + version: 0.4.0 + resolution: "node-int64@npm:0.4.0" + checksum: d0b30b1ee6d961851c60d5eaa745d30b5c95d94bc0e74b81e5292f7c42a49e3af87f1eb9e89f59456f80645d679202537de751b7d72e9e40ceea40c5e449057e + languageName: node + linkType: hard + +"node-releases@npm:^2.0.14": + version: 2.0.14 + resolution: "node-releases@npm:2.0.14" + checksum: 59443a2f77acac854c42d321bf1b43dea0aef55cd544c6a686e9816a697300458d4e82239e2d794ea05f7bbbc8a94500332e2d3ac3f11f52e4b16cbe638b3c41 + languageName: node + linkType: hard + +"nofilter@npm:^1.0.4": + version: 1.0.4 + resolution: "nofilter@npm:1.0.4" + checksum: 54d864f745de5c3312994e880cf2d4f55e34830d6adc8275dce3731507ca380d21040336e4a277a4901551c07f04c452fbeffd57fad1dc8f68a2943eaf894a04 + languageName: node + linkType: hard + +"nopt@npm:3.x": + version: 3.0.6 + resolution: "nopt@npm:3.0.6" + dependencies: + abbrev: 1 + bin: + nopt: ./bin/nopt.js + checksum: 7f8579029a0d7cb3341c6b1610b31e363f708b7aaaaf3580e3ec5ae8528d1f3a79d350d8bfa331776e6c6703a5a148b72edd9b9b4c1dd55874d8e70e963d1e20 + languageName: node + linkType: hard + +"nopt@npm:^6.0.0": + version: 6.0.0 + resolution: "nopt@npm:6.0.0" + dependencies: + abbrev: ^1.0.0 + bin: + nopt: bin/nopt.js + checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 + languageName: node + linkType: hard + +"npm-run-path@npm:^4.0.1": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" + dependencies: + path-key: ^3.0.0 + checksum: 5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 + languageName: node + linkType: hard + +"npm-run-path@npm:^5.1.0": + version: 5.1.0 + resolution: "npm-run-path@npm:5.1.0" + dependencies: + path-key: ^4.0.0 + checksum: dc184eb5ec239d6a2b990b43236845332ef12f4e0beaa9701de724aa797fe40b6bbd0157fb7639d24d3ab13f5d5cf22d223a19c6300846b8126f335f788bee66 + languageName: node + linkType: hard + +"npmlog@npm:^6.0.0": + version: 6.0.2 + resolution: "npmlog@npm:6.0.2" + dependencies: + are-we-there-yet: ^3.0.0 + console-control-strings: ^1.1.0 + gauge: ^4.0.3 + set-blocking: ^2.0.0 + checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a + languageName: node + linkType: hard + +"number-to-bn@npm:1.7.0": + version: 1.7.0 + resolution: "number-to-bn@npm:1.7.0" + dependencies: + bn.js: 4.11.6 + strip-hex-prefix: 1.0.0 + checksum: 5b8c9dbe7b49dc7a069e5f0ba4e197257c89db11463478cb002fee7a34dc8868636952bd9f6310e5fdf22b266e0e6dffb5f9537c741734718107e90ae59b3de4 + languageName: node + linkType: hard + +"nwsapi@npm:^2.2.2": + version: 2.2.7 + resolution: "nwsapi@npm:2.2.7" + checksum: cab25f7983acec7e23490fec3ef7be608041b460504229770e3bfcf9977c41d6fe58f518994d3bd9aa3a101f501089a3d4a63536f4ff8ae4b8c4ca23bdbfda4e + languageName: node + linkType: hard + +"object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": + version: 1.12.3 + resolution: "object-inspect@npm:1.12.3" + checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db + languageName: node + linkType: hard + +"object-inspect@npm:^1.13.1": + version: 1.13.1 + resolution: "object-inspect@npm:1.13.1" + checksum: 7d9fa9221de3311dcb5c7c307ee5dc011cdd31dc43624b7c184b3840514e118e05ef0002be5388304c416c0eb592feb46e983db12577fc47e47d5752fbbfb61f + languageName: node + linkType: hard + +"object-is@npm:^1.1.5": + version: 1.1.6 + resolution: "object-is@npm:1.1.6" + dependencies: + call-bind: ^1.0.7 + define-properties: ^1.2.1 + checksum: 3ea22759967e6f2380a2cbbd0f737b42dc9ddb2dfefdb159a1b927fea57335e1b058b564bfa94417db8ad58cddab33621a035de6f5e5ad56d89f2dd03e66c6a1 + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a + languageName: node + linkType: hard + +"object.assign@npm:^4.1.4": + version: 4.1.4 + resolution: "object.assign@npm:4.1.4" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + has-symbols: ^1.0.3 + object-keys: ^1.1.1 + checksum: 76cab513a5999acbfe0ff355f15a6a125e71805fcf53de4e9d4e082e1989bdb81d1e329291e1e4e0ae7719f0e4ef80e88fb2d367ae60500d79d25a6224ac8864 + languageName: node + linkType: hard + +"object.assign@npm:^4.1.5": + version: 4.1.5 + resolution: "object.assign@npm:4.1.5" + dependencies: + call-bind: ^1.0.5 + define-properties: ^1.2.1 + has-symbols: ^1.0.3 + object-keys: ^1.1.1 + checksum: f9aeac0541661370a1fc86e6a8065eb1668d3e771f7dbb33ee54578201336c057b21ee61207a186dd42db0c62201d91aac703d20d12a79fc79c353eed44d4e25 + languageName: node + linkType: hard + +"object.getownpropertydescriptors@npm:^2.0.3": + version: 2.1.8 + resolution: "object.getownpropertydescriptors@npm:2.1.8" + dependencies: + array.prototype.reduce: ^1.0.6 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-object-atoms: ^1.0.0 + gopd: ^1.0.1 + safe-array-concat: ^1.1.2 + checksum: 073e492700a7f61ff6c471a2ed96e72473b030a7a105617f03cab192fb4bbc0e6068ef76534ec56afd34baf26b5dc5408de59cb0140ec8abde781e00faa3e63e + languageName: node + linkType: hard + +"object.values@npm:^1.1.6": + version: 1.1.6 + resolution: "object.values@npm:1.1.6" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: f6fff9fd817c24cfd8107f50fb33061d81cd11bacc4e3dbb3852e9ff7692fde4dbce823d4333ea27cd9637ef1b6690df5fbb61f1ed314fa2959598dc3ae23d8e + languageName: node + linkType: hard + +"ofetch@npm:^1.3.3": + version: 1.3.3 + resolution: "ofetch@npm:1.3.3" + dependencies: + destr: ^2.0.1 + node-fetch-native: ^1.4.0 + ufo: ^1.3.0 + checksum: 945d757b25ba144f9f45d9de3382de743f0950e68e76726a4c0d2ef01456fa6700a6b102cc343a4e06f71d5ac59a8affdd9a673751c448f4265996f7f22ffa3d + languageName: node + linkType: hard + +"ohash@npm:^1.1.3": + version: 1.1.3 + resolution: "ohash@npm:1.1.3" + checksum: 44c7321cb950ce6e87d46584fd5cc8dd3dd15fcd4ade0ac2995d0497dc6b6b1ae9bd844c59af185d63923da5cfe9b37ae37a9dbd9ac455f3ad0cdfb5a73d5ef6 + languageName: node + linkType: hard + +"on-exit-leak-free@npm:^0.2.0": + version: 0.2.0 + resolution: "on-exit-leak-free@npm:0.2.0" + checksum: d22b0f0538069110626b578db6e68b6ee0e85b1ee9cc5ef9b4de1bba431431d6a8da91a61e09d2ad46f22a96f968e5237833cb9d0b69bc4d294f7ec82f609b05 + languageName: node + linkType: hard + +"once@npm:1.x, once@npm:^1.3.0, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: 1 + checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 + languageName: node + linkType: hard + +"onetime@npm:^5.1.0, onetime@npm:^5.1.2": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: ^2.1.0 + checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 + languageName: node + linkType: hard + +"onetime@npm:^6.0.0": + version: 6.0.0 + resolution: "onetime@npm:6.0.0" + dependencies: + mimic-fn: ^4.0.0 + checksum: 0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 + languageName: node + linkType: hard + +"open@npm:^8.4.0": + version: 8.4.2 + resolution: "open@npm:8.4.2" + dependencies: + define-lazy-prop: ^2.0.0 + is-docker: ^2.1.1 + is-wsl: ^2.2.0 + checksum: 6388bfff21b40cb9bd8f913f9130d107f2ed4724ea81a8fd29798ee322b361ca31fa2cdfb491a5c31e43a3996cfe9566741238c7a741ada8d7af1cb78d85cf26 + languageName: node + linkType: hard + +"optionator@npm:^0.8.1": + version: 0.8.3 + resolution: "optionator@npm:0.8.3" + dependencies: + deep-is: ~0.1.3 + fast-levenshtein: ~2.0.6 + levn: ~0.3.0 + prelude-ls: ~1.1.2 + type-check: ~0.3.2 + word-wrap: ~1.2.3 + checksum: b8695ddf3d593203e25ab0900e265d860038486c943ff8b774f596a310f8ceebdb30c6832407a8198ba3ec9debe1abe1f51d4aad94843612db3b76d690c61d34 + languageName: node + linkType: hard + +"optionator@npm:^0.9.3": + version: 0.9.3 + resolution: "optionator@npm:0.9.3" + dependencies: + "@aashutoshrathi/word-wrap": ^1.2.3 + deep-is: ^0.1.3 + fast-levenshtein: ^2.0.6 + levn: ^0.4.1 + prelude-ls: ^1.2.1 + type-check: ^0.4.0 + checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a + languageName: node + linkType: hard + +"ora@npm:5.4.1": + version: 5.4.1 + resolution: "ora@npm:5.4.1" + dependencies: + bl: ^4.1.0 + chalk: ^4.1.0 + cli-cursor: ^3.1.0 + cli-spinners: ^2.5.0 + is-interactive: ^1.0.0 + is-unicode-supported: ^0.1.0 + log-symbols: ^4.1.0 + strip-ansi: ^6.0.0 + wcwidth: ^1.0.1 + checksum: 28d476ee6c1049d68368c0dc922e7225e3b5600c3ede88fade8052837f9ed342625fdaa84a6209302587c8ddd9b664f71f0759833cbdb3a4cf81344057e63c63 + languageName: node + linkType: hard + +"outdent@npm:^0.8.0": + version: 0.8.0 + resolution: "outdent@npm:0.8.0" + checksum: 72b7c1a287674317ea477999ec24e73a9eda21de35eb9429218f4a5bab899e964afaee7508265898118fee5cbee1d79397916b66dd8aeee285cd948ea5b1f562 + languageName: node + linkType: hard + +"p-limit@npm:^2.0.0, p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: ^2.0.0 + checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: ^0.1.0 + checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 + languageName: node + linkType: hard + +"p-limit@npm:^5.0.0": + version: 5.0.0 + resolution: "p-limit@npm:5.0.0" + dependencies: + yocto-queue: ^1.0.0 + checksum: 87bf5837dee6942f0dbeff318436179931d9a97848d1b07dbd86140a477a5d2e6b90d9701b210b4e21fe7beaea2979dfde366e4f576fa644a59bd4d6a6371da7 + languageName: node + linkType: hard + +"p-locate@npm:^3.0.0": + version: 3.0.0 + resolution: "p-locate@npm:3.0.0" + dependencies: + p-limit: ^2.0.0 + checksum: 83991734a9854a05fe9dbb29f707ea8a0599391f52daac32b86f08e21415e857ffa60f0e120bfe7ce0cc4faf9274a50239c7895fc0d0579d08411e513b83a4ae + languageName: node + linkType: hard + +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" + dependencies: + p-limit: ^2.2.0 + checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: ^3.0.2 + checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: ^3.0.0 + checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: ^3.0.0 + checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff + languageName: node + linkType: hard + +"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": ^7.0.0 + error-ex: ^1.3.1 + json-parse-even-better-errors: ^2.3.0 + lines-and-columns: ^1.1.6 + checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 + languageName: node + linkType: hard + +"parse-passwd@npm:^1.0.0": + version: 1.0.0 + resolution: "parse-passwd@npm:1.0.0" + checksum: 4e55e0231d58f828a41d0f1da2bf2ff7bcef8f4cb6146e69d16ce499190de58b06199e6bd9b17fbf0d4d8aef9052099cdf8c4f13a6294b1a522e8e958073066e + languageName: node + linkType: hard + +"parse5@npm:^7.0.0, parse5@npm:^7.1.1": + version: 7.1.2 + resolution: "parse5@npm:7.1.2" + dependencies: + entities: ^4.4.0 + checksum: 59465dd05eb4c5ec87b76173d1c596e152a10e290b7abcda1aecf0f33be49646ea74840c69af975d7887543ea45564801736356c568d6b5e71792fd0f4055713 + languageName: node + linkType: hard + +"path-exists@npm:^3.0.0": + version: 3.0.0 + resolution: "path-exists@npm:3.0.0" + checksum: 96e92643aa34b4b28d0de1cd2eba52a1c5313a90c6542d03f62750d82480e20bfa62bc865d5cfc6165f5fcd5aeb0851043c40a39be5989646f223300021bae0a + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 + languageName: node + linkType: hard + +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + languageName: node + linkType: hard + +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 + languageName: node + linkType: hard + +"pathe@npm:^1.1.0, pathe@npm:^1.1.1, pathe@npm:^1.1.2": + version: 1.1.2 + resolution: "pathe@npm:1.1.2" + checksum: ec5f778d9790e7b9ffc3e4c1df39a5bb1ce94657a4e3ad830c1276491ca9d79f189f47609884671db173400256b005f4955f7952f52a2aeb5834ad5fb4faf134 + languageName: node + linkType: hard + +"pbkdf2@npm:^3.0.17": + version: 3.1.2 + resolution: "pbkdf2@npm:3.1.2" + dependencies: + create-hash: ^1.1.2 + create-hmac: ^1.1.4 + ripemd160: ^2.0.1 + safe-buffer: ^5.0.1 + sha.js: ^2.4.8 + checksum: 2c950a100b1da72123449208e231afc188d980177d021d7121e96a2de7f2abbc96ead2b87d03d8fe5c318face097f203270d7e27908af9f471c165a4e8e69c92 + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0": + version: 1.0.0 + resolution: "picocolors@npm:1.0.0" + checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf + languageName: node + linkType: hard + +"pidtree@npm:^0.6.0": + version: 0.6.0 + resolution: "pidtree@npm:0.6.0" + bin: + pidtree: bin/pidtree.js + checksum: 8fbc073ede9209dd15e80d616e65eb674986c93be49f42d9ddde8dbbd141bb53d628a7ca4e58ab5c370bb00383f67d75df59a9a226dede8fa801267a7030c27a + languageName: node + linkType: hard + +"pify@npm:^3.0.0": + version: 3.0.0 + resolution: "pify@npm:3.0.0" + checksum: 6cdcbc3567d5c412450c53261a3f10991665d660961e06605decf4544a61a97a54fefe70a68d5c37080ff9d6f4cf51444c90198d1ba9f9309a6c0d6e9f5c4fde + languageName: node + linkType: hard + +"pify@npm:^4.0.1": + version: 4.0.1 + resolution: "pify@npm:4.0.1" + checksum: 9c4e34278cb09987685fa5ef81499c82546c033713518f6441778fbec623fc708777fe8ac633097c72d88470d5963094076c7305cafc7ad340aae27cfacd856b + languageName: node + linkType: hard + +"pify@npm:^5.0.0": + version: 5.0.0 + resolution: "pify@npm:5.0.0" + checksum: 443e3e198ad6bfa8c0c533764cf75c9d5bc976387a163792fb553ffe6ce923887cf14eebf5aea9b7caa8eab930da8c33612990ae85bd8c2bc18bedb9eae94ecb + languageName: node + linkType: hard + +"pino-abstract-transport@npm:v0.5.0": + version: 0.5.0 + resolution: "pino-abstract-transport@npm:0.5.0" + dependencies: + duplexify: ^4.1.2 + split2: ^4.0.0 + checksum: c503f867de3189f8217ab9cf794e8a631dddd0029a829f0f985f5511308152ebd53e363764fbc5570b3d1c715b341e3923456ce16ad84cd41be2b9a074ada234 + languageName: node + linkType: hard + +"pino-std-serializers@npm:^4.0.0": + version: 4.0.0 + resolution: "pino-std-serializers@npm:4.0.0" + checksum: 89d487729b58c9d3273a0ee851ead068d6d2e2ccc1af8e1c1d28f1b3442423679bec7ec04d9a2aba36f94f335e82be9f4de19dc4fbc161e71c136aaa15b85ad3 + languageName: node + linkType: hard + +"pino@npm:7.11.0": + version: 7.11.0 + resolution: "pino@npm:7.11.0" + dependencies: + atomic-sleep: ^1.0.0 + fast-redact: ^3.0.0 + on-exit-leak-free: ^0.2.0 + pino-abstract-transport: v0.5.0 + pino-std-serializers: ^4.0.0 + process-warning: ^1.0.0 + quick-format-unescaped: ^4.0.3 + real-require: ^0.1.0 + safe-stable-stringify: ^2.1.0 + sonic-boom: ^2.2.1 + thread-stream: ^0.15.1 + bin: + pino: bin.js + checksum: b919e7dbe41de978bb050dcef94fd687c012eb78d344a18f75f04ce180d5810fc162be1f136722d70cd005ed05832c4023a38b9acbc1076ae63c9f5ec5ca515c + languageName: node + linkType: hard + +"pirates@npm:^4.0.4": + version: 4.0.5 + resolution: "pirates@npm:4.0.5" + checksum: c9994e61b85260bec6c4fc0307016340d9b0c4f4b6550a957afaaff0c9b1ad58fbbea5cfcf083860a25cb27a375442e2b0edf52e2e1e40e69934e08dcc52d227 + languageName: node + linkType: hard + +"pirates@npm:^4.0.6": + version: 4.0.6 + resolution: "pirates@npm:4.0.6" + checksum: 46a65fefaf19c6f57460388a5af9ab81e3d7fd0e7bc44ca59d753cb5c4d0df97c6c6e583674869762101836d68675f027d60f841c105d72734df9dfca97cbcc6 + languageName: node + linkType: hard + +"pkg-dir@npm:^3.0.0": + version: 3.0.0 + resolution: "pkg-dir@npm:3.0.0" + dependencies: + find-up: ^3.0.0 + checksum: 70c9476ffefc77552cc6b1880176b71ad70bfac4f367604b2b04efd19337309a4eec985e94823271c7c0e83946fa5aeb18cd360d15d10a5d7533e19344bfa808 + languageName: node + linkType: hard + +"pkg-dir@npm:^4.2.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" + dependencies: + find-up: ^4.0.0 + checksum: 9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 + languageName: node + linkType: hard + +"pkg-types@npm:^1.0.3": + version: 1.0.3 + resolution: "pkg-types@npm:1.0.3" + dependencies: + jsonc-parser: ^3.2.0 + mlly: ^1.2.0 + pathe: ^1.1.0 + checksum: 4b305c834b912ddcc8a0fe77530c0b0321fe340396f84cbb87aecdbc126606f47f2178f23b8639e71a4870f9631c7217aef52ffed0ae17ea2dbbe7e43d116a6e + languageName: node + linkType: hard + +"pluralize@npm:^8.0.0": + version: 8.0.0 + resolution: "pluralize@npm:8.0.0" + checksum: 08931d4a6a4a5561a7f94f67a31c17e6632cb21e459ab3ff4f6f629d9a822984cf8afef2311d2005fbea5d7ef26016ebb090db008e2d8bce39d0a9a9d218736e + languageName: node + linkType: hard + +"pngjs@npm:^5.0.0": + version: 5.0.0 + resolution: "pngjs@npm:5.0.0" + checksum: 04e912cc45fb9601564e2284efaf0c5d20d131d9b596244f8a6789fc6cdb6b18d2975a6bbf7a001858d7e159d5c5c5dd7b11592e97629b7137f7f5cef05904c8 + languageName: node + linkType: hard + +"pony-cause@npm:^2.1.10": + version: 2.1.10 + resolution: "pony-cause@npm:2.1.10" + checksum: 8b61378f213e61056312dc274a1c79980154e9d864f6ad86e0c8b91a50d3ce900d430995ee24147c9f3caa440dfe7d51c274b488d7f033b65b206522536d7217 + languageName: node + linkType: hard + +"possible-typed-array-names@npm:^1.0.0": + version: 1.0.0 + resolution: "possible-typed-array-names@npm:1.0.0" + checksum: b32d403ece71e042385cc7856385cecf1cd8e144fa74d2f1de40d1e16035dba097bc189715925e79b67bdd1472796ff168d3a90d296356c9c94d272d5b95f3ae + languageName: node + linkType: hard + +"postcss@npm:^8.4.35": + version: 8.4.35 + resolution: "postcss@npm:8.4.35" + dependencies: + nanoid: ^3.3.7 + picocolors: ^1.0.0 + source-map-js: ^1.0.2 + checksum: cf3c3124d3912a507603f6d9a49b3783f741075e9aa73eb592a6dd9194f9edab9d20a8875d16d137d4f779fe7b6fbd1f5727e39bfd1c3003724980ee4995e1da + languageName: node + linkType: hard + +"preact@npm:^10.12.0, preact@npm:^10.16.0": + version: 10.19.6 + resolution: "preact@npm:10.19.6" + checksum: fe697a4ed6c79ec9997496ec735600744fa14495110da2ea40fa4e22429ad4e116dfe0ed786ab8c5c4fd233a479d1e4ac21ffb6748895ac80d3279c5d187b4c1 + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a + languageName: node + linkType: hard + +"prelude-ls@npm:~1.1.2": + version: 1.1.2 + resolution: "prelude-ls@npm:1.1.2" + checksum: c4867c87488e4a0c233e158e4d0d5565b609b105d75e4c05dc760840475f06b731332eb93cc8c9cecb840aa8ec323ca3c9a56ad7820ad2e63f0261dadcb154e4 + languageName: node + linkType: hard + +"prettier-linter-helpers@npm:^1.0.0": + version: 1.0.0 + resolution: "prettier-linter-helpers@npm:1.0.0" + dependencies: + fast-diff: ^1.1.2 + checksum: 00ce8011cf6430158d27f9c92cfea0a7699405633f7f1d4a45f07e21bf78e99895911cbcdc3853db3a824201a7c745bd49bfea8abd5fb9883e765a90f74f8392 + languageName: node + linkType: hard + +"prettier-plugin-solidity@npm:^1.1.3": + version: 1.1.3 + resolution: "prettier-plugin-solidity@npm:1.1.3" + dependencies: + "@solidity-parser/parser": ^0.16.0 + semver: ^7.3.8 + solidity-comments-extractor: ^0.0.7 + peerDependencies: + prettier: ">=2.3.0 || >=3.0.0-alpha.0" + checksum: d5aadfa411a4d983a2bd204048726fd91fbcaffbfa26d818ef0d6001fb65f82d0eae082e935e96c79e65e09ed979b186311ddb8c38be2f0ce5dd5f5265df77fe + languageName: node + linkType: hard + +"prettier@npm:^2.3.1, prettier@npm:^2.8.3, prettier@npm:^2.8.8": + version: 2.8.8 + resolution: "prettier@npm:2.8.8" + bin: + prettier: bin-prettier.js + checksum: b49e409431bf129dd89238d64299ba80717b57ff5a6d1c1a8b1a28b590d998a34e083fa13573bc732bb8d2305becb4c9a4407f8486c81fa7d55100eb08263cf8 + languageName: node + linkType: hard + +"pretty-format@npm:^27.0.2": + version: 27.5.1 + resolution: "pretty-format@npm:27.5.1" + dependencies: + ansi-regex: ^5.0.1 + ansi-styles: ^5.0.0 + react-is: ^17.0.1 + checksum: cf610cffcb793885d16f184a62162f2dd0df31642d9a18edf4ca298e909a8fe80bdbf556d5c9573992c102ce8bf948691da91bf9739bee0ffb6e79c8a8a6e088 + languageName: node + linkType: hard + +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.6.2, pretty-format@npm:^29.7.0": + version: 29.7.0 + resolution: "pretty-format@npm:29.7.0" + dependencies: + "@jest/schemas": ^29.6.3 + ansi-styles: ^5.0.0 + react-is: ^18.0.0 + checksum: 032c1602383e71e9c0c02a01bbd25d6759d60e9c7cf21937dde8357aa753da348fcec5def5d1002c9678a8524d5fe099ad98861286550ef44de8808cc61e43b6 + languageName: node + linkType: hard + +"process-warning@npm:^1.0.0": + version: 1.0.0 + resolution: "process-warning@npm:1.0.0" + checksum: c708a03241deec3cabaeee39c4f9ee8c4d71f1c5ef9b746c8252cdb952a6059068cfcdaf348399775244cbc441b6ae5e26a9c87ed371f88335d84f26d19180f9 + languageName: node + linkType: hard + +"promise-inflight@npm:^1.0.1": + version: 1.0.1 + resolution: "promise-inflight@npm:1.0.1" + checksum: 22749483091d2c594261517f4f80e05226d4d5ecc1fc917e1886929da56e22b5718b7f2a75f3807e7a7d471bc3be2907fe92e6e8f373ddf5c64bae35b5af3981 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: ^2.0.2 + retry: ^0.12.0 + checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 + languageName: node + linkType: hard + +"prompts@npm:2.4.2, prompts@npm:^2.0.1": + version: 2.4.2 + resolution: "prompts@npm:2.4.2" + dependencies: + kleur: ^3.0.3 + sisteransi: ^1.0.5 + checksum: d8fd1fe63820be2412c13bfc5d0a01909acc1f0367e32396962e737cb2fc52d004f3302475d5ce7d18a1e8a79985f93ff04ee03007d091029c3f9104bffc007d + languageName: node + linkType: hard + +"proxy-compare@npm:2.5.1": + version: 2.5.1 + resolution: "proxy-compare@npm:2.5.1" + checksum: c7cc151ac255150bcb24becde6495b3e399416c31991af377ce082255b51f07eaeb5d861bf8bf482703e92f88b90a5892ad57d3153ea29450d03ef921683d9fa + languageName: node + linkType: hard + +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 + languageName: node + linkType: hard + +"psl@npm:^1.1.33": + version: 1.9.0 + resolution: "psl@npm:1.9.0" + checksum: 20c4277f640c93d393130673f392618e9a8044c6c7bf61c53917a0fddb4952790f5f362c6c730a9c32b124813e173733f9895add8d26f566ed0ea0654b2e711d + languageName: node + linkType: hard + +"punycode@npm:^2.1.0, punycode@npm:^2.1.1": + version: 2.3.0 + resolution: "punycode@npm:2.3.0" + checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 + languageName: node + linkType: hard + +"pure-rand@npm:^6.0.0": + version: 6.0.1 + resolution: "pure-rand@npm:6.0.1" + checksum: 4bb565399993b815658a72e359f574ce4f04827a42a905105d61163ae86f456d91595a0e4241e7bce04328fae0638ae70ac0428d93ecb55971c465bd084f8648 + languageName: node + linkType: hard + +"qrcode@npm:1.5.3, qrcode@npm:^1.5.1": + version: 1.5.3 + resolution: "qrcode@npm:1.5.3" + dependencies: + dijkstrajs: ^1.0.1 + encode-utf8: ^1.0.3 + pngjs: ^5.0.0 + yargs: ^15.3.1 + bin: + qrcode: bin/qrcode + checksum: 9a8a20a0a9cb1d15de8e7b3ffa214e8b6d2a8b07655f25bd1b1d77f4681488f84d7bae569870c0652872d829d5f8ac4922c27a6bd14c13f0e197bf07b28dead7 + languageName: node + linkType: hard + +"qs@npm:^6.9.4": + version: 6.11.2 + resolution: "qs@npm:6.11.2" + dependencies: + side-channel: ^1.0.4 + checksum: e812f3c590b2262548647d62f1637b6989cc56656dc960b893fe2098d96e1bd633f36576f4cd7564dfbff9db42e17775884db96d846bebe4f37420d073ecdc0b + languageName: node + linkType: hard + +"query-string@npm:7.1.3": + version: 7.1.3 + resolution: "query-string@npm:7.1.3" + dependencies: + decode-uri-component: ^0.2.2 + filter-obj: ^1.1.0 + split-on-first: ^1.0.0 + strict-uri-encode: ^2.0.0 + checksum: 91af02dcd9cc9227a052841d5c2eecb80a0d6489d05625df506a097ef1c59037cfb5e907f39b84643cbfd535c955abec3e553d0130a7b510120c37d06e0f4346 + languageName: node + linkType: hard + +"query-string@npm:^6.13.5": + version: 6.14.1 + resolution: "query-string@npm:6.14.1" + dependencies: + decode-uri-component: ^0.2.0 + filter-obj: ^1.1.0 + split-on-first: ^1.0.0 + strict-uri-encode: ^2.0.0 + checksum: f2c7347578fa0f3fd4eaace506470cb4e9dc52d409a7ddbd613f614b9a594d750877e193b5d5e843c7477b3b295b857ec328903c943957adc41a3efb6c929449 + languageName: node + linkType: hard + +"querystringify@npm:^2.1.1": + version: 2.2.0 + resolution: "querystringify@npm:2.2.0" + checksum: 5641ea231bad7ef6d64d9998faca95611ed4b11c2591a8cae741e178a974f6a8e0ebde008475259abe1621cb15e692404e6b6626e927f7b849d5c09392604b15 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 + languageName: node + linkType: hard + +"quick-format-unescaped@npm:^4.0.3": + version: 4.0.4 + resolution: "quick-format-unescaped@npm:4.0.4" + checksum: 7bc32b99354a1aa46c089d2a82b63489961002bb1d654cee3e6d2d8778197b68c2d854fd23d8422436ee1fdfd0abaddc4d4da120afe700ade68bd357815b26fd + languageName: node + linkType: hard + +"radix3@npm:^1.1.0": + version: 1.1.0 + resolution: "radix3@npm:1.1.0" + checksum: e5e6ed8fcf68be4d124bca4f7da7ba0fc7c5b6f9e98bc3f4424459c45d50f1f92506c5f7f8421b5cfee5823c524a4a2cef416053e88845813ce9fc9c7086729a + languageName: node + linkType: hard + +"rambda@npm:^7.1.0": + version: 7.5.0 + resolution: "rambda@npm:7.5.0" + checksum: ad608a9a4160d0b6b0921047cea1329276bf239ff58d439135288712dcdbbf0df47c76591843ad249d89e7c5a9109ce86fe099aa54aef0dc0aa92a9b4dd1b8eb + languageName: node + linkType: hard + +"randombytes@npm:^2.1.0": + version: 2.1.0 + resolution: "randombytes@npm:2.1.0" + dependencies: + safe-buffer: ^5.1.0 + checksum: d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6 + languageName: node + linkType: hard + +"react-is@npm:^17.0.1": + version: 17.0.2 + resolution: "react-is@npm:17.0.2" + checksum: 9d6d111d8990dc98bc5402c1266a808b0459b5d54830bbea24c12d908b536df7883f268a7868cfaedde3dd9d4e0d574db456f84d2e6df9c4526f99bb4b5344d8 + languageName: node + linkType: hard + +"react-is@npm:^18.0.0": + version: 18.2.0 + resolution: "react-is@npm:18.2.0" + checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e + languageName: node + linkType: hard + +"react-refresh@npm:^0.14.0": + version: 0.14.0 + resolution: "react-refresh@npm:0.14.0" + checksum: dc69fa8c993df512f42dd0f1b604978ae89bd747c0ed5ec595c0cc50d535fb2696619ccd98ae28775cc01d0a7c146a532f0f7fb81dc22e1977c242a4912312f4 + languageName: node + linkType: hard + +"read-yaml-file@npm:2.1.0": + version: 2.1.0 + resolution: "read-yaml-file@npm:2.1.0" + dependencies: + js-yaml: ^4.0.0 + strip-bom: ^4.0.0 + checksum: 52765eb183e79466f51eebeb19b933cc0f0e907052d062d67300b97e79910064a24b370cdb0b5dd8b05afff3d0ec57282670fd9070dc608e13b11820ac79183d + languageName: node + linkType: hard + +"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: ^2.0.3 + string_decoder: ^1.1.1 + util-deprecate: ^1.0.1 + checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d + languageName: node + linkType: hard + +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: ^2.2.1 + checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 + languageName: node + linkType: hard + +"real-require@npm:^0.1.0": + version: 0.1.0 + resolution: "real-require@npm:0.1.0" + checksum: 96745583ed4f82cd5c6a6af012fd1d3c6fc2f13ae1bcff1a3c4f8094696013a1a07c82c5aa66a403d7d4f84949fc2203bc927c7ad120caad125941ca2d7e5e8e + languageName: node + linkType: hard + +"realistic-structured-clone@npm:^3.0.0": + version: 3.0.0 + resolution: "realistic-structured-clone@npm:3.0.0" + dependencies: + domexception: ^1.0.1 + typeson: ^6.1.0 + typeson-registry: ^1.0.0-alpha.20 + checksum: b4521b299c8dc320a5e3ef44678f80a92b0f1837901a5fbd1c7be06808110fb0b591b417114306ec55b44ef47fd17968aacca079afc9665afbe1c528026295ec + languageName: node + linkType: hard + +"rechoir@npm:^0.6.2": + version: 0.6.2 + resolution: "rechoir@npm:0.6.2" + dependencies: + resolve: ^1.1.6 + checksum: fe76bf9c21875ac16e235defedd7cbd34f333c02a92546142b7911a0f7c7059d2e16f441fe6fb9ae203f459c05a31b2bcf26202896d89e390eda7514d5d2702b + languageName: node + linkType: hard + +"recursive-readdir@npm:^2.2.2": + version: 2.2.3 + resolution: "recursive-readdir@npm:2.2.3" + dependencies: + minimatch: ^3.0.5 + checksum: 88ec96e276237290607edc0872b4f9842837b95cfde0cdbb1e00ba9623dfdf3514d44cdd14496ab60a0c2dd180a6ef8a3f1c34599e6cf2273afac9b72a6fb2b5 + languageName: node + linkType: hard + +"redent@npm:^3.0.0": + version: 3.0.0 + resolution: "redent@npm:3.0.0" + dependencies: + indent-string: ^4.0.0 + strip-indent: ^3.0.0 + checksum: fa1ef20404a2d399235e83cc80bd55a956642e37dd197b4b612ba7327bf87fa32745aeb4a1634b2bab25467164ab4ed9c15be2c307923dd08b0fe7c52431ae6b + languageName: node + linkType: hard + +"redis-errors@npm:^1.0.0, redis-errors@npm:^1.2.0": + version: 1.2.0 + resolution: "redis-errors@npm:1.2.0" + checksum: f28ac2692113f6f9c222670735aa58aeae413464fd58ccf3fce3f700cae7262606300840c802c64f2b53f19f65993da24dc918afc277e9e33ac1ff09edb394f4 + languageName: node + linkType: hard + +"redis-parser@npm:^3.0.0": + version: 3.0.0 + resolution: "redis-parser@npm:3.0.0" + dependencies: + redis-errors: ^1.0.0 + checksum: 89290ae530332f2ae37577647fa18208d10308a1a6ba750b9d9a093e7398f5e5253f19855b64c98757f7129cccce958e4af2573fdc33bad41405f87f1943459a + languageName: node + linkType: hard + +"reduce-flatten@npm:^2.0.0": + version: 2.0.0 + resolution: "reduce-flatten@npm:2.0.0" + checksum: 64393ef99a16b20692acfd60982d7fdbd7ff8d9f8f185c6023466444c6dd2abb929d67717a83cec7f7f8fb5f46a25d515b3b2bf2238fdbfcdbfd01d2a9e73cb8 + languageName: node + linkType: hard + +"regenerator-runtime@npm:^0.14.0": + version: 0.14.1 + resolution: "regenerator-runtime@npm:0.14.1" + checksum: 9f57c93277b5585d3c83b0cf76be47b473ae8c6d9142a46ce8b0291a04bb2cf902059f0f8445dcabb3fb7378e5fe4bb4ea1e008876343d42e46d3b484534ce38 + languageName: node + linkType: hard + +"regexp.prototype.flags@npm:^1.4.3, regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.2": + version: 1.5.2 + resolution: "regexp.prototype.flags@npm:1.5.2" + dependencies: + call-bind: ^1.0.6 + define-properties: ^1.2.1 + es-errors: ^1.3.0 + set-function-name: ^2.0.1 + checksum: d7f333667d5c564e2d7a97c56c3075d64c722c9bb51b2b4df6822b2e8096d623a5e63088fb4c83df919b6951ef8113841de8b47de7224872fa6838bc5d8a7d64 + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b + languageName: node + linkType: hard + +"require-like@npm:>= 0.1.1": + version: 0.1.2 + resolution: "require-like@npm:0.1.2" + checksum: edb8331f05fd807381a75b76f6cca9f0ce8acaa2e910b7e116541799aa970bfbc64fde5fd6adb3a6917dba346f8386ebbddb81614c24e8dad1b4290c7af9535e + languageName: node + linkType: hard + +"require-main-filename@npm:^2.0.0": + version: 2.0.0 + resolution: "require-main-filename@npm:2.0.0" + checksum: e9e294695fea08b076457e9ddff854e81bffbe248ed34c1eec348b7abbd22a0d02e8d75506559e2265e96978f3c4720bd77a6dad84755de8162b357eb6c778c7 + languageName: node + linkType: hard + +"requires-port@npm:^1.0.0": + version: 1.0.0 + resolution: "requires-port@npm:1.0.0" + checksum: eee0e303adffb69be55d1a214e415cf42b7441ae858c76dfc5353148644f6fd6e698926fc4643f510d5c126d12a705e7c8ed7e38061113bdf37547ab356797ff + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: ^5.0.0 + checksum: 546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f + languageName: node + linkType: hard + +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf + languageName: node + linkType: hard + +"resolve.exports@npm:^2.0.0": + version: 2.0.1 + resolution: "resolve.exports@npm:2.0.1" + checksum: 03be177026b4fe8dc1b2ffb421bce9cbf7fe3446e9f0c958df9fc8e144864b3eeea19fe788e057fd8be6b5655e65ce245b4f379258c1336e2e8f9205cbd4a9b4 + languageName: node + linkType: hard + +"resolve@npm:1.1.x": + version: 1.1.7 + resolution: "resolve@npm:1.1.7" + checksum: afd20873fbde7641c9125efe3f940c2a99f6b1f90f1b7b743e744bdaac1cb105b2e4e0317bcc052ed7e31d57afa86b394a4dc9a1b33a297977be134fdf0250ab + languageName: node + linkType: hard + +"resolve@npm:^1.1.6, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.2": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c + languageName: node + linkType: hard + +"resolve@patch:resolve@1.1.x#~builtin": + version: 1.1.7 + resolution: "resolve@patch:resolve@npm%3A1.1.7#~builtin::version=1.1.7&hash=3bafbf" + checksum: e9dbca78600ae56835c43a09f1276876c883e4b4bbd43e2683fa140671519d2bdebeb1c1576ca87c8c508ae2987b3ec481645ac5d3054b0f23254cfc1ce49942 + languageName: node + linkType: hard + +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin, resolve@patch:resolve@^1.22.2#~builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 + languageName: node + linkType: hard + +"restore-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "restore-cursor@npm:3.1.0" + dependencies: + onetime: ^5.1.0 + signal-exit: ^3.0.2 + checksum: f877dd8741796b909f2a82454ec111afb84eb45890eb49ac947d87991379406b3b83ff9673a46012fca0d7844bb989f45cc5b788254cf1a39b6b5a9659de0630 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + languageName: node + linkType: hard + +"rfdc@npm:^1.3.0": + version: 1.3.0 + resolution: "rfdc@npm:1.3.0" + checksum: fb2ba8512e43519983b4c61bd3fa77c0f410eff6bae68b08614437bc3f35f91362215f7b4a73cbda6f67330b5746ce07db5dd9850ad3edc91271ad6deea0df32 + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: ^7.1.3 + bin: + rimraf: bin.js + checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 + languageName: node + linkType: hard + +"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": + version: 2.0.2 + resolution: "ripemd160@npm:2.0.2" + dependencies: + hash-base: ^3.0.0 + inherits: ^2.0.1 + checksum: 006accc40578ee2beae382757c4ce2908a826b27e2b079efdcd2959ee544ddf210b7b5d7d5e80467807604244e7388427330f5c6d4cd61e6edaddc5773ccc393 + languageName: node + linkType: hard + +"river@workspace:.": + version: 0.0.0-use.local + resolution: "river@workspace:." + dependencies: + "@typechain/ethers-v5": ^10.1.1 + "@types/node": ^20.5.0 + eslint: ^8.53.0 + eslint-config-prettier: ^8.8.0 + eslint-plugin-mocha: ^10.1.0 + eslint-plugin-n: ^16.0.0 + eslint-plugin-prettier: ^4.2.1 + husky: ^8.0.1 + lint-staged: ^13.1.2 + prettier: ^2.8.8 + solidity-docgen: ^0.6.0-beta.29 + syncpack: ^10.7.3 + ts-node: ^10.9.1 + turbo: ^1.12.2 + typechain: ^8.1.1 + typescript: ^5.1.6 + wait-on: ^7.0.1 + languageName: unknown + linkType: soft + +"rlp@npm:^2.2.4": + version: 2.2.7 + resolution: "rlp@npm:2.2.7" + dependencies: + bn.js: ^5.2.0 + bin: + rlp: bin/rlp + checksum: 3db4dfe5c793f40ac7e0be689a1f75d05e6f2ca0c66189aeb62adab8c436b857ab4420a419251ee60370d41d957a55698fc5e23ab1e1b41715f33217bc4bb558 + languageName: node + linkType: hard + +"rollup-plugin-polyfill-node@npm:^0.12.0": + version: 0.12.0 + resolution: "rollup-plugin-polyfill-node@npm:0.12.0" + dependencies: + "@rollup/plugin-inject": ^5.0.1 + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 + checksum: d5cf7fcd15795cb3fc0c005c04b1ad30b776202591ae6d316654a2e0388861f8c0950234f4979eaae6024f3da37f08a3d83cc94cb625fbe3984b68a1184f7165 + languageName: node + linkType: hard + +"rollup-plugin-visualizer@npm:^5.12.0": + version: 5.12.0 + resolution: "rollup-plugin-visualizer@npm:5.12.0" + dependencies: + open: ^8.4.0 + picomatch: ^2.3.1 + source-map: ^0.7.4 + yargs: ^17.5.1 + peerDependencies: + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rollup: + optional: true + bin: + rollup-plugin-visualizer: dist/bin/cli.js + checksum: 17dc10a93d4bd457c8bb7796a57c284487fb00f4b9703a33a1a954f5d40c66a89b24aca98564569922456f4fa8f72281c3ef96a95502195e6930b3fac62fce8e + languageName: node + linkType: hard + +"rollup@npm:^4.2.0": + version: 4.3.0 + resolution: "rollup@npm:4.3.0" + dependencies: + "@rollup/rollup-android-arm-eabi": 4.3.0 + "@rollup/rollup-android-arm64": 4.3.0 + "@rollup/rollup-darwin-arm64": 4.3.0 + "@rollup/rollup-darwin-x64": 4.3.0 + "@rollup/rollup-linux-arm-gnueabihf": 4.3.0 + "@rollup/rollup-linux-arm64-gnu": 4.3.0 + "@rollup/rollup-linux-arm64-musl": 4.3.0 + "@rollup/rollup-linux-x64-gnu": 4.3.0 + "@rollup/rollup-linux-x64-musl": 4.3.0 + "@rollup/rollup-win32-arm64-msvc": 4.3.0 + "@rollup/rollup-win32-ia32-msvc": 4.3.0 + "@rollup/rollup-win32-x64-msvc": 4.3.0 + fsevents: ~2.3.2 + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 8791b160407188a794fa4a529d1740e2310625254450753d2d8413cf26855ed8758146e110724492df8d6a108a5362c999f07a387c52143afc20cf27695b34c2 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: ^1.2.2 + checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d + languageName: node + linkType: hard + +"rxjs@npm:*, rxjs@npm:^7.8.0": + version: 7.8.0 + resolution: "rxjs@npm:7.8.0" + dependencies: + tslib: ^2.1.0 + checksum: 61b4d4fd323c1043d8d6ceb91f24183b28bcf5def4f01ca111511d5c6b66755bc5578587fe714ef5d67cf4c9f2e26f4490d4e1d8cabf9bd5967687835e9866a2 + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.1.2": + version: 1.1.2 + resolution: "safe-array-concat@npm:1.1.2" + dependencies: + call-bind: ^1.0.7 + get-intrinsic: ^1.2.4 + has-symbols: ^1.0.3 + isarray: ^2.0.5 + checksum: a3b259694754ddfb73ae0663829e396977b99ff21cbe8607f35a469655656da8e271753497e59da8a7575baa94d2e684bea3e10ddd74ba046c0c9b4418ffa0c4 + languageName: node + linkType: hard + +"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-regex-test@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.3 + is-regex: ^1.1.4 + checksum: bc566d8beb8b43c01b94e67de3f070fd2781685e835959bbbaaec91cc53381145ca91f69bd837ce6ec244817afa0a5e974fc4e40a2957f0aca68ac3add1ddd34 + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.0.3": + version: 1.0.3 + resolution: "safe-regex-test@npm:1.0.3" + dependencies: + call-bind: ^1.0.6 + es-errors: ^1.3.0 + is-regex: ^1.1.4 + checksum: 6c7d392ff1ae7a3ae85273450ed02d1d131f1d2c76e177d6b03eb88e6df8fa062639070e7d311802c1615f351f18dc58f9454501c58e28d5ffd9b8f502ba6489 + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^2.1.0": + version: 2.4.3 + resolution: "safe-stable-stringify@npm:2.4.3" + checksum: 3aeb64449706ee1f5ad2459fc99648b131d48e7a1fbb608d7c628020177512dc9d94108a5cb61bbc953985d313d0afea6566d243237743e02870490afef04b43 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 + languageName: node + linkType: hard + +"saxes@npm:^6.0.0": + version: 6.0.0 + resolution: "saxes@npm:6.0.0" + dependencies: + xmlchars: ^2.2.0 + checksum: d3fa3e2aaf6c65ed52ee993aff1891fc47d5e47d515164b5449cbf5da2cbdc396137e55590472e64c5c436c14ae64a8a03c29b9e7389fc6f14035cf4e982ef3b + languageName: node + linkType: hard + +"sc-istanbul@npm:^0.4.5": + version: 0.4.6 + resolution: "sc-istanbul@npm:0.4.6" + dependencies: + abbrev: 1.0.x + async: 1.x + escodegen: 1.8.x + esprima: 2.7.x + glob: ^5.0.15 + handlebars: ^4.0.1 + js-yaml: 3.x + mkdirp: 0.5.x + nopt: 3.x + once: 1.x + resolve: 1.1.x + supports-color: ^3.1.0 + which: ^1.1.1 + wordwrap: ^1.0.0 + bin: + istanbul: lib/cli.js + checksum: 256472ebd35787985be7fc924f817f3e0fcf0ed17655250555bf24f76d44af18fd1b25a91c33458e17a4c57b80375bea22d46e2a982880ffbde1b1a94dfeed19 + languageName: node + linkType: hard + +"scrypt-js@npm:3.0.1, scrypt-js@npm:^3.0.0, scrypt-js@npm:^3.0.1": + version: 3.0.1 + resolution: "scrypt-js@npm:3.0.1" + checksum: b7c7d1a68d6ca946f2fbb0778e0c4ec63c65501b54023b2af7d7e9f48fdb6c6580d6f7675cd53bda5944c5ebc057560d5a6365079752546865defb3b79dea454 + languageName: node + linkType: hard + +"secp256k1@npm:^4.0.1": + version: 4.0.3 + resolution: "secp256k1@npm:4.0.3" + dependencies: + elliptic: ^6.5.4 + node-addon-api: ^2.0.0 + node-gyp: latest + node-gyp-build: ^4.2.0 + checksum: 21e219adc0024fbd75021001358780a3cc6ac21273c3fcaef46943af73969729709b03f1df7c012a0baab0830fb9a06ccc6b42f8d50050c665cb98078eab477b + languageName: node + linkType: hard + +"seedrandom@npm:^3.0.5": + version: 3.0.5 + resolution: "seedrandom@npm:3.0.5" + checksum: 728b56bc3bc1b9ddeabd381e449b51cb31bdc0aa86e27fcd0190cea8c44613d5bcb2f6bb63ed79f78180cbe791c20b8ec31a9627f7b7fc7f476fd2bdb7e2da9f + languageName: node + linkType: hard + +"semver@npm:7.5.3": + version: 7.5.3 + resolution: "semver@npm:7.5.3" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 9d58db16525e9f749ad0a696a1f27deabaa51f66e91d2fa2b0db3de3e9644e8677de3b7d7a03f4c15bc81521e0c3916d7369e0572dbde250d9bedf5194e2a8a7 + languageName: node + linkType: hard + +"semver@npm:^5.6.0, semver@npm:^5.7.0": + version: 5.7.2 + resolution: "semver@npm:5.7.2" + bin: + semver: bin/semver + checksum: fb4ab5e0dd1c22ce0c937ea390b4a822147a9c53dbd2a9a0132f12fe382902beef4fbf12cf51bb955248d8d15874ce8cd89532569756384f994309825f10b686 + languageName: node + linkType: hard + +"semver@npm:^6.3.0, semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2 + languageName: node + linkType: hard + +"semver@npm:^7.0.0, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.0, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4": + version: 7.6.0 + resolution: "semver@npm:7.6.0" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 7427f05b70786c696640edc29fdd4bc33b2acf3bbe1740b955029044f80575fc664e1a512e4113c3af21e767154a94b4aa214bf6cd6e42a1f6dba5914e0b208c + languageName: node + linkType: hard + +"serialize-javascript@npm:6.0.0": + version: 6.0.0 + resolution: "serialize-javascript@npm:6.0.0" + dependencies: + randombytes: ^2.1.0 + checksum: 56f90b562a1bdc92e55afb3e657c6397c01a902c588c0fe3d4c490efdcc97dcd2a3074ba12df9e94630f33a5ce5b76a74784a7041294628a6f4306e0ec84bf93 + languageName: node + linkType: hard + +"set-blocking@npm:^2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 + languageName: node + linkType: hard + +"set-function-length@npm:^1.2.1": + version: 1.2.1 + resolution: "set-function-length@npm:1.2.1" + dependencies: + define-data-property: ^1.1.2 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.3 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.1 + checksum: 23742476d695f2eae86348c069bd164d4f25fa7c26546a46a2b5f370f1f84b98ec64366d2cd17785d5b41bbf16b95855da4b7eb188e7056fe3b0248d61f6afda + languageName: node + linkType: hard + +"set-function-name@npm:^2.0.1": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" + dependencies: + define-data-property: ^1.1.4 + es-errors: ^1.3.0 + functions-have-names: ^1.2.3 + has-property-descriptors: ^1.0.2 + checksum: d6229a71527fd0404399fc6227e0ff0652800362510822a291925c9d7b48a1ca1a468b11b281471c34cd5a2da0db4f5d7ff315a61d26655e77f6e971e6d0c80f + languageName: node + linkType: hard + +"setimmediate@npm:^1.0.5": + version: 1.0.5 + resolution: "setimmediate@npm:1.0.5" + checksum: c9a6f2c5b51a2dabdc0247db9c46460152ffc62ee139f3157440bd48e7c59425093f42719ac1d7931f054f153e2d26cf37dfeb8da17a794a58198a2705e527fd + languageName: node + linkType: hard + +"sha.js@npm:^2.4.0, sha.js@npm:^2.4.11, sha.js@npm:^2.4.8": + version: 2.4.11 + resolution: "sha.js@npm:2.4.11" + dependencies: + inherits: ^2.0.1 + safe-buffer: ^5.0.1 + bin: + sha.js: ./bin.js + checksum: ebd3f59d4b799000699097dadb831c8e3da3eb579144fd7eb7a19484cbcbb7aca3c68ba2bb362242eb09e33217de3b4ea56e4678184c334323eca24a58e3ad07 + languageName: node + linkType: hard + +"shallow-clone@npm:^3.0.0": + version: 3.0.1 + resolution: "shallow-clone@npm:3.0.1" + dependencies: + kind-of: ^6.0.2 + checksum: 39b3dd9630a774aba288a680e7d2901f5c0eae7b8387fc5c8ea559918b29b3da144b7bdb990d7ccd9e11be05508ac9e459ce51d01fd65e583282f6ffafcba2e7 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: ^3.0.0 + checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + languageName: node + linkType: hard + +"shelljs@npm:^0.8.3": + version: 0.8.5 + resolution: "shelljs@npm:0.8.5" + dependencies: + glob: ^7.0.0 + interpret: ^1.0.0 + rechoir: ^0.6.2 + bin: + shjs: bin/shjs + checksum: 7babc46f732a98f4c054ec1f048b55b9149b98aa2da32f6cf9844c434b43c6251efebd6eec120937bd0999e13811ebd45efe17410edb3ca938f82f9381302748 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.4": + version: 1.0.4 + resolution: "side-channel@npm:1.0.4" + dependencies: + call-bind: ^1.0.0 + get-intrinsic: ^1.0.2 + object-inspect: ^1.9.0 + checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 + languageName: node + linkType: hard + +"signal-exit@npm:^4.1.0": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 + languageName: node + linkType: hard + +"sisteransi@npm:^1.0.5": + version: 1.0.5 + resolution: "sisteransi@npm:1.0.5" + checksum: aba6438f46d2bfcef94cf112c835ab395172c75f67453fe05c340c770d3c402363018ae1ab4172a1026a90c47eaccf3af7b6ff6fa749a680c2929bd7fa2b37a4 + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c + languageName: node + linkType: hard + +"slash@npm:^4.0.0": + version: 4.0.0 + resolution: "slash@npm:4.0.0" + checksum: da8e4af73712253acd21b7853b7e0dbba776b786e82b010a5bfc8b5051a1db38ed8aba8e1e8f400dd2c9f373be91eb1c42b66e91abb407ff42b10feece5e1d2d + languageName: node + linkType: hard + +"slice-ansi@npm:^3.0.0": + version: 3.0.0 + resolution: "slice-ansi@npm:3.0.0" + dependencies: + ansi-styles: ^4.0.0 + astral-regex: ^2.0.0 + is-fullwidth-code-point: ^3.0.0 + checksum: 5ec6d022d12e016347e9e3e98a7eb2a592213a43a65f1b61b74d2c78288da0aded781f665807a9f3876b9daa9ad94f64f77d7633a0458876c3a4fdc4eb223f24 + languageName: node + linkType: hard + +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: ^4.0.0 + astral-regex: ^2.0.0 + is-fullwidth-code-point: ^3.0.0 + checksum: 4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756 + languageName: node + linkType: hard + +"slice-ansi@npm:^5.0.0": + version: 5.0.0 + resolution: "slice-ansi@npm:5.0.0" + dependencies: + ansi-styles: ^6.0.0 + is-fullwidth-code-point: ^4.0.0 + checksum: 7e600a2a55e333a21ef5214b987c8358fe28bfb03c2867ff2cbf919d62143d1812ac27b4297a077fdaf27a03da3678e49551c93e35f9498a3d90221908a1180e + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "socks-proxy-agent@npm:7.0.0" + dependencies: + agent-base: ^6.0.2 + debug: ^4.3.3 + socks: ^2.6.2 + checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 + languageName: node + linkType: hard + +"socks@npm:^2.6.2": + version: 2.7.1 + resolution: "socks@npm:2.7.1" + dependencies: + ip: ^2.0.0 + smart-buffer: ^4.2.0 + checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 + languageName: node + linkType: hard + +"solhint-plugin-prettier@npm:^0.0.5": + version: 0.0.5 + resolution: "solhint-plugin-prettier@npm:0.0.5" + dependencies: + prettier-linter-helpers: ^1.0.0 + peerDependencies: + prettier: ^1.15.0 || ^2.0.0 + prettier-plugin-solidity: ^1.0.0-alpha.14 + checksum: ca721e327daf49a4d9ef0ee5c9622482a8c5563d600eedfd3856c69ce67e416dd77da5166a033e2e641c9cdd7a0f2cbc7913b0eb1712081b3c7e8c633eef82a5 + languageName: node + linkType: hard + +"solhint@npm:^3.4.1": + version: 3.5.1 + resolution: "solhint@npm:3.5.1" + dependencies: + "@solidity-parser/parser": ^0.16.0 + ajv: ^6.12.6 + antlr4: ^4.11.0 + ast-parents: ^0.0.1 + chalk: ^4.1.2 + commander: ^10.0.0 + cosmiconfig: ^8.0.0 + fast-diff: ^1.2.0 + glob: ^8.0.3 + ignore: ^5.2.4 + js-yaml: ^4.1.0 + lodash: ^4.17.21 + pluralize: ^8.0.0 + prettier: ^2.8.3 + semver: ^7.5.2 + strip-ansi: ^6.0.1 + table: ^6.8.1 + text-table: ^0.2.0 + dependenciesMeta: + prettier: + optional: true + bin: + solhint: solhint.js + checksum: ae24b8b95c65df3a075a26a26ce92b1a41297c738e43444df77c1be81e1be44e1838b151970de0b5164c94b17a96e981758d634473d3b574ab5dca2109176559 + languageName: node + linkType: hard + +"solidity-ast@npm:^0.4.38": + version: 0.4.46 + resolution: "solidity-ast@npm:0.4.46" + checksum: 9c2ab90731fd23fdceef0e74ea626cc1810ec413daaa9b7d838f4fd9c342a63095fae0f0690ec0166db9f316ef6a06d7740a2c4f74cf5609831121389bf0cb7b + languageName: node + linkType: hard + +"solidity-comments-extractor@npm:^0.0.7": + version: 0.0.7 + resolution: "solidity-comments-extractor@npm:0.0.7" + checksum: a5cedf2310709969bc1783a6c336171478536f2f0ea96ad88437e0ef1e8844c0b37dd75591b0a824ec9c30640ea7e31b5f03128e871e6235bef3426617ce96c4 + languageName: node + linkType: hard + +"solidity-coverage@npm:^0.8.4": + version: 0.8.10 + resolution: "solidity-coverage@npm:0.8.10" + dependencies: + "@ethersproject/abi": ^5.0.9 + "@solidity-parser/parser": ^0.18.0 + chalk: ^2.4.2 + death: ^1.1.0 + difflib: ^0.2.4 + fs-extra: ^8.1.0 + ghost-testrpc: ^0.0.2 + global-modules: ^2.0.0 + globby: ^10.0.1 + jsonschema: ^1.2.4 + lodash: ^4.17.15 + mocha: ^10.2.0 + node-emoji: ^1.10.0 + pify: ^4.0.1 + recursive-readdir: ^2.2.2 + sc-istanbul: ^0.4.5 + semver: ^7.3.4 + shelljs: ^0.8.3 + web3-utils: ^1.3.6 + peerDependencies: + hardhat: ^2.11.0 + bin: + solidity-coverage: plugins/bin.js + checksum: 60bd66bd6b1016b5698ba640af6c51f8a06c8453342e27294dae64236a31bf150ab88ad3588c9b03c0925c2d3e2d8a5e8f1e1a69724ab8981c9f6f58830c574d + languageName: node + linkType: hard + +"solidity-docgen@npm:^0.6.0-beta.29": + version: 0.6.0-beta.35 + resolution: "solidity-docgen@npm:0.6.0-beta.35" + dependencies: + handlebars: ^4.7.7 + solidity-ast: ^0.4.38 + peerDependencies: + hardhat: ^2.8.0 + checksum: 5b773b8b2959109efca409ebd6eaa9eaa535989b52de7653bed75ad9195a145653c6436c258eb78cc819e220d79ecb4ed0efe9fcb8f9aed56e5b5d386149349d + languageName: node + linkType: hard + +"sonic-boom@npm:^2.2.1": + version: 2.8.0 + resolution: "sonic-boom@npm:2.8.0" + dependencies: + atomic-sleep: ^1.0.0 + checksum: c7f9c89f931d7f60f8e0741551a729f0d81e6dc407a99420fc847a9a4c25af048a615b1188ab3c4f1fb3708fe4904973ddab6ebcc8ed5b78b50ab81a99045910 + languageName: node + linkType: hard + +"source-map-js@npm:^1.0.2": + version: 1.0.2 + resolution: "source-map-js@npm:1.0.2" + checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c + languageName: node + linkType: hard + +"source-map-support@npm:0.5.13": + version: 0.5.13 + resolution: "source-map-support@npm:0.5.13" + dependencies: + buffer-from: ^1.0.0 + source-map: ^0.6.0 + checksum: 933550047b6c1a2328599a21d8b7666507427c0f5ef5eaadd56b5da0fd9505e239053c66fe181bf1df469a3b7af9d775778eee283cbb7ae16b902ddc09e93a97 + languageName: node + linkType: hard + +"source-map-support@npm:^0.5.16, source-map-support@npm:^0.5.19": + version: 0.5.21 + resolution: "source-map-support@npm:0.5.21" + dependencies: + buffer-from: ^1.0.0 + source-map: ^0.6.0 + checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 + languageName: node + linkType: hard + +"source-map@npm:^0.7.4": + version: 0.7.4 + resolution: "source-map@npm:0.7.4" + checksum: 01cc5a74b1f0e1d626a58d36ad6898ea820567e87f18dfc9d24a9843a351aaa2ec09b87422589906d6ff1deed29693e176194dc88bcae7c9a852dc74b311dbf5 + languageName: node + linkType: hard + +"source-map@npm:~0.2.0": + version: 0.2.0 + resolution: "source-map@npm:0.2.0" + dependencies: + amdefine: ">=0.0.4" + checksum: 95fe800c3a93f8c0b9516c033bfc75f2678e27d2e6c0b23ae222f5ddc4afa0a39bd0be15d1c0a1e766d388f3761cc854a053a4330f49242e6045e1a4f9dc0e26 + languageName: node + linkType: hard + +"split-on-first@npm:^1.0.0": + version: 1.1.0 + resolution: "split-on-first@npm:1.1.0" + checksum: 16ff85b54ddcf17f9147210a4022529b343edbcbea4ce977c8f30e38408b8d6e0f25f92cd35b86a524d4797f455e29ab89eb8db787f3c10708e0b47ebf528d30 + languageName: node + linkType: hard + +"split2@npm:^4.0.0": + version: 4.2.0 + resolution: "split2@npm:4.2.0" + checksum: 05d54102546549fe4d2455900699056580cca006c0275c334611420f854da30ac999230857a85fdd9914dc2109ae50f80fda43d2a445f2aa86eccdc1dfce779d + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 + languageName: node + linkType: hard + +"ssri@npm:^9.0.0": + version: 9.0.1 + resolution: "ssri@npm:9.0.1" + dependencies: + minipass: ^3.1.1 + checksum: fb58f5e46b6923ae67b87ad5ef1c5ab6d427a17db0bead84570c2df3cd50b4ceb880ebdba2d60726588272890bae842a744e1ecce5bd2a2a582fccd5068309eb + languageName: node + linkType: hard + +"stack-utils@npm:^2.0.3": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: ^2.0.0 + checksum: 052bf4d25bbf5f78e06c1d5e67de2e088b06871fa04107ca8d3f0e9d9263326e2942c8bedee3545795fc77d787d443a538345eef74db2f8e35db3558c6f91ff7 + languageName: node + linkType: hard + +"standard-as-callback@npm:^2.1.0": + version: 2.1.0 + resolution: "standard-as-callback@npm:2.1.0" + checksum: 88bec83ee220687c72d94fd86a98d5272c91d37ec64b66d830dbc0d79b62bfa6e47f53b71646011835fc9ce7fae62739545d13124262b53be4fbb3e2ebad551c + languageName: node + linkType: hard + +"std-env@npm:^3.7.0": + version: 3.7.0 + resolution: "std-env@npm:3.7.0" + checksum: 4f489d13ff2ab838c9acd4ed6b786b51aa52ecacdfeaefe9275fcb220ff2ac80c6e95674723508fd29850a694569563a8caaaea738eb82ca16429b3a0b50e510 + languageName: node + linkType: hard + +"stop-iteration-iterator@npm:^1.0.0": + version: 1.0.0 + resolution: "stop-iteration-iterator@npm:1.0.0" + dependencies: + internal-slot: ^1.0.4 + checksum: d04173690b2efa40e24ab70e5e51a3ff31d56d699550cfad084104ab3381390daccb36652b25755e420245f3b0737de66c1879eaa2a8d4fc0a78f9bf892fcb42 + languageName: node + linkType: hard + +"stream-shift@npm:^1.0.0": + version: 1.0.3 + resolution: "stream-shift@npm:1.0.3" + checksum: a24c0a3f66a8f9024bd1d579a533a53be283b4475d4e6b4b3211b964031447bdf6532dd1f3c2b0ad66752554391b7c62bd7ca4559193381f766534e723d50242 + languageName: node + linkType: hard + +"strict-uri-encode@npm:^2.0.0": + version: 2.0.0 + resolution: "strict-uri-encode@npm:2.0.0" + checksum: eaac4cf978b6fbd480f1092cab8b233c9b949bcabfc9b598dd79a758f7243c28765ef7639c876fa72940dac687181b35486ea01ff7df3e65ce3848c64822c581 + languageName: node + linkType: hard + +"string-argv@npm:^0.3.1": + version: 0.3.1 + resolution: "string-argv@npm:0.3.1" + checksum: efbd0289b599bee808ce80820dfe49c9635610715429c6b7cc50750f0437e3c2f697c81e5c390208c13b5d5d12d904a1546172a88579f6ee5cbaaaa4dc9ec5cf + languageName: node + linkType: hard + +"string-format@npm:^2.0.0": + version: 2.0.0 + resolution: "string-format@npm:2.0.0" + checksum: dada2ef95f6d36c66562c673d95315f80457fa7dce2f3609a2e75d1190b98c88319028cf0a5b6c043d01c18d581b2641579f79480584ba030d6ac6fceb30bc55 + languageName: node + linkType: hard + +"string-length@npm:^4.0.1": + version: 4.0.2 + resolution: "string-length@npm:4.0.2" + dependencies: + char-regex: ^1.0.2 + strip-ansi: ^6.0.0 + checksum: ce85533ef5113fcb7e522bcf9e62cb33871aa99b3729cec5595f4447f660b0cefd542ca6df4150c97a677d58b0cb727a3fe09ac1de94071d05526c73579bf505 + languageName: node + linkType: hard + +"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: ^8.0.0 + is-fullwidth-code-point: ^3.0.0 + strip-ansi: ^6.0.1 + checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + languageName: node + linkType: hard + +"string-width@npm:^5.0.0": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: ^0.2.0 + emoji-regex: ^9.2.2 + strip-ansi: ^7.0.1 + checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + languageName: node + linkType: hard + +"string.prototype.trim@npm:^1.2.7": + version: 1.2.7 + resolution: "string.prototype.trim@npm:1.2.7" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 05b7b2d6af63648e70e44c4a8d10d8cc457536df78b55b9d6230918bde75c5987f6b8604438c4c8652eb55e4fc9725d2912789eb4ec457d6995f3495af190c09 + languageName: node + linkType: hard + +"string.prototype.trim@npm:^1.2.9": + version: 1.2.9 + resolution: "string.prototype.trim@npm:1.2.9" + dependencies: + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.0 + es-object-atoms: ^1.0.0 + checksum: ea2df6ec1e914c9d4e2dc856fa08228e8b1be59b59e50b17578c94a66a176888f417264bb763d4aac638ad3b3dad56e7a03d9317086a178078d131aa293ba193 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.6": + version: 1.0.6 + resolution: "string.prototype.trimend@npm:1.0.6" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 0fdc34645a639bd35179b5a08227a353b88dc089adf438f46be8a7c197fc3f22f8514c1c9be4629b3cd29c281582730a8cbbad6466c60f76b5f99cf2addb132e + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimend@npm:1.0.8" + dependencies: + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: cc3bd2de08d8968a28787deba9a3cb3f17ca5f9f770c91e7e8fa3e7d47f079bad70fadce16f05dda9f261788be2c6e84a942f618c3bed31e42abc5c1084f8dfd + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.6": + version: 1.0.6 + resolution: "string.prototype.trimstart@npm:1.0.6" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 89080feef416621e6ef1279588994305477a7a91648d9436490d56010a1f7adc39167cddac7ce0b9884b8cdbef086987c4dcb2960209f2af8bac0d23ceff4f41 + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" + dependencies: + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: df1007a7f580a49d692375d996521dc14fd103acda7f3034b3c558a60b82beeed3a64fa91e494e164581793a8ab0ae2f59578a49896a7af6583c1f20472bce96 + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: ~5.2.0 + checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 + languageName: node + linkType: hard + +"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: ^5.0.1 + checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.0.1 + resolution: "strip-ansi@npm:7.0.1" + dependencies: + ansi-regex: ^6.0.1 + checksum: 257f78fa433520e7f9897722731d78599cb3fce29ff26a20a5e12ba4957463b50a01136f37c43707f4951817a75e90820174853d6ccc240997adc5df8f966039 + languageName: node + linkType: hard + +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 8d50ff27b7ebe5ecc78f1fe1e00fcdff7af014e73cf724b46fb81ef889eeb1015fc5184b64e81a2efe002180f3ba431bdd77e300da5c6685d702780fbf0c8d5b + languageName: node + linkType: hard + +"strip-bom@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-bom@npm:4.0.0" + checksum: 9dbcfbaf503c57c06af15fe2c8176fb1bf3af5ff65003851a102749f875a6dbe0ab3b30115eccf6e805e9d756830d3e40ec508b62b3f1ddf3761a20ebe29d3f3 + languageName: node + linkType: hard + +"strip-final-newline@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-final-newline@npm:2.0.0" + checksum: 69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 + languageName: node + linkType: hard + +"strip-final-newline@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-final-newline@npm:3.0.0" + checksum: 23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 + languageName: node + linkType: hard + +"strip-hex-prefix@npm:1.0.0": + version: 1.0.0 + resolution: "strip-hex-prefix@npm:1.0.0" + dependencies: + is-hex-prefixed: 1.0.0 + checksum: 4cafe7caee1d281d3694d14920fd5d3c11adf09371cef7e2ccedd5b83efd9e9bd2219b5d6ce6e809df6e0f437dc9d30db1192116580875698aad164a6d6b285b + languageName: node + linkType: hard + +"strip-indent@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-indent@npm:3.0.0" + dependencies: + min-indent: ^1.0.0 + checksum: 18f045d57d9d0d90cd16f72b2313d6364fd2cb4bf85b9f593523ad431c8720011a4d5f08b6591c9d580f446e78855c5334a30fb91aa1560f5d9f95ed1b4a0530 + languageName: node + linkType: hard + +"strip-json-comments@npm:3.1.1, strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 + languageName: node + linkType: hard + +"superstruct@npm:^1.0.3": + version: 1.0.3 + resolution: "superstruct@npm:1.0.3" + checksum: 761790bb111e6e21ddd608299c252f3be35df543263a7ebbc004e840d01fcf8046794c274bcb351bdf3eae4600f79d317d085cdbb19ca05803a4361840cc9bb1 + languageName: node + linkType: hard + +"supports-color@npm:8.1.1, supports-color@npm:^8.0.0": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: ^4.0.0 + checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 + languageName: node + linkType: hard + +"supports-color@npm:^3.1.0": + version: 3.2.3 + resolution: "supports-color@npm:3.2.3" + dependencies: + has-flag: ^1.0.0 + checksum: 56afc05fa87d00100d90148c4d0a6e20a0af0d56dca5c54d4d40b2553ee737dab0ca4e8b53c4471afc035227b5b44dfa4824747a7f01ad733173536f7da6fbbb + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: ^3.0.0 + checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: ^4.0.0 + checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a + languageName: node + linkType: hard + +"supports-color@npm:^9.2.3": + version: 9.3.1 + resolution: "supports-color@npm:9.3.1" + checksum: 00c4d1082a7ba0ee21cba1d4e4a466642635412e40476777b530aa5110d035e99a420cd048e1fb6811f2254c0946095fbb87a1eccf1af1d1ca45ab0a4535db93 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae + languageName: node + linkType: hard + +"symbol-tree@npm:^3.2.4": + version: 3.2.4 + resolution: "symbol-tree@npm:3.2.4" + checksum: 6e8fc7e1486b8b54bea91199d9535bb72f10842e40c79e882fc94fb7b14b89866adf2fd79efa5ebb5b658bc07fb459ccce5ac0e99ef3d72f474e74aaf284029d + languageName: node + linkType: hard + +"synckit@npm:^0.8.5": + version: 0.8.5 + resolution: "synckit@npm:0.8.5" + dependencies: + "@pkgr/utils": ^2.3.1 + tslib: ^2.5.0 + checksum: 8a9560e5d8f3d94dc3cf5f7b9c83490ffa30d320093560a37b88f59483040771fd1750e76b9939abfbb1b5a23fd6dfbae77f6b338abffe7cae7329cd9b9bb86b + languageName: node + linkType: hard + +"syncpack@npm:^10.7.3": + version: 10.7.3 + resolution: "syncpack@npm:10.7.3" + dependencies: + "@effect/data": 0.12.9 + "@effect/io": 0.27.0 + "@effect/match": 0.24.5 + "@effect/schema": 0.21.0 + chalk: 4.1.2 + commander: 11.0.0 + cosmiconfig: 8.2.0 + enquirer: 2.3.6 + fs-extra: 11.1.1 + globby: 11.1.0 + minimatch: 9.0.2 + ora: 5.4.1 + prompts: 2.4.2 + read-yaml-file: 2.1.0 + semver: 7.5.3 + tightrope: 0.1.0 + ts-toolbelt: 9.6.0 + bin: + syncpack: dist/bin.js + syncpack-fix-mismatches: dist/bin-fix-mismatches/index.js + syncpack-format: dist/bin-format/index.js + syncpack-lint: dist/bin-lint/index.js + syncpack-lint-semver-ranges: dist/bin-lint-semver-ranges/index.js + syncpack-list: dist/bin-list/index.js + syncpack-list-mismatches: dist/bin-list-mismatches/index.js + syncpack-prompt: dist/bin-prompt/index.js + syncpack-set-semver-ranges: dist/bin-set-semver-ranges/index.js + syncpack-update: dist/bin-update/index.js + checksum: d8b340b0664138f43d391d2176fb05d7bf23e8036d57114743006b11d0924776da2b36af729cbc7c700aded0e4294cad61c1de3e9902065a4d39fcd512a5243c + languageName: node + linkType: hard + +"system-architecture@npm:^0.1.0": + version: 0.1.0 + resolution: "system-architecture@npm:0.1.0" + checksum: ca0dd793c45c354ab57dd7fc8ce7dc9923a6e07382bd3b22eb5b08f55ddb0217c390d00767549c5155fd4ce7ef23ffdd8cfb33dd4344cbbd37837d085a50f6f0 + languageName: node + linkType: hard + +"table-layout@npm:^1.0.2": + version: 1.0.2 + resolution: "table-layout@npm:1.0.2" + dependencies: + array-back: ^4.0.1 + deep-extend: ~0.6.0 + typical: ^5.2.0 + wordwrapjs: ^4.0.0 + checksum: 8f41b5671f101a5195747ec1727b1d35ea2cd5bf85addda11cc2f4b36892db9696ce3c2c7334b5b8a122505b34d19135fede50e25678df71b0439e0704fd953f + languageName: node + linkType: hard + +"table@npm:^6.8.0, table@npm:^6.8.1": + version: 6.8.1 + resolution: "table@npm:6.8.1" + dependencies: + ajv: ^8.0.1 + lodash.truncate: ^4.4.2 + slice-ansi: ^4.0.0 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + checksum: 08249c7046125d9d0a944a6e96cfe9ec66908d6b8a9db125531be6eb05fa0de047fd5542e9d43b4f987057f00a093b276b8d3e19af162a9c40db2681058fd306 + languageName: node + linkType: hard + +"tapable@npm:^2.2.0": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.1.13 + resolution: "tar@npm:6.1.13" + dependencies: + chownr: ^2.0.0 + fs-minipass: ^2.0.0 + minipass: ^4.0.0 + minizlib: ^2.1.1 + mkdirp: ^1.0.3 + yallist: ^4.0.0 + checksum: 8a278bed123aa9f53549b256a36b719e317c8b96fe86a63406f3c62887f78267cea9b22dc6f7007009738509800d4a4dccc444abd71d762287c90f35b002eb1c + languageName: node + linkType: hard + +"test-exclude@npm:^6.0.0": + version: 6.0.0 + resolution: "test-exclude@npm:6.0.0" + dependencies: + "@istanbuljs/schema": ^0.1.2 + glob: ^7.1.4 + minimatch: ^3.0.4 + checksum: 3b34a3d77165a2cb82b34014b3aba93b1c4637a5011807557dc2f3da826c59975a5ccad765721c4648b39817e3472789f9b0fa98fc854c5c1c7a1e632aacdc28 + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a + languageName: node + linkType: hard + +"thread-stream@npm:^0.15.1": + version: 0.15.2 + resolution: "thread-stream@npm:0.15.2" + dependencies: + real-require: ^0.1.0 + checksum: 0547795a8f357ba1ac0dba29c71f965182e29e21752951a04a7167515ee37524bfba6c410f31e65a01a8d3e5b93400b812889aa09523e38ce4d744c894ffa6c0 + languageName: node + linkType: hard + +"through@npm:^2.3.8": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd + languageName: node + linkType: hard + +"tightrope@npm:0.1.0": + version: 0.1.0 + resolution: "tightrope@npm:0.1.0" + checksum: 9ca3d65db2b2554cf9e49325ef18d18ea9b6cd3a14f5136675da009be26cca3592faee8e99dc52c9125670778e7bfdc9ca39915b2dda1693b5186098ffb07179 + languageName: node + linkType: hard + +"tiny-glob@npm:^0.2.9": + version: 0.2.9 + resolution: "tiny-glob@npm:0.2.9" + dependencies: + globalyzer: 0.1.0 + globrex: ^0.1.2 + checksum: aea5801eb6663ddf77ebb74900b8f8bd9dfcfc9b6a1cc8018cb7421590c00bf446109ff45e4b64a98e6c95ddb1255a337a5d488fb6311930e2a95334151ec9c6 + languageName: node + linkType: hard + +"tiny-invariant@npm:^1.1.0": + version: 1.3.3 + resolution: "tiny-invariant@npm:1.3.3" + checksum: 5e185c8cc2266967984ce3b352a4e57cb89dad5a8abb0dea21468a6ecaa67cd5bb47a3b7a85d08041008644af4f667fb8b6575ba38ba5fb00b3b5068306e59fe + languageName: node + linkType: hard + +"tmpl@npm:1.0.5": + version: 1.0.5 + resolution: "tmpl@npm:1.0.5" + checksum: cd922d9b853c00fe414c5a774817be65b058d54a2d01ebb415840960406c669a0fc632f66df885e24cb022ec812739199ccbdb8d1164c3e513f85bfca5ab2873 + languageName: node + linkType: hard + +"to-fast-properties@npm:^2.0.0": + version: 2.0.0 + resolution: "to-fast-properties@npm:2.0.0" + checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: ^7.0.0 + checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed + languageName: node + linkType: hard + +"toggle-selection@npm:^1.0.6": + version: 1.0.6 + resolution: "toggle-selection@npm:1.0.6" + checksum: a90dc80ed1e7b18db8f4e16e86a5574f87632dc729cfc07d9ea3ced50021ad42bb4e08f22c0913e0b98e3837b0b717e0a51613c65f30418e21eb99da6556a74c + languageName: node + linkType: hard + +"tough-cookie@npm:^4.1.2": + version: 4.1.3 + resolution: "tough-cookie@npm:4.1.3" + dependencies: + psl: ^1.1.33 + punycode: ^2.1.1 + universalify: ^0.2.0 + url-parse: ^1.5.3 + checksum: c9226afff36492a52118432611af083d1d8493a53ff41ec4ea48e5b583aec744b989e4280bcf476c910ec1525a89a4a0f1cae81c08b18fb2ec3a9b3a72b91dcc + languageName: node + linkType: hard + +"tr46@npm:^2.1.0": + version: 2.1.0 + resolution: "tr46@npm:2.1.0" + dependencies: + punycode: ^2.1.1 + checksum: ffe6049b9dca3ae329b059aada7f515b0f0064c611b39b51ff6b53897e954650f6f63d9319c6c008d36ead477c7b55e5f64c9dc60588ddc91ff720d64eb710b3 + languageName: node + linkType: hard + +"tr46@npm:^3.0.0": + version: 3.0.0 + resolution: "tr46@npm:3.0.0" + dependencies: + punycode: ^2.1.1 + checksum: 44c3cc6767fb800490e6e9fd64fd49041aa4e49e1f6a012b34a75de739cc9ed3a6405296072c1df8b6389ae139c5e7c6496f659cfe13a04a4bff3a1422981270 + languageName: node + linkType: hard + +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 + languageName: node + linkType: hard + +"ts-api-utils@npm:^1.0.1": + version: 1.0.3 + resolution: "ts-api-utils@npm:1.0.3" + peerDependencies: + typescript: ">=4.2.0" + checksum: 441cc4489d65fd515ae6b0f4eb8690057add6f3b6a63a36073753547fb6ce0c9ea0e0530220a0b282b0eec535f52c4dfc315d35f8a4c9a91c0def0707a714ca6 + languageName: node + linkType: hard + +"ts-command-line-args@npm:^2.2.0": + version: 2.4.2 + resolution: "ts-command-line-args@npm:2.4.2" + dependencies: + "@morgan-stanley/ts-mocking-bird": ^0.6.2 + chalk: ^4.1.0 + command-line-args: ^5.1.1 + command-line-usage: ^6.1.0 + string-format: ^2.0.0 + bin: + write-markdown: dist/write-markdown.js + checksum: 87670c554eb23477c777be010ec9cd280187275717d4db002e0d7d1f2a660f9483315a36dc3ea4af714d41b1fc1a3bd242fd538dd76310d9f1a3741502e49fd4 + languageName: node + linkType: hard + +"ts-essentials@npm:^7.0.1, ts-essentials@npm:^7.0.3": + version: 7.0.3 + resolution: "ts-essentials@npm:7.0.3" + peerDependencies: + typescript: ">=3.7.0" + checksum: 74d75868acf7f8b95e447d8b3b7442ca21738c6894e576df9917a352423fde5eb43c5651da5f78997da6061458160ae1f6b279150b42f47ccc58b73e55acaa2f + languageName: node + linkType: hard + +"ts-jest@npm:^29.1.1": + version: 29.1.1 + resolution: "ts-jest@npm:29.1.1" + dependencies: + bs-logger: 0.x + fast-json-stable-stringify: 2.x + jest-util: ^29.0.0 + json5: ^2.2.3 + lodash.memoize: 4.x + make-error: 1.x + semver: ^7.5.3 + yargs-parser: ^21.0.1 + peerDependencies: + "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/types": ^29.0.0 + babel-jest: ^29.0.0 + jest: ^29.0.0 + typescript: ">=4.3 <6" + peerDependenciesMeta: + "@babel/core": + optional: true + "@jest/types": + optional: true + babel-jest: + optional: true + esbuild: + optional: true + bin: + ts-jest: cli.js + checksum: a8c9e284ed4f819526749f6e4dc6421ec666f20ab44d31b0f02b4ed979975f7580b18aea4813172d43e39b29464a71899f8893dd29b06b4a351a3af8ba47b402 + languageName: node + linkType: hard + +"ts-node@npm:^10.9.1": + version: 10.9.1 + resolution: "ts-node@npm:10.9.1" + dependencies: + "@cspotcode/source-map-support": ^0.8.0 + "@tsconfig/node10": ^1.0.7 + "@tsconfig/node12": ^1.0.7 + "@tsconfig/node14": ^1.0.0 + "@tsconfig/node16": ^1.0.2 + acorn: ^8.4.1 + acorn-walk: ^8.1.1 + arg: ^4.1.0 + create-require: ^1.1.0 + diff: ^4.0.1 + make-error: ^1.1.1 + v8-compile-cache-lib: ^3.0.1 + yn: 3.1.1 + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 + languageName: node + linkType: hard + +"ts-toolbelt@npm:9.6.0": + version: 9.6.0 + resolution: "ts-toolbelt@npm:9.6.0" + checksum: 9f35fd95d895a5d32ea9fd2e532a695b0bae6cbff6832b77292efa188a0ed1ed6e54f63f74a8920390f3d909a7a3adb20a144686372a8e78b420246a9bd3d58a + languageName: node + linkType: hard + +"tsconfck@npm:^3.0.1": + version: 3.0.2 + resolution: "tsconfck@npm:3.0.2" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + bin: + tsconfck: bin/tsconfck.js + checksum: bf40e547a01610571a55ff33beb74751942561963f9c5f1152ad415ad4bd27eb90d65e9fb2edbb60ecb9407b115d1d52a633fc1f83cf4ea0424041a10e7eeea3 + languageName: node + linkType: hard + +"tsconfig-paths@npm:^3.14.1": + version: 3.14.2 + resolution: "tsconfig-paths@npm:3.14.2" + dependencies: + "@types/json5": ^0.0.29 + json5: ^1.0.2 + minimist: ^1.2.6 + strip-bom: ^3.0.0 + checksum: a6162eaa1aed680537f93621b82399c7856afd10ec299867b13a0675e981acac4e0ec00896860480efc59fc10fd0b16fdc928c0b885865b52be62cadac692447 + languageName: node + linkType: hard + +"tslib@npm:1.14.1, tslib@npm:^1.8.1": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd + languageName: node + linkType: hard + +"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.5.0": + version: 2.6.2 + resolution: "tslib@npm:2.6.2" + checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad + languageName: node + linkType: hard + +"tsutils@npm:^3.21.0": + version: 3.21.0 + resolution: "tsutils@npm:3.21.0" + dependencies: + tslib: ^1.8.1 + peerDependencies: + typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 + languageName: node + linkType: hard + +"turbo-darwin-64@npm:1.12.2": + version: 1.12.2 + resolution: "turbo-darwin-64@npm:1.12.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"turbo-darwin-arm64@npm:1.12.2": + version: 1.12.2 + resolution: "turbo-darwin-arm64@npm:1.12.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"turbo-linux-64@npm:1.12.2": + version: 1.12.2 + resolution: "turbo-linux-64@npm:1.12.2" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"turbo-linux-arm64@npm:1.12.2": + version: 1.12.2 + resolution: "turbo-linux-arm64@npm:1.12.2" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"turbo-windows-64@npm:1.12.2": + version: 1.12.2 + resolution: "turbo-windows-64@npm:1.12.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"turbo-windows-arm64@npm:1.12.2": + version: 1.12.2 + resolution: "turbo-windows-arm64@npm:1.12.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"turbo@npm:^1.12.2": + version: 1.12.2 + resolution: "turbo@npm:1.12.2" + dependencies: + turbo-darwin-64: 1.12.2 + turbo-darwin-arm64: 1.12.2 + turbo-linux-64: 1.12.2 + turbo-linux-arm64: 1.12.2 + turbo-windows-64: 1.12.2 + turbo-windows-arm64: 1.12.2 + dependenciesMeta: + turbo-darwin-64: + optional: true + turbo-darwin-arm64: + optional: true + turbo-linux-64: + optional: true + turbo-linux-arm64: + optional: true + turbo-windows-64: + optional: true + turbo-windows-arm64: + optional: true + bin: + turbo: bin/turbo + checksum: a889988310fbd088e241a4aeb1f5ea34a9dba231ab77cd6764dbe53a81e07ec1dde4d7123f543e06cc6cd653f350886424ccc9d883af645816e859d455042cf1 + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: ^1.2.1 + checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a + languageName: node + linkType: hard + +"type-check@npm:~0.3.2": + version: 0.3.2 + resolution: "type-check@npm:0.3.2" + dependencies: + prelude-ls: ~1.1.2 + checksum: dd3b1495642731bc0e1fc40abe5e977e0263005551ac83342ecb6f4f89551d106b368ec32ad3fb2da19b3bd7b2d1f64330da2ea9176d8ddbfe389fb286eb5124 + languageName: node + linkType: hard + +"type-detect@npm:4.0.8": + version: 4.0.8 + resolution: "type-detect@npm:4.0.8" + checksum: 62b5628bff67c0eb0b66afa371bd73e230399a8d2ad30d852716efcc4656a7516904570cd8631a49a3ce57c10225adf5d0cbdcb47f6b0255fe6557c453925a15 + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 + languageName: node + linkType: hard + +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: e6b32a3b3877f04339bae01c193b273c62ba7bfc9e325b8703c4ee1b32dc8fe4ef5dfa54bf78265e069f7667d058e360ae0f37be5af9f153b22382cd55a9afe0 + languageName: node + linkType: hard + +"typechain@npm:^8.1.1": + version: 8.1.1 + resolution: "typechain@npm:8.1.1" + dependencies: + "@types/prettier": ^2.1.1 + debug: ^4.3.1 + fs-extra: ^7.0.0 + glob: 7.1.7 + js-sha3: ^0.8.0 + lodash: ^4.17.15 + mkdirp: ^1.0.4 + prettier: ^2.3.1 + ts-command-line-args: ^2.2.0 + ts-essentials: ^7.0.1 + peerDependencies: + typescript: ">=4.3.0" + bin: + typechain: dist/cli/cli.js + checksum: 77984239d9728befe5a484c4e1b55c8f194696fc8a78c44754f8e25ca8fd6d0208ddfcd9e71c90c1c35ac0689f5c3053107b54fdc2aab691c980614f6daf209b + languageName: node + linkType: hard + +"typed-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-buffer@npm:1.0.2" + dependencies: + call-bind: ^1.0.7 + es-errors: ^1.3.0 + is-typed-array: ^1.1.13 + checksum: 02ffc185d29c6df07968272b15d5319a1610817916ec8d4cd670ded5d1efe72901541ff2202fcc622730d8a549c76e198a2f74e312eabbfb712ed907d45cbb0b + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "typed-array-byte-length@npm:1.0.1" + dependencies: + call-bind: ^1.0.7 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-proto: ^1.0.3 + is-typed-array: ^1.1.13 + checksum: f65e5ecd1cf76b1a2d0d6f631f3ea3cdb5e08da106c6703ffe687d583e49954d570cc80434816d3746e18be889ffe53c58bf3e538081ea4077c26a41055b216d + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-byte-offset@npm:1.0.2" + dependencies: + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.7 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-proto: ^1.0.3 + is-typed-array: ^1.1.13 + checksum: c8645c8794a621a0adcc142e0e2c57b1823bbfa4d590ad2c76b266aa3823895cf7afb9a893bf6685e18454ab1b0241e1a8d885a2d1340948efa4b56add4b5f67 + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-length@npm:1.0.4" + dependencies: + call-bind: ^1.0.2 + for-each: ^0.3.3 + is-typed-array: ^1.1.9 + checksum: 2228febc93c7feff142b8c96a58d4a0d7623ecde6c7a24b2b98eb3170e99f7c7eff8c114f9b283085cd59dcd2bd43aadf20e25bba4b034a53c5bb292f71f8956 + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.6": + version: 1.0.6 + resolution: "typed-array-length@npm:1.0.6" + dependencies: + call-bind: ^1.0.7 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-proto: ^1.0.3 + is-typed-array: ^1.1.13 + possible-typed-array-names: ^1.0.0 + checksum: f0315e5b8f0168c29d390ff410ad13e4d511c78e6006df4a104576844812ee447fcc32daab1f3a76c9ef4f64eff808e134528b5b2439de335586b392e9750e5c + languageName: node + linkType: hard + +"typed-emitter@npm:^2.1.0": + version: 2.1.0 + resolution: "typed-emitter@npm:2.1.0" + dependencies: + rxjs: "*" + dependenciesMeta: + rxjs: + optional: true + checksum: 95821a9e05784b972cc9d152891fd12a56cb4b1a7c57e768c02bea6a8984da7aff8f19404a7b69eea11fae2a3b6c0c510a4c510f575f50162c759ae9059f2520 + languageName: node + linkType: hard + +"typedarray-to-buffer@npm:3.1.5": + version: 3.1.5 + resolution: "typedarray-to-buffer@npm:3.1.5" + dependencies: + is-typedarray: ^1.0.0 + checksum: 99c11aaa8f45189fcfba6b8a4825fd684a321caa9bd7a76a27cf0c7732c174d198b99f449c52c3818107430b5f41c0ccbbfb75cb2ee3ca4a9451710986d61a60 + languageName: node + linkType: hard + +"typescript@npm:4.5.2": + version: 4.5.2 + resolution: "typescript@npm:4.5.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 74f9ce65d532bdf5d0214b3f60cf37992180023388c87a11ee6f838a803067ef0b63c600fa501b0deb07f989257dce1e244c9635ed79feca40bbccf6e0aa1ebc + languageName: node + linkType: hard + +"typescript@npm:^4.3.5": + version: 4.9.5 + resolution: "typescript@npm:4.9.5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db + languageName: node + linkType: hard + +"typescript@npm:^5.1.6": + version: 5.2.2 + resolution: "typescript@npm:5.2.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 7912821dac4d962d315c36800fe387cdc0a6298dba7ec171b350b4a6e988b51d7b8f051317786db1094bd7431d526b648aba7da8236607febb26cf5b871d2d3c + languageName: node + linkType: hard + +"typescript@patch:typescript@4.5.2#~builtin": + version: 4.5.2 + resolution: "typescript@patch:typescript@npm%3A4.5.2#~builtin::version=4.5.2&hash=bcec9a" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: e25e689eba64f7da7cfc43f8ea76cac7176b56caba42655f0a4cb29c0b7c36e67ca54f33df95902859f56108464245d8b45bcdfe21e3d66d9560feb8db780246 + languageName: node + linkType: hard + +"typescript@patch:typescript@^4.3.5#~builtin": + version: 4.9.5 + resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=289587" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 1f8f3b6aaea19f0f67cba79057674ba580438a7db55057eb89cc06950483c5d632115c14077f6663ea76fd09fce3c190e6414bb98582ec80aa5a4eaf345d5b68 + languageName: node + linkType: hard + +"typescript@patch:typescript@^5.1.6#~builtin": + version: 5.2.2 + resolution: "typescript@patch:typescript@npm%3A5.2.2#~builtin::version=5.2.2&hash=f3b441" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 0f4da2f15e6f1245e49db15801dbee52f2bbfb267e1c39225afdab5afee1a72839cd86000e65ee9d7e4dfaff12239d28beaf5ee431357fcced15fb08583d72ca + languageName: node + linkType: hard + +"typeson-registry@npm:^1.0.0-alpha.20": + version: 1.0.0-alpha.39 + resolution: "typeson-registry@npm:1.0.0-alpha.39" + dependencies: + base64-arraybuffer-es6: ^0.7.0 + typeson: ^6.0.0 + whatwg-url: ^8.4.0 + checksum: c6b629697acf4652aecfff7be760356d764600afc9beca253278bbfc44fae0fe635b7619201b83e497cdc30645cbce7614d12a04b5726d9b8b505f73e6a3fc2a + languageName: node + linkType: hard + +"typeson@npm:^6.0.0, typeson@npm:^6.1.0": + version: 6.1.0 + resolution: "typeson@npm:6.1.0" + checksum: 00a77b03ac8f704acb103307bad9295fe47d6b304c386297f078ec3be63875c0b81e022a4815edb9dc2c7da0a72a431345411d35c755a8510af4a420e9e46cdc + languageName: node + linkType: hard + +"typical@npm:^4.0.0": + version: 4.0.0 + resolution: "typical@npm:4.0.0" + checksum: a242081956825328f535e6195a924240b34daf6e7fdb573a1809a42b9f37fb8114fa99c7ab89a695e0cdb419d4149d067f6723e4b95855ffd39c6c4ca378efb3 + languageName: node + linkType: hard + +"typical@npm:^5.2.0": + version: 5.2.0 + resolution: "typical@npm:5.2.0" + checksum: ccaeb151a9a556291b495571ca44c4660f736fb49c29314bbf773c90fad92e9485d3cc2b074c933866c1595abbbc962f2b8bfc6e0f52a8c6b0cdd205442036ac + languageName: node + linkType: hard + +"ufo@npm:^1.3.0, ufo@npm:^1.3.1, ufo@npm:^1.3.2, ufo@npm:^1.4.0": + version: 1.4.0 + resolution: "ufo@npm:1.4.0" + checksum: 7c7ca3d823ae56a0439bc7038116a26a8c4e95aa9252aef43091f08f104af5557c2d220d990d07891c2771ca7c0589c479e330737ce6d7bbee485bb031046f19 + languageName: node + linkType: hard + +"uglify-js@npm:^3.1.4": + version: 3.17.4 + resolution: "uglify-js@npm:3.17.4" + bin: + uglifyjs: bin/uglifyjs + checksum: 7b3897df38b6fc7d7d9f4dcd658599d81aa2b1fb0d074829dd4e5290f7318dbca1f4af2f45acb833b95b1fe0ed4698662ab61b87e94328eb4c0a0d3435baf924 + languageName: node + linkType: hard + +"uint8arrays@npm:^3.0.0, uint8arrays@npm:^3.1.0": + version: 3.1.1 + resolution: "uint8arrays@npm:3.1.1" + dependencies: + multiformats: ^9.4.2 + checksum: b93b6c3f0a526b116799f3a3409bd4b5d5553eb3e73e485998ece7974742254fbc0d2f7988dd21ac86c4b974552f45d9ae9cf9cba9647e529f8eb1fdd2ed84d0 + languageName: node + linkType: hard + +"unbox-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + has-bigints: ^1.0.2 + has-symbols: ^1.0.3 + which-boxed-primitive: ^1.0.2 + checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 + languageName: node + linkType: hard + +"uncrypto@npm:^0.1.3": + version: 0.1.3 + resolution: "uncrypto@npm:0.1.3" + checksum: 07160e08806dd6cea16bb96c3fd54cd70fc801e02fc3c6f86980144d15c9ebbd1c55587f7280a207b3af6cd34901c0d0b77ada5a02c2f7081a033a05acf409e2 + languageName: node + linkType: hard + +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 + languageName: node + linkType: hard + +"unenv@npm:^1.9.0": + version: 1.9.0 + resolution: "unenv@npm:1.9.0" + dependencies: + consola: ^3.2.3 + defu: ^6.1.3 + mime: ^3.0.0 + node-fetch-native: ^1.6.1 + pathe: ^1.1.1 + checksum: 4cfbeedee1436e7f417d655c521e4c6220228f5b96afff90b5253d4504282c6de5acdd982aa51c977ce38d21d7692a33d10fc857166b3488655ff29c3bb754a2 + languageName: node + linkType: hard + +"unfetch@npm:^4.2.0": + version: 4.2.0 + resolution: "unfetch@npm:4.2.0" + checksum: 6a4b2557e1d921eaa80c4425ce27a404945ec26491ed06e62598f333996a91a44c7908cb26dc7c2746d735762b13276cf4aa41829b4c8f438dde63add3045d7a + languageName: node + linkType: hard + +"unique-filename@npm:^2.0.0": + version: 2.0.1 + resolution: "unique-filename@npm:2.0.1" + dependencies: + unique-slug: ^3.0.0 + checksum: 807acf3381aff319086b64dc7125a9a37c09c44af7620bd4f7f3247fcd5565660ac12d8b80534dcbfd067e6fe88a67e621386dd796a8af828d1337a8420a255f + languageName: node + linkType: hard + +"unique-slug@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-slug@npm:3.0.0" + dependencies: + imurmurhash: ^0.1.4 + checksum: 49f8d915ba7f0101801b922062ee46b7953256c93ceca74303bd8e6413ae10aa7e8216556b54dc5382895e8221d04f1efaf75f945c2e4a515b4139f77aa6640c + languageName: node + linkType: hard + +"universalify@npm:^0.1.0": + version: 0.1.2 + resolution: "universalify@npm:0.1.2" + checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff + languageName: node + linkType: hard + +"universalify@npm:^0.2.0": + version: 0.2.0 + resolution: "universalify@npm:0.2.0" + checksum: e86134cb12919d177c2353196a4cc09981524ee87abf621f7bc8d249dbbbebaec5e7d1314b96061497981350df786e4c5128dbf442eba104d6e765bc260678b5 + languageName: node + linkType: hard + +"universalify@npm:^2.0.0": + version: 2.0.0 + resolution: "universalify@npm:2.0.0" + checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 + languageName: node + linkType: hard + +"unstorage@npm:^1.9.0": + version: 1.10.1 + resolution: "unstorage@npm:1.10.1" + dependencies: + anymatch: ^3.1.3 + chokidar: ^3.5.3 + destr: ^2.0.2 + h3: ^1.8.2 + ioredis: ^5.3.2 + listhen: ^1.5.5 + lru-cache: ^10.0.2 + mri: ^1.2.0 + node-fetch-native: ^1.4.1 + ofetch: ^1.3.3 + ufo: ^1.3.1 + peerDependencies: + "@azure/app-configuration": ^1.4.1 + "@azure/cosmos": ^4.0.0 + "@azure/data-tables": ^13.2.2 + "@azure/identity": ^3.3.2 + "@azure/keyvault-secrets": ^4.7.0 + "@azure/storage-blob": ^12.16.0 + "@capacitor/preferences": ^5.0.6 + "@netlify/blobs": ^6.2.0 + "@planetscale/database": ^1.11.0 + "@upstash/redis": ^1.23.4 + "@vercel/kv": ^0.2.3 + idb-keyval: ^6.2.1 + peerDependenciesMeta: + "@azure/app-configuration": + optional: true + "@azure/cosmos": + optional: true + "@azure/data-tables": + optional: true + "@azure/identity": + optional: true + "@azure/keyvault-secrets": + optional: true + "@azure/storage-blob": + optional: true + "@capacitor/preferences": + optional: true + "@netlify/blobs": + optional: true + "@planetscale/database": + optional: true + "@upstash/redis": + optional: true + "@vercel/kv": + optional: true + idb-keyval: + optional: true + checksum: 59dc9f21d25df2bc8d14e3965235cbb85e3e2e8cb332da70ca471ba4519269a06936eba4012916251f3b88e23176df44b64abb826202a3a3c9d0a185bfe5e500 + languageName: node + linkType: hard + +"untun@npm:^0.1.3": + version: 0.1.3 + resolution: "untun@npm:0.1.3" + dependencies: + citty: ^0.1.5 + consola: ^3.2.3 + pathe: ^1.1.1 + bin: + untun: bin/untun.mjs + checksum: ad886c242dbac250f88ef6f18ad780fa084d07e4d030ab5ceacfe4378aa4bf2d3549b8ed8352bad5776facd9aaee05e3f914c661adc11bace867e2a12fd7bee5 + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.0.13": + version: 1.0.13 + resolution: "update-browserslist-db@npm:1.0.13" + dependencies: + escalade: ^3.1.1 + picocolors: ^1.0.0 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 1e47d80182ab6e4ad35396ad8b61008ae2a1330221175d0abd37689658bdb61af9b705bfc41057fd16682474d79944fb2d86767c5ed5ae34b6276b9bed353322 + languageName: node + linkType: hard + +"uqr@npm:^0.1.2": + version: 0.1.2 + resolution: "uqr@npm:0.1.2" + checksum: 717766f03814172f5a9934dae2c4c48f6de065a4fd7da82aa513bd8300b621c1e606efdd174478cab79093e5ba244a99f0c0b1b0b9c0175656ab5e637a006d92 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: ^2.1.0 + checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 + languageName: node + linkType: hard + +"url-parse@npm:^1.5.3": + version: 1.5.10 + resolution: "url-parse@npm:1.5.10" + dependencies: + querystringify: ^2.1.1 + requires-port: ^1.0.0 + checksum: fbdba6b1d83336aca2216bbdc38ba658d9cfb8fc7f665eb8b17852de638ff7d1a162c198a8e4ed66001ddbf6c9888d41e4798912c62b4fd777a31657989f7bdf + languageName: node + linkType: hard + +"use-sync-external-store@npm:1.2.0, use-sync-external-store@npm:^1.2.0": + version: 1.2.0 + resolution: "use-sync-external-store@npm:1.2.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 5c639e0f8da3521d605f59ce5be9e094ca772bd44a4ce7322b055a6f58eeed8dda3c94cabd90c7a41fb6fa852210092008afe48f7038792fd47501f33299116a + languageName: node + linkType: hard + +"utf8@npm:3.0.0, utf8@npm:^3.0.0": + version: 3.0.0 + resolution: "utf8@npm:3.0.0" + checksum: cb89a69ad9ab393e3eae9b25305b3ff08bebca9adc839191a34f90777eb2942f86a96369d2839925fea58f8f722f7e27031d697f10f5f39690f8c5047303e62d + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 + languageName: node + linkType: hard + +"uuid@npm:^7.0.3": + version: 7.0.3 + resolution: "uuid@npm:7.0.3" + bin: + uuid: dist/bin/uuid + checksum: f5b7b5cc28accac68d5c083fd51cca64896639ebd4cca88c6cfb363801aaa83aa439c86dfc8446ea250a7a98d17afd2ad9e88d9d4958c79a412eccb93bae29de + languageName: node + linkType: hard + +"uuid@npm:^8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df + languageName: node + linkType: hard + +"uuid@npm:^9.0.0": + version: 9.0.1 + resolution: "uuid@npm:9.0.1" + bin: + uuid: dist/bin/uuid + checksum: 39931f6da74e307f51c0fb463dc2462807531dc80760a9bff1e35af4316131b4fc3203d16da60ae33f07fdca5b56f3f1dd662da0c99fea9aaeab2004780cc5f4 + languageName: node + linkType: hard + +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 + languageName: node + linkType: hard + +"v8-to-istanbul@npm:^9.0.1": + version: 9.2.0 + resolution: "v8-to-istanbul@npm:9.2.0" + dependencies: + "@jridgewell/trace-mapping": ^0.3.12 + "@types/istanbul-lib-coverage": ^2.0.1 + convert-source-map: ^2.0.0 + checksum: 31ef98c6a31b1dab6be024cf914f235408cd4c0dc56a5c744a5eea1a9e019ba279e1b6f90d695b78c3186feed391ed492380ccf095009e2eb91f3d058f0b4491 + languageName: node + linkType: hard + +"v8flags@npm:^3.1.1": + version: 3.2.0 + resolution: "v8flags@npm:3.2.0" + dependencies: + homedir-polyfill: ^1.0.1 + checksum: 193db08aa396d993da04d3d985450784aa0010f51613005d13ef97d7b2b9e1ba5aef04affa585037adece12de5ca532f6f5fc40288495eab55e2eebc201809d2 + languageName: node + linkType: hard + +"valtio@npm:1.11.2": + version: 1.11.2 + resolution: "valtio@npm:1.11.2" + dependencies: + proxy-compare: 2.5.1 + use-sync-external-store: 1.2.0 + peerDependencies: + "@types/react": ">=16.8" + react: ">=16.8" + peerDependenciesMeta: + "@types/react": + optional: true + react: + optional: true + checksum: cce2d9212aac9fc4bdeba2d381188cc831cfe8d2d03039024cfcd58ba1801f2a5b14d01c2bb21a2c9f12046d2ede64f1dd887175185f39bee553677a35592c30 + languageName: node + linkType: hard + +"viem@npm:^1.0.0, viem@npm:^1.18.2, viem@npm:^1.6.0": + version: 1.21.4 + resolution: "viem@npm:1.21.4" + dependencies: + "@adraffy/ens-normalize": 1.10.0 + "@noble/curves": 1.2.0 + "@noble/hashes": 1.3.2 + "@scure/bip32": 1.3.2 + "@scure/bip39": 1.2.1 + abitype: 0.9.8 + isows: 1.0.3 + ws: 8.13.0 + peerDependencies: + typescript: ">=5.0.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: c351fdea2d53d2d781ac73c964348b3b9fc5dd46f9eb53903e867705fc9e30a893cb9f2c8d7a00acdcdeca27d14eeebf976eed9f948c28c47018dc9211369117 + languageName: node + linkType: hard + +"vite-node@npm:^1.2.0": + version: 1.3.1 + resolution: "vite-node@npm:1.3.1" + dependencies: + cac: ^6.7.14 + debug: ^4.3.4 + pathe: ^1.1.1 + picocolors: ^1.0.0 + vite: ^5.0.0 + bin: + vite-node: vite-node.mjs + checksum: 62a0bd2cdb70160b5107011d10f60d76e8ede6dbad1dcac99d57e4b4c0b21683e40a7e6088b7e221a4db0b70fb83ace8e13a0f1c5bf1c0d38e2bf9c0bab17b17 + languageName: node + linkType: hard + +"vite-plugin-checker@npm:^0.6.4": + version: 0.6.4 + resolution: "vite-plugin-checker@npm:0.6.4" + dependencies: + "@babel/code-frame": ^7.12.13 + ansi-escapes: ^4.3.0 + chalk: ^4.1.1 + chokidar: ^3.5.1 + commander: ^8.0.0 + fast-glob: ^3.2.7 + fs-extra: ^11.1.0 + npm-run-path: ^4.0.1 + semver: ^7.5.0 + strip-ansi: ^6.0.0 + tiny-invariant: ^1.1.0 + vscode-languageclient: ^7.0.0 + vscode-languageserver: ^7.0.0 + vscode-languageserver-textdocument: ^1.0.1 + vscode-uri: ^3.0.2 + peerDependencies: + eslint: ">=7" + meow: ^9.0.0 + optionator: ^0.9.1 + stylelint: ">=13" + typescript: "*" + vite: ">=2.0.0" + vls: "*" + vti: "*" + vue-tsc: ">=1.3.9" + peerDependenciesMeta: + eslint: + optional: true + meow: + optional: true + optionator: + optional: true + stylelint: + optional: true + typescript: + optional: true + vls: + optional: true + vti: + optional: true + vue-tsc: + optional: true + checksum: 2bd1467ec03e9d9ba7bf6da8bfb6ebed232c55d5253c9ccc4fdd6f38c0cb621e637b76426a3730e37574b351a0386791f37893f6768b700731168acfb12a9d61 + languageName: node + linkType: hard + +"vite-tsconfig-paths@npm:^4.3.1": + version: 4.3.1 + resolution: "vite-tsconfig-paths@npm:4.3.1" + dependencies: + debug: ^4.1.1 + globrex: ^0.1.2 + tsconfck: ^3.0.1 + peerDependencies: + vite: "*" + peerDependenciesMeta: + vite: + optional: true + checksum: 2934d5d674e0b6ab8d435d4262ff30143c30512072d71ece5a3859a70a188cbdbcc2b0370277049ab551f7bbb6ffb2be94a0bf30154e5c58d38b32adce9740bd + languageName: node + linkType: hard + +"vite@npm:^5.0.0, vite@npm:^5.0.10, vite@npm:^5.0.11": + version: 5.1.5 + resolution: "vite@npm:5.1.5" + dependencies: + esbuild: ^0.19.3 + fsevents: ~2.3.3 + postcss: ^8.4.35 + rollup: ^4.2.0 + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: 14c079ebe508d55198a3b1ca528d13515c745d7ae279e4864e89110a1661a4cfa880d894c2d7dcf557f6ed3ffc17fa3abea9d9ea4b6f256f0cab99d16a3b385b + languageName: node + linkType: hard + +"vscode-jsonrpc@npm:6.0.0": + version: 6.0.0 + resolution: "vscode-jsonrpc@npm:6.0.0" + checksum: 3a67a56f287e8c449f2d9752eedf91e704dc7b9a326f47fb56ac07667631deb45ca52192e9bccb2ab108764e48409d70fa64b930d46fc3822f75270b111c5f53 + languageName: node + linkType: hard + +"vscode-languageclient@npm:^7.0.0": + version: 7.0.0 + resolution: "vscode-languageclient@npm:7.0.0" + dependencies: + minimatch: ^3.0.4 + semver: ^7.3.4 + vscode-languageserver-protocol: 3.16.0 + checksum: fde7122e96838f0de1940dba80fc4b6bb80717695dbfaff005b9d44eeea371b7f09daedefaebcbf0ff278f67446e37837ec0730ddbc7dbd82aca5d8567065594 + languageName: node + linkType: hard + +"vscode-languageserver-protocol@npm:3.16.0": + version: 3.16.0 + resolution: "vscode-languageserver-protocol@npm:3.16.0" + dependencies: + vscode-jsonrpc: 6.0.0 + vscode-languageserver-types: 3.16.0 + checksum: ac30cbe4b778344f7b93defbaa1332dcb5a5a3a0afda6b88618a9ed44093c1ae1d2f11548bdcff42a73bb46943df025d4fe721559144dd7bf25ae60663aabe06 + languageName: node + linkType: hard + +"vscode-languageserver-textdocument@npm:^1.0.1": + version: 1.0.11 + resolution: "vscode-languageserver-textdocument@npm:1.0.11" + checksum: ea7cdc9d4ffaae5952071fa11d17d714215a76444e6936c9359f94b9ba3222a52a55edb5bd5928bd3e9712b900a9f175bb3565ec1c8923234fe3bd327584bafb + languageName: node + linkType: hard + +"vscode-languageserver-types@npm:3.16.0": + version: 3.16.0 + resolution: "vscode-languageserver-types@npm:3.16.0" + checksum: 7a44fb10b9fbeb9529f832337b7f0430fc6275d62945b86851d425a950e22da3917ef5f6c552688191769dd1eae047c6ee9ec3d9f2280498353007c2dfe0725c + languageName: node + linkType: hard + +"vscode-languageserver@npm:^7.0.0": + version: 7.0.0 + resolution: "vscode-languageserver@npm:7.0.0" + dependencies: + vscode-languageserver-protocol: 3.16.0 + bin: + installServerIntoExtension: bin/installServerIntoExtension + checksum: 80cfbd5f8f0869c5369d1a61fe86b3210ee941cb646eb31b672045670ef3ce213dc1fd3bcd4cef6ef8bc7c5025f98e4a70dad645d97a0bd4708962bbd921683a + languageName: node + linkType: hard + +"vscode-uri@npm:^3.0.2": + version: 3.0.8 + resolution: "vscode-uri@npm:3.0.8" + checksum: 514249126850c0a41a7d8c3c2836cab35983b9dc1938b903cfa253b9e33974c1416d62a00111385adcfa2b98df456437ab704f709a2ecca76a90134ef5eb4832 + languageName: node + linkType: hard + +"w3c-xmlserializer@npm:^4.0.0": + version: 4.0.0 + resolution: "w3c-xmlserializer@npm:4.0.0" + dependencies: + xml-name-validator: ^4.0.0 + checksum: eba070e78deb408ae8defa4d36b429f084b2b47a4741c4a9be3f27a0a3d1845e277e3072b04391a138f7e43776842627d1334e448ff13ff90ad9fb1214ee7091 + languageName: node + linkType: hard + +"wagmi@npm:^1.4.12": + version: 1.4.13 + resolution: "wagmi@npm:1.4.13" + dependencies: + "@tanstack/query-sync-storage-persister": ^4.27.1 + "@tanstack/react-query": ^4.28.0 + "@tanstack/react-query-persist-client": ^4.28.0 + "@wagmi/core": 1.4.13 + abitype: 0.8.7 + use-sync-external-store: ^1.2.0 + peerDependencies: + react: ">=17.0.0" + typescript: ">=5.0.4" + viem: ">=0.3.35" + peerDependenciesMeta: + typescript: + optional: true + checksum: f53ac4837506cc5d7d71f3a104e100aadfe5e5fe00f46e741eaf03c3dbfa8c4a2a47800221f5b0c454a0826d1539837a2e4e858eb606c3f17ed04dd7c252af14 + languageName: node + linkType: hard + +"wait-on@npm:^7.0.1": + version: 7.0.1 + resolution: "wait-on@npm:7.0.1" + dependencies: + axios: ^0.27.2 + joi: ^17.7.0 + lodash: ^4.17.21 + minimist: ^1.2.7 + rxjs: ^7.8.0 + bin: + wait-on: bin/wait-on + checksum: 1e8a17d8ee6436f71d3ab82781ce31267481fcd7bbccde49b0f8124871e6e40a1acac3401f04f775ba6203853a5813352fa131620fc139914351f3b2894d573f + languageName: node + linkType: hard + +"walker@npm:^1.0.8": + version: 1.0.8 + resolution: "walker@npm:1.0.8" + dependencies: + makeerror: 1.0.12 + checksum: ad7a257ea1e662e57ef2e018f97b3c02a7240ad5093c392186ce0bcf1f1a60bbadd520d073b9beb921ed99f64f065efb63dfc8eec689a80e569f93c1c5d5e16c + languageName: node + linkType: hard + +"wcwidth@npm:^1.0.1": + version: 1.0.1 + resolution: "wcwidth@npm:1.0.1" + dependencies: + defaults: ^1.0.3 + checksum: 814e9d1ddcc9798f7377ffa448a5a3892232b9275ebb30a41b529607691c0491de47cba426e917a4d08ded3ee7e9ba2f3fe32e62ee3cd9c7d3bafb7754bd553c + languageName: node + linkType: hard + +"web3-utils@npm:^1.3.6": + version: 1.10.4 + resolution: "web3-utils@npm:1.10.4" + dependencies: + "@ethereumjs/util": ^8.1.0 + bn.js: ^5.2.1 + ethereum-bloom-filters: ^1.0.6 + ethereum-cryptography: ^2.1.2 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: ^2.1.0 + utf8: 3.0.0 + checksum: a1535817a4653f1b5cc868aa19305158122379078a41e13642e1ba64803f6f8e5dd2fb8c45c033612b8f52dde42d8008afce85296c0608276fe1513dece66a49 + languageName: node + linkType: hard + +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c + languageName: node + linkType: hard + +"webidl-conversions@npm:^4.0.2": + version: 4.0.2 + resolution: "webidl-conversions@npm:4.0.2" + checksum: c93d8dfe908a0140a4ae9c0ebc87a33805b416a33ee638a605b551523eec94a9632165e54632f6d57a39c5f948c4bab10e0e066525e9a4b87a79f0d04fbca374 + languageName: node + linkType: hard + +"webidl-conversions@npm:^6.1.0": + version: 6.1.0 + resolution: "webidl-conversions@npm:6.1.0" + checksum: 1f526507aa491f972a0c1409d07f8444e1d28778dfa269a9971f2e157182f3d496dc33296e4ed45b157fdb3bf535bb90c90bf10c50dcf1dd6caacb2a34cc84fb + languageName: node + linkType: hard + +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: f05588567a2a76428515333eff87200fae6c83c3948a7482ebb109562971e77ef6dc49749afa58abb993391227c5697b3ecca52018793e0cb4620a48f10bd21b + languageName: node + linkType: hard + +"whatwg-encoding@npm:^2.0.0": + version: 2.0.0 + resolution: "whatwg-encoding@npm:2.0.0" + dependencies: + iconv-lite: 0.6.3 + checksum: 7087810c410aa9b689cbd6af8773341a53cdc1f3aae2a882c163bd5522ec8ca4cdfc269aef417a5792f411807d5d77d50df4c24e3abb00bb60192858a40cc675 + languageName: node + linkType: hard + +"whatwg-mimetype@npm:^3.0.0": + version: 3.0.0 + resolution: "whatwg-mimetype@npm:3.0.0" + checksum: ce08bbb36b6aaf64f3a84da89707e3e6a31e5ab1c1a2379fd68df79ba712a4ab090904f0b50e6693b0dafc8e6343a6157e40bf18fdffd26e513cf95ee2a59824 + languageName: node + linkType: hard + +"whatwg-url@npm:^11.0.0": + version: 11.0.0 + resolution: "whatwg-url@npm:11.0.0" + dependencies: + tr46: ^3.0.0 + webidl-conversions: ^7.0.0 + checksum: ed4826aaa57e66bb3488a4b25c9cd476c46ba96052747388b5801f137dd740b73fde91ad207d96baf9f17fbcc80fc1a477ad65181b5eb5fa718d27c69501d7af + languageName: node + linkType: hard + +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: ~0.0.3 + webidl-conversions: ^3.0.0 + checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c + languageName: node + linkType: hard + +"whatwg-url@npm:^8.4.0": + version: 8.7.0 + resolution: "whatwg-url@npm:8.7.0" + dependencies: + lodash: ^4.7.0 + tr46: ^2.1.0 + webidl-conversions: ^6.1.0 + checksum: a87abcc6cefcece5311eb642858c8fdb234e51ec74196bfacf8def2edae1bfbffdf6acb251646ed6301f8cee44262642d8769c707256125a91387e33f405dd1e + languageName: node + linkType: hard + +"which-boxed-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "which-boxed-primitive@npm:1.0.2" + dependencies: + is-bigint: ^1.0.1 + is-boolean-object: ^1.1.0 + is-number-object: ^1.0.4 + is-string: ^1.0.5 + is-symbol: ^1.0.3 + checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e + languageName: node + linkType: hard + +"which-collection@npm:^1.0.1": + version: 1.0.1 + resolution: "which-collection@npm:1.0.1" + dependencies: + is-map: ^2.0.1 + is-set: ^2.0.1 + is-weakmap: ^2.0.1 + is-weakset: ^2.0.1 + checksum: c815bbd163107ef9cb84f135e6f34453eaf4cca994e7ba85ddb0d27cea724c623fae2a473ceccfd5549c53cc65a5d82692de418166df3f858e1e5dc60818581c + languageName: node + linkType: hard + +"which-module@npm:^2.0.0": + version: 2.0.1 + resolution: "which-module@npm:2.0.1" + checksum: 1967b7ce17a2485544a4fdd9063599f0f773959cca24176dbe8f405e55472d748b7c549cd7920ff6abb8f1ab7db0b0f1b36de1a21c57a8ff741f4f1e792c52be + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.9": + version: 1.1.14 + resolution: "which-typed-array@npm:1.1.14" + dependencies: + available-typed-arrays: ^1.0.6 + call-bind: ^1.0.5 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-tostringtag: ^1.0.1 + checksum: efe30c143c58630dde8ab96f9330e20165bacd77ca843c602b510120a415415573bcdef3ccbc30a0e5aaf20f257360cfe24712aea0008f149ce5bb99834c0c0b + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "which-typed-array@npm:1.1.15" + dependencies: + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.7 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-tostringtag: ^1.0.2 + checksum: 65227dcbfadf5677aacc43ec84356d17b5500cb8b8753059bb4397de5cd0c2de681d24e1a7bd575633f976a95f88233abfd6549c2105ef4ebd58af8aa1807c75 + languageName: node + linkType: hard + +"which@npm:^1.1.1, which@npm:^1.3.1": + version: 1.3.1 + resolution: "which@npm:1.3.1" + dependencies: + isexe: ^2.0.0 + bin: + which: ./bin/which + checksum: f2e185c6242244b8426c9df1510e86629192d93c1a986a7d2a591f2c24869e7ffd03d6dac07ca863b2e4c06f59a4cc9916c585b72ee9fa1aa609d0124df15e04 + languageName: node + linkType: hard + +"which@npm:^2.0.1, which@npm:^2.0.2": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: ^2.0.0 + bin: + node-which: ./bin/node-which + checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + languageName: node + linkType: hard + +"wide-align@npm:^1.1.5": + version: 1.1.5 + resolution: "wide-align@npm:1.1.5" + dependencies: + string-width: ^1.0.2 || 2 || 3 || 4 + checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 + languageName: node + linkType: hard + +"word-wrap@npm:~1.2.3": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: f93ba3586fc181f94afdaff3a6fef27920b4b6d9eaefed0f428f8e07adea2a7f54a5f2830ce59406c8416f033f86902b91eb824072354645eea687dff3691ccb + languageName: node + linkType: hard + +"wordwrap@npm:^1.0.0": + version: 1.0.0 + resolution: "wordwrap@npm:1.0.0" + checksum: 2a44b2788165d0a3de71fd517d4880a8e20ea3a82c080ce46e294f0b68b69a2e49cff5f99c600e275c698a90d12c5ea32aff06c311f0db2eb3f1201f3e7b2a04 + languageName: node + linkType: hard + +"wordwrapjs@npm:^4.0.0": + version: 4.0.1 + resolution: "wordwrapjs@npm:4.0.1" + dependencies: + reduce-flatten: ^2.0.0 + typical: ^5.2.0 + checksum: 3d927f3c95d0ad990968da54c0ad8cde2801d8e91006cd7474c26e6b742cc8557250ce495c9732b2f9db1f903601cb74ec282e0f122ee0d02d7abe81e150eea8 + languageName: node + linkType: hard + +"workerpool@npm:6.2.1": + version: 6.2.1 + resolution: "workerpool@npm:6.2.1" + checksum: c2c6eebbc5225f10f758d599a5c016fa04798bcc44e4c1dffb34050cd361d7be2e97891aa44419e7afe647b1f767b1dc0b85a5e046c409d890163f655028b09d + languageName: node + linkType: hard + +"wrap-ansi@npm:^6.2.0": + version: 6.2.0 + resolution: "wrap-ansi@npm:6.2.0" + dependencies: + ansi-styles: ^4.0.0 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + checksum: 6cd96a410161ff617b63581a08376f0cb9162375adeb7956e10c8cd397821f7eb2a6de24eb22a0b28401300bf228c86e50617cd568209b5f6775b93c97d2fe3a + languageName: node + linkType: hard + +"wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: ^4.0.0 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + languageName: node + linkType: hard + +"write-file-atomic@npm:^4.0.2": + version: 4.0.2 + resolution: "write-file-atomic@npm:4.0.2" + dependencies: + imurmurhash: ^0.1.4 + signal-exit: ^3.0.7 + checksum: 5da60bd4eeeb935eec97ead3df6e28e5917a6bd317478e4a85a5285e8480b8ed96032bbcc6ecd07b236142a24f3ca871c924ec4a6575e623ec1b11bf8c1c253c + languageName: node + linkType: hard + +"ws@npm:7.4.6": + version: 7.4.6 + resolution: "ws@npm:7.4.6" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 3a990b32ed08c72070d5e8913e14dfcd831919205be52a3ff0b4cdd998c8d554f167c9df3841605cde8b11d607768cacab3e823c58c96a5c08c987e093eb767a + languageName: node + linkType: hard + +"ws@npm:8.13.0": + version: 8.13.0 + resolution: "ws@npm:8.13.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c + languageName: node + linkType: hard + +"ws@npm:^7.5.1": + version: 7.5.9 + resolution: "ws@npm:7.5.9" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: c3c100a181b731f40b7f2fddf004aa023f79d64f489706a28bc23ff88e87f6a64b3c6651fbec3a84a53960b75159574d7a7385709847a62ddb7ad6af76f49138 + languageName: node + linkType: hard + +"ws@npm:^8.11.0": + version: 8.16.0 + resolution: "ws@npm:8.16.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: feb3eecd2bae82fa8a8beef800290ce437d8b8063bdc69712725f21aef77c49cb2ff45c6e5e7fce622248f9c7abaee506bae0a9064067ffd6935460c7357321b + languageName: node + linkType: hard + +"xml-name-validator@npm:^4.0.0": + version: 4.0.0 + resolution: "xml-name-validator@npm:4.0.0" + checksum: af100b79c29804f05fa35aa3683e29a321db9b9685d5e5febda3fa1e40f13f85abc40f45a6b2bf7bee33f68a1dc5e8eaef4cec100a304a9db565e6061d4cb5ad + languageName: node + linkType: hard + +"xmlchars@npm:^2.2.0": + version: 2.2.0 + resolution: "xmlchars@npm:2.2.0" + checksum: 8c70ac94070ccca03f47a81fcce3b271bd1f37a591bf5424e787ae313fcb9c212f5f6786e1fa82076a2c632c0141552babcd85698c437506dfa6ae2d58723062 + languageName: node + linkType: hard + +"xtend@npm:^4.0.1": + version: 4.0.2 + resolution: "xtend@npm:4.0.2" + checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a + languageName: node + linkType: hard + +"y18n@npm:^4.0.0": + version: 4.0.3 + resolution: "y18n@npm:4.0.3" + checksum: 014dfcd9b5f4105c3bb397c1c8c6429a9df004aa560964fb36732bfb999bfe83d45ae40aeda5b55d21b1ee53d8291580a32a756a443e064317953f08025b1aa4 + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 54f0fb95621ee60898a38c572c515659e51cc9d9f787fb109cef6fde4befbe1c4602dc999d30110feee37456ad0f1660fa2edcfde6a9a740f86a290999550d30 + languageName: node + linkType: hard + +"yallist@npm:^3.0.2": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: 48f7bb00dc19fc635a13a39fe547f527b10c9290e7b3e836b9a8f1ca04d4d342e85714416b3c2ab74949c9c66f9cebb0473e6bc353b79035356103b47641285d + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + languageName: node + linkType: hard + +"yaml@npm:^2.2.1": + version: 2.3.4 + resolution: "yaml@npm:2.3.4" + checksum: e6d1dae1c6383bcc8ba11796eef3b8c02d5082911c6723efeeb5ba50fc8e881df18d645e64de68e421b577296000bea9c75d6d9097c2f6699da3ae0406c030d8 + languageName: node + linkType: hard + +"yargs-parser@npm:20.2.4": + version: 20.2.4 + resolution: "yargs-parser@npm:20.2.4" + checksum: d251998a374b2743a20271c2fd752b9fbef24eb881d53a3b99a7caa5e8227fcafd9abf1f345ac5de46435821be25ec12189a11030c12ee6481fef6863ed8b924 + languageName: node + linkType: hard + +"yargs-parser@npm:^18.1.2": + version: 18.1.3 + resolution: "yargs-parser@npm:18.1.3" + dependencies: + camelcase: ^5.0.0 + decamelize: ^1.2.0 + checksum: 60e8c7d1b85814594d3719300ecad4e6ae3796748b0926137bfec1f3042581b8646d67e83c6fc80a692ef08b8390f21ddcacb9464476c39bbdf52e34961dd4d9 + languageName: node + linkType: hard + +"yargs-parser@npm:^20.2.2": + version: 20.2.9 + resolution: "yargs-parser@npm:20.2.9" + checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 + languageName: node + linkType: hard + +"yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c + languageName: node + linkType: hard + +"yargs-unparser@npm:2.0.0": + version: 2.0.0 + resolution: "yargs-unparser@npm:2.0.0" + dependencies: + camelcase: ^6.0.0 + decamelize: ^4.0.0 + flat: ^5.0.2 + is-plain-obj: ^2.1.0 + checksum: 68f9a542c6927c3768c2f16c28f71b19008710abd6b8f8efbac6dcce26bbb68ab6503bed1d5994bdbc2df9a5c87c161110c1dfe04c6a3fe5c6ad1b0e15d9a8a3 + languageName: node + linkType: hard + +"yargs@npm:16.2.0": + version: 16.2.0 + resolution: "yargs@npm:16.2.0" + dependencies: + cliui: ^7.0.2 + escalade: ^3.1.1 + get-caller-file: ^2.0.5 + require-directory: ^2.1.1 + string-width: ^4.2.0 + y18n: ^5.0.5 + yargs-parser: ^20.2.2 + checksum: b14afbb51e3251a204d81937c86a7e9d4bdbf9a2bcee38226c900d00f522969ab675703bee2a6f99f8e20103f608382936034e64d921b74df82b63c07c5e8f59 + languageName: node + linkType: hard + +"yargs@npm:^15.3.1": + version: 15.4.1 + resolution: "yargs@npm:15.4.1" + dependencies: + cliui: ^6.0.0 + decamelize: ^1.2.0 + find-up: ^4.1.0 + get-caller-file: ^2.0.1 + require-directory: ^2.1.1 + require-main-filename: ^2.0.0 + set-blocking: ^2.0.0 + string-width: ^4.2.0 + which-module: ^2.0.0 + y18n: ^4.0.0 + yargs-parser: ^18.1.2 + checksum: 40b974f508d8aed28598087720e086ecd32a5fd3e945e95ea4457da04ee9bdb8bdd17fd91acff36dc5b7f0595a735929c514c40c402416bbb87c03f6fb782373 + languageName: node + linkType: hard + +"yargs@npm:^17.3.1, yargs@npm:^17.5.1": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: ^8.0.1 + escalade: ^3.1.1 + get-caller-file: ^2.0.5 + require-directory: ^2.1.1 + string-width: ^4.2.3 + y18n: ^5.0.5 + yargs-parser: ^21.1.1 + checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 + languageName: node + linkType: hard + +"yocto-queue@npm:^1.0.0": + version: 1.0.0 + resolution: "yocto-queue@npm:1.0.0" + checksum: 2cac84540f65c64ccc1683c267edce396b26b1e931aa429660aefac8fbe0188167b7aee815a3c22fa59a28a58d898d1a2b1825048f834d8d629f4c2a5d443801 + languageName: node + linkType: hard + +"zksync-web3@npm:^0.14.3": + version: 0.14.4 + resolution: "zksync-web3@npm:0.14.4" + peerDependencies: + ethers: ^5.7.0 + checksum: f702a3437f48a8d42c4bb35b8dd13671a168aadfc4e23ce723d62959220ccb6bf9c529c60331fe5b91afaa622147c6a37490551474fe3e35c06ac476524b5160 + languageName: node + linkType: hard + +"zod@npm:^3.21.4": + version: 3.22.4 + resolution: "zod@npm:3.22.4" + checksum: 80bfd7f8039b24fddeb0718a2ec7c02aa9856e4838d6aa4864335a047b6b37a3273b191ef335bf0b2002e5c514ef261ffcda5a589fb084a48c336ffc4cdbab7f + languageName: node + linkType: hard + +"zustand@npm:^4.3.1": + version: 4.5.1 + resolution: "zustand@npm:4.5.1" + dependencies: + use-sync-external-store: 1.2.0 + peerDependencies: + "@types/react": ">=16.8" + immer: ">=9.0.6" + react: ">=16.8" + peerDependenciesMeta: + "@types/react": + optional: true + immer: + optional: true + react: + optional: true + checksum: 420af9fda3e70536bccf65cf964dd6668cc88baa5e6e0208254f69c2c068963710f49bf580ad05ba3c5c5ae0470a17d2677165b199b749c4fc7228800e7fa705 + languageName: node + linkType: hard